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

package graph_serving_go_proto

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	schema_go_proto "kythe.io/kythe/proto/schema_go_proto"
	storage_go_proto "kythe.io/kythe/proto/storage_go_proto"
	math "math"
)

// 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.ProtoPackageIsVersion3 // please upgrade the proto package

type Edges struct {
	Source *storage_go_proto.VName `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"`
	// Types that are valid to be assigned to Entry:
	//	*Edges_Index_
	//	*Edges_Edge_
	//	*Edges_Target_
	Entry                isEdges_Entry `protobuf_oneof:"entry"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

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

func (m *Edges) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Edges.Unmarshal(m, b)
}
func (m *Edges) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Edges.Marshal(b, m, deterministic)
}
func (m *Edges) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Edges.Merge(m, src)
}
func (m *Edges) XXX_Size() int {
	return xxx_messageInfo_Edges.Size(m)
}
func (m *Edges) XXX_DiscardUnknown() {
	xxx_messageInfo_Edges.DiscardUnknown(m)
}

var xxx_messageInfo_Edges proto.InternalMessageInfo

func (m *Edges) GetSource() *storage_go_proto.VName {
	if m != nil {
		return m.Source
	}
	return nil
}

type isEdges_Entry interface {
	isEdges_Entry()
}

type Edges_Index_ struct {
	Index *Edges_Index `protobuf:"bytes,2,opt,name=index,proto3,oneof"`
}

type Edges_Edge_ struct {
	Edge *Edges_Edge `protobuf:"bytes,3,opt,name=edge,proto3,oneof"`
}

type Edges_Target_ struct {
	Target *Edges_Target `protobuf:"bytes,4,opt,name=target,proto3,oneof"`
}

func (*Edges_Index_) isEdges_Entry() {}

func (*Edges_Edge_) isEdges_Entry() {}

func (*Edges_Target_) isEdges_Entry() {}

func (m *Edges) GetEntry() isEdges_Entry {
	if m != nil {
		return m.Entry
	}
	return nil
}

func (m *Edges) GetIndex() *Edges_Index {
	if x, ok := m.GetEntry().(*Edges_Index_); ok {
		return x.Index
	}
	return nil
}

func (m *Edges) GetEdge() *Edges_Edge {
	if x, ok := m.GetEntry().(*Edges_Edge_); ok {
		return x.Edge
	}
	return nil
}

func (m *Edges) GetTarget() *Edges_Target {
	if x, ok := m.GetEntry().(*Edges_Target_); ok {
		return x.Target
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Edges) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Edges_Index_)(nil),
		(*Edges_Edge_)(nil),
		(*Edges_Target_)(nil),
	}
}

type Edges_Index struct {
	Node                 *schema_go_proto.Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

func (m *Edges_Index) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Edges_Index.Unmarshal(m, b)
}
func (m *Edges_Index) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Edges_Index.Marshal(b, m, deterministic)
}
func (m *Edges_Index) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Edges_Index.Merge(m, src)
}
func (m *Edges_Index) XXX_Size() int {
	return xxx_messageInfo_Edges_Index.Size(m)
}
func (m *Edges_Index) XXX_DiscardUnknown() {
	xxx_messageInfo_Edges_Index.DiscardUnknown(m)
}

var xxx_messageInfo_Edges_Index proto.InternalMessageInfo

func (m *Edges_Index) GetNode() *schema_go_proto.Node {
	if m != nil {
		return m.Node
	}
	return nil
}

type Edges_Edge struct {
	// Types that are valid to be assigned to Kind:
	//	*Edges_Edge_KytheKind
	//	*Edges_Edge_GenericKind
	Kind                 isEdges_Edge_Kind       `protobuf_oneof:"kind"`
	Ordinal              int32                   `protobuf:"varint,3,opt,name=ordinal,proto3" json:"ordinal,omitempty"`
	Reverse              bool                    `protobuf:"varint,4,opt,name=reverse,proto3" json:"reverse,omitempty"`
	Target               *storage_go_proto.VName `protobuf:"bytes,5,opt,name=target,proto3" json:"target,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

func (m *Edges_Edge) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Edges_Edge.Unmarshal(m, b)
}
func (m *Edges_Edge) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Edges_Edge.Marshal(b, m, deterministic)
}
func (m *Edges_Edge) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Edges_Edge.Merge(m, src)
}
func (m *Edges_Edge) XXX_Size() int {
	return xxx_messageInfo_Edges_Edge.Size(m)
}
func (m *Edges_Edge) XXX_DiscardUnknown() {
	xxx_messageInfo_Edges_Edge.DiscardUnknown(m)
}

var xxx_messageInfo_Edges_Edge proto.InternalMessageInfo

type isEdges_Edge_Kind interface {
	isEdges_Edge_Kind()
}

type Edges_Edge_KytheKind struct {
	KytheKind schema_go_proto.EdgeKind `protobuf:"varint,1,opt,name=kythe_kind,json=kytheKind,proto3,enum=kythe.proto.schema.EdgeKind,oneof"`
}

type Edges_Edge_GenericKind struct {
	GenericKind string `protobuf:"bytes,2,opt,name=generic_kind,json=genericKind,proto3,oneof"`
}

func (*Edges_Edge_KytheKind) isEdges_Edge_Kind() {}

func (*Edges_Edge_GenericKind) isEdges_Edge_Kind() {}

func (m *Edges_Edge) GetKind() isEdges_Edge_Kind {
	if m != nil {
		return m.Kind
	}
	return nil
}

func (m *Edges_Edge) GetKytheKind() schema_go_proto.EdgeKind {
	if x, ok := m.GetKind().(*Edges_Edge_KytheKind); ok {
		return x.KytheKind
	}
	return schema_go_proto.EdgeKind_UNKNOWN_EDGE_KIND
}

func (m *Edges_Edge) GetGenericKind() string {
	if x, ok := m.GetKind().(*Edges_Edge_GenericKind); ok {
		return x.GenericKind
	}
	return ""
}

func (m *Edges_Edge) GetOrdinal() int32 {
	if m != nil {
		return m.Ordinal
	}
	return 0
}

func (m *Edges_Edge) GetReverse() bool {
	if m != nil {
		return m.Reverse
	}
	return false
}

func (m *Edges_Edge) GetTarget() *storage_go_proto.VName {
	if m != nil {
		return m.Target
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Edges_Edge) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Edges_Edge_KytheKind)(nil),
		(*Edges_Edge_GenericKind)(nil),
	}
}

type Edges_Target struct {
	Node                 *schema_go_proto.Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

func (m *Edges_Target) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Edges_Target.Unmarshal(m, b)
}
func (m *Edges_Target) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Edges_Target.Marshal(b, m, deterministic)
}
func (m *Edges_Target) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Edges_Target.Merge(m, src)
}
func (m *Edges_Target) XXX_Size() int {
	return xxx_messageInfo_Edges_Target.Size(m)
}
func (m *Edges_Target) XXX_DiscardUnknown() {
	xxx_messageInfo_Edges_Target.DiscardUnknown(m)
}

var xxx_messageInfo_Edges_Target proto.InternalMessageInfo

func (m *Edges_Target) GetNode() *schema_go_proto.Node {
	if m != nil {
		return m.Node
	}
	return nil
}

func init() {
	proto.RegisterType((*Edges)(nil), "kythe.proto.serving.graph.Edges")
	proto.RegisterType((*Edges_Index)(nil), "kythe.proto.serving.graph.Edges.Index")
	proto.RegisterType((*Edges_Edge)(nil), "kythe.proto.serving.graph.Edges.Edge")
	proto.RegisterType((*Edges_Target)(nil), "kythe.proto.serving.graph.Edges.Target")
}

func init() { proto.RegisterFile("kythe/proto/graph_serving.proto", fileDescriptor_6a9dc9f3ff73c6a9) }

var fileDescriptor_6a9dc9f3ff73c6a9 = []byte{
	// 380 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0xdf, 0x6a, 0xdb, 0x30,
	0x14, 0x87, 0x9d, 0xcd, 0x76, 0x96, 0x93, 0xb1, 0x0b, 0x5d, 0x0c, 0xc7, 0x0c, 0x32, 0x36, 0xf6,
	0x87, 0x31, 0x14, 0x48, 0x69, 0xa1, 0x94, 0x16, 0x1a, 0x28, 0xb8, 0x14, 0x72, 0x21, 0x4a, 0x2f,
	0x7a, 0x63, 0x5c, 0xeb, 0xa0, 0x98, 0x24, 0x52, 0x90, 0xdd, 0xd0, 0xbc, 0x5d, 0x9f, 0xa1, 0x4f,
	0x54, 0x74, 0x6c, 0x43, 0x02, 0x0d, 0xa1, 0x37, 0x36, 0x47, 0xe7, 0xfb, 0x8e, 0xe4, 0x9f, 0x0c,
	0xc3, 0xf9, 0xa6, 0x9a, 0xe1, 0x68, 0x65, 0x4d, 0x65, 0x46, 0xca, 0x66, 0xab, 0x59, 0x5a, 0xa2,
	0x5d, 0x17, 0x5a, 0x71, 0x5a, 0x63, 0x03, 0x02, 0xea, 0x82, 0xb7, 0x2d, 0x02, 0xe3, 0x68, 0xdb,
	0x2d, 0xf3, 0x19, 0x2e, 0xb3, 0x9a, 0x8b, 0x07, 0x3b, 0x9d, 0xca, 0xd8, 0x4c, 0x35, 0x23, 0x7e,
	0x3c, 0xfb, 0x10, 0x5c, 0x49, 0x85, 0x25, 0xfb, 0x07, 0x61, 0x69, 0x1e, 0x6d, 0x8e, 0x51, 0xe7,
	0x7b, 0xe7, 0x6f, 0x7f, 0xcc, 0xf8, 0xf6, 0x56, 0x77, 0xd3, 0x6c, 0x89, 0xa2, 0x21, 0xd8, 0x05,
	0x04, 0x85, 0x96, 0xf8, 0x14, 0x7d, 0x20, 0xf4, 0x37, 0xdf, 0x7b, 0x2a, 0x4e, 0xc3, 0xf9, 0xb5,
	0xa3, 0x13, 0x4f, 0xd4, 0x1a, 0x3b, 0x03, 0x1f, 0xa5, 0xc2, 0xe8, 0x23, 0xe9, 0xbf, 0x0e, 0xea,
	0xee, 0x99, 0x78, 0x82, 0x24, 0x76, 0x09, 0x61, 0x95, 0x59, 0x85, 0x55, 0xe4, 0x93, 0xfe, 0xe7,
	0xa0, 0x7e, 0x4b, 0x78, 0xe2, 0x89, 0x46, 0x8c, 0x8f, 0x21, 0xa0, 0x13, 0xb1, 0xff, 0xe0, 0x6b,
	0x23, 0xdb, 0x4f, 0x8e, 0x76, 0x27, 0xd5, 0x11, 0x4e, 0x8d, 0x44, 0x41, 0x54, 0xfc, 0xd2, 0x01,
	0xdf, 0x4d, 0x64, 0xe7, 0x00, 0x44, 0xa6, 0xf3, 0x42, 0x4b, 0x92, 0xbf, 0x8c, 0xbf, 0xbd, 0x25,
	0x3b, 0xfa, 0xa6, 0xd0, 0x32, 0xf1, 0x44, 0x8f, 0xda, 0xae, 0x60, 0x3f, 0xe1, 0xb3, 0x42, 0x8d,
	0xb6, 0xc8, 0xeb, 0x01, 0x2e, 0xc5, 0x5e, 0xe2, 0x89, 0x7e, 0xb3, 0x4a, 0x50, 0x04, 0x5d, 0x63,
	0x65, 0xa1, 0xb3, 0x05, 0xc5, 0x14, 0x88, 0xb6, 0x74, 0x1d, 0x8b, 0x6b, 0xb4, 0x25, 0x52, 0x02,
	0x9f, 0x44, 0x5b, 0xba, 0x3b, 0x6c, 0xa2, 0x09, 0xf6, 0xdf, 0x61, 0x4d, 0x4c, 0x42, 0xf0, 0xdd,
	0xe6, 0xf1, 0x09, 0x84, 0x75, 0x3e, 0xef, 0x0b, 0x63, 0xd2, 0x85, 0x00, 0x75, 0x65, 0x37, 0x93,
	0x53, 0x18, 0xe6, 0x66, 0xc9, 0x95, 0x31, 0x6a, 0x81, 0x5c, 0xe2, 0xba, 0x32, 0x66, 0x51, 0x6e,
	0xdb, 0xf7, 0x5f, 0x77, 0x7e, 0xe5, 0x54, 0x99, 0x94, 0xd6, 0x1f, 0x42, 0x7a, 0x1d, 0xbd, 0x06,
	0x00, 0x00, 0xff, 0xff, 0x08, 0x56, 0xc3, 0xca, 0xf7, 0x02, 0x00, 0x00,
}
