functional: rename to "SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_LEADER_SNAPSHOT_FROM_SCRATCH"

Signed-off-by: Gyuho Lee <gyuhox@gmail.com>
This commit is contained in:
Gyuho Lee 2018-04-11 13:42:10 -07:00
parent f9127dba9c
commit ca137afe8a
6 changed files with 239 additions and 233 deletions

View File

@ -174,7 +174,7 @@ tester-config:
- SIGTERM_ALL
- SIGQUIT_AND_REMOVE_ONE_FOLLOWER
- SIGQUIT_AND_REMOVE_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT
- SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_SNAPSHOT_FROM_SCRATCH
- SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_LEADER_SNAPSHOT_FROM_SCRATCH
- BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER
- BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT
- BLACKHOLE_PEER_PORT_TX_RX_LEADER

View File

@ -207,28 +207,31 @@ const (
// snapshot from the newly elected leader. As always, after recovery, each
// member must be able to process client requests.
FailureCase_SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT FailureCase = 13
// SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_SNAPSHOT_FROM_SCRATCH first stops
// majority number of nodes, deletes data directories on those quorum nodes,
// to make the whole cluster inoperable. Now that quorum and their data are
// totally destroyed, cluster cannot even remove unavailable nodes (e.g. 2
// out of 3 are lost, so no leader can be elected).
// SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_LEADER_SNAPSHOT_FROM_SCRATCH first
// stops majority number of nodes, deletes data directories on those quorum
// nodes, to make the whole cluster inoperable. Now that quorum and their
// data are totally destroyed, cluster cannot even remove unavailable nodes
// (e.g. 2 out of 3 are lost, so no leader can be elected).
// Let's assume 3-node cluster of node A, B, and C. One day, node A and B
// are destroyed and all their data are gone. The only viable solution is
// to recover from C's latest snapshot.
// Tester simulates this scenario by:
// 1. Download snapshot from node C, before destroying node A and B.
// 2. Destroy node A and B, and make the whole cluster inoperable.
// 3. Now node C cannot operate either.
// 4. SIGTERM node C and remove its data directories.
// 5. Restore a new seed member from node C's latest snapshot file.
// 6. Add another member to establish 2-node cluster.
// 7. Add another member to establish 3-node cluster.
//
// To simulate:
// 1. Assume node C is the current leader with most up-to-date data.
// 2. Download snapshot from node C, before destroying node A and B.
// 3. Destroy node A and B, and make the whole cluster inoperable.
// 4. Now node C cannot operate either.
// 5. SIGTERM node C and remove its data directories.
// 6. Restore a new seed member from node C's latest snapshot file.
// 7. Add another member to establish 2-node cluster.
// 8. Add another member to establish 3-node cluster.
//
// The expected behavior is that etcd successfully recovers from such
// disastrous situation as only 1-node survives out of 3-node cluster,
// new members joins the existing cluster, and previous data from snapshot
// are still preserved after recovery process. As always, after recovery,
// each member must be able to process client requests.
FailureCase_SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_SNAPSHOT_FROM_SCRATCH FailureCase = 14
FailureCase_SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_LEADER_SNAPSHOT_FROM_SCRATCH FailureCase = 14
// BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER drops all outgoing/incoming
// packets from/to the peer port on a randomly chosen follower
// (non-leader), and waits for "failure-delay-ms" until recovery.
@ -427,7 +430,7 @@ var FailureCase_name = map[int32]string{
11: "SIGQUIT_AND_REMOVE_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT",
12: "SIGQUIT_AND_REMOVE_LEADER",
13: "SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT",
14: "SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_SNAPSHOT_FROM_SCRATCH",
14: "SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_LEADER_SNAPSHOT_FROM_SCRATCH",
100: "BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER",
101: "BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT",
102: "BLACKHOLE_PEER_PORT_TX_RX_LEADER",
@ -452,39 +455,39 @@ var FailureCase_name = map[int32]string{
500: "EXTERNAL",
}
var FailureCase_value = map[string]int32{
"SIGTERM_ONE_FOLLOWER": 0,
"SIGTERM_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT": 1,
"SIGTERM_LEADER": 2,
"SIGTERM_LEADER_UNTIL_TRIGGER_SNAPSHOT": 3,
"SIGTERM_QUORUM": 4,
"SIGTERM_ALL": 5,
"SIGQUIT_AND_REMOVE_ONE_FOLLOWER": 10,
"SIGQUIT_AND_REMOVE_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT": 11,
"SIGQUIT_AND_REMOVE_LEADER": 12,
"SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT": 13,
"SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_SNAPSHOT_FROM_SCRATCH": 14,
"BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER": 100,
"BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT": 101,
"BLACKHOLE_PEER_PORT_TX_RX_LEADER": 102,
"BLACKHOLE_PEER_PORT_TX_RX_LEADER_UNTIL_TRIGGER_SNAPSHOT": 103,
"BLACKHOLE_PEER_PORT_TX_RX_QUORUM": 104,
"BLACKHOLE_PEER_PORT_TX_RX_ALL": 105,
"DELAY_PEER_PORT_TX_RX_ONE_FOLLOWER": 200,
"RANDOM_DELAY_PEER_PORT_TX_RX_ONE_FOLLOWER": 201,
"DELAY_PEER_PORT_TX_RX_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT": 202,
"RANDOM_DELAY_PEER_PORT_TX_RX_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT": 203,
"DELAY_PEER_PORT_TX_RX_LEADER": 204,
"RANDOM_DELAY_PEER_PORT_TX_RX_LEADER": 205,
"DELAY_PEER_PORT_TX_RX_LEADER_UNTIL_TRIGGER_SNAPSHOT": 206,
"RANDOM_DELAY_PEER_PORT_TX_RX_LEADER_UNTIL_TRIGGER_SNAPSHOT": 207,
"DELAY_PEER_PORT_TX_RX_QUORUM": 208,
"RANDOM_DELAY_PEER_PORT_TX_RX_QUORUM": 209,
"DELAY_PEER_PORT_TX_RX_ALL": 210,
"RANDOM_DELAY_PEER_PORT_TX_RX_ALL": 211,
"NO_FAIL_WITH_STRESS": 300,
"NO_FAIL_WITH_NO_STRESS_FOR_LIVENESS": 301,
"FAILPOINTS": 400,
"EXTERNAL": 500,
"SIGTERM_ONE_FOLLOWER": 0,
"SIGTERM_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT": 1,
"SIGTERM_LEADER": 2,
"SIGTERM_LEADER_UNTIL_TRIGGER_SNAPSHOT": 3,
"SIGTERM_QUORUM": 4,
"SIGTERM_ALL": 5,
"SIGQUIT_AND_REMOVE_ONE_FOLLOWER": 10,
"SIGQUIT_AND_REMOVE_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT": 11,
"SIGQUIT_AND_REMOVE_LEADER": 12,
"SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT": 13,
"SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_LEADER_SNAPSHOT_FROM_SCRATCH": 14,
"BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER": 100,
"BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT": 101,
"BLACKHOLE_PEER_PORT_TX_RX_LEADER": 102,
"BLACKHOLE_PEER_PORT_TX_RX_LEADER_UNTIL_TRIGGER_SNAPSHOT": 103,
"BLACKHOLE_PEER_PORT_TX_RX_QUORUM": 104,
"BLACKHOLE_PEER_PORT_TX_RX_ALL": 105,
"DELAY_PEER_PORT_TX_RX_ONE_FOLLOWER": 200,
"RANDOM_DELAY_PEER_PORT_TX_RX_ONE_FOLLOWER": 201,
"DELAY_PEER_PORT_TX_RX_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT": 202,
"RANDOM_DELAY_PEER_PORT_TX_RX_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT": 203,
"DELAY_PEER_PORT_TX_RX_LEADER": 204,
"RANDOM_DELAY_PEER_PORT_TX_RX_LEADER": 205,
"DELAY_PEER_PORT_TX_RX_LEADER_UNTIL_TRIGGER_SNAPSHOT": 206,
"RANDOM_DELAY_PEER_PORT_TX_RX_LEADER_UNTIL_TRIGGER_SNAPSHOT": 207,
"DELAY_PEER_PORT_TX_RX_QUORUM": 208,
"RANDOM_DELAY_PEER_PORT_TX_RX_QUORUM": 209,
"DELAY_PEER_PORT_TX_RX_ALL": 210,
"RANDOM_DELAY_PEER_PORT_TX_RX_ALL": 211,
"NO_FAIL_WITH_STRESS": 300,
"NO_FAIL_WITH_NO_STRESS_FOR_LIVENESS": 301,
"FAILPOINTS": 400,
"EXTERNAL": 500,
}
func (x FailureCase) String() string {
@ -4299,165 +4302,165 @@ func init() { proto.RegisterFile("rpcpb/rpc.proto", fileDescriptorRpc) }
var fileDescriptorRpc = []byte{
// 2569 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x59, 0x4b, 0x77, 0xdb, 0xc6,
0x15, 0x36, 0x44, 0xcb, 0x8e, 0x46, 0x2f, 0x6a, 0x64, 0xd9, 0xf0, 0x4b, 0x90, 0xe1, 0x38, 0xb5,
0x9d, 0xc2, 0x4e, 0xed, 0x9c, 0xb4, 0x71, 0x1e, 0x0e, 0x48, 0x41, 0x16, 0x2b, 0x88, 0xa4, 0x87,
0x90, 0x9d, 0xac, 0x50, 0x88, 0x1c, 0x49, 0xa8, 0x29, 0x80, 0x01, 0x86, 0x8e, 0x94, 0x3f, 0xd0,
0x6d, 0xdf, 0xa7, 0x3f, 0xa2, 0xe9, 0xef, 0x70, 0xd2, 0x57, 0xda, 0xae, 0x7a, 0x4e, 0xcb, 0xd3,
0x3a, 0xfb, 0x2e, 0x78, 0xfa, 0x4a, 0x57, 0x3d, 0xf3, 0x00, 0x39, 0x00, 0x48, 0x49, 0x3b, 0xe1,
0xde, 0xef, 0xfb, 0x70, 0xe7, 0xde, 0x99, 0xb9, 0x17, 0x22, 0x98, 0x8f, 0x3a, 0xcd, 0xce, 0xf6,
0xdd, 0xa8, 0xd3, 0xbc, 0xd3, 0x89, 0x42, 0x12, 0xc2, 0x49, 0x66, 0xb8, 0x64, 0xec, 0xfa, 0x64,
0xaf, 0xbb, 0x7d, 0xa7, 0x19, 0xee, 0xdf, 0xdd, 0x0d, 0x77, 0xc3, 0xbb, 0xcc, 0xbb, 0xdd, 0xdd,
0x61, 0x4f, 0xec, 0x81, 0xfd, 0xc5, 0x59, 0xfa, 0x0f, 0x14, 0x70, 0x16, 0xe1, 0x8f, 0xbb, 0x38,
0x26, 0xf0, 0x0e, 0x98, 0xaa, 0x75, 0x70, 0xe4, 0x11, 0x3f, 0x0c, 0x54, 0x65, 0x45, 0xb9, 0x39,
0x77, 0xaf, 0x78, 0x87, 0xa9, 0xde, 0x19, 0xd8, 0xd1, 0x10, 0x02, 0x6f, 0x80, 0x33, 0x9b, 0x78,
0x7f, 0x1b, 0x47, 0xea, 0xc4, 0x8a, 0x72, 0x73, 0xfa, 0xde, 0xac, 0x00, 0x73, 0x23, 0x12, 0x4e,
0x0a, 0x73, 0x70, 0x4c, 0x70, 0xa4, 0x16, 0x52, 0x30, 0x6e, 0x44, 0xc2, 0xa9, 0x37, 0xc1, 0x2b,
0x08, 0xc7, 0x9d, 0x30, 0x88, 0x31, 0x54, 0xc1, 0xd9, 0x46, 0xb7, 0xd9, 0xc4, 0x71, 0xcc, 0xe2,
0x78, 0x05, 0x25, 0x8f, 0xf0, 0x3c, 0x38, 0xd3, 0x20, 0x1e, 0xe9, 0xc6, 0xec, 0x9d, 0x53, 0x48,
0x3c, 0x49, 0xb1, 0x14, 0x8e, 0x88, 0x45, 0xff, 0xeb, 0x74, 0x82, 0x83, 0xef, 0x81, 0x19, 0x8b,
0x34, 0x5b, 0xd6, 0x01, 0x6e, 0xd6, 0x3d, 0xb2, 0xc7, 0x5e, 0x34, 0x55, 0xba, 0xd8, 0xef, 0x69,
0x4b, 0x87, 0xde, 0x7e, 0xfb, 0x81, 0x8e, 0x49, 0xb3, 0x65, 0xe0, 0x03, 0xdc, 0x34, 0x3a, 0x1e,
0xd9, 0xd3, 0x51, 0x0a, 0x0e, 0xef, 0x83, 0x29, 0x73, 0x17, 0x07, 0xc4, 0x6c, 0xb5, 0x22, 0x75,
0x9a, 0x71, 0x97, 0xfa, 0x3d, 0x6d, 0x81, 0x73, 0x3d, 0xea, 0x32, 0xbc, 0x56, 0x2b, 0xd2, 0xd1,
0x10, 0x07, 0x6d, 0xb0, 0xb0, 0xe6, 0xf9, 0xed, 0x4e, 0xe8, 0x07, 0x64, 0xdd, 0x71, 0xea, 0x8c,
0x3c, 0xc3, 0xc8, 0xcb, 0xfd, 0x9e, 0x76, 0x89, 0x93, 0x77, 0x12, 0x88, 0xb1, 0x47, 0x48, 0x47,
0xa8, 0xe4, 0x89, 0xd0, 0x00, 0x67, 0x4b, 0x5e, 0x8c, 0x57, 0xfd, 0x48, 0xc5, 0x4c, 0x63, 0xb1,
0xdf, 0xd3, 0xe6, 0xb9, 0xc6, 0xb6, 0x17, 0x63, 0xa3, 0xe5, 0x47, 0x3a, 0x4a, 0x30, 0xf0, 0x01,
0x98, 0xa6, 0x2b, 0xb0, 0xc3, 0x5d, 0xb6, 0xde, 0x1d, 0x46, 0x51, 0xfb, 0x3d, 0xed, 0x9c, 0xb4,
0xde, 0x76, 0xb8, 0x2b, 0x96, 0x2b, 0x83, 0xe1, 0x23, 0x30, 0x4f, 0x1f, 0xcb, 0x6d, 0x1f, 0x07,
0xa4, 0x1e, 0x85, 0x07, 0x87, 0xea, 0xe7, 0xac, 0x32, 0xa5, 0x2b, 0xfd, 0x9e, 0xa6, 0x4a, 0x02,
0x4d, 0x06, 0x31, 0x3a, 0x14, 0xa3, 0xa3, 0x2c, 0x0b, 0x9a, 0x60, 0x96, 0x9a, 0xea, 0x18, 0x47,
0x5c, 0xe6, 0x0b, 0x2e, 0x73, 0xa9, 0xdf, 0xd3, 0xce, 0x4b, 0x32, 0x1d, 0x8c, 0xa3, 0x44, 0x24,
0xcd, 0x80, 0x75, 0x00, 0x87, 0xaa, 0x56, 0xd0, 0x62, 0x49, 0x51, 0x3f, 0x63, 0xfb, 0xa1, 0xa4,
0xf5, 0x7b, 0xda, 0xe5, 0x7c, 0x38, 0x58, 0xc0, 0x74, 0x34, 0x82, 0x0b, 0xbf, 0x05, 0x4e, 0x53,
0xab, 0xfa, 0x2b, 0xbe, 0x8f, 0xa7, 0xc5, 0xde, 0xa1, 0xb6, 0xd2, 0x7c, 0xbf, 0xa7, 0x4d, 0x0f,
0x05, 0x75, 0xc4, 0xa0, 0x70, 0x15, 0xcc, 0x71, 0x91, 0x32, 0x8e, 0xc8, 0xaa, 0x47, 0x3c, 0xf5,
0x47, 0x05, 0x16, 0xc0, 0xe5, 0x7e, 0x4f, 0xbb, 0xc0, 0xf1, 0xe2, 0xdd, 0x4d, 0x1c, 0x11, 0xa3,
0xe5, 0x11, 0x4f, 0x47, 0x19, 0x4e, 0x5a, 0x85, 0x55, 0xe5, 0xc7, 0x47, 0xaa, 0xf0, 0xca, 0x64,
0x38, 0x34, 0xa7, 0xdc, 0xb2, 0x81, 0x0f, 0x59, 0x28, 0x3f, 0xe1, 0x22, 0x52, 0x4e, 0x85, 0xc8,
0x33, 0x7c, 0x28, 0x22, 0x49, 0x33, 0x52, 0x12, 0x2c, 0x8e, 0x9f, 0x1e, 0x25, 0xc1, 0xc3, 0x48,
0x33, 0xa0, 0x03, 0x16, 0xb9, 0xc1, 0x89, 0xba, 0x31, 0xc1, 0xad, 0xb2, 0xc9, 0x62, 0xf9, 0x19,
0x17, 0xba, 0xd6, 0xef, 0x69, 0x57, 0x53, 0x42, 0x84, 0xc3, 0x8c, 0xa6, 0x27, 0x42, 0x1a, 0x45,
0x1f, 0xa1, 0xca, 0xc2, 0xfb, 0xf9, 0x09, 0x54, 0x79, 0x94, 0xa3, 0xe8, 0xf0, 0x7d, 0x30, 0x43,
0xf7, 0xd3, 0xa0, 0x76, 0xff, 0x2a, 0x64, 0x0f, 0x3f, 0xdb, 0x7f, 0x52, 0xe5, 0x52, 0x78, 0x99,
0xcf, 0xc2, 0xf9, 0xf7, 0x11, 0x7c, 0x71, 0x79, 0xc8, 0x78, 0xf8, 0x0e, 0x98, 0xa6, 0xcf, 0x49,
0xbd, 0xfe, 0x53, 0xc8, 0x9e, 0x45, 0x46, 0x1f, 0x56, 0x4b, 0x46, 0x4b, 0x64, 0xf6, 0xee, 0xff,
0x8e, 0x27, 0x8b, 0x83, 0x2c, 0xa1, 0x61, 0x15, 0x2c, 0xd0, 0xc7, 0x74, 0x8d, 0xbe, 0x2e, 0x64,
0xcf, 0x0e, 0x93, 0xc8, 0x55, 0x28, 0x4f, 0xcd, 0xe9, 0xb1, 0x90, 0xfe, 0x77, 0xac, 0x1e, 0x8f,
0x2c, 0x4f, 0xa5, 0xb7, 0x72, 0x23, 0xf0, 0x3a, 0xf1, 0x5e, 0xc8, 0x33, 0xfb, 0xe7, 0xd3, 0xd9,
0xd5, 0xc5, 0xc2, 0x9d, 0x24, 0x56, 0x86, 0xeb, 0x5f, 0xcd, 0x24, 0xcd, 0x86, 0xde, 0x8e, 0x34,
0x42, 0x7a, 0x3b, 0x2a, 0xd9, 0xdb, 0x91, 0x2e, 0x47, 0xdc, 0x8e, 0x02, 0x03, 0xbf, 0x09, 0xce,
0x56, 0x31, 0xf9, 0x24, 0x8c, 0x9e, 0xf1, 0xce, 0x52, 0x82, 0xfd, 0x9e, 0x36, 0xc7, 0xe1, 0x01,
0x77, 0xe8, 0x28, 0x81, 0xc0, 0xeb, 0xe0, 0x34, 0xbb, 0xbb, 0xf9, 0x42, 0xa5, 0x3b, 0x82, 0x5f,
0xd6, 0xcc, 0x09, 0xcb, 0x60, 0x6e, 0x15, 0xb7, 0xbd, 0x43, 0xdb, 0x23, 0x38, 0x68, 0x1e, 0x6e,
0xc6, 0xac, 0x4f, 0xcc, 0xca, 0x87, 0xbb, 0x45, 0xfd, 0x46, 0x9b, 0x03, 0x8c, 0xfd, 0x58, 0x47,
0x19, 0x0a, 0xfc, 0x2e, 0x28, 0xa6, 0x2d, 0xe8, 0x39, 0xeb, 0x18, 0xb3, 0x72, 0xc7, 0xc8, 0xca,
0x18, 0xd1, 0x73, 0x1d, 0xe5, 0x78, 0xf0, 0x23, 0xb0, 0xb4, 0xd5, 0x69, 0x79, 0x04, 0xb7, 0x32,
0x71, 0xcd, 0x32, 0xc1, 0xeb, 0xfd, 0x9e, 0xa6, 0x71, 0xc1, 0x2e, 0x87, 0x19, 0xf9, 0xf8, 0x46,
0x2b, 0xc0, 0xb7, 0x00, 0x40, 0x61, 0x37, 0x68, 0xd9, 0xfe, 0xbe, 0x4f, 0xd4, 0xa5, 0x15, 0xe5,
0xe6, 0x64, 0xe9, 0x7c, 0xbf, 0xa7, 0x41, 0xae, 0x17, 0x51, 0x9f, 0xd1, 0xa6, 0x4e, 0x1d, 0x49,
0x48, 0xf8, 0x01, 0x98, 0xb5, 0x0e, 0x7c, 0x52, 0x0b, 0x68, 0x7b, 0xeb, 0x46, 0x58, 0x3d, 0x9f,
0x6b, 0x07, 0x07, 0x3e, 0x31, 0xc2, 0xc0, 0xd8, 0xe1, 0x00, 0xda, 0x0e, 0x64, 0x02, 0x5c, 0x07,
0xc5, 0x72, 0x18, 0xc4, 0x7e, 0xcc, 0x42, 0x29, 0xef, 0xe1, 0xe6, 0x33, 0xf5, 0x42, 0xb6, 0x35,
0x35, 0x87, 0x08, 0xa3, 0x49, 0x21, 0x3a, 0xca, 0xb1, 0xe0, 0xdb, 0x60, 0xda, 0x0a, 0xbc, 0xed,
0x36, 0xae, 0x77, 0xa2, 0x70, 0x47, 0x55, 0x99, 0xc8, 0x85, 0x7e, 0x4f, 0x5b, 0x14, 0x91, 0x30,
0xa7, 0xd1, 0xa1, 0x5e, 0xda, 0x1f, 0x87, 0x58, 0x5a, 0x6a, 0x11, 0x0f, 0xcb, 0xcb, 0x66, 0xac,
0x6a, 0xd9, 0x52, 0x8b, 0xf8, 0x45, 0x4a, 0x59, 0xa9, 0xd3, 0x14, 0x58, 0x1a, 0x88, 0x34, 0xf6,
0xba, 0x3b, 0x3b, 0x6d, 0xac, 0xae, 0x64, 0x93, 0x91, 0x88, 0xc4, 0x1c, 0x30, 0xd4, 0x10, 0x0c,
0xf8, 0x2e, 0x98, 0x11, 0x96, 0xb2, 0x17, 0xe3, 0x58, 0xbd, 0xb6, 0x52, 0x48, 0x1f, 0x9f, 0x44,
0xa1, 0x49, 0xdd, 0x3a, 0x4a, 0xa1, 0xe1, 0x86, 0x34, 0x9f, 0x94, 0xc3, 0xfd, 0x7d, 0x2f, 0x68,
0xc5, 0xaa, 0xce, 0x24, 0xae, 0xf6, 0x7b, 0xda, 0xc5, 0xec, 0x7c, 0xd2, 0x14, 0x18, 0x79, 0x3c,
0x49, 0x78, 0x34, 0x27, 0xa8, 0x1b, 0x04, 0x38, 0x1a, 0x8c, 0x58, 0xb7, 0xb2, 0xbd, 0x2d, 0x62,
0x7e, 0x79, 0xc8, 0xca, 0x50, 0x60, 0x05, 0x14, 0xad, 0x03, 0x82, 0xa3, 0xc0, 0x6b, 0x0f, 0x64,
0x6e, 0x33, 0x19, 0x29, 0x20, 0x2c, 0x10, 0xb2, 0x50, 0x8e, 0x46, 0xcb, 0xdb, 0x20, 0x11, 0x8e,
0x63, 0xe7, 0xb0, 0x83, 0x63, 0x15, 0xb3, 0x65, 0x49, 0xe5, 0x8d, 0x99, 0xd3, 0x20, 0xd4, 0xab,
0x23, 0x19, 0x4b, 0x77, 0x29, 0x7f, 0xdc, 0xc0, 0x87, 0x0d, 0xff, 0x53, 0xcc, 0x86, 0xa7, 0x49,
0xb9, 0x30, 0x82, 0x4c, 0x6f, 0xdd, 0xd8, 0xff, 0x94, 0xee, 0xd2, 0x14, 0x81, 0x0e, 0x2d, 0x29,
0x83, 0xed, 0x45, 0xbb, 0x58, 0xdd, 0x65, 0x32, 0x2b, 0xfd, 0x9e, 0x76, 0x65, 0xa4, 0x8c, 0xd1,
0xa6, 0x30, 0x1d, 0x8d, 0xe0, 0xc2, 0x27, 0xe0, 0xdc, 0xd0, 0xda, 0xdd, 0xd9, 0xf1, 0x0f, 0x90,
0x17, 0xec, 0x62, 0x75, 0x8f, 0x69, 0xea, 0xfd, 0x9e, 0xb6, 0x9c, 0xd7, 0x64, 0x38, 0x23, 0xa2,
0x40, 0x1d, 0x8d, 0xe4, 0xc3, 0xef, 0x81, 0x0b, 0xa3, 0xec, 0xce, 0x41, 0xa0, 0xfa, 0x4c, 0xfa,
0xb5, 0x7e, 0x4f, 0xd3, 0x8f, 0x94, 0x36, 0xc8, 0x41, 0xa0, 0xa3, 0x71, 0x32, 0x74, 0x98, 0x1c,
0xb8, 0x9c, 0x83, 0xa0, 0xd6, 0x89, 0xd5, 0xef, 0x33, 0x65, 0xa9, 0xa4, 0x92, 0x32, 0x39, 0x08,
0x8c, 0xb0, 0x13, 0xeb, 0x28, 0xcb, 0x1a, 0x96, 0x85, 0xf7, 0xf8, 0x98, 0xcf, 0xa4, 0x93, 0x72,
0x1f, 0x16, 0x3a, 0x7c, 0x3a, 0x88, 0x07, 0x65, 0x11, 0x04, 0xf8, 0x26, 0x98, 0xe2, 0x86, 0xc7,
0xf5, 0x06, 0x1f, 0x45, 0x27, 0xe5, 0x31, 0x5e, 0xb0, 0x3f, 0xa6, 0x6f, 0x1f, 0x02, 0xf5, 0xaf,
0x67, 0xf9, 0xc0, 0x48, 0xdb, 0x40, 0xd5, 0xdb, 0xc7, 0xa2, 0xc1, 0x48, 0x6d, 0x20, 0xf0, 0xf6,
0xb1, 0x8e, 0x98, 0x53, 0x6e, 0x44, 0x13, 0x27, 0x68, 0x44, 0xb7, 0xc1, 0x99, 0xa7, 0xa6, 0x4d,
0xd1, 0x85, 0x6c, 0x1f, 0xfa, 0xc4, 0x6b, 0x73, 0xb0, 0x40, 0xc0, 0x1a, 0x58, 0x5c, 0xc7, 0x5e,
0x44, 0xb6, 0xb1, 0x47, 0x2a, 0x01, 0xc1, 0xd1, 0x73, 0xaf, 0x2d, 0xda, 0x4c, 0x41, 0xce, 0xe6,
0x5e, 0x02, 0x32, 0x7c, 0x81, 0xd2, 0xd1, 0x28, 0x26, 0xac, 0x80, 0x05, 0xab, 0x8d, 0x9b, 0xf4,
0xf3, 0xce, 0xf1, 0xf7, 0x71, 0xd8, 0x25, 0x9b, 0x31, 0x6b, 0x37, 0x05, 0xf9, 0xd8, 0x62, 0x01,
0x31, 0x08, 0xc7, 0xe8, 0x28, 0xcf, 0xa2, 0x27, 0xd7, 0x66, 0xd7, 0x2b, 0xcf, 0xf5, 0x16, 0xb2,
0x63, 0x75, 0x29, 0x7b, 0x95, 0xb4, 0x19, 0x22, 0x99, 0xd2, 0xbb, 0x51, 0x3b, 0xd6, 0x51, 0x8e,
0x06, 0x11, 0x58, 0x34, 0x5b, 0xcf, 0x71, 0x44, 0xfc, 0x18, 0x4b, 0x6a, 0xe7, 0x99, 0x9a, 0x74,
0x7a, 0xbc, 0x04, 0x94, 0x16, 0x1c, 0x45, 0x86, 0x6f, 0x27, 0x13, 0xaf, 0xd9, 0x25, 0xa1, 0x63,
0x37, 0x44, 0xcf, 0x90, 0x6a, 0xe3, 0x75, 0x49, 0x68, 0x10, 0x2a, 0x90, 0x46, 0xd2, 0x8b, 0x6d,
0x38, 0x81, 0x9b, 0x5d, 0xb2, 0x27, 0x5a, 0xc5, 0x98, 0xa1, 0xdd, 0xeb, 0x66, 0x86, 0x76, 0x4a,
0x81, 0xef, 0xca, 0x22, 0x6b, 0x7e, 0x1b, 0xab, 0x17, 0x59, 0xb9, 0xcf, 0xf5, 0x7b, 0x5a, 0x51,
0x88, 0x50, 0xf6, 0x8e, 0xcf, 0xae, 0xf9, 0x34, 0x76, 0x18, 0xfd, 0x06, 0x3e, 0x64, 0xe4, 0x4b,
0xd9, 0x9d, 0x45, 0x4f, 0x0e, 0xe7, 0xa6, 0x91, 0xd0, 0xce, 0x4d, 0xd4, 0x4c, 0xe0, 0x72, 0x76,
0xde, 0x97, 0xa6, 0x35, 0xae, 0x33, 0x8a, 0x46, 0x73, 0xc1, 0xcb, 0x45, 0x47, 0x39, 0x56, 0x15,
0x8d, 0x55, 0x45, 0xca, 0x85, 0xa8, 0x31, 0x1b, 0x01, 0x79, 0x41, 0x32, 0x14, 0xe8, 0x80, 0x85,
0x41, 0x89, 0x06, 0x3a, 0x2b, 0x4c, 0x47, 0xba, 0x6c, 0xfc, 0xc0, 0x27, 0xbe, 0xd7, 0x36, 0x86,
0x55, 0x96, 0x24, 0xf3, 0x02, 0xf4, 0x7b, 0x97, 0xfe, 0x9d, 0xd4, 0xf7, 0x1a, 0xab, 0x51, 0x76,
0x4c, 0x1e, 0x16, 0x59, 0x06, 0xd3, 0xeb, 0x9a, 0x0d, 0xec, 0xe9, 0x32, 0xeb, 0x4c, 0x42, 0xda,
0x70, 0x7c, 0xca, 0xcf, 0xd5, 0x7a, 0x04, 0x97, 0x0e, 0xb6, 0xc9, 0x27, 0x00, 0xcb, 0xf7, 0xf5,
0xf1, 0x5f, 0x0c, 0x3c, 0xdd, 0x29, 0x78, 0xb2, 0x98, 0xa4, 0xdc, 0xaf, 0x8e, 0x9d, 0xf9, 0x39,
0x59, 0x06, 0xc3, 0xcd, 0xcc, 0x8c, 0xce, 0x14, 0x6e, 0x1c, 0x37, 0xa2, 0x73, 0xa1, 0x3c, 0x93,
0x8e, 0x29, 0x15, 0x5e, 0x8a, 0x72, 0xbb, 0xcb, 0xfe, 0xaf, 0x73, 0x2b, 0xbb, 0x77, 0x92, 0x52,
0x35, 0x39, 0x40, 0x47, 0x19, 0x06, 0x3d, 0xd1, 0x69, 0x4b, 0x83, 0x78, 0x04, 0x8b, 0xce, 0x2e,
0x25, 0x38, 0x23, 0x64, 0xc4, 0x14, 0xa6, 0xa3, 0x51, 0xe4, 0xbc, 0xa6, 0x13, 0x3e, 0xc3, 0x81,
0xfa, 0xfa, 0x71, 0x9a, 0x84, 0xc2, 0x72, 0x9a, 0x8c, 0x0c, 0x1f, 0x82, 0xd9, 0xe4, 0xfb, 0xa2,
0x1c, 0x76, 0x03, 0xa2, 0xde, 0x67, 0x77, 0xa1, 0xdc, 0x60, 0x92, 0xcf, 0x91, 0x26, 0xf5, 0xd3,
0x06, 0x23, 0xe3, 0xa1, 0x0d, 0x16, 0x1e, 0x77, 0x43, 0xe2, 0x95, 0xbc, 0xe6, 0x33, 0x1c, 0xb4,
0x4a, 0x87, 0x04, 0xc7, 0xea, 0x9b, 0x4c, 0x44, 0x9a, 0xdf, 0x3f, 0xa6, 0x10, 0x63, 0x9b, 0x63,
0x8c, 0x6d, 0x0a, 0xd2, 0x51, 0x9e, 0x48, 0x5b, 0x49, 0x3d, 0xc2, 0x4f, 0x42, 0x82, 0xd5, 0x87,
0xd9, 0xeb, 0xaa, 0x13, 0x61, 0xe3, 0x79, 0x48, 0xb3, 0x93, 0x60, 0xe4, 0x8c, 0x84, 0x51, 0xd4,
0xed, 0x10, 0x3e, 0x1d, 0x7f, 0x90, 0xdd, 0xc6, 0x83, 0x8c, 0x70, 0x54, 0x32, 0x21, 0x8f, 0x22,
0xdf, 0xfe, 0xcb, 0x84, 0xf4, 0x5f, 0x42, 0x38, 0x0f, 0xa6, 0xab, 0x35, 0xc7, 0x6d, 0x38, 0x26,
0x72, 0xac, 0xd5, 0xe2, 0x29, 0x78, 0x1e, 0xc0, 0x4a, 0xb5, 0xe2, 0x54, 0x4c, 0x9b, 0x1b, 0x5d,
0xcb, 0x29, 0xaf, 0x16, 0x01, 0x2c, 0x82, 0x19, 0x64, 0x49, 0x96, 0x69, 0x6a, 0x69, 0x54, 0x1e,
0x39, 0x16, 0xda, 0xe4, 0x96, 0x73, 0x70, 0x05, 0x5c, 0x69, 0x54, 0x1e, 0x3d, 0xde, 0xaa, 0x70,
0x8c, 0x6b, 0x56, 0x57, 0x5d, 0x64, 0x6d, 0xd6, 0x9e, 0x58, 0xee, 0xaa, 0xe9, 0x98, 0xc5, 0x25,
0x08, 0xc1, 0xdc, 0x9a, 0xe5, 0x94, 0xd7, 0xdd, 0x46, 0xd5, 0xac, 0x37, 0xd6, 0x6b, 0x4e, 0x71,
0x19, 0x5e, 0x03, 0x57, 0x73, 0x2c, 0x13, 0x95, 0xd7, 0x2b, 0x09, 0xed, 0x26, 0xbc, 0x0b, 0x5e,
0x3f, 0x4a, 0x98, 0x3d, 0x37, 0x9c, 0x5a, 0xdd, 0x35, 0x1f, 0x59, 0x55, 0xa7, 0x78, 0x0b, 0x5e,
0x05, 0x17, 0x4b, 0xb6, 0x59, 0xde, 0x58, 0xaf, 0xd9, 0x96, 0x5b, 0xb7, 0x2c, 0xe4, 0xd6, 0x6b,
0xc8, 0x71, 0x9d, 0x0f, 0x5d, 0xf4, 0x61, 0xb1, 0x05, 0x35, 0x70, 0x79, 0xab, 0x3a, 0x1e, 0x80,
0xe1, 0x25, 0xb0, 0xb4, 0x6a, 0xd9, 0xe6, 0x47, 0x39, 0xd7, 0x0b, 0x05, 0x5e, 0x01, 0x17, 0xb6,
0xaa, 0xa3, 0xbd, 0x9f, 0x2b, 0xb7, 0xff, 0x01, 0xc0, 0xb4, 0x34, 0x92, 0x43, 0x15, 0x9c, 0x4b,
0xb2, 0x54, 0xab, 0x5a, 0xee, 0x5a, 0xcd, 0xb6, 0x6b, 0x4f, 0x2d, 0x54, 0x3c, 0x25, 0x16, 0x95,
0xf3, 0xb8, 0x5b, 0x55, 0xa7, 0x62, 0xbb, 0x0e, 0xaa, 0x3c, 0x7a, 0x64, 0xa1, 0x61, 0xa2, 0x14,
0x9a, 0xbc, 0x84, 0x60, 0x5b, 0xe6, 0xaa, 0x85, 0x8a, 0x13, 0xf0, 0x16, 0xb8, 0x91, 0xb6, 0x8d,
0xa3, 0x17, 0x64, 0xfa, 0xe3, 0xad, 0x1a, 0xda, 0xda, 0x2c, 0x9e, 0xa6, 0xe5, 0x4f, 0x6c, 0xa6,
0x6d, 0x17, 0x27, 0xe1, 0x75, 0xa0, 0x25, 0x99, 0x96, 0x92, 0x9c, 0x8a, 0x1c, 0xc0, 0x07, 0xe0,
0xad, 0x63, 0x40, 0xe3, 0xa2, 0x98, 0xa6, 0x95, 0x19, 0xc1, 0x15, 0xeb, 0x99, 0x81, 0x6f, 0x82,
0x37, 0xc6, 0xba, 0xc7, 0x89, 0xce, 0xc2, 0x87, 0xe0, 0x9d, 0x11, 0x2c, 0xbe, 0x4a, 0x61, 0x69,
0x38, 0x35, 0x64, 0x0d, 0x38, 0xee, 0x1a, 0xaa, 0x6d, 0xba, 0x8d, 0x32, 0x32, 0x9d, 0xf2, 0x7a,
0x71, 0x0e, 0xde, 0x06, 0xaf, 0x8d, 0xdd, 0x0e, 0xe9, 0xd5, 0xb7, 0xa0, 0x09, 0xde, 0x3b, 0x19,
0x76, 0x5c, 0xbc, 0x18, 0xbe, 0x0a, 0x56, 0xc6, 0x4b, 0x88, 0x5c, 0xec, 0xc0, 0x77, 0xc0, 0xb7,
0x8f, 0x43, 0x8d, 0x7b, 0xc5, 0xee, 0xd1, 0xaf, 0x10, 0xf5, 0xdf, 0xa3, 0x67, 0x6f, 0x3c, 0x8a,
0xee, 0x08, 0x1f, 0x7e, 0x03, 0xe8, 0x23, 0x37, 0x7b, 0x3a, 0x2d, 0x2f, 0x14, 0x78, 0x07, 0xdc,
0x42, 0x66, 0x75, 0xb5, 0xb6, 0xe9, 0x9e, 0x00, 0xff, 0xb9, 0x02, 0xdf, 0x07, 0x6f, 0x1f, 0x0f,
0x1c, 0xb7, 0xc0, 0x2f, 0x14, 0x68, 0x81, 0x0f, 0x4e, 0xfc, 0xbe, 0x71, 0x32, 0xbf, 0x56, 0xe0,
0x35, 0x70, 0x65, 0x34, 0x5f, 0xd4, 0xe1, 0x37, 0x0a, 0xbc, 0x09, 0xae, 0x1f, 0xf9, 0x26, 0x81,
0xfc, 0xad, 0x02, 0xbf, 0x03, 0xee, 0x1f, 0x05, 0x19, 0x17, 0xc6, 0xef, 0x14, 0xf8, 0x10, 0x3c,
0x38, 0xc1, 0x3b, 0xc6, 0x09, 0xfc, 0xfe, 0x88, 0x75, 0x88, 0x62, 0x7f, 0x79, 0xfc, 0x3a, 0x04,
0xf2, 0x0f, 0x0a, 0x5c, 0x06, 0x17, 0x47, 0x43, 0xe8, 0x9e, 0xf8, 0xa3, 0x02, 0x6f, 0x80, 0x95,
0x23, 0x95, 0x28, 0xec, 0x4f, 0x0a, 0x54, 0xc1, 0x62, 0xb5, 0xe6, 0xae, 0x99, 0x15, 0xdb, 0x7d,
0x5a, 0x71, 0xd6, 0xdd, 0x86, 0x83, 0xac, 0x46, 0xa3, 0xf8, 0xcb, 0x09, 0x1a, 0x4a, 0xca, 0x53,
0xad, 0x09, 0xa7, 0xbb, 0x56, 0x43, 0xae, 0x5d, 0x79, 0x62, 0x55, 0x29, 0xf2, 0xb3, 0x09, 0x38,
0x0f, 0x00, 0x85, 0xd5, 0x6b, 0x95, 0xaa, 0xd3, 0x28, 0xfe, 0xb0, 0x00, 0x67, 0xc1, 0x2b, 0xd6,
0x87, 0x8e, 0x85, 0xaa, 0xa6, 0x5d, 0xfc, 0x67, 0xe1, 0x76, 0x08, 0xc0, 0xf0, 0x4b, 0x1f, 0x9e,
0x01, 0x13, 0x1b, 0x4f, 0x8a, 0xa7, 0xe0, 0x14, 0x98, 0xb4, 0x2d, 0xb3, 0x61, 0x15, 0x15, 0xb8,
0x08, 0xe6, 0x2d, 0xdb, 0x2a, 0x3b, 0x95, 0x5a, 0xd5, 0x45, 0x5b, 0xd5, 0x2a, 0xbb, 0x37, 0x8b,
0x60, 0xe6, 0x29, 0x3d, 0xfb, 0x89, 0xa5, 0x00, 0x97, 0xc0, 0x82, 0x5d, 0x2b, 0x6f, 0xb8, 0xc8,
0x2c, 0x5b, 0x28, 0x31, 0x9f, 0xa6, 0x40, 0x26, 0x94, 0x58, 0x26, 0xef, 0x3d, 0x04, 0x53, 0x4e,
0xe4, 0x05, 0x71, 0x27, 0x8c, 0x08, 0xbc, 0x27, 0x3f, 0xcc, 0x89, 0xdf, 0x1d, 0xc4, 0xef, 0x71,
0x97, 0xe6, 0x07, 0xcf, 0xfc, 0x67, 0x31, 0xfd, 0xd4, 0x4d, 0xe5, 0x0d, 0xa5, 0x74, 0xee, 0xc5,
0xdf, 0x97, 0x4f, 0xbd, 0x78, 0xb9, 0xac, 0x7c, 0xf9, 0x72, 0x59, 0xf9, 0xdb, 0xcb, 0x65, 0xe5,
0x17, 0x5f, 0x2d, 0x9f, 0xda, 0x3e, 0xc3, 0x7e, 0xcf, 0xbb, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff,
0xff, 0x59, 0x00, 0xd4, 0x87, 0x18, 0x1c, 0x00, 0x00,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x59, 0x5b, 0x77, 0xdb, 0xc6,
0x11, 0x36, 0x44, 0xcb, 0x8e, 0x56, 0x37, 0x6a, 0x65, 0xd9, 0xf0, 0x4d, 0x90, 0xe1, 0x38, 0xb5,
0x9d, 0xc2, 0x4e, 0xed, 0x9c, 0xb4, 0x71, 0x2e, 0x0e, 0x48, 0x41, 0x16, 0x2b, 0x88, 0xa4, 0x97,
0x90, 0x9d, 0x3c, 0xa1, 0x10, 0xb9, 0x92, 0x50, 0x53, 0x00, 0x03, 0x2c, 0x1d, 0x29, 0x7f, 0xa0,
0xaf, 0xbd, 0x9f, 0xfe, 0x88, 0xa6, 0xbf, 0xc3, 0x49, 0x6f, 0x69, 0xfb, 0xd4, 0x73, 0x5a, 0x9e,
0xd6, 0xf9, 0x07, 0x3c, 0x4d, 0xdb, 0xf4, 0xa9, 0x67, 0x2f, 0x20, 0x17, 0x00, 0x29, 0xe9, 0x4d,
0x98, 0xf9, 0xbe, 0x0f, 0xb3, 0x33, 0xbb, 0x3b, 0x03, 0x11, 0xcc, 0x47, 0x9d, 0x66, 0x67, 0xfb,
0x6e, 0xd4, 0x69, 0xde, 0xe9, 0x44, 0x21, 0x09, 0xe1, 0x24, 0x33, 0x5c, 0x32, 0x76, 0x7d, 0xb2,
0xd7, 0xdd, 0xbe, 0xd3, 0x0c, 0xf7, 0xef, 0xee, 0x86, 0xbb, 0xe1, 0x5d, 0xe6, 0xdd, 0xee, 0xee,
0xb0, 0x27, 0xf6, 0xc0, 0xfe, 0xe2, 0x2c, 0xfd, 0x47, 0x0a, 0x38, 0x8b, 0xf0, 0xc7, 0x5d, 0x1c,
0x13, 0x78, 0x07, 0x4c, 0xd5, 0x3a, 0x38, 0xf2, 0x88, 0x1f, 0x06, 0xaa, 0xb2, 0xa2, 0xdc, 0x9c,
0xbb, 0x57, 0xbc, 0xc3, 0x54, 0xef, 0x0c, 0xec, 0x68, 0x08, 0x81, 0x37, 0xc0, 0x99, 0x4d, 0xbc,
0xbf, 0x8d, 0x23, 0x75, 0x62, 0x45, 0xb9, 0x39, 0x7d, 0x6f, 0x56, 0x80, 0xb9, 0x11, 0x09, 0x27,
0x85, 0x39, 0x38, 0x26, 0x38, 0x52, 0x0b, 0x29, 0x18, 0x37, 0x22, 0xe1, 0xd4, 0x9b, 0xe0, 0x15,
0x84, 0xe3, 0x4e, 0x18, 0xc4, 0x18, 0xaa, 0xe0, 0x6c, 0xa3, 0xdb, 0x6c, 0xe2, 0x38, 0x66, 0x71,
0xbc, 0x82, 0x92, 0x47, 0x78, 0x1e, 0x9c, 0x69, 0x10, 0x8f, 0x74, 0x63, 0xf6, 0xce, 0x29, 0x24,
0x9e, 0xa4, 0x58, 0x0a, 0x47, 0xc4, 0xa2, 0xff, 0x7d, 0x3a, 0xc1, 0xc1, 0xf7, 0xc0, 0x8c, 0x45,
0x9a, 0x2d, 0xeb, 0x00, 0x37, 0xeb, 0x1e, 0xd9, 0x63, 0x2f, 0x9a, 0x2a, 0x5d, 0xec, 0xf7, 0xb4,
0xa5, 0x43, 0x6f, 0xbf, 0xfd, 0x40, 0xc7, 0xa4, 0xd9, 0x32, 0xf0, 0x01, 0x6e, 0x1a, 0x1d, 0x8f,
0xec, 0xe9, 0x28, 0x05, 0x87, 0xf7, 0xc1, 0x94, 0xb9, 0x8b, 0x03, 0x62, 0xb6, 0x5a, 0x91, 0x3a,
0xcd, 0xb8, 0x4b, 0xfd, 0x9e, 0xb6, 0xc0, 0xb9, 0x1e, 0x75, 0x19, 0x5e, 0xab, 0x15, 0xe9, 0x68,
0x88, 0x83, 0x36, 0x58, 0x58, 0xf3, 0xfc, 0x76, 0x27, 0xf4, 0x03, 0xb2, 0xee, 0x38, 0x75, 0x46,
0x9e, 0x61, 0xe4, 0xe5, 0x7e, 0x4f, 0xbb, 0xc4, 0xc9, 0x3b, 0x09, 0xc4, 0xd8, 0x23, 0xa4, 0x23,
0x54, 0xf2, 0x44, 0x68, 0x80, 0xb3, 0x25, 0x2f, 0xc6, 0xab, 0x7e, 0xa4, 0x62, 0xa6, 0xb1, 0xd8,
0xef, 0x69, 0xf3, 0x5c, 0x63, 0xdb, 0x8b, 0xb1, 0xd1, 0xf2, 0x23, 0x1d, 0x25, 0x18, 0xf8, 0x00,
0x4c, 0xd3, 0x15, 0xd8, 0xe1, 0x2e, 0x5b, 0xef, 0x0e, 0xa3, 0xa8, 0xfd, 0x9e, 0x76, 0x4e, 0x5a,
0x6f, 0x3b, 0xdc, 0x15, 0xcb, 0x95, 0xc1, 0xf0, 0x11, 0x98, 0xa7, 0x8f, 0xe5, 0xb6, 0x8f, 0x03,
0x52, 0x8f, 0xc2, 0x83, 0x43, 0xf5, 0x73, 0x56, 0x99, 0xd2, 0x95, 0x7e, 0x4f, 0x53, 0x25, 0x81,
0x26, 0x83, 0x18, 0x1d, 0x8a, 0xd1, 0x51, 0x96, 0x05, 0x4d, 0x30, 0x4b, 0x4d, 0x75, 0x8c, 0x23,
0x2e, 0xf3, 0x05, 0x97, 0xb9, 0xd4, 0xef, 0x69, 0xe7, 0x25, 0x99, 0x0e, 0xc6, 0x51, 0x22, 0x92,
0x66, 0xc0, 0x3a, 0x80, 0x43, 0x55, 0x2b, 0x68, 0xb1, 0xa4, 0xa8, 0x9f, 0xb1, 0xfd, 0x50, 0xd2,
0xfa, 0x3d, 0xed, 0x72, 0x3e, 0x1c, 0x2c, 0x60, 0x3a, 0x1a, 0xc1, 0x85, 0xdf, 0x01, 0xa7, 0xa9,
0x55, 0xfd, 0x0d, 0xdf, 0xc7, 0xd3, 0x62, 0xef, 0x50, 0x5b, 0x69, 0xbe, 0xdf, 0xd3, 0xa6, 0x87,
0x82, 0x3a, 0x62, 0x50, 0xb8, 0x0a, 0xe6, 0xb8, 0x48, 0x19, 0x47, 0x64, 0xd5, 0x23, 0x9e, 0xfa,
0x93, 0x02, 0x0b, 0xe0, 0x72, 0xbf, 0xa7, 0x5d, 0xe0, 0x78, 0xf1, 0xee, 0x26, 0x8e, 0x88, 0xd1,
0xf2, 0x88, 0xa7, 0xa3, 0x0c, 0x27, 0xad, 0xc2, 0xaa, 0xf2, 0xd3, 0x23, 0x55, 0x78, 0x65, 0x32,
0x1c, 0x9a, 0x53, 0x6e, 0xd9, 0xc0, 0x87, 0x2c, 0x94, 0x9f, 0x71, 0x11, 0x29, 0xa7, 0x42, 0xe4,
0x19, 0x3e, 0x14, 0x91, 0xa4, 0x19, 0x29, 0x09, 0x16, 0xc7, 0xcf, 0x8f, 0x92, 0xe0, 0x61, 0xa4,
0x19, 0xd0, 0x01, 0x8b, 0xdc, 0xe0, 0x44, 0xdd, 0x98, 0xe0, 0x56, 0xd9, 0x64, 0xb1, 0xfc, 0x82,
0x0b, 0x5d, 0xeb, 0xf7, 0xb4, 0xab, 0x29, 0x21, 0xc2, 0x61, 0x46, 0xd3, 0x13, 0x21, 0x8d, 0xa2,
0x8f, 0x50, 0x65, 0xe1, 0xfd, 0xf2, 0x04, 0xaa, 0x3c, 0xca, 0x51, 0x74, 0xf8, 0x3e, 0x98, 0xa1,
0xfb, 0x69, 0x50, 0xbb, 0xaf, 0x0b, 0xd9, 0xc3, 0xcf, 0xf6, 0x9f, 0x54, 0xb9, 0x14, 0x5e, 0xe6,
0xb3, 0x70, 0xfe, 0x7d, 0x04, 0x5f, 0x5c, 0x1e, 0x32, 0x1e, 0xbe, 0x03, 0xa6, 0xe9, 0x73, 0x52,
0xaf, 0xff, 0x14, 0xb2, 0x67, 0x91, 0xd1, 0x87, 0xd5, 0x92, 0xd1, 0x12, 0x99, 0xbd, 0xfb, 0xbf,
0xe3, 0xc9, 0xe2, 0x20, 0x4b, 0x68, 0x58, 0x05, 0x0b, 0xf4, 0x31, 0x5d, 0xa3, 0x6f, 0x0a, 0xd9,
0xb3, 0xc3, 0x24, 0x72, 0x15, 0xca, 0x53, 0x73, 0x7a, 0x2c, 0xa4, 0xff, 0x1d, 0xab, 0xc7, 0x23,
0xcb, 0x53, 0xe9, 0xad, 0xdc, 0x08, 0xbc, 0x4e, 0xbc, 0x17, 0xf2, 0xcc, 0xfe, 0xf5, 0x74, 0x76,
0x75, 0xb1, 0x70, 0x27, 0x89, 0x95, 0xe1, 0xfa, 0x57, 0x33, 0x49, 0xb3, 0xa1, 0xb7, 0x23, 0x8d,
0x90, 0xde, 0x8e, 0x4a, 0xf6, 0x76, 0xa4, 0xcb, 0x11, 0xb7, 0xa3, 0xc0, 0xc0, 0x6f, 0x83, 0xb3,
0x55, 0x4c, 0x3e, 0x09, 0xa3, 0x67, 0xbc, 0xb3, 0x94, 0x60, 0xbf, 0xa7, 0xcd, 0x71, 0x78, 0xc0,
0x1d, 0x3a, 0x4a, 0x20, 0xf0, 0x3a, 0x38, 0xcd, 0xee, 0x6e, 0xbe, 0x50, 0xe9, 0x8e, 0xe0, 0x97,
0x35, 0x73, 0xc2, 0x32, 0x98, 0x5b, 0xc5, 0x6d, 0xef, 0xd0, 0xf6, 0x08, 0x0e, 0x9a, 0x87, 0x9b,
0x31, 0xeb, 0x13, 0xb3, 0xf2, 0xe1, 0x6e, 0x51, 0xbf, 0xd1, 0xe6, 0x00, 0x63, 0x3f, 0xd6, 0x51,
0x86, 0x02, 0xbf, 0x0f, 0x8a, 0x69, 0x0b, 0x7a, 0xce, 0x3a, 0xc6, 0xac, 0xdc, 0x31, 0xb2, 0x32,
0x46, 0xf4, 0x5c, 0x47, 0x39, 0x1e, 0xfc, 0x08, 0x2c, 0x6d, 0x75, 0x5a, 0x1e, 0xc1, 0xad, 0x4c,
0x5c, 0xb3, 0x4c, 0xf0, 0x7a, 0xbf, 0xa7, 0x69, 0x5c, 0xb0, 0xcb, 0x61, 0x46, 0x3e, 0xbe, 0xd1,
0x0a, 0xf0, 0x2d, 0x00, 0x50, 0xd8, 0x0d, 0x5a, 0xb6, 0xbf, 0xef, 0x13, 0x75, 0x69, 0x45, 0xb9,
0x39, 0x59, 0x3a, 0xdf, 0xef, 0x69, 0x90, 0xeb, 0x45, 0xd4, 0x67, 0xb4, 0xa9, 0x53, 0x47, 0x12,
0x12, 0x7e, 0x00, 0x66, 0xad, 0x03, 0x9f, 0xd4, 0x02, 0xda, 0xde, 0xba, 0x11, 0x56, 0xcf, 0xe7,
0xda, 0xc1, 0x81, 0x4f, 0x8c, 0x30, 0x30, 0x76, 0x38, 0x80, 0xb6, 0x03, 0x99, 0x00, 0xd7, 0x41,
0xb1, 0x1c, 0x06, 0xb1, 0x1f, 0xb3, 0x50, 0xca, 0x7b, 0xb8, 0xf9, 0x4c, 0xbd, 0x90, 0x6d, 0x4d,
0xcd, 0x21, 0xc2, 0x68, 0x52, 0x88, 0x8e, 0x72, 0x2c, 0xf8, 0x36, 0x98, 0xb6, 0x02, 0x6f, 0xbb,
0x8d, 0xeb, 0x9d, 0x28, 0xdc, 0x51, 0x55, 0x26, 0x72, 0xa1, 0xdf, 0xd3, 0x16, 0x45, 0x24, 0xcc,
0x69, 0x74, 0xa8, 0x97, 0xf6, 0xc7, 0x21, 0x96, 0x96, 0x5a, 0xc4, 0xc3, 0xf2, 0xb2, 0x19, 0xab,
0x5a, 0xb6, 0xd4, 0x22, 0x7e, 0x91, 0x52, 0x56, 0xea, 0x34, 0x05, 0x96, 0x06, 0x22, 0x8d, 0xbd,
0xee, 0xce, 0x4e, 0x1b, 0xab, 0x2b, 0xd9, 0x64, 0x24, 0x22, 0x31, 0x07, 0x0c, 0x35, 0x04, 0x03,
0xbe, 0x0b, 0x66, 0x84, 0xa5, 0xec, 0xc5, 0x38, 0x56, 0xaf, 0xad, 0x14, 0xd2, 0xc7, 0x27, 0x51,
0x68, 0x52, 0xb7, 0x8e, 0x52, 0x68, 0xb8, 0x21, 0xcd, 0x27, 0xe5, 0x70, 0x7f, 0xdf, 0x0b, 0x5a,
0xb1, 0xaa, 0x33, 0x89, 0xab, 0xfd, 0x9e, 0x76, 0x31, 0x3b, 0x9f, 0x34, 0x05, 0x46, 0x1e, 0x4f,
0x12, 0x1e, 0xcd, 0x09, 0xea, 0x06, 0x01, 0x8e, 0x06, 0x23, 0xd6, 0xad, 0x6c, 0x6f, 0x8b, 0x98,
0x5f, 0x1e, 0xb2, 0x32, 0x14, 0x58, 0x01, 0x45, 0xeb, 0x80, 0xe0, 0x28, 0xf0, 0xda, 0x03, 0x99,
0xdb, 0x4c, 0x46, 0x0a, 0x08, 0x0b, 0x84, 0x2c, 0x94, 0xa3, 0xd1, 0xf2, 0x36, 0x48, 0x84, 0xe3,
0xd8, 0x39, 0xec, 0xe0, 0x58, 0xc5, 0x6c, 0x59, 0x52, 0x79, 0x63, 0xe6, 0x34, 0x08, 0xf5, 0xea,
0x48, 0xc6, 0xd2, 0x5d, 0xca, 0x1f, 0x37, 0xf0, 0x61, 0xc3, 0xff, 0x14, 0xb3, 0xe1, 0x69, 0x52,
0x2e, 0x8c, 0x20, 0xd3, 0x5b, 0x37, 0xf6, 0x3f, 0xa5, 0xbb, 0x34, 0x45, 0xa0, 0x43, 0x4b, 0xca,
0x60, 0x7b, 0xd1, 0x2e, 0x56, 0x77, 0x99, 0xcc, 0x4a, 0xbf, 0xa7, 0x5d, 0x19, 0x29, 0x63, 0xb4,
0x29, 0x4c, 0x47, 0x23, 0xb8, 0xf0, 0x09, 0x38, 0x37, 0xb4, 0x76, 0x77, 0x76, 0xfc, 0x03, 0xe4,
0x05, 0xbb, 0x58, 0xdd, 0x63, 0x9a, 0x7a, 0xbf, 0xa7, 0x2d, 0xe7, 0x35, 0x19, 0xce, 0x88, 0x28,
0x50, 0x47, 0x23, 0xf9, 0xf0, 0x07, 0xe0, 0xc2, 0x28, 0xbb, 0x73, 0x10, 0xa8, 0x3e, 0x93, 0x7e,
0xad, 0xdf, 0xd3, 0xf4, 0x23, 0xa5, 0x0d, 0x72, 0x10, 0xe8, 0x68, 0x9c, 0x0c, 0x1d, 0x26, 0x07,
0x2e, 0xe7, 0x20, 0xa8, 0x75, 0x62, 0xf5, 0x87, 0x4c, 0x59, 0x2a, 0xa9, 0xa4, 0x4c, 0x0e, 0x02,
0x23, 0xec, 0xc4, 0x3a, 0xca, 0xb2, 0x86, 0x65, 0xe1, 0x3d, 0x3e, 0xe6, 0x33, 0xe9, 0xa4, 0xdc,
0x87, 0x85, 0x0e, 0x9f, 0x0e, 0xe2, 0x41, 0x59, 0x04, 0x01, 0xbe, 0x09, 0xa6, 0xb8, 0xe1, 0x71,
0xbd, 0xc1, 0x47, 0xd1, 0x49, 0x79, 0x8c, 0x17, 0xec, 0x8f, 0xe9, 0xdb, 0x87, 0x40, 0xfd, 0x9b,
0x59, 0x3e, 0x30, 0xd2, 0x36, 0x50, 0xf5, 0xf6, 0xb1, 0x68, 0x30, 0x52, 0x1b, 0x08, 0xbc, 0x7d,
0xac, 0x23, 0xe6, 0x94, 0x1b, 0xd1, 0xc4, 0x09, 0x1a, 0xd1, 0x6d, 0x70, 0xe6, 0xa9, 0x69, 0x53,
0x74, 0x21, 0xdb, 0x87, 0x3e, 0xf1, 0xda, 0x1c, 0x2c, 0x10, 0xb0, 0x06, 0x16, 0xd7, 0xb1, 0x17,
0x91, 0x6d, 0xec, 0x91, 0x4a, 0x40, 0x70, 0xf4, 0xdc, 0x6b, 0x8b, 0x36, 0x53, 0x90, 0xb3, 0xb9,
0x97, 0x80, 0x0c, 0x5f, 0xa0, 0x74, 0x34, 0x8a, 0x09, 0x2b, 0x60, 0xc1, 0x6a, 0xe3, 0x26, 0xfd,
0xbc, 0x73, 0xfc, 0x7d, 0x1c, 0x76, 0xc9, 0x66, 0xcc, 0xda, 0x4d, 0x41, 0x3e, 0xb6, 0x58, 0x40,
0x0c, 0xc2, 0x31, 0x3a, 0xca, 0xb3, 0xe8, 0xc9, 0xb5, 0xd9, 0xf5, 0xca, 0x73, 0xbd, 0x85, 0xec,
0x58, 0x5d, 0xca, 0x5e, 0x25, 0x6d, 0x86, 0x48, 0xa6, 0xf4, 0x6e, 0xd4, 0x8e, 0x75, 0x94, 0xa3,
0x41, 0x04, 0x16, 0xcd, 0xd6, 0x73, 0x1c, 0x11, 0x3f, 0xc6, 0x92, 0xda, 0x79, 0xa6, 0x26, 0x9d,
0x1e, 0x2f, 0x01, 0xa5, 0x05, 0x47, 0x91, 0xe1, 0xdb, 0xc9, 0xc4, 0x6b, 0x76, 0x49, 0xe8, 0xd8,
0x0d, 0xd1, 0x33, 0xa4, 0xda, 0x78, 0x5d, 0x12, 0x1a, 0x84, 0x0a, 0xa4, 0x91, 0xf4, 0x62, 0x1b,
0x4e, 0xe0, 0x66, 0x97, 0xec, 0x89, 0x56, 0x31, 0x66, 0x68, 0xf7, 0xba, 0x99, 0xa1, 0x9d, 0x52,
0xe0, 0xbb, 0xb2, 0xc8, 0x9a, 0xdf, 0xc6, 0xea, 0x45, 0x56, 0xee, 0x73, 0xfd, 0x9e, 0x56, 0x14,
0x22, 0x94, 0xbd, 0xe3, 0xb3, 0x6b, 0x3e, 0x8d, 0x1d, 0x46, 0xbf, 0x81, 0x0f, 0x19, 0xf9, 0x52,
0x76, 0x67, 0xd1, 0x93, 0xc3, 0xb9, 0x69, 0x24, 0xb4, 0x73, 0x13, 0x35, 0x13, 0xb8, 0x9c, 0x9d,
0xf7, 0xa5, 0x69, 0x8d, 0xeb, 0x8c, 0xa2, 0xd1, 0x5c, 0xf0, 0x72, 0xd1, 0x51, 0x8e, 0x55, 0x45,
0x63, 0x55, 0x91, 0x72, 0x21, 0x6a, 0xcc, 0x46, 0x40, 0x5e, 0x90, 0x0c, 0x05, 0x3a, 0x60, 0x61,
0x50, 0xa2, 0x81, 0xce, 0x0a, 0xd3, 0x91, 0x2e, 0x1b, 0x3f, 0xf0, 0x89, 0xef, 0xb5, 0x8d, 0x61,
0x95, 0x25, 0xc9, 0xbc, 0x00, 0xfd, 0xde, 0xa5, 0x7f, 0x27, 0xf5, 0xbd, 0xc6, 0x6a, 0x94, 0x1d,
0x93, 0x87, 0x45, 0x96, 0xc1, 0xf4, 0xba, 0x66, 0x03, 0x7b, 0xba, 0xcc, 0x3a, 0x93, 0x90, 0x36,
0x1c, 0x9f, 0xf2, 0x73, 0xb5, 0x1e, 0xc1, 0xa5, 0x83, 0x6d, 0xf2, 0x09, 0xc0, 0xf2, 0x7d, 0x7d,
0xfc, 0x17, 0x03, 0x4f, 0x77, 0x0a, 0x9e, 0x2c, 0x26, 0x29, 0xf7, 0xab, 0x63, 0x67, 0x7e, 0x4e,
0x96, 0xc1, 0x70, 0x33, 0x33, 0xa3, 0x33, 0x85, 0x1b, 0xc7, 0x8d, 0xe8, 0x5c, 0x28, 0xcf, 0xa4,
0x63, 0x4a, 0x85, 0x97, 0xa2, 0xdc, 0xee, 0xb2, 0xff, 0xeb, 0xdc, 0xca, 0xee, 0x9d, 0xa4, 0x54,
0x4d, 0x0e, 0xd0, 0x51, 0x86, 0x41, 0x4f, 0x74, 0xda, 0xd2, 0x20, 0x1e, 0xc1, 0xa2, 0xb3, 0x4b,
0x09, 0xce, 0x08, 0x19, 0x31, 0x85, 0xe9, 0x68, 0x14, 0x39, 0xaf, 0xe9, 0x84, 0xcf, 0x70, 0xa0,
0xbe, 0x7e, 0x9c, 0x26, 0xa1, 0xb0, 0x9c, 0x26, 0x23, 0xc3, 0x87, 0x60, 0x36, 0xf9, 0xbe, 0x28,
0x87, 0xdd, 0x80, 0xa8, 0xf7, 0xd9, 0x5d, 0x28, 0x37, 0x98, 0xe4, 0x73, 0xa4, 0x49, 0xfd, 0xb4,
0xc1, 0xc8, 0x78, 0x68, 0x83, 0x85, 0xc7, 0xdd, 0x90, 0x78, 0x25, 0xaf, 0xf9, 0x0c, 0x07, 0xad,
0xd2, 0x21, 0xc1, 0xb1, 0xfa, 0x26, 0x13, 0x91, 0xe6, 0xf7, 0x8f, 0x29, 0xc4, 0xd8, 0xe6, 0x18,
0x63, 0x9b, 0x82, 0x74, 0x94, 0x27, 0xd2, 0x56, 0x52, 0x8f, 0xf0, 0x93, 0x90, 0x60, 0xf5, 0x61,
0xf6, 0xba, 0xea, 0x44, 0xd8, 0x78, 0x1e, 0xd2, 0xec, 0x24, 0x18, 0x39, 0x23, 0x61, 0x14, 0x75,
0x3b, 0x84, 0x4f, 0xc7, 0x1f, 0x64, 0xb7, 0xf1, 0x20, 0x23, 0x1c, 0x95, 0x4c, 0xc8, 0xa3, 0xc8,
0xb7, 0xff, 0x36, 0x21, 0xfd, 0x97, 0x10, 0xce, 0x83, 0xe9, 0x6a, 0xcd, 0x71, 0x1b, 0x8e, 0x89,
0x1c, 0x6b, 0xb5, 0x78, 0x0a, 0x9e, 0x07, 0xb0, 0x52, 0xad, 0x38, 0x15, 0xd3, 0xe6, 0x46, 0xd7,
0x72, 0xca, 0xab, 0x45, 0x00, 0x8b, 0x60, 0x06, 0x59, 0x92, 0x65, 0x9a, 0x5a, 0x1a, 0x95, 0x47,
0x8e, 0x85, 0x36, 0xb9, 0xe5, 0x1c, 0x5c, 0x01, 0x57, 0x1a, 0x95, 0x47, 0x8f, 0xb7, 0x2a, 0x1c,
0xe3, 0x9a, 0xd5, 0x55, 0x17, 0x59, 0x9b, 0xb5, 0x27, 0x96, 0xbb, 0x6a, 0x3a, 0x66, 0x71, 0x09,
0x42, 0x30, 0xb7, 0x66, 0x39, 0xe5, 0x75, 0xb7, 0x51, 0x35, 0xeb, 0x8d, 0xf5, 0x9a, 0x53, 0x5c,
0x86, 0xd7, 0xc0, 0xd5, 0x1c, 0xcb, 0x44, 0xe5, 0xf5, 0x4a, 0x42, 0xbb, 0x09, 0xef, 0x82, 0xd7,
0x8f, 0x12, 0x66, 0xcf, 0x0d, 0xa7, 0x56, 0x77, 0xcd, 0x47, 0x56, 0xd5, 0x29, 0xde, 0x82, 0x57,
0xc1, 0xc5, 0x92, 0x6d, 0x96, 0x37, 0xd6, 0x6b, 0xb6, 0xe5, 0xd6, 0x2d, 0x0b, 0xb9, 0xf5, 0x1a,
0x72, 0x5c, 0xe7, 0x43, 0x17, 0x7d, 0x58, 0x6c, 0x41, 0x0d, 0x5c, 0xde, 0xaa, 0x8e, 0x07, 0x60,
0x78, 0x09, 0x2c, 0xad, 0x5a, 0xb6, 0xf9, 0x51, 0xce, 0xf5, 0x42, 0x81, 0x57, 0xc0, 0x85, 0xad,
0xea, 0x68, 0xef, 0xe7, 0xca, 0xed, 0xaf, 0x01, 0x98, 0x96, 0x46, 0x72, 0xa8, 0x82, 0x73, 0x49,
0x96, 0x6a, 0x55, 0xcb, 0x5d, 0xab, 0xd9, 0x76, 0xed, 0xa9, 0x85, 0x8a, 0xa7, 0xc4, 0xa2, 0x72,
0x1e, 0x77, 0xab, 0xea, 0x54, 0x6c, 0xd7, 0x41, 0x95, 0x47, 0x8f, 0x2c, 0x34, 0x4c, 0x94, 0x42,
0x93, 0x97, 0x10, 0x6c, 0xcb, 0x5c, 0xb5, 0x50, 0x71, 0x02, 0xde, 0x02, 0x37, 0xd2, 0xb6, 0x71,
0xf4, 0x82, 0x4c, 0x7f, 0xbc, 0x55, 0x43, 0x5b, 0x9b, 0xc5, 0xd3, 0xb4, 0xfc, 0x89, 0xcd, 0xb4,
0xed, 0xe2, 0x24, 0xbc, 0x0e, 0xb4, 0x24, 0xd3, 0x52, 0x92, 0x53, 0x91, 0x03, 0xf8, 0x00, 0xbc,
0x75, 0x0c, 0x68, 0x5c, 0x14, 0xd3, 0xb4, 0x32, 0x23, 0xb8, 0x62, 0x3d, 0x33, 0xf0, 0x4d, 0xf0,
0xc6, 0x58, 0xf7, 0x38, 0xd1, 0x59, 0xb8, 0x06, 0x4a, 0x23, 0x58, 0x7c, 0x95, 0xc2, 0xd2, 0x70,
0x6a, 0x68, 0x20, 0x94, 0x50, 0xdd, 0x35, 0x54, 0xdb, 0x74, 0x1b, 0x65, 0x64, 0x3a, 0xe5, 0xf5,
0xe2, 0x1c, 0xbc, 0x0d, 0x5e, 0x1b, 0xbb, 0x2b, 0xd2, 0x49, 0x68, 0x41, 0x13, 0xbc, 0x77, 0x32,
0xec, 0xb8, 0xb0, 0x31, 0x7c, 0x15, 0xac, 0x8c, 0x97, 0x10, 0x29, 0xd9, 0x81, 0xef, 0x80, 0xef,
0x1e, 0x87, 0x1a, 0xf7, 0x8a, 0xdd, 0xa3, 0x5f, 0x21, 0xb6, 0xc1, 0x1e, 0x3d, 0x82, 0xe3, 0x51,
0x74, 0x63, 0xf8, 0xf0, 0x5b, 0x40, 0x1f, 0xb9, 0xe7, 0xd3, 0x69, 0x79, 0xa1, 0xc0, 0x3b, 0xe0,
0x16, 0x32, 0xab, 0xab, 0xb5, 0x4d, 0xf7, 0x04, 0xf8, 0xcf, 0x15, 0xf8, 0x3e, 0x78, 0xfb, 0x78,
0xe0, 0xb8, 0x05, 0x7e, 0xa1, 0x40, 0x0b, 0x7c, 0x70, 0xe2, 0xf7, 0x8d, 0x93, 0xf9, 0xad, 0x02,
0xaf, 0x81, 0x2b, 0xa3, 0xf9, 0xa2, 0x0e, 0xbf, 0x53, 0xe0, 0x4d, 0x70, 0xfd, 0xc8, 0x37, 0x09,
0xe4, 0xef, 0x15, 0xf8, 0x3d, 0x70, 0xff, 0x28, 0xc8, 0xb8, 0x30, 0xfe, 0xa0, 0xc0, 0x87, 0xe0,
0xc1, 0x09, 0xde, 0x31, 0x4e, 0xe0, 0x8f, 0x47, 0xac, 0x43, 0x14, 0xfb, 0xcb, 0xe3, 0xd7, 0x21,
0x90, 0x7f, 0x52, 0xe0, 0x32, 0xb8, 0x38, 0x1a, 0x42, 0xf7, 0xc4, 0x9f, 0x15, 0x78, 0x03, 0xac,
0x1c, 0xa9, 0x44, 0x61, 0x7f, 0x51, 0xa0, 0x0a, 0x16, 0xab, 0x35, 0x77, 0xcd, 0xac, 0xd8, 0xee,
0xd3, 0x8a, 0xb3, 0xee, 0x36, 0x1c, 0x64, 0x35, 0x1a, 0xc5, 0x5f, 0x4f, 0xd0, 0x50, 0x52, 0x9e,
0x6a, 0x4d, 0x38, 0xdd, 0xb5, 0x1a, 0x72, 0xed, 0xca, 0x13, 0xab, 0x4a, 0x91, 0x9f, 0x4d, 0xc0,
0x79, 0x00, 0x28, 0xac, 0x5e, 0xab, 0x54, 0x9d, 0x46, 0xf1, 0xc7, 0x05, 0x38, 0x0b, 0x5e, 0xb1,
0x3e, 0x74, 0x2c, 0x54, 0x35, 0xed, 0xe2, 0xbf, 0x0a, 0xb7, 0x43, 0x00, 0x86, 0x1f, 0xfc, 0xf0,
0x0c, 0x98, 0xd8, 0x78, 0x52, 0x3c, 0x05, 0xa7, 0xc0, 0xa4, 0x6d, 0x99, 0x0d, 0xab, 0xa8, 0xc0,
0x45, 0x30, 0x6f, 0xd9, 0x56, 0xd9, 0xa9, 0xd4, 0xaa, 0x2e, 0xda, 0xaa, 0x56, 0xd9, 0xf5, 0x59,
0x04, 0x33, 0x4f, 0xe9, 0xd9, 0x4f, 0x2c, 0x05, 0xb8, 0x04, 0x16, 0xec, 0x5a, 0x79, 0xc3, 0x45,
0x66, 0xd9, 0x42, 0x89, 0xf9, 0x34, 0x05, 0x32, 0xa1, 0xc4, 0x32, 0x79, 0xef, 0x21, 0x98, 0x72,
0x22, 0x2f, 0x88, 0x3b, 0x61, 0x44, 0xe0, 0x3d, 0xf9, 0x61, 0x4e, 0xfc, 0xfc, 0x20, 0x7e, 0x96,
0xbb, 0x34, 0x3f, 0x78, 0xe6, 0xbf, 0x8e, 0xe9, 0xa7, 0x6e, 0x2a, 0x6f, 0x28, 0xa5, 0x73, 0x2f,
0xfe, 0xb9, 0x7c, 0xea, 0xc5, 0xcb, 0x65, 0xe5, 0xcb, 0x97, 0xcb, 0xca, 0x3f, 0x5e, 0x2e, 0x2b,
0xbf, 0xfa, 0x6a, 0xf9, 0xd4, 0xf6, 0x19, 0xf6, 0xb3, 0xde, 0xfd, 0xff, 0x07, 0x00, 0x00, 0xff,
0xff, 0x96, 0xe4, 0x0d, 0x92, 0x1f, 0x1c, 0x00, 0x00,
}

View File

@ -328,28 +328,31 @@ enum FailureCase {
// member must be able to process client requests.
SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT = 13;
// SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_SNAPSHOT_FROM_SCRATCH first stops
// majority number of nodes, deletes data directories on those quorum nodes,
// to make the whole cluster inoperable. Now that quorum and their data are
// totally destroyed, cluster cannot even remove unavailable nodes (e.g. 2
// out of 3 are lost, so no leader can be elected).
// SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_LEADER_SNAPSHOT_FROM_SCRATCH first
// stops majority number of nodes, deletes data directories on those quorum
// nodes, to make the whole cluster inoperable. Now that quorum and their
// data are totally destroyed, cluster cannot even remove unavailable nodes
// (e.g. 2 out of 3 are lost, so no leader can be elected).
// Let's assume 3-node cluster of node A, B, and C. One day, node A and B
// are destroyed and all their data are gone. The only viable solution is
// to recover from C's latest snapshot.
// Tester simulates this scenario by:
// 1. Download snapshot from node C, before destroying node A and B.
// 2. Destroy node A and B, and make the whole cluster inoperable.
// 3. Now node C cannot operate either.
// 4. SIGTERM node C and remove its data directories.
// 5. Restore a new seed member from node C's latest snapshot file.
// 6. Add another member to establish 2-node cluster.
// 7. Add another member to establish 3-node cluster.
//
// To simulate:
// 1. Assume node C is the current leader with most up-to-date data.
// 2. Download snapshot from node C, before destroying node A and B.
// 3. Destroy node A and B, and make the whole cluster inoperable.
// 4. Now node C cannot operate either.
// 5. SIGTERM node C and remove its data directories.
// 6. Restore a new seed member from node C's latest snapshot file.
// 7. Add another member to establish 2-node cluster.
// 8. Add another member to establish 3-node cluster.
//
// The expected behavior is that etcd successfully recovers from such
// disastrous situation as only 1-node survives out of 3-node cluster,
// new members joins the existing cluster, and previous data from snapshot
// are still preserved after recovery process. As always, after recovery,
// each member must be able to process client requests.
SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_SNAPSHOT_FROM_SCRATCH = 14;
SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_LEADER_SNAPSHOT_FROM_SCRATCH = 14;
// BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER drops all outgoing/incoming
// packets from/to the peer port on a randomly chosen follower

View File

@ -173,9 +173,9 @@ func (clus *Cluster) updateFailures() {
case "SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT":
clus.failures = append(clus.failures,
new_FailureCase_SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT(clus))
case "SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_SNAPSHOT_FROM_SCRATCH":
case "SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_LEADER_SNAPSHOT_FROM_SCRATCH":
clus.failures = append(clus.failures,
new_FailureCase_SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_SNAPSHOT_FROM_SCRATCH(clus))
new_FailureCase_SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_LEADER_SNAPSHOT_FROM_SCRATCH(clus))
case "BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER":
clus.failures = append(clus.failures,

View File

@ -205,7 +205,7 @@ func Test_read(t *testing.T) {
"SIGQUIT_AND_REMOVE_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT",
// "SIGQUIT_AND_REMOVE_LEADER",
// "SIGQUIT_AND_REMOVE_LEADER_UNTIL_TRIGGER_SNAPSHOT",
"SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_SNAPSHOT_FROM_SCRATCH",
"SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_LEADER_SNAPSHOT_FROM_SCRATCH",
"BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER",
"BLACKHOLE_PEER_PORT_TX_RX_ONE_FOLLOWER_UNTIL_TRIGGER_SNAPSHOT",
"BLACKHOLE_PEER_PORT_TX_RX_LEADER",

View File

@ -69,7 +69,7 @@ func (f *fetchSnapshotAndFailureQuorum) FailureCase() rpcpb.FailureCase {
return f.failureCase
}
func inject_SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_SNAPSHOT_FROM_SCRATCH(clus *Cluster, idx1 int) error {
func inject_SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_LEADER_SNAPSHOT_FROM_SCRATCH(clus *Cluster, idx1 int) error {
cli1, err := clus.Members[idx1].CreateEtcdClient()
if err != nil {
return err
@ -167,7 +167,7 @@ func inject_SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_SNAPSHOT_FROM_SCRATCH(clus *Cl
return err
}
func recover_SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_SNAPSHOT_FROM_SCRATCH(clus *Cluster, idx1 int) error {
func recover_SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_LEADER_SNAPSHOT_FROM_SCRATCH(clus *Cluster, idx1 int) error {
idx2 := (idx1 + 1) % len(clus.Members)
cli2, err := clus.Members[idx2].CreateEtcdClient()
if err != nil {
@ -216,12 +216,12 @@ func recover_SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_SNAPSHOT_FROM_SCRATCH(clus *C
return err
}
func new_FailureCase_SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_SNAPSHOT_FROM_SCRATCH(clus *Cluster) Failure {
func new_FailureCase_SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_LEADER_SNAPSHOT_FROM_SCRATCH(clus *Cluster) Failure {
f := &fetchSnapshotAndFailureQuorum{
failureByFunc: failureByFunc{
failureCase: rpcpb.FailureCase_SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_SNAPSHOT_FROM_SCRATCH,
injectMember: inject_SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_SNAPSHOT_FROM_SCRATCH,
recoverMember: recover_SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_SNAPSHOT_FROM_SCRATCH,
failureCase: rpcpb.FailureCase_SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_LEADER_SNAPSHOT_FROM_SCRATCH,
injectMember: inject_SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_LEADER_SNAPSHOT_FROM_SCRATCH,
recoverMember: recover_SIGQUIT_AND_REMOVE_QUORUM_AND_RESTORE_LEADER_SNAPSHOT_FROM_SCRATCH,
},
injected: make(map[int]struct{}),
}