diff options
Diffstat (limited to 'vendor/github.com')
231 files changed, 9691 insertions, 4075 deletions
diff --git a/vendor/github.com/asaskevich/govalidator/.gitignore b/vendor/github.com/asaskevich/govalidator/.gitignore new file mode 100644 index 0000000000..8d69a9418a --- /dev/null +++ b/vendor/github.com/asaskevich/govalidator/.gitignore @@ -0,0 +1,15 @@ +bin/ +.idea/ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + diff --git a/vendor/github.com/asaskevich/govalidator/.travis.yml b/vendor/github.com/asaskevich/govalidator/.travis.yml index e29f8eef5e..17c4d0a710 100644 --- a/vendor/github.com/asaskevich/govalidator/.travis.yml +++ b/vendor/github.com/asaskevich/govalidator/.travis.yml @@ -1,14 +1,18 @@ +dist: bionic language: go +env: GO111MODULE=on GOFLAGS='-mod vendor' +install: true +email: false go: - - 1.1 - - 1.2 - - 1.3 - - 1.4 - - 1.5 - - 1.6 + - 1.10 + - 1.11 + - 1.12 + - 1.13 - tip -notifications: - email: - - bwatas@gmail.com +before_script: + - go install github.com/golangci/golangci-lint/cmd/golangci-lint +script: + - golangci-lint run # run a bunch of code checkers/linters in parallel + - go test -v -race ./... # Run all the tests with the race detector enabled diff --git a/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md b/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md index f0f7e3a8ad..7ed268a1ed 100644 --- a/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md +++ b/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md @@ -11,7 +11,7 @@ If you don't know what to do, there are some features and functions that need to - [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions) - [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new - [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc -- [ ] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224) +- [x] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224) - [ ] Implement fuzzing testing - [ ] Implement some struct/map/array utilities - [ ] Implement map/array validation @@ -37,7 +37,7 @@ Anyone can file an expense. If the expense makes sense for the development of th ### Contributors Thank you to all the people who have already contributed to govalidator! -<a href="graphs/contributors"><img src="https://opencollective.com/govalidator/contributors.svg?width=890" /></a> +<a href="https://github.com/asaskevich/govalidator/graphs/contributors"><img src="https://opencollective.com/govalidator/contributors.svg?width=890" /></a> ### Backers diff --git a/vendor/github.com/asaskevich/govalidator/README.md b/vendor/github.com/asaskevich/govalidator/README.md index 40f9a87811..78f999e834 100644 --- a/vendor/github.com/asaskevich/govalidator/README.md +++ b/vendor/github.com/asaskevich/govalidator/README.md @@ -13,7 +13,7 @@ Type the following command in your terminal: or you can get specified release of the package with `gopkg.in`: - go get gopkg.in/asaskevich/govalidator.v4 + go get gopkg.in/asaskevich/govalidator.v10 After it the package is ready to use. @@ -83,14 +83,14 @@ This was changed to prevent data races when accessing custom validators. import "github.com/asaskevich/govalidator" // before -govalidator.CustomTypeTagMap["customByteArrayValidator"] = CustomTypeValidator(func(i interface{}, o interface{}) bool { +govalidator.CustomTypeTagMap["customByteArrayValidator"] = func(i interface{}, o interface{}) bool { // ... -}) +} // after -govalidator.CustomTypeTagMap.Set("customByteArrayValidator", CustomTypeValidator(func(i interface{}, o interface{}) bool { +govalidator.CustomTypeTagMap.Set("customByteArrayValidator", func(i interface{}, o interface{}) bool { // ... -})) +}) ``` #### List of functions: @@ -108,23 +108,34 @@ func Filter(array []interface{}, iterator ConditionIterator) []interface{} func Find(array []interface{}, iterator ConditionIterator) interface{} func GetLine(s string, index int) (string, error) func GetLines(s string) []string -func InRange(value, left, right float64) bool +func HasLowerCase(str string) bool +func HasUpperCase(str string) bool +func HasWhitespace(str string) bool +func HasWhitespaceOnly(str string) bool +func InRange(value interface{}, left interface{}, right interface{}) bool +func InRangeFloat32(value, left, right float32) bool +func InRangeFloat64(value, left, right float64) bool +func InRangeInt(value, left, right interface{}) bool func IsASCII(str string) bool func IsAlpha(str string) bool func IsAlphanumeric(str string) bool func IsBase64(str string) bool func IsByteLength(str string, min, max int) bool func IsCIDR(str string) bool +func IsCRC32(str string) bool +func IsCRC32b(str string) bool func IsCreditCard(str string) bool func IsDNSName(str string) bool func IsDataURI(str string) bool func IsDialString(str string) bool func IsDivisibleBy(str, num string) bool func IsEmail(str string) bool +func IsExistingEmail(email string) bool func IsFilePath(str string) (bool, int) func IsFloat(str string) bool func IsFullWidth(str string) bool func IsHalfWidth(str string) bool +func IsHash(str string, algorithm string) bool func IsHexadecimal(str string) bool func IsHexcolor(str string) bool func IsHost(str string) bool @@ -136,22 +147,27 @@ func IsISBN10(str string) bool func IsISBN13(str string) bool func IsISO3166Alpha2(str string) bool func IsISO3166Alpha3(str string) bool +func IsISO4217(str string) bool func IsISO693Alpha2(str string) bool func IsISO693Alpha3b(str string) bool -func IsISO4217(str string) bool func IsIn(str string, params ...string) bool +func IsInRaw(str string, params ...string) bool func IsInt(str string) bool func IsJSON(str string) bool func IsLatitude(str string) bool func IsLongitude(str string) bool func IsLowerCase(str string) bool func IsMAC(str string) bool +func IsMD4(str string) bool +func IsMD5(str string) bool +func IsMagnetURI(str string) bool func IsMongoID(str string) bool func IsMultibyte(str string) bool func IsNatural(value float64) bool func IsNegative(value float64) bool func IsNonNegative(value float64) bool func IsNonPositive(value float64) bool +func IsNotNull(str string) bool func IsNull(str string) bool func IsNumeric(str string) bool func IsPort(str string) bool @@ -162,9 +178,21 @@ func IsRFC3339WithoutZone(str string) bool func IsRGBcolor(str string) bool func IsRequestURI(rawurl string) bool func IsRequestURL(rawurl string) bool +func IsRipeMD128(str string) bool +func IsRipeMD160(str string) bool +func IsRsaPub(str string, params ...string) bool +func IsRsaPublicKey(str string, keylen int) bool +func IsSHA1(str string) bool +func IsSHA256(str string) bool +func IsSHA384(str string) bool +func IsSHA512(str string) bool func IsSSN(str string) bool func IsSemver(str string) bool +func IsTiger128(str string) bool +func IsTiger160(str string) bool +func IsTiger192(str string) bool func IsTime(str string, format string) bool +func IsType(v interface{}, params ...string) bool func IsURL(str string) bool func IsUTFDigit(str string) bool func IsUTFLetter(str string) bool @@ -174,16 +202,20 @@ func IsUUID(str string) bool func IsUUIDv3(str string) bool func IsUUIDv4(str string) bool func IsUUIDv5(str string) bool +func IsUnixTime(str string) bool func IsUpperCase(str string) bool func IsVariableWidth(str string) bool func IsWhole(value float64) bool func LeftTrim(str, chars string) string func Map(array []interface{}, iterator ResultIterator) []interface{} func Matches(str, pattern string) bool +func MaxStringLength(str string, params ...string) bool +func MinStringLength(str string, params ...string) bool func NormalizeEmail(str string) (string, error) func PadBoth(str string, padStr string, padLen int) string func PadLeft(str string, padStr string, padLen int) string func PadRight(str string, padStr string, padLen int) string +func PrependPathToErrors(err error, path string) error func Range(str string, params ...string) bool func RemoveTags(s string) string func ReplacePattern(str, pattern, replace string) string @@ -192,18 +224,21 @@ func RightTrim(str, chars string) string func RuneLength(str string, params ...string) bool func SafeFileName(str string) string func SetFieldsRequiredByDefault(value bool) +func SetNilPtrAllowedByRequired(value bool) func Sign(value float64) float64 func StringLength(str string, params ...string) bool func StringMatches(s string, params ...string) bool func StripLow(str string, keepNewLines bool) string func ToBoolean(str string) (bool, error) func ToFloat(str string) (float64, error) -func ToInt(str string) (int64, error) +func ToInt(value interface{}) (res int64, err error) func ToJSON(obj interface{}) (string, error) func ToString(obj interface{}) string func Trim(str, chars string) string func Truncate(str string, length int, ending string) string +func TruncatingErrorf(str string, args ...interface{}) error func UnderscoreToCamelCase(s string) string +func ValidateMap(inputMap map[string]interface{}, validationMap map[string]interface{}) (bool, error) func ValidateStruct(s interface{}) (bool, error) func WhiteList(str, chars string) string type ConditionIterator @@ -214,6 +249,8 @@ type Errors func (es Errors) Error() string func (es Errors) Errors() []error type ISO3166Entry +type ISO693Entry +type InterfaceParamValidator type Iterator type ParamValidator type ResultIterator @@ -227,6 +264,27 @@ type Validator ```go println(govalidator.IsURL(`http://user@pass:domain.com/path/page`)) ``` +###### IsType +```go +println(govalidator.IsType("Bob", "string")) +println(govalidator.IsType(1, "int")) +i := 1 +println(govalidator.IsType(&i, "*int")) +``` + +IsType can be used through the tag `type` which is essential for map validation: +```go +type User struct { + Name string `valid:"type(string)"` + Age int `valid:"type(int)"` + Meta interface{} `valid:"type(string)"` +} +result, err := govalidator.ValidateStruct(user{"Bob", 20, "meta"}) +if err != nil { + println("error: " + err.Error()) +} +println(result) +``` ###### ToString ```go type User struct { @@ -335,6 +393,11 @@ Validators with parameters "in(string1|string2|...|stringN)": IsIn, "rsapub(keylength)" : IsRsaPub, ``` +Validators with parameters for any type + +```go +"type(type)": IsType, +``` And here is small example of usage: ```go @@ -370,6 +433,41 @@ if err != nil { } println(result) ``` +###### ValidateMap [#2](https://github.com/asaskevich/govalidator/pull/338) +If you want to validate maps, you can use the map to be validated and a validation map that contain the same tags used in ValidateStruct, both maps have to be in the form `map[string]interface{}` + +So here is small example of usage: +```go +var mapTemplate = map[string]interface{}{ + "name":"required,alpha", + "family":"required,alpha", + "email":"required,email", + "cell-phone":"numeric", + "address":map[string]interface{}{ + "line1":"required,alphanum", + "line2":"alphanum", + "postal-code":"numeric", + }, +} + +var inputMap = map[string]interface{}{ + "name":"Bob", + "family":"Smith", + "email":"foo@bar.baz", + "address":map[string]interface{}{ + "line1":"", + "line2":"", + "postal-code":"", + }, +} + +result, err := govalidator.ValidateMap(inputMap, mapTemplate) +if err != nil { + println("error: " + err.Error()) +} +println(result) +``` + ###### WhiteList ```go // Remove all characters from string ignoring characters between "a" and "z" @@ -389,7 +487,7 @@ type StructWithCustomByteArray struct { CustomMinLength int `valid:"-"` } -govalidator.CustomTypeTagMap.Set("customByteArrayValidator", CustomTypeValidator(func(i interface{}, context interface{}) bool { +govalidator.CustomTypeTagMap.Set("customByteArrayValidator", func(i interface{}, context interface{}) bool { switch v := context.(type) { // you can type switch on the context interface being validated case StructWithCustomByteArray: // you can check and validate against some other field in the context, @@ -409,14 +507,25 @@ govalidator.CustomTypeTagMap.Set("customByteArrayValidator", CustomTypeValidator } } return false -})) -govalidator.CustomTypeTagMap.Set("customMinLengthValidator", CustomTypeValidator(func(i interface{}, context interface{}) bool { +}) +govalidator.CustomTypeTagMap.Set("customMinLengthValidator", func(i interface{}, context interface{}) bool { switch v := context.(type) { // this validates a field against the value in another field, i.e. dependent validation case StructWithCustomByteArray: return len(v.ID) >= v.CustomMinLength } return false -})) +}) +``` + +###### Loop over Error() +By default .Error() returns all errors in a single String. To access each error you can do this: +```go + if err != nil { + errs := err.(govalidator.Errors).Errors() + for _, e := range errs { + fmt.Println(e.Error()) + } + } ``` ###### Custom error messages @@ -445,7 +554,7 @@ If you don't know what to do, there are some features and functions that need to - [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions) - [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new - [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc -- [ ] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224) +- [x] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224) - [ ] Implement fuzzing testing - [ ] Implement some struct/map/array utilities - [ ] Implement map/array validation @@ -475,7 +584,7 @@ This project exists thanks to all the people who contribute. [[Contribute](CONTR * [Matt Sanford](https://github.com/mzsanford) * [Simon ccl1115](https://github.com/ccl1115) -<a href="graphs/contributors"><img src="https://opencollective.com/govalidator/contributors.svg?width=890" /></a> +<a href="https://github.com/asaskevich/govalidator/graphs/contributors"><img src="https://opencollective.com/govalidator/contributors.svg?width=890" /></a> ### Backers @@ -504,4 +613,4 @@ Support this project by becoming a sponsor. Your logo will show up here with a l ## License -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_large)
\ No newline at end of file +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_large) diff --git a/vendor/github.com/asaskevich/govalidator/doc.go b/vendor/github.com/asaskevich/govalidator/doc.go new file mode 100644 index 0000000000..55dce62dc8 --- /dev/null +++ b/vendor/github.com/asaskevich/govalidator/doc.go @@ -0,0 +1,3 @@ +package govalidator + +// A package of validators and sanitizers for strings, structures and collections. diff --git a/vendor/github.com/asaskevich/govalidator/error.go b/vendor/github.com/asaskevich/govalidator/error.go index 655b750cb8..1da2336f47 100644 --- a/vendor/github.com/asaskevich/govalidator/error.go +++ b/vendor/github.com/asaskevich/govalidator/error.go @@ -1,6 +1,9 @@ package govalidator -import "strings" +import ( + "sort" + "strings" +) // Errors is an array of multiple errors and conforms to the error interface. type Errors []error @@ -15,6 +18,7 @@ func (es Errors) Error() string { for _, e := range es { errs = append(errs, e.Error()) } + sort.Strings(errs) return strings.Join(errs, ";") } diff --git a/vendor/github.com/asaskevich/govalidator/go.mod b/vendor/github.com/asaskevich/govalidator/go.mod new file mode 100644 index 0000000000..c1ce891dfa --- /dev/null +++ b/vendor/github.com/asaskevich/govalidator/go.mod @@ -0,0 +1,3 @@ +module github.com/asaskevich/govalidator + +go 1.12 diff --git a/vendor/github.com/asaskevich/govalidator/patterns.go b/vendor/github.com/asaskevich/govalidator/patterns.go index 61a05d438e..e55451cff5 100644 --- a/vendor/github.com/asaskevich/govalidator/patterns.go +++ b/vendor/github.com/asaskevich/govalidator/patterns.go @@ -4,49 +4,51 @@ import "regexp" // Basic regular expressions for validating strings const ( - Email string = "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$" - CreditCard string = "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})$" - ISBN10 string = "^(?:[0-9]{9}X|[0-9]{10})$" - ISBN13 string = "^(?:[0-9]{13})$" - UUID3 string = "^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$" - UUID4 string = "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" - UUID5 string = "^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" - UUID string = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" - Alpha string = "^[a-zA-Z]+$" - Alphanumeric string = "^[a-zA-Z0-9]+$" - Numeric string = "^[0-9]+$" - Int string = "^(?:[-+]?(?:0|[1-9][0-9]*))$" - Float string = "^(?:[-+]?(?:[0-9]+))?(?:\\.[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$" - Hexadecimal string = "^[0-9a-fA-F]+$" - Hexcolor string = "^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$" - RGBcolor string = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*\\)$" - ASCII string = "^[\x00-\x7F]+$" - Multibyte string = "[^\x00-\x7F]" - FullWidth string = "[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]" - HalfWidth string = "[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]" - Base64 string = "^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$" - PrintableASCII string = "^[\x20-\x7E]+$" - DataURI string = "^data:.+\\/(.+);base64$" - Latitude string = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$" - Longitude string = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$" - DNSName string = `^([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*[\._]?$` - IP string = `(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))` - URLSchema string = `((ftp|tcp|udp|wss?|https?):\/\/)` - URLUsername string = `(\S+(:\S*)?@)` - URLPath string = `((\/|\?|#)[^\s]*)` - URLPort string = `(:(\d{1,5}))` - URLIP string = `([1-9]\d?|1\d\d|2[01]\d|22[0-3])(\.(1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-4]))` - URLSubdomain string = `((www\.)|([a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*[a-zA-Z0-9]\.[a-zA-Z0-9]+))` - URL string = `^` + URLSchema + `?` + URLUsername + `?` + `((` + URLIP + `|(\[` + IP + `\])|(([a-zA-Z0-9]([a-zA-Z0-9-_]+)?[a-zA-Z0-9]([-\.][a-zA-Z0-9]+)*)|(` + URLSubdomain + `?))?(([a-zA-Z\x{00a1}-\x{ffff}0-9]+-?-?)*[a-zA-Z\x{00a1}-\x{ffff}0-9]+)(?:\.([a-zA-Z\x{00a1}-\x{ffff}]{1,}))?))\.?` + URLPort + `?` + URLPath + `?$` - SSN string = `^\d{3}[- ]?\d{2}[- ]?\d{4}$` - WinPath string = `^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$` - UnixPath string = `^(/[^/\x00]*)+/?$` - Semver string = "^v?(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?$" - tagName string = "valid" - hasLowerCase string = ".*[[:lower:]]" - hasUpperCase string = ".*[[:upper:]]" - hasWhitespace string = ".*[[:space:]]" - hasWhitespaceOnly string = "^[[:space:]]+$" + Email string = "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$" + CreditCard string = "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11}|6[27][0-9]{14})$" + ISBN10 string = "^(?:[0-9]{9}X|[0-9]{10})$" + ISBN13 string = "^(?:[0-9]{13})$" + UUID3 string = "^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$" + UUID4 string = "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" + UUID5 string = "^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" + UUID string = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + Alpha string = "^[a-zA-Z]+$" + Alphanumeric string = "^[a-zA-Z0-9]+$" + Numeric string = "^[0-9]+$" + Int string = "^(?:[-+]?(?:0|[1-9][0-9]*))$" + Float string = "^(?:[-+]?(?:[0-9]+))?(?:\\.[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$" + Hexadecimal string = "^[0-9a-fA-F]+$" + Hexcolor string = "^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$" + RGBcolor string = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*\\)$" + ASCII string = "^[\x00-\x7F]+$" + Multibyte string = "[^\x00-\x7F]" + FullWidth string = "[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]" + HalfWidth string = "[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]" + Base64 string = "^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$" + PrintableASCII string = "^[\x20-\x7E]+$" + DataURI string = "^data:.+\\/(.+);base64$" + MagnetURI string = "^magnet:\\?xt=urn:[a-zA-Z0-9]+:[a-zA-Z0-9]{32,40}&dn=.+&tr=.+$" + Latitude string = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$" + Longitude string = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$" + DNSName string = `^([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*[\._]?$` + IP string = `(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))` + URLSchema string = `((ftp|tcp|udp|wss?|https?):\/\/)` + URLUsername string = `(\S+(:\S*)?@)` + URLPath string = `((\/|\?|#)[^\s]*)` + URLPort string = `(:(\d{1,5}))` + URLIP string = `([1-9]\d?|1\d\d|2[01]\d|22[0-3]|24\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-5]))` + URLSubdomain string = `((www\.)|([a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*[a-zA-Z0-9]\.[a-zA-Z0-9]+))` + URL string = `^` + URLSchema + `?` + URLUsername + `?` + `((` + URLIP + `|(\[` + IP + `\])|(([a-zA-Z0-9]([a-zA-Z0-9-_]+)?[a-zA-Z0-9]([-\.][a-zA-Z0-9]+)*)|(` + URLSubdomain + `?))?(([a-zA-Z\x{00a1}-\x{ffff}0-9]+-?-?)*[a-zA-Z\x{00a1}-\x{ffff}0-9]+)(?:\.([a-zA-Z\x{00a1}-\x{ffff}]{1,}))?))\.?` + URLPort + `?` + URLPath + `?$` + SSN string = `^\d{3}[- ]?\d{2}[- ]?\d{4}$` + WinPath string = `^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$` + UnixPath string = `^(/[^/\x00]*)+/?$` + Semver string = "^v?(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?$" + tagName string = "valid" + hasLowerCase string = ".*[[:lower:]]" + hasUpperCase string = ".*[[:upper:]]" + hasWhitespace string = ".*[[:space:]]" + hasWhitespaceOnly string = "^[[:space:]]+$" + IMEI string = "^[0-9a-f]{14}$|^\\d{15}$|^\\d{18}$" ) // Used by IsFilePath func @@ -60,42 +62,44 @@ const ( ) var ( - userRegexp = regexp.MustCompile("^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-]+$") - hostRegexp = regexp.MustCompile("^[^\\s]+\\.[^\\s]+$") - userDotRegexp = regexp.MustCompile("(^[.]{1})|([.]{1}$)|([.]{2,})") - rxEmail = regexp.MustCompile(Email) - rxCreditCard = regexp.MustCompile(CreditCard) - rxISBN10 = regexp.MustCompile(ISBN10) - rxISBN13 = regexp.MustCompile(ISBN13) - rxUUID3 = regexp.MustCompile(UUID3) - rxUUID4 = regexp.MustCompile(UUID4) - rxUUID5 = regexp.MustCompile(UUID5) - rxUUID = regexp.MustCompile(UUID) - rxAlpha = regexp.MustCompile(Alpha) - rxAlphanumeric = regexp.MustCompile(Alphanumeric) - rxNumeric = regexp.MustCompile(Numeric) - rxInt = regexp.MustCompile(Int) - rxFloat = regexp.MustCompile(Float) - rxHexadecimal = regexp.MustCompile(Hexadecimal) - rxHexcolor = regexp.MustCompile(Hexcolor) - rxRGBcolor = regexp.MustCompile(RGBcolor) - rxASCII = regexp.MustCompile(ASCII) - rxPrintableASCII = regexp.MustCompile(PrintableASCII) - rxMultibyte = regexp.MustCompile(Multibyte) - rxFullWidth = regexp.MustCompile(FullWidth) - rxHalfWidth = regexp.MustCompile(HalfWidth) - rxBase64 = regexp.MustCompile(Base64) - rxDataURI = regexp.MustCompile(DataURI) - rxLatitude = regexp.MustCompile(Latitude) - rxLongitude = regexp.MustCompile(Longitude) - rxDNSName = regexp.MustCompile(DNSName) - rxURL = regexp.MustCompile(URL) - rxSSN = regexp.MustCompile(SSN) - rxWinPath = regexp.MustCompile(WinPath) - rxUnixPath = regexp.MustCompile(UnixPath) - rxSemver = regexp.MustCompile(Semver) - rxHasLowerCase = regexp.MustCompile(hasLowerCase) - rxHasUpperCase = regexp.MustCompile(hasUpperCase) - rxHasWhitespace = regexp.MustCompile(hasWhitespace) - rxHasWhitespaceOnly = regexp.MustCompile(hasWhitespaceOnly) + userRegexp = regexp.MustCompile("^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-]+$") + hostRegexp = regexp.MustCompile("^[^\\s]+\\.[^\\s]+$") + userDotRegexp = regexp.MustCompile("(^[.]{1})|([.]{1}$)|([.]{2,})") + rxEmail = regexp.MustCompile(Email) + rxCreditCard = regexp.MustCompile(CreditCard) + rxISBN10 = regexp.MustCompile(ISBN10) + rxISBN13 = regexp.MustCompile(ISBN13) + rxUUID3 = regexp.MustCompile(UUID3) + rxUUID4 = regexp.MustCompile(UUID4) + rxUUID5 = regexp.MustCompile(UUID5) + rxUUID = regexp.MustCompile(UUID) + rxAlpha = regexp.MustCompile(Alpha) + rxAlphanumeric = regexp.MustCompile(Alphanumeric) + rxNumeric = regexp.MustCompile(Numeric) + rxInt = regexp.MustCompile(Int) + rxFloat = regexp.MustCompile(Float) + rxHexadecimal = regexp.MustCompile(Hexadecimal) + rxHexcolor = regexp.MustCompile(Hexcolor) + rxRGBcolor = regexp.MustCompile(RGBcolor) + rxASCII = regexp.MustCompile(ASCII) + rxPrintableASCII = regexp.MustCompile(PrintableASCII) + rxMultibyte = regexp.MustCompile(Multibyte) + rxFullWidth = regexp.MustCompile(FullWidth) + rxHalfWidth = regexp.MustCompile(HalfWidth) + rxBase64 = regexp.MustCompile(Base64) + rxDataURI = regexp.MustCompile(DataURI) + rxMagnetURI = regexp.MustCompile(MagnetURI) + rxLatitude = regexp.MustCompile(Latitude) + rxLongitude = regexp.MustCompile(Longitude) + rxDNSName = regexp.MustCompile(DNSName) + rxURL = regexp.MustCompile(URL) + rxSSN = regexp.MustCompile(SSN) + rxWinPath = regexp.MustCompile(WinPath) + rxUnixPath = regexp.MustCompile(UnixPath) + rxSemver = regexp.MustCompile(Semver) + rxHasLowerCase = regexp.MustCompile(hasLowerCase) + rxHasUpperCase = regexp.MustCompile(hasUpperCase) + rxHasWhitespace = regexp.MustCompile(hasWhitespace) + rxHasWhitespaceOnly = regexp.MustCompile(hasWhitespaceOnly) + rxIMEI = regexp.MustCompile(IMEI) ) diff --git a/vendor/github.com/asaskevich/govalidator/types.go b/vendor/github.com/asaskevich/govalidator/types.go index 4f7e9274ad..b57b666f57 100644 --- a/vendor/github.com/asaskevich/govalidator/types.go +++ b/vendor/github.com/asaskevich/govalidator/types.go @@ -16,6 +16,7 @@ type CustomTypeValidator func(i interface{}, o interface{}) bool // ParamValidator is a wrapper for validator functions that accepts additional parameters. type ParamValidator func(str string, params ...string) bool +type InterfaceParamValidator func(in interface{}, params ...string) bool type tagOptionsMap map[string]tagOption func (t tagOptionsMap) orderedKeys() []string { @@ -46,15 +47,27 @@ type UnsupportedTypeError struct { // It implements the methods to sort by string. type stringValues []reflect.Value +// InterfaceParamTagMap is a map of functions accept variants parameters for an interface value +var InterfaceParamTagMap = map[string]InterfaceParamValidator{ + "type": IsType, +} + +// InterfaceParamTagRegexMap maps interface param tags to their respective regexes. +var InterfaceParamTagRegexMap = map[string]*regexp.Regexp{ + "type": regexp.MustCompile(`^type\((.*)\)$`), +} + // ParamTagMap is a map of functions accept variants parameters var ParamTagMap = map[string]ParamValidator{ - "length": ByteLength, - "range": Range, - "runelength": RuneLength, - "stringlength": StringLength, - "matches": StringMatches, - "in": isInRaw, - "rsapub": IsRsaPub, + "length": ByteLength, + "range": Range, + "runelength": RuneLength, + "stringlength": StringLength, + "matches": StringMatches, + "in": IsInRaw, + "rsapub": IsRsaPub, + "minstringlength": MinStringLength, + "maxstringlength": MaxStringLength, } // ParamTagRegexMap maps param tags to their respective regexes. @@ -66,6 +79,8 @@ var ParamTagRegexMap = map[string]*regexp.Regexp{ "in": regexp.MustCompile(`^in\((.*)\)`), "matches": regexp.MustCompile(`^matches\((.+)\)$`), "rsapub": regexp.MustCompile("^rsapub\\((\\d+)\\)$"), + "minstringlength": regexp.MustCompile("^minstringlength\\((\\d+)\\)$"), + "maxstringlength": regexp.MustCompile("^maxstringlength\\((\\d+)\\)$"), } type customTypeTagMap struct { @@ -114,6 +129,7 @@ var TagMap = map[string]Validator{ "int": IsInt, "float": IsFloat, "null": IsNull, + "notnull": IsNotNull, "uuid": IsUUID, "uuidv3": IsUUIDv3, "uuidv4": IsUUIDv4, @@ -146,6 +162,7 @@ var TagMap = map[string]Validator{ "ISO3166Alpha2": IsISO3166Alpha2, "ISO3166Alpha3": IsISO3166Alpha3, "ISO4217": IsISO4217, + "IMEI": IsIMEI, } // ISO3166Entry stores country codes diff --git a/vendor/github.com/asaskevich/govalidator/utils.go b/vendor/github.com/asaskevich/govalidator/utils.go index a0b706a743..f4c30f824a 100644 --- a/vendor/github.com/asaskevich/govalidator/utils.go +++ b/vendor/github.com/asaskevich/govalidator/utils.go @@ -12,20 +12,20 @@ import ( "unicode/utf8" ) -// Contains check if the string contains the substring. +// Contains checks if the string contains the substring. func Contains(str, substring string) bool { return strings.Contains(str, substring) } -// Matches check if string matches the pattern (pattern is regular expression) +// Matches checks if string matches the pattern (pattern is regular expression) // In case of error return false func Matches(str, pattern string) bool { match, _ := regexp.MatchString(pattern, str) return match } -// LeftTrim trim characters from the left-side of the input. -// If second argument is empty, it's will be remove leading spaces. +// LeftTrim trims characters from the left side of the input. +// If second argument is empty, it will remove leading spaces. func LeftTrim(str, chars string) string { if chars == "" { return strings.TrimLeftFunc(str, unicode.IsSpace) @@ -34,8 +34,8 @@ func LeftTrim(str, chars string) string { return r.ReplaceAllString(str, "") } -// RightTrim trim characters from the right-side of the input. -// If second argument is empty, it's will be remove spaces. +// RightTrim trims characters from the right side of the input. +// If second argument is empty, it will remove trailing spaces. func RightTrim(str, chars string) string { if chars == "" { return strings.TrimRightFunc(str, unicode.IsSpace) @@ -44,27 +44,27 @@ func RightTrim(str, chars string) string { return r.ReplaceAllString(str, "") } -// Trim trim characters from both sides of the input. -// If second argument is empty, it's will be remove spaces. +// Trim trims characters from both sides of the input. +// If second argument is empty, it will remove spaces. func Trim(str, chars string) string { return LeftTrim(RightTrim(str, chars), chars) } -// WhiteList remove characters that do not appear in the whitelist. +// WhiteList removes characters that do not appear in the whitelist. func WhiteList(str, chars string) string { pattern := "[^" + chars + "]+" r, _ := regexp.Compile(pattern) return r.ReplaceAllString(str, "") } -// BlackList remove characters that appear in the blacklist. +// BlackList removes characters that appear in the blacklist. func BlackList(str, chars string) string { pattern := "[" + chars + "]+" r, _ := regexp.Compile(pattern) return r.ReplaceAllString(str, "") } -// StripLow remove characters with a numerical value < 32 and 127, mostly control characters. +// StripLow removes characters with a numerical value < 32 and 127, mostly control characters. // If keep_new_lines is true, newline characters are preserved (\n and \r, hex 0xA and 0xD). func StripLow(str string, keepNewLines bool) string { chars := "" @@ -76,13 +76,13 @@ func StripLow(str string, keepNewLines bool) string { return BlackList(str, chars) } -// ReplacePattern replace regular expression pattern in string +// ReplacePattern replaces regular expression pattern in string func ReplacePattern(str, pattern, replace string) string { r, _ := regexp.Compile(pattern) return r.ReplaceAllString(str, replace) } -// Escape replace <, >, & and " with HTML entities. +// Escape replaces <, >, & and " with HTML entities. var Escape = html.EscapeString func addSegment(inrune, segment []rune) []rune { @@ -120,7 +120,7 @@ func CamelCaseToUnderscore(str string) string { return string(output) } -// Reverse return reversed string +// Reverse returns reversed string func Reverse(s string) string { r := []rune(s) for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 { @@ -129,12 +129,12 @@ func Reverse(s string) string { return string(r) } -// GetLines split string by "\n" and return array of lines +// GetLines splits string by "\n" and return array of lines func GetLines(s string) []string { return strings.Split(s, "\n") } -// GetLine return specified line of multiline string +// GetLine returns specified line of multiline string func GetLine(s string, index int) (string, error) { lines := GetLines(s) if index < 0 || index >= len(lines) { @@ -143,12 +143,12 @@ func GetLine(s string, index int) (string, error) { return lines[index], nil } -// RemoveTags remove all tags from HTML string +// RemoveTags removes all tags from HTML string func RemoveTags(s string) string { return ReplacePattern(s, "<[^>]*>", "") } -// SafeFileName return safe string that can be used in file names +// SafeFileName returns safe string that can be used in file names func SafeFileName(str string) string { name := strings.ToLower(str) name = path.Clean(path.Base(name)) @@ -210,23 +210,23 @@ func Truncate(str string, length int, ending string) string { return str } -// PadLeft pad left side of string if size of string is less then indicated pad length +// PadLeft pads left side of a string if size of string is less then indicated pad length func PadLeft(str string, padStr string, padLen int) string { return buildPadStr(str, padStr, padLen, true, false) } -// PadRight pad right side of string if size of string is less then indicated pad length +// PadRight pads right side of a string if size of string is less then indicated pad length func PadRight(str string, padStr string, padLen int) string { return buildPadStr(str, padStr, padLen, false, true) } -// PadBoth pad sides of string if size of string is less then indicated pad length +// PadBoth pads both sides of a string if size of string is less then indicated pad length func PadBoth(str string, padStr string, padLen int) string { return buildPadStr(str, padStr, padLen, true, true) } -// PadString either left, right or both sides, not the padding string can be unicode and more then one -// character +// PadString either left, right or both sides. +// Note that padding string can be unicode and more then one character func buildPadStr(str string, padStr string, padLen int, padLeft bool, padRight bool) string { // When padded length is less then the current string size diff --git a/vendor/github.com/asaskevich/govalidator/validator.go b/vendor/github.com/asaskevich/govalidator/validator.go index b18bbcb4c9..298f9920d3 100644 --- a/vendor/github.com/asaskevich/govalidator/validator.go +++ b/vendor/github.com/asaskevich/govalidator/validator.go @@ -282,7 +282,7 @@ func HasLowerCase(str string) bool { return rxHasLowerCase.MatchString(str) } -// HasUpperCase check if the string contians as least 1 uppercase. Empty string is valid. +// HasUpperCase check if the string contains as least 1 uppercase. Empty string is valid. func HasUpperCase(str string) bool { if IsNull(str) { return true @@ -321,14 +321,19 @@ func IsNull(str string) bool { return len(str) == 0 } +// IsNotNull check if the string is not null. +func IsNotNull(str string) bool { + return !IsNull(str) +} + // HasWhitespaceOnly checks the string only contains whitespace func HasWhitespaceOnly(str string) bool { - return len(str) > 0 && rxHasWhitespaceOnly.MatchString(str) + return len(str) > 0 && rxHasWhitespaceOnly.MatchString(str) } // HasWhitespace checks if the string contains any whitespace func HasWhitespace(str string) bool { - return len(str) > 0 && rxHasWhitespace.MatchString(str) + return len(str) > 0 && rxHasWhitespace.MatchString(str) } // IsByteLength check if the string's length (in bytes) falls in a range. @@ -513,6 +518,11 @@ func IsDataURI(str string) bool { return IsBase64(dataURI[1]) } +// IsMagnetURI checks if a string is valid magnet URI +func IsMagnetURI(str string) bool { + return rxMagnetURI.MatchString(str) +} + // IsISO3166Alpha2 checks if a string is valid two-letter country code func IsISO3166Alpha2(str string) bool { for _, entry := range ISO3166List { @@ -565,7 +575,7 @@ func IsDNSName(str string) bool { // IsHash checks if a string is a hash of type algorithm. // Algorithm is one of ['md4', 'md5', 'sha1', 'sha256', 'sha384', 'sha512', 'ripemd128', 'ripemd160', 'tiger128', 'tiger160', 'tiger192', 'crc32', 'crc32b'] func IsHash(str string, algorithm string) bool { - len := "0" + var len string algo := strings.ToLower(algorithm) if algo == "crc32" || algo == "crc32b" { @@ -589,9 +599,73 @@ func IsHash(str string, algorithm string) bool { return Matches(str, "^[a-f0-9]{"+len+"}$") } +// IsSHA512 checks is a string is a SHA512 hash. Alias for `IsHash(str, "sha512")` +func IsSHA512(str string) bool { + return IsHash(str, "sha512") +} + +// IsSHA384 checks is a string is a SHA384 hash. Alias for `IsHash(str, "sha384")` +func IsSHA384(str string) bool { + return IsHash(str, "sha384") +} + +// IsSHA256 checks is a string is a SHA256 hash. Alias for `IsHash(str, "sha256")` +func IsSHA256(str string) bool { + return IsHash(str, "sha256") +} + +// IsTiger192 checks is a string is a Tiger192 hash. Alias for `IsHash(str, "tiger192")` +func IsTiger192(str string) bool { + return IsHash(str, "tiger192") +} + +// IsTiger160 checks is a string is a Tiger160 hash. Alias for `IsHash(str, "tiger160")` +func IsTiger160(str string) bool { + return IsHash(str, "tiger160") +} + +// IsRipeMD160 checks is a string is a RipeMD160 hash. Alias for `IsHash(str, "ripemd160")` +func IsRipeMD160(str string) bool { + return IsHash(str, "ripemd160") +} + +// IsSHA1 checks is a string is a SHA-1 hash. Alias for `IsHash(str, "sha1")` +func IsSHA1(str string) bool { + return IsHash(str, "sha1") +} + +// IsTiger128 checks is a string is a Tiger128 hash. Alias for `IsHash(str, "tiger128")` +func IsTiger128(str string) bool { + return IsHash(str, "tiger128") +} + +// IsRipeMD128 checks is a string is a RipeMD128 hash. Alias for `IsHash(str, "ripemd128")` +func IsRipeMD128(str string) bool { + return IsHash(str, "ripemd128") +} + +// IsCRC32 checks is a string is a CRC32 hash. Alias for `IsHash(str, "crc32")` +func IsCRC32(str string) bool { + return IsHash(str, "crc32") +} + +// IsCRC32b checks is a string is a CRC32b hash. Alias for `IsHash(str, "crc32b")` +func IsCRC32b(str string) bool { + return IsHash(str, "crc32b") +} + +// IsMD5 checks is a string is a MD5 hash. Alias for `IsHash(str, "md5")` +func IsMD5(str string) bool { + return IsHash(str, "md5") +} + +// IsMD4 checks is a string is a MD4 hash. Alias for `IsHash(str, "md4")` +func IsMD4(str string) bool { + return IsHash(str, "md4") +} + // IsDialString validates the given string for usage with the various Dial() functions func IsDialString(str string) bool { - if h, p, err := net.SplitHostPort(str); err == nil && h != "" && p != "" && (IsDNSName(h) || IsIP(h)) && IsPort(p) { return true } @@ -599,7 +673,7 @@ func IsDialString(str string) bool { return false } -// IsIP checks if a string is either IP version 4 or 6. +// IsIP checks if a string is either IP version 4 or 6. Alias for `net.ParseIP` func IsIP(str string) bool { return net.ParseIP(str) != nil } @@ -663,6 +737,11 @@ func IsLongitude(str string) bool { return rxLongitude.MatchString(str) } +// IsIMEI check if a string is valid IMEI +func IsIMEI(str string) bool { + return rxIMEI.MatchString(str) +} + // IsRsaPublicKey check if a string is valid public key with provided length func IsRsaPublicKey(str string, keylen int) bool { bb := bytes.NewBufferString(str) @@ -729,12 +808,116 @@ func PrependPathToErrors(err error, path string) error { } return err2 } - fmt.Println(err) return err } +// ValidateMap use validation map for fields. +// result will be equal to `false` if there are any errors. +// s is the map containing the data to be validated. +// m is the validation map in the form: +// map[string]interface{}{"name":"required,alpha","address":map[string]interface{}{"line1":"required,alphanum"}} +func ValidateMap(s map[string]interface{}, m map[string]interface{}) (bool, error) { + if s == nil { + return true, nil + } + result := true + var err error + var errs Errors + var index int + val := reflect.ValueOf(s) + for key, value := range s { + presentResult := true + validator, ok := m[key] + if !ok { + presentResult = false + var err error + err = fmt.Errorf("all map keys has to be present in the validation map; got %s", key) + err = PrependPathToErrors(err, key) + errs = append(errs, err) + } + valueField := reflect.ValueOf(value) + mapResult := true + typeResult := true + structResult := true + resultField := true + switch subValidator := validator.(type) { + case map[string]interface{}: + var err error + if v, ok := value.(map[string]interface{}); !ok { + mapResult = false + err = fmt.Errorf("map validator has to be for the map type only; got %s", valueField.Type().String()) + err = PrependPathToErrors(err, key) + errs = append(errs, err) + } else { + mapResult, err = ValidateMap(v, subValidator) + if err != nil { + mapResult = false + err = PrependPathToErrors(err, key) + errs = append(errs, err) + } + } + case string: + if (valueField.Kind() == reflect.Struct || + (valueField.Kind() == reflect.Ptr && valueField.Elem().Kind() == reflect.Struct)) && + subValidator != "-" { + var err error + structResult, err = ValidateStruct(valueField.Interface()) + if err != nil { + err = PrependPathToErrors(err, key) + errs = append(errs, err) + } + } + resultField, err = typeCheck(valueField, reflect.StructField{ + Name: key, + PkgPath: "", + Type: val.Type(), + Tag: reflect.StructTag(fmt.Sprintf("%s:%q", tagName, subValidator)), + Offset: 0, + Index: []int{index}, + Anonymous: false, + }, val, nil) + if err != nil { + errs = append(errs, err) + } + case nil: + // already handlerd when checked before + default: + typeResult = false + err = fmt.Errorf("map validator has to be either map[string]interface{} or string; got %s", valueField.Type().String()) + err = PrependPathToErrors(err, key) + errs = append(errs, err) + } + result = result && presentResult && typeResult && resultField && structResult && mapResult + index++ + } + // check required keys + requiredResult := true + for key, value := range m { + if schema, ok := value.(string); ok { + tags := parseTagIntoMap(schema) + if required, ok := tags["required"]; ok { + if _, ok := s[key]; !ok { + requiredResult = false + if required.customErrorMessage != "" { + err = Error{key, fmt.Errorf(required.customErrorMessage), true, "required", []string{}} + } else { + err = Error{key, fmt.Errorf("required field missing"), false, "required", []string{}} + } + errs = append(errs, err) + } + } + } + } + + if len(errs) > 0 { + err = errs + } + return result && requiredResult, err +} + // ValidateStruct use tags for fields. // result will be equal to `false` if there are any errors. +// todo currently there is no guarantee that errors will be returned in predictable order (tests may to fail) func ValidateStruct(s interface{}) (bool, error) { if s == nil { return true, nil @@ -856,12 +1039,29 @@ func IsSemver(str string) bool { return rxSemver.MatchString(str) } +// IsType check if interface is of some type +func IsType(v interface{}, params ...string) bool { + if len(params) == 1 { + typ := params[0] + return strings.Replace(reflect.TypeOf(v).String(), " ", "", -1) == strings.Replace(typ, " ", "", -1) + } + return false +} + // IsTime check if string is valid according to given format func IsTime(str string, format string) bool { _, err := time.Parse(format, str) return err == nil } +// IsUnixTime check if string is valid unix timestamp value +func IsUnixTime(str string) bool { + if _, err := strconv.Atoi(str); err == nil { + return true + } + return false +} + // IsRFC3339 check if string is valid timestamp value according to RFC3339 func IsRFC3339(str string) bool { return IsTime(str, time.RFC3339) @@ -933,6 +1133,30 @@ func StringLength(str string, params ...string) bool { return false } +// MinStringLength check string's minimum length (including multi byte strings) +func MinStringLength(str string, params ...string) bool { + + if len(params) == 1 { + strLength := utf8.RuneCountInString(str) + min, _ := ToInt(params[0]) + return strLength >= int(min) + } + + return false +} + +// MaxStringLength check string's maximum length (including multi byte strings) +func MaxStringLength(str string, params ...string) bool { + + if len(params) == 1 { + strLength := utf8.RuneCountInString(str) + max, _ := ToInt(params[0]) + return strLength <= int(max) + } + + return false +} + // Range check string's length func Range(str string, params ...string) bool { if len(params) == 2 { @@ -945,7 +1169,7 @@ func Range(str string, params ...string) bool { return false } -func isInRaw(str string, params ...string) bool { +func IsInRaw(str string, params ...string) bool { if len(params) == 1 { rawParams := params[0] @@ -1014,7 +1238,7 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options options = parseTagIntoMap(tag) } - if isEmptyValue(v) { + if !isFieldSet(v) { // an empty value is not validated, check only required isValid, resultErr = checkRequired(v, t, options) for key := range options { @@ -1062,6 +1286,45 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options }() } + for _, validatorSpec := range optionsOrder { + validatorStruct := options[validatorSpec] + var negate bool + validator := validatorSpec + customMsgExists := len(validatorStruct.customErrorMessage) > 0 + + // Check whether the tag looks like '!something' or 'something' + if validator[0] == '!' { + validator = validator[1:] + negate = true + } + + // Check for interface param validators + for key, value := range InterfaceParamTagRegexMap { + ps := value.FindStringSubmatch(validator) + if len(ps) == 0 { + continue + } + + validatefunc, ok := InterfaceParamTagMap[key] + if !ok { + continue + } + + delete(options, validatorSpec) + + field := fmt.Sprint(v) + if result := validatefunc(v.Interface(), ps[1:]...); (!result && !negate) || (result && negate) { + if customMsgExists { + return false, Error{t.Name, TruncatingErrorf(validatorStruct.customErrorMessage, field, validator), customMsgExists, stripParams(validatorSpec), []string{}} + } + if negate { + return false, Error{t.Name, fmt.Errorf("%s does validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}} + } + return false, Error{t.Name, fmt.Errorf("%s does not validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}} + } + } + } + switch v.Kind() { case reflect.Bool, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, @@ -1121,10 +1384,10 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options delete(options, validatorSpec) switch v.Kind() { - case reflect.String, - reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, - reflect.Float32, reflect.Float64: + case reflect.String, + reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Float32, reflect.Float64: field := fmt.Sprint(v) // make value into string, then validate with regex if result := validatefunc(field); !result && !negate || result && negate { if customMsgExists { @@ -1202,7 +1465,7 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options } return typeCheck(v.Elem(), t, o, options) case reflect.Struct: - return ValidateStruct(v.Interface()) + return true, nil default: return false, &UnsupportedTypeError{v.Type()} } @@ -1212,25 +1475,14 @@ func stripParams(validatorString string) string { return paramsRegexp.ReplaceAllString(validatorString, "") } -func isEmptyValue(v reflect.Value) bool { +// isFieldSet returns false for nil pointers, interfaces, maps, and slices. For all other values, it returns true. +func isFieldSet(v reflect.Value) bool { switch v.Kind() { - case reflect.String, reflect.Array: - return v.Len() == 0 - case reflect.Map, reflect.Slice: - return v.Len() == 0 || v.IsNil() - case reflect.Bool: - return !v.Bool() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.Interface, reflect.Ptr: - return v.IsNil() + case reflect.Map, reflect.Slice, reflect.Interface, reflect.Ptr: + return !v.IsNil() } - return reflect.DeepEqual(v.Interface(), reflect.Zero(v.Type()).Interface()) + return true } // ErrorByField returns error for specified field of the struct @@ -1252,11 +1504,11 @@ func ErrorsByField(e error) map[string]string { } // prototype for ValidateStruct - switch e.(type) { + switch e := e.(type) { case Error: - m[e.(Error).Name] = e.(Error).Err.Error() + m[e.Name] = e.Err.Error() case Errors: - for _, item := range e.(Errors).Errors() { + for _, item := range e.Errors() { n := ErrorsByField(item) for k, v := range n { m[k] = v diff --git a/vendor/github.com/asaskevich/govalidator/wercker.yml b/vendor/github.com/asaskevich/govalidator/wercker.yml index cac7a5fcf0..bc5f7b0864 100644 --- a/vendor/github.com/asaskevich/govalidator/wercker.yml +++ b/vendor/github.com/asaskevich/govalidator/wercker.yml @@ -12,4 +12,4 @@ build: - script: name: go test code: | - go test -race ./... + go test -race -v ./... diff --git a/vendor/github.com/fsnotify/fsnotify/.editorconfig b/vendor/github.com/fsnotify/fsnotify/.editorconfig index ba49e3c234..fad895851e 100644 --- a/vendor/github.com/fsnotify/fsnotify/.editorconfig +++ b/vendor/github.com/fsnotify/fsnotify/.editorconfig @@ -1,5 +1,12 @@ root = true -[*] +[*.go] indent_style = tab indent_size = 4 +insert_final_newline = true + +[*.{yml,yaml}] +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/vendor/github.com/fsnotify/fsnotify/.gitattributes b/vendor/github.com/fsnotify/fsnotify/.gitattributes new file mode 100644 index 0000000000..32f1001be0 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/.gitattributes @@ -0,0 +1 @@ +go.sum linguist-generated diff --git a/vendor/github.com/fsnotify/fsnotify/.travis.yml b/vendor/github.com/fsnotify/fsnotify/.travis.yml index 981d1bb813..a9c30165cd 100644 --- a/vendor/github.com/fsnotify/fsnotify/.travis.yml +++ b/vendor/github.com/fsnotify/fsnotify/.travis.yml @@ -2,29 +2,35 @@ sudo: false language: go go: - - 1.8.x - - 1.9.x - - tip + - "stable" + - "1.11.x" + - "1.10.x" + - "1.9.x" matrix: + include: + - go: "stable" + env: GOLINT=true allow_failures: - go: tip fast_finish: true -before_script: - - go get -u github.com/golang/lint/golint + +before_install: + - if [ ! -z "${GOLINT}" ]; then go get -u golang.org/x/lint/golint; fi script: - - go test -v --race ./... + - go test --race ./... after_script: - test -z "$(gofmt -s -l -w . | tee /dev/stderr)" - - test -z "$(golint ./... | tee /dev/stderr)" + - if [ ! -z "${GOLINT}" ]; then echo running golint; golint --set_exit_status ./...; else echo skipping golint; fi - go vet ./... os: - linux - osx + - windows notifications: email: false diff --git a/vendor/github.com/fsnotify/fsnotify/LICENSE b/vendor/github.com/fsnotify/fsnotify/LICENSE index f21e540800..e180c8fb05 100644 --- a/vendor/github.com/fsnotify/fsnotify/LICENSE +++ b/vendor/github.com/fsnotify/fsnotify/LICENSE @@ -1,5 +1,5 @@ Copyright (c) 2012 The Go Authors. All rights reserved. -Copyright (c) 2012 fsnotify Authors. All rights reserved. +Copyright (c) 2012-2019 fsnotify Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/vendor/github.com/fsnotify/fsnotify/README.md b/vendor/github.com/fsnotify/fsnotify/README.md index 3993207413..b2629e5229 100644 --- a/vendor/github.com/fsnotify/fsnotify/README.md +++ b/vendor/github.com/fsnotify/fsnotify/README.md @@ -10,16 +10,16 @@ go get -u golang.org/x/sys/... Cross platform: Windows, Linux, BSD and macOS. -|Adapter |OS |Status | -|----------|----------|----------| -|inotify |Linux 2.6.27 or later, Android\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)| -|kqueue |BSD, macOS, iOS\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)| -|ReadDirectoryChangesW|Windows|Supported [![Build status](https://ci.appveyor.com/api/projects/status/ivwjubaih4r0udeh/branch/master?svg=true)](https://ci.appveyor.com/project/NathanYoungman/fsnotify/branch/master)| -|FSEvents |macOS |[Planned](https://github.com/fsnotify/fsnotify/issues/11)| -|FEN |Solaris 11 |[In Progress](https://github.com/fsnotify/fsnotify/issues/12)| -|fanotify |Linux 2.6.37+ | | -|USN Journals |Windows |[Maybe](https://github.com/fsnotify/fsnotify/issues/53)| -|Polling |*All* |[Maybe](https://github.com/fsnotify/fsnotify/issues/9)| +| Adapter | OS | Status | +| --------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| inotify | Linux 2.6.27 or later, Android\* | Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify) | +| kqueue | BSD, macOS, iOS\* | Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify) | +| ReadDirectoryChangesW | Windows | Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify) | +| FSEvents | macOS | [Planned](https://github.com/fsnotify/fsnotify/issues/11) | +| FEN | Solaris 11 | [In Progress](https://github.com/fsnotify/fsnotify/issues/12) | +| fanotify | Linux 2.6.37+ | [Planned](https://github.com/fsnotify/fsnotify/issues/114) | +| USN Journals | Windows | [Maybe](https://github.com/fsnotify/fsnotify/issues/53) | +| Polling | *All* | [Maybe](https://github.com/fsnotify/fsnotify/issues/9) | \* Android and iOS are untested. @@ -33,6 +33,53 @@ All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based o Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project, and likewise for `golang.org/x/sys`. +## Usage + +```go +package main + +import ( + "log" + + "github.com/fsnotify/fsnotify" +) + +func main() { + watcher, err := fsnotify.NewWatcher() + if err != nil { + log.Fatal(err) + } + defer watcher.Close() + + done := make(chan bool) + go func() { + for { + select { + case event, ok := <-watcher.Events: + if !ok { + return + } + log.Println("event:", event) + if event.Op&fsnotify.Write == fsnotify.Write { + log.Println("modified file:", event.Name) + } + case err, ok := <-watcher.Errors: + if !ok { + return + } + log.Println("error:", err) + } + } + }() + + err = watcher.Add("/tmp/foo") + if err != nil { + log.Fatal(err) + } + <-done +} +``` + ## Contributing Please refer to [CONTRIBUTING][] before opening an issue or pull request. @@ -65,6 +112,10 @@ There are OS-specific limits as to how many watches can be created: * Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, reaching this limit results in a "no space left on device" error. * BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error. +**Why don't notifications work with NFS filesystems or filesystem in userspace (FUSE)?** + +fsnotify requires support from underlying OS to work. The current NFS protocol does not provide network level support for file notifications. + [#62]: https://github.com/howeyc/fsnotify/issues/62 [#18]: https://github.com/fsnotify/fsnotify/issues/18 [#11]: https://github.com/fsnotify/fsnotify/issues/11 diff --git a/vendor/github.com/fsnotify/fsnotify/fsnotify.go b/vendor/github.com/fsnotify/fsnotify/fsnotify.go index 190bf0de57..89cab046d1 100644 --- a/vendor/github.com/fsnotify/fsnotify/fsnotify.go +++ b/vendor/github.com/fsnotify/fsnotify/fsnotify.go @@ -63,4 +63,6 @@ func (e Event) String() string { } // Common errors that can be reported by a watcher -var ErrEventOverflow = errors.New("fsnotify queue overflow") +var ( + ErrEventOverflow = errors.New("fsnotify queue overflow") +) diff --git a/vendor/github.com/fsnotify/fsnotify/go.mod b/vendor/github.com/fsnotify/fsnotify/go.mod new file mode 100644 index 0000000000..ff11e13f22 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/go.mod @@ -0,0 +1,5 @@ +module github.com/fsnotify/fsnotify + +go 1.13 + +require golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9 diff --git a/vendor/github.com/fsnotify/fsnotify/go.sum b/vendor/github.com/fsnotify/fsnotify/go.sum new file mode 100644 index 0000000000..f60af9855d --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/go.sum @@ -0,0 +1,2 @@ +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9 h1:L2auWcuQIvxz9xSEqzESnV/QN/gNRXNApHi3fYwl2w0= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/fsnotify/fsnotify/inotify_poller.go b/vendor/github.com/fsnotify/fsnotify/inotify_poller.go index cc7db4b22e..b33f2b4d4b 100644 --- a/vendor/github.com/fsnotify/fsnotify/inotify_poller.go +++ b/vendor/github.com/fsnotify/fsnotify/inotify_poller.go @@ -40,12 +40,12 @@ func newFdPoller(fd int) (*fdPoller, error) { poller.fd = fd // Create epoll fd - poller.epfd, errno = unix.EpollCreate1(0) + poller.epfd, errno = unix.EpollCreate1(unix.EPOLL_CLOEXEC) if poller.epfd == -1 { return nil, errno } // Create pipe; pipe[0] is the read end, pipe[1] the write end. - errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK) + errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK|unix.O_CLOEXEC) if errno != nil { return nil, errno } diff --git a/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go b/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go index 7d8de14513..2306c4620b 100644 --- a/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go +++ b/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go @@ -8,4 +8,4 @@ package fsnotify import "golang.org/x/sys/unix" -const openMode = unix.O_NONBLOCK | unix.O_RDONLY +const openMode = unix.O_NONBLOCK | unix.O_RDONLY | unix.O_CLOEXEC diff --git a/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go b/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go index 9139e17161..870c4d6d18 100644 --- a/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go +++ b/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go @@ -9,4 +9,4 @@ package fsnotify import "golang.org/x/sys/unix" // note: this constant is not defined on BSD -const openMode = unix.O_EVTONLY +const openMode = unix.O_EVTONLY | unix.O_CLOEXEC diff --git a/vendor/github.com/go-openapi/analysis/.golangci.yml b/vendor/github.com/go-openapi/analysis/.golangci.yml index 76af8ab1c8..c3694fc6c0 100644 --- a/vendor/github.com/go-openapi/analysis/.golangci.yml +++ b/vendor/github.com/go-openapi/analysis/.golangci.yml @@ -25,3 +25,8 @@ linters: # linter rather than changing code that works. # see: https://github.com/kyoh86/scopelint/issues/4 - scopelint + - godox + - gocognit + - whitespace + - wsl + - funlen diff --git a/vendor/github.com/go-openapi/analysis/.travis.yml b/vendor/github.com/go-openapi/analysis/.travis.yml index 7ecf865c21..c0196e12a6 100644 --- a/vendor/github.com/go-openapi/analysis/.travis.yml +++ b/vendor/github.com/go-openapi/analysis/.travis.yml @@ -1,12 +1,10 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.11.x -- 1.12.x +- 1.13.x +- 1.14.x install: -- GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on +- go get -u gotest.tools/gotestsum language: go notifications: slack: diff --git a/vendor/github.com/go-openapi/analysis/analyzer.go b/vendor/github.com/go-openapi/analysis/analyzer.go index 4d98718c4e..9341002100 100644 --- a/vendor/github.com/go-openapi/analysis/analyzer.go +++ b/vendor/github.com/go-openapi/analysis/analyzer.go @@ -221,7 +221,7 @@ func (s *Spec) initialize() { s.analyzeItems("items", parameter.Items, refPref, "parameter") } if parameter.In == "body" && parameter.Schema != nil { - s.analyzeSchema("schema", *parameter.Schema, refPref) + s.analyzeSchema("schema", parameter.Schema, refPref) } if parameter.Pattern != "" { s.patterns.addParameterPattern(refPref, parameter.Pattern) @@ -246,12 +246,13 @@ func (s *Spec) initialize() { } } if response.Schema != nil { - s.analyzeSchema("schema", *response.Schema, refPref) + s.analyzeSchema("schema", response.Schema, refPref) } } - for name, schema := range s.spec.Definitions { - s.analyzeSchema(name, schema, "/definitions") + for name := range s.spec.Definitions { + schema := s.spec.Definitions[name] + s.analyzeSchema(name, &schema, "/definitions") } // TODO: after analyzing all things and flattening schemas etc // resolve all the collected references to their final representations @@ -288,7 +289,7 @@ func (s *Spec) analyzeOperations(path string, pi *spec.PathItem) { s.analyzeItems("items", param.Items, refPref, "parameter") } if param.Schema != nil { - s.analyzeSchema("schema", *param.Schema, refPref) + s.analyzeSchema("schema", param.Schema, refPref) } } } @@ -344,7 +345,7 @@ func (s *Spec) analyzeOperation(method, path string, op *spec.Operation) { } s.analyzeItems("items", param.Items, refPref, "parameter") if param.In == "body" && param.Schema != nil { - s.analyzeSchema("schema", *param.Schema, refPref) + s.analyzeSchema("schema", param.Schema, refPref) } } if op.Responses != nil { @@ -361,7 +362,7 @@ func (s *Spec) analyzeOperation(method, path string, op *spec.Operation) { } } if op.Responses.Default.Schema != nil { - s.analyzeSchema("schema", *op.Responses.Default.Schema, refPref) + s.analyzeSchema("schema", op.Responses.Default.Schema, refPref) } } for k, res := range op.Responses.StatusCodeResponses { @@ -380,17 +381,17 @@ func (s *Spec) analyzeOperation(method, path string, op *spec.Operation) { } } if res.Schema != nil { - s.analyzeSchema("schema", *res.Schema, refPref) + s.analyzeSchema("schema", res.Schema, refPref) } } } } -func (s *Spec) analyzeSchema(name string, schema spec.Schema, prefix string) { +func (s *Spec) analyzeSchema(name string, schema *spec.Schema, prefix string) { refURI := slashpath.Join(prefix, jsonpointer.Escape(name)) schRef := SchemaRef{ Name: name, - Schema: &schema, + Schema: schema, Ref: spec.MustCreateRef("#" + refURI), TopLevel: prefix == "/definitions", } @@ -408,28 +409,34 @@ func (s *Spec) analyzeSchema(name string, schema spec.Schema, prefix string) { } for k, v := range schema.Definitions { - s.analyzeSchema(k, v, slashpath.Join(refURI, "definitions")) + v := v + s.analyzeSchema(k, &v, slashpath.Join(refURI, "definitions")) } for k, v := range schema.Properties { - s.analyzeSchema(k, v, slashpath.Join(refURI, "properties")) + v := v + s.analyzeSchema(k, &v, slashpath.Join(refURI, "properties")) } for k, v := range schema.PatternProperties { + v := v // NOTE: swagger 2.0 does not support PatternProperties. // However it is possible to analyze this in a schema - s.analyzeSchema(k, v, slashpath.Join(refURI, "patternProperties")) + s.analyzeSchema(k, &v, slashpath.Join(refURI, "patternProperties")) } - for i, v := range schema.AllOf { + for i := range schema.AllOf { + v := &schema.AllOf[i] s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "allOf")) } if len(schema.AllOf) > 0 { s.allOfs["#"+refURI] = schRef } - for i, v := range schema.AnyOf { + for i := range schema.AnyOf { + v := &schema.AnyOf[i] // NOTE: swagger 2.0 does not support anyOf constructs. // However it is possible to analyze this in a schema s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "anyOf")) } - for i, v := range schema.OneOf { + for i := range schema.OneOf { + v := &schema.OneOf[i] // NOTE: swagger 2.0 does not support oneOf constructs. // However it is possible to analyze this in a schema s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "oneOf")) @@ -437,21 +444,22 @@ func (s *Spec) analyzeSchema(name string, schema spec.Schema, prefix string) { if schema.Not != nil { // NOTE: swagger 2.0 does not support "not" constructs. // However it is possible to analyze this in a schema - s.analyzeSchema("not", *schema.Not, refURI) + s.analyzeSchema("not", schema.Not, refURI) } if schema.AdditionalProperties != nil && schema.AdditionalProperties.Schema != nil { - s.analyzeSchema("additionalProperties", *schema.AdditionalProperties.Schema, refURI) + s.analyzeSchema("additionalProperties", schema.AdditionalProperties.Schema, refURI) } if schema.AdditionalItems != nil && schema.AdditionalItems.Schema != nil { // NOTE: swagger 2.0 does not support AdditionalItems. // However it is possible to analyze this in a schema - s.analyzeSchema("additionalItems", *schema.AdditionalItems.Schema, refURI) + s.analyzeSchema("additionalItems", schema.AdditionalItems.Schema, refURI) } if schema.Items != nil { if schema.Items.Schema != nil { - s.analyzeSchema("items", *schema.Items.Schema, refURI) + s.analyzeSchema("items", schema.Items.Schema, refURI) } - for i, sch := range schema.Items.Schemas { + for i := range schema.Items.Schemas { + sch := &schema.Items.Schemas[i] s.analyzeSchema(strconv.Itoa(i), sch, slashpath.Join(refURI, "items")) } } diff --git a/vendor/github.com/go-openapi/analysis/flatten.go b/vendor/github.com/go-openapi/analysis/flatten.go index ae1eef5d19..ab3f949c30 100644 --- a/vendor/github.com/go-openapi/analysis/flatten.go +++ b/vendor/github.com/go-openapi/analysis/flatten.go @@ -41,10 +41,11 @@ type FlattenOpts struct { BasePath string // Flattening options - Expand bool // If Expand is true, we skip flattening the spec and expand it instead - Minimal bool - Verbose bool - RemoveUnused bool + Expand bool // If Expand is true, we skip flattening the spec and expand it instead + Minimal bool + Verbose bool + RemoveUnused bool + ContinueOnError bool // Continues when facing some issues /* Extra keys */ _ struct{} // require keys @@ -135,6 +136,7 @@ func newContext() *context { // - ... // func Flatten(opts FlattenOpts) error { + debugLog("FlattenOpts: %#v", opts) // Make sure opts.BasePath is an absolute path if !filepath.IsAbs(opts.BasePath) { cwd, _ := os.Getwd() @@ -148,7 +150,9 @@ func Flatten(opts FlattenOpts) error { // recursively expand responses, parameters, path items and items in simple schemas. // This simplifies the spec and leaves $ref only into schema objects. - if err := swspec.ExpandSpec(opts.Swagger(), opts.ExpandOpts(!opts.Expand)); err != nil { + expandOpts := opts.ExpandOpts(!opts.Expand) + expandOpts.ContinueOnError = opts.ContinueOnError + if err := swspec.ExpandSpec(opts.Swagger(), expandOpts); err != nil { return err } @@ -846,7 +850,7 @@ func importExternalReferences(opts *FlattenOpts) (bool, error) { enums: enumAnalysis{}, } partialAnalyzer.reset() - partialAnalyzer.analyzeSchema("", *sch, "/") + partialAnalyzer.analyzeSchema("", sch, "/") // now rewrite those refs with rebase for key, ref := range partialAnalyzer.references.allRefs { @@ -874,6 +878,7 @@ func importExternalReferences(opts *FlattenOpts) (bool, error) { if _, ok := opts.flattenContext.newRefs[key]; ok { resolved = opts.flattenContext.newRefs[key].resolved } + debugLog("keeping track of ref: %s (%s), resolved: %t", key, newName, resolved) opts.flattenContext.newRefs[key] = &newRef{ key: key, newName: newName, @@ -1308,16 +1313,55 @@ func stripPointersAndOAIGen(opts *FlattenOpts) error { return err } - // restrip + // restrip and re-analyze if hasIntroducedPointerOrInline, ers = stripOAIGen(opts); ers != nil { return ers } - - opts.Spec.reload() // re-analyze } return nil } +func updateRefParents(opts *FlattenOpts, r *newRef) { + if !r.isOAIGen || r.resolved { // bail on already resolved entries (avoid looping) + return + } + for k, v := range opts.Spec.references.allRefs { + if r.path != v.String() { + continue + } + found := false + for _, p := range r.parents { + if p == k { + found = true + break + } + } + if !found { + r.parents = append(r.parents, k) + } + } +} + +// topMostRefs is able to sort refs by hierarchical then lexicographic order, +// yielding refs ordered breadth-first. +type topmostRefs []string + +func (k topmostRefs) Len() int { return len(k) } +func (k topmostRefs) Swap(i, j int) { k[i], k[j] = k[j], k[i] } +func (k topmostRefs) Less(i, j int) bool { + li, lj := len(strings.Split(k[i], "/")), len(strings.Split(k[j], "/")) + if li == lj { + return k[i] < k[j] + } + return li < lj +} + +func topmostFirst(refs []string) []string { + res := topmostRefs(refs) + sort.Sort(res) + return res +} + // stripOAIGen strips the spec from unnecessary OAIGen constructs, initially created to dedupe flattened definitions. // // A dedupe is deemed unnecessary whenever: @@ -1325,44 +1369,25 @@ func stripPointersAndOAIGen(opts *FlattenOpts) error { // - there is a conflict with multiple parents: merge OAIGen in first parent, the rewrite other parents to point to // the first parent. // -// This function returns a true bool whenever it re-inlined a complex schema, so the caller may chose to iterate +// This function returns true whenever it re-inlined a complex schema, so the caller may chose to iterate // pointer and name resolution again. func stripOAIGen(opts *FlattenOpts) (bool, error) { debugLog("stripOAIGen") replacedWithComplex := false - // figure out referers of OAIGen definitions + // figure out referers of OAIGen definitions (doing it before the ref start mutating) for _, r := range opts.flattenContext.newRefs { - if !r.isOAIGen || r.resolved { // bail on already resolved entries (avoid looping) - continue - } - for k, v := range opts.Spec.references.allRefs { - if r.path != v.String() { - continue - } - found := false - for _, p := range r.parents { - if p == k { - found = true - break - } - } - if !found { - r.parents = append(r.parents, k) - } - } + updateRefParents(opts, r) } - for k := range opts.flattenContext.newRefs { r := opts.flattenContext.newRefs[k] - //debugLog("newRefs[%s]: isOAIGen: %t, resolved: %t, name: %s, path:%s, #parents: %d, parents: %v, ref: %s", - // k, r.isOAIGen, r.resolved, r.newName, r.path, len(r.parents), r.parents, r.schema.Ref.String()) + debugLog("newRefs[%s]: isOAIGen: %t, resolved: %t, name: %s, path:%s, #parents: %d, parents: %v, ref: %s", + k, r.isOAIGen, r.resolved, r.newName, r.path, len(r.parents), r.parents, r.schema.Ref.String()) if r.isOAIGen && len(r.parents) >= 1 { - pr := r.parents - sort.Strings(pr) + pr := topmostFirst(r.parents) - // rewrite first parent schema in lexicographical order - debugLog("rewrite first parent in lex order %s with schema", pr[0]) + // rewrite first parent schema in hierarchical then lexicographical order + debugLog("rewrite first parent %s with schema", pr[0]) if err := updateRefWithSchema(opts.Swagger(), pr[0], r.schema); err != nil { return false, err } diff --git a/vendor/github.com/go-openapi/analysis/go.mod b/vendor/github.com/go-openapi/analysis/go.mod index 6c8e58577c..8dea2d9910 100644 --- a/vendor/github.com/go-openapi/analysis/go.mod +++ b/vendor/github.com/go-openapi/analysis/go.mod @@ -1,13 +1,23 @@ module github.com/go-openapi/analysis require ( + github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 // indirect + github.com/go-openapi/errors v0.19.3 // indirect github.com/go-openapi/jsonpointer v0.19.3 + github.com/go-openapi/jsonreference v0.19.3 // indirect github.com/go-openapi/loads v0.19.0 - github.com/go-openapi/spec v0.19.3 - github.com/go-openapi/strfmt v0.19.3 - github.com/go-openapi/swag v0.19.5 + github.com/go-openapi/spec v0.19.6 + github.com/go-openapi/strfmt v0.19.4 + github.com/go-openapi/swag v0.19.7 + github.com/kr/pty v1.1.5 // indirect + github.com/mailru/easyjson v0.7.1 // indirect github.com/stretchr/testify v1.3.0 - go.mongodb.org/mongo-driver v1.1.1 // indirect + go.mongodb.org/mongo-driver v1.3.0 // indirect + golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 // indirect + golang.org/x/net v0.0.0-20200226121028-0de0cce0169b // indirect + golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f // indirect + golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59 // indirect + gopkg.in/yaml.v2 v2.2.8 // indirect ) go 1.13 diff --git a/vendor/github.com/go-openapi/analysis/go.sum b/vendor/github.com/go-openapi/analysis/go.sum index 8e8b5f9bc4..82636eaebe 100644 --- a/vendor/github.com/go-openapi/analysis/go.sum +++ b/vendor/github.com/go-openapi/analysis/go.sum @@ -1,3 +1,4 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -6,6 +7,8 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 h1:zV3ejI06GQ59hwDQAvmK1qxOQGB3WuVTRoY0okPTAv0= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -14,6 +17,8 @@ github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70t github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.3 h1:7MGZI1ibQDLasvAz8HuhvYk9eNJbJkCOXWsSjjMS+Zc= +github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= @@ -22,28 +27,70 @@ github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34 github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/loads v0.19.0 h1:wCOBNscACI8L93tt5tvB2zOMkJ098XCw3fP0BY2ybDA= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.6 h1:rMMMj8cV38KVXK7SFc+I2MWClbEfbK705+j+dyqun5g= +github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.2 h1:clPGfBnJohokno0e+d7hs6Yocrzjlgz6EsQSDncCRnE= github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA= github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.4 h1:eRvaqAhpL0IL6Trh5fDsGnGhiXndzHFuA05w6sXH6/g= +github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.7 h1:VRuXN2EnMSsZdauzdss6JBC29YotDqG59BZ+tdlIL1s= +github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -55,23 +102,47 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8= +github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= go.mongodb.org/mongo-driver v1.0.3 h1:GKoji1ld3tw2aC+GX1wbr/J2fX13yNacEYoJ8Nhr0yU= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.3.0 h1:ew6uUIeJOo+qdUUv7LxFCUhtWmVv7ZV/Xuy4FAUsw2E= +go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -80,18 +151,36 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowK golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/go-openapi/analysis/mixin.go b/vendor/github.com/go-openapi/analysis/mixin.go index 625c46f8f9..d5797042a7 100644 --- a/vendor/github.com/go-openapi/analysis/mixin.go +++ b/vendor/github.com/go-openapi/analysis/mixin.go @@ -332,6 +332,9 @@ func mergeSwaggerProps(primary *spec.Swagger, m *spec.Swagger) []string { if primary.Info.Contact == nil { primary.Info.Contact = m.Info.Contact } else if m.Info.Contact != nil { + var csk []string + primary.Info.Contact.Extensions, csk = mergeExtensions(primary.Info.Contact.Extensions, m.Info.Contact.Extensions) + skipped = append(skipped, csk...) if primary.Info.Contact.Name == "" { primary.Info.Contact.Name = m.Info.Contact.Name } @@ -346,6 +349,9 @@ func mergeSwaggerProps(primary *spec.Swagger, m *spec.Swagger) []string { if primary.Info.License == nil { primary.Info.License = m.Info.License } else if m.Info.License != nil { + var lsk []string + primary.Info.License.Extensions, lsk = mergeExtensions(primary.Info.License.Extensions, m.Info.License.Extensions) + skipped = append(skipped, lsk...) if primary.Info.License.Name == "" { primary.Info.License.Name = m.Info.License.Name } diff --git a/vendor/github.com/go-openapi/errors/.travis.yml b/vendor/github.com/go-openapi/errors/.travis.yml index ba8a6d5918..119ec69818 100644 --- a/vendor/github.com/go-openapi/errors/.travis.yml +++ b/vendor/github.com/go-openapi/errors/.travis.yml @@ -1,12 +1,10 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.11.x -- 1.12.x +- 1.13.x +- 1.14.x install: - GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on language: go notifications: slack: diff --git a/vendor/github.com/go-openapi/errors/go.mod b/vendor/github.com/go-openapi/errors/go.mod index 084143001f..d7a9030ab6 100644 --- a/vendor/github.com/go-openapi/errors/go.mod +++ b/vendor/github.com/go-openapi/errors/go.mod @@ -1,6 +1,12 @@ module github.com/go-openapi/errors +go 1.14 + require ( - github.com/stretchr/objx v0.2.0 // indirect - github.com/stretchr/testify v1.3.0 + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + github.com/stretchr/testify v1.6.1 + gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect + gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c // indirect ) diff --git a/vendor/github.com/go-openapi/errors/go.sum b/vendor/github.com/go-openapi/errors/go.sum index e7314e279f..ecd91c75b1 100644 --- a/vendor/github.com/go-openapi/errors/go.sum +++ b/vendor/github.com/go-openapi/errors/go.sum @@ -1,9 +1,26 @@ +github.com/creack/pty v1.1.9 h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c h1:grhR+C34yXImVGp7EzNk+DTIk+323eIUWOmEevy6bDo= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/vendor/github.com/go-openapi/errors/parsing.go b/vendor/github.com/go-openapi/errors/parsing.go index 1bae87302a..0f96ce2094 100644 --- a/vendor/github.com/go-openapi/errors/parsing.go +++ b/vendor/github.com/go-openapi/errors/parsing.go @@ -16,7 +16,7 @@ package errors import "fmt" -// ParseError respresents a parsing error +// ParseError represents a parsing error type ParseError struct { code int32 Name string diff --git a/vendor/github.com/go-openapi/errors/schema.go b/vendor/github.com/go-openapi/errors/schema.go index 14fb2c5f11..1c0be5f2ac 100644 --- a/vendor/github.com/go-openapi/errors/schema.go +++ b/vendor/github.com/go-openapi/errors/schema.go @@ -268,7 +268,7 @@ func DuplicateItems(name, in string) *Validation { } // TooManyItems error for when an array contains too many items -func TooManyItems(name, in string, max int64) *Validation { +func TooManyItems(name, in string, max int64, value interface{}) *Validation { msg := fmt.Sprintf(maxItemsFail, name, in, max) if in == "" { msg = fmt.Sprintf(maxItemsFailNoIn, name, max) @@ -278,12 +278,13 @@ func TooManyItems(name, in string, max int64) *Validation { code: MaxItemsFailCode, Name: name, In: in, + Value: value, message: msg, } } // TooFewItems error for when an array contains too few items -func TooFewItems(name, in string, min int64) *Validation { +func TooFewItems(name, in string, min int64, value interface{}) *Validation { msg := fmt.Sprintf(minItemsFail, name, in, min) if in == "" { msg = fmt.Sprintf(minItemsFailNoIn, name, min) @@ -292,12 +293,13 @@ func TooFewItems(name, in string, min int64) *Validation { code: MinItemsFailCode, Name: name, In: in, + Value: value, message: msg, } } -// ExceedsMaximumInt error for when maxinum validation fails -func ExceedsMaximumInt(name, in string, max int64, exclusive bool) *Validation { +// ExceedsMaximumInt error for when maximum validation fails +func ExceedsMaximumInt(name, in string, max int64, exclusive bool, value interface{}) *Validation { var message string if in == "" { m := maxIncFailNoIn @@ -316,13 +318,13 @@ func ExceedsMaximumInt(name, in string, max int64, exclusive bool) *Validation { code: MaxFailCode, Name: name, In: in, - Value: max, + Value: value, message: message, } } -// ExceedsMaximumUint error for when maxinum validation fails -func ExceedsMaximumUint(name, in string, max uint64, exclusive bool) *Validation { +// ExceedsMaximumUint error for when maximum validation fails +func ExceedsMaximumUint(name, in string, max uint64, exclusive bool, value interface{}) *Validation { var message string if in == "" { m := maxIncFailNoIn @@ -341,13 +343,13 @@ func ExceedsMaximumUint(name, in string, max uint64, exclusive bool) *Validation code: MaxFailCode, Name: name, In: in, - Value: max, + Value: value, message: message, } } -// ExceedsMaximum error for when maxinum validation fails -func ExceedsMaximum(name, in string, max float64, exclusive bool) *Validation { +// ExceedsMaximum error for when maximum validation fails +func ExceedsMaximum(name, in string, max float64, exclusive bool, value interface{}) *Validation { var message string if in == "" { m := maxIncFailNoIn @@ -366,13 +368,13 @@ func ExceedsMaximum(name, in string, max float64, exclusive bool) *Validation { code: MaxFailCode, Name: name, In: in, - Value: max, + Value: value, message: message, } } -// ExceedsMinimumInt error for when maxinum validation fails -func ExceedsMinimumInt(name, in string, min int64, exclusive bool) *Validation { +// ExceedsMinimumInt error for when minimum validation fails +func ExceedsMinimumInt(name, in string, min int64, exclusive bool, value interface{}) *Validation { var message string if in == "" { m := minIncFailNoIn @@ -391,13 +393,13 @@ func ExceedsMinimumInt(name, in string, min int64, exclusive bool) *Validation { code: MinFailCode, Name: name, In: in, - Value: min, + Value: value, message: message, } } -// ExceedsMinimumUint error for when maxinum validation fails -func ExceedsMinimumUint(name, in string, min uint64, exclusive bool) *Validation { +// ExceedsMinimumUint error for when minimum validation fails +func ExceedsMinimumUint(name, in string, min uint64, exclusive bool, value interface{}) *Validation { var message string if in == "" { m := minIncFailNoIn @@ -416,13 +418,13 @@ func ExceedsMinimumUint(name, in string, min uint64, exclusive bool) *Validation code: MinFailCode, Name: name, In: in, - Value: min, + Value: value, message: message, } } -// ExceedsMinimum error for when maxinum validation fails -func ExceedsMinimum(name, in string, min float64, exclusive bool) *Validation { +// ExceedsMinimum error for when minimum validation fails +func ExceedsMinimum(name, in string, min float64, exclusive bool, value interface{}) *Validation { var message string if in == "" { m := minIncFailNoIn @@ -441,13 +443,13 @@ func ExceedsMinimum(name, in string, min float64, exclusive bool) *Validation { code: MinFailCode, Name: name, In: in, - Value: min, + Value: value, message: message, } } // NotMultipleOf error for when multiple of validation fails -func NotMultipleOf(name, in string, multiple interface{}) *Validation { +func NotMultipleOf(name, in string, multiple, value interface{}) *Validation { var msg string if in == "" { msg = fmt.Sprintf(multipleOfFailNoIn, name, multiple) @@ -458,7 +460,7 @@ func NotMultipleOf(name, in string, multiple interface{}) *Validation { code: MultipleOfFailCode, Name: name, In: in, - Value: multiple, + Value: value, message: msg, } } @@ -483,7 +485,7 @@ func EnumFail(name, in string, value interface{}, values []interface{}) *Validat } // Required error for when a value is missing -func Required(name, in string) *Validation { +func Required(name, in string, value interface{}) *Validation { var msg string if in == "" { msg = fmt.Sprintf(requiredFailNoIn, name) @@ -494,12 +496,13 @@ func Required(name, in string) *Validation { code: RequiredFailCode, Name: name, In: in, + Value: value, message: msg, } } // TooLong error for when a string is too long -func TooLong(name, in string, max int64) *Validation { +func TooLong(name, in string, max int64, value interface{}) *Validation { var msg string if in == "" { msg = fmt.Sprintf(tooLongMessageNoIn, name, max) @@ -510,12 +513,13 @@ func TooLong(name, in string, max int64) *Validation { code: TooLongFailCode, Name: name, In: in, + Value: value, message: msg, } } // TooShort error for when a string is too short -func TooShort(name, in string, min int64) *Validation { +func TooShort(name, in string, min int64, value interface{}) *Validation { var msg string if in == "" { msg = fmt.Sprintf(tooShortMessageNoIn, name, min) @@ -527,13 +531,14 @@ func TooShort(name, in string, min int64) *Validation { code: TooShortFailCode, Name: name, In: in, + Value: value, message: msg, } } // FailedPattern error for when a string fails a regex pattern match // the pattern that is returned is the ECMA syntax version of the pattern not the golang version. -func FailedPattern(name, in, pattern string) *Validation { +func FailedPattern(name, in, pattern string, value interface{}) *Validation { var msg string if in == "" { msg = fmt.Sprintf(patternFailNoIn, name, pattern) @@ -545,6 +550,7 @@ func FailedPattern(name, in, pattern string) *Validation { code: PatternFailCode, Name: name, In: in, + Value: value, message: msg, } } diff --git a/vendor/github.com/go-openapi/jsonreference/README.md b/vendor/github.com/go-openapi/jsonreference/README.md index 66345f4c61..b94753aa52 100644 --- a/vendor/github.com/go-openapi/jsonreference/README.md +++ b/vendor/github.com/go-openapi/jsonreference/README.md @@ -4,7 +4,7 @@ An implementation of JSON Reference - Go language ## Status -Work in progress ( 90% done ) +Feature complete. Stable API ## Dependencies https://github.com/go-openapi/jsonpointer diff --git a/vendor/github.com/go-openapi/jsonreference/go.mod b/vendor/github.com/go-openapi/jsonreference/go.mod index aff1d0163e..e6c2ec4d92 100644 --- a/vendor/github.com/go-openapi/jsonreference/go.mod +++ b/vendor/github.com/go-openapi/jsonreference/go.mod @@ -6,7 +6,7 @@ require ( github.com/go-openapi/jsonpointer v0.19.3 github.com/stretchr/testify v1.3.0 golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // indirect - golang.org/x/text v0.3.2 // indirect + golang.org/x/text v0.3.3 // indirect ) go 1.13 diff --git a/vendor/github.com/go-openapi/jsonreference/go.sum b/vendor/github.com/go-openapi/jsonreference/go.sum index c7ceab5802..b37f873e55 100644 --- a/vendor/github.com/go-openapi/jsonreference/go.sum +++ b/vendor/github.com/go-openapi/jsonreference/go.sum @@ -5,12 +5,8 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= @@ -28,14 +24,12 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= diff --git a/vendor/github.com/go-openapi/loads/.travis.yml b/vendor/github.com/go-openapi/loads/.travis.yml index 8a7e05d911..6bf906ec09 100644 --- a/vendor/github.com/go-openapi/loads/.travis.yml +++ b/vendor/github.com/go-openapi/loads/.travis.yml @@ -1,12 +1,10 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.11.x -- 1.12.x +- 1.13.x +- 1.14.x install: -- GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on +- go get -u gotest.tools/gotestsum language: go notifications: slack: diff --git a/vendor/github.com/go-openapi/loads/go.mod b/vendor/github.com/go-openapi/loads/go.mod index 29351d5881..54e5d98c92 100644 --- a/vendor/github.com/go-openapi/loads/go.mod +++ b/vendor/github.com/go-openapi/loads/go.mod @@ -1,11 +1,11 @@ module github.com/go-openapi/loads require ( - github.com/go-openapi/analysis v0.19.5 - github.com/go-openapi/spec v0.19.3 - github.com/go-openapi/swag v0.19.5 + github.com/go-openapi/analysis v0.19.10 + github.com/go-openapi/spec v0.19.6 + github.com/go-openapi/swag v0.19.7 github.com/stretchr/testify v1.3.0 - gopkg.in/yaml.v2 v2.2.2 + gopkg.in/yaml.v2 v2.2.8 ) go 1.13 diff --git a/vendor/github.com/go-openapi/loads/go.sum b/vendor/github.com/go-openapi/loads/go.sum index ac9e61b2ef..ec9a401025 100644 --- a/vendor/github.com/go-openapi/loads/go.sum +++ b/vendor/github.com/go-openapi/loads/go.sum @@ -1,3 +1,4 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -6,16 +7,20 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 h1:zV3ejI06GQ59hwDQAvmK1qxOQGB3WuVTRoY0okPTAv0= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +github.com/go-openapi/analysis v0.19.10 h1:5BHISBAXOc/aJK25irLZnx2D3s6WyYaY9D4gmuz9fdE= +github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.3 h1:7MGZI1ibQDLasvAz8HuhvYk9eNJbJkCOXWsSjjMS+Zc= +github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= @@ -24,25 +29,63 @@ github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34 github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.6 h1:rMMMj8cV38KVXK7SFc+I2MWClbEfbK705+j+dyqun5g= +github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.4 h1:eRvaqAhpL0IL6Trh5fDsGnGhiXndzHFuA05w6sXH6/g= +github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.7 h1:VRuXN2EnMSsZdauzdss6JBC29YotDqG59BZ+tdlIL1s= +github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -54,23 +97,45 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8= +github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= go.mongodb.org/mongo-driver v1.0.3 h1:GKoji1ld3tw2aC+GX1wbr/J2fX13yNacEYoJ8Nhr0yU= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.3.0 h1:ew6uUIeJOo+qdUUv7LxFCUhtWmVv7ZV/Xuy4FAUsw2E= +go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -79,18 +144,37 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowK golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/go-openapi/runtime/.travis.yml b/vendor/github.com/go-openapi/runtime/.travis.yml index 2fc7b58ff2..e36276ab3f 100644 --- a/vendor/github.com/go-openapi/runtime/.travis.yml +++ b/vendor/github.com/go-openapi/runtime/.travis.yml @@ -1,12 +1,10 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.11.x -- 1.12.x +- 1.13.x +- 1.14.x install: - GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on language: go notifications: slack: diff --git a/vendor/github.com/go-openapi/runtime/client_request.go b/vendor/github.com/go-openapi/runtime/client_request.go index 904196ae3e..6215e0a1c1 100644 --- a/vendor/github.com/go-openapi/runtime/client_request.go +++ b/vendor/github.com/go-openapi/runtime/client_request.go @@ -41,7 +41,7 @@ type ClientRequestWriter interface { // add information to a swagger client request type ClientRequest interface { SetHeaderParam(string, ...string) error - + GetHeaderParams() http.Header SetQueryParam(string, ...string) error diff --git a/vendor/github.com/go-openapi/runtime/client_response.go b/vendor/github.com/go-openapi/runtime/client_response.go index 729e18b228..d97e0ac64f 100644 --- a/vendor/github.com/go-openapi/runtime/client_response.go +++ b/vendor/github.com/go-openapi/runtime/client_response.go @@ -17,6 +17,8 @@ package runtime import ( "fmt" "io" + + "encoding/json" ) // A ClientResponse represents a client response @@ -59,5 +61,10 @@ type APIError struct { } func (a *APIError) Error() string { - return fmt.Sprintf("%s (status %d): %+v ", a.OperationName, a.Code, a.Response) + resp, _ := json.Marshal(a.Response) + return fmt.Sprintf("%s (status %d): %s", a.OperationName, a.Code, resp) +} + +func (a *APIError) String() string { + return a.Error() } diff --git a/vendor/github.com/go-openapi/runtime/go.mod b/vendor/github.com/go-openapi/runtime/go.mod index cfeacb7972..3effc2817e 100644 --- a/vendor/github.com/go-openapi/runtime/go.mod +++ b/vendor/github.com/go-openapi/runtime/go.mod @@ -2,15 +2,16 @@ module github.com/go-openapi/runtime require ( github.com/docker/go-units v0.4.0 - github.com/go-openapi/analysis v0.19.5 - github.com/go-openapi/errors v0.19.2 - github.com/go-openapi/loads v0.19.3 - github.com/go-openapi/spec v0.19.3 - github.com/go-openapi/strfmt v0.19.3 - github.com/go-openapi/swag v0.19.5 - github.com/go-openapi/validate v0.19.3 - github.com/stretchr/testify v1.4.0 - gopkg.in/yaml.v2 v2.2.2 + github.com/go-openapi/analysis v0.19.10 + github.com/go-openapi/errors v0.19.6 + github.com/go-openapi/loads v0.19.5 + github.com/go-openapi/spec v0.19.8 + github.com/go-openapi/strfmt v0.19.5 + github.com/go-openapi/swag v0.19.9 + github.com/go-openapi/validate v0.19.10 + github.com/stretchr/testify v1.6.1 + gopkg.in/yaml.v2 v2.3.0 + gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect ) go 1.13 diff --git a/vendor/github.com/go-openapi/runtime/go.sum b/vendor/github.com/go-openapi/runtime/go.sum index f068235195..5cadebb499 100644 --- a/vendor/github.com/go-openapi/runtime/go.sum +++ b/vendor/github.com/go-openapi/runtime/go.sum @@ -1,3 +1,4 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= @@ -8,6 +9,10 @@ github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf h1:eg0MeVzs github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= +github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -26,10 +31,15 @@ github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9sn github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +github.com/go-openapi/analysis v0.19.10 h1:5BHISBAXOc/aJK25irLZnx2D3s6WyYaY9D4gmuz9fdE= +github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.6 h1:xZMThgv5SQ7SMbWtKFkCf9bBdvR2iEyw9k3zGZONuys= +github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= @@ -40,6 +50,8 @@ github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3Hfo github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= @@ -47,15 +59,21 @@ github.com/go-openapi/loads v0.19.2 h1:rf5ArTHmIJxyV5Oiks+Su0mUens1+AjpkPoWr5xFR github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= github.com/go-openapi/loads v0.19.3 h1:jwIoahqCmaA5OBoc/B+1+Mu2L0Gr8xYQnbeyQEo/7b0= github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= +github.com/go-openapi/loads v0.19.5 h1:jZVYWawIQiA1NBnHla28ktg6hrcfTHsCE+3QLVRBIls= +github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= +github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2 h1:SStNd1jRcYtfKCN7R0laGNs80WYYvn5CbBjM2sOmCrE= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/spec v0.19.8 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg= +github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0 h1:0Dn9qy1G9+UJfRU7TR8bmdGxb4uifB7HNrJjOnV0yPk= @@ -63,30 +81,74 @@ github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+Z github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA= github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= +github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM= +github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-openapi/swag v0.19.9 h1:1IxuqvBUU3S2Bi4YC7tlP9SJF1gVpCvqN0T2Qof4azE= +github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2 h1:ky5l57HjyVRrsJfd2+Ro5Z9PjGuKbsmftwyMtk8H7js= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.3 h1:PAH/2DylwWcIU1s0Y7k3yNmeAgWOcKrNE2Q7Ww/kCg4= github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= +github.com/go-openapi/validate v0.19.10 h1:tG3SZ5DC5KF4cyt7nqLVcQXGj5A7mpaYkAcNPlDK+Yk= +github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe h1:W/GaMY0y69G4cFlmsC6B9sbuo2fP8OFP1ABjt4kPz+w= @@ -95,11 +157,31 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8= +github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg= +github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -109,13 +191,23 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= +go.mongodb.org/mongo-driver v1.3.4 h1:zs/dKNwX0gYUtzwrN9lLiR15hCO0nDwQj5xXx+vjCdE= +go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -127,21 +219,50 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowK golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c h1:grhR+C34yXImVGp7EzNk+DTIk+323eIUWOmEevy6bDo= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/vendor/github.com/go-openapi/runtime/logger/logger.go b/vendor/github.com/go-openapi/runtime/logger/logger.go index d62c1f708f..6f4debcc14 100644 --- a/vendor/github.com/go-openapi/runtime/logger/logger.go +++ b/vendor/github.com/go-openapi/runtime/logger/logger.go @@ -8,5 +8,13 @@ type Logger interface { } func DebugEnabled() bool { - return os.Getenv("SWAGGER_DEBUG") != "" || os.Getenv("DEBUG") != "" + d := os.Getenv("SWAGGER_DEBUG") + if d != "" && d != "false" && d != "0" { + return true + } + d = os.Getenv("DEBUG") + if d != "" && d != "false" && d != "0" { + return true + } + return false } diff --git a/vendor/github.com/go-openapi/runtime/middleware/context.go b/vendor/github.com/go-openapi/runtime/middleware/context.go index 54a8c21f15..fba5748db5 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/context.go +++ b/vendor/github.com/go-openapi/runtime/middleware/context.go @@ -21,16 +21,16 @@ import ( "strings" "sync" - "github.com/go-openapi/runtime/security" - "github.com/go-openapi/analysis" "github.com/go-openapi/errors" "github.com/go-openapi/loads" + "github.com/go-openapi/spec" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/runtime" "github.com/go-openapi/runtime/logger" "github.com/go-openapi/runtime/middleware/untyped" - "github.com/go-openapi/spec" - "github.com/go-openapi/strfmt" + "github.com/go-openapi/runtime/security" ) // Debug when true turns on verbose logging @@ -280,8 +280,8 @@ func (c *Context) RequiredProduces() []string { // if the request is not valid an error will be returned func (c *Context) BindValidRequest(request *http.Request, route *MatchedRoute, binder RequestBinder) error { var res []error + var requestContentType string - requestContentType := "*/*" // check and validate content type, select consumer if runtime.HasBody(request) { ct, _, err := runtime.ContentType(request.Header) @@ -304,7 +304,13 @@ func (c *Context) BindValidRequest(request *http.Request, route *MatchedRoute, b } // check and validate the response format - if len(res) == 0 && runtime.HasBody(request) { + if len(res) == 0 { + // if the route does not provide Produces and a default contentType could not be identified + // based on a body, typical for GET and DELETE requests, then default contentType to. + if len(route.Produces) == 0 && requestContentType == "" { + requestContentType = "*/*" + } + if str := NegotiateContentType(request, route.Produces, requestContentType); str == "" { res = append(res, errors.InvalidResponseFormat(request.Header.Get(runtime.HeaderAccept), route.Produces)) } @@ -433,6 +439,8 @@ func (c *Context) Authorize(request *http.Request, route *MatchedRoute) (interfa } } + rCtx = request.Context() + rCtx = stdContext.WithValue(rCtx, ctxSecurityPrincipal, usr) rCtx = stdContext.WithValue(rCtx, ctxSecurityScopes, route.Authenticator.AllScopes()) return usr, request.WithContext(rCtx), nil @@ -559,6 +567,26 @@ func (c *Context) Respond(rw http.ResponseWriter, r *http.Request, produces []st c.api.ServeErrorFor(route.Operation.ID)(rw, r, errors.New(http.StatusInternalServerError, "can't produce response")) } +func (c *Context) APIHandlerSwaggerUI(builder Builder) http.Handler { + b := builder + if b == nil { + b = PassthroughBuilder + } + + var title string + sp := c.spec.Spec() + if sp != nil && sp.Info != nil && sp.Info.Title != "" { + title = sp.Info.Title + } + + swaggerUIOpts := SwaggerUIOpts{ + BasePath: c.BasePath(), + Title: title, + } + + return Spec("", c.spec.Raw(), SwaggerUI(swaggerUIOpts, c.RoutesHandler(b))) +} + // APIHandler returns a handler to serve the API, this includes a swagger spec, router and the contract defined in the swagger spec func (c *Context) APIHandler(builder Builder) http.Handler { b := builder diff --git a/vendor/github.com/go-openapi/runtime/middleware/denco/router.go b/vendor/github.com/go-openapi/runtime/middleware/denco/router.go index 73703fddec..ecacc31ff6 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/denco/router.go +++ b/vendor/github.com/go-openapi/runtime/middleware/denco/router.go @@ -17,6 +17,9 @@ const ( // TerminationCharacter is a special character for end of path. TerminationCharacter = '#' + // SeparatorCharacter separates path segments. + SeparatorCharacter = '/' + // MaxSize is max size of records and internal slice. MaxSize = (1 << 22) - 1 ) @@ -420,10 +423,11 @@ type record struct { // makeRecords returns the records that use to build Double-Arrays. func makeRecords(srcs []Record) (statics, params []*record) { - spChars := string([]byte{ParamCharacter, WildcardCharacter}) termChar := string(TerminationCharacter) + paramPrefix := string(SeparatorCharacter) + string(ParamCharacter) + wildcardPrefix := string(SeparatorCharacter) + string(WildcardCharacter) for _, r := range srcs { - if strings.ContainsAny(r.Key, spChars) { + if strings.Contains(r.Key, paramPrefix) || strings.Contains(r.Key, wildcardPrefix) { r.Key += termChar params = append(params, &record{Record: r}) } else { diff --git a/vendor/github.com/go-openapi/runtime/middleware/not_implemented.go b/vendor/github.com/go-openapi/runtime/middleware/not_implemented.go index 466f553db4..bc6942a0f1 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/not_implemented.go +++ b/vendor/github.com/go-openapi/runtime/middleware/not_implemented.go @@ -38,11 +38,30 @@ func (e *errorResp) WriteResponse(rw http.ResponseWriter, producer runtime.Produ rw.WriteHeader(http.StatusInternalServerError) } if err := producer.Produce(rw, e.response); err != nil { - panic(err) + Logger.Printf("failed to write error response: %v", err) } } // NotImplemented the error response when the response is not implemented func NotImplemented(message string) Responder { - return &errorResp{http.StatusNotImplemented, message, make(http.Header)} + return Error(http.StatusNotImplemented, message) +} + +// Error creates a generic responder for returning errors, the data will be serialized +// with the matching producer for the request +func Error(code int, data interface{}, headers ...http.Header) Responder { + var hdr http.Header + for _, h := range headers { + for k, v := range h { + if hdr == nil { + hdr = make(http.Header) + } + hdr[k] = v + } + } + return &errorResp{ + code: code, + response: data, + headers: hdr, + } } diff --git a/vendor/github.com/go-openapi/runtime/middleware/parameter.go b/vendor/github.com/go-openapi/runtime/middleware/parameter.go index 8975b6e1c8..8fa0cf4e46 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/parameter.go +++ b/vendor/github.com/go-openapi/runtime/middleware/parameter.go @@ -24,11 +24,12 @@ import ( "strconv" "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" "github.com/go-openapi/spec" "github.com/go-openapi/strfmt" "github.com/go-openapi/swag" "github.com/go-openapi/validate" + + "github.com/go-openapi/runtime" ) const defaultMaxMemory = 32 << 20 @@ -275,7 +276,7 @@ func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue in } if (!hasKey || (!p.parameter.AllowEmptyValue && data == "")) && p.parameter.Required && p.parameter.Default == nil { - return errors.Required(p.Name, p.parameter.In) + return errors.Required(p.Name, p.parameter.In, data) } ok, err := p.tryUnmarshaler(target, defaultValue, data) @@ -450,7 +451,7 @@ func (p *untypedParamBinder) readFormattedSliceFieldValue(data string, target re func (p *untypedParamBinder) setSliceFieldValue(target reflect.Value, defaultValue interface{}, data []string, hasKey bool) error { sz := len(data) if (!hasKey || (!p.parameter.AllowEmptyValue && (sz == 0 || (sz == 1 && data[0] == "")))) && p.parameter.Required && defaultValue == nil { - return errors.Required(p.Name, p.parameter.In) + return errors.Required(p.Name, p.parameter.In, data) } defVal := reflect.Zero(target.Type()) diff --git a/vendor/github.com/go-openapi/runtime/middleware/redoc.go b/vendor/github.com/go-openapi/runtime/middleware/redoc.go index 21277948c0..019c854295 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/redoc.go +++ b/vendor/github.com/go-openapi/runtime/middleware/redoc.go @@ -16,7 +16,7 @@ type RedocOpts struct { Path string // SpecURL the url to find the spec for SpecURL string - // RedocURL for the js that generates the redoc site, defaults to: https://rebilly.github.io/ReDoc/releases/latest/redoc.min.js + // RedocURL for the js that generates the redoc site, defaults to: https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js RedocURL string // Title for the documentation site, default to: API documentation Title string @@ -74,13 +74,15 @@ func Redoc(opts RedocOpts, next http.Handler) http.Handler { } const ( - redocLatest = "https://rebilly.github.io/ReDoc/releases/latest/redoc.min.js" + redocLatest = "https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js" redocTemplate = `<!DOCTYPE html> <html> <head> <title>{{ .Title }}</title> - <!-- needed for adaptive design --> - <meta name="viewport" content="width=device-width, initial-scale=1"> + <!-- needed for adaptive design --> + <meta charset="utf-8"/> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet"> <!-- ReDoc doesn't change outer page styles diff --git a/vendor/github.com/go-openapi/runtime/middleware/request.go b/vendor/github.com/go-openapi/runtime/middleware/request.go index ee725f587a..760c37861d 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/request.go +++ b/vendor/github.com/go-openapi/runtime/middleware/request.go @@ -19,26 +19,27 @@ import ( "reflect" "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" "github.com/go-openapi/spec" "github.com/go-openapi/strfmt" + + "github.com/go-openapi/runtime" ) -// RequestBinder binds and validates the data from a http request -type untypedRequestBinder struct { +// UntypedRequestBinder binds and validates the data from a http request +type UntypedRequestBinder struct { Spec *spec.Swagger Parameters map[string]spec.Parameter Formats strfmt.Registry paramBinders map[string]*untypedParamBinder } -// NewRequestBinder creates a new binder for reading a request. -func newUntypedRequestBinder(parameters map[string]spec.Parameter, spec *spec.Swagger, formats strfmt.Registry) *untypedRequestBinder { +// NewUntypedRequestBinder creates a new binder for reading a request. +func NewUntypedRequestBinder(parameters map[string]spec.Parameter, spec *spec.Swagger, formats strfmt.Registry) *UntypedRequestBinder { binders := make(map[string]*untypedParamBinder) for fieldName, param := range parameters { binders[fieldName] = newUntypedParamBinder(param, spec, formats) } - return &untypedRequestBinder{ + return &UntypedRequestBinder{ Parameters: parameters, paramBinders: binders, Spec: spec, @@ -47,7 +48,7 @@ func newUntypedRequestBinder(parameters map[string]spec.Parameter, spec *spec.Sw } // Bind perform the databinding and validation -func (o *untypedRequestBinder) Bind(request *http.Request, routeParams RouteParams, consumer runtime.Consumer, data interface{}) error { +func (o *UntypedRequestBinder) Bind(request *http.Request, routeParams RouteParams, consumer runtime.Consumer, data interface{}) error { val := reflect.Indirect(reflect.ValueOf(data)) isMap := val.Kind() == reflect.Map var result []error @@ -71,7 +72,6 @@ func (o *untypedRequestBinder) Bind(request *http.Request, routeParams RoutePara } } target = reflect.Indirect(reflect.New(tpe)) - } if !target.IsValid() { diff --git a/vendor/github.com/go-openapi/runtime/middleware/router.go b/vendor/github.com/go-openapi/runtime/middleware/router.go index 539d8471a8..02768bade2 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/router.go +++ b/vendor/github.com/go-openapi/runtime/middleware/router.go @@ -26,10 +26,11 @@ import ( "github.com/go-openapi/analysis" "github.com/go-openapi/errors" "github.com/go-openapi/loads" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware/denco" "github.com/go-openapi/spec" "github.com/go-openapi/strfmt" + + "github.com/go-openapi/runtime" + "github.com/go-openapi/runtime/middleware/denco" ) // RouteParam is a object to capture route params in a framework agnostic way. @@ -290,7 +291,7 @@ type routeEntry struct { Parameters map[string]spec.Parameter Handler http.Handler Formats strfmt.Registry - Binder *untypedRequestBinder + Binder *UntypedRequestBinder Authenticators RouteAuthenticators Authorizer runtime.Authorizer } @@ -428,7 +429,7 @@ func (d *defaultRouteBuilder) AddRoute(method, path string, operation *spec.Oper Producers: d.api.ProducersFor(normalizeOffers(produces)), Parameters: parameters, Formats: d.api.Formats(), - Binder: newUntypedRequestBinder(parameters, d.spec.Spec(), d.api.Formats()), + Binder: NewUntypedRequestBinder(parameters, d.spec.Spec(), d.api.Formats()), Authenticators: d.buildAuthenticators(operation), Authorizer: d.api.Authorizer(), }) diff --git a/vendor/github.com/go-openapi/runtime/middleware/swaggerui.go b/vendor/github.com/go-openapi/runtime/middleware/swaggerui.go new file mode 100644 index 0000000000..2c92f5c91f --- /dev/null +++ b/vendor/github.com/go-openapi/runtime/middleware/swaggerui.go @@ -0,0 +1,162 @@ +package middleware + +import ( + "bytes" + "fmt" + "html/template" + "net/http" + "path" +) + +// SwaggerUIOpts configures the Swaggerui middlewares +type SwaggerUIOpts struct { + // BasePath for the UI path, defaults to: / + BasePath string + // Path combines with BasePath for the full UI path, defaults to: docs + Path string + // SpecURL the url to find the spec for + SpecURL string + + // The three components needed to embed swagger-ui + SwaggerURL string + SwaggerPresetURL string + SwaggerStylesURL string + + Favicon32 string + Favicon16 string + + // Title for the documentation site, default to: API documentation + Title string +} + +// EnsureDefaults in case some options are missing +func (r *SwaggerUIOpts) EnsureDefaults() { + if r.BasePath == "" { + r.BasePath = "/" + } + if r.Path == "" { + r.Path = "docs" + } + if r.SpecURL == "" { + r.SpecURL = "/swagger.json" + } + if r.SwaggerURL == "" { + r.SwaggerURL = swaggerLatest + } + if r.SwaggerPresetURL == "" { + r.SwaggerPresetURL = swaggerPresetLatest + } + if r.SwaggerStylesURL == "" { + r.SwaggerStylesURL = swaggerStylesLatest + } + if r.Favicon16 == "" { + r.Favicon16 = swaggerFavicon16Latest + } + if r.Favicon32 == "" { + r.Favicon32 = swaggerFavicon32Latest + } + if r.Title == "" { + r.Title = "API documentation" + } +} + +// SwaggerUI creates a middleware to serve a documentation site for a swagger spec. +// This allows for altering the spec before starting the http listener. +func SwaggerUI(opts SwaggerUIOpts, next http.Handler) http.Handler { + opts.EnsureDefaults() + + pth := path.Join(opts.BasePath, opts.Path) + tmpl := template.Must(template.New("swaggerui").Parse(swaggeruiTemplate)) + + buf := bytes.NewBuffer(nil) + _ = tmpl.Execute(buf, &opts) + b := buf.Bytes() + + return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + if r.URL.Path == pth { + rw.Header().Set("Content-Type", "text/html; charset=utf-8") + rw.WriteHeader(http.StatusOK) + + _, _ = rw.Write(b) + return + } + + if next == nil { + rw.Header().Set("Content-Type", "text/plain") + rw.WriteHeader(http.StatusNotFound) + _, _ = rw.Write([]byte(fmt.Sprintf("%q not found", pth))) + return + } + next.ServeHTTP(rw, r) + }) +} + +const ( + swaggerLatest = "https://unpkg.com/swagger-ui-dist/swagger-ui-bundle.js" + swaggerPresetLatest = "https://unpkg.com/swagger-ui-dist/swagger-ui-standalone-preset.js" + swaggerStylesLatest = "https://unpkg.com/swagger-ui-dist/swagger-ui.css" + swaggerFavicon32Latest = "https://unpkg.com/swagger-ui-dist/favicon-32x32.png" + swaggerFavicon16Latest = "https://unpkg.com/swagger-ui-dist/favicon-16x16.png" + swaggeruiTemplate = ` +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8"> + <title>{{ .Title }}</title> + + <link rel="stylesheet" type="text/css" href="{{ .SwaggerStylesURL }}" > + <link rel="icon" type="image/png" href="{{ .Favicon32 }}" sizes="32x32" /> + <link rel="icon" type="image/png" href="{{ .Favicon16 }}" sizes="16x16" /> + <style> + html + { + box-sizing: border-box; + overflow: -moz-scrollbars-vertical; + overflow-y: scroll; + } + + *, + *:before, + *:after + { + box-sizing: inherit; + } + + body + { + margin:0; + background: #fafafa; + } + </style> + </head> + + <body> + <div id="swagger-ui"></div> + + <script src="{{ .SwaggerURL }}"> </script> + <script src="{{ .SwaggerPresetURL }}"> </script> + <script> + window.onload = function() { + // Begin Swagger UI call region + const ui = SwaggerUIBundle({ + url: '{{ .SpecURL }}', + dom_id: '#swagger-ui', + deepLinking: true, + presets: [ + SwaggerUIBundle.presets.apis, + SwaggerUIStandalonePreset + ], + plugins: [ + SwaggerUIBundle.plugins.DownloadUrl + ], + layout: "StandaloneLayout" + }) + // End Swagger UI call region + + window.ui = ui + } + </script> + </body> +</html> +` +) diff --git a/vendor/github.com/go-openapi/runtime/middleware/untyped/api.go b/vendor/github.com/go-openapi/runtime/middleware/untyped/api.go index 8226b1ed1c..39a85f7d9e 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/untyped/api.go +++ b/vendor/github.com/go-openapi/runtime/middleware/untyped/api.go @@ -23,9 +23,10 @@ import ( "github.com/go-openapi/analysis" "github.com/go-openapi/errors" "github.com/go-openapi/loads" - "github.com/go-openapi/runtime" "github.com/go-openapi/spec" "github.com/go-openapi/strfmt" + + "github.com/go-openapi/runtime" ) // NewAPI creates the default untyped API @@ -244,7 +245,6 @@ func (d *API) validate() error { } func (d *API) verify(name string, registrations []string, expectations []string) error { - sort.Strings(registrations) sort.Strings(expectations) diff --git a/vendor/github.com/go-openapi/runtime/middleware/validation.go b/vendor/github.com/go-openapi/runtime/middleware/validation.go index bb8df3cb3d..1f0135b578 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/validation.go +++ b/vendor/github.com/go-openapi/runtime/middleware/validation.go @@ -20,8 +20,9 @@ import ( "strings" "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" "github.com/go-openapi/swag" + + "github.com/go-openapi/runtime" ) type validation struct { @@ -115,7 +116,10 @@ func (v *validation) contentType() { } func (v *validation) responseFormat() { - if str, rCtx := v.context.ResponseFormat(v.request, v.route.Produces); str == "" && runtime.HasBody(v.request) { + // if the route provides values for Produces and no format could be identify then return an error. + // if the route does not specify values for Produces then treat request as valid since the API designer + // choose not to specify the format for responses. + if str, rCtx := v.context.ResponseFormat(v.request, v.route.Produces); str == "" && len(v.route.Produces) > 0 { v.request = rCtx v.result = append(v.result, errors.InvalidResponseFormat(v.request.Header.Get(runtime.HeaderAccept), v.route.Produces)) } diff --git a/vendor/github.com/go-openapi/runtime/security/authenticator.go b/vendor/github.com/go-openapi/runtime/security/authenticator.go index 5d058b8d1f..476d26c3e7 100644 --- a/vendor/github.com/go-openapi/runtime/security/authenticator.go +++ b/vendor/github.com/go-openapi/runtime/security/authenticator.go @@ -20,6 +20,7 @@ import ( "strings" "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" ) diff --git a/vendor/github.com/go-openapi/spec/.golangci.yml b/vendor/github.com/go-openapi/spec/.golangci.yml index 3e33f9f2e3..4e17ed4979 100644 --- a/vendor/github.com/go-openapi/spec/.golangci.yml +++ b/vendor/github.com/go-openapi/spec/.golangci.yml @@ -21,3 +21,8 @@ linters: - lll - gochecknoinits - gochecknoglobals + - funlen + - godox + - gocognit + - whitespace + - wsl diff --git a/vendor/github.com/go-openapi/spec/.travis.yml b/vendor/github.com/go-openapi/spec/.travis.yml index aa26d8763a..f1a3f80b35 100644 --- a/vendor/github.com/go-openapi/spec/.travis.yml +++ b/vendor/github.com/go-openapi/spec/.travis.yml @@ -1,12 +1,10 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.11.x -- 1.12.x +- 1.13.x +- 1.14.x install: - GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on language: go notifications: slack: diff --git a/vendor/github.com/go-openapi/spec/bindata.go b/vendor/github.com/go-openapi/spec/bindata.go index c67e2d877b..66b1f32635 100644 --- a/vendor/github.com/go-openapi/spec/bindata.go +++ b/vendor/github.com/go-openapi/spec/bindata.go @@ -1,7 +1,7 @@ // Code generated by go-bindata. DO NOT EDIT. // sources: // schemas/jsonschema-draft-04.json (4.357kB) -// schemas/v2/schema.json (40.249kB) +// schemas/v2/schema.json (40.248kB) package spec @@ -70,43 +70,43 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _jsonschemaDraft04JSON = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x57\x3d\x6f\xdb\x3c\x10\xde\xf3\x2b\x08\x26\x63\xf2\x2a\x2f\xd0\xc9\x5b\xd1\x2e\x01\x5a\x34\x43\x37\x23\x03\x6d\x9d\x6c\x06\x14\xa9\x50\x54\x60\xc3\xd0\x7f\x2f\x28\x4a\x14\x29\x91\x92\x2d\xa7\x8d\x97\x28\xbc\xaf\xe7\x8e\xf7\xc5\xd3\x0d\x42\x08\x61\x9a\xe2\x15\xc2\x7b\xa5\x8a\x55\x92\xbc\x96\x82\x3f\x94\xdb\x3d\xe4\xe4\x3f\x21\x77\x49\x2a\x49\xa6\x1e\x1e\xbf\x24\xe6\xec\x16\xdf\x1b\xa1\x3b\xf3\xff\x02\xc9\x14\xca\xad\xa4\x85\xa2\x82\x6b\xe9\x6f\x42\x02\x32\x2c\x28\x07\x45\x5a\x15\x3d\x77\x46\x39\xd5\xcc\x25\x5e\x21\x83\xb8\x21\x18\xb6\xaf\x52\x92\xa3\x47\x68\x88\xea\x58\x80\x56\x4e\x1a\xf2\xbd\x4f\xcc\x29\x7f\x52\x90\x6b\x7d\xff\x0f\x48\xb4\x3d\x3f\x21\x7c\x27\x21\xd3\x2a\x6e\x31\xaa\x2d\x53\xdd\xf3\xe3\x42\x94\x54\xd1\x77\x78\xe2\x0a\x76\x20\xe3\x20\x68\xcb\x30\x86\x41\xf3\x2a\xc7\x2b\xf4\x78\x8e\xfe\xef\x90\x91\x8a\xa9\xc7\xb1\x1d\xc2\xd8\x2f\x0d\x75\xed\xc1\x4e\x9c\xc8\x25\x43\xac\xa8\xbe\xd7\xcc\xa9\xd1\xa9\x21\xa0\x1a\xbd\x04\x61\x94\x34\x2f\x18\xfc\x3e\x16\x50\x8e\x4d\x03\x6f\x1c\x58\xdb\x48\x23\xbc\x11\x82\x01\xe1\xfa\xd3\x3a\x8e\x30\xaf\x18\x33\x7f\xf3\x8d\x39\x11\x9b\x57\xd8\x2a\xfd\x55\x2a\x49\xf9\x0e\xc7\xec\x37\xd4\x25\xf7\xec\x5c\x66\xc7\xd7\x99\xaa\xcf\x4f\x89\x8a\xd3\xb7\x0a\x3a\xaa\x92\x15\xf4\x30\x6f\x1c\xb0\xd6\x46\xe7\x98\x39\x2d\xa4\x28\x40\x2a\x3a\x88\x9e\x29\xba\x88\x37\x2d\xca\x60\x38\xfa\xba\x5b\x20\xac\xa8\x62\xb0\x4c\xd4\xaf\xda\x45\x0a\xba\x5c\x3b\xb9\xc7\x79\xc5\x14\x2d\x18\x34\x19\x1c\x51\xdb\x25\x4d\xb4\x7e\x06\x14\x38\x6c\x59\x55\xd2\x77\xf8\x69\x59\xfc\x7b\x73\xed\x93\x43\xcb\x32\x6d\x3c\x28\xdc\x1b\x9a\xd3\x62\xab\xc2\x27\xf7\x41\xc9\x08\x2b\x23\x08\xad\x13\x57\x21\x9c\xd3\x72\x0d\x42\x72\xf8\x01\x7c\xa7\xf6\x83\xce\x39\xd7\x82\x3c\x1f\x2f\xd6\x60\x1b\xa2\xdf\x35\x89\x52\x20\xe7\x73\x74\xe0\x66\x26\x64\x4e\xb4\x97\x58\xc2\x0e\x0e\xe1\x60\x92\x34\x6d\xa0\x10\xd6\xb5\x83\x61\x27\xe6\x47\xd3\x89\xbd\x63\xfd\x3b\x8d\x03\x3d\x6c\x42\x2d\x5b\x70\xee\xe8\xdf\x4b\xf4\x66\x4e\xe1\x01\x45\x17\x80\x74\xad\x4f\xc3\xf3\xae\xc6\x1d\xc6\xd7\xc2\xce\xc9\xe1\x29\x30\x86\x2f\x4a\xa6\x4b\x15\x84\x73\xc9\x6f\xfd\x7f\xa5\x6e\x9e\xbd\xf1\xb0\xd4\xdd\x45\x5a\xc2\x3e\x4b\x78\xab\xa8\x84\x74\x4a\x91\x3b\x92\x23\x05\xf2\x1c\x1e\x7b\xf3\x09\xf8\xcf\xab\x24\xb6\x60\xa2\xe8\x4c\x9f\x75\x77\xaa\x8c\xe6\x01\x45\x36\x86\xcf\xc3\x63\x3a\xea\xd4\x8d\x7e\x06\xac\x14\x0a\xe0\x29\xf0\xed\x07\x22\x1a\x65\xda\x44\xae\xa2\x73\x1a\xe6\x90\x69\xa2\x8c\x46\xb2\x2f\xde\x49\x38\x08\xed\xfe\xfd\x41\xaf\x9f\xa9\x55\xd7\xdd\x22\x8d\xfa\x45\x63\xc5\x0f\x80\xf3\xb4\x08\xd6\x79\x30\x9e\x93\xee\x59\xa6\xd0\x4b\xee\x22\xe3\x33\xc1\x3a\x27\x68\x36\x78\x7e\x87\x0a\x06\xd5\x2e\x20\xd3\xaf\x15\xfb\xd8\x3b\x73\x14\xbb\x92\xed\x05\x5d\x2e\x29\x38\x2c\x94\xe4\x42\x45\x5e\xd3\xb5\x7d\xdf\x47\xca\x38\xb4\x5c\xaf\xfb\x7d\xdd\x6d\xf4\xa1\x2d\x77\xdd\x2f\xce\x6d\xc4\x7b\x8b\x4e\x67\xa9\x6f\xfe\x04\x00\x00\xff\xff\xb1\xd1\x27\x78\x05\x11\x00\x00") +var _jsonschemaDraft04Json = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x57\x3d\x6f\xdb\x3c\x10\xde\xf3\x2b\x08\x26\x63\xf2\x2a\x2f\xd0\xc9\x5b\xd1\x2e\x01\x5a\x34\x43\x37\x23\x03\x6d\x9d\x6c\x06\x14\xa9\x50\x54\x60\xc3\xd0\x7f\x2f\x28\x4a\x14\x29\x91\x92\x2d\xa7\x8d\x97\x28\xbc\xaf\xe7\x8e\xf7\xc5\xd3\x0d\x42\x08\x61\x9a\xe2\x15\xc2\x7b\xa5\x8a\x55\x92\xbc\x96\x82\x3f\x94\xdb\x3d\xe4\xe4\x3f\x21\x77\x49\x2a\x49\xa6\x1e\x1e\xbf\x24\xe6\xec\x16\xdf\x1b\xa1\x3b\xf3\xff\x02\xc9\x14\xca\xad\xa4\x85\xa2\x82\x6b\xe9\x6f\x42\x02\x32\x2c\x28\x07\x45\x5a\x15\x3d\x77\x46\x39\xd5\xcc\x25\x5e\x21\x83\xb8\x21\x18\xb6\xaf\x52\x92\xa3\x47\x68\x88\xea\x58\x80\x56\x4e\x1a\xf2\xbd\x4f\xcc\x29\x7f\x52\x90\x6b\x7d\xff\x0f\x48\xb4\x3d\x3f\x21\x7c\x27\x21\xd3\x2a\x6e\x31\xaa\x2d\x53\xdd\xf3\xe3\x42\x94\x54\xd1\x77\x78\xe2\x0a\x76\x20\xe3\x20\x68\xcb\x30\x86\x41\xf3\x2a\xc7\x2b\xf4\x78\x8e\xfe\xef\x90\x91\x8a\xa9\xc7\xb1\x1d\xc2\xd8\x2f\x0d\x75\xed\xc1\x4e\x9c\xc8\x25\x43\xac\xa8\xbe\xd7\xcc\xa9\xd1\xa9\x21\xa0\x1a\xbd\x04\x61\x94\x34\x2f\x18\xfc\x3e\x16\x50\x8e\x4d\x03\x6f\x1c\x58\xdb\x48\x23\xbc\x11\x82\x01\xe1\xfa\xd3\x3a\x8e\x30\xaf\x18\x33\x7f\xf3\x8d\x39\x11\x9b\x57\xd8\x2a\xfd\x55\x2a\x49\xf9\x0e\xc7\xec\x37\xd4\x25\xf7\xec\x5c\x66\xc7\xd7\x99\xaa\xcf\x4f\x89\x8a\xd3\xb7\x0a\x3a\xaa\x92\x15\xf4\x30\x6f\x1c\xb0\xd6\x46\xe7\x98\x39\x2d\xa4\x28\x40\x2a\x3a\x88\x9e\x29\xba\x88\x37\x2d\xca\x60\x38\xfa\xba\x5b\x20\xac\xa8\x62\xb0\x4c\xd4\xaf\xda\x45\x0a\xba\x5c\x3b\xb9\xc7\x79\xc5\x14\x2d\x18\x34\x19\x1c\x51\xdb\x25\x4d\xb4\x7e\x06\x14\x38\x6c\x59\x55\xd2\x77\xf8\x69\x59\xfc\x7b\x73\xed\x93\x43\xcb\x32\x6d\x3c\x28\xdc\x1b\x9a\xd3\x62\xab\xc2\x27\xf7\x41\xc9\x08\x2b\x23\x08\xad\x13\x57\x21\x9c\xd3\x72\x0d\x42\x72\xf8\x01\x7c\xa7\xf6\x83\xce\x39\xd7\x82\x3c\x1f\x2f\xd6\x60\x1b\xa2\xdf\x35\x89\x52\x20\xe7\x73\x74\xe0\x66\x26\x64\x4e\xb4\x97\x58\xc2\x0e\x0e\xe1\x60\x92\x34\x6d\xa0\x10\xd6\xb5\x83\x61\x27\xe6\x47\xd3\x89\xbd\x63\xfd\x3b\x8d\x03\x3d\x6c\x42\x2d\x5b\x70\xee\xe8\xdf\x4b\xf4\x66\x4e\xe1\x01\x45\x17\x80\x74\xad\x4f\xc3\xf3\xae\xc6\x1d\xc6\xd7\xc2\xce\xc9\xe1\x29\x30\x86\x2f\x4a\xa6\x4b\x15\x84\x73\xc9\x6f\xfd\x7f\xa5\x6e\x9e\xbd\xf1\xb0\xd4\xdd\x45\x5a\xc2\x3e\x4b\x78\xab\xa8\x84\x74\x4a\x91\x3b\x92\x23\x05\xf2\x1c\x1e\x7b\xf3\x09\xf8\xcf\xab\x24\xb6\x60\xa2\xe8\x4c\x9f\x75\x77\xaa\x8c\xe6\x01\x45\x36\x86\xcf\xc3\x63\x3a\xea\xd4\x8d\x7e\x06\xac\x14\x0a\xe0\x29\xf0\xed\x07\x22\x1a\x65\xda\x44\xae\xa2\x73\x1a\xe6\x90\x69\xa2\x8c\x46\xb2\x2f\xde\x49\x38\x08\xed\xfe\xfd\x41\xaf\x9f\xa9\x55\xd7\xdd\x22\x8d\xfa\x45\x63\xc5\x0f\x80\xf3\xb4\x08\xd6\x79\x30\x9e\x93\xee\x59\xa6\xd0\x4b\xee\x22\xe3\x33\xc1\x3a\x27\x68\x36\x78\x7e\x87\x0a\x06\xd5\x2e\x20\xd3\xaf\x15\xfb\xd8\x3b\x73\x14\xbb\x92\xed\x05\x5d\x2e\x29\x38\x2c\x94\xe4\x42\x45\x5e\xd3\xb5\x7d\xdf\x47\xca\x38\xb4\x5c\xaf\xfb\x7d\xdd\x6d\xf4\xa1\x2d\x77\xdd\x2f\xce\x6d\xc4\x7b\x8b\x4e\x67\xa9\x6f\xfe\x04\x00\x00\xff\xff\xb1\xd1\x27\x78\x05\x11\x00\x00") -func jsonschemaDraft04JSONBytes() ([]byte, error) { +func jsonschemaDraft04JsonBytes() ([]byte, error) { return bindataRead( - _jsonschemaDraft04JSON, + _jsonschemaDraft04Json, "jsonschema-draft-04.json", ) } -func jsonschemaDraft04JSON() (*asset, error) { - bytes, err := jsonschemaDraft04JSONBytes() +func jsonschemaDraft04Json() (*asset, error) { + bytes, err := jsonschemaDraft04JsonBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "jsonschema-draft-04.json", size: 4357, mode: os.FileMode(0644), modTime: time.Unix(1567900649, 0)} + info := bindataFileInfo{name: "jsonschema-draft-04.json", size: 4357, mode: os.FileMode(0640), modTime: time.Unix(1568963823, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe1, 0x48, 0x9d, 0xb, 0x47, 0x55, 0xf0, 0x27, 0x93, 0x30, 0x25, 0x91, 0xd3, 0xfc, 0xb8, 0xf0, 0x7b, 0x68, 0x93, 0xa8, 0x2a, 0x94, 0xf2, 0x48, 0x95, 0xf8, 0xe4, 0xed, 0xf1, 0x1b, 0x82, 0xe2}} return a, nil } -var _v2SchemaJSON = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5d\x4f\x93\xdb\x36\xb2\xbf\xfb\x53\xa0\x14\x57\xd9\xae\xd8\x92\xe3\xf7\x2e\xcf\x97\xd4\xbc\xd8\x49\x66\x37\x5e\x4f\x79\x26\xbb\x87\x78\x5c\x05\x91\x2d\x09\x09\x09\x30\x00\x38\x33\x5a\xef\x7c\xf7\x2d\xf0\x9f\x08\x02\x20\x41\x8a\xd2\xc8\x0e\x0f\xa9\x78\x28\xa0\xd1\xdd\x68\x34\x7e\xdd\xf8\xf7\xf9\x11\x42\x33\x49\x64\x04\xb3\xd7\x68\x76\x86\xfe\x76\xf9\xfe\x1f\xe8\x32\xd8\x40\x8c\xd1\x8a\x71\x74\x79\x8b\xd7\x6b\xe0\xe8\xd5\xfc\x25\x3a\xbb\x38\x9f\xcf\x9e\xab\x0a\x24\x54\xa5\x37\x52\x26\xaf\x17\x0b\x91\x17\x99\x13\xb6\xb8\x79\xb5\x10\x59\xdd\xf9\xef\x82\xd1\x6f\xf2\xc2\x8f\xf3\x4f\xb5\x1a\xea\xc7\x17\x45\x41\xc6\xd7\x8b\x90\xe3\x95\x7c\xf1\xf2\x7f\x8b\xca\x45\x3d\xb9\x4d\x32\xa6\xd8\xf2\x77\x08\x64\xfe\x8d\xc3\x9f\x29\xe1\xa0\x9a\xff\xed\x11\x42\x08\xcd\x8a\xd6\xb3\x9f\x15\x67\x74\xc5\xca\x7f\x27\x58\x6e\xc4\xec\x11\x42\xd7\x59\x5d\x1c\x86\x44\x12\x46\x71\x74\xc1\x59\x02\x5c\x12\x10\xb3\xd7\x68\x85\x23\x01\x59\x81\x04\x4b\x09\x9c\x6a\xbf\x7e\xce\x49\x7d\xba\x7b\x51\xfd\xa1\x44\xe2\xb0\x52\xac\x7d\xb3\x08\x61\x45\x68\x46\x56\x2c\x6e\x80\x86\x8c\xbf\xbd\x93\x40\x05\x61\x74\x96\x95\xbe\x7f\x84\xd0\x7d\x4e\xde\x42\xb7\xe4\xbe\x46\xbb\x14\x5b\x48\x4e\xe8\xba\x90\x05\xa1\x19\xd0\x34\xae\xc4\xce\xbe\xbc\x9a\xbf\x9c\x15\x7f\x5d\x57\xc5\x42\x10\x01\x27\x89\xe2\x48\x51\xb9\xda\x40\xd5\x87\x37\xc0\x15\x5f\x88\xad\x90\xdc\x10\x81\x42\x16\xa4\x31\x50\x39\x2f\x38\xad\xab\xb0\x53\xd8\xac\x94\x56\x6f\xc3\x84\xf4\x11\xa4\x50\xb3\xfa\xe9\xd3\x6f\x9f\x3e\xdf\x2f\xd0\xeb\x8f\x1f\x3f\x7e\xbc\xfe\xf6\xe9\xf7\xaf\x5f\x7f\xfc\x18\x7e\xfb\xec\xfb\xc7\xb3\x36\x79\x54\x43\xe8\x29\xc5\x31\x20\xc6\x11\x49\x9e\xe5\x12\x41\x66\xa0\xe8\xed\x1d\x8e\x93\x08\x5e\xa3\x27\x3b\xc3\x7c\xa2\x73\xba\xc4\x02\x2e\xb0\xdc\xf4\xe5\x76\xd1\xca\x96\xa2\x8a\x94\xcd\x21\xc9\x6c\xec\x2c\x70\x42\x9e\x34\x74\x9d\x19\x7c\xcd\x20\x9c\xea\x2e\x0a\xfe\x42\x84\xd4\x29\x04\x8c\x8a\xb4\x41\xa2\xc1\xdc\x19\x8a\x88\x90\x4a\x49\xef\xce\xdf\xbd\x45\x4a\x52\x81\x70\x10\x40\x22\x21\x44\xcb\x6d\xc5\xec\x4e\x3c\x1c\x45\xef\x57\x9a\xb5\x7d\xae\xfe\xe5\xe4\x31\x86\x90\xe0\xab\x6d\x02\x3b\x2e\xcb\x11\x90\xd9\xa8\xc6\x77\xc2\x59\x98\x06\xfd\xf9\x2e\x78\x45\x01\xa6\xa8\xa0\x71\x5c\xbe\x33\xa7\xd2\xd9\x5f\x95\xef\xd9\xd5\xac\xfd\xdc\x5d\xbf\x5e\xb8\xd1\x3e\xc7\x31\x48\xe0\x5e\x4c\x14\x65\xdf\xb8\xa8\x71\x10\x09\xa3\xc2\xc7\x02\xcb\xa2\x4e\x5a\x02\x82\x94\x13\xb9\xf5\x30\xe6\xb2\xa4\xb5\xfe\x9b\x3e\x7a\xb2\x55\xd2\xa8\x4a\xbc\x16\xb6\x71\x8e\x39\xc7\xdb\x9d\xe1\x10\x09\x71\xbd\x9c\xb3\x41\x89\xd7\xa5\x89\xdc\x57\xb5\x53\x4a\xfe\x4c\xe1\xbc\xa0\x21\x79\x0a\x1a\x0f\x70\xa7\x5c\x08\x8e\xde\xb0\xc0\x43\x24\xad\x74\x63\x0e\xb1\xd9\x90\xe1\xb0\x2d\x13\xa7\x6d\x78\xfd\x04\x14\x38\x8e\x90\xaa\xce\x63\xac\x3e\x23\xbc\x64\xa9\xb4\xf8\x03\x63\xde\xcd\xbe\x16\x13\x4a\x55\xac\x82\x12\xc6\xac\xd4\x35\xf7\x22\xd4\x3a\xff\x22\x73\x0e\x6e\x51\xa0\x75\x1e\xae\x8f\xe8\x5d\xc7\x59\xe6\xe4\x9a\x18\x8d\xd6\x1c\x53\x84\x4d\xb7\x67\x28\x37\x09\x84\x69\x88\x12\x0e\x01\x11\x80\x32\xa2\xf5\xb9\xaa\xc6\xd9\x73\x53\xab\xfb\xb4\x2e\x20\xc6\x54\x92\xa0\x9a\xf3\x69\x1a\x2f\x81\x77\x37\xae\x53\x1a\xce\x40\xc4\xa8\x82\x1c\xb5\xef\xda\x24\x7d\xb9\x61\x69\x14\xa2\x25\xa0\x90\xac\x56\xc0\x81\x4a\xb4\xe2\x2c\xce\x4a\x64\x7a\x9a\x23\xf4\x13\x91\x3f\xa7\x4b\xf4\x63\x84\x6f\x18\x87\x10\xbd\xc3\xfc\x8f\x90\xdd\x52\x44\x04\xc2\x51\xc4\x6e\x21\x74\x48\x21\x81\xc7\xe2\xfd\xea\x12\xf8\x0d\x09\xf6\xe9\x47\x35\xaf\x67\xc4\x14\xf7\x22\x27\x97\xe1\xe2\x76\x2d\x06\x8c\x4a\x1c\x48\x3f\x73\x2d\x0b\x5b\x29\x45\x24\x00\x2a\x0c\x11\xec\x94\xca\xc2\xa6\xc1\x37\x21\x43\x83\x3b\x5f\x97\xf1\x43\x5e\x53\x73\x19\xa5\x36\xd8\x2d\x05\x2e\x34\x0b\xeb\x39\xfc\x1d\x63\x51\x01\xbd\x3d\xbb\x90\x84\x40\x25\x59\x6d\x09\x5d\xa3\x1c\x37\xe6\x5c\x16\x9a\x40\x09\x70\xc1\xe8\x82\xf1\x35\xa6\xe4\xdf\x99\x5c\x8e\x9e\x4d\x79\xb4\x27\x2f\xbf\x7e\xf8\x05\x25\x8c\x50\xa9\x98\x29\x90\x62\x60\xea\x75\xae\x13\xca\xbf\x2b\x1a\x29\x27\x76\xd6\x20\xc6\x64\x5f\xe6\x32\x1a\x08\x87\x21\x07\x21\xbc\xb4\xe4\xe0\x32\x67\xa6\xcd\xf3\x1e\xcd\xd9\x6b\xb6\x6f\x8e\x27\xa7\xed\xdb\xe7\xbc\xcc\x1a\x07\xce\x6f\x87\x33\xf0\xba\x51\x17\x22\x66\x78\x79\x8e\xce\xe5\x13\x81\x80\x06\x2c\xe5\x78\x0d\xa1\xb2\xb8\x54\xa8\x79\x09\xbd\xbf\x3c\x47\x01\x8b\x13\x2c\xc9\x32\xaa\xaa\x1d\xd5\xee\xab\x36\xbd\x6c\xfd\x54\x6c\xc8\x08\x01\x3c\xbd\xe7\x07\x88\xb0\x24\x37\x79\x90\x28\x4a\x1d\x10\x1a\x92\x1b\x12\xa6\x38\x42\x40\xc3\x4c\x43\x62\x8e\xae\x36\xb0\x45\x71\x2a\xa4\x9a\x23\x79\x59\xb1\xa8\xf2\xa4\x0c\x60\x9f\xcc\x8d\x40\xf5\x80\xca\xa8\x99\xc3\xa7\x85\x1f\x31\x25\xa9\x82\xc5\x6d\xbd\xd8\x36\x76\x7c\x02\x28\x97\xf6\x1d\x74\x3b\x11\x7e\x91\xae\x32\xf8\x6c\xf4\xe6\x7b\x9a\xa5\x1f\x62\xc6\x21\xcf\x9a\xe5\xed\x8b\x02\xf3\x2c\x33\x33\xdf\x00\xca\xc9\x09\xb4\x04\xf5\xa5\x08\xd7\xc3\x02\x18\x66\xf1\xab\x1e\x83\x37\x4c\xcd\x12\xc1\x1d\x50\xf6\xaa\xbd\xfe\xe2\x73\x48\x38\x08\xa0\x32\x9b\x18\x44\x86\x0b\x6a\xc1\xaa\x26\x96\x2d\x96\x3c\xa0\x54\x65\x73\x87\x15\xca\x15\xe5\xf5\x94\x46\x9f\x33\x1a\x0c\x9a\xb1\x5a\xd9\x6a\x95\xcd\xcb\x7e\xec\x9a\xc5\x94\x3b\x37\x26\x31\xd7\xfc\xe4\x1f\x13\x8c\x31\x75\x9c\xba\xf7\x87\x3c\xa1\xb7\x4f\x17\x1b\x09\x82\x98\xc4\x70\x95\xd3\xe8\x4c\x48\x5a\xa6\xd6\x2a\x3d\x56\x42\x80\x9f\xaf\xae\x2e\x50\x0c\x42\xe0\x35\x34\x3c\x8a\x62\x03\x37\xba\xb2\x27\x04\xda\x25\x8d\x06\xe2\xa0\x13\x8a\xf3\xf5\xec\x10\x72\x67\x88\x90\x3d\x4b\x64\xeb\xaa\xda\x8f\xf7\x5a\x75\x47\x9a\xa8\x51\x70\x26\xd2\x38\xc6\x7c\xbb\x57\xfc\xbd\xe4\x04\x56\xa8\xa0\x54\x9a\x45\xd5\xf7\x0f\x16\xfc\x57\x1c\x3c\xdf\x23\xba\x77\x38\xda\x16\x4b\x31\x53\x6a\x4d\x9a\x15\x63\xe7\xe1\x18\x69\x9f\x22\xe0\x24\xbb\x94\x4b\x97\xee\x2d\xf9\x70\x87\x72\x7b\xe6\xc4\x33\x2a\x66\x5e\x1c\x35\x72\xe3\x2d\xda\x73\xe4\xc7\x51\x6d\xa4\xa1\x2a\x4f\xde\x94\xcb\xb2\x3e\x31\x48\xae\x82\xce\xc9\xc8\x65\xcd\xc3\xb7\x34\xb6\x2b\xdf\x58\x65\x78\x6e\x73\xac\x5e\x24\x0d\x3f\xdc\x70\x23\xc6\xda\x52\x0b\x2d\x63\x7d\xa9\x49\x2d\x54\x48\x28\xc0\x12\x9c\xe3\x63\xc9\x58\x04\x98\x36\x07\xc8\x0a\xa7\x91\xd4\xf0\xbc\xc1\xa8\xb9\x70\xd0\xc6\xa9\xb6\x78\x80\x5a\xa3\xb4\x2c\xf4\x18\x0b\x8a\x9d\xd0\xb4\x55\x10\xee\x0d\xc5\xd6\xe0\x99\x93\xdc\xa1\x04\xbb\xf1\xa7\x23\xd1\xd1\x97\x8c\x87\x13\x0a\x21\x02\xe9\x99\x25\xed\x20\xc5\x92\x66\x3c\x32\x9c\xd6\x06\xb0\x31\x5c\x86\x29\x0a\xcb\x60\x33\x12\xa5\x91\xfc\x96\x75\xd0\x59\xd7\x13\xbd\xd3\x23\x79\xdd\x2a\x90\xa6\x38\x06\x91\x39\x7f\x20\x72\x03\x1c\x2d\x01\x61\xba\x45\x37\x38\x22\x61\x8e\x71\x85\xc4\x32\x15\x28\x60\x61\x16\xb8\x3d\x29\xdc\x4d\x3d\x2f\x12\x13\x7d\xc8\x7e\x37\xee\xa8\x7f\xfa\xdb\xcb\x17\xff\x77\xfd\xf9\x7f\xee\x9f\x3d\xfe\xcf\xa7\xa7\x45\xfb\xcf\x1e\xf7\xf3\xe0\xff\xc4\x51\x0a\x8e\x4c\xcb\x01\xdc\x0a\x65\xb2\x01\x83\xed\x3d\xe4\xa9\xa3\x4e\x2d\x59\xc5\xe8\x2f\x48\x7d\x5a\x6e\x37\xbf\x5c\x9f\x35\x13\x64\x14\xfa\xef\x0b\x68\xa6\x0d\xb4\x8e\xf1\xa8\xff\xbb\x60\xf4\x03\x64\xab\x5b\x81\x65\x51\xe6\xda\xca\xfa\xf0\xb0\xac\x3e\x9c\xca\x26\x0e\x1d\xdb\x57\x5b\xbb\xb4\x9a\xa6\xb6\x9b\x1a\x6b\xd1\x9a\x9e\x7e\x33\x9a\xec\x41\x69\x45\x22\xb8\xb4\x51\xeb\x04\x77\xca\x6f\x7b\x7b\xc8\xb2\xb0\x95\x92\x25\x5b\xd0\x42\xaa\x2a\xdd\x32\x78\x4f\x0c\xab\x68\x46\x6c\xea\x6d\xf4\x5c\x5e\xde\xc4\xac\xa5\xf9\xd1\x00\x9f\x7d\x98\x65\x24\xbd\xc7\x97\xd4\xb3\x3a\xa8\x2b\xa0\x34\x76\xf9\x65\x5f\x2d\x25\x95\x1b\xcf\xd6\xf4\x9b\x5f\x09\x95\xb0\x36\x3f\xdb\xd0\x39\x2a\x93\x1c\x9d\x03\xa2\x4a\xca\xf5\xf6\x10\xb6\x94\x89\x0b\x6a\x70\x12\x13\x49\x6e\x40\xe4\x29\x12\x2b\xbd\x80\x45\x11\x04\xaa\xc2\x8f\x56\x9e\x5c\x6b\xec\x8d\x5a\x0e\x14\x59\x06\x2b\x1e\x24\xcb\xc2\x56\x4a\x31\xbe\x23\x71\x1a\xfb\x51\x2a\x0b\x3b\x1c\x48\x10\xa5\x82\xdc\xc0\xbb\x3e\x24\x8d\x5a\x76\x2e\x09\xed\xc1\x65\x51\xb8\x83\xcb\x3e\x24\x8d\x5a\x2e\x5d\xfe\x02\x74\x2d\x3d\xf1\xef\xae\xb8\x4b\xe6\x5e\xd4\xaa\xe2\x2e\x5c\x5e\xec\x0e\xf5\x5b\x0c\xcb\x0a\xbb\xa4\x3c\xf7\x1f\x2a\x55\x69\x97\x8c\x7d\x68\x95\xa5\xad\xb4\xf4\x9c\xa5\x07\xb9\x7a\x05\xbb\xad\x50\x6f\xfb\xa0\x4e\x9b\x48\x23\x49\x92\x28\x87\x19\x3e\x32\xee\xca\x3b\x46\x7e\x7f\x18\x64\xcc\xcc\x0f\x34\xe9\x36\x8b\xb7\x6c\xa8\xa5\x5b\x54\x4c\x54\x5b\x15\x3a\xf1\x6c\x2d\xfe\x96\xc8\x0d\xba\x7b\x81\x88\xc8\x23\xab\xee\x7d\x3b\x92\xa7\x60\x29\xe3\xdc\xff\xb8\x64\xe1\xf6\xa2\x5a\x59\xdc\x6f\xeb\x45\x7d\x6a\xd1\x76\x1e\xea\xb8\xf1\xfa\x14\xd3\x36\x63\xe5\xd7\xf3\xe4\xbe\x25\xbd\x5e\x05\xeb\x73\x74\xb5\x21\x2a\x2e\x4e\xa3\x30\xdf\xbf\x43\x28\x2a\xd1\xa5\x2a\x9d\x8a\xfd\x76\xd8\x8d\xbc\x67\x65\xc7\xb8\x03\x45\xec\xa3\xb0\x37\x8a\x70\x4c\x68\x91\x51\x8e\x58\x80\xed\x4a\xf3\x81\x62\xca\x96\xbb\xf1\x52\xcd\x80\xfb\xe4\x4a\x5d\x6c\xdf\x6e\x20\x4b\x80\x30\x8e\x28\x93\xf9\xe9\x8d\x8a\x6d\xd5\x59\x65\x7b\xaa\x44\x9e\xc0\xc2\xd1\x7c\x40\x26\xd6\x1a\xce\xf9\xc5\x69\x7b\x6c\xec\xc8\x71\x7b\xe5\x21\x2e\xd3\xe5\x65\x93\x91\x53\x0b\x7b\x3a\xc7\xfa\x17\x6a\x01\xa7\x33\xd0\xf4\x40\x0f\x39\x87\xda\xe4\x54\x87\x3a\xd5\xe3\xc7\xa6\x8e\x20\xd4\x11\xb2\x4e\xb1\xe9\x14\x9b\x4e\xb1\xe9\x14\x9b\xfe\x15\x63\xd3\x47\xf5\xff\x97\x38\xe9\xcf\x14\xf8\x76\x82\x49\x13\x4c\xaa\x7d\xcd\x6c\x62\x42\x49\x87\x43\x49\x19\x33\x6f\xe3\x44\x6e\x9b\xab\x8a\x3e\x86\xaa\x99\x52\x1b\x5b\x59\x33\x02\x09\xa0\x21\xa1\x6b\x84\x6b\x66\xbb\xdc\x16\x0c\xd3\x68\xab\xec\x36\x4b\xd8\x60\x8a\x40\x31\x85\x6e\x14\x57\x13\xc2\xfb\x92\x10\xde\xbf\x88\xdc\xbc\x53\x5e\x7f\x82\x7a\x13\xd4\x9b\xa0\xde\x04\xf5\x90\x01\xf5\x94\xcb\x7b\x83\x25\x9e\xd0\xde\x84\xf6\x6a\x5f\x4b\xb3\x98\x00\xdf\x04\xf8\x6c\xbc\x7f\x19\x80\xaf\xf1\x71\x45\x22\x98\x40\xe0\x04\x02\x27\x10\xd8\x29\xf5\x04\x02\xff\x4a\x20\x30\xc1\x72\xf3\x65\x02\x40\xd7\xc1\xd1\xe2\x6b\xf1\xa9\x7b\xfb\xe4\x20\xc0\x68\x9d\xd4\xb4\xd3\x96\xb5\xa6\xd1\x41\x20\xe6\x89\xc3\x48\x65\x58\x13\x84\x9c\x56\x56\x3b\x0c\xe0\x6b\x83\x5c\x13\xd2\x9a\x90\xd6\x84\xb4\x26\xa4\x85\x0c\xa4\x45\x19\xfd\xff\x63\x6c\x52\xb5\x1f\x1e\x19\x74\x3a\xcd\xb9\x69\xce\xa6\x3a\x0f\x7a\x2d\x19\xc7\x81\x14\x5d\xcb\xd5\x03\xc9\x39\xd0\xb0\xd1\xb3\xcd\xfb\x7a\x2d\x5d\x3a\x48\xe1\xfa\x2e\xe6\x81\x42\x18\x86\xd6\xc1\xbe\xb1\x23\xd3\xf7\x34\xed\x19\x0a\x0b\xc4\x48\x44\xfd\x22\x50\xb6\x42\x58\xbb\xe5\x3d\xa7\x73\xd4\x8b\xc4\x8c\x70\x61\xec\x73\xee\xc3\x81\x8b\xf5\xe2\xd7\x52\x3e\xcf\xeb\xeb\x17\x3b\x71\x16\xda\x7d\xb8\xde\xf0\x7a\x8f\x06\x2d\xa7\x40\x7b\xc1\x9d\x41\x4d\xb6\x61\xa2\x4e\x9f\x3d\xa0\xc5\xae\xe3\x1c\x1d\x40\x6c\x48\x8b\x63\xa0\xb5\x01\xed\x8e\x02\xe9\x86\xc8\x3b\x06\xee\xdb\x4b\xde\xbd\xc0\xa1\x6f\xcb\xda\xfc\xc2\x44\x16\x87\x9c\x17\x31\xd3\x30\x20\x39\x42\xcb\x6f\xf2\xf1\xf4\x72\x10\xf8\x1c\xa0\xf3\xbd\x10\xea\x21\x35\x7d\xe8\x86\xdb\x15\xed\x81\x81\x07\x28\xbb\x13\x28\xc7\xf8\xce\x7d\x8d\xc2\x31\xb4\x7e\x94\xd6\xdb\x55\xef\x4a\xfb\xed\xc3\x40\x3e\xeb\x9f\xe9\x99\x0f\xdf\x08\x65\x88\x27\x73\x86\x31\x9d\x47\xdf\x55\x19\xba\x3d\xee\x15\x0a\xcd\x8c\xaa\x5e\xb9\xf6\x57\x33\x73\x5a\xa1\x89\x7b\x3b\xa0\xb2\xa4\xc2\xf6\xc1\x53\xb5\x00\xca\x23\xe5\xf4\x60\x6a\xb4\x2d\x74\xea\x4e\xed\x3b\xe3\x47\xfb\xed\x82\x3d\x19\xd4\x3b\x6b\xaf\xae\x2b\x2f\x57\xb3\x82\x68\xcb\xed\x88\x2e\xe1\x5c\xd7\x26\xfa\x0a\x65\xe7\xce\x11\x33\xb4\xdd\x66\xe3\x37\xf6\xfa\x70\xd6\x4f\xa1\x21\x51\xd8\x3c\x26\x14\x4b\xc6\x87\x44\x27\x1c\x70\xf8\x9e\x46\xce\xab\x21\x07\x5f\xc1\x76\x17\x1b\x77\xb4\xda\x75\xa0\x0a\x3a\x30\xe1\xf8\x97\x32\x16\x2b\x00\x75\x85\xee\x62\x46\xef\xd3\x85\xb5\x6b\x60\xbe\xf2\x30\x7a\x8c\x0b\x4b\xa6\xd0\xf9\x64\x42\xe7\x07\x41\x41\xe3\x2c\x5d\xf9\x6d\xe9\x39\x98\x3b\x3b\x5d\x67\xd4\x5c\xed\xf2\xf0\x48\x7b\xbd\x2d\x31\xdd\x3f\x34\xad\x44\x76\x51\x9a\x56\x22\xa7\x95\xc8\x69\x25\xf2\xe1\x56\x22\x1f\x00\x32\x6a\x73\x92\xed\xe1\xc6\x7d\x9f\x49\x2c\x69\x7e\xc8\x31\x4c\x0c\xb4\xf2\x54\x3b\x79\x3b\x9e\x4d\xb4\xd1\x18\x3e\x5f\x9a\x93\xa2\x11\xc3\xda\x27\x0b\xaf\x37\x2e\x5c\x37\xfb\xeb\x9a\xd6\xc3\xac\xc3\xcc\xf8\x1e\x5b\x9d\xac\x22\x64\xb7\xed\x26\xb8\xf3\xb9\x3c\xbb\x1f\xe2\xb0\x22\x77\x43\x6a\x62\x29\x39\x59\xa6\xe6\xe5\xcd\x7b\x83\xc0\x5b\x8e\x93\x64\xac\xeb\xca\x4f\x65\xac\x4a\xbc\x1e\xcd\x82\xfa\x3c\x70\x36\xb6\xb5\xed\x79\xef\xec\x68\x00\xff\x54\xfa\xb5\xe3\xf1\xdb\xe1\xbe\xce\x76\x17\xaf\x57\xb6\x6b\x89\x05\x09\xce\x52\xb9\x01\x2a\x49\xbe\xd9\xf4\xd2\xb8\x7a\xbf\x91\x02\xf3\x22\x8c\x13\xf2\x77\xd8\x8e\x43\x8b\xe1\x54\x6e\x5e\x9d\xc7\x49\x44\x02\x22\xc7\xa4\x79\x81\x85\xb8\x65\x3c\x1c\x93\xe6\x59\xa2\xf8\x1c\x51\x95\x05\xd9\x20\x00\x21\x7e\x60\x21\x58\xa9\x56\xff\xbe\xb6\x5a\x5e\x5b\x3f\x1f\xd6\xd3\x3c\xc4\x4d\xba\x99\xb4\x63\x6e\x7d\x3e\x3d\x57\xd2\x18\x5f\x47\xe8\xc3\x06\x8a\x68\x6c\x7f\x3b\x72\x0f\xe7\xe2\x77\x77\xf1\xd0\x99\xab\xdf\x2e\xfe\xd6\xbb\xcd\x1a\xb9\x90\xd1\xaf\xf2\x38\x3d\xdb\x74\xf8\xeb\xe3\xda\xe8\x2a\x62\xb7\xda\x1b\x07\xa9\xdc\x30\x5e\xbc\x68\xfb\x6b\x9f\x97\xf1\xc6\xb1\xd8\x5c\x29\x1e\x49\x30\xc5\xf7\xde\xad\x91\x42\xf9\xdd\xed\x89\x80\x25\xbe\x37\xd7\xe7\x32\x5c\xe6\x35\xac\xd4\x0c\x2d\xf7\x90\xc4\xe3\xf5\xe3\x2f\x7f\x54\x18\x88\xe3\x61\x47\x85\x64\x7f\xc0\xd7\x3f\x1a\x92\x42\xe9\xc7\x1e\x0d\x95\x76\xa7\x51\xa0\x8f\x02\x1b\x46\x9e\x06\x42\xd1\xf2\x01\x07\x02\xde\xe9\x7d\x1a\x0b\xa7\x32\x16\xcc\xc0\xee\xc4\x90\xd2\x5f\x6f\x98\x54\x5d\xf2\x95\xe1\xa7\x69\x10\x3a\x06\xe1\x65\xb3\x17\x47\x58\x78\xd0\x45\xd6\x5b\xd5\x5f\x25\x1d\x71\x49\xa6\x7a\x64\xda\xd0\x6f\xc7\x3a\x4c\xe3\x09\xc0\x6e\x96\x2c\xa7\xa7\x77\x34\x10\x05\x08\x21\x44\x92\x65\x77\xdf\x20\x5c\xbc\xe7\x97\x3f\xf4\x1a\x45\xd6\xe7\x27\x4a\xde\x74\x27\x66\x11\x7d\x70\xba\xd3\x78\xf9\x1e\x0d\xca\xc8\x39\xde\x7c\xb3\xa6\xe1\xbc\xd7\xc1\x6a\x6f\xb3\x0e\x52\xbe\xe4\x98\x8a\x15\x70\x94\x70\x26\x59\xc0\xa2\xf2\x1c\xfb\xd9\xc5\xf9\xbc\xd5\x92\x9c\xa3\xdf\xe6\x1e\xb3\x0d\x49\xba\x87\x50\x5f\x84\xfe\xe9\xd6\xf8\xbb\xe6\xf0\x7a\xeb\xa6\x65\x3b\x86\x8b\x79\x93\xf5\x59\x20\x6e\xb4\xa7\x44\xf4\x3f\xa5\xfe\x67\x42\x12\xdb\xd3\xe7\xbb\xa5\xa3\x8c\x5c\x2b\x97\xbb\xbb\x7f\x8e\xc5\x6e\xed\x43\x5c\xbf\x74\xc8\x8f\xff\xe6\xd6\xbe\x91\xb6\xf5\x95\xe4\xed\x93\xc4\xa8\x5b\xf9\x76\x4d\x35\xb7\xd8\x8c\xb6\x7d\xaf\x72\xe0\xb6\xbd\x01\x63\x9e\x76\xab\x1a\x32\x76\xe4\x8c\x76\xc2\xad\x6c\xa2\x65\xf7\xcf\xf8\xa7\xda\x2a\xb9\x8c\x3d\x3c\xa3\x9d\x64\x33\xe5\x1a\xb5\x2d\xfb\x86\xa2\x5a\x7f\x19\x5b\x7f\xc6\x3f\xd1\x53\xd3\xe2\x41\x5b\xd3\x4f\xf0\xec\xb0\x42\x73\x43\xd2\x68\x27\xd3\x6a\x6a\x34\xf6\x4e\x1e\x52\x8b\x87\x6c\xcc\xae\x44\xfb\x9e\xa7\x51\x4f\x9d\x55\x03\x81\x8e\x67\xfc\xb4\x69\xf0\x3a\x18\xf2\x40\xd0\xf6\xa8\x34\xe3\xc9\x98\xaf\xf6\xda\x24\xd3\xeb\x60\xb9\x0e\xd3\x1f\xa9\xff\xee\x1f\xfd\x37\x00\x00\xff\xff\x69\x5d\x0a\x6a\x39\x9d\x00\x00") +var _v2SchemaJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5d\x4f\x93\xdb\x36\xb2\xbf\xfb\x53\xa0\x14\x57\xd9\xae\xd8\x92\xe3\xf7\x2e\xcf\x97\xd4\xbc\xd8\x49\x66\x37\x5e\x4f\x79\x26\xbb\x87\x78\x5c\x05\x91\x2d\x09\x09\x09\x30\x00\x38\x33\x5a\xef\x7c\xf7\x2d\xf0\x9f\x08\x02\x20\x41\x8a\xd2\xc8\x0e\x0f\xa9\x78\x28\xa0\xd1\xdd\x68\x34\x7e\xdd\xf8\xf7\xf9\x11\x42\x33\x49\x64\x04\xb3\xd7\x68\x76\x86\xfe\x76\xf9\xfe\x1f\xe8\x32\xd8\x40\x8c\xd1\x8a\x71\x74\x79\x8b\xd7\x6b\xe0\xe8\xd5\xfc\x25\x3a\xbb\x38\x9f\xcf\x9e\xab\x0a\x24\x54\xa5\x37\x52\x26\xaf\x17\x0b\x91\x17\x99\x13\xb6\xb8\x79\xb5\x10\x59\xdd\xf9\xef\x82\xd1\x6f\xf2\xc2\x8f\xf3\x4f\xb5\x1a\xea\xc7\x17\x45\x41\xc6\xd7\x8b\x90\xe3\x95\x7c\xf1\xf2\x7f\x8b\xca\x45\x3d\xb9\x4d\x32\xa6\xd8\xf2\x77\x08\x64\xfe\x8d\xc3\x9f\x29\xe1\xa0\x9a\xff\xed\x11\x42\x08\xcd\x8a\xd6\xb3\x9f\x15\x67\x74\xc5\xca\x7f\x27\x58\x6e\xc4\xec\x11\x42\xd7\x59\x5d\x1c\x86\x44\x12\x46\x71\x74\xc1\x59\x02\x5c\x12\x10\xb3\xd7\x68\x85\x23\x01\x59\x81\x04\x4b\x09\x9c\x6a\xbf\x7e\xce\x49\x7d\xba\x7b\x51\xfd\xa1\x44\xe2\xb0\x52\xac\x7d\xb3\x08\x61\x45\x68\x46\x56\x2c\x6e\x80\x86\x8c\xbf\xbd\x93\x40\x05\x61\x74\x96\x95\xbe\x7f\x84\xd0\x7d\x4e\xde\x42\xb7\xe4\xbe\x46\xbb\x14\x5b\x48\x4e\xe8\xba\x90\x05\xa1\x19\xd0\x34\xae\xc4\xce\xbe\xbc\x9a\xbf\x9c\x15\x7f\x5d\x57\xc5\x42\x10\x01\x27\x89\xe2\x48\x51\xb9\xda\x40\xd5\x87\x37\xc0\x15\x5f\x88\xad\x90\xdc\x10\x81\x42\x16\xa4\x31\x50\x39\x2f\x38\xad\xab\xb0\x53\xd8\xac\x94\x56\x6f\xc3\x84\xf4\x11\xa4\x50\xb3\xfa\xe9\xd3\x6f\x9f\x3e\xdf\x2f\xd0\xeb\x8f\x1f\x3f\x7e\xbc\xfe\xf6\xe9\xf7\xaf\x5f\x7f\xfc\x18\x7e\xfb\xec\xfb\xc7\xb3\x36\x79\x54\x43\xe8\x29\xc5\x31\x20\xc6\x11\x49\x9e\xe5\x12\x41\x66\xa0\xe8\xed\x1d\x8e\x93\x08\x5e\xa3\x27\x3b\xc3\x7c\xa2\x73\xba\xc4\x02\x2e\xb0\xdc\xf4\xe5\x76\xd1\xca\x96\xa2\x8a\x94\xcd\x21\xc9\x6c\xec\x2c\x70\x42\x9e\x34\x74\x9d\x19\x7c\xcd\x20\x9c\xea\x2e\x0a\xfe\x42\x84\xd4\x29\x04\x8c\x8a\xb4\x41\xa2\xc1\xdc\x19\x8a\x88\x90\x4a\x49\xef\xce\xdf\xbd\x45\x4a\x52\x81\x70\x10\x40\x22\x21\x44\xcb\x6d\xc5\xec\x4e\x3c\x1c\x45\xef\x57\x9a\xb5\x7d\xae\xfe\xe5\xe4\x31\x86\x90\xe0\xab\x6d\x02\x3b\x2e\xcb\x11\x90\xd9\xa8\xc6\x77\xc2\x59\x98\x06\xfd\xf9\x2e\x78\x45\x01\xa6\xa8\xa0\x71\x5c\xbe\x33\xa7\xd2\xd9\x5f\x95\xef\xd9\xd5\xac\xfd\xdc\x5d\xbf\x5e\xb8\xd1\x3e\xc7\x31\x48\xe0\x5e\x4c\x14\x65\xdf\xb8\xa8\x71\x10\x09\xa3\xc2\xc7\x02\xcb\xa2\x4e\x5a\x02\x82\x94\x13\xb9\xf5\x30\xe6\xb2\xa4\xb5\xfe\x9b\x3e\x7a\xb2\x55\xd2\xa8\x4a\xbc\x16\xb6\x71\x8e\x39\xc7\xdb\x9d\xe1\x10\x09\x71\xbd\x9c\xb3\x41\x89\xd7\xa5\x89\xdc\x57\xb5\x53\x4a\xfe\x4c\xe1\xbc\xa0\x21\x79\x0a\x1a\x0f\x70\xa7\x5c\x08\x8e\xde\xb0\xc0\x43\x24\xad\x74\x63\x0e\xb1\xd9\x90\xe1\xb0\x2d\x13\xa7\x6d\x78\xfd\x04\x14\x38\x8e\x90\xaa\xce\x63\xac\x3e\x23\xbc\x64\xa9\xb4\xf8\x03\x63\xde\xcd\xbe\x16\x13\x4a\x55\xac\x82\x12\xc6\xac\xd4\x35\xf7\x22\xd4\x3a\xff\x22\x73\x0e\x6e\x51\xa0\x75\x1e\xae\x8f\xe8\x5d\xc7\x59\xe6\xe4\x9a\x18\x8d\xd6\x1c\x53\x84\x4d\xb7\x67\x28\x37\x09\x84\x69\x88\x12\x0e\x01\x11\x80\x32\xa2\xf5\xb9\xaa\xc6\xd9\x73\x53\xab\xfb\xb4\x2e\x20\xc6\x54\x92\xa0\x9a\xf3\x69\x1a\x2f\x81\x77\x37\xae\x53\x1a\xce\x40\xc4\xa8\x82\x1c\xb5\xef\xda\x24\x7d\xb9\x61\x69\x14\xa2\x25\xa0\x90\xac\x56\xc0\x81\x4a\xb4\xe2\x2c\xce\x4a\x64\x7a\x9a\x23\xf4\x13\x91\x3f\xa7\x4b\xf4\x63\x84\x6f\x18\x87\x10\xbd\xc3\xfc\x8f\x90\xdd\x52\x44\x04\xc2\x51\xc4\x6e\x21\x74\x48\x21\x81\xc7\xe2\xfd\xea\x12\xf8\x0d\x09\xf6\xe9\x47\x35\xaf\x67\xc4\x14\xf7\x22\x27\x97\xe1\xe2\x76\x2d\x06\x8c\x4a\x1c\x48\x3f\x73\x2d\x0b\x5b\x29\x45\x24\x00\x2a\x0c\x11\xec\x94\xca\xc2\xa6\xc1\x37\x21\x43\x83\x3b\x5f\x97\xf1\x43\x5e\x53\x73\x19\xa5\x36\xd8\x2d\x05\x2e\x34\x0b\xeb\x39\xfc\x1d\x63\x51\x01\xbd\x3d\xbb\x90\x84\x40\x25\x59\x6d\x09\x5d\xa3\x1c\x37\xe6\x5c\x16\x9a\x40\x09\x70\xc1\xe8\x82\xf1\x35\xa6\xe4\xdf\x99\x5c\x8e\x9e\x4d\x79\xb4\x27\x2f\xbf\x7e\xf8\x05\x25\x8c\x50\xa9\x98\x29\x90\x62\x60\xea\x75\xae\x13\xca\xbf\x2b\x1a\x29\x27\x76\xd6\x20\xc6\x64\x5f\xe6\x32\x1a\x08\x87\x21\x07\x21\xbc\xb4\xe4\xe0\x32\x67\xa6\xcd\xf3\x1e\xcd\xd9\x6b\xb6\x6f\x8e\x27\xa7\xed\xdb\xe7\xbc\xcc\x1a\x07\xce\x6f\x87\x33\xf0\xba\x51\x17\x22\x66\x78\x79\x8e\xce\xe5\x13\x81\x80\x06\x2c\xe5\x78\x0d\xa1\xb2\xb8\x54\xa8\x79\x09\xbd\xbf\x3c\x47\x01\x8b\x13\x2c\xc9\x32\xaa\xaa\x1d\xd5\xee\xab\x36\xbd\x6c\xfd\x54\x6c\xc8\x08\x01\x3c\xbd\xe7\x07\x88\xb0\x24\x37\x79\x90\x28\x4a\x1d\x10\x1a\x92\x1b\x12\xa6\x38\x42\x40\xc3\x4c\x43\x62\x8e\xae\x36\xb0\x45\x71\x2a\xa4\x9a\x23\x79\x59\xb1\xa8\xf2\xa4\x0c\x60\x9f\xcc\x8d\x40\xf5\x80\xca\xa8\x99\xc3\xa7\x85\x1f\x31\x25\xa9\x82\xc5\x6d\xbd\xd8\x36\x76\x7c\x02\x28\x97\xf6\x1d\x74\x3b\x11\x7e\x91\xae\x32\xf8\x6c\xf4\xe6\x7b\x9a\xa5\x1f\x62\xc6\x21\xcf\x9a\xe5\xed\x8b\x02\xf3\x2c\x33\x33\xdf\x00\xca\xc9\x09\xb4\x04\xf5\xa5\x08\xd7\xc3\x02\x18\x66\xf1\xab\x1e\x83\x37\x4c\xcd\x12\xc1\x1d\x50\xf6\xaa\xbd\xfe\xe2\x73\x48\x38\x08\xa0\x32\x9b\x18\x44\x86\x0b\x6a\xc1\xaa\x26\x96\x2d\x96\x3c\xa0\x54\x65\x73\xe3\x08\xb5\x8b\x99\xbd\x82\xbc\x9e\xc2\xe8\x53\x46\x83\x3f\x33\x54\x2b\x5b\xad\x92\x79\xd9\x8f\x5d\x93\x98\xf2\xe6\xc6\x1c\xe6\x9a\x9e\xfc\x43\x82\x31\x66\x8e\x53\x77\xfe\x90\xe7\xf3\xf6\xe9\x62\x23\x3f\x10\x93\x18\xae\x72\x1a\x9d\xf9\x48\xcb\xcc\x5a\x65\xc7\x4a\x04\xf0\xf3\xd5\xd5\x05\x8a\x41\x08\xbc\x86\x86\x43\x51\x6c\xe0\x46\x57\xf6\x44\x40\x0d\xfb\xff\xa2\xc3\x7c\x3d\x39\x84\xdc\x09\x22\x64\x4f\x12\xd9\xba\xaa\xf6\xe3\xbd\x56\xdd\x91\x25\x6a\x14\x9c\x89\x34\x8e\x31\xdf\xee\x15\x7e\x2f\x39\x81\x15\x2a\x28\x95\x66\x51\xf5\xfd\x83\xc5\xfe\x15\x07\xcf\xf7\x08\xee\x1d\x8e\xb6\xc5\x52\xcc\x8c\x5a\x93\x66\xc5\xd8\x79\x38\x46\xd6\xa7\x88\x37\xc9\x2e\xe3\xd2\xa5\x7b\x4b\x3a\xdc\xa1\xdc\x9e\x29\xf1\x8c\x8a\x99\x16\x47\x8d\xd4\x78\x8b\xf6\x1c\xe9\x71\x54\x1b\x69\xa8\x4a\x93\x37\xe5\xb2\x2c\x4f\x0c\x92\xab\xa0\x73\x32\x72\x59\xd3\xf0\x2d\x8d\xed\xca\x37\x16\x19\x9e\xdb\x1c\xab\x17\x49\xc3\x0f\x37\xdc\x88\xb1\xb4\xd4\x42\xcb\x58\x5e\x6a\x52\x0b\x15\x10\x0a\xb0\x04\xe7\xf8\x58\x32\x16\x01\xa6\xcd\x01\xb2\xc2\x69\x24\x35\x38\x6f\x30\x6a\xae\x1b\xb4\x71\xaa\xad\x1d\xa0\xd6\x20\x2d\x8b\x3c\xc6\x82\x62\x27\x34\x6d\x15\x84\x7b\x43\xb1\x35\x78\xa6\x24\x77\x28\xc1\x6e\xfc\xe9\x48\x74\xf4\x15\xe3\xe1\x84\x42\x88\x40\x7a\x26\x49\x3b\x48\xb1\xa4\x19\x8e\x0c\xa7\xb5\x01\x6c\x0c\x97\x61\x8a\xc2\x32\xd8\x8c\x44\x69\x24\xbf\x65\x1d\x74\xd6\xe5\x44\xef\xec\x48\x5e\xb7\x8a\xa3\x29\x8e\x41\x64\xce\x1f\x88\xdc\x00\x47\x4b\x40\x98\x6e\xd1\x0d\x8e\x48\x98\x63\x5c\x21\xb1\x4c\x05\x0a\x58\x98\xc5\x6d\x4f\x0a\x77\x53\x4f\x8b\xc4\x44\x1f\xb2\xdf\x8d\x3b\xea\x9f\xfe\xf6\xf2\xc5\xff\x5d\x7f\xfe\x9f\xfb\x67\x8f\xff\xf3\xe9\x69\xd1\xfe\xb3\xc7\xfd\x3c\xf8\x3f\x71\x94\x82\x23\xd1\x72\x00\xb7\x42\x99\x6c\xc0\x60\x7b\x0f\x79\xea\xa8\x53\x4b\x56\x31\xfa\x0b\x52\x9f\x96\xdb\xcd\x2f\xd7\x67\xcd\x04\x19\x85\xfe\xdb\x02\x9a\x59\x03\xad\x63\x3c\xea\xff\x2e\x18\xfd\x00\xd9\xe2\x56\x60\x59\x93\xb9\xb6\xb2\x3e\x3c\x2c\xab\x0f\xa7\xb2\x89\x43\xc7\xf6\xd5\xce\x2e\xad\xa6\xa9\xed\xa6\xc6\x5a\xb4\xa6\x67\xdf\x8c\x26\x7b\x50\x5a\x91\x08\x2e\x6d\xd4\x3a\xc1\x9d\xf2\xdb\xde\x1e\xb2\x2c\x6c\xa5\x64\xc9\x16\xb4\x90\xaa\x4a\xb7\x0c\xde\x13\xc3\x2a\x9a\x11\x9b\x7a\x1b\x3d\x95\x97\x37\x31\x6b\x69\x7e\x34\xc0\x67\x1f\x66\x19\x49\xef\xf1\x25\xf5\xac\x0e\xea\x0a\x28\x8d\x4d\x7e\xd9\x57\x4b\x49\xe5\xc6\xb3\x25\xfd\xe6\x57\x42\x25\xac\xcd\xcf\x36\x74\x8e\xca\x24\x47\xe7\x80\xa8\x92\x72\xbd\x3d\x84\x2d\x65\xe2\x82\x1a\x9c\xc4\x44\x92\x1b\x10\x79\x8a\xc4\x4a\x2f\x60\x51\x04\x81\xaa\xf0\xa3\x95\x27\xd7\x12\x7b\xa3\x96\x03\x45\x96\xc1\x8a\x07\xc9\xb2\xb0\x95\x52\x8c\xef\x48\x9c\xc6\x7e\x94\xca\xc2\x0e\x07\x12\x44\xa9\x20\x37\xf0\xae\x0f\x49\xa3\x96\x9d\x4b\x42\x7b\x70\x59\x14\xee\xe0\xb2\x0f\x49\xa3\x96\x4b\x97\xbf\x00\x5d\x4b\x4f\xfc\xbb\x2b\xee\x92\xb9\x17\xb5\xaa\xb8\x0b\x97\x17\x9b\x43\xfd\xd6\xc2\xb2\xc2\x2e\x29\xcf\xfd\x87\x4a\x55\xda\x25\x63\x1f\x5a\x65\x69\x2b\x2d\x3d\x67\xe9\x41\xae\x5e\xc1\x6e\x2b\xd4\xdb\x3e\xa8\xd3\x26\xd2\x48\x92\x24\xca\x61\x86\x8f\x8c\xbb\xf2\x8e\x91\xdf\x1f\x06\x19\x33\xf3\x03\x4d\xba\xcd\xe2\x2d\xfb\x69\xe9\x16\x15\x13\xd5\x56\x85\x4e\x3c\x5b\x8a\xbf\x25\x72\x83\xee\x5e\x20\x22\xf2\xc8\xaa\x7b\xdb\x8e\xe4\x29\x58\xca\x38\xb7\x3f\x2e\x59\xb8\xbd\xa8\x16\x16\xf7\xdb\x79\x51\x9f\x5a\xb4\x8d\x87\x3a\x6e\xbc\x3e\xc5\xb4\xcd\x58\xf9\xf5\x3c\xb9\x6f\x49\xaf\x57\xc1\xfa\x1c\x5d\x6d\x88\x8a\x8b\xd3\x28\xcc\xb7\xef\x10\x8a\x4a\x74\xa9\x4a\xa7\x62\xbf\x0d\x76\x23\x6f\x59\xd9\x31\xee\x40\x11\xfb\x28\xec\x8d\x22\x1c\x13\x5a\x64\x94\x23\x16\x60\xbb\xd2\x7c\xa0\x98\xb2\xe5\x6e\xbc\x54\x33\xe0\x3e\xb9\x52\x17\xdb\xb7\x1b\xc8\x12\x20\x8c\x23\xca\x64\x7e\x78\xa3\x62\x5b\x75\x56\xd9\x9e\x2a\x91\x27\xb0\x70\x34\x1f\x90\x89\xb5\x86\x73\x7e\x71\xda\x1e\xfb\x3a\x72\xdc\x5e\x79\x88\xcb\x74\x79\xd9\x64\xe4\xd4\xc2\x9e\xce\xb1\xfe\x85\x5a\xc0\xe9\x0c\x34\x3d\xd0\x43\xce\xa1\x36\x39\xd5\xa1\x4e\xf5\xf8\xb1\xa9\x23\x08\x75\x84\xac\x53\x6c\x3a\xc5\xa6\x53\x6c\x3a\xc5\xa6\x7f\xc5\xd8\xf4\x51\xfd\xff\x25\x4e\xfa\x33\x05\xbe\x9d\x60\xd2\x04\x93\x6a\x5f\x33\x9b\x98\x50\xd2\xe1\x50\x52\xc6\xcc\xdb\x38\x91\xdb\xe6\xaa\xa2\x8f\xa1\x6a\xa6\xd4\xc6\x56\xd6\x8c\x40\x02\x68\x48\xe8\x1a\xe1\x9a\xd9\x2e\xb7\x05\xc3\x34\xda\x2a\xbb\xcd\x12\x36\x98\x22\x50\x4c\xa1\x1b\xc5\xd5\x84\xf0\xbe\x24\x84\xf7\x2f\x22\x37\xef\x94\xd7\x9f\xa0\xde\x04\xf5\x26\xa8\x37\x41\x3d\x64\x40\x3d\xe5\xf2\xde\x60\x89\x27\xb4\x37\xa1\xbd\xda\xd7\xd2\x2c\x26\xc0\x37\x01\x3e\x1b\xef\x5f\x06\xe0\x6b\x7c\x5c\x91\x08\x26\x10\x38\x81\xc0\x09\x04\x76\x4a\x3d\x81\xc0\xbf\x12\x08\x4c\xb0\xdc\x7c\x99\x00\xd0\x75\x70\xb4\xf8\x5a\x7c\xea\xde\x3e\x39\x08\x30\x5a\x27\x35\xed\xb4\x65\xad\x69\x74\x10\x88\x79\xe2\x30\x52\x19\xd6\x04\x21\xa7\x95\xd5\x0e\x03\xf8\xda\x20\xd7\x84\xb4\x26\xa4\x35\x21\xad\x09\x69\x21\x03\x69\x51\x46\xff\xff\x18\x9b\x54\xed\x87\x47\x06\x9d\x4e\x73\x6e\x9a\xb3\xa9\xce\x83\x5e\x4b\xc6\x71\x20\x45\xd7\x72\xf5\x40\x72\x0e\x34\x6c\xf4\x6c\xf3\xba\x5e\x4b\x97\x0e\x52\xb8\xbe\x8b\x79\xa0\x10\x86\xa1\x75\xb0\x6f\xec\xc8\xf4\x3d\x4d\x7b\x86\xc2\x02\x31\x12\x51\xbf\x07\x94\xad\x10\xd6\x2e\x79\xcf\xe9\x1c\xf5\x1e\x31\x23\x5c\x18\xfb\x9c\xfb\x70\xe0\x62\xbd\xf7\xb5\x94\xcf\xf3\xf6\xfa\xc5\x4e\x9c\x85\x76\x1d\xae\x37\xbc\xde\xa3\x41\xcb\x29\xd0\x5e\x70\x67\x50\x93\x6d\x98\xa8\xd3\x67\x0f\x68\xb1\xeb\x38\x47\x07\x10\x1b\xd2\xe2\x18\x68\x6d\x40\xbb\xa3\x40\xba\x21\xf2\x8e\x81\xfb\xf6\x92\x77\x2f\x70\xe8\xdb\xb2\x36\xbf\x30\x91\xc5\x21\xe7\x45\xcc\x34\x0c\x48\x8e\xd0\xf2\x9b\x7c\x3c\xbd\x1c\x04\x3e\x07\xe8\x7c\x2f\x84\x7a\x48\x4d\x1f\xba\xe1\x76\x45\x7b\x60\xe0\x01\xca\xee\x04\xca\x31\xbe\x73\x5f\xa3\x70\x0c\xad\x1f\xa5\xf5\x76\xd5\xbb\xd2\x7e\xfb\x30\x90\xcf\xfa\x67\x7a\xe6\xc3\x37\x42\x19\xe2\xc9\x9c\x61\x4c\xe7\xd1\x77\x55\x86\x6e\x8f\x7b\x85\x42\x33\xa3\xaa\x57\xae\xfd\xd5\xcc\x9c\x56\x68\xe2\xde\x0e\xa8\x2c\xa9\xb0\x7d\xf0\x54\x2d\x80\xf2\x48\x39\x3d\x98\x1a\x6d\x0b\x9d\xba\x53\xfb\xce\xf8\xd1\x7e\xbb\x60\x4f\x06\xf5\xce\xda\xab\xeb\xca\xcb\xd5\xac\x20\xda\x72\x3b\xa2\x4b\x38\xd7\xb5\x89\xbe\x42\xd9\xb9\x73\xc4\x0c\x6d\xb7\xd9\xf8\x8d\xbd\x3e\x9c\xf5\x53\x68\x48\x14\x36\x8f\x09\xc5\x92\xf1\x21\xd1\x09\x07\x1c\xbe\xa7\x91\xf3\x6a\xc8\xc1\x57\xb0\xdd\xc5\xc6\x1d\xad\x76\x1d\xa8\x82\x0e\x4c\x38\xfe\xa5\x8c\xc5\x0a\x40\x5d\xa1\xbb\x98\xd1\xfb\x74\x61\xed\x1a\x98\xaf\x3c\x8c\x1e\xe3\xc2\x92\x29\x74\x3e\x99\xd0\xf9\x41\x50\xd0\x38\x4b\x57\x7e\x5b\x7a\x0e\xe6\xce\x4e\xd7\x19\x35\x57\xbb\x3c\x3c\xd2\x5e\x4f\x4b\x4c\xf7\x0f\x4d\x2b\x91\x5d\x94\xa6\x95\xc8\x69\x25\x72\x5a\x89\x7c\xb8\x95\xc8\x07\x80\x8c\xda\x9c\x64\x7b\xb7\x71\xdf\x57\x12\x4b\x9a\x1f\x72\x0c\x13\x03\xad\x3c\xd5\x4e\xde\x8e\x57\x13\x6d\x34\x86\xcf\x97\xe6\xa4\x68\xc4\xb0\xf6\xc9\xc2\xeb\x8d\x0b\xd7\xcd\xfe\xba\xa6\xf5\x30\xeb\x30\x33\xbe\xc7\x56\x27\xab\x08\xd9\x6d\xbb\x09\xee\x7c\x2d\xcf\xee\x87\x38\xac\xc8\xdd\x90\x9a\x58\x4a\x4e\x96\xa9\x79\x79\xf3\xde\x20\xf0\x96\xe3\x24\x19\xeb\xba\xf2\x53\x19\xab\x12\xaf\x47\xb3\xa0\x3e\xef\x9b\x8d\x6d\x6d\x7b\xde\x3b\x3b\x1a\xc0\x3f\x95\x7e\xed\x78\xfb\x76\xb8\xaf\xb3\xdd\xc5\xeb\x95\xed\x5a\x62\x41\x82\xb3\x54\x6e\x80\x4a\x92\x6f\x36\xbd\x34\xae\xde\x6f\xa4\xc0\xbc\x08\xe3\x84\xfc\x1d\xb6\xe3\xd0\x62\x38\x95\x9b\x57\xe7\x71\x12\x91\x80\xc8\x31\x69\x5e\x60\x21\x6e\x19\x0f\xc7\xa4\x79\x96\x28\x3e\x47\x54\x65\x41\x36\x08\x40\x88\x1f\x58\x08\x56\xaa\xd5\xbf\xaf\xad\x96\xd7\xd6\xcf\x87\xf5\x34\x0f\x71\x93\x6e\x26\xed\x98\x5b\x9f\x4f\xcf\x95\x34\xc6\xd7\x11\xfa\xb0\x81\x22\x1a\xdb\xdf\x8e\xdc\xc3\xb9\xf8\xdd\x5d\x3c\x74\xe6\xea\xb7\x8b\xbf\xf5\x6e\xb3\x46\x2e\x64\xf4\xab\x3c\x4e\xcf\x36\x1d\xfe\xfa\xb8\x36\xba\x8a\xd8\xad\xf6\xc6\x41\x2a\x37\x8c\x17\x0f\xda\xfe\xda\xe7\x65\xbc\x71\x2c\x36\x57\x8a\x47\x12\x4c\xf1\xbd\x77\x6b\xa4\x50\x7e\x77\x7b\x22\x60\x89\xef\xcd\xf5\xb9\x0c\x97\x79\x0d\x2b\x35\x43\xcb\x3d\x24\xf1\x78\xfc\xf8\xcb\x1f\x15\x06\xe2\x78\xd8\x51\x21\xd9\x1f\xf0\xf5\x8f\x86\xa4\x50\xfa\xb1\x47\x43\xa5\xdd\x69\x14\xe8\xa3\xc0\x86\x91\xa7\x81\x50\xb4\x7c\xc0\x81\x80\x77\x7a\x9f\xc6\xc2\xa9\x8c\x05\x33\xb0\x3b\x31\xa4\xf4\xd7\x1b\x26\x55\x97\x7c\x65\xf8\x69\x1a\x84\x8e\x41\x78\xd9\xec\xc5\x11\x16\x1e\x74\x91\xf5\x56\xf5\x57\x49\x47\x5c\x92\xa9\x1e\x99\x36\xf4\xdb\xb1\x0e\xd3\x78\x02\xb0\x9b\x25\xcb\xe9\xe9\x1d\x0d\x44\x01\x42\x08\x91\x64\xd9\xdd\x37\x08\x17\xef\xf9\xe5\x0f\xbd\x46\x91\xf5\xf9\x89\x92\x37\xdd\x89\x59\x44\x1f\x9c\xee\x34\x1e\xbe\x47\x83\x32\x72\x8e\x37\xdf\xac\x69\x38\xef\x75\xb0\xda\xdb\xac\x83\x94\x2f\x39\xa6\x62\x05\x1c\x25\x9c\x49\x16\xb0\xa8\x3c\xc7\x7e\x76\x71\x3e\x6f\xb5\x24\xe7\xe8\xb7\xb9\xc7\x6c\x43\x92\xee\x21\xd4\x17\xa1\x7f\xba\x35\xfe\xae\x39\xbc\xde\xba\x69\xd9\x8e\xe1\x62\xde\x64\x7d\x16\x88\x1b\xed\x29\x11\xfd\x4f\xa9\xff\x99\x90\xc4\xf6\xf4\xf9\x6e\xe9\x28\x23\xd7\xca\xe5\xee\xee\x9f\x63\xb1\x5b\xfb\x10\xd7\x2f\x1d\xf2\xe3\xbf\xb9\xb5\x6f\xa4\x6d\x7d\x25\x79\xfb\x24\x31\xea\x56\xbe\x5d\x53\xcd\x2d\x36\xa3\x6d\xdf\xab\x1c\xb8\x6d\x6f\xc0\x98\xa7\xdd\xaa\x86\x8c\x1d\x39\xa3\x9d\x70\x2b\x9b\x68\xd9\xfd\x33\xfe\xa9\xb6\x4a\x2e\x63\x0f\xcf\x68\x27\xd9\x4c\xb9\x46\x6d\xcb\xbe\xa1\xa8\xd6\x5f\xc6\xd6\x9f\xf1\x4f\xf4\xd4\xb4\x78\xd0\xd6\xf4\x13\x3c\x3b\xac\xd0\xdc\x90\x34\xda\xc9\xb4\x9a\x1a\x8d\xbd\x93\x87\xd4\xe2\x21\x1b\xb3\x2b\xd1\xbe\xe7\x69\xd4\x53\x67\xd5\x40\xa0\xe3\x19\x3f\x6d\x1a\xbc\x0e\x86\x3c\x10\xb4\x3d\x2a\xcd\x78\x32\xe6\xab\xbd\x36\xc9\xf4\x3a\x58\xae\xc3\xf4\x47\xea\xbf\xfb\x47\xff\x0d\x00\x00\xff\xff\xd2\x32\x5a\x28\x38\x9d\x00\x00") -func v2SchemaJSONBytes() ([]byte, error) { +func v2SchemaJsonBytes() ([]byte, error) { return bindataRead( - _v2SchemaJSON, + _v2SchemaJson, "v2/schema.json", ) } -func v2SchemaJSON() (*asset, error) { - bytes, err := v2SchemaJSONBytes() +func v2SchemaJson() (*asset, error) { + bytes, err := v2SchemaJsonBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "v2/schema.json", size: 40249, mode: os.FileMode(0644), modTime: time.Unix(1567900649, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcb, 0x25, 0x27, 0xe8, 0x46, 0xae, 0x22, 0xc4, 0xf4, 0x8b, 0x1, 0x32, 0x4d, 0x1f, 0xf8, 0xdf, 0x75, 0x15, 0xc8, 0x2d, 0xc7, 0xed, 0xe, 0x7e, 0x0, 0x75, 0xc0, 0xf9, 0xd2, 0x1f, 0x75, 0x57}} + info := bindataFileInfo{name: "v2/schema.json", size: 40248, mode: os.FileMode(0640), modTime: time.Unix(1568964748, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xab, 0x88, 0x5e, 0xf, 0xbf, 0x17, 0x74, 0x0, 0xb2, 0x5a, 0x7f, 0xbc, 0x58, 0xcd, 0xc, 0x25, 0x73, 0xd5, 0x29, 0x1c, 0x7a, 0xd0, 0xce, 0x79, 0xd4, 0x89, 0x31, 0x27, 0x90, 0xf2, 0xff, 0xe6}} return a, nil } @@ -201,9 +201,9 @@ func AssetNames() []string { // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() (*asset, error){ - "jsonschema-draft-04.json": jsonschemaDraft04JSON, + "jsonschema-draft-04.json": jsonschemaDraft04Json, - "v2/schema.json": v2SchemaJSON, + "v2/schema.json": v2SchemaJson, } // AssetDir returns the file names below a certain @@ -247,9 +247,9 @@ type bintree struct { } var _bintree = &bintree{nil, map[string]*bintree{ - "jsonschema-draft-04.json": &bintree{jsonschemaDraft04JSON, map[string]*bintree{}}, + "jsonschema-draft-04.json": &bintree{jsonschemaDraft04Json, map[string]*bintree{}}, "v2": &bintree{nil, map[string]*bintree{ - "schema.json": &bintree{v2SchemaJSON, map[string]*bintree{}}, + "schema.json": &bintree{v2SchemaJson, map[string]*bintree{}}, }}, }} diff --git a/vendor/github.com/go-openapi/spec/contact_info.go b/vendor/github.com/go-openapi/spec/contact_info.go index f285970aa1..f9bf42e8dd 100644 --- a/vendor/github.com/go-openapi/spec/contact_info.go +++ b/vendor/github.com/go-openapi/spec/contact_info.go @@ -14,11 +14,41 @@ package spec +import ( + "encoding/json" + + "github.com/go-openapi/swag" +) + // ContactInfo contact information for the exposed API. // // For more information: http://goo.gl/8us55a#contactObject type ContactInfo struct { + ContactInfoProps + VendorExtensible +} + +type ContactInfoProps struct { Name string `json:"name,omitempty"` URL string `json:"url,omitempty"` Email string `json:"email,omitempty"` } + +func (c *ContactInfo) UnmarshalJSON(data []byte) error { + if err := json.Unmarshal(data, &c.ContactInfoProps); err != nil { + return err + } + return json.Unmarshal(data, &c.VendorExtensible) +} + +func (c ContactInfo) MarshalJSON() ([]byte, error) { + b1, err := json.Marshal(c.ContactInfoProps) + if err != nil { + return nil, err + } + b2, err := json.Marshal(c.VendorExtensible) + if err != nil { + return nil, err + } + return swag.ConcatJSON(b1, b2), nil +} diff --git a/vendor/github.com/go-openapi/spec/expander.go b/vendor/github.com/go-openapi/spec/expander.go index 1e7fc8c490..1f30e7f8b1 100644 --- a/vendor/github.com/go-openapi/spec/expander.go +++ b/vendor/github.com/go-openapi/spec/expander.go @@ -200,11 +200,11 @@ func ExpandSpec(spec *Swagger, options *ExpandOptions) error { return nil } +const rootBase = "root" // baseForRoot loads in the cache the root document and produces a fake "root" base path entry // for further $ref resolution func baseForRoot(root interface{}, cache ResolutionCache) string { // cache the root document to resolve $ref's - const rootBase = "root" if root != nil { base, _ := absPath(rootBase) normalizedBase := normalizeAbsPath(base) @@ -452,11 +452,12 @@ func expandPathItem(pathItem *PathItem, resolver *schemaLoader, basePath string) return err } if pathItem.Ref.String() != "" { - var err error - resolver, err = resolver.transitiveResolver(basePath, pathItem.Ref) - if resolver.shouldStopOnError(err) { + transitiveResolver, err := resolver.transitiveResolver(basePath, pathItem.Ref) + if transitiveResolver.shouldStopOnError(err) { return err } + basePath = transitiveResolver.updateBasePath(resolver, basePath) + resolver = transitiveResolver } pathItem.Ref = Ref{} diff --git a/vendor/github.com/go-openapi/spec/go.mod b/vendor/github.com/go-openapi/spec/go.mod index 02a142c03c..14e5f2dac3 100644 --- a/vendor/github.com/go-openapi/spec/go.mod +++ b/vendor/github.com/go-openapi/spec/go.mod @@ -4,14 +4,9 @@ require ( github.com/go-openapi/jsonpointer v0.19.3 github.com/go-openapi/jsonreference v0.19.2 github.com/go-openapi/swag v0.19.5 - github.com/kr/pty v1.1.5 // indirect - github.com/stretchr/objx v0.2.0 // indirect github.com/stretchr/testify v1.3.0 - golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 // indirect golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // indirect - golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f // indirect - golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59 // indirect - gopkg.in/yaml.v2 v2.2.2 + gopkg.in/yaml.v2 v2.2.4 ) go 1.13 diff --git a/vendor/github.com/go-openapi/spec/go.sum b/vendor/github.com/go-openapi/spec/go.sum index 86db601c97..c209ff9712 100644 --- a/vendor/github.com/go-openapi/spec/go.sum +++ b/vendor/github.com/go-openapi/spec/go.sum @@ -1,5 +1,3 @@ -github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= @@ -7,20 +5,12 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-openapi/jsonpointer v0.17.0 h1:nH6xp8XdXHx8dqveo0ZuJBluCO2qGrPbDNZ0dwoRHP0= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.0 h1:FTUMcX77w5rQkClIzDtTxvn6Bsa894CcrzNj2MMfeg8= -github.com/go-openapi/jsonpointer v0.19.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.0 h1:BqWKpV1dFd+AuiKlgtddwVIFQsuMpxfBDBHGfM2yNpk= -github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/swag v0.17.0 h1:iqrgMg7Q7SvtbWLlltPrkMs0UBJI6oTSs79JFRUi880= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= @@ -28,11 +18,8 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= @@ -40,35 +27,23 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58 h1:otZG8yDCO4LVps5+9bxOeNiCvgmOyt96J3roHTYs7oE= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/go-openapi/spec/license.go b/vendor/github.com/go-openapi/spec/license.go index f20961b4fd..e1529b401c 100644 --- a/vendor/github.com/go-openapi/spec/license.go +++ b/vendor/github.com/go-openapi/spec/license.go @@ -14,10 +14,40 @@ package spec +import ( + "encoding/json" + + "github.com/go-openapi/swag" +) + // License information for the exposed API. // // For more information: http://goo.gl/8us55a#licenseObject type License struct { + LicenseProps + VendorExtensible +} + +type LicenseProps struct { Name string `json:"name,omitempty"` URL string `json:"url,omitempty"` } + +func (l *License) UnmarshalJSON(data []byte) error { + if err := json.Unmarshal(data, &l.LicenseProps); err != nil { + return err + } + return json.Unmarshal(data, &l.VendorExtensible) +} + +func (l License) MarshalJSON() ([]byte, error) { + b1, err := json.Marshal(l.LicenseProps) + if err != nil { + return nil, err + } + b2, err := json.Marshal(l.VendorExtensible) + if err != nil { + return nil, err + } + return swag.ConcatJSON(b1, b2), nil +} diff --git a/vendor/github.com/go-openapi/spec/ref.go b/vendor/github.com/go-openapi/spec/ref.go index 08ff869b2f..1f31a9ead0 100644 --- a/vendor/github.com/go-openapi/spec/ref.go +++ b/vendor/github.com/go-openapi/spec/ref.go @@ -68,10 +68,12 @@ func (r *Ref) IsValidURI(basepaths ...string) bool { } if r.HasFullURL { + //#nosec rr, err := http.Get(v) if err != nil { return false } + defer rr.Body.Close() return rr.StatusCode/100 == 2 } diff --git a/vendor/github.com/go-openapi/spec/schema_loader.go b/vendor/github.com/go-openapi/spec/schema_loader.go index 9e20e96c2a..02d9966c1a 100644 --- a/vendor/github.com/go-openapi/spec/schema_loader.go +++ b/vendor/github.com/go-openapi/spec/schema_loader.go @@ -86,12 +86,7 @@ func (r *schemaLoader) transitiveResolver(basePath string, ref Ref) (*schemaLoad newOptions := r.options newOptions.RelativeBase = rootURL.String() debugLog("setting new root: %s", newOptions.RelativeBase) - resolver, err := defaultSchemaLoader(root, newOptions, r.cache, r.context) - if err != nil { - return nil, err - } - - return resolver, nil + return defaultSchemaLoader(root, newOptions, r.cache, r.context) } func (r *schemaLoader) updateBasePath(transitive *schemaLoader, basePath string) string { @@ -154,7 +149,15 @@ func (r *schemaLoader) load(refURL *url.URL) (interface{}, url.URL, bool, error) toFetch := *refURL toFetch.Fragment = "" - normalized := normalizeAbsPath(toFetch.String()) + var err error + path := toFetch.String() + if path == rootBase { + path, err = absPath(rootBase) + if err != nil { + return nil, url.URL{}, false, err + } + } + normalized := normalizeAbsPath(path) data, fromCache := r.cache.Get(normalized) if !fromCache { diff --git a/vendor/github.com/go-openapi/strfmt/.golangci.yml b/vendor/github.com/go-openapi/strfmt/.golangci.yml index f260ce7e5c..03ffa31a4e 100644 --- a/vendor/github.com/go-openapi/strfmt/.golangci.yml +++ b/vendor/github.com/go-openapi/strfmt/.golangci.yml @@ -20,6 +20,11 @@ linters: - lll - gochecknoinits - gochecknoglobals + - godox + - gocognit + - whitespace + - wsl + - funlen issues: exclude-rules: @@ -27,4 +32,5 @@ issues: text: "should be .*ObjectID" linters: - golint + - stylecheck diff --git a/vendor/github.com/go-openapi/strfmt/README.md b/vendor/github.com/go-openapi/strfmt/README.md index 87357cd024..b2645ce18a 100644 --- a/vendor/github.com/go-openapi/strfmt/README.md +++ b/vendor/github.com/go-openapi/strfmt/README.md @@ -43,6 +43,19 @@ It also provides convenient extensions to go-openapi users. > It does not provide validation for numerical values with swagger format extension for JSON types "number" or > "integer" (e.g. float, double, int32...). +## Type conversion + +All types defined here are stringers and may be converted to strings with `.String()`. +Note that most types defined by this package may be converted directly to string like `string(Email{})`. + +`Date` and `DateTime` may be converted directly to `time.Time` like `time.Time(Time{})`. +Similarly, you can convert `Duration` to `time.Duration` as in `time.Duration(Duration{})` + +## Using pointers + +The `conv` subpackage provides helpers to convert the types to and from pointers, just like `go-openapi/swag` does +with primitive types. + ## Format types Types defined in strfmt expose marshaling and validation capabilities. diff --git a/vendor/github.com/go-openapi/strfmt/date.go b/vendor/github.com/go-openapi/strfmt/date.go index 2959e65730..15029ffa2f 100644 --- a/vendor/github.com/go-openapi/strfmt/date.go +++ b/vendor/github.com/go-openapi/strfmt/date.go @@ -151,3 +151,32 @@ func (d *Date) DeepCopy() *Date { d.DeepCopyInto(out) return out } + +// GobEncode implements the gob.GobEncoder interface. +func (d Date) GobEncode() ([]byte, error) { + return d.MarshalBinary() +} + +// GobDecode implements the gob.GobDecoder interface. +func (d *Date) GobDecode(data []byte) error { + return d.UnmarshalBinary(data) +} + +// MarshalBinary implements the encoding.BinaryMarshaler interface. +func (d Date) MarshalBinary() ([]byte, error) { + return time.Time(d).MarshalBinary() +} + +// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface. +func (d *Date) UnmarshalBinary(data []byte) error { + var original time.Time + + err := original.UnmarshalBinary(data) + if err != nil { + return err + } + + *d = Date(original) + + return nil +} diff --git a/vendor/github.com/go-openapi/strfmt/go.mod b/vendor/github.com/go-openapi/strfmt/go.mod index 78c8489b20..eaf7544712 100644 --- a/vendor/github.com/go-openapi/strfmt/go.mod +++ b/vendor/github.com/go-openapi/strfmt/go.mod @@ -11,3 +11,5 @@ require ( github.com/tidwall/pretty v1.0.0 // indirect go.mongodb.org/mongo-driver v1.0.3 ) + +go 1.13 diff --git a/vendor/github.com/go-openapi/strfmt/time.go b/vendor/github.com/go-openapi/strfmt/time.go index f9151259ed..0b2f52d249 100644 --- a/vendor/github.com/go-openapi/strfmt/time.go +++ b/vendor/github.com/go-openapi/strfmt/time.go @@ -4,7 +4,7 @@ // 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 +// 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, @@ -16,14 +16,16 @@ package strfmt import ( "database/sql/driver" + "encoding/binary" "encoding/json" - "errors" "fmt" "regexp" "strings" "time" "go.mongodb.org/mongo-driver/bson" + + "go.mongodb.org/mongo-driver/bson/bsontype" ) func init() { @@ -57,12 +59,16 @@ const ( RFC3339Micro = "2006-01-02T15:04:05.000000Z07:00" // ISO8601LocalTime represents a ISO8601 format to ISO8601 in local time (no timezone) ISO8601LocalTime = "2006-01-02T15:04:05" + // ISO8601TimeWithReducedPrecision represents a ISO8601 format with reduced precision (dropped secs) + ISO8601TimeWithReducedPrecision = "2006-01-02T15:04Z" + // ISO8601TimeWithReducedPrecision represents a ISO8601 format with reduced precision and no timezone (dropped seconds + no timezone) + ISO8601TimeWithReducedPrecisionLocaltime = "2006-01-02T15:04" // DateTimePattern pattern to match for the date-time format from http://tools.ietf.org/html/rfc3339#section-5.6 DateTimePattern = `^([0-9]{2}):([0-9]{2}):([0-9]{2})(.[0-9]+)?(z|([+-][0-9]{2}:[0-9]{2}))$` ) var ( - dateTimeFormats = []string{RFC3339Micro, RFC3339Millis, time.RFC3339, time.RFC3339Nano, ISO8601LocalTime} + dateTimeFormats = []string{RFC3339Micro, RFC3339Millis, time.RFC3339, time.RFC3339Nano, ISO8601LocalTime, ISO8601TimeWithReducedPrecision, ISO8601TimeWithReducedPrecisionLocaltime} rxDateTime = regexp.MustCompile(DateTimePattern) // MarshalFormat sets the time resolution format used for marshaling time (set to milliseconds) MarshalFormat = RFC3339Millis @@ -165,26 +171,51 @@ func (t *DateTime) UnmarshalJSON(data []byte) error { return nil } +// MarshalBSON renders the DateTime as a BSON document func (t DateTime) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": t.String()}) + return bson.Marshal(bson.M{"data": t}) } +// UnmarshalBSON reads the DateTime from a BSON document func (t *DateTime) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err + var obj struct { + Data DateTime } - if data, ok := m["data"].(string); ok { - rd, err := ParseDateTime(data) - if err != nil { - return err - } - *t = rd - return nil + if err := bson.Unmarshal(data, &obj); err != nil { + return err } - return errors.New("couldn't unmarshal bson bytes value as Date") + *t = obj.Data + + return nil +} + +// MarshalBSONValue is an interface implemented by types that can marshal themselves +// into a BSON document represented as bytes. The bytes returned must be a valid +// BSON document if the error is nil. +// Marshals a DateTime as a bsontype.DateTime, an int64 representing +// milliseconds since epoch. +func (t DateTime) MarshalBSONValue() (bsontype.Type, []byte, error) { + // UnixNano cannot be used, the result of calling UnixNano on the zero + // Time is undefined. + i64 := time.Time(t).Unix() * 1000 + buf := make([]byte, 8) + binary.LittleEndian.PutUint64(buf, uint64(i64)) + + return bsontype.DateTime, buf, nil +} + +// UnmarshalBSONValue is an interface implemented by types that can unmarshal a +// BSON value representation of themselves. The BSON bytes and type can be +// assumed to be valid. UnmarshalBSONValue must copy the BSON value bytes if it +// wishes to retain the data after returning. +func (t *DateTime) UnmarshalBSONValue(tpe bsontype.Type, data []byte) error { + i64 := int64(binary.LittleEndian.Uint64(data)) + // TODO: Use bsonprim.DateTime.Time() method + *t = DateTime(time.Unix(i64/1000, i64%1000*1000000)) + + return nil } // DeepCopyInto copies the receiver and writes its value into out. @@ -201,3 +232,32 @@ func (t *DateTime) DeepCopy() *DateTime { t.DeepCopyInto(out) return out } + +// GobEncode implements the gob.GobEncoder interface. +func (t DateTime) GobEncode() ([]byte, error) { + return t.MarshalBinary() +} + +// GobDecode implements the gob.GobDecoder interface. +func (t *DateTime) GobDecode(data []byte) error { + return t.UnmarshalBinary(data) +} + +// MarshalBinary implements the encoding.BinaryMarshaler interface. +func (t DateTime) MarshalBinary() ([]byte, error) { + return time.Time(t).MarshalBinary() +} + +// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface. +func (t *DateTime) UnmarshalBinary(data []byte) error { + var original time.Time + + err := original.UnmarshalBinary(data) + if err != nil { + return err + } + + *t = DateTime(original) + + return nil +} diff --git a/vendor/github.com/go-openapi/swag/.travis.yml b/vendor/github.com/go-openapi/swag/.travis.yml index aa26d8763a..f1a3f80b35 100644 --- a/vendor/github.com/go-openapi/swag/.travis.yml +++ b/vendor/github.com/go-openapi/swag/.travis.yml @@ -1,12 +1,10 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.11.x -- 1.12.x +- 1.13.x +- 1.14.x install: - GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on language: go notifications: slack: diff --git a/vendor/github.com/go-openapi/swag/convert.go b/vendor/github.com/go-openapi/swag/convert.go index 7da35c316e..fc085aeb8e 100644 --- a/vendor/github.com/go-openapi/swag/convert.go +++ b/vendor/github.com/go-openapi/swag/convert.go @@ -88,7 +88,7 @@ func ConvertFloat64(str string) (float64, error) { return strconv.ParseFloat(str, 64) } -// ConvertInt8 turn a string into int8 boolean +// ConvertInt8 turn a string into an int8 func ConvertInt8(str string) (int8, error) { i, err := strconv.ParseInt(str, 10, 8) if err != nil { @@ -97,7 +97,7 @@ func ConvertInt8(str string) (int8, error) { return int8(i), nil } -// ConvertInt16 turn a string into a int16 +// ConvertInt16 turn a string into an int16 func ConvertInt16(str string) (int16, error) { i, err := strconv.ParseInt(str, 10, 16) if err != nil { @@ -106,7 +106,7 @@ func ConvertInt16(str string) (int16, error) { return int16(i), nil } -// ConvertInt32 turn a string into a int32 +// ConvertInt32 turn a string into an int32 func ConvertInt32(str string) (int32, error) { i, err := strconv.ParseInt(str, 10, 32) if err != nil { @@ -115,12 +115,12 @@ func ConvertInt32(str string) (int32, error) { return int32(i), nil } -// ConvertInt64 turn a string into a int64 +// ConvertInt64 turn a string into an int64 func ConvertInt64(str string) (int64, error) { return strconv.ParseInt(str, 10, 64) } -// ConvertUint8 turn a string into a uint8 +// ConvertUint8 turn a string into an uint8 func ConvertUint8(str string) (uint8, error) { i, err := strconv.ParseUint(str, 10, 8) if err != nil { @@ -129,7 +129,7 @@ func ConvertUint8(str string) (uint8, error) { return uint8(i), nil } -// ConvertUint16 turn a string into a uint16 +// ConvertUint16 turn a string into an uint16 func ConvertUint16(str string) (uint16, error) { i, err := strconv.ParseUint(str, 10, 16) if err != nil { @@ -138,7 +138,7 @@ func ConvertUint16(str string) (uint16, error) { return uint16(i), nil } -// ConvertUint32 turn a string into a uint32 +// ConvertUint32 turn a string into an uint32 func ConvertUint32(str string) (uint32, error) { i, err := strconv.ParseUint(str, 10, 32) if err != nil { @@ -147,7 +147,7 @@ func ConvertUint32(str string) (uint32, error) { return uint32(i), nil } -// ConvertUint64 turn a string into a uint64 +// ConvertUint64 turn a string into an uint64 func ConvertUint64(str string) (uint64, error) { return strconv.ParseUint(str, 10, 64) } diff --git a/vendor/github.com/go-openapi/swag/convert_types.go b/vendor/github.com/go-openapi/swag/convert_types.go index c95e4e78bd..c49cc473a8 100644 --- a/vendor/github.com/go-openapi/swag/convert_types.go +++ b/vendor/github.com/go-openapi/swag/convert_types.go @@ -181,12 +181,12 @@ func IntValueMap(src map[string]*int) map[string]int { return dst } -// Int32 returns a pointer to of the int64 value passed in. +// Int32 returns a pointer to of the int32 value passed in. func Int32(v int32) *int32 { return &v } -// Int32Value returns the value of the int64 pointer passed in or +// Int32Value returns the value of the int32 pointer passed in or // 0 if the pointer is nil. func Int32Value(v *int32) int32 { if v != nil { @@ -195,7 +195,7 @@ func Int32Value(v *int32) int32 { return 0 } -// Int32Slice converts a slice of int64 values into a slice of +// Int32Slice converts a slice of int32 values into a slice of // int32 pointers func Int32Slice(src []int32) []*int32 { dst := make([]*int32, len(src)) @@ -299,13 +299,80 @@ func Int64ValueMap(src map[string]*int64) map[string]int64 { return dst } -// Uint returns a pouinter to of the uint value passed in. +// Uint16 returns a pointer to of the uint16 value passed in. +func Uint16(v uint16) *uint16 { + return &v +} + +// Uint16Value returns the value of the uint16 pointer passed in or +// 0 if the pointer is nil. +func Uint16Value(v *uint16) uint16 { + if v != nil { + return *v + } + + return 0 +} + +// Uint16Slice converts a slice of uint16 values into a slice of +// uint16 pointers +func Uint16Slice(src []uint16) []*uint16 { + dst := make([]*uint16, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + + return dst +} + +// Uint16ValueSlice converts a slice of uint16 pointers into a slice of +// uint16 values +func Uint16ValueSlice(src []*uint16) []uint16 { + dst := make([]uint16, len(src)) + + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + + return dst +} + +// Uint16Map converts a string map of uint16 values into a string +// map of uint16 pointers +func Uint16Map(src map[string]uint16) map[string]*uint16 { + dst := make(map[string]*uint16) + + for k, val := range src { + v := val + dst[k] = &v + } + + return dst +} + +// Uint16ValueMap converts a string map of uint16 pointers into a string +// map of uint16 values +func Uint16ValueMap(src map[string]*uint16) map[string]uint16 { + dst := make(map[string]uint16) + + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + + return dst +} + +// Uint returns a pointer to of the uint value passed in. func Uint(v uint) *uint { return &v } -// UintValue returns the value of the uint pouinter passed in or -// 0 if the pouinter is nil. +// UintValue returns the value of the uint pointer passed in or +// 0 if the pointer is nil. func UintValue(v *uint) uint { if v != nil { return *v @@ -313,8 +380,8 @@ func UintValue(v *uint) uint { return 0 } -// UintSlice converts a slice of uint values uinto a slice of -// uint pouinters +// UintSlice converts a slice of uint values into a slice of +// uint pointers func UintSlice(src []uint) []*uint { dst := make([]*uint, len(src)) for i := 0; i < len(src); i++ { @@ -323,7 +390,7 @@ func UintSlice(src []uint) []*uint { return dst } -// UintValueSlice converts a slice of uint pouinters uinto a slice of +// UintValueSlice converts a slice of uint pointers into a slice of // uint values func UintValueSlice(src []*uint) []uint { dst := make([]uint, len(src)) @@ -335,8 +402,8 @@ func UintValueSlice(src []*uint) []uint { return dst } -// UintMap converts a string map of uint values uinto a string -// map of uint pouinters +// UintMap converts a string map of uint values into a string +// map of uint pointers func UintMap(src map[string]uint) map[string]*uint { dst := make(map[string]*uint) for k, val := range src { @@ -346,7 +413,7 @@ func UintMap(src map[string]uint) map[string]*uint { return dst } -// UintValueMap converts a string map of uint pouinters uinto a string +// UintValueMap converts a string map of uint pointers into a string // map of uint values func UintValueMap(src map[string]*uint) map[string]uint { dst := make(map[string]uint) @@ -358,13 +425,13 @@ func UintValueMap(src map[string]*uint) map[string]uint { return dst } -// Uint32 returns a pouinter to of the uint64 value passed in. +// Uint32 returns a pointer to of the uint32 value passed in. func Uint32(v uint32) *uint32 { return &v } -// Uint32Value returns the value of the uint64 pouinter passed in or -// 0 if the pouinter is nil. +// Uint32Value returns the value of the uint32 pointer passed in or +// 0 if the pointer is nil. func Uint32Value(v *uint32) uint32 { if v != nil { return *v @@ -372,8 +439,8 @@ func Uint32Value(v *uint32) uint32 { return 0 } -// Uint32Slice converts a slice of uint64 values uinto a slice of -// uint32 pouinters +// Uint32Slice converts a slice of uint32 values into a slice of +// uint32 pointers func Uint32Slice(src []uint32) []*uint32 { dst := make([]*uint32, len(src)) for i := 0; i < len(src); i++ { @@ -382,7 +449,7 @@ func Uint32Slice(src []uint32) []*uint32 { return dst } -// Uint32ValueSlice converts a slice of uint32 pouinters uinto a slice of +// Uint32ValueSlice converts a slice of uint32 pointers into a slice of // uint32 values func Uint32ValueSlice(src []*uint32) []uint32 { dst := make([]uint32, len(src)) @@ -394,8 +461,8 @@ func Uint32ValueSlice(src []*uint32) []uint32 { return dst } -// Uint32Map converts a string map of uint32 values uinto a string -// map of uint32 pouinters +// Uint32Map converts a string map of uint32 values into a string +// map of uint32 pointers func Uint32Map(src map[string]uint32) map[string]*uint32 { dst := make(map[string]*uint32) for k, val := range src { @@ -405,7 +472,7 @@ func Uint32Map(src map[string]uint32) map[string]*uint32 { return dst } -// Uint32ValueMap converts a string map of uint32 pouinters uinto a string +// Uint32ValueMap converts a string map of uint32 pointers into a string // map of uint32 values func Uint32ValueMap(src map[string]*uint32) map[string]uint32 { dst := make(map[string]uint32) @@ -417,13 +484,13 @@ func Uint32ValueMap(src map[string]*uint32) map[string]uint32 { return dst } -// Uint64 returns a pouinter to of the uint64 value passed in. +// Uint64 returns a pointer to of the uint64 value passed in. func Uint64(v uint64) *uint64 { return &v } -// Uint64Value returns the value of the uint64 pouinter passed in or -// 0 if the pouinter is nil. +// Uint64Value returns the value of the uint64 pointer passed in or +// 0 if the pointer is nil. func Uint64Value(v *uint64) uint64 { if v != nil { return *v @@ -431,8 +498,8 @@ func Uint64Value(v *uint64) uint64 { return 0 } -// Uint64Slice converts a slice of uint64 values uinto a slice of -// uint64 pouinters +// Uint64Slice converts a slice of uint64 values into a slice of +// uint64 pointers func Uint64Slice(src []uint64) []*uint64 { dst := make([]*uint64, len(src)) for i := 0; i < len(src); i++ { @@ -441,7 +508,7 @@ func Uint64Slice(src []uint64) []*uint64 { return dst } -// Uint64ValueSlice converts a slice of uint64 pouinters uinto a slice of +// Uint64ValueSlice converts a slice of uint64 pointers into a slice of // uint64 values func Uint64ValueSlice(src []*uint64) []uint64 { dst := make([]uint64, len(src)) @@ -453,8 +520,8 @@ func Uint64ValueSlice(src []*uint64) []uint64 { return dst } -// Uint64Map converts a string map of uint64 values uinto a string -// map of uint64 pouinters +// Uint64Map converts a string map of uint64 values into a string +// map of uint64 pointers func Uint64Map(src map[string]uint64) map[string]*uint64 { dst := make(map[string]*uint64) for k, val := range src { @@ -464,7 +531,7 @@ func Uint64Map(src map[string]uint64) map[string]*uint64 { return dst } -// Uint64ValueMap converts a string map of uint64 pouinters uinto a string +// Uint64ValueMap converts a string map of uint64 pointers into a string // map of uint64 values func Uint64ValueMap(src map[string]*uint64) map[string]uint64 { dst := make(map[string]uint64) @@ -476,6 +543,74 @@ func Uint64ValueMap(src map[string]*uint64) map[string]uint64 { return dst } +// Float32 returns a pointer to of the float32 value passed in. +func Float32(v float32) *float32 { + return &v +} + +// Float32Value returns the value of the float32 pointer passed in or +// 0 if the pointer is nil. +func Float32Value(v *float32) float32 { + if v != nil { + return *v + } + + return 0 +} + +// Float32Slice converts a slice of float32 values into a slice of +// float32 pointers +func Float32Slice(src []float32) []*float32 { + dst := make([]*float32, len(src)) + + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + + return dst +} + +// Float32ValueSlice converts a slice of float32 pointers into a slice of +// float32 values +func Float32ValueSlice(src []*float32) []float32 { + dst := make([]float32, len(src)) + + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + + return dst +} + +// Float32Map converts a string map of float32 values into a string +// map of float32 pointers +func Float32Map(src map[string]float32) map[string]*float32 { + dst := make(map[string]*float32) + + for k, val := range src { + v := val + dst[k] = &v + } + + return dst +} + +// Float32ValueMap converts a string map of float32 pointers into a string +// map of float32 values +func Float32ValueMap(src map[string]*float32) map[string]float32 { + dst := make(map[string]float32) + + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + + return dst +} + // Float64 returns a pointer to of the float64 value passed in. func Float64(v float64) *float64 { return &v diff --git a/vendor/github.com/go-openapi/swag/go.mod b/vendor/github.com/go-openapi/swag/go.mod index 15bbb08222..4aef463e42 100644 --- a/vendor/github.com/go-openapi/swag/go.mod +++ b/vendor/github.com/go-openapi/swag/go.mod @@ -6,9 +6,11 @@ require ( github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 github.com/stretchr/testify v1.3.0 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect - gopkg.in/yaml.v2 v2.2.2 + gopkg.in/yaml.v2 v2.2.4 ) replace github.com/golang/lint => golang.org/x/lint v0.0.0-20190409202823-959b441ac422 replace sourcegraph.com/sourcegraph/go-diff => github.com/sourcegraph/go-diff v0.5.1 + +go 1.13 diff --git a/vendor/github.com/go-openapi/swag/go.sum b/vendor/github.com/go-openapi/swag/go.sum index 33469f54ac..e8a80bacf0 100644 --- a/vendor/github.com/go-openapi/swag/go.sum +++ b/vendor/github.com/go-openapi/swag/go.sum @@ -16,5 +16,5 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/go-openapi/swag/json.go b/vendor/github.com/go-openapi/swag/json.go index edf93d84c6..7e9902ca31 100644 --- a/vendor/github.com/go-openapi/swag/json.go +++ b/vendor/github.com/go-openapi/swag/json.go @@ -51,7 +51,7 @@ type ejUnmarshaler interface { UnmarshalEasyJSON(w *jlexer.Lexer) } -// WriteJSON writes json data, prefers finding an appropriate interface to short-circuit the marshaller +// WriteJSON writes json data, prefers finding an appropriate interface to short-circuit the marshaler // so it takes the fastest option available. func WriteJSON(data interface{}) ([]byte, error) { if d, ok := data.(ejMarshaler); ok { @@ -65,8 +65,8 @@ func WriteJSON(data interface{}) ([]byte, error) { return json.Marshal(data) } -// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaller -// so it takes the fastes option available +// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaler +// so it takes the fastest option available func ReadJSON(data []byte, value interface{}) error { trimmedData := bytes.Trim(data, "\x00") if d, ok := value.(ejUnmarshaler); ok { @@ -189,7 +189,7 @@ func FromDynamicJSON(data, target interface{}) error { return json.Unmarshal(b, target) } -// NameProvider represents an object capabale of translating from go property names +// NameProvider represents an object capable of translating from go property names // to json property names // This type is thread-safe. type NameProvider struct { diff --git a/vendor/github.com/go-openapi/swag/loading.go b/vendor/github.com/go-openapi/swag/loading.go index 70f4fb361c..04160b89ba 100644 --- a/vendor/github.com/go-openapi/swag/loading.go +++ b/vendor/github.com/go-openapi/swag/loading.go @@ -27,6 +27,15 @@ import ( // LoadHTTPTimeout the default timeout for load requests var LoadHTTPTimeout = 30 * time.Second +// LoadHTTPBasicAuthUsername the username to use when load requests require basic auth +var LoadHTTPBasicAuthUsername = "" + +// LoadHTTPBasicAuthPassword the password to use when load requests require basic auth +var LoadHTTPBasicAuthPassword = "" + +// LoadHTTPCustomHeaders an optional collection of custom HTTP headers for load requests +var LoadHTTPCustomHeaders = map[string]string{} + // LoadFromFileOrHTTP loads the bytes from a file or a remote http server based on the path passed in func LoadFromFileOrHTTP(path string) ([]byte, error) { return LoadStrategy(path, ioutil.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(path) @@ -59,6 +68,15 @@ func loadHTTPBytes(timeout time.Duration) func(path string) ([]byte, error) { if err != nil { return nil, err } + + if LoadHTTPBasicAuthUsername != "" && LoadHTTPBasicAuthPassword != "" { + req.SetBasicAuth(LoadHTTPBasicAuthUsername, LoadHTTPBasicAuthPassword) + } + + for key, val := range LoadHTTPCustomHeaders { + req.Header.Set(key, val) + } + resp, err := client.Do(req) defer func() { if resp != nil { diff --git a/vendor/github.com/go-openapi/validate/.golangci.yml b/vendor/github.com/go-openapi/validate/.golangci.yml index c2c5071322..dc8178c809 100644 --- a/vendor/github.com/go-openapi/validate/.golangci.yml +++ b/vendor/github.com/go-openapi/validate/.golangci.yml @@ -4,17 +4,25 @@ linters-settings: golint: min-confidence: 0 gocyclo: - min-complexity: 25 + min-complexity: 50 maligned: suggest-new: true dupl: threshold: 100 goconst: min-len: 2 - min-occurrences: 2 + min-occurrences: 3 linters: enable-all: true disable: - maligned - lll + - godox + - gocognit + - whitespace + - wsl + - funlen + - gochecknoglobals + - gochecknoinits + - scopelint diff --git a/vendor/github.com/go-openapi/validate/.travis.yml b/vendor/github.com/go-openapi/validate/.travis.yml index dd3a4b29fd..db0bb78f5d 100644 --- a/vendor/github.com/go-openapi/validate/.travis.yml +++ b/vendor/github.com/go-openapi/validate/.travis.yml @@ -1,12 +1,10 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.11.x -- 1.12.x +- 1.13.x +- 1.14.x install: - GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on language: go notifications: slack: diff --git a/vendor/github.com/go-openapi/validate/default_validator.go b/vendor/github.com/go-openapi/validate/default_validator.go index 35c631be6d..26d54b7c23 100644 --- a/vendor/github.com/go-openapi/validate/default_validator.go +++ b/vendor/github.com/go-openapi/validate/default_validator.go @@ -33,14 +33,8 @@ func (d *defaultValidator) resetVisited() { d.visitedSchemas = map[string]bool{} } -// beingVisited asserts a schema is being visited -func (d *defaultValidator) beingVisited(path string) { - d.visitedSchemas[path] = true -} - -// isVisited tells if a path has already been visited -func (d *defaultValidator) isVisited(path string) bool { - found := d.visitedSchemas[path] +func isVisited(path string, visitedSchemas map[string]bool) bool { + found := visitedSchemas[path] if !found { // search for overlapping paths frags := strings.Split(path, ".") @@ -70,6 +64,16 @@ func (d *defaultValidator) isVisited(path string) bool { return found } +// beingVisited asserts a schema is being visited +func (d *defaultValidator) beingVisited(path string) { + d.visitedSchemas[path] = true +} + +// isVisited tells if a path has already been visited +func (d *defaultValidator) isVisited(path string) bool { + return isVisited(path, d.visitedSchemas) +} + // Validate validates the default values declared in the swagger spec func (d *defaultValidator) Validate() (errs *Result) { errs = new(Result) @@ -89,64 +93,60 @@ func (d *defaultValidator) validateDefaultValueValidAgainstSchema() *Result { s := d.SpecValidator for method, pathItem := range s.analyzer.Operations() { - if pathItem != nil { // Safeguard - for path, op := range pathItem { - // parameters - for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { - if param.Default != nil && param.Required { - res.AddWarnings(requiredHasDefaultMsg(param.Name, param.In)) - } + for path, op := range pathItem { + // parameters + for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { + if param.Default != nil && param.Required { + res.AddWarnings(requiredHasDefaultMsg(param.Name, param.In)) + } - // reset explored schemas to get depth-first recursive-proof exploration - d.resetVisited() + // reset explored schemas to get depth-first recursive-proof exploration + d.resetVisited() - // Check simple parameters first - // default values provided must validate against their inline definition (no explicit schema) - if param.Default != nil && param.Schema == nil { - // check param default value is valid - red := NewParamValidator(¶m, s.KnownFormats).Validate(param.Default) - if red.HasErrorsOrWarnings() { - res.AddErrors(defaultValueDoesNotValidateMsg(param.Name, param.In)) - res.Merge(red) - } + // Check simple parameters first + // default values provided must validate against their inline definition (no explicit schema) + if param.Default != nil && param.Schema == nil { + // check param default value is valid + red := NewParamValidator(¶m, s.KnownFormats).Validate(param.Default) + if red.HasErrorsOrWarnings() { + res.AddErrors(defaultValueDoesNotValidateMsg(param.Name, param.In)) + res.Merge(red) } + } - // Recursively follows Items and Schemas - if param.Items != nil { - red := d.validateDefaultValueItemsAgainstSchema(param.Name, param.In, ¶m, param.Items) - if red.HasErrorsOrWarnings() { - res.AddErrors(defaultValueItemsDoesNotValidateMsg(param.Name, param.In)) - res.Merge(red) - } + // Recursively follows Items and Schemas + if param.Items != nil { + red := d.validateDefaultValueItemsAgainstSchema(param.Name, param.In, ¶m, param.Items) + if red.HasErrorsOrWarnings() { + res.AddErrors(defaultValueItemsDoesNotValidateMsg(param.Name, param.In)) + res.Merge(red) } + } - if param.Schema != nil { - // Validate default value against schema - red := d.validateDefaultValueSchemaAgainstSchema(param.Name, param.In, param.Schema) - if red.HasErrorsOrWarnings() { - res.AddErrors(defaultValueDoesNotValidateMsg(param.Name, param.In)) - res.Merge(red) - } + if param.Schema != nil { + // Validate default value against schema + red := d.validateDefaultValueSchemaAgainstSchema(param.Name, param.In, param.Schema) + if red.HasErrorsOrWarnings() { + res.AddErrors(defaultValueDoesNotValidateMsg(param.Name, param.In)) + res.Merge(red) } } + } - if op.Responses != nil { - if op.Responses.Default != nil { - // Same constraint on default Response - res.Merge(d.validateDefaultInResponse(op.Responses.Default, "default", path, 0, op.ID)) - } - // Same constraint on regular Responses - if op.Responses.StatusCodeResponses != nil { // Safeguard - for code, r := range op.Responses.StatusCodeResponses { - res.Merge(d.validateDefaultInResponse(&r, "response", path, code, op.ID)) - } - } - } else { - // Empty op.ID means there is no meaningful operation: no need to report a specific message - if op.ID != "" { - res.AddErrors(noValidResponseMsg(op.ID)) + if op.Responses != nil { + if op.Responses.Default != nil { + // Same constraint on default Response + res.Merge(d.validateDefaultInResponse(op.Responses.Default, jsonDefault, path, 0, op.ID)) + } + // Same constraint on regular Responses + if op.Responses.StatusCodeResponses != nil { // Safeguard + for code, r := range op.Responses.StatusCodeResponses { + res.Merge(d.validateDefaultInResponse(&r, "response", path, code, op.ID)) } } + } else if op.ID != "" { + // Empty op.ID means there is no meaningful operation: no need to report a specific message + res.AddErrors(noValidResponseMsg(op.ID)) } } } @@ -170,6 +170,7 @@ func (d *defaultValidator) validateDefaultInResponse(resp *spec.Response, respon responseName, responseCodeAsStr := responseHelp.responseMsgVariants(responseType, responseCode) + // nolint: dupl if response.Headers != nil { // Safeguard for nm, h := range response.Headers { // reset explored schemas to get depth-first recursive-proof exploration @@ -223,7 +224,7 @@ func (d *defaultValidator) validateDefaultValueSchemaAgainstSchema(path, in stri s := d.SpecValidator if schema.Default != nil { - res.Merge(NewSchemaValidator(schema, s.spec.Spec(), path+".default", s.KnownFormats).Validate(schema.Default)) + res.Merge(NewSchemaValidator(schema, s.spec.Spec(), path+".default", s.KnownFormats, SwaggerSchema(true)).Validate(schema.Default)) } if schema.Items != nil { if schema.Items.Schema != nil { @@ -260,6 +261,8 @@ func (d *defaultValidator) validateDefaultValueSchemaAgainstSchema(path, in stri return res } +// TODO: Temporary duplicated code. Need to refactor with examples +// nolint: dupl func (d *defaultValidator) validateDefaultValueItemsAgainstSchema(path, in string, root interface{}, items *spec.Items) *Result { res := new(Result) s := d.SpecValidator diff --git a/vendor/github.com/go-openapi/validate/example_validator.go b/vendor/github.com/go-openapi/validate/example_validator.go index b2acf1055c..1303591751 100644 --- a/vendor/github.com/go-openapi/validate/example_validator.go +++ b/vendor/github.com/go-openapi/validate/example_validator.go @@ -16,7 +16,6 @@ package validate import ( "fmt" - "strings" "github.com/go-openapi/spec" ) @@ -39,34 +38,7 @@ func (ex *exampleValidator) beingVisited(path string) { // isVisited tells if a path has already been visited func (ex *exampleValidator) isVisited(path string) bool { - found := ex.visitedSchemas[path] - if !found { - // search for overlapping paths - frags := strings.Split(path, ".") - if len(frags) < 2 { - // shortcut exit on smaller paths - return found - } - last := len(frags) - 1 - var currentFragStr, parent string - for i := range frags { - if i == 0 { - currentFragStr = frags[last] - } else { - currentFragStr = strings.Join([]string{frags[last-i], currentFragStr}, ".") - } - if i < last { - parent = strings.Join(frags[0:last-i], ".") - } else { - parent = "" - } - if strings.HasSuffix(parent, currentFragStr) { - found = true - break - } - } - } - return found + return isVisited(path, ex.visitedSchemas) } // Validate validates the example values declared in the swagger spec @@ -97,64 +69,60 @@ func (ex *exampleValidator) validateExampleValueValidAgainstSchema() *Result { s := ex.SpecValidator for method, pathItem := range s.analyzer.Operations() { - if pathItem != nil { // Safeguard - for path, op := range pathItem { - // parameters - for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { + for path, op := range pathItem { + // parameters + for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { - // As of swagger 2.0, Examples are not supported in simple parameters - // However, it looks like it is supported by go-openapi + // As of swagger 2.0, Examples are not supported in simple parameters + // However, it looks like it is supported by go-openapi - // reset explored schemas to get depth-first recursive-proof exploration - ex.resetVisited() + // reset explored schemas to get depth-first recursive-proof exploration + ex.resetVisited() - // Check simple parameters first - // default values provided must validate against their inline definition (no explicit schema) - if param.Example != nil && param.Schema == nil { - // check param default value is valid - red := NewParamValidator(¶m, s.KnownFormats).Validate(param.Example) - if red.HasErrorsOrWarnings() { - res.AddWarnings(exampleValueDoesNotValidateMsg(param.Name, param.In)) - res.MergeAsWarnings(red) - } + // Check simple parameters first + // default values provided must validate against their inline definition (no explicit schema) + if param.Example != nil && param.Schema == nil { + // check param default value is valid + red := NewParamValidator(¶m, s.KnownFormats).Validate(param.Example) + if red.HasErrorsOrWarnings() { + res.AddWarnings(exampleValueDoesNotValidateMsg(param.Name, param.In)) + res.MergeAsWarnings(red) } + } - // Recursively follows Items and Schemas - if param.Items != nil { - red := ex.validateExampleValueItemsAgainstSchema(param.Name, param.In, ¶m, param.Items) - if red.HasErrorsOrWarnings() { - res.AddWarnings(exampleValueItemsDoesNotValidateMsg(param.Name, param.In)) - res.Merge(red) - } + // Recursively follows Items and Schemas + if param.Items != nil { + red := ex.validateExampleValueItemsAgainstSchema(param.Name, param.In, ¶m, param.Items) + if red.HasErrorsOrWarnings() { + res.AddWarnings(exampleValueItemsDoesNotValidateMsg(param.Name, param.In)) + res.Merge(red) } + } - if param.Schema != nil { - // Validate example value against schema - red := ex.validateExampleValueSchemaAgainstSchema(param.Name, param.In, param.Schema) - if red.HasErrorsOrWarnings() { - res.AddWarnings(exampleValueDoesNotValidateMsg(param.Name, param.In)) - res.Merge(red) - } + if param.Schema != nil { + // Validate example value against schema + red := ex.validateExampleValueSchemaAgainstSchema(param.Name, param.In, param.Schema) + if red.HasErrorsOrWarnings() { + res.AddWarnings(exampleValueDoesNotValidateMsg(param.Name, param.In)) + res.Merge(red) } } + } - if op.Responses != nil { - if op.Responses.Default != nil { - // Same constraint on default Response - res.Merge(ex.validateExampleInResponse(op.Responses.Default, "default", path, 0, op.ID)) - } - // Same constraint on regular Responses - if op.Responses.StatusCodeResponses != nil { // Safeguard - for code, r := range op.Responses.StatusCodeResponses { - res.Merge(ex.validateExampleInResponse(&r, "response", path, code, op.ID)) - } - } - } else { - // Empty op.ID means there is no meaningful operation: no need to report a specific message - if op.ID != "" { - res.AddErrors(noValidResponseMsg(op.ID)) + if op.Responses != nil { + if op.Responses.Default != nil { + // Same constraint on default Response + res.Merge(ex.validateExampleInResponse(op.Responses.Default, jsonDefault, path, 0, op.ID)) + } + // Same constraint on regular Responses + if op.Responses.StatusCodeResponses != nil { // Safeguard + for code, r := range op.Responses.StatusCodeResponses { + res.Merge(ex.validateExampleInResponse(&r, "response", path, code, op.ID)) } } + } else if op.ID != "" { + // Empty op.ID means there is no meaningful operation: no need to report a specific message + res.AddErrors(noValidResponseMsg(op.ID)) } } } @@ -178,6 +146,7 @@ func (ex *exampleValidator) validateExampleInResponse(resp *spec.Response, respo responseName, responseCodeAsStr := responseHelp.responseMsgVariants(responseType, responseCode) + // nolint: dupl if response.Headers != nil { // Safeguard for nm, h := range response.Headers { // reset explored schemas to get depth-first recursive-proof exploration @@ -222,7 +191,7 @@ func (ex *exampleValidator) validateExampleInResponse(resp *spec.Response, respo if response.Examples != nil { if response.Schema != nil { if example, ok := response.Examples["application/json"]; ok { - res.MergeAsWarnings(NewSchemaValidator(response.Schema, s.spec.Spec(), path, s.KnownFormats).Validate(example)) + res.MergeAsWarnings(NewSchemaValidator(response.Schema, s.spec.Spec(), path+".examples", s.KnownFormats, SwaggerSchema(true)).Validate(example)) } else { // TODO: validate other media types too res.AddWarnings(examplesMimeNotSupportedMsg(operationID, responseName)) @@ -244,7 +213,7 @@ func (ex *exampleValidator) validateExampleValueSchemaAgainstSchema(path, in str res := new(Result) if schema.Example != nil { - res.MergeAsWarnings(NewSchemaValidator(schema, s.spec.Spec(), path+".example", s.KnownFormats).Validate(schema.Example)) + res.MergeAsWarnings(NewSchemaValidator(schema, s.spec.Spec(), path+".example", s.KnownFormats, SwaggerSchema(true)).Validate(schema.Example)) } if schema.Items != nil { if schema.Items.Schema != nil { @@ -281,6 +250,8 @@ func (ex *exampleValidator) validateExampleValueSchemaAgainstSchema(path, in str return res } +// TODO: Temporary duplicated code. Need to refactor with examples +// nolint: dupl func (ex *exampleValidator) validateExampleValueItemsAgainstSchema(path, in string, root interface{}, items *spec.Items) *Result { res := new(Result) s := ex.SpecValidator diff --git a/vendor/github.com/go-openapi/validate/formats.go b/vendor/github.com/go-openapi/validate/formats.go index b7afe981bc..0ad996cbbc 100644 --- a/vendor/github.com/go-openapi/validate/formats.go +++ b/vendor/github.com/go-openapi/validate/formats.go @@ -37,19 +37,15 @@ func (f *formatValidator) Applies(source interface{}, kind reflect.Kind) bool { if source == nil { return false } - switch source.(type) { + switch source := source.(type) { case *spec.Items: - it := source.(*spec.Items) - return kind == reflect.String && f.KnownFormats.ContainsName(it.Format) + return kind == reflect.String && f.KnownFormats.ContainsName(source.Format) case *spec.Parameter: - par := source.(*spec.Parameter) - return kind == reflect.String && f.KnownFormats.ContainsName(par.Format) + return kind == reflect.String && f.KnownFormats.ContainsName(source.Format) case *spec.Schema: - sch := source.(*spec.Schema) - return kind == reflect.String && f.KnownFormats.ContainsName(sch.Format) + return kind == reflect.String && f.KnownFormats.ContainsName(source.Format) case *spec.Header: - hdr := source.(*spec.Header) - return kind == reflect.String && f.KnownFormats.ContainsName(hdr.Format) + return kind == reflect.String && f.KnownFormats.ContainsName(source.Format) } return false } diff --git a/vendor/github.com/go-openapi/validate/go.mod b/vendor/github.com/go-openapi/validate/go.mod index ed27309e9c..76b705283e 100644 --- a/vendor/github.com/go-openapi/validate/go.mod +++ b/vendor/github.com/go-openapi/validate/go.mod @@ -1,17 +1,21 @@ module github.com/go-openapi/validate +go 1.14 + require ( - github.com/go-openapi/analysis v0.19.4 - github.com/go-openapi/errors v0.19.2 + github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect + github.com/go-openapi/analysis v0.19.10 + github.com/go-openapi/errors v0.19.6 github.com/go-openapi/jsonpointer v0.19.3 - github.com/go-openapi/loads v0.19.2 - github.com/go-openapi/runtime v0.19.4 - github.com/go-openapi/spec v0.19.3 - github.com/go-openapi/strfmt v0.19.2 - github.com/go-openapi/swag v0.19.5 - github.com/stretchr/testify v1.4.0 - go.mongodb.org/mongo-driver v1.1.1 // indirect - gopkg.in/yaml.v2 v2.2.2 + github.com/go-openapi/loads v0.19.5 + github.com/go-openapi/runtime v0.19.15 + github.com/go-openapi/spec v0.19.8 + github.com/go-openapi/strfmt v0.19.5 + github.com/go-openapi/swag v0.19.9 + github.com/mitchellh/mapstructure v1.3.2 // indirect + github.com/stretchr/testify v1.6.1 + go.mongodb.org/mongo-driver v1.3.4 // indirect + golang.org/x/net v0.0.0-20200602114024-627f9648deb9 // indirect + gopkg.in/yaml.v2 v2.3.0 ) -go 1.13 diff --git a/vendor/github.com/go-openapi/validate/go.sum b/vendor/github.com/go-openapi/validate/go.sum index 18f191d640..a52271927d 100644 --- a/vendor/github.com/go-openapi/validate/go.sum +++ b/vendor/github.com/go-openapi/validate/go.sum @@ -1,3 +1,4 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -6,130 +7,233 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= +github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2 h1:ophLETFestFZHk3ji7niPEL4d466QjW+0Tdg5VyDq7E= github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.4 h1:1TjOzrWkj+9BrjnM1yPAICbaoC0FyfD49oVkTBrSSa0= github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= +github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +github.com/go-openapi/analysis v0.19.10 h1:5BHISBAXOc/aJK25irLZnx2D3s6WyYaY9D4gmuz9fdE= +github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.6 h1:xZMThgv5SQ7SMbWtKFkCf9bBdvR2iEyw9k3zGZONuys= +github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0 h1:wCOBNscACI8L93tt5tvB2zOMkJ098XCw3fP0BY2ybDA= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2 h1:rf5ArTHmIJxyV5Oiks+Su0mUens1+AjpkPoWr5xFRcI= github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= +github.com/go-openapi/loads v0.19.5 h1:jZVYWawIQiA1NBnHla28ktg6hrcfTHsCE+3QLVRBIls= +github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.19.0 h1:sU6pp4dSV2sGlNKKyHxZzi1m1kG4WnYtWcJ+HYbygjE= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= github.com/go-openapi/runtime v0.19.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI= github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= +github.com/go-openapi/runtime v0.19.15 h1:2GIefxs9Rx1vCDNghRtypRq+ig8KSLrjHbAYI/gCLCM= +github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2 h1:SStNd1jRcYtfKCN7R0laGNs80WYYvn5CbBjM2sOmCrE= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/spec v0.19.8 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg= +github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0 h1:0Dn9qy1G9+UJfRU7TR8bmdGxb4uifB7HNrJjOnV0yPk= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.2 h1:clPGfBnJohokno0e+d7hs6Yocrzjlgz6EsQSDncCRnE= github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA= +github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= +github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM= +github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-openapi/swag v0.19.9 h1:1IxuqvBUU3S2Bi4YC7tlP9SJF1gVpCvqN0T2Qof4azE= +github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= +github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8= +github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg= +github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -go.mongodb.org/mongo-driver v1.0.3 h1:GKoji1ld3tw2aC+GX1wbr/J2fX13yNacEYoJ8Nhr0yU= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= +go.mongodb.org/mongo-driver v1.3.4 h1:zs/dKNwX0gYUtzwrN9lLiR15hCO0nDwQj5xXx+vjCdE= +go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c h1:grhR+C34yXImVGp7EzNk+DTIk+323eIUWOmEevy6bDo= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/vendor/github.com/go-openapi/validate/helpers.go b/vendor/github.com/go-openapi/validate/helpers.go index 7ac8771094..4b77a00047 100644 --- a/vendor/github.com/go-openapi/validate/helpers.go +++ b/vendor/github.com/go-openapi/validate/helpers.go @@ -26,8 +26,67 @@ import ( "github.com/go-openapi/spec" ) -const swaggerBody = "body" -const objectType = "object" +const ( + swaggerBody = "body" + swaggerExample = "example" + swaggerExamples = "examples" +) + +const ( + objectType = "object" + arrayType = "array" + stringType = "string" + integerType = "integer" + numberType = "number" + booleanType = "boolean" + fileType = "file" + nullType = "null" +) + +const ( + jsonProperties = "properties" + jsonItems = "items" + jsonType = "type" + //jsonSchema = "schema" + jsonDefault = "default" +) + +const ( + stringFormatDate = "date" + stringFormatDateTime = "date-time" + stringFormatPassword = "password" + stringFormatByte = "byte" + //stringFormatBinary = "binary" + stringFormatCreditCard = "creditcard" + stringFormatDuration = "duration" + stringFormatEmail = "email" + stringFormatHexColor = "hexcolor" + stringFormatHostname = "hostname" + stringFormatIPv4 = "ipv4" + stringFormatIPv6 = "ipv6" + stringFormatISBN = "isbn" + stringFormatISBN10 = "isbn10" + stringFormatISBN13 = "isbn13" + stringFormatMAC = "mac" + stringFormatBSONObjectID = "bsonobjectid" + stringFormatRGBColor = "rgbcolor" + stringFormatSSN = "ssn" + stringFormatURI = "uri" + stringFormatUUID = "uuid" + stringFormatUUID3 = "uuid3" + stringFormatUUID4 = "uuid4" + stringFormatUUID5 = "uuid5" + + integerFormatInt32 = "int32" + integerFormatInt64 = "int64" + integerFormatUInt32 = "uint32" + integerFormatUInt64 = "uint64" + + numberFormatFloat32 = "float32" + numberFormatFloat64 = "float64" + numberFormatFloat = "float" + numberFormatDouble = "double" +) // Helpers available at the package level var ( @@ -205,7 +264,8 @@ func (h *paramHelper) checkExpandedParam(pr *spec.Parameter, path, in, operation res := new(Result) simpleZero := spec.SimpleSchema{} // Try to explain why... best guess - if pr.In == swaggerBody && (pr.SimpleSchema != simpleZero && pr.SimpleSchema.Type != objectType) { + switch { + case pr.In == swaggerBody && (pr.SimpleSchema != simpleZero && pr.SimpleSchema.Type != objectType): if isRef { // Most likely, a $ref with a sibling is an unwanted situation: in itself this is a warning... // but we detect it because of the following error: @@ -213,13 +273,12 @@ func (h *paramHelper) checkExpandedParam(pr *spec.Parameter, path, in, operation res.AddWarnings(refShouldNotHaveSiblingsMsg(path, operation)) } res.AddErrors(invalidParameterDefinitionMsg(path, in, operation)) - } else if pr.In != swaggerBody && pr.Schema != nil { + case pr.In != swaggerBody && pr.Schema != nil: if isRef { res.AddWarnings(refShouldNotHaveSiblingsMsg(path, operation)) } res.AddErrors(invalidParameterDefinitionAsSchemaMsg(path, in, operation)) - } else if (pr.In == swaggerBody && pr.Schema == nil) || - (pr.In != swaggerBody && pr.SimpleSchema == simpleZero) { // Safeguard + case (pr.In == swaggerBody && pr.Schema == nil) || (pr.In != swaggerBody && pr.SimpleSchema == simpleZero): // Other unexpected mishaps res.AddErrors(invalidParameterDefinitionMsg(path, in, operation)) } @@ -254,8 +313,8 @@ func (r *responseHelper) responseMsgVariants( responseType string, responseCode int) (responseName, responseCodeAsStr string) { // Path variants for messages - if responseType == "default" { - responseCodeAsStr = "default" + if responseType == jsonDefault { + responseCodeAsStr = jsonDefault responseName = "default response" } else { responseCodeAsStr = strconv.Itoa(responseCode) diff --git a/vendor/github.com/go-openapi/validate/object_validator.go b/vendor/github.com/go-openapi/validate/object_validator.go index df0c5c14ef..b413ab1fa3 100644 --- a/vendor/github.com/go-openapi/validate/object_validator.go +++ b/vendor/github.com/go-openapi/validate/object_validator.go @@ -51,40 +51,54 @@ func (o *objectValidator) Applies(source interface{}, kind reflect.Kind) bool { return r } -func (o *objectValidator) isPropertyName() bool { +func (o *objectValidator) isProperties() bool { p := strings.Split(o.Path, ".") - return p[len(p)-1] == "properties" && p[len(p)-2] != "properties" + return len(p) > 1 && p[len(p)-1] == jsonProperties && p[len(p)-2] != jsonProperties +} + +func (o *objectValidator) isDefault() bool { + p := strings.Split(o.Path, ".") + return len(p) > 1 && p[len(p)-1] == jsonDefault && p[len(p)-2] != jsonDefault +} + +func (o *objectValidator) isExample() bool { + p := strings.Split(o.Path, ".") + return len(p) > 1 && (p[len(p)-1] == swaggerExample || p[len(p)-1] == swaggerExamples) && p[len(p)-2] != swaggerExample } func (o *objectValidator) checkArrayMustHaveItems(res *Result, val map[string]interface{}) { - if t, typeFound := val["type"]; typeFound { - if tpe, ok := t.(string); ok && tpe == "array" { - if _, itemsKeyFound := val["items"]; !itemsKeyFound { - res.AddErrors(errors.Required("items", o.Path)) + // for swagger 2.0 schemas, there is an additional constraint to have array items defined explicitly. + // with pure jsonschema draft 4, one may have arrays with undefined items (i.e. any type). + if t, typeFound := val[jsonType]; typeFound { + if tpe, ok := t.(string); ok && tpe == arrayType { + if item, itemsKeyFound := val[jsonItems]; !itemsKeyFound { + res.AddErrors(errors.Required(jsonItems, o.Path, item)) } } } } func (o *objectValidator) checkItemsMustBeTypeArray(res *Result, val map[string]interface{}) { - if !o.isPropertyName() { - if _, itemsKeyFound := val["items"]; itemsKeyFound { - t, typeFound := val["type"] + if !o.isProperties() && !o.isDefault() && !o.isExample() { + if _, itemsKeyFound := val[jsonItems]; itemsKeyFound { + t, typeFound := val[jsonType] if typeFound { - if tpe, ok := t.(string); !ok || tpe != "array" { - res.AddErrors(errors.InvalidType(o.Path, o.In, "array", nil)) + if tpe, ok := t.(string); !ok || tpe != arrayType { + res.AddErrors(errors.InvalidType(o.Path, o.In, arrayType, nil)) } } else { // there is no type - res.AddErrors(errors.Required("type", o.Path)) + res.AddErrors(errors.Required(jsonType, o.Path, t)) } } } } func (o *objectValidator) precheck(res *Result, val map[string]interface{}) { - o.checkArrayMustHaveItems(res, val) - if !o.Options.DisableObjectArrayTypeCheck { + if o.Options.EnableArrayMustHaveItemsCheck { + o.checkArrayMustHaveItems(res, val) + } + if o.Options.EnableObjectArrayTypeCheck { o.checkItemsMustBeTypeArray(res, val) } } @@ -134,21 +148,18 @@ func (o *objectValidator) Validate(data interface{}) *Result { // NOTE: prefix your messages here by "IMPORTANT!" so there are not filtered // by higher level callers (the IMPORTANT! tag will be eventually // removed). - switch k { - // $ref is forbidden in header - case "headers": - if val[k] != nil { - if headers, mapOk := val[k].(map[string]interface{}); mapOk { - for headerKey, headerBody := range headers { - if headerBody != nil { - if headerSchema, mapOfMapOk := headerBody.(map[string]interface{}); mapOfMapOk { - if _, found := headerSchema["$ref"]; found { - var msg string - if refString, stringOk := headerSchema["$ref"].(string); stringOk { - msg = strings.Join([]string{", one may not use $ref=\":", refString, "\""}, "") - } - res.AddErrors(refNotAllowedInHeaderMsg(o.Path, headerKey, msg)) + if k == "headers" && val[k] != nil { + // $ref is forbidden in header + if headers, mapOk := val[k].(map[string]interface{}); mapOk { + for headerKey, headerBody := range headers { + if headerBody != nil { + if headerSchema, mapOfMapOk := headerBody.(map[string]interface{}); mapOfMapOk { + if _, found := headerSchema["$ref"]; found { + var msg string + if refString, stringOk := headerSchema["$ref"].(string); stringOk { + msg = strings.Join([]string{", one may not use $ref=\":", refString, "\""}, "") } + res.AddErrors(refNotAllowedInHeaderMsg(o.Path, headerKey, msg)) } } } @@ -216,8 +227,8 @@ func (o *objectValidator) Validate(data interface{}) *Result { // Check required properties if len(o.Required) > 0 { for _, k := range o.Required { - if _, ok := val[k]; !ok && !createdFromDefaults[k] { - res.AddErrors(errors.Required(o.Path+"."+k, o.In)) + if v, ok := val[k]; !ok && !createdFromDefaults[k] { + res.AddErrors(errors.Required(o.Path+"."+k, o.In, v)) continue } } diff --git a/vendor/github.com/go-openapi/validate/result.go b/vendor/github.com/go-openapi/validate/result.go index ae9b8dbf2b..8f5f935e5d 100644 --- a/vendor/github.com/go-openapi/validate/result.go +++ b/vendor/github.com/go-openapi/validate/result.go @@ -132,6 +132,7 @@ func (r *Result) RootObjectSchemata() []*spec.Schema { } // FieldSchemata returns the schemata which apply to fields in objects. +// nolint: dupl func (r *Result) FieldSchemata() map[FieldKey][]*spec.Schema { if r.cachedFieldSchemta != nil { return r.cachedFieldSchemta @@ -151,6 +152,7 @@ func (r *Result) FieldSchemata() map[FieldKey][]*spec.Schema { } // ItemSchemata returns the schemata which apply to items in slices. +// nolint: dupl func (r *Result) ItemSchemata() map[ItemKey][]*spec.Schema { if r.cachedItemSchemata != nil { return r.cachedItemSchemata @@ -175,6 +177,7 @@ func (r *Result) resetCaches() { } // mergeForField merges other into r, assigning other's root schemata to the given Object and field name. +// nolint: unparam func (r *Result) mergeForField(obj map[string]interface{}, field string, other *Result) *Result { if other == nil { return r @@ -196,6 +199,7 @@ func (r *Result) mergeForField(obj map[string]interface{}, field string, other * } // mergeForSlice merges other into r, assigning other's root schemata to the given slice and index. +// nolint: unparam func (r *Result) mergeForSlice(slice reflect.Value, i int, other *Result) *Result { if other == nil { return r @@ -231,6 +235,7 @@ func (r *Result) addPropertySchemata(obj map[string]interface{}, fld string, sch r.fieldSchemata = append(r.fieldSchemata, fieldSchemata{obj: obj, field: fld, schemata: schemata{one: schema}}) } +/* // addSliceSchemata adds the given schemata for the slice and index. // The slice schemata might be reused. I.e. do not modify it after being added to a result. func (r *Result) addSliceSchemata(slice reflect.Value, i int, schema *spec.Schema) { @@ -239,6 +244,7 @@ func (r *Result) addSliceSchemata(slice reflect.Value, i int, schema *spec.Schem } r.itemSchemata = append(r.itemSchemata, itemSchemata{slice: slice, index: i, schemata: schemata{one: schema}}) } +*/ // mergeWithoutRootSchemata merges other into r, ignoring the rootObject schemata. func (r *Result) mergeWithoutRootSchemata(other *Result) { @@ -251,9 +257,7 @@ func (r *Result) mergeWithoutRootSchemata(other *Result) { if r.fieldSchemata == nil { r.fieldSchemata = other.fieldSchemata } else { - for _, x := range other.fieldSchemata { - r.fieldSchemata = append(r.fieldSchemata, x) - } + r.fieldSchemata = append(r.fieldSchemata, other.fieldSchemata...) } } @@ -261,9 +265,7 @@ func (r *Result) mergeWithoutRootSchemata(other *Result) { if r.itemSchemata == nil { r.itemSchemata = other.itemSchemata } else { - for _, x := range other.itemSchemata { - r.itemSchemata = append(r.itemSchemata, x) - } + r.itemSchemata = append(r.itemSchemata, other.itemSchemata...) } } } diff --git a/vendor/github.com/go-openapi/validate/schema.go b/vendor/github.com/go-openapi/validate/schema.go index 9bf8f2eb78..55454b8522 100644 --- a/vendor/github.com/go-openapi/validate/schema.go +++ b/vendor/github.com/go-openapi/validate/schema.go @@ -27,8 +27,8 @@ import ( var ( specSchemaType = reflect.TypeOf(&spec.Schema{}) specParameterType = reflect.TypeOf(&spec.Parameter{}) - specItemsType = reflect.TypeOf(&spec.Items{}) specHeaderType = reflect.TypeOf(&spec.Header{}) + //specItemsType = reflect.TypeOf(&spec.Items{}) ) // SchemaValidator validates data against a JSON schema @@ -39,14 +39,14 @@ type SchemaValidator struct { validators []valueValidator Root interface{} KnownFormats strfmt.Registry - Options *SchemaValidatorOptions + Options SchemaValidatorOptions } // AgainstSchema validates the specified data against the provided schema, using a registry of supported formats. // // When no pre-parsed *spec.Schema structure is provided, it uses a JSON schema as default. See example. -func AgainstSchema(schema *spec.Schema, data interface{}, formats strfmt.Registry) error { - res := NewSchemaValidator(schema, nil, "", formats).Validate(data) +func AgainstSchema(schema *spec.Schema, data interface{}, formats strfmt.Registry, options ...Option) error { + res := NewSchemaValidator(schema, nil, "", formats, options...).Validate(data) if res.HasErrors() { return errors.CompositeValidationError(res.Errors...) } @@ -72,9 +72,15 @@ func NewSchemaValidator(schema *spec.Schema, rootSchema interface{}, root string panic(msg) } } - s := SchemaValidator{Path: root, in: "body", Schema: schema, Root: rootSchema, KnownFormats: formats, Options: &SchemaValidatorOptions{}} + s := SchemaValidator{ + Path: root, + in: "body", + Schema: schema, + Root: rootSchema, + KnownFormats: formats, + Options: SchemaValidatorOptions{}} for _, o := range options { - o(s.Options) + o(&s.Options) } s.validators = []valueValidator{ s.typeValidator(), @@ -134,9 +140,9 @@ func (s *SchemaValidator) Validate(data interface{}) *Result { // TODO: this part should be handed over to type validator // Handle special case of json.Number data (number marshalled as string) - isnumber := s.Schema.Type.Contains("number") || s.Schema.Type.Contains("integer") + isnumber := s.Schema.Type.Contains(numberType) || s.Schema.Type.Contains(integerType) if num, ok := data.(json.Number); ok && isnumber { - if s.Schema.Type.Contains("integer") { // avoid lossy conversion + if s.Schema.Type.Contains(integerType) { // avoid lossy conversion in, erri := num.Int64() if erri != nil { result.AddErrors(invalidTypeConversionMsg(s.Path, erri)) @@ -196,6 +202,7 @@ func (s *SchemaValidator) sliceValidator() valueValidator { Items: s.Schema.Items, Root: s.Root, KnownFormats: s.KnownFormats, + Options: s.Options, } } @@ -248,6 +255,6 @@ func (s *SchemaValidator) objectValidator() valueValidator { PatternProperties: s.Schema.PatternProperties, Root: s.Root, KnownFormats: s.KnownFormats, - Options: *s.Options, + Options: s.Options, } } diff --git a/vendor/github.com/go-openapi/validate/schema_option.go b/vendor/github.com/go-openapi/validate/schema_option.go index f328b56b85..4b4879de8b 100644 --- a/vendor/github.com/go-openapi/validate/schema_option.go +++ b/vendor/github.com/go-openapi/validate/schema_option.go @@ -14,20 +14,41 @@ package validate +// SchemaValidatorOptions defines optional rules for schema validation type SchemaValidatorOptions struct { - DisableObjectArrayTypeCheck bool + EnableObjectArrayTypeCheck bool + EnableArrayMustHaveItemsCheck bool } +// Option sets optional rules for schema validation type Option func(*SchemaValidatorOptions) -func DisableObjectArrayTypeCheck(disable bool) Option { +// EnableObjectArrayTypeCheck activates the swagger rule: an items must be in type: array +func EnableObjectArrayTypeCheck(enable bool) Option { return func(svo *SchemaValidatorOptions) { - svo.DisableObjectArrayTypeCheck = disable + svo.EnableObjectArrayTypeCheck = enable } } +// EnableArrayMustHaveItemsCheck activates the swagger rule: an array must have items defined +func EnableArrayMustHaveItemsCheck(enable bool) Option { + return func(svo *SchemaValidatorOptions) { + svo.EnableArrayMustHaveItemsCheck = enable + } +} + +// SwaggerSchema activates swagger schema validation rules +func SwaggerSchema(enable bool) Option { + return func(svo *SchemaValidatorOptions) { + svo.EnableObjectArrayTypeCheck = enable + svo.EnableArrayMustHaveItemsCheck = enable + } +} + +// Options returns current options func (svo SchemaValidatorOptions) Options() []Option { return []Option{ - DisableObjectArrayTypeCheck(svo.DisableObjectArrayTypeCheck), + EnableObjectArrayTypeCheck(svo.EnableObjectArrayTypeCheck), + EnableArrayMustHaveItemsCheck(svo.EnableArrayMustHaveItemsCheck), } } diff --git a/vendor/github.com/go-openapi/validate/slice_validator.go b/vendor/github.com/go-openapi/validate/slice_validator.go index 6e615946b6..aa429f5184 100644 --- a/vendor/github.com/go-openapi/validate/slice_validator.go +++ b/vendor/github.com/go-openapi/validate/slice_validator.go @@ -32,6 +32,7 @@ type schemaSliceValidator struct { Items *spec.SchemaOrArray Root interface{} KnownFormats strfmt.Registry + Options SchemaValidatorOptions } func (s *schemaSliceValidator) SetPath(path string) { @@ -53,7 +54,7 @@ func (s *schemaSliceValidator) Validate(data interface{}) *Result { size := val.Len() if s.Items != nil && s.Items.Schema != nil { - validator := NewSchemaValidator(s.Items.Schema, s.Root, s.Path, s.KnownFormats) + validator := NewSchemaValidator(s.Items.Schema, s.Root, s.Path, s.KnownFormats, s.Options.Options()...) for i := 0; i < size; i++ { validator.SetPath(fmt.Sprintf("%s.%d", s.Path, i)) value := val.Index(i) @@ -65,11 +66,11 @@ func (s *schemaSliceValidator) Validate(data interface{}) *Result { if s.Items != nil && len(s.Items.Schemas) > 0 { itemsSize = len(s.Items.Schemas) for i := 0; i < itemsSize; i++ { - validator := NewSchemaValidator(&s.Items.Schemas[i], s.Root, fmt.Sprintf("%s.%d", s.Path, i), s.KnownFormats) + validator := NewSchemaValidator(&s.Items.Schemas[i], s.Root, fmt.Sprintf("%s.%d", s.Path, i), s.KnownFormats, s.Options.Options()...) if val.Len() <= i { break } - result.mergeForSlice(val, int(i), validator.Validate(val.Index(i).Interface())) + result.mergeForSlice(val, i, validator.Validate(val.Index(i).Interface())) } } if s.AdditionalItems != nil && itemsSize < size { @@ -78,8 +79,8 @@ func (s *schemaSliceValidator) Validate(data interface{}) *Result { } if s.AdditionalItems.Schema != nil { for i := itemsSize; i < size-itemsSize+1; i++ { - validator := NewSchemaValidator(s.AdditionalItems.Schema, s.Root, fmt.Sprintf("%s.%d", s.Path, i), s.KnownFormats) - result.mergeForSlice(val, int(i), validator.Validate(val.Index(int(i)).Interface())) + validator := NewSchemaValidator(s.AdditionalItems.Schema, s.Root, fmt.Sprintf("%s.%d", s.Path, i), s.KnownFormats, s.Options.Options()...) + result.mergeForSlice(val, i, validator.Validate(val.Index(i).Interface())) } } } diff --git a/vendor/github.com/go-openapi/validate/spec.go b/vendor/github.com/go-openapi/validate/spec.go index 08ccd22fef..f30dd79e38 100644 --- a/vendor/github.com/go-openapi/validate/spec.go +++ b/vendor/github.com/go-openapi/validate/spec.go @@ -71,25 +71,22 @@ func NewSpecValidator(schema *spec.Schema, formats strfmt.Registry) *SpecValidat } // Validate validates the swagger spec -func (s *SpecValidator) Validate(data interface{}) (errs *Result, warnings *Result) { +func (s *SpecValidator) Validate(data interface{}) (*Result, *Result) { var sd *loads.Document - errs = new(Result) + errs, warnings := new(Result), new(Result) - switch v := data.(type) { - case *loads.Document: + if v, ok := data.(*loads.Document); ok { sd = v } if sd == nil { errs.AddErrors(invalidDocumentMsg()) - return + return errs, warnings // no point in continuing } s.spec = sd s.analyzer = analysis.New(sd.Spec()) - warnings = new(Result) - // Swagger schema validator - schv := NewSchemaValidator(s.schema, nil, "", s.KnownFormats) + schv := NewSchemaValidator(s.schema, nil, "", s.KnownFormats, SwaggerSchema(true)) var obj interface{} // Raw spec unmarshalling errors @@ -109,13 +106,13 @@ func (s *SpecValidator) Validate(data interface{}) (errs *Result, warnings *Resu errs.Merge(schv.Validate(obj)) // error - // There may be a point in continuing to try and determine more accurate errors if !s.Options.ContinueOnErrors && errs.HasErrors() { - return // no point in continuing + return errs, warnings // no point in continuing } errs.Merge(s.validateReferencesValid()) // error - // There may be a point in continuing to try and determine more accurate errors if !s.Options.ContinueOnErrors && errs.HasErrors() { - return // no point in continuing + return errs, warnings // no point in continuing } errs.Merge(s.validateDuplicateOperationIDs()) @@ -129,7 +126,7 @@ func (s *SpecValidator) Validate(data interface{}) (errs *Result, warnings *Resu // There may be a point in continuing to try and determine more accurate errors if !s.Options.ContinueOnErrors && errs.HasErrors() { - return // no point in continuing + return errs, warnings // no point in continuing } // Values provided as default MUST validate their schema @@ -147,7 +144,7 @@ func (s *SpecValidator) Validate(data interface{}) (errs *Result, warnings *Resu //errs.Merge(s.validateRefNoSibling()) // warning only errs.Merge(s.validateReferenced()) // warning only - return + return errs, warnings } func (s *SpecValidator) validateNonEmptyPathParamNames() *Result { @@ -172,9 +169,17 @@ func (s *SpecValidator) validateNonEmptyPathParamNames() *Result { func (s *SpecValidator) validateDuplicateOperationIDs() *Result { // OperationID, if specified, must be unique across the board + var analyzer *analysis.Spec + if s.expanded != nil { + // $ref are valid: we can analyze operations on an expanded spec + analyzer = analysis.New(s.expanded.Spec()) + } else { + // fallback on possible incomplete picture because of previous errors + analyzer = s.analyzer + } res := new(Result) known := make(map[string]int) - for _, v := range s.analyzer.OperationIDs() { + for _, v := range analyzer.OperationIDs() { if v != "" { known[v]++ } @@ -336,14 +341,14 @@ func (s *SpecValidator) validateItems() *Result { for path, op := range pi { for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { - if param.TypeName() == "array" && param.ItemsTypeName() == "" { + if param.TypeName() == arrayType && param.ItemsTypeName() == "" { res.AddErrors(arrayInParamRequiresItemsMsg(param.Name, op.ID)) continue } - if param.In != "body" { + if param.In != swaggerBody { if param.Items != nil { items := param.Items - for items.TypeName() == "array" { + for items.TypeName() == arrayType { if items.ItemsTypeName() == "" { res.AddErrors(arrayInParamRequiresItemsMsg(param.Name, op.ID)) break @@ -374,7 +379,7 @@ func (s *SpecValidator) validateItems() *Result { for _, resp := range responses { // Response headers with array for hn, hv := range resp.Headers { - if hv.TypeName() == "array" && hv.ItemsTypeName() == "" { + if hv.TypeName() == arrayType && hv.ItemsTypeName() == "" { res.AddErrors(arrayInHeaderRequiresItemsMsg(hn, op.ID)) } } @@ -390,7 +395,7 @@ func (s *SpecValidator) validateItems() *Result { // Verifies constraints on array type func (s *SpecValidator) validateSchemaItems(schema spec.Schema, prefix, opID string) *Result { res := new(Result) - if !schema.Type.Contains("array") { + if !schema.Type.Contains(arrayType) { return res } @@ -451,6 +456,7 @@ func (s *SpecValidator) validateReferenced() *Result { return &res } +// nolint: dupl func (s *SpecValidator) validateReferencedParameters() *Result { // Each referenceable definition should have references. params := s.spec.Spec().Parameters @@ -463,9 +469,7 @@ func (s *SpecValidator) validateReferencedParameters() *Result { expected["#/parameters/"+jsonpointer.Escape(k)] = struct{}{} } for _, k := range s.analyzer.AllParameterReferences() { - if _, ok := expected[k]; ok { - delete(expected, k) - } + delete(expected, k) } if len(expected) == 0 { @@ -478,6 +482,7 @@ func (s *SpecValidator) validateReferencedParameters() *Result { return result } +// nolint: dupl func (s *SpecValidator) validateReferencedResponses() *Result { // Each referenceable definition should have references. responses := s.spec.Spec().Responses @@ -490,9 +495,7 @@ func (s *SpecValidator) validateReferencedResponses() *Result { expected["#/responses/"+jsonpointer.Escape(k)] = struct{}{} } for _, k := range s.analyzer.AllResponseReferences() { - if _, ok := expected[k]; ok { - delete(expected, k) - } + delete(expected, k) } if len(expected) == 0 { @@ -505,6 +508,7 @@ func (s *SpecValidator) validateReferencedResponses() *Result { return result } +// nolint: dupl func (s *SpecValidator) validateReferencedDefinitions() *Result { // Each referenceable definition must have references. defs := s.spec.Spec().Definitions @@ -517,9 +521,7 @@ func (s *SpecValidator) validateReferencedDefinitions() *Result { expected["#/definitions/"+jsonpointer.Escape(k)] = struct{}{} } for _, k := range s.analyzer.AllDefinitionReferences() { - if _, ok := expected[k]; ok { - delete(expected, k) - } + delete(expected, k) } if len(expected) == 0 { @@ -624,98 +626,114 @@ func (s *SpecValidator) validateParameters() *Result { rexGarbledPathSegment := mustCompileRegexp(`.*[{}\s]+.*`) for method, pi := range s.analyzer.Operations() { methodPaths := make(map[string]map[string]string) - if pi != nil { // Safeguard - for path, op := range pi { - pathToAdd := pathHelp.stripParametersInPath(path) + for path, op := range pi { + pathToAdd := pathHelp.stripParametersInPath(path) - // Warn on garbled path afer param stripping - if rexGarbledPathSegment.MatchString(pathToAdd) { - res.AddWarnings(pathStrippedParamGarbledMsg(pathToAdd)) - } + // Warn on garbled path afer param stripping + if rexGarbledPathSegment.MatchString(pathToAdd) { + res.AddWarnings(pathStrippedParamGarbledMsg(pathToAdd)) + } - // Check uniqueness of stripped paths - if _, found := methodPaths[method][pathToAdd]; found { + // Check uniqueness of stripped paths + if _, found := methodPaths[method][pathToAdd]; found { - // Sort names for stable, testable output - if strings.Compare(path, methodPaths[method][pathToAdd]) < 0 { - res.AddErrors(pathOverlapMsg(path, methodPaths[method][pathToAdd])) - } else { - res.AddErrors(pathOverlapMsg(methodPaths[method][pathToAdd], path)) - } + // Sort names for stable, testable output + if strings.Compare(path, methodPaths[method][pathToAdd]) < 0 { + res.AddErrors(pathOverlapMsg(path, methodPaths[method][pathToAdd])) } else { - if _, found := methodPaths[method]; !found { - methodPaths[method] = map[string]string{} - } - methodPaths[method][pathToAdd] = path //Original non stripped path - + res.AddErrors(pathOverlapMsg(methodPaths[method][pathToAdd], path)) } + } else { + if _, found := methodPaths[method]; !found { + methodPaths[method] = map[string]string{} + } + methodPaths[method][pathToAdd] = path //Original non stripped path - var bodyParams []string - var paramNames []string - var hasForm, hasBody bool + } - // Check parameters names uniqueness for operation - // TODO: should be done after param expansion - res.Merge(s.checkUniqueParams(path, method, op)) + var bodyParams []string + var paramNames []string + var hasForm, hasBody bool - for _, pr := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { - // Validate pattern regexp for parameters with a Pattern property - if _, err := compileRegexp(pr.Pattern); err != nil { - res.AddErrors(invalidPatternInParamMsg(op.ID, pr.Name, pr.Pattern)) - } + // Check parameters names uniqueness for operation + // TODO: should be done after param expansion + res.Merge(s.checkUniqueParams(path, method, op)) - // There must be at most one parameter in body: list them all - if pr.In == "body" { - bodyParams = append(bodyParams, fmt.Sprintf("%q", pr.Name)) - hasBody = true - } + for _, pr := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { + // Validate pattern regexp for parameters with a Pattern property + if _, err := compileRegexp(pr.Pattern); err != nil { + res.AddErrors(invalidPatternInParamMsg(op.ID, pr.Name, pr.Pattern)) + } - if pr.In == "path" { - paramNames = append(paramNames, pr.Name) - // Path declared in path must have the required: true property - if !pr.Required { - res.AddErrors(pathParamRequiredMsg(op.ID, pr.Name)) - } - } + // There must be at most one parameter in body: list them all + if pr.In == swaggerBody { + bodyParams = append(bodyParams, fmt.Sprintf("%q", pr.Name)) + hasBody = true + } - if pr.In == "formData" { - hasForm = true + if pr.In == "path" { + paramNames = append(paramNames, pr.Name) + // Path declared in path must have the required: true property + if !pr.Required { + res.AddErrors(pathParamRequiredMsg(op.ID, pr.Name)) } } - // In:formData and In:body are mutually exclusive - if hasBody && hasForm { - res.AddErrors(bothFormDataAndBodyMsg(op.ID)) + if pr.In == "formData" { + hasForm = true } - // There must be at most one body param - // Accurately report situations when more than 1 body param is declared (possibly unnamed) - if len(bodyParams) > 1 { - sort.Strings(bodyParams) - res.AddErrors(multipleBodyParamMsg(op.ID, bodyParams)) + + if !(pr.Type == numberType || pr.Type == integerType) && + (pr.Maximum != nil || pr.Minimum != nil || pr.MultipleOf != nil) { + // A non-numeric parameter has validation keywords for numeric instances (number and integer) + res.AddWarnings(parameterValidationTypeMismatchMsg(pr.Name, path, pr.Type)) } - // Check uniqueness of parameters in path - paramsInPath := pathHelp.extractPathParams(path) - for i, p := range paramsInPath { - for j, q := range paramsInPath { - if p == q && i > j { - res.AddErrors(pathParamNotUniqueMsg(path, p, q)) - break - } - } + if !(pr.Type == stringType) && + // A non-string parameter has validation keywords for strings + (pr.MaxLength != nil || pr.MinLength != nil || pr.Pattern != "") { + res.AddWarnings(parameterValidationTypeMismatchMsg(pr.Name, path, pr.Type)) + } + + if !(pr.Type == arrayType) && + // A non-array parameter has validation keywords for arrays + (pr.MaxItems != nil || pr.MinItems != nil || pr.UniqueItems) { + res.AddWarnings(parameterValidationTypeMismatchMsg(pr.Name, path, pr.Type)) } + } + + // In:formData and In:body are mutually exclusive + if hasBody && hasForm { + res.AddErrors(bothFormDataAndBodyMsg(op.ID)) + } + // There must be at most one body param + // Accurately report situations when more than 1 body param is declared (possibly unnamed) + if len(bodyParams) > 1 { + sort.Strings(bodyParams) + res.AddErrors(multipleBodyParamMsg(op.ID, bodyParams)) + } - // Warns about possible malformed params in path - rexGarbledParam := mustCompileRegexp(`{.*[{}\s]+.*}`) - for _, p := range paramsInPath { - if rexGarbledParam.MatchString(p) { - res.AddWarnings(pathParamGarbledMsg(path, p)) + // Check uniqueness of parameters in path + paramsInPath := pathHelp.extractPathParams(path) + for i, p := range paramsInPath { + for j, q := range paramsInPath { + if p == q && i > j { + res.AddErrors(pathParamNotUniqueMsg(path, p, q)) + break } } + } - // Match params from path vs params from params section - res.Merge(s.validatePathParamPresence(path, paramsInPath, paramNames)) + // Warns about possible malformed params in path + rexGarbledParam := mustCompileRegexp(`{.*[{}\s]+.*}`) + for _, p := range paramsInPath { + if rexGarbledParam.MatchString(p) { + res.AddWarnings(pathParamGarbledMsg(path, p)) + } } + + // Match params from path vs params from params section + res.Merge(s.validatePathParamPresence(path, paramsInPath, paramNames)) } } return res diff --git a/vendor/github.com/go-openapi/validate/spec_messages.go b/vendor/github.com/go-openapi/validate/spec_messages.go index 441bb51975..1a5892aee4 100644 --- a/vendor/github.com/go-openapi/validate/spec_messages.go +++ b/vendor/github.com/go-openapi/validate/spec_messages.go @@ -163,6 +163,9 @@ const ( // PathParamGarbledWarning ... PathParamGarbledWarning = "in path %q, param %q contains {,} or white space. Albeit not stricly illegal, this is probably no what you want" + // ParamValidationTypeMismatch indicates that parameter has validation which does not match its type + ParamValidationTypeMismatch = "validation keywords of parameter %q in path %q don't match its type %s" + // PathStrippedParamGarbledWarning ... PathStrippedParamGarbledWarning = "path stripped from path parameters %s contains {,} or white space. This is probably no what you want." @@ -341,6 +344,9 @@ func invalidParameterDefinitionMsg(path, method, operationID string) errors.Erro func invalidParameterDefinitionAsSchemaMsg(path, method, operationID string) errors.Error { return errors.New(errors.CompositeErrorCode, InvalidParameterDefinitionAsSchemaError, path, method, operationID) } +func parameterValidationTypeMismatchMsg(param, path, typ string) errors.Error { + return errors.New(errors.CompositeErrorCode, ParamValidationTypeMismatch, param, path, typ) +} // disabled //func invalidResponseDefinitionAsSchemaMsg(path, method string) errors.Error { diff --git a/vendor/github.com/go-openapi/validate/type.go b/vendor/github.com/go-openapi/validate/type.go index ba0e956d67..f55140d1e5 100644 --- a/vendor/github.com/go-openapi/validate/type.go +++ b/vendor/github.com/go-openapi/validate/type.go @@ -39,53 +39,53 @@ func (t *typeValidator) schemaInfoForType(data interface{}) (string, string) { // TODO: this switch really is some sort of reverse lookup for formats. It should be provided by strfmt. switch data.(type) { case []byte, strfmt.Base64, *strfmt.Base64: - return "string", "byte" + return stringType, stringFormatByte case strfmt.CreditCard, *strfmt.CreditCard: - return "string", "creditcard" + return stringType, stringFormatCreditCard case strfmt.Date, *strfmt.Date: - return "string", "date" + return stringType, stringFormatDate case strfmt.DateTime, *strfmt.DateTime: - return "string", "date-time" + return stringType, stringFormatDateTime case strfmt.Duration, *strfmt.Duration: - return "string", "duration" + return stringType, stringFormatDuration case runtime.File, *runtime.File: - return "file", "" + return fileType, "" case strfmt.Email, *strfmt.Email: - return "string", "email" + return stringType, stringFormatEmail case strfmt.HexColor, *strfmt.HexColor: - return "string", "hexcolor" + return stringType, stringFormatHexColor case strfmt.Hostname, *strfmt.Hostname: - return "string", "hostname" + return stringType, stringFormatHostname case strfmt.IPv4, *strfmt.IPv4: - return "string", "ipv4" + return stringType, stringFormatIPv4 case strfmt.IPv6, *strfmt.IPv6: - return "string", "ipv6" + return stringType, stringFormatIPv6 case strfmt.ISBN, *strfmt.ISBN: - return "string", "isbn" + return stringType, stringFormatISBN case strfmt.ISBN10, *strfmt.ISBN10: - return "string", "isbn10" + return stringType, stringFormatISBN10 case strfmt.ISBN13, *strfmt.ISBN13: - return "string", "isbn13" + return stringType, stringFormatISBN13 case strfmt.MAC, *strfmt.MAC: - return "string", "mac" + return stringType, stringFormatMAC case strfmt.ObjectId, *strfmt.ObjectId: - return "string", "bsonobjectid" + return stringType, stringFormatBSONObjectID case strfmt.Password, *strfmt.Password: - return "string", "password" + return stringType, stringFormatPassword case strfmt.RGBColor, *strfmt.RGBColor: - return "string", "rgbcolor" + return stringType, stringFormatRGBColor case strfmt.SSN, *strfmt.SSN: - return "string", "ssn" + return stringType, stringFormatSSN case strfmt.URI, *strfmt.URI: - return "string", "uri" + return stringType, stringFormatURI case strfmt.UUID, *strfmt.UUID: - return "string", "uuid" + return stringType, stringFormatUUID case strfmt.UUID3, *strfmt.UUID3: - return "string", "uuid3" + return stringType, stringFormatUUID3 case strfmt.UUID4, *strfmt.UUID4: - return "string", "uuid4" + return stringType, stringFormatUUID4 case strfmt.UUID5, *strfmt.UUID5: - return "string", "uuid5" + return stringType, stringFormatUUID5 // TODO: missing binary (io.ReadCloser) // TODO: missing json.Number default: @@ -93,25 +93,25 @@ func (t *typeValidator) schemaInfoForType(data interface{}) (string, string) { tpe := val.Type() switch tpe.Kind() { case reflect.Bool: - return "boolean", "" + return booleanType, "" case reflect.String: - return "string", "" + return stringType, "" case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Uint8, reflect.Uint16, reflect.Uint32: // NOTE: that is the spec. With go-openapi, is that not uint32 for unsigned integers? - return "integer", "int32" + return integerType, integerFormatInt32 case reflect.Int, reflect.Int64, reflect.Uint, reflect.Uint64: - return "integer", "int64" + return integerType, integerFormatInt64 case reflect.Float32: - // NOTE: is that not "float"? - return "number", "float32" + // NOTE: is that not numberFormatFloat? + return numberType, numberFormatFloat32 case reflect.Float64: // NOTE: is that not "double"? - return "number", "float64" + return numberType, numberFormatFloat64 // NOTE: go arrays (reflect.Array) are not supported (fixed length) case reflect.Slice: - return "array", "" + return arrayType, "" case reflect.Map, reflect.Struct: - return "object", "" + return objectType, "" case reflect.Interface: // What to do here? panic("dunno what to do here") @@ -139,8 +139,8 @@ func (t *typeValidator) Validate(data interface{}) *Result { result.Inc() if data == nil || reflect.DeepEqual(reflect.Zero(reflect.TypeOf(data)), reflect.ValueOf(data)) { // nil or zero value for the passed structure require Type: null - if len(t.Type) > 0 && !t.Type.Contains("null") && !t.Nullable { // TODO: if a property is not required it also passes this - return errorHelp.sErr(errors.InvalidType(t.Path, t.In, strings.Join(t.Type, ","), "null")) + if len(t.Type) > 0 && !t.Type.Contains(nullType) && !t.Nullable { // TODO: if a property is not required it also passes this + return errorHelp.sErr(errors.InvalidType(t.Path, t.In, strings.Join(t.Type, ","), nullType)) } return result } @@ -157,17 +157,17 @@ func (t *typeValidator) Validate(data interface{}) *Result { // check numerical types // TODO: check unsigned ints // TODO: check json.Number (see schema.go) - isLowerInt := t.Format == "int64" && format == "int32" - isLowerFloat := t.Format == "float64" && format == "float32" - isFloatInt := schType == "number" && swag.IsFloat64AJSONInteger(val.Float()) && t.Type.Contains("integer") - isIntFloat := schType == "integer" && t.Type.Contains("number") + isLowerInt := t.Format == integerFormatInt64 && format == integerFormatInt32 + isLowerFloat := t.Format == numberFormatFloat64 && format == numberFormatFloat32 + isFloatInt := schType == numberType && swag.IsFloat64AJSONInteger(val.Float()) && t.Type.Contains(integerType) + isIntFloat := schType == integerType && t.Type.Contains(numberType) if kind != reflect.String && kind != reflect.Slice && t.Format != "" && !(t.Type.Contains(schType) || format == t.Format || isFloatInt || isIntFloat || isLowerInt || isLowerFloat) { // TODO: test case return errorHelp.sErr(errors.InvalidType(t.Path, t.In, t.Format, format)) } - if !(t.Type.Contains("number") || t.Type.Contains("integer")) && t.Format != "" && (kind == reflect.String || kind == reflect.Slice) { + if !(t.Type.Contains(numberType) || t.Type.Contains(integerType)) && t.Format != "" && (kind == reflect.String || kind == reflect.Slice) { return result } diff --git a/vendor/github.com/go-openapi/validate/validator.go b/vendor/github.com/go-openapi/validate/validator.go index df700d3cd4..2acb839db8 100644 --- a/vendor/github.com/go-openapi/validate/validator.go +++ b/vendor/github.com/go-openapi/validate/validator.go @@ -452,6 +452,7 @@ func (s *basicSliceValidator) Validate(data interface{}) *Result { return nil } +/* unused func (s *basicSliceValidator) hasDuplicates(value reflect.Value, size int) bool { dict := make(map[interface{}]struct{}) for i := 0; i < size; i++ { @@ -463,6 +464,7 @@ func (s *basicSliceValidator) hasDuplicates(value reflect.Value, size int) bool } return false } +*/ type numberValidator struct { Path string @@ -530,6 +532,7 @@ func (n *numberValidator) Validate(val interface{}) *Result { // Is the provided value within the range of the specified numeric type and format? res.AddErrors(IsValueValidAgainstRange(val, n.Type, n.Format, "Checked", n.Path)) + // nolint: dupl if n.MultipleOf != nil { // Is the constraint specifier within the range of the specific numeric type and format? resMultiple.AddErrors(IsValueValidAgainstRange(*n.MultipleOf, n.Type, n.Format, "MultipleOf", n.Path)) @@ -546,6 +549,7 @@ func (n *numberValidator) Validate(val interface{}) *Result { } } + // nolint: dupl if n.Maximum != nil { // Is the constraint specifier within the range of the specific numeric type and format? resMaximum.AddErrors(IsValueValidAgainstRange(*n.Maximum, n.Type, n.Format, "Maximum boundary", n.Path)) @@ -562,6 +566,7 @@ func (n *numberValidator) Validate(val interface{}) *Result { } } + // nolint: dupl if n.Minimum != nil { // Is the constraint specifier within the range of the specific numeric type and format? resMinimum.AddErrors(IsValueValidAgainstRange(*n.Minimum, n.Type, n.Format, "Minimum boundary", n.Path)) @@ -611,7 +616,7 @@ func (s *stringValidator) Applies(source interface{}, kind reflect.Kind) bool { func (s *stringValidator) Validate(val interface{}) *Result { data, ok := val.(string) if !ok { - return errorHelp.sErr(errors.InvalidType(s.Path, s.In, "string", val)) + return errorHelp.sErr(errors.InvalidType(s.Path, s.In, stringType, val)) } if s.Required && !s.AllowEmptyValue && (s.Default == nil || s.Default == "") { diff --git a/vendor/github.com/go-openapi/validate/values.go b/vendor/github.com/go-openapi/validate/values.go index 24606da8d5..8dfe557e1a 100644 --- a/vendor/github.com/go-openapi/validate/values.go +++ b/vendor/github.com/go-openapi/validate/values.go @@ -17,6 +17,7 @@ package validate import ( "fmt" "reflect" + "strings" "unicode/utf8" "github.com/go-openapi/errors" @@ -26,11 +27,17 @@ import ( // Enum validates if the data is a member of the enum func Enum(path, in string, data interface{}, enum interface{}) *errors.Validation { + return EnumCase(path, in, data, enum, true) +} + +// EnumCase validates if the data is a member of the enum and may respect case-sensitivity for strings +func EnumCase(path, in string, data interface{}, enum interface{}, caseSensitive bool) *errors.Validation { val := reflect.ValueOf(enum) if val.Kind() != reflect.Slice { return nil } + dataString := convertEnumCaseStringKind(data, caseSensitive) var values []interface{} for i := 0; i < val.Len(); i++ { ele := val.Index(i) @@ -39,6 +46,10 @@ func Enum(path, in string, data interface{}, enum interface{}) *errors.Validatio if reflect.DeepEqual(data, enumValue) { return nil } + enumString := convertEnumCaseStringKind(enumValue, caseSensitive) + if dataString != nil && enumString != nil && strings.EqualFold(*dataString, *enumString) { + return nil + } actualType := reflect.TypeOf(enumValue) if actualType == nil { // Safeguard. Frankly, I don't know how we may get a nil continue @@ -56,10 +67,25 @@ func Enum(path, in string, data interface{}, enum interface{}) *errors.Validatio return errors.EnumFail(path, in, data, values) } +// convertEnumCaseStringKind converts interface if it is kind of string and case insensitivity is set +func convertEnumCaseStringKind(value interface{}, caseSensitive bool) *string { + if caseSensitive { + return nil + } + + val := reflect.ValueOf(value) + if val.Kind() != reflect.String { + return nil + } + + str := fmt.Sprintf("%v", value) + return &str +} + // MinItems validates that there are at least n items in a slice func MinItems(path, in string, size, min int64) *errors.Validation { if size < min { - return errors.TooFewItems(path, in, min) + return errors.TooFewItems(path, in, min, size) } return nil } @@ -67,7 +93,7 @@ func MinItems(path, in string, size, min int64) *errors.Validation { // MaxItems validates that there are at most n items in a slice func MaxItems(path, in string, size, max int64) *errors.Validation { if size > max { - return errors.TooManyItems(path, in, max) + return errors.TooManyItems(path, in, max, size) } return nil } @@ -95,7 +121,7 @@ func UniqueItems(path, in string, data interface{}) *errors.Validation { func MinLength(path, in, data string, minLength int64) *errors.Validation { strLen := int64(utf8.RuneCount([]byte(data))) if strLen < minLength { - return errors.TooShort(path, in, minLength) + return errors.TooShort(path, in, minLength, data) } return nil } @@ -104,7 +130,7 @@ func MinLength(path, in, data string, minLength int64) *errors.Validation { func MaxLength(path, in, data string, maxLength int64) *errors.Validation { strLen := int64(utf8.RuneCount([]byte(data))) if strLen > maxLength { - return errors.TooLong(path, in, maxLength) + return errors.TooLong(path, in, maxLength, data) } return nil } @@ -114,17 +140,17 @@ func Required(path, in string, data interface{}) *errors.Validation { val := reflect.ValueOf(data) if val.IsValid() { if reflect.DeepEqual(reflect.Zero(val.Type()).Interface(), val.Interface()) { - return errors.Required(path, in) + return errors.Required(path, in, data) } return nil } - return errors.Required(path, in) + return errors.Required(path, in, data) } // RequiredString validates a string for requiredness func RequiredString(path, in, data string) *errors.Validation { if data == "" { - return errors.Required(path, in) + return errors.Required(path, in, data) } return nil } @@ -132,7 +158,7 @@ func RequiredString(path, in, data string) *errors.Validation { // RequiredNumber validates a number for requiredness func RequiredNumber(path, in string, data float64) *errors.Validation { if data == 0 { - return errors.Required(path, in) + return errors.Required(path, in, data) } return nil } @@ -141,10 +167,10 @@ func RequiredNumber(path, in string, data float64) *errors.Validation { func Pattern(path, in, data, pattern string) *errors.Validation { re, err := compileRegexp(pattern) if err != nil { - return errors.FailedPattern(path, in, fmt.Sprintf("%s, but pattern is invalid: %s", pattern, err.Error())) + return errors.FailedPattern(path, in, fmt.Sprintf("%s, but pattern is invalid: %s", pattern, err.Error()), data) } if !re.MatchString(data) { - return errors.FailedPattern(path, in, pattern) + return errors.FailedPattern(path, in, pattern, data) } return nil } @@ -152,7 +178,7 @@ func Pattern(path, in, data, pattern string) *errors.Validation { // MaximumInt validates if a number is smaller than a given maximum func MaximumInt(path, in string, data, max int64, exclusive bool) *errors.Validation { if (!exclusive && data > max) || (exclusive && data >= max) { - return errors.ExceedsMaximumInt(path, in, max, exclusive) + return errors.ExceedsMaximumInt(path, in, max, exclusive, data) } return nil } @@ -160,7 +186,7 @@ func MaximumInt(path, in string, data, max int64, exclusive bool) *errors.Valida // MaximumUint validates if a number is smaller than a given maximum func MaximumUint(path, in string, data, max uint64, exclusive bool) *errors.Validation { if (!exclusive && data > max) || (exclusive && data >= max) { - return errors.ExceedsMaximumUint(path, in, max, exclusive) + return errors.ExceedsMaximumUint(path, in, max, exclusive, data) } return nil } @@ -168,7 +194,7 @@ func MaximumUint(path, in string, data, max uint64, exclusive bool) *errors.Vali // Maximum validates if a number is smaller than a given maximum func Maximum(path, in string, data, max float64, exclusive bool) *errors.Validation { if (!exclusive && data > max) || (exclusive && data >= max) { - return errors.ExceedsMaximum(path, in, max, exclusive) + return errors.ExceedsMaximum(path, in, max, exclusive, data) } return nil } @@ -176,7 +202,7 @@ func Maximum(path, in string, data, max float64, exclusive bool) *errors.Validat // Minimum validates if a number is smaller than a given minimum func Minimum(path, in string, data, min float64, exclusive bool) *errors.Validation { if (!exclusive && data < min) || (exclusive && data <= min) { - return errors.ExceedsMinimum(path, in, min, exclusive) + return errors.ExceedsMinimum(path, in, min, exclusive, data) } return nil } @@ -184,7 +210,7 @@ func Minimum(path, in string, data, min float64, exclusive bool) *errors.Validat // MinimumInt validates if a number is smaller than a given minimum func MinimumInt(path, in string, data, min int64, exclusive bool) *errors.Validation { if (!exclusive && data < min) || (exclusive && data <= min) { - return errors.ExceedsMinimumInt(path, in, min, exclusive) + return errors.ExceedsMinimumInt(path, in, min, exclusive, data) } return nil } @@ -192,7 +218,7 @@ func MinimumInt(path, in string, data, min int64, exclusive bool) *errors.Valida // MinimumUint validates if a number is smaller than a given minimum func MinimumUint(path, in string, data, min uint64, exclusive bool) *errors.Validation { if (!exclusive && data < min) || (exclusive && data <= min) { - return errors.ExceedsMinimumUint(path, in, min, exclusive) + return errors.ExceedsMinimumUint(path, in, min, exclusive, data) } return nil } @@ -210,7 +236,7 @@ func MultipleOf(path, in string, data, factor float64) *errors.Validation { mult = data / factor } if !swag.IsFloat64AJSONInteger(mult) { - return errors.NotMultipleOf(path, in, factor) + return errors.NotMultipleOf(path, in, factor, data) } return nil } @@ -223,7 +249,7 @@ func MultipleOfInt(path, in string, data int64, factor int64) *errors.Validation } mult := data / factor if mult*factor != data { - return errors.NotMultipleOf(path, in, factor) + return errors.NotMultipleOf(path, in, factor, data) } return nil } @@ -232,7 +258,7 @@ func MultipleOfInt(path, in string, data int64, factor int64) *errors.Validation func MultipleOfUint(path, in string, data, factor uint64) *errors.Validation { mult := data / factor if mult*factor != data { - return errors.NotMultipleOf(path, in, factor) + return errors.NotMultipleOf(path, in, factor, data) } return nil } @@ -270,7 +296,7 @@ func MaximumNativeType(path, in string, val interface{}, max float64, exclusive case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: value := valueHelp.asUint64(val) if max < 0 { - return errors.ExceedsMaximum(path, in, max, exclusive) + return errors.ExceedsMaximum(path, in, max, exclusive, val) } return MaximumUint(path, in, value, uint64(max), exclusive) case reflect.Float32, reflect.Float64: @@ -361,26 +387,26 @@ func IsValueValidAgainstRange(val interface{}, typeName, format, prefix, path st var errVal error switch typeName { - case "integer": + case integerType: switch format { - case "int32": + case integerFormatInt32: _, errVal = swag.ConvertInt32(stringRep) - case "uint32": + case integerFormatUInt32: _, errVal = swag.ConvertUint32(stringRep) - case "uint64": + case integerFormatUInt64: _, errVal = swag.ConvertUint64(stringRep) - case "int64": + case integerFormatInt64: fallthrough default: _, errVal = swag.ConvertInt64(stringRep) } - case "number": + case numberType: fallthrough default: switch format { - case "float", "float32": + case numberFormatFloat, numberFormatFloat32: _, errVal = swag.ConvertFloat32(stringRep) - case "double", "float64": + case numberFormatDouble, numberFormatFloat64: fallthrough default: // No check can be performed here since diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff.go index 9836b8b9f4..745d5ca4c9 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff.go @@ -2,11 +2,14 @@ package commands import ( "encoding/json" - "errors" + "fmt" + "io" "io/ioutil" "log" "os" + "errors" + "github.com/go-openapi/loads" "github.com/go-swagger/go-swagger/cmd/swagger/commands/diff" ) @@ -22,32 +25,46 @@ type DiffCommand struct { Format string `long:"format" short:"f" description:"When present, writes output as json" default:"txt" choice:"txt" choice:"json"` IgnoreFile string `long:"ignore" short:"i" description:"Exception file of diffs to ignore (copy output from json diff format)" default:"none specified"` Destination string `long:"dest" short:"d" description:"Output destination file or stdout" default:"stdout"` + Args struct { + OldSpec string `positional-arg-name:"{old spec}"` + NewSpec string `positional-arg-name:"{new spec}"` + } `required:"2" positional-args:"specs" description:"Input specs to be diff-ed"` } // Execute diffs the two specs provided -func (c *DiffCommand) Execute(args []string) error { - if len(args) != 2 { - msg := `missing arguments for diff command (use --help for more info)` - return errors.New(msg) +func (c *DiffCommand) Execute(_ []string) error { + if c.Args.OldSpec == "" || c.Args.NewSpec == "" { + return errors.New(`missing arguments for diff command (use --help for more info)`) } - log.Println("Run Config:") - log.Printf("Spec1: %s", args[0]) - log.Printf("Spec2: %s", args[1]) - log.Printf("ReportOnlyBreakingChanges (-c) :%v", c.OnlyBreakingChanges) - log.Printf("OutputFormat (-f) :%s", c.Format) - log.Printf("IgnoreFile (-i) :%s", c.IgnoreFile) - log.Printf("Diff Report Destination (-d) :%s", c.Destination) + c.printInfo() - diffs, err := getDiffs(args[0], args[1]) + var ( + output io.WriteCloser + err error + ) + if c.Destination != "" { + output, err = os.OpenFile(c.Destination, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0600) + if err != nil { + return fmt.Errorf("%s: %w", c.Destination, err) + } + defer func() { + _ = output.Close() + }() + } else { + output = os.Stdout + } + + diffs, err := c.getDiffs() if err != nil { return err } - ignores, err := readIgnores(c.IgnoreFile) + ignores, err := c.readIgnores() if err != nil { return err } + diffs = diffs.FilterIgnores(ignores) if len(ignores) > 0 { log.Printf("Diff Report Ignored Items from IgnoreFile") @@ -56,40 +73,44 @@ func (c *DiffCommand) Execute(args []string) error { } } - if c.Format == JSONFormat { - err = diffs.ReportAllDiffs(true) - if err != nil { - return err - } + var ( + input io.Reader + warn error + ) + if c.Format != JSONFormat && c.OnlyBreakingChanges { + input, err, warn = diffs.ReportCompatibility() } else { - if c.OnlyBreakingChanges { - err = diffs.ReportCompatibility() - } else { - err = diffs.ReportAllDiffs(false) - } + input, err, warn = diffs.ReportAllDiffs(c.Format == JSONFormat) } - return err + if err != nil { + return err + } + _, err = io.Copy(output, input) + if err != nil { + return err + } + return warn } -func readIgnores(ignoreFile string) (diff.SpecDifferences, error) { +func (c *DiffCommand) readIgnores() (diff.SpecDifferences, error) { + ignoreFile := c.IgnoreFile ignoreDiffs := diff.SpecDifferences{} - if ignoreFile == "none specified" { + if ignoreFile == "none specified" || ignoreFile == "" { return ignoreDiffs, nil } // Open our jsonFile jsonFile, err := os.Open(ignoreFile) - // if we os.Open returns an error then handle it if err != nil { - return nil, err + return nil, fmt.Errorf("%s: %w", ignoreFile, err) } - // defer the closing of our jsonFile so that we can parse it later on - defer jsonFile.Close() + defer func() { + _ = jsonFile.Close() + }() byteValue, err := ioutil.ReadAll(jsonFile) if err != nil { - return nil, err + return nil, fmt.Errorf("reading %s: %w", ignoreFile, err) } - // def err = json.Unmarshal(byteValue, &ignoreDiffs) if err != nil { return nil, err @@ -97,10 +118,10 @@ func readIgnores(ignoreFile string) (diff.SpecDifferences, error) { return ignoreDiffs, nil } -func getDiffs(oldSpecPath, newSpecPath string) (diff.SpecDifferences, error) { +func (c *DiffCommand) getDiffs() (diff.SpecDifferences, error) { + oldSpecPath, newSpecPath := c.Args.OldSpec, c.Args.NewSpec swaggerDoc1 := oldSpecPath specDoc1, err := loads.Spec(swaggerDoc1) - if err != nil { return nil, err } @@ -113,3 +134,13 @@ func getDiffs(oldSpecPath, newSpecPath string) (diff.SpecDifferences, error) { return diff.Compare(specDoc1.Spec(), specDoc2.Spec()) } + +func (c *DiffCommand) printInfo() { + log.Println("Run Config:") + log.Printf("Spec1: %s", c.Args.OldSpec) + log.Printf("Spec2: %s", c.Args.NewSpec) + log.Printf("ReportOnlyBreakingChanges (-c) :%v", c.OnlyBreakingChanges) + log.Printf("OutputFormat (-f) :%s", c.Format) + log.Printf("IgnoreFile (-i) :%s", c.IgnoreFile) + log.Printf("Diff Report Destination (-d) :%s", c.Destination) +} diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/array_diff.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/array_diff.go index a979cca7ba..6e2fef3bc6 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/array_diff.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/array_diff.go @@ -2,22 +2,29 @@ package diff // This is a simple DSL for diffing arrays -// FromArrayStruct utility struct to encompass diffing of string arrays -type FromArrayStruct struct { +// fromArrayStruct utility struct to encompass diffing of string arrays +type fromArrayStruct struct { from []string } -// FromStringArray starts a fluent diff expression -func FromStringArray(from []string) FromArrayStruct { - return FromArrayStruct{from} +// fromStringArray starts a fluent diff expression +func fromStringArray(from []string) fromArrayStruct { + return fromArrayStruct{from} } -// DiffsTo completes a fluent dff expression -func (f FromArrayStruct) DiffsTo(toArray []string) (added, deleted, common []string) { +// DiffsTo completes a fluent diff expression +func (f fromArrayStruct) DiffsTo(toArray []string) (added, deleted, common []string) { inFrom := 1 inTo := 2 - m := make(map[string]int) + if f.from == nil { + return toArray, []string{}, []string{} + } + + m := make(map[string]int, len(toArray)) + added = make([]string, 0, len(toArray)) + deleted = make([]string, 0, len(f.from)) + common = make([]string, 0, len(f.from)) for _, item := range f.from { m[item] = inFrom @@ -43,14 +50,14 @@ func (f FromArrayStruct) DiffsTo(toArray []string) (added, deleted, common []str return } -// FromMapStruct utility struct to encompass diffing of string arrays -type FromMapStruct struct { +// fromMapStruct utility struct to encompass diffing of string arrays +type fromMapStruct struct { srcMap map[string]interface{} } -// FromStringMap starts a comparison by declaring a source map -func FromStringMap(srcMap map[string]interface{}) FromMapStruct { - return FromMapStruct{srcMap} +// fromStringMap starts a comparison by declaring a source map +func fromStringMap(srcMap map[string]interface{}) fromMapStruct { + return fromMapStruct{srcMap} } // Pair stores a pair of items which share a key in two maps @@ -60,7 +67,7 @@ type Pair struct { } // DiffsTo - generates diffs for a comparison -func (f FromMapStruct) DiffsTo(destMap map[string]interface{}) (added, deleted, common map[string]interface{}) { +func (f fromMapStruct) DiffsTo(destMap map[string]interface{}) (added, deleted, common map[string]interface{}) { added = make(map[string]interface{}) deleted = make(map[string]interface{}) common = make(map[string]interface{}) diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/difftypes.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/difftypes.go index 34f7a31bc2..32225075fa 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/difftypes.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/difftypes.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/json" "fmt" + "log" ) // SpecChangeCode enumerates the various types of diffs from one spec to another @@ -175,18 +176,18 @@ var toStringSpecChangeCode = map[SpecChangeCode]string{ var toIDSpecChangeCode = map[string]SpecChangeCode{} // Description returns an english version of this error -func (s *SpecChangeCode) Description() (result string) { - result, ok := toLongStringSpecChangeCode[*s] +func (s SpecChangeCode) Description() (result string) { + result, ok := toLongStringSpecChangeCode[s] if !ok { - fmt.Printf("WARNING: No description for %v", *s) + log.Printf("warning: No description for %v", s) result = "UNDEFINED" } return } // MarshalJSON marshals the enum as a quoted json string -func (s *SpecChangeCode) MarshalJSON() ([]byte, error) { - return stringAsQuotedBytes(toStringSpecChangeCode[*s]) +func (s SpecChangeCode) MarshalJSON() ([]byte, error) { + return stringAsQuotedBytes(toStringSpecChangeCode[s]) } // UnmarshalJSON unmashalls a quoted json string to the enum value @@ -228,8 +229,8 @@ var toStringCompatibility = map[Compatibility]string{ var toIDCompatibility = map[string]Compatibility{} // MarshalJSON marshals the enum as a quoted json string -func (s *Compatibility) MarshalJSON() ([]byte, error) { - return stringAsQuotedBytes(toStringCompatibility[*s]) +func (s Compatibility) MarshalJSON() ([]byte, error) { + return stringAsQuotedBytes(toStringCompatibility[s]) } // UnmarshalJSON unmashals a quoted json string to the enum value diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/reporting.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/reporting.go index cf7687bb55..020660f70c 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/reporting.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/reporting.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/json" "fmt" + "io" "net/url" "strings" @@ -153,10 +154,10 @@ var numberWideness = map[string]int{ "integer.int32": 0, } -func prettyprint(b []byte) ([]byte, error) { +func prettyprint(b []byte) (io.ReadWriter, error) { var out bytes.Buffer err := json.Indent(&out, b, "", " ") - return out.Bytes(), err + return &out, err } // JSONMarshal allows the item to be correctly rendered to json diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/spec_analyser.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/spec_analyser.go index f35c9e3751..eb516f3c00 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/spec_analyser.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/spec_analyser.go @@ -59,7 +59,7 @@ func (sd *SpecAnalyser) Analyse(spec1, spec2 *spec.Swagger) error { func (sd *SpecAnalyser) analyseSpecMetadata(spec1, spec2 *spec.Swagger) { // breaking if it no longer consumes any formats - added, deleted, _ := FromStringArray(spec1.Consumes).DiffsTo(spec2.Consumes) + added, deleted, _ := fromStringArray(spec1.Consumes).DiffsTo(spec2.Consumes) node := getNameOnlyDiffNode("Spec") location := DifferenceLocation{Node: node} @@ -74,7 +74,7 @@ func (sd *SpecAnalyser) analyseSpecMetadata(spec1, spec2 *spec.Swagger) { } // // breaking if it no longer produces any formats - added, deleted, _ = FromStringArray(spec1.Produces).DiffsTo(spec2.Produces) + added, deleted, _ = fromStringArray(spec1.Produces).DiffsTo(spec2.Produces) producesLocation := location.AddNode(getNameOnlyDiffNode("produces")) for _, eachAdded := range added { sd.Diffs = sd.Diffs.addDiff(SpecDifference{DifferenceLocation: producesLocation, Code: AddedProducesFormat, Compatibility: NonBreaking, DiffInfo: eachAdded}) @@ -84,7 +84,7 @@ func (sd *SpecAnalyser) analyseSpecMetadata(spec1, spec2 *spec.Swagger) { } // // breaking if it no longer supports a scheme - added, deleted, _ = FromStringArray(spec1.Schemes).DiffsTo(spec2.Schemes) + added, deleted, _ = fromStringArray(spec1.Schemes).DiffsTo(spec2.Schemes) schemesLocation := location.AddNode(getNameOnlyDiffNode("schemes")) for _, eachAdded := range added { @@ -120,7 +120,7 @@ func (sd *SpecAnalyser) analyseEndpointData() { for URLMethod, op2 := range sd.urlMethods2 { if op1, ok := sd.urlMethods1[URLMethod]; ok { - addedTags, deletedTags, _ := FromStringArray(op1.Operation.Tags).DiffsTo(op2.Operation.Tags) + addedTags, deletedTags, _ := fromStringArray(op1.Operation.Tags).DiffsTo(op2.Operation.Tags) location := DifferenceLocation{URL: URLMethod.Path, Method: URLMethod.Method} for _, eachAddedTag := range addedTags { @@ -566,7 +566,7 @@ func (sd *SpecAnalyser) compareEnums(left, right []interface{}) []TypeDiff { for _, eachRight := range right { rightStrs = append(rightStrs, fmt.Sprintf("%v", eachRight)) } - added, deleted, _ := FromStringArray(leftStrs).DiffsTo(rightStrs) + added, deleted, _ := fromStringArray(leftStrs).DiffsTo(rightStrs) if len(added) > 0 { typeChange := strings.Join(added, ",") diffs = append(diffs, TypeDiff{Change: AddedEnumValue, Description: typeChange}) diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/spec_difference.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/spec_difference.go index ead620b36b..222ea89b01 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/spec_difference.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/spec_difference.go @@ -1,8 +1,10 @@ package diff import ( + "bytes" + "errors" "fmt" - "log" + "io" "sort" ) @@ -131,19 +133,23 @@ func (sd SpecDifferences) addDiff(diff SpecDifference) SpecDifferences { } // ReportCompatibility lists and spec -func (sd *SpecDifferences) ReportCompatibility() error { +func (sd *SpecDifferences) ReportCompatibility() (io.Reader, error, error) { + var out bytes.Buffer breakingCount := sd.BreakingChangeCount() if breakingCount > 0 { - fmt.Printf("\nBREAKING CHANGES:\n=================\n") - sd.reportChanges(Breaking) - return fmt.Errorf("compatibility Test FAILED: %d Breaking changes detected", breakingCount) + fmt.Fprintln(&out, "\nBREAKING CHANGES:\n=================") + _, _ = out.ReadFrom(sd.reportChanges(Breaking)) + msg := fmt.Sprintf("compatibility test FAILED: %d breaking changes detected", breakingCount) + fmt.Fprintln(&out, msg) + return &out, nil, errors.New(msg) } - log.Printf("Compatibility test OK. No breaking changes identified.") - return nil + fmt.Fprintf(&out, "compatibility test OK. No breaking changes identified.") + return &out, nil, nil } -func (sd SpecDifferences) reportChanges(compat Compatibility) { +func (sd SpecDifferences) reportChanges(compat Compatibility) io.Reader { toReportList := []string{} + var out bytes.Buffer for _, diff := range sd { if diff.Compatibility == compat { @@ -156,35 +162,36 @@ func (sd SpecDifferences) reportChanges(compat Compatibility) { }) for _, eachDiff := range toReportList { - fmt.Println(eachDiff) + fmt.Fprintln(&out, eachDiff) } + return &out } // ReportAllDiffs lists all the diffs between two specs -func (sd SpecDifferences) ReportAllDiffs(fmtJSON bool) error { +func (sd SpecDifferences) ReportAllDiffs(fmtJSON bool) (io.Reader, error, error) { if fmtJSON { - b, err := JSONMarshal(sd) if err != nil { - log.Fatalf("Couldn't print results: %v", err) - } - pretty, err := prettyprint(b) - if err != nil { - log.Fatalf("Couldn't print results: %v", err) + return nil, fmt.Errorf("couldn't print results: %v", err), nil } - fmt.Println(string(pretty)) - return nil + out, err := prettyprint(b) + return out, err, nil } numDiffs := len(sd) if numDiffs == 0 { - fmt.Println("No changes identified") - return nil + return bytes.NewBuffer([]byte("No changes identified")), nil, nil } + var out bytes.Buffer if numDiffs != sd.BreakingChangeCount() { - fmt.Println("NON-BREAKING CHANGES:\n=====================") - sd.reportChanges(NonBreaking) + fmt.Fprintln(&out, "NON-BREAKING CHANGES:\n=====================") + _, _ = out.ReadFrom(sd.reportChanges(NonBreaking)) } - return sd.ReportCompatibility() + more, err, warn := sd.ReportCompatibility() + if err != nil { + return nil, err, warn + } + _, _ = out.ReadFrom(more) + return &out, nil, warn } diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/expand.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/expand.go index 0cffa0275c..202d83f5a1 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/expand.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/expand.go @@ -69,5 +69,5 @@ func writeToFile(swspec *spec.Swagger, pretty bool, format string, output string fmt.Println(string(b)) return nil } - return ioutil.WriteFile(output, b, 0644) + return ioutil.WriteFile(output, b, 0644) // #nosec } diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/client.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/client.go index d025c673ba..d46c0ab64d 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/client.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/client.go @@ -20,56 +20,51 @@ import ( "github.com/go-swagger/go-swagger/generator" ) +type clientOptions struct { + ClientPackage string `long:"client-package" short:"c" description:"the package to save the client specific code" default:"client"` +} + +func (co clientOptions) apply(opts *generator.GenOpts) { + opts.ClientPackage = co.ClientPackage +} + // Client the command to generate a swagger client type Client struct { - shared - Name string `long:"name" short:"A" description:"the name of the application, defaults to a mangled value of info.title"` - Operations []string `long:"operation" short:"O" description:"specify an operation to include, repeat for multiple"` - Tags []string `long:"tags" description:"the tags to include, if not specified defaults to all"` - Principal string `long:"principal" short:"P" description:"the model to use for the security principal"` - Models []string `long:"model" short:"M" description:"specify a model to include, repeat for multiple"` - DefaultScheme string `long:"default-scheme" description:"the default scheme for this client" default:"http"` - DefaultProduces string `long:"default-produces" description:"the default mime type that API operations produce" default:"application/json"` - SkipModels bool `long:"skip-models" description:"no models will be generated when this flag is specified"` - SkipOperations bool `long:"skip-operations" description:"no operations will be generated when this flag is specified"` - DumpData bool `long:"dump-data" description:"when present dumps the json for the template generator instead of generating files"` - SkipValidation bool `long:"skip-validation" description:"skips validation of spec prior to generation"` -} + WithShared + WithModels + WithOperations -func (c *Client) getOpts() (*generator.GenOpts, error) { - return &generator.GenOpts{ - Spec: string(c.Spec), - - Target: string(c.Target), - APIPackage: c.APIPackage, - ModelPackage: c.ModelPackage, - ServerPackage: c.ServerPackage, - ClientPackage: c.ClientPackage, - Principal: c.Principal, - DefaultScheme: c.DefaultScheme, - DefaultProduces: c.DefaultProduces, - IncludeModel: !c.SkipModels, - IncludeValidator: !c.SkipModels, - IncludeHandler: !c.SkipOperations, - IncludeParameters: !c.SkipOperations, - IncludeResponses: !c.SkipOperations, - ValidateSpec: !c.SkipValidation, - Tags: c.Tags, - IncludeSupport: true, - Template: c.Template, - TemplateDir: string(c.TemplateDir), - DumpData: c.DumpData, - ExistingModels: c.ExistingModels, - IsClient: true, - }, nil + clientOptions + schemeOptions + mediaOptions + + SkipModels bool `long:"skip-models" description:"no models will be generated when this flag is specified"` + SkipOperations bool `long:"skip-operations" description:"no operations will be generated when this flag is specified"` + + Name string `long:"name" short:"A" description:"the name of the application, defaults to a mangled value of info.title"` } -func (c *Client) getShared() *shared { - return &c.shared +func (c Client) apply(opts *generator.GenOpts) { + c.Shared.apply(opts) + c.Models.apply(opts) + c.Operations.apply(opts) + c.clientOptions.apply(opts) + c.schemeOptions.apply(opts) + c.mediaOptions.apply(opts) + + opts.IncludeModel = !c.SkipModels + opts.IncludeValidator = !c.SkipModels + opts.IncludeHandler = !c.SkipOperations + opts.IncludeParameters = !c.SkipOperations + opts.IncludeResponses = !c.SkipOperations + opts.Name = c.Name + + opts.IsClient = true + opts.IncludeSupport = true } func (c *Client) generate(opts *generator.GenOpts) error { - return generator.GenerateClient(c.Name, c.Models, c.Operations, opts) + return generator.GenerateClient(c.Name, c.Models.Models, c.Operations.Operations, opts) } func (c *Client) log(rp string) { diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/contrib.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/contrib.go index accec044e4..196558e70d 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/contrib.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/contrib.go @@ -6,6 +6,7 @@ import ( // contribOptionsOverride gives contributed templates the ability to override the options if they need func contribOptionsOverride(opts *generator.GenOpts) { + // nolint: gocritic switch opts.Template { case "stratoscale": // Stratoscale template needs to regenerate the configureapi on every run. diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/model.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/model.go index 2e14d43ae2..7cbc8559ab 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/model.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/model.go @@ -17,37 +17,83 @@ package generate import ( "errors" "log" + + "github.com/go-swagger/go-swagger/generator" ) -// Model the generate model file command +type modelOptions struct { + ModelPackage string `long:"model-package" short:"m" description:"the package to save the models" default:"models"` + Models []string `long:"model" short:"M" description:"specify a model to include in generation, repeat for multiple (defaults to all)"` + ExistingModels string `long:"existing-models" description:"use pre-generated models e.g. github.com/foobar/model"` + StrictAdditionalProperties bool `long:"strict-additional-properties" description:"disallow extra properties when additionalProperties is set to false"` + KeepSpecOrder bool `long:"keep-spec-order" description:"keep schema properties order identical to spec file"` + AllDefinitions bool `long:"all-definitions" description:"generate all model definitions regardless of usage in operations" hidden:"deprecated"` + StructTags []string `long:"struct-tags" description:"the struct tags to generate, repeat for multiple (defaults to json)"` +} + +func (mo modelOptions) apply(opts *generator.GenOpts) { + opts.ModelPackage = mo.ModelPackage + opts.Models = mo.Models + opts.ExistingModels = mo.ExistingModels + opts.StrictAdditionalProperties = mo.StrictAdditionalProperties + opts.PropertiesSpecOrder = mo.KeepSpecOrder + opts.IgnoreOperations = mo.AllDefinitions + opts.StructTags = mo.StructTags +} + +// WithModels adds the model options group. +// +// This group is available to all commands that need some model generation. +type WithModels struct { + Models modelOptions `group:"Options for model generation"` +} + +// Model the generate model file command. +// +// Define the options that are specific to the "swagger generate model" command. type Model struct { - shared - Name []string `long:"name" short:"n" description:"the model to generate"` - NoStruct bool `long:"skip-struct" description:"when present will not generate the model struct"` - DumpData bool `long:"dump-data" description:"when present dumps the json for the template generator instead of generating files"` - SkipValidation bool `long:"skip-validation" description:"skips validation of spec prior to generation"` + WithShared + WithModels + + NoStruct bool `long:"skip-struct" description:"when present will not generate the model struct" hidden:"deprecated"` + Name []string `long:"name" short:"n" description:"the model to generate, repeat for multiple (defaults to all). Same as --models"` + AcceptDefinitionsOnly bool `long:"accept-definitions-only" description:"accepts a partial swagger spec wih only the definitions key"` +} + +func (m Model) apply(opts *generator.GenOpts) { + m.Shared.apply(opts) + m.Models.apply(opts) + + opts.IncludeModel = !m.NoStruct + opts.IncludeValidator = !m.NoStruct + opts.AcceptDefinitionsOnly = m.AcceptDefinitionsOnly +} + +func (m Model) log(rp string) { + log.Printf(`Generation completed! + +For this generation to compile you need to have some packages in your GOPATH: + + * github.com/go-openapi/validate + * github.com/go-openapi/strfmt + +You can get these now with: go get -u -f %s/... +`, rp) +} + +func (m *Model) generate(opts *generator.GenOpts) error { + return generator.GenerateModels(append(m.Name, m.Models.Models...), opts) } // Execute generates a model file func (m *Model) Execute(args []string) error { - if m.DumpData && len(m.Name) > 1 { + if m.Shared.DumpData && len(append(m.Name, m.Models.Models...)) > 1 { return errors.New("only 1 model at a time is supported for dumping data") } - if m.ExistingModels != "" { + if m.Models.ExistingModels != "" { log.Println("warning: Ignoring existing-models flag when generating models.") } - s := &Server{ - shared: m.shared, - Models: m.Name, - DumpData: m.DumpData, - ExcludeMain: true, - ExcludeSpec: true, - SkipSupport: true, - SkipOperations: true, - SkipModels: m.NoStruct, - SkipValidation: m.SkipValidation, - } - return s.Execute(args) + return createSwagger(m) } diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/operation.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/operation.go index dc1f2c2560..8d7c429cf1 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/operation.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/operation.go @@ -21,51 +21,69 @@ import ( "github.com/go-swagger/go-swagger/generator" ) +type operationOptions struct { + Operations []string `long:"operation" short:"O" description:"specify an operation to include, repeat for multiple (defaults to all)"` + Tags []string `long:"tags" description:"the tags to include, if not specified defaults to all" group:"operations"` + APIPackage string `long:"api-package" short:"a" description:"the package to save the operations" default:"operations"` + WithEnumCI bool `long:"with-enum-ci" description:"allow case-insensitive enumerations"` + + // tags handling + SkipTagPackages bool `long:"skip-tag-packages" description:"skips the generation of tag-based operation packages, resulting in a flat generation"` +} + +func (oo operationOptions) apply(opts *generator.GenOpts) { + opts.Operations = oo.Operations + opts.Tags = oo.Tags + opts.APIPackage = oo.APIPackage + opts.AllowEnumCI = oo.WithEnumCI + opts.SkipTagPackages = oo.SkipTagPackages +} + +// WithOperations adds the operations options group +type WithOperations struct { + Operations operationOptions `group:"Options for operation generation"` +} + // Operation the generate operation files command type Operation struct { - shared - Name []string `long:"name" short:"n" required:"true" description:"the operations to generate, repeat for multiple"` - Tags []string `long:"tags" description:"the tags to include, if not specified defaults to all"` - Principal string `short:"P" long:"principal" description:"the model to use for the security principal"` - DefaultScheme string `long:"default-scheme" description:"the default scheme for this API" default:"http"` - NoHandler bool `long:"skip-handler" description:"when present will not generate an operation handler"` - NoStruct bool `long:"skip-parameters" description:"when present will not generate the parameter model struct"` - NoResponses bool `long:"skip-responses" description:"when present will not generate the response model struct"` - NoURLBuilder bool `long:"skip-url-builder" description:"when present will not generate a URL builder"` - DumpData bool `long:"dump-data" description:"when present dumps the json for the template generator instead of generating files"` - SkipValidation bool `long:"skip-validation" description:"skips validation of spec prior to generation"` -} + WithShared + WithOperations + + clientOptions + serverOptions + schemeOptions + mediaOptions -func (o *Operation) getOpts() (*generator.GenOpts, error) { - return &generator.GenOpts{ - Spec: string(o.Spec), - Target: string(o.Target), - APIPackage: o.APIPackage, - ModelPackage: o.ModelPackage, - ServerPackage: o.ServerPackage, - ClientPackage: o.ClientPackage, - Principal: o.Principal, - DumpData: o.DumpData, - DefaultScheme: o.DefaultScheme, - TemplateDir: string(o.TemplateDir), - IncludeHandler: !o.NoHandler, - IncludeResponses: !o.NoResponses, - IncludeParameters: !o.NoStruct, - IncludeURLBuilder: !o.NoURLBuilder, - Tags: o.Tags, - ValidateSpec: !o.SkipValidation, - }, nil + ModelPackage string `long:"model-package" short:"m" description:"the package to save the models" default:"models"` + + NoHandler bool `long:"skip-handler" description:"when present will not generate an operation handler"` + NoStruct bool `long:"skip-parameters" description:"when present will not generate the parameter model struct"` + NoResponses bool `long:"skip-responses" description:"when present will not generate the response model struct"` + NoURLBuilder bool `long:"skip-url-builder" description:"when present will not generate a URL builder"` + + Name []string `long:"name" short:"n" description:"the operations to generate, repeat for multiple (defaults to all). Same as --operations"` } -func (o *Operation) getShared() *shared { - return &o.shared +func (o Operation) apply(opts *generator.GenOpts) { + o.Shared.apply(opts) + o.Operations.apply(opts) + o.clientOptions.apply(opts) + o.serverOptions.apply(opts) + o.schemeOptions.apply(opts) + o.mediaOptions.apply(opts) + + opts.ModelPackage = o.ModelPackage + opts.IncludeHandler = !o.NoHandler + opts.IncludeResponses = !o.NoResponses + opts.IncludeParameters = !o.NoStruct + opts.IncludeURLBuilder = !o.NoURLBuilder } func (o *Operation) generate(opts *generator.GenOpts) error { - return generator.GenerateServerOperation(o.Name, opts) + return generator.GenerateServerOperation(append(o.Name, o.Operations.Operations...), opts) } -func (o *Operation) log(rp string) { +func (o Operation) log(rp string) { log.Printf(`Generation completed! @@ -79,7 +97,7 @@ You can get these now with: go get -u -f %s/... // Execute generates a model file func (o *Operation) Execute(args []string) error { - if o.DumpData && len(o.Name) > 1 { + if o.Shared.DumpData && len(append(o.Name, o.Operations.Operations...)) > 1 { return errors.New("only 1 operation at a time is supported for dumping data") } diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/server.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/server.go index a8c4e5a0bd..e506a013c2 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/server.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/server.go @@ -21,87 +21,81 @@ import ( "github.com/go-swagger/go-swagger/generator" ) +type serverOptions struct { + ServerPackage string `long:"server-package" short:"s" description:"the package to save the server specific code" default:"restapi"` + MainTarget string `long:"main-package" short:"" description:"the location of the generated main. Defaults to cmd/{name}-server" default:""` +} + +func (cs serverOptions) apply(opts *generator.GenOpts) { + opts.ServerPackage = cs.ServerPackage +} + // Server the command to generate an entire server application type Server struct { - shared - Name string `long:"name" short:"A" description:"the name of the application, defaults to a mangled value of info.title"` - Operations []string `long:"operation" short:"O" description:"specify an operation to include, repeat for multiple"` - Tags []string `long:"tags" description:"the tags to include, if not specified defaults to all"` - Principal string `long:"principal" short:"P" description:"the model to use for the security principal"` - DefaultScheme string `long:"default-scheme" description:"the default scheme for this API" default:"http"` - Models []string `long:"model" short:"M" description:"specify a model to include, repeat for multiple"` - SkipModels bool `long:"skip-models" description:"no models will be generated when this flag is specified"` - SkipOperations bool `long:"skip-operations" description:"no operations will be generated when this flag is specified"` - SkipSupport bool `long:"skip-support" description:"no supporting files will be generated when this flag is specified"` - ExcludeMain bool `long:"exclude-main" description:"exclude main function, so just generate the library"` - ExcludeSpec bool `long:"exclude-spec" description:"don't embed the swagger specification"` - WithContext bool `long:"with-context" description:"handlers get a context as first arg (deprecated)"` - DumpData bool `long:"dump-data" description:"when present dumps the json for the template generator instead of generating files"` - FlagStrategy string `long:"flag-strategy" description:"the strategy to provide flags for the server" default:"go-flags" choice:"go-flags" choice:"pflag" choice:"flag"` - CompatibilityMode string `long:"compatibility-mode" description:"the compatibility mode for the tls server" default:"modern" choice:"modern" choice:"intermediate"` - SkipValidation bool `long:"skip-validation" description:"skips validation of spec prior to generation"` - RegenerateConfigureAPI bool `long:"regenerate-configureapi" description:"Force regeneration of configureapi.go"` - KeepSpecOrder bool `long:"keep-spec-order" description:"Keep schema properties order identical to spec file"` - StrictAdditionalProperties bool `long:"strict-additional-properties" description:"disallow extra properties when additionalProperties is set to false"` + WithShared + WithModels + WithOperations + + serverOptions + schemeOptions + mediaOptions + + SkipModels bool `long:"skip-models" description:"no models will be generated when this flag is specified"` + SkipOperations bool `long:"skip-operations" description:"no operations will be generated when this flag is specified"` + SkipSupport bool `long:"skip-support" description:"no supporting files will be generated when this flag is specified"` + ExcludeMain bool `long:"exclude-main" description:"exclude main function, so just generate the library"` + ExcludeSpec bool `long:"exclude-spec" description:"don't embed the swagger specification"` + FlagStrategy string `long:"flag-strategy" description:"the strategy to provide flags for the server" default:"go-flags" choice:"go-flags" choice:"pflag" choice:"flag"` // nolint: staticcheck + CompatibilityMode string `long:"compatibility-mode" description:"the compatibility mode for the tls server" default:"modern" choice:"modern" choice:"intermediate"` // nolint: staticcheck + RegenerateConfigureAPI bool `long:"regenerate-configureapi" description:"Force regeneration of configureapi.go"` + + Name string `long:"name" short:"A" description:"the name of the application, defaults to a mangled value of info.title"` + // TODO(fredbi): CmdName string `long:"cmd-name" short:"A" description:"the name of the server command, when main is generated (defaults to {name}-server)"` + + //deprecated flags + WithContext bool `long:"with-context" description:"handlers get a context as first arg (deprecated)"` } -func (s *Server) getOpts() (*generator.GenOpts, error) { - // warning: deprecation +func (s Server) apply(opts *generator.GenOpts) { if s.WithContext { log.Printf("warning: deprecated option --with-context is ignored") } - return &generator.GenOpts{ - Spec: string(s.Spec), - Target: string(s.Target), - APIPackage: s.APIPackage, - ModelPackage: s.ModelPackage, - ServerPackage: s.ServerPackage, - ClientPackage: s.ClientPackage, - Principal: s.Principal, - DefaultScheme: s.DefaultScheme, - IncludeModel: !s.SkipModels, - IncludeValidator: !s.SkipModels, - IncludeHandler: !s.SkipOperations, - IncludeParameters: !s.SkipOperations, - IncludeResponses: !s.SkipOperations, - IncludeURLBuilder: !s.SkipOperations, - IncludeMain: !s.ExcludeMain, - IncludeSupport: !s.SkipSupport, - PropertiesSpecOrder: s.KeepSpecOrder, - ValidateSpec: !s.SkipValidation, - ExcludeSpec: s.ExcludeSpec, - StrictAdditionalProperties: s.StrictAdditionalProperties, - Template: s.Template, - RegenerateConfigureAPI: s.RegenerateConfigureAPI, - TemplateDir: string(s.TemplateDir), - DumpData: s.DumpData, - Models: s.Models, - Operations: s.Operations, - Tags: s.Tags, - Name: s.Name, - FlagStrategy: s.FlagStrategy, - CompatibilityMode: s.CompatibilityMode, - ExistingModels: s.ExistingModels, - AllowTemplateOverride: s.AllowTemplateOverride, - }, nil -} + s.Shared.apply(opts) + s.Models.apply(opts) + s.Operations.apply(opts) + s.serverOptions.apply(opts) + s.schemeOptions.apply(opts) + s.mediaOptions.apply(opts) + + opts.IncludeModel = !s.SkipModels + opts.IncludeValidator = !s.SkipModels + opts.IncludeHandler = !s.SkipOperations + opts.IncludeParameters = !s.SkipOperations + opts.IncludeResponses = !s.SkipOperations + opts.IncludeURLBuilder = !s.SkipOperations + opts.IncludeSupport = !s.SkipSupport + opts.IncludeMain = !s.ExcludeMain + opts.FlagStrategy = s.FlagStrategy + opts.CompatibilityMode = s.CompatibilityMode + opts.RegenerateConfigureAPI = s.RegenerateConfigureAPI -func (s *Server) getShared() *shared { - return &s.shared + opts.Name = s.Name + opts.MainPackage = s.MainTarget } func (s *Server) generate(opts *generator.GenOpts) error { - return generator.GenerateServer(s.Name, s.Models, s.Operations, opts) + return generator.GenerateServer(s.Name, s.Models.Models, s.Operations.Operations, opts) } -func (s *Server) log(rp string) { +func (s Server) log(rp string) { var flagsPackage string - if strings.HasPrefix(s.FlagStrategy, "pflag") { + switch { + case strings.HasPrefix(s.FlagStrategy, "pflag"): flagsPackage = "github.com/spf13/pflag" - } else if strings.HasPrefix(s.FlagStrategy, "flag") { + case strings.HasPrefix(s.FlagStrategy, "flag"): flagsPackage = "flag" - } else { + default: flagsPackage = "github.com/jessevdk/go-flags" } diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/shared.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/shared.go index 90bd351368..6e233e928f 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/shared.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/shared.go @@ -1,10 +1,12 @@ package generate import ( + "fmt" "io/ioutil" "log" "os" "path/filepath" + "strings" "github.com/go-openapi/analysis" "github.com/go-openapi/swag" @@ -15,8 +17,8 @@ import ( // FlattenCmdOptions determines options to the flatten spec preprocessing type FlattenCmdOptions struct { - WithExpand bool `long:"with-expand" description:"expands all $ref's in spec prior to generation (shorthand to --with-flatten=expand)"` - WithFlatten []string `long:"with-flatten" description:"flattens all $ref's in spec prior to generation" choice:"minimal" choice:"full" choice:"expand" choice:"verbose" choice:"noverbose" choice:"remove-unused" default:"minimal" default:"verbose"` + WithExpand bool `long:"with-expand" description:"expands all $ref's in spec prior to generation (shorthand to --with-flatten=expand)" group:"shared"` + WithFlatten []string `long:"with-flatten" description:"flattens all $ref's in spec prior to generation" choice:"minimal" choice:"full" choice:"expand" choice:"verbose" choice:"noverbose" choice:"remove-unused" default:"minimal" default:"verbose" group:"shared"` // nolint: staticcheck } // SetFlattenOptions builds flatten options from command line args @@ -30,138 +32,159 @@ func (f *FlattenCmdOptions) SetFlattenOptions(dflt *analysis.FlattenOpts) (res * } verboseIsSet := false minimalIsSet := false - //removeUnusedIsSet := false expandIsSet := false if f.WithExpand { res.Expand = true expandIsSet = true } for _, opt := range f.WithFlatten { - if opt == "verbose" { + switch opt { + case "verbose": res.Verbose = true verboseIsSet = true - } - if opt == "noverbose" && !verboseIsSet { - // verbose flag takes precedence - res.Verbose = false - verboseIsSet = true - } - if opt == "remove-unused" { + case "noverbose": + if !verboseIsSet { + // verbose flag takes precedence + res.Verbose = false + verboseIsSet = true + } + case "remove-unused": res.RemoveUnused = true - //removeUnusedIsSet = true - } - if opt == "expand" { + case "expand": res.Expand = true expandIsSet = true - } - if opt == "full" && !minimalIsSet && !expandIsSet { - // minimal flag takes precedence - res.Minimal = false - minimalIsSet = true - } - if opt == "minimal" && !expandIsSet { - // expand flag takes precedence - res.Minimal = true - minimalIsSet = true + case "full": + if !minimalIsSet && !expandIsSet { + // minimal flag takes precedence + res.Minimal = false + minimalIsSet = true + } + case "minimal": + if !expandIsSet { + // expand flag takes precedence + res.Minimal = true + minimalIsSet = true + } } } return } -type shared struct { - Spec flags.Filename `long:"spec" short:"f" description:"the spec file to use (default swagger.{json,yml,yaml})"` - APIPackage string `long:"api-package" short:"a" description:"the package to save the operations" default:"operations"` - ModelPackage string `long:"model-package" short:"m" description:"the package to save the models" default:"models"` - ServerPackage string `long:"server-package" short:"s" description:"the package to save the server specific code" default:"restapi"` - ClientPackage string `long:"client-package" short:"c" description:"the package to save the client specific code" default:"client"` - Target flags.Filename `long:"target" short:"t" default:"./" description:"the base directory for generating the files"` - Template string `long:"template" description:"Load contributed templates" choice:"stratoscale"` - TemplateDir flags.Filename `long:"template-dir" short:"T" description:"alternative template override directory"` - ConfigFile flags.Filename `long:"config-file" short:"C" description:"configuration file to use for overriding template options"` - CopyrightFile flags.Filename `long:"copyright-file" short:"r" description:"copyright file used to add copyright header"` - ExistingModels string `long:"existing-models" description:"use pre-generated models e.g. github.com/foobar/model"` - AdditionalInitialisms []string `long:"additional-initialism" description:"consecutive capitals that should be considered intialisms"` - AllowTemplateOverride bool `long:"allow-template-override" description:"allows overriding protected templates"` - FlattenCmdOptions -} - type sharedCommand interface { - getOpts() (*generator.GenOpts, error) - getShared() *shared - getConfigFile() flags.Filename - getAdditionalInitialisms() []string + apply(*generator.GenOpts) + getConfigFile() string generate(*generator.GenOpts) error log(string) } -func (s *shared) getConfigFile() flags.Filename { - return s.ConfigFile +type schemeOptions struct { + Principal string `short:"P" long:"principal" description:"the model to use for the security principal"` + DefaultScheme string `long:"default-scheme" description:"the default scheme for this API" default:"http"` } -func (s *shared) getAdditionalInitialisms() []string { - return s.AdditionalInitialisms +func (so schemeOptions) apply(opts *generator.GenOpts) { + opts.Principal = so.Principal + opts.DefaultScheme = so.DefaultScheme } -func (s *shared) setCopyright() (string, error) { - var copyrightstr string - copyrightfile := string(s.CopyrightFile) - if copyrightfile != "" { - //Read the Copyright from file path in opts - bytebuffer, err := ioutil.ReadFile(copyrightfile) - if err != nil { - return "", err - } - copyrightstr = string(bytebuffer) - } else { - copyrightstr = "" +type mediaOptions struct { + DefaultProduces string `long:"default-produces" description:"the default mime type that API operations produce" default:"application/json"` + DefaultConsumes string `long:"default-consumes" description:"the default mime type that API operations consume" default:"application/json"` +} + +func (m mediaOptions) apply(opts *generator.GenOpts) { + opts.DefaultProduces = m.DefaultProduces + opts.DefaultConsumes = m.DefaultConsumes + + const xmlIdentifier = "xml" + opts.WithXML = strings.Contains(opts.DefaultProduces, xmlIdentifier) || strings.Contains(opts.DefaultConsumes, xmlIdentifier) +} + +// WithShared adds the shared options group +type WithShared struct { + Shared sharedOptions `group:"Options common to all code generation commands"` +} + +func (w WithShared) getConfigFile() string { + return string(w.Shared.ConfigFile) +} + +type sharedOptions struct { + Spec flags.Filename `long:"spec" short:"f" description:"the spec file to use (default swagger.{json,yml,yaml})" group:"shared"` + Target flags.Filename `long:"target" short:"t" default:"./" description:"the base directory for generating the files" group:"shared"` + Template string `long:"template" description:"load contributed templates" choice:"stratoscale" group:"shared"` + TemplateDir flags.Filename `long:"template-dir" short:"T" description:"alternative template override directory" group:"shared"` + ConfigFile flags.Filename `long:"config-file" short:"C" description:"configuration file to use for overriding template options" group:"shared"` + CopyrightFile flags.Filename `long:"copyright-file" short:"r" description:"copyright file used to add copyright header" group:"shared"` + AdditionalInitialisms []string `long:"additional-initialism" description:"consecutive capitals that should be considered intialisms" group:"shared"` + AllowTemplateOverride bool `long:"allow-template-override" description:"allows overriding protected templates" group:"shared"` + SkipValidation bool `long:"skip-validation" description:"skips validation of spec prior to generation" group:"shared"` + DumpData bool `long:"dump-data" description:"when present dumps the json for the template generator instead of generating files" group:"shared"` + StrictResponders bool `long:"strict-responders" description:"Use strict type for the handler return value"` + FlattenCmdOptions +} + +func (s sharedOptions) apply(opts *generator.GenOpts) { + opts.Spec = string(s.Spec) + opts.Target = string(s.Target) + opts.Template = s.Template + opts.TemplateDir = string(s.TemplateDir) + opts.AllowTemplateOverride = s.AllowTemplateOverride + opts.ValidateSpec = !s.SkipValidation + opts.DumpData = s.DumpData + opts.FlattenOpts = s.FlattenCmdOptions.SetFlattenOptions(opts.FlattenOpts) + opts.Copyright = string(s.CopyrightFile) + opts.StrictResponders = s.StrictResponders + + swag.AddInitialisms(s.AdditionalInitialisms...) +} + +func setCopyright(copyrightFile string) (string, error) { + // read the Copyright from file path in opts + if copyrightFile == "" { + return "", nil } - return copyrightstr, nil + bytebuffer, err := ioutil.ReadFile(copyrightFile) + if err != nil { + return "", err + } + return string(bytebuffer), nil } func createSwagger(s sharedCommand) error { - cfg, erc := readConfig(string(s.getConfigFile())) - if erc != nil { - return erc + cfg, err := readConfig(s.getConfigFile()) + if err != nil { + return err } - setDebug(cfg) + setDebug(cfg) // viper config Debug - opts, ero := s.getOpts() - if ero != nil { - return ero + opts := new(generator.GenOpts) + s.apply(opts) + + opts.Copyright, err = setCopyright(opts.Copyright) + if err != nil { + return fmt.Errorf("could not load copyright file: %v", err) } if opts.Template != "" { contribOptionsOverride(opts) } - if err := opts.EnsureDefaults(); err != nil { + if err = opts.EnsureDefaults(); err != nil { return err } - if err := configureOptsFromConfig(cfg, opts); err != nil { + if err = configureOptsFromConfig(cfg, opts); err != nil { return err } - swag.AddInitialisms(s.getAdditionalInitialisms()...) - - if sharedOpts := s.getShared(); sharedOpts != nil { - // process shared options - opts.FlattenOpts = sharedOpts.FlattenCmdOptions.SetFlattenOptions(opts.FlattenOpts) - - copyrightStr, erc := sharedOpts.setCopyright() - if erc != nil { - return erc - } - opts.Copyright = copyrightStr - } - - if err := s.generate(opts); err != nil { + if err = s.generate(opts); err != nil { return err } - basepath, era := filepath.Abs(".") - if era != nil { - return era + basepath, err := filepath.Abs(".") + if err != nil { + return err } targetAbs, err := filepath.Abs(opts.Target) @@ -204,11 +227,12 @@ func configureOptsFromConfig(cfg *viper.Viper, opts *generator.GenOpts) error { } func setDebug(cfg *viper.Viper) { + // viper config debug if os.Getenv("DEBUG") != "" || os.Getenv("SWAGGER_DEBUG") != "" { if cfg != nil { cfg.Debug() } else { - log.Println("NO config read") + log.Println("No config read") } } } diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/spec_go111.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/spec_go111.go index b7780b70a0..72162ba26c 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/spec_go111.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/spec_go111.go @@ -94,7 +94,7 @@ func writeToFile(swspec *spec.Swagger, pretty bool, output string) error { fmt.Println(string(b)) return nil } - return ioutil.WriteFile(output, b, 0644) + return ioutil.WriteFile(output, b, 0644) // #nosec } func marshalToJSONFormat(swspec *spec.Swagger, pretty bool) ([]byte, error) { diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/support.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/support.go index fc32d72521..ad790afdbc 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/support.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/support.go @@ -22,40 +22,33 @@ import ( // Support generates the supporting files type Support struct { - shared - Name string `long:"name" short:"A" description:"the name of the application, defaults to a mangled value of info.title"` - Operations []string `long:"operation" short:"O" description:"specify an operation to include, repeat for multiple"` - Principal string `long:"principal" description:"the model to use for the security principal"` - Models []string `long:"model" short:"M" description:"specify a model to include, repeat for multiple"` - DumpData bool `long:"dump-data" description:"when present dumps the json for the template generator instead of generating files"` - DefaultScheme string `long:"default-scheme" description:"the default scheme for this API" default:"http"` -} + WithShared + WithModels + WithOperations + + clientOptions + serverOptions + schemeOptions + mediaOptions -func (s *Support) getOpts() (*generator.GenOpts, error) { - return &generator.GenOpts{ - Spec: string(s.Spec), - Target: string(s.Target), - APIPackage: s.APIPackage, - ModelPackage: s.ModelPackage, - ServerPackage: s.ServerPackage, - ClientPackage: s.ClientPackage, - Principal: s.Principal, - DumpData: s.DumpData, - DefaultScheme: s.DefaultScheme, - Template: s.Template, - TemplateDir: string(s.TemplateDir), - }, nil + Name string `long:"name" short:"A" description:"the name of the application, defaults to a mangled value of info.title"` } -func (s *Support) getShared() *shared { - return &s.shared +func (s *Support) apply(opts *generator.GenOpts) { + s.Shared.apply(opts) + s.Models.apply(opts) + s.Operations.apply(opts) + s.clientOptions.apply(opts) + s.serverOptions.apply(opts) + s.schemeOptions.apply(opts) + s.mediaOptions.apply(opts) } func (s *Support) generate(opts *generator.GenOpts) error { - return generator.GenerateSupport(s.Name, nil, nil, opts) + return generator.GenerateSupport(s.Name, s.Models.Models, s.Operations.Operations, opts) } -func (s *Support) log(rp string) { +func (s Support) log(rp string) { log.Printf(`Generation completed! diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/mixin.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/mixin.go index cae058467e..83aa682907 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/mixin.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/mixin.go @@ -16,7 +16,7 @@ import ( const ( // Output messages - nothingToDo = "Nothing to do. Need some swagger files to merge.\nUSAGE: swagger mixin [-c <expected#Collisions>] <primary-swagger-file> <mixin-swagger-file>..." + nothingToDo = "nothing to do. Need some swagger files to merge.\nUSAGE: swagger mixin [-c <expected#Collisions>] <primary-swagger-file> <mixin-swagger-file...>" ) // MixinSpec holds command line flag definitions specific to the mixin diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/serve.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/serve.go index 8598dedf7e..3f13c76a17 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/serve.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/serve.go @@ -4,16 +4,15 @@ import ( "encoding/json" "errors" "fmt" - "github.com/go-openapi/spec" "log" "net" "net/http" - "net/url" "path" "strconv" "github.com/go-openapi/loads" "github.com/go-openapi/runtime/middleware" + "github.com/go-openapi/spec" "github.com/go-openapi/swag" "github.com/gorilla/handlers" "github.com/toqueteos/webbrowser" @@ -43,7 +42,6 @@ func (s *ServeCmd) Execute(args []string) error { } if s.Flatten { - var err error specDoc, err = specDoc.Expanded(&spec.ExpandOptions{ SkipSchemas: false, ContinueOnError: true, @@ -88,17 +86,12 @@ func (s *ServeCmd) Execute(args []string) error { }, handler) visit = fmt.Sprintf("http://%s:%d%s", sh, sp, path.Join(basePath, "docs")) } else if visit != "" || s.Flavor == "swagger" { - if visit == "" { - visit = "http://petstore.swagger.io/" - } - u, err := url.Parse(visit) - if err != nil { - return err - } - q := u.Query() - q.Add("url", fmt.Sprintf("http://%s:%d%s", sh, sp, path.Join(basePath, "swagger.json"))) - u.RawQuery = q.Encode() - visit = u.String() + handler = middleware.SwaggerUI(middleware.SwaggerUIOpts{ + BasePath: basePath, + SpecURL: path.Join(basePath, "swagger.json"), + Path: "docs", + }, handler) + visit = fmt.Sprintf("http://%s:%d%s", sh, sp, path.Join(basePath, "docs")) } } diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/validate.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/validate.go index 6906c7c9c3..220c8b853a 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/validate.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/validate.go @@ -26,7 +26,7 @@ import ( const ( // Output messages - missingArgMsg = "The validate command requires the swagger document url to be specified" + missingArgMsg = "the validate command requires the swagger document url to be specified" validSpecMsg = "\nThe swagger spec at %q is valid against swagger specification %s\n" invalidSpecMsg = "\nThe swagger spec at %q is invalid against swagger specification %s.\nSee errors below:\n" warningSpecMsg = "\nThe swagger spec at %q showed up some valid but possibly unwanted constructs." diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/swagger.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/swagger.go index 2a83ac43b8..6c4a0ecc3e 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/swagger.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/swagger.go @@ -29,11 +29,6 @@ func init() { loads.AddLoader(fmts.YAMLMatcher, fmts.YAMLDoc) } -var ( - // Debug is true when the SWAGGER_DEBUG env var is not empty - Debug = os.Getenv("SWAGGER_DEBUG") != "" -) - var opts struct { // General options applicable to all commands Quiet func() `long:"quiet" short:"q" description:"silence logs"` diff --git a/vendor/github.com/go-swagger/go-swagger/codescan/application.go b/vendor/github.com/go-swagger/go-swagger/codescan/application.go index 6008191443..d6d3f1c51a 100644 --- a/vendor/github.com/go-swagger/go-swagger/codescan/application.go +++ b/vendor/github.com/go-swagger/go-swagger/codescan/application.go @@ -3,6 +3,7 @@ package codescan import ( "fmt" "go/ast" + "go/token" "go/types" "log" "os" @@ -290,7 +291,7 @@ func (s *scanCtx) FindModel(pkgPath, name string) (*entityDecl, bool) { } } if decl, found := s.FindDecl(pkgPath, name); found { - s.app.Models[decl.Ident] = decl + s.app.ExtraModels[decl.Ident] = decl return decl, true } return nil, false @@ -352,6 +353,36 @@ func (s *scanCtx) FindComments(pkg *packages.Package, name string) (*ast.Comment return nil, false } +func (s *scanCtx) FindEnumValues(pkg *packages.Package, enumName string) (list []interface{}, _ bool) { + for _, f := range pkg.Syntax { + for _, d := range f.Decls { + gd, ok := d.(*ast.GenDecl) + if !ok { + continue + } + + if gd.Tok != token.CONST { + continue + } + + for _, s := range gd.Specs { + if vs, ok := s.(*ast.ValueSpec); ok { + if vsIdent, ok := vs.Type.(*ast.Ident); ok { + if vsIdent.Name == enumName { + if len(vs.Values) > 0 { + if bl, ok := vs.Values[0].(*ast.BasicLit); ok { + list = append(list, getEnumBasicLitValue(bl)) + } + } + } + } + } + } + } + } + return list, true +} + func newTypeIndex(pkgs []*packages.Package, excludeDeps bool, includeTags, excludeTags map[string]bool, includePkgs, excludePkgs []string) (*typeIndex, error) { @@ -359,6 +390,7 @@ func newTypeIndex(pkgs []*packages.Package, ac := &typeIndex{ AllPackages: make(map[string]*packages.Package), Models: make(map[*ast.Ident]*entityDecl), + ExtraModels: make(map[*ast.Ident]*entityDecl), excludeDeps: excludeDeps, includeTags: includeTags, excludeTags: excludeTags, @@ -374,6 +406,7 @@ func newTypeIndex(pkgs []*packages.Package, type typeIndex struct { AllPackages map[string]*packages.Package Models map[*ast.Ident]*entityDecl + ExtraModels map[*ast.Ident]*entityDecl Meta []metaSection Routes []parsedPathContent Operations []parsedPathContent @@ -483,12 +516,12 @@ func (a *typeIndex) processDecl(pkg *packages.Package, file *ast.File, n node, g def, ok := pkg.TypesInfo.Defs[ts.Name] if !ok { debugLog("couldn't find type info for %s", ts.Name) - //continue + continue } nt, isNamed := def.Type().(*types.Named) if !isNamed { debugLog("%s is not a named type but a %T", ts.Name, def.Type()) - //continue + continue } decl := &entityDecl{ Comments: gd.Doc, @@ -516,16 +549,16 @@ func (a *typeIndex) walkImports(pkg *packages.Package) error { if a.excludeDeps { return nil } - for k := range pkg.Imports { - if _, known := a.AllPackages[k]; known { + for _, v := range pkg.Imports { + if _, known := a.AllPackages[v.PkgPath]; known { continue } - pk := pkg.Imports[k] - a.AllPackages[pk.PkgPath] = pk - if err := a.processPackage(pk); err != nil { + + a.AllPackages[v.PkgPath] = v + if err := a.processPackage(v); err != nil { return err } - if err := a.walkImports(pk); err != nil { + if err := a.walkImports(v); err != nil { return err } } diff --git a/vendor/github.com/go-swagger/go-swagger/codescan/enum.go b/vendor/github.com/go-swagger/go-swagger/codescan/enum.go new file mode 100644 index 0000000000..b8bd8aff30 --- /dev/null +++ b/vendor/github.com/go-swagger/go-swagger/codescan/enum.go @@ -0,0 +1,23 @@ +package codescan + +import ( + "go/ast" + "strconv" + "strings" +) + +func getEnumBasicLitValue(basicLit *ast.BasicLit) interface{} { + switch basicLit.Kind.String() { + case "INT": + if result, err := strconv.ParseInt(basicLit.Value, 10, 64); err == nil { + return result + } + case "FLOAT": + if result, err := strconv.ParseFloat(basicLit.Value, 64); err == nil { + return result + } + default: + return strings.Trim(basicLit.Value, "\"") + } + return nil +} diff --git a/vendor/github.com/go-swagger/go-swagger/codescan/meta.go b/vendor/github.com/go-swagger/go-swagger/codescan/meta.go index ddfa50ebdf..1115d0203c 100644 --- a/vendor/github.com/go-swagger/go-swagger/codescan/meta.go +++ b/vendor/github.com/go-swagger/go-swagger/codescan/meta.go @@ -201,9 +201,10 @@ func parseContactInfo(line string) (*spec.ContactInfo, error) { name, email = addr.Name, addr.Address } return &spec.ContactInfo{ - URL: url, - Name: name, - Email: email, + ContactInfoProps: spec.ContactInfoProps{ + URL: url, + Name: name, + Email: email,}, }, nil } @@ -215,8 +216,10 @@ func setInfoLicense(swspec *spec.Swagger, lines []string) error { line := lines[0] name, url := splitURL(line) info.License = &spec.License{ - Name: name, - URL: url, + LicenseProps: spec.LicenseProps{ + Name: name, + URL: url, + }, } return nil } diff --git a/vendor/github.com/go-swagger/go-swagger/codescan/parameters.go b/vendor/github.com/go-swagger/go-swagger/codescan/parameters.go index 10a578b7c6..b5f0a9364d 100644 --- a/vendor/github.com/go-swagger/go-swagger/codescan/parameters.go +++ b/vendor/github.com/go-swagger/go-swagger/codescan/parameters.go @@ -59,6 +59,10 @@ func (pt paramTypable) AddExtension(key string, value interface{}) { } } +func (pt paramTypable) WithEnum(values ...interface{}) { + pt.param.WithEnum(values...) +} + type itemsTypable struct { items *spec.Items level int @@ -90,6 +94,10 @@ func (pt itemsTypable) AddExtension(key string, value interface{}) { pt.items.AddExtension(key, value) } +func (pt itemsTypable) WithEnum(values ...interface{}) { + pt.items.WithEnum(values...) +} + type paramValidations struct { current *spec.Parameter } @@ -286,6 +294,11 @@ func (p *parameterBuilder) buildFromStruct(decl *entityDecl, tpe *types.Struct, continue } + if !fld.Exported() { + debugLog("skipping field %s because it's not exported", fld.Name()) + continue + } + tg := tpe.Tag(i) var afld *ast.Field diff --git a/vendor/github.com/go-swagger/go-swagger/codescan/parser.go b/vendor/github.com/go-swagger/go-swagger/codescan/parser.go index bbdae2dffa..8c45aedf41 100644 --- a/vendor/github.com/go-swagger/go-swagger/codescan/parser.go +++ b/vendor/github.com/go-swagger/go-swagger/codescan/parser.go @@ -200,6 +200,7 @@ type swaggerTypable interface { Schema() *spec.Schema Level() int AddExtension(key string, value interface{}) + WithEnum(...interface{}) } // Map all Go builtin types that have Json representation to Swagger/Json types. diff --git a/vendor/github.com/go-swagger/go-swagger/codescan/responses.go b/vendor/github.com/go-swagger/go-swagger/codescan/responses.go index 407a804c4e..7c92c4884a 100644 --- a/vendor/github.com/go-swagger/go-swagger/codescan/responses.go +++ b/vendor/github.com/go-swagger/go-swagger/codescan/responses.go @@ -72,13 +72,19 @@ func (ht responseTypable) Schema() *spec.Schema { func (ht responseTypable) SetSchema(schema *spec.Schema) { ht.response.Schema = schema } + func (ht responseTypable) CollectionOf(items *spec.Items, format string) { ht.header.CollectionOf(items, format) } + func (ht responseTypable) AddExtension(key string, value interface{}) { ht.response.AddExtension(key, value) } +func (ht responseTypable) WithEnum(values ...interface{}) { + ht.header.WithEnum(values) +} + type headerValidations struct { current *spec.Header } @@ -185,6 +191,7 @@ func (r *responseBuilder) buildFromField(fld *types.Var, tpe types.Type, typable if err := sb.buildFromType(ftpe.Elem(), schemaTypable{schema, typable.Level() + 1}); err != nil { return err } + r.postDecls = append(r.postDecls, sb.postDecls...) return nil case *types.Named: if decl, found := r.ctx.DeclForType(ftpe.Obj().Type()); found { diff --git a/vendor/github.com/go-swagger/go-swagger/codescan/schema.go b/vendor/github.com/go-swagger/go-swagger/codescan/schema.go index 21f254b8fc..81349a7c40 100644 --- a/vendor/github.com/go-swagger/go-swagger/codescan/schema.go +++ b/vendor/github.com/go-swagger/go-swagger/codescan/schema.go @@ -65,11 +65,17 @@ func (st schemaTypable) AdditionalProperties() swaggerTypable { st.schema.Typed("object", "") return schemaTypable{st.schema.AdditionalProperties.Schema, st.level + 1} } + func (st schemaTypable) Level() int { return st.level } + func (st schemaTypable) AddExtension(key string, value interface{}) { addExtension(&st.schema.VendorExtensible, key, value) } +func (st schemaTypable) WithEnum(values ...interface{}) { + st.schema.WithEnum(values...) +} + type schemaValidations struct { current *spec.Schema } @@ -182,8 +188,8 @@ func (s *schemaBuilder) buildFromDecl(decl *entityDecl, schema *spec.Schema) err debugLog("map: %v -> [%v]%v", s.decl.Ident.Name, tpe.Key().String(), tpe.Elem().String()) case *types.Named: o := tpe.Obj() - debugLog("got the named type object: %s.%s | isAlias: %t | exported: %t", o.Pkg().Path(), o.Name(), o.IsAlias(), o.Exported()) if o != nil { + debugLog("got the named type object: %s.%s | isAlias: %t | exported: %t", o.Pkg().Path(), o.Name(), o.IsAlias(), o.Exported()) if o.Pkg().Name() == "time" && o.Name() == "Time" { schema.Typed("string", "date-time") return nil @@ -263,6 +269,10 @@ func (s *schemaBuilder) buildFromType(tpe types.Type, tgt swaggerTypable) error tgt.Typed("string", "date-time") return nil } + if pkg.PkgPath == "encoding/json" && tio.Name() == "RawMessage" { + tgt.Typed("object", "") + return nil + } cmt, hasComments := s.ctx.FindComments(pkg, tio.Name()) if !hasComments { cmt = new(ast.CommentGroup) @@ -298,7 +308,12 @@ func (s *schemaBuilder) buildFromType(tpe types.Type, tgt swaggerTypable) error } if enumName, ok := enumName(cmt); ok { - debugLog(enumName) + enumValues, _ := s.ctx.FindEnumValues(pkg, enumName) + if len(enumValues) > 0 { + tgt.WithEnum(enumValues...) + enumTypeName := reflect.TypeOf(enumValues[0]).String() + _ = swaggerSchemaForType(enumTypeName, tgt) + } return nil } @@ -693,6 +708,11 @@ func (s *schemaBuilder) buildFromStruct(decl *entityDecl, st *types.Struct, sche break } + if afld == nil { + debugLog("can't find source associated with %s", fld.String()) + continue + } + // if the field is annotated with swagger:ignore, ignore it if ignored(afld.Doc) { continue @@ -973,6 +993,21 @@ func schemaVendorExtensibleSetter(meta *spec.Schema) func(json.RawMessage) error } } +type tagOptions []string + +func (t tagOptions) Contain(option string) bool { + for i := 1; i < len(t); i++ { + if t[i] == option { + return true + } + } + return false +} + +func (t tagOptions) Name() string { + return t[0] +} + func parseJSONTag(field *ast.Field) (name string, ignore bool, isString bool, err error) { if len(field.Names) > 0 { name = field.Names[0].Name @@ -988,19 +1023,21 @@ func parseJSONTag(field *ast.Field) (name string, ignore bool, isString bool, er if strings.TrimSpace(tv) != "" { st := reflect.StructTag(tv) - jsonParts := strings.Split(st.Get("json"), ",") - jsonName := jsonParts[0] + jsonParts := tagOptions(strings.Split(st.Get("json"), ",")) - if len(jsonParts) > 1 && jsonParts[1] == "string" { + if jsonParts.Contain("string") { // Need to check if the field type is a scalar. Otherwise, the // ",string" directive doesn't apply. isString = isFieldStringable(field.Type) } - if jsonName == "-" { + switch jsonParts.Name() { + case "-": return name, true, isString, nil - } else if jsonName != "" { - return jsonName, false, isString, nil + case "": + return name, false, isString, nil + default: + return jsonParts.Name(), false, isString, nil } } return name, false, false, nil diff --git a/vendor/github.com/go-swagger/go-swagger/codescan/spec.go b/vendor/github.com/go-swagger/go-swagger/codescan/spec.go index 4da0ddc34f..726787c11b 100644 --- a/vendor/github.com/go-swagger/go-swagger/codescan/spec.go +++ b/vendor/github.com/go-swagger/go-swagger/codescan/spec.go @@ -1,6 +1,8 @@ package codescan import ( + "go/ast" + "github.com/go-openapi/spec" ) @@ -193,11 +195,35 @@ func (s *specBuilder) buildModels() error { if !s.scanModels { return nil } + for _, decl := range s.ctx.app.Models { if err := s.buildDiscoveredSchema(decl); err != nil { return err } } + + return s.joinExtraModels() +} + +func (s *specBuilder) joinExtraModels() error { + tmp := make(map[*ast.Ident]*entityDecl, len(s.ctx.app.ExtraModels)) + for k, v := range s.ctx.app.ExtraModels { + tmp[k] = v + s.ctx.app.Models[k] = v + delete(s.ctx.app.ExtraModels, k) + } + + // process extra models and see if there is any reference to a new extra one + for _, decl := range tmp { + if err := s.buildDiscoveredSchema(decl); err != nil { + return err + } + } + + if len(s.ctx.app.ExtraModels) > 0 { + return s.joinExtraModels() + } + return nil } diff --git a/vendor/github.com/go-swagger/go-swagger/generator/bindata.go b/vendor/github.com/go-swagger/go-swagger/generator/bindata.go index d2ff442c64..d9ded7df9f 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/bindata.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/bindata.go @@ -1,36 +1,43 @@ // Code generated by go-bindata. DO NOT EDIT. // sources: -// templates/additionalpropertiesserializer.gotmpl (2.813kB) -// templates/client/client.gotmpl (4.702kB) -// templates/client/facade.gotmpl (3.932kB) -// templates/client/parameter.gotmpl (12.349kB) -// templates/client/response.gotmpl (6.436kB) -// templates/contrib/stratoscale/client/client.gotmpl (3.68kB) -// templates/contrib/stratoscale/client/facade.gotmpl (2.159kB) -// templates/contrib/stratoscale/server/configureapi.gotmpl (5.93kB) +// templates/client/client.gotmpl (5.125kB) +// templates/client/facade.gotmpl (3.83kB) +// templates/client/parameter.gotmpl (12.261kB) +// templates/client/response.gotmpl (6.363kB) +// templates/contrib/stratoscale/client/client.gotmpl (3.591kB) +// templates/contrib/stratoscale/client/facade.gotmpl (2.078kB) +// templates/contrib/stratoscale/server/configureapi.gotmpl (6.644kB) // templates/contrib/stratoscale/server/server.gotmpl (236B) -// templates/docstring.gotmpl (265B) -// templates/header.gotmpl (519B) -// templates/model.gotmpl (785B) -// templates/modelvalidator.gotmpl (447B) -// templates/schema.gotmpl (11.283kB) -// templates/schemabody.gotmpl (12.811kB) -// templates/schematype.gotmpl (854B) -// templates/schemavalidator.gotmpl (31.015kB) -// templates/server/builder.gotmpl (16.812kB) -// templates/server/configureapi.gotmpl (6.171kB) -// templates/server/doc.gotmpl (1.247kB) -// templates/server/main.gotmpl (5.969kB) -// templates/server/operation.gotmpl (3.803kB) -// templates/server/parameter.gotmpl (28.79kB) -// templates/server/responses.gotmpl (11.315kB) -// templates/server/server.gotmpl (23.074kB) +// templates/docstring.gotmpl (270B) +// templates/header.gotmpl (432B) +// templates/model.gotmpl (700B) +// templates/schema.gotmpl (5.504kB) +// templates/schemabody.gotmpl (14.007kB) +// templates/schemaembedded.gotmpl (551B) +// templates/schemapolymorphic.gotmpl (2.061kB) +// templates/schematype.gotmpl (965B) +// templates/schemavalidator.gotmpl (31.954kB) +// templates/serializers/additionalpropertiesserializer.gotmpl (2.824kB) +// templates/serializers/aliasedserializer.gotmpl (480B) +// templates/serializers/allofserializer.gotmpl (7.467kB) +// templates/serializers/basetypeserializer.gotmpl (2.894kB) +// templates/serializers/marshalbinaryserializer.gotmpl (550B) +// templates/serializers/schemaserializer.gotmpl (679B) +// templates/serializers/subtypeserializer.gotmpl (6.461kB) +// templates/serializers/tupleserializer.gotmpl (2.34kB) +// templates/server/builder.gotmpl (18.967kB) +// templates/server/configureapi.gotmpl (6.786kB) +// templates/server/doc.gotmpl (1.52kB) +// templates/server/main.gotmpl (5.965kB) +// templates/server/operation.gotmpl (3.868kB) +// templates/server/parameter.gotmpl (28.728kB) +// templates/server/responses.gotmpl (12.037kB) +// templates/server/server.gotmpl (23.049kB) // templates/server/urlbuilder.gotmpl (7.641kB) -// templates/structfield.gotmpl (1.522kB) -// templates/swagger_json_embed.gotmpl (848B) -// templates/tupleserializer.gotmpl (16.512kB) -// templates/validation/customformat.gotmpl (611B) -// templates/validation/primitive.gotmpl (2.173kB) +// templates/structfield.gotmpl (1.91kB) +// templates/swagger_json_embed.gotmpl (759B) +// templates/validation/customformat.gotmpl (473B) +// templates/validation/primitive.gotmpl (2.225kB) // templates/validation/structfield.gotmpl (909B) package generator @@ -51,7 +58,7 @@ import ( func bindataRead(data []byte, name string) ([]byte, error) { gz, err := gzip.NewReader(bytes.NewBuffer(data)) if err != nil { - return nil, fmt.Errorf("read %q: %v", name, err) + return nil, fmt.Errorf("read %q: %w", name, err) } var buf bytes.Buffer @@ -59,7 +66,7 @@ func bindataRead(data []byte, name string) ([]byte, error) { clErr := gz.Close() if err != nil { - return nil, fmt.Errorf("read %q: %v", name, err) + return nil, fmt.Errorf("read %q: %w", name, err) } if clErr != nil { return nil, err @@ -100,27 +107,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _templatesAdditionalpropertiesserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x56\x5d\x6f\xdb\x36\x14\x7d\xd7\xaf\x38\x33\xb6\x54\x1a\x54\x79\x49\xdf\xb2\x79\x40\x87\x6e\xc0\x06\x34\x1b\xd2\x75\x2f\x41\x1e\x18\xe9\xda\x66\x43\x93\x1a\x49\xcb\xcb\x04\xfd\xf7\x81\x1f\xb5\xa4\x56\x32\xdc\xbc\xcc\x4f\x16\x45\x9d\x7b\xee\xb9\xf7\x1e\xb2\x6d\x51\xd1\x9a\x4b\xc2\x82\x55\x15\xb7\x5c\x49\x26\xfe\xd0\xaa\x26\x6d\x39\x99\x77\xa4\x39\x13\xfc\x5f\xd2\x0b\x74\x5d\xb2\x5c\xe2\xbd\xdc\x31\x6d\xb6\x4c\xfc\xf6\xee\xf7\x1b\xec\x3f\x3e\x19\xd8\x2d\x37\x50\x0f\x1f\xa8\xb4\x38\x70\xbb\x45\x8f\x87\xfa\x08\x88\xb5\x56\x3b\xb8\x6f\x93\xf5\x5e\x96\x48\xdb\xb6\xb8\xa5\x92\x78\x43\xfa\x86\xed\xa8\xeb\xf0\x6d\xdb\xa2\x66\xa6\xf4\x71\x51\xb8\x55\x74\x5d\x36\x8e\x9c\x56\xcc\x32\xdc\xdd\x3f\x3c\x59\xca\x40\x5a\x2b\x8d\x36\x01\x96\x4b\x18\xcb\x36\x84\xcb\x1c\x0f\x5c\x56\xb0\x5b\x1a\x84\x4f\x80\x86\xe9\xb0\xe5\x12\x6d\x0b\x4b\xbb\x5a\x30\x4b\x58\x38\xce\x6a\x6f\x5f\x1f\x59\xff\xa4\xaa\xa7\x05\x0a\x97\x37\xc0\xd7\x2e\x08\xae\x57\xf8\x60\x94\x2c\x8e\x5c\x3c\x8f\x1c\x17\x01\x31\xfb\xde\xef\xfa\x6a\x05\xc9\x85\xe7\x03\x68\xb2\x7b\x2d\xdd\x7a\x02\x74\x91\x80\x2e\x1b\x4c\xa6\x99\xc0\xad\x6b\x26\x37\x84\xa2\xaf\x43\x78\xa3\xcb\xa6\x98\xfc\x0a\xab\x98\xd2\xf4\xeb\x00\x4a\xb2\x0a\xff\x9d\xc0\x23\xd1\x03\x82\x2e\x9b\x64\xa8\xe0\x55\x0e\x4d\x3b\xd5\x0c\xf5\x03\x93\x95\x2b\x2c\xac\xc2\x8e\xd5\x09\xc2\xde\x2b\x27\xcc\x8e\x3d\x52\xba\x63\xf5\x9d\xb1\x9a\xcb\xcd\x7d\xdb\x3a\xd5\x8a\xd7\x13\x6d\x85\xae\xf3\x32\xde\xb2\xc3\x5b\x32\x86\x6d\xc8\xf1\x13\xc6\x31\xe1\xd2\x92\x5e\xb3\x92\xda\xee\x48\x3a\x3b\xb7\x02\x57\x67\x54\xe0\xa4\xc4\x15\x09\xb2\x94\x06\xb0\xdc\xd7\x48\x73\x69\xd7\x58\x7c\xf3\xf7\xa2\x6f\xc6\x91\xa2\xe1\xe1\x44\xae\x43\x55\x5f\xe5\x5e\xbf\xe9\xe1\x68\x98\xd8\xfb\x26\xe5\x6b\x08\x92\x91\x46\x86\x1f\xf1\xdd\x31\x17\xb3\x17\x76\x46\xee\xbe\x99\x4d\xb9\xa5\x1d\xfb\xf3\xa9\xa6\xc5\x2c\xab\xcc\x03\xae\x95\xc6\x63\x8e\xc6\x41\x06\x4d\x62\x45\x43\xbc\xd0\xae\x56\x39\xce\x5f\x1c\x21\x22\xcc\x56\xae\x71\x02\xf3\x35\xa4\xb2\xd3\x18\xc5\xaf\xe6\x66\x2f\x04\x7b\x10\x4e\xf5\x8b\xa3\xe4\x9e\xcf\x54\xa9\x3f\x2b\xb7\xfb\x7d\xe4\x11\xb4\xbb\x7b\xbc\xc7\x2a\x64\x94\xf4\x6f\xdd\x48\xfc\xe5\xd4\xff\xf9\x9f\x5a\x93\x31\x5c\xc9\x38\x15\xfe\xa3\x38\xba\x7d\x97\x26\x27\x3e\x09\x02\x7e\xda\x22\x91\x96\xe4\x22\xe9\x12\xe7\xa4\x6f\x07\x3e\xfa\xa5\x2e\xca\xa5\x55\x60\xde\x47\xe3\xee\x59\x3b\x9d\x71\xd3\x41\xf4\x34\x43\x1a\x9c\x34\x0f\x4e\x9a\x79\x35\x9f\x67\x94\xf3\xa3\x75\xca\xa1\xb0\x9a\x91\xf3\x53\x15\x97\x4b\xdf\xf8\xc3\xcc\x43\x0b\x4b\x75\x90\x63\xa3\x77\x0f\x26\x1f\xb5\x5e\x4c\x3a\x8d\x6e\xdd\xbb\xca\x94\x5f\x48\x2e\xf2\xa1\x69\xc4\x99\x9c\xe6\x99\x61\xb5\x1a\x0c\xa9\x07\x88\x04\x5c\xc5\x23\xc4\x1c\x7b\x77\x48\x4d\x16\x3a\xc1\x60\x7d\x3a\x97\x19\x3e\xcf\xca\xcd\x33\xce\xf0\x03\x5e\x8d\xb7\x0f\x39\x8c\xd3\x29\x95\x2c\x99\x25\xe9\x3a\xc3\x65\x71\x15\xd3\x3a\x16\xe0\xae\xc7\x7d\x79\xe9\x26\xef\x45\xfe\xa2\x9f\x06\x56\xd7\x24\xab\x34\x2a\xd5\x87\xb9\xbb\xbc\xbe\x2f\x8a\x22\xcb\xe3\xbc\x0c\x7a\x60\x70\x63\x91\x6a\xca\x34\x9e\x7b\x67\xd9\x72\x41\xa8\xb8\x61\x42\xa8\x03\x97\x9b\xff\xe7\x02\xe3\xa6\xce\xcb\x71\xfe\xd0\xf9\x63\xab\x3c\x36\xc6\x0d\x1d\xde\x50\xa9\x2a\xd2\xa9\x03\x37\x6e\xe1\x96\x98\x7b\x76\x31\xb3\x2c\xec\x2f\xde\xc4\x54\xdf\x4b\x3f\x3c\xbf\x70\x12\x95\x49\xc7\x47\xad\xdf\xe7\xc1\xd2\x8b\x50\xc4\x33\xcf\xd7\x97\xf8\xda\xdd\x71\xae\x57\xf8\xec\xaa\x71\xd2\x24\x26\xae\x26\xb3\x8e\xe1\x09\x9d\x75\xe3\x19\x79\x6f\xff\xe2\xbf\x00\x00\x00\xff\xff\x1f\x93\x9a\x78\xfd\x0a\x00\x00") - -func templatesAdditionalpropertiesserializerGotmplBytes() ([]byte, error) { - return bindataRead( - _templatesAdditionalpropertiesserializerGotmpl, - "templates/additionalpropertiesserializer.gotmpl", - ) -} - -func templatesAdditionalpropertiesserializerGotmpl() (*asset, error) { - bytes, err := templatesAdditionalpropertiesserializerGotmplBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "templates/additionalpropertiesserializer.gotmpl", size: 2813, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0xfe, 0xa9, 0x3a, 0xd0, 0x9a, 0x6d, 0x64, 0x2f, 0x4c, 0x3b, 0x33, 0x7c, 0xfb, 0x8b, 0x89, 0x14, 0x21, 0x56, 0x9e, 0x41, 0x9c, 0x30, 0x30, 0x13, 0xf8, 0x23, 0x36, 0x7e, 0xf1, 0xaf, 0x91}} - return a, nil -} - -var _templatesClientClientGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x58\x4b\x6f\xdb\xc6\x13\xbf\xf3\x53\xcc\x5f\x7f\x27\x90\x04\x9a\x6c\xaf\x2c\x7c\x30\xec\x14\xf1\x21\xb6\x11\x09\xcd\xb1\x58\x91\x23\x72\x61\x72\x97\xd9\x87\x14\x85\xe0\x77\x2f\xf6\xc1\x95\x28\xc9\x72\x0e\x6d\x91\x43\x2f\x36\xb9\xf3\xfe\xcd\x83\xb3\x4a\x53\xb8\xe3\x05\x42\x89\x0c\x05\x51\x58\xc0\x6a\x07\x25\xbf\x96\x5b\x52\x96\x28\x7e\x83\xfb\x27\x78\x7c\x5a\xc2\x87\xfb\x87\x65\x12\x45\x51\xd7\x01\x5d\x43\x72\xc7\xdb\x9d\xa0\x65\xa5\xe0\xba\xef\xd3\x14\xba\x0e\x72\xde\x34\xc8\xd4\x11\xad\xeb\x00\x59\x01\x7d\x1f\x45\x51\x4b\xf2\x17\x52\xa2\x61\x4e\x1e\x49\x83\xf6\x34\x4d\x61\x59\x51\x09\x6b\x5a\x23\x6c\x89\x1c\x7b\xa2\x2a\x04\xef\x0a\x28\xce\xeb\xc4\xf0\x7f\x28\xa8\xa2\xac\x04\x15\xe4\x1a\x6b\xae\x15\x7c\x83\xb0\xd6\xca\xaa\xaa\x90\xc1\x8e\x6b\x10\x78\x2d\x34\x1b\x69\x1a\x4c\x58\x9f\x09\x2b\xa2\x88\x36\x2d\x17\x0a\xa6\x11\xc0\x84\xa1\x4a\x2b\xa5\xda\x89\x79\x29\xa9\xaa\xf4\x2a\xc9\x79\x93\x96\xfc\x9a\xb7\xc8\x48\x4b\x53\x14\x82\x0b\x79\x81\xc1\x58\xba\x40\x16\x9a\x29\xda\xe0\x05\x8e\x0d\xa9\x69\x41\x14\x4e\xa2\x08\x40\x2a\xb1\x6e\xd4\xab\xb6\x2c\xd5\x32\x76\x1d\x08\xc2\x4a\x84\xe4\x1e\xd7\x44\xd7\xea\xc1\xc6\x25\xc1\x26\xa2\x15\x94\xa9\x35\x4c\xde\x7d\x9d\x40\xd2\xf7\x8e\xdf\x67\xe7\x40\xf6\xea\x05\x77\x31\x5c\x6d\x48\xad\x11\xb2\x1b\x48\x46\x4a\x0c\x15\xfa\x1e\x8e\xf4\x79\xf6\x23\xad\x33\x9b\xdf\x47\xdc\x42\x2e\x90\x28\x94\x40\x80\xe1\xd6\x70\x54\xba\x21\x8c\x7e\xc7\x50\x0a\x70\xfb\xfc\x00\x79\x4d\x91\xa9\x24\x5a\x6b\x96\x1b\xb9\xa9\x12\x84\x49\x9b\x1b\x8f\x59\x72\x67\x59\x96\xc3\x79\x0c\x6b\x2e\x1a\xa2\xa4\x47\x29\xf9\x8c\x25\x95\x4a\xec\x66\x30\x77\xac\xd0\x45\x00\x02\x95\x16\x0c\xde\xbb\xa3\x2e\xa8\xcd\x40\x9d\x68\xca\x86\x87\x3e\x32\x05\x3a\x8f\x06\x3d\xae\xf6\x17\xba\x69\x88\xd8\x39\x38\xc6\x6f\x86\x7c\x8f\x32\x17\xb4\x55\x94\x33\x5b\xe0\x5d\x07\xab\x9a\xe7\x2f\xa1\x3f\xc6\x0c\x01\x2c\xf3\x50\x4b\x3c\xd6\x61\x09\x6f\x29\x30\x72\x7d\xbf\xe6\xe2\x55\x64\xf7\x39\x99\xa7\x91\xda\xb5\x08\x3e\x28\xa9\x84\xce\x1d\x46\x6f\x62\x1d\xc1\x6b\x60\x47\x2e\x50\x5f\x7c\x4f\xad\x69\x2f\xca\x99\xa9\x19\x03\xa0\x29\x16\x22\x73\x52\x8f\xdc\x3a\x87\x67\x5b\x6b\x61\xd9\x7e\xa7\x42\xaa\x2f\x5c\x14\x30\xdd\x07\xe4\x59\x67\x3f\x03\xda\x3f\x84\xb4\xad\xe3\x29\x19\x4a\x71\x06\x67\x91\x98\xb6\x44\x90\x46\xc2\xfc\x2c\xf5\xd9\x12\x7d\xbc\xb7\x5a\x55\x5c\xd0\xef\x68\x2c\xc4\x40\xb4\xaa\x1e\xd8\x9a\x1f\x65\xec\xd6\x1f\x7f\x11\x54\xa1\xe8\x3a\x64\x45\x40\xec\x23\x91\x0b\x25\x90\x34\x94\x95\x9f\x51\xb6\x9c\xd9\x70\x62\xd8\x5a\x66\xa0\x3c\x19\xc4\x7c\x20\xb3\x7d\xa6\xf2\x1c\xa5\x3c\x90\x9a\xee\x93\x7e\x44\x34\xa9\x3f\x1f\x4f\x0c\xa3\x2c\xd8\x07\x3b\x50\x5f\xb5\x32\x0b\x7c\xb6\x4e\xcd\x27\xe3\xe9\xfe\x29\x83\x3f\xfc\x90\xb4\xc3\xdd\x63\xb8\xc2\x35\x17\x08\x12\x59\x41\x59\x19\x81\x51\xe9\x49\x37\x37\xc0\x68\x6d\x55\x40\x38\x33\x53\xe6\x02\xec\xd3\x59\x04\xe0\x87\xda\x55\x8d\xac\x54\x95\x99\x89\x35\xb2\xb3\x11\x3b\xc6\xf3\x51\x08\x94\xba\x56\x5d\x67\xea\xa7\xef\xff\x0c\x31\xc5\x80\x42\x18\xa5\x24\x09\x1d\x98\x2c\xf4\xaa\xa1\x6a\xfa\x7e\x9c\xd7\xd0\x58\x2e\x86\x87\xfb\xec\x78\x0e\x07\x90\x2d\xc3\x27\x54\x15\x2f\x4e\x99\xdc\x79\x60\x7b\x26\xaa\x7a\x26\x4a\xa1\x60\xa7\xbc\x86\xb8\xe7\x14\xbc\xd0\x39\xca\x4f\x58\x50\xb2\xdc\xb5\x28\xc7\x02\xff\xdf\x18\x89\x13\xa6\x20\x7f\xc7\x99\xd4\xcd\x1b\xf2\xa7\x4c\x41\x7e\x91\x57\xd8\x9c\x15\xf2\x94\x83\x98\x4c\xfa\x32\x9f\x67\x77\xf6\x19\x49\x81\x22\x83\xf7\x67\x13\xee\xa8\x5d\xf8\x08\x90\xc4\x3f\xfe\x58\xe3\x64\xfe\x7f\xc8\x6b\x1f\x9f\xeb\x59\xeb\xc8\xd0\x9f\x59\x68\xe0\xd8\x89\x79\xfa\x1d\x67\x0a\xbf\xa9\xc1\xfb\xc4\xbf\x7b\x0c\x6d\x29\x04\xda\xc7\xe5\xf2\xd9\x1d\x19\x72\x3f\x73\x25\x6f\x4a\xea\x7f\x87\xf5\xee\x3f\x80\xaf\x56\xa7\x85\xa4\x58\x68\x21\xb8\x66\x05\x4c\x18\xad\x27\xfe\xef\x2f\xa1\xf2\x47\xcd\x8b\x42\x84\xde\xb8\x7e\x45\xab\x35\xed\xc9\xf8\x35\xe8\xf9\xd5\x91\xa4\xe3\x8f\x81\xbf\x98\xfa\x77\x0d\x92\x4c\x8f\xc6\xc6\x91\xd6\x21\x5d\x3e\x50\xfe\x32\x0e\x70\xd0\xc9\x68\xed\xbd\x4b\x53\xd0\x0c\xbf\xb5\x98\x9b\xa5\xd2\xd3\x8d\x31\xab\xce\xca\xee\x43\xf0\x7b\xd3\x08\x98\x74\x6e\x48\x04\x0a\x47\x0b\xa2\x40\xa5\xdd\x39\x69\x81\x45\x6c\x16\xd1\xda\xad\xa4\x84\x15\x83\x37\x84\x81\x1d\x6d\x30\x4f\x6d\xc4\x7b\x47\x7c\x54\x17\xe2\x3e\x72\xe5\x30\x6e\xaf\x9d\xd1\x3a\x0e\x93\xff\x11\xb7\xb7\xcf\x0f\x1f\x8c\xb5\xe9\xe4\x42\xc0\x19\xe4\xa6\x9a\x98\x02\xb2\x21\xb4\x26\xab\x1a\x81\xc8\x33\xc1\x79\xd7\x27\xf1\xa9\xd7\x67\x8e\x12\x73\x8d\x98\xce\x66\x07\x78\xfa\x0f\xa5\x4b\x81\x24\x6b\x2c\x35\x11\x45\x06\xcc\xb4\x55\x5d\xef\x62\x20\x2b\x69\x1d\x39\xb1\x6e\x0c\xbc\x30\xbe\x65\x27\xee\xcb\x13\x68\xc9\x8a\x6f\x30\x03\xc9\x1d\xfa\x26\x01\x90\xf3\x02\x4b\x64\x40\xa5\xd4\x26\xc5\x8d\x2c\x0d\xd2\x66\x65\x59\xb8\xb9\x71\x11\x23\xf0\xab\xd4\x80\x79\xe6\x96\x53\xce\x94\x20\xb9\x02\xc6\x15\x20\x5b\x73\x91\xbb\x5b\x8a\x44\xb1\x41\x91\x0c\x2b\x55\x50\xab\x38\x94\xa8\x82\xa7\x31\xac\xb4\x82\x92\xab\x0c\xde\x2d\x27\xb1\xcf\xbb\x41\xac\x25\x8c\xe6\xd3\x46\x96\x23\xf8\x58\x71\xd8\x41\x61\xed\x48\xe7\x20\x71\x83\x82\xd4\xd0\x72\x29\xa9\x49\xe0\x29\x4a\xbe\xe0\xe4\x96\xaa\xbc\x82\xb0\xcc\x0f\xb5\x66\x56\xc0\x99\xef\x1c\xa7\xdf\x2f\xff\xd4\xac\xfe\x76\xed\x3f\xff\x79\xcb\x89\xc4\xa3\x45\xe5\x6a\x13\x70\x3a\x1a\x35\xa3\x89\x62\x7d\x18\x66\xca\x15\x1d\x0d\x15\xd7\xad\x27\x91\xf7\xff\x6e\x77\xbe\x39\x29\xfe\xde\xf6\xfd\xe1\x91\xfb\x5f\x8b\xff\x73\x2d\x7e\xf5\x53\xf5\xf8\xfe\x32\x7e\x88\xed\x7e\xdc\x47\x23\xbe\x3e\x3a\x78\x31\x37\xed\x05\xee\x2f\x6b\x90\x57\xa6\xa3\xa5\x5d\x8e\xf7\x57\x3b\xee\x7e\x0a\x71\x17\xed\xd3\xfb\xc9\xa1\x86\xb7\x2f\xdf\x6e\x82\x1c\xec\xad\x70\xb3\x37\x15\xf5\xd1\x5f\x01\x00\x00\xff\xff\xfc\xd2\xf3\xdf\x5e\x12\x00\x00") +var _templatesClientClientGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x58\x4d\x6f\xdb\x38\x13\x3e\x57\xbf\x62\x5e\xbf\x69\x61\x1b\x8a\xb4\x7b\xf5\x22\x87\x20\xe9\xa2\x39\x34\x09\x62\x63\x7b\x5c\xd0\xd2\x48\x22\x22\x91\x2a\x49\xd9\x75\x05\xfd\xf7\x05\x3f\x44\x4b\xfe\x48\xb2\xc0\x6e\xb1\x87\x5e\x62\x49\xf3\xc1\x99\x67\xe6\x19\x92\x89\x63\xb8\xe1\x29\x42\x8e\x0c\x05\x51\x98\xc2\x7a\x07\x39\xbf\x94\x5b\x92\xe7\x28\x7e\x83\xdb\x07\xb8\x7f\x58\xc1\xc7\xdb\xbb\x55\x14\x04\x41\xdb\x02\xcd\x20\xba\xe1\xf5\x4e\xd0\xbc\x50\x70\xd9\x75\x71\x0c\x6d\x0b\x09\xaf\x2a\x64\xea\x40\xd6\xb6\x80\x2c\x85\xae\x0b\x82\xa0\x26\xc9\x33\xc9\x51\x2b\x47\xf7\xa4\x42\xf3\x35\x8e\x61\x55\x50\x09\x19\x2d\x11\xb6\x44\x8e\x23\x51\x05\x82\x0b\x05\x14\xe7\x65\xa4\xf5\x3f\xa6\x54\x51\x96\x83\xf2\x76\x95\x59\xae\x16\x7c\x83\x90\x35\xca\xb8\x2a\x90\xc1\x8e\x37\x20\xf0\x52\x34\x6c\xe4\xa9\x5f\xc2\xc4\x4c\x58\x1a\x04\xb4\xaa\xb9\x50\x30\x0d\x00\x26\x59\xa5\x26\xfa\x97\x72\xf3\xc3\x50\xc5\x85\x52\xf5\x24\xd0\x6f\x39\x55\x45\xb3\x8e\x12\x5e\xc5\x39\xbf\xe4\x35\x32\x52\xd3\x18\x85\xe0\x42\x4e\xce\x2b\x88\x86\x29\x5a\xe1\x0b\x1a\x52\x89\x7e\xe1\x33\x0a\x5b\x92\xbf\x20\xde\x90\x92\xa6\x44\xa1\x09\x53\x57\xc9\x64\x24\x21\xba\xc5\x8c\x34\xa5\xba\x73\xef\x5d\x77\x20\x1f\x08\x66\xa6\x1c\xf7\xb8\x85\x44\x20\x51\x28\x81\x00\xc3\xad\x56\x2f\x9a\x8a\x30\xfa\x1d\x7d\xe5\xe0\xfa\xf1\x0e\x92\x92\x22\x53\x51\x90\x35\x2c\xd1\x76\x53\x25\x08\x93\x06\x4a\x97\x71\x74\x63\x54\x56\xfd\xf7\x10\x32\x2e\x2a\xa2\x24\xd8\x84\xa3\x27\xcc\xa9\x54\x62\x37\x03\xab\xb9\x44\xb1\xa1\x09\x42\x1b\x00\x08\x54\x8d\x60\xf0\xc1\x4a\x5a\xef\x7c\x01\xea\xc8\xdf\xa2\x7f\xe8\x02\xdd\x55\xf3\xc0\x1a\x81\x6b\xd8\x65\x53\x55\x44\xec\xc0\x74\xe4\xf8\x4d\x8b\x6f\x51\x26\x82\xd6\x8a\x72\x66\xba\xb2\x6d\x61\x5d\xf2\xe4\xd9\x37\xf5\x58\xc1\x77\xb5\x7e\x28\x25\x1e\xfa\x30\x82\xd7\x1c\x68\xbb\xae\xcb\xb8\x38\x8b\xef\x9e\x3c\xf3\x38\x50\xbb\x1a\x1d\x46\x1a\xbb\x26\x51\x06\xa3\x57\x11\x0f\xe0\x1c\xe4\x81\xa5\xdf\x18\x77\x2a\x0d\x55\x28\x53\x28\x32\x92\xa0\x36\xee\x97\xad\x50\x15\x3c\x95\xc3\x50\xbc\x99\xd7\x6f\x83\x77\x6d\x0b\x82\xb0\x1c\x21\x7a\xa8\x35\xd1\x28\x67\xa6\xbf\xb4\xa0\x26\x32\x21\xe5\x30\xd3\x69\x4d\x04\xa9\x24\xcc\x4f\x4a\x1f\x8d\xd0\x95\xe9\xba\x51\x05\x17\xf4\x3b\x6a\x50\x42\x20\x8d\x2a\xee\x58\xc6\x0f\x52\xbf\x76\x9f\xbf\x08\xaa\x50\xb4\x2d\xb2\xd4\x17\xfa\x13\x91\x4b\x25\x90\x54\x94\xe5\x4f\x28\x6b\xce\x4c\x15\x42\xd8\x1a\x65\xa0\x3c\xea\xcd\x1c\xf6\xb3\x7d\x0b\x25\x09\x4a\x39\xb0\x9a\xee\x13\x3d\x10\xea\x74\x4f\xe7\x13\xc2\xa8\x79\xcc\x83\x19\x1f\x67\x57\x99\xed\xdb\xe0\xdd\x60\x9c\xbe\x5b\xe2\xbe\xc8\xaf\x13\x6f\x16\xd8\xb6\x3e\x59\x98\x78\x6e\x87\xc2\x71\xb8\x27\xf9\x53\x97\x8d\x30\x6a\xbf\x53\x21\xd5\x17\x2e\x52\x98\xee\x1b\xd8\xa9\xce\xce\xb3\xcb\xac\xf5\x83\xf8\xf5\x26\x6e\x99\xf9\x35\x25\x30\xb7\xa0\xcd\x4e\x63\xf1\xb3\x51\xdf\xda\xa8\x66\x32\xe9\x9d\xfd\xe1\xf6\x61\x01\x7f\xb8\xad\xc9\x0c\x16\x87\xe1\x1a\x33\x2e\x10\x24\xb2\x94\xb2\x3c\x00\xed\xd2\x89\xae\xae\x80\xd1\xd2\xb8\x00\xff\x4d\xef\x2e\x2f\xc0\x3e\x9d\x05\x00\x6e\x67\xbb\x28\x91\xe5\xaa\x80\xc5\x15\x94\xc8\x4e\x66\xec\xb6\xc0\x93\x59\x08\x94\x4d\xa9\xda\x56\xf7\x4f\xd7\xfd\xe9\x73\x0a\x01\x85\xd0\x4e\x49\xe4\xc9\x16\x2d\x9b\x75\x45\xd5\xf4\xc3\xb8\xae\x9e\x5c\x36\x87\xbb\xdb\x85\x69\x28\x41\x99\xca\x60\xf2\xfe\xeb\x64\x0f\xb2\x51\xf8\x6c\xe6\xea\xb1\x92\xfd\xee\xd5\x1e\x89\x2a\x1e\x89\x52\x28\xd8\xb1\xae\x16\xee\x35\x05\x4f\x9b\x04\xe5\x67\x4c\x29\x59\xed\x6a\x94\x63\x83\xff\x6f\xb4\xc5\x91\x92\xb7\xbf\xe1\x4c\x36\xd5\x2b\xf6\xc7\x4a\xde\x7e\x99\x14\x58\x9d\x34\x72\x92\x41\x4e\xba\x7c\x0b\x57\x67\xfb\xed\x09\x49\x8a\x62\x01\x1f\x4e\x16\xdc\x4a\x5b\xbf\xed\x93\xc8\x3d\xbe\x8d\x38\x0b\xf7\xeb\xeb\xda\x85\xa7\x38\x6b\x02\xe9\xf9\xb9\xf0\x04\x0e\xad\x99\x93\xdf\x70\xa6\xf0\x9b\xea\xa3\x8f\xdc\xbb\xc3\xd0\xb4\x82\x97\x7d\x5a\xad\x1e\xed\x27\x2d\xee\x66\xb6\xe5\x75\x4b\xfd\x6f\xd8\xef\xee\xc8\x73\xb6\x3b\x0d\x24\xe9\xb2\x11\x82\x37\x2c\x85\x09\xa3\xe5\xc4\xfd\xfd\xc5\x77\xfe\x88\xbc\x28\x84\xe7\xc6\xe5\x19\xaf\x66\x69\x27\xc6\xaf\xde\xcf\xaf\x56\x24\xad\x7e\x08\xfc\x59\xf7\xbf\x25\x48\x34\x3d\x18\x1b\x07\x5e\xfb\x72\xb9\x44\xf9\xf3\x38\xc1\xde\x27\xa3\xa5\x8b\x2e\x8e\xa1\x61\xf8\xad\xc6\x44\x9f\xfd\x9d\x5c\x2f\x66\xdc\x19\xdb\x7d\x0a\xee\x50\x3b\x02\x26\x9e\x6b\x11\x81\xd4\xca\xbc\xa9\x3e\xd2\xe8\xab\x01\x4d\x31\x0d\xf5\x7d\xa1\xb4\x37\x07\xc2\xd2\x3e\x1a\xc2\xc0\x8c\x36\x98\xc7\x26\xe3\x7d\x20\x2e\xab\x17\xf2\x3e\x08\x65\x98\xb7\xf3\xce\x68\x19\xfa\xc9\x7f\x8f\xdb\xeb\xc7\xbb\x8f\x7a\xb5\xe9\xe4\x85\x84\x17\x90\xe8\x6e\x62\x0a\xc8\x86\xd0\x92\xac\x4b\x04\x22\x4f\x24\xe7\x42\x9f\x84\xc7\x51\x9f\xf8\x14\xe9\xdb\xde\x74\x36\x1b\xe0\xe9\x36\x4a\x5b\x02\x49\x32\xcc\x1b\x22\xd2\x05\x30\x4d\xab\xb2\xdc\x85\x40\xd6\xd2\x04\x72\xb4\xba\x5e\xe0\x99\xf1\x2d\x3b\x0a\x5f\x1e\x41\x4b\xd6\x7c\x83\x0b\x90\xdc\xa2\xaf\x0b\x00\x09\x4f\x31\x47\x06\x54\xca\x46\x97\xb8\x92\xb9\x46\x5a\x1f\x52\x97\x76\x6e\xbc\x88\x11\xb8\xc3\x73\x8f\xf9\xc2\x5e\x4a\x38\x53\x82\x24\x0a\x18\x57\x80\x2c\xe3\x22\xb1\x97\x49\x89\x62\x83\x22\xea\x4f\xb3\xde\xad\xe2\x90\xa3\xf2\x91\x86\xb0\x6e\x14\xe4\x5c\x2d\xe0\xfd\x6a\x12\xba\xba\x6b\xc4\x6a\xc2\x68\x32\xad\x64\x3e\x82\x8f\xa5\x43\x06\xf9\x63\x47\x3c\x07\x89\x1b\x14\xa4\x84\x9a\x4b\x49\x75\x01\x8f\x51\x72\x0d\x27\xb7\x54\x25\x05\x6c\x48\xd9\xe0\xb0\xd7\xf4\x49\x7b\xe6\x98\x63\xfd\xdb\x6d\xfc\x82\x86\x70\xb1\xd1\x9a\x67\xb6\xb7\x84\x48\x3c\x38\xa8\x5c\x6c\x3c\x4e\x07\xa3\x66\x34\x51\x4c\x0c\xfd\x4c\xb9\xa0\xa3\xa1\x62\xd9\x7a\x94\x79\xf7\x63\xd9\xf9\xea\xa4\xf8\x67\xe9\xfb\xe6\x91\xfb\x93\xe2\xff\x1e\xc5\x2f\xfe\x53\x1c\xef\x5f\xc7\xd8\xee\xc7\x7d\x30\xd2\xeb\x82\xc1\x8b\xbe\x71\x0f\x6f\x6e\x90\x14\x9a\xd1\xf6\xd6\xbd\xbf\xc5\x71\xfb\x1f\x2b\xfb\x0f\x96\xe3\xfb\xc9\xdf\xbc\xfb\x99\x09\x32\x38\xb7\xc2\xd5\x7e\xa9\xa0\x0b\xfe\x0a\x00\x00\xff\xff\xf0\x51\xfe\x20\x05\x14\x00\x00") func templatesClientClientGotmplBytes() ([]byte, error) { return bindataRead( @@ -135,12 +122,12 @@ func templatesClientClientGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/client/client.gotmpl", size: 4702, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x73, 0xb2, 0x83, 0x60, 0xa9, 0x9b, 0xc5, 0xf6, 0x7e, 0x25, 0xa0, 0x91, 0xf4, 0x4a, 0x31, 0x2e, 0x4b, 0x8, 0xf9, 0xda, 0x18, 0xa9, 0xb6, 0xb7, 0x11, 0x3b, 0x28, 0xf, 0xa7, 0xa1, 0x55, 0x49}} + info := bindataFileInfo{name: "templates/client/client.gotmpl", size: 5125, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9, 0xac, 0x8a, 0xfb, 0x5d, 0x8, 0x2b, 0x9d, 0x80, 0xd2, 0x63, 0x29, 0xb4, 0x26, 0x94, 0xeb, 0x1a, 0x5f, 0x8, 0x86, 0x2, 0x61, 0xde, 0x72, 0xdf, 0x36, 0xfa, 0xb4, 0xdd, 0xc0, 0xef, 0xd9}} return a, nil } -var _templatesClientFacadeGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x56\x4f\x6f\xe3\xb6\x13\xbd\xf3\x53\x0c\xf2\xdb\x5f\x21\x07\x8e\x74\x4f\xe1\x4b\x93\x45\x77\x0f\x4d\x82\xae\x81\x1e\x8a\x1e\x68\x6a\x24\x11\x91\x48\x95\xa4\x6c\x78\x0d\x7d\xf7\x82\x14\xa9\x7f\x91\x1d\xa7\xdd\x9c\x62\x72\x38\x7c\x6f\xde\xe8\x0d\x93\x04\x1e\x64\x8a\x90\xa3\x40\x45\x0d\xa6\xb0\x3b\x42\x2e\xef\xf4\x81\xe6\x39\xaa\x9f\xe1\xf1\x19\x9e\x9e\xb7\xf0\xf9\xf1\xeb\x36\x26\x84\x9c\x4e\xc0\x33\x88\x1f\x64\x7d\x54\x3c\x2f\x0c\xdc\xb5\x6d\x92\xc0\xe9\x04\x4c\x56\x15\x0a\x33\xdb\x3b\x9d\x00\x45\x0a\x6d\x4b\x08\xa9\x29\x7b\xa5\x39\xda\xe0\xf8\xc5\xff\x6f\x37\x92\x04\xb6\x05\xd7\x90\xf1\x12\xe1\x40\xf5\x14\x8c\x29\x10\x3c\x1a\x30\x52\x96\xb1\x8d\xff\x9c\x72\xc3\x45\x0e\xa6\x3f\x57\xb9\x1b\x6b\x25\xf7\x08\x59\x63\x5c\xaa\x02\x05\x1c\x65\x03\x0a\xef\x54\x23\x26\x99\xc2\x15\x0e\x36\x15\x29\x21\x84\x57\xb5\x54\x06\x22\x02\x70\x23\xd0\x24\x85\x31\xf5\x8d\xfd\x91\x73\x53\x34\xbb\x98\xc9\x2a\xc9\xe5\x9d\xac\x51\xd0\x9a\x27\xaa\x11\x86\x57\x68\x23\x6c\xa4\x51\x54\x68\x97\xe0\x72\x7c\xc2\x4a\x8e\xc2\x5c\x48\x6c\x21\x5e\xda\xae\x91\x5d\xd8\x46\xa5\xa4\xd2\xd7\xe0\x26\x00\xda\xa8\xac\x3a\x8b\xb8\xdb\x75\x81\xa7\x13\x28\x2a\x72\x84\xf8\x11\x33\xda\x94\xe6\xab\x2b\x96\x06\xa7\x70\xad\xb8\x30\x19\xdc\xfc\xff\xef\x1b\x88\xdb\xb6\x8b\xf7\xb2\x8f\xce\x7e\x7a\xc5\xe3\x1a\x3e\xed\x69\xd9\x20\xdc\x6f\x20\x9e\x24\xb1\xbb\xd0\xb6\x30\xcb\xe7\xc3\x67\x59\x57\xae\x6b\x3c\x16\xbb\x5e\x34\x15\x15\xfc\x3b\x42\xfc\x44\x2b\x1b\x0e\x5f\xb6\xdb\x17\xe8\x8a\x1d\x93\x3d\x55\x7d\xf4\x06\x9e\xf0\x60\x77\x1f\xdc\x66\x24\x78\xb9\x22\x84\x49\xa1\x3b\xf1\x01\x86\xd4\x5f\xa4\x36\xc0\xb5\x6b\x9d\xd4\x9f\xb7\x6b\x21\x2c\x93\x8d\x48\x81\x0b\xf8\x0d\x0d\x85\x88\x8b\x4c\xae\x40\x23\x33\x5c\x0a\x90\x19\x58\xb1\x5c\x7f\xba\x03\xe3\xa4\xda\x28\xdb\xc0\x9b\x09\xdf\xff\xed\x6f\x20\x76\xdb\x8e\xef\x18\xc9\x2f\x54\xe3\x0b\x35\xc5\x1c\x4d\x58\xff\x4f\x88\xfa\xe4\xe7\x51\xf5\x21\xf3\xea\x7f\x63\x05\x56\xa8\x81\x2a\x9c\x00\xd3\x7e\xfd\x7a\x40\x23\x91\x42\xd2\x05\x20\x61\xcb\x3b\xc7\x44\x4b\x60\x0a\xa9\xb1\x60\x40\xe0\xe1\x8a\xbe\xc8\x1a\xc1\x66\xed\x90\x49\x55\x51\xa3\xfd\xb7\x11\xff\x8e\x39\xd7\x46\x1d\x57\x70\x6b\xa1\x50\xcd\x68\x39\xc9\x77\x22\x00\x0a\x4d\xa3\xc4\x34\xd1\x1f\xdc\x14\x0f\x52\x64\x3c\x0f\x29\xd7\xe0\x5a\x6d\x01\xf7\x10\xfb\x41\x06\x6b\x9b\xaa\xd1\x56\x33\x0a\xac\xd1\x46\x56\xfc\x3b\xdd\x95\x08\x83\x1f\x31\x97\x78\x89\xeb\x5b\x88\x73\xd6\x6b\x60\x59\x0e\xb7\xdb\x90\xac\x8b\xbe\x58\x8b\x24\x01\x14\xba\x51\x08\xa2\x29\x4b\x87\xa5\xa6\x8a\x56\x68\x50\x69\x28\xe8\xbe\x6f\x11\x02\x76\x96\xd8\x0b\x36\x1b\x5b\x1a\x77\x1c\xba\x85\xd0\x08\xb3\x9b\xa3\x15\x01\x68\x49\x77\x4d\x57\xaa\x11\x53\x2a\x52\x5f\x17\x02\xa3\xe5\xfb\xcd\xd4\xa1\xe3\x27\x3c\x44\x2c\xcb\xdd\x97\xe6\x18\xf6\xdd\xdd\xfd\xf2\x2d\xb6\x9a\x28\x1b\xf5\xe7\xd7\xe0\xab\x35\xd2\xf2\x1a\xdd\x3c\xb4\xa0\xc3\x90\x10\xbc\x27\xc7\x9d\x2c\xdb\x37\x17\x7d\xa8\x19\x3f\x2a\x40\xb8\x63\x22\x42\xbf\x18\xae\x7e\xec\x8f\xb8\xf2\xb3\x92\xdb\xba\x0a\x3c\x44\x8b\x48\x56\x5d\x4c\xdc\x73\x81\xcd\xa0\xc8\x64\xa0\x3c\xd7\x76\x10\x73\x29\x7e\x55\xb2\xa9\x75\xe7\x7c\xf6\xe8\x32\x43\xe7\x08\xe1\x57\x7c\x4e\x97\xe9\x04\xf2\x22\xb2\x92\x7b\xc1\x96\x9b\x6b\xa4\xe1\x7c\xe7\xc0\x4d\x61\xdd\xcd\x1e\xee\x0d\x0e\x8d\x7d\x83\x68\x30\xf4\x15\x05\x64\x4a\x56\xce\x00\x2b\xeb\x73\x23\x83\x73\xcf\x8e\x60\x72\xfe\x33\x3c\xd7\xdd\x6f\x3e\x35\x2f\x87\x67\xf0\xd3\xf2\xae\xfd\xb3\xbd\x7c\x3f\x9e\x30\xeb\x7e\x2b\x34\xf7\xfd\xdc\xee\x87\x10\xdf\xf1\xf7\x33\xff\xed\x02\x5a\x5f\xb5\x37\xe5\x92\xc2\x50\x2e\xba\x79\x34\x6a\x66\x2c\xdd\xdb\xcd\x3a\xbd\xf3\xa7\x7e\x02\x5c\x51\x1d\x73\xac\xf1\xcd\x45\xda\xa8\x86\x19\x4f\x76\x34\x3d\xc9\x98\xdd\x78\x2d\xcc\x88\x3f\xff\xf2\x8b\x1d\x01\xeb\x77\xee\xb8\xdc\xa3\x52\x3c\xc5\xe9\x28\x2d\x5c\xd5\x92\xc4\xbd\x22\x79\x3a\x3c\x3f\xaf\x51\x34\x5a\x36\xca\x70\x65\x54\x0c\xb0\xcf\xaa\x1c\x3c\x09\x36\x0e\xcb\x58\x79\x96\x8d\x49\xf4\x9c\x97\x89\xec\x7a\x7d\x7f\x3c\x99\x70\x75\xb4\x9b\xd6\xfd\x22\xa9\x1e\xef\xa6\xc7\x76\x9e\x5c\x10\x6f\x99\x9b\x0e\x9d\xf9\xe3\xa9\xf9\x8b\x23\x3d\xeb\x9e\x8b\xd4\x86\x97\x8a\x3f\xb6\x4c\x6c\xd9\xcc\xb8\xf5\x9a\x6e\x2c\x58\xef\x5a\x1c\x1b\xdd\x27\xb1\x7c\x7e\xf4\x61\xbc\x63\xa8\xcb\xe7\x6f\xc7\x5e\xfa\x10\x26\xe7\xd8\x3a\xb7\xef\xcd\x28\xcb\xcf\x12\xfc\x86\xc3\x1a\xb0\xc2\x42\x99\x1b\x83\xec\x1c\xc0\xf3\xb5\xc3\x9a\x96\x25\x70\x3b\xde\x9a\x9d\x42\x2d\x1b\xc5\x50\x07\x99\x2c\xb8\x19\xe4\xb6\x5d\x4d\xee\x79\x7f\x82\xae\x5c\x6d\xd8\xbf\x1e\x43\xcb\x43\x28\x5e\x06\x31\x1d\x3b\x2d\xf9\x27\x00\x00\xff\xff\x80\x39\x20\xde\x5c\x0f\x00\x00") +var _templatesClientFacadeGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x56\x4d\x6f\xe3\x36\x10\xbd\xf3\x57\x0c\x52\xb4\x90\x17\x89\x74\x4f\xe1\x43\x9b\x2c\xba\x7b\x68\x12\x34\x06\x7a\x28\x7a\xa0\xe9\x91\x44\xac\x44\x0a\x24\x65\x23\x6b\xe8\xbf\x17\x43\x91\xb2\xa4\xc8\xde\xa4\xbb\x39\xc5\xe4\x7c\xbd\x79\xc3\x37\xca\x32\xb8\xd3\x3b\x84\x02\x15\x1a\xee\x70\x07\xdb\x17\x28\xf4\x8d\x3d\xf0\xa2\x40\xf3\x2b\xdc\x3f\xc2\xc3\xe3\x06\x3e\xde\x7f\xde\xa4\x8c\xb1\xe3\x11\x64\x0e\xe9\x9d\x6e\x5e\x8c\x2c\x4a\x07\x37\x5d\x97\x65\x70\x3c\x82\xd0\x75\x8d\xca\xcd\xee\x8e\x47\x40\xb5\x83\xae\x63\x8c\x35\x5c\x7c\xe1\x05\x92\x71\xfa\x14\xfe\xa7\x8b\x2c\x83\x4d\x29\x2d\xe4\xb2\x42\x38\x70\x3b\x2d\xc6\x95\x08\xa1\x1a\x70\x5a\x57\x29\xd9\x7f\xdc\x49\x27\x55\x01\x6e\xf0\xab\x7d\xc6\xc6\xe8\x3d\x42\xde\x3a\x1f\xaa\x44\x05\x2f\xba\x05\x83\x37\xa6\x55\x93\x48\x31\x85\x2f\x9b\xab\x1d\x63\x4c\xd6\x8d\x36\x0e\x12\x06\x70\xa5\xd0\x65\xa5\x73\xcd\x15\xa3\x5f\x85\x74\x65\xbb\x4d\x85\xae\xb3\x42\xdf\xe8\x06\x15\x6f\x64\x86\xc6\x68\x63\xaf\xce\x1b\x98\x56\x39\x59\x23\x59\x50\x2c\x67\xb8\xb2\x3e\xc5\x65\xfb\x4c\x54\x12\x95\xbb\x10\xd8\x36\x28\x2e\x5d\x3b\x93\xd7\x17\xfd\x0f\xbc\xf0\xc8\x88\x4d\x8f\xda\x42\x7a\x8f\x39\x6f\x2b\xf7\x39\xfc\xee\xba\xd9\xfd\xe8\x62\xe5\x39\x0b\x0e\x64\x54\xb6\x35\x57\xf2\x2b\x42\xfa\xc0\x6b\x22\x15\x3e\x6d\x36\x4f\xd0\x03\x49\xd9\x9e\x9b\xc1\x7a\x0d\x0f\x78\xa0\xdb\x3b\x7f\x99\x28\x59\xad\x18\x13\x5a\xd9\xbe\xf5\x00\xa7\xd0\x9f\xb4\x75\x20\xad\x27\x6e\x17\xfc\xe9\x2c\x9a\xe5\xba\x55\x3b\x90\x0a\xfe\x44\xc7\x21\x91\x2a\xd7\x2b\xb0\x28\x9c\xd4\x0a\x74\x0e\xd4\x27\x3f\x1d\xde\x61\x1c\xd4\x3a\x43\xe3\xb3\xa6\xe2\x1b\x23\x95\xcb\xe1\xea\xe7\x9f\xf6\x57\x90\xfa\x6b\x0f\x7e\x5c\xc9\xef\xdc\xe2\x13\x77\xe5\xbc\x9a\x78\xfe\x5d\x15\x0d\xc1\xcf\x57\x35\x98\xcc\xbb\xff\x2c\x4a\xac\xd1\x02\x37\x38\x29\xcc\x86\xf3\xb7\x17\x34\x22\x29\x06\x5d\x28\x24\x5e\x85\x77\x3b\xe1\x12\x84\x41\xee\xa8\x18\x50\x78\x78\xc3\x5c\xe4\xad\x12\xb3\x71\xc8\xb5\xa9\xb9\xb3\xd0\xcf\x70\xfa\x17\x16\xd2\x3a\xf3\xb2\x82\x0f\x54\x0a\xb7\x82\x57\x93\x78\x47\x06\x60\xd0\xb5\x46\x4d\x03\xfd\x2d\x5d\x79\xa7\x55\x2e\x8b\x18\xf2\x1a\xfc\xa8\x2d\xd4\x7d\xb2\x7d\x27\x82\x6b\x0a\xd5\x5a\xe2\x8c\x83\x68\xad\xd3\xb5\xfc\xca\xb7\x15\xc2\xe9\xad\x0b\x1f\x78\x09\xeb\xeb\x12\xe7\xa8\xaf\x41\xe4\x05\x7c\xd8\xc4\x60\xbd\xf5\xc5\x5e\x64\x19\xa0\xb2\xad\x41\x50\x6d\x55\xf9\x5a\x1a\x6e\x78\x8d\x0e\x8d\x85\x92\xef\x87\x11\x61\x40\x4a\x4e\x09\xd6\x6b\x6a\x8d\x77\x87\xfe\x20\x0e\xc2\x2c\x73\xb2\x62\x00\x1d\xeb\xd3\xf4\xad\x1a\x21\xe5\x6a\x17\xfa\xc2\x60\x74\x7c\xbb\x9e\xaa\x5f\xfa\x80\x87\x44\xe4\x85\x7f\x69\x1e\xe1\x30\xdd\xfd\xaf\x30\x62\xab\x09\xb3\xc9\xe0\x7f\x0d\xa1\x5b\x23\x2e\xdf\xc2\x5b\x28\x2d\xf2\x70\x0a\x08\x41\x77\xd3\x9e\x96\xcd\xab\x44\xef\x1a\xc6\xf7\x12\x10\x73\x4c\x48\x18\x0e\x63\xea\xfb\xc1\xc5\xb7\x5f\x54\x92\xfa\xaa\xf0\x90\x2c\x56\xb2\xea\x6d\xd2\x01\x0b\xac\x4f\x8c\x78\x5d\xbf\x01\xc3\x55\x81\x90\x3e\x36\xb4\x07\xa5\x56\x7f\x18\xdd\x36\x41\xf7\xc9\x77\x19\xe2\x7a\xbc\xbd\x7f\xab\x24\x27\x8f\xf4\x1c\x41\x7d\xa6\xf0\x01\x30\xd0\x29\x2a\x19\xa8\x5b\x1e\xb3\x11\x9b\xf3\x9b\x83\x74\x25\xe9\x1c\x39\x0f\x52\x87\x8e\xbe\x05\x2c\x38\xfe\x05\x15\xe4\x46\xd7\x5e\x0a\x6b\x52\xbc\x91\xd4\xf9\xf5\x1f\xe5\x2e\x3c\xc8\x73\x73\xfe\xea\xd1\x05\x62\x02\x82\x5f\x96\x6f\xe9\x8f\xa6\xfa\x76\xbc\x6b\xae\x87\xab\x38\xe6\xb7\x73\xe1\x3f\x99\x84\xd9\xbf\x9d\x29\x71\x6f\xd0\x85\xae\xbd\x6a\x97\x56\x8e\x4b\xd5\x6f\xa6\xd1\x58\x63\xe5\xbf\xa1\x48\xf3\xbd\x52\x0d\xbb\xe0\x0d\xdd\x71\x2f\x0d\xbe\x4a\x64\x9d\x69\x85\x0b\x60\x47\x7b\x94\x8d\xd1\x8d\xcf\xe2\xb6\xf8\xe7\xdf\x70\xd8\x03\x20\xe5\xf3\xee\x7a\x8f\xc6\xc8\x1d\x4e\x97\x6a\xe9\xbb\x96\x65\xfe\x6b\x4e\xee\x4e\x9f\x81\x6f\x61\x34\x59\x96\xcc\x98\x32\x29\x4f\x65\x9f\x65\x39\xaa\x13\xac\x7d\x2d\x63\xe6\x45\x3e\x06\x31\x60\x5e\x06\xb2\x1d\xf8\xfd\xf1\x60\x62\xea\x64\x3b\xed\xfb\x45\x50\x43\xbd\xeb\xa1\xb6\xf3\xe0\x22\x79\xcb\xd8\x6c\x9c\xcc\x1f\x0f\x2d\x24\x4e\xec\x6c\x7a\x2e\x42\x3b\x7d\xb3\x04\xb7\x65\x60\xcb\xaa\x26\x49\x6b\xfa\x05\x41\xe2\xb5\xb8\x40\xfa\x27\xb1\xec\x3f\x7a\x18\xc7\xe3\x45\x65\x85\x33\x11\x96\x54\xb5\xdf\x47\xcf\x68\xf6\x52\x60\x1f\x7a\x90\xd2\xcd\xb7\xb6\x17\xe1\x25\xc0\xcf\x78\x3a\x03\x51\x52\x69\x73\xa1\xd0\xbd\x22\x04\xfc\xb4\xc6\x79\x55\x81\xa4\xc5\xd7\x6e\x0d\x5a\xdd\x1a\x81\x36\xd2\x46\xcb\x6f\x06\xa0\xeb\x56\x93\x3c\xdf\xde\xad\x2b\xdf\x2b\xf1\xff\x17\xd4\xf2\x7a\x4a\x97\xab\x98\x2d\xa2\x8e\xfd\x17\x00\x00\xff\xff\xcb\x7a\x92\x89\xf6\x0e\x00\x00") func templatesClientFacadeGotmplBytes() ([]byte, error) { return bindataRead( @@ -155,12 +142,12 @@ func templatesClientFacadeGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/client/facade.gotmpl", size: 3932, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb9, 0x2e, 0xbf, 0x0, 0xaf, 0xc1, 0xff, 0x75, 0x86, 0x0, 0x51, 0xe9, 0xb9, 0x2d, 0x58, 0x1d, 0x9e, 0xca, 0x82, 0x15, 0xf4, 0xa2, 0x7b, 0x6a, 0x41, 0x12, 0x24, 0x3a, 0x8, 0x5e, 0x5e, 0xa9}} + info := bindataFileInfo{name: "templates/client/facade.gotmpl", size: 3830, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf7, 0xd, 0xcc, 0x4f, 0xcb, 0x4c, 0xff, 0x4a, 0x57, 0x54, 0x9b, 0x29, 0xd, 0x15, 0xd4, 0xe7, 0x30, 0x76, 0x28, 0x32, 0x9b, 0x67, 0xf5, 0x35, 0x68, 0xcd, 0x48, 0x59, 0xa0, 0x7a, 0xef, 0xd3}} return a, nil } -var _templatesClientParameterGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\x5f\x73\xdb\xb8\x11\x7f\xe7\xa7\xd8\xaa\xee\x55\xf4\x38\xd4\x3d\xfb\x46\x9d\xc9\xd9\xbe\xc6\x9d\x69\xce\x4d\x3c\xd7\x87\x4c\xa6\x03\x93\x2b\x09\x17\x12\xa0\x01\x50\x8a\xaa\xe1\x77\xef\xe0\x0f\x49\x90\x22\x25\x2a\x89\xe3\xcb\x34\x4f\x92\x40\x60\xb1\xfb\xdb\xdf\xfe\x01\xa8\xd9\x0c\xae\x78\x82\xb0\x44\x86\x82\x28\x4c\xe0\x61\x0b\x4b\xfe\x42\x6e\xc8\x72\x89\xe2\x27\xb8\xfe\x15\x5e\xff\x7a\x0f\x37\xd7\xb7\xf7\x51\x10\x04\xbb\x1d\xd0\x05\x44\x57\x3c\xdf\x0a\xba\x5c\x29\x78\x51\x96\xb3\x19\xec\x76\x10\xf3\x2c\x43\xa6\x3a\xcf\x76\x3b\x40\x96\x40\x59\x06\x41\x90\x93\xf8\x03\x59\xa2\x9e\x1c\xdd\xb9\xef\xfa\xc1\x6c\x06\xf7\x2b\x2a\x61\x41\x53\x84\x0d\x91\x6d\x65\xd4\x0a\xc1\x69\x03\x8a\xf3\x34\xd2\xf3\x6f\x12\xaa\x28\x5b\x82\xaa\xd7\x65\x66\xc7\x5c\xf0\x35\xc2\xa2\x50\x46\xd4\x0a\x19\x6c\x79\x01\x02\x5f\x88\x82\xb5\x24\x55\x5b\x18\xb5\x09\x4b\x82\x80\x66\x39\x17\x0a\xa6\x01\xc0\x24\xe6\x4c\xe1\x47\x35\xd1\xdf\x19\xaa\xd9\x4a\xa9\x7c\x12\xe8\x5f\x4b\xaa\x56\xc5\x43\x14\xf3\x6c\xb6\xe4\x2f\x78\x8e\x8c\xe4\x74\x26\x0a\xa6\x68\x86\x93\xe1\x19\x7a\xdf\x03\x8f\x51\x08\x2e\xe4\x81\x09\x6b\x92\xd2\x84\x28\xb3\x45\x2c\x8e\xe8\x31\x8b\x53\x8a\x4c\x19\x8d\xa5\x12\x8b\x4c\x0d\xaa\x65\x9e\x9a\x89\xbb\x1d\x08\xc2\x96\x08\xd1\x35\x2e\x48\x91\xaa\x5b\x03\x88\x04\xe3\xc4\x5c\x50\xa6\x16\x30\xf9\xcb\xe3\x04\xa2\xb2\xb4\xf3\x9d\x67\xbd\xb5\x67\x1f\x70\x7b\x01\x67\x6b\x92\x16\x08\x97\x73\x88\x5a\x42\xf4\x53\x28\x4b\xe8\xc8\x73\xd3\x3b\x52\x43\x43\x8c\xd7\xb8\xd1\xb3\x89\x8c\x49\x4a\xff\x8b\x10\xbd\x26\x99\x9e\x7a\x47\x04\xc9\x24\xc4\x02\x89\x42\x09\x04\x18\x6e\xe0\xd0\x4c\xfe\xf0\x3b\xc6\x4a\x8b\xdc\x50\xb5\x32\x5c\x48\xac\x9d\x60\xb6\x97\x40\x19\x55\xd4\xac\x4d\xa2\x60\x51\xb0\xf8\xc8\xe6\xd3\x10\xce\x0f\xed\xb8\xb3\xe6\xe8\x70\x71\x23\x65\xb9\x26\xc2\x30\xac\x01\xbb\x7e\xe4\xa6\xbe\x22\xd2\xe1\x5f\x8f\x31\xae\x20\xba\x95\xbf\xd0\x14\xcd\x6c\xfb\x60\x4d\x04\xd3\xfb\x45\xb7\xd7\x65\x59\x2d\x99\x57\x3b\xde\xca\x3b\x41\x33\xaa\xe8\x1a\xf5\xec\xe8\xef\xfc\x7e\x9b\x63\x59\x4e\x2d\xc0\x6d\x9f\xfe\x79\x3d\xa9\xbd\xde\x68\xe2\x89\x80\xb2\x0c\x3b\xfe\xb6\xdf\xbd\x2f\x46\x6a\x00\xd0\x9a\x28\x50\x15\x82\xc1\x0f\xfb\x38\x55\x30\xed\x4e\x42\x63\x4f\xc8\xa5\x33\x98\xb0\x04\xa6\x0e\xa8\x97\x42\x90\x6d\x58\xff\xfc\x27\xc9\xab\x1f\x5a\x1c\x95\xb1\x36\x8b\x11\xc5\x45\x08\x53\x2e\xf4\x9c\xd7\x45\x9a\x92\x87\x14\x01\x42\x28\xcb\x1f\x7c\xfb\x3c\x9c\xa1\x06\xfa\xa2\x17\x84\x00\xc0\x0c\xc7\x24\x43\xab\xe4\x3d\xcd\x90\x17\xca\x11\xe3\x12\x62\x51\xe1\xec\x9e\x68\x41\x65\x50\x8e\xe0\xfa\xbf\xa9\x5a\xb9\x45\x4f\x45\xfb\x0b\x03\xa3\x9e\x43\x1e\x68\x4a\xd5\x16\x14\x07\x89\x0a\x08\x28\xb7\x33\x67\x40\x40\xe0\x63\x81\x52\x8d\x09\x12\x4f\xeb\x69\x25\x43\x7f\x46\xd7\x85\x20\x8a\x72\xf6\x3d\x88\x9e\x33\x88\xb4\xd9\xdf\x58\x08\xa9\x4f\x09\x9c\x2b\x5b\xd0\x9f\x21\x70\x5c\x2b\x01\x0b\x2e\x4e\x8f\x1c\xa7\xf6\x34\x56\x1f\x2b\x41\x91\x1b\x7b\xde\xb8\x69\xdc\x63\x69\xf8\x7f\x18\x3a\x5f\xab\xfe\xb4\xa1\x1e\x15\x3f\x8e\x22\x97\x10\xab\x8f\xa7\xc5\xc9\xab\xfb\xfb\xbb\x2b\xd3\x3c\x3e\x47\xa8\x14\x52\xf1\x0c\x3c\x1d\x3e\x29\x68\x9a\xf5\x53\xdb\x07\xc3\xb9\xee\xdf\x23\x3b\xf6\x3d\x6e\xbe\xc7\x4d\x0f\x0e\x0d\x69\x2e\xc1\xb2\xa6\x09\x9c\x83\x84\xd1\x69\x99\x50\x26\x81\xa4\xa9\xa1\x75\xae\xc7\x51\xa1\x90\x96\xd9\x9a\xed\xdc\x3c\x79\x79\x77\xab\x77\xcb\x39\x65\x2a\xd0\xd4\xd6\x83\xbb\x1d\xac\x8a\x8c\x30\x5f\x34\xf0\x1c\x6d\x77\x04\x6a\x9b\xd3\x98\xa4\xa9\x39\x07\x4b\x04\x22\x10\x36\x82\x2a\x85\x4c\x8b\x25\x60\xa8\xfd\xc6\x45\xc8\xf9\x2c\x50\xdb\x1c\x0f\x46\xab\x54\xa2\x88\x15\xec\x82\x7e\x07\x0e\x58\xbb\xdb\x69\xb7\x5e\xa3\x76\x42\x6e\x34\xab\x08\xf5\x90\xf2\xf8\x43\x7d\xf8\xef\xcc\xf0\xb1\x3e\x9f\xd9\x5f\xad\xf6\xc3\x1d\x07\x3f\x87\x09\x6e\xd2\x2d\x53\x28\x16\x24\xc6\x66\xe8\xad\x12\x48\xb2\x01\xb2\x9c\xfb\x24\x18\x0c\x58\x17\x80\x8e\x2a\xa9\xd4\xdf\xdc\x29\xdb\x40\x93\xbc\x41\x92\x5c\xa5\x5c\xa2\x68\x42\xc9\xbb\xf4\x38\xd8\xcc\xb4\x3b\xe1\xa0\x4e\xdc\xdd\x5a\x1f\x80\x9f\x14\xfd\x6c\xe6\x12\xbb\x4e\x7b\x6d\x64\x3b\x1b\x91\x24\x91\x86\x6e\x75\x0f\xce\x87\xd9\x67\x18\x2c\x6d\xba\xd5\x79\x27\x7a\x83\x31\xd2\x35\x8a\x6a\xc2\xa1\x80\x08\x8f\x2a\xf3\x39\xe7\x80\xae\x2a\xd1\x5b\x54\x63\xf6\x0a\x9b\x9c\xd6\x23\xc5\xa1\x78\x44\xd6\x57\x05\x71\xa4\x5d\x5d\x0c\x87\x60\x3a\x44\xc2\x79\x65\x8f\x47\xa6\x8a\x88\xb5\xc9\x55\x1b\xfb\xc4\xbc\xf9\xec\x86\xb7\x8f\x20\x9e\xd0\xb1\x3c\x78\x0e\xfb\xdb\x9a\xee\x9b\x3f\x64\x61\xa5\xeb\x5c\xb7\x7b\x9e\x0f\xbd\x94\x51\x9b\xe1\x8d\x3d\xb1\x27\xbf\x44\x17\xd6\xe7\xcc\x3d\xb9\x63\x5d\xfa\x7c\x70\xf4\x69\xdd\x41\x63\xc8\x60\x4f\xc1\xb9\xeb\x4b\xb4\x45\x3d\x75\xbb\xbf\x0c\xd8\x02\x5b\xdb\xeb\x9f\xc5\xcd\x16\xa6\x08\xed\x5b\x7e\x36\x68\xfa\xd9\x11\xdb\xcf\x8e\x57\x03\xa3\xd3\xb4\x57\x95\x2f\xd3\x09\x7c\xed\xb2\xef\xe4\x75\x39\x7d\xd6\x4f\xea\x3d\x04\xf7\x6b\xd8\x30\x42\x9f\x56\xc7\xf6\x59\xd0\x69\x8e\x9f\x9e\x06\x27\xd8\xf8\xad\xb3\x60\xd0\xcf\x7d\x4e\x99\xf7\xc6\xa4\x8b\x71\xd7\x44\xea\xc8\x16\x54\xe1\x3d\x77\x7d\xbe\x39\x01\xa0\x74\x47\x02\xeb\x1b\x7b\x1a\xa8\x5e\x6f\xb5\x8e\xcc\x9f\x92\xc1\x5b\xfb\x4d\x05\x54\x66\xdb\x64\xe4\xc6\x2f\x40\xe0\xd2\xbd\x61\x8a\xde\xe0\x92\x4a\x25\xb6\x21\x98\x97\x59\xf6\x80\x41\x17\xfa\x17\x5c\xce\x41\x68\x9a\x57\x37\xc1\x27\xb6\x28\xe1\x4f\x46\xca\x9f\xe6\xc0\x68\x6a\xf0\xad\xa3\x00\x85\x30\xe7\x34\xd0\x20\x82\x40\x09\xef\xde\x9b\xfd\x8d\x13\x5a\x49\xb2\x6a\xc7\x9d\xbb\x1d\x2f\x0c\xb5\x1c\xa9\xf4\xc7\xcf\x3c\xd9\x9a\xf9\x61\x7d\xc2\x71\x64\xf4\x49\x64\x49\xf6\x32\x4d\xf9\xe6\x26\xcb\xd5\xf6\x37\x92\x16\xa8\x57\xd0\x85\x09\x4c\xf3\xfb\xe6\x63\x2e\x50\x4a\x7b\x14\xaa\xb5\x87\xea\x24\xdf\xdc\x34\xdc\xca\x7f\x15\x28\xb6\x15\xf3\x02\x80\xd9\x0c\x1e\xf5\x90\x75\xae\x11\x59\xc5\xb8\xb7\xaa\x56\xc7\xde\x51\x3c\x8a\x5e\x9f\x42\x8b\xc9\xd6\x29\x47\x74\x34\x08\x0f\x89\x9b\x1b\xee\xf4\x2c\xd7\x8e\x68\x02\x65\x68\xf9\xe5\x7c\x60\x77\x0f\x97\xc7\xbe\x2b\x03\xb7\x52\x9b\xfe\x0b\x17\x19\x51\x0a\x85\x8b\x53\xff\xf7\x74\x60\xe3\xf0\xa8\x6a\x35\xae\x57\xe6\x22\xca\x17\x1a\xbd\x55\x82\xb2\xe5\x34\x74\x87\xbc\xfa\xa3\x4e\x1e\x1d\x2e\xd4\x48\xf7\x98\xe2\x90\x9e\x4c\x6a\x32\xd4\xb3\xfd\x60\x69\x38\x31\xed\xbe\x80\x75\x52\x2e\x06\xa4\x8f\x8a\x97\x83\xba\x97\xdd\x5b\x23\x0d\x9c\xbb\x5c\x22\x6a\xd5\x66\x6a\x4e\xd4\xaa\x97\xa8\x1d\x83\xea\x95\xc3\xf6\x8c\xf1\x6f\x1f\xfd\xcf\x1b\x87\xf4\x30\xcb\x73\xfd\x7e\x6d\xe9\x38\x3b\x3c\x49\xf2\xe9\x94\x19\xeb\x1b\x0f\xf1\x57\x48\x12\x14\x6d\xcc\x57\x66\x6c\x0c\xea\xde\xea\xef\xb8\x9f\x84\xbb\x96\xea\xa1\x5e\xef\xe9\x77\x09\x7d\xe9\x78\x7c\x92\x6d\xae\x8c\x8c\x53\x17\x5c\x64\xf6\xdf\x2c\x7d\x7e\xdd\xf3\x6c\xad\xc7\x41\xbf\xf6\xf9\xa5\x07\x8b\x0e\x1a\x7e\x8e\xe8\x9a\xd6\xf3\xef\x0f\xe7\xe5\xa0\x31\xe3\x94\xc2\xb5\xf8\xb2\x85\x6b\x48\xdc\xc8\xc2\x35\xb4\x7c\x4c\xe1\x5a\x7c\x4e\xe1\x1a\xd8\x38\x3c\xaa\xda\x93\x14\xae\x1e\x53\x46\x16\xae\x3a\x6e\x86\x79\xd9\x2f\xfc\x09\xea\xd6\xc0\xf7\x53\x5a\xba\xd2\xbf\xd8\xf5\xd2\x83\xed\x1c\xcb\x8e\x4e\x5e\x07\xd9\x78\xe6\x6a\x45\xd3\xe6\xb0\xa1\x1b\x4f\x33\xe2\xb9\xdf\x0d\xf4\xb9\x50\x47\x88\x7d\x8f\xd6\xef\x91\x77\xef\xa5\xf1\xb1\xa6\x1f\x17\xf0\x9f\x0b\x58\x1b\x57\x98\xde\xf7\x94\xb3\x94\x77\x66\xf2\x80\x09\x8f\x26\x63\xe7\xa9\x43\x3a\xce\x81\xe4\x39\xb2\x64\x7a\x60\x92\xcd\x56\x5d\x60\xda\x18\xee\x55\x24\xeb\xd4\x75\x6b\xce\x91\x38\x68\x1d\xfc\x7a\xc4\x36\x53\xc2\x4e\x59\xd0\xbe\x18\xb6\xb1\x8e\xf2\x03\x68\xd7\x00\xb7\xd0\x3f\x09\xed\xfe\xcc\xfb\x07\x53\xec\x77\x4e\x19\x26\x43\xc9\x50\x9f\x52\xa3\x7f\x70\xca\x7e\xde\x5a\xe0\x0f\xd3\x62\xb2\xdb\x45\x57\x3c\x4d\x31\x56\x94\x33\xbb\xa2\x2c\x27\xe1\xe0\x01\xaa\x3e\x3d\x11\x13\xa2\x23\x9a\xa4\x31\xbd\xf6\x90\x4d\x9a\x5d\x51\x74\x6a\x7f\xe1\xd2\x8f\xdf\x63\x54\xa5\x73\xb4\xd6\x23\x12\xed\x93\x28\xed\x1f\x01\xaa\xfe\x7f\x58\x69\x7b\x23\xd5\xac\x49\x38\x4a\x93\x2b\x65\x91\x9b\xbf\xdc\xae\x89\xa0\x24\x11\x34\x06\x22\x96\x45\x86\x4c\xc9\x0b\x90\x94\xc5\x08\x1b\x84\x42\x62\x02\x3e\x59\xac\xc8\x0d\x42\x4c\x98\x7b\xbf\xba\x42\x58\x50\x21\x15\x50\x85\x19\x50\xfb\x57\x5f\xab\x11\x91\x40\xd5\x5f\x9b\xd7\xb3\x7a\x86\x04\xbe\xb0\xef\x6a\x05\xae\x29\x2f\xa4\x15\x69\x17\x58\xc4\x40\xf1\x25\xaa\x15\x0a\x8b\x7a\x8a\x6c\x7a\x00\xca\x10\xfe\x06\x3f\x56\x8d\xd4\xe9\xa7\x9e\x03\x92\xdf\xfd\xf8\x7e\x74\xb7\xd6\xff\x86\x3f\xd8\x7f\x21\x69\x43\xa6\xae\x53\x5e\x09\xd3\xa5\xe9\x6d\xbc\xc2\x8c\xf8\x6f\x54\xbd\x31\x9b\x27\x60\x6a\x98\x50\x8f\xba\x4b\x14\x93\x4b\xc3\xee\x43\x73\xb1\xd2\xff\xa8\x53\x7c\xf7\x2e\xf3\x74\xd2\x19\xd1\xf5\xb5\xfa\xe8\x0e\xfc\xb5\x95\xd3\x2f\xd2\x0b\xff\x11\x01\x2a\xa1\xd5\xa1\x98\x6f\xad\xc3\x85\x23\xb0\x40\xe9\x13\xb5\xb1\x91\x0b\x19\x5d\xf1\x2c\xe7\x92\x2a\xfc\xcd\xfe\xd3\x9c\x72\x76\xa3\x9f\xe8\x55\x3a\x53\x38\x7e\xb9\x45\x8c\xa6\x41\x19\xfc\x2f\x00\x00\xff\xff\x0b\x22\x41\xbc\x3d\x30\x00\x00") +var _templatesClientParameterGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\x5f\x73\xdb\xb8\x11\x7f\xe7\xa7\xd8\xaa\xe9\x55\xf4\x38\xd4\x3d\xfb\x46\x9d\xc9\xd9\xb9\xc6\x9d\x69\x2e\x4d\x3c\xd7\x87\x4c\xa6\x03\x93\x2b\x09\x77\x24\x40\x03\xa0\x14\x95\xc3\xef\xde\xc1\x1f\x92\x20\x45\x4a\x54\x12\xc7\x77\xd3\x3c\x59\x04\x81\xc5\xee\x6f\x7f\xfb\x07\xa0\x17\x0b\xb8\xe6\x09\xc2\x1a\x19\x0a\xa2\x30\x81\xfb\x3d\xac\xf9\x73\xb9\x23\xeb\x35\x8a\x1f\xe0\xe6\x67\x78\xfd\xf3\x1d\xbc\xbc\xb9\xbd\x8b\x82\x20\x28\x4b\xa0\x2b\x88\xae\x79\xbe\x17\x74\xbd\x51\xf0\xbc\xaa\x16\x0b\x28\x4b\x88\x79\x96\x21\x53\xbd\x77\x65\x09\xc8\x12\xa8\xaa\x20\x08\x72\x12\xff\x46\xd6\xa8\x27\x47\x6f\xdc\x6f\xfd\x62\xb1\x80\xbb\x0d\x95\xb0\xa2\x29\xc2\x8e\xc8\xae\x32\x6a\x83\xe0\xb4\x01\xc5\x79\x1a\xe9\xf9\x2f\x13\xaa\x28\x5b\x83\x6a\xd6\x65\x66\xc7\x5c\xf0\x2d\xc2\xaa\x50\x46\xd4\x06\x19\xec\x79\x01\x02\x9f\x8b\x82\x75\x24\xd5\x5b\x18\xb5\x09\x4b\x82\x80\x66\x39\x17\x0a\xe6\x01\xc0\x2c\xe6\x4c\xe1\x47\x35\xd3\xbf\x19\xaa\xc5\x46\xa9\xdc\x3c\x28\x9a\xe1\x2c\xd0\xbf\xd6\x54\x6d\x8a\xfb\x28\xe6\xd9\x62\xcd\x9f\xf3\x1c\x19\xc9\xe9\x02\x85\xe0\x42\xce\xc6\x27\x88\x82\x59\x19\x00\xb1\x38\x31\x69\x11\xa7\x14\x99\x3a\x22\x4d\x2a\xb1\xca\x8e\x4e\xd8\x91\xf5\x91\xd7\x5b\x92\xd2\x84\x28\x6b\x92\x76\xad\xc1\x40\x42\x74\x83\x2b\x52\xa4\xea\xd6\x3d\x57\x55\xef\xbd\xf7\x22\x34\x0e\x7c\x8d\xbb\xb2\x84\x9c\xc8\x98\xa4\xf4\xbf\x08\xd1\x6b\x92\x69\xef\xbe\x21\x82\x64\x12\x62\x81\x44\xa1\x04\x02\x0c\x77\x70\x6c\x26\xbf\xff\x15\x63\xa5\x45\xee\xa8\xda\x18\x9f\x25\x56\x19\xd8\x92\xb4\x40\x09\x94\x51\x45\xcd\xda\x24\x0a\x56\x05\x8b\x4f\x6c\x3e\x0f\xe1\xe2\xd8\x8e\xa5\xb3\x6d\xa5\x59\x69\x46\xaa\x6a\x4b\x84\x61\x42\x59\x82\x20\x6c\x8d\xde\x2b\x37\xf5\x15\x91\x0e\xa4\x66\x8c\x71\x05\xd1\xad\xfc\x89\xa6\x68\x66\xdb\x17\x5b\x22\x98\xde\x2f\xba\xbd\xa9\xaa\x7a\xc9\xb2\xde\xf1\x56\xbe\x11\x34\xa3\x8a\x6e\x51\xcf\x8e\xfe\xce\xef\xf6\x39\x56\xd5\xdc\x06\x8e\x91\x90\x0b\xca\xd4\x0a\x66\x7f\xf9\xf3\x76\xd6\xb8\xa6\xd5\xc4\x13\x01\x55\x15\xb6\x11\x67\xd4\xb7\xbf\xbd\x1f\x46\x6a\x00\xd0\x99\x28\x50\x15\x82\xc1\x77\x87\x38\xd5\x30\x95\x67\xa1\x71\x20\xe4\xca\x19\x4c\x58\x02\x73\x07\xd4\x0b\x21\xc8\x3e\x6c\x1e\xff\x49\xf2\xfa\x41\x8b\xa3\x32\xd6\x66\x31\xa2\xb8\x08\x61\xce\x85\x9e\xf3\xba\x48\x53\x72\x9f\x22\x40\x08\x55\xf5\x9d\x6f\x9f\x87\x33\x34\x40\x5f\x0e\x82\x10\x00\x98\xe1\x98\x64\x68\x95\xbc\xa3\x19\xf2\x42\x39\x62\x5c\x41\x2c\x6a\x9c\xdd\x1b\x2d\xa8\x0a\xaa\x09\x5c\xff\x37\x55\x1b\xb7\xe8\xb1\x68\x7f\x69\x60\xd4\x73\xc8\x3d\x4d\xa9\xda\x83\xe2\x20\x51\x01\x01\xe5\x76\xe6\x0c\x08\x08\x7c\x28\x50\xaa\x29\x41\xe2\x69\x3d\xaf\x65\xe8\xbf\xd1\x4d\x21\x88\xa2\x9c\x7d\x0b\xa2\xa7\x0c\x22\x6d\xf6\x1f\x2c\x84\xd4\xa7\x04\xce\xb5\x2d\xbc\x4f\x10\x38\xae\xe4\xc3\x8a\x8b\xf3\x23\xc7\xa9\x3d\x8f\xd5\xc7\x5a\x50\xe4\xc6\x9e\x36\x6e\x5a\xf7\x58\x1a\xfe\x1f\x86\xce\xd7\xaa\x3f\x5d\xa8\x27\xc5\x8f\xa3\xc8\x15\xc4\xea\xe3\x79\x71\xf2\xea\xee\xee\xcd\xb5\xe9\x0e\x9f\x22\x54\x0a\xa9\x78\x06\x9e\x0e\x9f\x14\x34\xed\xfa\xb9\x6d\x74\xe1\x42\xf7\xd9\x91\x1d\xfb\x16\x37\xdf\xe2\x66\x00\x87\x96\x34\x57\x60\x59\xd3\x06\xce\x51\xc2\xe8\xb4\x4c\x28\x93\x40\xd2\xd4\xd0\x3a\xd7\xe3\xa8\x50\x48\xcb\x6c\xcd\x76\x6e\xde\xbc\x78\x73\xab\x77\xcb\x39\x65\x2a\xd0\xd4\xd6\x83\x65\x09\x9b\x22\x23\xcc\x17\x0d\x3c\x47\xdb\x1d\x81\xda\xe7\x34\x26\x69\x6a\xce\xab\x12\x81\x08\x84\x9d\xa0\x4a\x21\xd3\x62\x09\x18\x6a\xbf\x75\x11\x72\xb1\x08\xd4\x3e\xc7\xa3\xd1\x2a\x95\x28\x62\x05\x65\x30\xec\xc0\x11\x6b\xcb\x52\xbb\xf5\x06\xb5\x13\x72\xa3\x59\x4d\xa8\xfb\x94\xc7\xbf\x35\x87\xf4\xde\x0c\x1f\xeb\x8b\x85\x7d\xea\xb4\x1f\xda\xda\xcf\x64\x82\x9b\x74\xcb\x14\x8a\x15\x89\xb1\x1d\x7a\xa7\x04\x92\x6c\x84\x2c\x17\x3e\x09\x46\x03\xd6\x05\xa0\xa3\x4a\x2a\xf5\x2f\x77\x8c\x36\xd0\x24\x6f\x91\x24\xd7\x29\x97\x28\xda\x50\xf2\x2e\x27\x8e\x36\x33\xdd\x4e\x38\x68\x12\x77\xbf\xd6\x07\xe0\x27\x45\x3f\x9b\xb9\xc4\xae\xd3\x5e\x17\xd9\xde\x46\x24\x49\xa4\xa1\x5b\xd3\x83\xf3\x71\xf6\x19\x06\x4b\x9b\x6e\x75\xde\x89\xde\x62\x8c\x74\x8b\xa2\x9e\x70\x2c\x20\xc2\x93\xca\x7c\xce\x39\xa0\xaf\x4a\xf4\x0e\xd5\x94\xbd\xc2\x36\xa7\x0d\x48\x71\x28\x9e\x90\xf5\x55\x41\x9c\x68\x57\x1f\xc3\x31\x98\x8e\x91\x70\x59\xdb\xe3\x91\xa9\x26\x62\x63\x72\xdd\xc6\x3e\x32\x6f\x3e\xbb\xe1\x1d\x22\x88\x27\x74\x2a\x0f\x9e\xc2\xfe\xae\xa6\x87\xe6\x8f\x59\x58\xeb\xba\xd4\xed\x9e\xe7\x43\x2f\x65\x34\x66\x78\x63\x8f\xec\xc9\x2f\xd1\x85\x0d\x39\xf3\x40\xee\x54\x97\x3e\x1d\x1c\x43\x5a\xf7\xd0\x18\x33\xd8\x53\x70\xe9\xfa\x12\x6d\xd1\x40\xdd\x1e\x2e\x03\xb6\xc0\x36\xf6\xfa\x67\x71\xb3\x85\x29\x42\x87\x96\x3f\x1b\x35\xfd\xd9\x09\xdb\x9f\x9d\xae\x06\x46\xa7\xf9\xa0\x2a\x5f\xa6\x13\xf8\xda\x65\xdf\xc9\xeb\x73\xfa\xd9\x30\xa9\x0f\x10\x3c\xac\x61\xe3\x08\x7d\x5a\x1d\x3b\x64\x41\xaf\x39\x7e\x7c\x1a\x9c\x61\xe3\x1f\x9d\x05\xa3\x7e\x1e\x72\xca\x72\x30\x26\x5d\x8c\xbb\x26\x52\x47\xb6\xa0\x0a\xef\xb8\xeb\xf3\xcd\x09\x00\xa5\x3b\x12\x58\xdf\xd8\xd3\x40\xfd\x19\xaa\x73\x64\xfe\x94\x0c\xde\xd9\x6f\x2e\xa0\x36\xdb\x26\x23\x37\x7e\x09\x02\xd7\x60\x3f\x16\x45\x6f\x71\x4d\xa5\x12\xfb\x10\xcc\xc7\x2a\x7b\xc0\xa0\x2b\xfd\x04\x57\x4b\x10\x9a\xe6\xf5\x4d\xf0\x99\x2d\x4a\xf8\x83\x91\xf2\xa7\x25\x30\x9a\x1a\x7c\x9b\x28\x40\x21\xcc\x39\x0d\x34\x88\x20\x50\xc2\xfb\x0f\x66\x7f\xe3\x84\x4e\x92\xac\xdb\x71\xe7\x6e\xc7\x0b\x43\x2d\x47\x2a\xfd\xe7\x47\x9e\xec\xcd\xfc\xb0\xfd\x3a\x65\xc9\xe8\x93\xc8\x92\xec\x45\x9a\xf2\xdd\xcb\x2c\x57\xfb\x5f\x48\x5a\xa0\x5e\x41\x57\x26\x30\xcd\xf3\xcb\x8f\xb9\x40\x29\xed\x51\xa8\xd1\x1e\xea\x93\x7c\x7b\xd3\x70\x2b\xff\x55\xa0\xd8\xd7\xcc\x0b\x00\x16\x0b\x78\xd0\x43\xd6\xb9\x46\x64\x1d\xe3\xde\xaa\x46\x1d\x7b\x47\xf1\x20\x06\x7d\x0a\x1d\x26\x5b\xa7\x9c\xd0\xd1\x20\x3c\x26\x6e\x69\xb8\x33\xb0\x5c\x3b\xa2\x0d\x94\xb1\xe5\x57\xcb\x91\xdd\x3d\x5c\x1e\x86\xae\x0c\xdc\x4a\x6d\xfa\x4f\x5c\x64\x44\x29\x14\x2e\x4e\xfd\xe7\xf9\xc8\xc6\xe1\x49\xd5\x1a\x5c\xaf\xcd\x45\x94\x2f\x34\x7a\xa7\x04\x65\xeb\x79\xe8\x0e\x79\xcd\x9f\x26\x79\xf4\xb8\xd0\x20\x3d\x60\x8a\x43\x7a\x36\x6b\xc8\xd0\xcc\xf6\x83\xa5\xe5\xc4\xdc\xbf\xf4\x79\x98\x35\x52\x2e\x47\xa4\x4f\x8a\x97\xa3\xba\x57\xfd\x5b\x23\x0d\x9c\xbb\x5c\x22\x6a\xd3\x65\x6a\x4e\xd4\x66\x90\xa8\x3d\x83\x9a\x95\xe3\xf6\x4c\xf1\xef\x10\xfd\x2f\x5a\x87\x0c\x30\xcb\x73\xfd\x61\x6d\xe9\x39\x3b\x3c\x4b\xf2\xf9\x94\x99\xea\x1b\x0f\xf1\x57\x48\x12\x14\x5d\xcc\x37\x66\x6c\x0a\xea\xde\xea\x6f\xb8\x9f\x85\xbb\x96\xea\xa1\xde\xec\xe9\x77\x09\x43\xe9\x78\x7a\x92\x6d\xaf\x8c\x8c\x53\x57\x5c\x64\xf6\xbf\x4e\x86\xfc\x7a\xe0\xd9\x46\x8f\xa3\x7e\x1d\xf2\xcb\x00\x16\x3d\x34\xfc\x1c\xd1\x37\xad\x7b\xc5\xd5\xa2\x56\x73\xd3\x98\x71\x4e\xe1\x5a\x7d\xd9\xc2\x35\x26\x6e\x62\xe1\x1a\x5b\x3e\xa5\x70\xad\x3e\xa7\x70\x8d\x6c\x1c\x9e\x54\xed\x51\x0a\xd7\x80\x29\x13\x0b\x57\x13\x37\xe3\xbc\x1c\x16\xfe\x08\x75\x6b\xe4\xf7\x39\x2d\x5d\xe5\x5f\xec\x7a\xe9\xc1\x76\x8e\x55\x4f\x27\xaf\x83\x6c\x3d\x73\xbd\xa1\x69\x7b\xd8\xd0\x8d\xa7\x19\xf1\xdc\xef\x06\x86\x5c\xa8\x23\xc4\x7e\x47\x1b\xf6\xc8\xfb\x0f\xd2\xf8\x58\xd3\x8f\x0b\xf8\xcf\x25\x6c\x8d\x2b\x4c\xef\x7b\xce\x59\xca\x3b\x33\x79\xc0\x84\x27\x93\xb1\xf3\xd4\x31\x1d\x97\x40\xf2\x1c\x59\x32\x3f\x32\xc9\x66\xab\x3e\x30\x5d\x0c\x0f\x2a\x92\x75\xea\xb6\x33\xe7\x44\x1c\x74\x0e\x7e\x03\x62\xdb\x29\x61\xaf\x2c\x68\x5f\x8c\xdb\xd8\x44\xf9\x11\xb4\x1b\x80\x3b\xe8\x9f\x85\xf6\x70\xe6\xfd\x9d\x29\xf6\x2b\xa7\x0c\x93\xb1\x64\xa8\x4f\xa9\xd1\x3f\x38\x65\x3f\xee\x2d\xf0\xc7\x69\x31\x2b\xcb\xe8\x9a\xa7\x29\xc6\x8a\x72\x66\x57\x54\xd5\x2c\x1c\x3d\x40\x35\xa7\x27\x62\x42\x74\x42\x93\x34\xa5\xd7\x1e\xb3\x49\xb3\x2b\x8a\xce\xed\x2f\x5c\xfa\xf1\x7b\x8c\xba\x74\x4e\xd6\x7a\x42\xa2\x7d\x14\xa5\xfd\x23\x40\xdd\xff\x8f\x2b\x6d\x6f\xa4\xda\x35\x09\x47\x69\x72\xa5\x2c\x72\xf3\xaf\xb1\x5b\x22\x28\x49\x04\x8d\x81\x88\x75\x91\x21\x53\xf2\x12\x24\x65\x31\xc2\x0e\xa1\x90\x98\x80\x4f\x16\x2b\x72\x87\x10\x13\xe6\xbe\xaf\x6e\x10\x56\x54\x48\x05\x54\x61\x06\xd4\xfe\x4b\xae\xd5\x88\x48\xa0\xea\xaf\xed\xe7\x59\x3d\x43\x02\x5f\xd9\x6f\xb5\x02\xb7\x94\x17\xd2\x8a\xb4\x0b\x2c\x62\xa0\xf8\x1a\xd5\x06\x85\x45\x3d\x45\x36\x3f\x02\x65\x08\x7f\x83\xef\xeb\x46\xea\xfc\x53\xcf\x11\xc9\xef\xbf\xff\x30\xb9\x5b\x1b\xfe\xc2\x1f\x1c\x7e\x90\xb4\x21\xd3\xd4\x29\xaf\x84\xe9\xd2\xf4\x2e\xde\x60\x46\xfc\x2f\xaa\xde\x98\xcd\x13\x30\x37\x4c\x68\x46\xdd\x25\x8a\xc9\xa5\x61\xff\xa5\xb9\x58\x19\x7e\xd5\x2b\xbe\x07\x97\x79\x3a\xe9\x4c\xe8\xfa\x3a\x7d\x74\x0f\xfe\xc6\xca\xf9\x17\xe9\x85\x7f\x8f\x00\x55\xd0\xe9\x50\xcc\xaf\xce\xe1\xc2\x11\x58\xa0\xf4\x89\xda\xda\xc8\x85\x8c\xae\x79\x96\x73\x49\x15\xfe\x62\xff\x77\x9b\x72\xf6\x52\xbf\xd1\xab\x74\xa6\x70\xfc\x72\x8b\x18\x4d\x83\x2a\xf8\x5f\x00\x00\x00\xff\xff\x42\x0a\x05\x41\xe5\x2f\x00\x00") func templatesClientParameterGotmplBytes() ([]byte, error) { return bindataRead( @@ -175,12 +162,12 @@ func templatesClientParameterGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/client/parameter.gotmpl", size: 12349, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf8, 0xe8, 0x6f, 0x8f, 0xfc, 0x7e, 0xc1, 0xb6, 0xd8, 0x28, 0x41, 0x7d, 0x34, 0x8, 0x3c, 0xe3, 0xaa, 0x53, 0x5c, 0x7b, 0x67, 0x78, 0x8e, 0x81, 0x74, 0x3e, 0x4a, 0x36, 0x3e, 0x43, 0xd8, 0x34}} + info := bindataFileInfo{name: "templates/client/parameter.gotmpl", size: 12261, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x90, 0xd8, 0x41, 0xd2, 0x6, 0xe3, 0x24, 0x53, 0x68, 0xa4, 0xc6, 0xcc, 0x6d, 0xa3, 0x61, 0xd3, 0x49, 0x4e, 0xe2, 0x3d, 0xf3, 0x9b, 0x1e, 0x12, 0x19, 0xf, 0xd3, 0xd4, 0x4c, 0x37, 0x6f, 0x72}} return a, nil } -var _templatesClientResponseGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xdc\x59\xcd\x73\xdc\xb6\x15\x3f\x17\x7f\xc5\x2b\x6b\x7b\x96\xea\x8a\x9b\xf4\xa8\x8c\x0e\x89\xac\x38\x3a\xc4\xd6\x48\xee\xf4\x90\xc9\x74\x60\xf2\xed\x2e\x2a\x12\x60\x00\x50\x9b\x2d\x87\xff\x7b\x07\x1f\x24\xc1\x25\xb8\x92\xdb\x53\xe3\x8b\xb9\xf8\x78\x9f\xbf\xf7\xf0\x03\xd4\xb6\x50\xe0\x96\x71\x84\x24\x2f\x19\x72\x2d\x51\xd5\x82\x2b\x4c\xa0\xeb\x36\x1b\xf8\x88\x87\xb6\x85\x9a\xaa\x9c\x96\xec\xdf\x08\xd9\x47\x5a\x21\x74\x1d\xe4\x12\xa9\x46\x05\x14\xe2\xf3\x07\xa6\xf7\x46\x34\x6d\x4a\x0d\x7b\xa4\x05\x4a\x05\xcf\xb4\x6c\x50\x91\x6d\xc3\xf3\x45\xc9\xab\xb6\x05\xb6\x05\xfc\x0d\xb2\x1b\x51\x20\x5c\x7e\x0b\x5d\x97\x9b\x2f\xc6\x75\xdb\x02\xf2\x02\xba\xce\x2d\xca\x1e\xf3\x3d\x56\x74\xf8\x4d\x79\x01\xab\x60\x67\xda\xaf\xc8\xee\xd4\xa3\x96\x48\x2b\xe8\xba\x35\xb4\x2d\xf2\xe2\x44\x46\xb8\xe2\x20\x99\x46\x09\x4c\x64\xff\xb0\x5f\xa1\x56\xf7\x91\xc2\x45\xdc\xed\x96\x00\x48\xd4\x8d\xe4\xf0\x2e\xba\xc2\x2c\x00\x88\xf9\xf8\x4f\xa5\xa9\x6e\x94\x19\xb8\x02\xe3\xf0\xba\x5f\x3a\x28\x97\x94\xef\x10\xb2\x9f\x7c\x38\x07\x17\x7e\xa2\xea\xbd\x0f\xb5\x1d\x9b\xab\xbd\xb2\x69\x92\x8c\xeb\x2d\x24\x6f\xff\xf2\x9c\x40\x36\xee\x98\x2b\x3a\x17\xe4\x48\xc0\xee\xe9\xb1\x14\xb4\xb8\x02\x17\xb9\x25\x79\x1d\xe9\x08\xd9\x44\x22\xd7\x75\xb0\xa7\xbc\x28\x51\x81\xde\x33\x05\x39\x55\x18\x43\x90\x07\x50\x46\x88\x37\xe5\x3d\xaa\x5c\xb2\x5a\x33\xc1\x9d\xa2\x2f\xa5\xc8\x9f\x72\x51\x55\xc8\xf5\x7c\x1a\x4b\x85\x0b\x01\x32\xe6\xee\x9b\x8a\xf2\x49\xb2\x1c\x50\xc8\xc5\x86\xe8\x63\x8d\x0b\x50\x57\x5a\x36\xb9\xb6\xa9\x8f\xe5\x95\x00\x04\xa9\x35\x28\x26\xe4\x75\x69\x9d\x9a\x6f\x03\x77\xce\x3f\x02\x70\xb1\x19\xe4\x3a\x1d\x71\x47\xb3\x0f\xe2\xb3\xf1\xa7\x5f\x15\xee\x98\x64\x9c\x00\xf8\xdc\x42\x50\x61\x5c\xe8\x00\x05\x3f\x50\x85\x46\x5a\x7a\x3a\x71\xc7\x35\xca\x2d\xcd\x31\x2c\xc3\x1b\x51\xd5\x25\xfe\xfe\xe9\xcb\xbf\x30\xd7\xa7\x3b\x1c\xa0\x52\xe8\xba\x8b\x13\x10\x2e\x2e\x34\xde\xf8\xe1\xc1\x29\xb3\xb7\x54\xe6\x2b\x28\x61\x97\xc9\xd0\xdd\x2e\x9a\x2d\xb2\xd9\x80\xfd\xb9\x43\x6d\xe0\x88\xe0\x92\x67\x4b\x12\xb6\x42\xda\xb1\x18\x5a\xa0\xef\x9d\xae\xc1\x99\x46\x96\x3d\x60\x8e\xec\x19\x65\xbf\x24\xde\x36\x52\xab\x71\x95\x1a\x70\x84\x2d\x24\x22\x21\x0b\xb0\x44\x3a\x32\x7a\x43\xfe\x0b\xad\xb7\x52\x0a\xb9\x4a\x0d\x82\x19\xdf\x41\x4b\xfe\xe4\x15\x6f\x2b\x9d\x3d\xba\x76\xb1\x4a\x7e\x69\x5b\x68\xea\x1a\x25\x64\x3f\xa3\xde\x8b\xa2\x47\xd1\x3d\xd5\x7b\xe8\xba\x5f\x7f\x79\x5b\xfc\xda\x43\x67\xa8\x9c\x09\xe0\x7c\x3a\x1a\xfe\xc4\xc5\x81\x03\x1a\xbd\xb0\xd8\x67\xe0\xed\x5f\x9f\x87\xc9\x64\x1d\xad\xaa\x17\x42\x33\xea\x34\x0b\xed\xb6\x33\x8d\x6d\x0d\x22\xf3\x38\x1f\x5b\xbc\x69\x56\xb3\x7a\xf8\xfa\x18\x7f\x40\xed\x45\xaf\xd2\x3f\x46\x11\x05\x38\x19\xc2\x36\x85\xe2\xd7\x47\x49\x22\x2d\x1e\x7c\xf9\xac\xfa\x3a\x02\xd9\x70\xcd\x2a\xcc\x6e\x2c\x35\xe9\xe7\xd7\x90\x0b\xae\x9a\x0a\xe5\xb8\xc0\x0f\xac\x4d\x81\x56\x54\x2b\x03\x69\x03\xe2\x07\xdc\x31\xa5\xe5\x31\xed\x31\xe7\x3a\xc0\xac\xe3\x12\x80\xcd\x66\x28\xe0\xfe\xb8\x69\x5b\x7f\x3c\xd9\x5d\x06\x09\x37\x82\x3f\xa3\x34\xec\xc0\x46\x28\xa7\x15\x4e\x3c\x59\x1b\x3d\x70\x75\x0d\x0e\x76\xe3\xe2\xc1\xa9\xec\x03\x6a\xa7\x77\x95\x04\x55\x92\xa4\x29\x01\x0b\x73\x29\xe1\xcf\xd7\xc0\x59\x09\x8e\x2b\xf8\x50\x5b\xfb\x55\x76\xc7\x9f\x69\xc9\x0a\x93\xa4\x55\x50\x83\x6b\x48\x9c\xcd\xc9\x1a\x92\x49\x87\x4f\xd6\xf0\x2a\xd5\xbe\x37\xce\x8a\x2a\x7e\x88\x58\x07\x67\xde\xfb\xf6\x6a\x60\x63\x82\x75\xa7\x6e\x1a\xa5\x45\xf5\xa3\xcd\x89\x8b\x83\x5b\xb2\x1c\x37\x9f\xbf\xec\x9e\x4a\x65\x3d\x1c\x48\xcb\x6f\x09\x64\x8f\x07\xba\xdb\xa1\x74\x02\xed\xb6\x3f\x5a\x58\x2f\x56\xb1\xf0\x64\xab\x8b\x89\x76\x2b\xda\x87\x3a\xde\x0b\x97\xe4\xbf\x68\xb4\x15\x3c\x3f\x2c\xa3\xdc\xe0\x94\x10\xf6\x5d\x6c\x5e\x50\xb5\x67\x11\x54\x99\x33\xce\x75\x34\x30\x9c\x8a\x40\x3f\x17\x96\x8e\x16\xf7\x34\x7f\xa2\x3b\xb4\x66\x65\x3f\x8b\x02\x4b\xe5\x87\x8c\x77\x7f\xe7\x15\x95\x6a\x4f\xcb\xb6\xb5\x87\x57\xdd\xcf\x9d\xb4\xb1\xd5\x79\x49\x69\x84\xd4\x7e\x2f\x25\x3d\x76\xdd\x63\xc9\x72\x1c\xdc\x1f\xab\xf7\x07\x51\x1c\x57\xe9\xd8\x82\x5e\x86\xd7\x19\x10\xf4\xdc\xea\xba\x8f\xc1\x49\x01\x2d\x34\xfc\xee\x65\x79\x1c\x0f\xab\x58\x57\x4f\x4f\xa8\x27\xdb\x42\xfc\x20\x5a\x4c\xe1\xe8\xef\xd5\xf5\x10\x85\xbe\x01\xcf\xe3\x34\xea\x58\x09\xb9\xe8\x51\xec\x50\x7a\xe7\xec\x8c\xc3\xdb\x7b\x9a\x7e\x17\x46\xfe\xdd\xbb\xfe\x17\x13\xd9\xed\xa7\x1f\xcf\xa4\xe2\xe4\x66\x32\x52\x2e\xce\xca\xf0\x2c\x1b\xc9\x20\x47\x49\x35\x16\xf0\xe5\x08\x3b\x71\xa9\x5c\x23\xfa\x0e\xde\x7f\x82\x8f\x9f\x3e\xc3\xed\xfb\xbb\xcf\x19\x19\x08\xc3\x8d\xa8\x8f\x92\xed\xf6\x1a\x2e\xad\x0c\x53\xd3\x3d\x69\x9f\xcc\x85\xfc\xad\xf6\xa8\x74\xfd\xa7\xc7\xba\x25\xa4\x9f\xcd\xad\x68\xcb\x4a\x84\x03\x55\x53\x63\x2c\x43\x75\xd6\x80\x16\xa2\xcc\xcc\xfa\xdb\x82\x69\xc3\xe8\xf4\xb0\xaf\xb2\x1a\x6b\x29\x9e\x11\xb6\x8d\xb6\xa2\xf6\xc8\xe1\x28\x1a\x90\x78\x29\x1b\x3e\x91\xd4\xab\xb0\x66\x53\x5e\x10\x42\x58\x55\x0b\xa9\x61\x45\x00\x12\x26\x12\xf3\x1f\x47\xbd\xd9\x6b\x5d\x27\xe6\x46\x93\xec\x98\xde\x37\x5f\xb2\x5c\x54\x9b\x9d\xb8\x14\x35\x72\x5a\xb3\x8d\x3f\xa2\x93\xe5\x15\x46\xe7\x99\x69\xd7\xa1\xcf\x2c\xb0\x9d\x9b\xea\x73\x2a\x06\x23\x08\x78\x66\xb0\x68\x8c\x9d\x4d\xc8\x84\x27\xf8\xab\xf2\x9d\x8d\x80\xbf\xa0\x4d\xce\xa5\x58\xb3\x74\x7b\xdf\x3c\xe1\x71\x0d\x6f\xec\xc5\xd5\x54\x4c\x36\x11\x62\x66\x3d\x45\x0e\xe5\xf9\xe5\x27\x52\x53\x0b\x85\x68\x63\x7f\x70\x7c\x85\x29\xa0\xe0\xbf\x83\x9b\xca\xe2\x9d\xb5\x91\x98\x9d\xb9\xd9\x7a\x49\xc1\xfd\x76\x81\x5d\x8d\xcf\x10\xae\x7c\x19\xdf\xf5\x64\xcd\x39\xe1\x5f\x54\x22\x4f\x2a\xc4\x01\xfc\x21\xe0\x7f\x96\x0c\x1a\x4f\x14\xca\x67\x43\xf2\xfa\x71\xc6\xb5\xb0\x3e\x49\xd7\x0d\x8a\x68\x13\xfc\x6a\xf6\xe9\xdc\x4c\x27\x36\xfc\x0f\x1c\x34\x85\xd5\x70\xc4\xb5\x8e\xd8\x08\x99\x7a\xe6\x79\x69\x03\xd5\x4b\x51\x36\x38\xea\xc0\x74\xbe\x1f\x4f\x66\x7f\x17\xec\x37\x04\x98\xba\xec\x01\x39\x08\x70\x33\xe0\x5e\x4c\x82\xab\xce\x95\x1d\x35\x5d\x4d\x35\xa5\x36\xc0\x7b\xe1\xbd\xed\x15\xaf\x3c\x06\xaf\xb3\x68\x1f\x96\x5e\xc8\xbc\x01\xe3\x59\xe1\x4c\xc9\xa2\x4c\x7f\x0c\xa7\x3d\x31\xe6\x6a\x3c\xf0\xa6\xfd\xbe\xf5\x3a\xc2\xe6\xbd\xf6\x7d\xde\xfc\xeb\xc8\x64\xd6\x3b\x76\xa7\x1e\x9b\x3c\x47\x65\x62\xe7\x6c\x5a\x9b\x8d\xfd\xeb\x90\x95\xe1\xc6\x43\x1e\x74\x92\x07\xf7\x3c\x63\xbb\xc2\x14\xe9\x6e\xda\xbe\x5d\x2d\x2d\x18\x24\xbc\x39\x01\x02\xf4\xcf\x5d\x57\xc1\xba\x41\xed\x2b\xd3\x79\x02\xa3\x57\x67\x77\x21\xf0\xff\x0f\xf9\x65\xdb\x59\xf1\x6c\xe0\xdb\x6f\xbe\x81\xeb\x6b\xf8\xdb\x5c\x4a\x90\xf4\x38\x50\x02\x08\x90\x59\x1a\xec\x8f\x32\x4c\xf7\x2b\x52\x19\x49\x64\xa0\xc9\x37\x90\x8f\x78\xf8\xfe\xfe\xce\xbd\xc9\x24\x93\xa7\x92\xe0\xb2\xb1\x3e\x75\x35\x5d\x82\xe7\xd4\xa0\x13\x14\xbb\xb7\x8d\x58\x37\x31\xec\x1b\xab\xba\x34\x87\xff\xec\x6f\x02\x99\x5f\xe1\xa5\x0c\xef\x94\x33\x9c\x9f\x97\x12\xdf\xd0\x13\xa1\xd1\xb0\xdb\xdf\xb5\xa4\x0e\xaa\xd6\xb6\xd8\xdb\xb1\x3f\x3e\x47\x6d\x85\xc8\xdd\x7b\x96\x37\xd7\x53\x9a\xab\xca\x50\x7f\x08\xee\x3a\xe4\x62\x33\xb5\x53\x59\x4d\x33\x2f\xff\x13\x00\x00\xff\xff\x72\xd1\x45\xae\x24\x19\x00\x00") +var _templatesClientResponseGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xdc\x58\xcd\x72\xe4\xb6\x11\x3e\x07\x4f\xd1\x61\xbc\x5b\x43\x65\xc4\xb1\x73\x94\x4b\x07\x5b\x2b\xaf\x75\xf0\xae\x4a\xda\x54\x0e\x2e\x57\x0a\x22\x7b\x66\x90\x25\x01\x1a\x00\x35\x9e\xb0\xf8\xee\x29\xfc\x90\x04\x87\xe0\x48\x9b\x9c\xb2\xba\x68\x08\x34\xba\xd1\xdd\x5f\x7f\x68\xa0\x6d\xa1\xc0\x2d\xe3\x08\x49\x5e\x32\xe4\x5a\xa2\xaa\x05\x57\x98\x40\xd7\x6d\x36\xf0\x01\x0f\x6d\x0b\x35\x55\x39\x2d\xd9\xbf\x11\xb2\x0f\xb4\x42\xe8\x3a\xc8\x25\x52\x8d\x0a\x28\xc4\xe7\x0f\x4c\xef\x8d\x6a\xda\x94\x1a\xf6\x48\x0b\x94\x0a\x9e\x69\xd9\xa0\x22\xdb\x86\xe7\x8b\x9a\x57\x6d\x0b\x6c\x0b\xf8\x3b\x64\x37\xa2\x40\xb8\xfc\x0e\xba\x2e\x37\xbf\x18\xd7\x6d\x0b\xc8\x0b\xe8\x3a\x27\x94\x3d\xe6\x7b\xac\xe8\xf0\x4d\x79\x01\xab\x60\x65\xda\x4b\x64\x77\xea\x51\x4b\xa4\x15\x74\xdd\x1a\xda\x16\x79\x71\xa2\x23\x94\x38\x48\xa6\x51\x02\x13\xd9\x3f\xec\xaf\xd0\xaa\xfb\x91\xc2\x45\xdc\xed\x96\x00\x48\xd4\x8d\xe4\xf0\x36\x2a\x61\x04\x00\x62\x3e\xfe\x53\x69\xaa\x1b\x65\x06\xae\xc0\x38\xbc\xee\x45\x07\xe3\x92\xf2\x1d\x42\xf6\xb3\x0f\xe7\xe0\xc2\xcf\x54\xbd\xf3\xa1\xb6\x63\x73\xb3\x57\x36\x4d\x92\x71\xbd\x85\xe4\xcd\x5f\x9e\x13\xc8\xc6\x15\x73\x43\xe7\x82\x1c\x09\xd8\x3d\x3d\x96\x82\x16\x57\xe0\x22\xb7\xa4\xaf\x23\x1d\x21\x9b\x48\xe4\xba\x0e\xf6\x94\x17\x25\x2a\xd0\x7b\xa6\x20\xa7\x0a\x63\x08\xf2\x00\xca\x08\xf1\x5b\x79\x87\x2a\x97\xac\xd6\x4c\x70\x67\xe8\xa9\x14\xf9\xe7\x5c\x54\x15\x72\x3d\x9f\xc6\x52\xe1\x42\x80\xcc\x76\xf7\x4d\x45\xf9\x24\x59\x0e\x28\xe4\x62\x43\xf4\xb1\xc6\x05\xa8\x2b\x2d\x9b\x5c\xdb\xd4\xc7\xf2\x4a\x00\x82\xd4\x1a\x14\x13\xf2\xba\xb4\x4e\xb7\x6f\x03\x77\xce\x3f\x02\x70\xb1\x19\xf4\x3a\x1b\x71\x47\xb3\xf7\xe2\x93\xf1\xa7\x97\x0a\x57\x4c\x32\x4e\x00\x7c\x6e\x21\xa8\x30\x2e\x74\x80\x82\x1f\xa9\x42\xa3\x2d\x3d\x9d\xb8\xe3\x1a\xe5\x96\xe6\x18\x96\xe1\x8d\xa8\xea\x12\xff\xf8\xf8\xf4\x2f\xcc\xf5\xe9\x0a\x07\xa8\x14\xba\xee\xe2\x04\x84\x8b\x82\xc6\x1b\x3f\x3c\x38\x65\xd6\x96\xca\xfc\x0a\x4a\xd8\x65\x32\x74\xb7\x8b\x66\x8b\x6c\x36\x60\x3f\x77\xa8\x0d\x1c\x11\x5c\xf2\x6c\x49\xc2\x56\x48\x3b\x16\x43\x0b\xf4\xdc\xe9\x08\xce\x10\x59\xf6\x80\x39\xb2\x67\x94\xbd\x48\x9c\x36\x52\x6b\x71\x95\x1a\x70\x84\x14\x12\xd1\x90\x05\x58\x22\x1d\x19\xbd\x21\xff\x85\xd5\x5b\x29\x85\x5c\xa5\x06\xc1\x8c\xef\xa0\x25\x7f\xf2\x86\xb7\x95\xce\x1e\x1d\x5d\xac\x92\x5f\xdb\x16\x9a\xba\x46\x09\xd9\x2f\xa8\xf7\xa2\xe8\x51\x74\x4f\xf5\x1e\xba\xee\xb7\x5f\xdf\x14\xbf\xf5\xd0\x19\x2a\x67\x02\x38\x9f\x8e\x86\x7f\xe6\xe2\xc0\x01\x8d\x5d\x58\xe4\x19\x78\xf3\xd7\xe7\x61\x32\x59\x47\xab\xea\x85\xd0\x8c\x36\x8d\xa0\x5d\x76\x86\xd8\xd6\x20\x32\x8f\xf3\x91\xe2\x0d\x59\xcd\xea\xe1\xcb\x63\xfc\x1e\xb5\x57\xbd\x4a\xbf\x8e\x22\x0a\x70\x32\x84\x6d\x0a\xc5\x2f\x8f\x92\x44\x5a\x3c\xf8\xf2\x59\xf5\x75\x04\xb2\xe1\x9a\x55\x98\xdd\xd8\xd6\xa4\x9f\x5f\x43\x2e\xb8\x6a\x2a\x94\xa3\x80\x1f\x58\x9b\x02\xad\xa8\x56\x06\xd2\x06\xc4\x0f\xb8\x63\x4a\xcb\x63\xda\x63\xce\x31\xc0\x8c\x71\x09\xc0\x66\x33\x14\x70\x7f\xdc\xb4\xad\x3f\x9e\xec\x2a\x83\x84\x1b\xc1\x9f\x51\x9a\xee\xc0\x46\x28\xa7\x15\x4e\x3c\x59\x1b\x3b\x70\x75\x0d\x0e\x76\xa3\xf0\xe0\x54\xf6\x1e\xb5\xb3\xbb\x4a\x82\x2a\x49\xd2\x94\x80\x85\xb9\x94\xf0\xe7\x6b\xe0\xac\x04\xd7\x2b\xf8\x50\xdb\xfd\xab\xec\x8e\x3f\xd3\x92\x15\x26\x49\xab\xa0\x06\xd7\x90\xb8\x3d\x27\x6b\x48\x26\x0c\x9f\xac\xe1\x55\xa6\x3d\x37\xce\x8a\x2a\x7e\x88\x58\x07\x67\xde\x7b\x7a\x35\xb0\x31\xc1\xba\x53\x37\x8d\xd2\xa2\xfa\xc9\xe6\xc4\xc5\xc1\x89\x2c\xc7\xcd\xe7\x2f\xbb\xa7\x52\x59\x0f\x87\xa6\xe5\xf7\x04\xb2\xc7\x03\xdd\xed\x50\x3a\x85\x76\xd9\xd7\x16\xd6\x8b\x55\x2c\x3c\xd9\xea\x62\x62\xdd\xaa\xf6\xa1\x8e\x73\xe1\x92\xfe\x17\x37\x6d\x15\xcf\x0f\xcb\x68\x6f\x70\xda\x10\xf6\x2c\x36\x2f\xa8\xda\x77\x11\x54\x99\x33\xce\x31\x1a\x98\x9e\x8a\x40\x3f\x17\x96\x8e\x16\xf7\x34\xff\x4c\x77\x68\xb7\x95\xfd\x22\x0a\x2c\x95\x1f\x32\xde\xfd\x9d\x57\x54\xaa\x3d\x2d\xcd\xfd\x45\x8a\xba\x9f\x8a\xb1\xd8\x64\x87\x3f\x48\x49\x8f\x5d\xf7\x58\xb2\x1c\x07\xe7\xc6\xda\xfc\x51\x14\xc7\x55\x3a\x12\xcc\xcb\xe0\x39\x93\xe2\xbe\x73\xba\xee\x3d\x3c\x29\x8f\x05\x3a\xef\x5e\xd6\xc7\xf1\xb0\x8a\x71\x76\x7a\xd2\x58\xb2\x2d\xc4\x8f\x99\xc5\x04\x8d\xfe\x5e\x5d\x0f\x51\xe8\xe9\x75\x1e\xa7\xd1\xc6\x4a\xc8\x45\x8f\x62\x47\xce\x5b\xb7\xcf\x38\x78\xbd\xa7\xe9\xf7\x61\xe4\xdf\xbe\xed\xbf\x98\xc8\x6e\x3f\xfe\x74\x26\x15\x27\xf7\x8e\xb1\xa1\xe2\xac\x0c\x4f\xaa\xb1\xd5\xe3\x28\xa9\xc6\x02\x9e\x8e\xb0\x13\x97\xca\xd1\xcc\xf7\xf0\xee\x23\x7c\xf8\xf8\x09\x6e\xdf\xdd\x7d\xca\xc8\xd0\x0e\xdc\x88\xfa\x28\xd9\x6e\xaf\xe1\xd2\xea\x30\x15\xdb\xb7\xe4\x93\xb9\xb0\x3b\xab\x3d\x44\x1d\xbb\xf4\x48\xb6\xed\xe6\x27\x73\xe7\xd9\xb2\x12\xe1\x40\xd5\x74\x33\xb6\xff\x74\xbb\x01\x2d\x44\x99\x19\xf9\xdb\x82\x69\xd3\xaf\xe9\x61\x5d\x65\x2d\xd6\x52\x3c\x23\x6c\x1b\x6d\x55\xed\x91\xc3\x51\x34\x20\xf1\x52\x36\x7c\xa2\xa9\x37\x61\xb7\x4d\x79\x41\x08\x61\x55\x2d\xa4\x86\x15\x01\x48\x98\x48\xcc\x3f\x8e\x7a\xb3\xd7\xba\x4e\xcc\x7d\x25\xd9\x31\xbd\x6f\x9e\xb2\x5c\x54\x9b\x9d\xb8\x14\x35\x72\x5a\xb3\x8d\xa3\xcf\x64\x59\xc0\x9f\xd0\x67\x24\xdc\x49\x7d\x4e\xe0\x40\x77\x67\xa6\x2d\x71\x53\x8d\x89\xbf\x56\x39\x4f\xd4\x70\xc1\xbd\xf3\xdf\x03\x63\xf5\xf3\xc1\x44\x6a\xf3\x10\xe5\xcc\x07\xd7\x0a\x30\x05\x14\xfc\xef\xe0\x12\xb0\x78\x1d\x6c\x24\x66\x67\x2e\x8d\x5e\x53\x70\x75\x5c\x68\x5c\xc6\x1b\xbe\xab\x1d\xc6\x77\x7d\x1f\xe4\x3c\xf2\x8f\x15\x91\xd7\x0a\xe2\xd0\xf5\x10\xb4\x56\xb6\xcf\x32\x9e\x28\x94\xcf\xa6\x7f\xea\xc7\x19\xd7\xc2\xfa\x24\x5d\x29\x16\x51\x06\xfa\xe2\xc6\xce\xb9\x99\x4e\xf6\xf0\x3f\xb4\x77\x29\xac\x86\xd3\xa3\x75\x3d\x83\x90\xa9\x6f\xea\x2e\x6d\xa0\x7a\x2d\xca\x06\x47\x1d\x98\xce\xf7\xe3\xa1\xe7\xaf\x59\xfd\x82\xe0\x6c\xbb\xec\x7b\xc2\x41\x81\x9b\x01\xf7\x18\x11\xdc\x22\xae\xec\xa8\xa1\x14\xd5\x94\xda\xf0\xe4\x0b\x4f\x59\xaf\x78\x40\x69\x5b\xf8\x66\x16\xed\xc3\xd2\xe3\x93\xdf\xc0\x48\xd4\x6e\x2b\x59\xb4\x89\x1e\xc3\x69\xe9\x7a\x6e\xc6\x03\x6f\x4a\xb6\xad\xb7\x11\x32\xe7\xda\x93\xac\xf9\xeb\xc8\x64\xd6\x3b\x76\xa7\x1e\x9b\x3c\x47\x65\x62\xe7\xf6\xb4\x36\x0b\xfb\x87\x17\xab\xc3\x8d\x87\x2d\xc6\x49\x1e\xdc\xcb\x87\x2d\xdd\x29\xd2\xdd\xb4\x7d\x16\x5a\x12\x18\x34\x7c\x73\x02\x04\xe8\x5f\x92\xae\x02\xb9\xc1\xec\x2b\xd3\x79\x02\xa3\x57\x67\x77\x21\xf0\xff\x0f\xf9\x65\xdb\x59\xf1\x6c\xe0\xbb\x6f\xbf\x85\xeb\x6b\xf8\xdb\x5c\x4b\x90\xf4\x38\x50\x02\x08\x90\x59\x1a\xec\x47\x19\xa6\xfb\x15\xa9\x8c\x24\x32\xb0\xe4\x09\xe4\x03\x1e\x7e\xb8\xbf\x73\xcf\x1d\xc9\xc0\x3f\xe1\xc3\x4e\x21\x50\xd9\x46\xa6\xa2\x86\x31\x28\x3f\xc2\x89\x1c\x2a\xff\x54\x5e\xf8\x03\x80\x29\x63\xb8\x16\x8c\x6b\x60\xd3\x03\x56\xd5\x98\x07\x37\x84\xf5\x69\x10\xd3\x25\xe0\x4f\x5d\x3d\xa9\x0f\xf7\x20\x11\xe3\x29\xd3\x32\x63\x55\x97\xe6\x4c\x9f\x3d\xe4\x67\x5e\xc2\x6b\x19\x1e\x17\x67\x15\x74\x5e\x4b\x7c\x41\xdf\xdf\x8c\x1b\xbb\xfd\x43\x4b\xea\x8a\xc0\xee\x2d\xf6\xe0\xeb\x9f\x85\x46\x6b\x85\xc8\xdd\x23\x94\xdf\xae\x0f\xe4\x55\x65\x3a\x7f\x08\x2e\x28\xe4\x62\x43\x4c\x48\xc6\xa5\xca\x9a\x1a\xdc\x1c\xa2\xf5\x9f\x00\x00\x00\xff\xff\x4c\xb6\xa9\x92\xdb\x18\x00\x00") func templatesClientResponseGotmplBytes() ([]byte, error) { return bindataRead( @@ -195,12 +182,12 @@ func templatesClientResponseGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/client/response.gotmpl", size: 6436, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2a, 0x28, 0xb9, 0x15, 0x9f, 0x1a, 0x7a, 0x38, 0x12, 0xb5, 0x7a, 0x55, 0xaa, 0xe9, 0x20, 0x89, 0xda, 0xaf, 0xf7, 0x76, 0xc6, 0x97, 0x48, 0xcf, 0x12, 0xcf, 0xb0, 0x15, 0x8a, 0x3d, 0x50, 0xdb}} + info := bindataFileInfo{name: "templates/client/response.gotmpl", size: 6363, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x40, 0x2e, 0x8b, 0x3b, 0xc7, 0xb, 0xf9, 0x2c, 0x74, 0x50, 0xe2, 0xd0, 0xb6, 0xa3, 0x6a, 0x54, 0xe0, 0x84, 0x11, 0xaa, 0xa1, 0x6c, 0xe4, 0x98, 0xd1, 0x66, 0x16, 0x20, 0x23, 0x3d, 0x60, 0x14}} return a, nil } -var _templatesContribStratoscaleClientClientGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x56\xcd\x6e\xe3\x38\x0c\xbe\xeb\x29\xb8\xd9\x6e\x91\x04\x89\xbd\x7b\xf5\x62\x0e\x45\x3b\x8b\xc9\x61\xda\xa0\x0d\x30\xc7\x85\x6a\xd3\xb6\x50\x5b\xf2\x48\x72\xd3\x8c\xe1\x77\x5f\xe8\x27\x4a\xec\x24\xed\xdc\xf6\x32\x97\x44\x26\x3f\x92\x12\xf9\x91\x52\x1c\xc3\xad\xc8\x10\x0a\xe4\x28\xa9\xc6\x0c\x9e\x77\x50\x88\xa5\xda\xd2\xa2\x40\xf9\x37\xdc\x3d\xc0\xfd\xc3\x06\x3e\xdf\xad\x36\x11\x21\xa4\xeb\x80\xe5\x10\xdd\x8a\x66\x27\x59\x51\x6a\x58\xf6\x7d\x1c\x43\xd7\x41\x2a\xea\x1a\xb9\x1e\xe9\xba\x0e\x90\x67\xd0\xf7\x84\x90\x86\xa6\x2f\xb4\x40\x03\x8e\xee\x69\x8d\x56\x1a\xc7\xb0\x29\x99\x82\x9c\x55\x08\x5b\xaa\x86\x3b\xd1\x25\x82\xdf\x0a\x68\x21\xaa\xc8\xe0\x3f\x67\x4c\x33\x5e\x80\x0e\x76\xb5\x0d\xd7\x48\xf1\x8a\x90\xb7\xda\xba\x2a\x91\xc3\x4e\xb4\x20\x71\x29\x5b\x3e\xf0\xb4\x0f\x61\xf7\x4c\x79\x46\x08\xab\x1b\x21\x35\x4c\x09\xc0\x84\xa3\x8e\x4b\xad\x9b\x89\xf9\x28\x98\x2e\xdb\xe7\x28\x15\x75\x5c\x88\xa5\x68\x90\xd3\x86\xc5\x28\xa5\x90\xea\x1d\x80\x89\xf4\x8e\x5a\xb6\x5c\xb3\x1a\xdf\x41\xbc\xd2\x8a\x65\x54\xe3\x84\x10\x00\xa5\x65\x5e\xeb\x8b\xb1\xac\xd6\x02\xbb\x0e\x24\xe5\x05\x42\x74\x87\x39\x6d\x2b\xbd\xb2\xe7\x52\x60\x0b\xd1\x48\xc6\x75\x0e\x93\x3f\xbe\x4f\x20\xea\x7b\x87\xf7\xd5\x39\xb2\xbd\x7a\xc1\xdd\x02\xae\x5e\x69\xd5\x22\x24\x9f\x20\x1a\x38\x31\x5a\xe8\x7b\x18\xf9\xf3\xf0\x91\xd7\x99\xa9\x6f\x21\x92\x90\xf0\x5a\xa4\x2f\x28\x77\xb0\xe4\xa6\xfe\x37\xeb\x15\x2c\x19\x6f\x5e\x0a\xcb\x03\xf3\xc9\x94\xad\x14\xe3\x1a\x65\x4e\x53\x04\x91\x5b\x41\xd7\x41\xd9\xd6\x94\xb3\x1f\x18\xc8\x03\x69\xc5\x90\x6b\xa2\x77\x8d\xf3\x75\xb0\xea\xc8\x21\x15\x0f\x8d\x89\xcd\x04\x57\x86\x90\x24\x9e\x1b\x5d\x43\x55\x4a\xab\x81\x37\x4f\xed\xa7\xb6\xae\xa9\xdc\xf9\x94\x55\xad\xb4\xb0\x7f\x98\x54\xfa\x9b\x90\x19\x4c\x0f\xfb\xf0\xd0\x99\xc3\x1a\xe3\x3b\x54\xa9\x64\x8d\x89\x66\xd9\xdd\x75\xf0\x5c\x89\xf4\x25\x34\xc7\x10\x10\x32\x65\x16\x95\xc2\xb1\x0f\xab\xf8\xc8\x81\xb1\xb3\xab\xd3\x04\xdd\xac\x57\x3e\x84\x39\xf9\x3c\x76\xc5\x39\x3d\xfb\x34\xd5\x6f\x90\x0a\xae\xf1\x4d\x47\xb7\xee\x7f\x01\x0d\x95\xb4\x56\x30\x3f\x6b\xb2\xb6\x4a\x7f\xec\x2f\x54\x3d\x69\x89\xb4\x66\xbc\x78\x44\xd5\x08\x6e\xf7\xb4\x80\xad\x64\x1a\x25\x30\x11\x7d\xb3\xab\x70\xe0\xd9\x21\xdd\x69\x8a\x4a\x1d\x59\x4d\x0f\xa5\x1b\x29\x0d\x05\xcf\xef\x66\x01\x83\x54\xda\x85\x6d\xd2\x8b\x51\x66\x07\x96\x1e\xa5\xc8\x0d\xa4\x7b\xdc\x42\x2a\x91\x6a\x54\x40\x81\xe3\xf6\x3c\xfd\x0c\xe5\x1c\x05\x23\x92\xb7\x3c\x35\x76\x53\x2d\x29\x57\x76\x98\xf8\x26\x8f\x6e\x2d\x64\xb3\x97\x2f\x20\x17\xb2\xa6\x5a\xf9\xb6\x8e\x1e\xb1\x60\x4a\xcb\xdd\x02\x68\xab\xcb\x15\xcf\xc5\xc8\xf4\xc6\x8b\x5d\x0a\x67\x30\x77\x62\xe8\x08\x80\x44\xdd\x4a\x0e\xd7\x4e\x64\x24\x00\x61\x0b\xc9\x61\xb9\xb0\x1a\x1f\x39\xd9\x2f\x9c\x74\x1f\x36\x09\x2b\x23\x77\xc9\x98\x93\x7d\xb0\x33\xdd\x31\xfc\xfa\x7f\xf9\x9f\x0b\x79\xb1\x4a\x87\x52\xcf\x63\x37\x2d\xfc\xa1\x94\x96\x6d\xea\x12\xf9\x61\xdd\x08\x5c\x2a\x1c\x81\x9f\xab\x1c\x71\x09\xf9\x35\x96\xc6\x25\xb1\xcd\x33\xa5\x7b\x62\xcf\x7e\x0d\xa9\x93\x21\x65\x39\x6a\xae\xdf\x0a\x79\xa1\x4b\x73\x2f\x57\xc8\xcf\x06\x77\xc0\xf3\x0e\x25\xaa\xb6\xd2\x5d\x67\xaa\xd3\xf7\xff\x06\xf7\x0b\x40\x29\x8d\x53\x1a\x85\x46\x88\x9e\xda\xe7\x9a\xe9\xe9\xf5\x90\xd3\x81\xb7\x6e\xd8\xac\xee\x92\xf1\x5b\x20\x9c\xd7\x02\xbe\xa2\x2e\x45\x76\x0a\x72\xf2\x00\x5b\x53\x5d\xae\xa9\xd6\x28\xf9\x29\xd6\x28\x0f\x48\x29\xb2\x36\x45\xf5\x15\x33\x46\x37\xbb\x06\xd5\xd0\xe0\xf7\x57\x63\x71\x02\x0a\xf6\xb7\x82\xab\xb6\xfe\xc0\xfe\x14\x14\xec\x9f\xd2\x12\xeb\xb3\x46\x5e\x73\x74\x26\x43\xbf\xc4\x73\xd4\xc9\x1e\x91\x66\x28\x13\xb8\x3e\x4b\x11\xa7\xed\xc2\x9c\xa6\x91\x5f\xfe\x1c\x87\x13\xff\x1f\xea\xea\x37\xe2\xad\xcd\x38\x12\x92\xfd\x40\x77\xd9\x19\xcd\xcd\x61\xf6\x47\xc7\xd3\x3f\xbc\xe2\xf6\x40\xdf\x70\x09\xa4\xfa\xcd\xe7\xd1\xd2\x21\x01\x7f\xbc\xe8\xcb\x66\xb3\x76\x32\x7b\x7d\xcc\x08\x98\xa0\x86\x57\xbf\x7d\x02\xce\x2a\x70\x84\xf1\x37\xd6\x45\x8a\xda\xbc\x64\x4f\xad\x94\xa2\xe5\x19\x4c\x38\xab\x26\xfe\xf7\xcf\x40\xff\x41\x33\xa1\x94\xf6\xbe\x7a\x87\xf7\x4e\x81\xdf\x83\x83\xbf\x6c\x33\xd8\x9d\xb8\x9e\x88\xa6\xa3\xa6\x1d\x39\xd9\x57\x68\xb6\x30\x67\x39\x0c\x38\xb5\x65\x3a\x2d\x21\xbc\x96\xf7\xde\xcc\x35\x33\x83\xee\xe8\x59\xcd\xcc\xa3\xda\x3e\xa8\xcf\x37\x2d\x40\x4a\x15\x8e\x26\xd9\xd5\xeb\x3e\x70\x62\x21\xc7\xf9\x1b\xa4\xc9\x6e\x60\x9f\xa8\x2b\x36\xc8\x94\xdf\xb0\x1b\x24\x3d\xb9\xe8\xe3\x62\xaa\x8f\x1d\xf8\x07\x7e\xe5\xe7\x89\x75\x34\xd0\x93\xf0\xa2\xea\x7b\xf2\x5f\x00\x00\x00\xff\xff\xc0\xe9\xe3\xd3\x60\x0e\x00\x00") +var _templatesContribStratoscaleClientClientGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x56\x4b\x6f\xdb\x38\x10\xbe\xf3\x57\xcc\x7a\xb3\x85\x6d\xd8\xd2\xee\x55\x8b\x1e\x82\xa4\x8b\xfa\xd0\xc6\x48\x0c\xf4\xb8\x60\xa4\x91\x44\x44\x22\x55\x72\x64\xc7\x15\xfc\xdf\x17\x7c\x58\xb6\xfc\x48\x7a\xdb\x4b\x2f\x31\x35\x4f\xce\x37\xdf\x0c\x13\xc7\x70\xa7\x32\x84\x02\x25\x6a\x4e\x98\xc1\xf3\x16\x0a\x35\x37\x1b\x5e\x14\xa8\xff\x86\xfb\x07\xf8\xfa\xb0\x82\x4f\xf7\x8b\x55\xc4\x18\xeb\x3a\x10\x39\x44\x77\xaa\xd9\x6a\x51\x94\x04\xf3\xdd\x2e\x8e\xa1\xeb\x20\x55\x75\x8d\x92\x4e\x74\x5d\x07\x28\x33\xd8\xed\x18\x63\x0d\x4f\x5f\x78\x81\xd6\x38\xfa\xca\x6b\x74\xd2\x38\x86\x55\x29\x0c\xe4\xa2\x42\xd8\x70\x33\xbc\x09\x95\x08\xe1\x2a\x40\x4a\x55\x91\xb5\xff\x94\x09\x12\xb2\x00\xea\xfd\x6a\x97\xae\xd1\x6a\x8d\x90\xb7\xe4\x42\x95\x28\x61\xab\x5a\xd0\x38\xd7\xad\x1c\x44\xda\xa7\x70\x77\xe6\x32\x63\x4c\xd4\x8d\xd2\x04\x63\x06\x30\x92\x48\x71\x49\xd4\x8c\xec\x47\x21\xa8\x6c\x9f\xa3\x54\xd5\x71\xa1\xe6\xaa\x41\xc9\x1b\x11\xa3\xd6\x4a\x9b\x37\x0c\x6c\xa6\x37\xd4\xba\x95\x24\x6a\x7c\xc3\x62\xcd\x2b\x91\x71\xc2\x11\x63\x00\x86\x74\x5e\xd3\xd5\x5c\x4e\xeb\x0c\x6d\x77\x5c\x25\x06\xa2\x7b\xcc\x79\x5b\xd1\x22\x7c\xef\x76\x27\xfa\x23\xc5\xc4\xb6\xa1\x50\x49\x8f\x4b\xad\xd2\x17\xd4\x5b\x98\x4b\xdb\xa6\xdb\xe5\x02\xe6\x42\x36\x2f\x85\x6b\x97\xfd\x14\xc6\x01\x2a\x24\xa1\xce\x79\x8a\xa0\x72\x27\xe8\x3a\x28\xdb\x9a\x4b\xf1\x03\xfb\x1e\x43\x5a\x09\x94\xc4\x68\xdb\xf8\x58\x07\xaf\xce\xf2\x49\x73\x59\x20\x44\x0f\x8d\xcd\x2d\x94\x34\x96\x37\x2c\x9e\x5a\x5d\xc3\x4d\xca\xab\x41\xb4\xc0\xc0\xa7\xb6\xae\xb9\xde\x82\xa3\x58\x53\xb5\xda\x99\xfd\x23\xb4\xa1\x6f\x4a\x67\x30\x3e\xdc\x23\x98\x4e\xbc\xad\x75\xbe\x47\x93\x6a\xd1\xd8\x6c\x8e\x84\x5d\x07\xcf\x95\x4a\x5f\x7a\x0e\x0f\x0d\x7a\x12\xdb\x43\x65\xf0\x34\x86\x53\xbc\x17\xc0\xfa\xb9\xd3\x39\x40\xb7\xcb\x45\x48\x61\x2b\x9f\xc6\xbe\x53\xe7\xb5\x8f\x53\x7a\x85\x54\x49\xc2\x57\x8a\xee\xfc\xef\x0c\x1a\xae\x79\x6d\x60\x7a\xd1\x65\xe9\x94\xa1\xec\xcf\xdc\x3c\x91\x46\x5e\x0b\x59\x3c\xa2\x69\x94\x74\x77\x9a\xc1\x46\x0b\x42\x0d\x42\x45\xdf\xdc\xa9\x2f\x78\x72\x80\x3b\x4d\xd1\x98\x23\xaf\xf1\xa1\x75\x27\x4a\xcb\xa9\xcb\xb7\x99\xc1\x00\x4a\x77\x70\xb3\x74\x35\xcb\xe4\xb0\x40\x8e\x20\xf2\x7b\xe3\x2b\x6e\x20\xd5\xc8\x09\x0d\x70\x90\xb8\xb9\x4c\x3f\x4b\x39\x4f\xc1\x88\xe5\xad\x4c\xad\xdf\x98\x34\x97\xc6\xcd\x7c\x98\xc5\xe8\xce\x99\xac\xf6\xf2\x19\xe4\x4a\xd7\x9c\x4c\x98\xbe\xe8\x11\x0b\x61\x48\x6f\x67\xc0\x5b\x2a\x17\x32\x57\x27\xae\xb7\x41\xec\x21\x9c\xc0\xd4\x8b\xa1\x63\x00\x1a\xa9\xd5\x12\x3e\x78\x91\x95\x00\xf4\x57\x48\x0e\xc7\x99\xd3\x84\xcc\xc9\xfe\xe0\xa5\xfb\xb4\x49\x7f\xb2\x72\x0f\xc6\x94\xed\x93\x5d\x98\x8e\xe1\xd7\xff\xcb\xff\x5c\xe9\xab\x5d\x3a\xb4\x7a\x1a\xfb\x6d\x11\x8a\x32\xa4\xdb\xd4\x03\xf9\x6e\xdf\x18\x5c\x6b\x1c\x83\x9f\xeb\x1c\xf3\x80\xfc\x5a\x4b\xa7\x2d\x71\xc3\x33\xe6\x7b\x62\x4f\x7e\x2d\xa9\xb3\x25\xe5\x38\xda\x75\x70\x53\xa1\x2c\xa8\x84\xe4\x23\x54\x28\x2f\x26\x0f\xcf\xf1\xc5\x80\x1a\x4d\x5b\x51\xd7\xd9\xee\xec\x76\xff\xf6\xe1\x67\x80\x5a\xdb\xa0\x3c\xea\x07\x21\x7a\x6a\x9f\x6b\x41\xe3\x0f\x43\x4e\xf7\xbc\xf5\xcb\x66\x71\x9f\xb8\x76\x69\x21\x29\x87\xd1\x1f\xdf\x47\x87\x7a\x9d\xc1\x17\xa4\x52\x65\xe7\x46\x5e\xde\x9b\x2d\x39\x95\x4b\x4e\x84\x5a\x9e\xdb\x5a\xe5\xc1\x52\xab\xac\x4d\xd1\x7c\xc1\x4c\xf0\xd5\xb6\x41\x33\x74\xf8\x7d\x6d\x3d\xce\x8c\x7a\xff\x3b\x25\x4d\x5b\xbf\xe3\x7f\x6e\xd4\xfb\x3f\xa5\x25\xd6\x17\x9d\x82\xe6\xa8\x26\x4b\xbf\x24\x70\xd4\xcb\x1e\x91\x67\xa8\x13\xf8\x70\x91\x22\x5e\xdb\xf5\x7b\x9a\x47\xe1\xf8\x73\x1c\x4e\xc2\x6f\xdf\xd7\x70\x91\xe0\x6d\xd7\x91\xd2\xe2\x07\xfa\xc7\xce\x6a\x6e\x0f\xbb\x3f\x3a\xde\xfe\x00\x47\xaf\x62\x40\xcd\x0e\x5c\x02\x29\xbd\x06\x1c\x1d\x1d\x12\x08\xe5\x45\x9f\x57\xab\xa5\x97\xb9\xe7\x63\xc2\xc0\x26\xb5\xbc\xfa\xed\x23\x48\x51\x81\x27\x4c\x78\xb1\xae\x52\xd4\xe1\x92\x3d\xb5\x5a\xab\x56\x66\x30\x92\xa2\x1a\x85\xbf\x7f\xf6\xf4\x1f\x0c\x13\x6a\xed\xde\xab\x37\x78\xef\x15\xf8\xbd\x0f\xf0\x97\x1b\x06\x77\x13\x3f\x13\xd1\xf8\x64\x68\x4f\x82\xec\x3b\x34\x99\xd9\x5a\x0e\x0b\xce\x6c\x04\xa5\x25\xac\x79\xd5\xa2\x1d\xa0\x7d\x34\xfb\xcc\x4c\xa0\x83\x7e\x4f\xdc\x88\x19\xdc\xac\xad\xc9\x95\xa1\x05\x48\xb9\xc1\x93\x4d\x76\xb3\xde\x27\x4e\x9c\xc9\x31\x7e\x03\x98\xdc\x05\xf6\x40\xdd\x88\x01\x52\xe1\xc2\x7e\x91\xec\xd8\xd5\x18\x57\xa1\x3e\x0e\xe0\x61\x0e\xd5\x87\x40\x03\x3d\xeb\xff\xa3\xda\xed\xd8\x7f\x01\x00\x00\xff\xff\x4b\xc5\xc6\xd2\x07\x0e\x00\x00") func templatesContribStratoscaleClientClientGotmplBytes() ([]byte, error) { return bindataRead( @@ -215,12 +202,12 @@ func templatesContribStratoscaleClientClientGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/contrib/stratoscale/client/client.gotmpl", size: 3680, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x21, 0x84, 0xe6, 0x79, 0x4a, 0xea, 0x52, 0x84, 0xf0, 0x99, 0x30, 0x82, 0x3, 0x3, 0xd7, 0xea, 0x3a, 0xd6, 0x55, 0xcf, 0x42, 0x8c, 0x4b, 0xb1, 0xee, 0xea, 0x55, 0x8f, 0x76, 0xd1, 0x34, 0x43}} + info := bindataFileInfo{name: "templates/contrib/stratoscale/client/client.gotmpl", size: 3591, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x92, 0xdd, 0xbb, 0x78, 0xa6, 0x46, 0x6b, 0xee, 0x13, 0xc1, 0xe6, 0x6b, 0xd3, 0xf0, 0xc7, 0xe1, 0xec, 0xb1, 0x4d, 0xd8, 0xae, 0x14, 0xae, 0xd7, 0x2f, 0xd7, 0xf3, 0x11, 0x59, 0x36, 0x13, 0xfe}} return a, nil } -var _templatesContribStratoscaleClientFacadeGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x55\x4d\x6f\xe3\x36\x10\x3d\x93\xbf\x62\xea\x6e\x01\x7b\xe1\x48\xf7\x2d\x7c\x68\x93\x45\x37\xc0\x36\x09\x52\x2f\x7a\x28\x7a\x60\xe4\x91\x44\x44\x22\x55\x72\x68\xc3\x15\xf4\xdf\x8b\xa1\x24\xcb\xf2\x3a\xdb\xa2\x37\x6b\x3e\xde\x3c\xce\xbc\x19\xa7\x29\xdc\xda\x1d\x42\x81\x06\x9d\x22\xdc\xc1\xcb\x11\x0a\x7b\xe3\x0f\xaa\x28\xd0\xfd\x08\x77\x8f\xf0\xf0\xb8\x85\x8f\x77\xf7\xdb\x44\x4a\xd9\xb6\xa0\x73\x48\x6e\x6d\x73\x74\xba\x28\x09\x6e\xba\x2e\x4d\xa1\x6d\x21\xb3\x75\x8d\x86\x2e\x7c\x6d\x0b\x68\x76\xd0\x75\x52\xca\x46\x65\xaf\xaa\x40\x0e\x4e\x9e\x86\xdf\xec\x48\x53\xd8\x96\xda\x43\xae\x2b\x84\x83\xf2\x73\x32\x54\x22\x0c\x6c\x80\xac\xad\x12\x8e\xff\xb8\xd3\xa4\x4d\x01\x74\xca\xab\x63\xc5\xc6\xd9\x3d\x42\x1e\x28\x42\x95\x68\xe0\x68\x03\x38\xbc\x71\xc1\xcc\x90\xc6\x12\x91\xb6\x32\x3b\x29\xa5\xae\x1b\xeb\x08\x96\x52\x2c\x0c\x52\x1a\x5c\xb5\x18\x7e\x96\x44\xcd\x42\x4a\xe1\x28\xab\x34\xbf\x71\x51\x68\x2a\xc3\x4b\x92\xd9\x3a\x2d\xec\x8d\x6d\xd0\xa8\x46\xa7\x2e\x18\xd2\x35\xa6\x7d\x14\x67\x5f\x8f\x63\x12\xdf\xf0\x36\x98\xbd\xed\x45\xe7\xac\xf3\x6f\xfb\x07\x0e\xdf\x80\x27\x97\xd7\xc4\xcf\x69\x5b\x70\xca\x14\x08\xc9\x1d\xe6\x2a\x54\x74\x1f\x3b\xe0\x79\x6e\xd1\xdb\x38\x6d\x28\x87\xc5\x0f\x7f\x2d\x20\x19\x6c\x3c\xcd\xd1\xdf\x67\xbf\x7b\xc5\xe3\x1a\xde\xed\x55\x15\x10\x3e\x6c\x20\xb9\x84\xe1\x00\xe8\x3a\xb8\x40\x1c\x32\x2e\x70\x57\x52\x66\xd6\xf8\x38\x87\x34\x85\x81\xd9\x27\xeb\x09\xb4\x8f\x23\xdc\xf5\x26\x60\x5b\x8c\xc9\x6d\x30\x3b\xd0\x06\x7e\x45\x52\xb0\xd4\x26\xb7\x2b\xf0\x98\x91\xb6\x06\x6c\x0e\xdc\xd0\x28\x12\x29\xce\xe1\x3c\x39\x96\xd0\x66\xc6\xeb\xfb\xfd\x02\x92\xe8\x66\x5e\x13\x81\x9f\x95\xc7\x27\x45\xe5\x25\x89\xd1\xfe\x3f\x89\x9c\x60\xdf\x26\x73\x0a\xe9\x9b\x33\x51\xfa\x2d\x2b\xb1\x46\x0f\xca\xe1\x8c\x92\x1f\xec\xff\x9d\xcd\x5e\xb9\x4b\xd0\x2b\x44\x46\x17\xaf\x2c\x1d\x1b\x84\x5b\x6b\x72\x5d\x30\xf5\x90\x11\xb4\xb1\x05\x5f\x9e\x3f\x8f\x2d\x7a\x51\x1e\xe3\xb7\xcd\xe3\x77\x68\x3c\x39\x54\x35\x78\x74\x7b\x74\x52\xb0\xef\x7d\x70\x55\xf2\xe5\xf9\x73\x4c\xde\x3a\x65\x7c\x5c\x42\xed\x41\x19\xd0\xc6\xf0\xd2\x9f\xac\xb9\x75\x11\xa9\xdf\x2f\x29\xa6\x78\xde\xd0\xe4\x99\x1f\xbc\x75\xba\x69\x18\x3d\x4d\xe1\xa7\x40\xe5\xbd\xc9\x2d\xc3\x71\xae\x0a\x54\xa2\x21\x9d\x29\xee\x81\x14\x27\x3f\x0c\x5b\x93\xdc\x46\xe4\xd1\xfe\xbb\xd3\x84\x4e\xf6\x27\xea\x01\x0f\x90\x39\x54\xc4\x2d\x07\x83\x07\xee\x50\x19\x6a\x65\xf4\xdf\x08\xc9\x83\xaa\x59\xcb\xf0\x69\xbb\x7d\x1a\x08\x26\x32\x0f\x26\xe3\xc4\x65\x36\x34\x6b\x05\xef\xb9\xaf\xca\x67\xaa\x9a\xa5\xb5\x52\xf0\x14\x96\x52\x88\x92\xd5\xb7\x39\x57\xbe\x14\xe2\x65\x54\xc1\xe6\x52\x91\x52\x08\x7f\x1a\xda\x7c\x8a\x52\xac\xa4\x14\x3a\x87\x8c\x5b\x0c\xdf\x6d\xc0\xe8\x8a\x4b\x8d\x35\xa2\x3d\xf9\xba\x44\x6f\xff\x0a\xfd\x8f\x3f\x7b\x99\xb6\xbd\xbf\xaf\xd2\x49\xd1\x49\x29\xa6\x29\x7d\xd8\xc0\x78\x28\x13\x7e\x3b\xd7\x5a\xc3\x88\xbe\x1e\xf5\xb9\x1a\x98\x4d\x43\x3c\xe3\x77\x42\x3b\x73\x6f\xce\x83\xfb\xa2\x59\xa5\xb9\x9c\xc1\xc3\xf2\x6a\x5b\x57\x31\x64\x86\x41\x13\xc2\x74\xff\x1e\x1b\xfe\x33\xd0\xd6\xfc\xe2\x6c\x68\x86\xcb\xc5\x99\xd7\x87\x15\x97\x63\xfc\x8a\x6f\x3c\xa1\xae\xa1\xbf\xaf\xe3\x49\x5d\x43\x96\x8c\x72\x5a\xcd\x0e\x9d\x14\x0e\x29\x38\xc3\x62\x19\x24\x76\xbd\x1a\xef\xc2\xa0\xa8\xa8\xe2\x6b\xb2\xeb\x17\xf2\x7a\xfe\xb4\x9f\xff\xf2\xe0\xeb\xe9\x2c\x58\x6f\xd4\xeb\xb9\x71\xd8\x93\xf9\x1f\xc2\xd4\xe5\xf9\x36\x4d\x33\xeb\xe4\x3f\x01\x00\x00\xff\xff\xec\x10\x19\xe5\x6f\x08\x00\x00") +var _templatesContribStratoscaleClientFacadeGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x55\xcd\x6e\xe3\x36\x10\x3e\x73\x9e\x62\xea\xa2\x40\x1c\x24\xd2\xbd\x85\x0f\x5b\x67\xd1\x0d\xb0\x4d\x82\xd4\x8b\x1e\x8a\x1e\x18\x79\x24\x11\x95\x48\x81\x1c\xc5\x48\x05\xbd\x7b\x31\x94\x64\xcb\x5e\x65\x5b\xf4\x26\xcd\xcf\x37\xdf\xfc\x32\x4d\x71\xeb\xf6\x84\x05\x59\xf2\x9a\x69\x8f\x2f\x6f\x58\xb8\xdb\x70\xd0\x45\x41\xfe\x27\xbc\x7b\xc4\x87\xc7\x1d\x7e\xbc\xbb\xdf\x25\x00\xd0\x75\x68\x72\x4c\xb6\xae\x79\xf3\xa6\x28\x19\x6f\xfb\x3e\x4d\xb1\xeb\x30\x73\x75\x4d\x96\x2f\x74\x5d\x87\x64\xf7\xd8\xf7\x00\xd0\xe8\xec\x2f\x5d\x90\x18\x27\x4f\xe3\xb7\x28\xd2\x14\x77\xa5\x09\x98\x9b\x8a\xf0\xa0\xc3\x39\x19\x2e\x09\x47\x36\xc8\xce\x55\x89\xd8\x7f\xdc\x1b\x36\xb6\x40\x3e\xfa\xd5\x31\x62\xe3\xdd\x2b\x61\xde\x72\x84\x2a\xc9\xe2\x9b\x6b\xd1\xd3\xad\x6f\xed\x19\xd2\x14\x22\xd2\xd6\x76\x0f\x00\xa6\x6e\x9c\x67\xbc\x02\xb5\xb2\xc4\x69\xeb\xab\xd5\xf8\x59\x32\x37\x2b\x00\xe5\x39\xab\x8c\xe4\xb8\x2a\x0c\x97\xed\x4b\x92\xb9\x3a\x2d\xdc\xad\x6b\xc8\xea\xc6\xa4\xbe\xb5\x6c\x6a\x4a\x07\x2b\xf1\x5e\xb6\x13\x12\xdf\xd0\x36\x94\xbd\xaf\x25\xef\x9d\x0f\xef\xeb\x47\x0e\xdf\x80\x67\x9f\xd7\xbc\x02\x40\x69\xc4\x90\x74\xc0\xe4\x8e\x72\xdd\x56\x7c\x3f\xfe\xf7\xfd\x85\x7e\xa6\x58\x03\x64\xce\x86\x58\xaa\x34\xc5\xd1\xf3\x93\x0b\x8c\x26\xc4\x2a\xef\x07\x11\x8a\x2c\xda\xe4\xae\xb5\x7b\x34\x16\x7f\x25\xd6\x78\x65\x6c\xee\xd6\x18\x28\x63\xe3\x2c\xba\x1c\x25\xe7\xd8\x47\x50\x73\xb8\xc0\x5e\xba\xbc\x11\x26\x8d\x37\x96\x73\x5c\xfd\xf0\xfd\xeb\x0a\x93\xa8\xee\xfb\x39\x81\x9f\x75\xa0\x27\xcd\xe5\x25\x89\x49\xfe\x3f\x89\x1c\x61\xdf\x27\x73\x34\x19\x8a\x73\xa2\xf4\x5b\x56\x52\x4d\x01\xb5\xa7\x33\x4a\x61\x94\xff\x77\x36\xaf\xda\x5f\x82\x2e\x10\x99\x54\xb2\x55\xfc\xd6\x10\x6e\x9d\xcd\x4d\x21\xd4\xdb\x8c\xb1\x8b\x25\xf8\xf2\xfc\x79\x2a\xd1\x8b\x0e\x14\xff\x5d\x1e\xff\xdb\x26\xb0\x27\x5d\x63\x20\xff\x4a\x1e\x94\xe8\xae\x5b\x5f\x25\x5f\x9e\x3f\x47\xe7\x9d\xd7\x36\xc4\x3d\x31\x01\xb5\x45\x63\xad\xec\xe5\x51\x9a\x3b\x1f\x91\x86\x15\x00\x75\xb2\x97\x25\x4a\x9e\x25\xe1\x9d\x37\x4d\x23\xe8\x69\x8a\x1f\x5a\x2e\xef\x6d\xee\x04\x4e\x7c\x75\xcb\x25\x59\x36\x99\x96\x1a\x80\x3a\xea\x71\x1c\xec\x64\x1b\x91\x27\xf9\xef\xde\x30\x79\x18\xae\xc8\x03\x1d\x30\xf3\xa4\x59\x4a\x8e\x96\x0e\x52\xa1\xb2\xad\xb5\x35\x7f\x13\x26\x0f\xba\x96\x83\x83\x9f\x76\xbb\xa7\x91\x60\x02\x79\x6b\x33\x71\xbc\xca\xc6\x62\xad\xf1\x5a\xea\xaa\x43\xa6\xab\x33\xb7\x0e\x94\x74\xe1\x0a\x94\x2a\x65\xfa\x36\xf3\xc9\x07\xa5\x5e\xa6\x29\xd8\x5c\x4e\x24\x28\x15\x8e\x4d\x3b\xef\x22\xa8\x35\x80\x32\x39\x66\x52\x62\xfc\x6e\x83\xd6\x54\x12\x6a\x8a\x11\xe5\xc9\xd7\x21\x06\xf9\x57\xe8\x7f\xfc\x39\x8c\x69\x37\xe8\x87\x28\x3d\xa8\x1e\x40\x9d\xba\xf4\xe3\x06\xa7\x5b\x96\x48\xee\x12\xeb\x06\x27\xf4\x9b\x69\x3e\xd7\x23\xb3\x53\x13\x67\xfc\x8e\x68\x33\xf5\x66\x6e\x3c\x04\xcd\x2a\x23\xe1\x2c\x1d\xae\x16\xcb\xba\x8e\x26\x67\x18\x7c\x42\xe8\x3a\xf4\xda\x16\x84\xc9\x63\x23\xf7\xda\x38\xfb\x8b\x77\x6d\x13\xe4\x6d\x01\x85\xd2\xc6\x64\xb9\x5d\x9b\xf9\x3b\xf3\xa1\x32\x5a\xd6\x22\x66\x7b\xc4\xbf\xc1\xe1\x18\x4e\xc7\xef\x06\xb3\x64\x1a\xac\x75\x0c\x2e\x6f\x97\x44\x02\xe5\x89\x5b\x6f\x25\xde\x38\x6c\xcb\x51\x65\x2b\xc6\xd9\x8a\xf3\xbc\x34\x80\xc3\x6a\x2e\xfb\x9f\x36\xf5\x5f\x53\x5f\x06\xb8\x5e\xca\x7a\x3b\x6e\xe3\x2c\xa3\xd9\x66\x9e\x6f\xd6\xa9\x7f\x3d\xfc\x13\x00\x00\xff\xff\x07\x37\x02\xd3\x1e\x08\x00\x00") func templatesContribStratoscaleClientFacadeGotmplBytes() ([]byte, error) { return bindataRead( @@ -235,12 +222,12 @@ func templatesContribStratoscaleClientFacadeGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/contrib/stratoscale/client/facade.gotmpl", size: 2159, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6a, 0x65, 0x26, 0xb9, 0x2f, 0x21, 0x1, 0x23, 0x14, 0xda, 0x91, 0xf9, 0x12, 0x59, 0x62, 0xb, 0x98, 0x78, 0x1e, 0x96, 0xb5, 0xb2, 0xa4, 0x73, 0x92, 0x8b, 0xde, 0x1, 0x3, 0x1, 0x98, 0x3}} + info := bindataFileInfo{name: "templates/contrib/stratoscale/client/facade.gotmpl", size: 2078, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf, 0x91, 0xc8, 0x69, 0xd7, 0xd3, 0xe2, 0xa8, 0x1b, 0xf8, 0x88, 0xe5, 0x52, 0xee, 0xbe, 0x71, 0x57, 0xb, 0xca, 0xb9, 0x7c, 0x23, 0x6e, 0x30, 0x5a, 0x9b, 0x63, 0xee, 0x66, 0xf9, 0xd, 0x1b}} return a, nil } -var _templatesContribStratoscaleServerConfigureapiGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x58\x41\x6f\xeb\xb8\x11\x3e\x5b\xbf\x62\x2a\xbc\x05\xa4\xc0\x91\x81\x1e\x5f\xe1\x83\xfb\xb2\xdb\x75\xb7\x9b\x18\x49\xd0\x3d\x14\x45\xc1\x50\x63\x99\x8d\x4c\x2a\x24\x95\xc4\xcf\xd0\x7f\x2f\x86\xa4\x2c\xda\xb1\x37\x0e\xd2\x02\xcd\x21\x96\xc4\xe1\xf0\x9b\x6f\x86\x33\x43\x4e\x26\xf0\x4d\x95\x08\x15\x4a\xd4\xcc\x62\x09\x0f\x1b\xa8\xd4\xa5\x79\x61\x55\x85\xfa\x4f\x70\x75\x03\xd7\x37\xf7\xf0\xe3\xd5\xfc\xbe\x48\x92\x64\xbb\x05\xb1\x84\xe2\x9b\x6a\x36\x5a\x54\x2b\x0b\x97\x5d\x37\x99\xc0\x76\x0b\x5c\xad\xd7\x28\xed\xc1\xd8\x76\x0b\x28\x4b\xe8\xba\x24\x49\x1a\xc6\x1f\x59\x85\x24\x5c\xcc\x16\xf3\x45\x78\xa5\x31\xb1\x6e\x94\xb6\x90\x25\xa3\x94\x2b\x69\xf1\xd5\xa6\xf4\xa8\x37\x8d\x55\x13\x5b\x1b\x7a\x93\x68\x27\x2b\x6b\x1b\x7a\xae\x55\x45\x3f\xcb\xb5\x4d\x93\x64\x94\x56\xc2\xae\xda\x87\x82\xab\xf5\xa4\x52\x97\xaa\x41\xc9\x1a\x31\x41\xad\x95\x76\x53\x8f\x8f\xd7\x8a\x95\xbf\x33\xac\x5b\x69\xc5\x1a\xdf\x15\x98\xac\x45\x59\xd6\xf8\xc2\xf4\x19\xb2\x06\x79\xab\x85\xdd\x10\xec\xed\x56\x33\x59\x21\x14\x57\xb8\x64\x6d\x6d\xe7\x8e\x04\x43\xa4\x35\x5a\x48\xbb\x84\xf4\x87\xa7\x14\x8a\xae\x23\x59\x94\xa5\x7f\xf0\x93\xbe\x3c\xe2\x66\x0c\x5f\x9e\x59\xdd\x22\x7c\x9d\x42\x11\xcd\xa6\xb1\xae\x23\x9e\x63\x3d\x5e\x36\x56\x96\x93\x3b\xbf\xf4\x6e\x21\x25\xb1\x4f\xec\xa6\x41\x08\xde\xf8\x05\x37\x60\xac\x16\xb2\x4a\x12\xae\xa4\xb1\x30\x6b\xed\x8a\xbe\x46\x02\x53\x48\xe9\x6b\xea\xa2\x24\x98\x76\xd3\x50\x58\x09\x25\xff\xa2\x55\xdb\x18\x0a\x89\x64\x32\xa9\xd4\xd7\x3e\xe0\x60\xad\xf8\x23\xea\x0d\x5c\x4a\xb6\x76\xb1\xd1\x30\xc3\x59\x2d\xbe\x23\x14\xd7\x6c\x8d\x5d\x37\x5b\xcc\xe1\x52\xc8\xe6\xb1\x4a\x12\x1f\x6b\x07\x22\xe0\x65\x28\xae\xae\xd0\x70\x2d\x1a\x5a\x91\x8c\x70\x36\x9c\x9c\x20\xa4\x45\xbd\x64\x1c\x61\x7b\x0c\xb2\x47\x3b\x0a\x21\x1f\x6b\x76\xdf\x4f\x41\x01\x61\x8e\x41\x19\x85\xad\xd0\xeb\x7c\x3b\x31\xe3\xf6\xb5\xe7\xb3\xf8\xe6\x7f\xc7\xd0\x30\xcd\xd6\xa4\xb1\x77\x4e\xd7\x15\x47\xa7\x2f\x9c\x60\x0e\x43\x38\x16\xb7\x68\x1a\x25\x4b\xd4\x49\xb4\x78\x97\x44\x9b\xd2\xed\x7f\xb9\x14\x15\xa1\xe6\xee\xa9\xf5\xd6\xc3\x52\x69\xf8\x99\xc9\xb2\x46\xed\x79\x0c\x82\xc6\xea\x96\x5b\xd8\x3a\x2b\x7e\xc7\xcd\xc7\x8d\x9c\x2d\xe6\xfb\x54\xfc\x4d\x51\xa2\x81\x65\x2b\x79\xe6\x43\x6c\x0c\x45\x51\xec\x7c\xb3\xed\x72\xc7\xf5\x5c\x4a\xd4\xbf\xee\x6c\x23\xbc\x84\xd0\xae\x10\x56\x1e\x25\xe0\x2b\xf2\xd6\x2a\x6d\x0a\xb8\x5f\xa1\x41\x28\x15\x48\x65\x81\x35\x4d\xbd\x01\xab\x9c\x70\xc8\x6c\xc5\xbf\x8d\x92\x50\x2a\xde\x52\xd6\x2a\xdc\x12\xf7\x2b\x8c\xd8\x0b\xea\xd0\x00\x5b\x5a\xd4\xa0\x55\x6b\x85\xac\xe0\xa1\xb5\xf0\x80\x4b\xa5\x11\x58\x6b\x57\x28\xad\xe0\xce\xf6\x31\x3c\x08\x59\x92\x08\x93\x25\x3c\xb3\x5a\x94\xee\x7b\x32\x3a\xc4\xee\x8c\xa5\x5c\x56\x04\x82\x73\x88\xdf\x12\x87\x86\xf6\x92\xd2\xe2\x3b\x6a\xb2\xb5\x35\x58\x92\x09\xac\xff\x0a\x0c\x34\x3e\xb5\x68\x6c\xc0\x47\xc6\xd1\x1c\xa7\xdd\x79\xf0\x85\x19\xe0\xac\xae\xb1\x84\xd6\x10\x2e\x12\x71\x7b\xf4\x22\xdd\x49\x19\xb7\x18\x21\xa6\x51\x4a\x18\x5c\x34\xac\x76\x93\x8d\x55\x1a\x4b\x10\xd2\x8d\x85\xd0\xec\x5f\xd3\x90\x02\xd2\xdd\x80\x4b\x30\x45\x32\x8a\x90\x3b\x4b\x2f\x9c\x71\xb7\x1e\x6d\x0e\x2e\x2f\x27\x71\xf8\xdc\x85\xac\x78\x85\x4b\x21\xc5\xdb\xbd\x37\x37\x7f\x66\x46\x70\x67\x5d\xbf\xf7\xe8\x65\x3f\xc2\xe6\x57\xb4\xfb\x28\x28\x1e\x48\xfa\xc0\x3b\x1e\xd6\xd1\x19\x84\xb1\x35\xa8\xa1\x8f\xbf\x86\x19\x13\x5e\x72\xc8\xa2\x50\x1c\x7b\xf0\xf9\x9b\xdd\xec\x51\xce\x16\xf3\x5f\x70\x73\x16\xcc\x59\xd3\xd4\x02\x0d\xbc\xac\x30\xd0\x49\x39\x23\x6c\x92\xd4\x25\x90\x3b\xd5\x6a\xde\x67\x14\x83\xf6\x1d\x0b\xac\x7a\x44\x79\x1e\xea\x3d\xd0\x37\xa4\xf5\x8f\xef\x02\xfe\x49\x69\x08\xa2\x1f\x22\x36\x86\x35\x06\xc3\x55\x83\x06\xfe\xf1\xcf\x0f\xb1\x3b\xa4\x2e\x4a\x58\x61\x97\x80\x46\xdb\x6a\x69\x80\xc9\xbd\xdd\x03\x95\x78\x0e\x9c\xf6\x89\x61\x2f\xb1\x91\x8a\xb9\x85\xb5\x6a\xa5\x35\xc0\xea\xda\x89\x3e\xd0\x0e\x41\x63\xa0\x56\x95\xe0\x20\xd6\x4d\x8d\x94\x19\x50\x9b\x3e\xe0\x7d\x53\x13\xd2\x40\x91\x90\x75\x3d\x96\x8c\x87\xec\x98\xc3\xde\xbe\xee\x2d\xa2\x6c\xb9\x1a\xc3\xbf\xdc\x3b\x55\xda\x30\x3e\x5b\xcc\x33\x9e\x27\x23\x6f\x0a\xac\xdc\xf8\xbe\x99\x54\xa8\x3e\x61\x69\xbf\xb1\xb9\xd2\xda\x57\x03\x4a\x04\x17\x27\x2a\x97\x34\x96\x49\x8e\xc5\xff\x82\x23\x67\xeb\x29\x9a\x2e\xde\xaf\x6f\xb3\xc5\x3c\xa6\xd3\x34\xc8\x77\x74\xba\x56\xae\x98\x49\x56\x6f\xbe\x63\x99\x85\x1c\x4f\x9d\x68\x76\xe7\x9f\xff\x7a\x77\x73\x9d\x8f\x21\x4d\xf3\x64\x24\x96\x6e\xde\x1f\xa6\x20\x45\x4d\xba\x7a\xfe\xa5\xa8\xc7\xfe\xdf\x72\x6d\x8b\x1f\x69\xad\x65\x96\x32\xaf\xb6\xaf\x1c\x5f\xe1\x87\xe7\xd4\xad\x9c\x27\xa3\x2e\x19\xb1\x46\x10\x84\x3d\x03\xae\xf1\xe5\x94\x0d\x19\x01\xcf\xdd\xb4\xe2\x0e\xf5\x33\xba\x65\x60\xea\x4d\x33\xd1\x37\x2f\x13\xea\xe3\x14\x78\x78\xdc\xcb\x9c\xdf\x94\x34\xed\x1a\x0f\xd2\x65\xef\x18\x36\x74\x2b\xa4\xea\x28\xa4\xa0\x81\x56\xa0\xa4\x73\x30\xb7\xdf\x80\xb5\x71\x4d\xe1\x59\x6a\x42\xaf\xdb\x63\xd3\x3f\x51\x1a\x70\xb9\x40\x83\x50\xc5\x2d\xb2\x92\x5c\x6e\x99\xae\xd0\x42\x5c\xe8\x3d\x07\xb1\x47\x02\x29\xd7\xca\xee\x80\x61\x99\xa5\xdb\x6d\xe8\x0d\x29\xe0\xfd\xba\x2b\x66\x5c\xb1\xdf\x20\x95\x67\x94\x51\x78\x96\xe4\xf4\xee\x74\x5a\x89\xf8\x5c\x68\x55\xb6\xfc\x33\x7c\x06\x0d\x67\xf0\x79\xb6\x9e\x9e\xd0\xfe\xd3\x40\xe8\x0b\x11\xfa\x9b\x16\x96\x08\x2d\x99\x65\x9f\xa5\xb3\xe9\x57\xfd\x04\x9d\x9f\xaa\xec\x6f\xf9\x70\xb5\xc4\x09\x4c\xdf\x2d\xd5\xdb\xad\x58\x3a\xd8\x19\xe0\x13\x79\xb3\xef\x66\xd2\x88\x97\x14\xf2\xae\xbb\xd8\x95\x42\xda\xb8\xbd\x5c\xd7\x45\x29\x06\xc2\x9f\x58\x02\x2f\x4e\xd5\xb8\x69\x9f\x44\x20\xfa\x0b\x6c\xa7\xa9\xcb\x26\xbb\xa1\x6e\x70\xc4\x49\x85\xce\x3a\x6f\x96\x4f\x2f\x67\x35\x1a\x67\xb0\x76\xd0\x1e\xfc\x57\x99\x1a\x9d\x4f\xd3\xe8\x80\x23\x07\xcb\xd3\x34\x3a\x9b\x23\x37\x69\x8f\x9e\x93\x1d\xcd\x07\x99\x39\xd6\xa1\xfc\x7f\x05\x55\x44\xd8\x87\xe2\x2a\xcc\xf3\xe6\x1d\x0d\xad\xbd\xfd\x4b\x4c\x9e\xdc\xbc\x44\xea\x6c\x31\x8f\xfa\xfc\xe9\x70\x30\xd1\x99\x07\xe1\x5f\xf2\x93\xa9\xe1\xf0\x9c\xed\x3d\x45\x54\xe3\x70\x11\xd1\xdf\x4e\xb8\x4b\x91\xc1\xa4\xc5\xf0\xd5\x5d\x65\x1c\xcd\xa0\x7d\x97\x34\x3d\xe3\xf0\x1c\x64\x87\xcc\xfa\xc1\x63\xb7\x03\x3e\x98\x5d\x92\xcf\x87\xb3\x54\x14\x27\x01\xf0\xf1\x63\xba\x4b\xd5\xdc\xbe\x52\x3f\xe1\x01\x14\x3f\xdf\xdf\x2f\xc2\xc9\xa9\xbf\x13\xc8\xf2\x64\xd4\xbb\x68\x58\xd1\x93\xe8\x66\x4f\xfd\xc1\x8d\xc6\x32\x6e\x5f\x23\x24\x61\xe6\xce\xeb\x43\xd8\x1c\xa7\x77\xb6\x98\xef\x8f\xf8\x32\x11\xb4\xfa\x0b\x87\x37\xb5\x20\xea\x6d\xf4\xdd\xaa\xb5\xa5\x7a\x91\xfd\x5e\xcb\x61\xeb\xe2\x35\xac\xbb\x13\xcc\x78\x71\x70\x48\xce\xc7\x34\xea\x03\xdd\x37\xc4\x51\x57\x07\x5c\x35\x74\x7a\x8a\x0e\xf4\xe0\x0e\xf4\x56\x41\xa3\xf1\x19\xa5\xf5\xe5\x50\x33\x2a\xe6\x42\xf6\x35\xd4\x77\xa4\x71\x7f\xa8\xb4\xa8\xdc\xdc\xe2\x96\xbd\xfc\x8a\xc6\xb0\x0a\xf3\xc3\x0f\xe4\x18\x4e\x5e\x59\xb3\x47\xcc\x0e\x06\xc7\x50\xa3\x74\x7a\xf2\x3c\x19\x71\x52\xca\xc7\xe0\xde\x77\x86\xf2\x60\x03\xdb\x3b\xd4\x33\x58\x61\xdd\x84\x63\xb2\xeb\x0f\xac\x1a\x0a\xad\x6f\xa8\x43\xed\x8f\x6f\x03\xfa\x68\x2a\xfc\xbd\x0c\x3b\xeb\xb8\xed\x0c\xcf\x58\x24\x9d\x0f\x57\x0c\x99\xc6\x27\xd8\x9b\x77\x22\x7c\xa3\x9e\x42\x2c\x81\x45\x79\x3d\xea\xa1\x5d\x72\x09\x61\x3c\x44\xa2\xc6\xa7\x21\x82\xf7\x63\xb2\x8f\x06\x27\xf3\x9b\xb0\xab\x5e\x8e\xdb\xd7\x3c\x27\xea\xbc\xdb\xe2\xa8\x3e\x72\x53\x76\x1c\xf0\x81\x1c\x61\xed\x9d\x12\x46\x68\xc5\xbf\xb3\xba\x45\x1f\xd7\xe1\x5e\x63\x0f\x62\x97\xfc\x27\x00\x00\xff\xff\x2d\xa2\x23\x35\x2a\x17\x00\x00") +var _templatesContribStratoscaleServerConfigureapiGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x58\xdf\x6f\xe3\xb8\xf1\x7f\xb6\xfe\x8a\xf9\x0a\xdf\x02\x52\xe0\xc8\x40\x1f\xb7\xf0\x83\x6f\x73\xd7\x73\xaf\x97\x18\x9b\xb4\xf7\x50\x14\x05\x43\x8d\x65\x36\x32\xa9\x25\xa9\x24\x5e\x43\xff\x7b\x31\xfc\x61\xcb\xb6\xbc\x71\x90\x2b\xd0\x7d\xd8\x58\xe2\xcc\xf0\x33\x9f\x19\x0e\x47\x33\x99\xc0\x67\x55\x22\x54\x28\x51\x33\x8b\x25\x3c\x6e\xa0\x52\xd7\xe6\x85\x55\x15\xea\x3f\xc1\xcd\x1d\xdc\xde\x3d\xc0\x8f\x37\xf3\x87\x22\x49\x92\xed\x16\xc4\x12\x8a\xcf\xaa\xd9\x68\x51\xad\x2c\x5c\x77\xdd\x64\x02\xdb\x2d\x70\xb5\x5e\xa3\xb4\x47\x6b\xdb\x2d\xa0\x2c\xa1\xeb\x92\x24\x69\x18\x7f\x62\x15\x92\x70\x31\x5b\xcc\x17\xe1\x91\xd6\xc4\xba\x51\xda\x42\x96\x8c\x52\xae\xa4\xc5\x57\x9b\xd2\x4f\xbd\x69\xac\x9a\xd8\xda\xd0\x93\x44\x3b\x59\x59\xdb\xd0\xef\x5a\x55\xf4\x67\xb9\xb6\x69\x92\x8c\xd2\x4a\xd8\x55\xfb\x58\x70\xb5\x9e\x54\xea\x5a\x35\x28\x59\x23\x26\xa8\xb5\xd2\x4e\x75\x78\xbd\x56\xac\xfc\xce\xb2\x6e\xa5\x15\x6b\x7c\x53\x60\xb2\x16\x65\x59\xe3\x0b\xd3\x17\xc8\x1a\xe4\xad\x16\x76\x93\x26\x09\x10\x11\xde\x71\x03\xc5\x0d\x2e\x59\x5b\xdb\x79\x78\xee\xba\xa3\xf5\xde\x42\x4e\x51\xf8\xff\xc8\xe6\xa7\x29\x14\x7d\x2a\xed\xa6\x41\x08\x24\xfe\x82\x1b\x30\x56\x0b\x59\x25\x09\x57\xd2\x58\x98\xb5\x76\x45\x6f\x7b\x02\x53\x48\xe9\x6d\xea\x82\xab\x99\xac\x10\x8a\xbb\x86\xb2\x41\x28\xf9\x67\xad\xda\xc6\x50\x24\x93\xc9\xa4\x52\x9f\x62\x9e\xc0\x5a\xf1\x27\xd4\x1b\xb8\x96\x6c\xed\x42\xda\x30\xc3\x59\x2d\xbe\x21\x14\xb7\x6c\x8d\x5d\x37\x5b\xcc\xe1\x5a\xc8\xe6\xa9\x4a\x92\xc9\xd5\x80\x08\x78\x19\x4a\x87\x1b\x34\x5c\x8b\x86\x76\x84\xae\x83\xab\x89\x77\xe3\xac\x8e\x90\x16\xf5\x92\x71\x84\xed\x10\x6a\x0f\x78\x14\x92\xf5\xbe\x5d\xaf\x19\x41\xa5\x77\xe7\x90\x38\x18\x51\xd2\x43\x20\x7d\xac\x0d\x3a\x23\x7d\x84\x6f\x1b\x3a\xf5\x67\x14\x4e\x42\x04\x76\xaa\x98\x71\xfb\x1a\xe3\x52\x7c\xf6\x7f\xc7\xd0\x30\xcd\xd6\x06\xb6\xdb\x18\xe4\xae\x2b\x06\xd5\x17\x4e\x30\x87\x7d\x36\x16\x5f\xd0\x34\x4a\x96\xa8\x5d\x68\xe3\xee\x5d\xd2\x3b\x94\xee\xfc\xcb\xa5\xa8\x40\x18\xda\x7c\x29\xaa\xd6\x73\x08\x4b\xa5\xe1\x67\x26\xcb\x1a\xb5\x8f\x46\x10\x34\x56\xb7\xdc\xc2\xd6\xb9\xf1\x9d\x7c\x19\xf6\x72\xb6\x98\x1f\x72\xf1\x57\x45\x85\x06\x96\xad\xe4\x99\xcf\xd5\x31\x14\x45\xb1\x8b\xf0\xb6\xcb\x93\xd1\x64\x02\x73\x29\x51\xff\xba\x73\x8e\xf0\x12\x42\xbb\x42\x58\x79\x94\x80\xaf\xc8\x5b\xab\xb4\x29\xe0\x61\x85\x06\xa1\x54\x20\x95\x05\xd6\x34\xf5\x06\xac\x72\xc2\xa1\xb2\x15\xff\x36\x4a\x42\xa9\x78\x4b\x55\xab\x70\x5b\x3c\xac\xb0\x47\x5f\x30\x87\x06\xd8\xd2\xa2\x06\xad\x5a\x2b\x64\x05\x8f\xad\x85\x47\x5c\x2a\x8d\xc0\x5a\xbb\x42\x69\x05\x77\xbe\x8f\xe1\x51\xc8\x92\x44\x98\x2c\xe1\x99\xd5\xa2\x74\xef\x93\xd1\x31\x76\xe7\x2c\xd5\xb2\x22\x10\x9c\x43\xff\x29\x71\x68\xe8\x50\x2a\x2d\xbe\xa1\x26\x5f\x5b\x83\x25\xb9\xc0\xe2\x5b\x60\xa0\xf1\x6b\x8b\xc6\x06\x7c\xe4\x1c\xe9\x38\xeb\x2e\x82\x2f\xcc\x00\x67\x75\x8d\x25\xb4\x86\x70\x91\x88\x3b\xec\x57\xe9\x4e\xca\xb8\xcd\x08\x31\xad\x36\x5a\x48\x2e\x1a\x56\x3b\x65\x63\x95\xc6\x12\x84\x74\x6b\x21\x37\xe3\x63\x1a\x6a\x49\xba\x5b\x78\x66\x75\x8b\x45\x32\xea\x21\x77\x9e\x5e\x39\xe7\xbe\x78\xb4\x39\xb8\xba\x9c\xf4\xd3\xe7\x3e\x54\xc5\x1b\x5c\x0a\x29\x4e\x4f\xf0\xdc\xfc\xc0\x8c\xe0\xce\x3b\x7f\xf8\x3c\x3d\x87\x19\x36\xbf\xa1\xb3\x46\x49\xf1\x48\xd2\x47\xd1\xf1\xb0\x06\x35\x08\x63\x6b\x50\x43\xcc\xbf\x86\x19\x13\x1e\x72\xc8\x7a\xa9\x38\xf6\xe0\xf3\x93\xe3\xec\x51\xce\x16\xf3\x5f\x70\x73\x11\xcc\x59\xd3\xd4\x02\x0d\xbc\xac\x30\xd0\x49\x75\x23\x1c\x92\xd4\x57\x23\xd5\x6a\xee\x4a\x8a\x30\x60\xd0\xbe\xe1\x81\x55\x4f\x28\x2f\x43\x7d\x00\xfa\x8e\xac\xfe\xf1\x4d\xc0\x3f\x29\x0d\x41\xf4\x5d\xc4\xf6\x61\x8d\xc1\x70\xd5\xa0\x81\x7f\xfc\xf3\x5d\xec\xc6\xdf\x3b\x80\x61\x77\x3a\xff\x8a\x8e\x86\x8b\x3a\xab\x6b\xf0\x11\x38\x45\xb8\x0b\xcc\x5e\xf3\xa0\xe2\xec\xfe\x86\x4c\x2c\x1e\x08\xf6\xec\xc0\x4c\x0e\xe1\x16\x2f\x0e\x0c\xbd\x0d\xea\x07\x64\x1a\xf5\x09\xa8\x5d\x4e\x1f\x63\x8a\x18\xfe\x66\x50\x2f\x98\x31\xbf\x17\x8c\xc1\x53\xe1\xc1\x7d\x8f\x9a\x08\xe7\x9e\x62\x57\xbe\x83\x18\x7f\xbf\x84\xa2\x06\x1a\x6d\xab\xa5\x01\x26\x0f\x8a\x1d\x54\xe2\x39\x1c\x81\x58\xc7\x0f\xee\x21\x32\x31\xb7\xb0\x56\xad\xb4\xc6\xf9\x41\xa2\x8f\x54\xd0\xd0\x18\xa8\x55\x25\x38\xb5\x49\x35\x52\x21\x47\x6d\x62\x7d\xf2\x3d\x68\xa8\xda\x45\x42\x3e\x45\x2c\x19\x0f\x97\x59\x0e\x07\x65\x38\x26\x20\x5d\x6e\xab\x31\xfc\xcb\x3d\x53\x87\x15\xd6\x67\x8b\x79\xc6\xf3\x64\xe4\x5d\x81\x95\x5b\x3f\x74\x93\xba\x93\x0f\x78\x1a\xeb\x30\x57\x5a\xfb\xdb\x9b\xea\xf6\xd5\x70\xa7\x21\xa4\xb1\x4c\x72\x2c\xfe\x1b\x1c\x39\x5f\xcf\xd1\x74\xf5\x76\x3f\x32\x5b\xcc\xfb\x74\x9a\x06\xf9\x8e\x4e\xd7\x79\x17\x33\xc9\xea\xcd\x37\x2c\xb3\x70\x25\xd3\x87\x43\x76\xef\x7f\xff\xe5\xfe\xee\x36\x1f\x43\x9a\xe6\xc9\x48\x2c\x9d\xde\xff\x4d\x41\x8a\x9a\x6c\x45\xfe\xa5\xa8\xc7\xfe\xbf\xe5\xda\x16\x3f\xd2\x5e\xcb\x2c\x65\xde\x6c\xbc\xe8\x3f\xc1\x1f\x9e\x53\xb7\x73\x9e\x8c\xba\x64\xc4\x1a\x41\x10\x0e\x1c\xb8\xc5\x97\x73\x3e\x64\x04\x3c\x77\x6a\xc5\x3d\xea\x67\x74\xdb\xc0\xd4\xbb\x66\x7a\xef\xbc\x4c\x68\x67\xa6\xc0\xc3\xcf\xc4\x39\xc0\x8b\xa1\x12\xd4\x73\x89\x74\x87\x44\xa6\xc3\xaa\xce\x15\x67\x77\xa0\x8a\x1c\xdb\x1d\x12\x99\x0e\xaa\xf6\xcc\x0e\x94\x85\x13\xbb\x43\x32\xd3\x61\x65\xb2\xdc\xbf\xf2\x3f\x2b\x69\xda\x35\x1e\xdd\xf3\x31\x45\xd9\xbe\xcf\xa6\x8d\x06\x83\x13\x2c\x10\x45\x74\x5b\x1e\xe9\xc6\x9b\x83\xfa\xf7\x4b\xcd\xc4\x2a\x16\x5f\xfd\x44\x65\xd0\xd5\x42\x0d\x42\x15\x5f\x90\x95\x94\xfc\x96\xe9\x0a\x2d\xf4\x3b\x54\x9f\x0d\xfd\xdc\x0c\xe9\x71\xab\xec\x0e\x18\x96\x59\xba\xdd\x86\xaf\x23\x3a\xfa\x7e\xdf\x15\x33\xae\x4b\xdd\x20\xf5\x95\x28\x7b\x07\xb5\xa4\xf4\xef\xce\xdf\x87\x3d\x3e\x17\x5a\x95\x2d\xff\x08\x9f\xc1\xc2\x05\x7c\x5e\x6c\x27\x12\x1a\x5f\xed\x09\x7d\x21\x42\x7f\xd3\xc2\x12\xa1\x25\xb3\xec\xa3\x74\x36\x71\xd7\x0f\xd0\xf9\xa1\x96\xf4\x94\x0f\xd7\x04\x39\x81\xe9\x9b\x3d\xe6\x76\x2b\x96\x0e\x76\x06\xf8\x95\xa2\x19\xdb\xf0\xb4\xc7\x4b\x0a\x79\xd7\x5d\xed\x7a\x38\x2a\x61\x51\xae\xeb\x7a\xc5\x16\xc2\x3f\x5f\x77\xce\x34\x67\xd3\x78\x96\xa1\xf7\x2f\xb0\x9d\xa6\xae\xae\xee\x96\xba\x7d\x20\xce\x1a\x74\xde\x79\xb7\x7c\xa1\xbd\xa8\x43\xbe\x80\xb5\xa3\xbe\xf6\x77\x65\x6a\x74\x39\x4d\xa3\x23\x8e\x1c\x2c\x4f\xd3\xe8\x62\x8e\x9c\xd2\x01\x3d\x67\x5b\xf1\x77\x32\x33\xd4\x5a\xff\x6f\x25\x55\x8f\xb0\x77\xe5\x55\xd0\xf3\xee\x0d\xa6\xd6\xc1\xf9\x75\x13\x9f\x73\x87\x37\xdc\xb2\xbd\x0f\xd4\xe9\xfe\x8b\x5a\x67\x1e\x84\x7f\xc8\xcf\x96\x86\xe3\x31\x93\x8f\x14\x51\x8d\xfb\x51\x5c\x9c\xcf\x11\xa3\x3d\x97\x16\xfb\xb7\x28\x4b\x37\x1f\x3d\xad\xa0\xb1\x5f\x9c\x3a\xa2\xb6\xdb\xeb\x9d\xde\xac\x16\xcc\xc0\xb9\x96\x2b\xe8\xed\xab\xec\xc9\xf0\xc8\xe9\x7f\x7f\x82\xe4\x3c\xd9\xf3\x50\x52\x12\xec\xa7\x02\xbd\xc4\x09\x1e\x0c\x4f\x9c\x5c\xed\xe6\xf6\x95\x5a\x2d\x8f\xa2\xf8\xf9\xe1\x61\x11\x66\x00\x71\xbc\x95\xe5\xc9\x28\xc6\x6c\xbf\xa3\x67\xd5\x69\x4f\xfd\x08\x82\xd6\x32\x6e\x5f\x7b\x48\x82\xe6\x2e\x0d\xf6\x79\x34\xcc\xf7\x6c\x31\x3f\x5c\xf1\xf7\x46\xb0\xea\x67\x67\x27\x97\x43\xaf\xed\xd3\xf7\xab\xd6\x96\xea\x45\xc6\xc3\x97\xc3\xd6\x25\x70\xd8\x77\x27\x98\xf1\xe2\x68\xdc\x93\x8f\x69\xd5\x67\xbe\xff\x56\xe8\x35\xbc\xc0\x55\x23\xd0\xf4\x47\x53\xe0\x46\x53\x56\x41\xa3\xf1\x19\xa5\xf5\xf7\xa3\x66\x74\xbb\x0b\x19\x2f\x55\xdf\xac\xf7\x5b\x67\xa5\x45\xe5\x74\x8b\x2f\xec\xe5\x57\x34\x86\x55\x98\x1f\xbf\xa0\xc0\x70\x8a\xca\x9a\x3d\x61\x76\xb4\x38\x86\x1a\xa5\xb3\x93\xe7\xc9\x88\x93\x51\x3e\x06\xf7\xbc\x73\x94\x07\x1f\xd8\xc1\x78\x8a\xc1\x0a\xeb\x26\x0c\x7c\x5c\xc3\x60\xd5\xfe\xe6\xf5\xdf\x1a\xbd\x6f\xc4\xa8\x18\xb3\xa9\xf0\x13\x46\x76\xd1\xe0\xc8\x39\x9e\xb1\x9e\x74\xbe\x1f\x96\x65\x1a\xbf\xc2\x81\xde\x99\xf4\xed\x35\x19\x62\x09\xac\x57\xe8\x7b\x9f\x17\xae\xda\x84\x34\xde\x67\xa2\xc6\xaf\xfb\x0c\x3e\xcc\xc9\x98\x0d\x4e\xe6\x37\x61\x57\x51\x8e\xdb\xd7\x3c\x27\xea\x7c\xd8\xfa\x59\x3d\x30\xf4\x1d\x06\x7c\x24\x47\x58\x63\x50\xc2\x0a\xed\xf8\x77\x56\xb7\xe8\xf3\x3a\x4c\xe8\x0e\x20\x76\xc9\x7f\x02\x00\x00\xff\xff\xf4\x62\xb6\x58\xf4\x19\x00\x00") func templatesContribStratoscaleServerConfigureapiGotmplBytes() ([]byte, error) { return bindataRead( @@ -255,12 +242,12 @@ func templatesContribStratoscaleServerConfigureapiGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/contrib/stratoscale/server/configureapi.gotmpl", size: 5930, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9f, 0xe7, 0xab, 0x9c, 0xfb, 0xa9, 0xfe, 0xe4, 0x65, 0xe7, 0x8e, 0xd9, 0x98, 0xce, 0x54, 0xfd, 0x7d, 0x8b, 0xdc, 0x7d, 0xa, 0x7c, 0xf3, 0x61, 0xfe, 0x93, 0x4a, 0x7f, 0x26, 0xe3, 0xb4, 0xe1}} + info := bindataFileInfo{name: "templates/contrib/stratoscale/server/configureapi.gotmpl", size: 6644, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x40, 0xda, 0x58, 0x57, 0x11, 0x3a, 0xc4, 0x3e, 0x12, 0x28, 0x47, 0xd7, 0x99, 0x62, 0xa, 0xad, 0x1c, 0x36, 0x53, 0xbb, 0x8a, 0xae, 0x4d, 0x9f, 0x56, 0x4f, 0x73, 0x34, 0x5a, 0xca, 0x14, 0xb2}} return a, nil } -var _templatesContribStratoscaleServerServerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x5c\x8e\x31\x4e\x03\x31\x10\x45\x7b\x9f\xe2\x77\x54\x59\x1f\x80\x0a\x25\x14\x69\x48\x8a\x5c\xc0\xac\x27\xf6\x08\xef\x78\x65\x8f\xb0\x2c\xcb\x77\x47\x41\x08\x21\xca\xff\xdf\x2b\x9e\xb5\x38\x66\x4f\x08\x24\x54\x9c\x92\xc7\x7b\x47\xc8\x87\xda\x5c\x08\x54\x9e\x71\xba\xe0\xed\x72\xc3\xeb\xe9\x7c\x5b\x8c\x31\x63\x80\xef\x58\x8e\x79\xef\x85\x43\x54\x1c\xe6\xb4\x16\x63\x60\xcd\xdb\x46\xa2\xff\xd8\x18\x20\xf1\x98\xd3\x18\xb3\xbb\xf5\xc3\x05\x7a\xc8\xcb\xcb\xf5\x7c\xfd\x99\x0f\x66\x2d\x34\x72\xc5\x9d\x13\x81\x2b\x58\x94\x44\x39\x8b\x4b\xa9\x83\xb6\x5d\xfb\x82\xac\x91\x4a\xe3\x4a\x7f\x02\xd1\x38\xa5\xdf\x7a\x38\x54\x2a\x9f\xdf\xb7\xae\x11\x8d\xe0\xb3\x3c\x29\x9a\x13\x35\x5f\x01\x00\x00\xff\xff\xfd\xeb\x4b\x38\xec\x00\x00\x00") +var _templatesContribStratoscaleServerServerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x5c\x8e\x31\x6e\x03\x21\x10\x45\x7b\x4e\xf1\xbb\x54\x5e\x0e\x90\x2a\xb2\x53\xb8\xc9\xba\xf0\x05\xc8\xee\x18\x46\x61\x87\x15\x8c\x82\x10\xe2\xee\xd1\x4a\x51\x14\xb9\xfc\xff\xbd\xe2\x59\x8b\x73\x5a\x09\x9e\x84\xb2\x53\x5a\xf1\xd9\xe0\xd3\xa9\x54\xe7\x3d\xe5\x57\x5c\x66\x7c\xcc\x77\xbc\x5f\xae\xf7\xc9\x18\xd3\x3b\xf8\x81\xe9\x9c\xf6\x96\xd9\x07\xc5\x69\x0c\x6b\xd1\x3b\x96\xb4\x6d\x24\xfa\xc4\x7a\x07\xc9\x8a\x31\x8c\x31\xbb\x5b\xbe\x9c\xa7\x43\x9e\xde\x6e\xd7\xdb\xef\x3c\x98\xb5\xd0\xc0\x05\x0f\x8e\x04\x2e\x60\x51\x12\xe5\x24\x2e\xc6\x06\xda\x76\x6d\x13\x66\x0d\x94\x2b\x17\xfa\x17\x88\xca\x31\xfe\xd5\xc3\xa1\x50\xfe\x3e\xee\xc0\x4b\x40\x25\xac\x49\x5e\x14\xd5\x89\x9a\x9f\x00\x00\x00\xff\xff\x2d\x16\x0f\xd5\xec\x00\x00\x00") func templatesContribStratoscaleServerServerGotmplBytes() ([]byte, error) { return bindataRead( @@ -276,11 +263,11 @@ func templatesContribStratoscaleServerServerGotmpl() (*asset, error) { } info := bindataFileInfo{name: "templates/contrib/stratoscale/server/server.gotmpl", size: 236, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa2, 0x7d, 0x4f, 0x36, 0x58, 0x28, 0x19, 0xa4, 0x74, 0xeb, 0xf1, 0xd5, 0x9e, 0xf2, 0x58, 0x68, 0x9a, 0x5a, 0xc8, 0x58, 0x99, 0x36, 0xaf, 0x14, 0xd6, 0x80, 0x71, 0xf4, 0xfc, 0x40, 0x31, 0xf1}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc, 0xd5, 0x5d, 0x94, 0x14, 0x1a, 0x11, 0x8d, 0xcb, 0x6b, 0xa2, 0x86, 0x57, 0x64, 0xf6, 0xea, 0xef, 0x64, 0xb9, 0x5b, 0xa4, 0x99, 0x23, 0x68, 0x3e, 0x81, 0x90, 0x35, 0x51, 0x9e, 0xff, 0xb5}} return a, nil } -var _templatesDocstringGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\x8e\x41\x0e\x82\x40\x0c\x45\xf7\x73\x8a\x1f\xf6\x32\x97\x70\xed\xca\x0b\x10\xf8\x68\x13\xa6\x63\x98\x71\x63\xd3\xbb\x1b\x43\x44\x82\xec\x9a\xf6\xbf\xff\x6a\x36\x70\x14\x25\x9a\x21\xf7\xa5\xce\xa2\xb7\xc6\x3d\x00\x66\x27\xc8\x88\xf6\x2a\x75\x22\xdc\x11\x80\x65\xdb\xe7\x94\xa8\xf5\xe8\xf4\x01\xce\x2c\xfd\x2c\x8f\x2a\x59\xe1\x1e\x62\x0c\x31\xc2\xec\x87\xed\x02\x5f\x96\x3a\x60\x35\x73\x2a\xdc\xb7\x1d\xfe\xf0\x57\xb6\xd2\xee\x66\xb8\x3f\x53\xa7\xf2\x22\xda\x4b\x97\xb8\x49\x2c\xb2\xcd\xf8\x0e\x00\x00\xff\xff\x79\x3c\xdd\x12\x09\x01\x00\x00") +var _templatesDocstringGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\x8e\x41\xae\x83\x30\x10\x43\xf7\x9c\xc2\x62\xff\xc9\x25\xfe\xba\xab\x5e\x00\x25\xa6\x1d\x89\x4c\x2a\x92\x6e\x3a\xe2\xee\x15\x8a\x5a\x22\xca\x6e\x64\x3f\xdb\x63\x86\xc0\x49\x94\xe8\x43\xf2\xb9\x2c\xa2\xb7\x1e\xeb\xda\x01\x66\x7f\x90\x09\xc3\x55\xca\xcc\x2a\x55\xd1\xa7\x18\xa9\xe5\xc4\xd9\xf0\x7f\x66\xbf\xc8\xa3\x48\xd2\xcd\x72\xae\x73\x0e\x66\x7b\xea\x00\x7c\xb2\xd4\xb0\xef\x72\xce\x3c\xb6\x9d\x7d\xf0\xd3\xf5\x0d\x37\xf4\xfd\x19\x47\x95\x17\x31\x5c\xc6\xc8\x86\xab\x8b\xcd\xf9\x0e\x00\x00\xff\xff\x57\x05\xa1\xd1\x0e\x01\x00\x00") func templatesDocstringGotmplBytes() ([]byte, error) { return bindataRead( @@ -295,12 +282,12 @@ func templatesDocstringGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/docstring.gotmpl", size: 265, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe3, 0xe7, 0x27, 0x1f, 0x51, 0x5c, 0x3b, 0x4d, 0x96, 0x68, 0x52, 0x9f, 0x19, 0x4e, 0xab, 0xe9, 0x1d, 0x17, 0x4a, 0x4d, 0x6d, 0xb8, 0x33, 0xe, 0xff, 0xe1, 0xcf, 0x48, 0x56, 0xac, 0x24, 0xe8}} + info := bindataFileInfo{name: "templates/docstring.gotmpl", size: 270, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1d, 0x3e, 0x50, 0x87, 0x7e, 0xc7, 0xce, 0xf0, 0x64, 0xaf, 0x8f, 0xab, 0x38, 0x17, 0xd1, 0xd7, 0x49, 0x9, 0xe4, 0x59, 0xa4, 0xdd, 0x14, 0x7b, 0x7b, 0xa3, 0x65, 0xb9, 0xe6, 0xf6, 0xa1, 0x23}} return a, nil } -var _templatesHeaderGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\x8e\x41\xaf\xda\x30\x10\x84\xef\xfe\x15\xa3\x88\x4a\xad\xd4\xd8\xf7\x56\x3d\x01\x07\x2e\xe5\x1d\xf8\x03\x86\x6c\x1c\x8b\xc4\xce\x73\x36\xa0\x68\xe5\xff\xfe\x44\x02\x48\xa0\x77\xf2\x78\x67\xe7\xdb\x31\x06\xeb\x58\x11\x1c\x05\x4a\x96\xa9\xc2\x71\x82\x8b\xe5\x70\xb5\xce\x51\xfa\x8b\xcd\x1e\xff\xf7\x07\x6c\x37\xbb\x83\x56\x4a\x89\xc0\xd7\xd0\xeb\xd8\x4f\xc9\xbb\x86\x51\xe6\x6c\x0c\x44\x70\x8a\x5d\x47\x81\xdf\x3c\x11\x50\xa8\x90\xb3\x52\xaa\xb7\xa7\xb3\x75\x04\x11\xfd\xb1\xc8\xdb\xd8\x18\x1c\x1a\x3f\xa0\xf6\x2d\xe1\x6a\x87\xd7\x2a\xdc\x10\xee\x5d\xc0\x31\xb6\xfa\xb6\xbf\xad\x3c\xfb\xe0\xc0\xcf\x5c\x37\xdf\xeb\x53\xbc\x10\xea\x91\x67\x54\x43\x01\x53\x1c\x91\xa8\x4c\x63\x78\x21\x3d\x4e\xcc\xa5\x6d\xa8\x94\xf2\x5d\x1f\x13\xe3\xa7\x02\x06\x4e\x75\xc7\x28\x9c\xe7\x66\x3c\xea\x53\xec\x8c\x8b\x65\xec\x29\xd8\xde\x9b\xc5\x2d\x94\x88\xaf\x11\x13\xf4\x6e\x4e\x0e\xd0\x1b\xaa\xed\xd8\xf2\xe3\x9f\xb3\x02\x5c\x4c\x63\x60\xdf\x11\x8a\xbb\x28\x14\x20\x92\x6c\x70\xf4\x4d\x44\x04\x7d\xf2\x81\x6b\x14\x3f\x3e\x0b\xe8\x19\x22\x42\xa1\xba\xab\x25\xb8\x3a\xd3\xf4\x1b\xab\x8b\x6d\x47\xc2\x9f\x7f\xcf\x12\x33\xe0\x66\x22\x67\xbc\xb1\x96\xed\x17\xe0\xe3\xfd\xa5\xbe\x02\x00\x00\xff\xff\x78\xb1\x8a\x20\x07\x02\x00\x00") +var _templatesHeaderGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x90\x31\x6e\xf3\x30\x0c\x85\x77\x9d\xe2\x21\xd3\xff\x0f\xb6\x0e\xd0\x31\xc9\x90\xa5\xe9\xe0\x0b\x28\x36\x2d\x0b\xb5\x44\x41\xa6\x1b\x18\x82\xef\x5e\xc8\x4d\x8a\x04\x48\x37\x4a\xe4\xf7\xf8\xf8\xb4\xc6\x9e\x3b\x82\xa5\x40\xc9\x08\x75\xb8\x2c\xb0\x5c\x4d\x57\x63\x2d\xa5\x37\x1c\xce\x78\x3f\x37\x38\x1e\x4e\x4d\xad\x54\xce\x70\x3d\xea\x3d\xc7\x25\x39\x3b\x08\xaa\x75\x55\x5a\x23\x67\xb4\xec\x3d\x05\x79\x6c\xae\xab\xca\xb9\x02\x85\xae\x94\x2a\x9a\xf6\xd3\x58\x42\xce\xf5\xc7\x4f\x59\x7e\xb5\x46\x33\xb8\x09\xbd\x1b\x09\x57\x33\x3d\x5b\x91\x81\x70\xf3\x02\x61\x1e\xeb\x32\x7f\xec\x9c\xb8\x60\x21\xbf\x9c\xdf\xf6\xc5\xc4\x5f\x84\x7e\x96\x4d\x6a\xa0\x80\x85\x67\x24\xaa\xd2\x1c\x9e\x94\xee\x2b\x36\xd3\x26\x74\x4a\x39\x1f\x39\x09\xfe\x29\x60\x67\x9d\x0c\xf3\xa5\x6e\xd9\x6b\xcb\x15\x47\x0a\x26\x3a\x3d\x49\xea\xbd\xec\xb6\x8b\x4a\x06\x07\xea\xcd\x3c\xca\x69\x03\xa7\x72\x20\x4a\x0c\xee\xf6\x7e\xd1\x7f\xc8\xe2\x2e\xf2\x27\xfd\x1a\xfb\xaf\xbe\x03\x00\x00\xff\xff\x6d\xc8\xeb\xdb\xb0\x01\x00\x00") func templatesHeaderGotmplBytes() ([]byte, error) { return bindataRead( @@ -315,12 +302,12 @@ func templatesHeaderGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/header.gotmpl", size: 519, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcd, 0xca, 0x67, 0x57, 0x80, 0x72, 0xe7, 0xc3, 0x16, 0x8c, 0x5b, 0x2c, 0x57, 0x38, 0x73, 0x77, 0x87, 0x97, 0xb9, 0x95, 0x4f, 0x5d, 0x95, 0x92, 0x40, 0xcf, 0x74, 0xa2, 0x63, 0xf2, 0xf8, 0x30}} + info := bindataFileInfo{name: "templates/header.gotmpl", size: 432, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x21, 0xa9, 0x34, 0x41, 0xf7, 0xc5, 0xe2, 0xa2, 0x27, 0xc7, 0x82, 0x0, 0xae, 0x5f, 0x7e, 0x4, 0x73, 0xb6, 0xb7, 0xf9, 0x5d, 0x91, 0xad, 0xe8, 0xdf, 0xc6, 0xf8, 0x4, 0xfb, 0xbf, 0xcf, 0x40}} return a, nil } -var _templatesModelGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x51\xcd\x4e\xf3\x40\x0c\xbc\xf7\x29\x46\xb9\x37\xb9\x7f\xb7\x7e\xa2\x48\x3d\x80\x10\xf0\x02\x56\xd6\xa4\x2b\x6d\x76\xc3\x7a\x11\x05\x2b\xef\x8e\x92\x6e\xaa\x2d\x3f\x12\xaa\xb8\xd9\x1e\x7b\xec\x19\xab\x22\x71\x3f\x38\x4a\x8c\x6a\xcf\x64\x38\x56\xa8\x31\x8e\xab\x95\x2a\xec\x13\xea\x9d\x6f\xdd\x8b\xe1\x9b\x60\xd8\x4d\x75\x40\x75\x3d\x21\xfc\x8c\xfa\x96\x7a\x46\xb5\x19\xec\x3d\xcb\x10\xbc\x70\x85\x71\x6c\x1a\x6c\xee\x76\x4b\x05\x56\x90\xf6\x8c\xb8\xe4\x29\x80\xfc\xd4\x81\x96\x9c\xab\x33\x21\x3b\xe1\x23\xfd\x69\x41\xbd\x93\xed\x61\x08\x31\xb1\xc1\x3a\x43\x40\xd3\x40\x15\x03\x49\x4b\xce\xbe\x73\xbe\x61\x1c\x71\x26\xc5\x84\x56\x52\xb4\xbe\xcb\x6a\x8e\xb3\x99\xd8\x87\x34\x91\xff\x27\xe1\xc7\xb7\x61\x5e\xdb\x34\x90\x57\xea\x3a\x8e\xff\xfa\x59\xa9\xea\x89\xb9\x18\x5e\xae\x2c\xda\x8d\x95\x36\xda\xde\x7a\x4a\x21\x96\x63\x73\x7c\x55\xa2\xd7\x96\x9d\xf9\x44\xe8\x4d\xa9\x3a\xa7\x3f\x85\x85\x40\x69\xf7\xdc\x53\xf1\xab\x48\xbe\x63\xd4\xdb\x43\x8a\xf4\x30\x83\x72\xf6\xae\xd2\xcd\x23\xd9\x37\xdf\xbd\xd4\xdc\x8b\x8d\xfd\x53\x53\xbf\xda\xf6\x5b\x03\x55\x97\x9e\x8f\x00\x00\x00\xff\xff\xea\xef\x8c\xad\x11\x03\x00\x00") +var _templatesModelGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x90\xcd\x4e\x2b\x31\x0c\x85\xf7\x7d\x8a\xa3\x2e\x2b\xdd\x99\xfd\x5d\x22\x8a\xc4\x02\x36\xf0\x02\x56\xe2\x4e\x23\xe5\x67\x14\xa7\xa2\x60\xe5\xdd\x51\xda\xd2\x4e\x07\x54\xb1\x60\x97\xb1\xbf\xb1\xfd\x1d\x55\x14\x0e\xa3\xa7\xc2\x58\x6e\x99\x2c\xe7\x25\x3a\xd4\xba\x50\xfd\x07\xb7\x41\xf7\x18\x8d\xdf\x59\x7e\x4a\x96\x7d\xab\x03\xe7\x8e\xac\xf7\x63\xca\x85\x6d\xab\xf7\x3d\x54\x31\x92\x18\xf2\xee\x83\xd1\x3d\x53\x60\xd4\x8a\xab\x15\x36\x19\x29\xd9\xc5\xe1\xb4\x05\x38\xce\xbb\x10\x14\x63\x2a\x54\x5c\x8a\x72\x66\x1a\xc1\xd1\x5e\x3e\x2e\xb8\x98\x2d\x07\x9a\xdc\x7c\xe2\x16\xaa\xc8\x14\x07\x46\xb7\xde\x97\x4c\x2f\x07\x4e\x66\x06\xdf\xdc\xfe\xde\xee\x37\x7e\x33\xc3\x9b\x8e\x57\xec\xec\x69\x79\xe3\xe2\x7c\x47\xad\xaa\xfd\x0a\x93\x1a\x4a\xc2\xc0\x91\x73\x9b\x2e\x23\x1b\x6c\x72\x0a\x90\xb4\xcb\x86\xb1\xea\xa7\x19\xc5\x54\x5a\x16\x77\x24\xfc\xfa\x3e\xf2\x31\x8b\x16\x87\xbc\xd1\x30\x70\xfe\x1f\x0e\xe1\xa9\x9e\x23\xf9\xba\xd0\xcb\x0f\xb4\x75\x62\xb2\x0b\x2e\x52\x49\x79\xfa\xd7\xe1\x7d\x3f\xed\x3e\x38\xf6\xf6\x96\xf1\x67\x00\x00\x00\xff\xff\x75\xb1\xeb\x60\xbc\x02\x00\x00") func templatesModelGotmplBytes() ([]byte, error) { return bindataRead( @@ -335,72 +322,92 @@ func templatesModelGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/model.gotmpl", size: 785, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa, 0x57, 0x3, 0xb6, 0x3c, 0x95, 0xb2, 0x39, 0x19, 0xdb, 0x48, 0xb4, 0xa8, 0x28, 0xa2, 0x10, 0xbd, 0x53, 0xe7, 0xc2, 0xe, 0xd1, 0x22, 0x17, 0x28, 0xc6, 0x10, 0x7a, 0x2a, 0xf5, 0x52, 0x51}} + info := bindataFileInfo{name: "templates/model.gotmpl", size: 700, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5e, 0x6d, 0x2, 0xfe, 0x4b, 0x92, 0x36, 0x80, 0x72, 0x80, 0x1b, 0x63, 0x6b, 0x82, 0x52, 0xe1, 0x99, 0x3b, 0x93, 0x6d, 0x55, 0x34, 0x94, 0xb5, 0x61, 0x84, 0xc5, 0x29, 0x2f, 0x60, 0x8b, 0x6d}} return a, nil } -var _templatesModelvalidatorGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x5c\x50\xbd\x6e\xf2\x30\x14\xdd\xfd\x14\x47\x11\x9f\xf4\x55\x2a\xce\xde\xaa\x13\x30\xb0\x94\x0e\xbc\x80\x8b\x6f\x1c\x8b\xc4\x4e\x9d\x1b\x50\x64\xf9\xdd\x2b\x1b\x5a\x91\x6e\x57\x3e\xbf\x3e\x75\x8d\x8d\xd7\x04\x43\x8e\x82\x62\xd2\xf8\x9c\x61\xfc\x7a\xbc\x2a\x63\x28\xbc\x62\x7b\xc0\xfb\xe1\x88\xdd\x76\x7f\x94\x42\x88\x18\x61\x1b\xc8\x8d\x1f\xe6\x60\x4d\xcb\x58\xa7\x54\xd7\x88\x11\x27\xdf\xf7\xe4\xf8\x0f\x16\x23\xc8\x69\xa4\x24\x84\x18\xd4\xe9\xac\x0c\x21\x46\xf9\x71\x3b\xf3\x73\x5d\xe3\xd8\xda\x11\x8d\xed\x08\x57\x35\x2e\xab\x70\x4b\xb8\x77\x01\x7b\xdf\xc9\xcc\xdf\x69\xcb\xd6\x19\xf0\xaf\xae\x2f\x79\x43\xf0\x17\x42\x33\x71\xb1\x6a\xc9\x61\xf6\x13\x02\xad\xc3\xe4\x16\x4e\x3f\x11\xa5\xb4\x72\x5a\x08\xdb\x0f\x3e\x30\xfe\x0b\x20\xc6\xa0\x9c\x21\xc8\x2d\x35\x6a\xea\x78\x5f\xa0\x31\xff\x65\x08\xd6\x71\x83\xea\xdf\x57\x05\x99\x52\x21\x93\xd3\xf7\xeb\x26\x5b\x9d\x69\x7e\xc6\xea\xa2\xba\x89\xf0\xf2\x06\xf9\xa0\xcf\x58\x4a\x79\xad\x47\xa7\x1b\x77\x61\xf7\x54\x96\x66\xea\x87\x2e\xd7\xac\xc6\x53\x4b\xbd\xba\xa8\xce\x6a\xc5\xd6\xbb\xb1\x82\xcc\xa3\x7e\x07\x00\x00\xff\xff\xca\x6e\x42\x61\xbf\x01\x00\x00") +var _templatesSchemaGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x58\x5f\x6f\xdb\x36\x10\x7f\xcf\xa7\xb8\x79\xd9\x20\x05\xa9\xbc\xf5\x69\xeb\x90\x87\xa4\x69\xd7\x0e\x58\x53\xd4\x5d\x0b\xac\x2b\x0a\x5a\x3c\x59\x6c\x29\x52\x25\xa9\xb4\x9e\xe0\xef\x3e\x50\xa4\x64\xca\xa6\x9c\x06\xd9\x80\x61\x58\x9e\x1c\xf1\x74\xbc\xfb\xdd\xdf\x9f\xda\xf6\x1e\xb0\x02\x88\xa0\x90\x3d\xd5\x17\x44\xe3\xcb\x75\x8d\xf6\xf7\xa3\xcf\xb5\x54\x06\x29\x24\x42\x1a\xfb\x60\xd1\xd4\xa8\xce\x39\x23\x3a\x85\xcd\xe6\x08\xc0\xbe\x6b\xb0\xaa\x39\x31\x08\x33\x9d\x97\x58\x91\xe7\x92\xaf\x2b\xa9\xea\x92\xe5\x33\xc8\xac\x9c\x95\x42\xae\xd1\x5e\x33\xd2\xe2\x94\x18\x7b\x5d\xdb\x42\x4d\x74\x4e\x38\xfb\x13\x21\x7b\x46\x2a\x84\xcd\xc6\x3e\xdd\xaa\xb7\x72\x8b\xee\x0a\x6b\xa0\xd3\xdd\xb6\xf3\x13\x78\x2c\x55\xa7\x44\x03\xc5\x9c\x13\x85\x14\x88\x86\x63\x85\x05\x48\x01\x5a\x56\x08\xd2\x94\xe8\x84\x4e\xe1\x7d\xa3\x4d\x2f\x09\xa6\x44\x67\x00\xd1\x40\x60\x25\x39\x11\x2b\x78\x47\xac\x75\x48\xdf\xf9\x37\x30\x5b\x65\x4e\xea\x1c\xce\xe0\x22\x83\x67\x12\x2a\x34\xa5\xa4\xa0\x4b\xc2\x39\x2c\x11\x14\xf6\x97\x67\x00\x27\xf3\x01\x1e\xe7\xf3\x00\x6b\xf7\x1c\xc6\x8e\x2d\xfd\xe1\x02\x15\xeb\x00\x50\x81\x73\xaf\x4b\x14\x9d\x95\x9d\x4d\xdb\x6b\xac\xb9\xf5\x16\x6a\x6f\x29\xc5\x82\x09\x84\x82\xe4\x46\xaa\xb5\x37\x52\xc3\x27\x66\x4a\x30\x25\xd3\x4e\x4b\x16\x1a\x88\x82\x46\x82\xf4\xa8\x5a\x22\xa5\x48\xa7\xe3\xdc\x4b\xec\x06\x39\xf4\x5c\x2a\xab\xeb\xa1\xac\x6a\x8e\x9f\xaf\x96\xef\x31\xef\xf2\xe8\x65\x53\xf3\x2e\xc3\xce\x29\x65\x86\x49\x41\xf8\x73\x25\x6b\x54\x86\xa1\xee\x1d\x7f\x79\x75\x79\x95\x14\x0a\x69\xfa\x00\x4a\x22\x28\x47\xc8\x89\x46\x90\x05\xe8\x66\xd9\x45\x83\x89\x12\x15\x33\x4c\xac\xa0\x50\xb2\x02\x0b\xa4\x8b\x53\xe7\x70\x4c\xfb\x29\x30\xad\x1b\x84\xaf\xef\xdf\xbf\xff\x5d\x0f\x83\x8f\x88\xf5\xdc\x67\x5e\x9f\x93\xac\x00\x9f\xfb\x43\x31\x58\xf3\x06\xb9\xb6\xed\x9d\x8e\x26\xb0\x3d\x16\x34\xfc\x31\x8e\xbc\x43\xf2\x42\xd2\xb5\x47\xd1\x59\x72\x0f\x14\x11\x2b\x84\x6c\x84\xca\x60\xe8\x54\x52\xd9\xbf\xf9\x3c\x52\x4a\x9b\x0d\xac\xd0\xe8\x2e\x8d\xda\x16\xca\xa6\x22\x62\x54\x67\xb2\x70\xd9\x31\x00\xd8\x45\xc0\x66\x76\xbd\xb5\xe0\x53\xc9\xf2\x12\x6c\xd1\xc8\x02\x48\x00\xb6\x95\x21\x2b\xeb\x10\x33\x1a\x98\x30\xa8\x0a\x92\x63\x88\x2e\x40\xd1\x88\x1c\x92\xb6\x85\xe3\xec\x05\xe6\xc8\xae\x51\x79\xd3\x4e\x46\x06\x1f\x7b\x8b\xd3\xa8\x1f\x49\x1a\x03\x30\xe8\x07\xc3\x7d\x03\x50\xf8\x11\x8e\xb3\x4b\xa6\x73\xc5\x2a\x26\x88\x91\xea\x31\x43\x4e\x07\xe7\x83\x37\x00\x14\x9a\x46\x89\xee\x6a\xc5\x84\x29\x60\xf6\xcd\xc7\xd9\xee\xfb\xaf\x08\x6f\x76\xde\x1c\x67\x7f\x4c\xdf\xd8\x6d\xd8\x6c\xb2\xb6\xcd\x49\x85\xa1\x77\x9d\x61\xbb\x5a\x05\x0d\x95\x6e\x8e\xc2\x50\x2f\xd0\x44\xa3\xad\x6f\x17\xed\x3b\x04\x69\xc2\x82\xe4\x9a\xf0\xc3\x91\x4a\x21\x12\x2b\x81\xb7\x88\xd5\x6d\x40\x85\x33\xb8\x26\xfc\x26\x68\xa3\x47\x91\x7f\x6d\xf9\x5d\x62\x41\x1a\x6e\xf6\xbb\x15\xdc\x1b\x5a\xcc\xf7\x3f\xfc\x18\x16\x41\x8f\xee\x61\x6c\x7b\x5f\x53\xf8\x4d\x54\x44\xd9\x01\xf3\xcb\xe2\xea\x59\xb2\x84\x37\x6f\x97\x6b\x83\x29\xa0\x52\x52\x05\xf0\x4d\x0f\x50\x37\x65\xa3\x47\xc3\xdb\xd7\x44\x81\x39\xf0\xfa\x20\x68\x6b\x49\x29\x78\x70\x06\xef\xb5\x14\xd9\x60\x5d\xe2\xec\x4a\xda\x36\xac\x99\xc4\x0a\x0d\x30\xa5\x9b\x4d\x7a\x0a\xdf\x9a\xf4\xa7\x4e\xc7\x57\x67\x20\x18\x1f\x65\x80\xaf\x14\x54\x6a\x2f\x20\x07\xae\x5e\xde\x41\xe9\xc9\x7e\x24\xce\xe2\x38\x24\x26\x3d\xda\x51\x29\x58\x9f\x4d\x91\x2c\xd9\xed\x06\x77\xd9\x70\x8e\x22\xba\x59\x01\x89\xdf\xd7\x9e\xdb\x4a\x31\xec\xda\x8d\x53\xb7\xb6\x74\x33\xb7\xd1\x46\x56\x8f\xa5\xaa\x88\x31\xa8\xdc\x0a\x97\x68\xa3\x98\x58\x3d\x94\xc2\x10\x26\x34\x64\xbf\xa3\x92\x30\x4b\xfe\x98\xcd\xd2\x34\x8d\xee\x26\x7e\x13\xda\x5d\x4d\x26\xac\xea\xb6\xbb\xe5\xce\xa2\xe3\x67\xd9\x39\xe7\x57\x45\x38\xc6\x0e\x0d\xb9\xa9\x31\xf7\x37\xcd\x39\xbf\x40\xec\xf5\xbd\xff\x67\xd3\xbf\x65\x36\xdd\x39\x42\xff\xc1\xc1\x14\x39\xdc\x3e\x98\xda\x99\xa3\x2b\x36\x13\xc1\xfa\x36\x4c\xa8\xbd\x49\x17\xa0\x54\x91\xfa\x4a\x2d\x38\xcb\xf1\x67\xb4\x0d\x65\xaa\x0d\xec\x01\xbb\xd7\x39\x76\x38\xc7\x40\x3d\x45\xce\x1b\x8a\xaf\x08\x67\xd4\xe2\x1b\x25\x9d\xfd\xb3\x9e\x7b\xa4\xbd\xe3\xbe\x4d\x79\x1a\xb8\xa5\x6a\x40\x65\xb7\xc0\x5b\xda\xd4\x31\xa3\x9e\x11\x8d\x19\x9a\xb5\xc0\x75\x48\xc7\x58\x9e\x0e\x3b\xac\x35\xc0\x28\x24\x55\x9a\xba\xc3\x17\xf8\xb1\x61\x96\x62\x66\x4f\x88\xf6\xd6\x32\x69\x9b\xe9\x13\x32\xb4\xaa\x78\x2f\x75\x80\x5c\xf7\x1e\x8e\x21\xf4\xd4\xeb\x06\x23\xec\x0b\xf3\x39\xf8\x7b\x11\xbc\x32\xeb\xb3\xad\x9a\x58\x49\x75\xf8\xb8\x9a\xea\xee\x07\x66\xd9\x58\x85\xc2\x97\xa1\x6a\x84\x61\x15\x66\x5e\x27\x59\x72\x0c\x76\xf8\x65\x63\xa0\x24\x1a\x84\xec\xef\xea\x9c\x35\x12\xf2\x12\xf3\x0f\x0e\xc7\xa9\xc5\xc6\x11\x28\xe7\xcd\xc0\xf9\xf6\xd8\xe0\x04\x09\x3c\x09\xc9\x93\x53\x93\xec\x70\xb1\x14\xc2\x9a\xf4\xd4\x11\xc6\x75\x76\x0b\x92\x96\x0e\xb8\x26\x45\x37\x38\x35\x68\xa3\x8a\xca\x64\x2f\x70\xc5\xb4\x51\xeb\x70\xf7\x0a\x16\x81\x9d\x99\xdf\x21\x1e\x90\x44\xa0\x12\x75\x17\xd9\x01\xfa\x9b\x91\x7f\x00\x42\xca\x7a\x8a\xa8\x8f\xea\x27\x7b\x4d\x84\xd1\xbf\xba\x95\xe8\x82\x09\xa2\xd6\x91\x72\xac\xc2\xf3\x9b\xaa\xd2\x57\x4b\xa4\xec\xbd\x7b\x9a\xad\x04\x31\x8d\x42\x28\xa4\x8a\x37\x19\x5b\x54\xdb\x83\xa7\x06\x2b\x6d\xc7\xb3\xdd\x46\x6c\xc2\xec\xd6\xa0\x8f\xed\xfe\x97\x12\xe7\xe3\x13\x32\x95\x28\x41\x2b\xec\x68\x7f\x76\x58\xce\xef\x0e\xe1\x07\x0d\x2a\x73\xb7\x19\xf5\xdf\x5d\xc2\x43\xcf\x80\xd7\xdb\x5a\xbf\x94\xf9\x22\x10\x0f\xba\x73\x6c\x77\x4c\xa1\x22\xf5\x1b\xa7\xff\xed\xc1\xc9\xf3\xc5\xfc\x63\xd7\x4d\x87\xed\xa0\xe0\x9f\xf1\x6f\xca\xbb\x37\x5f\xe0\xd4\x81\xed\x78\x3e\xff\x82\x11\xa5\x4b\xd9\x50\x58\xa2\x1f\x6a\xd4\x7d\xc3\xe3\xec\x03\x82\xc2\x55\xc3\x89\x0a\x3e\x54\xec\x4d\x42\x42\x29\x14\x0d\xe7\xa0\x9b\xda\x36\x8e\xe9\x94\x8d\xcd\x45\x6b\xa0\x71\x0d\xb4\x92\xb6\x76\x4f\xbb\xe2\x1d\x7f\xfe\xb0\x00\x02\xd3\x50\x37\xba\x44\x0a\x54\x7e\x12\xb6\x47\x5a\xc1\xed\x26\x13\x2f\xe2\xbf\x02\x00\x00\xff\xff\xde\xd7\x2a\x36\x80\x15\x00\x00") -func templatesModelvalidatorGotmplBytes() ([]byte, error) { +func templatesSchemaGotmplBytes() ([]byte, error) { return bindataRead( - _templatesModelvalidatorGotmpl, - "templates/modelvalidator.gotmpl", + _templatesSchemaGotmpl, + "templates/schema.gotmpl", ) } -func templatesModelvalidatorGotmpl() (*asset, error) { - bytes, err := templatesModelvalidatorGotmplBytes() +func templatesSchemaGotmpl() (*asset, error) { + bytes, err := templatesSchemaGotmplBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "templates/modelvalidator.gotmpl", size: 447, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc6, 0x56, 0x93, 0xbc, 0xe3, 0x93, 0xee, 0x31, 0x24, 0xfd, 0x3b, 0xd2, 0x6, 0xdf, 0x96, 0x98, 0x88, 0x54, 0x60, 0xd8, 0x4e, 0x3f, 0xa5, 0xe, 0x36, 0x0, 0xe8, 0xa4, 0xef, 0x48, 0x51, 0xd1}} + info := bindataFileInfo{name: "templates/schema.gotmpl", size: 5504, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4d, 0x80, 0x58, 0x1d, 0x87, 0xd8, 0xdb, 0xff, 0xc9, 0x33, 0x69, 0x35, 0x93, 0x22, 0x2, 0xe3, 0x44, 0xb, 0x31, 0x1a, 0xe7, 0x60, 0xc2, 0xe8, 0x97, 0xe8, 0xff, 0x64, 0x99, 0xaf, 0xb2, 0xc5}} return a, nil } -var _templatesSchemaGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xdd\x6f\xdb\x38\x12\x7f\xf7\x5f\x31\x67\x64\x73\x52\xe0\xc8\x40\x71\x4f\x39\xe4\x21\xe9\x5e\xef\x72\x40\xdb\x45\xd2\xdd\x05\xae\x57\x74\x69\x69\x64\xb3\x95\x48\x97\xa4\x9c\xf5\x09\xfa\xdf\x0f\xfc\x90\x44\xc9\x92\x3f\x9a\xee\xa2\x5b\x6c\x9e\x1c\x69\x38\x9c\xf9\xcd\x70\xbe\xa8\xb2\x04\x9a\x42\x74\xc7\xe2\xac\x48\xf0\x25\x4f\x30\x83\xcb\xaa\x9a\x00\xd8\x37\x84\x25\x10\xdd\xc9\x5b\x22\xf1\xcd\x76\x8d\xfa\xf7\x3f\x7e\x5d\x73\xa1\x30\x81\x80\x71\xa5\x1f\x3c\x14\x6b\x14\x37\x19\x25\x32\xd4\x6b\x95\xa6\x2b\x4b\x58\x13\x19\x93\x8c\xfe\x0f\x21\x7a\x45\x72\x84\xaa\x02\xca\x14\x8a\x94\xc4\x08\xe5\x04\x40\xef\x71\xa9\x37\xd1\x7c\x02\x2e\x34\xaf\xbb\x86\x42\x33\x56\x02\x49\x1e\x42\x55\x95\xe5\xfc\xc2\xac\xd0\x7f\x37\xb0\x20\x12\xc1\xec\x43\x25\x90\xec\x91\x6c\x25\xfc\x44\x32\x9a\x10\x45\x16\x19\x46\x0d\xe9\x8f\x2c\x41\x01\x8c\x8b\x9c\x64\x10\x73\x96\x50\x45\x39\x93\x33\x78\x44\x88\x09\xfb\xab\x82\x15\xd9\x20\x10\x8f\xa3\x40\xbd\x06\x13\x20\xad\x08\xd0\x13\xee\x0a\xd4\x8a\x4a\x88\x57\x18\x7f\xd4\x22\x7c\x28\xa4\x82\x94\x0b\x90\x84\x51\xb5\xb5\x2f\xc2\x68\xd2\xc8\x71\xc7\x40\xad\x10\x12\x4c\x29\x33\x22\x00\x4f\xcd\x13\x4f\x13\x25\x31\x4b\x67\x96\x73\x8e\x84\x49\x50\x2b\xa2\x0c\x55\xc1\xb0\x06\x5d\x2a\x51\xc4\x0a\x56\x3c\x4b\x28\x5b\x36\x1b\x1c\xe2\xbe\x22\x12\x48\x8d\x11\x06\x21\xa4\x05\x8b\x2d\x4e\x17\x73\x63\x6f\xfb\x27\x0a\xa6\x68\x8e\x91\x87\x66\x63\x29\x64\x09\x38\xd2\xb2\x04\x41\xd8\x12\x21\xba\xc9\xb2\xd7\x29\x34\x1c\x6a\x7f\x92\x37\x8c\xb3\x6d\xce\x0b\x09\x1e\xf7\x76\xd9\x0f\x82\xaf\x51\x28\x8a\x9d\xf7\xf5\xfa\xb3\xe8\x4e\xbe\x29\xd6\x19\x1a\xd3\x83\xc2\x7c\x9d\x11\x85\x30\x55\xfa\x61\x4a\x31\x4b\xee\xb4\x1d\xa6\x10\x59\x0a\xcc\xa4\xa5\x6d\x49\x2d\x50\x43\xb4\xad\x1a\x6e\xc7\x9d\x27\xc6\x2b\xa3\x7f\x11\x79\x93\x58\x8f\x21\xd9\xb8\xc0\x96\x78\x90\xf2\xb2\x43\x0a\x30\x9f\x1b\xfa\x56\xc8\x84\xc7\x52\x09\xca\x96\xd3\x11\x0e\x3d\x06\xdd\xd5\x6b\x4b\xb7\x75\xc6\xa2\x9c\x7d\xcf\xe3\x87\x7d\xfc\xaa\xaa\x77\x32\x87\x88\xea\xe3\x1a\x84\x90\x93\xf5\x5b\x2b\xe0\xbb\x8e\x1d\x64\xbc\xc2\x9c\xe8\x88\x70\x94\xe0\x65\x89\x2c\xd9\xc1\xbc\xfb\xa0\x0b\xe2\x9d\xc2\xbc\x8f\xdf\x91\xe8\xd9\xa5\x3b\x46\x3a\x1d\x36\xc3\x68\x0f\x62\xe6\xbd\x07\xd6\xdb\xa3\x30\xda\x11\xaf\xef\x80\xad\x3b\xfb\x24\xd1\x3f\xb9\x09\xc0\x1d\xb2\xce\x81\x6c\xfe\x2b\xcb\x9d\x43\xd6\x52\xf5\x4e\x57\xcb\xec\xc0\x21\x9b\x0c\x8a\x76\xf8\xc0\x0d\x48\x57\x9b\xde\x19\xfd\xc0\x31\x3b\xf2\x80\x3d\xe1\x68\xfd\xe1\x0e\x55\x17\xce\xce\xef\x7d\xa7\xe8\x73\xce\xcf\x57\x7a\x72\x5a\xad\x2b\x9d\x64\xeb\x92\x23\x26\x39\x76\x2b\x8e\x01\xbe\xb7\x3c\xd9\x3a\xdf\x9c\xec\x4f\x49\x06\xb0\x7e\x1d\x53\x55\xb0\x44\x25\x4d\x7e\x2d\x4b\x58\x15\x39\x61\x9d\x2d\x4d\xee\xa5\x12\xd6\x3c\xdb\xe6\x5c\xac\x57\x34\x36\x02\x1a\x96\x3a\xed\x42\x50\x96\x70\x16\xdd\x63\x8c\x74\x83\xc2\x31\xbd\xf0\xe5\x3f\x73\x5b\x85\x83\x02\x04\xe1\x90\x5e\x0e\x2f\x9d\xe4\x3a\xc9\x18\x3f\xc1\x59\xf4\x3d\x95\xb1\xa0\x39\x65\x44\x71\xf1\x42\x9f\xd1\x46\x60\x81\xaa\x10\xcc\x6c\x24\x28\x53\x29\x4c\xbf\xfb\x34\xed\x2f\xf9\x89\x64\x05\x76\x72\x6d\xbb\xac\xab\x0a\x54\x55\x54\x96\x5d\x4b\x54\x95\xd9\xd2\x4f\x03\x0d\xc2\x0f\xa8\x06\x41\x96\xbf\x23\xc8\x23\x32\x04\x1b\x92\xed\x47\x3a\x84\x2e\xd6\x0c\xf7\x63\x7d\x0a\x5a\x70\x0d\x1b\x92\xf5\x31\x6b\x3d\x7f\x3e\x87\x1f\x59\x4e\x84\x5c\x69\xaa\x81\x72\xfb\x21\xa3\xb1\xae\x1d\x1d\x4d\x17\x2c\xa9\x5f\x4a\x8d\xe3\xe0\xda\x89\xc1\xf0\x08\xfe\x81\x40\xa2\x6b\x6c\xca\xa3\x7b\xf3\x6b\xa6\xeb\x6c\x59\xe4\x28\x9a\x62\xf2\xb9\x7b\x10\x42\x60\x4e\xfa\x2e\xab\x19\xa0\x10\x5c\x58\x38\x37\x44\x00\x66\x98\x23\x53\x12\xde\xbe\xfb\x20\x39\x8b\xee\xc9\xe3\x4b\x94\x92\x2c\xb5\x85\xb5\x53\x0b\x01\x57\xd7\xcd\x56\xf5\x16\x4e\x9a\x19\x9c\xd7\x0c\xc2\xbf\x1b\xda\xbf\x5c\x03\xa3\x99\xb3\x96\x73\x5d\x46\x33\xb3\xef\x44\x23\xeb\xf6\x15\x28\x8b\x4c\xc1\x88\x98\x13\x30\x55\xfe\xfb\x59\x2d\x9f\x96\xc1\x86\x8f\x46\x60\xbb\x05\x5f\x7c\x98\xd5\x42\x16\x7b\x51\x0c\xdc\xca\x16\xb7\xd0\x70\x70\x4a\x76\x04\x1f\x12\xbd\x3e\x4a\x4e\xf2\x6b\x20\xeb\x35\xb2\x24\xb0\xff\xcf\xb4\x24\xe1\xc4\x12\xb9\xc5\x50\xbf\x62\x34\xd3\xf1\xf3\xb0\x27\x8d\x39\xd1\x67\xbb\xce\x89\x5e\x73\xd8\x67\xe6\x73\xdd\xd2\x31\xc4\x04\x14\x07\xcd\xdd\xc6\x07\xf5\x48\x63\x9c\x81\xe4\x90\x52\x21\x95\xee\x40\xb9\x6e\xf7\x8a\x34\x45\x8d\x9e\xee\x71\x1a\x43\x51\x5e\x28\x9a\x19\x89\x6e\xb2\xcc\xc9\x18\x4e\x86\x6d\x31\xe4\x44\x2d\xc4\x07\x6c\x6e\xb7\x6d\x0d\x5e\x4d\x2c\x6a\x47\x2c\x83\xb7\xef\x16\x5b\x85\x4f\x05\x6c\x51\xa4\x5a\x65\xcd\x4a\x46\xaf\xf0\xf1\xd6\x20\x62\x76\x08\xdb\x52\xc2\x0b\x65\x26\x2d\xea\x65\xcf\x46\xd7\x79\xc1\xc9\x9a\x44\x87\x6f\x8b\xbb\x16\xd0\x5a\x84\x4a\x6b\x1e\x6d\x1c\x0e\x29\xaa\x78\x65\xe8\x36\x26\xc3\xb8\xc6\x55\x17\xbc\x03\x61\xb4\xaa\xa0\x2e\x41\x22\x77\x60\x97\xa8\x4c\x5d\xec\xfa\xe2\xb2\xe7\x93\xc3\x4c\x6c\xd5\x03\xbf\xe8\xd0\x72\xd5\x4b\x7c\xc3\x4b\x7e\x31\xd6\xdd\x13\x78\x16\x45\x3a\x83\x73\x27\xcd\x09\x41\xa7\x65\xb9\x71\xcd\x79\x74\x8f\x9f\x0a\x2a\x30\xb1\x85\x55\x70\x94\x7c\x33\x98\x2e\x74\x5d\x33\xab\x01\x89\x8e\xc0\xe1\x04\x31\xe7\x73\x78\xe3\x1b\x69\xdc\x40\x54\x42\x21\xed\x31\x4c\x50\xa1\xc8\x29\x43\x78\x5c\x51\x6d\x66\x6d\x28\xc5\x21\x16\xa8\xb3\x29\x61\x49\xeb\xf0\x76\x82\xa1\xfd\x5b\x1f\xd1\x09\x80\x7c\xa4\xda\x35\x4e\x50\xc7\x1a\xdf\x86\xe3\xb3\x8f\x33\x38\xdb\x68\x58\x77\x7c\xd8\xa8\x19\x13\x89\x3b\x25\xcf\x47\xa8\xaa\x2b\x17\x68\xbd\x64\xd0\x94\x51\x41\xb1\x5e\xa3\x80\xa0\x15\xc4\x96\x10\x61\x58\xbf\x3a\xdb\xd8\x69\x55\xbf\xc8\xe8\x4d\x29\xb4\x68\xbb\xb3\x88\xfd\xde\xf5\x6c\x06\xe7\x56\xa0\x21\xb3\x8d\xe5\x86\x3a\x3b\x34\x6f\xcf\xfd\xe0\xdf\x6f\x26\xbc\x08\x56\x73\xe1\xc2\x1c\xf3\xe0\x6f\xcf\x9e\xcd\x60\x4a\x99\xf1\xd2\x3d\xe6\x37\x1e\x72\x05\xdf\x7d\x3a\xd1\x15\x27\x93\x6a\x52\x43\x64\x27\x48\xed\x58\x51\x77\x30\x6e\x02\xf8\x82\x0b\xe3\x46\x12\x12\x8c\x33\x62\xe6\x74\x12\xce\x04\xa6\xc0\x19\x48\x9e\x23\x70\xb5\x42\x4b\x34\xb3\x83\x39\x47\x69\x3c\xcc\xb8\x20\x91\x40\x26\x00\x4b\x9e\x11\xb6\x84\xf7\x44\xef\x81\xc9\x7b\xb7\x06\xa3\x65\x64\xe9\x6e\xe0\x1a\x6e\x23\x78\xc5\x21\x47\xb5\xe2\x09\x68\x47\xcd\x60\x81\x20\xb0\xde\xbe\x37\x43\xdb\x33\xfc\xec\xf6\xd8\xdb\x35\x3e\xf4\x8a\x49\xaf\x45\xf7\x47\xae\x9d\xe9\xe7\xcf\x2b\xb4\xa3\x44\x23\x74\x2b\x87\x04\xb2\x53\x0b\xcf\xec\x44\x10\x21\x25\xb1\xe2\x62\xeb\xb4\x90\xf0\x48\xd5\xca\x06\x63\xc3\xc5\x53\xe1\x1b\xa8\x04\x9c\xff\x8e\xec\xda\x4c\x51\x9a\x4a\xb1\x93\x84\xbf\xd9\x9a\xfa\x48\x54\xfc\xed\xbb\xd0\xf8\x81\xa2\x3e\xa7\xfe\x45\x81\x9d\x90\x3f\xe7\xf9\x3a\xc3\x5f\x5f\x2f\x3e\x60\x6c\xee\x06\xec\x9c\x29\xba\x1b\x1e\xf1\x5c\x76\x9d\xde\x09\x5e\x9f\x21\x77\x33\xe0\x5f\x39\x98\xa0\x39\x18\x51\x77\xf5\x6f\xe4\x6d\x7e\x1c\x98\x06\xc0\xc1\x09\xf5\xd0\xe1\x9c\x74\xc6\x93\x9f\x3d\x2d\x68\x46\xf5\x0d\xbf\xfd\x5d\x6c\x3f\x07\x3d\x75\x56\xf0\xb5\xcf\x0b\xfc\x54\xf6\x05\xe6\x06\x5f\x02\xee\x2f\x30\x35\xf8\xbd\x26\x07\x3e\x7a\xe3\x83\x63\xfd\x9f\xa9\xfa\x31\x25\x45\xa6\x9a\xb5\x35\x34\xfb\x81\xa9\x25\x0d\xdb\x28\xf3\xef\x87\xd7\xaf\x82\x85\xeb\x58\x42\x1b\x8f\x3c\xdd\xc7\x93\xa5\x4d\xfb\x63\x3d\x78\x5b\xa1\xa9\x3d\xcb\x1b\xc2\xb6\xae\x32\xa3\x84\x46\xba\xc0\xca\x15\x94\xa5\xef\xc8\x81\x26\x6a\x30\x08\xab\x2a\x9c\xc1\xf9\x68\xcd\xd5\x44\xd6\xb6\xe0\xf2\xfd\x74\x74\xeb\xc5\x13\x98\x5e\xec\x5a\xe2\x7a\x18\x87\x40\x85\x03\xd5\x61\xa7\x30\xec\x8c\xe3\xbd\xa8\xfe\xe4\x52\xc6\x39\x96\x9f\x23\x02\x77\x9b\xfc\x83\xf6\x71\x45\x37\x36\x31\xd8\xea\xcb\x64\x8f\x42\x2a\x9e\xbf\xe0\x22\x27\x4a\xe9\x42\xdb\x5c\x0c\xdb\x66\xed\x39\x67\x8a\x50\x26\x21\xfa\x0f\x0a\x0e\xd3\xe0\xbf\xd3\x69\x18\x86\xe0\x5f\x00\x74\xfc\xce\x06\x02\x32\xa2\x81\x6d\x64\x52\xc1\x73\x30\xc4\x94\xad\x0b\xf5\x1b\xbb\xbb\xb3\x40\x10\x68\x46\x91\xd3\xdb\x65\x91\x50\x47\x9e\xde\x86\x61\x18\xf5\x58\x87\x8d\xe9\x5a\xa5\x5f\x7a\x2a\x0b\x54\x82\xe2\x06\x0f\xe9\x4d\xa4\xd5\x9a\x17\xea\xb0\xda\x23\x5a\x7b\xfb\x06\xa6\x08\xb1\x53\x09\xaf\xe6\xe8\x6a\xbd\xab\xf3\xb0\xca\x1d\xbe\x9e\xab\x0e\xf8\x93\x69\x12\x16\x7e\x1e\xde\x77\x2f\xbd\xf7\xe6\xf9\x69\xc9\x5b\x16\x8b\x4e\x2e\x19\xaa\x13\x6a\x78\xff\xcc\xe6\x3b\x01\xed\xc9\xd9\xbc\x8f\xff\xc9\x58\x7f\x73\xa9\xbc\x53\xac\x1f\xbc\x65\x3d\xea\x8e\xf5\xb3\x6f\x58\xff\x48\xf7\xab\x0e\xe9\x1d\xf8\x86\xef\x54\x6d\xd4\x38\xe1\x42\xf5\xab\xbc\x4e\xed\x37\x4a\x4d\x88\xed\xb3\x78\x40\x41\xcd\xe6\xa2\xff\x31\x8d\x73\x20\x9b\xdf\xed\xb7\x64\x4e\x29\x2e\xc6\xbe\x13\x6b\xfd\x4e\x2f\x0b\x0e\x7c\x04\x16\xda\x97\xf5\x6c\xd4\x38\x74\x8b\x9b\x34\xff\xd7\xd1\x36\xf4\x4e\x44\x5f\x87\x4d\x2d\x96\x57\xa8\x5c\x36\x63\xa7\x43\x5f\xa2\x5d\xda\x19\x49\xfd\x1d\x55\x33\xb3\x95\x36\x0e\x0d\x05\xa9\xb2\x9c\x5f\xb8\x28\x65\x04\x00\xaa\x5b\x64\x7b\x57\xa4\x03\xdb\xc0\x17\x57\xde\x77\x72\x8b\x42\x99\x6f\xb7\x18\xaf\xf7\x32\xda\x2a\xee\x3e\x3e\x33\x53\x9b\x3d\x99\xbb\xe9\xcc\x9b\x46\x7c\xa7\x45\x1f\x39\x09\x17\xbe\x5b\x58\x36\x41\xaf\x1d\x0f\x77\x87\xab\x43\x97\xf0\xc7\xf6\xe9\x61\xfb\x7d\x5a\x6a\x6a\x40\x09\x52\x89\x34\x57\xd1\x3d\x2e\xa9\x54\x62\xeb\xd7\x54\x5e\x3d\xdb\xb1\xe2\xa5\x17\x75\xe6\x17\xe0\xcd\x0b\x20\xe1\x28\x8d\x89\x1b\x13\x1c\x61\x81\x8b\xb9\xe7\xac\xf5\xf1\xf0\x3e\x87\xeb\xfc\x3c\xd2\x9b\xfd\xd2\xa0\xf6\xec\x93\x4d\xf4\x1b\x54\xd3\xa1\xbb\x57\x76\x35\xd8\x2d\x65\x44\x6c\x3d\x2c\x1a\xdc\x8c\x1b\x8e\xfa\xdd\x58\xa1\xdc\x61\x3b\x52\x34\x52\x7b\xb7\xd0\x4b\x8f\x70\x3d\x76\x47\x61\xfb\x19\x6f\x70\x2d\x1f\xc9\x32\xfa\x59\x50\x85\xa6\x84\x1c\x60\xb6\x33\xe9\xfb\xd2\x7a\xf6\x18\x0f\xb6\x04\xee\x7e\x61\xb4\xc7\x6d\x3b\x47\xa3\xd0\x3d\x92\xc4\xf6\x00\xf6\x1a\x60\xcf\xd5\x4d\x7b\x19\x79\x31\x88\xa4\xde\xb6\x7f\x7e\xbc\xc8\x3f\xf9\x7f\x00\x00\x00\xff\xff\x89\x5e\x9a\x5b\x13\x2c\x00\x00") +var _templatesSchemabodyGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\xcd\x6e\xe3\x36\x10\xbe\xfb\x29\x06\x46\x0e\x49\x10\xcb\xf7\xdc\xb2\xc8\xb6\xcd\x02\x8d\x8b\x24\xed\x65\x51\x20\x5c\x8b\x8e\xd9\x4a\xa2\x2a\xd2\xbb\x75\x0d\xbd\x7b\x41\xc9\x96\x48\xf1\x47\xa4\xec\xdd\x24\x86\x6f\x71\x3c\x1a\x0e\x67\xbe\x99\x6f\x86\x94\x37\x1b\x88\xf1\x82\x64\x18\xc6\x6c\xbe\xc4\x29\xfa\x40\xe3\xf5\x18\xca\x92\xf1\x62\x35\xe7\xb0\x19\x01\x6c\x36\x50\xa0\xec\x05\x43\x74\x93\x24\xb3\x05\x94\xe5\x08\xa0\xfa\x37\x59\x00\x2d\xe0\x1c\x65\x31\x9c\x45\x77\xec\x71\xf5\xe5\x69\x9d\x63\x88\xee\xd8\x07\xc4\xf0\xee\xef\x8f\xff\xe6\xb4\xe0\x38\xbe\x10\x1f\x6e\x32\x9a\xad\x53\xba\x62\x3b\x35\xb2\xfe\xdf\x0a\x9a\xe3\x82\x13\x2c\x7d\xbb\x5b\x28\xc3\x70\x16\xdd\x12\x36\x2f\x48\x4a\x32\xc4\x69\xf1\x13\xc1\x49\x0c\xd1\x3d\x4a\xb1\x2c\x2e\x5b\x96\x51\x5e\x59\xd6\x9a\xe0\x32\xf6\x42\x55\xb3\x53\x24\xa4\x9f\x56\x79\x82\xbb\x5f\x57\x02\x1c\xa7\x79\x82\x38\x86\x71\x5e\x90\xaf\x5c\xc8\x2d\x84\x61\x63\x88\x0c\xea\x70\xc2\x8c\x6a\x54\x2d\xb5\xf3\x5d\x6a\xb2\x58\xdb\xb2\x49\x75\xd8\x06\xf6\x37\x7e\x98\xe1\x59\xac\x46\x5b\x11\xd2\x3f\x4f\xc4\x9e\xa2\x5f\x10\xbb\x89\x63\xc2\x09\xcd\x50\x62\x03\x4e\x2d\xda\x27\x07\x30\x9d\xaa\x9e\x88\xe9\x9c\xf1\x82\x64\x2f\x63\x9f\xa7\xc5\x3a\x72\x00\x2b\xa9\xf5\x1f\x28\x21\x31\x12\x4f\xde\xd2\xf9\xa3\x4b\x9b\xa6\x8c\x2c\x40\xc0\x54\x02\x6e\x0d\xe5\x16\xb6\x26\xa8\xe6\x88\xcd\x51\x42\xfe\xc3\xe6\x55\x8c\x89\x32\xa9\x83\x2a\xa5\x8b\xf9\x59\x25\x85\x6c\x22\xae\x3c\x9a\xa3\x14\xf7\xdb\x56\xa5\xb4\xc9\x40\x5d\x61\xd0\x1e\x2b\x00\x41\x8a\xf2\xcf\x75\x58\xff\x54\xa2\x5d\x57\x3e\x61\xb9\x3d\xdc\xf0\xfc\x17\xa3\xd9\xf5\x78\x32\x7e\x1e\xe9\xaa\x47\x8e\x7f\xa8\x08\xbc\xe3\x38\x55\xe0\xe3\x07\x3d\xed\xb1\x61\x98\xab\xd4\xe8\x19\x62\x04\xdb\x99\x8a\xb6\xcd\x66\x7a\x09\x4f\xb3\xdb\xd9\xf9\xa2\xc0\xf1\xc5\x35\xa4\xe8\x6f\x0c\x6c\x55\x60\x20\xd9\x12\x17\x44\x3c\xd8\x35\x18\x15\xb8\x89\x7c\x0c\x97\xd3\x6e\xea\x1b\x21\x5b\x3d\xaa\x45\xd2\x0c\x05\x15\x08\x8e\x27\x6b\x04\x7c\xf6\x0a\xfc\xce\xd9\x7a\xcc\x3b\x01\x6e\x6b\x62\xe5\x9d\x0c\xa5\x38\x06\x2e\x58\x65\x4e\xd3\x9c\xb2\x4a\x9f\xbc\xed\x2d\x95\x51\xde\xf2\x90\x99\x29\x85\x46\x88\x7e\xa6\xd5\x37\xd5\x87\xce\xb2\xbb\x4f\xea\xdf\x1a\x8f\x6a\x5c\x6d\x60\xc4\x33\x25\x75\xcf\xcd\x89\xac\x33\x49\x2f\xf7\xc9\xde\xe9\xe1\xb7\x66\x17\xf2\x33\xce\x05\xfd\x16\x73\x2f\xb4\xe5\x9d\x8e\x3b\x3d\xc8\xc5\x87\x58\x86\x52\xca\xc1\xc8\x64\x00\x91\x04\x93\x88\x9e\x94\xfe\x2a\xe4\x5a\xff\x9d\x8a\xb4\x1a\xd9\x89\xfa\xc1\x51\x97\x07\xd4\xe4\xfd\xeb\x71\x0d\x3d\x8f\x70\x79\xd5\x4d\x25\x91\xfa\xc5\xab\x60\x34\xee\xda\xab\x4e\xb6\x4e\x2f\x47\x92\xd3\x47\xf2\xa8\x51\x6f\xc6\x38\x6b\x4c\x2c\xc3\xc6\x44\x9e\x36\x82\x27\x8c\x49\xdf\x88\x31\xd9\x15\x66\xb9\x38\xea\x9d\x84\xab\x9b\xee\x42\xc0\x39\x0d\xd8\x3b\x9b\xae\x12\x57\x4f\xad\x35\x1c\x76\x9e\x0c\xb1\x7d\x6f\xbb\x87\xd8\xec\xd5\x48\x1d\xb4\xeb\xdf\x49\xda\x02\xbe\x6f\x57\x7d\xbc\x4d\x6b\x9f\xe7\x8e\xa1\xb5\xd3\x99\x6d\xa2\x34\x6f\x8e\xde\x4d\x26\xd4\xb6\x89\x73\x2c\x64\x21\x29\x7b\xd1\xea\x2d\x58\xae\x84\xf7\x3d\xb5\x30\xc5\x45\x7b\xd6\x96\xea\xbe\xfe\xec\xb7\x70\xa8\x75\x21\x96\x35\xad\xa0\xa1\x49\x38\x40\x33\x68\xed\xc6\x8e\xba\xf9\xb2\x03\xdb\x59\x60\x82\x1b\x57\xff\x6a\xe3\xef\x32\xbd\x3b\x1a\x1d\xb0\xe0\x48\xee\xb0\x36\x49\xdf\x08\x5f\xee\x0a\x8c\xef\xa9\xac\x7a\x26\xeb\xdb\x25\xd9\x0b\x4d\x3b\xaf\xaa\xa0\xdd\x8e\x49\xc7\x3c\x0c\xf6\x4e\x82\x8d\x0f\x54\xbf\x78\x26\xa0\xb2\xb7\x5e\xc9\x83\x66\xa7\xd8\xa4\xb4\x5d\x73\x26\x9a\xa7\x91\x21\xc3\x87\x4b\xe8\x90\xd3\x46\xe7\x88\xba\x73\xd4\x12\x7c\xd2\x12\x74\xc8\xd2\x60\xa1\x59\xa3\x63\xc3\x99\xe6\x45\xe3\x74\x26\x5c\x53\x96\x60\x77\x87\xb4\x7f\x61\x76\xeb\xca\x6d\xb0\xea\x22\xf9\x80\xff\x59\x91\x62\x9b\xe9\x1f\xd3\x9c\xaf\x67\x29\xe1\xf5\xd2\x57\x34\x25\x42\x39\x5f\x77\xa1\x7e\xc7\x3e\x3d\xce\xee\xeb\x29\x55\x08\xd6\x50\x6b\xa4\xc6\xcf\x4a\x9a\x54\x7f\x05\x1d\x9d\x84\x42\xaa\x27\x69\x42\x98\xee\xe0\x39\x64\x3e\x36\xf2\x4d\xa3\xa3\x1c\xea\x05\x5f\xd1\x15\x0f\xa5\xac\xc6\x79\x7b\xdc\x0d\xda\xfc\x6b\xb9\x90\xd0\xd8\xab\x3b\xa6\x79\x4e\xc2\x96\x29\xcf\x77\x0c\xd6\xa7\x60\xf3\x14\xd4\xa9\x0f\x22\x36\x22\x34\xd1\x03\xfa\xf6\x2b\x66\x0c\xbd\xe0\xd7\x2b\x09\x9d\x6b\x3b\xc7\xad\x9d\xff\xf8\xee\x3d\xbd\xbf\x53\xfe\x95\xb6\xea\xe1\x32\xe7\x14\xee\xef\x81\xd7\xe2\x67\x7d\x67\x1a\xcc\xfd\x99\xba\x67\xae\x3e\xc4\x1d\x49\xa7\x72\x98\xac\xb4\x9d\x10\xfa\xde\xe2\x1b\xf2\xfc\x3d\x75\x01\x23\x43\xc2\x9b\x62\xfa\xe6\xcb\x96\xd2\x05\x07\xdf\x00\x05\x14\x1a\x2d\x49\x7f\x40\x4f\x12\x42\xd3\xb3\xe2\x9e\x66\x3b\xf3\x4e\x9c\x1d\xca\xd9\x27\xda\x3b\xd1\x5e\x3f\xed\xd9\xea\x7e\x28\xf5\x99\xc9\xcf\xbc\x9a\x8d\x0e\xf7\xa6\xc0\x13\x03\xea\x0c\x78\xbc\x64\x52\x7e\x57\x22\xb0\xc2\xcd\x0c\x0b\x28\xcb\xeb\x2a\x05\x1e\xf0\x1c\x93\xaf\xb8\xa8\xb1\x12\x19\x25\xaf\x02\xd2\xe3\xa0\x3d\xa9\x6e\x22\xd4\x36\xb6\x22\x57\x81\x7d\xab\xeb\x32\x48\x85\xbd\x4c\xa2\x96\xcb\x21\x2f\xaf\x82\xdb\xad\x36\x53\xcb\x2b\xdf\x23\xed\x9b\x2c\x36\x76\x1e\x6e\xbc\x39\x30\x65\x39\x87\x73\xec\xfa\x5d\xd4\x98\xfd\xc1\xd1\xbc\xdd\xd9\xb9\x06\x30\x16\xf9\x77\xe6\x25\xd5\x13\x55\x19\x2e\x7b\x7a\x57\x3b\x84\x5c\x08\x32\xa7\xcd\x48\xad\x66\x18\xfc\xde\x52\xb7\x24\x5b\xbd\xf8\xf6\x60\xb0\x72\x44\xfb\xe6\x6c\xf7\x58\xcf\x76\x82\x0c\x65\x79\x7e\xd1\x78\xe5\x4a\x32\x50\x6b\x7e\xcd\x56\x68\x4c\x7c\x7e\xa1\x68\x91\x0a\xe9\x1b\x01\xa8\xb5\x78\xa9\xc1\x1c\xee\xd0\x8e\x3b\x8d\x1b\xed\xa9\x7c\x74\xc5\x5b\xde\x1d\x76\xa3\x37\xe4\x57\x16\xbd\xb7\x7b\x3d\x3f\xac\xd8\xe7\xd7\x14\xc7\xfa\xd6\xa8\x03\xe7\xaf\x74\x03\x35\xea\x26\xd2\x29\x50\xea\x55\x95\xfd\x44\xe4\xd3\x8a\xb9\x6e\x2d\xa6\x97\x20\x24\x80\x2f\x31\x7c\x41\x0c\xd7\x2f\x78\x57\x8b\xb2\x08\x7e\x67\x38\x86\x05\x2d\x60\x95\xa5\x88\x2d\x51\x92\x08\xae\xca\x69\xb2\x4e\x69\x91\x2f\xc9\xbc\x12\x67\xd1\xe5\xd4\xa3\x87\x36\x16\x3b\x8f\x16\xda\xf5\x1e\xd6\xdb\x3d\x35\x09\x3b\xba\x55\xc2\xf7\x7f\x00\x00\x00\xff\xff\xe8\xc6\xf8\x2c\xb7\x36\x00\x00") -func templatesSchemaGotmplBytes() ([]byte, error) { +func templatesSchemabodyGotmplBytes() ([]byte, error) { return bindataRead( - _templatesSchemaGotmpl, - "templates/schema.gotmpl", + _templatesSchemabodyGotmpl, + "templates/schemabody.gotmpl", ) } -func templatesSchemaGotmpl() (*asset, error) { - bytes, err := templatesSchemaGotmplBytes() +func templatesSchemabodyGotmpl() (*asset, error) { + bytes, err := templatesSchemabodyGotmplBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "templates/schema.gotmpl", size: 11283, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x53, 0x1b, 0x51, 0xcb, 0x5f, 0x6c, 0x3f, 0x1, 0xb8, 0xdc, 0x9a, 0x41, 0xff, 0x90, 0xd3, 0xfa, 0x99, 0x35, 0xf5, 0xd2, 0x7, 0xad, 0x68, 0x6b, 0xfa, 0x4c, 0x85, 0xd4, 0x32, 0x4d, 0x38, 0x3d}} + info := bindataFileInfo{name: "templates/schemabody.gotmpl", size: 14007, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc1, 0xe2, 0x21, 0x6c, 0xbf, 0xb3, 0x16, 0xb, 0x7, 0x4c, 0xe2, 0xb3, 0xc9, 0x81, 0x2c, 0xf2, 0xfb, 0xee, 0x1e, 0x90, 0xd6, 0xf9, 0x76, 0x9a, 0xdb, 0x1b, 0x8d, 0x35, 0x7, 0x9c, 0xca, 0xef}} return a, nil } -var _templatesSchemabodyGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xcd\x6e\xdb\x46\x10\xbe\xeb\x29\x06\x82\x0f\x96\x21\x51\xf7\xdc\x1c\x24\x6d\x5d\xa0\x71\xe1\xa4\xbd\x04\x05\xb2\x21\x57\xd6\x16\x24\x97\xe5\xae\x92\xaa\x02\xdf\xbd\x58\xd2\x24\xf7\x9f\x4b\x49\x89\x65\x45\x37\xd9\x1a\xce\xce\xef\xf7\x8d\x86\xbb\xdb\x41\x82\x57\x24\xc7\x30\x65\xf1\x1a\x67\xe8\x35\x4d\xb6\x53\xa8\x2a\xc6\xcb\x4d\xcc\x61\x37\x01\xd8\xed\xa0\x44\xf9\x23\x86\xe8\x36\x4d\xef\x57\x50\x55\x13\x80\xfa\xdf\x64\x05\xb4\x84\x6b\x94\x27\x70\x15\xdd\xb1\xf7\x9b\xcf\x1f\xb6\x05\x86\xe8\x8e\xbd\x46\x0c\xb7\x9f\xdf\xfe\x5b\xd0\x92\xe3\x64\x26\xfe\xb8\xcd\x69\xbe\xcd\xe8\x86\xb5\x6a\x64\xfd\xbf\x97\xb4\xc0\x25\x27\x58\xfa\xb6\x3d\x28\xc7\x70\x15\xbd\x21\x2c\x2e\x49\x46\x72\xc4\x69\xf9\x13\xc1\x69\x02\xd1\x3b\x94\x61\x59\x5c\xb6\x2c\xa7\xbc\xb6\xac\x37\xc1\x67\xec\x4c\x55\xd3\x2a\x12\xd2\x1f\x36\x45\x8a\xf5\xaf\x6b\x01\x8e\xb3\x22\x45\x1c\xc3\xb4\x28\xc9\x17\x2e\xe4\x56\xc2\xb0\x29\x44\x16\x75\x38\x65\x56\x35\xaa\x96\x26\xf8\x3e\x35\x79\x62\xb8\x6c\x53\x3d\xce\x81\xc3\x8d\xdf\xcf\xf0\x3c\x51\xb3\xad\x08\x99\x7f\x2f\x84\x4f\xd1\x2f\x88\xdd\x26\x09\xe1\x84\xe6\x28\x75\x15\x4e\x23\x6a\x95\x5b\x28\x66\x2c\x97\x6a\x28\x12\x1a\x33\x5e\x92\xfc\x71\xea\x78\x5c\x73\x62\xa1\xd4\x41\x2d\xb5\xfd\x13\xa5\x24\x41\xe2\xc9\x37\x34\x7e\xef\xd3\x66\xa9\x5e\x51\xa6\x52\xe1\x36\xa5\xdc\x97\xed\x4c\xd8\xbf\xdb\x41\x81\x58\x8c\x52\xf2\x1f\xb6\x2b\x6e\x9b\x43\x18\x58\x67\xaf\x79\x6a\x58\xb6\x8e\x38\x64\xa8\xf8\xd8\x84\xe1\x2f\x25\x3a\x0d\x54\x08\x3b\xdc\xe1\x81\x4f\x7f\x33\x9a\xbf\x9a\x2e\xa6\x9f\x06\x72\x2b\xff\xa9\xa6\xeb\x8e\xe3\x4c\xcd\x54\x58\x9e\x9a\xe7\xb4\x4a\x18\x9f\xa0\x5a\x8d\x01\x44\xd6\xcc\x5c\xc9\xa9\x71\x67\xa6\xd6\xd8\x07\xba\xed\x28\x35\x25\x86\x50\x93\x8c\x8f\x41\x39\x68\x5d\x37\xc3\xaf\x06\x5f\x3e\x7c\x79\x03\x39\xca\x70\x02\x5c\x00\x62\x4c\xb3\x82\xb2\x5a\x1d\xdc\x2c\xb5\xe4\x08\x5f\x3b\x08\xb5\x83\x7c\xe3\xce\xcf\xb4\xfe\x46\x72\x60\xa2\x1b\xa1\x7e\x36\x28\xc0\xa0\x19\x0b\x98\x5f\x29\xe8\x7d\x6d\xc7\x72\x13\x04\x07\x61\x5b\x8e\xce\x00\x34\x77\x5e\x28\xe9\xf4\x1d\x18\x76\x98\xff\xa0\xa7\xae\xd1\xc2\x19\x80\x8b\x41\x98\xb8\x2f\x1a\x1e\x0d\x07\x03\x31\x70\x1c\x04\x4a\xe9\x09\x7c\xa6\x9e\x30\xfa\x0e\x3c\x26\x1c\xaa\x99\x5b\x18\x69\x74\x81\xe0\x1e\x00\x78\x38\xf8\x1d\x9c\x0e\x37\xee\x0d\x8b\x6b\x49\x38\x04\x06\xfb\xa0\x57\x30\x91\xa2\x2e\x4f\xc1\x8d\x33\xa1\x63\xb0\x3a\x04\x87\x0e\xbe\xee\x89\xb7\x47\x59\x19\xe9\x86\x31\xe5\x2c\x40\x6c\x10\xc1\x8c\xde\xb0\x7d\xab\x87\x6d\x1f\x7c\x18\x94\x3c\x2a\x20\x88\x10\xd4\xc1\xb0\xc0\xb9\x59\xd2\xf6\x66\x3c\xbd\x99\x43\xa7\xfa\xee\xc7\x83\x36\x49\x8c\x1e\x24\xc6\xce\x10\x3f\x66\x4f\x49\xdd\x75\x78\x53\x85\x57\xdb\x29\x13\xaf\xbb\x70\x46\xb5\xda\x8b\xe6\xbd\xfe\xa3\x44\x7a\x5f\x09\x5f\xb7\x3d\xf8\xfc\xcc\x67\x6b\xd2\xf3\xec\xd1\x91\xbc\xf7\x82\x99\xed\x42\x68\xc7\x22\xb4\xae\x16\xba\x33\x06\x49\xce\x8a\x3a\x22\x34\x55\x05\xee\x70\x48\xfe\x0b\xb3\xfb\x50\x3e\x25\xab\x81\xc1\x07\xfc\xcf\x86\x94\x4f\x9d\xfe\x36\x2b\xf8\xf6\x3e\x23\xbc\x39\x7a\x4e\x33\x22\x94\xf3\x6d\xe7\x55\x0b\xc2\x32\x49\x8d\xfa\x11\x7b\x4e\x7c\x74\xa1\xa1\xaa\x9a\xe8\x3c\x44\x37\x7c\x2c\x15\x75\xa1\x3b\xe0\xf5\x82\x2b\xba\x8e\x77\x03\x06\x2b\xe9\x8b\xee\xa0\xad\xba\x73\x6b\x1f\xb6\x51\x37\xf7\xe9\x56\x85\x66\xdf\x8b\xcc\x88\xc4\x44\x0f\xe8\xeb\x6f\x98\x31\xf4\x88\xbf\x45\xab\x6b\x7b\x5f\xcf\x4a\x3f\x7c\xa3\xef\x9b\x55\x6d\xf9\x79\x69\x8c\x29\xb9\x1a\x10\x32\xef\xca\x3b\x3c\x02\xa7\xb8\x96\xb6\xaf\x9d\x3d\xdc\x2a\x7b\xde\x93\xac\xf3\x94\x7d\xb6\xd0\x1a\x26\xd8\xac\xd4\xd8\x77\x62\xeb\x69\xdf\x2b\x3e\x4b\x07\x9f\x06\x6f\xdb\x5e\xd9\xd8\xb2\xf5\x8c\x50\xa3\xcc\x9a\xa3\xf7\xe2\x23\xc0\xc1\x68\xac\xef\x30\x1f\x84\x53\xe6\x7d\xf9\x8e\xe6\xad\x71\x17\xfe\x1c\xcb\x9f\x17\xa2\xba\x10\xd5\x30\x51\xb9\x90\x7a\x2c\x59\xd9\xe9\x6a\xe8\x1a\xc4\x91\x49\xeb\xc7\xe2\xac\xf3\x25\x89\xea\x9b\x42\xbc\xb3\x90\xec\x09\x87\xaa\x7a\x55\x17\xf7\x03\x8e\x31\xf9\x82\xcb\xa6\x0a\x22\xab\xe4\x7c\x44\xe1\x1f\x75\x3e\x34\x4d\x84\xc6\xc6\x5e\x64\x3e\x72\x86\x74\xc7\x52\x2f\x68\x99\x1e\xad\x3d\x18\x18\x55\xf0\x87\xd5\x65\x6a\x35\x9f\xb8\x87\x0a\x79\xa2\xb8\xcd\x13\xeb\x48\xe1\x2f\x37\x4f\x49\x39\x96\x58\x1e\xa7\x9f\x19\x3c\x0e\xcf\x7a\x7b\x83\x45\xdf\x8e\x5b\x71\xf9\x64\xfc\x57\x7d\xac\x91\xb3\x1a\x18\x24\xdd\x69\xf7\x65\xdd\x5e\xe9\x13\x15\x80\x30\x84\xdd\x00\x75\xf4\x47\x73\xf8\xd3\xbe\xac\x8e\x50\x8c\x32\xac\x9c\xd8\x61\xb4\x6b\x65\x0a\x55\x75\x3d\xeb\xa2\x32\x97\x0c\x34\x26\x51\xbb\x15\x06\x2d\x5e\xcf\x14\x2d\x12\xf6\x9d\x48\xe9\x39\xf1\x46\x4d\xe6\xfe\x01\xd5\xc2\x69\x75\xd4\x0f\x56\x74\xc3\x7b\xa6\xdc\xef\x0d\xd6\x3e\x17\x98\x07\xdf\x66\x0d\xdc\x59\x3e\xe4\xa2\xf2\xb9\xbe\xbc\xf6\x94\xf9\x73\x5f\x21\xb8\x24\xca\x71\xcb\xa0\x6a\x3f\xc8\x7d\xf9\xeb\x86\xf9\x36\xf9\xcb\x1b\x10\x12\xc0\xd7\x18\x3e\x23\x86\x9b\xcb\xa7\xf5\x81\x2c\x82\x3f\x18\x4e\x60\x45\x4b\xd8\xe4\x19\x62\x6b\x94\xa6\x24\x7f\x84\x82\xa6\xdb\x8c\x96\xc5\x9a\xc4\xb5\x38\x8b\x6e\x96\x01\x13\xaf\x15\xe7\x02\x06\x5e\xc7\xcf\xa2\x13\xdf\x5e\x8c\x5b\x7a\xf6\xa9\xfb\x3f\x00\x00\xff\xff\xb7\x8f\xfa\xbe\x0b\x32\x00\x00") +var _templatesSchemaembeddedGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\x91\xcd\x8e\x1a\x31\x10\x84\xef\x7e\x8a\x12\x27\x26\x4a\xfc\x00\x89\x38\x25\x28\xe2\x42\x22\x84\x72\x37\x9e\x36\xf1\xe2\x9f\x51\xdb\x33\x82\xb5\xfc\xee\x2b\xc3\x20\xb1\xec\x9e\x6c\xb5\x3f\x77\x55\x75\x97\x82\x9e\x8c\x0d\x84\x45\xd2\xff\xc9\xab\xb5\x3f\x50\xdf\x53\xbf\x40\xad\x22\x5f\x06\x42\x29\x18\x54\xd2\xca\xd9\x57\x82\xdc\x2a\x4f\xa8\x15\x29\xf3\xa8\x33\x8a\x40\x03\xac\x81\x5c\x3b\xf2\xfb\xcb\x40\x72\x93\xb6\xa3\x73\xea\xe0\x1a\xf8\xa5\x14\x50\xe8\x51\x6b\x29\x0f\xcc\xef\xd8\x8e\xa6\x51\x85\x30\x63\xd0\x58\x96\x22\x77\xa4\xc9\x4e\xc4\x77\x91\x5b\xe7\xc8\x90\x9b\xb4\x1f\x07\x47\xed\xf2\x33\xfa\xc1\xd1\xf9\xcf\xe1\x85\x74\x7e\x56\x68\x46\x7e\xd9\xa4\xd9\x7a\x1b\x54\xa6\x74\x2b\x6b\xe5\xe9\x9d\xff\xf6\xc7\x25\xba\xf2\x9b\xb4\x3e\x0f\x91\x33\xcd\x3d\x3e\xa6\xbd\xd3\xb7\x10\x0f\xc5\xab\x6c\x87\x7f\xca\xd9\x5e\x65\x5a\x9a\xc8\x5e\xe5\xd4\xa6\x63\x7c\x96\x3b\x3a\xda\x94\xf9\xd2\x81\x98\x23\x5f\xa7\x35\x29\x86\x81\x0d\x99\xd8\x28\x4d\xa5\x62\xd5\x72\x3e\x67\x97\x6d\x33\x1c\x87\xbf\x4a\x9f\xd4\x91\x3e\x1d\x1d\x9a\xfd\xe9\x2b\xe2\x09\xdf\x57\x30\x72\xc9\x63\xc8\xd6\x93\x9c\xfd\xb4\x15\x74\xf8\xd1\xde\x9b\x32\xc0\x94\x47\x0e\x98\xe4\xb3\xe1\x4e\x00\xad\xdf\x0c\x04\xeb\x44\x15\xa5\x7c\x9b\x13\x8a\xb7\x00\x00\x00\xff\xff\x18\x59\xcb\x94\x27\x02\x00\x00") -func templatesSchemabodyGotmplBytes() ([]byte, error) { +func templatesSchemaembeddedGotmplBytes() ([]byte, error) { return bindataRead( - _templatesSchemabodyGotmpl, - "templates/schemabody.gotmpl", + _templatesSchemaembeddedGotmpl, + "templates/schemaembedded.gotmpl", ) } -func templatesSchemabodyGotmpl() (*asset, error) { - bytes, err := templatesSchemabodyGotmplBytes() +func templatesSchemaembeddedGotmpl() (*asset, error) { + bytes, err := templatesSchemaembeddedGotmplBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "templates/schemabody.gotmpl", size: 12811, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5e, 0xd4, 0xa2, 0xde, 0xa8, 0x23, 0xfd, 0xa0, 0x6a, 0xf9, 0x1f, 0x3c, 0x2f, 0x94, 0xb8, 0xb, 0xd3, 0x63, 0x18, 0xcb, 0xe7, 0xfc, 0xd3, 0x6d, 0x5e, 0xd8, 0xb7, 0xb9, 0x82, 0x97, 0xe9, 0xe5}} + info := bindataFileInfo{name: "templates/schemaembedded.gotmpl", size: 551, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x20, 0x86, 0x25, 0x7d, 0x64, 0xed, 0xf7, 0x80, 0x5c, 0x4d, 0x25, 0xbc, 0xfd, 0xcd, 0xbe, 0x94, 0x37, 0xa5, 0x11, 0xa9, 0xb7, 0x27, 0xff, 0xa4, 0x49, 0xe, 0xd9, 0x21, 0xff, 0xf7, 0x51, 0x4d}} return a, nil } -var _templatesSchematypeGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x51\x31\x4e\xc4\x30\x10\xec\xef\x15\xa3\x54\x09\x12\x16\x1f\xa0\x08\x0d\xba\x02\x28\x8e\x0f\x18\xbc\x86\x48\x1b\xdb\x8a\x9d\xc2\xb2\xfc\x77\xe4\xbb\x5c\x30\x90\x86\x06\xae\x5b\xcd\x8e\x67\x66\xc7\x29\x41\x91\x1e\x0c\xa1\xf1\xaf\xef\x34\xca\xe7\xe8\xa8\x41\xce\x3b\x20\xa5\x6b\x0c\x1a\xd2\x28\xb4\x76\x42\xdb\x32\x19\x88\x9e\xf9\x49\x77\x78\x0b\xb8\xe9\x20\xf6\xbe\x37\xd6\xc4\xd1\xce\xbe\x43\x0b\x63\x43\xc1\x1e\xa4\xeb\x4e\x1a\x27\x95\x40\xa3\x63\x19\x56\x93\x3b\xab\x62\x03\xf1\x69\x43\xec\xa9\x7e\x70\xb6\xad\xf5\xc4\xde\x3f\xce\xcc\xf2\x85\x69\x5d\x1c\x66\x47\x53\xcf\x83\xf4\xc5\xef\x2a\x25\x90\x51\xdf\x84\xbe\xd0\x90\x33\x6e\xf1\x93\x27\xee\x6d\xb9\xbc\x4a\x64\x54\xce\xbb\x65\x2a\xf0\x71\x3e\x77\xa5\x68\x22\xad\x49\x1d\x2e\xa8\xb3\x5f\x9e\x10\xa2\xa3\x2a\xfe\x7f\xa7\xff\xf3\x1f\x2f\xbc\x23\x81\xd4\x52\x5b\x4a\x1b\xc8\x92\xb3\xec\xd6\x7e\x6b\xb1\xcd\xa2\x3f\x02\x00\x00\xff\xff\x8e\xcc\x37\x87\x56\x03\x00\x00") +var _templatesSchemapolymorphicGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x95\x4f\x8f\xdb\x36\x10\xc5\xef\xfe\x14\x0f\xee\x16\xb5\x8c\xad\x0c\xa4\xb7\x00\x3d\xb8\x08\x1a\xf8\x52\x07\xf5\x36\xf7\x89\x34\x5a\xb1\xe5\x1f\x85\xa4\x9c\xba\x84\xbe\x7b\x21\x4a\x96\x68\x57\xdb\x4d\x2f\xd5\x91\x1c\xce\x3c\xfe\xde\x0c\x15\x02\x4a\xae\x84\x66\xac\x5d\x51\xb3\xa2\x0f\x46\x5e\x94\xb1\x4d\x2d\x8a\x35\xba\x6e\x05\xf8\x4b\xc3\x08\x01\x0d\xb9\x82\xa4\xf8\x8b\x91\xff\x42\x8a\xd1\x75\x10\xda\xb3\xad\xa8\x60\x84\x15\x10\xc2\xf7\x10\x15\xb4\xf1\xd8\x18\x8b\xfc\xe0\x0e\xd3\x7e\x7e\x70\x27\x6f\x99\x54\x86\xae\x0b\x61\xb7\x5d\x61\xfc\xf6\xf8\x44\x8e\x87\x2a\xc2\x81\xe4\x17\xba\x38\x7c\x24\x29\x4a\xf2\xf4\x49\x72\x3e\x85\xfe\xa6\x4b\xb6\xd0\xc6\x2a\x92\x28\x8c\x2e\x85\x17\x46\xbb\x47\x7c\x61\x14\xa4\xbf\xf3\xa8\xe9\xcc\xa0\x24\xa3\xe5\xfe\x0c\x97\xa0\x59\x02\xee\xc4\xbd\x85\xaf\x85\x43\x51\x73\xf1\x47\x2f\xe1\xf7\xd6\x79\x54\xc6\xc2\x91\x16\xfe\x32\x6c\x64\xf9\x6a\xd2\x71\xd0\xf0\x35\x0f\xe0\xa2\x04\x98\x2a\xae\x24\x37\xf1\x8e\x65\xf5\x38\x64\x56\x4c\xda\xc1\xd7\xe4\x63\x54\xab\xf9\xcf\xc6\x58\xcf\x25\x9c\xb7\x6d\xe1\x51\x1b\x59\x0a\xfd\x3c\x15\x78\x2d\x7b\x4d\x0e\x74\x65\xc4\x9b\x0c\x55\xab\x8b\x81\xd3\x76\x17\x4d\x1b\x3e\xdb\x6a\x2f\x14\xe7\x09\xcd\xd1\x27\xd6\xe5\xe0\x6e\x08\xb0\xa4\x9f\x19\xf9\x5e\xca\x63\x85\xf1\xf4\xe8\x65\x7e\x70\x7b\x6d\xf4\x45\x99\xd6\x61\x4a\x3c\x9f\xf9\x60\x4d\xc3\xd6\x0b\x4e\x76\xe3\xbe\xa8\xf0\x90\x1f\xdc\x53\xdb\x48\x8e\x8e\xc3\xb3\x6a\x24\x79\xc6\xda\xf7\x8b\x95\x60\x59\x1e\x7a\xfc\x6b\xe4\x43\x04\x4b\x37\xc4\xce\xa1\x03\x9f\xa5\xd8\xab\xfe\xab\xd8\xbb\x85\xa4\x9c\xa2\xe6\x68\x4f\x52\x14\xfc\x9e\xbd\x67\x3b\xe4\x98\x6e\x39\x56\x9d\x4f\xe6\xef\xcd\x53\x0f\x39\x8d\x99\x69\x2d\xa2\xfb\x27\x86\x91\x5f\xca\x60\x49\xdb\x22\x8a\x97\xa5\xbd\x06\xe6\x75\xc1\x5f\x81\xa5\x5b\x25\x43\x5f\x90\xe2\xdb\x99\xbf\x95\x11\xdf\x8c\x9f\x4c\x79\xb9\x3a\xb3\xdb\xa6\xfd\x2d\x54\x23\x59\xb1\xf6\x94\x36\xf2\xfc\x6c\x6c\x9e\x8e\xef\x8e\x9b\xca\x72\x99\xbd\x05\x79\x35\x0e\x8c\x70\xf1\x15\x69\x1d\x97\x8f\x10\xce\xb5\x8c\x6f\xde\xfc\xf0\x26\xbb\x76\x77\x7f\xab\x45\xf4\x11\xc0\x6e\xb7\xf0\x5c\x75\x1d\x9e\xd9\xbb\x58\x3f\x04\xd4\xad\x22\x7d\x73\xaf\xa8\x4d\x38\x34\xf3\x03\x18\x29\xc4\x94\xfd\x7c\x61\x13\x02\x1e\xf2\x5f\xb9\x60\x71\x66\x3b\x26\xdd\xa6\x90\x1e\xc6\x52\xd9\xa2\x80\x4d\xb6\x04\xaf\xef\xb5\x11\x5e\xd2\xce\xa2\x02\x7f\xc6\x43\xfe\x4e\xb8\xc2\x0a\x25\x34\x79\x63\x7f\xee\xed\x9e\x14\xcf\x53\xce\xbe\xb5\x3a\x96\xb4\x42\xfb\x0a\xeb\x6f\x3f\xaf\xef\xcf\x7e\x24\xd9\xf2\xdd\xc8\xdc\xb4\x57\x9a\xe7\xf6\x96\xe8\xba\x3c\x84\xdb\x4e\xe8\xba\x28\x66\x79\x00\x67\x1f\x4e\xec\x17\xad\x70\xff\xa3\x15\x2f\x68\xd8\x9c\x49\xfe\xbb\x1f\x19\xee\x1c\xd1\xfc\x95\x8e\xfc\x17\x84\xf8\x11\x67\x92\x2f\x81\x4c\x97\xe2\x70\xa5\x03\xb3\x2f\x87\x3f\x20\xc9\x64\x0a\xa6\x11\x49\x6e\x96\x80\x3c\xb1\x15\x91\xc3\x75\xe0\x93\x92\x7f\x07\x00\x00\xff\xff\x5c\xdd\xd1\x0d\x0d\x08\x00\x00") + +func templatesSchemapolymorphicGotmplBytes() ([]byte, error) { + return bindataRead( + _templatesSchemapolymorphicGotmpl, + "templates/schemapolymorphic.gotmpl", + ) +} + +func templatesSchemapolymorphicGotmpl() (*asset, error) { + bytes, err := templatesSchemapolymorphicGotmplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/schemapolymorphic.gotmpl", size: 2061, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd8, 0x38, 0x31, 0x5b, 0x7b, 0xaf, 0x27, 0xcd, 0xb5, 0x5f, 0x2d, 0x20, 0xa9, 0x78, 0xd9, 0x99, 0xfb, 0xc6, 0xb8, 0x2a, 0x88, 0x27, 0xdd, 0xd5, 0x59, 0x3f, 0xa5, 0xee, 0xdc, 0x33, 0x74, 0x7a}} + return a, nil +} + +var _templatesSchematypeGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x52\x3d\x4e\xf4\x30\x10\xed\x73\x8a\xa7\x54\xc9\x27\x7d\x16\x17\xa0\x08\x0d\xda\x02\x28\x96\x0b\x78\xf1\x18\x22\x4d\x6c\x2b\x76\x8a\xc8\xf2\xdd\x91\x93\x10\x0c\x6c\xb3\x88\x62\xbb\x64\xe6\xcd\xfb\x99\x71\x8c\x50\xa4\x7b\x43\xa8\xfd\xcb\x1b\x0d\xf2\x79\x76\x54\x23\xa5\x0a\x88\xf1\x3f\x7a\x0d\x69\x14\x1a\x3b\xa2\x79\x0d\x68\x98\x0c\x44\xc7\xfc\xa4\x5b\xdc\xb4\x10\x07\xdf\x19\x6b\xe6\xc1\x4e\xbe\x45\x03\x63\x43\xae\x3d\x48\xd7\xae\x1c\x2b\x4b\xa0\xc1\xb1\x0c\xbb\xc8\x9d\x55\x73\x0d\xf1\x29\x43\xec\xa9\x1c\xf8\x90\x2d\xf9\xc4\xc1\x3f\x4e\xcc\xf2\xc4\xb4\x37\x8e\x93\xa3\xb1\xe3\x5e\xfa\xac\xf7\x2f\x46\x90\x51\xdf\x88\xbe\xc0\x90\x12\x6e\xf1\x13\x27\xee\x6d\x4e\x5e\x38\x32\x2a\xa5\x6a\xfb\xca\xe5\xaa\x58\x95\xa2\x91\xb4\x26\x75\xbc\xa2\x95\x5d\x96\x20\xcc\x8e\xfe\xda\xfd\xfe\x57\xac\xfb\x17\x99\x36\x07\x0b\xcf\x69\x89\x74\x09\xf1\x3a\x72\x7d\x0f\x2c\xe3\x16\x00\xa9\xed\x4c\x31\x9e\xa9\x6c\x3e\x73\x6f\xbf\x67\x49\x76\xf6\xb0\xef\x01\x00\x00\xff\xff\x47\x0a\x2e\xc3\xc5\x03\x00\x00") func templatesSchematypeGotmplBytes() ([]byte, error) { return bindataRead( @@ -415,12 +422,12 @@ func templatesSchematypeGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/schematype.gotmpl", size: 854, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1, 0x3d, 0x4d, 0x98, 0x68, 0xdf, 0x6c, 0x32, 0x73, 0x9a, 0x5a, 0x5e, 0x30, 0x52, 0xf3, 0xef, 0xf7, 0x79, 0x7, 0x61, 0x0, 0x3d, 0x3a, 0xbb, 0x4d, 0x16, 0xcc, 0xab, 0x6b, 0x9f, 0xc3, 0x31}} + info := bindataFileInfo{name: "templates/schematype.gotmpl", size: 965, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1a, 0x13, 0x7d, 0x62, 0x54, 0x21, 0x85, 0x9e, 0x4c, 0xd9, 0x88, 0xcb, 0x7, 0xd7, 0xf5, 0x23, 0x35, 0x23, 0x5e, 0x65, 0xe0, 0x58, 0xaf, 0xcb, 0x73, 0x3d, 0xb4, 0x6e, 0x3b, 0xa0, 0x19, 0x9d}} return a, nil } -var _templatesSchemavalidatorGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5d\xdf\x73\xdb\x36\xf2\x7f\xfe\xea\xaf\xd8\xaf\x26\x77\x23\xa5\x0a\xd5\x87\x9b\x7b\x70\xcf\x37\x93\xa6\x69\xeb\xb9\xa6\xc9\x24\x6d\x1f\xae\x93\xb9\xc0\xd4\x4a\x42\x43\x81\x0c\x40\xc9\xf6\x71\xf4\xbf\xdf\x00\x24\x41\x10\x04\x28\xea\x97\x2d\xbb\xf2\x93\x44\x82\xc0\x62\xb1\xfb\xd9\xdd\x0f\x40\x39\xcb\x60\x82\x53\xca\x10\xfa\x09\xa7\x0b\x9a\xd2\x15\x4e\x29\x46\x93\x15\x89\xe8\x84\xa4\x31\xef\xc3\x7a\xdd\x03\xc8\x32\xa0\x53\x08\xde\xe3\x97\x25\xe5\x38\xc9\x2f\xd2\x29\x20\xe7\x70\x71\x09\x45\x73\xd4\x0d\xf2\xf6\x84\x4d\x60\x80\x5f\x20\xf8\x21\xfe\xe5\x2e\x41\xe8\x8b\x94\x53\x36\xeb\x0f\x61\xc0\xe2\x14\x82\x2b\xf1\xf3\x32\x8a\xc8\x75\x84\x43\x58\xaf\x3f\xa8\x9b\x59\x06\xc8\xe4\x00\x83\x62\xcc\x77\x24\x9d\xc3\x7a\x9d\x65\xe6\x47\x8c\x04\xc2\x7a\xdd\xef\xeb\xe6\x23\x29\x63\xc2\x29\x4b\xa7\xd0\xff\xcb\x97\x3e\x04\x3f\xc5\x21\x49\x69\xcc\xca\x9b\x74\x0a\x72\xd4\x41\xcc\xe5\xc8\x2f\x59\xcc\xee\x16\xf1\x52\xd8\x62\xc8\x81\x0a\x79\x73\x21\xf2\xfe\xb3\x2c\xf8\x8d\x44\x4b\x7c\x7d\x9b\x70\x14\x22\xef\xb7\x7b\xaf\x43\xdd\xd1\xf0\x1b\xa5\xb5\xff\xbf\x04\x46\x23\xc8\x7a\x00\x00\x1c\xd3\x25\x67\xf2\x7a\x0f\xa0\xd0\x77\xde\xba\xd2\xfd\x1b\xca\x7e\x42\x36\x53\x1a\x70\x2b\x5f\xb7\x38\xac\xea\xf2\x45\x2b\xfb\xac\xa6\x05\xeb\xf5\xf3\x76\xf5\x0c\x65\xcf\x35\xc1\x77\x9e\x3c\xb9\xdd\x34\xf9\xb2\xc5\x89\x4d\xde\x10\x7c\xd7\xc9\xbf\x23\x69\x8a\x9c\x79\xa7\x5e\xdc\x3f\xa1\x89\x7f\xca\x32\x43\xea\x4f\x7b\x98\x3c\x5d\x2c\x17\x6d\x06\x2f\xef\xe7\xad\x25\xce\x7c\xb8\x21\xb3\x19\xf2\x1c\x6c\x28\x4b\x71\x86\x0a\xc1\xae\x58\x7a\x54\x5c\x69\x1b\x9b\xe6\x63\xe7\x1d\x4f\xa3\x98\x54\xa2\xfc\xfd\x6f\x7b\x79\x55\xa1\x1b\xf5\xf5\xf5\x6d\x18\x2d\x05\x5d\x61\x75\x7d\x0f\x5f\x6b\xd7\x7a\x7e\xff\xcf\xa9\x75\xad\x1b\x4b\xeb\xfa\xfa\xce\x5a\x5f\x46\x29\x4d\x22\x7c\x3b\xf5\x2b\x5e\x37\x39\xac\x36\x95\x7a\xf6\xd2\x8a\x29\xfb\xae\x0a\x78\xcd\x4a\x9b\x1b\x8f\xe5\x9c\x97\x08\xc8\x96\x8b\x9a\x2a\xb2\x2c\x78\x8f\x21\xd2\x15\xf2\x9f\xc9\x42\xca\x17\x94\xda\x91\x33\x24\x22\x24\x11\xfd\x2f\x42\x50\xdc\xad\x5f\xfc\xb0\x9c\x4e\xe9\x2d\xac\xd7\x72\xa8\x63\x18\xe4\x76\xaa\xdb\x51\x4f\x57\xe2\xd5\x52\xa4\xf1\xe2\xfb\x98\x2f\x14\xc4\xaa\x01\xc6\xcf\x21\x9d\xa3\xbc\xfb\x21\xe5\x48\x16\x10\x12\x81\x30\xa0\xf1\x7b\x24\x93\x57\x51\x2c\x90\x0f\x81\x0a\x20\x11\x47\x32\xb9\x03\x94\x96\x3b\xc1\xc9\x08\x04\x65\x21\x02\x4d\x61\x12\xa3\x50\xb9\x0c\x47\x11\x47\x2b\x04\x22\x40\x67\x85\xf0\x7c\xac\x84\x50\x62\xa4\xb8\x48\x22\x92\x22\xf4\x0b\xed\xd3\x98\xe5\x42\x4d\x95\x50\x7d\x08\xb4\xc8\x85\xf8\xd5\xa7\x5e\x96\x95\x39\xa7\x88\x68\x88\x9d\x52\xcd\xd6\x64\xf3\xe0\x4b\xd9\x71\xb5\xac\xf5\xf2\xad\x98\xcc\x0c\xdf\x50\x76\x95\xe2\x42\x28\x74\xcd\x3f\x55\xea\x0c\xae\xd8\x04\x6f\x7f\x23\xbc\x61\xb1\x85\x19\x7f\x90\x5f\x2e\x2e\x81\x32\xe9\xa6\x11\xca\x50\xef\x92\x71\xe8\x0d\xa3\xb5\x21\xdd\x91\x54\x35\x39\xbc\x2a\xbb\xcc\xad\x0c\x68\xa5\x94\x7b\x28\xbb\xa1\x5f\x77\x00\x7b\xf0\xc9\x56\x52\xee\x33\xd9\x5f\x19\xfd\xb2\xc4\x4d\xf3\x35\x5a\x1d\x7a\xca\x87\xf5\x14\x23\x06\xa8\x28\x30\x8d\x39\x28\x8c\xb0\x66\xb6\x6d\x18\x38\x06\xde\x1f\x78\xe6\x16\x26\xbc\xd0\xe5\xb3\xaa\x2b\xe5\xcd\x0a\x11\x8b\xef\x3f\x12\xf1\x9b\x86\x5f\x51\x5e\xbd\x12\xdf\x12\x81\x2a\x1f\xd2\x57\x5e\x46\x94\x08\x9c\xe8\xb2\xbb\xb8\x7c\xc5\x52\xe4\x53\x12\xa2\x7d\x23\x0f\x21\xc3\x52\x1c\x50\x0b\x91\x65\xa6\x79\xcb\x65\xf8\xfa\x1b\xfb\xe2\x3f\xc0\x0f\x4e\x76\xe3\xaf\xbe\xd2\x2a\x92\xf3\xbd\xa1\xe9\xdc\x52\x83\xa5\x0a\x33\xba\xe6\xf2\x96\x1a\xa9\xf8\x84\x37\x24\x91\x6d\xde\xae\x90\x73\x3a\xc1\xa1\xd9\x95\xb2\x20\x71\x43\x66\xc1\x95\xf8\x37\xf2\x78\xe0\x41\x7a\xc8\xa4\xed\xe5\x81\x30\xef\xdf\xe8\x02\x20\x8c\x59\x4a\xd9\x12\x8d\x8b\x75\x71\xf5\xd2\x96\x97\x8c\x78\x99\xf0\x38\x41\x9e\xde\x19\x41\x2f\xa8\x1a\x37\x9e\xae\xcc\xc1\xb0\x97\x17\xa5\xb9\x9a\xb6\x52\xd0\x0f\xf9\x42\xc3\x80\x61\x73\x6a\x35\x9f\x19\x96\x59\x43\xc2\x71\x85\x2c\x15\x30\x43\x86\x9c\xa4\x38\x81\x30\x9e\x20\xa4\x31\x84\x24\x8a\x80\xa6\x02\xa3\xe9\x05\xa4\x73\x2a\x64\x02\xc1\x51\x20\x5f\xe1\x44\xd9\x04\x29\xc6\x4b\xef\x12\x14\x55\x8a\xb0\x61\xd9\xfc\xcb\x44\xa7\x9e\xf0\x6b\x3b\x55\x43\x53\x35\x70\x68\x3e\x1f\x14\x9e\x82\x83\x3c\x43\x11\x6e\x5f\x55\xfd\xac\x70\x04\xf1\x67\xd9\x15\x72\x1e\x0c\x9e\x23\xe7\x31\x17\x41\xe5\x6b\xc3\x6f\xe4\xfd\xcc\x30\x80\xc2\xc7\x57\xa8\xc7\x91\x3a\xde\x12\x72\x86\xbd\xa6\x3d\x59\xe0\x51\xdd\xda\x51\xc1\x1e\x4b\x6b\x5a\x98\x9d\xb5\x19\x4c\xe1\x82\x24\xb5\x9c\x4d\x99\x51\x89\xbf\x02\xc8\x64\x42\xa5\x96\x48\xf4\x2e\x37\x76\x5a\x99\x46\xa1\x90\x1f\x89\x78\xe9\x6a\x55\x37\x69\x08\x5c\x8d\x6c\xd8\x2b\x9e\xc9\x11\xca\xf3\xc8\xbf\xf0\xae\x42\x2d\x4e\xd8\x0c\x7d\x66\x56\xd9\x57\x01\x48\x6d\x72\xda\x50\x6d\x61\x52\xbd\x1a\x50\x5a\x12\x9f\x69\x02\x37\x73\x64\xc0\x96\x91\xf2\x1a\x95\x93\x87\x21\x26\xd2\xf1\x0c\x07\xda\x1b\xaa\x2c\x98\xb2\x20\x4a\x1a\x5f\x29\xb6\x03\x46\x5f\x72\x4e\xee\x34\x44\xe8\xc0\xa3\x62\xb1\x94\x38\xe1\x71\x88\x42\x7a\xfe\x35\x46\xf1\x8d\x25\xf8\x7d\xe5\xe9\x9d\x43\x70\x8b\x1f\x79\x20\xfb\x45\x51\x6a\xbd\xd3\xf5\x4f\x2d\x90\x54\x0d\x4a\xc4\xad\xdd\xd6\x0d\x4a\x75\x6a\x56\xd8\x54\xd3\x8a\x44\x25\xd0\xb8\x97\xb7\x01\x33\x7b\x38\x7e\x35\x66\x53\x39\x5e\x3d\x58\xab\xd9\x19\x44\x3d\x3a\xaf\xeb\x7d\xef\xe9\xb8\xba\x72\x44\xcf\xda\xed\xdc\xc8\x4c\xc4\x92\xaa\x8e\xa5\x00\xe5\x12\xc5\xd7\x7f\x60\x98\xd6\xa2\x59\xd5\x45\x81\x1e\xc1\xcb\x28\x2a\x89\x1a\x5f\x13\x37\x5e\xd4\x5a\x76\xcd\x0b\x6a\x0f\x35\xd6\xc8\xbb\x78\xdb\xc8\xb3\x83\x34\x6e\x59\x3c\x92\x54\x1b\x42\xc1\x95\xf8\x65\x99\x44\x68\x62\xab\x95\xf6\x8d\xc7\xf0\xcb\xdb\xef\xde\x5e\xe8\x35\x62\x33\x23\xac\x00\x55\xad\xc5\x3c\x5e\x46\x13\x98\xc5\x30\x47\x8e\x23\xd9\xfd\x5d\xbc\x04\x81\x98\xe7\x2a\x9c\x50\x81\x40\x18\x50\x21\x34\x0c\x8e\xc7\x40\x52\x98\xa7\x69\x22\x2e\xc6\xe3\x19\x4d\xe7\xcb\xeb\x20\x8c\x17\xe3\x59\xfc\x42\xe4\x54\xa2\xf9\x51\x3d\x2a\xec\x89\x34\xa6\x57\xc1\x97\xdd\xd4\xd4\xa9\x67\x7f\x2d\x68\xf6\xd5\x44\x23\x13\xb0\x1d\x0c\x90\xaa\x12\xec\x7a\xa0\x82\xf5\xc2\xe2\x43\xf5\x14\xe4\xce\xab\xb0\x29\x24\x49\xba\x94\xc8\xee\xa6\x7a\xaa\xf1\xcf\x9b\x7f\xf7\xb8\xf9\xd7\xea\x4a\xf5\xc8\x52\x90\x7d\xc5\x02\xe7\x4e\xa3\xaf\xca\x15\xb0\x2c\xa5\x70\x9a\x6b\x84\xc5\x32\x5d\x92\x28\x2a\x98\x40\x21\xd7\x9d\xb2\x3c\x25\x29\xf8\x3f\xde\x84\xc0\x6d\xb8\xbf\x96\x59\x94\x6b\x58\x84\x50\x99\x6c\x34\x9c\xa0\x1a\xc7\x66\x09\x03\x7f\x57\x6f\x48\xd2\xd2\x51\x3d\x71\x6d\xfa\x9d\xcd\x40\xd4\xab\x0a\xd8\x8e\x73\xc8\xed\xe5\x18\x44\xf3\x61\xd2\x9e\x4d\x0b\x93\x9b\xf4\xab\x78\x91\x44\x78\xfb\x56\xc5\x44\x03\xba\xaf\xdc\x09\xbc\x2f\x21\xda\x90\x0e\xed\x98\x0c\xed\x9c\x3b\xb4\x25\x42\x0f\x91\x06\xed\x3c\x91\xd6\xd0\xdb\x58\x6b\x77\x88\x6a\xcf\x68\x4e\x28\x7f\xe8\x20\xc7\xd6\x52\x78\x21\xd6\x15\xe3\x9f\x42\x02\xe3\x4a\x2f\x5c\x46\x53\xbf\xda\xf8\xe6\x22\x6b\x79\xbc\x80\x05\x49\x1a\x5c\xed\x96\xc0\xf9\xb0\x98\xe9\x60\x6b\x6d\xbe\xf6\x45\x2d\x78\xd5\xe1\xce\xf4\x64\x83\xaf\xad\xa8\x56\x57\x6c\x79\x04\x85\xb2\x83\x2f\xaa\xbc\x41\x46\xdd\x26\x2d\xe3\x2a\xb2\x0a\x65\x2d\x48\x22\xe0\x7a\x69\x6c\x39\x7e\x66\xf1\x0d\x90\xeb\x78\x99\x82\x2b\xb0\x5c\x00\x06\xb3\x00\x68\x0a\x61\xbc\x40\x91\xdb\x1a\x81\x67\x1c\xa7\x0e\xd6\xd1\x5f\x75\xeb\x26\xcf\x74\xb2\xa0\xc4\xbc\x41\xd5\x71\xd9\xef\x82\x24\x05\xda\xd4\x89\x8d\x6d\x83\x94\x9f\x5a\xd8\xa5\xde\x75\x08\xdf\xa1\xb4\x77\x21\x7f\x67\x9a\xb5\x65\x12\x2d\x31\x32\xb7\xde\x4a\xca\x15\x89\x2a\xbb\x75\x0f\xac\x6d\xf9\xb0\xc1\xf5\x20\xec\x82\x7f\x15\x63\xde\x58\x8b\x96\xc7\xb6\xe6\x5c\x8d\x9d\xf2\x9c\x94\x68\x6e\x95\x8f\x9f\x4b\xe8\xfd\xee\xf5\xb7\xbf\xfe\x90\x1f\x9c\x50\x28\x7a\xa1\x96\xb7\xc0\xd3\xe2\xba\x86\xaa\xfc\xa6\x85\x5c\x45\x8b\xd2\x63\x74\x9b\xba\x0b\xe5\xad\x4a\x35\x96\x8d\x0c\x92\xb3\x68\x53\xe2\xd8\x45\x81\xfe\x66\xdd\x98\xf7\x51\xee\x51\x95\x7d\xe8\x3d\x2b\xdd\xc6\xb2\x91\x0b\x8f\xc5\xea\x11\xab\x08\x73\xe1\x8a\x39\x15\x03\xdd\x0a\x11\x4e\xfc\x2e\xca\x3b\x3d\x4f\x43\xde\xe1\x23\xc5\xf3\x4d\xc4\x75\x7d\x3d\xda\x31\xe3\xd2\x33\x26\xa3\x91\x63\xcc\x96\xac\xe2\x7e\x36\xb2\xd4\xc1\x18\x23\x18\x1d\x6a\xef\xea\xbc\x7b\xd5\x40\xce\x07\xdb\xbd\xaa\xed\x8f\x7a\x2a\x9c\x4d\x15\xc5\x56\xfb\xb6\xad\xc9\x72\xcb\x30\x9d\x07\x69\xa4\xa0\xe6\x97\xae\x85\xc9\xb1\xca\x92\x5d\x8b\x92\x4d\x51\xcf\xa1\x10\x73\xce\xae\xfd\x99\x96\x9d\x99\x9a\xae\x1b\x01\x35\xa8\x59\x53\x2d\x61\xda\x92\xc7\x75\x59\xe7\x83\xd0\xb7\x67\xe2\xf6\xde\x89\x5b\x77\x9d\x64\x93\xb5\x2e\xbb\xda\xc8\xa6\xba\x51\xce\x41\xa1\x76\x23\x4f\x1d\x66\x29\xf3\x58\xa9\x11\xbd\x0b\xac\x8f\x0d\x15\x0d\x4a\x97\xaa\x9d\x1d\xd2\xf6\x89\xb7\x21\x26\xa9\xda\x89\xa7\xe5\xdd\x91\x3a\x95\xca\x91\x4d\x90\x53\x36\xad\x1d\x1a\x51\x55\x20\x15\x90\x20\x97\x93\xc5\x09\x5c\xdf\x81\xe5\x97\x9e\x63\xa7\x4e\x26\xd7\x9c\xd1\x81\xd8\xcb\x4e\x90\xe1\x43\x31\x7d\x60\xc2\x42\x8a\xcd\x10\xb6\x05\xdc\x9c\xd1\xe5\x8c\x2e\x27\x87\x2e\xd6\xf3\x46\x7d\xdc\xd1\x8b\xdb\xce\x8c\x87\x73\x5c\x10\xcf\xa1\x71\x93\x92\xcc\x2f\x0d\x1a\x2f\x89\x68\x7b\x33\x35\xf5\x6c\x16\xab\xad\xaf\x8b\x4b\x63\xa1\x7b\x61\xcc\x44\x0a\x83\x46\xc2\x58\x7b\x55\xc1\x78\xda\x3e\xf5\x2b\x53\xff\xc2\x8b\x84\x7a\x99\xa1\x78\xaf\xc1\xb6\x4a\xd9\xd7\xff\x6d\xe8\xa7\x76\x1b\x2e\x9d\x7d\xd8\xd9\xe8\xd0\x4a\x1d\x7b\xe5\x99\x5a\xa5\xc3\xde\x8a\xa8\x33\x53\x21\x59\x60\x83\x81\x85\xdf\x3f\x6a\x10\xcf\xd6\xbd\xe9\x92\x85\x40\x19\x4d\x07\x43\x65\x9e\xf2\x51\x39\xa9\xdf\x3f\xd6\x56\x74\x82\x1c\xa7\x53\x9c\x7c\x50\x03\x48\x35\x6a\xc9\x2a\x60\xf8\x43\xc4\x2c\xf8\x95\x2d\x08\x17\x73\x12\x0d\x7e\xff\x78\x7d\x97\xe2\xe0\x53\x96\xa9\x3b\x5a\xbb\x9f\x86\x23\xf8\x2b\x47\x67\xad\x93\x10\x46\xc3\x01\x72\x3e\x2c\x7c\x43\xce\xea\x3f\x23\x58\x55\x07\xbc\xa4\x74\x59\x39\x7f\xf7\x14\x2f\x81\x24\x09\x32\x55\x9e\x3b\x5b\x8c\x60\x95\x0f\xb0\xee\xe5\x1a\x18\xb8\x98\x85\xca\xe1\x2d\x34\x37\x5f\x00\x29\x5c\xe1\xf5\x6d\x12\xf3\x14\x27\xbe\x03\xe2\x75\x9e\xcc\xb8\x98\xc3\x04\x6c\x66\xce\x13\x92\xce\x47\x10\x95\x38\x97\x5b\xfb\xa8\x32\x3c\x1d\x1c\x75\x2c\x6c\x44\x49\xcf\x99\xb7\xda\x74\x36\xaf\xf9\x10\x54\xe9\xa9\x16\xc1\x11\x15\x1c\xc2\x16\x52\x8e\xbc\x2b\xd6\x09\x26\x0d\xf6\x61\xdd\x72\xd6\xba\xf4\x61\x9f\x13\x54\x8d\xea\x9e\xb0\x97\x2b\x18\xd5\x58\x77\x7f\x30\xc5\x3d\xaa\x53\x54\x03\xb5\x7a\x86\x6e\xd6\xcd\x3d\x9e\x57\x74\xb0\xcf\xfa\x9f\x39\xcd\xbf\x7e\xb9\x8b\x03\x68\xc9\x4e\xc4\x0b\xf4\x2b\x1e\x87\x75\x05\x3d\xcd\x03\xf8\xc3\xe6\x53\xae\x56\x68\x2d\x42\x88\x41\x1b\xc8\x2a\x5d\x78\xfd\x48\x9f\x83\x38\xa4\x1f\x9d\x62\x48\xa9\x26\xda\xea\x3d\xba\xd9\x56\xde\x73\xec\xd0\x51\x9d\x56\x39\x0d\xcf\x39\xbc\xd3\xe8\x19\xee\xe2\x34\x8d\xfc\xb8\xfc\x3c\x1e\x43\xc9\x99\x1a\x47\xe0\x15\x4f\x96\x65\x30\x5f\x2e\x08\x33\x85\xd0\x0b\xed\x49\x22\x0e\xa1\x59\x69\x2d\xdf\x51\x11\xca\x44\x84\x29\x71\xd4\xe5\x86\x42\xea\x27\xa7\xf6\xb5\x2e\x9b\xa1\x96\x86\x33\x5d\xa4\xc1\x7b\x9c\x51\x91\xf2\x3b\x73\x35\x2b\x4f\x57\xd7\x7a\x3d\x2f\x4b\x6b\x56\x38\x2e\xfa\x34\x7f\x53\xb8\xdc\x61\x56\xb8\x94\x1f\x61\x0b\xe3\x45\x12\x0b\xa5\xab\x1c\xe2\x6a\x15\xdc\x86\x2d\xed\xa2\x6e\xab\xf6\xec\xed\x22\xae\xda\xfd\x51\x4d\xab\x8d\xfe\x7a\x95\x3d\xf4\x14\x63\xce\x52\xbe\x3b\x2b\xad\x77\x6d\x64\xe0\x34\x56\x3a\xe6\xdf\xcb\x8e\xf3\xd5\xe9\x2e\x1a\xec\xf5\x6a\x5d\x97\x6d\x5a\xb9\xd6\x1a\x13\x39\x8a\x11\x14\x30\x5b\xfe\x75\xdf\x34\xad\xf3\xdd\xbe\xf7\x48\x8c\x7d\x84\x61\xc7\x17\x54\x28\x03\xc2\x0a\xf6\x09\x6e\xe6\x34\x9c\x03\xcd\x8f\x26\xe4\xfb\x46\xc5\xa9\x80\xda\x89\xc8\x6e\x87\x0b\x1d\x33\xd8\xe2\x24\xd1\x1e\x07\x69\xf2\x17\x3e\x37\xac\x4f\xeb\xda\xf8\xf6\x37\xaa\xea\xbe\xab\x91\xb5\x4f\xa3\x26\xfe\x60\xc2\xe3\xe4\x1d\x09\x3f\x13\xe9\x05\xb9\xcf\x0e\xb7\xd9\x04\xeb\x30\x25\xdf\xde\x7b\x17\x47\x6d\xf7\xd1\xc3\xfb\xe7\xf1\x7c\xb3\x93\xa2\x5c\x51\xef\x64\xbc\x70\x2b\x3a\xa9\xab\xe7\x79\x05\xcd\x1b\x48\x19\x21\x55\x0f\x6b\x39\x8e\xeb\xa5\x2d\xeb\xe4\xae\x70\xd5\x0c\x55\x2a\x3a\xb0\x69\x89\xa1\xbd\x2c\xbd\x2a\x8e\x56\xbf\xb8\xb1\xff\x01\xbe\x7e\x7f\x04\xfd\xeb\x78\x72\xd7\x1f\xb9\x7a\xd8\x73\xa2\x79\x4a\x18\x21\x93\xad\x86\xf0\x4f\xf8\xba\x91\xc8\xc5\x5c\x04\xaf\x8a\x2c\x00\x2b\xcf\x7a\x2d\xef\xc8\xa7\x82\x20\x18\xba\x92\xbd\x4e\xfe\xdd\xe6\xba\x36\xd0\x07\x3e\xa6\x41\x97\xb7\x12\xe1\x9c\x9a\x94\xc3\x3f\xe5\xd2\x69\x0b\x0d\x38\x6b\xaa\xee\xcf\x9b\xc5\x56\x3d\x95\xea\x42\x10\x43\x1b\x49\x5c\x6f\x22\x8b\x61\x26\xc7\x96\x8d\xca\xac\xbf\xce\x23\x43\x2b\x97\xec\x66\x45\x8c\xab\x7a\x84\x7d\xd9\xe6\xfd\x46\xea\xce\x47\x83\x83\x93\x86\x06\x2f\x2d\x07\x33\x41\xa8\x03\xa1\xd4\x56\xe5\x34\x28\xa5\x9d\x28\xa8\xad\x19\xa8\x27\x59\x42\x77\x77\xb3\xdd\x6a\x6b\x3b\xc1\xec\x46\xd4\xba\x8d\x76\x13\x7d\xfb\xf4\xd8\xdb\xae\x7a\x68\x47\xd0\xf6\x87\xb7\x64\x7a\x4f\xd0\x31\xb7\xa7\x86\x8b\xdf\x42\x29\x7d\xb4\xf8\x6a\x7b\x6a\xf9\x0b\x2b\x27\x47\x16\x77\x5c\xd9\x03\x7b\xac\xb7\x8e\xf5\xb5\x38\xb1\xec\xc8\x29\x7f\x77\x67\xf7\x4c\xee\x09\x25\x4f\x8f\xd3\xfb\xb7\x71\x7c\x7b\x0d\x7d\x95\x62\x13\x0c\x9a\x0d\x0e\x00\x0b\x4d\x8b\x7c\x34\x51\xdd\x89\x12\xf6\xf7\xae\x3f\xb3\x62\x6f\x42\x59\x1b\x50\xc5\x23\x46\x02\xb9\x5d\xbe\xf0\xe4\xb7\xa9\xba\x4e\x7f\x87\x34\x61\xb7\x2d\xad\x93\x04\x8a\xa7\xbb\x0f\xd6\x71\x09\x8f\xe1\xeb\x0d\xde\x7b\x7f\x6a\xd4\xbb\x8f\x76\xca\xc6\xd5\x65\x6f\xcc\x54\x55\xed\xb5\x1c\x8d\x25\xbb\xff\x2c\x54\xed\xbd\x1c\xff\xc2\xd5\xd8\xdd\x67\xa6\x85\xab\x17\x3d\xcf\xe7\x3d\xef\xf5\x67\x40\x9c\x6f\x1f\x6e\x7e\x67\xa4\x4b\xd6\xee\x27\xf7\x3d\x9b\xb1\x1b\xde\x64\x39\xf8\xc6\xe4\x99\x40\x3d\xc9\x1a\xa0\x60\xeb\xa4\xd9\x9d\xb9\xba\x53\x0d\xf3\xf7\x98\xd5\x1f\x93\xaf\x3b\x13\x76\x67\xc2\xee\x4c\xd8\x1d\x80\xb0\x6b\x71\xdb\x16\xd2\xee\x4c\xdb\x3d\x8d\x90\xfd\x38\x31\xe0\x4c\xdb\x3d\x4c\x80\xf7\x60\x45\xf3\x4a\x37\xf2\xae\x7b\x22\xbf\x15\x35\xf7\xe4\x92\xf8\x7b\x62\xe6\xba\x90\xa7\x8f\x13\x2f\xce\xec\xdd\x91\x5c\xbe\x77\x26\xdc\x8e\x4c\xb8\x1d\x93\xd1\xf1\xfc\xf0\xbe\xfd\x6f\x88\xb6\x49\xf3\x8e\x5a\xb6\x3d\xa2\x6c\xae\x63\xd5\x76\xae\xcf\xfe\x3c\x09\xda\x81\x2a\xb6\xca\x7d\x5b\xa1\xb7\xb9\x30\x5d\xd6\xad\x1b\x30\xfa\xd7\xae\x62\x6f\xed\x3b\xae\xb3\xb0\xe5\xff\xe6\xb0\xfe\x7d\x50\xdb\x3f\xe2\x08\xfc\xb2\x1b\xbf\xa2\xd5\x0e\x9a\x4e\x18\x69\xe2\xa4\xf7\xfd\xc8\xea\xd3\xff\x02\x00\x00\xff\xff\x25\x37\x04\x97\x27\x79\x00\x00") +var _templatesSchemavalidatorGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5d\x5b\x73\xdb\x36\x16\x7e\x5e\xff\x8a\xb3\x9e\xec\xae\x94\xba\x54\x1f\x3a\x7d\x50\x37\x3b\x93\xa6\x69\xeb\xd9\xa6\xc9\x34\x4d\x1f\x36\x93\xd9\xc0\xd4\x91\x84\x86\x02\x19\x80\x94\xed\xd5\xe8\xbf\xef\x00\xe0\x05\x04\x01\x8a\xd4\xc5\x96\x5d\xf9\x49\x22\x41\x5c\xce\xe5\x3b\xe7\x7c\x00\xe5\xd5\x0a\x26\x38\xa5\x0c\xe1\x3c\xe1\x74\x41\x53\xba\xc4\x29\xc5\x68\xb2\x24\x11\x9d\x90\x34\xe6\xe7\xb0\x5e\x9f\x01\xac\x56\x40\xa7\x10\xfc\x8a\x9f\x33\xca\x71\xa2\x2f\xd2\x29\x20\xe7\x30\x7e\x06\x79\x73\x2c\x1b\xe8\xf6\x84\x4d\x60\x80\x9f\x21\xf8\x31\xfe\xed\x36\x41\x38\x17\x29\xa7\x6c\x76\x3e\x84\x01\x8b\x53\x08\x2e\xc5\x2f\x59\x14\x91\xab\x08\x87\xb0\x5e\xbf\x55\x37\x57\x2b\x40\x26\x07\x18\xe4\x63\xbe\x21\xe9\x1c\xd6\xeb\xd5\xca\xfc\x88\x91\x40\x58\xaf\xcf\xcf\xcb\xe6\x17\x72\x8e\x09\xa7\x2c\x9d\xc2\xf9\xdf\x3e\x9f\x43\xf0\x73\x1c\x92\x94\xc6\xac\xb8\x49\xa7\x20\x47\x1d\xc4\x5c\x8e\xfc\x9c\xc5\xec\x76\x11\x67\xc2\x9e\x86\x1c\x28\x9f\xaf\x9e\x84\xee\x7f\xb5\x0a\x7e\x27\x51\x86\x2f\x6f\x12\x8e\x42\xe8\x7e\xbb\xf7\x3a\x2c\x3b\x1a\x7e\xab\xa4\xf6\xd7\x67\xc0\x68\x04\xab\x33\x00\x00\x8e\x69\xc6\x99\xbc\x7e\x06\x90\xcb\x5b\xb7\xae\x64\xff\x8a\xb2\x9f\x91\xcd\x94\x04\xdc\xc2\x2f\x5b\xec\x57\x74\x5a\x69\x45\x9f\xd5\xb2\x60\xbd\x7e\xda\x2e\x9e\xa1\xec\xb9\x36\xf1\xad\x17\x4f\x6e\x36\x2d\xbe\x68\x71\x64\x8b\x37\x26\xbe\xed\xe2\xdf\x90\x34\x45\xce\xbc\x4b\xcf\xef\x1f\xd1\xc2\x3f\xae\x56\xc6\xac\x3f\xee\x60\xf2\x74\x91\x2d\xda\x0c\x5e\xde\xd7\xad\x25\xce\xbc\xbd\x26\xb3\x19\x72\x0d\x36\x94\xa5\x38\x43\x85\x60\x97\x2c\x3d\x28\xae\xb4\x8d\x4d\xf5\xd8\xba\xe3\x69\x14\x93\x6a\x2a\xdf\x7c\xbd\x93\x57\xe5\xb2\x51\x5f\x5f\xde\x84\x51\x26\xe8\x12\xab\xeb\x3b\xf8\x5a\xbb\xd4\xf5\xfd\x3f\xa7\xd4\x4b\xd9\x58\x52\x2f\xaf\x6f\x2d\xf5\x2c\x4a\x69\x12\xe1\xeb\xa9\x5f\xf0\x65\x93\xfd\x4a\x53\x89\x67\x27\xa9\x98\x73\xdf\x56\x00\x2f\x59\x61\x73\xa3\x91\x5c\x73\x86\x80\x2c\x5b\xd4\x44\xb1\x5a\x05\xbf\x62\x88\x74\x89\xfc\x17\xb2\x90\xf3\x0b\x0a\xe9\xc8\x15\x12\x11\x92\x88\xfe\x0f\x21\xc8\xef\x4a\xc1\xbc\xcd\xa6\x53\x7a\x03\xeb\xb5\x1c\xe0\x10\x66\xd8\x4f\x60\xfd\xa5\xf3\x65\x91\x4a\x05\x97\xe2\x45\x26\xd2\x78\xf1\x43\xcc\x17\x0a\x5d\xcb\x3c\xea\x6d\xca\x91\x2c\xaa\xbc\xea\x3b\x22\xf0\x9b\xaf\x87\xba\x0b\xd5\x61\x8a\x8b\x24\x22\x29\xc2\x79\x2e\x31\x1a\x33\xdd\xdb\x54\xf5\x76\x0e\x41\xa9\x8e\x7c\xf0\xea\xd3\xd9\x6a\x55\xe4\x89\x22\xa2\x21\x76\x4a\x0f\x5b\x13\xc4\xbd\x2b\xa2\xa3\xac\x2d\x69\xfb\xac\x51\x66\x73\xaf\x28\xbb\x4c\x71\x21\x14\x22\xea\x4f\x95\x38\x83\x4b\x36\xc1\x9b\xdf\x09\xd7\x33\x6e\x9a\xde\x5b\xf9\x65\xfc\x0c\x28\x93\xae\x15\xa1\x0c\xcf\xae\x39\x0e\xbd\xa1\xaf\x36\xa4\x3b\xfa\xa9\x26\xfb\x17\x65\x97\xb5\x15\x41\xa8\x98\xe5\x0e\xc2\x6e\xc8\xd7\x1d\x74\xee\x7d\xb1\xd5\x2c\x77\x59\xec\x3b\x46\x3f\x67\xb8\x69\xbd\x46\xab\x7d\x2f\x79\xbf\x9e\x62\xe0\xb6\x42\xee\x69\xcc\x41\x61\x84\xb5\xb2\xbe\xd0\x7d\x08\xb4\xde\xf3\xca\x2d\x4c\x28\x71\x5a\xd7\x82\xf2\x66\x85\x88\xf9\xf7\x9f\x88\xf8\xbd\x84\x5f\x51\x5c\xd5\x78\xad\x72\x98\xf2\xca\xf3\x88\x12\x81\x93\x12\xd2\xf3\xcb\x97\x2c\x45\x3e\x25\x21\xda\x37\x8a\x08\x90\x4f\x07\x94\x22\x56\x2b\xd3\xbc\xa5\x1a\xbe\xfa\xd6\xbe\xf8\x4f\xf0\x83\x93\xdd\xf8\x8b\x2f\x4a\x11\xc9\xf5\x5e\xd3\x74\x6e\x89\xc1\x12\x85\x19\x1b\xf5\x7c\x0b\x89\x54\xb1\xea\x15\x49\x64\x9b\xd7\x4b\xe4\x9c\x4e\x70\x68\x76\xa5\x2c\x48\x5c\x93\x59\x70\x29\xfe\x83\x3c\x1e\x78\x90\x1e\x56\xd2\xf6\x64\x87\x3c\xef\xdf\xe8\x02\x20\x8c\x59\x4a\x59\x86\xc6\xc5\xfa\x74\x4b\xd5\x16\x97\x8c\x78\x99\xf0\x38\x41\x9e\xde\x1a\x41\x2f\xa8\x1a\x37\x9e\xae\xcc\xa1\x16\xc3\x73\x73\x35\x6d\x25\xa7\x0c\xb4\xa2\x61\xc0\xb0\xb9\xb4\x9a\xcf\x68\x76\x62\xf4\x14\x12\x8e\x4b\x64\xa9\x80\x19\x32\xe4\x24\xc5\x09\x84\xf1\x04\x21\x8d\x21\x24\x51\x04\x34\x15\x18\x4d\xc7\x90\xce\xa9\x00\x2a\x80\xa3\x40\xbe\xc4\x89\xb2\x09\x92\x8f\x97\xde\x26\x28\xe0\xe9\xa8\xb6\x12\xaf\xda\xfc\x6a\xa2\x53\x4f\xf8\xb5\x9d\xaa\x21\xa9\x1a\x38\x34\x9f\x0f\x72\x4f\xc1\x81\xce\x50\x84\xdb\x57\x55\x3f\x4b\xbc\x80\xf8\x93\xec\x0a\x39\x0f\x06\x4f\x91\xf3\x98\x8b\xa0\xf2\xb5\xe1\xb7\xf2\xfe\xca\x30\x80\xdc\xc7\x97\x58\x8e\x23\x65\xdc\x13\x72\x86\x67\x4d\x7b\xb2\xc0\xa3\xba\xb5\xa5\x80\x3d\x96\xd6\xb4\x30\x3b\x6b\x33\xd8\xbd\x05\x49\x6a\x39\x9b\x32\xa3\x02\x7f\x05\x90\xc9\x84\x4a\x29\x91\xe8\x8d\x36\x76\x5a\x99\x46\x2e\x90\x9f\x88\x78\xee\x6a\x55\x37\x69\x08\x5c\x8d\x6c\xd8\x33\x9e\x79\x52\x4c\x62\xa2\x0c\x40\x48\x15\xba\x89\xb6\x27\x9f\xf0\x56\xa2\x90\x6c\xe0\x1c\xe4\xdf\xfa\x7e\xde\xb9\x86\xbf\x4d\x4d\x65\x6f\x9c\xb0\x19\xfa\x6c\xb8\x32\xde\x1c\xed\xda\x84\x60\xc7\x01\x0b\xf0\xea\x85\x82\x52\x81\xf8\x44\x13\xb8\x9e\x23\x03\x96\x45\xca\x25\xa5\xbf\x92\x30\xc4\x44\x7a\xb5\xe1\x9d\x4d\x1c\x6c\x88\x6e\xbd\x7e\x6f\xc8\x69\xbd\xfe\xd0\x06\x8b\x16\x24\x5a\x70\x28\x0d\xbd\x58\x85\x03\xb2\x9f\x73\x4e\x6e\x4b\x38\x2a\x83\x9c\x8a\xfb\x72\x01\x09\x8f\x43\x14\x12\x65\xae\x30\x8a\xaf\xad\x75\xdc\x59\x4d\xd0\x41\x42\x1e\x48\xf1\xfa\xb0\x27\x5c\x7c\x99\x17\x82\x6f\x0a\x16\xbd\x1e\xc4\xaa\x06\x05\xda\xd7\x6e\x97\x0d\x0a\xf1\x96\x2c\xb2\x29\xb6\x25\x89\x0a\x90\xeb\xb4\xb6\x06\xe2\xed\x80\x41\xd5\x14\x9a\xb2\xf2\x8a\xc5\x52\x76\x67\x3c\xf7\xa8\xa0\xae\x86\x9d\x97\xe3\xea\xca\x11\xc8\x6b\xb7\xb5\x0d\x9a\xe0\x29\xad\x2d\x96\x13\x28\x34\x16\x5f\xfd\x81\x61\x5a\x0b\xac\x55\x17\x39\xd6\x04\xcf\xa3\xa8\xe0\x79\x7c\x4d\xdc\xe8\x52\x6b\xd9\x35\x45\xa9\x3d\xd4\xd0\x91\x57\x79\x7d\xe6\xb3\xc5\x6c\xdc\x73\xf1\xcc\xa4\xda\x4f\x0a\x2e\xc5\x6f\x59\x12\xa1\x89\xc4\x56\x06\x3a\x1a\xc1\x6f\xaf\xbf\x7f\x3d\x2e\x75\xc4\x66\x46\x84\x03\xaa\x5a\x8b\x79\x9c\x45\x13\x98\xc5\x30\x47\x8e\x17\xb2\xfb\xdb\x38\x03\x81\xa8\xd3\x26\x4e\xa8\x40\x20\x0c\xa8\x10\x19\x2a\x95\xcb\x4e\x07\x53\x09\x84\x63\xa0\x6c\x89\x22\xa5\x33\xb9\xe0\x74\x8e\x10\x12\xa1\xf2\x2f\x8e\x8b\x78\x29\x2f\x91\x14\xc2\x78\xb1\x40\x96\x8e\xc1\x9e\xa9\x1e\x9b\xfd\x43\x35\x41\xa0\x0c\x16\x24\x11\x01\xbc\x4b\x84\xca\xe2\x4d\xe3\xa2\x02\x18\xe2\x44\x26\x6c\x31\xcc\x32\xc2\x27\x40\x66\x84\x32\x91\xea\x79\x1a\x76\x36\x1a\x01\x49\x61\x9e\xa6\x89\x18\x8f\x46\x33\x9a\xce\xb3\xab\x20\x8c\x17\xa3\x59\xfc\xa5\xd0\x3c\xa9\xf9\x51\x2d\x4c\xd8\x62\x6e\x08\xbf\xc2\x5e\xbb\xa9\xa9\x71\xcf\xe6\x61\xd0\xec\xab\x09\x9d\x66\xb4\x71\x71\x5c\x32\x4f\xb6\x0b\xa7\x2a\x26\xe5\xfe\x18\xaa\xa7\x40\x43\x8b\x02\xd2\x90\x24\x69\x26\xc3\x12\x91\x01\xa9\xc0\x65\xcb\x2f\x0b\x64\x3e\xed\x6c\xde\xd1\xce\x66\xab\xa3\x37\x92\xa7\x36\x66\xb3\xf4\xc9\x31\x14\xcd\xd4\x93\x96\xfd\xe4\x8e\x7e\x85\xb0\xc8\xd2\x8c\x44\xd1\x2d\x60\x41\xdb\x4b\xd7\x53\x49\x17\x47\x11\x47\x4b\xe4\x4d\xd8\xee\x43\x9d\xb6\xac\xad\xd0\x6c\x9e\x05\xc8\xfc\xa9\xe1\x1a\xd5\x38\x36\xc9\x1a\xf8\xbb\x7a\x45\x92\x96\x8e\xea\x79\x7f\xd3\x1b\x6d\x02\xa7\x5e\x94\x41\x3f\xca\x46\x5b\xd1\x21\x58\xf6\x83\x24\x72\x9b\xf4\xa4\xed\xfe\x45\xbc\x48\x22\xbc\x79\xad\xc2\xba\x11\x7d\x2e\xdd\xe5\x90\x2f\xc5\xdb\x90\xe0\xed\x27\xbd\xdb\x3a\x1b\x6a\x4b\xed\xee\x23\xb1\xdb\x7a\x21\xad\xc9\x44\x43\xf5\xee\xb0\xd6\x9e\xa3\x1d\x51\x46\xd4\x61\x1e\xbd\x67\xe1\x85\x65\x57\x5e\x70\xaf\x29\xd9\x9e\x92\x1e\x57\x4a\xe2\x32\x9a\xfa\xd5\xc6\x37\x17\x13\xce\xe3\x85\x4c\xec\x1a\x44\x78\x4f\x58\x3d\x08\xa2\xee\x42\x85\x37\x37\x28\xcd\xd0\x56\x47\x3f\xd3\x93\x0d\x32\xbc\xe2\xb1\x5d\x91\xe7\xe0\xcc\x40\xe7\xd5\x7b\x03\x88\x83\x8c\xab\xbc\x41\xc6\xe4\x26\xe7\xe5\x2a\x1b\x73\x61\xc9\xf4\x1f\xae\xb2\x14\x26\x31\x0a\x15\x24\x3e\xb1\xf8\x1a\xc8\x55\x9c\xa5\xe0\x8a\x33\x63\xc0\x60\x16\x00\xd5\x15\x84\xd0\xb6\x46\xe0\x09\xc7\xa9\x83\xd2\xf5\xd3\x0a\x65\x93\x27\x65\x2a\xa1\xa6\x79\x8d\xba\x34\xc9\xfb\x5d\x90\x24\x47\x9b\x3a\x93\x53\x8f\x59\x0e\xa9\x5a\x41\xca\xcf\x9d\x6c\x53\xc1\x3b\x26\xdf\x81\xac\x70\x21\x7f\x67\x0e\xbb\x65\x11\x2d\x31\x52\x5b\x6f\x35\xcb\x25\x89\x2a\xbb\x75\x0f\x5c\xda\xf2\x7e\x83\xeb\x5e\xf8\x12\xbf\x16\x63\xde\xd0\x45\xcb\x63\xbd\x09\x6d\xe3\x18\x82\xa6\x59\x9a\xe7\x10\x46\x4f\x25\xf4\x7e\xff\xf2\xbb\x77\x3f\xea\x93\x24\x0a\x45\xc7\x4a\xbd\x39\x9e\xe6\xd7\x4b\xa8\xd2\x37\x2d\xe4\xca\x5b\x14\x1e\x53\xb6\xa9\xbb\x90\x6e\x55\x88\xb1\x68\x64\x90\xbc\x79\x9b\x02\xc7\xc6\x39\xfa\x9b\xb5\xa6\xee\xa3\xd8\x00\x2c\xfa\x28\x37\x04\xcb\x36\x96\x8d\x8c\x3d\x16\x5b\x8e\x58\x45\x98\xb1\x2b\xe6\x54\xf4\x7e\x2b\x44\x38\xf1\x3b\x2f\x09\xcb\x75\x1a\xf3\x1d\x3e\x50\x3c\xdf\x44\xdc\xd7\xf5\xd1\x8e\x19\xcf\x3c\x63\x32\x1a\x39\xc6\x6c\xc9\x2a\xee\x66\x97\x50\x51\x57\x46\x30\xda\xd7\xc6\xe0\x69\x6b\xb0\x81\x9c\xf7\xb6\x35\x58\xdb\x7c\xf6\x54\x38\x9b\x2a\x8a\x5e\x9b\xe2\xad\xc9\x72\xcb\x30\x9d\x07\x69\xa4\xa0\xee\x03\x73\xed\x85\xc9\xa1\xca\x92\x6d\x8b\x92\x4d\x51\xcf\x21\x10\x73\xcd\xae\x0d\xa8\x96\xad\xa7\x9a\xac\x1b\x01\x35\xa8\x59\x53\x2d\x61\xea\xc9\xfd\xba\xac\xf3\x5e\x28\xdf\x13\xd9\x7b\xe7\x64\xaf\xbf\x4e\xea\x78\x74\xb5\x2f\x03\xeb\xc6\x3e\x07\xed\xda\x85\x70\x75\x98\xaa\xcc\x6d\xa5\x94\xca\xad\xf0\xf2\x9c\x56\xde\xa0\x70\xb3\xda\x61\xad\xd2\x66\xf1\x26\xc4\x24\x55\xa7\x13\x68\x71\xf7\x42\xed\x20\x71\x64\x13\xe4\x94\x4d\x6b\xa7\x74\x54\x65\x48\x05\x24\xc8\xe5\x52\x71\x02\x57\xb7\x60\xf9\xaa\x69\xe0\x9b\xb8\x5f\x73\x45\x7b\x22\x38\x3b\xc1\x88\x0f\xd9\xca\x13\x2a\x16\x7a\x6c\x86\xb5\x1e\x10\x74\x42\x9c\x13\xe2\x3c\x40\xc4\xa9\x57\xd2\x1d\x7d\xbb\xed\xe8\x7e\x38\xc7\x05\xf1\x9c\xdd\x37\xc9\x4b\x7d\x69\xd0\x78\xbf\xa6\xb4\x42\x53\x52\x4f\x66\xb1\xda\x42\x1b\x3f\x33\xd4\x7f\x16\xc6\x4c\xa4\x30\x68\xa4\x96\xb5\xb7\x3c\x8c\xa7\xed\xc3\xd7\xb2\x48\xc8\x7d\x4b\xa8\xf7\x40\xf2\x57\x42\x6c\x5b\x95\x7d\xfd\x65\x43\x3f\xb5\xdb\xf0\xcc\xd9\x87\x9d\xb7\x0e\xad\x24\xf3\xac\x38\xda\xac\x64\x78\xb6\x24\xea\x74\x59\x48\x16\xd8\xe0\x6a\xe1\xfd\x87\x12\xda\x57\xeb\xb3\x69\xc6\x42\xa0\x8c\xa6\x83\xa1\x32\x5a\xf9\xa8\x5c\xd4\xfb\x0f\x35\x8d\x4e\x90\xe3\x74\x8a\x93\xb7\x6a\x00\x29\xc6\x72\x66\x15\x5c\xfc\x21\x62\x16\xbc\x63\x0b\xc2\xc5\x9c\x44\x83\xf7\x1f\xae\x6e\x53\x1c\x7c\x5c\xad\xd4\x9d\x52\xba\x1f\x87\x17\xf0\x77\x8e\xce\xaa\x28\x21\x8c\x86\x03\xe4\x7c\x98\x7b\x8c\x5c\xd5\x7f\x2f\x60\x59\x1d\x85\x93\xb3\x5b\x15\xeb\x77\x2f\xf1\x19\x90\x24\x41\xa6\x0a\x79\x67\x8b\x0b\x58\xea\x01\xd6\x67\x5a\x02\x03\x17\x07\x51\xc1\x80\x85\xf1\xe6\x5b\x34\xb9\x2b\xbc\xbc\x49\x62\x9e\xe2\xc4\x77\x4e\xbf\xce\xa8\x19\x17\x35\x78\xc0\x66\x8e\x3d\x21\xe9\xfc\x02\xa2\x02\xfd\xb4\xb5\x5f\x54\x86\x57\x86\xcc\x32\x42\x36\x62\xa7\xe7\x74\x60\x6d\x39\x9b\x75\x3e\x04\x55\xa4\x2a\x25\x38\x62\x85\x9c\xec\x0b\x22\xd0\x9a\x70\x3e\xd3\x0b\xaf\xd6\x8c\x17\x96\x54\x17\x97\xb0\x5e\x4f\x49\x24\xb0\x12\x5d\xca\x33\xec\x07\xb8\x06\xb7\xb1\x6e\x39\x26\x5f\xf8\xbd\xcf\x71\xaa\x46\x75\xef\xd9\xc9\x7d\x8c\x5a\xaf\xbb\x0f\x99\xd3\x3d\xa8\x23\x55\x03\xb5\x7a\x53\xd9\xac\x9b\x4b\x3d\xad\xc8\x66\x9f\xc7\x3c\x71\xba\x4c\xfd\x72\x17\xa7\x29\x67\x76\x24\x9e\x53\xbe\x9d\xb3\x7f\xf7\x31\x94\x70\xe7\x3e\xb4\xf9\xdc\xb1\x15\xc2\xf3\x50\x65\x10\x19\x09\x8f\x13\xe1\xf5\xbd\xf2\xdc\xc6\x3e\x7d\xef\x18\x43\x57\xb5\xd0\x56\x8f\x2b\x9b\xf5\xf2\xb8\x43\x87\xa8\xea\x74\xcd\x71\x78\xdb\x61\x1c\xcd\x90\xfd\xe1\x1d\xad\x91\xbb\x17\x9f\x47\x23\x28\x98\x5f\xe3\x2d\x09\xc5\xf6\xad\x56\x30\xcf\x16\x84\x99\x93\x2e\x8d\xc3\x93\xe0\xec\x43\x1b\x52\x14\xdf\x53\x11\xca\x24\x89\xa9\xe9\xa8\xcb\x0d\x01\xd6\x4f\x87\xed\x6a\x91\x36\xcf\x2e\x8d\x6d\xba\x48\x83\x5f\x71\x46\x45\xca\x6f\x4d\x0b\xa8\xd0\x41\x5d\x3b\x3b\xf3\x72\xcd\xe6\x9e\x93\x8b\x04\xd6\x2f\x80\x17\xfb\xe4\x0a\xcb\xf4\x31\xbd\x30\x5e\x24\xb1\x50\xb2\xd2\xb0\x58\xab\x39\x37\x95\x7f\x5a\x0d\xd5\xc9\x03\xbb\xec\xac\xf6\xb0\x54\xd3\xea\xb8\x42\x9d\x17\xf0\x15\x8a\x4e\xf2\xa1\x3b\xb7\x5e\x16\xa9\x32\x40\x1b\x9a\x8e\xf9\x0f\xb2\x63\xad\x9d\xee\x53\x83\x9d\xde\xbe\xec\xb2\xd9\x2c\x75\x5d\xe2\x28\x47\x71\x01\x39\x34\x17\x7f\xdd\xb7\x7e\xeb\xac\xbd\xef\x55\x23\x63\x37\x64\xd8\xf1\x1d\x26\xca\x80\xb0\x9c\x2f\x83\xeb\x39\x0d\xe7\xea\x40\x75\x9c\xe6\xbb\x5f\xf9\xd9\x86\xda\xa9\xcf\x6e\x07\x28\x1d\x2b\xe8\x71\x1e\x6a\x87\xe3\x40\xfa\x9d\xe0\x0d\xfa\x69\xd5\x8d\x6f\x97\xa6\x62\x1e\xba\x1a\x59\xfb\x32\x6a\xd3\x1f\x4c\x78\x9c\xbc\x21\xe1\x27\x22\xbd\x40\xfb\xec\xb0\xcf\x56\x5e\x87\x25\xf9\x4e\x10\x74\x71\xd4\x76\x1f\xdd\xbf\x7f\x1e\xce\x37\x3b\x09\xca\x15\xf5\x8e\xc6\x0b\x7b\x51\x5d\x5d\x3d\xcf\x3b\x51\xdd\x40\xce\x11\x52\xf5\x70\x39\x8f\xc3\x7a\x69\x8b\x9e\xdc\x95\xb4\x5a\xa1\x4a\x5f\x07\x36\x65\x32\xb4\xd5\x72\x56\xc5\xd1\xea\x87\x54\x76\x3f\x86\x78\x7e\x7e\x01\xe7\x57\xf1\xe4\xf6\xfc\xc2\xd5\xc3\x8e\x0b\xd5\x69\x64\x84\x4c\xb6\x1a\xc2\xbf\xe0\xab\x46\x22\x17\x73\x11\xbc\xc8\xb3\x00\xac\x3c\xeb\xa5\xbc\x23\x9f\x0a\x82\x60\xe8\x4a\xf6\x3a\xf9\x77\x9b\xeb\xda\x40\x1f\xf8\x18\x8d\xb2\x8c\x96\x08\xe7\x94\xa4\x1c\xfe\x31\x97\x5b\x3d\x24\xe0\xac\xc3\xba\x3f\x6f\x16\x68\xf5\x54\xaa\x0b\x79\x0d\x6d\x04\x76\xbd\x89\x2c\xa0\x99\x1c\x5b\x36\x2a\xb2\xfe\x3a\xc7\x0d\xad\x3c\xb7\x9b\x7d\x31\xae\x96\x23\xec\xca\x84\xef\x36\x52\x77\xae\x1c\x1c\x7c\x39\x34\x38\x73\x39\x98\x09\x42\x1d\x88\xab\xb6\x2a\xa7\x41\x5d\x6d\x45\x75\xf5\x66\xba\x1e\x6d\xd9\xdd\xc7\xd5\xee\xa2\x1e\xb7\x93\xd2\x6e\x24\xb2\xdb\xd0\x37\x51\xcb\x8f\x8f\x59\xee\x2a\x87\x76\xd4\x6d\x7f\xb8\x27\x0b\x7d\x84\xce\xdc\x9f\xb6\xce\x7f\x62\xa7\xf0\xeb\xfc\xab\xed\xdd\xc5\x0f\xf7\x1c\x25\x91\xdd\x59\xbb\xf7\xea\xe5\xde\x7a\xd9\xd7\xe2\xc8\xb2\x30\xe7\xfc\xbb\x03\x84\x67\x71\x8f\x28\x49\x7b\x98\x88\xd1\x07\x2c\x6c\x1d\xfa\x2a\xd2\x26\x80\x34\x1b\xec\x01\x4a\x9a\x16\xf9\xa8\xb3\x07\x27\xb2\xd8\xdf\xbb\xfe\x90\x8f\xbd\xa9\x66\x6d\xa8\xe5\x8f\x18\xc9\x6d\xbf\xbc\xe4\xd1\x6f\xbb\x75\x5d\xfe\x16\xe9\xc8\x76\x5b\x74\x47\x09\x2e\x8f\x7b\x5f\xaf\xb3\x1a\xef\x1f\x1f\x1a\x3c\xfe\xee\x54\xaf\x77\x5f\xf0\x98\x0d\xb2\xcb\x5e\x9f\x29\xaa\xda\xcb\x52\x25\xfe\x6c\xff\xa3\x8d\xb5\xb7\xa5\xfc\x8a\xab\xb1\xd5\x4f\x4c\xaf\x50\xaf\xdf\x9e\x4e\xdc\xde\xe9\x0f\xba\x38\xdf\x09\xdd\xfc\x26\x4f\x97\xea\xc0\xbf\x59\xe1\xd9\x5c\xde\xf0\x7e\xd1\xde\x37\x5a\x4f\x84\xf0\x51\xd6\x1a\x39\xfb\x28\xcd\xee\xc4\x3d\x1e\x73\x6a\x70\xc4\xd5\xc3\x21\xf9\xc7\x13\x01\x79\x22\x20\x4f\x04\xe4\x3d\x11\x90\x2d\xae\xde\x42\x42\x9e\x68\xc8\xc7\x91\x1a\x3c\x4c\xdc\x38\xd1\x90\x0f\x27\x91\xf0\xe0\x4b\xf3\x4a\x37\x32\xb2\x7b\x91\xd1\x8b\x6a\x7c\x74\x05\xc6\x1d\x31\x8d\x5d\xc8\xe0\x87\x89\x31\x27\x36\xf2\x88\x60\xe2\xec\x44\x20\x1e\x98\x40\x3c\x24\x43\xe5\xf9\xdf\x19\xf6\x7f\x12\xeb\x93\x4e\x1e\xb4\xa4\x7c\x40\x59\x63\xc7\x8a\xf2\x54\x3b\xfe\xb9\x12\xc1\x7b\xaa\x26\x2b\x97\x6f\x85\xeb\xa6\x32\xbb\xe8\xba\x1b\x98\xfa\xf5\x5d\x31\xd8\xf6\x1d\xd7\xf9\xe6\xe2\xbf\xe6\x58\xff\x35\xac\xed\x5f\xe4\x04\xfe\xb9\x1b\xbf\xef\xd6\x0e\xb4\x4e\xe8\x69\x62\xab\xf7\x3d\xd9\xea\xd3\xff\x03\x00\x00\xff\xff\x9c\xc8\x2c\x0b\xd2\x7c\x00\x00") func templatesSchemavalidatorGotmplBytes() ([]byte, error) { return bindataRead( @@ -435,12 +442,172 @@ func templatesSchemavalidatorGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/schemavalidator.gotmpl", size: 31015, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc, 0xc4, 0xc9, 0x40, 0xf4, 0x19, 0xfb, 0x67, 0x5d, 0xc6, 0x7f, 0x84, 0x5d, 0x86, 0xd9, 0x0, 0xbd, 0x22, 0x4a, 0x2e, 0xf4, 0x7, 0x8, 0x50, 0xf1, 0xbc, 0x6, 0xb1, 0x8, 0x56, 0xac, 0x99}} + info := bindataFileInfo{name: "templates/schemavalidator.gotmpl", size: 31954, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf4, 0x45, 0xe4, 0x3d, 0x35, 0x81, 0x2f, 0xdb, 0x7b, 0xba, 0x7e, 0x80, 0x2d, 0x28, 0x7b, 0x73, 0x23, 0x69, 0x4e, 0xfc, 0x8d, 0xdc, 0xa2, 0x16, 0x87, 0x17, 0xff, 0xf7, 0xee, 0x89, 0x9, 0x71}} return a, nil } -var _templatesServerBuilderGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x5b\x5f\x6f\x23\x39\x72\x7f\x4e\x7f\x8a\x3a\x61\x2f\x51\x0f\xb4\xad\xc1\x3d\x05\x5e\x38\x80\xd7\xde\xcd\x39\xd9\xdb\x31\xc6\xbe\xe4\xc1\x30\x0e\x74\x77\x49\x62\xa6\x9b\xec\x25\xd9\x56\x7c\x82\xbe\x7b\xc0\x7f\x4d\xf6\x3f\x49\xd6\x78\xb3\x7b\xf3\x32\x92\x58\xac\x2a\xfe\xaa\x58\xac\x2a\xd2\xcb\x25\x5c\xf3\x02\x61\x8d\x0c\x05\x51\x58\xc0\xf3\x2b\xac\xf9\xb7\x72\x4b\xd6\x6b\x14\xdf\xc1\xcd\x27\xf8\xf9\xd3\x03\xfc\x70\x73\xfb\x90\x25\x49\xb2\xdb\x01\x5d\x41\x76\xcd\xeb\x57\x41\xd7\x1b\x05\xdf\xee\xf7\xcb\x25\xec\x76\x90\xf3\xaa\x42\xa6\x7a\x63\xbb\x1d\x20\x2b\x60\xbf\x4f\x92\xa4\x26\xf9\x17\xb2\x46\xd8\xed\xb2\x3b\xfb\x71\xbf\xd7\x0c\xbf\xf1\x03\x17\x97\xe0\x47\xcc\x8c\xe5\x12\x1e\x36\x54\xc2\x8a\x96\x08\x5b\x22\xbb\x5a\xaa\x0d\x82\x53\x13\x14\xe7\x65\xa6\xe9\x7f\x28\xa8\xa2\x6c\x0d\xaa\x9d\x57\x19\x55\x6a\xc1\x5f\x10\x56\x8d\x32\xac\x36\xc8\xe0\x95\x37\x20\xf0\x5b\xd1\xb0\x0e\x27\x2f\xc2\xac\x87\xb0\x22\x49\x68\x55\x73\xa1\x60\x9e\x00\xcc\x72\xce\x14\xfe\xaf\x9a\xe9\xcf\x52\x09\xca\xd6\xd2\x7c\x66\xa8\x96\x1b\xa5\xea\x59\xa2\xbf\xad\xa9\xda\x34\xcf\x59\xce\xab\xe5\x9a\x7f\xcb\x6b\x64\xa4\xa6\x4b\x2d\x41\x13\xcb\x1a\xf3\x49\x9a\x1a\x73\x4d\x53\x72\x52\xc8\x29\x22\x33\xa8\xa9\x50\x08\x2e\x26\xc9\xec\xa8\x91\xa8\xc4\xaa\x52\x93\x32\xcd\xa8\xa6\x13\x0d\x53\xb4\xc2\x29\x42\x37\xac\x29\x2b\x5a\x14\x25\x6e\x89\x38\x46\xbc\x0c\x94\x46\x13\xcc\x1b\x41\xd5\xeb\xb1\x59\x9e\xce\xe0\xb9\xdb\x81\x20\x6c\x8d\x90\xdd\xe0\x8a\x34\xa5\xba\x35\x16\x91\x60\xdc\xab\x16\x94\xa9\x15\xcc\xfe\xf8\xcb\x0c\x32\xed\x36\x66\x82\x73\xba\x68\xf2\x37\x5f\xf0\x75\x01\xdf\xbc\x90\xb2\xb1\x9e\xd6\xe1\xa2\x47\x61\xbf\x87\x1e\x43\x47\xde\xe3\x9a\x1a\xd7\xfc\x19\xb7\x9a\x9a\xc8\x9c\x94\xf4\xef\x08\xd9\xcf\xa4\xd2\xa4\x57\x77\xb7\x90\x0b\x24\x0a\x25\x10\x60\xb8\x85\x51\x32\xa0\x4c\x2a\xc2\x72\x4c\x56\x0d\xcb\x0f\x71\x9b\x1b\x8f\xf9\x60\xcc\x9e\xdd\xf0\xbc\xd1\xfb\x2c\x85\x0f\x93\xd2\x77\xda\x96\xa8\x1a\xc1\xe0\x9f\xa7\x88\x34\x0d\xc0\x86\xb0\xa2\x44\x21\x2f\xa0\xfb\xaf\x22\x5f\x70\x5e\x91\xfa\xd1\x3a\xf9\x53\xf4\x51\xbb\x79\xf6\x67\x3b\x2f\x5d\x18\x2e\x2b\x2e\x2a\xa2\x06\x4c\x9c\xdf\x79\xab\x59\xda\xc2\x7e\xb9\xe6\x4c\x36\x15\x86\x39\xb3\xdd\xae\xb5\xaf\x1f\x84\xfd\x7e\xd6\x99\x75\x27\x78\xd1\xe4\x13\xb3\xfc\x60\x98\x95\x37\x52\xf1\xca\x71\x8b\x16\xd9\x5f\x9d\xf3\xba\xcc\x53\xa6\xf1\x74\xc7\xf6\x84\xe9\x9e\xd2\x4d\xbf\x47\xf1\x82\xe2\x7e\xd3\xa8\x82\x6f\x59\x00\x47\x9b\x7b\x9e\xc2\x0e\x60\x6f\x09\xb5\x79\x07\xd8\xb9\xdf\x23\x56\x3f\xe8\xfd\xdc\xa5\xb3\x5b\x3c\x0b\xc3\x96\xfc\x7b\x22\x69\x7e\xd5\xa8\x0d\x32\x45\x73\xa2\xfc\x34\xbf\xab\xb2\x96\xc0\xd2\x5f\xdd\xdd\xfe\x27\xbe\x0e\x27\xb4\xf4\x81\xc0\x09\x40\x22\x50\x1c\x98\x10\x08\xec\x84\xb0\x85\x23\xdb\xba\xb3\xe4\xb6\xaa\x4b\xd4\x2e\x4d\x14\xe5\xcc\x6d\xea\x81\xcb\x7a\xdb\x5c\x68\x5e\xc3\x39\x8b\xdd\x0e\x4b\x89\x47\x27\xf7\x4d\xfd\xa3\x36\x86\xb1\x88\x00\xca\xb3\xcf\x48\x0a\x14\x0b\x50\x44\xac\x51\x01\x65\x0a\xc5\x8a\xe4\xb8\xdb\xa7\x16\x6c\xb0\xfb\xa6\xdd\x5f\xce\x02\x3f\x73\xd5\xaa\x84\xc5\x7c\xb6\xdb\x19\xd1\xfb\x3d\xe4\x4e\x10\x6c\x88\x04\xc6\x15\xbc\xa2\x82\x67\x44\x06\x34\x4c\x98\xa5\x86\xeb\x3e\xd5\xcb\x60\x85\x09\x37\x1a\x34\xf3\x39\x60\x17\x79\xf8\x9b\xb0\xf3\x8e\x79\x16\x76\x61\x72\xdf\xcf\x03\x76\x5b\x8d\xdd\x7f\x0b\xaa\x34\x76\x05\x51\xe4\x3d\x90\xab\x9d\x98\xaf\x41\xce\x01\xf7\xa9\xd6\x67\x3a\xe5\x4c\xea\x1f\xe9\x0a\x18\x86\x4c\xc3\xa7\x1f\xfd\xf5\x87\x4c\x24\x18\x62\x08\x8f\x8b\x84\x1a\xda\x43\x7c\x23\x6e\xd9\x09\xec\x02\xb4\x35\x11\xa4\x92\xef\xc4\xfd\xce\x30\x33\xbc\x32\xbd\x39\xb9\xa0\x7f\xc7\x62\xbf\x5f\x98\x43\x2f\xa7\x35\x29\x9d\x24\xae\x60\x0e\xf8\x8b\xf6\x39\x3f\x30\x8b\x6c\x3a\x83\x74\xbf\xff\xd0\x9e\x88\x3a\xa3\xf3\x74\x2d\x5c\x69\x94\x25\x64\x9f\x51\xd6\x9c\x15\x38\x70\x83\x88\xa6\xef\x0a\xdc\x5b\xed\xc8\xea\x0f\xdb\xac\x87\xc2\x7e\x7f\xa2\x3f\xc5\x8e\xe4\x3e\x3b\x6f\xba\x77\x51\xee\x06\x57\x94\xd1\xd8\xad\xb2\x5b\xd9\x86\x56\x93\x17\x5f\xd5\x75\x49\x51\xda\x8c\x53\xa7\x99\x1e\x75\xbb\xae\x8d\x09\x37\x40\x25\x48\x54\xb0\xa5\x6a\x63\x88\x0c\x0f\x90\xf9\x06\x2b\xf4\xe1\x33\x5a\xc6\xed\x8d\x3e\xc2\x1b\xb5\xb9\xb0\x67\x49\x23\x51\x80\x3d\x8b\x16\x9a\x4e\xba\x2f\x29\xcc\xbf\xde\x98\x0b\xbb\x51\xd3\xbe\xdd\x18\x2d\x17\x53\x7b\xf8\xd9\xe8\x4f\x1a\xb5\x01\xad\x82\xd3\x38\x3d\x09\xf8\x45\x77\x03\x5b\x50\xc3\xf9\x33\x8e\xaa\x49\x03\x9c\x8f\xcf\x4c\x90\xbb\xe7\x8d\xc8\x6d\x9a\x65\xc0\x3d\x01\x46\xc5\xbf\x20\xfb\xad\xa1\x23\x35\x05\x9d\x8a\x1a\xf0\x62\xec\x42\x5c\x5c\x09\x5e\xe9\xaf\x76\x89\x3a\x50\xea\x5d\x0d\x8f\x11\x06\x4f\xa7\x41\xdd\x43\xf9\x93\x06\xe3\x4f\xfd\x2d\x75\x08\xa6\x05\xc8\x9c\xd7\x28\xe1\xf1\xe9\x37\xc6\x8d\x6b\xc0\xfe\x04\xcf\x26\xef\x18\xa2\xf7\x66\xcf\x1b\xf9\xac\x41\x1a\xdd\xfa\x66\x7c\xb9\xf4\x49\xaa\x91\x6e\x22\xab\xd9\xd9\xed\xb7\x02\x2a\x24\x4c\x17\xa7\x8c\x83\xc0\x5f\x1a\x94\x4a\x82\x2e\xa1\x9e\x4b\x9e\x7f\xc1\xc2\xe7\x62\x6d\x64\xee\x67\x61\x2d\xa7\xf9\x20\x3c\xed\x13\x5d\x2f\x1f\x28\x09\x5c\xbe\xc0\x56\x3c\xca\x1e\xd8\x8a\x67\x37\x28\x73\x41\xeb\x36\x7f\x18\xfc\x6a\x8b\xf8\x52\x6a\x56\x7a\xb3\xed\x76\xb0\x69\x2a\xc2\x3a\xc5\x8c\xae\x28\x82\x35\xdd\x07\xf8\xb0\x4c\xd4\x6b\x8d\xe3\x05\x90\x56\x4b\x2a\xd1\xe4\xca\x18\xda\x14\x39\xd1\xbf\x5e\xbd\x93\x00\xb8\xe2\x3b\x50\x44\x67\xc7\xb5\x1d\x4b\x42\x49\x13\xb2\xf5\x63\x55\x4c\xd2\x56\x30\x21\xf5\xb6\x95\xcb\x67\x5c\x53\xa9\xc4\x6b\x32\xa8\x25\xe0\x40\xf9\x90\x0c\x4a\x87\x31\x6a\x3f\x98\x0c\x6a\x22\xb7\xb9\x92\x41\xd9\x13\x06\xfe\x12\xea\xef\x50\x53\x44\x70\x7c\xdf\xd0\xb2\x40\x91\x42\x67\x9d\x89\x71\xd3\x61\x75\xd0\x36\x3d\x74\xc1\xea\xf5\xeb\x52\x98\xa0\x63\xfa\x24\x8d\x09\xbe\x05\x44\x41\x5e\x4b\xd7\x9e\x92\x59\x01\xb7\xca\xec\x37\xd2\x6e\x08\xda\xcd\x38\xa9\xeb\xb8\xf8\x5e\x80\x3b\xcb\x17\xb0\xe1\x5b\x7c\x41\x61\x5a\x33\x39\x61\x20\xb0\x2e\x49\x8e\x40\x95\x36\x90\xfe\x59\xe8\x60\xa7\x68\xde\x94\x44\x40\x23\xc9\x1a\xb5\xcc\x91\x15\x19\x40\xda\x9d\xf3\x57\x89\xe2\x8e\x48\x19\xd1\x50\xce\xd2\xf1\xb5\xda\x45\x8c\xd4\x44\x67\xc1\x64\xc3\xe5\xef\x02\xa6\xb1\x25\x59\x9c\x7c\x30\xf7\xff\x7b\xdc\x1e\xb4\xf2\x6f\x00\x6d\xa4\x2e\x3c\xcf\xb7\x6c\x18\xff\x1d\x61\x37\xb6\xb2\x2e\x76\x1e\xb3\x7b\x7d\x22\x16\x6f\x40\x2e\x89\x52\x4b\x1f\x02\x7c\x53\x75\xba\x94\x05\x61\x62\x93\x0e\x2e\x24\x14\x99\x7a\x0d\xc4\xa6\x43\x7f\xc1\x82\x92\x07\x1d\x7d\x75\x4e\x54\xd1\x0a\x41\xc7\xe2\xa4\x9f\x06\x0d\xf8\x0e\xa3\x59\x38\x66\x5a\x45\x7d\x48\x9a\x56\xd4\xc7\xb7\x8e\xa2\x6d\x4d\x77\xbe\xa2\x81\xef\x30\x90\x8e\x28\x3a\x75\x62\x8f\xe7\xeb\x13\xa9\x4f\x67\x0d\xde\x15\x41\x6d\x88\x02\x45\xbe\xa0\x04\x9d\x82\x33\xad\x1f\x61\x85\x49\xc1\xb7\x5c\x14\xe6\x8b\xcd\x5d\xec\xda\x5d\x86\x63\x5d\x98\x2a\xa8\x51\xe8\x83\xc7\xe6\x08\xc1\x51\x6c\x21\x10\xe2\xeb\x00\x89\xa0\xd7\xc8\xf6\x35\x29\x18\x9c\x96\x83\x41\x37\x09\x8b\x29\x43\x1a\x96\x1c\x4b\xc7\xcf\x05\x8d\xf8\x0d\x7e\x26\x4c\xcf\x44\x62\x01\x5c\x33\x00\x9f\x37\x47\x49\xb0\xe9\xf9\xd3\x02\x0b\x1f\x0d\xa2\x9c\xf9\x34\x48\x7f\x55\x28\x21\x4e\xba\xe1\xeb\x80\x64\x40\xf2\x1c\xa5\x8c\x00\xd5\x41\xa1\x2c\xd1\xd2\xf2\x95\x49\x38\xa9\xc0\xc2\x67\xec\xef\x01\x7a\x37\xe9\xb6\xb2\xfb\xa0\xbb\x44\xf7\x54\x1f\xee\x14\x12\xef\x0e\x7d\x7c\x2d\x10\x22\xc5\xa1\xc4\xde\x66\x02\x21\x23\xf7\xeb\x93\x1e\x71\x9d\x94\x0a\x5e\xc2\xfc\xea\xfa\xa7\xe5\xe7\xef\xaf\xae\x97\x57\xdf\x5f\x5d\xa7\xf0\xfc\xea\x48\x75\xc2\xdf\x5a\x27\x86\xc4\x9a\x29\xa0\x8b\x45\xc7\x0c\x5d\xb1\xf1\xd1\x61\x7f\x1a\x0f\x77\x71\xa7\xcb\x78\xd4\xaf\xd1\xec\xd2\x05\xb5\x34\x4b\x09\x2d\x1a\x97\x76\x9b\xc0\x3e\x59\x25\xb4\xe4\x1e\xf7\xf7\x57\xed\x20\xdb\x70\xef\x78\x4a\x13\xae\x83\xf0\x72\x19\x75\xe1\x75\x5d\x97\x93\xb2\xc4\xc2\xf6\x20\x88\x6b\x67\xea\xdf\x05\xe6\x48\x5f\xb0\x58\x68\x18\x04\x9a\x12\xb0\x4d\x53\x36\x2d\xe7\xe5\x12\x9e\x1b\xd5\xe6\x21\x12\x95\x4d\x3e\xf8\x96\xf9\x46\x10\x95\x49\xdc\xfa\x0f\x89\xbe\x49\xea\x6d\x47\x4d\xa2\x6f\xbb\x7e\x70\xbf\x1a\xdf\x6a\xbd\x3e\xd2\xbc\xbd\x8a\xe8\x6b\xaf\xcd\xf5\xe7\x87\x87\xbb\xf9\x7d\x0a\xd2\x50\x9a\xa6\xc9\xa6\x51\x60\xc8\xb5\x9f\x16\x9c\xa1\xe5\x65\x96\x60\x9c\xba\x2c\x81\xe4\x8a\xbe\xa0\xde\x04\xcc\x86\x1a\xe9\xa8\xd1\xd6\xdb\xda\xf1\x6b\xd5\x1b\x7f\x85\x8a\x0b\x4c\xfa\x37\x24\xee\x62\xc4\xa9\x7c\x6d\x2a\x28\x7f\x0b\x0b\x25\x65\x08\x44\xac\x4d\x2d\x08\x6b\xc1\x9b\x5a\xb6\x0d\x33\x2a\xa0\x08\xf5\xaa\x46\xed\xda\x4e\xfb\x89\x32\xfc\x64\x7f\xfc\x77\x3b\xe5\xf1\x49\x6e\xc9\x3a\x9b\x18\x77\xb2\x75\xb9\xa0\x4d\x46\x19\x16\x50\x72\x73\x2f\x1c\x27\xa0\x3f\xd9\x9f\xba\x37\x3a\x3e\x82\x65\x59\x16\x37\xbf\x13\x7b\x8f\x7d\x8f\xaa\x7f\x4d\xd5\x6e\x22\xef\x1c\xb5\x1f\xa9\x74\x46\x64\x93\x20\x73\x37\x38\xdf\xed\xb2\xcf\xd6\xad\x84\x6b\x02\x4d\x56\xfa\xe9\x88\xa8\x79\xd5\xa6\x58\x3e\xba\xee\x92\x7f\x1a\x30\xcd\xfa\xe5\xe6\x25\xb4\x13\x07\xcb\x68\x8b\x55\x7f\x88\xc4\x2b\xc9\xfd\xe0\x7b\xad\xc4\x4b\x7b\xe3\x4a\x5a\x25\x47\x57\x72\x5f\x63\x6e\xad\x40\x6c\xf7\xc1\x1c\xa9\x5b\x5a\x96\xf0\x8c\x76\x27\x14\x6d\x3c\xcb\x4b\x8a\x4c\xc9\xec\xcc\x75\x68\x59\x13\xf7\xb8\xa3\x0b\x30\xa4\x97\x46\x2d\xa7\x70\xdf\x7d\xc6\x70\x7f\x27\x0f\xea\xbb\x4f\xea\xc0\xd6\xaa\xba\x5e\xdc\x51\xe7\xe9\x6a\xfd\xff\xe1\x2d\x7d\x57\x79\x8b\xd6\x7e\x92\xd3\xfa\x47\xd7\x0e\x8a\xb5\xf5\x49\x98\x4e\xa1\x2c\x5f\xd7\x34\x3a\x47\x57\x27\xc0\xea\x18\x77\x9a\x0e\x2a\xeb\x05\x5a\x25\x3f\x3b\x85\x2c\xaf\x6e\x3d\x68\x83\xa7\xa5\x87\x17\x52\xd2\xc2\x94\x9a\x67\x68\xda\x95\x32\x37\x45\x8e\x0f\x75\x8e\xbf\x5b\x82\xa5\x58\x04\x71\x7e\xe0\xbf\xfc\x0f\xb6\xa3\x3b\xb9\xae\xec\xaa\x28\x8c\x00\xcf\x39\xe2\xe5\xe3\xa8\xe3\x85\x7e\x04\x63\xe3\xb8\xcc\x27\xe4\xfb\xe3\x8b\x3a\x07\x06\x2f\x77\x1e\xdf\x66\xbe\x10\x01\x0d\x8b\x1c\xc3\x67\xaf\xe3\x25\x7d\x02\x3a\xa1\x1d\x2e\xff\x70\x3d\x7e\x79\x09\x8c\x96\xae\x17\xde\x91\x76\x09\xa4\xae\x91\x15\xf3\xf8\xd7\x85\x29\xaa\xa7\xf9\x99\x6e\x77\x3f\x03\x1e\x14\xf5\x6f\x52\xb5\xad\xc8\xdf\x49\x55\xcf\xef\x90\xaa\x53\xf9\xfa\x09\x5a\x87\xca\xe3\x1c\x7d\xfb\x15\xf0\xd4\x9d\x7b\xe8\x99\x8f\x48\x6f\x2b\x11\xcd\xe1\xd0\x32\xe3\x74\x7e\x7a\x75\xbf\x4a\x22\x7d\x26\x38\xef\x93\x7a\x0f\x30\xb1\x8b\x2f\x91\x75\x84\xa6\xf0\x6f\xf0\xd1\xa9\xe8\xa2\xa6\x0e\x38\x26\x5d\x5e\xcd\x67\x15\x95\x52\x07\xea\x38\x3a\x5c\xc0\x1f\xe5\xcc\xf7\x4a\x64\xf6\x1f\x9c\xb2\xfe\x3a\x16\x30\x4b\xad\xfc\x24\xbe\x7b\x4a\xf6\x49\xa7\x08\xf8\xd1\x34\x37\x4d\xf6\x60\x43\x42\x5c\x02\x11\x58\xd3\x17\x64\x51\x81\x44\x8b\xf3\x52\x87\x48\xdc\xbc\xe5\x76\x7b\xd3\xe6\x3f\x6f\xac\x08\xe2\xc7\x61\x43\x5f\x0a\xe2\xec\x6a\x3b\x9d\x4a\xd9\xae\x58\x47\x57\xd2\x19\x6a\xf3\x24\x9d\xb1\xd0\x15\xd5\xa7\xa4\x6f\xbe\xda\x8b\xec\xb3\xce\xc9\x81\xfc\xb9\x63\x16\xdf\xa8\x68\x91\x6d\x40\xb8\x37\xe3\xe9\xd8\x8d\x4b\xb7\x7b\xbb\x3b\x5a\xfb\x0b\x94\x3a\x3d\xb9\xb8\x9c\x7c\xf1\xd5\xe1\x98\xda\x7b\x24\x30\x47\xe4\xc5\xa5\x7b\xb4\xe3\xf5\xb5\x4e\x2a\xb7\x54\xe5\x1b\x4b\xe2\x6f\x37\x8f\xc6\x34\xfd\x2f\x27\xd2\x5c\x73\x67\xb7\x37\xfb\xfd\xec\x22\xf1\xa5\xc7\x48\x1b\xd3\xaa\xfd\xa8\x65\x3c\xc1\xe5\x88\x91\x87\xd7\x25\x6f\xea\xb5\xb4\x6f\x0e\xec\x51\xdd\x76\x3b\xdb\xc6\x4d\x34\x63\x70\x95\x1b\xed\xd4\xf8\xf6\xf7\xb4\x80\xfd\x16\x2d\x47\x34\x4c\x5b\x1d\x42\x00\x4e\xe3\x3b\xde\x18\xd0\xb8\xc7\x69\x6d\xa8\x6d\xea\xac\x69\xc1\xed\x2c\xe9\x08\xe6\x23\x77\x2f\xce\x95\x8d\xbf\x2f\x1c\xe7\xec\x96\x2d\xe0\xcd\xc6\xe8\xbd\x5c\xf8\x7d\xe0\x6f\x94\x7a\x13\xe4\xfe\xfd\xc1\x71\x07\x1e\x5e\xc6\xb8\xbc\xf1\xab\xa0\x1b\x7b\xcd\xf0\x3b\xc2\xd2\xab\x77\x02\xa6\xf1\xb7\xbd\x3b\x49\x9d\xa6\x16\x5c\x7b\xb2\x9a\x47\x7f\xdd\x33\x2e\xcc\xb5\xf9\x76\xdc\x82\x1c\x2f\x86\xc2\x6b\x87\x73\x03\xbc\x9d\x3d\x4f\x47\x9a\x9c\x27\x45\xe9\x89\xb3\xac\xd3\x40\x3d\x79\xc1\xed\x0d\x7f\xe7\xb0\xcb\xdb\x7b\xff\xe1\x39\x17\xaa\xd6\xb3\x8e\xb8\x58\x60\x68\x6f\xc4\x4e\x78\xe0\xa9\x41\x84\x4f\xa7\xce\x38\x7e\x74\xb5\x6f\x9d\xdd\xa9\xf5\xb7\x05\x54\x2a\x1c\x5b\x91\x22\x9d\x93\xab\x52\xc3\x73\xab\x23\xb9\x33\x72\x55\x96\xf7\x28\xa8\x59\xb5\x18\x1e\x66\x41\x8a\x01\xa4\x7b\x13\x18\xce\x38\x17\x0f\x8e\x4d\x18\x8f\x15\x07\x8b\xa1\x91\xed\xd2\xdf\x3c\xe6\x3f\xba\x82\x7c\x01\xfc\x8b\xc6\x67\x28\xa2\xf7\x34\xe4\xb1\x52\x4f\xdf\x69\xe2\xf0\x7c\xc9\xe8\x5f\x29\xad\x61\xfe\x0e\x9b\xb2\x7d\x57\xd2\xf1\xd1\xba\x7d\x6d\xf2\xee\x3e\x1a\x0b\x3c\xd9\x47\xdb\xb2\x30\xf8\x68\xa7\xc0\x3c\xee\xa3\xed\x83\xfa\xaf\xf7\xd1\x8e\xe4\x7f\x08\x1f\x8d\xae\xb5\x4f\xf5\xd1\xfa\x98\x8f\xb6\x76\x3c\xec\xa3\xf5\x3b\xf8\xa8\x7f\xc8\x1c\x8a\xa4\xf8\x29\x52\xeb\xa2\xed\x75\x61\x28\x94\x2a\x54\x1b\x5e\xb8\x9b\x74\xb5\x39\xc7\x5f\x83\xf0\xb9\xe5\xb6\x30\xac\x42\x8a\x14\xeb\xb2\x80\x67\xce\x4b\x7b\xac\x8f\x16\xd8\xed\x8b\xb2\x4e\x49\x1c\x3f\x4a\x5c\x91\x52\xa2\x83\xab\xa9\x4c\xa2\xe8\xea\xcb\x07\xfe\xd7\xba\x46\xaf\x46\x6a\x45\xfc\x6d\xda\x4e\x5e\xd6\x63\x53\x3d\x7d\x07\x7f\x68\x2d\x34\x25\x4d\x5b\x9d\xd8\x56\xc6\x6c\x39\x73\xc4\xf6\x17\x98\xcd\x1c\xd1\xe6\x34\x79\x8f\x7a\xde\x53\x30\xab\x99\x16\x8e\x45\xf3\xf6\x2e\x4e\x02\xa2\x3f\x02\xf3\x4f\xf3\x0e\xde\xfe\x9d\xd9\x7a\x73\xa2\xe7\xe9\xd8\x83\xbf\x69\xab\x79\x95\x3a\x46\x3b\x40\xd6\x79\x89\x8e\xdb\xcf\xbc\x51\xe4\xb9\x44\x2f\x7d\xbc\x45\xbf\x18\x72\x5c\x68\x71\xfd\xf6\xc1\x6e\x07\x1d\x32\x08\x92\x35\xc0\x67\xa0\xa2\x73\x20\xe7\xc0\xd7\x24\xdf\xe0\x7c\xaa\xb9\x1a\xe0\x5b\x2e\xa1\xe0\xec\x5f\x14\xe4\xda\x64\xe4\x99\x37\xca\x25\x73\x7a\x67\x2f\xe0\x7f\x1a\xa9\xdc\xb3\x82\x0d\x1a\x01\x26\x2a\xfa\xfb\xdd\xba\x46\x66\x1e\xa9\xda\x58\x3e\xd6\x9a\x1a\x2e\x72\x7c\xef\x1c\xda\x63\x27\xff\xed\x59\xdb\x21\x3a\xd0\x2b\x9b\x56\xe8\xb1\xf7\x97\x7e\xf3\x46\xef\x53\x1d\xae\xcd\x46\x35\x8f\xa8\x7b\x3a\x7f\x25\xb3\xc1\xc2\xc6\x57\x33\xb9\x43\x8f\xcb\x78\xb4\x45\x85\x29\x27\x74\x08\xd0\x11\x61\xbf\x9f\xcd\xba\xbd\xc8\x98\x47\x5e\x22\x61\x86\xd6\xcc\x48\xe3\xde\xa4\x3d\xab\xde\xd4\xd2\x9b\xfa\x23\xc6\x91\xdd\xe3\xbc\x7f\x64\x03\xfd\x4a\x0d\xcd\xb4\xd7\x61\x8d\x0f\x2b\xd3\xf6\x8a\xfe\x68\x53\x5b\xa6\x6d\xe7\x29\x6e\xef\x02\xed\xdf\x6f\xdc\xdd\x02\x7f\x41\x61\x2e\xcc\xf5\xd4\x9c\x30\x78\x46\x68\x24\x16\x50\x50\x81\xb9\x2a\x5f\x81\x32\x7b\xda\xfd\xa4\x8b\x24\x76\xc5\x0a\x23\x60\x3e\xbb\xf8\xd7\x8f\x1f\x3f\xce\x16\x40\x6a\x6a\x5b\x6d\x73\x1d\x2b\xd2\xb3\x1b\x83\xf3\x67\xfb\xce\x17\x8e\x3d\xfd\x75\xb1\x61\xe8\xc1\xb7\x8c\x2a\x7b\xe7\x3e\xb2\x5f\xf6\xfb\x2c\x7a\x68\xfc\x87\x91\xd3\x6f\x8c\x65\x98\xe2\xd5\x4b\xbb\x99\xc4\xa4\x33\xe8\x92\xcd\x29\x1c\xa6\x5a\x0b\x69\x3d\x81\x94\x25\xdf\x4a\xf3\x66\x42\x71\x1b\xae\xda\x28\x65\xcd\xe3\x6d\x96\xeb\x90\xb8\x68\x5f\x57\xa8\x0d\xea\x04\x26\xe7\x55\xcd\x25\xf6\x0f\x2f\x62\x59\x4a\x44\x58\x51\x75\x8e\x31\x2c\x8a\xfe\x2c\x2a\x91\x8d\x38\xbc\xdf\xc7\xa9\x0e\x2b\x1f\x27\x03\xe1\x30\xae\xb7\xaf\xfb\xc3\x95\x5f\x5b\xfe\x75\x11\x21\x45\x01\x73\x2e\x8c\x83\x0a\x5a\x60\x3a\x7c\x1a\x1a\x0a\x81\xb3\x6e\xb2\xfb\x0a\x0c\xee\xe3\x17\x41\xe0\xa0\xd2\x9c\x38\xa0\x06\xe5\x93\x67\x69\xca\x25\x5f\xa9\x75\x01\x68\x6b\x8b\xe3\x00\xf4\x9e\x9c\xbe\x13\x00\x5e\x81\x11\x00\xea\xa9\x07\xaa\x87\x01\x88\x72\xf3\x18\x00\xcf\x2d\xd9\x27\xff\x17\x00\x00\xff\xff\x9b\x80\xf1\x22\xac\x41\x00\x00") +var _templatesSerializersAdditionalpropertiesserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x56\x4d\x6f\xe3\x36\x10\xbd\xeb\x57\xbc\x1a\x6d\x56\x2a\x14\xb9\xc9\xde\xd2\xba\xc0\x16\xdb\x02\x2d\xb0\x69\x91\xed\xf6\x62\xe4\xc0\x48\x63\x9b\x1b\x9a\x54\x49\xda\x6e\x2a\xe8\xbf\x17\xfc\x58\x4b\x6a\x24\xc3\x9b\xcb\xea\x46\x6a\x38\xf3\xe6\xcd\xcc\x23\x9b\x06\x15\xad\xb8\x24\xcc\x58\x55\x71\xcb\x95\x64\xe2\x0f\xad\x6a\xd2\x96\x93\x79\x4f\x9a\x33\xc1\xff\x25\x3d\x43\xdb\x26\xf3\x39\x3e\xc8\x2d\xd3\x66\xc3\xc4\x6f\xef\x7f\xbf\xc5\xee\xd3\xca\xc0\x6e\xb8\x81\x7a\xf8\x48\xa5\xc5\x81\xdb\x0d\x3a\x7f\xa8\x8f\x0e\xb1\xd2\x6a\x0b\x77\x36\x59\xed\x64\x89\xb4\x69\x8a\x3b\x2a\x89\xef\x49\xdf\xb2\x2d\xb5\x2d\xbe\x6d\x1a\xd4\xcc\x94\x3e\x2e\x0a\xb7\x8b\xb6\xcd\x86\x91\xd3\x8a\x59\x86\xe5\xfd\xc3\x93\xa5\x0c\xa4\xb5\xd2\x68\x12\x60\x3e\x87\xb1\x6c\x4d\xb8\xca\xf1\xc0\x65\x05\xbb\xa1\x5e\xf8\x04\xd8\x33\x1d\x4c\xae\xd0\x34\xb0\xb4\xad\x05\xb3\x84\x99\xc3\xac\x76\xf6\xcd\x11\xf5\x4f\xaa\x7a\x9a\xa1\x70\x79\x03\x7c\xe5\x82\xe0\x66\x81\x8f\x46\xc9\xe2\x88\xc5\xe3\xc8\x71\x11\x3c\x66\xdf\x7b\xab\xaf\x16\x90\x5c\x78\x3c\x80\x26\xbb\xd3\xd2\xed\x27\x40\x1b\x01\xe8\x72\x8f\xd1\x34\x13\xb8\x7d\xcd\xe4\x9a\x50\x74\x75\x08\x7f\x74\xb9\x2f\x46\x4f\x61\x11\x53\x1a\xff\xed\x9d\x5e\x82\x64\x15\x16\x8e\xe1\x01\xeb\xc1\x85\x2e\xf7\x49\x9f\xc2\xeb\x1c\x9a\xb6\x6a\xdf\x27\x10\x4c\x56\xae\xb2\xb0\x0a\x5b\x56\x27\x08\xb6\xd7\x8e\x99\x2d\x7b\xa4\x74\xcb\xea\xa5\xb1\x9a\xcb\xf5\x7d\xd3\x38\xda\x8a\x37\x23\x7d\x85\xb6\xf5\x3c\xde\xb1\xc3\x3b\x32\x86\xad\xa9\x69\x40\xc2\x38\x24\x5c\x5a\xd2\x2b\x56\x52\xd3\xba\x4d\x0f\x3a\x3b\xb7\x04\xd7\x67\x94\xe0\x24\xc7\x15\x09\xb2\x94\x06\x67\xb9\x2f\x92\xe6\xd2\xae\x30\xfb\xe6\xef\x59\xd7\x8d\x43\x4a\xe3\xea\x44\xb6\x7d\x5e\x5f\xe7\x9e\xc1\xf1\xf9\xd8\x33\xb1\xf3\x7d\xca\x57\x10\x24\x23\x90\x0c\x3f\xe2\xbb\x63\x36\x66\x27\xec\x04\xe1\x5d\x3f\x9b\x72\x43\x5b\xf6\xe7\x53\x4d\xb3\x49\x54\x99\x77\xb8\x52\x1a\x8f\x39\xf6\xce\x65\x60\x25\xd6\x34\xc4\x0b\x1d\x6b\x95\xc3\xfc\xd9\x11\xa2\x87\xc9\xda\xed\x1d\xc5\x7c\x05\xa9\xec\xb8\x8f\xe2\x57\x73\xbb\x13\x82\x3d\x08\xc7\xfb\xc5\xb1\x23\x3c\x9e\xb1\x62\x3f\x2b\xb8\xfb\x3e\xe1\x08\xdc\x2d\x1f\xef\xb1\x08\x19\x25\xdd\x5f\x37\x14\x7f\x39\xf6\x7f\xfe\xa7\xd6\x64\x0c\x57\x32\xce\x85\x3f\x14\xa7\xd7\x57\x3d\x34\x6a\x72\xe2\x4c\x60\xf0\x59\x97\x44\x60\x92\x8b\xa4\x4d\x9c\x9c\xbe\xeb\x89\xe9\xe7\x4a\x29\x97\x56\x81\x79\x31\x8d\xd6\x93\x9a\x3a\x21\xa9\xbd\xe8\x69\x86\x34\xc8\x69\x1e\xe4\x34\xf3\x7c\xbe\x4c\x2d\xa7\xc7\xeb\x94\x4c\x61\x31\xc1\xe7\x33\x1a\xe7\x73\xdf\xfb\xfd\xd4\x43\x17\x4b\x75\x90\x43\xb9\x77\x0b\x93\x0f\xba\x2f\x66\x9d\x46\xcd\xee\xa4\x65\x4c\x34\x24\x17\x79\x5f\x39\xe2\x58\x8e\x03\xcd\xb0\x58\xf4\xe6\xd4\x3b\x88\x00\x5c\xc9\xa3\x8b\x29\xf4\xee\xaa\x1a\xad\x74\x82\xde\xfe\x78\x2e\x13\x78\x5e\x94\x9b\x47\x9c\xe1\x07\xbc\x1e\x9a\xf7\x31\x0c\xd3\x29\x95\x2c\x99\x25\xe9\x5a\xc3\x65\x71\x1d\xd3\x3a\x16\x60\xd9\xf9\xbd\xbc\x72\xc3\xf7\x2a\x7f\xd5\x8d\x03\xab\x6b\x92\x55\x1a\x99\xea\xc2\x2c\xaf\x6e\xee\x8b\xa2\xc8\xf2\x38\x30\xfd\x26\xe8\x3d\x5c\xa4\x1a\x13\x8e\x97\x3e\x5d\x36\x5c\x10\x2a\x6e\x98\x10\xea\xc0\xe5\xfa\xcb\xbc\x63\xdc\xdc\x79\x3e\xce\x1f\x3b\x7f\x79\x95\xc7\xce\xb8\xa5\xc3\x5b\x2a\x55\x45\x3a\x75\xce\x8d\xdb\xb8\x23\xe6\xd6\x2e\x66\x96\x05\xfb\xe2\x6d\x4c\xf5\x83\xf4\xd3\xf3\x0b\x27\x51\x99\x74\x78\xe1\x7a\x3b\xef\x2c\xbd\x08\x55\x3c\xf3\x96\xbd\xc4\xd7\xee\xa9\x73\xb3\xc0\xb3\x07\xc7\x49\x99\x08\xca\xfa\xbf\x13\x93\xaa\xe1\x21\x9d\xf7\xf4\x19\x08\x70\xef\xcf\x7f\x01\x00\x00\xff\xff\xe9\x8a\xbc\x88\x08\x0b\x00\x00") + +func templatesSerializersAdditionalpropertiesserializerGotmplBytes() ([]byte, error) { + return bindataRead( + _templatesSerializersAdditionalpropertiesserializerGotmpl, + "templates/serializers/additionalpropertiesserializer.gotmpl", + ) +} + +func templatesSerializersAdditionalpropertiesserializerGotmpl() (*asset, error) { + bytes, err := templatesSerializersAdditionalpropertiesserializerGotmplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/serializers/additionalpropertiesserializer.gotmpl", size: 2824, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2f, 0x47, 0x3f, 0xb1, 0x62, 0x4b, 0x2b, 0x29, 0x88, 0x51, 0xf, 0x95, 0x6d, 0xcd, 0x3, 0x0, 0x3d, 0xd6, 0x57, 0x55, 0x3f, 0xb3, 0x58, 0x2c, 0xb4, 0x2c, 0x2d, 0x41, 0x26, 0xbc, 0xf, 0x47}} + return a, nil +} + +var _templatesSerializersAliasedserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\xd1\x41\x4b\xc4\x30\x10\x05\xe0\x7b\x7e\xc5\x63\x4f\x89\x68\xf7\x37\x78\x15\x5c\xc1\xd5\x93\x78\x98\x6d\xa7\x18\x68\xd3\x32\x49\x0b\xeb\x90\xff\x2e\x69\x2f\x5b\x5d\xf5\x1a\x5e\xde\xcb\x47\x54\xd1\x70\xeb\x03\x63\x47\x9d\xa7\xc8\xcd\x91\xc5\x53\xe7\x3f\x59\x76\xc8\xd9\xec\xf7\x78\x0d\x3d\x49\xfc\xa0\xee\xe1\xf8\x74\x40\xe4\x14\x41\x50\xc5\x48\xb1\x5e\x92\xa8\x0e\xd4\x33\x72\xc6\x4c\xdd\xc4\x68\x65\xe8\xb1\x84\x7d\x18\xa7\x64\xda\x29\xd4\xb0\xaa\xd5\x33\xd7\xec\x67\x96\x12\xcf\x19\x37\x57\x4b\xdc\x76\xd0\x9e\xf0\xf6\x7e\x3a\x27\x76\x60\x91\x41\xa0\x06\x10\x4e\x93\x04\x58\x5b\x2a\xaa\xfb\xf5\xe5\x2f\xe7\x71\xb9\x6f\xcb\xd9\x76\xca\xb9\xea\x5b\xa9\x33\xd9\x14\xdc\xe3\x05\x4d\x38\x89\xe7\x99\xff\xf3\x51\x5c\x75\xc3\x94\xfe\xe2\xfd\xa2\xbb\x58\xb4\x0e\x76\xc5\xdd\xae\x38\xb7\xd1\xfd\xb4\x5d\xa7\x6d\x1a\x4d\x36\xaa\x77\xe0\xd0\x94\xef\xfb\x0a\x00\x00\xff\xff\xf4\x01\x84\x5a\xe0\x01\x00\x00") + +func templatesSerializersAliasedserializerGotmplBytes() ([]byte, error) { + return bindataRead( + _templatesSerializersAliasedserializerGotmpl, + "templates/serializers/aliasedserializer.gotmpl", + ) +} + +func templatesSerializersAliasedserializerGotmpl() (*asset, error) { + bytes, err := templatesSerializersAliasedserializerGotmplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/serializers/aliasedserializer.gotmpl", size: 480, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5a, 0xe7, 0xb3, 0x5c, 0x43, 0x15, 0x6e, 0x2b, 0xe6, 0xfd, 0x53, 0xc5, 0x93, 0x9c, 0x19, 0x2b, 0xe9, 0x89, 0x5b, 0xd7, 0x61, 0xd6, 0xf8, 0x58, 0x4e, 0x4a, 0xb7, 0x17, 0x9a, 0x17, 0x4, 0x70}} + return a, nil +} + +var _templatesSerializersAllofserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x57\x5d\x6f\xdb\x36\x14\x7d\xf7\xaf\xb8\x33\x8a\xc2\x0a\x5c\x79\xcf\x19\xf2\x90\xae\xd9\x96\x01\x8d\x83\xa4\xdb\x1e\x82\x60\x65\xac\x6b\x87\xad\x44\x6a\x24\x95\x34\x23\xf4\xdf\x07\x52\xd4\xa7\xa9\x8f\x00\xc3\x9a\x62\x7e\x68\x63\x9b\xe4\xe5\x3d\x87\xe4\xb9\xf7\x68\x0d\x11\x6e\x29\x43\x98\x93\x38\x5e\x6f\xaf\x51\x50\x12\xd3\xbf\x51\xcc\x21\xcf\x67\x00\x5a\xbf\x81\x57\x02\x37\x48\x1f\x50\x5c\x90\x04\xe1\xf8\x04\xc2\xab\xe6\x0f\x79\x3e\x5b\xad\xe0\x37\x96\x10\x21\xef\x49\xfc\xeb\xf5\xfa\x02\xb2\xf2\x9b\x04\x75\x4f\x25\xf0\xbb\x4f\xb8\x51\xb0\x15\x3c\x01\x02\x76\x8a\x54\x22\xdb\xa8\x4c\xe0\x6c\x9b\xb1\x0d\x2c\xb4\x6e\x85\xcd\x73\x38\xd2\x1a\x52\x22\x37\x36\x21\x08\xdd\x66\x41\x7b\xab\x85\x20\x8f\x70\x73\x7b\xf7\xa4\x30\x00\x14\x82\x0b\xd0\x2e\x6f\x41\xd8\x0e\x21\x3c\x35\xc0\x0a\x34\x00\xab\x15\x78\xa3\xda\x41\xb3\x88\x6e\x81\xb0\x08\xc2\x73\x79\xca\x38\x7b\x4a\x78\x26\x21\xbc\x14\x3c\x45\xa1\x28\x4a\xc8\x73\xad\x57\x47\x35\xc0\x98\xb2\x1d\xa4\xf5\x38\x65\x40\xe2\x18\xb8\x09\x53\xae\x2f\xd0\x4b\x38\x5a\xb9\x8d\x1c\xaf\x29\x11\xca\xf0\xd9\x97\x0f\xc0\x03\x11\x10\x11\x45\xb4\x76\xb3\xf3\xdc\x11\x67\x51\x96\x91\x1c\xd2\x56\x9a\x6e\xb8\x42\xc5\xb8\x32\xa8\xde\x12\x89\x1f\x9e\x52\x6c\xce\x68\xcd\x79\x15\x9e\xcb\xb3\x2f\x29\x17\x0a\xa3\xf6\x24\x33\x0d\x14\x26\x69\x4c\x14\xc2\x3c\x15\xf4\xa1\xc8\x65\x4b\x31\x8e\xe6\x10\xee\xc7\xc4\x58\xa2\x27\x48\x07\x6f\x9e\xb7\x23\xcb\xcd\x3d\x26\xc4\x64\x59\x04\x85\x8f\x9f\x24\x67\xc7\x73\xad\x21\x5c\x0b\xba\xa3\x8c\xc4\x8e\x27\xad\xcb\x13\x5b\x58\x80\x57\xf8\x57\x46\x05\x46\x81\xc1\x7a\x96\xa4\xea\x69\x9d\x50\x55\x40\x59\xf2\x84\x9a\x4d\xd4\x93\xd6\x80\x2c\xaa\x96\x87\xe7\xd2\x5c\xa5\x6b\x25\xcc\x61\xe6\xf9\x52\xda\x4f\xd5\xac\xf9\xc7\x2e\x2c\x16\xb5\x19\xf6\x00\x2d\x42\xff\xcb\x8c\x4e\x27\xd4\x30\x16\x5e\x91\xc7\xf7\x28\x25\xd9\xe1\x0b\xa3\xd0\xc7\x60\xf3\x97\x3d\x92\xdd\x05\x0d\x7f\x21\xf2\x34\x8a\xa8\xa2\x9c\x91\xb8\xef\xbe\x37\xe9\xf0\xcd\x0e\x5b\xc8\xdd\xc3\x68\x9c\xd0\x4f\x86\xfd\x2a\x25\x48\x48\x7a\x53\xc0\xb9\xed\xbf\xa6\x3d\x59\x95\xbc\xbf\xa9\x08\xe8\x85\x56\x47\x38\x57\x98\x4c\x82\x64\x27\xb6\xd1\x70\xe1\x8e\xb1\x46\x64\x0f\xf2\x3a\xbb\x73\xcf\xbe\x83\xee\x66\x12\xa8\x32\xa5\x11\x3c\xe6\x1f\xdd\x1a\x1d\x36\xba\x26\x1f\xc9\x2e\xbc\x42\x12\x95\x42\xbd\x84\xd7\x1d\x35\x0b\x7e\xb0\x93\xbf\x3b\x01\x46\x63\xa7\x69\x02\x55\x26\x98\xf9\xdd\x45\x74\x14\xf4\xa8\x9c\x89\x26\xda\x05\x29\xf4\x6a\x3c\x9c\x74\xb5\xd4\x3f\x6f\xe6\xbb\x93\x95\x9a\x15\x97\xbd\x2e\x0e\x76\xdc\xe8\xb4\xd6\xe6\x0f\x33\x31\xaa\x1d\xcd\x73\xfb\x99\xd7\x7a\x5b\x73\x53\x3d\x9b\x52\x90\xf3\xbc\xaa\x6b\xad\x55\x0b\x53\xda\x64\x78\x81\x8f\x6f\xb3\xed\x16\x85\xe1\x31\x58\xc2\x6b\xcf\x76\x41\x2d\x10\x5e\xee\xfb\x96\x58\x94\x53\x0e\xc2\x24\xf6\x3b\x89\x33\x3c\xfb\x92\x0a\x94\x92\x72\x56\xf0\xea\x89\x3c\xf3\x5c\xf6\x76\x29\x6a\x72\xe8\x29\xaa\xb6\x21\x01\x13\x33\xea\x56\xd0\xff\x11\xdd\x57\xfb\x37\x3b\x12\x3c\xbd\x24\x9b\xcf\x46\xd6\xeb\xc4\x07\x4f\xa1\x3e\x84\xf6\xe7\x42\x79\xf6\x75\x74\xb5\x02\xc6\x1f\x61\xcb\x05\x08\xdc\x65\x31\x11\x8d\x1e\xa7\x3a\xca\xd1\x06\xe6\xc1\xad\x93\xbd\xfd\xcb\x48\xf7\x32\xde\xbb\x4c\xea\x5c\x9e\x51\x65\xfd\x5d\xcb\x37\xdd\xb3\x78\x2b\x4e\x17\xe3\x57\xe4\xf1\xe5\xb6\x2a\x7e\xe6\x9a\x7a\xd6\xfc\x56\xfc\x3f\x5c\xfe\xba\xaf\xc1\x57\xff\xba\x52\x50\x46\x1e\x7d\x2b\xd3\xeb\x60\x37\x8d\x81\x42\xd8\x15\x8c\xa6\x92\x8c\x76\x64\xab\x15\x7c\x58\xbf\x5b\x1f\x83\x6f\xca\x7e\xc0\x81\x46\xc8\x13\xc9\x8e\x76\x83\x38\xe6\x18\x8d\x67\xf9\xcc\x18\xd3\xf7\x0d\x5b\xea\x35\xa5\x8a\x4f\xb7\xa4\x3d\x8e\xb4\xb1\xc7\x22\x80\x45\x61\x47\x97\x85\x1d\x0d\xec\xa9\xfe\x69\x88\x96\xe6\x56\x24\xe4\x33\x2e\x6e\x6e\xcb\x39\xdf\x2f\x4d\xd0\x18\x59\x6d\x54\x83\x59\xb3\xdd\x69\xd9\xd7\x69\x0e\x75\xba\xc7\x3c\xf8\xcb\x17\xa6\xd5\x3d\xfe\xd2\xaf\xa5\x5f\x99\xd3\x97\xab\xdb\x43\x3c\xb6\xe5\xfc\xe0\x32\xbf\x49\x97\x39\x6a\x0a\x27\x19\xbd\xa2\x65\x9e\x56\x34\xf7\x6e\xcc\x0c\xec\x03\x78\xd7\xde\xc8\x8a\x7e\x53\x4d\xcb\x3e\xe0\x0f\x41\x15\xda\x02\xd1\x75\xc0\x95\x4f\x69\x2e\xf3\x19\x03\x46\xe3\x6e\x78\x67\x14\x5c\x75\x39\x01\x92\xa6\xc8\xa2\x45\xf1\x7d\xe9\x4b\x30\x18\x73\xb3\x3e\x27\x56\x0d\x2b\x73\xb8\x1b\x9e\xa4\x5c\xda\x23\x2b\x0d\x99\xc7\x79\x2c\x5b\x6d\x50\x0d\xdf\xef\x21\x6b\x16\x06\xa1\x8f\xe0\xf5\x39\xae\xe7\xf9\xd0\xd9\xb3\xc1\xf8\xae\x8f\xdf\xa1\xfd\x97\x18\xbd\x8d\x55\xfb\x91\x1c\x8c\xde\xc1\xe8\x1d\x8c\xde\x10\x73\xc3\x46\x6f\xf0\x46\x4f\x33\x58\xcf\x2e\x40\xed\x3c\x4a\x79\xbf\xec\x6c\x36\xa1\x08\xed\xf9\xd0\x86\x77\xed\xad\x43\xa3\xb5\xa8\xa4\x66\xac\x1e\x75\x13\x0e\xfa\x14\x6b\xb0\x11\x1b\x5f\xd1\x68\x71\x7c\x26\xd1\x72\xf2\x23\x67\x1b\xa2\x2c\x29\x45\x9a\x61\x18\x06\x4b\x67\x20\x1b\xab\xfe\x09\x00\x00\xff\xff\xa8\x0c\x30\x10\x2b\x1d\x00\x00") + +func templatesSerializersAllofserializerGotmplBytes() ([]byte, error) { + return bindataRead( + _templatesSerializersAllofserializerGotmpl, + "templates/serializers/allofserializer.gotmpl", + ) +} + +func templatesSerializersAllofserializerGotmpl() (*asset, error) { + bytes, err := templatesSerializersAllofserializerGotmplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/serializers/allofserializer.gotmpl", size: 7467, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xeb, 0x21, 0x72, 0xcc, 0xc6, 0xf2, 0x55, 0x19, 0xde, 0x64, 0xfe, 0xf4, 0xa7, 0xcd, 0x92, 0xd9, 0xd4, 0xdf, 0xe9, 0x53, 0xb, 0xee, 0xae, 0xaf, 0x60, 0x18, 0x73, 0x49, 0x75, 0x9b, 0x2c, 0xff}} + return a, nil +} + +var _templatesSerializersBasetypeserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xdc\x56\x4d\x6f\xe3\x36\x10\xbd\xf3\x57\xbc\x1a\xde\x40\x02\x54\x19\x08\x7a\x4a\x91\x43\x3f\xd0\x9e\xba\x87\x64\x7b\x0a\x82\x2e\x25\x8d\x62\xee\x4a\xa4\xc2\x0f\x1b\xae\xa0\xff\x5e\x90\xa2\x6c\x25\xb5\x13\xbb\xbd\x14\xbd\xd9\x24\x67\xe6\xf1\xbd\xc7\x19\xf5\x3d\x2a\xaa\x85\x24\x2c\x3a\xd5\xec\x5a\xa5\xbb\xb5\x28\xef\x49\x0b\xde\x88\x3f\x49\x2f\x30\x0c\x6c\xb5\xc2\xef\xb2\xe5\xda\xac\x79\xd3\xf7\xe8\xb8\x29\xc3\x2e\xf2\x8f\xbc\x25\x0c\xc3\x7d\x23\x4a\x82\x9b\xce\x18\xcc\x72\xc1\xf8\x4d\x03\x55\xe3\x68\x2c\xab\x9d\x2c\xcf\xc9\x9f\x68\xe2\x15\x69\x08\x95\xdf\x85\x5f\x19\x4a\x25\x8d\x6b\x49\x43\x3b\x69\x45\x4b\xf9\x4f\x71\x21\x45\xf2\xf0\x78\x34\x55\x06\xd2\x5a\xe9\x14\x3d\x03\x36\x5c\x83\x1a\x6a\x49\x5a\x83\x87\xc7\x2f\x46\xc9\xfc\x8e\x6f\x7f\x23\x63\xf8\x13\x31\x40\xd4\xfe\x38\x6e\x6e\xf7\xa5\xa6\x12\x11\x4d\x86\xab\x29\x41\xfa\x7d\x38\xfb\xcd\x2d\xa4\x68\x42\x7a\x40\x93\x75\x5a\xfa\x85\x50\x97\x01\x03\x8b\x75\x35\x19\xd7\x58\x9c\x80\xc9\x80\x5a\x69\xfc\x91\x4d\xf8\x3c\x06\xcd\xe5\x13\x1d\x00\x8f\x25\x54\xf1\x25\x9b\x40\xba\x37\x59\x4c\x62\xe4\x81\xb7\x34\x64\x88\x97\x7c\x01\xfc\x18\x74\x0f\x7e\xdc\x09\xc8\x6f\xc1\xbb\x8e\x64\x95\x8c\xff\x33\x8f\x24\x65\xe3\xa1\x18\x8c\x69\x4b\x8a\x86\x0d\xec\x7d\x23\x9d\xf2\xd0\x3f\x76\xce\x85\xa6\x79\xdf\x32\xab\x15\xb6\x04\x49\x54\xc1\x2a\xf8\xec\xb0\x6b\x61\x60\xb7\xa2\xa4\x0c\x46\xa1\x16\xda\x58\x08\x69\x15\x38\x0a\x57\xd7\xe4\xc9\xab\xb8\xe5\x7b\x9d\x84\x72\x56\x34\x01\xd1\x0f\x4d\x13\x31\xa6\xec\xb8\x14\xc7\x3c\x74\x60\xf8\x1d\xc9\xc7\xb2\x07\xbd\x07\x36\xb2\x76\x46\x18\x1e\x1e\x8b\x9d\xa5\x7f\x4b\x58\xe1\x6a\x7f\x65\x9f\xca\xe4\x1f\x69\xfb\x63\x60\x24\x54\xf0\x37\xee\x7b\x7f\xe9\xfc\x67\x61\x4a\x2d\x5a\x21\xb9\x25\xe3\x8d\x50\xb8\xfa\xfa\x64\x9c\x8f\x22\x59\x79\x0f\x8c\x92\xd8\x35\x45\xde\x3d\xc0\x51\x11\x61\x46\x79\xbc\x38\x0a\x35\xd9\x72\x1d\xce\x6d\x78\xe3\xc8\xb7\x23\xff\xa7\xef\x5f\xd4\x56\xfa\x17\x41\x8d\x4f\x8c\x4e\xab\x8e\xb4\xdd\xe5\xf1\xbd\x3e\x91\xfd\xb4\xeb\x08\xc6\x6a\x57\x5a\xf4\xaf\x3c\x79\x3c\x89\xb1\x5a\xc8\x27\x7c\xf6\x9d\xe5\xc6\x07\x68\x21\x6d\x8d\xc5\x87\xe7\xc5\x89\x90\xcf\x41\xdd\x37\xfa\x4e\xe1\xea\x0c\x57\x11\xcd\x05\x3d\xe7\x90\x72\xc3\x1b\x51\x71\x4b\xf9\x1d\x3d\x3b\xa1\xa9\xba\x0f\x28\x93\xb3\xf0\x65\x58\x14\xaa\xda\x2d\xb2\x89\x90\xfc\x0c\x1e\x2e\x80\xb9\x5a\xe1\xd3\x5c\xa4\xd3\x02\x09\x03\x67\xc6\x67\x58\x91\x25\xdd\xfa\x29\xb6\x5d\x0b\x2f\xb3\x17\xca\x2a\x94\x9a\xb8\x25\x70\x59\x1d\x0c\x1f\x64\x0f\xfe\xf6\x4f\x94\x01\x66\x2b\xbc\x35\x2e\xb8\x4e\xbc\x41\xdf\x7f\x1b\x5b\xf2\xf2\x6b\x86\xe5\xc6\x73\xfb\x37\x23\x87\x93\x25\x37\xc1\x6a\x73\x7a\x97\x5f\x31\x0c\x37\xb1\xd9\xce\x06\xc2\xf8\x20\xe8\x19\x89\xeb\x3a\xd2\x48\x0e\x68\x96\xe1\x81\xa5\xe9\xb4\xb5\xdc\xa4\x18\x86\xbe\x47\xc9\x5b\x9a\x9d\x18\x17\xa9\x31\xf1\xd7\x72\x13\x57\xc6\x27\x33\x96\x7c\xdb\x62\xd7\x19\xae\x46\x40\xc7\xb4\x3b\x35\x1f\xa6\x09\xb1\xdf\xbd\x9a\x0f\x80\x89\xb3\x3d\x8c\x59\x1f\x9b\xd2\x28\x1d\x1e\x7b\xf2\xdd\xf5\x75\x86\x85\x90\xc1\xab\x6f\x98\x20\xf8\xe4\x06\x1f\x9e\x2f\x34\x24\x1b\xd8\x0c\x0a\x9b\x7d\x06\x15\xdc\x90\x4f\x73\xe9\x37\xd0\x7f\x7f\x74\x45\xaa\x4f\x54\xfd\x55\x85\xf6\xb6\xaf\xfb\x6a\x6a\xfc\x6f\xbf\x01\xcf\x64\x65\x5e\xfe\x25\x35\x33\x1f\xfd\x15\x00\x00\xff\xff\x4e\x29\xe9\x04\x4e\x0b\x00\x00") + +func templatesSerializersBasetypeserializerGotmplBytes() ([]byte, error) { + return bindataRead( + _templatesSerializersBasetypeserializerGotmpl, + "templates/serializers/basetypeserializer.gotmpl", + ) +} + +func templatesSerializersBasetypeserializerGotmpl() (*asset, error) { + bytes, err := templatesSerializersBasetypeserializerGotmplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/serializers/basetypeserializer.gotmpl", size: 2894, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xea, 0xa6, 0x45, 0xd8, 0xdf, 0x80, 0xf1, 0xc8, 0xb0, 0xae, 0xaa, 0xf8, 0xf3, 0xf0, 0x66, 0x1f, 0x8, 0x2a, 0xce, 0x77, 0x63, 0xb3, 0x6f, 0xad, 0xb8, 0x99, 0x46, 0xec, 0xa0, 0x16, 0xc4, 0xd1}} + return a, nil +} + +var _templatesSerializersMarshalbinaryserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x90\xc1\x4b\xc3\x30\x14\x87\xef\xf9\x2b\x7e\xee\x20\xcd\xa8\xdd\x5d\xe9\xc5\xa3\xe0\x84\x0d\xf1\x20\x1e\xd2\xf6\x57\x0d\xb4\xd9\x78\xcd\x26\x33\xe4\x7f\x97\xb4\x22\x9b\xf4\xea\x25\x87\xf7\xc2\xf7\xf8\xbe\x10\xd0\xb0\xb5\x8e\x58\xf4\x46\x86\x0f\xd3\xdd\x5b\x67\xe4\xb4\xa5\x58\xd3\xd9\x2f\xca\x02\x31\xaa\xd5\x0a\x8f\xe7\x6b\x58\xe7\x29\xad\xa9\x09\xdb\xef\x3b\xf6\x74\xde\x78\xbb\x73\xaa\x3d\xb8\x1a\x59\x08\xc5\x86\x35\xed\x91\xb2\x36\x3d\x63\xc4\x32\x04\xec\xcd\x50\x8f\x50\x14\x69\x8a\x18\xf5\x25\x36\xd3\xc8\x5e\xdf\xaa\x93\x67\x0e\x8a\xec\x44\x23\x28\xc0\xb6\x08\x01\x17\x44\xc4\x88\xb2\x84\xb3\xdd\xf8\x03\x10\xfa\x83\xb8\x34\xc8\xd3\xa3\x80\xa8\x7e\xa7\xc3\xa7\x79\x2f\x5e\xc4\x7a\x3e\x6c\x9f\xd6\xd9\x0c\x4c\xab\xa8\x92\xe5\xb3\xeb\xff\xc7\xf3\x0f\x38\xab\x30\x89\xea\x49\x74\xb4\x38\x1a\x81\x70\xc0\x2c\x62\xea\x40\x11\xdc\x96\x93\xd0\x86\xa6\x19\x7d\xaa\x1c\xd7\xc2\x41\xdf\x8d\xeb\xab\x99\x2c\x14\xf9\x29\xb2\x9c\x2d\x99\xce\xaa\xf3\x88\x2a\xaa\x10\x6e\x40\xd7\xa4\xd3\xdf\x01\x00\x00\xff\xff\x22\x3a\x4f\x6c\x26\x02\x00\x00") + +func templatesSerializersMarshalbinaryserializerGotmplBytes() ([]byte, error) { + return bindataRead( + _templatesSerializersMarshalbinaryserializerGotmpl, + "templates/serializers/marshalbinaryserializer.gotmpl", + ) +} + +func templatesSerializersMarshalbinaryserializerGotmpl() (*asset, error) { + bytes, err := templatesSerializersMarshalbinaryserializerGotmplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/serializers/marshalbinaryserializer.gotmpl", size: 550, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x49, 0x26, 0x66, 0xd8, 0xe2, 0x4f, 0x4, 0x11, 0x3, 0xae, 0x3c, 0xf, 0x5, 0x8e, 0x7d, 0x1f, 0xd3, 0x91, 0xb1, 0x55, 0x3f, 0x6e, 0x43, 0x34, 0x32, 0x6b, 0x52, 0xd9, 0xa9, 0xab, 0xed, 0x32}} + return a, nil +} + +var _templatesSerializersSchemaserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x90\x41\x4e\xf3\x30\x10\x85\xf7\xff\x29\x9e\xba\x6a\x2b\xfd\x2e\x57\x28\xb0\xa0\xab\x22\xb5\x17\x98\x26\x93\x66\x90\x63\x5b\x9e\x29\x50\xa2\xdc\x1d\x19\xa1\x92\x45\x50\xbb\x60\x67\x7b\x3e\x7d\x6f\xfc\xfa\x1e\x35\x37\x12\x18\x33\xad\x5a\xee\x68\xc7\x59\xc8\xcb\x07\xe7\x19\x86\xa1\xef\x57\x4b\xe8\x9b\x58\xd5\xb2\xc2\x22\xac\x65\x50\x4a\x39\xa6\x2c\x64\x0c\xbd\xe0\x68\x62\x06\x85\x33\x8e\xf2\xca\x01\x76\x4e\x8c\xe5\x6a\x18\xfe\x01\x7d\xff\x1f\xd2\x80\x42\x0d\xb7\xd1\xdd\xe9\xb0\x2f\xc3\x79\x88\x06\xf7\x44\x7a\x4f\xca\xe5\x65\x81\x2f\xba\xf0\x30\xee\x92\x2f\x01\xb3\x96\xf4\x51\xb4\xca\xd2\x49\x20\xe3\x7a\xbc\xa0\xc3\xc5\xcf\x5e\xb9\x84\xb8\x8d\xee\x4f\xc9\xf3\xa4\xcb\xca\xe4\x9a\x60\xb4\xd1\x1f\x2d\xb4\xae\x6b\x31\x89\x81\xfc\x73\x8e\x89\xb3\x09\xeb\xa4\x9a\x26\xc0\x2b\xfa\x52\xea\xfc\x68\x98\x7b\x0e\x70\x6b\xef\xb7\xcd\x02\x77\x8b\xef\x76\x7f\xda\x9e\x2e\x97\x0a\x7f\x43\x82\xdb\xe8\x43\xec\x92\xe7\xf7\xed\xe1\x85\x2b\x83\xdb\x59\x96\xca\x6e\xfe\x59\x88\x53\xe8\x6f\xc9\xa1\x2e\x97\xd1\xf1\x33\x00\x00\xff\xff\xa7\x46\x92\xea\xa7\x02\x00\x00") + +func templatesSerializersSchemaserializerGotmplBytes() ([]byte, error) { + return bindataRead( + _templatesSerializersSchemaserializerGotmpl, + "templates/serializers/schemaserializer.gotmpl", + ) +} + +func templatesSerializersSchemaserializerGotmpl() (*asset, error) { + bytes, err := templatesSerializersSchemaserializerGotmplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/serializers/schemaserializer.gotmpl", size: 679, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5a, 0xf8, 0xc2, 0xed, 0xfb, 0xe0, 0x8f, 0xdc, 0x8e, 0xa8, 0x4a, 0x5d, 0x5e, 0x53, 0x3f, 0xd6, 0x9d, 0xf4, 0x4a, 0x2a, 0x9a, 0x7d, 0x96, 0x5f, 0x20, 0xbc, 0xb7, 0x66, 0x63, 0x42, 0x6c, 0x35}} + return a, nil +} + +var _templatesSerializersSubtypeserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x58\xdf\x6f\xdb\xb6\x13\x7f\xb6\xfe\x8a\xab\x91\xe6\x2b\x05\xfa\xca\x5b\xbb\xa7\x0e\x19\xd0\x9f\x43\x0a\xd4\x19\x9a\x75\x2f\x41\x30\xd0\xd2\x29\x66\x23\x91\x2a\x49\xd9\xf5\x04\xff\xef\x03\x45\x4a\xa2\x6c\xc9\x71\xb3\x3e\xac\x58\xdf\x24\x91\xbc\xfb\xdc\xdd\xe7\x43\x1d\x59\x55\x90\x60\x4a\x19\xc2\x74\x49\xe4\x2b\x2a\x63\x41\x73\xca\x88\xc2\xe4\x0a\x05\x25\x19\xfd\x0b\xc5\x14\xb6\x5b\x6f\x36\x83\x0f\x2c\x27\x42\x2e\x49\xf6\xf6\xea\x72\x0e\x65\xf3\x26\x41\x2d\xa9\x04\xbe\xf8\x88\xb1\x82\x35\x55\x4b\x20\x50\xf0\x6c\x93\x73\x51\x2c\x69\x0c\x6a\x53\x20\xa4\x82\xe7\x40\xa0\x5e\x2a\x95\x28\x63\x55\x0a\xf4\xd2\x92\xc5\xe0\x57\x55\xf4\x1e\x63\xa4\x2b\x14\x73\x92\xe3\x76\x0b\x67\x55\x05\x05\x91\x71\x0d\x00\x22\xfd\x15\xb6\xdb\xa0\x0f\xc1\x17\x64\x0d\xd7\x37\x8b\x8d\xc2\x00\x50\x08\x2e\xa0\xf2\x00\x56\x44\x40\x42\x14\x81\xaa\x02\x85\x79\x91\x11\x85\x30\xd5\xb8\x78\xa9\x5e\x10\x89\xbf\x6f\x0a\x7c\xc1\x93\xcd\x14\x22\x1d\x19\xc0\xa2\x4c\xe1\xd9\x39\x68\x43\x32\x9a\xe3\xfa\x45\x99\xa6\x28\xb4\xf9\xc0\x03\x48\x30\xd6\xa3\x1f\x25\x67\x7a\xf0\x15\xc6\x3c\x41\xe1\x2f\xca\xd4\x8e\x46\x1f\x24\xce\xcb\x7c\x81\xc2\x0f\x3c\x0f\x80\xa6\x1a\x8d\x5e\xa3\x07\xcd\x7c\xff\x54\x43\x0a\x7e\xae\x47\x1e\x9d\x03\xa3\x59\x0d\x76\x22\x50\x95\x82\xe9\xcf\x1e\x80\x06\x53\x55\xda\x00\x17\x10\x5d\xc8\x06\xad\x7e\xbe\x2a\x17\xf5\x63\x8d\x58\xc7\xb8\x20\x12\xfb\x31\xbe\x2d\xe5\x78\x80\x07\xe3\xfb\xe7\xe1\x69\x34\xfb\xe1\x01\x0c\xc4\xf7\x7f\x40\x96\x68\x60\x26\x5a\x41\xd8\x2d\x42\xf4\x3c\xcb\x2e\x53\x03\xd7\x4c\xa2\x29\x30\xae\x7a\x69\xb0\xa3\xee\xb2\xdf\x04\x2f\x50\x28\x8a\xb2\x1b\x6d\xd7\xef\x64\xd1\xb7\xf6\x5e\x7f\x2e\xb8\x50\x98\x04\xee\x92\xbe\xd3\xf7\xf8\xa9\xa4\x02\x93\x2e\xdd\x44\xe3\x1b\xa4\xa5\x2d\x59\x74\x21\x9f\x0b\x41\x36\xb0\xdd\x5e\xdf\xf4\x27\x5e\x28\xcc\x65\xf4\x2b\xb7\x41\x54\x15\x60\x26\xed\x93\x33\xad\x37\x81\x59\xdf\x34\xd5\x7a\xa1\xec\xd6\xd7\x0c\x8a\x46\x84\xf1\xe8\x1c\xa6\xac\xcc\xb2\xa9\x4d\x7b\x55\x41\x4c\x72\xec\xcd\x0a\x9b\xba\xb5\x2a\xda\x03\x7e\x10\xf6\x55\x46\x63\x3c\x1e\xbb\xbf\xcb\xb7\x03\xf8\x43\x10\x25\x53\x34\xc7\x48\x0b\xfb\x25\x67\xb2\xcc\x35\xdf\x82\x3a\x18\xcb\x38\xcb\xab\xd3\xd3\xe6\x8d\xf2\xe8\xf5\xe5\x1b\x1b\xf1\x0e\xd5\x0c\xd9\xe0\x50\xd9\xce\x07\xb3\xe4\x35\x2b\x3b\x52\xd8\x80\xbd\x43\xd6\xbe\xd1\xe4\x1e\x95\xda\x3d\x0d\xf7\x92\xd3\x10\x75\xe4\xd3\xce\x87\xde\xeb\xce\xcb\xb8\xa6\xbf\x58\xcf\x87\xb5\x5c\x08\x5e\x7c\x97\xf2\xb7\x26\xe5\xf1\xaa\xdd\xab\xe4\xbe\x8a\x47\x0d\x7d\xa3\x69\x7d\xb8\x88\x8f\x14\xa7\x95\x8d\x40\x59\x66\x0a\x06\x01\xba\x02\x3e\xf9\x33\x84\x93\x82\x08\x64\x4a\x27\x73\xf0\xd7\x6e\xc7\x75\x66\x19\x67\x9b\x9c\x97\x72\x4f\xbd\xdd\x9c\xfd\x0e\xc0\x75\x47\x93\xcf\x21\x9c\xac\x48\xa6\xbd\x35\x8b\x86\x1b\x83\x6e\x67\xc0\x76\xa6\xd3\xf6\x72\xf1\x86\x62\x96\xd4\xc6\x9c\xc8\xf6\x56\xd7\xe3\xdd\xc6\x63\x66\x99\xf4\x44\x2e\x15\x5d\x3b\xc6\xf2\x79\xdd\xb7\xf5\x8b\x7c\xd0\x5b\x47\xdb\x23\xed\xef\xff\xa3\x0e\xdb\xef\xef\xdf\xbb\x4e\x69\x7a\x0f\x60\x4d\xb4\x0e\xd9\xf0\x1c\x3f\xb0\x24\x9c\x9d\xc1\x9c\x2b\x50\x4b\x34\xa7\x82\x35\xfe\x4f\x20\x64\x9c\xdf\x51\x76\x0b\x29\x17\x11\x9c\xcd\x76\xe8\xca\x45\x2d\x11\xff\xa7\x27\x4f\x42\x98\x52\xb6\x22\x19\x4d\xa0\xaa\x5a\x07\xdb\x2d\xac\x48\x56\xe2\x33\x78\xfc\x69\x1a\xde\x03\x37\x78\xe8\x2f\xac\xcd\xc8\xd7\x60\x9f\xe5\x4f\x9f\xd6\x5f\xbb\xbe\x63\xec\x19\xa9\xe3\x39\xec\x6f\x3f\x87\x2c\x3f\xe0\xbf\xdf\xcb\xa1\x4d\x05\x61\xc9\x90\xd0\xbb\x4f\x7d\x91\xfd\x87\xb4\xff\x5d\xfa\xff\x36\xe9\x77\xc1\x36\xfc\x69\x7f\xea\x8e\x7c\xf6\xc6\xbe\x5e\x27\x3c\x9b\xe9\x41\xa7\xa0\x1d\x22\xd3\xa6\x38\x3b\xca\x50\x4b\x54\x13\x65\xac\x41\xb1\x73\xda\xf6\xc4\xb4\x55\x7b\x76\x47\xbb\xa7\xce\xee\x48\x1f\xd3\xef\x86\xdd\xe7\x33\x1d\x95\x7b\x07\x64\xdc\x9b\xe8\xbc\xf6\x56\x44\x77\x0b\x49\x42\x15\xe5\x8c\x64\x03\xb9\xe9\x06\xa1\x1b\x7d\x06\x02\x49\x02\x82\xac\x43\x10\x98\xf3\x15\x02\x23\x39\x26\x75\x1b\x68\xa6\x84\xf5\x2e\x44\x92\x04\x14\x87\x9c\x14\x3a\xb1\x64\xad\x4d\x48\xbd\xad\xe4\xe4\x0e\xfd\x9c\x14\xd7\xa6\x7b\xbf\xb1\x60\x46\xa0\xd4\x37\x29\xef\xc9\xfa\x1d\x4a\x49\x6e\x9d\x76\x90\x32\x85\x22\x25\x31\x56\x5d\x1e\x82\xde\x85\x4a\xbd\xb4\xed\x3d\xfd\x1a\xf2\x69\x83\xe4\xa8\xdb\x95\x43\xe4\x49\x30\x43\x85\x7e\x63\x2f\xac\x1b\x39\x41\x99\x4a\x61\xfa\xf8\xd3\x14\x5c\x9d\x0c\xb0\xf5\x50\xcc\x26\x8a\x0c\x59\x6b\x3d\x80\x5f\xe0\x87\xee\x04\x13\xfd\xa1\x65\xfa\xfa\x73\x21\x50\x4a\xca\x99\xa9\xef\x40\x62\xbb\xdb\x2c\x19\x2f\x31\x27\x9a\x74\xd3\x51\xbf\x06\x6a\xca\x05\xdc\x85\xb0\xd2\x29\x34\xb1\xb7\xd5\x6b\x0e\x14\xba\x7d\x55\x5c\x57\xf8\x8b\x7d\x58\x0b\xa3\x55\x5a\xe9\x44\x36\x67\xcd\x21\x1b\xd1\x85\x9c\x97\x59\x46\x16\x99\xce\xee\x69\x5b\xfb\x1a\xcf\x50\x55\xf7\x2a\x0b\xe0\xb6\xec\x43\xc9\xbc\xbe\xbb\x81\x73\x13\x61\x7b\x62\x1a\xff\xf1\x8e\x94\xa3\xc9\xda\x7d\x67\x01\x8b\x8d\xd1\xcc\xdb\x7a\xde\x6c\x06\xef\x9c\x7b\xe1\x2f\xba\x15\x56\xfc\xf8\x3b\xe1\x91\xe3\xb2\xe3\xdb\x0f\xc0\x37\xf7\xc1\xa1\xf9\x7b\x04\x50\xe9\x65\x27\xc2\xdd\x59\xf4\x89\x64\x67\xab\xf1\x26\xf5\x85\xea\x8f\x21\x2c\x9e\x84\xb0\x78\x6a\x6f\x95\xcd\x67\x5d\x9e\xda\x9a\x37\xd1\x33\xf4\xab\xe5\x80\x75\xed\xdf\x77\xd1\x7c\x29\xe6\x9c\x35\xfd\x82\xb9\x94\x0d\xbc\x49\xff\xd4\x56\x79\x93\x49\x97\xd7\xda\x8d\x37\xd9\x7a\x13\x0d\xe8\x18\x97\xae\xbf\xe7\x2c\x79\xb0\xc3\xa3\xb6\x5a\xab\xf5\x61\x22\xb9\xca\x9f\xcd\x6a\x8d\x9b\x12\x5b\x2e\x68\xb5\xea\x2e\x80\x74\x9b\x75\xb7\x13\xd7\xab\x16\x4f\xc7\x62\x1e\x72\x37\x70\xaf\xb0\x73\x8d\xd0\xc6\xe7\x2a\xc3\xa5\x74\x93\x08\xb9\x26\xb7\xd1\x4b\xce\x62\xa2\x6a\x3e\x75\x8c\x08\x42\x4b\x77\x67\xd9\xdf\x01\x00\x00\xff\xff\xf5\xab\x3a\x01\x3d\x19\x00\x00") + +func templatesSerializersSubtypeserializerGotmplBytes() ([]byte, error) { + return bindataRead( + _templatesSerializersSubtypeserializerGotmpl, + "templates/serializers/subtypeserializer.gotmpl", + ) +} + +func templatesSerializersSubtypeserializerGotmpl() (*asset, error) { + bytes, err := templatesSerializersSubtypeserializerGotmplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/serializers/subtypeserializer.gotmpl", size: 6461, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x38, 0xda, 0x25, 0x36, 0xe9, 0x81, 0xa, 0x2a, 0x43, 0xc0, 0x2, 0x5, 0xb4, 0x4e, 0x7a, 0x66, 0x2, 0x2c, 0x8e, 0x76, 0x64, 0x7a, 0x51, 0xc1, 0x93, 0xa8, 0x13, 0xe7, 0xff, 0x73, 0x8c, 0x12}} + return a, nil +} + +var _templatesSerializersTupleserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x95\x41\x6f\xe3\x36\x10\x85\xef\xfc\x15\xaf\x41\xb0\x90\x5a\x47\x41\xda\x5b\x8a\x14\x68\xd1\x3d\xa4\xc0\xba\xc5\xa6\xdb\x4b\x60\x14\xb4\x34\x8a\xb9\xa0\x28\x81\xa4\xec\xb8\x04\xff\x7b\x41\x52\xd6\x2a\xb6\x95\xf6\x10\xec\x25\x88\xc9\xa1\xde\xcc\xbc\x8f\x1c\xe7\x50\x51\x2d\x14\xe1\xc2\xf6\x9d\xa4\x07\xd2\x82\x4b\xf1\x0f\xe9\x0b\x78\xcf\xae\xaf\xf1\x49\x35\x5c\x9b\x0d\x97\xbf\x3d\xfc\xbe\x44\x7f\xf8\x65\x60\x37\xc2\x20\x1e\x82\xdd\x77\x84\x5a\xb7\x0d\x38\x62\x18\xd7\x9a\xef\x59\xdd\xab\x12\x99\x73\xc5\x47\x2a\x49\x6c\x49\x2f\x79\x43\xde\xe3\x5b\xe7\xd0\x71\x53\x46\x21\x14\x61\x15\xde\xe7\x2f\xa5\x32\xcd\x77\x78\x5c\xad\xf7\x96\x72\x90\xd6\xad\x86\x63\xc0\xf5\x35\x8c\xe5\x4f\x84\x9b\x05\x9e\xc8\xc2\x6e\x28\xa9\x61\xdd\x5b\x7c\xee\xcd\x64\x89\x01\x5b\xae\x53\xfc\x0d\x1e\x57\x9f\x4d\xab\x8a\x8f\x7c\xf7\x81\x8c\xe1\x4f\xc4\x80\x75\x5f\xe3\xf6\x0e\x41\xc4\x14\x4b\xda\xfd\xd2\xd7\x35\xe9\x20\x9d\x33\xa0\xa2\x32\xec\xc6\x63\x4b\xda\xfd\x4a\x65\x5b\x91\xce\xd6\x7d\x3d\xec\x16\x9f\x0c\x2d\xfb\x66\x4d\x3a\xcb\x19\x03\x44\x1d\x32\x0d\x67\xc2\x66\x8a\xcf\xde\x25\xfd\xfc\xc7\xb8\xf7\xcd\x1d\x94\x90\xb1\x14\x40\x93\xed\xb5\x0a\xeb\x0c\xf0\x6c\x5a\xde\xf7\xb7\xd8\xec\x2b\xcd\x2d\x19\x18\xab\xfb\xd2\xa2\xa1\xa0\x64\xb0\x13\x76\x33\x34\x9e\x24\x35\xa4\xac\x61\x80\x73\x57\x41\xbf\xf8\xb9\xaa\x84\x15\xad\xe2\xf2\xde\x52\x63\x82\x8b\xa9\x0d\x92\x1b\x7b\xaf\x2a\x7a\x86\x50\x36\x1e\x00\xa9\x2a\xed\x3b\x07\xcd\xd5\x13\xe1\x52\x54\xcf\x0b\x5c\x6e\xb9\x0c\x55\x14\x7f\xe8\xb6\x23\x6d\x05\x85\xef\x88\x1a\x92\x54\x36\x94\x83\x9f\xc2\xa9\x10\x0f\xef\x87\x7a\x82\x4c\xc5\x2d\x3f\xeb\x6f\x08\xb7\xd4\x74\x92\x5b\xc2\x45\x45\x9a\xea\x9a\xaa\x87\x72\x43\x0d\xff\x73\xdf\xd1\x05\x8a\x94\x4c\xb2\xe5\xd4\x95\x24\xfc\xf8\x45\x75\x95\xc7\xe8\xd7\x6d\x3a\x35\x2a\xac\x9d\x77\x6a\x36\xf7\x73\xe6\x1d\xd9\x17\x0c\x0c\x7f\x9d\xc3\x0b\xde\xe1\x7d\xe1\x5c\xb4\xe6\xde\xbc\x7f\xee\x5a\x6d\x29\x74\xfd\xac\x4e\xf0\x44\x9a\xe1\xbf\x92\x37\x74\xb2\x1b\x1d\xc3\x1d\xc6\x4f\x2e\x7b\x29\xf9\x5a\x86\xfd\x77\x63\xc0\x6c\x21\x87\x14\x45\x8d\xcb\xf3\xa8\x60\x02\xca\xdd\xc4\xe2\xc3\xc9\x91\x19\x7f\xca\xd0\x2c\x7f\x23\xd6\x3f\x4c\xb0\x3e\x8a\x4c\xf7\xe7\x25\x61\x63\x2a\xdf\xdd\x0c\x5d\xaf\x5b\x8d\xbf\x17\x18\x00\x4d\xd0\x0e\x60\x4c\x82\x6f\x57\xa3\x49\x81\x49\xdb\xf2\xaa\x7a\xc9\x9f\x99\x72\x37\xd3\x88\x39\x10\xb7\x5c\xe6\x43\xc0\x7f\xb1\x77\x9e\xbe\x19\xfe\x52\x07\x55\x6b\x4f\x32\x9a\xf3\x39\x16\x76\x1e\xce\x13\x3c\x0f\x80\xa6\xa7\x22\x3e\x22\xf3\x85\x47\x3b\x2f\x8b\xbf\xb8\xec\xe9\xfd\x73\xa7\xc9\x18\xd1\xaa\xc4\xf2\xd5\x9b\xc3\xcc\xbb\x8e\x54\x95\x7d\x35\xc9\x45\x22\x22\x9f\xf4\x63\xc4\x38\xb5\xc9\xb3\xa3\xe5\xa1\x99\x4a\x48\xe6\x59\x98\x8b\x1f\x26\x53\x71\x76\x26\x0a\x65\xdb\xff\x37\x13\x67\x46\xe2\x44\x25\xcb\x91\xa5\x79\xb8\x48\xf3\x30\x8f\x5e\x87\xab\x1e\x38\x7a\x5c\x09\x65\x49\xd7\xbc\x24\xe7\xdd\xf4\x4d\x9f\xbe\xe2\x57\xe3\x45\x3e\x4a\xa0\x38\x9b\xc0\xe2\xb8\x0d\xc3\x45\x7f\x85\x9e\xc3\x05\xfd\x72\x3d\xe7\x6d\x7d\x63\x90\x12\xfa\xb1\x21\x23\x53\xe1\xd7\x02\xdb\xfc\x15\x4f\xe3\xe5\x1d\x1a\x1d\xe3\x73\xe6\xd9\x24\xf0\xdf\x00\x00\x00\xff\xff\xaa\xdd\xa3\x28\x24\x09\x00\x00") + +func templatesSerializersTupleserializerGotmplBytes() ([]byte, error) { + return bindataRead( + _templatesSerializersTupleserializerGotmpl, + "templates/serializers/tupleserializer.gotmpl", + ) +} + +func templatesSerializersTupleserializerGotmpl() (*asset, error) { + bytes, err := templatesSerializersTupleserializerGotmplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/serializers/tupleserializer.gotmpl", size: 2340, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf1, 0x74, 0xac, 0x39, 0x38, 0xfb, 0x30, 0xa, 0x98, 0x77, 0xaf, 0xfa, 0x90, 0xce, 0x7c, 0xed, 0x34, 0xe7, 0x68, 0x29, 0x54, 0xe4, 0x1a, 0x53, 0xb1, 0x12, 0xc6, 0xb4, 0x4f, 0x4b, 0x1f, 0xbf}} + return a, nil +} + +var _templatesServerBuilderGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x3c\x5d\x6f\xe3\x38\x92\xcf\xa7\x5f\x51\x6b\xec\xde\x59\x0d\xb7\xdd\xb8\xa7\x43\x06\x39\x20\x93\xcc\xec\xe6\x6e\x66\x3a\xe8\xf4\xdc\x3d\x04\x8d\x05\x23\x95\x6d\x5e\xcb\xa4\x86\xa4\xe2\xc9\x0a\xfa\xef\x07\x7e\x8a\xfa\xb2\x1d\x77\x7a\xa7\xf3\x92\x48\x24\xeb\x9b\xc5\xaa\x62\x29\xab\x15\x5c\xf3\x1c\x61\x83\x0c\x05\x51\x98\xc3\xe3\x33\x6c\xf8\x5b\xb9\x27\x9b\x0d\x8a\xef\xe0\xe6\x3d\xfc\xf2\xfe\x23\xfc\x70\x73\xfb\x71\x99\x24\x49\x5d\x03\x5d\xc3\xf2\x9a\x97\xcf\x82\x6e\xb6\x0a\xde\x36\xcd\x6a\x05\x75\x0d\x19\xdf\xed\x90\xa9\xde\x58\x5d\x03\xb2\x1c\x9a\x26\x49\x92\x92\x64\x9f\xc9\x06\xa1\xae\x97\x77\xf6\xcf\xa6\xd1\x00\xff\xec\x07\x2e\x2e\xc1\x8f\x98\x15\xab\x15\x7c\xdc\x52\x09\x6b\x5a\x20\xec\x89\xec\x52\xa9\xb6\x08\x8e\x4c\x50\x9c\x17\x4b\x3d\xff\x87\x9c\x2a\xca\x36\xa0\xc2\xba\x9d\x21\xa5\x14\xfc\x09\x61\x5d\x29\x03\x6a\x8b\x0c\x9e\x79\x05\x02\xdf\x8a\x8a\x75\x20\x79\x14\x86\x1f\xc2\xf2\x24\xa1\xbb\x92\x0b\x05\xf3\x04\x60\x96\x71\xa6\xf0\x77\x35\xd3\x7f\xaf\x77\xf6\x37\xe5\xe6\x17\x43\xb5\xda\x2a\x55\x9a\x07\xa9\x04\x65\x1b\x39\x4b\xf4\xc3\x86\xaa\x6d\xf5\xb8\xcc\xf8\x6e\xb5\xe1\x6f\x79\x89\x8c\x94\x74\x85\x42\x70\x21\x67\xd3\x13\x0a\x4e\xf2\x43\xe3\xa2\x62\x8a\xee\xf0\xf8\x8c\xd5\x8e\xe6\x79\x81\x7b\x22\x4e\x99\x2c\x31\xab\x04\x55\xcf\x07\xa6\xca\x12\xb3\x43\xc3\x4a\x78\xd9\x4c\x4c\xd8\x93\x8d\x11\x8d\xb6\x26\x23\x5d\x09\xcb\x1b\x5c\x93\xaa\x50\xb7\xee\xb9\x69\x7a\xe3\xd1\x40\x6a\x4c\xe3\x17\xdc\xd7\x35\x94\x44\x66\xa4\xa0\xff\x40\x58\xfe\x42\x76\xda\x6e\xae\xee\x6e\x21\x13\x48\x14\x4a\x20\xc0\x70\x0f\xa3\xd3\x80\x32\xa9\x08\xcb\x30\x59\x57\x2c\x3b\x04\x6d\xae\xf9\x85\x37\x46\x1f\xcb\x1b\x9e\x55\xda\xce\x53\x78\x33\x89\xbd\x4e\x00\x04\xaa\x4a\x30\xf8\xd7\xa9\x49\x7a\x0e\xc0\x96\xb0\xbc\x40\x21\x2f\xa0\xfb\xb3\x23\x9f\x71\xbe\x23\xe5\x83\x35\xa4\x4f\xd1\x9f\xda\xc6\x96\x7f\xb3\xeb\xd2\x85\x81\xb2\xe6\x62\x47\xd4\x00\x08\x58\x45\x78\xc9\xda\xb9\xb9\x7d\xb8\xe6\x4c\x56\x3b\x6c\xd7\xcc\xea\x3a\xe8\xc0\x0f\x42\xd3\xcc\x3a\xab\xee\x04\xcf\xab\x6c\x62\x95\x1f\x6c\x57\x65\x95\x54\x7c\xe7\xa0\x45\x4c\xf6\xb9\x73\xa6\xb7\xf4\x33\xd3\x78\xb9\x03\x7b\xc2\x72\x3f\xd3\x2d\xbf\x13\x78\x8f\xe2\x09\xc5\xfd\xb6\x52\x39\xdf\x33\x07\x40\xab\x7b\x9e\x42\x0d\xd0\xd8\x89\xa3\xb3\xc6\x26\x6a\x3b\x18\x08\xd9\xbd\xb7\x33\x2a\x89\xf7\xd6\x91\xfc\x7a\x1b\xcf\x5c\x93\x42\x62\x84\xed\x07\xbd\xf9\xbb\xa0\xac\x3f\x58\xb6\xc3\x76\xfa\xf7\x44\xd2\xec\xaa\x52\x5b\x64\x8a\x66\x44\xf9\x65\x7e\x9b\x2e\xc3\x04\x3b\xff\xea\xee\xf6\xbf\xf1\x79\xb8\x20\xcc\x6f\x27\x38\x04\x48\x04\x8a\x03\x0b\xda\x09\x76\x41\x5d\x83\x20\x6c\x83\xb0\x8c\xec\x24\xb1\x4c\xd4\xf5\x5b\x73\x3e\xdc\xee\xca\x02\xf5\x36\x21\x8a\x72\xd6\x8e\xc3\xf8\x5e\xf4\x8a\xbf\xd0\xc3\xc3\xc5\x8b\x08\x3a\x16\x12\x5f\x00\xaf\x6f\x5a\x3f\x6a\x9d\x1a\xc5\x0a\xa0\x7c\xf9\x01\x49\x8e\x62\x01\x8a\x88\x0d\x2a\xa0\x4c\xa1\x58\x93\x0c\xeb\x26\xb5\x0a\x81\x3a\x69\x55\xe4\xf6\xb4\xd3\xd4\x2f\x5c\x05\x4a\x31\x9f\xcf\xea\xda\xa0\x6f\x1a\xc8\x1c\x32\xd8\x12\x09\x8c\x2b\x78\x46\x05\x8f\x88\x4c\x7b\x33\xbf\x60\x96\x06\xc8\x4d\xda\xe1\xd0\x9e\x97\xa3\x8f\x5e\xf2\xd1\x5e\xfb\x32\xc9\xfb\x3d\xf3\x5a\x92\x6f\xe1\xf5\x77\x65\x2b\xf9\xbd\x96\xfc\xff\x0a\xaa\xb4\xe4\x73\xa2\xc8\x6b\xc9\xbd\x74\xa8\xbe\x9e\xdc\xdf\x97\x3a\x38\xa0\x9c\x75\x24\xaf\x05\xcf\xb0\x8d\x5d\x42\x40\x63\xe2\x9f\x48\x48\x77\xf1\x7b\x8b\x60\x54\x8a\xce\xbd\x5f\x44\xb2\x7e\x7b\x18\x89\x7f\x7d\x55\x50\xa2\x69\x5b\x9e\x84\xa0\xd5\x49\x49\x04\xd9\xc9\xa3\xbc\x8c\xa0\xe9\x89\x8d\xae\xe1\xcf\xcb\xbf\x22\x7b\x5f\x2a\xb9\xbc\x57\x82\x66\xea\x03\xca\x92\xb3\x1c\x85\xec\x58\xcf\xdb\x31\xf3\x31\x64\xd4\xb5\xb6\x64\xed\x71\xb8\xa0\xff\xc0\xbc\x69\x16\x50\x0a\xca\x32\x5a\x92\x02\xcc\xa8\xd6\xee\x1c\xf0\x37\xbd\x15\xfc\xc0\x2c\x32\xa3\x19\xa4\x4d\xf3\x26\x12\x42\x3b\x4f\x3f\x21\xcb\x9b\x26\x75\xa0\x8e\x72\x7b\x5c\x9e\x81\xc5\x60\xb7\xce\x66\x5f\x0d\x43\xcf\xea\x53\x27\x70\xbd\x29\xbf\x35\xa9\xb6\xe1\xe6\x72\x52\x2e\xd1\x9c\xfe\x7e\xe6\x7e\x8f\x9d\x6c\x8d\x3d\xe9\xf5\x04\xd0\x34\xa7\xf8\x03\xb7\xfe\xad\x13\xa6\x77\x0d\x93\x9e\xe0\xde\x1d\x8f\x37\xb8\xa6\x8c\x0e\x5c\x82\x73\xc6\x32\x9c\xce\xed\xe0\x6a\x05\x57\x65\x59\x50\x94\x36\x11\xd1\xd9\x87\xd7\x8a\xe5\x7b\x6b\x4e\x25\xa0\x12\x24\x2a\xd8\x53\xb5\x35\x93\x0c\x2c\x90\xd9\x16\x77\x98\x0c\x3d\xf0\xed\x8d\x8e\x2c\x2b\xb5\xbd\xb0\x91\x4b\x25\x51\x80\x0d\x91\x16\x7a\x9e\x74\x0f\x29\xcc\xbf\x5c\xd9\x0b\xeb\x8d\xd3\xbe\x5e\x19\x2d\x16\x53\x8e\xfa\xd1\xd0\x4f\xb4\x30\x34\x09\x8e\xe2\xf4\x14\xed\x34\x13\x8e\x3a\x16\x75\x1b\xd8\x1c\x96\xb5\x89\x59\xdd\xce\x98\x99\x63\xef\x9e\x57\x22\xb3\x39\x81\x11\xf9\x09\xc2\x55\xfc\x33\xb2\x3f\x5a\xa0\xa4\xa4\xf0\x19\x9f\xad\x48\x63\x89\xb6\x47\xe2\x5a\xf0\x9d\x7e\xb4\x2c\xea\x33\x52\xfb\x02\x78\x88\x64\xf0\xe9\xb5\x14\xf0\x5e\xcb\xe7\xdf\xa3\xad\x72\xa2\xfc\x16\x20\x33\x5e\xa2\x84\x87\x4f\x7f\xb0\x40\x39\x31\x1c\x3c\x9a\x88\x77\x28\xd6\x2f\x90\xd3\xc8\xa3\x16\xda\x01\x2f\xb2\x5a\xf9\xac\xcb\x10\x62\x7c\xb6\xf1\x09\xe1\x29\x87\x1d\x12\x46\xd9\x06\x18\x07\x81\xbf\x55\x28\x95\x04\x22\x10\x1e\x0b\x9e\x7d\xc6\xdc\x27\x04\xc1\xe7\xf7\x53\x81\x00\x69\x3e\xe6\xee\x9a\xa4\x49\x92\xd5\x81\x34\xd7\xd6\x82\x6e\xd9\x9a\x5b\x7f\xec\x9f\x96\x37\x28\x33\x41\x4b\x17\x44\xd6\xf5\xe0\xad\x0d\x80\x6c\x40\xa9\xf7\x64\x5d\xc3\xb6\xda\x11\xd6\x49\xd0\x75\x96\x1c\x9d\x89\xf6\x0f\x78\xb3\x4a\xd4\x73\x89\xe3\xe1\xa7\x26\x4b\x2a\x51\x65\xca\xa8\xdd\x24\xee\xd1\x4f\x2f\x87\x4f\x00\x5c\x41\xa7\x9d\x11\x1d\x4c\xd7\x76\x2c\x69\xd3\x74\x3f\xeb\x78\x66\x9e\x84\xac\x3c\x80\x76\xd9\xf8\x07\xdc\x50\xa9\xc4\x73\x32\xc8\x8f\xe1\x40\x4a\x9c\x0c\xd2\xe1\xb1\xd9\x7e\x30\x19\xe4\xf9\x6e\xab\x25\x83\x54\xbe\x1d\xf8\x39\x70\x6e\xe9\x35\xfb\x34\x12\xc7\xf7\x15\x2d\x72\x14\x29\xf4\xf8\x8c\x73\x5e\xbd\xee\x91\xf3\x22\x49\x8c\x01\x0f\x93\xd7\x50\x5f\x93\x40\x42\x8a\xd0\x9d\x61\x5c\x96\x29\xc9\x55\xc6\x75\xe7\x10\x1d\x1c\x9a\x28\x6d\x40\x4b\x8b\xe0\x56\x99\x4d\x49\xc2\x56\xa1\xdd\x0c\x86\xba\xe2\x9e\xb3\x78\x70\xe1\xc3\x02\xb6\x7c\x8f\x4f\x28\x4c\x15\x30\x23\x0c\x04\x96\x05\xc9\x10\xa8\xd2\x7a\xd3\xaf\x85\x76\x95\x8a\x66\x55\x41\x04\x54\x92\x6c\x50\xe3\x1c\xe1\xc8\xc8\x29\xec\xa9\x5f\x25\x8a\x3b\x22\x65\x34\x87\x72\x96\x8e\xf3\x6a\x99\x18\x49\xd9\xcf\x12\x93\xf5\xa9\xdf\x84\x98\xc6\x58\xb2\x72\xf2\x1e\xdf\xff\xf6\x72\xfb\xa8\x89\x7f\x81\xd0\x46\xca\x16\xe7\xd9\x96\xf5\xf5\xdf\x90\xec\xc6\x38\xeb\xca\xce\xcb\xec\x5e\x1f\x9b\xf9\x8b\x24\x37\x55\xbc\xb1\x35\xfc\xe9\x4a\x0a\x08\xe3\xb6\xb4\xdf\x21\x6d\x7d\x43\xf3\xa1\x99\x5f\xf3\xa2\xe0\x7b\x7d\x12\xed\xe8\x0e\x41\xfb\x67\x79\x11\x0e\x14\x87\xf0\xaa\x28\xee\x51\x50\x03\x5f\xb4\x68\x01\xde\x9a\x20\xec\x67\xcc\x29\xf9\xa8\x3d\xfb\x64\x12\x7e\x88\xbc\xa1\xbf\xec\xac\x1f\x96\x4e\x0e\xb2\xed\x1d\x69\x87\xed\x50\x5e\xf8\xc3\xd9\x6e\xc9\x1b\x3a\xfe\x09\xb6\x47\x22\x8d\x5e\x2c\x12\x25\x2b\x4d\x93\x8c\x09\x27\x04\x71\x1d\xb1\xf8\xfd\x02\x6a\x4b\x14\x28\xf2\x19\xa5\x3e\x13\x04\xd3\xb4\x12\x96\x9b\xdc\x63\xcf\x45\x6e\x1e\x6c\x14\x66\xc5\xe9\x62\x35\x8b\x8a\x2a\x28\x51\xe8\x43\xd3\x86\x38\xad\x35\xdb\x0c\xa8\x3d\x04\x92\xc9\xe0\x72\xcc\xc7\x98\x60\x12\x4e\x8b\x26\xa1\x1b\x4e\xc6\x33\xdb\x80\xf2\x50\x3c\x17\x67\x21\x5f\x2c\x44\xe2\xbd\xd2\x99\x62\x7b\x24\x12\x73\xe0\x1a\x00\xf8\x54\x21\x8a\xfb\xcd\x9d\x18\xcd\x31\xf7\x2e\x2c\x4a\x13\x4e\x13\xf1\x3f\x59\xb4\x6d\x7e\xf1\x85\x72\x65\x40\xb2\x0c\xa5\x8c\xe4\xab\x9d\x5a\x51\xa0\x9d\xcb\xd7\x26\x9c\xa6\x02\x73\x9f\x9a\xbc\x86\x0e\xba\xd9\x85\xc5\xdd\xd7\x81\x0b\xe3\x4f\x35\xf1\x4e\xc6\xf4\x75\x35\x31\x78\x38\x90\xbf\x84\xb8\xa6\xcd\x3c\x3c\xa7\xd2\xcb\x5e\x47\xde\x82\x17\x30\xbf\xba\xfe\x69\xf5\xe1\xfb\xab\xeb\xd5\xd5\xf7\x57\xd7\x29\x3c\x3e\xbb\xa9\xda\xaf\x06\x3d\xc5\xc2\xb1\x0a\x6b\xe5\x8c\x79\x47\x21\x5d\xb4\xf1\x41\x68\x5f\x8d\xf1\x32\x75\x05\x7d\xb8\xf6\x6b\x6d\xf0\x2b\x15\x7f\x41\xa2\x92\x86\xed\xb6\x20\xe6\xf2\x90\x70\x00\x8d\xa6\x4d\x61\x7a\xd2\xa9\x4e\x7f\x05\x0a\xcf\xa8\x16\x9f\x00\xb6\xaf\x9f\xd5\x2a\xba\x33\xd3\x09\x70\x46\x8a\x02\x73\x5b\xd0\x21\xee\x5a\x40\xbf\x17\x98\x21\x7d\xc2\x7c\xa1\x65\x23\xd0\xe4\xca\x21\x6a\xdb\x06\xe0\xab\x15\x3c\x56\x2a\x84\x65\x12\x95\x8d\xc5\xf8\x9e\xf9\x5a\x1b\x95\x49\x7c\x51\xd7\xa6\x43\x26\xf5\xb1\x45\x4d\x89\xfe\x0a\xe3\x8d\x7b\x6b\x8c\x33\x6c\x20\x8b\x69\x70\x09\x19\x31\xf0\x88\x6b\x2e\xd0\x28\xf2\x6f\x1f\x3f\xde\xcd\xef\x53\x90\x66\xae\x29\x43\xb9\xf9\x16\x8c\x69\x83\x20\x3a\xda\x90\x46\xf9\x36\x17\x0c\xde\xcd\xec\x90\x0d\x2a\xc0\xdf\x31\xab\xd4\x41\xd8\x52\xf1\xd2\x6e\xc2\xd2\x76\x4a\x08\xb2\x5e\xd3\x2c\x19\xb9\x30\x75\x37\xa0\x49\xa4\x84\x31\x3e\x42\x65\x6d\x9c\x0b\x30\xd3\xf5\x9e\xcd\x39\x43\x0b\xcb\x68\xc3\x6c\xf0\xa2\x00\x92\x29\xfa\x84\xda\x21\x30\x74\xec\xd8\xd9\x68\xcb\x2d\x96\xd6\xde\xf8\x33\xec\xb8\xc0\xa4\x7f\x7b\xdb\x25\xf9\xda\x8a\xc9\xb5\x72\x40\x41\x19\x02\x11\x1b\x93\xfc\xc3\x46\xf0\xaa\x94\xa1\xbc\x4a\x05\xe4\x6d\x81\x42\x1b\xc0\xb5\x5d\xf6\x13\x65\xf8\xde\xbe\xfc\xab\x5d\xf2\xf0\x49\xee\xc9\x66\x39\x31\xee\x70\xeb\x44\x50\x5b\x1f\x65\x98\x43\xc1\x4d\x73\x49\x9c\x5a\xfc\x64\x5f\x85\x9f\x8e\x5f\x5f\x2e\x97\xf1\x9d\x58\x62\x9b\x61\x7e\x95\xf8\x01\x73\x9e\x19\x13\xc8\x5d\x11\xc3\x7a\x06\xa2\x60\x95\xf3\x4c\xda\x66\x86\x79\x5d\x2f\x3f\xd8\xdd\x20\x5c\x21\x70\xb2\x8c\x93\x06\xb0\xf3\x14\xea\xe4\x5f\x06\x4b\x97\x9d\x04\xff\xd2\xde\x65\xb7\x14\xb5\x43\xaf\x4e\x55\x00\x7d\x22\x65\x4a\x54\x9e\xb0\x7b\x54\xfd\xb6\x84\xe0\x4f\xbd\x4b\x28\xfd\xc8\x4e\xc7\xe0\x26\x7c\x3f\x87\xd0\x21\xaa\xf9\x2e\x04\xf5\xfe\x78\x1e\x25\xbf\x5f\x8a\xb9\x84\xb0\x70\xc0\x46\x48\xd7\x7c\x14\x12\x73\x92\xf9\xc1\xd7\xe2\xc4\x63\x7b\x21\x27\x81\xc8\x51\x4e\xee\x4b\xcc\xac\x16\x88\xad\xcc\x99\x98\x6c\x4f\x8b\x02\x1e\xd1\x3a\x8d\x3c\x1c\x6d\x59\x41\x91\x29\xb9\x3c\x93\x0f\x8d\x6b\xa2\x6f\x67\x94\x01\x33\xf5\xd2\x90\xe5\x08\xee\x9b\xcf\x98\xdc\x5f\xc9\x82\xfa\xe6\x93\x3a\x61\x6b\x52\xc3\x3d\xe2\x11\xe3\xe9\x52\xfd\xcf\xb0\x96\xbe\xa9\xbc\x84\x6a\xbf\xc8\x51\xfd\xa3\x2b\x95\xc6\xd4\xfa\x28\x5e\xc7\xe0\x16\xae\x2b\xa8\x9e\x43\xab\x43\x60\x69\x8c\xab\xb0\x07\x89\xf5\x08\x2d\x91\x1f\x1c\x41\x16\x56\xb7\x20\xe2\x8e\x63\x3b\xf2\x44\x0a\x9a\x9b\x7a\xcb\x19\x94\x76\xb1\xcc\x4d\x12\xed\x4f\x05\x07\xdf\xb1\x60\x67\x2c\x5a\x74\x7e\xe0\x7f\xfc\x0b\x7b\xf7\x31\xc9\xd7\xf2\x2a\xcf\x0d\x02\x0f\x39\x82\xe5\x8f\x1c\x07\x0b\xfd\x08\xc6\xca\xf1\xe1\x70\xc8\x1f\xc7\x99\x3a\x47\x0c\x1e\xef\x3c\xee\x07\x79\x22\x02\x2a\x16\x19\x86\x4f\x7f\x0e\x14\xb6\xe8\x7a\x44\x00\x87\x6b\x49\x97\x97\xc0\x68\xe1\xee\x8d\x3a\xf8\x2e\x81\x94\x25\xb2\x7c\x1e\xbf\x5d\x98\x1b\xc5\x69\x78\xe6\x66\x68\x24\x83\x1a\xef\xe5\x39\x9d\xde\x50\x04\x7a\x25\x7a\x3d\xbc\x63\xf4\x4e\xde\x59\x9d\x40\x7a\x9b\xc6\x9e\x43\xf4\xc8\x3d\xef\x28\x27\xed\xdd\xd2\x08\xf6\x90\x83\x68\x08\xc7\x78\xed\xe7\x7c\x53\x2c\x7e\xad\x1c\xf0\x2c\xd5\xbe\x52\xc7\x89\xa3\x61\x4c\x44\x56\x12\x05\xb2\x0e\xf6\x14\xfe\x13\xde\x39\x5a\x9d\x4f\xd5\xee\xc8\xa4\x50\xeb\xf9\x6c\x47\xa5\xd4\x6e\x3c\xf6\x1d\x17\xf0\x17\x39\xf3\x95\x3a\xb9\xfc\x2f\x4e\x59\x9f\xa1\x05\xcc\x52\x4b\x42\x12\xdf\xe1\x26\x4d\xd2\x49\x0c\x7f\x34\xf5\x7f\x13\x5b\x58\x87\x11\xe7\xca\x04\x36\xf4\x09\x59\x94\x49\xd3\xfc\xbc\xc0\x22\x42\x37\x0f\xd0\x6e\x6f\x42\x74\xf4\xc2\x2c\x31\x6e\x15\x1e\x1a\x56\x8b\xce\x72\xdb\x29\xe6\xcb\xc0\xb1\xf6\xbd\xa4\x33\x14\xa2\x28\x1d\xcf\xd0\x35\xd5\x67\xa8\xbf\x9f\xb0\xfd\x23\x67\x9d\xa2\x03\xfc\x73\x07\x2c\xbe\x8b\xd4\x28\x83\x8f\xb8\x37\xe3\xe9\xd8\x5d\x65\xf7\x82\xa3\x3e\x5e\x54\xd2\x82\x92\x3a\x7e\xb9\xb8\x9c\x6c\x01\xee\x00\x4d\xed\x25\x2c\x98\x33\xf4\xe2\xd2\xed\x69\x4f\xb2\xb5\x53\xb9\xa7\x2a\xdb\xda\x29\x75\x74\x75\x7f\x4a\x97\x4f\x46\xa4\xe9\x26\x59\xde\xde\x34\xcd\x6c\xd0\xac\x37\xde\xfd\xe3\xb9\x78\xd0\x28\x3f\xc1\xe5\x88\xda\x87\x77\x8c\x2f\x2a\xee\x85\xe6\x1f\x7b\xb4\x87\xea\x7b\xa8\x14\x46\x2b\x06\x4d\x12\x10\xb7\xae\xb5\x7d\x15\xa7\x39\xf5\x97\x50\x39\x42\x61\xd4\x98\x19\x70\xa7\x1d\xa9\x76\x1a\x4f\x8e\xf5\xfe\x80\x53\xb5\x56\xbd\x53\xba\x15\x7a\x87\xd5\x23\xba\x18\xb9\xc8\x74\x46\x6f\x76\xc6\xc2\x41\x5e\xde\xb2\x05\xbc\x58\x49\xbd\x26\xa2\x6f\x43\x2f\x86\xa8\x2f\x50\x45\xb7\x0b\xe8\x34\x83\x1f\xde\x78\xba\xb8\xf4\x8b\x44\x3a\xd6\x57\xf4\x0d\xc9\xd8\x93\xf7\x42\x59\xbb\x36\x4b\xdb\x6d\xe4\x8e\x66\x47\xb5\x15\x74\xd2\x6f\xd7\x8e\x0e\xcd\x0e\x3c\x1b\xe1\xc7\xb5\xf2\xf1\xf4\xab\x6d\x3f\x3a\xf7\xd0\xb0\xab\xe7\xe9\x48\x35\xfe\x54\xcf\x3f\x71\x44\x76\x8a\xfd\x2f\xe4\x3c\x34\xde\x74\x4e\xd2\x2c\xb4\xe3\x0c\x0f\xd1\x36\x61\x96\xe6\x6b\xb3\x9f\x6f\x7f\xfe\xc1\x3c\xda\xb6\x3a\xb4\xe9\xa0\x40\xa0\x1b\xc6\xb5\xe8\xb6\x28\xf0\xac\x12\x46\x4c\x5b\x5b\x84\x89\x4d\xf9\x40\xb3\x50\x47\xa6\xdd\x74\xe8\xf8\x11\xea\x81\x2c\x4c\x7c\xd7\xa2\x4e\xfd\x71\xfa\xf7\x05\xec\x54\x7b\x9e\x46\xc4\x75\x8e\xd4\x9d\x72\xcf\xd1\x71\x3a\xfe\xc1\xc8\x81\x8b\xf2\xf8\x98\xed\xde\x95\x47\xe7\xad\xf3\x2f\xc3\x29\xe3\xde\xe6\x60\xb2\x76\x52\xf7\x9e\x09\x45\x4d\x08\x9c\x2d\x80\x7f\xd6\xb2\x18\xa2\xe9\x35\x77\x3d\xec\xd4\xa7\xef\xf4\xe4\xb6\x1d\xd1\x50\xbd\x53\x9a\xca\xec\xd5\xb6\x73\xe8\x0f\xeb\x18\x75\x19\xba\xc6\xfe\x48\xa3\x8e\x69\x3b\xd9\xa8\x43\x9a\x1b\x1b\x75\x37\x67\x3e\x6e\xd4\x1e\xc8\xab\x19\x75\xc7\x72\x87\x5f\xe3\x7c\x3b\x86\x1d\x75\x86\x4c\x1e\x28\x13\xc6\x5d\x1e\x33\xee\xa0\xcf\xc3\xc6\x5d\xbe\x9a\x71\xfb\xcf\x56\xda\x5c\x2f\xee\x45\x0c\xb6\x1d\x2e\xd5\xdb\x7c\x6f\x87\x6a\xcb\x73\xd7\x8e\xa2\xb6\xe7\x58\x6f\x8b\x7c\x6e\xa1\x2d\x0c\xa8\x36\x7e\x8b\x69\x59\x98\x36\x48\x1b\x5b\x8c\x16\x0d\x42\x4b\x69\x27\xc5\x8f\x7b\x94\xed\x3d\x8b\x15\x5a\xb5\x33\x51\xac\x4b\x93\x3f\xf2\x5f\xcb\x12\x3d\x19\xa9\x45\xf1\xf7\x69\x6d\x79\x5c\x0f\xd5\xee\xd3\x77\xf0\xa7\xa0\xa7\x29\x6c\x5a\xf7\xc4\xd6\x68\x66\xab\x99\x9b\x6c\xdf\xc0\x6c\xe6\x26\x6d\x4f\xc3\xf7\xa0\xd7\x7d\x6a\x35\x6b\x96\xb5\x07\xb0\x69\xbe\x8d\xe3\x8e\xb6\xe1\x34\xf4\xe6\x1e\xbc\xed\x3e\xb3\xbe\xe8\x50\xcf\xd3\xb1\x8e\xdf\x69\xad\x79\x92\x3a\x4a\x3b\x30\xad\xf3\x9d\x0b\xee\x3f\xf0\x4a\x91\xc7\x02\x3d\xf6\xf1\x7b\x88\xc5\x10\xe2\x42\xa3\xeb\x57\x41\xb4\x5b\x88\xa7\x41\x8b\x59\x0b\xf8\x0c\xa9\xe8\xa0\xcb\x19\xf0\x35\xc9\xb6\x38\x9f\xaa\x20\xb7\xe2\x5b\xad\x20\xe7\xec\xdf\x14\x64\x5a\x65\xe4\x91\x57\xca\xc5\x8f\x7a\x7f\x2f\xe0\xff\x2a\xa9\x5c\xf3\xcd\x16\x0d\x02\xe3\x08\x7d\x3f\x43\x59\x22\x33\x8d\xea\xde\xb3\x8f\x56\xdc\x86\x7c\x8e\x6f\x9f\x43\xdb\xec\xe4\x6f\xaa\x9d\x7d\x1f\x2d\x03\x4e\x13\xf5\xa0\x25\x2c\x28\x53\x6b\x98\xfd\xe5\xb7\x19\xcc\x2b\xbd\x5d\xb5\x0f\x37\xfb\xd5\x7c\x73\xd1\xa3\xfb\x0b\x81\x0d\x98\x1b\xe3\xe8\xc0\x46\x3d\x8e\xe3\xc1\x26\x38\x26\xb5\xd1\x9e\x40\x3b\x86\xa6\x99\xcd\xba\xb5\xd6\x18\x46\x56\x20\x61\x66\xae\x59\x91\xc6\x45\x4f\x7b\x80\x9d\xdb\x3d\x32\xf5\xad\xfe\xc8\x7e\x72\xfb\x61\x64\x4b\x2d\x27\x3f\xcd\x3b\x54\xb4\x35\xb9\xd7\xa1\x72\xe9\xe1\xce\x29\x7f\x17\x2a\x9e\x30\xfa\x1f\x05\x5a\x59\xa1\x5e\xa9\xb8\xbd\x0a\xb5\xdf\x85\xdd\xdd\x02\x7f\x42\x61\x5a\x2b\xf4\xd2\x8c\x30\x78\x44\xa8\x24\xe6\x90\x53\x81\x99\x2a\x9e\x81\x32\x7b\x0e\xfe\xa4\x33\x36\x76\xc5\x72\x83\x60\x3e\xbb\xf8\x8f\x77\xef\xde\xcd\x16\x40\x4a\x6a\x6b\x89\x73\xed\x45\xd2\xb3\x2b\x9f\xf3\x47\xfb\x09\x00\x1c\xfb\x2a\xc0\x79\x8d\xa1\x51\xdf\x32\xaa\x6c\x77\xc6\xc8\x16\x6a\x9a\x65\xf4\x0d\xc2\x9f\x46\xce\xc5\x31\x90\xed\x12\x4f\x5e\xda\x1e\x63\x47\x5a\x06\x7a\xc0\x27\x8c\x47\x27\x99\x8e\xb1\xb6\x23\xa1\x87\xeb\x05\x30\xda\xa5\xd6\x1a\xb4\x4c\x7c\x6f\xcf\x33\xaf\xb4\x01\x18\xa7\x19\x7c\xa5\x35\x05\x6f\x1f\x99\x76\xcc\x8b\xd0\xbe\xa4\xb6\xa8\x83\xa9\x8c\xef\x4a\x2e\xb1\x7f\x84\x12\x0b\x52\x22\xc2\x9a\xaa\x73\x14\x6f\x35\xe6\x4f\x44\x1d\x3d\x4f\xbb\x91\x54\x7b\xb5\x77\x93\xbe\x78\x78\xba\x84\x8f\x8c\xda\xdb\xd5\x90\xc3\x76\x25\x42\xf2\x1c\xe6\x5c\x98\xcd\x20\x68\x8e\x69\xbf\x0d\x9d\x44\x79\xcc\x59\xc9\x49\x9f\x80\x41\xeb\xc3\xa2\x45\x38\xf8\x87\x15\x13\xc7\xe4\x20\x07\xf4\x20\x4d\xce\xe7\x53\xce\xae\x00\x42\xbe\x73\x5c\x00\x9d\x86\xf4\x57\x13\x80\x27\x60\x44\x00\xe5\x54\xdf\xf9\x61\x01\x44\x79\x42\x2c\x00\x0f\xcd\x17\xa2\xf2\xbc\xdd\xcb\x3a\xc4\x27\x79\x1e\xbc\x63\x64\xd3\x8a\x03\xfe\x4e\xa5\x69\x5e\xf3\x5d\x7d\xe7\xd4\xa5\x7a\xe8\xc6\x82\xfa\x05\x1c\xf2\x78\xf5\x69\x81\xf9\xf1\x50\x7a\x28\x37\xe7\x27\xcd\xfa\x17\x05\xda\x51\x16\x76\x60\xba\xa5\xcf\x2d\x81\x4b\xcf\xe5\x7c\xeb\x77\xe4\xff\x07\x00\x00\xff\xff\x05\x90\xb7\x4c\x17\x4a\x00\x00") func templatesServerBuilderGotmplBytes() ([]byte, error) { return bindataRead( @@ -455,12 +622,12 @@ func templatesServerBuilderGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/server/builder.gotmpl", size: 16812, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x93, 0xde, 0x22, 0x72, 0x72, 0x82, 0xf0, 0x64, 0x30, 0xf4, 0xdf, 0x23, 0x74, 0x41, 0x39, 0x49, 0x20, 0xb3, 0xe7, 0xa, 0x7e, 0xea, 0x2b, 0xd7, 0xb, 0x8b, 0x1, 0x1d, 0xb, 0x1a, 0x93, 0x9e}} + info := bindataFileInfo{name: "templates/server/builder.gotmpl", size: 18967, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcd, 0x9, 0x7f, 0x2a, 0x86, 0xd5, 0x9a, 0x75, 0x25, 0x2d, 0x98, 0xc0, 0xc2, 0xb3, 0x1, 0xf3, 0x73, 0xa6, 0xe1, 0x1b, 0x6f, 0x95, 0x62, 0xb, 0xb6, 0x3f, 0xe3, 0x6d, 0x3c, 0x4d, 0x3a, 0x5b}} return a, nil } -var _templatesServerConfigureapiGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x58\x4f\x6f\xdb\x38\x16\x3f\xaf\x3f\xc5\x83\xd0\x05\xec\xc2\x96\x81\x3d\x16\xc8\x21\x9b\x74\x3a\xc6\xb6\x13\x63\x1c\xec\x1e\x06\x73\xa0\xa5\x67\x9b\x1b\x8a\xe4\x90\x54\x13\x8f\xa0\xef\xbe\x78\x8f\x94\x2c\xc7\x76\x92\xb6\x58\xcc\xc9\x26\xf9\xfe\xf1\xf7\xfe\x52\xf3\x39\xdc\xef\xa4\x87\x8d\x54\x08\xd2\x83\x17\x1b\x84\x60\x00\x4b\x19\x72\xb8\xd3\x05\x82\x0c\x80\x4f\xd2\x07\x4f\xff\x1e\xa5\x52\xa0\x4d\x80\x35\x82\xf9\x8a\xee\xd1\xc9\x10\x50\x8f\x46\x4d\x03\x72\x03\xf9\x8d\xb1\x7b\x27\xb7\xbb\x00\xb3\xb6\x9d\xcf\xa1\x69\xa0\x30\x55\x85\x3a\x3c\x3b\x6b\x1a\x40\x5d\x42\xdb\x8e\x46\x23\x2b\x8a\x07\xb1\x45\x22\xce\xaf\x97\x8b\x65\x5a\xd2\x99\xac\xac\x71\x01\xc6\x23\x80\xac\x30\x3a\xe0\x53\xc8\xf8\xbf\xdb\xdb\x60\xe6\x41\x79\x5e\x6a\x0c\xf3\x5d\x08\x96\x17\xca\x6c\xb3\xd1\x08\x00\x9d\x33\xce\x43\xb6\x95\x61\x57\xaf\xf3\xc2\x54\xf3\xad\x99\x19\x8b\x5a\x58\x39\x8f\xa7\xc4\xe0\x6a\x1d\x64\x85\x97\x08\xd3\x31\x51\x56\xb2\x2c\x15\x3e\x0a\xf7\x1a\xf1\xfc\x40\x49\x7c\x1e\x8b\xda\xc9\xb0\x7f\x8d\xab\xa3\x63\xf3\x9b\xc6\x09\xbd\x45\xc8\x6f\x71\x23\x6a\x15\x16\x0c\x85\x27\xe8\xac\x93\x3a\x6c\x20\xfb\xfb\x1f\x19\xe4\x6d\xcb\xc4\xa8\xcb\xf4\x2f\xb2\xbd\x7b\xc0\xfd\x14\xde\x7d\x15\xaa\x46\xf8\x70\x05\xf9\x80\x9f\xce\xda\x96\xf0\x1e\x4a\x8a\xb4\x47\xe2\x26\xe4\xd7\x77\x9d\x7f\x48\xca\xd0\x39\x4d\x03\x8f\x32\xec\x20\xff\x84\xfa\xce\x06\x4f\x9b\xf3\xf9\xd6\x7c\xd8\xa2\x46\x27\x02\x82\x7f\x14\xdb\x2d\x3a\x38\x6c\xa0\xfb\x8a\x0e\x66\xb3\x20\xdc\x16\x03\xbb\xfc\x9e\xff\x2e\x45\xd8\x41\xdb\xc2\x6c\xa6\x45\x15\x63\xe1\x17\xfa\xc3\x5b\xde\x62\xc1\x5b\x2b\x8b\x45\xa2\x1c\x35\xcd\x8c\x63\xee\x28\x64\x62\x1c\x6a\x3c\xda\xce\x8c\x25\xf5\xd2\x68\x9f\x45\x81\xc2\xca\xd9\xc5\xb0\xeb\x63\xf3\x10\xa4\x9d\xae\x2f\xa6\x44\x75\x4e\xdb\xd1\x41\x56\xd1\xaa\xd3\xc5\x8b\x23\x6d\xa7\x52\x2e\xe9\x5b\x31\x5e\xe7\x14\x1e\x9f\x64\x0e\x7d\x10\x56\x66\x11\x2e\x3e\x3b\x52\x79\x46\xd0\x25\x9d\x37\x4a\xa2\x0e\xe7\x74\x1e\x9f\x64\x05\x2f\xd3\x2d\xe3\xe2\x48\xe7\x19\x41\x97\x74\xde\x63\x65\x95\x08\x78\x2b\x5d\x14\x17\xd2\xc6\xac\x94\x2e\x46\xc9\x11\xc5\xb1\x84\x94\x28\x77\xbd\x97\xa3\x8c\xde\xeb\x2c\xe0\x12\xd7\xbd\xd8\x26\xfa\x40\xff\xce\x92\x92\x89\x4b\x27\x75\x21\xad\x50\x91\xd8\xf6\x4b\xe2\x18\x1e\x9e\xb2\xa6\x0c\x5e\x15\x3b\xac\x8e\x11\x3d\x3e\xc9\xb8\x86\x45\xf9\x65\x3c\x99\xf9\x78\x44\x4a\xce\x88\x39\x87\x67\xba\x17\x07\x99\x1f\x84\xe0\xc5\xab\x19\x07\x63\xaa\xe9\xf9\x42\x17\xaa\x2e\x91\x39\x27\xc7\x7b\xff\x16\x4a\x96\x22\x18\x37\x49\x19\xf9\x20\x6d\x14\xeb\x5f\x95\xf7\xb3\xd0\xa5\x42\xf7\x4c\xe2\x52\x38\x51\x61\x40\xe7\xe1\xd9\xc9\xaf\xe8\xad\xd1\x1e\xfd\x50\xd7\x21\x85\x4f\xf4\x0d\x79\x57\xb5\xe5\x8e\x71\x60\xf4\x71\xe7\x45\xae\x2f\x42\xea\xc8\x82\x4f\xbc\x31\xab\x84\xd4\xa7\x8e\xfc\x18\x4f\xa9\x0a\x1d\x93\x53\x81\x3a\xe3\xf7\xba\xb2\xb7\x22\x88\xe4\xd1\xba\xb2\xb3\x52\x04\x31\x24\xec\xfe\x6d\x6a\x5d\x40\x61\xf4\x46\x6e\x6b\x87\x3f\x29\xb1\xf5\x63\x61\x25\xbc\x6f\x9a\xae\xe6\xb6\x6d\x4e\x15\x5b\xf8\x42\x28\xf9\x27\xf6\xf5\xf1\x7a\xb9\x98\x40\x33\x02\x98\xcf\x41\x58\x99\xdf\x98\xaa\x12\xba\xfc\x2c\x35\xde\x59\x46\xec\x93\x33\xb5\xf5\x70\x05\xbf\xfd\x4e\x15\xf9\x12\x45\x03\x79\x9e\x43\x3b\x6a\x47\xcf\xcc\xb9\x5e\x2e\xbe\xc9\x18\x0a\xe3\x3c\x79\xbd\xb3\xac\x17\x06\x61\x87\x64\x27\xec\xd0\xe1\x08\xd8\x64\xae\x4e\x1f\xa9\x23\xc3\x55\xea\xdb\x83\xbd\x51\x94\xb0\xc2\x00\x7b\x53\x3b\x28\x6a\x1f\x4c\x05\xca\x70\x6f\xe1\x4c\xc2\x12\xcb\x1c\x52\x82\x80\xd1\x3c\xcc\x28\xb3\xe5\xc4\x0c\x9b\x28\xe0\xe3\x93\xc5\x22\x60\x09\x52\x07\x74\x1b\x51\x20\xd0\x3d\xc7\x3e\x38\xa9\xb7\x53\xba\x7d\x7f\xd2\xb4\x13\x66\xea\x38\x45\x65\x15\x7e\x38\x80\xfc\x39\x2a\xbf\x1a\x2a\xe1\xc6\xd9\xa5\xdf\x8d\xd1\xbe\xae\xd0\xf7\xe9\x4e\x0d\x58\x21\x8d\x42\xb1\x26\xb5\x2d\xc9\x39\x0b\x62\xe2\x25\xf1\x94\xb3\x27\x8c\xb1\x43\x2b\x8f\x6f\x93\x91\xc6\x8b\xce\x24\xf7\x13\x5d\x9a\x6f\xee\x40\x9a\xfc\x57\x14\x25\xba\x29\xa4\x96\x3c\x84\x20\xfa\x82\x5d\x08\xe0\x30\xd4\x4e\x77\xee\xf9\xc5\x84\xde\x2e\x2c\xc7\x59\xd3\xb0\xe6\xb6\x25\x4f\x47\xcd\x3b\xe1\x39\xcb\xf6\x48\xf3\x22\x6a\x90\x07\x86\x8c\xe0\x6d\x27\xc3\xb9\xe5\xf0\xaf\xc3\x70\xe9\x4c\x59\x17\xdf\x87\x61\xe2\xfd\x21\x0c\x07\x32\x3a\x0c\xbb\xad\x03\x86\x8f\x84\xe1\x7f\x9c\x0c\x84\x21\xa5\xf7\x8f\x23\x68\x3b\xbd\x3f\x8c\xe0\x2a\x4d\x94\xb7\xb8\x91\x5a\x76\xbd\x91\x8d\xe9\x8a\xd4\xc2\xff\x53\x78\x59\x5c\xd7\x71\xaa\xe2\x08\xbf\xb6\x56\x49\xf4\xf0\xb8\x43\xcd\xf9\x4a\xa7\xc6\xc9\x3f\x23\x7a\x3b\x8e\x18\x7e\x2f\x60\x88\x33\x20\x11\xb1\x1c\x88\x0d\x2b\x25\xf6\x31\xac\x8b\x5b\xaa\x10\xa4\xe8\x2a\x66\x5e\xed\xd1\x41\x97\x7e\x56\x78\x9f\x16\x13\x18\x37\x4d\xaa\xd1\x63\xc0\x3f\x86\x0d\x36\x1b\xc0\x9b\xc1\xa4\x6d\xdf\x0f\xfa\xe0\x81\xae\x6d\xa7\x11\xe8\xc9\x31\xf8\x5a\xaa\xe9\x25\x0f\xac\xf9\x02\x82\x0c\x24\x03\x92\xc1\x93\x37\xb8\xa1\x47\x94\x22\x2a\xc1\x7a\xbd\x5c\xfc\x0b\xf7\x2f\xe3\x9a\x0d\xe6\xdc\x2c\x0e\x6a\xa6\x76\x05\x8f\xbd\x11\xde\xb7\x01\x19\xcc\x03\xea\xbf\x16\x3c\x2a\xe9\x0f\xb8\x8f\xf0\x0d\xd1\x3b\xc4\xf5\xc6\x99\x8a\x96\xf1\x8e\x14\xe8\x34\x03\xc0\x6f\x03\x10\x7e\xff\x4e\xb0\xef\x08\x8d\x7f\x44\xa0\xbf\x11\xaf\x29\xf8\xc2\x58\xf4\xd4\x1d\xff\x4a\x00\x8d\xe0\x2b\xac\x51\x38\x74\xa7\x30\x7e\x0b\x2e\x71\xa6\x38\xb3\x88\x6f\x8a\xb3\x35\xe1\x7c\x93\x15\x29\xf1\x5f\x6c\xb4\xdd\xbb\x35\xef\xca\x04\x96\xe3\xc9\xc5\x9e\xdb\x95\xd2\x9e\xd8\xbd\xd8\x69\xaf\x97\x8b\x03\x25\x5c\x5d\x54\xf6\xec\xae\x27\x6f\x82\xb6\x95\x9b\x14\x1a\x69\xf8\xee\x5e\x26\xdd\x03\x97\x9f\xd6\x87\xa0\x59\x1e\x76\xb9\xb0\x9e\x6d\x11\xdd\x94\x73\x75\x45\xbe\x4d\xce\xfe\xff\x69\x81\xd7\x27\xb0\x44\x7b\x68\x50\x9c\x64\xfe\x0d\x9c\x3c\x91\x7b\x36\x7c\x00\x2e\x85\xf2\xf0\xb1\xf3\xa3\x89\x91\xee\x39\x19\x7c\x4d\xc9\xe3\xc4\x5f\x62\xd7\x28\xfb\x7c\x19\xd0\x9c\xa4\xcb\xe0\x75\xf7\x02\xd4\xa7\x08\xe7\x47\xf8\xa7\xd2\xf4\x6a\x76\x51\xaf\x4d\x49\xd6\x35\xda\xe1\xf0\xea\x56\xbb\x3a\x94\xe6\x51\x77\x15\x66\x02\x0d\x51\x8f\xfa\xab\x78\x0c\xb5\xfd\xa4\xcc\x5a\xa8\x2f\xfd\xad\xc6\xbd\x80\x31\x9f\x1f\x4e\xfc\x64\x42\x83\x38\x7f\xa0\x43\xb8\xff\xbc\xea\x27\xe8\x78\xe9\x35\x6e\x8c\x43\xf8\xf9\xfe\x7e\xb9\xea\x3e\xab\xf8\x20\x5c\xf0\xf9\xb3\xe9\xfd\xfe\xf3\x6a\x1c\x94\xbf\xe1\x35\xbc\x0f\xca\xe7\xf1\x7f\xff\x6a\xf8\x22\x1e\x10\x84\x52\xa0\xb1\x40\xef\x85\xdb\x43\xb1\xa3\xfc\xf1\x10\x0c\xf7\xa9\x53\xfd\x34\xbd\xe7\xc9\xc2\x6b\x0f\xde\x18\x0d\xc2\x77\x96\x48\x0f\x5c\x5b\x18\xe4\x12\xd6\x75\x60\x74\x5d\xad\x09\xe1\x29\x04\xfe\xe8\x58\xeb\x82\x65\xf1\x57\xc5\x35\x42\x21\x94\xc2\x32\x27\x91\x8b\x0d\x95\x21\x2e\x38\x64\x43\x65\x4a\xb9\xd9\x83\x48\x46\x4c\xc1\x07\xba\x7d\xa7\x4d\xfb\x20\x74\xc1\x5f\x2e\x7d\x30\x16\x24\x8d\xb1\xa5\xfc\x2a\xcb\x5a\x28\xb5\x07\x25\x78\x3a\x63\xad\xd2\xf3\x8d\xac\x12\x05\xe6\xa3\xfe\x03\x68\x67\x4b\x21\xf4\xc1\x14\xa8\x6a\x15\xa4\x55\x08\x54\xb1\xfc\x14\x4a\xb4\xa8\x4b\xa9\xb7\x60\x62\x03\xd7\x75\xb5\x46\x07\x66\xc3\xb6\xd0\x41\x9c\x7f\x3c\x8b\x4e\x8f\xf7\xf8\x11\xae\xbb\x25\xcd\x4c\xa2\x28\x8c\x23\x39\x6a\xff\x21\x3d\xfb\xa7\xf1\xd7\x67\xf4\x7e\xce\x6a\x2d\x9f\xb2\x67\x8e\x8c\x81\x36\xf6\xf0\x9e\x1f\x58\x71\x39\x4d\x4a\xa6\x20\xca\xd2\xf5\x23\x40\x33\x08\x9e\xc1\x67\xcb\x63\x1f\xd2\xbd\x8d\xe3\x7b\xec\x52\x85\xc1\x27\x2c\xea\x40\xed\x89\x58\x3d\x42\x69\xd8\x73\xc2\x5a\xb5\xef\xa2\x21\x7d\xd6\xcb\xff\xeb\x8d\x86\xd2\x14\x35\xe5\x49\x7e\x46\x5d\x94\x86\x1e\xc4\x26\xa0\x03\x67\xea\x40\x10\x51\x38\xa4\xf8\xa5\xfe\x82\x3a\xc8\x82\x2d\x9a\xc2\x5a\x46\x78\x85\x2e\x09\x36\x59\xf2\x7e\x04\xe2\x79\x86\x8c\x3b\xa3\x87\xef\xcd\x93\xd7\xe7\xdf\x52\xfe\x25\xe2\xb7\xe0\xb2\x13\xd6\xa2\xf6\xbd\x8d\x7a\x1f\x76\x3c\x28\x70\x00\x0d\xd8\x84\xf2\x86\xa1\x91\x31\x55\xba\x18\x78\x19\xa4\x95\xe9\x23\x51\xc0\xd6\x98\x32\x06\x23\x09\xb0\xaa\xde\x82\xd4\x20\xc0\x0a\x2d\x8b\x68\x34\x49\x3c\x28\x9d\xf2\xc3\xb7\xc3\xa8\xc2\xe0\x64\xe1\x07\x00\x9d\x94\x98\xef\x44\xe9\x7f\x01\x00\x00\xff\xff\xa7\xba\xf9\xd2\x1b\x18\x00\x00") +var _templatesServerConfigureapiGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x58\x4b\x93\xdb\xb8\x11\x3e\x47\xbf\xa2\x4b\xb5\x07\xc9\x25\x51\x55\x39\xba\x6a\x0e\x13\xdb\xeb\x55\xc5\x5e\xab\xac\x71\x72\xd8\xda\x03\x44\xb6\x24\x64\x40\x00\x01\x40\xcf\x68\x59\xfc\xef\xa9\x6e\x80\x14\x25\x51\x33\xb3\x99\x4d\xf6\x44\xe2\xd5\x8f\xaf\x1f\xe8\xc6\x62\x01\x77\x7b\xe9\x61\x2b\x15\x82\xf4\xe0\xc5\x16\x21\x18\xc0\x42\x86\x0c\xbe\xe8\x1c\x41\x06\xc0\x47\xe9\x83\xa7\xbf\x07\xa9\x14\x68\x13\x60\x83\x60\xbe\xa3\x7b\x70\x32\x04\xd4\xa3\x51\x5d\x83\xdc\x42\xf6\xce\xd8\x83\x93\xbb\x7d\x80\x79\xd3\x2c\x16\x50\xd7\x90\x9b\xb2\x44\x1d\xce\xd6\xea\x1a\x50\x17\xd0\x34\xa3\xd1\xc8\x8a\xfc\x5e\xec\x90\x36\x67\xb7\xab\xe5\x2a\x0d\x69\x4d\x96\xd6\xb8\x00\x93\x11\xc0\x38\x37\x3a\xe0\x63\x18\xf3\xbf\x3b\xd8\x60\x16\x41\x79\x1e\x4a\xc3\x1f\x65\x76\xfc\xd5\x18\x16\xfb\x10\xec\x78\x44\xa3\x9d\x0c\xfb\x6a\x93\xe5\xa6\x5c\xec\xcc\xdc\x58\xd4\xc2\xca\x05\x3a\x67\x5c\x3c\x3d\xbc\xc1\x55\x3a\xc8\x12\x9f\xdf\xb1\x28\x65\x51\x28\x7c\x10\xee\x25\x9b\x3d\xe6\x95\x93\xe1\xc0\xb2\x11\x6a\xac\xa1\x87\xec\x3d\x6e\x45\xa5\xc2\x32\x8d\x9b\xe6\x6c\xbd\xb7\x30\x65\xbc\x1f\x64\xd8\x43\xf6\x11\xf5\x17\x1b\xa7\x17\x8b\x9d\x79\xbb\x43\x8d\x4e\x04\x04\xff\x20\x76\x3b\x74\x70\x9c\x40\xf7\x1d\x1d\xcc\xe7\x41\xb8\x1d\x06\x86\xfb\x8e\x7f\x57\x22\xec\xa1\x69\x60\x3e\xd7\xa2\x8c\x76\xf8\x99\x7e\x78\xca\x5b\xcc\x79\x6a\x6d\x31\x4f\x3b\x47\x75\x3d\x67\x7b\x9f\x98\x2b\xfa\x80\xc6\x93\xe9\xb1\xb1\xc4\x5e\x1a\xed\xc7\x91\xa0\xb0\x72\x7e\xd5\xe4\x9d\x5f\x1c\x1d\xa4\xe5\xf5\xd9\x14\xa8\x86\xb8\x9d\x2c\x8c\x4b\x1a\xb5\xbc\x78\x70\xc2\xed\x92\xca\x35\x7e\x6b\xc6\x6b\x88\xe1\xe9\xca\xd8\xa1\x0f\xc2\xca\x71\x84\x8b\xd7\x4e\x58\x0e\x10\xba\xc6\xf3\x9d\x92\xa8\xc3\x10\xcf\xd3\x95\x71\xce\xc3\xa4\x65\x1c\x9c\xf0\x1c\x20\x74\x8d\xe7\x1d\x96\x56\x89\x80\xef\xa5\x8b\xe4\x42\x9a\x98\x17\xd2\x45\x2f\x39\xd9\x71\x4a\xc1\x09\xbd\x43\xc8\xbe\x74\x56\x8e\x34\x3a\xab\x33\x81\x6b\xa7\xee\xc4\x2e\xed\x0f\xf4\x37\xb8\x95\x44\x5c\x39\xa9\x73\x69\x85\x8a\x9b\x6d\x37\xa4\x13\xfd\xc5\xcb\xa3\x29\xac\xd6\xf9\x1e\xcb\x53\x44\x4f\x57\xc6\x9c\x30\x22\xfd\x22\xae\xcc\x7d\x5c\x22\x26\x03\x64\x86\xf0\x4c\x7a\xb1\x93\xf9\x9e\x0b\x5e\x55\xcd\x38\x98\x50\x3e\xcd\x96\x3a\x57\x55\x81\x7c\x72\x7a\x3a\xf7\x0f\xa1\x64\x21\x82\x71\xd3\x14\x91\xf7\xd2\x46\xb2\xfe\x59\x7a\x3f\x09\x5d\x28\x74\x67\x14\x57\xc2\x89\x12\x03\x3a\x0f\x67\x2b\x5f\xd1\x5b\xa3\x3d\xfa\x3e\xaf\x63\x08\x5f\xf0\xeb\x9f\x5d\x57\x96\xb3\xf5\xf1\xa0\x8f\x33\x4f\x9e\xfa\x2c\xa4\x8e\x47\xf0\x91\x27\xe6\xa5\x90\xfa\xd2\x90\x1f\xe2\x2a\x65\xa1\xd3\xed\x94\xa0\x06\xec\x5e\x95\xf6\xbd\x08\x22\x59\xb4\x2a\xed\xbc\x10\x41\x0c\x84\x79\x70\x32\x0f\x51\xef\x82\x10\x89\xe2\xf3\xec\xdc\x75\xd3\xfd\x83\xed\xdf\xb6\xd2\x39\xe4\x46\x6f\xe5\xae\x72\xf8\xa3\x12\x3b\x3f\x11\x56\xc2\x9b\xba\xce\x52\xe8\x35\x4d\x56\xd7\x60\x85\xcf\x85\x92\xbf\x61\x97\x58\x6f\x57\xcb\x29\xd4\x23\x80\xc5\x02\x84\x95\xd9\x3b\x53\x96\x42\x17\x9f\xa4\xc6\x2f\x96\xa1\xfe\xe8\x4c\x65\x3d\xdc\xc0\x2f\xbf\x52\x2a\xbf\xb6\xa3\x86\x2c\xcb\xa0\x19\x35\xa3\x33\x71\x6e\x57\xcb\xdf\x25\x0c\xf9\x7f\x96\xdc\xa5\x95\xac\x23\x06\x61\x8f\x24\x27\xec\xd1\xe1\x08\x58\x64\x4e\x6b\x1f\xe8\x1a\x85\x1b\x88\xd7\x69\x6f\x6e\x14\x29\xac\x31\xc0\xc1\x54\x0e\xf2\xca\x07\x53\x82\x32\x7c\x29\x71\x08\x62\x81\x45\x06\x29\xb2\xc0\x68\xae\x40\x94\xd9\x71\x44\x87\x6d\x24\xf0\xe1\xd1\x62\x1e\xb0\x00\xa9\x03\xba\xad\xc8\x11\x48\xcf\x09\x19\x48\xef\x66\xa4\x7d\xb7\x52\x37\x53\x3e\xd4\x9e\x14\xa5\x55\xf8\xf6\x08\xf2\xa7\xc8\xfc\xa6\xcf\x24\x29\xf3\xcd\xe3\x3a\x5e\x98\xdf\x96\x93\x48\x05\xee\x0c\x01\x10\xa4\xae\x10\x2a\x2f\xf5\x0e\x1c\x16\x26\x07\xe1\xa3\x4a\xdf\x96\x33\xa8\x74\x5b\xdf\x10\x42\x5b\xa3\x94\x79\xa0\x9d\x4a\x6a\x3c\x32\xfe\xe6\xf1\x2b\x1d\x9d\x4c\xd3\xad\x9f\xf2\xc4\x3b\xa3\x7d\x55\x62\xba\xed\x69\x25\xfa\xe4\x92\x04\x27\xaa\x31\x85\xf2\x2a\xd1\x19\xb4\x5e\x22\x42\x7a\x51\x96\x19\x3a\x1b\x29\xa3\xf2\xf8\x72\x5a\xa9\x60\x69\x65\x74\x3f\x12\xea\x0c\xbd\x03\x69\xb2\xaf\x28\x0a\x74\x33\x48\xc5\x44\xdf\x06\xd1\x19\xd8\x87\x00\x1c\x86\xca\xe9\xd6\x3f\x7e\x36\xa1\x93\x0f\x8b\xc9\xb8\xae\x99\x73\xd3\x10\xd2\x91\xf3\x5e\x78\xce\x0f\x07\xa4\x2a\x13\x35\x55\x40\xed\x81\x31\x59\x86\x8d\x9c\x34\x8a\x71\x78\x31\x68\xf1\x5d\x39\x53\x54\xf9\x2b\xf1\x4d\x44\xfe\x10\x7c\x7b\xb4\x5a\x7c\xdb\xa9\x23\xbe\x0f\x84\xef\x3f\x9d\x0c\x84\x2f\x25\xad\xd7\xa3\x6b\x5b\xbe\xaf\x41\xf7\x0c\xdc\x75\xaa\x64\xdf\xe3\x56\x6a\xd9\xde\xfd\xa7\x38\xfb\xbf\x09\x2f\xf3\xdb\x2a\x56\x8d\x1c\x0f\xb7\xd6\x2a\x89\x1e\x1e\xf6\xa8\x39\x68\x68\xd5\x38\xf9\x5b\xc4\x73\xcf\x7e\xc5\xbd\x08\x86\x58\xe3\xd2\x26\xa6\x03\xf1\x42\x1e\x01\x11\xbf\xc4\x78\xf9\x9e\x72\x19\xf1\xba\xb9\x01\x2d\x55\xc2\xe8\xc9\x8d\x31\x99\x54\x1e\x1d\xb4\x19\xc5\x0a\xef\xd3\x60\x0a\x93\xba\x4e\xf7\xd5\x04\xf0\xdf\xfd\x62\x63\xdc\x33\xca\x18\xa6\x4d\xf3\xa6\x57\x13\x1c\xf7\x35\xcd\x2c\x9a\x67\x9a\xc4\xe9\x8c\xa6\xa5\x9a\x5d\xb3\xdc\x86\xd5\x15\x24\x22\x89\x90\x44\x9e\x3e\x6f\x3e\x00\x82\xf9\xcc\x27\xa3\x29\x6e\x57\xcb\xbf\xe3\xe1\x69\x5b\x8c\x7b\xb5\xff\x38\x16\xaf\xa6\x72\x39\xb7\x02\xd1\x24\x7f\x3c\xf8\xc1\xdc\xa3\xfe\xb3\x01\xa7\xbb\xed\x1e\x0f\x11\xf2\x3e\xe2\xc7\x18\xda\x3a\x53\xd2\x30\x22\x42\x41\x45\x55\x14\xfc\xd2\x83\xec\xd7\x57\x19\xe8\x0b\xa1\xf2\xd7\x68\x9c\xff\x21\xc6\x33\xf0\xb9\xb1\xe8\xa9\xb0\xf8\x73\x41\x37\x82\x15\xde\xa0\x70\xe8\x2e\xa1\xff\xfd\x58\x5e\xb9\x0e\xda\x7e\x6e\x30\x5f\x0d\xd7\x29\x22\x25\xa5\x27\x6b\x95\xb6\x97\xcf\xda\x14\x86\x45\x5b\x3b\x0c\x94\x2d\x6d\xc2\xef\x36\xbb\x27\x8b\x95\xdb\xd5\xf2\xb8\x13\x6e\xae\x32\xbb\xd0\xf5\x87\xb6\x0f\x7c\x7b\x03\x59\xef\x31\x25\xae\x0e\xf5\x6b\x27\xfe\x96\xba\xa3\xf6\x60\x47\x8d\x9b\x97\x9e\x8f\x0d\xf7\x96\x97\x57\x5e\x5b\x52\x0e\xb9\xec\x53\xbc\x2e\x59\xbd\x98\x53\xe7\x10\xed\xc9\x5b\x25\x05\x29\x9a\xd1\xe4\xd5\x83\xc7\x1b\x98\x23\x3b\xf6\xa3\x2f\xa3\xc0\x0d\x95\x3f\x3a\xdb\x0f\xed\xbb\xcc\x50\x7b\x71\x72\x45\x1e\xad\x49\x31\xd4\xef\x6c\x5f\x1b\x91\x75\xcd\x77\x36\xa7\xb0\x67\x1a\x80\x4e\xbc\x36\x7a\x53\xf0\x3e\x7f\xf2\x2c\xa4\xa3\x43\xf6\x2a\xa1\xff\xab\xa2\xc7\x87\xb8\xec\x42\xa3\x56\xa5\xde\x9e\x8b\x74\x74\xf2\x66\xd1\x57\xfc\x4c\xef\xa6\x79\x3e\x37\x25\x59\xe7\x09\x05\x2e\xab\xce\x52\x53\x2a\x14\x57\x0e\xe3\x0b\xd1\x7a\x5f\x85\xc2\x3c\xe8\x36\x69\x4f\xa1\xa6\x33\xfd\x76\xeb\x89\x3d\x49\x3f\x8f\xa1\xb2\x1f\x95\xd9\x08\xf5\xb9\x53\x75\xd2\x11\x98\xf0\xfa\x71\xc5\x4f\xa7\xd4\x3a\xf2\x3b\x30\xc2\xdd\xa7\x75\xd7\xf3\x45\x24\x36\xb8\x35\x0e\xe1\xa7\xbb\xbb\xd5\xba\x7d\x41\xf4\x41\xb8\xe0\xb3\xb3\x7e\xf3\xee\xd3\x7a\x12\x94\x7f\xc7\x63\x78\x13\x94\xcf\xe2\x7f\xd7\xe7\x7e\x16\xf7\x08\x42\x29\xd0\x98\xa3\xf7\xc2\x1d\x20\xdf\x53\x3a\xf2\x10\x0c\x97\x1f\x97\xfc\xa9\xdf\xcc\x92\x84\xb7\x1e\xbc\x31\x9a\xfa\xaf\x24\x89\xf4\xc0\xa9\x9c\x6d\x53\xc0\xa6\x0a\x6c\x14\x57\x69\x32\xcc\x0c\x02\xbf\x6d\x57\x3a\x67\x5a\xfc\x78\xbd\x41\xc8\x85\x52\x58\x64\x44\x72\xb9\xa5\xac\xcf\xf9\x9d\x64\x28\x4d\x21\xb7\x07\x10\x49\x88\x19\xf8\x40\xda\xb7\xdc\xb4\x0f\x42\xe7\xfc\x40\xee\x83\xb1\x20\xa9\xef\x29\xe4\x77\x59\x54\x42\xa9\x03\x28\xc1\x25\x3b\x73\x95\x9e\x35\xb2\x4a\xe4\x98\x8d\xba\x77\xf6\x56\x96\x5c\xe8\xa3\x28\x50\x56\x2a\x48\xab\x10\xe8\x82\xf0\x33\x28\xd0\xa2\x2e\xa8\x8f\x34\xb1\x2e\xd3\x55\xb9\x41\x07\x66\xcb\xb2\xd0\x42\x2c\x85\x3d\x93\x4e\xef\x54\xdf\x85\xaa\xb0\xd3\x92\xca\x67\x91\xe7\xc6\x11\x1d\x75\x78\x9b\x5e\xb8\x66\xf1\xeb\xc7\x60\x1c\x8c\x2b\x2d\x1f\xc7\x67\x86\x8c\x8e\x36\xf1\xf0\x86\x9f\x04\xe2\x70\x96\x98\xcc\x40\x14\x85\xeb\xaa\xb5\xba\xe7\x3c\xc7\xc8\x3a\xb3\x21\xe9\x6d\x1c\xeb\xb1\x4f\x29\x1a\x1f\x31\xaf\x02\xd5\x04\x74\xd4\x23\x14\x86\x2d\x27\xac\x55\x87\xd6\x1b\xd2\x0b\x76\xf6\x2f\x6f\x34\x14\x26\xaf\x28\xbc\xb2\x01\x76\x91\x1a\x7a\x10\xdb\x80\x0e\x9c\xa9\x02\x41\x44\xee\x90\xfc\x97\xae\x73\xd4\x41\xe6\x2c\xd1\x0c\x36\x32\xc2\x2b\x74\x41\xb0\xc9\x82\xe7\x23\x10\xe7\x11\x32\x69\x85\xee\xbf\x90\x5c\xbc\x97\xfc\x25\xc5\x5f\xda\xfc\x12\x5c\xf6\xc2\x5a\xd4\xbe\x93\x51\x1f\xc2\x9e\xeb\x33\x76\xa0\xde\x31\xa1\xbc\x61\x68\x64\x0c\x95\xd6\x07\x9e\x06\x69\x6d\x3a\x4f\x14\xb0\x33\xa6\x88\xce\x48\x04\xac\xaa\x76\x20\x35\x08\xb0\x42\xcb\x3c\x0a\x4d\x14\x8f\x4c\x67\xfc\x54\xd3\x62\x54\x22\x5d\x63\xbe\x07\xd0\x45\x8a\xf9\x2f\x51\xfa\x4f\x00\x00\x00\xff\xff\x11\xfc\x88\xee\x82\x1a\x00\x00") func templatesServerConfigureapiGotmplBytes() ([]byte, error) { return bindataRead( @@ -475,12 +642,12 @@ func templatesServerConfigureapiGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/server/configureapi.gotmpl", size: 6171, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xbb, 0x96, 0xda, 0x4, 0x85, 0x1a, 0xb7, 0x14, 0xb9, 0x13, 0x38, 0x8c, 0xf2, 0x58, 0xa9, 0x26, 0xad, 0x62, 0xb7, 0xa3, 0x32, 0x55, 0x1, 0x46, 0xc7, 0xc5, 0x1, 0xf8, 0x60, 0x6c, 0xb9, 0x33}} + info := bindataFileInfo{name: "templates/server/configureapi.gotmpl", size: 6786, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x80, 0x9, 0x27, 0xe2, 0x95, 0x78, 0x35, 0xb1, 0x73, 0x83, 0xa2, 0xd, 0x6e, 0x5, 0x7d, 0x1e, 0xbf, 0xbd, 0x6b, 0xa5, 0x4b, 0xd5, 0xf2, 0x6a, 0x86, 0x1b, 0xa3, 0xa5, 0x56, 0x85, 0x2e, 0x5d}} return a, nil } -var _templatesServerDocGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x54\x4d\x8f\xdb\x20\x10\xbd\xf3\x2b\xe6\xbc\x52\xf0\xdd\xad\x2a\xb5\xc9\x4a\x8d\xb4\xdd\x44\xdd\xb4\x77\x6a\x4f\x1c\xd4\x00\x11\x90\xae\x52\xc4\x7f\xaf\xf8\xb0\xc3\xe2\xa4\xd2\x9e\xec\x79\xf3\xe6\xbd\x61\x3c\xa6\x69\x60\xa9\x7a\x84\x01\x25\x6a\x66\xb1\x87\x5f\x17\x18\xd4\xc2\xbc\xb2\x61\x40\xfd\x01\x56\x1b\x78\xde\xec\xe0\x71\xb5\xde\x51\x42\x88\x73\xc0\xf7\x40\x97\xea\x74\xd1\x7c\x38\x58\x58\x78\xdf\x34\xe0\x1c\x74\x4a\x08\x94\xb6\xca\x39\x07\x28\x7b\xf0\x9e\x10\xd2\x3c\x90\x2d\xeb\x7e\xb3\x01\x03\x9f\x7e\xde\xae\xc7\xd0\x7b\xc8\xc2\x6b\xb9\x57\x74\xc7\xed\x31\x80\x81\x55\x03\x78\x34\xf9\xed\x70\x16\x4c\xf2\xbf\x08\xf4\x99\x09\x4c\x66\x28\xfb\x98\x9b\xa4\x56\x68\x3a\xcd\x4f\x96\x2b\x19\x9a\x98\x14\xe7\x78\x6a\xf3\x4d\x1b\xa8\x85\xd9\xec\x5f\x50\xff\xe1\x5d\x30\x25\x11\x81\xcd\x1e\x32\xd6\x92\xab\xe2\x9c\x5d\x89\x2a\x0d\xf4\xa5\x3b\xa0\x40\x03\xf4\xab\x32\x16\xe8\x17\x66\x70\xcb\xec\x21\x49\xe4\x9a\xe0\x3f\xf2\xbc\x27\x00\x00\x39\x6c\xc3\x94\x34\x93\x03\xce\x18\x00\xce\xd1\x62\xdc\xf5\x81\xa2\x5f\xe6\x86\xf7\x28\x35\xa2\x35\x79\x6a\x2b\x17\x8c\x71\x2a\x2a\xb2\xa9\x30\x3e\x5f\x79\x71\x8c\xac\xf3\x13\xb5\xc9\x03\x0e\x32\x39\x4c\x2a\xd7\x5c\xed\xfe\xc4\x3b\x94\xf1\x23\xc7\xaa\x1c\xb6\xf0\x36\x9d\x3e\x7a\xda\x91\x12\x4a\xab\x74\x4b\x90\xfe\xf8\xfe\x54\x15\x4c\xc8\xed\xa1\x2d\x95\xb4\xac\x9b\xe6\x96\xc3\xa9\x93\x1c\x97\x9d\xcc\xa1\x5b\x82\xf4\x51\x30\x7e\x04\xef\x3f\x96\x35\x23\xf8\xe9\x5e\x55\xea\x16\xca\x9a\xff\x1c\xa0\x96\x30\xe7\xbc\x2e\xe3\x59\x22\xd0\x5e\x37\xaa\xe4\x04\xca\x22\x3a\x7d\xc3\x9e\xb3\xdd\xe5\x14\x7f\x30\x92\x16\xed\x8e\xc9\x56\xab\xfe\xdc\x15\x26\x23\x50\x98\x94\x9c\xf7\x99\x5c\x7f\x27\x92\x2f\xa7\x56\xa0\x65\xe4\xa1\x21\xa7\x7b\xb7\x0a\xf9\x17\x00\x00\xff\xff\x2c\x04\xd8\xf5\xdf\x04\x00\x00") +var _templatesServerDocGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x94\x4f\x8f\xda\x30\x10\xc5\xef\xfe\x14\x23\x4e\xed\x01\x73\x4f\xab\x4a\x5b\x58\xa9\x48\xdb\x05\x95\xb4\x77\x37\x19\x82\xd5\xc4\x46\xb6\xe9\x8a\x45\xf9\xee\x95\xff\xae\x63\x40\x55\x0f\xbd\x65\x9e\xe7\x3d\xff\x86\x0c\x59\x2c\x60\x29\x5b\x84\x0e\x05\x2a\x66\xb0\x85\x9f\x67\xe8\xe4\x5c\xbf\xb0\xae\x43\xf5\x01\x56\x1b\x78\xde\xd4\xf0\xb8\x5a\xd7\x94\x10\x72\xb9\xcc\x81\xef\x81\x2e\xe5\xf1\xac\x78\x77\x30\x30\x8e\x64\xb1\x80\xcb\x05\x1a\x39\x0c\x28\x4c\x71\x66\x0d\x28\x5a\xfb\x48\x6c\xe3\x96\x35\xbf\x58\x87\xd6\x40\x1f\xb6\xeb\x58\x8e\xa3\x55\x6c\xf2\x5a\xec\x25\xad\xb9\xe9\xad\x98\xc7\x96\x07\xd8\xeb\xa2\xe5\xdd\xe1\x34\x30\xc1\x5f\x11\xe8\x33\x1b\xf0\xbd\x3b\x45\xd1\x3a\xc4\x84\xee\x72\x56\xa8\x1b\xc5\x8f\x86\x4b\x11\x26\x80\xab\xbb\xf2\x9e\x19\xc0\xac\x18\x67\x92\x57\xa3\x1a\xf4\x66\xbf\x43\xf5\x9b\x37\x18\x23\x9d\x0a\x9b\x3d\x04\xbd\x72\xea\x8d\xab\x0a\xfb\xcc\x36\xdd\xb9\x4f\x2a\xa0\xbb\xe6\x80\x03\x6a\xa0\x5f\xa4\x36\x40\x3f\x33\x8d\x5b\x66\x0e\x3e\xcc\xf6\xda\x2b\x3c\x5d\x6c\x0d\x44\xa1\xac\x88\xc7\x98\x83\x62\xa2\xc3\xab\x36\x87\x48\x7d\x92\xef\x0b\x10\x37\x0a\x7b\x8b\xe3\x08\x5e\xfb\x5c\x39\x7f\x54\xef\x98\x12\x76\x30\xc6\xda\x9b\xf3\xd3\x14\x90\x9e\x5f\xf8\x74\xdc\xb7\xd4\x1f\xa8\x74\xf6\x56\x43\xe9\x33\xb3\xb3\xab\xb9\xde\x12\x9e\x78\x83\x42\xa7\x97\x18\xca\x2a\x2e\x68\xa8\xdd\x8a\xf9\xfd\x9b\x48\x7e\x93\x7d\x6c\xe1\xf8\xfe\xed\xa9\x30\x24\xa5\xc0\xb8\x41\xb5\x94\xc2\xb0\x26\xfd\xca\xa1\x4c\x54\xa1\xce\xa9\xae\xa5\x09\x55\x3c\x7e\x1c\x18\xef\x61\x1c\x3f\xe6\x9e\x28\x7e\xba\xe7\xf2\xe4\x90\x7b\xfe\x3a\x4c\xb1\xcc\xc5\xff\x68\x29\x85\x3e\xa5\x1d\x8c\x43\x3a\xa9\x22\x93\x65\xcd\x3b\x8b\x3d\x7e\xe8\xfb\x1d\x2a\xce\x7a\xfe\x8a\x2a\x5b\xe7\xb9\x23\xfd\x8a\x2d\x67\xf5\xf9\x88\x30\xff\x77\xbe\xad\x92\xed\xa9\x99\xf0\x45\xa9\xe0\xcb\x3b\xff\x3f\x9f\x67\x09\x1f\xec\x6a\x40\xc3\xc8\xf1\xde\x47\x96\xfc\x09\x00\x00\xff\xff\xd1\x23\x8f\xf6\xf0\x05\x00\x00") func templatesServerDocGotmplBytes() ([]byte, error) { return bindataRead( @@ -495,12 +662,12 @@ func templatesServerDocGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/server/doc.gotmpl", size: 1247, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7b, 0xee, 0x9c, 0xf5, 0xc6, 0x25, 0x6a, 0xc6, 0x8d, 0x3d, 0x62, 0x9d, 0x29, 0x7d, 0x93, 0xd6, 0x99, 0x6f, 0x82, 0x8d, 0xdd, 0xbf, 0x29, 0xb8, 0xa0, 0x50, 0x2f, 0xb8, 0x1c, 0xbd, 0xb1, 0xaa}} + info := bindataFileInfo{name: "templates/server/doc.gotmpl", size: 1520, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1f, 0x54, 0x22, 0xf5, 0xb6, 0xf8, 0x73, 0x9d, 0x94, 0x4a, 0xad, 0xb4, 0xa6, 0x5d, 0xc9, 0xb9, 0xce, 0xf8, 0x9c, 0x99, 0x26, 0xa7, 0x96, 0x89, 0xbe, 0x1f, 0xa6, 0xf5, 0x50, 0xc2, 0x4c, 0xb7}} return a, nil } -var _templatesServerMainGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x57\x5b\x6f\xdb\x36\x14\x7e\x16\x7f\xc5\xa9\xd0\x01\x52\xe7\x48\x2b\xf6\x96\xc2\x0f\x41\x2e\x9d\x87\x34\x0e\xe0\xf4\x61\x58\x87\x82\x91\x8e\x64\x2e\x32\xa9\x91\x54\xdc\xcc\xd0\x7f\x1f\x78\x89\x4d\xdf\xd2\x6c\x41\xd0\x01\xcd\x4b\x1c\xf1\x1c\x7e\x3c\xfc\xce\x8d\x27\xcf\xe1\x58\x94\x08\x35\x72\x94\x54\x63\x09\xd7\x77\x50\x8b\x03\x35\xa7\x75\x8d\xf2\x1d\x9c\x8c\xe1\x62\x7c\x05\xa7\x27\xa3\xab\x8c\x10\x02\x8b\x05\xb0\x0a\xb2\x63\xd1\xde\x49\x56\x4f\x35\x1c\xf4\x7d\x9e\x9b\xe5\x42\xcc\x66\xc8\xf5\x86\x6c\xb1\x00\xe4\x25\xf4\x3d\x21\xa4\xa5\xc5\x0d\xad\x11\x66\x94\x71\x42\xd8\xac\x15\x52\x43\x42\x00\xe2\x46\xd4\xb1\xf9\x15\xca\xfe\x70\xd4\xf9\x54\xeb\x36\x26\x04\xa0\x11\xb4\x54\x10\xd7\x4c\x4f\xbb\xeb\xac\x10\xb3\xbc\x16\x07\xa2\x45\x4e\x5b\x96\x5b\x61\x4c\x22\x6f\xd6\x47\x85\xef\xc5\x44\xcb\xae\xd0\x67\x0d\xad\x15\xf4\x7d\x65\x7f\xc3\xed\x7f\xa2\x52\x78\x5b\xde\x18\x1c\x2b\x35\x67\x7a\x3b\x0f\xfa\xde\x7d\x78\xb4\xcb\x10\x66\x0d\x45\xb5\xd5\xdb\x9f\xf3\xd6\xac\x3f\xb0\xff\x7e\x7b\xbc\x43\x8f\xd8\x4f\x49\x79\x8d\x90\x9d\x60\x45\xbb\x46\x8f\x2c\x29\xca\xf0\xd6\x4a\xc6\x75\x05\xf1\x0f\x7f\xc5\x90\x79\x58\xe4\xa5\xff\xcf\x6d\x7b\x7d\x83\x77\x03\x78\x7d\x4b\x9b\x0e\xe1\x70\x08\x59\xb0\xdf\xc8\xfa\xde\x1c\x18\x22\x39\xdd\x35\xb8\x94\x90\x3c\x87\xab\x29\x53\x50\xb1\x06\x61\x4e\xd5\x7a\x3c\xe8\x29\x82\x0f\x08\xd0\x42\x34\x99\xd1\xff\x40\x6f\x10\x54\x27\x11\xb8\xd0\xa0\x05\x88\x5b\x94\x73\xc9\x34\x82\x5e\x42\xd1\x4a\xa3\x84\x3b\xd1\x05\x80\x4c\xc3\x35\x16\xb4\x53\x08\xb4\x69\x8c\x50\x02\x96\x4c\x2b\x98\x8b\xae\x29\xe1\x1a\xa1\x11\x4a\xbf\x22\x9e\xc5\xd3\x2f\x45\xd3\x95\x38\x69\xb1\x30\x61\x54\x75\xbc\x00\xc6\x99\x4e\x52\x58\xdc\x87\x47\x76\x54\x96\xe7\x82\x96\x28\x93\x6a\xa6\x55\xf6\xdb\xd1\x87\xf3\x0f\x54\x17\x53\x94\x03\x58\xae\x9c\x88\x22\x25\x3d\x09\x42\xd2\x82\x99\x70\xf4\x60\x3b\x1c\xef\x96\xcc\x1d\x37\x2d\x81\x7b\x52\xcc\xc2\x00\x50\x4a\xe3\x02\x67\xcf\xe9\xec\x1a\xcb\x12\xcb\x64\xb1\x80\xec\xe8\x72\x74\xe9\x43\xbf\xef\xb3\x89\xdb\xf4\xeb\x64\x7c\x31\x80\x6d\xf1\x59\x43\x75\xa0\x92\x12\x30\xe7\x1b\xf0\x57\x43\xe0\xac\xb1\x76\x9a\x6b\xd7\xd9\x19\xd5\xb4\x69\x78\x82\x52\x1a\xb5\x7e\x15\x5e\xd6\xba\x5b\x2a\x41\xa1\xbc\x45\x09\x6f\x76\x98\xe1\x24\x79\x0e\xb3\xa5\x27\x0d\xad\xc0\x14\x14\xb4\x69\xb0\x24\x24\x32\x51\x9b\x7d\x54\x66\xcb\x10\x0c\x59\x9e\x27\x30\xa4\x66\x67\x36\xb0\x12\xa1\xb2\x89\x2e\x51\xca\x01\xc4\x56\xf7\xf0\x13\x8f\x53\x12\x45\x7b\x74\xac\x95\x25\x55\x53\x94\xec\x6f\x84\xec\x82\xce\x8c\x45\x07\xde\xd6\xdf\xc7\x97\x57\xa3\xf1\xc5\xe4\x8f\x4f\xdc\xe2\xd8\xe3\x34\xd3\x8d\x8d\x70\xef\xa1\x11\xaf\xc4\xd2\x39\xf6\x2b\xbb\xb2\x2a\x76\x6d\x2d\x75\x36\x85\xd8\x28\x5c\x6d\x5d\xf7\x69\x1c\xaf\x14\x02\xe7\x66\xe6\x4f\x92\x06\x50\x4b\x9e\xd7\xfe\x79\x06\xe4\xbe\xdf\x4b\xa4\xe5\xe4\xc7\xd8\xd3\x14\x45\x25\xaa\xe2\x61\x8a\x4e\x50\x15\x92\xb5\x9a\x09\xbe\x8f\xa8\x2d\x95\xa7\x5e\x2a\x00\x7c\x16\xd2\xf6\xe3\xdb\x24\xb0\xd9\x63\x99\x79\x35\x84\x38\x86\x05\x89\x42\x3e\xab\x90\x50\xa3\x16\xf0\xb9\xce\x7c\xc3\x43\x55\x9b\x18\xc7\x62\x36\xa3\xbc\x3c\x67\x1c\x4d\xda\xd6\x36\xf8\x55\x92\xa6\xc4\xec\xcd\x73\x68\xa9\x54\x68\xcb\xe7\xf1\xf9\xc8\xee\x51\x3e\xa7\x2e\x8d\x24\x49\xc9\xaa\xe6\x6c\x17\x17\x97\x0e\xc3\x1d\x35\xe2\x02\xe7\x2e\x7d\x13\xce\x9a\xf4\xc1\x42\x64\xa9\x52\x5a\x32\x5e\x27\x0e\xd1\x2e\xa5\xff\xb2\xae\xd0\x96\xb9\xd0\xca\xbc\x19\xce\x0a\x13\x42\x54\x15\xb4\x09\x13\xf9\xe8\x72\x94\x04\x06\xa5\xcb\xbb\x64\x13\xd4\x46\x48\x5b\x96\xfa\x5a\xe5\x7c\x4b\x20\x72\x07\xfc\x37\x7c\x43\x75\x8d\xfa\x9e\xb1\x39\xd3\x53\x4b\x36\xd8\x5e\x67\x5b\x51\x83\x25\x88\x4e\x93\xe8\x51\xac\x06\x06\xba\x62\x1a\x95\x58\xa1\x5c\x5e\x63\xda\xe9\x52\xcc\xb9\xf1\x9f\x07\xcc\x8e\x05\xaf\x58\xdd\x49\x34\xd6\xa5\x24\xf2\xdc\x1e\x0e\x57\x77\x97\xb7\x98\xa4\xef\xd6\x29\x8f\xa2\x2d\xc2\x4d\xec\x84\x65\x7c\xcf\xd3\x66\x4f\xca\xac\x02\xe7\xf0\xeb\x91\x13\x7a\xe0\x7f\xd7\xcc\x9e\x1a\x75\xd1\xe3\x78\xf0\xbe\xde\xe3\xe0\xe0\xad\x00\x2e\x9d\x2d\xa0\x4d\x65\x03\x62\xf3\x58\xfa\xcc\x1a\xf8\x75\xff\x96\x4b\x97\x5b\xb2\xc9\x54\x48\x1d\x96\xd6\xef\xb2\x91\x2d\xe9\x38\x17\xbc\x7e\x2c\x1b\xdf\x5d\xcf\x5a\xa6\xfc\x9e\x37\xe7\x46\xbd\xb1\xc5\x20\x31\xb1\x56\x09\x09\x9f\x07\x20\x5a\xad\xde\x4b\xd1\xb5\x26\x50\xdd\x98\x40\x5b\x16\x36\xab\xb1\x3d\xd9\x29\x29\x9f\x82\x9f\x97\x39\xef\x7d\x74\x54\x96\x56\x21\x59\xe2\x6d\x45\x71\x70\xd6\xa6\x4b\x43\x91\x3f\x2e\xbd\xef\xc6\x5b\xe9\xbf\xb3\x00\xb8\xbe\xb3\xfe\xa6\x35\x55\x75\xcb\x50\xdf\x4a\xb7\x0a\x6b\x61\xe6\xda\xc3\x21\xbc\x25\x91\xd9\x57\xe1\x00\xc4\x8d\x59\x40\x29\xb3\xe4\x8d\x4b\xd5\x53\x29\x85\x4c\xdf\x19\x89\x7d\x19\x58\xc5\xec\xea\xae\x45\x18\xde\xa7\xf9\xa9\x94\xbf\x60\xd3\x3a\x05\x07\x3b\x84\x9f\xcc\x47\xef\x5f\x09\x42\x65\xa7\x5f\x98\x4e\x8c\xcc\x16\xf0\x07\xba\xfa\xf3\x76\xea\x67\x6a\xd5\xfb\xda\x5f\xe8\x9c\x1d\xb1\xe9\x7a\xe1\xca\xfe\xaf\x75\xc3\x47\x0e\x36\x9b\xf3\xf5\xcb\x90\xf6\x32\xa4\x7d\xeb\xde\xf6\x32\xa4\x7d\xc3\x21\x6d\x73\x18\x9b\xa0\x1e\x77\xba\xed\x02\x4f\xb8\x96\xe2\x66\x2f\x83\xe9\xdf\x68\xa6\x73\xbe\x0c\x6b\x2f\xc3\xda\x13\x86\xb5\xf0\xe8\x9e\xfc\x13\x00\x00\xff\xff\x26\xd4\x1f\xcf\x51\x17\x00\x00") +var _templatesServerMainGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x57\x4d\x6f\xe3\x36\x13\x3e\x8b\xbf\x62\x56\xc0\x0b\x48\xfb\x3a\x52\x17\xbd\x65\xe1\x43\x90\x8f\xad\x8b\x6c\x1c\xc0\xd9\x43\xd1\x2d\x16\x8c\x38\x92\xd9\xd0\xa4\x4a\x52\xf1\xa6\x86\xfe\x7b\x41\x8a\xb6\xe5\x8f\xa4\x2e\x82\xa0\x8b\x6e\x2e\x71\xc4\x19\x0e\x87\xcf\x7c\x3c\x9c\x3c\x87\x53\xc5\x10\x2a\x94\xa8\xa9\x45\x06\xb7\x0f\x50\xa9\x23\x33\xa7\x55\x85\xfa\x3d\x9c\x8d\xe1\x6a\x7c\x03\xe7\x67\xa3\x9b\x8c\x10\x02\x8b\x05\xf0\x12\xb2\x53\x55\x3f\x68\x5e\x4d\x2d\x1c\xb5\x6d\x9e\xbb\xe5\x42\xcd\x66\x28\xed\x96\x6c\xb1\x00\x94\x0c\xda\x96\x10\x52\xd3\xe2\x8e\x56\x08\x33\xca\x25\x21\x7c\x56\x2b\x6d\x21\x21\x00\x71\x39\xb3\xb1\xfb\x15\xaa\xf2\xbf\x12\x6d\x3e\xb5\xb6\xf6\x1f\xca\xc4\xc4\xfd\x56\xdc\x4e\x9b\xdb\xac\x50\xb3\xbc\x52\x47\xaa\x46\x49\x6b\x9e\x0b\x45\x99\x89\x49\x14\x1c\xfb\x64\xf0\x83\x9a\x58\xdd\x14\xf6\x42\xd0\xca\x40\xdb\x96\xfe\xb7\xbf\xfd\x77\x34\x06\xef\xd9\x9d\xb3\xe3\xa5\xee\x9c\xe0\xe9\x51\xdb\x76\x1f\xc1\xda\x75\xdf\xcc\x86\x15\x53\x97\xef\x7e\xcc\x6b\xb7\xfe\xc4\xfe\xe5\xf6\x78\x8f\x5e\x50\xf4\x40\x18\xc8\xce\xb0\xa4\x8d\xb0\xa3\xf0\xbd\x32\xb4\x94\xf7\x04\x29\x21\x79\x0e\x37\x53\x6e\xa0\xe4\x02\x61\x4e\xcd\x66\x0c\xed\x14\x21\x04\x11\xac\x52\x22\x73\xfa\x1f\xe9\x1d\x82\x69\x34\x82\x54\x16\xac\x02\x75\x8f\x7a\xae\xb9\x45\xb0\x2b\x53\xb4\xb4\xa8\xe1\x41\x35\x3d\x83\xdc\xc2\x2d\x16\xb4\x31\x08\x54\x08\x27\xd4\x80\x8c\x5b\x03\x73\xd5\x08\x06\xb7\x08\x42\x19\xfb\x86\x84\x7b\x9f\x7f\x2d\x44\xc3\x70\x52\x63\xe1\xbc\x2d\x1b\x59\x00\x97\xdc\x26\x29\x2c\x08\x80\x8f\x59\x76\xc2\xd8\xa5\xa2\x0c\x75\x52\xce\xac\xc9\x7e\x39\xf9\x78\xf9\x91\xda\x62\x8a\x7a\x00\xab\x95\x33\x55\xa4\xa4\x25\xbd\x34\xf2\xc6\x5c\x0a\x05\x63\x7b\x42\x45\x00\xdc\xfa\x91\x13\xb8\x9b\x6e\xfb\x03\x4b\x68\xdc\xc2\x00\x50\x6b\x38\x1e\x06\xaf\xce\x67\xb7\xc8\x18\xb2\x64\xb1\x80\xec\xe4\x7a\x74\x1d\x92\xb6\x6d\xb3\x49\xb7\xe9\xe7\xc9\xf8\x6a\x00\xbb\xe2\x0b\x41\x6d\x4f\x25\x25\xe0\xce\x77\xc6\xdf\x0c\x41\x72\xe1\xbd\x75\x97\xaf\xb2\x0b\x6a\xa9\x10\x32\x41\xad\x9d\xda\xda\xe1\xe5\x25\x01\xee\xa9\x06\x83\xfa\x1e\x35\xbc\xdd\xe3\x4a\x27\xc9\x73\x98\xad\x62\xea\x00\x06\x6e\xa0\xa0\x42\x20\x23\x24\x72\x19\x97\x7d\x32\x6e\xcb\x10\x1c\x6c\x01\x31\x70\xf0\x66\x17\xb5\xe6\xd2\x26\xca\x64\x13\xcb\x50\xeb\x01\xc4\x5e\xf7\xf8\xb3\x8c\x53\x12\x45\x8f\xe8\x78\xc0\x19\x35\x53\xd4\xfc\x4f\x84\xec\x8a\xce\x9c\x47\x47\xc1\xd7\x5f\xc7\xd7\x37\xa3\xf1\xd5\xe4\xb7\xcf\xd2\xdb\xf1\xc7\x59\x6e\x05\x3a\x88\x43\xac\x46\xb2\x54\xe0\x7b\xc3\xf2\x2b\xbb\xf1\x2a\x7e\xcd\x9f\x59\x42\xfc\xbf\x3f\xe2\x5d\x21\x0a\x83\xeb\xad\x9b\x71\x8d\xe3\xb5\x42\x2f\xc0\x99\xfb\x93\xa4\x3d\x53\xab\x6c\xda\xf8\xe7\x05\x2c\xb7\xed\xa3\x40\x7a\x4c\xfe\x1f\x07\x98\xa2\x88\xa1\x29\x9e\x86\xe8\x0c\x4d\xa1\x79\x6d\xb9\x92\x8f\x01\xb5\xa3\xf2\xdc\x4b\xf5\x0c\xbe\x08\x68\x8f\xdb\x0f\x55\xcc\x4b\xf0\xc8\xbc\x19\x42\x1c\xc3\x82\x44\x7d\x3c\xcb\x3e\xa0\x4e\xad\x87\xe7\x26\xf2\x42\xf6\x55\x7d\x61\x9c\xaa\xd9\x8c\x4a\x76\xc9\x25\xba\xd2\xad\x7c\xf2\x9b\x24\x4d\x89\xdb\x9b\xe7\x50\x53\x6d\xd0\x37\xd2\xd3\xcb\x91\xdf\x63\x42\x4d\x5d\x3b\x49\x92\xf6\xdb\xcc\x76\x8b\x71\x3d\xa6\xab\x88\xe1\x9e\x56\x71\x85\xf3\xae\x82\x13\xc9\x45\xfa\x64\x3f\xf2\x68\x19\xab\xb9\xac\x92\xce\xa2\x5f\x4a\xff\x61\x7b\xa1\x35\xef\xb2\x2b\x0b\x6e\x74\x5e\xb8\x2c\xa2\xa6\xa0\xa2\x5f\xcb\x27\xd7\xa3\xa4\xe7\x50\xba\xba\x4b\x36\x41\xeb\x84\xb4\xe6\xeb\xcb\x87\x08\x13\x02\xd1\xb3\x0e\x71\x90\x57\x68\x97\xb0\xcd\xb9\x9d\x7a\xd0\xe1\x9e\x8a\x06\x3d\x39\x09\x64\xa0\x1a\x4b\xa2\x83\xa0\xdd\xf4\xb2\x6b\xac\x11\xc3\x12\xf5\xea\x3a\xd3\xc6\x32\x35\x97\x49\x4a\x96\x36\xb3\x53\x25\x4b\x5e\x35\x1a\x9d\x83\x29\x89\x02\xc6\xc7\xc3\x35\x06\xfa\x1e\x93\xf4\xfd\x26\xf4\x51\xb4\x03\xbc\x4b\xa3\x35\x6f\xf5\x89\x6a\xe3\x85\xb2\x49\x57\x7b\xa8\xaa\xbb\xeb\xf1\x41\x79\xb4\x19\x92\x6f\x8f\xe7\x9e\x9b\x89\xd1\x61\x68\x84\xd0\x3f\x16\xec\x5d\xb6\xf5\xb5\xee\xcd\xfa\x3a\x77\xa6\x7c\x91\xeb\x50\x73\x83\xb0\x1e\x9e\x68\xe9\x6a\x4b\x36\x99\x2a\x6d\xfb\x7d\xf7\xbb\x64\xb9\x15\x1c\x97\x4a\x56\x87\xa2\xf1\xdd\x11\xda\x01\xef\xd2\xad\x26\xe4\x3b\x84\xcf\xd8\x52\x69\xf8\x32\x00\x55\x5b\xf3\x41\xab\xa6\x76\xb9\xaa\xa9\xac\xd0\x15\x54\x9f\xcc\xc6\xfe\xf0\x4e\xc9\x84\x5a\xfc\xb2\x2a\xfe\x10\xa6\x13\xc6\xbc\x42\xb2\xb2\xb7\x93\xc8\xbd\xb3\xb6\xa3\xda\x17\x85\xe3\xd2\x25\x5b\xef\xf4\x81\xbd\x9d\xa0\x23\xa5\xdd\x77\xaf\x6b\xb7\x3b\xce\x06\xba\xdd\xe9\xb8\x85\x9b\x5c\x8f\x87\xf0\x8e\x44\x6e\x5f\x89\x03\x50\x77\x6e\x01\xb5\xce\x92\xb7\x5d\xc5\x9e\x6b\xad\x74\xfa\xde\x49\xfc\xeb\xc1\x2b\x66\x37\x0f\x35\xc2\x70\x59\xed\xe7\x5a\xff\x84\xa2\xee\x14\x3a\xb3\x43\xf8\xc1\x7d\xb4\xe1\x25\xa1\x4c\x76\xfe\x95\xdb\xc4\xc9\x7c\x67\x7f\xba\x65\xbf\x2c\x9b\xbf\x10\x9d\x1f\xde\x2d\xf7\x53\xe5\xfa\x0a\x7f\x47\x96\x4f\xbc\x53\xf6\x13\xe6\x1e\xa2\xdc\x57\x3f\xdf\x20\xe1\x6d\x81\xf7\x3a\xd7\xfd\x57\x18\xef\x75\xae\xfb\x17\xe7\xba\xed\xf9\x6d\x82\x76\xdc\xd8\xba\xe9\x45\xa2\xeb\x5b\xdd\xb8\xe6\x6c\x86\x97\x9b\x23\xd3\x83\xe7\xbb\xd7\x01\x6f\x63\x9a\x78\x9d\xef\xb6\xe7\xbb\x3e\x5f\xb5\xe4\xaf\x00\x00\x00\xff\xff\x88\xa0\xc7\x7a\x4d\x17\x00\x00") func templatesServerMainGotmplBytes() ([]byte, error) { return bindataRead( @@ -515,12 +682,12 @@ func templatesServerMainGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/server/main.gotmpl", size: 5969, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xde, 0x50, 0x3a, 0x42, 0xa1, 0xc1, 0x64, 0xa8, 0x5b, 0xcc, 0x8d, 0xa, 0x1d, 0x38, 0x6b, 0xa7, 0x97, 0x56, 0xae, 0xff, 0xba, 0xbd, 0x52, 0x2c, 0x8a, 0x6d, 0x57, 0xc4, 0x38, 0xcb, 0xfd, 0x7b}} + info := bindataFileInfo{name: "templates/server/main.gotmpl", size: 5965, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x18, 0x3a, 0x5f, 0x4, 0xcb, 0x2, 0x79, 0xa2, 0x38, 0x87, 0x61, 0x77, 0x5c, 0xac, 0x21, 0x9c, 0xa5, 0x9d, 0x1c, 0xa0, 0xc9, 0x41, 0xba, 0x52, 0xc2, 0x20, 0x9f, 0x9b, 0x64, 0x2c, 0xab, 0x8f}} return a, nil } -var _templatesServerOperationGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x57\x4d\x6f\xdb\x46\x13\xbe\xf3\x57\xcc\x2b\xe4\x0d\x48\x41\x26\xef\x0e\x7c\x48\xed\x14\xf1\xa1\x89\xe0\x08\xed\xb1\x58\x2f\x87\xe4\xc2\xe4\x2e\x3d\xbb\xb4\xac\x08\xfc\xef\xc5\x7e\x50\x26\x15\x4a\x2a\x5a\xb4\xe8\xc9\x96\x76\x3e\x9f\x79\xe6\x43\x59\x06\xb7\x2a\x47\x28\x51\x22\x31\x83\x39\x3c\xee\xa0\x54\x57\x7a\xcb\xca\x12\xe9\x03\xdc\x7d\x85\x2f\x5f\x37\xf0\xe9\xee\x7e\x93\x46\x51\xb4\xdf\x83\x28\x20\xbd\x55\xed\x8e\x44\x59\x19\xb8\xea\xfb\x2c\x83\xfd\x1e\xb8\x6a\x1a\x94\xe6\xe8\x6d\xbf\x07\x94\x39\xf4\x7d\x14\x45\x2d\xe3\x4f\xac\x44\x2b\x9c\xae\xc3\xff\xf6\x21\xcb\x60\x53\x09\x0d\x85\xa8\x11\xb6\x4c\x4f\x83\x31\x15\x42\x88\x06\x8c\x52\x75\x6a\xe5\x3f\xe5\xc2\x08\x59\x82\x39\xe8\x35\xce\x63\x4b\xea\x05\xa1\xe8\x8c\x33\x55\xa1\x84\x9d\xea\x80\xf0\x8a\x3a\xe9\x2c\x0d\xa6\x5d\xb8\x4c\xe6\x51\x24\x9a\x56\x91\x81\x38\x02\x58\x70\x25\x0d\xbe\x9a\x85\xfd\x5f\xa2\xc9\x2a\x63\x5a\xf7\x41\x1b\x12\xb2\xd4\xee\xff\xa2\x31\x8b\x28\x02\x40\x22\x45\x1a\x16\xa5\x30\x55\xf7\x98\x72\xd5\x64\xa5\xba\x52\x2d\x4a\xd6\x8a\xcc\xbf\x5a\x85\x46\xe4\x79\x8d\x5b\x46\x78\x4a\x96\x3a\x69\x44\x83\xd9\x9b\xa4\xd5\xd3\xc8\x3b\x12\x66\x77\x49\x6b\x90\x73\x3a\x86\x8a\xc6\x9c\xd2\xf0\xaf\x56\xee\x85\xd5\x22\xb7\x30\x9c\x90\x1c\xde\x9d\xcd\x2d\x2b\x4f\x5a\xdc\xb2\xd2\x81\xb1\xdf\x03\x31\x59\x22\xa4\x77\x58\xb0\xae\x36\xf7\x0e\x56\x0d\x8e\x02\x2d\x09\x69\x0a\x58\xfc\xff\x79\x01\xa9\xad\xb9\x53\x08\xc4\x18\x29\xbf\x7b\xc2\xdd\x0a\xde\xbd\xb0\xba\x43\xb8\xbe\x81\x74\x62\xc5\xbe\x42\xdf\xc3\x91\xc1\x20\x7e\x64\x35\x71\xbc\xb2\xa2\x4c\x73\x56\x8b\xef\x08\xe9\x17\xd6\x58\xb9\xcf\x4c\xe6\x35\xd2\xcf\x9d\xe4\x60\x3a\x92\x1a\x18\x14\x9d\xe4\x46\x28\x09\x5b\x61\x2a\xc7\x14\x4f\x61\x2d\x4a\xc9\x4c\x47\x08\x42\x1a\x05\xcc\x5a\xac\xba\x86\xc9\xb1\x41\xa8\xbc\xc5\xc8\xec\x5a\xbc\xec\xd3\xfa\x8a\x67\xa5\xd6\x8c\x58\xa3\x43\x8f\x7d\xec\x4c\xa5\x48\x7c\x47\x9b\xcf\x0a\xfc\xb7\x52\x19\x88\x01\x9f\x21\x5d\x93\x90\x5c\xb4\xac\x86\x85\x90\x06\xa9\x60\x1c\xf7\xfd\x02\x12\xe8\xfb\xe5\x01\x07\xd7\x6b\x07\xc9\x51\x3f\x26\x23\x5e\xa6\x0f\xa8\x5b\x25\x73\x24\x07\x9a\x8f\x15\xf0\x15\x79\x17\xba\x0c\x81\xf0\xb9\x43\x6d\x80\xc9\x1c\x08\x2d\x6c\xf6\x85\x01\x39\x55\x8d\x91\xcd\x0a\xe2\x42\x5e\xcc\x3f\x09\x0e\xe2\xd6\x65\x3b\x2f\x7f\x0e\x89\xf6\x90\xcf\xbf\x82\x09\xec\x23\x08\x29\x43\x21\x43\xd4\x17\x22\x7b\x33\x19\xf5\x17\x89\x08\x87\x58\xa1\x50\x04\xa6\x62\x06\x38\x93\x81\x55\xbe\x57\xe7\x79\xe7\x63\xb9\x4c\xbb\x91\x07\x9b\x4c\xc0\xff\x3f\x4a\x41\x0f\xd8\x17\xdc\xce\xc6\x07\x9c\x90\x19\xb4\x3d\x2b\x71\x0b\x76\x42\xa7\x43\x96\x1e\x3d\x9c\xc7\x4a\xb5\x76\xf0\x0b\x25\x3d\x53\x4f\xd9\x8f\xb9\x79\x85\xe5\x28\xb0\x5b\xbf\x13\x56\x43\x93\x9f\x05\x3a\x81\xe5\x7c\xd4\x23\x0e\xbd\x9f\x95\xd8\x07\x3f\xd7\xc0\xcd\xeb\x2a\x94\x88\xae\x07\xaf\xbd\x83\xe5\x84\xf1\xb0\x1e\xaf\x49\x75\xc6\xaf\xd7\x5f\xd0\x54\x2a\x0f\xc3\x32\x5d\x33\x53\x79\xe0\xc3\x8c\xde\xb0\x52\x0f\x8f\xe3\x8a\xb8\x3d\xce\x1a\x9c\x98\x3f\x2c\xfd\x6f\x5d\xd3\x30\xda\x85\x92\x4e\x3e\xd9\xe7\x3b\xd4\x9c\x44\xeb\xa6\x68\xd0\x7a\xac\x15\x7f\x3a\x1c\x06\x53\x81\x31\x3f\xb0\xd6\x78\x6c\xc3\x3d\x5c\x32\x60\xf5\xfc\x86\x99\x81\x7c\x8e\x05\x1f\xd7\xf7\xa3\x93\x64\x99\x9d\xe9\x1d\xbb\x4c\x3b\x6e\x5c\xe9\x42\x71\xe6\x88\x71\xe8\xa7\xf3\xcc\xb0\xf5\xf3\x23\xd2\x82\xf7\x80\x1c\xc5\x0b\xd2\xe0\x6a\xbe\xb0\x09\x7c\x43\x7a\xc1\xcf\x9b\xcd\x3a\xa6\xc0\xf5\x87\x30\x6f\x7f\x23\x61\x90\x56\x40\xb0\x0c\xdf\xbb\xf9\x9c\x78\xa6\x59\x22\xac\x80\x6e\x2d\x95\x7e\xb7\x9b\x74\xc6\xe9\x90\x40\xfa\x60\xa5\xef\x65\xa1\x62\x4a\x22\xb0\x75\xb0\x8a\xf0\xbf\x1b\x90\xa2\x76\xf6\x00\x08\x6e\xdc\xb7\x11\x40\xef\xee\x07\x02\x3f\x29\xe0\xe6\x64\x2b\x79\x81\x38\x09\xf7\xc1\x0f\x03\xa5\x73\xe3\x72\x05\xcc\x85\x89\x44\x97\x02\x3d\x68\xc7\x36\x71\x1b\x75\x88\xd7\xea\x4e\xc2\x3d\x9b\xae\x9f\x34\x31\x6d\x57\x30\xd8\x49\xd7\xa4\xf2\x8e\xa3\x5e\x0d\xd8\x21\x39\x30\x86\xae\x0d\x79\x8b\xc2\x45\xfb\x23\x36\x6c\x8a\xcd\xec\x8a\x3a\x33\x32\xcf\x4f\x4c\xef\xd8\xc3\x35\x75\xfd\xe6\xe7\x26\x78\x3a\x37\x97\x07\xc8\xdf\x3a\xc7\x7f\x4e\xe3\xe5\xb1\xcb\x04\xb2\xcc\x5f\xd7\x42\x03\x21\xab\xeb\x9d\x3f\x7e\x26\x52\x2b\xb8\xb7\x27\x77\x23\x34\x8e\xef\xb9\x3e\x3a\x3a\xf0\x42\x89\x2e\x94\xf7\x27\x21\xf3\x5f\xed\xb2\x0b\x5c\x3e\x54\x79\x05\xef\x3d\x97\x92\x0f\x93\x52\xdb\x18\x1f\x85\xcc\x87\x3d\xf8\xcf\x55\xfe\x04\x83\xdd\x50\xd7\xa7\xf2\x0a\x9d\x1f\xfe\xc6\x3e\x85\xd1\x91\xe0\x30\x66\xdc\x74\x0e\xdd\xb0\xed\x47\xb7\x96\x73\x6a\x0b\xf5\x97\x1c\xfd\x29\xeb\x93\x1b\xfc\x6f\xe2\x46\xa8\x93\x28\xf2\x83\x3f\xec\x99\x4f\xaf\x86\xd8\x37\x5e\x61\xc3\xec\xbe\x09\x87\xd0\x78\x42\x1b\x6c\xda\xda\xfd\x10\xc9\x15\xf7\xbf\xb2\xc2\x4f\x84\x2c\x3b\xec\xb5\x46\xe5\x58\x8f\x35\xa3\x89\xa6\x76\x0e\x82\xda\x5b\x4e\x7f\x04\x00\x00\xff\xff\x20\xd3\x86\x3f\xdb\x0e\x00\x00") +var _templatesServerOperationGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x57\x4d\x6f\xdb\x46\x13\xbe\xf3\x57\xcc\x2b\xbc\x08\x28\x43\x26\xef\x0e\x7c\x48\xed\x14\xf1\xa1\x89\x60\x1b\xed\xb1\x58\x93\x43\x72\x11\x72\x97\x99\x1d\x5a\x56\x08\xfe\xf7\x62\x3f\x48\x53\x2e\x25\x05\x2d\x7a\x28\x7a\x92\xc8\x9d\x9d\x8f\xe7\x99\x2f\xa6\x29\xdc\xe8\x1c\xa1\x44\x85\x24\x18\x73\x78\xda\x43\xa9\x2f\xcd\x4e\x94\x25\xd2\x7b\xb8\xfd\x02\x9f\xbf\x3c\xc2\xc7\xdb\xbb\xc7\x24\x8a\xa2\xbe\x07\x59\x40\x72\xa3\xdb\x3d\xc9\xb2\x62\xb8\x1c\x86\x34\x85\xbe\x87\x4c\x37\x0d\x2a\x7e\x73\xd6\xf7\x80\x2a\x87\x61\x88\xa2\xa8\x15\xd9\x57\x51\xa2\x15\x4e\xb6\xe1\xbf\x3d\x48\x53\x78\xac\xa4\x81\x42\xd6\x08\x3b\x61\x0e\x9d\xe1\x0a\x21\x78\x03\xac\x75\x9d\x58\xf9\x8f\xb9\x64\xa9\x4a\xe0\xe9\x5e\xe3\x2c\xb6\xa4\x9f\x11\x8a\x8e\x9d\xaa\x0a\x15\xec\x75\x07\x84\x97\xd4\x29\xa7\x69\x54\xed\xdc\x15\x2a\x8f\x22\xd9\xb4\x9a\x18\xe2\x08\x60\xa5\x90\xd3\x8a\xb9\x5d\x45\xf6\xa9\x94\x5c\x75\x4f\x49\xa6\x9b\xb4\xd4\x97\xba\x45\x25\x5a\x99\x22\x91\x26\xb3\x3a\x2e\x40\x9d\x62\xd9\x60\xda\xc8\x3c\xaf\x71\x27\x08\x7f\x40\xd8\x60\xd6\x91\xe4\xfd\x09\x51\xc3\x54\x34\x7c\x4a\x60\x27\xca\x13\xc7\xcf\xa2\x96\xb9\x60\x74\xc1\x59\x1e\x5d\xe0\x06\x92\x5b\x2c\x44\x57\xf3\x5d\x78\x1e\x86\x37\xe7\xb3\x83\xb5\x63\xab\xef\xa1\x15\x26\x13\xb5\xfc\x8e\x90\x7c\x16\x8d\xe5\xf1\x93\x50\x79\x8d\xf4\x73\xa7\x32\xe0\x8e\x94\x01\x01\x45\xa7\x32\x96\x5a\xc1\x4e\x72\xe5\xf0\xf7\x89\x61\x64\xa9\x04\x77\x84\x20\x15\x6b\x10\x56\x63\xd5\x35\x42\xcd\x15\x42\xe5\x35\x46\xbc\x6f\xf1\xbc\x4d\x6b\x2b\x5e\x94\xda\x0a\x12\x8d\x09\x99\xfb\xa1\xe3\x4a\x93\xfc\x8e\x36\x29\x37\xe0\xdf\x2a\xcd\x10\x03\x7e\x83\x64\x4b\x52\x65\xb2\x15\x35\xac\xa4\x62\xa4\x42\x64\xd8\x0f\x2b\x58\xc3\x30\x5c\x4c\xc9\xec\x32\x78\x92\x9c\x65\xf9\x3a\x28\xfc\x7f\xf2\xc0\x24\x33\xbe\x47\xd3\x6a\x95\x23\x59\xf4\x96\x63\x98\x44\xa0\xef\xb1\x36\x38\x0c\xf0\x9a\x39\xc9\xc1\xa9\xca\x43\xb9\xf8\xb8\x01\x5f\x30\xeb\x42\x1d\x20\x10\x7e\xeb\xd0\x30\x08\x95\x03\xa1\xa5\xc0\x9e\x08\x20\xa7\xc2\x60\x64\x11\x82\xb8\x50\x67\xb1\x5c\x07\x03\x71\xeb\x90\x5b\x96\x3f\x85\x6a\x3b\x61\xf3\xaf\xc3\x17\xfa\x08\x02\x7c\x50\xa8\x80\xc0\x99\x28\x5f\xdd\x8b\x86\xb3\x05\x02\x53\xdc\x50\x68\x02\xae\x04\x43\x26\x54\xc8\x76\x70\x55\xba\x5c\x0f\xde\x97\xf3\xe5\x30\xb3\x60\x83\x09\x5c\xfe\x07\x4a\xc3\x83\xff\x19\x77\x8b\xda\x20\x23\x14\x8c\xb6\x2f\x29\xdc\x81\xed\xf3\xc9\x88\x98\x67\x02\x97\x71\xd7\xad\x1d\x19\x52\x2b\x5f\x41\xc7\xf4\xc7\x19\xbf\xc0\xc5\xcc\xc1\x1b\xad\x18\x5f\x78\x33\x36\xb2\x93\xa4\xad\xe1\x62\xd9\xeb\x59\x3e\xbe\x5b\x94\xe8\x83\x9d\x2b\xc8\xf8\x65\x13\xe8\xa6\xab\xd1\xaa\x87\xe5\x88\xf2\x30\x58\xaf\x48\x77\xec\x07\xf3\x2f\xc8\x95\xce\x03\x25\xc9\x56\x70\xe5\x49\x24\xa1\x4a\x84\xe4\x51\x94\x23\x5f\xc9\x9c\x5d\xb7\x01\x88\x06\x0f\xd4\x4f\xeb\xc2\x43\xd7\x34\x82\xf6\x21\x3d\x0e\x9e\xec\xf1\x2d\x9a\x8c\x64\xeb\x26\x45\xb8\xf5\x54\xeb\xec\xeb\xb4\x52\x1c\x0a\xcc\x73\xcd\xa6\xc5\x5b\x1d\xee\xe0\x9c\x02\x7b\xcf\xfd\x5b\x82\x7c\x29\x0b\x3e\x6c\xef\x66\xcb\xcc\x45\x7a\xa2\x0e\xc1\x30\x75\x19\x3b\xea\x02\x39\x4b\x89\x31\xd5\xe6\xe9\xcc\xb0\xfc\xf9\xd6\x6d\xc1\xbb\xc7\x0c\xe5\x33\xd2\x68\x6a\x99\xd8\x35\x3c\x20\x3d\xe3\xa7\xc7\xc7\x6d\x4c\x21\xd7\xef\xc3\x1c\xf8\x8d\x24\x23\x6d\x80\xe0\x22\xbc\x77\x73\x63\xed\x33\xcd\x26\xc2\x06\xe8\xc6\xa6\xd2\xef\x70\x75\x0d\x0b\x46\xc7\x00\x92\x7b\x2b\x7d\xa7\x0a\x1d\xd3\x3a\x02\xcb\x83\xbd\x08\xff\xbb\x06\x25\x6b\xa7\x0f\x80\xe0\xda\xbd\x8d\x00\xec\x62\xf1\x2c\x08\x7c\xd7\x81\xeb\xa3\xa5\xe4\x05\xe2\xf5\xb8\xa9\xbc\x6d\x4e\x9d\x6b\xbd\x1b\x10\xce\x4d\x24\x3a\xe7\xe8\x74\x3b\xb6\x81\x5b\xaf\x83\xbf\xf6\xee\x81\xbb\x27\xc3\xf5\x1d\x27\xa6\xdd\x06\x46\x3d\xc9\x96\x74\xde\x65\x68\x36\x23\x76\x48\x0e\x8c\xb1\x6a\x43\xdc\xb2\x70\xde\xfe\x19\x1b\x71\x88\xcd\xe2\xe8\x3c\xd1\x7e\x4f\x77\x5f\x6f\xd8\xc3\x75\x68\xfa\xd5\xce\x75\xb0\x74\xaa\xc7\x8f\x90\xbf\x56\x8e\x7f\x4e\xe2\x8b\xb7\x26\xd7\x90\xa6\x7e\x2f\x97\x06\x08\x45\x5d\xef\xfd\x82\x77\x20\xb5\x81\x3b\xbb\xac\x37\xd2\xe0\x6b\x55\x59\x14\x3c\xe3\xd3\x8b\x40\xd1\x19\x7a\x7f\x92\x2a\xff\xd5\x0e\xce\x90\xcb\x13\xcb\x1b\x78\xe7\x73\x69\xfd\xfe\x80\x6a\xeb\xe3\x93\x54\xf9\x38\x53\xff\x39\xe6\x8f\x64\xb0\x6b\xea\xe6\x58\x5c\xa1\xf2\xc3\x6f\xec\x43\x98\x2d\x1c\x0e\x63\x91\x71\xe7\xd0\x0d\x9b\xc3\x6c\x07\x74\x46\xfd\xc4\xfc\x0b\x86\x7e\x48\xfb\x2b\x45\x7f\x1f\x37\x42\xb3\x8e\x22\xdf\xf8\xc3\x9c\xf9\xf8\xc2\x24\x1e\xb2\x0a\x1b\xe1\x3e\x3c\xfc\x52\x35\xef\xd0\x8c\x4d\x5b\xdb\x2f\xb9\x55\xae\x33\xc3\x24\x55\xb9\x72\x33\x29\x4a\x53\x2b\x3e\x8e\xb6\x46\xe7\x58\xcf\x2f\x3b\x97\x2f\x67\xf7\x8d\x33\x13\x2e\xdb\xa3\x10\xda\x1f\x01\x00\x00\xff\xff\x64\x70\xfa\x14\x1c\x0f\x00\x00") func templatesServerOperationGotmplBytes() ([]byte, error) { return bindataRead( @@ -535,12 +702,12 @@ func templatesServerOperationGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/server/operation.gotmpl", size: 3803, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x49, 0xa, 0xe2, 0x73, 0xf, 0x62, 0x1d, 0x67, 0xb9, 0xa2, 0xb2, 0x1d, 0x7b, 0x4f, 0xe2, 0x8b, 0xca, 0x9, 0x95, 0x33, 0x36, 0x76, 0xe5, 0xc3, 0x28, 0xdb, 0x36, 0x3b, 0xe1, 0x9c, 0xa1, 0xb5}} + info := bindataFileInfo{name: "templates/server/operation.gotmpl", size: 3868, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x93, 0x85, 0xb, 0x19, 0xe8, 0x7d, 0xb, 0xc0, 0x51, 0x86, 0x7d, 0x2d, 0x8b, 0x11, 0xfe, 0x39, 0x17, 0x4f, 0xa3, 0xba, 0xc1, 0x9, 0x51, 0xff, 0x12, 0xcf, 0x4c, 0xde, 0xf5, 0x7d, 0xfb, 0x67}} return a, nil } -var _templatesServerParameterGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xdb\x73\xdb\x36\xba\xf8\xf3\xea\xaf\xf8\xaa\x5f\x9b\x21\x3d\x32\xd5\xdf\x9e\xce\x3e\xb8\x75\x67\x52\xdb\x6d\x3c\x6d\x2e\x27\x49\xfb\x70\xb2\x99\x2d\x2c\x42\x12\xd6\x24\xc1\x00\x90\x1d\x1d\x0d\xff\xf7\x33\xb8\x91\x00\x08\x52\x52\xe2\xa6\xed\x74\xfb\xd0\xb1\x88\xdb\x77\x01\xbe\x3b\x90\xdd\x0e\x72\xbc\x24\x15\x86\xe9\x0d\xa9\xf2\x9a\x91\x92\x08\x72\x87\x6b\xc4\x50\x39\x85\xa6\xd9\xed\xe6\x27\x80\x2a\xc0\x65\x2d\xb6\x20\x30\x17\x7a\x00\x11\x84\x56\x20\xa8\xfe\x24\x70\x59\x17\x48\x60\x60\xb8\xa6\x90\xe3\x1a\x57\x39\xae\x16\x04\x73\x60\x98\xd3\x62\xa3\x7a\x9f\xc2\xe5\x73\x78\xf6\xfc\x35\x5c\x3c\x79\xfc\xec\x87\x2b\x78\xfd\xe4\xfa\x15\x9c\xcc\x9b\x66\xb2\xdb\x01\xae\x72\x68\x9a\xc9\xc4\x85\x88\xe6\xdb\x3b\x54\x90\x1c\x09\xca\x24\x30\x13\x80\xdd\xee\x14\xc8\x12\xb2\x27\x88\x3f\xa5\x39\x2e\xbe\xa3\xf9\xf6\x85\x04\x96\xeb\xf6\xf9\x1c\xcc\x10\x0c\x72\x3c\xd0\x9b\x7f\xe3\x85\x50\x68\xe4\xb8\xc0\x2b\xd9\x60\x7a\x18\x0c\x4a\x39\x8f\xe9\xa7\xc1\x01\xb9\x04\x66\x0c\xce\xce\xd5\x24\xd9\x2f\x66\xca\x84\xd1\x8d\xc0\xd9\xf7\x94\x95\x48\xf0\xf4\x6b\xd5\xe9\xb3\x73\xa8\x48\x01\xbb\x09\x00\x48\x74\xe1\x1c\x50\x2d\x29\x90\x30\xcc\x67\xb2\x4b\x3a\x01\x68\x26\x7a\xda\x02\x57\xf2\x7b\x0a\xe7\xe7\xf0\xa5\x19\xb4\xdb\x41\xf6\x12\x2f\x30\xb9\xc3\xec\x19\x2a\x31\x34\x4d\xb6\xdb\x41\x8d\xf8\x02\x15\xe4\x7f\x31\x64\xe6\x2b\x9c\xcb\xbe\x64\x09\xa8\xca\x21\xa9\xa8\x80\xec\xd5\x62\x8d\x4b\x94\x5d\xf3\xef\x10\xc7\xaf\xb7\x35\x4e\x21\xbb\xe6\xcf\x36\x45\x81\x6e\x0a\x39\xe6\x51\x4b\x5c\x89\x8a\x82\x44\x93\x11\x17\x1c\xdb\xb9\x24\x3d\x5f\x91\xb2\x2e\xb0\x43\x50\x8f\xc8\xd7\x02\x6b\x1a\x1b\x88\x15\x1b\x28\x6b\x01\x90\x13\x14\x64\x81\x7f\x69\x69\xcb\x3b\xe0\xe4\x58\xd9\xc3\x6d\xec\xb1\x0b\x31\x86\xb6\x40\x97\x2e\xdf\x78\xbb\x9a\xd9\x1f\xce\xe2\x63\x2b\x9b\x9e\x9f\x9a\xb4\x66\xc5\xf6\x38\x4c\xb9\x04\x4c\x1d\x26\x67\x23\x67\x2e\x22\x76\xdf\x3b\x88\x29\x86\x8c\x91\x4e\x81\x97\x38\xc4\xd7\xbd\xae\xf9\x75\x25\x30\x5b\xa2\x05\xee\xb5\xbc\x12\x0c\xa3\x32\x4d\xf5\xd2\x4b\xca\x14\x65\xae\xab\x1c\xbf\xff\x05\x31\x89\xff\xd9\x39\x30\x54\xad\xcc\xb1\xd9\xb5\xd8\x78\xb4\xb6\xd3\x39\x44\x50\x1d\x89\xe6\xda\x9b\x60\xd2\xb7\x72\x97\x77\x87\x63\x70\xc2\x97\xf8\xdd\x86\x30\x9c\x77\x7c\x1b\x38\x49\x94\x75\x9d\x13\xb9\xd8\xc5\x9a\x14\x79\xf6\x02\x89\x35\x34\xcd\x4c\x22\x55\x33\x52\x89\x25\x4c\xbf\x78\x37\xb5\xcd\x3f\xd1\x85\x3e\xed\x4d\x93\xa6\xed\x02\x37\x0c\xa3\x5b\x0f\x2e\x75\x22\x5a\x10\x16\xb4\x12\xa4\xda\x60\xbf\x4b\xb7\x0d\x9b\x49\xf4\xb3\x2f\x3a\x7a\x14\x39\x42\x96\x8c\x48\x13\x1f\xfe\xc6\xca\x17\x87\xc0\xee\x0e\x1e\x3c\x21\x7f\x18\x79\x34\x70\xca\x3b\x86\xcc\xe7\x50\x51\x57\x70\xcb\x2d\x4c\x94\x4c\x22\x15\x88\x35\xe1\xa0\xce\xda\xe4\xd3\x1f\x79\xff\x14\x1f\x2f\x59\x9f\xa2\x7a\x4c\x02\xec\x3b\xfb\x8f\xf3\x5c\x29\x63\x54\xbc\x60\xb4\xc6\x4c\x10\x1c\x17\x05\x03\x1d\x7d\xc9\xe0\x0a\xe4\x12\xd5\x11\x71\x6c\x65\xc7\x8f\x78\x7b\x8c\xe4\x88\xae\x1e\x9e\xfb\xee\xec\x58\x20\xbc\xd3\x2e\xa7\xf3\x0e\x7c\x4f\x02\x48\xee\xe8\x3d\x33\x9d\xb6\x9c\x3a\x40\x2c\xcc\xcc\x4e\x50\x9b\xe0\x9a\x3f\xae\x68\xb5\x2d\xe9\x86\x9b\x35\x0c\x0e\x3f\x50\xb9\x25\xa0\x69\x12\x6f\x17\xbc\xf1\xc8\xf1\x76\x70\xa6\xb4\x1d\x35\x74\xda\xc5\x86\x55\xb2\x65\x4c\xbe\x44\x37\xc9\x00\x6f\xdb\x8d\x9b\x18\x70\x9e\xa2\x5a\x7e\x7b\x7e\x87\x19\x23\x39\x4e\x63\xf2\xbb\xc3\x64\xaf\xf4\x3e\x88\xa9\x87\x0b\xf3\x41\x31\xfe\x61\x02\xfc\x63\x44\xf8\x1d\x2a\x60\x06\xf4\x16\xce\xce\x23\x84\xf9\x5a\xb6\xf4\xa8\xa2\x18\x72\x04\xd1\x9d\xa5\x3e\x8b\x11\xda\x63\x7a\x70\x38\x8e\x52\x23\x07\x28\x93\x18\x45\x9b\x87\x40\xb0\x19\xa3\xfd\x1f\xcb\x28\x3e\x48\xe7\x28\x55\x53\xa2\xfa\xf7\x55\x34\xbe\x9e\x89\xea\x18\xdf\x58\xee\x56\xbe\xe6\x8f\xa5\xa1\x9d\xba\xdc\x4b\x87\xb4\x4d\x4f\x27\x90\xaa\x90\xbe\x99\x81\xe9\xd3\x52\xa0\x3b\x00\xb1\x75\x2d\x88\xfe\xfa\xd7\x97\xd0\x34\x92\x2a\x1f\xe5\xba\x79\x7b\xc3\x62\x21\x75\xb0\x21\xe6\xc7\x90\xd1\x10\xa6\x9d\xaa\x69\x94\x23\xd4\x69\xb2\x12\xd5\x9d\x7f\xfc\x17\xa5\xf9\xc0\x81\x64\x56\xd5\xd0\xea\x77\xdd\x99\xed\xd9\xf4\x8f\x66\xa8\xb1\x3d\xb3\x2c\x8e\x11\xad\x60\x85\x2b\xcc\xc8\x02\x88\xed\xfa\x3b\xa0\x13\x91\x35\xfa\x87\x6b\xec\x3a\xa1\x9a\x98\x9f\xab\xe3\x3a\x26\x4a\xf0\x94\x54\x3a\x82\x90\x3d\x45\xef\xdb\x58\x82\x91\xf3\x0b\x54\x62\x0f\x8b\x57\xf2\xc7\xd9\xb9\x24\xc1\x3f\xbe\x4a\xa4\x76\x08\x91\x0a\xa4\xd8\x13\xc4\x2f\x09\x5f\x30\x52\x92\x4a\x2e\xde\x49\xb7\x96\xe0\xdd\x27\x63\xf1\x06\x54\x38\x69\xa9\xd0\xad\xa5\x0d\x45\x63\x73\xaf\x11\x7f\xc1\xf0\x92\xbc\x07\xa9\x7c\x37\xf8\xea\x7d\xcd\x30\xe7\x92\x6b\x53\x9a\x4d\x95\x05\xdd\x19\xa4\x61\x97\xa6\xb9\xe8\x8e\xb4\xec\xd6\xef\xd0\x99\x87\xa9\x13\x11\x33\xe2\xa1\x25\x60\xd3\x4c\xe6\x73\xed\xbd\xcb\xdf\x97\xb8\x56\x46\x53\x69\xda\xcf\x54\x93\xdb\x3b\x62\x54\xdb\xe6\x83\xad\xae\xd9\x20\x9b\x66\xe1\x7a\xfd\x63\xee\xd8\xb5\x4d\x04\x31\x67\x3f\x44\x11\x33\xed\x06\x31\xa7\x77\x0c\x31\xd3\xfc\x40\x88\xb5\xf3\x1d\x8f\xd6\xcf\x15\x79\xb7\xc1\xa3\x98\x6d\xba\x2e\x67\x20\xd8\x06\xc7\x30\x72\xe6\x39\x0e\xa9\xdf\xfb\xb8\xc0\x9e\xf3\x02\x0f\x79\x60\x8e\x64\xce\x55\xb5\x29\x87\xb8\x22\xdb\xf4\x5e\xb3\xbd\x22\x5c\x91\x4d\x89\x91\x8c\x87\xb1\x64\xb2\xdf\x14\x7b\x40\xae\x9c\x7a\xc1\x72\xcd\x96\x53\xdf\x22\x3c\x90\x49\xde\xb0\x31\x56\x59\x0d\x77\xb1\xe1\x82\x96\x5a\xe7\x0b\x2c\xdd\xa5\xec\x95\x60\xa4\x5a\x25\xa9\x07\x9c\xa3\x27\x4f\x3d\x45\xd9\x9b\xfe\x54\x72\xda\xc1\xe4\xf8\x45\x3c\x8a\x98\x5f\x96\x23\x2d\xc7\xfe\xdf\xdd\xd4\xf0\xdc\x8e\x1d\xdd\x56\xd2\x46\xf1\x36\x56\xa7\x16\x4f\x5b\xbd\xb8\x90\xf0\x0e\xe5\x30\x2e\x68\x75\x87\x99\x06\xdf\xe3\x0c\x86\xec\xd5\x3d\x5a\xad\x30\xd3\x18\xc2\x74\xda\x9a\x0b\xbd\xfd\xaa\xbb\x9c\xf5\x36\x9f\x3f\x43\x3f\xe2\xac\x34\xef\x1d\x62\x95\x14\x79\x11\x96\xce\x5c\xc3\xcf\x05\x35\x19\x1f\xf7\x4b\xda\x99\x8d\x81\xad\x67\x69\x27\x1d\xff\xeb\x4a\x91\x45\xda\x23\x47\xc8\xb5\xa9\xec\xda\x86\x61\xa6\xb3\x3d\x38\xa4\x43\xe9\x8e\xfe\x0e\x32\xb6\xd2\x2d\xa9\x5f\x20\xc6\x71\x6a\x73\x5f\x35\x62\x9c\x54\x2b\x20\x1c\xf8\x2d\xa9\x6b\x9c\x2b\x37\x90\x2b\x77\x4b\x1b\xf0\x3a\x0c\x69\x32\x47\x1f\xc9\xa2\x3b\x89\x43\x4b\xfa\xa5\xb6\x9c\x33\x05\x52\xb2\x6f\xf8\xec\x8f\xc4\x18\x85\x88\x6b\xc9\x8f\x81\x26\x71\x3d\x49\xd4\x90\x2c\x39\xd9\xed\xcc\x4c\x26\xda\x13\xe3\x1e\x95\xe4\x7f\xff\x5c\x27\xed\xfa\xee\x96\xc9\xf7\xe5\x64\x81\x04\xce\x41\x50\xa8\x30\x97\x7f\x29\x86\xd5\xda\x43\x36\x1c\xdb\x0f\xda\x1e\xba\xf6\xdc\xa4\x7e\x9f\x2e\x5c\x63\x58\x9a\x42\xc4\x1b\x22\x4b\xb8\xc3\x26\xea\x24\x5b\xb3\xe4\xc4\x30\xa5\xc3\x2e\xf5\x62\x4f\x86\x75\x77\xb8\x5d\x40\x5a\x30\x2e\xdf\x52\x27\xd0\x15\x48\xaf\xbe\xa7\xf2\x10\xa4\x08\x45\x4c\x97\x0c\xab\x75\x8c\x70\x1b\xcd\x87\xf9\x8e\x45\x27\x41\x4b\x54\x87\xfd\x5d\x21\xda\x99\x1d\xc3\x81\x72\xab\x34\x9c\x90\xb8\xfd\xe4\x06\xbf\x3d\x17\x5d\x4d\x21\x0f\xba\x0d\xf5\x74\x84\xd2\xfd\x4a\x54\x4b\xe5\xe9\xbb\x6f\xfc\x0c\x16\xb4\xde\x4a\x79\x81\x8a\x02\x70\x81\x4b\x5c\xa9\xa8\xf9\xa0\xe0\x1d\xd2\xa8\x2f\x25\xb5\x4b\x74\xab\x99\xd9\x9e\xac\x99\x71\x86\x86\x35\xb1\x3a\x32\xbd\x20\xbd\x36\xd3\x87\x06\xfd\xd2\xc5\xf0\x07\xbb\x35\xcd\x45\x1b\x99\xf3\x95\xb1\x8d\x5b\x38\x29\x57\xdd\x34\x08\x63\xb8\x93\x06\xe1\x0a\xfc\xe7\x96\xd1\xc3\x09\x5f\xdd\x79\x5f\x06\x56\x5b\x44\xcd\x68\x88\x3d\x36\xc7\x0d\xa9\x72\xdc\x9b\xc0\x8b\xc5\x59\xaa\x98\xb4\xce\x6f\x48\x13\x07\xc2\xc8\x29\x19\x00\x31\x9a\x45\xb0\x30\x47\xd2\xba\x07\x81\xd4\x4b\x14\xf8\x0c\x8b\x64\x04\x7c\x9d\xf3\x71\x29\x5d\x77\xd1\x7d\x19\x80\xc3\x12\x00\xe1\x06\x08\xcd\xb8\x08\x6d\xdd\xc4\xe5\x01\xa7\xfb\xcd\x6e\x67\x0e\xa7\xca\xb3\x1c\x34\xa8\x8b\xa6\xf8\x27\xcf\xdd\x72\x4d\x73\xfd\x72\xb7\xb3\x91\xa8\x61\xb1\x3a\x24\x8b\x3d\x03\xf5\x9a\xbf\xb0\x05\x41\x0e\x72\x1d\x59\x3a\xc1\xd7\xf6\x6b\xab\x1b\x7a\x01\xa4\x7d\xa6\x57\xe7\xd2\xec\xb5\x86\x6f\xb6\x02\x4f\x07\x3c\x33\xdd\xe7\xf9\x32\xd9\xed\xd4\x1e\x32\xc6\x49\xbb\x61\x94\x71\x22\x3f\x78\x73\x5a\x5b\xb2\x2f\xf4\x5a\xbf\x62\x66\xad\xb1\x3d\xce\x66\x34\x8f\xe0\x43\x9e\xdc\x20\x8e\xff\xf1\x15\x70\x35\x75\x2a\x6d\x4b\x54\x30\x8c\xf2\x6d\x8b\x47\x0e\xf7\x6b\x5c\x29\xeb\x13\xe7\x03\xd1\xff\x80\xba\x8e\x24\x56\xe6\x8f\x92\x5a\x9e\x3e\x33\x06\xcf\x11\x35\x2a\x9e\x64\xf3\x64\xda\xa8\x0e\x3a\x4e\x96\xed\x95\x64\xc7\x47\x21\xad\x9c\x6e\x9a\xc9\x1d\x62\x07\x2a\x5c\x4f\xd1\x4e\x8c\x0a\xf5\x4e\x5c\x60\x62\x58\x91\xde\x3a\x47\x23\xfe\x69\x50\x07\xd2\x85\x36\xfe\xe5\xe7\xa9\x0f\x10\xb6\xae\xae\xde\xdb\x5d\x2b\xed\x21\x95\xad\x36\x0a\xc3\x8b\x0d\xe3\xf2\x90\x3b\xc5\x7a\x74\xa9\x0b\xb2\x54\x7d\x85\x6f\x30\xfb\x35\x26\x7a\xca\xd6\x71\xb2\xfb\xc3\xf8\x41\x66\x41\xd7\x1b\xba\xa0\x45\x81\x17\x72\x11\xc7\x2f\x6a\x49\xe9\xb7\x0d\x8b\xd8\x03\xd5\x69\x87\xb4\x0b\xe1\x41\x74\xee\x58\xc4\xef\xd1\x2a\x7b\x55\x17\x44\x7c\xb7\xd5\x70\x25\x07\xcd\x30\xa4\xbc\x22\x58\xa6\x6e\x8a\xe7\x28\x83\xe7\x68\x73\xc7\xa3\xa5\x49\xbe\xf6\xd1\x19\xb6\x2f\xe1\x5b\x37\x47\x7b\x8c\x95\x74\xc8\x21\x6c\xb3\x41\x07\x75\x3f\xec\xc8\x1c\xa2\x38\xc1\xd1\x9c\xb1\xb0\x41\xd0\x57\x4b\x58\x1d\x04\x90\xae\x00\xa9\x4c\x18\x20\xa9\x29\xe7\x44\xda\x50\xf7\x44\xac\x5d\x7f\x33\x75\xc5\xef\xc3\x5a\x83\xfe\x1e\x38\xc0\x18\xfc\x33\x71\xc2\x51\xa6\x8a\xea\x15\xad\x4e\x75\xad\xe8\xa3\x47\xea\x87\xa4\xbf\x90\x52\xbb\x65\x42\x28\xa8\xe2\x46\xee\x01\x45\x31\x7f\x05\xeb\x37\x52\x77\x77\xb8\xe5\xfb\xa7\xdb\x48\x1a\x51\x37\x60\x3b\x9f\xc3\x05\xcd\xb1\xce\xbb\x2a\xd3\xeb\x66\x0b\x2b\x7a\xca\xb5\x81\xf8\xb5\xad\x5a\xbf\xba\xbc\x7e\x9d\x4d\x26\x36\x87\x70\x41\xeb\x2d\x23\xab\xb5\x80\xd3\xa6\xd1\xda\x6e\x41\x4b\xe9\xef\x07\x6d\x4e\x68\x78\x52\xa3\xc5\x2d\x32\x5e\xf6\x0b\xf3\xb7\x6c\x98\xcf\xe1\xf5\x9a\x70\x58\x12\x29\x38\x10\xf7\x81\x11\x6b\x0c\x06\x1a\x10\x94\x16\x99\xec\x7f\x95\x13\x41\xaa\x95\x2e\x48\x51\xe3\x4a\xb5\x62\xcd\xe8\x1d\x86\xe5\x46\xa8\xa9\xa4\x11\xb9\xa5\x1b\x60\xf8\x94\x6d\x2a\x6f\x26\xbb\x84\x02\x1b\x55\xf9\x64\x42\xca\x9a\x32\x01\xc9\x04\x60\x5a\x61\x31\x5f\x0b\x51\x4f\x27\xf2\xd7\x8a\x88\xf5\xe6\x26\x5b\xd0\x72\xbe\xa2\xa7\xb4\xc6\x15\xaa\xc9\x5c\xef\xdf\xe9\x70\x07\x6b\xcd\x8e\x74\x61\x9b\x4a\x90\xf2\x80\x1e\x73\x2e\xcd\x14\x22\xb6\x07\x74\x2d\x49\x9e\x17\xf8\x1e\xb1\xb1\x79\x25\x1d\x14\x76\x5c\xb0\x65\x29\x06\xbb\xa9\xd6\xa9\xae\xed\x34\x86\x57\x76\x89\x97\x68\x53\x88\x6b\x45\x30\x53\x25\xe8\x9d\x53\x1b\xe7\x71\x63\x3e\x7a\xec\xe7\xb7\x78\x3b\x83\xcf\x55\xb0\x53\x4a\xf9\xcc\x9b\x44\xb6\x42\xd3\x84\xe7\xde\x74\x0f\x66\x4d\xd5\xc6\x79\x86\xef\xa3\xa5\x00\xa6\x0e\x68\xc1\x30\x12\x98\x03\x82\x0a\xdf\xc3\x58\x4f\x5d\xe3\x69\xf7\xb7\xfe\xa8\x6c\x0f\x5a\x62\x83\x30\x57\xb9\x91\xf9\x5c\x2b\x37\xb9\x9b\x72\xdd\xa0\xe3\xbd\xd2\x58\x24\x82\xa8\xd9\xf3\xcc\x1a\x50\x66\x48\x45\xc3\xce\xda\x6e\xcf\xa5\xdc\xe6\x35\x5e\x64\xae\x5d\xbf\xdc\x54\x8b\x3d\xa8\x25\xe9\x28\x3a\xbb\x3d\x98\x98\x78\x3b\x53\xfb\x7d\x3e\x77\x40\xd7\x0a\x1b\x0b\xcc\xb8\x46\xd4\x87\xdb\xdb\x09\x7e\xb5\x15\x58\x9b\xf3\x09\xe2\x66\x21\x27\xbb\xd5\xb5\x1b\xcd\xf3\x3d\x29\xb0\x9a\x20\xb0\x49\xaf\x2f\x9b\xc6\x0e\x3f\xf7\x2a\xf4\x42\x5f\xba\x73\xd0\x87\x1c\xeb\x44\x7b\x99\x17\xb4\x12\x88\x48\xa7\xe5\x7f\x30\xa3\x30\x4d\xfe\x39\x75\x52\xb0\xea\x9b\xb5\x6a\xf4\x71\x30\x1a\xd5\xd2\x84\xd9\x62\x1b\x0e\x3f\x57\x25\x62\x7c\x8d\x8a\xd7\xf8\xbd\x90\x8e\x31\xce\x56\x19\x5c\x22\x81\x67\xea\xff\xf2\x08\xce\xe0\x72\xc3\xb4\x8e\x6a\x95\xb1\x8f\x43\x10\xd1\x1f\x47\x64\x0c\x07\x05\x77\x9b\x31\x48\xfa\x39\x3d\x4b\x49\x65\x65\x8f\x20\x28\xd0\x2d\xe6\xc6\x29\x3f\x1a\x6a\x6b\x4c\x04\xa0\xa7\x5a\x03\x1c\x03\x1e\xc3\xab\x4d\x81\x18\xac\x28\xb4\xf7\xb1\xfa\xc0\xee\x81\xaf\x55\x88\x26\x79\x3a\x3f\x81\x4b\xaa\xb6\x9d\xb3\xcd\x97\x8c\x96\xd0\xda\xab\xb9\x3d\x18\xa4\xb2\xd9\x12\xe3\x01\x9e\xcc\x83\x4d\x1c\xdb\x8b\x56\xf1\x3a\x8c\x1c\xf7\x86\xdd\x3d\xd7\x02\xa5\xb7\x0c\x17\x52\x31\xad\xb6\xfa\xf4\x05\xfb\x2d\x86\x7a\x0f\x7d\xdf\x2a\x38\x3d\x72\xc5\x7f\x73\x5a\x65\xed\xb2\x87\x2d\x39\x40\x84\xc4\x71\x92\xf7\xee\x0e\x39\xdf\x8a\x2a\x5f\xef\xda\xe1\xb5\xb3\x45\x0e\xdf\x21\x67\xd6\x3d\xd1\x71\xa0\x3d\x7b\x27\xb0\x20\x5d\xf5\x13\x6c\x52\x7d\x23\xb0\x28\x80\x8a\x35\x66\xb0\x40\x1c\x73\x48\x94\x08\xe0\xaa\xd2\x2c\x85\x37\x7c\x4d\x37\x45\xae\xb6\x1b\x5d\x2c\x36\xec\xed\xe8\x92\x7e\x99\xf3\xd1\xb0\x48\x08\x6c\x95\xdb\xe0\xb1\x08\xd7\x88\x06\x7c\xe3\xe1\xb5\x54\x99\x7c\xa1\xb8\x8f\xca\x79\x73\xd2\x16\x88\xb1\x2d\xd0\xca\xdf\xb9\x83\x5b\xce\x3b\x5e\x4e\x35\xcd\x47\x4a\x77\x2b\xdc\x63\x5a\x25\xf3\xcf\xd4\x9b\xb7\x37\x5b\xd1\x4f\x30\x3b\x92\x29\xed\xc0\x8b\x89\x98\x9e\x82\xa3\x0c\x92\xa3\xe5\x42\x1a\x39\xb7\xce\xcc\x5d\xb4\x37\x38\x9f\x06\xfc\x5f\x77\xbb\x16\x7c\x3e\x85\x44\xf6\x6a\x91\x48\x9b\xe6\xd7\x74\x06\x8f\x7c\x82\x40\x4b\x91\xb1\xca\xf9\xf9\x1c\x6a\x54\x91\x05\x97\x20\x48\x4b\x85\x2c\x89\x71\xc0\x88\x14\x97\xca\xcc\xf5\x46\x94\x7c\xa5\xf2\xf7\xa5\xc8\x5e\x69\x98\x92\xa9\xe9\xe7\x1b\x13\x2a\x53\xd7\x9a\x1b\xd0\x83\xee\x0c\xbe\xb8\x9b\xce\x7a\x85\xfa\x0a\x9c\xa4\xe4\x2b\xf7\x73\xc0\x05\xb7\x0a\xa6\x9f\x80\xb4\xad\x5e\x54\xb5\xeb\x61\x3c\xd4\x11\xfb\x6a\x17\x33\x82\xfa\xa7\xa2\xf3\x14\xbd\x0a\x61\x89\xd9\x6f\x5f\xa4\xf6\xc8\x2d\x52\x8b\xb2\x7d\xe6\x1a\xd4\xed\x1f\x20\x3d\x44\x53\x1d\x36\x6c\x58\xdb\x33\x27\x85\xa1\x34\x85\x6f\xe8\xa6\xca\x6d\xac\x54\xdf\x15\x50\x9e\xde\x7a\x53\xa2\xca\x2b\xd2\xa5\x35\xd6\xc6\x91\x5c\x43\x6c\x6b\xb2\x40\x45\xa1\xfc\x3c\x8e\x01\x31\x0c\xf4\x46\x4e\x8d\x73\xad\xa2\x11\x48\x4f\x4c\xc5\x09\x30\x17\x93\xf9\x5c\x0e\x33\x6e\xdc\x99\x63\xab\x4a\x1d\x67\x96\x98\x28\x75\x30\x06\x3e\x17\x6c\xb3\x10\xb0\x33\xf9\xec\x27\xaf\x5f\xbf\x00\xb3\x02\xe8\xba\x8a\x09\xa8\xaf\xf6\xe3\x89\x0b\x04\xfc\x2a\x4f\xd7\xd9\xf4\x74\xfa\xeb\x24\x6e\x0f\xcf\x4f\xcc\x66\xb8\xc4\x92\x89\xb5\x68\x1d\xf7\x9b\x82\x2e\x6e\x5b\x5f\xb9\xd7\xec\x56\x15\x06\xc1\x13\xfb\x4b\x97\x4b\x86\x7d\x9f\xa2\xf7\xa4\xd4\x25\x7b\x00\xe6\x87\xdd\x65\xd9\xd5\xfb\x45\xb1\xe1\xe4\x0e\x77\xbd\xbe\xf1\x38\xef\x0c\xef\x4d\x4c\x2a\x67\x62\xfd\x23\x32\x71\xdb\xeb\xdb\x60\xe2\xb6\xa1\x37\xf1\xa6\x10\xa4\x2e\xf0\xf3\xa5\x99\xdb\xfc\x86\xe7\x4b\x53\xee\xea\x76\x88\xe0\xfb\x13\xae\x56\x2a\x52\xa4\x31\x06\xfd\xbb\x2d\x95\x6d\x9b\x23\x18\x79\x43\x49\xe5\x0f\x75\x9a\xc3\xa1\x2f\x94\xac\xae\xf4\x40\xf3\xe3\xcc\x04\x34\x6c\x4b\x04\x52\xa7\xe6\x5b\x02\x1a\x2f\xe9\x8d\x80\xe9\x8e\x23\x15\xc4\x6b\x9c\xc3\x71\x41\xf1\x2d\x80\xfe\x10\xdf\x36\x4e\x30\x6d\x02\x70\x6d\x90\x71\xbe\x86\x03\xe2\x49\x8a\xee\x2b\x78\x79\x8d\x7e\xe7\x70\xbe\x50\x5a\x9a\x1f\x7e\xbd\x58\xcf\xf2\xe9\x64\xf5\xc9\x7c\xe2\xf9\x95\xc6\x14\xd2\x96\x53\x70\x2d\xe3\x13\x57\x06\x3b\x96\xad\x6b\xce\xf5\xaf\x2d\x1c\x79\x69\x21\xe8\xd4\x65\x8e\x07\x17\xf7\x55\x5f\x63\x05\xfc\x77\xa4\xca\xad\x48\xbb\xa1\x62\x0d\x37\xa4\xca\xb9\x02\xc4\x06\xaf\x38\x20\xe5\xfb\x62\x2e\x66\x40\x04\x20\xce\x37\x25\xe6\x20\xd6\x48\xc0\x42\x17\xa2\x81\x58\x93\x6a\xc5\x41\x59\xdc\x4a\xae\x21\x30\xd9\x1a\x09\x6f\xa2\x5d\xce\xec\x25\x5e\x11\x2e\xd8\x36\xd5\xa1\x5f\xe7\x8a\xc7\x7c\xee\x96\x15\xda\x60\x8a\x80\x7b\x52\x14\xb0\xe1\x58\x59\x8b\x2a\xbe\x57\x62\xb1\xa6\x39\x48\x8d\xc1\x33\xa3\x0b\x5e\x53\xc0\x15\xdf\xb0\x30\x1c\x33\xd3\x01\x3f\x2d\xe9\xcb\x0d\x17\xb0\x46\x77\x18\x6e\x30\xae\xdc\x48\x8d\x76\x7a\xf6\x06\x5b\x6e\xf0\x92\x32\xbc\x46\x55\x9e\xe9\xf0\x4c\x12\xb9\x96\x02\x27\x23\x93\xa4\x2e\xbd\x13\xe6\xab\x94\x19\xa8\xeb\x42\x70\xd2\x45\xef\xb2\xa7\x48\x2c\xd6\x38\x7f\x29\x1b\x2c\xd1\x76\x26\x6c\xc3\x30\x87\x37\x6f\xd5\xb7\xc9\xc0\x15\x19\x57\x7d\x9d\x83\xed\x66\xce\xdc\x7f\x6f\x30\xeb\x2e\xcb\xbd\xe3\x2a\xaf\xaa\x03\x88\x3a\xe0\xcc\x13\x96\xfd\xfc\xf2\xa7\x4c\x75\x4c\x52\x27\x45\xe7\xcd\x23\xcf\x75\x3b\x4d\x67\xa3\x32\x5d\xb5\xa9\x25\x38\x62\x42\x76\x4b\xfe\xeb\xef\xf0\xcd\x37\xf0\xf7\x2f\x43\x6b\xf3\x6f\x7f\xeb\x0a\x33\x15\x4d\xae\x18\x7b\x46\x45\x3b\xb8\x77\x95\xd3\xcd\x1f\x3c\xc3\xf7\xc9\x57\x5f\x7e\x39\x9b\xf6\x4c\xc5\xa6\x35\xd6\x7d\xa0\x14\x2c\xe3\x77\x45\x0f\x5c\x60\xf2\xb7\xc6\xa7\x84\xa2\x9c\x1b\x14\x5b\xe6\x71\xca\xca\xce\x69\xd4\xfa\x1a\x30\x28\x26\x41\xf0\xcc\x75\x11\xda\x3b\x74\x1d\x53\x25\x4f\xa3\x5b\x71\x06\xef\xd6\xb7\x03\x2d\xff\x92\xa0\xbe\xe3\xd9\x0f\x58\x3c\xff\x31\x2c\xa3\x1c\xbf\x0b\x27\x05\x47\x44\xe0\x26\xc7\x03\xf1\x71\xb7\xe6\x7c\x0f\x4d\x82\x6f\xc9\xc1\x86\xd6\x1b\x27\x87\x06\xc7\x04\x51\x1f\x90\x30\xc7\x83\xf3\x90\x84\x79\x82\x51\x8e\x99\x25\xcd\x07\x62\x90\xe9\x59\xde\xa8\x23\x7b\x81\x2a\x5a\x49\x4b\x5e\x7f\xfc\x11\x6f\x3d\x3a\xbd\x9d\x29\xeb\xe3\x61\xb1\x68\x65\x8f\x73\xdf\xc1\xb4\xf8\xa1\xe5\xde\x15\xa7\xf8\xc5\x27\x0d\xfa\xac\x13\x17\x72\x01\x39\xd5\x00\xcb\x2d\xdc\xf6\xf8\xb9\xbe\xd7\xa3\x50\xa0\x3d\x25\x9c\x93\x6a\x25\xa7\xeb\x0e\xfd\x30\xc6\xae\xe4\x81\x29\xc3\x28\x27\xd5\x4a\x67\xba\xbe\x78\x07\x4b\x44\x0a\xe9\x08\x48\x91\x14\x66\x4b\x12\x1f\xaf\xd4\xde\x66\x70\xde\x0e\x88\x41\xec\x4b\xcb\xf3\x28\xe0\x86\x45\x2a\x9d\x71\x4a\x6b\x5d\x22\xac\x9b\xe1\x66\x23\x80\xd6\xfa\x3d\x04\x0d\x67\xeb\x9b\x4d\x02\xbf\x3c\x5c\xec\xc8\x8d\x77\x2c\x43\x63\xbb\xac\xef\x60\xcd\xe7\x7d\x07\xcb\x92\xf5\x9f\x95\x7e\x0d\x4c\x03\x3f\xbc\x43\x35\x56\xc7\xdf\xe0\x7f\x64\xf5\x83\xda\x1d\x97\x48\xa0\xb3\x28\x3e\x33\xd0\x18\xc5\x5b\x75\x5b\xe3\xde\x3a\x30\x56\xe7\x32\x1f\x90\x29\xcb\x7c\x5c\xfa\x2d\xf3\x07\x15\x7a\x1f\x02\xc7\xc7\xdf\xa2\x6e\x35\xec\xfc\x44\xfd\x99\x75\xd2\xa1\xbb\x04\x11\xf4\x51\x5a\x56\xeb\x58\xa7\xcf\x50\xec\xef\x3f\x0a\xf8\x3f\x0a\xf8\x2f\xa7\x80\x4d\x94\xbe\x53\xc2\x7f\x65\x39\x13\xb1\xe3\x83\x6c\x46\xfb\x38\x49\x1b\xa2\x38\xb5\x35\x88\x56\xfa\x3f\x41\x5c\x3f\x1c\x91\x06\x77\x4d\x02\x57\xdf\x2d\x04\x3d\x54\xc5\xb0\xec\x3b\xef\xb5\x06\xa7\x56\x2a\xc7\x4b\xcc\x4c\x87\xec\xa2\xa0\x1c\x27\x69\xe4\x9a\x44\x2f\x28\xe1\x7c\xba\x7a\x5f\x53\x26\xba\x2a\xaf\x1b\x9a\x6f\xdd\x2b\x94\x82\x9a\x7a\x1f\x05\x50\xa6\x5e\xff\xe2\x5d\x09\x50\x97\xcd\xd8\xed\x54\x0a\xba\xb6\x6d\xb6\x24\x39\x19\x9b\x21\xed\xa2\x49\x5d\x71\xaf\xca\x23\xb6\xdc\x48\x34\x7a\x96\xcd\x17\xb4\xe2\x9b\x12\x1b\x5f\x2e\x76\x2d\xd0\x25\x7f\xbf\x86\xad\xb3\x92\x08\xcd\xae\x9e\x7f\xef\x0c\x52\xdf\x3f\xfc\x81\xa7\x49\x98\xcd\x08\x72\x75\x23\xef\x18\x85\x7c\xbd\x43\xac\x7d\x63\xc5\x29\xed\x06\x2f\x99\xe4\xd3\xc3\xfe\xd1\x92\xeb\x91\x9c\x60\xc8\x57\xfe\x20\xfa\x1c\xf4\x18\xd6\x5e\x7b\xf6\x90\x37\xb2\x3c\x73\x2c\x42\xca\x71\xcb\x5b\x85\x0a\xae\xe4\xcf\x8f\x05\x68\x06\xd3\x69\xdf\x02\x1f\x22\x5d\x9f\xf3\x03\x69\xac\x1e\x82\x7e\xed\x62\xf0\x7e\x6c\x36\x52\xf6\xe8\x57\x5d\x3b\x20\xb9\xf3\x7f\x1a\xbe\x45\xa0\x1b\xfe\xe1\xbe\x9d\xd5\x95\x65\xfb\xd1\x9b\x0b\x5a\xd6\x94\x13\xe1\x94\x8f\x6b\xa6\x32\xcc\xb3\x2c\xb3\x6b\x9a\x41\x15\x29\x26\xe6\xae\xd0\xe7\x8b\x02\x71\xae\xa4\xcd\xd9\x39\x24\x81\x50\x4d\x4d\xca\x30\x1a\xa6\xb1\x17\x52\x5c\x2f\x74\x32\x9f\xc3\x80\xba\x32\x51\x57\xdf\x67\x52\x87\x56\x35\xb7\x61\xce\x35\x06\x5a\x15\x5b\xe0\x9b\xda\x48\x5b\xf7\x7a\x0b\xad\xd4\x0c\x5c\x65\xd0\xba\x14\x86\x14\xdd\x6d\x2e\x64\x4f\xe0\xd2\x41\xb9\x8b\x59\x0e\xea\x58\x55\x74\x69\x43\x74\xca\xa6\x9e\xc1\x5a\xd9\x1e\x70\xe2\x7f\x37\x6e\x98\x13\xc1\x6c\xa9\x64\x5e\xc7\x31\xc0\x86\x49\x1d\x00\xae\xde\x22\xd1\x36\x02\x29\x70\xf6\x0a\xe3\xdb\xe4\xcb\x99\x14\x2b\xf2\xcf\xab\x2a\xd7\x67\x2a\xd6\xf8\x4a\x20\x26\xd2\xa1\x2a\x5f\x2f\x11\xd4\x89\x45\xb9\x20\x7c\xa3\x5e\x3f\xe9\x1a\x3d\xf1\xe5\xee\xae\xab\xf7\x0b\x8c\x73\x6e\x72\x5c\xc7\x3d\x51\xe2\xe5\x99\x66\xb0\x44\x05\xc7\xe9\x78\x65\xb2\x97\xf7\x0a\x60\xfe\xd6\xbc\xd8\x72\x30\xcc\x3a\xe1\x77\x2c\xcc\x0e\x83\xf6\xc3\xec\x9d\x2a\xbf\x60\xc8\x84\x31\x3b\xab\xc8\x47\x53\x3f\x2f\x36\x5a\x01\x72\xc8\x99\xf2\x33\x19\x91\xc3\xa5\x53\xcc\x41\xca\x6b\x5f\x80\xff\xa8\x73\xc2\xd0\xbd\x74\xe8\xe1\xcd\x5b\x5d\xac\x32\x83\x35\xe2\x3f\xe2\x2d\xdc\x50\x5a\xb4\xd7\xea\x60\x20\x47\xb2\xeb\x1b\x62\x36\xff\xd4\xfa\x56\x69\x5f\x8d\x90\x25\x7c\x66\x96\x19\xda\x06\x1f\x68\x9a\x0c\xa8\x22\x95\x92\x40\xf7\xa6\x7e\xd0\xc2\xa0\xa4\xb3\xc6\xdf\x95\xd0\x0a\x18\x74\x2f\xad\x52\xdd\xf8\xc6\xed\x78\xfa\xff\xdf\x9a\x95\x74\x6e\xbe\x8b\xca\x68\x7e\x84\x0a\x33\xee\x7c\xcf\xe7\xf0\xb8\x28\xe8\xfd\x55\x59\x8b\xad\x0a\xbb\xeb\xf1\xc1\xc7\x48\x42\xd2\xf7\x5a\xe7\x73\x78\xd1\x6e\x1b\xc2\x55\x81\x39\xc9\x75\x65\xfa\x82\x56\x3a\xbb\xa4\x9e\x47\x94\x1b\x49\xac\xb1\xb6\xa8\xfc\x0b\x4d\x10\x49\x3c\x46\xd9\xa7\x1b\x03\x18\xd3\xce\x53\x18\x7a\x1f\xd6\x5c\xd3\x3c\xfc\x2c\x33\x74\x1f\xf7\x71\x82\x37\x12\x00\x7a\x3e\x5f\x02\x21\x06\x90\xaa\xa7\x06\x34\xf0\x16\xa4\x74\x0c\x0f\xc5\xfd\x73\x98\x4e\x61\x27\x59\xac\xdf\xd7\x37\x79\xbf\x1a\x71\xee\x94\xd8\x39\x3a\x6e\xb0\xbe\x66\x3e\xb7\x69\x63\x3b\x49\x97\xe9\xab\x19\xbe\x23\x74\xc3\x8b\xad\x97\xf4\xbb\xd9\x9a\x94\x5f\xe4\x30\x27\xc1\x7d\x34\x47\x8c\xf9\x54\xe9\x73\xd8\x7b\x2b\xc6\x7f\xce\xa4\xf7\x92\x8c\xe4\xc1\x6f\xf8\x28\x49\xd8\xd8\xbd\xa2\x00\x66\x65\xe3\xa3\xc6\x1e\xbb\x38\x8f\x47\xb5\x5b\xa4\x15\x6a\xd1\xaa\xb8\xbe\x98\x6e\x6f\x00\xeb\x13\xf8\xd0\xef\xbe\xc0\x9f\x81\x8e\x1f\x50\x72\xd0\x5a\x8f\xfd\x92\x03\xfb\xdb\xb2\xc6\xcf\xfd\x3b\x4f\xc9\x38\xd0\x3a\x45\x8c\x92\x5b\x43\xaf\x8a\xed\xe5\x3c\x43\xf7\x83\x27\xc0\x9c\x4e\xff\xa6\xe6\x07\x3f\xa2\x99\x0c\x5e\x39\x1f\x11\x54\x41\x09\x9f\x35\x3d\x06\xea\xc3\x8f\xb7\x21\xf4\xdd\xbb\xc3\x2d\x09\x6d\xbb\x3f\xd6\xa5\xe4\xd2\x34\xd7\x97\xda\x01\x2d\x16\x94\xa9\x9c\x8e\xa0\xd0\xbf\x14\x3c\x1d\xa8\x9e\x99\x42\xd2\x56\xaa\x0b\x0a\xd3\x05\xbf\x9b\xea\x7b\x4e\x4a\x86\xa6\x7f\x48\xd3\x25\xf0\x2a\x7b\xc6\xc9\x03\x18\x26\xe3\x52\x19\xbf\x8b\x10\x73\xaa\x9c\x94\xa9\x51\x4a\xea\x1e\x5c\xf4\x6a\x76\xb4\xde\xe9\xb0\xcb\xe7\x67\xad\x85\x13\x88\xca\xd3\xf6\xfa\xcd\xbb\xbb\x78\xc4\xae\x35\xa4\x86\xcd\xa8\xa1\xa1\x71\xb3\x0a\x4e\x41\x19\x56\xd6\xac\xfa\x4d\xb0\x8d\xdc\x15\x1f\x80\x32\x72\xb9\x73\xef\xbd\x70\xb3\x97\x54\x34\x72\x9f\xc9\x34\x7e\xbf\x3b\x7a\xb3\xdb\x79\x7e\xfb\x81\x77\xa4\x0e\xca\x7d\x08\x34\x91\x1b\x55\xbf\x87\xcd\x13\xbf\x33\x30\x7e\xfd\xbd\xdd\x3a\x83\x5a\x66\xff\x75\x58\xdf\xfb\x19\xfd\xa7\x3c\x3e\x99\x8e\x71\xff\xbd\x8b\x88\x96\x09\x5e\x6a\x30\xb7\x01\x22\xfa\x3f\xd0\x94\xa9\xee\xd4\xdd\xe5\x8d\x20\x9b\x1a\x85\x35\x82\x90\xba\x7e\x41\xb0\x8a\x07\x85\xaf\x79\x45\xb4\xd6\x87\xa8\x8b\x03\xc8\x39\xa6\x13\x0e\x7f\x15\x6d\x0f\x7d\x03\x8d\xee\x86\x12\x54\x1e\xd7\x79\x58\xda\x94\x0d\xaa\x7f\x36\xc5\x79\x7c\x3c\xbc\xe9\x38\xf0\x5c\x4c\x97\x03\x89\x3d\x35\xdf\xda\x71\xfe\xbf\x16\x95\x46\x1a\xd4\x2b\xe9\x5e\x34\xd7\xff\x97\x9c\x82\x7d\x3d\xce\x69\x39\xa1\x6b\x98\x54\x71\xd4\x1e\x98\xc3\x2a\x41\x75\xa0\xe6\x87\xc8\xe3\x3c\xde\x2d\x8d\x3d\xa7\xda\xfd\xef\x90\x87\x3e\xf6\x5c\x72\x82\xd8\xd3\x22\x23\x8b\x1e\xac\xf5\xe2\x32\x2e\x9c\xeb\x00\x61\xe9\xf5\xff\x78\xb1\x39\x40\x85\xe1\x67\x8d\x7e\x73\xcc\x87\xdf\x37\x7a\x70\xd4\x63\x2f\x42\x1c\x27\x7c\x22\x04\xec\xc9\xa3\x68\x98\x36\xfe\x74\xbc\xfd\xeb\xff\x02\x00\x00\xff\xff\xb6\xf1\x7d\x50\x76\x70\x00\x00") +var _templatesServerParameterGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3d\x5b\x73\xdb\x36\xba\xcf\xab\x5f\xf1\xad\xce\xd9\x0c\xe9\x91\xc9\x9e\x3d\x9d\x7d\x70\xeb\xce\x24\xb6\xdb\x78\xda\x5c\x4e\x92\xf6\xe1\x64\x33\x5b\x58\x84\x24\x6c\x48\x82\x01\x20\x3b\x3a\x1a\xfe\xf7\x33\xb8\x91\x00\x09\x52\x54\xec\xa6\xed\xb4\xfb\xb0\xb5\x88\xdb\x77\x01\xbe\x3b\x90\xfd\x1e\x32\xbc\x22\x25\x86\xf9\x0d\x29\xb3\x8a\x91\x82\x08\x72\x8b\x2b\xc4\x50\x31\x87\xba\xde\xef\xd3\x13\x40\x25\xe0\xa2\x12\x3b\x10\x98\x0b\x3d\x80\x08\x42\x4b\x10\x54\x7f\x12\xb8\xa8\x72\x24\x30\x30\x5c\x51\xc8\x70\x85\xcb\x0c\x97\x4b\x82\x39\x30\xcc\x69\xbe\x55\xbd\x4f\xe1\xf2\x05\x3c\x7f\xf1\x06\x2e\x9e\x3e\x7e\xfe\xdd\x15\xbc\x79\x7a\xfd\x1a\x4e\xd2\xba\x9e\xed\xf7\x80\xcb\x0c\xea\x7a\x36\x73\x21\xa2\xd9\xee\x16\xe5\x24\x43\x82\x32\x09\xcc\x0c\x60\xbf\x3f\x05\xb2\x82\xe4\x29\xe2\xcf\x68\x86\xf3\x27\x34\xdb\xbd\x94\xc0\x72\xdd\x9e\xa6\x60\x86\x60\x90\xe3\x81\xde\xfc\x1b\x2f\x85\x42\x23\xc3\x39\x5e\xcb\x06\xd3\xc3\x60\x50\xc8\x79\x4c\x3f\x0d\x0e\xc8\x25\x30\x63\x70\x76\xae\x26\x49\x7e\x32\x53\x46\x8c\x6e\x05\x4e\xbe\xa5\xac\x40\x82\xc7\x5f\xa9\x4e\x7f\x3d\x87\x92\xe4\xb0\x9f\x01\x80\x44\x17\xce\x01\x55\x92\x02\x11\xc3\x7c\x21\xbb\xc4\x33\x80\x7a\xa6\xa7\xcd\x71\x29\xbf\xc7\x70\x7e\x0e\x5f\x98\x41\xfb\x3d\x24\xaf\xf0\x12\x93\x5b\xcc\x9e\xa3\x02\x43\x5d\x27\xfb\x3d\x54\x88\x2f\x51\x4e\xfe\x0f\x43\x62\xbe\xc2\xb9\xec\x4b\x56\x80\xca\x0c\xa2\x92\x0a\x48\x5e\x2f\x37\xb8\x40\xc9\x35\x7f\x82\x38\x7e\xb3\xab\x70\x0c\xc9\x35\x7f\xbe\xcd\x73\x74\x93\xcb\x31\x8f\x1a\xe2\x4a\x54\x14\x24\x9a\x8c\x38\xe7\xd8\xce\x25\xe9\xf9\x9a\x14\x55\x8e\x1d\x82\x7a\x44\xbe\x16\x58\xd3\xd8\x40\xac\xd8\x40\x59\x03\x80\x9c\x20\x27\x4b\xfc\x53\x43\x5b\xde\x02\x27\xc7\xca\x1e\x6e\x63\x8f\x5d\x88\x31\xb4\x03\xba\x72\xf9\xc6\x9b\xd5\xcc\xfe\x70\x16\x1f\x5b\xd9\xf4\xfc\xdc\xa4\x35\x2b\x36\xc7\x61\xce\x25\x60\xea\x30\x39\x1b\x39\x71\x11\xb1\xfb\xde\x41\x4c\x31\x64\x8c\x74\x0a\xbc\xc8\x21\xbe\xee\x75\xcd\xaf\x4b\x81\xd9\x0a\x2d\x71\xaf\xe5\xb5\x60\x18\x15\x71\xac\x97\x5e\x51\xa6\x28\x73\x5d\x66\xf8\xe3\x4f\x88\x49\xfc\xcf\xce\x81\xa1\x72\x6d\x8e\xcd\xbe\xc1\xc6\xa3\xb5\x9d\xce\x21\x82\xea\x48\x34\xd7\xde\x76\x26\x7d\x27\x77\x79\x7b\x38\x06\x27\x7c\x85\x3f\x6c\x09\xc3\x59\xcb\xb7\x81\x93\x44\x59\xdb\x39\x92\x8b\x5d\x6c\x48\x9e\x25\x2f\x91\xd8\x40\x5d\x2f\x24\x52\x15\x23\xa5\x58\xc1\xfc\x6f\x1f\xe6\xb6\xf9\x07\xba\xd4\xa7\x5d\x76\x09\xc2\x19\xc7\xcd\xba\x37\x0c\xa3\xf7\x1e\xb8\xea\xa0\x34\x90\x2d\x69\x29\x48\xb9\xc5\x7e\x97\x76\x77\xd6\xb3\xe0\x67\x5f\xa2\xf4\x00\x38\x42\xc4\x8c\x08\x19\x1f\xfe\xda\x8a\x1d\x87\xee\xee\xc6\x1e\x3c\x38\xbf\x19\x31\x35\x70\xf8\x5b\x86\xa4\x29\x94\xd4\x95\xe7\x72\x67\x13\x25\xaa\x48\x09\x62\x43\x38\xa8\x23\x38\xfb\xfc\x92\xc0\x3f\xdc\xc7\x0b\xdc\x67\xa8\x1a\x13\x0c\x87\x44\xc2\xe3\x2c\x53\x3a\x1a\xe5\x2f\x19\xad\x30\x13\x04\x87\x25\xc4\x40\x47\x5f\x60\xb8\x72\xba\x40\x55\x40\x4a\x5b\x91\xf2\x3d\xde\x1d\x23\x50\x82\xab\x77\xc5\x41\x7b\x76\x2c\x10\x9e\x10\x90\xd3\x79\x72\xa0\x27\x18\x24\x77\xf4\x9e\x99\xcf\x1b\x4e\x4d\x92\x16\x7a\x7a\xb5\x09\xae\xf9\xe3\x92\x96\xbb\x82\x6e\xb9\x59\xc3\xe0\xf0\x1d\x95\x5b\x02\xea\x3a\xf2\x76\xc1\x5b\x8f\x1c\xef\x06\x67\x8a\x9b\x51\x43\xa7\x5d\x6c\x59\x29\x5b\xc6\xe4\x4b\x70\x93\x0c\xf0\xb6\xd9\xb8\x91\x01\xe7\x19\xaa\xe4\xb7\x17\xb7\x98\x31\x92\xe1\x38\x24\xd6\x5b\x4c\x0e\x0a\xf5\x49\x4c\x9d\x2e\xe3\x07\xa5\x7b\x58\xae\xb7\x80\x1e\x21\xd5\xef\x23\xd7\x6f\x51\x0e\x0b\xa0\xef\xe1\xec\x3c\x00\xc4\x57\xb2\xa5\x47\x2a\xc5\xa5\x23\x38\xe1\x2c\xf5\xd7\x10\xf5\xbd\x9d\xd0\x39\x31\x47\xe9\x96\x09\x1a\x26\x44\xd1\xfa\x21\x10\xac\xc7\x68\xff\xdb\x32\xa0\x27\x29\x22\xa5\x7f\x0a\x54\xfd\xba\xda\xc7\x57\x3e\x41\xc5\xe3\x1b\xd6\xed\xca\xd7\xfc\xb1\x34\xca\x63\x97\x7b\xf1\x90\x0a\xea\x29\x0a\x52\xe6\xd2\x8f\x33\x30\x7d\x5e\x0a\xb4\x07\x20\xb4\xae\x05\xd1\x5f\xff\xfa\x12\xea\x5a\x52\xe5\x5e\x6e\x9e\xb7\x37\x2c\x16\x52\x31\x1b\x62\xde\x87\x8c\x86\x30\xcd\x54\x75\xad\x9c\xa6\x56\xbd\x15\xa8\x6a\x7d\xe9\x3f\x28\xcd\x07\x0e\x24\xb3\xfa\x87\x96\xbf\xea\xce\x6c\xce\xa6\x7f\x34\xbb\x6a\xdc\xb3\xd5\xc2\x18\xd1\x12\xd6\xb8\xc4\x8c\x2c\x81\xd8\xae\xbf\x02\x3a\x01\x59\xa3\x7f\xb8\x16\xb0\x13\xd6\x09\xf9\xc4\x3a\x06\x64\x22\x0a\xcf\x48\xa9\xa3\x0d\xc9\x33\xf4\xb1\x89\x3b\x18\x39\xbf\x44\x05\xf6\xb0\x78\x2d\x7f\x9c\x9d\x4b\x12\xfc\xe3\xcb\x48\x6a\x87\x2e\x52\x1d\x29\xf6\x14\xf1\x4b\xc2\x97\x8c\x14\xa4\x94\x8b\xb7\xd2\xad\x21\x78\xfb\xc9\x98\xc1\x1d\x2a\x9c\x34\x54\x68\xd7\xd2\xd6\xa3\x31\xc4\x37\x88\xbf\x64\x78\x45\x3e\x82\x54\xbe\x5b\x7c\xf5\xb1\x62\x98\x73\xc9\xb5\x39\x4d\xe6\xca\xac\x6e\xad\xd4\x6e\x97\xba\xbe\x68\x8f\xb4\xec\xd6\xef\xd0\xda\x8c\xb1\x13\x3d\x33\xe2\xa1\x21\x60\x5d\xcf\xd2\x54\x7b\xfa\xf2\xf7\x25\xae\x94\x25\x55\x98\xf6\x33\xd5\xe4\xf6\x0e\x58\xda\xb6\xf9\x08\x53\x6c\x88\x4d\x8b\xee\x7a\xfd\x63\xee\x18\xbb\x75\x00\x31\x67\x3f\x04\x11\x33\xed\x06\x31\xa7\x77\x08\x31\xd3\xfc\x40\x88\x35\xf3\x1d\x8f\xd6\x8f\x25\xf9\xb0\xc5\xa3\x98\x6d\xdb\x2e\x67\x20\xd8\x16\x87\x30\x72\xe6\x39\x0e\xa9\x5f\xfb\xb8\xc0\x81\xf3\x02\x0f\x79\x60\x8e\x64\xce\x55\xb9\x2d\x86\xb8\x22\xdb\xf4\x5e\xb3\xbd\x02\x5c\x91\x4d\x17\x88\xe3\xc8\x48\xc7\x69\x6c\x99\x1d\x36\xc7\x1e\x90\x33\xa7\x5e\x70\x5d\xb3\xe6\xd4\xb7\x0a\x27\x32\xca\x1b\x36\xc6\x2e\xab\xe5\x2e\xb6\x5c\xd0\x42\xeb\x7d\x81\xa5\xcb\x94\xbc\x16\x8c\x94\xeb\x28\xf6\x80\x73\x74\xe5\xa9\xa7\x2c\x7b\xd3\x9f\x4a\x6e\x3b\x98\x1c\xbf\x88\x47\x11\xf3\xcb\x72\xa4\xe1\xd8\x7f\xdc\xce\x0d\xdf\x4f\xdb\x63\x94\x5c\x73\xc5\xef\x6b\xa8\xeb\x15\xca\x39\x6e\xf7\xa5\x3c\xb5\xd3\x76\xa1\x34\x69\xbc\x7d\xd8\x6a\xd1\xd3\x46\x8d\x2e\x25\x6a\x43\xe9\x91\x0b\x5a\xde\x62\xa6\x31\xf5\x98\x88\x21\x79\x7d\x87\xd6\x6b\xcc\x34\x31\x60\x3e\x6f\xac\x8b\xde\xf6\xd6\x5d\xce\x7a\xfb\xd4\x9f\xa1\x1f\xcc\x56\x8a\xfa\x16\xb1\x52\x4a\xc8\x00\xf7\x17\xae\x9d\xe8\x82\x1a\x8d\x8f\xfb\x29\x6e\xad\xcc\x8e\x69\x68\x69\x47\x19\x4f\xae\x4b\x45\x16\x69\xbe\x1c\x21\x06\xe7\xb2\x6b\x13\xca\x99\x2f\x0e\xe0\x10\x0f\x65\x52\xfa\x9b\xcd\x98\x56\xef\x49\xf5\x12\x31\x8e\x63\x9b\x56\xab\x10\xe3\xa4\x5c\x03\xe1\xc0\xdf\x93\xaa\xc2\x99\xf2\x1a\xb9\xf2\xce\xb4\xbd\xaf\x43\x99\x26\x29\x75\x4f\x16\xdd\x4a\x1c\x1a\xd2\xaf\xb4\xa1\x9d\x28\x90\xa2\x43\xc3\x17\xbf\x25\xc6\x28\x44\x5c\xc3\x7f\x0c\x34\x89\xeb\x49\xa4\x86\x24\xd1\xc9\x7e\x6f\x66\x52\x86\x53\x98\x7b\x54\x92\xff\xe3\x0b\x9d\x0f\xec\x7b\x67\x26\x95\x98\x91\x25\x12\x38\x03\x41\xa1\xc4\x5c\xfe\xa5\x18\x56\x69\x87\xda\x70\xec\x30\x68\x07\xe8\xda\xf3\xaa\xfa\x7d\xda\xe8\x8e\x61\x69\x0c\x01\xe7\x89\xac\xe0\x16\x9b\x20\x95\x6c\x4d\xa2\x13\xc3\x94\x16\xbb\xd8\x0b\x55\x19\xd6\xdd\xe2\x66\x01\x69\xf0\xb8\x7c\x8b\x9d\xb8\x58\x47\x7a\xf5\x1d\x9b\x87\x20\x45\x57\xc4\xb4\x79\xb6\x4a\xc7\x19\x77\xc1\x54\x9b\xef\x87\xb4\x12\xb4\x40\x55\xb7\xbf\x2b\x44\x5b\x2b\x65\x38\xd8\x6e\xf5\x8b\x13\x56\xb7\x9f\xdc\x00\xba\xe7\xd1\xab\x29\xe4\x41\xb7\x91\xa1\x96\x50\xba\x5f\x81\x2a\xa9\x67\x7d\x6f\x8f\x9f\xc1\x92\x56\x3b\x29\x2f\x50\x9e\x03\xce\x71\x81\x4b\x15\x79\x1f\x14\xbc\x43\xca\xf7\x95\xa4\x76\x81\xde\x6b\x66\x36\x27\x6b\x61\x7c\xa7\x61\xa5\xad\x8e\x4c\x2f\xd0\xaf\xad\xfa\xa1\x41\x3f\xb5\x79\x80\xc1\x6e\x75\x7d\xd1\x04\xf2\x7c\xbd\x6d\xc3\x1c\x4e\x36\x57\x37\x0d\xc2\xd8\xdd\x49\x83\x70\x75\xdc\xed\x86\xd1\xc3\xb9\x64\xdd\xf9\x50\x72\x57\x1b\x4f\xf5\x68\x98\x3e\x34\xc7\x0d\x29\x33\xdc\x9b\xc0\x0b\xdd\x59\xaa\x98\xd4\xd0\x2f\x48\x13\x07\xc2\xc0\x29\x19\x00\x31\x98\x89\xb0\x30\x07\x32\xc6\x93\x40\xea\x25\x1b\x7c\x86\x05\xb2\x0a\xbe\xce\xb9\x67\xb6\x78\x12\x8c\xb1\x0b\xdb\xa1\xbc\xc2\xb4\xb4\x42\x77\x9f\x74\xad\xbd\x00\x0b\xdc\x1c\xe9\x04\x21\xf0\x76\xbf\x37\x67\x58\xa5\x74\x26\x0d\x6a\x63\x34\xfe\x01\x75\x77\x66\x5d\x5f\xbf\xda\xef\x6d\x7c\x6b\x58\xfa\x0e\x89\x6c\xcf\x8e\xbd\xe6\x2f\x6d\x49\x92\x83\x5c\x4b\x96\x56\x3e\x36\xfd\x9a\xfa\x8a\x5e\x58\xea\x90\x85\xd6\x3a\x49\xf6\xf7\x13\xc4\xf1\x3f\xbe\x8c\x07\x1c\x3b\x3d\xfe\xc5\x2a\xda\xef\xd5\x9e\x32\xc6\x4a\xb3\x81\x94\xb1\x22\x3f\x78\xd6\x94\xb5\x2d\xfb\x42\xb0\x71\x49\x16\xd6\x3a\x3b\xe0\xab\x86\x71\x74\xc4\xa6\xb2\x55\x94\x88\xf1\x94\x8f\xb1\x4e\x8e\xa8\x55\xf1\xc4\x90\x27\x80\x46\x15\xc6\x71\x82\xe7\xa0\xd8\x39\x3e\xc2\x68\x85\x6a\x5d\xcf\x6e\x11\x9b\xa8\x1d\x3d\xad\x38\x33\xfa\xae\x15\x39\xcf\x31\xce\xb8\xaa\xdd\x30\xc1\x06\xa7\x8e\xa3\xf5\xf6\xfe\xe5\xe7\x99\x27\x08\x3a\x57\x4f\x1e\xec\xae\x15\xe6\x90\xba\x54\x7c\x67\x78\xb9\x65\x5c\x9e\x1c\xa7\x06\x8f\xae\x74\x9d\x95\xaa\x8f\xf0\x8d\x55\xbf\x46\x44\x4f\xd9\x38\x2d\x96\xdd\xc6\x07\x31\x0b\xba\x9e\xc8\x05\xcd\x73\xbc\x94\x8b\x38\x3e\x89\xd5\x4c\x9d\xb6\x61\xb9\x35\x51\x95\xb5\x48\xbb\x10\x4e\xa2\x73\xcb\x22\x7e\x87\xd6\xc9\xeb\x2a\x27\xe2\xc9\x4e\xc3\x15\x4d\x9a\x61\x48\x71\x04\xb0\x8c\xdd\x6c\xcc\x51\xc6\xc6\xd1\xa6\x86\x47\x4b\x93\x27\xed\xa3\x33\x6c\xdb\xc1\x37\x6e\x3a\xf5\x18\x0b\x65\xca\x99\x6a\x12\x37\x93\xba\x4f\x3b\x32\x53\xb4\x11\x38\xea\x28\xe4\xb2\x77\xfa\x6a\x81\xa9\x1d\x70\x69\x86\x93\xd2\xb8\xe0\x51\x45\x39\x27\xd2\x7e\xb9\x23\x62\xe3\xfa\x7a\xb1\x2b\x4d\x1f\xd6\x12\xf3\xf7\xc0\x04\x43\xec\xf7\xc4\x09\xc7\x56\x52\x54\x2f\x69\x79\xaa\x4b\x40\x1f\x3d\x52\x3f\x24\xfd\x85\x14\xc2\x0d\x13\xba\x82\x2a\x6c\x60\x4e\x28\x6a\xf9\xd3\xf2\x04\x2f\x6d\xea\x4b\xa8\xe9\x56\xe7\xef\x6e\xbf\x69\x44\xdd\x98\x6a\x9a\xc2\x05\xcd\xb0\xce\xa4\xaa\x88\xce\xcd\x0e\xd6\xf4\x94\x6b\x9b\xed\x2b\x5b\xb3\x7e\x75\x79\xfd\x26\x99\xcd\x6c\x56\xe0\x82\x56\x3b\x46\xd6\x1b\x01\xa7\x75\xad\x95\xe2\x92\x16\xd2\x25\xef\xb4\x39\xd1\xdb\x59\x85\x96\xef\x91\x71\x84\x5f\x9a\xbf\x65\x43\x9a\xc2\x9b\x0d\xe1\xb0\x22\x52\xbe\x20\xee\x03\x23\x36\x18\x0c\x34\x20\x28\xcd\x13\xd9\xff\x2a\x23\x82\x94\x6b\x5d\x62\xa2\xc6\x15\x6a\xc5\x8a\xd1\x5b\x0c\xab\xad\x50\x53\x6d\x70\x09\x3b\xba\x05\x86\x4f\xd9\xb6\xf4\x66\xb2\x4b\x28\xb0\x51\x99\xcd\x66\xa4\xa8\x28\x13\x10\xcd\x00\xe6\xab\x42\xcc\xe5\x7f\x09\x55\xff\x29\xb1\x48\x37\x42\x54\xf3\x99\xfc\xb5\x26\x62\xb3\xbd\x49\x96\xb4\x48\xd7\xf4\x94\x56\xb8\x44\x15\x49\xf5\xae\x9f\x0f\x77\x60\xdb\x52\x90\x02\x1f\xee\x91\x72\x69\xb9\x10\xb1\x9b\xd0\xb5\x20\x59\x96\xe3\x3b\xc4\xc6\xe6\xe5\x82\x59\x84\x06\x3a\xdc\xa1\xf5\x48\xb3\xb5\xf8\xe7\xba\x92\x13\x34\xa5\x38\x24\x97\x78\x85\xb6\xb9\xb8\x36\xbf\x6d\x04\xa6\x69\x77\x1a\x62\xc5\xe6\xe7\xf8\x2e\x98\x8a\x37\x75\x38\x4b\x86\x91\xc0\x1c\x10\x94\xf8\x0e\xc6\x7a\xea\xc2\x4b\xbb\x1b\xf5\x47\x65\x50\xd0\x02\x1b\xa8\xb8\xca\x61\xa4\xa9\xd6\x58\x92\xf7\x99\x6e\xd0\x01\x54\x69\x01\x12\x41\xd4\xec\x59\x62\xad\x22\x33\xa4\xa4\xdd\xce\xda\xb6\xce\xa4\x30\xe6\x15\x5e\x26\xae\xed\xbd\xda\x96\xcb\x03\xa8\x45\xf1\x28\x3a\xfb\x03\x98\x98\x00\x36\x53\xbb\x33\x4d\x1d\xd0\xb5\x16\xc6\x02\x33\xae\x11\xf5\xe1\xd6\x0c\xd1\x76\x75\xe2\x57\x3b\x81\x35\x24\x9f\x22\x6e\x16\x72\x32\x4b\x6d\xbb\x51\x27\xdf\x92\x1c\xab\x09\x3a\x86\xe6\xf5\x65\x5d\xdb\xe1\xe7\x5e\x85\x5c\xd7\xeb\x6c\x5d\xd9\x21\x17\x34\xe2\xca\x03\xbc\xa0\xa5\x40\xa4\xe4\x90\xfc\x2f\x66\x14\xe6\xd1\x3f\xe7\x4e\x0a\x54\x7d\xb3\xa6\x8a\xda\xd9\x56\x4d\x5a\x9a\x30\x5b\xec\xc2\xe1\xc7\xb2\x40\x8c\x6f\x50\xfe\x06\x7f\x14\xd2\xb3\xc4\xc9\x3a\x81\x4b\x24\xf0\x42\xfd\xbf\x3c\x44\x0b\xb8\xdc\x32\xad\x78\x1a\x0d\xeb\xe3\xd0\x09\x91\x8f\x23\x32\x86\x83\x82\xbb\x09\xc1\x47\xfd\x7c\x9a\xa5\xa4\x32\x9d\x47\x10\x14\xe8\x3d\xe6\xa0\x97\x3a\x1a\x6a\x6b\x21\x74\x40\x8f\xb5\xbc\x3e\x06\x3c\x86\xd7\xdb\x1c\x31\x58\x53\x68\xee\x4e\xf5\x81\x3d\x00\x5f\xa3\xbe\x4c\xe2\x32\x3d\x81\x4b\xaa\xb6\x9d\xb3\xcd\x57\x8c\x16\xd0\x18\xa1\x99\x3d\x18\xa4\xb4\xe9\x07\xe3\xd6\x9d\xa4\x9d\x4d\x1c\xda\x8b\x56\x4d\x3a\x8c\x1c\xce\x94\x76\xf7\x5c\x03\x94\xde\x32\x5c\x48\x35\xb2\xde\xe9\xd3\xd7\xd9\x6f\x21\xd4\x7b\xe8\xfb\x3a\xfc\xf4\xc8\x15\xff\xcd\x69\x99\x34\xcb\x4e\x5b\x72\x80\x08\x91\xe3\xf9\x1e\xdc\x1d\x72\x3e\x45\xf3\x6b\x87\xd3\xce\x06\x99\xbe\x3f\xce\xac\xc7\xa1\x23\x35\x07\x76\x4e\xc7\xda\x73\x2d\xc9\xce\x16\xd5\x77\xf7\xf2\x1c\xa8\xd8\x60\x06\x4b\xc4\x31\x87\x48\x09\x00\xae\xea\xbc\x62\x78\xcb\x37\x74\x9b\x67\x6a\xb3\xd1\xe5\x72\xcb\xde\x8d\x2e\xe9\x17\x19\x1f\x0d\x8b\x84\xc0\xd6\x98\x0d\x1e\x8a\xee\x1a\xc1\xc0\x68\xa8\xdc\x0c\x20\x56\xe6\x59\x57\xd8\x07\xa5\xbc\x39\x67\x4b\xc4\xd8\x0e\x68\xe9\xef\xdb\xc1\x0d\xe7\x1d\x2e\xa7\x96\xe5\x9e\xb2\xdd\x8a\xf6\x90\x4e\x49\xfc\x13\xf5\xf6\xdd\xcd\x4e\xf4\xf3\xb5\x8e\x5c\x8a\x5b\xf0\x42\x02\xa6\xa7\xde\x28\x83\xe8\x68\xa9\x10\x07\x4e\xad\x33\x73\x1b\x2c\xed\x9c\x4e\x03\xfe\xcf\xfb\x7d\x03\x3e\x9f\x43\x24\x7b\x35\x48\xc4\x75\xfd\x73\xbc\x80\x47\x3e\x41\xa0\xa1\xc8\x58\xdd\x7a\x9a\x42\x85\x4a\xb2\xe4\x12\x04\x69\xa7\x90\x15\x31\x3e\x15\x91\xc2\x52\x59\x72\xde\x88\x82\xaf\x55\x3a\xbc\x10\xc9\x6b\x0d\x53\x34\x37\xfd\x7c\x53\x42\x25\xbe\x1a\x63\x03\x7a\xd0\x9d\xc1\xdf\x6e\xe7\x8b\x5e\x99\xbc\x02\x27\x2a\xf8\xda\xfd\xdc\xe1\x82\x5b\x7f\xd2\xcf\xe7\xd9\x56\x2f\xee\xd9\xf6\x30\x4e\xe7\x88\x75\xb5\x0f\x99\x40\xfd\x53\xd1\x7a\x75\x5e\x7d\xae\xc4\xec\x97\x2f\x11\x7b\xe4\x96\x88\x05\xd9\xbe\x68\xa9\xe1\x78\x55\x20\xbd\x39\x53\x9b\x35\x6c\x56\xdb\x33\x27\x85\xa1\x34\x84\x6f\xe8\xb6\xcc\x6c\xf8\x53\x57\xea\x2b\xaf\x6c\xb3\x2d\x50\xe9\x95\xc8\xd2\x0a\x6b\xd3\x48\xae\x21\x76\x15\x59\xa2\x3c\x57\x3e\x19\xc7\x80\x18\x06\x7a\x23\xa7\xc6\x99\x56\xd0\x08\xa4\x9b\xa4\x5c\x7f\xcc\xc5\x2c\x4d\xe5\x30\xe3\x72\x9d\x39\x96\xaa\xd4\x70\x66\x89\x99\x52\x07\x63\xe0\x73\xc1\xb6\x4b\x01\x7b\x93\x1e\x7e\xfa\xe6\xcd\x4b\x30\x2b\x80\x2e\x53\x98\x81\xfa\x6a\x3f\x9e\xb8\x40\xc0\xcf\xf2\x74\x9d\xcd\x4f\xe7\x3f\xcf\xc2\xd6\x70\x7a\x62\x36\xc3\x25\x96\x4c\xac\x44\xe3\x64\xdf\xe4\x74\xf9\xbe\xf1\x6b\x7b\xcd\x6e\x4d\x5f\x27\x1e\x62\x7f\xe9\x62\xc5\x6e\xdf\x67\xe8\x23\x29\x74\xc1\x1c\x80\xf9\x61\x77\x59\x72\xf5\x71\x99\x6f\x39\xb9\xc5\x6d\xaf\xaf\x3d\xce\x3b\xc3\x7b\x13\x93\xd2\x99\x58\xff\x08\x4c\xdc\xf4\xfa\xa6\x33\x71\xd3\xd0\x9b\x78\x9b\x0b\x52\xe5\xf8\xc5\xca\xcc\x6d\x7e\xc3\x8b\x95\x29\x36\x75\x3b\x04\xf0\xfd\x01\x97\x6b\x15\xfc\xd1\x18\x83\xfe\xdd\x14\xaa\x36\xcd\x01\x8c\xbc\xa1\xa4\xf4\x87\x3a\xcd\xdd\xa1\x2f\x95\xac\x2e\xf5\x40\xf3\xe3\xcc\x04\x1f\x6c\x4b\x00\x52\xa7\xe2\x5a\x02\x1a\x2e\xa8\x0d\x80\xe9\x8e\x23\x25\x84\x2b\x8c\xbb\xe3\x3a\xa5\xaf\x00\xfa\x43\x78\xdb\x38\xf1\xb1\x19\xc0\xb5\x41\xc6\xf9\xda\x1d\x10\xce\x3b\xb4\x5f\xc1\x4b\x55\xf4\x3b\x77\xe7\xeb\x4a\x4b\xf3\xc3\x2f\xbf\xea\x59\x3e\xad\xac\x3e\x49\x67\x9e\x57\x69\x4c\x21\x6d\x39\x75\x2e\x45\x7c\xe6\xba\x5c\xc7\xae\x75\xcd\xb9\xfe\xa5\x81\x23\xaf\x0c\x74\x3a\x59\x40\x46\x16\xf7\x55\x5f\x6d\x05\xfc\x13\x52\x66\x56\xa4\xdd\x50\xb1\x81\x1b\x52\x66\x5c\x01\x62\xe3\x33\x1c\x90\xf2\x7c\x31\x17\x0b\x20\x02\x10\xe7\xdb\x02\x73\x10\x1b\x24\x60\xa9\xeb\xba\x40\x6c\x48\xb9\xe6\xa0\x2c\x6e\x25\xd7\x10\x98\x04\x8c\x84\x37\xd2\x0e\x67\xf2\x0a\xaf\x09\x17\x6c\x17\xeb\x68\xae\x73\xc1\x22\x4d\xdd\x2a\x3d\x1b\x4a\x11\x70\x47\xf2\x1c\xb6\x1c\x2b\x6b\x51\xc5\xe2\x0a\x2c\x36\x34\x03\xa9\x31\x78\x62\x74\xc1\x1b\x0a\xb8\xe4\x5b\xd6\x0d\xc6\x2c\x74\x70\x4e\x4b\xfa\x62\xcb\x05\x6c\xd0\x2d\x86\x1b\x8c\x4b\x37\x4e\xa3\x5d\x9e\x83\xa1\x96\x1b\xbc\xa2\x0c\x6f\x50\x99\x25\x3a\x38\x13\x05\x2e\x85\xc0\xc9\xc8\x24\xb1\x4b\xef\x88\xf9\x2a\x65\x01\xea\xb2\x0e\x9c\xb4\xd1\xb7\xe4\x19\x12\xcb\x0d\xce\x5e\xc9\x06\x4b\xb4\xbd\x09\xda\x30\xcc\xe1\xed\x3b\xf5\x6d\x36\x70\x41\xc5\x55\x5f\xe7\x60\xbb\x99\x33\xf7\x3f\x5b\xcc\xda\xab\x6a\x1f\xb8\x4a\x95\xea\x00\xa0\x0e\x0e\xf3\x88\x25\x3f\xbe\xfa\x21\x51\x1d\xa3\xd8\xc9\xba\x79\xf3\xc8\x73\xdd\x4c\xd3\xda\xa8\x4c\x17\x41\x6a\x09\x8e\x98\x90\xdd\xa2\xff\xfe\x3b\x7c\xfd\x35\xfc\xfd\x8b\xae\xb5\xf9\x97\xbf\xb4\x75\x8e\x8a\x26\x57\x8c\x3d\xa7\xa2\x19\xdc\xbb\x48\xe9\xa6\x04\x9e\xe3\xbb\xe8\xcb\x2f\xbe\x58\xcc\x7b\xa6\x62\xdd\x18\xeb\x3e\x50\x0a\x96\xf1\x9b\x9a\x13\x17\x98\xfd\xa5\xf6\x29\xa1\x28\xe7\x86\xc4\x56\x59\x98\xb2\xb2\x73\x1c\xb4\xbe\x06\x0c\x8a\x59\x27\x74\xe6\xba\x08\x4d\x99\x74\xcb\x54\xc9\xd3\xe0\x56\x5c\xc0\x87\xcd\xfb\x81\x96\x7f\x49\x50\x3f\xf0\xe4\x3b\x2c\x5e\x7c\xdf\xad\x4a\x1c\xbf\x89\x26\x05\x47\x40\xe0\x46\xc7\x03\x71\xbf\x3b\x6b\xbe\x87\x26\xc1\xb7\xe4\x60\x43\xeb\x8d\x93\x43\x83\x63\x42\xa8\x0f\x48\x98\xe3\xc1\x79\x48\xc2\x3c\xc5\x28\xc3\xcc\x92\xe6\x13\x31\x48\xf4\x2c\x6f\xd5\x91\xbd\x40\x25\x2d\xa5\x25\xaf\x3f\x7e\x8f\x77\x1e\x9d\xde\x2d\x94\xf5\xf1\xb0\x58\x34\xb2\xc7\xb9\x69\x60\x5a\xfc\xc0\x72\xef\x82\x51\xf8\xda\x91\x06\x7d\xd1\x8a\x0b\xb9\x80\x9c\x6a\x80\xe5\x16\x6e\x7b\xfc\x5c\xdf\xeb\x51\x57\xa0\x3d\x23\x9c\x93\x72\x2d\xa7\x6b\x0f\xfd\x30\xc6\xae\xe4\x81\x39\xc3\x28\x23\xe5\x5a\x67\xa5\xfe\xf6\x01\x56\x88\xe4\xd2\x11\x90\x22\xa9\x9b\xf8\x8c\x7c\xbc\x62\x7b\x39\xc0\xb9\xb9\x1f\x82\xd8\x97\x96\xe7\x41\xc0\x0d\x8b\x54\x32\xe3\x94\x56\xba\xe2\x56\x37\xc3\xcd\x56\x00\xad\xf4\x13\x05\x1a\xce\xc6\x37\x9b\x75\xfc\xf2\xee\x62\x47\x6e\xbc\x63\x19\x1a\xda\x65\x7d\x07\x2b\x4d\xfb\x0e\x96\x25\xeb\x3f\x4b\xfd\x6e\x97\x06\x7e\x78\x87\x6a\xac\x8e\xbf\x3f\xff\xc8\xea\x07\xb5\x3b\x2e\x91\x40\x67\x41\x7c\x16\xa0\x31\x0a\xb7\xea\xb6\xda\x2d\xe2\x37\x56\xe7\x2a\x1b\x90\x29\xab\x6c\x5c\xfa\xad\xb2\x07\x15\x7a\x9f\x02\xc7\xfd\xef\x30\x37\x1a\x36\x3d\x51\x7f\x26\xad\x74\x68\xef\x14\x74\xfa\x28\x2d\xab\x75\xac\xd3\x67\x28\xf6\xf7\xa7\x02\xfe\x53\x01\xff\xe1\x14\xb0\x89\xd2\xb7\x4a\xf8\x8f\x2c\x67\x02\x76\x7c\x27\x9b\xd1\x3c\x0d\xd2\x84\x28\x4e\x6d\x59\xa1\x95\xfe\x4f\x11\xd7\xcf\x36\xc4\x9d\xab\x1b\x1d\x57\xdf\xad\xed\x9c\xaa\x62\x58\xf2\xc4\x7b\x2b\xc1\xa9\x6b\xca\xf0\x0a\x33\xd3\x21\xb9\xc8\x29\xc7\x51\x1c\xb8\x75\xd0\x0b\x4a\x38\x9f\xae\x3e\x56\x94\x89\xb6\x70\xeb\x86\x66\x3b\xf7\x46\xa2\xa0\xa6\x36\x47\x01\x94\xa8\x07\xb9\x78\x5b\xae\xd3\x66\x33\xf6\x7b\xc8\x18\xad\x6c\x53\x5b\x33\xdc\x7b\xa5\x43\x95\x79\x36\xd4\x8e\x34\xf8\x96\x8d\x17\xb4\xe4\xdb\x02\x1b\x5f\x2d\x74\x8b\xce\x25\x6f\xbf\xec\xac\xb5\x82\x08\x4d\xae\x5e\x7c\xeb\x0c\x52\xdf\xef\xf1\xa6\xd2\x7c\x6e\x89\xeb\xdf\x81\x71\xf2\x71\x23\x2f\x05\x75\x79\x77\x8b\x58\xf3\x8a\x89\x53\x60\x0d\x5e\xc2\xc8\xa7\x89\xfd\xa3\x21\xd9\x23\x39\xc1\x90\x3f\xfc\x49\x34\x9a\xf4\x06\xd5\x41\x9b\xf5\x10\x19\x1b\x3a\xba\x66\x57\x80\x9c\xe3\x16\xb6\x0a\x09\x5c\xc9\x9f\x0f\x01\x54\xdf\xd2\x1e\x22\x5f\x9f\xfb\x03\xe9\xaa\x1e\x82\x7e\x3d\x61\xe7\x45\xd7\x64\xa4\x14\xd1\x2f\x98\x76\x40\x72\xe7\xff\x7c\xbc\x0b\x40\x38\xfc\xc3\x7d\xa5\xaa\xad\xaa\xf6\x23\x35\x17\xb4\xa8\x28\x27\xc2\xa9\xfe\xd6\x8c\x65\x98\x27\x49\x62\xd7\x34\x83\x4a\x92\xcf\xcc\xfd\x99\xff\x5c\xe6\x88\x73\x25\x9b\xce\xce\x21\xea\x08\xd0\xd8\xa4\x07\x83\x21\x19\x7b\x3d\xc4\xf5\x38\x67\x69\x0a\x03\xaa\xc9\x44\x58\x7d\xff\x48\x1d\x5e\xd5\xdc\x84\x34\x37\x18\x68\x99\xef\x80\x6f\x2b\x23\x59\xdd\xcb\x26\xb4\x54\x33\x70\x95\x2d\x6b\xd3\x15\x52\x4c\x37\x79\x8f\x03\x41\x4a\x07\xe5\x36\x3e\x39\xa8\x4f\x55\x31\xa4\x0d\xc7\x29\xfb\x79\x01\x1b\x65\x67\xc0\x89\xff\xdd\xb8\x5c\x4e\xb4\x12\xdc\x97\x6d\x5b\x60\xbb\x09\x1c\x00\xae\x5e\xfd\xd0\xf6\x00\xc9\x71\xf2\x1a\xe3\xf7\xd1\x17\x0b\x29\x5e\xe4\x9f\x57\x65\xa6\xcf\x55\xa8\xf1\xb5\x40\x4c\xc4\x43\xd5\xb7\x5e\xd2\xa7\x15\x8f\x72\x41\xf8\x5a\xbd\x33\xd2\x36\x7a\x62\xcc\xdd\x5d\x57\x1f\x97\x18\x67\xdc\xe4\xb3\x8e\x7b\x0c\xc4\xcb\x29\x2d\x40\xbd\x62\xb0\x50\xeb\xc7\xe3\x75\xc3\x5e\xa6\xab\x03\xf9\x37\xe6\x85\x94\xc9\x90\xeb\x14\xdf\xb1\x90\x3b\x6c\x9a\x0a\xb9\x77\xc2\xfc\x32\x21\x7b\x0b\xac\xb1\x86\x7c\x64\xf5\xa3\x5e\xa3\x95\x1f\x53\xce\x97\x9f\xc1\x08\x1c\x34\x9d\x5a\xee\xa4\xba\x0e\x05\xf6\x8f\x3a\x33\x0c\xdd\x49\x47\x1e\xde\xbe\xd3\x45\x2a\x0b\xd8\x20\xfe\x3d\xde\xc1\x0d\xa5\x79\x73\x1b\x0d\x06\x72\x23\xfb\xbe\x01\x66\xf3\x4e\x8d\x4f\x15\xf7\xd5\x0a\x59\xc1\x5f\xcd\x32\x43\x9b\xe1\x13\x4c\x16\x83\x8a\xcb\xf0\x1e\xcb\x55\x4e\x02\xdd\x99\xf2\x41\x0b\x8c\x12\xd9\x66\xb4\x23\xb6\x15\x54\xe8\x4e\x9a\xa5\xba\xf1\xad\xdb\xf1\xf4\xbf\xde\x99\x95\x74\x72\xbe\x0d\xcb\x68\xc6\x74\x35\x69\xd8\xfb\x4e\x53\x78\x9c\xe7\xf4\xee\xaa\xa8\xc4\x4e\xc5\xdd\xf5\xf8\xce\xc7\x40\x46\xd2\x77\x5b\xd3\x14\x5e\x36\xfb\x87\x70\x55\x0d\x4e\x32\x5d\x46\xbe\xa4\xa5\x4e\x2f\xa9\xd7\x09\xe5\x8e\x12\x1b\xac\xcd\x2d\xff\x92\x12\x04\x32\x8f\x41\x3e\xea\xc6\x0e\x8c\x71\xeb\x2a\x0c\xbd\xd9\x6a\xae\x39\x1e\xc5\xd3\xb0\x93\xd3\x79\x73\x00\xa0\xe7\xf4\x45\xd0\xc5\x00\x62\x75\x75\x5f\x03\x6f\x41\x8a\xc7\xf0\x50\xdc\x3f\x87\xf9\x1c\xf6\x92\xc5\xfa\x29\x7c\x93\xf8\xab\x10\xe7\x4e\x8d\x9d\xa3\xf8\x06\x0b\x6c\xd2\xd4\xe6\x8d\xed\x24\x6d\xaa\xaf\x62\xf8\x96\xd0\x2d\xcf\x77\x5e\xd6\xef\x66\x67\x72\x7e\x81\x53\x1d\x75\xee\x98\x39\xf2\xcc\xa7\x4a\x9f\xc3\xde\xdb\x2b\xfe\xf3\x20\xbd\x97\x59\x24\x0f\x7e\xc1\x47\x3e\xba\x8d\xed\xab\x04\x60\x56\x36\x4e\x6a\xe8\xf1\x88\xf3\x70\x58\xbb\x41\x5a\xa1\x16\x2c\x8b\xeb\xcb\xeb\x34\xf5\x8a\x02\x1e\xfa\x1d\x15\xf8\x3d\xd0\xd1\x7b\xad\xb2\x5b\x67\xe0\x1b\x90\xad\x9f\x6f\x45\x85\xe5\x80\x9f\xe3\x77\x5e\x60\x71\x80\x72\x8a\x15\x25\x53\x86\xde\xee\x3a\xc8\x60\x86\xee\x06\x37\xba\x39\x84\xfe\x25\xcb\x4f\x7e\xaa\x32\x1a\xbc\x99\x3d\x22\x8f\x3a\xa5\x7a\xd6\xd4\x18\xa8\x02\x3f\xde\x66\xd0\xd7\xe6\xa6\x5b\x0e\xda\x6e\x7f\xac\x0b\xc6\xa5\x59\x5e\xc9\xcd\x9b\x01\x5a\x2e\x29\x53\xb9\x1b\x41\xa1\x7f\x9f\x77\x3e\x50\x25\x33\x87\xa8\xa9\x47\x17\x14\xe6\x4b\x7e\x3b\xd7\x77\x8f\x94\xa8\x8c\x7f\x93\xa6\x4a\xc7\xab\xec\x19\x23\x0f\x69\x88\x8c\x4b\x61\xfc\x21\x40\xd5\xb9\xf2\x54\xe6\x46\x09\xa9\x4b\x6a\xc1\xeb\xd5\xc1\x02\xa7\x69\x17\xc8\xcf\x1a\x8b\xa6\x23\x1a\x4f\x9b\xdb\x36\x1f\x6e\xc3\x21\xba\xc6\x70\x1a\x36\x9b\x86\x86\x86\xcd\x28\x38\x05\x65\x48\x59\x33\xea\x17\xc1\x36\x70\xdf\x7b\x00\xca\xc0\x05\xcd\x83\x77\xbb\xcd\xa6\x52\xe1\xc7\x43\x26\xd2\xf8\x1d\xed\xe0\xed\x6c\xe7\xb5\xeb\x7b\x6f\xcd\x69\x4b\x06\x8c\x2a\x75\x4e\x8e\x06\x3a\x70\xcf\xea\xd7\x30\x85\xc2\x77\x09\xc6\x6f\xba\x37\x3b\x6c\x50\x2b\x1d\xbe\xd2\xea\x7b\x47\xa3\xff\xea\xc6\x67\xd3\x49\xee\x3f\x4d\x11\xd0\x4a\x9d\x47\x19\xcc\x2d\x81\x40\x29\x62\x47\xb3\xc6\xba\x93\x67\x3c\x74\x91\x8d\x8d\x82\x1b\x41\x48\x5d\xcb\x20\x58\xc5\x8e\xba\x8f\x66\x05\xb4\xdc\xa7\xa8\x97\x09\xe4\x1c\xd3\x21\xd3\x1f\x1f\x3b\x40\xdf\x8e\x05\xe0\x86\x1a\x54\x7e\xd7\x79\xee\xd9\x94\x13\xaa\x7f\xe1\xc4\x79\x12\xbc\x7b\xff\x71\xe0\xa1\x97\x36\x37\x12\x7a\x00\xbe\x29\x29\xf5\xff\xbd\xa7\x38\xd0\xa0\xde\x2e\xf7\xa2\xbf\xfe\xbf\xc5\xd4\xd9\xd7\xe3\x9c\x96\x13\xba\x86\x4c\x19\x46\xed\x81\x39\xac\x12\x57\x13\x2d\x05\x08\x3c\xab\xe3\xdd\xde\x38\x70\xaa\xdd\xff\x4d\x79\xd3\xe3\xc0\xe5\x27\x08\xbd\x22\x32\xb2\xe8\x64\xe5\x18\x96\x71\xdd\xb9\x26\x08\x4b\xaf\xff\xfd\xc5\xe6\x00\x15\x86\x1f\x24\xfa\xc5\x31\x1f\x7e\x99\xe8\xc1\x51\x0f\xbd\xea\x70\x9c\xf0\x09\x10\xb0\x27\x8f\x82\xc1\xdc\xf0\x83\xee\xf6\xaf\xff\x0f\x00\x00\xff\xff\xf1\xc0\x2a\x5b\x38\x70\x00\x00") func templatesServerParameterGotmplBytes() ([]byte, error) { return bindataRead( @@ -555,12 +722,12 @@ func templatesServerParameterGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/server/parameter.gotmpl", size: 28790, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x37, 0x9f, 0x40, 0x42, 0xd3, 0x19, 0xb5, 0xaa, 0xd7, 0x86, 0x7, 0xb2, 0x39, 0x79, 0x9a, 0xee, 0x52, 0x8f, 0x51, 0x65, 0x98, 0xa2, 0xbd, 0xd5, 0x1a, 0xb5, 0x94, 0x4a, 0x4f, 0x3e, 0xb0, 0x2f}} + info := bindataFileInfo{name: "templates/server/parameter.gotmpl", size: 28728, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4b, 0x53, 0xb9, 0xa3, 0xe8, 0xc6, 0x71, 0x82, 0x7a, 0xd6, 0x71, 0xb9, 0x4e, 0x13, 0x9f, 0xe, 0x59, 0x1c, 0x98, 0xc, 0x37, 0x19, 0xbf, 0xc4, 0x84, 0x11, 0x3c, 0x3e, 0x24, 0x20, 0x65, 0x31}} return a, nil } -var _templatesServerResponsesGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\x4f\x93\xdb\x36\xb2\xbf\xf3\x53\x74\xf4\x9c\x94\x34\x25\x91\x7e\x87\x77\x99\x44\xa9\x7a\xf1\x78\x37\xb3\xb5\xb1\xa7\x3c\x93\xdd\xaa\xf5\xba\x62\x0c\xd9\x92\x10\x93\x00\x0d\x80\x1a\x6b\x55\xfc\xee\x5b\xf8\x43\x12\xe0\x1f\x8d\xc6\x49\x7c\x4a\x0e\xf1\x10\x40\x37\xba\x1b\xbf\x6e\x74\x37\x74\x3c\x42\x86\x1b\xca\x10\x66\x12\xc5\x1e\xc5\x0e\x49\x86\xe2\xbe\xa2\x79\x86\x62\x06\x75\x1d\x1d\x8f\x40\x37\xc0\xb8\x82\xf8\x5a\xfe\xbf\x10\xe4\x00\x75\x7d\x3c\x82\xc2\xa2\xcc\x89\xd2\x94\xb4\x28\x73\x1c\xa5\x8f\xed\x5a\xcc\x25\x0e\xa8\x72\x9a\x9e\x26\x62\x99\xdd\x7f\xd5\xfd\xd9\x49\x3b\xbd\x67\x2b\x73\x7c\x2d\x5f\x55\x79\x4e\xee\x73\x84\x55\x5d\x47\x7b\x22\xe0\x78\x84\x3d\x11\x8c\x14\x08\xf1\xf5\x15\xd4\x35\x48\x25\x28\xdb\x46\x74\xa3\xe7\xe2\x37\x98\x22\xdd\xa3\x78\xa5\x57\xd4\x75\x7c\x3c\x42\x49\x64\x4a\x72\xfa\x9f\x96\xe2\xab\x35\x30\x9a\xc3\x31\x82\x11\x76\x6b\x70\x9b\xff\x85\x8b\x82\x28\x85\xc2\x6a\x13\x7c\xcf\x2f\xce\xdc\x6b\x11\x18\xaf\x3b\x87\x17\x95\x54\xbc\xf0\x59\x5e\xb4\x16\x3b\x93\x75\x6b\xa3\x21\xaf\xf8\xd6\xd8\x64\xbe\x38\x1e\x91\x65\x7a\xa9\xf9\x27\x32\x86\xed\xc4\xe9\x69\x7e\x79\x9e\xea\x9f\xa5\xf9\x1f\xa4\x90\xb3\x99\x06\x87\x3d\xff\x9e\x4a\x5f\xad\x61\x36\x33\x07\x2d\x1e\xe2\x1f\x0d\xcc\xe6\x8b\xf8\x16\x95\xd6\xa2\x14\x94\xa9\x0d\xcc\xbe\xfe\x38\x83\xd8\xc9\xb5\x1c\x32\x59\x44\xed\x3e\x3d\x08\x6b\x07\xa0\x0a\x8b\xcf\x42\x71\xfc\x0f\x92\x57\xf8\xf2\x53\x29\x50\x4a\xca\x19\xd4\xf5\x6d\x0f\xcb\xc3\x15\x3d\xe8\x8e\xf2\x78\x02\x80\x87\xe4\xde\xa9\x4d\xac\xf8\x4d\xb0\x5b\x59\xab\x8c\xca\xfd\x04\xf8\x9d\x94\xfb\x77\x13\x7b\x00\xae\x51\xb1\x3b\x88\x8d\xaf\x78\x03\x6b\x20\x65\x89\x2c\x9b\x10\xfd\xcd\x72\x8a\x77\x1f\x79\x01\xf0\xa6\x40\xd7\x0f\x92\x2f\x76\x34\xcf\x46\xe5\x7a\xfb\xce\xc1\x6d\xc3\x05\xfc\xb2\x3c\x8b\x4a\x9f\x92\x20\x6c\x8b\x53\x00\xb5\x86\x58\xb5\xa1\xce\x32\x9a\xba\x78\x4e\x7a\x90\xa5\xfd\xac\x0b\xc8\xa7\x74\x47\x18\x5c\x84\x56\xaa\x1b\x22\x90\xa9\x06\x94\xc3\x68\x28\x1f\xc8\x36\xfe\x1b\xa7\xec\x87\x83\xc5\xcb\xfc\x2c\xc3\x1a\x4b\x06\xc1\xe5\x05\xcf\x73\x4c\x15\xe5\xcc\xf2\x31\x51\x85\x6e\x20\x47\x36\x1f\xc6\x1b\xf8\x1e\x9e\x1b\x3b\xee\xf6\xce\x29\xc2\x05\x6f\x9f\xbf\x8b\x40\xab\xb2\xdb\x7b\xe8\x7b\x42\x88\xdb\xed\x17\x11\xc0\x13\xfc\xf2\x4b\x19\x62\xd4\x09\x5a\x73\x4c\x2c\x90\xce\x48\x63\x73\xad\xa9\x26\x69\x7d\x03\xfe\xee\x0e\x2c\x7d\x3b\x3b\x1c\x86\x7f\x86\xc9\x9b\x40\x59\x72\x26\xd1\xcf\xdb\xb4\x81\x79\x86\xb0\xfa\x5f\xa8\xeb\x24\x81\xe3\xd1\xbb\x37\xf5\x91\xd6\xb5\x99\xa7\x12\xd4\x0e\xe1\xc7\xbb\xbb\x1b\x48\xf5\x80\x40\x55\x09\x86\x19\x68\xf7\x56\x87\xd2\xb8\xec\x80\x36\x4a\x39\x93\x6a\x74\xca\xb2\x65\xca\xde\x28\x56\x0a\x3f\xb1\x8b\x92\x0b\x17\x55\xaf\x50\xa6\x82\x96\xaa\x0d\xb5\x3d\x5e\x26\x30\x1c\xe1\x3e\xe7\xe9\x87\x94\x17\x85\xf6\xba\x01\x91\x06\xe2\x09\xe2\x5d\x55\x10\xe6\x0f\x36\x61\x3a\xd2\xe8\xdc\xa2\xb8\x6c\xac\xa7\x57\xa7\xa4\xc0\x80\x45\x74\x91\x44\x13\x46\x70\x49\x64\x95\xaa\x06\x66\x74\x03\xf8\xd1\xb7\x7b\x04\xf0\x8b\x54\x44\x55\xb2\x31\x8a\x5d\xd8\x26\x6c\x36\x26\x3a\xff\x93\xfa\xa4\x2e\x8e\xc7\x51\xd3\x9c\x36\x42\x63\xdb\x46\x8c\xf8\x27\xf2\x89\x16\x55\x61\xc7\xdc\xc7\x65\x33\xf9\xf2\x53\x9a\x57\x92\xee\xb1\x5b\xf5\x5d\x20\x96\x47\xee\x0f\x1b\xc6\x94\x79\x8c\xed\xc7\x08\xe3\x76\xd5\xf7\x3d\xc6\xed\xc4\x80\x71\x95\x2b\x5a\xe6\xf8\x7a\xe3\x78\xbb\x6f\x78\xbd\x31\xfc\xc3\x05\x03\x6a\xf2\xe9\xef\xc8\xb6\x6a\xd7\x6a\x0c\xf6\xdb\xd1\x7a\xd3\x23\x1a\x05\xa4\x94\x85\xa4\xde\x74\x9f\xf4\xc6\xe4\x02\xcc\x12\xba\x0f\x4b\xd5\xcd\x8c\x48\x7a\xad\xaf\xae\x4e\x50\xf3\xd9\xca\xd9\x4c\x8e\x88\xe9\xd3\x51\x16\xd0\x75\x93\x7d\xba\x9f\x19\xfd\x58\xa1\x47\x6a\x07\x2e\x41\x89\x0a\xfb\x8b\x7f\x24\xf2\x0a\x37\xa4\xca\x95\x5d\xeb\x3e\x2e\x83\x88\xfc\x3f\xfb\x99\x46\x60\xb3\xcc\x47\xdf\x45\x62\x21\x38\xee\x8b\xf1\x5f\xf9\x9d\xf6\xa5\xba\x86\xf7\xbf\x4a\xce\x2e\x67\xc7\xa3\x0b\x1a\xde\x25\xfb\x06\x3f\x56\x54\xa0\xe6\xb8\xe4\x85\xbe\xe6\x4b\x75\x68\x37\x99\xbd\xf7\x5d\xa8\x03\xfc\x6d\xba\xc3\x82\x58\x71\x1e\xa8\xda\x79\x23\x11\xc0\x6f\x73\xab\x3f\x7d\xea\x4f\x9f\xfa\x0c\x9f\x8a\x00\xae\xd9\x25\xfc\xc0\xb3\x83\x71\x0d\x7f\xe2\x86\x1c\x72\x4e\x32\x77\xc8\x84\x65\x30\x37\xe0\xb7\xa0\x8d\xaf\xe5\x0f\x44\xa2\x76\x96\x85\x37\xf6\x82\x17\x65\x8e\x9f\x5e\xdf\xff\x8a\xa9\x1a\xd4\xfe\x6e\xd9\xc0\xc7\xee\x79\x76\xe8\x1c\xa9\xe7\x3f\xfa\x3a\x4e\xe0\x15\x3e\x8c\x3b\x6d\x2a\x90\x28\x94\x13\x2e\x6d\xfc\x2c\x73\x81\x60\xe7\xee\xb0\xbd\xce\x67\x64\xb4\xa9\x58\x3a\xc9\x77\x3e\x76\x59\xa6\xee\x8a\x6c\x85\x5b\xc0\xc5\x44\x28\x19\xbf\x6c\xe9\xc6\x66\x30\xdf\xad\x5d\xe6\x07\xf6\x7b\x0d\xff\xf7\xfc\xb9\xc9\xa8\x82\x7a\xdc\xc4\x3b\x2b\xb4\x8e\x7b\xb7\xbc\x40\x17\xd4\xdc\xa1\xea\x92\x68\xae\x83\x47\x02\x94\x51\x45\xad\x14\x8d\x9e\x81\xf2\x4e\x69\x63\xd9\xc1\x9d\x6e\x24\x69\x03\x95\x17\x62\x57\xed\x9c\x9b\xf7\x12\xf6\xba\x6e\x56\xad\xbd\x35\x76\xdd\xaa\xc1\x4c\x7c\x2d\x6f\x04\x2d\xa8\xa2\x7b\x1c\x2b\x52\x0d\xa6\xe6\xb6\x5c\x7b\xc1\x99\x22\x94\x49\x88\xff\x85\x82\xc3\x6c\xfe\xef\xd9\x0c\x16\x0b\x07\x1e\x33\xa6\xff\x4c\x2e\x74\x52\xb3\x29\x94\xcd\xfd\x3a\xc5\x05\x08\x1b\x98\x25\xfc\xcc\x0a\x22\xe4\x8e\xe4\x77\xf8\x49\xcd\x17\x4b\xc0\x78\x1b\xc3\x15\x51\xb8\x34\xff\x57\xb4\xd0\x7f\x55\x82\x98\x48\x7a\x91\x04\x7a\x36\x3a\x98\x0a\xe2\x5c\x45\x4e\xe9\x60\xe4\x76\xb8\x37\xd8\x5a\x4d\xde\x55\x8b\x93\x0a\x2a\xf2\x01\xa5\x6b\xa6\x3c\x59\xea\xf9\x78\x8b\x6e\xa1\x4f\xf9\x69\xe2\x09\xdc\x56\x39\x11\xb0\xe5\x7a\xa1\x63\x3f\x10\xf6\x11\xf9\xda\xda\xd9\x6c\xbf\x82\xe4\x02\xae\xb8\xb9\x60\x3d\x2c\x6f\x04\x2f\xa0\xe4\x52\xd2\xfb\x1c\x1b\x30\x4b\xa0\x0c\x18\x4a\x85\x19\x10\xcd\x42\xc2\x45\xd2\xc3\xea\x18\x16\x9b\x92\xdd\x3b\xc8\x66\x68\xd8\x3c\xe9\x63\xae\x15\xca\x42\x46\x2a\x41\x14\x6e\x0f\xd6\xcb\x7a\x78\x1b\x53\x7d\xa0\x7e\xd8\x40\x58\x3d\x71\x47\x1d\x39\xe3\x76\xdb\xf3\xb6\x9c\x30\xc2\x3c\xe8\x67\x3c\x82\x0e\xcd\x6f\xcb\x6f\x73\x9a\xe2\xb5\x77\xd6\x41\xb6\x75\x2e\x42\x2e\xc1\x36\xcb\xc1\x34\x3c\x1e\xc3\x4e\xa0\x8d\xad\xa7\x26\xf3\xbd\xe4\x02\x48\x9e\x03\x57\x3b\x14\x90\x12\x89\x12\xe6\x26\x04\x48\x73\x05\x2d\xe0\xad\xdc\xf1\x2a\xcf\x0c\xdc\x78\x9a\x56\xe2\xdd\xc9\x2d\x9b\x4b\xf1\x33\x65\xd1\x12\xb4\xe9\xde\x94\x5b\xf8\x7b\x04\x03\xc1\xc7\x22\x8a\xc6\x22\xf8\x68\xe8\x76\x5e\x95\x12\x21\x0e\xc0\x59\x88\xd2\x49\x78\x05\xae\xd4\xdd\xfe\xbf\x35\x92\x37\x81\x7c\xec\x06\x89\x43\xff\x79\xfb\xee\xfe\xa0\x70\xd0\xe6\xf1\xa2\xd0\xa2\x13\x6f\x2c\x9c\x84\x77\x16\xdd\x00\x17\x30\x7f\x72\x0c\x58\x8c\xf8\xa8\xc7\x59\x5f\xef\x42\xc0\xe5\xba\xef\x8b\x4e\xfc\xf7\xc7\x63\x2b\xbe\x9c\xc1\x5c\xaf\x6a\x95\x58\xd4\xf5\xfb\xc5\x12\xbe\x19\xf4\xc0\x9a\xf9\x6f\x0d\x73\xaf\x2b\xde\xfd\x97\x24\x50\x12\x46\x53\xa9\x45\x90\x25\xa6\x74\x43\x53\x7b\x88\x54\x87\xc6\x3d\xc9\x69\x16\x50\x14\x72\xab\xe5\xdc\x14\x2a\xbe\xb5\x32\xcd\x67\x6e\x5d\x98\x20\x98\x96\x8a\xcd\x1f\x86\xed\xb9\x4b\xf8\x7a\x3f\x5b\xa2\x10\x8b\x80\xb9\x91\x65\x5e\xc8\xad\x3f\xdc\x3b\x82\xa6\x31\x74\x1a\xdd\xe1\x83\x5a\xbb\xc2\xf6\x7b\x8c\xad\x86\xa9\x56\xdb\xe0\x1a\x64\x5b\x5e\x5f\xe3\xd2\xa4\x59\x4b\x9f\xe9\x78\x22\x34\x51\x64\x8e\x55\x8c\xda\x1e\xfd\xdc\xd8\x01\x65\xe1\x3e\x35\x1b\xaa\xeb\xb5\x82\x32\xa2\xb8\x58\xb4\xcb\xae\x99\x42\xb1\x21\x29\x76\x43\xb7\x4a\x20\x29\x16\xc1\xab\x4a\x5d\x7f\xe3\x27\xd0\xa3\x48\x59\x46\x9e\x8d\x9b\x7a\xb3\xb3\xb7\x49\xa0\x47\x93\xd1\x24\x81\x7f\x52\xb5\xbb\xed\xba\x3f\x24\xcb\x6c\xaf\xcd\x5a\x0e\x14\x37\x5f\x63\x3d\x2a\x68\x7a\x52\x36\x8d\x1e\x7b\x3b\x9b\xc8\x8d\x17\xbd\x5d\xe7\x4d\x56\x3d\x9d\x4c\xbb\x16\x69\xff\xa5\xcd\x6f\x5c\xad\xcd\x09\x77\x60\x19\x59\xef\x2a\x89\x5b\x54\x9e\xca\x12\xd5\x97\x50\x39\xd8\xd4\xd3\xf8\x09\xaa\x79\x3e\x31\x9a\xc2\xbb\xe3\x1c\x37\x61\x7b\xb2\xc3\x0e\xa2\x9e\x1e\xd1\xfa\xd9\x09\xb5\x9f\x3d\xa2\xf7\xb3\xf0\xac\x27\x0b\xac\x16\xcf\xad\x20\x5d\x0b\x66\x58\x5c\x3d\xeb\x03\x62\x20\x46\x3c\xae\x7c\xf8\xd2\xd0\xec\x75\x26\x56\x26\xba\xaa\x0d\x6c\xbe\xb4\x3d\xa7\x24\x3a\xc7\x9c\xbf\x8f\xd9\x42\x1c\x06\x8d\xad\x06\x83\x4d\xeb\xa0\x45\x5d\xe9\x06\xfe\xc0\x80\xe2\xf6\x9c\x97\x83\xb6\xc5\x54\x77\x62\xb2\x9d\xf1\x58\xdb\xe2\xc9\x81\xaa\xb1\xc7\xba\x31\xc4\x99\xd8\x6b\xe8\x5a\xb4\xfd\xc1\x76\xec\xb6\xfc\x32\x66\x3c\xdf\x5e\x7e\x42\x60\x50\x26\xa8\xc2\x37\xcd\xb3\x88\x33\x47\x9a\x53\x64\xea\x73\xf0\xe3\x73\x9b\x8b\x07\xd8\x29\x55\xc6\xcd\x80\x99\x15\x4b\x28\x05\xcf\xaa\x14\x05\x88\x8a\x29\x5a\x60\x7c\xe3\x06\x5a\x45\xc6\xfa\x2a\x49\xd2\x9e\x48\x97\x58\x35\x4f\x54\xee\xe6\xf6\x5e\x7e\xc7\x7f\x75\xb4\xf2\xef\x75\xaf\xa7\xec\x99\xde\x45\x34\xef\xa5\xf4\x0a\xf3\x79\x23\xaa\x1d\xd4\x69\x39\x32\x65\x8f\x27\x49\xde\x60\xc1\xf7\x08\x6e\x74\x65\x8e\x85\x33\x30\x4d\xb8\x56\x68\xd9\xdb\x58\x3c\xc4\xc6\x20\x6e\x9b\xb1\xcc\xe2\x91\x0b\x2d\xfc\x41\x43\xff\xf1\x6d\xd1\x3d\xb3\x07\x9a\xf5\x47\x47\x9a\x8d\xdd\x83\xe8\x14\xa0\x82\x74\xba\x57\x74\x35\x88\x77\x6f\xae\x13\x2c\x7c\x49\x46\x7a\xa2\x7e\x5e\xc7\x85\x37\x61\x0b\x88\xee\xfb\x27\x52\x2e\x9a\x9d\xe9\xa6\xdd\x7c\x1d\xe6\xfb\x06\x3c\x26\x4e\xd8\x43\x09\x02\xae\xf7\xdb\x03\xd3\x04\xf1\x6b\x21\x7f\x1f\xa8\xeb\x82\x94\x61\xee\xdb\xa9\xbb\xf6\x72\x72\x5b\x28\x79\xec\x73\x4a\x24\x4e\xbb\xbe\x57\x0e\x4d\x9b\xe4\x9c\x36\x71\x93\xe5\x8e\x46\x8a\x95\x8e\xac\x41\xe9\x60\xd1\x13\xec\xdd\xd0\xb8\xfe\xc9\x58\xa1\xd1\x14\x25\xa1\x25\xba\x2a\xae\xf1\xef\xc6\xaf\xe7\xe2\x61\xd9\x98\x69\xbc\x1c\xb3\x95\x8f\x2e\x88\xf4\x49\xe5\xa8\x4c\x18\x12\x98\xf2\x3d\x8a\x03\x14\x34\xcb\x72\x7c\x20\x02\x21\x43\x92\xdb\xbe\x8d\xda\x51\x19\x08\xf3\x38\xa8\xeb\x21\x5c\xbd\x0f\x2f\x34\x26\x09\x18\x77\xda\x22\x43\x5d\xcc\x67\x70\x7f\x80\x2d\x5f\xb9\x77\xe4\x6f\xe1\xea\x35\xbc\x7a\x7d\x07\x2f\xaf\xae\xef\xe2\xa8\x29\x0b\xe2\x17\xbc\x3c\x08\xba\xdd\x99\x9e\x81\x79\x88\x87\xf6\xbd\x29\x98\xf3\x62\x70\x54\x92\xf4\x03\x71\xbf\x96\xb9\x71\x7f\xbb\xe0\x7c\xb7\xa3\x12\x36\x34\x47\x78\x20\x32\x14\xc6\x64\xda\x56\x1a\x50\x9c\xe7\xb1\x5e\xff\x32\xa3\x8a\xb2\xad\x31\x8d\xa5\x2b\xcc\x8e\xa5\xd0\xe1\x69\x53\x29\xc3\x6a\x87\x0c\x0e\xbc\x02\x81\x2b\x51\xb1\x80\x53\xb3\x85\x11\x9b\xb0\x2c\x8a\x22\x5a\x94\x5c\x28\xd3\x1c\x9f\x31\x54\x89\x8e\xe8\x33\xfd\xb1\xa5\x6a\x57\xdd\xc7\x29\x2f\x92\x2d\x5f\xf1\x12\x19\x29\x69\xa2\x39\x9d\x98\x46\x21\xb8\x90\x27\x16\x98\x52\x9a\x28\x3c\xb1\xc4\x85\xe2\xc7\x57\x24\x12\xd3\x4a\x50\x75\x98\x45\xc1\xb5\xe2\xea\xbd\x6b\xa3\x99\xec\x75\x9d\x3e\xce\x20\x1e\xbb\x24\x2c\xed\xb3\x0f\x78\x58\xc2\x33\x5b\xe2\x5f\xae\x21\x0e\x98\xe8\x59\x97\x2d\xfa\xfc\xdc\xf2\x1e\xd7\xa0\xff\xd4\x5c\x91\xd2\x95\xec\xfd\x8b\xac\xfb\xd9\x47\x1c\x16\xf5\xed\xcf\x2b\x8c\x4a\xed\x45\xfe\x28\x97\x71\x02\xc7\xf4\xbf\x01\x00\x00\xff\xff\xce\x58\xee\xc7\x33\x2c\x00\x00") +var _templatesServerResponsesGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xdf\x73\xdb\x36\xf2\x7f\xd7\x5f\xb1\xd5\x37\xed\x88\x1e\x89\xcc\xf7\xe1\x5e\xdc\xba\x33\xd7\x38\x77\x75\xe7\x1a\x7b\x62\xf7\x6e\xe6\x72\x99\x06\x26\x57\x12\x5a\x12\x64\x00\x50\x8e\x4e\xc3\xff\xfd\x06\xbf\x48\x80\x3f\x64\xd9\x6d\xf3\xd4\x3c\xc4\x22\x80\x5d\xec\x2e\x3e\xfb\x03\x4b\x1e\x0e\x90\xe1\x9a\x32\x84\xb9\x40\xbe\x43\xbe\x45\x92\x21\xbf\xaf\x69\x9e\x21\x9f\x43\xd3\xcc\x0e\x07\xa0\x6b\x60\xa5\x84\xf8\x4a\xfc\x95\x73\xb2\x87\xa6\x39\x1c\x40\x62\x51\xe5\x44\x2a\x4a\x5a\x54\x39\x8e\xd2\xc7\x66\x2d\xe6\x02\x07\x54\x39\x4d\x8f\x13\xb1\xcc\xec\xbf\xea\x7e\x76\xd2\x4e\xef\xd9\xca\x1c\x5f\x89\x37\x75\x9e\x93\xfb\x1c\x61\xd5\x34\xb3\x1d\xe1\x70\x38\xc0\x8e\x70\x46\x0a\x84\xf8\xea\x12\x9a\x06\x84\xe4\x94\x6d\x66\x74\xad\xe6\xe2\xb7\x98\x22\xdd\x21\x7f\xa3\x56\x34\x4d\x7c\x38\x40\x45\x44\x4a\x72\xfa\xdf\x96\xe2\x8b\x0b\x60\x34\x87\xc3\x0c\x46\xd8\x5d\x80\xdd\xfc\x6f\x25\x2f\x88\x94\xc8\x8d\x36\xc1\xf3\xe2\xec\xc4\xbd\xa2\xc0\x78\xdd\x39\xbc\xaa\x85\x2c\x0b\x9f\xe5\x59\x6b\xb1\x13\x59\xb7\x36\x1a\xf2\x8a\x6f\xb5\x4d\x16\xd1\xe1\x80\x2c\x53\x4b\xf5\x9f\x99\x36\x6c\x27\x4e\x4f\xf3\xf3\xd3\x54\x7f\x96\xe6\x7f\x90\x42\xd6\x66\x0a\x1c\xe6\xfc\x7b\x2a\x7d\x71\x01\xf3\xb9\x3e\x68\xfe\x10\x7f\xaf\x61\xb6\x88\xe2\x5b\x94\x4a\x8b\x8a\x53\x26\xd7\x30\xff\xf2\xe3\x1c\x62\x2b\xd7\x72\xc8\x24\x9a\xb5\xfb\xf4\x20\xac\x1c\x80\x4a\x2c\x9e\x85\xe2\xf8\x9f\x24\xaf\xf1\xf5\xa7\x8a\xa3\x10\xb4\x64\xd0\x34\xb7\x3d\x2c\x0f\x57\xf4\xa0\x3b\xca\xe3\x09\x00\x1e\x92\x7b\xa7\x36\xb1\xe2\x37\xc1\x6e\x65\xac\x32\x2a\xf7\x13\xe0\x77\x54\xee\xdf\x4d\xec\x01\xb8\x46\xc5\xee\x20\x36\xbe\xe2\x2d\x5c\x00\xa9\x2a\x64\xd9\x84\xe8\x6f\x97\x53\xbc\xfb\xc8\x0b\x80\x37\x05\xba\x7e\x90\x7c\xb5\xa5\x79\x36\x2a\xd7\xbb\xf7\x16\x6e\xeb\x92\xc3\xcf\xcb\x93\xa8\xd4\x29\x71\xc2\x36\x38\x05\x50\x63\x88\x55\x1b\xea\x0c\xa3\xa9\xc4\x73\xd4\x83\x0c\xed\xb3\x12\x90\x4f\x69\x8f\x30\x48\x84\x46\xaa\x1b\xc2\x91\x49\x07\xca\x61\x34\x14\x0f\x64\x13\xff\x50\x52\xf6\xdd\xde\xe0\x65\x71\x92\x61\xb5\x25\x83\xe0\xf2\xaa\xcc\x73\x4c\x25\x2d\x99\xe1\xa3\xa3\x0a\x5d\x43\x8e\x6c\x31\x8c\x37\xf0\x2d\xbc\xd4\x76\xdc\xee\xac\x53\x84\x0b\xde\xbd\x7c\x3f\x03\xa5\xca\x76\xe7\xa1\xef\x09\x21\x6e\xbb\x8b\x66\x00\x4f\xf0\xcb\xcf\x65\x88\x51\x27\x68\xcd\x31\xb1\x40\x58\x23\x8d\xcd\xb5\xa6\x9a\xa4\xf5\x0d\xf8\xbb\x3b\xb0\xf0\xed\x6c\x71\x18\xfe\x0c\x8b\x37\x8e\xa2\x2a\x99\x40\xbf\x6e\x53\x06\x2e\x33\x84\xd5\xff\x43\xd3\x24\x09\x1c\x0e\x5e\xde\x54\x47\xda\x34\x7a\x9e\x0a\x90\x5b\x84\xef\xef\xee\x6e\x20\x55\x03\x1c\x65\xcd\x19\x66\xa0\xdc\x5b\xee\x2b\xed\xb2\x03\xda\x59\x5a\x32\x21\x47\xa7\x0c\x5b\x26\x4d\x46\x31\x52\xf8\x85\xdd\x2c\x39\xb3\x51\xf5\x12\x45\xca\x69\x25\xdb\x50\xdb\xe3\xa5\x03\xc3\x01\xee\xf3\x32\xfd\x35\x2d\x8b\x42\x79\xdd\x80\x48\x01\xf1\x08\xf1\xb6\x2e\x08\xf3\x07\x5d\x98\x9e\x29\x74\x6e\x90\x9f\x3b\xeb\xa9\xd5\x29\x29\x30\x60\x31\x3b\x4b\x66\x13\x46\xb0\x45\x64\x9d\x4a\x07\x33\xba\x06\xfc\xe8\xdb\x7d\x06\xf0\xb3\x90\x44\xd6\xc2\x19\xc5\x2c\x6c\x0b\x36\x13\x13\xad\xff\x09\x75\x52\x67\x87\xc3\xa8\x69\x8e\x1b\xc1\xd9\xd6\x89\x11\xff\x48\x3e\xd1\xa2\x2e\xcc\x98\x7d\x38\x77\x93\xaf\x3f\xa5\x79\x2d\xe8\x0e\xbb\x55\xdf\x04\x62\x79\xe4\xfe\xb0\x66\x4c\x99\xc7\xd8\x3c\x8c\x30\x6e\x57\x7d\xdb\x63\xdc\x4e\x0c\x18\xd7\xb9\xa4\x55\x8e\xd7\x6b\xcb\xdb\x3e\xc3\xf5\x5a\xf3\x0f\x17\x0c\xa8\xc9\xa7\x7f\x20\xdb\xc8\x6d\xab\x31\x98\x67\x4b\xeb\x4d\x8f\x68\x14\x90\x52\x16\x92\x7a\xd3\x7d\xd2\x1b\x5d\x0b\x30\x43\x68\x1f\x0c\x55\x37\x33\x22\xe9\x95\x4a\x5d\x9d\xa0\xfa\xb1\x95\xd3\x4d\x8e\x88\xe9\xd3\x51\x16\xd0\x75\x93\x7d\xba\x9f\x18\xfd\x58\xa3\x47\x6a\x06\xce\x41\xf2\x1a\xfb\x8b\xbf\x27\xe2\x12\xd7\xa4\xce\xa5\x59\x6b\x1f\xce\x83\x88\xfc\x7f\xbb\xb9\x42\xa0\x5b\xe6\xa3\xef\x2c\x31\x10\x1c\xf7\xc5\xf8\xef\xe5\x9d\xf2\xa5\xa6\x81\x0f\xbf\x88\x92\x9d\xcf\x0f\x07\x1b\x34\xbc\x24\xfb\x16\x3f\xd6\x94\xa3\xe2\xb8\x2c\x0b\x95\xe6\x2b\xb9\xef\x0b\x7a\x25\x7e\xb8\xbd\x7e\x63\x2a\x30\xb5\xd0\x94\x24\xed\xaa\xf9\x07\xdf\xd1\x3a\xb7\xb8\x4d\xb7\x58\x10\xc3\xe6\x81\xca\xad\x37\x32\x03\xf8\x6d\xce\xf7\xa7\xe7\xfd\xe9\x79\xcf\xf0\xbc\x19\xc0\x15\x3b\x87\xef\xca\x6c\xaf\x1d\xc8\x9f\xb8\x21\xfb\xbc\x24\x99\x3d\x64\xc2\x32\x58\x68\x17\x31\xa0\x8d\xaf\xc4\x77\x44\xa0\x72\xa9\xc8\x1b\x7b\x55\x16\x55\x8e\x9f\xae\xef\x7f\xc1\x54\x0e\x3a\x04\x76\xd9\xc0\x13\xef\xcb\x6c\xdf\xb9\x5b\xcf\x7f\x54\xd2\x4e\xe0\x0d\x3e\x8c\xbb\x76\xca\x91\x48\x14\x13\x8e\xaf\xfd\x2c\xb3\xe1\x62\x6b\x33\xdd\x4e\x55\x3d\x62\xb6\xae\x59\x3a\xc9\x77\x31\x96\x52\x53\x9b\x48\x5b\xe1\x22\x38\x9b\x08\x38\xe3\x29\x99\xae\x4d\x9d\xf3\xcd\x85\xad\x0f\xc1\x3c\x5f\xc0\x5f\x5e\xbe\xd4\x75\x57\x70\x6b\xd7\x51\xd1\x08\xad\xa2\xe3\x6d\x59\xa0\x0d\x7d\xf6\x50\xd5\xc5\x69\xa1\x82\x47\x02\x94\x51\x49\x8d\x14\x4e\xcf\x40\x79\xab\xb4\xb6\xec\x20\xf3\x6b\x49\xda\x40\xe5\x05\xe2\x55\x3b\x67\xe7\xbd\xb2\xbe\x69\xdc\xaa\x0b\x6f\x8d\x59\xb7\x72\x98\x89\xaf\xc4\x0d\xa7\x05\x95\x74\x87\x63\x57\x59\x8d\xa9\x85\x89\xa0\xaf\x4a\x26\x09\x65\x02\xe2\x7f\x23\x2f\x61\xbe\xf8\xcf\x7c\x0e\x51\x64\xc1\xa3\xc7\xd4\xcf\xe4\x4c\x95\x3e\xeb\x42\x9a\x0a\xb1\x53\x9c\x03\x37\xe1\x5b\xc0\x4f\xac\x20\x5c\x6c\x49\x7e\x87\x9f\xe4\x22\x5a\x02\xc6\x9b\x18\x2e\x89\xc4\xa5\xfe\x5f\xd2\x42\xfd\xaa\x39\xd1\x91\xf4\x2c\x09\xf4\x74\x3a\xe8\x7b\xc6\xa9\x8a\x1c\xd3\x41\xcb\x6d\x71\xaf\xb1\xb5\x9a\xcc\x68\xd1\x51\x05\x25\xf9\x15\x85\x6d\xb9\x3c\x59\xea\xc5\x78\x23\x2f\x52\xa7\xfc\x34\xf1\x38\x6e\xea\x9c\x70\xd8\x94\x6a\xa1\x65\x3f\x10\xf6\x11\xf9\xda\x1b\xb6\xde\x7e\x05\xc9\x19\x5c\x96\x3a\x0d\x7b\x58\x5e\xf3\xb2\x80\xaa\x14\x82\xde\xe7\xe8\xc0\x2c\x80\x32\x60\x28\x24\x66\x40\x14\x0b\x01\x67\x49\x0f\xab\x63\x58\x74\x17\x7b\xef\x20\xdd\xd0\xb0\xc5\xd2\xc7\x5c\x2b\x94\x81\x8c\x90\x9c\x48\xdc\xec\x8d\x97\xf5\xf0\x36\xa6\xfa\x40\xfd\xb0\xcd\xb0\x7a\xe2\x8e\x2a\x72\xc6\xed\xb6\xa7\x6d\x39\x61\x84\x45\xd0\xf5\x78\x04\x1d\x8a\x9f\xb6\xf9\x95\x77\xd2\x41\x45\x76\x2a\x3e\xce\xc1\x34\xd4\x41\x37\x45\x1e\x43\x4e\xa0\x8b\xb9\x73\x4d\xd6\x84\xc9\x19\x90\x3c\x87\x52\x6e\x91\x43\x4a\x04\x0a\x58\xe8\x00\x20\x74\x02\x8a\xe0\x9d\xd8\x96\x75\x9e\x69\xb0\x95\x69\x5a\xf3\xf7\x47\xb7\x74\x29\xf1\x99\xb2\x28\x09\xda\x62\x6f\xca\x29\xfc\x3d\x82\x81\xe0\x21\x9a\xcd\xc6\xe2\xf7\x68\xe0\xb6\x3e\x95\x12\xce\xf7\x50\xb2\x10\xa3\x93\xe0\x0a\x1c\xa9\xcb\xfd\xbf\x35\x8e\xbb\x30\x3e\x96\x3f\xe2\xd0\x7b\xde\xbd\xbf\xdf\x4b\x1c\xb4\x82\xbc\x18\x14\x75\xe2\x8d\x05\x93\x30\x63\xd1\x35\x94\x1c\x16\x4f\x8e\x00\xd1\x88\x87\x7a\x9c\x55\x72\xe7\x1c\xce\x2f\xfa\x9e\x68\xc5\xff\x70\x38\xb4\xe2\x8b\x39\x2c\xd4\xaa\x56\x89\xa8\x69\x3e\x44\x4b\xf8\x6a\xd0\x27\x73\xf3\x5f\x6b\xe6\x5e\xe7\xbc\xfb\x97\x24\x50\x11\x46\x53\xa1\x44\x10\x15\xa6\x74\x4d\x53\x73\x88\x54\x05\xc6\x1d\xc9\x69\x16\x50\x14\x62\xa3\xe4\x5c\x17\x32\xbe\x35\x32\x2d\xe6\x76\x5d\x58\x1e\xe8\xb6\x8b\xa9\x1e\x86\x2d\xbc\x73\xf8\x72\x37\x5f\x22\xe7\x51\xc0\x5c\xcb\xb2\x28\xc4\xc6\x1f\xee\x1d\x81\x6b\x1e\x1d\x47\x77\xf8\xd2\xad\x5d\x61\x7a\x42\xda\x56\xc3\x42\xab\x6d\x82\x0d\x6a\x2d\xaf\xf7\x71\xae\x8b\xac\xa5\xcf\x74\xbc\x0c\x9a\xb8\x88\x8e\xdd\x2a\x95\x3d\xfa\x95\xb1\x05\x4a\x64\x1f\x15\x1b\xaa\x6e\x6b\x05\x65\x44\x96\x3c\x6a\x97\x5d\x31\x89\x7c\x4d\x52\xec\x86\x6e\x25\x47\x52\x44\xc1\x9b\x97\xa6\xf9\xca\x2f\x9f\x47\x91\xb2\x9c\x79\x36\x76\xb7\xcd\xce\xde\xba\x7c\x1e\x2d\x45\x93\x04\xfe\x45\xe5\xf6\xb6\xeb\x10\x91\x2c\x33\xfd\x38\x63\x39\x90\xa5\x7e\x1a\xeb\x63\x81\xeb\x5b\x99\x22\x7a\xec\xfd\xda\x44\x65\x1c\xf5\x76\x5d\xb8\x9a\x7a\xba\x94\xb6\x6d\xd4\xfe\xdb\x38\xbf\xb9\x75\xa1\x4f\xb8\x03\xcb\xc8\x7a\x7b\x8f\xb8\x45\xe9\xa9\x2c\x50\x7e\x0e\x95\x83\x4d\x3d\x8d\x9f\xa0\x9a\xe7\x13\xa3\x05\xbc\x3d\xce\x71\x13\xb6\x27\x3b\xec\x32\xaa\xe9\x11\xad\x5f\x1c\x51\xfb\xc5\x23\x7a\xbf\x08\xcf\x7a\xf2\x7a\xd5\xe2\xb9\x15\xa4\x6b\xd3\x0c\xaf\x56\x2f\xfa\x80\x18\x88\x11\x8f\x2b\x1f\xbe\x8d\x70\x7b\x9d\x88\x95\x89\xce\xab\x83\xcd\xe7\xb6\xe7\x94\x44\xa7\x98\xf3\xf7\x31\x5b\x88\xc3\xa0\xad\xe5\x30\xe8\x1a\x07\x2d\xea\x2a\x3b\xf0\x07\x06\x14\xbb\xe7\xa2\x1a\x34\x2d\xa6\x7a\x13\x93\xcd\x8c\xc7\x9a\x16\x4f\x0e\x54\xce\x1e\x17\xce\x10\x27\x62\xcf\xd1\xb5\x68\xfb\x83\xed\xd8\x6d\xf9\x79\xcc\x78\xba\xbd\xfc\x82\x40\xa3\x8c\x53\x89\x6f\xdd\xab\x13\x6b\x8e\x34\xa7\xc8\xe4\x73\xf0\xe3\x73\x5b\xf0\x07\xd8\x4a\x59\xc5\x6e\x40\xcf\xf2\x25\x54\xbc\xcc\xea\x14\x39\xf0\x9a\x49\x5a\x60\x7c\x63\x07\x5a\x45\xc6\xba\x2a\x49\xd2\x9e\x48\x57\x58\xb9\xd7\x58\x36\x73\x7b\x6f\x87\xc7\xbf\x4c\x5a\xf9\x79\xdd\xeb\x28\x7b\xa6\xb7\x11\xcd\x7b\x9b\x7a\x89\xf9\xc2\x89\x6a\x06\x55\x59\x8e\x4c\x9a\xe3\x49\x92\xb7\x58\x94\x3b\x04\x3b\xba\xd2\xc7\x52\x32\xd0\x2d\xb8\x56\x68\xd1\xdb\x98\x3f\xc4\xda\x20\x76\x9b\xb1\xca\xe2\x91\x84\x16\x7e\xf4\xd0\x7f\x41\x17\x75\xaf\xe2\x03\xcd\xfa\xa3\x23\xad\xc6\xee\xa5\xe9\x14\xa0\x82\x72\xba\x77\xe9\x72\x88\xb7\xef\x65\x27\x58\xf8\x92\x8c\x74\x44\xfd\xba\xae\xe4\xde\x84\xb9\x40\x74\xcf\x3f\x92\x2a\x72\x3b\xd3\x75\xbb\xf9\x45\x58\xef\x6b\xf0\xe8\x38\x61\x0e\x25\x08\xb8\xde\xf7\x09\xfa\x3a\xee\xdf\x85\xfc\x7d\xa0\x69\x0a\x52\x85\xb5\x6f\xa7\xee\x85\x57\x93\x9b\x8b\x92\xc7\x3e\xa7\x44\xe0\xb4\xeb\x7b\xd7\xa1\x69\x93\x9c\xd2\x24\x76\x55\xee\x68\xa4\x58\xa9\xc8\x1a\x5c\x1d\x0c\x7a\x82\xbd\x1d\x8d\xed\x9e\x8c\x5d\x34\xdc\xa5\x24\xb4\x44\x77\x8b\x73\xfe\xed\xfc\x7a\xc1\x1f\x96\xce\x4c\xe3\xd7\x31\x73\xf3\x51\x17\x22\x75\x52\x39\x4a\x1d\x86\x38\xa6\xe5\x0e\xf9\x1e\x0a\x9a\x65\x39\x3e\x10\x8e\x90\x21\xc9\x4d\xd7\x46\x6e\xa9\x08\x84\x79\x1c\xd4\xcd\x10\xae\xde\x43\x5b\xde\xbf\xd0\x9f\x04\xa5\xd2\xc4\x2d\x17\x81\x9e\x1e\x0d\xc3\xe1\xeb\x0a\x4d\x8b\xd4\xce\xb7\xdc\x17\x91\x3a\x95\xb1\x2b\x5b\x92\x80\xf6\xea\x0d\x32\x45\x8b\x19\xdc\xef\x61\x53\xae\xec\x2b\xef\xaf\xe1\xf2\x1a\xde\x5c\xdf\xc1\xeb\xcb\xab\xbb\x78\xe6\xc4\x8f\x5f\x95\xd5\x9e\xd3\xcd\x56\xb7\x2e\xf4\x37\x03\xd0\xbe\xf4\x0a\xe6\xbc\x54\x30\xab\x48\xfa\x2b\xb1\x1f\xf6\xdc\xd8\xdf\x36\x47\xdc\x6d\xa9\x80\x35\xcd\x11\x1e\x88\x08\x85\xd1\x05\xbf\x91\x06\x64\x59\xe6\xb1\x5a\xff\x3a\xa3\x92\xb2\x8d\x3e\x21\x43\x57\xe8\x1d\x2b\xae\xa2\xe4\xba\x96\x9a\xd5\x16\x19\xec\xcb\x1a\x38\xae\x78\xcd\x02\x4e\x6e\x0b\x2d\x36\x61\xd9\x6c\x36\xa3\x45\x55\x72\xa9\x3b\xf4\xf3\x75\x21\xe7\xea\x2f\x43\x99\xa8\x04\x33\x9f\xa9\xa7\x0d\x95\xdb\xfa\x3e\x4e\xcb\x22\xd9\x94\xab\xb2\x42\x46\x2a\x9a\x20\xe7\x25\x17\xf3\xe9\x05\x36\xb0\x3f\xbe\x22\x11\x98\xd6\x9c\xca\xfd\x91\xa5\x4a\x81\x23\xd3\xba\x4f\x40\xe4\x29\x9b\x75\x90\xd7\xda\xa9\x93\xd5\x16\x10\x6d\xe3\xe3\xca\x3e\xb7\x59\xcc\xcd\x7b\x13\x41\x8f\xcb\xa5\x61\x61\x31\xd6\x4f\x96\xdd\xe7\x27\x71\xd8\x38\x68\x3f\xf3\xd0\xfb\xb6\xc5\xc2\xa3\x5c\xc6\x09\x1c\xe2\x8e\xf9\xda\xf4\xa7\x1a\x6f\x4a\xa5\x78\x8e\x0a\xcd\x98\xb5\x54\xfe\x17\x1c\x9d\xe9\xe2\x76\x5e\x39\xb7\x71\xe0\x71\x67\x9d\x60\xdb\xf7\xe1\x71\xd7\x35\x9c\x4f\xe0\xbb\x78\x8c\x9f\xf9\x56\xf5\x58\x97\x66\x42\x50\x13\x48\x3d\xcd\x7b\x1b\xdb\x38\x3b\x2f\x5d\x10\x02\x52\xcb\x2d\x32\x69\xfb\x5d\x13\x37\x97\x2d\x11\xba\x34\xda\xa3\x84\x7b\x44\x06\xb4\xe3\x39\x5f\x5a\xa6\xd1\xd2\x75\x47\xa6\x8f\xad\xd3\x90\xba\xc4\x3e\x7d\x56\x13\x9f\x1e\x78\x56\x0f\xca\xd8\xff\x05\x00\x00\xff\xff\xb9\x14\xb8\x74\x05\x2f\x00\x00") func templatesServerResponsesGotmplBytes() ([]byte, error) { return bindataRead( @@ -575,12 +742,12 @@ func templatesServerResponsesGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/server/responses.gotmpl", size: 11315, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x29, 0xae, 0x2a, 0x6c, 0xf8, 0x44, 0x5b, 0x94, 0x6e, 0x4b, 0xd2, 0xa4, 0xb, 0x7c, 0xac, 0xcf, 0xe, 0x6e, 0x81, 0x70, 0x4e, 0x55, 0x6b, 0x15, 0x47, 0xf1, 0x9d, 0x52, 0xcf, 0xab, 0xdb, 0x5d}} + info := bindataFileInfo{name: "templates/server/responses.gotmpl", size: 12037, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb5, 0x1d, 0x82, 0x1f, 0x70, 0xed, 0x78, 0x0, 0x19, 0xe2, 0xd, 0xe5, 0x9b, 0xa9, 0x6, 0x88, 0xd9, 0x2, 0x7a, 0xca, 0x1, 0x6c, 0x8c, 0xb3, 0x34, 0xf1, 0xd3, 0x69, 0xd6, 0x1a, 0x43, 0x81}} return a, nil } -var _templatesServerServerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x3c\x7f\x73\xdb\xb8\xb1\x7f\x8b\x9f\x62\x4f\x6d\x7d\x54\x46\x22\xf3\xa3\xb9\x69\xdd\xf3\x9b\xf1\x39\x4e\xe2\xc6\x49\x34\x91\xee\xee\x75\x6e\x6e\x7c\x30\x09\x49\x78\xa6\x00\x16\x80\x2c\xeb\x3c\xfa\xee\x6f\x16\x3f\x48\x90\xa2\x6c\xc7\xcd\xf5\x5a\xcf\x24\x12\xc1\x05\xb0\xbb\xd8\x5d\xec\x2e\x16\x4a\x53\x38\x11\x39\x85\x39\xe5\x54\x12\x4d\x73\xb8\xdc\xc0\x5c\x8c\xd4\x9a\xcc\xe7\x54\xfe\x0d\x5e\x7d\x84\x0f\x1f\xa7\x70\xfa\xea\x6c\x9a\x44\x51\x74\x7b\x0b\x6c\x06\xc9\x89\x28\x37\x92\xcd\x17\x1a\x46\xdb\x6d\x9a\xc2\xed\x2d\x64\x62\xb9\xa4\x5c\xb7\xde\xdd\xde\x02\xe5\x39\x6c\xb7\x51\x14\x95\x24\xbb\x22\x73\x8a\xc0\xc9\xf1\xf8\x6c\xec\x1e\xf1\x1d\x5b\x96\x42\x6a\x88\xa3\x5e\x3f\x13\x5c\xd3\x1b\xdd\xc7\xaf\x72\x53\x6a\x91\xea\x42\xe1\x13\x95\x52\x48\xf3\xad\x10\x73\xfc\xe0\x54\xbb\x8f\x74\xa1\x75\x89\xdf\x85\xb2\xff\xa7\x8a\xcd\x39\x29\xf0\x41\x69\x99\x09\x7e\x6d\xbe\x6e\x78\xe6\x3f\x53\xa2\xc5\x92\xb9\x47\x95\x91\xc2\x00\x6b\xb6\xa4\xfd\x28\x8a\x00\xfa\x73\xa6\x17\xab\xcb\x24\x13\xcb\x74\x2e\x46\xa2\xa4\x9c\x94\x2c\x45\xbe\xf4\x23\x00\xc7\x87\xef\x15\x7d\x23\x26\x5a\xae\x32\xfd\xba\x20\x73\x05\xdb\xed\xcc\x7c\x86\xdd\xff\x8f\x2a\x45\xaf\xf3\x2b\x1c\xc7\xbc\x75\x03\x20\x63\x46\xdb\xed\xfe\xc9\xe4\x8a\x23\x42\x29\x76\x32\x2c\x09\xe7\x1d\x87\x13\x36\x46\x50\xe5\xec\xd9\x8b\xb4\xc4\xf6\x9d\x99\xea\xfe\xbe\x7b\xdf\xc3\x21\xa7\x18\xef\xc4\x4e\x14\x84\xcf\x13\x21\xe7\xe9\x4d\x8a\xec\xe6\x54\xaf\x34\x2b\xfa\x91\x05\x95\x84\xcf\x29\x24\xaf\xe8\x8c\xac\x0a\x7d\x66\xd6\x12\x87\xbe\xbd\x85\x52\x32\xae\x67\xd0\xff\xd3\x3f\xfb\x90\x80\x47\xc1\x89\x44\xd0\xf9\x8f\x57\x74\x33\x84\x3f\x5e\x93\x62\x45\xe1\xf0\x08\x92\xc6\x28\xf8\x16\xb6\x5b\x68\x0d\xe8\xc0\x5b\xa3\x0e\xa2\x28\x13\x5c\x19\x69\x52\xd9\x82\x2e\xe9\xdb\xe9\x74\x0c\x70\x04\x7d\x27\x26\x75\xeb\xc4\xb7\xaa\xaa\xf9\x7b\xce\x6e\x0c\xf0\x8a\xb3\x9b\x3e\x8e\x76\x4d\x24\xe4\x96\xb6\x89\x01\x51\xf0\xd3\xcf\x96\x59\x51\x34\x5b\xf1\x0c\x18\x67\x3a\x1e\xc0\x6d\xd4\x6b\xc1\x1d\x55\x90\xb7\x8e\xf5\xf1\x82\xa8\x33\xae\x68\xb6\x92\x14\x12\x07\x37\x40\xbc\x7b\x01\x5e\x43\x4b\x8e\x21\xde\x75\x9a\xdc\xd3\x65\x32\xac\x58\xe0\x3a\xa1\x26\x11\xc6\x15\x24\xa7\x37\x5a\x12\x8f\x93\x25\xac\xd1\x1f\x69\xae\xbb\x47\xbd\x6d\xb4\xf5\xaa\xce\x85\xde\x15\xf3\xed\xd6\x30\x25\x76\xd2\x74\x7a\x93\x15\xab\x9c\x4e\x4a\x9a\xd9\xc5\x50\x25\xcd\x5e\xb3\x82\x82\xff\x73\xdc\x0a\x96\x89\x72\x72\x59\xd0\xfc\x9c\x29\x8d\xa6\x27\x60\x29\x40\x56\x50\xc2\x57\xe5\x94\x2d\xa9\x58\x69\x00\x40\x2d\x48\x5e\xad\x24\xd1\x4c\xf0\x08\x60\x2e\x49\x46\x67\xab\xa2\x82\x68\x03\x2c\xc9\xcd\x5b\x4a\x72\x2a\x27\xec\x57\x83\x85\x53\xa1\xe4\xbb\x8d\xa6\xd8\x86\x92\xab\x44\x76\x45\xf5\x98\xe8\x85\xc7\x2f\x02\x58\x08\xa5\x77\xd1\x36\xd6\xc9\xff\x31\xae\x23\x80\xc2\x60\x7e\xce\x96\x4c\xfb\xa6\x2b\x4a\xcb\xe3\x82\x5d\x9b\x19\xdb\x28\x49\x4a\xf2\xbd\xf8\xae\x25\xd3\xd4\xbf\x6d\xbe\x8c\x00\x74\xa1\xde\x86\x68\x05\x88\xe9\x42\x8d\x43\xdc\x3c\x2a\xba\x50\xe7\x21\x82\x41\xfb\xbb\x10\xcb\x5d\x54\x74\xa1\x3e\x85\xa8\x76\x42\xfc\x18\xe2\xdb\x09\x71\x42\xa5\x66\x33\x96\x11\x4d\xdb\x08\x07\xaf\xde\xd1\x4d\xf3\xd5\x71\xa3\x9f\x7b\x35\xa8\xf6\x1d\x6f\xb7\xb6\xdb\x28\x4d\x61\x62\x5e\x4f\x0a\x96\xd1\x1f\x88\x04\xb5\x2a\xcd\x3a\xcd\x84\x34\xeb\x1d\xe9\x4d\x49\x41\xd9\xd7\x68\x28\x5a\x5a\xcb\xe9\x7a\x52\xbd\x8c\xaf\x49\x51\x0b\xe1\x10\x4a\x78\xe2\x1f\x06\xf0\x24\x18\xe4\x36\xea\x3d\x29\xe1\x08\x10\x3e\xea\x49\xaa\x57\x92\x43\x1c\x40\x0c\xe2\x72\x80\xfa\x63\xe6\x88\x55\xd8\x79\x00\x13\xaa\x71\x26\xf0\x23\x9b\x4d\xcd\x8c\x89\xc6\xa2\x86\x8c\x9d\x31\x4e\x26\x65\xc1\x4c\x97\x21\xf4\x87\xfd\xc1\xa0\x9a\x92\xb3\x62\xef\x2c\x6f\x28\x9a\x23\xc6\x35\x95\x33\x92\xd1\xdb\x2d\xdc\x82\xeb\xe6\x89\x8a\x9f\xa0\x09\xd9\x87\xa5\x05\x19\x38\x34\xeb\xde\x1e\xab\xbf\x0b\xc6\xe3\x70\x28\x8b\x1d\x98\x65\x41\x05\xbf\x6f\x69\x02\xbf\xa0\x69\x41\xdb\xba\x7b\xb4\xa3\xba\xf1\xb3\xa7\xe6\x6f\xb0\xcf\xfa\x60\x87\xc4\x22\xf0\x03\x91\xe3\xf8\xc0\x9b\xa3\x21\xf4\xf1\x6b\x7f\x08\x7d\xff\x4f\x2f\x28\x38\x5f\xc7\x58\x2d\x2b\x7a\x4c\x70\xd0\x02\x14\x95\xd7\xb4\x3f\xd8\xdd\xb3\x5a\x5b\x68\xd4\x33\x53\xfe\x40\x64\xdc\x94\xa9\xe6\x6e\x30\x84\x83\xb6\xd5\x43\xbe\x19\x13\x4c\x3c\x32\x45\x65\x10\xb5\x00\x0b\x3e\x04\xbd\x60\x0a\x32\xc2\xe1\x92\x82\xa4\x25\x35\x8e\x1a\xe1\xb9\xdf\x96\x0c\xb0\x21\xc5\xd9\x78\xc6\xa1\x4d\x59\x7f\x10\xf5\x02\x13\xdf\xe1\x48\x38\x32\x9a\x4b\x17\xef\xe0\xec\x51\xa6\xfd\x21\xb4\x09\xfc\xb7\x92\x60\xb0\xf5\x56\xc7\xa0\xda\xdc\x38\x86\xd0\x77\x0d\x23\x6d\x5b\xfa\x43\x78\xf6\xf4\x89\xb1\x56\x13\x9a\x09\x9e\x0f\xa1\x6f\xf6\x12\x28\xa9\x64\x22\x37\xf2\xb9\x5e\xb0\x6c\x81\xd8\xac\x09\xd3\x70\x49\x67\x42\x52\xb8\x62\x45\x81\x9a\xc0\xf2\x82\x42\x26\x38\xa7\x19\xce\xaa\x10\xa5\x5d\x3c\x5a\xfb\x93\x9f\x65\xb6\x2a\x42\x4c\x5e\x3e\x0a\x13\xb5\x58\x69\x8d\xa8\xe4\x62\xed\x58\x84\x62\x2a\x2b\x4c\x0c\x06\x0d\x25\x1a\x42\x7f\x49\x6e\x46\x0b\xd3\x30\x52\xec\x57\x5c\x3a\xe3\x68\x4b\x51\x28\x33\xc6\x92\xdc\xb0\xe5\x6a\x09\x7c\xb5\xbc\xa4\x12\xc4\x0c\x2e\x37\x9a\xaa\x60\x7c\x58\xb3\xa2\x30\xbb\x18\x94\x44\x2a\xc4\x00\x5f\x4a\xfa\xcf\x15\x55\x1a\xec\xe0\x5f\x2b\xb8\xa2\x1b\x65\x16\xd6\x38\x67\x6a\x08\x8c\xa3\x7e\xb6\xe1\x0b\xc6\x69\x02\x67\x1a\x72\x41\x95\xf1\x32\x0a\xb3\x53\x99\x09\x51\xf1\xc5\xac\x01\x7f\x29\xf2\x4d\x7f\x10\x35\x64\xd4\x50\x5a\xef\xe2\x28\x98\xe6\x61\x54\x12\xbd\x40\x12\xd3\x6b\x22\xd1\x8b\x4e\xb5\xc8\xc5\x08\xe5\x32\x41\x08\xaf\x6b\xe8\x08\x39\x2f\x00\xb9\x6c\xe5\x16\x04\xef\x9c\x07\x1d\x83\x21\xf4\xf1\x03\xfb\x17\x22\x23\x85\x7f\xc0\xc1\xce\xc6\xed\x31\xec\x10\x67\x5c\x9b\xfe\x68\xff\x86\xd0\xc7\x8f\xfe\x10\x9e\xba\x5e\xc6\x2a\x86\xfd\xcc\xc2\x33\xef\x20\x06\x92\x36\x6c\x68\x0a\x41\xbf\x39\x17\x4b\xcb\xe5\x9d\xc9\x02\xe7\x04\x71\x35\x4f\x23\xc3\x60\x37\x77\xcd\xec\x7a\xc5\xc5\x4a\x2b\x4d\xb8\x59\x2a\xc7\xf6\x3d\xf2\x5d\x39\x3a\x43\xe8\xe3\xf7\x11\xc1\x87\xfe\x10\x5e\x58\x91\x7e\xcf\xf8\x4a\x1b\x73\x4b\xb5\x95\xa1\xe9\xc9\x18\x6a\x48\x70\x5a\xa0\x90\x60\x92\x65\xb4\x44\x6b\x10\x10\x6b\x24\xa3\x94\x2b\x4e\x15\xe4\x28\x72\xd8\x3f\x78\x0f\x31\xd0\x64\x9e\x40\x56\x08\x23\x89\x05\x29\xb5\x28\x61\xc9\xf2\x11\xaa\x45\x21\x48\x3e\xe8\x46\x3d\x70\xc3\x86\xd0\xc7\xa7\x40\x25\x5f\xb4\x8d\x83\x57\x8b\xdc\x0d\xe1\x95\x50\xb3\x25\x4e\x8b\xde\x8f\xd1\x88\xa6\xb0\x76\xcf\x1c\xfa\x78\x43\xe8\x9b\xc7\x7f\x71\x6e\x33\x46\x3d\xb9\x2a\x05\x57\xb4\x53\x7a\x9d\x0b\x89\x52\x57\xa8\xd1\xa3\x85\xd8\xb9\x9b\x6e\x98\x07\xc9\xf2\x23\x25\xb9\x89\x7b\xe0\x15\xba\xb9\xb3\xba\x25\xdc\xcb\x83\x66\x98\x61\x04\xa2\x05\xac\x14\xdd\x83\xc9\xfd\xb3\xbd\xc3\xb0\xd4\x4c\x78\x45\x37\xe1\x44\xa5\x64\xd7\x38\x09\x46\xa6\xf7\x4f\x04\xf1\x9a\xe9\x05\x2e\x59\x49\x94\x2a\x17\x92\x28\x3a\xd8\x37\xfb\x71\x07\xb5\x64\x1f\x91\x64\xa5\x17\x42\x32\xbd\xe9\x24\xfd\x92\x22\x52\x39\xe0\xec\xb0\x5c\xe9\x15\x29\xd0\xcd\x36\xbd\xba\x16\xf7\xbc\x61\x37\x70\xe6\x2f\x6e\x3b\xc2\x08\xa4\x62\xed\x7f\x95\x09\x69\x46\x48\x8e\x86\x7f\xa7\x25\x69\x05\x60\x0e\x83\xdf\xd2\xa0\x78\x37\xdd\x3a\xfc\xa7\xfc\xfa\xe3\x35\x95\x92\xe5\x34\x16\x92\xcd\xc1\x07\x4d\x39\x9d\x55\xdf\x8d\x1f\x90\x24\x89\x8f\x74\x7c\x28\x11\xf5\x50\x45\x2e\x86\x70\x05\x87\x47\x2e\xfb\x63\x60\x6f\xa3\x5e\x8f\xcd\x40\xa8\xe4\x0d\xd5\x94\x5f\xc7\x57\x03\xf8\xea\x08\xfa\x7d\xf3\xc6\x87\x3d\xe1\xeb\xa8\xd7\x33\xc9\x0a\xec\x86\x53\x5b\xe8\x83\x03\x30\x48\x1d\x55\x7d\x5d\xd7\x9c\xce\x0c\xb4\x1f\x49\xb2\x79\x54\xc7\x1f\x7a\x87\x2a\xc6\xb5\x25\xc9\x7c\x69\xd3\xc3\xb8\x7e\x3c\x31\xd7\x43\x8c\xfc\xb0\x8f\x4b\x4f\x26\xc7\x5a\xb0\x38\x04\x47\xea\x70\x08\x84\xfb\xea\x08\xc3\x3d\xdb\xb5\x37\x5b\xea\xe4\xb5\x49\x83\x15\x1c\x7b\x4c\x74\x4e\xa5\x1c\xc2\xd5\x10\xfa\xcc\xba\x52\x04\x8d\x29\xcb\x9d\x7e\xf6\xcd\x50\x3d\xa1\x92\xd3\x1b\xa6\xe3\x67\xe6\x71\x1b\xf0\xf4\xba\x83\x91\x4f\x43\x3e\x3e\xbd\x9f\x8d\x41\x40\x97\xa6\xf0\x81\xae\x27\xd6\x6b\xcc\x24\xba\xfa\x0a\x08\x86\xdb\x40\x4a\x86\xf1\xd3\x62\xb5\x24\x1c\x9d\xbc\xe4\x03\x59\x52\xd8\x6e\xbd\x8f\x79\xb9\x0a\x1c\xc2\x4c\xf0\x19\x9b\xa3\x25\x65\xda\xae\x52\x35\x6c\x8c\x03\x3d\xb9\xbd\x85\xa4\xce\x22\x27\xb7\xb7\x68\x5d\x33\x52\x84\x23\x1f\x8f\xcf\x06\xf0\xc4\x21\x73\x1b\xf5\x14\x32\x9d\xd3\x75\x6c\x9b\x06\x55\x40\xd7\x99\xe8\x32\x71\x86\x4a\x4e\xdb\xc9\xaa\x23\x68\x47\x45\x08\x76\xd2\xcc\x5b\x1d\xb5\x12\x59\x08\xf2\xa6\x95\xb9\x3a\x6a\xe7\xb2\x10\xe8\x7d\x2b\x02\x6e\x38\xf3\x08\x30\xa9\x33\x57\x47\x41\x1a\x0b\x5f\x99\x44\xd1\x51\x87\xa2\x3a\xff\x15\xf7\x90\xb7\x1f\x27\x53\x14\x0a\x95\x98\xdc\xd1\x51\x5b\xfa\xad\xab\x8a\xa6\x7e\xfc\xf1\x93\x83\x0c\xb3\x49\x47\x61\xf2\x0b\x5f\xd6\x29\xa5\xa3\x3a\x09\x86\x2f\xc2\x4c\xd2\x51\x98\x02\xc3\x97\x8d\x24\xd2\x51\x23\x07\x86\xaf\xa7\xe7\x93\xbd\xc4\x54\xee\x8c\x25\x78\x08\xfd\xe9\xf9\xe4\xc2\xd0\xd5\xa0\x6f\x7a\x3e\xe9\x26\xb1\x72\x64\x9e\xba\xbe\x35\xa5\xd3\xf3\x49\x98\x84\xda\x33\x7d\x73\x8f\xee\xbb\x51\x4e\x4e\x3f\x4d\xcf\x5e\x9f\x9d\x1c\x4f\x4f\xbb\x06\x7b\x47\x37\x0f\x18\xcf\xfa\x1c\x7e\xc8\xf1\xa7\xb3\x1f\x8e\xa7\xa7\x17\xef\x4e\xff\x51\x0f\x79\xfc\x10\x0c\x8f\xf7\xe0\x78\xdc\x89\x66\x73\x81\x9b\xbe\x80\x03\x09\x97\x39\xdc\xc6\xdd\xeb\xe6\x62\x37\x77\x49\x07\xd2\x5a\xf2\xd6\x46\x16\x01\xa0\x36\x8e\xba\xd3\x3a\x00\x2a\x31\x4f\x47\x55\x7e\xb9\xea\x10\x24\x67\xaa\x87\x9e\x4a\x30\x56\x36\x61\x32\xea\xd0\x15\x8d\xb3\x05\x31\x39\xac\x55\xa6\x6f\xb7\x86\x70\xb4\x23\x47\x68\x96\xf0\xc1\x24\xcc\xe4\xaa\xd4\x0d\x78\x34\xb1\xe6\x34\x69\x08\xcf\xea\xf4\x9b\x8a\xac\xa5\x3b\xf1\x46\xea\x78\x7c\x56\x5b\x2c\xeb\xb1\x60\x13\x46\xc2\x0b\xc2\xf3\x82\x4a\x95\xd4\xd9\x36\x67\x7d\x1a\xdd\x5d\xfe\x0b\x90\x7c\x8b\x59\x65\xf7\xab\xbc\x6f\xe2\xc6\x42\xe3\x12\x76\x35\xf0\x03\x03\xb7\x6d\x63\x66\x2d\x59\x0b\x37\x92\xe7\x0c\x9d\x00\x52\x80\x3d\xb1\xca\xe9\x8c\x71\x7b\xfe\x87\xef\x2b\x9c\xe1\x03\xa5\xb9\x72\xce\x64\x46\x8a\x02\x61\x9c\xe3\x80\x7e\x30\x91\x8a\xca\x64\x8c\x1f\x77\x90\x67\x70\xb8\x9f\xc0\xac\x09\xdf\x41\x95\xb3\xe4\xb8\xed\xe2\xf4\x9d\x9b\xc9\xf1\xf8\xcc\xe6\x7e\x1d\xb0\x5d\x71\xb4\xfe\x3b\x86\xbc\x3a\x9e\xd9\x7b\x9e\x07\xbf\x14\x82\xcf\x0f\x7d\xce\x0b\x72\xaa\x32\xc9\x4a\xe4\xdd\xe1\x6f\x9c\xee\xfa\x25\x48\x76\x9d\xdc\x79\x26\x72\x07\xfa\x00\x9e\x82\x76\x32\xac\x49\xca\xbf\x98\x07\xf3\x84\x1d\xf6\x9f\x3d\x55\x0d\xcc\xdb\x5b\xde\x23\x30\xdf\xc9\x9e\x3d\x06\xf5\xbd\x89\xb3\x00\xf5\x97\x4d\xd4\xdf\xdf\x77\x8c\x74\xbf\xd8\xb4\x13\x6f\x4d\xcc\xff\xfb\x72\x70\x49\xc8\xae\xf7\xec\xbb\x90\x5f\x51\x2f\x70\x4c\xee\xf6\xaa\x2a\xad\xa3\x85\xa2\xfe\xd4\x3c\x41\x9b\xce\x51\x89\xbd\xce\x05\xe9\xbc\x5d\xc5\xdb\x9b\xbe\xab\x31\xac\x12\x80\xb7\xb7\x90\x13\xb5\xa0\x32\x34\x14\x36\x19\x18\x2e\x78\x2e\x96\x84\x71\x4b\xc5\x39\x70\xaa\x13\x6f\x2a\xa2\xa8\x67\xbc\x91\x87\x9a\x0b\x93\x55\xd9\xc5\xb9\x9d\x60\xa9\x51\xad\x73\x31\x40\xf9\xf5\xa1\x75\x62\x42\xdc\x8c\x23\xc3\xb8\x7e\x90\xc6\x98\xd4\xcc\xee\xf4\x5f\x28\xdd\x68\x31\x34\x2e\x53\x88\xe1\x79\xeb\x48\xf4\x6e\x4c\xdd\x9f\x43\xb8\x91\x67\x68\x22\xfe\xe0\x7c\x43\x88\xcb\xbb\xbd\x67\xb1\xf7\xaf\x5d\x90\x8f\x68\x62\xf2\xbb\xe6\x22\x6a\x51\x79\xb1\x6c\x90\xfa\x69\xef\xc9\xf2\xfd\xa4\x36\xd2\x16\x4d\x62\x1f\x99\xb1\x08\xd0\x6c\x6d\x04\x3f\xee\x3d\xe4\xbe\x1f\xcf\x66\x72\xe3\xb3\x11\xed\xce\x6b\xd4\xa8\x7e\xd3\x42\x75\xa1\x75\x69\x9d\x87\x73\x80\xb6\x1d\xf0\x81\x49\xfb\x38\xfe\x01\xe2\xee\xa8\xa9\x72\xb0\xf7\x1a\x08\xeb\xe8\x14\x6a\x08\xeb\x05\xe5\xc6\x9c\xba\x63\x4a\x9a\x03\xd3\x5f\xbb\xdd\x01\xed\x19\x51\x30\x1a\x05\x06\xa4\x8a\x88\x42\xc2\x7c\x40\xd4\xa8\x17\x78\x90\x9e\x86\xb8\x7f\x96\x75\x79\x94\x6d\xa9\x42\xb2\x16\xf2\xad\xb2\x82\x2f\xb1\xc9\xb4\xb3\xc9\xbb\x74\x85\x99\xd5\xbb\xf3\xc9\x35\xf2\x61\x88\xb5\x9f\x06\x0c\x08\xbf\x14\x0d\x57\x74\xd3\xb5\x26\x41\x9e\xfa\xa1\xb8\x87\x21\x67\x1b\xf7\x66\x81\xc6\x17\xe3\x3f\xb9\x87\xed\x75\x9a\xfb\x41\xa9\xed\x60\x1d\x8e\xef\x5a\x8a\xdd\x1a\x99\xcf\xd6\x85\x2f\xbd\x71\x35\xe2\xec\xdd\x0a\x9d\xbb\xf0\x6b\x08\xc3\x7f\xe2\x16\xd6\xa2\xf3\xae\x3a\xa3\x07\xd2\xf9\xe5\xf7\xaf\x16\x8e\x77\x55\x3a\x3d\x10\xc7\xdf\x64\xef\x6a\xef\x56\xaa\xda\xae\x5a\xbb\x55\x67\x95\x8c\xf9\xf8\x22\x1e\x3a\xc6\xa9\xbb\xaa\x7b\x4f\x49\xcd\x2f\x61\xa9\xa2\xa7\x82\x94\x0c\x9a\x7f\x0f\x4d\xf0\x46\x3d\x9f\x15\xa9\xff\x90\x27\xc9\x5b\xdb\x8c\xef\x55\x1d\xf3\x9b\xbf\x4b\x21\x8a\xa8\x57\x25\x88\xaa\xbf\x46\x8a\xc8\x02\x60\xd0\xf8\xaa\x02\x62\x5c\xbf\x78\x1e\xf5\xaa\x5c\x11\xcd\x21\x1c\xb1\xce\x21\x35\x46\xac\x92\x48\x2e\x8d\x71\x2e\xe6\x33\x28\xc4\x5c\xc1\x92\x2a\x85\xf4\x51\xa6\x17\x54\xc2\x35\x23\x55\x2a\x66\xa5\xa8\x44\x20\xe4\xa4\xb0\xaf\xd4\x46\x69\xba\x04\xc1\xa9\x5d\xbb\x06\x0c\xab\xb2\x38\x1d\x99\x26\x9c\x31\xae\x8f\x67\x88\x9c\x9b\xe3\x8c\xa0\x48\xcc\x14\xb0\xb6\x53\x33\x07\x07\xf6\x39\x39\xb7\x73\x04\x47\x11\x61\x7b\x3c\xb3\x43\x26\x49\x32\x88\x7a\x5b\x2b\x34\x08\x54\x88\x79\x32\x36\x35\xbb\x2d\x10\xc7\x88\xd7\x44\x93\xe2\xb7\x65\x45\x9a\xc2\xe9\x0d\xd3\xca\x6e\x15\x5c\xf0\xd1\xaf\x54\x0a\x50\x9a\xe8\x95\x02\x32\xd3\x54\xda\xb2\x62\xc6\xe7\xbb\x7c\xb3\x08\xfe\xbb\x38\xd7\x38\xa5\x69\xb1\xd1\x63\xd2\xc5\xc6\x09\xd5\x1d\x09\xc8\x2a\x6b\xa0\x17\xf6\xb9\x72\x1d\x8f\xc7\x67\x77\x65\xf6\x0c\xf1\xbb\xbc\xb0\xb3\x7c\xe6\xe1\x8b\x65\x8d\x49\xb4\xb6\x38\x00\xe6\xd9\x3c\xd5\x69\x4d\xdb\x62\xb3\xac\x48\xdf\x4e\x96\x76\x4f\x06\xd4\x64\x0a\xc3\x82\x46\x8f\xf4\x82\x28\x5b\x9f\x16\xdb\x5c\x5b\x55\x7b\x89\x0a\x6b\x8e\x84\x5c\x0a\xee\xf0\x08\x76\x8f\x7a\x0c\xf2\x05\xe5\xae\xb3\x1a\xd4\xe7\x61\xaa\x2a\xf2\x6e\x96\xc1\x59\xac\xdd\xc1\xe0\x75\x7d\x30\xe8\xe1\xdd\xd9\xe0\x35\x8e\xe4\x50\x0a\x4f\x38\xb5\x5c\xd1\xea\x40\xce\xb5\xcd\x48\xa1\x68\x98\x01\xb5\x39\xdc\x92\x75\xad\x91\xbc\xa6\xf1\x00\x62\x2a\xa5\x2d\x2f\xf5\x4b\xf0\x15\xf2\x2e\xb0\x83\x0e\x0f\x84\x43\xca\xed\x8b\x78\xf0\xb7\xf6\x91\x23\xf8\xea\x4f\x2a\xa5\x47\x2c\xea\xa5\x29\x28\xaa\x3d\xe9\x3e\x5f\x3c\xb4\xba\x88\x3a\xa9\xf0\xbd\x53\x8b\x6a\xcd\xea\x51\x2b\x75\x09\xda\x7a\xf5\x44\x42\xaa\xe4\x03\x5d\xc7\xfd\x8c\xf0\xaf\xb5\x3b\x46\x34\x54\xef\xcc\x48\x14\x6a\x3f\x0e\x65\xe7\xec\xdb\x83\x61\x23\x57\x13\xaa\xdd\x26\x60\x93\xc9\x89\x65\x0f\x67\xc5\x60\x60\xe9\x58\xcf\xfd\x89\xa0\xda\xf0\x2c\xf9\x91\x30\xfd\x46\x8a\x55\x39\x88\x7a\x82\x67\xb4\xf1\xf2\x23\xcf\xe8\x20\xea\xd9\xcb\x25\x1f\x84\x66\xb3\x4d\x1c\x1c\x1b\x0c\xa2\xde\x5c\x38\xbc\xce\x7c\x63\x8c\xa3\x0c\x41\x0d\x50\x92\xcd\x1a\x19\x49\xfb\xe9\xe7\x27\x66\x8b\xb2\xcb\x86\x5b\xcd\x7a\x9e\x1c\xe7\xb9\x51\xfc\xb9\xa8\x78\x36\x71\x3b\x54\xbc\x9e\x0f\xe1\xc0\x0d\x80\x63\x39\xbe\x36\x65\xfb\x7b\xce\x6e\xcc\x72\x37\x32\x59\x9e\x86\x60\xc2\x41\x0b\xa4\x3e\x73\xfc\xce\xe4\x1c\xcd\x81\x59\xdc\x3a\x8a\xdc\xe9\xf4\xb6\x52\xc5\x6a\x89\xed\xca\x32\xae\xbf\xf9\x73\xdc\x3e\x11\x1d\xc0\xff\x38\xd5\x69\x0e\x73\x96\x17\xc1\xa1\x50\xbb\x97\x5f\xcc\x4a\xdb\xdd\x11\x70\x38\xc4\xd0\xdd\x6a\x18\x3a\xe5\x8e\xc3\x33\xd2\xc1\xc0\xc8\x82\xe3\x3d\xda\x91\x92\xf2\x3c\x76\x0d\x43\x08\x07\x42\x12\x83\x85\xe8\xa9\xc4\xec\x9b\x7d\x9c\xd3\x94\x2f\x74\x9d\x37\x10\x6d\x72\x91\x87\x69\xfa\x27\x85\x28\x84\x73\x47\x3d\x5c\x4d\xd4\xd2\xb8\x68\xb8\x66\x03\xab\x5a\x39\x9d\xa1\x85\x9e\x27\xaf\x04\xa7\xf1\xc0\xb4\x39\xa5\x3c\x3c\x6a\xa0\xe6\x44\xb7\x68\x2a\xe8\xc1\x81\x7f\x32\xab\x7b\x2a\xa5\x65\xcf\x49\x21\x30\x3a\x32\xcc\x56\x7e\xeb\xe8\xff\xe9\xba\x6f\x2a\x0f\xec\x3c\x5b\xf3\x7f\x45\xa2\x16\x65\x49\x73\xb3\x69\x3c\x96\xd4\x6d\xac\x92\x46\x0e\xd5\x29\x59\xa7\xb0\xbe\x9d\x4e\xc7\x56\x58\xeb\x74\xcb\x1e\x51\xad\x01\x1e\x2c\xa8\x41\x97\xe6\xc1\x64\xe3\x54\xba\x09\xd8\x3a\x9e\x6c\x1e\x51\x37\x41\x27\x54\x57\x61\x9a\x72\x9b\x46\xec\xc5\xbe\x7a\x63\x24\x7e\xe0\xad\x5d\x18\x6d\x56\x9a\xa0\x92\x30\xd9\x84\xd4\x9b\xbb\x55\x89\x01\xf3\xc2\x12\x37\xa0\x86\xcd\xb1\x2a\x73\xf7\x10\xc5\x0b\x48\x78\x98\xda\x05\x1d\xba\xd4\xbd\x43\x31\xeb\x1e\x43\x77\xe5\x0a\x11\x0e\xf0\x47\xf5\x92\xf1\x20\xf1\xd7\x0c\xee\xd1\xcf\xba\xe7\x63\xb5\x13\x47\xa8\x45\x76\x17\x93\x3b\xb4\xd4\x99\xab\x1d\x2d\xed\xd5\x4a\xda\x90\x8a\x47\xaa\xe8\x1e\x1d\xb5\x65\x3a\x9f\xab\xa1\x21\xb9\x45\x40\xe2\xb6\x29\x46\xf7\xe9\xe6\xa4\x56\x4e\x75\xaf\x76\xaa\x47\xa8\xa7\xda\xa3\x9f\xcd\xd4\x40\x0b\x78\x47\x47\x5b\x41\x7a\x0b\xfc\x4e\x3d\x0d\x73\x2d\x4d\x55\x6d\xe5\x86\x5a\xda\xaa\x1e\xa6\xae\x2a\xd0\xd7\xe6\x80\xae\x74\xed\xc1\x1a\xab\x1e\xae\xb2\xcd\x0e\x7b\x54\x36\x4d\xe1\x8c\xab\x92\x49\x7b\xe0\x6f\x7a\x1c\xa6\xe9\x25\x86\x19\x97\x92\x64\xf4\x92\x71\x73\x97\x94\x64\x0b\x46\x51\xd8\x46\x25\x95\x33\x9a\xe9\x91\x52\xc5\xa8\x20\x97\x6a\xa4\x32\x21\xe9\x08\x63\x8b\xd1\x5c\xb4\xa6\x9d\x9e\x4f\xec\xd1\x3f\x1c\xc1\x81\x2e\x54\x62\x9f\x0c\x3d\x69\x0a\x27\x64\xa5\xa8\x02\xaf\xf2\x2e\x2f\xf9\x46\x7c\xad\x2a\xef\x2e\x63\xe5\x82\x4a\xb5\x62\x9a\x42\x29\x51\xfd\x28\xcf\xa8\x1a\xba\x11\xec\x09\x2f\x91\x14\xf4\x0a\xe3\x43\x2d\x80\x5c\x0b\x96\x03\xd1\x9a\x64\x57\x2a\x81\x57\xee\x4c\x73\x61\xf2\x28\x1c\xb2\x82\x51\xae\x55\x82\x03\x8c\xcd\x80\x4e\x0b\xcd\x44\x13\x9c\x48\x1d\x1a\xe7\xdb\xcf\xf1\x91\x17\x1b\x83\x58\xb6\x92\xd7\x54\xb9\x39\x17\xe4\x9a\x02\x51\x8a\x2e\x2f\x8b\x0d\xb0\x65\x59\xd0\x25\xe5\xda\x64\x38\x94\xeb\xe9\xf9\xd9\xb8\xd6\x5b\x10\x3e\x4f\xe7\x22\xd5\x92\xd2\x74\x49\x94\xa6\x32\x55\x32\x4b\xdd\x2d\x67\x5a\x14\xac\xd4\x2c\xc3\x21\x4e\x70\xc2\x71\x4d\xf5\x21\xfc\xf4\xb3\xe1\x22\xb6\x9f\xbd\xba\xad\xbe\x8f\x9f\xbf\xfc\x66\x8b\xf8\xfa\xaa\x99\xef\x15\x7d\x2f\x72\x2a\x39\xfe\x6f\xaf\x78\x22\x42\xdf\x2b\x0a\x4b\xd3\x6e\x72\xa4\xf8\xb5\x42\x72\xcd\xae\x58\xb2\x14\xbf\xb2\xa2\x20\xe6\x8e\xaf\xb9\x69\xca\xf4\x26\xb5\x0c\xba\x98\xb0\x9c\x5e\x4c\xcf\x27\x7f\xb0\x23\x5f\x64\x62\x59\x12\xcd\x2e\x59\xc1\xf4\x06\x27\xf8\x40\x6f\xf4\x58\x0a\x2d\x0c\xa2\x2e\x71\xd4\x5f\x3c\xef\x3b\xfb\x9f\x3e\x4b\x9e\xf5\xb7\xc3\x16\x73\xd6\xeb\x75\x22\xd6\x44\x95\x66\x52\xc6\x73\x7a\x93\x94\x8b\x32\x9d\x4a\xc2\x55\x29\xa4\xbe\x38\x27\x1b\x2a\x2f\x70\x64\x9b\x64\xbc\x38\x59\x50\xa2\x2f\x26\x0b\x4a\xf5\x1f\x3e\xad\x0a\x7a\x31\xba\xc0\x45\xba\x98\xd8\xeb\x65\x17\x13\x2d\x05\x9f\x9b\x1e\x22\x13\x85\x59\x8e\xf7\x8c\xff\x40\xa5\x62\x82\x1f\x22\xed\x89\x7b\x98\x9e\x4f\x9e\x3d\xf7\x28\x4d\x17\x14\x97\xb9\x16\x39\x55\xdd\x58\x7b\x2d\xe4\x9a\xc8\x1c\x26\x34\x93\x34\xdb\x1c\x56\xe8\x53\x9e\x20\xe7\x4a\x9a\x33\xcb\x36\x7c\x4a\x1d\xf8\x85\xb2\xe0\x66\x31\x1b\x02\xf6\xd3\xcf\x2b\xc6\xf5\xb3\x6f\xac\xd5\x47\x84\xa6\xe7\x93\x8b\xd3\x93\x57\x6f\x4f\xf1\xff\xc9\xf1\xc5\x8f\x67\xd3\xb7\x17\xc7\xa7\x93\x8b\xe7\x2f\xbf\xb9\x78\x73\xf2\xfe\x62\xf2\xf6\xf8\xc5\x5f\xfe\x3c\xec\xe8\xf0\xe9\xf3\xc0\x5b\xe3\x3f\x7b\xfe\x17\xdf\xe1\xf9\xcb\x6f\xee\x1d\xff\x7e\xf0\x60\xfc\x93\xb7\xc7\x27\x6f\x8f\x9f\x3f\xbd\x18\x7f\x3c\xff\xc7\xb3\x17\x4f\x5f\xde\x39\x7c\x37\x74\x25\xd8\x3e\x43\x68\x1d\x92\x34\x85\xcb\x15\x2b\x72\x30\x79\x74\x5c\x1b\xeb\x80\xc0\x4c\x8a\xa5\x4f\x79\x88\xd2\xeb\xa3\x37\xe7\xe1\xb9\x45\x55\x28\xdc\x55\xa0\x17\x94\xe9\x76\x9a\xb4\x24\x80\x57\xbe\x52\xcc\xe9\x67\x58\x70\x67\xeb\x6c\xef\x1f\xe2\xa7\xa7\x3f\x0f\x5d\x10\x8e\x63\x9c\x0b\x92\xff\xef\xcb\xa7\x7f\x7d\x47\x37\x63\xc2\x64\xbc\x3f\xc9\xec\x42\x9d\x2a\x85\xda\x26\x66\x7f\xcf\x41\xd5\x67\x78\xc7\x2f\x19\xdc\x37\xfe\x3b\xba\x79\xc8\x14\x7b\x0b\x99\x1b\x59\x85\xde\x36\xf0\x62\x3b\x8a\x1c\x83\x55\x49\x53\x57\xcf\x12\x26\xb4\x4e\x8e\xc3\xf3\x22\x04\xcb\x08\xf6\x1f\x82\xfd\x3c\xb5\xbe\x1a\x13\x66\xb7\x46\xf7\xe2\x35\x2b\xe8\x67\x73\xf7\xf8\x33\xf9\xeb\x89\xaf\x91\xe8\x62\x41\xf5\xb6\x72\xf9\x6c\xcb\x58\x88\x02\xb1\xbe\x79\xf9\xf4\xaf\xc9\x07\xba\xf6\x6d\xd6\x03\x15\xa6\xe8\xbc\x86\x4c\x8e\x8d\xe3\x8c\x8f\xea\xb5\x14\xcb\xf1\xe9\xfb\xd8\xbe\xf5\x58\x7c\x25\xae\x9a\x13\xcf\x96\x1a\xfd\x51\x21\x67\x26\xd1\xc2\x85\xb6\x05\x7d\x2d\x76\xf6\x6b\x5f\x74\x8f\x3c\x9b\xcd\xf5\xe4\x18\xf5\xa1\x46\xe8\x3e\xf8\xe3\x95\x29\x60\x46\xa9\xff\x44\xff\xb9\x62\x92\x1e\xf3\xfc\x07\x2a\xd9\x6c\xe3\x06\xa4\x52\x07\x6a\x9f\x91\xa2\x80\x6c\xa5\xb4\x58\xc2\xf4\x7c\x52\xe5\xff\x88\x16\x32\x8c\x43\xa6\xe7\x93\xb8\x73\xde\x81\x93\xaf\x82\xf2\x6e\x80\x86\x62\xba\x54\xdf\xc1\x01\x74\xc3\xbe\xa1\xba\x51\x86\x1b\x2c\x6c\x9a\xba\xbc\x72\x65\xa3\x08\xcf\x3d\xea\xce\x5c\xa1\xf3\x52\xa2\x23\x91\xbb\x72\x41\xca\x73\x05\xab\xd2\xa7\xa9\xdb\xf2\xdc\x65\xc8\xea\x3b\x0e\x9d\xef\x4d\xbd\x71\x00\x12\x44\x19\xfe\xc8\xcb\xb8\x80\xb6\x02\xf4\x97\xd1\xa8\x75\x16\xfe\x8b\x41\xdb\xb5\x5f\xd1\xcd\x2f\xb0\xa6\x92\x36\xab\x10\xdc\xed\x82\x6d\x74\xcf\xf8\x9d\xc3\xaf\x89\xea\x1a\x6d\xbb\x87\xde\x36\x3d\x0f\x98\xce\x62\x7d\xc7\x34\x69\x6a\xb9\xbf\x30\x61\xa7\x3b\x24\x20\xb0\x46\x4f\xe2\x0e\x61\x0b\xe6\x6e\x2e\x95\x99\xac\x12\x45\x5b\x8f\x38\x3d\x9f\xd4\x49\xc9\x34\x85\xe5\x4a\x69\xe7\x48\x6a\x28\x28\x51\xda\x1c\x63\x84\xa3\x08\x09\x25\xe1\x2c\x53\xfb\x3c\xeb\xe4\x3b\xdc\x04\x31\xea\x9b\x8a\x80\x45\xf1\x60\x5f\x48\xae\x1a\x31\x79\x1d\x0a\xab\xc7\x47\xe5\xea\x5f\x0f\xcb\x55\x33\x2e\x57\x5f\x3a\x30\x57\xff\x71\x91\xb9\xea\x0e\xcd\xd1\x0a\x7e\xa0\xeb\xbd\x21\x64\xb7\x41\xab\x92\xd8\x26\x71\x1d\xef\xfc\x3c\x44\x9a\x82\x1d\xb1\xba\x88\xd3\x2c\x59\xf6\x75\xd4\x76\x59\x3b\x4e\x0d\xdd\xa1\x40\xf5\x43\x15\xae\x78\xbb\x79\x90\x00\x68\xef\x0a\x49\x49\xbe\x81\x1c\x25\x19\x35\xca\x94\x6d\x07\xd8\x00\x6c\xa3\xa0\x7b\x77\xba\x01\xfb\xb8\x78\x05\x09\xb6\x3f\xc7\xc2\x66\x96\x7a\xfb\xb4\x26\x8a\x7f\xad\xfd\xf1\x5e\x5d\x4f\x5e\xdd\x17\x71\x06\xc2\x57\xcc\x07\xf7\x48\xcc\x65\x11\x57\x4e\x5e\xc5\x45\x66\x1e\x57\xb2\x64\x2b\x36\xaa\xf9\x1a\xad\xad\x79\xbb\x13\x05\xd5\xe1\x50\xd7\xa5\x8a\x46\xd6\xce\x05\xeb\x21\x12\x3a\x2b\x4d\x49\x06\xd8\x92\x8c\x0a\x8d\x56\x7b\x17\x22\xdd\x19\x8d\x16\x36\xe1\xfd\x8d\x20\x49\xd9\x81\x89\x29\x8c\x70\x15\x0b\x35\x1e\x8d\xd6\x7b\xb0\x08\x12\x38\x3b\x78\xdc\x9d\x8f\x6d\xe3\x62\xeb\x1f\x76\x90\x69\x36\xdf\x83\x4d\x98\x20\xda\x41\xe7\xbe\xac\xef\xf6\x4e\xd1\xf5\x47\x2e\x28\x55\xb9\x58\x4e\x44\x76\xe5\x35\xa3\xba\xe4\x57\x1b\xae\xf8\xee\x73\x0a\x27\xcc\x0d\x57\xd9\xca\x71\xe0\x2c\x5b\xf9\xb5\xc2\xdd\x2c\x58\x3e\x6a\x63\x70\xaf\xd2\x79\xcc\x8b\xbb\x50\xd6\x59\xd9\x1f\x9a\x96\xbf\x0b\xc6\x51\x87\xc6\x42\xea\xd8\xdf\xbd\xf2\x57\x18\xcf\xb4\x20\xb1\xbd\x53\x36\xf8\x3c\x5a\xcc\xc7\x62\x08\x65\x7d\x2d\x72\x4d\xe6\xf6\xb7\x6f\xaa\xe9\x3c\x8a\xbb\xfb\xd4\x67\x73\xcd\xd9\x83\x85\x7b\x74\x57\xc4\x4a\xf7\xd8\xcc\xc7\x17\x0f\x65\x65\x65\xbf\xaa\xbb\x53\x9f\xcb\x4e\x67\xa9\x76\x38\xea\x8a\x36\x1f\xc3\x54\xb5\x18\x82\xba\x93\xad\x01\xb6\x5f\x80\xb3\x81\xb1\x5d\xd4\x4d\x8e\xc1\x2a\xe4\x70\x90\x43\x0d\x50\xf0\x5c\x6e\xed\x30\x47\xee\x54\x7c\x67\x73\xf3\xc7\xa3\x3e\xee\x37\x6e\x76\x41\x09\x47\x47\x5a\x52\x25\x56\x32\xa3\xaa\xe3\x94\xdc\x1f\xab\x06\x3f\xc1\xc4\x66\x60\x7f\x14\x30\x39\x11\xcb\x92\x98\x68\x64\xb2\x26\xe5\x19\xd7\x2f\x9e\xc7\x07\xf6\x3a\x99\x2f\x06\x32\x37\x07\x9f\x59\x2f\x24\x43\x77\x21\xae\xaf\x9b\x0d\xc2\xa3\xfb\xf6\xef\x34\xd5\x65\x09\xad\xe3\x5d\x78\xd2\x3c\x80\x1e\xfa\xfc\xe8\x58\x4b\x78\xd2\x3c\x2f\x36\xf3\xa6\xa9\x77\x7c\xac\x43\x29\xb2\x6c\x25\xa1\x20\x28\x41\x2e\xfa\xa8\x8f\xbc\x65\x4d\xb1\xe9\x19\x6b\x01\xa5\xa4\x66\x0a\x10\x45\x0e\x97\x74\x41\xae\x99\x58\xa1\x77\xd3\xf6\xaa\xa2\xde\xb7\xa3\x9a\xbc\xe6\x41\xf6\x93\x1a\xcb\x28\xea\x65\xfa\x06\x23\x6e\x9e\x51\x13\xb8\xba\x1f\x73\x4c\x7e\x64\x7a\xe1\x0c\x6a\xec\xdb\xa6\x1f\x5f\x7d\x8c\x07\xe8\xf8\xb5\x6e\x08\x55\x08\xd8\x71\xcc\xfc\x7e\xee\x93\x05\xe1\x38\x70\x7d\x3d\xef\x52\x88\x62\x60\xcb\x2d\x58\x50\x6b\xe1\x10\xbc\xad\x7c\x58\x23\xfe\xb6\xf5\x27\xf6\x73\xe0\x57\x3a\x4f\xf2\xda\xfc\x4c\x55\x96\x51\xa5\x5c\x29\x97\xf7\x2e\x43\xa8\x26\x22\xdf\x8e\x7c\x17\xe3\x11\xb6\xfd\x4f\xe5\x5c\x4f\xcf\xf9\x4c\xdf\xec\x56\x57\x98\xcd\xce\xc4\xe0\x36\x81\x55\x15\x50\xd6\xbf\xb7\x24\xa4\x67\xa4\xdf\xef\x0e\x9d\x67\x6a\xbd\x4f\xf3\xfb\x86\x8e\x4a\x3f\xd9\x21\x34\xbd\xd5\xba\x94\xa8\xd7\xf3\x64\x7a\xad\x72\xc9\x97\x78\x50\x55\x76\xa0\x10\xc2\x8a\x6b\x56\x00\xc6\xdc\xb5\xbf\x68\x82\x16\xd7\x7f\xb6\x2a\x8a\x8d\xb9\x56\x65\xaf\x54\xb9\xda\x21\x8c\xd2\x91\x80\xa6\xd8\x45\xd5\xac\x87\x7e\x5a\x5c\xb2\x8e\xd5\xaa\x90\xf3\xdf\x0e\x0e\xe0\xdb\x51\xc8\x77\x7f\x55\xdd\x03\xd4\x25\x55\xbb\xa2\xee\x0b\xa4\xde\x54\x85\x20\xce\x74\x29\x20\xbe\x84\x04\x56\x0a\xc5\xcf\x3a\xc3\x54\x75\xd7\x81\xd5\x03\xc4\x83\x46\x75\x21\x4e\xef\x2f\x85\x56\x67\x2c\x55\x55\x96\x07\x22\x45\x21\xd6\xca\xd5\x5e\xdb\x7b\x68\xc4\xb9\xb8\x0e\x42\x70\x1b\x88\xee\x73\xc5\x83\x52\x16\xdf\x25\x44\xc3\x08\x68\x58\x1d\xd5\x44\x05\xdd\x14\x6f\x4f\x2b\x0e\x98\x72\x1a\xe3\x41\xf8\x7b\x54\xd5\x6e\xb7\x33\x7d\x38\x40\x3c\x80\x38\x0c\xc6\x86\x0f\x2e\x34\x3a\xbc\xb3\xd2\x28\xb0\x99\xc3\xb0\xda\xa8\xe6\x6f\xc3\xdf\x19\x06\x1b\x01\xea\x40\x27\x7d\x81\x7b\xdf\x45\x56\xd8\xef\xf7\x23\xab\x71\xb8\x5f\x13\x55\x45\x10\x1d\x34\xa9\x3b\x88\x0a\xfa\xfd\xbe\x34\xa9\x36\x51\x06\xd5\xae\x0a\x29\xb7\xfb\x7d\xb4\xc5\x52\x35\x29\xb7\xb6\x0c\x2b\x79\x25\x62\x6b\x87\xfd\x6f\x6e\x40\x65\xea\x83\x7b\xdb\x55\x61\x59\x58\x9e\x7b\xdb\x88\xd4\x9d\x9f\xe0\xa2\xd5\xc6\xa5\x50\x9b\x15\x42\x53\xcb\xb8\xaf\xc1\xeb\x35\xc7\xaa\x4c\x66\x35\x5e\x38\x40\x92\x24\xd0\x1f\xb4\x58\x58\x5b\xa3\x5d\x26\x3e\xdc\x82\x5b\xe6\x6e\x83\x9f\x62\x09\x8b\xd0\x6a\x0e\xe0\x9e\xf8\xed\xa8\xae\x37\xb6\x66\xc1\x7c\x4d\xda\xc0\x43\x70\x3f\x7d\x9c\x4c\xce\xde\x9c\x7d\x98\x36\x9e\xa7\xa7\x9f\xde\xe3\x6c\xff\x1f\x00\x00\xff\xff\x32\xb3\x3e\x77\x22\x5a\x00\x00") +var _templatesServerServerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x5c\x7d\x6f\xdb\x38\xd2\xff\xdb\xfe\x14\xb3\x3e\x5c\x56\x2e\x6c\xa9\x2f\xd7\xc5\x5d\x6e\xf3\x00\xd9\x34\x6d\x73\x4d\x5b\xa3\xf6\xee\x3e\x87\xc5\x22\x65\x24\xda\xe6\x13\x99\xd4\x91\x54\x1c\x6f\xe0\xef\xfe\x60\xf8\x22\x51\xb2\x9c\xa4\xb9\xee\xbd\x04\x68\x6d\x51\x43\xf2\x37\x43\xce\x70\x38\x1c\x3a\x49\xe0\x44\x64\x14\x16\x94\x53\x49\x34\xcd\xe0\x72\x03\x0b\x31\x56\x6b\xb2\x58\x50\xf9\x57\x78\xf5\x11\x3e\x7c\x9c\xc1\xe9\xab\xb3\x59\xdc\xef\xf7\x6f\x6f\x81\xcd\x21\x3e\x11\xc5\x46\xb2\xc5\x52\xc3\x78\xbb\x4d\x12\xb8\xbd\x85\x54\xac\x56\x94\xeb\xd6\xbb\xdb\x5b\xa0\x3c\x83\xed\xb6\xdf\xef\x17\x24\xbd\x22\x0b\x8a\xc4\xf1\xf1\xe4\x6c\xe2\x1e\xf1\x1d\x5b\x15\x42\x6a\x88\xfa\xbd\x41\x2a\xb8\xa6\x37\x7a\x80\x5f\xe5\xa6\xd0\x22\xd1\xb9\xc2\x27\x2a\xa5\x90\xe6\x5b\x2e\x16\xf8\xc1\xa9\x76\x1f\xc9\x52\xeb\x02\xbf\x0b\x65\xff\x4f\x14\x5b\x70\x92\xe3\x83\xd2\x32\x15\xfc\xda\x7c\xdd\xf0\xd4\x7f\x26\x44\x8b\x15\x73\x8f\x2a\x25\xb9\x21\xd6\x6c\x45\x07\xfd\x3e\xc0\x60\xc1\xf4\xb2\xbc\x8c\x53\xb1\x4a\x16\x62\x2c\x0a\xca\x49\xc1\x12\x14\xcb\xa0\x0f\xe0\xc4\xf0\xa3\xa2\x6f\xc4\x54\xcb\x32\xd5\xaf\x73\xb2\x50\xb0\xdd\xce\xcd\x67\x58\xfd\xff\xa8\x52\xf4\x3a\xbb\xc2\x76\xcc\x5b\xd7\x00\xca\x65\xbc\xdd\xee\xef\x4c\x96\x1c\xf1\x24\x58\xc9\x48\x24\xec\x77\x12\x76\xd8\x68\x41\x15\xf3\x67\x2f\x92\x02\xcb\x77\x7a\xaa\xeb\xfb\xea\x03\x4f\x87\x82\x62\xbc\x13\x9d\xc8\x09\x5f\xc4\x42\x2e\x92\x9b\x04\xa5\xcd\xa9\x2e\x35\xcb\x8d\xa0\xb0\x45\x33\x78\x0a\xe2\x57\x74\x4e\xca\x5c\x9f\xb9\xe7\xaa\x47\xff\x3e\x78\x31\xec\xf7\x53\xc1\x95\x19\x72\x95\x2e\xe9\x8a\xbe\x9d\xcd\x26\x00\x47\x30\x70\x63\x59\x97\x4e\x7d\xa9\xaa\x8a\x7f\xe4\xec\xc6\x10\x97\x9c\xdd\x0c\xb0\xb5\x6b\x22\x21\xb3\xfd\x4f\x0d\x89\x82\x5f\x7e\xb5\x2c\xf5\xfb\xf3\x92\xa7\xc0\x38\xd3\xd1\x10\x6e\xfb\xbd\x16\xdd\x51\x45\x79\xeb\x04\x14\x2d\x89\x3a\xe3\x8a\xa6\xa5\xa4\x10\x3b\xba\x21\xe2\xee\x05\xb8\x46\x56\x4c\x66\x92\xbb\x4a\xd3\x7b\xaa\x4c\x47\x95\x42\xb8\x4a\x38\xdd\x09\xe3\x0a\xe2\xd3\x1b\x2d\x89\xc7\x64\x19\x6b\xd4\x47\x9e\xeb\xea\xfd\xde\xb6\xbf\xf5\xfa\xc8\x85\xde\x9d\x8c\xdb\xad\x11\x4a\xe4\xc6\xfc\xf4\x26\xcd\xcb\x8c\x4e\x0b\x9a\xda\x91\x51\x05\x4d\x5f\xb3\x9c\x82\xff\x73\xd2\xaa\x86\x7f\xbb\xa5\x9c\x5c\xe6\x34\x3b\x67\x4a\xa3\x7d\x08\x44\x0a\x90\xe6\x94\xf0\xb2\x98\xb1\x15\x15\xa5\x06\x00\x9c\xab\xf1\xab\x52\x12\xcd\x04\xef\x03\x2c\x24\x49\xe9\xbc\xcc\x2b\x8a\x36\xc1\x8a\xdc\xbc\xa5\x24\xa3\x72\xca\x7e\x33\x28\xdc\x44\x8f\x7f\xd8\x68\x8a\x65\x38\xbf\x94\x48\xaf\xa8\x9e\x10\xbd\xf4\xf8\xfa\x00\x4b\xa1\xf4\x2e\x6c\x63\x42\xfc\x1f\xe3\xba\x0f\x90\x1b\xe4\xe7\x6c\xc5\xb4\x2f\xba\xa2\xb4\x38\xce\xd9\xb5\xe9\xb1\x0d\x49\x52\x92\xed\xc5\xbb\x96\x4c\x53\xff\xb6\xf9\xb2\x0f\xa0\x73\xf5\x36\x84\x15\x00\xd3\xb9\x9a\x84\xd8\x3c\x14\x9d\xab\xf3\x10\x60\x50\xfe\x2e\x44\xb9\x0b\x45\xe7\xea\x53\x08\xb5\x93\xe2\xe7\x10\x6f\x27\xc5\x09\x95\x9a\xcd\x59\x4a\x34\x6d\x03\x0e\x5e\xbd\xa3\x9b\xe6\xab\xe3\x46\x3d\xf7\x6a\x58\x2d\x0e\xde\xba\x6c\xb7\xfd\x24\x81\xa9\x79\x3d\xcd\x59\x4a\x7f\x22\x12\x54\x59\x98\x71\x9a\x0b\x69\xc6\xbb\xaf\x37\x05\x05\x65\x5f\xe7\x25\x6d\x6b\x2d\xa7\xeb\x69\xf5\x32\xba\x26\x79\x3d\x09\x47\x50\xc0\x13\xff\x30\x84\x27\x41\x23\xb7\xfd\xde\x93\x02\x8e\x00\xe9\xfb\x3d\x49\x75\x29\x39\x44\x01\xc5\x30\x2a\x86\xa8\x3f\xa6\x8f\x48\x85\x95\x87\x30\xa5\x1a\x7b\x02\xdf\xb2\x59\x79\x4c\x9b\x68\x2c\x6a\xca\xc8\x99\xcc\x78\x5a\xe4\xcc\x54\x19\xc1\x60\x34\x18\x0e\xab\x2e\x39\xcb\xf7\xf6\xf2\x86\xa2\x39\x62\x5c\x53\x39\x27\x29\xbd\xdd\xc2\x2d\xb8\x6a\x9e\xa9\xe8\x09\x9a\x90\x7d\x28\x2d\xc9\xd0\xc1\xac\x6b\x7b\x54\x7f\x13\x8c\x47\x61\x53\x16\x1d\x98\x61\x41\x05\xbf\x6f\x68\x82\xc5\xbb\x69\x41\xdb\xba\x7b\xb4\xa3\xba\xd1\xb3\xa7\xe6\x6f\xb8\xcf\xfa\x60\x85\xd8\x02\xf8\x89\xc8\x49\x74\xe0\xcd\xd1\x08\x06\xf8\x75\x30\x82\x81\xff\xa7\x97\x14\x9c\x43\x62\xac\x96\x9d\x7a\x4c\x70\xd0\x02\x14\x95\xd7\x74\x30\x0c\xcd\x56\xe7\x42\xd7\xef\x99\x2e\x7f\x22\x32\x6a\xce\xa9\xe6\x6a\x30\x82\x83\xb6\xd5\x43\xb9\x19\x13\x4c\x3c\x98\xbc\x32\x88\x5a\x80\x25\x1f\x81\x5e\x32\x05\x29\xe1\x70\x49\x41\xd2\x82\x1a\x6f\x8a\xf0\xcc\x2f\x4b\x86\xd8\xb0\xe2\x6c\x3c\xe3\xd0\xe6\x6c\x30\xec\xf7\x02\x13\xdf\xb1\xdc\x3b\x36\x9a\x43\x17\xed\x60\xf6\x90\xe9\x60\x04\x6d\x06\xff\xa5\x2c\x18\xb4\xde\xea\x18\xa8\xcd\x85\x63\x04\x03\x57\x30\xd6\xb6\x64\x30\x82\x67\x4f\x9f\x18\x6b\x35\xa5\xa9\xe0\xd9\x08\x06\x66\x2d\x81\x82\x4a\x26\x32\x33\x3f\xd7\x4b\x96\x2e\x11\xcd\x9a\x30\x0d\x97\x74\x2e\x24\x85\x2b\x96\xe7\xa8\x09\x2c\xcb\x29\xa4\x82\x73\x9a\x62\xaf\x0a\x21\xed\xe2\x68\xad\x4f\xbe\x97\x79\x99\x87\x48\x5e\x3e\x0a\x89\x5a\x96\x5a\x23\x94\x4c\xac\x9d\x88\x70\x9a\xca\x0a\x89\x41\xd0\x50\xa2\x11\x0c\x56\xe4\x66\xbc\x34\x05\x63\xc5\x7e\xc3\xa1\x33\xde\xb0\x14\xb9\x32\x6d\xac\xc8\x0d\x5b\x95\x2b\xe0\xe5\xea\x92\x4a\x10\x73\xb8\xdc\x68\xaa\x82\xf6\x61\xcd\xf2\xdc\xac\x62\x50\x10\xa9\x10\x01\xbe\x94\xf4\x1f\x25\x55\x1a\x6c\xe3\xdf\x2a\xb8\xa2\x1b\x65\x06\xf6\x1a\x55\x40\x8d\x80\x71\xd4\xcf\x36\x7d\xce\x38\x8d\xe1\x4c\x43\x26\xa8\x32\x5e\x46\x6e\x56\x2a\xd3\x21\x2a\xbe\x98\x37\xe8\x2f\x45\xb6\x19\x0c\xfb\x8d\x39\x6a\x38\xad\x57\x71\x9c\x98\xe6\x61\x5c\x10\xbd\x44\x16\x93\x6b\x22\xd1\xd7\x4d\xb4\xc8\xc4\x18\xe7\x65\x8c\x14\x5e\xd7\xd0\x11\x72\x5e\x00\x4a\xd9\xce\x5b\x10\xbc\xb3\x1f\x74\x0c\x46\x30\xc0\x0f\xac\x9f\x8b\x94\xe4\xfe\x01\x1b\x3b\x9b\xb4\xdb\xb0\x4d\x9c\x71\x6d\xea\xa3\xfd\x1b\xc1\x00\x3f\x06\x23\x78\xea\x6a\x19\xab\x18\xd6\x33\x03\xcf\xbc\x83\x18\xcc\xb4\x51\x43\x53\x08\x48\xc2\x33\xb1\xb2\x52\xde\xe9\x2c\x70\x4e\x10\xab\x79\x1a\x1b\x01\xbb\xbe\x6b\x61\xd7\x23\x2e\x4a\xad\x34\xe1\x66\xa8\x9c\xd8\xf7\xcc\xef\xca\xd1\x19\xc1\x00\xbf\x8f\x09\x3e\x0c\x46\xf0\xc2\x4e\xe9\xf7\x8c\x97\xda\x98\x5b\xaa\xed\x1c\x9a\x9d\x4c\xa0\xa6\x04\xa7\x05\x0a\x19\x26\x69\x4a\x0b\xb4\x06\x01\xb3\x66\x66\x14\xb2\xe4\x54\x41\x86\x53\x0e\xeb\x07\xef\x21\x02\x1a\x2f\x62\x48\x73\x61\x66\x62\x4e\x0a\x2d\x0a\x58\xb1\x6c\x8c\x6a\x91\x0b\x92\x0d\xbb\xa1\x07\x6e\xd8\x08\x06\xf8\x14\xa8\xe4\x8b\xb6\x71\xf0\x6a\x91\xb9\x26\xbc\x12\x6a\xb6\xc2\x6e\xd1\xfb\x31\x1a\xd1\x9c\xac\xdd\x3d\x87\x3e\xde\x08\x06\xe6\xf1\x9f\xec\xdb\xb4\x51\x77\xae\x0a\xc1\x15\xed\x9c\xbd\xce\x85\xc4\x59\x97\xab\xf1\xa3\x27\xb1\x73\x37\x5d\x33\x0f\x9a\xcb\x8f\x9c\xc9\x4d\xec\x81\x57\xe8\xfa\x4e\xeb\x92\x70\x2d\x0f\x8a\x61\x8e\x3b\x10\x2d\xa0\x54\x74\x0f\x92\xfb\x7b\x7b\x47\x37\xae\xc3\x2b\xba\x09\x3b\x2a\x24\xbb\xc6\x4e\xae\xe8\xe6\x01\x1d\x41\xb4\x66\x7a\x89\x43\x56\x10\xa5\x8a\xa5\x24\x8a\x0e\xf7\xf5\x7e\xdc\xc1\x2d\xd9\xc7\x24\x29\xf5\x52\x48\xa6\x37\x9d\xac\x5f\x52\x04\x95\x01\xf6\x0e\xab\x52\x97\x24\x47\x37\xdb\xd4\xea\x1a\xdc\xf3\x86\xdd\xc0\x9e\xbf\xba\xed\x08\x77\x20\x95\x68\xff\xab\x4c\x48\x73\x87\xe4\x78\xf8\x57\x5a\x92\xd6\x06\xcc\x21\xf8\x3d\x0d\x8a\x77\xd3\xad\xc3\x7f\xca\xaf\x3f\x5e\x53\x29\x59\x46\x23\x21\xd9\x02\xfc\xa6\x29\xa3\xf3\xea\xbb\xf1\x03\xe2\x38\xf6\x3b\x1d\xbf\x95\xe8\xf7\x50\x45\x2e\x46\x70\x05\x87\x47\xa8\xfb\x0b\x6a\x69\x6f\xfb\xbd\x1e\x9b\x83\x50\xf1\x1b\xaa\x29\xbf\x8e\xae\x86\xf0\xcd\x11\x0c\x06\xe6\x8d\xdf\xf6\x84\xaf\xfb\xbd\x9e\x09\x56\x60\x35\xec\xda\x52\x1f\x1c\x80\x01\x75\x54\xd5\x75\x55\x33\x3a\x37\xd4\xbe\x25\xc9\x16\xfd\x7a\xff\xa1\x77\xb8\x62\x5c\x5b\x96\xcc\x97\x36\x3f\x8c\xeb\xc7\x33\x73\x3d\xc2\x9d\x1f\xd6\x71\x31\xc4\xf8\x58\x0b\x16\x85\xe4\xc8\x1d\x36\x81\x74\xdf\x1c\xe1\x76\xcf\x56\xed\xcd\x57\x3a\x7e\x5d\x48\xc6\x75\xce\xb1\xc6\x54\x67\x54\xca\x11\x5c\x8d\x60\xc0\xac\x2b\x45\xd0\x98\xb2\xcc\xe9\xe7\xc0\x34\xd5\x13\x2a\x3e\xbd\x61\x3a\x7a\x66\x1e\xb7\x81\x4c\xaf\x3b\x04\xf9\x34\x94\xe3\xd3\xfb\xc5\x18\x6c\xe8\x92\x04\x3e\xd0\xf5\xd4\x7a\x8d\xa9\x44\x57\x5f\x01\xc1\xed\x36\x90\x82\xe1\xfe\x69\x59\xae\x08\x47\x27\x2f\xfe\x40\x56\x14\xb6\x5b\xef\x63\x5e\x96\x81\x43\x98\x0a\x3e\x67\x0b\xb4\xa4\x4c\xdb\x51\xaa\x9a\x8d\xb0\xa1\x27\xb7\xb7\x10\xd7\xa1\xde\xf8\xf6\x16\xad\x6b\x4a\xf2\xb0\xe5\xe3\xc9\xd9\x10\x9e\x38\x30\xb7\xfd\x9e\x42\xa1\x73\xba\x8e\x6c\xd1\xb0\xda\xd0\x75\x06\xba\xcc\x3e\x43\xc5\xa7\xed\x60\xd5\x11\xb4\x77\x45\x48\x76\xd2\x8c\x5b\x1d\xb5\x02\x59\x48\xf2\xa6\x15\xb9\x3a\x6a\xc7\xb2\x90\xe8\x7d\x6b\x07\xdc\x70\xe6\x91\x60\x5a\x47\xae\x8e\x82\x30\x16\xbe\x32\x81\xa2\xa3\x0e\x45\x75\xfe\x2b\xae\x21\x6f\x3f\x4e\x67\x38\x29\x54\x6c\x62\x47\x47\xed\xd9\x6f\x5d\x55\x34\xf5\x93\x8f\x9f\x1c\x65\x18\x4d\x3a\x0a\x83\x5f\xf8\xb2\x0e\x29\x1d\xd5\x41\x30\x7c\x11\x46\x92\x8e\xc2\x10\x18\xbe\x6c\x04\x91\x8e\x1a\x31\x30\x7c\x3d\x3b\x9f\xee\x65\xa6\x72\x67\x2c\xc3\x23\x18\xcc\xce\xa7\x17\x86\xaf\x06\x7f\xb3\xf3\x69\x37\x8b\x95\x23\xf3\xd4\xd5\xad\x39\x9d\x9d\x4f\xc3\x20\xd4\x9e\xee\x9b\x6b\xf4\xc0\xb5\x72\x72\xfa\x69\x76\xf6\xfa\xec\xe4\x78\x76\xda\xd5\xd8\x3b\xba\x79\x40\x7b\xd6\xe7\xf0\x4d\x4e\x3e\x9d\xfd\x74\x3c\x3b\xbd\x78\x77\xfa\xf7\xba\xc9\xe3\x87\x20\x3c\xde\x83\xf1\xb8\x13\x66\x73\x80\x9b\xbe\x80\x23\x09\x87\x39\x5c\xc6\xdd\xeb\xe6\x60\x37\x57\x49\x47\xd2\x1a\xf2\xd6\x42\xd6\x07\x40\x6d\x1c\x77\x87\x75\x00\x54\x6c\x9e\x8e\xaa\xf8\x72\x55\x21\x08\xce\x54\x0f\x3d\x15\xe3\x5e\xd9\x6c\x93\x51\x87\xae\x68\x94\x2e\x89\x89\x61\x95\xa9\xbe\xdd\x1a\xc6\xd1\x8e\x1c\xa1\x59\xc2\x07\x13\x30\x93\x65\xa1\x1b\xf4\x68\x62\xcd\x91\xcf\x08\x9e\xd5\xe1\x37\xd5\xb7\x96\xee\xc4\x1b\xa9\xe3\xc9\x59\x6d\xb1\xac\xc7\x82\x45\xb8\x13\x5e\x12\x9e\xe5\x54\xaa\xb8\x8e\xb6\x39\xeb\xd3\xa8\xee\xe2\x5f\x80\xec\x5b\x64\x95\xdd\xaf\xe2\xbe\xb1\x6b\x0b\x8d\x4b\x58\xd5\xd0\x0f\x0d\xdd\xb6\x8d\xcc\x5a\xb2\x16\x36\x92\x65\x0c\x9d\x00\x92\x83\x3d\x57\xca\xe8\x9c\x71\x7b\x48\x87\xef\x2b\xcc\xf0\x81\xd2\x4c\x39\x67\x32\x25\x79\x8e\x34\xce\x71\x40\x3f\x98\x48\x45\x65\x3c\xc1\x8f\x3b\xd8\x33\x18\xee\x67\x30\x6d\xd2\x77\x70\xe5\x2c\x39\x2e\xbb\xd8\x7d\xe7\x62\x72\x3c\x39\xb3\xb1\x5f\x47\x6c\x47\x1c\xad\xff\x8e\x21\xaf\x8e\x67\xf6\x9e\xba\xc1\xe7\x5c\xf0\xc5\xa1\x8f\x79\x41\x46\x55\x2a\x59\x81\xb2\x3b\xfc\x9d\xc3\x5d\x9f\x83\x60\xd7\xc9\x9d\x67\x22\x77\xc0\x07\xf0\x1c\xb4\x83\x61\x4d\x56\xfe\xc9\x38\x98\x67\xec\x70\xf0\xec\xa9\x6a\x20\x6f\x2f\x79\x8f\x40\xbe\x13\x3d\x7b\x0c\xf4\xbd\x81\xb3\x00\xfa\xcb\x26\xf4\xf7\xf7\x1d\x23\xdd\x3f\x6d\xda\x81\xb7\x26\xf2\xff\xbe\x18\x5c\x1c\x8a\xeb\x3d\xfb\x21\x94\x57\xbf\x17\x38\x26\x77\x7b\x55\x95\xd6\xd1\x5c\x51\x7f\xb6\x1d\xa3\x4d\xe7\xa8\xc4\x5e\xe7\x82\x70\xde\xae\xe2\xed\x0d\xdf\xd5\x08\xab\x00\xe0\xed\x2d\x64\x44\x2d\xa9\x0c\x0d\x85\x0d\x06\x86\x03\x9e\x89\x15\x61\xdc\x72\x71\x0e\x9c\xea\xd8\x9b\x8a\x7e\xbf\x67\xbc\x91\x87\x9a\x0b\x13\x55\xd9\xc5\xdc\x0e\xb0\xd4\x50\xeb\x58\x0c\x50\x7e\x7d\x68\x9d\x98\x10\x9b\x71\x64\x18\xd7\x0f\xd2\x18\x13\x9a\xd9\xed\xfe\x2b\x85\x1b\x2d\x42\xe3\x32\x85\x08\xcf\x5b\x47\xa2\x77\x23\x75\x7f\x0e\x70\x23\xce\xd0\x04\xfe\xe0\x78\x43\x88\xe5\xdd\xde\xb3\xd8\xfb\xc7\x2e\x88\x47\x34\x91\xfc\x5b\x63\x11\xf5\x54\x79\xb1\x6a\xb0\xfa\x69\xef\xc9\xf2\xfd\xac\x36\xc2\x16\x4d\x66\x1f\x19\xb1\x08\x60\xb6\x16\x82\x9f\xf7\x1e\x72\xdf\x8f\xb3\x19\xdc\xf8\x62\xa0\xdd\x71\x8d\x1a\xea\x77\x2d\xa8\x4b\xad\x0b\xeb\x3c\x9c\x03\xb4\xed\x80\xdf\x98\xb4\x8f\xe3\x1f\x30\xdd\x1d\x37\x55\x0c\xf6\x5e\x03\x61\x1d\x9d\x5c\x8d\x60\xbd\xa4\xdc\x98\x53\x77\x4c\x49\x33\x60\xfa\x5b\xb7\x3a\xa0\x3d\x23\x0a\xc6\xe3\xc0\x80\x54\x3b\xa2\x90\x31\xbf\x21\x6a\xe4\x0b\x3c\x48\x4f\x43\xec\x5f\x64\x5d\x1e\x65\x5b\xaa\x2d\x59\x0b\x7c\x2b\xad\xe0\x6b\x2c\x32\xed\x68\xf2\x2e\x5f\x61\x64\xf5\xee\x78\x72\x0d\x3e\xdc\x62\xed\xe7\x01\x37\x84\x5f\x8b\x87\x2b\xba\xe9\x1a\x93\x20\x4e\xfd\x50\xec\xe1\x96\xb3\x8d\xbd\x99\xa0\xf1\xd5\xe4\x4f\xee\x11\x7b\x1d\xe6\x7e\x50\x68\x3b\x18\x87\xe3\xbb\x86\x62\x37\x47\xe6\x8b\x75\xe1\x6b\x2f\x5c\x8d\x7d\xf6\x6e\x86\xce\x5d\xf8\x1a\x93\xe1\x3f\x71\x09\x6b\xf1\x79\x57\x9e\xd1\x03\xf9\xfc\xfa\xeb\x57\x0b\xe3\x5d\x99\x4e\x0f\xc4\xf8\xbb\xac\x5d\xed\xd5\x4a\x55\xcb\x55\x6b\xb5\xea\xcc\x92\x31\x1f\x5f\xc5\x43\xc7\x7d\xea\xae\xea\xde\x93\x52\xf3\x39\x4c\x55\xf4\x5c\x90\x82\x41\xf3\xef\xa1\x01\xde\x7e\xcf\x47\x45\xea\x3f\x94\x49\xfc\xd6\x16\xe3\x7b\x55\xef\xf9\xcd\xdf\xa5\x10\x79\xbf\x57\x05\x88\xaa\xbf\x46\x88\xc8\x12\xe0\xa6\xf1\x55\x45\xc4\xb8\x7e\xf1\xbc\xdf\xab\x62\x45\x34\x83\xb0\xc5\x3a\x86\xd4\x68\xb1\x0a\x22\xb9\x30\xc6\xb9\x58\xcc\x21\x17\x0b\x05\x2b\xaa\x14\xf2\x47\x99\x5e\x52\x09\xd7\x8c\x54\xa1\x98\x52\x51\x89\x44\x28\x49\x61\x5f\xa9\x8d\xd2\x74\x05\x82\x53\x3b\x76\x0d\x1a\x56\x45\x71\x3a\x22\x4d\xd8\x63\x54\x1f\xcf\x10\xb9\x30\xc7\x19\x41\x92\x98\x49\x60\x6d\x87\x66\x0e\x0e\xec\x73\x7c\x6e\xfb\x08\x8e\x22\xc2\xf2\x68\x6e\x9b\x8c\xe3\x78\xd8\xef\x6d\xed\xa4\x41\xa2\x5c\x2c\xe2\x89\x64\x5c\xcf\x5b\x24\x4e\x10\xaf\x89\x26\xf9\xef\x2b\x8a\x24\x81\xd3\x1b\xa6\x95\x5d\x2a\xb8\xe0\xe3\xdf\xa8\x14\xa0\x34\xd1\xa5\x02\x32\xd7\x54\x82\x39\x4f\x61\x7c\xb1\x2b\x37\x0b\xf0\x5f\x25\xb9\xc6\x29\x4d\x4b\x8c\x1e\x49\x97\x18\xa7\x54\x77\x04\x20\xab\xa8\x81\x5e\xda\xe7\xca\x75\x3c\x9e\x9c\xdd\x15\xd9\x33\xcc\xef\xca\xc2\xf6\xf2\x85\x87\x2f\x56\x34\x26\xd0\xda\x92\x00\x98\x67\xf3\x54\x87\x35\x6d\x89\x8d\xb2\x22\x7f\x3b\x51\xda\x3d\x11\x50\x13\x29\x0c\x13\x1a\x3d\xe8\x25\x51\x36\x3f\x2d\xb2\xb1\xb6\x2a\xf7\x12\x15\xd6\x1c\x09\xb9\x10\xdc\xe1\x11\xec\x1e\xf5\x18\xf0\x39\xe5\xae\xb2\x1a\xd6\xe7\x61\xaa\x4a\xf2\x6e\xa6\xc1\x59\xd4\xee\x60\xf0\xba\x3e\x18\xf4\xf4\xee\x6c\xf0\x1a\x5b\x72\x90\xc2\x13\x4e\x2d\x4b\x5a\x1d\xc8\xb9\xb2\x39\xc9\x15\x0d\x23\xa0\x36\x86\x5b\xb0\xae\x31\x92\xd7\x34\x1a\x42\x44\xa5\xb4\xe9\xa5\x7e\x08\xbe\x41\xd9\x05\x76\xd0\xe1\x40\x3a\xe4\xdc\xbe\x88\x86\x7f\x6d\x1f\x39\x82\xcf\xfe\xa4\x52\x7a\x60\xfd\x5e\x92\x80\xa2\xda\xb3\xee\xe3\xc5\x23\xab\x8b\xa8\x93\x0a\xdf\x3b\xb5\xa8\xc6\xac\x6e\xb5\x52\x97\xa0\xac\x57\x77\x24\xa4\x8a\x3f\xd0\x75\x34\x48\x09\xff\x56\xbb\x63\x44\xc3\xf5\x4e\x8f\x44\xa1\xf6\x63\x53\xb6\xcf\x81\x3d\x18\x36\xf3\x6a\x4a\xb5\x5b\x04\x6c\x30\x39\xb6\xe2\xe1\x2c\x1f\x0e\x2d\x1f\xeb\x85\x3f\x11\x54\x1b\x9e\xc6\x3f\x13\xa6\xdf\x48\x51\x16\xc3\x7e\x4f\xf0\x94\x36\x5e\x7e\xe4\x29\x1d\xf6\x7b\xf6\x06\xc8\x07\xa1\xd9\x7c\x13\x05\xc7\x06\xc3\x7e\x6f\x21\x1c\xae\x33\x5f\x18\x61\x2b\x23\x50\x43\x9c\xc9\x66\x8c\xcc\x4c\xfb\xe5\xd7\x27\x66\x89\xb2\xc3\x76\x8b\x48\x9c\xa4\x9a\xb3\xf5\x47\xce\x6e\xcc\x00\x36\x62\x53\x1e\x55\xd0\xc4\xb0\x45\x52\x9f\x22\xfe\x60\xa2\x88\xe6\x08\x2c\x6a\x1d\x2e\xee\x54\x7a\x5b\x29\x57\x35\x68\x76\xac\x18\xd7\xdf\xfd\x29\x6a\x9f\x71\x0e\xe1\x7f\x9c\x32\x34\x9b\x39\xcb\xf2\xe0\x98\xa7\x5d\xcb\x0f\x4f\xa5\xbf\xee\x50\x37\x6c\x62\xe4\xee\x29\x8c\x9c\xba\x46\xe1\xa9\xe7\x70\x68\x46\xd7\x49\x13\x2d\x43\x41\x79\x16\xb9\x82\x11\x84\x0d\x21\x8b\xeb\x45\x7c\x9c\x65\xf6\xe4\x5b\xc5\x66\x25\x1c\x60\x9f\x26\x21\xa1\xeb\x04\x81\x68\x13\x5d\x3c\x4c\x92\x3f\x2a\x84\x10\xf6\xdd\xef\xe1\x28\xa3\xde\x45\x79\xc3\xd9\x1a\x5a\x65\xc9\xe8\x1c\x6d\xee\x22\x7e\x25\x38\x8d\x86\xa6\xcc\xa9\xd9\xe1\x51\x03\x9a\x9b\x8c\x79\x53\xe5\x0e\x0e\xfc\x93\x19\xdd\x53\x29\xad\x78\x4e\x72\x81\xfb\x1d\x23\x6c\xe5\x17\x83\xc1\x1f\xaf\x07\x26\x97\xc0\xf6\xb3\x35\xff\x57\x2c\x6a\x51\x14\x34\x33\xcb\xc0\x63\x59\xdd\x46\x2a\x6e\x44\x45\x9d\xda\x74\x4e\xd6\xb7\xb3\xd9\xc4\x4e\xd6\x3a\x80\xb2\x67\xaa\xd6\x04\x0f\x9e\xa8\x41\x95\xe6\x51\x63\xe3\x9c\xb9\x49\xd8\x3a\x70\x6c\x1e\x3a\x37\x49\xa7\x54\x57\x1b\x2f\xe5\x96\x81\xc8\x4f\xfb\xea\x8d\x99\xf1\x43\x6f\xbf\xc2\xfd\x63\xa5\x09\x2a\x0e\xc3\x47\xc8\xbd\xb9\xd3\x14\x1b\x32\x3f\x59\xa2\x06\xd5\xa8\xd9\x56\x65\xc0\x1e\xa2\x78\x01\x0b\x0f\x53\xbb\xa0\x42\x97\xba\x77\x28\x66\x5d\x63\xe4\x2e\x51\x21\xe0\x00\x3f\xaa\x97\x8c\x86\xb1\xbf\x38\x70\x8f\x7e\xd6\x35\x1f\xab\x9d\xd8\x42\x3d\x65\x77\x91\xdc\xa1\xa5\xce\x5c\xed\x68\x69\xaf\x56\xd2\xc6\xac\x78\xa4\x8a\xee\xd1\x51\x9b\x78\xf3\xa5\x1a\x1a\xb2\x9b\x07\x2c\x6e\x9b\xd3\xe8\x3e\xdd\x9c\xd6\xca\xa9\xee\xd5\x4e\xf5\x08\xf5\x54\x7b\xf4\xb3\xb9\xd9\x6f\x11\xef\xe8\x68\x6b\xdb\xdd\x22\xbf\x53\x4f\xc3\xe8\x49\x53\x55\x5b\xd1\x9e\x96\xb6\xaa\x87\xa9\xab\x0a\xf4\xb5\xd9\xa0\x4b\x46\x7b\xb0\xc6\xaa\x87\xab\x6c\xb3\xc2\x1e\x95\x4d\x12\x38\xe3\xaa\x60\xd2\x1e\xe1\x9b\x1a\x87\x49\x72\x89\x1b\x87\x4b\x49\x52\x7a\xc9\xb8\xb9\xc3\x49\xd2\x25\xa3\x38\xd9\xc6\x05\x95\x73\x9a\xea\xb1\x52\xf9\x38\x27\x97\x6a\xac\x52\x21\xe9\x18\x77\x0b\xe3\x85\x68\x75\x3b\x3b\x9f\xda\xc3\x7c\x38\x82\x03\x9d\xab\xd8\x3e\x19\x7e\x92\x04\x4e\x48\xa9\xa8\x02\xaf\xf2\x2e\xd2\xf8\x46\x7c\xab\x2a\x7f\x2d\x65\xc5\x92\x4a\x55\x32\x4d\xa1\x90\xa8\x7e\x94\xa7\x54\x8d\x5c\x0b\xf6\xcc\x96\x48\x0a\xba\xc4\x1d\x9f\x16\x40\xae\x05\xcb\x80\x68\x4d\xd2\x2b\x15\xc3\x2b\x77\x4a\xb9\x34\x91\x11\x0e\x69\xce\x28\xd7\x2a\xc6\x06\x26\xa6\x41\xa7\x85\xa6\xa3\x29\x76\xa4\x0e\x8d\x3b\xed\xfb\xf8\xc8\xf3\x8d\x01\x96\x96\xf2\x9a\x2a\xd7\xe7\x92\x5c\x53\x20\x4a\xd1\xd5\x65\xbe\x01\xb6\x2a\x72\xba\xa2\x5c\x9b\x98\x85\x72\x35\xbd\x3c\x1b\xd7\x69\x73\xc2\x17\xc9\x42\x24\x5a\x52\x9a\xac\x88\xd2\x54\x26\x4a\xa6\x89\xbb\x5c\x4c\xf3\x9c\x15\x9a\xa5\xd8\xc4\x09\x76\x38\xa9\xb9\x3e\x84\x5f\x7e\x35\x52\xc4\xf2\xb3\x57\xb7\xd5\xf7\xc9\xf3\x97\xdf\x6d\x11\xaf\xcf\x83\xf9\x51\xd1\xf7\x22\xa3\x92\xe3\xff\xf6\xd2\x26\x02\xfa\x51\x51\x58\x99\x72\x13\xf5\xc4\xaf\x15\xc8\x35\xbb\x62\xf1\x4a\xfc\xc6\xf2\x9c\x98\xbb\xb5\xe6\xee\x28\xd3\x9b\xc4\x0a\xe8\x62\xca\x32\x7a\x31\x3b\x9f\xfe\xc1\xb6\x7c\x91\x8a\x55\x41\x34\xbb\x64\x39\xd3\x1b\xec\xe0\x03\xbd\xd1\x13\x29\xb4\x30\x40\x5d\x28\x68\xb0\x7c\x3e\x70\xf6\x3f\x79\x16\x3f\x1b\x6c\x47\x2d\xe1\xac\xd7\xeb\x58\xac\x89\x2a\x4c\xa7\x8c\x67\xf4\x26\x2e\x96\x45\x32\x93\x84\xab\x42\x48\x7d\x71\x4e\x36\x54\x5e\x60\xcb\x36\x6c\x78\x71\xb2\xa4\x44\x5f\x4c\x97\x94\xea\x3f\x7c\x2a\x73\x7a\x31\xbe\xc0\x41\xba\x98\xda\x0b\x63\x17\x53\x2d\x05\x5f\x98\x1a\x22\x15\xb9\x19\x8e\xf7\x8c\xff\x44\xa5\x62\x82\x1f\x22\xef\xb1\x7b\x98\x9d\x4f\x9f\x3d\xf7\x90\x66\x4b\x8a\xc3\x5c\x4f\x39\x55\xdd\x41\x7b\x2d\xe4\x9a\xc8\x0c\xa6\x34\x95\x34\xdd\x1c\x56\xf0\x29\x8f\x51\x72\x05\xcd\x98\x15\x1b\x3e\x25\x8e\xfc\x42\x59\x72\x33\x98\x8d\x09\xf6\xcb\xaf\x25\xe3\xfa\xd9\x77\xd6\xea\x23\xa0\xd9\xf9\xf4\xe2\xf4\xe4\xd5\xdb\x53\xfc\x7f\x7a\x7c\xf1\xf3\xd9\xec\xed\xc5\xf1\xe9\xf4\xe2\xf9\xcb\xef\x2e\xde\x9c\xbc\xbf\x98\xbe\x3d\x7e\xf1\xe7\x3f\x8d\x3a\x2a\x7c\xfa\x32\xf2\x56\xfb\xcf\x9e\xff\xd9\x57\x78\xfe\xf2\xbb\x7b\xdb\xbf\x9f\x3c\x68\xff\xe4\xed\xf1\xc9\xdb\xe3\xe7\x4f\x2f\x26\x1f\xcf\xff\xfe\xec\xc5\xd3\x97\x77\x36\xdf\x4d\x5d\x4d\x6c\x1f\xf3\xb3\x0e\x49\x92\xc0\x65\xc9\xf2\x0c\x4c\x64\x1c\xc7\xc6\x3a\x20\x30\x97\x62\xe5\x83\x18\xa2\xf0\xfa\xe8\xcd\x79\x78\x12\x51\xa5\xfe\x76\xa5\xdc\x05\x89\xb7\x9d\x26\x2d\x0e\xe8\x95\xcf\xfd\x72\xfa\x19\xa6\xd0\xd9\xcc\xd9\xfb\x9b\xf8\xe5\xe9\xaf\x23\xb7\xad\xc6\x36\xce\x05\xc9\xfe\xf7\xe5\xd3\xbf\xbc\xa3\x9b\x09\x61\x32\xda\x1f\x36\x76\x5b\x9d\x2a\x28\xda\x66\x66\x7f\xcd\x61\x55\x67\x74\xc7\x2f\x08\xdc\xd7\xfe\x3b\xba\x79\x48\x17\x7b\x53\x93\x1b\x71\x82\xde\x36\xf0\x62\x3b\xd2\x16\x83\x51\x49\x12\x97\xa1\x12\x86\xa8\x4e\x8e\xc3\x13\x20\x24\x4b\x09\xd6\x1f\x81\xfd\x3c\xb5\xbe\x1a\x13\x66\xb5\x46\xf7\xe2\x35\xcb\xe9\x17\x4b\xf7\xf8\x0b\xe5\xeb\x99\xaf\x41\x74\x89\xa0\x7a\x5b\xb9\x7c\xb6\x64\x22\x44\x8e\xa8\x6f\x5e\x3e\xfd\x4b\xfc\x81\xae\x7d\x99\xf5\x40\x85\x49\x23\xaf\x29\xe3\x63\xe3\x38\xe3\xa3\x7a\x2d\xc5\x6a\x72\xfa\x3e\xb2\x6f\x3d\x8a\x6f\xc4\x55\xb3\xe3\xf9\x4a\xa3\x3f\x2a\xe4\xdc\x84\x4e\xb8\xd0\x36\x45\xaf\x25\xce\x41\xed\x8b\xee\x99\xcf\x66\x71\x3d\x39\x46\x7d\xa8\x01\xdd\x47\x7f\x5c\x9a\x94\x64\x9c\xf5\x9f\xe8\x3f\x4a\x26\xe9\x31\xcf\x7e\xa2\x92\xcd\x37\xae\x41\x2a\x75\xa0\xf6\x29\xc9\x73\x48\x4b\xa5\xc5\x0a\x66\xe7\xd3\x2a\xa2\x47\xb4\x90\xe1\x3e\x64\x76\x3e\x8d\x3a\xfb\x1d\xba\xf9\x95\x53\xde\x4d\xd0\x50\x4c\x17\xbc\x3b\x38\x80\x6e\xda\x37\x54\x37\x12\x6b\x83\x81\x4d\x12\x17\x29\xae\x6c\x14\xe1\x99\x87\xee\xcc\x15\x3a\x2f\x05\x3a\x12\x99\x4b\x00\xa4\x3c\x53\x50\x16\x3e\xf0\xdc\x9e\xcf\x5d\x86\xac\xbe\xb5\xd0\xf9\xde\x64\x10\x07\x24\xc1\x2e\xc3\x1f\x62\x19\x17\xd0\xe6\x74\x7e\x1e\x8f\x5b\xa7\xdb\x9f\x0d\x6c\x57\x7e\x45\x37\x9f\x61\x4d\x25\x6d\xe6\x15\xb8\xfb\x02\xdb\xfe\x3d\xed\x77\x36\xbf\x26\xaa\xab\xb5\xed\x1e\x7e\xdb\xfc\x3c\xa0\x3b\x8b\xfa\x8e\x6e\x92\xc4\x4a\x7f\x69\xb6\x9d\x2e\xec\x4f\x60\x8d\x9e\xc4\x1d\x93\x2d\xe8\xbb\x39\x54\xa6\xb3\x6a\x2a\xda\x0c\xc3\xd9\xf9\xb4\x0e\x33\x26\x09\xac\x4a\xa5\x9d\x23\xa9\x21\xa7\x44\x69\x73\x30\x11\xb6\x22\x24\x14\x84\xb3\x54\xed\xf3\xac\xe3\x1f\x70\x11\xc4\x5d\xdf\x4c\x04\x22\x8a\x86\xfb\xb6\xe4\xaa\xb1\x27\xaf\xb7\xc2\xea\xf1\xbb\x72\xf5\xcf\x6f\xcb\x55\x73\x5f\xae\xbe\xf6\xc6\x5c\xfd\xc7\xed\xcc\x55\xf7\xd6\x1c\xad\xe0\x07\xba\xde\xbb\x85\xec\x36\x68\x55\x58\xba\x92\xfe\x42\x54\x5b\xbd\xa9\x3b\xaf\x8c\xd6\x8b\x11\x1c\xb8\x91\x1b\x5a\xf2\x9f\x09\xd3\xd1\xce\xef\x43\x24\x09\x58\x00\xd5\x4d\x9c\x66\xce\xb2\x4f\xa4\xb6\x6d\x75\x1c\x1b\xba\x53\x81\xea\x97\x2a\x5c\xf6\x76\xf3\x24\x01\xd0\x3c\xe6\x92\x92\x6c\x03\x19\x4e\x7c\x54\x40\x93\xb7\x1d\xa0\x01\xd8\xf6\x83\xea\xdd\xd1\x09\xac\xe3\xb6\x37\x28\x1f\xfb\x7b\x2c\x6c\x6e\x85\x65\x9f\xd6\x44\xf1\x6f\xb5\x3f\xdf\xab\x13\xca\xab\x0b\x23\xce\x9e\xf8\x94\xf9\xe0\x22\x89\xb9\x2d\xe2\xf2\xc9\xab\x6d\x94\xe9\xc7\xe5\x2c\xd9\x94\x8d\xaa\xbf\x46\x69\xab\xdf\xee\xb8\x42\x75\x3a\xd4\x75\xab\xa2\x11\xe4\x73\x7b\xfb\x10\x84\x4e\x0b\x93\x93\x01\x36\x27\xa3\x82\xd1\x2a\xef\x02\xd2\x1d\x00\x69\xa1\x09\x2f\x70\x04\x31\xcd\x0e\x24\x26\x33\xc2\xa5\x2c\xd4\x38\x1a\xa5\xf7\xa0\x08\xe2\x3d\x3b\x38\xee\x0e\xdf\xb6\xb1\xd8\x04\x88\x1d\x30\xcd\xe2\x7b\xd0\x84\xf1\xa4\x1d\x38\xf7\x05\x89\xb7\x77\x4e\x5d\x7f\x42\x83\xb3\x2a\x13\xab\xa9\x48\xaf\xbc\x66\x54\xb7\xfc\x6a\x3b\x17\xdd\x7d\xac\xe1\x26\x73\xc3\xb3\xb6\xf3\x38\xf0\xad\xed\xfc\xb5\x93\xbb\x99\xb1\x7c\xd4\x46\x70\xaf\xd2\x79\xe4\xf9\x5d\x90\x75\x5a\x0c\x46\xa6\xe4\x6f\x82\x71\xd4\xa1\x89\x90\x3a\xf2\x97\xaf\xfc\x1d\xc6\x33\x2d\x48\x64\x2f\x95\x0d\xbf\x8c\x17\xf3\xb1\x1c\x41\x51\xdf\x8b\x5c\x93\x85\xfd\xf1\x9b\xaa\x3b\x0f\x71\x77\x59\xfb\x62\xa9\x39\x7b\xb0\x74\x8f\xee\x8e\x58\xe1\x1e\x9b\xe1\xfb\xfc\xa1\xa2\xac\xec\x57\x75\x79\xea\x4b\xc5\xe9\x2c\xd5\x8e\x44\x5d\xd6\xe6\x63\x84\xaa\x96\x23\x50\x77\x8a\x35\x40\xfb\x15\x24\x1b\x18\xdb\x65\x5d\xe4\x04\xac\x42\x09\x07\x21\xd7\x00\x82\x97\x72\x6b\x85\x39\x72\xc7\xe2\x3b\x8b\x9b\x5f\x11\x7d\x98\xc0\x78\xe5\x39\x25\x1c\xfd\x6e\x49\x95\x28\x65\x4a\x55\xc7\x31\xb9\x5f\x49\x83\xdf\x60\x62\x73\xb0\x3f\xdd\x17\x9f\x88\x55\x41\xcc\xe6\x65\xba\x26\xc5\x19\xd7\x2f\x9e\x47\x07\xf6\x3e\x99\xcf\x06\x32\x57\x07\x9f\x59\xa7\x25\x45\xef\x22\xaa\xef\x9b\x0d\xc3\xb3\xfb\xf6\x0f\x35\xd5\x79\x09\xad\x15\x1d\x9e\x34\x4f\xa0\x47\x3e\x9c\x3a\xd1\x12\x9e\x34\x0f\x8c\x4d\xbf\x49\xe2\xfd\x24\xeb\x7f\x8a\x34\x2d\x25\xe4\x04\x67\x90\xdb\xac\xd4\x67\xde\xb2\xe6\xd8\xd4\x8c\xb4\x80\x42\x52\xd3\x05\x88\x3c\x83\x4b\xba\x24\xd7\x4c\x94\xe8\x0c\xb5\x9d\xb0\x7e\xef\xfb\x71\xcd\x5e\xf3\x24\xfb\x49\x8d\xb2\xdf\xef\xa5\xfa\x06\x37\xe8\x3c\xa5\x66\x9f\xeb\x7e\x72\x31\xfe\x99\xe9\xa5\x33\xa8\x91\x2f\x9b\x7d\x7c\xf5\x31\x1a\xa2\x9f\xd8\xba\x22\x54\x01\xb0\xed\x60\xff\xc6\x29\x98\x33\xa9\x34\xd0\x1b\x9a\x96\x2e\x17\xa0\x90\x74\x5c\xe5\x70\x2d\x85\xb8\x72\xd9\x22\xf1\xc4\x3b\xca\x01\xd7\x75\xba\xd7\xc9\x92\x70\x44\x57\x5f\xf2\xbb\x14\x22\x1f\xda\xa4\x0d\x16\x64\x6c\x38\x2e\x6f\x2b\xbf\xd9\xe8\x90\x2d\xfd\x85\xfd\x1a\xf8\xb2\xce\x7b\xbd\x36\x3f\x76\x95\xa6\x54\x29\x97\x10\xe6\x3d\xda\x90\xaa\x09\xe4\xfb\xb1\xaf\x62\xbc\xd0\xb6\xcf\xab\x9c\xbb\xeb\x19\x49\xf5\xcd\x6e\x8e\x86\x59\x31\xcd\xbe\xdf\x06\xcd\xaa\x34\xcc\xfa\x57\x9b\x84\xf4\xa3\xe1\x17\xcd\x43\xe7\x0d\x5b\x8f\xd7\xfc\x4a\xa2\xe3\xd2\x77\x76\x08\x4d\x0f\xb9\x4e\x48\xea\xf5\x3c\x9b\x5e\x35\x5d\xc0\x27\x1a\x56\xf9\x21\x38\x93\xa1\xe4\x9a\xe5\x80\xfb\xfc\xda\xe9\x34\x1b\x25\x57\x7f\x5e\xe6\xf9\xc6\x5c\xce\xb2\x17\xb3\x5c\x06\x52\x4a\xec\x45\xb3\xe6\x28\xf6\xab\x5e\x0f\x7d\xb7\x38\x64\x1d\xa3\x55\x81\xf3\xdf\x0e\x0e\xe0\xfb\x71\x28\x77\x7f\xe1\xdd\x13\xd4\x89\x59\xbb\xfa\xe2\xd3\xac\xde\x54\xe9\x24\xce\xfe\x29\x20\x3e\x11\x05\x4a\x85\x73\xd8\x7a\xd4\x54\x75\x67\x93\xd5\x0d\x44\xc3\x46\x8e\x22\x76\xef\xaf\x96\x56\xe7\x3a\x55\x6e\x97\x27\x22\x79\x2e\xd6\xca\x65\x70\xdb\xdb\x6c\xc4\xf9\xc9\x8e\x42\x70\xbb\xf9\xdd\xe7\xcf\x07\x09\x31\xbe\x4a\x08\xc3\x4c\xd0\x30\xc7\xaa\x09\x05\x7d\x1d\x6f\x94\x2b\x09\x98\xa4\x1c\xe3\x86\xf8\xdb\x58\xd5\x92\xb9\xd3\x7d\xd8\x40\x34\x84\x28\xdc\x00\x8e\x1e\x9c\xae\x74\x78\x67\xbe\x52\x60\x78\x47\x61\xce\x52\x2d\xdf\x86\xd3\x34\x0a\x56\x13\xd4\x81\x4e\xfe\x82\x3d\x42\x17\x5b\x61\xbd\x7f\x1f\x5b\x8d\x84\x82\x9a\xa9\x6a\x1b\xd2\xc1\x93\xba\x83\xa9\xa0\xde\xbf\x97\x27\xd5\x66\xca\x40\xed\xca\xb3\x72\x4b\xe8\x47\x9b\x72\x55\xb3\x72\x6b\x93\xb9\xe2\x57\x22\xb2\x76\xf8\xb6\x61\x38\x82\x9b\xdf\x55\x6a\x5a\x98\xe0\x7b\xdb\x88\x0c\x38\x47\xc3\x6d\x77\x1b\xd7\x4a\x6d\x14\x0a\xcd\x2c\xe3\x3e\x8b\xaf\xd7\x6c\xab\x32\x97\x55\x7b\x61\x03\x71\x1c\xc3\x60\xd8\x12\x5f\x6d\x89\x76\x05\xf8\x70\xeb\x6d\x05\xbb\x0d\x7e\xcc\x25\x4c\x63\xab\x25\x80\xeb\xe1\xf7\xe3\x3a\x63\xd9\x9a\x04\xf3\x35\x6e\x13\x8f\xc0\xfd\xc2\x71\x3c\x3d\x7b\x73\xf6\x61\xd6\x78\x9e\x9d\x7e\x7a\x8f\xbd\xfd\x7f\x00\x00\x00\xff\xff\x4b\x3c\xa5\x19\x09\x5a\x00\x00") func templatesServerServerGotmplBytes() ([]byte, error) { return bindataRead( @@ -595,12 +762,12 @@ func templatesServerServerGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/server/server.gotmpl", size: 23074, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfa, 0x5d, 0xf2, 0xfe, 0xe2, 0xab, 0x28, 0xe5, 0x67, 0x51, 0x2, 0xfa, 0x1c, 0x9f, 0x68, 0x15, 0xb0, 0xa6, 0x9a, 0xe6, 0xda, 0x80, 0xdc, 0xc, 0x65, 0x77, 0xcd, 0x42, 0x91, 0x7, 0x2f, 0x7}} + info := bindataFileInfo{name: "templates/server/server.gotmpl", size: 23049, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x72, 0x85, 0x28, 0x2d, 0x49, 0x40, 0x62, 0x64, 0x9, 0xda, 0x68, 0x50, 0x3a, 0xa3, 0x17, 0x89, 0x3a, 0x99, 0x62, 0x59, 0xb3, 0x94, 0x22, 0x67, 0x40, 0x12, 0xa2, 0x85, 0xf1, 0x47, 0x63, 0x1d}} return a, nil } -var _templatesServerUrlbuilderGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x58\x5f\x8f\xe3\xb6\x11\x7f\xd7\xa7\x98\x08\x4d\x23\x1f\x6c\xf9\xfa\xda\xc2\x05\x72\x7b\x97\xf6\x8a\xf4\x72\xd9\xdd\x34\x0f\x41\xb0\xa0\xa5\x91\x4d\x9c\x44\xca\x24\xe5\xad\x2b\xe8\xbb\x17\x43\x51\x7f\x2d\x79\xf7\x76\x37\x41\x8b\xe4\xc9\xb2\xc8\xf9\xcb\xdf\xfc\x66\xa8\xb2\x84\x18\x13\x2e\x10\xfc\x43\x81\xea\x94\x33\xc5\xb2\x6d\xc1\xd3\x18\x95\x0f\x55\xe5\x95\x25\xf0\x04\x84\x34\x10\xbe\xd7\x5f\x2b\xc5\x4e\x50\x55\x65\x09\x06\xb3\x3c\x65\x06\xc1\xd7\x3c\xcb\x53\x9c\x90\x0e\xeb\x9d\x98\x6a\x3c\x93\x49\x79\x74\x49\x44\xc4\xb5\xed\x55\xf7\xd8\xfa\x39\x6b\xaf\xf5\x36\x7c\xaf\x3f\x14\x69\xca\xb6\x29\xc2\xaa\xaa\xbc\x23\x53\x50\x96\x70\x64\x4a\xb0\x0c\x21\x7c\xff\x16\xaa\xea\x7b\xd0\x46\x71\xb1\xf3\x78\x42\x8b\xe1\x35\x46\xc8\x8f\xa8\x3e\xd0\x96\xaa\x0a\xcb\x12\x72\xa6\x23\x96\xf2\xff\x34\x22\xf0\xc5\x06\x04\x4f\xa1\xf4\x60\x4a\xdf\x06\x9c\xf9\x6f\xa4\xca\x98\x31\xa8\xea\x68\x06\xff\x83\x57\x8f\x34\xb6\x18\xa4\xae\x3b\x83\xab\x42\x1b\x99\xf5\x55\xbe\x6a\x33\xf6\x48\xd5\x6d\x96\xce\x75\x85\x37\x36\x29\xc1\xa2\x2c\x51\xc4\xb4\xd5\xfe\x78\x36\xb5\x9d\x3b\xe3\xd0\xff\xfc\xb8\xd8\x9f\x14\xfa\x2f\x14\x91\x4b\x1a\xe1\xa3\x46\xc0\x38\xa6\x2f\x36\xe0\xfb\xf6\xac\x0f\x3a\xbc\x41\x43\xde\xe7\x8a\x0b\x93\x80\xff\xe5\xc1\x87\xd0\xf9\xb3\x9c\x10\x5e\x78\xad\x81\x11\x78\x09\xf8\xdc\x60\xf6\x04\xfc\x86\xff\x62\x69\x81\xef\xfe\x9d\x2b\xd4\x9a\x4b\x01\x55\x75\x33\x02\xf1\xf9\x8e\x11\x66\x27\x75\x7c\x06\x70\xcf\xc5\x7b\x87\x35\xb3\xe3\x59\x70\x5b\xd5\x59\x99\xf4\xfb\x33\x50\x77\xd1\xef\x17\x73\xfb\x0c\x53\x93\x6e\x77\xc0\x9a\xde\x71\x0d\x1b\x60\x79\x8e\x22\x9e\x71\xfd\x7a\x39\xa7\x7b\x8c\xbb\x01\xec\xa6\x21\xd7\x80\xeb\x6a\xcf\xd3\x78\xd2\x9b\x9f\x7e\x76\x20\x4b\xa4\x82\xbb\xe5\xc5\xdd\x74\x26\x8a\x89\x1d\xce\xc1\xb1\x0e\x7b\xd5\x12\x5a\xad\x68\xae\xb5\x5c\xa8\x96\x5a\xf2\x09\x2d\xa6\x2f\xe7\x0e\xab\xf2\xfa\x7d\xae\x76\xe9\x23\x53\x28\x4c\x83\xbf\x61\x7d\x53\x94\xfa\x9e\xed\xc2\x7f\x48\x2e\xde\x9c\x6a\x68\x04\x17\xb3\x68\xd3\x36\xa0\x8f\x2b\x99\xa6\x18\x19\x2e\x45\x2d\x4f\x98\x74\x6e\xe0\x61\x62\xd9\xcf\x8a\xd4\x70\x7b\x66\xee\x20\x0e\xfa\x38\xc8\xf7\xc8\x49\x47\x5d\x5f\xc7\xf1\x3c\x75\x1d\xf4\x71\x31\x20\x77\x02\x6e\x8a\x22\x38\x53\xb7\x80\xbf\xc2\x6b\xa7\xf3\xe8\x4a\x6f\xb8\xe3\xa7\xd7\x3f\x7b\x40\xee\xd3\x86\x0e\xe4\x0f\xf3\xa7\x75\x02\xa0\x1a\x93\xe6\x63\x08\xe0\x97\x39\x86\x2e\x09\x93\x55\xd6\xa6\x62\x66\x83\x76\xf9\x99\x5a\x6b\xb3\x34\x2b\xdb\x4f\xdd\x8b\x33\x84\x1e\x65\x7a\x55\x8d\x1f\x07\x9c\x91\x33\xb3\xff\x6d\x51\xc6\x79\xc4\xff\xdb\x8c\xf1\x70\xbd\xe6\x0f\xd5\x6b\x3e\xaa\xd7\x3b\xca\x01\x6c\xdc\x6c\xa1\xc3\x6b\xcc\x53\x16\x61\x60\xdf\x2f\xc1\xef\xf9\x55\x7e\xa9\xab\xae\x94\xfd\x25\xe9\x5a\xc2\xea\x4f\x16\x65\x75\x92\x6b\x9d\x0a\x4d\xa1\x04\x8d\x22\x4b\x40\xa5\xa4\xd2\xe1\x07\xbc\x0f\x48\x57\xc4\x32\xec\x4f\xd9\x5c\x83\xc2\x43\xc1\x15\xc6\x20\x05\x0c\xc6\xbd\x3f\x34\xa6\x7e\xb8\xfe\xd6\xef\x43\xf9\x77\xaa\xf8\x35\xa9\xa2\xaa\xbc\xf5\x1a\xae\x64\x8c\xb0\x43\x81\x8a\x19\x8c\x61\x7b\x82\x9d\x5c\x51\x96\x77\xa8\xfe\x02\x6f\xbf\x83\x0f\xdf\xdd\xc2\xbb\xb7\xef\x6f\x43\xaf\x29\x97\xf0\x4a\xe6\x27\xc5\x77\x7b\x5b\x27\xeb\x35\xd9\x8e\x64\x96\x51\xe1\x0c\xd7\x3a\x4b\x9e\x97\xb3\xe8\x13\x73\x04\xf1\xd1\x3d\xd3\xc2\x7a\x0d\xb7\x7b\xae\x21\xe1\x29\xc2\x3d\xd3\x43\x67\xcc\x1e\xc1\x79\x03\x46\xca\x34\xa4\xfd\xef\x62\x6e\xb8\xd8\x81\x69\xe5\x32\x6b\x31\x57\xf2\x88\x90\x14\xc6\xaa\xda\xa3\x80\x93\x2c\x40\xe1\x4a\x15\xc2\x6a\x6a\x54\x5b\x77\x99\x88\x3d\x8f\x67\xb9\x54\x06\x02\x0f\xc0\x4f\x32\xe3\xd3\x6f\x0d\x6d\x7a\xdc\xc9\x94\x89\x9d\xb3\x4f\x85\xa3\xc1\xa7\x1f\xbb\xcd\x55\x96\x7d\x16\x68\xd6\x85\x4a\x7d\x8f\xfe\xec\xb8\xd9\x17\xdb\x30\x92\xd9\x7a\x27\x57\x32\x47\xc1\x72\xbe\x26\x2d\xfe\x85\x65\xa3\xac\xfd\x85\xcd\xc8\xf0\x7a\xd4\x95\x4b\x1b\x81\x06\x26\x80\x5e\x10\x39\x53\x68\x65\x09\xfb\x22\x63\xa2\x2f\x00\x32\xa7\xcd\x5c\x0a\xcf\x9c\x72\x9c\xd7\xaa\x8d\x2a\x22\xd3\x40\xbc\x26\xf2\xf0\x23\x33\xfb\x8f\x44\xa2\x9a\xce\x09\x60\xea\x32\x5d\x96\xe1\xdf\xe4\xed\x29\x47\xb7\xa3\xbd\xeb\xf7\x15\x7d\x4f\x2c\xfe\xb0\x26\x82\x16\x13\x31\x04\xfd\x0f\x15\x8b\xc1\x45\x6a\x78\x4f\x9e\x31\xed\x01\xdc\x6d\x99\x46\xf2\xbf\xb9\x5a\x81\xd3\x2f\x15\x04\x3b\x03\x41\x8a\x62\x10\xe0\x02\x5e\x2f\x7a\x2b\x3d\x8f\xed\xca\xca\xda\x58\xaf\x81\x1d\x25\x8f\xa1\x10\x9f\xf0\x84\x31\x14\x9a\xed\x90\xcc\xb9\x04\x96\x63\x4f\x6a\x78\xff\xc8\xcd\xfe\x4d\xeb\x10\x1a\x6d\x0f\x8c\x5c\x04\x4b\xd2\xf5\x11\x72\x0d\x85\x4a\xc1\x75\xac\x25\x48\x91\x9e\x3a\x0e\xb5\x68\xe6\xe6\x2b\x0d\x31\x4f\x12\xb4\x4d\x2a\x51\x32\x23\x55\x64\xa3\xd3\xa6\x73\x8c\x78\xc2\x31\x06\x2e\x06\xe5\x43\x0b\xb6\x7c\x7e\x24\x5d\xb4\x72\x24\xbe\x00\x99\x8c\xfc\xe1\x16\x5c\x98\xe5\xe6\xd4\xe4\x2f\x29\x44\x04\x53\x57\x7f\x78\x35\x07\xaa\xc5\x20\xee\x60\x9b\x3b\x5d\x0b\x12\x19\x49\xd4\x28\x6c\x18\x76\xfc\xad\xe0\x06\x4d\x4f\x0d\x11\x9a\x6b\x44\x13\x9b\x29\xe5\x14\x63\x4f\xe6\xb7\x94\xf2\x61\xaa\xda\x8c\xcf\x65\xb6\xab\x93\x0d\x6c\x73\x07\xd7\x37\x94\x0e\x60\x36\x35\xd6\x39\x2a\x4a\x3b\x89\x3d\xcb\x35\xab\x36\x58\x40\xf0\xaa\x50\x69\xf8\xc3\xf5\xb7\x6e\x86\xa8\xbd\xa3\x71\xf4\x4e\xa1\x2e\x52\x03\x6e\xdd\x6b\x5e\xbb\x49\x66\xdc\xc9\xad\xdf\x23\xaa\x19\x70\x56\x7b\xf9\x6f\x86\xcc\xa6\xc5\x3e\x3c\x2d\xba\x8a\xef\x5d\xa9\x26\xbe\x16\xfe\x3f\x7e\x31\x6b\x46\x91\x51\x24\x2f\x35\x39\x9e\x69\xfe\x95\xe7\xc8\xfa\xc8\xda\x3e\x30\x68\x48\x1d\xd8\xdd\xb4\x36\x5b\x0d\x6d\xbb\x08\x5b\x0e\xa9\x2a\x9e\xf4\x34\x6c\xfa\xf9\xea\x15\xd1\x18\xa3\x3d\xf9\xa1\x7f\x35\xbe\x1c\xe2\x43\x27\x7d\x3e\x6e\xd8\x51\x37\x68\x2d\x2c\xeb\xc3\x59\x78\xad\x87\x33\x2d\xcb\xe9\x3f\xd8\xc9\x34\x63\x9f\x30\xa0\xa2\xb2\xf3\xa1\x9d\x08\x2f\x37\xe7\xae\x3e\x26\x3f\xef\xaf\xce\x9b\x7d\x13\xc8\x35\xbb\xb7\x0a\x61\x03\x07\x1d\xbe\x13\x91\x8c\x31\x58\x9c\xf5\x67\x07\x80\x3f\x3a\xb1\x25\x41\xc1\xb1\xcf\x3f\x0b\x6d\x2c\x1d\xc2\x1e\xd3\x1c\x15\x10\xd9\xd0\x08\x03\x46\x42\xce\x04\x8f\x6a\x62\x26\xfe\xec\x91\xb7\x53\x59\xd3\x28\x41\xea\x69\x24\x45\xd6\x83\x02\x06\x14\xd5\xd0\x54\xf3\xd2\x1e\x3b\x4f\xec\x52\xef\xc3\x2c\xd4\xde\x05\xa8\x54\x83\x45\x9e\x40\x41\x50\x19\x6f\xf1\xc9\xf1\x88\x89\xaf\x0c\x6c\x91\x56\x5b\xf4\xba\xc4\x14\x2e\x19\x75\x11\xb7\xb1\xd9\xd6\xd2\xbc\xa2\x29\x1f\x85\xb1\xe3\x5d\xd3\x50\x6c\xe5\xde\x73\xb3\x7f\x01\xbe\x6e\x08\xa4\xb1\x58\x5e\xec\xbb\xa1\xcd\xdc\xd4\x82\xe3\xfd\x45\xcb\x48\xfd\x36\xf3\x4d\x91\xba\x23\xa4\x13\x4f\xe8\x1f\xe5\xc6\x86\xa0\xa3\x3d\x66\xb8\x84\xbd\xd4\x66\xf9\xe2\x9d\x88\x2c\x07\x7d\x13\x6d\xb3\x9c\x6e\x50\x3c\x71\x0e\x0d\x6a\x7f\x8e\xc9\xdc\xd6\x3e\x7b\xd1\xc8\xd1\x0b\x71\x4c\x66\x53\x5c\xc6\x93\xda\xb3\xc7\x58\xb4\x1b\x9f\x65\xcf\x03\x3b\x90\xd4\x98\x9f\xa1\x48\x77\x98\x33\x05\x30\xf2\xad\xaf\x35\xbc\x71\xc9\x73\x59\x6c\x5e\xff\xdd\xc6\x67\xc3\xec\xf0\x55\xbb\xd1\x71\x42\x8d\x1c\x8b\x95\x47\x95\x02\xa3\xfb\x5d\x9e\xa2\xb1\x14\xf1\x1c\xf8\xcf\xa3\xe4\x33\xaa\x62\x3e\x93\x67\xea\x87\x65\xf2\xdf\x00\x00\x00\xff\xff\x03\x19\x46\x51\xd9\x1d\x00\x00") +var _templatesServerUrlbuilderGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x58\x5f\x6f\xe3\xc6\x11\x7f\xe7\xa7\x98\x10\x4d\x43\x1d\x24\xea\xfa\xda\x42\x05\x72\xbe\x4b\x7b\x45\xea\x38\xb6\xd3\x3c\x04\x81\xb1\x22\x87\xd2\xe2\xc8\x5d\x6a\x77\x29\x57\x25\xf8\xdd\x8b\x59\x2e\xff\x8a\xb4\x7d\xb6\x13\xb4\x48\x9e\x44\x71\x67\xe7\xdf\xfe\xe6\x37\xb3\x2c\x4b\x88\x31\xe1\x02\xc1\x3f\x14\xa8\x4e\x39\x53\x2c\xdb\x16\x3c\x8d\x51\xf9\x50\x55\x5e\x59\x02\x4f\x40\x48\x03\xe1\x47\xfd\xb5\x52\xec\x04\x55\x55\x96\x60\x30\xcb\x53\x66\x10\x7c\xcd\xb3\x3c\xc5\x89\xdd\x61\x2d\x89\xa9\xc6\xb3\x3d\x29\x8f\x1e\xda\x22\xe2\xda\xf6\xaa\x7b\x6c\xfd\x9c\xb5\xd7\x7a\x1b\x7e\xd4\x97\x45\x9a\xb2\x6d\x8a\xb0\xaa\x2a\xef\xc8\x14\x94\x25\x1c\x99\x12\x2c\x43\x08\x3f\xbe\x87\xaa\xfa\x1e\xb4\x51\x5c\xec\x3c\x9e\xd0\x62\x78\x8d\x11\xf2\x23\xaa\x4b\x12\xa9\xaa\xb0\x2c\x21\x67\x3a\x62\x29\xff\x4f\xb3\x05\xbe\xd8\x80\xe0\x29\x94\x1e\x4c\xe9\xdb\x80\x33\xff\x8d\x54\x19\x33\x06\x55\x1d\xcd\xe0\x7f\xf0\xe6\x89\xc6\x16\x83\xd4\x75\x67\x70\x51\x68\x23\xb3\xbe\xca\x37\x6d\xc6\x9e\xa8\xba\xcd\xd2\xb9\xae\xf0\xc6\x26\x25\x58\x94\x25\x8a\x98\x44\xed\x8f\x67\x53\xdb\xb9\x33\x0e\xfd\xcf\x4f\x8b\xfd\x59\xa1\xff\x42\x11\xb9\xa4\x11\x3e\x6a\x04\x8c\x63\xfa\x62\x03\xbe\x6f\xcf\xfa\xa0\xc3\x1b\x34\xe4\x7d\xae\xb8\x30\x09\xf8\x5f\x1e\x7c\x08\x9d\x3f\xcb\x89\xcd\x0b\xaf\x35\x30\x02\x2f\x01\x9f\x1b\xcc\x9e\x81\xdf\xf0\x5f\x2c\x2d\xf0\xc3\xbf\x73\x85\x5a\x73\x29\xa0\xaa\x6e\x46\x20\x3e\x97\x18\x61\x76\x52\xc7\x67\x00\xf7\x7c\x7b\xef\xb0\x66\x24\x5e\x04\xb7\x55\x9d\x95\x49\xbf\x3f\x03\x75\x0f\xfa\xfd\x6a\x6e\x9f\x61\x6a\xd2\xed\x0e\x58\xd3\x12\xd7\xb0\x01\x96\xe7\x28\xe2\x19\xd7\xaf\x97\x73\xba\xc7\xb8\x1b\xc0\x6e\x1a\x72\x0d\xb8\x2e\xf6\x3c\x8d\x27\xbd\xf9\xe9\x67\x07\xb2\x44\x2a\xb8\x5b\x3e\x28\x4d\x67\xa2\x98\xd8\xe1\x1c\x1c\xeb\xb0\x57\x2d\xa1\xd5\x8a\xe6\x5a\xcb\x03\xd5\x52\xef\x7c\x46\x8b\xe9\xef\x73\x87\x55\x79\xfd\x3e\x57\xbb\x74\xc5\x14\x0a\xd3\xe0\x6f\x58\xdf\x14\xa5\xbe\x67\xbb\xf0\x1f\x92\x8b\x77\xa7\x1a\x1a\xc1\x83\x59\xb4\x69\x1b\xd0\xc7\x85\x4c\x53\x8c\x0c\x97\xa2\xde\x4f\x98\x74\x6e\xe0\x61\x62\xd9\xcf\x8a\xd4\x70\x7b\x66\xee\x20\x0e\xfa\x38\xc8\xf7\xc8\x49\x47\x5d\x5f\xc7\xf1\x3c\x75\x1d\xf4\x71\x31\x20\x77\x02\x6e\x8a\x22\x38\x53\xb7\x80\xbf\xc2\x5b\xa7\xf3\xe8\x4a\x6f\x28\xf1\xd3\xdb\x9f\x3d\x20\xf7\x49\xa0\x03\xf9\xe3\xfc\x69\x9d\x00\xa8\xc6\xa4\xf9\x14\x02\xf8\x65\x8e\xa1\x4b\xc2\x64\x95\xb5\xa9\x98\x11\xd0\x2e\x3f\x53\x6b\x6d\x96\x66\xf7\xf6\x53\xf7\xea\x0c\xa1\x47\x99\x5e\x55\xe3\xc7\x01\x67\xe4\xcc\xec\x7f\x5b\x94\x71\x1e\xf1\xff\x36\x63\x3c\x5e\xaf\xf9\x63\xf5\x9a\x8f\xea\xf5\x8e\x72\x00\x1b\x37\x5b\xe8\xf0\x1a\xf3\x94\x45\x18\xd8\xf7\x4b\xf0\x7b\x7e\x95\x5f\xea\xaa\x2b\x65\x7f\x49\xba\x96\xb0\xfa\x93\x45\x59\x9d\xe4\x5a\xa7\x42\x53\x28\x41\xa3\xc8\x12\x50\x29\xa9\x74\x78\x89\xf7\x01\xe9\x8a\x58\x86\xfd\x29\x9b\x6b\x50\x78\x28\xb8\xc2\x18\xa4\x80\xc1\xb8\xf7\x87\xc6\xd4\x0f\xd7\xdf\xfa\x7d\x28\xff\x4e\x15\xbf\x26\x55\x54\x95\xb7\x5e\xc3\x85\x8c\x11\x76\x28\x50\x31\x83\x31\x6c\x4f\xb0\x93\x2b\xca\xf2\x0e\xd5\x5f\xe0\xfd\x77\x70\xf9\xdd\x2d\x7c\x78\xff\xf1\x36\xf4\x9a\x72\x09\x2f\x64\x7e\x52\x7c\xb7\xb7\x75\xb2\x5e\x93\xed\x48\x66\x19\x15\xce\x70\xad\xb3\xe4\x79\x39\x8b\x3e\x31\x47\x10\x57\xee\x99\x16\xd6\x6b\xb8\xdd\x73\x0d\x09\x4f\x11\xee\x99\x1e\x3a\x63\xf6\x08\xce\x1b\x30\x52\xa6\x21\xc9\x7f\x88\xb9\xe1\x62\x07\xa6\xdd\x97\x59\x8b\xb9\x92\x47\x84\xa4\x30\x56\xd5\x1e\x05\x9c\x64\x01\x0a\x57\xaa\x10\x56\x53\xa3\xda\xba\xcb\x44\xec\x79\x3c\xcb\xa5\x32\x10\x78\x00\x7e\x92\x19\x9f\x7e\x6b\x68\xdb\x47\x81\x66\x5d\xa8\x94\x9e\x77\x32\x65\x62\xe7\x7c\xa1\x22\xd2\xe0\xd3\x8f\x95\x73\x55\xe6\x7b\xf4\x67\xc7\xcd\xbe\xd8\x86\x91\xcc\xd6\x3b\xb9\x92\x39\x0a\x96\xf3\xb5\x36\xaa\x31\x30\x23\x70\xcf\x76\xbe\xb7\xb0\x19\x19\x5e\x8f\xba\x72\x69\x23\xd0\xc0\x04\xd0\x0b\x22\x67\x0a\xad\x2c\x61\x5f\x64\x4c\xf4\x37\x80\xcc\x49\x98\x4b\xe1\x99\x53\x8e\xf3\x5a\xb5\x51\x45\x64\x1a\x88\xd7\x44\x1e\x5e\x31\xb3\xbf\x22\x12\xd5\x74\x4e\x00\x53\x97\xe9\xb2\x0c\xff\x26\x6f\x4f\x39\x3a\x89\xf6\xae\xdf\x57\xf4\x3d\xb1\xf8\xe3\x9a\x08\x5a\x4c\xc4\x10\xf4\x3f\x54\x2c\x06\x17\xa9\xe1\x3d\x79\xc6\xb4\x07\x70\xb7\x65\x1a\xc9\xff\xe6\x6a\x05\x4e\xbf\x54\x10\xec\x0c\x04\x29\x8a\x41\x80\x0b\x78\xbb\xe8\xad\xf4\x3c\xb6\x2b\x2b\x6b\x63\xbd\x06\x76\x94\x3c\x86\x42\x7c\xc2\x13\xc6\x50\x68\xb6\x43\x32\xe7\x12\x58\x8e\x3d\xa9\xe1\xfd\x23\x37\xfb\x77\xad\x43\x68\xb4\x3d\x30\x72\x11\x2c\x49\xd7\x47\xc8\x35\x14\x2a\x05\xd7\xb1\x96\x20\x45\x7a\xea\x38\xd4\xa2\x99\x9b\xaf\x34\xc4\x3c\x49\xd0\x36\xa9\x44\xc9\x8c\x54\x91\x8d\x4e\x9b\xce\x31\xe2\x09\xc7\x18\xb8\x18\x94\x0f\x2d\xd8\xf2\xf9\x91\x74\xd1\xca\x91\xf8\x02\x64\x32\xf2\x87\x5b\x70\x61\x96\x9b\x53\x93\xbf\xa4\x10\x11\x4c\x5d\xfd\xe1\xcd\x1c\xa8\x16\x83\xb8\x83\x6d\xee\x74\x2d\x68\xcb\x68\x47\x8d\xc2\x86\x61\xc7\xdf\x0a\x6e\xd0\xf4\xd4\x10\xa1\xb9\x46\x34\x21\x4c\x29\xa7\x18\x7b\x7b\x7e\x4b\x29\x1f\xa6\xaa\xcd\xf8\x5c\x66\xbb\x3a\xd9\xc0\x36\x77\x70\x7d\x47\xe9\x00\x66\x53\x63\x9d\xa3\xa2\xb4\x93\xd8\x8b\x5c\xb3\x6a\x83\x05\x04\x6f\x0a\x95\x86\x3f\x5c\x7f\xeb\x66\x88\xda\x3b\x1a\x47\xef\x14\xea\x22\x35\xe0\xd6\xbd\xe6\xb5\x9b\x64\xc6\x9d\xdc\xfa\x3d\xa2\x9a\x01\x67\xb5\x97\xff\x66\xc8\x6c\x5a\xec\xe3\xd3\xa2\xab\xf8\xde\x95\x6a\xe2\x6b\xe1\xff\xe3\x17\xb3\x66\x14\x19\x45\xf2\x5a\x93\xe3\x99\xe6\x5f\x79\x8e\xac\x8f\xac\xed\x03\x83\x86\xd4\x81\xdd\x4d\x6b\xb3\xd5\xd0\xb6\x8b\xb0\xe5\x90\xaa\xe2\x49\x4f\xc3\xa6\x9f\xaf\x5e\x11\x8d\x31\xda\xdb\x3f\xf4\xaf\xc6\x97\x43\x7c\xe8\x76\x9f\x8f\x18\x76\xd4\x0d\x5a\x0b\xcb\xfa\x70\x16\x5e\xeb\xe1\x4c\xcb\x72\xfa\x0f\x76\x32\xcd\xd8\x27\x0c\xa8\xa8\xec\x7c\x68\x27\xc2\x87\x9b\x73\x57\x1f\x93\x9f\xf7\x57\xe7\xcd\xbe\x09\xe4\x9a\xdd\x5b\x85\xb0\x81\x83\x0e\x3f\x88\x48\xc6\x18\x2c\xce\xfa\xb3\x03\xc0\x1f\xdd\xb6\x25\x41\xc1\xb1\xcf\x3f\x0b\x6d\x2c\x1d\xc2\x1e\xd3\x1c\x15\x10\xd9\xd0\x08\x03\x46\x42\xce\x04\x8f\x6a\x62\x26\xfe\xec\x91\xb7\x53\x59\xd3\x28\x41\xea\x79\x24\x45\xd6\x83\x02\x06\x14\xd5\xd0\x54\xf3\xd2\x1e\x3b\x4f\xec\x52\xef\xc3\x2c\xd4\xde\x05\xa8\x54\x83\x45\x9e\x40\x41\x50\x19\x8b\xf8\xe4\x78\xc4\xc4\x57\x06\xb6\x48\xab\x2d\x7a\x5d\x62\x0a\x97\x8c\xba\x88\xdb\xd8\x6c\x6b\x69\x5e\xd1\x94\x8f\xc2\xd8\xf1\xae\x69\x28\xb6\x72\xef\xb9\xd9\xbf\x02\x5f\x37\x04\xd2\x58\x2c\x1f\xec\xbb\xa1\xcd\xdc\xd4\x82\xe3\xfd\x45\xcb\x48\xfd\x36\xf3\x4d\x91\xba\x23\xa4\x13\x4f\xe8\x1f\xe5\xc6\x86\xa0\xa3\x3d\x66\xb8\x84\xbd\xd4\x66\xf9\xea\x9d\x88\x2c\x07\x7d\x13\x6d\xb3\x9c\x6e\x50\x3c\x71\x0e\x0d\x6a\x7f\x8e\xc9\x9c\x68\x9f\xbd\x68\xe4\xe8\x85\x38\x26\xb3\x29\x2e\xe3\x49\xed\xd9\x53\x2c\x5a\xc1\x17\xd9\xf3\xc0\x0e\x24\x35\xe6\x67\x28\xd2\x1d\xe6\x4c\x01\x8c\x7c\xeb\x6b\x0d\x6f\x5c\xf2\x5c\x16\x9b\xd7\x7f\xb7\xf1\xd9\x30\x3b\x7c\xd5\x6e\x74\x9c\x50\x23\xc7\x62\xe5\x49\xa5\xc0\xe8\x7e\x97\xa7\x68\x2c\x45\xbc\x04\xfe\xf3\x28\xf9\x8c\xaa\x98\xcf\xe4\x99\xfa\x61\x99\xfc\x37\x00\x00\xff\xff\x15\x6f\x84\x92\xd9\x1d\x00\x00") func templatesServerUrlbuilderGotmplBytes() ([]byte, error) { return bindataRead( @@ -616,11 +783,11 @@ func templatesServerUrlbuilderGotmpl() (*asset, error) { } info := bindataFileInfo{name: "templates/server/urlbuilder.gotmpl", size: 7641, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x77, 0xac, 0xa8, 0x65, 0xb1, 0xe6, 0x78, 0x19, 0xa2, 0xaf, 0xf8, 0xa0, 0x36, 0x65, 0xef, 0xea, 0x1b, 0xb8, 0xe6, 0xa3, 0xa0, 0xfb, 0x6a, 0x79, 0x3c, 0xd9, 0xef, 0xa0, 0xb, 0x1f, 0x7c, 0xdd}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x75, 0x67, 0x48, 0xf2, 0xbf, 0xaa, 0x76, 0x7e, 0xfc, 0x16, 0x6f, 0xfd, 0x71, 0x46, 0x6, 0x5d, 0xad, 0x91, 0x4b, 0xe4, 0x81, 0x46, 0x68, 0x3f, 0x1, 0x70, 0xf8, 0x38, 0x5f, 0x27, 0x45, 0x2e}} return a, nil } -var _templatesStructfieldGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x54\x4b\xcf\xd3\x30\x10\xbc\xe7\x57\xac\xac\xef\xd0\x4a\xc4\xbd\xf7\xc8\x4b\x54\x02\x2a\xd1\x0a\x71\xac\x65\x6f\x8a\x91\x5f\xd8\x0e\x22\x58\xfe\xef\xc8\x69\xfa\x08\x4a\x5b\x01\x42\xe5\x16\x79\x77\x32\xb3\xb3\x63\xa7\x04\x02\x1b\x69\x10\x48\x88\xbe\xe5\xb1\x91\xa8\x04\x81\x9c\x2b\x80\x94\x6a\x90\x0d\x18\x1b\xe1\x89\xae\xc2\x73\x16\x70\xdb\x39\x84\xba\xaf\x02\x2c\x16\x90\x12\x44\xd4\x4e\xb1\x88\x40\x84\xe5\x21\x7a\x69\xf6\x04\x28\x0c\x3d\xe5\x1f\xe7\x0e\xe7\xad\x43\x1f\xbb\x8f\x4c\x49\xc1\xa2\xb4\xe6\xa5\xe5\x9b\x23\xe6\x44\x8a\x46\xe4\x5c\xa5\x04\x8e\x05\xce\x94\xfc\x81\x40\xdf\x33\x8d\x39\x8f\x09\x03\xff\x8c\x9a\x15\x4d\x07\x46\xd8\x7d\x09\xd6\x2c\x49\x35\x28\x7f\xa2\x6f\xd8\xaf\xb2\xeb\xbe\x88\x2a\xe0\x79\x48\xba\xf6\x72\x2f\x0d\x53\x85\x64\x34\x3b\x33\x02\x66\xc5\x00\xfa\x01\xbf\xb6\xd2\xa3\x98\x03\x5d\x85\x57\xda\xc5\x6e\xad\x65\x8c\x28\x20\xe7\x67\x56\xcb\xa2\x2a\x76\x29\x15\xf1\xd0\xab\xaf\x87\xcf\x93\x1c\xfa\xe9\xdd\xdb\x81\x01\xbe\x6b\xb5\x24\x29\x5d\x9e\x91\x31\xb8\x00\x5e\xb4\x21\x5a\xbd\x65\x7b\x38\x8c\x3e\x3a\x38\xb5\xef\xaa\x33\xb2\x87\x1e\x57\x1a\x5b\xa7\xf0\xc1\x1b\x1d\x0f\xf5\x87\x0b\xad\xc9\xef\x5a\x52\x46\xe1\x7d\x05\x02\x7a\xd9\x73\xfa\x6b\x3e\x5d\x44\x7f\xd5\x30\x8e\xff\x41\xfe\xe1\xca\x05\x98\xcd\x6f\x3b\x56\x6d\x30\x4e\xe2\x6e\xa2\xe6\xa3\x35\x4d\xe4\xe7\x91\xb6\xc0\xfd\x14\xfd\x7b\x57\x46\x79\x71\x5e\x7e\x9b\x7e\x2e\x39\xd3\x78\x49\xf0\xba\xd4\xef\x68\xbb\x41\x32\x79\x81\xff\x8e\xe3\x67\x00\x00\x00\xff\xff\x62\x6a\xf5\x9f\xf2\x05\x00\x00") +var _templatesStructfieldGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x55\x4d\x8f\xd3\x30\x10\xbd\xe7\x57\x8c\xac\x1c\x76\xa5\x6d\x96\x73\x25\x2e\x7c\x89\x22\xd8\x4a\x64\x85\x38\xae\x65\x4f\xc2\xa0\xd8\x09\xb6\x8b\x28\x56\xfe\x3b\x72\x9c\x4f\x48\xbb\xaa\x10\x5a\x6e\x8d\x3d\x6f\xde\x9b\xe7\x67\xd7\x7b\x90\x58\x90\x46\x60\xd6\x99\x83\x70\x05\x61\x25\x19\xb4\x6d\x02\xe0\xfd\x06\xa8\x00\x5d\x3b\x48\xb3\x9d\x7d\xc1\x2d\xde\x1f\x1b\x84\x4d\xb7\x0b\x70\x7b\x0b\xde\x83\x43\xd5\x54\xdc\x21\x30\x59\x0b\xeb\x0c\xe9\x92\x41\x06\x7d\x4d\xe8\x31\x55\x34\xa6\x6e\xd0\xb8\xe3\x27\x5e\x91\xe4\x8e\x6a\xfd\xaa\x16\xf9\x80\x19\x49\x51\xcb\xb6\x4d\xbc\x87\x86\x5b\xc1\x2b\xfa\x89\x90\xdd\x71\x85\x6d\xbb\x24\xb4\xe2\x0b\x2a\x1e\x34\x45\x46\x78\xe8\x1b\xa4\x81\x08\xb6\xcf\x07\x1d\x61\xcd\x70\x5d\x22\xa4\x74\x03\x69\x1c\xf5\x9e\x97\xa1\x24\xcd\xf2\xe1\xd3\xce\x55\x53\x01\xa5\x83\x94\xe0\x19\x44\x5e\xd4\x72\x7d\xaa\xb1\x1d\x03\x49\xc2\x01\xeb\x7e\xce\x58\x58\xde\x09\x65\xbd\xae\x69\xce\xca\xe2\x25\x2d\xd9\x57\x5b\x6b\x76\xba\xdd\x20\xb0\x97\x9f\x7d\xfe\xf0\x3e\xd8\x16\xf4\xff\x50\xd5\x96\x79\x3f\x5f\x63\xf3\x99\x06\xc8\xcb\x83\x75\xb5\x0a\xa2\xe3\xd0\x8b\x85\x11\xf0\x90\x4c\xd8\x24\x40\x97\x21\xea\xc4\x8e\x6d\xb3\x08\xde\xb2\x89\x26\xcd\xde\xf2\x3f\xf3\xb4\x39\x61\x4b\x16\xe7\xcd\xf6\x86\x4a\xd2\xbc\xea\xf5\xcf\x4f\x8a\x6b\x09\x57\x21\xa8\x43\xed\x47\xfc\x76\x20\x83\xf2\x7a\x5c\xd9\xd9\xd7\xaa\x71\xc7\xbd\x22\xe7\x30\x28\xbf\xa9\x15\x05\xc7\xdd\x71\x1c\xc6\xfb\xce\x84\x11\xf1\x2e\xdf\xdf\xc5\x78\x86\xfa\x18\xee\xdf\x5d\x8b\x1f\x2c\x99\x9d\xc0\xdc\x11\x77\x68\x2a\x7c\xe2\x5b\x35\x49\x0e\xc0\x8b\x2f\x55\x48\xdd\x96\x6d\xe2\x88\x17\x84\x24\x8c\x22\xba\x1d\xb0\x68\xa8\xe3\x34\xe7\x93\xd3\x19\xb5\x2b\xb8\xc0\xff\xe0\x0d\x82\x13\x8f\xd0\xd5\xf5\x79\xc7\x92\x1c\xdd\x2a\xee\x2c\xea\x7a\x71\x4c\x2b\xf9\x79\x4a\x5b\xe0\xf1\x14\xfd\x7b\x57\x16\x79\x69\x0c\x7d\x5f\xff\xcb\x12\x5c\xe1\x9c\xe0\x4d\xd8\x7f\x44\xdb\x19\x92\xd5\x0b\xfc\x77\x1c\xbf\x02\x00\x00\xff\xff\x19\x4c\x16\x4a\x76\x07\x00\x00") func templatesStructfieldGotmplBytes() ([]byte, error) { return bindataRead( @@ -635,12 +802,12 @@ func templatesStructfieldGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/structfield.gotmpl", size: 1522, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc2, 0x6c, 0xf7, 0x9a, 0xf2, 0xd2, 0xba, 0x1b, 0xe, 0x9b, 0xd0, 0x12, 0xcd, 0xdc, 0x1f, 0xba, 0xab, 0x3b, 0xea, 0xf5, 0xa4, 0x6e, 0x1e, 0x9a, 0x8e, 0xb9, 0x9a, 0xc, 0x33, 0xbe, 0x46, 0xc8}} + info := bindataFileInfo{name: "templates/structfield.gotmpl", size: 1910, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x52, 0x92, 0x5, 0x7b, 0xfd, 0x5c, 0x15, 0xc8, 0x62, 0x64, 0x3a, 0xd1, 0xd4, 0x9, 0xca, 0xfd, 0x38, 0x1d, 0xa9, 0x4c, 0xdc, 0x5b, 0x30, 0xb9, 0x5a, 0xc6, 0xd8, 0x22, 0xa8, 0xd6, 0xb8, 0x6f}} return a, nil } -var _templatesSwagger_json_embedGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x92\x41\x6b\xdb\x40\x10\x85\xef\xf3\x2b\x1e\x26\x05\x1b\x6a\xe9\xde\x92\x43\x89\x53\x70\xa1\x71\x68\x7c\x2b\x85\xac\xb5\xa3\xf5\x36\xd2\xae\xba\x1a\xd9\x08\xb1\xff\xbd\xac\xec\x94\x48\x94\x5e\x7a\x14\xf3\xe6\x7b\xef\x8d\x36\xcf\x71\xe7\x35\xc3\xb0\xe3\xa0\x84\x35\x0e\x3d\x8c\x5f\xb7\x67\x65\x0c\x87\x8f\xd8\xec\xf0\xb0\xdb\xe3\x7e\xb3\xdd\x67\x44\x34\x0c\xb0\x25\xb2\x3b\xdf\xf4\xc1\x9a\xa3\x60\x1d\x63\x9e\x63\x18\x50\xf8\xba\x66\x27\xb3\xd9\x30\x80\x9d\x46\x8c\x44\xd4\xa8\xe2\x45\x19\x4e\xe2\xec\xd3\xe3\xf6\xf1\xfa\x99\x66\x79\x8e\xfd\xd1\xb6\x28\x6d\xc5\x38\xab\x76\x9a\x47\x8e\x8c\x6b\x20\x88\xf7\x55\x96\xf4\xf7\xda\x8a\x75\x06\xf2\x67\xaf\x1e\x4d\x9b\xe0\x4f\x8c\xb2\x93\x11\x75\x64\x87\xde\x77\x08\xbc\x0e\x9d\x9b\x90\x5e\x2d\xc6\xe4\xca\x69\x22\x5b\x37\x3e\x08\x96\x04\x2c\xd8\x15\x5e\x5b\x67\xf2\x9f\xad\x77\x0b\x22\xa4\xd8\x41\x39\xc3\xc8\x36\x5c\xaa\xae\x92\xed\x28\x6f\x31\xb6\x6c\x82\x75\x52\x62\xf1\xee\xd7\x02\x59\x8c\x17\xfd\xb5\xfa\x9b\xdd\x9b\x17\xee\xdf\xe3\xe6\xa4\xaa\x8e\xf1\xe1\x16\xd9\x04\x92\xa6\x88\x11\x33\xde\x55\x3e\xa3\xae\x88\xe8\xa4\xc2\x18\x37\xcf\xf1\x74\xa9\xf5\xe5\x69\xf7\x00\xae\x0f\xac\x35\x6b\x9c\x38\xb4\xd6\x3b\xf8\x72\x52\x5d\xfb\xa2\x1b\x7f\x56\xd7\xb2\x86\x92\xd7\x5b\x24\xa9\xd8\x9a\x09\x13\x5c\x3a\x41\xf6\x4d\x9d\xbf\x72\xdb\x2a\xc3\x17\xbf\xcf\x95\x92\xbf\x7a\x96\x95\x12\x61\xf7\x5f\xee\x73\xf8\x3c\xc1\x8a\xa8\xec\x5c\x01\xeb\xac\x2c\x57\x18\x08\xd3\xc4\xb7\xf3\x8d\xe5\xf7\x1f\x87\x5e\x78\xf9\x9c\x1e\xdf\x5b\x65\x8c\xcf\xab\x55\x5a\x9f\x5b\xfe\x1b\x31\x57\x5f\x30\x91\x7e\x07\x00\x00\xff\xff\xa2\xf1\x2d\xd6\x50\x03\x00\x00") +var _templatesSwagger_json_embedGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x92\xc1\x8a\xdb\x30\x14\x45\xf7\xef\x2b\x2e\xb3\x8a\x17\xb1\x3e\xa0\x74\x51\x26\x53\x48\xa1\x93\xa1\x93\x5d\x29\x8c\x62\x3d\x2b\x6a\x6d\x29\x48\xcf\x09\xc1\xe8\xdf\x8b\xed\x4c\x89\x4d\xe9\xa6\x4b\x71\xef\xbb\xe7\x60\xac\x14\x1e\x83\x61\x58\xf6\x1c\xb5\xb0\xc1\xe1\x0a\x1b\xd6\xe9\xa2\xad\xe5\xf8\x01\x9b\x1d\x9e\x77\x7b\x3c\x6d\xb6\xfb\x92\x88\xfa\x1e\xae\x46\xf9\x18\x4e\xd7\xe8\xec\x51\xb0\xce\x59\x29\xf4\x3d\xaa\xd0\xb6\xec\x65\x91\xf5\x3d\xd8\x1b\xe4\x4c\x44\x27\x5d\xfd\xd2\x96\x87\x72\xf9\xe9\x65\xfb\x72\x7b\x0e\x99\x52\xd8\x1f\x5d\x42\xed\x1a\xc6\x45\xa7\xb9\x8f\x1c\x19\x37\x21\x48\x08\x4d\x39\xf4\x9f\x8c\x13\xe7\x2d\xe4\xcf\x5d\x3b\x42\x4f\x31\x9c\x19\x75\x27\xe3\xd4\x91\x3d\xae\xa1\x43\xe4\x75\xec\xfc\x6c\xe9\x1d\x31\x9a\x6b\x6f\x88\x5c\x7b\x0a\x51\xb0\x22\xe0\x81\x7d\x15\x8c\xf3\x56\xfd\x4c\xc1\x3f\x10\x61\xd0\x9e\x0a\x09\xe5\x86\x6b\xdd\x35\xb2\xbd\xbd\x73\x5e\xe4\x77\x41\x41\x44\x67\x1d\xc7\x55\xa5\xf0\x3a\xd1\xbf\xbc\xee\x9e\xc1\xed\x81\x8d\x61\x83\x33\xc7\xe4\x82\x47\xa8\x67\x86\x26\x54\xdd\xf8\x4d\xbb\xc4\x06\x5a\xde\x95\x87\xaa\xb8\x96\x09\xb3\xb9\xc1\xb4\xfc\xa6\x2f\x5f\x39\x25\x6d\x79\xe2\x7d\x6e\xb4\xfc\x95\x59\x37\x5a\x84\xfd\x7f\xd1\x97\xe3\x4b\x83\x82\xa8\xee\x7c\x05\xe7\x9d\xac\x0a\xf4\x84\xb9\xf1\xc7\xe5\xc5\xea\xfb\x8f\xc3\x55\x78\xf5\x36\xfc\x23\xf7\xcd\x9c\xdf\x8a\x62\x38\x5f\x22\xff\x3d\xb1\x6c\x4f\x33\x99\x7e\x07\x00\x00\xff\xff\x33\xd6\x13\x77\xf7\x02\x00\x00") func templatesSwagger_json_embedGotmplBytes() ([]byte, error) { return bindataRead( @@ -655,32 +822,12 @@ func templatesSwagger_json_embedGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/swagger_json_embed.gotmpl", size: 848, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x42, 0xd7, 0xa7, 0x80, 0xfd, 0xe8, 0xcb, 0x6d, 0xa5, 0x9c, 0x80, 0x99, 0xa8, 0x5b, 0xb0, 0xa4, 0x52, 0x8d, 0x77, 0x82, 0x7a, 0xe2, 0x27, 0xf2, 0xf, 0xd6, 0xc8, 0xf1, 0xfe, 0x7f, 0xd0, 0x98}} + info := bindataFileInfo{name: "templates/swagger_json_embed.gotmpl", size: 759, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb3, 0x32, 0x18, 0x55, 0xc1, 0x8b, 0x29, 0xe6, 0xb, 0xf7, 0x7f, 0x45, 0x23, 0xb3, 0x7d, 0x9c, 0x4c, 0xd, 0xc8, 0x3f, 0x9b, 0x47, 0x3a, 0x30, 0x53, 0x11, 0x71, 0x2e, 0xc4, 0x93, 0x4d, 0x4f}} return a, nil } -var _templatesTupleserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x5b\x6f\xdc\x36\x16\x7e\xb6\x7e\xc5\xd9\x81\xeb\x1d\x79\x65\x4d\x93\xec\x93\x17\x2e\x90\x5b\xb7\x29\x50\x3b\x88\xd3\xdd\x07\xc3\x48\xe9\x11\xc7\x66\xa2\x5b\x28\xca\x13\xaf\xa0\xff\xbe\x20\x29\x89\xa4\x44\x4a\x72\xe2\x38\x0d\xea\x97\xc4\x33\xe2\xe5\xdc\xcf\x77\xce\xd1\x54\x15\x44\x78\x43\x52\x0c\x0b\x56\xe6\x31\x3e\xc5\x94\xa0\x98\xfc\x0f\xd3\x05\xd4\xb5\xb7\x5a\xc1\xef\x69\x82\x68\x71\x85\xe2\x5f\x4f\x4f\x8e\xa1\x6c\x3f\x15\xc0\xae\x48\x01\x62\x13\xb0\x9b\x1c\xc3\x86\x66\x09\x20\x10\xcb\x10\xa5\xe8\xc6\xdb\x94\xe9\x1a\x96\x55\x15\xbe\xc1\x6b\x4c\xae\x31\x3d\x46\x09\xae\x6b\xd8\xaf\x2a\xc8\x51\xb1\x16\x17\x41\xc8\xbf\x85\xba\xf6\xcd\xab\x96\x14\x6d\xe1\xec\xfc\xe2\x86\x61\x1f\x30\xa5\x19\x85\xca\x03\x58\xad\xa0\x60\xe8\x12\xc3\xa3\x00\x2e\x31\x03\x76\x85\xe5\x6d\x70\x51\x32\x78\x5f\x16\xda\x57\x1e\xc0\x35\xa2\x72\xfd\x23\x38\x3b\x7f\x5f\x64\x69\xf8\x06\x6d\x7f\xc3\x45\x81\x2e\xb1\x07\x70\x51\x6e\xe0\xf0\x08\xf8\x25\x45\x78\x8c\xb7\xcf\xca\xcd\x06\x53\x7e\xb5\xef\x01\x44\x78\xcd\x9f\x8a\x6d\xc7\x78\xfb\x02\xaf\xb3\x08\xd3\xe5\x45\xb9\x69\x9e\x86\xbf\x17\xf8\xb8\x4c\x2e\x30\x5d\xfa\x9e\x07\x40\x36\x9c\x52\xbe\x87\x3f\x94\xeb\x97\x7b\xf2\x7e\xff\x5f\xe2\xd9\xdf\x8e\x20\x25\xb1\x60\x05\x80\x62\x56\xd2\x94\x7f\xef\x01\xd4\x9e\xce\xde\xe3\x43\xb8\xba\x89\x28\x62\xb8\x80\x82\xd1\x72\xcd\x20\xc1\xfc\xa6\x02\xb6\x84\x5d\x35\x82\xc7\x31\x4e\x70\xca\x0a\x0f\xa0\xaa\xf8\xf5\xe1\xd3\x28\x22\x8c\x64\x29\x8a\x5f\x31\x9c\x14\x5c\x89\x52\x0a\x31\x2a\xd8\xab\x34\xc2\x9f\x80\xa4\x4c\xae\xc7\x69\x24\x9f\x57\x15\x50\x94\x5e\x62\xd8\x25\xd1\xa7\x00\x76\xaf\x51\xcc\x99\x08\x5f\xd3\x2c\xc7\x94\x11\xcc\xcf\x21\x1b\x88\x71\xba\x6c\xb8\x81\x9f\xf8\x2e\xbe\x1e\xea\xba\x61\x87\x5f\x13\x21\x86\xac\xea\xe5\xcb\x19\x4e\xf2\x18\x31\x0c\x8b\x08\x53\xbc\xd9\xe0\xe8\x74\x7d\x85\x13\xf4\xf6\x26\xc7\x0b\x08\x25\x31\x52\x2b\x43\xa5\xc8\x8b\xcf\xd4\xad\xe7\xbe\x58\x3d\xae\xa5\xa1\x9e\xf8\x77\x76\x45\x39\x69\xb7\xe9\xae\xa7\x3d\xae\x3f\xfe\x6f\x55\x81\x61\xee\x50\xd7\x61\xa3\x9a\x57\xc5\xcb\x4f\x79\x46\x19\xe6\x52\xb7\xde\xc3\x75\x12\x17\xcd\x5f\x6b\x94\xe0\xc1\x53\xa1\x31\x38\x82\xee\xc8\xe3\x32\x8e\xd1\x45\xcc\x9f\xef\x75\x0b\x9c\x8c\xb4\x24\x92\x0d\xec\xda\x4d\x05\x34\x43\x39\xd2\x54\xdc\xee\xec\x6c\xa6\x1e\xda\x90\xd3\xfe\x3a\xab\x7e\xa2\x59\x75\x6f\xa5\x74\x1f\xd3\xc2\x3a\x52\xfe\xf1\xa8\x91\xfa\x26\xa3\xf0\x2e\x80\xc6\x40\xa5\xd1\x36\x86\xa1\x2d\x3e\x3c\xef\x94\xc4\x6d\x92\x65\x28\x8a\x4c\xfb\x2b\x74\xbb\x73\x08\xc2\x65\x88\xd7\x28\xf6\x9b\x05\x53\xb6\x67\xb7\x3e\x87\xfd\x49\x09\xa6\x19\x1b\x50\xe4\xd2\xb3\x60\xcc\x6e\x9c\x03\xf3\x6c\x0d\x54\x68\x4a\x84\x90\x01\xdf\x07\x1d\xe3\x62\xd1\x6e\xf8\x1f\x14\x97\xf8\xe5\xa7\x9c\xe2\xa2\x20\x59\x2a\x6d\xf9\xe0\xce\x8d\x19\xe5\x39\x4e\xa3\xe5\xbd\x5d\x19\x48\x8b\xf0\x3b\x79\x1c\x28\x33\x96\x62\xea\x1b\x77\x23\xcb\x94\xc4\x5e\xed\xf1\xac\xf8\x9b\x96\x13\x9d\x19\x91\xa4\x2c\x9b\x97\x11\x1d\x09\x51\xbb\x65\xe9\xc3\x52\x66\xc3\x40\x66\x43\x5f\xa8\x9a\x7b\x3a\x37\xa3\xb3\x73\x92\x32\x4c\x37\x68\x8d\xab\xba\xd2\x43\xba\x1e\xc4\x0f\x3a\x3f\xee\x11\x10\x5a\x09\x08\x3c\xab\xcb\xdb\x8d\x47\xac\x68\xdd\x53\x39\xa7\x5b\xa9\x77\x6c\x46\xd2\xf0\x85\x3c\x3a\x8b\xe2\x9f\x02\xb8\xf6\xdd\x1a\x15\x9e\xdb\x88\x59\x2c\xf7\xbd\xda\x53\xeb\x3c\x0d\x1f\x5d\xa1\xe2\x05\x29\xd6\x94\x24\x24\x45\x0c\x47\xb7\x85\x4a\xd9\xc5\x7b\xbc\x66\x52\x7a\x08\xf2\x2c\xbe\x49\x32\x9a\x5f\x91\xf5\x10\x3e\xc9\x84\x5f\x52\xfc\x55\x20\x54\x9b\xa6\xcd\x88\xc8\xe9\xca\x4a\xf6\x0c\x15\x98\x87\xc5\x67\x59\x74\xd3\xa5\xe4\x7b\x81\x49\x42\xfa\x83\x58\xb6\x33\xc4\x48\xd2\x74\x32\xca\xad\xa7\x25\x97\xff\x7d\x5a\x5e\x88\x3f\x3b\xc8\x73\x81\x0a\x6c\x32\xf9\x6b\x59\xb8\x39\x1c\x65\xf0\xcb\xf9\xe3\xd4\xcc\x00\x81\xba\x99\x1a\x7e\xfc\x34\x8e\x4f\x36\x66\x0e\x17\xb9\x42\x13\x42\xad\x85\xf8\xa1\xf7\x9b\xd1\x7d\x28\xc2\x65\x73\x5c\xeb\x91\xbe\xbe\xc3\xb8\xf2\x0d\xfe\x58\x12\x8a\x23\x25\x6a\xc4\x89\x73\xe2\x3e\xe9\xe9\x4f\x05\x4c\xaf\xeb\xb3\x73\x73\xa1\x4c\x71\xff\xce\x1a\x16\x0c\x87\xd7\x96\x19\x0b\x5a\x37\x26\x1b\xee\x2c\x24\xbd\x14\xce\x6b\x0f\x63\x3e\x97\xf7\x22\x2d\xe3\x78\xd1\x88\xdc\x16\x49\x82\x56\x67\x9d\x0b\x0d\x08\x1f\x25\xfb\x34\x26\x6b\x3c\x9f\xf6\x65\xdf\xd6\x46\xe8\x0f\x80\x96\x29\x23\x09\x0e\xb9\x57\x3f\xcf\xd2\xa2\x4c\xb8\xad\x19\x58\xb6\xb1\xa9\xbd\xbd\xf6\x13\xc9\xc2\x97\x27\x3f\x8f\xa3\xd5\x11\xb5\x1d\x59\xa5\xe4\x29\x18\x21\x05\xc9\xd9\x15\x5f\xbb\x8f\xfa\x4e\x25\x3b\x4b\xae\x03\xe7\xd5\xbc\x45\xc3\x14\xb6\x6f\xcc\xcf\x3d\x28\x3d\x2c\xcd\x2c\x9e\x7c\x5b\x2f\x1e\xf5\xe0\x9c\x66\xf9\x83\x03\x7f\x6f\x0e\xec\xd6\xda\xa4\xff\x6a\xbe\xeb\x3c\xe5\x3b\x95\xe9\xe7\xbb\xee\x1c\xa7\x6c\x1c\x86\xe2\xa2\x8c\x99\x1d\xba\x1b\x99\x7b\xf7\x5d\x00\xbb\x39\xa2\x38\x65\xa2\xab\x62\x49\xe4\xcd\x63\x2e\xd6\x34\x4b\x6f\x92\xac\x2c\xfa\x6e\xab\x96\x0c\xd3\xbd\xb3\x83\xd3\x6e\xb2\xa3\x80\x2e\x22\xe0\x6e\xa1\x86\x70\x33\xfa\x33\xc1\x71\x24\xce\x32\xfa\x07\xe6\x66\xf1\xd8\x80\xf1\x02\x5d\x73\xd9\x84\xba\x05\xea\xc7\xc8\x83\x8f\x04\x40\x33\xd5\x3b\x76\x59\x63\x44\xf3\x8f\x1f\xa6\xa4\xd1\xe3\xcd\x70\xdd\xbb\x92\x6c\x26\xa8\xe5\xf6\xa5\xe8\xb2\xaf\x59\xfa\x8d\xed\xad\xf6\xe1\x38\x93\x9d\x4a\x01\xfe\xb7\xf8\xef\x14\x43\x9c\x65\x1f\x48\x7a\xc9\xab\xa8\x10\xf6\x57\x3d\x2b\xcd\xa8\xf0\x8c\xe5\x3f\x1f\x3f\x0e\x60\x41\xd2\x6b\x14\x93\x08\xaa\xaa\xbb\xa0\xae\xe1\x9a\x17\x5a\x87\xf0\xc3\xc7\x45\x30\x41\xae\xff\x59\xf9\xaa\x13\xc7\x1d\x58\x5d\x63\x38\xa6\x35\xdf\xb5\x66\x1d\x66\xe3\x50\xe1\x11\x0c\x03\xce\xc8\xc1\xb7\xcd\xef\x86\xf4\xa4\x10\x50\x1a\xd9\x3c\x5b\x7d\x65\xfa\xd5\x83\xb3\x3f\x38\xfb\xfd\x3b\xbb\xe2\xb4\xb5\x9c\x2e\x75\x6b\x2e\x33\x78\x76\x47\x38\x77\xb5\x12\x4d\x75\xa5\x48\x45\x8e\x44\x22\x5a\x04\xb1\x41\x1e\x61\x20\x2e\x0c\x32\xd6\x5a\xd7\xce\x75\x02\x24\x75\xae\x03\xaa\x98\x68\x57\xff\x7b\xdf\x32\x2a\x80\xd6\xac\x54\x9f\x83\x63\x82\xae\xd5\x66\x91\x8d\x7a\x08\xea\xe9\x21\x50\x8c\x22\xa0\x68\x1b\x00\xc5\x49\x76\x8d\x21\x45\x09\x8e\x04\xd2\x93\x4b\x02\x11\x7b\x50\x14\x01\xcb\x20\x41\x39\x17\x2c\xda\xf2\x23\x0a\x1e\x4c\x12\xf4\x01\x2f\x13\x94\x9f\x49\x74\x7e\x3e\x68\xef\x1b\xa4\xf4\x26\x6b\x4a\x2a\x7a\x57\xb2\xe5\xdd\x37\x5a\x24\x62\x6b\x07\x2f\x97\x82\xe4\xbd\x96\x92\x79\x43\xb3\xd1\x6e\x67\x84\x63\xcc\xf0\xb2\x3d\x31\x10\x80\x8d\x92\x94\x6d\x60\xf1\xc3\xc7\x05\xe8\x3e\xd2\x43\x79\x96\xa1\x46\x5f\x01\xcd\xc8\xa2\xa3\x17\x7e\x82\x1f\x55\x8d\x62\x69\x7c\x82\x55\xb4\x93\x83\x09\xe3\x5e\xbf\x1b\x85\x7c\x30\x7a\xad\x9d\xfe\x3e\x6f\xf8\x61\xcb\x1b\x4e\x3d\x5d\x73\x41\x0e\xc7\x15\xea\x8c\x3b\x9f\x59\x58\x84\x79\xf6\xe1\x1c\x8e\x24\x87\x46\xeb\xde\x9e\x6e\xed\xda\x68\x85\x36\x0e\xf8\x6f\x31\x00\x98\xe8\xf3\xaa\x91\xc0\x74\x97\xf7\xf3\xc6\x02\xa2\xe7\x4e\xf5\xc0\xc2\xab\x8e\x5e\xa4\xf1\x76\x44\x87\xf4\x51\x00\x17\x8f\x03\xb8\x78\xd2\xf4\x89\xe5\xd7\x5c\x37\xe2\x34\x6f\x87\xaf\xe0\x1f\x8f\xcc\x56\xf9\x54\xeb\xf8\x84\x1e\x67\x69\x0b\x13\x64\x97\xd5\xf7\x76\xcc\xba\xac\xf2\x76\x76\x94\x5c\xc5\x35\xde\x4e\xed\xed\x70\x82\xe6\x5c\xa9\xdf\xf7\x34\x8d\x3e\xfb\xc2\x59\x91\xb6\x71\x74\xbb\x19\xe9\x6e\xbf\x5a\x09\x07\x97\x2a\x6e\x6c\x81\xbb\xaa\x78\x2b\x41\xc5\x6a\x15\x88\xe5\xc8\xfb\x89\x8b\x67\xdb\x75\x96\xb6\x41\xaf\x4b\xd0\xf1\x07\xd6\x89\x96\xd7\xca\xa1\xd8\xa2\xcb\xf0\x79\x96\xae\x11\x13\xe6\xa4\x0c\xc2\x0f\x1a\x6b\xb7\x4f\x43\x04\xdc\xea\x8d\x40\xe4\x28\x6d\xda\xf4\xe6\x8e\x4a\xee\x6f\x24\xc2\xe9\xb6\xb5\xd9\x25\xf6\x70\xce\xd1\x0f\x5a\x08\x6f\x14\xee\x26\x82\xa9\xaa\xd5\xbe\x62\x30\xe6\x90\x4f\xe9\x1e\x48\xca\x81\x2b\x64\xfc\x98\x76\xbf\xe4\xbe\x80\xfd\x95\x16\xbd\x0e\x04\xbe\x12\x0d\x04\x17\x3d\xc6\x0b\x18\x72\x75\x5d\xb7\x2f\x8f\x54\xda\x49\x13\xa3\x81\x83\xd1\xd1\x42\x6f\xcd\xae\xa3\x46\x69\xa2\xa9\xf2\xd8\x9c\x92\x6b\x49\xcb\x86\x03\x32\xed\x75\x0f\x75\x66\xbf\xbe\x6c\x0e\x19\x40\xaa\x91\x74\xc6\x59\xfe\x83\xfb\xd0\xe1\x82\x3b\xcf\x09\x25\x97\x24\x45\xb1\x82\x6b\x8d\xc6\x96\x46\x1b\xd4\x17\x1d\xd3\x24\x67\x37\x27\x09\x61\x92\x95\x20\x4b\x08\xbf\x84\xdd\x74\x1e\xb0\xf8\xa3\x4f\xf0\x10\x45\x0f\x58\x50\x5d\xd7\x3b\x94\xd5\x7c\x51\xf5\xa0\xd9\xbd\x09\x67\xba\xc2\x38\x18\x7e\xc1\xa3\xf0\x2f\x68\x24\x0c\xdb\x18\xb5\xa2\x0f\x83\xa7\x5e\x4b\x5c\x2f\x0a\x24\xea\xff\x12\x34\xd6\x4a\xf4\xa0\x13\x80\x93\x35\xe7\x8b\x26\x6e\x96\x64\x43\xd5\xe0\x26\xa3\x96\x26\xbf\x31\xff\xec\x71\x77\x36\x8b\xa9\x96\xa4\x09\x7e\x6a\x03\xbd\x8b\xfc\xf1\x06\xa3\xa8\x0d\xae\x01\xec\xf5\x22\xd0\xac\x99\x27\x8c\x0e\x2d\x07\x80\xc6\xf5\xc6\x42\x53\x8e\x6a\xb7\xdb\xd7\x39\x4a\xd3\x26\x02\x35\x58\xc0\xec\xc4\xf2\xd8\x5a\x55\xfc\x3f\x5e\x49\x19\xd3\x11\xa3\xe4\x55\xb2\x19\x14\x92\x75\xad\xb7\xd1\xd5\xae\x41\xdb\x9b\xa2\xad\x1f\xc0\x9e\xe5\x3a\x5f\xb9\xbe\x55\xf6\xae\x2d\x82\xcb\x99\xc3\x67\x3b\x4e\xb6\x9c\xec\x59\x8c\xdd\x4c\x1f\xba\x0c\x2d\x89\x50\x80\x88\xa6\x32\xed\x65\xbd\xbf\x90\xb8\x2d\xaf\x0b\xf2\x58\x94\xbf\x46\xeb\x0f\x3c\x62\xb7\x94\x2f\x16\x53\x9a\x70\xb5\x56\x64\xf4\x19\xc6\xd2\xd5\x0a\xd2\x6c\x2b\xe0\x29\xc5\x97\x65\xdc\x8c\x01\x35\x5c\x3a\x0b\x78\xb4\xe3\xc3\xc2\x89\x3b\x26\x50\xc7\x34\xe6\x98\x85\x38\x6e\x91\x43\xed\x68\xe3\x4f\x8a\x35\xac\xf9\x64\xd8\x8b\xff\x66\x12\xfa\x16\x10\xc3\x2e\x13\x7b\x9f\xb1\x4d\x31\xe3\x69\xab\x6f\xc1\x8e\x1e\x85\xe3\xad\xdf\x09\xfb\x9e\x9f\xbf\xfa\x64\x8c\x24\xb0\xbe\x93\xf7\xdf\xc5\x1d\x45\x52\xab\x15\xbc\x3d\x79\x71\x72\x08\xb6\x25\xc3\x03\x47\x00\x8c\xe5\xa4\xf6\x8d\x5e\xe3\x90\xdb\xf7\x50\xbe\x7e\xaf\xc4\x03\x78\xc7\x05\xad\x7a\x9e\x67\xe7\xed\x9a\x1f\x45\xaf\x30\xc6\xa9\x2a\x0a\xfd\xb1\x37\xb2\xe6\x54\x83\xf3\xeb\xb9\xfb\xab\xe5\xbe\x69\x79\xf2\xed\xa3\xab\xbd\x58\x71\x04\xbf\xbf\x6a\x25\xd7\x97\x8d\x7b\xd0\x39\x2f\xfa\xd8\xd8\xfc\x13\xd6\x71\x56\xc6\xbe\xdb\x2a\x4e\x2f\xe2\x26\x6b\xae\x59\x75\x54\xf3\x13\x91\x59\xb9\x6d\x40\x86\x07\xc2\xa4\x5f\x98\x17\x89\xd8\xac\x07\xbd\x36\x5d\xff\x97\x12\x86\x45\x1c\xef\x17\x98\x5d\x19\xa0\x6f\xb3\xe1\xee\xb6\x2b\xaa\xad\x6b\x70\x78\x93\x04\xba\x37\xc7\xe5\xe7\xc0\x46\xa0\x3f\x55\x2c\xda\x0a\x9d\xee\xb1\x98\x01\xac\xb3\x24\xcf\x0a\xa1\xb1\xb6\xde\xb1\x80\xfa\xc0\x40\x2b\x8a\x7d\x77\x53\xd8\xd6\x12\x1e\x36\x84\xc7\xf8\xb5\x15\x34\xf6\x32\xcf\x51\xe5\xdd\x9a\x15\x9b\xf1\xb8\xcb\x9f\xaf\xce\xe5\x43\x09\xf5\x50\x42\x3d\x94\x50\xce\x12\x6a\xd4\x0a\xe7\x95\x2e\xb7\xce\x19\x26\x1d\x6d\x44\x7e\xdd\xbb\x6c\x46\xde\x18\x54\x78\x5a\x55\xe8\x4c\x1d\x93\xe9\xa3\x15\xcd\x54\x0a\xe9\x13\xec\xbb\x8a\xac\x51\xe0\x34\xbd\x43\x03\x25\xb6\xf2\xab\x3f\xf1\x93\x64\x86\x61\x38\x31\xf0\x93\x6e\x6b\x9d\xf8\xa9\xb2\xa7\x05\x2f\xd2\x34\x7f\x41\x5d\x20\xf2\x35\x65\x2a\xf7\x19\xfb\x49\x55\xa8\xa2\xb0\x4a\xb3\x6f\xc5\x8f\xeb\x6c\x47\x0d\x7e\xbd\x6e\xd9\xaf\xd1\xa3\xfd\x14\xee\x4b\xe8\x19\x03\xb8\xc6\xc9\xc8\xb2\xd0\x7a\xba\x42\x15\xc2\xc5\x2f\x19\x2c\x55\x05\xea\xc3\x8f\x7e\x87\x1a\x5b\x59\xfb\x76\x5e\x06\x03\xda\x21\x03\x8d\xd2\x9e\x67\x49\x1e\xe3\x4f\x27\xb2\xe6\x0e\x4f\x19\x25\x6b\x36\x9b\xb3\x34\xb3\x2d\x75\x5c\x9c\x46\x82\x58\x65\x61\xff\x0f\x00\x00\xff\xff\xf7\x50\xc1\x64\x80\x40\x00\x00") - -func templatesTupleserializerGotmplBytes() ([]byte, error) { - return bindataRead( - _templatesTupleserializerGotmpl, - "templates/tupleserializer.gotmpl", - ) -} - -func templatesTupleserializerGotmpl() (*asset, error) { - bytes, err := templatesTupleserializerGotmplBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "templates/tupleserializer.gotmpl", size: 16512, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2b, 0xb6, 0xfd, 0xcf, 0x74, 0x6, 0x9a, 0x2a, 0x84, 0xef, 0x17, 0x4b, 0x97, 0x48, 0x4c, 0x3a, 0x69, 0x42, 0x61, 0x93, 0xb2, 0x26, 0x23, 0xf, 0x53, 0x13, 0x6f, 0x39, 0xd9, 0xd9, 0x9b, 0x42}} - return a, nil -} - -var _templatesValidationCustomformatGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x92\xcf\x4b\xfc\x30\x10\xc5\xef\xfd\x2b\xde\x37\xf0\x85\x16\x76\xb3\x17\xf1\xa0\xec\xc1\x83\x82\x20\x28\xac\x78\x9f\xb5\xd3\x6d\x20\x9b\xd6\x24\x75\x2d\x43\xfe\x77\xe9\x0f\x64\x0b\x7b\xf0\xe8\x6d\x48\xde\xbc\x79\x9f\x64\x44\x60\x2a\x38\x86\xde\x9d\xe8\x70\x60\xff\xd0\xf8\x23\x45\xa8\x7d\x1f\x59\x61\x9d\x52\x06\x88\xac\x07\x95\x7e\x0c\x77\xd6\x50\xe0\x12\xe3\xb1\xa9\xc0\xde\xe3\x66\x8b\x4f\xb2\xa6\xa4\xc8\x7a\xea\x7e\xae\xf2\xc9\x57\xbf\x50\xac\x91\x92\xc8\x79\xc9\x36\x30\x52\x52\x6a\xa8\xdd\x60\xb6\x82\x08\x5a\x6f\x5c\xac\xa0\xfe\x7f\x28\xe8\xa7\xe6\x9d\xa2\x69\xdc\xc5\xcb\x65\xd4\x59\xa1\xe7\x6c\xaf\x7d\x3b\xb8\xe7\x22\xfa\x8d\x6c\xc7\xf7\x5f\xad\xe7\x10\x26\xaf\x42\xef\xa2\x37\xee\x90\x17\x2b\x54\x63\x7b\x28\x6e\x47\x8a\x7f\x5b\x38\x63\x21\x33\xee\x9c\xf1\xaf\x51\x5e\x40\xfa\x35\x91\x9b\xbf\xcd\x73\xec\xbc\x1b\x24\x19\x90\xb2\x25\xed\x66\x83\xe5\x06\xe4\x7b\x0a\x7c\x7d\x85\x30\x4e\x29\x60\x02\xc8\x7a\xa6\xb2\xff\x79\x8f\x12\xa7\x9a\x1d\x3a\x77\x24\x1f\x6a\xb2\x96\xcb\xec\x6c\xe2\x77\x00\x00\x00\xff\xff\x55\xbf\xa4\xbb\x63\x02\x00\x00") +var _templatesValidationCustomformatGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x91\xcd\x4a\x04\x31\x10\x84\xef\x79\x8a\x32\x20\xcc\xc0\x9a\x07\x50\xf6\xe0\x41\x41\x10\x14\x56\xbc\x37\x6e\x67\x0c\xc4\xcc\xd8\xc9\xfa\x43\x93\x77\x97\xcc\x8e\xe0\x61\x0e\x1e\xf7\x56\x24\x55\x95\xfa\x88\xea\x05\x82\x87\xbb\xcb\xd7\x31\x50\xe6\x3d\x6a\x35\x68\x47\x2c\x82\xcb\x2d\x3e\x28\x86\x3d\x15\x76\xb7\xa3\xbc\x51\x79\xf0\x9d\xea\x9c\x78\xa4\xf2\x8a\x5a\x55\xff\x4a\x8e\x99\x51\xab\xb5\x4d\xa7\x56\xb6\x81\x2a\x26\x09\xa9\x78\xd8\xf3\x77\x0b\x77\x3f\xbe\x50\x09\x63\x5a\xbd\xdc\x7d\xd2\x30\xb0\x1c\x1f\xfb\x75\xb8\x65\xdb\xd3\xf7\xd4\xda\x3b\x55\xf7\x4c\xf1\xc0\x37\x5f\x93\x70\xce\xc7\xae\xde\xed\x8a\x84\x34\x74\xfd\x06\x7e\x8e\xe7\xfe\x6a\xa6\x38\xdb\x22\x85\x08\x35\x0d\x76\x59\x78\x6a\x8c\x2b\x40\xff\xe4\x49\xcb\x97\x09\x97\x83\xa4\x66\x30\x40\x35\x3f\x01\x00\x00\xff\xff\x01\xdb\x67\xc9\xd9\x01\x00\x00") func templatesValidationCustomformatGotmplBytes() ([]byte, error) { return bindataRead( @@ -695,12 +842,12 @@ func templatesValidationCustomformatGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/validation/customformat.gotmpl", size: 611, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x92, 0xe7, 0x93, 0x76, 0x84, 0x44, 0xed, 0x9b, 0x9, 0xdf, 0xa, 0xaa, 0x1d, 0x36, 0xf, 0xff, 0x66, 0x5f, 0xbf, 0xa5, 0xa5, 0x42, 0x83, 0x88, 0xe9, 0xf0, 0xeb, 0x6, 0xb2, 0xe6, 0xe1, 0xd3}} + info := bindataFileInfo{name: "templates/validation/customformat.gotmpl", size: 473, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x21, 0x62, 0x2d, 0xb8, 0x17, 0x7, 0xcb, 0xa3, 0xb, 0xe0, 0xa4, 0xc4, 0xc7, 0x3c, 0xc4, 0x11, 0x74, 0x28, 0x61, 0x83, 0x41, 0x6f, 0xe1, 0x5, 0x73, 0xcb, 0x2f, 0x47, 0xe0, 0xa3, 0x22, 0xeb}} return a, nil } -var _templatesValidationPrimitiveGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x95\xc1\x8e\xd3\x40\x0c\x86\xef\x79\x0a\x13\x84\x94\x20\x94\x13\xe2\x00\xda\x03\x82\x22\x2a\x2d\xb0\xd2\x22\xce\x3b\xb4\x4e\xd6\xd2\xc4\xe9\x7a\x9c\xd2\xd5\x68\xde\x1d\x4d\x9a\x34\x15\x6c\x23\x22\x7a\xda\xbd\x75\xe6\xf7\xd8\xfe\xbf\xda\x8a\xf7\x54\x42\xf1\x85\xf8\x12\xb9\xd2\xdb\x10\x12\x2a\x01\x45\xe0\xed\x05\x6c\x8d\xa5\xb5\x51\x1c\xe5\xcc\x7b\x88\xf1\x57\x46\x6f\x21\x04\xef\x8f\x7e\xa2\x75\x18\x42\x9a\x7a\x8f\xbc\x0e\xe1\x15\x78\x0f\x1b\x21\xd6\x12\xd2\x17\x77\x29\x14\x97\xcd\xca\x28\x35\x0c\xbd\x18\x13\x2d\xdd\xd7\xd6\x5a\xf3\xd3\x22\x84\x90\xbd\xf4\x1e\x90\xd7\x5d\xba\xe2\x87\xb1\x2d\x2e\x76\x1b\x41\xe7\xa8\xe1\xae\xda\x5f\x4f\xf2\xa3\x17\xbd\xfa\xa1\x75\xda\xd4\x9f\x1a\xa9\x8d\x2a\x0a\x84\x50\x5c\xab\x10\x57\xd9\x18\x1c\xeb\x1f\x9b\xce\xdf\x75\x9e\x9f\x5d\x00\x93\x05\x9f\x00\x08\x6a\x2b\x1c\x6f\x93\x90\xf4\x96\x92\x1e\x96\xd9\x4d\xc2\x1a\xe4\xc7\x05\x6b\x34\x3d\x0b\xd6\x55\x97\x97\x1f\x46\xd5\x8b\x8f\x07\xd4\x8d\xf7\xa3\xe3\x9b\x79\x53\x45\x4c\x75\x5b\x9f\x5c\xc0\x28\xee\xbb\xc1\x3b\x28\xae\x7f\x99\xaa\x42\xf9\x7e\xbf\x41\x48\x89\x15\x2b\x94\x14\x42\x58\xb2\x1e\xda\x39\x37\xd6\xa9\xba\xb4\xaf\x6b\x5d\xc4\x57\xda\xc6\x8c\x6d\xbc\x79\x9d\x3d\xc4\x78\xfa\x5f\xc9\x87\x0d\xdd\x33\xe9\x4e\x8b\xdd\xca\xb6\x8e\xb6\x78\xb8\x9e\xbb\xb6\x13\x80\xf7\xe2\x93\x03\x3c\x30\xf9\x03\xf0\x70\x3d\x0f\x70\x6b\x95\x36\x16\xbf\x95\x27\x18\x1f\xf4\xf3\x81\xeb\x48\xfc\x0f\x80\xa3\x9e\x67\x99\x5d\xf0\xa9\x51\x8a\xca\xb9\x27\xc3\xf0\x1a\x32\x6e\x34\x3a\x7c\x2f\x62\xee\xf3\xfe\xf8\xd9\xb8\x8f\xe4\x56\x42\x35\xb1\xd1\x46\xf2\x43\xd8\x92\x15\xa5\x34\x2b\xcc\x67\x61\x99\xfd\x65\x18\x7b\x7f\xbe\x4d\x07\x2e\xff\x88\xf2\x77\x00\x00\x00\xff\xff\x27\x99\x58\x83\x7d\x08\x00\x00") +var _templatesValidationPrimitiveGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x95\xcf\x6e\xd3\x40\x10\xc6\xef\x79\x8a\xc1\x08\xc9\x46\xc8\x27\xc4\x01\xd4\x03\x2a\x41\x44\x2a\x50\xa9\x88\x73\x97\x64\xec\x8e\xb4\x1e\xa7\xb3\xe3\x90\x6a\xb5\xef\x8e\xd6\xf1\x3f\x41\x13\x61\x91\x53\xb9\x79\xf7\xdb\x9d\x99\xef\xe7\x19\xdb\x7b\x2a\x20\xff\x4c\x7c\x85\x5c\xea\x5d\x08\x0b\x2a\x00\x45\xe0\xed\x05\xec\x8c\xa5\x8d\x51\x1c\xe5\xd4\x7b\x88\xe7\xaf\x8d\xde\x41\x08\xde\x4f\x1e\xd1\x3a\x0c\x21\x49\xbc\x47\xde\x84\xf0\x0a\xbc\x87\xad\x10\x6b\x01\xc9\x8b\xfb\x04\xf2\xab\x7a\x6d\x94\x6a\x86\x4e\x8c\x81\x56\xee\x4b\x63\xad\xf9\x61\x11\x42\x48\x5f\x7a\x0f\xc8\x9b\x36\x5c\xfe\xdd\xd8\x06\x97\xfb\xad\xa0\x73\x54\x73\x9b\xed\x8f\x2b\xd9\xe4\x46\xa7\x5e\x36\x4e\xeb\xea\x63\x2d\x95\x51\x45\x81\x10\xf2\x1b\x15\xe2\x32\x1d\x0f\xc7\xfc\x53\xd3\xd9\xbb\xd6\xf3\xb3\x0b\x60\xb2\xe0\x17\x00\x82\xda\x08\xc7\xdd\x45\x58\x74\x96\x16\x1d\x2c\xb3\x3f\x09\xab\x97\x9f\x16\xac\xd1\xf4\x2c\x58\xd7\x6d\x5c\x7e\x1c\x55\x27\x3e\x1d\x50\xb7\xde\x8f\x8e\x6f\xe7\x75\x15\x31\x55\x4d\x75\x74\x00\xa3\x78\xa8\x06\xef\x21\xbf\xf9\x69\xca\x12\xe5\xdb\xc3\x16\x21\x21\x56\x2c\x51\x12\x08\x61\xc5\x3a\x94\x73\x6e\xac\xa7\xf2\xd2\x21\xaf\x75\x11\x5f\x61\x6b\x33\x96\xf1\xe6\x75\xfa\x18\xe3\xd3\x6f\x25\xeb\x27\xf4\xc0\xa4\x5d\x2d\xf7\x6b\xdb\x38\xda\xe1\xb0\x3d\x77\x6c\x4f\x00\x3e\x88\xff\x1d\xe0\x9e\xc9\x6f\x80\xfb\xed\x79\x80\x1b\xab\xb4\xb5\xf8\xb5\x38\xc2\x78\xd0\xcf\x07\xae\x25\xf1\x2f\x00\x26\x35\xcf\x32\xbb\xe4\x63\xad\x14\x95\x4b\xe3\xf0\xdc\xdd\x61\x78\x03\x29\xd7\x1a\x5d\xbe\x17\x31\x0f\x59\xb7\xfc\x64\xdc\x07\x72\x6b\xa1\x8a\xd8\x68\x2d\xd9\x70\x6c\xc5\x8a\x52\x98\x35\x66\xb3\xd0\xcc\xfe\x3b\x8c\xb5\x3f\xdf\x25\x3d\x9b\xc9\xd7\xb8\x45\xb2\x8a\x8d\x6b\xac\xc3\xb1\x8f\x55\x1a\x1c\x02\xfd\x25\xfe\x5f\x01\x00\x00\xff\xff\xaa\xd3\x6b\x2e\xb1\x08\x00\x00") func templatesValidationPrimitiveGotmplBytes() ([]byte, error) { return bindataRead( @@ -715,8 +862,8 @@ func templatesValidationPrimitiveGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/validation/primitive.gotmpl", size: 2173, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x25, 0xbe, 0x74, 0x9c, 0x71, 0xed, 0xcf, 0xcd, 0xb, 0x28, 0x65, 0x23, 0xe9, 0x2e, 0xb1, 0x83, 0x23, 0x14, 0x82, 0xb0, 0x5d, 0x77, 0xa1, 0x0, 0x72, 0x9f, 0xd6, 0xa2, 0x24, 0xd, 0x91, 0xb5}} + info := bindataFileInfo{name: "templates/validation/primitive.gotmpl", size: 2225, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa5, 0xc1, 0x1f, 0x2b, 0x1c, 0x3c, 0xf9, 0xf1, 0x51, 0xcb, 0xc2, 0xbe, 0xbc, 0x41, 0xca, 0x4d, 0x31, 0x2f, 0x60, 0xf, 0x71, 0x54, 0xaa, 0x40, 0x1b, 0x71, 0xc4, 0xa8, 0xaa, 0xdb, 0xfc, 0x22}} return a, nil } @@ -831,70 +978,49 @@ func AssetNames() []string { // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() (*asset, error){ - "templates/additionalpropertiesserializer.gotmpl": templatesAdditionalpropertiesserializerGotmpl, - - "templates/client/client.gotmpl": templatesClientClientGotmpl, - - "templates/client/facade.gotmpl": templatesClientFacadeGotmpl, - - "templates/client/parameter.gotmpl": templatesClientParameterGotmpl, - - "templates/client/response.gotmpl": templatesClientResponseGotmpl, - - "templates/contrib/stratoscale/client/client.gotmpl": templatesContribStratoscaleClientClientGotmpl, - - "templates/contrib/stratoscale/client/facade.gotmpl": templatesContribStratoscaleClientFacadeGotmpl, - - "templates/contrib/stratoscale/server/configureapi.gotmpl": templatesContribStratoscaleServerConfigureapiGotmpl, - - "templates/contrib/stratoscale/server/server.gotmpl": templatesContribStratoscaleServerServerGotmpl, - - "templates/docstring.gotmpl": templatesDocstringGotmpl, - - "templates/header.gotmpl": templatesHeaderGotmpl, - - "templates/model.gotmpl": templatesModelGotmpl, - - "templates/modelvalidator.gotmpl": templatesModelvalidatorGotmpl, - - "templates/schema.gotmpl": templatesSchemaGotmpl, - - "templates/schemabody.gotmpl": templatesSchemabodyGotmpl, - - "templates/schematype.gotmpl": templatesSchematypeGotmpl, - - "templates/schemavalidator.gotmpl": templatesSchemavalidatorGotmpl, - - "templates/server/builder.gotmpl": templatesServerBuilderGotmpl, - - "templates/server/configureapi.gotmpl": templatesServerConfigureapiGotmpl, - - "templates/server/doc.gotmpl": templatesServerDocGotmpl, - - "templates/server/main.gotmpl": templatesServerMainGotmpl, - - "templates/server/operation.gotmpl": templatesServerOperationGotmpl, - - "templates/server/parameter.gotmpl": templatesServerParameterGotmpl, - - "templates/server/responses.gotmpl": templatesServerResponsesGotmpl, - - "templates/server/server.gotmpl": templatesServerServerGotmpl, - - "templates/server/urlbuilder.gotmpl": templatesServerUrlbuilderGotmpl, - - "templates/structfield.gotmpl": templatesStructfieldGotmpl, - - "templates/swagger_json_embed.gotmpl": templatesSwagger_json_embedGotmpl, - - "templates/tupleserializer.gotmpl": templatesTupleserializerGotmpl, - - "templates/validation/customformat.gotmpl": templatesValidationCustomformatGotmpl, - - "templates/validation/primitive.gotmpl": templatesValidationPrimitiveGotmpl, - - "templates/validation/structfield.gotmpl": templatesValidationStructfieldGotmpl, -} + "templates/client/client.gotmpl": templatesClientClientGotmpl, + "templates/client/facade.gotmpl": templatesClientFacadeGotmpl, + "templates/client/parameter.gotmpl": templatesClientParameterGotmpl, + "templates/client/response.gotmpl": templatesClientResponseGotmpl, + "templates/contrib/stratoscale/client/client.gotmpl": templatesContribStratoscaleClientClientGotmpl, + "templates/contrib/stratoscale/client/facade.gotmpl": templatesContribStratoscaleClientFacadeGotmpl, + "templates/contrib/stratoscale/server/configureapi.gotmpl": templatesContribStratoscaleServerConfigureapiGotmpl, + "templates/contrib/stratoscale/server/server.gotmpl": templatesContribStratoscaleServerServerGotmpl, + "templates/docstring.gotmpl": templatesDocstringGotmpl, + "templates/header.gotmpl": templatesHeaderGotmpl, + "templates/model.gotmpl": templatesModelGotmpl, + "templates/schema.gotmpl": templatesSchemaGotmpl, + "templates/schemabody.gotmpl": templatesSchemabodyGotmpl, + "templates/schemaembedded.gotmpl": templatesSchemaembeddedGotmpl, + "templates/schemapolymorphic.gotmpl": templatesSchemapolymorphicGotmpl, + "templates/schematype.gotmpl": templatesSchematypeGotmpl, + "templates/schemavalidator.gotmpl": templatesSchemavalidatorGotmpl, + "templates/serializers/additionalpropertiesserializer.gotmpl": templatesSerializersAdditionalpropertiesserializerGotmpl, + "templates/serializers/aliasedserializer.gotmpl": templatesSerializersAliasedserializerGotmpl, + "templates/serializers/allofserializer.gotmpl": templatesSerializersAllofserializerGotmpl, + "templates/serializers/basetypeserializer.gotmpl": templatesSerializersBasetypeserializerGotmpl, + "templates/serializers/marshalbinaryserializer.gotmpl": templatesSerializersMarshalbinaryserializerGotmpl, + "templates/serializers/schemaserializer.gotmpl": templatesSerializersSchemaserializerGotmpl, + "templates/serializers/subtypeserializer.gotmpl": templatesSerializersSubtypeserializerGotmpl, + "templates/serializers/tupleserializer.gotmpl": templatesSerializersTupleserializerGotmpl, + "templates/server/builder.gotmpl": templatesServerBuilderGotmpl, + "templates/server/configureapi.gotmpl": templatesServerConfigureapiGotmpl, + "templates/server/doc.gotmpl": templatesServerDocGotmpl, + "templates/server/main.gotmpl": templatesServerMainGotmpl, + "templates/server/operation.gotmpl": templatesServerOperationGotmpl, + "templates/server/parameter.gotmpl": templatesServerParameterGotmpl, + "templates/server/responses.gotmpl": templatesServerResponsesGotmpl, + "templates/server/server.gotmpl": templatesServerServerGotmpl, + "templates/server/urlbuilder.gotmpl": templatesServerUrlbuilderGotmpl, + "templates/structfield.gotmpl": templatesStructfieldGotmpl, + "templates/swagger_json_embed.gotmpl": templatesSwagger_json_embedGotmpl, + "templates/validation/customformat.gotmpl": templatesValidationCustomformatGotmpl, + "templates/validation/primitive.gotmpl": templatesValidationPrimitiveGotmpl, + "templates/validation/structfield.gotmpl": templatesValidationStructfieldGotmpl, +} + +// AssetDebug is true if the assets were built with the debug flag enabled. +const AssetDebug = false // AssetDir returns the file names below a certain // directory embedded in the file by go-bindata. @@ -938,7 +1064,6 @@ type bintree struct { var _bintree = &bintree{nil, map[string]*bintree{ "templates": &bintree{nil, map[string]*bintree{ - "additionalpropertiesserializer.gotmpl": &bintree{templatesAdditionalpropertiesserializerGotmpl, map[string]*bintree{}}, "client": &bintree{nil, map[string]*bintree{ "client.gotmpl": &bintree{templatesClientClientGotmpl, map[string]*bintree{}}, "facade.gotmpl": &bintree{templatesClientFacadeGotmpl, map[string]*bintree{}}, @@ -957,14 +1082,25 @@ var _bintree = &bintree{nil, map[string]*bintree{ }}, }}, }}, - "docstring.gotmpl": &bintree{templatesDocstringGotmpl, map[string]*bintree{}}, - "header.gotmpl": &bintree{templatesHeaderGotmpl, map[string]*bintree{}}, - "model.gotmpl": &bintree{templatesModelGotmpl, map[string]*bintree{}}, - "modelvalidator.gotmpl": &bintree{templatesModelvalidatorGotmpl, map[string]*bintree{}}, - "schema.gotmpl": &bintree{templatesSchemaGotmpl, map[string]*bintree{}}, - "schemabody.gotmpl": &bintree{templatesSchemabodyGotmpl, map[string]*bintree{}}, - "schematype.gotmpl": &bintree{templatesSchematypeGotmpl, map[string]*bintree{}}, - "schemavalidator.gotmpl": &bintree{templatesSchemavalidatorGotmpl, map[string]*bintree{}}, + "docstring.gotmpl": &bintree{templatesDocstringGotmpl, map[string]*bintree{}}, + "header.gotmpl": &bintree{templatesHeaderGotmpl, map[string]*bintree{}}, + "model.gotmpl": &bintree{templatesModelGotmpl, map[string]*bintree{}}, + "schema.gotmpl": &bintree{templatesSchemaGotmpl, map[string]*bintree{}}, + "schemabody.gotmpl": &bintree{templatesSchemabodyGotmpl, map[string]*bintree{}}, + "schemaembedded.gotmpl": &bintree{templatesSchemaembeddedGotmpl, map[string]*bintree{}}, + "schemapolymorphic.gotmpl": &bintree{templatesSchemapolymorphicGotmpl, map[string]*bintree{}}, + "schematype.gotmpl": &bintree{templatesSchematypeGotmpl, map[string]*bintree{}}, + "schemavalidator.gotmpl": &bintree{templatesSchemavalidatorGotmpl, map[string]*bintree{}}, + "serializers": &bintree{nil, map[string]*bintree{ + "additionalpropertiesserializer.gotmpl": &bintree{templatesSerializersAdditionalpropertiesserializerGotmpl, map[string]*bintree{}}, + "aliasedserializer.gotmpl": &bintree{templatesSerializersAliasedserializerGotmpl, map[string]*bintree{}}, + "allofserializer.gotmpl": &bintree{templatesSerializersAllofserializerGotmpl, map[string]*bintree{}}, + "basetypeserializer.gotmpl": &bintree{templatesSerializersBasetypeserializerGotmpl, map[string]*bintree{}}, + "marshalbinaryserializer.gotmpl": &bintree{templatesSerializersMarshalbinaryserializerGotmpl, map[string]*bintree{}}, + "schemaserializer.gotmpl": &bintree{templatesSerializersSchemaserializerGotmpl, map[string]*bintree{}}, + "subtypeserializer.gotmpl": &bintree{templatesSerializersSubtypeserializerGotmpl, map[string]*bintree{}}, + "tupleserializer.gotmpl": &bintree{templatesSerializersTupleserializerGotmpl, map[string]*bintree{}}, + }}, "server": &bintree{nil, map[string]*bintree{ "builder.gotmpl": &bintree{templatesServerBuilderGotmpl, map[string]*bintree{}}, "configureapi.gotmpl": &bintree{templatesServerConfigureapiGotmpl, map[string]*bintree{}}, @@ -978,7 +1114,6 @@ var _bintree = &bintree{nil, map[string]*bintree{ }}, "structfield.gotmpl": &bintree{templatesStructfieldGotmpl, map[string]*bintree{}}, "swagger_json_embed.gotmpl": &bintree{templatesSwagger_json_embedGotmpl, map[string]*bintree{}}, - "tupleserializer.gotmpl": &bintree{templatesTupleserializerGotmpl, map[string]*bintree{}}, "validation": &bintree{nil, map[string]*bintree{ "customformat.gotmpl": &bintree{templatesValidationCustomformatGotmpl, map[string]*bintree{}}, "primitive.gotmpl": &bintree{templatesValidationPrimitiveGotmpl, map[string]*bintree{}}, diff --git a/vendor/github.com/go-swagger/go-swagger/generator/client.go b/vendor/github.com/go-swagger/go-swagger/generator/client.go index 7eda6c3904..65915bc6d9 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/client.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/client.go @@ -15,102 +15,54 @@ package generator import ( - "encoding/json" "errors" - "fmt" - "os" - "path" - "path/filepath" - "sort" - - "github.com/go-openapi/analysis" - "github.com/go-openapi/runtime" + "github.com/go-openapi/swag" ) // GenerateClient generates a client library for a swagger spec document. func GenerateClient(name string, modelNames, operationIDs []string, opts *GenOpts) error { - templates.LoadDefaults() - if opts == nil { - return errors.New("gen opts are required") - } - - if opts.Template != "" { - if err := templates.LoadContrib(opts.Template); err != nil { - return err - } - } - - templates.SetAllowOverride(opts.AllowTemplateOverride) - - if opts.TemplateDir != "" { - if err := templates.LoadDir(opts.TemplateDir); err != nil { - return err - } - } - if err := opts.CheckOpts(); err != nil { return err } - // Load the spec - _, specDoc, err := loadSpec(opts.Spec) - if err != nil { + if err := opts.setTemplates(); err != nil { return err } - // Validate and Expand. specDoc is in/out param. - specDoc, err = validateAndFlattenSpec(opts, specDoc) + specDoc, analyzed, err := opts.analyzeSpec() if err != nil { return err } - analyzed := analysis.New(specDoc.Spec()) - models, err := gatherModels(specDoc, modelNames) if err != nil { return err } operations := gatherOperations(analyzed, operationIDs) - if len(operations) == 0 { return errors.New("no operations were selected") } - defaultScheme := opts.DefaultScheme - if defaultScheme == "" { - defaultScheme = sHTTP - } - - defaultConsumes := opts.DefaultConsumes - if defaultConsumes == "" { - defaultConsumes = runtime.JSONMime - } - - defaultProduces := opts.DefaultProduces - if defaultProduces == "" { - defaultProduces = runtime.JSONMime - } - generator := appGenerator{ - Name: appNameOrDefault(specDoc, name, "rest"), + Name: appNameOrDefault(specDoc, name, defaultClientName), SpecDoc: specDoc, Analyzed: analyzed, Models: models, Operations: operations, Target: opts.Target, DumpData: opts.DumpData, - Package: opts.LanguageOpts.ManglePackageName(opts.ClientPackage, "client"), - APIPackage: opts.LanguageOpts.ManglePackagePath(opts.APIPackage, "api"), - ModelsPackage: opts.LanguageOpts.ManglePackagePath(opts.ModelPackage, "definitions"), - ServerPackage: opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, "server"), - ClientPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, "client"), - OperationsPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, "client"), - Principal: opts.Principal, - DefaultScheme: defaultScheme, - DefaultProduces: defaultProduces, - DefaultConsumes: defaultConsumes, + Package: opts.LanguageOpts.ManglePackageName(opts.ClientPackage, defaultClientTarget), + APIPackage: opts.LanguageOpts.ManglePackagePath(opts.APIPackage, defaultOperationsTarget), + ModelsPackage: opts.LanguageOpts.ManglePackagePath(opts.ModelPackage, defaultModelsTarget), + ServerPackage: opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, defaultServerTarget), + ClientPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, defaultClientTarget), + OperationsPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, defaultClientTarget), + Principal: opts.PrincipalAlias(), + DefaultScheme: opts.DefaultScheme, + DefaultProduces: opts.DefaultProduces, + DefaultConsumes: opts.DefaultConsumes, GenOpts: opts, } generator.Receiver = "o" @@ -123,69 +75,33 @@ type clientGenerator struct { func (c *clientGenerator) Generate() error { app, err := c.makeCodegenApp() - if app.Name == "" { - app.Name = "APIClient" - } - baseImport := c.GenOpts.LanguageOpts.baseImport(c.Target) - - if c.GenOpts.ExistingModels == "" { - if app.Imports == nil { - app.Imports = make(map[string]string) - } - pkgAlias := c.GenOpts.LanguageOpts.ManglePackageName(c.ModelsPackage, "models") - app.Imports[pkgAlias] = path.Join( - filepath.ToSlash(baseImport), - c.GenOpts.LanguageOpts.ManglePackagePath(c.GenOpts.ModelPackage, "models")) - } else { - app.DefaultImports = append(app.DefaultImports, c.GenOpts.LanguageOpts.ManglePackagePath(c.GenOpts.ExistingModels, "")) - } if err != nil { return err } if c.DumpData { - bb, _ := json.MarshalIndent(swag.ToDynamicJSON(app), "", " ") - fmt.Fprintln(os.Stdout, string(bb)) - return nil + return dumpData(swag.ToDynamicJSON(app)) } if c.GenOpts.IncludeModel { for _, mod := range app.Models { - modCopy := mod - modCopy.IncludeValidator = true - if !mod.IsStream { - if err := c.GenOpts.renderDefinition(&modCopy); err != nil { - return err - } + if mod.IsStream { + continue + } + if err := c.GenOpts.renderDefinition(&mod); err != nil { + return err } } } if c.GenOpts.IncludeHandler { - sort.Sort(app.OperationGroups) - for i := range app.OperationGroups { - opGroup := app.OperationGroups[i] - opGroup.DefaultImports = app.DefaultImports - opGroup.RootPackage = c.ClientPackage - opGroup.GenOpts = c.GenOpts - app.OperationGroups[i] = opGroup - sort.Sort(opGroup.Operations) - for _, op := range opGroup.Operations { - opCopy := op - if opCopy.Package == "" { - opCopy.Package = c.Package - } - if err := c.GenOpts.renderOperation(&opCopy); err != nil { + for _, opg := range app.OperationGroups { + for _, op := range opg.Operations { + if err := c.GenOpts.renderOperation(&op); err != nil { return err } } - app.DefaultImports = append(app.DefaultImports, - path.Join( - filepath.ToSlash(baseImport), - c.GenOpts.LanguageOpts.ManglePackagePath(c.ClientPackage, "client"), - opGroup.Name)) - - if err := c.GenOpts.renderOperationGroup(&opGroup); err != nil { + if err := c.GenOpts.renderOperationGroup(&opg); err != nil { return err } } diff --git a/vendor/github.com/go-swagger/go-swagger/generator/debug.go b/vendor/github.com/go-swagger/go-swagger/generator/debug.go index 050b01f195..61b4b8d48d 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/debug.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/debug.go @@ -31,10 +31,6 @@ var ( generatorLogger *log.Logger ) -func init() { - debugOptions() -} - func debugOptions() { generatorLogger = log.New(os.Stdout, "generator:", log.LstdFlags) } diff --git a/vendor/github.com/go-swagger/go-swagger/generator/language.go b/vendor/github.com/go-swagger/go-swagger/generator/language.go new file mode 100644 index 0000000000..a8dc0cfdea --- /dev/null +++ b/vendor/github.com/go-swagger/go-swagger/generator/language.go @@ -0,0 +1,433 @@ +package generator + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "log" + "os" + "path" + "path/filepath" + "regexp" + goruntime "runtime" + "sort" + "strings" + + "github.com/go-openapi/swag" + "golang.org/x/tools/imports" +) + +var ( + // DefaultLanguageFunc defines the default generation language + DefaultLanguageFunc func() *LanguageOpts + + moduleRe *regexp.Regexp +) + +func initLanguage() { + DefaultLanguageFunc = GoLangOpts + + moduleRe = regexp.MustCompile(`module[ \t]+([^\s]+)`) +} + +// LanguageOpts to describe a language to the code generator +type LanguageOpts struct { + ReservedWords []string + BaseImportFunc func(string) string `json:"-"` + ImportsFunc func(map[string]string) string `json:"-"` + ArrayInitializerFunc func(interface{}) (string, error) `json:"-"` + reservedWordsSet map[string]struct{} + initialized bool + formatFunc func(string, []byte) ([]byte, error) + fileNameFunc func(string) string // language specific source file naming rules + dirNameFunc func(string) string // language specific directory naming rules +} + +// Init the language option +func (l *LanguageOpts) Init() { + if l.initialized { + return + } + l.initialized = true + l.reservedWordsSet = make(map[string]struct{}) + for _, rw := range l.ReservedWords { + l.reservedWordsSet[rw] = struct{}{} + } +} + +// MangleName makes sure a reserved word gets a safe name +func (l *LanguageOpts) MangleName(name, suffix string) string { + if _, ok := l.reservedWordsSet[swag.ToFileName(name)]; !ok { + return name + } + return strings.Join([]string{name, suffix}, "_") +} + +// MangleVarName makes sure a reserved word gets a safe name +func (l *LanguageOpts) MangleVarName(name string) string { + nm := swag.ToVarName(name) + if _, ok := l.reservedWordsSet[nm]; !ok { + return nm + } + return nm + "Var" +} + +// MangleFileName makes sure a file name gets a safe name +func (l *LanguageOpts) MangleFileName(name string) string { + if l.fileNameFunc != nil { + return l.fileNameFunc(name) + } + return swag.ToFileName(name) +} + +// ManglePackageName makes sure a package gets a safe name. +// In case of a file system path (e.g. name contains "/" or "\" on Windows), this return only the last element. +func (l *LanguageOpts) ManglePackageName(name, suffix string) string { + if name == "" { + return suffix + } + if l.dirNameFunc != nil { + name = l.dirNameFunc(name) + } + pth := filepath.ToSlash(filepath.Clean(name)) // preserve path + pkg := importAlias(pth) // drop path + return l.MangleName(swag.ToFileName(prefixForName(pkg)+pkg), suffix) +} + +// ManglePackagePath makes sure a full package path gets a safe name. +// Only the last part of the path is altered. +func (l *LanguageOpts) ManglePackagePath(name string, suffix string) string { + if name == "" { + return suffix + } + target := filepath.ToSlash(filepath.Clean(name)) // preserve path + parts := strings.Split(target, "/") + parts[len(parts)-1] = l.ManglePackageName(parts[len(parts)-1], suffix) + return strings.Join(parts, "/") +} + +// FormatContent formats a file with a language specific formatter +func (l *LanguageOpts) FormatContent(name string, content []byte) ([]byte, error) { + if l.formatFunc != nil { + return l.formatFunc(name, content) + } + return content, nil +} + +// imports generate the code to import some external packages, possibly aliased +func (l *LanguageOpts) imports(imports map[string]string) string { + if l.ImportsFunc != nil { + return l.ImportsFunc(imports) + } + return "" +} + +// arrayInitializer builds a litteral array +func (l *LanguageOpts) arrayInitializer(data interface{}) (string, error) { + if l.ArrayInitializerFunc != nil { + return l.ArrayInitializerFunc(data) + } + return "", nil +} + +// baseImport figures out the base path to generate import statements +func (l *LanguageOpts) baseImport(tgt string) string { + if l.BaseImportFunc != nil { + return l.BaseImportFunc(tgt) + } + debugLog("base import func is nil") + return "" +} + +// GoLangOpts for rendering items as golang code +func GoLangOpts() *LanguageOpts { + var goOtherReservedSuffixes = map[string]bool{ + // see: + // https://golang.org/src/go/build/syslist.go + // https://golang.org/doc/install/source#environment + + // goos + "aix": true, + "android": true, + "darwin": true, + "dragonfly": true, + "freebsd": true, + "hurd": true, + "illumos": true, + "js": true, + "linux": true, + "nacl": true, + "netbsd": true, + "openbsd": true, + "plan9": true, + "solaris": true, + "windows": true, + "zos": true, + + // arch + "386": true, + "amd64": true, + "amd64p32": true, + "arm": true, + "armbe": true, + "arm64": true, + "arm64be": true, + "mips": true, + "mipsle": true, + "mips64": true, + "mips64le": true, + "mips64p32": true, + "mips64p32le": true, + "ppc": true, + "ppc64": true, + "ppc64le": true, + "riscv": true, + "riscv64": true, + "s390": true, + "s390x": true, + "sparc": true, + "sparc64": true, + "wasm": true, + + // other reserved suffixes + "test": true, + } + + opts := new(LanguageOpts) + opts.ReservedWords = []string{ + "break", "default", "func", "interface", "select", + "case", "defer", "go", "map", "struct", + "chan", "else", "goto", "package", "switch", + "const", "fallthrough", "if", "range", "type", + "continue", "for", "import", "return", "var", + } + + opts.formatFunc = func(ffn string, content []byte) ([]byte, error) { + opts := new(imports.Options) + opts.TabIndent = true + opts.TabWidth = 2 + opts.Fragment = true + opts.Comments = true + return imports.Process(ffn, content, opts) + } + + opts.fileNameFunc = func(name string) string { + // whenever a generated file name ends with a suffix + // that is meaningful to go build, adds a "swagger" + // suffix + parts := strings.Split(swag.ToFileName(name), "_") + if goOtherReservedSuffixes[parts[len(parts)-1]] { + // file name ending with a reserved arch or os name + // are appended an innocuous suffix "swagger" + parts = append(parts, "swagger") + } + return strings.Join(parts, "_") + } + + opts.dirNameFunc = func(name string) string { + // whenever a generated directory name is a special + // golang directory, append an innocuous suffix + switch name { + case "vendor", "internal": + return strings.Join([]string{name, "swagger"}, "_") + } + return name + } + + opts.ImportsFunc = func(imports map[string]string) string { + if len(imports) == 0 { + return "" + } + result := make([]string, 0, len(imports)) + for k, v := range imports { + _, name := path.Split(v) + if name != k { + result = append(result, fmt.Sprintf("\t%s %q", k, v)) + } else { + result = append(result, fmt.Sprintf("\t%q", v)) + } + } + sort.Strings(result) + return strings.Join(result, "\n") + } + + opts.ArrayInitializerFunc = func(data interface{}) (string, error) { + // ArrayInitializer constructs a Go literal initializer from interface{} literals. + // e.g. []interface{}{"a", "b"} is transformed in {"a","b",} + // e.g. map[string]interface{}{ "a": "x", "b": "y"} is transformed in {"a":"x","b":"y",}. + // + // NOTE: this is currently used to construct simple slice intializers for default values. + // This allows for nicer slice initializers for slices of primitive types and avoid systematic use for json.Unmarshal(). + b, err := json.Marshal(data) + if err != nil { + return "", err + } + return strings.Replace(strings.Replace(strings.Replace(string(b), "}", ",}", -1), "[", "{", -1), "]", ",}", -1), nil + } + + opts.BaseImportFunc = func(tgt string) string { + tgt = filepath.Clean(tgt) + // On Windows, filepath.Abs("") behaves differently than on Unix. + // Windows: yields an error, since Abs() does not know the volume. + // UNIX: returns current working directory + if tgt == "" { + tgt = "." + } + tgtAbsPath, err := filepath.Abs(tgt) + if err != nil { + log.Fatalf("could not evaluate base import path with target \"%s\": %v", tgt, err) + } + + var tgtAbsPathExtended string + tgtAbsPathExtended, err = filepath.EvalSymlinks(tgtAbsPath) + if err != nil { + log.Fatalf("could not evaluate base import path with target \"%s\" (with symlink resolution): %v", tgtAbsPath, err) + } + + gopath := os.Getenv("GOPATH") + if gopath == "" { + gopath = filepath.Join(os.Getenv("HOME"), "go") + } + + var pth string + for _, gp := range filepath.SplitList(gopath) { + // EvalSymLinks also calls the Clean + gopathExtended, er := filepath.EvalSymlinks(gp) + if er != nil { + log.Fatalln(er) + } + gopathExtended = filepath.Join(gopathExtended, "src") + gp = filepath.Join(gp, "src") + + // At this stage we have expanded and unexpanded target path. GOPATH is fully expanded. + // Expanded means symlink free. + // We compare both types of targetpath<s> with gopath. + // If any one of them coincides with gopath , it is imperative that + // target path lies inside gopath. How? + // - Case 1: Irrespective of symlinks paths coincide. Both non-expanded paths. + // - Case 2: Symlink in target path points to location inside GOPATH. (Expanded Target Path) + // - Case 3: Symlink in target path points to directory outside GOPATH (Unexpanded target path) + + // Case 1: - Do nothing case. If non-expanded paths match just generate base import path as if + // there are no symlinks. + + // Case 2: - Symlink in target path points to location inside GOPATH. (Expanded Target Path) + // First if will fail. Second if will succeed. + + // Case 3: - Symlink in target path points to directory outside GOPATH (Unexpanded target path) + // First if will succeed and break. + + // compares non expanded path for both + if ok, relativepath := checkPrefixAndFetchRelativePath(tgtAbsPath, gp); ok { + pth = relativepath + break + } + + // Compares non-expanded target path + if ok, relativepath := checkPrefixAndFetchRelativePath(tgtAbsPath, gopathExtended); ok { + pth = relativepath + break + } + + // Compares expanded target path. + if ok, relativepath := checkPrefixAndFetchRelativePath(tgtAbsPathExtended, gopathExtended); ok { + pth = relativepath + break + } + + } + + mod, goModuleAbsPath, err := tryResolveModule(tgtAbsPath) + switch { + case err != nil: + log.Fatalf("Failed to resolve module using go.mod file: %s", err) + case mod != "": + relTgt := relPathToRelGoPath(goModuleAbsPath, tgtAbsPath) + if !strings.HasSuffix(mod, relTgt) { + return filepath.ToSlash(mod + relTgt) + } + return filepath.ToSlash(mod) + } + + if pth == "" { + log.Fatalln("target must reside inside a location in the $GOPATH/src or be a module") + } + return filepath.ToSlash(pth) + } + opts.Init() + return opts +} + +// resolveGoModFile walks up the directory tree starting from 'dir' until it +// finds a go.mod file. If go.mod is found it will return the related file +// object. If no go.mod file is found it will return an error. +func resolveGoModFile(dir string) (*os.File, string, error) { + goModPath := filepath.Join(dir, "go.mod") + f, err := os.Open(goModPath) + if err != nil { + if os.IsNotExist(err) && dir != filepath.Dir(dir) { + return resolveGoModFile(filepath.Dir(dir)) + } + return nil, "", err + } + return f, dir, nil +} + +// relPathToRelGoPath takes a relative os path and returns the relative go +// package path. For unix nothing will change but for windows \ will be +// converted to /. +func relPathToRelGoPath(modAbsPath, absPath string) string { + if absPath == "." { + return "" + } + + path := strings.TrimPrefix(absPath, modAbsPath) + pathItems := strings.Split(path, string(filepath.Separator)) + return strings.Join(pathItems, "/") +} + +func tryResolveModule(baseTargetPath string) (string, string, error) { + f, goModAbsPath, err := resolveGoModFile(baseTargetPath) + switch { + case os.IsNotExist(err): + return "", "", nil + case err != nil: + return "", "", err + } + + src, err := ioutil.ReadAll(f) + if err != nil { + return "", "", err + } + + match := moduleRe.FindSubmatch(src) + if len(match) != 2 { + return "", "", nil + } + + return string(match[1]), goModAbsPath, nil +} + +// 1. Checks if the child path and parent path coincide. +// 2. If they do return child path relative to parent path. +// 3. Everything else return false +func checkPrefixAndFetchRelativePath(childpath string, parentpath string) (bool, string) { + // Windows (local) file systems - NTFS, as well as FAT and variants + // are case insensitive. + cp, pp := childpath, parentpath + if goruntime.GOOS == "windows" { + cp = strings.ToLower(cp) + pp = strings.ToLower(pp) + } + + if strings.HasPrefix(cp, pp) { + pth, err := filepath.Rel(parentpath, childpath) + if err != nil { + log.Fatalln(err) + } + return true, pth + } + + return false, "" + +} diff --git a/vendor/github.com/go-swagger/go-swagger/generator/media.go b/vendor/github.com/go-swagger/go-swagger/generator/media.go new file mode 100644 index 0000000000..f9dad9fa4b --- /dev/null +++ b/vendor/github.com/go-swagger/go-swagger/generator/media.go @@ -0,0 +1,191 @@ +package generator + +import ( + "regexp" + "sort" + "strings" + + "github.com/go-openapi/runtime" + "github.com/go-openapi/swag" +) + +const jsonSerializer = "json" + +var mediaTypeNames = map[*regexp.Regexp]string{ + regexp.MustCompile("application/.*json"): jsonSerializer, + regexp.MustCompile("application/.*yaml"): "yaml", + regexp.MustCompile("application/.*protobuf"): "protobuf", + regexp.MustCompile("application/.*capnproto"): "capnproto", + regexp.MustCompile("application/.*thrift"): "thrift", + regexp.MustCompile("(?:application|text)/.*xml"): "xml", + regexp.MustCompile("text/.*markdown"): "markdown", + regexp.MustCompile("text/.*html"): "html", + regexp.MustCompile("text/.*csv"): "csv", + regexp.MustCompile("text/.*tsv"): "tsv", + regexp.MustCompile("text/.*javascript"): "js", + regexp.MustCompile("text/.*css"): "css", + regexp.MustCompile("text/.*plain"): "txt", + regexp.MustCompile("application/.*octet-stream"): "bin", + regexp.MustCompile("application/.*tar"): "tar", + regexp.MustCompile("application/.*gzip"): "gzip", + regexp.MustCompile("application/.*gz"): "gzip", + regexp.MustCompile("application/.*raw-stream"): "bin", + regexp.MustCompile("application/x-www-form-urlencoded"): "urlform", + regexp.MustCompile("application/javascript"): "txt", + regexp.MustCompile("multipart/form-data"): "multipartform", + regexp.MustCompile("image/.*"): "bin", + regexp.MustCompile("audio/.*"): "bin", + regexp.MustCompile("application/pdf"): "bin", +} + +var knownProducers = map[string]string{ + jsonSerializer: "runtime.JSONProducer()", + "yaml": "yamlpc.YAMLProducer()", + "xml": "runtime.XMLProducer()", + "txt": "runtime.TextProducer()", + "bin": "runtime.ByteStreamProducer()", + "urlform": "runtime.DiscardProducer", + "multipartform": "runtime.DiscardProducer", +} + +var knownConsumers = map[string]string{ + jsonSerializer: "runtime.JSONConsumer()", + "yaml": "yamlpc.YAMLConsumer()", + "xml": "runtime.XMLConsumer()", + "txt": "runtime.TextConsumer()", + "bin": "runtime.ByteStreamConsumer()", + "urlform": "runtime.DiscardConsumer", + "multipartform": "runtime.DiscardConsumer", +} + +func wellKnownMime(tn string) (string, bool) { + for k, v := range mediaTypeNames { + if k.MatchString(tn) { + return v, true + } + } + return "", false +} + +func mediaMime(orig string) string { + return strings.SplitN(orig, ";", 2)[0] +} + +func mediaParameters(orig string) string { + parts := strings.SplitN(orig, ";", 2) + if len(parts) < 2 { + return "" + } + return parts[1] +} + +func (a *appGenerator) makeSerializers(mediaTypes []string, known func(string) (string, bool)) (GenSerGroups, bool) { + supportsJSON := false + uniqueSerializers := make(map[string]*GenSerializer, len(mediaTypes)) + uniqueSerializerGroups := make(map[string]*GenSerGroup, len(mediaTypes)) + + // build all required serializers + for _, media := range mediaTypes { + key := mediaMime(media) + nm, ok := wellKnownMime(key) + if !ok { + // keep this serializer named, even though its implementation is empty (cf. #1557) + nm = key + } + name := swag.ToJSONName(nm) + impl, _ := known(name) + + ser, ok := uniqueSerializers[key] + if !ok { + ser = &GenSerializer{ + AppName: a.Name, + ReceiverName: a.Receiver, + Name: name, + MediaType: key, + Implementation: impl, + Parameters: []string{}, + } + uniqueSerializers[key] = ser + } + // provide all known parameters (currently unused by codegen templates) + if params := strings.TrimSpace(mediaParameters(media)); params != "" { + found := false + for _, p := range ser.Parameters { + if params == p { + found = true + break + } + } + if !found { + ser.Parameters = append(ser.Parameters, params) + } + } + + uniqueSerializerGroups[name] = &GenSerGroup{ + GenSerializer: GenSerializer{ + AppName: a.Name, + ReceiverName: a.Receiver, + Name: name, + Implementation: impl, + }, + } + } + + if len(uniqueSerializers) == 0 { + impl, _ := known(jsonSerializer) + uniqueSerializers[runtime.JSONMime] = &GenSerializer{ + AppName: a.Name, + ReceiverName: a.Receiver, + Name: jsonSerializer, + MediaType: runtime.JSONMime, + Implementation: impl, + Parameters: []string{}, + } + uniqueSerializerGroups[jsonSerializer] = &GenSerGroup{ + GenSerializer: GenSerializer{ + AppName: a.Name, + ReceiverName: a.Receiver, + Name: jsonSerializer, + Implementation: impl, + }, + } + supportsJSON = true + } + + // group serializers by consumer/producer to serve several mime media types + serializerGroups := make(GenSerGroups, 0, len(uniqueSerializers)) + + for _, group := range uniqueSerializerGroups { + if group.Name == jsonSerializer { + supportsJSON = true + } + serializers := make(GenSerializers, 0, len(uniqueSerializers)) + for _, ser := range uniqueSerializers { + if group.Name == ser.Name { + sort.Strings(ser.Parameters) + serializers = append(serializers, *ser) + } + } + sort.Sort(serializers) + group.AllSerializers = serializers // provides the full list of mime media types for this serializer group + serializerGroups = append(serializerGroups, *group) + } + sort.Sort(serializerGroups) + return serializerGroups, supportsJSON +} + +func (a *appGenerator) makeConsumes() (GenSerGroups, bool) { + // builds a codegen struct from all consumes in the spec + return a.makeSerializers(a.Analyzed.RequiredConsumes(), func(media string) (string, bool) { + c, ok := knownConsumers[media] + return c, ok + }) +} + +func (a *appGenerator) makeProduces() (GenSerGroups, bool) { + // builds a codegen struct from all produces in the spec + return a.makeSerializers(a.Analyzed.RequiredProduces(), func(media string) (string, bool) { + p, ok := knownProducers[media] + return p, ok + }) +} diff --git a/vendor/github.com/go-swagger/go-swagger/generator/model.go b/vendor/github.com/go-swagger/go-swagger/generator/model.go index 9b6bd19849..c005d02845 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/model.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/model.go @@ -15,11 +15,9 @@ package generator import ( - "encoding/json" "errors" "fmt" "log" - "os" "path" "path/filepath" "sort" @@ -49,30 +47,38 @@ Every action that happens tracks the path which is a linked list of refs */ -// GenerateDefinition generates a model file for a schema definition. -func GenerateDefinition(modelNames []string, opts *GenOpts) error { - if opts == nil { - return errors.New("gen opts are required") +// GenerateModels generates all model files for some schema definitions +func GenerateModels(modelNames []string, opts *GenOpts) error { + // overide any default or incompatible options setting + opts.IncludeModel = true + opts.IgnoreOperations = true + opts.ExistingModels = "" + opts.IncludeHandler = false + opts.IncludeMain = false + opts.IncludeSupport = false + generator, err := newAppGenerator("", modelNames, nil, opts) + if err != nil { + return err } + return generator.Generate() +} - templates.SetAllowOverride(opts.AllowTemplateOverride) - - if opts.TemplateDir != "" { - if err := templates.LoadDir(opts.TemplateDir); err != nil { - return err - } +// GenerateDefinition generates a single model file for some schema definitions +func GenerateDefinition(modelNames []string, opts *GenOpts) error { + if err := opts.CheckOpts(); err != nil { + return err } - if err := opts.CheckOpts(); err != nil { + if err := opts.setTemplates(); err != nil { return err } - // Load the spec - specPath, specDoc, err := loadSpec(opts.Spec) + specDoc, _, err := opts.analyzeSpec() if err != nil { return err } + modelNames = pruneEmpty(modelNames) if len(modelNames) == 0 { for k := range specDoc.Spec().Definitions { modelNames = append(modelNames, k) @@ -83,7 +89,7 @@ func GenerateDefinition(modelNames []string, opts *GenOpts) error { // lookup schema model, ok := specDoc.Spec().Definitions[modelName] if !ok { - return fmt.Errorf("model %q not found in definitions given by %q", modelName, specPath) + return fmt.Errorf("model %q not found in definitions given by %q", modelName, opts.Spec) } // generate files @@ -121,9 +127,7 @@ func (m *definitionGenerator) Generate() error { } if m.opts.DumpData { - bb, _ := json.MarshalIndent(swag.ToDynamicJSON(mod), "", " ") - fmt.Fprintln(os.Stdout, string(bb)) - return nil + return dumpData(swag.ToDynamicJSON(mod)) } if m.opts.IncludeModel { @@ -169,13 +173,17 @@ func shallowValidationLookup(sch GenSchema) bool { // and NeedsValidation (e.g. should have a Validate method with something in it). // The latter was almost not used anyhow. + if sch.HasAdditionalProperties && sch.AdditionalProperties == nil { + log.Printf("warning: schema for additional properties in schema %q is empty. skipped", sch.Name) + } + if sch.IsArray && sch.HasValidations { return true } if sch.IsStream || sch.IsInterface { // these types have no validation - aliased types on those do not implement the Validatable interface return false } - if sch.Required || sch.IsCustomFormatter && !sch.IsStream { + if sch.Required || hasFormatValidation(sch.resolvedType) { return true } if sch.MaxLength != nil || sch.MinLength != nil || sch.Pattern != "" || sch.MultipleOf != nil || sch.Minimum != nil || sch.Maximum != nil || len(sch.Enum) > 0 || len(sch.ItemsEnum) > 0 { @@ -196,11 +204,11 @@ func shallowValidationLookup(sch GenSchema) bool { if sch.IsTuple && (sch.AdditionalItems != nil && (sch.AdditionalItems.HasValidations || sch.AdditionalItems.Required)) { return true } - if sch.HasAdditionalProperties && (sch.AdditionalProperties.IsInterface || sch.AdditionalProperties.IsStream) { + if sch.HasAdditionalProperties && sch.AdditionalProperties != nil && (sch.AdditionalProperties.IsInterface || sch.AdditionalProperties.IsStream) { return false } - if sch.HasAdditionalProperties && (sch.AdditionalProperties.HasValidations || sch.AdditionalProperties.Required || sch.AdditionalProperties.IsAliased && !(sch.AdditionalProperties.IsInterface || sch.AdditionalProperties.IsStream)) { + if sch.HasAdditionalProperties && sch.AdditionalProperties != nil && (sch.AdditionalProperties.HasValidations || sch.AdditionalProperties.Required || sch.AdditionalProperties.IsAliased && !(sch.AdditionalProperties.IsInterface || sch.AdditionalProperties.IsStream)) { return true } @@ -213,10 +221,13 @@ func shallowValidationLookup(sch GenSchema) bool { return false } +func isExternal(schema spec.Schema) bool { + extType, ok := hasExternalType(schema.Extensions) + return ok && !extType.Embedded +} + func makeGenDefinitionHierarchy(name, pkg, container string, schema spec.Schema, specDoc *loads.Document, opts *GenOpts) (*GenDefinition, error) { // Check if model is imported from external package using x-go-type - _, external := schema.Extensions[xGoType] - receiver := "m" // models are resolved in the current package resolver := newTypeResolver("", specDoc) @@ -241,6 +252,8 @@ func makeGenDefinitionHierarchy(name, pkg, container string, schema spec.Schema, IncludeValidator: opts.IncludeValidator, IncludeModel: opts.IncludeModel, StrictAdditionalProperties: opts.StrictAdditionalProperties, + WithXML: opts.WithXML, + StructTags: opts.StructTags, } if err := pg.makeGenSchema(); err != nil { return nil, fmt.Errorf("could not generate schema for %s: %v", name, err) @@ -282,6 +295,10 @@ func makeGenDefinitionHierarchy(name, pkg, container string, schema spec.Schema, // replace the ref with this new genschema swsp := specDoc.Spec() for i, ss := range schema.AllOf { + if pg.GenSchema.AllOf == nil { + log.Printf("warning: resolved schema for subtype %q.AllOf[%d] is empty. skipped", name, i) + continue + } ref := ss.Ref for ref.String() != "" { var rsch *spec.Schema @@ -290,7 +307,6 @@ func makeGenDefinitionHierarchy(name, pkg, container string, schema spec.Schema, if err != nil { return nil, err } - ref = rsch.Ref if rsch != nil && rsch.Ref.String() != "" { ref = rsch.Ref continue @@ -336,17 +352,17 @@ func makeGenDefinitionHierarchy(name, pkg, container string, schema spec.Schema, } - defaultImports := []string{ - "github.com/go-openapi/errors", - "github.com/go-openapi/runtime", - "github.com/go-openapi/swag", - "github.com/go-openapi/validate", + defaultImports := map[string]string{ + "errors": "github.com/go-openapi/errors", + "runtime": "github.com/go-openapi/runtime", + "swag": "github.com/go-openapi/swag", + "validate": "github.com/go-openapi/validate", } return &GenDefinition{ GenCommon: GenCommon{ Copyright: opts.Copyright, - TargetImportPath: filepath.ToSlash(opts.LanguageOpts.baseImport(opts.Target)), + TargetImportPath: opts.LanguageOpts.baseImport(opts.Target), }, Package: opts.LanguageOpts.ManglePackageName(path.Base(filepath.ToSlash(pkg)), "definitions"), GenSchema: pg.GenSchema, @@ -354,7 +370,7 @@ func makeGenDefinitionHierarchy(name, pkg, container string, schema spec.Schema, DefaultImports: defaultImports, ExtraSchemas: gatherExtraSchemas(pg.ExtraSchemas), Imports: findImports(&pg.GenSchema), - External: external, + External: isExternal(schema), }, nil } @@ -364,6 +380,11 @@ func findImports(sch *GenSchema) map[string]string { if t.Pkg != "" && t.PkgAlias != "" { imp[t.PkgAlias] = t.Pkg } + if t.IsEmbedded && t.ElemType != nil { + if t.ElemType.Pkg != "" && t.ElemType.PkgAlias != "" { + imp[t.ElemType.PkgAlias] = t.ElemType.Pkg + } + } if sch.Items != nil { sub := findImports(sch.Items) for k, v := range sub { @@ -404,6 +425,9 @@ func findImports(sch *GenSchema) map[string]string { } } } + for k, v := range sch.ExtraImports { + imp[k] = v + } return imp } @@ -418,6 +442,7 @@ type schemaGenContext struct { IncludeValidator bool IncludeModel bool StrictAdditionalProperties bool + WithXML bool Index int Path string @@ -431,6 +456,7 @@ type schemaGenContext struct { Container string Schema spec.Schema TypeResolver *typeResolver + StructTags []string GenSchema GenSchema Dependencies []string // NOTE: Dependencies is actually set nowhere @@ -438,6 +464,9 @@ type schemaGenContext struct { Discriminator *discor Discriminated *discee Discrimination *discInfo + + // force to use container in inlined definitions (for deconflicting) + UseContainerInName bool } func (sg *schemaGenContext) NewSliceBranch(schema *spec.Schema) *schemaGenContext { @@ -548,7 +577,7 @@ func (sg *schemaGenContext) shallowClone() *schemaGenContext { if pg.Container == "" { pg.Container = sg.Name } - pg.GenSchema = GenSchema{} + pg.GenSchema = GenSchema{StructTags: sg.StructTags} pg.Dependencies = nil pg.Named = false pg.Index = 0 @@ -621,6 +650,16 @@ func hasValidations(model *spec.Schema, isRequired bool) (hasValidation bool) { return } +func hasFormatValidation(tpe resolvedType) bool { + if tpe.IsCustomFormatter && !tpe.IsStream && !tpe.IsBase64 { + return true + } + if tpe.IsArray && tpe.ElemType != nil { + return hasFormatValidation(*tpe.ElemType) + } + return false +} + // handleFormatConflicts handles all conflicting model properties when a format is set func handleFormatConflicts(model *spec.Schema) { switch model.Format { @@ -690,6 +729,14 @@ func (sg *schemaGenContext) MergeResult(other *schemaGenContext, liftsRequired b if other.GenSchema.IsMapNullOverride { sg.GenSchema.IsMapNullOverride = true } + + // lift extra imports + if other.GenSchema.Pkg != "" && other.GenSchema.PkgAlias != "" { + sg.GenSchema.ExtraImports[other.GenSchema.PkgAlias] = other.GenSchema.Pkg + } + for k, v := range other.GenSchema.ExtraImports { + sg.GenSchema.ExtraImports[k] = v + } } func (sg *schemaGenContext) buildProperties() error { @@ -702,7 +749,7 @@ func (sg *schemaGenContext) buildProperties() error { sg.Name, k, sg.IsTuple, sg.GenSchema.HasValidations) // check if this requires de-anonymizing, if so lift this as a new struct and extra schema - tpe, err := sg.TypeResolver.ResolveSchema(&v, true, sg.IsTuple || containsString(sg.Schema.Required, k)) + tpe, err := sg.TypeResolver.ResolveSchema(&v, true, sg.IsTuple || swag.ContainsStrings(sg.Schema.Required, k)) if sg.Schema.Discriminator == k { tpe.IsNullable = false } @@ -714,7 +761,7 @@ func (sg *schemaGenContext) buildProperties() error { var hasValidation bool if tpe.IsComplexObject && tpe.IsAnonymous && len(v.Properties) > 0 { // this is an anonymous complex construct: build a new new type for it - pg := sg.makeNewStruct(sg.Name+swag.ToGoName(k), v) + pg := sg.makeNewStruct(sg.makeRefName()+swag.ToGoName(k), v) pg.IsTuple = sg.IsTuple if sg.Path != "" { pg.Path = sg.Path + "+ \".\"+" + fmt.Sprintf("%q", k) @@ -754,7 +801,7 @@ func (sg *schemaGenContext) buildProperties() error { } // generates format validation on property - emprop.GenSchema.HasValidations = emprop.GenSchema.HasValidations || (tpe.IsCustomFormatter && !tpe.IsStream) || (tpe.IsArray && tpe.ElemType.IsCustomFormatter && !tpe.ElemType.IsStream) + emprop.GenSchema.HasValidations = emprop.GenSchema.HasValidations || hasFormatValidation(tpe) if emprop.Schema.Ref.String() != "" { // expand the schema of this property, so we take informed decisions about its type @@ -768,7 +815,9 @@ func (sg *schemaGenContext) buildProperties() error { if err != nil { return err } - ref = rsch.Ref + if rsch == nil { + return errors.New("spec.ResolveRef returned nil schema") + } if rsch != nil && rsch.Ref.String() != "" { ref = rsch.Ref continue @@ -804,7 +853,7 @@ func (sg *schemaGenContext) buildProperties() error { hv := hasValidations(sch, false) // include format validation, excluding binary - hv = hv || (ttpe.IsCustomFormatter && !ttpe.IsStream) || (ttpe.IsArray && ttpe.ElemType.IsCustomFormatter && !ttpe.ElemType.IsStream) + hv = hv || hasFormatValidation(ttpe) // a base type property is always validated against the base type // exception: for the base type definition itself (see shallowValidationLookup()) @@ -898,7 +947,7 @@ func (sg *schemaGenContext) buildAllOf() error { // - nested allOf: this one is itself a AllOf: build a new type for it // - anonymous simple types for edge cases: array, primitive, interface{} // NOTE: when branches are aliased or anonymous, the nullable property in the branch type is lost. - name := swag.ToVarName(goName(&sch, sg.Name+"AllOf"+strconv.Itoa(i))) + name := swag.ToVarName(goName(&sch, sg.makeRefName()+"AllOf"+strconv.Itoa(i))) debugLog("building anonymous nested allOf in %s: %s", sg.Name, name) ng := sg.makeNewStruct(name, sch) if err := ng.makeGenSchema(); err != nil { @@ -991,7 +1040,7 @@ func newMapStack(context *schemaGenContext) (first, last *mapStack, err error) { //reached the end of the rabbit hole if tpe.IsComplexObject && tpe.IsAnonymous { // found an anonymous object: create the struct from a newly created definition - nw := l.Context.makeNewStruct(l.Context.Name+" Anon", *l.Type.AdditionalProperties.Schema) + nw := l.Context.makeNewStruct(l.Context.makeRefName()+" Anon", *l.Type.AdditionalProperties.Schema) sch := spec.RefProperty("#/definitions/" + nw.Name) l.NewObj = nw @@ -1216,7 +1265,7 @@ func (sg *schemaGenContext) buildAdditionalProperties() error { if tpe.IsComplexObject && tpe.IsAnonymous { // if the AdditionalProperties is an anonymous complex object, generate a new type for it - pg := sg.makeNewStruct(sg.Name+" Anon", *addp.Schema) + pg := sg.makeNewStruct(sg.makeRefName()+" Anon", *addp.Schema) if err := pg.makeGenSchema(); err != nil { return err } @@ -1311,7 +1360,7 @@ func (sg *schemaGenContext) buildAdditionalProperties() error { } hasMapNullOverride := sg.GenSchema.IsMapNullOverride - sg.GenSchema = GenSchema{} + sg.GenSchema = GenSchema{StructTags: sg.StructTags} sg.Schema = *spec.RefProperty("#/definitions/" + newObj.Name) if err := sg.makeGenSchema(); err != nil { return err @@ -1356,6 +1405,7 @@ func (sg *schemaGenContext) makeNewStruct(name string, schema spec.Schema) *sche IncludeValidator: sg.IncludeValidator, IncludeModel: sg.IncludeModel, StrictAdditionalProperties: sg.StrictAdditionalProperties, + StructTags: sg.StructTags, } if schema.Ref.String() == "" { pg.TypeResolver = sg.TypeResolver.NewWithModelName(name) @@ -1374,7 +1424,7 @@ func (sg *schemaGenContext) buildArray() error { // check if the element is a complex object, if so generate a new type for it if tpe.IsComplexObject && tpe.IsAnonymous { - pg := sg.makeNewStruct(sg.Name+" items"+strconv.Itoa(sg.Index), *sg.Schema.Items.Schema) + pg := sg.makeNewStruct(sg.makeRefName()+" items"+strconv.Itoa(sg.Index), *sg.Schema.Items.Schema) if err := pg.makeGenSchema(); err != nil { return err } @@ -1419,10 +1469,8 @@ func (sg *schemaGenContext) buildArray() error { schemaCopy.Required = false // validations of items - hv := hasValidations(sg.Schema.Items.Schema, false) - - // include format validation, excluding binary - hv = hv || (schemaCopy.IsCustomFormatter && !schemaCopy.IsStream) || (schemaCopy.IsArray && schemaCopy.ElemType.IsCustomFormatter && !schemaCopy.ElemType.IsStream) + // include format validation, excluding binary and base64 format validation + hv := hasValidations(sg.Schema.Items.Schema, false) || hasFormatValidation(schemaCopy.resolvedType) // base types of polymorphic types must be validated // NOTE: IsNullable is not useful to figure out a validation: we use Refed and IsAliased below instead @@ -1478,7 +1526,7 @@ func (sg *schemaGenContext) buildItems() error { } if tpe.IsComplexObject && tpe.IsAnonymous { // if the tuple element is an anonymous complex object, build a new type for it - pg := sg.makeNewStruct(sg.Name+" Items"+strconv.Itoa(i), s) + pg := sg.makeNewStruct(sg.makeRefName()+" Items"+strconv.Itoa(i), s) if err := pg.makeGenSchema(); err != nil { return err } @@ -1546,7 +1594,7 @@ func (sg *schemaGenContext) buildAdditionalItems() error { return err } if tpe.IsComplexObject && tpe.IsAnonymous { - pg := sg.makeNewStruct(sg.Name+" Items", *sg.Schema.AdditionalItems.Schema) + pg := sg.makeNewStruct(sg.makeRefName()+" Items", *sg.Schema.AdditionalItems.Schema) if err := pg.makeGenSchema(); err != nil { return err } @@ -1581,16 +1629,21 @@ func (sg *schemaGenContext) buildAdditionalItems() error { return nil } -func (sg *schemaGenContext) buildXMLName() error { - if sg.Schema.XML == nil { - return nil - } - sg.GenSchema.XMLName = sg.Name +func (sg *schemaGenContext) buildXMLNameWithTags() error { + if sg.WithXML || sg.Schema.XML != nil { + sg.GenSchema.XMLName = sg.Name + + if sg.Schema.XML != nil { + if sg.Schema.XML.Name != "" { + sg.GenSchema.XMLName = sg.Schema.XML.Name + } + if sg.Schema.XML.Attribute { + sg.GenSchema.XMLName += ",attr" + } + } - if sg.Schema.XML.Name != "" { - sg.GenSchema.XMLName = sg.Schema.XML.Name - if sg.Schema.XML.Attribute { - sg.GenSchema.XMLName += ",attr" + if !sg.GenSchema.Required && sg.GenSchema.IsEmptyOmitted { + sg.GenSchema.XMLName += ",omitempty" } } return nil @@ -1646,6 +1699,7 @@ func (sg *schemaGenContext) shortCircuitNamedRef() (bool, error) { tpe.IsNullable = tpx.IsNullable // TODO tpe.IsInterface = tpx.IsInterface tpe.IsStream = tpx.IsStream + tpe.IsEmbedded = tpx.IsEmbedded tpe.SwaggerType = tpx.SwaggerType sch := spec.Schema{} @@ -1764,6 +1818,15 @@ func (sg *schemaGenContext) buildAliased() error { return nil } +func (sg schemaGenContext) makeRefName() string { + // figure out a longer name for deconflicting anonymous models. + // This is used when makeNewStruct() is followed by the creation of a new ref to definitions + if sg.UseContainerInName && sg.Container != sg.Name { + return sg.Container + swag.ToGoName(sg.Name) + } + return sg.Name +} + func (sg *schemaGenContext) GoName() string { return goName(&sg.Schema, sg.Name) } @@ -1852,6 +1915,8 @@ func (sg *schemaGenContext) makeGenSchema() error { sg.GenSchema.IncludeModel = sg.IncludeModel sg.GenSchema.StrictAdditionalProperties = sg.StrictAdditionalProperties sg.GenSchema.Default = sg.Schema.Default + sg.GenSchema.StructTags = sg.StructTags + sg.GenSchema.ExtraImports = make(map[string]string) var err error returns, err := sg.shortCircuitNamedRef() @@ -1893,7 +1958,7 @@ func (sg *schemaGenContext) makeGenSchema() error { sg.GenSchema.HasDiscriminator = tpe.HasDiscriminator // include format validations, excluding binary - sg.GenSchema.HasValidations = sg.GenSchema.HasValidations || (tpe.IsCustomFormatter && !tpe.IsStream) || (tpe.IsArray && tpe.ElemType != nil && tpe.ElemType.IsCustomFormatter && !tpe.ElemType.IsStream) + sg.GenSchema.HasValidations = sg.GenSchema.HasValidations || hasFormatValidation(tpe) // usage of a polymorphic base type is rendered with getter funcs on private properties. // In the case of aliased types, the value expression remains unchanged to the receiver. @@ -1940,7 +2005,7 @@ func (sg *schemaGenContext) makeGenSchema() error { return err } - if err := sg.buildXMLName(); err != nil { + if err := sg.buildXMLNameWithTags(); err != nil { return err } @@ -1958,6 +2023,21 @@ func (sg *schemaGenContext) makeGenSchema() error { sg.buildMapOfNullable(nil) + // extra serializers & interfaces + + // generate MarshalBinary for: + // - tuple + // - struct + // - map + // - aliased primitive of a formatter type which is not a stringer + // + // but not for: + // - interface{} + // - io.Reader + gs := sg.GenSchema + sg.GenSchema.WantsMarshalBinary = !(gs.IsInterface || gs.IsStream || gs.IsBaseType) && + (gs.IsTuple || gs.IsComplexObject || gs.IsAdditionalProperties || (gs.IsPrimitive && gs.IsAliased && gs.IsCustomFormatter && !strings.Contains(gs.Zero(), `("`))) + debugLog("finished gen schema for %q", sg.Name) return nil } diff --git a/vendor/github.com/go-swagger/go-swagger/generator/operation.go b/vendor/github.com/go-swagger/go-swagger/generator/operation.go index 48a3c6ef76..0beef7040b 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/operation.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/operation.go @@ -18,8 +18,6 @@ import ( "encoding/json" "errors" "fmt" - "os" - "path" "path/filepath" "sort" "strings" @@ -55,86 +53,58 @@ func sortedResponses(input map[int]spec.Response) responses { return res } -// GenerateServerOperation generates a parameter model, parameter validator, http handler implementations for a given operation +// GenerateServerOperation generates a parameter model, parameter validator, http handler implementations for a given operation. +// // It also generates an operation handler interface that uses the parameter model for handling a valid request. // Allows for specifying a list of tags to include only certain tags for the generation func GenerateServerOperation(operationNames []string, opts *GenOpts) error { - if opts == nil { - return errors.New("gen opts are required") - } - templates.LoadDefaults() - - templates.SetAllowOverride(opts.AllowTemplateOverride) - - if opts.TemplateDir != "" { - if err := templates.LoadDir(opts.TemplateDir); err != nil { - return err - } - } - if err := opts.CheckOpts(); err != nil { return err } - // Load the spec - _, specDoc, err := loadSpec(opts.Spec) - if err != nil { + if err := opts.setTemplates(); err != nil { return err } - // Validate and Expand. specDoc is in/out param. - specDoc, err = validateAndFlattenSpec(opts, specDoc) + specDoc, analyzed, err := opts.analyzeSpec() if err != nil { return err } - analyzed := analysis.New(specDoc.Spec()) - ops := gatherOperations(analyzed, operationNames) + if len(ops) == 0 { return errors.New("no operations were selected") } for operationName, opRef := range ops { method, path, operation := opRef.Method, opRef.Path, opRef.Op - defaultScheme := opts.DefaultScheme - if defaultScheme == "" { - defaultScheme = sHTTP - } - defaultProduces := opts.DefaultProduces - if defaultProduces == "" { - defaultProduces = runtime.JSONMime - } - defaultConsumes := opts.DefaultConsumes - if defaultConsumes == "" { - defaultConsumes = runtime.JSONMime - } - serverPackage := opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, "server") + serverPackage := opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, defaultServerTarget) generator := operationGenerator{ Name: operationName, Method: method, Path: path, BasePath: specDoc.BasePath(), - APIPackage: opts.LanguageOpts.ManglePackagePath(opts.APIPackage, "api"), - ModelsPackage: opts.LanguageOpts.ManglePackagePath(opts.ModelPackage, "definitions"), - ClientPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, "client"), + APIPackage: opts.LanguageOpts.ManglePackagePath(opts.APIPackage, defaultOperationsTarget), + ModelsPackage: opts.LanguageOpts.ManglePackagePath(opts.ModelPackage, defaultModelsTarget), + ClientPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, defaultClientTarget), ServerPackage: serverPackage, Operation: *operation, SecurityRequirements: analyzed.SecurityRequirementsFor(operation), SecurityDefinitions: analyzed.SecurityDefinitionsFor(operation), - Principal: opts.Principal, + Principal: opts.PrincipalAlias(), Target: filepath.Join(opts.Target, filepath.FromSlash(serverPackage)), Base: opts.Target, Tags: opts.Tags, IncludeHandler: opts.IncludeHandler, IncludeParameters: opts.IncludeParameters, IncludeResponses: opts.IncludeResponses, - IncludeValidator: true, // we no more support the CLI option to disable validation + IncludeValidator: opts.IncludeValidator, DumpData: opts.DumpData, - DefaultScheme: defaultScheme, - DefaultProduces: defaultProduces, - DefaultConsumes: defaultConsumes, + DefaultScheme: opts.DefaultScheme, + DefaultProduces: opts.DefaultProduces, + DefaultConsumes: opts.DefaultConsumes, Doc: specDoc, Analyzed: analyzed, GenOpts: opts, @@ -177,78 +147,55 @@ type operationGenerator struct { GenOpts *GenOpts } -func intersectTags(left, right []string) (filtered []string) { - if len(right) == 0 { - filtered = left - return - } - for _, l := range left { - if containsString(right, l) { - filtered = append(filtered, l) - } - } - return -} - +// Generate a single operation func (o *operationGenerator) Generate() error { - // Build a list of codegen operations based on the tags, - // the tag decides the actual package for an operation - // the user specified package serves as root for generating the directory structure - var operations GenOperations - authed := len(o.SecurityRequirements) > 0 - - var bldr codeGenOpBuilder - bldr.Name = o.Name - bldr.Method = o.Method - bldr.Path = o.Path - bldr.BasePath = o.BasePath - bldr.ModelsPackage = o.ModelsPackage - bldr.Principal = o.Principal - bldr.Target = o.Target - bldr.Operation = o.Operation - bldr.Authed = authed - bldr.Security = o.SecurityRequirements - bldr.SecurityDefinitions = o.SecurityDefinitions - bldr.Doc = o.Doc - bldr.Analyzed = o.Analyzed - bldr.DefaultScheme = o.DefaultScheme - bldr.DefaultProduces = o.DefaultProduces - bldr.RootAPIPackage = o.GenOpts.LanguageOpts.ManglePackageName(o.ServerPackage, "server") - bldr.GenOpts = o.GenOpts - bldr.DefaultConsumes = o.DefaultConsumes - bldr.IncludeValidator = o.IncludeValidator - - bldr.DefaultImports = []string{o.GenOpts.ExistingModels} - if o.GenOpts.ExistingModels == "" { - bldr.DefaultImports = []string{ - path.Join( - filepath.ToSlash(o.GenOpts.LanguageOpts.baseImport(o.Base)), - o.GenOpts.LanguageOpts.ManglePackagePath(o.ModelsPackage, "")), - } - } - bldr.APIPackage = o.APIPackage - st := o.Tags - if o.GenOpts != nil { - st = o.GenOpts.Tags - } - intersected := intersectTags(o.Operation.Tags, st) - if len(intersected) > 0 { - tag := intersected[0] - bldr.APIPackage = o.GenOpts.LanguageOpts.ManglePackagePath(tag, o.APIPackage) + defaultImports := o.GenOpts.defaultImports() + + apiPackage := o.GenOpts.LanguageOpts.ManglePackagePath(o.GenOpts.APIPackage, defaultOperationsTarget) + imports := o.GenOpts.initImports( + filepath.Join(o.GenOpts.LanguageOpts.ManglePackagePath(o.GenOpts.ServerPackage, defaultServerTarget), apiPackage)) + + bldr := codeGenOpBuilder{ + ModelsPackage: o.ModelsPackage, + Principal: o.GenOpts.PrincipalAlias(), + Target: o.Target, + DefaultImports: defaultImports, + Imports: imports, + DefaultScheme: o.DefaultScheme, + Doc: o.Doc, + Analyzed: o.Analyzed, + BasePath: o.BasePath, + GenOpts: o.GenOpts, + Name: o.Name, + Operation: o.Operation, + Method: o.Method, + Path: o.Path, + IncludeValidator: o.IncludeValidator, + APIPackage: o.APIPackage, // defaults to main operations package + DefaultProduces: o.DefaultProduces, + DefaultConsumes: o.DefaultConsumes, + Authed: len(o.Analyzed.SecurityRequirementsFor(&o.Operation)) > 0, + Security: o.Analyzed.SecurityRequirementsFor(&o.Operation), + SecurityDefinitions: o.Analyzed.SecurityDefinitionsFor(&o.Operation), + RootAPIPackage: o.GenOpts.LanguageOpts.ManglePackageName(o.ServerPackage, defaultServerTarget), } + + _, tags, _ := bldr.analyzeTags() + op, err := bldr.MakeOperation() if err != nil { return err } - op.Tags = intersected + + op.Tags = tags + operations := make(GenOperations, 0, 1) operations = append(operations, op) sort.Sort(operations) for _, op := range operations { if o.GenOpts.DumpData { - bb, _ := json.MarshalIndent(swag.ToDynamicJSON(op), "", " ") - fmt.Fprintln(os.Stdout, string(bb)) + _ = dumpData(swag.ToDynamicJSON(op)) continue } if err := o.GenOpts.renderOperation(&op); err != nil { @@ -268,14 +215,16 @@ type codeGenOpBuilder struct { Path string BasePath string APIPackage string + APIPackageAlias string RootAPIPackage string ModelsPackage string Principal string Target string Operation spec.Operation Doc *loads.Document + PristineDoc *loads.Document Analyzed *analysis.Spec - DefaultImports []string + DefaultImports map[string]string Imports map[string]string DefaultScheme string DefaultProduces string @@ -286,16 +235,57 @@ type codeGenOpBuilder struct { GenOpts *GenOpts } +// paramMappings yields a map of safe parameter names for an operation +func paramMappings(params map[string]spec.Parameter) (map[string]map[string]string, string) { + idMapping := map[string]map[string]string{ + "query": make(map[string]string, len(params)), + "path": make(map[string]string, len(params)), + "formData": make(map[string]string, len(params)), + "header": make(map[string]string, len(params)), + "body": make(map[string]string, len(params)), + } + + // In order to avoid unstable generation, adopt same naming convention + // for all parameters with same name across locations. + seenIds := make(map[string]interface{}, len(params)) + for id, p := range params { + if val, ok := seenIds[p.Name]; ok { + previous := val.(struct{ id, in string }) + idMapping[p.In][p.Name] = swag.ToGoName(id) + // rewrite the previously found one + idMapping[previous.in][p.Name] = swag.ToGoName(previous.id) + } else { + idMapping[p.In][p.Name] = swag.ToGoName(p.Name) + } + seenIds[strings.ToLower(idMapping[p.In][p.Name])] = struct{ id, in string }{id: id, in: p.In} + } + + // pick a deconflicted private name for timeout for this operation + timeoutName := renameTimeout(seenIds, "timeout") + + return idMapping, timeoutName +} + // renameTimeout renames the variable in use by client template to avoid conflicting // with param names. -func renameTimeout(seenIds map[string][]string, current string) string { +// +// NOTE: this merely protects the timeout field in the client parameter struct, +// fields "Context" and "HTTPClient" remain exposed to name conflicts. +func renameTimeout(seenIds map[string]interface{}, timeoutName string) string { + if seenIds == nil { + return timeoutName + } + current := strings.ToLower(timeoutName) + if _, ok := seenIds[current]; !ok { + return timeoutName + } var next string - switch strings.ToLower(current) { + switch current { case "timeout": next = "requestTimeout" case "requesttimeout": next = "httpRequestTimeout" - case "httptrequesttimeout": + case "httprequesttimeout": next = "swaggerTimeout" case "swaggertimeout": next = "operationTimeout" @@ -303,11 +293,10 @@ func renameTimeout(seenIds map[string][]string, current string) string { next = "opTimeout" case "optimeout": next = "operTimeout" + default: + next = timeoutName + "1" } - if _, ok := seenIds[next]; ok { - return renameTimeout(seenIds, next) - } - return next + return renameTimeout(seenIds, next) } func (b *codeGenOpBuilder) MakeOperation() (GenOperation, error) { @@ -323,35 +312,15 @@ func (b *codeGenOpBuilder) MakeOperation() (GenOperation, error) { // // In all cases, resetting definitions to the _original_ (untransformed) spec is not an option: // we take from there the spec possibly already transformed by the GenDefinitions stage. - resolver := newTypeResolver(b.GenOpts.LanguageOpts.ManglePackageName(b.ModelsPackage, "models"), b.Doc) + resolver := newTypeResolver(b.GenOpts.LanguageOpts.ManglePackageName(b.ModelsPackage, defaultModelsTarget), b.Doc) receiver := "o" operation := b.Operation var params, qp, pp, hp, fp GenParameters var hasQueryParams, hasPathParams, hasHeaderParams, hasFormParams, hasFileParams, hasFormValueParams, hasBodyParams bool paramsForOperation := b.Analyzed.ParamsFor(b.Method, b.Path) - timeoutName := "timeout" - idMapping := map[string]map[string]string{ - "query": make(map[string]string, len(paramsForOperation)), - "path": make(map[string]string, len(paramsForOperation)), - "formData": make(map[string]string, len(paramsForOperation)), - "header": make(map[string]string, len(paramsForOperation)), - "body": make(map[string]string, len(paramsForOperation)), - } - - seenIds := make(map[string][]string, len(paramsForOperation)) - for id, p := range paramsForOperation { - if _, ok := seenIds[p.Name]; ok { - idMapping[p.In][p.Name] = swag.ToGoName(id) - } else { - idMapping[p.In][p.Name] = swag.ToGoName(p.Name) - } - seenIds[p.Name] = append(seenIds[p.Name], p.In) - if strings.EqualFold(p.Name, timeoutName) { - timeoutName = renameTimeout(seenIds, timeoutName) - } - } + idMapping, timeoutName := paramMappings(paramsForOperation) for _, p := range paramsForOperation { cp, err := b.MakeParameter(receiver, resolver, p, idMapping) @@ -489,15 +458,17 @@ func (b *codeGenOpBuilder) MakeOperation() (GenOperation, error) { return GenOperation{ GenCommon: GenCommon{ Copyright: b.GenOpts.Copyright, - TargetImportPath: filepath.ToSlash(b.GenOpts.LanguageOpts.baseImport(b.GenOpts.Target)), + TargetImportPath: b.GenOpts.LanguageOpts.baseImport(b.GenOpts.Target), }, - Package: b.GenOpts.LanguageOpts.ManglePackageName(b.APIPackage, "api"), + Package: b.GenOpts.LanguageOpts.ManglePackageName(b.APIPackage, defaultOperationsTarget), + PackageAlias: b.APIPackageAlias, RootPackage: b.RootAPIPackage, Name: b.Name, Method: b.Method, Path: b.Path, BasePath: b.BasePath, Tags: operation.Tags, + UseTags: len(operation.Tags) > 0 && !b.GenOpts.SkipTagPackages, Description: trimBOM(operation.Description), ReceiverName: receiver, DefaultImports: b.DefaultImports, @@ -531,6 +502,7 @@ func (b *codeGenOpBuilder) MakeOperation() (GenOperation, error) { ExtraSchemes: extraSchemes, TimeoutName: timeoutName, Extensions: operation.Extensions, + StrictResponders: b.GenOpts.StrictResponders, }, nil } @@ -573,18 +545,20 @@ func (b *codeGenOpBuilder) MakeResponse(receiver, name string, isSuccess bool, r // assume minimal flattening has been carried on, so there is not $ref in response (but some may remain in response schema) res := GenResponse{ - Package: b.GenOpts.LanguageOpts.ManglePackageName(b.APIPackage, "api"), - ModelsPackage: b.ModelsPackage, - ReceiverName: receiver, - Name: name, - Description: trimBOM(resp.Description), - DefaultImports: b.DefaultImports, - Imports: b.Imports, - IsSuccess: isSuccess, - Code: code, - Method: b.Method, - Path: b.Path, - Extensions: resp.Extensions, + Package: b.GenOpts.LanguageOpts.ManglePackageName(b.APIPackage, defaultOperationsTarget), + ModelsPackage: b.ModelsPackage, + ReceiverName: receiver, + Name: name, + Description: trimBOM(resp.Description), + DefaultImports: b.DefaultImports, + Imports: b.Imports, + IsSuccess: isSuccess, + Code: code, + Method: b.Method, + Path: b.Path, + Extensions: resp.Extensions, + StrictResponders: b.GenOpts.StrictResponders, + OperationName: b.Name, } // prepare response headers @@ -615,7 +589,7 @@ func (b *codeGenOpBuilder) MakeHeader(receiver, name string, hdr spec.Header) (G res := GenHeader{ sharedValidations: sharedValidationsFromSimple(hdr.CommonValidations, true), // NOTE: Required is not defined by the Swagger schema for header. Set arbitrarily to true for convenience in templates. resolvedType: tpe, - Package: b.GenOpts.LanguageOpts.ManglePackageName(b.APIPackage, "api"), + Package: b.GenOpts.LanguageOpts.ManglePackageName(b.APIPackage, defaultOperationsTarget), ReceiverName: receiver, ID: id, Name: name, @@ -662,6 +636,7 @@ func (b *codeGenOpBuilder) MakeHeaderItem(receiver, paramName, indexVar, path, v res.Formatter = stringFormatters[res.GoType] res.IndexVar = indexVar res.HasValidations, res.HasSliceValidations = b.HasValidations(items.CommonValidations, res.resolvedType) + res.IsEnumCI = b.GenOpts.AllowEnumCI || hasEnumCI(items.Extensions) if items.Items != nil { // Recursively follows nested arrays @@ -684,7 +659,7 @@ func (b *codeGenOpBuilder) HasValidations(sh spec.CommonValidations, rt resolved hasNumberValidation := sh.Maximum != nil || sh.Minimum != nil || sh.MultipleOf != nil hasStringValidation := sh.MaxLength != nil || sh.MinLength != nil || sh.Pattern != "" hasSliceValidations = sh.MaxItems != nil || sh.MinItems != nil || sh.UniqueItems || len(sh.Enum) > 0 - hasValidations = (hasNumberValidation || hasStringValidation || hasSliceValidations || rt.IsCustomFormatter) && !rt.IsStream && !rt.IsInterface + hasValidations = hasNumberValidation || hasStringValidation || hasSliceValidations || hasFormatValidation(rt) return } @@ -703,6 +678,8 @@ func (b *codeGenOpBuilder) MakeParameterItem(receiver, paramName, indexVar, path res.IndexVar = indexVar res.HasValidations, res.HasSliceValidations = b.HasValidations(items.CommonValidations, res.resolvedType) + res.IsEnumCI = b.GenOpts.AllowEnumCI || hasEnumCI(items.Extensions) + res.NeedsIndex = res.HasValidations || res.Converter != "" || (res.IsCustomFormatter && !res.SkipParse) if items.Items != nil { // Recursively follows nested arrays @@ -715,6 +692,7 @@ func (b *codeGenOpBuilder) MakeParameterItem(receiver, paramName, indexVar, path pi.Parent = &res // Propagates HasValidations flag to outer Items definition res.HasValidations = res.HasValidations || pi.HasValidations + res.NeedsIndex = res.NeedsIndex || pi.NeedsIndex } return res, nil @@ -727,7 +705,13 @@ func (b *codeGenOpBuilder) MakeParameter(receiver string, resolver *typeResolver var child *GenItems id := swag.ToGoName(param.Name) - if len(idMapping) > 0 { + if goName, ok := param.Extensions["x-go-name"]; ok { + id, ok = goName.(string) + if !ok { + return GenParameter{}, fmt.Errorf(`%s %s, parameter %q: "x-go-name" field must be a string, not a %T`, + b.Method, b.Path, param.Name, goName) + } + } else if len(idMapping) > 0 { id = idMapping[param.In][param.Name] } @@ -776,6 +760,7 @@ func (b *codeGenOpBuilder) MakeParameter(receiver string, resolver *typeResolver res.IsNullable = !param.Required && !param.AllowEmptyValue res.HasValidations, res.HasSliceValidations = b.HasValidations(param.CommonValidations, res.resolvedType) res.HasValidations = res.HasValidations || hasChildValidations + res.IsEnumCI = b.GenOpts.AllowEnumCI || hasEnumCI(param.Extensions) } // Select codegen strategy for body param validation @@ -875,9 +860,10 @@ func (b *codeGenOpBuilder) MakeBodyParameterItemsAndMaps(res *GenParameter, it * next.IsAliased = true break } - if next.IsInterface || next.IsStream { + if next.IsInterface || next.IsStream || next.IsBase64 { next.HasValidations = false } + next.NeedsIndex = next.HasValidations || next.Converter != "" || (next.IsCustomFormatter && !next.SkipParse) prev = next next = new(GenItems) @@ -891,15 +877,17 @@ func (b *codeGenOpBuilder) MakeBodyParameterItemsAndMaps(res *GenParameter, it * } } // propagate HasValidations - var propag func(child *GenItems) bool - propag = func(child *GenItems) bool { + var propag func(child *GenItems) (bool, bool) + propag = func(child *GenItems) (bool, bool) { if child == nil { - return false + return false, false } - child.HasValidations = child.HasValidations || propag(child.Child) - return child.HasValidations + cValidations, cIndex := propag(child.Child) + child.HasValidations = child.HasValidations || cValidations + child.NeedsIndex = child.HasValidations || child.Converter != "" || (child.IsCustomFormatter && !child.SkipParse) || cIndex + return child.HasValidations, child.NeedsIndex } - items.HasValidations = propag(items) + items.HasValidations, items.NeedsIndex = propag(items) // resolve nullability conflicts when declaring body as a map of array of an anonymous complex object // (e.g. refer to an extra schema type, which is nullable, but not rendered as a pointer in arrays or maps) @@ -938,7 +926,7 @@ func (b *codeGenOpBuilder) setBodyParamValidation(p *GenParameter) { var hasSimpleBodyParams, hasSimpleBodyItems, hasSimpleBodyMap, hasModelBodyParams, hasModelBodyItems, hasModelBodyMap bool s := p.Schema if s != nil { - doNot := s.IsInterface || s.IsStream + doNot := s.IsInterface || s.IsStream || s.IsBase64 // composition of primitive fields must be properly identified: hack this through _, isPrimitive := primitives[s.GoType] _, isFormatter := customFormatters[s.GoType] @@ -949,7 +937,7 @@ func (b *codeGenOpBuilder) setBodyParamValidation(p *GenParameter) { if s.IsArray && s.Items != nil { it := s.Items - doNot = it.IsInterface || it.IsStream + doNot = it.IsInterface || it.IsStream || it.IsBase64 hasSimpleBodyItems = !it.IsComplexObject && !(it.IsAliased || doNot) hasModelBodyItems = (it.IsComplexObject || it.IsAliased) && !doNot } @@ -1015,7 +1003,10 @@ func (b *codeGenOpBuilder) cloneSchema(schema *spec.Schema) *spec.Schema { // This uses a deep clone the spec document to construct a type resolver which knows about definitions when the making of this operation started, // and only these definitions. We are not interested in the "original spec", but in the already transformed spec. func (b *codeGenOpBuilder) saveResolveContext(resolver *typeResolver, schema *spec.Schema) (*typeResolver, *spec.Schema) { - rslv := newTypeResolver(b.GenOpts.LanguageOpts.ManglePackageName(resolver.ModelsPackage, "models"), b.Doc.Pristine()) + if b.PristineDoc == nil { + b.PristineDoc = b.Doc.Pristine() + } + rslv := newTypeResolver(b.GenOpts.LanguageOpts.ManglePackageName(resolver.ModelsPackage, defaultModelsTarget), b.PristineDoc) return rslv, b.cloneSchema(schema) } @@ -1027,19 +1018,23 @@ func (b *codeGenOpBuilder) saveResolveContext(resolver *typeResolver, schema *sp // these ExtraSchemas in the operation's package. // We need to rebuild the schema with a new type resolver to reflect this change in the // models package. -func (b *codeGenOpBuilder) liftExtraSchemas(resolver, br *typeResolver, bs *spec.Schema, sc *schemaGenContext) (schema *GenSchema, err error) { +func (b *codeGenOpBuilder) liftExtraSchemas(resolver, rslv *typeResolver, bs *spec.Schema, sc *schemaGenContext) (schema *GenSchema, err error) { // restore resolving state before previous call to makeGenSchema() - rslv := br sc.Schema = *bs pg := sc.shallowClone() - pkg := b.GenOpts.LanguageOpts.ManglePackageName(resolver.ModelsPackage, "models") + pkg := b.GenOpts.LanguageOpts.ManglePackageName(resolver.ModelsPackage, defaultModelsTarget) + + // make a resolver for current package (i.e. operations) pg.TypeResolver = newTypeResolver("", rslv.Doc).withKeepDefinitionsPackage(pkg) pg.ExtraSchemas = make(map[string]GenSchema, len(sc.ExtraSchemas)) + pg.UseContainerInName = true + // rebuild schema within local package if err = pg.makeGenSchema(); err != nil { return } + // lift nested extra schemas (inlined types) if b.ExtraSchemas == nil { b.ExtraSchemas = make(map[string]GenSchema, len(pg.ExtraSchemas)) @@ -1079,17 +1074,20 @@ func (b *codeGenOpBuilder) buildOperationSchema(schemaPath, containerName, schem TypeResolver: rslv, Named: false, IncludeModel: true, - IncludeValidator: true, + IncludeValidator: b.GenOpts.IncludeValidator, StrictAdditionalProperties: b.GenOpts.StrictAdditionalProperties, ExtraSchemas: make(map[string]GenSchema), + StructTags: b.GenOpts.StructTags, } var ( br *typeResolver bs *spec.Schema ) - // these backups are not needed when sch has name. + if sch.Ref.String() == "" { + // backup the type resolver context + // (not needed when the schema has a name) br, bs = b.saveResolveContext(rslv, sch) } @@ -1148,3 +1146,119 @@ func (b *codeGenOpBuilder) buildOperationSchema(schemaPath, containerName, schem } return schema, nil } + +func intersectTags(left, right []string) []string { + // dedupe + uniqueTags := make(map[string]struct{}, maxInt(len(left), len(right))) + for _, l := range left { + if len(right) == 0 || swag.ContainsStrings(right, l) { + uniqueTags[l] = struct{}{} + } + } + filtered := make([]string, 0, len(uniqueTags)) + // stable output across generations, preserving original order + for _, k := range left { + if _, ok := uniqueTags[k]; !ok { + continue + } + filtered = append(filtered, k) + delete(uniqueTags, k) + } + return filtered +} + +// analyze tags for an operation +func (b *codeGenOpBuilder) analyzeTags() (string, []string, bool) { + var ( + filter []string + tag string + hasTagOverride bool + ) + if b.GenOpts != nil { + filter = b.GenOpts.Tags + } + intersected := intersectTags(pruneEmpty(b.Operation.Tags), filter) + if !b.GenOpts.SkipTagPackages && len(intersected) > 0 { + // override generation with: x-go-operation-tag + tag, hasTagOverride = b.Operation.Extensions.GetString(xGoOperationTag) + if !hasTagOverride { + // TODO(fred): this part should be delegated to some new TagsFor(operation) in go-openapi/analysis + tag = intersected[0] + gtags := b.Doc.Spec().Tags + for _, gtag := range gtags { + if gtag.Name != tag { + continue + } + // honor x-go-name in tag + if name, hasGoName := gtag.Extensions.GetString(xGoName); hasGoName { + tag = name + break + } + // honor x-go-operation-tag in tag + if name, hasOpName := gtag.Extensions.GetString(xGoOperationTag); hasOpName { + tag = name + break + } + } + } + } + if tag == b.APIPackage { + // confict with "operations" package is handled separately + tag = renameOperationPackage(intersected, tag) + } + b.APIPackage = b.GenOpts.LanguageOpts.ManglePackageName(tag, b.APIPackage) // actual package name + b.APIPackageAlias = deconflictTag(intersected, b.APIPackage) // deconflicted import alias + return tag, intersected, len(filter) == 0 || len(filter) > 0 && len(intersected) > 0 +} + +func maxInt(a, b int) int { + if a > b { + return a + } + return b +} + +// deconflictTag ensures generated packages for operations based on tags do not conflict +// with other imports +func deconflictTag(seenTags []string, pkg string) string { + return deconflictPkg(pkg, func(pkg string) string { return renameOperationPackage(seenTags, pkg) }) +} + +// deconflictPrincipal ensures that whenever an external principal package is added, it doesn't conflict +// with standard inports +func deconflictPrincipal(pkg string) string { + switch pkg { + case "principal": + return renamePrincipalPackage(pkg) + default: + return deconflictPkg(pkg, renamePrincipalPackage) + } +} + +// deconflictPkg renames package names which conflict with standard imports +func deconflictPkg(pkg string, renamer func(string) string) string { + switch pkg { + case "api", "httptransport", "formats": + fallthrough + case "errors", "runtime", "middleware", "security", "spec", "strfmt", "loads", "swag", "validate": + fallthrough + case "tls", "http", "fmt", "strings", "log": + return renamer(pkg) + } + return pkg +} + +func renameOperationPackage(seenTags []string, pkg string) string { + current := strings.ToLower(pkg) + "ops" + if len(seenTags) == 0 { + return current + } + for swag.ContainsStringsCI(seenTags, current) { + current += "1" + } + return current +} + +func renamePrincipalPackage(pkg string) string { + return "auth" +} diff --git a/vendor/github.com/go-swagger/go-swagger/generator/shared.go b/vendor/github.com/go-swagger/go-swagger/generator/shared.go index fcbc45d13d..9321bf00f6 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/shared.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/shared.go @@ -16,6 +16,7 @@ package generator import ( "bytes" + "encoding/json" "errors" "fmt" "io/ioutil" @@ -24,360 +25,36 @@ import ( "path" "path/filepath" "reflect" - "regexp" "sort" "strings" "text/template" - "unicode" - - swaggererrors "github.com/go-openapi/errors" "github.com/go-openapi/analysis" "github.com/go-openapi/loads" + "github.com/go-openapi/runtime" "github.com/go-openapi/spec" - "github.com/go-openapi/strfmt" "github.com/go-openapi/swag" - "github.com/go-openapi/validate" - "golang.org/x/tools/imports" ) //go:generate go-bindata -mode 420 -modtime 1482416923 -pkg=generator -ignore=.*\.sw? -ignore=.*\.md ./templates/... -// LanguageOpts to describe a language to the code generator -type LanguageOpts struct { - ReservedWords []string - BaseImportFunc func(string) string `json:"-"` - reservedWordsSet map[string]struct{} - initialized bool - formatFunc func(string, []byte) ([]byte, error) - fileNameFunc func(string) string -} - -// Init the language option -func (l *LanguageOpts) Init() { - if !l.initialized { - l.initialized = true - l.reservedWordsSet = make(map[string]struct{}) - for _, rw := range l.ReservedWords { - l.reservedWordsSet[rw] = struct{}{} - } - } -} - -// MangleName makes sure a reserved word gets a safe name -func (l *LanguageOpts) MangleName(name, suffix string) string { - if _, ok := l.reservedWordsSet[swag.ToFileName(name)]; !ok { - return name - } - return strings.Join([]string{name, suffix}, "_") -} - -// MangleVarName makes sure a reserved word gets a safe name -func (l *LanguageOpts) MangleVarName(name string) string { - nm := swag.ToVarName(name) - if _, ok := l.reservedWordsSet[nm]; !ok { - return nm - } - return nm + "Var" -} - -// MangleFileName makes sure a file name gets a safe name -func (l *LanguageOpts) MangleFileName(name string) string { - if l.fileNameFunc != nil { - return l.fileNameFunc(name) - } - return swag.ToFileName(name) -} - -// ManglePackageName makes sure a package gets a safe name. -// In case of a file system path (e.g. name contains "/" or "\" on Windows), this return only the last element. -func (l *LanguageOpts) ManglePackageName(name, suffix string) string { - if name == "" { - return suffix - } - pth := filepath.ToSlash(filepath.Clean(name)) // preserve path - _, pkg := path.Split(pth) // drop path - return l.MangleName(swag.ToFileName(pkg), suffix) -} - -// ManglePackagePath makes sure a full package path gets a safe name. -// Only the last part of the path is altered. -func (l *LanguageOpts) ManglePackagePath(name string, suffix string) string { - if name == "" { - return suffix - } - target := filepath.ToSlash(filepath.Clean(name)) // preserve path - parts := strings.Split(target, "/") - parts[len(parts)-1] = l.ManglePackageName(parts[len(parts)-1], suffix) - return strings.Join(parts, "/") -} - -// FormatContent formats a file with a language specific formatter -func (l *LanguageOpts) FormatContent(name string, content []byte) ([]byte, error) { - if l.formatFunc != nil { - return l.formatFunc(name, content) - } - return content, nil -} - -func (l *LanguageOpts) baseImport(tgt string) string { - if l.BaseImportFunc != nil { - return l.BaseImportFunc(tgt) - } - return "" -} - -var golang = GoLangOpts() - -// GoLangOpts for rendering items as golang code -func GoLangOpts() *LanguageOpts { - var goOtherReservedSuffixes = map[string]bool{ - // see: - // https://golang.org/src/go/build/syslist.go - // https://golang.org/doc/install/source#environment - - // goos - "android": true, - "darwin": true, - "dragonfly": true, - "freebsd": true, - "js": true, - "linux": true, - "nacl": true, - "netbsd": true, - "openbsd": true, - "plan9": true, - "solaris": true, - "windows": true, - "zos": true, - - // arch - "386": true, - "amd64": true, - "amd64p32": true, - "arm": true, - "armbe": true, - "arm64": true, - "arm64be": true, - "mips": true, - "mipsle": true, - "mips64": true, - "mips64le": true, - "mips64p32": true, - "mips64p32le": true, - "ppc": true, - "ppc64": true, - "ppc64le": true, - "riscv": true, - "riscv64": true, - "s390": true, - "s390x": true, - "sparc": true, - "sparc64": true, - "wasm": true, - - // other reserved suffixes - "test": true, - } - - opts := new(LanguageOpts) - opts.ReservedWords = []string{ - "break", "default", "func", "interface", "select", - "case", "defer", "go", "map", "struct", - "chan", "else", "goto", "package", "switch", - "const", "fallthrough", "if", "range", "type", - "continue", "for", "import", "return", "var", - } - opts.formatFunc = func(ffn string, content []byte) ([]byte, error) { - opts := new(imports.Options) - opts.TabIndent = true - opts.TabWidth = 2 - opts.Fragment = true - opts.Comments = true - return imports.Process(ffn, content, opts) - } - opts.fileNameFunc = func(name string) string { - // whenever a generated file name ends with a suffix - // that is meaningful to go build, adds a "swagger" - // suffix - parts := strings.Split(swag.ToFileName(name), "_") - if goOtherReservedSuffixes[parts[len(parts)-1]] { - // file name ending with a reserved arch or os name - // are appended an innocuous suffix "swagger" - parts = append(parts, "swagger") - } - return strings.Join(parts, "_") - } - - opts.BaseImportFunc = func(tgt string) string { - tgt = filepath.Clean(tgt) - // On Windows, filepath.Abs("") behaves differently than on Unix. - // Windows: yields an error, since Abs() does not know the volume. - // UNIX: returns current working directory - if tgt == "" { - tgt = "." - } - tgtAbsPath, err := filepath.Abs(tgt) - if err != nil { - log.Fatalf("could not evaluate base import path with target \"%s\": %v", tgt, err) - } - - var tgtAbsPathExtended string - tgtAbsPathExtended, err = filepath.EvalSymlinks(tgtAbsPath) - if err != nil { - log.Fatalf("could not evaluate base import path with target \"%s\" (with symlink resolution): %v", tgtAbsPath, err) - } - - gopath := os.Getenv("GOPATH") - if gopath == "" { - gopath = filepath.Join(os.Getenv("HOME"), "go") - } - - var pth string - for _, gp := range filepath.SplitList(gopath) { - // EvalSymLinks also calls the Clean - gopathExtended, er := filepath.EvalSymlinks(gp) - if er != nil { - log.Fatalln(er) - } - gopathExtended = filepath.Join(gopathExtended, "src") - gp = filepath.Join(gp, "src") - - // At this stage we have expanded and unexpanded target path. GOPATH is fully expanded. - // Expanded means symlink free. - // We compare both types of targetpath<s> with gopath. - // If any one of them coincides with gopath , it is imperative that - // target path lies inside gopath. How? - // - Case 1: Irrespective of symlinks paths coincide. Both non-expanded paths. - // - Case 2: Symlink in target path points to location inside GOPATH. (Expanded Target Path) - // - Case 3: Symlink in target path points to directory outside GOPATH (Unexpanded target path) - - // Case 1: - Do nothing case. If non-expanded paths match just generate base import path as if - // there are no symlinks. - - // Case 2: - Symlink in target path points to location inside GOPATH. (Expanded Target Path) - // First if will fail. Second if will succeed. - - // Case 3: - Symlink in target path points to directory outside GOPATH (Unexpanded target path) - // First if will succeed and break. - - //compares non expanded path for both - if ok, relativepath := checkPrefixAndFetchRelativePath(tgtAbsPath, gp); ok { - pth = relativepath - break - } - - // Compares non-expanded target path - if ok, relativepath := checkPrefixAndFetchRelativePath(tgtAbsPath, gopathExtended); ok { - pth = relativepath - break - } - - // Compares expanded target path. - if ok, relativepath := checkPrefixAndFetchRelativePath(tgtAbsPathExtended, gopathExtended); ok { - pth = relativepath - break - } - - } - - mod, goModuleAbsPath, err := tryResolveModule(tgtAbsPath) - switch { - case err != nil: - log.Fatalf("Failed to resolve module using go.mod file: %s", err) - case mod != "": - relTgt := relPathToRelGoPath(goModuleAbsPath, tgtAbsPath) - if !strings.HasSuffix(mod, relTgt) { - return mod + relTgt - } - return mod - } - - if pth == "" { - log.Fatalln("target must reside inside a location in the $GOPATH/src or be a module") - } - return pth - } - opts.Init() - return opts -} - -var moduleRe = regexp.MustCompile(`module[ \t]+([^\s]+)`) - -// resolveGoModFile walks up the directory tree starting from 'dir' until it -// finds a go.mod file. If go.mod is found it will return the related file -// object. If no go.mod file is found it will return an error. -func resolveGoModFile(dir string) (*os.File, string, error) { - goModPath := filepath.Join(dir, "go.mod") - f, err := os.Open(goModPath) - if err != nil { - if os.IsNotExist(err) && dir != filepath.Dir(dir) { - return resolveGoModFile(filepath.Dir(dir)) - } - return nil, "", err - } - return f, dir, nil -} - -// relPathToRelGoPath takes a relative os path and returns the relative go -// package path. For unix nothing will change but for windows \ will be -// converted to /. -func relPathToRelGoPath(modAbsPath, absPath string) string { - if absPath == "." { - return "" - } - - path := strings.TrimPrefix(absPath, modAbsPath) - pathItems := strings.Split(path, string(filepath.Separator)) - return strings.Join(pathItems, "/") -} - -func tryResolveModule(baseTargetPath string) (string, string, error) { - f, goModAbsPath, err := resolveGoModFile(baseTargetPath) - switch { - case os.IsNotExist(err): - return "", "", nil - case err != nil: - return "", "", err - } - - src, err := ioutil.ReadAll(f) - if err != nil { - return "", "", err - } - - match := moduleRe.FindSubmatch(src) - if len(match) != 2 { - return "", "", nil - } - - return string(match[1]), goModAbsPath, nil -} +const ( + // default generation targets structure + defaultModelsTarget = "models" + defaultServerTarget = "restapi" + defaultClientTarget = "client" + defaultOperationsTarget = "operations" + defaultClientName = "rest" + defaultServerName = "swagger" + defaultScheme = "http" +) -func findSwaggerSpec(nm string) (string, error) { - specs := []string{"swagger.json", "swagger.yml", "swagger.yaml"} - if nm != "" { - specs = []string{nm} - } - var name string - for _, nn := range specs { - f, err := os.Stat(nn) - if err != nil && !os.IsNotExist(err) { - return "", err - } - if err != nil && os.IsNotExist(err) { - continue - } - if f.IsDir() { - return "", fmt.Errorf("%s is a directory", nn) - } - name = nn - break - } - if name == "" { - return "", errors.New("couldn't find a swagger spec") - } - return name, nil +func init() { + // all initializations for the generator package + debugOptions() + initLanguage() + initTemplateRepo() + initTypes() } // DefaultSectionOpts for a given opts, this is used when no config file is passed @@ -411,14 +88,13 @@ func DefaultSectionOpts(gen *GenOpts) { FileName: "{{ (snakize (pascalize .Name)) }}_responses.go", }, } - } else { ops := []TemplateOpts{} if gen.IncludeParameters { ops = append(ops, TemplateOpts{ Name: "parameters", Source: "asset:serverParameter", - Target: "{{ if gt (len .Tags) 0 }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .APIPackage) (toPackagePath .Package) }}{{ else }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .Package) }}{{ end }}", + Target: "{{ if .UseTags }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .APIPackage) (toPackagePath .Package) }}{{ else }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .Package) }}{{ end }}", FileName: "{{ (snakize (pascalize .Name)) }}_parameters.go", }) } @@ -426,7 +102,7 @@ func DefaultSectionOpts(gen *GenOpts) { ops = append(ops, TemplateOpts{ Name: "urlbuilder", Source: "asset:serverUrlbuilder", - Target: "{{ if gt (len .Tags) 0 }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .APIPackage) (toPackagePath .Package) }}{{ else }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .Package) }}{{ end }}", + Target: "{{ if .UseTags }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .APIPackage) (toPackagePath .Package) }}{{ else }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .Package) }}{{ end }}", FileName: "{{ (snakize (pascalize .Name)) }}_urlbuilder.go", }) } @@ -434,7 +110,7 @@ func DefaultSectionOpts(gen *GenOpts) { ops = append(ops, TemplateOpts{ Name: "responses", Source: "asset:serverResponses", - Target: "{{ if gt (len .Tags) 0 }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .APIPackage) (toPackagePath .Package) }}{{ else }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .Package) }}{{ end }}", + Target: "{{ if .UseTags }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .APIPackage) (toPackagePath .Package) }}{{ else }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .Package) }}{{ end }}", FileName: "{{ (snakize (pascalize .Name)) }}_responses.go", }) } @@ -442,7 +118,7 @@ func DefaultSectionOpts(gen *GenOpts) { ops = append(ops, TemplateOpts{ Name: "handler", Source: "asset:serverOperation", - Target: "{{ if gt (len .Tags) 0 }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .APIPackage) (toPackagePath .Package) }}{{ else }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .Package) }}{{ end }}", + Target: "{{ if .UseTags }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .APIPackage) (toPackagePath .Package) }}{{ else }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .Package) }}{{ end }}", FileName: "{{ (snakize (pascalize .Name)) }}.go", }) } @@ -487,7 +163,7 @@ func DefaultSectionOpts(gen *GenOpts) { { Name: "main", Source: "asset:serverMain", - Target: "{{ joinFilePath .Target \"cmd\" (dasherize (pascalize .Name)) }}-server", + Target: "{{ joinFilePath .Target \"cmd\" .MainPackage }}", FileName: "main.go", }, { @@ -521,7 +197,7 @@ func DefaultSectionOpts(gen *GenOpts) { } -// TemplateOpts allows +// TemplateOpts allows for codegen customization type TemplateOpts struct { Name string `mapstructure:"name"` Source string `mapstructure:"source"` @@ -573,37 +249,58 @@ type GenOpts struct { DefaultScheme string DefaultProduces string DefaultConsumes string + WithXML bool TemplateDir string Template string RegenerateConfigureAPI bool Operations []string Models []string Tags []string + StructTags []string Name string FlagStrategy string CompatibilityMode string ExistingModels string Copyright string + SkipTagPackages bool + MainPackage string + IgnoreOperations bool + AllowEnumCI bool + StrictResponders bool + AcceptDefinitionsOnly bool } // CheckOpts carries out some global consistency checks on options. -// -// At the moment, these checks simply protect TargetPath() and SpecPath() -// functions. More checks may be added here. func (g *GenOpts) CheckOpts() error { + if g == nil { + return errors.New("gen opts are required") + } + if !filepath.IsAbs(g.Target) { if _, err := filepath.Abs(g.Target); err != nil { return fmt.Errorf("could not locate target %s: %v", g.Target, err) } } + if filepath.IsAbs(g.ServerPackage) { return fmt.Errorf("you shouldn't specify an absolute path in --server-package: %s", g.ServerPackage) } - if !filepath.IsAbs(g.Spec) && !strings.HasPrefix(g.Spec, "http://") && !strings.HasPrefix(g.Spec, "https://") { - if _, err := filepath.Abs(g.Spec); err != nil { - return fmt.Errorf("could not locate spec: %s", g.Spec) - } + + if strings.HasPrefix(g.Spec, "http://") || strings.HasPrefix(g.Spec, "https://") { + return nil + } + + pth, err := findSwaggerSpec(g.Spec) + if err != nil { + return err } + + // ensure spec path is absolute + g.Spec, err = filepath.Abs(pth) + if err != nil { + return fmt.Errorf("could not locate spec: %s", g.Spec) + } + return nil } @@ -670,17 +367,42 @@ func (g *GenOpts) EnsureDefaults() error { if g.defaultsEnsured { return nil } - DefaultSectionOpts(g) + if g.LanguageOpts == nil { - g.LanguageOpts = GoLangOpts() + g.LanguageOpts = DefaultLanguageFunc() } + + DefaultSectionOpts(g) + // set defaults for flattening options - g.FlattenOpts = &analysis.FlattenOpts{ - Minimal: true, - Verbose: true, - RemoveUnused: false, - Expand: false, + if g.FlattenOpts == nil { + g.FlattenOpts = &analysis.FlattenOpts{ + Minimal: true, + Verbose: true, + RemoveUnused: false, + Expand: false, + } + } + + if g.DefaultScheme == "" { + g.DefaultScheme = defaultScheme } + + if g.DefaultConsumes == "" { + g.DefaultConsumes = runtime.JSONMime + } + + if g.DefaultProduces == "" { + g.DefaultProduces = runtime.JSONMime + } + + // always include validator with models + g.IncludeValidator = true + + if g.Principal == "" { + g.Principal = iface + } + g.defaultsEnsured = true return nil } @@ -707,19 +429,29 @@ func (g *GenOpts) location(t *TemplateOpts, data interface{}) (string, string, e tags = tagsF.Interface().([]string) } - pthTpl, err := template.New(t.Name + "-target").Funcs(FuncMap).Parse(t.Target) + var useTags bool + useTagsF := v.FieldByName("UseTags") + if useTagsF.IsValid() { + useTags = useTagsF.Interface().(bool) + } + + funcMap := FuncMapFunc(g.LanguageOpts) + + pthTpl, err := template.New(t.Name + "-target").Funcs(funcMap).Parse(t.Target) if err != nil { return "", "", err } - fNameTpl, err := template.New(t.Name + "-filename").Funcs(FuncMap).Parse(t.FileName) + fNameTpl, err := template.New(t.Name + "-filename").Funcs(funcMap).Parse(t.FileName) if err != nil { return "", "", err } d := struct { - Name, Package, APIPackage, ServerPackage, ClientPackage, ModelPackage, Target string - Tags []string + Name, Package, APIPackage, ServerPackage, ClientPackage, ModelPackage, MainPackage, Target string + Tags []string + UseTags bool + Context interface{} }{ Name: name, Package: pkg, @@ -727,11 +459,13 @@ func (g *GenOpts) location(t *TemplateOpts, data interface{}) (string, string, e ServerPackage: g.ServerPackage, ClientPackage: g.ClientPackage, ModelPackage: g.ModelPackage, + MainPackage: g.MainPackage, Target: g.Target, Tags: tags, + UseTags: useTags, + Context: data, } - // pretty.Println(data) var pthBuf bytes.Buffer if e := pthTpl.Execute(&pthBuf, d); e != nil { return "", "", e @@ -777,7 +511,7 @@ func (g *GenOpts) render(t *TemplateOpts, data interface{}) ([]byte, error) { if err != nil { return nil, fmt.Errorf("error while opening %s template file: %v", templateFile, err) } - tt, err := template.New(t.Source).Funcs(FuncMap).Parse(string(content)) + tt, err := template.New(t.Source).Funcs(FuncMapFunc(g.LanguageOpts)).Parse(string(content)) if err != nil { return nil, fmt.Errorf("template parsing failed on template %s: %v", t.Name, err) } @@ -836,10 +570,10 @@ func (g *GenOpts) write(t *TemplateOpts, data interface{}) error { var writeerr error if !t.SkipFormat { - formatted, err = g.LanguageOpts.FormatContent(fname, content) + formatted, err = g.LanguageOpts.FormatContent(filepath.Join(dir, fname), content) if err != nil { log.Printf("source formatting failed on template-generated source (%q for %s). Check that your template produces valid code", filepath.Join(dir, fname), t.Name) - writeerr = ioutil.WriteFile(filepath.Join(dir, fname), content, 0644) + writeerr = ioutil.WriteFile(filepath.Join(dir, fname), content, 0644) // #nosec if writeerr != nil { return fmt.Errorf("failed to write (unformatted) file %q in %q: %v", fname, dir, writeerr) } @@ -848,7 +582,7 @@ func (g *GenOpts) write(t *TemplateOpts, data interface{}) error { } } - writeerr = ioutil.WriteFile(filepath.Join(dir, fname), formatted, 0644) + writeerr = ioutil.WriteFile(filepath.Join(dir, fname), formatted, 0644) // #nosec if writeerr != nil { return fmt.Errorf("failed to write file %q in %q: %v", fname, dir, writeerr) } @@ -930,42 +664,84 @@ func (g *GenOpts) renderDefinition(gg *GenDefinition) error { return nil } -func validateSpec(path string, doc *loads.Document) (err error) { - if doc == nil { - if path, doc, err = loadSpec(path); err != nil { +func (g *GenOpts) setTemplates() error { + templates.LoadDefaults() + + if g.Template != "" { + // set contrib templates + if err := templates.LoadContrib(g.Template); err != nil { return err } } - result := validate.Spec(doc, strfmt.Default) - if result == nil { - return nil - } + templates.SetAllowOverride(g.AllowTemplateOverride) - str := fmt.Sprintf("The swagger spec at %q is invalid against swagger specification %s. see errors :\n", path, doc.Version()) - for _, desc := range result.(*swaggererrors.CompositeError).Errors { - str += fmt.Sprintf("- %s\n", desc) + if g.TemplateDir != "" { + // set custom templates + if err := templates.LoadDir(g.TemplateDir); err != nil { + return err + } } - return errors.New(str) + return nil } -func loadSpec(specFile string) (string, *loads.Document, error) { - // find swagger spec document, verify it exists - specPath := specFile - var err error - if !strings.HasPrefix(specPath, "http") { - specPath, err = findSwaggerSpec(specFile) - if err != nil { - return "", nil, err +// defaultImports produces a default map for imports with models +func (g *GenOpts) defaultImports() map[string]string { + baseImport := g.LanguageOpts.baseImport(g.Target) + defaultImports := make(map[string]string, 50) + + if g.ExistingModels == "" { + // generated models + importPath := path.Join( + baseImport, + g.LanguageOpts.ManglePackagePath(g.ModelPackage, defaultModelsTarget)) + defaultImports[g.LanguageOpts.ManglePackageName(g.ModelPackage, defaultModelsTarget)] = importPath + } else { + // external models + importPath := g.LanguageOpts.ManglePackagePath(g.ExistingModels, "") + defaultImports["models"] = importPath + } + + alias, _, target := g.resolvePrincipal() + if alias != "" { + if pth, _ := path.Split(target); pth != "" { + // if principal is specified with an path, generate this import + defaultImports[alias] = target + } else { + // if principal is specified with a relative path, assume it is located in generated target + defaultImports[alias] = path.Join(baseImport, target) } } + return defaultImports +} - // load swagger spec - specDoc, err := loads.Spec(specPath) - if err != nil { - return "", nil, err +// initImports produces a default map for import with the specified root for operations +func (g *GenOpts) initImports(operationsPackage string) map[string]string { + baseImport := g.LanguageOpts.baseImport(g.Target) + + imports := make(map[string]string, 50) + imports[g.LanguageOpts.ManglePackageName(operationsPackage, defaultOperationsTarget)] = path.Join( + baseImport, + g.LanguageOpts.ManglePackagePath(operationsPackage, defaultOperationsTarget)) + return imports +} + +// PrincipalAlias returns an aliased type to the principal +func (g *GenOpts) PrincipalAlias() string { + _, principal, _ := g.resolvePrincipal() + return principal +} + +func (g *GenOpts) resolvePrincipal() (string, string, string) { + dotLocation := strings.LastIndex(g.Principal, ".") + if dotLocation < 0 { + return "", g.Principal, "" } - return specPath, specDoc, nil + + // handle possible conflicts with injected principal package + // NOTE(fred): we do not check here for conflicts with packages created from operation tags, only standard imports + alias := deconflictPrincipal(importAlias(g.Principal[:dotLocation])) + return alias, alias + g.Principal[dotLocation:], g.Principal[:dotLocation] } func fileExists(target, name string) bool { @@ -974,6 +750,7 @@ func fileExists(target, name string) bool { } func gatherModels(specDoc *loads.Document, modelNames []string) (map[string]spec.Schema, error) { + modelNames = pruneEmpty(modelNames) models, mnc := make(map[string]spec.Schema), len(modelNames) defs := specDoc.Spec().Definitions @@ -1002,7 +779,8 @@ func gatherModels(specDoc *loads.Document, modelNames []string) (map[string]spec return models, nil } -func appNameOrDefault(specDoc *loads.Document, name, defaultName string) string { +// titleOrDefault infers a name for the app from the title of the spec +func titleOrDefault(specDoc *loads.Document, name, defaultName string) string { if strings.TrimSpace(name) == "" { if specDoc.Spec().Info != nil && strings.TrimSpace(specDoc.Spec().Info.Title) != "" { name = specDoc.Spec().Info.Title @@ -1010,16 +788,21 @@ func appNameOrDefault(specDoc *loads.Document, name, defaultName string) string name = defaultName } } - return strings.TrimSuffix(strings.TrimSuffix(strings.TrimSuffix(swag.ToGoName(name), "Test"), "API"), "Test") + return swag.ToGoName(name) } -func containsString(names []string, name string) bool { - for _, nm := range names { - if nm == name { - return true - } +func mainNameOrDefault(specDoc *loads.Document, name, defaultName string) string { + // *_test won't do as main server name + return strings.TrimSuffix(titleOrDefault(specDoc, name, defaultName), "Test") +} + +func appNameOrDefault(specDoc *loads.Document, name, defaultName string) string { + // *_test won't do as app names + name = strings.TrimSuffix(titleOrDefault(specDoc, name, defaultName), "Test") + if name == "" { + name = swag.ToGoName(defaultName) } - return false + return name } type opRef struct { @@ -1037,14 +820,14 @@ func (o opRefs) Swap(i, j int) { o[i], o[j] = o[j], o[i] } func (o opRefs) Less(i, j int) bool { return o[i].Key < o[j].Key } func gatherOperations(specDoc *analysis.Spec, operationIDs []string) map[string]opRef { + operationIDs = pruneEmpty(operationIDs) var oprefs opRefs for method, pathItem := range specDoc.Operations() { for path, operation := range pathItem { - // nm := ensureUniqueName(operation.ID, method, path, operations) vv := *operation oprefs = append(oprefs, opRef{ - Key: swag.ToGoName(strings.ToLower(method) + " " + path), + Key: swag.ToGoName(strings.ToLower(method) + " " + strings.Title(path)), Method: method, Path: path, ID: vv.ID, @@ -1066,7 +849,7 @@ func gatherOperations(specDoc *analysis.Spec, operationIDs []string) map[string] if found && oo.Method != opr.Method && oo.Path != opr.Path { nm = opr.Key } - if len(operationIDs) == 0 || containsString(operationIDs, opr.ID) || containsString(operationIDs, nm) { + if len(operationIDs) == 0 || swag.ContainsStrings(operationIDs, opr.ID) || swag.ContainsStrings(operationIDs, nm) { opr.ID = nm opr.Op.ID = nm operations[nm] = opr @@ -1076,43 +859,6 @@ func gatherOperations(specDoc *analysis.Spec, operationIDs []string) map[string] return operations } -func pascalize(arg string) string { - runes := []rune(arg) - switch len(runes) { - case 0: - return "" - case 1: // handle special case when we have a single rune that is not handled by swag.ToGoName - switch runes[0] { - case '+', '-', '#', '_': // those cases are handled differently than swag utility - return prefixForName(arg) - } - } - return swag.ToGoName(swag.ToGoName(arg)) // want to remove spaces -} - -func prefixForName(arg string) string { - first := []rune(arg)[0] - if len(arg) == 0 || unicode.IsLetter(first) { - return "" - } - switch first { - case '+': - return "Plus" - case '-': - return "Minus" - case '#': - return "HashTag" - // other cases ($,@ etc..) handled by swag.ToGoName - } - return "Nr" -} - -func init() { - // this makes the ToGoName func behave with the special - // prefixing rule above - swag.GoNamePrefixFunc = prefixForName -} - func pruneEmpty(in []string) (out []string) { for _, v := range in { if v != "" { @@ -1126,73 +872,6 @@ func trimBOM(in string) string { return strings.Trim(in, "\xef\xbb\xbf") } -func validateAndFlattenSpec(opts *GenOpts, specDoc *loads.Document) (*loads.Document, error) { - - var err error - - // Validate if needed - if opts.ValidateSpec { - log.Printf("validating spec %v", opts.Spec) - if erv := validateSpec(opts.Spec, specDoc); erv != nil { - return specDoc, erv - } - } - - // Restore spec to original - opts.Spec, specDoc, err = loadSpec(opts.Spec) - if err != nil { - return nil, err - } - - absBasePath := specDoc.SpecFilePath() - if !filepath.IsAbs(absBasePath) { - cwd, _ := os.Getwd() - absBasePath = filepath.Join(cwd, absBasePath) - } - - // Some preprocessing is required before codegen - // - // This ensures at least that $ref's in the spec document are canonical, - // i.e all $ref are local to this file and point to some uniquely named definition. - // - // Default option is to ensure minimal flattening of $ref, bundling remote $refs and relocating arbitrary JSON - // pointers as definitions. - // This preprocessing may introduce duplicate names (e.g. remote $ref with same name). In this case, a definition - // suffixed with "OAIGen" is produced. - // - // Full flattening option farther transforms the spec by moving every complex object (e.g. with some properties) - // as a standalone definition. - // - // Eventually, an "expand spec" option is available. It is essentially useful for testing purposes. - // - // NOTE(fredbi): spec expansion may produce some unsupported constructs and is not yet protected against the - // following cases: - // - polymorphic types generation may fail with expansion (expand destructs the reuse intent of the $ref in allOf) - // - name duplicates may occur and result in compilation failures - // The right place to fix these shortcomings is go-openapi/analysis. - - opts.FlattenOpts.BasePath = absBasePath // BasePath must be absolute - opts.FlattenOpts.Spec = analysis.New(specDoc.Spec()) - - var preprocessingOption string - switch { - case opts.FlattenOpts.Expand: - preprocessingOption = "expand" - case opts.FlattenOpts.Minimal: - preprocessingOption = "minimal flattening" - default: - preprocessingOption = "full flattening" - } - log.Printf("preprocessing spec with option: %s", preprocessingOption) - - if err = analysis.Flatten(*opts.FlattenOpts); err != nil { - return nil, err - } - - // yields the preprocessed spec document - return specDoc, nil -} - // gatherSecuritySchemes produces a sorted representation from a map of spec security schemes func gatherSecuritySchemes(securitySchemes map[string]spec.SecurityScheme, appName, principal, receiver string) (security GenSecuritySchemes) { for scheme, req := range securitySchemes { @@ -1285,3 +964,17 @@ func sharedValidationsFromSchema(v spec.Schema, isRequired bool) (sh sharedValid } return } + +func dumpData(data interface{}) error { + bb, err := json.MarshalIndent(data, "", " ") + if err != nil { + return err + } + fmt.Fprintln(os.Stdout, string(bb)) + return nil +} + +func importAlias(pkg string) string { + _, k := path.Split(pkg) + return k +} diff --git a/vendor/github.com/go-swagger/go-swagger/generator/spec.go b/vendor/github.com/go-swagger/go-swagger/generator/spec.go new file mode 100644 index 0000000000..68e08ce445 --- /dev/null +++ b/vendor/github.com/go-swagger/go-swagger/generator/spec.go @@ -0,0 +1,248 @@ +package generator + +import ( + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "log" + "os" + "path/filepath" + + "github.com/go-openapi/analysis" + swaggererrors "github.com/go-openapi/errors" + "github.com/go-openapi/loads" + "github.com/go-openapi/spec" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" + "github.com/go-openapi/validate" + "gopkg.in/yaml.v2" +) + +func (g *GenOpts) validateAndFlattenSpec() (*loads.Document, error) { + // Load spec document + specDoc, err := loads.Spec(g.Spec) + if err != nil { + return nil, err + } + + // If accepts definitions only, add dummy swagger header to pass validation + if g.AcceptDefinitionsOnly { + specDoc, err = applyDefaultSwagger(specDoc) + if err != nil { + return nil, err + } + } + + // Validate if needed + if g.ValidateSpec { + log.Printf("validating spec %v", g.Spec) + validationErrors := validate.Spec(specDoc, strfmt.Default) + if validationErrors != nil { + str := fmt.Sprintf("The swagger spec at %q is invalid against swagger specification %s. see errors :\n", + g.Spec, specDoc.Version()) + for _, desc := range validationErrors.(*swaggererrors.CompositeError).Errors { + str += fmt.Sprintf("- %s\n", desc) + } + return nil, errors.New(str) + } + // TODO(fredbi): due to uncontrolled $ref state in spec, we need to reload the spec atm, or flatten won't + // work properly (validate expansion alters the $ref cache in go-openapi/spec) + specDoc, _ = loads.Spec(g.Spec) + } + + // Flatten spec + // + // Some preprocessing is required before codegen + // + // This ensures at least that $ref's in the spec document are canonical, + // i.e all $ref are local to this file and point to some uniquely named definition. + // + // Default option is to ensure minimal flattening of $ref, bundling remote $refs and relocating arbitrary JSON + // pointers as definitions. + // This preprocessing may introduce duplicate names (e.g. remote $ref with same name). In this case, a definition + // suffixed with "OAIGen" is produced. + // + // Full flattening option farther transforms the spec by moving every complex object (e.g. with some properties) + // as a standalone definition. + // + // Eventually, an "expand spec" option is available. It is essentially useful for testing purposes. + // + // NOTE(fredbi): spec expansion may produce some unsupported constructs and is not yet protected against the + // following cases: + // - polymorphic types generation may fail with expansion (expand destructs the reuse intent of the $ref in allOf) + // - name duplicates may occur and result in compilation failures + // + // The right place to fix these shortcomings is go-openapi/analysis. + + g.FlattenOpts.BasePath = specDoc.SpecFilePath() + g.FlattenOpts.Spec = analysis.New(specDoc.Spec()) + + g.printFlattenOpts() + + if err = analysis.Flatten(*g.FlattenOpts); err != nil { + return nil, err + } + + // yields the preprocessed spec document + return specDoc, nil +} + +func (g *GenOpts) analyzeSpec() (*loads.Document, *analysis.Spec, error) { + // spec preprocessing option + if g.PropertiesSpecOrder { + g.Spec = WithAutoXOrder(g.Spec) + } + + // load, validate and flatten + specDoc, err := g.validateAndFlattenSpec() + if err != nil { + return nil, nil, err + } + + // analyze the spec + analyzed := analysis.New(specDoc.Spec()) + + return specDoc, analyzed, nil +} + +func (g *GenOpts) printFlattenOpts() { + var preprocessingOption string + switch { + case g.FlattenOpts.Expand: + preprocessingOption = "expand" + case g.FlattenOpts.Minimal: + preprocessingOption = "minimal flattening" + default: + preprocessingOption = "full flattening" + } + log.Printf("preprocessing spec with option: %s", preprocessingOption) +} + +//findSwaggerSpec fetches a default swagger spec if none is provided +func findSwaggerSpec(nm string) (string, error) { + specs := []string{"swagger.json", "swagger.yml", "swagger.yaml"} + if nm != "" { + specs = []string{nm} + } + var name string + for _, nn := range specs { + f, err := os.Stat(nn) + if err != nil { + if os.IsNotExist(err) { + continue + } + return "", err + } + if f.IsDir() { + return "", fmt.Errorf("%s is a directory", nn) + } + name = nn + break + } + if name == "" { + return "", errors.New("couldn't find a swagger spec") + } + return name, nil +} + +// WithAutoXOrder amends the spec to specify property order as they appear +// in the spec (supports yaml documents only). +func WithAutoXOrder(specPath string) string { + lookFor := func(ele interface{}, key string) (yaml.MapSlice, bool) { + if slice, ok := ele.(yaml.MapSlice); ok { + for _, v := range slice { + if v.Key == key { + if slice, ok := v.Value.(yaml.MapSlice); ok { + return slice, ok + } + } + } + } + return nil, false + } + + var addXOrder func(interface{}) + addXOrder = func(element interface{}) { + if props, ok := lookFor(element, "properties"); ok { + for i, prop := range props { + if pSlice, ok := prop.Value.(yaml.MapSlice); ok { + isObject := false + xOrderIndex := -1 //Find if x-order already exists + + for i, v := range pSlice { + if v.Key == "type" && v.Value == object { + isObject = true + } + if v.Key == xOrder { + xOrderIndex = i + break + } + } + + if xOrderIndex > -1 { //Override existing x-order + pSlice[xOrderIndex] = yaml.MapItem{Key: xOrder, Value: i} + } else { // append new x-order + pSlice = append(pSlice, yaml.MapItem{Key: xOrder, Value: i}) + } + prop.Value = pSlice + props[i] = prop + + if isObject { + addXOrder(pSlice) + } + } + } + } + } + + yamlDoc, err := swag.YAMLData(specPath) + if err != nil { + panic(err) + } + + if defs, ok := lookFor(yamlDoc, "definitions"); ok { + for _, def := range defs { + addXOrder(def.Value) + } + } + + addXOrder(yamlDoc) + + out, err := yaml.Marshal(yamlDoc) + if err != nil { + panic(err) + } + + tmpFile, err := ioutil.TempFile("", filepath.Base(specPath)) + if err != nil { + panic(err) + } + if err := ioutil.WriteFile(tmpFile.Name(), out, 0); err != nil { + panic(err) + } + return tmpFile.Name() +} + +func applyDefaultSwagger(doc *loads.Document) (*loads.Document, error) { + // bake a minimal swagger spec to pass validation + swspec := doc.Spec() + if swspec.Swagger == "" { + swspec.Swagger = "2.0" + } + if swspec.Info == nil { + info := new(spec.Info) + info.Version = "0.0.0" + info.Title = "minimal" + swspec.Info = info + } + if swspec.Paths == nil { + swspec.Paths = &spec.Paths{} + } + // rewrite the document with the new addition + jazon, err := json.Marshal(swspec) + if err != nil { + return nil, err + } + return loads.Analyzed(jazon, swspec.Swagger) +} diff --git a/vendor/github.com/go-swagger/go-swagger/generator/structs.go b/vendor/github.com/go-swagger/go-swagger/generator/structs.go index 145953a95d..16ae892f04 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/structs.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/structs.go @@ -28,7 +28,7 @@ type GenDefinition struct { GenSchema Package string Imports map[string]string - DefaultImports []string + DefaultImports map[string]string ExtraSchemas GenSchemaList DependsOn []string External bool @@ -91,6 +91,9 @@ type GenSchema struct { IncludeValidator bool IncludeModel bool Default interface{} + WantsMarshalBinary bool // do we generate MarshalBinary interface? + StructTags []string + ExtraImports map[string]string // non-standard imports detected when using external types } func (g GenSchemaList) Len() int { return len(g) } @@ -167,9 +170,12 @@ type GenResponse struct { AllowsForStreaming bool Imports map[string]string - DefaultImports []string + DefaultImports map[string]string Extensions map[string]interface{} + + StrictResponders bool + OperationName string } // GenHeader represents a header on a response for code generation @@ -355,6 +361,8 @@ type GenItems struct { // instructs generator to skip the splitting and parsing from CollectionFormat SkipParse bool + // instructs generator that some nested structure needs an higher level loop index + NeedsIndex bool } // ItemsDepth returns a string "items.items..." with as many items as the level of nesting of the array. @@ -378,9 +386,10 @@ type GenOperationGroup struct { Summary string Description string Imports map[string]string - DefaultImports []string + DefaultImports map[string]string RootPackage string GenOpts *GenOpts + PackageAlias string } // GenOperationGroups is a sorted collection of operation groups @@ -398,13 +407,20 @@ func (g GenStatusCodeResponses) Swap(i, j int) { g[i], g[j] = g[j], g[i] } func (g GenStatusCodeResponses) Less(i, j int) bool { return g[i].Code < g[j].Code } // MarshalJSON marshals these responses to json +// +// This is used by DumpData. func (g GenStatusCodeResponses) MarshalJSON() ([]byte, error) { if g == nil { return nil, nil } + responses := make(GenStatusCodeResponses, len(g)) + copy(responses, g) + // order marshalled output + sort.Sort(responses) + var buf bytes.Buffer buf.WriteRune('{') - for i, v := range g { + for i, v := range responses { rb, err := json.Marshal(v) if err != nil { return nil, err @@ -446,11 +462,13 @@ type GenOperation struct { Path string BasePath string Tags []string + UseTags bool RootPackage string Imports map[string]string - DefaultImports []string + DefaultImports map[string]string ExtraSchemas GenSchemaList + PackageAlias string Authorized bool Security []GenSecurityRequirements @@ -483,6 +501,8 @@ type GenOperation struct { TimeoutName string Extensions map[string]interface{} + + StrictResponders bool } // GenOperations represents a list of operations to generate @@ -509,7 +529,7 @@ type GenApp struct { Info *spec.Info ExternalDocs *spec.ExternalDocumentation Imports map[string]string - DefaultImports []string + DefaultImports map[string]string Schemes []string ExtraSchemes []string Consumes GenSerGroups @@ -521,7 +541,7 @@ type GenApp struct { SwaggerJSON string // Embedded specs: this is important for when the generated server adds routes. // NOTE: there is a distinct advantage to having this in runtime rather than generated code. - // We are noti ever going to generate the router. + // We are not ever going to generate the router. // If embedding spec is an issue (e.g. memory usage), this can be excluded with the --exclude-spec // generation option. Alternative methods to serve spec (e.g. from disk, ...) may be implemented by // adding a middleware to the generated API. @@ -563,16 +583,14 @@ type GenSerGroups []GenSerGroup func (g GenSerGroups) Len() int { return len(g) } func (g GenSerGroups) Swap(i, j int) { g[i], g[j] = g[j], g[i] } -func (g GenSerGroups) Less(i, j int) bool { return g[i].MediaType < g[j].MediaType } +func (g GenSerGroups) Less(i, j int) bool { return g[i].Name < g[j].Name } -// GenSerGroup represents a group of serializers, most likely this is a media type to a list of -// prioritized serializers. +// GenSerGroup represents a group of serializers: this links a serializer to a list of +// prioritized media types (mime). type GenSerGroup struct { - ReceiverName string - AppName string - Name string - MediaType string - Implementation string + GenSerializer + + // All media types for this serializer. The redundant representation allows for easier use in templates AllSerializers GenSerializers } @@ -585,11 +603,12 @@ func (g GenSerializers) Less(i, j int) bool { return g[i].MediaType < g[j].Media // GenSerializer represents a single serializer for a particular media type type GenSerializer struct { + AppName string // Application name ReceiverName string - AppName string - Name string - MediaType string - Implementation string + Name string // Name of the Producer/Consumer (e.g. json, yaml, txt, bin) + MediaType string // mime + Implementation string // func implementing the Producer/Consumer + Parameters []string // parameters supported by this serializer } // GenSecurityScheme represents a security scheme for code generation diff --git a/vendor/github.com/go-swagger/go-swagger/generator/support.go b/vendor/github.com/go-swagger/go-swagger/generator/support.go index 9e41175bae..a1184ff8e8 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/support.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/support.go @@ -1,4 +1,5 @@ // Copyright 2015 go-swagger maintainers + // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -19,21 +20,13 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" "log" - "os" "path" "path/filepath" - "regexp" - goruntime "runtime" "sort" - "strings" - - yaml "gopkg.in/yaml.v2" "github.com/go-openapi/analysis" "github.com/go-openapi/loads" - "github.com/go-openapi/runtime" "github.com/go-openapi/spec" "github.com/go-openapi/swag" ) @@ -57,85 +50,37 @@ func GenerateSupport(name string, modelNames, operationIDs []string, opts *GenOp } func newAppGenerator(name string, modelNames, operationIDs []string, opts *GenOpts) (*appGenerator, error) { - if opts == nil { - return nil, errors.New("gen opts are required") - } if err := opts.CheckOpts(); err != nil { return nil, err } - templates.LoadDefaults() - if opts.Template != "" { - if err := templates.LoadContrib(opts.Template); err != nil { - return nil, err - } - } - - templates.SetAllowOverride(opts.AllowTemplateOverride) - - if opts.TemplateDir != "" { - if err := templates.LoadDir(opts.TemplateDir); err != nil { - return nil, err - } - } - - // Load the spec - var err error - var specDoc *loads.Document - - opts.Spec, err = findSwaggerSpec(opts.Spec) - if err != nil { + if err := opts.setTemplates(); err != nil { return nil, err } - if !filepath.IsAbs(opts.Spec) { - cwd, _ := os.Getwd() - opts.Spec = filepath.Join(cwd, opts.Spec) - } - - if opts.PropertiesSpecOrder { - opts.Spec = WithAutoXOrder(opts.Spec) - } - - opts.Spec, specDoc, err = loadSpec(opts.Spec) + specDoc, analyzed, err := opts.analyzeSpec() if err != nil { return nil, err } - specDoc, err = validateAndFlattenSpec(opts, specDoc) - if err != nil { - return nil, err - } - - analyzed := analysis.New(specDoc.Spec()) - models, err := gatherModels(specDoc, modelNames) if err != nil { return nil, err } operations := gatherOperations(analyzed, operationIDs) - if len(operations) == 0 { - return nil, errors.New("no operations were selected") - } - defaultScheme := opts.DefaultScheme - if defaultScheme == "" { - defaultScheme = "http" - } - - defaultProduces := opts.DefaultProduces - if defaultProduces == "" { - defaultProduces = runtime.JSONMime + if len(operations) == 0 && !opts.IgnoreOperations { + return nil, errors.New("no operations were selected") } - defaultConsumes := opts.DefaultConsumes - if defaultConsumes == "" { - defaultConsumes = runtime.JSONMime + opts.Name = appNameOrDefault(specDoc, name, defaultServerName) + if opts.IncludeMain && opts.MainPackage == "" { + // default target for the generated main + opts.MainPackage = swag.ToCommandName(mainNameOrDefault(specDoc, name, defaultServerName) + "-server") } - opts.Name = appNameOrDefault(specDoc, name, "swagger") - apiPackage := opts.LanguageOpts.ManglePackagePath(opts.APIPackage, "api") + apiPackage := opts.LanguageOpts.ManglePackagePath(opts.APIPackage, defaultOperationsTarget) return &appGenerator{ Name: opts.Name, Receiver: "o", @@ -145,16 +90,16 @@ func newAppGenerator(name string, modelNames, operationIDs []string, opts *GenOp Operations: operations, Target: opts.Target, DumpData: opts.DumpData, - Package: opts.LanguageOpts.ManglePackageName(apiPackage, "api"), + Package: opts.LanguageOpts.ManglePackageName(apiPackage, defaultOperationsTarget), APIPackage: apiPackage, - ModelsPackage: opts.LanguageOpts.ManglePackagePath(opts.ModelPackage, "definitions"), - ServerPackage: opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, "server"), - ClientPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, "client"), - OperationsPackage: filepath.Join(opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, "server"), apiPackage), - Principal: opts.Principal, - DefaultScheme: defaultScheme, - DefaultProduces: defaultProduces, - DefaultConsumes: defaultConsumes, + ModelsPackage: opts.LanguageOpts.ManglePackagePath(opts.ModelPackage, defaultModelsTarget), + ServerPackage: opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, defaultServerTarget), + ClientPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, defaultClientTarget), + OperationsPackage: filepath.Join(opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, defaultServerTarget), apiPackage), + Principal: opts.PrincipalAlias(), + DefaultScheme: opts.DefaultScheme, + DefaultProduces: opts.DefaultProduces, + DefaultConsumes: opts.DefaultConsumes, GenOpts: opts, }, nil } @@ -170,6 +115,7 @@ type appGenerator struct { ServerPackage string ClientPackage string OperationsPackage string + MainPackage string Principal string Models map[string]spec.Schema Operations map[string]opRef @@ -181,120 +127,14 @@ type appGenerator struct { GenOpts *GenOpts } -func WithAutoXOrder(specPath string) string { - lookFor := func(ele interface{}, key string) (yaml.MapSlice, bool) { - if slice, ok := ele.(yaml.MapSlice); ok { - for _, v := range slice { - if v.Key == key { - if slice, ok := v.Value.(yaml.MapSlice); ok { - return slice, ok - } - } - } - } - return nil, false - } - - var addXOrder func(interface{}) - addXOrder = func(element interface{}) { - if props, ok := lookFor(element, "properties"); ok { - for i, prop := range props { - if pSlice, ok := prop.Value.(yaml.MapSlice); ok { - isObject := false - xOrderIndex := -1 //Find if x-order already exists - - for i, v := range pSlice { - if v.Key == "type" && v.Value == object { - isObject = true - } - if v.Key == xOrder { - xOrderIndex = i - break - } - } - - if xOrderIndex > -1 { //Override existing x-order - pSlice[xOrderIndex] = yaml.MapItem{Key: xOrder, Value: i} - } else { // append new x-order - pSlice = append(pSlice, yaml.MapItem{Key: xOrder, Value: i}) - } - prop.Value = pSlice - props[i] = prop - - if isObject { - addXOrder(pSlice) - } - } - } - } - } - - yamlDoc, err := swag.YAMLData(specPath) - if err != nil { - panic(err) - } - - if defs, ok := lookFor(yamlDoc, "definitions"); ok { - for _, def := range defs { - addXOrder(def.Value) - } - } - - addXOrder(yamlDoc) - - out, err := yaml.Marshal(yamlDoc) - if err != nil { - panic(err) - } - - tmpFile, err := ioutil.TempFile("", filepath.Base(specPath)) - if err != nil { - panic(err) - } - if err := ioutil.WriteFile(tmpFile.Name(), out, 0); err != nil { - panic(err) - } - return tmpFile.Name() -} - -// 1. Checks if the child path and parent path coincide. -// 2. If they do return child path relative to parent path. -// 3. Everything else return false -func checkPrefixAndFetchRelativePath(childpath string, parentpath string) (bool, string) { - // Windows (local) file systems - NTFS, as well as FAT and variants - // are case insensitive. - cp, pp := childpath, parentpath - if goruntime.GOOS == "windows" { - cp = strings.ToLower(cp) - pp = strings.ToLower(pp) - } - - if strings.HasPrefix(cp, pp) { - pth, err := filepath.Rel(parentpath, childpath) - if err != nil { - log.Fatalln(err) - } - return true, pth - } - - return false, "" - -} - func (a *appGenerator) Generate() error { - app, err := a.makeCodegenApp() if err != nil { return err } if a.DumpData { - bb, err := json.MarshalIndent(app, "", " ") - if err != nil { - return err - } - fmt.Fprintln(os.Stdout, string(bb)) - return nil + return dumpData(app) } // NOTE: relative to previous implem with chan. @@ -303,10 +143,9 @@ func (a *appGenerator) Generate() error { if a.GenOpts.IncludeModel { log.Printf("rendering %d models", len(app.Models)) for _, mod := range app.Models { - modCopy := mod - modCopy.IncludeValidator = true // a.GenOpts.IncludeValidator - modCopy.IncludeModel = true - if err := a.GenOpts.renderDefinition(&modCopy); err != nil { + mod.IncludeModel = true + mod.IncludeValidator = a.GenOpts.IncludeValidator + if err := a.GenOpts.renderDefinition(&mod); err != nil { return err } } @@ -315,19 +154,14 @@ func (a *appGenerator) Generate() error { if a.GenOpts.IncludeHandler { log.Printf("rendering %d operation groups (tags)", app.OperationGroups.Len()) for _, opg := range app.OperationGroups { - opgCopy := opg log.Printf("rendering %d operations for %s", opg.Operations.Len(), opg.Name) - for _, op := range opgCopy.Operations { - opCopy := op - - if err := a.GenOpts.renderOperation(&opCopy); err != nil { + for _, op := range opg.Operations { + if err := a.GenOpts.renderOperation(&op); err != nil { return err } } - // Optional OperationGroups templates generation - opGroup := opg - opGroup.DefaultImports = app.DefaultImports - if err := a.GenOpts.renderOperationGroup(&opGroup); err != nil { + // optional OperationGroups templates generation + if err := a.GenOpts.renderOperationGroup(&opg); err != nil { return fmt.Errorf("error while rendering operation group: %v", err) } } @@ -345,247 +179,23 @@ func (a *appGenerator) Generate() error { func (a *appGenerator) GenerateSupport(ap *GenApp) error { app := ap if ap == nil { + // allows for calling GenerateSupport standalone ca, err := a.makeCodegenApp() if err != nil { return err } app = &ca } + baseImport := a.GenOpts.LanguageOpts.baseImport(a.Target) - importPath := path.Join(filepath.ToSlash(baseImport), a.GenOpts.LanguageOpts.ManglePackagePath(a.OperationsPackage, "")) - app.DefaultImports = append( - app.DefaultImports, - path.Join(filepath.ToSlash(baseImport), a.GenOpts.LanguageOpts.ManglePackagePath(a.ServerPackage, "")), - importPath, - ) + serverPath := path.Join(baseImport, + a.GenOpts.LanguageOpts.ManglePackagePath(a.ServerPackage, defaultServerTarget)) + app.DefaultImports[importAlias(serverPath)] = serverPath return a.GenOpts.renderApplication(app) } -var mediaTypeNames = map[*regexp.Regexp]string{ - regexp.MustCompile("application/.*json"): "json", - regexp.MustCompile("application/.*yaml"): "yaml", - regexp.MustCompile("application/.*protobuf"): "protobuf", - regexp.MustCompile("application/.*capnproto"): "capnproto", - regexp.MustCompile("application/.*thrift"): "thrift", - regexp.MustCompile("(?:application|text)/.*xml"): "xml", - regexp.MustCompile("text/.*markdown"): "markdown", - regexp.MustCompile("text/.*html"): "html", - regexp.MustCompile("text/.*csv"): "csv", - regexp.MustCompile("text/.*tsv"): "tsv", - regexp.MustCompile("text/.*javascript"): "js", - regexp.MustCompile("text/.*css"): "css", - regexp.MustCompile("text/.*plain"): "txt", - regexp.MustCompile("application/.*octet-stream"): "bin", - regexp.MustCompile("application/.*tar"): "tar", - regexp.MustCompile("application/.*gzip"): "gzip", - regexp.MustCompile("application/.*gz"): "gzip", - regexp.MustCompile("application/.*raw-stream"): "bin", - regexp.MustCompile("application/x-www-form-urlencoded"): "urlform", - regexp.MustCompile("multipart/form-data"): "multipartform", -} - -var knownProducers = map[string]string{ - "json": "runtime.JSONProducer()", - "yaml": "yamlpc.YAMLProducer()", - "xml": "runtime.XMLProducer()", - "txt": "runtime.TextProducer()", - "bin": "runtime.ByteStreamProducer()", - "urlform": "runtime.DiscardProducer", - "multipartform": "runtime.DiscardProducer", -} - -var knownConsumers = map[string]string{ - "json": "runtime.JSONConsumer()", - "yaml": "yamlpc.YAMLConsumer()", - "xml": "runtime.XMLConsumer()", - "txt": "runtime.TextConsumer()", - "bin": "runtime.ByteStreamConsumer()", - "urlform": "runtime.DiscardConsumer", - "multipartform": "runtime.DiscardConsumer", -} - -func getSerializer(sers []GenSerGroup, ext string) (*GenSerGroup, bool) { - for i := range sers { - s := &sers[i] - if s.Name == ext { - return s, true - } - } - return nil, false -} - -func mediaTypeName(tn string) (string, bool) { - for k, v := range mediaTypeNames { - if k.MatchString(tn) { - return v, true - } - } - return "", false -} - -func (a *appGenerator) makeConsumes() (consumes GenSerGroups, consumesJSON bool) { - reqCons := a.Analyzed.RequiredConsumes() - sort.Strings(reqCons) - for _, cons := range reqCons { - cn, ok := mediaTypeName(cons) - if !ok { - nm := swag.ToJSONName(cons) - ser := GenSerializer{ - AppName: a.Name, - ReceiverName: a.Receiver, - Name: nm, - MediaType: cons, - Implementation: "", - } - - consumes = append(consumes, GenSerGroup{ - AppName: ser.AppName, - ReceiverName: ser.ReceiverName, - Name: ser.Name, - MediaType: cons, - AllSerializers: []GenSerializer{ser}, - Implementation: ser.Implementation, - }) - continue - } - nm := swag.ToJSONName(cn) - if nm == "json" { - consumesJSON = true - } - - if ser, ok := getSerializer(consumes, cn); ok { - ser.AllSerializers = append(ser.AllSerializers, GenSerializer{ - AppName: ser.AppName, - ReceiverName: ser.ReceiverName, - Name: ser.Name, - MediaType: cons, - Implementation: knownConsumers[nm], - }) - sort.Sort(ser.AllSerializers) - continue - } - - ser := GenSerializer{ - AppName: a.Name, - ReceiverName: a.Receiver, - Name: nm, - MediaType: cons, - Implementation: knownConsumers[nm], - } - - consumes = append(consumes, GenSerGroup{ - AppName: ser.AppName, - ReceiverName: ser.ReceiverName, - Name: ser.Name, - MediaType: cons, - AllSerializers: []GenSerializer{ser}, - Implementation: ser.Implementation, - }) - } - if len(consumes) == 0 { - consumes = append(consumes, GenSerGroup{ - AppName: a.Name, - ReceiverName: a.Receiver, - Name: "json", - MediaType: runtime.JSONMime, - AllSerializers: []GenSerializer{{ - AppName: a.Name, - ReceiverName: a.Receiver, - Name: "json", - MediaType: runtime.JSONMime, - Implementation: knownConsumers["json"], - }}, - Implementation: knownConsumers["json"], - }) - consumesJSON = true - } - sort.Sort(consumes) - return -} - -func (a *appGenerator) makeProduces() (produces GenSerGroups, producesJSON bool) { - reqProds := a.Analyzed.RequiredProduces() - sort.Strings(reqProds) - for _, prod := range reqProds { - pn, ok := mediaTypeName(prod) - if !ok { - nm := swag.ToJSONName(prod) - ser := GenSerializer{ - AppName: a.Name, - ReceiverName: a.Receiver, - Name: nm, - MediaType: prod, - Implementation: "", - } - produces = append(produces, GenSerGroup{ - AppName: ser.AppName, - ReceiverName: ser.ReceiverName, - Name: ser.Name, - MediaType: prod, - Implementation: ser.Implementation, - AllSerializers: []GenSerializer{ser}, - }) - continue - } - nm := swag.ToJSONName(pn) - if nm == "json" { - producesJSON = true - } - - if ser, ok := getSerializer(produces, pn); ok { - ser.AllSerializers = append(ser.AllSerializers, GenSerializer{ - AppName: ser.AppName, - ReceiverName: ser.ReceiverName, - Name: ser.Name, - MediaType: prod, - Implementation: knownProducers[nm], - }) - sort.Sort(ser.AllSerializers) - continue - } - - ser := GenSerializer{ - AppName: a.Name, - ReceiverName: a.Receiver, - Name: nm, - MediaType: prod, - Implementation: knownProducers[nm], - } - produces = append(produces, GenSerGroup{ - AppName: ser.AppName, - ReceiverName: ser.ReceiverName, - Name: ser.Name, - MediaType: prod, - Implementation: ser.Implementation, - AllSerializers: []GenSerializer{ser}, - }) - } - if len(produces) == 0 { - produces = append(produces, GenSerGroup{ - AppName: a.Name, - ReceiverName: a.Receiver, - Name: "json", - MediaType: runtime.JSONMime, - AllSerializers: []GenSerializer{{ - AppName: a.Name, - ReceiverName: a.Receiver, - Name: "json", - MediaType: runtime.JSONMime, - Implementation: knownProducers["json"], - }}, - Implementation: knownProducers["json"], - }) - producesJSON = true - } - sort.Sort(produces) - return -} - func (a *appGenerator) makeSecuritySchemes() GenSecuritySchemes { - if a.Principal == "" { - a.Principal = "interface{}" - } requiredSecuritySchemes := make(map[string]spec.SecurityScheme, len(a.Analyzed.RequiredSecuritySchemes())) for _, scheme := range a.Analyzed.RequiredSecuritySchemes() { if req, ok := a.SpecDoc.Spec().SecurityDefinitions[scheme]; ok && req != nil { @@ -597,36 +207,25 @@ func (a *appGenerator) makeSecuritySchemes() GenSecuritySchemes { func (a *appGenerator) makeCodegenApp() (GenApp, error) { log.Println("building a plan for generation") + sw := a.SpecDoc.Spec() receiver := a.Receiver - var defaultImports []string - - jsonb, _ := json.MarshalIndent(a.SpecDoc.OrigSpec(), "", " ") - flatjsonb, _ := json.MarshalIndent(a.SpecDoc.Spec(), "", " ") - consumes, _ := a.makeConsumes() produces, _ := a.makeProduces() - sort.Sort(consumes) - sort.Sort(produces) security := a.makeSecuritySchemes() + + log.Println("generation target", a.Target) + baseImport := a.GenOpts.LanguageOpts.baseImport(a.Target) - var imports = make(map[string]string) - - var genMods GenDefinitions - importPath := a.GenOpts.ExistingModels - if a.GenOpts.ExistingModels == "" { - imports[a.GenOpts.LanguageOpts.ManglePackageName(a.ModelsPackage, "models")] = path.Join( - filepath.ToSlash(baseImport), - a.GenOpts.LanguageOpts.ManglePackagePath(a.GenOpts.ModelPackage, "models")) - } - if importPath != "" { - defaultImports = append(defaultImports, importPath) - } + defaultImports := a.GenOpts.defaultImports() + imports := a.GenOpts.initImports(a.OperationsPackage) log.Println("planning definitions") + + genModels := make(GenDefinitions, 0, len(a.Models)) for mn, m := range a.Models { - mod, err := makeGenDefinition( + model, err := makeGenDefinition( mn, a.ModelsPackage, m, @@ -636,52 +235,59 @@ func (a *appGenerator) makeCodegenApp() (GenApp, error) { if err != nil { return GenApp{}, fmt.Errorf("error in model %s while planning definitions: %v", mn, err) } - if mod != nil { - if !mod.External { - genMods = append(genMods, *mod) + if model != nil { + if !model.External { + genModels = append(genModels, *model) } // Copy model imports to operation imports - for alias, pkg := range mod.Imports { + // TODO(fredbi): mangle model pkg aliases + for alias, pkg := range model.Imports { target := a.GenOpts.LanguageOpts.ManglePackageName(alias, "") imports[target] = pkg } } } - sort.Sort(genMods) + sort.Sort(genModels) log.Println("planning operations") - tns := make(map[string]struct{}) - var genOps GenOperations - for on, opp := range a.Operations { + + genOps := make(GenOperations, 0, len(a.Operations)) + for operationName, opp := range a.Operations { o := opp.Op - o.Tags = pruneEmpty(o.Tags) - o.ID = on - - var bldr codeGenOpBuilder - bldr.ModelsPackage = a.ModelsPackage - bldr.Principal = a.Principal - bldr.Target = a.Target - bldr.DefaultImports = defaultImports - bldr.Imports = imports - bldr.DefaultScheme = a.DefaultScheme - bldr.Doc = a.SpecDoc - bldr.Analyzed = a.Analyzed - bldr.BasePath = a.SpecDoc.BasePath() - bldr.GenOpts = a.GenOpts - - // TODO: change operation name to something safe - bldr.Name = on - bldr.Operation = *o - bldr.Method = opp.Method - bldr.Path = opp.Path + o.ID = operationName + + bldr := codeGenOpBuilder{ + ModelsPackage: a.ModelsPackage, + Principal: a.GenOpts.PrincipalAlias(), + Target: a.Target, + DefaultImports: defaultImports, + Imports: imports, + DefaultScheme: a.DefaultScheme, + Doc: a.SpecDoc, + Analyzed: a.Analyzed, + BasePath: a.SpecDoc.BasePath(), + GenOpts: a.GenOpts, + Name: operationName, + Operation: *o, + Method: opp.Method, + Path: opp.Path, + IncludeValidator: a.GenOpts.IncludeValidator, + APIPackage: a.APIPackage, // defaults to main operations package + DefaultProduces: a.DefaultProduces, + DefaultConsumes: a.DefaultConsumes, + } + + tag, tags, ok := bldr.analyzeTags() + if !ok { + continue // operation filtered according to CLI params + } + bldr.Authed = len(a.Analyzed.SecurityRequirementsFor(o)) > 0 bldr.Security = a.Analyzed.SecurityRequirementsFor(o) bldr.SecurityDefinitions = a.Analyzed.SecurityDefinitionsFor(o) - bldr.RootAPIPackage = a.GenOpts.LanguageOpts.ManglePackageName(a.ServerPackage, "server") - bldr.IncludeValidator = true + bldr.RootAPIPackage = a.GenOpts.LanguageOpts.ManglePackageName(a.ServerPackage, defaultServerTarget) - bldr.APIPackage = a.APIPackage st := o.Tags if a.GenOpts != nil { st = a.GenOpts.Tags @@ -691,42 +297,35 @@ func (a *appGenerator) makeCodegenApp() (GenApp, error) { continue } - if len(intersected) > 0 { - tag := intersected[0] - bldr.APIPackage = a.GenOpts.LanguageOpts.ManglePackagePath(tag, a.APIPackage) - for _, t := range intersected { - tns[t] = struct{}{} - } - } op, err := bldr.MakeOperation() if err != nil { return GenApp{}, err } + op.ReceiverName = receiver - op.Tags = intersected + op.Tags = tags // ordered tags for this operation, possibly filtered by CLI params genOps = append(genOps, op) - } - for k := range tns { - importPath := filepath.ToSlash( - path.Join( - filepath.ToSlash(baseImport), - a.GenOpts.LanguageOpts.ManglePackagePath(a.OperationsPackage, ""), - swag.ToFileName(k))) - defaultImports = append(defaultImports, importPath) + if !a.GenOpts.SkipTagPackages && tag != "" { + importPath := filepath.ToSlash( + path.Join( + baseImport, + a.GenOpts.LanguageOpts.ManglePackagePath(a.OperationsPackage, defaultOperationsTarget), + a.GenOpts.LanguageOpts.ManglePackageName(bldr.APIPackage, defaultOperationsTarget), + )) + defaultImports[bldr.APIPackageAlias] = importPath + } } sort.Sort(genOps) log.Println("grouping operations into packages") - opsGroupedByPackage := make(map[string]GenOperations) + + opsGroupedByPackage := make(map[string]GenOperations, len(genOps)) for _, operation := range genOps { - if operation.Package == "" { - operation.Package = a.Package - } - opsGroupedByPackage[operation.Package] = append(opsGroupedByPackage[operation.Package], operation) + opsGroupedByPackage[operation.PackageAlias] = append(opsGroupedByPackage[operation.PackageAlias], operation) } - var opGroups GenOperationGroups + opGroups := make(GenOperationGroups, 0, len(opsGroupedByPackage)) for k, v := range opsGroupedByPackage { sort.Sort(v) // trim duplicate extra schemas within the same package @@ -743,13 +342,20 @@ func (a *appGenerator) makeCodegenApp() (GenApp, error) { op.ExtraSchemas = uniqueExtraSchemas vv = append(vv, op) } + var pkg string + if len(vv) > 0 { + pkg = vv[0].Package + } else { + pkg = k + } opGroup := GenOperationGroup{ GenCommon: GenCommon{ Copyright: a.GenOpts.Copyright, - TargetImportPath: filepath.ToSlash(baseImport), + TargetImportPath: baseImport, }, - Name: k, + Name: pkg, + PackageAlias: k, Operations: vv, DefaultImports: defaultImports, Imports: imports, @@ -757,13 +363,6 @@ func (a *appGenerator) makeCodegenApp() (GenApp, error) { GenOpts: a.GenOpts, } opGroups = append(opGroups, opGroup) - var importPath string - if k == a.APIPackage { - importPath = path.Join(filepath.ToSlash(baseImport), a.GenOpts.LanguageOpts.ManglePackagePath(a.OperationsPackage, "")) - } else { - importPath = path.Join(filepath.ToSlash(baseImport), a.GenOpts.LanguageOpts.ManglePackagePath(a.OperationsPackage, ""), k) - } - defaultImports = append(defaultImports, importPath) } sort.Sort(opGroups) @@ -788,12 +387,15 @@ func (a *appGenerator) makeCodegenApp() (GenApp, error) { basePath = sw.BasePath } + jsonb, _ := json.MarshalIndent(a.SpecDoc.OrigSpec(), "", " ") + flatjsonb, _ := json.MarshalIndent(a.SpecDoc.Spec(), "", " ") + return GenApp{ GenCommon: GenCommon{ Copyright: a.GenOpts.Copyright, - TargetImportPath: filepath.ToSlash(baseImport), + TargetImportPath: baseImport, }, - APIPackage: a.GenOpts.LanguageOpts.ManglePackageName(a.ServerPackage, "server"), + APIPackage: a.GenOpts.LanguageOpts.ManglePackageName(a.ServerPackage, defaultServerTarget), Package: a.Package, ReceiverName: receiver, Name: a.Name, @@ -810,13 +412,13 @@ func (a *appGenerator) makeCodegenApp() (GenApp, error) { DefaultImports: defaultImports, Imports: imports, SecurityDefinitions: security, - Models: genMods, + Models: genModels, Operations: genOps, OperationGroups: opGroups, - Principal: a.Principal, + Principal: a.GenOpts.PrincipalAlias(), SwaggerJSON: generateReadableSpec(jsonb), FlatSwaggerJSON: generateReadableSpec(flatjsonb), - ExcludeSpec: a.GenOpts != nil && a.GenOpts.ExcludeSpec, + ExcludeSpec: a.GenOpts.ExcludeSpec, GenOpts: a.GenOpts, }, nil } diff --git a/vendor/github.com/go-swagger/go-swagger/generator/template_repo.go b/vendor/github.com/go-swagger/go-swagger/generator/template_repo.go index ec3a4f6563..c84951a185 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/template_repo.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/template_repo.go @@ -11,6 +11,7 @@ import ( "strings" "text/template" "text/template/parse" + "unicode" "log" @@ -19,177 +20,166 @@ import ( "github.com/kr/pretty" ) -var templates *Repository +var ( + assets map[string][]byte + protectedTemplates map[string]bool -// FuncMap is a map with default functions for use n the templates. -// These are available in every template -var FuncMap template.FuncMap = map[string]interface{}{ - "pascalize": pascalize, - "camelize": swag.ToJSONName, - "varname": golang.MangleVarName, - "humanize": swag.ToHumanNameLower, - "snakize": golang.MangleFileName, - "toPackagePath": func(name string) string { - return filepath.FromSlash(golang.ManglePackagePath(name, "")) - }, - "toPackage": func(name string) string { - return golang.ManglePackagePath(name, "") - }, - "toPackageName": func(name string) string { - return golang.ManglePackageName(name, "") - }, - "dasherize": swag.ToCommandName, - "pluralizeFirstWord": func(arg string) string { - sentence := strings.Split(arg, " ") - if len(sentence) == 1 { - return inflect.Pluralize(arg) - } + // FuncMapFunc yields a map with all functions for templates + FuncMapFunc func(*LanguageOpts) template.FuncMap - return inflect.Pluralize(sentence[0]) + " " + strings.Join(sentence[1:], " ") - }, - "json": asJSON, - "prettyjson": asPrettyJSON, - "hasInsecure": func(arg []string) bool { - return swag.ContainsStringsCI(arg, "http") || swag.ContainsStringsCI(arg, "ws") - }, - "hasSecure": func(arg []string) bool { - return swag.ContainsStringsCI(arg, "https") || swag.ContainsStringsCI(arg, "wss") - }, - // TODO: simplify redundant functions - "stripPackage": func(str, pkg string) string { - parts := strings.Split(str, ".") - strlen := len(parts) - if strlen > 0 { - return parts[strlen-1] - } - return str - }, - "dropPackage": func(str string) string { - parts := strings.Split(str, ".") - strlen := len(parts) - if strlen > 0 { - return parts[strlen-1] - } - return str - }, - "upper": strings.ToUpper, - "contains": func(coll []string, arg string) bool { - for _, v := range coll { - if v == arg { - return true - } - } - return false - }, - "padSurround": func(entry, padWith string, i, ln int) string { - var res []string - if i > 0 { - for j := 0; j < i; j++ { - res = append(res, padWith) - } - } - res = append(res, entry) - tot := ln - i - 1 - for j := 0; j < tot; j++ { - res = append(res, padWith) - } - return strings.Join(res, ",") - }, - "joinFilePath": filepath.Join, - "comment": func(str string) string { - lines := strings.Split(str, "\n") - return (strings.Join(lines, "\n// ")) - }, - "blockcomment": func(str string) string { - return strings.Replace(str, "*/", "[*]/", -1) - }, - "inspect": pretty.Sprint, - "cleanPath": path.Clean, - "mediaTypeName": func(orig string) string { - return strings.SplitN(orig, ";", 2)[0] - }, - "goSliceInitializer": goSliceInitializer, - "hasPrefix": strings.HasPrefix, - "stringContains": strings.Contains, + templates *Repository +) + +func initTemplateRepo() { + FuncMapFunc = DefaultFuncMap + + // this makes the ToGoName func behave with the special + // prefixing rule above + swag.GoNamePrefixFunc = prefixForName + + assets = defaultAssets() + protectedTemplates = defaultProtectedTemplates() + templates = NewRepository(FuncMapFunc(DefaultLanguageFunc())) } -func init() { - templates = NewRepository(FuncMap) +// DefaultFuncMap yields a map with default functions for use n the templates. +// These are available in every template +func DefaultFuncMap(lang *LanguageOpts) template.FuncMap { + return template.FuncMap(map[string]interface{}{ + "pascalize": pascalize, + "camelize": swag.ToJSONName, + "varname": lang.MangleVarName, + "humanize": swag.ToHumanNameLower, + "snakize": lang.MangleFileName, + "toPackagePath": func(name string) string { + return filepath.FromSlash(lang.ManglePackagePath(name, "")) + }, + "toPackage": func(name string) string { + return lang.ManglePackagePath(name, "") + }, + "toPackageName": func(name string) string { + return lang.ManglePackageName(name, "") + }, + "dasherize": swag.ToCommandName, + "pluralizeFirstWord": pluralizeFirstWord, + "json": asJSON, + "prettyjson": asPrettyJSON, + "hasInsecure": func(arg []string) bool { + return swag.ContainsStringsCI(arg, "http") || swag.ContainsStringsCI(arg, "ws") + }, + "hasSecure": func(arg []string) bool { + return swag.ContainsStringsCI(arg, "https") || swag.ContainsStringsCI(arg, "wss") + }, + "dropPackage": dropPackage, + "upper": strings.ToUpper, + "contains": swag.ContainsStrings, + "padSurround": padSurround, + "joinFilePath": filepath.Join, + "comment": padComment, + "blockcomment": blockComment, + "inspect": pretty.Sprint, + "cleanPath": path.Clean, + "mediaTypeName": mediaMime, + "arrayInitializer": lang.arrayInitializer, + "hasPrefix": strings.HasPrefix, + "stringContains": strings.Contains, + "imports": lang.imports, + "dict": dict, + }) } -var assets = map[string][]byte{ - "validation/primitive.gotmpl": MustAsset("templates/validation/primitive.gotmpl"), - "validation/customformat.gotmpl": MustAsset("templates/validation/customformat.gotmpl"), - "docstring.gotmpl": MustAsset("templates/docstring.gotmpl"), - "validation/structfield.gotmpl": MustAsset("templates/validation/structfield.gotmpl"), - "modelvalidator.gotmpl": MustAsset("templates/modelvalidator.gotmpl"), - "structfield.gotmpl": MustAsset("templates/structfield.gotmpl"), - "tupleserializer.gotmpl": MustAsset("templates/tupleserializer.gotmpl"), - "additionalpropertiesserializer.gotmpl": MustAsset("templates/additionalpropertiesserializer.gotmpl"), - "schematype.gotmpl": MustAsset("templates/schematype.gotmpl"), - "schemabody.gotmpl": MustAsset("templates/schemabody.gotmpl"), - "schema.gotmpl": MustAsset("templates/schema.gotmpl"), - "schemavalidator.gotmpl": MustAsset("templates/schemavalidator.gotmpl"), - "model.gotmpl": MustAsset("templates/model.gotmpl"), - "header.gotmpl": MustAsset("templates/header.gotmpl"), - "swagger_json_embed.gotmpl": MustAsset("templates/swagger_json_embed.gotmpl"), - - "server/parameter.gotmpl": MustAsset("templates/server/parameter.gotmpl"), - "server/urlbuilder.gotmpl": MustAsset("templates/server/urlbuilder.gotmpl"), - "server/responses.gotmpl": MustAsset("templates/server/responses.gotmpl"), - "server/operation.gotmpl": MustAsset("templates/server/operation.gotmpl"), - "server/builder.gotmpl": MustAsset("templates/server/builder.gotmpl"), - "server/server.gotmpl": MustAsset("templates/server/server.gotmpl"), - "server/configureapi.gotmpl": MustAsset("templates/server/configureapi.gotmpl"), - "server/main.gotmpl": MustAsset("templates/server/main.gotmpl"), - "server/doc.gotmpl": MustAsset("templates/server/doc.gotmpl"), - - "client/parameter.gotmpl": MustAsset("templates/client/parameter.gotmpl"), - "client/response.gotmpl": MustAsset("templates/client/response.gotmpl"), - "client/client.gotmpl": MustAsset("templates/client/client.gotmpl"), - "client/facade.gotmpl": MustAsset("templates/client/facade.gotmpl"), +func defaultAssets() map[string][]byte { + return map[string][]byte{ + // schema validation templates + "validation/primitive.gotmpl": MustAsset("templates/validation/primitive.gotmpl"), + "validation/customformat.gotmpl": MustAsset("templates/validation/customformat.gotmpl"), + "validation/structfield.gotmpl": MustAsset("templates/validation/structfield.gotmpl"), + "structfield.gotmpl": MustAsset("templates/structfield.gotmpl"), + "schemavalidator.gotmpl": MustAsset("templates/schemavalidator.gotmpl"), + "schemapolymorphic.gotmpl": MustAsset("templates/schemapolymorphic.gotmpl"), + "schemaembedded.gotmpl": MustAsset("templates/schemaembedded.gotmpl"), + + // schema serialization templates + "additionalpropertiesserializer.gotmpl": MustAsset("templates/serializers/additionalpropertiesserializer.gotmpl"), + "aliasedserializer.gotmpl": MustAsset("templates/serializers/aliasedserializer.gotmpl"), + "allofserializer.gotmpl": MustAsset("templates/serializers/allofserializer.gotmpl"), + "basetypeserializer.gotmpl": MustAsset("templates/serializers/basetypeserializer.gotmpl"), + "marshalbinaryserializer.gotmpl": MustAsset("templates/serializers/marshalbinaryserializer.gotmpl"), + "schemaserializer.gotmpl": MustAsset("templates/serializers/schemaserializer.gotmpl"), + "subtypeserializer.gotmpl": MustAsset("templates/serializers/subtypeserializer.gotmpl"), + "tupleserializer.gotmpl": MustAsset("templates/serializers/tupleserializer.gotmpl"), + + // schema generation template + "docstring.gotmpl": MustAsset("templates/docstring.gotmpl"), + "schematype.gotmpl": MustAsset("templates/schematype.gotmpl"), + "schemabody.gotmpl": MustAsset("templates/schemabody.gotmpl"), + "schema.gotmpl": MustAsset("templates/schema.gotmpl"), + "model.gotmpl": MustAsset("templates/model.gotmpl"), + "header.gotmpl": MustAsset("templates/header.gotmpl"), + + "swagger_json_embed.gotmpl": MustAsset("templates/swagger_json_embed.gotmpl"), + + // server templates + "server/parameter.gotmpl": MustAsset("templates/server/parameter.gotmpl"), + "server/urlbuilder.gotmpl": MustAsset("templates/server/urlbuilder.gotmpl"), + "server/responses.gotmpl": MustAsset("templates/server/responses.gotmpl"), + "server/operation.gotmpl": MustAsset("templates/server/operation.gotmpl"), + "server/builder.gotmpl": MustAsset("templates/server/builder.gotmpl"), + "server/server.gotmpl": MustAsset("templates/server/server.gotmpl"), + "server/configureapi.gotmpl": MustAsset("templates/server/configureapi.gotmpl"), + "server/main.gotmpl": MustAsset("templates/server/main.gotmpl"), + "server/doc.gotmpl": MustAsset("templates/server/doc.gotmpl"), + + // client templates + "client/parameter.gotmpl": MustAsset("templates/client/parameter.gotmpl"), + "client/response.gotmpl": MustAsset("templates/client/response.gotmpl"), + "client/client.gotmpl": MustAsset("templates/client/client.gotmpl"), + "client/facade.gotmpl": MustAsset("templates/client/facade.gotmpl"), + } } -var protectedTemplates = map[string]bool{ - "schemabody": true, - "privtuplefield": true, - "withoutBaseTypeBody": true, - "swaggerJsonEmbed": true, - "validationCustomformat": true, - "tuplefield": true, - "header": true, - "withBaseTypeBody": true, - "primitivefieldvalidator": true, - "mapvalidator": true, - "propertyValidationDocString": true, - "typeSchemaType": true, - "docstring": true, - "dereffedSchemaType": true, - "model": true, - "modelvalidator": true, - "privstructfield": true, - "schemavalidator": true, - "tuplefieldIface": true, - "tupleSerializer": true, - "tupleserializer": true, - "schemaSerializer": true, - "propertyvalidator": true, - "structfieldIface": true, - "schemaBody": true, - "objectvalidator": true, - "schematype": true, - "additionalpropertiesserializer": true, - "slicevalidator": true, - "validationStructfield": true, - "validationPrimitive": true, - "schemaType": true, - "subTypeBody": true, - "schema": true, - "additionalPropertiesSerializer": true, - "serverDoc": true, - "structfield": true, - "hasDiscriminatedSerializer": true, - "discriminatedSerializer": true, +func defaultProtectedTemplates() map[string]bool { + return map[string]bool{ + "dereffedSchemaType": true, + "docstring": true, + "header": true, + "mapvalidator": true, + "model": true, + "modelvalidator": true, + "objectvalidator": true, + "primitivefieldvalidator": true, + "privstructfield": true, + "privtuplefield": true, + "propertyValidationDocString": true, + "propertyvalidator": true, + "schema": true, + "schemaBody": true, + "schemaType": true, + "schemabody": true, + "schematype": true, + "schemavalidator": true, + "serverDoc": true, + "slicevalidator": true, + "structfield": true, + "structfieldIface": true, + "subTypeBody": true, + "swaggerJsonEmbed": true, + "tuplefield": true, + "tuplefieldIface": true, + "typeSchemaType": true, + "validationCustomformat": true, + "validationPrimitive": true, + "validationStructfield": true, + "withBaseTypeBody": true, + "withoutBaseTypeBody": true, + + // all serializers TODO(fred) + "additionalPropertiesSerializer": true, + "tupleSerializer": true, + "schemaSerializer": true, + "hasDiscriminatedSerializer": true, + "discriminatedSerializer": true, + } } // AddFile adds a file to the default repository. It will create a new template based on the filename. @@ -202,36 +192,6 @@ func AddFile(name, data string) error { return templates.addFile(name, data, false) } -func asJSON(data interface{}) (string, error) { - b, err := json.Marshal(data) - if err != nil { - return "", err - } - return string(b), nil -} - -func asPrettyJSON(data interface{}) (string, error) { - b, err := json.MarshalIndent(data, "", " ") - if err != nil { - return "", err - } - return string(b), nil -} - -func goSliceInitializer(data interface{}) (string, error) { - // goSliceInitializer constructs a Go literal initializer from interface{} literals. - // e.g. []interface{}{"a", "b"} is transformed in {"a","b",} - // e.g. map[string]interface{}{ "a": "x", "b": "y"} is transformed in {"a":"x","b":"y",}. - // - // NOTE: this is currently used to construct simple slice intializers for default values. - // This allows for nicer slice initializers for slices of primitive types and avoid systematic use for json.Unmarshal(). - b, err := json.Marshal(data) - if err != nil { - return "", err - } - return strings.Replace(strings.Replace(strings.Replace(string(b), "}", ",}", -1), "[", "{", -1), "]", ",}", -1), nil -} - // NewRepository creates a new template repository with the provided functions defined func NewRepository(funcs template.FuncMap) *Repository { repo := Repository{ @@ -273,8 +233,6 @@ func (t *Repository) LoadDir(templatePath string) error { if assetName, e := filepath.Rel(templatePath, path); e == nil { if data, e := ioutil.ReadFile(path); e == nil { if ee := t.AddFile(assetName, string(data)); ee != nil { - // Fatality is decided by caller - // log.Fatal(ee) return fmt.Errorf("could not add template: %v", ee) } } @@ -515,3 +473,110 @@ func (t *Repository) DumpTemplates() { } log.Println(buf.String()) } + +// FuncMap functions + +func asJSON(data interface{}) (string, error) { + b, err := json.Marshal(data) + if err != nil { + return "", err + } + return string(b), nil +} + +func asPrettyJSON(data interface{}) (string, error) { + b, err := json.MarshalIndent(data, "", " ") + if err != nil { + return "", err + } + return string(b), nil +} + +func pluralizeFirstWord(arg string) string { + sentence := strings.Split(arg, " ") + if len(sentence) == 1 { + return inflect.Pluralize(arg) + } + + return inflect.Pluralize(sentence[0]) + " " + strings.Join(sentence[1:], " ") +} + +func dropPackage(str string) string { + parts := strings.Split(str, ".") + return parts[len(parts)-1] +} + +func padSurround(entry, padWith string, i, ln int) string { + var res []string + if i > 0 { + for j := 0; j < i; j++ { + res = append(res, padWith) + } + } + res = append(res, entry) + tot := ln - i - 1 + for j := 0; j < tot; j++ { + res = append(res, padWith) + } + return strings.Join(res, ",") +} + +func padComment(str string, pads ...string) string { + // pads specifes padding to indent multi line comments.Defaults to one space + pad := " " + lines := strings.Split(str, "\n") + if len(pads) > 0 { + pad = strings.Join(pads, "") + } + return (strings.Join(lines, "\n//"+pad)) +} + +func blockComment(str string) string { + return strings.Replace(str, "*/", "[*]/", -1) +} + +func pascalize(arg string) string { + runes := []rune(arg) + switch len(runes) { + case 0: + return "Empty" + case 1: // handle special case when we have a single rune that is not handled by swag.ToGoName + switch runes[0] { + case '+', '-', '#', '_': // those cases are handled differently than swag utility + return prefixForName(arg) + } + } + return swag.ToGoName(swag.ToGoName(arg)) // want to remove spaces +} + +func prefixForName(arg string) string { + first := []rune(arg)[0] + if len(arg) == 0 || unicode.IsLetter(first) { + return "" + } + switch first { + case '+': + return "Plus" + case '-': + return "Minus" + case '#': + return "HashTag" + // other cases ($,@ etc..) handled by swag.ToGoName + } + return "Nr" +} + +func dict(values ...interface{}) (map[string]interface{}, error) { + if len(values)%2 != 0 { + return nil, fmt.Errorf("expected even number of arguments, got %d", len(values)) + } + dict := make(map[string]interface{}, len(values)/2) + for i := 0; i < len(values); i += 2 { + key, ok := values[i].(string) + if !ok { + return nil, fmt.Errorf("expected string key, got %+v", values[i]) + } + dict[key] = values[i+1] + } + return dict, nil +} diff --git a/vendor/github.com/go-swagger/go-swagger/generator/types.go b/vendor/github.com/go-swagger/go-swagger/generator/types.go index 2125a88d53..e4d2493a37 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/types.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/types.go @@ -25,6 +25,7 @@ import ( "github.com/go-openapi/spec" "github.com/go-openapi/swag" "github.com/kr/pretty" + "github.com/mitchellh/mapstructure" ) const ( @@ -37,27 +38,31 @@ const ( str = "string" object = "object" binary = "binary" - sHTTP = "http" body = "body" + b64 = "byte" ) // Extensions supported by go-swagger const ( - xClass = "x-class" // class name used by discriminator - xGoCustomTag = "x-go-custom-tag" // additional tag for serializers on struct fields - xGoName = "x-go-name" // name of the generated go variable - xGoType = "x-go-type" // reuse existing type (do not generate) - xIsNullable = "x-isnullable" - xNullable = "x-nullable" // turns the schema into a pointer - xOmitEmpty = "x-omitempty" - xSchemes = "x-schemes" // additional schemes supported for operations (server generation) - xOrder = "x-order" // sort order for properties (or any schema) + xClass = "x-class" // class name used by discriminator + xGoCustomTag = "x-go-custom-tag" // additional tag for serializers on struct fields + xGoName = "x-go-name" // name of the generated go variable + xGoType = "x-go-type" // reuse existing type (do not generate) + xIsNullable = "x-isnullable" + xNullable = "x-nullable" // turns the schema into a pointer + xOmitEmpty = "x-omitempty" + xSchemes = "x-schemes" // additional schemes supported for operations (server generation) + xOrder = "x-order" // sort order for properties (or any schema) + xGoJSONString = "x-go-json-string" + xGoEnumCI = "x-go-enum-ci" // make string enumeration case-insensitive + + xGoOperationTag = "x-go-operation-tag" // additional tag to override generation in operation groups ) -// swaggerTypeMapping contains a mapping from go type to swagger type or format +// swaggerTypeName contains a mapping from go type to swagger type or format var swaggerTypeName map[string]string -func init() { +func initTypes() { swaggerTypeName = make(map[string]string) for k, v := range typeMapping { swaggerTypeName[v] = k @@ -86,6 +91,8 @@ func simpleResolvedType(tn, fmt string, items *spec.Items) (result resolvedType) // special case of swagger format "binary", rendered as io.ReadCloser interface // TODO(fredbi): should set IsCustomFormatter=false when binary result.IsStream = fmt == binary + // special case of swagger format "byte", rendered as a strfmt.Base64 type: no validation + result.IsBase64 = fmt == b64 return } } @@ -134,16 +141,15 @@ func newTypeResolver(pkg string, doc *loads.Document) *typeResolver { func knownDefGoType(def string, schema spec.Schema, clear func(string) string) (string, string, string) { debugLog("known def type: %q", def) ext := schema.Extensions - if nm, ok := ext.GetString(xGoName); ok { - if clear == nil { - debugLog("known def type %s no clear: %q", xGoName, nm) - return nm, "", "" - } - debugLog("known def type %s clear: %q -> %q", xGoName, nm, clear(nm)) - return clear(nm), "", "" + nm, hasGoName := ext.GetString(xGoName) + + if hasGoName { + debugLog("known def type %s named from %s as %q", def, xGoName, nm) + def = nm } - v, ok := ext[xGoType] - if !ok { + extType, isExternalType := hasExternalType(ext) + + if !isExternalType || extType.Embedded { if clear == nil { debugLog("known def type no clear: %q", def) return def, "", "" @@ -151,25 +157,51 @@ func knownDefGoType(def string, schema spec.Schema, clear func(string) string) ( debugLog("known def type clear: %q -> %q", def, clear(def)) return clear(def), "", "" } - xt := v.(map[string]interface{}) - t := xt["type"].(string) - impIface, ok := xt["import"] + // external type definition trumps regular type resolution + log.Printf("type %s imported as external type %s.%s", def, extType.Import.Package, extType.Type) + return extType.Import.Alias + "." + extType.Type, extType.Import.Package, extType.Import.Alias +} + +// x-go-type: +// type: mytype +// import: +// package: +// alias: +// hints: +// kind: map|object|array|interface|primitive|stream|tuple +// nullable: true|false +// embedded: true +type externalTypeDefinition struct { + Type string + Import struct { + Package string + Alias string + } + Hints struct { + Kind string + Nullable bool + } + Embedded bool +} + +func hasExternalType(ext spec.Extensions) (*externalTypeDefinition, bool) { + v, ok := ext[xGoType] if !ok { - return t, "", "" + return nil, false } - - imp := impIface.(map[string]interface{}) - pkg := imp["package"].(string) - al, ok := imp["alias"] - var alias string - if ok { - alias = al.(string) - } else { - alias = path.Base(pkg) + var extType externalTypeDefinition + err := mapstructure.Decode(v, &extType) + if err != nil { + log.Printf("warning: x-go-type extension could not be decoded (%v). Skipped", v) + return nil, false + } + if extType.Import.Package != "" && extType.Import.Alias == "" { + // NOTE(fred): possible name conflict here (TODO(fred): deconflict this default alias) + extType.Import.Alias = path.Base(extType.Import.Package) } - debugLog("known def type %s no clear: %q: pkg=%s, alias=%s", xGoType, alias+"."+t, pkg, alias) - return alias + "." + t, pkg, alias + debugLogAsJSON("known def external %s type", xGoType, extType) + return &extType, true } type typeResolver struct { @@ -218,40 +250,39 @@ func (t *typeResolver) IsNullable(schema *spec.Schema) bool { } func (t *typeResolver) resolveSchemaRef(schema *spec.Schema, isRequired bool) (returns bool, result resolvedType, err error) { - if schema.Ref.String() != "" { - debugLog("resolving ref (anon: %t, req: %t) %s", false, isRequired, schema.Ref.String()) - returns = true - var ref *spec.Schema - var er error - - ref, er = spec.ResolveRef(t.Doc.Spec(), &schema.Ref) - if er != nil { - debugLog("error resolving ref %s: %v", schema.Ref.String(), er) - err = er - return - } - res, er := t.ResolveSchema(ref, false, isRequired) - if er != nil { - err = er - return - } - result = res + if schema.Ref.String() == "" { + return + } + debugLog("resolving ref (anon: %t, req: %t) %s", false, isRequired, schema.Ref.String()) + returns = true + var ref *spec.Schema + var er error - tn := filepath.Base(schema.Ref.GetURL().Fragment) - tpe, pkg, alias := knownDefGoType(tn, *ref, t.goTypeName) - debugLog("type name %s, package %s, alias %s", tpe, pkg, alias) - if tpe != "" { - result.GoType = tpe - result.Pkg = pkg - result.PkgAlias = alias - } - result.HasDiscriminator = res.HasDiscriminator - result.IsBaseType = result.HasDiscriminator - result.IsNullable = t.IsNullable(ref) - //result.IsAliased = true + ref, er = spec.ResolveRef(t.Doc.Spec(), &schema.Ref) + if er != nil { + debugLog("error resolving ref %s: %v", schema.Ref.String(), er) + err = er return + } + res, er := t.ResolveSchema(ref, false, isRequired) + if er != nil { + err = er + return + } + result = res + tn := filepath.Base(schema.Ref.GetURL().Fragment) + tpe, pkg, alias := knownDefGoType(tn, *ref, t.goTypeName) + debugLog("type name %s, package %s, alias %s", tpe, pkg, alias) + if tpe != "" { + result.GoType = tpe + result.Pkg = pkg + result.PkgAlias = alias } + result.HasDiscriminator = res.HasDiscriminator + result.IsBaseType = result.HasDiscriminator + result.IsNullable = t.IsNullable(ref) + result.IsEnumCI = false return } @@ -293,6 +324,7 @@ func (t *typeResolver) resolveFormat(schema *spec.Schema, isAnonymous bool, isRe // TODO: should set IsCustomFormatter=false in this case. result.IsPrimitive = schFmt != binary result.IsStream = schFmt == binary + result.IsBase64 = schFmt == b64 // propagate extensions in resolvedType result.Extensions = schema.Extensions @@ -324,21 +356,6 @@ func (t *typeResolver) isNullable(schema *spec.Schema) bool { return len(schema.Properties) > 0 } -func setIsEmptyOmitted(result *resolvedType, schema *spec.Schema, tpe string) { - defaultValue := true - if tpe == array { - defaultValue = false - } - v, found := schema.Extensions[xOmitEmpty] - if !found { - result.IsEmptyOmitted = defaultValue - return - } - - omitted, cast := v.(bool) - result.IsEmptyOmitted = omitted && cast -} - func (t *typeResolver) firstType(schema *spec.Schema) string { if len(schema.Type) == 0 || schema.Type[0] == "" { return object @@ -396,6 +413,7 @@ func (t *typeResolver) resolveArray(schema *spec.Schema, isAnonymous, isRequired result.ElemType = &rt result.SwaggerType = array result.SwaggerFormat = "" + result.IsEnumCI = hasEnumCI(schema.Extensions) t.inferAliasing(&result, schema, isAnonymous, isRequired) result.Extensions = schema.Extensions @@ -627,29 +645,97 @@ func boolExtension(ext spec.Extensions, key string) *bool { return nil } +func hasEnumCI(ve spec.Extensions) bool { + v, ok := ve[xGoEnumCI] + if !ok { + return false + } + + isEnumCI, ok := v.(bool) + // All enumeration types are case-sensitive by default + return ok && isEnumCI +} + +func (t *typeResolver) shortCircuitResolveExternal(tpe, pkg, alias string, extType *externalTypeDefinition, schema *spec.Schema) resolvedType { + // short circuit type resolution for external types + var result resolvedType + result.Extensions = schema.Extensions + result.GoType = tpe + result.Pkg = pkg + result.PkgAlias = alias + result.setKind(extType.Hints.Kind) + result.IsNullable = t.IsNullable(schema) + + // other extensions + if result.IsArray { + result.IsEmptyOmitted = false + tpe = "array" + } + result.setExtensions(schema, tpe) + return result +} + func (t *typeResolver) ResolveSchema(schema *spec.Schema, isAnonymous, isRequired bool) (result resolvedType, err error) { debugLog("resolving schema (anon: %t, req: %t) %s", isAnonymous, isRequired, t.ModelName) + defer func() { + debugLog("returning after resolve schema: %s", pretty.Sprint(result)) + }() + if schema == nil { result.IsInterface = true result.GoType = iface return } - tpe := t.firstType(schema) - defer setIsEmptyOmitted(&result, schema, tpe) + extType, isExternalType := hasExternalType(schema.Extensions) + if isExternalType { + tpe, pkg, alias := knownDefGoType(t.ModelName, *schema, t.goTypeName) + debugLog("found type declared as external, imported from %s as %s. Has type hints? %t, rendered has embedded? %t", + pkg, tpe, extType.Hints.Kind != "", extType.Embedded) + + if extType.Hints.Kind != "" && !extType.Embedded { + // use hint to qualify type + debugLog("short circuits external type resolution with hint for %s", tpe) + result = t.shortCircuitResolveExternal(tpe, pkg, alias, extType, schema) + return + } + + // use spec to qualify type + debugLog("marking type %s as external embedded: %t", tpe, extType.Embedded) + // mark this type as an embedded external definition if requested + defer func() { + result.IsEmbedded = extType.Embedded + if result.IsEmbedded { + result.ElemType = &resolvedType{ + GoType: extType.Import.Alias + "." + extType.Type, + Pkg: extType.Import.Package, + PkgAlias: extType.Import.Alias, + IsNullable: extType.Hints.Nullable, + } + result.setKind(extType.Hints.Kind) + } + }() + } + tpe := t.firstType(schema) var returns bool + returns, result, err = t.resolveSchemaRef(schema, isRequired) + if returns { if !isAnonymous { result.IsMap = false result.IsComplexObject = true debugLog("not anonymous ref") } - debugLog("returning after ref") + debugLog("anonymous after ref") return } + defer func() { + result.setExtensions(schema, tpe) + }() + // special case of swagger type "file", rendered as io.ReadCloser interface if t.firstType(schema) == file { result.SwaggerType = file @@ -662,7 +748,6 @@ func (t *typeResolver) ResolveSchema(schema *spec.Schema, isAnonymous, isRequire returns, result, err = t.resolveFormat(schema, isAnonymous, isRequired) if returns { - debugLog("returning after resolve format: %s", pretty.Sprint(result)) return } @@ -671,7 +756,6 @@ func (t *typeResolver) ResolveSchema(schema *spec.Schema, isAnonymous, isRequire switch tpe { case array: result, err = t.resolveArray(schema, isAnonymous, false) - return case file, number, integer, boolean: result.Extensions = schema.Extensions @@ -690,7 +774,6 @@ func (t *typeResolver) ResolveSchema(schema *spec.Schema, isAnonymous, isRequire result.IsNullable = nullableNumber(schema, isRequired) case file: } - return case str: result.GoType = str @@ -704,23 +787,21 @@ func (t *typeResolver) ResolveSchema(schema *spec.Schema, isAnonymous, isRequire case object: result, err = t.resolveObject(schema, isAnonymous) if err != nil { - return resolvedType{}, err + result = resolvedType{} + break } result.HasDiscriminator = schema.Discriminator != "" - return case "null": result.GoType = iface result.SwaggerType = object result.IsNullable = false result.IsInterface = true - return default: err = fmt.Errorf("unresolvable: %v (format %q)", schema.Type, schema.Format) - return } - return result, err + return } // resolvedType is a swagger type that has been resolved and analyzed for usage @@ -736,6 +817,9 @@ type resolvedType struct { IsNullable bool IsStream bool IsEmptyOmitted bool + IsJSONString bool + IsEnumCI bool + IsBase64 bool // A tuple gets rendered as an anonymous struct with P{index} as property name IsTuple bool @@ -766,6 +850,11 @@ type resolvedType struct { // IsSuperAlias indicates that the aliased type is really the same type, // e.g. in golang, this translates to: type A = B IsSuperAlias bool + + // IsEmbedded applies to externally defined types. When embedded, a type + // is generated in models that embeds the external type, with the Validate + // method. + IsEmbedded bool } func (rt *resolvedType) Zero() string { @@ -799,3 +888,102 @@ func (rt *resolvedType) Zero() string { return "" } + +func (rt *resolvedType) setExtensions(schema *spec.Schema, origType string) { + rt.IsEnumCI = hasEnumCI(schema.Extensions) + rt.setIsEmptyOmitted(schema, origType) + rt.setIsJSONString(schema, origType) +} + +func (rt *resolvedType) setIsEmptyOmitted(schema *spec.Schema, tpe string) { + if v, found := schema.Extensions[xOmitEmpty]; found { + omitted, cast := v.(bool) + rt.IsEmptyOmitted = omitted && cast + return + } + // array of primitives are by default not empty-omitted, but arrays of aliased type are + rt.IsEmptyOmitted = (tpe != array) || (tpe == array && rt.IsAliased) +} + +func (rt *resolvedType) setIsJSONString(schema *spec.Schema, tpe string) { + _, found := schema.Extensions[xGoJSONString] + if !found { + rt.IsJSONString = false + return + } + rt.IsJSONString = true +} + +func (rt *resolvedType) setKind(kind string) { + if kind != "" { + debugLog("overriding kind for %s as %s", rt.GoType, kind) + } + switch kind { + case "map": + rt.IsMap = true + rt.IsArray = false + rt.IsComplexObject = false + rt.IsInterface = false + rt.IsStream = false + rt.IsTuple = false + rt.IsPrimitive = false + rt.SwaggerType = object + case "array": + rt.IsMap = false + rt.IsArray = true + rt.IsComplexObject = false + rt.IsInterface = false + rt.IsStream = false + rt.IsTuple = false + rt.IsPrimitive = false + rt.SwaggerType = array + case "object": + rt.IsMap = false + rt.IsArray = false + rt.IsComplexObject = true + rt.IsInterface = false + rt.IsStream = false + rt.IsTuple = false + rt.IsPrimitive = false + rt.SwaggerType = object + case "interface", "null": + rt.IsMap = false + rt.IsArray = false + rt.IsComplexObject = false + rt.IsInterface = true + rt.IsStream = false + rt.IsTuple = false + rt.IsPrimitive = false + rt.SwaggerType = iface + case "stream": + rt.IsMap = false + rt.IsArray = false + rt.IsComplexObject = false + rt.IsInterface = false + rt.IsStream = true + rt.IsTuple = false + rt.IsPrimitive = false + rt.SwaggerType = file + case "tuple": + rt.IsMap = false + rt.IsArray = false + rt.IsComplexObject = false + rt.IsInterface = false + rt.IsStream = false + rt.IsTuple = true + rt.IsPrimitive = false + rt.SwaggerType = array + case "primitive": + rt.IsMap = false + rt.IsArray = false + rt.IsComplexObject = false + rt.IsInterface = false + rt.IsStream = false + rt.IsTuple = false + rt.IsPrimitive = true + case "": + break + default: + log.Printf("warning: unsupported hint value for external type: %q. Skipped", kind) + } +} diff --git a/vendor/github.com/go-swagger/go-swagger/scan/enum.go b/vendor/github.com/go-swagger/go-swagger/scan/enum.go new file mode 100644 index 0000000000..bfbe601ed1 --- /dev/null +++ b/vendor/github.com/go-swagger/go-swagger/scan/enum.go @@ -0,0 +1,83 @@ +// +build !go1.11 + +package scan + +import ( + "go/ast" + "strconv" + "strings" + "unicode" +) + +func upperSnakeCase(s string) string { + in := []rune(s) + isLower := func(idx int) bool { + return idx >= 0 && idx < len(in) && unicode.IsLower(in[idx]) + } + + out := make([]rune, 0, len(in)+len(in)/2) + + for i, r := range in { + if unicode.IsUpper(r) { + r = unicode.ToLower(r) + if i > 0 && in[i-1] != '_' && (isLower(i-1) || isLower(i+1)) { + out = append(out, '_') + } + } + out = append(out, r) + } + + return strings.ToUpper(string(out)) +} + +func getEnumBasicLitValue(basicLit *ast.BasicLit) interface{} { + switch basicLit.Kind.String() { + case "INT": + if result, err := strconv.ParseInt(basicLit.Value, 10, 64); err == nil { + return result + } + case "FLOAT": + if result, err := strconv.ParseFloat(basicLit.Value, 64); err == nil { + return result + } + default: + return strings.Trim(basicLit.Value, "\"") + } + return nil +} + +func getEnumValues(file *ast.File, typeName string) (list []interface{}) { + for _, decl := range file.Decls { + genDecl, ok := decl.(*ast.GenDecl) + + if !ok { + continue + } + + if genDecl.Tok.String() == "const" { + for _, spec := range genDecl.Specs { + if valueSpec, ok := spec.(*ast.ValueSpec); ok { + switch valueSpec.Type.(type) { + case *ast.Ident: + if valueSpec.Type.(*ast.Ident).Name == typeName { + if basicLit, ok := valueSpec.Values[0].(*ast.BasicLit); ok { + list = append(list, getEnumBasicLitValue(basicLit)) + } + } + default: + var name = valueSpec.Names[0].Name + if strings.HasPrefix(name, upperSnakeCase(typeName)) { + var values = strings.SplitN(name, "__", 2) + if len(values) == 2 { + list = append(list, values[1]) + } + } + } + + } + + } + } + } + return +} diff --git a/vendor/github.com/go-swagger/go-swagger/scan/parameters.go b/vendor/github.com/go-swagger/go-swagger/scan/parameters.go index a97c34d1a5..00d79fc13b 100644 --- a/vendor/github.com/go-swagger/go-swagger/scan/parameters.go +++ b/vendor/github.com/go-swagger/go-swagger/scan/parameters.go @@ -40,6 +40,10 @@ func (pt paramTypable) Typed(tpe, format string) { pt.param.Typed(tpe, format) } +func (pt paramTypable) WithEnum(values ...interface{}) { + pt.param.WithEnum(values...) +} + func (pt paramTypable) SetRef(ref spec.Ref) { pt.param.Ref = ref } @@ -83,6 +87,10 @@ func (pt itemsTypable) SetRef(ref spec.Ref) { pt.items.Ref = ref } +func (pt itemsTypable) WithEnum(values ...interface{}) { + pt.items.WithEnum(values...) +} + func (pt itemsTypable) Schema() *spec.Schema { return nil } diff --git a/vendor/github.com/go-swagger/go-swagger/scan/responses.go b/vendor/github.com/go-swagger/go-swagger/scan/responses.go index 7b08b16b0c..3710ae0d8c 100644 --- a/vendor/github.com/go-swagger/go-swagger/scan/responses.go +++ b/vendor/github.com/go-swagger/go-swagger/scan/responses.go @@ -38,6 +38,10 @@ func (ht responseTypable) Typed(tpe, format string) { ht.header.Typed(tpe, format) } +func (ht responseTypable) WithEnum(values ...interface{}) { + ht.header.WithEnum(values) +} + func bodyTypable(in string, schema *spec.Schema) (swaggerTypable, *spec.Schema) { if in == "body" { // get the schema for items on the schema property @@ -85,6 +89,7 @@ func (ht responseTypable) Schema() *spec.Schema { func (ht responseTypable) SetSchema(schema *spec.Schema) { ht.response.Schema = schema } + func (ht responseTypable) CollectionOf(items *spec.Items, format string) { ht.header.CollectionOf(items, format) } diff --git a/vendor/github.com/go-swagger/go-swagger/scan/scanner.go b/vendor/github.com/go-swagger/go-swagger/scan/scanner.go index 98c5330587..283ee6a3d6 100644 --- a/vendor/github.com/go-swagger/go-swagger/scan/scanner.go +++ b/vendor/github.com/go-swagger/go-swagger/scan/scanner.go @@ -471,6 +471,7 @@ type swaggerTypable interface { Typed(string, string) SetRef(spec.Ref) Items() swaggerTypable + WithEnum(...interface{}) Schema() *spec.Schema Level() int } diff --git a/vendor/github.com/go-swagger/go-swagger/scan/schema.go b/vendor/github.com/go-swagger/go-swagger/scan/schema.go index 7fc14d6a98..fb85dd9b0c 100644 --- a/vendor/github.com/go-swagger/go-swagger/scan/schema.go +++ b/vendor/github.com/go-swagger/go-swagger/scan/schema.go @@ -81,8 +81,13 @@ func (st schemaTypable) AdditionalProperties() swaggerTypable { st.schema.Typed("object", "") return schemaTypable{st.schema.AdditionalProperties.Schema, st.level + 1} } + func (st schemaTypable) Level() int { return st.level } +func (st schemaTypable) WithEnum(values ...interface{}) { + st.schema.WithEnum(values...) +} + type schemaValidations struct { current *spec.Schema } @@ -248,6 +253,18 @@ func (scp *schemaParser) parseDecl(definitions map[string]spec.Schema, decl *sch return err } } + if enumName, ok := enumName(decl.Decl.Doc); ok { + var enumValues = getEnumValues(decl.File, enumName) + if len(enumValues) > 0 { + var typeName = reflect.TypeOf(enumValues[0]).String() + prop.WithEnum(enumValues...) + + err := swaggerSchemaForType(typeName, prop) + if err != nil { + return fmt.Errorf("file %s, error is: %v", decl.File.Name, err) + } + } + } case *ast.SelectorExpr: prop := &schemaTypable{schPtr, 0} if strfmtName, ok := strfmtName(decl.Decl.Doc); ok { @@ -1025,8 +1042,15 @@ func (scp *schemaParser) parseIdentProperty(pkg *loader.PackageInfo, expr *ast.I } if enumName, ok := enumName(gd.Doc); ok { - log.Println(enumName) - return nil + var enumValues = getEnumValues(file, enumName) + if len(enumValues) > 0 { + prop.WithEnum(enumValues...) + var typeName = reflect.TypeOf(enumValues[0]).String() + err := swaggerSchemaForType(typeName, prop) + if err != nil { + return fmt.Errorf("file %s, error is: %v", file.Name, err) + } + } } if defaultName, ok := defaultName(gd.Doc); ok { diff --git a/vendor/github.com/golang/protobuf/proto/deprecated.go b/vendor/github.com/golang/protobuf/proto/deprecated.go index a205482a32..e8db57e097 100644 --- a/vendor/github.com/golang/protobuf/proto/deprecated.go +++ b/vendor/github.com/golang/protobuf/proto/deprecated.go @@ -9,6 +9,8 @@ import ( "errors" "fmt" "strconv" + + protoV2 "google.golang.org/protobuf/proto" ) var ( @@ -82,11 +84,30 @@ func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, return val, nil } -// Deprecated: Do not use. +// Deprecated: Do not use; this type existed for intenal-use only. type InternalMessageInfo struct{} -func (*InternalMessageInfo) DiscardUnknown(Message) { panic("not implemented") } -func (*InternalMessageInfo) Marshal([]byte, Message, bool) ([]byte, error) { panic("not implemented") } -func (*InternalMessageInfo) Merge(Message, Message) { panic("not implemented") } -func (*InternalMessageInfo) Size(Message) int { panic("not implemented") } -func (*InternalMessageInfo) Unmarshal(Message, []byte) error { panic("not implemented") } +// Deprecated: Do not use; this method existed for intenal-use only. +func (*InternalMessageInfo) DiscardUnknown(m Message) { + DiscardUnknown(m) +} + +// Deprecated: Do not use; this method existed for intenal-use only. +func (*InternalMessageInfo) Marshal(b []byte, m Message, deterministic bool) ([]byte, error) { + return protoV2.MarshalOptions{Deterministic: deterministic}.MarshalAppend(b, MessageV2(m)) +} + +// Deprecated: Do not use; this method existed for intenal-use only. +func (*InternalMessageInfo) Merge(dst, src Message) { + protoV2.Merge(MessageV2(dst), MessageV2(src)) +} + +// Deprecated: Do not use; this method existed for intenal-use only. +func (*InternalMessageInfo) Size(m Message) int { + return protoV2.Size(MessageV2(m)) +} + +// Deprecated: Do not use; this method existed for intenal-use only. +func (*InternalMessageInfo) Unmarshal(m Message, b []byte) error { + return protoV2.UnmarshalOptions{Merge: true}.Unmarshal(b, MessageV2(m)) +} diff --git a/vendor/github.com/kr/pretty/License b/vendor/github.com/kr/pretty/License index 05c783ccf6..480a328059 100644 --- a/vendor/github.com/kr/pretty/License +++ b/vendor/github.com/kr/pretty/License @@ -1,5 +1,3 @@ -The MIT License (MIT) - Copyright 2012 Keith Rarick Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/vendor/github.com/kr/pretty/formatter.go b/vendor/github.com/kr/pretty/formatter.go index a317d7b8ee..df61d8d19e 100644 --- a/vendor/github.com/kr/pretty/formatter.go +++ b/vendor/github.com/kr/pretty/formatter.go @@ -125,7 +125,6 @@ func (p *printer) printValue(v reflect.Value, showType, quote bool) { } keys := v.MapKeys() for i := 0; i < v.Len(); i++ { - showTypeInStruct := true k := keys[i] mv := v.MapIndex(k) pp.printValue(k, false, true) @@ -133,7 +132,7 @@ func (p *printer) printValue(v reflect.Value, showType, quote bool) { if expand { writeByte(pp, '\t') } - showTypeInStruct = t.Elem().Kind() == reflect.Interface + showTypeInStruct := t.Elem().Kind() == reflect.Interface pp.printValue(mv, showTypeInStruct, true) if expand { io.WriteString(pp, ",\n") diff --git a/vendor/github.com/kr/pretty/go.mod b/vendor/github.com/kr/pretty/go.mod index 1e29533143..9a27b6e964 100644 --- a/vendor/github.com/kr/pretty/go.mod +++ b/vendor/github.com/kr/pretty/go.mod @@ -1,3 +1,5 @@ -module "github.com/kr/pretty" +module github.com/kr/pretty -require "github.com/kr/text" v0.1.0 +go 1.12 + +require github.com/kr/text v0.1.0 diff --git a/vendor/github.com/kr/pretty/go.sum b/vendor/github.com/kr/pretty/go.sum new file mode 100644 index 0000000000..714f82a201 --- /dev/null +++ b/vendor/github.com/kr/pretty/go.sum @@ -0,0 +1,3 @@ +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= diff --git a/vendor/github.com/kr/pretty/pretty.go b/vendor/github.com/kr/pretty/pretty.go index 49423ec7f5..b4ca583c02 100644 --- a/vendor/github.com/kr/pretty/pretty.go +++ b/vendor/github.com/kr/pretty/pretty.go @@ -75,7 +75,7 @@ func Printf(format string, a ...interface{}) (n int, errno error) { // Println pretty-prints its operands and writes to standard output. // -// Calling Print(x, y) is equivalent to +// Calling Println(x, y) is equivalent to // fmt.Println(Formatter(x), Formatter(y)), but each operand is // formatted with "%# v". func Println(a ...interface{}) (n int, errno error) { diff --git a/vendor/github.com/mailru/easyjson/.gitignore b/vendor/github.com/mailru/easyjson/.gitignore index 26156fb4b4..fbfaf7a3f4 100644 --- a/vendor/github.com/mailru/easyjson/.gitignore +++ b/vendor/github.com/mailru/easyjson/.gitignore @@ -3,3 +3,4 @@ *.iml .idea *.swp +bin/* diff --git a/vendor/github.com/mailru/easyjson/Makefile b/vendor/github.com/mailru/easyjson/Makefile index 7b9ac94535..80449f0d27 100644 --- a/vendor/github.com/mailru/easyjson/Makefile +++ b/vendor/github.com/mailru/easyjson/Makefile @@ -18,10 +18,13 @@ generate: build ./tests/custom_map_key_type.go \ ./tests/embedded_type.go \ ./tests/reference_to_pointer.go \ + ./tests/html.go \ + ./tests/unknown_fields.go \ bin/easyjson -all ./tests/data.go bin/easyjson -all ./tests/nothing.go bin/easyjson -all ./tests/errors.go + bin/easyjson -all ./tests/html.go bin/easyjson -snake_case ./tests/snake.go bin/easyjson -omit_empty ./tests/omitempty.go bin/easyjson -build_tags=use_easyjson ./benchmark/data.go @@ -32,6 +35,7 @@ generate: build bin/easyjson ./tests/reference_to_pointer.go bin/easyjson ./tests/key_marshaler_map.go bin/easyjson -disallow_unknown_fields ./tests/disallow_unknown.go + bin/easyjson ./tests/unknown_fields.go test: generate go test \ diff --git a/vendor/github.com/mailru/easyjson/helpers.go b/vendor/github.com/mailru/easyjson/helpers.go index b86b87d228..04ac635628 100644 --- a/vendor/github.com/mailru/easyjson/helpers.go +++ b/vendor/github.com/mailru/easyjson/helpers.go @@ -26,6 +26,16 @@ type Optional interface { IsDefined() bool } +// UnknownsUnmarshaler provides a method to unmarshal unknown struct fileds and save them as you want +type UnknownsUnmarshaler interface { + UnmarshalUnknown(in *jlexer.Lexer, key string) +} + +// UnknownsMarshaler provides a method to write additional struct fields +type UnknownsMarshaler interface { + MarshalUnknowns(w *jwriter.Writer, first bool) +} + // Marshal returns data as a single byte slice. Method is suboptimal as the data is likely to be copied // from a chain of smaller chunks. func Marshal(v Marshaler) ([]byte, error) { diff --git a/vendor/github.com/mailru/easyjson/jwriter/writer.go b/vendor/github.com/mailru/easyjson/jwriter/writer.go index b9ed7ccaa8..eb8547ccc2 100644 --- a/vendor/github.com/mailru/easyjson/jwriter/writer.go +++ b/vendor/github.com/mailru/easyjson/jwriter/writer.go @@ -270,16 +270,25 @@ func (w *Writer) Bool(v bool) { const chars = "0123456789abcdef" -func isNotEscapedSingleChar(c byte, escapeHTML bool) bool { - // Note: might make sense to use a table if there are more chars to escape. With 4 chars - // it benchmarks the same. - if escapeHTML { - return c != '<' && c != '>' && c != '&' && c != '\\' && c != '"' && c >= 0x20 && c < utf8.RuneSelf - } else { - return c != '\\' && c != '"' && c >= 0x20 && c < utf8.RuneSelf +func getTable(falseValues ...int) [128]bool { + table := [128]bool{} + + for i := 0; i < 128; i++ { + table[i] = true + } + + for _, v := range falseValues { + table[v] = false } + + return table } +var ( + htmlEscapeTable = getTable(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, '"', '&', '<', '>', '\\') + htmlNoEscapeTable = getTable(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, '"', '\\') +) + func (w *Writer) String(s string) { w.Buffer.AppendByte('"') @@ -288,15 +297,23 @@ func (w *Writer) String(s string) { p := 0 // last non-escape symbol + var escapeTable [128]bool + if w.NoEscapeHTML { + escapeTable = htmlNoEscapeTable + } else { + escapeTable = htmlEscapeTable + } + for i := 0; i < len(s); { c := s[i] - if isNotEscapedSingleChar(c, !w.NoEscapeHTML) { - // single-width character, no escaping is required - i++ - continue - } else if c < utf8.RuneSelf { - // single-with character, need to escape + if c < utf8.RuneSelf { + if escapeTable[c] { + // single-width character, no escaping is required + i++ + continue + } + w.Buffer.AppendString(s[p:i]) switch c { case '\t': diff --git a/vendor/github.com/mailru/easyjson/unknown_fields.go b/vendor/github.com/mailru/easyjson/unknown_fields.go new file mode 100644 index 0000000000..6cfdf8300b --- /dev/null +++ b/vendor/github.com/mailru/easyjson/unknown_fields.go @@ -0,0 +1,34 @@ +package easyjson + +import ( + json "encoding/json" + + jlexer "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// UnknownFieldsProxy implemets UnknownsUnmarshaler and UnknownsMarshaler +// use it as embedded field in your structure to parse and then serialize unknown struct fields +type UnknownFieldsProxy struct { + unknownFields map[string]interface{} +} + +func (s *UnknownFieldsProxy) UnmarshalUnknown(in *jlexer.Lexer, key string) { + if s.unknownFields == nil { + s.unknownFields = make(map[string]interface{}, 1) + } + s.unknownFields[key] = in.Interface() +} + +func (s UnknownFieldsProxy) MarshalUnknowns(out *jwriter.Writer, first bool) { + for key, val := range s.unknownFields { + if first { + first = false + } else { + out.RawByte(',') + } + out.String(string(key)) + out.RawByte(':') + out.Raw(json.Marshal(val)) + } +} diff --git a/vendor/github.com/mitchellh/mapstructure/.travis.yml b/vendor/github.com/mitchellh/mapstructure/.travis.yml index 1689c7d735..5e31a95a8b 100644 --- a/vendor/github.com/mitchellh/mapstructure/.travis.yml +++ b/vendor/github.com/mitchellh/mapstructure/.travis.yml @@ -1,8 +1,9 @@ language: go go: - - "1.11.x" + - "1.14.x" - tip script: - go test + - go test -bench . -benchmem diff --git a/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md b/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md index 3b3cb723f8..3378f7e66e 100644 --- a/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md +++ b/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md @@ -1,3 +1,39 @@ +## 1.3.2 + +* Decode into interface type with a struct value is supported [GH-187] + +## 1.3.1 + +* Squash should only squash embedded structs. [GH-194] + +## 1.3.0 + +* Added `",omitempty"` support. This will ignore zero values in the source + structure when encoding. [GH-145] + +## 1.2.3 + +* Fix duplicate entries in Keys list with pointer values. [GH-185] + +## 1.2.2 + +* Do not add unsettable (unexported) values to the unused metadata key + or "remain" value. [GH-150] + +## 1.2.1 + +* Go modules checksum mismatch fix + +## 1.2.0 + +* Added support to capture unused values in a field using the `",remain"` value + in the mapstructure tag. There is an example to showcase usage. +* Added `DecoderConfig` option to always squash embedded structs +* `json.Number` can decode into `uint` types +* Empty slices are preserved and not replaced with nil slices +* Fix panic that can occur in when decoding a map into a nil slice of structs +* Improved package documentation for godoc + ## 1.1.2 * Fix error when decode hook decodes interface implementation into interface diff --git a/vendor/github.com/mitchellh/mapstructure/go.mod b/vendor/github.com/mitchellh/mapstructure/go.mod index d2a7125620..a03ae97308 100644 --- a/vendor/github.com/mitchellh/mapstructure/go.mod +++ b/vendor/github.com/mitchellh/mapstructure/go.mod @@ -1 +1,3 @@ module github.com/mitchellh/mapstructure + +go 1.14 diff --git a/vendor/github.com/mitchellh/mapstructure/mapstructure.go b/vendor/github.com/mitchellh/mapstructure/mapstructure.go index 256ee63fbf..b384d9d928 100644 --- a/vendor/github.com/mitchellh/mapstructure/mapstructure.go +++ b/vendor/github.com/mitchellh/mapstructure/mapstructure.go @@ -1,10 +1,150 @@ -// Package mapstructure exposes functionality to convert an arbitrary -// map[string]interface{} into a native Go structure. +// Package mapstructure exposes functionality to convert one arbitrary +// Go type into another, typically to convert a map[string]interface{} +// into a native Go structure. // // The Go structure can be arbitrarily complex, containing slices, // other structs, etc. and the decoder will properly decode nested // maps and so on into the proper structures in the native Go struct. // See the examples to see what the decoder is capable of. +// +// The simplest function to start with is Decode. +// +// Field Tags +// +// When decoding to a struct, mapstructure will use the field name by +// default to perform the mapping. For example, if a struct has a field +// "Username" then mapstructure will look for a key in the source value +// of "username" (case insensitive). +// +// type User struct { +// Username string +// } +// +// You can change the behavior of mapstructure by using struct tags. +// The default struct tag that mapstructure looks for is "mapstructure" +// but you can customize it using DecoderConfig. +// +// Renaming Fields +// +// To rename the key that mapstructure looks for, use the "mapstructure" +// tag and set a value directly. For example, to change the "username" example +// above to "user": +// +// type User struct { +// Username string `mapstructure:"user"` +// } +// +// Embedded Structs and Squashing +// +// Embedded structs are treated as if they're another field with that name. +// By default, the two structs below are equivalent when decoding with +// mapstructure: +// +// type Person struct { +// Name string +// } +// +// type Friend struct { +// Person +// } +// +// type Friend struct { +// Person Person +// } +// +// This would require an input that looks like below: +// +// map[string]interface{}{ +// "person": map[string]interface{}{"name": "alice"}, +// } +// +// If your "person" value is NOT nested, then you can append ",squash" to +// your tag value and mapstructure will treat it as if the embedded struct +// were part of the struct directly. Example: +// +// type Friend struct { +// Person `mapstructure:",squash"` +// } +// +// Now the following input would be accepted: +// +// map[string]interface{}{ +// "name": "alice", +// } +// +// DecoderConfig has a field that changes the behavior of mapstructure +// to always squash embedded structs. +// +// Remainder Values +// +// If there are any unmapped keys in the source value, mapstructure by +// default will silently ignore them. You can error by setting ErrorUnused +// in DecoderConfig. If you're using Metadata you can also maintain a slice +// of the unused keys. +// +// You can also use the ",remain" suffix on your tag to collect all unused +// values in a map. The field with this tag MUST be a map type and should +// probably be a "map[string]interface{}" or "map[interface{}]interface{}". +// See example below: +// +// type Friend struct { +// Name string +// Other map[string]interface{} `mapstructure:",remain"` +// } +// +// Given the input below, Other would be populated with the other +// values that weren't used (everything but "name"): +// +// map[string]interface{}{ +// "name": "bob", +// "address": "123 Maple St.", +// } +// +// Omit Empty Values +// +// When decoding from a struct to any other value, you may use the +// ",omitempty" suffix on your tag to omit that value if it equates to +// the zero value. The zero value of all types is specified in the Go +// specification. +// +// For example, the zero type of a numeric type is zero ("0"). If the struct +// field value is zero and a numeric type, the field is empty, and it won't +// be encoded into the destination type. +// +// type Source { +// Age int `mapstructure:",omitempty"` +// } +// +// Unexported fields +// +// Since unexported (private) struct fields cannot be set outside the package +// where they are defined, the decoder will simply skip them. +// +// For this output type definition: +// +// type Exported struct { +// private string // this unexported field will be skipped +// Public string +// } +// +// Using this map as input: +// +// map[string]interface{}{ +// "private": "I will be ignored", +// "Public": "I made it through!", +// } +// +// The following struct will be decoded: +// +// type Exported struct { +// private: "" // field is left with an empty string (zero value) +// Public: "I made it through!" +// } +// +// Other Configuration +// +// mapstructure is highly configurable. See the DecoderConfig struct +// for other features and options that are supported. package mapstructure import ( @@ -80,6 +220,14 @@ type DecoderConfig struct { // WeaklyTypedInput bool + // Squash will squash embedded structs. A squash tag may also be + // added to an individual struct field using a tag. For example: + // + // type Parent struct { + // Child `mapstructure:",squash"` + // } + Squash bool + // Metadata is the struct that will contain extra metadata about // the decoding. If this is nil, then no metadata will be tracked. Metadata *Metadata @@ -271,6 +419,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e var err error outputKind := getKind(outVal) + addMetaKey := true switch outputKind { case reflect.Bool: err = d.decodeBool(name, input, outVal) @@ -289,7 +438,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e case reflect.Map: err = d.decodeMap(name, input, outVal) case reflect.Ptr: - err = d.decodePtr(name, input, outVal) + addMetaKey, err = d.decodePtr(name, input, outVal) case reflect.Slice: err = d.decodeSlice(name, input, outVal) case reflect.Array: @@ -303,7 +452,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e // If we reached here, then we successfully decoded SOMETHING, so // mark the key as used if we're tracking metainput. - if d.config.Metadata != nil && name != "" { + if addMetaKey && d.config.Metadata != nil && name != "" { d.config.Metadata.Keys = append(d.config.Metadata.Keys, name) } @@ -314,7 +463,34 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e // value to "data" of that type. func (d *Decoder) decodeBasic(name string, data interface{}, val reflect.Value) error { if val.IsValid() && val.Elem().IsValid() { - return d.decode(name, data, val.Elem()) + elem := val.Elem() + + // If we can't address this element, then its not writable. Instead, + // we make a copy of the value (which is a pointer and therefore + // writable), decode into that, and replace the whole value. + copied := false + if !elem.CanAddr() { + copied = true + + // Make *T + copy := reflect.New(elem.Type()) + + // *T = elem + copy.Elem().Set(elem) + + // Set elem so we decode into it + elem = copy + } + + // Decode. If we have an error then return. We also return right + // away if we're not a copy because that means we decoded directly. + if err := d.decode(name, data, elem); err != nil || !copied { + return err + } + + // If we're a copy, we need to set te final result + val.Set(elem.Elem()) + return nil } dataVal := reflect.ValueOf(data) @@ -438,6 +614,7 @@ func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) er func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) error { dataVal := reflect.Indirect(reflect.ValueOf(data)) dataKind := getKind(dataVal) + dataType := dataVal.Type() switch { case dataKind == reflect.Int: @@ -469,6 +646,18 @@ func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) e } else { return fmt.Errorf("cannot parse '%s' as uint: %s", name, err) } + case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": + jn := data.(json.Number) + i, err := jn.Int64() + if err != nil { + return fmt.Errorf( + "error decoding json.Number into %s: %s", name, err) + } + if i < 0 && !d.config.WeaklyTypedInput { + return fmt.Errorf("cannot parse '%s', %d overflows uint", + name, i) + } + val.SetUint(uint64(i)) default: return fmt.Errorf( "'%s' expected type '%s', got unconvertible type '%s'", @@ -678,27 +867,31 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re } tagValue := f.Tag.Get(d.config.TagName) - tagParts := strings.Split(tagValue, ",") + keyName := f.Name + // If Squash is set in the config, we squash the field down. + squash := d.config.Squash && v.Kind() == reflect.Struct && f.Anonymous // Determine the name of the key in the map - keyName := f.Name - if tagParts[0] != "" { - if tagParts[0] == "-" { + if index := strings.Index(tagValue, ","); index != -1 { + if tagValue[:index] == "-" { + continue + } + // If "omitempty" is specified in the tag, it ignores empty values. + if strings.Index(tagValue[index+1:], "omitempty") != -1 && isEmptyValue(v) { continue } - keyName = tagParts[0] - } - // If "squash" is specified in the tag, we squash the field down. - squash := false - for _, tag := range tagParts[1:] { - if tag == "squash" { - squash = true - break + // If "squash" is specified in the tag, we squash the field down. + squash = !squash && strings.Index(tagValue[index+1:], "squash") != -1 + if squash && v.Kind() != reflect.Struct { + return fmt.Errorf("cannot squash non-struct type '%s'", v.Type()) } - } - if squash && v.Kind() != reflect.Struct { - return fmt.Errorf("cannot squash non-struct type '%s'", v.Type()) + keyName = tagValue[:index] + } else if len(tagValue) > 0 { + if tagValue == "-" { + continue + } + keyName = tagValue } switch v.Kind() { @@ -738,7 +931,7 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re return nil } -func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) error { +func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) (bool, error) { // If the input data is nil, then we want to just set the output // pointer to be nil as well. isNil := data == nil @@ -759,7 +952,7 @@ func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) er val.Set(nilValue) } - return nil + return true, nil } // Create an element of the concrete (non pointer) type and decode @@ -773,16 +966,16 @@ func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) er } if err := d.decode(name, data, reflect.Indirect(realVal)); err != nil { - return err + return false, err } val.Set(realVal) } else { if err := d.decode(name, data, reflect.Indirect(val)); err != nil { - return err + return false, err } } - return nil + return false, nil } func (d *Decoder) decodeFunc(name string, data interface{}, val reflect.Value) error { @@ -805,8 +998,8 @@ func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) valElemType := valType.Elem() sliceType := reflect.SliceOf(valElemType) - valSlice := val - if valSlice.IsNil() || d.config.ZeroFields { + // If we have a non array/slice type then we first attempt to convert. + if dataValKind != reflect.Array && dataValKind != reflect.Slice { if d.config.WeaklyTypedInput { switch { // Slice and array we use the normal logic @@ -833,18 +1026,17 @@ func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) } } - // Check input type - if dataValKind != reflect.Array && dataValKind != reflect.Slice { - return fmt.Errorf( - "'%s': source data must be an array or slice, got %s", name, dataValKind) - - } + return fmt.Errorf( + "'%s': source data must be an array or slice, got %s", name, dataValKind) + } - // If the input value is empty, then don't allocate since non-nil != nil - if dataVal.Len() == 0 { - return nil - } + // If the input value is nil, then don't allocate since empty != nil + if dataVal.IsNil() { + return nil + } + valSlice := val + if valSlice.IsNil() || d.config.ZeroFields { // Make a new slice to hold our result, same size as the original data. valSlice = reflect.MakeSlice(sliceType, dataVal.Len(), dataVal.Len()) } @@ -1005,6 +1197,11 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e field reflect.StructField val reflect.Value } + + // remainField is set to a valid field set with the "remain" tag if + // we are keeping track of remaining values. + var remainField *field + fields := []field{} for len(structs) > 0 { structVal := structs[0] @@ -1017,13 +1214,21 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e fieldKind := fieldType.Type.Kind() // If "squash" is specified in the tag, we squash the field down. - squash := false + squash := d.config.Squash && fieldKind == reflect.Struct && fieldType.Anonymous + remain := false + + // We always parse the tags cause we're looking for other tags too tagParts := strings.Split(fieldType.Tag.Get(d.config.TagName), ",") for _, tag := range tagParts[1:] { if tag == "squash" { squash = true break } + + if tag == "remain" { + remain = true + break + } } if squash { @@ -1036,8 +1241,13 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e continue } - // Normal struct field, store it away - fields = append(fields, field{fieldType, structVal.Field(i)}) + // Build our field + if remain { + remainField = &field{fieldType, structVal.Field(i)} + } else { + // Normal struct field, store it away + fields = append(fields, field{fieldType, structVal.Field(i)}) + } } } @@ -1078,9 +1288,6 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e } } - // Delete the key we're using from the unused map so we stop tracking - delete(dataValKeysUnused, rawMapKey.Interface()) - if !fieldValue.IsValid() { // This should never happen panic("field is not valid") @@ -1092,6 +1299,9 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e continue } + // Delete the key we're using from the unused map so we stop tracking + delete(dataValKeysUnused, rawMapKey.Interface()) + // If the name is empty string, then we're at the root, and we // don't dot-join the fields. if name != "" { @@ -1103,6 +1313,25 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e } } + // If we have a "remain"-tagged field and we have unused keys then + // we put the unused keys directly into the remain field. + if remainField != nil && len(dataValKeysUnused) > 0 { + // Build a map of only the unused values + remain := map[interface{}]interface{}{} + for key := range dataValKeysUnused { + remain[key] = dataVal.MapIndex(reflect.ValueOf(key)).Interface() + } + + // Decode it as-if we were just decoding this map onto our map. + if err := d.decodeMap(name, remain, remainField.val); err != nil { + errors = appendErrors(errors, err) + } + + // Set the map to nil so we have none so that the next check will + // not error (ErrorUnused) + dataValKeysUnused = nil + } + if d.config.ErrorUnused && len(dataValKeysUnused) > 0 { keys := make([]string, 0, len(dataValKeysUnused)) for rawKey := range dataValKeysUnused { @@ -1133,6 +1362,24 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e return nil } +func isEmptyValue(v reflect.Value) bool { + switch getKind(v) { + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + return v.Len() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + } + return false +} + func getKind(val reflect.Value) reflect.Kind { kind := val.Kind() diff --git a/vendor/github.com/pelletier/go-toml/.travis.yml b/vendor/github.com/pelletier/go-toml/.travis.yml deleted file mode 100644 index abb03e997b..0000000000 --- a/vendor/github.com/pelletier/go-toml/.travis.yml +++ /dev/null @@ -1,22 +0,0 @@ -sudo: false -language: go -go: - - 1.11.x - - 1.12.x - - tip -matrix: - allow_failures: - - go: tip - fast_finish: true -env: - - GO111MODULE=on -script: - - if [ -n "$(go fmt ./...)" ]; then exit 1; fi - - go test github.com/pelletier/go-toml -race -coverprofile=coverage.txt -covermode=atomic - - go test github.com/pelletier/go-toml/cmd/tomljson - - go test github.com/pelletier/go-toml/cmd/tomll - - go test github.com/pelletier/go-toml/query - - ./benchmark.sh $TRAVIS_BRANCH https://github.com/$TRAVIS_REPO_SLUG.git - -after_success: - - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/pelletier/go-toml/Dockerfile b/vendor/github.com/pelletier/go-toml/Dockerfile index 8f439d4791..fffdb01666 100644 --- a/vendor/github.com/pelletier/go-toml/Dockerfile +++ b/vendor/github.com/pelletier/go-toml/Dockerfile @@ -8,3 +8,4 @@ RUN go install ./... FROM scratch COPY --from=builder /go/bin/tomll /usr/bin/tomll COPY --from=builder /go/bin/tomljson /usr/bin/tomljson +COPY --from=builder /go/bin/jsontoml /usr/bin/jsontoml diff --git a/vendor/github.com/pelletier/go-toml/Makefile b/vendor/github.com/pelletier/go-toml/Makefile new file mode 100644 index 0000000000..9e4503aea6 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/Makefile @@ -0,0 +1,29 @@ +export CGO_ENABLED=0 +go := go +go.goos ?= $(shell echo `go version`|cut -f4 -d ' '|cut -d '/' -f1) +go.goarch ?= $(shell echo `go version`|cut -f4 -d ' '|cut -d '/' -f2) + +out.tools := tomll tomljson jsontoml +out.dist := $(out.tools:=_$(go.goos)_$(go.goarch).tar.xz) +sources := $(wildcard **/*.go) + + +.PHONY: +tools: $(out.tools) + +$(out.tools): $(sources) + GOOS=$(go.goos) GOARCH=$(go.goarch) $(go) build ./cmd/$@ + +.PHONY: +dist: $(out.dist) + +$(out.dist):%_$(go.goos)_$(go.goarch).tar.xz: % + if [ "$(go.goos)" = "windows" ]; then \ + tar -cJf $@ $^.exe; \ + else \ + tar -cJf $@ $^; \ + fi + +.PHONY: +clean: + rm -rf $(out.tools) $(out.dist) diff --git a/vendor/github.com/pelletier/go-toml/README.md b/vendor/github.com/pelletier/go-toml/README.md index f0311b99c4..6831deb5bd 100644 --- a/vendor/github.com/pelletier/go-toml/README.md +++ b/vendor/github.com/pelletier/go-toml/README.md @@ -3,12 +3,11 @@ Go library for the [TOML](https://github.com/mojombo/toml) format. This library supports TOML version -[v0.4.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md) +[v1.0.0-rc.1](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v1.0.0-rc.1.md) [![GoDoc](https://godoc.org/github.com/pelletier/go-toml?status.svg)](http://godoc.org/github.com/pelletier/go-toml) [![license](https://img.shields.io/github/license/pelletier/go-toml.svg)](https://github.com/pelletier/go-toml/blob/master/LICENSE) -[![Build Status](https://travis-ci.org/pelletier/go-toml.svg?branch=master)](https://travis-ci.org/pelletier/go-toml) -[![Windows Build status](https://ci.appveyor.com/api/projects/status/4aepwwjori266hkt/branch/master?svg=true)](https://ci.appveyor.com/project/pelletier/go-toml/branch/master) +[![Build Status](https://dev.azure.com/pelletierthomas/go-toml-ci/_apis/build/status/pelletier.go-toml?branchName=master)](https://dev.azure.com/pelletierthomas/go-toml-ci/_build/latest?definitionId=1&branchName=master) [![codecov](https://codecov.io/gh/pelletier/go-toml/branch/master/graph/badge.svg)](https://codecov.io/gh/pelletier/go-toml) [![Go Report Card](https://goreportcard.com/badge/github.com/pelletier/go-toml)](https://goreportcard.com/report/github.com/pelletier/go-toml) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fpelletier%2Fgo-toml.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fpelletier%2Fgo-toml?ref=badge_shield) @@ -19,7 +18,7 @@ Go-toml provides the following features for using data parsed from TOML document * Load TOML documents from files and string data * Easily navigate TOML structure using Tree -* Mashaling and unmarshaling to and from data structures +* Marshaling and unmarshaling to and from data structures * Line & column position data for all parsed elements * [Query support similar to JSON-Path](query/) * Syntax errors contain line and column numbers @@ -75,7 +74,7 @@ Or use a query: q, _ := query.Compile("$..[user,password]") results := q.Execute(config) for ii, item := range results.Values() { - fmt.Println("Query result %d: %v", ii, item) + fmt.Printf("Query result %d: %v\n", ii, item) } ``` @@ -88,7 +87,7 @@ The documentation and additional examples are available at Go-toml provides two handy command line tools: -* `tomll`: Reads TOML files and lint them. +* `tomll`: Reads TOML files and lints them. ``` go install github.com/pelletier/go-toml/cmd/tomll @@ -101,6 +100,13 @@ Go-toml provides two handy command line tools: tomljson --help ``` + * `jsontoml`: Reads a JSON file and outputs a TOML representation. + + ``` + go install github.com/pelletier/go-toml/cmd/jsontoml + jsontoml --help + ``` + ### Docker image Those tools are also availble as a Docker image from diff --git a/vendor/github.com/pelletier/go-toml/appveyor.yml b/vendor/github.com/pelletier/go-toml/appveyor.yml deleted file mode 100644 index 40e8a41596..0000000000 --- a/vendor/github.com/pelletier/go-toml/appveyor.yml +++ /dev/null @@ -1,34 +0,0 @@ -version: "{build}" - -# Source Config -clone_folder: c:\gopath\src\github.com\pelletier\go-toml - -# Build host -environment: - GOPATH: c:\gopath - DEPTESTBYPASS501: 1 - GOVERSION: 1.12 - GO111MODULE: on - -init: - - git config --global core.autocrlf input - -# Build -install: - # Install the specific Go version. - - rmdir c:\go /s /q - - appveyor DownloadFile https://storage.googleapis.com/golang/go%GOVERSION%.windows-amd64.msi - - msiexec /i go%GOVERSION%.windows-amd64.msi /q - - choco install bzr - - set Path=c:\go\bin;c:\gopath\bin;C:\Program Files (x86)\Bazaar\;C:\Program Files\Mercurial\%Path% - - go version - - go env - -build: false -deploy: false - -test_script: - - go test github.com/pelletier/go-toml - - go test github.com/pelletier/go-toml/cmd/tomljson - - go test github.com/pelletier/go-toml/cmd/tomll - - go test github.com/pelletier/go-toml/query diff --git a/vendor/github.com/pelletier/go-toml/azure-pipelines.yml b/vendor/github.com/pelletier/go-toml/azure-pipelines.yml new file mode 100644 index 0000000000..242b5b5403 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/azure-pipelines.yml @@ -0,0 +1,230 @@ +trigger: +- master + +stages: +- stage: fuzzit + displayName: "Run Fuzzit" + dependsOn: [] + condition: and(succeeded(), eq(variables['Build.SourceBranchName'], 'master')) + jobs: + - job: submit + displayName: "Submit" + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go 1.14" + inputs: + version: "1.14" + - script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/" + - script: mkdir -p ${HOME}/go/src/github.com/pelletier/go-toml + - script: cp -R . ${HOME}/go/src/github.com/pelletier/go-toml + - task: Bash@3 + inputs: + filePath: './fuzzit.sh' + env: + TYPE: fuzzing + FUZZIT_API_KEY: $(FUZZIT_API_KEY) + +- stage: run_checks + displayName: "Check" + dependsOn: [] + jobs: + - job: fmt + displayName: "fmt" + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go 1.14" + inputs: + version: "1.14" + - task: Go@0 + displayName: "go fmt ./..." + inputs: + command: 'custom' + customCommand: 'fmt' + arguments: './...' + - job: coverage + displayName: "coverage" + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go 1.14" + inputs: + version: "1.14" + - task: Go@0 + displayName: "Generate coverage" + inputs: + command: 'test' + arguments: "-race -coverprofile=coverage.txt -covermode=atomic" + - task: Bash@3 + inputs: + targetType: 'inline' + script: 'bash <(curl -s https://codecov.io/bash) -t ${CODECOV_TOKEN}' + env: + CODECOV_TOKEN: $(CODECOV_TOKEN) + - job: benchmark + displayName: "benchmark" + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go 1.14" + inputs: + version: "1.14" + - script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/" + - task: Bash@3 + inputs: + filePath: './benchmark.sh' + arguments: "master $(Build.Repository.Uri)" + + - job: fuzzing + displayName: "fuzzing" + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go 1.14" + inputs: + version: "1.14" + - script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/" + - script: mkdir -p ${HOME}/go/src/github.com/pelletier/go-toml + - script: cp -R . ${HOME}/go/src/github.com/pelletier/go-toml + - task: Bash@3 + inputs: + filePath: './fuzzit.sh' + env: + TYPE: local-regression + + - job: go_unit_tests + displayName: "unit tests" + strategy: + matrix: + linux 1.14: + goVersion: '1.14' + imageName: 'ubuntu-latest' + mac 1.14: + goVersion: '1.14' + imageName: 'macOS-latest' + windows 1.14: + goVersion: '1.14' + imageName: 'windows-latest' + linux 1.13: + goVersion: '1.13' + imageName: 'ubuntu-latest' + mac 1.13: + goVersion: '1.13' + imageName: 'macOS-latest' + windows 1.13: + goVersion: '1.13' + imageName: 'windows-latest' + pool: + vmImage: $(imageName) + steps: + - task: GoTool@0 + displayName: "Install Go $(goVersion)" + inputs: + version: $(goVersion) + - task: Go@0 + displayName: "go test ./..." + inputs: + command: 'test' + arguments: './...' +- stage: build_binaries + displayName: "Build binaries" + dependsOn: run_checks + jobs: + - job: build_binary + displayName: "Build binary" + strategy: + matrix: + linux_amd64: + GOOS: linux + GOARCH: amd64 + darwin_amd64: + GOOS: darwin + GOARCH: amd64 + windows_amd64: + GOOS: windows + GOARCH: amd64 + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go" + inputs: + version: 1.14 + - task: Bash@3 + inputs: + targetType: inline + script: "make dist" + env: + go.goos: $(GOOS) + go.goarch: $(GOARCH) + - task: CopyFiles@2 + inputs: + sourceFolder: '$(Build.SourcesDirectory)' + contents: '*.tar.xz' + TargetFolder: '$(Build.ArtifactStagingDirectory)' + - task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: '$(Build.ArtifactStagingDirectory)' + artifactName: binaries +- stage: build_binaries_manifest + displayName: "Build binaries manifest" + dependsOn: build_binaries + jobs: + - job: build_manifest + displayName: "Build binaries manifest" + steps: + - task: DownloadBuildArtifacts@0 + inputs: + buildType: 'current' + downloadType: 'single' + artifactName: 'binaries' + downloadPath: '$(Build.SourcesDirectory)' + - task: Bash@3 + inputs: + targetType: inline + script: "cd binaries && sha256sum --binary *.tar.xz | tee $(Build.ArtifactStagingDirectory)/sha256sums.txt" + - task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: '$(Build.ArtifactStagingDirectory)' + artifactName: manifest + +- stage: build_docker_image + displayName: "Build Docker image" + dependsOn: run_checks + jobs: + - job: build + displayName: "Build" + pool: + vmImage: ubuntu-latest + steps: + - task: Docker@2 + inputs: + command: 'build' + Dockerfile: 'Dockerfile' + buildContext: '.' + addPipelineData: false + +- stage: publish_docker_image + displayName: "Publish Docker image" + dependsOn: build_docker_image + condition: and(succeeded(), eq(variables['Build.SourceBranchName'], 'master')) + jobs: + - job: publish + displayName: "Publish" + pool: + vmImage: ubuntu-latest + steps: + - task: Docker@2 + inputs: + containerRegistry: 'DockerHub' + repository: 'pelletier/go-toml' + command: 'buildAndPush' + Dockerfile: 'Dockerfile' + buildContext: '.' + tags: 'latest' diff --git a/vendor/github.com/pelletier/go-toml/benchmark.sh b/vendor/github.com/pelletier/go-toml/benchmark.sh index 8b8bb528e7..7914fff49c 100644 --- a/vendor/github.com/pelletier/go-toml/benchmark.sh +++ b/vendor/github.com/pelletier/go-toml/benchmark.sh @@ -1,6 +1,6 @@ #!/bin/bash -set -e +set -ex reference_ref=${1:-master} reference_git=${2:-.} @@ -8,7 +8,6 @@ reference_git=${2:-.} if ! `hash benchstat 2>/dev/null`; then echo "Installing benchstat" go get golang.org/x/perf/cmd/benchstat - go install golang.org/x/perf/cmd/benchstat fi tempdir=`mktemp -d /tmp/go-toml-benchmark-XXXXXX` @@ -29,4 +28,4 @@ go test -bench=. -benchmem | tee ${local_benchmark} echo "" echo "=== diff" -benchstat -delta-test=none ${ref_benchmark} ${local_benchmark}
\ No newline at end of file +benchstat -delta-test=none ${ref_benchmark} ${local_benchmark} diff --git a/vendor/github.com/pelletier/go-toml/doc.go b/vendor/github.com/pelletier/go-toml/doc.go index d5fd98c021..a1406a32b3 100644 --- a/vendor/github.com/pelletier/go-toml/doc.go +++ b/vendor/github.com/pelletier/go-toml/doc.go @@ -1,7 +1,7 @@ // Package toml is a TOML parser and manipulation library. // // This version supports the specification as described in -// https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md +// https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.5.0.md // // Marshaling // diff --git a/vendor/github.com/pelletier/go-toml/example-crlf.toml b/vendor/github.com/pelletier/go-toml/example-crlf.toml index 12950a163d..780d9c68f2 100644 --- a/vendor/github.com/pelletier/go-toml/example-crlf.toml +++ b/vendor/github.com/pelletier/go-toml/example-crlf.toml @@ -27,3 +27,4 @@ enabled = true [clients]
data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it
+score = 4e-08 # to make sure leading zeroes in exponent parts of floats are supported
\ No newline at end of file diff --git a/vendor/github.com/pelletier/go-toml/example.toml b/vendor/github.com/pelletier/go-toml/example.toml index 3d902f2820..f45bf88b8f 100644 --- a/vendor/github.com/pelletier/go-toml/example.toml +++ b/vendor/github.com/pelletier/go-toml/example.toml @@ -27,3 +27,4 @@ enabled = true [clients] data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it +score = 4e-08 # to make sure leading zeroes in exponent parts of floats are supported
\ No newline at end of file diff --git a/vendor/github.com/pelletier/go-toml/fuzzit.sh b/vendor/github.com/pelletier/go-toml/fuzzit.sh new file mode 100644 index 0000000000..b575a6081f --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/fuzzit.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -xe + +# go-fuzz doesn't support modules yet, so ensure we do everything +# in the old style GOPATH way +export GO111MODULE="off" + +# install go-fuzz +go get -u github.com/dvyukov/go-fuzz/go-fuzz github.com/dvyukov/go-fuzz/go-fuzz-build + +# target name can only contain lower-case letters (a-z), digits (0-9) and a dash (-) +# to add another target, make sure to create it with `fuzzit create target` +# before using `fuzzit create job` +TARGET=toml-fuzzer + +go-fuzz-build -libfuzzer -o ${TARGET}.a github.com/pelletier/go-toml +clang -fsanitize=fuzzer ${TARGET}.a -o ${TARGET} + +# install fuzzit for talking to fuzzit.dev service +# or latest version: +# https://github.com/fuzzitdev/fuzzit/releases/latest/download/fuzzit_Linux_x86_64 +wget -q -O fuzzit https://github.com/fuzzitdev/fuzzit/releases/download/v2.4.52/fuzzit_Linux_x86_64 +chmod a+x fuzzit + +# TODO: change kkowalczyk to go-toml and create toml-fuzzer target there +./fuzzit create job --type $TYPE go-toml/${TARGET} ${TARGET} diff --git a/vendor/github.com/pelletier/go-toml/go.mod b/vendor/github.com/pelletier/go-toml/go.mod index f4690e19d3..c7faa6b3e1 100644 --- a/vendor/github.com/pelletier/go-toml/go.mod +++ b/vendor/github.com/pelletier/go-toml/go.mod @@ -5,5 +5,5 @@ go 1.12 require ( github.com/BurntSushi/toml v0.3.1 github.com/davecgh/go-spew v1.1.1 - gopkg.in/yaml.v2 v2.2.2 + gopkg.in/yaml.v2 v2.3.0 ) diff --git a/vendor/github.com/pelletier/go-toml/go.sum b/vendor/github.com/pelletier/go-toml/go.sum index 8d91a47853..6f356470d7 100644 --- a/vendor/github.com/pelletier/go-toml/go.sum +++ b/vendor/github.com/pelletier/go-toml/go.sum @@ -5,3 +5,15 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3 h1:fvjTMHxHEw/mxHbtzPi3JCcKXQRAnQTBRo6YCJSVHKI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/pelletier/go-toml/keysparsing.go b/vendor/github.com/pelletier/go-toml/keysparsing.go index e923bc4f9b..e091500b24 100644 --- a/vendor/github.com/pelletier/go-toml/keysparsing.go +++ b/vendor/github.com/pelletier/go-toml/keysparsing.go @@ -5,7 +5,6 @@ package toml import ( "errors" "fmt" - "unicode" ) // Convert the bare key group string to an array. @@ -109,5 +108,5 @@ func parseKey(key string) ([]string, error) { } func isValidBareChar(r rune) bool { - return isAlphanumeric(r) || r == '-' || unicode.IsNumber(r) + return isAlphanumeric(r) || r == '-' || isDigit(r) } diff --git a/vendor/github.com/pelletier/go-toml/lexer.go b/vendor/github.com/pelletier/go-toml/lexer.go index 6254d390dc..425e847a7a 100644 --- a/vendor/github.com/pelletier/go-toml/lexer.go +++ b/vendor/github.com/pelletier/go-toml/lexer.go @@ -26,7 +26,7 @@ type tomlLexer struct { currentTokenStart int currentTokenStop int tokens []token - depth int + brackets []rune line int col int endbufferLine int @@ -123,6 +123,8 @@ func (l *tomlLexer) lexVoid() tomlLexStateFn { for { next := l.peek() switch next { + case '}': // after '{' + return l.lexRightCurlyBrace case '[': return l.lexTableKey case '#': @@ -140,10 +142,6 @@ func (l *tomlLexer) lexVoid() tomlLexStateFn { l.skip() } - if l.depth > 0 { - return l.lexRvalue - } - if isKeyStartChar(next) { return l.lexKey } @@ -167,10 +165,8 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn { case '=': return l.lexEqual case '[': - l.depth++ return l.lexLeftBracket case ']': - l.depth-- return l.lexRightBracket case '{': return l.lexLeftCurlyBrace @@ -188,12 +184,10 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn { fallthrough case '\n': l.skip() - if l.depth == 0 { - return l.lexVoid + if len(l.brackets) > 0 && l.brackets[len(l.brackets)-1] == '[' { + return l.lexRvalue } - return l.lexRvalue - case '_': - return l.errorf("cannot start number with underscore") + return l.lexVoid } if l.follow("true") { @@ -223,9 +217,12 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn { } possibleDate := l.peekString(35) - dateMatch := dateRegexp.FindString(possibleDate) - if dateMatch != "" { - l.fastForward(len(dateMatch)) + dateSubmatches := dateRegexp.FindStringSubmatch(possibleDate) + if dateSubmatches != nil && dateSubmatches[0] != "" { + l.fastForward(len(dateSubmatches[0])) + if dateSubmatches[2] == "" { // no timezone information => local date + return l.lexLocalDate + } return l.lexDate } @@ -233,10 +230,6 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn { return l.lexNumber } - if isAlphanumeric(next) { - return l.lexKey - } - return l.errorf("no value can start with %c", next) } @@ -247,12 +240,17 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn { func (l *tomlLexer) lexLeftCurlyBrace() tomlLexStateFn { l.next() l.emit(tokenLeftCurlyBrace) - return l.lexRvalue + l.brackets = append(l.brackets, '{') + return l.lexVoid } func (l *tomlLexer) lexRightCurlyBrace() tomlLexStateFn { l.next() l.emit(tokenRightCurlyBrace) + if len(l.brackets) == 0 || l.brackets[len(l.brackets)-1] != '{' { + return l.errorf("cannot have '}' here") + } + l.brackets = l.brackets[:len(l.brackets)-1] return l.lexRvalue } @@ -261,6 +259,11 @@ func (l *tomlLexer) lexDate() tomlLexStateFn { return l.lexRvalue } +func (l *tomlLexer) lexLocalDate() tomlLexStateFn { + l.emit(tokenLocalDate) + return l.lexRvalue +} + func (l *tomlLexer) lexTrue() tomlLexStateFn { l.fastForward(4) l.emit(tokenTrue) @@ -294,6 +297,9 @@ func (l *tomlLexer) lexEqual() tomlLexStateFn { func (l *tomlLexer) lexComma() tomlLexStateFn { l.next() l.emit(tokenComma) + if len(l.brackets) > 0 && l.brackets[len(l.brackets)-1] == '{' { + return l.lexVoid + } return l.lexRvalue } @@ -324,7 +330,26 @@ func (l *tomlLexer) lexKey() tomlLexStateFn { } else if r == '\n' { return l.errorf("keys cannot contain new lines") } else if isSpace(r) { - break + str := " " + // skip trailing whitespace + l.next() + for r = l.peek(); isSpace(r); r = l.peek() { + str += string(r) + l.next() + } + // break loop if not a dot + if r != '.' { + break + } + str += "." + // skip trailing whitespace after dot + l.next() + for r = l.peek(); isSpace(r); r = l.peek() { + str += string(r) + l.next() + } + growingString += str + continue } else if r == '.' { // skip } else if !isValidBareChar(r) { @@ -353,6 +378,7 @@ func (l *tomlLexer) lexComment(previousState tomlLexStateFn) tomlLexStateFn { func (l *tomlLexer) lexLeftBracket() tomlLexStateFn { l.next() l.emit(tokenLeftBracket) + l.brackets = append(l.brackets, '[') return l.lexRvalue } @@ -504,7 +530,7 @@ func (l *tomlLexer) lexStringAsString(terminator string, discardLeadingNewLine, } else { r := l.peek() - if 0x00 <= r && r <= 0x1F && !(acceptNewLines && (r == '\n' || r == '\r')) { + if 0x00 <= r && r <= 0x1F && r != '\t' && !(acceptNewLines && (r == '\n' || r == '\r')) { return "", fmt.Errorf("unescaped control character %U", r) } l.next() @@ -535,7 +561,6 @@ func (l *tomlLexer) lexString() tomlLexStateFn { } str, err := l.lexStringAsString(terminator, discardLeadingNewLine, acceptNewLines) - if err != nil { return l.errorf(err.Error()) } @@ -607,6 +632,10 @@ func (l *tomlLexer) lexInsideTableKey() tomlLexStateFn { func (l *tomlLexer) lexRightBracket() tomlLexStateFn { l.next() l.emit(tokenRightBracket) + if len(l.brackets) == 0 || l.brackets[len(l.brackets)-1] != '[' { + return l.errorf("cannot have ']' here") + } + l.brackets = l.brackets[:len(l.brackets)-1] return l.lexRvalue } @@ -733,7 +762,27 @@ func (l *tomlLexer) run() { } func init() { - dateRegexp = regexp.MustCompile(`^\d{1,4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})`) + // Regexp for all date/time formats supported by TOML. + // Group 1: nano precision + // Group 2: timezone + // + // /!\ also matches the empty string + // + // Example matches: + //1979-05-27T07:32:00Z + //1979-05-27T00:32:00-07:00 + //1979-05-27T00:32:00.999999-07:00 + //1979-05-27 07:32:00Z + //1979-05-27 00:32:00-07:00 + //1979-05-27 00:32:00.999999-07:00 + //1979-05-27T07:32:00 + //1979-05-27T00:32:00.999999 + //1979-05-27 07:32:00 + //1979-05-27 00:32:00.999999 + //1979-05-27 + //07:32:00 + //00:32:00.999999 + dateRegexp = regexp.MustCompile(`^(?:\d{1,4}-\d{2}-\d{2})?(?:[T ]?\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})?)?`) } // Entry point diff --git a/vendor/github.com/pelletier/go-toml/localtime.go b/vendor/github.com/pelletier/go-toml/localtime.go new file mode 100644 index 0000000000..a2149e9663 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/localtime.go @@ -0,0 +1,281 @@ +// Implementation of TOML's local date/time. +// Copied over from https://github.com/googleapis/google-cloud-go/blob/master/civil/civil.go +// to avoid pulling all the Google dependencies. +// +// Copyright 2016 Google LLC +// +// 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 civil implements types for civil time, a time-zone-independent +// representation of time that follows the rules of the proleptic +// Gregorian calendar with exactly 24-hour days, 60-minute hours, and 60-second +// minutes. +// +// Because they lack location information, these types do not represent unique +// moments or intervals of time. Use time.Time for that purpose. +package toml + +import ( + "fmt" + "time" +) + +// A LocalDate represents a date (year, month, day). +// +// This type does not include location information, and therefore does not +// describe a unique 24-hour timespan. +type LocalDate struct { + Year int // Year (e.g., 2014). + Month time.Month // Month of the year (January = 1, ...). + Day int // Day of the month, starting at 1. +} + +// LocalDateOf returns the LocalDate in which a time occurs in that time's location. +func LocalDateOf(t time.Time) LocalDate { + var d LocalDate + d.Year, d.Month, d.Day = t.Date() + return d +} + +// ParseLocalDate parses a string in RFC3339 full-date format and returns the date value it represents. +func ParseLocalDate(s string) (LocalDate, error) { + t, err := time.Parse("2006-01-02", s) + if err != nil { + return LocalDate{}, err + } + return LocalDateOf(t), nil +} + +// String returns the date in RFC3339 full-date format. +func (d LocalDate) String() string { + return fmt.Sprintf("%04d-%02d-%02d", d.Year, d.Month, d.Day) +} + +// IsValid reports whether the date is valid. +func (d LocalDate) IsValid() bool { + return LocalDateOf(d.In(time.UTC)) == d +} + +// In returns the time corresponding to time 00:00:00 of the date in the location. +// +// In is always consistent with time.LocalDate, even when time.LocalDate returns a time +// on a different day. For example, if loc is America/Indiana/Vincennes, then both +// time.LocalDate(1955, time.May, 1, 0, 0, 0, 0, loc) +// and +// civil.LocalDate{Year: 1955, Month: time.May, Day: 1}.In(loc) +// return 23:00:00 on April 30, 1955. +// +// In panics if loc is nil. +func (d LocalDate) In(loc *time.Location) time.Time { + return time.Date(d.Year, d.Month, d.Day, 0, 0, 0, 0, loc) +} + +// AddDays returns the date that is n days in the future. +// n can also be negative to go into the past. +func (d LocalDate) AddDays(n int) LocalDate { + return LocalDateOf(d.In(time.UTC).AddDate(0, 0, n)) +} + +// DaysSince returns the signed number of days between the date and s, not including the end day. +// This is the inverse operation to AddDays. +func (d LocalDate) DaysSince(s LocalDate) (days int) { + // We convert to Unix time so we do not have to worry about leap seconds: + // Unix time increases by exactly 86400 seconds per day. + deltaUnix := d.In(time.UTC).Unix() - s.In(time.UTC).Unix() + return int(deltaUnix / 86400) +} + +// Before reports whether d1 occurs before d2. +func (d1 LocalDate) Before(d2 LocalDate) bool { + if d1.Year != d2.Year { + return d1.Year < d2.Year + } + if d1.Month != d2.Month { + return d1.Month < d2.Month + } + return d1.Day < d2.Day +} + +// After reports whether d1 occurs after d2. +func (d1 LocalDate) After(d2 LocalDate) bool { + return d2.Before(d1) +} + +// MarshalText implements the encoding.TextMarshaler interface. +// The output is the result of d.String(). +func (d LocalDate) MarshalText() ([]byte, error) { + return []byte(d.String()), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +// The date is expected to be a string in a format accepted by ParseLocalDate. +func (d *LocalDate) UnmarshalText(data []byte) error { + var err error + *d, err = ParseLocalDate(string(data)) + return err +} + +// A LocalTime represents a time with nanosecond precision. +// +// This type does not include location information, and therefore does not +// describe a unique moment in time. +// +// This type exists to represent the TIME type in storage-based APIs like BigQuery. +// Most operations on Times are unlikely to be meaningful. Prefer the LocalDateTime type. +type LocalTime struct { + Hour int // The hour of the day in 24-hour format; range [0-23] + Minute int // The minute of the hour; range [0-59] + Second int // The second of the minute; range [0-59] + Nanosecond int // The nanosecond of the second; range [0-999999999] +} + +// LocalTimeOf returns the LocalTime representing the time of day in which a time occurs +// in that time's location. It ignores the date. +func LocalTimeOf(t time.Time) LocalTime { + var tm LocalTime + tm.Hour, tm.Minute, tm.Second = t.Clock() + tm.Nanosecond = t.Nanosecond() + return tm +} + +// ParseLocalTime parses a string and returns the time value it represents. +// ParseLocalTime accepts an extended form of the RFC3339 partial-time format. After +// the HH:MM:SS part of the string, an optional fractional part may appear, +// consisting of a decimal point followed by one to nine decimal digits. +// (RFC3339 admits only one digit after the decimal point). +func ParseLocalTime(s string) (LocalTime, error) { + t, err := time.Parse("15:04:05.999999999", s) + if err != nil { + return LocalTime{}, err + } + return LocalTimeOf(t), nil +} + +// String returns the date in the format described in ParseLocalTime. If Nanoseconds +// is zero, no fractional part will be generated. Otherwise, the result will +// end with a fractional part consisting of a decimal point and nine digits. +func (t LocalTime) String() string { + s := fmt.Sprintf("%02d:%02d:%02d", t.Hour, t.Minute, t.Second) + if t.Nanosecond == 0 { + return s + } + return s + fmt.Sprintf(".%09d", t.Nanosecond) +} + +// IsValid reports whether the time is valid. +func (t LocalTime) IsValid() bool { + // Construct a non-zero time. + tm := time.Date(2, 2, 2, t.Hour, t.Minute, t.Second, t.Nanosecond, time.UTC) + return LocalTimeOf(tm) == t +} + +// MarshalText implements the encoding.TextMarshaler interface. +// The output is the result of t.String(). +func (t LocalTime) MarshalText() ([]byte, error) { + return []byte(t.String()), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +// The time is expected to be a string in a format accepted by ParseLocalTime. +func (t *LocalTime) UnmarshalText(data []byte) error { + var err error + *t, err = ParseLocalTime(string(data)) + return err +} + +// A LocalDateTime represents a date and time. +// +// This type does not include location information, and therefore does not +// describe a unique moment in time. +type LocalDateTime struct { + Date LocalDate + Time LocalTime +} + +// Note: We deliberately do not embed LocalDate into LocalDateTime, to avoid promoting AddDays and Sub. + +// LocalDateTimeOf returns the LocalDateTime in which a time occurs in that time's location. +func LocalDateTimeOf(t time.Time) LocalDateTime { + return LocalDateTime{ + Date: LocalDateOf(t), + Time: LocalTimeOf(t), + } +} + +// ParseLocalDateTime parses a string and returns the LocalDateTime it represents. +// ParseLocalDateTime accepts a variant of the RFC3339 date-time format that omits +// the time offset but includes an optional fractional time, as described in +// ParseLocalTime. Informally, the accepted format is +// YYYY-MM-DDTHH:MM:SS[.FFFFFFFFF] +// where the 'T' may be a lower-case 't'. +func ParseLocalDateTime(s string) (LocalDateTime, error) { + t, err := time.Parse("2006-01-02T15:04:05.999999999", s) + if err != nil { + t, err = time.Parse("2006-01-02t15:04:05.999999999", s) + if err != nil { + return LocalDateTime{}, err + } + } + return LocalDateTimeOf(t), nil +} + +// String returns the date in the format described in ParseLocalDate. +func (dt LocalDateTime) String() string { + return dt.Date.String() + "T" + dt.Time.String() +} + +// IsValid reports whether the datetime is valid. +func (dt LocalDateTime) IsValid() bool { + return dt.Date.IsValid() && dt.Time.IsValid() +} + +// In returns the time corresponding to the LocalDateTime in the given location. +// +// If the time is missing or ambigous at the location, In returns the same +// result as time.LocalDate. For example, if loc is America/Indiana/Vincennes, then +// both +// time.LocalDate(1955, time.May, 1, 0, 30, 0, 0, loc) +// and +// civil.LocalDateTime{ +// civil.LocalDate{Year: 1955, Month: time.May, Day: 1}}, +// civil.LocalTime{Minute: 30}}.In(loc) +// return 23:30:00 on April 30, 1955. +// +// In panics if loc is nil. +func (dt LocalDateTime) In(loc *time.Location) time.Time { + return time.Date(dt.Date.Year, dt.Date.Month, dt.Date.Day, dt.Time.Hour, dt.Time.Minute, dt.Time.Second, dt.Time.Nanosecond, loc) +} + +// Before reports whether dt1 occurs before dt2. +func (dt1 LocalDateTime) Before(dt2 LocalDateTime) bool { + return dt1.In(time.UTC).Before(dt2.In(time.UTC)) +} + +// After reports whether dt1 occurs after dt2. +func (dt1 LocalDateTime) After(dt2 LocalDateTime) bool { + return dt2.Before(dt1) +} + +// MarshalText implements the encoding.TextMarshaler interface. +// The output is the result of dt.String(). +func (dt LocalDateTime) MarshalText() ([]byte, error) { + return []byte(dt.String()), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +// The datetime is expected to be a string in a format accepted by ParseLocalDateTime +func (dt *LocalDateTime) UnmarshalText(data []byte) error { + var err error + *dt, err = ParseLocalDateTime(string(data)) + return err +} diff --git a/vendor/github.com/pelletier/go-toml/marshal.go b/vendor/github.com/pelletier/go-toml/marshal.go index 0e1c57e80b..db5a7b4f09 100644 --- a/vendor/github.com/pelletier/go-toml/marshal.go +++ b/vendor/github.com/pelletier/go-toml/marshal.go @@ -2,6 +2,7 @@ package toml import ( "bytes" + "encoding" "errors" "fmt" "io" @@ -22,6 +23,7 @@ const ( type tomlOpts struct { name string + nameFromTag bool comment string commented bool multiline bool @@ -68,6 +70,12 @@ const ( var timeType = reflect.TypeOf(time.Time{}) var marshalerType = reflect.TypeOf(new(Marshaler)).Elem() +var unmarshalerType = reflect.TypeOf(new(Unmarshaler)).Elem() +var textMarshalerType = reflect.TypeOf(new(encoding.TextMarshaler)).Elem() +var textUnmarshalerType = reflect.TypeOf(new(encoding.TextUnmarshaler)).Elem() +var localDateType = reflect.TypeOf(LocalDate{}) +var localTimeType = reflect.TypeOf(LocalTime{}) +var localDateTimeType = reflect.TypeOf(LocalDateTime{}) // Check if the given marshal type maps to a Tree primitive func isPrimitive(mtype reflect.Type) bool { @@ -85,29 +93,59 @@ func isPrimitive(mtype reflect.Type) bool { case reflect.String: return true case reflect.Struct: - return mtype == timeType || isCustomMarshaler(mtype) + return isTimeType(mtype) default: return false } } -// Check if the given marshal type maps to a Tree slice -func isTreeSlice(mtype reflect.Type) bool { +func isTimeType(mtype reflect.Type) bool { + return mtype == timeType || mtype == localDateType || mtype == localDateTimeType || mtype == localTimeType +} + +// Check if the given marshal type maps to a Tree slice or array +func isTreeSequence(mtype reflect.Type) bool { switch mtype.Kind() { - case reflect.Slice: - return !isOtherSlice(mtype) + case reflect.Ptr: + return isTreeSequence(mtype.Elem()) + case reflect.Slice, reflect.Array: + return isTree(mtype.Elem()) default: return false } } -// Check if the given marshal type maps to a non-Tree slice -func isOtherSlice(mtype reflect.Type) bool { +// Check if the given marshal type maps to a slice or array of a custom marshaler type +func isCustomMarshalerSequence(mtype reflect.Type) bool { switch mtype.Kind() { case reflect.Ptr: - return isOtherSlice(mtype.Elem()) - case reflect.Slice: - return isPrimitive(mtype.Elem()) || isOtherSlice(mtype.Elem()) + return isCustomMarshalerSequence(mtype.Elem()) + case reflect.Slice, reflect.Array: + return isCustomMarshaler(mtype.Elem()) || isCustomMarshaler(reflect.New(mtype.Elem()).Type()) + default: + return false + } +} + +// Check if the given marshal type maps to a slice or array of a text marshaler type +func isTextMarshalerSequence(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Ptr: + return isTextMarshalerSequence(mtype.Elem()) + case reflect.Slice, reflect.Array: + return isTextMarshaler(mtype.Elem()) || isTextMarshaler(reflect.New(mtype.Elem()).Type()) + default: + return false + } +} + +// Check if the given marshal type maps to a non-Tree slice or array +func isOtherSequence(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Ptr: + return isOtherSequence(mtype.Elem()) + case reflect.Slice, reflect.Array: + return !isTreeSequence(mtype) default: return false } @@ -116,6 +154,8 @@ func isOtherSlice(mtype reflect.Type) bool { // Check if the given marshal type maps to a Tree func isTree(mtype reflect.Type) bool { switch mtype.Kind() { + case reflect.Ptr: + return isTree(mtype.Elem()) case reflect.Map: return true case reflect.Struct: @@ -133,12 +173,42 @@ func callCustomMarshaler(mval reflect.Value) ([]byte, error) { return mval.Interface().(Marshaler).MarshalTOML() } +func isTextMarshaler(mtype reflect.Type) bool { + return mtype.Implements(textMarshalerType) && !isTimeType(mtype) +} + +func callTextMarshaler(mval reflect.Value) ([]byte, error) { + return mval.Interface().(encoding.TextMarshaler).MarshalText() +} + +func isCustomUnmarshaler(mtype reflect.Type) bool { + return mtype.Implements(unmarshalerType) +} + +func callCustomUnmarshaler(mval reflect.Value, tval interface{}) error { + return mval.Interface().(Unmarshaler).UnmarshalTOML(tval) +} + +func isTextUnmarshaler(mtype reflect.Type) bool { + return mtype.Implements(textUnmarshalerType) +} + +func callTextUnmarshaler(mval reflect.Value, text []byte) error { + return mval.Interface().(encoding.TextUnmarshaler).UnmarshalText(text) +} + // Marshaler is the interface implemented by types that // can marshal themselves into valid TOML. type Marshaler interface { MarshalTOML() ([]byte, error) } +// Unmarshaler is the interface implemented by types that +// can unmarshal a TOML description of themselves. +type Unmarshaler interface { + UnmarshalTOML(interface{}) error +} + /* Marshal returns the TOML encoding of v. Behavior is similar to the Go json encoder, except that there is no concept of a Marshaler interface or MarshalTOML @@ -170,7 +240,7 @@ Tree primitive types and corresponding marshal types: float64 float32, float64, pointers to same string string, pointers to same bool bool, pointers to same - time.Time time.Time{}, pointers to same + time.LocalTime time.LocalTime{}, pointers to same For additional flexibility, use the Encoder API. */ @@ -183,20 +253,23 @@ type Encoder struct { w io.Writer encOpts annotation - line int - col int - order marshalOrder + line int + col int + order marshalOrder + promoteAnon bool + indentation string } // NewEncoder returns a new encoder that writes to w. func NewEncoder(w io.Writer) *Encoder { return &Encoder{ - w: w, - encOpts: encOptsDefaults, - annotation: annotationDefault, - line: 0, - col: 1, - order: OrderAlphabetical, + w: w, + encOpts: encOptsDefaults, + annotation: annotationDefault, + line: 0, + col: 1, + order: OrderAlphabetical, + indentation: " ", } } @@ -248,6 +321,12 @@ func (e *Encoder) Order(ord marshalOrder) *Encoder { return e } +// Indentation allows to change indentation when marshalling. +func (e *Encoder) Indentation(indent string) *Encoder { + e.indentation = indent + return e +} + // SetTagName allows changing default tag "toml" func (e *Encoder) SetTagName(v string) *Encoder { e.tag = v @@ -272,8 +351,31 @@ func (e *Encoder) SetTagMultiline(v string) *Encoder { return e } +// PromoteAnonymous allows to change how anonymous struct fields are marshaled. +// Usually, they are marshaled as if the inner exported fields were fields in +// the outer struct. However, if an anonymous struct field is given a name in +// its TOML tag, it is treated like a regular struct field with that name. +// rather than being anonymous. +// +// In case anonymous promotion is enabled, all anonymous structs are promoted +// and treated like regular struct fields. +func (e *Encoder) PromoteAnonymous(promote bool) *Encoder { + e.promoteAnon = promote + return e +} + func (e *Encoder) marshal(v interface{}) ([]byte, error) { + // Check if indentation is valid + for _, char := range e.indentation { + if !isSpace(char) { + return []byte{}, fmt.Errorf("invalid indentation: must only contains space or tab characters") + } + } + mtype := reflect.TypeOf(v) + if mtype == nil { + return []byte{}, errors.New("nil cannot be marshaled to TOML") + } switch mtype.Kind() { case reflect.Struct, reflect.Map: @@ -281,6 +383,9 @@ func (e *Encoder) marshal(v interface{}) ([]byte, error) { if mtype.Elem().Kind() != reflect.Struct { return []byte{}, errors.New("Only pointer to struct can be marshaled to TOML") } + if reflect.ValueOf(v).IsNil() { + return []byte{}, errors.New("nil pointer cannot be marshaled to TOML") + } default: return []byte{}, errors.New("Only a struct or map can be marshaled to TOML") } @@ -289,13 +394,16 @@ func (e *Encoder) marshal(v interface{}) ([]byte, error) { if isCustomMarshaler(mtype) { return callCustomMarshaler(sval) } + if isTextMarshaler(mtype) { + return callTextMarshaler(sval) + } t, err := e.valueToTree(mtype, sval) if err != nil { return []byte{}, err } var buf bytes.Buffer - _, err = t.writeToOrdered(&buf, "", "", 0, e.arraysOneElementPerLine, e.order) + _, err = t.writeToOrdered(&buf, "", "", 0, e.arraysOneElementPerLine, e.order, e.indentation, false) return buf.Bytes(), err } @@ -313,20 +421,28 @@ func (e *Encoder) valueToTree(mtype reflect.Type, mval reflect.Value) (*Tree, er tval := e.nextTree() switch mtype.Kind() { case reflect.Struct: - for i := 0; i < mtype.NumField(); i++ { - mtypef, mvalf := mtype.Field(i), mval.Field(i) - opts := tomlOptions(mtypef, e.annotation) - if opts.include && (!opts.omitempty || !isZero(mvalf)) { - val, err := e.valueToToml(mtypef.Type, mvalf) - if err != nil { - return nil, err + switch mval.Interface().(type) { + case Tree: + reflect.ValueOf(tval).Elem().Set(mval) + default: + for i := 0; i < mtype.NumField(); i++ { + mtypef, mvalf := mtype.Field(i), mval.Field(i) + opts := tomlOptions(mtypef, e.annotation) + if opts.include && ((mtypef.Type.Kind() != reflect.Interface && !opts.omitempty) || !isZero(mvalf)) { + val, err := e.valueToToml(mtypef.Type, mvalf) + if err != nil { + return nil, err + } + if tree, ok := val.(*Tree); ok && mtypef.Anonymous && !opts.nameFromTag && !e.promoteAnon { + e.appendTree(tval, tree) + } else { + tval.SetPathWithOptions([]string{opts.name}, SetOptions{ + Comment: opts.comment, + Commented: opts.commented, + Multiline: opts.multiline, + }, val) + } } - - tval.SetWithOptions(opts.name, SetOptions{ - Comment: opts.comment, - Commented: opts.commented, - Multiline: opts.multiline, - }, val) } } case reflect.Map: @@ -351,18 +467,21 @@ func (e *Encoder) valueToTree(mtype reflect.Type, mval reflect.Value) (*Tree, er } for _, key := range keys { mvalf := mval.MapIndex(key) + if (mtype.Elem().Kind() == reflect.Ptr || mtype.Elem().Kind() == reflect.Interface) && mvalf.IsNil() { + continue + } val, err := e.valueToToml(mtype.Elem(), mvalf) if err != nil { return nil, err } if e.quoteMapKeys { - keyStr, err := tomlValueStringRepresentation(key.String(), "", e.arraysOneElementPerLine) + keyStr, err := tomlValueStringRepresentation(key.String(), "", "", e.order, e.arraysOneElementPerLine) if err != nil { return nil, err } tval.SetPath([]string{keyStr}, val) } else { - tval.Set(key.String(), val) + tval.SetPath([]string{key.String()}, val) } } } @@ -399,17 +518,29 @@ func (e *Encoder) valueToOtherSlice(mtype reflect.Type, mval reflect.Value) (int func (e *Encoder) valueToToml(mtype reflect.Type, mval reflect.Value) (interface{}, error) { e.line++ if mtype.Kind() == reflect.Ptr { - return e.valueToToml(mtype.Elem(), mval.Elem()) + switch { + case isCustomMarshaler(mtype): + return callCustomMarshaler(mval) + case isTextMarshaler(mtype): + return callTextMarshaler(mval) + default: + return e.valueToToml(mtype.Elem(), mval.Elem()) + } + } + if mtype.Kind() == reflect.Interface { + return e.valueToToml(mval.Elem().Type(), mval.Elem()) } switch { case isCustomMarshaler(mtype): return callCustomMarshaler(mval) + case isTextMarshaler(mtype): + return callTextMarshaler(mval) case isTree(mtype): return e.valueToTree(mtype, mval) - case isTreeSlice(mtype): - return e.valueToTreeSlice(mtype, mval) - case isOtherSlice(mtype): + case isOtherSequence(mtype), isCustomMarshalerSequence(mtype), isTextMarshalerSequence(mtype): return e.valueToOtherSlice(mtype, mval) + case isTreeSequence(mtype): + return e.valueToTreeSlice(mtype, mval) default: switch mtype.Kind() { case reflect.Bool: @@ -426,13 +557,26 @@ func (e *Encoder) valueToToml(mtype reflect.Type, mval reflect.Value) (interface case reflect.String: return mval.String(), nil case reflect.Struct: - return mval.Interface().(time.Time), nil + return mval.Interface(), nil default: return nil, fmt.Errorf("Marshal can't handle %v(%v)", mtype, mtype.Kind()) } } } +func (e *Encoder) appendTree(t, o *Tree) error { + for key, value := range o.values { + if _, ok := t.values[key]; ok { + continue + } + if tomlValue, ok := value.(*tomlValue); ok { + tomlValue.position.Col = t.position.Col + } + t.values[key] = value + } + return nil +} + // Unmarshal attempts to unmarshal the Tree into a Go struct pointed by v. // Neither Unmarshaler interfaces nor UnmarshalTOML functions are supported for // sub-structs, and only definite types can be unmarshaled. @@ -445,8 +589,11 @@ func (t *Tree) Unmarshal(v interface{}) error { // See Marshal() documentation for types mapping table. func (t *Tree) Marshal() ([]byte, error) { var buf bytes.Buffer - err := NewEncoder(&buf).Encode(t) - return buf.Bytes(), err + _, err := t.WriteTo(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil } // Unmarshal parses the TOML-encoded data and stores the result in the value @@ -482,6 +629,8 @@ type Decoder struct { tval *Tree encOpts tagName string + strict bool + visitor visitorState } // NewDecoder returns a new decoder that reads from r. @@ -512,8 +661,18 @@ func (d *Decoder) SetTagName(v string) *Decoder { return d } +// Strict allows changing to strict decoding. Any fields that are found in the +// input data and do not have a corresponding struct member cause an error. +func (d *Decoder) Strict(strict bool) *Decoder { + d.strict = strict + return d +} + func (d *Decoder) unmarshal(v interface{}) error { mtype := reflect.TypeOf(v) + if mtype == nil { + return errors.New("nil cannot be unmarshaled from TOML") + } if mtype.Kind() != reflect.Ptr { return errors.New("only a pointer to struct or map can be unmarshaled from TOML") } @@ -526,28 +685,64 @@ func (d *Decoder) unmarshal(v interface{}) error { return errors.New("only a pointer to struct or map can be unmarshaled from TOML") } - sval, err := d.valueFromTree(elem, d.tval) + if reflect.ValueOf(v).IsNil() { + return errors.New("nil pointer cannot be unmarshaled from TOML") + } + + vv := reflect.ValueOf(v).Elem() + + if d.strict { + d.visitor = newVisitorState(d.tval) + } + + sval, err := d.valueFromTree(elem, d.tval, &vv) if err != nil { return err } + if err := d.visitor.validate(); err != nil { + return err + } reflect.ValueOf(v).Elem().Set(sval) return nil } -// Convert toml tree to marshal struct or map, using marshal type -func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree) (reflect.Value, error) { +// Convert toml tree to marshal struct or map, using marshal type. When mval1 +// is non-nil, merge fields into the given value instead of allocating a new one. +func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree, mval1 *reflect.Value) (reflect.Value, error) { if mtype.Kind() == reflect.Ptr { - return d.unwrapPointer(mtype, tval) + return d.unwrapPointer(mtype, tval, mval1) } + + // Check if pointer to value implements the Unmarshaler interface. + if mvalPtr := reflect.New(mtype); isCustomUnmarshaler(mvalPtr.Type()) { + d.visitor.visitAll() + + if err := callCustomUnmarshaler(mvalPtr, tval.ToMap()); err != nil { + return reflect.ValueOf(nil), fmt.Errorf("unmarshal toml: %v", err) + } + return mvalPtr.Elem(), nil + } + var mval reflect.Value switch mtype.Kind() { case reflect.Struct: - mval = reflect.New(mtype).Elem() - for i := 0; i < mtype.NumField(); i++ { - mtypef := mtype.Field(i) - an := annotation{tag: d.tagName} - opts := tomlOptions(mtypef, an) - if opts.include { + if mval1 != nil { + mval = *mval1 + } else { + mval = reflect.New(mtype).Elem() + } + + switch mval.Interface().(type) { + case Tree: + mval.Set(reflect.ValueOf(tval).Elem()) + default: + for i := 0; i < mtype.NumField(); i++ { + mtypef := mtype.Field(i) + an := annotation{tag: d.tagName} + opts := tomlOptions(mtypef, an) + if !opts.include { + continue + } baseKey := opts.name keysToTry := []string{ baseKey, @@ -557,19 +752,25 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree) (reflect.Value, } found := false - for _, key := range keysToTry { - exists := tval.Has(key) - if !exists { - continue - } - val := tval.Get(key) - mvalf, err := d.valueFromToml(mtypef.Type, val) - if err != nil { - return mval, formatError(err, tval.GetPosition(key)) + if tval != nil { + for _, key := range keysToTry { + exists := tval.HasPath([]string{key}) + if !exists { + continue + } + + d.visitor.push(key) + val := tval.GetPath([]string{key}) + fval := mval.Field(i) + mvalf, err := d.valueFromToml(mtypef.Type, val, &fval) + if err != nil { + return mval, formatError(err, tval.GetPositionPath([]string{key})) + } + mval.Field(i).Set(mvalf) + found = true + d.visitor.pop() + break } - mval.Field(i).Set(mvalf) - found = true - break } if !found && opts.defaultValue != "" { @@ -577,45 +778,71 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree) (reflect.Value, var val interface{} var err error switch mvalf.Kind() { + case reflect.String: + val = opts.defaultValue case reflect.Bool: val, err = strconv.ParseBool(opts.defaultValue) - if err != nil { - return mval.Field(i), err - } + case reflect.Uint: + val, err = strconv.ParseUint(opts.defaultValue, 10, 0) + case reflect.Uint8: + val, err = strconv.ParseUint(opts.defaultValue, 10, 8) + case reflect.Uint16: + val, err = strconv.ParseUint(opts.defaultValue, 10, 16) + case reflect.Uint32: + val, err = strconv.ParseUint(opts.defaultValue, 10, 32) + case reflect.Uint64: + val, err = strconv.ParseUint(opts.defaultValue, 10, 64) case reflect.Int: - val, err = strconv.Atoi(opts.defaultValue) - if err != nil { - return mval.Field(i), err - } - case reflect.String: - val = opts.defaultValue + val, err = strconv.ParseInt(opts.defaultValue, 10, 0) + case reflect.Int8: + val, err = strconv.ParseInt(opts.defaultValue, 10, 8) + case reflect.Int16: + val, err = strconv.ParseInt(opts.defaultValue, 10, 16) + case reflect.Int32: + val, err = strconv.ParseInt(opts.defaultValue, 10, 32) case reflect.Int64: val, err = strconv.ParseInt(opts.defaultValue, 10, 64) - if err != nil { - return mval.Field(i), err - } + case reflect.Float32: + val, err = strconv.ParseFloat(opts.defaultValue, 32) case reflect.Float64: val, err = strconv.ParseFloat(opts.defaultValue, 64) - if err != nil { - return mval.Field(i), err - } default: - return mval.Field(i), fmt.Errorf("unsuported field type for default option") + return mvalf, fmt.Errorf("unsupported field type for default option") + } + + if err != nil { + return mvalf, err + } + mvalf.Set(reflect.ValueOf(val).Convert(mvalf.Type())) + } + + // save the old behavior above and try to check structs + if !found && opts.defaultValue == "" && mtypef.Type.Kind() == reflect.Struct { + tmpTval := tval + if !mtypef.Anonymous { + tmpTval = nil + } + fval := mval.Field(i) + v, err := d.valueFromTree(mtypef.Type, tmpTval, &fval) + if err != nil { + return v, err } - mval.Field(i).Set(reflect.ValueOf(val)) + mval.Field(i).Set(v) } } } case reflect.Map: mval = reflect.MakeMap(mtype) for _, key := range tval.Keys() { + d.visitor.push(key) // TODO: path splits key val := tval.GetPath([]string{key}) - mvalf, err := d.valueFromToml(mtype.Elem(), val) + mvalf, err := d.valueFromToml(mtype.Elem(), val, nil) if err != nil { - return mval, formatError(err, tval.GetPosition(key)) + return mval, formatError(err, tval.GetPositionPath([]string{key})) } mval.SetMapIndex(reflect.ValueOf(key).Convert(mtype.Key()), mvalf) + d.visitor.pop() } } return mval, nil @@ -623,22 +850,32 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree) (reflect.Value, // Convert toml value to marshal struct/map slice, using marshal type func (d *Decoder) valueFromTreeSlice(mtype reflect.Type, tval []*Tree) (reflect.Value, error) { - mval := reflect.MakeSlice(mtype, len(tval), len(tval)) + mval, err := makeSliceOrArray(mtype, len(tval)) + if err != nil { + return mval, err + } + for i := 0; i < len(tval); i++ { - val, err := d.valueFromTree(mtype.Elem(), tval[i]) + d.visitor.push(strconv.Itoa(i)) + val, err := d.valueFromTree(mtype.Elem(), tval[i], nil) if err != nil { return mval, err } mval.Index(i).Set(val) + d.visitor.pop() } return mval, nil } // Convert toml value to marshal primitive slice, using marshal type func (d *Decoder) valueFromOtherSlice(mtype reflect.Type, tval []interface{}) (reflect.Value, error) { - mval := reflect.MakeSlice(mtype, len(tval), len(tval)) + mval, err := makeSliceOrArray(mtype, len(tval)) + if err != nil { + return mval, err + } + for i := 0; i < len(tval); i++ { - val, err := d.valueFromToml(mtype.Elem(), tval[i]) + val, err := d.valueFromToml(mtype.Elem(), tval[i], nil) if err != nil { return mval, err } @@ -647,33 +884,133 @@ func (d *Decoder) valueFromOtherSlice(mtype reflect.Type, tval []interface{}) (r return mval, nil } -// Convert toml value to marshal value, using marshal type -func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}) (reflect.Value, error) { +// Convert toml value to marshal primitive slice, using marshal type +func (d *Decoder) valueFromOtherSliceI(mtype reflect.Type, tval interface{}) (reflect.Value, error) { + val := reflect.ValueOf(tval) + length := val.Len() + + mval, err := makeSliceOrArray(mtype, length) + if err != nil { + return mval, err + } + + for i := 0; i < length; i++ { + val, err := d.valueFromToml(mtype.Elem(), val.Index(i).Interface(), nil) + if err != nil { + return mval, err + } + mval.Index(i).Set(val) + } + return mval, nil +} + +// Create a new slice or a new array with specified length +func makeSliceOrArray(mtype reflect.Type, tLength int) (reflect.Value, error) { + var mval reflect.Value + switch mtype.Kind() { + case reflect.Slice: + mval = reflect.MakeSlice(mtype, tLength, tLength) + case reflect.Array: + mval = reflect.New(reflect.ArrayOf(mtype.Len(), mtype.Elem())).Elem() + if tLength > mtype.Len() { + return mval, fmt.Errorf("unmarshal: TOML array length (%v) exceeds destination array length (%v)", tLength, mtype.Len()) + } + } + return mval, nil +} + +// Convert toml value to marshal value, using marshal type. When mval1 is non-nil +// and the given type is a struct value, merge fields into it. +func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}, mval1 *reflect.Value) (reflect.Value, error) { if mtype.Kind() == reflect.Ptr { - return d.unwrapPointer(mtype, tval) + return d.unwrapPointer(mtype, tval, mval1) } switch t := tval.(type) { case *Tree: + var mval11 *reflect.Value + if mtype.Kind() == reflect.Struct { + mval11 = mval1 + } + if isTree(mtype) { - return d.valueFromTree(mtype, t) + return d.valueFromTree(mtype, t, mval11) } + + if mtype.Kind() == reflect.Interface { + if mval1 == nil || mval1.IsNil() { + return d.valueFromTree(reflect.TypeOf(map[string]interface{}{}), t, nil) + } else { + return d.valueFromToml(mval1.Elem().Type(), t, nil) + } + } + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a tree", tval, tval) case []*Tree: - if isTreeSlice(mtype) { + if isTreeSequence(mtype) { return d.valueFromTreeSlice(mtype, t) } + if mtype.Kind() == reflect.Interface { + if mval1 == nil || mval1.IsNil() { + return d.valueFromTreeSlice(reflect.TypeOf([]map[string]interface{}{}), t) + } else { + ival := mval1.Elem() + return d.valueFromToml(mval1.Elem().Type(), t, &ival) + } + } return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to trees", tval, tval) case []interface{}: - if isOtherSlice(mtype) { + d.visitor.visit() + if isOtherSequence(mtype) { return d.valueFromOtherSlice(mtype, t) } + if mtype.Kind() == reflect.Interface { + if mval1 == nil || mval1.IsNil() { + return d.valueFromOtherSlice(reflect.TypeOf([]interface{}{}), t) + } else { + ival := mval1.Elem() + return d.valueFromToml(mval1.Elem().Type(), t, &ival) + } + } return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a slice", tval, tval) default: + d.visitor.visit() + // Check if pointer to value implements the encoding.TextUnmarshaler. + if mvalPtr := reflect.New(mtype); isTextUnmarshaler(mvalPtr.Type()) && !isTimeType(mtype) { + if err := d.unmarshalText(tval, mvalPtr); err != nil { + return reflect.ValueOf(nil), fmt.Errorf("unmarshal text: %v", err) + } + return mvalPtr.Elem(), nil + } + switch mtype.Kind() { case reflect.Bool, reflect.Struct: val := reflect.ValueOf(tval) - // if this passes for when mtype is reflect.Struct, tval is a time.Time + + switch val.Type() { + case localDateType: + localDate := val.Interface().(LocalDate) + switch mtype { + case timeType: + return reflect.ValueOf(time.Date(localDate.Year, localDate.Month, localDate.Day, 0, 0, 0, 0, time.Local)), nil + } + case localDateTimeType: + localDateTime := val.Interface().(LocalDateTime) + switch mtype { + case timeType: + return reflect.ValueOf(time.Date( + localDateTime.Date.Year, + localDateTime.Date.Month, + localDateTime.Date.Day, + localDateTime.Time.Hour, + localDateTime.Time.Minute, + localDateTime.Time.Second, + localDateTime.Time.Nanosecond, + time.Local)), nil + } + } + + // if this passes for when mtype is reflect.Struct, tval is a time.LocalTime if !val.Type().ConvertibleTo(mtype) { return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) } @@ -696,46 +1033,65 @@ func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}) (reflect.V } return reflect.ValueOf(d), nil } - if !val.Type().ConvertibleTo(mtype) { + if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Float64 { return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) } - if reflect.Indirect(reflect.New(mtype)).OverflowInt(val.Convert(mtype).Int()) { + if reflect.Indirect(reflect.New(mtype)).OverflowInt(val.Convert(reflect.TypeOf(int64(0))).Int()) { return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) } return val.Convert(mtype), nil case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: val := reflect.ValueOf(tval) - if !val.Type().ConvertibleTo(mtype) { + if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Float64 { return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) } if val.Convert(reflect.TypeOf(int(1))).Int() < 0 { return reflect.ValueOf(nil), fmt.Errorf("%v(%T) is negative so does not fit in %v", tval, tval, mtype.String()) } - if reflect.Indirect(reflect.New(mtype)).OverflowUint(uint64(val.Convert(mtype).Uint())) { + if reflect.Indirect(reflect.New(mtype)).OverflowUint(val.Convert(reflect.TypeOf(uint64(0))).Uint()) { return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) } return val.Convert(mtype), nil case reflect.Float32, reflect.Float64: val := reflect.ValueOf(tval) - if !val.Type().ConvertibleTo(mtype) { + if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Int64 { return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) } - if reflect.Indirect(reflect.New(mtype)).OverflowFloat(val.Convert(mtype).Float()) { + if reflect.Indirect(reflect.New(mtype)).OverflowFloat(val.Convert(reflect.TypeOf(float64(0))).Float()) { return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) } return val.Convert(mtype), nil + case reflect.Interface: + if mval1 == nil || mval1.IsNil() { + return reflect.ValueOf(tval), nil + } else { + ival := mval1.Elem() + return d.valueFromToml(mval1.Elem().Type(), t, &ival) + } + case reflect.Slice, reflect.Array: + if isOtherSequence(mtype) && isOtherSequence(reflect.TypeOf(t)) { + return d.valueFromOtherSliceI(mtype, t) + } + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v(%v)", tval, tval, mtype, mtype.Kind()) default: return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v(%v)", tval, tval, mtype, mtype.Kind()) } } } -func (d *Decoder) unwrapPointer(mtype reflect.Type, tval interface{}) (reflect.Value, error) { - val, err := d.valueFromToml(mtype.Elem(), tval) +func (d *Decoder) unwrapPointer(mtype reflect.Type, tval interface{}, mval1 *reflect.Value) (reflect.Value, error) { + var melem *reflect.Value + + if mval1 != nil && !mval1.IsNil() && (mtype.Elem().Kind() == reflect.Struct || mtype.Elem().Kind() == reflect.Interface) { + elem := mval1.Elem() + melem = &elem + } + + val, err := d.valueFromToml(mtype.Elem(), tval, melem) if err != nil { return reflect.ValueOf(nil), err } @@ -744,6 +1100,12 @@ func (d *Decoder) unwrapPointer(mtype reflect.Type, tval interface{}) (reflect.V return mval, nil } +func (d *Decoder) unmarshalText(tval interface{}, mval reflect.Value) error { + var buf bytes.Buffer + fmt.Fprint(&buf, tval) + return callTextUnmarshaler(mval, buf.Bytes()) +} + func tomlOptions(vf reflect.StructField, an annotation) tomlOpts { tag := vf.Tag.Get(an.tag) parse := strings.Split(tag, ",") @@ -756,6 +1118,7 @@ func tomlOptions(vf reflect.StructField, an annotation) tomlOpts { defaultValue := vf.Tag.Get(tagDefault) result := tomlOpts{ name: vf.Name, + nameFromTag: false, comment: comment, commented: commented, multiline: multiline, @@ -768,6 +1131,7 @@ func tomlOptions(vf reflect.StructField, an annotation) tomlOpts { result.include = false } else { result.name = strings.Trim(parse[0], " ") + result.nameFromTag = true } } if vf.PkgPath != "" { @@ -784,11 +1148,7 @@ func tomlOptions(vf reflect.StructField, an annotation) tomlOpts { func isZero(val reflect.Value) bool { switch val.Type().Kind() { - case reflect.Map: - fallthrough - case reflect.Array: - fallthrough - case reflect.Slice: + case reflect.Slice, reflect.Array, reflect.Map: return val.Len() == 0 default: return reflect.DeepEqual(val.Interface(), reflect.Zero(val.Type()).Interface()) @@ -801,3 +1161,80 @@ func formatError(err error, pos Position) error { } return fmt.Errorf("%s: %s", pos, err) } + +// visitorState keeps track of which keys were unmarshaled. +type visitorState struct { + tree *Tree + path []string + keys map[string]struct{} + active bool +} + +func newVisitorState(tree *Tree) visitorState { + path, result := []string{}, map[string]struct{}{} + insertKeys(path, result, tree) + return visitorState{ + tree: tree, + path: path[:0], + keys: result, + active: true, + } +} + +func (s *visitorState) push(key string) { + if s.active { + s.path = append(s.path, key) + } +} + +func (s *visitorState) pop() { + if s.active { + s.path = s.path[:len(s.path)-1] + } +} + +func (s *visitorState) visit() { + if s.active { + delete(s.keys, strings.Join(s.path, ".")) + } +} + +func (s *visitorState) visitAll() { + if s.active { + for k := range s.keys { + if strings.HasPrefix(k, strings.Join(s.path, ".")) { + delete(s.keys, k) + } + } + } +} + +func (s *visitorState) validate() error { + if !s.active { + return nil + } + undecoded := make([]string, 0, len(s.keys)) + for key := range s.keys { + undecoded = append(undecoded, key) + } + sort.Strings(undecoded) + if len(undecoded) > 0 { + return fmt.Errorf("undecoded keys: %q", undecoded) + } + return nil +} + +func insertKeys(path []string, m map[string]struct{}, tree *Tree) { + for k, v := range tree.values { + switch node := v.(type) { + case []*Tree: + for i, item := range node { + insertKeys(append(path, k, strconv.Itoa(i)), m, item) + } + case *Tree: + insertKeys(append(path, k), m, node) + case *tomlValue: + m[strings.Join(append(path, k), ".")] = struct{}{} + } + } +} diff --git a/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_Map_test.toml b/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_Map_test.toml deleted file mode 100644 index a3bd5130d9..0000000000 --- a/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_Map_test.toml +++ /dev/null @@ -1,17 +0,0 @@ -title = "TOML Marshal Testing" - -[basic_map] - one = "one" - two = "two" - -[long_map] - a7 = "1" - b3 = "2" - c8 = "3" - d4 = "4" - e6 = "5" - f5 = "6" - g10 = "7" - h1 = "8" - i2 = "9" - j9 = "10" diff --git a/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_test.toml b/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_test.toml index 9d68b59996..792b72ed72 100644 --- a/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_test.toml +++ b/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_test.toml @@ -27,6 +27,7 @@ title = "TOML Marshal Testing" uint = 5001 bool = true float = 123.4 + float64 = 123.456782132399 int = 5000 string = "Bite me" date = 1979-05-27T07:32:00Z diff --git a/vendor/github.com/pelletier/go-toml/marshal_test.toml b/vendor/github.com/pelletier/go-toml/marshal_test.toml index 1c5f98e7a8..ba5e110bf0 100644 --- a/vendor/github.com/pelletier/go-toml/marshal_test.toml +++ b/vendor/github.com/pelletier/go-toml/marshal_test.toml @@ -4,6 +4,7 @@ title = "TOML Marshal Testing" bool = true date = 1979-05-27T07:32:00Z float = 123.4 + float64 = 123.456782132399 int = 5000 string = "Bite me" uint = 5001 diff --git a/vendor/github.com/pelletier/go-toml/parser.go b/vendor/github.com/pelletier/go-toml/parser.go index a7498e49b3..7bf40bbdc7 100644 --- a/vendor/github.com/pelletier/go-toml/parser.go +++ b/vendor/github.com/pelletier/go-toml/parser.go @@ -158,6 +158,11 @@ func (p *tomlParser) parseGroup() tomlParserStateFn { if err := p.tree.createSubTree(keys, startToken.Position); err != nil { p.raiseError(key, "%s", err) } + destTree := p.tree.GetPath(keys) + if target, ok := destTree.(*Tree); ok && target != nil && target.inline { + p.raiseError(key, "could not re-define exist inline table or its sub-table : %s", + strings.Join(keys, ".")) + } p.assume(tokenRightBracket) p.currentTable = keys return p.parseStart @@ -201,6 +206,11 @@ func (p *tomlParser) parseAssign() tomlParserStateFn { strings.Join(tableKey, ".")) } + if targetNode.inline { + p.raiseError(key, "could not add key or sub-table to exist inline table or its sub-table : %s", + strings.Join(tableKey, ".")) + } + // assign value to the found table keyVal := parsedKey[len(parsedKey)-1] localKey := []string{keyVal} @@ -313,7 +323,41 @@ func (p *tomlParser) parseRvalue() interface{} { } return val case tokenDate: - val, err := time.ParseInLocation(time.RFC3339Nano, tok.val, time.UTC) + layout := time.RFC3339Nano + if !strings.Contains(tok.val, "T") { + layout = strings.Replace(layout, "T", " ", 1) + } + val, err := time.ParseInLocation(layout, tok.val, time.UTC) + if err != nil { + p.raiseError(tok, "%s", err) + } + return val + case tokenLocalDate: + v := strings.Replace(tok.val, " ", "T", -1) + isDateTime := false + isTime := false + for _, c := range v { + if c == 'T' || c == 't' { + isDateTime = true + break + } + if c == ':' { + isTime = true + break + } + } + + var val interface{} + var err error + + if isDateTime { + val, err = ParseLocalDateTime(v) + } else if isTime { + val, err = ParseLocalTime(v) + } else { + val, err = ParseLocalDate(v) + } + if err != nil { p.raiseError(tok, "%s", err) } @@ -356,12 +400,15 @@ Loop: } key := p.getToken() p.assume(tokenEqual) + + parsedKey, err := parseKey(key.val) + if err != nil { + p.raiseError(key, "invalid key: %s", err) + } + value := p.parseRvalue() - tree.Set(key.val, value) + tree.SetPath(parsedKey, value) case tokenComma: - if previous == nil { - p.raiseError(follow, "inline table cannot start with a comma") - } if tokenIsComma(previous) { p.raiseError(follow, "need field between two commas in inline table") } @@ -374,12 +421,13 @@ Loop: if tokenIsComma(previous) { p.raiseError(previous, "trailing comma at the end of inline table") } + tree.inline = true return tree } func (p *tomlParser) parseArray() interface{} { var array []interface{} - arrayType := reflect.TypeOf(nil) + arrayType := reflect.TypeOf(newTree()) for { follow := p.peek() if follow == nil || follow.typ == tokenEOF { @@ -390,11 +438,8 @@ func (p *tomlParser) parseArray() interface{} { break } val := p.parseRvalue() - if arrayType == nil { - arrayType = reflect.TypeOf(val) - } if reflect.TypeOf(val) != arrayType { - p.raiseError(follow, "mixed types in array") + arrayType = nil } array = append(array, val) follow = p.peek() @@ -408,6 +453,12 @@ func (p *tomlParser) parseArray() interface{} { p.getToken() } } + + // if the array is a mixed-type array or its length is 0, + // don't convert it to a table array + if len(array) <= 0 { + arrayType = nil + } // An array of Trees is actually an array of inline // tables, which is a shorthand for a table array. If the // array was not converted from []interface{} to []*Tree, diff --git a/vendor/github.com/pelletier/go-toml/token.go b/vendor/github.com/pelletier/go-toml/token.go index 1a90813466..6af4ec46bc 100644 --- a/vendor/github.com/pelletier/go-toml/token.go +++ b/vendor/github.com/pelletier/go-toml/token.go @@ -1,10 +1,6 @@ package toml -import ( - "fmt" - "strconv" - "unicode" -) +import "fmt" // Define tokens type tokenType int @@ -35,6 +31,7 @@ const ( tokenDoubleLeftBracket tokenDoubleRightBracket tokenDate + tokenLocalDate tokenKeyGroup tokenKeyGroupArray tokenComma @@ -68,7 +65,8 @@ var tokenTypeNames = []string{ ")", "]]", "[[", - "Date", + "LocalDate", + "LocalDate", "KeyGroup", "KeyGroupArray", ",", @@ -95,14 +93,6 @@ func (tt tokenType) String() string { return "Unknown" } -func (t token) Int() int { - if result, err := strconv.Atoi(t.val); err != nil { - panic(err) - } else { - return result - } -} - func (t token) String() string { switch t.typ { case tokenEOF: @@ -119,7 +109,7 @@ func isSpace(r rune) bool { } func isAlphanumeric(r rune) bool { - return unicode.IsLetter(r) || r == '_' + return 'a' <= r && r <= 'z' || 'A' <= r && r <= 'Z' || r == '_' } func isKeyChar(r rune) bool { @@ -134,7 +124,7 @@ func isKeyStartChar(r rune) bool { } func isDigit(r rune) bool { - return unicode.IsNumber(r) + return '0' <= r && r <= '9' } func isHexDigit(r rune) bool { diff --git a/vendor/github.com/pelletier/go-toml/toml.go b/vendor/github.com/pelletier/go-toml/toml.go index 358a9be5ce..d323c39bce 100644 --- a/vendor/github.com/pelletier/go-toml/toml.go +++ b/vendor/github.com/pelletier/go-toml/toml.go @@ -23,6 +23,7 @@ type Tree struct { values map[string]interface{} // string -> *tomlValue, *Tree, []*Tree comment string commented bool + inline bool position Position } @@ -222,8 +223,12 @@ func (t *Tree) SetPathWithOptions(keys []string, opts SetOptions, value interfac switch v := value.(type) { case *Tree: v.comment = opts.Comment + v.commented = opts.Commented toInsert = value case []*Tree: + for i := range v { + v[i].commented = opts.Commented + } toInsert = value case *tomlValue: v.comment = opts.Comment @@ -307,6 +312,7 @@ func (t *Tree) createSubTree(keys []string, pos Position) error { if !exists { tree := newTreeWithPosition(Position{Line: t.position.Line + i, Col: t.position.Col}) tree.position = pos + tree.inline = subtree.inline subtree.values[intermediateKey] = tree nextTree = tree } diff --git a/vendor/github.com/pelletier/go-toml/tomltree_write.go b/vendor/github.com/pelletier/go-toml/tomltree_write.go index 198d5ac174..2d6487ede4 100644 --- a/vendor/github.com/pelletier/go-toml/tomltree_write.go +++ b/vendor/github.com/pelletier/go-toml/tomltree_write.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "math" + "math/big" "reflect" "sort" "strconv" @@ -27,23 +28,35 @@ type sortNode struct { // Encodes a string to a TOML-compliant multi-line string value // This function is a clone of the existing encodeTomlString function, except that whitespace characters // are preserved. Quotation marks and backslashes are also not escaped. -func encodeMultilineTomlString(value string) string { +func encodeMultilineTomlString(value string, commented string) string { var b bytes.Buffer - - for _, rr := range value { + adjacentQuoteCount := 0 + + b.WriteString(commented) + for i, rr := range value { + if rr != '"' { + adjacentQuoteCount = 0 + } else { + adjacentQuoteCount++ + } switch rr { case '\b': b.WriteString(`\b`) case '\t': b.WriteString("\t") case '\n': - b.WriteString("\n") + b.WriteString("\n" + commented) case '\f': b.WriteString(`\f`) case '\r': b.WriteString("\r") case '"': - b.WriteString(`"`) + if adjacentQuoteCount >= 3 || i == len(value)-1 { + adjacentQuoteCount = 0 + b.WriteString(`\"`) + } else { + b.WriteString(`"`) + } case '\\': b.WriteString(`\`) default: @@ -90,7 +103,30 @@ func encodeTomlString(value string) string { return b.String() } -func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElementPerLine bool) (string, error) { +func tomlTreeStringRepresentation(t *Tree, ord marshalOrder) (string, error) { + var orderedVals []sortNode + switch ord { + case OrderPreserve: + orderedVals = sortByLines(t) + default: + orderedVals = sortAlphabetical(t) + } + + var values []string + for _, node := range orderedVals { + k := node.key + v := t.values[k] + + repr, err := tomlValueStringRepresentation(v, "", "", ord, false) + if err != nil { + return "", err + } + values = append(values, quoteKeyIfNeeded(k)+" = "+repr) + } + return "{ " + strings.Join(values, ", ") + " }", nil +} + +func tomlValueStringRepresentation(v interface{}, commented string, indent string, ord marshalOrder, arraysOneElementPerLine bool) (string, error) { // this interface check is added to dereference the change made in the writeTo function. // That change was made to allow this function to see formatting options. tv, ok := v.(*tomlValue) @@ -106,20 +142,28 @@ func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElemen case int64: return strconv.FormatInt(value, 10), nil case float64: - // Ensure a round float does contain a decimal point. Otherwise feeding - // the output back to the parser would convert to an integer. + // Default bit length is full 64 + bits := 64 + // Float panics if nan is used + if !math.IsNaN(value) { + // if 32 bit accuracy is enough to exactly show, use 32 + _, acc := big.NewFloat(value).Float32() + if acc == big.Exact { + bits = 32 + } + } if math.Trunc(value) == value { - return strings.ToLower(strconv.FormatFloat(value, 'f', 1, 32)), nil + return strings.ToLower(strconv.FormatFloat(value, 'f', 1, bits)), nil } - return strings.ToLower(strconv.FormatFloat(value, 'f', -1, 32)), nil + return strings.ToLower(strconv.FormatFloat(value, 'f', -1, bits)), nil case string: if tv.multiline { - return "\"\"\"\n" + encodeMultilineTomlString(value) + "\"\"\"", nil + return "\"\"\"\n" + encodeMultilineTomlString(value, commented) + "\"\"\"", nil } return "\"" + encodeTomlString(value) + "\"", nil case []byte: b, _ := v.([]byte) - return tomlValueStringRepresentation(string(b), indent, arraysOneElementPerLine) + return tomlValueStringRepresentation(string(b), commented, indent, ord, arraysOneElementPerLine) case bool: if value { return "true", nil @@ -127,6 +171,14 @@ func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElemen return "false", nil case time.Time: return value.Format(time.RFC3339), nil + case LocalDate: + return value.String(), nil + case LocalDateTime: + return value.String(), nil + case LocalTime: + return value.String(), nil + case *Tree: + return tomlTreeStringRepresentation(value, ord) case nil: return "", nil } @@ -137,7 +189,7 @@ func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElemen var values []string for i := 0; i < rv.Len(); i++ { item := rv.Index(i).Interface() - itemRepr, err := tomlValueStringRepresentation(item, indent, arraysOneElementPerLine) + itemRepr, err := tomlValueStringRepresentation(item, commented, indent, ord, arraysOneElementPerLine) if err != nil { return "", err } @@ -151,16 +203,16 @@ func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElemen for _, value := range values { stringBuffer.WriteString(valueIndent) - stringBuffer.WriteString(value) + stringBuffer.WriteString(commented + value) stringBuffer.WriteString(`,`) stringBuffer.WriteString("\n") } - stringBuffer.WriteString(indent + "]") + stringBuffer.WriteString(indent + commented + "]") return stringBuffer.String(), nil } - return "[" + strings.Join(values, ",") + "]", nil + return "[" + strings.Join(values, ", ") + "]", nil } return "", fmt.Errorf("unsupported value type %T: %v", v, v) } @@ -255,10 +307,10 @@ func sortAlphabetical(t *Tree) (vals []sortNode) { } func (t *Tree) writeTo(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool) (int64, error) { - return t.writeToOrdered(w, indent, keyspace, bytesCount, arraysOneElementPerLine, OrderAlphabetical) + return t.writeToOrdered(w, indent, keyspace, bytesCount, arraysOneElementPerLine, OrderAlphabetical, " ", false) } -func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool, ord marshalOrder) (int64, error) { +func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool, ord marshalOrder, indentString string, parentCommented bool) (int64, error) { var orderedVals []sortNode switch ord { @@ -274,14 +326,10 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i k := node.key v := t.values[k] - combinedKey := k + combinedKey := quoteKeyIfNeeded(k) if keyspace != "" { combinedKey = keyspace + "." + combinedKey } - var commented string - if t.commented { - commented = "# " - } switch node := v.(type) { // node has to be of those two types given how keys are sorted above @@ -302,24 +350,33 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i return bytesCount, errc } } + + var commented string + if parentCommented || t.commented || tv.commented { + commented = "# " + } writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[", combinedKey, "]\n") bytesCount += int64(writtenBytesCount) if err != nil { return bytesCount, err } - bytesCount, err = node.writeToOrdered(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine, ord) + bytesCount, err = node.writeToOrdered(w, indent+indentString, combinedKey, bytesCount, arraysOneElementPerLine, ord, indentString, parentCommented || t.commented || tv.commented) if err != nil { return bytesCount, err } case []*Tree: for _, subTree := range node { + var commented string + if parentCommented || t.commented || subTree.commented { + commented = "# " + } writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[[", combinedKey, "]]\n") bytesCount += int64(writtenBytesCount) if err != nil { return bytesCount, err } - bytesCount, err = subTree.writeToOrdered(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine, ord) + bytesCount, err = subTree.writeToOrdered(w, indent+indentString, combinedKey, bytesCount, arraysOneElementPerLine, ord, indentString, parentCommented || t.commented || subTree.commented) if err != nil { return bytesCount, err } @@ -332,7 +389,11 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i return bytesCount, fmt.Errorf("invalid value type at %s: %T", k, t.values[k]) } - repr, err := tomlValueStringRepresentation(v, indent, arraysOneElementPerLine) + var commented string + if parentCommented || t.commented || v.commented { + commented = "# " + } + repr, err := tomlValueStringRepresentation(v, commented, indent, ord, arraysOneElementPerLine) if err != nil { return bytesCount, err } @@ -350,11 +411,8 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i } } - var commented string - if v.commented { - commented = "# " - } - writtenBytesCount, err := writeStrings(w, indent, commented, k, " = ", repr, "\n") + quotedKey := quoteKeyIfNeeded(k) + writtenBytesCount, err := writeStrings(w, indent, commented, quotedKey, " = ", repr, "\n") bytesCount += int64(writtenBytesCount) if err != nil { return bytesCount, err @@ -365,6 +423,32 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i return bytesCount, nil } +// quote a key if it does not fit the bare key format (A-Za-z0-9_-) +// quoted keys use the same rules as strings +func quoteKeyIfNeeded(k string) string { + // when encoding a map with the 'quoteMapKeys' option enabled, the tree will contain + // keys that have already been quoted. + // not an ideal situation, but good enough of a stop gap. + if len(k) >= 2 && k[0] == '"' && k[len(k)-1] == '"' { + return k + } + isBare := true + for _, r := range k { + if !isValidBareChar(r) { + isBare = false + break + } + } + if isBare { + return k + } + return quoteKey(k) +} + +func quoteKey(k string) string { + return "\"" + encodeTomlString(k) + "\"" +} + func writeStrings(w io.Writer, s ...string) (int, error) { var n int for i := range s { @@ -387,12 +471,11 @@ func (t *Tree) WriteTo(w io.Writer) (int64, error) { // Output spans multiple lines, and is suitable for ingest by a TOML parser. // If the conversion cannot be performed, ToString returns a non-nil error. func (t *Tree) ToTomlString() (string, error) { - var buf bytes.Buffer - _, err := t.WriteTo(&buf) + b, err := t.Marshal() if err != nil { return "", err } - return buf.String(), nil + return string(b), nil } // String generates a human-readable representation of the current tree. diff --git a/vendor/github.com/spf13/afero/.gitignore b/vendor/github.com/spf13/afero/.gitignore new file mode 100644 index 0000000000..9c1d986118 --- /dev/null +++ b/vendor/github.com/spf13/afero/.gitignore @@ -0,0 +1,2 @@ +sftpfs/file1 +sftpfs/test/ diff --git a/vendor/github.com/spf13/afero/.travis.yml b/vendor/github.com/spf13/afero/.travis.yml index 0637db726d..fdaa99980c 100644 --- a/vendor/github.com/spf13/afero/.travis.yml +++ b/vendor/github.com/spf13/afero/.travis.yml @@ -1,21 +1,22 @@ -sudo: false
-language: go
-
-go:
- - 1.9
- - "1.10"
- - tip
-
-os:
- - linux
- - osx
-
-matrix:
- allow_failures:
- - go: tip
- fast_finish: true
-
-script:
- - go build
- - go test -race -v ./...
-
+sudo: false +language: go + +go: + - "1.13" + - "1.14" + - tip + +os: + - linux + - osx + +matrix: + allow_failures: + - go: tip + fast_finish: true + +script: + - go build -v ./... + - go test -count=1 -cover -race -v ./... + - go vet ./... + - FILES=$(gofmt -s -l . zipfs sftpfs mem); if [[ -n "${FILES}" ]]; then echo "You have go format errors; gofmt your changes"; exit 1; fi diff --git a/vendor/github.com/spf13/afero/README.md b/vendor/github.com/spf13/afero/README.md index 0c9b04b53f..16b06f2ba0 100644 --- a/vendor/github.com/spf13/afero/README.md +++ b/vendor/github.com/spf13/afero/README.md @@ -6,7 +6,7 @@ A FileSystem Abstraction System for Go # Overview -Afero is an filesystem framework providing a simple, uniform and universal API +Afero is a filesystem framework providing a simple, uniform and universal API interacting with any filesystem, as an abstraction layer providing interfaces, types and methods. Afero has an exceptionally clean interface and simple design without needless constructors or initialization methods. @@ -18,7 +18,7 @@ and benefit of the os and ioutil packages. Afero provides significant improvements over using the os package alone, most notably the ability to create mock and testing filesystems without relying on the disk. -It is suitable for use in a any situation where you would consider using the OS +It is suitable for use in any situation where you would consider using the OS package as it provides an additional abstraction that makes it easy to use a memory backed file system during testing. It also adds support for the http filesystem for full interoperability. @@ -41,8 +41,8 @@ Afero is easy to use and easier to adopt. A few different ways you could use Afero: -* Use the interfaces alone to define you own file system. -* Wrap for the OS packages. +* Use the interfaces alone to define your own file system. +* Wrapper for the OS packages. * Define different filesystems for different parts of your application. * Use Afero for mock filesystems while testing @@ -380,7 +380,6 @@ The following is a short list of possible backends we hope someone will implement: * SSH -* ZIP * TAR * S3 @@ -406,28 +405,7 @@ Googles very well. ## Release Notes -* **0.10.0** 2015.12.10 - * Full compatibility with Windows - * Introduction of afero utilities - * Test suite rewritten to work cross platform - * Normalize paths for MemMapFs - * Adding Sync to the file interface - * **Breaking Change** Walk and ReadDir have changed parameter order - * Moving types used by MemMapFs to a subpackage - * General bugfixes and improvements -* **0.9.0** 2015.11.05 - * New Walk function similar to filepath.Walk - * MemMapFs.OpenFile handles O_CREATE, O_APPEND, O_TRUNC - * MemMapFs.Remove now really deletes the file - * InMemoryFile.Readdir and Readdirnames work correctly - * InMemoryFile functions lock it for concurrent access - * Test suite improvements -* **0.8.0** 2014.10.28 - * First public version - * Interfaces feel ready for people to build using - * Interfaces satisfy all known uses - * MemMapFs passes the majority of the OS test suite - * OsFs passes the majority of the OS test suite +See the [Releases Page](https://github.com/spf13/afero/releases). ## Contributing diff --git a/vendor/github.com/spf13/afero/appveyor.yml b/vendor/github.com/spf13/afero/appveyor.yml index a633ad500c..5d2f34bf16 100644 --- a/vendor/github.com/spf13/afero/appveyor.yml +++ b/vendor/github.com/spf13/afero/appveyor.yml @@ -10,6 +10,6 @@ build_script: go get -v github.com/spf13/afero/... - go build github.com/spf13/afero + go build -v github.com/spf13/afero/... test_script: -- cmd: go test -race -v github.com/spf13/afero/... +- cmd: go test -count=1 -cover -race -v github.com/spf13/afero/... diff --git a/vendor/github.com/spf13/afero/basepath.go b/vendor/github.com/spf13/afero/basepath.go index 616ff8ff74..3a14b833e4 100644 --- a/vendor/github.com/spf13/afero/basepath.go +++ b/vendor/github.com/spf13/afero/basepath.go @@ -177,4 +177,30 @@ func (b *BasePathFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { return fi, false, err } +func (b *BasePathFs) SymlinkIfPossible(oldname, newname string) error { + oldname, err := b.RealPath(oldname) + if err != nil { + return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: err} + } + newname, err = b.RealPath(newname) + if err != nil { + return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: err} + } + if linker, ok := b.source.(Linker); ok { + return linker.SymlinkIfPossible(oldname, newname) + } + return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: ErrNoSymlink} +} + +func (b *BasePathFs) ReadlinkIfPossible(name string) (string, error) { + name, err := b.RealPath(name) + if err != nil { + return "", &os.PathError{Op: "readlink", Path: name, Err: err} + } + if reader, ok := b.source.(LinkReader); ok { + return reader.ReadlinkIfPossible(name) + } + return "", &os.PathError{Op: "readlink", Path: name, Err: ErrNoReadlink} +} + // vim: ts=4 sw=4 noexpandtab nolist syn=go diff --git a/vendor/github.com/spf13/afero/const_bsds.go b/vendor/github.com/spf13/afero/const_bsds.go index 5728243d96..18b45824be 100644 --- a/vendor/github.com/spf13/afero/const_bsds.go +++ b/vendor/github.com/spf13/afero/const_bsds.go @@ -11,7 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// +build darwin openbsd freebsd netbsd dragonfly +// +build aix darwin openbsd freebsd netbsd dragonfly package afero diff --git a/vendor/github.com/spf13/afero/const_win_unix.go b/vendor/github.com/spf13/afero/const_win_unix.go index 968fc2783e..2b850e4ddb 100644 --- a/vendor/github.com/spf13/afero/const_win_unix.go +++ b/vendor/github.com/spf13/afero/const_win_unix.go @@ -15,6 +15,7 @@ // +build !freebsd // +build !dragonfly // +build !netbsd +// +build !aix package afero diff --git a/vendor/github.com/spf13/afero/copyOnWriteFs.go b/vendor/github.com/spf13/afero/copyOnWriteFs.go index e8108a851e..96b7701261 100644 --- a/vendor/github.com/spf13/afero/copyOnWriteFs.go +++ b/vendor/github.com/spf13/afero/copyOnWriteFs.go @@ -117,6 +117,26 @@ func (u *CopyOnWriteFs) LstatIfPossible(name string) (os.FileInfo, bool, error) return fi, false, err } +func (u *CopyOnWriteFs) SymlinkIfPossible(oldname, newname string) error { + if slayer, ok := u.layer.(Linker); ok { + return slayer.SymlinkIfPossible(oldname, newname) + } + + return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: ErrNoSymlink} +} + +func (u *CopyOnWriteFs) ReadlinkIfPossible(name string) (string, error) { + if rlayer, ok := u.layer.(LinkReader); ok { + return rlayer.ReadlinkIfPossible(name) + } + + if rbase, ok := u.base.(LinkReader); ok { + return rbase.ReadlinkIfPossible(name) + } + + return "", &os.PathError{Op: "readlink", Path: name, Err: ErrNoReadlink} +} + func (u *CopyOnWriteFs) isNotExist(err error) bool { if e, ok := err.(*os.PathError); ok { err = e.Err diff --git a/vendor/github.com/spf13/afero/go.mod b/vendor/github.com/spf13/afero/go.mod index 0868550995..4b2384b38d 100644 --- a/vendor/github.com/spf13/afero/go.mod +++ b/vendor/github.com/spf13/afero/go.mod @@ -1,3 +1,9 @@ module github.com/spf13/afero -require golang.org/x/text v0.3.0 +require ( + github.com/pkg/sftp v1.10.1 + golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 + golang.org/x/text v0.3.0 +) + +go 1.13 diff --git a/vendor/github.com/spf13/afero/go.sum b/vendor/github.com/spf13/afero/go.sum index 6bad37b2a7..4b7664829a 100644 --- a/vendor/github.com/spf13/afero/go.sum +++ b/vendor/github.com/spf13/afero/go.sum @@ -1,2 +1,20 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1 h1:VasscCm72135zRysgrJDKsntdmPN+OuU3+nnHYA9wyc= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 h1:7KByu05hhLed2MO29w7p1XfZvZ13m8mub3shuVftRs0= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/spf13/afero/ioutil.go b/vendor/github.com/spf13/afero/ioutil.go index 5c3a3d8fff..a403133e27 100644 --- a/vendor/github.com/spf13/afero/ioutil.go +++ b/vendor/github.com/spf13/afero/ioutil.go @@ -22,6 +22,7 @@ import ( "path/filepath" "sort" "strconv" + "strings" "sync" "time" ) @@ -147,7 +148,7 @@ func reseed() uint32 { return uint32(time.Now().UnixNano() + int64(os.Getpid())) } -func nextSuffix() string { +func nextRandom() string { randmu.Lock() r := rand if r == 0 { @@ -159,27 +160,36 @@ func nextSuffix() string { return strconv.Itoa(int(1e9 + r%1e9))[1:] } -// TempFile creates a new temporary file in the directory dir -// with a name beginning with prefix, opens the file for reading -// and writing, and returns the resulting *File. +// TempFile creates a new temporary file in the directory dir, +// opens the file for reading and writing, and returns the resulting *os.File. +// The filename is generated by taking pattern and adding a random +// string to the end. If pattern includes a "*", the random string +// replaces the last "*". // If dir is the empty string, TempFile uses the default directory // for temporary files (see os.TempDir). // Multiple programs calling TempFile simultaneously -// will not choose the same file. The caller can use f.Name() -// to find the pathname of the file. It is the caller's responsibility +// will not choose the same file. The caller can use f.Name() +// to find the pathname of the file. It is the caller's responsibility // to remove the file when no longer needed. -func (a Afero) TempFile(dir, prefix string) (f File, err error) { - return TempFile(a.Fs, dir, prefix) +func (a Afero) TempFile(dir, pattern string) (f File, err error) { + return TempFile(a.Fs, dir, pattern) } -func TempFile(fs Fs, dir, prefix string) (f File, err error) { +func TempFile(fs Fs, dir, pattern string) (f File, err error) { if dir == "" { dir = os.TempDir() } + var prefix, suffix string + if pos := strings.LastIndex(pattern, "*"); pos != -1 { + prefix, suffix = pattern[:pos], pattern[pos+1:] + } else { + prefix = pattern + } + nconflict := 0 for i := 0; i < 10000; i++ { - name := filepath.Join(dir, prefix+nextSuffix()) + name := filepath.Join(dir, prefix+nextRandom()+suffix) f, err = fs.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) if os.IsExist(err) { if nconflict++; nconflict > 10 { @@ -211,7 +221,7 @@ func TempDir(fs Fs, dir, prefix string) (name string, err error) { nconflict := 0 for i := 0; i < 10000; i++ { - try := filepath.Join(dir, prefix+nextSuffix()) + try := filepath.Join(dir, prefix+nextRandom()) err = fs.Mkdir(try, 0700) if os.IsExist(err) { if nconflict++; nconflict > 10 { diff --git a/vendor/github.com/spf13/afero/match.go b/vendor/github.com/spf13/afero/match.go index c18a87fb71..7db4b7de6e 100644 --- a/vendor/github.com/spf13/afero/match.go +++ b/vendor/github.com/spf13/afero/match.go @@ -106,5 +106,5 @@ func glob(fs Fs, dir, pattern string, matches []string) (m []string, e error) { // recognized by Match. func hasMeta(path string) bool { // TODO(niemeyer): Should other magic characters be added here? - return strings.IndexAny(path, "*?[") >= 0 + return strings.ContainsAny(path, "*?[") } diff --git a/vendor/github.com/spf13/afero/mem/file.go b/vendor/github.com/spf13/afero/mem/file.go index 7af2fb56ff..699f1fb024 100644 --- a/vendor/github.com/spf13/afero/mem/file.go +++ b/vendor/github.com/spf13/afero/mem/file.go @@ -193,8 +193,11 @@ func (f *File) Read(b []byte) (n int, err error) { } func (f *File) ReadAt(b []byte, off int64) (n int, err error) { + prev := atomic.LoadInt64(&f.at) atomic.StoreInt64(&f.at, off) - return f.Read(b) + n, err = f.Read(b) + atomic.StoreInt64(&f.at, prev) + return } func (f *File) Truncate(size int64) error { @@ -233,6 +236,9 @@ func (f *File) Seek(offset int64, whence int) (int64, error) { } func (f *File) Write(b []byte) (n int, err error) { + if f.closed == true { + return 0, ErrFileClosed + } if f.readOnly { return 0, &os.PathError{Op: "write", Path: f.fileData.name, Err: errors.New("file handle is read only")} } diff --git a/vendor/github.com/spf13/afero/memmap.go b/vendor/github.com/spf13/afero/memmap.go index 09498e70fb..6be0e9c2d8 100644 --- a/vendor/github.com/spf13/afero/memmap.go +++ b/vendor/github.com/spf13/afero/memmap.go @@ -141,9 +141,7 @@ func (m *MemMapFs) Mkdir(name string, perm os.FileMode) error { m.registerWithParent(item) m.mu.Unlock() - m.Chmod(name, perm|os.ModeDir) - - return nil + return m.setFileMode(name, perm|os.ModeDir) } func (m *MemMapFs) MkdirAll(path string, perm os.FileMode) error { @@ -212,6 +210,9 @@ func (m *MemMapFs) lockfreeOpen(name string) (*mem.FileData, error) { func (m *MemMapFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { chmod := false file, err := m.openWrite(name) + if err == nil && (flag&os.O_EXCL > 0) { + return nil, &os.PathError{Op: "open", Path: name, Err: ErrFileExists} + } if os.IsNotExist(err) && (flag&os.O_CREATE > 0) { file, err = m.Create(name) chmod = true @@ -237,7 +238,7 @@ func (m *MemMapFs) OpenFile(name string, flag int, perm os.FileMode) (File, erro } } if chmod { - m.Chmod(name, perm) + return file, m.setFileMode(name, perm) } return file, nil } @@ -269,7 +270,7 @@ func (m *MemMapFs) RemoveAll(path string) error { m.mu.RLock() defer m.mu.RUnlock() - for p, _ := range m.getData() { + for p := range m.getData() { if strings.HasPrefix(p, path) { m.mu.RUnlock() m.mu.Lock() @@ -318,6 +319,22 @@ func (m *MemMapFs) Stat(name string) (os.FileInfo, error) { } func (m *MemMapFs) Chmod(name string, mode os.FileMode) error { + const chmodBits = os.ModePerm | os.ModeSetuid | os.ModeSetgid | os.ModeSticky // Only a subset of bits are allowed to be changed. Documented under os.Chmod() + mode &= chmodBits + + m.mu.RLock() + f, ok := m.getData()[name] + m.mu.RUnlock() + if !ok { + return &os.PathError{Op: "chmod", Path: name, Err: ErrFileNotFound} + } + prevOtherBits := mem.GetFileInfo(f).Mode() & ^chmodBits + + mode = prevOtherBits | mode + return m.setFileMode(name, mode) +} + +func (m *MemMapFs) setFileMode(name string, mode os.FileMode) error { name = normalizePath(name) m.mu.RLock() diff --git a/vendor/github.com/spf13/afero/os.go b/vendor/github.com/spf13/afero/os.go index 13cc1b84c9..4761db5d72 100644 --- a/vendor/github.com/spf13/afero/os.go +++ b/vendor/github.com/spf13/afero/os.go @@ -99,3 +99,11 @@ func (OsFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { fi, err := os.Lstat(name) return fi, true, err } + +func (OsFs) SymlinkIfPossible(oldname, newname string) error { + return os.Symlink(oldname, newname) +} + +func (OsFs) ReadlinkIfPossible(name string) (string, error) { + return os.Readlink(name) +} diff --git a/vendor/github.com/spf13/afero/readonlyfs.go b/vendor/github.com/spf13/afero/readonlyfs.go index c6376ec373..f94b181b6c 100644 --- a/vendor/github.com/spf13/afero/readonlyfs.go +++ b/vendor/github.com/spf13/afero/readonlyfs.go @@ -44,6 +44,18 @@ func (r *ReadOnlyFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { return fi, false, err } +func (r *ReadOnlyFs) SymlinkIfPossible(oldname, newname string) error { + return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: ErrNoSymlink} +} + +func (r *ReadOnlyFs) ReadlinkIfPossible(name string) (string, error) { + if srdr, ok := r.source.(LinkReader); ok { + return srdr.ReadlinkIfPossible(name) + } + + return "", &os.PathError{Op: "readlink", Path: name, Err: ErrNoReadlink} +} + func (r *ReadOnlyFs) Rename(o, n string) error { return syscall.EPERM } diff --git a/vendor/github.com/spf13/afero/regexpfs.go b/vendor/github.com/spf13/afero/regexpfs.go index 9d92dbc051..c8fc008670 100644 --- a/vendor/github.com/spf13/afero/regexpfs.go +++ b/vendor/github.com/spf13/afero/regexpfs.go @@ -126,6 +126,9 @@ func (r *RegexpFs) Open(name string) (File, error) { } } f, err := r.source.Open(name) + if err != nil { + return nil, err + } return &RegexpFile{f: f, re: r.re}, nil } diff --git a/vendor/github.com/spf13/afero/symlink.go b/vendor/github.com/spf13/afero/symlink.go new file mode 100644 index 0000000000..d1c6ea53d9 --- /dev/null +++ b/vendor/github.com/spf13/afero/symlink.go @@ -0,0 +1,55 @@ +// Copyright © 2018 Steve Francia <spf@spf13.com>. +// +// 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 afero + +import ( + "errors" +) + +// Symlinker is an optional interface in Afero. It is only implemented by the +// filesystems saying so. +// It indicates support for 3 symlink related interfaces that implement the +// behaviors of the os methods: +// - Lstat +// - Symlink, and +// - Readlink +type Symlinker interface { + Lstater + Linker + LinkReader +} + +// Linker is an optional interface in Afero. It is only implemented by the +// filesystems saying so. +// It will call Symlink if the filesystem itself is, or it delegates to, the os filesystem, +// or the filesystem otherwise supports Symlink's. +type Linker interface { + SymlinkIfPossible(oldname, newname string) error +} + +// ErrNoSymlink is the error that will be wrapped in an os.LinkError if a file system +// does not support Symlink's either directly or through its delegated filesystem. +// As expressed by support for the Linker interface. +var ErrNoSymlink = errors.New("symlink not supported") + +// LinkReader is an optional interface in Afero. It is only implemented by the +// filesystems saying so. +type LinkReader interface { + ReadlinkIfPossible(name string) (string, error) +} + +// ErrNoReadlink is the error that will be wrapped in an os.Path if a file system +// does not support the readlink operation either directly or through its delegated filesystem. +// As expressed by support for the LinkReader interface. +var ErrNoReadlink = errors.New("readlink not supported") diff --git a/vendor/github.com/spf13/cast/.travis.yml b/vendor/github.com/spf13/cast/.travis.yml index 6420d1c27f..833a48799e 100644 --- a/vendor/github.com/spf13/cast/.travis.yml +++ b/vendor/github.com/spf13/cast/.travis.yml @@ -4,6 +4,7 @@ env: sudo: required go: - "1.11.x" + - "1.12.x" - tip os: - linux diff --git a/vendor/github.com/spf13/cast/Makefile b/vendor/github.com/spf13/cast/Makefile index 7ccf8930b5..f01a5dbb6e 100644 --- a/vendor/github.com/spf13/cast/Makefile +++ b/vendor/github.com/spf13/cast/Makefile @@ -1,4 +1,4 @@ -# A Self-Documenting Makefile: http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html +GOVERSION := $(shell go version | cut -d ' ' -f 3 | cut -d '.' -f 2) .PHONY: check fmt lint test test-race vet test-cover-html help .DEFAULT_GOAL := help @@ -12,11 +12,13 @@ test-race: ## Run tests with race detector go test -race ./... fmt: ## Run gofmt linter +ifeq "$(GOVERSION)" "12" @for d in `go list` ; do \ if [ "`gofmt -l -s $$GOPATH/src/$$d | tee /dev/stderr`" ]; then \ echo "^ improperly formatted go files" && echo && exit 1; \ fi \ done +endif lint: ## Run golint linter @for d in `go list` ; do \ diff --git a/vendor/github.com/spf13/cast/caste.go b/vendor/github.com/spf13/cast/caste.go index a4859fb0af..70c7291bed 100644 --- a/vendor/github.com/spf13/cast/caste.go +++ b/vendor/github.com/spf13/cast/caste.go @@ -819,15 +819,15 @@ func ToStringE(i interface{}) (string, error) { case int8: return strconv.FormatInt(int64(s), 10), nil case uint: - return strconv.FormatInt(int64(s), 10), nil + return strconv.FormatUint(uint64(s), 10), nil case uint64: - return strconv.FormatInt(int64(s), 10), nil + return strconv.FormatUint(uint64(s), 10), nil case uint32: - return strconv.FormatInt(int64(s), 10), nil + return strconv.FormatUint(uint64(s), 10), nil case uint16: - return strconv.FormatInt(int64(s), 10), nil + return strconv.FormatUint(uint64(s), 10), nil case uint8: - return strconv.FormatInt(int64(s), 10), nil + return strconv.FormatUint(uint64(s), 10), nil case []byte: return string(s), nil case template.HTML: diff --git a/vendor/github.com/spf13/viper/.editorconfig b/vendor/github.com/spf13/viper/.editorconfig new file mode 100644 index 0000000000..63afcbcdd4 --- /dev/null +++ b/vendor/github.com/spf13/viper/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.go] +indent_style = tab + +[{Makefile, *.mk}] +indent_style = tab diff --git a/vendor/github.com/spf13/viper/.gitignore b/vendor/github.com/spf13/viper/.gitignore index 01b5c44b9c..8962508398 100644 --- a/vendor/github.com/spf13/viper/.gitignore +++ b/vendor/github.com/spf13/viper/.gitignore @@ -1,29 +1,5 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.bench - -.vscode - -# exclude dependencies in the `/vendor` folder -vendor +/.idea/ +/bin/ +/build/ +/var/ +/vendor/ diff --git a/vendor/github.com/spf13/viper/.golangci.yml b/vendor/github.com/spf13/viper/.golangci.yml new file mode 100644 index 0000000000..a0755ce7e1 --- /dev/null +++ b/vendor/github.com/spf13/viper/.golangci.yml @@ -0,0 +1,27 @@ +linters-settings: + golint: + min-confidence: 0.1 + goimports: + local-prefixes: github.com/spf13/viper + +linters: + enable-all: true + disable: + - funlen + - maligned + + # TODO: fix me + - wsl + - gochecknoinits + - gosimple + - gochecknoglobals + - errcheck + - lll + - godox + - scopelint + - gocyclo + - gocognit + - gocritic + +service: + golangci-lint-version: 1.21.x diff --git a/vendor/github.com/spf13/viper/.travis.yml b/vendor/github.com/spf13/viper/.travis.yml deleted file mode 100644 index bb83057ba4..0000000000 --- a/vendor/github.com/spf13/viper/.travis.yml +++ /dev/null @@ -1,31 +0,0 @@ -go_import_path: github.com/spf13/viper - -language: go - -env: - global: - - GO111MODULE="on" - -go: - - 1.11.x - - tip - -os: - - linux - - osx - -matrix: - allow_failures: - - go: tip - fast_finish: true - -script: - - go install ./... - - diff -u <(echo -n) <(gofmt -d .) - - go test -v ./... - -after_success: - - go get -u -d github.com/spf13/hugo - - cd $GOPATH/src/github.com/spf13/hugo && make && ./hugo -s docs && cd - - -sudo: false diff --git a/vendor/github.com/spf13/viper/Makefile b/vendor/github.com/spf13/viper/Makefile new file mode 100644 index 0000000000..1c2cab03f4 --- /dev/null +++ b/vendor/github.com/spf13/viper/Makefile @@ -0,0 +1,76 @@ +# A Self-Documenting Makefile: http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html + +OS = $(shell uname | tr A-Z a-z) +export PATH := $(abspath bin/):${PATH} + +# Build variables +BUILD_DIR ?= build +export CGO_ENABLED ?= 0 +export GOOS = $(shell go env GOOS) +ifeq (${VERBOSE}, 1) +ifeq ($(filter -v,${GOARGS}),) + GOARGS += -v +endif +TEST_FORMAT = short-verbose +endif + +# Dependency versions +GOTESTSUM_VERSION = 0.4.0 +GOLANGCI_VERSION = 1.21.0 + +# Add the ability to override some variables +# Use with care +-include override.mk + +.PHONY: clear +clear: ## Clear the working area and the project + rm -rf bin/ + +.PHONY: check +check: test lint ## Run tests and linters + +bin/gotestsum: bin/gotestsum-${GOTESTSUM_VERSION} + @ln -sf gotestsum-${GOTESTSUM_VERSION} bin/gotestsum +bin/gotestsum-${GOTESTSUM_VERSION}: + @mkdir -p bin + curl -L https://github.com/gotestyourself/gotestsum/releases/download/v${GOTESTSUM_VERSION}/gotestsum_${GOTESTSUM_VERSION}_${OS}_amd64.tar.gz | tar -zOxf - gotestsum > ./bin/gotestsum-${GOTESTSUM_VERSION} && chmod +x ./bin/gotestsum-${GOTESTSUM_VERSION} + +TEST_PKGS ?= ./... +.PHONY: test +test: TEST_FORMAT ?= short +test: SHELL = /bin/bash +test: export CGO_ENABLED=1 +test: bin/gotestsum ## Run tests + @mkdir -p ${BUILD_DIR} + bin/gotestsum --no-summary=skipped --junitfile ${BUILD_DIR}/coverage.xml --format ${TEST_FORMAT} -- -race -coverprofile=${BUILD_DIR}/coverage.txt -covermode=atomic $(filter-out -v,${GOARGS}) $(if ${TEST_PKGS},${TEST_PKGS},./...) + +bin/golangci-lint: bin/golangci-lint-${GOLANGCI_VERSION} + @ln -sf golangci-lint-${GOLANGCI_VERSION} bin/golangci-lint +bin/golangci-lint-${GOLANGCI_VERSION}: + @mkdir -p bin + curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | bash -s -- -b ./bin/ v${GOLANGCI_VERSION} + @mv bin/golangci-lint $@ + +.PHONY: lint +lint: bin/golangci-lint ## Run linter + bin/golangci-lint run + +.PHONY: fix +fix: bin/golangci-lint ## Fix lint violations + bin/golangci-lint run --fix + +# Add custom targets here +-include custom.mk + +.PHONY: list +list: ## List all make targets + @${MAKE} -pRrn : -f $(MAKEFILE_LIST) 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | egrep -v -e '^[^[:alnum:]]' -e '^$@$$' | sort + +.PHONY: help +.DEFAULT_GOAL := help +help: + @grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +# Variable outputting/exporting rules +var-%: ; @echo $($*) +varexport-%: ; @echo $*=$($*) diff --git a/vendor/github.com/spf13/viper/README.md b/vendor/github.com/spf13/viper/README.md index 0208eac84d..dfd8034fd5 100644 --- a/vendor/github.com/spf13/viper/README.md +++ b/vendor/github.com/spf13/viper/README.md @@ -1,6 +1,13 @@ -![viper logo](https://cloud.githubusercontent.com/assets/173412/10886745/998df88a-8151-11e5-9448-4736db51020d.png) +![Viper](.github/logo.png?raw=true) -Go configuration with fangs! +[![Mentioned in Awesome Go](https://awesome.re/mentioned-badge-flat.svg)](https://github.com/avelino/awesome-go#configuration) + +[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/spf13/viper/CI?style=flat-square)](https://github.com/spf13/viper/actions?query=workflow%3ACI) +[![Join the chat at https://gitter.im/spf13/viper](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/spf13/viper?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Go Report Card](https://goreportcard.com/badge/github.com/spf13/viper?style=flat-square)](https://goreportcard.com/report/github.com/spf13/viper) +[![go.dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white&style=flat-square)](https://pkg.go.dev/mod/github.com/spf13/viper) + +**Go configuration with fangs!** Many Go projects are built using Viper including: @@ -12,8 +19,14 @@ Many Go projects are built using Viper including: * [BloomApi](https://www.bloomapi.com/) * [doctl](https://github.com/digitalocean/doctl) * [Clairctl](https://github.com/jgsqware/clairctl) +* [Mercure](https://mercure.rocks) + -[![Build Status](https://travis-ci.org/spf13/viper.svg)](https://travis-ci.org/spf13/viper) [![Join the chat at https://gitter.im/spf13/viper](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/spf13/viper?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![GoDoc](https://godoc.org/github.com/spf13/viper?status.svg)](https://godoc.org/github.com/spf13/viper) +## Install + +```console +go get github.com/spf13/viper +``` ## What is Viper? @@ -23,7 +36,7 @@ to work within an application, and can handle all types of configuration needs and formats. It supports: * setting defaults -* reading from JSON, TOML, YAML, HCL, and Java properties config files +* reading from JSON, TOML, YAML, HCL, envfile and Java properties config files * live watching and re-reading of config files (optional) * reading from environment variables * reading from remote config systems (etcd or Consul), and watching changes @@ -31,8 +44,8 @@ and formats. It supports: * reading from buffer * setting explicit values -Viper can be thought of as a registry for all of your applications -configuration needs. +Viper can be thought of as a registry for all of your applications configuration needs. + ## Why Viper? @@ -42,34 +55,31 @@ Viper is here to help with that. Viper does the following for you: -1. Find, load, and unmarshal a configuration file in JSON, TOML, YAML, HCL, or Java properties formats. -2. Provide a mechanism to set default values for your different - configuration options. -3. Provide a mechanism to set override values for options specified through - command line flags. -4. Provide an alias system to easily rename parameters without breaking existing - code. -5. Make it easy to tell the difference between when a user has provided a - command line or config file which is the same as the default. +1. Find, load, and unmarshal a configuration file in JSON, TOML, YAML, HCL, INI, envfile or Java properties formats. +2. Provide a mechanism to set default values for your different configuration options. +3. Provide a mechanism to set override values for options specified through command line flags. +4. Provide an alias system to easily rename parameters without breaking existing code. +5. Make it easy to tell the difference between when a user has provided a command line or config file which is the same as the default. -Viper uses the following precedence order. Each item takes precedence over the -item below it: +Viper uses the following precedence order. Each item takes precedence over the item below it: - * explicit call to Set + * explicit call to `Set` * flag * env * config * key/value store * default -Viper configuration keys are case insensitive. +**Important:** Viper configuration keys are case insensitive. +There are ongoing discussions about making that optional. + ## Putting Values into Viper ### Establishing Defaults A good configuration system will support default values. A default value is not -required for a key, but it’s useful in the event that a key hasn’t been set via +required for a key, but it’s useful in the event that a key hasn't been set via config file, environment variable, remote configuration or flag. Examples: @@ -83,7 +93,7 @@ viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "cat ### Reading Config Files Viper requires minimal configuration so it knows where to look for config files. -Viper supports JSON, TOML, YAML, HCL, and Java Properties files. Viper can search multiple paths, but +Viper supports JSON, TOML, YAML, HCL, INI, envfile and Java Properties files. Viper can search multiple paths, but currently a single Viper instance only supports a single configuration file. Viper does not default to any configuration search paths leaving defaults decision to an application. @@ -94,6 +104,7 @@ where a configuration file is expected. ```go viper.SetConfigName("config") // name of config file (without extension) +viper.SetConfigType("yaml") // REQUIRED if the config file does not have the extension in the name viper.AddConfigPath("/etc/appname/") // path to look for the config file in viper.AddConfigPath("$HOME/.appname") // call multiple times to add many search paths viper.AddConfigPath(".") // optionally look for config in the working directory @@ -103,6 +114,44 @@ if err != nil { // Handle errors reading the config file } ``` +You can handle the specific case where no config file is found like this: + +```go +if err := viper.ReadInConfig(); err != nil { + if _, ok := err.(viper.ConfigFileNotFoundError); ok { + // Config file not found; ignore error if desired + } else { + // Config file was found but another error was produced + } +} + +// Config file found and successfully parsed +``` + +*NOTE [since 1.6]:* You can also have a file without an extension and specify the format programmaticaly. For those configuration files that lie in the home of the user without any extension like `.bashrc` + +### Writing Config Files + +Reading from config files is useful, but at times you want to store all modifications made at run time. +For that, a bunch of commands are available, each with its own purpose: + +* WriteConfig - writes the current viper configuration to the predefined path, if exists. Errors if no predefined path. Will overwrite the current config file, if it exists. +* SafeWriteConfig - writes the current viper configuration to the predefined path. Errors if no predefined path. Will not overwrite the current config file, if it exists. +* WriteConfigAs - writes the current viper configuration to the given filepath. Will overwrite the given file, if it exists. +* SafeWriteConfigAs - writes the current viper configuration to the given filepath. Will not overwrite the given file, if it exists. + +As a rule of the thumb, everything marked with safe won't overwrite any file, but just create if not existent, whilst the default behavior is to create or truncate. + +A small examples section: + +```go +viper.WriteConfig() // writes current config to predefined path set by 'viper.AddConfigPath()' and 'viper.SetConfigName' +viper.SafeWriteConfig() +viper.WriteConfigAs("/path/to/my/.config") +viper.SafeWriteConfigAs("/path/to/my/.config") // will error since it has already been written +viper.SafeWriteConfigAs("/path/to/my/.other_config") +``` + ### Watching and re-reading config files Viper supports the ability to have your application live read a config file while running. @@ -186,7 +235,7 @@ with ENV: * `BindEnv(string...) : error` * `SetEnvPrefix(string)` * `SetEnvKeyReplacer(string...) *strings.Replacer` - * `AllowEmptyEnvVar(bool)` + * `AllowEmptyEnv(bool)` _When working with ENV variables, it’s important to recognize that Viper treats ENV variables as case sensitive._ @@ -199,9 +248,9 @@ prefix. `BindEnv` takes one or two parameters. The first parameter is the key name, the second is the name of the environment variable. The name of the environment variable is case sensitive. If the ENV variable name is not provided, then -Viper will automatically assume that the key name matches the ENV variable name, -but the ENV variable is IN ALL CAPS. When you explicitly provide the ENV -variable name, it **does not** automatically add the prefix. +Viper will automatically assume that the ENV variable matches the following format: prefix + "_" + the key name in ALL CAPS. When you explicitly provide the ENV variable name (the second parameter), +it **does not** automatically add the prefix. For example if the second parameter is "id", +Viper will look for the ENV variable "ID". One important thing to recognize when working with ENV variables is that the value will be read each time it is accessed. Viper does not fix the value when @@ -218,6 +267,9 @@ keys to an extent. This is useful if you want to use `-` or something in your `Get()` calls, but want your environmental variables to use `_` delimiters. An example of using it can be found in `viper_test.go`. +Alternatively, you can use `EnvKeyReplacer` with `NewWithOptions` factory function. +Unlike `SetEnvKeyReplacer`, it accepts a `StringReplacer` interface allowing you to write custom string replacing logic. + By default empty environment variables are considered unset and will fall back to the next configuration source. To treat empty environment variables as set, use the `AllowEmptyEnv` method. @@ -346,12 +398,12 @@ package: `import _ "github.com/spf13/viper/remote"` -Viper will read a config string (as JSON, TOML, YAML or HCL) retrieved from a path +Viper will read a config string (as JSON, TOML, YAML, HCL or envfile) retrieved from a path in a Key/Value store such as etcd or Consul. These values take precedence over default values, but are overridden by configuration values retrieved from disk, flags, or environment variables. -Viper uses [crypt](https://github.com/xordataexchange/crypt) to retrieve +Viper uses [crypt](https://github.com/bketelsen/crypt) to retrieve configuration from the K/V store, which means that you can store your configuration values encrypted and have them automatically decrypted if you have the correct gpg keyring. Encryption is optional. @@ -363,7 +415,7 @@ independently of it. K/V store. `crypt` defaults to etcd on http://127.0.0.1:4001. ```bash -$ go get github.com/xordataexchange/crypt/bin/crypt +$ go get github.com/bketelsen/crypt/bin/crypt $ crypt set -plaintext /config/hugo.json /Users/hugo/settings/config.json ``` @@ -381,12 +433,12 @@ how to use Consul. #### etcd ```go viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001","/config/hugo.json") -viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop" +viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop", "env", "dotenv" err := viper.ReadRemoteConfig() ``` #### Consul -You need to set a key to Consul key/value storage with JSON value containing your desired config. +You need to set a key to Consul key/value storage with JSON value containing your desired config. For example, create a Consul key/value store key `MY_CONSUL_KEY` with value: ```json @@ -405,11 +457,21 @@ fmt.Println(viper.Get("port")) // 8080 fmt.Println(viper.Get("hostname")) // myhostname.com ``` +#### Firestore + +```go +viper.AddRemoteProvider("firestore", "google-cloud-project-id", "collection/document") +viper.SetConfigType("json") // Config's format: "json", "toml", "yaml", "yml" +err := viper.ReadRemoteConfig() +``` + +Of course, you're allowed to use `SecureRemoteProvider` also + ### Remote Key/Value Store Example - Encrypted ```go viper.AddSecureRemoteProvider("etcd","http://127.0.0.1:4001","/config/hugo.json","/etc/secrets/mykeyring.gpg") -viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop" +viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop", "env", "dotenv" err := viper.ReadRemoteConfig() ``` @@ -420,7 +482,7 @@ err := viper.ReadRemoteConfig() var runtime_viper = viper.New() runtime_viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001", "/config/hugo.yml") -runtime_viper.SetConfigType("yaml") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop" +runtime_viper.SetConfigType("yaml") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop", "env", "dotenv" // read from remote config the first time. err := runtime_viper.ReadRemoteConfig() @@ -456,6 +518,7 @@ The following functions and methods exist: * `GetBool(key string) : bool` * `GetFloat64(key string) : float64` * `GetInt(key string) : int` + * `GetIntSlice(key string) : []int` * `GetString(key string) : string` * `GetStringMap(key string) : map[string]interface{}` * `GetStringMapString(key string) : map[string]string` @@ -611,30 +674,89 @@ type config struct { var C config -err := Unmarshal(&C) +err := viper.Unmarshal(&C) +if err != nil { + t.Fatalf("unable to decode into struct, %v", err) +} +``` + +If you want to unmarshal configuration where the keys themselves contain dot (the default key delimiter), +you have to change the delimiter: + +```go +v := viper.NewWithOptions(viper.KeyDelimiter("::")) + +v.SetDefault("chart::values", map[string]interface{}{ + "ingress": map[string]interface{}{ + "annotations": map[string]interface{}{ + "traefik.frontend.rule.type": "PathPrefix", + "traefik.ingress.kubernetes.io/ssl-redirect": "true", + }, + }, +}) + +type config struct { + Chart struct{ + Values map[string]interface{} + } +} + +var C config + +v.Unmarshal(&C) +``` + +Viper also supports unmarshaling into embedded structs: + +```go +/* +Example config: + +module: + enabled: true + token: 89h3f98hbwf987h3f98wenf89ehf +*/ +type config struct { + Module struct { + Enabled bool + + moduleConfig `mapstructure:",squash"` + } +} + +// moduleConfig could be in a module specific package +type moduleConfig struct { + Token string +} + +var C config + +err := viper.Unmarshal(&C) if err != nil { t.Fatalf("unable to decode into struct, %v", err) } ``` +Viper uses [github.com/mitchellh/mapstructure](https://github.com/mitchellh/mapstructure) under the hood for unmarshaling values which uses `mapstructure` tags by default. + ### Marshalling to string -You may need to marhsal all the settings held in viper into a string rather than write them to a file. +You may need to marshal all the settings held in viper into a string rather than write them to a file. You can use your favorite format's marshaller with the config returned by `AllSettings()`. ```go import ( yaml "gopkg.in/yaml.v2" // ... -) +) func yamlStringSettings() string { c := viper.AllSettings() - bs, err := yaml.Marshal(c) - if err != nil { - t.Fatalf("unable to marshal config to YAML: %v", err) + bs, err := yaml.Marshal(c) + if err != nil { + log.Fatalf("unable to marshal config to YAML: %v", err) } - return string(bs) + return string(bs) } ``` @@ -672,13 +794,6 @@ different vipers. ## Q & A -Q: Why not INI files? - -A: Ini files are pretty awful. There’s no standard format, and they are hard to -validate. Viper is designed to work with JSON, TOML or YAML files. If someone -really wants to add this feature, I’d be happy to merge it. It’s easy to specify -which formats your application will permit. - Q: Why is it called “Viper”? A: Viper is designed to be a [companion](http://en.wikipedia.org/wiki/Viper_(G.I._Joe)) diff --git a/vendor/github.com/spf13/viper/flags.go b/vendor/github.com/spf13/viper/flags.go index dd32f4e1c2..b5ddbf5d46 100644 --- a/vendor/github.com/spf13/viper/flags.go +++ b/vendor/github.com/spf13/viper/flags.go @@ -36,7 +36,7 @@ type pflagValue struct { flag *pflag.Flag } -// HasChanges returns whether the flag has changes or not. +// HasChanged returns whether the flag has changes or not. func (p pflagValue) HasChanged() bool { return p.flag.Changed } diff --git a/vendor/github.com/spf13/viper/go.mod b/vendor/github.com/spf13/viper/go.mod index 2794300552..7d108dcc21 100644 --- a/vendor/github.com/spf13/viper/go.mod +++ b/vendor/github.com/spf13/viper/go.mod @@ -1,43 +1,40 @@ module github.com/spf13/viper +go 1.12 + require ( - github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 // indirect + github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c github.com/coreos/bbolt v1.3.2 // indirect - github.com/coreos/etcd v3.3.10+incompatible // indirect - github.com/coreos/go-semver v0.2.0 // indirect github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e // indirect github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect github.com/fsnotify/fsnotify v1.4.7 github.com/gogo/protobuf v1.2.1 // indirect github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef // indirect - github.com/google/btree v1.0.0 // indirect - github.com/gorilla/websocket v1.4.0 // indirect + github.com/gorilla/websocket v1.4.2 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.9.0 // indirect github.com/hashicorp/hcl v1.0.0 github.com/jonboulle/clockwork v0.1.0 // indirect - github.com/magiconair/properties v1.8.0 + github.com/magiconair/properties v1.8.1 github.com/mitchellh/mapstructure v1.1.2 github.com/pelletier/go-toml v1.2.0 github.com/prometheus/client_golang v0.9.3 // indirect + github.com/smartystreets/goconvey v1.6.4 // indirect github.com/soheilhy/cmux v0.1.4 // indirect github.com/spf13/afero v1.1.2 github.com/spf13/cast v1.3.0 github.com/spf13/jwalterweatherman v1.0.0 github.com/spf13/pflag v1.0.3 - github.com/stretchr/testify v1.2.2 + github.com/stretchr/testify v1.3.0 + github.com/subosito/gotenv v1.2.0 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect - github.com/ugorji/go v1.1.4 // indirect github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect - github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 go.etcd.io/bbolt v1.3.2 // indirect go.uber.org/atomic v1.4.0 // indirect go.uber.org/multierr v1.1.0 // indirect go.uber.org/zap v1.10.0 // indirect - golang.org/x/net v0.0.0-20190522155817-f3200d17e092 // indirect - golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect - google.golang.org/grpc v1.21.0 // indirect - gopkg.in/yaml.v2 v2.2.2 + gopkg.in/ini.v1 v1.51.0 + gopkg.in/yaml.v2 v2.2.4 ) diff --git a/vendor/github.com/spf13/viper/go.sum b/vendor/github.com/spf13/viper/go.sum index 97afaffe22..463aa7dbf5 100644 --- a/vendor/github.com/spf13/viper/go.sum +++ b/vendor/github.com/spf13/viper/go.sum @@ -1,35 +1,62 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go/bigquery v1.0.1 h1:hL+ycaJpVE9M7nLoiXb/Pn10ENE2u+oddxbD8uu0ZVU= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0 h1:Kt+gOPPp2LEPWp8CSfxhsM8ik9CcyE/gYu+0r+RnZvM= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/firestore v1.1.0 h1:9x7Bx0A9R5/M9jibeJeZWqjeVEIxYW9fZYqB9a70/bY= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1 h1:W9tAK3E57P75u0XLLR82LZyw8VpAnhmyTOxW9qzmyj8= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0 h1:VV2nUM3wwLLGh9lSABFgZMjInyUbJeaRSE64WuAIQ+4= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c h1:+0HFd5KSZ/mm3JmhmrDukiId5iR6w4+BdFtfSy4yWIc= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/etcd v3.3.13+incompatible h1:8F3hqu9fGYLBifCmRCJsicFqDx/D68Rt3q1JMazcgBQ= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= @@ -42,24 +69,79 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 h1:Iju5GlWwrvL6UBg4zJJt3btmonfrMlCDdsejg4CZE7c= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0 h1:bM6ZAFZmc/wPFaRDi0d5L7hGEZEx/2u+Tmr2evNHDiI= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul/api v1.1.0 h1:BNQPM9ytxj6jbjjdRPioQ94T6YXriSopn0i8COv6SRA= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1 h1:LnuDWGNsoajlhGyHJvuWW6FVqRl8JOTPqS6CPTsYjhY= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0 h1:Rqb66Oo1X/eSV1x66xbDccZjhJigjg0+e82kpwzSwCI= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3 h1:EmmoJme1matNzb+hMpDuR/0sbJSUisxyqBGG676r31M= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2 h1:YZ7UKsJv+hKjqGVUUbtE3HNj79Eln2oQ75tniF6iPt0= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024 h1:rBMNdlhTLzJjJSDIjNEXX1Pz3Hmwmz91v+zycvx9PJc= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -71,20 +153,41 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0 h1:vKb8ShqSby24Yrqr/yDYkuFz8d0WUjys40rvnGC8aR0= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -99,8 +202,16 @@ github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzr github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -112,19 +223,23 @@ github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= @@ -132,47 +247,142 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5 h1:58fnuSXlxZmFdJyvtTFVmVhcMLU6v5fEb/ok4wyqtNU= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136 h1:A1gGSx58LAGVHUUsOf7IiR0u8Xb6W51gRwfDBhkdcaw= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0 h1:HyfiK1WMnHj5FXFXatD+Qs1A/xC2Run6RzeW1SyHxpc= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384 h1:TFlARGu6Czu1z7q93HTxcP1P+/ZFC/IKythI5RzrnRg= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0 h1:Q3Ui3V3/CVinFWFiW39Iw0kMuVrRzYX0wN6OPFp0lTA= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a h1:Ob5/580gVHBJZgXnff1cZDbG+xLtMVE5mDRTe+nIsX4= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.21.0 h1:G+97AoqBnmZIT91cLG/EkCoK9NSelj64P8bOHHNmGn0= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1 h1:j6XxA85m/6txkUCHvzlV5f+HBNl/1r5cZ2A/3IEFOO8= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/vendor/github.com/spf13/viper/util.go b/vendor/github.com/spf13/viper/util.go index 952cad44c6..b788969637 100644 --- a/vendor/github.com/spf13/viper/util.go +++ b/vendor/github.com/spf13/viper/util.go @@ -114,11 +114,11 @@ func absPathify(inPath string) string { return "" } -// Check if File / Directory Exists +// Check if file Exists func exists(fs afero.Fs, path string) (bool, error) { - _, err := fs.Stat(path) + stat, err := fs.Stat(path) if err == nil { - return true, nil + return !stat.IsDir(), nil } if os.IsNotExist(err) { return false, nil diff --git a/vendor/github.com/spf13/viper/viper.go b/vendor/github.com/spf13/viper/viper.go index a3d37f8c2b..f61f4ed755 100644 --- a/vendor/github.com/spf13/viper/viper.go +++ b/vendor/github.com/spf13/viper/viper.go @@ -3,7 +3,7 @@ // Use of this source code is governed by an MIT-style // license that can be found in the LICENSE file. -// Viper is a application configuration system. +// Viper is an application configuration system. // It believes that applications can be configured a variety of ways // via flags, ENVIRONMENT variables, configuration files retrieved // from the file system, or a remote key/value store. @@ -23,6 +23,7 @@ import ( "bytes" "encoding/csv" "encoding/json" + "errors" "fmt" "io" "log" @@ -33,18 +34,19 @@ import ( "sync" "time" - yaml "gopkg.in/yaml.v2" - "github.com/fsnotify/fsnotify" "github.com/hashicorp/hcl" "github.com/hashicorp/hcl/hcl/printer" "github.com/magiconair/properties" "github.com/mitchellh/mapstructure" - toml "github.com/pelletier/go-toml" + "github.com/pelletier/go-toml" "github.com/spf13/afero" "github.com/spf13/cast" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/pflag" + "github.com/subosito/gotenv" + "gopkg.in/ini.v1" + "gopkg.in/yaml.v2" ) // ConfigMarshalError happens when failing to marshal the configuration. @@ -114,6 +116,14 @@ func (fnfe ConfigFileNotFoundError) Error() string { return fmt.Sprintf("Config File %q Not Found in %q", fnfe.name, fnfe.locations) } +// ConfigFileAlreadyExistsError denotes failure to write new configuration file. +type ConfigFileAlreadyExistsError string + +// Error returns the formatted error when configuration already exists. +func (faee ConfigFileAlreadyExistsError) Error() string { + return fmt.Sprintf("Config File %q Already Exists", string(faee)) +} + // A DecoderConfigOption can be passed to viper.Unmarshal to configure // mapstructure.DecoderConfig options type DecoderConfigOption func(*mapstructure.DecoderConfig) @@ -187,7 +197,7 @@ type Viper struct { envPrefix string automaticEnvApplied bool - envKeyReplacer *strings.Replacer + envKeyReplacer StringReplacer allowEmptyEnv bool config map[string]interface{} @@ -225,13 +235,59 @@ func New() *Viper { return v } -// Intended for testing, will reset all to default settings. +// Option configures Viper using the functional options paradigm popularized by Rob Pike and Dave Cheney. +// If you're unfamiliar with this style, +// see https://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html and +// https://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis. +type Option interface { + apply(v *Viper) +} + +type optionFunc func(v *Viper) + +func (fn optionFunc) apply(v *Viper) { + fn(v) +} + +// KeyDelimiter sets the delimiter used for determining key parts. +// By default it's value is ".". +func KeyDelimiter(d string) Option { + return optionFunc(func(v *Viper) { + v.keyDelim = d + }) +} + +// StringReplacer applies a set of replacements to a string. +type StringReplacer interface { + // Replace returns a copy of s with all replacements performed. + Replace(s string) string +} + +// EnvKeyReplacer sets a replacer used for mapping environment variables to internal keys. +func EnvKeyReplacer(r StringReplacer) Option { + return optionFunc(func(v *Viper) { + v.envKeyReplacer = r + }) +} + +// NewWithOptions creates a new Viper instance. +func NewWithOptions(opts ...Option) *Viper { + v := New() + + for _, opt := range opts { + opt.apply(v) + } + + return v +} + +// Reset is intended for testing, will reset all to default settings. // In the public interface for the viper package so applications // can use it in their testing as well. func Reset() { v = New() - SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl"} - SupportedRemoteProviders = []string{"etcd", "consul"} + SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl", "dotenv", "env", "ini"} + SupportedRemoteProviders = []string{"etcd", "consul", "firestore"} } type defaultRemoteProvider struct { @@ -269,10 +325,10 @@ type RemoteProvider interface { } // SupportedExts are universally supported extensions. -var SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl"} +var SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl", "dotenv", "env", "ini"} // SupportedRemoteProviders are universally supported remote providers. -var SupportedRemoteProviders = []string{"etcd", "consul"} +var SupportedRemoteProviders = []string{"etcd", "consul", "firestore"} func OnConfigChange(run func(in fsnotify.Event)) { v.OnConfigChange(run) } func (v *Viper) OnConfigChange(run func(in fsnotify.Event)) { @@ -294,6 +350,7 @@ func (v *Viper) WatchConfig() { filename, err := v.getConfigFile() if err != nil { log.Printf("error: %v\n", err) + initWG.Done() return } @@ -343,7 +400,7 @@ func (v *Viper) WatchConfig() { } }() watcher.Add(configDir) - initWG.Done() // done initalizing the watch in this go routine, so the parent routine can move on... + initWG.Done() // done initializing the watch in this go routine, so the parent routine can move on... eventsWG.Wait() // now, wait for event loop to end in this go-routine... }() initWG.Wait() // make sure that the go routine above fully ended before returning @@ -420,7 +477,7 @@ func (v *Viper) AddConfigPath(in string) { // AddRemoteProvider adds a remote configuration source. // Remote Providers are searched in the order they are added. -// provider is a string value, "etcd" or "consul" are currently supported. +// provider is a string value: "etcd", "consul" or "firestore" are currently supported. // endpoint is the url. etcd requires http://ip:port consul requires ip:port // path is the path in the k/v store to retrieve configuration // To retrieve a config file called myapp.json from /configs/myapp.json @@ -449,14 +506,14 @@ func (v *Viper) AddRemoteProvider(provider, endpoint, path string) error { // AddSecureRemoteProvider adds a remote configuration source. // Secure Remote Providers are searched in the order they are added. -// provider is a string value, "etcd" or "consul" are currently supported. +// provider is a string value: "etcd", "consul" or "firestore" are currently supported. // endpoint is the url. etcd requires http://ip:port consul requires ip:port // secretkeyring is the filepath to your openpgp secret keyring. e.g. /etc/secrets/myring.gpg // path is the path in the k/v store to retrieve configuration // To retrieve a config file called myapp.json from /configs/myapp.json // you should set path to /configs and set config name (SetConfigName()) to // "myapp" -// Secure Remote Providers are implemented with github.com/xordataexchange/crypt +// Secure Remote Providers are implemented with github.com/bketelsen/crypt func AddSecureRemoteProvider(provider, endpoint, path, secretkeyring string) error { return v.AddSecureRemoteProvider(provider, endpoint, path, secretkeyring) } @@ -668,7 +725,7 @@ func GetViper() *Viper { func Get(key string) interface{} { return v.Get(key) } func (v *Viper) Get(key string) interface{} { lcaseKey := strings.ToLower(key) - val := v.find(lcaseKey) + val := v.find(lcaseKey, true) if val == nil { return nil } @@ -705,6 +762,8 @@ func (v *Viper) Get(key string) interface{} { return cast.ToDuration(val) case []string: return cast.ToStringSlice(val) + case []int: + return cast.ToIntSlice(val) } } @@ -794,6 +853,12 @@ func (v *Viper) GetDuration(key string) time.Duration { return cast.ToDuration(v.Get(key)) } +// GetIntSlice returns the value associated with the key as a slice of int values. +func GetIntSlice(key string) []int { return v.GetIntSlice(key) } +func (v *Viper) GetIntSlice(key string) []int { + return cast.ToIntSlice(v.Get(key)) +} + // GetStringSlice returns the value associated with the key as a slice of strings. func GetStringSlice(key string) []string { return v.GetStringSlice(key) } func (v *Viper) GetStringSlice(key string) []string { @@ -884,8 +949,11 @@ func decode(input interface{}, config *mapstructure.DecoderConfig) error { // UnmarshalExact unmarshals the config into a Struct, erroring if a field is nonexistent // in the destination struct. -func (v *Viper) UnmarshalExact(rawVal interface{}) error { - config := defaultDecoderConfig(rawVal) +func UnmarshalExact(rawVal interface{}, opts ...DecoderConfigOption) error { + return v.UnmarshalExact(rawVal, opts...) +} +func (v *Viper) UnmarshalExact(rawVal interface{}, opts ...DecoderConfigOption) error { + config := defaultDecoderConfig(rawVal, opts...) config.ErrorUnused = true err := decode(v.AllSettings(), config) @@ -928,11 +996,6 @@ func (v *Viper) BindFlagValues(flags FlagValueSet) (err error) { } // BindFlagValue binds a specific key to a FlagValue. -// Example (where serverCmd is a Cobra instance): -// -// serverCmd.Flags().Int("port", 1138, "Port to run Application server on") -// Viper.BindFlagValue("port", serverCmd.Flags().Lookup("port")) -// func BindFlagValue(key string, flag FlagValue) error { return v.BindFlagValue(key, flag) } func (v *Viper) BindFlagValue(key string, flag FlagValue) error { if flag == nil { @@ -950,7 +1013,7 @@ func BindEnv(input ...string) error { return v.BindEnv(input...) } func (v *Viper) BindEnv(input ...string) error { var key, envkey string if len(input) == 0 { - return fmt.Errorf("BindEnv missing key to bind to") + return fmt.Errorf("missing key to bind to") } key = strings.ToLower(input[0]) @@ -967,12 +1030,15 @@ func (v *Viper) BindEnv(input ...string) error { } // Given a key, find the value. -// Viper will check in the following order: -// flag, env, config file, key/value store, default. +// // Viper will check to see if an alias exists first. +// Viper will then check in the following order: +// flag, env, config file, key/value store. +// Lastly, if no value was found and flagDefault is true, and if the key +// corresponds to a flag, the flag's default value is returned. +// // Note: this assumes a lower-cased key given. -func (v *Viper) find(lcaseKey string) interface{} { - +func (v *Viper) find(lcaseKey string, flagDefault bool) interface{} { var ( val interface{} exists bool @@ -1012,6 +1078,13 @@ func (v *Viper) find(lcaseKey string) interface{} { s = strings.TrimSuffix(s, "]") res, _ := readAsCSV(s) return res + case "intSlice": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + res, _ := readAsCSV(s) + return cast.ToIntSlice(res) + case "stringToString": + return stringToStringConv(flag.ValueString()) default: return flag.ValueString() } @@ -1068,24 +1141,33 @@ func (v *Viper) find(lcaseKey string) interface{} { return nil } - // last chance: if no other value is returned and a flag does exist for the value, - // get the flag's value even if the flag's value has not changed - if flag, exists := v.pflags[lcaseKey]; exists { - switch flag.ValueType() { - case "int", "int8", "int16", "int32", "int64": - return cast.ToInt(flag.ValueString()) - case "bool": - return cast.ToBool(flag.ValueString()) - case "stringSlice": - s := strings.TrimPrefix(flag.ValueString(), "[") - s = strings.TrimSuffix(s, "]") - res, _ := readAsCSV(s) - return res - default: - return flag.ValueString() + if flagDefault { + // last chance: if no value is found and a flag does exist for the key, + // get the flag's default value even if the flag's value has not been set. + if flag, exists := v.pflags[lcaseKey]; exists { + switch flag.ValueType() { + case "int", "int8", "int16", "int32", "int64": + return cast.ToInt(flag.ValueString()) + case "bool": + return cast.ToBool(flag.ValueString()) + case "stringSlice": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + res, _ := readAsCSV(s) + return res + case "intSlice": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + res, _ := readAsCSV(s) + return cast.ToIntSlice(res) + case "stringToString": + return stringToStringConv(flag.ValueString()) + default: + return flag.ValueString() + } } + // last item, no need to check shadowing } - // last item, no need to check shadowing return nil } @@ -1099,12 +1181,36 @@ func readAsCSV(val string) ([]string, error) { return csvReader.Read() } +// mostly copied from pflag's implementation of this operation here https://github.com/spf13/pflag/blob/master/string_to_string.go#L79 +// alterations are: errors are swallowed, map[string]interface{} is returned in order to enable cast.ToStringMap +func stringToStringConv(val string) interface{} { + val = strings.Trim(val, "[]") + // An empty string would cause an empty map + if len(val) == 0 { + return map[string]interface{}{} + } + r := csv.NewReader(strings.NewReader(val)) + ss, err := r.Read() + if err != nil { + return nil + } + out := make(map[string]interface{}, len(ss)) + for _, pair := range ss { + kv := strings.SplitN(pair, "=", 2) + if len(kv) != 2 { + return nil + } + out[kv[0]] = kv[1] + } + return out +} + // IsSet checks to see if the key has been set in any of the data locations. // IsSet is case-insensitive for a key. func IsSet(key string) bool { return v.IsSet(key) } func (v *Viper) IsSet(key string) bool { lcaseKey := strings.ToLower(key) - val := v.find(lcaseKey) + val := v.find(lcaseKey, false) return val != nil } @@ -1123,8 +1229,8 @@ func (v *Viper) SetEnvKeyReplacer(r *strings.Replacer) { v.envKeyReplacer = r } -// Aliases provide another accessor for the same key. -// This enables one to change a name without breaking the application +// RegisterAlias creates an alias that provides another accessor for the same key. +// This enables one to change a name without breaking the application. func RegisterAlias(alias string, key string) { v.RegisterAlias(alias, key) } func (v *Viper) RegisterAlias(alias string, key string) { v.registerAlias(alias, strings.ToLower(key)) @@ -1311,11 +1417,10 @@ func (v *Viper) WriteConfig() error { // SafeWriteConfig writes current configuration to file only if the file does not exist. func SafeWriteConfig() error { return v.SafeWriteConfig() } func (v *Viper) SafeWriteConfig() error { - filename, err := v.getConfigFile() - if err != nil { - return err + if len(v.configPaths) < 1 { + return errors.New("missing configuration for 'configPath'") } - return v.writeConfig(filename, false) + return v.SafeWriteConfigAs(filepath.Join(v.configPaths[0], v.configName+"."+v.configType)) } // WriteConfigAs writes current configuration to a given filename. @@ -1327,38 +1432,48 @@ func (v *Viper) WriteConfigAs(filename string) error { // SafeWriteConfigAs writes current configuration to a given filename if it does not exist. func SafeWriteConfigAs(filename string) error { return v.SafeWriteConfigAs(filename) } func (v *Viper) SafeWriteConfigAs(filename string) error { + alreadyExists, err := afero.Exists(v.fs, filename) + if alreadyExists && err == nil { + return ConfigFileAlreadyExistsError(filename) + } return v.writeConfig(filename, false) } -func writeConfig(filename string, force bool) error { return v.writeConfig(filename, force) } func (v *Viper) writeConfig(filename string, force bool) error { jww.INFO.Println("Attempting to write configuration to file.") + var configType string + ext := filepath.Ext(filename) - if len(ext) <= 1 { - return fmt.Errorf("Filename: %s requires valid extension.", filename) + if ext != "" { + configType = ext[1:] + } else { + configType = v.configType } - configType := ext[1:] + if configType == "" { + return fmt.Errorf("config type could not be determined for %s", filename) + } + if !stringInSlice(configType, SupportedExts) { return UnsupportedConfigError(configType) } if v.config == nil { v.config = make(map[string]interface{}) } - var flags int - if force == true { - flags = os.O_CREATE | os.O_TRUNC | os.O_WRONLY - } else { - if _, err := os.Stat(filename); os.IsNotExist(err) { - flags = os.O_WRONLY - } else { - return fmt.Errorf("File: %s exists. Use WriteConfig to overwrite.", filename) - } + flags := os.O_CREATE | os.O_TRUNC | os.O_WRONLY + if !force { + flags |= os.O_EXCL } f, err := v.fs.OpenFile(filename, flags, v.configPermissions) if err != nil { return err } - return v.marshalWriter(f, configType) + defer f.Close() + + if err := v.marshalWriter(f, configType); err != nil { + return err + } + + return f.Sync() } // Unmarshal a Reader into a map. @@ -1382,7 +1497,7 @@ func (v *Viper) unmarshalReader(in io.Reader, c map[string]interface{}) error { } case "hcl": - obj, err := hcl.Parse(string(buf.Bytes())) + obj, err := hcl.Parse(buf.String()) if err != nil { return ConfigParseError{err} } @@ -1400,6 +1515,15 @@ func (v *Viper) unmarshalReader(in io.Reader, c map[string]interface{}) error { c[k] = v } + case "dotenv", "env": + env, err := gotenv.StrictParse(buf) + if err != nil { + return ConfigParseError{err} + } + for k, v := range env { + c[k] = v + } + case "properties", "props", "prop": v.properties = properties.NewProperties() var err error @@ -1415,6 +1539,23 @@ func (v *Viper) unmarshalReader(in io.Reader, c map[string]interface{}) error { // set innermost value deepestMap[lastKey] = value } + + case "ini": + cfg := ini.Empty() + err := cfg.Append(buf.Bytes()) + if err != nil { + return ConfigParseError{err} + } + sections := cfg.Sections() + for i := 0; i < len(sections); i++ { + section := sections[i] + keys := section.Keys() + for j := 0; j < len(keys); j++ { + key := keys[j] + value := cfg.Section(section.Name()).Key(key.Name()).String() + c[section.Name()+"."+key.Name()] = value + } + } } insensitiviseMap(c) @@ -1422,9 +1563,6 @@ func (v *Viper) unmarshalReader(in io.Reader, c map[string]interface{}) error { } // Marshal a map into Writer. -func marshalWriter(f afero.File, configType string) error { - return v.marshalWriter(f, configType) -} func (v *Viper) marshalWriter(f afero.File, configType string) error { c := v.AllSettings() switch configType { @@ -1440,6 +1578,9 @@ func (v *Viper) marshalWriter(f afero.File, configType string) error { case "hcl": b, err := json.Marshal(c) + if err != nil { + return ConfigMarshalError{err} + } ast, err := hcl.Parse(string(b)) if err != nil { return ConfigMarshalError{err} @@ -1465,6 +1606,18 @@ func (v *Viper) marshalWriter(f afero.File, configType string) error { return ConfigMarshalError{err} } + case "dotenv", "env": + lines := []string{} + for _, key := range v.AllKeys() { + envName := strings.ToUpper(strings.Replace(key, ".", "_", -1)) + val := v.Get(key) + lines = append(lines, fmt.Sprintf("%v=%v", envName, val)) + } + s := strings.Join(lines, "\n") + if _, err := f.WriteString(s); err != nil { + return ConfigMarshalError{err} + } + case "toml": t, err := toml.TreeFromMap(c) if err != nil { @@ -1483,6 +1636,22 @@ func (v *Viper) marshalWriter(f afero.File, configType string) error { if _, err = f.WriteString(string(b)); err != nil { return ConfigMarshalError{err} } + + case "ini": + keys := v.AllKeys() + cfg := ini.Empty() + ini.PrettyFormat = false + for i := 0; i < len(keys); i++ { + key := keys[i] + lastSep := strings.LastIndex(key, ".") + sectionName := key[:(lastSep)] + keyName := key[(lastSep + 1):] + if sectionName == "default" { + sectionName = "" + } + cfg.Section(sectionName).Key(keyName).SetValue(v.Get(key).(string)) + } + cfg.WriteTo(f) } return nil } @@ -1629,7 +1798,7 @@ func (v *Viper) getRemoteConfig(provider RemoteProvider) (map[string]interface{} func (v *Viper) watchKeyValueConfigOnChannel() error { for _, rp := range v.remoteProviders { respc, _ := RemoteConfig.WatchChannel(rp) - //Todo: Add quit channel + // Todo: Add quit channel go func(rc <-chan *RemoteResponse) { for { b := <-rc @@ -1665,7 +1834,7 @@ func (v *Viper) watchRemoteConfig(provider RemoteProvider) (map[string]interface } // AllKeys returns all keys holding a value, regardless of where they are set. -// Nested keys are returned with a v.keyDelim (= ".") separator +// Nested keys are returned with a v.keyDelim separator func AllKeys() []string { return v.AllKeys() } func (v *Viper) AllKeys() []string { m := map[string]bool{} @@ -1679,7 +1848,7 @@ func (v *Viper) AllKeys() []string { m = v.flattenAndMergeMap(m, v.defaults, "") // convert set of paths to list - a := []string{} + a := make([]string, 0, len(m)) for x := range m { a = append(a, x) } @@ -1688,7 +1857,7 @@ func (v *Viper) AllKeys() []string { // flattenAndMergeMap recursively flattens the given map into a map[string]bool // of key paths (used as a set, easier to manipulate than a []string): -// - each path is merged into a single key string, delimited with v.keyDelim (= ".") +// - each path is merged into a single key string, delimited with v.keyDelim // - if a path is shadowed by an earlier value in the initial shadow map, // it is skipped. // The resulting set of paths is merged to the given shadow set at the same time. @@ -1728,7 +1897,7 @@ func (v *Viper) flattenAndMergeMap(shadow map[string]bool, m map[string]interfac func (v *Viper) mergeFlatMap(shadow map[string]bool, m map[string]interface{}) map[string]bool { // scan keys outer: - for k, _ := range m { + for k := range m { path := strings.Split(k, v.keyDelim) // scan intermediate paths var parentKey string @@ -1837,6 +2006,12 @@ func (v *Viper) searchInPath(in string) (filename string) { } } + if v.configType != "" { + if b, _ := exists(v.fs, filepath.Join(in, v.configName)); b { + return filepath.Join(in, v.configName) + } + } + return "" } diff --git a/vendor/github.com/stretchr/testify/LICENSE b/vendor/github.com/stretchr/testify/LICENSE index f38ec5956b..4b0421cf9e 100644 --- a/vendor/github.com/stretchr/testify/LICENSE +++ b/vendor/github.com/stretchr/testify/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2012-2018 Mat Ryer and Tyler Bunnell +Copyright (c) 2012-2020 Mat Ryer, Tyler Bunnell and contributors. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/github.com/stretchr/testify/assert/assertion_order.go b/vendor/github.com/stretchr/testify/assert/assertion_compare.go index 15a486ca6e..dc200395ce 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_order.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_compare.go @@ -5,20 +5,28 @@ import ( "reflect" ) -func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { +type CompareType int + +const ( + compareLess CompareType = iota - 1 + compareEqual + compareGreater +) + +func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { switch kind { case reflect.Int: { intobj1 := obj1.(int) intobj2 := obj2.(int) if intobj1 > intobj2 { - return -1, true + return compareGreater, true } if intobj1 == intobj2 { - return 0, true + return compareEqual, true } if intobj1 < intobj2 { - return 1, true + return compareLess, true } } case reflect.Int8: @@ -26,13 +34,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { int8obj1 := obj1.(int8) int8obj2 := obj2.(int8) if int8obj1 > int8obj2 { - return -1, true + return compareGreater, true } if int8obj1 == int8obj2 { - return 0, true + return compareEqual, true } if int8obj1 < int8obj2 { - return 1, true + return compareLess, true } } case reflect.Int16: @@ -40,13 +48,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { int16obj1 := obj1.(int16) int16obj2 := obj2.(int16) if int16obj1 > int16obj2 { - return -1, true + return compareGreater, true } if int16obj1 == int16obj2 { - return 0, true + return compareEqual, true } if int16obj1 < int16obj2 { - return 1, true + return compareLess, true } } case reflect.Int32: @@ -54,13 +62,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { int32obj1 := obj1.(int32) int32obj2 := obj2.(int32) if int32obj1 > int32obj2 { - return -1, true + return compareGreater, true } if int32obj1 == int32obj2 { - return 0, true + return compareEqual, true } if int32obj1 < int32obj2 { - return 1, true + return compareLess, true } } case reflect.Int64: @@ -68,13 +76,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { int64obj1 := obj1.(int64) int64obj2 := obj2.(int64) if int64obj1 > int64obj2 { - return -1, true + return compareGreater, true } if int64obj1 == int64obj2 { - return 0, true + return compareEqual, true } if int64obj1 < int64obj2 { - return 1, true + return compareLess, true } } case reflect.Uint: @@ -82,13 +90,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { uintobj1 := obj1.(uint) uintobj2 := obj2.(uint) if uintobj1 > uintobj2 { - return -1, true + return compareGreater, true } if uintobj1 == uintobj2 { - return 0, true + return compareEqual, true } if uintobj1 < uintobj2 { - return 1, true + return compareLess, true } } case reflect.Uint8: @@ -96,13 +104,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { uint8obj1 := obj1.(uint8) uint8obj2 := obj2.(uint8) if uint8obj1 > uint8obj2 { - return -1, true + return compareGreater, true } if uint8obj1 == uint8obj2 { - return 0, true + return compareEqual, true } if uint8obj1 < uint8obj2 { - return 1, true + return compareLess, true } } case reflect.Uint16: @@ -110,13 +118,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { uint16obj1 := obj1.(uint16) uint16obj2 := obj2.(uint16) if uint16obj1 > uint16obj2 { - return -1, true + return compareGreater, true } if uint16obj1 == uint16obj2 { - return 0, true + return compareEqual, true } if uint16obj1 < uint16obj2 { - return 1, true + return compareLess, true } } case reflect.Uint32: @@ -124,13 +132,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { uint32obj1 := obj1.(uint32) uint32obj2 := obj2.(uint32) if uint32obj1 > uint32obj2 { - return -1, true + return compareGreater, true } if uint32obj1 == uint32obj2 { - return 0, true + return compareEqual, true } if uint32obj1 < uint32obj2 { - return 1, true + return compareLess, true } } case reflect.Uint64: @@ -138,13 +146,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { uint64obj1 := obj1.(uint64) uint64obj2 := obj2.(uint64) if uint64obj1 > uint64obj2 { - return -1, true + return compareGreater, true } if uint64obj1 == uint64obj2 { - return 0, true + return compareEqual, true } if uint64obj1 < uint64obj2 { - return 1, true + return compareLess, true } } case reflect.Float32: @@ -152,13 +160,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { float32obj1 := obj1.(float32) float32obj2 := obj2.(float32) if float32obj1 > float32obj2 { - return -1, true + return compareGreater, true } if float32obj1 == float32obj2 { - return 0, true + return compareEqual, true } if float32obj1 < float32obj2 { - return 1, true + return compareLess, true } } case reflect.Float64: @@ -166,13 +174,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { float64obj1 := obj1.(float64) float64obj2 := obj2.(float64) if float64obj1 > float64obj2 { - return -1, true + return compareGreater, true } if float64obj1 == float64obj2 { - return 0, true + return compareEqual, true } if float64obj1 < float64obj2 { - return 1, true + return compareLess, true } } case reflect.String: @@ -180,18 +188,18 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { stringobj1 := obj1.(string) stringobj2 := obj2.(string) if stringobj1 > stringobj2 { - return -1, true + return compareGreater, true } if stringobj1 == stringobj2 { - return 0, true + return compareEqual, true } if stringobj1 < stringobj2 { - return 1, true + return compareLess, true } } } - return 0, false + return compareEqual, false } // Greater asserts that the first element is greater than the second @@ -200,26 +208,7 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { // assert.Greater(t, float64(2), float64(1)) // assert.Greater(t, "b", "a") func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - e1Kind := reflect.ValueOf(e1).Kind() - e2Kind := reflect.ValueOf(e2).Kind() - if e1Kind != e2Kind { - return Fail(t, "Elements should be the same type", msgAndArgs...) - } - - res, isComparable := compare(e1, e2, e1Kind) - if !isComparable { - return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) - } - - if res != -1 { - return Fail(t, fmt.Sprintf("\"%v\" is not greater than \"%v\"", e1, e2), msgAndArgs...) - } - - return true + return compareTwoValues(t, e1, e2, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs) } // GreaterOrEqual asserts that the first element is greater than or equal to the second @@ -229,26 +218,7 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface // assert.GreaterOrEqual(t, "b", "a") // assert.GreaterOrEqual(t, "b", "b") func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - e1Kind := reflect.ValueOf(e1).Kind() - e2Kind := reflect.ValueOf(e2).Kind() - if e1Kind != e2Kind { - return Fail(t, "Elements should be the same type", msgAndArgs...) - } - - res, isComparable := compare(e1, e2, e1Kind) - if !isComparable { - return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) - } - - if res != -1 && res != 0 { - return Fail(t, fmt.Sprintf("\"%v\" is not greater than or equal to \"%v\"", e1, e2), msgAndArgs...) - } - - return true + return compareTwoValues(t, e1, e2, []CompareType{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs) } // Less asserts that the first element is less than the second @@ -257,26 +227,7 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in // assert.Less(t, float64(1), float64(2)) // assert.Less(t, "a", "b") func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - e1Kind := reflect.ValueOf(e1).Kind() - e2Kind := reflect.ValueOf(e2).Kind() - if e1Kind != e2Kind { - return Fail(t, "Elements should be the same type", msgAndArgs...) - } - - res, isComparable := compare(e1, e2, e1Kind) - if !isComparable { - return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) - } - - if res != 1 { - return Fail(t, fmt.Sprintf("\"%v\" is not less than \"%v\"", e1, e2), msgAndArgs...) - } - - return true + return compareTwoValues(t, e1, e2, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs) } // LessOrEqual asserts that the first element is less than or equal to the second @@ -286,6 +237,10 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) // assert.LessOrEqual(t, "a", "b") // assert.LessOrEqual(t, "b", "b") func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + return compareTwoValues(t, e1, e2, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs) +} + +func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() } @@ -296,14 +251,24 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter return Fail(t, "Elements should be the same type", msgAndArgs...) } - res, isComparable := compare(e1, e2, e1Kind) + compareResult, isComparable := compare(e1, e2, e1Kind) if !isComparable { return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) } - if res != 1 && res != 0 { - return Fail(t, fmt.Sprintf("\"%v\" is not less than or equal to \"%v\"", e1, e2), msgAndArgs...) + if !containsValue(allowedComparesResults, compareResult) { + return Fail(t, fmt.Sprintf(failMessage, e1, e2), msgAndArgs...) } return true } + +func containsValue(values []CompareType, value CompareType) bool { + for _, v := range values { + if v == value { + return true + } + } + + return false +} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_format.go b/vendor/github.com/stretchr/testify/assert/assertion_format.go index bf89ecd21f..49370eb167 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_format.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_format.go @@ -93,7 +93,7 @@ func EqualErrorf(t TestingT, theError error, errString string, msg string, args // EqualValuesf asserts that two objects are equal or convertable to the same types // and equal. // -// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123)) +// assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted") func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -127,7 +127,7 @@ func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick // Exactlyf asserts that two objects are equal in value and type. // -// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) +// assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted") func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -173,7 +173,7 @@ func FileExistsf(t TestingT, path string, msg string, args ...interface{}) bool // Greaterf asserts that the first element is greater than the second // // assert.Greaterf(t, 2, 1, "error message %s", "formatted") -// assert.Greaterf(t, float64(2, "error message %s", "formatted"), float64(1)) +// assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted") // assert.Greaterf(t, "b", "a", "error message %s", "formatted") func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { @@ -225,7 +225,7 @@ func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, u // // assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -237,7 +237,7 @@ func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, // // assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -245,6 +245,18 @@ func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url stri return HTTPRedirect(t, handler, method, url, values, append([]interface{}{msg}, args...)...) } +// HTTPStatusCodef asserts that a specified handler returns a specified status code. +// +// assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return HTTPStatusCode(t, handler, method, url, values, statuscode, append([]interface{}{msg}, args...)...) +} + // HTTPSuccessf asserts that a specified handler returns a success status code. // // assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") @@ -259,7 +271,7 @@ func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url strin // Implementsf asserts that an object is implemented by the specified interface. // -// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +// assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -341,7 +353,7 @@ func Lenf(t TestingT, object interface{}, length int, msg string, args ...interf // Lessf asserts that the first element is less than the second // // assert.Lessf(t, 1, 2, "error message %s", "formatted") -// assert.Lessf(t, float64(1, "error message %s", "formatted"), float64(2)) +// assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted") // assert.Lessf(t, "a", "b", "error message %s", "formatted") func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { @@ -454,6 +466,16 @@ func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, return NotEqual(t, expected, actual, append([]interface{}{msg}, args...)...) } +// NotEqualValuesf asserts that two objects are not equal even when converted to the same type +// +// assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted") +func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotEqualValues(t, expected, actual, append([]interface{}{msg}, args...)...) +} + // NotNilf asserts that the specified object is not nil. // // assert.NotNilf(t, err, "error message %s", "formatted") @@ -476,7 +498,7 @@ func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bo // NotRegexpf asserts that a specified regexp does not match a string. // -// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") // assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { @@ -552,7 +574,7 @@ func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg str // Regexpf asserts that a specified regexp matches a string. // -// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") // assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/vendor/github.com/stretchr/testify/assert/assertion_forward.go index 75ecdcaa2f..9db889427a 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_forward.go @@ -169,7 +169,7 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn // EqualValuesf asserts that two objects are equal or convertable to the same types // and equal. // -// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123)) +// a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted") func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -251,7 +251,7 @@ func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArg // Exactlyf asserts that two objects are equal in value and type. // -// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123)) +// a.Exactlyf(int32(123), int64(123), "error message %s", "formatted") func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -370,7 +370,7 @@ func (a *Assertions) GreaterOrEqualf(e1 interface{}, e2 interface{}, msg string, // Greaterf asserts that the first element is greater than the second // // a.Greaterf(2, 1, "error message %s", "formatted") -// a.Greaterf(float64(2, "error message %s", "formatted"), float64(1)) +// a.Greaterf(float64(2), float64(1), "error message %s", "formatted") // a.Greaterf("b", "a", "error message %s", "formatted") func (a *Assertions) Greaterf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { @@ -447,7 +447,7 @@ func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url stri // // a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -471,7 +471,7 @@ func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url s // // a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -479,6 +479,30 @@ func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url return HTTPRedirectf(a.t, handler, method, url, values, msg, args...) } +// HTTPStatusCode asserts that a specified handler returns a specified status code. +// +// a.HTTPStatusCode(myHandler, "GET", "/notImplemented", nil, 501) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPStatusCode(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPStatusCode(a.t, handler, method, url, values, statuscode, msgAndArgs...) +} + +// HTTPStatusCodef asserts that a specified handler returns a specified status code. +// +// a.HTTPStatusCodef(myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPStatusCodef(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPStatusCodef(a.t, handler, method, url, values, statuscode, msg, args...) +} + // HTTPSuccess asserts that a specified handler returns a success status code. // // a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) @@ -515,7 +539,7 @@ func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, // Implementsf asserts that an object is implemented by the specified interface. // -// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +// a.Implementsf((*MyInterface)(nil), new(MyObject), "error message %s", "formatted") func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -706,7 +730,7 @@ func (a *Assertions) LessOrEqualf(e1 interface{}, e2 interface{}, msg string, ar // Lessf asserts that the first element is less than the second // // a.Lessf(1, 2, "error message %s", "formatted") -// a.Lessf(float64(1, "error message %s", "formatted"), float64(2)) +// a.Lessf(float64(1), float64(2), "error message %s", "formatted") // a.Lessf("a", "b", "error message %s", "formatted") func (a *Assertions) Lessf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { @@ -884,6 +908,26 @@ func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndAr return NotEqual(a.t, expected, actual, msgAndArgs...) } +// NotEqualValues asserts that two objects are not equal even when converted to the same type +// +// a.NotEqualValues(obj1, obj2) +func (a *Assertions) NotEqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotEqualValues(a.t, expected, actual, msgAndArgs...) +} + +// NotEqualValuesf asserts that two objects are not equal even when converted to the same type +// +// a.NotEqualValuesf(obj1, obj2, "error message %s", "formatted") +func (a *Assertions) NotEqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotEqualValuesf(a.t, expected, actual, msg, args...) +} + // NotEqualf asserts that the specified values are NOT equal. // // a.NotEqualf(obj1, obj2, "error message %s", "formatted") @@ -950,7 +994,7 @@ func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...in // NotRegexpf asserts that a specified regexp does not match a string. // -// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// a.NotRegexpf(regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") // a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { @@ -1102,7 +1146,7 @@ func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...inter // Regexpf asserts that a specified regexp matches a string. // -// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// a.Regexpf(regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") // a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { diff --git a/vendor/github.com/stretchr/testify/assert/assertions.go b/vendor/github.com/stretchr/testify/assert/assertions.go index bdd81389a9..914a10d83a 100644 --- a/vendor/github.com/stretchr/testify/assert/assertions.go +++ b/vendor/github.com/stretchr/testify/assert/assertions.go @@ -19,7 +19,7 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/pmezard/go-difflib/difflib" - yaml "gopkg.in/yaml.v2" + yaml "gopkg.in/yaml.v3" ) //go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_format.go.tmpl" @@ -45,7 +45,7 @@ type BoolAssertionFunc func(TestingT, bool, ...interface{}) bool // for table driven tests. type ErrorAssertionFunc func(TestingT, error, ...interface{}) bool -// Comparison a custom function that returns true on success and false on failure +// Comparison is a custom function that returns true on success and false on failure type Comparison func() (success bool) /* @@ -104,11 +104,11 @@ the problem actually occurred in calling code.*/ // failed. func CallerInfo() []string { - pc := uintptr(0) - file := "" - line := 0 - ok := false - name := "" + var pc uintptr + var ok bool + var file string + var line int + var name string callers := []string{} for i := 0; ; i++ { @@ -429,14 +429,27 @@ func samePointers(first, second interface{}) bool { // to a type conversion in the Go grammar. func formatUnequalValues(expected, actual interface{}) (e string, a string) { if reflect.TypeOf(expected) != reflect.TypeOf(actual) { - return fmt.Sprintf("%T(%#v)", expected, expected), - fmt.Sprintf("%T(%#v)", actual, actual) + return fmt.Sprintf("%T(%s)", expected, truncatingFormat(expected)), + fmt.Sprintf("%T(%s)", actual, truncatingFormat(actual)) } switch expected.(type) { case time.Duration: return fmt.Sprintf("%v", expected), fmt.Sprintf("%v", actual) } - return fmt.Sprintf("%#v", expected), fmt.Sprintf("%#v", actual) + return truncatingFormat(expected), truncatingFormat(actual) +} + +// truncatingFormat formats the data and truncates it if it's too long. +// +// This helps keep formatted error messages lines from exceeding the +// bufio.MaxScanTokenSize max line length that the go testing framework imposes. +func truncatingFormat(data interface{}) string { + value := fmt.Sprintf("%#v", data) + max := bufio.MaxScanTokenSize - 100 // Give us some space the type info too if needed. + if len(value) > max { + value = value[0:max] + "<... truncated>" + } + return value } // EqualValues asserts that two objects are equal or convertable to the same types @@ -483,12 +496,12 @@ func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{} // // assert.NotNil(t, err) func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } if !isNil(object) { return true } + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, "Expected value not to be nil.", msgAndArgs...) } @@ -529,12 +542,12 @@ func isNil(object interface{}) bool { // // assert.Nil(t, err) func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } if isNil(object) { return true } + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, fmt.Sprintf("Expected nil, but got: %#v", object), msgAndArgs...) } @@ -571,12 +584,11 @@ func isEmpty(object interface{}) bool { // // assert.Empty(t, obj) func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - pass := isEmpty(object) if !pass { + if h, ok := t.(tHelper); ok { + h.Helper() + } Fail(t, fmt.Sprintf("Should be empty, but was %v", object), msgAndArgs...) } @@ -591,12 +603,11 @@ func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { // assert.Equal(t, "two", obj[1]) // } func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - pass := !isEmpty(object) if !pass { + if h, ok := t.(tHelper); ok { + h.Helper() + } Fail(t, fmt.Sprintf("Should NOT be empty, but was %v", object), msgAndArgs...) } @@ -639,16 +650,10 @@ func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) // // assert.True(t, myBool) func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - if h, ok := t.(interface { - Helper() - }); ok { - h.Helper() - } - - if value != true { + if !value { + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, "Should be true", msgAndArgs...) } @@ -660,11 +665,10 @@ func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { // // assert.False(t, myBool) func False(t TestingT, value bool, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - if value != false { + if value { + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, "Should be false", msgAndArgs...) } @@ -695,6 +699,21 @@ func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{ } +// NotEqualValues asserts that two objects are not equal even when converted to the same type +// +// assert.NotEqualValues(t, obj1, obj2) +func NotEqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + if ObjectsAreEqualValues(expected, actual) { + return Fail(t, fmt.Sprintf("Should not be: %#v\n", actual), msgAndArgs...) + } + + return true +} + // containsElement try loop over the list check if the list includes the element. // return (false, false) if impossible. // return (true, false) if element was not found. @@ -747,10 +766,10 @@ func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bo ok, found := includeElement(s, contains) if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) + return Fail(t, fmt.Sprintf("%#v could not be applied builtin len()", s), msgAndArgs...) } if !found { - return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", s, contains), msgAndArgs...) + return Fail(t, fmt.Sprintf("%#v does not contain %#v", s, contains), msgAndArgs...) } return true @@ -881,27 +900,39 @@ func ElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface return true } - aKind := reflect.TypeOf(listA).Kind() - bKind := reflect.TypeOf(listB).Kind() + if !isList(t, listA, msgAndArgs...) || !isList(t, listB, msgAndArgs...) { + return false + } - if aKind != reflect.Array && aKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", listA, aKind), msgAndArgs...) + extraA, extraB := diffLists(listA, listB) + + if len(extraA) == 0 && len(extraB) == 0 { + return true } - if bKind != reflect.Array && bKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", listB, bKind), msgAndArgs...) + return Fail(t, formatListDiff(listA, listB, extraA, extraB), msgAndArgs...) +} + +// isList checks that the provided value is array or slice. +func isList(t TestingT, list interface{}, msgAndArgs ...interface{}) (ok bool) { + kind := reflect.TypeOf(list).Kind() + if kind != reflect.Array && kind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s, expecting array or slice", list, kind), + msgAndArgs...) } + return true +} +// diffLists diffs two arrays/slices and returns slices of elements that are only in A and only in B. +// If some element is present multiple times, each instance is counted separately (e.g. if something is 2x in A and +// 5x in B, it will be 0x in extraA and 3x in extraB). The order of items in both lists is ignored. +func diffLists(listA, listB interface{}) (extraA, extraB []interface{}) { aValue := reflect.ValueOf(listA) bValue := reflect.ValueOf(listB) aLen := aValue.Len() bLen := bValue.Len() - if aLen != bLen { - return Fail(t, fmt.Sprintf("lengths don't match: %d != %d", aLen, bLen), msgAndArgs...) - } - // Mark indexes in bValue that we already used visited := make([]bool, bLen) for i := 0; i < aLen; i++ { @@ -918,11 +949,38 @@ func ElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface } } if !found { - return Fail(t, fmt.Sprintf("element %s appears more times in %s than in %s", element, aValue, bValue), msgAndArgs...) + extraA = append(extraA, element) } } - return true + for j := 0; j < bLen; j++ { + if visited[j] { + continue + } + extraB = append(extraB, bValue.Index(j).Interface()) + } + + return +} + +func formatListDiff(listA, listB interface{}, extraA, extraB []interface{}) string { + var msg bytes.Buffer + + msg.WriteString("elements differ") + if len(extraA) > 0 { + msg.WriteString("\n\nextra elements in list A:\n") + msg.WriteString(spewConfig.Sdump(extraA)) + } + if len(extraB) > 0 { + msg.WriteString("\n\nextra elements in list B:\n") + msg.WriteString(spewConfig.Sdump(extraB)) + } + msg.WriteString("\n\nlistA:\n") + msg.WriteString(spewConfig.Sdump(listA)) + msg.WriteString("\n\nlistB:\n") + msg.WriteString(spewConfig.Sdump(listB)) + + return msg.String() } // Condition uses a Comparison to assert a complex condition. @@ -1058,6 +1116,8 @@ func toFloat(x interface{}) (float64, bool) { xok := true switch xn := x.(type) { + case uint: + xf = float64(xn) case uint8: xf = float64(xn) case uint16: @@ -1079,7 +1139,7 @@ func toFloat(x interface{}) (float64, bool) { case float32: xf = float64(xn) case float64: - xf = float64(xn) + xf = xn case time.Duration: xf = float64(xn) default: @@ -1193,6 +1253,9 @@ func calcRelativeError(expected, actual interface{}) (float64, error) { if !aok { return 0, fmt.Errorf("expected value %q cannot be converted to float", expected) } + if math.IsNaN(af) { + return 0, errors.New("expected value must not be NaN") + } if af == 0 { return 0, fmt.Errorf("expected value must have a value other than zero to calculate the relative error") } @@ -1200,6 +1263,9 @@ func calcRelativeError(expected, actual interface{}) (float64, error) { if !bok { return 0, fmt.Errorf("actual value %q cannot be converted to float", actual) } + if math.IsNaN(bf) { + return 0, errors.New("actual value must not be NaN") + } return math.Abs(af-bf) / math.Abs(af), nil } @@ -1209,6 +1275,9 @@ func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAnd if h, ok := t.(tHelper); ok { h.Helper() } + if math.IsNaN(epsilon) { + return Fail(t, "epsilon must not be NaN") + } actualEpsilon, err := calcRelativeError(expected, actual) if err != nil { return Fail(t, err.Error(), msgAndArgs...) @@ -1256,10 +1325,10 @@ func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, m // assert.Equal(t, expectedObj, actualObj) // } func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } if err != nil { + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, fmt.Sprintf("Received unexpected error:\n%+v", err), msgAndArgs...) } @@ -1273,11 +1342,10 @@ func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { // assert.Equal(t, expectedError, err) // } func Error(t TestingT, err error, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - if err == nil { + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, "An error is expected but got nil.", msgAndArgs...) } @@ -1553,6 +1621,7 @@ var spewConfig = spew.ConfigState{ DisablePointerAddresses: true, DisableCapacities: true, SortKeys: true, + DisableMethods: true, } type tHelper interface { diff --git a/vendor/github.com/stretchr/testify/assert/http_assertions.go b/vendor/github.com/stretchr/testify/assert/http_assertions.go index df46fa777a..4ed341dd28 100644 --- a/vendor/github.com/stretchr/testify/assert/http_assertions.go +++ b/vendor/github.com/stretchr/testify/assert/http_assertions.go @@ -33,7 +33,6 @@ func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, value code, err := httpCode(handler, method, url, values) if err != nil { Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - return false } isSuccessCode := code >= http.StatusOK && code <= http.StatusPartialContent @@ -56,7 +55,6 @@ func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, valu code, err := httpCode(handler, method, url, values) if err != nil { Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - return false } isRedirectCode := code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect @@ -79,7 +77,6 @@ func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values code, err := httpCode(handler, method, url, values) if err != nil { Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - return false } isErrorCode := code >= http.StatusBadRequest @@ -90,6 +87,28 @@ func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values return isErrorCode } +// HTTPStatusCode asserts that a specified handler returns a specified status code. +// +// assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + } + + successful := code == statuscode + if !successful { + Fail(t, fmt.Sprintf("Expected HTTP status code %d for %q but received %d", statuscode, url+"?"+values.Encode(), code)) + } + + return successful +} + // HTTPBody is a helper that returns HTTP body of the response. It returns // empty string if building a new request fails. func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) string { diff --git a/vendor/github.com/stretchr/testify/require/require.go b/vendor/github.com/stretchr/testify/require/require.go index cf6c7b5664..ec4624b282 100644 --- a/vendor/github.com/stretchr/testify/require/require.go +++ b/vendor/github.com/stretchr/testify/require/require.go @@ -212,7 +212,7 @@ func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArg // EqualValuesf asserts that two objects are equal or convertable to the same types // and equal. // -// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123)) +// assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted") func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -315,7 +315,7 @@ func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs .. // Exactlyf asserts that two objects are equal in value and type. // -// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) +// assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted") func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -470,7 +470,7 @@ func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, arg // Greaterf asserts that the first element is greater than the second // // assert.Greaterf(t, 2, 1, "error message %s", "formatted") -// assert.Greaterf(t, float64(2, "error message %s", "formatted"), float64(1)) +// assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted") // assert.Greaterf(t, "b", "a", "error message %s", "formatted") func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { @@ -565,7 +565,7 @@ func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, // // assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -595,7 +595,7 @@ func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url strin // // assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -606,6 +606,36 @@ func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url stri t.FailNow() } +// HTTPStatusCode asserts that a specified handler returns a specified status code. +// +// assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.HTTPStatusCode(t, handler, method, url, values, statuscode, msgAndArgs...) { + return + } + t.FailNow() +} + +// HTTPStatusCodef asserts that a specified handler returns a specified status code. +// +// assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.HTTPStatusCodef(t, handler, method, url, values, statuscode, msg, args...) { + return + } + t.FailNow() +} + // HTTPSuccess asserts that a specified handler returns a success status code. // // assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) @@ -651,7 +681,7 @@ func Implements(t TestingT, interfaceObject interface{}, object interface{}, msg // Implementsf asserts that an object is implemented by the specified interface. // -// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +// assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -902,7 +932,7 @@ func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args . // Lessf asserts that the first element is less than the second // // assert.Lessf(t, 1, 2, "error message %s", "formatted") -// assert.Lessf(t, float64(1, "error message %s", "formatted"), float64(2)) +// assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted") // assert.Lessf(t, "a", "b", "error message %s", "formatted") func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { @@ -1128,6 +1158,32 @@ func NotEqual(t TestingT, expected interface{}, actual interface{}, msgAndArgs . t.FailNow() } +// NotEqualValues asserts that two objects are not equal even when converted to the same type +// +// assert.NotEqualValues(t, obj1, obj2) +func NotEqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotEqualValues(t, expected, actual, msgAndArgs...) { + return + } + t.FailNow() +} + +// NotEqualValuesf asserts that two objects are not equal even when converted to the same type +// +// assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted") +func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotEqualValuesf(t, expected, actual, msg, args...) { + return + } + t.FailNow() +} + // NotEqualf asserts that the specified values are NOT equal. // // assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") @@ -1212,7 +1268,7 @@ func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interf // NotRegexpf asserts that a specified regexp does not match a string. // -// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") // assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { @@ -1406,7 +1462,7 @@ func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface // Regexpf asserts that a specified regexp matches a string. // -// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") // assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { diff --git a/vendor/github.com/stretchr/testify/require/require_forward.go b/vendor/github.com/stretchr/testify/require/require_forward.go index 5aac226df8..103d7dcb6a 100644 --- a/vendor/github.com/stretchr/testify/require/require_forward.go +++ b/vendor/github.com/stretchr/testify/require/require_forward.go @@ -170,7 +170,7 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn // EqualValuesf asserts that two objects are equal or convertable to the same types // and equal. // -// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123)) +// a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted") func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -252,7 +252,7 @@ func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArg // Exactlyf asserts that two objects are equal in value and type. // -// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123)) +// a.Exactlyf(int32(123), int64(123), "error message %s", "formatted") func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -371,7 +371,7 @@ func (a *Assertions) GreaterOrEqualf(e1 interface{}, e2 interface{}, msg string, // Greaterf asserts that the first element is greater than the second // // a.Greaterf(2, 1, "error message %s", "formatted") -// a.Greaterf(float64(2, "error message %s", "formatted"), float64(1)) +// a.Greaterf(float64(2), float64(1), "error message %s", "formatted") // a.Greaterf("b", "a", "error message %s", "formatted") func (a *Assertions) Greaterf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { @@ -448,7 +448,7 @@ func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url stri // // a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -472,7 +472,7 @@ func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url s // // a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -480,6 +480,30 @@ func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url HTTPRedirectf(a.t, handler, method, url, values, msg, args...) } +// HTTPStatusCode asserts that a specified handler returns a specified status code. +// +// a.HTTPStatusCode(myHandler, "GET", "/notImplemented", nil, 501) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPStatusCode(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + HTTPStatusCode(a.t, handler, method, url, values, statuscode, msgAndArgs...) +} + +// HTTPStatusCodef asserts that a specified handler returns a specified status code. +// +// a.HTTPStatusCodef(myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPStatusCodef(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + HTTPStatusCodef(a.t, handler, method, url, values, statuscode, msg, args...) +} + // HTTPSuccess asserts that a specified handler returns a success status code. // // a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) @@ -516,7 +540,7 @@ func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, // Implementsf asserts that an object is implemented by the specified interface. // -// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +// a.Implementsf((*MyInterface)(nil), new(MyObject), "error message %s", "formatted") func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -707,7 +731,7 @@ func (a *Assertions) LessOrEqualf(e1 interface{}, e2 interface{}, msg string, ar // Lessf asserts that the first element is less than the second // // a.Lessf(1, 2, "error message %s", "formatted") -// a.Lessf(float64(1, "error message %s", "formatted"), float64(2)) +// a.Lessf(float64(1), float64(2), "error message %s", "formatted") // a.Lessf("a", "b", "error message %s", "formatted") func (a *Assertions) Lessf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { @@ -885,6 +909,26 @@ func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndAr NotEqual(a.t, expected, actual, msgAndArgs...) } +// NotEqualValues asserts that two objects are not equal even when converted to the same type +// +// a.NotEqualValues(obj1, obj2) +func (a *Assertions) NotEqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotEqualValues(a.t, expected, actual, msgAndArgs...) +} + +// NotEqualValuesf asserts that two objects are not equal even when converted to the same type +// +// a.NotEqualValuesf(obj1, obj2, "error message %s", "formatted") +func (a *Assertions) NotEqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotEqualValuesf(a.t, expected, actual, msg, args...) +} + // NotEqualf asserts that the specified values are NOT equal. // // a.NotEqualf(obj1, obj2, "error message %s", "formatted") @@ -951,7 +995,7 @@ func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...in // NotRegexpf asserts that a specified regexp does not match a string. // -// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// a.NotRegexpf(regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") // a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { @@ -1103,7 +1147,7 @@ func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...inter // Regexpf asserts that a specified regexp matches a string. // -// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// a.Regexpf(regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") // a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { diff --git a/vendor/github.com/subosito/gotenv/.env b/vendor/github.com/subosito/gotenv/.env new file mode 100644 index 0000000000..6405eca71f --- /dev/null +++ b/vendor/github.com/subosito/gotenv/.env @@ -0,0 +1 @@ +HELLO=world diff --git a/vendor/github.com/subosito/gotenv/.env.invalid b/vendor/github.com/subosito/gotenv/.env.invalid new file mode 100644 index 0000000000..016d5e0cea --- /dev/null +++ b/vendor/github.com/subosito/gotenv/.env.invalid @@ -0,0 +1 @@ +lol$wut diff --git a/vendor/github.com/subosito/gotenv/.gitignore b/vendor/github.com/subosito/gotenv/.gitignore new file mode 100644 index 0000000000..2b8d456103 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/.gitignore @@ -0,0 +1,3 @@ +*.test +*.out +annotate.json diff --git a/vendor/github.com/subosito/gotenv/.travis.yml b/vendor/github.com/subosito/gotenv/.travis.yml new file mode 100644 index 0000000000..3370d5f408 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/.travis.yml @@ -0,0 +1,10 @@ +language: go +go: + - 1.x +os: + - linux + - osx +script: + - go test -test.v -coverprofile=coverage.out -covermode=count +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/subosito/gotenv/CHANGELOG.md b/vendor/github.com/subosito/gotenv/CHANGELOG.md new file mode 100644 index 0000000000..67f687382b --- /dev/null +++ b/vendor/github.com/subosito/gotenv/CHANGELOG.md @@ -0,0 +1,47 @@ +# Changelog + +## [1.2.0] - 2019-08-03 + +### Added + +- Add `Must` helper to raise an error as panic. It can be used with `Load` and `OverLoad`. +- Add more tests to be 100% coverage. +- Add CHANGELOG +- Add more OS for the test: OSX and Windows + +### Changed + +- Reduce complexity and improve source code for having `A+` score in [goreportcard](https://goreportcard.com/report/github.com/subosito/gotenv). +- Updated README with mentions to all available functions + +### Removed + +- Remove `ErrFormat` +- Remove `MustLoad` and `MustOverload`, replaced with `Must` helper. + +## [1.1.1] - 2018-06-05 + +### Changed + +- Replace `os.Getenv` with `os.LookupEnv` to ensure that the environment variable is not set, by [radding](https://github.com/radding) + +## [1.1.0] - 2017-03-20 + +### Added + +- Supports carriage return in env +- Handle files with UTF-8 BOM + +### Changed + +- Whitespace handling + +### Fixed + +- Incorrect variable expansion +- Handling escaped '$' characters + +## [1.0.0] - 2014-10-05 + +First stable release. + diff --git a/vendor/github.com/subosito/gotenv/LICENSE b/vendor/github.com/subosito/gotenv/LICENSE new file mode 100644 index 0000000000..f64ccaedc3 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Alif Rachmawadi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/subosito/gotenv/README.md b/vendor/github.com/subosito/gotenv/README.md new file mode 100644 index 0000000000..d610cdf0b8 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/README.md @@ -0,0 +1,131 @@ +# gotenv + +[![Build Status](https://travis-ci.org/subosito/gotenv.svg?branch=master)](https://travis-ci.org/subosito/gotenv) +[![Build status](https://ci.appveyor.com/api/projects/status/wb2e075xkfl0m0v2/branch/master?svg=true)](https://ci.appveyor.com/project/subosito/gotenv/branch/master) +[![Coverage Status](https://badgen.net/codecov/c/github/subosito/gotenv)](https://codecov.io/gh/subosito/gotenv) +[![Go Report Card](https://goreportcard.com/badge/github.com/subosito/gotenv)](https://goreportcard.com/report/github.com/subosito/gotenv) +[![GoDoc](https://godoc.org/github.com/subosito/gotenv?status.svg)](https://godoc.org/github.com/subosito/gotenv) + +Load environment variables dynamically in Go. + +## Usage + +Put the gotenv package on your `import` statement: + +```go +import "github.com/subosito/gotenv" +``` + +To modify your app environment variables, `gotenv` expose 2 main functions: + +- `gotenv.Load` +- `gotenv.Apply` + +By default, `gotenv.Load` will look for a file called `.env` in the current working directory. + +Behind the scene, it will then load `.env` file and export the valid variables to the environment variables. Make sure you call the method as soon as possible to ensure it loads all variables, say, put it on `init()` function. + +Once loaded you can use `os.Getenv()` to get the value of the variable. + +Let's say you have `.env` file: + +``` +APP_ID=1234567 +APP_SECRET=abcdef +``` + +Here's the example of your app: + +```go +package main + +import ( + "github.com/subosito/gotenv" + "log" + "os" +) + +func init() { + gotenv.Load() +} + +func main() { + log.Println(os.Getenv("APP_ID")) // "1234567" + log.Println(os.Getenv("APP_SECRET")) // "abcdef" +} +``` + +You can also load other than `.env` file if you wish. Just supply filenames when calling `Load()`. It will load them in order and the first value set for a variable will win.: + +```go +gotenv.Load(".env.production", "credentials") +``` + +While `gotenv.Load` loads entries from `.env` file, `gotenv.Apply` allows you to use any `io.Reader`: + +```go +gotenv.Apply(strings.NewReader("APP_ID=1234567")) + +log.Println(os.Getenv("APP_ID")) +// Output: "1234567" +``` + +Both `gotenv.Load` and `gotenv.Apply` **DO NOT** overrides existing environment variables. If you want to override existing ones, you can see section below. + +### Environment Overrides + +Besides above functions, `gotenv` also provides another functions that overrides existing: + +- `gotenv.OverLoad` +- `gotenv.OverApply` + + +Here's the example of this overrides behavior: + +```go +os.Setenv("HELLO", "world") + +// NOTE: using Apply existing value will be reserved +gotenv.Apply(strings.NewReader("HELLO=universe")) +fmt.Println(os.Getenv("HELLO")) +// Output: "world" + +// NOTE: using OverApply existing value will be overridden +gotenv.OverApply(strings.NewReader("HELLO=universe")) +fmt.Println(os.Getenv("HELLO")) +// Output: "universe" +``` + +### Throw a Panic + +Both `gotenv.Load` and `gotenv.OverLoad` returns an error on something wrong occurred, like your env file is not exist, and so on. To make it easier to use, `gotenv` also provides `gotenv.Must` helper, to let it panic when an error returned. + +```go +err := gotenv.Load(".env-is-not-exist") +fmt.Println("error", err) +// error: open .env-is-not-exist: no such file or directory + +gotenv.Must(gotenv.Load, ".env-is-not-exist") +// it will throw a panic +// panic: open .env-is-not-exist: no such file or directory +``` + +### Another Scenario + +Just in case you want to parse environment variables from any `io.Reader`, gotenv keeps its `Parse` and `StrictParse` function as public API so you can use that. + +```go +// import "strings" + +pairs := gotenv.Parse(strings.NewReader("FOO=test\nBAR=$FOO")) +// gotenv.Env{"FOO": "test", "BAR": "test"} + +err, pairs = gotenv.StrictParse(strings.NewReader(`FOO="bar"`)) +// gotenv.Env{"FOO": "bar"} +``` + +`Parse` ignores invalid lines and returns `Env` of valid environment variables, while `StrictParse` returns an error for invalid lines. + +## Notes + +The gotenv package is a Go port of [`dotenv`](https://github.com/bkeepers/dotenv) project with some additions made for Go. For general features, it aims to be compatible as close as possible. diff --git a/vendor/github.com/subosito/gotenv/appveyor.yml b/vendor/github.com/subosito/gotenv/appveyor.yml new file mode 100644 index 0000000000..33b4c40465 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/appveyor.yml @@ -0,0 +1,9 @@ +build: off +clone_folder: c:\gopath\src\github.com\subosito\gotenv +environment: + GOPATH: c:\gopath +stack: go 1.10 +before_test: + - go get -t +test_script: + - go test -v -cover -race diff --git a/vendor/github.com/subosito/gotenv/gotenv.go b/vendor/github.com/subosito/gotenv/gotenv.go new file mode 100644 index 0000000000..745a344899 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/gotenv.go @@ -0,0 +1,265 @@ +// Package gotenv provides functionality to dynamically load the environment variables +package gotenv + +import ( + "bufio" + "fmt" + "io" + "os" + "regexp" + "strings" +) + +const ( + // Pattern for detecting valid line format + linePattern = `\A\s*(?:export\s+)?([\w\.]+)(?:\s*=\s*|:\s+?)('(?:\'|[^'])*'|"(?:\"|[^"])*"|[^#\n]+)?\s*(?:\s*\#.*)?\z` + + // Pattern for detecting valid variable within a value + variablePattern = `(\\)?(\$)(\{?([A-Z0-9_]+)?\}?)` +) + +// Env holds key/value pair of valid environment variable +type Env map[string]string + +/* +Load is a function to load a file or multiple files and then export the valid variables into environment variables if they do not exist. +When it's called with no argument, it will load `.env` file on the current path and set the environment variables. +Otherwise, it will loop over the filenames parameter and set the proper environment variables. +*/ +func Load(filenames ...string) error { + return loadenv(false, filenames...) +} + +/* +OverLoad is a function to load a file or multiple files and then export and override the valid variables into environment variables. +*/ +func OverLoad(filenames ...string) error { + return loadenv(true, filenames...) +} + +/* +Must is wrapper function that will panic when supplied function returns an error. +*/ +func Must(fn func(filenames ...string) error, filenames ...string) { + if err := fn(filenames...); err != nil { + panic(err.Error()) + } +} + +/* +Apply is a function to load an io Reader then export the valid variables into environment variables if they do not exist. +*/ +func Apply(r io.Reader) error { + return parset(r, false) +} + +/* +OverApply is a function to load an io Reader then export and override the valid variables into environment variables. +*/ +func OverApply(r io.Reader) error { + return parset(r, true) +} + +func loadenv(override bool, filenames ...string) error { + if len(filenames) == 0 { + filenames = []string{".env"} + } + + for _, filename := range filenames { + f, err := os.Open(filename) + if err != nil { + return err + } + + err = parset(f, override) + if err != nil { + return err + } + + f.Close() + } + + return nil +} + +// parse and set :) +func parset(r io.Reader, override bool) error { + env, err := StrictParse(r) + if err != nil { + return err + } + + for key, val := range env { + setenv(key, val, override) + } + + return nil +} + +func setenv(key, val string, override bool) { + if override { + os.Setenv(key, val) + } else { + if _, present := os.LookupEnv(key); !present { + os.Setenv(key, val) + } + } +} + +// Parse is a function to parse line by line any io.Reader supplied and returns the valid Env key/value pair of valid variables. +// It expands the value of a variable from the environment variable but does not set the value to the environment itself. +// This function is skipping any invalid lines and only processing the valid one. +func Parse(r io.Reader) Env { + env, _ := StrictParse(r) + return env +} + +// StrictParse is a function to parse line by line any io.Reader supplied and returns the valid Env key/value pair of valid variables. +// It expands the value of a variable from the environment variable but does not set the value to the environment itself. +// This function is returning an error if there are any invalid lines. +func StrictParse(r io.Reader) (Env, error) { + env := make(Env) + scanner := bufio.NewScanner(r) + + i := 1 + bom := string([]byte{239, 187, 191}) + + for scanner.Scan() { + line := scanner.Text() + + if i == 1 { + line = strings.TrimPrefix(line, bom) + } + + i++ + + err := parseLine(line, env) + if err != nil { + return env, err + } + } + + return env, nil +} + +func parseLine(s string, env Env) error { + rl := regexp.MustCompile(linePattern) + rm := rl.FindStringSubmatch(s) + + if len(rm) == 0 { + return checkFormat(s, env) + } + + key := rm[1] + val := rm[2] + + // determine if string has quote prefix + hdq := strings.HasPrefix(val, `"`) + + // determine if string has single quote prefix + hsq := strings.HasPrefix(val, `'`) + + // trim whitespace + val = strings.Trim(val, " ") + + // remove quotes '' or "" + rq := regexp.MustCompile(`\A(['"])(.*)(['"])\z`) + val = rq.ReplaceAllString(val, "$2") + + if hdq { + val = strings.Replace(val, `\n`, "\n", -1) + val = strings.Replace(val, `\r`, "\r", -1) + + // Unescape all characters except $ so variables can be escaped properly + re := regexp.MustCompile(`\\([^$])`) + val = re.ReplaceAllString(val, "$1") + } + + rv := regexp.MustCompile(variablePattern) + fv := func(s string) string { + return varReplacement(s, hsq, env) + } + + val = rv.ReplaceAllStringFunc(val, fv) + val = parseVal(val, env) + + env[key] = val + return nil +} + +func parseExport(st string, env Env) error { + if strings.HasPrefix(st, "export") { + vs := strings.SplitN(st, " ", 2) + + if len(vs) > 1 { + if _, ok := env[vs[1]]; !ok { + return fmt.Errorf("line `%s` has an unset variable", st) + } + } + } + + return nil +} + +func varReplacement(s string, hsq bool, env Env) string { + if strings.HasPrefix(s, "\\") { + return strings.TrimPrefix(s, "\\") + } + + if hsq { + return s + } + + sn := `(\$)(\{?([A-Z0-9_]+)\}?)` + rn := regexp.MustCompile(sn) + mn := rn.FindStringSubmatch(s) + + if len(mn) == 0 { + return s + } + + v := mn[3] + + replace, ok := env[v] + if !ok { + replace = os.Getenv(v) + } + + return replace +} + +func checkFormat(s string, env Env) error { + st := strings.TrimSpace(s) + + if (st == "") || strings.HasPrefix(st, "#") { + return nil + } + + if err := parseExport(st, env); err != nil { + return err + } + + return fmt.Errorf("line `%s` doesn't match format", s) +} + +func parseVal(val string, env Env) string { + if strings.Contains(val, "=") { + if !(val == "\n" || val == "\r") { + kv := strings.Split(val, "\n") + + if len(kv) == 1 { + kv = strings.Split(val, "\r") + } + + if len(kv) > 1 { + val = kv[0] + + for i := 1; i < len(kv); i++ { + parseLine(kv[i], env) + } + } + } + } + + return val +} |