*: Add dbSizeInUse to StatusResposne

Existing dbSize shows physically allocated DB size and the backend
(boltdb) won't shrink it after a compaction until a user runs the defrag command.
The new dbSizeInUse shows the DB size that excludes free pages created
by compactions so that users can see the actual DB usage. dbSize >=
dbSizeInUse is always true.
Note that dbSizeInUse shows a page-based size and not byte level usage.
This commit is contained in:
Iwasaki Yudai 2018-01-30 10:24:02 -08:00
parent dafbc04a73
commit 6b775cd786
12 changed files with 380 additions and 245 deletions

View File

@ -51,6 +51,8 @@
- Add [`raftAppliedIndex` field to `etcdserverpb.StatusResponse`](https://github.com/coreos/etcd/pull/9176) for current Raft applied index. - Add [`raftAppliedIndex` field to `etcdserverpb.StatusResponse`](https://github.com/coreos/etcd/pull/9176) for current Raft applied index.
- Add [`errors` field to `etcdserverpb.StatusResponse`](https://github.com/coreos/etcd/pull/9206) for server-side error. - Add [`errors` field to `etcdserverpb.StatusResponse`](https://github.com/coreos/etcd/pull/9206) for server-side error.
- e.g. `"etcdserver: no leader", "NOSPACE", "CORRUPT"` - e.g. `"etcdserver: no leader", "NOSPACE", "CORRUPT"`
- Add [`dbSizeInUse` field to `etcdserverpb.StatusResponse`](https://github.com/coreos/etcd/pull/9256) for actual DB size after compaction.
- Also exposed as metric `etcd_debugging_mvcc_db_total_size_in_use_in_bytes`
### Added(v3 `etcdctl`) ### Added(v3 `etcdctl`)

View File

@ -2164,7 +2164,12 @@
"type": "object", "type": "object",
"properties": { "properties": {
"dbSize": { "dbSize": {
"description": "dbSize is the size of the backend database, in bytes, of the responding member.", "description": "dbSize is the size of the backend database physically allocated, in bytes, of the responding member.",
"type": "string",
"format": "int64"
},
"dbSizeInUse": {
"description": "dbSizeInUse is the size of the backend database logically in use, in bytes, of the responding member.",
"type": "string", "type": "string",
"format": "int64" "format": "int64"
}, },

View File

@ -104,6 +104,8 @@ $ ETCDCTL_API=3 etcdctl put newkey 123
OK OK
``` ```
The metric `etcd_debugging_mvcc_db_total_size_in_use_in_bytes` indicates the actual database usage after a history compaction, while `etcd_debugging_mvcc_db_total_size_in_bytes` shows the database size including free space waiting for defragmentation. The latter increases only when the former equals to it, meaning when both of these metrics are close to the quota, a history compaction is required to avoid triggering the space quota.
## Snapshot backup ## Snapshot backup
Snapshotting the `etcd` cluster on a regular basis serves as a durable backup for an etcd keyspace. By taking periodic snapshots of an etcd member's backend database, an `etcd` cluster can be recovered to a point in time with a known good state. Snapshotting the `etcd` cluster on a regular basis serves as a durable backup for an etcd keyspace. By taking periodic snapshots of an etcd member's backend database, an `etcd` cluster can be recovered to a point in time with a known good state.

View File

@ -164,6 +164,7 @@ func (ms *maintenanceServer) Status(ctx context.Context, ar *pb.StatusRequest) (
RaftIndex: ms.rg.Index(), RaftIndex: ms.rg.Index(),
RaftTerm: ms.rg.Term(), RaftTerm: ms.rg.Term(),
RaftAppliedIndex: ms.rg.AppliedIndex(), RaftAppliedIndex: ms.rg.AppliedIndex(),
DbSizeInUse: ms.bg.Backend().SizeInUse(),
} }
if uint64(ms.rg.Leader()) == raft.None { if uint64(ms.rg.Leader()) == raft.None {
resp.Errors = append(resp.Errors, etcdserver.ErrNoLeader.Error()) resp.Errors = append(resp.Errors, etcdserver.ErrNoLeader.Error())

View File

@ -2436,7 +2436,7 @@ type StatusResponse struct {
Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"`
// version is the cluster protocol version used by the responding member. // version is the cluster protocol version used by the responding member.
Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
// dbSize is the size of the backend database, in bytes, of the responding member. // dbSize is the size of the backend database physically allocated, in bytes, of the responding member.
DbSize int64 `protobuf:"varint,3,opt,name=dbSize,proto3" json:"dbSize,omitempty"` DbSize int64 `protobuf:"varint,3,opt,name=dbSize,proto3" json:"dbSize,omitempty"`
// leader is the member ID which the responding member believes is the current leader. // leader is the member ID which the responding member believes is the current leader.
Leader uint64 `protobuf:"varint,4,opt,name=leader,proto3" json:"leader,omitempty"` Leader uint64 `protobuf:"varint,4,opt,name=leader,proto3" json:"leader,omitempty"`
@ -2448,6 +2448,8 @@ type StatusResponse struct {
RaftAppliedIndex uint64 `protobuf:"varint,7,opt,name=raftAppliedIndex,proto3" json:"raftAppliedIndex,omitempty"` RaftAppliedIndex uint64 `protobuf:"varint,7,opt,name=raftAppliedIndex,proto3" json:"raftAppliedIndex,omitempty"`
// errors contains alarm/health information and status. // errors contains alarm/health information and status.
Errors []string `protobuf:"bytes,8,rep,name=errors" json:"errors,omitempty"` Errors []string `protobuf:"bytes,8,rep,name=errors" json:"errors,omitempty"`
// dbSizeInUse is the size of the backend database logically in use, in bytes, of the responding member.
DbSizeInUse int64 `protobuf:"varint,9,opt,name=dbSizeInUse,proto3" json:"dbSizeInUse,omitempty"`
} }
func (m *StatusResponse) Reset() { *m = StatusResponse{} } func (m *StatusResponse) Reset() { *m = StatusResponse{} }
@ -2511,6 +2513,13 @@ func (m *StatusResponse) GetErrors() []string {
return nil return nil
} }
func (m *StatusResponse) GetDbSizeInUse() int64 {
if m != nil {
return m.DbSizeInUse
}
return 0
}
type AuthEnableRequest struct { type AuthEnableRequest struct {
} }
@ -7034,6 +7043,11 @@ func (m *StatusResponse) MarshalTo(dAtA []byte) (int, error) {
i += copy(dAtA[i:], s) i += copy(dAtA[i:], s)
} }
} }
if m.DbSizeInUse != 0 {
dAtA[i] = 0x48
i++
i = encodeVarintRpc(dAtA, i, uint64(m.DbSizeInUse))
}
return i, nil return i, nil
} }
@ -8906,6 +8920,9 @@ func (m *StatusResponse) Size() (n int) {
n += 1 + l + sovRpc(uint64(l)) n += 1 + l + sovRpc(uint64(l))
} }
} }
if m.DbSizeInUse != 0 {
n += 1 + sovRpc(uint64(m.DbSizeInUse))
}
return n return n
} }
@ -15578,6 +15595,25 @@ func (m *StatusResponse) Unmarshal(dAtA []byte) error {
} }
m.Errors = append(m.Errors, string(dAtA[iNdEx:postIndex])) m.Errors = append(m.Errors, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex iNdEx = postIndex
case 9:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field DbSizeInUse", wireType)
}
m.DbSizeInUse = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowRpc
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.DbSizeInUse |= (int64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipRpc(dAtA[iNdEx:]) skippy, err := skipRpc(dAtA[iNdEx:])
@ -18566,237 +18602,238 @@ var (
func init() { proto.RegisterFile("rpc.proto", fileDescriptorRpc) } func init() { proto.RegisterFile("rpc.proto", fileDescriptorRpc) }
var fileDescriptorRpc = []byte{ var fileDescriptorRpc = []byte{
// 3708 bytes of a gzipped FileDescriptorProto // 3724 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0x5b, 0x6f, 0x1b, 0x49, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0x4b, 0x6f, 0x1b, 0x4b,
0x76, 0x56, 0x93, 0xe2, 0xed, 0xf0, 0x22, 0xba, 0x24, 0xdb, 0x34, 0x6d, 0xcb, 0x72, 0xf9, 0x26, 0x76, 0x56, 0x93, 0xe2, 0xeb, 0xf0, 0x21, 0xba, 0x24, 0xdb, 0x34, 0x6d, 0xcb, 0x72, 0xf9, 0x25,
0x5f, 0x46, 0xdc, 0xd5, 0x6e, 0xf2, 0xe0, 0x04, 0x8b, 0x95, 0x25, 0xae, 0xa5, 0x95, 0x2c, 0x69, 0x3f, 0xae, 0x38, 0xa3, 0x99, 0x64, 0xe1, 0x04, 0x83, 0x91, 0x25, 0x8e, 0xa5, 0x91, 0x2c, 0x69,
0x5b, 0x94, 0x67, 0x02, 0x6c, 0x22, 0xb4, 0xc8, 0x92, 0xd4, 0x11, 0xd9, 0xcd, 0x74, 0x37, 0x69, 0x5a, 0x94, 0xef, 0x0d, 0x30, 0x89, 0xd0, 0x22, 0x4b, 0x52, 0x47, 0x64, 0x37, 0xd3, 0xdd, 0xa4,
0xc9, 0x59, 0x24, 0xc0, 0x66, 0x13, 0xe4, 0x25, 0x79, 0xc8, 0x02, 0x41, 0x92, 0xd7, 0x20, 0x58, 0x25, 0x67, 0x90, 0x00, 0x93, 0x49, 0x90, 0x4d, 0x36, 0x19, 0x20, 0x48, 0xb2, 0x0d, 0x82, 0xc1,
0xec, 0x0f, 0x18, 0xe4, 0x2f, 0xe4, 0x2d, 0x01, 0xf2, 0x07, 0x82, 0x49, 0x5e, 0xf2, 0x0b, 0x72, 0xec, 0xb2, 0xb9, 0xc8, 0x5f, 0xc8, 0x2e, 0x01, 0xf2, 0x07, 0x82, 0x9b, 0x6c, 0xf2, 0x0b, 0xf2,
0x79, 0x5a, 0xd4, 0xad, 0xbb, 0xfa, 0x46, 0x69, 0x86, 0x33, 0xf3, 0x22, 0x77, 0x9d, 0x3e, 0x75, 0x58, 0x0d, 0xea, 0xd5, 0x5d, 0xfd, 0xa2, 0x74, 0x2f, 0xef, 0xbd, 0x1b, 0xb9, 0xeb, 0xd4, 0xa9,
0xce, 0xa9, 0x53, 0x75, 0x2e, 0xf5, 0x35, 0x0d, 0x25, 0x67, 0xd8, 0x5d, 0x19, 0x3a, 0xb6, 0x67, 0x73, 0x4e, 0x9d, 0xaa, 0x73, 0x4e, 0xd5, 0x57, 0x34, 0x94, 0x9c, 0x61, 0x77, 0x65, 0xe8, 0xd8,
0xa3, 0x0a, 0xf1, 0xba, 0x3d, 0x97, 0x38, 0x63, 0xe2, 0x0c, 0x8f, 0x9b, 0x0b, 0xa7, 0xf6, 0xa9, 0x9e, 0x8d, 0x2a, 0xc4, 0xeb, 0xf6, 0x5c, 0xe2, 0x8c, 0x89, 0x33, 0x3c, 0x6e, 0x2e, 0x9c, 0xda,
0xcd, 0x5e, 0xb4, 0xe8, 0x13, 0xe7, 0x69, 0x62, 0xca, 0xd3, 0x32, 0x2d, 0x8f, 0x38, 0x96, 0xd1, 0xa7, 0x36, 0xeb, 0x68, 0xd1, 0x2f, 0xce, 0xd3, 0xc4, 0x94, 0xa7, 0x65, 0x5a, 0x1e, 0x71, 0x2c,
0x6f, 0x0d, 0xc6, 0xdd, 0x2e, 0xfb, 0x33, 0x3c, 0x6e, 0x9d, 0x8f, 0x05, 0xcf, 0xe3, 0x30, 0x8f, 0xa3, 0xdf, 0x1a, 0x8c, 0xbb, 0x5d, 0xf6, 0x67, 0x78, 0xdc, 0x3a, 0x1f, 0x0b, 0x9e, 0xc7, 0x61,
0x31, 0xf2, 0xce, 0xd8, 0x9f, 0xe1, 0x31, 0xfb, 0x47, 0x70, 0xdd, 0x3b, 0xb5, 0xed, 0xd3, 0x3e, 0x1e, 0x63, 0xe4, 0x9d, 0xb1, 0x3f, 0xc3, 0x63, 0xf6, 0x8f, 0xe0, 0xba, 0x77, 0x6a, 0xdb, 0xa7,
0x69, 0x19, 0x43, 0xb3, 0x65, 0x58, 0x96, 0xed, 0x19, 0x9e, 0x69, 0x5b, 0x2e, 0x7f, 0x8b, 0xff, 0x7d, 0xd2, 0x32, 0x86, 0x66, 0xcb, 0xb0, 0x2c, 0xdb, 0x33, 0x3c, 0xd3, 0xb6, 0x5c, 0xde, 0x8b,
0x5c, 0x83, 0x9a, 0x4e, 0xdc, 0xa1, 0x6d, 0xb9, 0x64, 0x93, 0x18, 0x3d, 0xe2, 0xa0, 0xfb, 0x00, 0xff, 0x5c, 0x83, 0x9a, 0x4e, 0xdc, 0xa1, 0x6d, 0xb9, 0x64, 0x93, 0x18, 0x3d, 0xe2, 0xa0, 0xfb,
0xdd, 0xfe, 0xc8, 0xf5, 0x88, 0x73, 0x64, 0xf6, 0x1a, 0xda, 0x92, 0xb6, 0x3c, 0xab, 0x97, 0x04, 0x00, 0xdd, 0xfe, 0xc8, 0xf5, 0x88, 0x73, 0x64, 0xf6, 0x1a, 0xda, 0x92, 0xb6, 0x3c, 0xab, 0x97,
0x65, 0xab, 0x87, 0xee, 0x42, 0x69, 0x40, 0x06, 0xc7, 0xfc, 0x6d, 0x86, 0xbd, 0x2d, 0x72, 0xc2, 0x04, 0x65, 0xab, 0x87, 0xee, 0x42, 0x69, 0x40, 0x06, 0xc7, 0xbc, 0x37, 0xc3, 0x7a, 0x8b, 0x9c,
0x56, 0x0f, 0x35, 0xa1, 0xe8, 0x90, 0xb1, 0xe9, 0x9a, 0xb6, 0xd5, 0xc8, 0x2e, 0x69, 0xcb, 0x59, 0xb0, 0xd5, 0x43, 0x4d, 0x28, 0x3a, 0x64, 0x6c, 0xba, 0xa6, 0x6d, 0x35, 0xb2, 0x4b, 0xda, 0x72,
0xdd, 0x1f, 0xd3, 0x89, 0x8e, 0x71, 0xe2, 0x1d, 0x79, 0xc4, 0x19, 0x34, 0x66, 0xf9, 0x44, 0x4a, 0x56, 0xf7, 0xdb, 0x74, 0xa0, 0x63, 0x9c, 0x78, 0x47, 0x1e, 0x71, 0x06, 0x8d, 0x59, 0x3e, 0x90,
0xe8, 0x10, 0x67, 0x80, 0x7f, 0x91, 0x83, 0x8a, 0x6e, 0x58, 0xa7, 0x44, 0x27, 0x7f, 0x34, 0x22, 0x12, 0x3a, 0xc4, 0x19, 0xe0, 0x5f, 0xe4, 0xa0, 0xa2, 0x1b, 0xd6, 0x29, 0xd1, 0xc9, 0x1f, 0x8d,
0xae, 0x87, 0xea, 0x90, 0x3d, 0x27, 0x97, 0x4c, 0x7d, 0x45, 0xa7, 0x8f, 0x7c, 0xbe, 0x75, 0x4a, 0x88, 0xeb, 0xa1, 0x3a, 0x64, 0xcf, 0xc9, 0x25, 0x53, 0x5f, 0xd1, 0xe9, 0x27, 0x1f, 0x6f, 0x9d,
0x8e, 0x88, 0xc5, 0x15, 0x57, 0xe8, 0x7c, 0xeb, 0x94, 0xb4, 0xad, 0x1e, 0x5a, 0x80, 0x5c, 0xdf, 0x92, 0x23, 0x62, 0x71, 0xc5, 0x15, 0x3a, 0xde, 0x3a, 0x25, 0x6d, 0xab, 0x87, 0x16, 0x20, 0xd7,
0x1c, 0x98, 0x9e, 0xd0, 0xca, 0x07, 0x21, 0x73, 0x66, 0x23, 0xe6, 0xac, 0x03, 0xb8, 0xb6, 0xe3, 0x37, 0x07, 0xa6, 0x27, 0xb4, 0xf2, 0x46, 0xc8, 0x9c, 0xd9, 0x88, 0x39, 0xeb, 0x00, 0xae, 0xed,
0x1d, 0xd9, 0x4e, 0x8f, 0x38, 0x8d, 0xdc, 0x92, 0xb6, 0x5c, 0x5b, 0x7d, 0xbc, 0xa2, 0x6e, 0xcd, 0x78, 0x47, 0xb6, 0xd3, 0x23, 0x4e, 0x23, 0xb7, 0xa4, 0x2d, 0xd7, 0x56, 0x1f, 0xaf, 0xa8, 0x4b,
0x8a, 0x6a, 0xd0, 0xca, 0x81, 0xed, 0x78, 0x7b, 0x94, 0x57, 0x2f, 0xb9, 0xf2, 0x11, 0xfd, 0x08, 0xb3, 0xa2, 0x1a, 0xb4, 0x72, 0x60, 0x3b, 0xde, 0x1e, 0xe5, 0xd5, 0x4b, 0xae, 0xfc, 0x44, 0x3f,
0xca, 0x4c, 0x88, 0x67, 0x38, 0xa7, 0xc4, 0x6b, 0xe4, 0x99, 0x94, 0x27, 0x57, 0x48, 0xe9, 0x30, 0x82, 0x32, 0x13, 0xe2, 0x19, 0xce, 0x29, 0xf1, 0x1a, 0x79, 0x26, 0xe5, 0xc9, 0x15, 0x52, 0x3a,
0x66, 0x9d, 0xa9, 0xe7, 0xcf, 0x08, 0x43, 0xc5, 0x25, 0x8e, 0x69, 0xf4, 0xcd, 0x8f, 0xc6, 0x71, 0x8c, 0x59, 0x67, 0xea, 0xf9, 0x37, 0xc2, 0x50, 0x71, 0x89, 0x63, 0x1a, 0x7d, 0xf3, 0xa3, 0x71,
0x9f, 0x34, 0x0a, 0x4b, 0xda, 0x72, 0x51, 0x0f, 0xd1, 0xe8, 0xfa, 0xcf, 0xc9, 0xa5, 0x7b, 0x64, 0xdc, 0x27, 0x8d, 0xc2, 0x92, 0xb6, 0x5c, 0xd4, 0x43, 0x34, 0x3a, 0xff, 0x73, 0x72, 0xe9, 0x1e,
0x5b, 0xfd, 0xcb, 0x46, 0x91, 0x31, 0x14, 0x29, 0x61, 0xcf, 0xea, 0x5f, 0xb2, 0x4d, 0xb3, 0x47, 0xd9, 0x56, 0xff, 0xb2, 0x51, 0x64, 0x0c, 0x45, 0x4a, 0xd8, 0xb3, 0xfa, 0x97, 0x6c, 0xd1, 0xec,
0x96, 0xc7, 0xdf, 0x96, 0xd8, 0xdb, 0x12, 0xa3, 0xb0, 0xd7, 0xcb, 0x50, 0x1f, 0x98, 0xd6, 0xd1, 0x91, 0xe5, 0xf1, 0xde, 0x12, 0xeb, 0x2d, 0x31, 0x0a, 0xeb, 0x5e, 0x86, 0xfa, 0xc0, 0xb4, 0x8e,
0xc0, 0xee, 0x1d, 0xf9, 0x0e, 0x01, 0xe6, 0x90, 0xda, 0xc0, 0xb4, 0xde, 0xd9, 0x3d, 0x5d, 0xba, 0x06, 0x76, 0xef, 0xc8, 0x77, 0x08, 0x30, 0x87, 0xd4, 0x06, 0xa6, 0xf5, 0xce, 0xee, 0xe9, 0xd2,
0x85, 0x72, 0x1a, 0x17, 0x61, 0xce, 0xb2, 0xe0, 0x34, 0x2e, 0x54, 0xce, 0x15, 0x98, 0xa7, 0x32, 0x2d, 0x94, 0xd3, 0xb8, 0x08, 0x73, 0x96, 0x05, 0xa7, 0x71, 0xa1, 0x72, 0xae, 0xc0, 0x3c, 0x95,
0xbb, 0x0e, 0x31, 0x3c, 0x12, 0x30, 0x57, 0x18, 0xf3, 0x8d, 0x81, 0x69, 0xad, 0xb3, 0x37, 0x21, 0xd9, 0x75, 0x88, 0xe1, 0x91, 0x80, 0xb9, 0xc2, 0x98, 0x6f, 0x0c, 0x4c, 0x6b, 0x9d, 0xf5, 0x84,
0x7e, 0xe3, 0x22, 0xc6, 0x5f, 0x15, 0xfc, 0xc6, 0x45, 0x98, 0x1f, 0xaf, 0x40, 0xc9, 0xf7, 0x39, 0xf8, 0x8d, 0x8b, 0x18, 0x7f, 0x55, 0xf0, 0x1b, 0x17, 0x61, 0x7e, 0xbc, 0x02, 0x25, 0xdf, 0xe7,
0x2a, 0xc2, 0xec, 0xee, 0xde, 0x6e, 0xbb, 0x3e, 0x83, 0x00, 0xf2, 0x6b, 0x07, 0xeb, 0xed, 0xdd, 0xa8, 0x08, 0xb3, 0xbb, 0x7b, 0xbb, 0xed, 0xfa, 0x0c, 0x02, 0xc8, 0xaf, 0x1d, 0xac, 0xb7, 0x77,
0x8d, 0xba, 0x86, 0xca, 0x50, 0xd8, 0x68, 0xf3, 0x41, 0x06, 0xbf, 0x01, 0x08, 0xbc, 0x8b, 0x0a, 0x37, 0xea, 0x1a, 0x2a, 0x43, 0x61, 0xa3, 0xcd, 0x1b, 0x19, 0xfc, 0x06, 0x20, 0xf0, 0x2e, 0x2a,
0x90, 0xdd, 0x6e, 0xff, 0x5e, 0x7d, 0x86, 0xf2, 0xbc, 0x6f, 0xeb, 0x07, 0x5b, 0x7b, 0xbb, 0x75, 0x40, 0x76, 0xbb, 0xfd, 0x7b, 0xf5, 0x19, 0xca, 0xf3, 0xbe, 0xad, 0x1f, 0x6c, 0xed, 0xed, 0xd6,
0x8d, 0x4e, 0x5e, 0xd7, 0xdb, 0x6b, 0x9d, 0x76, 0x3d, 0x43, 0x39, 0xde, 0xed, 0x6d, 0xd4, 0xb3, 0x35, 0x3a, 0x78, 0x5d, 0x6f, 0xaf, 0x75, 0xda, 0xf5, 0x0c, 0xe5, 0x78, 0xb7, 0xb7, 0x51, 0xcf,
0xa8, 0x04, 0xb9, 0xf7, 0x6b, 0x3b, 0x87, 0xed, 0xfa, 0x2c, 0xfe, 0xa5, 0x06, 0x55, 0xb1, 0x5f, 0xa2, 0x12, 0xe4, 0xde, 0xaf, 0xed, 0x1c, 0xb6, 0xeb, 0xb3, 0xf8, 0x97, 0x1a, 0x54, 0xc5, 0x7a,
0x3c, 0x26, 0xd0, 0xf7, 0x21, 0x7f, 0xc6, 0xe2, 0x82, 0x1d, 0xc5, 0xf2, 0xea, 0xbd, 0xc8, 0xe6, 0xf1, 0x98, 0x40, 0xdf, 0x87, 0xfc, 0x19, 0x8b, 0x0b, 0xb6, 0x15, 0xcb, 0xab, 0xf7, 0x22, 0x8b,
0x86, 0x62, 0x47, 0x17, 0xbc, 0x08, 0x43, 0xf6, 0x7c, 0xec, 0x36, 0x32, 0x4b, 0xd9, 0xe5, 0xf2, 0x1b, 0x8a, 0x1d, 0x5d, 0xf0, 0x22, 0x0c, 0xd9, 0xf3, 0xb1, 0xdb, 0xc8, 0x2c, 0x65, 0x97, 0xcb,
0x6a, 0x7d, 0x85, 0x47, 0xee, 0xca, 0x36, 0xb9, 0x7c, 0x6f, 0xf4, 0x47, 0x44, 0xa7, 0x2f, 0x11, 0xab, 0xf5, 0x15, 0x1e, 0xb9, 0x2b, 0xdb, 0xe4, 0xf2, 0xbd, 0xd1, 0x1f, 0x11, 0x9d, 0x76, 0x22,
0x82, 0xd9, 0x81, 0xed, 0x10, 0x76, 0x62, 0x8b, 0x3a, 0x7b, 0xa6, 0xc7, 0x98, 0x6d, 0x9a, 0x38, 0x04, 0xb3, 0x03, 0xdb, 0x21, 0x6c, 0xc7, 0x16, 0x75, 0xf6, 0x4d, 0xb7, 0x31, 0x5b, 0x34, 0xb1,
0xad, 0x7c, 0x80, 0x7f, 0xad, 0x01, 0xec, 0x8f, 0xbc, 0xf4, 0xd0, 0x58, 0x80, 0xdc, 0x98, 0x0a, 0x5b, 0x79, 0x03, 0xff, 0x5a, 0x03, 0xd8, 0x1f, 0x79, 0xe9, 0xa1, 0xb1, 0x00, 0xb9, 0x31, 0x15,
0x16, 0x61, 0xc1, 0x07, 0x2c, 0x26, 0x88, 0xe1, 0x12, 0x3f, 0x26, 0xe8, 0x00, 0xdd, 0x86, 0xc2, 0x2c, 0xc2, 0x82, 0x37, 0x58, 0x4c, 0x10, 0xc3, 0x25, 0x7e, 0x4c, 0xd0, 0x06, 0xba, 0x0d, 0x85,
0xd0, 0x21, 0xe3, 0xa3, 0xf3, 0x31, 0x53, 0x52, 0xd4, 0xf3, 0x74, 0xb8, 0x3d, 0x46, 0x0f, 0xa1, 0xa1, 0x43, 0xc6, 0x47, 0xe7, 0x63, 0xa6, 0xa4, 0xa8, 0xe7, 0x69, 0x73, 0x7b, 0x8c, 0x1e, 0x42,
0x62, 0x9e, 0x5a, 0xb6, 0x43, 0x8e, 0xb8, 0xac, 0x1c, 0x7b, 0x5b, 0xe6, 0x34, 0x66, 0xb7, 0xc2, 0xc5, 0x3c, 0xb5, 0x6c, 0x87, 0x1c, 0x71, 0x59, 0x39, 0xd6, 0x5b, 0xe6, 0x34, 0x66, 0xb7, 0xc2,
0xc2, 0x05, 0xe7, 0x55, 0x96, 0x1d, 0x4a, 0xc2, 0x16, 0x94, 0x99, 0xa9, 0x53, 0xb9, 0xef, 0x79, 0xc2, 0x05, 0xe7, 0x55, 0x96, 0x1d, 0x4a, 0xc2, 0x16, 0x94, 0x99, 0xa9, 0x53, 0xb9, 0xef, 0x79,
0x60, 0x63, 0x86, 0x4d, 0x8b, 0xbb, 0x50, 0x58, 0x8d, 0x7f, 0x0a, 0x68, 0x83, 0xf4, 0x89, 0x47, 0x60, 0x63, 0x86, 0x0d, 0x8b, 0xbb, 0x50, 0x58, 0x8d, 0x7f, 0x0a, 0x68, 0x83, 0xf4, 0x89, 0x47,
0xa6, 0xc9, 0x1e, 0x8a, 0x4f, 0xb2, 0xaa, 0x4f, 0xf0, 0xdf, 0x68, 0x30, 0x1f, 0x12, 0x3f, 0xd5, 0xa6, 0xc9, 0x1e, 0x8a, 0x4f, 0xb2, 0xaa, 0x4f, 0xf0, 0x5f, 0x6b, 0x30, 0x1f, 0x12, 0x3f, 0xd5,
0xb2, 0x1a, 0x50, 0xe8, 0x31, 0x61, 0xdc, 0x82, 0xac, 0x2e, 0x87, 0xe8, 0x25, 0x14, 0x85, 0x01, 0xb4, 0x1a, 0x50, 0xe8, 0x31, 0x61, 0xdc, 0x82, 0xac, 0x2e, 0x9b, 0xe8, 0x25, 0x14, 0x85, 0x01,
0x6e, 0x23, 0x9b, 0x72, 0x68, 0x0a, 0xdc, 0x26, 0x17, 0xff, 0x3a, 0x03, 0x25, 0xb1, 0xd0, 0xbd, 0x6e, 0x23, 0x9b, 0xb2, 0x69, 0x0a, 0xdc, 0x26, 0x17, 0xff, 0x3a, 0x03, 0x25, 0x31, 0xd1, 0xbd,
0x21, 0x5a, 0x83, 0xaa, 0xc3, 0x07, 0x47, 0x6c, 0x3d, 0xc2, 0xa2, 0x66, 0x7a, 0x12, 0xda, 0x9c, 0x21, 0x5a, 0x83, 0xaa, 0xc3, 0x1b, 0x47, 0x6c, 0x3e, 0xc2, 0xa2, 0x66, 0x7a, 0x12, 0xda, 0x9c,
0xd1, 0x2b, 0x62, 0x0a, 0x23, 0xa3, 0xdf, 0x81, 0xb2, 0x14, 0x31, 0x1c, 0x79, 0xc2, 0xe5, 0x8d, 0xd1, 0x2b, 0x62, 0x08, 0x23, 0xa3, 0xdf, 0x81, 0xb2, 0x14, 0x31, 0x1c, 0x79, 0xc2, 0xe5, 0x8d,
0xb0, 0x80, 0xe0, 0xfc, 0x6d, 0xce, 0xe8, 0x20, 0xd8, 0xf7, 0x47, 0x1e, 0xea, 0xc0, 0x82, 0x9c, 0xb0, 0x80, 0x60, 0xff, 0x6d, 0xce, 0xe8, 0x20, 0xd8, 0xf7, 0x47, 0x1e, 0xea, 0xc0, 0x82, 0x1c,
0xcc, 0x57, 0x23, 0xcc, 0xc8, 0x32, 0x29, 0x4b, 0x61, 0x29, 0xf1, 0xad, 0xda, 0x9c, 0xd1, 0x91, 0xcc, 0x67, 0x23, 0xcc, 0xc8, 0x32, 0x29, 0x4b, 0x61, 0x29, 0xf1, 0xa5, 0xda, 0x9c, 0xd1, 0x91,
0x98, 0xaf, 0xbc, 0x54, 0x4d, 0xf2, 0x2e, 0x78, 0xf2, 0x8e, 0x99, 0xd4, 0xb9, 0xb0, 0xe2, 0x26, 0x18, 0xaf, 0x74, 0xaa, 0x26, 0x79, 0x17, 0x3c, 0x79, 0xc7, 0x4c, 0xea, 0x5c, 0x58, 0x71, 0x93,
0x75, 0x2e, 0xac, 0x37, 0x25, 0x28, 0x88, 0x11, 0xfe, 0xe7, 0x0c, 0x80, 0xdc, 0x8d, 0xbd, 0x21, 0x3a, 0x17, 0xd6, 0x9b, 0x12, 0x14, 0x44, 0x0b, 0xff, 0x73, 0x06, 0x40, 0xae, 0xc6, 0xde, 0x10,
0xda, 0x80, 0x9a, 0x23, 0x46, 0x21, 0x6f, 0xdd, 0x4d, 0xf4, 0x96, 0xd8, 0xc4, 0x19, 0xbd, 0x2a, 0x6d, 0x40, 0xcd, 0x11, 0xad, 0x90, 0xb7, 0xee, 0x26, 0x7a, 0x4b, 0x2c, 0xe2, 0x8c, 0x5e, 0x95,
0x27, 0x71, 0xe3, 0x7e, 0x00, 0x15, 0x5f, 0x4a, 0xe0, 0xb0, 0x3b, 0x09, 0x0e, 0xf3, 0x25, 0x94, 0x83, 0xb8, 0x71, 0x3f, 0x80, 0x8a, 0x2f, 0x25, 0x70, 0xd8, 0x9d, 0x04, 0x87, 0xf9, 0x12, 0xca,
0xe5, 0x04, 0xea, 0xb2, 0x4f, 0xe1, 0xa6, 0x3f, 0x3f, 0xc1, 0x67, 0x0f, 0x27, 0xf8, 0xcc, 0x17, 0x72, 0x00, 0x75, 0xd9, 0xa7, 0x70, 0xd3, 0x1f, 0x9f, 0xe0, 0xb3, 0x87, 0x13, 0x7c, 0xe6, 0x0b,
0x38, 0x2f, 0x25, 0xa8, 0x5e, 0x53, 0x0d, 0x0b, 0xdc, 0x76, 0x27, 0xc1, 0x6d, 0x71, 0xc3, 0xa8, 0x9c, 0x97, 0x12, 0x54, 0xaf, 0xa9, 0x86, 0x05, 0x6e, 0xbb, 0x93, 0xe0, 0xb6, 0xb8, 0x61, 0xd4,
0xe3, 0x80, 0xd6, 0x4b, 0x3e, 0xc4, 0xff, 0x9d, 0x85, 0xc2, 0xba, 0x3d, 0x18, 0x1a, 0x0e, 0xdd, 0x71, 0x40, 0xeb, 0x25, 0x6f, 0xe2, 0xff, 0xce, 0x42, 0x61, 0xdd, 0x1e, 0x0c, 0x0d, 0x87, 0xae,
0x8d, 0xbc, 0x43, 0xdc, 0x51, 0xdf, 0x63, 0xee, 0xaa, 0xad, 0x3e, 0x0a, 0x4b, 0x14, 0x6c, 0xf2, 0x46, 0xde, 0x21, 0xee, 0xa8, 0xef, 0x31, 0x77, 0xd5, 0x56, 0x1f, 0x85, 0x25, 0x0a, 0x36, 0xf9,
0x5f, 0x9d, 0xb1, 0xea, 0x62, 0x0a, 0x9d, 0x2c, 0xca, 0x63, 0xe6, 0x1a, 0x93, 0x45, 0x71, 0x14, 0xaf, 0xce, 0x58, 0x75, 0x31, 0x84, 0x0e, 0x16, 0xe5, 0x31, 0x73, 0x8d, 0xc1, 0xa2, 0x38, 0x8a,
0x53, 0x64, 0x20, 0x67, 0x83, 0x40, 0x6e, 0x42, 0x61, 0x4c, 0x9c, 0xa0, 0xa4, 0x6f, 0xce, 0xe8, 0x21, 0x32, 0x90, 0xb3, 0x41, 0x20, 0x37, 0xa1, 0x30, 0x26, 0x4e, 0x50, 0xd2, 0x37, 0x67, 0x74,
0x92, 0x80, 0x9e, 0xc3, 0x5c, 0xb4, 0xbc, 0xe4, 0x04, 0x4f, 0xad, 0x1b, 0xae, 0x46, 0x8f, 0xa0, 0x49, 0x40, 0xcf, 0x61, 0x2e, 0x5a, 0x5e, 0x72, 0x82, 0xa7, 0xd6, 0x0d, 0x57, 0xa3, 0x47, 0x50,
0x12, 0xaa, 0x71, 0x79, 0xc1, 0x57, 0x1e, 0x28, 0x25, 0xee, 0x96, 0xcc, 0xab, 0xb4, 0x1e, 0x57, 0x09, 0xd5, 0xb8, 0xbc, 0xe0, 0x2b, 0x0f, 0x94, 0x12, 0x77, 0x4b, 0xe6, 0x55, 0x5a, 0x8f, 0x2b,
0x36, 0x67, 0x64, 0x66, 0xbd, 0x25, 0x33, 0x6b, 0x51, 0xcc, 0x12, 0xb9, 0x35, 0x94, 0x64, 0x7e, 0x9b, 0x33, 0x32, 0xb3, 0xde, 0x92, 0x99, 0xb5, 0x28, 0x46, 0x89, 0xdc, 0x1a, 0x4a, 0x32, 0x3f,
0x18, 0x4e, 0x32, 0xf8, 0x87, 0x50, 0x0d, 0x39, 0x88, 0xd6, 0x9d, 0xf6, 0x4f, 0x0e, 0xd7, 0x76, 0x0c, 0x27, 0x19, 0xfc, 0x43, 0xa8, 0x86, 0x1c, 0x44, 0xeb, 0x4e, 0xfb, 0x27, 0x87, 0x6b, 0x3b,
0x78, 0x91, 0x7a, 0xcb, 0xea, 0x92, 0x5e, 0xd7, 0x68, 0xad, 0xdb, 0x69, 0x1f, 0x1c, 0xd4, 0x33, 0xbc, 0x48, 0xbd, 0x65, 0x75, 0x49, 0xaf, 0x6b, 0xb4, 0xd6, 0xed, 0xb4, 0x0f, 0x0e, 0xea, 0x19,
0xa8, 0x0a, 0xa5, 0xdd, 0xbd, 0xce, 0x11, 0xe7, 0xca, 0xe2, 0xb7, 0xbe, 0x04, 0x51, 0xe4, 0x94, 0x54, 0x85, 0xd2, 0xee, 0x5e, 0xe7, 0x88, 0x73, 0x65, 0xf1, 0x5b, 0x5f, 0x82, 0x28, 0x72, 0x4a,
0xda, 0x36, 0xa3, 0xd4, 0x36, 0x4d, 0xd6, 0xb6, 0x4c, 0x50, 0xdb, 0x58, 0x99, 0xdb, 0x69, 0xaf, 0x6d, 0x9b, 0x51, 0x6a, 0x9b, 0x26, 0x6b, 0x5b, 0x26, 0xa8, 0x6d, 0xac, 0xcc, 0xed, 0xb4, 0xd7,
0x1d, 0xb4, 0xeb, 0xb3, 0x6f, 0x6a, 0x50, 0xe1, 0xfe, 0x3d, 0x1a, 0x59, 0xb4, 0xd4, 0xfe, 0xa3, 0x0e, 0xda, 0xf5, 0xd9, 0x37, 0x35, 0xa8, 0x70, 0xff, 0x1e, 0x8d, 0x2c, 0x5a, 0x6a, 0xff, 0x41,
0x06, 0x10, 0x44, 0x13, 0x6a, 0x41, 0xa1, 0xcb, 0xf5, 0x34, 0x34, 0x96, 0x8c, 0x6e, 0x26, 0x6e, 0x03, 0x08, 0xa2, 0x09, 0xb5, 0xa0, 0xd0, 0xe5, 0x7a, 0x1a, 0x1a, 0x4b, 0x46, 0x37, 0x13, 0x97,
0x99, 0x2e, 0xb9, 0xd0, 0x77, 0xa1, 0xe0, 0x8e, 0xba, 0x5d, 0xe2, 0xca, 0x92, 0x77, 0x3b, 0x9a, 0x4c, 0x97, 0x5c, 0xe8, 0xbb, 0x50, 0x70, 0x47, 0xdd, 0x2e, 0x71, 0x65, 0xc9, 0xbb, 0x1d, 0xcd,
0x0f, 0x45, 0xb6, 0xd2, 0x25, 0x1f, 0x9d, 0x72, 0x62, 0x98, 0xfd, 0x11, 0x2b, 0x80, 0x93, 0xa7, 0x87, 0x22, 0x5b, 0xe9, 0x92, 0x8f, 0x0e, 0x39, 0x31, 0xcc, 0xfe, 0x88, 0x15, 0xc0, 0xc9, 0x43,
0x08, 0x3e, 0xfc, 0xf7, 0x1a, 0x94, 0x95, 0xc3, 0xfb, 0x15, 0x93, 0xf0, 0x3d, 0x28, 0x31, 0x1b, 0x04, 0x1f, 0xfe, 0x3b, 0x0d, 0xca, 0xca, 0xe6, 0xfd, 0x8a, 0x49, 0xf8, 0x1e, 0x94, 0x98, 0x0d,
0x48, 0x4f, 0xa4, 0xe1, 0xa2, 0x1e, 0x10, 0xd0, 0x6f, 0x43, 0x49, 0x46, 0x80, 0xcc, 0xc4, 0x8d, 0xa4, 0x27, 0xd2, 0x70, 0x51, 0x0f, 0x08, 0xe8, 0xb7, 0xa1, 0x24, 0x23, 0x40, 0x66, 0xe2, 0x46,
0x64, 0xb1, 0x7b, 0x43, 0x3d, 0x60, 0xc5, 0xdb, 0x70, 0x83, 0x79, 0xa5, 0x4b, 0x9b, 0x6b, 0xe9, 0xb2, 0xd8, 0xbd, 0xa1, 0x1e, 0xb0, 0xe2, 0x6d, 0xb8, 0xc1, 0xbc, 0xd2, 0xa5, 0x87, 0x6b, 0xe9,
0x47, 0xb5, 0xfd, 0xd4, 0x22, 0xed, 0x67, 0x13, 0x8a, 0xc3, 0xb3, 0x4b, 0xd7, 0xec, 0x1a, 0x7d, 0x47, 0xf5, 0xf8, 0xa9, 0x45, 0x8e, 0x9f, 0x4d, 0x28, 0x0e, 0xcf, 0x2e, 0x5d, 0xb3, 0x6b, 0xf4,
0x61, 0x85, 0x3f, 0xc6, 0x3f, 0x06, 0xa4, 0x0a, 0x9b, 0x66, 0xb9, 0xb8, 0x0a, 0xe5, 0x4d, 0xc3, 0x85, 0x15, 0x7e, 0x1b, 0xff, 0x18, 0x90, 0x2a, 0x6c, 0x9a, 0xe9, 0xe2, 0x2a, 0x94, 0x37, 0x0d,
0x3d, 0x13, 0x26, 0xe1, 0x97, 0x50, 0xa5, 0xc3, 0xed, 0xf7, 0xd7, 0xb0, 0x91, 0x5d, 0x0e, 0x24, 0xf7, 0x4c, 0x98, 0x84, 0x5f, 0x42, 0x95, 0x36, 0xb7, 0xdf, 0x5f, 0xc3, 0x46, 0x76, 0x39, 0x90,
0xf7, 0x54, 0x3e, 0x47, 0x30, 0x7b, 0x66, 0xb8, 0x67, 0x6c, 0xa1, 0x55, 0x9d, 0x3d, 0xa3, 0xe7, 0xdc, 0x53, 0xf9, 0x1c, 0xc1, 0xec, 0x99, 0xe1, 0x9e, 0xb1, 0x89, 0x56, 0x75, 0xf6, 0x8d, 0x9e,
0x50, 0xef, 0xf2, 0x45, 0x1e, 0x45, 0xae, 0x0c, 0x73, 0x82, 0xee, 0x77, 0x82, 0x9f, 0x41, 0x85, 0x43, 0xbd, 0xcb, 0x27, 0x79, 0x14, 0xb9, 0x32, 0xcc, 0x09, 0xba, 0x7f, 0x12, 0xfc, 0x0c, 0x2a,
0xaf, 0xe1, 0xeb, 0x36, 0x02, 0xdf, 0x80, 0xb9, 0x03, 0xcb, 0x18, 0xba, 0x67, 0xb6, 0xac, 0x6e, 0x7c, 0x0e, 0x5f, 0xb7, 0x11, 0xf8, 0x06, 0xcc, 0x1d, 0x58, 0xc6, 0xd0, 0x3d, 0xb3, 0x65, 0x75,
0x74, 0xd1, 0xf5, 0x80, 0x36, 0x95, 0xc6, 0x67, 0x30, 0xe7, 0x90, 0x81, 0x61, 0x5a, 0xa6, 0x75, 0xa3, 0x93, 0xae, 0x07, 0xb4, 0xa9, 0x34, 0x3e, 0x83, 0x39, 0x87, 0x0c, 0x0c, 0xd3, 0x32, 0xad,
0x7a, 0x74, 0x7c, 0xe9, 0x11, 0x57, 0x5c, 0x98, 0x6a, 0x3e, 0xf9, 0x0d, 0xa5, 0x52, 0xd3, 0x8e, 0xd3, 0xa3, 0xe3, 0x4b, 0x8f, 0xb8, 0xe2, 0xc2, 0x54, 0xf3, 0xc9, 0x6f, 0x28, 0x95, 0x9a, 0x76,
0xfb, 0xf6, 0xb1, 0x48, 0x73, 0xec, 0x19, 0x7f, 0xae, 0x41, 0xe5, 0x53, 0xc3, 0xeb, 0xca, 0xad, 0xdc, 0xb7, 0x8f, 0x45, 0x9a, 0x63, 0xdf, 0xf8, 0x73, 0x0d, 0x2a, 0x9f, 0x1a, 0x5e, 0x57, 0x2e,
0x43, 0x5b, 0x50, 0xf3, 0x93, 0x1b, 0xa3, 0x08, 0x5b, 0x22, 0x25, 0x96, 0xcd, 0x91, 0xad, 0xb4, 0x1d, 0xda, 0x82, 0x9a, 0x9f, 0xdc, 0x18, 0x45, 0xd8, 0x12, 0x29, 0xb1, 0x6c, 0x8c, 0x3c, 0x4a,
0xac, 0x8e, 0xd5, 0xae, 0x4a, 0x60, 0xa2, 0x0c, 0xab, 0x4b, 0xfa, 0xbe, 0xa8, 0x4c, 0xba, 0x28, 0xcb, 0xea, 0x58, 0xed, 0xaa, 0x04, 0x26, 0xca, 0xb0, 0xba, 0xa4, 0xef, 0x8b, 0xca, 0xa4, 0x8b,
0xc6, 0xa8, 0x8a, 0x52, 0x09, 0x6f, 0xe6, 0x82, 0xf6, 0x83, 0xe7, 0x92, 0xcf, 0x33, 0x80, 0xe2, 0x62, 0x8c, 0xaa, 0x28, 0x95, 0xf0, 0x66, 0x2e, 0x38, 0x7e, 0xf0, 0x5c, 0xf2, 0x79, 0x06, 0x50,
0x36, 0x7c, 0xd9, 0x8e, 0xec, 0x09, 0xd4, 0x5c, 0xcf, 0x70, 0x62, 0x67, 0xa3, 0xca, 0xa8, 0x7e, 0xdc, 0x86, 0x2f, 0x7b, 0x22, 0x7b, 0x02, 0x35, 0xd7, 0x33, 0x9c, 0xd8, 0xde, 0xa8, 0x32, 0xaa,
0x82, 0x7e, 0x06, 0x73, 0x43, 0xc7, 0x3e, 0x75, 0x88, 0xeb, 0x1e, 0x59, 0xb6, 0x67, 0x9e, 0x5c, 0x9f, 0xa0, 0x9f, 0xc1, 0xdc, 0xd0, 0xb1, 0x4f, 0x1d, 0xe2, 0xba, 0x47, 0x96, 0xed, 0x99, 0x27,
0x8a, 0xa6, 0xb6, 0x26, 0xc9, 0xbb, 0x8c, 0x8a, 0xda, 0x50, 0x38, 0x31, 0xfb, 0x1e, 0x71, 0xdc, 0x97, 0xe2, 0x50, 0x5b, 0x93, 0xe4, 0x5d, 0x46, 0x45, 0x6d, 0x28, 0x9c, 0x98, 0x7d, 0x8f, 0x38,
0x46, 0x6e, 0x29, 0xbb, 0x5c, 0x5b, 0x7d, 0x79, 0x95, 0xd7, 0x56, 0x7e, 0xc4, 0xf8, 0x3b, 0x97, 0x6e, 0x23, 0xb7, 0x94, 0x5d, 0xae, 0xad, 0xbe, 0xbc, 0xca, 0x6b, 0x2b, 0x3f, 0x62, 0xfc, 0x9d,
0x43, 0xa2, 0xcb, 0xb9, 0x6a, 0xa3, 0x98, 0x0f, 0x35, 0xcf, 0x77, 0xa0, 0xf8, 0x81, 0x8a, 0xa0, 0xcb, 0x21, 0xd1, 0xe5, 0x58, 0xf5, 0xa0, 0x98, 0x0f, 0x1d, 0x9e, 0xef, 0x40, 0xf1, 0x03, 0x15,
0x97, 0xe2, 0x02, 0xef, 0xed, 0xd8, 0x78, 0xab, 0x87, 0x9f, 0x00, 0x04, 0xa2, 0x68, 0x16, 0xde, 0x41, 0x2f, 0xc5, 0x05, 0x7e, 0xb6, 0x63, 0xed, 0xad, 0x1e, 0x7e, 0x02, 0x10, 0x88, 0xa2, 0x59,
0xdd, 0xdb, 0x3f, 0xec, 0xd4, 0x67, 0x50, 0x05, 0x8a, 0xbb, 0x7b, 0x1b, 0xed, 0x9d, 0x36, 0x4d, 0x78, 0x77, 0x6f, 0xff, 0xb0, 0x53, 0x9f, 0x41, 0x15, 0x28, 0xee, 0xee, 0x6d, 0xb4, 0x77, 0xda,
0xd9, 0xb8, 0x25, 0xdd, 0xa6, 0xba, 0x37, 0x24, 0x57, 0x0b, 0xcb, 0xfd, 0xab, 0x0c, 0x54, 0xc5, 0x34, 0x65, 0xe3, 0x96, 0x74, 0x9b, 0xea, 0xde, 0x90, 0x5c, 0x2d, 0x2c, 0xf7, 0xaf, 0x32, 0x50,
0x01, 0x99, 0xea, 0x94, 0xaa, 0x2a, 0x32, 0x21, 0x15, 0xb4, 0x61, 0xe5, 0x07, 0xa7, 0x27, 0xfa, 0x15, 0x1b, 0x64, 0xaa, 0x5d, 0xaa, 0xaa, 0xc8, 0x84, 0x54, 0xd0, 0x03, 0x2b, 0xdf, 0x38, 0x3d,
0x62, 0x39, 0xa4, 0x69, 0x83, 0x9f, 0x03, 0xd2, 0x13, 0x1e, 0xf7, 0xc7, 0x89, 0x91, 0x9d, 0x4b, 0x71, 0x2e, 0x96, 0x4d, 0x9a, 0x36, 0xf8, 0x3e, 0x20, 0x3d, 0xe1, 0x71, 0xbf, 0x9d, 0x18, 0xd9,
0x8c, 0x6c, 0xf4, 0x08, 0xaa, 0xfe, 0x41, 0x34, 0x5c, 0x51, 0x86, 0x4b, 0x7a, 0x45, 0x9e, 0x31, 0xb9, 0xc4, 0xc8, 0x46, 0x8f, 0xa0, 0xea, 0x6f, 0x44, 0xc3, 0x15, 0x65, 0xb8, 0xa4, 0x57, 0xe4,
0x4a, 0x43, 0x4f, 0x20, 0x4f, 0xc6, 0xc4, 0xf2, 0xdc, 0x46, 0x99, 0x25, 0xe4, 0xaa, 0x6c, 0x8d, 0x1e, 0xa3, 0x34, 0xf4, 0x04, 0xf2, 0x64, 0x4c, 0x2c, 0xcf, 0x6d, 0x94, 0x59, 0x42, 0xae, 0xca,
0xdb, 0x94, 0xaa, 0x8b, 0x97, 0xf8, 0xb7, 0xe0, 0x06, 0xbb, 0x82, 0xbc, 0x75, 0x0c, 0x4b, 0xbd, 0xa3, 0x71, 0x9b, 0x52, 0x75, 0xd1, 0x89, 0x7f, 0x0b, 0x6e, 0xb0, 0x2b, 0xc8, 0x5b, 0xc7, 0xb0,
0x2b, 0x75, 0x3a, 0x3b, 0xc2, 0x75, 0xf4, 0x11, 0xd5, 0x20, 0xb3, 0xb5, 0x21, 0x16, 0x9a, 0xd9, 0xd4, 0xbb, 0x52, 0xa7, 0xb3, 0x23, 0x5c, 0x47, 0x3f, 0x51, 0x0d, 0x32, 0x5b, 0x1b, 0x62, 0xa2,
0xda, 0xc0, 0x3f, 0xd7, 0x00, 0xa9, 0xf3, 0xa6, 0xf2, 0x65, 0x44, 0xb8, 0x54, 0x9f, 0x0d, 0xd4, 0x99, 0xad, 0x0d, 0xfc, 0x73, 0x0d, 0x90, 0x3a, 0x6e, 0x2a, 0x5f, 0x46, 0x84, 0x4b, 0xf5, 0xd9,
0x2f, 0x40, 0x8e, 0x38, 0x8e, 0xed, 0x30, 0xaf, 0x95, 0x74, 0x3e, 0xc0, 0x8f, 0x85, 0x0d, 0x3a, 0x40, 0xfd, 0x02, 0xe4, 0x88, 0xe3, 0xd8, 0x0e, 0xf3, 0x5a, 0x49, 0xe7, 0x0d, 0xfc, 0x58, 0xd8,
0x19, 0xdb, 0xe7, 0x7e, 0xcc, 0x70, 0x69, 0x9a, 0x6f, 0xea, 0x36, 0xcc, 0x87, 0xb8, 0xa6, 0x2a, 0xa0, 0x93, 0xb1, 0x7d, 0xee, 0xc7, 0x0c, 0x97, 0xa6, 0xf9, 0xa6, 0x6e, 0xc3, 0x7c, 0x88, 0x6b,
0x0c, 0xcf, 0xe0, 0x26, 0x13, 0xb6, 0x4d, 0xc8, 0x70, 0xad, 0x6f, 0x8e, 0x53, 0xb5, 0x0e, 0xe1, 0xaa, 0xc2, 0xf0, 0x0c, 0x6e, 0x32, 0x61, 0xdb, 0x84, 0x0c, 0xd7, 0xfa, 0xe6, 0x38, 0x55, 0xeb,
0x56, 0x94, 0xf1, 0x9b, 0xf5, 0x11, 0xfe, 0x5d, 0xa1, 0xb1, 0x63, 0x0e, 0x48, 0xc7, 0xde, 0x49, 0x10, 0x6e, 0x45, 0x19, 0xbf, 0x59, 0x1f, 0xe1, 0xdf, 0x15, 0x1a, 0x3b, 0xe6, 0x80, 0x74, 0xec,
0xb7, 0x8d, 0x26, 0xce, 0x73, 0x72, 0xe9, 0x8a, 0x0a, 0xca, 0x9e, 0xf1, 0x3f, 0x69, 0x70, 0x3b, 0x9d, 0x74, 0xdb, 0x68, 0xe2, 0x3c, 0x27, 0x97, 0xae, 0xa8, 0xa0, 0xec, 0x1b, 0xff, 0xa3, 0x06,
0x36, 0xfd, 0x1b, 0xde, 0xd5, 0x45, 0x80, 0x53, 0x7a, 0x7c, 0x48, 0x8f, 0xbe, 0xe0, 0x97, 0x77, 0xb7, 0x63, 0xc3, 0xbf, 0xe1, 0x55, 0x5d, 0x04, 0x38, 0xa5, 0xdb, 0x87, 0xf4, 0x68, 0x07, 0xbf,
0x85, 0xe2, 0xdb, 0x49, 0x73, 0x4f, 0x45, 0xd8, 0xb9, 0x20, 0xf6, 0x9c, 0xfd, 0x71, 0x65, 0xf9, 0xbc, 0x2b, 0x14, 0xdf, 0x4e, 0x9a, 0x7b, 0x2a, 0xc2, 0xce, 0x05, 0xb1, 0xe6, 0xec, 0x8f, 0x2b,
0xb9, 0x0f, 0x65, 0x46, 0x38, 0xf0, 0x0c, 0x6f, 0xe4, 0xc6, 0x36, 0xe3, 0x4f, 0xc4, 0x11, 0x90, 0xcb, 0xcf, 0x7d, 0x28, 0x33, 0xc2, 0x81, 0x67, 0x78, 0x23, 0x37, 0xb6, 0x18, 0x7f, 0x22, 0xb6,
0x93, 0xa6, 0x5a, 0xd7, 0x77, 0x21, 0xcf, 0xfa, 0x56, 0xd9, 0xb5, 0x45, 0x2e, 0x0a, 0x8a, 0x1d, 0x80, 0x1c, 0x34, 0xd5, 0xbc, 0xbe, 0x0b, 0x79, 0x76, 0x6e, 0x95, 0xa7, 0xb6, 0xc8, 0x45, 0x41,
0xba, 0x60, 0xc4, 0x67, 0x90, 0x7f, 0xc7, 0xc0, 0x3e, 0xc5, 0xb2, 0x59, 0xb9, 0x15, 0x96, 0x31, 0xb1, 0x43, 0x17, 0x8c, 0xf8, 0x0c, 0xf2, 0xef, 0x18, 0xd8, 0xa7, 0x58, 0x36, 0x2b, 0x97, 0xc2,
0xe0, 0x10, 0x44, 0x49, 0x67, 0xcf, 0xac, 0xc9, 0x21, 0xc4, 0x39, 0xd4, 0x77, 0x78, 0x33, 0x55, 0x32, 0x06, 0x1c, 0x82, 0x28, 0xe9, 0xec, 0x9b, 0x1d, 0x72, 0x08, 0x71, 0x0e, 0xf5, 0x1d, 0x7e,
0xd2, 0xfd, 0x31, 0x75, 0x59, 0xb7, 0x6f, 0x12, 0xcb, 0x63, 0x6f, 0x67, 0xd9, 0x5b, 0x85, 0x82, 0x98, 0x2a, 0xe9, 0x7e, 0x9b, 0xba, 0xac, 0xdb, 0x37, 0x89, 0xe5, 0xb1, 0xde, 0x59, 0xd6, 0xab,
0x57, 0xa0, 0xce, 0x35, 0xad, 0xf5, 0x7a, 0x4a, 0xb3, 0xe2, 0xcb, 0xd3, 0xc2, 0xf2, 0xf0, 0xaf, 0x50, 0xf0, 0x0a, 0xd4, 0xb9, 0xa6, 0xb5, 0x5e, 0x4f, 0x39, 0xac, 0xf8, 0xf2, 0xb4, 0xb0, 0x3c,
0x34, 0xb8, 0xa1, 0x4c, 0x98, 0xca, 0x31, 0xaf, 0x20, 0xcf, 0x21, 0x4d, 0x51, 0x17, 0x17, 0xc2, 0xfc, 0x2b, 0x0d, 0x6e, 0x28, 0x03, 0xa6, 0x72, 0xcc, 0x2b, 0xc8, 0x73, 0x48, 0x53, 0xd4, 0xc5,
0xb3, 0xb8, 0x1a, 0x5d, 0xf0, 0xa0, 0x15, 0x28, 0xf0, 0x27, 0xd9, 0x31, 0x26, 0xb3, 0x4b, 0x26, 0x85, 0xf0, 0x28, 0xae, 0x46, 0x17, 0x3c, 0x68, 0x05, 0x0a, 0xfc, 0x4b, 0x9e, 0x18, 0x93, 0xd9,
0xfc, 0x04, 0xe6, 0x05, 0x89, 0x0c, 0xec, 0xa4, 0xb3, 0xcd, 0x1c, 0x8a, 0x7f, 0x06, 0x0b, 0x61, 0x25, 0x13, 0x7e, 0x02, 0xf3, 0x82, 0x44, 0x06, 0x76, 0xd2, 0xde, 0x66, 0x0e, 0xc5, 0x3f, 0x83,
0xb6, 0xa9, 0x96, 0xa4, 0x18, 0x99, 0xb9, 0x8e, 0x91, 0x6b, 0xd2, 0xc8, 0xc3, 0x61, 0x4f, 0x29, 0x85, 0x30, 0xdb, 0x54, 0x53, 0x52, 0x8c, 0xcc, 0x5c, 0xc7, 0xc8, 0x35, 0x69, 0xe4, 0xe1, 0xb0,
0xe3, 0xd1, 0x5d, 0x57, 0x77, 0x24, 0x13, 0xd9, 0x11, 0x7f, 0x01, 0x52, 0xc4, 0xb7, 0xba, 0x80, 0xa7, 0x94, 0xf1, 0xe8, 0xaa, 0xab, 0x2b, 0x92, 0x89, 0xac, 0x88, 0x3f, 0x01, 0x29, 0xe2, 0x5b,
0x79, 0x79, 0x1c, 0x76, 0x4c, 0xd7, 0x6f, 0xee, 0x3e, 0x02, 0x52, 0x89, 0xdf, 0xb6, 0x41, 0x1b, 0x9d, 0xc0, 0xbc, 0xdc, 0x0e, 0x3b, 0xa6, 0xeb, 0x1f, 0xee, 0x3e, 0x02, 0x52, 0x89, 0xdf, 0xb6,
0xe4, 0xc4, 0x31, 0x4e, 0x07, 0xc4, 0xaf, 0x4f, 0xb4, 0xd5, 0x57, 0x89, 0x53, 0x65, 0xf4, 0x16, 0x41, 0x1b, 0xe4, 0xc4, 0x31, 0x4e, 0x07, 0xc4, 0xaf, 0x4f, 0xf4, 0xa8, 0xaf, 0x12, 0xa7, 0xca,
0xdc, 0x78, 0x67, 0x8f, 0x69, 0x6a, 0xa0, 0xd4, 0x20, 0x64, 0xf8, 0x55, 0xcf, 0xdf, 0x36, 0x7f, 0xe8, 0x2d, 0xb8, 0xf1, 0xce, 0x1e, 0xd3, 0xd4, 0x40, 0xa9, 0x41, 0xc8, 0xf0, 0xab, 0x9e, 0xbf,
0x4c, 0x95, 0xab, 0x13, 0xa6, 0x52, 0xfe, 0xaf, 0x1a, 0x54, 0xd6, 0xfa, 0x86, 0x33, 0x90, 0x8a, 0x6c, 0x7e, 0x9b, 0x2a, 0x57, 0x07, 0x4c, 0xa5, 0xfc, 0x5f, 0x35, 0xa8, 0xac, 0xf5, 0x0d, 0x67,
0x7f, 0x00, 0x79, 0x7e, 0x81, 0x11, 0x98, 0xc1, 0xd3, 0xb0, 0x18, 0x95, 0x97, 0x0f, 0xd6, 0xf8, 0x20, 0x15, 0xff, 0x00, 0xf2, 0xfc, 0x02, 0x23, 0x30, 0x83, 0xa7, 0x61, 0x31, 0x2a, 0x2f, 0x6f,
0x75, 0x47, 0xcc, 0xa2, 0x86, 0x8b, 0xcf, 0x0a, 0x1b, 0x91, 0xcf, 0x0c, 0x1b, 0xe8, 0x13, 0xc8, 0xac, 0xf1, 0xeb, 0x8e, 0x18, 0x45, 0x0d, 0x17, 0xcf, 0x0a, 0x1b, 0x91, 0x67, 0x86, 0x0d, 0xf4,
0x19, 0x74, 0x0a, 0x4b, 0xc1, 0xb5, 0xe8, 0xd5, 0x91, 0x49, 0x63, 0x7d, 0x1b, 0xe7, 0xc2, 0xdf, 0x09, 0xe4, 0x0c, 0x3a, 0x84, 0xa5, 0xe0, 0x5a, 0xf4, 0xea, 0xc8, 0xa4, 0xb1, 0x73, 0x1b, 0xe7,
0x87, 0xb2, 0xa2, 0x81, 0x5e, 0x8e, 0xdf, 0xb6, 0x45, 0x03, 0xb6, 0xb6, 0xde, 0xd9, 0x7a, 0xcf, 0xc2, 0xdf, 0x87, 0xb2, 0xa2, 0x81, 0x5e, 0x8e, 0xdf, 0xb6, 0xc5, 0x01, 0x6c, 0x6d, 0xbd, 0xb3,
0xef, 0xcc, 0x35, 0x80, 0x8d, 0xb6, 0x3f, 0xce, 0xe0, 0xcf, 0xc4, 0x2c, 0x91, 0xef, 0x54, 0x7b, 0xf5, 0x9e, 0xdf, 0x99, 0x6b, 0x00, 0x1b, 0x6d, 0xbf, 0x9d, 0xc1, 0x9f, 0x89, 0x51, 0x22, 0xdf,
0xb4, 0x34, 0x7b, 0x32, 0xd7, 0xb2, 0xe7, 0x02, 0xaa, 0x62, 0xf9, 0xd3, 0xa6, 0x6f, 0x26, 0x2f, 0xa9, 0xf6, 0x68, 0x69, 0xf6, 0x64, 0xae, 0x65, 0xcf, 0x05, 0x54, 0xc5, 0xf4, 0xa7, 0x4d, 0xdf,
0x25, 0x7d, 0x2b, 0xc6, 0xeb, 0x82, 0x11, 0xcf, 0x41, 0x55, 0x24, 0x74, 0x71, 0xfe, 0xfe, 0x3a, 0x4c, 0x5e, 0x4a, 0xfa, 0x56, 0x8c, 0xd7, 0x05, 0x23, 0x9e, 0x83, 0xaa, 0x48, 0xe8, 0x62, 0xff,
0x03, 0x35, 0x49, 0x99, 0x16, 0xdb, 0x94, 0xb0, 0x0c, 0xaf, 0x00, 0x3e, 0x28, 0x73, 0x0b, 0xf2, 0xfd, 0x53, 0x06, 0x6a, 0x92, 0x32, 0x2d, 0xb6, 0x29, 0x61, 0x19, 0x5e, 0x01, 0x7c, 0x50, 0xe6,
0xbd, 0xe3, 0x03, 0xf3, 0xa3, 0xc4, 0xa1, 0xc5, 0x88, 0xd2, 0xfb, 0x5c, 0x0f, 0xff, 0x18, 0x24, 0x16, 0xe4, 0x7b, 0xc7, 0x07, 0xe6, 0x47, 0x89, 0x43, 0x8b, 0x16, 0xa5, 0xf7, 0xb9, 0x1e, 0xfe,
0x46, 0xf4, 0x82, 0xee, 0x18, 0x27, 0xde, 0x96, 0xd5, 0x23, 0x17, 0xac, 0x6f, 0x9c, 0xd5, 0x03, 0x18, 0x24, 0x5a, 0xf4, 0x82, 0xee, 0x18, 0x27, 0xde, 0x96, 0xd5, 0x23, 0x17, 0xec, 0xdc, 0x38,
0x02, 0xbb, 0xaf, 0x8a, 0x8f, 0x46, 0xac, 0x59, 0x54, 0x3e, 0x22, 0xa1, 0x17, 0x50, 0xa7, 0xcf, 0xab, 0x07, 0x04, 0x76, 0x5f, 0x15, 0x8f, 0x46, 0xec, 0xb0, 0xa8, 0x3c, 0x22, 0xa1, 0x17, 0x50,
0x6b, 0xc3, 0x61, 0xdf, 0x24, 0x3d, 0x2e, 0xa0, 0xc0, 0x78, 0x62, 0x74, 0xaa, 0x9d, 0xb5, 0x5e, 0xa7, 0xdf, 0x6b, 0xc3, 0x61, 0xdf, 0x24, 0x3d, 0x2e, 0xa0, 0xc0, 0x78, 0x62, 0x74, 0xaa, 0x9d,
0x6e, 0xa3, 0xc8, 0xd2, 0x96, 0x18, 0xd1, 0x28, 0x5d, 0x1b, 0x79, 0x67, 0x6d, 0xcb, 0x38, 0xee, 0x1d, 0xbd, 0xdc, 0x46, 0x91, 0xa5, 0x2d, 0xd1, 0x42, 0x4b, 0x50, 0xe6, 0xf6, 0x6d, 0x59, 0x87,
0xcb, 0xac, 0x47, 0x4b, 0x35, 0x25, 0x6e, 0x98, 0xae, 0x4a, 0x6d, 0xc3, 0x3c, 0xa5, 0x12, 0xcb, 0x2e, 0x61, 0x2f, 0x29, 0x59, 0x5d, 0x25, 0xd1, 0x38, 0x5e, 0x1b, 0x79, 0x67, 0x6d, 0xcb, 0x38,
0x33, 0xbb, 0x4a, 0x8a, 0x94, 0x85, 0x50, 0x8b, 0x14, 0x42, 0xc3, 0x75, 0x3f, 0xd8, 0x4e, 0x4f, 0xee, 0xcb, 0xbc, 0x48, 0x8b, 0x39, 0x25, 0x6e, 0x98, 0xae, 0x4a, 0x6d, 0xc3, 0x3c, 0xa5, 0x12,
0xb8, 0xc7, 0x1f, 0xe3, 0x0d, 0x2e, 0xfc, 0xd0, 0x0d, 0x95, 0xba, 0x2f, 0x2b, 0x65, 0x39, 0x90, 0xcb, 0x33, 0xbb, 0x4a, 0x12, 0x95, 0xa5, 0x52, 0x8b, 0x94, 0x4a, 0xc3, 0x75, 0x3f, 0xd8, 0x4e,
0xf2, 0x96, 0x78, 0x13, 0xa4, 0xe0, 0x97, 0x70, 0x53, 0x72, 0x0a, 0xec, 0x70, 0x02, 0xf3, 0x1e, 0x4f, 0x38, 0xd0, 0x6f, 0xe3, 0x0d, 0x2e, 0xfc, 0xd0, 0x0d, 0x15, 0xc3, 0x2f, 0x2b, 0x65, 0x39,
0xdc, 0x97, 0xcc, 0xeb, 0x67, 0xf4, 0x72, 0xb6, 0x2f, 0x14, 0x7e, 0x55, 0x3b, 0xdf, 0x40, 0xc3, 0x90, 0xf2, 0x96, 0x78, 0x13, 0xa4, 0xe0, 0x97, 0x70, 0x53, 0x72, 0x0a, 0x74, 0x71, 0x02, 0xf3,
0xb7, 0x93, 0x35, 0xdc, 0x76, 0x5f, 0x35, 0x60, 0xe4, 0x8a, 0x73, 0x57, 0xd2, 0xd9, 0x33, 0xa5, 0x1e, 0xdc, 0x97, 0xcc, 0xeb, 0x67, 0xf4, 0xfa, 0xb6, 0x2f, 0x14, 0x7e, 0x55, 0x3b, 0xdf, 0x40,
0x39, 0x76, 0xdf, 0x6f, 0x2b, 0xe8, 0x33, 0x5e, 0x87, 0x3b, 0x52, 0x86, 0x68, 0x85, 0xc3, 0x42, 0xc3, 0xb7, 0x93, 0x1d, 0xc9, 0xed, 0xbe, 0x6a, 0xc0, 0xc8, 0x15, 0x3b, 0xb3, 0xa4, 0xb3, 0x6f,
0x62, 0x06, 0x25, 0x09, 0x11, 0x0e, 0xa3, 0x53, 0x27, 0xbb, 0x5d, 0xe5, 0x0c, 0xbb, 0x96, 0xc9, 0x4a, 0x73, 0xec, 0xbe, 0x7f, 0xf0, 0xa0, 0xdf, 0x78, 0x1d, 0xee, 0x48, 0x19, 0xe2, 0xb0, 0x1c,
0xd4, 0x14, 0x99, 0x37, 0xf9, 0x89, 0xa0, 0x86, 0xa9, 0x55, 0x47, 0x90, 0xa9, 0x00, 0x95, 0x2c, 0x16, 0x12, 0x33, 0x28, 0x49, 0x88, 0x70, 0x18, 0x1d, 0x3a, 0xd9, 0xed, 0x2a, 0x67, 0xd8, 0xb5,
0x36, 0x82, 0x92, 0x63, 0x1b, 0x11, 0x13, 0xfd, 0x53, 0x58, 0xf4, 0x8d, 0xa0, 0x7e, 0xdb, 0x27, 0x4c, 0xa6, 0xa6, 0xc8, 0xbc, 0xc9, 0x77, 0x04, 0x35, 0x4c, 0xad, 0x4b, 0x82, 0x4c, 0x05, 0xa8,
0xce, 0xc0, 0x74, 0x5d, 0x05, 0x6d, 0x4a, 0x5a, 0xf8, 0x53, 0x98, 0x1d, 0x12, 0x91, 0x97, 0xca, 0x64, 0xb1, 0x10, 0x94, 0x1c, 0x5b, 0x88, 0x98, 0xe8, 0x9f, 0xc2, 0xa2, 0x6f, 0x04, 0xf5, 0xdb,
0xab, 0x68, 0x85, 0x7f, 0x1e, 0x5e, 0x51, 0x26, 0xb3, 0xf7, 0xb8, 0x07, 0x0f, 0xa4, 0x74, 0xee, 0x3e, 0x71, 0x06, 0xa6, 0xeb, 0x2a, 0x78, 0x54, 0xd2, 0xc4, 0x9f, 0xc2, 0xec, 0x90, 0x88, 0xcc,
0xd1, 0x44, 0xf1, 0x51, 0xa3, 0xe4, 0xa5, 0x9e, 0xbb, 0x35, 0x7e, 0xa9, 0xcf, 0xf2, 0xbd, 0xf7, 0x55, 0x5e, 0x45, 0x2b, 0xfc, 0x01, 0x79, 0x45, 0x19, 0xcc, 0xfa, 0x71, 0x0f, 0x1e, 0x48, 0xe9,
0x11, 0xd0, 0x1f, 0x73, 0x47, 0xca, 0xd8, 0x9a, 0xaa, 0xde, 0x6c, 0x73, 0x9f, 0xfa, 0x21, 0x39, 0xdc, 0xa3, 0x89, 0xe2, 0xa3, 0x46, 0xc9, 0x6b, 0x3f, 0x77, 0x6b, 0xfc, 0xda, 0x9f, 0xe5, 0x6b,
0x95, 0xb0, 0x63, 0x58, 0x08, 0x47, 0xf2, 0x54, 0xa9, 0x70, 0x01, 0x72, 0x9e, 0x7d, 0x4e, 0x64, 0xef, 0x63, 0xa4, 0x3f, 0xe6, 0x8e, 0x94, 0xb1, 0x35, 0x55, 0x45, 0xda, 0xe6, 0x3e, 0xf5, 0x43,
0x22, 0xe4, 0x03, 0x69, 0xb0, 0x1f, 0xe6, 0x53, 0x19, 0x6c, 0x04, 0xc2, 0xd8, 0x91, 0x9c, 0xd6, 0x72, 0x2a, 0x61, 0xc7, 0xb0, 0x10, 0x8e, 0xe4, 0xa9, 0x92, 0xe5, 0x02, 0xe4, 0x3c, 0xfb, 0x9c,
0x5e, 0xba, 0x9b, 0xb2, 0x81, 0xe3, 0x03, 0xbc, 0x0b, 0xb7, 0xa2, 0x69, 0x62, 0x2a, 0x93, 0xdf, 0xc8, 0x54, 0xc9, 0x1b, 0xd2, 0x60, 0x3f, 0xcc, 0xa7, 0x32, 0xd8, 0x08, 0x84, 0xb1, 0x2d, 0x39,
0xf3, 0x03, 0x9c, 0x94, 0x49, 0xa6, 0x92, 0xfb, 0x93, 0x20, 0x19, 0x28, 0x09, 0x65, 0x2a, 0x91, 0xad, 0xbd, 0x74, 0x35, 0xe5, 0x11, 0x8f, 0x37, 0xf0, 0x2e, 0xdc, 0x8a, 0xa6, 0x89, 0xa9, 0x4c,
0x3a, 0x34, 0x93, 0xf2, 0xcb, 0xd7, 0x71, 0x5e, 0xfd, 0x74, 0x33, 0x95, 0x30, 0x37, 0x10, 0x36, 0x7e, 0xcf, 0x37, 0x70, 0x52, 0x26, 0x99, 0x4a, 0xee, 0x4f, 0x82, 0x64, 0xa0, 0x24, 0x94, 0xa9,
0xfd, 0xf6, 0x07, 0x39, 0x22, 0x3b, 0x31, 0x47, 0x88, 0x20, 0x09, 0xb2, 0xd8, 0x37, 0x70, 0xe8, 0x44, 0xea, 0xd0, 0x4c, 0xca, 0x2f, 0x5f, 0xc7, 0x7e, 0xf5, 0xd3, 0xcd, 0x54, 0xc2, 0xdc, 0x40,
0x84, 0x8e, 0x20, 0x81, 0x4e, 0xab, 0x83, 0xd6, 0x10, 0x5f, 0x07, 0x1b, 0xc8, 0x83, 0xad, 0xa6, 0xd8, 0xf4, 0xcb, 0x1f, 0xe4, 0x88, 0xec, 0xc4, 0x1c, 0x21, 0x82, 0x24, 0xc8, 0x62, 0xdf, 0xc0,
0xdd, 0xa9, 0x36, 0xe3, 0xd3, 0x20, 0x77, 0xc6, 0x32, 0xf3, 0x54, 0x82, 0x3f, 0x83, 0xa5, 0xf4, 0xa6, 0x13, 0x3a, 0x82, 0x04, 0x3a, 0xad, 0x0e, 0x5a, 0x43, 0x7c, 0x1d, 0xac, 0x21, 0x37, 0xb6,
0xa4, 0x3c, 0x8d, 0xe4, 0x17, 0x2d, 0x28, 0xf9, 0x4d, 0xa9, 0xf2, 0xd3, 0x8a, 0x32, 0x14, 0x76, 0x9a, 0x76, 0xa7, 0x5a, 0x8c, 0x4f, 0x83, 0xdc, 0x19, 0xcb, 0xcc, 0x53, 0x09, 0xfe, 0x0c, 0x96,
0xf7, 0x0e, 0xf6, 0xd7, 0xd6, 0xdb, 0xfc, 0xb7, 0x15, 0xeb, 0x7b, 0xba, 0x7e, 0xb8, 0xdf, 0xa9, 0xd2, 0x93, 0xf2, 0x34, 0x92, 0x5f, 0xb4, 0xa0, 0xe4, 0x1f, 0x5b, 0x95, 0x1f, 0x5f, 0x94, 0xa1,
0x67, 0x56, 0xff, 0x37, 0x0b, 0x99, 0xed, 0xf7, 0xe8, 0xf7, 0x21, 0xc7, 0x3f, 0x34, 0x4e, 0xf8, 0xb0, 0xbb, 0x77, 0xb0, 0xbf, 0xb6, 0xde, 0xe6, 0xbf, 0xbe, 0x58, 0xdf, 0xd3, 0xf5, 0xc3, 0xfd,
0xba, 0xdc, 0x9c, 0xf4, 0x2d, 0x15, 0xdf, 0xfd, 0xf9, 0xbf, 0xff, 0xd7, 0x2f, 0x33, 0x37, 0x71, 0x4e, 0x3d, 0xb3, 0xfa, 0xbf, 0x59, 0xc8, 0x6c, 0xbf, 0x47, 0xbf, 0x0f, 0x39, 0xfe, 0x14, 0x39,
0xbd, 0x35, 0xfe, 0xde, 0x31, 0xf1, 0x8c, 0xd6, 0xf9, 0xb8, 0xc5, 0xea, 0xc3, 0x6b, 0xed, 0x05, 0xe1, 0xfd, 0xb9, 0x39, 0xe9, 0xb5, 0x15, 0xdf, 0xfd, 0xf9, 0xbf, 0xff, 0xd7, 0x2f, 0x33, 0x37,
0x3a, 0x84, 0xec, 0xfe, 0xc8, 0x43, 0xa9, 0x5f, 0x9e, 0x9b, 0xe9, 0x9f, 0x58, 0xf1, 0x1d, 0x26, 0x71, 0xbd, 0x35, 0xfe, 0xde, 0x31, 0xf1, 0x8c, 0xd6, 0xf9, 0xb8, 0xc5, 0xea, 0xc3, 0x6b, 0xed,
0x78, 0x1e, 0xd7, 0x14, 0xc1, 0xc3, 0x91, 0x47, 0xc5, 0x8e, 0xa0, 0xac, 0x7e, 0x24, 0xbd, 0xf2, 0x05, 0x3a, 0x84, 0xec, 0xfe, 0xc8, 0x43, 0xa9, 0x6f, 0xd3, 0xcd, 0xf4, 0x47, 0x58, 0x7c, 0x87,
0x93, 0x74, 0xf3, 0xea, 0x0f, 0xb0, 0xf8, 0x21, 0x53, 0x77, 0x17, 0xdf, 0x52, 0xd4, 0xf1, 0x4f, 0x09, 0x9e, 0xc7, 0x35, 0x45, 0xf0, 0x70, 0xe4, 0x51, 0xb1, 0x23, 0x28, 0xab, 0xcf, 0xa8, 0x57,
0xb9, 0xea, 0x6a, 0x3a, 0x17, 0x16, 0x4a, 0xfd, 0x68, 0xdd, 0x4c, 0xff, 0x2e, 0x9b, 0xb8, 0x1a, 0x3e, 0x5a, 0x37, 0xaf, 0x7e, 0xa2, 0xc5, 0x0f, 0x99, 0xba, 0xbb, 0xf8, 0x96, 0xa2, 0x8e, 0x3f,
0xef, 0xc2, 0xa2, 0x62, 0x2d, 0xf1, 0x59, 0xb6, 0xeb, 0xa1, 0x07, 0x09, 0x9f, 0xe5, 0xd4, 0x0f, 0xf6, 0xaa, 0xb3, 0xe9, 0x5c, 0x58, 0x28, 0xf5, 0x59, 0xbb, 0x99, 0xfe, 0x72, 0x9b, 0x38, 0x1b,
0x50, 0xcd, 0xa5, 0x74, 0x06, 0xa1, 0x68, 0x89, 0x29, 0x6a, 0xe2, 0x9b, 0x8a, 0xa2, 0xae, 0xcf, 0xef, 0xc2, 0xa2, 0x62, 0x2d, 0xf1, 0x70, 0xdb, 0xf5, 0xd0, 0x83, 0x84, 0x87, 0x3b, 0xf5, 0x89,
0xf6, 0x5a, 0x7b, 0xb1, 0x7a, 0x0a, 0x39, 0x86, 0x32, 0xa3, 0x3f, 0x90, 0x0f, 0xcd, 0x04, 0xe8, 0xaa, 0xb9, 0x94, 0xce, 0x20, 0x14, 0x2d, 0x31, 0x45, 0x4d, 0x7c, 0x53, 0x51, 0xd4, 0xf5, 0xd9,
0x3c, 0x65, 0xf3, 0x43, 0xf8, 0x34, 0x6e, 0x30, 0x65, 0x08, 0x57, 0xa5, 0x32, 0x86, 0x33, 0xbf, 0x5e, 0x6b, 0x2f, 0x56, 0x4f, 0x21, 0xc7, 0x70, 0x68, 0xf4, 0x07, 0xf2, 0xa3, 0x99, 0x00, 0xae,
0xd6, 0x5e, 0x2c, 0x6b, 0xdf, 0xd1, 0x56, 0xff, 0x67, 0x16, 0x72, 0x0c, 0x72, 0x42, 0x36, 0x40, 0xa7, 0x2c, 0x7e, 0x08, 0xc1, 0xc6, 0x0d, 0xa6, 0x0c, 0xe1, 0xaa, 0x54, 0xc6, 0x90, 0xe8, 0xd7,
0x80, 0xc8, 0x46, 0x57, 0x19, 0xc3, 0x78, 0xa3, 0xab, 0x8c, 0x83, 0xb9, 0x78, 0x91, 0x29, 0x6e, 0xda, 0x8b, 0x65, 0xed, 0x3b, 0xda, 0xea, 0xff, 0xcc, 0x42, 0x8e, 0x81, 0x52, 0xc8, 0x06, 0x08,
0xe0, 0x79, 0xa9, 0x98, 0xa1, 0x59, 0x2d, 0x06, 0xd0, 0x51, 0x9f, 0x8e, 0x05, 0xe8, 0xc6, 0xc3, 0x30, 0xdb, 0xe8, 0x2c, 0x63, 0x28, 0x70, 0x74, 0x96, 0x71, 0xb8, 0x17, 0x2f, 0x32, 0xc5, 0x0d,
0x0c, 0x25, 0x09, 0x0c, 0x21, 0xb3, 0xd1, 0x13, 0x92, 0x80, 0xca, 0x62, 0xcc, 0x74, 0xde, 0xc3, 0x3c, 0x2f, 0x15, 0x33, 0xbc, 0xab, 0xc5, 0x20, 0x3c, 0xea, 0xd3, 0xb1, 0x80, 0xe5, 0x78, 0x98,
0xb7, 0x15, 0xcf, 0x72, 0xb5, 0x0e, 0x63, 0xa4, 0x7a, 0xff, 0x4c, 0x83, 0x5a, 0x18, 0x5b, 0x45, 0xa1, 0x24, 0x81, 0x21, 0xec, 0x36, 0xba, 0x43, 0x12, 0x70, 0x5b, 0x8c, 0x99, 0xce, 0x7b, 0xf8,
0x8f, 0x12, 0x24, 0x47, 0x21, 0xda, 0xe6, 0xe3, 0xc9, 0x4c, 0x69, 0x16, 0x70, 0xf5, 0xe7, 0x84, 0xb6, 0xe2, 0x59, 0xae, 0xd6, 0x61, 0x8c, 0x54, 0xef, 0x9f, 0x69, 0x50, 0x0b, 0xa3, 0xaf, 0xe8,
0x0c, 0x0d, 0xca, 0x28, 0x1c, 0x8f, 0xfe, 0x42, 0x83, 0xb9, 0x08, 0x60, 0x8a, 0x92, 0x34, 0xc4, 0x51, 0x82, 0xe4, 0x28, 0x88, 0xdb, 0x7c, 0x3c, 0x99, 0x29, 0xcd, 0x02, 0xae, 0xfe, 0x9c, 0x90,
0xe0, 0xd8, 0xe6, 0x93, 0x2b, 0xb8, 0x84, 0x21, 0x4f, 0x99, 0x21, 0x4b, 0xf8, 0x6e, 0xcc, 0x15, 0xa1, 0x41, 0x19, 0x85, 0xe3, 0xd1, 0x5f, 0x68, 0x30, 0x17, 0x81, 0x54, 0x51, 0x92, 0x86, 0x18,
0x9e, 0x39, 0x20, 0x9e, 0x2d, 0x8c, 0xf1, 0xb7, 0x81, 0x83, 0x9b, 0x89, 0xdb, 0x10, 0x02, 0x4b, 0x60, 0xdb, 0x7c, 0x72, 0x05, 0x97, 0x30, 0xe4, 0x29, 0x33, 0x64, 0x09, 0xdf, 0x8d, 0xb9, 0xc2,
0x13, 0xb7, 0x21, 0x8c, 0x8c, 0x4e, 0xd8, 0x06, 0x8e, 0x68, 0xd2, 0x23, 0xfe, 0x7f, 0x59, 0x28, 0x33, 0x07, 0xc4, 0xb3, 0x85, 0x31, 0xfe, 0x32, 0x70, 0xf8, 0x33, 0x71, 0x19, 0x42, 0x70, 0x6a,
0xac, 0xf3, 0x1f, 0x38, 0x22, 0x17, 0x4a, 0x3e, 0x8a, 0x88, 0x16, 0x93, 0x10, 0x9d, 0xe0, 0xb6, 0xe2, 0x32, 0x84, 0xb1, 0xd3, 0x09, 0xcb, 0xc0, 0x31, 0x4f, 0xba, 0xc5, 0xff, 0x2f, 0x0b, 0x85,
0xd0, 0x7c, 0x90, 0xfa, 0x5e, 0x68, 0x7f, 0xc2, 0xb4, 0x3f, 0xc0, 0x4d, 0xa9, 0x5d, 0xfc, 0x8e, 0x75, 0xfe, 0x13, 0x48, 0xe4, 0x42, 0xc9, 0xc7, 0x19, 0xd1, 0x62, 0x12, 0xe6, 0x13, 0xdc, 0x16,
0xb2, 0xc5, 0xa1, 0x83, 0x96, 0xd1, 0xeb, 0xd1, 0x85, 0xff, 0x29, 0x54, 0x54, 0xa8, 0x0f, 0x3d, 0x9a, 0x0f, 0x52, 0xfb, 0x85, 0xf6, 0x27, 0x4c, 0xfb, 0x03, 0xdc, 0x94, 0xda, 0xc5, 0x2f, 0x2d,
0x4c, 0x44, 0x92, 0x54, 0xb4, 0xb0, 0x89, 0x27, 0xb1, 0x08, 0xed, 0xcb, 0x4c, 0x3b, 0xc6, 0xf7, 0x5b, 0x1c, 0x5c, 0x68, 0x19, 0xbd, 0x1e, 0x9d, 0xf8, 0x9f, 0x42, 0x45, 0x05, 0x03, 0xd1, 0xc3,
0x53, 0xb4, 0x3b, 0x8c, 0x3d, 0x64, 0x00, 0x87, 0xea, 0x92, 0x0d, 0x08, 0x21, 0x81, 0xc9, 0x06, 0x44, 0xac, 0x49, 0xc5, 0x13, 0x9b, 0x78, 0x12, 0x8b, 0xd0, 0xbe, 0xcc, 0xb4, 0x63, 0x7c, 0x3f,
0x84, 0x91, 0xbe, 0x2b, 0x0d, 0x18, 0x31, 0x76, 0x6a, 0xc0, 0x07, 0x80, 0x00, 0x98, 0x43, 0x89, 0x45, 0xbb, 0xc3, 0xd8, 0x43, 0x06, 0x70, 0x30, 0x2f, 0xd9, 0x80, 0x10, 0x56, 0x98, 0x6c, 0x40,
0x7e, 0x55, 0xae, 0x4e, 0xd1, 0x90, 0x8f, 0x63, 0x7a, 0xf1, 0x33, 0x17, 0x51, 0xdd, 0x37, 0x5d, 0x18, 0x0b, 0xbc, 0xd2, 0x80, 0x11, 0x63, 0xa7, 0x06, 0x7c, 0x00, 0x08, 0xa0, 0x3b, 0x94, 0xe8,
0x1a, 0xfa, 0xab, 0xbf, 0xca, 0x43, 0xf9, 0x9d, 0x61, 0x5a, 0x1e, 0xb1, 0x0c, 0xab, 0x4b, 0xd0, 0x57, 0xe5, 0xea, 0x14, 0x0d, 0xf9, 0x38, 0xea, 0x17, 0xdf, 0x73, 0x11, 0xd5, 0x7d, 0xd3, 0xa5,
0x09, 0xe4, 0x58, 0x69, 0x8c, 0x66, 0x39, 0x15, 0xaf, 0x8a, 0x66, 0xb9, 0x10, 0x98, 0x83, 0x1f, 0xa1, 0xbf, 0xfa, 0xab, 0x3c, 0x94, 0xdf, 0x19, 0xa6, 0xe5, 0x11, 0xcb, 0xb0, 0xba, 0x04, 0x9d,
0x33, 0xcd, 0x8b, 0xf8, 0x8e, 0xd4, 0x3c, 0x08, 0xc4, 0xb7, 0x18, 0x0e, 0x43, 0x17, 0xfc, 0x87, 0x40, 0x8e, 0x95, 0xc6, 0x68, 0x96, 0x53, 0x11, 0xad, 0x68, 0x96, 0x0b, 0xc1, 0x3d, 0xf8, 0x31,
0x90, 0x17, 0x10, 0x7f, 0x44, 0x58, 0x08, 0x9f, 0x69, 0xde, 0x4b, 0x7e, 0x99, 0x76, 0xbc, 0x54, 0xd3, 0xbc, 0x88, 0xef, 0x48, 0xcd, 0x83, 0x40, 0x7c, 0x8b, 0x21, 0x35, 0x74, 0xc2, 0x7f, 0x08,
0x55, 0x2e, 0xe3, 0xa5, 0xba, 0x3e, 0x02, 0x04, 0x20, 0x63, 0xd4, 0xb9, 0x31, 0x4c, 0xb2, 0xb9, 0x79, 0xf1, 0x08, 0x10, 0x11, 0x16, 0x42, 0x70, 0x9a, 0xf7, 0x92, 0x3b, 0xd3, 0xb6, 0x97, 0xaa,
0x94, 0xce, 0x20, 0xf4, 0x3e, 0x67, 0x7a, 0x1f, 0xe1, 0xc5, 0x24, 0xbd, 0x3d, 0x9f, 0x9f, 0xea, 0xca, 0x65, 0xbc, 0x54, 0xd7, 0x47, 0x80, 0x00, 0x86, 0x8c, 0x3a, 0x37, 0x86, 0x5a, 0x36, 0x97,
0x3e, 0x86, 0xd9, 0x4d, 0xc3, 0x3d, 0x43, 0x91, 0x62, 0xa7, 0xfc, 0x26, 0xa1, 0xd9, 0x4c, 0x7a, 0xd2, 0x19, 0x84, 0xde, 0xe7, 0x4c, 0xef, 0x23, 0xbc, 0x98, 0xa4, 0xb7, 0xe7, 0xf3, 0x53, 0xdd,
0x25, 0x34, 0x3d, 0x62, 0x9a, 0xee, 0xe3, 0x46, 0x92, 0xa6, 0x33, 0xc3, 0xa5, 0xd5, 0x03, 0x9d, 0xc7, 0x30, 0xbb, 0x69, 0xb8, 0x67, 0x28, 0x52, 0xec, 0x94, 0x5f, 0x2d, 0x34, 0x9b, 0x49, 0x5d,
0x41, 0x9e, 0xff, 0x4c, 0x21, 0xea, 0xcb, 0xd0, 0x4f, 0x1d, 0xa2, 0xbe, 0x0c, 0xff, 0xb2, 0xe1, 0x42, 0xd3, 0x23, 0xa6, 0xe9, 0x3e, 0x6e, 0x24, 0x69, 0x3a, 0x33, 0x5c, 0x5a, 0x3d, 0xd0, 0x19,
0x7a, 0x9a, 0x3c, 0x28, 0xca, 0xdf, 0x06, 0xa0, 0xfb, 0x91, 0xad, 0x09, 0xff, 0x8e, 0xa0, 0xb9, 0xe4, 0xf9, 0x0f, 0x19, 0xa2, 0xbe, 0x0c, 0xfd, 0x18, 0x22, 0xea, 0xcb, 0xf0, 0x6f, 0x1f, 0xae,
0x98, 0xf6, 0x5a, 0xe8, 0x7b, 0xc6, 0xf4, 0x3d, 0xc4, 0xf7, 0x12, 0xf7, 0x4e, 0x70, 0xbf, 0xd6, 0xa7, 0xc9, 0x83, 0xa2, 0xfc, 0xf5, 0x00, 0xba, 0x1f, 0x59, 0x9a, 0xf0, 0x2f, 0x0d, 0x9a, 0x8b,
0x5e, 0x7c, 0x47, 0xa3, 0x65, 0x02, 0x02, 0xa0, 0x36, 0x16, 0x1d, 0x51, 0xcc, 0x37, 0x16, 0x1d, 0x69, 0xdd, 0x42, 0xdf, 0x33, 0xa6, 0xef, 0x21, 0xbe, 0x97, 0xb8, 0x76, 0x82, 0xfb, 0xb5, 0xf6,
0x31, 0x8c, 0x17, 0xaf, 0x32, 0xe5, 0xaf, 0xf0, 0xb3, 0x24, 0xe5, 0x9e, 0x63, 0x58, 0xee, 0x09, 0xe2, 0x3b, 0x1a, 0x2d, 0x13, 0x10, 0x40, 0xb9, 0xb1, 0xe8, 0x88, 0xa2, 0xc2, 0xb1, 0xe8, 0x88,
0x71, 0x3e, 0xe1, 0x80, 0x9c, 0x7b, 0x66, 0x0e, 0x69, 0xa4, 0xfc, 0xff, 0x1c, 0xcc, 0xd2, 0x7e, 0xa1, 0xc0, 0x78, 0x95, 0x29, 0x7f, 0x85, 0x9f, 0x25, 0x29, 0xf7, 0x1c, 0xc3, 0x72, 0x4f, 0x88,
0x94, 0x96, 0xe7, 0xe0, 0x1a, 0x1f, 0xb5, 0x26, 0x06, 0x9e, 0x45, 0xad, 0x89, 0x23, 0x00, 0xf1, 0xf3, 0x09, 0x87, 0xec, 0xdc, 0x33, 0x73, 0x48, 0x23, 0xe5, 0xff, 0xe7, 0x60, 0x96, 0x9e, 0x47,
0xf2, 0xcc, 0x7e, 0xca, 0x4e, 0x18, 0x13, 0xf5, 0xba, 0x0b, 0x65, 0xe5, 0xae, 0x8f, 0x12, 0x04, 0x69, 0x79, 0x0e, 0xae, 0xf1, 0x51, 0x6b, 0x62, 0xe0, 0x59, 0xd4, 0x9a, 0x38, 0x02, 0x10, 0x2f,
0x86, 0x91, 0xb9, 0x68, 0x5d, 0x48, 0x00, 0x0a, 0xf0, 0x03, 0xa6, 0xf3, 0x0e, 0x5e, 0x08, 0xe9, 0xcf, 0xec, 0xc7, 0xee, 0x84, 0x31, 0x51, 0xaf, 0xbb, 0x50, 0x56, 0xee, 0xfa, 0x28, 0x41, 0x60,
0xec, 0x71, 0x2e, 0xaa, 0xf4, 0x8f, 0xa1, 0xa2, 0x62, 0x02, 0x28, 0x41, 0x66, 0x04, 0xf9, 0x8b, 0x18, 0x99, 0x8b, 0xd6, 0x85, 0x04, 0xa0, 0x00, 0x3f, 0x60, 0x3a, 0xef, 0xe0, 0x85, 0x90, 0xce,
0xa6, 0xc4, 0x24, 0x48, 0x21, 0x9e, 0x1d, 0xfc, 0x9f, 0xed, 0x4b, 0x56, 0xaa, 0x7c, 0x08, 0x05, 0x1e, 0xe7, 0xa2, 0x4a, 0xff, 0x18, 0x2a, 0x2a, 0x26, 0x80, 0x12, 0x64, 0x46, 0x90, 0xbf, 0x68,
0x01, 0x14, 0x24, 0xad, 0x36, 0x0c, 0x15, 0x26, 0xad, 0x36, 0x82, 0x32, 0xc4, 0xdb, 0x3c, 0xa6, 0x4a, 0x4c, 0x82, 0x14, 0xe2, 0xd9, 0xc1, 0xff, 0x61, 0xbf, 0x64, 0xa5, 0xca, 0x87, 0x50, 0x10,
0x95, 0xde, 0x87, 0x64, 0x09, 0x12, 0x1a, 0xdf, 0x12, 0x2f, 0x4d, 0x63, 0x80, 0x7d, 0xa5, 0x69, 0x40, 0x41, 0xd2, 0x6c, 0xc3, 0x50, 0x61, 0xd2, 0x6c, 0x23, 0x28, 0x43, 0xfc, 0x98, 0xc7, 0xb4,
0x54, 0xee, 0xa2, 0x93, 0x34, 0x9e, 0x12, 0x4f, 0xc4, 0x92, 0xbc, 0xe7, 0xa1, 0x14, 0x81, 0x6a, 0xd2, 0xfb, 0x90, 0x2c, 0x41, 0x42, 0xe3, 0x5b, 0xe2, 0xa5, 0x69, 0x0c, 0xb0, 0xaf, 0x34, 0x8d,
0xca, 0xc7, 0x93, 0x58, 0xd2, 0xba, 0xf2, 0x40, 0xa9, 0xc8, 0xf7, 0xe8, 0x67, 0x00, 0x01, 0xa4, 0xca, 0x5d, 0x74, 0x92, 0xc6, 0x53, 0xe2, 0x89, 0x58, 0x92, 0xf7, 0x3c, 0x94, 0x22, 0x50, 0x4d,
0x11, 0xed, 0xb6, 0x12, 0x71, 0xd1, 0x68, 0xb7, 0x95, 0x8c, 0x8a, 0xc4, 0xf3, 0x47, 0xa0, 0x9b, 0xf9, 0x78, 0x12, 0x4b, 0xda, 0xa9, 0x3c, 0x50, 0x2a, 0xf2, 0x3d, 0xfa, 0x19, 0x40, 0x00, 0x69,
0x5f, 0x0c, 0xa8, 0xf6, 0xbf, 0xd5, 0x00, 0xc5, 0x11, 0x10, 0xf4, 0x32, 0x59, 0x43, 0x22, 0xe2, 0x44, 0x4f, 0x5b, 0x89, 0xb8, 0x68, 0xf4, 0xb4, 0x95, 0x8c, 0x8a, 0xc4, 0xf3, 0x47, 0xa0, 0x9b,
0xda, 0x7c, 0x75, 0x3d, 0xe6, 0xb4, 0x12, 0x11, 0x98, 0xd5, 0x65, 0x33, 0x86, 0x1f, 0xa8, 0x61, 0x5f, 0x0c, 0xa8, 0xf6, 0xbf, 0xd1, 0x00, 0xc5, 0x11, 0x10, 0xf4, 0x32, 0x59, 0x43, 0x22, 0xe2,
0xbf, 0xd0, 0xa0, 0x1a, 0x82, 0x50, 0xd0, 0xd3, 0x94, 0x3d, 0x8e, 0x80, 0xb6, 0xcd, 0x67, 0x57, 0xda, 0x7c, 0x75, 0x3d, 0xe6, 0xb4, 0x12, 0x11, 0x98, 0xd5, 0x65, 0x23, 0x86, 0x1f, 0xa8, 0x61,
0xf2, 0xa5, 0x75, 0x62, 0xca, 0x89, 0x90, 0x8d, 0xf8, 0x5f, 0x6a, 0x50, 0x0b, 0xc3, 0x2e, 0x28, 0xbf, 0xd0, 0xa0, 0x1a, 0x82, 0x50, 0xd0, 0xd3, 0x94, 0x35, 0x8e, 0x80, 0xb6, 0xcd, 0x67, 0x57,
0x45, 0x7e, 0x0c, 0xf8, 0x6d, 0x2e, 0x5f, 0xcd, 0x78, 0xf5, 0x56, 0x05, 0xbd, 0xf9, 0x10, 0x0a, 0xf2, 0xa5, 0x9d, 0xc4, 0x94, 0x1d, 0x21, 0x0f, 0xe2, 0x7f, 0xa9, 0x41, 0x2d, 0x0c, 0xbb, 0xa0,
0x02, 0xac, 0x49, 0x0a, 0x88, 0x30, 0x6c, 0x9c, 0x14, 0x10, 0x11, 0xa4, 0x27, 0x25, 0x20, 0x1c, 0x14, 0xf9, 0x31, 0xe0, 0xb7, 0xb9, 0x7c, 0x35, 0xe3, 0xd5, 0x4b, 0x15, 0x9c, 0xcd, 0x87, 0x50,
0xbb, 0x4f, 0x94, 0x10, 0x14, 0x88, 0x4e, 0x9a, 0xc6, 0xc9, 0x21, 0x18, 0x81, 0x83, 0x26, 0x69, 0x10, 0x60, 0x4d, 0x52, 0x40, 0x84, 0x61, 0xe3, 0xa4, 0x80, 0x88, 0x20, 0x3d, 0x29, 0x01, 0xe1,
0x0c, 0x42, 0x50, 0xc2, 0x39, 0x28, 0x45, 0xe0, 0x15, 0x21, 0x18, 0x45, 0x83, 0x52, 0x42, 0x90, 0xd8, 0x7d, 0xa2, 0x84, 0xa0, 0x40, 0x74, 0xd2, 0x34, 0x4e, 0x0e, 0xc1, 0x08, 0x1c, 0x34, 0x49,
0x29, 0x55, 0x42, 0x30, 0x00, 0x5f, 0x92, 0x42, 0x30, 0x86, 0x88, 0x27, 0x85, 0x60, 0x1c, 0xbf, 0x63, 0x10, 0x82, 0x12, 0xce, 0x41, 0x29, 0x02, 0xaf, 0x08, 0xc1, 0x28, 0x1a, 0x94, 0x12, 0x82,
0x49, 0xd9, 0x57, 0xa6, 0x3b, 0x14, 0x82, 0xf3, 0x09, 0x58, 0x0d, 0x7a, 0x95, 0xe2, 0xd0, 0x44, 0x4c, 0xa9, 0x12, 0x82, 0x01, 0xf8, 0x92, 0x14, 0x82, 0x31, 0x44, 0x3c, 0x29, 0x04, 0xe3, 0xf8,
0xb0, 0xbd, 0xf9, 0xc9, 0x35, 0xb9, 0x27, 0x9e, 0x7d, 0xbe, 0x15, 0xf2, 0xec, 0xff, 0x83, 0x06, 0x4d, 0xca, 0xba, 0x32, 0xdd, 0xa1, 0x10, 0x9c, 0x4f, 0xc0, 0x6a, 0xd0, 0xab, 0x14, 0x87, 0x26,
0x0b, 0x49, 0x58, 0x0f, 0x4a, 0xd1, 0x95, 0x02, 0xd4, 0x37, 0x57, 0xae, 0xcb, 0x7e, 0xb5, 0xd7, 0x82, 0xed, 0xcd, 0x4f, 0xae, 0xc9, 0x3d, 0x71, 0xef, 0xf3, 0xa5, 0x90, 0x7b, 0xff, 0xef, 0x35,
0xfc, 0x68, 0x78, 0x53, 0xff, 0x97, 0x2f, 0x16, 0xb5, 0x7f, 0xfb, 0x62, 0x51, 0xfb, 0x8f, 0x2f, 0x58, 0x48, 0xc2, 0x7a, 0x50, 0x8a, 0xae, 0x14, 0xa0, 0xbe, 0xb9, 0x72, 0x5d, 0xf6, 0xab, 0xbd,
0x16, 0xb5, 0xbf, 0xfb, 0xcf, 0xc5, 0x99, 0xe3, 0x3c, 0xfb, 0x0f, 0x64, 0xdf, 0xfb, 0x4d, 0x00, 0xe6, 0x47, 0xc3, 0x9b, 0xfa, 0xbf, 0x7c, 0xb1, 0xa8, 0xfd, 0xdb, 0x17, 0x8b, 0xda, 0x7f, 0x7c,
0x00, 0x00, 0xff, 0xff, 0x80, 0x82, 0x49, 0x96, 0xd9, 0x36, 0x00, 0x00, 0xb1, 0xa8, 0xfd, 0xed, 0x7f, 0x2e, 0xce, 0x1c, 0xe7, 0xd9, 0x7f, 0x31, 0xfb, 0xde, 0x6f, 0x02,
0x00, 0x00, 0xff, 0xff, 0x8e, 0x1f, 0x05, 0xf6, 0xfb, 0x36, 0x00, 0x00,
} }

View File

@ -899,7 +899,7 @@ message StatusResponse {
ResponseHeader header = 1; ResponseHeader header = 1;
// version is the cluster protocol version used by the responding member. // version is the cluster protocol version used by the responding member.
string version = 2; string version = 2;
// dbSize is the size of the backend database, in bytes, of the responding member. // dbSize is the size of the backend database physically allocated, in bytes, of the responding member.
int64 dbSize = 3; int64 dbSize = 3;
// leader is the member ID which the responding member believes is the current leader. // leader is the member ID which the responding member believes is the current leader.
uint64 leader = 4; uint64 leader = 4;
@ -911,6 +911,8 @@ message StatusResponse {
uint64 raftAppliedIndex = 7; uint64 raftAppliedIndex = 7;
// errors contains alarm/health information and status. // errors contains alarm/health information and status.
repeated string errors = 8; repeated string errors = 8;
// dbSizeInUse is the size of the backend database logically in use, in bytes, of the responding member.
int64 dbSizeInUse = 9;
} }
message AuthEnableRequest { message AuthEnableRequest {

View File

@ -72,26 +72,66 @@ func TestMetricDbSizeDefrag(t *testing.T) {
if expected := numPuts * len(putreq.Value); bv < expected { if expected := numPuts * len(putreq.Value); bv < expected {
t.Fatalf("expected db size greater than %d, got %d", expected, bv) t.Fatalf("expected db size greater than %d, got %d", expected, bv)
} }
beforeDefragInUse, err := clus.Members[0].Metric("etcd_debugging_mvcc_db_total_size_in_use_in_bytes")
if err != nil {
t.Fatal(err)
}
biu, err := strconv.Atoi(beforeDefragInUse)
if err != nil {
t.Fatal(err)
}
if biu != bv {
t.Fatalf("when db size is growing, db size (%d) and db size in use (%d) is expected to be equal", bv, biu)
}
// clear out historical keys // clear out historical keys, in use bytes should free pages
creq := &pb.CompactionRequest{Revision: int64(numPuts), Physical: true} creq := &pb.CompactionRequest{Revision: int64(numPuts), Physical: true}
if _, kerr := kvc.Compact(context.TODO(), creq); kerr != nil { if _, kerr := kvc.Compact(context.TODO(), creq); kerr != nil {
t.Fatal(kerr) t.Fatal(kerr)
} }
// Put to move PendingPages to FreePages
if _, err := kvc.Put(context.TODO(), putreq); err != nil {
t.Fatal(err)
}
time.Sleep(500 * time.Millisecond)
afterCompactionInUse, err := clus.Members[0].Metric("etcd_debugging_mvcc_db_total_size_in_use_in_bytes")
if err != nil {
t.Fatal(err)
}
aciu, err := strconv.Atoi(afterCompactionInUse)
if err != nil {
t.Fatal(err)
}
if biu <= aciu {
t.Fatalf("expected less than %d, got %d after compaction", biu, aciu)
}
// defrag should give freed space back to fs // defrag should give freed space back to fs
mc.Defragment(context.TODO(), &pb.DefragmentRequest{}) mc.Defragment(context.TODO(), &pb.DefragmentRequest{})
afterDefrag, err := clus.Members[0].Metric("etcd_debugging_mvcc_db_total_size_in_bytes") afterDefrag, err := clus.Members[0].Metric("etcd_debugging_mvcc_db_total_size_in_bytes")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
av, err := strconv.Atoi(afterDefrag) av, err := strconv.Atoi(afterDefrag)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
if bv <= av { if bv <= av {
t.Fatalf("expected less than %d, got %d after defrag", bv, av) t.Fatalf("expected less than %d, got %d after defrag", bv, av)
} }
afterDefragInUse, err := clus.Members[0].Metric("etcd_debugging_mvcc_db_total_size_in_use_in_bytes")
if err != nil {
t.Fatal(err)
}
adiu, err := strconv.Atoi(afterDefragInUse)
if err != nil {
t.Fatal(err)
}
if adiu > av {
t.Fatalf("db size in use (%d) is expected less than db size (%d) after defrag", adiu, av)
}
} }

View File

@ -52,8 +52,15 @@ type Backend interface {
Snapshot() Snapshot Snapshot() Snapshot
Hash(ignores map[IgnoreKey]struct{}) (uint32, error) Hash(ignores map[IgnoreKey]struct{}) (uint32, error)
// Size returns the current size of the backend. // Size returns the current size of the backend physically allocated.
// The backend can hold DB space that is not utilized at the moment,
// since it can conduct pre-allocation or spare unused space for recycling.
// Use SizeInUse() instead for the actual DB size.
Size() int64 Size() int64
// SizeInUse returns the current size of the backend logically in use.
// Since the backend can manage free space in a non-byte unit such as
// number of pages, the returned value can be not exactly accurate in bytes.
SizeInUse() int64
Defrag() error Defrag() error
ForceCommit() ForceCommit()
Close() error Close() error
@ -72,8 +79,10 @@ type backend struct {
// size and commits are used with atomic operations so they must be // size and commits are used with atomic operations so they must be
// 64-bit aligned, otherwise 32-bit tests will crash // 64-bit aligned, otherwise 32-bit tests will crash
// size is the number of bytes in the backend // size is the number of bytes allocated in the backend
size int64 size int64
// sizeInUse is the number of bytes actually used in the backend
sizeInUse int64
// commits counts number of commits since start // commits counts number of commits since start
commits int64 commits int64
@ -247,6 +256,10 @@ func (b *backend) Size() int64 {
return atomic.LoadInt64(&b.size) return atomic.LoadInt64(&b.size)
} }
func (b *backend) SizeInUse() int64 {
return atomic.LoadInt64(&b.sizeInUse)
}
func (b *backend) run() { func (b *backend) run() {
defer close(b.donec) defer close(b.donec)
t := time.NewTimer(b.batchInterval) t := time.NewTimer(b.batchInterval)
@ -344,7 +357,11 @@ func (b *backend) defrag() error {
b.readTx.reset() b.readTx.reset()
b.readTx.tx = b.unsafeBegin(false) b.readTx.tx = b.unsafeBegin(false)
atomic.StoreInt64(&b.size, b.readTx.tx.Size())
size := b.readTx.tx.Size()
db := b.readTx.tx.DB()
atomic.StoreInt64(&b.size, size)
atomic.StoreInt64(&b.sizeInUse, size-(int64(db.Stats().FreePageN)*int64(db.Info().PageSize)))
return nil return nil
} }
@ -405,7 +422,12 @@ func (b *backend) begin(write bool) *bolt.Tx {
b.mu.RLock() b.mu.RLock()
tx := b.unsafeBegin(write) tx := b.unsafeBegin(write)
b.mu.RUnlock() b.mu.RUnlock()
atomic.StoreInt64(&b.size, tx.Size())
size := tx.Size()
db := tx.DB()
atomic.StoreInt64(&b.size, size)
atomic.StoreInt64(&b.sizeInUse, size-(int64(db.Stats().FreePageN)*int64(db.Info().PageSize)))
return tx return tx
} }

View File

@ -165,7 +165,10 @@ func (t *batchTx) commit(stop bool) {
// which initializes *bolt.Tx.db and *bolt.Tx.meta as nil; panics t.tx.Size(). // which initializes *bolt.Tx.db and *bolt.Tx.meta as nil; panics t.tx.Size().
// Server must make sure 'batchTx.commit(false)' does not follow // Server must make sure 'batchTx.commit(false)' does not follow
// 'batchTx.commit(true)' (e.g. stopping backend, and inflight Hash call). // 'batchTx.commit(true)' (e.g. stopping backend, and inflight Hash call).
atomic.StoreInt64(&t.backend.size, t.tx.Size()) size := t.tx.Size()
db := t.tx.DB()
atomic.StoreInt64(&t.backend.size, size)
atomic.StoreInt64(&t.backend.sizeInUse, size-(int64(db.Stats().FreePageN)*int64(db.Info().PageSize)))
return return
} }

View File

@ -300,10 +300,13 @@ func (s *store) Restore(b backend.Backend) error {
} }
func (s *store) restore() error { func (s *store) restore() error {
reportDbTotalSizeInBytesMu.Lock()
b := s.b b := s.b
reportDbTotalSizeInBytesMu.Lock()
reportDbTotalSizeInBytes = func() float64 { return float64(b.Size()) } reportDbTotalSizeInBytes = func() float64 { return float64(b.Size()) }
reportDbTotalSizeInBytesMu.Unlock() reportDbTotalSizeInBytesMu.Unlock()
reportDbTotalSizeInUseInBytesMu.Lock()
reportDbTotalSizeInUseInBytes = func() float64 { return float64(b.SizeInUse()) }
reportDbTotalSizeInUseInBytesMu.Unlock()
min, max := newRevBytes(), newRevBytes() min, max := newRevBytes(), newRevBytes()
revToBytes(revision{main: 1}, min) revToBytes(revision{main: 1}, min)

View File

@ -741,6 +741,7 @@ func (b *fakeBackend) BatchTx() backend.BatchTx
func (b *fakeBackend) ReadTx() backend.ReadTx { return b.tx } func (b *fakeBackend) ReadTx() backend.ReadTx { return b.tx }
func (b *fakeBackend) Hash(ignores map[backend.IgnoreKey]struct{}) (uint32, error) { return 0, nil } func (b *fakeBackend) Hash(ignores map[backend.IgnoreKey]struct{}) (uint32, error) { return 0, nil }
func (b *fakeBackend) Size() int64 { return 0 } func (b *fakeBackend) Size() int64 { return 0 }
func (b *fakeBackend) SizeInUse() int64 { return 0 }
func (b *fakeBackend) Snapshot() backend.Snapshot { return nil } func (b *fakeBackend) Snapshot() backend.Snapshot { return nil }
func (b *fakeBackend) ForceCommit() {} func (b *fakeBackend) ForceCommit() {}
func (b *fakeBackend) Defrag() error { return nil } func (b *fakeBackend) Defrag() error { return nil }

View File

@ -143,7 +143,7 @@ var (
Namespace: "etcd_debugging", Namespace: "etcd_debugging",
Subsystem: "mvcc", Subsystem: "mvcc",
Name: "db_total_size_in_bytes", Name: "db_total_size_in_bytes",
Help: "Total size of the underlying database in bytes.", Help: "Total size of the underlying database physically allocated in bytes.",
}, },
func() float64 { func() float64 {
reportDbTotalSizeInBytesMu.RLock() reportDbTotalSizeInBytesMu.RLock()
@ -154,6 +154,22 @@ var (
// overridden by mvcc initialization // overridden by mvcc initialization
reportDbTotalSizeInBytesMu sync.RWMutex reportDbTotalSizeInBytesMu sync.RWMutex
reportDbTotalSizeInBytes func() float64 = func() float64 { return 0 } reportDbTotalSizeInBytes func() float64 = func() float64 { return 0 }
dbTotalSizeInUse = prometheus.NewGaugeFunc(prometheus.GaugeOpts{
Namespace: "etcd_debugging",
Subsystem: "mvcc",
Name: "db_total_size_in_use_in_bytes",
Help: "Total size of the underlying database logically in use in bytes.",
},
func() float64 {
reportDbTotalSizeInUseInBytesMu.RLock()
defer reportDbTotalSizeInUseInBytesMu.RUnlock()
return reportDbTotalSizeInUseInBytes()
},
)
// overridden by mvcc initialization
reportDbTotalSizeInUseInBytesMu sync.RWMutex
reportDbTotalSizeInUseInBytes func() float64 = func() float64 { return 0 }
) )
func init() { func init() {
@ -172,6 +188,7 @@ func init() {
prometheus.MustRegister(dbCompactionTotalDurations) prometheus.MustRegister(dbCompactionTotalDurations)
prometheus.MustRegister(dbCompactionKeysCounter) prometheus.MustRegister(dbCompactionKeysCounter)
prometheus.MustRegister(dbTotalSize) prometheus.MustRegister(dbTotalSize)
prometheus.MustRegister(dbTotalSizeInUse)
} }
// ReportEventReceived reports that an event is received. // ReportEventReceived reports that an event is received.