15 Nov 2008

This commit is contained in:
g-cont 2008-11-15 00:00:00 +03:00 committed by Alibek Omarov
parent aa5e82e4e3
commit 9cd0a7b95f
38 changed files with 3245 additions and 2884 deletions

16
baserc/baserc.plg Normal file
View File

@ -0,0 +1,16 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: baserc - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
<h3>Results</h3>
baserc.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

View File

@ -1,12 +1,12 @@
const unsigned char client_dat[] = {
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x88, 0x0e, 0x00,
0x00, 0x3f, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0xee, 0x01,
0x00, 0x00, 0xf7, 0x0b, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x0d,
0x0e, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xb5, 0x09, 0x00, 0x00,
0x68, 0x00, 0x00, 0x00, 0xf6, 0x00, 0x00, 0x00, 0x2c, 0x07, 0x00,
0x00, 0xb8, 0x0e, 0x00, 0x00, 0xd9, 0x01, 0x00, 0x00, 0x1b, 0x00,
0x00, 0x3f, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0xe2, 0x01,
0x00, 0x00, 0xe5, 0x0b, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xfa,
0x0d, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xa3, 0x09, 0x00, 0x00,
0x68, 0x00, 0x00, 0x00, 0xf6, 0x00, 0x00, 0x00, 0x34, 0x07, 0x00,
0x00, 0xa3, 0x0e, 0x00, 0x00, 0xda, 0x01, 0x00, 0x00, 0x1b, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xbe, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xac, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0a, 0x0d,
0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20,
0x77, 0x61, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
@ -21,7 +21,7 @@ const unsigned char client_dat[] = {
0x72, 0x2e, 0x0a, 0x54, 0x68, 0x61, 0x6e, 0x6b, 0x73, 0x20, 0x74,
0x6f, 0x20, 0x49, 0x44, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
0x72, 0x65, 0x20, 0x61, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x2e, 0x00,
0x0d, 0x0a, 0x0d, 0x0a, 0x0f, 0x03, 0x00, 0x00, 0x78, 0xda, 0x65,
0x0d, 0x0a, 0x0d, 0x0a, 0x13, 0x03, 0x00, 0x00, 0x78, 0xda, 0x65,
0x94, 0x4b, 0x73, 0xdc, 0x20, 0x0c, 0x80, 0x75, 0xee, 0xaf, 0xe8,
0xa5, 0xc7, 0x36, 0xcd, 0xa3, 0xcf, 0x5b, 0x5f, 0x69, 0x7b, 0xe8,
0x4c, 0x26, 0x99, 0xe4, 0x58, 0x8f, 0x16, 0x64, 0x9b, 0x09, 0x06,
@ -58,335 +58,333 @@ const unsigned char client_dat[] = {
0x23, 0x72, 0xe5, 0xc8, 0xec, 0x8e, 0x77, 0x9e, 0xb3, 0xfa, 0xb8,
0x5b, 0x51, 0x73, 0x3e, 0xac, 0x0f, 0x4b, 0x56, 0x53, 0xdd, 0xb5,
0x28, 0xe8, 0xb4, 0xd2, 0x59, 0xa5, 0xf3, 0x4a, 0x17, 0x95, 0xde,
0xd5, 0xed, 0x73, 0x1e, 0x55, 0x8a, 0x07, 0x9f, 0x23, 0xb2, 0xab,
0xbb, 0xe6, 0x1b, 0x6a, 0x71, 0x4d, 0xad, 0xa4, 0x16, 0x46, 0xae,
0xb4, 0xd9, 0x3a, 0xce, 0xe8, 0xc0, 0x05, 0x98, 0x22, 0xe0, 0x08,
0x75, 0x50, 0x0c, 0xad, 0x63, 0x35, 0xd3, 0x5e, 0x11, 0xdb, 0x74,
0xab, 0x6c, 0x1e, 0x2a, 0xc5, 0x4a, 0x87, 0x4c, 0x39, 0xee, 0x7e,
0x83, 0x8b, 0xed, 0xa2, 0xc4, 0xad, 0xc2, 0x2b, 0x9a, 0xd6, 0xba,
0x19, 0x9d, 0x7c, 0xa4, 0x64, 0x5f, 0x39, 0x6e, 0x38, 0x59, 0x3b,
0xd5, 0xf5, 0x61, 0x95, 0xd9, 0xb2, 0x50, 0xac, 0x94, 0xac, 0xa6,
0x31, 0xff, 0xf2, 0x3c, 0x8b, 0x58, 0xc4, 0x01, 0xac, 0x29, 0xf9,
0x81, 0x12, 0x07, 0x7e, 0xa5, 0x30, 0xf3, 0xab, 0x70, 0xb9, 0x02,
0xb8, 0x14, 0x14, 0x97, 0x45, 0xab, 0xb1, 0xf3, 0xa9, 0x2c, 0x36,
0x97, 0x39, 0xd2, 0xd8, 0xeb, 0xb1, 0x1e, 0x9f, 0xe8, 0x07, 0xf0,
0x6a, 0x48, 0x0e, 0x8b, 0x60, 0xfb, 0x05, 0xe2, 0x0a, 0xd9, 0x22,
0x85, 0xb3, 0x88, 0x62, 0x51, 0x82, 0xb9, 0xc0, 0x01, 0x94, 0xe4,
0x2c, 0x8c, 0x2a, 0x88, 0x3e, 0x47, 0xac, 0xa7, 0x72, 0xf3, 0x8a,
0x4b, 0x58, 0x17, 0x25, 0x6e, 0x95, 0x03, 0xf4, 0x29, 0x83, 0x3d,
0x27, 0xf4, 0xa1, 0xa1, 0xfa, 0xe4, 0xf1, 0xa1, 0xdc, 0xd0, 0x83,
0x26, 0x37, 0x72, 0x6e, 0x05, 0xb7, 0x26, 0xbe, 0x3d, 0xf7, 0x02,
0xaf, 0xac, 0x01, 0x49, 0x83, 0x4d, 0x81, 0xc9, 0xcf, 0x70, 0x9c,
0x8c, 0xe8, 0xf3, 0x85, 0x36, 0xc8, 0x7b, 0x6e, 0x94, 0xb8, 0x55,
0x0e, 0x8f, 0xdd, 0xaa, 0xac, 0x3a, 0x56, 0x53, 0xd0, 0x8e, 0x07,
0xe2, 0xd3, 0x81, 0x52, 0x3e, 0xf9, 0xb8, 0x11, 0x76, 0x9a, 0x2b,
0xb7, 0x11, 0x56, 0x5b, 0xb7, 0x65, 0x76, 0xb3, 0xd5, 0x8e, 0xec,
0xd8, 0x41, 0xd1, 0x30, 0x37, 0x24, 0x7e, 0x5a, 0x44, 0x26, 0x85,
0xb6, 0x40, 0x5c, 0x61, 0x5e, 0xa1, 0x87, 0x64, 0xed, 0xa3, 0x6f,
0x3a, 0x6d, 0x77, 0xa8, 0x53, 0x9e, 0xd1, 0xfb, 0xfc, 0x04, 0xca,
0x48, 0xc6, 0xc1, 0x4a, 0xd2, 0x8a, 0xdf, 0x11, 0xbb, 0x4a, 0xc5,
0x53, 0x90, 0xef, 0xad, 0x0c, 0x70, 0x27, 0xe0, 0xe7, 0x94, 0x2d,
0xc0, 0x72, 0xfd, 0xa5, 0xa1, 0x2c, 0x78, 0xdf, 0x05, 0xe2, 0x0a,
0x07, 0x6e, 0xba, 0xc6, 0xe7, 0x1f, 0xcf, 0x66, 0x11, 0x8b, 0x38,
0xa4, 0xdc, 0xe4, 0x04, 0xe5, 0x99, 0x24, 0x62, 0x11, 0x5c, 0x28,
0x56, 0x2b, 0xee, 0x13, 0xc4, 0x0d, 0xc6, 0x08, 0x02, 0x6a, 0x5b,
0xee, 0x6d, 0xbe, 0xbc, 0x4c, 0xd8, 0x59, 0xc9, 0xd7, 0xba, 0xe7,
0x5d, 0xd7, 0x9b, 0xb4, 0xa9, 0x35, 0x7b, 0x40, 0x55, 0xca, 0x18,
0xfe, 0x03, 0xef, 0x12, 0x9d, 0x72, 0xb0, 0x05, 0x00, 0x00, 0x78,
0xda, 0xcd, 0x59, 0x6b, 0x6c, 0x54, 0x45, 0x14, 0xbe, 0xa7, 0xd0,
0x02, 0x25, 0x44, 0x4d, 0x6d, 0xb1, 0x22, 0x6e, 0x2b, 0x92, 0x68,
0xea, 0x23, 0x56, 0x5d, 0x40, 0xa5, 0xbe, 0x5d, 0xc5, 0xe2, 0x0b,
0xc5, 0x94, 0x60, 0x48, 0xb0, 0x8a, 0x82, 0x82, 0x5a, 0x83, 0x81,
0x60, 0xe8, 0x6e, 0x51, 0xa8, 0x4d, 0x48, 0x48, 0x4c, 0x48, 0x10,
0x29, 0x01, 0x49, 0x10, 0xd4, 0xe2, 0x03, 0x83, 0x89, 0xa8, 0xd4,
0x60, 0x78, 0x68, 0x2b, 0x16, 0x34, 0x1a, 0xff, 0x0b, 0xf2, 0xee,
0x2e, 0x45, 0x7c, 0xd5, 0x33, 0xb9, 0x67, 0xb3, 0xe7, 0x7e, 0xde,
0x9d, 0xd9, 0x6d, 0x43, 0xc3, 0x26, 0xd3, 0x3b, 0xdf, 0x7e, 0x67,
0x66, 0xbe, 0x39, 0xf7, 0x9c, 0x33, 0xf7, 0x6e, 0x3d, 0x2f, 0xf8,
0x89, 0x70, 0x6b, 0xe4, 0xd6, 0x2d, 0xb8, 0x4c, 0xfa, 0xbf, 0x70,
0x4b, 0x72, 0xab, 0x96, 0xeb, 0x10, 0xe1, 0x1b, 0x94, 0x6d, 0x8a,
0x5b, 0x0b, 0xb7, 0x5f, 0xa5, 0x3f, 0x98, 0xdb, 0x0d, 0xdc, 0xf6,
0xc2, 0xfc, 0xdd, 0xc2, 0x9b, 0x4f, 0x91, 0xe0, 0xb8, 0x5c, 0x27,
0x72, 0x3b, 0xd3, 0xdb, 0xdb, 0xab, 0xed, 0x4f, 0xc9, 0x5c, 0x5e,
0x96, 0xf9, 0x7a, 0x1c, 0xfc, 0x69, 0x07, 0xff, 0x07, 0xf0, 0xef,
0x00, 0x7f, 0xc6, 0xc1, 0xff, 0xe9, 0xe0, 0xff, 0x72, 0xf0, 0x7f,
0x3b, 0xf8, 0x7f, 0x1c, 0xfc, 0xbf, 0x0e, 0xbe, 0xd7, 0xc1, 0x7b,
0x64, 0xe7, 0xc9, 0xc1, 0x17, 0x38, 0xf8, 0x41, 0x0e, 0x7e, 0xb0,
0x83, 0x2f, 0x74, 0xf0, 0x45, 0x0e, 0x7e, 0x88, 0xe2, 0x0d, 0x1e,
0x4a, 0x99, 0xf8, 0x8d, 0x48, 0xec, 0x15, 0x0b, 0x8e, 0x72, 0x5b,
0xe5, 0x65, 0xff, 0xcc, 0xe4, 0x36, 0x8c, 0xc7, 0x0f, 0x17, 0x7c,
0x3d, 0xb7, 0x13, 0x16, 0x7b, 0xc3, 0x1f, 0x77, 0xf0, 0x27, 0x01,
0x1f, 0xb3, 0xd8, 0x1b, 0xbd, 0xc5, 0xb0, 0xdf, 0x66, 0x8b, 0xfd,
0x2c, 0xd9, 0x5f, 0x8f, 0xe4, 0x94, 0xc1, 0x09, 0x93, 0x13, 0x0a,
0x37, 0x01, 0xbf, 0x44, 0xf1, 0x98, 0x8f, 0x61, 0xfe, 0x18, 0xae,
0xfc, 0x71, 0xae, 0x7f, 0xcc, 0xfe, 0x4a, 0x28, 0xb8, 0xdf, 0x0b,
0x01, 0x97, 0x02, 0x2e, 0x03, 0x3c, 0x12, 0xf0, 0x45, 0x80, 0xcb,
0x01, 0x5f, 0x0c, 0x78, 0x14, 0xe0, 0x4b, 0x18, 0x9f, 0xb2, 0xf8,
0xd8, 0x73, 0xc4, 0xcf, 0x0e, 0xb8, 0x1f, 0xa3, 0x79, 0xbe, 0x12,
0xc5, 0xef, 0xc2, 0x7c, 0xf6, 0x82, 0xf9, 0x50, 0x01, 0xf9, 0x50,
0x49, 0xc1, 0x7c, 0xf8, 0x51, 0x8d, 0x37, 0xf1, 0x70, 0x3e, 0xac,
0xdf, 0x1e, 0x32, 0xff, 0xa5, 0xe4, 0xe3, 0x62, 0xe9, 0x27, 0xa4,
0xe6, 0x57, 0xcb, 0x75, 0x90, 0xb2, 0xbf, 0x0c, 0xe2, 0xf9, 0x67,
0x98, 0x1f, 0xf5, 0x8f, 0x81, 0x7c, 0x26, 0x75, 0x1e, 0xdd, 0xc8,
0x6d, 0x29, 0xe8, 0x2d, 0x54, 0xb8, 0x4a, 0xce, 0x37, 0x1d, 0x0f,
0x26, 0xde, 0x8f, 0x41, 0x3e, 0x24, 0x05, 0xa3, 0xbd, 0xd1, 0xb3,
0x07, 0xe6, 0x8b, 0x3b, 0xf2, 0xb5, 0x1a, 0xf4, 0x5e, 0x4e, 0x41,
0xbd, 0xad, 0xca, 0xbe, 0x52, 0xf6, 0x53, 0x45, 0x19, 0xfb, 0x2a,
0xf0, 0xcf, 0xda, 0x10, 0x7f, 0x5f, 0x2d, 0xf6, 0x15, 0x46, 0x23,
0xf7, 0xaf, 0x55, 0xfe, 0xbf, 0x82, 0xfc, 0x3d, 0x68, 0xff, 0x17,
0xa8, 0xf1, 0x51, 0xf2, 0x6d, 0xd2, 0xf6, 0x57, 0x3a, 0xec, 0xc7,
0x91, 0x6f, 0xa3, 0x9f, 0x17, 0xae, 0xa2, 0xcc, 0xf3, 0x82, 0xe9,
0x1b, 0x3d, 0x7a, 0xfc, 0x38, 0x75, 0xde, 0x1b, 0x3e, 0x2e, 0xdf,
0xe3, 0xfe, 0x22, 0xc2, 0xeb, 0x78, 0x4c, 0x41, 0x7d, 0x5e, 0xaf,
0xf6, 0x5f, 0x2f, 0xfb, 0x2f, 0x87, 0xe7, 0x97, 0x6b, 0x28, 0x73,
0xff, 0xc7, 0x80, 0xbf, 0xe2, 0xc0, 0x57, 0x02, 0x9f, 0x00, 0x3e,
0x02, 0x7c, 0x13, 0xf0, 0xa3, 0x81, 0x5f, 0x02, 0xfc, 0x28, 0xe0,
0x27, 0x52, 0x90, 0x2f, 0x07, 0xfe, 0x56, 0xe0, 0x47, 0x02, 0x7f,
0x3b, 0xf0, 0xa5, 0xc0, 0xdf, 0x09, 0x7c, 0x09, 0xf0, 0x77, 0x03,
0x7f, 0x01, 0xf0, 0x31, 0xe0, 0xcf, 0x0b, 0x79, 0x3e, 0xd4, 0xfc,
0x08, 0xc8, 0x27, 0x73, 0xbe, 0x1e, 0x54, 0xf9, 0x34, 0x9e, 0xf1,
0x21, 0x85, 0x27, 0x30, 0xfe, 0x5d, 0xe1, 0x9b, 0x18, 0x1f, 0x56,
0xf8, 0x66, 0xc6, 0x47, 0x14, 0xbe, 0x85, 0xf1, 0x51, 0x85, 0x6b,
0x28, 0x98, 0xaf, 0xb7, 0x31, 0x3e, 0xae, 0xf0, 0x1d, 0x8c, 0x4f,
0x28, 0x7c, 0x17, 0xe3, 0x93, 0x0a, 0xdf, 0xc3, 0xb8, 0x5b, 0x9d,
0x6f, 0x49, 0x55, 0x7b, 0x1b, 0xd4, 0xde, 0xf0, 0x79, 0x36, 0x25,
0xf9, 0x35, 0x16, 0xe2, 0x35, 0xa5, 0xea, 0x4f, 0x85, 0xe4, 0x5b,
0xb1, 0xc2, 0x26, 0x17, 0x47, 0x40, 0xfc, 0xa5, 0x6b, 0xe8, 0x78,
0x6e, 0x1d, 0xca, 0x7f, 0xf7, 0xca, 0xf8, 0xb1, 0x14, 0xcc, 0x87,
0x64, 0x48, 0xfe, 0x98, 0xab, 0xd1, 0xbf, 0xdb, 0x72, 0x76, 0x18,
0x1d, 0xf7, 0x59, 0xf2, 0x19, 0xeb, 0xdb, 0x50, 0xb3, 0x3f, 0x19,
0x73, 0x3f, 0xf9, 0xb1, 0x65, 0xae, 0x93, 0x28, 0xb7, 0xf1, 0xa6,
0xd6, 0x1a, 0x5b, 0x93, 0x03, 0xb5, 0xe4, 0xeb, 0x7f, 0x00, 0xfc,
0x55, 0x0b, 0xf9, 0x1d, 0x83, 0xf3, 0xe6, 0xc3, 0x90, 0xfa, 0x56,
0x4b, 0x19, 0x7d, 0x93, 0x44, 0x5b, 0x4a, 0xea, 0x4d, 0x4a, 0x78,
0xad, 0xaf, 0xd0, 0x0b, 0xb7, 0x27, 0xe1, 0xe3, 0xca, 0x2e, 0x3d,
0x7e, 0x32, 0xf9, 0xfb, 0x99, 0x4c, 0xff, 0xaf, 0x17, 0xe9, 0xef,
0x90, 0x37, 0xdd, 0x07, 0xf9, 0xcf, 0x4c, 0xca, 0xd4, 0xb3, 0x46,
0x2f, 0x7b, 0x7c, 0x18, 0xfc, 0x64, 0x0e, 0xfb, 0x7d, 0x0c, 0xea,
0xf9, 0x0c, 0xca, 0xac, 0x37, 0x85, 0x7c, 0x7e, 0xba, 0xf8, 0xb7,
0x1e, 0xfc, 0x3b, 0x05, 0xfc, 0xfb, 0x54, 0x0e, 0xeb, 0xd5, 0x51,
0xf0, 0xfc, 0xd7, 0xf3, 0x3d, 0x0a, 0xf3, 0xd5, 0xe7, 0x30, 0xdf,
0x13, 0x14, 0xc4, 0xd3, 0x14, 0x7e, 0x98, 0xfb, 0x53, 0x15, 0x7e,
0x84, 0xfb, 0x8f, 0xab, 0xfd, 0x4e, 0x85, 0xf5, 0x1f, 0xa2, 0x60,
0x7e, 0xd5, 0x41, 0x7e, 0xcd, 0xc8, 0x23, 0xbf, 0xc2, 0xe6, 0x7f,
0x1a, 0xe6, 0x9f, 0xee, 0x98, 0x7f, 0x16, 0x65, 0x9f, 0x1f, 0x3f,
0x26, 0xfe, 0x9e, 0x63, 0xfb, 0xd9, 0x14, 0x8c, 0xb7, 0xf4, 0xf3,
0x90, 0xe1, 0x23, 0xcc, 0xcd, 0x91, 0x1c, 0x2f, 0x94, 0xf7, 0xeb,
0x84, 0x5c, 0xcd, 0x7a, 0xcf, 0x80, 0xde, 0x67, 0x2d, 0xe7, 0x63,
0x44, 0xc6, 0x69, 0xbd, 0xb3, 0x95, 0x5e, 0x83, 0xe7, 0xa8, 0xe7,
0xc3, 0x09, 0xdc, 0x7e, 0xb3, 0xe8, 0x37, 0xb7, 0xe5, 0xf9, 0xb3,
0x10, 0xdf, 0x2f, 0x41, 0x7c, 0x27, 0x28, 0x18, 0x5f, 0x7a, 0xfe,
0x17, 0xfa, 0x10, 0xcf, 0x0b, 0x2c, 0xf1, 0xfc, 0x62, 0x1f, 0xe2,
0x79, 0xa1, 0xaa, 0x3f, 0x0b, 0xe4, 0x79, 0x76, 0x11, 0xf9, 0x78,
0xa1, 0xe0, 0x57, 0xc9, 0xb7, 0x35, 0xdf, 0x9b, 0xfd, 0x2d, 0x96,
0xfc, 0x34, 0xdf, 0x37, 0x2a, 0x3d, 0x73, 0xb9, 0xdf, 0xa0, 0xf0,
0x3c, 0xee, 0xbf, 0x4c, 0x99, 0xfa, 0x3e, 0x57, 0xea, 0xfb, 0x7c,
0xf2, 0xf1, 0x3c, 0xc1, 0xaf, 0x90, 0xef, 0xaf, 0x06, 0xb5, 0x9f,
0x0a, 0xd1, 0xa3, 0xe3, 0x37, 0x41, 0xc1, 0x78, 0x88, 0xab, 0x78,
0x30, 0xcf, 0x61, 0x9d, 0x90, 0x0f, 0xf3, 0xc1, 0x3f, 0xaf, 0xc1,
0x7c, 0x8b, 0x20, 0x1f, 0x12, 0x79, 0xe6, 0x1b, 0xce, 0xff, 0x3a,
0xcc, 0xbf, 0xd8, 0x31, 0x7f, 0x5f, 0xf2, 0x6d, 0x99, 0x23, 0xdf,
0x9a, 0x2d, 0xf9, 0xb6, 0x94, 0xec, 0xf1, 0x9d, 0x84, 0x7c, 0x5b,
0x06, 0x7a, 0x9b, 0x41, 0xef, 0x21, 0x8b, 0x5e, 0xb3, 0xdf, 0x37,
0xd9, 0xbe, 0x45, 0xe5, 0xc3, 0x4a, 0xee, 0x2f, 0x87, 0xfc, 0x58,
0xa1, 0x70, 0x0b, 0xe8, 0x7b, 0x03, 0xfc, 0xb9, 0x1c, 0xfc, 0xb9,
0x22, 0x8f, 0xfb, 0x15, 0xf6, 0xfe, 0xf2, 0x16, 0x8f, 0x6f, 0x55,
0xf1, 0xba, 0x9a, 0xfb, 0x6b, 0x15, 0x7e, 0x9b, 0xfb, 0xeb, 0x14,
0x5e, 0xc3, 0xfd, 0xf5, 0xa0, 0x7f, 0x83, 0xc2, 0xad, 0xa0, 0x7f,
0x15, 0xe8, 0x5f, 0x07, 0xfa, 0x37, 0xf4, 0x43, 0x7f, 0x3a, 0x1e,
0x36, 0x39, 0xe2, 0x61, 0xb3, 0x25, 0x1e, 0xde, 0xcd, 0x33, 0x1e,
0x36, 0x81, 0xde, 0xcd, 0x10, 0x0f, 0x47, 0x1c, 0xfe, 0x7e, 0x0f,
0xde, 0xf7, 0xd6, 0x58, 0xde, 0xdf, 0x0d, 0x7f, 0x18, 0xf8, 0xf7,
0x61, 0xfc, 0x6a, 0xc7, 0xfb, 0xff, 0x07, 0x50, 0x0f, 0xdb, 0xa0,
0x7e, 0x44, 0x29, 0x58, 0x3f, 0x0e, 0xc2, 0x7c, 0x5b, 0x2c, 0xeb,
0x5d, 0x27, 0xeb, 0x15, 0x58, 0xf6, 0xbb, 0xa5, 0x9f, 0x7a, 0x3f,
0x02, 0xbd, 0x1f, 0x83, 0xff, 0xdb, 0xe0, 0xfc, 0x8b, 0xe6, 0x71,
0xfe, 0x19, 0xfb, 0x4f, 0x28, 0xbb, 0xbf, 0xc3, 0xec, 0x3f, 0x67,
0xfb, 0xad, 0x2a, 0x1f, 0xb6, 0x73, 0xff, 0x53, 0x55, 0xdf, 0xeb,
0xe4, 0xcc, 0xd9, 0x26, 0xe7, 0xc3, 0x34, 0x6e, 0x9f, 0xa9, 0xfc,
0xd8, 0x06, 0xf1, 0xf6, 0x05, 0xfc, 0x5e, 0xd0, 0x05, 0xf5, 0x63,
0x2b, 0xe8, 0xdb, 0x0f, 0x7a, 0xbe, 0xb4, 0xf8, 0xb7, 0x5a, 0xfc,
0x5b, 0xa4, 0xec, 0xbf, 0x0a, 0xf9, 0x7d, 0x25, 0xe5, 0xb8, 0x3f,
0x49, 0xc8, 0x8f, 0xf4, 0x23, 0x72, 0x8d, 0xe2, 0xc3, 0x9e, 0xcf,
0x8d, 0xfd, 0x0e, 0x58, 0xaf, 0x0d, 0xee, 0x6f, 0x14, 0xce, 0xe7,
0x8d, 0x64, 0xff, 0x3d, 0xec, 0x27, 0xc0, 0x07, 0x40, 0xef, 0x2e,
0x1e, 0xdf, 0xae, 0xee, 0xcf, 0x6e, 0xee, 0x7f, 0xad, 0xf0, 0x1e,
0xee, 0x7f, 0x03, 0x78, 0xa7, 0xc2, 0x31, 0x2f, 0x78, 0xfe, 0xb6,
0x43, 0xfd, 0xda, 0x09, 0x7a, 0x8f, 0xaa, 0xf5, 0x4b, 0x65, 0xfc,
0x5e, 0x78, 0x5f, 0xd1, 0xfb, 0xfd, 0x16, 0xfc, 0xf1, 0x1d, 0xf8,
0x63, 0x3b, 0xc4, 0x7b, 0x07, 0xc4, 0x7b, 0x87, 0xa5, 0xde, 0x94,
0x65, 0x59, 0xbf, 0x00, 0xf4, 0x75, 0x4a, 0x3d, 0xac, 0x11, 0x1e,
0xef, 0x9f, 0xd6, 0xf3, 0xfd, 0x00, 0xe8, 0xed, 0x74, 0xe8, 0xdd,
0x97, 0x87, 0xde, 0x1f, 0x06, 0x40, 0xef, 0x3e, 0x87, 0xde, 0xae,
0x73, 0x4c, 0x6f, 0x97, 0x43, 0x6f, 0x2c, 0x0f, 0xbd, 0xfb, 0x07,
0x40, 0x6f, 0xcc, 0x92, 0x3f, 0x07, 0xce, 0xe2, 0xfa, 0xf8, 0xff,
0x24, 0xac, 0x87, 0xc5, 0x52, 0xef, 0xe2, 0xe0, 0x9f, 0xa2, 0x2c,
0xff, 0xcf, 0x4c, 0xd7, 0xb7, 0x5c, 0xeb, 0x9d, 0xf9, 0xbd, 0x67,
0x58, 0x1f, 0xf4, 0x24, 0x2c, 0xf5, 0xb7, 0x07, 0xf4, 0xd4, 0x3b,
0xde, 0x8f, 0x36, 0x52, 0xfe, 0xeb, 0x37, 0x59, 0xd6, 0x3f, 0xdd,
0x0f, 0x7f, 0xb8, 0x3e, 0xff, 0x01, 0x71, 0x69, 0x23, 0x9d, 0x42,
0x02, 0x00, 0x00, 0x78, 0xda, 0x8d, 0x97, 0xbb, 0x4f, 0x15, 0x41,
0x14, 0x87, 0xf7, 0xec, 0x22, 0xc6, 0x10, 0x0d, 0x21, 0x04, 0x03,
0x89, 0x85, 0x09, 0x8d, 0x85, 0x31, 0x84, 0xc6, 0x84, 0x8e, 0xd0,
0xd8, 0x40, 0xab, 0xd1, 0x3f, 0x40, 0x0b, 0x1a, 0x12, 0x4c, 0x6c,
0x7d, 0xf2, 0x10, 0x45, 0x41, 0x50, 0xec, 0x4d, 0xb4, 0x92, 0x04,
0x04, 0x11, 0x41, 0xb1, 0xf1, 0xd9, 0x21, 0x76, 0x8a, 0x2f, 0x14,
0x14, 0x79, 0xf8, 0x28, 0x50, 0x81, 0x73, 0x77, 0x67, 0xd9, 0x81,
0xcc, 0xdc, 0x7c, 0x93, 0x9c, 0x64, 0xce, 0xe6, 0xbb, 0xbf, 0xdf,
0xce, 0xcc, 0x99, 0xb9, 0xb3, 0x41, 0xc0, 0xda, 0x9a, 0xb6, 0x02,
0xcf, 0x73, 0x3b, 0x5f, 0xf5, 0x70, 0xab, 0x5b, 0xb8, 0xff, 0x50,
0xef, 0x9f, 0x87, 0xdb, 0xda, 0xfe, 0x7a, 0x38, 0x31, 0x91, 0xb6,
0x15, 0xa8, 0xf7, 0x1b, 0xea, 0xfd, 0x82, 0xdc, 0x4f, 0xc8, 0x2d,
0x43, 0x6e, 0x09, 0x72, 0x8b, 0x70, 0xbc, 0x0b, 0x50, 0xef, 0x87,
0x87, 0x8b, 0x72, 0x9c, 0x64, 0xe4, 0xbc, 0x87, 0x0b, 0x63, 0x2e,
0xcb, 0xbf, 0x43, 0xdf, 0x6f, 0x50, 0x6f, 0x0e, 0x72, 0xb3, 0x79,
0xb8, 0x28, 0xca, 0xf2, 0xaf, 0x70, 0xbc, 0x5f, 0xa0, 0xef, 0x0c,
0x1c, 0xef, 0x67, 0xa8, 0xf7, 0x09, 0xea, 0x7d, 0x84, 0xfb, 0xed,
0x03, 0xd4, 0x7b, 0x0f, 0xb9, 0x69, 0xe8, 0xfb, 0x0e, 0xce, 0xf3,
0x5b, 0xe8, 0xfb, 0x06, 0xd6, 0xfd, 0x14, 0xd4, 0x7b, 0x0d, 0xb9,
0x49, 0xb8, 0x6e, 0xaf, 0x20, 0xf7, 0x12, 0xfa, 0xbe, 0x80, 0xdc,
0x73, 0xc8, 0x3d, 0x83, 0xef, 0xf7, 0x14, 0x72, 0x4f, 0x20, 0x37,
0x01, 0xb9, 0xc7, 0xb0, 0x5e, 0x1e, 0x41, 0xbd, 0x71, 0x38, 0x2f,
0x63, 0x90, 0x7b, 0x08, 0xb9, 0x51, 0xc8, 0x3d, 0x80, 0xdc, 0x08,
0xe4, 0xee, 0x43, 0x6e, 0x18, 0x72, 0x43, 0x90, 0xbb, 0x07, 0xb9,
0x41, 0xc8, 0x0d, 0xc0, 0xf5, 0xed, 0xcf, 0xa3, 0x67, 0x1d, 0xf7,
0xc1, 0x5d, 0xc8, 0xdd, 0x84, 0xe7, 0xcb, 0x0d, 0xc8, 0x5d, 0x87,
0x5c, 0x2f, 0xe4, 0x7a, 0x20, 0x77, 0x0d, 0x72, 0xdd, 0x90, 0xeb,
0x82, 0xdc, 0x55, 0xc8, 0x5d, 0x81, 0x5c, 0x27, 0xac, 0x97, 0xcb,
0x1e, 0x6e, 0x5b, 0x6e, 0x7d, 0x25, 0x8a, 0x52, 0xf6, 0x12, 0xe4,
0x3a, 0x20, 0x77, 0xd1, 0xc3, 0x15, 0xc4, 0xf7, 0x8d, 0x0d, 0x2c,
0x68, 0xf7, 0x70, 0x85, 0x31, 0x97, 0x09, 0xb6, 0xe5, 0x3b, 0xff,
0xac, 0x0b, 0x4c, 0x2b, 0x9c, 0x97, 0x96, 0x7c, 0xf7, 0x21, 0x0b,
0xbc, 0x00, 0xf7, 0xc7, 0x79, 0xb8, 0x6e, 0xe7, 0xe0, 0x39, 0x7e,
0x16, 0xea, 0x9d, 0x81, 0xe3, 0x38, 0x0d, 0xe7, 0x25, 0xd7, 0x5f,
0xd6, 0xd8, 0x9d, 0xde, 0xe3, 0x3d, 0xbe, 0xd5, 0x1a, 0x3b, 0x24,
0xf1, 0xc9, 0xb5, 0x32, 0x71, 0xeb, 0xd5, 0x69, 0x14, 0xe9, 0x83,
0x12, 0x93, 0xef, 0x95, 0xac, 0x0e, 0xc4, 0x5a, 0xb8, 0xa3, 0x1a,
0x7b, 0xac, 0x1f, 0x56, 0x89, 0xdb, 0xf7, 0x98, 0xe1, 0xb6, 0x9b,
0xfc, 0xb0, 0xc7, 0xb7, 0x59, 0xa3, 0xd2, 0x7a, 0x70, 0xc2, 0xa3,
0x77, 0xd2, 0x70, 0x95, 0x26, 0x3f, 0x25, 0xee, 0xba, 0x1a, 0xd3,
0x38, 0x24, 0x49, 0x5d, 0xc6, 0x75, 0x21, 0xee, 0x73, 0x77, 0x52,
0xa3, 0x41, 0xf3, 0x72, 0x93, 0xdf, 0x92, 0xac, 0x9e, 0x25, 0x6e,
0x49, 0xfe, 0x47, 0xe3, 0xb8, 0x24, 0xfb, 0x26, 0xfe, 0x3f, 0xd9,
0x34, 0x2f, 0x99, 0x62, 0xa8, 0xbd, 0x46, 0x8d, 0x8a, 0xf4, 0x7b,
0x44, 0xb2, 0xfd, 0x66, 0xc9, 0x05, 0xfb, 0x25, 0x79, 0xa7, 0xf4,
0x8d, 0x25, 0x74, 0xd7, 0xd5, 0x41, 0xed, 0xb6, 0x69, 0x14, 0x9b,
0xbc, 0x22, 0x74, 0xcf, 0x5f, 0xad, 0x26, 0x7d, 0x1a, 0xbb, 0x4c,
0x7e, 0x20, 0x74, 0xfb, 0xd6, 0x6b, 0xe7, 0xb6, 0xe5, 0x5b, 0xe3,
0xf1, 0x3d, 0xa2, 0xdd, 0x01, 0xcb, 0xa0, 0x35, 0x74, 0xaf, 0x47,
0x93, 0x32, 0x83, 0x16, 0x77, 0xc7, 0xc3, 0x35, 0x1b, 0x6e, 0x67,
0xfa, 0xdd, 0xe2, 0xe1, 0x3a, 0x94, 0x99, 0xd0, 0x28, 0x35, 0xf9,
0xbe, 0xc8, 0xcd, 0xcd, 0x2b, 0x33, 0x65, 0xf9, 0xd6, 0x7a, 0xb8,
0x75, 0xa8, 0xe8, 0x68, 0x64, 0x16, 0x02, 0x00, 0x00, 0x78, 0xda,
0x4d, 0xd4, 0x49, 0x6c, 0x4d, 0x61, 0x18, 0x87, 0xf1, 0xdb, 0xe1,
0x56, 0x88, 0xc4, 0x46, 0x2c, 0xac, 0x50, 0xad, 0x79, 0x1e, 0x5a,
0x35, 0x5d, 0x6a, 0x6c, 0x55, 0x51, 0x43, 0x5b, 0x94, 0x52, 0x43,
0x6b, 0x68, 0x55, 0x4d, 0xd5, 0x92, 0x48, 0x6a, 0xc1, 0x06, 0x1b,
0x89, 0x85, 0x85, 0x04, 0xe9, 0x4e, 0x2c, 0x88, 0x48, 0x58, 0x20,
0x91, 0xb0, 0x23, 0xc2, 0x42, 0x24, 0x22, 0x76, 0x84, 0xd8, 0x89,
0x88, 0xe7, 0xf5, 0x3d, 0x49, 0x7b, 0x73, 0xfe, 0xe7, 0xfc, 0xf2,
0xde, 0xf7, 0x9c, 0xfb, 0xe5, 0xbd, 0xdf, 0xbd, 0x99, 0xcc, 0xc0,
0xab, 0x30, 0x93, 0xc9, 0x8d, 0xe3, 0x5a, 0x5b, 0x90, 0x5c, 0x8c,
0xeb, 0x70, 0x1e, 0x1e, 0x8f, 0x1b, 0x70, 0x3e, 0x2e, 0xc1, 0xcd,
0xba, 0x14, 0xb7, 0x61, 0x8e, 0xdc, 0x04, 0xdc, 0x95, 0xea, 0x99,
0x70, 0x8f, 0x9e, 0x48, 0x2e, 0xea, 0x49, 0xe4, 0x8a, 0xfd, 0x93,
0xf1, 0x0d, 0xeb, 0xe1, 0xdb, 0x7a, 0x0a, 0xb9, 0xaf, 0xa7, 0x92,
0xa7, 0xf6, 0x4f, 0xc3, 0xaf, 0xad, 0x87, 0xdf, 0xe9, 0xe9, 0xe4,
0xb3, 0x9e, 0x41, 0xbe, 0xdb, 0x3f, 0x13, 0xff, 0xb6, 0x1e, 0xce,
0x2f, 0x4c, 0x9e, 0x45, 0x86, 0xeb, 0xd9, 0x64, 0x54, 0x61, 0xea,
0x9f, 0x83, 0xc7, 0x58, 0x0f, 0x97, 0xe8, 0xb9, 0xb1, 0x0e, 0x3d,
0x2f, 0xde, 0x4b, 0xce, 0xcd, 0xc7, 0x15, 0xba, 0x0c, 0x57, 0xea,
0x72, 0x5c, 0xa3, 0x17, 0xe0, 0x7a, 0x9f, 0x5f, 0x81, 0x5b, 0x7c,
0x4e, 0xb8, 0x53, 0x2f, 0x24, 0x17, 0xf4, 0x22, 0x72, 0xcd, 0xfe,
0xc5, 0xf8, 0x96, 0xf5, 0x70, 0xbf, 0x5e, 0x12, 0xf3, 0xd1, 0x4b,
0xc9, 0x63, 0xfb, 0x73, 0xf8, 0xb9, 0xf5, 0xf0, 0x2b, 0xbd, 0x8c,
0xbc, 0xd5, 0xcb, 0xc9, 0x47, 0xd7, 0x56, 0x89, 0xbf, 0x7a, 0xef,
0x0a, 0xfc, 0xd3, 0x9e, 0xf0, 0x1f, 0xbd, 0x92, 0x0c, 0xcd, 0x26,
0xaf, 0x8a, 0x59, 0x25, 0xe7, 0x56, 0xe3, 0x62, 0xbd, 0x26, 0xbe,
0x3f, 0xbd, 0x16, 0x97, 0xe9, 0xaa, 0xf8, 0x3c, 0x5d, 0x8d, 0xab,
0xf5, 0xba, 0x98, 0x89, 0xae, 0x89, 0x35, 0xe7, 0xa7, 0x35, 0xac,
0xc7, 0xfb, 0xfc, 0xac, 0x70, 0x87, 0xae, 0x25, 0xbd, 0x7a, 0x03,
0xb9, 0x94, 0x4d, 0xfd, 0x1b, 0xf1, 0x75, 0xeb, 0xe1, 0x3b, 0x7a,
0x13, 0x79, 0xa8, 0xeb, 0xc8, 0xcb, 0x6c, 0xda, 0xcf, 0x9b, 0xf1,
0x07, 0xef, 0xdd, 0x82, 0xbf, 0xd8, 0x13, 0xfe, 0xa1, 0xb7, 0x92,
0xbf, 0x7a, 0x5b, 0xec, 0x93, 0xa2, 0xb4, 0xce, 0x7a, 0x3c, 0x5a,
0x37, 0xe0, 0x52, 0xdd, 0x18, 0x7b, 0x4e, 0x6f, 0xc7, 0xe5, 0x7a,
0x47, 0xcc, 0x1d, 0x73, 0xe4, 0x76, 0xe2, 0x5f, 0x99, 0xe4, 0x26,
0xae, 0x63, 0xf3, 0x92, 0x77, 0xc5, 0x1c, 0xf4, 0xee, 0x98, 0xad,
0x6e, 0x8e, 0x3d, 0xaa, 0xf7, 0xe0, 0x56, 0xbd, 0x37, 0xe6, 0x59,
0xf0, 0xff, 0xa7, 0x9a, 0x6b, 0xe1, 0x54, 0x45, 0x31, 0x1b, 0x33,
0x23, 0x8d, 0x7a, 0x7f, 0xec, 0x31, 0x7d, 0x80, 0xb4, 0xeb, 0x83,
0xa4, 0x5b, 0xb7, 0x92, 0x3e, 0xdd, 0x46, 0x2e, 0xeb, 0x43, 0xe4,
0xaa, 0x3e, 0x1c, 0xb3, 0x1d, 0xe4, 0x9b, 0xfa, 0x08, 0xb9, 0xab,
0x8f, 0x92, 0x7b, 0xba, 0x3d, 0x7a, 0x0a, 0x06, 0xdc, 0xaf, 0x3b,
0xc8, 0x03, 0x7d, 0x8c, 0x3c, 0xd3, 0x9d, 0xe4, 0x51, 0xd1, 0x80,
0x9f, 0xe8, 0xe3, 0xe4, 0x85, 0xee, 0x8a, 0xdf, 0xbb, 0x3e, 0x41,
0xde, 0x0c, 0xf2, 0x7b, 0x7d, 0x92, 0x7c, 0xd2, 0xa7, 0x62, 0x3f,
0xeb, 0xd3, 0xe4, 0x9b, 0x3e, 0x13, 0xf3, 0xd7, 0xdd, 0xb1, 0xb7,
0xf5, 0xd9, 0xf8, 0xcf, 0x1b, 0x92, 0xdc, 0x43, 0x86, 0xe9, 0x5e,
0x32, 0x42, 0x9f, 0x23, 0x4d, 0x85, 0x69, 0xe6, 0xe7, 0x39, 0x8d,
0xb4, 0xde, 0x17, 0xfb, 0x1f, 0xff, 0x03, 0x7d, 0x37, 0x69, 0x44,
0xab, 0x00, 0x00, 0x00, 0x78, 0xda, 0x45, 0xd0, 0x29, 0x0f, 0xc2,
0x40, 0x14, 0x45, 0xe1, 0x81, 0x96, 0x96, 0x7d, 0xdf, 0x2d, 0xff,
0x0a, 0x81, 0xc2, 0xd7, 0xe3, 0x51, 0x28, 0x14, 0x0e, 0x4b, 0x70,
0x28, 0x12, 0x0c, 0x86, 0xe0, 0x70, 0x18, 0x1c, 0x0e, 0x87, 0xc2,
0x22, 0xb8, 0x2f, 0xef, 0x24, 0x34, 0x39, 0x99, 0x2f, 0x93, 0x37,
0xd3, 0xa6, 0x21, 0xfc, 0x9f, 0x1c, 0xeb, 0x34, 0x71, 0x5b, 0x73,
0x39, 0x1f, 0xbc, 0x0c, 0x47, 0x6a, 0x21, 0xc7, 0xc1, 0x5b, 0xe2,
0x82, 0x5a, 0x71, 0x56, 0x4b, 0x58, 0x27, 0x3e, 0x9b, 0xaa, 0x0d,
0x67, 0xcd, 0x5b, 0x5c, 0x54, 0x3b, 0x5c, 0x52, 0x07, 0xe6, 0xcb,
0x36, 0x13, 0xf9, 0xbe, 0x79, 0x8f, 0x2b, 0xea, 0x88, 0xab, 0xea,
0x12, 0xf9, 0x7c, 0x4d, 0x9d, 0xb8, 0xc7, 0x7c, 0xc6, 0x75, 0x75,
0xc5, 0x0d, 0x75, 0xe3, 0xfe, 0xa6, 0xba, 0xb3, 0x6f, 0x7e, 0xe0,
0x96, 0x7a, 0xe2, 0xb6, 0x7a, 0xe1, 0x8e, 0x7a, 0xe3, 0xae, 0xfa,
0xe0, 0x9e, 0xfa, 0xe2, 0xbe, 0xfd, 0x8b, 0xd4, 0x3d, 0xb0, 0xef,
0xc6, 0x43, 0x7b, 0x37, 0x1e, 0xa9, 0x59, 0xec, 0x1e, 0xab, 0x89,
0xf6, 0x7f, 0xeb, 0xca, 0x15, 0x07, 0x06, 0x02, 0x00, 0x00, 0x78,
0xda, 0xed, 0xd4, 0xb9, 0x4f, 0x14, 0x51, 0x1c, 0xc0, 0xf1, 0x99,
0x5d, 0x05, 0xdd, 0x55, 0x41, 0x0e, 0xb9, 0xd4, 0x5d, 0x44, 0x45,
0x05, 0x15, 0xb9, 0xe4, 0x50, 0x98, 0x63, 0x47, 0xd6, 0x03, 0x41,
0xbc, 0xb8, 0x14, 0xe4, 0x4e, 0x08, 0x81, 0x4a, 0x1b, 0x12, 0xa6,
0x93, 0x82, 0x82, 0x86, 0x84, 0x35, 0x6a, 0x88, 0x7f, 0x81, 0x05,
0x16, 0x6a, 0x21, 0x89, 0x24, 0x90, 0x90, 0x10, 0x42, 0x43, 0x68,
0xc8, 0x96, 0xd8, 0xd1, 0xd1, 0x50, 0xf0, 0x9d, 0xb7, 0x8f, 0x28,
0x10, 0x89, 0x21, 0x48, 0xc5, 0xcb, 0x7e, 0xf6, 0x97, 0x97, 0x7d,
0xd7, 0xfe, 0xe6, 0x37, 0x4f, 0x51, 0x0e, 0xda, 0x7e, 0xb7, 0x27,
0x78, 0x86, 0x5a, 0x3c, 0xc5, 0x73, 0xd4, 0xa1, 0xf3, 0x8f, 0x31,
0x2a, 0x5c, 0x70, 0xe3, 0x10, 0x0e, 0x23, 0x0a, 0xd1, 0x38, 0x82,
0xa3, 0xf0, 0xc0, 0x8b, 0x63, 0x38, 0x8e, 0x13, 0x88, 0x41, 0x2c,
0x4e, 0x22, 0x0e, 0xf1, 0x48, 0x40, 0x22, 0x4e, 0x21, 0x09, 0xc9,
0x48, 0xd9, 0x74, 0x22, 0xbb, 0x9c, 0x2f, 0x8d, 0x0f, 0x6c, 0x2d,
0x75, 0x1f, 0xcf, 0xe0, 0xec, 0x95, 0x86, 0xd3, 0x38, 0x83, 0xb3,
0xf0, 0xc1, 0x8f, 0x74, 0x9c, 0x43, 0x06, 0xce, 0xe3, 0x02, 0x2e,
0x22, 0x13, 0x97, 0x70, 0x19, 0x57, 0x90, 0x85, 0x6c, 0x5c, 0xc5,
0x35, 0x5c, 0x47, 0x0e, 0x6e, 0x20, 0x17, 0x79, 0xc8, 0x47, 0x01,
0x0a, 0x71, 0x13, 0x45, 0x28, 0x46, 0x09, 0x4a, 0x71, 0x0b, 0xb7,
0x51, 0x06, 0x99, 0x0c, 0x45, 0x87, 0x01, 0x13, 0x01, 0x58, 0xb8,
0x83, 0x0a, 0x04, 0x71, 0x17, 0xf7, 0x70, 0x1f, 0x0f, 0x50, 0x89,
0x87, 0xa8, 0x42, 0x35, 0x1e, 0xa1, 0x06, 0x8f, 0x45, 0x36, 0x73,
0x74, 0x8f, 0xcc, 0xa9, 0x57, 0xe6, 0xc2, 0x27, 0xff, 0x43, 0x9e,
0xdc, 0xbb, 0x42, 0xce, 0x69, 0x40, 0x3b, 0x1a, 0xf1, 0x02, 0x2f,
0xd1, 0x84, 0x66, 0xbc, 0x42, 0xbd, 0xfc, 0xbd, 0x15, 0x6d, 0xe8,
0xd8, 0x52, 0x5f, 0xbd, 0x78, 0x83, 0x01, 0xbc, 0xc5, 0x10, 0x86,
0x31, 0x82, 0x10, 0x3e, 0xe1, 0x33, 0xbe, 0xe0, 0x1b, 0x7e, 0xe0,
0x27, 0xa6, 0x30, 0x87, 0x05, 0x84, 0xf1, 0x4b, 0x3e, 0x63, 0xa7,
0xad, 0xfd, 0x4b, 0x61, 0x07, 0xdf, 0x5b, 0xca, 0x28, 0x96, 0x51,
0xf4, 0xc1, 0x52, 0xaa, 0x89, 0xcd, 0xe8, 0xc2, 0x1c, 0x7d, 0xff,
0x47, 0x4b, 0x19, 0xfc, 0x6e, 0xfd, 0x9e, 0xb0, 0x42, 0x6a, 0xfb,
0x60, 0xeb, 0x01, 0x12, 0x53, 0xa3, 0xee, 0xfe, 0x9d, 0x7a, 0xad,
0x6e, 0xd4, 0xf1, 0x06, 0xe7, 0xd1, 0x69, 0x46, 0xbc, 0xac, 0xab,
0x4c, 0x59, 0x0f, 0xa5, 0x62, 0xf4, 0x98, 0x16, 0x39, 0xc4, 0x84,
0x56, 0x25, 0x62, 0x58, 0xab, 0x8b, 0x2c, 0xa3, 0xb7, 0x8a, 0x10,
0xab, 0xf7, 0x88, 0xe8, 0xd7, 0x1b, 0xfe, 0xb2, 0xdf, 0xbb, 0x50,
0xa8, 0x6c, 0x2f, 0xef, 0x04, 0xcf, 0x42, 0x06, 0x25, 0x38, 0xcd,
0x99, 0x6d, 0xa7, 0xe4, 0x02, 0x23, 0x91, 0x5c, 0x94, 0x6f, 0x1f,
0xe9, 0x0f, 0xfc, 0xef, 0xfb, 0x69, 0x96, 0xbd, 0x97, 0xd4, 0xbd,
0x58, 0xc9, 0x39, 0xab, 0xf3, 0x8c, 0x77, 0xdf, 0x5a, 0xb6, 0xf4,
0x2b, 0xb9, 0x90, 0x9a, 0xd0, 0xed, 0x12, 0x5d, 0xb3, 0x3f, 0x12,
0x29, 0x5f, 0x9b, 0x7d, 0xe6, 0xcd, 0x51, 0xd7, 0x4e, 0xab, 0xc5,
0x31, 0x66, 0x15, 0x61, 0xf3, 0x2b, 0xe3, 0x26, 0x31, 0x83, 0xc5,
0x1d, 0xe7, 0x74, 0x98, 0x8a, 0xbd, 0xc4, 0x9c, 0x09, 0xae, 0x83,
0x71, 0x63, 0x55, 0x8c, 0x0d, 0xd2, 0x1f, 0xa3, 0x3f, 0x64, 0xa8,
0x6e, 0xd1, 0x37, 0xbc, 0x22, 0xae, 0xe8, 0x89, 0x44, 0x9f, 0x7b,
0xf3, 0x0a, 0xeb, 0x87, 0x8d, 0x61, 0xd4
0x2d, 0x95, 0xca, 0x89, 0x5b, 0xcf, 0x91, 0x13, 0xaa, 0x52, 0x60,
0xf8, 0x40, 0x91, 0x7d, 0xde, 0x35, 0xdf, 0x50, 0x8b, 0x6b, 0x6a,
0x25, 0xb5, 0x30, 0x72, 0xc9, 0xcd, 0xd6, 0x71, 0x6a, 0x07, 0xae,
0xc4, 0x14, 0x0a, 0x47, 0xa8, 0x83, 0x62, 0x68, 0x1d, 0xab, 0x99,
0xf6, 0x8a, 0xd8, 0xa6, 0x5b, 0x65, 0xf3, 0x50, 0x29, 0x56, 0x3a,
0x64, 0xca, 0x09, 0xf0, 0x1b, 0x5c, 0x6c, 0x17, 0x25, 0x6e, 0x15,
0x5e, 0xd1, 0xb4, 0xd6, 0xcd, 0xe8, 0xe4, 0x23, 0x25, 0xfb, 0xca,
0x71, 0xc3, 0xc9, 0xda, 0xa9, 0xae, 0x0f, 0xab, 0xcc, 0x96, 0x85,
0x62, 0xa5, 0x64, 0x35, 0x8d, 0xf9, 0x97, 0xe7, 0x59, 0xc4, 0x22,
0x0e, 0x60, 0x4d, 0x49, 0x14, 0x94, 0x38, 0xf0, 0x73, 0x85, 0x99,
0x9f, 0x87, 0xcb, 0xa5, 0xc0, 0x35, 0xa1, 0xb8, 0x3e, 0x5a, 0x8d,
0x9d, 0x4f, 0xf5, 0xb1, 0xb9, 0xcc, 0x91, 0xc6, 0x5e, 0x8f, 0xf5,
0xf8, 0x44, 0x3f, 0x80, 0x57, 0x43, 0x72, 0x58, 0x04, 0xdb, 0x2f,
0x10, 0x57, 0xc8, 0x16, 0x29, 0x9c, 0x45, 0x14, 0x8b, 0x12, 0xcc,
0x05, 0x0e, 0xa0, 0x24, 0x67, 0x61, 0x54, 0x41, 0xf4, 0x39, 0x62,
0x3d, 0x95, 0x9b, 0x57, 0x5c, 0xc2, 0xba, 0x28, 0x71, 0xab, 0x1c,
0xa0, 0x4f, 0x19, 0xec, 0x39, 0xa1, 0x0f, 0x0d, 0xd5, 0xb7, 0x8f,
0x0f, 0xe5, 0x86, 0x1e, 0x34, 0xb9, 0x91, 0x73, 0x2b, 0xb8, 0x47,
0xf1, 0xed, 0xb9, 0x29, 0x78, 0x65, 0x0d, 0x48, 0x1a, 0x6c, 0x0a,
0x4c, 0x7e, 0x8f, 0xe3, 0x64, 0x44, 0x9f, 0x2f, 0xb4, 0x41, 0xde,
0x73, 0xa3, 0xc4, 0xad, 0x72, 0x78, 0x6c, 0x5b, 0x65, 0xd5, 0xb1,
0x9a, 0x82, 0x76, 0x3c, 0x10, 0x9f, 0x0e, 0x94, 0xf2, 0xc9, 0xc7,
0x8d, 0xb0, 0xd3, 0x5c, 0xb9, 0x8d, 0xb0, 0xda, 0xba, 0x2d, 0xb3,
0x9b, 0xad, 0x76, 0x64, 0xc7, 0x0e, 0x8a, 0x86, 0xb9, 0x33, 0xf1,
0x1b, 0x23, 0x32, 0x29, 0xb4, 0x05, 0xe2, 0x0a, 0xf3, 0x0a, 0x3d,
0x24, 0x6b, 0x1f, 0x7d, 0xd3, 0x69, 0xbb, 0x43, 0x9d, 0xf2, 0x8c,
0xde, 0xe7, 0x27, 0x50, 0x46, 0x32, 0x0e, 0x56, 0x92, 0x56, 0xfc,
0x8e, 0xd8, 0x55, 0x2a, 0x9e, 0x82, 0x7c, 0x6f, 0x65, 0x80, 0x5b,
0x02, 0x3f, 0xa7, 0x6c, 0x01, 0x96, 0xeb, 0x2f, 0x0d, 0x65, 0xc1,
0xfb, 0x2e, 0x10, 0x57, 0x38, 0x70, 0xf7, 0x35, 0x3e, 0xff, 0x78,
0x36, 0x8b, 0x58, 0xc4, 0x21, 0xe5, 0x26, 0x27, 0x28, 0xcf, 0x24,
0x11, 0x8b, 0xe0, 0x42, 0xb1, 0x5a, 0x71, 0xc3, 0x20, 0xee, 0x34,
0x46, 0x10, 0x50, 0xdb, 0x72, 0x93, 0xf3, 0xe5, 0x65, 0xc2, 0xce,
0x4a, 0xbe, 0xd6, 0x3d, 0xef, 0xba, 0xde, 0xa4, 0x4d, 0x3d, 0xda,
0x03, 0xaa, 0x52, 0xc6, 0xff, 0x01, 0x7a, 0xb6, 0xa0, 0x3b, 0x9a,
0x05, 0x00, 0x00, 0x78, 0xda, 0xcd, 0x59, 0x6b, 0x6c, 0x14, 0x55,
0x14, 0x9e, 0x53, 0x68, 0xc1, 0x25, 0x44, 0x4d, 0x6d, 0x6b, 0x45,
0xdc, 0x56, 0x24, 0xd1, 0xd4, 0x47, 0xac, 0xba, 0x80, 0x4a, 0x7d,
0xbb, 0x8a, 0xc5, 0x17, 0x8a, 0x29, 0xc1, 0x90, 0x60, 0x15, 0x05,
0x05, 0xb5, 0x06, 0x03, 0xc1, 0xd0, 0x5d, 0x50, 0xa8, 0x4d, 0x48,
0x48, 0x4c, 0x48, 0x10, 0x29, 0x01, 0x49, 0x14, 0xd4, 0xe2, 0x03,
0x83, 0x89, 0xa8, 0xd4, 0x60, 0x78, 0x68, 0x2b, 0x16, 0x30, 0x1a,
0xff, 0x0b, 0xf2, 0xee, 0x2e, 0x28, 0xbe, 0xea, 0xb9, 0x99, 0xb3,
0xd9, 0x33, 0x9f, 0xb3, 0xf7, 0xee, 0xb6, 0xa1, 0x61, 0x92, 0xdb,
0xb9, 0xdf, 0x7e, 0xe7, 0xde, 0xf9, 0xee, 0x99, 0x73, 0xce, 0x9d,
0x99, 0x7a, 0x5e, 0xf0, 0x88, 0x72, 0x6b, 0xe6, 0xd6, 0x23, 0xb8,
0x5c, 0xfa, 0x3f, 0x73, 0x4b, 0x71, 0xab, 0x95, 0xf3, 0x10, 0xe1,
0x9b, 0x94, 0x6d, 0x9a, 0x5b, 0x2b, 0xb7, 0x5f, 0xa4, 0x3f, 0x98,
0xdb, 0xf5, 0xdc, 0x76, 0xc3, 0xfc, 0x3d, 0xc2, 0x9b, 0xa3, 0x44,
0x70, 0x42, 0xce, 0xe3, 0xb9, 0x9d, 0xee, 0xed, 0xed, 0xd5, 0xf6,
0x27, 0x65, 0x2e, 0x2f, 0xc7, 0x7c, 0xa7, 0x1c, 0xfc, 0xef, 0x0e,
0xfe, 0x0f, 0xe0, 0xdf, 0x06, 0xfe, 0xb4, 0x83, 0xff, 0xd3, 0xc1,
0xff, 0xe5, 0xe0, 0xff, 0x76, 0xf0, 0xff, 0x38, 0xf8, 0x7f, 0x1d,
0x7c, 0xaf, 0x83, 0xf7, 0xc8, 0xce, 0x93, 0x83, 0x2f, 0x72, 0xf0,
0x83, 0x1c, 0xfc, 0x60, 0x07, 0x5f, 0xec, 0xe0, 0x4b, 0x1c, 0xfc,
0x10, 0xc5, 0x1b, 0x3c, 0x94, 0xb2, 0xf1, 0x1b, 0x95, 0xd8, 0x8b,
0x08, 0x8e, 0x71, 0x5b, 0xe9, 0xe5, 0x3e, 0xa6, 0x73, 0x3b, 0x87,
0xc7, 0x0f, 0x13, 0x7c, 0x1d, 0xb7, 0xe3, 0x16, 0x7b, 0xc3, 0x1f,
0x73, 0xf0, 0x27, 0x00, 0x1f, 0xb5, 0xd8, 0x1b, 0xbd, 0x11, 0x58,
0x6f, 0x8b, 0xc5, 0x7e, 0x86, 0xac, 0xef, 0x94, 0xe4, 0x94, 0xc1,
0x49, 0x93, 0x13, 0x0a, 0x2f, 0x02, 0x7e, 0xb1, 0xe2, 0x31, 0x1f,
0xc3, 0xfc, 0x31, 0x4c, 0xf9, 0xe3, 0x6c, 0x3f, 0xcc, 0xfa, 0x4a,
0x29, 0xb8, 0xde, 0x0b, 0x00, 0x97, 0x01, 0x2e, 0x07, 0x5c, 0x01,
0xf8, 0x42, 0xc0, 0x95, 0x80, 0x2f, 0x02, 0x3c, 0x02, 0xf0, 0xc5,
0x8c, 0x4f, 0x5a, 0x7c, 0xec, 0x39, 0xe2, 0x67, 0x1b, 0xdc, 0x8f,
0x91, 0x3c, 0x5f, 0xa9, 0xe2, 0x77, 0x60, 0x3e, 0x7b, 0xc1, 0x7c,
0xa8, 0x82, 0x7c, 0xa8, 0xa6, 0x60, 0x3e, 0xec, 0x57, 0xe3, 0x4d,
0x3c, 0x9c, 0x07, 0xd7, 0xef, 0x08, 0x99, 0xff, 0x12, 0xf2, 0x71,
0x44, 0xfa, 0x49, 0xa9, 0xf9, 0xb5, 0x72, 0x1e, 0xa4, 0xec, 0x2f,
0x85, 0x78, 0xfe, 0x09, 0xe6, 0x47, 0xfd, 0xa3, 0x20, 0x9f, 0x49,
0xed, 0x47, 0x37, 0x70, 0x5b, 0x02, 0x7a, 0x8b, 0x15, 0xae, 0x91,
0xfd, 0x4d, 0xc7, 0x83, 0x89, 0xf7, 0xa3, 0x90, 0x0f, 0x29, 0xc1,
0x68, 0x6f, 0xf4, 0xec, 0x82, 0xf9, 0x12, 0x8e, 0x7c, 0xad, 0x05,
0xbd, 0x97, 0x51, 0x50, 0x6f, 0x9b, 0xb2, 0xaf, 0x96, 0xf5, 0xd4,
0x50, 0xd6, 0xbe, 0x06, 0xfc, 0xb3, 0x26, 0xc4, 0xdf, 0x57, 0x89,
0x7d, 0x95, 0xd1, 0xc8, 0xfd, 0x6b, 0x94, 0xff, 0x2f, 0x27, 0x7f,
0x0d, 0xda, 0xff, 0x45, 0x6a, 0x7c, 0x8c, 0x7c, 0x9b, 0x8c, 0xfd,
0x15, 0x0e, 0xfb, 0x31, 0xe4, 0xdb, 0xe8, 0xe7, 0x85, 0x2b, 0x29,
0xfb, 0xbc, 0x60, 0xfa, 0x46, 0x8f, 0x1e, 0x3f, 0x46, 0xed, 0xf7,
0x86, 0x4f, 0xc8, 0xef, 0xb8, 0xbe, 0xa8, 0xf0, 0x3a, 0x1e, 0xd3,
0x50, 0x9f, 0xd7, 0xa9, 0xf5, 0x37, 0xca, 0xfa, 0x2b, 0xe1, 0xf9,
0xe5, 0x6a, 0xca, 0xde, 0xff, 0x51, 0xe0, 0xaf, 0x04, 0xf0, 0xd5,
0xc0, 0x27, 0x81, 0x8f, 0x02, 0xbf, 0x08, 0xf8, 0x91, 0xc0, 0x2f,
0x06, 0x7e, 0x04, 0xf0, 0xe3, 0x29, 0xc8, 0x57, 0x02, 0x7f, 0x0b,
0xf0, 0x15, 0xc0, 0xdf, 0x06, 0x7c, 0x19, 0xf0, 0x77, 0x00, 0x5f,
0x0a, 0xfc, 0x5d, 0xc0, 0x9f, 0x0f, 0x7c, 0x1c, 0xf8, 0x73, 0x43,
0x9e, 0x0f, 0x35, 0x3f, 0x1c, 0xf2, 0xc9, 0xec, 0xaf, 0x07, 0x54,
0x3e, 0x8d, 0x65, 0x7c, 0x50, 0xe1, 0x71, 0x8c, 0x7f, 0x53, 0xf8,
0x46, 0xc6, 0x87, 0x14, 0xbe, 0x89, 0xf1, 0x61, 0x85, 0x6f, 0x66,
0x7c, 0x44, 0xe1, 0x3a, 0x0a, 0xe6, 0xeb, 0xad, 0x8c, 0x8f, 0x29,
0x7c, 0x3b, 0xe3, 0xe3, 0x0a, 0xdf, 0xc9, 0xf8, 0x84, 0xc2, 0x77,
0x33, 0xee, 0x51, 0xfb, 0x5b, 0x4a, 0xd5, 0xde, 0x26, 0xb5, 0x36,
0x7c, 0x9e, 0x4d, 0x4b, 0x7e, 0x8d, 0x86, 0x78, 0x4d, 0xab, 0xfa,
0x53, 0x25, 0xf9, 0x16, 0x51, 0xd8, 0xe4, 0xe2, 0x70, 0x88, 0xbf,
0x4c, 0x0d, 0x1d, 0xcb, 0xad, 0x53, 0xf9, 0xef, 0x1e, 0x19, 0x3f,
0x9a, 0x82, 0xf9, 0x90, 0x0a, 0xc9, 0x1f, 0x73, 0x36, 0xfa, 0x77,
0x5a, 0xf6, 0x0e, 0xa3, 0xe3, 0x5e, 0x4b, 0x3e, 0x63, 0x7d, 0x1b,
0x6a, 0xd6, 0x27, 0x63, 0xee, 0x23, 0x3f, 0xb6, 0xcc, 0x79, 0x02,
0xe5, 0x37, 0xde, 0xd4, 0x5a, 0x63, 0x6b, 0x72, 0xa0, 0x9e, 0x7c,
0xfd, 0xf7, 0x83, 0xbf, 0xea, 0x21, 0xbf, 0xe3, 0xb0, 0xdf, 0x7c,
0x18, 0x52, 0xdf, 0xea, 0x29, 0xab, 0x6f, 0x82, 0x68, 0x4b, 0x4b,
0xbd, 0x49, 0x0b, 0xaf, 0xf5, 0x15, 0x7b, 0xe1, 0xf6, 0x24, 0x7c,
0x42, 0xd9, 0x65, 0xc6, 0x4f, 0x24, 0x7f, 0x3d, 0x13, 0xe9, 0xff,
0xf5, 0x22, 0xf3, 0x1b, 0xf2, 0xa6, 0xfb, 0x00, 0xff, 0x99, 0x4e,
0xd9, 0x7a, 0xd6, 0xec, 0xe5, 0x8e, 0x0f, 0x83, 0x9f, 0xc8, 0x63,
0xbd, 0x8f, 0x42, 0x3d, 0x9f, 0x46, 0xd9, 0xeb, 0x4d, 0x22, 0x9f,
0x9f, 0x2a, 0xfe, 0x6d, 0x04, 0xff, 0x4e, 0x02, 0xff, 0x3e, 0x99,
0xc7, 0xf5, 0x1a, 0x28, 0xb8, 0xff, 0xeb, 0xf9, 0x1e, 0x81, 0xf9,
0x1a, 0xf3, 0x98, 0xef, 0x71, 0x0a, 0xe2, 0x29, 0x0a, 0x3f, 0xc4,
0xfd, 0xc9, 0x0a, 0x3f, 0xcc, 0xfd, 0xc7, 0xd4, 0x7a, 0x27, 0xc3,
0xf5, 0x1f, 0xa4, 0x60, 0x7e, 0x35, 0x40, 0x7e, 0x4d, 0x2b, 0x20,
0xbf, 0xc2, 0xe6, 0x7f, 0x0a, 0xe6, 0x9f, 0xea, 0x98, 0x7f, 0x06,
0xe5, 0x9e, 0x1f, 0x0f, 0x13, 0x7f, 0xcf, 0xb2, 0xfd, 0x4c, 0x0a,
0xc6, 0x5b, 0xe6, 0x79, 0xc8, 0xf0, 0x51, 0xe6, 0x66, 0x49, 0x8e,
0x17, 0xcb, 0xfb, 0x75, 0x52, 0xce, 0xe6, 0x7a, 0x4f, 0x83, 0xde,
0x67, 0x2c, 0xfb, 0x63, 0x54, 0xc6, 0x69, 0xbd, 0x33, 0x95, 0x5e,
0x83, 0x67, 0xa9, 0xe7, 0xc3, 0x71, 0xdc, 0x7e, 0xb5, 0xe8, 0x37,
0xb7, 0xe5, 0xb9, 0x33, 0x10, 0xdf, 0x2f, 0x42, 0x7c, 0x27, 0x29,
0x18, 0x5f, 0x7a, 0xfe, 0xe7, 0xfb, 0x10, 0xcf, 0xf3, 0x2c, 0xf1,
0xfc, 0x42, 0x1f, 0xe2, 0x79, 0xbe, 0xaa, 0x3f, 0xf3, 0xe4, 0x79,
0x76, 0x01, 0xf9, 0x78, 0xbe, 0xe0, 0x57, 0xc8, 0xb7, 0x35, 0xbf,
0x9b, 0xf5, 0x2d, 0x94, 0xfc, 0x34, 0xbf, 0x37, 0x2b, 0x3d, 0xb3,
0xb9, 0xdf, 0xa4, 0xf0, 0x1c, 0xee, 0xbf, 0x44, 0xd9, 0xfa, 0x3e,
0x5b, 0xea, 0xfb, 0x5c, 0xf2, 0xf1, 0x1c, 0xc1, 0x2f, 0x93, 0xef,
0xaf, 0x26, 0xb5, 0x9e, 0x2a, 0xd1, 0xa3, 0xe3, 0x37, 0x49, 0xc1,
0x78, 0x48, 0xa8, 0x78, 0x30, 0xcf, 0x61, 0x5d, 0x90, 0x0f, 0x73,
0xc1, 0x3f, 0xaf, 0xc2, 0x7c, 0x0b, 0x20, 0x1f, 0x92, 0x05, 0xe6,
0x1b, 0xce, 0xff, 0x1a, 0xcc, 0xbf, 0xd0, 0x31, 0x7f, 0x5f, 0xf2,
0x6d, 0xa9, 0x23, 0xdf, 0x5a, 0x2c, 0xf9, 0xb6, 0x84, 0xec, 0xf1,
0x9d, 0x82, 0x7c, 0x5b, 0x0a, 0x7a, 0x5b, 0x40, 0xef, 0x41, 0x8b,
0x5e, 0xb3, 0xde, 0x37, 0xd8, 0xbe, 0x55, 0xe5, 0xc3, 0x0a, 0xee,
0x2f, 0x83, 0xfc, 0x58, 0xae, 0x70, 0x2b, 0xe8, 0x7b, 0x1d, 0xfc,
0xb9, 0x0c, 0xfc, 0xb9, 0xbc, 0x80, 0xfb, 0x15, 0xf6, 0xfe, 0xf2,
0x26, 0x8f, 0x6f, 0x53, 0xf1, 0xba, 0x8a, 0xfb, 0x6b, 0x14, 0x7e,
0x8b, 0xfb, 0x6b, 0x15, 0x5e, 0xcd, 0xfd, 0x75, 0xa0, 0x7f, 0xbd,
0xc2, 0x6d, 0xa0, 0x7f, 0x25, 0xe8, 0x5f, 0x0b, 0xfa, 0xd7, 0xf7,
0x43, 0x7f, 0x26, 0x1e, 0x36, 0x38, 0xe2, 0x61, 0xa3, 0x25, 0x1e,
0xde, 0x2d, 0x30, 0x1e, 0x36, 0x80, 0xde, 0x8d, 0x10, 0x0f, 0x87,
0x1d, 0xfe, 0x7e, 0x0f, 0xde, 0xf7, 0x56, 0x5b, 0xde, 0xdf, 0x0d,
0x7f, 0x08, 0xf8, 0xf7, 0x61, 0xfc, 0x2a, 0xc7, 0xfb, 0xff, 0x07,
0x50, 0x0f, 0xdb, 0xa1, 0x7e, 0xc4, 0x28, 0x58, 0x3f, 0x0e, 0xc0,
0x7c, 0x9b, 0x2c, 0xd7, 0xbb, 0x56, 0xae, 0x57, 0x64, 0x59, 0xef,
0xa6, 0x7e, 0xea, 0xfd, 0x08, 0xf4, 0x7e, 0x0c, 0xfe, 0x6f, 0x87,
0xfd, 0x2f, 0x56, 0xc0, 0xfe, 0x67, 0xec, 0x3f, 0xa1, 0xdc, 0xfe,
0x0e, 0xb3, 0xff, 0x9c, 0xed, 0x37, 0xab, 0x7c, 0xd8, 0xca, 0xfd,
0x4f, 0x55, 0x7d, 0x6f, 0x90, 0x3d, 0x67, 0x8b, 0xec, 0x0f, 0x53,
0xb8, 0x7d, 0xa6, 0xf2, 0x63, 0x0b, 0xc4, 0xdb, 0x17, 0xf0, 0xbd,
0xa0, 0x1b, 0xea, 0xc7, 0x66, 0xd0, 0xb7, 0x17, 0xf4, 0x7c, 0x69,
0xf1, 0x6f, 0xad, 0xf8, 0xb7, 0x44, 0xd9, 0x7f, 0x15, 0xf2, 0x7d,
0x25, 0xed, 0xb8, 0x3f, 0x29, 0xc8, 0x8f, 0xcc, 0x23, 0x72, 0x9d,
0xe2, 0xc3, 0x9e, 0xcf, 0x8d, 0xfd, 0x36, 0xb8, 0x5e, 0x3b, 0xdc,
0xdf, 0x18, 0xec, 0xcf, 0xef, 0x90, 0xfd, 0x7b, 0xd8, 0x8f, 0x80,
0xf7, 0x81, 0xde, 0x1d, 0x3c, 0xbe, 0x43, 0xdd, 0x9f, 0x9d, 0xdc,
0xff, 0x5a, 0xe1, 0x5d, 0xdc, 0xff, 0x06, 0xf0, 0x76, 0x85, 0xe3,
0x5e, 0x70, 0xff, 0xed, 0x80, 0xfa, 0xb5, 0x1d, 0xf4, 0x1e, 0x51,
0xd7, 0x2f, 0x93, 0xf1, 0xbb, 0xe1, 0x7d, 0x45, 0xaf, 0xf7, 0x5b,
0xf0, 0xc7, 0x77, 0xe0, 0x8f, 0xad, 0x10, 0xef, 0x9d, 0x10, 0xef,
0x9d, 0x96, 0x7a, 0x53, 0x9e, 0xe3, 0xfa, 0x45, 0xa0, 0xaf, 0x4b,
0xea, 0x61, 0x9d, 0xf0, 0x78, 0xff, 0xb4, 0x9e, 0xef, 0x07, 0x40,
0x6f, 0x97, 0x43, 0xef, 0x9e, 0x02, 0xf4, 0xfe, 0x30, 0x00, 0x7a,
0xf7, 0x38, 0xf4, 0x76, 0x9f, 0x65, 0x7a, 0xbb, 0x1d, 0x7a, 0xe3,
0x05, 0xe8, 0xdd, 0x3b, 0x00, 0x7a, 0xe3, 0x96, 0xfc, 0xd9, 0x77,
0x06, 0xaf, 0x8f, 0xff, 0x4f, 0xc2, 0x7a, 0x58, 0x21, 0xf5, 0x0e,
0xbf, 0xb7, 0x44, 0xf2, 0x1c, 0x6f, 0xf8, 0xfd, 0x8e, 0xef, 0xdb,
0x6d, 0x8e, 0xfd, 0x31, 0xd6, 0x8f, 0xfa, 0x89, 0xc7, 0x7f, 0x6e,
0x6c, 0x18, 0x4d, 0x42, 0x02, 0x00, 0x00, 0x78, 0xda, 0x8d, 0x97,
0xcb, 0x4b, 0x56, 0x41, 0x18, 0x87, 0xcf, 0x7b, 0x8e, 0x17, 0x22,
0x8a, 0x10, 0x4c, 0x12, 0x5c, 0x04, 0x6e, 0x43, 0xac, 0x4d, 0xd0,
0x2e, 0xdc, 0x44, 0x50, 0xdb, 0xc4, 0xfe, 0x00, 0x5b, 0xb8, 0x09,
0x14, 0xda, 0x76, 0x31, 0xb5, 0xac, 0xd4, 0xee, 0xed, 0x83, 0x5c,
0x25, 0x78, 0x4b, 0xcb, 0xbc, 0x6c, 0x4a, 0x6b, 0xa7, 0xb9, 0x2b,
0xad, 0xec, 0xa2, 0x5d, 0xb5, 0x5a, 0x54, 0x6a, 0xef, 0x77, 0xce,
0x1c, 0xcf, 0x24, 0x33, 0x1f, 0xcf, 0xc0, 0x0b, 0xf3, 0x1e, 0x9e,
0xef, 0xf7, 0x3b, 0x33, 0xf3, 0xce, 0x7c, 0x73, 0x82, 0x80, 0xb5,
0x75, 0x6d, 0x05, 0x9e, 0xe7, 0x76, 0xbe, 0xe6, 0xe1, 0xd6, 0x36,
0x71, 0xab, 0x50, 0xef, 0xaf, 0x87, 0xdb, 0xdc, 0xfe, 0x78, 0x38,
0x31, 0x91, 0xb6, 0xdf, 0x50, 0xef, 0x27, 0xd4, 0xfb, 0x01, 0xb9,
0x15, 0xc8, 0x2d, 0x43, 0xee, 0x3b, 0xe4, 0xbe, 0xc1, 0xf1, 0x7e,
0x85, 0x7a, 0x5f, 0x3c, 0x5c, 0x94, 0xe3, 0x24, 0x23, 0x3f, 0x7b,
0xb8, 0x30, 0xe6, 0xb2, 0xfc, 0x13, 0xf4, 0x5d, 0x82, 0x7a, 0x8b,
0x90, 0xfb, 0x98, 0x87, 0x8b, 0xa2, 0x2c, 0xff, 0x00, 0xc7, 0xfb,
0x1e, 0xfa, 0xbe, 0x83, 0xe3, 0x5d, 0x80, 0x7a, 0x6f, 0xa1, 0xde,
0x1b, 0xb8, 0xdf, 0x5e, 0x43, 0xbd, 0x79, 0xc8, 0xcd, 0x41, 0xdf,
0x57, 0x70, 0x9e, 0x5f, 0x42, 0xdf, 0x59, 0x58, 0xf7, 0x2f, 0xa0,
0xde, 0x0c, 0xe4, 0xa6, 0xe1, 0xba, 0x3d, 0x87, 0xdc, 0x33, 0xe8,
0x3b, 0x05, 0xb9, 0x49, 0xc8, 0x3d, 0x85, 0xef, 0xf7, 0x04, 0x72,
0x13, 0x90, 0x1b, 0x87, 0xdc, 0x18, 0xac, 0x97, 0x51, 0xa8, 0xf7,
0x18, 0xce, 0xcb, 0x08, 0xe4, 0x1e, 0x41, 0xee, 0x21, 0xe4, 0x86,
0x21, 0x37, 0x04, 0xb9, 0x07, 0x90, 0x1b, 0x84, 0xdc, 0x00, 0xe4,
0xfa, 0x21, 0xd7, 0x07, 0xb9, 0x5e, 0xb8, 0xbe, 0x3d, 0x79, 0xf4,
0xac, 0xe3, 0x3e, 0xb8, 0x0f, 0xb9, 0x3b, 0xf0, 0x7c, 0xb9, 0x05,
0xb9, 0x9b, 0x90, 0xbb, 0x01, 0xb9, 0xeb, 0x90, 0xbb, 0x06, 0xb9,
0xab, 0x90, 0xeb, 0x82, 0x5c, 0x27, 0xe4, 0x3a, 0x20, 0x77, 0x05,
0xd6, 0xcb, 0x65, 0x0f, 0x57, 0x98, 0x5b, 0x5f, 0x89, 0xa2, 0x94,
0xbd, 0x04, 0xb9, 0x76, 0xc8, 0x5d, 0xf4, 0x70, 0x05, 0xf1, 0x7d,
0x63, 0x03, 0x0b, 0x2e, 0x78, 0xb8, 0xa2, 0x98, 0xcb, 0x04, 0xdb,
0xf2, 0x9d, 0x7f, 0xd6, 0x05, 0xa6, 0x15, 0xce, 0x4b, 0x4b, 0xbe,
0xfb, 0x90, 0x05, 0x9e, 0x87, 0xfb, 0xa3, 0x19, 0xae, 0xdb, 0x39,
0x78, 0x8e, 0x9f, 0x85, 0x7a, 0x67, 0xe0, 0x38, 0x4e, 0xc3, 0x79,
0xc9, 0xf5, 0x97, 0x35, 0xca, 0xd2, 0x7b, 0xbc, 0xc7, 0x77, 0x9f,
0xc6, 0x16, 0x49, 0x7c, 0x72, 0x6d, 0xa7, 0xb8, 0xf5, 0x6a, 0x34,
0xb6, 0xea, 0x83, 0x12, 0x93, 0xef, 0x96, 0xac, 0x0e, 0xc4, 0x5a,
0xb8, 0x3a, 0x8d, 0x0a, 0xeb, 0x87, 0xd5, 0xe2, 0xf6, 0x3d, 0x6e,
0xb8, 0x62, 0x93, 0x1f, 0xf3, 0xf8, 0x36, 0x6a, 0x54, 0x5a, 0x0f,
0x4e, 0x78, 0xf4, 0x9a, 0x0c, 0x57, 0x69, 0xf2, 0x53, 0xe2, 0xae,
0xab, 0x11, 0x8d, 0x43, 0x92, 0xd4, 0x65, 0x5c, 0x17, 0xe2, 0x3e,
0x77, 0xa7, 0x35, 0x8e, 0x6a, 0xbe, 0xcb, 0xe4, 0x77, 0x25, 0xab,
0x67, 0x89, 0x5b, 0x92, 0xff, 0xd2, 0xa8, 0x97, 0x64, 0xdf, 0xc4,
0xff, 0x27, 0xff, 0xcd, 0x4b, 0xa6, 0x18, 0x6a, 0xaf, 0x41, 0xa3,
0x3c, 0xfd, 0x1e, 0x91, 0x6c, 0xbf, 0x59, 0x72, 0xc1, 0x1e, 0x49,
0xde, 0x29, 0x7d, 0x63, 0x09, 0xdd, 0x75, 0xb5, 0x5f, 0xbb, 0x6d,
0x1a, 0x3b, 0x4c, 0x5e, 0x1e, 0xba, 0xe7, 0xef, 0xa0, 0x26, 0xb7,
0x35, 0xb6, 0x9b, 0xbc, 0x2a, 0x74, 0xfb, 0x1e, 0xd1, 0xce, 0x3d,
0xcb, 0xf7, 0x80, 0xc7, 0xb7, 0x56, 0xbb, 0xbd, 0x96, 0x41, 0x6b,
0xe8, 0x5e, 0x8f, 0x93, 0xca, 0xf4, 0x59, 0x5c, 0xb7, 0x87, 0x6b,
0x34, 0xdc, 0xb6, 0xf4, 0xbb, 0xc5, 0xc3, 0xb5, 0x2b, 0x33, 0xae,
0x51, 0x6a, 0xf2, 0xbd, 0x91, 0x9b, 0x9b, 0x57, 0x66, 0xd6, 0xf2,
0x3d, 0xec, 0xe1, 0xfe, 0x01, 0xaa, 0x8c, 0x68, 0x6c, 0x15, 0x02,
0x00, 0x00, 0x78, 0xda, 0x4d, 0xd3, 0x49, 0x6c, 0x8c, 0x61, 0x1c,
0x80, 0xf1, 0x69, 0x67, 0xa6, 0x3d, 0x88, 0x0b, 0x21, 0x2e, 0x22,
0xd4, 0xbe, 0xd4, 0x5a, 0x8a, 0xe2, 0xa3, 0xd6, 0xb6, 0xf6, 0xaa,
0xda, 0xb5, 0xb5, 0xb5, 0xb4, 0x96, 0x5a, 0x5a, 0x55, 0x0e, 0x52,
0x17, 0x09, 0x07, 0x2e, 0xb8, 0x48, 0x1c, 0x1c, 0x24, 0x48, 0x6f,
0xe2, 0x40, 0x44, 0xc2, 0x01, 0x89, 0x84, 0x1b, 0x11, 0x0e, 0x22,
0x11, 0x71, 0x90, 0x10, 0xe2, 0xe0, 0xf9, 0xfb, 0x9e, 0xa4, 0x6d,
0xe6, 0x99, 0xf9, 0xe5, 0xcd, 0x7f, 0x66, 0xbe, 0x79, 0xfb, 0x7e,
0x99, 0x4c, 0xdf, 0x5f, 0x2e, 0x93, 0x49, 0x46, 0xf1, 0x5a, 0x9f,
0x4d, 0x5d, 0x82, 0xb7, 0xe3, 0x02, 0x3c, 0x1a, 0x37, 0xe2, 0x42,
0x3c, 0x06, 0xb7, 0xe8, 0xb1, 0xb8, 0x1d, 0xf3, 0x48, 0xc6, 0xe1,
0xee, 0x74, 0x3d, 0x13, 0xee, 0xd1, 0xe3, 0xe9, 0xb2, 0x9e, 0x40,
0xd7, 0x9c, 0x9f, 0x88, 0x6f, 0xb9, 0x1e, 0xbe, 0xab, 0x27, 0xd1,
0x43, 0x3d, 0x99, 0x9e, 0x3b, 0x3f, 0x05, 0xbf, 0x75, 0x3d, 0xfc,
0x41, 0x97, 0xd2, 0x57, 0x3d, 0x95, 0x7e, 0x39, 0x3f, 0x0d, 0x67,
0x73, 0xe9, 0x7a, 0x78, 0x80, 0x9e, 0x4e, 0x43, 0xf4, 0x0c, 0x1a,
0x91, 0x4b, 0xe7, 0x67, 0xc6, 0xf5, 0xb9, 0x1e, 0x2e, 0xd5, 0xb3,
0xa8, 0x4c, 0x97, 0x51, 0x45, 0xea, 0x64, 0x36, 0xae, 0xd4, 0x73,
0x70, 0x8d, 0x2e, 0xc7, 0x75, 0x7a, 0x2e, 0x6e, 0xf0, 0xf3, 0xe7,
0xe1, 0x56, 0x3f, 0x27, 0xdc, 0xa5, 0xe7, 0xd3, 0x45, 0x5d, 0x41,
0x37, 0x9c, 0x5f, 0x80, 0xef, 0xb8, 0x1e, 0xee, 0xd5, 0x0b, 0x63,
0x7f, 0xf4, 0x22, 0x7a, 0xea, 0x7c, 0x82, 0x5f, 0xba, 0x1e, 0x7e,
0xa3, 0x17, 0xd3, 0x7b, 0xbd, 0x84, 0x3e, 0x7b, 0x6d, 0x95, 0xf8,
0xbb, 0xef, 0x5d, 0x8a, 0xff, 0x38, 0x13, 0xce, 0xe7, 0x53, 0x2f,
0xa3, 0x41, 0x7a, 0x79, 0xec, 0x55, 0xea, 0x64, 0x45, 0xfc, 0x6f,
0xf4, 0xca, 0xd8, 0x2f, 0xbd, 0x2a, 0xbe, 0x5b, 0x57, 0xe1, 0x6a,
0x5d, 0x8d, 0x6b, 0x75, 0x4d, 0xec, 0x89, 0x5e, 0x1d, 0xd7, 0x5f,
0x98, 0x5e, 0xc3, 0x1a, 0xdc, 0xe6, 0x77, 0x85, 0x3b, 0xf5, 0x5a,
0xba, 0xa0, 0xd7, 0xd1, 0x95, 0x7c, 0x3a, 0xbf, 0x1e, 0xdf, 0x74,
0x3d, 0x7c, 0x4f, 0x6f, 0xa0, 0xc7, 0x7a, 0x23, 0xbd, 0xce, 0xa7,
0xe7, 0xb9, 0x16, 0x7f, 0xf2, 0xbd, 0x9b, 0xf0, 0x37, 0x67, 0xc2,
0xbf, 0x75, 0x1d, 0x15, 0x17, 0xa5, 0xde, 0x1c, 0xe7, 0x24, 0x75,
0x52, 0x8f, 0x4b, 0xf4, 0x96, 0x38, 0x67, 0x7a, 0x2b, 0x2e, 0xd7,
0xdb, 0x62, 0xaf, 0xf5, 0x76, 0x5c, 0x85, 0x79, 0x24, 0x3b, 0xf0,
0x8f, 0x4c, 0xea, 0x9d, 0xbc, 0x8e, 0x2c, 0x48, 0xbd, 0x2b, 0xee,
0x35, 0xbd, 0x1b, 0x0f, 0xd5, 0x0d, 0x71, 0x46, 0x75, 0x23, 0x6e,
0xd6, 0x4d, 0xb1, 0x9f, 0xd9, 0xff, 0xb7, 0x6a, 0xb2, 0x27, 0x7e,
0x1b, 0x8b, 0x5c, 0x76, 0x66, 0x2f, 0x35, 0xe9, 0x7d, 0x71, 0xc6,
0xf4, 0x7e, 0xea, 0xd0, 0x07, 0xe8, 0xbc, 0x6e, 0xa6, 0x4b, 0xba,
0x85, 0xae, 0xea, 0x83, 0x74, 0x5d, 0x1f, 0x8a, 0xbd, 0xed, 0xe7,
0xdb, 0xba, 0x95, 0xee, 0xeb, 0x36, 0x7a, 0xa0, 0x0f, 0xc7, 0x4c,
0xb6, 0xcf, 0xbd, 0xfa, 0x08, 0x3d, 0xd2, 0x47, 0xe9, 0x85, 0x3e,
0x46, 0x4f, 0x8a, 0xfa, 0xfc, 0x4c, 0xb7, 0xd3, 0x2b, 0x7d, 0x3c,
0xee, 0x77, 0x7d, 0x82, 0xde, 0xf5, 0xf3, 0x47, 0x7d, 0x92, 0xbe,
0xe8, 0x53, 0x71, 0x9e, 0x75, 0x07, 0xfd, 0xd4, 0x9d, 0xf4, 0x57,
0x9f, 0x8e, 0xb3, 0x5d, 0x9c, 0xba, 0x8b, 0x06, 0xea, 0x33, 0x34,
0x58, 0x77, 0xd3, 0x30, 0x7d, 0x36, 0xf6, 0x31, 0x97, 0xee, 0xf9,
0x39, 0x9e, 0x86, 0xbb, 0xde, 0x13, 0xe7, 0x1f, 0xff, 0x03, 0x30,
0x83, 0x68, 0xf0, 0xa9, 0x00, 0x00, 0x00, 0x78, 0xda, 0x45, 0xcf,
0xa9, 0x0e, 0x02, 0x31, 0x14, 0x46, 0xe1, 0x42, 0x87, 0x19, 0xf6,
0x7d, 0x7f, 0x06, 0xde, 0x0a, 0x81, 0xc2, 0xe3, 0xf1, 0x28, 0x14,
0x0a, 0x87, 0x25, 0x38, 0x14, 0x09, 0x06, 0x43, 0x70, 0x38, 0x0c,
0x0e, 0x87, 0x43, 0x21, 0xf8, 0x6f, 0xee, 0x49, 0x98, 0xe4, 0xa4,
0x5f, 0x9a, 0xdb, 0x36, 0x13, 0xc2, 0xff, 0xcb, 0xb1, 0x4e, 0x53,
0xb7, 0x35, 0x97, 0xf3, 0xc1, 0x5b, 0xe0, 0xa8, 0x96, 0x72, 0x12,
0xbc, 0x15, 0x2e, 0xa8, 0x35, 0x67, 0xb5, 0x84, 0x4d, 0xea, 0xb3,
0x99, 0xda, 0x72, 0xd6, 0xbc, 0xc3, 0x45, 0xb5, 0xc7, 0x25, 0x75,
0x64, 0xbe, 0x6c, 0x33, 0xd1, 0xf7, 0xcd, 0x07, 0x5c, 0x51, 0x27,
0x5c, 0x55, 0xd7, 0xe8, 0xf3, 0x35, 0x75, 0xe6, 0x1e, 0xf3, 0x05,
0xd7, 0xd5, 0x0d, 0x37, 0xd4, 0x9d, 0xfb, 0x9b, 0xea, 0xc1, 0xbe,
0xf9, 0x89, 0x5b, 0xea, 0x85, 0xdb, 0xea, 0x8d, 0x3b, 0xea, 0x83,
0xbb, 0xea, 0x8b, 0x7b, 0xf6, 0xcf, 0x99, 0xbb, 0x6f, 0x6f, 0xe3,
0x81, 0x9d, 0xc1, 0x43, 0x0b, 0x8f, 0xd4, 0x2c, 0x71, 0x8f, 0xd5,
0x44, 0xfb, 0x3f, 0x74, 0xa0, 0x15, 0x1f, 0x09, 0x02, 0x00, 0x00,
0x78, 0xda, 0xed, 0xd4, 0xb9, 0x4f, 0x14, 0x51, 0x1c, 0xc0, 0xf1,
0x99, 0x5d, 0x54, 0xdc, 0x15, 0x45, 0x90, 0x4b, 0xd1, 0x5d, 0x45,
0x41, 0x0e, 0x01, 0x01, 0x15, 0x45, 0x60, 0x8e, 0x1d, 0x58, 0x05,
0xe4, 0xf0, 0xe0, 0x92, 0x43, 0x41, 0x24, 0x21, 0x44, 0x2b, 0x6d,
0x4c, 0x9c, 0x4e, 0x0b, 0x0a, 0x1b, 0x12, 0xd6, 0x08, 0x21, 0xfc,
0x05, 0x16, 0x5a, 0x00, 0x85, 0x24, 0x92, 0x40, 0x42, 0x62, 0x08,
0x0d, 0xb1, 0x21, 0x5b, 0x42, 0x47, 0x47, 0x63, 0xc1, 0x77, 0xde,
0x3e, 0xc2, 0x61, 0x24, 0x86, 0x20, 0x95, 0x2f, 0xfb, 0xd9, 0x5f,
0x5e, 0xf6, 0x5d, 0xfb, 0x9b, 0xdf, 0x3c, 0x45, 0xf9, 0xdf, 0x0e,
0xba, 0x3d, 0xc0, 0x23, 0x34, 0xe1, 0x21, 0x1a, 0xd1, 0x8c, 0xe7,
0x5b, 0xc6, 0xa8, 0x70, 0xc1, 0x8d, 0x28, 0x1c, 0xc2, 0x61, 0x1c,
0x41, 0x34, 0x8e, 0xc2, 0x03, 0x2f, 0x8e, 0x21, 0x06, 0xc7, 0x71,
0x02, 0xb1, 0x38, 0x89, 0x38, 0xc4, 0xe3, 0x14, 0x12, 0x90, 0x88,
0x24, 0x24, 0x23, 0x65, 0xdb, 0x89, 0xec, 0x72, 0xbe, 0x34, 0x3e,
0xb0, 0xb5, 0xd3, 0x07, 0x78, 0x06, 0x67, 0xaf, 0x33, 0x48, 0xc5,
0x59, 0x9c, 0x83, 0x0f, 0x7e, 0x9c, 0xc7, 0x05, 0xa4, 0xe1, 0x22,
0x2e, 0x21, 0x1d, 0x19, 0xb8, 0x8c, 0x4c, 0x64, 0x21, 0x1b, 0x39,
0xb8, 0x82, 0x5c, 0xe4, 0x21, 0x1f, 0x57, 0x51, 0x80, 0x42, 0x14,
0xe1, 0x1a, 0xae, 0xe3, 0x06, 0x8a, 0x71, 0x13, 0xb7, 0x50, 0x82,
0xdb, 0x28, 0x45, 0x19, 0x64, 0x32, 0x14, 0x1d, 0x06, 0x4c, 0x04,
0x60, 0xa1, 0x02, 0x95, 0x08, 0xe2, 0x0e, 0xee, 0xa2, 0x0a, 0xd5,
0xa8, 0xc1, 0x3d, 0xd4, 0xa2, 0x0e, 0xf5, 0x68, 0xc0, 0x7d, 0x91,
0xcd, 0x7c, 0xdd, 0x23, 0x73, 0xea, 0x95, 0xb9, 0xf0, 0xc9, 0xff,
0x50, 0x28, 0xf7, 0xae, 0x94, 0x73, 0x5a, 0xf1, 0x0c, 0x8f, 0xd1,
0x86, 0x76, 0x74, 0xa0, 0x13, 0x4f, 0xd0, 0x22, 0x7f, 0xef, 0x42,
0x37, 0x7a, 0x76, 0xd4, 0xd7, 0x0b, 0xbc, 0xc6, 0x5b, 0xbc, 0xc3,
0x00, 0x3e, 0x60, 0x10, 0x21, 0x8c, 0xe1, 0x33, 0xbe, 0x62, 0x02,
0xdf, 0xf0, 0x1d, 0x33, 0x98, 0xc7, 0x22, 0xc2, 0x58, 0x91, 0xcf,
0xd8, 0x69, 0xbf, 0xfe, 0xa6, 0xb0, 0x83, 0x9f, 0x2c, 0x65, 0x08,
0xcb, 0x28, 0x1e, 0xb6, 0x94, 0x3a, 0x62, 0x27, 0x7a, 0x31, 0x4f,
0xdf, 0x3f, 0x62, 0x29, 0xef, 0x27, 0xad, 0xcd, 0x09, 0xab, 0xa4,
0xf6, 0x25, 0x6c, 0x3d, 0x40, 0x62, 0x1a, 0xd4, 0xbd, 0xbf, 0x53,
0xaf, 0xd4, 0x8d, 0x3a, 0xde, 0xe0, 0x3c, 0x3a, 0xcd, 0x88, 0x97,
0x75, 0x95, 0x21, 0xeb, 0xa1, 0x44, 0x8c, 0x1e, 0xd5, 0x22, 0x87,
0x98, 0xd2, 0x6a, 0x45, 0x0c, 0x6b, 0xcd, 0x91, 0x65, 0xf4, 0x2e,
0x11, 0x62, 0xf5, 0x7e, 0x11, 0xfd, 0x7a, 0xeb, 0x1f, 0xf6, 0xfb,
0x18, 0x0a, 0x95, 0xed, 0xe7, 0x9d, 0xe0, 0x59, 0x4c, 0xa3, 0x04,
0x67, 0x39, 0xb3, 0xed, 0x94, 0x5c, 0x60, 0x30, 0x92, 0x8b, 0xf2,
0xdf, 0x47, 0xfa, 0x03, 0xff, 0xfa, 0x7e, 0xfa, 0xc1, 0xde, 0x4b,
0xea, 0x7e, 0xac, 0xe4, 0x9c, 0xd5, 0x79, 0xc6, 0x7b, 0x6f, 0x4f,
0x77, 0xf4, 0x6b, 0xb8, 0x90, 0x3a, 0xd0, 0xe7, 0x12, 0x5d, 0xf3,
0x4d, 0x24, 0x52, 0xbe, 0x36, 0xfb, 0x2c, 0x98, 0x43, 0xae, 0xdd,
0x56, 0x8b, 0x63, 0xcc, 0x1a, 0xc2, 0xe6, 0x38, 0xe3, 0xa6, 0x31,
0x87, 0x9f, 0xbb, 0xce, 0xe9, 0x31, 0x15, 0x7b, 0x89, 0x39, 0x53,
0x5c, 0x07, 0x5f, 0x8c, 0x35, 0x31, 0x36, 0x48, 0x7f, 0x94, 0xfe,
0x80, 0xa1, 0xba, 0x45, 0xdf, 0xf0, 0x8a, 0xb8, 0xaa, 0x27, 0x10,
0x7d, 0xc8, 0x74, 0x6f, 0x5f, 0x65, 0x1d, 0x11, 0xb8, 0x62, 0x00
};

File diff suppressed because it is too large Load Diff

View File

@ -5,7 +5,7 @@
int c_nodes;
int c_nonvis;
int c_active_brushes;
vec_t microvolume = 1.0;
vec_t microvolume = 0.5f;
#define PSIDE_FRONT 1
#define PSIDE_BACK 2

View File

@ -343,6 +343,8 @@ void WriteBSPFile( void )
wadfile = FS_Open( va( "maps/%s.bsp", gs_filename ), "wb" );
FS_Write( wadfile, header, sizeof( dheader_t )); // overwritten later
Msg("add collision lump %i\n", dcollisiondatasize );
AddLump( LUMP_ENTITIES, dentdata, entdatasize );
AddLump( LUMP_PLANES, dplanes, numplanes * sizeof( dplanes[0] ));
AddLump( LUMP_VERTEXES, dvertexes, numvertexes * sizeof( dvertexes[0] ));

View File

@ -267,6 +267,8 @@ void ProcessModels (void)
static void AddCollision( void* handle, const void* buffer, size_t size )
{
if((dcollisiondatasize + size) > MAX_MAP_COLLISION )
Sys_Error( "MAX_MAP_COLLISION limit exceeded\n" );
Mem_Copy( dcollision + dcollisiondatasize, (void *)buffer, size );
dcollisiondatasize += size;
}

View File

@ -47,13 +47,6 @@ infoParm_t infoParms[] =
{"slick", SURF_SLICK, CONTENTS_NONE, 0},
{"light", SURF_LIGHT, CONTENTS_NONE, 0},
{"ladder", SURF_NONE, CONTENTS_LADDER, 0},
// drawsurf attributes (matched with Half-Life render modes)
{"texture", SURF_BLEND, CONTENTS_NONE, 0}, // blend surface
{"glow", SURF_GLOW, CONTENTS_NONE, 0}, // glow sprite
{"solid", SURF_ALPHA, CONTENTS_TRANSLUCENT, 0}, // alphatest
{"additive", SURF_ADDITIVE, CONTENTS_NONE, 0}, // additive
{"chrome", SURF_CHROME, CONTENTS_NONE, 0}, // studio chrome
};
/*

View File

@ -167,6 +167,12 @@ void Conv_RunSearch( void )
break;
case GAME_HEXEN2:
case GAME_QUAKE1:
search = FS_Search("*.wad", true );
// make sure, that we stored all files from all wads
for( i = 0; search && i < search->numfilenames; i++ )
AddMask(va("%s/*.mip", search->filenames[i]));
if( search ) Mem_Free( search );
else AddMask( "*.mip" );
AddMask( "maps/*.bsp" ); // Quake1 textures from bsp
AddMask( "sprites/*.spr" ); // Quake1 sprites
AddMask( "sprites/*.spr32" ); // QW 32bit sprites
@ -178,7 +184,6 @@ void Conv_RunSearch( void )
AddMask( "gfx/*.lmp" ); // Quake1 pics
AddMask( "*.sp32");
AddMask( "*.spr" );
AddMask( "*.mip" );
imageflags |= IL_KEEP_8BIT;
write_qscsript = true;
Image_Init( "Quake1", imageflags );

View File

@ -36,6 +36,7 @@
#define CONTENTS_DETAIL 0x08000000 // brushes to be added after vis leafs
#define CONTENTS_TRANSLUCENT 0x10000000 // auto set if any surface has trans
#define CONTENTS_LADDER 0x20000000
#define CONTENTS_TRIGGER 0x40000000 // trigger
#define SURF_LIGHT 0x00000001 // value will hold the light strength
#define SURF_SLICK 0x00000002 // effects game physics
@ -63,6 +64,7 @@ bool Conv_WriteShader( const char *shaderpath, const char *imagepath, rgbdata_t
string qcname, qcpath;
string temp, lumpname;
string wadname, shadername;
int i, lightmap_stage = false;
// write also wadlist.qc for xwad compiler
FS_ExtractFilePath( imagepath, temp );
@ -165,8 +167,12 @@ check_shader:
if(!VectorIsNull( rad )) FS_Printf(f, "\trad_color\t\t%.f %.f %.f\n", rad[0], rad[1], rad[2] );
if( scale ) FS_Printf(f, "\trad_intensity\t%.f\n", scale );
}
if( flags & SURF_WARP )
{
FS_Print( f, "\tsurfaceparm\tnoLightMap\n" );
FS_Print( f, "\ttessSize\t\t64\n\n" );
// server relevant contents
if(contents & CONTENTS_WATER)
FS_Print( f, "\tsurfaceparm\twater\n" );
@ -176,14 +182,28 @@ check_shader:
FS_Print( f, "\tsurfaceparm\tlava\n" );
else FS_Print( f, "\tsurfaceparm\twater\n" );
FS_Print( f, "\tsurfaceparm\twarp\n" );
}
if( flags & SURF_SKY ) FS_Print( f, "\tsurfaceparm\tsky\n" );
FS_Printf( f, "\t{\n\t\tmap\t%s\n", shadername ); // save basemap
if( flags & (SURF_TRANS33|SURF_TRANS66))
{
FS_Print( f, "\t\tblendFunc\tGL_SRC_ALPHA\tGL_ONE_MINUS_SRC_ALPHA\n" );
FS_Print( f, "\t\tAlphaGen\t\tvertex\n" );
}
FS_Print( f, "\t\ttcGen\twarp\n\t}\n" ); // warp
lightmap_stage = false;
}
else if( flags & SURF_SKY ) FS_Print( f, "\tsurfaceparm\tsky\n" );
else if( flags & SURF_HINT ) FS_Print( f, "\tsurfaceparm\thint\n" );
else if( flags & SURF_SKIP ) FS_Print( f, "\tsurfaceparm\tskip\n" );
else if( flags & SURF_MIRROR ) FS_Print( f, "\tsurfaceparm\tmirror\n" );
else if( flags & SURF_TRANS33 ) FS_Print( f, "\tsurfaceparm\tblend\n" );
else if( flags & SURF_TRANS66 ) FS_Print( f, "\tsurfaceparm\tblend\n" );
else if( flags & (SURF_TRANS33|SURF_TRANS66))
{
FS_Print( f, "\tentityMergable\n\n" );
FS_Printf( f, "\t{\n\t\tmap\t%s\n\n", shadername ); // save basemap
FS_Print( f, "\t\tblendFunc\tGL_SRC_ALPHA\tGL_ONE_MINUS_SRC_ALPHA\n" );
FS_Print( f, "\t\tAlphaGen\t\tvertex\n\t}\n" );
lightmap_stage = true;
}
else if( flags & SURF_NODRAW ) FS_Print( f, "\tsurfaceparm\tnull\n" );
if( contents & CONTENTS_CLIP && contents && CONTENTS_PLAYERCLIP )
@ -194,42 +214,48 @@ check_shader:
else if( contents & CONTENTS_ORIGIN ) FS_Print( f, "\tsurfaceparm\torigin\n" );
else if( contents & CONTENTS_TRANSLUCENT ) FS_Print( f, "\tsurfaceparm\tsolid\n" );
else if( contents & CONTENTS_AREAPORTAL ) FS_Print( f, "\tsurfaceparm\tareaportal\n" );
else if( contents & CONTENTS_TRIGGER ) FS_Print( f, "\tsurfaceparm\ttrigger\n" );
else if( contents & CONTENTS_DETAIL ) FS_Print( f, "\tsurfaceparm\tdetail\n" );
if( num_anims )
{
int i;
FS_Printf( f, "\t{\n\t\tAnimFrequency\t%i\n", animcount ); // #frames per second
for( i = 0; i < num_anims; i++ )
FS_Printf( f, "\t\tmap\t\t%s\n", animmap[i] );
FS_Printf( f, "\t}\n" ); // close section
lightmap_stage = true;
}
else if( p->flags & IMAGE_HAS_LUMA && !( flags & SURF_WARP ))
{
FS_Printf( f, "\t{\n\t\tmap\t%s\n\t}\n", shadername );
lightmap_stage = true;
}
if( p->flags & IMAGE_HAS_LUMA )
if( lightmap_stage )
{
FS_Print( f, "\t{\n\t\tmap\t$lightmap\n" ); // lightmap stage
FS_Print( f, "\t\tblendFunc\tfilter\n" );
FS_Print( f, "\t}\n" );
}
if( p->flags & IMAGE_HAS_LUMA )
{
if( num_anims )
{
FS_Printf( f, "\t{\n\t\tmap\t\t$lightmap\n" ); // lightmap stage
FS_Printf( f, "\t\tblendFunc\t\tfilter\n" );
FS_Printf( f, "\t}\n\n" ); // close section
FS_Printf( f, "\t{\n\t\tAnimFrequency\t%i\n", animcount ); // #frames per second
for( i = 0; i < num_anims; i++ )
FS_Printf( f, "\t\tmap\t\t%s_luma\n", animmap[i] ); // anim luma stage
FS_Printf( f, "\t\tblendFunc\t\tadd\n" );
FS_Printf( f, "\t}\n" ); // close section
}
animcount = num_anims = 0; // done
}
else if( p->flags & IMAGE_HAS_LUMA )
{
FS_Printf( f, "\t{\n\t\tmap\t%s\n\t}\n", shadername ); // save basemap
FS_Printf( f, "\t{\n\t\tmap\t\t$lightmap\n" ); // lightmap stage
FS_Printf( f, "\t\tblendFunc\t\tfilter\n" );
FS_Printf( f, "\t}\n" ); // close section
FS_Printf( f, "\t{\n\t\tmap\t%s_luma\n", shadername ); // save luma
FS_Printf( f, "\t\tblendFunc\t\tadd\n" );
FS_Printf( f, "\t}\n" ); // close section
animcount = num_anims = 0; // done
}
else
{
FS_Printf( f, "\t{\n\t\tmap\t%s_luma\n", shadername ); // save luma
FS_Printf( f, "\t\tblendFunc\tadd\n" );
if( flags & SURF_WARP ) FS_Print( f, "\t\ttcGen\twarp\n" );
FS_Printf( f, "\t}\n" ); // close section
}
}
FS_Print( f, "}\n" ); // close shader
@ -313,6 +339,7 @@ void Conv_ShaderGetFlags( const char *imagename, const char *shadername, const c
else if( !com.strnicmp( imagename, "glass", 5 )) *flags |= SURF_TRANS66;
else if( !com.strnicmp( imagename, "mirror", 6 )) *flags |= SURF_MIRROR;
else if( !com.strnicmp( imagename, "portal", 6 )) *flags |= SURF_PORTAL;
else if( com.stristr( imagename, "trigger" )) *contents |= CONTENTS_TRIGGER;
// try to exctract contents and flags directly form mip-name
if( imagename[0] == '!' || imagename[0] == '*' ) *flags |= SURF_WARP; // liquids

View File

@ -10,6 +10,7 @@
#include "utils.h"
string wadoutname;
bool wad_append = false;
script_t *wadqc = NULL;
wfile_t *handle = NULL;
string lumpname;
@ -130,7 +131,9 @@ byte Mip_AveragePixels( int count )
void Wad3_NewWad( void )
{
handle = WAD_Open( wadoutname, "wb" );
if( wad_append )
handle = WAD_Open( wadoutname, "a+" );
else handle = WAD_Open( wadoutname, "wb" );
if( !handle ) Sys_Break( "Wad3_NewWad: can't create %s\n", wadoutname );
}
@ -144,7 +147,7 @@ void Wad3_AddLump( const byte *buffer, size_t lumpsize, int lump_type, bool comp
int result;
if( !handle ) Wad3_NewWad(); // create wad file
result = WAD_Write( handle, lumpname, buffer, lumpsize, lump_type, ( compress ? CMP_ZLIB : CMP_NONE ));
if( result != -1 ) Msg("Add %s\t#%i\n", lumpname, result ); // FIXME: align message
if( result != -1 ) Msg("Add %s\t#%3i\n", lumpname, result ); // FIXME: align message
}
/*
@ -167,10 +170,11 @@ void Cmd_GrabMip( void )
Com_ReadString( wadqc, SC_PARSE_GENERIC, lumpname );
// load mip image or replaced with error.bmp
image = FS_LoadImage( lumpname, error_bmp, error_bmp_size );
// load mip image
image = FS_LoadImage( lumpname, NULL, 0 );
if( !image )
{
Com_SkipRestOfLine( wadqc );
// no fatal error, just ignore this image for adding into wad-archive
MsgDev( D_ERROR, "Cmd_LoadMip: unable to loading %s\n", lumpname );
return;
@ -316,7 +320,7 @@ void Cmd_GrabMip( void )
plump += 768;
// write out and release intermediate buffers
Wad3_AddLump( lump, plump_size, TYPE_MIPTEX2, false );
Wad3_AddLump( lump, plump_size, TYPE_MIPTEX, false );
}
else MsgDev( D_WARN, "lump %s have invalid size, ignore\n", lumpname );
FS_FreeImage( image );
@ -339,10 +343,11 @@ void Cmd_GrabPic( void )
Com_ReadString( wadqc, SC_PARSE_GENERIC, lumpname );
// load mip image or replaced with error.bmp
image = FS_LoadImage( lumpname, error_bmp, error_bmp_size );
// load lmp image
image = FS_LoadImage( lumpname, NULL, 0 );
if( !image )
{
Com_SkipRestOfLine( wadqc );
// no fatal error, just ignore this image for adding into wad-archive
MsgDev( D_ERROR, "Cmd_LoadPic: unable to loading %s\n", lumpname );
return;
@ -415,6 +420,7 @@ void Cmd_GrabScript( void )
if( !lump || !plump_size )
{
Com_SkipRestOfLine( wadqc );
// no fatal error, just ignore this image for adding into wad-archive
MsgDev( D_ERROR, "Cmd_LoadScript: unable to loading %s\n", lumpname );
return;
@ -445,6 +451,7 @@ void Cmd_GrabProgs( void )
if( !lump || !plump_size || plump_size < sizeof(dprograms_t))
{
Com_SkipRestOfLine( wadqc );
// no fatal error, just ignore this image for adding into wad-archive
MsgDev( D_ERROR, "Cmd_LoadProgs: unable to loading %s\n", lumpname );
return;
@ -467,10 +474,15 @@ void Cmd_GrabProgs( void )
void Cmd_WadName( void )
{
Com_ReadString( wadqc, SC_PARSE_GENERIC, wadoutname );
string parm;
Com_ReadString( wadqc, SC_ALLOW_PATHNAMES2, wadoutname );
FS_StripExtension( wadoutname );
FS_DefaultExtension( wadoutname, ".wad" );
if( Com_ReadString( wadqc, SC_ALLOW_PATHNAMES2, parm ))
if( !com.stricmp( parm, "append" )) wad_append = true;
}
/*

View File

@ -67,5 +67,5 @@ if exist vsound\vsound.plg del /f /q vsound\vsound.plg
echo Build succeeded!
echo Please wait. Xash is now loading
cd D:\Xash3D\
quake.exe -game tmpQuArK -log -debug -dev 3 +map start
quake.exe -game tmpQuArK -log -debug -dev 3 +map qctest
:done

View File

@ -40,14 +40,8 @@ void CL_DeltaEntity( sizebuf_t *msg, frame_t *frame, int newnum, entity_state_t
ent = PRVM_EDICT_NUM( newnum );
state = &cl_parse_entities[cl.parse_entities & (MAX_PARSE_ENTITIES-1)];
if( unchanged )
{
*state = *old;
}
else
{
MSG_ReadDeltaEntity( msg, old, state, newnum );
}
if( unchanged ) *state = *old;
else MSG_ReadDeltaEntity( msg, old, state, newnum );
if( state->number == -1 ) return; // entity was delta removed
@ -66,7 +60,7 @@ void CL_DeltaEntity( sizebuf_t *msg, frame_t *frame, int newnum, entity_state_t
{
// duplicate the current state so lerping doesn't hurt anything
ent->priv.cl->prev = *state;
VectorCopy (state->old_origin, ent->priv.cl->prev.origin);
VectorCopy( state->old_origin, ent->priv.cl->prev.origin );
}
else
{ // shuffle the last state to previous

View File

@ -732,12 +732,12 @@ void CL_PrepVideo( void )
SCR_UpdateScreen();
}
// setup sky shader
// setup default sky shader or custom skybox from progs
re->RegisterShader( cl.configstrings[CS_SKYNAME], SHADER_SKY );
Cvar_SetValue("scr_loading", 100.0f ); // all done
re->EndRegistration (); // the render can now free unneeded stuff
Con_ClearNotify(); // clear any lines of console text
re->EndRegistration(); // the render can now free unneeded stuff
Con_ClearNotify(); // clear any lines of console text
SCR_UpdateScreen();
cl.video_prepped = true;
cl.force_refdef = true;

View File

@ -63,7 +63,7 @@ void V_TestEntities( void )
float f, r;
entity_state_t ent;
memset( &ent, 0, sizeof(entity_state_t));
Mem_Set( &ent, 0, sizeof( entity_state_t ));
V_ClearScene();
for( i = 0; i < 32; i++ )
@ -169,7 +169,7 @@ void V_RenderView( void )
cl.refdef.vieworg[1] += 1.0 / 32;
cl.refdef.vieworg[2] += 1.0 / 32;
Mem_Copy( &cl.refdef.rect, &scr_vrect, sizeof(vrect_t));
Mem_Copy( &cl.refdef.rect, &scr_vrect, sizeof( vrect_t ));
cl.refdef.areabits = cl.frame.areabits;
cl.refdef.rdflags = cl.frame.ps.renderfx;

77
engine/engine.plg Normal file
View File

@ -0,0 +1,77 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: engine - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\DOCUME~1\ÀÄÌÈÍÈ~1.9CC\LOCALS~1\Temp\RSP34F7.tmp" with contents
[
/nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "./" /I "common" /I "server" /I "client" /I "../public" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR"..\temp\engine\!debug/" /Fo"..\temp\engine\!debug/" /Fd"..\temp\engine\!debug/" /FD /c
"D:\Xash3D\src_main\engine\server\sv_cmds.c"
"D:\Xash3D\src_main\engine\server\sv_progs.c"
]
Creating command line "cl.exe @"C:\DOCUME~1\ÀÄÌÈÍÈ~1.9CC\LOCALS~1\Temp\RSP34F7.tmp""
Creating temporary file "C:\DOCUME~1\ÀÄÌÈÍÈ~1.9CC\LOCALS~1\Temp\RSP34F8.tmp" with contents
[
user32.lib msvcrtd.lib /nologo /subsystem:windows /dll /incremental:yes /pdb:"..\temp\engine\!debug/engine.pdb" /debug /machine:I386 /nodefaultlib:"msvcrt.lib" /out:"..\temp\engine\!debug/engine.dll" /implib:"..\temp\engine\!debug/engine.lib" /pdbtype:sept
"\Xash3D\src_main\temp\engine\!debug\cinematic.obj"
"\Xash3D\src_main\temp\engine\!debug\cl_cmds.obj"
"\Xash3D\src_main\temp\engine\!debug\cl_demo.obj"
"\Xash3D\src_main\temp\engine\!debug\cl_frame.obj"
"\Xash3D\src_main\temp\engine\!debug\cl_fx.obj"
"\Xash3D\src_main\temp\engine\!debug\cl_input.obj"
"\Xash3D\src_main\temp\engine\!debug\cl_main.obj"
"\Xash3D\src_main\temp\engine\!debug\cl_parse.obj"
"\Xash3D\src_main\temp\engine\!debug\cl_pred.obj"
"\Xash3D\src_main\temp\engine\!debug\cl_progs.obj"
"\Xash3D\src_main\temp\engine\!debug\cl_scrn.obj"
"\Xash3D\src_main\temp\engine\!debug\cl_tent.obj"
"\Xash3D\src_main\temp\engine\!debug\cl_view.obj"
"\Xash3D\src_main\temp\engine\!debug\con_keys.obj"
"\Xash3D\src_main\temp\engine\!debug\con_main.obj"
"\Xash3D\src_main\temp\engine\!debug\con_utils.obj"
"\Xash3D\src_main\temp\engine\!debug\engfuncs.obj"
"\Xash3D\src_main\temp\engine\!debug\engine.obj"
"\Xash3D\src_main\temp\engine\!debug\host.obj"
"\Xash3D\src_main\temp\engine\!debug\infostring.obj"
"\Xash3D\src_main\temp\engine\!debug\input.obj"
"\Xash3D\src_main\temp\engine\!debug\menu.obj"
"\Xash3D\src_main\temp\engine\!debug\net_chan.obj"
"\Xash3D\src_main\temp\engine\!debug\net_huff.obj"
"\Xash3D\src_main\temp\engine\!debug\net_msg.obj"
"\Xash3D\src_main\temp\engine\!debug\sv_client.obj"
"\Xash3D\src_main\temp\engine\!debug\sv_cmds.obj"
"\Xash3D\src_main\temp\engine\!debug\sv_frame.obj"
"\Xash3D\src_main\temp\engine\!debug\sv_init.obj"
"\Xash3D\src_main\temp\engine\!debug\sv_main.obj"
"\Xash3D\src_main\temp\engine\!debug\sv_move.obj"
"\Xash3D\src_main\temp\engine\!debug\sv_phys.obj"
"\Xash3D\src_main\temp\engine\!debug\sv_progs.obj"
"\Xash3D\src_main\temp\engine\!debug\sv_spawn.obj"
"\Xash3D\src_main\temp\engine\!debug\sv_world.obj"
]
Creating command line "link.exe @"C:\DOCUME~1\ÀÄÌÈÍÈ~1.9CC\LOCALS~1\Temp\RSP34F8.tmp""
Creating temporary file "C:\DOCUME~1\ÀÄÌÈÍÈ~1.9CC\LOCALS~1\Temp\RSP34F9.bat" with contents
[
@echo off
copy \Xash3D\src_main\temp\engine\!debug\engine.dll "D:\Xash3D\bin\engine.dll"
]
Creating command line ""C:\DOCUME~1\ÀÄÌÈÍÈ~1.9CC\LOCALS~1\Temp\RSP34F9.bat""
Compiling...
sv_cmds.c
sv_progs.c
Generating Code...
Linking...
<h3>Output Window</h3>
Performing Custom Build Step on \Xash3D\src_main\temp\engine\!debug\engine.dll
‘ª®¯¨à®¢ ­® ä ©«®¢: 1.
<h3>Results</h3>
engine.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

View File

@ -26,10 +26,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//=============================================================================
#define MAX_MASTERS 8 // max recipients for heartbeat packets
#define AREA_SOLID 1
#define AREA_TRIGGERS 2
#define MAX_MASTERS 8 // max recipients for heartbeat packets
#define LATENCY_COUNTS 16
#define MAX_ENT_CLUSTERS 16
#define DF_NO_FRIENDLY_FIRE 0x00000001 //FIXME: move to server.dat
#define DF_NO_FRIENDLY_FIRE 0x00000001 // FIXME: move to server.dat
// classic quake flags
#define SPAWNFLAG_NOT_EASY 0x00000100
@ -37,20 +40,20 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define SPAWNFLAG_NOT_HARD 0x00000400
#define SPAWNFLAG_NOT_DEATHMATCH 0x00000800
#define AI_FLY (1<<0) // monster is flying
#define AI_SWIM (1<<1) // swimming monster
#define AI_ONGROUND (1<<2) // monster is onground
#define AI_PARTIALONGROUND (1<<3) // monster is partially onground
#define AI_GODMODE (1<<4) // monster don't give damage at all
#define AI_NOTARGET (1<<5) // monster will no searching enemy's
#define AI_NOSTEP (1<<6) // Lazarus stuff
#define AI_DUCKED (1<<7) // monster (or player) is ducked
#define AI_JUMPING (1<<8) // monster (or player) is jumping
#define AI_FROZEN (1<<9) // stop moving, but continue thinking
#define AI_ACTOR (1<<10) // disable ai for actor
#define AI_DRIVER (1<<11) // npc or player driving vehcicle or train
#define AI_SPECTATOR (1<<12) // spectator mode for clients
#define AI_WATERJUMP (1<<13) // npc or player take out of water
#define AI_FLY BIT(0) // monster is flying
#define AI_SWIM BIT(1) // swimming monster
#define AI_ONGROUND BIT(2) // monster is onground
#define AI_PARTIALONGROUND BIT(3) // monster is partially onground
#define AI_GODMODE BIT(4) // monster don't give damage at all
#define AI_NOTARGET BIT(5) // monster will no searching enemy's
#define AI_NOSTEP BIT(6) // Lazarus stuff
#define AI_DUCKED BIT(7) // monster (or player) is ducked
#define AI_JUMPING BIT(8) // monster (or player) is jumping
#define AI_FROZEN BIT(9) // stop moving, but continue thinking
#define AI_ACTOR BIT(10) // disable ai for actor
#define AI_DRIVER BIT(11) // npc or player driving vehcicle or train
#define AI_SPECTATOR BIT(12) // spectator mode for clients
#define AI_WATERJUMP BIT(13) // npc or player take out of water
typedef enum
{
@ -120,7 +123,7 @@ typedef struct sv_client_s
vec3_t fix_angles; // q1 legacy
bool fixangle;
// commands exhaust it, assume time cheating
int ping;
int rate;
int surpressCount; // number of messages rate supressed
@ -150,14 +153,13 @@ typedef struct sv_client_s
netchan_t netchan;
} sv_client_t;
typedef struct worldsector_s
// link_t is only used for entity area links now
typedef struct link_s
{
int axis; // -1 = leaf node
float dist;
struct worldsector_s *children[2];
sv_edict_t *entities;
} worldsector_t;
struct link_s *prev;
struct link_s *next;
int entnum; // PRVM_EDICT_NUM
} link_t;
struct sv_edict_s
{
@ -166,11 +168,10 @@ struct sv_edict_s
float freetime; // sv.time when the object was freed
// sv_private_edict_t
worldsector_t *worldsector; // member of current wolrdsector
struct sv_edict_s *nextedict; // next edict in world sector
link_t area; // linked to a division node or leaf
struct sv_client_s *client; // filled for player ents
int clipmask; // trace info
int lastcluster; // unused if num_clusters != -1
int headnode; // unused if num_clusters != -1
int linkcount;
int num_clusters; // if -1, use headnode instead
int clusternums[MAX_ENT_CLUSTERS];
@ -221,7 +222,7 @@ typedef struct
dword realtime; // always increasing, no clamping, etc
dword timeleft;
string mapcmd; // ie: *intro.cin+base
string mapcmd; // ie: *intro.cin+base
string comment; // map name, e.t.c.
int spawncount; // incremented each server start
@ -344,7 +345,6 @@ void SV_ConnectionlessPacket( netadr_t from, sizebuf_t *msg );
//
void SV_Status_f( void );
void SV_Newgame_f( void );
void SV_SectorList_f( void );
//
// sv_ents.c
@ -412,7 +412,7 @@ void SV_LinkEdict (edict_t *ent);
// sets ent->leafnums[] for pvs determination even if the entity
// is not solid
int SV_AreaEdicts( const vec3_t mins, const vec3_t maxs, edict_t **list, int maxcount );
int SV_AreaEdicts( const vec3_t mins, const vec3_t maxs, edict_t **list, int maxcount, int areatype );
// fills in a table of edict pointers with edicts that have bounding boxes
// that intersect the given area. It is possible for a non-axial bmodel
// to be returned that doesn't actually intersect the area on an exact

View File

@ -198,9 +198,9 @@ void SV_Map_f( void )
}
com.snprintf( filename, MAX_STRING, "%s.bsp", Cmd_Argv(1));
if(!FS_FileExists(va("maps/%s", filename )))
if( !FS_FileExists( va("maps/%s", filename )))
{
Msg("Can't loading %s\n", filename );
Msg( "Can't loading %s\n", filename );
return;
}
@ -524,27 +524,26 @@ SV_InitOperatorCommands
*/
void SV_InitOperatorCommands( void )
{
Cmd_AddCommand ("heartbeat", SV_Heartbeat_f, "send a heartbeat to the master server" );
Cmd_AddCommand ("kick", SV_Kick_f, "kick a player off the server by number or name" );
Cmd_AddCommand ("status", SV_Status_f, "print server status information" );
Cmd_AddCommand ("serverinfo", SV_ServerInfo_f, "print server settings" );
Cmd_AddCommand ("clientinfo", SV_ClientInfo_f, "print user infostring (player num required)" );
Cmd_AddCommand( "heartbeat", SV_Heartbeat_f, "send a heartbeat to the master server" );
Cmd_AddCommand( "kick", SV_Kick_f, "kick a player off the server by number or name" );
Cmd_AddCommand( "status", SV_Status_f, "print server status information" );
Cmd_AddCommand( "serverinfo", SV_ServerInfo_f, "print server settings" );
Cmd_AddCommand( "clientinfo", SV_ClientInfo_f, "print user infostring (player num required)" );
Cmd_AddCommand("map", SV_Map_f, "start new level" );
Cmd_AddCommand("newgame", SV_Newgame_f, "begin new game" );
Cmd_AddCommand("changelevel", SV_ChangeLevel_f, "changing level" );
Cmd_AddCommand("restart", SV_Restart_f, "restarting current level" );
Cmd_AddCommand("sectorlist", SV_SectorList_f, "display pvs sectors" );
Cmd_AddCommand( "map", SV_Map_f, "start new level" );
Cmd_AddCommand( "newgame", SV_Newgame_f, "begin new game" );
Cmd_AddCommand( "changelevel", SV_ChangeLevel_f, "changing level" );
Cmd_AddCommand( "restart", SV_Restart_f, "restarting current level" );
if( host.type == HOST_DEDICATED )
{
Cmd_AddCommand ("say", SV_ConSay_f, "send a chat message to everyone on the server" );
Cmd_AddCommand("setmaster", SV_SetMaster_f, "set ip address for dedicated server" );
Cmd_AddCommand( "say", SV_ConSay_f, "send a chat message to everyone on the server" );
Cmd_AddCommand( "setmaster", SV_SetMaster_f, "set ip address for dedicated server" );
}
Cmd_AddCommand ("save", SV_Save_f, "save the game to a file");
Cmd_AddCommand ("load", SV_Load_f, "load a saved game file" );
Cmd_AddCommand ("killserver", SV_KillServer_f, "shutdown current server" );
Cmd_AddCommand( "save", SV_Save_f, "save the game to a file" );
Cmd_AddCommand( "load", SV_Load_f, "load a saved game file" );
Cmd_AddCommand( "killserver", SV_KillServer_f, "shutdown current server" );
}
void SV_KillOperatorCommands( void )

View File

@ -13,9 +13,8 @@ typedef struct
int entities[MAX_VISIBLE_PACKET];
} sv_ents_t;
static byte *clientpvs;
static byte *clientphs;
static byte *bitvector;
static byte *clientpvs; // FatPVS
static byte *clientphs; // ClientPHS
int c_fullsend;
@ -186,9 +185,10 @@ static void SV_AddEntitiesToPacket( vec3_t origin, client_frame_t *frame, sv_ent
edict_t *ent;
sv_edict_t *svent;
int leafnum;
byte *clientpvs;
byte *clientphs;
byte *bitvector;
int clientarea, clientcluster;
int clientarea;
int clientcluster;
bool force = false;
// during an error shutdown message we may need to transmit
@ -196,7 +196,7 @@ static void SV_AddEntitiesToPacket( vec3_t origin, client_frame_t *frame, sv_ent
// specfically check for it
if( !sv.state ) return;
bitvector = pe->FatPVS( origin, portal );
clientpvs = pe->FatPVS( origin, portal );
leafnum = pe->PointLeafnum( origin );
clientarea = pe->LeafArea( leafnum );
@ -204,9 +204,9 @@ static void SV_AddEntitiesToPacket( vec3_t origin, client_frame_t *frame, sv_ent
// calculate the visible areas
frame->areabits_size = pe->WriteAreaBits( frame->areabits, clientarea, portal );
clientpvs = pe->ClusterPVS( clientcluster );
clientphs = pe->ClusterPHS( clientcluster );
for( e = 0; e < prog->num_edicts; e++ )
for( e = 1; e < prog->num_edicts; e++ )
{
ent = PRVM_EDICT_NUM( e );
force = false; // clear forceflag
@ -220,7 +220,7 @@ static void SV_AddEntitiesToPacket( vec3_t origin, client_frame_t *frame, sv_ent
// NOTE: client index on client expected that entity will be valid
if( sv_newprotocol->integer && ent->priv.sv->s.ed_type == ED_CLIENT )
force = true;
// never send entities that aren't linked in
if( !ent->priv.sv->linked && !force ) continue;
@ -235,56 +235,54 @@ static void SV_AddEntitiesToPacket( vec3_t origin, client_frame_t *frame, sv_ent
// don't double add an entity through portals
if( svent->framenum == sv.net_framenum ) continue;
// ignore if not touching a PV leaf check area
if( !pe->AreasConnected( clientarea, ent->priv.sv->areanum ))
if( !force )
{
// doors can legally straddle two areas, so
// we may need to check another one
if( !pe->AreasConnected( clientarea, ent->priv.sv->areanum2 ))
continue; // blocked by a door
}
// bitvector = clientpvs;
// check individual leafs
if( !svent->num_clusters && !force ) continue;
for( i = l = 0; i < svent->num_clusters && !force; i++ )
{
l = svent->clusternums[i];
if( bitvector[l>>3] & (1<<(l & 7)))
break;
}
// if we haven't found it to be visible,
// check overflow clusters that coudln't be stored
if( !force && i == svent->num_clusters )
{
if( svent->lastcluster )
// ignore if not touching a PV leaf check area
if( !pe->AreasConnected( clientarea, ent->priv.sv->areanum ))
{
for( ; l <= svent->lastcluster; l++ )
// doors can legally straddle two areas, so
// we may need to check another one
if( !pe->AreasConnected( clientarea, ent->priv.sv->areanum2 ))
continue; // blocked by a door
}
}
if( svent->s.ed_type == ED_AMBIENT )
bitvector = clientphs;
else bitvector = clientpvs;
if( !force )
{
// check individual leafs
if( svent->num_clusters == -1 )
{
// too many leafs for individual check, go by headnode
if( !pe->HeadnodeVisible( svent->headnode, bitvector ))
continue;
}
else
{
// check individual leafs
for( i = 0; i < svent->num_clusters; i++ )
{
l = svent->clusternums[i];
if( bitvector[l>>3] & (1<<(l & 7)))
break;
}
if( l == svent->lastcluster )
if( i == ent->priv.sv->num_clusters )
continue; // not visible
}
else continue;
}
if( ent->priv.sv->s.ed_type == ED_AMBIENT )
{
// don't send sounds if they will be attenuated away
vec3_t delta, entorigin;
float len;
if(VectorIsNull( ent->progs.sv->origin ))
{
// don't send sounds if they will be attenuated away
if( VectorIsNull( ent->progs.sv->origin ))
VectorAverage( ent->progs.sv->mins, ent->progs.sv->maxs, entorigin );
}
else
{
VectorCopy( ent->progs.sv->origin, entorigin );
}
else VectorCopy( ent->progs.sv->origin, entorigin );
VectorSubtract( origin, entorigin, delta );
len = VectorLength( delta );
@ -402,7 +400,7 @@ void SV_BuildClientFrame( sv_client_t *cl )
// clear everything in this snapshot
frame_ents.num_entities = c_fullsend = 0;
memset( frame->areabits, 0, sizeof( frame->areabits ));
Mem_Set( frame->areabits, 0, sizeof( frame->areabits ));
if( !clent->priv.sv->client ) return; // not in game yet
// find the client's PVS

View File

@ -174,6 +174,7 @@ void SV_SpawnServer( const char *server, const char *savename )
com.sprintf( sv.configstrings[CS_MODELS+1], "maps/%s", server );
sv.worldmodel = sv.models[1] = pe->BeginRegistration( sv.configstrings[CS_MODELS+1], false, &checksum );
com.sprintf( sv.configstrings[CS_MAPCHECKSUM], "%i", checksum );
com.strncpy( sv.configstrings[CS_SKYNAME], "<skybox>", 64 );
// clear physics interaction links
SV_ClearWorld();

View File

@ -118,7 +118,7 @@ trace_t SV_Trace( const vec3_t start, const vec3_t mins, const vec3_t maxs, cons
// clip to entities
// because this uses SV_AreaEdicts, we know all entity boxes overlap
// the clip region, so we can skip culling checks in the loop below
numtouchedicts = SV_AreaEdicts( clipboxmins, clipboxmaxs, touchedicts, host.max_edicts );
numtouchedicts = SV_AreaEdicts( clipboxmins, clipboxmaxs, touchedicts, host.max_edicts, AREA_SOLID );
if( numtouchedicts > host.max_edicts )
{
// this never happens
@ -185,7 +185,7 @@ int SV_PointContents( const vec3_t point )
contents = sv.worldmodel->PointContents( point, sv.worldmodel );
// get list of entities at this point
numtouchedicts = SV_AreaEdicts( point, point, touchedicts, host.max_edicts );
numtouchedicts = SV_AreaEdicts( point, point, touchedicts, host.max_edicts, AREA_SOLID );
if( numtouchedicts > host.max_edicts )
{
// this never happens
@ -395,7 +395,7 @@ void SV_TouchTriggers( edict_t *ent )
if(!((int)ent->progs.sv->flags & FL_CLIENT) && (ent->progs.sv->health <= 0))
return;
num = SV_AreaEdicts( ent->progs.sv->absmin, ent->progs.sv->absmax, touch, host.max_edicts );
num = SV_AreaEdicts( ent->progs.sv->absmin, ent->progs.sv->absmax, touch, host.max_edicts, AREA_TRIGGERS );
PRVM_PUSH_GLOBALS;
@ -784,7 +784,7 @@ void SV_PushMove( edict_t *pusher, float movetime )
// see if any solid entities are inside the final position
num_moved = 0;
numcheckentities = SV_AreaEdicts( mins, maxs, checkentities, MAX_EDICTS );
numcheckentities = SV_AreaEdicts( mins, maxs, checkentities, MAX_EDICTS, AREA_SOLID );
for( e = 0; e < numcheckentities; e++ )
{
edict_t *check = checkentities[e];

View File

@ -1,23 +1,7 @@
/*
Copyright (C) 1997-2001 Id Software, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
// world.c -- world query functions
//=======================================================================
// Copyright XashXT Group 2008 ©
// sv_world.c - world query functions
//=======================================================================
#include "common.h"
#include "server.h"
@ -26,17 +10,24 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
/*
===============================================================================
ENTITY CHECKING
ENTITY AREA CHECKING
To avoid linearly searching through lists of entities during environment testing,
the world is carved up with an evenly spaced, axially aligned bsp tree. Entities
are kept in chains either at the final leafs, or at the first node that splits
them, which prevents having to deal with multiple fragments of a single entity.
FIXME: this use of "area" is different from the bsp file use
===============================================================================
*/
#define AREA_DEPTH 4
#define AREA_NODES 64
#define MAX_TOTAL_ENT_LEAFS 128
#define EDICT_FROM_AREA( l ) PRVM_EDICT_NUM( l->entnum )
#define MAX_TOTAL_ENT_LEAFS 128
#define AREA_NODES 32
#define AREA_DEPTH 4
typedef struct areanode_s
{
int axis; // -1 = leaf node
float dist;
struct areanode_s *children[2];
link_t trigger_edicts;
link_t solid_edicts;
} areanode_t;
typedef struct area_s
{
@ -48,44 +39,69 @@ typedef struct area_s
int type;
} area_t;
worldsector_t sv_worldsectors[AREA_NODES];
int sv_numworldsectors;
areanode_t sv_areanodes[AREA_NODES];
int sv_numareanodes;
/*
===============
SV_SectorList_f
SV_ClearLink
SV_ClearLink is used for new headnodes
===============
*/
void SV_SectorList_f( void )
void SV_ClearLink( link_t *l )
{
int i, c;
worldsector_t *sec;
sv_edict_t *ent;
for ( i = 0; i < sv_numworldsectors; i++ )
{
sec = &sv_worldsectors[i], c = 0;
for( ent = sec->entities; ent; ent = ent->nextedict ) c++;
if( c ) Msg( "sector %i: %i entities\n", i, c );
}
l->prev = l->next = l;
}
/*
===============
SV_CreateworldSector
SV_RemoveLink
Builds a uniformly subdivided tree for the given world size
remove link from chain
===============
*/
worldsector_t *SV_CreateWorldSector( int depth, vec3_t mins, vec3_t maxs )
void SV_RemoveLink( link_t *l )
{
worldsector_t *anode;
l->next->prev = l->prev;
l->prev->next = l->next;
}
/*
===============
SV_InsertLinkBefore
kept trigger and solid entities seperate
===============
*/
void SV_InsertLinkBefore( link_t *l, link_t *before, edict_t *ent )
{
l->next = before;
l->prev = before->prev;
l->prev->next = l;
l->next->prev = l;
l->entnum = PRVM_NUM_FOR_EDICT(ent);
}
/*
===============
SV_CreateAreaNode
builds a uniformly subdivided tree for the given world size
===============
*/
areanode_t *SV_CreateAreaNode( int depth, vec3_t mins, vec3_t maxs )
{
areanode_t *anode;
vec3_t size;
vec3_t mins1, maxs1, mins2, maxs2;
vec3_t mins1, maxs1;
vec3_t mins2, maxs2;
anode = &sv_worldsectors[sv_numworldsectors];
sv_numworldsectors++;
anode = &sv_areanodes[sv_numareanodes++];
SV_ClearLink( &anode->trigger_edicts );
SV_ClearLink( &anode->solid_edicts );
if( depth == AREA_DEPTH )
{
anode->axis = -1;
@ -94,18 +110,19 @@ worldsector_t *SV_CreateWorldSector( int depth, vec3_t mins, vec3_t maxs )
}
VectorSubtract( maxs, mins, size );
if( size[0] > size[1] ) anode->axis = 0;
if( size[0] > size[1] )
anode->axis = 0;
else anode->axis = 1;
anode->dist = 0.5f * (maxs[anode->axis] + mins[anode->axis]);
VectorCopy(mins, mins1);
VectorCopy(mins, mins2);
VectorCopy(maxs, maxs1);
VectorCopy(maxs, maxs2);
VectorCopy( mins, mins1 );
VectorCopy( mins, mins2 );
VectorCopy( maxs, maxs1 );
VectorCopy( maxs, maxs2 );
maxs1[anode->axis] = mins2[anode->axis] = anode->dist;
anode->children[0] = SV_CreateWorldSector( depth + 1, mins2, maxs2);
anode->children[1] = SV_CreateWorldSector( depth + 1, mins1, maxs1);
anode->children[0] = SV_CreateAreaNode( depth+1, mins2, maxs2 );
anode->children[1] = SV_CreateAreaNode( depth+1, mins1, maxs1 );
return anode;
}
@ -119,9 +136,10 @@ SV_ClearWorld
void SV_ClearWorld( void )
{
cmodel_t *world = sv.models[1];
memset( sv_worldsectors, 0, sizeof(sv_worldsectors));
sv_numworldsectors = 0;
SV_CreateWorldSector( 0, world->mins, world->maxs );
sv_numareanodes = 0;
Mem_Set( sv_areanodes, 0, sizeof( sv_areanodes ));
SV_CreateAreaNode( 0, world->mins, world->maxs );
}
/*
@ -131,30 +149,11 @@ SV_UnlinkEdict
*/
void SV_UnlinkEdict( edict_t *ent )
{
sv_edict_t *sv_ent, *scan;
worldsector_t *ws;
// not linked in anywhere
if( !ent->priv.sv->area.prev ) return;
sv_ent = ent->priv.sv;
sv_ent->linked = false;
ws = sv_ent->worldsector;
if( !ws ) return; // not linked in anywhere
sv_ent->worldsector = NULL;
if( ws->entities == sv_ent )
{
ws->entities = sv_ent->nextedict;
return;
}
for( scan = ws->entities; scan; scan = scan->nextedict )
{
if( scan->nextedict == sv_ent )
{
scan->nextedict = sv_ent->nextedict;
return;
}
}
MsgDev( D_ERROR, "SV_UnlinkEdict: not found in worldSector\n" );
SV_RemoveLink( &ent->priv.sv->area );
ent->priv.sv->area.prev = ent->priv.sv->area.next = NULL;
}
/*
@ -164,27 +163,32 @@ SV_LinkEntity
*/
void SV_LinkEdict( edict_t *ent )
{
worldsector_t *node;
areanode_t *node;
int leafs[MAX_TOTAL_ENT_LEAFS];
int cluster;
int clusters[MAX_TOTAL_ENT_LEAFS];
int num_leafs;
int i, j, k;
int area;
int lastleaf;
int topnode;
sv_edict_t *sv_ent;
sv_ent = ent->priv.sv;
if( sv_ent->worldsector ) SV_UnlinkEdict( ent ); // unlink from old position
if( sv_ent->area.prev ) SV_UnlinkEdict( ent ); // unlink from old position
if( ent == prog->edicts ) return; // don't add the world
if( ent->priv.sv->free ) return;
if( sv_ent->free ) return;
// set the size
VectorSubtract( ent->progs.sv->maxs, ent->progs.sv->mins, ent->progs.sv->size );
// encode the size into the entity_state for client prediction
if((int)ent->progs.sv->contents & ( CONTENTS_SOLID | CONTENTS_BODY ))
if( ent->progs.sv->solid == SOLID_BSP )
{
// a solid_bbox will never create this value
sv_ent->solid = SOLID_BMODEL;
}
else if(( int )ent->progs.sv->contents & ( CONTENTS_SOLID|CONTENTS_BODY ))
{
// encode the size into the entity_state for client prediction
// assume that x/y are equal and symetric
i = ent->progs.sv->maxs[0];
i = bound( 1, i, 255 );
@ -198,20 +202,16 @@ void SV_LinkEdict( edict_t *ent )
k = bound( 1, k, 255 );
sv_ent->solid = (k<<16)|(j<<8)|i;
}
else if (ent->progs.sv->solid == SOLID_BSP)
{
sv_ent->solid = SOLID_BMODEL; // a solid_bbox will never create this value
}
else sv_ent->solid = 0;
// set the abs box
if (ent->progs.sv->solid == SOLID_BSP && !VectorIsNull(ent->progs.sv->angles))
if( ent->progs.sv->solid == SOLID_BSP && !VectorIsNull( ent->progs.sv->angles ))
{
// expand for rotation
int i;
float max = RadiusFromBounds( ent->progs.sv->mins, ent->progs.sv->maxs );
int i;
float max = RadiusFromBounds( ent->progs.sv->mins, ent->progs.sv->maxs );
for (i = 0; i < 3; i++)
for( i = 0; i < 3; i++ )
{
ent->progs.sv->absmin[i] = ent->progs.sv->origin[i] - max;
ent->progs.sv->absmax[i] = ent->progs.sv->origin[i] + max;
@ -234,12 +234,11 @@ void SV_LinkEdict( edict_t *ent )
// link to PVS leafs
sv_ent->num_clusters = 0;
sv_ent->lastcluster = 0;
sv_ent->areanum = -1;
sv_ent->areanum2 = -1;
sv_ent->areanum = 0;
sv_ent->areanum2 = 0;
// get all leafs, including solids
num_leafs = pe->BoxLeafnums( ent->progs.sv->absmin, ent->progs.sv->absmax, leafs, MAX_TOTAL_ENT_LEAFS, &lastleaf );
num_leafs = pe->BoxLeafnums( ent->progs.sv->absmin, ent->progs.sv->absmax, leafs, MAX_TOTAL_ENT_LEAFS, &topnode );
// if none of the leafs were inside the map, the
// entity is outside the world and can be considered unlinked
@ -248,39 +247,56 @@ void SV_LinkEdict( edict_t *ent )
// set areas, even from clusters that don't fit in the entity array
for( i = 0; i < num_leafs; i++ )
{
clusters[i] = pe->LeafCluster( leafs[i] );
area = pe->LeafArea( leafs[i] );
if( area != -1 )
if( area )
{
// doors may legally straggle two areas,
// but nothing should evern need more than that
if (ent->priv.sv->areanum && ent->priv.sv->areanum != area)
if( sv_ent->areanum && sv_ent->areanum != area )
{
if( ent->priv.sv->areanum != -1 && ent->priv.sv->areanum != area && sv.state == ss_loading )
if( sv_ent->areanum2 && sv_ent->areanum2 != area && sv.state == ss_loading )
{
float *v = ent->progs.sv->absmin;
MsgDev( D_WARN, "SV_LinkEdict: object touching 3 areas at %f %f %f\n", v[0], v[1], v[2]);
MsgDev( D_WARN, "SV_LinkEdict: object touching 3 areas at %f %f %f\n", v[0], v[1], v[2] );
}
ent->priv.sv->areanum2 = area;
sv_ent->areanum2 = area;
}
else ent->priv.sv->areanum = area;
else sv_ent->areanum = area;
}
}
sv_ent->num_clusters = 0;
for( i = 0; i < num_leafs; i++ )
if( num_leafs >= MAX_TOTAL_ENT_LEAFS )
{
cluster = pe->LeafCluster( leafs[i] );
if( cluster != -1 )
// assume we missed some leafs, and mark by headnode
sv_ent->num_clusters = -1;
sv_ent->headnode = topnode;
}
else
{
sv_ent->num_clusters = 0;
for( i = 0; i < num_leafs; i++ )
{
sv_ent->clusternums[sv_ent->num_clusters++] = cluster;
if( sv_ent->num_clusters == MAX_ENT_CLUSTERS )
break; // list is full
if( clusters[i] == -1 ) continue; // not a visible leaf
for( j = 0; j < i; j++ )
{
if( clusters[j] == clusters[i] )
break;
}
if( j == i )
{
if( sv_ent->num_clusters == MAX_ENT_CLUSTERS )
{
// assume we missed some leafs, and mark by headnode
sv_ent->num_clusters = -1;
sv_ent->headnode = topnode;
break;
}
sv_ent->clusternums[sv_ent->num_clusters++] = clusters[i];
}
}
}
// store off a last cluster if we need to
if( i != num_leafs ) sv_ent->lastcluster = pe->LeafCluster( lastleaf );
// if first time, make sure old_origin is valid
if( !ent->priv.sv->linkcount )
{
@ -295,8 +311,8 @@ void SV_LinkEdict( edict_t *ent )
return;
}
// find the first world sector node that the ent's box crosses
node = sv_worldsectors;
// find the first node that the ent's box crosses
node = sv_areanodes;
while( 1 )
{
if( node->axis == -1 ) break;
@ -307,10 +323,10 @@ void SV_LinkEdict( edict_t *ent )
else break; // crosses the node
}
// link it in
sv_ent->worldsector = node;
sv_ent->nextedict = node->entities;
node->entities = sv_ent;
// link it in
if( ent->progs.sv->solid == SOLID_TRIGGER )
SV_InsertLinkBefore( &sv_ent->area, &node->trigger_edicts, ent );
else SV_InsertLinkBefore (&sv_ent->area, &node->solid_edicts, ent );
sv_ent->linked = true;
}
@ -328,35 +344,43 @@ bounds. This does NOT mean that they actually touch in the case of bmodels.
SV_AreaEdicts_r
====================
*/
void SV_AreaEdicts_r( worldsector_t *node, area_t *ap )
void SV_AreaEdicts_r( areanode_t *node, area_t *ap )
{
sv_edict_t *check, *next;
edict_t *gcheck;
int count = 0;
link_t *l, *next, *start;
edict_t *check;
int count = 0;
for( check = node->entities; check; check = next )
// touch linked edicts
if( ap->type == AREA_SOLID )
start = &node->solid_edicts;
else start = &node->trigger_edicts;
for( l = start->next; l != start; l = next )
{
next = check->nextedict;
gcheck = PRVM_EDICT_NUM( check->serialnumber );
next = l->next;
check = EDICT_FROM_AREA( l );
if (gcheck->progs.sv->absmin[0] > ap->maxs[0] || gcheck->progs.sv->absmin[1] > ap->maxs[1] || gcheck->progs.sv->absmin[2] > ap->maxs[2]
|| gcheck->progs.sv->absmax[0] < ap->mins[0] || gcheck->progs.sv->absmax[1] < ap->mins[1] || gcheck->progs.sv->absmax[2] < ap->mins[2])
if( check->progs.sv->solid == SOLID_NOT ) continue; // deactivated
if( check->progs.sv->absmin[0] > ap->maxs[0] || check->progs.sv->absmin[1] > ap->maxs[1]
|| check->progs.sv->absmin[2] > ap->maxs[2] || check->progs.sv->absmax[0] < ap->mins[0]
|| check->progs.sv->absmax[1] < ap->mins[1] || check->progs.sv->absmax[2] < ap->mins[2] )
continue; // not touching
if( ap->count == ap->maxcount )
{
MsgDev(D_NOTE, "SV_AreaEdicts_r: maxcount!\n");
MsgDev( D_WARN, "SV_AreaEdicts: maxcount hit\n" );
return;
}
ap->list[ap->count] = PRVM_EDICT_NUM( check->serialnumber );
ap->list[ap->count] = check;
ap->count++;
}
if( node->axis == -1 ) return; // terminal node
// recurse down both sides
if( ap->maxs[node->axis] > node->dist ) SV_AreaEdicts_r ( node->children[0], ap );
if( ap->mins[node->axis] < node->dist ) SV_AreaEdicts_r ( node->children[1], ap );
if( ap->maxs[node->axis] > node->dist ) SV_AreaEdicts_r( node->children[0], ap );
if( ap->mins[node->axis] < node->dist ) SV_AreaEdicts_r( node->children[1], ap );
}
/*
@ -364,7 +388,7 @@ void SV_AreaEdicts_r( worldsector_t *node, area_t *ap )
SV_AreaEdicts
================
*/
int SV_AreaEdicts( const vec3_t mins, const vec3_t maxs, edict_t **list, int maxcount )
int SV_AreaEdicts( const vec3_t mins, const vec3_t maxs, edict_t **list, int maxcount, int areatype )
{
area_t ap;
@ -373,8 +397,9 @@ int SV_AreaEdicts( const vec3_t mins, const vec3_t maxs, edict_t **list, int max
ap.list = list;
ap.count = 0;
ap.maxcount = maxcount;
ap.type = areatype;
SV_AreaEdicts_r( sv_worldsectors, &ap );
SV_AreaEdicts_r( sv_areanodes, &ap );
return ap.count;
}

View File

@ -3170,8 +3170,7 @@ wadtype_t wad_types[] =
{"flt", TYPE_FLAT }, // doom1 wall texture
{"pal", TYPE_QPAL }, // palette
{"lmp", TYPE_QPIC }, // quake1, hl pic
{"mip", TYPE_MIPTEX2}, // hl texture
{"mip", TYPE_MIPTEX }, // quake1 mip
{"mip", TYPE_MIPTEX }, // hl/q1 mip
{"bin", TYPE_BINDATA}, // xash binary data
{"str", TYPE_STRDATA}, // xash string data
{"raw", TYPE_RAW }, // signed raw data
@ -3387,7 +3386,10 @@ static bool W_ReadLumpTable( wfile_t *wad )
k = com_strlen( com_strrchr( wad->lumps[i].name, '*' ));
if( k ) wad->lumps[i].name[com_strlen(wad->lumps[i].name)-k] = '!'; // quake1 issues
// check for 'conchars' issues
// convert all qmip types to miptex
if( wad->lumps[i].type == TYPE_QMIP ) wad->lumps[i].type = TYPE_MIPTEX;
// check for 'conchars' issues (only lmp loader supposed to read this lame pic)
if( !com.strcmp( wad->lumps[i].name, "conchars" )) wad->lumps[i].type = TYPE_QPIC;
}
return true;
@ -3534,7 +3536,10 @@ wfile_t *W_Open( const char *filename, const char *mode )
dwadinfo_t header;
wfile_t *wad = (wfile_t *)Mem_Alloc( fs_mempool, sizeof( wfile_t ));
wad->file = FS_Open( filename, mode );
if( mode[0] == 'a' ) wad->file = FS_Open( filename, "r+b" );
else if( mode[0] == 'w' ) wad->file = FS_Open( filename, "wb" );
else if( mode[0] == 'r' ) wad->file = FS_Open( filename, "rb" );
if( !wad->file )
{
W_Close( wad );
@ -3611,21 +3616,38 @@ wfile_t *W_Open( const char *filename, const char *mode )
// NOTE: lumps table can be reallocated for O_APPEND mode
wad->lumps = Mem_Alloc( wad->mempool, wad->numlumps * sizeof( dlumpinfo_t ));
// setup lump allocation table
switch( header.ident )
{
case IDIWADHEADER:
case IDPWADHEADER:
if(!W_ConvertIWADLumps( wad ))
return NULL;
break;
case IDWAD2HEADER:
case IDWAD3HEADER:
if(!W_ReadLumpTable( wad ))
return NULL;
break;
}
if( wad->mode == O_APPEND )
{
size_t lat_size = wad->numlumps * sizeof( dlumpinfo_t );
if( FS_Read( wad->file, wad->lumps, lat_size ) != lat_size )
{
MsgDev( D_ERROR, "W_ReadLumpTable: %s has corrupted lump allocation table\n", wad->filename );
W_Close( wad );
return NULL;
}
// if we are in append mode - we need started from infotableofs poisition
// overwrite lumptable as well, we have her copy in wad->lumps
FS_Seek( wad->file, wad->infotableofs, SEEK_SET );
}
else
{
// setup lump allocation table
switch( header.ident )
{
case IDIWADHEADER:
case IDPWADHEADER:
if(!W_ConvertIWADLumps( wad ))
return NULL;
break;
case IDWAD2HEADER:
case IDWAD3HEADER:
if(!W_ReadLumpTable( wad ))
return NULL;
break;
}
}
}
// and leaves the file open
return wad;
@ -3649,7 +3671,7 @@ void W_Close( wfile_t *wad )
hdr.ident = IDWAD3HEADER;
hdr.numlumps = LittleLong( wad->numlumps );
hdr.infotableofs = LittleLong( ofs );
FS_Seek( wad->file, 0, SEEK_SET );
FS_Write( wad->file, &hdr, sizeof( hdr ));
}
@ -3663,6 +3685,7 @@ fs_offset_t W_SaveLump( wfile_t *wad, const char *lump, const void* data, size_t
{
size_t lat_size;
dlumpinfo_t *info;
int i;
if( !wad || !lump ) return -1;
if( !data || !datasize )
@ -3693,16 +3716,13 @@ fs_offset_t W_SaveLump( wfile_t *wad, const char *lump, const void* data, size_t
wad->lumps = Mem_Realloc( wad->mempool, wad->lumps, lat_size );
info = wad->lumps + wad->numlumps;
// if we are in append mode - we need started from infotableofs poisition
// overwrite lumptable as well, we have her copy in wad->lumps
if( wad->mode == O_APPEND ) FS_Seek( wad->file, wad->infotableofs, SEEK_SET );
// write header
W_CleanupName( lump, info->name );
info->filepos = LittleLong( FS_Tell( wad->file ));
info->compression = cmp;
info->type = type;
i = FS_Tell( wad->file );
if(!W_WriteLump( wad, info, data, datasize, cmp ))
return -1;

View File

@ -279,7 +279,7 @@ void StringTable_DeleteSystem( int handle )
Mem_Free( dstring[handle]->data ); // free strings
Mem_Free( dstring[handle]->table); // free indices
Mem_Free( dstring[handle] ); // free himself
Mem_Set( &dstring[handle], 0, sizeof( stringtable_t ));
dstring[handle] = NULL;
}
const char *StringTable_GetString( int handle, string_t index )

View File

@ -655,9 +655,9 @@ void BSP_LoadSurfedges( lump_t *l )
count = l->filelen / sizeof(*in);
if( count < 1 ) Host_Error( "BSP_LoadSurfedges: map without surfedges\n" );
cm.surfedges = Mem_Alloc( cmappool, count * sizeof( *in ));
Mem_Copy( cm.edges, in, count * sizeof( *in ));
Mem_Copy( cm.surfedges, in, count * sizeof( *in ));
SwapBlock( (int *)cm.edges, sizeof(*in) * count );
SwapBlock( (int *)cm.surfedges, sizeof(*in) * count );
}

View File

@ -212,7 +212,7 @@ bool CM_AreasConnected( int area, int otherarea )
if( area > cm.numareas || otherarea > cm.numareas )
Host_Error("CM_AreasConnected: area >= cm.numareas\n" );
if( area < 0 || otherarea < 0 ) return false;
if( !area || !otherarea ) return false;
if( area == otherarea ) return true; // quick test
if( cm.areas[area].floodnum == cm.areas[otherarea].floodnum )

View File

@ -14,8 +14,8 @@
#define TYPE_QPAL 64 // quake palette
#define TYPE_QTEX 65 // probably was never used
#define TYPE_QPIC 66 // quake1 and hl pic (lmp_t)
#define TYPE_MIPTEX2 67 // half-life (mip_t) previous was TYP_SOUND but never used in quake1
#define TYPE_MIPTEX 68 // quake1 (mip_t)
#define TYPE_MIPTEX 67 // half-life (mip_t) previous was TYP_SOUND but never used in quake1
#define TYPE_QMIP 68 // quake1 (mip_t)
#define TYPE_BINDATA 69 // engine internal data (map lumps, save lumps etc)
#define TYPE_STRDATA 70 // big unterminated string (stringtable marked as TYPE_BINARYDATA)

View File

@ -131,9 +131,9 @@ BRUSH MODELS
#define IDBSPMODHEADER (('P'<<24)+('S'<<16)+('B'<<8)+'I') // little-endian "IBSP"
// 32 bit limits
#define MAX_MAP_AREA_BYTES 32 // bit vector of area visibility
#define MAX_MAP_AREAS 0x100 // don't increase this
#define MAX_MAP_MODELS 0x2000 // mesh models and sprites too
#define MAX_MAP_AREA_BYTES MAX_MAP_AREAS / 8 // bit vector of area visibility
#define MAX_MAP_AREAS 0x100 // don't increase this
#define MAX_MAP_MODELS 0x2000 // mesh models and sprites too
#define MAX_MAP_AREAPORTALS 0x400
#define MAX_MAP_ENTITIES 0x2000
#define MAX_MAP_SHADERS 0x1000

View File

@ -67,5 +67,5 @@ if exist vsound\vsound.plg del /f /q vsound\vsound.plg
echo Build succeeded!
echo Please wait. Xash is now loading
cd D:\Xash3D\
quake.exe -game tmpQuArK -dev 3 -log +map start +load quick
quake.exe -game tmpQuArK -dev 3 -log +map start
:done

View File

@ -196,6 +196,8 @@ typedef struct
// builtin shaders
ref_shader_t *defaultShader;
ref_shader_t *lightmapShader;
ref_shader_t *skyboxShader;
ref_shader_t *particleShader;
} ref_globals_t;
extern ref_backend_t ref;

View File

@ -33,16 +33,30 @@ texture_t *r_dlightTexture;
texture_t *r_normalizeTexture;
texture_t *r_attenuationTexture;
texture_t *r_falloffTexture;
texture_t *r_skyTexture;
texture_t *r_rawTexture;
texture_t *r_fogTexture;
texture_t *r_fogEnterTexture;
texture_t *r_scratchTexture;
texture_t *r_accumTexture;
texture_t *r_particleTexture;
texture_t *r_mirrorRenderTexture;
texture_t *r_portalRenderTexture;
texture_t *r_currentRenderTexture;
texture_t *r_lightmapTextures[MAX_LIGHTMAPS];
static byte rb_dotImage[8][8] =
{
{0,0,0,0,0,0,0,0},
{0,0,1,1,0,0,0,0},
{0,1,1,1,1,0,0,0},
{0,1,1,1,1,0,0,0},
{0,0,1,1,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
};
const vec3_t r_cubeMapAngles[6] =
{
{ 0, 180, 90},
@ -933,6 +947,47 @@ static rgbdata_t *R_MakeGlow( rgbdata_t *in )
return out;
}
static rgbdata_t *R_MakeImageBlock( rgbdata_t *in , int block[4] )
{
byte *fin, *out;
int i, x, y, xl, yl, xh, yh, w, h;
int linedelta;
// make sure what we processing RGBA image
in = R_ForceImageToRGBA( in );
xl = block[0];
yl = block[1];
w = block[2];
h = block[3];
xh = xl + w;
yh = yl + h;
image_desc.source = Mem_Realloc( r_temppool, image_desc.source, w * h * 4 );
out = image_desc.source;
fin = in->buffer + (yl * in->width + xl) * 4;
linedelta = (in->width - w) * 4;
// cut block from source
for( y = yl; y < yh; y++ )
{
for( x = xl; x < xh; x++ )
for( i = 0; i < 4; i++ )
*out++ = *fin++;
fin += linedelta;
}
// copy result back
in->buffer = Mem_Realloc( r_temppool, in->buffer, w * h * 4 );
Mem_Copy( in->buffer, image_desc.source, w * h * 4 );
in->size = w * h * 4;
in->height = h;
in->width = w;
return in;
}
/*
=================
R_MakeAlpha
@ -1661,6 +1716,86 @@ static rgbdata_t *R_ParseMakeGlow( script_t *script, int *samples, texFlags_t *f
return R_MakeGlow( pic );
}
/*
=================
R_ParseScrapBlock
=================
*/
static rgbdata_t *R_ParseScrapBlock( script_t *script, int *samples, texFlags_t *flags )
{
int i, block[4];
token_t token;
rgbdata_t *pic;
Com_ReadToken( script, 0, &token );
if( com.stricmp( token.string, "(" ))
{
MsgDev( D_WARN, "expected '(', found '%s' instead for 'makeGlow'\n", token.string );
return NULL;
}
if( !Com_ReadToken( script, SC_ALLOW_PATHNAMES2, &token ))
{
MsgDev( D_WARN, "missing parameters for 'scrapBlock'\n" );
return NULL;
}
pic = R_LoadImage( script, token.string, NULL, 0, samples, flags );
if( !pic ) return NULL;
for( i = 0; i < 4; i++ )
{
Com_ReadToken( script, 0, &token );
if( com.stricmp( token.string, "," ))
{
MsgDev( D_WARN, "expected ',', found '%s' instead for 'rect'\n", token.string );
FS_FreeImage( pic );
return NULL;
}
if( !Com_ReadLong( script, 0, &block[i] ))
{
MsgDev( D_WARN, "missing parameters for 'block'\n" );
FS_FreeImage( pic );
return NULL;
}
if( block[i] < 0 )
{
MsgDev( D_WARN, "invalid argument %i for 'block'\n", i+1 );
FS_FreeImage( pic );
return NULL;
}
if((i+1) & 1 && block[i] > pic->width )
{
MsgDev( D_WARN, "invalid argument %i for 'block'\n", i+1 );
FS_FreeImage( pic );
return NULL;
}
if((i+1) & 2 && block[i] > pic->height )
{
MsgDev( D_WARN, "invalid argument %i for 'block'\n", i+1 );
FS_FreeImage( pic );
return NULL;
}
}
Com_ReadToken( script, 0, &token );
if( com.stricmp( token.string, ")" ))
{
MsgDev( D_WARN, "expected ')', found '%s' instead for 'bias'\n", token.string );
FS_FreeImage( pic );
return NULL;
}
if((block[0] + block[2] > pic->width) || (block[1] + block[3] > pic->height))
{
MsgDev( D_WARN, "'ScrapBlock' image size out of bounds\n" );
FS_FreeImage( pic );
return NULL;
}
return R_MakeImageBlock( pic, block );
}
/*
=================
R_ParseHeightMap
@ -1865,6 +2000,8 @@ static rgbdata_t *R_LoadImage( script_t *script, const char *name, const byte *b
return R_ParseMakeGlow( script, samples, flags );
else if( !com.stricmp( name, "heightMap" ))
return R_ParseHeightMap( script, samples, flags );
else if( !com.stricmp( name, "ScrapBlock" ))
return R_ParseScrapBlock( script, samples, flags );
else if( !com.stricmp( name, "addNormals" ))
return R_ParseAddNormals( script, samples, flags );
else if( !com.stricmp( name, "smoothNormals" ))
@ -2320,6 +2457,30 @@ static void R_CreateBuiltInTextures( void )
for( i = 0; i < 64; i++ ) ((uint *)&data2D)[i] = LittleLong(0xFFFF8080);
r_flatTexture = R_LoadTexture( "*flat", &pic, 3, TF_STATIC|TF_NOPICMIP|TF_UNCOMPRESSED|TF_NORMALMAP, TF_DEFAULT, TW_REPEAT );
// skybox texture
for( i = 0; i < 256; i++ )((uint *)&data2D)[i] = LittleLong( 0xFFFFDEB5 );
pic.width = pic.height = 16;
pic.size = pic.width * pic.height * 4;
r_skyTexture = R_LoadTexture( "*sky", &pic, 3, TF_STATIC|TF_NOPICMIP, TF_LINEAR, TW_REPEAT );
// particle texture
for( x = 0; x < 8; x++ )
{
for( y = 0; y < 8; y++ )
{
data2D[4*(y*8+x)+0] = 0xFF;
data2D[4*(y*8+x)+1] = 0xFF;
data2D[4*(y*8+x)+2] = 0xFF;
data2D[4*(y*8+x)+3] = rb_dotImage[x][y] * 0xFF;
}
}
pic.width = pic.height = 8;
pic.size = pic.width * pic.height * 4;
pic.flags |= IMAGE_HAS_ALPHA;
r_particleTexture = R_LoadTexture( "*particle", &pic, 4, TF_STATIC|TF_NOPICMIP, TF_NEAREST, 0 );
pic.flags &= ~IMAGE_HAS_ALPHA;
// attenuation texture
for( y = 0; y < 128; y++ )
{
@ -2761,9 +2922,9 @@ void R_InitTextures( void )
for( i = 0; i < 256; i++ )
{
// 224 is a Q1 luma threshold
r_glowTable[i][0] = i > 196 ? i : 0;
r_glowTable[i][1] = i > 196 ? i : 0;
r_glowTable[i][2] = i > 196 ? i : 0;
r_glowTable[i][0] = i > 224 ? i : 0;
r_glowTable[i][1] = i > 224 ? i : 0;
r_glowTable[i][2] = i > 224 ? i : 0;
}
// build luminance table

View File

@ -27,7 +27,7 @@ extern byte *r_temppool;
#define MAX_POLYS 4096
#define MAX_POLY_VERTS 16384
#define MAX_CLIPFLAGS 15 // all sides of bbox are valid
#define LM_SIZE 256 // LM_SIZE x LM_SIZE (width x height)
#define LM_SIZE 128 // LM_SIZE x LM_SIZE (width x height)
/*
=======================================================================
@ -96,8 +96,10 @@ typedef struct texture_s
extern texture_t *r_defaultTexture;
extern texture_t *r_whiteTexture;
extern texture_t *r_blackTexture;
extern texture_t *r_skyTexture;
extern texture_t *r_rawTexture;
extern texture_t *r_dlightTexture;
extern texture_t *r_particleTexture;
extern texture_t *r_lightmapTextures[MAX_LIGHTMAPS];
extern texture_t *r_normalizeTexture;
extern texture_t *r_radarMap;
@ -759,7 +761,6 @@ extern int r_frameCount;
extern int r_visFrameCount;
extern int r_viewCluster;
extern int r_oldViewCluster;
extern int r_areabitsChanged;
extern vec3_t r_origin; // same as r_refdef.vieworg
extern vec3_t r_forward;
extern vec3_t r_right;

View File

@ -822,24 +822,6 @@ void R_RenderView( const refdef_t *fd )
r_numSolidMeshes = 0;
r_numTransMeshes = 0;
// copy the areamask data over and note if it has changed, which
// will force a reset of the visible leafs even if the view hasn't moved
r_areabitsChanged = false;
if(!(r_refdef.rdflags & RDF_NOWORLDMODEL ))
{
int i, areaDiff = 0;
// compare the area bits
for( i = 0; i < MAX_MAP_AREA_BYTES / 4; i++ )
{
areaDiff |= ((int *)r_refdef.areabits)[i] ^ ((int *)fd->areabits)[i];
((int *)r_refdef.areabits)[i] = ((int *)fd->areabits)[i];
}
// a door just opened or something
if( areaDiff ) r_areabitsChanged = true;
}
r_refdef = *fd;
// set up frustum
R_SetFrustum();
@ -876,7 +858,7 @@ void R_RenderView( const refdef_t *fd )
void R_DrawPauseScreen( void )
{
// don't apply post effects for custom window
if(r_refdef.rdflags & RDF_NOWORLDMODEL)
if( r_refdef.rdflags & RDF_NOWORLDMODEL )
return;
if( !r_pause_bw->integer )
@ -1119,7 +1101,7 @@ bool R_AddParticleToScene( const vec3_t origin, float alpha, int color )
p = &r_particles[r_numParticles];
p->shader = tr.defaultShader;
p->shader = tr.particleShader;
VectorCopy( origin, p->origin );
VectorCopy( origin, p->old_origin );
p->radius = 5;

View File

@ -16,6 +16,7 @@ static byte r_fullvis[MAX_MAP_LEAFS/8];
static rmodel_t r_models[MAX_MODELS];
int registration_sequence;
rmodel_t *m_pLoadModel;
static string r_skyShader;
static int r_nummodels;
/*
@ -259,6 +260,14 @@ void R_LoadShaders( const byte *base, const lump_t *l )
m_pLoadModel->shaders[i] = tr.defaultShader;
continue;
}
if( surfaceParm & SURF_SKY )
{
// setup sky shader
com.strncpy( r_skyShader, in->name, MAX_STRING );
shaderType = SHADER_SKY;
}
else shaderType = SHADER_TEXTURE;
// lightmap visualization tool
if( r_lightmap->integer && !(surfaceParm & SURF_NOLIGHTMAP))
@ -271,7 +280,6 @@ void R_LoadShaders( const byte *base, const lump_t *l )
if( !m_pLoadModel->lightData || surfaceParm & SURF_WARP )
surfaceParm |= SURF_NOLIGHTMAP;
shaderType = SHADER_TEXTURE;
m_pLoadModel->shaders[i] = r_shaders[R_FindShader( in->name, shaderType, surfaceParm )];
}
}
@ -990,6 +998,7 @@ void Mod_LoadBrushModel( rmodel_t *mod, const void *buffer )
byte *mod_base;
m_pLoadModel->type = mod_world;
r_skyShader[0] = 0;
if( m_pLoadModel != r_models )
{
@ -1193,6 +1202,9 @@ void R_EndRegistration( void )
int i;
rmodel_t *mod;
// setup skybox
R_SetupSky( r_skyShader, 0, vec3_origin );
for( i = 0, mod = r_models; i < r_nummodels; i++, mod++ )
{
if( !mod->name[0] ) continue;

View File

@ -79,13 +79,6 @@ shaderParm_t infoParms[] =
{"slick", SURF_SLICK, CONTENTS_NONE, 0},
{"light", SURF_LIGHT, CONTENTS_NONE, 0},
{"ladder", SURF_NONE, CONTENTS_LADDER, 0},
// drawsurf attributes (matched with Half-Life render modes)
{"texture", SURF_BLEND, CONTENTS_NONE, 0}, // blend surface
{"glow", SURF_GLOW, CONTENTS_NONE, 0}, // glow sprite
{"solid", SURF_ALPHA, CONTENTS_TRANSLUCENT, 0}, // alphatest
{"additive", SURF_ADDITIVE, CONTENTS_NONE, 0}, // additive
{"chrome", SURF_CHROME, CONTENTS_NONE, 0}, // studio chrome
};
/*
@ -1059,13 +1052,11 @@ static bool R_ParseGeneralSurfaceParm( ref_shader_t *shader, script_t *script )
{
token_t tok;
int i, numInfoParms = sizeof(infoParms) / sizeof(infoParms[0]);
switch( shader->type )
{
case SHADER_TEXTURE:
case SHADER_STUDIO:
case SHADER_SPRITE:
break;
case SHADER_SKY: break;
default:
MsgDev( D_WARN, "'surfaceParm' not allowed in shader '%s'\n", shader->name );
return false;
@ -1086,6 +1077,12 @@ static bool R_ParseGeneralSurfaceParm( ref_shader_t *shader, script_t *script )
}
}
if(!(shader->surfaceParm & SURF_SKY) && shader->type == SHADER_SKY )
{
MsgDev( D_WARN, "invalid 'surfaceParm' for shader '%s'\n", shader->name );
return false;
}
if( i == numInfoParms )
{
MsgDev( D_WARN, "unknown 'surfaceParm' parameter '%s' in shader '%s'\n", tok.string, shader->name );
@ -3107,6 +3104,8 @@ static bool R_ParseStageBlendFunc( ref_shader_t *shader, shaderStage_t *stage, s
stage->blendFunc.src = GL_DST_COLOR;
else if( !com.stricmp( tok.string, "GL_ONE_MINUS_DST_COLOR"))
stage->blendFunc.src = GL_ONE_MINUS_DST_COLOR;
else if( !com.stricmp( tok.string, "GL_SRC_COLOR"))
stage->blendFunc.src = GL_SRC_COLOR;
else if( !com.stricmp( tok.string, "GL_SRC_ALPHA"))
stage->blendFunc.src = GL_SRC_ALPHA;
else if( !com.stricmp( tok.string, "GL_ONE_MINUS_SRC_ALPHA"))
@ -3783,7 +3782,9 @@ static void R_ParseShaderFile( script_t *script, const char *name )
break;
}
}
shaderScript->type = SHADER_TEXTURE;
if( shaderScript->surfaceParm & SURF_SKY )
shaderScript->type = SHADER_SKY;
else shaderScript->type = SHADER_TEXTURE;
}
}
Com_CloseScript( scriptBlock );
@ -4079,8 +4080,6 @@ static ref_shader_t *R_CreateShader( const char *name, int shaderType, uint surf
script = Com_OpenScript( shaderScript->name, shaderScript->buffer, shaderScript->size );
if( !script ) return R_CreateDefaultShader( name, shaderType, surfaceParm );
Msg("ParseScript: %s\n", shaderScript->name );
// parse it
if( !R_ParseShader( shader, script ))
{
@ -4947,6 +4946,7 @@ R_CreateBuiltInShaders
static void R_CreateBuiltInShaders( void )
{
ref_shader_t *shader;
int i;
// default shader
shader = R_NewShader();
@ -4974,6 +4974,36 @@ static void R_CreateBuiltInShaders( void )
shader->numStages++;
tr.lightmapShader = R_LoadShader( shader );
// skybox shader
shader = R_NewShader();
com.strncpy( shader->name, "<skybox>", sizeof( shader->name ));
shader->index = r_numShaders;
shader->type = SHADER_SKY;
shader->flags = SHADER_SKYPARMS;
for( i = 0; i < 6; i++ )
shader->skyParms.farBox[i] = r_skyTexture;
shader->skyParms.cloudHeight = 128.0f;
tr.skyboxShader = R_LoadShader( shader );
// particle shader
shader = R_NewShader();
com.strncpy( shader->name, "<particle>", sizeof( shader->name ));
shader->index = r_numShaders;
shader->type = SHADER_SPRITE;
shader->surfaceParm = SURF_NOLIGHTMAP;
shader->stages[0]->bundles[0]->textures[0] = r_particleTexture;
shader->stages[0]->blendFunc.src = GL_DST_COLOR;
shader->stages[0]->blendFunc.dst = GL_SRC_ALPHA;
shader->stages[0]->flags |= SHADERSTAGE_BLENDFUNC|SHADERSTAGE_RGBGEN;
shader->stages[0]->rgbGen.type = RGBGEN_VERTEX;
shader->stages[0]->bundles[0]->numTextures++;
shader->stages[0]->numBundles++;
shader->numStages++;
tr.particleShader = R_LoadShader( shader );
}
/*

View File

@ -589,6 +589,7 @@ void R_SetupSky( const char *name, float rotate, const vec3_t axis )
void *map;
int i, j;
if( !com.strlen( name )) return; // invalid name
r_worldModel->sky = Mem_Realloc( r_temppool, r_worldModel->sky, sizeof( sky_t ));
sky = r_worldModel->sky;
sky->shader = r_shaders[R_FindShader( name, SHADER_SKY, 0 )];

View File

@ -1406,7 +1406,7 @@ void R_StudioDrawMeshes( dstudiotexture_t * ptexture, short *pskinref, int pass
VectorScale(m_plightcolor, lv_tmp, lv );
}
}
for( j = 0; j < m_pSubModel->nummesh; j++ )
{
float s, t;
@ -1729,7 +1729,7 @@ void R_StudioRenderModel( void )
{
int i;
for (i = 0; i < m_pStudioHeader->numbodyparts ; i++)
for( i = 0; i < m_pStudioHeader->numbodyparts; i++ )
{
R_StudioSetupModel( m_pCurrentEntity->body, i );
R_StudioDrawPoints();
@ -2164,7 +2164,7 @@ void R_AddStudioModelToList( ref_entity_t *entity )
R_StudioSetupRender( 0 );
if(!R_StudioCheckBBox())
return;
if(!entity->shader ) return;
if( !entity->shader ) return;
// add it
R_AddMeshToList( MESH_STUDIO, NULL, entity->shader, entity, 0 );

View File

@ -15,7 +15,6 @@ ref_entity_t *r_worldEntity;
vec3_t r_worldMins, r_worldMaxs;
int r_frameCount;
int r_visFrameCount;
int r_areabitsChanged;
int r_viewCluster, r_viewCluster2;
int r_oldViewCluster, r_oldViewCluster2;
int numRadarEnts = 0;

View File

@ -22,7 +22,7 @@ GLOBAL:
0. Com_Filter убрать внутрь launch.dll ??
1. имплементация нового формата карт OK
2. новый загрузчик моделей на рендере OK
3. проверить 4 варианта winding.c
3. SV_Frame на сервере
4. переписать загрузчик BSP OK
5. отладить R_ImageFreeUnused
6. дописать Image_ForceRGBA OK
@ -31,9 +31,11 @@ GLOBAL:
9. оставить только tmpQuArK OK
10. починить IMAGE_FORCE_RGBA (или избавится ?)
11. LUMA processing OK
12. дописать генератор шейдеров
12. дописать генератор шейдеров OK
13. сделать case -light для bsplib OK
14. сделать поиск в bsp-файле для составления цепочек анимаций
14. зачинить небо OK
15. наладить отрисовку энтить
16. починить PhysWorld
операция "Полная отладка менеджера текстур"
0. анализ менеджера egl и q2e_068