// Code generated by protoc-gen-go. DO NOT EDIT.
// source: OpenAPIv2/OpenAPIv2.proto

/*
Package openapi_v2 is a generated protocol buffer package.

It is generated from these files:
	OpenAPIv2/OpenAPIv2.proto

It has these top-level messages:
	AdditionalPropertiesItem
	Any
	ApiKeySecurity
	BasicAuthenticationSecurity
	BodyParameter
	Contact
	Default
	Definitions
	Document
	Examples
	ExternalDocs
	FileSchema
	FormDataParameterSubSchema
	Header
	HeaderParameterSubSchema
	Headers
	Info
	ItemsItem
	JsonReference
	License
	NamedAny
	NamedHeader
	NamedParameter
	NamedPathItem
	NamedResponse
	NamedResponseValue
	NamedSchema
	NamedSecurityDefinitionsItem
	NamedString
	NamedStringArray
	NonBodyParameter
	Oauth2AccessCodeSecurity
	Oauth2ApplicationSecurity
	Oauth2ImplicitSecurity
	Oauth2PasswordSecurity
	Oauth2Scopes
	Operation
	Parameter
	ParameterDefinitions
	ParametersItem
	PathItem
	PathParameterSubSchema
	Paths
	PrimitivesItems
	Properties
	QueryParameterSubSchema
	Response
	ResponseDefinitions
	ResponseValue
	Responses
	Schema
	SchemaItem
	SecurityDefinitions
	SecurityDefinitionsItem
	SecurityRequirement
	StringArray
	Tag
	TypeItem
	VendorExtension
	Xml
*/
package openapi_v2

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import google_protobuf "github.com/golang/protobuf/ptypes/any"

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package

type AdditionalPropertiesItem struct {
	// Types that are valid to be assigned to Oneof:
	//	*AdditionalPropertiesItem_Schema
	//	*AdditionalPropertiesItem_Boolean
	Oneof isAdditionalPropertiesItem_Oneof `protobuf_oneof:"oneof"`
}

func (m *AdditionalPropertiesItem) Reset()                    { *m = AdditionalPropertiesItem{} }
func (m *AdditionalPropertiesItem) String() string            { return proto.CompactTextString(m) }
func (*AdditionalPropertiesItem) ProtoMessage()               {}
func (*AdditionalPropertiesItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }

type isAdditionalPropertiesItem_Oneof interface {
	isAdditionalPropertiesItem_Oneof()
}

type AdditionalPropertiesItem_Schema struct {
	Schema *Schema `protobuf:"bytes,1,opt,name=schema,oneof"`
}
type AdditionalPropertiesItem_Boolean struct {
	Boolean bool `protobuf:"varint,2,opt,name=boolean,oneof"`
}

func (*AdditionalPropertiesItem_Schema) isAdditionalPropertiesItem_Oneof()  {}
func (*AdditionalPropertiesItem_Boolean) isAdditionalPropertiesItem_Oneof() {}

func (m *AdditionalPropertiesItem) GetOneof() isAdditionalPropertiesItem_Oneof {
	if m != nil {
		return m.Oneof
	}
	return nil
}

func (m *AdditionalPropertiesItem) GetSchema() *Schema {
	if x, ok := m.GetOneof().(*AdditionalPropertiesItem_Schema); ok {
		return x.Schema
	}
	return nil
}

func (m *AdditionalPropertiesItem) GetBoolean() bool {
	if x, ok := m.GetOneof().(*AdditionalPropertiesItem_Boolean); ok {
		return x.Boolean
	}
	return false
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*AdditionalPropertiesItem) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _AdditionalPropertiesItem_OneofMarshaler, _AdditionalPropertiesItem_OneofUnmarshaler, _AdditionalPropertiesItem_OneofSizer, []interface{}{
		(*AdditionalPropertiesItem_Schema)(nil),
		(*AdditionalPropertiesItem_Boolean)(nil),
	}
}

func _AdditionalPropertiesItem_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*AdditionalPropertiesItem)
	// oneof
	switch x := m.Oneof.(type) {
	case *AdditionalPropertiesItem_Schema:
		b.EncodeVarint(1<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Schema); err != nil {
			return err
		}
	case *AdditionalPropertiesItem_Boolean:
		t := uint64(0)
		if x.Boolean {
			t = 1
		}
		b.EncodeVarint(2<<3 | proto.WireVarint)
		b.EncodeVarint(t)
	case nil:
	default:
		return fmt.Errorf("AdditionalPropertiesItem.Oneof has unexpected type %T", x)
	}
	return nil
}

func _AdditionalPropertiesItem_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*AdditionalPropertiesItem)
	switch tag {
	case 1: // oneof.schema
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Schema)
		err := b.DecodeMessage(msg)
		m.Oneof = &AdditionalPropertiesItem_Schema{msg}
		return true, err
	case 2: // oneof.boolean
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Oneof = &AdditionalPropertiesItem_Boolean{x != 0}
		return true, err
	default:
		return false, nil
	}
}

func _AdditionalPropertiesItem_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*AdditionalPropertiesItem)
	// oneof
	switch x := m.Oneof.(type) {
	case *AdditionalPropertiesItem_Schema:
		s := proto.Size(x.Schema)
		n += proto.SizeVarint(1<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *AdditionalPropertiesItem_Boolean:
		n += proto.SizeVarint(2<<3 | proto.WireVarint)
		n += 1
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

type Any struct {
	Value *google_protobuf.Any `protobuf:"bytes,1,opt,name=value" json:"value,omitempty"`
	Yaml  string               `protobuf:"bytes,2,opt,name=yaml" json:"yaml,omitempty"`
}

func (m *Any) Reset()                    { *m = Any{} }
func (m *Any) String() string            { return proto.CompactTextString(m) }
func (*Any) ProtoMessage()               {}
func (*Any) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }

func (m *Any) GetValue() *google_protobuf.Any {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *Any) GetYaml() string {
	if m != nil {
		return m.Yaml
	}
	return ""
}

type ApiKeySecurity struct {
	Type            string      `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"`
	Name            string      `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
	In              string      `protobuf:"bytes,3,opt,name=in" json:"in,omitempty"`
	Description     string      `protobuf:"bytes,4,opt,name=description" json:"description,omitempty"`
	VendorExtension []*NamedAny `protobuf:"bytes,5,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *ApiKeySecurity) Reset()                    { *m = ApiKeySecurity{} }
func (m *ApiKeySecurity) String() string            { return proto.CompactTextString(m) }
func (*ApiKeySecurity) ProtoMessage()               {}
func (*ApiKeySecurity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }

func (m *ApiKeySecurity) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *ApiKeySecurity) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *ApiKeySecurity) GetIn() string {
	if m != nil {
		return m.In
	}
	return ""
}

func (m *ApiKeySecurity) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *ApiKeySecurity) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type BasicAuthenticationSecurity struct {
	Type            string      `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"`
	Description     string      `protobuf:"bytes,2,opt,name=description" json:"description,omitempty"`
	VendorExtension []*NamedAny `protobuf:"bytes,3,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *BasicAuthenticationSecurity) Reset()                    { *m = BasicAuthenticationSecurity{} }
func (m *BasicAuthenticationSecurity) String() string            { return proto.CompactTextString(m) }
func (*BasicAuthenticationSecurity) ProtoMessage()               {}
func (*BasicAuthenticationSecurity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }

func (m *BasicAuthenticationSecurity) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *BasicAuthenticationSecurity) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *BasicAuthenticationSecurity) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type BodyParameter struct {
	// A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.
	Description string `protobuf:"bytes,1,opt,name=description" json:"description,omitempty"`
	// The name of the parameter.
	Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
	// Determines the location of the parameter.
	In string `protobuf:"bytes,3,opt,name=in" json:"in,omitempty"`
	// Determines whether or not this parameter is required or optional.
	Required        bool        `protobuf:"varint,4,opt,name=required" json:"required,omitempty"`
	Schema          *Schema     `protobuf:"bytes,5,opt,name=schema" json:"schema,omitempty"`
	VendorExtension []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *BodyParameter) Reset()                    { *m = BodyParameter{} }
func (m *BodyParameter) String() string            { return proto.CompactTextString(m) }
func (*BodyParameter) ProtoMessage()               {}
func (*BodyParameter) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }

func (m *BodyParameter) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *BodyParameter) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *BodyParameter) GetIn() string {
	if m != nil {
		return m.In
	}
	return ""
}

func (m *BodyParameter) GetRequired() bool {
	if m != nil {
		return m.Required
	}
	return false
}

func (m *BodyParameter) GetSchema() *Schema {
	if m != nil {
		return m.Schema
	}
	return nil
}

func (m *BodyParameter) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

// Contact information for the owners of the API.
type Contact struct {
	// The identifying name of the contact person/organization.
	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	// The URL pointing to the contact information.
	Url string `protobuf:"bytes,2,opt,name=url" json:"url,omitempty"`
	// The email address of the contact person/organization.
	Email           string      `protobuf:"bytes,3,opt,name=email" json:"email,omitempty"`
	VendorExtension []*NamedAny `protobuf:"bytes,4,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *Contact) Reset()                    { *m = Contact{} }
func (m *Contact) String() string            { return proto.CompactTextString(m) }
func (*Contact) ProtoMessage()               {}
func (*Contact) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }

func (m *Contact) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Contact) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

func (m *Contact) GetEmail() string {
	if m != nil {
		return m.Email
	}
	return ""
}

func (m *Contact) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Default struct {
	AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"`
}

func (m *Default) Reset()                    { *m = Default{} }
func (m *Default) String() string            { return proto.CompactTextString(m) }
func (*Default) ProtoMessage()               {}
func (*Default) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }

func (m *Default) GetAdditionalProperties() []*NamedAny {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

// One or more JSON objects describing the schemas being consumed and produced by the API.
type Definitions struct {
	AdditionalProperties []*NamedSchema `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"`
}

func (m *Definitions) Reset()                    { *m = Definitions{} }
func (m *Definitions) String() string            { return proto.CompactTextString(m) }
func (*Definitions) ProtoMessage()               {}
func (*Definitions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }

func (m *Definitions) GetAdditionalProperties() []*NamedSchema {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

type Document struct {
	// The Swagger version of this document.
	Swagger string `protobuf:"bytes,1,opt,name=swagger" json:"swagger,omitempty"`
	Info    *Info  `protobuf:"bytes,2,opt,name=info" json:"info,omitempty"`
	// The host (name or ip) of the API. Example: 'swagger.io'
	Host string `protobuf:"bytes,3,opt,name=host" json:"host,omitempty"`
	// The base path to the API. Example: '/api'.
	BasePath string `protobuf:"bytes,4,opt,name=base_path,json=basePath" json:"base_path,omitempty"`
	// The transfer protocol of the API.
	Schemes []string `protobuf:"bytes,5,rep,name=schemes" json:"schemes,omitempty"`
	// A list of MIME types accepted by the API.
	Consumes []string `protobuf:"bytes,6,rep,name=consumes" json:"consumes,omitempty"`
	// A list of MIME types the API can produce.
	Produces            []string               `protobuf:"bytes,7,rep,name=produces" json:"produces,omitempty"`
	Paths               *Paths                 `protobuf:"bytes,8,opt,name=paths" json:"paths,omitempty"`
	Definitions         *Definitions           `protobuf:"bytes,9,opt,name=definitions" json:"definitions,omitempty"`
	Parameters          *ParameterDefinitions  `protobuf:"bytes,10,opt,name=parameters" json:"parameters,omitempty"`
	Responses           *ResponseDefinitions   `protobuf:"bytes,11,opt,name=responses" json:"responses,omitempty"`
	Security            []*SecurityRequirement `protobuf:"bytes,12,rep,name=security" json:"security,omitempty"`
	SecurityDefinitions *SecurityDefinitions   `protobuf:"bytes,13,opt,name=security_definitions,json=securityDefinitions" json:"security_definitions,omitempty"`
	Tags                []*Tag                 `protobuf:"bytes,14,rep,name=tags" json:"tags,omitempty"`
	ExternalDocs        *ExternalDocs          `protobuf:"bytes,15,opt,name=external_docs,json=externalDocs" json:"external_docs,omitempty"`
	VendorExtension     []*NamedAny            `protobuf:"bytes,16,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *Document) Reset()                    { *m = Document{} }
func (m *Document) String() string            { return proto.CompactTextString(m) }
func (*Document) ProtoMessage()               {}
func (*Document) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }

func (m *Document) GetSwagger() string {
	if m != nil {
		return m.Swagger
	}
	return ""
}

func (m *Document) GetInfo() *Info {
	if m != nil {
		return m.Info
	}
	return nil
}

func (m *Document) GetHost() string {
	if m != nil {
		return m.Host
	}
	return ""
}

func (m *Document) GetBasePath() string {
	if m != nil {
		return m.BasePath
	}
	return ""
}

func (m *Document) GetSchemes() []string {
	if m != nil {
		return m.Schemes
	}
	return nil
}

func (m *Document) GetConsumes() []string {
	if m != nil {
		return m.Consumes
	}
	return nil
}

func (m *Document) GetProduces() []string {
	if m != nil {
		return m.Produces
	}
	return nil
}

func (m *Document) GetPaths() *Paths {
	if m != nil {
		return m.Paths
	}
	return nil
}

func (m *Document) GetDefinitions() *Definitions {
	if m != nil {
		return m.Definitions
	}
	return nil
}

func (m *Document) GetParameters() *ParameterDefinitions {
	if m != nil {
		return m.Parameters
	}
	return nil
}

func (m *Document) GetResponses() *ResponseDefinitions {
	if m != nil {
		return m.Responses
	}
	return nil
}

func (m *Document) GetSecurity() []*SecurityRequirement {
	if m != nil {
		return m.Security
	}
	return nil
}

func (m *Document) GetSecurityDefinitions() *SecurityDefinitions {
	if m != nil {
		return m.SecurityDefinitions
	}
	return nil
}

func (m *Document) GetTags() []*Tag {
	if m != nil {
		return m.Tags
	}
	return nil
}

func (m *Document) GetExternalDocs() *ExternalDocs {
	if m != nil {
		return m.ExternalDocs
	}
	return nil
}

func (m *Document) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Examples struct {
	AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"`
}

func (m *Examples) Reset()                    { *m = Examples{} }
func (m *Examples) String() string            { return proto.CompactTextString(m) }
func (*Examples) ProtoMessage()               {}
func (*Examples) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }

func (m *Examples) GetAdditionalProperties() []*NamedAny {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

// information about external documentation
type ExternalDocs struct {
	Description     string      `protobuf:"bytes,1,opt,name=description" json:"description,omitempty"`
	Url             string      `protobuf:"bytes,2,opt,name=url" json:"url,omitempty"`
	VendorExtension []*NamedAny `protobuf:"bytes,3,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *ExternalDocs) Reset()                    { *m = ExternalDocs{} }
func (m *ExternalDocs) String() string            { return proto.CompactTextString(m) }
func (*ExternalDocs) ProtoMessage()               {}
func (*ExternalDocs) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }

func (m *ExternalDocs) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *ExternalDocs) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

func (m *ExternalDocs) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

// A deterministic version of a JSON Schema object.
type FileSchema struct {
	Format          string        `protobuf:"bytes,1,opt,name=format" json:"format,omitempty"`
	Title           string        `protobuf:"bytes,2,opt,name=title" json:"title,omitempty"`
	Description     string        `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"`
	Default         *Any          `protobuf:"bytes,4,opt,name=default" json:"default,omitempty"`
	Required        []string      `protobuf:"bytes,5,rep,name=required" json:"required,omitempty"`
	Type            string        `protobuf:"bytes,6,opt,name=type" json:"type,omitempty"`
	ReadOnly        bool          `protobuf:"varint,7,opt,name=read_only,json=readOnly" json:"read_only,omitempty"`
	ExternalDocs    *ExternalDocs `protobuf:"bytes,8,opt,name=external_docs,json=externalDocs" json:"external_docs,omitempty"`
	Example         *Any          `protobuf:"bytes,9,opt,name=example" json:"example,omitempty"`
	VendorExtension []*NamedAny   `protobuf:"bytes,10,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *FileSchema) Reset()                    { *m = FileSchema{} }
func (m *FileSchema) String() string            { return proto.CompactTextString(m) }
func (*FileSchema) ProtoMessage()               {}
func (*FileSchema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }

func (m *FileSchema) GetFormat() string {
	if m != nil {
		return m.Format
	}
	return ""
}

func (m *FileSchema) GetTitle() string {
	if m != nil {
		return m.Title
	}
	return ""
}

func (m *FileSchema) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *FileSchema) GetDefault() *Any {
	if m != nil {
		return m.Default
	}
	return nil
}

func (m *FileSchema) GetRequired() []string {
	if m != nil {
		return m.Required
	}
	return nil
}

func (m *FileSchema) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *FileSchema) GetReadOnly() bool {
	if m != nil {
		return m.ReadOnly
	}
	return false
}

func (m *FileSchema) GetExternalDocs() *ExternalDocs {
	if m != nil {
		return m.ExternalDocs
	}
	return nil
}

func (m *FileSchema) GetExample() *Any {
	if m != nil {
		return m.Example
	}
	return nil
}

func (m *FileSchema) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type FormDataParameterSubSchema struct {
	// Determines whether or not this parameter is required or optional.
	Required bool `protobuf:"varint,1,opt,name=required" json:"required,omitempty"`
	// Determines the location of the parameter.
	In string `protobuf:"bytes,2,opt,name=in" json:"in,omitempty"`
	// A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.
	Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"`
	// The name of the parameter.
	Name string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"`
	// allows sending a parameter by name only or with an empty value.
	AllowEmptyValue  bool             `protobuf:"varint,5,opt,name=allow_empty_value,json=allowEmptyValue" json:"allow_empty_value,omitempty"`
	Type             string           `protobuf:"bytes,6,opt,name=type" json:"type,omitempty"`
	Format           string           `protobuf:"bytes,7,opt,name=format" json:"format,omitempty"`
	Items            *PrimitivesItems `protobuf:"bytes,8,opt,name=items" json:"items,omitempty"`
	CollectionFormat string           `protobuf:"bytes,9,opt,name=collection_format,json=collectionFormat" json:"collection_format,omitempty"`
	Default          *Any             `protobuf:"bytes,10,opt,name=default" json:"default,omitempty"`
	Maximum          float64          `protobuf:"fixed64,11,opt,name=maximum" json:"maximum,omitempty"`
	ExclusiveMaximum bool             `protobuf:"varint,12,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"`
	Minimum          float64          `protobuf:"fixed64,13,opt,name=minimum" json:"minimum,omitempty"`
	ExclusiveMinimum bool             `protobuf:"varint,14,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"`
	MaxLength        int64            `protobuf:"varint,15,opt,name=max_length,json=maxLength" json:"max_length,omitempty"`
	MinLength        int64            `protobuf:"varint,16,opt,name=min_length,json=minLength" json:"min_length,omitempty"`
	Pattern          string           `protobuf:"bytes,17,opt,name=pattern" json:"pattern,omitempty"`
	MaxItems         int64            `protobuf:"varint,18,opt,name=max_items,json=maxItems" json:"max_items,omitempty"`
	MinItems         int64            `protobuf:"varint,19,opt,name=min_items,json=minItems" json:"min_items,omitempty"`
	UniqueItems      bool             `protobuf:"varint,20,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"`
	Enum             []*Any           `protobuf:"bytes,21,rep,name=enum" json:"enum,omitempty"`
	MultipleOf       float64          `protobuf:"fixed64,22,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"`
	VendorExtension  []*NamedAny      `protobuf:"bytes,23,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *FormDataParameterSubSchema) Reset()                    { *m = FormDataParameterSubSchema{} }
func (m *FormDataParameterSubSchema) String() string            { return proto.CompactTextString(m) }
func (*FormDataParameterSubSchema) ProtoMessage()               {}
func (*FormDataParameterSubSchema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }

func (m *FormDataParameterSubSchema) GetRequired() bool {
	if m != nil {
		return m.Required
	}
	return false
}

func (m *FormDataParameterSubSchema) GetIn() string {
	if m != nil {
		return m.In
	}
	return ""
}

func (m *FormDataParameterSubSchema) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *FormDataParameterSubSchema) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *FormDataParameterSubSchema) GetAllowEmptyValue() bool {
	if m != nil {
		return m.AllowEmptyValue
	}
	return false
}

func (m *FormDataParameterSubSchema) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *FormDataParameterSubSchema) GetFormat() string {
	if m != nil {
		return m.Format
	}
	return ""
}

func (m *FormDataParameterSubSchema) GetItems() *PrimitivesItems {
	if m != nil {
		return m.Items
	}
	return nil
}

func (m *FormDataParameterSubSchema) GetCollectionFormat() string {
	if m != nil {
		return m.CollectionFormat
	}
	return ""
}

func (m *FormDataParameterSubSchema) GetDefault() *Any {
	if m != nil {
		return m.Default
	}
	return nil
}

func (m *FormDataParameterSubSchema) GetMaximum() float64 {
	if m != nil {
		return m.Maximum
	}
	return 0
}

func (m *FormDataParameterSubSchema) GetExclusiveMaximum() bool {
	if m != nil {
		return m.ExclusiveMaximum
	}
	return false
}

func (m *FormDataParameterSubSchema) GetMinimum() float64 {
	if m != nil {
		return m.Minimum
	}
	return 0
}

func (m *FormDataParameterSubSchema) GetExclusiveMinimum() bool {
	if m != nil {
		return m.ExclusiveMinimum
	}
	return false
}

func (m *FormDataParameterSubSchema) GetMaxLength() int64 {
	if m != nil {
		return m.MaxLength
	}
	return 0
}

func (m *FormDataParameterSubSchema) GetMinLength() int64 {
	if m != nil {
		return m.MinLength
	}
	return 0
}

func (m *FormDataParameterSubSchema) GetPattern() string {
	if m != nil {
		return m.Pattern
	}
	return ""
}

func (m *FormDataParameterSubSchema) GetMaxItems() int64 {
	if m != nil {
		return m.MaxItems
	}
	return 0
}

func (m *FormDataParameterSubSchema) GetMinItems() int64 {
	if m != nil {
		return m.MinItems
	}
	return 0
}

func (m *FormDataParameterSubSchema) GetUniqueItems() bool {
	if m != nil {
		return m.UniqueItems
	}
	return false
}

func (m *FormDataParameterSubSchema) GetEnum() []*Any {
	if m != nil {
		return m.Enum
	}
	return nil
}

func (m *FormDataParameterSubSchema) GetMultipleOf() float64 {
	if m != nil {
		return m.MultipleOf
	}
	return 0
}

func (m *FormDataParameterSubSchema) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Header struct {
	Type             string           `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"`
	Format           string           `protobuf:"bytes,2,opt,name=format" json:"format,omitempty"`
	Items            *PrimitivesItems `protobuf:"bytes,3,opt,name=items" json:"items,omitempty"`
	CollectionFormat string           `protobuf:"bytes,4,opt,name=collection_format,json=collectionFormat" json:"collection_format,omitempty"`
	Default          *Any             `protobuf:"bytes,5,opt,name=default" json:"default,omitempty"`
	Maximum          float64          `protobuf:"fixed64,6,opt,name=maximum" json:"maximum,omitempty"`
	ExclusiveMaximum bool             `protobuf:"varint,7,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"`
	Minimum          float64          `protobuf:"fixed64,8,opt,name=minimum" json:"minimum,omitempty"`
	ExclusiveMinimum bool             `protobuf:"varint,9,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"`
	MaxLength        int64            `protobuf:"varint,10,opt,name=max_length,json=maxLength" json:"max_length,omitempty"`
	MinLength        int64            `protobuf:"varint,11,opt,name=min_length,json=minLength" json:"min_length,omitempty"`
	Pattern          string           `protobuf:"bytes,12,opt,name=pattern" json:"pattern,omitempty"`
	MaxItems         int64            `protobuf:"varint,13,opt,name=max_items,json=maxItems" json:"max_items,omitempty"`
	MinItems         int64            `protobuf:"varint,14,opt,name=min_items,json=minItems" json:"min_items,omitempty"`
	UniqueItems      bool             `protobuf:"varint,15,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"`
	Enum             []*Any           `protobuf:"bytes,16,rep,name=enum" json:"enum,omitempty"`
	MultipleOf       float64          `protobuf:"fixed64,17,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"`
	Description      string           `protobuf:"bytes,18,opt,name=description" json:"description,omitempty"`
	VendorExtension  []*NamedAny      `protobuf:"bytes,19,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *Header) Reset()                    { *m = Header{} }
func (m *Header) String() string            { return proto.CompactTextString(m) }
func (*Header) ProtoMessage()               {}
func (*Header) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }

func (m *Header) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *Header) GetFormat() string {
	if m != nil {
		return m.Format
	}
	return ""
}

func (m *Header) GetItems() *PrimitivesItems {
	if m != nil {
		return m.Items
	}
	return nil
}

func (m *Header) GetCollectionFormat() string {
	if m != nil {
		return m.CollectionFormat
	}
	return ""
}

func (m *Header) GetDefault() *Any {
	if m != nil {
		return m.Default
	}
	return nil
}

func (m *Header) GetMaximum() float64 {
	if m != nil {
		return m.Maximum
	}
	return 0
}

func (m *Header) GetExclusiveMaximum() bool {
	if m != nil {
		return m.ExclusiveMaximum
	}
	return false
}

func (m *Header) GetMinimum() float64 {
	if m != nil {
		return m.Minimum
	}
	return 0
}

func (m *Header) GetExclusiveMinimum() bool {
	if m != nil {
		return m.ExclusiveMinimum
	}
	return false
}

func (m *Header) GetMaxLength() int64 {
	if m != nil {
		return m.MaxLength
	}
	return 0
}

func (m *Header) GetMinLength() int64 {
	if m != nil {
		return m.MinLength
	}
	return 0
}

func (m *Header) GetPattern() string {
	if m != nil {
		return m.Pattern
	}
	return ""
}

func (m *Header) GetMaxItems() int64 {
	if m != nil {
		return m.MaxItems
	}
	return 0
}

func (m *Header) GetMinItems() int64 {
	if m != nil {
		return m.MinItems
	}
	return 0
}

func (m *Header) GetUniqueItems() bool {
	if m != nil {
		return m.UniqueItems
	}
	return false
}

func (m *Header) GetEnum() []*Any {
	if m != nil {
		return m.Enum
	}
	return nil
}

func (m *Header) GetMultipleOf() float64 {
	if m != nil {
		return m.MultipleOf
	}
	return 0
}

func (m *Header) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Header) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type HeaderParameterSubSchema struct {
	// Determines whether or not this parameter is required or optional.
	Required bool `protobuf:"varint,1,opt,name=required" json:"required,omitempty"`
	// Determines the location of the parameter.
	In string `protobuf:"bytes,2,opt,name=in" json:"in,omitempty"`
	// A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.
	Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"`
	// The name of the parameter.
	Name             string           `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"`
	Type             string           `protobuf:"bytes,5,opt,name=type" json:"type,omitempty"`
	Format           string           `protobuf:"bytes,6,opt,name=format" json:"format,omitempty"`
	Items            *PrimitivesItems `protobuf:"bytes,7,opt,name=items" json:"items,omitempty"`
	CollectionFormat string           `protobuf:"bytes,8,opt,name=collection_format,json=collectionFormat" json:"collection_format,omitempty"`
	Default          *Any             `protobuf:"bytes,9,opt,name=default" json:"default,omitempty"`
	Maximum          float64          `protobuf:"fixed64,10,opt,name=maximum" json:"maximum,omitempty"`
	ExclusiveMaximum bool             `protobuf:"varint,11,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"`
	Minimum          float64          `protobuf:"fixed64,12,opt,name=minimum" json:"minimum,omitempty"`
	ExclusiveMinimum bool             `protobuf:"varint,13,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"`
	MaxLength        int64            `protobuf:"varint,14,opt,name=max_length,json=maxLength" json:"max_length,omitempty"`
	MinLength        int64            `protobuf:"varint,15,opt,name=min_length,json=minLength" json:"min_length,omitempty"`
	Pattern          string           `protobuf:"bytes,16,opt,name=pattern" json:"pattern,omitempty"`
	MaxItems         int64            `protobuf:"varint,17,opt,name=max_items,json=maxItems" json:"max_items,omitempty"`
	MinItems         int64            `protobuf:"varint,18,opt,name=min_items,json=minItems" json:"min_items,omitempty"`
	UniqueItems      bool             `protobuf:"varint,19,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"`
	Enum             []*Any           `protobuf:"bytes,20,rep,name=enum" json:"enum,omitempty"`
	MultipleOf       float64          `protobuf:"fixed64,21,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"`
	VendorExtension  []*NamedAny      `protobuf:"bytes,22,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *HeaderParameterSubSchema) Reset()                    { *m = HeaderParameterSubSchema{} }
func (m *HeaderParameterSubSchema) String() string            { return proto.CompactTextString(m) }
func (*HeaderParameterSubSchema) ProtoMessage()               {}
func (*HeaderParameterSubSchema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }

func (m *HeaderParameterSubSchema) GetRequired() bool {
	if m != nil {
		return m.Required
	}
	return false
}

func (m *HeaderParameterSubSchema) GetIn() string {
	if m != nil {
		return m.In
	}
	return ""
}

func (m *HeaderParameterSubSchema) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *HeaderParameterSubSchema) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *HeaderParameterSubSchema) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *HeaderParameterSubSchema) GetFormat() string {
	if m != nil {
		return m.Format
	}
	return ""
}

func (m *HeaderParameterSubSchema) GetItems() *PrimitivesItems {
	if m != nil {
		return m.Items
	}
	return nil
}

func (m *HeaderParameterSubSchema) GetCollectionFormat() string {
	if m != nil {
		return m.CollectionFormat
	}
	return ""
}

func (m *HeaderParameterSubSchema) GetDefault() *Any {
	if m != nil {
		return m.Default
	}
	return nil
}

func (m *HeaderParameterSubSchema) GetMaximum() float64 {
	if m != nil {
		return m.Maximum
	}
	return 0
}

func (m *HeaderParameterSubSchema) GetExclusiveMaximum() bool {
	if m != nil {
		return m.ExclusiveMaximum
	}
	return false
}

func (m *HeaderParameterSubSchema) GetMinimum() float64 {
	if m != nil {
		return m.Minimum
	}
	return 0
}

func (m *HeaderParameterSubSchema) GetExclusiveMinimum() bool {
	if m != nil {
		return m.ExclusiveMinimum
	}
	return false
}

func (m *HeaderParameterSubSchema) GetMaxLength() int64 {
	if m != nil {
		return m.MaxLength
	}
	return 0
}

func (m *HeaderParameterSubSchema) GetMinLength() int64 {
	if m != nil {
		return m.MinLength
	}
	return 0
}

func (m *HeaderParameterSubSchema) GetPattern() string {
	if m != nil {
		return m.Pattern
	}
	return ""
}

func (m *HeaderParameterSubSchema) GetMaxItems() int64 {
	if m != nil {
		return m.MaxItems
	}
	return 0
}

func (m *HeaderParameterSubSchema) GetMinItems() int64 {
	if m != nil {
		return m.MinItems
	}
	return 0
}

func (m *HeaderParameterSubSchema) GetUniqueItems() bool {
	if m != nil {
		return m.UniqueItems
	}
	return false
}

func (m *HeaderParameterSubSchema) GetEnum() []*Any {
	if m != nil {
		return m.Enum
	}
	return nil
}

func (m *HeaderParameterSubSchema) GetMultipleOf() float64 {
	if m != nil {
		return m.MultipleOf
	}
	return 0
}

func (m *HeaderParameterSubSchema) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Headers struct {
	AdditionalProperties []*NamedHeader `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"`
}

func (m *Headers) Reset()                    { *m = Headers{} }
func (m *Headers) String() string            { return proto.CompactTextString(m) }
func (*Headers) ProtoMessage()               {}
func (*Headers) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }

func (m *Headers) GetAdditionalProperties() []*NamedHeader {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

// General information about the API.
type Info struct {
	// A unique and precise title of the API.
	Title string `protobuf:"bytes,1,opt,name=title" json:"title,omitempty"`
	// A semantic version number of the API.
	Version string `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"`
	// A longer description of the API. Should be different from the title.  GitHub Flavored Markdown is allowed.
	Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"`
	// The terms of service for the API.
	TermsOfService  string      `protobuf:"bytes,4,opt,name=terms_of_service,json=termsOfService" json:"terms_of_service,omitempty"`
	Contact         *Contact    `protobuf:"bytes,5,opt,name=contact" json:"contact,omitempty"`
	License         *License    `protobuf:"bytes,6,opt,name=license" json:"license,omitempty"`
	VendorExtension []*NamedAny `protobuf:"bytes,7,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *Info) Reset()                    { *m = Info{} }
func (m *Info) String() string            { return proto.CompactTextString(m) }
func (*Info) ProtoMessage()               {}
func (*Info) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }

func (m *Info) GetTitle() string {
	if m != nil {
		return m.Title
	}
	return ""
}

func (m *Info) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

func (m *Info) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Info) GetTermsOfService() string {
	if m != nil {
		return m.TermsOfService
	}
	return ""
}

func (m *Info) GetContact() *Contact {
	if m != nil {
		return m.Contact
	}
	return nil
}

func (m *Info) GetLicense() *License {
	if m != nil {
		return m.License
	}
	return nil
}

func (m *Info) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type ItemsItem struct {
	Schema []*Schema `protobuf:"bytes,1,rep,name=schema" json:"schema,omitempty"`
}

func (m *ItemsItem) Reset()                    { *m = ItemsItem{} }
func (m *ItemsItem) String() string            { return proto.CompactTextString(m) }
func (*ItemsItem) ProtoMessage()               {}
func (*ItemsItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }

func (m *ItemsItem) GetSchema() []*Schema {
	if m != nil {
		return m.Schema
	}
	return nil
}

type JsonReference struct {
	XRef        string `protobuf:"bytes,1,opt,name=_ref,json=Ref" json:"_ref,omitempty"`
	Description string `protobuf:"bytes,2,opt,name=description" json:"description,omitempty"`
}

func (m *JsonReference) Reset()                    { *m = JsonReference{} }
func (m *JsonReference) String() string            { return proto.CompactTextString(m) }
func (*JsonReference) ProtoMessage()               {}
func (*JsonReference) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }

func (m *JsonReference) GetXRef() string {
	if m != nil {
		return m.XRef
	}
	return ""
}

func (m *JsonReference) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

type License struct {
	// The name of the license type. It's encouraged to use an OSI compatible license.
	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	// The URL pointing to the license.
	Url             string      `protobuf:"bytes,2,opt,name=url" json:"url,omitempty"`
	VendorExtension []*NamedAny `protobuf:"bytes,3,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *License) Reset()                    { *m = License{} }
func (m *License) String() string            { return proto.CompactTextString(m) }
func (*License) ProtoMessage()               {}
func (*License) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }

func (m *License) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *License) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

func (m *License) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

// Automatically-generated message used to represent maps of Any as ordered (name,value) pairs.
type NamedAny struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	// Mapped value
	Value *Any `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"`
}

func (m *NamedAny) Reset()                    { *m = NamedAny{} }
func (m *NamedAny) String() string            { return proto.CompactTextString(m) }
func (*NamedAny) ProtoMessage()               {}
func (*NamedAny) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }

func (m *NamedAny) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedAny) GetValue() *Any {
	if m != nil {
		return m.Value
	}
	return nil
}

// Automatically-generated message used to represent maps of Header as ordered (name,value) pairs.
type NamedHeader struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	// Mapped value
	Value *Header `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"`
}

func (m *NamedHeader) Reset()                    { *m = NamedHeader{} }
func (m *NamedHeader) String() string            { return proto.CompactTextString(m) }
func (*NamedHeader) ProtoMessage()               {}
func (*NamedHeader) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }

func (m *NamedHeader) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedHeader) GetValue() *Header {
	if m != nil {
		return m.Value
	}
	return nil
}

// Automatically-generated message used to represent maps of Parameter as ordered (name,value) pairs.
type NamedParameter struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	// Mapped value
	Value *Parameter `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"`
}

func (m *NamedParameter) Reset()                    { *m = NamedParameter{} }
func (m *NamedParameter) String() string            { return proto.CompactTextString(m) }
func (*NamedParameter) ProtoMessage()               {}
func (*NamedParameter) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }

func (m *NamedParameter) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedParameter) GetValue() *Parameter {
	if m != nil {
		return m.Value
	}
	return nil
}

// Automatically-generated message used to represent maps of PathItem as ordered (name,value) pairs.
type NamedPathItem struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	// Mapped value
	Value *PathItem `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"`
}

func (m *NamedPathItem) Reset()                    { *m = NamedPathItem{} }
func (m *NamedPathItem) String() string            { return proto.CompactTextString(m) }
func (*NamedPathItem) ProtoMessage()               {}
func (*NamedPathItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }

func (m *NamedPathItem) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedPathItem) GetValue() *PathItem {
	if m != nil {
		return m.Value
	}
	return nil
}

// Automatically-generated message used to represent maps of Response as ordered (name,value) pairs.
type NamedResponse struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	// Mapped value
	Value *Response `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"`
}

func (m *NamedResponse) Reset()                    { *m = NamedResponse{} }
func (m *NamedResponse) String() string            { return proto.CompactTextString(m) }
func (*NamedResponse) ProtoMessage()               {}
func (*NamedResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }

func (m *NamedResponse) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedResponse) GetValue() *Response {
	if m != nil {
		return m.Value
	}
	return nil
}

// Automatically-generated message used to represent maps of ResponseValue as ordered (name,value) pairs.
type NamedResponseValue struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	// Mapped value
	Value *ResponseValue `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"`
}

func (m *NamedResponseValue) Reset()                    { *m = NamedResponseValue{} }
func (m *NamedResponseValue) String() string            { return proto.CompactTextString(m) }
func (*NamedResponseValue) ProtoMessage()               {}
func (*NamedResponseValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} }

func (m *NamedResponseValue) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedResponseValue) GetValue() *ResponseValue {
	if m != nil {
		return m.Value
	}
	return nil
}

// Automatically-generated message used to represent maps of Schema as ordered (name,value) pairs.
type NamedSchema struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	// Mapped value
	Value *Schema `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"`
}

func (m *NamedSchema) Reset()                    { *m = NamedSchema{} }
func (m *NamedSchema) String() string            { return proto.CompactTextString(m) }
func (*NamedSchema) ProtoMessage()               {}
func (*NamedSchema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} }

func (m *NamedSchema) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedSchema) GetValue() *Schema {
	if m != nil {
		return m.Value
	}
	return nil
}

// Automatically-generated message used to represent maps of SecurityDefinitionsItem as ordered (name,value) pairs.
type NamedSecurityDefinitionsItem struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	// Mapped value
	Value *SecurityDefinitionsItem `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"`
}

func (m *NamedSecurityDefinitionsItem) Reset()                    { *m = NamedSecurityDefinitionsItem{} }
func (m *NamedSecurityDefinitionsItem) String() string            { return proto.CompactTextString(m) }
func (*NamedSecurityDefinitionsItem) ProtoMessage()               {}
func (*NamedSecurityDefinitionsItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }

func (m *NamedSecurityDefinitionsItem) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedSecurityDefinitionsItem) GetValue() *SecurityDefinitionsItem {
	if m != nil {
		return m.Value
	}
	return nil
}

// Automatically-generated message used to represent maps of string as ordered (name,value) pairs.
type NamedString struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	// Mapped value
	Value string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"`
}

func (m *NamedString) Reset()                    { *m = NamedString{} }
func (m *NamedString) String() string            { return proto.CompactTextString(m) }
func (*NamedString) ProtoMessage()               {}
func (*NamedString) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }

func (m *NamedString) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedString) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

// Automatically-generated message used to represent maps of StringArray as ordered (name,value) pairs.
type NamedStringArray struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	// Mapped value
	Value *StringArray `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"`
}

func (m *NamedStringArray) Reset()                    { *m = NamedStringArray{} }
func (m *NamedStringArray) String() string            { return proto.CompactTextString(m) }
func (*NamedStringArray) ProtoMessage()               {}
func (*NamedStringArray) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }

func (m *NamedStringArray) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedStringArray) GetValue() *StringArray {
	if m != nil {
		return m.Value
	}
	return nil
}

type NonBodyParameter struct {
	// Types that are valid to be assigned to Oneof:
	//	*NonBodyParameter_HeaderParameterSubSchema
	//	*NonBodyParameter_FormDataParameterSubSchema
	//	*NonBodyParameter_QueryParameterSubSchema
	//	*NonBodyParameter_PathParameterSubSchema
	Oneof isNonBodyParameter_Oneof `protobuf_oneof:"oneof"`
}

func (m *NonBodyParameter) Reset()                    { *m = NonBodyParameter{} }
func (m *NonBodyParameter) String() string            { return proto.CompactTextString(m) }
func (*NonBodyParameter) ProtoMessage()               {}
func (*NonBodyParameter) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }

type isNonBodyParameter_Oneof interface {
	isNonBodyParameter_Oneof()
}

type NonBodyParameter_HeaderParameterSubSchema struct {
	HeaderParameterSubSchema *HeaderParameterSubSchema `protobuf:"bytes,1,opt,name=header_parameter_sub_schema,json=headerParameterSubSchema,oneof"`
}
type NonBodyParameter_FormDataParameterSubSchema struct {
	FormDataParameterSubSchema *FormDataParameterSubSchema `protobuf:"bytes,2,opt,name=form_data_parameter_sub_schema,json=formDataParameterSubSchema,oneof"`
}
type NonBodyParameter_QueryParameterSubSchema struct {
	QueryParameterSubSchema *QueryParameterSubSchema `protobuf:"bytes,3,opt,name=query_parameter_sub_schema,json=queryParameterSubSchema,oneof"`
}
type NonBodyParameter_PathParameterSubSchema struct {
	PathParameterSubSchema *PathParameterSubSchema `protobuf:"bytes,4,opt,name=path_parameter_sub_schema,json=pathParameterSubSchema,oneof"`
}

func (*NonBodyParameter_HeaderParameterSubSchema) isNonBodyParameter_Oneof()   {}
func (*NonBodyParameter_FormDataParameterSubSchema) isNonBodyParameter_Oneof() {}
func (*NonBodyParameter_QueryParameterSubSchema) isNonBodyParameter_Oneof()    {}
func (*NonBodyParameter_PathParameterSubSchema) isNonBodyParameter_Oneof()     {}

func (m *NonBodyParameter) GetOneof() isNonBodyParameter_Oneof {
	if m != nil {
		return m.Oneof
	}
	return nil
}

func (m *NonBodyParameter) GetHeaderParameterSubSchema() *HeaderParameterSubSchema {
	if x, ok := m.GetOneof().(*NonBodyParameter_HeaderParameterSubSchema); ok {
		return x.HeaderParameterSubSchema
	}
	return nil
}

func (m *NonBodyParameter) GetFormDataParameterSubSchema() *FormDataParameterSubSchema {
	if x, ok := m.GetOneof().(*NonBodyParameter_FormDataParameterSubSchema); ok {
		return x.FormDataParameterSubSchema
	}
	return nil
}

func (m *NonBodyParameter) GetQueryParameterSubSchema() *QueryParameterSubSchema {
	if x, ok := m.GetOneof().(*NonBodyParameter_QueryParameterSubSchema); ok {
		return x.QueryParameterSubSchema
	}
	return nil
}

func (m *NonBodyParameter) GetPathParameterSubSchema() *PathParameterSubSchema {
	if x, ok := m.GetOneof().(*NonBodyParameter_PathParameterSubSchema); ok {
		return x.PathParameterSubSchema
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*NonBodyParameter) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _NonBodyParameter_OneofMarshaler, _NonBodyParameter_OneofUnmarshaler, _NonBodyParameter_OneofSizer, []interface{}{
		(*NonBodyParameter_HeaderParameterSubSchema)(nil),
		(*NonBodyParameter_FormDataParameterSubSchema)(nil),
		(*NonBodyParameter_QueryParameterSubSchema)(nil),
		(*NonBodyParameter_PathParameterSubSchema)(nil),
	}
}

func _NonBodyParameter_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*NonBodyParameter)
	// oneof
	switch x := m.Oneof.(type) {
	case *NonBodyParameter_HeaderParameterSubSchema:
		b.EncodeVarint(1<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.HeaderParameterSubSchema); err != nil {
			return err
		}
	case *NonBodyParameter_FormDataParameterSubSchema:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.FormDataParameterSubSchema); err != nil {
			return err
		}
	case *NonBodyParameter_QueryParameterSubSchema:
		b.EncodeVarint(3<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.QueryParameterSubSchema); err != nil {
			return err
		}
	case *NonBodyParameter_PathParameterSubSchema:
		b.EncodeVarint(4<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.PathParameterSubSchema); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("NonBodyParameter.Oneof has unexpected type %T", x)
	}
	return nil
}

func _NonBodyParameter_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*NonBodyParameter)
	switch tag {
	case 1: // oneof.header_parameter_sub_schema
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(HeaderParameterSubSchema)
		err := b.DecodeMessage(msg)
		m.Oneof = &NonBodyParameter_HeaderParameterSubSchema{msg}
		return true, err
	case 2: // oneof.form_data_parameter_sub_schema
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(FormDataParameterSubSchema)
		err := b.DecodeMessage(msg)
		m.Oneof = &NonBodyParameter_FormDataParameterSubSchema{msg}
		return true, err
	case 3: // oneof.query_parameter_sub_schema
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(QueryParameterSubSchema)
		err := b.DecodeMessage(msg)
		m.Oneof = &NonBodyParameter_QueryParameterSubSchema{msg}
		return true, err
	case 4: // oneof.path_parameter_sub_schema
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(PathParameterSubSchema)
		err := b.DecodeMessage(msg)
		m.Oneof = &NonBodyParameter_PathParameterSubSchema{msg}
		return true, err
	default:
		return false, nil
	}
}

func _NonBodyParameter_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*NonBodyParameter)
	// oneof
	switch x := m.Oneof.(type) {
	case *NonBodyParameter_HeaderParameterSubSchema:
		s := proto.Size(x.HeaderParameterSubSchema)
		n += proto.SizeVarint(1<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *NonBodyParameter_FormDataParameterSubSchema:
		s := proto.Size(x.FormDataParameterSubSchema)
		n += proto.SizeVarint(2<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *NonBodyParameter_QueryParameterSubSchema:
		s := proto.Size(x.QueryParameterSubSchema)
		n += proto.SizeVarint(3<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *NonBodyParameter_PathParameterSubSchema:
		s := proto.Size(x.PathParameterSubSchema)
		n += proto.SizeVarint(4<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

type Oauth2AccessCodeSecurity struct {
	Type             string        `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"`
	Flow             string        `protobuf:"bytes,2,opt,name=flow" json:"flow,omitempty"`
	Scopes           *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes" json:"scopes,omitempty"`
	AuthorizationUrl string        `protobuf:"bytes,4,opt,name=authorization_url,json=authorizationUrl" json:"authorization_url,omitempty"`
	TokenUrl         string        `protobuf:"bytes,5,opt,name=token_url,json=tokenUrl" json:"token_url,omitempty"`
	Description      string        `protobuf:"bytes,6,opt,name=description" json:"description,omitempty"`
	VendorExtension  []*NamedAny   `protobuf:"bytes,7,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *Oauth2AccessCodeSecurity) Reset()                    { *m = Oauth2AccessCodeSecurity{} }
func (m *Oauth2AccessCodeSecurity) String() string            { return proto.CompactTextString(m) }
func (*Oauth2AccessCodeSecurity) ProtoMessage()               {}
func (*Oauth2AccessCodeSecurity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} }

func (m *Oauth2AccessCodeSecurity) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *Oauth2AccessCodeSecurity) GetFlow() string {
	if m != nil {
		return m.Flow
	}
	return ""
}

func (m *Oauth2AccessCodeSecurity) GetScopes() *Oauth2Scopes {
	if m != nil {
		return m.Scopes
	}
	return nil
}

func (m *Oauth2AccessCodeSecurity) GetAuthorizationUrl() string {
	if m != nil {
		return m.AuthorizationUrl
	}
	return ""
}

func (m *Oauth2AccessCodeSecurity) GetTokenUrl() string {
	if m != nil {
		return m.TokenUrl
	}
	return ""
}

func (m *Oauth2AccessCodeSecurity) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Oauth2AccessCodeSecurity) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Oauth2ApplicationSecurity struct {
	Type            string        `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"`
	Flow            string        `protobuf:"bytes,2,opt,name=flow" json:"flow,omitempty"`
	Scopes          *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes" json:"scopes,omitempty"`
	TokenUrl        string        `protobuf:"bytes,4,opt,name=token_url,json=tokenUrl" json:"token_url,omitempty"`
	Description     string        `protobuf:"bytes,5,opt,name=description" json:"description,omitempty"`
	VendorExtension []*NamedAny   `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *Oauth2ApplicationSecurity) Reset()                    { *m = Oauth2ApplicationSecurity{} }
func (m *Oauth2ApplicationSecurity) String() string            { return proto.CompactTextString(m) }
func (*Oauth2ApplicationSecurity) ProtoMessage()               {}
func (*Oauth2ApplicationSecurity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} }

func (m *Oauth2ApplicationSecurity) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *Oauth2ApplicationSecurity) GetFlow() string {
	if m != nil {
		return m.Flow
	}
	return ""
}

func (m *Oauth2ApplicationSecurity) GetScopes() *Oauth2Scopes {
	if m != nil {
		return m.Scopes
	}
	return nil
}

func (m *Oauth2ApplicationSecurity) GetTokenUrl() string {
	if m != nil {
		return m.TokenUrl
	}
	return ""
}

func (m *Oauth2ApplicationSecurity) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Oauth2ApplicationSecurity) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Oauth2ImplicitSecurity struct {
	Type             string        `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"`
	Flow             string        `protobuf:"bytes,2,opt,name=flow" json:"flow,omitempty"`
	Scopes           *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes" json:"scopes,omitempty"`
	AuthorizationUrl string        `protobuf:"bytes,4,opt,name=authorization_url,json=authorizationUrl" json:"authorization_url,omitempty"`
	Description      string        `protobuf:"bytes,5,opt,name=description" json:"description,omitempty"`
	VendorExtension  []*NamedAny   `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *Oauth2ImplicitSecurity) Reset()                    { *m = Oauth2ImplicitSecurity{} }
func (m *Oauth2ImplicitSecurity) String() string            { return proto.CompactTextString(m) }
func (*Oauth2ImplicitSecurity) ProtoMessage()               {}
func (*Oauth2ImplicitSecurity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} }

func (m *Oauth2ImplicitSecurity) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *Oauth2ImplicitSecurity) GetFlow() string {
	if m != nil {
		return m.Flow
	}
	return ""
}

func (m *Oauth2ImplicitSecurity) GetScopes() *Oauth2Scopes {
	if m != nil {
		return m.Scopes
	}
	return nil
}

func (m *Oauth2ImplicitSecurity) GetAuthorizationUrl() string {
	if m != nil {
		return m.AuthorizationUrl
	}
	return ""
}

func (m *Oauth2ImplicitSecurity) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Oauth2ImplicitSecurity) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Oauth2PasswordSecurity struct {
	Type            string        `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"`
	Flow            string        `protobuf:"bytes,2,opt,name=flow" json:"flow,omitempty"`
	Scopes          *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes" json:"scopes,omitempty"`
	TokenUrl        string        `protobuf:"bytes,4,opt,name=token_url,json=tokenUrl" json:"token_url,omitempty"`
	Description     string        `protobuf:"bytes,5,opt,name=description" json:"description,omitempty"`
	VendorExtension []*NamedAny   `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *Oauth2PasswordSecurity) Reset()                    { *m = Oauth2PasswordSecurity{} }
func (m *Oauth2PasswordSecurity) String() string            { return proto.CompactTextString(m) }
func (*Oauth2PasswordSecurity) ProtoMessage()               {}
func (*Oauth2PasswordSecurity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} }

func (m *Oauth2PasswordSecurity) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *Oauth2PasswordSecurity) GetFlow() string {
	if m != nil {
		return m.Flow
	}
	return ""
}

func (m *Oauth2PasswordSecurity) GetScopes() *Oauth2Scopes {
	if m != nil {
		return m.Scopes
	}
	return nil
}

func (m *Oauth2PasswordSecurity) GetTokenUrl() string {
	if m != nil {
		return m.TokenUrl
	}
	return ""
}

func (m *Oauth2PasswordSecurity) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Oauth2PasswordSecurity) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Oauth2Scopes struct {
	AdditionalProperties []*NamedString `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"`
}

func (m *Oauth2Scopes) Reset()                    { *m = Oauth2Scopes{} }
func (m *Oauth2Scopes) String() string            { return proto.CompactTextString(m) }
func (*Oauth2Scopes) ProtoMessage()               {}
func (*Oauth2Scopes) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }

func (m *Oauth2Scopes) GetAdditionalProperties() []*NamedString {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

type Operation struct {
	Tags []string `protobuf:"bytes,1,rep,name=tags" json:"tags,omitempty"`
	// A brief summary of the operation.
	Summary string `protobuf:"bytes,2,opt,name=summary" json:"summary,omitempty"`
	// A longer description of the operation, GitHub Flavored Markdown is allowed.
	Description  string        `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"`
	ExternalDocs *ExternalDocs `protobuf:"bytes,4,opt,name=external_docs,json=externalDocs" json:"external_docs,omitempty"`
	// A unique identifier of the operation.
	OperationId string `protobuf:"bytes,5,opt,name=operation_id,json=operationId" json:"operation_id,omitempty"`
	// A list of MIME types the API can produce.
	Produces []string `protobuf:"bytes,6,rep,name=produces" json:"produces,omitempty"`
	// A list of MIME types the API can consume.
	Consumes []string `protobuf:"bytes,7,rep,name=consumes" json:"consumes,omitempty"`
	// The parameters needed to send a valid API call.
	Parameters []*ParametersItem `protobuf:"bytes,8,rep,name=parameters" json:"parameters,omitempty"`
	Responses  *Responses        `protobuf:"bytes,9,opt,name=responses" json:"responses,omitempty"`
	// The transfer protocol of the API.
	Schemes         []string               `protobuf:"bytes,10,rep,name=schemes" json:"schemes,omitempty"`
	Deprecated      bool                   `protobuf:"varint,11,opt,name=deprecated" json:"deprecated,omitempty"`
	Security        []*SecurityRequirement `protobuf:"bytes,12,rep,name=security" json:"security,omitempty"`
	VendorExtension []*NamedAny            `protobuf:"bytes,13,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *Operation) Reset()                    { *m = Operation{} }
func (m *Operation) String() string            { return proto.CompactTextString(m) }
func (*Operation) ProtoMessage()               {}
func (*Operation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} }

func (m *Operation) GetTags() []string {
	if m != nil {
		return m.Tags
	}
	return nil
}

func (m *Operation) GetSummary() string {
	if m != nil {
		return m.Summary
	}
	return ""
}

func (m *Operation) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Operation) GetExternalDocs() *ExternalDocs {
	if m != nil {
		return m.ExternalDocs
	}
	return nil
}

func (m *Operation) GetOperationId() string {
	if m != nil {
		return m.OperationId
	}
	return ""
}

func (m *Operation) GetProduces() []string {
	if m != nil {
		return m.Produces
	}
	return nil
}

func (m *Operation) GetConsumes() []string {
	if m != nil {
		return m.Consumes
	}
	return nil
}

func (m *Operation) GetParameters() []*ParametersItem {
	if m != nil {
		return m.Parameters
	}
	return nil
}

func (m *Operation) GetResponses() *Responses {
	if m != nil {
		return m.Responses
	}
	return nil
}

func (m *Operation) GetSchemes() []string {
	if m != nil {
		return m.Schemes
	}
	return nil
}

func (m *Operation) GetDeprecated() bool {
	if m != nil {
		return m.Deprecated
	}
	return false
}

func (m *Operation) GetSecurity() []*SecurityRequirement {
	if m != nil {
		return m.Security
	}
	return nil
}

func (m *Operation) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Parameter struct {
	// Types that are valid to be assigned to Oneof:
	//	*Parameter_BodyParameter
	//	*Parameter_NonBodyParameter
	Oneof isParameter_Oneof `protobuf_oneof:"oneof"`
}

func (m *Parameter) Reset()                    { *m = Parameter{} }
func (m *Parameter) String() string            { return proto.CompactTextString(m) }
func (*Parameter) ProtoMessage()               {}
func (*Parameter) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} }

type isParameter_Oneof interface {
	isParameter_Oneof()
}

type Parameter_BodyParameter struct {
	BodyParameter *BodyParameter `protobuf:"bytes,1,opt,name=body_parameter,json=bodyParameter,oneof"`
}
type Parameter_NonBodyParameter struct {
	NonBodyParameter *NonBodyParameter `protobuf:"bytes,2,opt,name=non_body_parameter,json=nonBodyParameter,oneof"`
}

func (*Parameter_BodyParameter) isParameter_Oneof()    {}
func (*Parameter_NonBodyParameter) isParameter_Oneof() {}

func (m *Parameter) GetOneof() isParameter_Oneof {
	if m != nil {
		return m.Oneof
	}
	return nil
}

func (m *Parameter) GetBodyParameter() *BodyParameter {
	if x, ok := m.GetOneof().(*Parameter_BodyParameter); ok {
		return x.BodyParameter
	}
	return nil
}

func (m *Parameter) GetNonBodyParameter() *NonBodyParameter {
	if x, ok := m.GetOneof().(*Parameter_NonBodyParameter); ok {
		return x.NonBodyParameter
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*Parameter) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _Parameter_OneofMarshaler, _Parameter_OneofUnmarshaler, _Parameter_OneofSizer, []interface{}{
		(*Parameter_BodyParameter)(nil),
		(*Parameter_NonBodyParameter)(nil),
	}
}

func _Parameter_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*Parameter)
	// oneof
	switch x := m.Oneof.(type) {
	case *Parameter_BodyParameter:
		b.EncodeVarint(1<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.BodyParameter); err != nil {
			return err
		}
	case *Parameter_NonBodyParameter:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.NonBodyParameter); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("Parameter.Oneof has unexpected type %T", x)
	}
	return nil
}

func _Parameter_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*Parameter)
	switch tag {
	case 1: // oneof.body_parameter
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(BodyParameter)
		err := b.DecodeMessage(msg)
		m.Oneof = &Parameter_BodyParameter{msg}
		return true, err
	case 2: // oneof.non_body_parameter
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(NonBodyParameter)
		err := b.DecodeMessage(msg)
		m.Oneof = &Parameter_NonBodyParameter{msg}
		return true, err
	default:
		return false, nil
	}
}

func _Parameter_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*Parameter)
	// oneof
	switch x := m.Oneof.(type) {
	case *Parameter_BodyParameter:
		s := proto.Size(x.BodyParameter)
		n += proto.SizeVarint(1<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *Parameter_NonBodyParameter:
		s := proto.Size(x.NonBodyParameter)
		n += proto.SizeVarint(2<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// One or more JSON representations for parameters
type ParameterDefinitions struct {
	AdditionalProperties []*NamedParameter `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"`
}

func (m *ParameterDefinitions) Reset()                    { *m = ParameterDefinitions{} }
func (m *ParameterDefinitions) String() string            { return proto.CompactTextString(m) }
func (*ParameterDefinitions) ProtoMessage()               {}
func (*ParameterDefinitions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} }

func (m *ParameterDefinitions) GetAdditionalProperties() []*NamedParameter {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

type ParametersItem struct {
	// Types that are valid to be assigned to Oneof:
	//	*ParametersItem_Parameter
	//	*ParametersItem_JsonReference
	Oneof isParametersItem_Oneof `protobuf_oneof:"oneof"`
}

func (m *ParametersItem) Reset()                    { *m = ParametersItem{} }
func (m *ParametersItem) String() string            { return proto.CompactTextString(m) }
func (*ParametersItem) ProtoMessage()               {}
func (*ParametersItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} }

type isParametersItem_Oneof interface {
	isParametersItem_Oneof()
}

type ParametersItem_Parameter struct {
	Parameter *Parameter `protobuf:"bytes,1,opt,name=parameter,oneof"`
}
type ParametersItem_JsonReference struct {
	JsonReference *JsonReference `protobuf:"bytes,2,opt,name=json_reference,json=jsonReference,oneof"`
}

func (*ParametersItem_Parameter) isParametersItem_Oneof()     {}
func (*ParametersItem_JsonReference) isParametersItem_Oneof() {}

func (m *ParametersItem) GetOneof() isParametersItem_Oneof {
	if m != nil {
		return m.Oneof
	}
	return nil
}

func (m *ParametersItem) GetParameter() *Parameter {
	if x, ok := m.GetOneof().(*ParametersItem_Parameter); ok {
		return x.Parameter
	}
	return nil
}

func (m *ParametersItem) GetJsonReference() *JsonReference {
	if x, ok := m.GetOneof().(*ParametersItem_JsonReference); ok {
		return x.JsonReference
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*ParametersItem) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _ParametersItem_OneofMarshaler, _ParametersItem_OneofUnmarshaler, _ParametersItem_OneofSizer, []interface{}{
		(*ParametersItem_Parameter)(nil),
		(*ParametersItem_JsonReference)(nil),
	}
}

func _ParametersItem_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*ParametersItem)
	// oneof
	switch x := m.Oneof.(type) {
	case *ParametersItem_Parameter:
		b.EncodeVarint(1<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Parameter); err != nil {
			return err
		}
	case *ParametersItem_JsonReference:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.JsonReference); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("ParametersItem.Oneof has unexpected type %T", x)
	}
	return nil
}

func _ParametersItem_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*ParametersItem)
	switch tag {
	case 1: // oneof.parameter
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Parameter)
		err := b.DecodeMessage(msg)
		m.Oneof = &ParametersItem_Parameter{msg}
		return true, err
	case 2: // oneof.json_reference
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(JsonReference)
		err := b.DecodeMessage(msg)
		m.Oneof = &ParametersItem_JsonReference{msg}
		return true, err
	default:
		return false, nil
	}
}

func _ParametersItem_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*ParametersItem)
	// oneof
	switch x := m.Oneof.(type) {
	case *ParametersItem_Parameter:
		s := proto.Size(x.Parameter)
		n += proto.SizeVarint(1<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *ParametersItem_JsonReference:
		s := proto.Size(x.JsonReference)
		n += proto.SizeVarint(2<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

type PathItem struct {
	XRef    string     `protobuf:"bytes,1,opt,name=_ref,json=Ref" json:"_ref,omitempty"`
	Get     *Operation `protobuf:"bytes,2,opt,name=get" json:"get,omitempty"`
	Put     *Operation `protobuf:"bytes,3,opt,name=put" json:"put,omitempty"`
	Post    *Operation `protobuf:"bytes,4,opt,name=post" json:"post,omitempty"`
	Delete  *Operation `protobuf:"bytes,5,opt,name=delete" json:"delete,omitempty"`
	Options *Operation `protobuf:"bytes,6,opt,name=options" json:"options,omitempty"`
	Head    *Operation `protobuf:"bytes,7,opt,name=head" json:"head,omitempty"`
	Patch   *Operation `protobuf:"bytes,8,opt,name=patch" json:"patch,omitempty"`
	// The parameters needed to send a valid API call.
	Parameters      []*ParametersItem `protobuf:"bytes,9,rep,name=parameters" json:"parameters,omitempty"`
	VendorExtension []*NamedAny       `protobuf:"bytes,10,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *PathItem) Reset()                    { *m = PathItem{} }
func (m *PathItem) String() string            { return proto.CompactTextString(m) }
func (*PathItem) ProtoMessage()               {}
func (*PathItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} }

func (m *PathItem) GetXRef() string {
	if m != nil {
		return m.XRef
	}
	return ""
}

func (m *PathItem) GetGet() *Operation {
	if m != nil {
		return m.Get
	}
	return nil
}

func (m *PathItem) GetPut() *Operation {
	if m != nil {
		return m.Put
	}
	return nil
}

func (m *PathItem) GetPost() *Operation {
	if m != nil {
		return m.Post
	}
	return nil
}

func (m *PathItem) GetDelete() *Operation {
	if m != nil {
		return m.Delete
	}
	return nil
}

func (m *PathItem) GetOptions() *Operation {
	if m != nil {
		return m.Options
	}
	return nil
}

func (m *PathItem) GetHead() *Operation {
	if m != nil {
		return m.Head
	}
	return nil
}

func (m *PathItem) GetPatch() *Operation {
	if m != nil {
		return m.Patch
	}
	return nil
}

func (m *PathItem) GetParameters() []*ParametersItem {
	if m != nil {
		return m.Parameters
	}
	return nil
}

func (m *PathItem) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type PathParameterSubSchema struct {
	// Determines whether or not this parameter is required or optional.
	Required bool `protobuf:"varint,1,opt,name=required" json:"required,omitempty"`
	// Determines the location of the parameter.
	In string `protobuf:"bytes,2,opt,name=in" json:"in,omitempty"`
	// A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.
	Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"`
	// The name of the parameter.
	Name             string           `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"`
	Type             string           `protobuf:"bytes,5,opt,name=type" json:"type,omitempty"`
	Format           string           `protobuf:"bytes,6,opt,name=format" json:"format,omitempty"`
	Items            *PrimitivesItems `protobuf:"bytes,7,opt,name=items" json:"items,omitempty"`
	CollectionFormat string           `protobuf:"bytes,8,opt,name=collection_format,json=collectionFormat" json:"collection_format,omitempty"`
	Default          *Any             `protobuf:"bytes,9,opt,name=default" json:"default,omitempty"`
	Maximum          float64          `protobuf:"fixed64,10,opt,name=maximum" json:"maximum,omitempty"`
	ExclusiveMaximum bool             `protobuf:"varint,11,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"`
	Minimum          float64          `protobuf:"fixed64,12,opt,name=minimum" json:"minimum,omitempty"`
	ExclusiveMinimum bool             `protobuf:"varint,13,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"`
	MaxLength        int64            `protobuf:"varint,14,opt,name=max_length,json=maxLength" json:"max_length,omitempty"`
	MinLength        int64            `protobuf:"varint,15,opt,name=min_length,json=minLength" json:"min_length,omitempty"`
	Pattern          string           `protobuf:"bytes,16,opt,name=pattern" json:"pattern,omitempty"`
	MaxItems         int64            `protobuf:"varint,17,opt,name=max_items,json=maxItems" json:"max_items,omitempty"`
	MinItems         int64            `protobuf:"varint,18,opt,name=min_items,json=minItems" json:"min_items,omitempty"`
	UniqueItems      bool             `protobuf:"varint,19,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"`
	Enum             []*Any           `protobuf:"bytes,20,rep,name=enum" json:"enum,omitempty"`
	MultipleOf       float64          `protobuf:"fixed64,21,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"`
	VendorExtension  []*NamedAny      `protobuf:"bytes,22,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *PathParameterSubSchema) Reset()                    { *m = PathParameterSubSchema{} }
func (m *PathParameterSubSchema) String() string            { return proto.CompactTextString(m) }
func (*PathParameterSubSchema) ProtoMessage()               {}
func (*PathParameterSubSchema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} }

func (m *PathParameterSubSchema) GetRequired() bool {
	if m != nil {
		return m.Required
	}
	return false
}

func (m *PathParameterSubSchema) GetIn() string {
	if m != nil {
		return m.In
	}
	return ""
}

func (m *PathParameterSubSchema) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *PathParameterSubSchema) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *PathParameterSubSchema) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *PathParameterSubSchema) GetFormat() string {
	if m != nil {
		return m.Format
	}
	return ""
}

func (m *PathParameterSubSchema) GetItems() *PrimitivesItems {
	if m != nil {
		return m.Items
	}
	return nil
}

func (m *PathParameterSubSchema) GetCollectionFormat() string {
	if m != nil {
		return m.CollectionFormat
	}
	return ""
}

func (m *PathParameterSubSchema) GetDefault() *Any {
	if m != nil {
		return m.Default
	}
	return nil
}

func (m *PathParameterSubSchema) GetMaximum() float64 {
	if m != nil {
		return m.Maximum
	}
	return 0
}

func (m *PathParameterSubSchema) GetExclusiveMaximum() bool {
	if m != nil {
		return m.ExclusiveMaximum
	}
	return false
}

func (m *PathParameterSubSchema) GetMinimum() float64 {
	if m != nil {
		return m.Minimum
	}
	return 0
}

func (m *PathParameterSubSchema) GetExclusiveMinimum() bool {
	if m != nil {
		return m.ExclusiveMinimum
	}
	return false
}

func (m *PathParameterSubSchema) GetMaxLength() int64 {
	if m != nil {
		return m.MaxLength
	}
	return 0
}

func (m *PathParameterSubSchema) GetMinLength() int64 {
	if m != nil {
		return m.MinLength
	}
	return 0
}

func (m *PathParameterSubSchema) GetPattern() string {
	if m != nil {
		return m.Pattern
	}
	return ""
}

func (m *PathParameterSubSchema) GetMaxItems() int64 {
	if m != nil {
		return m.MaxItems
	}
	return 0
}

func (m *PathParameterSubSchema) GetMinItems() int64 {
	if m != nil {
		return m.MinItems
	}
	return 0
}

func (m *PathParameterSubSchema) GetUniqueItems() bool {
	if m != nil {
		return m.UniqueItems
	}
	return false
}

func (m *PathParameterSubSchema) GetEnum() []*Any {
	if m != nil {
		return m.Enum
	}
	return nil
}

func (m *PathParameterSubSchema) GetMultipleOf() float64 {
	if m != nil {
		return m.MultipleOf
	}
	return 0
}

func (m *PathParameterSubSchema) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

// Relative paths to the individual endpoints. They must be relative to the 'basePath'.
type Paths struct {
	VendorExtension []*NamedAny      `protobuf:"bytes,1,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
	Path            []*NamedPathItem `protobuf:"bytes,2,rep,name=path" json:"path,omitempty"`
}

func (m *Paths) Reset()                    { *m = Paths{} }
func (m *Paths) String() string            { return proto.CompactTextString(m) }
func (*Paths) ProtoMessage()               {}
func (*Paths) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} }

func (m *Paths) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

func (m *Paths) GetPath() []*NamedPathItem {
	if m != nil {
		return m.Path
	}
	return nil
}

type PrimitivesItems struct {
	Type             string           `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"`
	Format           string           `protobuf:"bytes,2,opt,name=format" json:"format,omitempty"`
	Items            *PrimitivesItems `protobuf:"bytes,3,opt,name=items" json:"items,omitempty"`
	CollectionFormat string           `protobuf:"bytes,4,opt,name=collection_format,json=collectionFormat" json:"collection_format,omitempty"`
	Default          *Any             `protobuf:"bytes,5,opt,name=default" json:"default,omitempty"`
	Maximum          float64          `protobuf:"fixed64,6,opt,name=maximum" json:"maximum,omitempty"`
	ExclusiveMaximum bool             `protobuf:"varint,7,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"`
	Minimum          float64          `protobuf:"fixed64,8,opt,name=minimum" json:"minimum,omitempty"`
	ExclusiveMinimum bool             `protobuf:"varint,9,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"`
	MaxLength        int64            `protobuf:"varint,10,opt,name=max_length,json=maxLength" json:"max_length,omitempty"`
	MinLength        int64            `protobuf:"varint,11,opt,name=min_length,json=minLength" json:"min_length,omitempty"`
	Pattern          string           `protobuf:"bytes,12,opt,name=pattern" json:"pattern,omitempty"`
	MaxItems         int64            `protobuf:"varint,13,opt,name=max_items,json=maxItems" json:"max_items,omitempty"`
	MinItems         int64            `protobuf:"varint,14,opt,name=min_items,json=minItems" json:"min_items,omitempty"`
	UniqueItems      bool             `protobuf:"varint,15,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"`
	Enum             []*Any           `protobuf:"bytes,16,rep,name=enum" json:"enum,omitempty"`
	MultipleOf       float64          `protobuf:"fixed64,17,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"`
	VendorExtension  []*NamedAny      `protobuf:"bytes,18,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *PrimitivesItems) Reset()                    { *m = PrimitivesItems{} }
func (m *PrimitivesItems) String() string            { return proto.CompactTextString(m) }
func (*PrimitivesItems) ProtoMessage()               {}
func (*PrimitivesItems) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} }

func (m *PrimitivesItems) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *PrimitivesItems) GetFormat() string {
	if m != nil {
		return m.Format
	}
	return ""
}

func (m *PrimitivesItems) GetItems() *PrimitivesItems {
	if m != nil {
		return m.Items
	}
	return nil
}

func (m *PrimitivesItems) GetCollectionFormat() string {
	if m != nil {
		return m.CollectionFormat
	}
	return ""
}

func (m *PrimitivesItems) GetDefault() *Any {
	if m != nil {
		return m.Default
	}
	return nil
}

func (m *PrimitivesItems) GetMaximum() float64 {
	if m != nil {
		return m.Maximum
	}
	return 0
}

func (m *PrimitivesItems) GetExclusiveMaximum() bool {
	if m != nil {
		return m.ExclusiveMaximum
	}
	return false
}

func (m *PrimitivesItems) GetMinimum() float64 {
	if m != nil {
		return m.Minimum
	}
	return 0
}

func (m *PrimitivesItems) GetExclusiveMinimum() bool {
	if m != nil {
		return m.ExclusiveMinimum
	}
	return false
}

func (m *PrimitivesItems) GetMaxLength() int64 {
	if m != nil {
		return m.MaxLength
	}
	return 0
}

func (m *PrimitivesItems) GetMinLength() int64 {
	if m != nil {
		return m.MinLength
	}
	return 0
}

func (m *PrimitivesItems) GetPattern() string {
	if m != nil {
		return m.Pattern
	}
	return ""
}

func (m *PrimitivesItems) GetMaxItems() int64 {
	if m != nil {
		return m.MaxItems
	}
	return 0
}

func (m *PrimitivesItems) GetMinItems() int64 {
	if m != nil {
		return m.MinItems
	}
	return 0
}

func (m *PrimitivesItems) GetUniqueItems() bool {
	if m != nil {
		return m.UniqueItems
	}
	return false
}

func (m *PrimitivesItems) GetEnum() []*Any {
	if m != nil {
		return m.Enum
	}
	return nil
}

func (m *PrimitivesItems) GetMultipleOf() float64 {
	if m != nil {
		return m.MultipleOf
	}
	return 0
}

func (m *PrimitivesItems) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Properties struct {
	AdditionalProperties []*NamedSchema `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"`
}

func (m *Properties) Reset()                    { *m = Properties{} }
func (m *Properties) String() string            { return proto.CompactTextString(m) }
func (*Properties) ProtoMessage()               {}
func (*Properties) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} }

func (m *Properties) GetAdditionalProperties() []*NamedSchema {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

type QueryParameterSubSchema struct {
	// Determines whether or not this parameter is required or optional.
	Required bool `protobuf:"varint,1,opt,name=required" json:"required,omitempty"`
	// Determines the location of the parameter.
	In string `protobuf:"bytes,2,opt,name=in" json:"in,omitempty"`
	// A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.
	Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"`
	// The name of the parameter.
	Name string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"`
	// allows sending a parameter by name only or with an empty value.
	AllowEmptyValue  bool             `protobuf:"varint,5,opt,name=allow_empty_value,json=allowEmptyValue" json:"allow_empty_value,omitempty"`
	Type             string           `protobuf:"bytes,6,opt,name=type" json:"type,omitempty"`
	Format           string           `protobuf:"bytes,7,opt,name=format" json:"format,omitempty"`
	Items            *PrimitivesItems `protobuf:"bytes,8,opt,name=items" json:"items,omitempty"`
	CollectionFormat string           `protobuf:"bytes,9,opt,name=collection_format,json=collectionFormat" json:"collection_format,omitempty"`
	Default          *Any             `protobuf:"bytes,10,opt,name=default" json:"default,omitempty"`
	Maximum          float64          `protobuf:"fixed64,11,opt,name=maximum" json:"maximum,omitempty"`
	ExclusiveMaximum bool             `protobuf:"varint,12,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"`
	Minimum          float64          `protobuf:"fixed64,13,opt,name=minimum" json:"minimum,omitempty"`
	ExclusiveMinimum bool             `protobuf:"varint,14,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"`
	MaxLength        int64            `protobuf:"varint,15,opt,name=max_length,json=maxLength" json:"max_length,omitempty"`
	MinLength        int64            `protobuf:"varint,16,opt,name=min_length,json=minLength" json:"min_length,omitempty"`
	Pattern          string           `protobuf:"bytes,17,opt,name=pattern" json:"pattern,omitempty"`
	MaxItems         int64            `protobuf:"varint,18,opt,name=max_items,json=maxItems" json:"max_items,omitempty"`
	MinItems         int64            `protobuf:"varint,19,opt,name=min_items,json=minItems" json:"min_items,omitempty"`
	UniqueItems      bool             `protobuf:"varint,20,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"`
	Enum             []*Any           `protobuf:"bytes,21,rep,name=enum" json:"enum,omitempty"`
	MultipleOf       float64          `protobuf:"fixed64,22,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"`
	VendorExtension  []*NamedAny      `protobuf:"bytes,23,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *QueryParameterSubSchema) Reset()                    { *m = QueryParameterSubSchema{} }
func (m *QueryParameterSubSchema) String() string            { return proto.CompactTextString(m) }
func (*QueryParameterSubSchema) ProtoMessage()               {}
func (*QueryParameterSubSchema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} }

func (m *QueryParameterSubSchema) GetRequired() bool {
	if m != nil {
		return m.Required
	}
	return false
}

func (m *QueryParameterSubSchema) GetIn() string {
	if m != nil {
		return m.In
	}
	return ""
}

func (m *QueryParameterSubSchema) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *QueryParameterSubSchema) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *QueryParameterSubSchema) GetAllowEmptyValue() bool {
	if m != nil {
		return m.AllowEmptyValue
	}
	return false
}

func (m *QueryParameterSubSchema) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *QueryParameterSubSchema) GetFormat() string {
	if m != nil {
		return m.Format
	}
	return ""
}

func (m *QueryParameterSubSchema) GetItems() *PrimitivesItems {
	if m != nil {
		return m.Items
	}
	return nil
}

func (m *QueryParameterSubSchema) GetCollectionFormat() string {
	if m != nil {
		return m.CollectionFormat
	}
	return ""
}

func (m *QueryParameterSubSchema) GetDefault() *Any {
	if m != nil {
		return m.Default
	}
	return nil
}

func (m *QueryParameterSubSchema) GetMaximum() float64 {
	if m != nil {
		return m.Maximum
	}
	return 0
}

func (m *QueryParameterSubSchema) GetExclusiveMaximum() bool {
	if m != nil {
		return m.ExclusiveMaximum
	}
	return false
}

func (m *QueryParameterSubSchema) GetMinimum() float64 {
	if m != nil {
		return m.Minimum
	}
	return 0
}

func (m *QueryParameterSubSchema) GetExclusiveMinimum() bool {
	if m != nil {
		return m.ExclusiveMinimum
	}
	return false
}

func (m *QueryParameterSubSchema) GetMaxLength() int64 {
	if m != nil {
		return m.MaxLength
	}
	return 0
}

func (m *QueryParameterSubSchema) GetMinLength() int64 {
	if m != nil {
		return m.MinLength
	}
	return 0
}

func (m *QueryParameterSubSchema) GetPattern() string {
	if m != nil {
		return m.Pattern
	}
	return ""
}

func (m *QueryParameterSubSchema) GetMaxItems() int64 {
	if m != nil {
		return m.MaxItems
	}
	return 0
}

func (m *QueryParameterSubSchema) GetMinItems() int64 {
	if m != nil {
		return m.MinItems
	}
	return 0
}

func (m *QueryParameterSubSchema) GetUniqueItems() bool {
	if m != nil {
		return m.UniqueItems
	}
	return false
}

func (m *QueryParameterSubSchema) GetEnum() []*Any {
	if m != nil {
		return m.Enum
	}
	return nil
}

func (m *QueryParameterSubSchema) GetMultipleOf() float64 {
	if m != nil {
		return m.MultipleOf
	}
	return 0
}

func (m *QueryParameterSubSchema) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Response struct {
	Description     string      `protobuf:"bytes,1,opt,name=description" json:"description,omitempty"`
	Schema          *SchemaItem `protobuf:"bytes,2,opt,name=schema" json:"schema,omitempty"`
	Headers         *Headers    `protobuf:"bytes,3,opt,name=headers" json:"headers,omitempty"`
	Examples        *Examples   `protobuf:"bytes,4,opt,name=examples" json:"examples,omitempty"`
	VendorExtension []*NamedAny `protobuf:"bytes,5,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *Response) Reset()                    { *m = Response{} }
func (m *Response) String() string            { return proto.CompactTextString(m) }
func (*Response) ProtoMessage()               {}
func (*Response) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} }

func (m *Response) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Response) GetSchema() *SchemaItem {
	if m != nil {
		return m.Schema
	}
	return nil
}

func (m *Response) GetHeaders() *Headers {
	if m != nil {
		return m.Headers
	}
	return nil
}

func (m *Response) GetExamples() *Examples {
	if m != nil {
		return m.Examples
	}
	return nil
}

func (m *Response) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

// One or more JSON representations for parameters
type ResponseDefinitions struct {
	AdditionalProperties []*NamedResponse `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"`
}

func (m *ResponseDefinitions) Reset()                    { *m = ResponseDefinitions{} }
func (m *ResponseDefinitions) String() string            { return proto.CompactTextString(m) }
func (*ResponseDefinitions) ProtoMessage()               {}
func (*ResponseDefinitions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} }

func (m *ResponseDefinitions) GetAdditionalProperties() []*NamedResponse {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

type ResponseValue struct {
	// Types that are valid to be assigned to Oneof:
	//	*ResponseValue_Response
	//	*ResponseValue_JsonReference
	Oneof isResponseValue_Oneof `protobuf_oneof:"oneof"`
}

func (m *ResponseValue) Reset()                    { *m = ResponseValue{} }
func (m *ResponseValue) String() string            { return proto.CompactTextString(m) }
func (*ResponseValue) ProtoMessage()               {}
func (*ResponseValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{48} }

type isResponseValue_Oneof interface {
	isResponseValue_Oneof()
}

type ResponseValue_Response struct {
	Response *Response `protobuf:"bytes,1,opt,name=response,oneof"`
}
type ResponseValue_JsonReference struct {
	JsonReference *JsonReference `protobuf:"bytes,2,opt,name=json_reference,json=jsonReference,oneof"`
}

func (*ResponseValue_Response) isResponseValue_Oneof()      {}
func (*ResponseValue_JsonReference) isResponseValue_Oneof() {}

func (m *ResponseValue) GetOneof() isResponseValue_Oneof {
	if m != nil {
		return m.Oneof
	}
	return nil
}

func (m *ResponseValue) GetResponse() *Response {
	if x, ok := m.GetOneof().(*ResponseValue_Response); ok {
		return x.Response
	}
	return nil
}

func (m *ResponseValue) GetJsonReference() *JsonReference {
	if x, ok := m.GetOneof().(*ResponseValue_JsonReference); ok {
		return x.JsonReference
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*ResponseValue) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _ResponseValue_OneofMarshaler, _ResponseValue_OneofUnmarshaler, _ResponseValue_OneofSizer, []interface{}{
		(*ResponseValue_Response)(nil),
		(*ResponseValue_JsonReference)(nil),
	}
}

func _ResponseValue_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*ResponseValue)
	// oneof
	switch x := m.Oneof.(type) {
	case *ResponseValue_Response:
		b.EncodeVarint(1<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Response); err != nil {
			return err
		}
	case *ResponseValue_JsonReference:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.JsonReference); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("ResponseValue.Oneof has unexpected type %T", x)
	}
	return nil
}

func _ResponseValue_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*ResponseValue)
	switch tag {
	case 1: // oneof.response
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Response)
		err := b.DecodeMessage(msg)
		m.Oneof = &ResponseValue_Response{msg}
		return true, err
	case 2: // oneof.json_reference
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(JsonReference)
		err := b.DecodeMessage(msg)
		m.Oneof = &ResponseValue_JsonReference{msg}
		return true, err
	default:
		return false, nil
	}
}

func _ResponseValue_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*ResponseValue)
	// oneof
	switch x := m.Oneof.(type) {
	case *ResponseValue_Response:
		s := proto.Size(x.Response)
		n += proto.SizeVarint(1<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *ResponseValue_JsonReference:
		s := proto.Size(x.JsonReference)
		n += proto.SizeVarint(2<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// Response objects names can either be any valid HTTP status code or 'default'.
type Responses struct {
	ResponseCode    []*NamedResponseValue `protobuf:"bytes,1,rep,name=response_code,json=responseCode" json:"response_code,omitempty"`
	VendorExtension []*NamedAny           `protobuf:"bytes,2,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *Responses) Reset()                    { *m = Responses{} }
func (m *Responses) String() string            { return proto.CompactTextString(m) }
func (*Responses) ProtoMessage()               {}
func (*Responses) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{49} }

func (m *Responses) GetResponseCode() []*NamedResponseValue {
	if m != nil {
		return m.ResponseCode
	}
	return nil
}

func (m *Responses) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

// A deterministic version of a JSON Schema object.
type Schema struct {
	XRef                 string                    `protobuf:"bytes,1,opt,name=_ref,json=Ref" json:"_ref,omitempty"`
	Format               string                    `protobuf:"bytes,2,opt,name=format" json:"format,omitempty"`
	Title                string                    `protobuf:"bytes,3,opt,name=title" json:"title,omitempty"`
	Description          string                    `protobuf:"bytes,4,opt,name=description" json:"description,omitempty"`
	Default              *Any                      `protobuf:"bytes,5,opt,name=default" json:"default,omitempty"`
	MultipleOf           float64                   `protobuf:"fixed64,6,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"`
	Maximum              float64                   `protobuf:"fixed64,7,opt,name=maximum" json:"maximum,omitempty"`
	ExclusiveMaximum     bool                      `protobuf:"varint,8,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"`
	Minimum              float64                   `protobuf:"fixed64,9,opt,name=minimum" json:"minimum,omitempty"`
	ExclusiveMinimum     bool                      `protobuf:"varint,10,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"`
	MaxLength            int64                     `protobuf:"varint,11,opt,name=max_length,json=maxLength" json:"max_length,omitempty"`
	MinLength            int64                     `protobuf:"varint,12,opt,name=min_length,json=minLength" json:"min_length,omitempty"`
	Pattern              string                    `protobuf:"bytes,13,opt,name=pattern" json:"pattern,omitempty"`
	MaxItems             int64                     `protobuf:"varint,14,opt,name=max_items,json=maxItems" json:"max_items,omitempty"`
	MinItems             int64                     `protobuf:"varint,15,opt,name=min_items,json=minItems" json:"min_items,omitempty"`
	UniqueItems          bool                      `protobuf:"varint,16,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"`
	MaxProperties        int64                     `protobuf:"varint,17,opt,name=max_properties,json=maxProperties" json:"max_properties,omitempty"`
	MinProperties        int64                     `protobuf:"varint,18,opt,name=min_properties,json=minProperties" json:"min_properties,omitempty"`
	Required             []string                  `protobuf:"bytes,19,rep,name=required" json:"required,omitempty"`
	Enum                 []*Any                    `protobuf:"bytes,20,rep,name=enum" json:"enum,omitempty"`
	AdditionalProperties *AdditionalPropertiesItem `protobuf:"bytes,21,opt,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"`
	Type                 *TypeItem                 `protobuf:"bytes,22,opt,name=type" json:"type,omitempty"`
	Items                *ItemsItem                `protobuf:"bytes,23,opt,name=items" json:"items,omitempty"`
	AllOf                []*Schema                 `protobuf:"bytes,24,rep,name=all_of,json=allOf" json:"all_of,omitempty"`
	Properties           *Properties               `protobuf:"bytes,25,opt,name=properties" json:"properties,omitempty"`
	Discriminator        string                    `protobuf:"bytes,26,opt,name=discriminator" json:"discriminator,omitempty"`
	ReadOnly             bool                      `protobuf:"varint,27,opt,name=read_only,json=readOnly" json:"read_only,omitempty"`
	Xml                  *Xml                      `protobuf:"bytes,28,opt,name=xml" json:"xml,omitempty"`
	ExternalDocs         *ExternalDocs             `protobuf:"bytes,29,opt,name=external_docs,json=externalDocs" json:"external_docs,omitempty"`
	Example              *Any                      `protobuf:"bytes,30,opt,name=example" json:"example,omitempty"`
	VendorExtension      []*NamedAny               `protobuf:"bytes,31,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *Schema) Reset()                    { *m = Schema{} }
func (m *Schema) String() string            { return proto.CompactTextString(m) }
func (*Schema) ProtoMessage()               {}
func (*Schema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} }

func (m *Schema) GetXRef() string {
	if m != nil {
		return m.XRef
	}
	return ""
}

func (m *Schema) GetFormat() string {
	if m != nil {
		return m.Format
	}
	return ""
}

func (m *Schema) GetTitle() string {
	if m != nil {
		return m.Title
	}
	return ""
}

func (m *Schema) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Schema) GetDefault() *Any {
	if m != nil {
		return m.Default
	}
	return nil
}

func (m *Schema) GetMultipleOf() float64 {
	if m != nil {
		return m.MultipleOf
	}
	return 0
}

func (m *Schema) GetMaximum() float64 {
	if m != nil {
		return m.Maximum
	}
	return 0
}

func (m *Schema) GetExclusiveMaximum() bool {
	if m != nil {
		return m.ExclusiveMaximum
	}
	return false
}

func (m *Schema) GetMinimum() float64 {
	if m != nil {
		return m.Minimum
	}
	return 0
}

func (m *Schema) GetExclusiveMinimum() bool {
	if m != nil {
		return m.ExclusiveMinimum
	}
	return false
}

func (m *Schema) GetMaxLength() int64 {
	if m != nil {
		return m.MaxLength
	}
	return 0
}

func (m *Schema) GetMinLength() int64 {
	if m != nil {
		return m.MinLength
	}
	return 0
}

func (m *Schema) GetPattern() string {
	if m != nil {
		return m.Pattern
	}
	return ""
}

func (m *Schema) GetMaxItems() int64 {
	if m != nil {
		return m.MaxItems
	}
	return 0
}

func (m *Schema) GetMinItems() int64 {
	if m != nil {
		return m.MinItems
	}
	return 0
}

func (m *Schema) GetUniqueItems() bool {
	if m != nil {
		return m.UniqueItems
	}
	return false
}

func (m *Schema) GetMaxProperties() int64 {
	if m != nil {
		return m.MaxProperties
	}
	return 0
}

func (m *Schema) GetMinProperties() int64 {
	if m != nil {
		return m.MinProperties
	}
	return 0
}

func (m *Schema) GetRequired() []string {
	if m != nil {
		return m.Required
	}
	return nil
}

func (m *Schema) GetEnum() []*Any {
	if m != nil {
		return m.Enum
	}
	return nil
}

func (m *Schema) GetAdditionalProperties() *AdditionalPropertiesItem {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

func (m *Schema) GetType() *TypeItem {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *Schema) GetItems() *ItemsItem {
	if m != nil {
		return m.Items
	}
	return nil
}

func (m *Schema) GetAllOf() []*Schema {
	if m != nil {
		return m.AllOf
	}
	return nil
}

func (m *Schema) GetProperties() *Properties {
	if m != nil {
		return m.Properties
	}
	return nil
}

func (m *Schema) GetDiscriminator() string {
	if m != nil {
		return m.Discriminator
	}
	return ""
}

func (m *Schema) GetReadOnly() bool {
	if m != nil {
		return m.ReadOnly
	}
	return false
}

func (m *Schema) GetXml() *Xml {
	if m != nil {
		return m.Xml
	}
	return nil
}

func (m *Schema) GetExternalDocs() *ExternalDocs {
	if m != nil {
		return m.ExternalDocs
	}
	return nil
}

func (m *Schema) GetExample() *Any {
	if m != nil {
		return m.Example
	}
	return nil
}

func (m *Schema) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type SchemaItem struct {
	// Types that are valid to be assigned to Oneof:
	//	*SchemaItem_Schema
	//	*SchemaItem_FileSchema
	Oneof isSchemaItem_Oneof `protobuf_oneof:"oneof"`
}

func (m *SchemaItem) Reset()                    { *m = SchemaItem{} }
func (m *SchemaItem) String() string            { return proto.CompactTextString(m) }
func (*SchemaItem) ProtoMessage()               {}
func (*SchemaItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{51} }

type isSchemaItem_Oneof interface {
	isSchemaItem_Oneof()
}

type SchemaItem_Schema struct {
	Schema *Schema `protobuf:"bytes,1,opt,name=schema,oneof"`
}
type SchemaItem_FileSchema struct {
	FileSchema *FileSchema `protobuf:"bytes,2,opt,name=file_schema,json=fileSchema,oneof"`
}

func (*SchemaItem_Schema) isSchemaItem_Oneof()     {}
func (*SchemaItem_FileSchema) isSchemaItem_Oneof() {}

func (m *SchemaItem) GetOneof() isSchemaItem_Oneof {
	if m != nil {
		return m.Oneof
	}
	return nil
}

func (m *SchemaItem) GetSchema() *Schema {
	if x, ok := m.GetOneof().(*SchemaItem_Schema); ok {
		return x.Schema
	}
	return nil
}

func (m *SchemaItem) GetFileSchema() *FileSchema {
	if x, ok := m.GetOneof().(*SchemaItem_FileSchema); ok {
		return x.FileSchema
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*SchemaItem) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _SchemaItem_OneofMarshaler, _SchemaItem_OneofUnmarshaler, _SchemaItem_OneofSizer, []interface{}{
		(*SchemaItem_Schema)(nil),
		(*SchemaItem_FileSchema)(nil),
	}
}

func _SchemaItem_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*SchemaItem)
	// oneof
	switch x := m.Oneof.(type) {
	case *SchemaItem_Schema:
		b.EncodeVarint(1<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Schema); err != nil {
			return err
		}
	case *SchemaItem_FileSchema:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.FileSchema); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("SchemaItem.Oneof has unexpected type %T", x)
	}
	return nil
}

func _SchemaItem_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*SchemaItem)
	switch tag {
	case 1: // oneof.schema
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Schema)
		err := b.DecodeMessage(msg)
		m.Oneof = &SchemaItem_Schema{msg}
		return true, err
	case 2: // oneof.file_schema
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(FileSchema)
		err := b.DecodeMessage(msg)
		m.Oneof = &SchemaItem_FileSchema{msg}
		return true, err
	default:
		return false, nil
	}
}

func _SchemaItem_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*SchemaItem)
	// oneof
	switch x := m.Oneof.(type) {
	case *SchemaItem_Schema:
		s := proto.Size(x.Schema)
		n += proto.SizeVarint(1<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *SchemaItem_FileSchema:
		s := proto.Size(x.FileSchema)
		n += proto.SizeVarint(2<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

type SecurityDefinitions struct {
	AdditionalProperties []*NamedSecurityDefinitionsItem `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"`
}

func (m *SecurityDefinitions) Reset()                    { *m = SecurityDefinitions{} }
func (m *SecurityDefinitions) String() string            { return proto.CompactTextString(m) }
func (*SecurityDefinitions) ProtoMessage()               {}
func (*SecurityDefinitions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{52} }

func (m *SecurityDefinitions) GetAdditionalProperties() []*NamedSecurityDefinitionsItem {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

type SecurityDefinitionsItem struct {
	// Types that are valid to be assigned to Oneof:
	//	*SecurityDefinitionsItem_BasicAuthenticationSecurity
	//	*SecurityDefinitionsItem_ApiKeySecurity
	//	*SecurityDefinitionsItem_Oauth2ImplicitSecurity
	//	*SecurityDefinitionsItem_Oauth2PasswordSecurity
	//	*SecurityDefinitionsItem_Oauth2ApplicationSecurity
	//	*SecurityDefinitionsItem_Oauth2AccessCodeSecurity
	Oneof isSecurityDefinitionsItem_Oneof `protobuf_oneof:"oneof"`
}

func (m *SecurityDefinitionsItem) Reset()                    { *m = SecurityDefinitionsItem{} }
func (m *SecurityDefinitionsItem) String() string            { return proto.CompactTextString(m) }
func (*SecurityDefinitionsItem) ProtoMessage()               {}
func (*SecurityDefinitionsItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{53} }

type isSecurityDefinitionsItem_Oneof interface {
	isSecurityDefinitionsItem_Oneof()
}

type SecurityDefinitionsItem_BasicAuthenticationSecurity struct {
	BasicAuthenticationSecurity *BasicAuthenticationSecurity `protobuf:"bytes,1,opt,name=basic_authentication_security,json=basicAuthenticationSecurity,oneof"`
}
type SecurityDefinitionsItem_ApiKeySecurity struct {
	ApiKeySecurity *ApiKeySecurity `protobuf:"bytes,2,opt,name=api_key_security,json=apiKeySecurity,oneof"`
}
type SecurityDefinitionsItem_Oauth2ImplicitSecurity struct {
	Oauth2ImplicitSecurity *Oauth2ImplicitSecurity `protobuf:"bytes,3,opt,name=oauth2_implicit_security,json=oauth2ImplicitSecurity,oneof"`
}
type SecurityDefinitionsItem_Oauth2PasswordSecurity struct {
	Oauth2PasswordSecurity *Oauth2PasswordSecurity `protobuf:"bytes,4,opt,name=oauth2_password_security,json=oauth2PasswordSecurity,oneof"`
}
type SecurityDefinitionsItem_Oauth2ApplicationSecurity struct {
	Oauth2ApplicationSecurity *Oauth2ApplicationSecurity `protobuf:"bytes,5,opt,name=oauth2_application_security,json=oauth2ApplicationSecurity,oneof"`
}
type SecurityDefinitionsItem_Oauth2AccessCodeSecurity struct {
	Oauth2AccessCodeSecurity *Oauth2AccessCodeSecurity `protobuf:"bytes,6,opt,name=oauth2_access_code_security,json=oauth2AccessCodeSecurity,oneof"`
}

func (*SecurityDefinitionsItem_BasicAuthenticationSecurity) isSecurityDefinitionsItem_Oneof() {}
func (*SecurityDefinitionsItem_ApiKeySecurity) isSecurityDefinitionsItem_Oneof()              {}
func (*SecurityDefinitionsItem_Oauth2ImplicitSecurity) isSecurityDefinitionsItem_Oneof()      {}
func (*SecurityDefinitionsItem_Oauth2PasswordSecurity) isSecurityDefinitionsItem_Oneof()      {}
func (*SecurityDefinitionsItem_Oauth2ApplicationSecurity) isSecurityDefinitionsItem_Oneof()   {}
func (*SecurityDefinitionsItem_Oauth2AccessCodeSecurity) isSecurityDefinitionsItem_Oneof()    {}

func (m *SecurityDefinitionsItem) GetOneof() isSecurityDefinitionsItem_Oneof {
	if m != nil {
		return m.Oneof
	}
	return nil
}

func (m *SecurityDefinitionsItem) GetBasicAuthenticationSecurity() *BasicAuthenticationSecurity {
	if x, ok := m.GetOneof().(*SecurityDefinitionsItem_BasicAuthenticationSecurity); ok {
		return x.BasicAuthenticationSecurity
	}
	return nil
}

func (m *SecurityDefinitionsItem) GetApiKeySecurity() *ApiKeySecurity {
	if x, ok := m.GetOneof().(*SecurityDefinitionsItem_ApiKeySecurity); ok {
		return x.ApiKeySecurity
	}
	return nil
}

func (m *SecurityDefinitionsItem) GetOauth2ImplicitSecurity() *Oauth2ImplicitSecurity {
	if x, ok := m.GetOneof().(*SecurityDefinitionsItem_Oauth2ImplicitSecurity); ok {
		return x.Oauth2ImplicitSecurity
	}
	return nil
}

func (m *SecurityDefinitionsItem) GetOauth2PasswordSecurity() *Oauth2PasswordSecurity {
	if x, ok := m.GetOneof().(*SecurityDefinitionsItem_Oauth2PasswordSecurity); ok {
		return x.Oauth2PasswordSecurity
	}
	return nil
}

func (m *SecurityDefinitionsItem) GetOauth2ApplicationSecurity() *Oauth2ApplicationSecurity {
	if x, ok := m.GetOneof().(*SecurityDefinitionsItem_Oauth2ApplicationSecurity); ok {
		return x.Oauth2ApplicationSecurity
	}
	return nil
}

func (m *SecurityDefinitionsItem) GetOauth2AccessCodeSecurity() *Oauth2AccessCodeSecurity {
	if x, ok := m.GetOneof().(*SecurityDefinitionsItem_Oauth2AccessCodeSecurity); ok {
		return x.Oauth2AccessCodeSecurity
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*SecurityDefinitionsItem) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _SecurityDefinitionsItem_OneofMarshaler, _SecurityDefinitionsItem_OneofUnmarshaler, _SecurityDefinitionsItem_OneofSizer, []interface{}{
		(*SecurityDefinitionsItem_BasicAuthenticationSecurity)(nil),
		(*SecurityDefinitionsItem_ApiKeySecurity)(nil),
		(*SecurityDefinitionsItem_Oauth2ImplicitSecurity)(nil),
		(*SecurityDefinitionsItem_Oauth2PasswordSecurity)(nil),
		(*SecurityDefinitionsItem_Oauth2ApplicationSecurity)(nil),
		(*SecurityDefinitionsItem_Oauth2AccessCodeSecurity)(nil),
	}
}

func _SecurityDefinitionsItem_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*SecurityDefinitionsItem)
	// oneof
	switch x := m.Oneof.(type) {
	case *SecurityDefinitionsItem_BasicAuthenticationSecurity:
		b.EncodeVarint(1<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.BasicAuthenticationSecurity); err != nil {
			return err
		}
	case *SecurityDefinitionsItem_ApiKeySecurity:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.ApiKeySecurity); err != nil {
			return err
		}
	case *SecurityDefinitionsItem_Oauth2ImplicitSecurity:
		b.EncodeVarint(3<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Oauth2ImplicitSecurity); err != nil {
			return err
		}
	case *SecurityDefinitionsItem_Oauth2PasswordSecurity:
		b.EncodeVarint(4<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Oauth2PasswordSecurity); err != nil {
			return err
		}
	case *SecurityDefinitionsItem_Oauth2ApplicationSecurity:
		b.EncodeVarint(5<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Oauth2ApplicationSecurity); err != nil {
			return err
		}
	case *SecurityDefinitionsItem_Oauth2AccessCodeSecurity:
		b.EncodeVarint(6<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Oauth2AccessCodeSecurity); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("SecurityDefinitionsItem.Oneof has unexpected type %T", x)
	}
	return nil
}

func _SecurityDefinitionsItem_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*SecurityDefinitionsItem)
	switch tag {
	case 1: // oneof.basic_authentication_security
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(BasicAuthenticationSecurity)
		err := b.DecodeMessage(msg)
		m.Oneof = &SecurityDefinitionsItem_BasicAuthenticationSecurity{msg}
		return true, err
	case 2: // oneof.api_key_security
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(ApiKeySecurity)
		err := b.DecodeMessage(msg)
		m.Oneof = &SecurityDefinitionsItem_ApiKeySecurity{msg}
		return true, err
	case 3: // oneof.oauth2_implicit_security
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Oauth2ImplicitSecurity)
		err := b.DecodeMessage(msg)
		m.Oneof = &SecurityDefinitionsItem_Oauth2ImplicitSecurity{msg}
		return true, err
	case 4: // oneof.oauth2_password_security
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Oauth2PasswordSecurity)
		err := b.DecodeMessage(msg)
		m.Oneof = &SecurityDefinitionsItem_Oauth2PasswordSecurity{msg}
		return true, err
	case 5: // oneof.oauth2_application_security
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Oauth2ApplicationSecurity)
		err := b.DecodeMessage(msg)
		m.Oneof = &SecurityDefinitionsItem_Oauth2ApplicationSecurity{msg}
		return true, err
	case 6: // oneof.oauth2_access_code_security
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Oauth2AccessCodeSecurity)
		err := b.DecodeMessage(msg)
		m.Oneof = &SecurityDefinitionsItem_Oauth2AccessCodeSecurity{msg}
		return true, err
	default:
		return false, nil
	}
}

func _SecurityDefinitionsItem_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*SecurityDefinitionsItem)
	// oneof
	switch x := m.Oneof.(type) {
	case *SecurityDefinitionsItem_BasicAuthenticationSecurity:
		s := proto.Size(x.BasicAuthenticationSecurity)
		n += proto.SizeVarint(1<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *SecurityDefinitionsItem_ApiKeySecurity:
		s := proto.Size(x.ApiKeySecurity)
		n += proto.SizeVarint(2<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *SecurityDefinitionsItem_Oauth2ImplicitSecurity:
		s := proto.Size(x.Oauth2ImplicitSecurity)
		n += proto.SizeVarint(3<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *SecurityDefinitionsItem_Oauth2PasswordSecurity:
		s := proto.Size(x.Oauth2PasswordSecurity)
		n += proto.SizeVarint(4<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *SecurityDefinitionsItem_Oauth2ApplicationSecurity:
		s := proto.Size(x.Oauth2ApplicationSecurity)
		n += proto.SizeVarint(5<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *SecurityDefinitionsItem_Oauth2AccessCodeSecurity:
		s := proto.Size(x.Oauth2AccessCodeSecurity)
		n += proto.SizeVarint(6<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

type SecurityRequirement struct {
	AdditionalProperties []*NamedStringArray `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"`
}

func (m *SecurityRequirement) Reset()                    { *m = SecurityRequirement{} }
func (m *SecurityRequirement) String() string            { return proto.CompactTextString(m) }
func (*SecurityRequirement) ProtoMessage()               {}
func (*SecurityRequirement) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{54} }

func (m *SecurityRequirement) GetAdditionalProperties() []*NamedStringArray {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

type StringArray struct {
	Value []string `protobuf:"bytes,1,rep,name=value" json:"value,omitempty"`
}

func (m *StringArray) Reset()                    { *m = StringArray{} }
func (m *StringArray) String() string            { return proto.CompactTextString(m) }
func (*StringArray) ProtoMessage()               {}
func (*StringArray) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{55} }

func (m *StringArray) GetValue() []string {
	if m != nil {
		return m.Value
	}
	return nil
}

type Tag struct {
	Name            string        `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	Description     string        `protobuf:"bytes,2,opt,name=description" json:"description,omitempty"`
	ExternalDocs    *ExternalDocs `protobuf:"bytes,3,opt,name=external_docs,json=externalDocs" json:"external_docs,omitempty"`
	VendorExtension []*NamedAny   `protobuf:"bytes,4,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *Tag) Reset()                    { *m = Tag{} }
func (m *Tag) String() string            { return proto.CompactTextString(m) }
func (*Tag) ProtoMessage()               {}
func (*Tag) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{56} }

func (m *Tag) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Tag) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Tag) GetExternalDocs() *ExternalDocs {
	if m != nil {
		return m.ExternalDocs
	}
	return nil
}

func (m *Tag) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type TypeItem struct {
	Value []string `protobuf:"bytes,1,rep,name=value" json:"value,omitempty"`
}

func (m *TypeItem) Reset()                    { *m = TypeItem{} }
func (m *TypeItem) String() string            { return proto.CompactTextString(m) }
func (*TypeItem) ProtoMessage()               {}
func (*TypeItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{57} }

func (m *TypeItem) GetValue() []string {
	if m != nil {
		return m.Value
	}
	return nil
}

// Any property starting with x- is valid.
type VendorExtension struct {
	AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"`
}

func (m *VendorExtension) Reset()                    { *m = VendorExtension{} }
func (m *VendorExtension) String() string            { return proto.CompactTextString(m) }
func (*VendorExtension) ProtoMessage()               {}
func (*VendorExtension) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{58} }

func (m *VendorExtension) GetAdditionalProperties() []*NamedAny {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

type Xml struct {
	Name            string      `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	Namespace       string      `protobuf:"bytes,2,opt,name=namespace" json:"namespace,omitempty"`
	Prefix          string      `protobuf:"bytes,3,opt,name=prefix" json:"prefix,omitempty"`
	Attribute       bool        `protobuf:"varint,4,opt,name=attribute" json:"attribute,omitempty"`
	Wrapped         bool        `protobuf:"varint,5,opt,name=wrapped" json:"wrapped,omitempty"`
	VendorExtension []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"`
}

func (m *Xml) Reset()                    { *m = Xml{} }
func (m *Xml) String() string            { return proto.CompactTextString(m) }
func (*Xml) ProtoMessage()               {}
func (*Xml) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} }

func (m *Xml) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Xml) GetNamespace() string {
	if m != nil {
		return m.Namespace
	}
	return ""
}

func (m *Xml) GetPrefix() string {
	if m != nil {
		return m.Prefix
	}
	return ""
}

func (m *Xml) GetAttribute() bool {
	if m != nil {
		return m.Attribute
	}
	return false
}

func (m *Xml) GetWrapped() bool {
	if m != nil {
		return m.Wrapped
	}
	return false
}

func (m *Xml) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

func init() {
	proto.RegisterType((*AdditionalPropertiesItem)(nil), "openapi.v2.AdditionalPropertiesItem")
	proto.RegisterType((*Any)(nil), "openapi.v2.Any")
	proto.RegisterType((*ApiKeySecurity)(nil), "openapi.v2.ApiKeySecurity")
	proto.RegisterType((*BasicAuthenticationSecurity)(nil), "openapi.v2.BasicAuthenticationSecurity")
	proto.RegisterType((*BodyParameter)(nil), "openapi.v2.BodyParameter")
	proto.RegisterType((*Contact)(nil), "openapi.v2.Contact")
	proto.RegisterType((*Default)(nil), "openapi.v2.Default")
	proto.RegisterType((*Definitions)(nil), "openapi.v2.Definitions")
	proto.RegisterType((*Document)(nil), "openapi.v2.Document")
	proto.RegisterType((*Examples)(nil), "openapi.v2.Examples")
	proto.RegisterType((*ExternalDocs)(nil), "openapi.v2.ExternalDocs")
	proto.RegisterType((*FileSchema)(nil), "openapi.v2.FileSchema")
	proto.RegisterType((*FormDataParameterSubSchema)(nil), "openapi.v2.FormDataParameterSubSchema")
	proto.RegisterType((*Header)(nil), "openapi.v2.Header")
	proto.RegisterType((*HeaderParameterSubSchema)(nil), "openapi.v2.HeaderParameterSubSchema")
	proto.RegisterType((*Headers)(nil), "openapi.v2.Headers")
	proto.RegisterType((*Info)(nil), "openapi.v2.Info")
	proto.RegisterType((*ItemsItem)(nil), "openapi.v2.ItemsItem")
	proto.RegisterType((*JsonReference)(nil), "openapi.v2.JsonReference")
	proto.RegisterType((*License)(nil), "openapi.v2.License")
	proto.RegisterType((*NamedAny)(nil), "openapi.v2.NamedAny")
	proto.RegisterType((*NamedHeader)(nil), "openapi.v2.NamedHeader")
	proto.RegisterType((*NamedParameter)(nil), "openapi.v2.NamedParameter")
	proto.RegisterType((*NamedPathItem)(nil), "openapi.v2.NamedPathItem")
	proto.RegisterType((*NamedResponse)(nil), "openapi.v2.NamedResponse")
	proto.RegisterType((*NamedResponseValue)(nil), "openapi.v2.NamedResponseValue")
	proto.RegisterType((*NamedSchema)(nil), "openapi.v2.NamedSchema")
	proto.RegisterType((*NamedSecurityDefinitionsItem)(nil), "openapi.v2.NamedSecurityDefinitionsItem")
	proto.RegisterType((*NamedString)(nil), "openapi.v2.NamedString")
	proto.RegisterType((*NamedStringArray)(nil), "openapi.v2.NamedStringArray")
	proto.RegisterType((*NonBodyParameter)(nil), "openapi.v2.NonBodyParameter")
	proto.RegisterType((*Oauth2AccessCodeSecurity)(nil), "openapi.v2.Oauth2AccessCodeSecurity")
	proto.RegisterType((*Oauth2ApplicationSecurity)(nil), "openapi.v2.Oauth2ApplicationSecurity")
	proto.RegisterType((*Oauth2ImplicitSecurity)(nil), "openapi.v2.Oauth2ImplicitSecurity")
	proto.RegisterType((*Oauth2PasswordSecurity)(nil), "openapi.v2.Oauth2PasswordSecurity")
	proto.RegisterType((*Oauth2Scopes)(nil), "openapi.v2.Oauth2Scopes")
	proto.RegisterType((*Operation)(nil), "openapi.v2.Operation")
	proto.RegisterType((*Parameter)(nil), "openapi.v2.Parameter")
	proto.RegisterType((*ParameterDefinitions)(nil), "openapi.v2.ParameterDefinitions")
	proto.RegisterType((*ParametersItem)(nil), "openapi.v2.ParametersItem")
	proto.RegisterType((*PathItem)(nil), "openapi.v2.PathItem")
	proto.RegisterType((*PathParameterSubSchema)(nil), "openapi.v2.PathParameterSubSchema")
	proto.RegisterType((*Paths)(nil), "openapi.v2.Paths")
	proto.RegisterType((*PrimitivesItems)(nil), "openapi.v2.PrimitivesItems")
	proto.RegisterType((*Properties)(nil), "openapi.v2.Properties")
	proto.RegisterType((*QueryParameterSubSchema)(nil), "openapi.v2.QueryParameterSubSchema")
	proto.RegisterType((*Response)(nil), "openapi.v2.Response")
	proto.RegisterType((*ResponseDefinitions)(nil), "openapi.v2.ResponseDefinitions")
	proto.RegisterType((*ResponseValue)(nil), "openapi.v2.ResponseValue")
	proto.RegisterType((*Responses)(nil), "openapi.v2.Responses")
	proto.RegisterType((*Schema)(nil), "openapi.v2.Schema")
	proto.RegisterType((*SchemaItem)(nil), "openapi.v2.SchemaItem")
	proto.RegisterType((*SecurityDefinitions)(nil), "openapi.v2.SecurityDefinitions")
	proto.RegisterType((*SecurityDefinitionsItem)(nil), "openapi.v2.SecurityDefinitionsItem")
	proto.RegisterType((*SecurityRequirement)(nil), "openapi.v2.SecurityRequirement")
	proto.RegisterType((*StringArray)(nil), "openapi.v2.StringArray")
	proto.RegisterType((*Tag)(nil), "openapi.v2.Tag")
	proto.RegisterType((*TypeItem)(nil), "openapi.v2.TypeItem")
	proto.RegisterType((*VendorExtension)(nil), "openapi.v2.VendorExtension")
	proto.RegisterType((*Xml)(nil), "openapi.v2.Xml")
}

func init() { proto.RegisterFile("OpenAPIv2/OpenAPIv2.proto", fileDescriptor0) }

var fileDescriptor0 = []byte{
	// 3129 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3b, 0x4b, 0x73, 0x1c, 0x57,
	0xd5, 0xf3, 0x7e, 0x1c, 0x69, 0x46, 0xa3, 0x96, 0x2c, 0xb7, 0x24, 0xc7, 0x71, 0xe4, 0x3c, 0x6c,
	0xe7, 0xb3, 0x9c, 0x4f, 0x29, 0x48, 0x05, 0x2a, 0x05, 0xf2, 0xab, 0xc6, 0xc4, 0x44, 0x4a, 0xcb,
	0x0e, 0x09, 0x04, 0xba, 0xae, 0x66, 0xee, 0x48, 0x9d, 0x74, 0xf7, 0x6d, 0x77, 0xf7, 0xc8, 0x1a,
	0x16, 0x2c, 0xa0, 0x8a, 0x35, 0x50, 0x59, 0x53, 0x15, 0x16, 0x14, 0x55, 0x59, 0xb0, 0x62, 0xc5,
	0x1f, 0x60, 0xc7, 0x3f, 0x60, 0x0d, 0x5b, 0xaa, 0x58, 0x51, 0x3c, 0xea, 0xbe, 0xfa, 0x31, 0x7d,
	0x7b, 0x1e, 0x96, 0x0b, 0x28, 0xd0, 0x6a, 0xe6, 0xde, 0x73, 0xee, 0xb9, 0xa7, 0x4f, 0x9f, 0xd7,
	0x3d, 0xe7, 0x36, 0xac, 0xef, 0x79, 0xd8, 0xdd, 0xdd, 0x7f, 0x70, 0xb2, 0x73, 0x2b, 0xfa, 0xb7,
	0xed, 0xf9, 0x24, 0x24, 0x1a, 0x10, 0x0f, 0xbb, 0xc8, 0xb3, 0xb6, 0x4f, 0x76, 0x36, 0xd6, 0x8f,
	0x08, 0x39, 0xb2, 0xf1, 0x2d, 0x06, 0x39, 0x1c, 0x0e, 0x6e, 0x21, 0x77, 0xc4, 0xd1, 0xb6, 0x1c,
	0xd0, 0x77, 0xfb, 0x7d, 0x2b, 0xb4, 0x88, 0x8b, 0xec, 0x7d, 0x9f, 0x78, 0xd8, 0x0f, 0x2d, 0x1c,
	0x3c, 0x08, 0xb1, 0xa3, 0xfd, 0x1f, 0xd4, 0x82, 0xde, 0x31, 0x76, 0x90, 0x5e, 0xbc, 0x52, 0xbc,
	0xb6, 0xb0, 0xa3, 0x6d, 0xc7, 0x34, 0xb7, 0x0f, 0x18, 0xa4, 0x5b, 0x30, 0x04, 0x8e, 0xb6, 0x01,
	0xf5, 0x43, 0x42, 0x6c, 0x8c, 0x5c, 0xbd, 0x74, 0xa5, 0x78, 0xad, 0xd1, 0x2d, 0x18, 0x72, 0xe2,
	0x76, 0x1d, 0xaa, 0xc4, 0xc5, 0x64, 0xb0, 0x75, 0x0f, 0xca, 0xbb, 0xee, 0x48, 0xbb, 0x01, 0xd5,
	0x13, 0x64, 0x0f, 0xb1, 0x20, 0xbc, 0xba, 0xcd, 0x19, 0xdc, 0x96, 0x0c, 0x6e, 0xef, 0xba, 0x23,
	0x83, 0xa3, 0x68, 0x1a, 0x54, 0x46, 0xc8, 0xb1, 0x19, 0xd1, 0xa6, 0xc1, 0xfe, 0x6f, 0x7d, 0x51,
	0x84, 0xf6, 0xae, 0x67, 0xbd, 0x8b, 0x47, 0x07, 0xb8, 0x37, 0xf4, 0xad, 0x70, 0x44, 0xd1, 0xc2,
	0x91, 0xc7, 0x29, 0x36, 0x0d, 0xf6, 0x9f, 0xce, 0xb9, 0xc8, 0xc1, 0x72, 0x29, 0xfd, 0xaf, 0xb5,
	0xa1, 0x64, 0xb9, 0x7a, 0x99, 0xcd, 0x94, 0x2c, 0x57, 0xbb, 0x02, 0x0b, 0x7d, 0x1c, 0xf4, 0x7c,
	0xcb, 0xa3, 0x32, 0xd0, 0x2b, 0x0c, 0x90, 0x9c, 0xd2, 0xbe, 0x06, 0x9d, 0x13, 0xec, 0xf6, 0x89,
	0x6f, 0xe2, 0xd3, 0x10, 0xbb, 0x01, 0x45, 0xab, 0x5e, 0x29, 0x33, 0xbe, 0x13, 0x02, 0x79, 0x0f,
	0x39, 0xb8, 0x4f, 0xf9, 0x5e, 0xe2, 0xd8, 0xf7, 0x24, 0xf2, 0xd6, 0x67, 0x45, 0xd8, 0xbc, 0x8d,
	0x02, 0xab, 0xb7, 0x3b, 0x0c, 0x8f, 0xb1, 0x1b, 0x5a, 0x3d, 0x44, 0x09, 0x4f, 0x64, 0x7d, 0x8c,
	0xad, 0xd2, 0x6c, 0x6c, 0x95, 0xe7, 0x61, 0xeb, 0x0f, 0x45, 0x68, 0xdd, 0x26, 0xfd, 0xd1, 0x3e,
	0xf2, 0x91, 0x83, 0x43, 0xec, 0x8f, 0x6f, 0x5a, 0xcc, 0x6e, 0x3a, 0x8b, 0x44, 0x37, 0xa0, 0xe1,
	0xe3, 0x27, 0x43, 0xcb, 0xc7, 0x7d, 0x26, 0xce, 0x86, 0x11, 0x8d, 0xb5, 0x1b, 0x91, 0x4a, 0x55,
	0xf3, 0x54, 0x2a, 0x52, 0x28, 0xd5, 0x03, 0xd6, 0xe6, 0x79, 0xc0, 0x1f, 0x17, 0xa1, 0x7e, 0x87,
	0xb8, 0x21, 0xea, 0x85, 0x11, 0xe3, 0xc5, 0x04, 0xe3, 0x1d, 0x28, 0x0f, 0x7d, 0xa9, 0x58, 0xf4,
	0xaf, 0xb6, 0x0a, 0x55, 0xec, 0x20, 0xcb, 0x16, 0x4f, 0xc3, 0x07, 0x4a, 0x46, 0x2a, 0xf3, 0x30,
	0xf2, 0x08, 0xea, 0x77, 0xf1, 0x00, 0x0d, 0xed, 0x50, 0x7b, 0x00, 0x17, 0x50, 0x64, 0x6f, 0xa6,
	0x17, 0x19, 0x9c, 0x5e, 0x9c, 0x40, 0x70, 0x15, 0x29, 0x4c, 0x74, 0xeb, 0x3b, 0xb0, 0x70, 0x17,
	0x0f, 0x2c, 0x97, 0x41, 0x02, 0xed, 0xe1, 0x64, 0xca, 0x17, 0x33, 0x94, 0x85, 0xb8, 0xd5, 0xc4,
	0xff, 0x58, 0x85, 0xc6, 0x5d, 0xd2, 0x1b, 0x3a, 0xd8, 0x0d, 0x35, 0x1d, 0xea, 0xc1, 0x53, 0x74,
	0x74, 0x84, 0x7d, 0x21, 0x3f, 0x39, 0xd4, 0x5e, 0x86, 0x8a, 0xe5, 0x0e, 0x08, 0x93, 0xe1, 0xc2,
	0x4e, 0x27, 0xb9, 0xc7, 0x03, 0x77, 0x40, 0x0c, 0x06, 0xa5, 0xc2, 0x3f, 0x26, 0x41, 0x28, 0xa4,
	0xca, 0xfe, 0x6b, 0x9b, 0xd0, 0x3c, 0x44, 0x01, 0x36, 0x3d, 0x14, 0x1e, 0x0b, 0xab, 0x6b, 0xd0,
	0x89, 0x7d, 0x14, 0x1e, 0xb3, 0x0d, 0x29, 0x77, 0x38, 0x60, 0x96, 0x46, 0x37, 0xe4, 0x43, 0xaa,
	0x5c, 0x3d, 0xe2, 0x06, 0x43, 0x0a, 0xaa, 0x31, 0x50, 0x34, 0xa6, 0x30, 0xcf, 0x27, 0xfd, 0x61,
	0x0f, 0x07, 0x7a, 0x9d, 0xc3, 0xe4, 0x58, 0x7b, 0x0d, 0xaa, 0x74, 0xa7, 0x40, 0x6f, 0x30, 0x4e,
	0x97, 0x93, 0x9c, 0xd2, 0x2d, 0x03, 0x83, 0xc3, 0xb5, 0xb7, 0xa9, 0x0d, 0x44, 0x52, 0xd5, 0x9b,
	0x0c, 0x3d, 0x25, 0xbc, 0x84, 0xd0, 0x8d, 0x24, 0xae, 0xf6, 0x75, 0x00, 0x4f, 0xda, 0x52, 0xa0,
	0x03, 0x5b, 0x79, 0x25, 0xbd, 0x91, 0x80, 0x26, 0x49, 0x24, 0xd6, 0x68, 0xef, 0x40, 0xd3, 0xc7,
	0x81, 0x47, 0xdc, 0x00, 0x07, 0xfa, 0x02, 0x23, 0xf0, 0x62, 0x92, 0x80, 0x21, 0x80, 0xc9, 0xf5,
	0xf1, 0x0a, 0xed, 0xab, 0xd0, 0x08, 0x84, 0x53, 0xd1, 0x17, 0xd9, 0x5b, 0x4f, 0xad, 0x96, 0x0e,
	0xc7, 0xe0, 0xd6, 0x48, 0x5f, 0xad, 0x11, 0x2d, 0xd0, 0x0c, 0x58, 0x95, 0xff, 0xcd, 0xa4, 0x04,
	0x5a, 0x59, 0x36, 0x24, 0xa1, 0x24, 0x1b, 0x2b, 0x41, 0x76, 0x52, 0xbb, 0x0a, 0x95, 0x10, 0x1d,
	0x05, 0x7a, 0x9b, 0x31, 0xb3, 0x94, 0xa4, 0xf1, 0x08, 0x1d, 0x19, 0x0c, 0xa8, 0xbd, 0x03, 0x2d,
	0x6a, 0x57, 0x3e, 0x55, 0xdb, 0x3e, 0xe9, 0x05, 0xfa, 0x12, 0xdb, 0x51, 0x4f, 0x62, 0xdf, 0x13,
	0x08, 0x77, 0x49, 0x2f, 0x30, 0x16, 0x71, 0x62, 0xa4, 0xb4, 0xce, 0xce, 0x3c, 0xd6, 0xf9, 0x18,
	0x1a, 0xf7, 0x4e, 0x91, 0xe3, 0xd9, 0x38, 0x78, 0x9e, 0xe6, 0xf9, 0xa3, 0x22, 0x2c, 0x26, 0xd9,
	0x9e, 0xc1, 0xbb, 0x66, 0x1d, 0xd2, 0x99, 0x9d, 0xfc, 0x3f, 0x4a, 0x00, 0xf7, 0x2d, 0x1b, 0x73,
	0x63, 0xd7, 0xd6, 0xa0, 0x36, 0x20, 0xbe, 0x83, 0x42, 0xb1, 0xbd, 0x18, 0x51, 0xc7, 0x17, 0x5a,
	0xa1, 0x2d, 0x1d, 0x3b, 0x1f, 0x8c, 0x73, 0x5c, 0xce, 0x72, 0x7c, 0x1d, 0xea, 0x7d, 0xee, 0xd9,
	0x98, 0x0d, 0x8f, 0xbd, 0x63, 0xca, 0x91, 0x84, 0xa7, 0xc2, 0x02, 0x37, 0xea, 0x38, 0x2c, 0xc8,
	0x08, 0x58, 0x4b, 0x44, 0xc0, 0x4d, 0x6a, 0x0b, 0xa8, 0x6f, 0x12, 0xd7, 0x1e, 0xe9, 0x75, 0x19,
	0x47, 0x50, 0x7f, 0xcf, 0xb5, 0x47, 0x59, 0x9d, 0x69, 0xcc, 0xa5, 0x33, 0xd7, 0xa1, 0x8e, 0xf9,
	0x2b, 0x17, 0x06, 0x9e, 0x65, 0x5b, 0xc0, 0x95, 0x6f, 0x00, 0xe6, 0x79, 0x03, 0x5f, 0xd4, 0x60,
	0xe3, 0x3e, 0xf1, 0x9d, 0xbb, 0x28, 0x44, 0x91, 0x03, 0x38, 0x18, 0x1e, 0x1e, 0xc8, 0xb4, 0x29,
	0x16, 0x4b, 0x71, 0x2c, 0x5a, 0xf2, 0xc8, 0x5a, 0xca, 0xcb, 0x55, 0xca, 0xf9, 0xf1, 0xb9, 0x92,
	0x08, 0x73, 0x37, 0x60, 0x19, 0xd9, 0x36, 0x79, 0x6a, 0x62, 0xc7, 0x0b, 0x47, 0x26, 0x4f, 0xbc,
	0xaa, 0x6c, 0xab, 0x25, 0x06, 0xb8, 0x47, 0xe7, 0x3f, 0x90, 0xc9, 0x56, 0xe6, 0x45, 0xc4, 0x3a,
	0x53, 0x4f, 0xe9, 0xcc, 0xff, 0x43, 0xd5, 0x0a, 0xb1, 0x23, 0x65, 0xbf, 0x99, 0xf2, 0x74, 0xbe,
	0xe5, 0x58, 0xa1, 0x75, 0xc2, 0x33, 0xc9, 0xc0, 0xe0, 0x98, 0xda, 0xeb, 0xb0, 0xdc, 0x23, 0xb6,
	0x8d, 0x7b, 0x94, 0x59, 0x53, 0x50, 0x6d, 0x32, 0xaa, 0x9d, 0x18, 0x70, 0x9f, 0xd3, 0x4f, 0xe8,
	0x16, 0x4c, 0xd1, 0x2d, 0x1d, 0xea, 0x0e, 0x3a, 0xb5, 0x9c, 0xa1, 0xc3, 0xbc, 0x66, 0xd1, 0x90,
	0x43, 0xba, 0x23, 0x3e, 0xed, 0xd9, 0xc3, 0xc0, 0x3a, 0xc1, 0xa6, 0xc4, 0x59, 0x64, 0x0f, 0xdf,
	0x89, 0x00, 0xdf, 0x14, 0xc8, 0x94, 0x8c, 0xe5, 0x32, 0x94, 0x96, 0x20, 0xc3, 0x87, 0x63, 0x64,
	0x04, 0x4e, 0x7b, 0x9c, 0x8c, 0x40, 0x7e, 0x01, 0xc0, 0x41, 0xa7, 0xa6, 0x8d, 0xdd, 0xa3, 0xf0,
	0x98, 0x79, 0xb3, 0xb2, 0xd1, 0x74, 0xd0, 0xe9, 0x43, 0x36, 0xc1, 0xc0, 0x96, 0x2b, 0xc1, 0x1d,
	0x01, 0xb6, 0x5c, 0x01, 0xd6, 0xa1, 0xee, 0xa1, 0x90, 0x2a, 0xab, 0xbe, 0xcc, 0x83, 0xad, 0x18,
	0x52, 0x8b, 0xa0, 0x74, 0xb9, 0xd0, 0x35, 0xb6, 0xae, 0xe1, 0xa0, 0x53, 0x26, 0x61, 0x06, 0xb4,
	0x5c, 0x01, 0x5c, 0x11, 0x40, 0xcb, 0xe5, 0xc0, 0x97, 0x60, 0x71, 0xe8, 0x5a, 0x4f, 0x86, 0x58,
	0xc0, 0x57, 0x19, 0xe7, 0x0b, 0x7c, 0x8e, 0xa3, 0x5c, 0x85, 0x0a, 0x76, 0x87, 0x8e, 0x7e, 0x21,
	0xeb, 0xaa, 0xa9, 0xa8, 0x19, 0x50, 0x7b, 0x11, 0x16, 0x9c, 0xa1, 0x1d, 0x5a, 0x9e, 0x8d, 0x4d,
	0x32, 0xd0, 0xd7, 0x98, 0x90, 0x40, 0x4e, 0xed, 0x0d, 0x94, 0xd6, 0x72, 0x71, 0x2e, 0x6b, 0xa9,
	0x42, 0xad, 0x8b, 0x51, 0x1f, 0xfb, 0xca, 0xb4, 0x38, 0xd6, 0xc5, 0x92, 0x5a, 0x17, 0xcb, 0x67,
	0xd3, 0xc5, 0xca, 0x74, 0x5d, 0xac, 0xce, 0xae, 0x8b, 0xb5, 0x19, 0x74, 0xb1, 0x3e, 0x5d, 0x17,
	0x1b, 0x33, 0xe8, 0x62, 0x73, 0x26, 0x5d, 0x84, 0xc9, 0xba, 0xb8, 0x30, 0x41, 0x17, 0x17, 0x27,
	0xe8, 0x62, 0x6b, 0x92, 0x2e, 0xb6, 0xa7, 0xe8, 0xe2, 0x52, 0xbe, 0x2e, 0x76, 0xe6, 0xd0, 0xc5,
	0xe5, 0x8c, 0x2e, 0x8e, 0x79, 0x4b, 0x6d, 0xb6, 0x23, 0xd4, 0xca, 0x3c, 0xda, 0xfa, 0xb7, 0x2a,
	0xe8, 0x5c, 0x5b, 0xff, 0x2d, 0x9e, 0x5d, 0x5a, 0x48, 0x55, 0x69, 0x21, 0x35, 0xb5, 0x85, 0xd4,
	0xcf, 0x66, 0x21, 0x8d, 0xe9, 0x16, 0xd2, 0x9c, 0xdd, 0x42, 0x60, 0x06, 0x0b, 0x59, 0x98, 0x6e,
	0x21, 0x8b, 0x33, 0x58, 0x48, 0x6b, 0x26, 0x0b, 0x69, 0x4f, 0xb6, 0x90, 0xa5, 0x09, 0x16, 0xd2,
	0x99, 0x60, 0x21, 0xcb, 0x93, 0x2c, 0x44, 0x9b, 0x62, 0x21, 0x2b, 0xf9, 0x16, 0xb2, 0x3a, 0x87,
	0x85, 0x5c, 0x98, 0xc9, 0x5b, 0xaf, 0xcd, 0xa3, 0xff, 0xdf, 0x82, 0x3a, 0x57, 0xff, 0x67, 0x38,
	0x7e, 0xf2, 0x85, 0x39, 0xc9, 0xf3, 0xe7, 0x25, 0xa8, 0xd0, 0x03, 0x64, 0x9c, 0x98, 0x16, 0x93,
	0x89, 0xa9, 0x0e, 0xf5, 0x13, 0xec, 0x07, 0x71, 0x65, 0x44, 0x0e, 0x67, 0x30, 0xa4, 0x6b, 0xd0,
	0x09, 0xb1, 0xef, 0x04, 0x26, 0x19, 0x98, 0x01, 0xf6, 0x4f, 0xac, 0x9e, 0x34, 0xaa, 0x36, 0x9b,
	0xdf, 0x1b, 0x1c, 0xf0, 0x59, 0xed, 0x26, 0xd4, 0x7b, 0xbc, 0x7c, 0x20, 0x9c, 0xfe, 0x4a, 0xf2,
	0x21, 0x44, 0x65, 0xc1, 0x90, 0x38, 0x14, 0xdd, 0xb6, 0x7a, 0xd8, 0x0d, 0x78, 0xfa, 0x34, 0x86,
	0xfe, 0x90, 0x83, 0x0c, 0x89, 0xa3, 0x14, 0x7e, 0x7d, 0x1e, 0xe1, 0xbf, 0x05, 0x4d, 0xa6, 0x0c,
	0xac, 0x56, 0x77, 0x23, 0x51, 0xab, 0x2b, 0x4f, 0x2e, 0xac, 0x6c, 0xdd, 0x85, 0xd6, 0x37, 0x02,
	0xe2, 0x1a, 0x78, 0x80, 0x7d, 0xec, 0xf6, 0xb0, 0xb6, 0x0c, 0x15, 0xd3, 0xc7, 0x03, 0x21, 0xe3,
	0xb2, 0x81, 0x07, 0xd3, 0xeb, 0x4f, 0x5b, 0x1e, 0xd4, 0xc5, 0x33, 0xcd, 0x58, 0x5c, 0x39, 0xf3,
	0x59, 0xe6, 0x1e, 0x34, 0x24, 0x50, 0xb9, 0xe5, 0x2b, 0xb2, 0xaa, 0x58, 0x52, 0x3b, 0x20, 0x0e,
	0xdd, 0x7a, 0x17, 0x16, 0x12, 0x0a, 0xa8, 0xa4, 0x74, 0x2d, 0x4d, 0x29, 0x25, 0x4c, 0xa1, 0xb7,
	0x82, 0xd8, 0xfb, 0xd0, 0x66, 0xc4, 0xe2, 0x22, 0x9a, 0x8a, 0xde, 0xeb, 0x69, 0x7a, 0x17, 0x94,
	0x45, 0x01, 0x49, 0x72, 0x0f, 0x5a, 0x82, 0x64, 0x78, 0xcc, 0xde, 0xad, 0x8a, 0xe2, 0x8d, 0x34,
	0xc5, 0xd5, 0xf1, 0x7a, 0x06, 0x5d, 0x38, 0x4e, 0x50, 0x56, 0x0f, 0xe6, 0x26, 0x28, 0x17, 0x4a,
	0x82, 0x1f, 0x81, 0x96, 0x22, 0x18, 0x9d, 0x1d, 0x32, 0x54, 0x6f, 0xa5, 0xa9, 0xae, 0xab, 0xa8,
	0xb2, 0xd5, 0xe3, 0x2f, 0x47, 0xc4, 0xd0, 0x79, 0x5f, 0x8e, 0xd0, 0x74, 0x41, 0xcc, 0x81, 0x4b,
	0x9c, 0x58, 0xb6, 0x34, 0x91, 0x2b, 0xd8, 0xb7, 0xd3, 0xd4, 0xaf, 0x4e, 0xa9, 0x7b, 0x24, 0xe5,
	0xfc, 0x96, 0xe4, 0x3d, 0xf4, 0x2d, 0xf7, 0x48, 0x49, 0x7d, 0x35, 0x49, 0xbd, 0x29, 0x17, 0x3e,
	0x86, 0x4e, 0x62, 0xe1, 0xae, 0xef, 0x23, 0xb5, 0x82, 0xdf, 0x4c, 0xf3, 0x96, 0xf2, 0xa9, 0x89,
	0xb5, 0x92, 0xec, 0x6f, 0xca, 0xd0, 0x79, 0x8f, 0xb8, 0xe9, 0x1a, 0x2f, 0x86, 0xcd, 0x63, 0xa6,
	0xc1, 0x66, 0x54, 0x77, 0x32, 0x83, 0xe1, 0xa1, 0x99, 0xaa, 0xf4, 0xbf, 0x9c, 0x55, 0xf8, 0x6c,
	0x82, 0xd3, 0x2d, 0x18, 0xfa, 0x71, 0x5e, 0xf2, 0x63, 0xc3, 0x65, 0x9a, 0x30, 0x98, 0x7d, 0x14,
	0x22, 0xf5, 0x4e, 0xfc, 0x19, 0x5e, 0x4d, 0xee, 0x94, 0x7f, 0x4c, 0xee, 0x16, 0x8c, 0x8d, 0x41,
	0xfe, 0x21, 0xfa, 0x10, 0x36, 0x9e, 0x0c, 0xb1, 0x3f, 0x52, 0xef, 0x54, 0xce, 0xbe, 0xc9, 0xf7,
	0x29, 0xb6, 0x72, 0x9b, 0x8b, 0x4f, 0xd4, 0x20, 0xcd, 0x84, 0x75, 0x0f, 0x85, 0xc7, 0xea, 0x2d,
	0x78, 0xf1, 0x63, 0x6b, 0xdc, 0x0a, 0x95, 0x3b, 0xac, 0x79, 0x4a, 0x48, 0xdc, 0x24, 0xf9, 0xbc,
	0x04, 0xfa, 0x1e, 0x1a, 0x86, 0xc7, 0x3b, 0xbb, 0xbd, 0x1e, 0x0e, 0x82, 0x3b, 0xa4, 0x8f, 0xa7,
	0xf5, 0x39, 0x06, 0x36, 0x79, 0x2a, 0xab, 0xf2, 0xf4, 0xbf, 0xf6, 0x06, 0x0d, 0x08, 0xc4, 0xc3,
	0xf2, 0x48, 0x94, 0x2a, 0x8d, 0x70, 0xea, 0x07, 0x0c, 0x6e, 0x08, 0x3c, 0x9a, 0x35, 0xd1, 0x69,
	0xe2, 0x5b, 0xdf, 0x67, 0xfd, 0x09, 0x93, 0xfa, 0x6f, 0x71, 0x20, 0x4a, 0x01, 0x1e, 0xfb, 0x36,
	0x4d, 0x60, 0x42, 0xf2, 0x29, 0xe6, 0x48, 0x3c, 0xff, 0x6c, 0xb0, 0x09, 0x0a, 0x1c, 0x0b, 0x1e,
	0xb5, 0xd9, 0x32, 0xef, 0xb9, 0x82, 0xdf, 0x5f, 0x8a, 0xb0, 0x2e, 0x64, 0xe4, 0x79, 0xf6, 0x2c,
	0x1d, 0x95, 0xe7, 0x23, 0xa4, 0xd4, 0x73, 0x57, 0x26, 0x3f, 0x77, 0x75, 0xb6, 0xe7, 0x9e, 0xab,
	0xa7, 0xf1, 0xc3, 0x12, 0xac, 0x71, 0xc6, 0x1e, 0x38, 0xf4, 0xb9, 0xad, 0xf0, 0x3f, 0x4d, 0x33,
	0xfe, 0x05, 0x42, 0xf8, 0x73, 0x51, 0x0a, 0x61, 0x1f, 0x05, 0xc1, 0x53, 0xe2, 0xf7, 0xff, 0x07,
	0xde, 0xfc, 0xc7, 0xb0, 0x98, 0xe4, 0xeb, 0x19, 0xfa, 0x3d, 0x2c, 0x42, 0xe4, 0x24, 0xdc, 0x3f,
	0xaf, 0x40, 0x73, 0xcf, 0xc3, 0x3e, 0x92, 0x87, 0x4d, 0x56, 0xb7, 0x2f, 0xb2, 0x3a, 0x2d, 0x2f,
	0xd3, 0xeb, 0x50, 0x0f, 0x86, 0x8e, 0x83, 0xfc, 0x91, 0xcc, 0xb9, 0xc5, 0x70, 0x86, 0x9c, 0x3b,
	0x53, 0xae, 0xad, 0xcc, 0x55, 0xae, 0x7d, 0x09, 0x16, 0x89, 0xe4, 0xcd, 0xb4, 0xfa, 0x52, 0xbc,
	0xd1, 0xdc, 0x83, 0x7e, 0xaa, 0xf7, 0x53, 0x1b, 0xeb, 0xfd, 0x24, 0x7b, 0x46, 0xf5, 0xb1, 0x9e,
	0xd1, 0x57, 0x52, 0x3d, 0x9b, 0x06, 0x13, 0xdd, 0x86, 0x32, 0x3d, 0xe3, 0xa1, 0x3e, 0xd9, 0xad,
	0x79, 0x33, 0xd9, 0xad, 0x69, 0x66, 0x33, 0x3b, 0x99, 0xe0, 0xa4, 0x7a, 0x34, 0x89, 0xd6, 0x16,
	0xa4, 0x5b, 0x5b, 0x97, 0x01, 0xfa, 0xd8, 0xf3, 0x71, 0x0f, 0x85, 0xb8, 0x2f, 0x4e, 0xbd, 0x89,
	0x99, 0xb3, 0x75, 0x77, 0x54, 0xea, 0xd7, 0x9a, 0x47, 0xfd, 0x7e, 0x59, 0x84, 0x66, 0x9c, 0x45,
	0xdc, 0x86, 0xf6, 0x21, 0xe9, 0x27, 0xe2, 0xad, 0x48, 0x1c, 0x52, 0x09, 0x5e, 0x2a, 0xf1, 0xe8,
	0x16, 0x8c, 0xd6, 0x61, 0x2a, 0x13, 0x79, 0x08, 0x9a, 0x4b, 0x5c, 0x73, 0x8c, 0x0e, 0x4f, 0x0b,
	0x2e, 0xa5, 0x98, 0x1a, 0xcb, 0x61, 0xba, 0x05, 0xa3, 0xe3, 0x8e, 0xcd, 0xc5, 0xd1, 0xf3, 0x08,
	0x56, 0x55, 0x7d, 0x36, 0x6d, 0x6f, 0xb2, 0xbd, 0x6c, 0x64, 0xc4, 0x10, 0x27, 0xe6, 0x6a, 0x93,
	0xf9, 0xac, 0x08, 0xed, 0xb4, 0x76, 0x68, 0x5f, 0x82, 0xe6, 0xb8, 0x44, 0xd4, 0xb9, 0x7e, 0xb7,
	0x60, 0xc4, 0x98, 0x54, 0x9a, 0x9f, 0x04, 0xc4, 0xa5, 0x67, 0x30, 0x7e, 0x22, 0x53, 0xa5, 0xcb,
	0xa9, 0x23, 0x1b, 0x95, 0xe6, 0x27, 0xc9, 0x89, 0xf8, 0xf9, 0x7f, 0x5f, 0x86, 0x46, 0x74, 0x74,
	0x50, 0x9c, 0xec, 0x5e, 0x83, 0xf2, 0x11, 0x0e, 0x55, 0x27, 0x91, 0xc8, 0xfe, 0x0d, 0x8a, 0x41,
	0x11, 0xbd, 0x61, 0x28, 0xfc, 0x63, 0x1e, 0xa2, 0x37, 0x0c, 0xb5, 0xeb, 0x50, 0xf1, 0x48, 0x20,
	0x3b, 0x40, 0x39, 0x98, 0x0c, 0x45, 0xbb, 0x09, 0xb5, 0x3e, 0xb6, 0x71, 0x88, 0xc5, 0x89, 0x3a,
	0x07, 0x59, 0x20, 0x69, 0xb7, 0xa0, 0x4e, 0x3c, 0xde, 0x86, 0xac, 0x4d, 0xc2, 0x97, 0x58, 0x94,
	0x15, 0x9a, 0x92, 0x8a, 0x22, 0x57, 0x1e, 0x2b, 0x14, 0x85, 0x9e, 0xc9, 0x3c, 0x14, 0xf6, 0x8e,
	0x45, 0xfb, 0x22, 0x07, 0x97, 0xe3, 0x8c, 0xb9, 0x89, 0xe6, 0x5c, 0x6e, 0xe2, 0xcc, 0x1d, 0xa4,
	0xbf, 0x56, 0x61, 0x4d, 0x9d, 0x4d, 0x9e, 0xd7, 0x18, 0xcf, 0x6b, 0x8c, 0xff, 0xed, 0x35, 0xc6,
	0xa7, 0x50, 0x65, 0x17, 0x34, 0x94, 0x94, 0x8a, 0x73, 0x50, 0xd2, 0x6e, 0x42, 0x85, 0xdd, 0x36,
	0x29, 0xb1, 0x45, 0xeb, 0x0a, 0x87, 0x2f, 0xea, 0x26, 0x0c, 0x6d, 0xeb, 0x67, 0x55, 0x58, 0x1a,
	0xd3, 0xda, 0xf3, 0x9e, 0xd4, 0x79, 0x4f, 0xea, 0x4c, 0x3d, 0x29, 0x95, 0x0e, 0x6b, 0xf3, 0x58,
	0xc3, 0xb7, 0x01, 0xe2, 0x14, 0xe4, 0x39, 0xdf, 0xf9, 0xfa, 0x55, 0x0d, 0x2e, 0xe6, 0x14, 0x46,
	0xce, 0xaf, 0x29, 0x9c, 0x5f, 0x53, 0x38, 0xbf, 0xa6, 0x10, 0x9b, 0xe1, 0xdf, 0x8b, 0xd0, 0x88,
	0xca, 0xe9, 0xd3, 0x2f, 0x76, 0x6d, 0x47, 0xdd, 0x19, 0x9e, 0x76, 0xaf, 0x65, 0x6b, 0xd6, 0x2c,
	0xf0, 0xc8, 0xab, 0xaf, 0x37, 0xa1, 0xce, 0x2b, 0xab, 0x32, 0x78, 0xac, 0x64, 0x0b, 0xb2, 0x81,
	0x21, 0x71, 0xb4, 0x37, 0xa0, 0x21, 0xae, 0x2b, 0xc9, 0x93, 0xf5, 0x6a, 0xfa, 0x64, 0xcd, 0x61,
	0x46, 0x84, 0x75, 0xf6, 0x3b, 0xcd, 0x18, 0x56, 0x14, 0x97, 0x11, 0xb5, 0xf7, 0x26, 0x3b, 0xa4,
	0x6c, 0xcc, 0x8d, 0x5a, 0x0b, 0x6a, 0x97, 0xf4, 0x93, 0x22, 0xb4, 0xd2, 0x5d, 0x86, 0x1d, 0xea,
	0x88, 0xf8, 0x44, 0x74, 0x7b, 0x5c, 0x71, 0xe6, 0xee, 0x16, 0x8c, 0x08, 0xef, 0xf9, 0x9e, 0xaf,
	0x7e, 0x5a, 0x84, 0x66, 0x74, 0xb2, 0xd7, 0xee, 0x40, 0x4b, 0x6e, 0x63, 0xf6, 0x48, 0x1f, 0x8b,
	0x07, 0xbd, 0x9c, 0xfb, 0xa0, 0xbc, 0xdb, 0xb1, 0x28, 0x17, 0xdd, 0x21, 0x7d, 0x75, 0x2b, 0xb0,
	0x34, 0xcf, 0xdb, 0xf8, 0x75, 0x13, 0x6a, 0xc2, 0x51, 0x2b, 0x4e, 0x7c, 0x79, 0x09, 0x4a, 0xd4,
	0x5b, 0x2d, 0x4f, 0xb8, 0xf4, 0x57, 0x99, 0x78, 0xe9, 0x6f, 0x5a, 0xe2, 0x31, 0x66, 0x89, 0xb5,
	0x8c, 0x25, 0x26, 0x5c, 0x62, 0x7d, 0x06, 0x97, 0xd8, 0x98, 0xee, 0x12, 0x9b, 0x33, 0xb8, 0x44,
	0x98, 0xc9, 0x25, 0x2e, 0x4c, 0x76, 0x89, 0x8b, 0x13, 0x5c, 0x62, 0x6b, 0x82, 0x4b, 0x6c, 0x4f,
	0x72, 0x89, 0x4b, 0x53, 0x5c, 0x62, 0x27, 0xeb, 0x12, 0x5f, 0x81, 0x36, 0x25, 0x9e, 0x30, 0x36,
	0x7e, 0x12, 0x68, 0x39, 0xe8, 0x34, 0x91, 0x2b, 0x50, 0x34, 0xcb, 0x4d, 0xa2, 0x69, 0x02, 0xcd,
	0x72, 0x13, 0x68, 0xc9, 0x40, 0xbf, 0x32, 0x76, 0x4d, 0x73, 0xa6, 0x13, 0xc1, 0x47, 0x79, 0x2e,
	0xe0, 0x42, 0xb6, 0xb5, 0x94, 0xf7, 0xe9, 0x89, 0xda, 0x1b, 0x68, 0xd7, 0x44, 0xd8, 0x5f, 0xcb,
	0xda, 0xfd, 0xa3, 0x91, 0x87, 0x79, 0xee, 0xce, 0x92, 0x81, 0xd7, 0x65, 0xd0, 0xbf, 0x98, 0x3d,
	0xdc, 0x47, 0x4d, 0x73, 0x19, 0xee, 0xaf, 0x43, 0x0d, 0xd9, 0x36, 0xd5, 0x4f, 0x3d, 0xb7, 0x77,
	0x5e, 0x45, 0xb6, 0xbd, 0x37, 0xd0, 0xbe, 0x0c, 0x90, 0x78, 0xa2, 0xf5, 0xac, 0x33, 0x8f, 0xb9,
	0x35, 0x12, 0x98, 0xda, 0xcb, 0xd0, 0xea, 0x5b, 0xd4, 0x82, 0x1c, 0xcb, 0x45, 0x21, 0xf1, 0xf5,
	0x0d, 0xa6, 0x20, 0xe9, 0xc9, 0xf4, 0x95, 0xd7, 0xcd, 0xb1, 0x2b, 0xaf, 0x2f, 0x41, 0xf9, 0xd4,
	0xb1, 0xf5, 0x4b, 0x59, 0x8b, 0xfb, 0xd0, 0xb1, 0x0d, 0x0a, 0xcb, 0x96, 0x59, 0x5f, 0x78, 0xd6,
	0x5b, 0xb1, 0x97, 0x9f, 0xe1, 0x56, 0xec, 0x8b, 0xf3, 0x78, 0xac, 0x1f, 0x00, 0xc4, 0x71, 0x6f,
	0xce, 0x2f, 0x8d, 0xde, 0x86, 0x85, 0x81, 0x65, 0x63, 0x33, 0x3f, 0xa4, 0xc6, 0x37, 0x9e, 0xbb,
	0x05, 0x03, 0x06, 0xd1, 0x28, 0xf6, 0xe2, 0x21, 0xac, 0x28, 0xba, 0xb9, 0xda, 0x77, 0x27, 0xc7,
	0xaf, 0x6b, 0xd9, 0x84, 0x3a, 0xa7, 0x25, 0xac, 0x0e, 0x67, 0x7f, 0xaa, 0xc0, 0xc5, 0xbc, 0x66,
	0xb4, 0x03, 0x2f, 0x1c, 0xa2, 0xc0, 0xea, 0x99, 0x28, 0xf5, 0x95, 0x90, 0x19, 0xd5, 0x7c, 0xb9,
	0x68, 0x5e, 0x4b, 0x55, 0x58, 0xf3, 0xbf, 0x2a, 0xea, 0x16, 0x8c, 0xcd, 0xc3, 0x09, 0x1f, 0x1d,
	0xdd, 0x87, 0x0e, 0xf2, 0x2c, 0xf3, 0x53, 0x3c, 0x8a, 0x77, 0xe0, 0x92, 0x4c, 0xd5, 0xb5, 0xd2,
	0x5f, 0x59, 0x75, 0x0b, 0x46, 0x1b, 0xa5, 0xbf, 0xbb, 0xfa, 0x1e, 0xe8, 0x84, 0xb5, 0x25, 0x4c,
	0x4b, 0x34, 0xa4, 0x62, 0x7a, 0xe5, 0x6c, 0x57, 0x54, 0xdd, 0xbb, 0xea, 0x16, 0x8c, 0x35, 0xa2,
	0xee, 0x6a, 0xc5, 0xf4, 0x3d, 0xd1, 0xeb, 0x89, 0xe9, 0x57, 0xf2, 0xe8, 0x8f, 0xb7, 0x85, 0x62,
	0xfa, 0x99, 0x86, 0xd1, 0x11, 0x6c, 0x0a, 0xfa, 0x28, 0x6e, 0x24, 0xc6, 0x5b, 0xf0, 0x00, 0xf7,
	0x4a, 0x76, 0x0b, 0x45, 0xdb, 0xb1, 0x5b, 0x30, 0xd6, 0x49, 0x6e, 0x4f, 0x12, 0xc7, 0x1b, 0xb1,
	0xae, 0x2e, 0x4b, 0x17, 0xe2, 0x8d, 0x6a, 0x59, 0xef, 0x98, 0xd7, 0x03, 0xee, 0x16, 0x0c, 0x21,
	0x93, 0x2c, 0x2c, 0xd6, 0xf0, 0xe3, 0x58, 0xc3, 0x13, 0x2d, 0x01, 0xed, 0xfd, 0xc9, 0x1a, 0x7e,
	0x29, 0xa7, 0x6d, 0xc4, 0x2f, 0x16, 0xa8, 0xb5, 0xfa, 0x2a, 0x2c, 0x24, 0x6f, 0x2e, 0xac, 0xc6,
	0x1f, 0xf7, 0x95, 0xe3, 0x3b, 0x0e, 0xbf, 0x2d, 0x42, 0xf9, 0x11, 0x52, 0xdf, 0x8a, 0x98, 0xfe,
	0xb1, 0x5b, 0xc6, 0xb3, 0x95, 0xcf, 0xfc, 0x8d, 0xc8, 0x5c, 0x5f, 0x70, 0x5d, 0x81, 0x86, 0x8c,
	0x30, 0x39, 0xcf, 0xf7, 0x31, 0x2c, 0x7d, 0x30, 0x56, 0x6f, 0x7a, 0x8e, 0x1f, 0x93, 0xfc, 0xae,
	0x08, 0xe5, 0x0f, 0x1d, 0x5b, 0x29, 0xbd, 0x4b, 0xd0, 0xa4, 0xbf, 0x81, 0x87, 0x7a, 0xf2, 0x5e,
	0x49, 0x3c, 0x41, 0x93, 0x3f, 0xcf, 0xc7, 0x03, 0xeb, 0x54, 0x64, 0x79, 0x62, 0x44, 0x57, 0xa1,
	0x30, 0xf4, 0xad, 0xc3, 0x61, 0x88, 0xc5, 0x67, 0x7a, 0xf1, 0x04, 0x4d, 0x65, 0x9e, 0xfa, 0xc8,
	0xf3, 0x70, 0x5f, 0x1c, 0xc1, 0xe5, 0xf0, 0xcc, 0x7d, 0xcc, 0xdb, 0xaf, 0x42, 0x9b, 0xf8, 0x47,
	0x12, 0xd7, 0x3c, 0xd9, 0xb9, 0xbd, 0x28, 0xbe, 0x5d, 0xdd, 0xf7, 0x49, 0x48, 0xf6, 0x8b, 0xbf,
	0x28, 0x95, 0xf7, 0x76, 0x0f, 0x0e, 0x6b, 0xec, 0x63, 0xd0, 0x37, 0xff, 0x19, 0x00, 0x00, 0xff,
	0xff, 0xd4, 0x0a, 0xef, 0xca, 0xe4, 0x3a, 0x00, 0x00,
}
