diff --git a/apis/serviceconn/gateway_activity/pb/gw_activity.pb.go b/apis/serviceconn/gateway_activity/pb/gw_activity.pb.go index 0b72e63f..78c63974 100644 --- a/apis/serviceconn/gateway_activity/pb/gw_activity.pb.go +++ b/apis/serviceconn/gateway_activity/pb/gw_activity.pb.go @@ -8577,6 +8577,772 @@ func (x *GetPerformanceAnalyticsResponse) GetError() *Error { return nil } +// Get Trending Blogs +type GetTrendingBlogsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AccountId string `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` + TimeRange string `protobuf:"bytes,2,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"` // "24h", "7d", etc. + Limit int32 `protobuf:"varint,3,opt,name=limit,proto3" json:"limit,omitempty"` +} + +func (x *GetTrendingBlogsRequest) Reset() { + *x = GetTrendingBlogsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[72] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetTrendingBlogsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTrendingBlogsRequest) ProtoMessage() {} + +func (x *GetTrendingBlogsRequest) ProtoReflect() protoreflect.Message { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[72] + 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 GetTrendingBlogsRequest.ProtoReflect.Descriptor instead. +func (*GetTrendingBlogsRequest) Descriptor() ([]byte, []int) { + return file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDescGZIP(), []int{72} +} + +func (x *GetTrendingBlogsRequest) GetAccountId() string { + if x != nil { + return x.AccountId + } + return "" +} + +func (x *GetTrendingBlogsRequest) GetTimeRange() string { + if x != nil { + return x.TimeRange + } + return "" +} + +func (x *GetTrendingBlogsRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +type TrendingBlog struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BlogId string `protobuf:"bytes,1,opt,name=blog_id,json=blogId,proto3" json:"blog_id,omitempty"` + Views int64 `protobuf:"varint,2,opt,name=views,proto3" json:"views,omitempty"` + Likes int64 `protobuf:"varint,3,opt,name=likes,proto3" json:"likes,omitempty"` + Score float64 `protobuf:"fixed64,4,opt,name=score,proto3" json:"score,omitempty"` +} + +func (x *TrendingBlog) Reset() { + *x = TrendingBlog{} + if protoimpl.UnsafeEnabled { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[73] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TrendingBlog) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TrendingBlog) ProtoMessage() {} + +func (x *TrendingBlog) ProtoReflect() protoreflect.Message { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[73] + 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 TrendingBlog.ProtoReflect.Descriptor instead. +func (*TrendingBlog) Descriptor() ([]byte, []int) { + return file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDescGZIP(), []int{73} +} + +func (x *TrendingBlog) GetBlogId() string { + if x != nil { + return x.BlogId + } + return "" +} + +func (x *TrendingBlog) GetViews() int64 { + if x != nil { + return x.Views + } + return 0 +} + +func (x *TrendingBlog) GetLikes() int64 { + if x != nil { + return x.Likes + } + return 0 +} + +func (x *TrendingBlog) GetScore() float64 { + if x != nil { + return x.Score + } + return 0 +} + +type GetTrendingBlogsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StatusCode int32 `protobuf:"varint,1,opt,name=status_code,json=statusCode,proto3" json:"status_code,omitempty"` + Blogs []*TrendingBlog `protobuf:"bytes,2,rep,name=blogs,proto3" json:"blogs,omitempty"` + Error *Error `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *GetTrendingBlogsResponse) Reset() { + *x = GetTrendingBlogsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[74] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetTrendingBlogsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTrendingBlogsResponse) ProtoMessage() {} + +func (x *GetTrendingBlogsResponse) ProtoReflect() protoreflect.Message { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[74] + 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 GetTrendingBlogsResponse.ProtoReflect.Descriptor instead. +func (*GetTrendingBlogsResponse) Descriptor() ([]byte, []int) { + return file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDescGZIP(), []int{74} +} + +func (x *GetTrendingBlogsResponse) GetStatusCode() int32 { + if x != nil { + return x.StatusCode + } + return 0 +} + +func (x *GetTrendingBlogsResponse) GetBlogs() []*TrendingBlog { + if x != nil { + return x.Blogs + } + return nil +} + +func (x *GetTrendingBlogsResponse) GetError() *Error { + if x != nil { + return x.Error + } + return nil +} + +// Get Active Users +type GetActiveUsersRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AccountId string `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` + TimeRange string `protobuf:"bytes,2,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"` +} + +func (x *GetActiveUsersRequest) Reset() { + *x = GetActiveUsersRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[75] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetActiveUsersRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetActiveUsersRequest) ProtoMessage() {} + +func (x *GetActiveUsersRequest) ProtoReflect() protoreflect.Message { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[75] + 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 GetActiveUsersRequest.ProtoReflect.Descriptor instead. +func (*GetActiveUsersRequest) Descriptor() ([]byte, []int) { + return file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDescGZIP(), []int{75} +} + +func (x *GetActiveUsersRequest) GetAccountId() string { + if x != nil { + return x.AccountId + } + return "" +} + +func (x *GetActiveUsersRequest) GetTimeRange() string { + if x != nil { + return x.TimeRange + } + return "" +} + +type ActiveUser struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + LastActive *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=last_active,json=lastActive,proto3" json:"last_active,omitempty"` +} + +func (x *ActiveUser) Reset() { + *x = ActiveUser{} + if protoimpl.UnsafeEnabled { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[76] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ActiveUser) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ActiveUser) ProtoMessage() {} + +func (x *ActiveUser) ProtoReflect() protoreflect.Message { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[76] + 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 ActiveUser.ProtoReflect.Descriptor instead. +func (*ActiveUser) Descriptor() ([]byte, []int) { + return file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDescGZIP(), []int{76} +} + +func (x *ActiveUser) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *ActiveUser) GetLastActive() *timestamppb.Timestamp { + if x != nil { + return x.LastActive + } + return nil +} + +type GetActiveUsersResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StatusCode int32 `protobuf:"varint,1,opt,name=status_code,json=statusCode,proto3" json:"status_code,omitempty"` + ActiveUsers int64 `protobuf:"varint,2,opt,name=active_users,json=activeUsers,proto3" json:"active_users,omitempty"` + Error *Error `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` + UserList []*ActiveUser `protobuf:"bytes,4,rep,name=user_list,json=userList,proto3" json:"user_list,omitempty"` +} + +func (x *GetActiveUsersResponse) Reset() { + *x = GetActiveUsersResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[77] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetActiveUsersResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetActiveUsersResponse) ProtoMessage() {} + +func (x *GetActiveUsersResponse) ProtoReflect() protoreflect.Message { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[77] + 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 GetActiveUsersResponse.ProtoReflect.Descriptor instead. +func (*GetActiveUsersResponse) Descriptor() ([]byte, []int) { + return file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDescGZIP(), []int{77} +} + +func (x *GetActiveUsersResponse) GetStatusCode() int32 { + if x != nil { + return x.StatusCode + } + return 0 +} + +func (x *GetActiveUsersResponse) GetActiveUsers() int64 { + if x != nil { + return x.ActiveUsers + } + return 0 +} + +func (x *GetActiveUsersResponse) GetError() *Error { + if x != nil { + return x.Error + } + return nil +} + +func (x *GetActiveUsersResponse) GetUserList() []*ActiveUser { + if x != nil { + return x.UserList + } + return nil +} + +// Get Account Activities +type GetAccountActivitiesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AccountId string `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` + Category ActivityCategory `protobuf:"varint,2,opt,name=category,proto3,enum=activity_svc.ActivityCategory" json:"category,omitempty"` + Action string `protobuf:"bytes,3,opt,name=action,proto3" json:"action,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` + Limit int32 `protobuf:"varint,6,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int32 `protobuf:"varint,7,opt,name=offset,proto3" json:"offset,omitempty"` +} + +func (x *GetAccountActivitiesRequest) Reset() { + *x = GetAccountActivitiesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[78] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetAccountActivitiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAccountActivitiesRequest) ProtoMessage() {} + +func (x *GetAccountActivitiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[78] + 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 GetAccountActivitiesRequest.ProtoReflect.Descriptor instead. +func (*GetAccountActivitiesRequest) Descriptor() ([]byte, []int) { + return file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDescGZIP(), []int{78} +} + +func (x *GetAccountActivitiesRequest) GetAccountId() string { + if x != nil { + return x.AccountId + } + return "" +} + +func (x *GetAccountActivitiesRequest) GetCategory() ActivityCategory { + if x != nil { + return x.Category + } + return ActivityCategory_CATEGORY_UNSPECIFIED +} + +func (x *GetAccountActivitiesRequest) GetAction() string { + if x != nil { + return x.Action + } + return "" +} + +func (x *GetAccountActivitiesRequest) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime + } + return nil +} + +func (x *GetAccountActivitiesRequest) GetEndTime() *timestamppb.Timestamp { + if x != nil { + return x.EndTime + } + return nil +} + +func (x *GetAccountActivitiesRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *GetAccountActivitiesRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +type GetAccountActivitiesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StatusCode int32 `protobuf:"varint,1,opt,name=status_code,json=statusCode,proto3" json:"status_code,omitempty"` + Activities []*ActivityEvent `protobuf:"bytes,2,rep,name=activities,proto3" json:"activities,omitempty"` + TotalCount int64 `protobuf:"varint,3,opt,name=total_count,json=totalCount,proto3" json:"total_count,omitempty"` + Error *Error `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *GetAccountActivitiesResponse) Reset() { + *x = GetAccountActivitiesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[79] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetAccountActivitiesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAccountActivitiesResponse) ProtoMessage() {} + +func (x *GetAccountActivitiesResponse) ProtoReflect() protoreflect.Message { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[79] + 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 GetAccountActivitiesResponse.ProtoReflect.Descriptor instead. +func (*GetAccountActivitiesResponse) Descriptor() ([]byte, []int) { + return file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDescGZIP(), []int{79} +} + +func (x *GetAccountActivitiesResponse) GetStatusCode() int32 { + if x != nil { + return x.StatusCode + } + return 0 +} + +func (x *GetAccountActivitiesResponse) GetActivities() []*ActivityEvent { + if x != nil { + return x.Activities + } + return nil +} + +func (x *GetAccountActivitiesResponse) GetTotalCount() int64 { + if x != nil { + return x.TotalCount + } + return 0 +} + +func (x *GetAccountActivitiesResponse) GetError() *Error { + if x != nil { + return x.Error + } + return nil +} + +// Advanced Analytics (The 5-point suite) +type GetAdvancedAnalyticsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AccountId string `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` + TimeRange string `protobuf:"bytes,2,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"` +} + +func (x *GetAdvancedAnalyticsRequest) Reset() { + *x = GetAdvancedAnalyticsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[80] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetAdvancedAnalyticsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAdvancedAnalyticsRequest) ProtoMessage() {} + +func (x *GetAdvancedAnalyticsRequest) ProtoReflect() protoreflect.Message { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[80] + 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 GetAdvancedAnalyticsRequest.ProtoReflect.Descriptor instead. +func (*GetAdvancedAnalyticsRequest) Descriptor() ([]byte, []int) { + return file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDescGZIP(), []int{80} +} + +func (x *GetAdvancedAnalyticsRequest) GetAccountId() string { + if x != nil { + return x.AccountId + } + return "" +} + +func (x *GetAdvancedAnalyticsRequest) GetTimeRange() string { + if x != nil { + return x.TimeRange + } + return "" +} + +type AdvancedAnalytics struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // 1. User Retention + RetentionRate float64 `protobuf:"fixed64,1,opt,name=retention_rate,json=retentionRate,proto3" json:"retention_rate,omitempty"` + NewUsers int64 `protobuf:"varint,2,opt,name=new_users,json=newUsers,proto3" json:"new_users,omitempty"` + ReturningUsers int64 `protobuf:"varint,3,opt,name=returning_users,json=returningUsers,proto3" json:"returning_users,omitempty"` + // 2. Conversion Funnel + ConversionFunnel *structpb.Struct `protobuf:"bytes,4,opt,name=conversion_funnel,json=conversionFunnel,proto3" json:"conversion_funnel,omitempty"` + // 3. Geographic Hotspots + GeographicHotspots map[string]int64 `protobuf:"bytes,5,rep,name=geographic_hotspots,json=geographicHotspots,proto3" json:"geographic_hotspots,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + // 4. Peak Reading Times + PeakReadingTimes map[string]int64 `protobuf:"bytes,6,rep,name=peak_reading_times,json=peakReadingTimes,proto3" json:"peak_reading_times,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + // 5. Platform Bias + PlatformBias map[string]int64 `protobuf:"bytes,7,rep,name=platform_bias,json=platformBias,proto3" json:"platform_bias,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` +} + +func (x *AdvancedAnalytics) Reset() { + *x = AdvancedAnalytics{} + if protoimpl.UnsafeEnabled { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[81] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AdvancedAnalytics) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AdvancedAnalytics) ProtoMessage() {} + +func (x *AdvancedAnalytics) ProtoReflect() protoreflect.Message { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[81] + 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 AdvancedAnalytics.ProtoReflect.Descriptor instead. +func (*AdvancedAnalytics) Descriptor() ([]byte, []int) { + return file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDescGZIP(), []int{81} +} + +func (x *AdvancedAnalytics) GetRetentionRate() float64 { + if x != nil { + return x.RetentionRate + } + return 0 +} + +func (x *AdvancedAnalytics) GetNewUsers() int64 { + if x != nil { + return x.NewUsers + } + return 0 +} + +func (x *AdvancedAnalytics) GetReturningUsers() int64 { + if x != nil { + return x.ReturningUsers + } + return 0 +} + +func (x *AdvancedAnalytics) GetConversionFunnel() *structpb.Struct { + if x != nil { + return x.ConversionFunnel + } + return nil +} + +func (x *AdvancedAnalytics) GetGeographicHotspots() map[string]int64 { + if x != nil { + return x.GeographicHotspots + } + return nil +} + +func (x *AdvancedAnalytics) GetPeakReadingTimes() map[string]int64 { + if x != nil { + return x.PeakReadingTimes + } + return nil +} + +func (x *AdvancedAnalytics) GetPlatformBias() map[string]int64 { + if x != nil { + return x.PlatformBias + } + return nil +} + +type GetAdvancedAnalyticsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StatusCode int32 `protobuf:"varint,1,opt,name=status_code,json=statusCode,proto3" json:"status_code,omitempty"` + Analytics *AdvancedAnalytics `protobuf:"bytes,2,opt,name=analytics,proto3" json:"analytics,omitempty"` + Error *Error `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *GetAdvancedAnalyticsResponse) Reset() { + *x = GetAdvancedAnalyticsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[82] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetAdvancedAnalyticsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAdvancedAnalyticsResponse) ProtoMessage() {} + +func (x *GetAdvancedAnalyticsResponse) ProtoReflect() protoreflect.Message { + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[82] + 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 GetAdvancedAnalyticsResponse.ProtoReflect.Descriptor instead. +func (*GetAdvancedAnalyticsResponse) Descriptor() ([]byte, []int) { + return file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDescGZIP(), []int{82} +} + +func (x *GetAdvancedAnalyticsResponse) GetStatusCode() int32 { + if x != nil { + return x.StatusCode + } + return 0 +} + +func (x *GetAdvancedAnalyticsResponse) GetAnalytics() *AdvancedAnalytics { + if x != nil { + return x.Analytics + } + return nil +} + +func (x *GetAdvancedAnalyticsResponse) GetError() *Error { + if x != nil { + return x.Error + } + return nil +} + // Health Check type HealthCheckRequest struct { state protoimpl.MessageState @@ -8587,7 +9353,7 @@ type HealthCheckRequest struct { func (x *HealthCheckRequest) Reset() { *x = HealthCheckRequest{} if protoimpl.UnsafeEnabled { - mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[72] + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8600,7 +9366,7 @@ func (x *HealthCheckRequest) String() string { func (*HealthCheckRequest) ProtoMessage() {} func (x *HealthCheckRequest) ProtoReflect() protoreflect.Message { - mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[72] + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8613,7 +9379,7 @@ func (x *HealthCheckRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthCheckRequest.ProtoReflect.Descriptor instead. func (*HealthCheckRequest) Descriptor() ([]byte, []int) { - return file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDescGZIP(), []int{72} + return file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDescGZIP(), []int{83} } type HealthCheckResponse struct { @@ -8631,7 +9397,7 @@ type HealthCheckResponse struct { func (x *HealthCheckResponse) Reset() { *x = HealthCheckResponse{} if protoimpl.UnsafeEnabled { - mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[73] + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8644,7 +9410,7 @@ func (x *HealthCheckResponse) String() string { func (*HealthCheckResponse) ProtoMessage() {} func (x *HealthCheckResponse) ProtoReflect() protoreflect.Message { - mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[73] + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8657,7 +9423,7 @@ func (x *HealthCheckResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthCheckResponse.ProtoReflect.Descriptor instead. func (*HealthCheckResponse) Descriptor() ([]byte, []int) { - return file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDescGZIP(), []int{73} + return file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDescGZIP(), []int{84} } func (x *HealthCheckResponse) GetStatusCode() int32 { @@ -8709,7 +9475,7 @@ type Error struct { func (x *Error) Reset() { *x = Error{} if protoimpl.UnsafeEnabled { - mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[74] + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8722,7 +9488,7 @@ func (x *Error) String() string { func (*Error) ProtoMessage() {} func (x *Error) ProtoReflect() protoreflect.Message { - mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[74] + mi := &file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8735,7 +9501,7 @@ func (x *Error) ProtoReflect() protoreflect.Message { // Deprecated: Use Error.ProtoReflect.Descriptor instead. func (*Error) Descriptor() ([]byte, []int) { - return file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDescGZIP(), []int{74} + return file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDescGZIP(), []int{85} } func (x *Error) GetStatus() int32 { @@ -10461,317 +11227,482 @@ var file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDesc = []byte 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x14, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc5, - 0x01, 0x0a, 0x13, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x4f, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0x9c, 0x03, 0x0a, 0x10, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x69, 0x74, 0x79, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x14, - 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, - 0x52, 0x59, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4e, 0x54, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, - 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, - 0x14, 0x0a, 0x10, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x43, 0x4f, 0x4e, 0x54, - 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, - 0x59, 0x5f, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x4c, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, - 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x10, 0x05, 0x12, - 0x17, 0x0a, 0x13, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x4e, 0x41, 0x56, 0x49, - 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x54, 0x45, - 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, - 0x59, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x59, 0x54, 0x49, 0x43, 0x53, 0x10, 0x08, 0x12, 0x15, 0x0a, - 0x11, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, - 0x54, 0x59, 0x10, 0x09, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, - 0x5f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x10, 0x0a, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x41, 0x54, - 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x10, 0x0b, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, - 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x49, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x0c, 0x12, 0x16, 0x0a, - 0x12, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x46, 0x49, 0x4e, 0x41, 0x4e, 0x43, - 0x49, 0x41, 0x4c, 0x10, 0x0d, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, - 0x59, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0e, 0x12, - 0x15, 0x0a, 0x11, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x49, 0x4e, 0x43, 0x49, - 0x44, 0x45, 0x4e, 0x54, 0x10, 0x0f, 0x2a, 0x75, 0x0a, 0x08, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, - 0x74, 0x79, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, - 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x13, - 0x0a, 0x0f, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x55, - 0x4d, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, - 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, - 0x54, 0x59, 0x5f, 0x43, 0x52, 0x49, 0x54, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x04, 0x2a, 0xdd, 0x01, - 0x0a, 0x0c, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x79, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x1d, - 0x0a, 0x19, 0x4a, 0x4f, 0x55, 0x52, 0x4e, 0x45, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, - 0x18, 0x4a, 0x4f, 0x55, 0x52, 0x4e, 0x45, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x4f, - 0x4e, 0x42, 0x4f, 0x41, 0x52, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x4a, - 0x4f, 0x55, 0x52, 0x4e, 0x45, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x41, 0x43, 0x54, - 0x49, 0x56, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, 0x4a, 0x4f, 0x55, - 0x52, 0x4e, 0x45, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x45, 0x4e, 0x47, 0x41, 0x47, - 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x4a, 0x4f, 0x55, 0x52, 0x4e, - 0x45, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x52, 0x45, 0x54, 0x45, 0x4e, 0x54, 0x49, - 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4a, 0x4f, 0x55, 0x52, 0x4e, 0x45, 0x59, 0x5f, - 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x43, 0x48, 0x55, 0x52, 0x4e, 0x10, 0x05, 0x12, 0x1e, 0x0a, - 0x1a, 0x4a, 0x4f, 0x55, 0x52, 0x4e, 0x45, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x52, - 0x45, 0x41, 0x43, 0x54, 0x49, 0x56, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06, 0x2a, 0x88, 0x01, - 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x4c, - 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, - 0x5f, 0x57, 0x45, 0x42, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, - 0x52, 0x4d, 0x5f, 0x4d, 0x4f, 0x42, 0x49, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x50, - 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x54, 0x10, 0x03, - 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x41, 0x50, 0x49, - 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x44, - 0x45, 0x53, 0x4b, 0x54, 0x4f, 0x50, 0x10, 0x05, 0x2a, 0xa0, 0x01, 0x0a, 0x0a, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x45, 0x56, 0x49, 0x43, - 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x4b, 0x54, 0x4f, 0x50, 0x10, 0x01, 0x12, 0x16, 0x0a, - 0x12, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x4f, 0x42, - 0x49, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x54, 0x10, 0x03, 0x12, 0x13, 0x0a, - 0x0f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x54, - 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x05, 0x2a, 0xdb, 0x01, 0x0a, 0x13, - 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x20, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x4e, 0x4f, 0x54, - 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, - 0x4c, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x4e, 0x4f, 0x54, - 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, - 0x4c, 0x5f, 0x50, 0x55, 0x53, 0x48, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x4e, 0x4f, 0x54, 0x49, + 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6d, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x54, + 0x72, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x69, 0x0a, 0x0c, 0x54, 0x72, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x67, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x6c, 0x6f, 0x67, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x6c, 0x6f, 0x67, 0x49, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x05, 0x76, 0x69, 0x65, 0x77, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6b, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6b, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, + 0x72, 0x65, 0x22, 0x98, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x30, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, + 0x72, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x67, 0x52, 0x05, 0x62, 0x6c, 0x6f, + 0x67, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, + 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x22, 0x62, 0x0a, 0x0a, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x0b, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 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, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, + 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0xbe, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x43, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x75, + 0x73, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0xb0, 0x02, 0x0a, 0x1b, 0x47, 0x65, + 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, + 0x74, 0x79, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0xc8, 0x01, 0x0a, + 0x1c, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x3b, + 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, + 0x63, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, + 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x5b, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x64, + 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x22, 0xba, 0x05, 0x0a, 0x11, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, + 0x64, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x0d, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x27, + 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x73, 0x65, 0x72, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x10, 0x63, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x68, 0x0a, + 0x13, 0x67, 0x65, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x5f, 0x68, 0x6f, 0x74, 0x73, + 0x70, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, + 0x65, 0x64, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x2e, 0x47, 0x65, 0x6f, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x48, 0x6f, 0x74, 0x73, 0x70, 0x6f, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x12, 0x67, 0x65, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x48, + 0x6f, 0x74, 0x73, 0x70, 0x6f, 0x74, 0x73, 0x12, 0x63, 0x0a, 0x12, 0x70, 0x65, 0x61, 0x6b, 0x5f, + 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, + 0x76, 0x63, 0x2e, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x6e, 0x61, 0x6c, 0x79, + 0x74, 0x69, 0x63, 0x73, 0x2e, 0x50, 0x65, 0x61, 0x6b, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x70, 0x65, 0x61, 0x6b, + 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x0d, + 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x62, 0x69, 0x61, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, + 0x76, 0x63, 0x2e, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x6e, 0x61, 0x6c, 0x79, + 0x74, 0x69, 0x63, 0x73, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x42, 0x69, 0x61, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, + 0x42, 0x69, 0x61, 0x73, 0x1a, 0x45, 0x0a, 0x17, 0x47, 0x65, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x69, 0x63, 0x48, 0x6f, 0x74, 0x73, 0x70, 0x6f, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, 0x50, + 0x65, 0x61, 0x6b, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x3f, 0x0a, 0x11, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x42, 0x69, 0x61, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xa9, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, + 0x64, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, + 0x6f, 0x64, 0x65, 0x12, 0x3d, 0x0a, 0x09, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x6e, + 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x09, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, + 0x63, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, + 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x14, 0x0a, + 0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0xc5, 0x01, 0x0a, 0x13, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x4f, 0x0a, 0x05, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0x9c, 0x03, 0x0a, + 0x10, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x43, + 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4e, 0x54, 0x49, + 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x41, 0x54, 0x45, + 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, + 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, + 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x4c, 0x10, 0x04, 0x12, + 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x53, 0x45, 0x41, 0x52, + 0x43, 0x48, 0x10, 0x05, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, + 0x5f, 0x4e, 0x41, 0x56, 0x49, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06, 0x12, 0x1b, 0x0a, + 0x17, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, + 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x41, + 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x59, 0x54, 0x49, 0x43, 0x53, + 0x10, 0x08, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x53, + 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x10, 0x09, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x54, + 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x10, 0x0a, 0x12, 0x19, + 0x0a, 0x15, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, + 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0b, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x54, + 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x49, 0x41, 0x4e, 0x43, 0x45, + 0x10, 0x0c, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x46, + 0x49, 0x4e, 0x41, 0x4e, 0x43, 0x49, 0x41, 0x4c, 0x10, 0x0d, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, + 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x10, 0x0e, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, + 0x5f, 0x49, 0x4e, 0x43, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x10, 0x0f, 0x2a, 0x75, 0x0a, 0x08, 0x53, + 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x56, 0x45, 0x52, + 0x49, 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x4c, 0x4f, + 0x57, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, + 0x4d, 0x45, 0x44, 0x49, 0x55, 0x4d, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x45, 0x56, 0x45, + 0x52, 0x49, 0x54, 0x59, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x53, + 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x52, 0x49, 0x54, 0x49, 0x43, 0x41, 0x4c, + 0x10, 0x04, 0x2a, 0xdd, 0x01, 0x0a, 0x0c, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x79, 0x53, 0x74, + 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x4a, 0x4f, 0x55, 0x52, 0x4e, 0x45, 0x59, 0x5f, 0x53, + 0x54, 0x41, 0x47, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x4a, 0x4f, 0x55, 0x52, 0x4e, 0x45, 0x59, 0x5f, 0x53, 0x54, + 0x41, 0x47, 0x45, 0x5f, 0x4f, 0x4e, 0x42, 0x4f, 0x41, 0x52, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, + 0x12, 0x1c, 0x0a, 0x18, 0x4a, 0x4f, 0x55, 0x52, 0x4e, 0x45, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x47, + 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x1c, + 0x0a, 0x18, 0x4a, 0x4f, 0x55, 0x52, 0x4e, 0x45, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, + 0x45, 0x4e, 0x47, 0x41, 0x47, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, + 0x4a, 0x4f, 0x55, 0x52, 0x4e, 0x45, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x52, 0x45, + 0x54, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4a, 0x4f, 0x55, + 0x52, 0x4e, 0x45, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x43, 0x48, 0x55, 0x52, 0x4e, + 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x4a, 0x4f, 0x55, 0x52, 0x4e, 0x45, 0x59, 0x5f, 0x53, 0x54, + 0x41, 0x47, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x43, 0x54, 0x49, 0x56, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x10, 0x06, 0x2a, 0x88, 0x01, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, + 0x18, 0x0a, 0x14, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x4c, 0x41, + 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x57, 0x45, 0x42, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, + 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x4d, 0x4f, 0x42, 0x49, 0x4c, 0x45, 0x10, 0x02, + 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x54, 0x41, 0x42, + 0x4c, 0x45, 0x54, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, + 0x4d, 0x5f, 0x41, 0x50, 0x49, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x4c, 0x41, 0x54, 0x46, + 0x4f, 0x52, 0x4d, 0x5f, 0x44, 0x45, 0x53, 0x4b, 0x54, 0x4f, 0x50, 0x10, 0x05, 0x2a, 0xa0, 0x01, + 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, + 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x45, 0x56, + 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x4b, 0x54, 0x4f, 0x50, + 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x4d, 0x4f, 0x42, 0x49, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, + 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x54, + 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x42, 0x4f, 0x54, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x45, 0x56, 0x49, 0x43, + 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x05, + 0x2a, 0xdb, 0x01, 0x0a, 0x13, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x20, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, - 0x5f, 0x49, 0x4e, 0x5f, 0x41, 0x50, 0x50, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x4f, 0x54, - 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, - 0x4c, 0x5f, 0x53, 0x4d, 0x53, 0x10, 0x04, 0x12, 0x20, 0x0a, 0x1c, 0x4e, 0x4f, 0x54, 0x49, 0x46, - 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, - 0x57, 0x45, 0x42, 0x48, 0x4f, 0x4f, 0x4b, 0x10, 0x05, 0x2a, 0xd6, 0x01, 0x0a, 0x10, 0x4e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, - 0x0a, 0x1d, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x1f, 0x0a, 0x1b, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x49, 0x4e, 0x47, - 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x4f, 0x54, 0x49, 0x46, - 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x59, 0x53, - 0x54, 0x45, 0x4d, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4c, 0x45, 0x52, 0x54, - 0x10, 0x04, 0x12, 0x1e, 0x0a, 0x1a, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, - 0x10, 0x05, 0x32, 0xa4, 0x18, 0x0a, 0x0f, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x12, 0x22, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, - 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x64, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, - 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, - 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x69, 0x74, 0x79, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x12, 0x29, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, + 0x0a, 0x1a, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, + 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x01, 0x12, 0x1d, + 0x0a, 0x19, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, + 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x50, 0x55, 0x53, 0x48, 0x10, 0x02, 0x12, 0x1f, 0x0a, + 0x1b, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48, + 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x49, 0x4e, 0x5f, 0x41, 0x50, 0x50, 0x10, 0x03, 0x12, 0x1c, + 0x0a, 0x18, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, + 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x53, 0x4d, 0x53, 0x10, 0x04, 0x12, 0x20, 0x0a, 0x1c, + 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, + 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x57, 0x45, 0x42, 0x48, 0x4f, 0x4f, 0x4b, 0x10, 0x05, 0x2a, 0xd6, + 0x01, 0x0a, 0x10, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1f, 0x0a, 0x1b, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, + 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, + 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x4e, 0x4f, 0x54, 0x49, 0x46, + 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, + 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, + 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x4e, 0x4f, + 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x41, 0x4c, 0x45, 0x52, 0x54, 0x10, 0x04, 0x12, 0x1e, 0x0a, 0x1a, 0x4e, 0x4f, 0x54, 0x49, 0x46, + 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x43, + 0x55, 0x52, 0x49, 0x54, 0x59, 0x10, 0x05, 0x32, 0xc2, 0x1b, 0x0a, 0x0f, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x54, + 0x72, 0x61, 0x63, 0x6b, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x12, 0x22, 0x2e, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, + 0x6b, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x23, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, + 0x54, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, + 0x63, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, + 0x69, 0x63, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, + 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x41, 0x6e, + 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, - 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x69, 0x74, 0x79, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x65, - 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x27, 0x2e, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, - 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, - 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, - 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, - 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, - 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, - 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x42, - 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, - 0x12, 0x2d, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, - 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x41, - 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2e, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, - 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x41, 0x6e, - 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x67, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, - 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x27, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, - 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x42, - 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, - 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x1e, 0x54, 0x72, 0x61, - 0x63, 0x6b, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x2e, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x34, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, + 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x12, 0x54, 0x72, + 0x61, 0x63, 0x6b, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x27, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, + 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x27, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, + 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x18, 0x47, 0x65, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x41, 0x6e, 0x61, 0x6c, + 0x79, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x42, 0x65, 0x68, 0x61, + 0x76, 0x69, 0x6f, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, + 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x42, 0x65, 0x68, 0x61, 0x76, + 0x69, 0x6f, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, 0x69, + 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x27, 0x2e, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x61, + 0x64, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, + 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, + 0x61, 0x76, 0x69, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, + 0x0a, 0x1e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x33, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7f, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7f, 0x0a, 0x1a, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2f, 0x2e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, + 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, - 0x74, 0x69, 0x63, 0x73, 0x12, 0x2f, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, - 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, - 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x12, 0x28, + 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x13, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, + 0x69, 0x63, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, + 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x41, 0x6e, 0x61, + 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x17, 0x54, 0x72, 0x61, 0x63, + 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, + 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, + 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x61, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x6f, 0x75, + 0x72, 0x6e, 0x65, 0x79, 0x12, 0x25, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, + 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x6f, 0x75, + 0x72, 0x6e, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, + 0x55, 0x73, 0x65, 0x72, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x6f, + 0x75, 0x72, 0x6e, 0x65, 0x79, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2c, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x17, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, - 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, - 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, + 0x74, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x79, 0x41, 0x6e, 0x61, 0x6c, + 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x55, + 0x73, 0x65, 0x72, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x79, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, + 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x16, 0x54, + 0x72, 0x61, 0x63, 0x6b, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, + 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x79, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x2e, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x4e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, + 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, + 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x13, 0x54, + 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, 0x61, 0x6c, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x28, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, + 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, 0x61, 0x6c, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, - 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x10, 0x54, - 0x72, 0x61, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x79, 0x12, - 0x25, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, - 0x72, 0x61, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, - 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x4a, - 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, - 0x0a, 0x17, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x79, - 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2c, 0x2e, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x79, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, - 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4a, 0x6f, - 0x75, 0x72, 0x6e, 0x65, 0x79, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x4e, - 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x2b, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, - 0x54, 0x72, 0x61, 0x63, 0x6b, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, - 0x63, 0x6b, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x18, 0x47, - 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, - 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, - 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, - 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x46, - 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, 0x61, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x2e, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, - 0x63, 0x6b, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, 0x61, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, - 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6e, 0x61, - 0x6e, 0x63, 0x69, 0x61, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x67, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, - 0x61, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6e, - 0x63, 0x69, 0x61, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, - 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, 0x61, 0x6c, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x15, 0x54, - 0x72, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, - 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2b, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, - 0x54, 0x72, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, - 0x14, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x6b, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, 0x61, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x46, 0x69, + 0x6e, 0x61, 0x6e, 0x63, 0x69, 0x61, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, 0x61, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, + 0x61, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x70, 0x0a, 0x15, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x2e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2a, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, - 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x12, + 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x67, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x63, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x27, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, + 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x63, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x28, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x63, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x27, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, - 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x63, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, - 0x49, 0x6e, 0x63, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x69, - 0x64, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, - 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x14, 0x54, - 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x29, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x11, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x63, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x26, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x63, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, + 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x6d, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, + 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, - 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, - 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, - 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, - 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x28, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, - 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x12, 0x28, 0x2e, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, - 0x63, 0x6b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, - 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x67, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, - 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x12, 0x27, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, - 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, - 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x15, 0x54, - 0x72, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, - 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2b, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, - 0x54, 0x72, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, - 0x17, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x41, - 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2c, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, - 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x12, 0x20, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, - 0x73, 0x76, 0x63, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, - 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x28, 0x5a, 0x26, 0x2e, 0x2f, 0x61, - 0x70, 0x69, 0x73, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x2f, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, - 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, + 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x29, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x13, 0x54, + 0x72, 0x61, 0x63, 0x6b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, + 0x74, 0x79, 0x12, 0x28, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, + 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, + 0x6b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x12, 0x27, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, + 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x70, 0x0a, 0x15, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x2e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x50, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x76, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2c, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, + 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6e, 0x61, 0x6c, 0x79, + 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, + 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x10, 0x47, 0x65, + 0x74, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x25, + 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x67, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x42, 0x6c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, + 0x23, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, + 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, + 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, + 0x63, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, + 0x73, 0x12, 0x29, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x6e, 0x61, 0x6c, + 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x41, + 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x20, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, + 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x28, 0x5a, 0x26, + 0x2e, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x63, 0x6f, + 0x6e, 0x6e, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x74, 0x79, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10787,7 +11718,7 @@ func file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDescGZIP() [ } var file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_enumTypes = make([]protoimpl.EnumInfo, 7) -var file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes = make([]protoimpl.MessageInfo, 75) +var file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes = make([]protoimpl.MessageInfo, 89) var file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_goTypes = []interface{}{ (ActivityCategory)(0), // 0: activity_svc.ActivityCategory (Severity)(0), // 1: activity_svc.Severity @@ -10868,244 +11799,282 @@ var file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_goTypes = []inte (*TrackPerformanceEventResponse)(nil), // 76: activity_svc.TrackPerformanceEventResponse (*GetPerformanceAnalyticsRequest)(nil), // 77: activity_svc.GetPerformanceAnalyticsRequest (*GetPerformanceAnalyticsResponse)(nil), // 78: activity_svc.GetPerformanceAnalyticsResponse - (*HealthCheckRequest)(nil), // 79: activity_svc.HealthCheckRequest - (*HealthCheckResponse)(nil), // 80: activity_svc.HealthCheckResponse - (*Error)(nil), // 81: activity_svc.Error - (*structpb.Struct)(nil), // 82: google.protobuf.Struct - (*timestamppb.Timestamp)(nil), // 83: google.protobuf.Timestamp + (*GetTrendingBlogsRequest)(nil), // 79: activity_svc.GetTrendingBlogsRequest + (*TrendingBlog)(nil), // 80: activity_svc.TrendingBlog + (*GetTrendingBlogsResponse)(nil), // 81: activity_svc.GetTrendingBlogsResponse + (*GetActiveUsersRequest)(nil), // 82: activity_svc.GetActiveUsersRequest + (*ActiveUser)(nil), // 83: activity_svc.ActiveUser + (*GetActiveUsersResponse)(nil), // 84: activity_svc.GetActiveUsersResponse + (*GetAccountActivitiesRequest)(nil), // 85: activity_svc.GetAccountActivitiesRequest + (*GetAccountActivitiesResponse)(nil), // 86: activity_svc.GetAccountActivitiesResponse + (*GetAdvancedAnalyticsRequest)(nil), // 87: activity_svc.GetAdvancedAnalyticsRequest + (*AdvancedAnalytics)(nil), // 88: activity_svc.AdvancedAnalytics + (*GetAdvancedAnalyticsResponse)(nil), // 89: activity_svc.GetAdvancedAnalyticsResponse + (*HealthCheckRequest)(nil), // 90: activity_svc.HealthCheckRequest + (*HealthCheckResponse)(nil), // 91: activity_svc.HealthCheckResponse + (*Error)(nil), // 92: activity_svc.Error + nil, // 93: activity_svc.AdvancedAnalytics.GeographicHotspotsEntry + nil, // 94: activity_svc.AdvancedAnalytics.PeakReadingTimesEntry + nil, // 95: activity_svc.AdvancedAnalytics.PlatformBiasEntry + (*structpb.Struct)(nil), // 96: google.protobuf.Struct + (*timestamppb.Timestamp)(nil), // 97: google.protobuf.Timestamp } var file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_depIdxs = []int32{ 0, // 0: activity_svc.ActivityEvent.category:type_name -> activity_svc.ActivityCategory 24, // 1: activity_svc.ActivityEvent.client_info:type_name -> activity_svc.ClientInfo - 82, // 2: activity_svc.ActivityEvent.metadata:type_name -> google.protobuf.Struct - 83, // 3: activity_svc.ActivityEvent.timestamp:type_name -> google.protobuf.Timestamp - 83, // 4: activity_svc.ActivityEvent.created_at:type_name -> google.protobuf.Timestamp + 96, // 2: activity_svc.ActivityEvent.metadata:type_name -> google.protobuf.Struct + 97, // 3: activity_svc.ActivityEvent.timestamp:type_name -> google.protobuf.Timestamp + 97, // 4: activity_svc.ActivityEvent.created_at:type_name -> google.protobuf.Timestamp 1, // 5: activity_svc.SecurityEvent.severity:type_name -> activity_svc.Severity 9, // 6: activity_svc.SecurityEvent.context:type_name -> activity_svc.SecurityContext - 83, // 7: activity_svc.SecurityEvent.resolved_at:type_name -> google.protobuf.Timestamp - 83, // 8: activity_svc.SecurityEvent.created_at:type_name -> google.protobuf.Timestamp - 83, // 9: activity_svc.SecurityEvent.updated_at:type_name -> google.protobuf.Timestamp - 83, // 10: activity_svc.SecurityContext.last_success:type_name -> google.protobuf.Timestamp - 82, // 11: activity_svc.SecurityContext.patterns:type_name -> google.protobuf.Struct - 82, // 12: activity_svc.UserBehaviorAnalytics.category_breakdown:type_name -> google.protobuf.Struct - 82, // 13: activity_svc.UserBehaviorAnalytics.action_frequency:type_name -> google.protobuf.Struct + 97, // 7: activity_svc.SecurityEvent.resolved_at:type_name -> google.protobuf.Timestamp + 97, // 8: activity_svc.SecurityEvent.created_at:type_name -> google.protobuf.Timestamp + 97, // 9: activity_svc.SecurityEvent.updated_at:type_name -> google.protobuf.Timestamp + 97, // 10: activity_svc.SecurityContext.last_success:type_name -> google.protobuf.Timestamp + 96, // 11: activity_svc.SecurityContext.patterns:type_name -> google.protobuf.Struct + 96, // 12: activity_svc.UserBehaviorAnalytics.category_breakdown:type_name -> google.protobuf.Struct + 96, // 13: activity_svc.UserBehaviorAnalytics.action_frequency:type_name -> google.protobuf.Struct 11, // 14: activity_svc.UserBehaviorAnalytics.hourly_pattern:type_name -> activity_svc.HourlyActivity - 82, // 15: activity_svc.UserBehaviorAnalytics.device_usage:type_name -> google.protobuf.Struct + 96, // 15: activity_svc.UserBehaviorAnalytics.device_usage:type_name -> google.protobuf.Struct 12, // 16: activity_svc.UserBehaviorAnalytics.location_pattern:type_name -> activity_svc.LocationActivity - 83, // 17: activity_svc.UserBehaviorAnalytics.last_activity:type_name -> google.protobuf.Timestamp - 83, // 18: activity_svc.UserBehaviorAnalytics.created_at:type_name -> google.protobuf.Timestamp - 83, // 19: activity_svc.UserBehaviorAnalytics.updated_at:type_name -> google.protobuf.Timestamp + 97, // 17: activity_svc.UserBehaviorAnalytics.last_activity:type_name -> google.protobuf.Timestamp + 97, // 18: activity_svc.UserBehaviorAnalytics.created_at:type_name -> google.protobuf.Timestamp + 97, // 19: activity_svc.UserBehaviorAnalytics.updated_at:type_name -> google.protobuf.Timestamp 4, // 20: activity_svc.ReadingBehaviorAnalytics.device_type:type_name -> activity_svc.DeviceType - 83, // 21: activity_svc.ReadingBehaviorAnalytics.timestamp:type_name -> google.protobuf.Timestamp - 83, // 22: activity_svc.ReadingBehaviorAnalytics.created_at:type_name -> google.protobuf.Timestamp - 82, // 23: activity_svc.RecommendationInteraction.context:type_name -> google.protobuf.Struct - 83, // 24: activity_svc.RecommendationInteraction.timestamp:type_name -> google.protobuf.Timestamp - 83, // 25: activity_svc.RecommendationInteraction.created_at:type_name -> google.protobuf.Timestamp - 82, // 26: activity_svc.ContentInteraction.context:type_name -> google.protobuf.Struct - 83, // 27: activity_svc.ContentInteraction.timestamp:type_name -> google.protobuf.Timestamp - 83, // 28: activity_svc.ContentInteraction.created_at:type_name -> google.protobuf.Timestamp - 82, // 29: activity_svc.SearchActivity.filters:type_name -> google.protobuf.Struct - 82, // 30: activity_svc.SearchActivity.context:type_name -> google.protobuf.Struct - 83, // 31: activity_svc.SearchActivity.timestamp:type_name -> google.protobuf.Timestamp - 83, // 32: activity_svc.SearchActivity.created_at:type_name -> google.protobuf.Timestamp + 97, // 21: activity_svc.ReadingBehaviorAnalytics.timestamp:type_name -> google.protobuf.Timestamp + 97, // 22: activity_svc.ReadingBehaviorAnalytics.created_at:type_name -> google.protobuf.Timestamp + 96, // 23: activity_svc.RecommendationInteraction.context:type_name -> google.protobuf.Struct + 97, // 24: activity_svc.RecommendationInteraction.timestamp:type_name -> google.protobuf.Timestamp + 97, // 25: activity_svc.RecommendationInteraction.created_at:type_name -> google.protobuf.Timestamp + 96, // 26: activity_svc.ContentInteraction.context:type_name -> google.protobuf.Struct + 97, // 27: activity_svc.ContentInteraction.timestamp:type_name -> google.protobuf.Timestamp + 97, // 28: activity_svc.ContentInteraction.created_at:type_name -> google.protobuf.Timestamp + 96, // 29: activity_svc.SearchActivity.filters:type_name -> google.protobuf.Struct + 96, // 30: activity_svc.SearchActivity.context:type_name -> google.protobuf.Struct + 97, // 31: activity_svc.SearchActivity.timestamp:type_name -> google.protobuf.Timestamp + 97, // 32: activity_svc.SearchActivity.created_at:type_name -> google.protobuf.Timestamp 6, // 33: activity_svc.NotificationEvent.type:type_name -> activity_svc.NotificationType 5, // 34: activity_svc.NotificationEvent.channel:type_name -> activity_svc.NotificationChannel - 83, // 35: activity_svc.NotificationEvent.open_time:type_name -> google.protobuf.Timestamp - 83, // 36: activity_svc.NotificationEvent.click_time:type_name -> google.protobuf.Timestamp - 82, // 37: activity_svc.NotificationEvent.device_info:type_name -> google.protobuf.Struct - 82, // 38: activity_svc.NotificationEvent.location_info:type_name -> google.protobuf.Struct - 83, // 39: activity_svc.NotificationEvent.unsubscribe_time:type_name -> google.protobuf.Timestamp - 82, // 40: activity_svc.NotificationEvent.context:type_name -> google.protobuf.Struct - 83, // 41: activity_svc.NotificationEvent.timestamp:type_name -> google.protobuf.Timestamp - 83, // 42: activity_svc.NotificationEvent.created_at:type_name -> google.protobuf.Timestamp - 83, // 43: activity_svc.NotificationEvent.updated_at:type_name -> google.protobuf.Timestamp - 82, // 44: activity_svc.FinancialEvent.context:type_name -> google.protobuf.Struct - 83, // 45: activity_svc.FinancialEvent.processed_at:type_name -> google.protobuf.Timestamp - 83, // 46: activity_svc.FinancialEvent.timestamp:type_name -> google.protobuf.Timestamp - 83, // 47: activity_svc.FinancialEvent.created_at:type_name -> google.protobuf.Timestamp - 83, // 48: activity_svc.FinancialEvent.updated_at:type_name -> google.protobuf.Timestamp + 97, // 35: activity_svc.NotificationEvent.open_time:type_name -> google.protobuf.Timestamp + 97, // 36: activity_svc.NotificationEvent.click_time:type_name -> google.protobuf.Timestamp + 96, // 37: activity_svc.NotificationEvent.device_info:type_name -> google.protobuf.Struct + 96, // 38: activity_svc.NotificationEvent.location_info:type_name -> google.protobuf.Struct + 97, // 39: activity_svc.NotificationEvent.unsubscribe_time:type_name -> google.protobuf.Timestamp + 96, // 40: activity_svc.NotificationEvent.context:type_name -> google.protobuf.Struct + 97, // 41: activity_svc.NotificationEvent.timestamp:type_name -> google.protobuf.Timestamp + 97, // 42: activity_svc.NotificationEvent.created_at:type_name -> google.protobuf.Timestamp + 97, // 43: activity_svc.NotificationEvent.updated_at:type_name -> google.protobuf.Timestamp + 96, // 44: activity_svc.FinancialEvent.context:type_name -> google.protobuf.Struct + 97, // 45: activity_svc.FinancialEvent.processed_at:type_name -> google.protobuf.Timestamp + 97, // 46: activity_svc.FinancialEvent.timestamp:type_name -> google.protobuf.Timestamp + 97, // 47: activity_svc.FinancialEvent.created_at:type_name -> google.protobuf.Timestamp + 97, // 48: activity_svc.FinancialEvent.updated_at:type_name -> google.protobuf.Timestamp 2, // 49: activity_svc.UserJourneyEvent.journey_stage:type_name -> activity_svc.JourneyStage - 82, // 50: activity_svc.UserJourneyEvent.context:type_name -> google.protobuf.Struct - 83, // 51: activity_svc.UserJourneyEvent.timestamp:type_name -> google.protobuf.Timestamp - 83, // 52: activity_svc.UserJourneyEvent.created_at:type_name -> google.protobuf.Timestamp - 82, // 53: activity_svc.IntegrationEvent.context:type_name -> google.protobuf.Struct - 83, // 54: activity_svc.IntegrationEvent.timestamp:type_name -> google.protobuf.Timestamp - 83, // 55: activity_svc.IntegrationEvent.created_at:type_name -> google.protobuf.Timestamp + 96, // 50: activity_svc.UserJourneyEvent.context:type_name -> google.protobuf.Struct + 97, // 51: activity_svc.UserJourneyEvent.timestamp:type_name -> google.protobuf.Timestamp + 97, // 52: activity_svc.UserJourneyEvent.created_at:type_name -> google.protobuf.Timestamp + 96, // 53: activity_svc.IntegrationEvent.context:type_name -> google.protobuf.Struct + 97, // 54: activity_svc.IntegrationEvent.timestamp:type_name -> google.protobuf.Timestamp + 97, // 55: activity_svc.IntegrationEvent.created_at:type_name -> google.protobuf.Timestamp 1, // 56: activity_svc.IncidentEvent.severity:type_name -> activity_svc.Severity - 82, // 57: activity_svc.IncidentEvent.forensic_data:type_name -> google.protobuf.Struct - 82, // 58: activity_svc.IncidentEvent.context:type_name -> google.protobuf.Struct - 83, // 59: activity_svc.IncidentEvent.detected_at:type_name -> google.protobuf.Timestamp - 83, // 60: activity_svc.IncidentEvent.resolved_at:type_name -> google.protobuf.Timestamp - 83, // 61: activity_svc.IncidentEvent.created_at:type_name -> google.protobuf.Timestamp - 83, // 62: activity_svc.IncidentEvent.updated_at:type_name -> google.protobuf.Timestamp - 82, // 63: activity_svc.ComplianceEvent.request_data:type_name -> google.protobuf.Struct - 82, // 64: activity_svc.ComplianceEvent.response_data:type_name -> google.protobuf.Struct - 83, // 65: activity_svc.ComplianceEvent.completed_at:type_name -> google.protobuf.Timestamp - 83, // 66: activity_svc.ComplianceEvent.created_at:type_name -> google.protobuf.Timestamp - 83, // 67: activity_svc.ComplianceEvent.updated_at:type_name -> google.protobuf.Timestamp - 82, // 68: activity_svc.PerformanceEvent.context:type_name -> google.protobuf.Struct - 83, // 69: activity_svc.PerformanceEvent.timestamp:type_name -> google.protobuf.Timestamp - 83, // 70: activity_svc.PerformanceEvent.created_at:type_name -> google.protobuf.Timestamp + 96, // 57: activity_svc.IncidentEvent.forensic_data:type_name -> google.protobuf.Struct + 96, // 58: activity_svc.IncidentEvent.context:type_name -> google.protobuf.Struct + 97, // 59: activity_svc.IncidentEvent.detected_at:type_name -> google.protobuf.Timestamp + 97, // 60: activity_svc.IncidentEvent.resolved_at:type_name -> google.protobuf.Timestamp + 97, // 61: activity_svc.IncidentEvent.created_at:type_name -> google.protobuf.Timestamp + 97, // 62: activity_svc.IncidentEvent.updated_at:type_name -> google.protobuf.Timestamp + 96, // 63: activity_svc.ComplianceEvent.request_data:type_name -> google.protobuf.Struct + 96, // 64: activity_svc.ComplianceEvent.response_data:type_name -> google.protobuf.Struct + 97, // 65: activity_svc.ComplianceEvent.completed_at:type_name -> google.protobuf.Timestamp + 97, // 66: activity_svc.ComplianceEvent.created_at:type_name -> google.protobuf.Timestamp + 97, // 67: activity_svc.ComplianceEvent.updated_at:type_name -> google.protobuf.Timestamp + 96, // 68: activity_svc.PerformanceEvent.context:type_name -> google.protobuf.Struct + 97, // 69: activity_svc.PerformanceEvent.timestamp:type_name -> google.protobuf.Timestamp + 97, // 70: activity_svc.PerformanceEvent.created_at:type_name -> google.protobuf.Timestamp 3, // 71: activity_svc.ClientInfo.platform:type_name -> activity_svc.Platform 4, // 72: activity_svc.ClientInfo.device_type:type_name -> activity_svc.DeviceType 0, // 73: activity_svc.TrackActivityRequest.category:type_name -> activity_svc.ActivityCategory 24, // 74: activity_svc.TrackActivityRequest.client_info:type_name -> activity_svc.ClientInfo - 82, // 75: activity_svc.TrackActivityRequest.metadata:type_name -> google.protobuf.Struct - 81, // 76: activity_svc.TrackActivityResponse.error:type_name -> activity_svc.Error + 96, // 75: activity_svc.TrackActivityRequest.metadata:type_name -> google.protobuf.Struct + 92, // 76: activity_svc.TrackActivityResponse.error:type_name -> activity_svc.Error 0, // 77: activity_svc.GetUserActivitiesRequest.category:type_name -> activity_svc.ActivityCategory - 83, // 78: activity_svc.GetUserActivitiesRequest.start_time:type_name -> google.protobuf.Timestamp - 83, // 79: activity_svc.GetUserActivitiesRequest.end_time:type_name -> google.protobuf.Timestamp + 97, // 78: activity_svc.GetUserActivitiesRequest.start_time:type_name -> google.protobuf.Timestamp + 97, // 79: activity_svc.GetUserActivitiesRequest.end_time:type_name -> google.protobuf.Timestamp 7, // 80: activity_svc.GetUserActivitiesResponse.activities:type_name -> activity_svc.ActivityEvent - 81, // 81: activity_svc.GetUserActivitiesResponse.error:type_name -> activity_svc.Error + 92, // 81: activity_svc.GetUserActivitiesResponse.error:type_name -> activity_svc.Error 0, // 82: activity_svc.GetActivityAnalyticsRequest.categories:type_name -> activity_svc.ActivityCategory 10, // 83: activity_svc.GetActivityAnalyticsResponse.analytics:type_name -> activity_svc.UserBehaviorAnalytics - 81, // 84: activity_svc.GetActivityAnalyticsResponse.error:type_name -> activity_svc.Error + 92, // 84: activity_svc.GetActivityAnalyticsResponse.error:type_name -> activity_svc.Error 1, // 85: activity_svc.TrackSecurityEventRequest.severity:type_name -> activity_svc.Severity 9, // 86: activity_svc.TrackSecurityEventRequest.context:type_name -> activity_svc.SecurityContext - 81, // 87: activity_svc.TrackSecurityEventResponse.error:type_name -> activity_svc.Error + 92, // 87: activity_svc.TrackSecurityEventResponse.error:type_name -> activity_svc.Error 1, // 88: activity_svc.GetSecurityEventsRequest.min_severity:type_name -> activity_svc.Severity - 83, // 89: activity_svc.GetSecurityEventsRequest.start_time:type_name -> google.protobuf.Timestamp - 83, // 90: activity_svc.GetSecurityEventsRequest.end_time:type_name -> google.protobuf.Timestamp + 97, // 89: activity_svc.GetSecurityEventsRequest.start_time:type_name -> google.protobuf.Timestamp + 97, // 90: activity_svc.GetSecurityEventsRequest.end_time:type_name -> google.protobuf.Timestamp 8, // 91: activity_svc.GetSecurityEventsResponse.events:type_name -> activity_svc.SecurityEvent - 81, // 92: activity_svc.GetSecurityEventsResponse.error:type_name -> activity_svc.Error + 92, // 92: activity_svc.GetSecurityEventsResponse.error:type_name -> activity_svc.Error 10, // 93: activity_svc.GetUserBehaviorAnalyticsResponse.analytics:type_name -> activity_svc.UserBehaviorAnalytics - 81, // 94: activity_svc.GetUserBehaviorAnalyticsResponse.error:type_name -> activity_svc.Error + 92, // 94: activity_svc.GetUserBehaviorAnalyticsResponse.error:type_name -> activity_svc.Error 13, // 95: activity_svc.GetReadingBehaviorResponse.behavior:type_name -> activity_svc.ReadingBehaviorAnalytics - 81, // 96: activity_svc.GetReadingBehaviorResponse.error:type_name -> activity_svc.Error - 82, // 97: activity_svc.TrackRecommendationInteractionRequest.context:type_name -> google.protobuf.Struct - 81, // 98: activity_svc.TrackRecommendationInteractionResponse.error:type_name -> activity_svc.Error + 92, // 96: activity_svc.GetReadingBehaviorResponse.error:type_name -> activity_svc.Error + 96, // 97: activity_svc.TrackRecommendationInteractionRequest.context:type_name -> google.protobuf.Struct + 92, // 98: activity_svc.TrackRecommendationInteractionResponse.error:type_name -> activity_svc.Error 14, // 99: activity_svc.GetRecommendationAnalyticsResponse.interactions:type_name -> activity_svc.RecommendationInteraction - 82, // 100: activity_svc.GetRecommendationAnalyticsResponse.analytics_summary:type_name -> google.protobuf.Struct - 81, // 101: activity_svc.GetRecommendationAnalyticsResponse.error:type_name -> activity_svc.Error + 96, // 100: activity_svc.GetRecommendationAnalyticsResponse.analytics_summary:type_name -> google.protobuf.Struct + 92, // 101: activity_svc.GetRecommendationAnalyticsResponse.error:type_name -> activity_svc.Error 15, // 102: activity_svc.GetContentAnalyticsResponse.interactions:type_name -> activity_svc.ContentInteraction - 82, // 103: activity_svc.GetContentAnalyticsResponse.analytics_summary:type_name -> google.protobuf.Struct - 81, // 104: activity_svc.GetContentAnalyticsResponse.error:type_name -> activity_svc.Error - 82, // 105: activity_svc.TrackContentInteractionRequest.context:type_name -> google.protobuf.Struct - 81, // 106: activity_svc.TrackContentInteractionResponse.error:type_name -> activity_svc.Error + 96, // 103: activity_svc.GetContentAnalyticsResponse.analytics_summary:type_name -> google.protobuf.Struct + 92, // 104: activity_svc.GetContentAnalyticsResponse.error:type_name -> activity_svc.Error + 96, // 105: activity_svc.TrackContentInteractionRequest.context:type_name -> google.protobuf.Struct + 92, // 106: activity_svc.TrackContentInteractionResponse.error:type_name -> activity_svc.Error 2, // 107: activity_svc.TrackUserJourneyRequest.journey_stage:type_name -> activity_svc.JourneyStage - 82, // 108: activity_svc.TrackUserJourneyRequest.context:type_name -> google.protobuf.Struct - 81, // 109: activity_svc.TrackUserJourneyResponse.error:type_name -> activity_svc.Error + 96, // 108: activity_svc.TrackUserJourneyRequest.context:type_name -> google.protobuf.Struct + 92, // 109: activity_svc.TrackUserJourneyResponse.error:type_name -> activity_svc.Error 2, // 110: activity_svc.GetUserJourneyAnalyticsRequest.stage:type_name -> activity_svc.JourneyStage 19, // 111: activity_svc.GetUserJourneyAnalyticsResponse.journeys:type_name -> activity_svc.UserJourneyEvent - 82, // 112: activity_svc.GetUserJourneyAnalyticsResponse.funnel_analytics:type_name -> google.protobuf.Struct - 81, // 113: activity_svc.GetUserJourneyAnalyticsResponse.error:type_name -> activity_svc.Error + 96, // 112: activity_svc.GetUserJourneyAnalyticsResponse.funnel_analytics:type_name -> google.protobuf.Struct + 92, // 113: activity_svc.GetUserJourneyAnalyticsResponse.error:type_name -> activity_svc.Error 6, // 114: activity_svc.TrackNotificationEventRequest.type:type_name -> activity_svc.NotificationType 5, // 115: activity_svc.TrackNotificationEventRequest.channel:type_name -> activity_svc.NotificationChannel - 82, // 116: activity_svc.TrackNotificationEventRequest.device_info:type_name -> google.protobuf.Struct - 82, // 117: activity_svc.TrackNotificationEventRequest.location_info:type_name -> google.protobuf.Struct - 82, // 118: activity_svc.TrackNotificationEventRequest.context:type_name -> google.protobuf.Struct - 81, // 119: activity_svc.TrackNotificationEventResponse.error:type_name -> activity_svc.Error + 96, // 116: activity_svc.TrackNotificationEventRequest.device_info:type_name -> google.protobuf.Struct + 96, // 117: activity_svc.TrackNotificationEventRequest.location_info:type_name -> google.protobuf.Struct + 96, // 118: activity_svc.TrackNotificationEventRequest.context:type_name -> google.protobuf.Struct + 92, // 119: activity_svc.TrackNotificationEventResponse.error:type_name -> activity_svc.Error 6, // 120: activity_svc.GetNotificationAnalyticsRequest.type:type_name -> activity_svc.NotificationType 5, // 121: activity_svc.GetNotificationAnalyticsRequest.channel:type_name -> activity_svc.NotificationChannel 17, // 122: activity_svc.GetNotificationAnalyticsResponse.notifications:type_name -> activity_svc.NotificationEvent - 82, // 123: activity_svc.GetNotificationAnalyticsResponse.analytics_summary:type_name -> google.protobuf.Struct - 81, // 124: activity_svc.GetNotificationAnalyticsResponse.error:type_name -> activity_svc.Error - 82, // 125: activity_svc.TrackFinancialEventRequest.context:type_name -> google.protobuf.Struct - 81, // 126: activity_svc.TrackFinancialEventResponse.error:type_name -> activity_svc.Error - 83, // 127: activity_svc.GetFinancialEventsRequest.start_time:type_name -> google.protobuf.Timestamp - 83, // 128: activity_svc.GetFinancialEventsRequest.end_time:type_name -> google.protobuf.Timestamp + 96, // 123: activity_svc.GetNotificationAnalyticsResponse.analytics_summary:type_name -> google.protobuf.Struct + 92, // 124: activity_svc.GetNotificationAnalyticsResponse.error:type_name -> activity_svc.Error + 96, // 125: activity_svc.TrackFinancialEventRequest.context:type_name -> google.protobuf.Struct + 92, // 126: activity_svc.TrackFinancialEventResponse.error:type_name -> activity_svc.Error + 97, // 127: activity_svc.GetFinancialEventsRequest.start_time:type_name -> google.protobuf.Timestamp + 97, // 128: activity_svc.GetFinancialEventsRequest.end_time:type_name -> google.protobuf.Timestamp 18, // 129: activity_svc.GetFinancialEventsResponse.events:type_name -> activity_svc.FinancialEvent - 82, // 130: activity_svc.GetFinancialEventsResponse.financial_summary:type_name -> google.protobuf.Struct - 81, // 131: activity_svc.GetFinancialEventsResponse.error:type_name -> activity_svc.Error - 82, // 132: activity_svc.TrackIntegrationEventRequest.context:type_name -> google.protobuf.Struct - 81, // 133: activity_svc.TrackIntegrationEventResponse.error:type_name -> activity_svc.Error - 83, // 134: activity_svc.GetIntegrationEventsRequest.start_time:type_name -> google.protobuf.Timestamp - 83, // 135: activity_svc.GetIntegrationEventsRequest.end_time:type_name -> google.protobuf.Timestamp + 96, // 130: activity_svc.GetFinancialEventsResponse.financial_summary:type_name -> google.protobuf.Struct + 92, // 131: activity_svc.GetFinancialEventsResponse.error:type_name -> activity_svc.Error + 96, // 132: activity_svc.TrackIntegrationEventRequest.context:type_name -> google.protobuf.Struct + 92, // 133: activity_svc.TrackIntegrationEventResponse.error:type_name -> activity_svc.Error + 97, // 134: activity_svc.GetIntegrationEventsRequest.start_time:type_name -> google.protobuf.Timestamp + 97, // 135: activity_svc.GetIntegrationEventsRequest.end_time:type_name -> google.protobuf.Timestamp 20, // 136: activity_svc.GetIntegrationEventsResponse.events:type_name -> activity_svc.IntegrationEvent - 82, // 137: activity_svc.GetIntegrationEventsResponse.integration_summary:type_name -> google.protobuf.Struct - 81, // 138: activity_svc.GetIntegrationEventsResponse.error:type_name -> activity_svc.Error + 96, // 137: activity_svc.GetIntegrationEventsResponse.integration_summary:type_name -> google.protobuf.Struct + 92, // 138: activity_svc.GetIntegrationEventsResponse.error:type_name -> activity_svc.Error 1, // 139: activity_svc.TrackIncidentEventRequest.severity:type_name -> activity_svc.Severity - 82, // 140: activity_svc.TrackIncidentEventRequest.forensic_data:type_name -> google.protobuf.Struct - 82, // 141: activity_svc.TrackIncidentEventRequest.context:type_name -> google.protobuf.Struct - 81, // 142: activity_svc.TrackIncidentEventResponse.error:type_name -> activity_svc.Error + 96, // 140: activity_svc.TrackIncidentEventRequest.forensic_data:type_name -> google.protobuf.Struct + 96, // 141: activity_svc.TrackIncidentEventRequest.context:type_name -> google.protobuf.Struct + 92, // 142: activity_svc.TrackIncidentEventResponse.error:type_name -> activity_svc.Error 1, // 143: activity_svc.GetIncidentEventsRequest.min_severity:type_name -> activity_svc.Severity - 83, // 144: activity_svc.GetIncidentEventsRequest.start_time:type_name -> google.protobuf.Timestamp - 83, // 145: activity_svc.GetIncidentEventsRequest.end_time:type_name -> google.protobuf.Timestamp + 97, // 144: activity_svc.GetIncidentEventsRequest.start_time:type_name -> google.protobuf.Timestamp + 97, // 145: activity_svc.GetIncidentEventsRequest.end_time:type_name -> google.protobuf.Timestamp 21, // 146: activity_svc.GetIncidentEventsResponse.events:type_name -> activity_svc.IncidentEvent - 82, // 147: activity_svc.GetIncidentEventsResponse.incident_summary:type_name -> google.protobuf.Struct - 81, // 148: activity_svc.GetIncidentEventsResponse.error:type_name -> activity_svc.Error - 82, // 149: activity_svc.TrackComplianceEventRequest.request_data:type_name -> google.protobuf.Struct - 82, // 150: activity_svc.TrackComplianceEventRequest.response_data:type_name -> google.protobuf.Struct - 81, // 151: activity_svc.TrackComplianceEventResponse.error:type_name -> activity_svc.Error - 83, // 152: activity_svc.GetComplianceEventsRequest.start_time:type_name -> google.protobuf.Timestamp - 83, // 153: activity_svc.GetComplianceEventsRequest.end_time:type_name -> google.protobuf.Timestamp + 96, // 147: activity_svc.GetIncidentEventsResponse.incident_summary:type_name -> google.protobuf.Struct + 92, // 148: activity_svc.GetIncidentEventsResponse.error:type_name -> activity_svc.Error + 96, // 149: activity_svc.TrackComplianceEventRequest.request_data:type_name -> google.protobuf.Struct + 96, // 150: activity_svc.TrackComplianceEventRequest.response_data:type_name -> google.protobuf.Struct + 92, // 151: activity_svc.TrackComplianceEventResponse.error:type_name -> activity_svc.Error + 97, // 152: activity_svc.GetComplianceEventsRequest.start_time:type_name -> google.protobuf.Timestamp + 97, // 153: activity_svc.GetComplianceEventsRequest.end_time:type_name -> google.protobuf.Timestamp 22, // 154: activity_svc.GetComplianceEventsResponse.events:type_name -> activity_svc.ComplianceEvent - 81, // 155: activity_svc.GetComplianceEventsResponse.error:type_name -> activity_svc.Error - 82, // 156: activity_svc.TrackSearchActivityRequest.filters:type_name -> google.protobuf.Struct - 82, // 157: activity_svc.TrackSearchActivityRequest.context:type_name -> google.protobuf.Struct - 81, // 158: activity_svc.TrackSearchActivityResponse.error:type_name -> activity_svc.Error + 92, // 155: activity_svc.GetComplianceEventsResponse.error:type_name -> activity_svc.Error + 96, // 156: activity_svc.TrackSearchActivityRequest.filters:type_name -> google.protobuf.Struct + 96, // 157: activity_svc.TrackSearchActivityRequest.context:type_name -> google.protobuf.Struct + 92, // 158: activity_svc.TrackSearchActivityResponse.error:type_name -> activity_svc.Error 16, // 159: activity_svc.GetSearchAnalyticsResponse.searches:type_name -> activity_svc.SearchActivity - 82, // 160: activity_svc.GetSearchAnalyticsResponse.search_summary:type_name -> google.protobuf.Struct - 81, // 161: activity_svc.GetSearchAnalyticsResponse.error:type_name -> activity_svc.Error - 82, // 162: activity_svc.TrackPerformanceEventRequest.context:type_name -> google.protobuf.Struct - 81, // 163: activity_svc.TrackPerformanceEventResponse.error:type_name -> activity_svc.Error - 83, // 164: activity_svc.GetPerformanceAnalyticsRequest.start_time:type_name -> google.protobuf.Timestamp - 83, // 165: activity_svc.GetPerformanceAnalyticsRequest.end_time:type_name -> google.protobuf.Timestamp + 96, // 160: activity_svc.GetSearchAnalyticsResponse.search_summary:type_name -> google.protobuf.Struct + 92, // 161: activity_svc.GetSearchAnalyticsResponse.error:type_name -> activity_svc.Error + 96, // 162: activity_svc.TrackPerformanceEventRequest.context:type_name -> google.protobuf.Struct + 92, // 163: activity_svc.TrackPerformanceEventResponse.error:type_name -> activity_svc.Error + 97, // 164: activity_svc.GetPerformanceAnalyticsRequest.start_time:type_name -> google.protobuf.Timestamp + 97, // 165: activity_svc.GetPerformanceAnalyticsRequest.end_time:type_name -> google.protobuf.Timestamp 23, // 166: activity_svc.GetPerformanceAnalyticsResponse.events:type_name -> activity_svc.PerformanceEvent - 82, // 167: activity_svc.GetPerformanceAnalyticsResponse.performance_summary:type_name -> google.protobuf.Struct - 81, // 168: activity_svc.GetPerformanceAnalyticsResponse.error:type_name -> activity_svc.Error - 83, // 169: activity_svc.HealthCheckResponse.timestamp:type_name -> google.protobuf.Timestamp - 25, // 170: activity_svc.ActivityService.TrackActivity:input_type -> activity_svc.TrackActivityRequest - 27, // 171: activity_svc.ActivityService.GetUserActivities:input_type -> activity_svc.GetUserActivitiesRequest - 29, // 172: activity_svc.ActivityService.GetActivityAnalytics:input_type -> activity_svc.GetActivityAnalyticsRequest - 31, // 173: activity_svc.ActivityService.TrackSecurityEvent:input_type -> activity_svc.TrackSecurityEventRequest - 33, // 174: activity_svc.ActivityService.GetSecurityEvents:input_type -> activity_svc.GetSecurityEventsRequest - 35, // 175: activity_svc.ActivityService.GetUserBehaviorAnalytics:input_type -> activity_svc.GetUserBehaviorAnalyticsRequest - 37, // 176: activity_svc.ActivityService.GetReadingBehavior:input_type -> activity_svc.GetReadingBehaviorRequest - 39, // 177: activity_svc.ActivityService.TrackRecommendationInteraction:input_type -> activity_svc.TrackRecommendationInteractionRequest - 41, // 178: activity_svc.ActivityService.GetRecommendationAnalytics:input_type -> activity_svc.GetRecommendationAnalyticsRequest - 43, // 179: activity_svc.ActivityService.GetContentAnalytics:input_type -> activity_svc.GetContentAnalyticsRequest - 45, // 180: activity_svc.ActivityService.TrackContentInteraction:input_type -> activity_svc.TrackContentInteractionRequest - 47, // 181: activity_svc.ActivityService.TrackUserJourney:input_type -> activity_svc.TrackUserJourneyRequest - 49, // 182: activity_svc.ActivityService.GetUserJourneyAnalytics:input_type -> activity_svc.GetUserJourneyAnalyticsRequest - 51, // 183: activity_svc.ActivityService.TrackNotificationEvent:input_type -> activity_svc.TrackNotificationEventRequest - 53, // 184: activity_svc.ActivityService.GetNotificationAnalytics:input_type -> activity_svc.GetNotificationAnalyticsRequest - 55, // 185: activity_svc.ActivityService.TrackFinancialEvent:input_type -> activity_svc.TrackFinancialEventRequest - 57, // 186: activity_svc.ActivityService.GetFinancialEvents:input_type -> activity_svc.GetFinancialEventsRequest - 59, // 187: activity_svc.ActivityService.TrackIntegrationEvent:input_type -> activity_svc.TrackIntegrationEventRequest - 61, // 188: activity_svc.ActivityService.GetIntegrationEvents:input_type -> activity_svc.GetIntegrationEventsRequest - 63, // 189: activity_svc.ActivityService.TrackIncidentEvent:input_type -> activity_svc.TrackIncidentEventRequest - 65, // 190: activity_svc.ActivityService.GetIncidentEvents:input_type -> activity_svc.GetIncidentEventsRequest - 67, // 191: activity_svc.ActivityService.TrackComplianceEvent:input_type -> activity_svc.TrackComplianceEventRequest - 69, // 192: activity_svc.ActivityService.GetComplianceEvents:input_type -> activity_svc.GetComplianceEventsRequest - 71, // 193: activity_svc.ActivityService.TrackSearchActivity:input_type -> activity_svc.TrackSearchActivityRequest - 73, // 194: activity_svc.ActivityService.GetSearchAnalytics:input_type -> activity_svc.GetSearchAnalyticsRequest - 75, // 195: activity_svc.ActivityService.TrackPerformanceEvent:input_type -> activity_svc.TrackPerformanceEventRequest - 77, // 196: activity_svc.ActivityService.GetPerformanceAnalytics:input_type -> activity_svc.GetPerformanceAnalyticsRequest - 79, // 197: activity_svc.ActivityService.HealthCheck:input_type -> activity_svc.HealthCheckRequest - 26, // 198: activity_svc.ActivityService.TrackActivity:output_type -> activity_svc.TrackActivityResponse - 28, // 199: activity_svc.ActivityService.GetUserActivities:output_type -> activity_svc.GetUserActivitiesResponse - 30, // 200: activity_svc.ActivityService.GetActivityAnalytics:output_type -> activity_svc.GetActivityAnalyticsResponse - 32, // 201: activity_svc.ActivityService.TrackSecurityEvent:output_type -> activity_svc.TrackSecurityEventResponse - 34, // 202: activity_svc.ActivityService.GetSecurityEvents:output_type -> activity_svc.GetSecurityEventsResponse - 36, // 203: activity_svc.ActivityService.GetUserBehaviorAnalytics:output_type -> activity_svc.GetUserBehaviorAnalyticsResponse - 38, // 204: activity_svc.ActivityService.GetReadingBehavior:output_type -> activity_svc.GetReadingBehaviorResponse - 40, // 205: activity_svc.ActivityService.TrackRecommendationInteraction:output_type -> activity_svc.TrackRecommendationInteractionResponse - 42, // 206: activity_svc.ActivityService.GetRecommendationAnalytics:output_type -> activity_svc.GetRecommendationAnalyticsResponse - 44, // 207: activity_svc.ActivityService.GetContentAnalytics:output_type -> activity_svc.GetContentAnalyticsResponse - 46, // 208: activity_svc.ActivityService.TrackContentInteraction:output_type -> activity_svc.TrackContentInteractionResponse - 48, // 209: activity_svc.ActivityService.TrackUserJourney:output_type -> activity_svc.TrackUserJourneyResponse - 50, // 210: activity_svc.ActivityService.GetUserJourneyAnalytics:output_type -> activity_svc.GetUserJourneyAnalyticsResponse - 52, // 211: activity_svc.ActivityService.TrackNotificationEvent:output_type -> activity_svc.TrackNotificationEventResponse - 54, // 212: activity_svc.ActivityService.GetNotificationAnalytics:output_type -> activity_svc.GetNotificationAnalyticsResponse - 56, // 213: activity_svc.ActivityService.TrackFinancialEvent:output_type -> activity_svc.TrackFinancialEventResponse - 58, // 214: activity_svc.ActivityService.GetFinancialEvents:output_type -> activity_svc.GetFinancialEventsResponse - 60, // 215: activity_svc.ActivityService.TrackIntegrationEvent:output_type -> activity_svc.TrackIntegrationEventResponse - 62, // 216: activity_svc.ActivityService.GetIntegrationEvents:output_type -> activity_svc.GetIntegrationEventsResponse - 64, // 217: activity_svc.ActivityService.TrackIncidentEvent:output_type -> activity_svc.TrackIncidentEventResponse - 66, // 218: activity_svc.ActivityService.GetIncidentEvents:output_type -> activity_svc.GetIncidentEventsResponse - 68, // 219: activity_svc.ActivityService.TrackComplianceEvent:output_type -> activity_svc.TrackComplianceEventResponse - 70, // 220: activity_svc.ActivityService.GetComplianceEvents:output_type -> activity_svc.GetComplianceEventsResponse - 72, // 221: activity_svc.ActivityService.TrackSearchActivity:output_type -> activity_svc.TrackSearchActivityResponse - 74, // 222: activity_svc.ActivityService.GetSearchAnalytics:output_type -> activity_svc.GetSearchAnalyticsResponse - 76, // 223: activity_svc.ActivityService.TrackPerformanceEvent:output_type -> activity_svc.TrackPerformanceEventResponse - 78, // 224: activity_svc.ActivityService.GetPerformanceAnalytics:output_type -> activity_svc.GetPerformanceAnalyticsResponse - 80, // 225: activity_svc.ActivityService.HealthCheck:output_type -> activity_svc.HealthCheckResponse - 198, // [198:226] is the sub-list for method output_type - 170, // [170:198] is the sub-list for method input_type - 170, // [170:170] is the sub-list for extension type_name - 170, // [170:170] is the sub-list for extension extendee - 0, // [0:170] is the sub-list for field type_name + 96, // 167: activity_svc.GetPerformanceAnalyticsResponse.performance_summary:type_name -> google.protobuf.Struct + 92, // 168: activity_svc.GetPerformanceAnalyticsResponse.error:type_name -> activity_svc.Error + 80, // 169: activity_svc.GetTrendingBlogsResponse.blogs:type_name -> activity_svc.TrendingBlog + 92, // 170: activity_svc.GetTrendingBlogsResponse.error:type_name -> activity_svc.Error + 97, // 171: activity_svc.ActiveUser.last_active:type_name -> google.protobuf.Timestamp + 92, // 172: activity_svc.GetActiveUsersResponse.error:type_name -> activity_svc.Error + 83, // 173: activity_svc.GetActiveUsersResponse.user_list:type_name -> activity_svc.ActiveUser + 0, // 174: activity_svc.GetAccountActivitiesRequest.category:type_name -> activity_svc.ActivityCategory + 97, // 175: activity_svc.GetAccountActivitiesRequest.start_time:type_name -> google.protobuf.Timestamp + 97, // 176: activity_svc.GetAccountActivitiesRequest.end_time:type_name -> google.protobuf.Timestamp + 7, // 177: activity_svc.GetAccountActivitiesResponse.activities:type_name -> activity_svc.ActivityEvent + 92, // 178: activity_svc.GetAccountActivitiesResponse.error:type_name -> activity_svc.Error + 96, // 179: activity_svc.AdvancedAnalytics.conversion_funnel:type_name -> google.protobuf.Struct + 93, // 180: activity_svc.AdvancedAnalytics.geographic_hotspots:type_name -> activity_svc.AdvancedAnalytics.GeographicHotspotsEntry + 94, // 181: activity_svc.AdvancedAnalytics.peak_reading_times:type_name -> activity_svc.AdvancedAnalytics.PeakReadingTimesEntry + 95, // 182: activity_svc.AdvancedAnalytics.platform_bias:type_name -> activity_svc.AdvancedAnalytics.PlatformBiasEntry + 88, // 183: activity_svc.GetAdvancedAnalyticsResponse.analytics:type_name -> activity_svc.AdvancedAnalytics + 92, // 184: activity_svc.GetAdvancedAnalyticsResponse.error:type_name -> activity_svc.Error + 97, // 185: activity_svc.HealthCheckResponse.timestamp:type_name -> google.protobuf.Timestamp + 25, // 186: activity_svc.ActivityService.TrackActivity:input_type -> activity_svc.TrackActivityRequest + 27, // 187: activity_svc.ActivityService.GetUserActivities:input_type -> activity_svc.GetUserActivitiesRequest + 29, // 188: activity_svc.ActivityService.GetActivityAnalytics:input_type -> activity_svc.GetActivityAnalyticsRequest + 31, // 189: activity_svc.ActivityService.TrackSecurityEvent:input_type -> activity_svc.TrackSecurityEventRequest + 33, // 190: activity_svc.ActivityService.GetSecurityEvents:input_type -> activity_svc.GetSecurityEventsRequest + 35, // 191: activity_svc.ActivityService.GetUserBehaviorAnalytics:input_type -> activity_svc.GetUserBehaviorAnalyticsRequest + 37, // 192: activity_svc.ActivityService.GetReadingBehavior:input_type -> activity_svc.GetReadingBehaviorRequest + 39, // 193: activity_svc.ActivityService.TrackRecommendationInteraction:input_type -> activity_svc.TrackRecommendationInteractionRequest + 41, // 194: activity_svc.ActivityService.GetRecommendationAnalytics:input_type -> activity_svc.GetRecommendationAnalyticsRequest + 43, // 195: activity_svc.ActivityService.GetContentAnalytics:input_type -> activity_svc.GetContentAnalyticsRequest + 45, // 196: activity_svc.ActivityService.TrackContentInteraction:input_type -> activity_svc.TrackContentInteractionRequest + 47, // 197: activity_svc.ActivityService.TrackUserJourney:input_type -> activity_svc.TrackUserJourneyRequest + 49, // 198: activity_svc.ActivityService.GetUserJourneyAnalytics:input_type -> activity_svc.GetUserJourneyAnalyticsRequest + 51, // 199: activity_svc.ActivityService.TrackNotificationEvent:input_type -> activity_svc.TrackNotificationEventRequest + 53, // 200: activity_svc.ActivityService.GetNotificationAnalytics:input_type -> activity_svc.GetNotificationAnalyticsRequest + 55, // 201: activity_svc.ActivityService.TrackFinancialEvent:input_type -> activity_svc.TrackFinancialEventRequest + 57, // 202: activity_svc.ActivityService.GetFinancialEvents:input_type -> activity_svc.GetFinancialEventsRequest + 59, // 203: activity_svc.ActivityService.TrackIntegrationEvent:input_type -> activity_svc.TrackIntegrationEventRequest + 61, // 204: activity_svc.ActivityService.GetIntegrationEvents:input_type -> activity_svc.GetIntegrationEventsRequest + 63, // 205: activity_svc.ActivityService.TrackIncidentEvent:input_type -> activity_svc.TrackIncidentEventRequest + 65, // 206: activity_svc.ActivityService.GetIncidentEvents:input_type -> activity_svc.GetIncidentEventsRequest + 67, // 207: activity_svc.ActivityService.TrackComplianceEvent:input_type -> activity_svc.TrackComplianceEventRequest + 69, // 208: activity_svc.ActivityService.GetComplianceEvents:input_type -> activity_svc.GetComplianceEventsRequest + 71, // 209: activity_svc.ActivityService.TrackSearchActivity:input_type -> activity_svc.TrackSearchActivityRequest + 73, // 210: activity_svc.ActivityService.GetSearchAnalytics:input_type -> activity_svc.GetSearchAnalyticsRequest + 75, // 211: activity_svc.ActivityService.TrackPerformanceEvent:input_type -> activity_svc.TrackPerformanceEventRequest + 77, // 212: activity_svc.ActivityService.GetPerformanceAnalytics:input_type -> activity_svc.GetPerformanceAnalyticsRequest + 79, // 213: activity_svc.ActivityService.GetTrendingBlogs:input_type -> activity_svc.GetTrendingBlogsRequest + 82, // 214: activity_svc.ActivityService.GetActiveUsers:input_type -> activity_svc.GetActiveUsersRequest + 85, // 215: activity_svc.ActivityService.GetAccountActivities:input_type -> activity_svc.GetAccountActivitiesRequest + 87, // 216: activity_svc.ActivityService.GetAdvancedAnalytics:input_type -> activity_svc.GetAdvancedAnalyticsRequest + 90, // 217: activity_svc.ActivityService.HealthCheck:input_type -> activity_svc.HealthCheckRequest + 26, // 218: activity_svc.ActivityService.TrackActivity:output_type -> activity_svc.TrackActivityResponse + 28, // 219: activity_svc.ActivityService.GetUserActivities:output_type -> activity_svc.GetUserActivitiesResponse + 30, // 220: activity_svc.ActivityService.GetActivityAnalytics:output_type -> activity_svc.GetActivityAnalyticsResponse + 32, // 221: activity_svc.ActivityService.TrackSecurityEvent:output_type -> activity_svc.TrackSecurityEventResponse + 34, // 222: activity_svc.ActivityService.GetSecurityEvents:output_type -> activity_svc.GetSecurityEventsResponse + 36, // 223: activity_svc.ActivityService.GetUserBehaviorAnalytics:output_type -> activity_svc.GetUserBehaviorAnalyticsResponse + 38, // 224: activity_svc.ActivityService.GetReadingBehavior:output_type -> activity_svc.GetReadingBehaviorResponse + 40, // 225: activity_svc.ActivityService.TrackRecommendationInteraction:output_type -> activity_svc.TrackRecommendationInteractionResponse + 42, // 226: activity_svc.ActivityService.GetRecommendationAnalytics:output_type -> activity_svc.GetRecommendationAnalyticsResponse + 44, // 227: activity_svc.ActivityService.GetContentAnalytics:output_type -> activity_svc.GetContentAnalyticsResponse + 46, // 228: activity_svc.ActivityService.TrackContentInteraction:output_type -> activity_svc.TrackContentInteractionResponse + 48, // 229: activity_svc.ActivityService.TrackUserJourney:output_type -> activity_svc.TrackUserJourneyResponse + 50, // 230: activity_svc.ActivityService.GetUserJourneyAnalytics:output_type -> activity_svc.GetUserJourneyAnalyticsResponse + 52, // 231: activity_svc.ActivityService.TrackNotificationEvent:output_type -> activity_svc.TrackNotificationEventResponse + 54, // 232: activity_svc.ActivityService.GetNotificationAnalytics:output_type -> activity_svc.GetNotificationAnalyticsResponse + 56, // 233: activity_svc.ActivityService.TrackFinancialEvent:output_type -> activity_svc.TrackFinancialEventResponse + 58, // 234: activity_svc.ActivityService.GetFinancialEvents:output_type -> activity_svc.GetFinancialEventsResponse + 60, // 235: activity_svc.ActivityService.TrackIntegrationEvent:output_type -> activity_svc.TrackIntegrationEventResponse + 62, // 236: activity_svc.ActivityService.GetIntegrationEvents:output_type -> activity_svc.GetIntegrationEventsResponse + 64, // 237: activity_svc.ActivityService.TrackIncidentEvent:output_type -> activity_svc.TrackIncidentEventResponse + 66, // 238: activity_svc.ActivityService.GetIncidentEvents:output_type -> activity_svc.GetIncidentEventsResponse + 68, // 239: activity_svc.ActivityService.TrackComplianceEvent:output_type -> activity_svc.TrackComplianceEventResponse + 70, // 240: activity_svc.ActivityService.GetComplianceEvents:output_type -> activity_svc.GetComplianceEventsResponse + 72, // 241: activity_svc.ActivityService.TrackSearchActivity:output_type -> activity_svc.TrackSearchActivityResponse + 74, // 242: activity_svc.ActivityService.GetSearchAnalytics:output_type -> activity_svc.GetSearchAnalyticsResponse + 76, // 243: activity_svc.ActivityService.TrackPerformanceEvent:output_type -> activity_svc.TrackPerformanceEventResponse + 78, // 244: activity_svc.ActivityService.GetPerformanceAnalytics:output_type -> activity_svc.GetPerformanceAnalyticsResponse + 81, // 245: activity_svc.ActivityService.GetTrendingBlogs:output_type -> activity_svc.GetTrendingBlogsResponse + 84, // 246: activity_svc.ActivityService.GetActiveUsers:output_type -> activity_svc.GetActiveUsersResponse + 86, // 247: activity_svc.ActivityService.GetAccountActivities:output_type -> activity_svc.GetAccountActivitiesResponse + 89, // 248: activity_svc.ActivityService.GetAdvancedAnalytics:output_type -> activity_svc.GetAdvancedAnalyticsResponse + 91, // 249: activity_svc.ActivityService.HealthCheck:output_type -> activity_svc.HealthCheckResponse + 218, // [218:250] is the sub-list for method output_type + 186, // [186:218] is the sub-list for method input_type + 186, // [186:186] is the sub-list for extension type_name + 186, // [186:186] is the sub-list for extension extendee + 0, // [0:186] is the sub-list for field type_name } func init() { file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_init() } @@ -11979,7 +12948,7 @@ func file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_init() { } } file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HealthCheckRequest); i { + switch v := v.(*GetTrendingBlogsRequest); i { case 0: return &v.state case 1: @@ -11991,7 +12960,7 @@ func file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_init() { } } file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HealthCheckResponse); i { + switch v := v.(*TrendingBlog); i { case 0: return &v.state case 1: @@ -12003,6 +12972,138 @@ func file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_init() { } } file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTrendingBlogsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetActiveUsersRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ActiveUser); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetActiveUsersResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAccountActivitiesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAccountActivitiesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAdvancedAnalyticsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AdvancedAnalytics); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAdvancedAnalyticsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HealthCheckRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HealthCheckResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Error); i { case 0: return &v.state @@ -12021,7 +13122,7 @@ func file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_apis_serviceconn_gateway_activity_pb_gw_activity_proto_rawDesc, NumEnums: 7, - NumMessages: 75, + NumMessages: 89, NumExtensions: 0, NumServices: 1, }, diff --git a/apis/serviceconn/gateway_activity/pb/gw_activity.proto b/apis/serviceconn/gateway_activity/pb/gw_activity.proto index a719597a..3133cc20 100644 --- a/apis/serviceconn/gateway_activity/pb/gw_activity.proto +++ b/apis/serviceconn/gateway_activity/pb/gw_activity.proto @@ -62,6 +62,12 @@ service ActivityService { rpc TrackPerformanceEvent(TrackPerformanceEventRequest) returns (TrackPerformanceEventResponse); rpc GetPerformanceAnalytics(GetPerformanceAnalyticsRequest) returns (GetPerformanceAnalyticsResponse); + // Advanced analytics + rpc GetTrendingBlogs(GetTrendingBlogsRequest) returns (GetTrendingBlogsResponse); + rpc GetActiveUsers(GetActiveUsersRequest) returns (GetActiveUsersResponse); + rpc GetAccountActivities(GetAccountActivitiesRequest) returns (GetAccountActivitiesResponse); + rpc GetAdvancedAnalytics(GetAdvancedAnalyticsRequest) returns (GetAdvancedAnalyticsResponse); + // Health check rpc HealthCheck(HealthCheckRequest) returns (HealthCheckResponse); } @@ -1063,6 +1069,93 @@ message GetPerformanceAnalyticsResponse { Error error = 5; } +// Get Trending Blogs +message GetTrendingBlogsRequest { + string account_id = 1; + string time_range = 2; // "24h", "7d", etc. + int32 limit = 3; +} + +message TrendingBlog { + string blog_id = 1; + int64 views = 2; + int64 likes = 3; + double score = 4; +} + +message GetTrendingBlogsResponse { + int32 status_code = 1; + repeated TrendingBlog blogs = 2; + Error error = 3; +} + +// Get Active Users +message GetActiveUsersRequest { + string account_id = 1; + string time_range = 2; +} + +message ActiveUser { + string user_id = 1; + google.protobuf.Timestamp last_active = 2; +} + +message GetActiveUsersResponse { + int32 status_code = 1; + int64 active_users = 2; + Error error = 3; + repeated ActiveUser user_list = 4; +} + +// Get Account Activities +message GetAccountActivitiesRequest { + string account_id = 1; + ActivityCategory category = 2; + string action = 3; + google.protobuf.Timestamp start_time = 4; + google.protobuf.Timestamp end_time = 5; + int32 limit = 6; + int32 offset = 7; +} + +message GetAccountActivitiesResponse { + int32 status_code = 1; + repeated ActivityEvent activities = 2; + int64 total_count = 3; + Error error = 4; +} + +// Advanced Analytics (The 5-point suite) +message GetAdvancedAnalyticsRequest { + string account_id = 1; + string time_range = 2; +} + +message AdvancedAnalytics { + // 1. User Retention + double retention_rate = 1; + int64 new_users = 2; + int64 returning_users = 3; + + // 2. Conversion Funnel + google.protobuf.Struct conversion_funnel = 4; + + // 3. Geographic Hotspots + map geographic_hotspots = 5; + + // 4. Peak Reading Times + map peak_reading_times = 6; + + // 5. Platform Bias + map platform_bias = 7; +} + +message GetAdvancedAnalyticsResponse { + int32 status_code = 1; + AdvancedAnalytics analytics = 2; + Error error = 3; +} + // Health Check message HealthCheckRequest { } @@ -1080,4 +1173,4 @@ message Error { int32 status = 1; string error = 2; string message = 3; -} \ No newline at end of file +} diff --git a/apis/serviceconn/gateway_activity/pb/gw_activity_grpc.pb.go b/apis/serviceconn/gateway_activity/pb/gw_activity_grpc.pb.go index d30a8808..59384e66 100644 --- a/apis/serviceconn/gateway_activity/pb/gw_activity_grpc.pb.go +++ b/apis/serviceconn/gateway_activity/pb/gw_activity_grpc.pb.go @@ -46,6 +46,10 @@ const ( ActivityService_GetSearchAnalytics_FullMethodName = "/activity_svc.ActivityService/GetSearchAnalytics" ActivityService_TrackPerformanceEvent_FullMethodName = "/activity_svc.ActivityService/TrackPerformanceEvent" ActivityService_GetPerformanceAnalytics_FullMethodName = "/activity_svc.ActivityService/GetPerformanceAnalytics" + ActivityService_GetTrendingBlogs_FullMethodName = "/activity_svc.ActivityService/GetTrendingBlogs" + ActivityService_GetActiveUsers_FullMethodName = "/activity_svc.ActivityService/GetActiveUsers" + ActivityService_GetAccountActivities_FullMethodName = "/activity_svc.ActivityService/GetAccountActivities" + ActivityService_GetAdvancedAnalytics_FullMethodName = "/activity_svc.ActivityService/GetAdvancedAnalytics" ActivityService_HealthCheck_FullMethodName = "/activity_svc.ActivityService/HealthCheck" ) @@ -95,6 +99,11 @@ type ActivityServiceClient interface { // Performance tracking TrackPerformanceEvent(ctx context.Context, in *TrackPerformanceEventRequest, opts ...grpc.CallOption) (*TrackPerformanceEventResponse, error) GetPerformanceAnalytics(ctx context.Context, in *GetPerformanceAnalyticsRequest, opts ...grpc.CallOption) (*GetPerformanceAnalyticsResponse, error) + // Advanced analytics + GetTrendingBlogs(ctx context.Context, in *GetTrendingBlogsRequest, opts ...grpc.CallOption) (*GetTrendingBlogsResponse, error) + GetActiveUsers(ctx context.Context, in *GetActiveUsersRequest, opts ...grpc.CallOption) (*GetActiveUsersResponse, error) + GetAccountActivities(ctx context.Context, in *GetAccountActivitiesRequest, opts ...grpc.CallOption) (*GetAccountActivitiesResponse, error) + GetAdvancedAnalytics(ctx context.Context, in *GetAdvancedAnalyticsRequest, opts ...grpc.CallOption) (*GetAdvancedAnalyticsResponse, error) // Health check HealthCheck(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (*HealthCheckResponse, error) } @@ -377,6 +386,46 @@ func (c *activityServiceClient) GetPerformanceAnalytics(ctx context.Context, in return out, nil } +func (c *activityServiceClient) GetTrendingBlogs(ctx context.Context, in *GetTrendingBlogsRequest, opts ...grpc.CallOption) (*GetTrendingBlogsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetTrendingBlogsResponse) + err := c.cc.Invoke(ctx, ActivityService_GetTrendingBlogs_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *activityServiceClient) GetActiveUsers(ctx context.Context, in *GetActiveUsersRequest, opts ...grpc.CallOption) (*GetActiveUsersResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetActiveUsersResponse) + err := c.cc.Invoke(ctx, ActivityService_GetActiveUsers_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *activityServiceClient) GetAccountActivities(ctx context.Context, in *GetAccountActivitiesRequest, opts ...grpc.CallOption) (*GetAccountActivitiesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetAccountActivitiesResponse) + err := c.cc.Invoke(ctx, ActivityService_GetAccountActivities_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *activityServiceClient) GetAdvancedAnalytics(ctx context.Context, in *GetAdvancedAnalyticsRequest, opts ...grpc.CallOption) (*GetAdvancedAnalyticsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetAdvancedAnalyticsResponse) + err := c.cc.Invoke(ctx, ActivityService_GetAdvancedAnalytics_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *activityServiceClient) HealthCheck(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (*HealthCheckResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(HealthCheckResponse) @@ -433,6 +482,11 @@ type ActivityServiceServer interface { // Performance tracking TrackPerformanceEvent(context.Context, *TrackPerformanceEventRequest) (*TrackPerformanceEventResponse, error) GetPerformanceAnalytics(context.Context, *GetPerformanceAnalyticsRequest) (*GetPerformanceAnalyticsResponse, error) + // Advanced analytics + GetTrendingBlogs(context.Context, *GetTrendingBlogsRequest) (*GetTrendingBlogsResponse, error) + GetActiveUsers(context.Context, *GetActiveUsersRequest) (*GetActiveUsersResponse, error) + GetAccountActivities(context.Context, *GetAccountActivitiesRequest) (*GetAccountActivitiesResponse, error) + GetAdvancedAnalytics(context.Context, *GetAdvancedAnalyticsRequest) (*GetAdvancedAnalyticsResponse, error) // Health check HealthCheck(context.Context, *HealthCheckRequest) (*HealthCheckResponse, error) mustEmbedUnimplementedActivityServiceServer() @@ -526,6 +580,18 @@ func (UnimplementedActivityServiceServer) TrackPerformanceEvent(context.Context, func (UnimplementedActivityServiceServer) GetPerformanceAnalytics(context.Context, *GetPerformanceAnalyticsRequest) (*GetPerformanceAnalyticsResponse, error) { return nil, status.Error(codes.Unimplemented, "method GetPerformanceAnalytics not implemented") } +func (UnimplementedActivityServiceServer) GetTrendingBlogs(context.Context, *GetTrendingBlogsRequest) (*GetTrendingBlogsResponse, error) { + return nil, status.Error(codes.Unimplemented, "method GetTrendingBlogs not implemented") +} +func (UnimplementedActivityServiceServer) GetActiveUsers(context.Context, *GetActiveUsersRequest) (*GetActiveUsersResponse, error) { + return nil, status.Error(codes.Unimplemented, "method GetActiveUsers not implemented") +} +func (UnimplementedActivityServiceServer) GetAccountActivities(context.Context, *GetAccountActivitiesRequest) (*GetAccountActivitiesResponse, error) { + return nil, status.Error(codes.Unimplemented, "method GetAccountActivities not implemented") +} +func (UnimplementedActivityServiceServer) GetAdvancedAnalytics(context.Context, *GetAdvancedAnalyticsRequest) (*GetAdvancedAnalyticsResponse, error) { + return nil, status.Error(codes.Unimplemented, "method GetAdvancedAnalytics not implemented") +} func (UnimplementedActivityServiceServer) HealthCheck(context.Context, *HealthCheckRequest) (*HealthCheckResponse, error) { return nil, status.Error(codes.Unimplemented, "method HealthCheck not implemented") } @@ -1036,6 +1102,78 @@ func _ActivityService_GetPerformanceAnalytics_Handler(srv interface{}, ctx conte return interceptor(ctx, in, info, handler) } +func _ActivityService_GetTrendingBlogs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTrendingBlogsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ActivityServiceServer).GetTrendingBlogs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ActivityService_GetTrendingBlogs_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ActivityServiceServer).GetTrendingBlogs(ctx, req.(*GetTrendingBlogsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ActivityService_GetActiveUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetActiveUsersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ActivityServiceServer).GetActiveUsers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ActivityService_GetActiveUsers_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ActivityServiceServer).GetActiveUsers(ctx, req.(*GetActiveUsersRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ActivityService_GetAccountActivities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetAccountActivitiesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ActivityServiceServer).GetAccountActivities(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ActivityService_GetAccountActivities_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ActivityServiceServer).GetAccountActivities(ctx, req.(*GetAccountActivitiesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ActivityService_GetAdvancedAnalytics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetAdvancedAnalyticsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ActivityServiceServer).GetAdvancedAnalytics(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ActivityService_GetAdvancedAnalytics_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ActivityServiceServer).GetAdvancedAnalytics(ctx, req.(*GetAdvancedAnalyticsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _ActivityService_HealthCheck_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(HealthCheckRequest) if err := dec(in); err != nil { @@ -1169,6 +1307,22 @@ var ActivityService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetPerformanceAnalytics", Handler: _ActivityService_GetPerformanceAnalytics_Handler, }, + { + MethodName: "GetTrendingBlogs", + Handler: _ActivityService_GetTrendingBlogs_Handler, + }, + { + MethodName: "GetActiveUsers", + Handler: _ActivityService_GetActiveUsers_Handler, + }, + { + MethodName: "GetAccountActivities", + Handler: _ActivityService_GetAccountActivities_Handler, + }, + { + MethodName: "GetAdvancedAnalytics", + Handler: _ActivityService_GetAdvancedAnalytics_Handler, + }, { MethodName: "HealthCheck", Handler: _ActivityService_HealthCheck_Handler, diff --git a/apis/serviceconn/gateway_user/pb/gw_user.pb.go b/apis/serviceconn/gateway_user/pb/gw_user.pb.go index fb0a6a4f..94a3bc50 100644 --- a/apis/serviceconn/gateway_user/pb/gw_user.pb.go +++ b/apis/serviceconn/gateway_user/pb/gw_user.pb.go @@ -2633,6 +2633,100 @@ func (x *FollowerFollowingCountsResp) GetStatus() int32 { return 0 } +type GetBatchUserDetailsReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AccountIds []string `protobuf:"bytes,1,rep,name=account_ids,json=accountIds,proto3" json:"account_ids,omitempty"` +} + +func (x *GetBatchUserDetailsReq) Reset() { + *x = GetBatchUserDetailsReq{} + if protoimpl.UnsafeEnabled { + mi := &file_apis_serviceconn_gateway_user_pb_gw_user_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetBatchUserDetailsReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetBatchUserDetailsReq) ProtoMessage() {} + +func (x *GetBatchUserDetailsReq) ProtoReflect() protoreflect.Message { + mi := &file_apis_serviceconn_gateway_user_pb_gw_user_proto_msgTypes[34] + 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 GetBatchUserDetailsReq.ProtoReflect.Descriptor instead. +func (*GetBatchUserDetailsReq) Descriptor() ([]byte, []int) { + return file_apis_serviceconn_gateway_user_pb_gw_user_proto_rawDescGZIP(), []int{34} +} + +func (x *GetBatchUserDetailsReq) GetAccountIds() []string { + if x != nil { + return x.AccountIds + } + return nil +} + +type GetBatchUserDetailsRes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Users []*UserDetailsResp `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` +} + +func (x *GetBatchUserDetailsRes) Reset() { + *x = GetBatchUserDetailsRes{} + if protoimpl.UnsafeEnabled { + mi := &file_apis_serviceconn_gateway_user_pb_gw_user_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetBatchUserDetailsRes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetBatchUserDetailsRes) ProtoMessage() {} + +func (x *GetBatchUserDetailsRes) ProtoReflect() protoreflect.Message { + mi := &file_apis_serviceconn_gateway_user_pb_gw_user_proto_msgTypes[35] + 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 GetBatchUserDetailsRes.ProtoReflect.Descriptor instead. +func (*GetBatchUserDetailsRes) Descriptor() ([]byte, []int) { + return file_apis_serviceconn_gateway_user_pb_gw_user_proto_rawDescGZIP(), []int{35} +} + +func (x *GetBatchUserDetailsRes) GetUsers() []*UserDetailsResp { + if x != nil { + return x.Users + } + return nil +} + var File_apis_serviceconn_gateway_user_pb_gw_user_proto protoreflect.FileDescriptor var file_apis_serviceconn_gateway_user_pb_gw_user_proto_rawDesc = []byte{ @@ -2964,144 +3058,158 @@ var file_apis_serviceconn_gateway_user_pb_gw_user_proto_rawDesc = []byte{ 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x32, 0xe4, 0x10, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x61, 0x75, 0x74, - 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, - 0x74, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x1a, - 0x18, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x11, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x12, 0x1e, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, - 0x1a, 0x1e, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, - 0x22, 0x00, 0x12, 0x55, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, - 0x76, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1e, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, - 0x76, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x0c, 0x47, 0x65, 0x74, - 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x75, 0x74, 0x68, - 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, - 0x63, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x43, - 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1d, 0x2e, 0x61, 0x75, 0x74, 0x68, - 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x43, 0x61, 0x74, 0x65, 0x67, - 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, - 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, - 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x17, 0x2e, 0x61, 0x75, - 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, - 0x00, 0x12, 0x44, 0x0a, 0x0c, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x6f, 0x70, 0x69, 0x63, - 0x73, 0x12, 0x18, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x6f, 0x70, - 0x69, 0x63, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x61, 0x75, - 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x55, 0x6e, 0x46, 0x6f, 0x6c, - 0x6c, 0x6f, 0x77, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x12, 0x18, 0x2e, 0x61, 0x75, 0x74, 0x68, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x39, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x12, + 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x73, + 0x22, 0x49, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x05, 0x75, 0x73, + 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x75, 0x74, 0x68, + 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x32, 0xc1, 0x11, 0x0a, 0x0b, + 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x11, 0x47, + 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x12, 0x19, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x61, 0x75, + 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x75, + 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x22, + 0x00, 0x12, 0x55, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, + 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1e, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, + 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x2e, + 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1e, 0x2e, + 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, + 0x4a, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x12, + 0x1b, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, + 0x70, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x1a, 0x1b, 0x2e, 0x61, + 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, + 0x1d, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, + 0x6c, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1d, + 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, + 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, + 0x46, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x12, 0x17, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x61, 0x75, 0x74, + 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0c, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, + 0x77, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x12, 0x18, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, + 0x76, 0x63, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x1a, 0x18, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x6f, 0x70, + 0x69, 0x63, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x46, 0x0a, + 0x0e, 0x55, 0x6e, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x12, + 0x18, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x54, - 0x6f, 0x70, 0x69, 0x63, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, - 0x40, 0x0a, 0x0a, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17, 0x2e, - 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x46, 0x6f, 0x6c, - 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, - 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x55, 0x6e, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x65, - 0x72, 0x12, 0x17, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x61, 0x75, 0x74, - 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, - 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x72, 0x73, 0x12, 0x17, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x1f, - 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x72, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x22, - 0x00, 0x12, 0x4a, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, - 0x67, 0x12, 0x17, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x61, 0x75, 0x74, - 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x46, 0x6f, - 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x48, 0x0a, - 0x12, 0x47, 0x65, 0x74, 0x49, 0x66, 0x49, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x55, + 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0a, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x46, 0x6f, 0x6c, 0x6c, - 0x6f, 0x77, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x5f, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x46, 0x6f, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x73, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x17, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, - 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x1a, - 0x25, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, - 0x77, 0x65, 0x72, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, - 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x1a, - 0x1f, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, - 0x77, 0x65, 0x72, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, - 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x0c, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, - 0x72, 0x6b, 0x42, 0x6c, 0x6f, 0x67, 0x12, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, - 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, - 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, - 0x6b, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x42, 0x6f, 0x6f, - 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, - 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, - 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, - 0x6b, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x12, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, + 0x6f, 0x77, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x55, 0x6e, 0x46, 0x6f, 0x6c, + 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, + 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, + 0x1a, 0x17, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x0c, 0x47, + 0x65, 0x74, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x73, 0x12, 0x17, 0x2e, 0x61, 0x75, + 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, + 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x6f, + 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x12, 0x17, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, + 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, + 0x1a, 0x1f, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x46, 0x6f, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x72, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x49, 0x66, 0x49, 0x46, 0x6f, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x61, 0x75, 0x74, 0x68, + 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x52, + 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x5f, 0x0a, + 0x1b, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x73, 0x46, 0x6f, 0x6c, + 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x17, 0x2e, 0x61, + 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x25, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, + 0x2e, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, + 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x4c, + 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x61, + 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, + 0x2e, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x0c, + 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x42, 0x6c, 0x6f, 0x67, 0x12, 0x15, 0x2e, 0x61, + 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, + 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, + 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x0c, + 0x47, 0x65, 0x74, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x15, 0x2e, 0x61, + 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, + 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, + 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x12, 0x15, + 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, + 0x72, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, + 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x3a, + 0x0a, 0x08, 0x4c, 0x69, 0x6b, 0x65, 0x42, 0x6c, 0x6f, 0x67, 0x12, 0x15, 0x2e, 0x61, 0x75, 0x74, + 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, + 0x71, 0x1a, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, + 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x0a, 0x55, 0x6e, + 0x6c, 0x69, 0x6b, 0x65, 0x42, 0x6c, 0x6f, 0x67, 0x12, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, - 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x08, 0x4c, 0x69, 0x6b, 0x65, - 0x42, 0x6c, 0x6f, 0x67, 0x12, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, - 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x61, 0x75, - 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, - 0x65, 0x73, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x0a, 0x55, 0x6e, 0x6c, 0x69, 0x6b, 0x65, 0x42, 0x6c, - 0x6f, 0x67, 0x12, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, - 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, - 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, - 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x49, 0x66, 0x42, 0x6c, 0x6f, 0x67, 0x4c, - 0x69, 0x6b, 0x65, 0x64, 0x12, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, - 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x61, 0x75, - 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, - 0x65, 0x73, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x49, 0x66, 0x42, 0x6c, 0x6f, - 0x67, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x12, 0x15, 0x2e, 0x61, 0x75, - 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, - 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, - 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x11, 0x47, - 0x65, 0x74, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, - 0x12, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, - 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, - 0x76, 0x63, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x3d, - 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x6b, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, - 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, - 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, - 0x63, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x4c, 0x0a, - 0x0e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x43, 0x6f, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x12, - 0x1b, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6f, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x61, - 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6f, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x14, 0x52, - 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x43, 0x6f, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, - 0x6f, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, - 0x1a, 0x1b, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6f, 0x41, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, - 0x50, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x67, 0x73, 0x42, 0x79, 0x55, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, - 0x42, 0x6c, 0x6f, 0x67, 0x73, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x1c, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6c, 0x6f, - 0x67, 0x73, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x22, - 0x00, 0x12, 0x49, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x54, 0x6f, - 0x70, 0x69, 0x63, 0x73, 0x12, 0x19, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x1a, - 0x19, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x22, 0x00, 0x42, 0x24, 0x5a, 0x22, - 0x2e, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x63, 0x6f, - 0x6e, 0x6e, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x2f, - 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x49, + 0x66, 0x42, 0x6c, 0x6f, 0x67, 0x4c, 0x69, 0x6b, 0x65, 0x64, 0x12, 0x15, 0x2e, 0x61, 0x75, 0x74, + 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, + 0x71, 0x1a, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, + 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x13, 0x47, 0x65, + 0x74, 0x49, 0x66, 0x42, 0x6c, 0x6f, 0x67, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x64, 0x12, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, + 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, + 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x22, + 0x00, 0x12, 0x41, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, + 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, + 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x6b, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, + 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x61, + 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x43, 0x6f, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x12, 0x1b, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, + 0x2e, 0x43, 0x6f, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, + 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6f, + 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x22, + 0x00, 0x12, 0x52, 0x0a, 0x14, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x43, 0x6f, 0x41, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x75, 0x74, 0x68, + 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x6f, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, + 0x63, 0x2e, 0x43, 0x6f, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x67, + 0x73, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x75, 0x74, + 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x42, 0x6c, 0x6f, 0x67, 0x73, 0x42, 0x79, 0x55, 0x73, 0x65, + 0x72, 0x49, 0x64, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, + 0x76, 0x63, 0x2e, 0x42, 0x6c, 0x6f, 0x67, 0x73, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4e, 0x65, 0x77, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x12, 0x19, 0x2e, 0x61, 0x75, 0x74, + 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x70, 0x69, + 0x63, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, + 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x73, + 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x75, 0x74, 0x68, + 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x73, 0x65, + 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x20, 0x2e, 0x61, 0x75, + 0x74, 0x68, 0x5f, 0x73, 0x76, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, + 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x22, 0x00, 0x42, + 0x24, 0x5a, 0x22, 0x2e, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x75, 0x73, + 0x65, 0x72, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3116,7 +3224,7 @@ func file_apis_serviceconn_gateway_user_pb_gw_user_proto_rawDescGZIP() []byte { return file_apis_serviceconn_gateway_user_pb_gw_user_proto_rawDescData } -var file_apis_serviceconn_gateway_user_pb_gw_user_proto_msgTypes = make([]protoimpl.MessageInfo, 35) +var file_apis_serviceconn_gateway_user_pb_gw_user_proto_msgTypes = make([]protoimpl.MessageInfo, 37) var file_apis_serviceconn_gateway_user_pb_gw_user_proto_goTypes = []interface{}{ (*UserProfileReq)(nil), // 0: auth_svc.UserProfileReq (*UserProfileRes)(nil), // 1: auth_svc.UserProfileRes @@ -3152,81 +3260,86 @@ var file_apis_serviceconn_gateway_user_pb_gw_user_proto_goTypes = []interface{}{ (*FollowerFollowingResp)(nil), // 31: auth_svc.FollowerFollowingResp (*CountResp)(nil), // 32: auth_svc.CountResp (*FollowerFollowingCountsResp)(nil), // 33: auth_svc.FollowerFollowingCountsResp - nil, // 34: auth_svc.GetAllCategoriesRes.CategoryEntry - (*timestamppb.Timestamp)(nil), // 35: google.protobuf.Timestamp + (*GetBatchUserDetailsReq)(nil), // 34: auth_svc.GetBatchUserDetailsReq + (*GetBatchUserDetailsRes)(nil), // 35: auth_svc.GetBatchUserDetailsRes + nil, // 36: auth_svc.GetAllCategoriesRes.CategoryEntry + (*timestamppb.Timestamp)(nil), // 37: google.protobuf.Timestamp } var file_apis_serviceconn_gateway_user_pb_gw_user_proto_depIdxs = []int32{ - 35, // 0: auth_svc.UserProfileRes.created_at:type_name -> google.protobuf.Timestamp - 35, // 1: auth_svc.UserProfileRes.updated_at:type_name -> google.protobuf.Timestamp + 37, // 0: auth_svc.UserProfileRes.created_at:type_name -> google.protobuf.Timestamp + 37, // 1: auth_svc.UserProfileRes.updated_at:type_name -> google.protobuf.Timestamp 4, // 2: auth_svc.UserActivityResp.response:type_name -> auth_svc.UserActivity 10, // 3: auth_svc.GetTopicsResponse.topics:type_name -> auth_svc.Topics - 34, // 4: auth_svc.GetAllCategoriesRes.category:type_name -> auth_svc.GetAllCategoriesRes.CategoryEntry + 36, // 4: auth_svc.GetAllCategoriesRes.category:type_name -> auth_svc.GetAllCategoriesRes.CategoryEntry 22, // 5: auth_svc.BlogsByUserNameRes.blogs:type_name -> auth_svc.Blog 30, // 6: auth_svc.FollowerFollowingResp.users:type_name -> auth_svc.User - 12, // 7: auth_svc.GetAllCategoriesRes.CategoryEntry.value:type_name -> auth_svc.Category - 2, // 8: auth_svc.UserService.GetUserActivities:input_type -> auth_svc.UserActivityReq - 0, // 9: auth_svc.UserService.GetUserProfile:input_type -> auth_svc.UserProfileReq - 5, // 10: auth_svc.UserService.UpdateUserProfile:input_type -> auth_svc.UpdateUserProfileReq - 7, // 11: auth_svc.UserService.DeleteUserAccount:input_type -> auth_svc.DeleteUserProfileReq - 9, // 12: auth_svc.UserService.GetAllTopics:input_type -> auth_svc.GetTopicsRequests - 13, // 13: auth_svc.UserService.GetAllCategories:input_type -> auth_svc.GetAllCategoriesReq - 15, // 14: auth_svc.UserService.GetUserDetails:input_type -> auth_svc.UserDetailReq - 17, // 15: auth_svc.UserService.FollowTopics:input_type -> auth_svc.TopicActionReq - 17, // 16: auth_svc.UserService.UnFollowTopics:input_type -> auth_svc.TopicActionReq - 28, // 17: auth_svc.UserService.FollowUser:input_type -> auth_svc.UserFollowReq - 28, // 18: auth_svc.UserService.UnFollowUser:input_type -> auth_svc.UserFollowReq - 15, // 19: auth_svc.UserService.GetFollowers:input_type -> auth_svc.UserDetailReq - 15, // 20: auth_svc.UserService.GetFollowing:input_type -> auth_svc.UserDetailReq - 28, // 21: auth_svc.UserService.GetIfIFollowedUser:input_type -> auth_svc.UserFollowReq - 15, // 22: auth_svc.UserService.GetFollowersFollowingCounts:input_type -> auth_svc.UserDetailReq - 15, // 23: auth_svc.UserService.SearchUser:input_type -> auth_svc.UserDetailReq - 26, // 24: auth_svc.UserService.BookMarkBlog:input_type -> auth_svc.BookMarkReq - 26, // 25: auth_svc.UserService.GetBookMarks:input_type -> auth_svc.BookMarkReq - 26, // 26: auth_svc.UserService.RemoveBookMark:input_type -> auth_svc.BookMarkReq - 26, // 27: auth_svc.UserService.LikeBlog:input_type -> auth_svc.BookMarkReq - 26, // 28: auth_svc.UserService.UnlikeBlog:input_type -> auth_svc.BookMarkReq - 26, // 29: auth_svc.UserService.GetIfBlogLiked:input_type -> auth_svc.BookMarkReq - 26, // 30: auth_svc.UserService.GetIfBlogBookMarked:input_type -> auth_svc.BookMarkReq - 26, // 31: auth_svc.UserService.GetBookMarkCounts:input_type -> auth_svc.BookMarkReq - 26, // 32: auth_svc.UserService.GetLikeCounts:input_type -> auth_svc.BookMarkReq - 19, // 33: auth_svc.UserService.InviteCoAuthor:input_type -> auth_svc.CoAuthorAccessReq - 19, // 34: auth_svc.UserService.RevokeCoAuthorAccess:input_type -> auth_svc.CoAuthorAccessReq - 21, // 35: auth_svc.UserService.GetBlogsByUserIds:input_type -> auth_svc.BlogsByUserIdsReq - 24, // 36: auth_svc.UserService.CreateNewTopics:input_type -> auth_svc.CreateTopicsReq - 3, // 37: auth_svc.UserService.GetUserActivities:output_type -> auth_svc.UserActivityResp - 1, // 38: auth_svc.UserService.GetUserProfile:output_type -> auth_svc.UserProfileRes - 6, // 39: auth_svc.UserService.UpdateUserProfile:output_type -> auth_svc.UpdateUserProfileRes - 8, // 40: auth_svc.UserService.DeleteUserAccount:output_type -> auth_svc.DeleteUserProfileRes - 11, // 41: auth_svc.UserService.GetAllTopics:output_type -> auth_svc.GetTopicsResponse - 14, // 42: auth_svc.UserService.GetAllCategories:output_type -> auth_svc.GetAllCategoriesRes - 16, // 43: auth_svc.UserService.GetUserDetails:output_type -> auth_svc.UserDetailsResp - 18, // 44: auth_svc.UserService.FollowTopics:output_type -> auth_svc.TopicActionRes - 18, // 45: auth_svc.UserService.UnFollowTopics:output_type -> auth_svc.TopicActionRes - 29, // 46: auth_svc.UserService.FollowUser:output_type -> auth_svc.UserFollowRes - 29, // 47: auth_svc.UserService.UnFollowUser:output_type -> auth_svc.UserFollowRes - 31, // 48: auth_svc.UserService.GetFollowers:output_type -> auth_svc.FollowerFollowingResp - 31, // 49: auth_svc.UserService.GetFollowing:output_type -> auth_svc.FollowerFollowingResp - 29, // 50: auth_svc.UserService.GetIfIFollowedUser:output_type -> auth_svc.UserFollowRes - 33, // 51: auth_svc.UserService.GetFollowersFollowingCounts:output_type -> auth_svc.FollowerFollowingCountsResp - 31, // 52: auth_svc.UserService.SearchUser:output_type -> auth_svc.FollowerFollowingResp - 27, // 53: auth_svc.UserService.BookMarkBlog:output_type -> auth_svc.BookMarkRes - 27, // 54: auth_svc.UserService.GetBookMarks:output_type -> auth_svc.BookMarkRes - 27, // 55: auth_svc.UserService.RemoveBookMark:output_type -> auth_svc.BookMarkRes - 27, // 56: auth_svc.UserService.LikeBlog:output_type -> auth_svc.BookMarkRes - 27, // 57: auth_svc.UserService.UnlikeBlog:output_type -> auth_svc.BookMarkRes - 27, // 58: auth_svc.UserService.GetIfBlogLiked:output_type -> auth_svc.BookMarkRes - 27, // 59: auth_svc.UserService.GetIfBlogBookMarked:output_type -> auth_svc.BookMarkRes - 32, // 60: auth_svc.UserService.GetBookMarkCounts:output_type -> auth_svc.CountResp - 32, // 61: auth_svc.UserService.GetLikeCounts:output_type -> auth_svc.CountResp - 20, // 62: auth_svc.UserService.InviteCoAuthor:output_type -> auth_svc.CoAuthorAccessRes - 20, // 63: auth_svc.UserService.RevokeCoAuthorAccess:output_type -> auth_svc.CoAuthorAccessRes - 23, // 64: auth_svc.UserService.GetBlogsByUserIds:output_type -> auth_svc.BlogsByUserNameRes - 25, // 65: auth_svc.UserService.CreateNewTopics:output_type -> auth_svc.CreateTopicsRes - 37, // [37:66] is the sub-list for method output_type - 8, // [8:37] is the sub-list for method input_type - 8, // [8:8] is the sub-list for extension type_name - 8, // [8:8] is the sub-list for extension extendee - 0, // [0:8] is the sub-list for field type_name + 16, // 7: auth_svc.GetBatchUserDetailsRes.users:type_name -> auth_svc.UserDetailsResp + 12, // 8: auth_svc.GetAllCategoriesRes.CategoryEntry.value:type_name -> auth_svc.Category + 2, // 9: auth_svc.UserService.GetUserActivities:input_type -> auth_svc.UserActivityReq + 0, // 10: auth_svc.UserService.GetUserProfile:input_type -> auth_svc.UserProfileReq + 5, // 11: auth_svc.UserService.UpdateUserProfile:input_type -> auth_svc.UpdateUserProfileReq + 7, // 12: auth_svc.UserService.DeleteUserAccount:input_type -> auth_svc.DeleteUserProfileReq + 9, // 13: auth_svc.UserService.GetAllTopics:input_type -> auth_svc.GetTopicsRequests + 13, // 14: auth_svc.UserService.GetAllCategories:input_type -> auth_svc.GetAllCategoriesReq + 15, // 15: auth_svc.UserService.GetUserDetails:input_type -> auth_svc.UserDetailReq + 17, // 16: auth_svc.UserService.FollowTopics:input_type -> auth_svc.TopicActionReq + 17, // 17: auth_svc.UserService.UnFollowTopics:input_type -> auth_svc.TopicActionReq + 28, // 18: auth_svc.UserService.FollowUser:input_type -> auth_svc.UserFollowReq + 28, // 19: auth_svc.UserService.UnFollowUser:input_type -> auth_svc.UserFollowReq + 15, // 20: auth_svc.UserService.GetFollowers:input_type -> auth_svc.UserDetailReq + 15, // 21: auth_svc.UserService.GetFollowing:input_type -> auth_svc.UserDetailReq + 28, // 22: auth_svc.UserService.GetIfIFollowedUser:input_type -> auth_svc.UserFollowReq + 15, // 23: auth_svc.UserService.GetFollowersFollowingCounts:input_type -> auth_svc.UserDetailReq + 15, // 24: auth_svc.UserService.SearchUser:input_type -> auth_svc.UserDetailReq + 26, // 25: auth_svc.UserService.BookMarkBlog:input_type -> auth_svc.BookMarkReq + 26, // 26: auth_svc.UserService.GetBookMarks:input_type -> auth_svc.BookMarkReq + 26, // 27: auth_svc.UserService.RemoveBookMark:input_type -> auth_svc.BookMarkReq + 26, // 28: auth_svc.UserService.LikeBlog:input_type -> auth_svc.BookMarkReq + 26, // 29: auth_svc.UserService.UnlikeBlog:input_type -> auth_svc.BookMarkReq + 26, // 30: auth_svc.UserService.GetIfBlogLiked:input_type -> auth_svc.BookMarkReq + 26, // 31: auth_svc.UserService.GetIfBlogBookMarked:input_type -> auth_svc.BookMarkReq + 26, // 32: auth_svc.UserService.GetBookMarkCounts:input_type -> auth_svc.BookMarkReq + 26, // 33: auth_svc.UserService.GetLikeCounts:input_type -> auth_svc.BookMarkReq + 19, // 34: auth_svc.UserService.InviteCoAuthor:input_type -> auth_svc.CoAuthorAccessReq + 19, // 35: auth_svc.UserService.RevokeCoAuthorAccess:input_type -> auth_svc.CoAuthorAccessReq + 21, // 36: auth_svc.UserService.GetBlogsByUserIds:input_type -> auth_svc.BlogsByUserIdsReq + 24, // 37: auth_svc.UserService.CreateNewTopics:input_type -> auth_svc.CreateTopicsReq + 34, // 38: auth_svc.UserService.GetBatchUserDetails:input_type -> auth_svc.GetBatchUserDetailsReq + 3, // 39: auth_svc.UserService.GetUserActivities:output_type -> auth_svc.UserActivityResp + 1, // 40: auth_svc.UserService.GetUserProfile:output_type -> auth_svc.UserProfileRes + 6, // 41: auth_svc.UserService.UpdateUserProfile:output_type -> auth_svc.UpdateUserProfileRes + 8, // 42: auth_svc.UserService.DeleteUserAccount:output_type -> auth_svc.DeleteUserProfileRes + 11, // 43: auth_svc.UserService.GetAllTopics:output_type -> auth_svc.GetTopicsResponse + 14, // 44: auth_svc.UserService.GetAllCategories:output_type -> auth_svc.GetAllCategoriesRes + 16, // 45: auth_svc.UserService.GetUserDetails:output_type -> auth_svc.UserDetailsResp + 18, // 46: auth_svc.UserService.FollowTopics:output_type -> auth_svc.TopicActionRes + 18, // 47: auth_svc.UserService.UnFollowTopics:output_type -> auth_svc.TopicActionRes + 29, // 48: auth_svc.UserService.FollowUser:output_type -> auth_svc.UserFollowRes + 29, // 49: auth_svc.UserService.UnFollowUser:output_type -> auth_svc.UserFollowRes + 31, // 50: auth_svc.UserService.GetFollowers:output_type -> auth_svc.FollowerFollowingResp + 31, // 51: auth_svc.UserService.GetFollowing:output_type -> auth_svc.FollowerFollowingResp + 29, // 52: auth_svc.UserService.GetIfIFollowedUser:output_type -> auth_svc.UserFollowRes + 33, // 53: auth_svc.UserService.GetFollowersFollowingCounts:output_type -> auth_svc.FollowerFollowingCountsResp + 31, // 54: auth_svc.UserService.SearchUser:output_type -> auth_svc.FollowerFollowingResp + 27, // 55: auth_svc.UserService.BookMarkBlog:output_type -> auth_svc.BookMarkRes + 27, // 56: auth_svc.UserService.GetBookMarks:output_type -> auth_svc.BookMarkRes + 27, // 57: auth_svc.UserService.RemoveBookMark:output_type -> auth_svc.BookMarkRes + 27, // 58: auth_svc.UserService.LikeBlog:output_type -> auth_svc.BookMarkRes + 27, // 59: auth_svc.UserService.UnlikeBlog:output_type -> auth_svc.BookMarkRes + 27, // 60: auth_svc.UserService.GetIfBlogLiked:output_type -> auth_svc.BookMarkRes + 27, // 61: auth_svc.UserService.GetIfBlogBookMarked:output_type -> auth_svc.BookMarkRes + 32, // 62: auth_svc.UserService.GetBookMarkCounts:output_type -> auth_svc.CountResp + 32, // 63: auth_svc.UserService.GetLikeCounts:output_type -> auth_svc.CountResp + 20, // 64: auth_svc.UserService.InviteCoAuthor:output_type -> auth_svc.CoAuthorAccessRes + 20, // 65: auth_svc.UserService.RevokeCoAuthorAccess:output_type -> auth_svc.CoAuthorAccessRes + 23, // 66: auth_svc.UserService.GetBlogsByUserIds:output_type -> auth_svc.BlogsByUserNameRes + 25, // 67: auth_svc.UserService.CreateNewTopics:output_type -> auth_svc.CreateTopicsRes + 35, // 68: auth_svc.UserService.GetBatchUserDetails:output_type -> auth_svc.GetBatchUserDetailsRes + 39, // [39:69] is the sub-list for method output_type + 9, // [9:39] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name } func init() { file_apis_serviceconn_gateway_user_pb_gw_user_proto_init() } @@ -3643,6 +3756,30 @@ func file_apis_serviceconn_gateway_user_pb_gw_user_proto_init() { return nil } } + file_apis_serviceconn_gateway_user_pb_gw_user_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBatchUserDetailsReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_apis_serviceconn_gateway_user_pb_gw_user_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBatchUserDetailsRes); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -3650,7 +3787,7 @@ func file_apis_serviceconn_gateway_user_pb_gw_user_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_apis_serviceconn_gateway_user_pb_gw_user_proto_rawDesc, NumEnums: 0, - NumMessages: 35, + NumMessages: 37, NumExtensions: 0, NumServices: 1, }, diff --git a/apis/serviceconn/gateway_user/pb/gw_user.proto b/apis/serviceconn/gateway_user/pb/gw_user.proto index cc059c66..25bbc64b 100644 --- a/apis/serviceconn/gateway_user/pb/gw_user.proto +++ b/apis/serviceconn/gateway_user/pb/gw_user.proto @@ -313,5 +313,14 @@ service UserService { rpc RevokeCoAuthorAccess(CoAuthorAccessReq) returns (CoAuthorAccessRes) {} rpc GetBlogsByUserIds(BlogsByUserIdsReq) returns (BlogsByUserNameRes) {} rpc CreateNewTopics(CreateTopicsReq) returns (CreateTopicsRes) {} + rpc GetBatchUserDetails(GetBatchUserDetailsReq) returns (GetBatchUserDetailsRes) {} +} + +message GetBatchUserDetailsReq { + repeated string account_ids = 1; +} + +message GetBatchUserDetailsRes { + repeated UserDetailsResp users = 1; } diff --git a/apis/serviceconn/gateway_user/pb/gw_user_grpc.pb.go b/apis/serviceconn/gateway_user/pb/gw_user_grpc.pb.go index 145f9b2e..3c348244 100644 --- a/apis/serviceconn/gateway_user/pb/gw_user_grpc.pb.go +++ b/apis/serviceconn/gateway_user/pb/gw_user_grpc.pb.go @@ -48,6 +48,7 @@ const ( UserService_RevokeCoAuthorAccess_FullMethodName = "/auth_svc.UserService/RevokeCoAuthorAccess" UserService_GetBlogsByUserIds_FullMethodName = "/auth_svc.UserService/GetBlogsByUserIds" UserService_CreateNewTopics_FullMethodName = "/auth_svc.UserService/CreateNewTopics" + UserService_GetBatchUserDetails_FullMethodName = "/auth_svc.UserService/GetBatchUserDetails" ) // UserServiceClient is the client API for UserService service. @@ -89,6 +90,7 @@ type UserServiceClient interface { RevokeCoAuthorAccess(ctx context.Context, in *CoAuthorAccessReq, opts ...grpc.CallOption) (*CoAuthorAccessRes, error) GetBlogsByUserIds(ctx context.Context, in *BlogsByUserIdsReq, opts ...grpc.CallOption) (*BlogsByUserNameRes, error) CreateNewTopics(ctx context.Context, in *CreateTopicsReq, opts ...grpc.CallOption) (*CreateTopicsRes, error) + GetBatchUserDetails(ctx context.Context, in *GetBatchUserDetailsReq, opts ...grpc.CallOption) (*GetBatchUserDetailsRes, error) } type userServiceClient struct { @@ -392,6 +394,16 @@ func (c *userServiceClient) CreateNewTopics(ctx context.Context, in *CreateTopic return out, nil } +func (c *userServiceClient) GetBatchUserDetails(ctx context.Context, in *GetBatchUserDetailsReq, opts ...grpc.CallOption) (*GetBatchUserDetailsRes, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetBatchUserDetailsRes) + err := c.cc.Invoke(ctx, UserService_GetBatchUserDetails_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // UserServiceServer is the server API for UserService service. // All implementations must embed UnimplementedUserServiceServer // for forward compatibility. @@ -431,6 +443,7 @@ type UserServiceServer interface { RevokeCoAuthorAccess(context.Context, *CoAuthorAccessReq) (*CoAuthorAccessRes, error) GetBlogsByUserIds(context.Context, *BlogsByUserIdsReq) (*BlogsByUserNameRes, error) CreateNewTopics(context.Context, *CreateTopicsReq) (*CreateTopicsRes, error) + GetBatchUserDetails(context.Context, *GetBatchUserDetailsReq) (*GetBatchUserDetailsRes, error) mustEmbedUnimplementedUserServiceServer() } @@ -528,6 +541,9 @@ func (UnimplementedUserServiceServer) GetBlogsByUserIds(context.Context, *BlogsB func (UnimplementedUserServiceServer) CreateNewTopics(context.Context, *CreateTopicsReq) (*CreateTopicsRes, error) { return nil, status.Error(codes.Unimplemented, "method CreateNewTopics not implemented") } +func (UnimplementedUserServiceServer) GetBatchUserDetails(context.Context, *GetBatchUserDetailsReq) (*GetBatchUserDetailsRes, error) { + return nil, status.Error(codes.Unimplemented, "method GetBatchUserDetails not implemented") +} func (UnimplementedUserServiceServer) mustEmbedUnimplementedUserServiceServer() {} func (UnimplementedUserServiceServer) testEmbeddedByValue() {} @@ -1060,6 +1076,24 @@ func _UserService_CreateNewTopics_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _UserService_GetBatchUserDetails_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetBatchUserDetailsReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).GetBatchUserDetails(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserService_GetBatchUserDetails_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).GetBatchUserDetails(ctx, req.(*GetBatchUserDetailsReq)) + } + return interceptor(ctx, in, info, handler) +} + // UserService_ServiceDesc is the grpc.ServiceDesc for UserService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -1179,6 +1213,10 @@ var UserService_ServiceDesc = grpc.ServiceDesc{ MethodName: "CreateNewTopics", Handler: _UserService_CreateNewTopics_Handler, }, + { + MethodName: "GetBatchUserDetails", + Handler: _UserService_GetBatchUserDetails_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/documents/reindex/mapping.json b/documents/reindex/mapping.json new file mode 100644 index 00000000..bbb325e0 Binary files /dev/null and b/documents/reindex/mapping.json differ diff --git a/documents/reindex/mapping_utf8.json b/documents/reindex/mapping_utf8.json new file mode 100644 index 00000000..d5bc6c9b --- /dev/null +++ b/documents/reindex/mapping_utf8.json @@ -0,0 +1,350 @@ +{ + "the_monkeys_blogs" : { + "mappings" : { + "properties" : { + "Action" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "Client" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "Ip" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "Tags" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "action" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "author_list" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "blog" : { + "properties" : { + "blocks" : { + "properties" : { + "author" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "data" : { + "properties" : { + "alignment" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "caption" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "code" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "config" : { + "properties" : { + "placeholder" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + } + } + }, + "content" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "file" : { + "properties" : { + "url" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + } + } + }, + "items" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "language" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "level" : { + "type" : "long" + }, + "service" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "stretched" : { + "type" : "boolean" + }, + "style" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "table_content" : { + "properties" : { + "cells" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + } + } + }, + "text" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "url" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "withBackground" : { + "type" : "boolean" + }, + "withBorder" : { + "type" : "boolean" + }, + "withHeadings" : { + "type" : "boolean" + } + } + }, + "id" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "time" : { + "type" : "long" + }, + "type" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + } + } + }, + "time" : { + "type" : "long" + } + } + }, + "blog_id" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "client" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "content_type" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "ip" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "is_draft" : { + "type" : "boolean" + }, + "owner_account_id" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "platform" : { + "type" : "long" + }, + "published_time" : { + "type" : "date" + }, + "referrer" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "session_id" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "slug" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "tags" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "user_agent" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + } + } + } + } +} diff --git a/documents/reindex/mapping_v2.json b/documents/reindex/mapping_v2.json new file mode 100644 index 00000000..72467951 --- /dev/null +++ b/documents/reindex/mapping_v2.json @@ -0,0 +1,342 @@ +{ + "mappings": { + "properties": { + "Action": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "Client": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "Ip": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "Tags": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "action": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "author_list": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "blog": { + "properties": { + "blocks": { + "properties": { + "author": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "data": { + "properties": { + "alignment": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "caption": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "code": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "config": { + "properties": { + "placeholder": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + } + } + }, + "content": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "file": { + "properties": { + "url": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + } + } + }, + "items": { + "type": "object" + }, + "language": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "level": { + "type": "long" + }, + "service": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "stretched": { + "type": "boolean" + }, + "style": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "table_content": { + "properties": { + "cells": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + } + } + }, + "text": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "url": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "withBackground": { + "type": "boolean" + }, + "withBorder": { + "type": "boolean" + }, + "withHeadings": { + "type": "boolean" + } + } + }, + "id": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "time": { + "type": "long" + }, + "type": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + } + } + }, + "time": { + "type": "long" + } + } + }, + "blog_id": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "client": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "content_type": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "ip": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "is_draft": { + "type": "boolean" + }, + "owner_account_id": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "platform": { + "type": "long" + }, + "published_time": { + "type": "date" + }, + "referrer": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "session_id": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "slug": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "tags": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "user_agent": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + } + } + } +} \ No newline at end of file diff --git a/documents/reindex/migrate_db.ps1 b/documents/reindex/migrate_db.ps1 new file mode 100644 index 00000000..6863ff5d --- /dev/null +++ b/documents/reindex/migrate_db.ps1 @@ -0,0 +1,70 @@ +# migrate_db.ps1 +# Migrates the_monkeys_blogs to v2 mapping to support nested lists + +Write-Host "Starting Blog Migration to V2..." -ForegroundColor Cyan + +# 1. Create V2 Index +Write-Host "Creating the_monkeys_blogs_v2 index..." +try { + # Check if exists first causing error? No, PUT creates or updates. But better delete if exists to be clean or ignore error. + Invoke-RestMethod -Uri "http://localhost:9200/the_monkeys_blogs_v2" -Method Delete -ErrorAction SilentlyContinue + + $mapping = Get-Content -Path "$PSScriptRoot\mapping_v2.json" -Raw + Invoke-RestMethod -Uri "http://localhost:9200/the_monkeys_blogs_v2" -Method Put -Body $mapping -ContentType "application/json" +} catch { + Write-Host "Error creating v2 index: $($_.Exception.Message)" -ForegroundColor Red + exit 1 +} + +# 2. Reindex +Write-Host "Reindexing data..." +try { + $reindex = Get-Content -Path "$PSScriptRoot\reindex.json" -Raw + $res = Invoke-RestMethod -Uri "http://localhost:9200/_reindex?wait_for_completion=true" -Method Post -Body $reindex -ContentType "application/json" + if ($res.failures.Count -gt 0) { + Write-Host "Reindex reported failures!" -ForegroundColor Red + Write-Host ($res.failures | ConvertTo-Json -Depth 5) + # Continue? Maybe not. + } else { + Write-Host "Reindex successful." -ForegroundColor Green + } +} catch { + Write-Host "Error reindexing: $($_.Exception.Message)" -ForegroundColor Red + exit 1 +} + +# 3. Swap Alias +Write-Host "Swapping Alias..." +try { + # Delete old concrete index if it exists (which it does after snapshot restore) + # Check if 'the_monkeys_blogs' is an index or alias + $isAlias = $false + try { + $aliases = Invoke-RestMethod -Uri "http://localhost:9200/_alias/the_monkeys_blogs" -Method Get -ErrorAction Stop + if ($aliases.Keys -contains "the_monkeys_blogs_v2") { $isAlias = $true } + } catch { + # 404 means neither index nor alias, or just index without alias? + # _alias/name returns { "indexname": { "aliases": { "name": {} } } } + } + + if (-not $isAlias) { + Write-Host "Deleting old concrete index 'the_monkeys_blogs'..." + Invoke-RestMethod -Uri "http://localhost:9200/the_monkeys_blogs" -Method Delete + } + + # Create Alias + Write-Host "Creating alias 'the_monkeys_blogs' -> 'the_monkeys_blogs_v2'..." + $aliasBody = @{ + actions = @( + @{ add = @{ index = "the_monkeys_blogs_v2"; alias = "the_monkeys_blogs" } } + ) + } | ConvertTo-Json -Depth 5 + + Invoke-RestMethod -Uri "http://localhost:9200/_aliases" -Method Post -Body $aliasBody -ContentType "application/json" + +} catch { + Write-Host "Error swapping alias: $($_.Exception.Message)" -ForegroundColor Red + exit 1 +} + +Write-Host "Migration Complete!" -ForegroundColor Green diff --git a/documents/reindex/reindex.json b/documents/reindex/reindex.json new file mode 100644 index 00000000..1ec670f8 --- /dev/null +++ b/documents/reindex/reindex.json @@ -0,0 +1,11 @@ +{ + "source": { + "index": "the_monkeys_blogs" + }, + "dest": { + "index": "the_monkeys_blogs_v2" + }, + "script": { + "source": "if (ctx._source.blog != null && ctx._source.blog.blocks != null) { for (def block : ctx._source.blog.blocks) { if (block.type == 'list' && block.data != null && block.data.items != null) { if (block.data.items instanceof List) { def oldItems = block.data.items; boolean needsConversion = false; if (oldItems.size() > 0 && oldItems[0] instanceof String) { needsConversion = true; } if (needsConversion) { def newItems = []; for (def str : oldItems) { def newItem = ['content': str, 'items': []]; newItems.add(newItem); } block.data.items = newItems; } } } } }" + } +} \ No newline at end of file diff --git a/microservices/the_monkeys_activity/internal/database/elasticsearch.go b/microservices/the_monkeys_activity/internal/database/elasticsearch.go index b5d306c4..90b198da 100644 --- a/microservices/the_monkeys_activity/internal/database/elasticsearch.go +++ b/microservices/the_monkeys_activity/internal/database/elasticsearch.go @@ -24,6 +24,10 @@ type ActivityDatabase interface { GetUserActivities(ctx context.Context, req *pb.GetUserActivitiesRequest) ([]*pb.ActivityEvent, int64, error) SaveSecurityEvent(ctx context.Context, req *pb.TrackSecurityEventRequest) (string, error) GetBlogAnalytics(ctx context.Context, blogID string) (*BlogAnalytics, error) + GetTrendingBlogs(ctx context.Context, req *pb.GetTrendingBlogsRequest) ([]*pb.TrendingBlog, error) + GetActiveUsers(ctx context.Context, req *pb.GetActiveUsersRequest) (int64, []*pb.ActiveUser, error) + GetAccountActivities(ctx context.Context, req *pb.GetAccountActivitiesRequest) ([]*pb.ActivityEvent, int64, error) + GetAdvancedAnalytics(ctx context.Context, req *pb.GetAdvancedAnalyticsRequest) (*pb.AdvancedAnalytics, error) Health(ctx context.Context) error StartIPResolver(ctx context.Context) UpdateIPLocation(ctx context.Context, ip string, location *IPGeoLocation) error @@ -1808,3 +1812,419 @@ func (db *ActivityDB) UpdateIPLocation(ctx context.Context, ip string, location return nil } + +// GetTrendingBlogs calculates trending blogs based on views and likes +func (db *ActivityDB) GetTrendingBlogs(ctx context.Context, req *pb.GetTrendingBlogsRequest) ([]*pb.TrendingBlog, error) { + timeRange := req.GetTimeRange() + if timeRange == "" { + timeRange = "24h" + } + + query := map[string]interface{}{ + "query": map[string]interface{}{ + "bool": map[string]interface{}{ + "must": []map[string]interface{}{ + {"term": map[string]interface{}{"action.keyword": "read_blog"}}, + {"range": map[string]interface{}{"@timestamp": map[string]interface{}{"gte": "now-" + timeRange}}}, + }, + "must_not": []map[string]interface{}{ + {"term": map[string]interface{}{"client_info.is_bot": true}}, + }, + }, + }, + "aggs": map[string]interface{}{ + "trending": map[string]interface{}{ + "terms": map[string]interface{}{ + "field": "resource_id.keyword", + "size": req.GetLimit(), + }, + "aggs": map[string]interface{}{ + "likes": map[string]interface{}{ + "filter": map[string]interface{}{ + "term": map[string]interface{}{"action.keyword": "blog_like"}, + }, + }, + }, + }, + }, + "size": 0, + } + + if req.GetAccountId() != "" { + must := query["query"].(map[string]interface{})["bool"].(map[string]interface{})["must"].([]map[string]interface{}) + must = append(must, map[string]interface{}{"term": map[string]interface{}{"account_id": req.GetAccountId()}}) + query["query"].(map[string]interface{})["bool"].(map[string]interface{})["must"] = must + } + + res, err := db.performSearch(ctx, ActivityEventIndex+"*", query) + if err != nil { + return nil, err + } + + var searchRes struct { + Aggregations struct { + Trending struct { + Buckets []struct { + Key string `json:"key"` + DocCount int64 `json:"doc_count"` + Likes struct { + DocCount int64 `json:"doc_count"` + } `json:"likes"` + } `json:"buckets"` + } `json:"trending"` + } `json:"aggregations"` + } + + if err := json.NewDecoder(res.Body).Decode(&searchRes); err != nil { + return nil, err + } + + trending := make([]*pb.TrendingBlog, 0) + for _, b := range searchRes.Aggregations.Trending.Buckets { + // Simple scoring: views + (likes * 5) + score := float64(b.DocCount) + float64(b.Likes.DocCount*5) + trending = append(trending, &pb.TrendingBlog{ + BlogId: b.Key, + Views: b.DocCount, + Likes: b.Likes.DocCount, + Score: score, + }) + } + + return trending, nil +} + +// GetActiveUsers returns the number of unique active users and their details +func (db *ActivityDB) GetActiveUsers(ctx context.Context, req *pb.GetActiveUsersRequest) (int64, []*pb.ActiveUser, error) { + timeRange := req.GetTimeRange() + if timeRange == "" { + timeRange = "3h" + } + + query := map[string]interface{}{ + "query": map[string]interface{}{ + "bool": map[string]interface{}{ + "must": []map[string]interface{}{ + {"range": map[string]interface{}{"@timestamp": map[string]interface{}{"gte": "now-" + timeRange}}}, + {"exists": map[string]interface{}{"field": "user_id"}}, // Ensure user_id exists + }, + "must_not": []map[string]interface{}{ + {"term": map[string]interface{}{"client_info.is_bot": true}}, + {"term": map[string]interface{}{"user_id.keyword": ""}}, // Exclude empty user_ids + }, + }, + }, + "aggs": map[string]interface{}{ + "active_users_count": map[string]interface{}{ + "cardinality": map[string]interface{}{ + "field": "user_id.keyword", + }, + }, + "active_users_list": map[string]interface{}{ + "terms": map[string]interface{}{ + "field": "user_id.keyword", + "size": 100, // Limit to top 100 active users for now + }, + "aggs": map[string]interface{}{ + "last_active": map[string]interface{}{ + "max": map[string]interface{}{ + "field": "@timestamp", + }, + }, + }, + }, + }, + "size": 0, + } + + if req.GetAccountId() != "" { + must := query["query"].(map[string]interface{})["bool"].(map[string]interface{})["must"].([]map[string]interface{}) + must = append(must, map[string]interface{}{"term": map[string]interface{}{"account_id": req.GetAccountId()}}) + query["query"].(map[string]interface{})["bool"].(map[string]interface{})["must"] = must + } + + res, err := db.performSearch(ctx, ActivityEventIndex+"*", query) + if err != nil { + return 0, nil, err + } + + var searchRes struct { + Aggregations struct { + ActiveUsersCount struct { + Value int64 `json:"value"` + } `json:"active_users_count"` + ActiveUsersList struct { + Buckets []struct { + Key string `json:"key"` + LastActive struct { + ValueAsString string `json:"value_as_string"` + Value float64 `json:"value"` + } `json:"last_active"` + } `json:"buckets"` + } `json:"active_users_list"` + } `json:"aggregations"` + } + + if err := json.NewDecoder(res.Body).Decode(&searchRes); err != nil { + return 0, nil, err + } + + var activeUsersList []*pb.ActiveUser + for _, bucket := range searchRes.Aggregations.ActiveUsersList.Buckets { + // Use Value (epoch millis) instead of parsing string to avoid format issues + // and handle potential scientific notation in JSON numbers + sec := int64(bucket.LastActive.Value) / 1000 + nsec := int64(bucket.LastActive.Value) % 1000 * 1000000 + lastActiveTime := time.Unix(sec, nsec) + + activeUsersList = append(activeUsersList, &pb.ActiveUser{ + UserId: bucket.Key, + LastActive: timestamppb.New(lastActiveTime), + }) + } + + return searchRes.Aggregations.ActiveUsersCount.Value, activeUsersList, nil +} + +// GetAccountActivities retrieves activities filtered by account_id +func (db *ActivityDB) GetAccountActivities(ctx context.Context, req *pb.GetAccountActivitiesRequest) ([]*pb.ActivityEvent, int64, error) { + query := map[string]interface{}{ + "query": map[string]interface{}{ + "bool": map[string]interface{}{ + "must": []map[string]interface{}{ + {"term": map[string]interface{}{"account_id": req.GetAccountId()}}, + }, + }, + }, + "sort": []map[string]interface{}{ + {"@timestamp": map[string]interface{}{"order": "desc"}}, + }, + "size": req.GetLimit(), + "from": req.GetOffset(), + } + + if req.GetAction() != "" { + must := query["query"].(map[string]interface{})["bool"].(map[string]interface{})["must"].([]map[string]interface{}) + must = append(must, map[string]interface{}{"term": map[string]interface{}{"action.keyword": req.GetAction()}}) + query["query"].(map[string]interface{})["bool"].(map[string]interface{})["must"] = must + } + + if req.GetCategory() != pb.ActivityCategory_CATEGORY_UNSPECIFIED { + must := query["query"].(map[string]interface{})["bool"].(map[string]interface{})["must"].([]map[string]interface{}) + must = append(must, map[string]interface{}{"term": map[string]interface{}{"category": req.GetCategory().String()}}) + query["query"].(map[string]interface{})["bool"].(map[string]interface{})["must"] = must + } + + // Add time range + if req.GetStartTime() != nil || req.GetEndTime() != nil { + rangeFilter := map[string]interface{}{"range": map[string]interface{}{"@timestamp": map[string]interface{}{}}} + if req.GetStartTime() != nil { + rangeFilter["range"].(map[string]interface{})["@timestamp"].(map[string]interface{})["gte"] = req.GetStartTime().AsTime().Format(time.RFC3339) + } + if req.GetEndTime() != nil { + rangeFilter["range"].(map[string]interface{})["@timestamp"].(map[string]interface{})["lte"] = req.GetEndTime().AsTime().Format(time.RFC3339) + } + must := query["query"].(map[string]interface{})["bool"].(map[string]interface{})["must"].([]map[string]interface{}) + must = append(must, rangeFilter) + query["query"].(map[string]interface{})["bool"].(map[string]interface{})["must"] = must + } + + res, err := db.performSearch(ctx, ActivityEventIndex+"*", query) + if err != nil { + return nil, 0, err + } + + // Reusing the same parsing logic as GetUserActivities + return db.parseActivityEvents(res) +} + +// GetAdvancedAnalytics performs complex aggregations for the 5-point suite +func (db *ActivityDB) GetAdvancedAnalytics(ctx context.Context, req *pb.GetAdvancedAnalyticsRequest) (*pb.AdvancedAnalytics, error) { + timeRange := req.GetTimeRange() + if timeRange == "" { + timeRange = "7d" + } + + query := map[string]interface{}{ + "query": map[string]interface{}{ + "bool": map[string]interface{}{ + "must": []map[string]interface{}{ + {"range": map[string]interface{}{"@timestamp": map[string]interface{}{"gte": "now-" + timeRange}}}, + }, + "must_not": []map[string]interface{}{ + {"term": map[string]interface{}{"client_info.is_bot": true}}, + }, + }, + }, + "aggs": map[string]interface{}{ + "geo_hotspots": map[string]interface{}{ + "terms": map[string]interface{}{"field": "client_info.country.keyword", "size": 10}, + }, + "platforms": map[string]interface{}{ + "terms": map[string]interface{}{"field": "client_info.platform.keyword"}, + }, + "peak_times": map[string]interface{}{ + "date_histogram": map[string]interface{}{ + "field": "@timestamp", + "calendar_interval": "hour", + }, + }, + "retention": map[string]interface{}{ + "filters": map[string]interface{}{ + "filters": map[string]interface{}{ + "new_users": map[string]interface{}{"term": map[string]interface{}{"action.keyword": "register"}}, + "returning_users": map[string]interface{}{"term": map[string]interface{}{"action.keyword": "login"}}, + }, + }, + "aggs": map[string]interface{}{ + "unique_count": map[string]interface{}{ + "cardinality": map[string]interface{}{"field": "client_info.visitor_id.keyword"}, + }, + }, + }, + }, + "size": 0, + } + + if req.GetAccountId() != "" { + must := query["query"].(map[string]interface{})["bool"].(map[string]interface{})["must"].([]map[string]interface{}) + must = append(must, map[string]interface{}{"term": map[string]interface{}{"account_id": req.GetAccountId()}}) + query["query"].(map[string]interface{})["bool"].(map[string]interface{})["must"] = must + } + + res, err := db.performSearch(ctx, ActivityEventIndex+"*", query) + if err != nil { + return nil, err + } + + var searchRes struct { + Aggregations struct { + GeoHotspots struct { + Buckets []struct { + Key string `json:"key"` + DocCount int64 `json:"doc_count"` + } `json:"buckets"` + } `json:"geo_hotspots"` + Platforms struct { + Buckets []struct { + Key string `json:"key"` + DocCount int64 `json:"doc_count"` + } `json:"buckets"` + } `json:"platforms"` + PeakTimes struct { + Buckets []struct { + Key string `json:"key_as_string"` + DocCount int64 `json:"doc_count"` + } `json:"buckets"` + } `json:"peak_times"` + Retention struct { + Buckets map[string]struct { + UniqueCount struct { + Value int64 `json:"value"` + } `json:"unique_count"` + } `json:"buckets"` + } `json:"retention"` + } `json:"aggregations"` + } + + if err := json.NewDecoder(res.Body).Decode(&searchRes); err != nil { + return nil, err + } + + analytics := &pb.AdvancedAnalytics{ + GeographicHotspots: make(map[string]int64), + PlatformBias: make(map[string]int64), + PeakReadingTimes: make(map[string]int64), + } + + for _, b := range searchRes.Aggregations.GeoHotspots.Buckets { + analytics.GeographicHotspots[b.Key] = b.DocCount + } + for _, b := range searchRes.Aggregations.Platforms.Buckets { + analytics.PlatformBias[b.Key] = b.DocCount + } + for _, b := range searchRes.Aggregations.PeakTimes.Buckets { + analytics.PeakReadingTimes[b.Key] = b.DocCount + } + + newUsers := searchRes.Aggregations.Retention.Buckets["new_users"].UniqueCount.Value + returningUsers := searchRes.Aggregations.Retention.Buckets["returning_users"].UniqueCount.Value + analytics.NewUsers = newUsers + analytics.ReturningUsers = returningUsers + if (newUsers + returningUsers) > 0 { + analytics.RetentionRate = float64(returningUsers) / float64(newUsers+returningUsers) + } + + return analytics, nil +} + +// performSearch is a helper to run ES queries +func (db *ActivityDB) performSearch(ctx context.Context, index string, query map[string]interface{}) (*esapi.Response, error) { + queryBytes, _ := json.Marshal(query) + searchReq := esapi.SearchRequest{ + Index: []string{index}, + Body: bytes.NewReader(queryBytes), + } + res, err := searchReq.Do(ctx, db.client) + if err != nil { + return nil, err + } + if res.IsError() { + return nil, fmt.Errorf("search error: %s", res.String()) + } + return res, nil +} + +// parseActivityEvents is a helper to parse search hits into pb.ActivityEvent +func (db *ActivityDB) parseActivityEvents(res *esapi.Response) ([]*pb.ActivityEvent, int64, error) { + var searchResponse struct { + Hits struct { + Total struct { + Value int64 `json:"total"` + } `json:"total"` + Hits []struct { + Source interface{} `json:"_source"` + } `json:"hits"` + } `json:"hits"` + } + + if err := json.NewDecoder(res.Body).Decode(&searchResponse); err != nil { + return nil, 0, err + } + + activities := make([]*pb.ActivityEvent, 0, len(searchResponse.Hits.Hits)) + for _, hit := range searchResponse.Hits.Hits { + doc := hit.Source.(map[string]interface{}) + + // Map ES fields back to pb.ActivityEvent + event := &pb.ActivityEvent{ + Id: fmt.Sprintf("%v", doc["id"]), + UserId: fmt.Sprintf("%v", doc["user_id"]), + AccountId: fmt.Sprintf("%v", doc["account_id"]), + SessionId: fmt.Sprintf("%v", doc["session_id"]), + Action: fmt.Sprintf("%v", doc["action"]), + Resource: fmt.Sprintf("%v", doc["resource"]), + ResourceId: fmt.Sprintf("%v", doc["resource_id"]), + Success: doc["success"].(bool), + DurationMs: int64(doc["duration_ms"].(float64)), + } + + // Handle @timestamp + if ts, ok := doc["@timestamp"].(string); ok { + if t, err := time.Parse(time.RFC3339, ts); err == nil { + event.Timestamp = timestamppb.New(t) + } + } + + // Handle Category + if cat, ok := doc["category"].(string); ok { + if val, exists := pb.ActivityCategory_value[cat]; exists { + event.Category = pb.ActivityCategory(val) + } + } + + activities = append(activities, event) + } + + return activities, searchResponse.Hits.Total.Value, nil +} diff --git a/microservices/the_monkeys_activity/internal/services/activity_methods.go b/microservices/the_monkeys_activity/internal/services/activity_methods.go index eda513fd..9bdad95d 100644 --- a/microservices/the_monkeys_activity/internal/services/activity_methods.go +++ b/microservices/the_monkeys_activity/internal/services/activity_methods.go @@ -326,3 +326,99 @@ func (s *ActivityServiceServer) TrackPerformanceEvent(ctx context.Context, req * func (s *ActivityServiceServer) GetPerformanceAnalytics(ctx context.Context, req *pb.GetPerformanceAnalyticsRequest) (*pb.GetPerformanceAnalyticsResponse, error) { return &pb.GetPerformanceAnalyticsResponse{StatusCode: 200, Events: []*pb.PerformanceEvent{}, TotalCount: 0}, nil } +func (s *ActivityServiceServer) GetTrendingBlogs(ctx context.Context, req *pb.GetTrendingBlogsRequest) (*pb.GetTrendingBlogsResponse, error) { + // If it's a global request and we have a cache, use it + if req.GetAccountId() == "" && req.GetTimeRange() == "24h" { + s.cacheMutex.RLock() + cached := s.trendingCache + s.cacheMutex.RUnlock() + if cached != nil { + return &pb.GetTrendingBlogsResponse{StatusCode: 200, Blogs: cached}, nil + } + } + + // Otherwise, query the DB + trending, err := s.db.GetTrendingBlogs(ctx, req) + if err != nil { + s.logger.Errorw("failed to get trending blogs", "error", err) + return &pb.GetTrendingBlogsResponse{ + StatusCode: 500, + Error: &pb.Error{Status: 500, Error: "database_error", Message: err.Error()}, + }, nil + } + + return &pb.GetTrendingBlogsResponse{StatusCode: 200, Blogs: trending}, nil +} + +func (s *ActivityServiceServer) GetActiveUsers(ctx context.Context, req *pb.GetActiveUsersRequest) (*pb.GetActiveUsersResponse, error) { + // If it's a global request and we have a cache, use it + // Cache logic disabled to support listing active users + // if req.GetAccountId() == "" && req.GetTimeRange() == "3h" { + // s.cacheMutex.RLock() + // count := s.activeUsersCache + // s.cacheMutex.RUnlock() + // return &pb.GetActiveUsersResponse{StatusCode: 200, ActiveUsers: count}, nil + // } + + count, userList, err := s.db.GetActiveUsers(ctx, req) + if err != nil { + s.logger.Errorw("failed to get active users", "error", err) + return &pb.GetActiveUsersResponse{ + StatusCode: 500, + Error: &pb.Error{Status: 500, Error: "database_error", Message: err.Error()}, + }, nil + } + s.logger.Infow("GetActiveUsers DB Result", "count", count, "userListSize", len(userList)) + if len(userList) > 0 { + s.logger.Infow("First user in list", "user_id", userList[0].UserId, "last_active", userList[0].LastActive) + } + + return &pb.GetActiveUsersResponse{StatusCode: 200, ActiveUsers: count, UserList: userList}, nil +} + +func (s *ActivityServiceServer) GetAccountActivities(ctx context.Context, req *pb.GetAccountActivitiesRequest) (*pb.GetAccountActivitiesResponse, error) { + if req.GetAccountId() == "" { + return &pb.GetAccountActivitiesResponse{ + StatusCode: 400, + Error: &pb.Error{Status: 400, Error: "validation_error", Message: "account_id is required"}, + }, nil + } + + activities, total, err := s.db.GetAccountActivities(ctx, req) + if err != nil { + s.logger.Errorw("failed to get account activities", "error", err) + return &pb.GetAccountActivitiesResponse{ + StatusCode: 500, + Error: &pb.Error{Status: 500, Error: "database_error", Message: err.Error()}, + }, nil + } + + return &pb.GetAccountActivitiesResponse{ + StatusCode: 200, + Activities: activities, + TotalCount: total, + }, nil +} + +func (s *ActivityServiceServer) GetAdvancedAnalytics(ctx context.Context, req *pb.GetAdvancedAnalyticsRequest) (*pb.GetAdvancedAnalyticsResponse, error) { + // If it's a global request and we have a cache, use it + if req.GetAccountId() == "" && req.GetTimeRange() == "7d" { + s.cacheMutex.RLock() + cached := s.advancedCache + s.cacheMutex.RUnlock() + if cached != nil { + return &pb.GetAdvancedAnalyticsResponse{StatusCode: 200, Analytics: cached}, nil + } + } + + analytics, err := s.db.GetAdvancedAnalytics(ctx, req) + if err != nil { + s.logger.Errorw("failed to get advanced analytics", "error", err) + return &pb.GetAdvancedAnalyticsResponse{ + StatusCode: 500, + Error: &pb.Error{Status: 500, Error: "database_error", Message: err.Error()}, + }, nil + } + + return &pb.GetAdvancedAnalyticsResponse{StatusCode: 200, Analytics: analytics}, nil +} diff --git a/microservices/the_monkeys_activity/internal/services/activity_service.go b/microservices/the_monkeys_activity/internal/services/activity_service.go index 89ebe1fd..168cc4f4 100644 --- a/microservices/the_monkeys_activity/internal/services/activity_service.go +++ b/microservices/the_monkeys_activity/internal/services/activity_service.go @@ -3,6 +3,9 @@ package services import ( "context" + "sync" + "time" + "github.com/the-monkeys/the_monkeys/apis/serviceconn/gateway_activity/pb" "github.com/the-monkeys/the_monkeys/config" "github.com/the-monkeys/the_monkeys/microservices/the_monkeys_activity/internal/database" @@ -16,15 +19,70 @@ type ActivityServiceServer struct { config *config.Config logger *zap.SugaredLogger db *database.ActivityDB + + // Cache for periodic analytics + trendingCache []*pb.TrendingBlog + activeUsersCache int64 + advancedCache *pb.AdvancedAnalytics + cacheMutex sync.RWMutex + lastRefresh time.Time } // NewActivityServiceServer creates a new ActivityServiceServer func NewActivityServiceServer(cfg *config.Config, logger *zap.SugaredLogger, db *database.ActivityDB) *ActivityServiceServer { - return &ActivityServiceServer{ + s := &ActivityServiceServer{ config: cfg, logger: logger, db: db, } + go s.startPeriodicAnalyticsRefresher() + return s +} + +func (s *ActivityServiceServer) startPeriodicAnalyticsRefresher() { + ticker := time.NewTicker(3 * time.Hour) + defer ticker.Stop() + + // Initial refresh + s.refreshAnalytics() + + for range ticker.C { + s.refreshAnalytics() + } +} + +func (s *ActivityServiceServer) refreshAnalytics() { + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) + defer cancel() + + s.logger.Info("Refreshing periodic analytics cache...") + + // 1. Trending Blogs (last 24h) + trending, err := s.db.GetTrendingBlogs(ctx, &pb.GetTrendingBlogsRequest{TimeRange: "24h", Limit: 10}) + if err != nil { + s.logger.Errorw("failed to refresh trending blogs", "error", err) + } + + // 2. Active Users (last 3h) + activeUsers, _, err := s.db.GetActiveUsers(ctx, &pb.GetActiveUsersRequest{TimeRange: "3h"}) + if err != nil { + s.logger.Errorw("failed to refresh active users", "error", err) + } + + // 3. Advanced Analytics (last 7d) + advanced, err := s.db.GetAdvancedAnalytics(ctx, &pb.GetAdvancedAnalyticsRequest{TimeRange: "7d"}) + if err != nil { + s.logger.Errorw("failed to refresh advanced analytics", "error", err) + } + + s.cacheMutex.Lock() + s.trendingCache = trending + s.activeUsersCache = activeUsers + s.advancedCache = advanced + s.lastRefresh = time.Now() + s.cacheMutex.Unlock() + + s.logger.Info("Periodic analytics cache refreshed successfully") } // TrackActivity records a user activity event diff --git a/microservices/the_monkeys_gateway/internal/blog/routes.go b/microservices/the_monkeys_gateway/internal/blog/routes.go index 1d7fbc62..5fde8d2c 100644 --- a/microservices/the_monkeys_gateway/internal/blog/routes.go +++ b/microservices/the_monkeys_gateway/internal/blog/routes.go @@ -179,6 +179,11 @@ func RegisterBlogRouter(router *gin.Engine, cfg *config.Config, authClient *auth // User Tags API routesV2.GET("/user-tags/:username", rateLimiter, blogClient.GetUserTags) // Get user tags + + // Activity & Analytics APIs + routesV2.GET("/trending", rateLimiter, blogClient.GetTrendingBlogs) // Get trending blogs + // routesV2.GET("/account/:acc_id/activity", rateLimiter, blogClient.GetAccountActivities) // Get account activities + // routesV2.GET("/analytics/advanced", rateLimiter, blogClient.GetAdvancedAnalytics) // Get advanced analytics } routesV2.Use(mware.AuthRequired) @@ -1586,113 +1591,113 @@ func (asc *BlogServiceClient) MoveBlogToDraft(ctx *gin.Context) { ctx.JSON(http.StatusOK, resp) } -func (asc *BlogServiceClient) MyBookmarks(ctx *gin.Context) { - tokenAccountId := ctx.GetString("userName") - - // Get limit and offset and convert into int32 - limit := ctx.DefaultQuery("limit", "10") - offset := ctx.DefaultQuery("offset", "0") - limitInt, err := strconv.Atoi(limit) - if err != nil { - limitInt = 10 - } - - offsetInt, err := strconv.Atoi(offset) - if err != nil { - offsetInt = 0 - } - - // Get all the draft blogs by my username - blogResp, err := asc.UserCli.GetUsersBookmarks(tokenAccountId) - - if err != nil { - asc.log.Errorf("cannot get the bookmarks, error: %v", err) - ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "cannot get the bookmarks"}) - return - } - - if len(blogResp) == 0 { - ctx.AbortWithStatusJSON(http.StatusNotFound, gin.H{"message": "no blogs found"}) - return - } - - stream, err := asc.Client.GetBlogsBySlice(context.Background(), &pb.GetBlogsBySliceReq{ - BlogIds: blogResp, - IsDraft: false, - Limit: int32(limitInt), - Offset: int32(offsetInt), - ClientInfo: asc.createClientInfo(ctx), - }) - - if err != nil { - asc.log.Errorf("cannot get the blogs by tags, error: %v", err) - if status, ok := status.FromError(err); ok { - switch status.Code() { - case codes.NotFound: - ctx.AbortWithStatusJSON(http.StatusNotFound, gin.H{"message": "cannot find the blogs for the given tags"}) - return - case codes.Internal: - ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "cannot get the blogs by tags"}) - return - default: - ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "unknown error"}) - return - } - } - } - - var allBlogs []map[string]interface{} - for { - blog, err := stream.Recv() - if err == io.EOF { - break - } - if err != nil { - if status, ok := status.FromError(err); ok { - switch status.Code() { - case codes.NotFound: - ctx.AbortWithStatusJSON(http.StatusNotFound, gin.H{"message": "no blogs found for the given tags"}) - return - case codes.Internal: - ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "error receiving blog from stream"}) - return - default: - ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "unknown error"}) - return - } - } - } - - var blogMaps []map[string]interface{} - if err := json.Unmarshal(blog.Value, &blogMaps); err != nil { - asc.log.Errorf("cannot unmarshal the blog, error: %v", err) - ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "cannot unmarshal the blog"}) - return - } - allBlogs = append(allBlogs, blogMaps...) - } - - for _, blog := range allBlogs { - blogID, ok := blog["blog_id"].(string) - if !ok { - asc.log.Errorf("BlogId is either missing or not a string: %v", blog) - continue - } - - likeCount, _ := asc.UserCli.GetNoOfLikeCounts(blogID) - blog["LikeCount"] = likeCount - - bookmarkCount, _ := asc.UserCli.GetNoOfBookmarkCounts(blogID) - blog["BookmarkCount"] = bookmarkCount - - } - - responseBlogs := map[string]interface{}{ - "blogs": allBlogs, - } - - ctx.JSON(http.StatusOK, responseBlogs) -} +// func (asc *BlogServiceClient) MyBookmarks(ctx *gin.Context) { +// tokenAccountId := ctx.GetString("userName") + +// // Get limit and offset and convert into int32 +// limit := ctx.DefaultQuery("limit", "10") +// offset := ctx.DefaultQuery("offset", "0") +// limitInt, err := strconv.Atoi(limit) +// if err != nil { +// limitInt = 10 +// } + +// offsetInt, err := strconv.Atoi(offset) +// if err != nil { +// offsetInt = 0 +// } + +// // Get all the draft blogs by my username +// blogResp, err := asc.UserCli.GetUsersBookmarks(tokenAccountId) + +// if err != nil { +// asc.log.Errorf("cannot get the bookmarks, error: %v", err) +// ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "cannot get the bookmarks"}) +// return +// } + +// if len(blogResp) == 0 { +// ctx.AbortWithStatusJSON(http.StatusNotFound, gin.H{"message": "no blogs found"}) +// return +// } + +// stream, err := asc.Client.GetBlogsBySlice(context.Background(), &pb.GetBlogsBySliceReq{ +// BlogIds: blogResp, +// IsDraft: false, +// Limit: int32(limitInt), +// Offset: int32(offsetInt), +// ClientInfo: asc.createClientInfo(ctx), +// }) + +// if err != nil { +// asc.log.Errorf("cannot get the blogs by tags, error: %v", err) +// if status, ok := status.FromError(err); ok { +// switch status.Code() { +// case codes.NotFound: +// ctx.AbortWithStatusJSON(http.StatusNotFound, gin.H{"message": "cannot find the blogs for the given tags"}) +// return +// case codes.Internal: +// ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "cannot get the blogs by tags"}) +// return +// default: +// ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "unknown error"}) +// return +// } +// } +// } + +// var allBlogs []map[string]interface{} +// for { +// blog, err := stream.Recv() +// if err == io.EOF { +// break +// } +// if err != nil { +// if status, ok := status.FromError(err); ok { +// switch status.Code() { +// case codes.NotFound: +// ctx.AbortWithStatusJSON(http.StatusNotFound, gin.H{"message": "no blogs found for the given tags"}) +// return +// case codes.Internal: +// ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "error receiving blog from stream"}) +// return +// default: +// ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "unknown error"}) +// return +// } +// } +// } + +// var blogMaps []map[string]interface{} +// if err := json.Unmarshal(blog.Value, &blogMaps); err != nil { +// asc.log.Errorf("cannot unmarshal the blog, error: %v", err) +// ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "cannot unmarshal the blog"}) +// return +// } +// allBlogs = append(allBlogs, blogMaps...) +// } + +// for _, blog := range allBlogs { +// blogID, ok := blog["blog_id"].(string) +// if !ok { +// asc.log.Errorf("BlogId is either missing or not a string: %v", blog) +// continue +// } + +// likeCount, _ := asc.UserCli.GetNoOfLikeCounts(blogID) +// blog["LikeCount"] = likeCount + +// bookmarkCount, _ := asc.UserCli.GetNoOfBookmarkCounts(blogID) +// blog["BookmarkCount"] = bookmarkCount + +// } + +// responseBlogs := map[string]interface{}{ +// "blogs": allBlogs, +// } + +// ctx.JSON(http.StatusOK, responseBlogs) +// } func (asc *BlogServiceClient) GetPublishedBlogByBlogId(ctx *gin.Context) { blogId := ctx.Param("blog_id") @@ -2100,3 +2105,204 @@ func (asc *BlogServiceClient) TrackBlogActivity(ctx *gin.Context) { "message": resp.Message, }) } + +// GetTrendingBlogs returns trending blogs from the activity service +// GET /api/v2/blog/trending +func (asc *BlogServiceClient) GetTrendingBlogs(ctx *gin.Context) { + accID := ctx.Query("account_id") + timeRange := ctx.DefaultQuery("time_range", "24h") + limitInt := utils.GetIntQuery(ctx, "limit", 10) + offsetInt := utils.GetIntQuery(ctx, "offset", 0) + clientInfo := utils.GetClientInfo(ctx) + + resp, err := asc.ActivityCli.GetTrendingBlogs(context.Background(), &activity_pb.GetTrendingBlogsRequest{ + AccountId: accID, + TimeRange: timeRange, + Limit: int32(limitInt), + }) + + if err != nil { + asc.log.Errorf("failed to get trending blogs: %v", err) + ctx.JSON(http.StatusInternalServerError, gin.H{"error": "failed to fetch trending blogs"}) + return + } + + blogIds := []string{} + blogStats := make(map[string]struct { + Views int64 + Score float64 + }) + for _, blog := range resp.Blogs { + blogIds = append(blogIds, blog.BlogId) + blogStats[blog.BlogId] = struct { + Views int64 + Score float64 + }{ + Views: blog.Views, + Score: blog.Score, + } + } + + // Call gRPC to get blog metadata with client tracking + stream, err := asc.Client.MetaGetBlogsByBlogIds(context.Background(), &pb.BlogListReq{ + BlogIds: blogIds, + IsDraft: false, // Only published blogs + Limit: int32(limitInt), + Offset: int32(offsetInt), + Ip: clientInfo.IPAddress, + Client: clientInfo.ClientType, + SessionId: clientInfo.SessionID, + UserAgent: clientInfo.UserAgent, + Referrer: clientInfo.Referrer, + Platform: utils.GetBlogPlatform(ctx), + }) + + if err != nil { + asc.log.Errorf("cannot get the blogs by tags, error: %v", err) + if status, ok := status.FromError(err); ok { + switch status.Code() { + case codes.NotFound: + ctx.AbortWithStatusJSON(http.StatusNotFound, gin.H{"message": "cannot find the blogs for the given tags"}) + return + case codes.Internal: + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "cannot get the blogs by tags"}) + return + default: + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "unknown error"}) + return + } + } + } + + var allBlogs []map[string]interface{} + var totalBlogs int // Store total number of blogs + + for { + blog, err := stream.Recv() + if err == io.EOF { + break + } + if err != nil { + if status, ok := status.FromError(err); ok { + switch status.Code() { + case codes.NotFound: + ctx.AbortWithStatusJSON(http.StatusNotFound, gin.H{"message": "no blogs found for the given tags"}) + return + case codes.Internal: + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "error receiving blog from stream"}) + return + default: + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "unknown error"}) + return + } + } + } + + // Unmarshal into a map since response structure has changed + var blogMap map[string]interface{} + if err := json.Unmarshal(blog.Value, &blogMap); err != nil { + asc.log.Errorf("cannot unmarshal the blog, error: %v", err) + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "cannot unmarshal the blog"}) + return + } + + // Extract "total_blogs" if present + if total, ok := blogMap["total_blogs"].(float64); ok { // JSON numbers default to float64 + totalBlogs = int(total) + } + + // Extract the "blogs" array safely + blogsData, ok := blogMap["blogs"] + if !ok { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "missing blogs data in response"}) + return + } + + // Convert blogsData to []map[string]interface{} + blogList, ok := blogsData.([]interface{}) + if !ok { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "invalid blogs format in response"}) + return + } + + // Convert []interface{} to []map[string]interface{} + for _, b := range blogList { + if blogEntry, valid := b.(map[string]interface{}); valid { + allBlogs = append(allBlogs, blogEntry) + } + } + } + + // Add additional metadata (like & bookmark count) for each blog + for _, blog := range allBlogs { + blogID, ok := blog["blog_id"].(string) + if !ok { + asc.log.Errorf("BlogId is either missing or not a string: %v", blog) + continue + } + + likeCount, _ := asc.UserCli.GetNoOfLikeCounts(blogID) + blog["like_count"] = likeCount + + bookmarkCount, _ := asc.UserCli.GetNoOfBookmarkCounts(blogID) + blog["bookmark_count"] = bookmarkCount + + // Add views and score from activity service + if stats, exists := blogStats[blogID]; exists { + blog["views"] = stats.Views + blog["score"] = stats.Score + } + } + + // Final response including total blogs count + responseBlogs := map[string]interface{}{ + "total_blogs": totalBlogs, + "blogs": allBlogs, + } + + ctx.JSON(http.StatusOK, responseBlogs) +} + +// GetAccountActivities returns activity history for a specific account +// GET /api/v2/blog/account/:acc_id/activity +func (asc *BlogServiceClient) GetAccountActivities(ctx *gin.Context) { + accID := ctx.Param("acc_id") + action := ctx.Query("action") + limit := int32(utils.GetIntQuery(ctx, "limit", 20)) + offset := int32(utils.GetIntQuery(ctx, "offset", 0)) + + resp, err := asc.ActivityCli.GetAccountActivities(context.Background(), &activity_pb.GetAccountActivitiesRequest{ + AccountId: accID, + Action: action, + Limit: limit, + Offset: offset, + }) + + if err != nil { + asc.log.Errorf("failed to get account activities: %v", err) + ctx.JSON(http.StatusInternalServerError, gin.H{"error": "failed to fetch activities"}) + return + } + + ctx.JSON(http.StatusOK, resp) +} + +// GetAdvancedAnalytics returns complex insights like retention and hotspots +// GET /api/v2/blog/analytics/advanced +func (asc *BlogServiceClient) GetAdvancedAnalytics(ctx *gin.Context) { + accID := ctx.Query("account_id") + timeRange := ctx.DefaultQuery("time_range", "7d") + + resp, err := asc.ActivityCli.GetAdvancedAnalytics(context.Background(), &activity_pb.GetAdvancedAnalyticsRequest{ + AccountId: accID, + TimeRange: timeRange, + }) + + if err != nil { + asc.log.Errorf("failed to get advanced analytics: %v", err) + ctx.JSON(http.StatusInternalServerError, gin.H{"error": "failed to fetch advanced analytics"}) + return + } + + ctx.JSON(http.StatusOK, resp) +} diff --git a/microservices/the_monkeys_gateway/internal/user_service/routes.go b/microservices/the_monkeys_gateway/internal/user_service/routes.go index 0708091e..7d6cbaf9 100644 --- a/microservices/the_monkeys_gateway/internal/user_service/routes.go +++ b/microservices/the_monkeys_gateway/internal/user_service/routes.go @@ -13,17 +13,22 @@ import ( "github.com/the-monkeys/the_monkeys/constants" "github.com/the-monkeys/the_monkeys/microservices/the_monkeys_gateway/internal/auth" + "github.com/the-monkeys/the_monkeys/microservices/the_monkeys_gateway/middleware" "github.com/the-monkeys/the_monkeys/microservices/the_monkeys_gateway/utils" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/status" + + activity_pb "github.com/the-monkeys/the_monkeys/apis/serviceconn/gateway_activity/pb" + "github.com/the-monkeys/the_monkeys/microservices/the_monkeys_gateway/internal/activity" ) type UserServiceClient struct { - Client pb.UserServiceClient - log *zap.SugaredLogger + Client pb.UserServiceClient + ActivityCli activity_pb.ActivityServiceClient + log *zap.SugaredLogger } func NewUserServiceClient(cfg *config.Config, lg *zap.SugaredLogger) pb.UserServiceClient { @@ -40,8 +45,9 @@ func RegisterUserRouter(router *gin.Engine, cfg *config.Config, authClient *auth mware := auth.InitAuthMiddleware(authClient, log) usc := &UserServiceClient{ - Client: NewUserServiceClient(cfg, log), - log: log, + Client: NewUserServiceClient(cfg, log), + ActivityCli: activity.NewActivityServiceClient(cfg, log), + log: log, } routes := router.Group("/api/v1/user") routes.GET("/topics", usc.GetAllTopics) @@ -90,6 +96,12 @@ func RegisterUserRouter(router *gin.Engine, cfg *config.Config, authClient *auth routes.POST("/topics", usc.CreateNewTopics) } + routesV2 := router.Group("/api/v2/user") + rateLimiter := middleware.RateLimiterMiddleware("100-S") + { + routesV2.GET("/active-users", rateLimiter, usc.GetActiveUsers) + } + return usc } @@ -989,3 +1001,49 @@ func (asc *UserServiceClient) ConnectionCount(ctx *gin.Context) { } ctx.JSON(http.StatusOK, res) } + +// GetActiveUsers returns the count of active users +// GET /api/v2/user/active-users +func (usc *UserServiceClient) GetActiveUsers(ctx *gin.Context) { + accID := ctx.Query("account_id") + timeRange := ctx.DefaultQuery("time_range", "3h") + + resp, err := usc.ActivityCli.GetActiveUsers(context.Background(), &activity_pb.GetActiveUsersRequest{ + AccountId: accID, + TimeRange: timeRange, + }) + + if err != nil { + usc.log.Errorf("failed to get active users: %v", err) + ctx.JSON(http.StatusInternalServerError, gin.H{"error": "failed to fetch active users"}) + return + } + + // Collect usernames from the active users list + var accIds []string + for _, user := range resp.UserList { + if user.UserId != "" { + accIds = append(accIds, user.UserId) + } + } + + var userDetails []*pb.UserDetailsResp + if len(accIds) > 0 { + usersResp, err := usc.Client.GetBatchUserDetails(context.Background(), &pb.GetBatchUserDetailsReq{ + AccountIds: accIds, + }) + + if err != nil { + usc.log.Errorf("failed to get user details: %v", err) + // We don't return here to allow the count to be returned even if details fail + } else { + userDetails = usersResp.Users + } + } + + ctx.JSON(http.StatusOK, gin.H{ + "active_users": resp.ActiveUsers, + "user_details": userDetails, + "status_code": resp.StatusCode, + }) +} diff --git a/microservices/the_monkeys_users/internal/database/database.go b/microservices/the_monkeys_users/internal/database/database.go index 0c120326..3b6cb3cc 100644 --- a/microservices/the_monkeys_users/internal/database/database.go +++ b/microservices/the_monkeys_users/internal/database/database.go @@ -57,6 +57,7 @@ type UserDb interface { FindUsersWithPagination(searchTerm string, limit int, offset int) ([]models.UserAccount, error) GetFollowersAndFollowingsCounts(username string) (int, int, error) GetBlogByBlogId(blogId string) (*models.Blog, error) + GetUsersByAccountIds(accIds []string) ([]models.UserProfileRes, error) // Update queries UpdateUserProfile(username string, dbUserInfo *models.UserProfileRes) error UpdateBlogStatusToPublish(blogId string, status string) error @@ -1024,3 +1025,34 @@ func (uh *uDBHandler) GetFollowers(username string) ([]models.TheMonkeysUser, er uh.log.Debugf("Successfully fetched users who follow user: %s", username) return users, nil } + +func (uh *uDBHandler) GetUsersByAccountIds(accIds []string) ([]models.UserProfileRes, error) { + var users []models.UserProfileRes + query := ` + SELECT ua.username, ua.first_name, ua.last_name, + ua.bio, ua.avatar_url, ua.address + FROM user_account ua + WHERE ua.account_id = ANY($1); + ` + rows, err := uh.db.Query(query, accIds) + if err != nil { + uh.log.Errorf("Error fetching batch users: %v", err) + return nil, err + } + defer rows.Close() + + for rows.Next() { + var u models.UserProfileRes + if err := rows.Scan(&u.Username, &u.FirstName, &u.LastName, + &u.Bio, &u.AvatarUrl, &u.Address); err != nil { + return nil, err + } + users = append(users, u) + } + + if err = rows.Err(); err != nil { + return nil, err + } + + return users, nil +} diff --git a/microservices/the_monkeys_users/internal/services/service.go b/microservices/the_monkeys_users/internal/services/service.go index 565e8773..f9765330 100644 --- a/microservices/the_monkeys_users/internal/services/service.go +++ b/microservices/the_monkeys_users/internal/services/service.go @@ -950,3 +950,32 @@ func (us *UserSvc) GetBookMarks(ctx context.Context, req *pb.BookMarkReq) (*pb.B BlogIds: blogIds, }, nil } + +func (us *UserSvc) GetBatchUserDetails(ctx context.Context, req *pb.GetBatchUserDetailsReq) (*pb.GetBatchUserDetailsRes, error) { + if len(req.AccountIds) == 0 { + return &pb.GetBatchUserDetailsRes{}, nil + } + + users, err := us.dbConn.GetUsersByAccountIds(req.AccountIds) + if err != nil { + us.log.Errorf("failed to fetch batch user details: %v", err) + return nil, status.Errorf(codes.Internal, "failed to fetch user details") + } + + var res []*pb.UserDetailsResp + for _, u := range users { + res = append(res, &pb.UserDetailsResp{ + AccountId: u.AccountId, + Username: u.Username, + FirstName: u.FirstName, + LastName: u.LastName, + Bio: u.Bio.String, + AvatarUrl: u.AvatarUrl.String, + Location: u.Address.String, + }) + } + + return &pb.GetBatchUserDetailsRes{ + Users: res, + }, nil +}