update api (#1230)

* update api

* generated protobuf

* updates

* generated protobuf

---------

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
This commit is contained in:
David Colburn
2025-09-29 13:52:50 -04:00
committed by GitHub
parent a4aabbeb26
commit 2ddfb3ee7f
3 changed files with 114 additions and 82 deletions
+6 -3
View File
@@ -7,6 +7,7 @@ option csharp_namespace = "LiveKit.Proto";
option ruby_package = "LiveKit::Proto";
import "google/protobuf/empty.proto";
import "livekit_models.proto";
// Experimental (not currently available)
service Replay {
@@ -20,10 +21,12 @@ service Replay {
message ListReplaysRequest {
string room_name = 1; // optional
livekit.TokenPagination page_token = 2;
}
message ListReplaysResponse {
repeated ReplayInfo replays = 1;
livekit.TokenPagination next_page_token = 2;
}
message ReplayInfo {
@@ -39,8 +42,8 @@ message DeleteReplayRequest {
message PlaybackRequest {
string replay_id = 1;
string room_name = 2; // room to play into
int64 start_time = 3; // initial cursor
string playback_room = 2; // name of room to play into
int64 seek_offset = 3; // initial timestamp (ms)
}
message PlaybackResponse {
@@ -49,7 +52,7 @@ message PlaybackResponse {
message SeekRequest {
string playback_id = 1;
int64 start_time = 2; // initial cursor
int64 seek_offset = 2; // timestamp (ms)
}
message ClosePlaybackRequest {
+73 -50
View File
@@ -7,6 +7,7 @@
package replay
import (
livekit "github.com/livekit/protocol/livekit"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
emptypb "google.golang.org/protobuf/types/known/emptypb"
@@ -23,8 +24,9 @@ const (
)
type ListReplaysRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` // optional
state protoimpl.MessageState `protogen:"open.v1"`
RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` // optional
PageToken *livekit.TokenPagination `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
@@ -66,9 +68,17 @@ func (x *ListReplaysRequest) GetRoomName() string {
return ""
}
func (x *ListReplaysRequest) GetPageToken() *livekit.TokenPagination {
if x != nil {
return x.PageToken
}
return nil
}
type ListReplaysResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
Replays []*ReplayInfo `protobuf:"bytes,1,rep,name=replays,proto3" json:"replays,omitempty"`
state protoimpl.MessageState `protogen:"open.v1"`
Replays []*ReplayInfo `protobuf:"bytes,1,rep,name=replays,proto3" json:"replays,omitempty"`
NextPageToken *livekit.TokenPagination `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
@@ -110,6 +120,13 @@ func (x *ListReplaysResponse) GetReplays() []*ReplayInfo {
return nil
}
func (x *ListReplaysResponse) GetNextPageToken() *livekit.TokenPagination {
if x != nil {
return x.NextPageToken
}
return nil
}
type ReplayInfo struct {
state protoimpl.MessageState `protogen:"open.v1"`
ReplayId string `protobuf:"bytes,1,opt,name=replay_id,json=replayId,proto3" json:"replay_id,omitempty"`
@@ -225,8 +242,8 @@ func (x *DeleteReplayRequest) GetReplayId() string {
type PlaybackRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
ReplayId string `protobuf:"bytes,1,opt,name=replay_id,json=replayId,proto3" json:"replay_id,omitempty"`
RoomName string `protobuf:"bytes,2,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` // room to play into
StartTime int64 `protobuf:"varint,3,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` // initial cursor
PlaybackRoom string `protobuf:"bytes,2,opt,name=playback_room,json=playbackRoom,proto3" json:"playback_room,omitempty"` // name of room to play into
SeekOffset int64 `protobuf:"varint,3,opt,name=seek_offset,json=seekOffset,proto3" json:"seek_offset,omitempty"` // initial timestamp (ms)
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
@@ -268,16 +285,16 @@ func (x *PlaybackRequest) GetReplayId() string {
return ""
}
func (x *PlaybackRequest) GetRoomName() string {
func (x *PlaybackRequest) GetPlaybackRoom() string {
if x != nil {
return x.RoomName
return x.PlaybackRoom
}
return ""
}
func (x *PlaybackRequest) GetStartTime() int64 {
func (x *PlaybackRequest) GetSeekOffset() int64 {
if x != nil {
return x.StartTime
return x.SeekOffset
}
return 0
}
@@ -329,7 +346,7 @@ func (x *PlaybackResponse) GetPlaybackId() string {
type SeekRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
PlaybackId string `protobuf:"bytes,1,opt,name=playback_id,json=playbackId,proto3" json:"playback_id,omitempty"`
StartTime int64 `protobuf:"varint,2,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` // initial cursor
SeekOffset int64 `protobuf:"varint,2,opt,name=seek_offset,json=seekOffset,proto3" json:"seek_offset,omitempty"` // timestamp (ms)
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
@@ -371,9 +388,9 @@ func (x *SeekRequest) GetPlaybackId() string {
return ""
}
func (x *SeekRequest) GetStartTime() int64 {
func (x *SeekRequest) GetSeekOffset() int64 {
if x != nil {
return x.StartTime
return x.SeekOffset
}
return 0
}
@@ -426,11 +443,14 @@ var File_cloud_replay_proto protoreflect.FileDescriptor
const file_cloud_replay_proto_rawDesc = "" +
"\n" +
"\x12cloud_replay.proto\x12\x06replay\x1a\x1bgoogle/protobuf/empty.proto\"1\n" +
"\x12cloud_replay.proto\x12\x06replay\x1a\x1bgoogle/protobuf/empty.proto\x1a\x14livekit_models.proto\"j\n" +
"\x12ListReplaysRequest\x12\x1b\n" +
"\troom_name\x18\x01 \x01(\tR\broomName\"C\n" +
"\troom_name\x18\x01 \x01(\tR\broomName\x127\n" +
"\n" +
"page_token\x18\x02 \x01(\v2\x18.livekit.TokenPaginationR\tpageToken\"\x85\x01\n" +
"\x13ListReplaysResponse\x12,\n" +
"\areplays\x18\x01 \x03(\v2\x12.replay.ReplayInfoR\areplays\"\x81\x01\n" +
"\areplays\x18\x01 \x03(\v2\x12.replay.ReplayInfoR\areplays\x12@\n" +
"\x0fnext_page_token\x18\x02 \x01(\v2\x18.livekit.TokenPaginationR\rnextPageToken\"\x81\x01\n" +
"\n" +
"ReplayInfo\x12\x1b\n" +
"\treplay_id\x18\x01 \x01(\tR\breplayId\x12\x1b\n" +
@@ -439,20 +459,20 @@ const file_cloud_replay_proto_rawDesc = "" +
"start_time\x18\x03 \x01(\x03R\tstartTime\x12\x1a\n" +
"\bduration\x18\x04 \x01(\x03R\bduration\"2\n" +
"\x13DeleteReplayRequest\x12\x1b\n" +
"\treplay_id\x18\x01 \x01(\tR\breplayId\"j\n" +
"\treplay_id\x18\x01 \x01(\tR\breplayId\"t\n" +
"\x0fPlaybackRequest\x12\x1b\n" +
"\treplay_id\x18\x01 \x01(\tR\breplayId\x12\x1b\n" +
"\troom_name\x18\x02 \x01(\tR\broomName\x12\x1d\n" +
"\n" +
"start_time\x18\x03 \x01(\x03R\tstartTime\"3\n" +
"\treplay_id\x18\x01 \x01(\tR\breplayId\x12#\n" +
"\rplayback_room\x18\x02 \x01(\tR\fplaybackRoom\x12\x1f\n" +
"\vseek_offset\x18\x03 \x01(\x03R\n" +
"seekOffset\"3\n" +
"\x10PlaybackResponse\x12\x1f\n" +
"\vplayback_id\x18\x01 \x01(\tR\n" +
"playbackId\"M\n" +
"playbackId\"O\n" +
"\vSeekRequest\x12\x1f\n" +
"\vplayback_id\x18\x01 \x01(\tR\n" +
"playbackId\x12\x1d\n" +
"\n" +
"start_time\x18\x02 \x01(\x03R\tstartTime\"7\n" +
"playbackId\x12\x1f\n" +
"\vseek_offset\x18\x02 \x01(\x03R\n" +
"seekOffset\"7\n" +
"\x14ClosePlaybackRequest\x12\x1f\n" +
"\vplayback_id\x18\x01 \x01(\tR\n" +
"playbackId2\xc8\x02\n" +
@@ -477,33 +497,36 @@ func file_cloud_replay_proto_rawDescGZIP() []byte {
var file_cloud_replay_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
var file_cloud_replay_proto_goTypes = []any{
(*ListReplaysRequest)(nil), // 0: replay.ListReplaysRequest
(*ListReplaysResponse)(nil), // 1: replay.ListReplaysResponse
(*ReplayInfo)(nil), // 2: replay.ReplayInfo
(*DeleteReplayRequest)(nil), // 3: replay.DeleteReplayRequest
(*PlaybackRequest)(nil), // 4: replay.PlaybackRequest
(*PlaybackResponse)(nil), // 5: replay.PlaybackResponse
(*SeekRequest)(nil), // 6: replay.SeekRequest
(*ClosePlaybackRequest)(nil), // 7: replay.ClosePlaybackRequest
(*emptypb.Empty)(nil), // 8: google.protobuf.Empty
(*ListReplaysRequest)(nil), // 0: replay.ListReplaysRequest
(*ListReplaysResponse)(nil), // 1: replay.ListReplaysResponse
(*ReplayInfo)(nil), // 2: replay.ReplayInfo
(*DeleteReplayRequest)(nil), // 3: replay.DeleteReplayRequest
(*PlaybackRequest)(nil), // 4: replay.PlaybackRequest
(*PlaybackResponse)(nil), // 5: replay.PlaybackResponse
(*SeekRequest)(nil), // 6: replay.SeekRequest
(*ClosePlaybackRequest)(nil), // 7: replay.ClosePlaybackRequest
(*livekit.TokenPagination)(nil), // 8: livekit.TokenPagination
(*emptypb.Empty)(nil), // 9: google.protobuf.Empty
}
var file_cloud_replay_proto_depIdxs = []int32{
2, // 0: replay.ListReplaysResponse.replays:type_name -> replay.ReplayInfo
0, // 1: replay.Replay.ListReplays:input_type -> replay.ListReplaysRequest
3, // 2: replay.Replay.DeleteReplay:input_type -> replay.DeleteReplayRequest
4, // 3: replay.Replay.Playback:input_type -> replay.PlaybackRequest
6, // 4: replay.Replay.Seek:input_type -> replay.SeekRequest
7, // 5: replay.Replay.Close:input_type -> replay.ClosePlaybackRequest
1, // 6: replay.Replay.ListReplays:output_type -> replay.ListReplaysResponse
8, // 7: replay.Replay.DeleteReplay:output_type -> google.protobuf.Empty
5, // 8: replay.Replay.Playback:output_type -> replay.PlaybackResponse
8, // 9: replay.Replay.Seek:output_type -> google.protobuf.Empty
8, // 10: replay.Replay.Close:output_type -> google.protobuf.Empty
6, // [6:11] is the sub-list for method output_type
1, // [1:6] is the sub-list for method input_type
1, // [1:1] is the sub-list for extension type_name
1, // [1:1] is the sub-list for extension extendee
0, // [0:1] is the sub-list for field type_name
8, // 0: replay.ListReplaysRequest.page_token:type_name -> livekit.TokenPagination
2, // 1: replay.ListReplaysResponse.replays:type_name -> replay.ReplayInfo
8, // 2: replay.ListReplaysResponse.next_page_token:type_name -> livekit.TokenPagination
0, // 3: replay.Replay.ListReplays:input_type -> replay.ListReplaysRequest
3, // 4: replay.Replay.DeleteReplay:input_type -> replay.DeleteReplayRequest
4, // 5: replay.Replay.Playback:input_type -> replay.PlaybackRequest
6, // 6: replay.Replay.Seek:input_type -> replay.SeekRequest
7, // 7: replay.Replay.Close:input_type -> replay.ClosePlaybackRequest
1, // 8: replay.Replay.ListReplays:output_type -> replay.ListReplaysResponse
9, // 9: replay.Replay.DeleteReplay:output_type -> google.protobuf.Empty
5, // 10: replay.Replay.Playback:output_type -> replay.PlaybackResponse
9, // 11: replay.Replay.Seek:output_type -> google.protobuf.Empty
9, // 12: replay.Replay.Close:output_type -> google.protobuf.Empty
8, // [8:13] is the sub-list for method output_type
3, // [3:8] is the sub-list for method input_type
3, // [3:3] is the sub-list for extension type_name
3, // [3:3] is the sub-list for extension extendee
0, // [0:3] is the sub-list for field type_name
}
func init() { file_cloud_replay_proto_init() }
+35 -29
View File
@@ -2206,33 +2206,39 @@ func callClientError(ctx context.Context, h *twirp.ClientHooks, err twirp.Error)
}
var twirpFileDescriptor0 = []byte{
// 448 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x53, 0x4d, 0x6f, 0xd3, 0x40,
0x10, 0x95, 0x9d, 0x12, 0x92, 0x09, 0x5f, 0xda, 0x20, 0xb0, 0x1c, 0x10, 0xd1, 0x9e, 0x72, 0x40,
0x8e, 0x48, 0x0e, 0x48, 0x95, 0xb8, 0x10, 0x8a, 0x54, 0x51, 0x50, 0x65, 0x38, 0x71, 0x89, 0x9c,
0x78, 0x1a, 0x96, 0xae, 0xbd, 0xc6, 0xbb, 0xae, 0xd4, 0x23, 0x7f, 0x87, 0x5f, 0xc2, 0x6f, 0xe1,
0x57, 0x20, 0xef, 0x7a, 0x1d, 0xc7, 0x4d, 0x29, 0x52, 0x8f, 0xf3, 0xe6, 0xcd, 0xce, 0x9b, 0xe7,
0x67, 0x20, 0x6b, 0x2e, 0x8a, 0x78, 0x99, 0x63, 0xc6, 0xa3, 0xcb, 0x20, 0xcb, 0x85, 0x12, 0xa4,
0x6b, 0x2a, 0x7f, 0xb4, 0x11, 0x62, 0xc3, 0x71, 0xaa, 0xd1, 0x55, 0x71, 0x36, 0xc5, 0x24, 0x53,
0x15, 0x89, 0xbe, 0x02, 0x72, 0xc2, 0xa4, 0x0a, 0x35, 0x55, 0x86, 0xf8, 0xa3, 0x40, 0xa9, 0xc8,
0x08, 0xfa, 0xb9, 0x10, 0xc9, 0x32, 0x8d, 0x12, 0xf4, 0x9c, 0xb1, 0x33, 0xe9, 0x87, 0xbd, 0x12,
0xf8, 0x14, 0x25, 0x48, 0x17, 0x30, 0xdc, 0x19, 0x91, 0x99, 0x48, 0x25, 0x92, 0x97, 0x70, 0xd7,
0x2c, 0x94, 0x9e, 0x33, 0xee, 0x4c, 0x06, 0x33, 0x12, 0x54, 0x72, 0x0c, 0xf3, 0x38, 0x3d, 0x13,
0xa1, 0xa5, 0xd0, 0x9f, 0x0e, 0xc0, 0x16, 0xd7, 0x0b, 0x75, 0xb5, 0x64, 0x71, 0xbd, 0xd0, 0xb4,
0xe3, 0x5d, 0x35, 0xee, 0xae, 0x1a, 0xf2, 0x1c, 0x40, 0xaa, 0x28, 0x57, 0x4b, 0xc5, 0x12, 0xf4,
0x3a, 0x63, 0x67, 0xd2, 0x09, 0xfb, 0x1a, 0xf9, 0xc2, 0x12, 0x24, 0x3e, 0xf4, 0xe2, 0x22, 0x8f,
0x14, 0x13, 0xa9, 0x77, 0xa0, 0x9b, 0x75, 0x4d, 0x67, 0x30, 0x7c, 0x87, 0x1c, 0x15, 0x1a, 0x21,
0xcd, 0xe3, 0xaf, 0xd3, 0x42, 0xbf, 0xc3, 0xc3, 0x53, 0x1e, 0x5d, 0xae, 0xa2, 0xf5, 0xf9, 0xff,
0xf0, 0x6f, 0xa3, 0x9d, 0xce, 0xe1, 0xd1, 0x76, 0x57, 0xe5, 0xf2, 0x0b, 0x18, 0x64, 0x15, 0xb6,
0x5d, 0x07, 0x16, 0x3a, 0x8e, 0xe9, 0x47, 0x18, 0x7c, 0x46, 0xac, 0xc5, 0xdd, 0xc4, 0x6f, 0x69,
0x70, 0xdb, 0x1a, 0x5e, 0xc3, 0xe3, 0x05, 0x17, 0x12, 0xdb, 0x47, 0xdf, 0xf4, 0xee, 0xec, 0xb7,
0x0b, 0x5d, 0xe3, 0x2b, 0x79, 0x0f, 0x83, 0x46, 0x60, 0x88, 0x6f, 0x73, 0x71, 0x35, 0x78, 0xfe,
0x68, 0x6f, 0xaf, 0xba, 0x7d, 0x01, 0xf7, 0x9a, 0xdf, 0x8b, 0xd4, 0xe4, 0x3d, 0x5f, 0xd1, 0x7f,
0x12, 0x98, 0xd8, 0x07, 0x36, 0xf6, 0xc1, 0x51, 0x19, 0x7b, 0xf2, 0x06, 0x7a, 0xf6, 0x16, 0xf2,
0xd4, 0x3e, 0xd0, 0xba, 0xce, 0xf7, 0xae, 0x36, 0x2a, 0x0d, 0x73, 0x38, 0x28, 0xed, 0x25, 0x43,
0xcb, 0x68, 0x98, 0xfd, 0x8f, 0x9d, 0x77, 0xb4, 0x89, 0xe4, 0x99, 0x9d, 0xda, 0xe7, 0xe9, 0x75,
0xe3, 0x6f, 0x8f, 0xbe, 0xd2, 0x0d, 0x53, 0xdf, 0x8a, 0x55, 0xb0, 0x16, 0xc9, 0x94, 0xb3, 0x0b,
0x3c, 0x67, 0xca, 0xfc, 0xce, 0x6b, 0xc1, 0xa7, 0xe6, 0xc9, 0x5f, 0xee, 0xfd, 0x13, 0x76, 0x81,
0x1f, 0x98, 0x0a, 0x4e, 0xcb, 0xce, 0x1f, 0xf7, 0x41, 0x55, 0x1f, 0x1e, 0x6a, 0x60, 0xd5, 0xd5,
0x13, 0xf3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x35, 0xaa, 0x84, 0x15, 0x2c, 0x04, 0x00, 0x00,
// 537 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xc1, 0x6e, 0xd3, 0x40,
0x10, 0x95, 0xdd, 0x12, 0x92, 0x71, 0x43, 0xd1, 0xa6, 0x02, 0xcb, 0x01, 0x35, 0x32, 0x97, 0x1c,
0x90, 0x23, 0x25, 0x87, 0x4a, 0x95, 0x90, 0x10, 0xa5, 0x48, 0x15, 0x15, 0x8d, 0x4c, 0x4f, 0x5c,
0x2c, 0x27, 0x9e, 0x98, 0x25, 0xb6, 0xd7, 0x78, 0xd7, 0x15, 0x3d, 0x72, 0xe0, 0x67, 0xf8, 0x12,
0xbe, 0x85, 0xaf, 0x40, 0xde, 0x5d, 0xbb, 0x69, 0x92, 0x52, 0x38, 0xee, 0x9b, 0xb7, 0x33, 0xef,
0xbd, 0xf5, 0x18, 0xc8, 0x3c, 0x61, 0x65, 0x14, 0x14, 0x98, 0x27, 0xe1, 0xb5, 0x97, 0x17, 0x4c,
0x30, 0xd2, 0x52, 0x27, 0xa7, 0x1f, 0x33, 0x16, 0x27, 0x38, 0x92, 0xe8, 0xac, 0x5c, 0x8c, 0x30,
0xcd, 0x85, 0x26, 0x39, 0x07, 0x09, 0xbd, 0xc2, 0x25, 0x15, 0x41, 0xca, 0x22, 0x4c, 0xb8, 0x42,
0xdd, 0x2f, 0x40, 0xce, 0x29, 0x17, 0xbe, 0x6c, 0xc0, 0x7d, 0xfc, 0x5a, 0x22, 0x17, 0xa4, 0x0f,
0x9d, 0x82, 0xb1, 0x34, 0xc8, 0xc2, 0x14, 0x6d, 0x63, 0x60, 0x0c, 0x3b, 0x7e, 0xbb, 0x02, 0x3e,
0x84, 0x29, 0x92, 0x23, 0x80, 0x3c, 0x8c, 0x31, 0x10, 0x6c, 0x89, 0x99, 0x6d, 0x0e, 0x8c, 0xa1,
0x35, 0xb6, 0x3d, 0xdd, 0xdd, 0xbb, 0xac, 0xd0, 0x69, 0x18, 0xd3, 0x2c, 0x14, 0x94, 0x65, 0x7e,
0xa7, 0xe2, 0x4a, 0xd0, 0xfd, 0x61, 0x40, 0xef, 0xd6, 0x30, 0x9e, 0xb3, 0x8c, 0x23, 0x79, 0x09,
0x0f, 0x95, 0x01, 0x6e, 0x1b, 0x83, 0x9d, 0xa1, 0x35, 0x26, 0x9e, 0xb6, 0xa7, 0x98, 0x67, 0xd9,
0x82, 0xf9, 0x35, 0x85, 0xbc, 0x86, 0xfd, 0x0c, 0xbf, 0x89, 0xe0, 0x3f, 0x34, 0x74, 0xab, 0x0b,
0xd3, 0x46, 0xc7, 0x77, 0x03, 0xe0, 0xa6, 0xb3, 0x34, 0x2b, 0x4f, 0x01, 0x8d, 0x1a, 0xb3, 0xaa,
0x1c, 0xdd, 0x4e, 0xc2, 0x5c, 0x4b, 0xe2, 0x39, 0x00, 0x17, 0x61, 0x21, 0x02, 0x41, 0x53, 0xb4,
0x77, 0x06, 0xc6, 0x70, 0xc7, 0xef, 0x48, 0xe4, 0x92, 0xa6, 0x48, 0x1c, 0x68, 0x47, 0x65, 0x21,
0x25, 0xd8, 0xbb, 0xb2, 0xd8, 0x9c, 0xdd, 0x31, 0xf4, 0xde, 0x62, 0x82, 0x02, 0x95, 0x90, 0xd5,
0xe0, 0xef, 0xd2, 0xe2, 0x0a, 0xd8, 0x9f, 0x26, 0xe1, 0xf5, 0x2c, 0x9c, 0x2f, 0xff, 0x85, 0x4f,
0x5e, 0x40, 0x37, 0xd7, 0xfc, 0xa0, 0xd2, 0xac, 0xf5, 0xef, 0xd5, 0xa0, 0xcf, 0x58, 0x4a, 0x0e,
0xc1, 0xe2, 0x88, 0xcb, 0x80, 0x2d, 0x16, 0x1c, 0x85, 0x36, 0x01, 0x15, 0x74, 0x21, 0x11, 0x77,
0x02, 0x8f, 0x6f, 0xa6, 0xea, 0x17, 0x3b, 0x04, 0xab, 0xe9, 0xdc, 0x0c, 0x86, 0x1a, 0x3a, 0x8b,
0xdc, 0x0b, 0xb0, 0x3e, 0x22, 0x36, 0x32, 0xef, 0xe3, 0xaf, 0xab, 0x30, 0x37, 0x54, 0x1c, 0xc1,
0xc1, 0x49, 0xc2, 0x38, 0xae, 0x07, 0x70, 0x5f, 0xe7, 0xf1, 0x2f, 0x13, 0x5a, 0x2a, 0x63, 0xf2,
0x0e, 0xac, 0x95, 0xcf, 0x8f, 0x38, 0xf5, 0x57, 0xb6, 0xb9, 0x00, 0x4e, 0x7f, 0x6b, 0x4d, 0xbb,
0x3f, 0x81, 0xbd, 0xd5, 0xb7, 0x23, 0x0d, 0x79, 0xcb, 0x8b, 0x3a, 0x4f, 0x3c, 0xb5, 0x94, 0x5e,
0xbd, 0x94, 0xde, 0x69, 0xb5, 0x94, 0xe4, 0x15, 0xb4, 0x6b, 0x2f, 0xe4, 0x69, 0xdd, 0x60, 0xcd,
0x9d, 0x63, 0x6f, 0x16, 0xb4, 0x86, 0x09, 0xec, 0x56, 0x01, 0x93, 0x5e, 0xcd, 0x58, 0x89, 0xfb,
0x2f, 0x33, 0x1f, 0xc8, 0x10, 0xc9, 0xb3, 0xfa, 0xd6, 0xb6, 0x4c, 0xef, 0xba, 0xfe, 0xe6, 0xf4,
0x93, 0x1b, 0x53, 0xf1, 0xb9, 0x9c, 0x79, 0x73, 0x96, 0x8e, 0xf4, 0xb2, 0xa9, 0x9f, 0xcd, 0x9c,
0x25, 0x23, 0xd5, 0xf2, 0xa7, 0xd9, 0x3d, 0xa7, 0x57, 0xf8, 0x9e, 0x0a, 0x6f, 0x5a, 0x55, 0x7e,
0x9b, 0x8f, 0xf4, 0xf9, 0xf8, 0x58, 0x02, 0xb3, 0x96, 0xbc, 0x31, 0xf9, 0x13, 0x00, 0x00, 0xff,
0xff, 0x55, 0xd3, 0x9d, 0xa4, 0xca, 0x04, 0x00, 0x00,
}