From: Rich Felker Date: Mon, 23 Apr 2012 19:25:23 +0000 (-0400) Subject: destubify iswalpha and update iswpunct to unicode 6.1 X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=commitdiff_plain;h=7e38b1ea2bf1a0817942275cea89c959bf446d87 destubify iswalpha and update iswpunct to unicode 6.1 alpha is defined as unicode property "Alphabetic" plus category Nd minus ASCII digits minus 2 special-cased Thai punctuation marks supposedly misclassified by Unicode as letters. punct is defined as all of unicode except control, alphanumeric, and space characters. the tables were generated by a simple tool based on the code posted previously to the mailing list. in the future, this and other code used for maintaining locale/iconv/i18n data will be published either in the main source repository or in a separate locale data generation repository. --- diff --git a/src/ctype/alpha.h b/src/ctype/alpha.h new file mode 100644 index 00000000..b318c827 --- /dev/null +++ b/src/ctype/alpha.h @@ -0,0 +1,125 @@ +18,17,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,17,34,35,36,17,37,38,39,40, +41,42,43,44,17,45,46,47,16,16,48,16,16,16,16,16,16,16,49,50,51,16,52,53,16,16, +17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,54, +17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, +17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, +17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, +17,17,17,55,17,17,17,17,56,17,57,58,59,60,61,62,17,17,17,17,17,17,17,17,17,17, +17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, +17,17,17,17,17,17,17,63,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,64,65,17,66,67,68,69,70,71,72, +73,16,16,16,74,75,76,77,78,16,16,16,79,80,16,16,16,16,81,16,16,16,16,16,16,16, +16,16,17,17,17,82,83,16,16,16,16,16,16,16,16,16,16,16,17,17,17,17,84,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,85,16, +16,16,16,86,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,87,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +88,89,90,91,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +92,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,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,0,0,0,0,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,0,0,0,0,0,0,0,0,254,255,255,7,254,255,255,7,0,0,0,0,0,4,32,4, +255,255,127,255,255,255,127,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,195,255,3,0,31,80,0,0,0,0, +0,0,0,0,0,0,32,0,0,0,0,0,223,60,64,215,255,255,251,255,255,255,255,255,255, +255,255,255,191,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,3,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,0,254,255,255,255,127,2,254,255,255,255,255,0,0,0,0,0,255,191,182, +0,255,255,255,7,7,0,0,0,255,7,255,255,255,255,255,255,255,254,255,195,255,255, +255,255,255,255,255,255,255,255,255,255,239,31,254,225,255,159,0,0,255,255, +255,255,255,255,0,224,255,255,255,255,255,255,255,255,255,255,255,255,3,0,255, +255,255,255,255,7,48,4,255,255,255,252,255,31,0,0,255,255,255,1,0,0,0,0,0,0,0, +0,253,31,0,0,0,0,0,0,240,3,255,127,255,255,255,255,255,255,255,239,255,223, +225,255,207,255,254,254,238,159,249,255,255,253,197,227,159,89,128,176,207, +255,3,0,238,135,249,255,255,253,109,195,135,25,2,94,192,255,63,0,238,191,251, +255,255,253,237,227,191,27,1,0,207,255,0,0,238,159,249,255,255,253,237,227, +159,25,192,176,207,255,2,0,236,199,61,214,24,199,255,195,199,29,129,0,192,255, +0,0,238,223,253,255,255,253,239,227,223,29,96,3,207,255,0,0,236,223,253,255, +255,253,239,227,223,29,96,64,207,255,6,0,236,223,253,255,255,255,255,231,223, +93,128,0,207,255,0,252,236,255,127,252,255,255,251,47,127,128,95,255,0,0,12,0, +254,255,255,255,255,127,255,7,63,32,255,3,0,0,0,0,150,37,240,254,174,236,255, +59,95,32,255,243,0,0,0,0,1,0,0,0,255,3,0,0,255,254,255,255,255,31,254,255,3, +255,255,254,255,255,255,31,0,0,0,0,0,0,0,0,255,255,255,255,255,255,127,249, +255,3,255,255,231,193,255,255,127,64,255,51,255,255,255,255,191,32,255,255, +255,255,255,247,255,255,255,255,255,255,255,255,255,61,127,61,255,255,255,255, +255,61,255,255,255,255,61,127,61,255,127,255,255,255,255,255,255,255,61,255, +255,255,255,255,255,255,255,135,0,0,0,0,255,255,0,0,255,255,255,255,255,255, +255,255,255,255,31,0,254,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,159,255,255,254,255,255,7,255, +255,255,255,255,255,255,255,255,199,1,0,255,223,15,0,255,255,15,0,255,255,15, +0,255,223,13,0,255,255,255,255,255,255,207,255,255,1,128,16,255,3,0,0,0,0,255, +3,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,7,255,255, +255,255,255,255,255,255,63,0,255,255,255,31,255,15,255,1,192,255,255,255,255, +63,31,0,255,255,255,255,255,15,255,255,255,3,255,3,0,0,0,0,255,255,255,15,255, +255,255,255,255,255,255,127,254,255,31,0,255,3,255,3,128,0,0,0,0,0,0,0,0,0,0, +0,255,255,255,255,255,255,239,255,239,15,255,3,0,0,0,0,255,255,255,255,255, +243,255,255,255,255,255,255,191,255,3,0,255,255,255,255,255,255,63,0,255,227, +255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,0,0,0,0,222,111,0,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,0,0,0,0,0,0,0,0,255,255,63,63,255,255,255,255,63,63,255,170,255,255,255, +63,255,255,255,255,255,255,223,95,220,31,207,15,255,31,220,31,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,128,0,0,255,31,0,0,0,0,0,0,0,0,0,0,0,0,132,252,47,62,80,189,255, +243,224,67,0,0,255,255,255,255,255,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,0,0,0,0,0,0,0,0,192,255,255,255,255,255,255,3,0,0,255,255,255, +255,255,127,255,255,255,255,255,127,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,31,120,12,0,255,255,255,255,191,32,255,255,255,255, +255,255,255,128,0,0,255,255,127,0,127,127,127,127,127,127,127,127,255,255,255, +255,0,0,0,0,0,128,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,224,0,0, +0,254,3,62,31,254,255,255,255,255,255,255,255,255,255,127,224,254,255,255,255, +255,255,255,255,255,255,255,247,224,255,255,255,255,63,254,255,255,255,255, +255,255,255,255,255,255,127,0,0,255,255,255,7,0,0,0,0,0,0,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +63,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,31,0,0,0,0,0,0,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,31,0,0,0,0,0,0,0,0,255, +255,255,255,255,63,255,31,255,255,255,15,0,0,255,255,255,255,255,127,240,143, +255,255,255,128,255,255,255,255,255,255,255,255,255,255,0,0,0,0,128,255,252, +255,255,255,255,255,255,255,255,255,255,255,255,121,15,0,255,7,0,0,0,0,0,0,0, +0,0,255,187,247,255,255,255,0,0,0,255,255,255,255,255,255,15,0,255,255,255, +255,255,255,255,255,15,0,255,3,0,0,252,8,255,255,255,255,255,7,255,255,255, +255,7,0,255,255,255,31,255,255,255,255,255,255,247,255,0,128,255,3,0,0,0,0, +255,255,255,255,255,255,127,0,255,63,255,3,255,255,127,4,255,255,255,255,255, +255,255,127,5,0,0,56,255,255,60,0,126,126,126,0,127,127,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,255,255,255,255,255,7,255,3,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,15,0,255,255,127,248,255,255,255, +255,255,15,255,255,255,255,255,255,255,255,255,255,255,255,255,63,255,255,255, +255,255,255,255,255,255,255,255,255,255,3,0,0,0,0,127,0,248,224,255,253,127, +95,219,255,255,255,255,255,255,255,255,255,255,255,255,255,3,0,0,0,248,255, +255,255,255,255,255,255,255,255,255,255,255,63,0,0,255,255,255,255,255,255, +255,255,252,255,255,255,255,255,255,0,0,0,0,0,255,15,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,223,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,0, +0,255,3,254,255,255,7,254,255,255,7,192,255,255,255,255,255,255,255,255,255, +255,127,252,252,252,28,0,0,0,0,255,239,255,255,127,255,255,183,255,63,255,63, +0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,7,0,0,0,0, +0,0,0,0,255,255,255,255,255,255,31,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,0,0,0,0,0,255,255,255,31,255,255,255,255,255,255,1,0,0,0,0,0, +255,255,255,127,0,0,255,255,255,7,0,0,0,0,0,0,255,255,255,63,255,255,255,255, +15,255,62,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,63,255,3,0,0,0,0,0,0,0,0,0,0,63,253,255,255,255,255,191, +145,255,255,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,63,0,255,255, +255,3,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,192,0,0,0,0,0,0,0,0,111,240, +239,254,255,255,15,0,0,0,0,0,255,255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +255,255,255,255,255,255,63,0,255,255,63,0,255,255,7,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,255,255,255,255,255,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,255,255,255,255,255,255,255,255,63,0,0,0,192,255,0,0,252,255,255, +255,255,255,255,1,0,0,255,255,255,1,255,3,255,255,255,255,255,255,199,255,0,0, +0,0,0,0,0,0,255,255,255,255,255,255,255,255,30,0,255,3,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,63,0,255,3,0,0,0,0,0,0,255,255,255, +255,255,255,255,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,255,255,255,255,255,255,255,255,255,255,255,255,7,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,255,255,255,255,255,127,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,255,255,255,255,255,255,255,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,255,255,255,255,255,255,255,255,31,0,255,255,255,255,255,127,0,0, +248,255,0,0,0,0,0,0,0,0,0,0,0,0,3,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,0,0,0,255,255,255,255,255,255,255,255,255,255,223,255,255,255,255, +255,255,255,255,223,100,222,255,235,239,255,255,255,255,255,255,255,191,231, +223,223,255,255,255,123,95,252,253,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,63,255,255,255,253,255,255, +247,255,255,255,247,255,255,223,255,255,255,223,255,255,127,255,255,255,127, +255,255,255,253,255,255,255,253,255,255,247,207,255,255,255,255,255,255,239, +255,255,255,150,254,247,10,132,234,150,170,150,247,247,94,255,251,255,15,238, +251,255,15,0,0,0,0,0,0,0,0, diff --git a/src/ctype/iswalnum.c b/src/ctype/iswalnum.c index d3b56674..35dbe02c 100644 --- a/src/ctype/iswalnum.c +++ b/src/ctype/iswalnum.c @@ -1,9 +1,7 @@ #include #include -#undef iswalnum - int iswalnum(wint_t wc) { - return (unsigned)wc-'0' < 10 || iswalpha(wc); + return iswdigit(wc) || iswalpha(wc); } diff --git a/src/ctype/iswalpha.c b/src/ctype/iswalpha.c index 0f031eac..4007c8a6 100644 --- a/src/ctype/iswalpha.c +++ b/src/ctype/iswalpha.c @@ -1,6 +1,14 @@ #include +static unsigned char table[] = { +#include "alpha.h" +}; + int iswalpha(wint_t wc) { - return (32U|wc)-'a'<26; + if (wc<0x20000U) + return (table[table[wc>>8]*32+((wc&255)>>3)]>>(wc&7))&1; + if (wc<0x2fffeU) + return 1; + return 0; } diff --git a/src/ctype/iswpunct.c b/src/ctype/iswpunct.c index 1414c30c..a8297452 100644 --- a/src/ctype/iswpunct.c +++ b/src/ctype/iswpunct.c @@ -1,138 +1,12 @@ #include -#include -/* The below data is derived from classes (P.|Sm) plus Pattern_Syntax */ - -#define R(a,b) { (b), (b)-(a) } - -static const struct range { - uint32_t base:20; - uint32_t len:12; -} ranges[] = { -R(0x21, 0x2f), -R(0x3a, 0x40), -R(0x5b, 0x60), -R(0x7b, 0x7e), -R(0xa1, 0xa7), -R(0xa9, 0xa9), -R(0xab, 0xac), -R(0xae, 0xae), -R(0xb0, 0xb1), -R(0xb6, 0xb7), -R(0xbb, 0xbb), -R(0xbf, 0xbf), -R(0xd7, 0xd7), -R(0xf7, 0xf7), -R(0x37e, 0x37e), -R(0x387, 0x387), -R(0x3f6, 0x3f6), -R(0x55a, 0x55f), -R(0x589, 0x58a), -R(0x5be, 0x5be), -R(0x5c0, 0x5c0), -R(0x5c3, 0x5c3), -R(0x5c6, 0x5c6), -R(0x5f3, 0x5f4), -R(0x606, 0x60a), -R(0x60c, 0x60d), -R(0x61b, 0x61b), -R(0x61e, 0x61f), -R(0x66a, 0x66d), -R(0x6d4, 0x6d4), -R(0x700, 0x70d), -R(0x7f7, 0x7f9), -R(0x964, 0x965), -R(0x970, 0x970), -R(0xdf4, 0xdf4), -R(0xe4f, 0xe4f), -R(0xe5a, 0xe5b), -R(0xf04, 0xf12), -R(0xf3a, 0xf3d), -R(0xf85, 0xf85), -R(0xfd0, 0xfd4), -R(0x104a, 0x104f), -R(0x10fb, 0x10fb), -R(0x1361, 0x1368), -R(0x166d, 0x166e), -R(0x1680, 0x1680), -R(0x169b, 0x169c), -R(0x16eb, 0x16ed), -R(0x1735, 0x1736), -R(0x17d4, 0x17d6), -R(0x17d8, 0x17da), -R(0x1800, 0x180a), -R(0x180e, 0x180e), -R(0x1944, 0x1945), -R(0x19de, 0x19df), -R(0x1a1e, 0x1a1f), -R(0x1b5a, 0x1b60), -R(0x1c3b, 0x1c3f), -R(0x1c7e, 0x1c7f), -R(0x2010, 0x2027), -R(0x2030, 0x205e), -R(0x207a, 0x207e), -R(0x208a, 0x208e), -R(0x2140, 0x2144), -R(0x214b, 0x214b), -R(0x2190, 0x245f), -R(0x2500, 0x2775), -R(0x2794, 0x2bff), -R(0x2cf9, 0x2cfc), -R(0x2cfe, 0x2cff), -R(0x2e00, 0x2e7f), -R(0x3001, 0x3003), -R(0x3008, 0x3020), -R(0x3030, 0x3030), -R(0x303d, 0x303d), -R(0x30a0, 0x30a0), -R(0x30fb, 0x30fb), -R(0xa60d, 0xa60f), -R(0xa874, 0xa877), -R(0xa8ce, 0xa8cf), -R(0xa92e, 0xa92f), -R(0xa95f, 0xa95f), -R(0xfb29, 0xfb29), -R(0xfd3e, 0xfd3f), -R(0xfe10, 0xfe19), -R(0xfe30, 0xfe52), -R(0xfe54, 0xfe66), -R(0xfe68, 0xfe68), -R(0xfe6a, 0xfe6b), -R(0xff01, 0xff03), -R(0xff05, 0xff0f), -R(0xff1a, 0xff20), -R(0xff3b, 0xff3d), -R(0xff3f, 0xff3f), -R(0xff5b, 0xff65), -R(0xffe2, 0xffe2), -R(0xffe9, 0xffec), -R(0x10100, 0x10101), -R(0x1039f, 0x1039f), -R(0x103d0, 0x103d0), -R(0x1091f, 0x1091f), -R(0x1093f, 0x1093f), -R(0x10a50, 0x10a58), -R(0x12470, 0x12473), -R(0x1d6c1, 0x1d6c1), -R(0x1d6db, 0x1d6db), -R(0x1d6fb, 0x1d6fb), -R(0x1d715, 0x1d715), -R(0x1d735, 0x1d735), -R(0x1d74f, 0x1d74f), -R(0x1d76f, 0x1d76f), -R(0x1d789, 0x1d789), -R(0x1d7a9, 0x1d7a9), -R(0x1d7c3, 0x1d7c3), +static unsigned char table[] = { +#include "punct.h" }; int iswpunct(wint_t wc) { - unsigned c = wc; - int a = 0; - int n = sizeof ranges / sizeof ranges[0]; - do { - n >>= 1; - a += n+1 & (signed)(ranges[a+n].base-c)>>31; - } while (n); - return ranges[a].base-c <= ranges[a].len; + if (wc<0x20000U) + return (table[table[wc>>8]*32+((wc&255)>>3)]>>(wc&7))&1; + return 0; } diff --git a/src/ctype/punct.h b/src/ctype/punct.h new file mode 100644 index 00000000..402a0ee0 --- /dev/null +++ b/src/ctype/punct.h @@ -0,0 +1,112 @@ +18,16,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,16,16,34,35,16,36,37,38,39, +40,41,42,43,16,44,45,46,17,47,48,17,17,49,17,17,17,50,51,52,53,54,55,56,57,17, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,58, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,59,16,60,61,62,63,64,65,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,66,16,16,67,68,16,16,69,70,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,71,16,16,72,16,73,74,75,16,76,16,77, +16,16,16,16,78,79,80,81,16,16,82,16,83,84,16,16,16,16,85,16,16,16,16,16,16,16, +16,16,16,16,16,16,86,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,87,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,88,89,90,91, +16,16,92,93,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +94,16,95,96,97,98,99,100,101,102,16,16,16,16,16,16,16,16,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,0,0,0,0,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,0,0,0,0,254,255,0,252,1,0,0,248,1,0,0,120,0,0,0,0,255,251, +223,251,0,0,128,0,0,0,128,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, +60,0,252,255,224,175,255,255,255,255,255,255,255,255,255,255,223,255,255,255, +255,255,32,64,176,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,252,3,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,252,0,0,0,0,0,134, +254,255,255,255,0,64,73,0,0,0,0,0,24,0,223,255,0,200,0,0,0,0,0,0,0,1,0,60,0,0, +0,0,0,0,0,0,0,0,0,0,16,224,1,30,0,96,255,191,0,0,0,0,0,0,255,7,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,248,207,3,0,0,0,3,0,32,255,127,0,0,0,78,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,252,0,0,0,0,0,0,0,0,0,16,0,32,30,0,48,0,1,0,0,0,0,0,0,0,0, +16,0,32,0,0,0,0,252,15,0,0,0,0,0,0,0,16,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0, +32,0,0,0,0,3,0,0,0,0,0,0,0,0,16,0,32,0,0,0,0,253,0,0,0,0,0,0,0,0,0,0,32,0,0,0, +0,255,7,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,255,0,0,0,0,0,0,0,16,0,32,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,32,0,0,0,0,63,2,0,0,0,0,0,0,0,0,0,4,0,0,0,0,16,0,0,0,0,0,0, +128,0,128,192,223,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,254,255,255, +255,0,252,255,255,0,0,0,0,0,0,0,0,252,0,0,0,0,0,0,192,255,223,255,7,0,0,0,0,0, +0,0,0,0,0,128,6,0,252,0,0,24,62,0,0,128,191,0,204,0,0,0,0,0,0,0,0,0,0,0,8,0,0, +0,0,0,0,0,0,0,0,0,96,255,255,255,31,0,0,255,3,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,96,0,0,1,0,0,24,0,0,0,0,0,0,0,0,0,56,0,0,0,0,16,0,0,0,112,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,48,0,0,254,127,47,0,0,255,3,255,127,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,0,0,0,0,0,0,0,0,0,14,49,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,196,255,255,255,255,0,0,0,192,0,0,0,0,0,0,0,0,1,0,224,159,0,0,0,0, +127,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,0,0,252,255,255,255,31,0,0,0,0, +0,12,0,0,0,0,0,0,64,0,12,240,0,0,0,0,0,0,192,248,0,0,0,0,0,0,0,192,0,0,0,0,0, +0,0,0,255,0,255,255,255,33,16,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,255,255,255,255,127,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +160,3,224,0,224,0,224,0,96,128,248,255,255,255,252,255,255,255,255,255,127,31, +252,241,127,255,127,0,0,255,255,255,3,0,0,255,255,255,255,1,0,123,3,208,193, +175,66,0,12,31,188,255,255,0,0,0,0,0,2,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,255,255, +255,255,127,0,0,0,255,7,0,0,255,255,255,255,255,255,255,255,255,255,63,0,0,0, +0,0,0,252,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,31,255,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,135,3,254,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255, +127,255,15,0,0,0,0,0,0,0,0,255,255,255,251,255,255,255,255,255,255,255,255, +255,255,15,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,63,0,0,0,255,15,30,255,255,255,1,252, +193,224,0,0,0,0,0,0,0,0,0,0,0,30,1,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,255,255,0,0,0,0,255,255,255,255,15,0,0,0,255,255,255,127,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255, +255,255,255,255,127,0,0,0,0,0,0,192,0,224,0,0,0,0,0,0,0,0,0,0,0,128,15,112,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,127,0,3,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,68,8,0,0,0,15,255,3,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0, +16,192,0,0,255,255,3,7,0,0,0,0,0,248,0,0,0,0,8,128,0,0,0,0,0,0,0,0,0,0,8,0, +255,63,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,128,11,0,0,0,0,0,0,0,128,2, +0,0,192,0,0,67,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,0,0,56, +0,0,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,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,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,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,0,0,0,0,0,0,128,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,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,0,0,0,0,0, +0,128,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,255,3,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,255,255,255,3, +127,0,255,255,255,255,247,255,127,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128, +254,255,0,252,1,0,0,248,1,0,0,248,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,0, +48,135,255,255,255,255,255,143,255,0,0,0,0,0,0,224,255,255,7,255,15,0,0,0,0,0, +0,255,255,255,255,255,63,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,192,143,0,0,0,128,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,0,0,0,135,255,0,255,1,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,254,0,0,0,255,0,0,0,255,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,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,63, +252,255,63,0,0,0,3,0,0,0,0,0,0,254,3,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,15,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,225,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,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,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,0,0,0,0,0,0,128,7,0,0,0,0,0,0,0,0,0,0, +0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,63,0,255,255,255,255,127,254, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,63,0,0,0,0,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,127,0,255,255,3, +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,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,8,0,0,0,8,0,0,32,0,0,0,32,0,0,128,0,0,0,128,0,0,0,2,0,0,0,2,0,0,8,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,0,0,0,0,0,0,0,0,0,3,0, +255,255,255,255,255,15,255,255,255,255,255,255,255,255,255,255,255,255,15,0, +255,127,254,127,254,255,254,255,0,0,0,0,255,7,255,255,255,127,255,255,255,255, +255,255,255,15,255,255,255,255,255,7,0,0,0,0,0,0,0,0,192,255,255,255,7,0,255, +255,255,255,255,7,255,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255, +255,255,1,0,191,255,255,255,255,255,255,255,255,31,255,255,15,0,255,255,255, +255,223,7,0,0,255,255,1,0,255,255,255,255,255,255,255,127,253,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,30, +255,255,255,255,255,255,255,63,15,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,248,255,255,255,255,255,255,255,255,225,255,0,0,0,0,0,0,255,255,255,255, +255,255,255,255,63,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,