diff --git a/CHANGELOG.md b/CHANGELOG.md index bfcc6ee638..42579efa21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ For details about compatibility between different releases, see the **Commitment ### Added +- `Count` RPC on `EndDeviceRegistry` to efficiently retrieve the number of end devices in an application. - Add tracing for LBS LNS and TTIGW protocol handlers. - TTGC LBS Root CUPS claiming support. - Configurable Identity Server user login session TTL via `is.user-login.session-ttl`: diff --git a/api/ttn/lorawan/v3/api.md b/api/ttn/lorawan/v3/api.md index 8297298327..3ebfd22216 100644 --- a/api/ttn/lorawan/v3/api.md +++ b/api/ttn/lorawan/v3/api.md @@ -249,6 +249,8 @@ - [Message `BatchUpdateEndDeviceLastSeenRequest.EndDeviceLastSeenUpdate`](#ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.EndDeviceLastSeenUpdate) - [Message `BoolValue`](#ttn.lorawan.v3.BoolValue) - [Message `ConvertEndDeviceTemplateRequest`](#ttn.lorawan.v3.ConvertEndDeviceTemplateRequest) + - [Message `CountEndDevicesRequest`](#ttn.lorawan.v3.CountEndDevicesRequest) + - [Message `CountEndDevicesResponse`](#ttn.lorawan.v3.CountEndDevicesResponse) - [Message `CreateEndDeviceRequest`](#ttn.lorawan.v3.CreateEndDeviceRequest) - [Message `DevAddrPrefix`](#ttn.lorawan.v3.DevAddrPrefix) - [Message `EndDevice`](#ttn.lorawan.v3.EndDevice) @@ -3984,6 +3986,25 @@ Configuration options for static ADR. | ----- | ----------- | | `format_id` |
`string.max_len`: `36`
`string.pattern`: `^[a-z0-9](?:[-]?[a-z0-9]){2,}$`
| +### Message `CountEndDevicesRequest` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `application_ids` | [`ApplicationIdentifiers`](#ttn.lorawan.v3.ApplicationIdentifiers) | | | +| `filters` | [`ListEndDevicesRequest.Filter`](#ttn.lorawan.v3.ListEndDevicesRequest.Filter) | repeated | | + +#### Field Rules + +| Field | Validations | +| ----- | ----------- | +| `application_ids` |`message.required`: `true`
| + +### Message `CountEndDevicesResponse` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `count` | [`uint64`](#uint64) | | | + ### Message `CreateEndDeviceRequest` | Field | Type | Label | Description | @@ -4854,6 +4875,7 @@ NsEndDeviceRegistry, the AsEndDeviceRegistry and the JsEndDeviceRegistry. | `Get` | [`GetEndDeviceRequest`](#ttn.lorawan.v3.GetEndDeviceRequest) | [`EndDevice`](#ttn.lorawan.v3.EndDevice) | Get the end device with the given identifiers, selecting the fields specified in the field mask. More or less fields may be returned, depending on the rights of the caller. | | `GetIdentifiersForEUIs` | [`GetEndDeviceIdentifiersForEUIsRequest`](#ttn.lorawan.v3.GetEndDeviceIdentifiersForEUIsRequest) | [`EndDeviceIdentifiers`](#ttn.lorawan.v3.EndDeviceIdentifiers) | Get the identifiers of the end device that has the given EUIs registered. | | `List` | [`ListEndDevicesRequest`](#ttn.lorawan.v3.ListEndDevicesRequest) | [`EndDevices`](#ttn.lorawan.v3.EndDevices) | List end devices in the given application. Similar to Get, this selects the fields given by the field mask. More or less fields may be returned, depending on the rights of the caller. | +| `Count` | [`CountEndDevicesRequest`](#ttn.lorawan.v3.CountEndDevicesRequest) | [`CountEndDevicesResponse`](#ttn.lorawan.v3.CountEndDevicesResponse) | Count end devices in the given application. | | `Update` | [`UpdateEndDeviceRequest`](#ttn.lorawan.v3.UpdateEndDeviceRequest) | [`EndDevice`](#ttn.lorawan.v3.EndDevice) | Update the end device, changing the fields specified by the field mask to the provided values. | | `BatchUpdateLastSeen` | [`BatchUpdateEndDeviceLastSeenRequest`](#ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest) | [`.google.protobuf.Empty`](#google.protobuf.Empty) | Update the last seen timestamp for a batch of end devices. | | `Delete` | [`EndDeviceIdentifiers`](#ttn.lorawan.v3.EndDeviceIdentifiers) | [`.google.protobuf.Empty`](#google.protobuf.Empty) | Delete the end device with the given IDs. Before deleting an end device it first needs to be deleted from the NsEndDeviceRegistry, the AsEndDeviceRegistry and the JsEndDeviceRegistry. In addition, if the device claimed on a Join Server, it also needs to be unclaimed via the DeviceClaimingServer so it can be claimed in the future. This is NOT done automatically. | @@ -4866,6 +4888,7 @@ NsEndDeviceRegistry, the AsEndDeviceRegistry and the JsEndDeviceRegistry. | `Get` | `GET` | `/api/v3/applications/{end_device_ids.application_ids.application_id}/devices/{end_device_ids.device_id}` | | | `List` | `GET` | `/api/v3/applications/{application_ids.application_id}/devices` | | | `List` | `POST` | `/api/v3/applications/{application_ids.application_id}/devices/filter` | `*` | +| `Count` | `GET` | `/api/v3/applications/{application_ids.application_id}/devices/count` | | | `Update` | `PUT` | `/api/v3/applications/{end_device.ids.application_ids.application_id}/devices/{end_device.ids.device_id}` | `*` | | `Delete` | `DELETE` | `/api/v3/applications/{application_ids.application_id}/devices/{device_id}` | | diff --git a/api/ttn/lorawan/v3/api.swagger.json b/api/ttn/lorawan/v3/api.swagger.json index c0b32bd1c3..95929100a9 100644 --- a/api/ttn/lorawan/v3/api.swagger.json +++ b/api/ttn/lorawan/v3/api.swagger.json @@ -1185,6 +1185,37 @@ ] } }, + "/applications/{application_ids.application_id}/devices/count": { + "get": { + "summary": "Count end devices in the given application.", + "operationId": "EndDeviceRegistry_Count", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v3CountEndDevicesResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "application_ids.application_id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "EndDeviceRegistry" + ] + } + }, "/applications/{application_ids.application_id}/devices/filter": { "post": { "summary": "List end devices in the given application.\nSimilar to Get, this selects the fields given by the field mask.\nMore or less fields may be returned, depending on the rights of the caller.", @@ -22870,6 +22901,15 @@ } } }, + "v3CountEndDevicesResponse": { + "type": "object", + "properties": { + "count": { + "type": "string", + "format": "uint64" + } + } + }, "v3CreateLoginTokenResponse": { "type": "object", "properties": { diff --git a/api/ttn/lorawan/v3/end_device.proto b/api/ttn/lorawan/v3/end_device.proto index 0202b0b2be..3be6a6fefd 100644 --- a/api/ttn/lorawan/v3/end_device.proto +++ b/api/ttn/lorawan/v3/end_device.proto @@ -1346,6 +1346,15 @@ message ListEndDevicesRequest { repeated Filter filters = 6; } +message CountEndDevicesRequest { + ApplicationIdentifiers application_ids = 1 [(validate.rules).message.required = true]; + repeated ListEndDevicesRequest.Filter filters = 2; +} + +message CountEndDevicesResponse { + uint64 count = 1; +} + message SetEndDeviceRequest { EndDevice end_device = 1 [(validate.rules).message.required = true]; // The names of the end device fields that should be updated. diff --git a/api/ttn/lorawan/v3/end_device_services.proto b/api/ttn/lorawan/v3/end_device_services.proto index 695a494d16..770a45ff71 100644 --- a/api/ttn/lorawan/v3/end_device_services.proto +++ b/api/ttn/lorawan/v3/end_device_services.proto @@ -72,6 +72,11 @@ service EndDeviceRegistry { }; } + // Count end devices in the given application. + rpc Count(CountEndDevicesRequest) returns (CountEndDevicesResponse) { + option (google.api.http) = {get: "/applications/{application_ids.application_id}/devices/count"}; + } + // Update the end device, changing the fields specified by the field mask to the provided values. rpc Update(UpdateEndDeviceRequest) returns (EndDevice) { option (google.api.http) = { diff --git a/pkg/identityserver/bunstore/end_device_store.go b/pkg/identityserver/bunstore/end_device_store.go index 6a5d682720..af282ca7f5 100644 --- a/pkg/identityserver/bunstore/end_device_store.go +++ b/pkg/identityserver/bunstore/end_device_store.go @@ -439,7 +439,9 @@ func (s *endDeviceStore) CountEndDevices(ctx context.Context, ids *ttnpb.Applica by = s.selectWithID(ctx, ids.GetApplicationId()) } - selectQuery := s.newSelectModel(ctx, &EndDevice{}).Apply(by) + selectQuery := s.newSelectModel(ctx, &EndDevice{}). + Apply(by). + Apply(selectWithFilterFromContext(ctx)) // Count the total number of results. count, err := selectQuery.Count(ctx) diff --git a/pkg/identityserver/end_device_registry.go b/pkg/identityserver/end_device_registry.go index 499fa17541..a89b12fbad 100644 --- a/pkg/identityserver/end_device_registry.go +++ b/pkg/identityserver/end_device_registry.go @@ -332,6 +332,34 @@ func (is *IdentityServer) listEndDevices(ctx context.Context, req *ttnpb.ListEnd return devs, nil } +func (is *IdentityServer) countEndDevices( + ctx context.Context, req *ttnpb.CountEndDevicesRequest, +) (*ttnpb.CountEndDevicesResponse, error) { + if err := rights.RequireApplication( + ctx, req.GetApplicationIds(), ttnpb.Right_RIGHT_APPLICATION_DEVICES_READ, + ); err != nil { + return nil, err + } + if req.Filters != nil { + for _, filter := range req.Filters { + if _, ok := filter.GetField().(*ttnpb.ListEndDevicesRequest_Filter_UpdatedSince); ok { + ctx = store.WithFilter(ctx, "updated_at", filter.GetUpdatedSince().AsTime().Format(time.RFC3339Nano)) + } + } + } + var count uint64 + err := is.store.Transact(ctx, func(ctx context.Context, st store.Store) (err error) { + count, err = st.CountEndDevices(ctx, req.GetApplicationIds()) + return err + }) + if err != nil { + return nil, err + } + return &ttnpb.CountEndDevicesResponse{ + Count: count, + }, nil +} + func (is *IdentityServer) setFullEndDevicePictureURL(ctx context.Context, dev *ttnpb.EndDevice) { bucketURL := is.configFromContext(ctx).EndDevicePicture.BucketURL if bucketURL == "" { @@ -591,6 +619,12 @@ func (dr *endDeviceRegistry) Delete(ctx context.Context, req *ttnpb.EndDeviceIde return dr.deleteEndDevice(ctx, req) } +func (dr *endDeviceRegistry) Count( + ctx context.Context, req *ttnpb.CountEndDevicesRequest, +) (*ttnpb.CountEndDevicesResponse, error) { + return dr.countEndDevices(ctx, req) +} + func (reg *endDeviceBatchRegistry) Delete( ctx context.Context, req *ttnpb.BatchDeleteEndDevicesRequest, diff --git a/pkg/identityserver/end_device_registry_test.go b/pkg/identityserver/end_device_registry_test.go index ec7d6f424a..b17d425808 100644 --- a/pkg/identityserver/end_device_registry_test.go +++ b/pkg/identityserver/end_device_registry_test.go @@ -268,6 +268,113 @@ func TestEndDevicesPagination(t *testing.T) { }, withPrivateTestDatabase(p)) } +func TestEndDevicesCount(t *testing.T) { + p := &storetest.Population{} + + usr1 := p.NewUser() + app1 := p.NewApplication(usr1.GetOrganizationOrUserIdentifiers()) + for range 5 { + p.NewEndDevice(app1.GetIds()) + } + + key, _ := p.NewAPIKey(usr1.GetEntityIdentifiers(), ttnpb.Right_RIGHT_ALL) + creds := rpcCreds(key) + + readKey, _ := p.NewAPIKey(usr1.GetEntityIdentifiers(), ttnpb.Right_RIGHT_APPLICATION_DEVICES_READ) + readCreds := rpcCreds(readKey) + + t.Parallel() + a, ctx := test.New(t) + + testWithIdentityServer(t, func(_ *IdentityServer, cc *grpc.ClientConn) { + reg := ttnpb.NewEndDeviceRegistryClient(cc) + + t.Run("Permission denied without credentials", func(_ *testing.T) { // nolint:paralleltest + _, err := reg.Count(ctx, &ttnpb.CountEndDevicesRequest{ + ApplicationIds: app1.GetIds(), + }) + if a.So(err, should.NotBeNil) { + a.So(errors.IsPermissionDenied(err), should.BeTrue) + } + }) + + t.Run("Count with read credentials", func(_ *testing.T) { // nolint:paralleltest + resp, err := reg.Count(ctx, &ttnpb.CountEndDevicesRequest{ + ApplicationIds: app1.GetIds(), + }, readCreds) + if a.So(err, should.BeNil) && a.So(resp, should.NotBeNil) { + a.So(resp.Count, should.Equal, uint64(5)) + } + }) + + t.Run("Count after adding a device", func(_ *testing.T) { // nolint:paralleltest + _, err := reg.Create(ctx, &ttnpb.CreateEndDeviceRequest{ + EndDevice: &ttnpb.EndDevice{ + Ids: &ttnpb.EndDeviceIdentifiers{ + ApplicationIds: app1.GetIds(), + DeviceId: "count-test-dev", + }, + }, + }, creds) + a.So(err, should.BeNil) + + resp, err := reg.Count(ctx, &ttnpb.CountEndDevicesRequest{ + ApplicationIds: app1.GetIds(), + }, readCreds) + if a.So(err, should.BeNil) && a.So(resp, should.NotBeNil) { + a.So(resp.Count, should.Equal, uint64(6)) + } + }) + + t.Run("Count after deleting a device", func(_ *testing.T) { // nolint:paralleltest + _, err := reg.Delete(ctx, &ttnpb.EndDeviceIdentifiers{ + ApplicationIds: app1.GetIds(), + DeviceId: "count-test-dev", + }, creds) + a.So(err, should.BeNil) + + resp, err := reg.Count(ctx, &ttnpb.CountEndDevicesRequest{ + ApplicationIds: app1.GetIds(), + }, readCreds) + if a.So(err, should.BeNil) && a.So(resp, should.NotBeNil) { + a.So(resp.Count, should.Equal, uint64(5)) + } + }) + + t.Run("Count with updated_since filter", func(_ *testing.T) { // nolint:paralleltest + // Filter by 1 hour ago - all devices should match. + resp, err := reg.Count(ctx, &ttnpb.CountEndDevicesRequest{ + ApplicationIds: app1.GetIds(), + Filters: []*ttnpb.ListEndDevicesRequest_Filter{ + { + Field: &ttnpb.ListEndDevicesRequest_Filter_UpdatedSince{ + UpdatedSince: timestamppb.New(time.Now().Add(-time.Hour)), + }, + }, + }, + }, readCreds) + if a.So(err, should.BeNil) && a.So(resp, should.NotBeNil) { + a.So(resp.Count, should.Equal, uint64(5)) + } + + // Filter by now - no devices should match. + resp, err = reg.Count(ctx, &ttnpb.CountEndDevicesRequest{ + ApplicationIds: app1.GetIds(), + Filters: []*ttnpb.ListEndDevicesRequest_Filter{ + { + Field: &ttnpb.ListEndDevicesRequest_Filter_UpdatedSince{ + UpdatedSince: timestamppb.New(time.Now()), + }, + }, + }, + }, readCreds) + if a.So(err, should.BeNil) && a.So(resp, should.NotBeNil) { + a.So(resp.Count, should.Equal, uint64(0)) + } + }) + }, withPrivateTestDatabase(p)) +} + func TestEndDevicesBatchOperationsPermissions(t *testing.T) { t.Parallel() a, ctx := test.New(t) diff --git a/pkg/ttnpb/end_device.pb.go b/pkg/ttnpb/end_device.pb.go index a3e7e2b476..35bbce6cf4 100644 --- a/pkg/ttnpb/end_device.pb.go +++ b/pkg/ttnpb/end_device.pb.go @@ -3371,6 +3371,108 @@ func (x *ListEndDevicesRequest) GetFilters() []*ListEndDevicesRequest_Filter { return nil } +type CountEndDevicesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ApplicationIds *ApplicationIdentifiers `protobuf:"bytes,1,opt,name=application_ids,json=applicationIds,proto3" json:"application_ids,omitempty"` + Filters []*ListEndDevicesRequest_Filter `protobuf:"bytes,2,rep,name=filters,proto3" json:"filters,omitempty"` +} + +func (x *CountEndDevicesRequest) Reset() { + *x = CountEndDevicesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CountEndDevicesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CountEndDevicesRequest) ProtoMessage() {} + +func (x *CountEndDevicesRequest) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CountEndDevicesRequest.ProtoReflect.Descriptor instead. +func (*CountEndDevicesRequest) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{26} +} + +func (x *CountEndDevicesRequest) GetApplicationIds() *ApplicationIdentifiers { + if x != nil { + return x.ApplicationIds + } + return nil +} + +func (x *CountEndDevicesRequest) GetFilters() []*ListEndDevicesRequest_Filter { + if x != nil { + return x.Filters + } + return nil +} + +type CountEndDevicesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Count uint64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"` +} + +func (x *CountEndDevicesResponse) Reset() { + *x = CountEndDevicesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CountEndDevicesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CountEndDevicesResponse) ProtoMessage() {} + +func (x *CountEndDevicesResponse) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CountEndDevicesResponse.ProtoReflect.Descriptor instead. +func (*CountEndDevicesResponse) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{27} +} + +func (x *CountEndDevicesResponse) GetCount() uint64 { + if x != nil { + return x.Count + } + return 0 +} + type SetEndDeviceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3385,7 +3487,7 @@ type SetEndDeviceRequest struct { func (x *SetEndDeviceRequest) Reset() { *x = SetEndDeviceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[26] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3398,7 +3500,7 @@ func (x *SetEndDeviceRequest) String() string { func (*SetEndDeviceRequest) ProtoMessage() {} func (x *SetEndDeviceRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[26] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3411,7 +3513,7 @@ func (x *SetEndDeviceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetEndDeviceRequest.ProtoReflect.Descriptor instead. func (*SetEndDeviceRequest) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{26} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{28} } func (x *SetEndDeviceRequest) GetEndDevice() *EndDevice { @@ -3442,7 +3544,7 @@ type ResetAndGetEndDeviceRequest struct { func (x *ResetAndGetEndDeviceRequest) Reset() { *x = ResetAndGetEndDeviceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[27] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3455,7 +3557,7 @@ func (x *ResetAndGetEndDeviceRequest) String() string { func (*ResetAndGetEndDeviceRequest) ProtoMessage() {} func (x *ResetAndGetEndDeviceRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[27] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3468,7 +3570,7 @@ func (x *ResetAndGetEndDeviceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetAndGetEndDeviceRequest.ProtoReflect.Descriptor instead. func (*ResetAndGetEndDeviceRequest) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{27} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{29} } func (x *ResetAndGetEndDeviceRequest) GetEndDeviceIds() *EndDeviceIdentifiers { @@ -3498,7 +3600,7 @@ type EndDeviceTemplate struct { func (x *EndDeviceTemplate) Reset() { *x = EndDeviceTemplate{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[28] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3511,7 +3613,7 @@ func (x *EndDeviceTemplate) String() string { func (*EndDeviceTemplate) ProtoMessage() {} func (x *EndDeviceTemplate) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[28] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3524,7 +3626,7 @@ func (x *EndDeviceTemplate) ProtoReflect() protoreflect.Message { // Deprecated: Use EndDeviceTemplate.ProtoReflect.Descriptor instead. func (*EndDeviceTemplate) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{28} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{30} } func (x *EndDeviceTemplate) GetEndDevice() *EndDevice { @@ -3561,7 +3663,7 @@ type EndDeviceTemplateFormat struct { func (x *EndDeviceTemplateFormat) Reset() { *x = EndDeviceTemplateFormat{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[29] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3574,7 +3676,7 @@ func (x *EndDeviceTemplateFormat) String() string { func (*EndDeviceTemplateFormat) ProtoMessage() {} func (x *EndDeviceTemplateFormat) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[29] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3587,7 +3689,7 @@ func (x *EndDeviceTemplateFormat) ProtoReflect() protoreflect.Message { // Deprecated: Use EndDeviceTemplateFormat.ProtoReflect.Descriptor instead. func (*EndDeviceTemplateFormat) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{29} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{31} } func (x *EndDeviceTemplateFormat) GetName() string { @@ -3622,7 +3724,7 @@ type EndDeviceTemplateFormats struct { func (x *EndDeviceTemplateFormats) Reset() { *x = EndDeviceTemplateFormats{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[30] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3635,7 +3737,7 @@ func (x *EndDeviceTemplateFormats) String() string { func (*EndDeviceTemplateFormats) ProtoMessage() {} func (x *EndDeviceTemplateFormats) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[30] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3648,7 +3750,7 @@ func (x *EndDeviceTemplateFormats) ProtoReflect() protoreflect.Message { // Deprecated: Use EndDeviceTemplateFormats.ProtoReflect.Descriptor instead. func (*EndDeviceTemplateFormats) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{30} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{32} } func (x *EndDeviceTemplateFormats) GetFormats() map[string]*EndDeviceTemplateFormat { @@ -3674,7 +3776,7 @@ type ConvertEndDeviceTemplateRequest struct { func (x *ConvertEndDeviceTemplateRequest) Reset() { *x = ConvertEndDeviceTemplateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[31] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3687,7 +3789,7 @@ func (x *ConvertEndDeviceTemplateRequest) String() string { func (*ConvertEndDeviceTemplateRequest) ProtoMessage() {} func (x *ConvertEndDeviceTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[31] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3700,7 +3802,7 @@ func (x *ConvertEndDeviceTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ConvertEndDeviceTemplateRequest.ProtoReflect.Descriptor instead. func (*ConvertEndDeviceTemplateRequest) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{31} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{33} } func (x *ConvertEndDeviceTemplateRequest) GetFormatId() string { @@ -3736,7 +3838,7 @@ type BatchDeleteEndDevicesRequest struct { func (x *BatchDeleteEndDevicesRequest) Reset() { *x = BatchDeleteEndDevicesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[32] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3749,7 +3851,7 @@ func (x *BatchDeleteEndDevicesRequest) String() string { func (*BatchDeleteEndDevicesRequest) ProtoMessage() {} func (x *BatchDeleteEndDevicesRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[32] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3762,7 +3864,7 @@ func (x *BatchDeleteEndDevicesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchDeleteEndDevicesRequest.ProtoReflect.Descriptor instead. func (*BatchDeleteEndDevicesRequest) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{32} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{34} } func (x *BatchDeleteEndDevicesRequest) GetApplicationIds() *ApplicationIdentifiers { @@ -3795,7 +3897,7 @@ type BatchGetEndDevicesRequest struct { func (x *BatchGetEndDevicesRequest) Reset() { *x = BatchGetEndDevicesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[33] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3808,7 +3910,7 @@ func (x *BatchGetEndDevicesRequest) String() string { func (*BatchGetEndDevicesRequest) ProtoMessage() {} func (x *BatchGetEndDevicesRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[33] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3821,7 +3923,7 @@ func (x *BatchGetEndDevicesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchGetEndDevicesRequest.ProtoReflect.Descriptor instead. func (*BatchGetEndDevicesRequest) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{33} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{35} } func (x *BatchGetEndDevicesRequest) GetApplicationIds() *ApplicationIdentifiers { @@ -3858,7 +3960,7 @@ type BatchSetMACSettingsProfileRequest struct { func (x *BatchSetMACSettingsProfileRequest) Reset() { *x = BatchSetMACSettingsProfileRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[34] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3871,7 +3973,7 @@ func (x *BatchSetMACSettingsProfileRequest) String() string { func (*BatchSetMACSettingsProfileRequest) ProtoMessage() {} func (x *BatchSetMACSettingsProfileRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[34] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3884,7 +3986,7 @@ func (x *BatchSetMACSettingsProfileRequest) ProtoReflect() protoreflect.Message // Deprecated: Use BatchSetMACSettingsProfileRequest.ProtoReflect.Descriptor instead. func (*BatchSetMACSettingsProfileRequest) Descriptor() ([]byte, []int) { - return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{34} + return file_ttn_lorawan_v3_end_device_proto_rawDescGZIP(), []int{36} } func (x *BatchSetMACSettingsProfileRequest) GetApplicationIds() *ApplicationIdentifiers { @@ -3928,7 +4030,7 @@ type MACParameters_Channel struct { func (x *MACParameters_Channel) Reset() { *x = MACParameters_Channel{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[35] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3941,7 +4043,7 @@ func (x *MACParameters_Channel) String() string { func (*MACParameters_Channel) ProtoMessage() {} func (x *MACParameters_Channel) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[35] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4009,7 +4111,7 @@ type ADRSettings_StaticMode struct { func (x *ADRSettings_StaticMode) Reset() { *x = ADRSettings_StaticMode{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[36] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4022,7 +4124,7 @@ func (x *ADRSettings_StaticMode) String() string { func (*ADRSettings_StaticMode) ProtoMessage() {} func (x *ADRSettings_StaticMode) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[36] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4094,7 +4196,7 @@ type ADRSettings_DynamicMode struct { func (x *ADRSettings_DynamicMode) Reset() { *x = ADRSettings_DynamicMode{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[37] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4107,7 +4209,7 @@ func (x *ADRSettings_DynamicMode) String() string { func (*ADRSettings_DynamicMode) ProtoMessage() {} func (x *ADRSettings_DynamicMode) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[37] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4197,7 +4299,7 @@ type ADRSettings_DisabledMode struct { func (x *ADRSettings_DisabledMode) Reset() { *x = ADRSettings_DisabledMode{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[38] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4210,7 +4312,7 @@ func (x *ADRSettings_DisabledMode) String() string { func (*ADRSettings_DisabledMode) ProtoMessage() {} func (x *ADRSettings_DisabledMode) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[38] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4241,7 +4343,7 @@ type ADRSettings_DynamicMode_ChannelSteeringSettings struct { func (x *ADRSettings_DynamicMode_ChannelSteeringSettings) Reset() { *x = ADRSettings_DynamicMode_ChannelSteeringSettings{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[39] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4254,7 +4356,7 @@ func (x *ADRSettings_DynamicMode_ChannelSteeringSettings) String() string { func (*ADRSettings_DynamicMode_ChannelSteeringSettings) ProtoMessage() {} func (x *ADRSettings_DynamicMode_ChannelSteeringSettings) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[39] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4326,7 +4428,7 @@ type ADRSettings_DynamicMode_PerDataRateIndexOverride struct { func (x *ADRSettings_DynamicMode_PerDataRateIndexOverride) Reset() { *x = ADRSettings_DynamicMode_PerDataRateIndexOverride{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[40] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4339,7 +4441,7 @@ func (x *ADRSettings_DynamicMode_PerDataRateIndexOverride) String() string { func (*ADRSettings_DynamicMode_PerDataRateIndexOverride) ProtoMessage() {} func (x *ADRSettings_DynamicMode_PerDataRateIndexOverride) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[40] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4396,7 +4498,7 @@ type ADRSettings_DynamicMode_Overrides struct { func (x *ADRSettings_DynamicMode_Overrides) Reset() { *x = ADRSettings_DynamicMode_Overrides{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[41] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4409,7 +4511,7 @@ func (x *ADRSettings_DynamicMode_Overrides) String() string { func (*ADRSettings_DynamicMode_Overrides) ProtoMessage() {} func (x *ADRSettings_DynamicMode_Overrides) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[41] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4549,7 +4651,7 @@ type ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode struct { func (x *ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode) Reset() { *x = ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[42] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4562,7 +4664,7 @@ func (x *ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode) String( func (*ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode) ProtoMessage() {} func (x *ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[42] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4589,7 +4691,7 @@ type ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode struct { func (x *ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode) Reset() { *x = ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[43] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4602,7 +4704,7 @@ func (x *ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode) String() func (*ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode) ProtoMessage() {} func (x *ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[43] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4631,7 +4733,7 @@ type MACState_JoinRequest struct { func (x *MACState_JoinRequest) Reset() { *x = MACState_JoinRequest{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[44] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4644,7 +4746,7 @@ func (x *MACState_JoinRequest) String() string { func (*MACState_JoinRequest) ProtoMessage() {} func (x *MACState_JoinRequest) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[44] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4699,7 +4801,7 @@ type MACState_JoinAccept struct { func (x *MACState_JoinAccept) Reset() { *x = MACState_JoinAccept{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[45] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4712,7 +4814,7 @@ func (x *MACState_JoinAccept) String() string { func (*MACState_JoinAccept) ProtoMessage() {} func (x *MACState_JoinAccept) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[45] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4788,7 +4890,7 @@ type MACState_UplinkMessage struct { func (x *MACState_UplinkMessage) Reset() { *x = MACState_UplinkMessage{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[46] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4801,7 +4903,7 @@ func (x *MACState_UplinkMessage) String() string { func (*MACState_UplinkMessage) ProtoMessage() {} func (x *MACState_UplinkMessage) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[46] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4873,7 +4975,7 @@ type MACState_DownlinkMessage struct { func (x *MACState_DownlinkMessage) Reset() { *x = MACState_DownlinkMessage{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[47] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4886,7 +4988,7 @@ func (x *MACState_DownlinkMessage) String() string { func (*MACState_DownlinkMessage) ProtoMessage() {} func (x *MACState_DownlinkMessage) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[47] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4928,7 +5030,7 @@ type MACState_DataRateRange struct { func (x *MACState_DataRateRange) Reset() { *x = MACState_DataRateRange{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[48] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4941,7 +5043,7 @@ func (x *MACState_DataRateRange) String() string { func (*MACState_DataRateRange) ProtoMessage() {} func (x *MACState_DataRateRange) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[48] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4982,7 +5084,7 @@ type MACState_DataRateRanges struct { func (x *MACState_DataRateRanges) Reset() { *x = MACState_DataRateRanges{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[49] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4995,7 +5097,7 @@ func (x *MACState_DataRateRanges) String() string { func (*MACState_DataRateRanges) ProtoMessage() {} func (x *MACState_DataRateRanges) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[49] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5029,7 +5131,7 @@ type MACState_UplinkMessage_TxSettings struct { func (x *MACState_UplinkMessage_TxSettings) Reset() { *x = MACState_UplinkMessage_TxSettings{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[51] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5042,7 +5144,7 @@ func (x *MACState_UplinkMessage_TxSettings) String() string { func (*MACState_UplinkMessage_TxSettings) ProtoMessage() {} func (x *MACState_UplinkMessage_TxSettings) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[51] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5082,7 +5184,7 @@ type MACState_UplinkMessage_RxMetadata struct { func (x *MACState_UplinkMessage_RxMetadata) Reset() { *x = MACState_UplinkMessage_RxMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[52] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5095,7 +5197,7 @@ func (x *MACState_UplinkMessage_RxMetadata) String() string { func (*MACState_UplinkMessage_RxMetadata) ProtoMessage() {} func (x *MACState_UplinkMessage_RxMetadata) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[52] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5169,7 +5271,7 @@ type MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata struct { func (x *MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata) Reset() { *x = MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[53] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5182,7 +5284,7 @@ func (x *MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata) String() string func (*MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata) ProtoMessage() {} func (x *MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[53] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5207,7 +5309,7 @@ type MACState_UplinkMessage_RxMetadata_RelayMetadata struct { func (x *MACState_UplinkMessage_RxMetadata_RelayMetadata) Reset() { *x = MACState_UplinkMessage_RxMetadata_RelayMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[54] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5220,7 +5322,7 @@ func (x *MACState_UplinkMessage_RxMetadata_RelayMetadata) String() string { func (*MACState_UplinkMessage_RxMetadata_RelayMetadata) ProtoMessage() {} func (x *MACState_UplinkMessage_RxMetadata_RelayMetadata) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[54] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5248,7 +5350,7 @@ type MACState_DownlinkMessage_Message struct { func (x *MACState_DownlinkMessage_Message) Reset() { *x = MACState_DownlinkMessage_Message{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[55] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5261,7 +5363,7 @@ func (x *MACState_DownlinkMessage_Message) String() string { func (*MACState_DownlinkMessage_Message) ProtoMessage() {} func (x *MACState_DownlinkMessage_Message) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[55] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5302,7 +5404,7 @@ type MACState_DownlinkMessage_Message_MHDR struct { func (x *MACState_DownlinkMessage_Message_MHDR) Reset() { *x = MACState_DownlinkMessage_Message_MHDR{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[56] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5315,7 +5417,7 @@ func (x *MACState_DownlinkMessage_Message_MHDR) String() string { func (*MACState_DownlinkMessage_Message_MHDR) ProtoMessage() {} func (x *MACState_DownlinkMessage_Message_MHDR) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[56] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5350,7 +5452,7 @@ type MACState_DownlinkMessage_Message_MACPayload struct { func (x *MACState_DownlinkMessage_Message_MACPayload) Reset() { *x = MACState_DownlinkMessage_Message_MACPayload{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[57] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5363,7 +5465,7 @@ func (x *MACState_DownlinkMessage_Message_MACPayload) String() string { func (*MACState_DownlinkMessage_Message_MACPayload) ProtoMessage() {} func (x *MACState_DownlinkMessage_Message_MACPayload) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[57] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5405,7 +5507,7 @@ type BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate struct { func (x *BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate) Reset() { *x = BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[60] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5418,7 +5520,7 @@ func (x *BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate) String() s func (*BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate) ProtoMessage() {} func (x *BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[60] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5462,7 +5564,7 @@ type ListEndDevicesRequest_Filter struct { func (x *ListEndDevicesRequest_Filter) Reset() { *x = ListEndDevicesRequest_Filter{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[61] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5475,7 +5577,7 @@ func (x *ListEndDevicesRequest_Filter) String() string { func (*ListEndDevicesRequest_Filter) ProtoMessage() {} func (x *ListEndDevicesRequest_Filter) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[61] + mi := &file_ttn_lorawan_v3_end_device_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7128,141 +7230,156 @@ var file_ttn_lorawan_v3_end_device_proto_rawDesc = []byte{ 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, 0xfa, 0x42, 0x05, 0xb2, 0x01, 0x02, 0x38, 0x01, 0x48, 0x00, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x22, 0x94, 0x01, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, - 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, - 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, - 0x01, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, + 0x22, 0xbb, 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, 0x0f, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, + 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, + 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x46, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x64, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0x2f, + 0x0a, 0x17, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x94, 0x01, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, + 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, + 0x52, 0x09, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0xae, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x65, 0x74, + 0x41, 0x6e, 0x64, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x0e, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, + 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, + 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0xae, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x65, - 0x74, 0x41, 0x6e, 0x64, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x0e, 0x65, 0x6e, 0x64, 0x5f, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, - 0x0c, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, - 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0xbc, 0x01, 0x0a, 0x11, 0x45, 0x6e, 0x64, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, - 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x08, 0xfa, - 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, - 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x28, 0x0a, - 0x0b, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x64, 0x52, 0x0a, 0x6d, 0x61, 0x70, - 0x70, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x22, 0xb8, 0x01, 0x0a, 0x17, 0x45, 0x6e, 0x64, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x64, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x2a, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x0f, - 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x2b, 0xfa, 0x42, 0x28, 0x92, 0x01, 0x25, 0x10, 0x64, 0x18, - 0x01, 0x22, 0x1f, 0x72, 0x1d, 0x32, 0x1b, 0x5e, 0x28, 0x3f, 0x3a, 0x5c, 0x2e, 0x5b, 0x61, 0x2d, - 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x31, 0x36, 0x7d, 0x29, 0x7b, 0x31, 0x2c, 0x32, - 0x7d, 0x24, 0x52, 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0xfe, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x12, - 0x7d, 0x0a, 0x07, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x35, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, - 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x2c, 0xfa, 0x42, 0x29, 0x9a, 0x01, 0x26, 0x22, - 0x24, 0x72, 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, - 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, - 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x52, 0x07, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x1a, 0x63, - 0x0a, 0x0c, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0xbc, 0x01, 0x0a, 0x11, 0x45, 0x6e, 0x64, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, + 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, + 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x08, 0xfa, 0x42, + 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, + 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x28, 0x0a, 0x0b, + 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x64, 0x52, 0x0a, 0x6d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x22, 0xb8, 0x01, 0x0a, 0x17, 0x45, 0x6e, 0x64, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x64, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x2a, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x0f, 0x66, + 0x69, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x42, 0x2b, 0xfa, 0x42, 0x28, 0x92, 0x01, 0x25, 0x10, 0x64, 0x18, 0x01, + 0x22, 0x1f, 0x72, 0x1d, 0x32, 0x1b, 0x5e, 0x28, 0x3f, 0x3a, 0x5c, 0x2e, 0x5b, 0x61, 0x2d, 0x7a, + 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x2c, 0x31, 0x36, 0x7d, 0x29, 0x7b, 0x31, 0x2c, 0x32, 0x7d, + 0x24, 0x52, 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0xfe, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x12, 0x7d, + 0x0a, 0x07, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x35, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xdd, 0x01, 0x0a, 0x1f, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x45, - 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x09, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xfa, 0x42, 0x24, 0x72, - 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, - 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, - 0x2c, 0x7d, 0x24, 0x52, 0x08, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x60, 0x0a, 0x16, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x13, - 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x73, 0x22, 0xca, 0x01, 0x0a, 0x1c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, - 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, - 0x4f, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x42, 0x30, 0xfa, 0x42, 0x2d, 0x92, 0x01, 0x2a, 0x08, 0x01, 0x10, 0x14, 0x22, - 0x24, 0x72, 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, - 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, - 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x52, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x73, - 0x22, 0xa8, 0x02, 0x0a, 0x19, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, - 0x0a, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, - 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, - 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x4f, 0x0a, 0x0a, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x30, 0xfa, - 0x42, 0x2d, 0x92, 0x01, 0x2a, 0x08, 0x01, 0x10, 0x14, 0x22, 0x24, 0x72, 0x22, 0x18, 0x24, 0x32, - 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, - 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x52, - 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, - 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x22, 0xb7, 0x02, 0x0a, 0x21, - 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, 0x74, 0x4d, 0x41, 0x43, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x59, 0x0a, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, - 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x61, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x66, 0x0a, 0x18, - 0x6d, 0x61, 0x63, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x70, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, + 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x2c, 0xfa, 0x42, 0x29, 0x9a, 0x01, 0x26, 0x22, 0x24, + 0x72, 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, + 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, + 0x32, 0x2c, 0x7d, 0x24, 0x52, 0x07, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x1a, 0x63, 0x0a, + 0x0c, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x3d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, - 0x4d, 0x41, 0x43, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x15, 0x6d, - 0x61, 0x63, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x49, 0x64, 0x73, 0x12, 0x4f, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x30, 0xfa, 0x42, 0x2d, 0x92, 0x01, 0x2a, - 0x08, 0x01, 0x10, 0x14, 0x22, 0x24, 0x72, 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, - 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, - 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x52, 0x09, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x64, 0x73, 0x2a, 0x55, 0x0a, 0x0a, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x4b, - 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, - 0x42, 0x41, 0x54, 0x54, 0x45, 0x52, 0x59, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x4f, 0x57, - 0x45, 0x52, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x02, 0x1a, 0x0d, 0xea, - 0xaa, 0x19, 0x09, 0x18, 0x01, 0x2a, 0x05, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x42, 0x31, 0x5a, 0x2f, - 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, - 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0xdd, 0x01, 0x0a, 0x1f, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x45, 0x6e, + 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x09, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xfa, 0x42, 0x24, 0x72, 0x22, + 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, + 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, + 0x7d, 0x24, 0x52, 0x08, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x60, 0x0a, 0x16, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2b, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x13, 0x65, + 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x73, 0x22, 0xca, 0x01, 0x0a, 0x1c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, + 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0e, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x4f, + 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x42, 0x30, 0xfa, 0x42, 0x2d, 0x92, 0x01, 0x2a, 0x08, 0x01, 0x10, 0x14, 0x22, 0x24, + 0x72, 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, + 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, + 0x32, 0x2c, 0x7d, 0x24, 0x52, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x73, 0x22, + 0xa8, 0x02, 0x0a, 0x19, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, + 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x4f, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x30, 0xfa, 0x42, + 0x2d, 0x92, 0x01, 0x2a, 0x08, 0x01, 0x10, 0x14, 0x22, 0x24, 0x72, 0x22, 0x18, 0x24, 0x32, 0x1e, + 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, + 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x52, 0x09, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x4d, 0x61, 0x73, 0x6b, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, + 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x22, 0xb7, 0x02, 0x0a, 0x21, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, 0x74, 0x4d, 0x41, 0x43, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x59, 0x0a, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x66, 0x0a, 0x18, 0x6d, + 0x61, 0x63, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, + 0x41, 0x43, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x15, 0x6d, 0x61, + 0x63, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x49, 0x64, 0x73, 0x12, 0x4f, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x30, 0xfa, 0x42, 0x2d, 0x92, 0x01, 0x2a, 0x08, + 0x01, 0x10, 0x14, 0x22, 0x24, 0x72, 0x22, 0x18, 0x24, 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, + 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, + 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x52, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x73, 0x2a, 0x55, 0x0a, 0x0a, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, + 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x42, + 0x41, 0x54, 0x54, 0x45, 0x52, 0x59, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x4f, 0x57, 0x45, + 0x52, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x02, 0x1a, 0x0d, 0xea, 0xaa, + 0x19, 0x09, 0x18, 0x01, 0x2a, 0x05, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x42, 0x31, 0x5a, 0x2f, 0x67, + 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -7278,355 +7395,359 @@ func file_ttn_lorawan_v3_end_device_proto_rawDescGZIP() []byte { } var file_ttn_lorawan_v3_end_device_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_ttn_lorawan_v3_end_device_proto_msgTypes = make([]protoimpl.MessageInfo, 63) +var file_ttn_lorawan_v3_end_device_proto_msgTypes = make([]protoimpl.MessageInfo, 65) var file_ttn_lorawan_v3_end_device_proto_goTypes = []interface{}{ - (PowerState)(0), // 0: ttn.lorawan.v3.PowerState - (*Session)(nil), // 1: ttn.lorawan.v3.Session - (*BoolValue)(nil), // 2: ttn.lorawan.v3.BoolValue - (*ServingRelayForwardingLimits)(nil), // 3: ttn.lorawan.v3.ServingRelayForwardingLimits - (*RelayUplinkForwardingRule)(nil), // 4: ttn.lorawan.v3.RelayUplinkForwardingRule - (*ServingRelayParameters)(nil), // 5: ttn.lorawan.v3.ServingRelayParameters - (*ServedRelayParameters)(nil), // 6: ttn.lorawan.v3.ServedRelayParameters - (*RelayParameters)(nil), // 7: ttn.lorawan.v3.RelayParameters - (*ServingRelaySettings)(nil), // 8: ttn.lorawan.v3.ServingRelaySettings - (*ServedRelaySettings)(nil), // 9: ttn.lorawan.v3.ServedRelaySettings - (*RelaySettings)(nil), // 10: ttn.lorawan.v3.RelaySettings - (*MACParameters)(nil), // 11: ttn.lorawan.v3.MACParameters - (*EndDeviceVersion)(nil), // 12: ttn.lorawan.v3.EndDeviceVersion - (*ADRSettings)(nil), // 13: ttn.lorawan.v3.ADRSettings - (*MACSettings)(nil), // 14: ttn.lorawan.v3.MACSettings - (*MACSettingsProfile)(nil), // 15: ttn.lorawan.v3.MACSettingsProfile - (*MACState)(nil), // 16: ttn.lorawan.v3.MACState - (*EndDeviceAuthenticationCode)(nil), // 17: ttn.lorawan.v3.EndDeviceAuthenticationCode - (*EndDevice)(nil), // 18: ttn.lorawan.v3.EndDevice - (*EndDevices)(nil), // 19: ttn.lorawan.v3.EndDevices - (*DevAddrPrefix)(nil), // 20: ttn.lorawan.v3.DevAddrPrefix - (*CreateEndDeviceRequest)(nil), // 21: ttn.lorawan.v3.CreateEndDeviceRequest - (*UpdateEndDeviceRequest)(nil), // 22: ttn.lorawan.v3.UpdateEndDeviceRequest - (*BatchUpdateEndDeviceLastSeenRequest)(nil), // 23: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest - (*GetEndDeviceRequest)(nil), // 24: ttn.lorawan.v3.GetEndDeviceRequest - (*GetEndDeviceIdentifiersForEUIsRequest)(nil), // 25: ttn.lorawan.v3.GetEndDeviceIdentifiersForEUIsRequest - (*ListEndDevicesRequest)(nil), // 26: ttn.lorawan.v3.ListEndDevicesRequest - (*SetEndDeviceRequest)(nil), // 27: ttn.lorawan.v3.SetEndDeviceRequest - (*ResetAndGetEndDeviceRequest)(nil), // 28: ttn.lorawan.v3.ResetAndGetEndDeviceRequest - (*EndDeviceTemplate)(nil), // 29: ttn.lorawan.v3.EndDeviceTemplate - (*EndDeviceTemplateFormat)(nil), // 30: ttn.lorawan.v3.EndDeviceTemplateFormat - (*EndDeviceTemplateFormats)(nil), // 31: ttn.lorawan.v3.EndDeviceTemplateFormats - (*ConvertEndDeviceTemplateRequest)(nil), // 32: ttn.lorawan.v3.ConvertEndDeviceTemplateRequest - (*BatchDeleteEndDevicesRequest)(nil), // 33: ttn.lorawan.v3.BatchDeleteEndDevicesRequest - (*BatchGetEndDevicesRequest)(nil), // 34: ttn.lorawan.v3.BatchGetEndDevicesRequest - (*BatchSetMACSettingsProfileRequest)(nil), // 35: ttn.lorawan.v3.BatchSetMACSettingsProfileRequest - (*MACParameters_Channel)(nil), // 36: ttn.lorawan.v3.MACParameters.Channel - (*ADRSettings_StaticMode)(nil), // 37: ttn.lorawan.v3.ADRSettings.StaticMode - (*ADRSettings_DynamicMode)(nil), // 38: ttn.lorawan.v3.ADRSettings.DynamicMode - (*ADRSettings_DisabledMode)(nil), // 39: ttn.lorawan.v3.ADRSettings.DisabledMode - (*ADRSettings_DynamicMode_ChannelSteeringSettings)(nil), // 40: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings - (*ADRSettings_DynamicMode_PerDataRateIndexOverride)(nil), // 41: ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride - (*ADRSettings_DynamicMode_Overrides)(nil), // 42: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides - (*ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode)(nil), // 43: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.LoRaNarrowMode - (*ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode)(nil), // 44: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.DisabledMode - (*MACState_JoinRequest)(nil), // 45: ttn.lorawan.v3.MACState.JoinRequest - (*MACState_JoinAccept)(nil), // 46: ttn.lorawan.v3.MACState.JoinAccept - (*MACState_UplinkMessage)(nil), // 47: ttn.lorawan.v3.MACState.UplinkMessage - (*MACState_DownlinkMessage)(nil), // 48: ttn.lorawan.v3.MACState.DownlinkMessage - (*MACState_DataRateRange)(nil), // 49: ttn.lorawan.v3.MACState.DataRateRange - (*MACState_DataRateRanges)(nil), // 50: ttn.lorawan.v3.MACState.DataRateRanges - nil, // 51: ttn.lorawan.v3.MACState.RejectedDataRateRangesEntry - (*MACState_UplinkMessage_TxSettings)(nil), // 52: ttn.lorawan.v3.MACState.UplinkMessage.TxSettings - (*MACState_UplinkMessage_RxMetadata)(nil), // 53: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata - (*MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata)(nil), // 54: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.PacketBrokerMetadata - (*MACState_UplinkMessage_RxMetadata_RelayMetadata)(nil), // 55: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.RelayMetadata - (*MACState_DownlinkMessage_Message)(nil), // 56: ttn.lorawan.v3.MACState.DownlinkMessage.Message - (*MACState_DownlinkMessage_Message_MHDR)(nil), // 57: ttn.lorawan.v3.MACState.DownlinkMessage.Message.MHDR - (*MACState_DownlinkMessage_Message_MACPayload)(nil), // 58: ttn.lorawan.v3.MACState.DownlinkMessage.Message.MACPayload - nil, // 59: ttn.lorawan.v3.EndDevice.AttributesEntry - nil, // 60: ttn.lorawan.v3.EndDevice.LocationsEntry - (*BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate)(nil), // 61: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.EndDeviceLastSeenUpdate - (*ListEndDevicesRequest_Filter)(nil), // 62: ttn.lorawan.v3.ListEndDevicesRequest.Filter - nil, // 63: ttn.lorawan.v3.EndDeviceTemplateFormats.FormatsEntry - (*SessionKeys)(nil), // 64: ttn.lorawan.v3.SessionKeys - (*timestamppb.Timestamp)(nil), // 65: google.protobuf.Timestamp - (*ApplicationDownlink)(nil), // 66: ttn.lorawan.v3.ApplicationDownlink - (RelayResetLimitCounter)(0), // 67: ttn.lorawan.v3.RelayResetLimitCounter - (*RelayForwardLimits)(nil), // 68: ttn.lorawan.v3.RelayForwardLimits - (*RelayUplinkForwardLimits)(nil), // 69: ttn.lorawan.v3.RelayUplinkForwardLimits - (*RelaySecondChannel)(nil), // 70: ttn.lorawan.v3.RelaySecondChannel - (RelayCADPeriodicity)(0), // 71: ttn.lorawan.v3.RelayCADPeriodicity - (*RelayEndDeviceAlwaysMode)(nil), // 72: ttn.lorawan.v3.RelayEndDeviceAlwaysMode - (*RelayEndDeviceDynamicMode)(nil), // 73: ttn.lorawan.v3.RelayEndDeviceDynamicMode - (*RelayEndDeviceControlledMode)(nil), // 74: ttn.lorawan.v3.RelayEndDeviceControlledMode - (*wrapperspb.UInt32Value)(nil), // 75: google.protobuf.UInt32Value - (DataRateIndex)(0), // 76: ttn.lorawan.v3.DataRateIndex - (RxDelay)(0), // 77: ttn.lorawan.v3.RxDelay - (DataRateOffset)(0), // 78: ttn.lorawan.v3.DataRateOffset - (AggregatedDutyCycle)(0), // 79: ttn.lorawan.v3.AggregatedDutyCycle - (RejoinTimeExponent)(0), // 80: ttn.lorawan.v3.RejoinTimeExponent - (RejoinCountExponent)(0), // 81: ttn.lorawan.v3.RejoinCountExponent - (*ADRAckLimitExponentValue)(nil), // 82: ttn.lorawan.v3.ADRAckLimitExponentValue - (*ADRAckDelayExponentValue)(nil), // 83: ttn.lorawan.v3.ADRAckDelayExponentValue - (*DataRateIndexValue)(nil), // 84: ttn.lorawan.v3.DataRateIndexValue - (*EndDeviceVersionIdentifiers)(nil), // 85: ttn.lorawan.v3.EndDeviceVersionIdentifiers - (MACVersion)(0), // 86: ttn.lorawan.v3.MACVersion - (PHYVersion)(0), // 87: ttn.lorawan.v3.PHYVersion - (*MessagePayloadFormatters)(nil), // 88: ttn.lorawan.v3.MessagePayloadFormatters - (*durationpb.Duration)(nil), // 89: google.protobuf.Duration - (*PingSlotPeriodValue)(nil), // 90: ttn.lorawan.v3.PingSlotPeriodValue - (*ZeroableFrequencyValue)(nil), // 91: ttn.lorawan.v3.ZeroableFrequencyValue - (*RxDelayValue)(nil), // 92: ttn.lorawan.v3.RxDelayValue - (*DataRateOffsetValue)(nil), // 93: ttn.lorawan.v3.DataRateOffsetValue - (*FrequencyValue)(nil), // 94: ttn.lorawan.v3.FrequencyValue - (*AggregatedDutyCycleValue)(nil), // 95: ttn.lorawan.v3.AggregatedDutyCycleValue - (*wrapperspb.FloatValue)(nil), // 96: google.protobuf.FloatValue - (*DeviceEIRPValue)(nil), // 97: ttn.lorawan.v3.DeviceEIRPValue - (*MACSettingsProfileIdentifiers)(nil), // 98: ttn.lorawan.v3.MACSettingsProfileIdentifiers - (Class)(0), // 99: ttn.lorawan.v3.Class - (*MACCommand)(nil), // 100: ttn.lorawan.v3.MACCommand - (MACCommandIdentifier)(0), // 101: ttn.lorawan.v3.MACCommandIdentifier - (*RelayForwardDownlinkReq)(nil), // 102: ttn.lorawan.v3.RelayForwardDownlinkReq - (*EndDeviceIdentifiers)(nil), // 103: ttn.lorawan.v3.EndDeviceIdentifiers - (*Picture)(nil), // 104: ttn.lorawan.v3.Picture - (*RootKeys)(nil), // 105: ttn.lorawan.v3.RootKeys - (*structpb.Struct)(nil), // 106: google.protobuf.Struct - (*wrapperspb.BoolValue)(nil), // 107: google.protobuf.BoolValue - (*LoRaAllianceProfileIdentifiers)(nil), // 108: ttn.lorawan.v3.LoRaAllianceProfileIdentifiers - (*fieldmaskpb.FieldMask)(nil), // 109: google.protobuf.FieldMask - (*ApplicationIdentifiers)(nil), // 110: ttn.lorawan.v3.ApplicationIdentifiers - (*DLSettings)(nil), // 111: ttn.lorawan.v3.DLSettings - (*CFList)(nil), // 112: ttn.lorawan.v3.CFList - (*Message)(nil), // 113: ttn.lorawan.v3.Message - (*DataRate)(nil), // 114: ttn.lorawan.v3.DataRate - (*GatewayIdentifiers)(nil), // 115: ttn.lorawan.v3.GatewayIdentifiers - (DownlinkPathConstraint)(0), // 116: ttn.lorawan.v3.DownlinkPathConstraint - (MType)(0), // 117: ttn.lorawan.v3.MType - (*Location)(nil), // 118: ttn.lorawan.v3.Location + (PowerState)(0), // 0: ttn.lorawan.v3.PowerState + (*Session)(nil), // 1: ttn.lorawan.v3.Session + (*BoolValue)(nil), // 2: ttn.lorawan.v3.BoolValue + (*ServingRelayForwardingLimits)(nil), // 3: ttn.lorawan.v3.ServingRelayForwardingLimits + (*RelayUplinkForwardingRule)(nil), // 4: ttn.lorawan.v3.RelayUplinkForwardingRule + (*ServingRelayParameters)(nil), // 5: ttn.lorawan.v3.ServingRelayParameters + (*ServedRelayParameters)(nil), // 6: ttn.lorawan.v3.ServedRelayParameters + (*RelayParameters)(nil), // 7: ttn.lorawan.v3.RelayParameters + (*ServingRelaySettings)(nil), // 8: ttn.lorawan.v3.ServingRelaySettings + (*ServedRelaySettings)(nil), // 9: ttn.lorawan.v3.ServedRelaySettings + (*RelaySettings)(nil), // 10: ttn.lorawan.v3.RelaySettings + (*MACParameters)(nil), // 11: ttn.lorawan.v3.MACParameters + (*EndDeviceVersion)(nil), // 12: ttn.lorawan.v3.EndDeviceVersion + (*ADRSettings)(nil), // 13: ttn.lorawan.v3.ADRSettings + (*MACSettings)(nil), // 14: ttn.lorawan.v3.MACSettings + (*MACSettingsProfile)(nil), // 15: ttn.lorawan.v3.MACSettingsProfile + (*MACState)(nil), // 16: ttn.lorawan.v3.MACState + (*EndDeviceAuthenticationCode)(nil), // 17: ttn.lorawan.v3.EndDeviceAuthenticationCode + (*EndDevice)(nil), // 18: ttn.lorawan.v3.EndDevice + (*EndDevices)(nil), // 19: ttn.lorawan.v3.EndDevices + (*DevAddrPrefix)(nil), // 20: ttn.lorawan.v3.DevAddrPrefix + (*CreateEndDeviceRequest)(nil), // 21: ttn.lorawan.v3.CreateEndDeviceRequest + (*UpdateEndDeviceRequest)(nil), // 22: ttn.lorawan.v3.UpdateEndDeviceRequest + (*BatchUpdateEndDeviceLastSeenRequest)(nil), // 23: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest + (*GetEndDeviceRequest)(nil), // 24: ttn.lorawan.v3.GetEndDeviceRequest + (*GetEndDeviceIdentifiersForEUIsRequest)(nil), // 25: ttn.lorawan.v3.GetEndDeviceIdentifiersForEUIsRequest + (*ListEndDevicesRequest)(nil), // 26: ttn.lorawan.v3.ListEndDevicesRequest + (*CountEndDevicesRequest)(nil), // 27: ttn.lorawan.v3.CountEndDevicesRequest + (*CountEndDevicesResponse)(nil), // 28: ttn.lorawan.v3.CountEndDevicesResponse + (*SetEndDeviceRequest)(nil), // 29: ttn.lorawan.v3.SetEndDeviceRequest + (*ResetAndGetEndDeviceRequest)(nil), // 30: ttn.lorawan.v3.ResetAndGetEndDeviceRequest + (*EndDeviceTemplate)(nil), // 31: ttn.lorawan.v3.EndDeviceTemplate + (*EndDeviceTemplateFormat)(nil), // 32: ttn.lorawan.v3.EndDeviceTemplateFormat + (*EndDeviceTemplateFormats)(nil), // 33: ttn.lorawan.v3.EndDeviceTemplateFormats + (*ConvertEndDeviceTemplateRequest)(nil), // 34: ttn.lorawan.v3.ConvertEndDeviceTemplateRequest + (*BatchDeleteEndDevicesRequest)(nil), // 35: ttn.lorawan.v3.BatchDeleteEndDevicesRequest + (*BatchGetEndDevicesRequest)(nil), // 36: ttn.lorawan.v3.BatchGetEndDevicesRequest + (*BatchSetMACSettingsProfileRequest)(nil), // 37: ttn.lorawan.v3.BatchSetMACSettingsProfileRequest + (*MACParameters_Channel)(nil), // 38: ttn.lorawan.v3.MACParameters.Channel + (*ADRSettings_StaticMode)(nil), // 39: ttn.lorawan.v3.ADRSettings.StaticMode + (*ADRSettings_DynamicMode)(nil), // 40: ttn.lorawan.v3.ADRSettings.DynamicMode + (*ADRSettings_DisabledMode)(nil), // 41: ttn.lorawan.v3.ADRSettings.DisabledMode + (*ADRSettings_DynamicMode_ChannelSteeringSettings)(nil), // 42: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings + (*ADRSettings_DynamicMode_PerDataRateIndexOverride)(nil), // 43: ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride + (*ADRSettings_DynamicMode_Overrides)(nil), // 44: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides + (*ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode)(nil), // 45: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.LoRaNarrowMode + (*ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode)(nil), // 46: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.DisabledMode + (*MACState_JoinRequest)(nil), // 47: ttn.lorawan.v3.MACState.JoinRequest + (*MACState_JoinAccept)(nil), // 48: ttn.lorawan.v3.MACState.JoinAccept + (*MACState_UplinkMessage)(nil), // 49: ttn.lorawan.v3.MACState.UplinkMessage + (*MACState_DownlinkMessage)(nil), // 50: ttn.lorawan.v3.MACState.DownlinkMessage + (*MACState_DataRateRange)(nil), // 51: ttn.lorawan.v3.MACState.DataRateRange + (*MACState_DataRateRanges)(nil), // 52: ttn.lorawan.v3.MACState.DataRateRanges + nil, // 53: ttn.lorawan.v3.MACState.RejectedDataRateRangesEntry + (*MACState_UplinkMessage_TxSettings)(nil), // 54: ttn.lorawan.v3.MACState.UplinkMessage.TxSettings + (*MACState_UplinkMessage_RxMetadata)(nil), // 55: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata + (*MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata)(nil), // 56: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.PacketBrokerMetadata + (*MACState_UplinkMessage_RxMetadata_RelayMetadata)(nil), // 57: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.RelayMetadata + (*MACState_DownlinkMessage_Message)(nil), // 58: ttn.lorawan.v3.MACState.DownlinkMessage.Message + (*MACState_DownlinkMessage_Message_MHDR)(nil), // 59: ttn.lorawan.v3.MACState.DownlinkMessage.Message.MHDR + (*MACState_DownlinkMessage_Message_MACPayload)(nil), // 60: ttn.lorawan.v3.MACState.DownlinkMessage.Message.MACPayload + nil, // 61: ttn.lorawan.v3.EndDevice.AttributesEntry + nil, // 62: ttn.lorawan.v3.EndDevice.LocationsEntry + (*BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate)(nil), // 63: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.EndDeviceLastSeenUpdate + (*ListEndDevicesRequest_Filter)(nil), // 64: ttn.lorawan.v3.ListEndDevicesRequest.Filter + nil, // 65: ttn.lorawan.v3.EndDeviceTemplateFormats.FormatsEntry + (*SessionKeys)(nil), // 66: ttn.lorawan.v3.SessionKeys + (*timestamppb.Timestamp)(nil), // 67: google.protobuf.Timestamp + (*ApplicationDownlink)(nil), // 68: ttn.lorawan.v3.ApplicationDownlink + (RelayResetLimitCounter)(0), // 69: ttn.lorawan.v3.RelayResetLimitCounter + (*RelayForwardLimits)(nil), // 70: ttn.lorawan.v3.RelayForwardLimits + (*RelayUplinkForwardLimits)(nil), // 71: ttn.lorawan.v3.RelayUplinkForwardLimits + (*RelaySecondChannel)(nil), // 72: ttn.lorawan.v3.RelaySecondChannel + (RelayCADPeriodicity)(0), // 73: ttn.lorawan.v3.RelayCADPeriodicity + (*RelayEndDeviceAlwaysMode)(nil), // 74: ttn.lorawan.v3.RelayEndDeviceAlwaysMode + (*RelayEndDeviceDynamicMode)(nil), // 75: ttn.lorawan.v3.RelayEndDeviceDynamicMode + (*RelayEndDeviceControlledMode)(nil), // 76: ttn.lorawan.v3.RelayEndDeviceControlledMode + (*wrapperspb.UInt32Value)(nil), // 77: google.protobuf.UInt32Value + (DataRateIndex)(0), // 78: ttn.lorawan.v3.DataRateIndex + (RxDelay)(0), // 79: ttn.lorawan.v3.RxDelay + (DataRateOffset)(0), // 80: ttn.lorawan.v3.DataRateOffset + (AggregatedDutyCycle)(0), // 81: ttn.lorawan.v3.AggregatedDutyCycle + (RejoinTimeExponent)(0), // 82: ttn.lorawan.v3.RejoinTimeExponent + (RejoinCountExponent)(0), // 83: ttn.lorawan.v3.RejoinCountExponent + (*ADRAckLimitExponentValue)(nil), // 84: ttn.lorawan.v3.ADRAckLimitExponentValue + (*ADRAckDelayExponentValue)(nil), // 85: ttn.lorawan.v3.ADRAckDelayExponentValue + (*DataRateIndexValue)(nil), // 86: ttn.lorawan.v3.DataRateIndexValue + (*EndDeviceVersionIdentifiers)(nil), // 87: ttn.lorawan.v3.EndDeviceVersionIdentifiers + (MACVersion)(0), // 88: ttn.lorawan.v3.MACVersion + (PHYVersion)(0), // 89: ttn.lorawan.v3.PHYVersion + (*MessagePayloadFormatters)(nil), // 90: ttn.lorawan.v3.MessagePayloadFormatters + (*durationpb.Duration)(nil), // 91: google.protobuf.Duration + (*PingSlotPeriodValue)(nil), // 92: ttn.lorawan.v3.PingSlotPeriodValue + (*ZeroableFrequencyValue)(nil), // 93: ttn.lorawan.v3.ZeroableFrequencyValue + (*RxDelayValue)(nil), // 94: ttn.lorawan.v3.RxDelayValue + (*DataRateOffsetValue)(nil), // 95: ttn.lorawan.v3.DataRateOffsetValue + (*FrequencyValue)(nil), // 96: ttn.lorawan.v3.FrequencyValue + (*AggregatedDutyCycleValue)(nil), // 97: ttn.lorawan.v3.AggregatedDutyCycleValue + (*wrapperspb.FloatValue)(nil), // 98: google.protobuf.FloatValue + (*DeviceEIRPValue)(nil), // 99: ttn.lorawan.v3.DeviceEIRPValue + (*MACSettingsProfileIdentifiers)(nil), // 100: ttn.lorawan.v3.MACSettingsProfileIdentifiers + (Class)(0), // 101: ttn.lorawan.v3.Class + (*MACCommand)(nil), // 102: ttn.lorawan.v3.MACCommand + (MACCommandIdentifier)(0), // 103: ttn.lorawan.v3.MACCommandIdentifier + (*RelayForwardDownlinkReq)(nil), // 104: ttn.lorawan.v3.RelayForwardDownlinkReq + (*EndDeviceIdentifiers)(nil), // 105: ttn.lorawan.v3.EndDeviceIdentifiers + (*Picture)(nil), // 106: ttn.lorawan.v3.Picture + (*RootKeys)(nil), // 107: ttn.lorawan.v3.RootKeys + (*structpb.Struct)(nil), // 108: google.protobuf.Struct + (*wrapperspb.BoolValue)(nil), // 109: google.protobuf.BoolValue + (*LoRaAllianceProfileIdentifiers)(nil), // 110: ttn.lorawan.v3.LoRaAllianceProfileIdentifiers + (*fieldmaskpb.FieldMask)(nil), // 111: google.protobuf.FieldMask + (*ApplicationIdentifiers)(nil), // 112: ttn.lorawan.v3.ApplicationIdentifiers + (*DLSettings)(nil), // 113: ttn.lorawan.v3.DLSettings + (*CFList)(nil), // 114: ttn.lorawan.v3.CFList + (*Message)(nil), // 115: ttn.lorawan.v3.Message + (*DataRate)(nil), // 116: ttn.lorawan.v3.DataRate + (*GatewayIdentifiers)(nil), // 117: ttn.lorawan.v3.GatewayIdentifiers + (DownlinkPathConstraint)(0), // 118: ttn.lorawan.v3.DownlinkPathConstraint + (MType)(0), // 119: ttn.lorawan.v3.MType + (*Location)(nil), // 120: ttn.lorawan.v3.Location } var file_ttn_lorawan_v3_end_device_proto_depIdxs = []int32{ - 64, // 0: ttn.lorawan.v3.Session.keys:type_name -> ttn.lorawan.v3.SessionKeys - 65, // 1: ttn.lorawan.v3.Session.started_at:type_name -> google.protobuf.Timestamp - 66, // 2: ttn.lorawan.v3.Session.queued_application_downlinks:type_name -> ttn.lorawan.v3.ApplicationDownlink - 67, // 3: ttn.lorawan.v3.ServingRelayForwardingLimits.reset_behavior:type_name -> ttn.lorawan.v3.RelayResetLimitCounter - 68, // 4: ttn.lorawan.v3.ServingRelayForwardingLimits.join_requests:type_name -> ttn.lorawan.v3.RelayForwardLimits - 68, // 5: ttn.lorawan.v3.ServingRelayForwardingLimits.notifications:type_name -> ttn.lorawan.v3.RelayForwardLimits - 68, // 6: ttn.lorawan.v3.ServingRelayForwardingLimits.uplink_messages:type_name -> ttn.lorawan.v3.RelayForwardLimits - 68, // 7: ttn.lorawan.v3.ServingRelayForwardingLimits.overall:type_name -> ttn.lorawan.v3.RelayForwardLimits - 69, // 8: ttn.lorawan.v3.RelayUplinkForwardingRule.limits:type_name -> ttn.lorawan.v3.RelayUplinkForwardLimits - 70, // 9: ttn.lorawan.v3.ServingRelayParameters.second_channel:type_name -> ttn.lorawan.v3.RelaySecondChannel - 71, // 10: ttn.lorawan.v3.ServingRelayParameters.cad_periodicity:type_name -> ttn.lorawan.v3.RelayCADPeriodicity + 66, // 0: ttn.lorawan.v3.Session.keys:type_name -> ttn.lorawan.v3.SessionKeys + 67, // 1: ttn.lorawan.v3.Session.started_at:type_name -> google.protobuf.Timestamp + 68, // 2: ttn.lorawan.v3.Session.queued_application_downlinks:type_name -> ttn.lorawan.v3.ApplicationDownlink + 69, // 3: ttn.lorawan.v3.ServingRelayForwardingLimits.reset_behavior:type_name -> ttn.lorawan.v3.RelayResetLimitCounter + 70, // 4: ttn.lorawan.v3.ServingRelayForwardingLimits.join_requests:type_name -> ttn.lorawan.v3.RelayForwardLimits + 70, // 5: ttn.lorawan.v3.ServingRelayForwardingLimits.notifications:type_name -> ttn.lorawan.v3.RelayForwardLimits + 70, // 6: ttn.lorawan.v3.ServingRelayForwardingLimits.uplink_messages:type_name -> ttn.lorawan.v3.RelayForwardLimits + 70, // 7: ttn.lorawan.v3.ServingRelayForwardingLimits.overall:type_name -> ttn.lorawan.v3.RelayForwardLimits + 71, // 8: ttn.lorawan.v3.RelayUplinkForwardingRule.limits:type_name -> ttn.lorawan.v3.RelayUplinkForwardLimits + 72, // 9: ttn.lorawan.v3.ServingRelayParameters.second_channel:type_name -> ttn.lorawan.v3.RelaySecondChannel + 73, // 10: ttn.lorawan.v3.ServingRelayParameters.cad_periodicity:type_name -> ttn.lorawan.v3.RelayCADPeriodicity 4, // 11: ttn.lorawan.v3.ServingRelayParameters.uplink_forwarding_rules:type_name -> ttn.lorawan.v3.RelayUplinkForwardingRule 3, // 12: ttn.lorawan.v3.ServingRelayParameters.limits:type_name -> ttn.lorawan.v3.ServingRelayForwardingLimits - 72, // 13: ttn.lorawan.v3.ServedRelayParameters.always:type_name -> ttn.lorawan.v3.RelayEndDeviceAlwaysMode - 73, // 14: ttn.lorawan.v3.ServedRelayParameters.dynamic:type_name -> ttn.lorawan.v3.RelayEndDeviceDynamicMode - 74, // 15: ttn.lorawan.v3.ServedRelayParameters.end_device_controlled:type_name -> ttn.lorawan.v3.RelayEndDeviceControlledMode - 70, // 16: ttn.lorawan.v3.ServedRelayParameters.second_channel:type_name -> ttn.lorawan.v3.RelaySecondChannel + 74, // 13: ttn.lorawan.v3.ServedRelayParameters.always:type_name -> ttn.lorawan.v3.RelayEndDeviceAlwaysMode + 75, // 14: ttn.lorawan.v3.ServedRelayParameters.dynamic:type_name -> ttn.lorawan.v3.RelayEndDeviceDynamicMode + 76, // 15: ttn.lorawan.v3.ServedRelayParameters.end_device_controlled:type_name -> ttn.lorawan.v3.RelayEndDeviceControlledMode + 72, // 16: ttn.lorawan.v3.ServedRelayParameters.second_channel:type_name -> ttn.lorawan.v3.RelaySecondChannel 5, // 17: ttn.lorawan.v3.RelayParameters.serving:type_name -> ttn.lorawan.v3.ServingRelayParameters 6, // 18: ttn.lorawan.v3.RelayParameters.served:type_name -> ttn.lorawan.v3.ServedRelayParameters - 70, // 19: ttn.lorawan.v3.ServingRelaySettings.second_channel:type_name -> ttn.lorawan.v3.RelaySecondChannel - 75, // 20: ttn.lorawan.v3.ServingRelaySettings.default_channel_index:type_name -> google.protobuf.UInt32Value - 71, // 21: ttn.lorawan.v3.ServingRelaySettings.cad_periodicity:type_name -> ttn.lorawan.v3.RelayCADPeriodicity + 72, // 19: ttn.lorawan.v3.ServingRelaySettings.second_channel:type_name -> ttn.lorawan.v3.RelaySecondChannel + 77, // 20: ttn.lorawan.v3.ServingRelaySettings.default_channel_index:type_name -> google.protobuf.UInt32Value + 73, // 21: ttn.lorawan.v3.ServingRelaySettings.cad_periodicity:type_name -> ttn.lorawan.v3.RelayCADPeriodicity 4, // 22: ttn.lorawan.v3.ServingRelaySettings.uplink_forwarding_rules:type_name -> ttn.lorawan.v3.RelayUplinkForwardingRule 3, // 23: ttn.lorawan.v3.ServingRelaySettings.limits:type_name -> ttn.lorawan.v3.ServingRelayForwardingLimits - 72, // 24: ttn.lorawan.v3.ServedRelaySettings.always:type_name -> ttn.lorawan.v3.RelayEndDeviceAlwaysMode - 73, // 25: ttn.lorawan.v3.ServedRelaySettings.dynamic:type_name -> ttn.lorawan.v3.RelayEndDeviceDynamicMode - 74, // 26: ttn.lorawan.v3.ServedRelaySettings.end_device_controlled:type_name -> ttn.lorawan.v3.RelayEndDeviceControlledMode - 75, // 27: ttn.lorawan.v3.ServedRelaySettings.backoff:type_name -> google.protobuf.UInt32Value - 70, // 28: ttn.lorawan.v3.ServedRelaySettings.second_channel:type_name -> ttn.lorawan.v3.RelaySecondChannel + 74, // 24: ttn.lorawan.v3.ServedRelaySettings.always:type_name -> ttn.lorawan.v3.RelayEndDeviceAlwaysMode + 75, // 25: ttn.lorawan.v3.ServedRelaySettings.dynamic:type_name -> ttn.lorawan.v3.RelayEndDeviceDynamicMode + 76, // 26: ttn.lorawan.v3.ServedRelaySettings.end_device_controlled:type_name -> ttn.lorawan.v3.RelayEndDeviceControlledMode + 77, // 27: ttn.lorawan.v3.ServedRelaySettings.backoff:type_name -> google.protobuf.UInt32Value + 72, // 28: ttn.lorawan.v3.ServedRelaySettings.second_channel:type_name -> ttn.lorawan.v3.RelaySecondChannel 8, // 29: ttn.lorawan.v3.RelaySettings.serving:type_name -> ttn.lorawan.v3.ServingRelaySettings 9, // 30: ttn.lorawan.v3.RelaySettings.served:type_name -> ttn.lorawan.v3.ServedRelaySettings - 76, // 31: ttn.lorawan.v3.MACParameters.adr_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 77, // 32: ttn.lorawan.v3.MACParameters.rx1_delay:type_name -> ttn.lorawan.v3.RxDelay - 78, // 33: ttn.lorawan.v3.MACParameters.rx1_data_rate_offset:type_name -> ttn.lorawan.v3.DataRateOffset - 76, // 34: ttn.lorawan.v3.MACParameters.rx2_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 79, // 35: ttn.lorawan.v3.MACParameters.max_duty_cycle:type_name -> ttn.lorawan.v3.AggregatedDutyCycle - 80, // 36: ttn.lorawan.v3.MACParameters.rejoin_time_periodicity:type_name -> ttn.lorawan.v3.RejoinTimeExponent - 81, // 37: ttn.lorawan.v3.MACParameters.rejoin_count_periodicity:type_name -> ttn.lorawan.v3.RejoinCountExponent - 76, // 38: ttn.lorawan.v3.MACParameters.ping_slot_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 36, // 39: ttn.lorawan.v3.MACParameters.channels:type_name -> ttn.lorawan.v3.MACParameters.Channel + 78, // 31: ttn.lorawan.v3.MACParameters.adr_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 79, // 32: ttn.lorawan.v3.MACParameters.rx1_delay:type_name -> ttn.lorawan.v3.RxDelay + 80, // 33: ttn.lorawan.v3.MACParameters.rx1_data_rate_offset:type_name -> ttn.lorawan.v3.DataRateOffset + 78, // 34: ttn.lorawan.v3.MACParameters.rx2_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 81, // 35: ttn.lorawan.v3.MACParameters.max_duty_cycle:type_name -> ttn.lorawan.v3.AggregatedDutyCycle + 82, // 36: ttn.lorawan.v3.MACParameters.rejoin_time_periodicity:type_name -> ttn.lorawan.v3.RejoinTimeExponent + 83, // 37: ttn.lorawan.v3.MACParameters.rejoin_count_periodicity:type_name -> ttn.lorawan.v3.RejoinCountExponent + 78, // 38: ttn.lorawan.v3.MACParameters.ping_slot_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 38, // 39: ttn.lorawan.v3.MACParameters.channels:type_name -> ttn.lorawan.v3.MACParameters.Channel 2, // 40: ttn.lorawan.v3.MACParameters.uplink_dwell_time:type_name -> ttn.lorawan.v3.BoolValue 2, // 41: ttn.lorawan.v3.MACParameters.downlink_dwell_time:type_name -> ttn.lorawan.v3.BoolValue - 82, // 42: ttn.lorawan.v3.MACParameters.adr_ack_limit_exponent:type_name -> ttn.lorawan.v3.ADRAckLimitExponentValue - 83, // 43: ttn.lorawan.v3.MACParameters.adr_ack_delay_exponent:type_name -> ttn.lorawan.v3.ADRAckDelayExponentValue - 84, // 44: ttn.lorawan.v3.MACParameters.ping_slot_data_rate_index_value:type_name -> ttn.lorawan.v3.DataRateIndexValue + 84, // 42: ttn.lorawan.v3.MACParameters.adr_ack_limit_exponent:type_name -> ttn.lorawan.v3.ADRAckLimitExponentValue + 85, // 43: ttn.lorawan.v3.MACParameters.adr_ack_delay_exponent:type_name -> ttn.lorawan.v3.ADRAckDelayExponentValue + 86, // 44: ttn.lorawan.v3.MACParameters.ping_slot_data_rate_index_value:type_name -> ttn.lorawan.v3.DataRateIndexValue 7, // 45: ttn.lorawan.v3.MACParameters.relay:type_name -> ttn.lorawan.v3.RelayParameters - 85, // 46: ttn.lorawan.v3.EndDeviceVersion.ids:type_name -> ttn.lorawan.v3.EndDeviceVersionIdentifiers - 86, // 47: ttn.lorawan.v3.EndDeviceVersion.lorawan_version:type_name -> ttn.lorawan.v3.MACVersion - 87, // 48: ttn.lorawan.v3.EndDeviceVersion.lorawan_phy_version:type_name -> ttn.lorawan.v3.PHYVersion + 87, // 46: ttn.lorawan.v3.EndDeviceVersion.ids:type_name -> ttn.lorawan.v3.EndDeviceVersionIdentifiers + 88, // 47: ttn.lorawan.v3.EndDeviceVersion.lorawan_version:type_name -> ttn.lorawan.v3.MACVersion + 89, // 48: ttn.lorawan.v3.EndDeviceVersion.lorawan_phy_version:type_name -> ttn.lorawan.v3.PHYVersion 14, // 49: ttn.lorawan.v3.EndDeviceVersion.default_mac_settings:type_name -> ttn.lorawan.v3.MACSettings - 88, // 50: ttn.lorawan.v3.EndDeviceVersion.default_formatters:type_name -> ttn.lorawan.v3.MessagePayloadFormatters - 37, // 51: ttn.lorawan.v3.ADRSettings.static:type_name -> ttn.lorawan.v3.ADRSettings.StaticMode - 38, // 52: ttn.lorawan.v3.ADRSettings.dynamic:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode - 39, // 53: ttn.lorawan.v3.ADRSettings.disabled:type_name -> ttn.lorawan.v3.ADRSettings.DisabledMode - 89, // 54: ttn.lorawan.v3.MACSettings.class_b_timeout:type_name -> google.protobuf.Duration - 90, // 55: ttn.lorawan.v3.MACSettings.ping_slot_periodicity:type_name -> ttn.lorawan.v3.PingSlotPeriodValue - 84, // 56: ttn.lorawan.v3.MACSettings.ping_slot_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue - 91, // 57: ttn.lorawan.v3.MACSettings.ping_slot_frequency:type_name -> ttn.lorawan.v3.ZeroableFrequencyValue - 91, // 58: ttn.lorawan.v3.MACSettings.beacon_frequency:type_name -> ttn.lorawan.v3.ZeroableFrequencyValue - 89, // 59: ttn.lorawan.v3.MACSettings.class_c_timeout:type_name -> google.protobuf.Duration - 92, // 60: ttn.lorawan.v3.MACSettings.rx1_delay:type_name -> ttn.lorawan.v3.RxDelayValue - 93, // 61: ttn.lorawan.v3.MACSettings.rx1_data_rate_offset:type_name -> ttn.lorawan.v3.DataRateOffsetValue - 84, // 62: ttn.lorawan.v3.MACSettings.rx2_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue - 94, // 63: ttn.lorawan.v3.MACSettings.rx2_frequency:type_name -> ttn.lorawan.v3.FrequencyValue - 95, // 64: ttn.lorawan.v3.MACSettings.max_duty_cycle:type_name -> ttn.lorawan.v3.AggregatedDutyCycleValue + 90, // 50: ttn.lorawan.v3.EndDeviceVersion.default_formatters:type_name -> ttn.lorawan.v3.MessagePayloadFormatters + 39, // 51: ttn.lorawan.v3.ADRSettings.static:type_name -> ttn.lorawan.v3.ADRSettings.StaticMode + 40, // 52: ttn.lorawan.v3.ADRSettings.dynamic:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode + 41, // 53: ttn.lorawan.v3.ADRSettings.disabled:type_name -> ttn.lorawan.v3.ADRSettings.DisabledMode + 91, // 54: ttn.lorawan.v3.MACSettings.class_b_timeout:type_name -> google.protobuf.Duration + 92, // 55: ttn.lorawan.v3.MACSettings.ping_slot_periodicity:type_name -> ttn.lorawan.v3.PingSlotPeriodValue + 86, // 56: ttn.lorawan.v3.MACSettings.ping_slot_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue + 93, // 57: ttn.lorawan.v3.MACSettings.ping_slot_frequency:type_name -> ttn.lorawan.v3.ZeroableFrequencyValue + 93, // 58: ttn.lorawan.v3.MACSettings.beacon_frequency:type_name -> ttn.lorawan.v3.ZeroableFrequencyValue + 91, // 59: ttn.lorawan.v3.MACSettings.class_c_timeout:type_name -> google.protobuf.Duration + 94, // 60: ttn.lorawan.v3.MACSettings.rx1_delay:type_name -> ttn.lorawan.v3.RxDelayValue + 95, // 61: ttn.lorawan.v3.MACSettings.rx1_data_rate_offset:type_name -> ttn.lorawan.v3.DataRateOffsetValue + 86, // 62: ttn.lorawan.v3.MACSettings.rx2_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue + 96, // 63: ttn.lorawan.v3.MACSettings.rx2_frequency:type_name -> ttn.lorawan.v3.FrequencyValue + 97, // 64: ttn.lorawan.v3.MACSettings.max_duty_cycle:type_name -> ttn.lorawan.v3.AggregatedDutyCycleValue 2, // 65: ttn.lorawan.v3.MACSettings.supports_32_bit_f_cnt:type_name -> ttn.lorawan.v3.BoolValue 2, // 66: ttn.lorawan.v3.MACSettings.use_adr:type_name -> ttn.lorawan.v3.BoolValue - 96, // 67: ttn.lorawan.v3.MACSettings.adr_margin:type_name -> google.protobuf.FloatValue + 98, // 67: ttn.lorawan.v3.MACSettings.adr_margin:type_name -> google.protobuf.FloatValue 2, // 68: ttn.lorawan.v3.MACSettings.resets_f_cnt:type_name -> ttn.lorawan.v3.BoolValue - 89, // 69: ttn.lorawan.v3.MACSettings.status_time_periodicity:type_name -> google.protobuf.Duration - 75, // 70: ttn.lorawan.v3.MACSettings.status_count_periodicity:type_name -> google.protobuf.UInt32Value - 92, // 71: ttn.lorawan.v3.MACSettings.desired_rx1_delay:type_name -> ttn.lorawan.v3.RxDelayValue - 93, // 72: ttn.lorawan.v3.MACSettings.desired_rx1_data_rate_offset:type_name -> ttn.lorawan.v3.DataRateOffsetValue - 84, // 73: ttn.lorawan.v3.MACSettings.desired_rx2_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue - 94, // 74: ttn.lorawan.v3.MACSettings.desired_rx2_frequency:type_name -> ttn.lorawan.v3.FrequencyValue - 95, // 75: ttn.lorawan.v3.MACSettings.desired_max_duty_cycle:type_name -> ttn.lorawan.v3.AggregatedDutyCycleValue - 82, // 76: ttn.lorawan.v3.MACSettings.desired_adr_ack_limit_exponent:type_name -> ttn.lorawan.v3.ADRAckLimitExponentValue - 83, // 77: ttn.lorawan.v3.MACSettings.desired_adr_ack_delay_exponent:type_name -> ttn.lorawan.v3.ADRAckDelayExponentValue - 84, // 78: ttn.lorawan.v3.MACSettings.desired_ping_slot_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue - 91, // 79: ttn.lorawan.v3.MACSettings.desired_ping_slot_frequency:type_name -> ttn.lorawan.v3.ZeroableFrequencyValue - 91, // 80: ttn.lorawan.v3.MACSettings.desired_beacon_frequency:type_name -> ttn.lorawan.v3.ZeroableFrequencyValue - 97, // 81: ttn.lorawan.v3.MACSettings.desired_max_eirp:type_name -> ttn.lorawan.v3.DeviceEIRPValue - 89, // 82: ttn.lorawan.v3.MACSettings.class_b_c_downlink_interval:type_name -> google.protobuf.Duration + 91, // 69: ttn.lorawan.v3.MACSettings.status_time_periodicity:type_name -> google.protobuf.Duration + 77, // 70: ttn.lorawan.v3.MACSettings.status_count_periodicity:type_name -> google.protobuf.UInt32Value + 94, // 71: ttn.lorawan.v3.MACSettings.desired_rx1_delay:type_name -> ttn.lorawan.v3.RxDelayValue + 95, // 72: ttn.lorawan.v3.MACSettings.desired_rx1_data_rate_offset:type_name -> ttn.lorawan.v3.DataRateOffsetValue + 86, // 73: ttn.lorawan.v3.MACSettings.desired_rx2_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue + 96, // 74: ttn.lorawan.v3.MACSettings.desired_rx2_frequency:type_name -> ttn.lorawan.v3.FrequencyValue + 97, // 75: ttn.lorawan.v3.MACSettings.desired_max_duty_cycle:type_name -> ttn.lorawan.v3.AggregatedDutyCycleValue + 84, // 76: ttn.lorawan.v3.MACSettings.desired_adr_ack_limit_exponent:type_name -> ttn.lorawan.v3.ADRAckLimitExponentValue + 85, // 77: ttn.lorawan.v3.MACSettings.desired_adr_ack_delay_exponent:type_name -> ttn.lorawan.v3.ADRAckDelayExponentValue + 86, // 78: ttn.lorawan.v3.MACSettings.desired_ping_slot_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue + 93, // 79: ttn.lorawan.v3.MACSettings.desired_ping_slot_frequency:type_name -> ttn.lorawan.v3.ZeroableFrequencyValue + 93, // 80: ttn.lorawan.v3.MACSettings.desired_beacon_frequency:type_name -> ttn.lorawan.v3.ZeroableFrequencyValue + 99, // 81: ttn.lorawan.v3.MACSettings.desired_max_eirp:type_name -> ttn.lorawan.v3.DeviceEIRPValue + 91, // 82: ttn.lorawan.v3.MACSettings.class_b_c_downlink_interval:type_name -> google.protobuf.Duration 2, // 83: ttn.lorawan.v3.MACSettings.uplink_dwell_time:type_name -> ttn.lorawan.v3.BoolValue 2, // 84: ttn.lorawan.v3.MACSettings.downlink_dwell_time:type_name -> ttn.lorawan.v3.BoolValue 13, // 85: ttn.lorawan.v3.MACSettings.adr:type_name -> ttn.lorawan.v3.ADRSettings 2, // 86: ttn.lorawan.v3.MACSettings.schedule_downlinks:type_name -> ttn.lorawan.v3.BoolValue 10, // 87: ttn.lorawan.v3.MACSettings.relay:type_name -> ttn.lorawan.v3.RelaySettings 10, // 88: ttn.lorawan.v3.MACSettings.desired_relay:type_name -> ttn.lorawan.v3.RelaySettings - 98, // 89: ttn.lorawan.v3.MACSettingsProfile.ids:type_name -> ttn.lorawan.v3.MACSettingsProfileIdentifiers + 100, // 89: ttn.lorawan.v3.MACSettingsProfile.ids:type_name -> ttn.lorawan.v3.MACSettingsProfileIdentifiers 14, // 90: ttn.lorawan.v3.MACSettingsProfile.mac_settings:type_name -> ttn.lorawan.v3.MACSettings 11, // 91: ttn.lorawan.v3.MACState.current_parameters:type_name -> ttn.lorawan.v3.MACParameters 11, // 92: ttn.lorawan.v3.MACState.desired_parameters:type_name -> ttn.lorawan.v3.MACParameters - 99, // 93: ttn.lorawan.v3.MACState.device_class:type_name -> ttn.lorawan.v3.Class - 86, // 94: ttn.lorawan.v3.MACState.lorawan_version:type_name -> ttn.lorawan.v3.MACVersion - 65, // 95: ttn.lorawan.v3.MACState.last_confirmed_downlink_at:type_name -> google.protobuf.Timestamp - 90, // 96: ttn.lorawan.v3.MACState.ping_slot_periodicity:type_name -> ttn.lorawan.v3.PingSlotPeriodValue - 66, // 97: ttn.lorawan.v3.MACState.pending_application_downlink:type_name -> ttn.lorawan.v3.ApplicationDownlink - 100, // 98: ttn.lorawan.v3.MACState.queued_responses:type_name -> ttn.lorawan.v3.MACCommand - 100, // 99: ttn.lorawan.v3.MACState.pending_requests:type_name -> ttn.lorawan.v3.MACCommand - 46, // 100: ttn.lorawan.v3.MACState.queued_join_accept:type_name -> ttn.lorawan.v3.MACState.JoinAccept - 45, // 101: ttn.lorawan.v3.MACState.pending_join_request:type_name -> ttn.lorawan.v3.MACState.JoinRequest - 47, // 102: ttn.lorawan.v3.MACState.recent_uplinks:type_name -> ttn.lorawan.v3.MACState.UplinkMessage - 48, // 103: ttn.lorawan.v3.MACState.recent_downlinks:type_name -> ttn.lorawan.v3.MACState.DownlinkMessage - 65, // 104: ttn.lorawan.v3.MACState.last_network_initiated_downlink_at:type_name -> google.protobuf.Timestamp - 76, // 105: ttn.lorawan.v3.MACState.rejected_adr_data_rate_indexes:type_name -> ttn.lorawan.v3.DataRateIndex - 65, // 106: ttn.lorawan.v3.MACState.last_downlink_at:type_name -> google.protobuf.Timestamp - 51, // 107: ttn.lorawan.v3.MACState.rejected_data_rate_ranges:type_name -> ttn.lorawan.v3.MACState.RejectedDataRateRangesEntry - 101, // 108: ttn.lorawan.v3.MACState.recent_mac_command_identifiers:type_name -> ttn.lorawan.v3.MACCommandIdentifier - 102, // 109: ttn.lorawan.v3.MACState.pending_relay_downlink:type_name -> ttn.lorawan.v3.RelayForwardDownlinkReq - 65, // 110: ttn.lorawan.v3.EndDeviceAuthenticationCode.valid_from:type_name -> google.protobuf.Timestamp - 65, // 111: ttn.lorawan.v3.EndDeviceAuthenticationCode.valid_to:type_name -> google.protobuf.Timestamp - 103, // 112: ttn.lorawan.v3.EndDevice.ids:type_name -> ttn.lorawan.v3.EndDeviceIdentifiers - 65, // 113: ttn.lorawan.v3.EndDevice.created_at:type_name -> google.protobuf.Timestamp - 65, // 114: ttn.lorawan.v3.EndDevice.updated_at:type_name -> google.protobuf.Timestamp - 59, // 115: ttn.lorawan.v3.EndDevice.attributes:type_name -> ttn.lorawan.v3.EndDevice.AttributesEntry - 85, // 116: ttn.lorawan.v3.EndDevice.version_ids:type_name -> ttn.lorawan.v3.EndDeviceVersionIdentifiers - 60, // 117: ttn.lorawan.v3.EndDevice.locations:type_name -> ttn.lorawan.v3.EndDevice.LocationsEntry - 104, // 118: ttn.lorawan.v3.EndDevice.picture:type_name -> ttn.lorawan.v3.Picture - 86, // 119: ttn.lorawan.v3.EndDevice.lorawan_version:type_name -> ttn.lorawan.v3.MACVersion - 87, // 120: ttn.lorawan.v3.EndDevice.lorawan_phy_version:type_name -> ttn.lorawan.v3.PHYVersion - 105, // 121: ttn.lorawan.v3.EndDevice.root_keys:type_name -> ttn.lorawan.v3.RootKeys + 101, // 93: ttn.lorawan.v3.MACState.device_class:type_name -> ttn.lorawan.v3.Class + 88, // 94: ttn.lorawan.v3.MACState.lorawan_version:type_name -> ttn.lorawan.v3.MACVersion + 67, // 95: ttn.lorawan.v3.MACState.last_confirmed_downlink_at:type_name -> google.protobuf.Timestamp + 92, // 96: ttn.lorawan.v3.MACState.ping_slot_periodicity:type_name -> ttn.lorawan.v3.PingSlotPeriodValue + 68, // 97: ttn.lorawan.v3.MACState.pending_application_downlink:type_name -> ttn.lorawan.v3.ApplicationDownlink + 102, // 98: ttn.lorawan.v3.MACState.queued_responses:type_name -> ttn.lorawan.v3.MACCommand + 102, // 99: ttn.lorawan.v3.MACState.pending_requests:type_name -> ttn.lorawan.v3.MACCommand + 48, // 100: ttn.lorawan.v3.MACState.queued_join_accept:type_name -> ttn.lorawan.v3.MACState.JoinAccept + 47, // 101: ttn.lorawan.v3.MACState.pending_join_request:type_name -> ttn.lorawan.v3.MACState.JoinRequest + 49, // 102: ttn.lorawan.v3.MACState.recent_uplinks:type_name -> ttn.lorawan.v3.MACState.UplinkMessage + 50, // 103: ttn.lorawan.v3.MACState.recent_downlinks:type_name -> ttn.lorawan.v3.MACState.DownlinkMessage + 67, // 104: ttn.lorawan.v3.MACState.last_network_initiated_downlink_at:type_name -> google.protobuf.Timestamp + 78, // 105: ttn.lorawan.v3.MACState.rejected_adr_data_rate_indexes:type_name -> ttn.lorawan.v3.DataRateIndex + 67, // 106: ttn.lorawan.v3.MACState.last_downlink_at:type_name -> google.protobuf.Timestamp + 53, // 107: ttn.lorawan.v3.MACState.rejected_data_rate_ranges:type_name -> ttn.lorawan.v3.MACState.RejectedDataRateRangesEntry + 103, // 108: ttn.lorawan.v3.MACState.recent_mac_command_identifiers:type_name -> ttn.lorawan.v3.MACCommandIdentifier + 104, // 109: ttn.lorawan.v3.MACState.pending_relay_downlink:type_name -> ttn.lorawan.v3.RelayForwardDownlinkReq + 67, // 110: ttn.lorawan.v3.EndDeviceAuthenticationCode.valid_from:type_name -> google.protobuf.Timestamp + 67, // 111: ttn.lorawan.v3.EndDeviceAuthenticationCode.valid_to:type_name -> google.protobuf.Timestamp + 105, // 112: ttn.lorawan.v3.EndDevice.ids:type_name -> ttn.lorawan.v3.EndDeviceIdentifiers + 67, // 113: ttn.lorawan.v3.EndDevice.created_at:type_name -> google.protobuf.Timestamp + 67, // 114: ttn.lorawan.v3.EndDevice.updated_at:type_name -> google.protobuf.Timestamp + 61, // 115: ttn.lorawan.v3.EndDevice.attributes:type_name -> ttn.lorawan.v3.EndDevice.AttributesEntry + 87, // 116: ttn.lorawan.v3.EndDevice.version_ids:type_name -> ttn.lorawan.v3.EndDeviceVersionIdentifiers + 62, // 117: ttn.lorawan.v3.EndDevice.locations:type_name -> ttn.lorawan.v3.EndDevice.LocationsEntry + 106, // 118: ttn.lorawan.v3.EndDevice.picture:type_name -> ttn.lorawan.v3.Picture + 88, // 119: ttn.lorawan.v3.EndDevice.lorawan_version:type_name -> ttn.lorawan.v3.MACVersion + 89, // 120: ttn.lorawan.v3.EndDevice.lorawan_phy_version:type_name -> ttn.lorawan.v3.PHYVersion + 107, // 121: ttn.lorawan.v3.EndDevice.root_keys:type_name -> ttn.lorawan.v3.RootKeys 14, // 122: ttn.lorawan.v3.EndDevice.mac_settings:type_name -> ttn.lorawan.v3.MACSettings 16, // 123: ttn.lorawan.v3.EndDevice.mac_state:type_name -> ttn.lorawan.v3.MACState 16, // 124: ttn.lorawan.v3.EndDevice.pending_mac_state:type_name -> ttn.lorawan.v3.MACState 1, // 125: ttn.lorawan.v3.EndDevice.session:type_name -> ttn.lorawan.v3.Session 1, // 126: ttn.lorawan.v3.EndDevice.pending_session:type_name -> ttn.lorawan.v3.Session - 65, // 127: ttn.lorawan.v3.EndDevice.last_dev_status_received_at:type_name -> google.protobuf.Timestamp + 67, // 127: ttn.lorawan.v3.EndDevice.last_dev_status_received_at:type_name -> google.protobuf.Timestamp 0, // 128: ttn.lorawan.v3.EndDevice.power_state:type_name -> ttn.lorawan.v3.PowerState - 96, // 129: ttn.lorawan.v3.EndDevice.battery_percentage:type_name -> google.protobuf.FloatValue - 66, // 130: ttn.lorawan.v3.EndDevice.queued_application_downlinks:type_name -> ttn.lorawan.v3.ApplicationDownlink - 88, // 131: ttn.lorawan.v3.EndDevice.formatters:type_name -> ttn.lorawan.v3.MessagePayloadFormatters - 106, // 132: ttn.lorawan.v3.EndDevice.provisioning_data:type_name -> google.protobuf.Struct + 98, // 129: ttn.lorawan.v3.EndDevice.battery_percentage:type_name -> google.protobuf.FloatValue + 68, // 130: ttn.lorawan.v3.EndDevice.queued_application_downlinks:type_name -> ttn.lorawan.v3.ApplicationDownlink + 90, // 131: ttn.lorawan.v3.EndDevice.formatters:type_name -> ttn.lorawan.v3.MessagePayloadFormatters + 108, // 132: ttn.lorawan.v3.EndDevice.provisioning_data:type_name -> google.protobuf.Struct 17, // 133: ttn.lorawan.v3.EndDevice.claim_authentication_code:type_name -> ttn.lorawan.v3.EndDeviceAuthenticationCode - 107, // 134: ttn.lorawan.v3.EndDevice.skip_payload_crypto_override:type_name -> google.protobuf.BoolValue - 65, // 135: ttn.lorawan.v3.EndDevice.activated_at:type_name -> google.protobuf.Timestamp - 65, // 136: ttn.lorawan.v3.EndDevice.last_seen_at:type_name -> google.protobuf.Timestamp - 108, // 137: ttn.lorawan.v3.EndDevice.lora_alliance_profile_ids:type_name -> ttn.lorawan.v3.LoRaAllianceProfileIdentifiers - 98, // 138: ttn.lorawan.v3.EndDevice.mac_settings_profile_ids:type_name -> ttn.lorawan.v3.MACSettingsProfileIdentifiers + 109, // 134: ttn.lorawan.v3.EndDevice.skip_payload_crypto_override:type_name -> google.protobuf.BoolValue + 67, // 135: ttn.lorawan.v3.EndDevice.activated_at:type_name -> google.protobuf.Timestamp + 67, // 136: ttn.lorawan.v3.EndDevice.last_seen_at:type_name -> google.protobuf.Timestamp + 110, // 137: ttn.lorawan.v3.EndDevice.lora_alliance_profile_ids:type_name -> ttn.lorawan.v3.LoRaAllianceProfileIdentifiers + 100, // 138: ttn.lorawan.v3.EndDevice.mac_settings_profile_ids:type_name -> ttn.lorawan.v3.MACSettingsProfileIdentifiers 18, // 139: ttn.lorawan.v3.EndDevices.end_devices:type_name -> ttn.lorawan.v3.EndDevice 18, // 140: ttn.lorawan.v3.CreateEndDeviceRequest.end_device:type_name -> ttn.lorawan.v3.EndDevice 18, // 141: ttn.lorawan.v3.UpdateEndDeviceRequest.end_device:type_name -> ttn.lorawan.v3.EndDevice - 109, // 142: ttn.lorawan.v3.UpdateEndDeviceRequest.field_mask:type_name -> google.protobuf.FieldMask - 61, // 143: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.updates:type_name -> ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.EndDeviceLastSeenUpdate - 103, // 144: ttn.lorawan.v3.GetEndDeviceRequest.end_device_ids:type_name -> ttn.lorawan.v3.EndDeviceIdentifiers - 109, // 145: ttn.lorawan.v3.GetEndDeviceRequest.field_mask:type_name -> google.protobuf.FieldMask - 110, // 146: ttn.lorawan.v3.ListEndDevicesRequest.application_ids:type_name -> ttn.lorawan.v3.ApplicationIdentifiers - 109, // 147: ttn.lorawan.v3.ListEndDevicesRequest.field_mask:type_name -> google.protobuf.FieldMask - 62, // 148: ttn.lorawan.v3.ListEndDevicesRequest.filters:type_name -> ttn.lorawan.v3.ListEndDevicesRequest.Filter - 18, // 149: ttn.lorawan.v3.SetEndDeviceRequest.end_device:type_name -> ttn.lorawan.v3.EndDevice - 109, // 150: ttn.lorawan.v3.SetEndDeviceRequest.field_mask:type_name -> google.protobuf.FieldMask - 103, // 151: ttn.lorawan.v3.ResetAndGetEndDeviceRequest.end_device_ids:type_name -> ttn.lorawan.v3.EndDeviceIdentifiers - 109, // 152: ttn.lorawan.v3.ResetAndGetEndDeviceRequest.field_mask:type_name -> google.protobuf.FieldMask - 18, // 153: ttn.lorawan.v3.EndDeviceTemplate.end_device:type_name -> ttn.lorawan.v3.EndDevice - 109, // 154: ttn.lorawan.v3.EndDeviceTemplate.field_mask:type_name -> google.protobuf.FieldMask - 63, // 155: ttn.lorawan.v3.EndDeviceTemplateFormats.formats:type_name -> ttn.lorawan.v3.EndDeviceTemplateFormats.FormatsEntry - 85, // 156: ttn.lorawan.v3.ConvertEndDeviceTemplateRequest.end_device_version_ids:type_name -> ttn.lorawan.v3.EndDeviceVersionIdentifiers - 110, // 157: ttn.lorawan.v3.BatchDeleteEndDevicesRequest.application_ids:type_name -> ttn.lorawan.v3.ApplicationIdentifiers - 110, // 158: ttn.lorawan.v3.BatchGetEndDevicesRequest.application_ids:type_name -> ttn.lorawan.v3.ApplicationIdentifiers - 109, // 159: ttn.lorawan.v3.BatchGetEndDevicesRequest.field_mask:type_name -> google.protobuf.FieldMask - 110, // 160: ttn.lorawan.v3.BatchSetMACSettingsProfileRequest.application_ids:type_name -> ttn.lorawan.v3.ApplicationIdentifiers - 98, // 161: ttn.lorawan.v3.BatchSetMACSettingsProfileRequest.mac_settings_profile_ids:type_name -> ttn.lorawan.v3.MACSettingsProfileIdentifiers - 76, // 162: ttn.lorawan.v3.MACParameters.Channel.min_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 76, // 163: ttn.lorawan.v3.MACParameters.Channel.max_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 76, // 164: ttn.lorawan.v3.ADRSettings.StaticMode.data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 96, // 165: ttn.lorawan.v3.ADRSettings.DynamicMode.margin:type_name -> google.protobuf.FloatValue - 84, // 166: ttn.lorawan.v3.ADRSettings.DynamicMode.min_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue - 84, // 167: ttn.lorawan.v3.ADRSettings.DynamicMode.max_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue - 75, // 168: ttn.lorawan.v3.ADRSettings.DynamicMode.min_tx_power_index:type_name -> google.protobuf.UInt32Value - 75, // 169: ttn.lorawan.v3.ADRSettings.DynamicMode.max_tx_power_index:type_name -> google.protobuf.UInt32Value - 75, // 170: ttn.lorawan.v3.ADRSettings.DynamicMode.min_nb_trans:type_name -> google.protobuf.UInt32Value - 75, // 171: ttn.lorawan.v3.ADRSettings.DynamicMode.max_nb_trans:type_name -> google.protobuf.UInt32Value - 40, // 172: ttn.lorawan.v3.ADRSettings.DynamicMode.channel_steering:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings - 42, // 173: ttn.lorawan.v3.ADRSettings.DynamicMode.overrides:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides - 43, // 174: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.lora_narrow:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.LoRaNarrowMode - 44, // 175: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.disabled:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.DisabledMode - 75, // 176: ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride.min_nb_trans:type_name -> google.protobuf.UInt32Value - 75, // 177: ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride.max_nb_trans:type_name -> google.protobuf.UInt32Value - 41, // 178: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_0:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride - 41, // 179: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_1:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride - 41, // 180: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_2:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride - 41, // 181: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_3:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride - 41, // 182: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_4:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride - 41, // 183: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_5:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride - 41, // 184: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_6:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride - 41, // 185: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_7:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride - 41, // 186: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_8:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride - 41, // 187: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_9:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride - 41, // 188: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_10:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride - 41, // 189: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_11:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride - 41, // 190: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_12:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride - 41, // 191: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_13:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride - 41, // 192: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_14:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride - 41, // 193: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_15:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride - 111, // 194: ttn.lorawan.v3.MACState.JoinRequest.downlink_settings:type_name -> ttn.lorawan.v3.DLSettings - 77, // 195: ttn.lorawan.v3.MACState.JoinRequest.rx_delay:type_name -> ttn.lorawan.v3.RxDelay - 112, // 196: ttn.lorawan.v3.MACState.JoinRequest.cf_list:type_name -> ttn.lorawan.v3.CFList - 45, // 197: ttn.lorawan.v3.MACState.JoinAccept.request:type_name -> ttn.lorawan.v3.MACState.JoinRequest - 64, // 198: ttn.lorawan.v3.MACState.JoinAccept.keys:type_name -> ttn.lorawan.v3.SessionKeys - 113, // 199: ttn.lorawan.v3.MACState.UplinkMessage.payload:type_name -> ttn.lorawan.v3.Message - 52, // 200: ttn.lorawan.v3.MACState.UplinkMessage.settings:type_name -> ttn.lorawan.v3.MACState.UplinkMessage.TxSettings - 53, // 201: ttn.lorawan.v3.MACState.UplinkMessage.rx_metadata:type_name -> ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata - 65, // 202: ttn.lorawan.v3.MACState.UplinkMessage.received_at:type_name -> google.protobuf.Timestamp - 56, // 203: ttn.lorawan.v3.MACState.DownlinkMessage.payload:type_name -> ttn.lorawan.v3.MACState.DownlinkMessage.Message - 76, // 204: ttn.lorawan.v3.MACState.DataRateRange.min_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 76, // 205: ttn.lorawan.v3.MACState.DataRateRange.max_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex - 49, // 206: ttn.lorawan.v3.MACState.DataRateRanges.ranges:type_name -> ttn.lorawan.v3.MACState.DataRateRange - 50, // 207: ttn.lorawan.v3.MACState.RejectedDataRateRangesEntry.value:type_name -> ttn.lorawan.v3.MACState.DataRateRanges - 114, // 208: ttn.lorawan.v3.MACState.UplinkMessage.TxSettings.data_rate:type_name -> ttn.lorawan.v3.DataRate - 115, // 209: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers - 116, // 210: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.downlink_path_constraint:type_name -> ttn.lorawan.v3.DownlinkPathConstraint - 54, // 211: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.packet_broker:type_name -> ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.PacketBrokerMetadata - 55, // 212: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.relay:type_name -> ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.RelayMetadata - 57, // 213: ttn.lorawan.v3.MACState.DownlinkMessage.Message.m_hdr:type_name -> ttn.lorawan.v3.MACState.DownlinkMessage.Message.MHDR - 58, // 214: ttn.lorawan.v3.MACState.DownlinkMessage.Message.mac_payload:type_name -> ttn.lorawan.v3.MACState.DownlinkMessage.Message.MACPayload - 117, // 215: ttn.lorawan.v3.MACState.DownlinkMessage.Message.MHDR.m_type:type_name -> ttn.lorawan.v3.MType - 118, // 216: ttn.lorawan.v3.EndDevice.LocationsEntry.value:type_name -> ttn.lorawan.v3.Location - 103, // 217: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.EndDeviceLastSeenUpdate.ids:type_name -> ttn.lorawan.v3.EndDeviceIdentifiers - 65, // 218: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.EndDeviceLastSeenUpdate.last_seen_at:type_name -> google.protobuf.Timestamp - 65, // 219: ttn.lorawan.v3.ListEndDevicesRequest.Filter.updated_since:type_name -> google.protobuf.Timestamp - 30, // 220: ttn.lorawan.v3.EndDeviceTemplateFormats.FormatsEntry.value:type_name -> ttn.lorawan.v3.EndDeviceTemplateFormat - 221, // [221:221] is the sub-list for method output_type - 221, // [221:221] is the sub-list for method input_type - 221, // [221:221] is the sub-list for extension type_name - 221, // [221:221] is the sub-list for extension extendee - 0, // [0:221] is the sub-list for field type_name + 111, // 142: ttn.lorawan.v3.UpdateEndDeviceRequest.field_mask:type_name -> google.protobuf.FieldMask + 63, // 143: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.updates:type_name -> ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.EndDeviceLastSeenUpdate + 105, // 144: ttn.lorawan.v3.GetEndDeviceRequest.end_device_ids:type_name -> ttn.lorawan.v3.EndDeviceIdentifiers + 111, // 145: ttn.lorawan.v3.GetEndDeviceRequest.field_mask:type_name -> google.protobuf.FieldMask + 112, // 146: ttn.lorawan.v3.ListEndDevicesRequest.application_ids:type_name -> ttn.lorawan.v3.ApplicationIdentifiers + 111, // 147: ttn.lorawan.v3.ListEndDevicesRequest.field_mask:type_name -> google.protobuf.FieldMask + 64, // 148: ttn.lorawan.v3.ListEndDevicesRequest.filters:type_name -> ttn.lorawan.v3.ListEndDevicesRequest.Filter + 112, // 149: ttn.lorawan.v3.CountEndDevicesRequest.application_ids:type_name -> ttn.lorawan.v3.ApplicationIdentifiers + 64, // 150: ttn.lorawan.v3.CountEndDevicesRequest.filters:type_name -> ttn.lorawan.v3.ListEndDevicesRequest.Filter + 18, // 151: ttn.lorawan.v3.SetEndDeviceRequest.end_device:type_name -> ttn.lorawan.v3.EndDevice + 111, // 152: ttn.lorawan.v3.SetEndDeviceRequest.field_mask:type_name -> google.protobuf.FieldMask + 105, // 153: ttn.lorawan.v3.ResetAndGetEndDeviceRequest.end_device_ids:type_name -> ttn.lorawan.v3.EndDeviceIdentifiers + 111, // 154: ttn.lorawan.v3.ResetAndGetEndDeviceRequest.field_mask:type_name -> google.protobuf.FieldMask + 18, // 155: ttn.lorawan.v3.EndDeviceTemplate.end_device:type_name -> ttn.lorawan.v3.EndDevice + 111, // 156: ttn.lorawan.v3.EndDeviceTemplate.field_mask:type_name -> google.protobuf.FieldMask + 65, // 157: ttn.lorawan.v3.EndDeviceTemplateFormats.formats:type_name -> ttn.lorawan.v3.EndDeviceTemplateFormats.FormatsEntry + 87, // 158: ttn.lorawan.v3.ConvertEndDeviceTemplateRequest.end_device_version_ids:type_name -> ttn.lorawan.v3.EndDeviceVersionIdentifiers + 112, // 159: ttn.lorawan.v3.BatchDeleteEndDevicesRequest.application_ids:type_name -> ttn.lorawan.v3.ApplicationIdentifiers + 112, // 160: ttn.lorawan.v3.BatchGetEndDevicesRequest.application_ids:type_name -> ttn.lorawan.v3.ApplicationIdentifiers + 111, // 161: ttn.lorawan.v3.BatchGetEndDevicesRequest.field_mask:type_name -> google.protobuf.FieldMask + 112, // 162: ttn.lorawan.v3.BatchSetMACSettingsProfileRequest.application_ids:type_name -> ttn.lorawan.v3.ApplicationIdentifiers + 100, // 163: ttn.lorawan.v3.BatchSetMACSettingsProfileRequest.mac_settings_profile_ids:type_name -> ttn.lorawan.v3.MACSettingsProfileIdentifiers + 78, // 164: ttn.lorawan.v3.MACParameters.Channel.min_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 78, // 165: ttn.lorawan.v3.MACParameters.Channel.max_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 78, // 166: ttn.lorawan.v3.ADRSettings.StaticMode.data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 98, // 167: ttn.lorawan.v3.ADRSettings.DynamicMode.margin:type_name -> google.protobuf.FloatValue + 86, // 168: ttn.lorawan.v3.ADRSettings.DynamicMode.min_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue + 86, // 169: ttn.lorawan.v3.ADRSettings.DynamicMode.max_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndexValue + 77, // 170: ttn.lorawan.v3.ADRSettings.DynamicMode.min_tx_power_index:type_name -> google.protobuf.UInt32Value + 77, // 171: ttn.lorawan.v3.ADRSettings.DynamicMode.max_tx_power_index:type_name -> google.protobuf.UInt32Value + 77, // 172: ttn.lorawan.v3.ADRSettings.DynamicMode.min_nb_trans:type_name -> google.protobuf.UInt32Value + 77, // 173: ttn.lorawan.v3.ADRSettings.DynamicMode.max_nb_trans:type_name -> google.protobuf.UInt32Value + 42, // 174: ttn.lorawan.v3.ADRSettings.DynamicMode.channel_steering:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings + 44, // 175: ttn.lorawan.v3.ADRSettings.DynamicMode.overrides:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides + 45, // 176: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.lora_narrow:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.LoRaNarrowMode + 46, // 177: ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.disabled:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.ChannelSteeringSettings.DisabledMode + 77, // 178: ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride.min_nb_trans:type_name -> google.protobuf.UInt32Value + 77, // 179: ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride.max_nb_trans:type_name -> google.protobuf.UInt32Value + 43, // 180: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_0:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride + 43, // 181: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_1:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride + 43, // 182: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_2:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride + 43, // 183: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_3:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride + 43, // 184: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_4:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride + 43, // 185: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_5:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride + 43, // 186: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_6:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride + 43, // 187: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_7:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride + 43, // 188: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_8:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride + 43, // 189: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_9:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride + 43, // 190: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_10:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride + 43, // 191: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_11:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride + 43, // 192: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_12:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride + 43, // 193: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_13:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride + 43, // 194: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_14:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride + 43, // 195: ttn.lorawan.v3.ADRSettings.DynamicMode.Overrides.data_rate_15:type_name -> ttn.lorawan.v3.ADRSettings.DynamicMode.PerDataRateIndexOverride + 113, // 196: ttn.lorawan.v3.MACState.JoinRequest.downlink_settings:type_name -> ttn.lorawan.v3.DLSettings + 79, // 197: ttn.lorawan.v3.MACState.JoinRequest.rx_delay:type_name -> ttn.lorawan.v3.RxDelay + 114, // 198: ttn.lorawan.v3.MACState.JoinRequest.cf_list:type_name -> ttn.lorawan.v3.CFList + 47, // 199: ttn.lorawan.v3.MACState.JoinAccept.request:type_name -> ttn.lorawan.v3.MACState.JoinRequest + 66, // 200: ttn.lorawan.v3.MACState.JoinAccept.keys:type_name -> ttn.lorawan.v3.SessionKeys + 115, // 201: ttn.lorawan.v3.MACState.UplinkMessage.payload:type_name -> ttn.lorawan.v3.Message + 54, // 202: ttn.lorawan.v3.MACState.UplinkMessage.settings:type_name -> ttn.lorawan.v3.MACState.UplinkMessage.TxSettings + 55, // 203: ttn.lorawan.v3.MACState.UplinkMessage.rx_metadata:type_name -> ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata + 67, // 204: ttn.lorawan.v3.MACState.UplinkMessage.received_at:type_name -> google.protobuf.Timestamp + 58, // 205: ttn.lorawan.v3.MACState.DownlinkMessage.payload:type_name -> ttn.lorawan.v3.MACState.DownlinkMessage.Message + 78, // 206: ttn.lorawan.v3.MACState.DataRateRange.min_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 78, // 207: ttn.lorawan.v3.MACState.DataRateRange.max_data_rate_index:type_name -> ttn.lorawan.v3.DataRateIndex + 51, // 208: ttn.lorawan.v3.MACState.DataRateRanges.ranges:type_name -> ttn.lorawan.v3.MACState.DataRateRange + 52, // 209: ttn.lorawan.v3.MACState.RejectedDataRateRangesEntry.value:type_name -> ttn.lorawan.v3.MACState.DataRateRanges + 116, // 210: ttn.lorawan.v3.MACState.UplinkMessage.TxSettings.data_rate:type_name -> ttn.lorawan.v3.DataRate + 117, // 211: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers + 118, // 212: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.downlink_path_constraint:type_name -> ttn.lorawan.v3.DownlinkPathConstraint + 56, // 213: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.packet_broker:type_name -> ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.PacketBrokerMetadata + 57, // 214: ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.relay:type_name -> ttn.lorawan.v3.MACState.UplinkMessage.RxMetadata.RelayMetadata + 59, // 215: ttn.lorawan.v3.MACState.DownlinkMessage.Message.m_hdr:type_name -> ttn.lorawan.v3.MACState.DownlinkMessage.Message.MHDR + 60, // 216: ttn.lorawan.v3.MACState.DownlinkMessage.Message.mac_payload:type_name -> ttn.lorawan.v3.MACState.DownlinkMessage.Message.MACPayload + 119, // 217: ttn.lorawan.v3.MACState.DownlinkMessage.Message.MHDR.m_type:type_name -> ttn.lorawan.v3.MType + 120, // 218: ttn.lorawan.v3.EndDevice.LocationsEntry.value:type_name -> ttn.lorawan.v3.Location + 105, // 219: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.EndDeviceLastSeenUpdate.ids:type_name -> ttn.lorawan.v3.EndDeviceIdentifiers + 67, // 220: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest.EndDeviceLastSeenUpdate.last_seen_at:type_name -> google.protobuf.Timestamp + 67, // 221: ttn.lorawan.v3.ListEndDevicesRequest.Filter.updated_since:type_name -> google.protobuf.Timestamp + 32, // 222: ttn.lorawan.v3.EndDeviceTemplateFormats.FormatsEntry.value:type_name -> ttn.lorawan.v3.EndDeviceTemplateFormat + 223, // [223:223] is the sub-list for method output_type + 223, // [223:223] is the sub-list for method input_type + 223, // [223:223] is the sub-list for extension type_name + 223, // [223:223] is the sub-list for extension extendee + 0, // [0:223] is the sub-list for field type_name } func init() { file_ttn_lorawan_v3_end_device_proto_init() } @@ -7955,7 +8076,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetEndDeviceRequest); i { + switch v := v.(*CountEndDevicesRequest); i { case 0: return &v.state case 1: @@ -7967,7 +8088,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResetAndGetEndDeviceRequest); i { + switch v := v.(*CountEndDevicesResponse); i { case 0: return &v.state case 1: @@ -7979,7 +8100,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EndDeviceTemplate); i { + switch v := v.(*SetEndDeviceRequest); i { case 0: return &v.state case 1: @@ -7991,7 +8112,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EndDeviceTemplateFormat); i { + switch v := v.(*ResetAndGetEndDeviceRequest); i { case 0: return &v.state case 1: @@ -8003,7 +8124,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EndDeviceTemplateFormats); i { + switch v := v.(*EndDeviceTemplate); i { case 0: return &v.state case 1: @@ -8015,7 +8136,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConvertEndDeviceTemplateRequest); i { + switch v := v.(*EndDeviceTemplateFormat); i { case 0: return &v.state case 1: @@ -8027,7 +8148,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchDeleteEndDevicesRequest); i { + switch v := v.(*EndDeviceTemplateFormats); i { case 0: return &v.state case 1: @@ -8039,7 +8160,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchGetEndDevicesRequest); i { + switch v := v.(*ConvertEndDeviceTemplateRequest); i { case 0: return &v.state case 1: @@ -8051,7 +8172,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchSetMACSettingsProfileRequest); i { + switch v := v.(*BatchDeleteEndDevicesRequest); i { case 0: return &v.state case 1: @@ -8063,7 +8184,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACParameters_Channel); i { + switch v := v.(*BatchGetEndDevicesRequest); i { case 0: return &v.state case 1: @@ -8075,7 +8196,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ADRSettings_StaticMode); i { + switch v := v.(*BatchSetMACSettingsProfileRequest); i { case 0: return &v.state case 1: @@ -8087,7 +8208,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ADRSettings_DynamicMode); i { + switch v := v.(*MACParameters_Channel); i { case 0: return &v.state case 1: @@ -8099,7 +8220,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ADRSettings_DisabledMode); i { + switch v := v.(*ADRSettings_StaticMode); i { case 0: return &v.state case 1: @@ -8111,7 +8232,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ADRSettings_DynamicMode_ChannelSteeringSettings); i { + switch v := v.(*ADRSettings_DynamicMode); i { case 0: return &v.state case 1: @@ -8123,7 +8244,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ADRSettings_DynamicMode_PerDataRateIndexOverride); i { + switch v := v.(*ADRSettings_DisabledMode); i { case 0: return &v.state case 1: @@ -8135,7 +8256,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ADRSettings_DynamicMode_Overrides); i { + switch v := v.(*ADRSettings_DynamicMode_ChannelSteeringSettings); i { case 0: return &v.state case 1: @@ -8147,7 +8268,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode); i { + switch v := v.(*ADRSettings_DynamicMode_PerDataRateIndexOverride); i { case 0: return &v.state case 1: @@ -8159,7 +8280,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode); i { + switch v := v.(*ADRSettings_DynamicMode_Overrides); i { case 0: return &v.state case 1: @@ -8171,7 +8292,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACState_JoinRequest); i { + switch v := v.(*ADRSettings_DynamicMode_ChannelSteeringSettings_LoRaNarrowMode); i { case 0: return &v.state case 1: @@ -8183,7 +8304,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACState_JoinAccept); i { + switch v := v.(*ADRSettings_DynamicMode_ChannelSteeringSettings_DisabledMode); i { case 0: return &v.state case 1: @@ -8195,7 +8316,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACState_UplinkMessage); i { + switch v := v.(*MACState_JoinRequest); i { case 0: return &v.state case 1: @@ -8207,7 +8328,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACState_DownlinkMessage); i { + switch v := v.(*MACState_JoinAccept); i { case 0: return &v.state case 1: @@ -8219,7 +8340,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACState_DataRateRange); i { + switch v := v.(*MACState_UplinkMessage); i { case 0: return &v.state case 1: @@ -8231,7 +8352,19 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MACState_DataRateRanges); i { + switch v := v.(*MACState_DownlinkMessage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_end_device_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACState_DataRateRange); i { case 0: return &v.state case 1: @@ -8243,6 +8376,18 @@ func file_ttn_lorawan_v3_end_device_proto_init() { } } file_ttn_lorawan_v3_end_device_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MACState_DataRateRanges); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_end_device_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MACState_UplinkMessage_TxSettings); i { case 0: return &v.state @@ -8254,7 +8399,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { return nil } } - file_ttn_lorawan_v3_end_device_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_ttn_lorawan_v3_end_device_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MACState_UplinkMessage_RxMetadata); i { case 0: return &v.state @@ -8266,7 +8411,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { return nil } } - file_ttn_lorawan_v3_end_device_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_ttn_lorawan_v3_end_device_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MACState_UplinkMessage_RxMetadata_PacketBrokerMetadata); i { case 0: return &v.state @@ -8278,7 +8423,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { return nil } } - file_ttn_lorawan_v3_end_device_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_ttn_lorawan_v3_end_device_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MACState_UplinkMessage_RxMetadata_RelayMetadata); i { case 0: return &v.state @@ -8290,7 +8435,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { return nil } } - file_ttn_lorawan_v3_end_device_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_ttn_lorawan_v3_end_device_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MACState_DownlinkMessage_Message); i { case 0: return &v.state @@ -8302,7 +8447,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { return nil } } - file_ttn_lorawan_v3_end_device_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_ttn_lorawan_v3_end_device_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MACState_DownlinkMessage_Message_MHDR); i { case 0: return &v.state @@ -8314,7 +8459,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { return nil } } - file_ttn_lorawan_v3_end_device_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_ttn_lorawan_v3_end_device_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MACState_DownlinkMessage_Message_MACPayload); i { case 0: return &v.state @@ -8326,7 +8471,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { return nil } } - file_ttn_lorawan_v3_end_device_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_ttn_lorawan_v3_end_device_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BatchUpdateEndDeviceLastSeenRequest_EndDeviceLastSeenUpdate); i { case 0: return &v.state @@ -8338,7 +8483,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { return nil } } - file_ttn_lorawan_v3_end_device_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_ttn_lorawan_v3_end_device_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListEndDevicesRequest_Filter); i { case 0: return &v.state @@ -8374,11 +8519,11 @@ func file_ttn_lorawan_v3_end_device_proto_init() { (*ADRSettings_Dynamic)(nil), (*ADRSettings_Disabled)(nil), } - file_ttn_lorawan_v3_end_device_proto_msgTypes[39].OneofWrappers = []interface{}{ + file_ttn_lorawan_v3_end_device_proto_msgTypes[41].OneofWrappers = []interface{}{ (*ADRSettings_DynamicMode_ChannelSteeringSettings_LoraNarrow)(nil), (*ADRSettings_DynamicMode_ChannelSteeringSettings_Disabled)(nil), } - file_ttn_lorawan_v3_end_device_proto_msgTypes[61].OneofWrappers = []interface{}{ + file_ttn_lorawan_v3_end_device_proto_msgTypes[63].OneofWrappers = []interface{}{ (*ListEndDevicesRequest_Filter_UpdatedSince)(nil), } type x struct{} @@ -8387,7 +8532,7 @@ func file_ttn_lorawan_v3_end_device_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_ttn_lorawan_v3_end_device_proto_rawDesc, NumEnums: 1, - NumMessages: 63, + NumMessages: 65, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/ttnpb/end_device.pb.paths.fm.go b/pkg/ttnpb/end_device.pb.paths.fm.go index 4263c36c51..bc9ecd86e7 100644 --- a/pkg/ttnpb/end_device.pb.paths.fm.go +++ b/pkg/ttnpb/end_device.pb.paths.fm.go @@ -3897,6 +3897,23 @@ var ListEndDevicesRequestFieldPathsTopLevel = []string{ "order", "page", } +var CountEndDevicesRequestFieldPathsNested = []string{ + "application_ids", + "application_ids.application_id", + "filters", +} + +var CountEndDevicesRequestFieldPathsTopLevel = []string{ + "application_ids", + "filters", +} +var CountEndDevicesResponseFieldPathsNested = []string{ + "count", +} + +var CountEndDevicesResponseFieldPathsTopLevel = []string{ + "count", +} var SetEndDeviceRequestFieldPathsNested = []string{ "end_device", "end_device.activated_at", diff --git a/pkg/ttnpb/end_device.pb.setters.fm.go b/pkg/ttnpb/end_device.pb.setters.fm.go index 9a4439e02c..a2c64c3e79 100644 --- a/pkg/ttnpb/end_device.pb.setters.fm.go +++ b/pkg/ttnpb/end_device.pb.setters.fm.go @@ -4002,6 +4002,72 @@ func (dst *ListEndDevicesRequest) SetFields(src *ListEndDevicesRequest, paths .. return nil } +func (dst *CountEndDevicesRequest) SetFields(src *CountEndDevicesRequest, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "application_ids": + if len(subs) > 0 { + var newDst, newSrc *ApplicationIdentifiers + if (src == nil || src.ApplicationIds == nil) && dst.ApplicationIds == nil { + continue + } + if src != nil { + newSrc = src.ApplicationIds + } + if dst.ApplicationIds != nil { + newDst = dst.ApplicationIds + } else { + newDst = &ApplicationIdentifiers{} + dst.ApplicationIds = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.ApplicationIds = src.ApplicationIds + } else { + dst.ApplicationIds = nil + } + } + case "filters": + if len(subs) > 0 { + return fmt.Errorf("'filters' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Filters = src.Filters + } else { + dst.Filters = nil + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + +func (dst *CountEndDevicesResponse) SetFields(src *CountEndDevicesResponse, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "count": + if len(subs) > 0 { + return fmt.Errorf("'count' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Count = src.Count + } else { + var zero uint64 + dst.Count = zero + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + func (dst *SetEndDeviceRequest) SetFields(src *SetEndDeviceRequest, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { diff --git a/pkg/ttnpb/end_device.pb.validate.go b/pkg/ttnpb/end_device.pb.validate.go index 66d301b4b5..e6643fd7b3 100644 --- a/pkg/ttnpb/end_device.pb.validate.go +++ b/pkg/ttnpb/end_device.pb.validate.go @@ -4686,6 +4686,206 @@ var _ListEndDevicesRequest_Order_InLookup = map[string]struct{}{ "-last_seen_at": {}, } +// ValidateFields checks the field values on CountEndDevicesRequest with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *CountEndDevicesRequest) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = CountEndDevicesRequestFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "application_ids": + + if m.GetApplicationIds() == nil { + return CountEndDevicesRequestValidationError{ + field: "application_ids", + reason: "value is required", + } + } + + if v, ok := interface{}(m.GetApplicationIds()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return CountEndDevicesRequestValidationError{ + field: "application_ids", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case "filters": + + for idx, item := range m.GetFilters() { + _, _ = idx, item + + if v, ok := interface{}(item).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return CountEndDevicesRequestValidationError{ + field: fmt.Sprintf("filters[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + default: + return CountEndDevicesRequestValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// CountEndDevicesRequestValidationError is the validation error returned by +// CountEndDevicesRequest.ValidateFields if the designated constraints aren't met. +type CountEndDevicesRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e CountEndDevicesRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e CountEndDevicesRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e CountEndDevicesRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e CountEndDevicesRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e CountEndDevicesRequestValidationError) ErrorName() string { + return "CountEndDevicesRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e CountEndDevicesRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sCountEndDevicesRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = CountEndDevicesRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = CountEndDevicesRequestValidationError{} + +// ValidateFields checks the field values on CountEndDevicesResponse with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *CountEndDevicesResponse) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = CountEndDevicesResponseFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "count": + // no validation rules for Count + default: + return CountEndDevicesResponseValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// CountEndDevicesResponseValidationError is the validation error returned by +// CountEndDevicesResponse.ValidateFields if the designated constraints aren't met. +type CountEndDevicesResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e CountEndDevicesResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e CountEndDevicesResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e CountEndDevicesResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e CountEndDevicesResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e CountEndDevicesResponseValidationError) ErrorName() string { + return "CountEndDevicesResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e CountEndDevicesResponseValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sCountEndDevicesResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = CountEndDevicesResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = CountEndDevicesResponseValidationError{} + // ValidateFields checks the field values on SetEndDeviceRequest with the rules // defined in the proto definition for this message. If any rules are // violated, an error is returned. diff --git a/pkg/ttnpb/end_device_services.pb.go b/pkg/ttnpb/end_device_services.pb.go index ba56c6f250..23f361d2a8 100644 --- a/pkg/ttnpb/end_device_services.pb.go +++ b/pkg/ttnpb/end_device_services.pb.go @@ -53,7 +53,7 @@ var file_ttn_lorawan_v3_end_device_services_proto_rawDesc = []byte{ 0x61, 0x6e, 0x2f, 0x76, 0x33, 0x2f, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x74, 0x74, 0x6e, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2f, 0x76, 0x33, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x9e, 0x09, 0x0a, 0x11, 0x45, 0x6e, 0x64, + 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0xbf, 0x0a, 0x0a, 0x11, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x12, 0x9d, 0x01, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, @@ -96,87 +96,97 @@ var file_ttn_lorawan_v3_end_device_services_proto_rawDesc = []byte{ 0x36, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0xb8, 0x01, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x12, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x74, 0x6e, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x9e, 0x01, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, + 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x12, 0x3c, 0x2f, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xb8, 0x01, 0x0a, 0x06, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x26, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x74, + 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x65, 0x3a, 0x01, + 0x2a, 0x1a, 0x60, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x7b, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x69, 0x64, 0x73, + 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, + 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x2e, 0x69, 0x64, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x7d, 0x12, 0x62, 0x0a, 0x13, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x33, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x92, 0x01, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x12, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x2a, 0x42, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x1a, 0x3c, 0x92, 0x41, + 0x39, 0x12, 0x37, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x54, 0x68, 0x69, + 0x6e, 0x67, 0x73, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x32, 0xbf, 0x02, 0x0a, 0x1a, 0x45, + 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x72, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, + 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x65, 0x64, 0x74, 0x63, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x73, 0x12, 0x79, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x12, 0x2f, 0x2e, 0x74, + 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, + 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x65, 0x64, + 0x74, 0x63, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x30, 0x01, 0x1a, 0x3e, 0x92, 0x41, + 0x3b, 0x12, 0x39, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x2e, 0x32, 0x8d, 0x03, 0x0a, + 0x16, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x12, 0x92, 0x01, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, + 0x29, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x65, 0x3a, 0x01, 0x2a, - 0x1a, 0x60, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x7b, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x69, 0x64, 0x73, 0x2e, - 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x2e, - 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x69, 0x64, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x7d, 0x12, 0x62, 0x0a, 0x13, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x33, 0x2e, 0x74, 0x74, 0x6e, 0x2e, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4c, - 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x92, 0x01, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x12, 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x2a, 0x42, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, - 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x1a, 0x3c, 0x92, 0x41, 0x39, - 0x12, 0x37, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x54, 0x68, 0x69, 0x6e, - 0x67, 0x73, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x32, 0xbf, 0x02, 0x0a, 0x1a, 0x45, 0x6e, - 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, - 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x72, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x28, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0f, 0x12, 0x0d, 0x2f, 0x65, 0x64, 0x74, 0x63, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, - 0x12, 0x79, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x12, 0x2f, 0x2e, 0x74, 0x74, - 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6e, - 0x76, 0x65, 0x72, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x74, - 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, - 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, - 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x65, 0x64, 0x74, - 0x63, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x30, 0x01, 0x1a, 0x3e, 0x92, 0x41, 0x3b, - 0x12, 0x39, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x2e, 0x32, 0x8d, 0x03, 0x0a, 0x16, - 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x12, 0x92, 0x01, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x29, - 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, - 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x64, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x12, 0x3c, 0x2f, - 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x2e, 0x61, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x12, 0x94, 0x01, 0x0a, 0x06, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, - 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x44, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x3e, 0x2a, 0x3c, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x73, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x62, 0x61, 0x74, - 0x63, 0x68, 0x1a, 0x47, 0x92, 0x41, 0x44, 0x12, 0x42, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x20, - 0x65, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x54, - 0x68, 0x65, 0x20, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x20, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, - 0x69, 0x6e, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x2e, 0x42, 0x31, 0x5a, 0x2f, 0x67, - 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x12, 0x3c, + 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x2e, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x12, 0x94, 0x01, 0x0a, + 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x44, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x2a, 0x3c, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x1a, 0x47, 0x92, 0x41, 0x44, 0x12, 0x42, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x20, 0x65, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x69, 0x6e, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x2e, 0x42, 0x31, 0x5a, 0x2f, + 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var file_ttn_lorawan_v3_end_device_services_proto_goTypes = []interface{}{ @@ -184,43 +194,47 @@ var file_ttn_lorawan_v3_end_device_services_proto_goTypes = []interface{}{ (*GetEndDeviceRequest)(nil), // 1: ttn.lorawan.v3.GetEndDeviceRequest (*GetEndDeviceIdentifiersForEUIsRequest)(nil), // 2: ttn.lorawan.v3.GetEndDeviceIdentifiersForEUIsRequest (*ListEndDevicesRequest)(nil), // 3: ttn.lorawan.v3.ListEndDevicesRequest - (*UpdateEndDeviceRequest)(nil), // 4: ttn.lorawan.v3.UpdateEndDeviceRequest - (*BatchUpdateEndDeviceLastSeenRequest)(nil), // 5: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest - (*EndDeviceIdentifiers)(nil), // 6: ttn.lorawan.v3.EndDeviceIdentifiers - (*emptypb.Empty)(nil), // 7: google.protobuf.Empty - (*ConvertEndDeviceTemplateRequest)(nil), // 8: ttn.lorawan.v3.ConvertEndDeviceTemplateRequest - (*BatchGetEndDevicesRequest)(nil), // 9: ttn.lorawan.v3.BatchGetEndDevicesRequest - (*BatchDeleteEndDevicesRequest)(nil), // 10: ttn.lorawan.v3.BatchDeleteEndDevicesRequest - (*EndDevice)(nil), // 11: ttn.lorawan.v3.EndDevice - (*EndDevices)(nil), // 12: ttn.lorawan.v3.EndDevices - (*EndDeviceTemplateFormats)(nil), // 13: ttn.lorawan.v3.EndDeviceTemplateFormats - (*EndDeviceTemplate)(nil), // 14: ttn.lorawan.v3.EndDeviceTemplate + (*CountEndDevicesRequest)(nil), // 4: ttn.lorawan.v3.CountEndDevicesRequest + (*UpdateEndDeviceRequest)(nil), // 5: ttn.lorawan.v3.UpdateEndDeviceRequest + (*BatchUpdateEndDeviceLastSeenRequest)(nil), // 6: ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest + (*EndDeviceIdentifiers)(nil), // 7: ttn.lorawan.v3.EndDeviceIdentifiers + (*emptypb.Empty)(nil), // 8: google.protobuf.Empty + (*ConvertEndDeviceTemplateRequest)(nil), // 9: ttn.lorawan.v3.ConvertEndDeviceTemplateRequest + (*BatchGetEndDevicesRequest)(nil), // 10: ttn.lorawan.v3.BatchGetEndDevicesRequest + (*BatchDeleteEndDevicesRequest)(nil), // 11: ttn.lorawan.v3.BatchDeleteEndDevicesRequest + (*EndDevice)(nil), // 12: ttn.lorawan.v3.EndDevice + (*EndDevices)(nil), // 13: ttn.lorawan.v3.EndDevices + (*CountEndDevicesResponse)(nil), // 14: ttn.lorawan.v3.CountEndDevicesResponse + (*EndDeviceTemplateFormats)(nil), // 15: ttn.lorawan.v3.EndDeviceTemplateFormats + (*EndDeviceTemplate)(nil), // 16: ttn.lorawan.v3.EndDeviceTemplate } var file_ttn_lorawan_v3_end_device_services_proto_depIdxs = []int32{ 0, // 0: ttn.lorawan.v3.EndDeviceRegistry.Create:input_type -> ttn.lorawan.v3.CreateEndDeviceRequest 1, // 1: ttn.lorawan.v3.EndDeviceRegistry.Get:input_type -> ttn.lorawan.v3.GetEndDeviceRequest 2, // 2: ttn.lorawan.v3.EndDeviceRegistry.GetIdentifiersForEUIs:input_type -> ttn.lorawan.v3.GetEndDeviceIdentifiersForEUIsRequest 3, // 3: ttn.lorawan.v3.EndDeviceRegistry.List:input_type -> ttn.lorawan.v3.ListEndDevicesRequest - 4, // 4: ttn.lorawan.v3.EndDeviceRegistry.Update:input_type -> ttn.lorawan.v3.UpdateEndDeviceRequest - 5, // 5: ttn.lorawan.v3.EndDeviceRegistry.BatchUpdateLastSeen:input_type -> ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest - 6, // 6: ttn.lorawan.v3.EndDeviceRegistry.Delete:input_type -> ttn.lorawan.v3.EndDeviceIdentifiers - 7, // 7: ttn.lorawan.v3.EndDeviceTemplateConverter.ListFormats:input_type -> google.protobuf.Empty - 8, // 8: ttn.lorawan.v3.EndDeviceTemplateConverter.Convert:input_type -> ttn.lorawan.v3.ConvertEndDeviceTemplateRequest - 9, // 9: ttn.lorawan.v3.EndDeviceBatchRegistry.Get:input_type -> ttn.lorawan.v3.BatchGetEndDevicesRequest - 10, // 10: ttn.lorawan.v3.EndDeviceBatchRegistry.Delete:input_type -> ttn.lorawan.v3.BatchDeleteEndDevicesRequest - 11, // 11: ttn.lorawan.v3.EndDeviceRegistry.Create:output_type -> ttn.lorawan.v3.EndDevice - 11, // 12: ttn.lorawan.v3.EndDeviceRegistry.Get:output_type -> ttn.lorawan.v3.EndDevice - 6, // 13: ttn.lorawan.v3.EndDeviceRegistry.GetIdentifiersForEUIs:output_type -> ttn.lorawan.v3.EndDeviceIdentifiers - 12, // 14: ttn.lorawan.v3.EndDeviceRegistry.List:output_type -> ttn.lorawan.v3.EndDevices - 11, // 15: ttn.lorawan.v3.EndDeviceRegistry.Update:output_type -> ttn.lorawan.v3.EndDevice - 7, // 16: ttn.lorawan.v3.EndDeviceRegistry.BatchUpdateLastSeen:output_type -> google.protobuf.Empty - 7, // 17: ttn.lorawan.v3.EndDeviceRegistry.Delete:output_type -> google.protobuf.Empty - 13, // 18: ttn.lorawan.v3.EndDeviceTemplateConverter.ListFormats:output_type -> ttn.lorawan.v3.EndDeviceTemplateFormats - 14, // 19: ttn.lorawan.v3.EndDeviceTemplateConverter.Convert:output_type -> ttn.lorawan.v3.EndDeviceTemplate - 12, // 20: ttn.lorawan.v3.EndDeviceBatchRegistry.Get:output_type -> ttn.lorawan.v3.EndDevices - 7, // 21: ttn.lorawan.v3.EndDeviceBatchRegistry.Delete:output_type -> google.protobuf.Empty - 11, // [11:22] is the sub-list for method output_type - 0, // [0:11] is the sub-list for method input_type + 4, // 4: ttn.lorawan.v3.EndDeviceRegistry.Count:input_type -> ttn.lorawan.v3.CountEndDevicesRequest + 5, // 5: ttn.lorawan.v3.EndDeviceRegistry.Update:input_type -> ttn.lorawan.v3.UpdateEndDeviceRequest + 6, // 6: ttn.lorawan.v3.EndDeviceRegistry.BatchUpdateLastSeen:input_type -> ttn.lorawan.v3.BatchUpdateEndDeviceLastSeenRequest + 7, // 7: ttn.lorawan.v3.EndDeviceRegistry.Delete:input_type -> ttn.lorawan.v3.EndDeviceIdentifiers + 8, // 8: ttn.lorawan.v3.EndDeviceTemplateConverter.ListFormats:input_type -> google.protobuf.Empty + 9, // 9: ttn.lorawan.v3.EndDeviceTemplateConverter.Convert:input_type -> ttn.lorawan.v3.ConvertEndDeviceTemplateRequest + 10, // 10: ttn.lorawan.v3.EndDeviceBatchRegistry.Get:input_type -> ttn.lorawan.v3.BatchGetEndDevicesRequest + 11, // 11: ttn.lorawan.v3.EndDeviceBatchRegistry.Delete:input_type -> ttn.lorawan.v3.BatchDeleteEndDevicesRequest + 12, // 12: ttn.lorawan.v3.EndDeviceRegistry.Create:output_type -> ttn.lorawan.v3.EndDevice + 12, // 13: ttn.lorawan.v3.EndDeviceRegistry.Get:output_type -> ttn.lorawan.v3.EndDevice + 7, // 14: ttn.lorawan.v3.EndDeviceRegistry.GetIdentifiersForEUIs:output_type -> ttn.lorawan.v3.EndDeviceIdentifiers + 13, // 15: ttn.lorawan.v3.EndDeviceRegistry.List:output_type -> ttn.lorawan.v3.EndDevices + 14, // 16: ttn.lorawan.v3.EndDeviceRegistry.Count:output_type -> ttn.lorawan.v3.CountEndDevicesResponse + 12, // 17: ttn.lorawan.v3.EndDeviceRegistry.Update:output_type -> ttn.lorawan.v3.EndDevice + 8, // 18: ttn.lorawan.v3.EndDeviceRegistry.BatchUpdateLastSeen:output_type -> google.protobuf.Empty + 8, // 19: ttn.lorawan.v3.EndDeviceRegistry.Delete:output_type -> google.protobuf.Empty + 15, // 20: ttn.lorawan.v3.EndDeviceTemplateConverter.ListFormats:output_type -> ttn.lorawan.v3.EndDeviceTemplateFormats + 16, // 21: ttn.lorawan.v3.EndDeviceTemplateConverter.Convert:output_type -> ttn.lorawan.v3.EndDeviceTemplate + 13, // 22: ttn.lorawan.v3.EndDeviceBatchRegistry.Get:output_type -> ttn.lorawan.v3.EndDevices + 8, // 23: ttn.lorawan.v3.EndDeviceBatchRegistry.Delete:output_type -> google.protobuf.Empty + 12, // [12:24] is the sub-list for method output_type + 0, // [0:12] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/pkg/ttnpb/end_device_services.pb.gw.go b/pkg/ttnpb/end_device_services.pb.gw.go index 61795bb3ea..6e64a8b870 100644 --- a/pkg/ttnpb/end_device_services.pb.gw.go +++ b/pkg/ttnpb/end_device_services.pb.gw.go @@ -312,6 +312,76 @@ func local_request_EndDeviceRegistry_List_1(ctx context.Context, marshaler runti } +var ( + filter_EndDeviceRegistry_Count_0 = &utilities.DoubleArray{Encoding: map[string]int{"application_ids": 0, "application_id": 1}, Base: []int{1, 1, 1, 0}, Check: []int{0, 1, 2, 3}} +) + +func request_EndDeviceRegistry_Count_0(ctx context.Context, marshaler runtime.Marshaler, client EndDeviceRegistryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CountEndDevicesRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["application_ids.application_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "application_ids.application_id") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "application_ids.application_id", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "application_ids.application_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_EndDeviceRegistry_Count_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Count(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_EndDeviceRegistry_Count_0(ctx context.Context, marshaler runtime.Marshaler, server EndDeviceRegistryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CountEndDevicesRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["application_ids.application_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "application_ids.application_id") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "application_ids.application_id", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "application_ids.application_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_EndDeviceRegistry_Count_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Count(ctx, &protoReq) + return msg, metadata, err + +} + func request_EndDeviceRegistry_Update_0(ctx context.Context, marshaler runtime.Marshaler, client EndDeviceRegistryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq UpdateEndDeviceRequest var metadata runtime.ServerMetadata @@ -767,6 +837,31 @@ func RegisterEndDeviceRegistryHandlerServer(ctx context.Context, mux *runtime.Se }) + mux.Handle("GET", pattern_EndDeviceRegistry_Count_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/ttn.lorawan.v3.EndDeviceRegistry/Count", runtime.WithHTTPPathPattern("/applications/{application_ids.application_id}/devices/count")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_EndDeviceRegistry_Count_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_EndDeviceRegistry_Count_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("PUT", pattern_EndDeviceRegistry_Update_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1046,6 +1141,28 @@ func RegisterEndDeviceRegistryHandlerClient(ctx context.Context, mux *runtime.Se }) + mux.Handle("GET", pattern_EndDeviceRegistry_Count_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/ttn.lorawan.v3.EndDeviceRegistry/Count", runtime.WithHTTPPathPattern("/applications/{application_ids.application_id}/devices/count")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_EndDeviceRegistry_Count_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_EndDeviceRegistry_Count_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("PUT", pattern_EndDeviceRegistry_Update_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1102,6 +1219,8 @@ var ( pattern_EndDeviceRegistry_List_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 2, 3}, []string{"applications", "application_ids.application_id", "devices", "filter"}, "")) + pattern_EndDeviceRegistry_Count_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 2, 3}, []string{"applications", "application_ids.application_id", "devices", "count"}, "")) + pattern_EndDeviceRegistry_Update_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"applications", "end_device.ids.application_ids.application_id", "devices", "end_device.ids.device_id"}, "")) pattern_EndDeviceRegistry_Delete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"applications", "application_ids.application_id", "devices", "device_id"}, "")) @@ -1116,6 +1235,8 @@ var ( forward_EndDeviceRegistry_List_1 = runtime.ForwardResponseMessage + forward_EndDeviceRegistry_Count_0 = runtime.ForwardResponseMessage + forward_EndDeviceRegistry_Update_0 = runtime.ForwardResponseMessage forward_EndDeviceRegistry_Delete_0 = runtime.ForwardResponseMessage diff --git a/pkg/ttnpb/end_device_services_grpc.pb.go b/pkg/ttnpb/end_device_services_grpc.pb.go index 18d413f645..d9472dac4e 100644 --- a/pkg/ttnpb/end_device_services_grpc.pb.go +++ b/pkg/ttnpb/end_device_services_grpc.pb.go @@ -38,6 +38,7 @@ const ( EndDeviceRegistry_Get_FullMethodName = "/ttn.lorawan.v3.EndDeviceRegistry/Get" EndDeviceRegistry_GetIdentifiersForEUIs_FullMethodName = "/ttn.lorawan.v3.EndDeviceRegistry/GetIdentifiersForEUIs" EndDeviceRegistry_List_FullMethodName = "/ttn.lorawan.v3.EndDeviceRegistry/List" + EndDeviceRegistry_Count_FullMethodName = "/ttn.lorawan.v3.EndDeviceRegistry/Count" EndDeviceRegistry_Update_FullMethodName = "/ttn.lorawan.v3.EndDeviceRegistry/Update" EndDeviceRegistry_BatchUpdateLastSeen_FullMethodName = "/ttn.lorawan.v3.EndDeviceRegistry/BatchUpdateLastSeen" EndDeviceRegistry_Delete_FullMethodName = "/ttn.lorawan.v3.EndDeviceRegistry/Delete" @@ -64,6 +65,8 @@ type EndDeviceRegistryClient interface { // Similar to Get, this selects the fields given by the field mask. // More or less fields may be returned, depending on the rights of the caller. List(ctx context.Context, in *ListEndDevicesRequest, opts ...grpc.CallOption) (*EndDevices, error) + // Count end devices in the given application. + Count(ctx context.Context, in *CountEndDevicesRequest, opts ...grpc.CallOption) (*CountEndDevicesResponse, error) // Update the end device, changing the fields specified by the field mask to the provided values. Update(ctx context.Context, in *UpdateEndDeviceRequest, opts ...grpc.CallOption) (*EndDevice, error) // Update the last seen timestamp for a batch of end devices. @@ -122,6 +125,15 @@ func (c *endDeviceRegistryClient) List(ctx context.Context, in *ListEndDevicesRe return out, nil } +func (c *endDeviceRegistryClient) Count(ctx context.Context, in *CountEndDevicesRequest, opts ...grpc.CallOption) (*CountEndDevicesResponse, error) { + out := new(CountEndDevicesResponse) + err := c.cc.Invoke(ctx, EndDeviceRegistry_Count_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *endDeviceRegistryClient) Update(ctx context.Context, in *UpdateEndDeviceRequest, opts ...grpc.CallOption) (*EndDevice, error) { out := new(EndDevice) err := c.cc.Invoke(ctx, EndDeviceRegistry_Update_FullMethodName, in, out, opts...) @@ -170,6 +182,8 @@ type EndDeviceRegistryServer interface { // Similar to Get, this selects the fields given by the field mask. // More or less fields may be returned, depending on the rights of the caller. List(context.Context, *ListEndDevicesRequest) (*EndDevices, error) + // Count end devices in the given application. + Count(context.Context, *CountEndDevicesRequest) (*CountEndDevicesResponse, error) // Update the end device, changing the fields specified by the field mask to the provided values. Update(context.Context, *UpdateEndDeviceRequest) (*EndDevice, error) // Update the last seen timestamp for a batch of end devices. @@ -201,6 +215,9 @@ func (UnimplementedEndDeviceRegistryServer) GetIdentifiersForEUIs(context.Contex func (UnimplementedEndDeviceRegistryServer) List(context.Context, *ListEndDevicesRequest) (*EndDevices, error) { return nil, status.Errorf(codes.Unimplemented, "method List not implemented") } +func (UnimplementedEndDeviceRegistryServer) Count(context.Context, *CountEndDevicesRequest) (*CountEndDevicesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Count not implemented") +} func (UnimplementedEndDeviceRegistryServer) Update(context.Context, *UpdateEndDeviceRequest) (*EndDevice, error) { return nil, status.Errorf(codes.Unimplemented, "method Update not implemented") } @@ -295,6 +312,24 @@ func _EndDeviceRegistry_List_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } +func _EndDeviceRegistry_Count_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CountEndDevicesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EndDeviceRegistryServer).Count(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: EndDeviceRegistry_Count_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EndDeviceRegistryServer).Count(ctx, req.(*CountEndDevicesRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _EndDeviceRegistry_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateEndDeviceRequest) if err := dec(in); err != nil { @@ -372,6 +407,10 @@ var EndDeviceRegistry_ServiceDesc = grpc.ServiceDesc{ MethodName: "List", Handler: _EndDeviceRegistry_List_Handler, }, + { + MethodName: "Count", + Handler: _EndDeviceRegistry_Count_Handler, + }, { MethodName: "Update", Handler: _EndDeviceRegistry_Update_Handler, diff --git a/sdk/js/generated/api-definition.json b/sdk/js/generated/api-definition.json index 0dd792adc5..7bc9123aa6 100644 --- a/sdk/js/generated/api-definition.json +++ b/sdk/js/generated/api-definition.json @@ -3013,6 +3013,18 @@ "last_seen_at" ] }, + "Count": { + "file": "ttn/lorawan/v3/end_device_services.proto", + "http": [ + { + "method": "get", + "pattern": "/applications/{application_ids.application_id}/devices/count", + "parameters": [ + "application_ids.application_id" + ] + } + ] + }, "Update": { "file": "ttn/lorawan/v3/end_device_services.proto", "http": [ diff --git a/sdk/js/generated/api.json b/sdk/js/generated/api.json index 63ee796d24..e715f3ba05 100644 --- a/sdk/js/generated/api.json +++ b/sdk/js/generated/api.json @@ -16031,6 +16031,74 @@ } ] }, + { + "name": "CountEndDevicesRequest", + "longName": "CountEndDevicesRequest", + "fullName": "ttn.lorawan.v3.CountEndDevicesRequest", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "application_ids", + "description": "", + "label": "", + "type": "ApplicationIdentifiers", + "longType": "ApplicationIdentifiers", + "fullType": "ttn.lorawan.v3.ApplicationIdentifiers", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "message.required", + "value": true + } + ] + } + }, + { + "name": "filters", + "description": "", + "label": "repeated", + "type": "Filter", + "longType": "ListEndDevicesRequest.Filter", + "fullType": "ttn.lorawan.v3.ListEndDevicesRequest.Filter", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "CountEndDevicesResponse", + "longName": "CountEndDevicesResponse", + "fullName": "ttn.lorawan.v3.CountEndDevicesResponse", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "count", + "description": "", + "label": "", + "type": "uint64", + "longType": "uint64", + "fullType": "uint64", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, { "name": "CreateEndDeviceRequest", "longName": "CreateEndDeviceRequest", @@ -20981,6 +21049,28 @@ } } }, + { + "name": "Count", + "description": "Count end devices in the given application.", + "requestType": "CountEndDevicesRequest", + "requestLongType": "CountEndDevicesRequest", + "requestFullType": "ttn.lorawan.v3.CountEndDevicesRequest", + "requestStreaming": false, + "responseType": "CountEndDevicesResponse", + "responseLongType": "CountEndDevicesResponse", + "responseFullType": "ttn.lorawan.v3.CountEndDevicesResponse", + "responseStreaming": false, + "options": { + "google.api.http": { + "rules": [ + { + "method": "GET", + "pattern": "/applications/{application_ids.application_id}/devices/count" + } + ] + } + } + }, { "name": "Update", "description": "Update the end device, changing the fields specified by the field mask to the provided values.",