destubify iswalpha and update iswpunct to unicode 6.1
authorRich Felker <dalias@aerifal.cx>
Mon, 23 Apr 2012 19:25:23 +0000 (15:25 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 23 Apr 2012 19:25:23 +0000 (15:25 -0400)
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.

src/ctype/alpha.h [new file with mode: 0644]
src/ctype/iswalnum.c
src/ctype/iswalpha.c
src/ctype/iswpunct.c
src/ctype/punct.h [new file with mode: 0644]

diff --git a/src/ctype/alpha.h b/src/ctype/alpha.h
new file mode 100644 (file)
index 0000000..b318c82
--- /dev/null
@@ -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,
index d3b5667470e91e57d9ea022b8cacf86b76426c53..35dbe02cf3cb3993e701c3acf8f950db101a890c 100644 (file)
@@ -1,9 +1,7 @@
 #include <wchar.h>
 #include <wctype.h>
 
-#undef iswalnum
-
 int iswalnum(wint_t wc)
 {
-       return (unsigned)wc-'0' < 10 || iswalpha(wc);
+       return iswdigit(wc) || iswalpha(wc);
 }
index 0f031eac55681c092ae65b389cc79570a8711469..4007c8a66492393b2f5edde875346a63ede8c114 100644 (file)
@@ -1,6 +1,14 @@
 #include <wctype.h>
 
+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;
 }
index 1414c30c6e33753654fabc68473a534f249f2d84..a829745244f6f95703995645727fcc01fde69b32 100644 (file)
 #include <wctype.h>
-#include <inttypes.h>
 
-/* 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 (file)
index 0000000..402a0ee
--- /dev/null
@@ -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,