diff --git a/component/component_data/ci.pb.go b/component/component_data/ci.pb.go index 5368b01..d4141d6 100644 --- a/component/component_data/ci.pb.go +++ b/component/component_data/ci.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v4.23.1 // source: component/ci.proto diff --git a/component/component_data/common.pb.go b/component/component_data/common.pb.go index ee5921d..d077134 100644 --- a/component/component_data/common.pb.go +++ b/component/component_data/common.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v4.23.1 // source: component/common.proto diff --git a/component/component_data/points.pb.go b/component/component_data/points.pb.go index 38f6420..d431254 100644 --- a/component/component_data/points.pb.go +++ b/component/component_data/points.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v4.23.1 // source: component/points.proto diff --git a/component/component_proto/psd.pb.go b/component/component_proto/psd.pb.go index 81ca3f6..8a98721 100644 --- a/component/component_proto/psd.pb.go +++ b/component/component_proto/psd.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v4.23.1 // source: component/psd.proto diff --git a/component/component_proto/signal.pb.go b/component/component_proto/signal.pb.go index 81018c3..4ef8544 100644 --- a/component/component_proto/signal.pb.go +++ b/component/component_proto/signal.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v4.23.1 // source: component/signal.proto diff --git a/component/iscs_bas_air_conditioner.go b/component/iscs_bas_air_conditioner.go index 9c4eadb..303c415 100644 --- a/component/iscs_bas_air_conditioner.go +++ b/component/iscs_bas_air_conditioner.go @@ -10,7 +10,7 @@ type AirConditioning struct { var ( AirConditioningType = ecs.NewComponentType[AirConditioning]() //空调 - CombinationAirConditionerTag = ecs.NewTag() //组合式空调 + CombinationAirConditionerTag = ecs.NewTag() //组合式空调(变频空调) AirConditioningGroupTag = ecs.NewTag() //空调群控系统 AirConditionerTag = ecs.NewTag() //空调器 ) diff --git a/component/iscs_bas_pipe.go b/component/iscs_bas_pipe.go index e036cb6..8c15ea3 100644 --- a/component/iscs_bas_pipe.go +++ b/component/iscs_bas_pipe.go @@ -2,37 +2,128 @@ package component import "joylink.club/ecs" -// FluidPipe 流体管线 -type FluidPipe struct { - Direction PipeFlowDirection //管线内综合流动方向 - FlowSpeed float32 //管线内综合流量,m3/h - Sources []*SourceFlow //该管线内所有流体源投射的分量 -} +/////////////////////////////////////////// +//组合空调柜AHU-A01 二通阀MOV-A01 +//回排风机RAF-A01 风阀MDD-A03 +//排烟风机SEF-A01 风阀MDD-A04 +//排风阀MDA-A02 +//回风阀MDA-A03 +//小新风阀MDA-A01 +//空调柜MDD-A02 +//防烟防火SFD-A01 -// SourceFlow 流体源进入管线的流体描述 -type SourceFlow struct { - Direction PipeFlowDirection - FlowSpeed float32 -} - -// PipeFlowDirection 管线内流体流动方向定义 -type PipeFlowDirection int8 +// PipeMatter 管线中传输的物质类型 +type PipeMatter uint8 const ( - PipeFlowNon PipeFlowDirection = iota //流体未流动 - PipeFlowAb //流体从管线的A->B - PipeFlowBa //流体从管线的B->A + PmtNon PipeMatter = iota //未知或没有 + PmtWater + PmtElectricity //电 + PmtAir //正常空气 + PmtSmoke //含有有害烟的空气(如火灾时的烟气) + PmtOil //油 ) -func (d *PipeFlowDirection) IsFlowAb() bool { - return *d == PipeFlowAb +func (m *PipeMatter) IsNon() bool { + return *m == PmtNon } -func (d *PipeFlowDirection) IsFlowBa() bool { - return *d == PipeFlowBa +func (m *PipeMatter) IsEle() bool { + return *m == PmtElectricity } -func (d *PipeFlowDirection) IsFlowNon() bool { - return *d == PipeFlowNon + +// PipeDirection 管线中物质传输方向定义 +type PipeDirection uint8 + +const ( + PdNon PipeDirection = iota //无方向 + PdAb //方向A=>B + PdBa //方向B=>A +) + +func (d *PipeDirection) IsAb() bool { + return *d == PdAb } +func (d *PipeDirection) IsBa() bool { + return *d == PdBa +} +func (d *PipeDirection) IsNon() bool { + return *d == PdNon +} + +// Pipe 管线一般状态定义 +type Pipe struct { + Matter PipeMatter //管线中物质类型 + Direction PipeDirection //管线中物质运动方向 +} + +// PipeElectricity 电线(三相交流,一般单相交流,直流) +// 如果是三相电,则简化认为每相电压电流一样 +type PipeElectricity struct { + U uint32 //电压 + I uint32 //电流 + Sx bool //true-三相交流电,此时Ac无效;false-一般单相电,此时Ua Ia Ac有效 + Ac bool //true-交流;false-直流 + Sources map[string]*ElectricitySource //key-电源实体id,value-电源投影 +} + +func NewPipeElectricity() *PipeElectricity { + return &PipeElectricity{Sources: make(map[string]*ElectricitySource)} +} +func (p *PipeElectricity) FromElectricitySource(es *ElectricitySource) { + p.U = es.U + p.Sx = es.Sx + p.Ac = es.Ac +} +func (p *PipeElectricity) TransPower(powerSourceId string, power *ElectricitySource) { + ep, ok := p.Sources[powerSourceId] + if ok { + *ep = *power + ep.Fresh -= 1 + } else { + p.Sources[powerSourceId] = &ElectricitySource{} + *p.Sources[powerSourceId] = *power + p.Sources[powerSourceId].Fresh -= 1 + } +} + +// ElectricitySource 电源(三相交流,一般单相交流,直流) +type ElectricitySource struct { + Fresh int64 //该电力值更新的时间戳 + U uint32 //电压 + I uint32 //电流 + Sx bool //true-三相交流电,此时Ac无效;false-一般单相电,此时Ua Ia Ac有效 + Ac bool //true-交流;false-直流 +} + +func NewElectricitySource() *ElectricitySource { + return &ElectricitySource{} +} + +// SetOut0 设置0输出 +func (s *ElectricitySource) SetOut0() { + s.U = 0 + s.I = 0 +} + +// PipeFluid 流体(液体气体)管线 +type PipeFluid struct { + T float32 //温度 +} + +func NewPipeFluid() *PipeFluid { + return &PipeFluid{} +} + +var ( + PipeType = ecs.NewComponentType[Pipe]() //电线 + PipeElectricityType = ecs.NewComponentType[PipeElectricity]() //电线电力 + PipeFluidType = ecs.NewComponentType[PipeFluid]() //管线流体 + + ElectricitySourceType = ecs.NewComponentType[ElectricitySource]() //电源 + +) + +///////////////////////////////////////////////////////////////////////// // FluidDriver 流体驱动器 type FluidDriver struct { @@ -40,6 +131,5 @@ type FluidDriver struct { } var ( - FluidPipeType = ecs.NewComponentType[FluidPipe]() //流体管线 FluidDriverType = ecs.NewComponentType[FluidDriver]() //流体驱动器 ) diff --git a/component/iscs_pscada.go b/component/iscs_pscada.go index 57c22cb..6605fd6 100644 --- a/component/iscs_pscada.go +++ b/component/iscs_pscada.go @@ -102,32 +102,6 @@ type EarthingDevice struct { //////////////////////////////////////////////////////////// -// PowerPipe 电力母线 -type PowerPipe struct { - Voltage uint32 //母线当前电压 - Ac bool //true-交流电;false-直流电 - Sources map[string]*ElePower //key-电源PowerSource实体id -} - -func (p *PowerPipe) TransPower(powerSourceId string, power *ElePower) { - ep, ok := p.Sources[powerSourceId] - if ok { - *ep = *power - ep.Fresh -= 1 - } else { - p.Sources[powerSourceId] = &ElePower{} - *p.Sources[powerSourceId] = *power - p.Sources[powerSourceId].Fresh -= 1 - } -} - -// ElePower 传输中的电力 -type ElePower struct { - Fresh int64 //该电力值更新的时间戳 - Voltage uint32 //电压 - Ac bool //true-交流电;false-直流电 -} - // PscadaVoltageLevel 电力母线当前电压等级定义 type PscadaVoltageLevel uint8 @@ -139,12 +113,6 @@ const ( PscadaVoltageDc1500V //1500V直流 ) -// PowerSource 电源(国家电网) -type PowerSource struct { - Voltage uint32 //电压 - Ac bool //true-交流电;false-直流电 -} - ////////////////////////////////////////////////////////////////////////////////// var ( @@ -156,8 +124,6 @@ var ( LightningArresterType = ecs.NewComponentType[LightningArrester]() //避雷器 RectifierType = ecs.NewComponentType[Rectifier]() //整流器 VoltageTransformerType = ecs.NewComponentType[VoltageTransformer]() //变压器 - PowerPipeType = ecs.NewComponentType[PowerPipe]() //电力母线 - PowerSourceType = ecs.NewComponentType[PowerSource]() //电源 EarthingDeviceType = ecs.NewComponentType[EarthingDevice]() //接地装置 ) diff --git a/entity/iscs_load.go b/entity/iscs_load.go index 7382cbb..37e0bf6 100644 --- a/entity/iscs_load.go +++ b/entity/iscs_load.go @@ -2,7 +2,6 @@ package entity import ( "joylink.club/ecs" - "joylink.club/rtsssimulation/repository/model/proto" ) // LoadIscs 加载ISCS相关设备实体 @@ -10,10 +9,7 @@ func LoadIscs(w ecs.World) error { data := GetWorldData(w) //电力母线实体 for _, pipe := range data.Repo.PipeMap { - switch pipe.PipeType { - case proto.Pipe_ElectricPower: - NewPowerPipeEntity(w, pipe.Id()) - } + NewPipeEntity(w, pipe.Id()) } //断路器 for _, circuitBreaker := range data.Repo.CircuitBreakerMap { @@ -41,7 +37,7 @@ func LoadIscs(w ecs.World) error { } //电源 for _, ps := range data.Repo.PowerSourceMap { - NewPowerSourceEntity(w, ps.Id(), ps.Ac, ps.Voltage) + NewPowerSourceEntity(w, ps.Id()) } //避雷器 for _, la := range data.Repo.LightningArresterMap { diff --git a/entity/iscs_pscada.go b/entity/iscs_pscada.go index 66c1833..e8a70ee 100644 --- a/entity/iscs_pscada.go +++ b/entity/iscs_pscada.go @@ -107,27 +107,23 @@ func NewVoltageTransformerEntity(w ecs.World, id string) *ecs.Entry { return e } -// NewPowerPipeEntity 创建PSCADA电力母线实体 -func NewPowerPipeEntity(w ecs.World, id string) *ecs.Entry { +func NewPipeEntity(w ecs.World, id string) *ecs.Entry { wd := GetWorldData(w) e, ok := wd.EntityMap[id] if !ok { - e = w.Entry(w.Create(component.UidType, component.PowerPipeType)) - component.UidType.SetValue(e, component.Uid{Id: id}) - component.PowerPipeType.Set(e, &component.PowerPipe{Sources: make(map[string]*component.ElePower)}) + e = w.Entry(w.Create(component.UidType, component.PipeType)) wd.EntityMap[id] = e } return e } // NewPowerSourceEntity 创建PSCADA电源实体 -func NewPowerSourceEntity(w ecs.World, id string, ac bool, voltage uint32) *ecs.Entry { +func NewPowerSourceEntity(w ecs.World, id string) *ecs.Entry { wd := GetWorldData(w) e, ok := wd.EntityMap[id] if !ok { - e = w.Entry(w.Create(component.UidType, component.PowerSourceType)) + e = w.Entry(w.Create(component.UidType, component.ElectricitySourceType)) component.UidType.SetValue(e, component.Uid{Id: id}) - component.PowerSourceType.Set(e, &component.PowerSource{Ac: ac, Voltage: voltage}) wd.EntityMap[id] = e } return e diff --git a/jl-ecs-go b/jl-ecs-go index e83feb8..bd947ba 160000 --- a/jl-ecs-go +++ b/jl-ecs-go @@ -1 +1 @@ -Subproject commit e83feb89dd84e3456aafebb7d6dbe179675344e8 +Subproject commit bd947baa4edadb6b7bd059f6e324fb20f8171f8f diff --git a/proto/src/model.proto b/proto/src/model.proto index 40a83c7..9268e05 100644 --- a/proto/src/model.proto +++ b/proto/src/model.proto @@ -607,11 +607,6 @@ message Pipe{ string code = 2; DevicePort portA = 3;//管线的A端连接的设备 DevicePort portB = 4;//管线的B端连接的设备 - enum Type{ - Fluid = 0;//流体(气体、液体) - ElectricPower = 1;//电力母线、电线 - } - Type pipeType = 5; //管线类型 } //管件 //管件端口分别为A B C D @@ -668,12 +663,13 @@ message VoltageTransformer{ message PowerSource{ string id = 1; string code = 2; + //true-三相交流电;false-单相电 + bool sx = 3; //true-交流电源;false-直流电源 - bool ac = 3; + bool ac = 4; //电源电压 - uint32 voltage = 4; + uint32 voltage = 5; } - //避雷器 message LightningArrester{ string id = 1; diff --git a/repo/dto/cg_repo.pb.go b/repo/dto/cg_repo.pb.go index 04dca3b..dfbdee3 100644 --- a/repo/dto/cg_repo.pb.go +++ b/repo/dto/cg_repo.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v4.23.1 // source: cg_repo.proto diff --git a/repository/iscs_pscada_yc.go b/repository/iscs_pscada_yc.go index 0bdbbf1..2d1a05f 100644 --- a/repository/iscs_pscada_yc.go +++ b/repository/iscs_pscada_yc.go @@ -10,14 +10,13 @@ import ( // Pipe 管线模型 type Pipe struct { Identity - Code string - PipeType proto.Pipe_Type - PortA DevicePort //管线的A端连接的设备 - PortB DevicePort //管线的B端连接的设备 + Code string + PortA DevicePort //管线的A端连接的设备 + PortB DevicePort //管线的B端连接的设备 } -func NewPipe(id string, code string, pipeType proto.Pipe_Type) *Pipe { - return &Pipe{Identity: &identity{id: id, deviceType: proto.DeviceType_DeviceType_Pipe}, Code: code, PipeType: pipeType} +func NewPipe(id string, code string) *Pipe { + return &Pipe{Identity: &identity{id: id, deviceType: proto.DeviceType_DeviceType_Pipe}, Code: code} } func (p *Pipe) PortNum() int { return 2 @@ -105,16 +104,6 @@ func (p *PipeFitting) Ports() []*PipePort { return ports } -// IsEle true-管件为电力管件 -func (p *PipeFitting) IsEle() bool { - for _, port := range p.Ports() { - if port.pipe.PipeType != proto.Pipe_ElectricPower { - return false - } - } - return true -} - // PipeFittingPort 管件端口 // // implement DevicePort @@ -365,16 +354,18 @@ type PowerSource struct { Identity Code string PortA *PipePort //电源A端口连接的管线 - Ac bool //true-交流;false-直流 Voltage uint32 //电压,单位V + Sx bool //true-三相交流电;false-单相 + Ac bool //true-交流;false-直流 } -func NewPowerSource(id string, code string, ac bool, voltage uint32) *PowerSource { +func NewPowerSource(id string, code string, voltage uint32, sx bool, ac bool) *PowerSource { return &PowerSource{ Identity: &identity{id: id, deviceType: proto.DeviceType_DeviceType_PowerSource}, Code: code, - Ac: ac, Voltage: voltage, + Sx: sx, + Ac: ac, } } func (p *PowerSource) PortNum() int { diff --git a/repository/model/proto/model.pb.go b/repository/model/proto/model.pb.go index 2bf4b26..34e9890 100644 --- a/repository/model/proto/model.pb.go +++ b/repository/model/proto/model.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v4.23.1 // source: model.proto @@ -1021,52 +1021,6 @@ func (Route_RouteType) EnumDescriptor() ([]byte, []int) { return file_model_proto_rawDescGZIP(), []int{32, 0} } -type Pipe_Type int32 - -const ( - Pipe_Fluid Pipe_Type = 0 //流体(气体、液体) - Pipe_ElectricPower Pipe_Type = 1 //电力母线、电线 -) - -// Enum value maps for Pipe_Type. -var ( - Pipe_Type_name = map[int32]string{ - 0: "Fluid", - 1: "ElectricPower", - } - Pipe_Type_value = map[string]int32{ - "Fluid": 0, - "ElectricPower": 1, - } -) - -func (x Pipe_Type) Enum() *Pipe_Type { - p := new(Pipe_Type) - *p = x - return p -} - -func (x Pipe_Type) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Pipe_Type) Descriptor() protoreflect.EnumDescriptor { - return file_model_proto_enumTypes[12].Descriptor() -} - -func (Pipe_Type) Type() protoreflect.EnumType { - return &file_model_proto_enumTypes[12] -} - -func (x Pipe_Type) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Pipe_Type.Descriptor instead. -func (Pipe_Type) EnumDescriptor() ([]byte, []int) { - return file_model_proto_rawDescGZIP(), []int{33, 0} -} - // 风亭子类型 type AirPavilion_Type int32 @@ -1098,11 +1052,11 @@ func (x AirPavilion_Type) String() string { } func (AirPavilion_Type) Descriptor() protoreflect.EnumDescriptor { - return file_model_proto_enumTypes[13].Descriptor() + return file_model_proto_enumTypes[12].Descriptor() } func (AirPavilion_Type) Type() protoreflect.EnumType { - return &file_model_proto_enumTypes[13] + return &file_model_proto_enumTypes[12] } func (x AirPavilion_Type) Number() protoreflect.EnumNumber { @@ -1151,11 +1105,11 @@ func (x Valve_Type) String() string { } func (Valve_Type) Descriptor() protoreflect.EnumDescriptor { - return file_model_proto_enumTypes[14].Descriptor() + return file_model_proto_enumTypes[13].Descriptor() } func (Valve_Type) Type() protoreflect.EnumType { - return &file_model_proto_enumTypes[14] + return &file_model_proto_enumTypes[13] } func (x Valve_Type) Number() protoreflect.EnumNumber { @@ -1204,11 +1158,11 @@ func (x Fan_Type) String() string { } func (Fan_Type) Descriptor() protoreflect.EnumDescriptor { - return file_model_proto_enumTypes[15].Descriptor() + return file_model_proto_enumTypes[14].Descriptor() } func (Fan_Type) Type() protoreflect.EnumType { - return &file_model_proto_enumTypes[15] + return &file_model_proto_enumTypes[14] } func (x Fan_Type) Number() protoreflect.EnumNumber { @@ -3942,11 +3896,10 @@ type Pipe struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Code string `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"` - PortA *DevicePort `protobuf:"bytes,3,opt,name=portA,proto3" json:"portA,omitempty"` //管线的A端连接的设备 - PortB *DevicePort `protobuf:"bytes,4,opt,name=portB,proto3" json:"portB,omitempty"` //管线的B端连接的设备 - PipeType Pipe_Type `protobuf:"varint,5,opt,name=pipeType,proto3,enum=model.Pipe_Type" json:"pipeType,omitempty"` //管线类型 + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Code string `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"` + PortA *DevicePort `protobuf:"bytes,3,opt,name=portA,proto3" json:"portA,omitempty"` //管线的A端连接的设备 + PortB *DevicePort `protobuf:"bytes,4,opt,name=portB,proto3" json:"portB,omitempty"` //管线的B端连接的设备 } func (x *Pipe) Reset() { @@ -4009,13 +3962,6 @@ func (x *Pipe) GetPortB() *DevicePort { return nil } -func (x *Pipe) GetPipeType() Pipe_Type { - if x != nil { - return x.PipeType - } - return Pipe_Fluid -} - // 管件 // 管件端口分别为A B C D type PipeFitting struct { @@ -4448,10 +4394,12 @@ type PowerSource struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` Code string `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"` + // true-三相交流电;false-单相电 + Sx bool `protobuf:"varint,3,opt,name=sx,proto3" json:"sx,omitempty"` // true-交流电源;false-直流电源 - Ac bool `protobuf:"varint,3,opt,name=ac,proto3" json:"ac,omitempty"` + Ac bool `protobuf:"varint,4,opt,name=ac,proto3" json:"ac,omitempty"` // 电源电压 - Voltage uint32 `protobuf:"varint,4,opt,name=voltage,proto3" json:"voltage,omitempty"` + Voltage uint32 `protobuf:"varint,5,opt,name=voltage,proto3" json:"voltage,omitempty"` } func (x *PowerSource) Reset() { @@ -4500,6 +4448,13 @@ func (x *PowerSource) GetCode() string { return "" } +func (x *PowerSource) GetSx() bool { + if x != nil { + return x.Sx + } + return false +} + func (x *PowerSource) GetAc() bool { if x != nil { return x.Ac @@ -5786,305 +5741,301 @@ var file_model_proto_rawDesc = []byte{ 0x0a, 0x09, 0x44, 0x45, 0x50, 0x41, 0x52, 0x54, 0x55, 0x52, 0x45, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x48, 0x55, 0x4e, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x41, 0x53, 0x53, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x4c, 0x4f, 0x4e, 0x47, 0x5f, 0x53, 0x48, - 0x55, 0x4e, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x22, 0xd0, 0x01, 0x0a, 0x04, 0x50, 0x69, 0x70, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x27, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x12, 0x27, - 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, - 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x12, 0x2c, 0x0a, 0x08, 0x70, 0x69, 0x70, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x70, 0x69, 0x70, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x24, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, - 0x05, 0x46, 0x6c, 0x75, 0x69, 0x64, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x6c, 0x65, 0x63, - 0x74, 0x72, 0x69, 0x63, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x10, 0x01, 0x22, 0x43, 0x0a, 0x0b, 0x50, - 0x69, 0x70, 0x65, 0x46, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x10, - 0x0a, 0x03, 0x73, 0x75, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x73, 0x75, 0x6d, - 0x22, 0x34, 0x0a, 0x0e, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, - 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x39, 0x0a, 0x13, 0x54, 0x68, 0x72, 0x65, 0x65, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, - 0x65, 0x22, 0x34, 0x0a, 0x0e, 0x48, 0x61, 0x6e, 0x64, 0x63, 0x61, 0x72, 0x74, 0x53, 0x77, 0x69, - 0x74, 0x63, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x2f, 0x0a, 0x09, 0x52, 0x65, 0x63, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x32, 0x0a, 0x0c, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x58, 0x0a, 0x12, - 0x56, 0x6f, 0x6c, 0x74, 0x61, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, - 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x31, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x02, 0x65, 0x31, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x32, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x02, 0x65, 0x32, 0x22, 0x5b, 0x0a, 0x0b, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x61, 0x63, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x61, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x6f, 0x6c, - 0x74, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x6f, 0x6c, 0x74, - 0x61, 0x67, 0x65, 0x22, 0x37, 0x0a, 0x11, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, - 0x41, 0x72, 0x72, 0x65, 0x73, 0x74, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x34, 0x0a, 0x0e, - 0x45, 0x61, 0x72, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x22, 0x33, 0x0a, 0x0d, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x77, 0x69, - 0x74, 0x63, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x31, 0x0a, 0x0b, 0x57, 0x69, 0x72, 0x65, 0x43, - 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x0b, 0x41, - 0x69, 0x72, 0x50, 0x61, 0x76, 0x69, 0x6c, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x3b, - 0x0a, 0x0c, 0x70, 0x61, 0x76, 0x69, 0x6c, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x69, 0x72, - 0x50, 0x61, 0x76, 0x69, 0x6c, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x70, - 0x61, 0x76, 0x69, 0x6c, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x32, 0x0a, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x78, 0x68, 0x61, 0x75, 0x73, 0x74, 0x50, 0x61, - 0x76, 0x69, 0x6c, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x69, 0x72, 0x53, - 0x75, 0x70, 0x70, 0x6c, 0x79, 0x50, 0x61, 0x76, 0x69, 0x6c, 0x69, 0x6f, 0x6e, 0x10, 0x01, 0x22, - 0xc9, 0x01, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x76, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x2f, 0x0a, - 0x09, 0x76, 0x61, 0x6c, 0x76, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x11, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x56, 0x61, 0x6c, 0x76, 0x65, 0x2e, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x76, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x6b, - 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, - 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x76, 0x65, 0x10, 0x00, - 0x12, 0x14, 0x0a, 0x10, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x41, 0x69, 0x72, 0x56, - 0x61, 0x6c, 0x76, 0x65, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x69, 0x72, 0x56, 0x61, 0x6c, 0x76, 0x65, 0x10, 0x02, 0x12, - 0x1a, 0x0a, 0x16, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x42, 0x75, 0x74, 0x74, 0x65, - 0x72, 0x66, 0x6c, 0x79, 0x56, 0x61, 0x6c, 0x76, 0x65, 0x10, 0x03, 0x22, 0x36, 0x0a, 0x10, 0x47, - 0x61, 0x73, 0x4d, 0x69, 0x78, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, - 0x6f, 0x64, 0x65, 0x22, 0x3f, 0x0a, 0x19, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x41, 0x69, 0x72, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x72, + 0x55, 0x4e, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x22, 0x7c, 0x0a, 0x04, 0x50, 0x69, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3b, 0x0a, 0x15, 0x41, 0x69, 0x72, 0x50, 0x75, 0x72, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, + 0x63, 0x6f, 0x64, 0x65, 0x12, 0x27, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x12, 0x27, 0x0a, + 0x05, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, + 0x05, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x22, 0x43, 0x0a, 0x0b, 0x50, 0x69, 0x70, 0x65, 0x46, 0x69, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x75, 0x6d, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x73, 0x75, 0x6d, 0x22, 0x34, 0x0a, 0x0e, 0x43, + 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, - 0x65, 0x22, 0x30, 0x0a, 0x0a, 0x41, 0x69, 0x72, 0x43, 0x75, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x12, + 0x65, 0x22, 0x39, 0x0a, 0x13, 0x54, 0x68, 0x72, 0x65, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x34, 0x0a, 0x0e, + 0x48, 0x61, 0x6e, 0x64, 0x63, 0x61, 0x72, 0x74, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x22, 0x2f, 0x0a, 0x09, 0x52, 0x65, 0x63, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, - 0x6f, 0x64, 0x65, 0x22, 0xa3, 0x01, 0x0a, 0x03, 0x46, 0x61, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x6f, 0x64, 0x65, 0x22, 0x32, 0x0a, 0x0c, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x58, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x74, 0x61, + 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x31, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x65, + 0x31, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x32, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x65, + 0x32, 0x22, 0x6b, 0x0a, 0x0b, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x63, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x73, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x02, 0x73, 0x78, 0x12, 0x0e, 0x0a, 0x02, 0x61, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x02, 0x61, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x6f, 0x6c, 0x74, 0x61, 0x67, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x6f, 0x6c, 0x74, 0x61, 0x67, 0x65, 0x22, 0x37, + 0x0a, 0x11, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x72, 0x72, 0x65, 0x73, + 0x74, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x34, 0x0a, 0x0e, 0x45, 0x61, 0x72, 0x74, 0x68, + 0x69, 0x6e, 0x67, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x33, 0x0a, + 0x0d, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x22, 0x31, 0x0a, 0x0b, 0x57, 0x69, 0x72, 0x65, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x0b, 0x41, 0x69, 0x72, 0x50, 0x61, 0x76, + 0x69, 0x6c, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x70, 0x61, 0x76, + 0x69, 0x6c, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x17, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x69, 0x72, 0x50, 0x61, 0x76, 0x69, 0x6c, + 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x70, 0x61, 0x76, 0x69, 0x6c, 0x69, + 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x32, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x13, + 0x0a, 0x0f, 0x45, 0x78, 0x68, 0x61, 0x75, 0x73, 0x74, 0x50, 0x61, 0x76, 0x69, 0x6c, 0x69, 0x6f, + 0x6e, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x69, 0x72, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, + 0x50, 0x61, 0x76, 0x69, 0x6c, 0x69, 0x6f, 0x6e, 0x10, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x05, 0x56, + 0x61, 0x6c, 0x76, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x76, 0x61, 0x6c, 0x76, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x56, 0x61, 0x6c, 0x76, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, + 0x76, 0x61, 0x6c, 0x76, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x6b, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x18, 0x0a, 0x14, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x76, 0x65, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x45, + 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x41, 0x69, 0x72, 0x56, 0x61, 0x6c, 0x76, 0x65, 0x10, + 0x01, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x41, 0x69, 0x72, 0x56, 0x61, 0x6c, 0x76, 0x65, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x45, 0x6c, + 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x42, 0x75, 0x74, 0x74, 0x65, 0x72, 0x66, 0x6c, 0x79, 0x56, + 0x61, 0x6c, 0x76, 0x65, 0x10, 0x03, 0x22, 0x36, 0x0a, 0x10, 0x47, 0x61, 0x73, 0x4d, 0x69, 0x78, + 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3f, + 0x0a, 0x19, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x69, 0x72, + 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, - 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, - 0x29, 0x0a, 0x07, 0x66, 0x61, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x0f, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x61, 0x6e, 0x2e, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x07, 0x66, 0x61, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x4d, 0x0a, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x46, 0x61, 0x6e, 0x10, - 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x63, 0x42, 0x79, 0x70, 0x61, 0x73, 0x73, 0x46, 0x61, 0x6e, - 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x6f, 0x66, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x46, - 0x61, 0x6e, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x48, 0x69, 0x67, 0x68, 0x4c, 0x6f, 0x77, 0x53, - 0x70, 0x65, 0x65, 0x64, 0x46, 0x61, 0x6e, 0x10, 0x03, 0x22, 0x34, 0x0a, 0x0e, 0x47, 0x61, 0x73, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, - 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x2a, - 0x81, 0x16, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, - 0x0a, 0x12, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x55, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x5f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x10, - 0x02, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, - 0x54, 0x75, 0x72, 0x6e, 0x6f, 0x75, 0x74, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x10, 0x04, - 0x12, 0x1a, 0x0a, 0x16, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x10, 0x05, 0x12, 0x14, 0x0a, 0x10, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x53, 0x6c, 0x6f, 0x70, 0x65, - 0x10, 0x06, 0x12, 0x21, 0x0a, 0x1d, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x5f, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x43, 0x75, 0x72, 0x76, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x10, 0x07, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x5f, 0x4c, 0x69, 0x6e, 0x6b, 0x10, 0x08, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4c, 0x69, 0x6e, 0x6b, 0x4e, 0x6f, 0x64, - 0x65, 0x10, 0x09, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x5f, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x10, 0x0a, 0x12, 0x24, 0x0a, 0x20, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x68, 0x61, 0x73, 0x65, 0x46, 0x61, 0x69, - 0x6c, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x10, 0x0b, 0x12, - 0x15, 0x0a, 0x11, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x42, 0x75, - 0x74, 0x74, 0x6f, 0x6e, 0x10, 0x0c, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x10, 0x0d, 0x12, 0x14, 0x0a, 0x10, + 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, + 0x3b, 0x0a, 0x15, 0x41, 0x69, 0x72, 0x50, 0x75, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x30, 0x0a, 0x0a, + 0x41, 0x69, 0x72, 0x43, 0x75, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0xa3, + 0x01, 0x0a, 0x03, 0x46, 0x61, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x66, 0x61, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x61, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x66, 0x61, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x4d, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, + 0x09, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x46, 0x61, 0x6e, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, + 0x46, 0x63, 0x42, 0x79, 0x70, 0x61, 0x73, 0x73, 0x46, 0x61, 0x6e, 0x10, 0x01, 0x12, 0x10, 0x0a, + 0x0c, 0x53, 0x6f, 0x66, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x46, 0x61, 0x6e, 0x10, 0x02, 0x12, + 0x13, 0x0a, 0x0f, 0x48, 0x69, 0x67, 0x68, 0x4c, 0x6f, 0x77, 0x53, 0x70, 0x65, 0x65, 0x64, 0x46, + 0x61, 0x6e, 0x10, 0x03, 0x22, 0x34, 0x0a, 0x0e, 0x47, 0x61, 0x73, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x2a, 0x81, 0x16, 0x0a, 0x0a, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, + 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, + 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x10, + 0x01, 0x12, 0x19, 0x0a, 0x15, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x75, 0x72, 0x6e, 0x6f, + 0x75, 0x74, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x5f, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x10, 0x05, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x53, 0x6c, 0x6f, 0x70, 0x65, 0x10, 0x06, 0x12, 0x21, 0x0a, + 0x1d, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x53, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x43, 0x75, 0x72, 0x76, 0x61, 0x74, 0x75, 0x72, 0x65, 0x10, 0x07, + 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4c, + 0x69, 0x6e, 0x6b, 0x10, 0x08, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x5f, 0x4c, 0x69, 0x6e, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x10, 0x09, 0x12, 0x14, + 0x0a, 0x10, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x52, 0x65, 0x6c, + 0x61, 0x79, 0x10, 0x0a, 0x12, 0x24, 0x0a, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x5f, 0x50, 0x68, 0x61, 0x73, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x50, + 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x10, 0x0b, 0x12, 0x15, 0x0a, 0x11, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x10, + 0x0c, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, + 0x4c, 0x69, 0x67, 0x68, 0x74, 0x10, 0x0d, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x10, 0x0e, 0x12, 0x12, 0x0a, + 0x0e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x73, 0x64, 0x10, + 0x0f, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, + 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x10, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4d, 0x6b, 0x78, 0x10, 0x11, 0x12, 0x12, 0x0a, + 0x0e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4b, 0x65, 0x79, 0x10, + 0x12, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, + 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x10, 0x13, 0x12, 0x1f, 0x0a, 0x1b, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x46, + 0x61, 0x75, 0x6c, 0x74, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x10, 0x14, 0x12, 0x17, 0x0a, 0x13, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, + 0x72, 0x73, 0x10, 0x15, 0x12, 0x1a, 0x0a, 0x16, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x5f, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x10, 0x16, + 0x12, 0x14, 0x0a, 0x10, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x10, 0x17, 0x12, 0x1a, 0x0a, 0x15, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x5f, 0x44, 0x6f, 0x6f, 0x72, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x10, + 0xc3, 0x02, 0x12, 0x1c, 0x0a, 0x17, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x5f, 0x45, 0x6e, 0x74, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x61, 0x74, 0x65, 0x10, 0xc4, 0x02, + 0x12, 0x18, 0x0a, 0x13, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x45, + 0x78, 0x69, 0x74, 0x47, 0x61, 0x74, 0x65, 0x10, 0xc5, 0x02, 0x12, 0x1a, 0x0a, 0x15, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x77, 0x6f, 0x57, 0x61, 0x79, 0x47, + 0x61, 0x74, 0x65, 0x10, 0xc6, 0x02, 0x12, 0x24, 0x0a, 0x1f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x56, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x10, 0xc7, 0x02, 0x12, 0x25, 0x0a, 0x20, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x53, 0x65, 0x6d, 0x69, 0x41, + 0x75, 0x74, 0x6f, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x10, 0xc8, 0x02, 0x12, 0x25, 0x0a, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x5f, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x10, 0xc9, 0x02, 0x12, 0x1a, 0x0a, 0x15, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x41, 0x69, 0x72, 0x43, 0x75, 0x72, 0x74, + 0x61, 0x69, 0x6e, 0x10, 0xca, 0x02, 0x12, 0x1b, 0x0a, 0x16, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x5f, 0x43, 0x68, 0x69, 0x6c, 0x6c, 0x65, 0x72, 0x55, 0x6e, 0x69, 0x74, + 0x10, 0xcb, 0x02, 0x12, 0x20, 0x0a, 0x1b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x5f, 0x43, 0x69, 0x76, 0x69, 0x6c, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x44, 0x6f, + 0x6f, 0x72, 0x10, 0xcc, 0x02, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x5f, 0x45, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x10, 0xcd, 0x02, + 0x12, 0x18, 0x0a, 0x13, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x45, + 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x10, 0xce, 0x02, 0x12, 0x21, 0x0a, 0x1c, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, + 0x63, 0x79, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x69, 0x6e, 0x67, 0x10, 0xcf, 0x02, 0x12, 0x13, 0x0a, + 0x0e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x46, 0x61, 0x6e, 0x10, + 0xd0, 0x02, 0x12, 0x1e, 0x0a, 0x19, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x5f, 0x41, 0x69, 0x72, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x10, + 0xd1, 0x02, 0x12, 0x1a, 0x0a, 0x15, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x5f, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x10, 0xd2, 0x02, 0x12, 0x20, + 0x0a, 0x1b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4c, 0x69, 0x67, + 0x68, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x75, 0x69, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x10, 0xd3, 0x02, + 0x12, 0x23, 0x0a, 0x1e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, + 0x6f, 0x77, 0x65, 0x72, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x47, 0x75, 0x69, 0x64, 0x61, 0x6e, + 0x63, 0x65, 0x10, 0xd4, 0x02, 0x12, 0x21, 0x0a, 0x1c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x5f, 0x45, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x47, 0x75, 0x69, + 0x64, 0x61, 0x6e, 0x63, 0x65, 0x10, 0xd5, 0x02, 0x12, 0x22, 0x0a, 0x1d, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x47, 0x61, 0x74, + 0x65, 0x47, 0x75, 0x69, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x10, 0xd6, 0x02, 0x12, 0x29, 0x0a, 0x24, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x53, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x76, 0x61, 0x63, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x75, 0x69, 0x64, + 0x61, 0x6e, 0x63, 0x65, 0x10, 0xd7, 0x02, 0x12, 0x1d, 0x0a, 0x18, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x77, 0x69, + 0x74, 0x63, 0x68, 0x10, 0xd8, 0x02, 0x12, 0x1d, 0x0a, 0x18, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x6c, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, + 0x65, 0x72, 0x10, 0xd9, 0x02, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x5f, 0x57, 0x61, 0x74, 0x65, 0x72, 0x50, 0x75, 0x6d, 0x70, 0x10, 0xda, 0x02, + 0x12, 0x19, 0x0a, 0x14, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x57, + 0x61, 0x74, 0x65, 0x72, 0x54, 0x61, 0x6e, 0x6b, 0x10, 0xdb, 0x02, 0x12, 0x22, 0x0a, 0x1d, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x75, 0x72, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x10, 0xdc, 0x02, 0x12, + 0x18, 0x0a, 0x13, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x68, + 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x10, 0xdd, 0x02, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x43, 0x4f, 0x32, 0x53, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x10, 0xde, 0x02, 0x12, 0x1c, 0x0a, 0x17, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x5f, 0x57, 0x61, 0x74, 0x65, 0x72, 0x54, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x10, + 0xdf, 0x02, 0x12, 0x1e, 0x0a, 0x19, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x5f, 0x50, 0x72, 0x65, 0x73, 0x73, 0x75, 0x72, 0x65, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x10, + 0xe0, 0x02, 0x12, 0x1a, 0x0a, 0x15, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x5f, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x10, 0xe1, 0x02, 0x12, 0x21, + 0x0a, 0x1c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x65, 0x6d, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x10, 0xe2, + 0x02, 0x12, 0x1c, 0x0a, 0x17, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, + 0x43, 0x6f, 0x6f, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x77, 0x65, 0x72, 0x10, 0xe4, 0x02, 0x12, + 0x1e, 0x0a, 0x19, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x57, 0x61, + 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x10, 0xe5, 0x02, 0x12, + 0x1b, 0x0a, 0x16, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x6f, 0x73, 0x74, 0x10, 0xe6, 0x02, 0x12, 0x1d, 0x0a, 0x18, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x53, 0x6d, 0x6f, 0x6b, 0x65, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x10, 0xe7, 0x02, 0x12, 0x23, 0x0a, 0x1e, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x65, 0x6d, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x10, 0xe8, 0x02, + 0x12, 0x25, 0x0a, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4d, + 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x46, 0x69, 0x72, 0x65, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x42, 0x75, + 0x74, 0x74, 0x6f, 0x6e, 0x10, 0xe9, 0x02, 0x12, 0x23, 0x0a, 0x1e, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x47, 0x61, 0x73, 0x46, 0x69, 0x72, 0x65, 0x45, 0x78, 0x74, + 0x69, 0x6e, 0x67, 0x75, 0x69, 0x73, 0x68, 0x65, 0x72, 0x10, 0xea, 0x02, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x41, 0x6c, 0x61, 0x72, 0x6d, - 0x10, 0x0e, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x5f, 0x50, 0x73, 0x64, 0x10, 0x0f, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x5f, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x10, 0x12, 0x12, - 0x0a, 0x0e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4d, 0x6b, 0x78, - 0x10, 0x11, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x5f, 0x4b, 0x65, 0x79, 0x10, 0x12, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x10, 0x13, 0x12, - 0x1f, 0x0a, 0x1b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x53, 0x69, - 0x67, 0x6e, 0x61, 0x6c, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x10, 0x14, - 0x12, 0x17, 0x0a, 0x13, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x42, - 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73, 0x10, 0x15, 0x12, 0x1a, 0x0a, 0x16, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x63, 0x72, - 0x65, 0x65, 0x6e, 0x10, 0x16, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x5f, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, 0x17, 0x12, 0x1a, 0x0a, 0x15, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x44, 0x6f, 0x6f, 0x72, 0x53, 0x65, - 0x6e, 0x73, 0x6f, 0x72, 0x10, 0xc3, 0x02, 0x12, 0x1c, 0x0a, 0x17, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x45, 0x6e, 0x74, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x61, - 0x74, 0x65, 0x10, 0xc4, 0x02, 0x12, 0x18, 0x0a, 0x13, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x5f, 0x45, 0x78, 0x69, 0x74, 0x47, 0x61, 0x74, 0x65, 0x10, 0xc5, 0x02, 0x12, - 0x1a, 0x0a, 0x15, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x77, - 0x6f, 0x57, 0x61, 0x79, 0x47, 0x61, 0x74, 0x65, 0x10, 0xc6, 0x02, 0x12, 0x24, 0x0a, 0x1f, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, - 0x56, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x10, 0xc7, - 0x02, 0x12, 0x25, 0x0a, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, - 0x53, 0x65, 0x6d, 0x69, 0x41, 0x75, 0x74, 0x6f, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x10, 0xc8, 0x02, 0x12, 0x25, 0x0a, 0x20, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x10, 0xc9, 0x02, 0x12, - 0x1a, 0x0a, 0x15, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x41, 0x69, - 0x72, 0x43, 0x75, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x10, 0xca, 0x02, 0x12, 0x1b, 0x0a, 0x16, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x43, 0x68, 0x69, 0x6c, 0x6c, 0x65, - 0x72, 0x55, 0x6e, 0x69, 0x74, 0x10, 0xcb, 0x02, 0x12, 0x20, 0x0a, 0x1b, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x43, 0x69, 0x76, 0x69, 0x6c, 0x44, 0x65, 0x66, 0x65, - 0x6e, 0x73, 0x65, 0x44, 0x6f, 0x6f, 0x72, 0x10, 0xcc, 0x02, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x45, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x74, - 0x6f, 0x72, 0x10, 0xcd, 0x02, 0x12, 0x18, 0x0a, 0x13, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x5f, 0x45, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x10, 0xce, 0x02, 0x12, - 0x21, 0x0a, 0x1c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x45, 0x6d, - 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x69, 0x6e, 0x67, 0x10, - 0xcf, 0x02, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x5f, 0x46, 0x61, 0x6e, 0x10, 0xd0, 0x02, 0x12, 0x1e, 0x0a, 0x19, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x41, 0x69, 0x72, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x65, 0x72, 0x10, 0xd1, 0x02, 0x12, 0x1a, 0x0a, 0x15, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, - 0x10, 0xd2, 0x02, 0x12, 0x20, 0x0a, 0x1b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x5f, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x75, 0x69, 0x64, 0x61, 0x6e, - 0x63, 0x65, 0x10, 0xd3, 0x02, 0x12, 0x23, 0x0a, 0x1e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x5f, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x47, - 0x75, 0x69, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x10, 0xd4, 0x02, 0x12, 0x21, 0x0a, 0x1c, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x45, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x74, - 0x6f, 0x72, 0x47, 0x75, 0x69, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x10, 0xd5, 0x02, 0x12, 0x22, 0x0a, - 0x1d, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x69, 0x63, 0x6b, - 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x47, 0x75, 0x69, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x10, 0xd6, - 0x02, 0x12, 0x29, 0x0a, 0x24, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, - 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x61, 0x63, 0x75, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x47, 0x75, 0x69, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x10, 0xd7, 0x02, 0x12, 0x1d, 0x0a, 0x18, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x10, 0xd8, 0x02, 0x12, 0x1d, 0x0a, 0x18, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x6c, 0x63, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x10, 0xd9, 0x02, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x57, 0x61, 0x74, 0x65, 0x72, 0x50, 0x75, - 0x6d, 0x70, 0x10, 0xda, 0x02, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x5f, 0x57, 0x61, 0x74, 0x65, 0x72, 0x54, 0x61, 0x6e, 0x6b, 0x10, 0xdb, 0x02, - 0x12, 0x22, 0x0a, 0x1d, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, - 0x75, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x10, 0xdc, 0x02, 0x12, 0x18, 0x0a, 0x13, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x5f, 0x54, 0x68, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x10, 0xdd, 0x02, 0x12, 0x19, - 0x0a, 0x14, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x43, 0x4f, 0x32, - 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x10, 0xde, 0x02, 0x12, 0x1c, 0x0a, 0x17, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x57, 0x61, 0x74, 0x65, 0x72, 0x54, 0x53, 0x65, - 0x6e, 0x73, 0x6f, 0x72, 0x10, 0xdf, 0x02, 0x12, 0x1e, 0x0a, 0x19, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x72, 0x65, 0x73, 0x73, 0x75, 0x72, 0x65, 0x53, 0x65, - 0x6e, 0x73, 0x6f, 0x72, 0x10, 0xe0, 0x02, 0x12, 0x1a, 0x0a, 0x15, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x10, 0xe1, 0x02, 0x12, 0x21, 0x0a, 0x1c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, + 0x42, 0x65, 0x6c, 0x6c, 0x10, 0xeb, 0x02, 0x12, 0x21, 0x0a, 0x1c, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x46, 0x69, 0x72, 0x65, 0x52, 0x6f, 0x6c, 0x6c, 0x65, 0x72, + 0x53, 0x68, 0x75, 0x74, 0x74, 0x65, 0x72, 0x10, 0xec, 0x02, 0x12, 0x16, 0x0a, 0x11, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x46, 0x61, 0x73, 0x41, 0x63, 0x73, 0x10, + 0xed, 0x02, 0x12, 0x16, 0x0a, 0x11, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x5f, 0x46, 0x61, 0x73, 0x41, 0x66, 0x63, 0x10, 0xee, 0x02, 0x12, 0x22, 0x0a, 0x1d, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4e, 0x6f, 0x6e, 0x46, 0x69, 0x72, 0x65, + 0x50, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x10, 0xef, 0x02, 0x12, 0x22, + 0x0a, 0x1d, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x57, 0x61, 0x74, + 0x65, 0x72, 0x46, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x10, + 0xf0, 0x02, 0x12, 0x1f, 0x0a, 0x1a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x5f, 0x50, 0x75, 0x6d, 0x70, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, + 0x10, 0xf1, 0x02, 0x12, 0x27, 0x0a, 0x22, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x10, 0xe2, 0x02, 0x12, 0x1c, 0x0a, 0x17, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x5f, 0x43, 0x6f, 0x6f, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x77, 0x65, - 0x72, 0x10, 0xe4, 0x02, 0x12, 0x1e, 0x0a, 0x19, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x5f, 0x57, 0x61, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, - 0x72, 0x10, 0xe5, 0x02, 0x12, 0x1b, 0x0a, 0x16, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x5f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x6f, 0x73, 0x74, 0x10, 0xe6, - 0x02, 0x12, 0x1d, 0x0a, 0x18, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, - 0x53, 0x6d, 0x6f, 0x6b, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x10, 0xe7, 0x02, - 0x12, 0x23, 0x0a, 0x1e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, - 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x10, 0xe8, 0x02, 0x12, 0x25, 0x0a, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x5f, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x46, 0x69, 0x72, 0x65, 0x41, 0x6c, - 0x61, 0x72, 0x6d, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x10, 0xe9, 0x02, 0x12, 0x23, 0x0a, 0x1e, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x47, 0x61, 0x73, 0x46, 0x69, - 0x72, 0x65, 0x45, 0x78, 0x74, 0x69, 0x6e, 0x67, 0x75, 0x69, 0x73, 0x68, 0x65, 0x72, 0x10, 0xea, - 0x02, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, - 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x42, 0x65, 0x6c, 0x6c, 0x10, 0xeb, 0x02, 0x12, 0x21, 0x0a, 0x1c, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x46, 0x69, 0x72, 0x65, 0x52, - 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x53, 0x68, 0x75, 0x74, 0x74, 0x65, 0x72, 0x10, 0xec, 0x02, 0x12, - 0x16, 0x0a, 0x11, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x46, 0x61, - 0x73, 0x41, 0x63, 0x73, 0x10, 0xed, 0x02, 0x12, 0x16, 0x0a, 0x11, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x46, 0x61, 0x73, 0x41, 0x66, 0x63, 0x10, 0xee, 0x02, 0x12, - 0x22, 0x0a, 0x1d, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4e, 0x6f, - 0x6e, 0x46, 0x69, 0x72, 0x65, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x10, 0xef, 0x02, 0x12, 0x22, 0x0a, 0x1d, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x5f, 0x57, 0x61, 0x74, 0x65, 0x72, 0x46, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x64, 0x69, 0x63, - 0x61, 0x74, 0x6f, 0x72, 0x10, 0xf0, 0x02, 0x12, 0x1f, 0x0a, 0x1a, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x75, 0x6d, 0x70, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, - 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x10, 0xf1, 0x02, 0x12, 0x27, 0x0a, 0x22, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x53, 0x65, 0x6e, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x61, 0x62, 0x6c, 0x65, 0x10, 0xf2, - 0x02, 0x12, 0x1a, 0x0a, 0x15, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, - 0x46, 0x69, 0x72, 0x65, 0x44, 0x61, 0x6d, 0x70, 0x65, 0x72, 0x10, 0xf3, 0x02, 0x12, 0x27, 0x0a, - 0x22, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x45, 0x6c, 0x65, 0x63, - 0x74, 0x72, 0x69, 0x63, 0x53, 0x6d, 0x6f, 0x6b, 0x65, 0x46, 0x69, 0x72, 0x65, 0x44, 0x61, 0x6d, - 0x70, 0x65, 0x72, 0x10, 0xf4, 0x02, 0x12, 0x29, 0x0a, 0x24, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x5f, 0x46, 0x69, 0x72, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x10, 0xf5, - 0x02, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, - 0x46, 0x6c, 0x6f, 0x6f, 0x64, 0x47, 0x61, 0x74, 0x65, 0x10, 0xf6, 0x02, 0x12, 0x1b, 0x0a, 0x16, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x57, 0x69, 0x72, 0x65, 0x43, - 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x10, 0xf7, 0x02, 0x12, 0x1e, 0x0a, 0x19, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x42, - 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x10, 0xf8, 0x02, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x52, 0x65, 0x63, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x10, 0xf9, 0x02, 0x12, 0x1e, 0x0a, 0x19, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x5f, 0x48, 0x61, 0x6e, 0x64, 0x63, 0x61, 0x72, 0x74, 0x53, 0x77, 0x69, 0x74, 0x63, - 0x68, 0x10, 0xfa, 0x02, 0x12, 0x22, 0x0a, 0x1d, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x5f, 0x56, 0x6f, 0x6c, 0x74, 0x61, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x10, 0xfb, 0x02, 0x12, 0x23, 0x0a, 0x1e, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x68, 0x72, 0x65, 0x65, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x10, 0xfc, 0x02, 0x12, 0x21, 0x0a, - 0x1c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4c, 0x69, 0x67, 0x68, - 0x74, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x72, 0x72, 0x65, 0x73, 0x74, 0x65, 0x72, 0x10, 0xfd, 0x02, - 0x12, 0x1c, 0x0a, 0x17, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x44, - 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x10, 0xfe, 0x02, 0x12, 0x14, - 0x0a, 0x0f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x69, 0x70, - 0x65, 0x10, 0xff, 0x02, 0x12, 0x1b, 0x0a, 0x16, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x5f, 0x50, 0x69, 0x70, 0x65, 0x46, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x80, + 0x73, 0x69, 0x6e, 0x67, 0x43, 0x61, 0x62, 0x6c, 0x65, 0x10, 0xf2, 0x02, 0x12, 0x1a, 0x0a, 0x15, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x46, 0x69, 0x72, 0x65, 0x44, + 0x61, 0x6d, 0x70, 0x65, 0x72, 0x10, 0xf3, 0x02, 0x12, 0x27, 0x0a, 0x22, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x53, + 0x6d, 0x6f, 0x6b, 0x65, 0x46, 0x69, 0x72, 0x65, 0x44, 0x61, 0x6d, 0x70, 0x65, 0x72, 0x10, 0xf4, + 0x02, 0x12, 0x29, 0x0a, 0x24, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, + 0x46, 0x69, 0x72, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x10, 0xf5, 0x02, 0x12, 0x19, 0x0a, 0x14, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x46, 0x6c, 0x6f, 0x6f, 0x64, + 0x47, 0x61, 0x74, 0x65, 0x10, 0xf6, 0x02, 0x12, 0x1b, 0x0a, 0x16, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x57, 0x69, 0x72, 0x65, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, + 0x74, 0x10, 0xf7, 0x02, 0x12, 0x1e, 0x0a, 0x19, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x5f, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, + 0x72, 0x10, 0xf8, 0x02, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x5f, 0x52, 0x65, 0x63, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x10, 0xf9, 0x02, 0x12, + 0x1e, 0x0a, 0x19, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x48, 0x61, + 0x6e, 0x64, 0x63, 0x61, 0x72, 0x74, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x10, 0xfa, 0x02, 0x12, + 0x22, 0x0a, 0x1d, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x56, 0x6f, + 0x6c, 0x74, 0x61, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, + 0x10, 0xfb, 0x02, 0x12, 0x23, 0x0a, 0x1e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x5f, 0x54, 0x68, 0x72, 0x65, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x77, 0x69, 0x74, 0x63, 0x68, 0x10, 0xfc, 0x02, 0x12, 0x21, 0x0a, 0x1c, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, + 0x41, 0x72, 0x72, 0x65, 0x73, 0x74, 0x65, 0x72, 0x10, 0xfd, 0x02, 0x12, 0x1c, 0x0a, 0x17, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x10, 0xfe, 0x02, 0x12, 0x14, 0x0a, 0x0f, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x69, 0x70, 0x65, 0x10, 0xff, 0x02, 0x12, + 0x1b, 0x0a, 0x16, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x69, + 0x70, 0x65, 0x46, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x80, 0x03, 0x12, 0x1b, 0x0a, 0x16, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x6f, 0x77, 0x65, 0x72, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x10, 0x81, 0x03, 0x12, 0x1e, 0x0a, 0x19, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x45, 0x61, 0x72, 0x74, 0x68, 0x69, 0x6e, 0x67, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x10, 0x82, 0x03, 0x12, 0x1b, 0x0a, 0x16, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x41, 0x69, 0x72, 0x50, 0x61, 0x76, 0x69, 0x6c, + 0x69, 0x6f, 0x6e, 0x10, 0x83, 0x03, 0x12, 0x15, 0x0a, 0x10, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x5f, 0x56, 0x61, 0x6c, 0x76, 0x65, 0x10, 0x84, 0x03, 0x12, 0x20, 0x0a, + 0x1b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x47, 0x61, 0x73, 0x4d, + 0x69, 0x78, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x85, 0x03, 0x12, + 0x29, 0x0a, 0x24, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x43, 0x6f, + 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x69, 0x72, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x10, 0x86, 0x03, 0x12, 0x25, 0x0a, 0x20, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x41, 0x69, 0x72, 0x50, 0x75, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x10, 0x87, 0x03, 0x12, 0x1b, 0x0a, 0x16, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, - 0x50, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x10, 0x81, 0x03, 0x12, 0x1e, - 0x0a, 0x19, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x45, 0x61, 0x72, - 0x74, 0x68, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x10, 0x82, 0x03, 0x12, 0x1b, - 0x0a, 0x16, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x41, 0x69, 0x72, - 0x50, 0x61, 0x76, 0x69, 0x6c, 0x69, 0x6f, 0x6e, 0x10, 0x83, 0x03, 0x12, 0x15, 0x0a, 0x10, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x56, 0x61, 0x6c, 0x76, 0x65, 0x10, - 0x84, 0x03, 0x12, 0x20, 0x0a, 0x1b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x5f, 0x47, 0x61, 0x73, 0x4d, 0x69, 0x78, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x6d, 0x62, 0x65, - 0x72, 0x10, 0x85, 0x03, 0x12, 0x29, 0x0a, 0x24, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x5f, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x69, - 0x72, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x10, 0x86, 0x03, 0x12, - 0x25, 0x0a, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x41, 0x69, - 0x72, 0x50, 0x75, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x10, 0x87, 0x03, 0x12, 0x1b, 0x0a, 0x16, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x10, 0x88, 0x03, 0x2a, 0x2c, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x08, 0x0a, 0x04, 0x4e, - 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x05, 0x0a, 0x01, 0x41, 0x10, 0x01, 0x12, 0x05, 0x0a, 0x01, - 0x42, 0x10, 0x02, 0x12, 0x05, 0x0a, 0x01, 0x43, 0x10, 0x03, 0x12, 0x05, 0x0a, 0x01, 0x44, 0x10, - 0x04, 0x2a, 0x20, 0x0a, 0x09, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, - 0x0a, 0x04, 0x4c, 0x45, 0x46, 0x54, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x49, 0x47, 0x48, - 0x54, 0x10, 0x01, 0x2a, 0x43, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, - 0x79, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x78, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x65, 0x72, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x75, 0x6c, 0x61, 0x74, 0x65, - 0x64, 0x4a, 0x6f, 0x69, 0x6e, 0x74, 0x10, 0x02, 0x42, 0x1a, 0x5a, 0x18, 0x2e, 0x2f, 0x72, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x10, 0x88, 0x03, 0x2a, 0x2c, + 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x00, + 0x12, 0x05, 0x0a, 0x01, 0x41, 0x10, 0x01, 0x12, 0x05, 0x0a, 0x01, 0x42, 0x10, 0x02, 0x12, 0x05, + 0x0a, 0x01, 0x43, 0x10, 0x03, 0x12, 0x05, 0x0a, 0x01, 0x44, 0x10, 0x04, 0x2a, 0x20, 0x0a, 0x09, + 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x45, 0x46, + 0x54, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x49, 0x47, 0x48, 0x54, 0x10, 0x01, 0x2a, 0x43, + 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0c, 0x0a, 0x08, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x10, 0x00, 0x12, 0x0f, + 0x0a, 0x0b, 0x41, 0x78, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x10, 0x01, 0x12, + 0x12, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x4a, 0x6f, 0x69, 0x6e, + 0x74, 0x10, 0x02, 0x42, 0x1a, 0x5a, 0x18, 0x2e, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x6f, 0x72, 0x79, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -6099,7 +6050,7 @@ func file_model_proto_rawDescGZIP() []byte { return file_model_proto_rawDescData } -var file_model_proto_enumTypes = make([]protoimpl.EnumInfo, 16) +var file_model_proto_enumTypes = make([]protoimpl.EnumInfo, 15) var file_model_proto_msgTypes = make([]protoimpl.MessageInfo, 55) var file_model_proto_goTypes = []interface{}{ (DeviceType)(0), // 0: model.DeviceType @@ -6114,170 +6065,168 @@ var file_model_proto_goTypes = []interface{}{ (Light_LightAspect)(0), // 9: model.Light.LightAspect (Platform_PlatformDirection)(0), // 10: model.Platform.PlatformDirection (Route_RouteType)(0), // 11: model.Route.RouteType - (Pipe_Type)(0), // 12: model.Pipe.Type - (AirPavilion_Type)(0), // 13: model.AirPavilion.Type - (Valve_Type)(0), // 14: model.Valve.Type - (Fan_Type)(0), // 15: model.Fan.Type - (*Repository)(nil), // 16: model.Repository - (*SignalLayout)(nil), // 17: model.SignalLayout - (*PhysicalSection)(nil), // 18: model.PhysicalSection - (*CheckPoint)(nil), // 19: model.CheckPoint - (*Turnout)(nil), // 20: model.Turnout - (*Signal)(nil), // 21: model.Signal - (*Psd)(nil), // 22: model.Psd - (*Transponder)(nil), // 23: model.Transponder - (*Slope)(nil), // 24: model.Slope - (*SectionalCurvature)(nil), // 25: model.SectionalCurvature - (*DevicePort)(nil), // 26: model.DevicePort - (*Kilometer)(nil), // 27: model.Kilometer - (*KilometerConvert)(nil), // 28: model.KilometerConvert - (*Relay)(nil), // 29: model.Relay - (*PhaseFailureProtector)(nil), // 30: model.PhaseFailureProtector - (*ElectronicComponentGroup)(nil), // 31: model.ElectronicComponentGroup - (*Button)(nil), // 32: model.Button - (*Light)(nil), // 33: model.Light - (*Alarm)(nil), // 34: model.Alarm - (*Station)(nil), // 35: model.Station - (*DeviceEcc)(nil), // 36: model.DeviceEcc - (*ElectronicGroup)(nil), // 37: model.ElectronicGroup - (*ElectronicComponent)(nil), // 38: model.ElectronicComponent - (*Mkx)(nil), // 39: model.Mkx - (*Platform)(nil), // 40: model.Platform - (*Key)(nil), // 41: model.Key - (*CentralizedStationRef)(nil), // 42: model.CentralizedStationRef - (*CjData)(nil), // 43: model.CjData - (*CjDataItem)(nil), // 44: model.CjDataItem - (*QdData)(nil), // 45: model.QdData - (*AsdGroup)(nil), // 46: model.AsdGroup - (*CiSectionCodePoint)(nil), // 47: model.CiSectionCodePoint - (*Route)(nil), // 48: model.Route - (*Pipe)(nil), // 49: model.Pipe - (*PipeFitting)(nil), // 50: model.PipeFitting - (*CircuitBreaker)(nil), // 51: model.CircuitBreaker - (*ThreePositionSwitch)(nil), // 52: model.ThreePositionSwitch - (*HandcartSwitch)(nil), // 53: model.HandcartSwitch - (*Rectifier)(nil), // 54: model.Rectifier - (*Disconnector)(nil), // 55: model.Disconnector - (*VoltageTransformer)(nil), // 56: model.VoltageTransformer - (*PowerSource)(nil), // 57: model.PowerSource - (*LightningArrester)(nil), // 58: model.LightningArrester - (*EarthingDevice)(nil), // 59: model.EarthingDevice - (*NetworkSwitch)(nil), // 60: model.NetworkSwitch - (*WireCabinet)(nil), // 61: model.WireCabinet - (*AirPavilion)(nil), // 62: model.AirPavilion - (*Valve)(nil), // 63: model.Valve - (*GasMixingChamber)(nil), // 64: model.GasMixingChamber - (*CombinationAirConditioner)(nil), // 65: model.CombinationAirConditioner - (*AirPurificationDevice)(nil), // 66: model.AirPurificationDevice - (*AirCurtain)(nil), // 67: model.AirCurtain - (*Fan)(nil), // 68: model.Fan - (*GasEnvironment)(nil), // 69: model.GasEnvironment - (*Route_TurnoutPosition)(nil), // 70: model.Route.TurnoutPosition + (AirPavilion_Type)(0), // 12: model.AirPavilion.Type + (Valve_Type)(0), // 13: model.Valve.Type + (Fan_Type)(0), // 14: model.Fan.Type + (*Repository)(nil), // 15: model.Repository + (*SignalLayout)(nil), // 16: model.SignalLayout + (*PhysicalSection)(nil), // 17: model.PhysicalSection + (*CheckPoint)(nil), // 18: model.CheckPoint + (*Turnout)(nil), // 19: model.Turnout + (*Signal)(nil), // 20: model.Signal + (*Psd)(nil), // 21: model.Psd + (*Transponder)(nil), // 22: model.Transponder + (*Slope)(nil), // 23: model.Slope + (*SectionalCurvature)(nil), // 24: model.SectionalCurvature + (*DevicePort)(nil), // 25: model.DevicePort + (*Kilometer)(nil), // 26: model.Kilometer + (*KilometerConvert)(nil), // 27: model.KilometerConvert + (*Relay)(nil), // 28: model.Relay + (*PhaseFailureProtector)(nil), // 29: model.PhaseFailureProtector + (*ElectronicComponentGroup)(nil), // 30: model.ElectronicComponentGroup + (*Button)(nil), // 31: model.Button + (*Light)(nil), // 32: model.Light + (*Alarm)(nil), // 33: model.Alarm + (*Station)(nil), // 34: model.Station + (*DeviceEcc)(nil), // 35: model.DeviceEcc + (*ElectronicGroup)(nil), // 36: model.ElectronicGroup + (*ElectronicComponent)(nil), // 37: model.ElectronicComponent + (*Mkx)(nil), // 38: model.Mkx + (*Platform)(nil), // 39: model.Platform + (*Key)(nil), // 40: model.Key + (*CentralizedStationRef)(nil), // 41: model.CentralizedStationRef + (*CjData)(nil), // 42: model.CjData + (*CjDataItem)(nil), // 43: model.CjDataItem + (*QdData)(nil), // 44: model.QdData + (*AsdGroup)(nil), // 45: model.AsdGroup + (*CiSectionCodePoint)(nil), // 46: model.CiSectionCodePoint + (*Route)(nil), // 47: model.Route + (*Pipe)(nil), // 48: model.Pipe + (*PipeFitting)(nil), // 49: model.PipeFitting + (*CircuitBreaker)(nil), // 50: model.CircuitBreaker + (*ThreePositionSwitch)(nil), // 51: model.ThreePositionSwitch + (*HandcartSwitch)(nil), // 52: model.HandcartSwitch + (*Rectifier)(nil), // 53: model.Rectifier + (*Disconnector)(nil), // 54: model.Disconnector + (*VoltageTransformer)(nil), // 55: model.VoltageTransformer + (*PowerSource)(nil), // 56: model.PowerSource + (*LightningArrester)(nil), // 57: model.LightningArrester + (*EarthingDevice)(nil), // 58: model.EarthingDevice + (*NetworkSwitch)(nil), // 59: model.NetworkSwitch + (*WireCabinet)(nil), // 60: model.WireCabinet + (*AirPavilion)(nil), // 61: model.AirPavilion + (*Valve)(nil), // 62: model.Valve + (*GasMixingChamber)(nil), // 63: model.GasMixingChamber + (*CombinationAirConditioner)(nil), // 64: model.CombinationAirConditioner + (*AirPurificationDevice)(nil), // 65: model.AirPurificationDevice + (*AirCurtain)(nil), // 66: model.AirCurtain + (*Fan)(nil), // 67: model.Fan + (*GasEnvironment)(nil), // 68: model.GasEnvironment + (*Route_TurnoutPosition)(nil), // 69: model.Route.TurnoutPosition } var file_model_proto_depIdxs = []int32{ - 18, // 0: model.Repository.physicalSections:type_name -> model.PhysicalSection - 19, // 1: model.Repository.checkPoints:type_name -> model.CheckPoint - 20, // 2: model.Repository.turnouts:type_name -> model.Turnout - 21, // 3: model.Repository.signals:type_name -> model.Signal - 23, // 4: model.Repository.transponders:type_name -> model.Transponder - 24, // 5: model.Repository.slopes:type_name -> model.Slope - 25, // 6: model.Repository.sectionalCurvatures:type_name -> model.SectionalCurvature - 28, // 7: model.Repository.kilometerConverts:type_name -> model.KilometerConvert - 29, // 8: model.Repository.relays:type_name -> model.Relay - 30, // 9: model.Repository.phaseFailureProtectors:type_name -> model.PhaseFailureProtector - 32, // 10: model.Repository.buttons:type_name -> model.Button - 22, // 11: model.Repository.psds:type_name -> model.Psd - 33, // 12: model.Repository.lights:type_name -> model.Light - 34, // 13: model.Repository.alarms:type_name -> model.Alarm - 35, // 14: model.Repository.stations:type_name -> model.Station - 39, // 15: model.Repository.mkxs:type_name -> model.Mkx - 40, // 16: model.Repository.platforms:type_name -> model.Platform - 41, // 17: model.Repository.Keys:type_name -> model.Key - 42, // 18: model.Repository.CentralizedStationRefs:type_name -> model.CentralizedStationRef - 48, // 19: model.Repository.routes:type_name -> model.Route - 49, // 20: model.Repository.pipes:type_name -> model.Pipe - 50, // 21: model.Repository.pipeFittings:type_name -> model.PipeFitting - 51, // 22: model.Repository.circuitBreakers:type_name -> model.CircuitBreaker - 52, // 23: model.Repository.threePositionSwitches:type_name -> model.ThreePositionSwitch - 53, // 24: model.Repository.handcartSwitches:type_name -> model.HandcartSwitch - 54, // 25: model.Repository.rectifiers:type_name -> model.Rectifier - 55, // 26: model.Repository.disconnectors:type_name -> model.Disconnector - 56, // 27: model.Repository.voltageTransformers:type_name -> model.VoltageTransformer - 57, // 28: model.Repository.powerSources:type_name -> model.PowerSource - 58, // 29: model.Repository.lightningArresters:type_name -> model.LightningArrester - 59, // 30: model.Repository.earthingDevices:type_name -> model.EarthingDevice - 60, // 31: model.Repository.networkSwitches:type_name -> model.NetworkSwitch - 61, // 32: model.Repository.wireCabinets:type_name -> model.WireCabinet - 62, // 33: model.Repository.airPavilions:type_name -> model.AirPavilion - 63, // 34: model.Repository.valves:type_name -> model.Valve - 64, // 35: model.Repository.gasMixingChambers:type_name -> model.GasMixingChamber - 65, // 36: model.Repository.combinationAirConditioners:type_name -> model.CombinationAirConditioner - 66, // 37: model.Repository.airPurificationDevices:type_name -> model.AirPurificationDevice - 67, // 38: model.Repository.airCurtains:type_name -> model.AirCurtain - 68, // 39: model.Repository.fans:type_name -> model.Fan - 69, // 40: model.Repository.gasEnvironments:type_name -> model.GasEnvironment - 18, // 41: model.SignalLayout.physicalSections:type_name -> model.PhysicalSection - 19, // 42: model.SignalLayout.checkPoints:type_name -> model.CheckPoint - 20, // 43: model.SignalLayout.turnouts:type_name -> model.Turnout - 21, // 44: model.SignalLayout.signals:type_name -> model.Signal - 23, // 45: model.SignalLayout.transponders:type_name -> model.Transponder - 24, // 46: model.SignalLayout.slopes:type_name -> model.Slope - 25, // 47: model.SignalLayout.sectionalCurvatures:type_name -> model.SectionalCurvature - 28, // 48: model.SignalLayout.kilometerConverts:type_name -> model.KilometerConvert - 26, // 49: model.PhysicalSection.aDevicePort:type_name -> model.DevicePort - 26, // 50: model.PhysicalSection.bDevicePort:type_name -> model.DevicePort - 27, // 51: model.CheckPoint.km:type_name -> model.Kilometer + 17, // 0: model.Repository.physicalSections:type_name -> model.PhysicalSection + 18, // 1: model.Repository.checkPoints:type_name -> model.CheckPoint + 19, // 2: model.Repository.turnouts:type_name -> model.Turnout + 20, // 3: model.Repository.signals:type_name -> model.Signal + 22, // 4: model.Repository.transponders:type_name -> model.Transponder + 23, // 5: model.Repository.slopes:type_name -> model.Slope + 24, // 6: model.Repository.sectionalCurvatures:type_name -> model.SectionalCurvature + 27, // 7: model.Repository.kilometerConverts:type_name -> model.KilometerConvert + 28, // 8: model.Repository.relays:type_name -> model.Relay + 29, // 9: model.Repository.phaseFailureProtectors:type_name -> model.PhaseFailureProtector + 31, // 10: model.Repository.buttons:type_name -> model.Button + 21, // 11: model.Repository.psds:type_name -> model.Psd + 32, // 12: model.Repository.lights:type_name -> model.Light + 33, // 13: model.Repository.alarms:type_name -> model.Alarm + 34, // 14: model.Repository.stations:type_name -> model.Station + 38, // 15: model.Repository.mkxs:type_name -> model.Mkx + 39, // 16: model.Repository.platforms:type_name -> model.Platform + 40, // 17: model.Repository.Keys:type_name -> model.Key + 41, // 18: model.Repository.CentralizedStationRefs:type_name -> model.CentralizedStationRef + 47, // 19: model.Repository.routes:type_name -> model.Route + 48, // 20: model.Repository.pipes:type_name -> model.Pipe + 49, // 21: model.Repository.pipeFittings:type_name -> model.PipeFitting + 50, // 22: model.Repository.circuitBreakers:type_name -> model.CircuitBreaker + 51, // 23: model.Repository.threePositionSwitches:type_name -> model.ThreePositionSwitch + 52, // 24: model.Repository.handcartSwitches:type_name -> model.HandcartSwitch + 53, // 25: model.Repository.rectifiers:type_name -> model.Rectifier + 54, // 26: model.Repository.disconnectors:type_name -> model.Disconnector + 55, // 27: model.Repository.voltageTransformers:type_name -> model.VoltageTransformer + 56, // 28: model.Repository.powerSources:type_name -> model.PowerSource + 57, // 29: model.Repository.lightningArresters:type_name -> model.LightningArrester + 58, // 30: model.Repository.earthingDevices:type_name -> model.EarthingDevice + 59, // 31: model.Repository.networkSwitches:type_name -> model.NetworkSwitch + 60, // 32: model.Repository.wireCabinets:type_name -> model.WireCabinet + 61, // 33: model.Repository.airPavilions:type_name -> model.AirPavilion + 62, // 34: model.Repository.valves:type_name -> model.Valve + 63, // 35: model.Repository.gasMixingChambers:type_name -> model.GasMixingChamber + 64, // 36: model.Repository.combinationAirConditioners:type_name -> model.CombinationAirConditioner + 65, // 37: model.Repository.airPurificationDevices:type_name -> model.AirPurificationDevice + 66, // 38: model.Repository.airCurtains:type_name -> model.AirCurtain + 67, // 39: model.Repository.fans:type_name -> model.Fan + 68, // 40: model.Repository.gasEnvironments:type_name -> model.GasEnvironment + 17, // 41: model.SignalLayout.physicalSections:type_name -> model.PhysicalSection + 18, // 42: model.SignalLayout.checkPoints:type_name -> model.CheckPoint + 19, // 43: model.SignalLayout.turnouts:type_name -> model.Turnout + 20, // 44: model.SignalLayout.signals:type_name -> model.Signal + 22, // 45: model.SignalLayout.transponders:type_name -> model.Transponder + 23, // 46: model.SignalLayout.slopes:type_name -> model.Slope + 24, // 47: model.SignalLayout.sectionalCurvatures:type_name -> model.SectionalCurvature + 27, // 48: model.SignalLayout.kilometerConverts:type_name -> model.KilometerConvert + 25, // 49: model.PhysicalSection.aDevicePort:type_name -> model.DevicePort + 25, // 50: model.PhysicalSection.bDevicePort:type_name -> model.DevicePort + 26, // 51: model.CheckPoint.km:type_name -> model.Kilometer 3, // 52: model.CheckPoint.type:type_name -> model.CheckPointType - 26, // 53: model.CheckPoint.devicePorts:type_name -> model.DevicePort - 27, // 54: model.Turnout.km:type_name -> model.Kilometer - 26, // 55: model.Turnout.aDevicePort:type_name -> model.DevicePort - 26, // 56: model.Turnout.bDevicePort:type_name -> model.DevicePort - 26, // 57: model.Turnout.cDevicePort:type_name -> model.DevicePort + 25, // 53: model.CheckPoint.devicePorts:type_name -> model.DevicePort + 26, // 54: model.Turnout.km:type_name -> model.Kilometer + 25, // 55: model.Turnout.aDevicePort:type_name -> model.DevicePort + 25, // 56: model.Turnout.bDevicePort:type_name -> model.DevicePort + 25, // 57: model.Turnout.cDevicePort:type_name -> model.DevicePort 4, // 58: model.Turnout.switchMachineType:type_name -> model.Turnout.SwitchMachineType - 31, // 59: model.Turnout.electronicComponentGroups:type_name -> model.ElectronicComponentGroup - 27, // 60: model.Signal.km:type_name -> model.Kilometer - 26, // 61: model.Signal.turnoutPort:type_name -> model.DevicePort - 31, // 62: model.Signal.electronicComponentGroups:type_name -> model.ElectronicComponentGroup + 30, // 59: model.Turnout.electronicComponentGroups:type_name -> model.ElectronicComponentGroup + 26, // 60: model.Signal.km:type_name -> model.Kilometer + 25, // 61: model.Signal.turnoutPort:type_name -> model.DevicePort + 30, // 62: model.Signal.electronicComponentGroups:type_name -> model.ElectronicComponentGroup 5, // 63: model.Signal.model:type_name -> model.Signal.Model - 46, // 64: model.Psd.asdGroups:type_name -> model.AsdGroup - 31, // 65: model.Psd.electronicComponentGroups:type_name -> model.ElectronicComponentGroup - 27, // 66: model.Transponder.km:type_name -> model.Kilometer - 26, // 67: model.Transponder.turnoutPort:type_name -> model.DevicePort + 45, // 64: model.Psd.asdGroups:type_name -> model.AsdGroup + 30, // 65: model.Psd.electronicComponentGroups:type_name -> model.ElectronicComponentGroup + 26, // 66: model.Transponder.km:type_name -> model.Kilometer + 25, // 67: model.Transponder.turnoutPort:type_name -> model.DevicePort 6, // 68: model.Transponder.type:type_name -> model.Transponder.Type - 27, // 69: model.Slope.kms:type_name -> model.Kilometer - 27, // 70: model.SectionalCurvature.kms:type_name -> model.Kilometer + 26, // 69: model.Slope.kms:type_name -> model.Kilometer + 26, // 70: model.SectionalCurvature.kms:type_name -> model.Kilometer 0, // 71: model.DevicePort.deviceType:type_name -> model.DeviceType 1, // 72: model.DevicePort.port:type_name -> model.Port 2, // 73: model.Kilometer.direction:type_name -> model.Direction - 27, // 74: model.KilometerConvert.kmA:type_name -> model.Kilometer - 27, // 75: model.KilometerConvert.kmB:type_name -> model.Kilometer + 26, // 74: model.KilometerConvert.kmA:type_name -> model.Kilometer + 26, // 75: model.KilometerConvert.kmB:type_name -> model.Kilometer 7, // 76: model.Relay.model:type_name -> model.Relay.Model 8, // 77: model.Button.buttonType:type_name -> model.Button.ButtonType 9, // 78: model.Light.aspect:type_name -> model.Light.LightAspect - 37, // 79: model.Station.electronicGroup:type_name -> model.ElectronicGroup - 36, // 80: model.Station.deccs:type_name -> model.DeviceEcc + 36, // 79: model.Station.electronicGroup:type_name -> model.ElectronicGroup + 35, // 80: model.Station.deccs:type_name -> model.DeviceEcc 0, // 81: model.DeviceEcc.deviceType:type_name -> model.DeviceType - 31, // 82: model.DeviceEcc.egs:type_name -> model.ElectronicComponentGroup - 38, // 83: model.ElectronicGroup.components:type_name -> model.ElectronicComponent + 30, // 82: model.DeviceEcc.egs:type_name -> model.ElectronicComponentGroup + 37, // 83: model.ElectronicGroup.components:type_name -> model.ElectronicComponent 0, // 84: model.ElectronicComponent.deviceType:type_name -> model.DeviceType 10, // 85: model.Platform.direction:type_name -> model.Platform.PlatformDirection - 43, // 86: model.CentralizedStationRef.cjList:type_name -> model.CjData - 45, // 87: model.CentralizedStationRef.qdList:type_name -> model.QdData - 47, // 88: model.CentralizedStationRef.sectionCodePoints:type_name -> model.CiSectionCodePoint - 44, // 89: model.CjData.refRelays:type_name -> model.CjDataItem + 42, // 86: model.CentralizedStationRef.cjList:type_name -> model.CjData + 44, // 87: model.CentralizedStationRef.qdList:type_name -> model.QdData + 46, // 88: model.CentralizedStationRef.sectionCodePoints:type_name -> model.CiSectionCodePoint + 43, // 89: model.CjData.refRelays:type_name -> model.CjDataItem 11, // 90: model.Route.routeType:type_name -> model.Route.RouteType - 70, // 91: model.Route.turnouts:type_name -> model.Route.TurnoutPosition - 26, // 92: model.Pipe.portA:type_name -> model.DevicePort - 26, // 93: model.Pipe.portB:type_name -> model.DevicePort - 12, // 94: model.Pipe.pipeType:type_name -> model.Pipe.Type - 13, // 95: model.AirPavilion.pavilionType:type_name -> model.AirPavilion.Type - 14, // 96: model.Valve.valveType:type_name -> model.Valve.Type - 15, // 97: model.Fan.fanType:type_name -> model.Fan.Type - 98, // [98:98] is the sub-list for method output_type - 98, // [98:98] is the sub-list for method input_type - 98, // [98:98] is the sub-list for extension type_name - 98, // [98:98] is the sub-list for extension extendee - 0, // [0:98] is the sub-list for field type_name + 69, // 91: model.Route.turnouts:type_name -> model.Route.TurnoutPosition + 25, // 92: model.Pipe.portA:type_name -> model.DevicePort + 25, // 93: model.Pipe.portB:type_name -> model.DevicePort + 12, // 94: model.AirPavilion.pavilionType:type_name -> model.AirPavilion.Type + 13, // 95: model.Valve.valveType:type_name -> model.Valve.Type + 14, // 96: model.Fan.fanType:type_name -> model.Fan.Type + 97, // [97:97] is the sub-list for method output_type + 97, // [97:97] is the sub-list for method input_type + 97, // [97:97] is the sub-list for extension type_name + 97, // [97:97] is the sub-list for extension extendee + 0, // [0:97] is the sub-list for field type_name } func init() { file_model_proto_init() } @@ -6952,7 +6901,7 @@ func file_model_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_model_proto_rawDesc, - NumEnums: 16, + NumEnums: 15, NumMessages: 55, NumExtensions: 0, NumServices: 0, diff --git a/repository/repository_iscs.go b/repository/repository_iscs.go index d7c1f3b..0ce1105 100644 --- a/repository/repository_iscs.go +++ b/repository/repository_iscs.go @@ -6,7 +6,7 @@ import "joylink.club/rtsssimulation/repository/model/proto" func buildIscsModels(source *proto.Repository, repository *Repository) error { //ISCS管线 for _, protoData := range source.Pipes { - m := NewPipe(protoData.Id, protoData.Code, protoData.PipeType) + m := NewPipe(protoData.Id, protoData.Code) repository.PipeMap[m.Id()] = m } //ISCS管件 @@ -46,7 +46,7 @@ func buildIscsModels(source *proto.Repository, repository *Repository) error { } //ISCS电源 for _, protoData := range source.PowerSources { - m := NewPowerSource(protoData.Id, protoData.Code, protoData.Ac, protoData.Voltage) + m := NewPowerSource(protoData.Id, protoData.Code, protoData.Voltage, protoData.Sx, protoData.Ac) repository.PowerSourceMap[m.Id()] = m } //ISCS避雷器 diff --git a/sys/iscs_sys/iscs_bas_fluid.go b/sys/iscs_sys/iscs_bas_fluid.go index 218d196..62f0a33 100644 --- a/sys/iscs_sys/iscs_bas_fluid.go +++ b/sys/iscs_sys/iscs_bas_fluid.go @@ -23,7 +23,7 @@ type FluidDriverSystem struct { func NewFluidDriverSystem() *FluidDriverSystem { return &FluidDriverSystem{ query: ecs.NewQuery(filter.Contains(component.UidType, component.FluidDriverType)), - queryFluidPipe: ecs.NewQuery(filter.Contains(component.UidType, component.FluidPipeType)), + queryFluidPipe: ecs.NewQuery(filter.Contains(component.UidType, component.PipeFluidType)), } } @@ -38,125 +38,7 @@ func (s *FluidDriverSystem) findFluidPath(fromDevice repository.Identity, fromDe return sp } func (s *FluidDriverSystem) Update(w ecs.World) { - wd := entity.GetWorldData(w) - s.query.Each(w, func(entry *ecs.Entry) { - fdId := component.UidType.Get(entry).Id - fd := component.FluidDriverType.Get(entry) - fluidDriverOn := fd.On - fdModel := wd.Repo.FindById(fdId) - if fdModel == nil { - fmt.Printf("==>>FluidDriver[%s]模型不存在\n", fdId) - } else { - switch fdModel.Type() { - case proto.DeviceType_DeviceType_Fan: //风机 - { - fanModel := fdModel.(*repository.Fan) - fanOutPort := *fanModel.PortA - fanInPort := *fanModel.PortB - fanOutPath := s.findFluidPath(fanModel, fanOutPort, true) - fanInPath := s.findFluidPath(fanModel, fanInPort, false) - // - s.calculateFluid(w, fluidDriverOn, fanOutPath, fanInPath) - } - case proto.DeviceType_DeviceType_AirPavilion: //风亭,其中送风亭为动力源 - { - apModel := fdModel.(*repository.AirPavilion) - if apModel.PavilionType == proto.AirPavilion_AirSupplyPavilion { - apOutPort := *apModel.PortA - apOutPath := s.findFluidPath(apModel, apOutPort, true) - s.calculateFluid(w, fluidDriverOn, apOutPath, nil) - } - } - } - } - }) - // - s.queryFluidPipe.Each(w, func(entry *ecs.Entry) { - pipe := component.FluidPipeType.Get(entry) - if len(pipe.Sources) > 0 { - directionAb := int8(0) - for _, ps := range pipe.Sources { - if ps.Direction.IsFlowAb() { - directionAb++ - } - if ps.Direction.IsFlowBa() { - directionAb-- - } - } - if directionAb > 0 { - pipe.Direction = component.PipeFlowAb - } else if directionAb < 0 { - pipe.Direction = component.PipeFlowBa - } else { - pipe.Direction = component.PipeFlowNon - } - } else { - pipe.Direction = component.PipeFlowNon - pipe.FlowSpeed = 0 - } - }) -} -// 计算流体在管线中的流动参数 -func (s *FluidDriverSystem) calculateFluid(w ecs.World, fluidDriverOn bool, outPath []*SearchedPath, inPath []*SearchedPath) { - for _, out := range outPath { - s.clearFluidPathSources(w, out) - } - for _, in := range inPath { - s.clearFluidPathSources(w, in) - } - // - if fluidDriverOn { - var validOutPath, validInPath []*SearchedPath - for _, out := range outPath { - if s.isFluidPathUnblocked(out, w) { - validOutPath = append(validOutPath, out) - } - } - for _, in := range inPath { - if s.isFluidPathUnblocked(in, w) { - validInPath = append(validInPath, in) - } - } - isValid := len(outPath) > 0 && len(inPath) > 0 && len(validInPath) > 0 && len(validOutPath) > 0 || len(outPath) > 0 && len(inPath) == 0 && len(inPath) > 0 - if isValid { - wd := entity.GetWorldData(w) - for _, outSp := range validOutPath { - for _, outPipe := range outSp.ViaPipes { - pipeEntry := wd.EntityMap[outPipe.Device().Id()] - fluidPipe := component.FluidPipeType.Get(pipeEntry) - fluidPipe.Sources = append(fluidPipe.Sources, &component.SourceFlow{Direction: convertFlowDirection(outPipe)}) - } - } - for _, inSp := range validInPath { - for _, inPipe := range inSp.ViaPipes { - pipeEntry := wd.EntityMap[inPipe.Device().Id()] - fluidPipe := component.FluidPipeType.Get(pipeEntry) - fluidPipe.Sources = append(fluidPipe.Sources, &component.SourceFlow{Direction: convertFlowDirection(inPipe)}) - } - } - } - } -} -func convertFlowDirection(sp repository.PipePort) component.PipeFlowDirection { - switch sp.Port() { - case proto.Port_A: - return component.PipeFlowAb - case proto.Port_B: - return component.PipeFlowBa - default: - return component.PipeFlowNon - } -} - -// 清空管线流体源 -func (s *FluidDriverSystem) clearFluidPathSources(w ecs.World, path *SearchedPath) { - wd := entity.GetWorldData(w) - for _, pipe := range path.ViaPipes { - pipeEntry := wd.EntityMap[pipe.Device().Id()] - fluidPipe := component.FluidPipeType.Get(pipeEntry) - fluidPipe.Sources = fluidPipe.Sources[0:0] - } } // 判断路径是否畅通 diff --git a/sys/iscs_sys/iscs_pscada_circuit_breaker.go b/sys/iscs_sys/iscs_pscada_circuit_breaker.go index f468522..9dd1c55 100644 --- a/sys/iscs_sys/iscs_pscada_circuit_breaker.go +++ b/sys/iscs_sys/iscs_pscada_circuit_breaker.go @@ -46,10 +46,17 @@ func towPipePortsTransPower( breakerPortB *repository.PipePort) { //断路器A端连接的管线 breakerPortAPipeEntry := wd.EntityMap[breakerPortA.Device().Id()] - breakerPortAPipe := component.PowerPipeType.Get(breakerPortAPipeEntry) + if !breakerPortAPipeEntry.HasComponent(component.PipeElectricityType) { + breakerPortAPipeEntry.AddComponent(component.PipeElectricityType) + } + breakerPortAPipe := component.PipeElectricityType.Get(breakerPortAPipeEntry) //断路器B端连接的管线 breakerPortBPipeEntry := wd.EntityMap[breakerPortB.Device().Id()] - breakerPortBPipe := component.PowerPipeType.Get(breakerPortBPipeEntry) + if !breakerPortBPipeEntry.HasComponent(component.PipeElectricityType) { + breakerPortBPipeEntry.AddComponent(component.PipeElectricityType) + } + breakerPortBPipe := component.PipeElectricityType.Get(breakerPortBPipeEntry) + //A->B for portAPipePsId, portAPipePs := range breakerPortAPipe.Sources { //A portBPipePs, ok := breakerPortBPipe.Sources[portAPipePsId] //B @@ -58,15 +65,15 @@ func towPipePortsTransPower( *breakerPortBPipe.Sources[portAPipePsId] = *portAPipePs breakerPortBPipe.Sources[portAPipePsId].Fresh -= 1 if !closed { - breakerPortBPipe.Sources[portAPipePsId].Voltage = 0 + breakerPortBPipe.Sources[portAPipePsId].SetOut0() } } } else { - breakerPortBPipe.Sources[portAPipePsId] = &component.ElePower{} + breakerPortBPipe.Sources[portAPipePsId] = component.NewElectricitySource() *breakerPortBPipe.Sources[portAPipePsId] = *portAPipePs breakerPortBPipe.Sources[portAPipePsId].Fresh -= 1 if !closed { - breakerPortBPipe.Sources[portAPipePsId].Voltage = 0 + breakerPortBPipe.Sources[portAPipePsId].SetOut0() } } } @@ -78,15 +85,15 @@ func towPipePortsTransPower( *breakerPortAPipe.Sources[portBPipePsId] = *portBPipePs breakerPortAPipe.Sources[portBPipePsId].Fresh -= 1 if !closed { - breakerPortAPipe.Sources[portBPipePsId].Voltage = 0 + breakerPortAPipe.Sources[portBPipePsId].SetOut0() } } } else { - breakerPortAPipe.Sources[portBPipePsId] = &component.ElePower{} + breakerPortAPipe.Sources[portBPipePsId] = component.NewElectricitySource() *breakerPortAPipe.Sources[portBPipePsId] = *portBPipePs breakerPortAPipe.Sources[portBPipePsId].Fresh -= 1 if !closed { - breakerPortAPipe.Sources[portBPipePsId].Voltage = 0 + breakerPortAPipe.Sources[portBPipePsId].SetOut0() } } } diff --git a/sys/iscs_sys/iscs_pscada_earthing_device.go b/sys/iscs_sys/iscs_pscada_earthing_device.go index 85109ba..8d7b442 100644 --- a/sys/iscs_sys/iscs_pscada_earthing_device.go +++ b/sys/iscs_sys/iscs_pscada_earthing_device.go @@ -28,10 +28,13 @@ func (s *EarthingDeviceSystem) Update(w ecs.World) { edModel := (wd.Repo.FindById(edId)).(*repository.EarthingDevice) if edModel.PortA != nil { edPipeEntry := wd.EntityMap[edModel.PortA.Device().Id()] - edPipe := component.PowerPipeType.Get(edPipeEntry) - ed.Voltage = edPipe.Voltage + if !edPipeEntry.HasComponent(component.PipeElectricityType) { + edPipeEntry.AddComponent(component.PipeElectricityType) + } + edPipe := component.PipeElectricityType.Get(edPipeEntry) + ed.Voltage = edPipe.U } else { - ed.Voltage = 1 //零电压 + ed.Voltage = 0 //零电压 } }) } diff --git a/sys/iscs_sys/iscs_pscada_pipe_fitting.go b/sys/iscs_sys/iscs_pscada_pipe_fitting.go index 2c6c1bd..1539012 100644 --- a/sys/iscs_sys/iscs_pscada_pipe_fitting.go +++ b/sys/iscs_sys/iscs_pscada_pipe_fitting.go @@ -1,9 +1,12 @@ package iscs_sys import ( + "fmt" "joylink.club/ecs" "joylink.club/rtsssimulation/component" "joylink.club/rtsssimulation/entity" + "joylink.club/rtsssimulation/repository" + "log/slog" ) type PipeFittingSystem struct { @@ -13,47 +16,128 @@ func NewPipeFittingSystem() *PipeFittingSystem { return &PipeFittingSystem{} } -// Update 母线管件电能传递 +// Update in world func (s *PipeFittingSystem) Update(w ecs.World) { wd := entity.GetWorldData(w) for _, pf := range wd.Repo.PipeFittingMap { - if pf.IsEle() { - //与管件连接的所有管线 - pipes := pf.Ports() + if s.initPipeFitting(wd, pf) && s.isPipeFittingEle(wd, pf) { //筛选出相对电源 - pipePsMap := make(map[string]*component.ElePower) - for _, pipePort := range pipes { - pipeEntry := wd.EntityMap[pipePort.Device().Id()] - powerPipe := component.PowerPipeType.Get(pipeEntry) - for epId, ep := range powerPipe.Sources { - pipePs, ok := pipePsMap[epId] - if ok { - if ep.Fresh > pipePs.Fresh { - pipePsMap[epId] = ep - } - } else { + pipePsMap := s.findEleSourcePipe(wd, pf) + //管件连接的管线间电能传递 + s.transEle(wd, pf, pipePsMap) + } + } +} + +// 筛选出相对电源 +func (s *PipeFittingSystem) findEleSourcePipe(wd *component.WorldData, pf *repository.PipeFitting) map[string]*component.ElectricitySource { + //筛选出相对电源 + pipePsMap := make(map[string]*component.ElectricitySource) + for _, pipePort := range pf.Ports() { + pipeEntry := wd.EntityMap[pipePort.Device().Id()] + if pipeEntry.HasComponent(component.PipeElectricityType) { + powerPipe := component.PipeElectricityType.Get(pipeEntry) + for epId, ep := range powerPipe.Sources { + pipePs, ok := pipePsMap[epId] + if ok { + if ep.Fresh > pipePs.Fresh { pipePsMap[epId] = ep } - } - } - //管件连接的管线间电能传递 - for _, pipePort := range pipes { - for pipePsId, pipePs := range pipePsMap { //相对电源 - pipeEntry := wd.EntityMap[pipePort.Device().Id()] - powerPipe := component.PowerPipeType.Get(pipeEntry) - pipePortPs, ok := powerPipe.Sources[pipePsId] - if ok { - if pipePs.Fresh > pipePortPs.Fresh { - *powerPipe.Sources[pipePsId] = *pipePs - powerPipe.Sources[pipePsId].Fresh -= 1 //保证相对性 - } - } else { - powerPipe.Sources[pipePsId] = &component.ElePower{} - *powerPipe.Sources[pipePsId] = *pipePs - powerPipe.Sources[pipePsId].Fresh -= 1 //保证相对性 - } + } else { + pipePsMap[epId] = ep } } } } + return pipePsMap +} + +// 管件连接的管线间电能传递 +func (s *PipeFittingSystem) transEle(wd *component.WorldData, pf *repository.PipeFitting, pipePsMap map[string]*component.ElectricitySource) { + for _, pipePort := range pf.Ports() { + for pipePsId, pipePs := range pipePsMap { //相对电源 + pipeEntry := wd.EntityMap[pipePort.Device().Id()] + powerPipe := component.PipeElectricityType.Get(pipeEntry) + pipePortPs, ok := powerPipe.Sources[pipePsId] + if ok { + if pipePs.Fresh > pipePortPs.Fresh { + *powerPipe.Sources[pipePsId] = *pipePs + powerPipe.Sources[pipePsId].Fresh -= 1 //保证相对性 + } + } else { + powerPipe.Sources[pipePsId] = &component.ElectricitySource{} + *powerPipe.Sources[pipePsId] = *pipePs + powerPipe.Sources[pipePsId].Fresh -= 1 //保证相对性 + } + } + } +} + +// 判断该管件是否为连接电线 +func (s *PipeFittingSystem) isPipeFittingEle(wd *component.WorldData, pf *repository.PipeFitting) bool { + for _, pipePort := range pf.Ports() { + pipeEntry := wd.EntityMap[pipePort.Device().Id()] + pipe := component.PipeType.Get(pipeEntry) + if pipe.Matter.IsEle() { + return true + } + } + return false +} + +// 由于初始的管线是无性质的,现根据管件的某个已有性质的管线来初始化管件其他的管线 +func (s *PipeFittingSystem) initPipeFitting(wd *component.WorldData, pf *repository.PipeFitting) bool { + pipeMatter := component.PmtNon + for _, pipePort := range pf.Ports() { + pipeEntry := wd.EntityMap[pipePort.Device().Id()] + pipe := component.PipeType.Get(pipeEntry) + if !pipe.Matter.IsNon() { + pipeMatter = pipe.Matter + break + } + } + // + if pipeMatter.IsNon() { + return false + } + // + for _, pipePort := range pf.Ports() { + pipeEntry := wd.EntityMap[pipePort.Device().Id()] + pipe := component.PipeType.Get(pipeEntry) + pipe.Matter = pipeMatter + switch pipe.Matter { + case component.PmtElectricity: + { + if !pipeEntry.HasComponent(component.PipeElectricityType) { + pipeEntry.AddComponent(component.PipeElectricityType) + component.PipeElectricityType.Set(pipeEntry, component.NewPipeElectricity()) + } + } + case component.PmtAir: + fallthrough + case component.PmtOil: + fallthrough + case component.PmtSmoke: + fallthrough + case component.PmtWater: + { + if !pipeEntry.HasComponent(component.PipeFluidType) { + pipeEntry.AddComponent(component.PipeFluidType) + component.PipeFluidType.Set(pipeEntry, component.NewPipeFluid()) + } + } + default: + slog.Warn(fmt.Sprintf("PipeFittingSystem.initPipeFitting 未处理的管道物质[%d]", pipe.Matter)) + } + } + // + return true +} + +// 从电线实体获取电线 +func getPipeElectricity(pipeEntry *ecs.Entry) *component.PipeElectricity { + if !pipeEntry.HasComponent(component.PipeElectricityType) { + pipeEntry.AddComponent(component.PipeElectricityType) + } + return component.PipeElectricityType.Get(pipeEntry) } diff --git a/sys/iscs_sys/iscs_pscada_power_pipe.go b/sys/iscs_sys/iscs_pscada_power_pipe.go index a49ecfc..f240c34 100644 --- a/sys/iscs_sys/iscs_pscada_power_pipe.go +++ b/sys/iscs_sys/iscs_pscada_power_pipe.go @@ -6,30 +6,34 @@ import ( "joylink.club/rtsssimulation/component" ) +// PowerPipeSystem 电力 type PowerPipeSystem struct { query *ecs.Query } func NewPowerPipeSystem() *PowerPipeSystem { return &PowerPipeSystem{ - query: ecs.NewQuery(filter.Contains(component.PowerPipeType)), + query: ecs.NewQuery(filter.Contains(component.PipeElectricityType)), } } -// Update 电力母线中电力计算 +// Update 电线中电力计算 func (s *PowerPipeSystem) Update(w ecs.World) { s.query.Each(w, func(entry *ecs.Entry) { - pipe := component.PowerPipeType.Get(entry) + pipe := component.PipeElectricityType.Get(entry) voltage := uint32(0) ac := false + sx := false for _, power := range pipe.Sources { - if power.Voltage > voltage { - voltage = power.Voltage + if power.U > voltage { + voltage = power.U ac = power.Ac + sx = power.Sx } } // - pipe.Voltage = voltage + pipe.U = voltage pipe.Ac = ac + pipe.Sx = sx }) } diff --git a/sys/iscs_sys/iscs_pscada_power_souce.go b/sys/iscs_sys/iscs_pscada_power_souce.go index 0b78a6e..57d1902 100644 --- a/sys/iscs_sys/iscs_pscada_power_souce.go +++ b/sys/iscs_sys/iscs_pscada_power_souce.go @@ -9,26 +9,43 @@ import ( "time" ) +// PowerSourceSystem 国网 type PowerSourceSystem struct { query *ecs.Query } func NewPowerSourceSystem() *PowerSourceSystem { return &PowerSourceSystem{ - query: ecs.NewQuery(filter.Contains(component.UidType, component.PowerSourceType)), + query: ecs.NewQuery(filter.Contains(component.UidType, component.ElectricitySourceType)), } } func (s *PowerSourceSystem) Update(w ecs.World) { wd := entity.GetWorldData(w) s.query.Each(w, func(entry *ecs.Entry) { psId := component.UidType.Get(entry).Id - ps := component.PowerSourceType.Get(entry) + ps := component.ElectricitySourceType.Get(entry) // psModel := (wd.Repo.FindById(psId)).(*repository.PowerSource) pipeId := psModel.PortA.Device().Id() + // + ps.Fresh = time.Now().UnixMilli() + ps.Sx = psModel.Sx + ps.Ac = psModel.Ac + ps.U = psModel.Voltage //电源传递电力给母线 - pipeEntry := wd.EntityMap[pipeId] - powerPipe := component.PowerPipeType.Get(pipeEntry) - powerPipe.TransPower(psId, &component.ElePower{Ac: ps.Ac, Voltage: ps.Voltage, Fresh: time.Now().UnixMilli()}) + s.transPower(wd, pipeId, ps, psId) }) } + +func (s *PowerSourceSystem) transPower(wd *component.WorldData, pipeId string, ps *component.ElectricitySource, psId string) { + pipeEntry := wd.EntityMap[pipeId] + if !pipeEntry.HasComponent(component.PipeElectricityType) { + pipeEntry.AddComponent(component.PipeElectricityType) + component.PipeElectricityType.Set(pipeEntry, component.NewPipeElectricity()) + } + pipe := component.PipeType.Get(pipeEntry) + pipe.Matter = component.PmtElectricity + // + powerPipe := component.PipeElectricityType.Get(pipeEntry) + powerPipe.TransPower(psId, ps) +} diff --git a/sys/iscs_sys/iscs_pscada_rectifier.go b/sys/iscs_sys/iscs_pscada_rectifier.go index dffcee9..4de16c7 100644 --- a/sys/iscs_sys/iscs_pscada_rectifier.go +++ b/sys/iscs_sys/iscs_pscada_rectifier.go @@ -45,24 +45,25 @@ func (s *RectifierSystem) rectifierTransPower(wd *component.WorldData, entry *ec portF := rectifierModel.PortD //直负 // portLPipeEntry := wd.EntityMap[portL.Device().Id()] - portLPipe := component.PowerPipeType.Get(portLPipeEntry) + portLPipe := component.PipeElectricityType.Get(portLPipeEntry) // portZPipeEntry := wd.EntityMap[portZ.Device().Id()] - portZPipe := component.PowerPipeType.Get(portZPipeEntry) + portZPipe := component.PipeElectricityType.Get(portZPipeEntry) portFPipeEntry := wd.EntityMap[portF.Device().Id()] - portFPipe := component.PowerPipeType.Get(portFPipeEntry) + portFPipe := component.PipeElectricityType.Get(portFPipeEntry) //L->Z、F for lpsId, lps := range portLPipe.Sources { if lps.Ac { - dcVoltage := uint32(float64(lps.Voltage) * 0.9) //交流电压转直流电压 + dcVoltage := uint32(float64(lps.U) * 0.9) //交流电压转直流电压 //L->Z zps, zpsOk := portZPipe.Sources[lpsId] if zpsOk { - zps.Voltage = dcVoltage + zps.U = dcVoltage zps.Fresh = lps.Fresh - 1 zps.Ac = false + zps.Sx = false } else { - portZPipe.Sources[lpsId] = &component.ElePower{Ac: false, Voltage: dcVoltage, Fresh: lps.Fresh - 1} + portZPipe.Sources[lpsId] = &component.ElectricitySource{Ac: false, Sx: false, U: dcVoltage, Fresh: lps.Fresh - 1} } //L->F fps, fpsOk := portFPipe.Sources[lpsId] @@ -71,11 +72,12 @@ func (s *RectifierSystem) rectifierTransPower(wd *component.WorldData, entry *ec dcFVoltage = 1 } if fpsOk { - fps.Voltage = dcFVoltage + fps.U = dcFVoltage fps.Fresh = lps.Fresh - 1 fps.Ac = false + fps.Sx = false } else { - portFPipe.Sources[lpsId] = &component.ElePower{Ac: false, Voltage: dcFVoltage, Fresh: lps.Fresh - 1} + portFPipe.Sources[lpsId] = &component.ElectricitySource{Ac: false, Sx: false, U: dcFVoltage, Fresh: lps.Fresh - 1} } } } diff --git a/sys/iscs_sys/iscs_pscada_voltage_transformer.go b/sys/iscs_sys/iscs_pscada_voltage_transformer.go index 4f3232e..250aea9 100644 --- a/sys/iscs_sys/iscs_pscada_voltage_transformer.go +++ b/sys/iscs_sys/iscs_pscada_voltage_transformer.go @@ -37,49 +37,48 @@ func (s *VoltageTransformerSystem) voltageTransformerTransPower(wd *component.Wo // vtPortA := vtModel.PortA vtPortAEntry := wd.EntityMap[vtPortA.Device().Id()] - vtPortAPipe := component.PowerPipeType.Get(vtPortAEntry) //变压器一次侧连接的管线 + vtPortAPipe := getPipeElectricity(vtPortAEntry) //变压器一次侧连接的管线 // - var vtPortBPipe *component.PowerPipe = nil + var vtPortBPipe *component.PipeElectricity = nil if vtModel.PortB != nil { vtPortB := vtModel.PortB vtPortBEntry := wd.EntityMap[vtPortB.Device().Id()] - vtPortBPipe = component.PowerPipeType.Get(vtPortBEntry) + vtPortBPipe = getPipeElectricity(vtPortBEntry) } // - var vtPortCPipe *component.PowerPipe = nil + var vtPortCPipe *component.PipeElectricity = nil if vtModel.PortC != nil { vtPortC := vtModel.PortC vtPortCEntry := wd.EntityMap[vtPortC.Device().Id()] - vtPortCPipe = component.PowerPipeType.Get(vtPortCEntry) + vtPortCPipe = getPipeElectricity(vtPortCEntry) } //变压比 rate := float64(vtModel.E2) / float64(vtModel.E1) //A->B、C ,电能从一次侧向二次侧传递 for psId, ps := range vtPortAPipe.Sources { //二次侧输出电压 - outV := uint32(rate * float64(ps.Voltage)) + outV := uint32(rate * float64(ps.U)) if vtPortBPipe != nil { //二次侧火线 portBPs, ok := vtPortBPipe.Sources[psId] if ok { - portBPs.Voltage = outV + portBPs.U = outV portBPs.Ac = ps.Ac + portBPs.Sx = ps.Sx portBPs.Fresh = ps.Fresh - 1 } else { - vtPortBPipe.Sources[psId] = &component.ElePower{Ac: ps.Ac, Voltage: outV, Fresh: ps.Fresh - 1} + vtPortBPipe.Sources[psId] = &component.ElectricitySource{Ac: ps.Ac, Sx: ps.Sx, U: outV, Fresh: ps.Fresh - 1} } } if vtPortCPipe != nil { //二次侧零线 portCPs, ok := vtPortCPipe.Sources[psId] cV := uint32(0) - if outV > 0 { //当二次火线电压大于零时,二次侧零线电压值1表示零电位 - cV = 1 - } if ok { - portCPs.Voltage = cV + portCPs.U = cV portCPs.Ac = ps.Ac + portCPs.Sx = ps.Sx portCPs.Fresh = ps.Fresh - 1 } else { - vtPortCPipe.Sources[psId] = &component.ElePower{Ac: ps.Ac, Voltage: cV, Fresh: ps.Fresh - 1} + vtPortCPipe.Sources[psId] = &component.ElectricitySource{Ac: ps.Ac, Sx: ps.Sx, U: cV, Fresh: ps.Fresh - 1} } } }