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

package schema_go_proto

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/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 NodeKind int32

const (
	NodeKind_UNKNOWN_NODE_KIND NodeKind = 0
	NodeKind_ABS               NodeKind = 1
	NodeKind_ABSVAR            NodeKind = 2
	NodeKind_ANCHOR            NodeKind = 3
	NodeKind_CONSTANT          NodeKind = 4
	NodeKind_DIAGNOSTIC        NodeKind = 5
	NodeKind_DOC               NodeKind = 6
	NodeKind_FILE              NodeKind = 7
	NodeKind_INTERFACE         NodeKind = 8
	NodeKind_FUNCTION          NodeKind = 9
	NodeKind_LOOKUP            NodeKind = 10
	NodeKind_MACRO             NodeKind = 11
	NodeKind_META              NodeKind = 12
	NodeKind_NAME              NodeKind = 13
	NodeKind_PACKAGE           NodeKind = 14
	NodeKind_PROCESS           NodeKind = 15
	NodeKind_RECORD            NodeKind = 16
	NodeKind_SUM               NodeKind = 17
	NodeKind_SYMBOL            NodeKind = 18
	NodeKind_TALIAS            NodeKind = 19
	NodeKind_TAPP              NodeKind = 20
	NodeKind_TBUILTIN          NodeKind = 21
	NodeKind_TNOMINAL          NodeKind = 22
	NodeKind_TSIGMA            NodeKind = 23
	NodeKind_VARIABLE          NodeKind = 24
	NodeKind_VCS               NodeKind = 25
)

var NodeKind_name = map[int32]string{
	0:  "UNKNOWN_NODE_KIND",
	1:  "ABS",
	2:  "ABSVAR",
	3:  "ANCHOR",
	4:  "CONSTANT",
	5:  "DIAGNOSTIC",
	6:  "DOC",
	7:  "FILE",
	8:  "INTERFACE",
	9:  "FUNCTION",
	10: "LOOKUP",
	11: "MACRO",
	12: "META",
	13: "NAME",
	14: "PACKAGE",
	15: "PROCESS",
	16: "RECORD",
	17: "SUM",
	18: "SYMBOL",
	19: "TALIAS",
	20: "TAPP",
	21: "TBUILTIN",
	22: "TNOMINAL",
	23: "TSIGMA",
	24: "VARIABLE",
	25: "VCS",
}

var NodeKind_value = map[string]int32{
	"UNKNOWN_NODE_KIND": 0,
	"ABS":               1,
	"ABSVAR":            2,
	"ANCHOR":            3,
	"CONSTANT":          4,
	"DIAGNOSTIC":        5,
	"DOC":               6,
	"FILE":              7,
	"INTERFACE":         8,
	"FUNCTION":          9,
	"LOOKUP":            10,
	"MACRO":             11,
	"META":              12,
	"NAME":              13,
	"PACKAGE":           14,
	"PROCESS":           15,
	"RECORD":            16,
	"SUM":               17,
	"SYMBOL":            18,
	"TALIAS":            19,
	"TAPP":              20,
	"TBUILTIN":          21,
	"TNOMINAL":          22,
	"TSIGMA":            23,
	"VARIABLE":          24,
	"VCS":               25,
}

func (x NodeKind) String() string {
	return proto.EnumName(NodeKind_name, int32(x))
}

func (NodeKind) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_a9abda27437812b0, []int{0}
}

type Subkind int32

const (
	Subkind_UNKNOWN_SUBKIND Subkind = 0
	Subkind_CATEGORY        Subkind = 1
	Subkind_CLASS           Subkind = 2
	Subkind_CONSTRUCTOR     Subkind = 3
	Subkind_DESTRUCTOR      Subkind = 4
	Subkind_ENUM            Subkind = 5
	Subkind_ENUM_CLASS      Subkind = 6
	Subkind_FIELD           Subkind = 7
	Subkind_IMPLICIT        Subkind = 8
	Subkind_IMPORT          Subkind = 9
	Subkind_INITIALIZER     Subkind = 10
	Subkind_LOCAL           Subkind = 11
	Subkind_LOCAL_PARAMETER Subkind = 12
	Subkind_METHOD          Subkind = 13
	Subkind_NAMESPACE       Subkind = 14
	Subkind_STRUCT          Subkind = 15
	Subkind_TYPE            Subkind = 16
	Subkind_UNION           Subkind = 17
)

var Subkind_name = map[int32]string{
	0:  "UNKNOWN_SUBKIND",
	1:  "CATEGORY",
	2:  "CLASS",
	3:  "CONSTRUCTOR",
	4:  "DESTRUCTOR",
	5:  "ENUM",
	6:  "ENUM_CLASS",
	7:  "FIELD",
	8:  "IMPLICIT",
	9:  "IMPORT",
	10: "INITIALIZER",
	11: "LOCAL",
	12: "LOCAL_PARAMETER",
	13: "METHOD",
	14: "NAMESPACE",
	15: "STRUCT",
	16: "TYPE",
	17: "UNION",
}

var Subkind_value = map[string]int32{
	"UNKNOWN_SUBKIND": 0,
	"CATEGORY":        1,
	"CLASS":           2,
	"CONSTRUCTOR":     3,
	"DESTRUCTOR":      4,
	"ENUM":            5,
	"ENUM_CLASS":      6,
	"FIELD":           7,
	"IMPLICIT":        8,
	"IMPORT":          9,
	"INITIALIZER":     10,
	"LOCAL":           11,
	"LOCAL_PARAMETER": 12,
	"METHOD":          13,
	"NAMESPACE":       14,
	"STRUCT":          15,
	"TYPE":            16,
	"UNION":           17,
}

func (x Subkind) String() string {
	return proto.EnumName(Subkind_name, int32(x))
}

func (Subkind) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_a9abda27437812b0, []int{1}
}

type FactName int32

const (
	FactName_UNKNOWN_FACT_NAME FactName = 0
	FactName_CODE              FactName = 1
	FactName_COMPLETE          FactName = 2
	FactName_CONTEXT_URL       FactName = 3
	FactName_DETAILS           FactName = 4
	FactName_DOC_URI           FactName = 5
	FactName_LABEL             FactName = 6
	FactName_LOC_END           FactName = 7
	FactName_LOC_START         FactName = 8
	FactName_MESSAGE           FactName = 9
	FactName_NODE_KIND         FactName = 10
	FactName_PARAM_DEFAULT     FactName = 11
	FactName_RULE_CLASS        FactName = 12
	FactName_SNIPPET_END       FactName = 13
	FactName_SNIPPET_START     FactName = 14
	FactName_SUBKIND           FactName = 15
	FactName_TEXT              FactName = 16
	FactName_TEXT_ENCODING     FactName = 17
	FactName_VISIBILITY        FactName = 18
	FactName_BUILD_CONFIG      FactName = 19
	FactName_TAG_DEPRECATED    FactName = 20
)

var FactName_name = map[int32]string{
	0:  "UNKNOWN_FACT_NAME",
	1:  "CODE",
	2:  "COMPLETE",
	3:  "CONTEXT_URL",
	4:  "DETAILS",
	5:  "DOC_URI",
	6:  "LABEL",
	7:  "LOC_END",
	8:  "LOC_START",
	9:  "MESSAGE",
	10: "NODE_KIND",
	11: "PARAM_DEFAULT",
	12: "RULE_CLASS",
	13: "SNIPPET_END",
	14: "SNIPPET_START",
	15: "SUBKIND",
	16: "TEXT",
	17: "TEXT_ENCODING",
	18: "VISIBILITY",
	19: "BUILD_CONFIG",
	20: "TAG_DEPRECATED",
}

var FactName_value = map[string]int32{
	"UNKNOWN_FACT_NAME": 0,
	"CODE":              1,
	"COMPLETE":          2,
	"CONTEXT_URL":       3,
	"DETAILS":           4,
	"DOC_URI":           5,
	"LABEL":             6,
	"LOC_END":           7,
	"LOC_START":         8,
	"MESSAGE":           9,
	"NODE_KIND":         10,
	"PARAM_DEFAULT":     11,
	"RULE_CLASS":        12,
	"SNIPPET_END":       13,
	"SNIPPET_START":     14,
	"SUBKIND":           15,
	"TEXT":              16,
	"TEXT_ENCODING":     17,
	"VISIBILITY":        18,
	"BUILD_CONFIG":      19,
	"TAG_DEPRECATED":    20,
}

func (x FactName) String() string {
	return proto.EnumName(FactName_name, int32(x))
}

func (FactName) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_a9abda27437812b0, []int{2}
}

type EdgeKind int32

const (
	EdgeKind_UNKNOWN_EDGE_KIND        EdgeKind = 0
	EdgeKind_ALIASES                  EdgeKind = 1
	EdgeKind_ALIASES_ROOT             EdgeKind = 2
	EdgeKind_ANNOTATED_BY             EdgeKind = 3
	EdgeKind_BOUNDED_LOWER            EdgeKind = 4
	EdgeKind_BOUNDED_UPPER            EdgeKind = 5
	EdgeKind_CHILD_OF                 EdgeKind = 6
	EdgeKind_CHILD_OF_CONTEXT         EdgeKind = 7
	EdgeKind_COMPLETES                EdgeKind = 8
	EdgeKind_COMPLETES_UNIQUELY       EdgeKind = 9
	EdgeKind_DEFINES                  EdgeKind = 10
	EdgeKind_DEFINES_BINDING          EdgeKind = 11
	EdgeKind_DEPENDS                  EdgeKind = 12
	EdgeKind_DOCUMENTS                EdgeKind = 13
	EdgeKind_EXPORTS                  EdgeKind = 14
	EdgeKind_EXTENDS                  EdgeKind = 15
	EdgeKind_GENERATES                EdgeKind = 16
	EdgeKind_IMPUTES                  EdgeKind = 17
	EdgeKind_INSTANTIATES             EdgeKind = 18
	EdgeKind_INSTANTIATES_SPECULATIVE EdgeKind = 19
	EdgeKind_NAMED                    EdgeKind = 20
	EdgeKind_OVERRIDES                EdgeKind = 21
	EdgeKind_OVERRIDES_ROOT           EdgeKind = 22
	EdgeKind_OVERRIDES_TRANSITIVE     EdgeKind = 23
	EdgeKind_PARAM                    EdgeKind = 24
	EdgeKind_REF                      EdgeKind = 25
	EdgeKind_REF_CALL                 EdgeKind = 26
	EdgeKind_REF_CALL_IMPLICIT        EdgeKind = 27
	EdgeKind_REF_DOC                  EdgeKind = 28
	EdgeKind_REF_EXPANDS              EdgeKind = 29
	EdgeKind_REF_EXPANDS_TRANSITIVE   EdgeKind = 30
	EdgeKind_REF_FILE                 EdgeKind = 31
	EdgeKind_REF_IMPLICIT             EdgeKind = 32
	EdgeKind_REF_IMPORTS              EdgeKind = 33
	EdgeKind_REF_INCLUDES             EdgeKind = 34
	EdgeKind_REF_INIT                 EdgeKind = 35
	EdgeKind_REF_INIT_IMPLICIT        EdgeKind = 36
	EdgeKind_REF_QUERIES              EdgeKind = 37
	EdgeKind_SATISFIES                EdgeKind = 38
	EdgeKind_SPECIALIZES              EdgeKind = 39
	EdgeKind_SPECIALIZES_SPECULATIVE  EdgeKind = 40
	EdgeKind_TAGGED                   EdgeKind = 41
	EdgeKind_TYPED                    EdgeKind = 42
	EdgeKind_UNDEFINES                EdgeKind = 43
)

var EdgeKind_name = map[int32]string{
	0:  "UNKNOWN_EDGE_KIND",
	1:  "ALIASES",
	2:  "ALIASES_ROOT",
	3:  "ANNOTATED_BY",
	4:  "BOUNDED_LOWER",
	5:  "BOUNDED_UPPER",
	6:  "CHILD_OF",
	7:  "CHILD_OF_CONTEXT",
	8:  "COMPLETES",
	9:  "COMPLETES_UNIQUELY",
	10: "DEFINES",
	11: "DEFINES_BINDING",
	12: "DEPENDS",
	13: "DOCUMENTS",
	14: "EXPORTS",
	15: "EXTENDS",
	16: "GENERATES",
	17: "IMPUTES",
	18: "INSTANTIATES",
	19: "INSTANTIATES_SPECULATIVE",
	20: "NAMED",
	21: "OVERRIDES",
	22: "OVERRIDES_ROOT",
	23: "OVERRIDES_TRANSITIVE",
	24: "PARAM",
	25: "REF",
	26: "REF_CALL",
	27: "REF_CALL_IMPLICIT",
	28: "REF_DOC",
	29: "REF_EXPANDS",
	30: "REF_EXPANDS_TRANSITIVE",
	31: "REF_FILE",
	32: "REF_IMPLICIT",
	33: "REF_IMPORTS",
	34: "REF_INCLUDES",
	35: "REF_INIT",
	36: "REF_INIT_IMPLICIT",
	37: "REF_QUERIES",
	38: "SATISFIES",
	39: "SPECIALIZES",
	40: "SPECIALIZES_SPECULATIVE",
	41: "TAGGED",
	42: "TYPED",
	43: "UNDEFINES",
}

var EdgeKind_value = map[string]int32{
	"UNKNOWN_EDGE_KIND":        0,
	"ALIASES":                  1,
	"ALIASES_ROOT":             2,
	"ANNOTATED_BY":             3,
	"BOUNDED_LOWER":            4,
	"BOUNDED_UPPER":            5,
	"CHILD_OF":                 6,
	"CHILD_OF_CONTEXT":         7,
	"COMPLETES":                8,
	"COMPLETES_UNIQUELY":       9,
	"DEFINES":                  10,
	"DEFINES_BINDING":          11,
	"DEPENDS":                  12,
	"DOCUMENTS":                13,
	"EXPORTS":                  14,
	"EXTENDS":                  15,
	"GENERATES":                16,
	"IMPUTES":                  17,
	"INSTANTIATES":             18,
	"INSTANTIATES_SPECULATIVE": 19,
	"NAMED":                    20,
	"OVERRIDES":                21,
	"OVERRIDES_ROOT":           22,
	"OVERRIDES_TRANSITIVE":     23,
	"PARAM":                    24,
	"REF":                      25,
	"REF_CALL":                 26,
	"REF_CALL_IMPLICIT":        27,
	"REF_DOC":                  28,
	"REF_EXPANDS":              29,
	"REF_EXPANDS_TRANSITIVE":   30,
	"REF_FILE":                 31,
	"REF_IMPLICIT":             32,
	"REF_IMPORTS":              33,
	"REF_INCLUDES":             34,
	"REF_INIT":                 35,
	"REF_INIT_IMPLICIT":        36,
	"REF_QUERIES":              37,
	"SATISFIES":                38,
	"SPECIALIZES":              39,
	"SPECIALIZES_SPECULATIVE":  40,
	"TAGGED":                   41,
	"TYPED":                    42,
	"UNDEFINES":                43,
}

func (x EdgeKind) String() string {
	return proto.EnumName(EdgeKind_name, int32(x))
}

func (EdgeKind) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_a9abda27437812b0, []int{3}
}

type Index struct {
	EdgeKinds            []*Index_EdgeKinds `protobuf:"bytes,1,rep,name=edge_kinds,json=edgeKinds,proto3" json:"edge_kinds,omitempty"`
	NodeKinds            []*Index_NodeKinds `protobuf:"bytes,2,rep,name=node_kinds,json=nodeKinds,proto3" json:"node_kinds,omitempty"`
	Subkinds             []*Index_Subkinds  `protobuf:"bytes,3,rep,name=subkinds,proto3" json:"subkinds,omitempty"`
	FactNames            []*Index_FactNames `protobuf:"bytes,4,rep,name=fact_names,json=factNames,proto3" json:"fact_names,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_Index proto.InternalMessageInfo

func (m *Index) GetEdgeKinds() []*Index_EdgeKinds {
	if m != nil {
		return m.EdgeKinds
	}
	return nil
}

func (m *Index) GetNodeKinds() []*Index_NodeKinds {
	if m != nil {
		return m.NodeKinds
	}
	return nil
}

func (m *Index) GetSubkinds() []*Index_Subkinds {
	if m != nil {
		return m.Subkinds
	}
	return nil
}

func (m *Index) GetFactNames() []*Index_FactNames {
	if m != nil {
		return m.FactNames
	}
	return nil
}

type Index_EdgeKinds struct {
	Prefix               string              `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"`
	EdgeKind             map[string]EdgeKind `protobuf:"bytes,2,rep,name=edge_kind,json=edgeKind,proto3" json:"edge_kind,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=kythe.proto.schema.EdgeKind"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_Index_EdgeKinds proto.InternalMessageInfo

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

func (m *Index_EdgeKinds) GetEdgeKind() map[string]EdgeKind {
	if m != nil {
		return m.EdgeKind
	}
	return nil
}

type Index_NodeKinds struct {
	Prefix               string              `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"`
	NodeKind             map[string]NodeKind `protobuf:"bytes,2,rep,name=node_kind,json=nodeKind,proto3" json:"node_kind,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=kythe.proto.schema.NodeKind"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_Index_NodeKinds proto.InternalMessageInfo

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

func (m *Index_NodeKinds) GetNodeKind() map[string]NodeKind {
	if m != nil {
		return m.NodeKind
	}
	return nil
}

type Index_Subkinds struct {
	Prefix               string             `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"`
	Subkind              map[string]Subkind `protobuf:"bytes,2,rep,name=subkind,proto3" json:"subkind,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=kythe.proto.schema.Subkind"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_Index_Subkinds proto.InternalMessageInfo

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

func (m *Index_Subkinds) GetSubkind() map[string]Subkind {
	if m != nil {
		return m.Subkind
	}
	return nil
}

type Index_FactNames struct {
	Prefix               string              `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"`
	FactName             map[string]FactName `protobuf:"bytes,2,rep,name=fact_name,json=factName,proto3" json:"fact_name,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=kythe.proto.schema.FactName"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_Index_FactNames proto.InternalMessageInfo

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

func (m *Index_FactNames) GetFactName() map[string]FactName {
	if m != nil {
		return m.FactName
	}
	return nil
}

type Node struct {
	Source *storage_go_proto.VName `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"`
	Fact   []*Fact                 `protobuf:"bytes,2,rep,name=fact,proto3" json:"fact,omitempty"`
	Edge   []*Edge                 `protobuf:"bytes,3,rep,name=edge,proto3" json:"edge,omitempty"`
	// Types that are valid to be assigned to Kind:
	//	*Node_KytheKind
	//	*Node_GenericKind
	Kind isNode_Kind `protobuf_oneof:"kind"`
	// Types that are valid to be assigned to Subkind:
	//	*Node_KytheSubkind
	//	*Node_GenericSubkind
	Subkind              isNode_Subkind `protobuf_oneof:"subkind"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

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

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

var xxx_messageInfo_Node proto.InternalMessageInfo

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

func (m *Node) GetFact() []*Fact {
	if m != nil {
		return m.Fact
	}
	return nil
}

func (m *Node) GetEdge() []*Edge {
	if m != nil {
		return m.Edge
	}
	return nil
}

type isNode_Kind interface {
	isNode_Kind()
}

type Node_KytheKind struct {
	KytheKind NodeKind `protobuf:"varint,4,opt,name=kythe_kind,json=kytheKind,proto3,enum=kythe.proto.schema.NodeKind,oneof"`
}

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

func (*Node_KytheKind) isNode_Kind() {}

func (*Node_GenericKind) isNode_Kind() {}

func (m *Node) GetKind() isNode_Kind {
	if m != nil {
		return m.Kind
	}
	return nil
}

func (m *Node) GetKytheKind() NodeKind {
	if x, ok := m.GetKind().(*Node_KytheKind); ok {
		return x.KytheKind
	}
	return NodeKind_UNKNOWN_NODE_KIND
}

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

type isNode_Subkind interface {
	isNode_Subkind()
}

type Node_KytheSubkind struct {
	KytheSubkind Subkind `protobuf:"varint,6,opt,name=kythe_subkind,json=kytheSubkind,proto3,enum=kythe.proto.schema.Subkind,oneof"`
}

type Node_GenericSubkind struct {
	GenericSubkind string `protobuf:"bytes,7,opt,name=generic_subkind,json=genericSubkind,proto3,oneof"`
}

func (*Node_KytheSubkind) isNode_Subkind() {}

func (*Node_GenericSubkind) isNode_Subkind() {}

func (m *Node) GetSubkind() isNode_Subkind {
	if m != nil {
		return m.Subkind
	}
	return nil
}

func (m *Node) GetKytheSubkind() Subkind {
	if x, ok := m.GetSubkind().(*Node_KytheSubkind); ok {
		return x.KytheSubkind
	}
	return Subkind_UNKNOWN_SUBKIND
}

func (m *Node) GetGenericSubkind() string {
	if x, ok := m.GetSubkind().(*Node_GenericSubkind); ok {
		return x.GenericSubkind
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Node) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Node_KytheKind)(nil),
		(*Node_GenericKind)(nil),
		(*Node_KytheSubkind)(nil),
		(*Node_GenericSubkind)(nil),
	}
}

type Fact struct {
	Source *storage_go_proto.VName `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"`
	// Types that are valid to be assigned to Name:
	//	*Fact_KytheName
	//	*Fact_GenericName
	Name                 isFact_Name `protobuf_oneof:"name"`
	Value                []byte      `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_Fact proto.InternalMessageInfo

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

type isFact_Name interface {
	isFact_Name()
}

type Fact_KytheName struct {
	KytheName FactName `protobuf:"varint,2,opt,name=kythe_name,json=kytheName,proto3,enum=kythe.proto.schema.FactName,oneof"`
}

type Fact_GenericName struct {
	GenericName string `protobuf:"bytes,3,opt,name=generic_name,json=genericName,proto3,oneof"`
}

func (*Fact_KytheName) isFact_Name() {}

func (*Fact_GenericName) isFact_Name() {}

func (m *Fact) GetName() isFact_Name {
	if m != nil {
		return m.Name
	}
	return nil
}

func (m *Fact) GetKytheName() FactName {
	if x, ok := m.GetName().(*Fact_KytheName); ok {
		return x.KytheName
	}
	return FactName_UNKNOWN_FACT_NAME
}

func (m *Fact) GetGenericName() string {
	if x, ok := m.GetName().(*Fact_GenericName); ok {
		return x.GenericName
	}
	return ""
}

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

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Fact) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Fact_KytheName)(nil),
		(*Fact_GenericName)(nil),
	}
}

type Edge struct {
	Source *storage_go_proto.VName `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"`
	Target *storage_go_proto.VName `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"`
	// Types that are valid to be assigned to Kind:
	//	*Edge_KytheKind
	//	*Edge_GenericKind
	Kind                 isEdge_Kind `protobuf_oneof:"kind"`
	Ordinal              int32       `protobuf:"varint,5,opt,name=ordinal,proto3" json:"ordinal,omitempty"`
	SourceNode           *Node       `protobuf:"bytes,6,opt,name=source_node,json=sourceNode,proto3" json:"source_node,omitempty"`
	TargetNode           *Node       `protobuf:"bytes,7,opt,name=target_node,json=targetNode,proto3" json:"target_node,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_Edge proto.InternalMessageInfo

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

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

type isEdge_Kind interface {
	isEdge_Kind()
}

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

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

func (*Edge_KytheKind) isEdge_Kind() {}

func (*Edge_GenericKind) isEdge_Kind() {}

func (m *Edge) GetKind() isEdge_Kind {
	if m != nil {
		return m.Kind
	}
	return nil
}

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

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

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

func (m *Edge) GetSourceNode() *Node {
	if m != nil {
		return m.SourceNode
	}
	return nil
}

func (m *Edge) GetTargetNode() *Node {
	if m != nil {
		return m.TargetNode
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Edge) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Edge_KytheKind)(nil),
		(*Edge_GenericKind)(nil),
	}
}

type Entry struct {
	// Types that are valid to be assigned to Entry:
	//	*Entry_Fact
	//	*Entry_Edge
	Entry                isEntry_Entry `protobuf_oneof:"entry"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

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

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

var xxx_messageInfo_Entry proto.InternalMessageInfo

type isEntry_Entry interface {
	isEntry_Entry()
}

type Entry_Fact struct {
	Fact *Fact `protobuf:"bytes,1,opt,name=fact,proto3,oneof"`
}

type Entry_Edge struct {
	Edge *Edge `protobuf:"bytes,2,opt,name=edge,proto3,oneof"`
}

func (*Entry_Fact) isEntry_Entry() {}

func (*Entry_Edge) isEntry_Entry() {}

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

func (m *Entry) GetFact() *Fact {
	if x, ok := m.GetEntry().(*Entry_Fact); ok {
		return x.Fact
	}
	return nil
}

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

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Entry) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Entry_Fact)(nil),
		(*Entry_Edge)(nil),
	}
}

func init() {
	proto.RegisterEnum("kythe.proto.schema.NodeKind", NodeKind_name, NodeKind_value)
	proto.RegisterEnum("kythe.proto.schema.Subkind", Subkind_name, Subkind_value)
	proto.RegisterEnum("kythe.proto.schema.FactName", FactName_name, FactName_value)
	proto.RegisterEnum("kythe.proto.schema.EdgeKind", EdgeKind_name, EdgeKind_value)
	proto.RegisterType((*Index)(nil), "kythe.proto.schema.Index")
	proto.RegisterType((*Index_EdgeKinds)(nil), "kythe.proto.schema.Index.EdgeKinds")
	proto.RegisterMapType((map[string]EdgeKind)(nil), "kythe.proto.schema.Index.EdgeKinds.EdgeKindEntry")
	proto.RegisterType((*Index_NodeKinds)(nil), "kythe.proto.schema.Index.NodeKinds")
	proto.RegisterMapType((map[string]NodeKind)(nil), "kythe.proto.schema.Index.NodeKinds.NodeKindEntry")
	proto.RegisterType((*Index_Subkinds)(nil), "kythe.proto.schema.Index.Subkinds")
	proto.RegisterMapType((map[string]Subkind)(nil), "kythe.proto.schema.Index.Subkinds.SubkindEntry")
	proto.RegisterType((*Index_FactNames)(nil), "kythe.proto.schema.Index.FactNames")
	proto.RegisterMapType((map[string]FactName)(nil), "kythe.proto.schema.Index.FactNames.FactNameEntry")
	proto.RegisterType((*Node)(nil), "kythe.proto.schema.Node")
	proto.RegisterType((*Fact)(nil), "kythe.proto.schema.Fact")
	proto.RegisterType((*Edge)(nil), "kythe.proto.schema.Edge")
	proto.RegisterType((*Entry)(nil), "kythe.proto.schema.Entry")
}

func init() { proto.RegisterFile("kythe/proto/schema.proto", fileDescriptor_a9abda27437812b0) }

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