• R/O
  • SSH
  • HTTPS

owata:


File Info

Rev. 2
Size 95,346 bytes
Time 2008-02-23 12:17:08
Author bird_may_nike
Log Message

(empty log message)

Content

/*
 * intraFont.c
 * This file is used to display the PSP's internal font (pgf firmware files)
 * intraFont Version 0.22 by BenHur - http://www.psp-programming.com/benhur
 *
 * Uses parts of pgeFont by InsertWittyName - http://insomniac.0x89.org
 *
 * This work is licensed under the Creative Commons Attribution-Share Alike 3.0 License.
 * See LICENSE for more details.
 *
 */

#include <pspkernel.h>
#include <pspgu.h>
#include <pspgum.h>
#include <pspdisplay.h>

#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <malloc.h>

#include "intraFont.h"

static unsigned int __attribute__((aligned(16))) clut[16];


unsigned long intraFontGetV(unsigned long n, unsigned char *p, unsigned long *b) {
	unsigned long i,v=0;
	for(i=0;i<n;i++) {
	    v += ( ( p[(*b)/8] >> ((*b)%8) ) & 1) << i;
		(*b)++;
	}
	return v;
}

unsigned long* intraFontGetTable(FILE *file, unsigned long n_elements, unsigned long bp_element) {
	unsigned long len_table = ((n_elements*bp_element+31)/32)*4;
	unsigned char *raw_table = (unsigned char*)malloc(len_table*sizeof(unsigned char));
	if (raw_table == NULL) return NULL;
	if (fread(raw_table, len_table*sizeof(unsigned char), 1, file) != 1) {
		free(raw_table);
		return NULL;
	}
	unsigned long *table = (unsigned long*)malloc(n_elements*sizeof(unsigned long));
	if (table == NULL) {
		free(raw_table);
		return NULL;
	}
	unsigned long i,j=0;
	for (i=0;i<n_elements;i++) {
		table[i] = intraFontGetV(bp_element,raw_table,&j);
	}
	free(raw_table);
	return table;
}

unsigned char intraFontGetBMP(intraFont *font, unsigned short id, unsigned char glyphtype) {
	if (!font) return 0;
	if (font->options & INTRAFONT_CACHE_ASCII) return 0; //swizzeled texture
	
	Glyph *glyph;
	if (glyphtype & PGF_CHARGLYPH) {
		glyph = &(font->glyph[id]);
	} else {
		glyph = &(font->shadowGlyph[id]);
	}
	if (glyph->flags & PGF_CACHED) return 1;
	unsigned long b = glyph->ptr*8;
	
	if (glyph->width > 0 && glyph->height > 0) {
		if (!(glyph->flags & PGF_BMP_H_ROWS) != !(glyph->flags & PGF_BMP_V_ROWS)) { //H_ROWS xor V_ROWS
			if ((font->texX + glyph->width + 1) > font->texWidth) {
				font->texY += font->texYSize + 1;
				font->texX = 1;
			}
			if ((font->texY + glyph->height + 1) > font->texHeight) {
				font->texY = 1;
				font->texX = 1;
			}
			glyph->x=font->texX;
			glyph->y=font->texY;
            
			/*draw bmp*/
			int i=0,j,xx,yy;
			unsigned char nibble, value = 0;
			while (i<(glyph->width*glyph->height)) {
				nibble = intraFontGetV(4,font->fontdata,&b);
				if (nibble < 8) value = intraFontGetV(4,font->fontdata,&b);
				for (j=0; (j<=((nibble<8)?(nibble):(15-nibble))) && (i<(glyph->width*glyph->height)); j++) {
					if (nibble >= 8) value = intraFontGetV(4,font->fontdata,&b);
					if (glyph->flags & PGF_BMP_H_ROWS) {
						xx = i%glyph->width;
						yy = i/glyph->width;
					} else {
						xx = i/glyph->height;
						yy = i%glyph->height;
					}
					if ((font->texX + xx) & 1) {
						font->texture[((font->texX + xx) + (font->texY + yy) * font->texWidth)>>1] &= 0x0F;
						font->texture[((font->texX + xx) + (font->texY + yy) * font->texWidth)>>1] |= (value<<4);
					} else {
						font->texture[((font->texX + xx) + (font->texY + yy) * font->texWidth)>>1] &= 0xF0;
						font->texture[((font->texX + xx) + (font->texY + yy) * font->texWidth)>>1] |= (value);
					}
					i++;
				}				
			}
            //erase border around glyph
            for (i = font->texX/2; i < (font->texX+glyph->width+1)/2; i++) {
                font->texture[i + (font->texY-1)*font->texWidth/2] = 0;
                font->texture[i + (font->texY+glyph->height)*font->texWidth/2] = 0;
            }
            for (i = font->texY-1; i < (font->texY+glyph->height+1); i++) {
                font->texture[((font->texX-1) + (i*font->texWidth))>>1] &= (font->texX & 1) ? 0xF0 : 0x0F;
                font->texture[((font->texX+glyph->width) + (i*font->texWidth))>>1] &= ((font->texX+glyph->width) & 1) ? 0x0F : 0xF0;
            }
			font->texX += glyph->width+1; //add empty gap to prevent interpolation artifacts from showing
			
			//mark dirty glyphs as uncached
			for (i = 0; i < font->n_chars; i++) {
				if ( (font->glyph[i].flags & PGF_CACHED) && (font->glyph[i].y == glyph->y) ) {
					if ( (font->glyph[i].x+font->glyph[i].width+1) > glyph->x && font->glyph[i].x < (glyph->x+glyph->width+1) ) {
						font->glyph[i].flags -= PGF_CACHED;
					}
				}
			}
			for (i = 0; i < font->n_shadows; i++) {
				if ( (font->shadowGlyph[i].flags & PGF_CACHED) && (font->shadowGlyph[i].y == glyph->y) ) {
					if ( (font->shadowGlyph[i].x+font->shadowGlyph[i].width+1) > glyph->x && font->shadowGlyph[i].x < (glyph->x+glyph->width+1) ) {
						font->shadowGlyph[i].flags -= PGF_CACHED;
					}
				}
			}
		} else return 0; //transposition=0 or overlay glyph
	} else {
		glyph->x=0;
		glyph->y=0;
	}
	glyph->flags |= PGF_CACHED;
	return 1;
}

unsigned short intraFontGetGlyph(unsigned char *data, unsigned long *b, unsigned char glyphtype, signed long *advancemap, Glyph *glyph) {
    if (glyphtype & PGF_CHARGLYPH) {
        (*b) += 14; //skip offset pos value of shadow
    } else {
        (*b) += intraFontGetV(14,data,b)*8+14; //skip to shadow 
    }
    glyph->width=intraFontGetV(7,data,b);
	glyph->height=intraFontGetV(7,data,b);
	glyph->left=intraFontGetV(7,data,b);
	if (glyph->left >= 64) glyph->left -= 128;
	glyph->top=intraFontGetV(7,data,b);
	if (glyph->top >= 64) glyph->top -= 128;
    glyph->flags = intraFontGetV(6,data,b);
    if (glyph->flags & PGF_CHARGLYPH) {
        (*b) += 7; //skip magic number
		glyph->shadowID = intraFontGetV(9,data,b);
		(*b) += 24 + ((glyph->flags & PGF_NO_EXTRA1)?0:56) + ((glyph->flags & PGF_NO_EXTRA2)?0:56) + ((glyph->flags & PGF_NO_EXTRA3)?0:56); //skip to 6bits before end of header
		glyph->advance = advancemap[intraFontGetV(8,data,b)*2]/16;
    } else {
		glyph->shadowID = 65535;
        glyph->advance = 0;
    }    
	glyph->ptr = (*b)/8;
    return 1;
}

unsigned short intraFontGetID(intraFont* font, unsigned short ucs) {
	unsigned short j, id = 0;
	char found = 0;
	for (j = 0; j < font->charmap_compr_len && !found; j++) {
		if ((ucs >= font->charmap_compr[j*2]) && (ucs < (font->charmap_compr[j*2]+font->charmap_compr[j*2+1]))) {
			id += ucs - font->charmap_compr[j*2];
			found = 1;
		} else {
			id += font->charmap_compr[j*2+1];
		}
	}
	if (!found) return 65535;	//char not in charmap
	id = font->charmap[id];
	if (id >= font->n_chars) return 65535; //char not in fontdata or not in ASCII-cache
	//if (font->glyph[id].width == 0 || font->glyph[id].height == 0) return 65535; //char has no valid glyph
	return id;
}

static int intraFontSwizzle(intraFont *font) {
	int height = font->texHeight;
	int byteWidth = font->texWidth>>1;
	int textureSize = byteWidth*height;

	int rowBlocks = (byteWidth>>4);
	int rowBlocksAdd = (rowBlocks - 1)<<7;
	unsigned int blockAddress = 0;
	unsigned int *src = (unsigned int*) font->texture;
	static unsigned char *tData;

	tData = (unsigned char*) memalign(16,textureSize);
	if(!tData) return 0;

	int i,j;
	for(j = 0; j < height; j++, blockAddress += 16) {
		unsigned int *block = ((unsigned int*)&tData[blockAddress]);
		for(i=0; i < rowBlocks; i++) {
			*block++ = *src++;
			*block++ = *src++;
			*block++ = *src++;
			*block++ = *src++;
			block += 28;
		}
		if((j & 0x7) == 0x7) blockAddress += rowBlocksAdd;
	}

	free(font->texture);
	font->texture = tData;
	font->options |= INTRAFONT_CACHE_ASCII;

	return 1;
}

int intraFontPreCache(intraFont *font, unsigned short options) {
	if (!font) return 0;
	if (!(options & INTRAFONT_CACHE_ASCII)) return 0; //no precaching requested
	if (font->options & INTRAFONT_CACHE_ASCII) return 0; //already prechached?
		
    //cache all glyphs
	int i,y;
	font->texX = 1;
	font->texY = 1;
	font->texYSize = 0;
	for (i = 0; i < font->n_chars; i++) {
		y = font->texY;
		intraFontGetBMP(font,i,PGF_CHARGLYPH);		
		if (font->texY > y || font->texYSize < font->glyph[i].height) font->texYSize = font->glyph[i].height; //minimize ysize after newline in cache(only valid for precached glyphs)
		if (font->texY < y) return 0;                               //char did not fit into cache -> abort precache (should reset cache and glyph.flags)
	}
	for (i=0;i<font->n_shadows;i++) {
		y = font->texY;
		intraFontGetBMP(font,i,PGF_SHADOWGLYPH);
		if (font->texY > y || font->texYSize < font->shadowGlyph[i].height) font->texYSize = font->shadowGlyph[i].height; //minimize ysize
		if (font->texY < y) return 0;                               //char did not fit into cache -> abort precache (should reset cache and glyph.flags)
	}
	font->texHeight = ((font->texY) + (font->texYSize) + 7)&~7;     
	if (font->texHeight > font->texWidth) font->texHeight = font->texWidth;
	
	//reduce fontdata
	int index = 0, j;
	for (i = 0; i < font->n_chars; i++) {
		if ((font->glyph[i].flags & PGF_BMP_H_ROWS) && (font->glyph[i].flags & PGF_BMP_V_ROWS)) {
			for (j = 0; j < 6; j++, index++) {
				font->fontdata[index] = font->fontdata[(font->glyph[i].ptr)+j];
			}
			font->glyph[i].ptr = index - j;
		}
	}
	if (index == 0)	{
		free(font->fontdata); 
		font->fontdata = NULL;
	} else {
		font->fontdata = (unsigned char*)realloc(font->fontdata,index*sizeof(unsigned char));		
	}

	//swizzle texture
	sceKernelDcacheWritebackAll();
	intraFontSwizzle(font);
	sceKernelDcacheWritebackAll();
	
	return 1;
}

intraFont* intraFontLoad(const char *filename, unsigned short options) {
    unsigned long i,j;
	
    //open pgf file and get file size
    FILE *file = fopen(filename, "rb"); /* read from the file in binary mode */
	if ( file == NULL ) {
		return NULL;
	}
	fseek(file, 0, SEEK_END);
    unsigned long filesize = ftell(file);
	fseek(file, 0, SEEK_SET);
	
	//read pgf header
	PGF_Header header;
	if (fread(&header, sizeof(PGF_Header), 1, file) != 1) {
		fclose(file);
		return NULL;
	}
	
	//pgf header tests: valid and known pgf file?
	if ((strncmp(header.pgf_id,"PGF0",4) != 0) || (header.version != 6) || (header.revision != 2 && header.revision != 3) ||
		(header.charmap_len > 65535) || (header.charptr_len > 65535) || (header.charmap_bpe > 32) || (header.charptr_bpe > 32) ||
		(header.charmap_min > header.charmap_max) || (header.shadowmap_len > 511) || (header.shadowmap_bpe > 16)) {
	    fclose(file);
		return NULL; 
	}
	
	//create and initialize font structure
	intraFont* font = (intraFont*)malloc(sizeof(intraFont));
	if (font == NULL) {
		fclose(file);
		return NULL;
	}	
	
	font->n_chars = (unsigned short)header.charptr_len;
	font->charmap_compr_len = (header.revision == 3)?7:1;
	font->texWidth = (options & INTRAFONT_CACHE_LARGE) ? (512) : (256);
	font->texHeight = font->texWidth;
	font->texX = 1;
	font->texY = 1;
	font->texYSize = 0;	
	font->advancex = header.fixedsize[0]/16;
	font->advancey = header.fixedsize[1]/16;
	font->n_shadows = (unsigned short)header.shadowmap_len;
	font->shadowscale = (unsigned char)header.shadowscale[0];
    font->options = options; 
	if ((options & INTRAFONT_CACHE_ASCII) ) font->options -= INTRAFONT_CACHE_ASCII; //pre-cached texture enabled at the end of font-load
    font->size = 1.0f;               //default size
    font->color = 0xFFFFFFFF;        //non-transparent white
    font->shadowColor = 0xFF000000;  //non-transparent black
	
	font->filename = (char*)malloc((strlen(filename)+1)*sizeof(char));
	font->glyph = (Glyph*)malloc(font->n_chars*sizeof(Glyph));
	font->shadowGlyph = (Glyph*)malloc(font->n_shadows*sizeof(Glyph));
	font->charmap_compr = (unsigned short*)malloc(font->charmap_compr_len*sizeof(unsigned short)*2);
	font->charmap = (unsigned short*)malloc(header.charmap_len*sizeof(unsigned short));
	font->texture = (unsigned char*)memalign(16,font->texWidth*font->texHeight>>1);

	if (!font->filename || !font->glyph || !font->shadowGlyph || !font->charmap_compr || !font->charmap || !font->texture) {
		fclose(file);
		intraFontUnload(font);
		return NULL;
	}	
	strcpy(font->filename,filename);
	memset(font->glyph, 0, font->n_chars*sizeof(Glyph)); //make sure glyphs are initialized with 0
	memset(font->shadowGlyph, 0, font->n_shadows*sizeof(Glyph));
	
	//read advance table
    fseek(file, header.header_len+(header.table1_len+header.table2_len+header.table3_len)*8, SEEK_SET);
	signed long *advancemap = (signed long*)malloc(header.advance_len*sizeof(signed long)*2);
	if (!advancemap) {
		fclose(file);
		intraFontUnload(font);
		return NULL;
	}	
	if (fread(advancemap, header.advance_len*sizeof(signed long)*2, 1, file) != 1) {
		free(advancemap);
		fclose(file);
		intraFontUnload(font);
		return NULL;
	}	
	
	//read shadowmap
	unsigned long *ucs_shadowmap = intraFontGetTable(file, header.shadowmap_len, header.shadowmap_bpe);
	if (ucs_shadowmap == NULL) {
		free(advancemap);	
		fclose(file);
		intraFontUnload(font);
		return NULL;
	}
	
	//version 6.3 charmap compression
	if (header.revision == 3) {
		if (fread(font->charmap_compr, font->charmap_compr_len*sizeof(unsigned short)*2, 1, file) != 1) {
			free(advancemap);		
		    free(ucs_shadowmap);
			fclose(file);
			intraFontUnload(font);
			return NULL;
		}
	} else {
		font->charmap_compr[0] = header.charmap_min;
		font->charmap_compr[1] = header.charmap_len;
	}
	
	//read charmap
	if (header.charmap_bpe == 16) { //read directly from file...
		if (fread(font->charmap, header.charmap_len*sizeof(unsigned short), 1, file) != 1) {
			free(advancemap);	
			free(ucs_shadowmap);
			fclose(file);
			intraFontUnload(font);
			return NULL;
		}
	} else {
		unsigned long *id_charmap = intraFontGetTable(file, header.charmap_len, header.charmap_bpe);
		if (id_charmap == NULL) {
			free(advancemap);	
			free(ucs_shadowmap);
			fclose(file);
			intraFontUnload(font);
			return NULL;
		}
		for (i=0;i<header.charmap_len;i++) {
			font->charmap[i]=(unsigned short)((id_charmap[i] < font->n_chars)?id_charmap[i]:65535);
		}
		free(id_charmap);
	}
	
	//read charptr
	unsigned long *charptr = intraFontGetTable(file, header.charptr_len, header.charptr_bpe);
	if (charptr == NULL) {
		free(advancemap);	
	    free(ucs_shadowmap);
		fclose(file);
		intraFontUnload(font);
		return NULL;
	}
	
	//read raw fontdata
	unsigned long start_fontdata = ftell(file);
	unsigned long len_fontdata = filesize-start_fontdata;
	font->fontdata = (unsigned char*)malloc(len_fontdata*sizeof(unsigned char));
	if (font->fontdata == NULL) {
		free(advancemap);	
	    free(ucs_shadowmap);
		free(charptr);
		fclose(file);
		intraFontUnload(font);
		return NULL;
	}
	if (fread(font->fontdata, len_fontdata*sizeof(unsigned char), 1, file) != 1) {
		free(advancemap);	
		free(ucs_shadowmap);
		free(charptr);
		fclose(file);
		intraFontUnload(font);
		return NULL;
	}
	
	//close file	
	fclose(file);
	
	//count ascii chars and reduce mem required
	if ((options & PGF_CACHE_MASK) == INTRAFONT_CACHE_ASCII) {
		font->n_chars = 1; //assume there's at least one char (needed for intraFontGetID to work properly)
		for (i=0; i<128; i++) {
			if (intraFontGetID(font,i) < 65535) (font->n_chars)++;
		}
		(font->n_chars)--; //correct the above assumption
		if (font->n_chars == 0) { //no ASCII chars in fontfile -> abort
			free(advancemap);			
			free(ucs_shadowmap);
			free(charptr);
			intraFontUnload(font);
			return NULL;
		}
		font->glyph = (Glyph*)realloc(font->glyph,font->n_chars*sizeof(Glyph));
		font->charmap_compr[1] = 128 - font->charmap_compr[0];
		font->charmap = (unsigned short*)realloc(font->charmap,font->charmap_compr[1]*sizeof(unsigned short)); 
	}
	
	//populate chars and count space used in cache to prebuffer all chars
	int x=1,y=1,ysize=0;
	for (i = 0; i < font->n_chars; i++) {
		j = charptr[i]*4*8;
		if (!intraFontGetGlyph(font->fontdata, &j, PGF_CHARGLYPH, advancemap, &(font->glyph[i]))) {
			free(advancemap);			
			free(ucs_shadowmap);
			free(charptr);
			intraFontUnload(font);
			return NULL;
		}
		if (!(font->glyph[i].flags & PGF_BMP_H_ROWS) != !(font->glyph[i].flags & PGF_BMP_V_ROWS)) { //H_ROWS xor V_ROWS (real glyph, not overlay)
			if (font->glyph[i].height > font->texYSize) font->texYSize = font->glyph[i].height;     //find max glyph height			
			if ((x + font->glyph[i].width) > font->texWidth) {                             
				y += ysize+1;
				x = 1;
				ysize = 0;
			} 
			if (font->glyph[i].height > ysize) ysize = font->glyph[i].height;
			x += font->glyph[i].width+1;
		}		
	} 
	
	//populate shadows and count space (only for chars needed)
	unsigned short char_id, shadow_id = 0;
	for (i = 0; i < font->n_chars; i++) {
		shadow_id = font->glyph[i].shadowID;
		char_id = intraFontGetID(font,ucs_shadowmap[shadow_id]);
		if (char_id < font->n_chars && font->shadowGlyph[shadow_id].shadowID == 0) { //valid char and shadow glyph not yet loaded
			j = charptr[char_id]*4*8;
			if (!intraFontGetGlyph(font->fontdata, &j, PGF_SHADOWGLYPH, NULL, &(font->shadowGlyph[shadow_id]))) {
				free(advancemap);			
				free(ucs_shadowmap);
				free(charptr);
				intraFontUnload(font);
				return NULL;
			}			
			if (!(font->shadowGlyph[shadow_id].flags & PGF_BMP_H_ROWS) != !(font->shadowGlyph[shadow_id].flags & PGF_BMP_V_ROWS)) { //H_ROWS xor V_ROWS (real glyph, not overlay)
				if (font->shadowGlyph[shadow_id].height > font->texYSize) font->texYSize = font->shadowGlyph[shadow_id].height;     //find max glyph height
				if ((x + font->shadowGlyph[shadow_id].width) > font->texWidth) {                          
					y += ysize+1;
					x = 1;
					ysize = 0;
				} 
				if (font->shadowGlyph[shadow_id].height > ysize) ysize = font->shadowGlyph[shadow_id].height;
				x += font->shadowGlyph[shadow_id].width+1;
			}
		}		              
	}
	
	//free temp stuff
	free(advancemap);
	free(ucs_shadowmap);
	free(charptr);
	
	//cache chars, swizzle texture and free unneeded stuff (if INTRAFONT_CACHE_ALL or _ASCII)
	sceKernelDcacheWritebackAll();
	if ( (options & INTRAFONT_CACHE_ASCII) && ((y + ysize + 1) <= font->texHeight) ) { //cache all and does it fit into cache?
		if (!intraFontPreCache(font,options)) {
			intraFontUnload(font);
			return NULL;			
		}
	}
	sceKernelDcacheWritebackAll();

	return font;
}

void intraFontUnload(intraFont *font) {
	if (!font) return;
    if (font->filename) free(font->filename);
    if (font->fontdata) free(font->fontdata);
	if (font->texture) free(font->texture);
	if (font->charmap_compr) free(font->charmap_compr);
	if (font->charmap) free(font->charmap);
	if (font->glyph) free(font->glyph);
	if (font->shadowGlyph) free(font->shadowGlyph);
	if (font) free(font);
	font = NULL;
}

int intraFontInit(void) {
	int n;
	for(n = 0; n < 16; n++)
		clut[n] = ((n * 17) << 24) | 0xffffff;
	return 1;
}

void intraFontShutdown(void) {
	//Nothing yet
}

void intraFontActivate(intraFont *font) {
	if(!font) return;
	if(!font->texture) return;

	sceGuClutMode(GU_PSM_8888, 0, 255, 0);
	sceGuClutLoad(2, clut);

	sceGuEnable(GU_TEXTURE_2D);
	sceGuTexMode(GU_PSM_T4, 0, 0, (font->options & INTRAFONT_CACHE_ASCII) ? 1 : 0);
	sceGuTexImage(0, font->texWidth, font->texWidth, font->texWidth, font->texture);
	sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
	sceGuTexEnvColor(0x0);
	sceGuTexOffset(0.0f, 0.0f);
	sceGuTexWrap(GU_CLAMP, GU_CLAMP);
	sceGuTexFilter(GU_LINEAR, GU_LINEAR);
}

void intraFontSetStyle(intraFont *font, float size, unsigned int color, unsigned int shadowColor, unsigned short options) {
	if (!font) return;
	font->size = size;
	font->color = color;
	font->shadowColor = shadowColor;
	font->options = (options & PGF_OPTIONS_MASK) + (font->options & PGF_STRING_MASK) + (font->options & PGF_CACHE_MASK);
	if ((font->options & PGF_WIDTH_MASK) == 0) font->options |= ((font->advancex / 8) & PGF_WIDTH_MASK);
}

unsigned short intraFontSJIS2UCS2(unsigned char **text) {

	unsigned short ucs2 = 0;
	
#ifndef INTRAFONT_NO_SJIS
    static const unsigned short s2u_80[]= { 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_81[]= { 0x3000,0x3001,0x3002,0xff0c,0xff0e,0x30fb,0xff1a,0xff1b, 0xff1f,0xff01,0x309b,0x309c,0x00b4,0xff40,0x00a8,0xff3e, 0xffe3,0xff3f,0x30fd,0x30fe,0x309d,0x309e,0x3003,0x4edd, 0x3005,0x3006,0x3007,0x30fc,0x2015,0x2010,0xff0f,0xff3c, 0xff5e,0x2225,0xff5c,0x2026,0x2025,0x2018,0x2019,0x201c, 0x201d,0xff08,0xff09,0x3014,0x3015,0xff3b,0xff3d,0xff5b, 0xff5d,0x3008,0x3009,0x300a,0x300b,0x300c,0x300d,0x300e, 0x300f,0x3010,0x3011,0xff0b,0xff0d,0x00b1,0x00d7,0x30fb, 0x00f7,0xff1d,0x2260,0xff1c,0xff1e,0x2266,0x2267,0x221e, 0x2234,0x2642,0x2640,0x00b0,0x2032,0x2033,0x2103,0xffe5, 0xff04,0xffe0,0xffe1,0xff05,0xff03,0xff06,0xff0a,0xff20, 0x00a7,0x2606,0x2605,0x25cb,0x25cf,0x25ce,0x25c7,0x25c6, 0x25a1,0x25a0,0x25b3,0x25b2,0x25bd,0x25bc,0x203b,0x3012, 0x2192,0x2190,0x2191,0x2193,0x3013,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x2208,0x220b,0x2286,0x2287,0x2282,0x2283,0x222a,0x2229, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x2227,0x2228,0xffe2,0x21d2,0x21d4,0x2200,0x2203,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x2220,0x22a5,0x2312,0x2202,0x2207,0x2261, 0x2252,0x226a,0x226b,0x221a,0x223d,0x221d,0x2235,0x222b, 0x222c,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x212b,0x2030,0x266f,0x266d,0x266a,0x2020,0x2021,0x00b6, 0x30fb,0x30fb,0x30fb,0x30fb,0x25ef,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_82[]= {	0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0xff10, 0xff11,0xff12,0xff13,0xff14,0xff15,0xff16,0xff17,0xff18, 0xff19,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0xff21,0xff22,0xff23,0xff24,0xff25,0xff26,0xff27,0xff28, 0xff29,0xff2a,0xff2b,0xff2c,0xff2d,0xff2e,0xff2f,0xff30, 0xff31,0xff32,0xff33,0xff34,0xff35,0xff36,0xff37,0xff38, 0xff39,0xff3a,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0xff41,0xff42,0xff43,0xff44,0xff45,0xff46,0xff47, 0xff48,0xff49,0xff4a,0xff4b,0xff4c,0xff4d,0xff4e,0xff4f, 0xff50,0xff51,0xff52,0xff53,0xff54,0xff55,0xff56,0xff57, 0xff58,0xff59,0xff5a,0x30fb,0x30fb,0x30fb,0x30fb,0x3041, 0x3042,0x3043,0x3044,0x3045,0x3046,0x3047,0x3048,0x3049, 0x304a,0x304b,0x304c,0x304d,0x304e,0x304f,0x3050,0x3051, 0x3052,0x3053,0x3054,0x3055,0x3056,0x3057,0x3058,0x3059, 0x305a,0x305b,0x305c,0x305d,0x305e,0x305f,0x3060,0x3061, 0x3062,0x3063,0x3064,0x3065,0x3066,0x3067,0x3068,0x3069, 0x306a,0x306b,0x306c,0x306d,0x306e,0x306f,0x3070,0x3071, 0x3072,0x3073,0x3074,0x3075,0x3076,0x3077,0x3078,0x3079, 0x307a,0x307b,0x307c,0x307d,0x307e,0x307f,0x3080,0x3081, 0x3082,0x3083,0x3084,0x3085,0x3086,0x3087,0x3088,0x3089, 0x308a,0x308b,0x308c,0x308d,0x308e,0x308f,0x3090,0x3091, 0x3092,0x3093,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_83[]= {	0x30a1,0x30a2,0x30a3,0x30a4,0x30a5,0x30a6,0x30a7,0x30a8, 0x30a9,0x30aa,0x30ab,0x30ac,0x30ad,0x30ae,0x30af,0x30b0, 0x30b1,0x30b2,0x30b3,0x30b4,0x30b5,0x30b6,0x30b7,0x30b8, 0x30b9,0x30ba,0x30bb,0x30bc,0x30bd,0x30be,0x30bf,0x30c0, 0x30c1,0x30c2,0x30c3,0x30c4,0x30c5,0x30c6,0x30c7,0x30c8, 0x30c9,0x30ca,0x30cb,0x30cc,0x30cd,0x30ce,0x30cf,0x30d0, 0x30d1,0x30d2,0x30d3,0x30d4,0x30d5,0x30d6,0x30d7,0x30d8, 0x30d9,0x30da,0x30db,0x30dc,0x30dd,0x30de,0x30df,0x30fb, 0x30e0,0x30e1,0x30e2,0x30e3,0x30e4,0x30e5,0x30e6,0x30e7, 0x30e8,0x30e9,0x30ea,0x30eb,0x30ec,0x30ed,0x30ee,0x30ef, 0x30f0,0x30f1,0x30f2,0x30f3,0x30f4,0x30f5,0x30f6,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x0391, 0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399, 0x039a,0x039b,0x039c,0x039d,0x039e,0x039f,0x03a0,0x03a1, 0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,0x03a9,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x03b1, 0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9, 0x03ba,0x03bb,0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1, 0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_84[]= {	0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0401,0x0416, 0x0417,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e, 0x041f,0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426, 0x0427,0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e, 0x042f,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0451,0x0436, 0x0437,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x30fb, 0x043e,0x043f,0x0440,0x0441,0x0442,0x0443,0x0444,0x0445, 0x0446,0x0447,0x0448,0x0449,0x044a,0x044b,0x044c,0x044d, 0x044e,0x044f,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x2500, 0x2502,0x250c,0x2510,0x2518,0x2514,0x251c,0x252c,0x2524, 0x2534,0x253c,0x2501,0x2503,0x250f,0x2513,0x251b,0x2517, 0x2523,0x2533,0x252b,0x253b,0x254b,0x2520,0x252f,0x2528, 0x2537,0x253f,0x251d,0x2530,0x2525,0x2538,0x2542,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb};
    #define s2u_85 s2u_80
    #define s2u_86 s2u_80
    static const unsigned short s2u_87[]= {	0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467, 0x2468,0x2469,0x246a,0x246b,0x246c,0x246d,0x246e,0x246f, 0x2470,0x2471,0x2472,0x2473,0x2160,0x2161,0x2162,0x2163, 0x2164,0x2165,0x2166,0x2167,0x2168,0x2169,0x30fb,0x3349, 0x3314,0x3322,0x334d,0x3318,0x3327,0x3303,0x3336,0x3351, 0x3357,0x330d,0x3326,0x3323,0x332b,0x334a,0x333b,0x339c, 0x339d,0x339e,0x338e,0x338f,0x33c4,0x33a1,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x337b,0x30fb, 0x301d,0x301f,0x2116,0x33cd,0x2121,0x32a4,0x32a5,0x32a6, 0x32a7,0x32a8,0x3231,0x3232,0x3239,0x337e,0x337d,0x337c, 0x2252,0x2261,0x222b,0x222e,0x2211,0x221a,0x22a5,0x2220, 0x221f,0x22bf,0x2235,0x2229,0x222a,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_88[]= { 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x4e9c, 0x5516,0x5a03,0x963f,0x54c0,0x611b,0x6328,0x59f6,0x9022, 0x8475,0x831c,0x7a50,0x60aa,0x63e1,0x6e25,0x65ed,0x8466, 0x82a6,0x9bf5,0x6893,0x5727,0x65a1,0x6271,0x5b9b,0x59d0, 0x867b,0x98f4,0x7d62,0x7dbe,0x9b8e,0x6216,0x7c9f,0x88b7, 0x5b89,0x5eb5,0x6309,0x6697,0x6848,0x95c7,0x978d,0x674f, 0x4ee5,0x4f0a,0x4f4d,0x4f9d,0x5049,0x56f2,0x5937,0x59d4, 0x5a01,0x5c09,0x60df,0x610f,0x6170,0x6613,0x6905,0x70ba, 0x754f,0x7570,0x79fb,0x7dad,0x7def,0x80c3,0x840e,0x8863, 0x8b02,0x9055,0x907a,0x533b,0x4e95,0x4ea5,0x57df,0x80b2, 0x90c1,0x78ef,0x4e00,0x58f1,0x6ea2,0x9038,0x7a32,0x8328, 0x828b,0x9c2f,0x5141,0x5370,0x54bd,0x54e1,0x56e0,0x59fb, 0x5f15,0x98f2,0x6deb,0x80e4,0x852d,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_89[]= { 0x9662,0x9670,0x96a0,0x97fb,0x540b,0x53f3,0x5b87,0x70cf, 0x7fbd,0x8fc2,0x96e8,0x536f,0x9d5c,0x7aba,0x4e11,0x7893, 0x81fc,0x6e26,0x5618,0x5504,0x6b1d,0x851a,0x9c3b,0x59e5, 0x53a9,0x6d66,0x74dc,0x958f,0x5642,0x4e91,0x904b,0x96f2, 0x834f,0x990c,0x53e1,0x55b6,0x5b30,0x5f71,0x6620,0x66f3, 0x6804,0x6c38,0x6cf3,0x6d29,0x745b,0x76c8,0x7a4e,0x9834, 0x82f1,0x885b,0x8a60,0x92ed,0x6db2,0x75ab,0x76ca,0x99c5, 0x60a6,0x8b01,0x8d8a,0x95b2,0x698e,0x53ad,0x5186,0x30fb, 0x5712,0x5830,0x5944,0x5bb4,0x5ef6,0x6028,0x63a9,0x63f4, 0x6cbf,0x6f14,0x708e,0x7114,0x7159,0x71d5,0x733f,0x7e01, 0x8276,0x82d1,0x8597,0x9060,0x925b,0x9d1b,0x5869,0x65bc, 0x6c5a,0x7525,0x51f9,0x592e,0x5965,0x5f80,0x5fdc,0x62bc, 0x65fa,0x6a2a,0x6b27,0x6bb4,0x738b,0x7fc1,0x8956,0x9d2c, 0x9d0e,0x9ec4,0x5ca1,0x6c96,0x837b,0x5104,0x5c4b,0x61b6, 0x81c6,0x6876,0x7261,0x4e59,0x4ffa,0x5378,0x6069,0x6e29, 0x7a4f,0x97f3,0x4e0b,0x5316,0x4eee,0x4f55,0x4f3d,0x4fa1, 0x4f73,0x52a0,0x53ef,0x5609,0x590f,0x5ac1,0x5bb6,0x5be1, 0x79d1,0x6687,0x679c,0x67b6,0x6b4c,0x6cb3,0x706b,0x73c2, 0x798d,0x79be,0x7a3c,0x7b87,0x82b1,0x82db,0x8304,0x8377, 0x83ef,0x83d3,0x8766,0x8ab2,0x5629,0x8ca8,0x8fe6,0x904e, 0x971e,0x868a,0x4fc4,0x5ce8,0x6211,0x7259,0x753b,0x81e5, 0x82bd,0x86fe,0x8cc0,0x96c5,0x9913,0x99d5,0x4ecb,0x4f1a, 0x89e3,0x56de,0x584a,0x58ca,0x5efb,0x5feb,0x602a,0x6094, 0x6062,0x61d0,0x6212,0x62d0,0x6539,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_8a[]= {	0x9b41,0x6666,0x68b0,0x6d77,0x7070,0x754c,0x7686,0x7d75, 0x82a5,0x87f9,0x958b,0x968e,0x8c9d,0x51f1,0x52be,0x5916, 0x54b3,0x5bb3,0x5d16,0x6168,0x6982,0x6daf,0x788d,0x84cb, 0x8857,0x8a72,0x93a7,0x9ab8,0x6d6c,0x99a8,0x86d9,0x57a3, 0x67ff,0x86ce,0x920e,0x5283,0x5687,0x5404,0x5ed3,0x62e1, 0x64b9,0x683c,0x6838,0x6bbb,0x7372,0x78ba,0x7a6b,0x899a, 0x89d2,0x8d6b,0x8f03,0x90ed,0x95a3,0x9694,0x9769,0x5b66, 0x5cb3,0x697d,0x984d,0x984e,0x639b,0x7b20,0x6a2b,0x30fb, 0x6a7f,0x68b6,0x9c0d,0x6f5f,0x5272,0x559d,0x6070,0x62ec, 0x6d3b,0x6e07,0x6ed1,0x845b,0x8910,0x8f44,0x4e14,0x9c39, 0x53f6,0x691b,0x6a3a,0x9784,0x682a,0x515c,0x7ac3,0x84b2, 0x91dc,0x938c,0x565b,0x9d28,0x6822,0x8305,0x8431,0x7ca5, 0x5208,0x82c5,0x74e6,0x4e7e,0x4f83,0x51a0,0x5bd2,0x520a, 0x52d8,0x52e7,0x5dfb,0x559a,0x582a,0x59e6,0x5b8c,0x5b98, 0x5bdb,0x5e72,0x5e79,0x60a3,0x611f,0x6163,0x61be,0x63db, 0x6562,0x67d1,0x6853,0x68fa,0x6b3e,0x6b53,0x6c57,0x6f22, 0x6f97,0x6f45,0x74b0,0x7518,0x76e3,0x770b,0x7aff,0x7ba1, 0x7c21,0x7de9,0x7f36,0x7ff0,0x809d,0x8266,0x839e,0x89b3, 0x8acc,0x8cab,0x9084,0x9451,0x9593,0x9591,0x95a2,0x9665, 0x97d3,0x9928,0x8218,0x4e38,0x542b,0x5cb8,0x5dcc,0x73a9, 0x764c,0x773c,0x5ca9,0x7feb,0x8d0b,0x96c1,0x9811,0x9854, 0x9858,0x4f01,0x4f0e,0x5371,0x559c,0x5668,0x57fa,0x5947, 0x5b09,0x5bc4,0x5c90,0x5e0c,0x5e7e,0x5fcc,0x63ee,0x673a, 0x65d7,0x65e2,0x671f,0x68cb,0x68c4,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_8b[]= {	0x6a5f,0x5e30,0x6bc5,0x6c17,0x6c7d,0x757f,0x7948,0x5b63, 0x7a00,0x7d00,0x5fbd,0x898f,0x8a18,0x8cb4,0x8d77,0x8ecc, 0x8f1d,0x98e2,0x9a0e,0x9b3c,0x4e80,0x507d,0x5100,0x5993, 0x5b9c,0x622f,0x6280,0x64ec,0x6b3a,0x72a0,0x7591,0x7947, 0x7fa9,0x87fb,0x8abc,0x8b70,0x63ac,0x83ca,0x97a0,0x5409, 0x5403,0x55ab,0x6854,0x6a58,0x8a70,0x7827,0x6775,0x9ecd, 0x5374,0x5ba2,0x811a,0x8650,0x9006,0x4e18,0x4e45,0x4ec7, 0x4f11,0x53ca,0x5438,0x5bae,0x5f13,0x6025,0x6551,0x30fb, 0x673d,0x6c42,0x6c72,0x6ce3,0x7078,0x7403,0x7a76,0x7aae, 0x7b08,0x7d1a,0x7cfe,0x7d66,0x65e7,0x725b,0x53bb,0x5c45, 0x5de8,0x62d2,0x62e0,0x6319,0x6e20,0x865a,0x8a31,0x8ddd, 0x92f8,0x6f01,0x79a6,0x9b5a,0x4ea8,0x4eab,0x4eac,0x4f9b, 0x4fa0,0x50d1,0x5147,0x7af6,0x5171,0x51f6,0x5354,0x5321, 0x537f,0x53eb,0x55ac,0x5883,0x5ce1,0x5f37,0x5f4a,0x602f, 0x6050,0x606d,0x631f,0x6559,0x6a4b,0x6cc1,0x72c2,0x72ed, 0x77ef,0x80f8,0x8105,0x8208,0x854e,0x90f7,0x93e1,0x97ff, 0x9957,0x9a5a,0x4ef0,0x51dd,0x5c2d,0x6681,0x696d,0x5c40, 0x66f2,0x6975,0x7389,0x6850,0x7c81,0x50c5,0x52e4,0x5747, 0x5dfe,0x9326,0x65a4,0x6b23,0x6b3d,0x7434,0x7981,0x79bd, 0x7b4b,0x7dca,0x82b9,0x83cc,0x887f,0x895f,0x8b39,0x8fd1, 0x91d1,0x541f,0x9280,0x4e5d,0x5036,0x53e5,0x533a,0x72d7, 0x7396,0x77e9,0x82e6,0x8eaf,0x99c6,0x99c8,0x99d2,0x5177, 0x611a,0x865e,0x55b0,0x7a7a,0x5076,0x5bd3,0x9047,0x9685, 0x4e32,0x6adb,0x91e7,0x5c51,0x5c48,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_8c[]= {	0x6398,0x7a9f,0x6c93,0x9774,0x8f61,0x7aaa,0x718a,0x9688, 0x7c82,0x6817,0x7e70,0x6851,0x936c,0x52f2,0x541b,0x85ab, 0x8a13,0x7fa4,0x8ecd,0x90e1,0x5366,0x8888,0x7941,0x4fc2, 0x50be,0x5211,0x5144,0x5553,0x572d,0x73ea,0x578b,0x5951, 0x5f62,0x5f84,0x6075,0x6176,0x6167,0x61a9,0x63b2,0x643a, 0x656c,0x666f,0x6842,0x6e13,0x7566,0x7a3d,0x7cfb,0x7d4c, 0x7d99,0x7e4b,0x7f6b,0x830e,0x834a,0x86cd,0x8a08,0x8a63, 0x8b66,0x8efd,0x981a,0x9d8f,0x82b8,0x8fce,0x9be8,0x30fb, 0x5287,0x621f,0x6483,0x6fc0,0x9699,0x6841,0x5091,0x6b20, 0x6c7a,0x6f54,0x7a74,0x7d50,0x8840,0x8a23,0x6708,0x4ef6, 0x5039,0x5026,0x5065,0x517c,0x5238,0x5263,0x55a7,0x570f, 0x5805,0x5acc,0x5efa,0x61b2,0x61f8,0x62f3,0x6372,0x691c, 0x6a29,0x727d,0x72ac,0x732e,0x7814,0x786f,0x7d79,0x770c, 0x80a9,0x898b,0x8b19,0x8ce2,0x8ed2,0x9063,0x9375,0x967a, 0x9855,0x9a13,0x9e78,0x5143,0x539f,0x53b3,0x5e7b,0x5f26, 0x6e1b,0x6e90,0x7384,0x73fe,0x7d43,0x8237,0x8a00,0x8afa, 0x9650,0x4e4e,0x500b,0x53e4,0x547c,0x56fa,0x59d1,0x5b64, 0x5df1,0x5eab,0x5f27,0x6238,0x6545,0x67af,0x6e56,0x72d0, 0x7cca,0x88b4,0x80a1,0x80e1,0x83f0,0x864e,0x8a87,0x8de8, 0x9237,0x96c7,0x9867,0x9f13,0x4e94,0x4e92,0x4f0d,0x5348, 0x5449,0x543e,0x5a2f,0x5f8c,0x5fa1,0x609f,0x68a7,0x6a8e, 0x745a,0x7881,0x8a9e,0x8aa4,0x8b77,0x9190,0x4e5e,0x9bc9, 0x4ea4,0x4f7c,0x4faf,0x5019,0x5016,0x5149,0x516c,0x529f, 0x52b9,0x52fe,0x539a,0x53e3,0x5411,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_8d[]= {	0x540e,0x5589,0x5751,0x57a2,0x597d,0x5b54,0x5b5d,0x5b8f, 0x5de5,0x5de7,0x5df7,0x5e78,0x5e83,0x5e9a,0x5eb7,0x5f18, 0x6052,0x614c,0x6297,0x62d8,0x63a7,0x653b,0x6602,0x6643, 0x66f4,0x676d,0x6821,0x6897,0x69cb,0x6c5f,0x6d2a,0x6d69, 0x6e2f,0x6e9d,0x7532,0x7687,0x786c,0x7a3f,0x7ce0,0x7d05, 0x7d18,0x7d5e,0x7db1,0x8015,0x8003,0x80af,0x80b1,0x8154, 0x818f,0x822a,0x8352,0x884c,0x8861,0x8b1b,0x8ca2,0x8cfc, 0x90ca,0x9175,0x9271,0x783f,0x92fc,0x95a4,0x964d,0x30fb, 0x9805,0x9999,0x9ad8,0x9d3b,0x525b,0x52ab,0x53f7,0x5408, 0x58d5,0x62f7,0x6fe0,0x8c6a,0x8f5f,0x9eb9,0x514b,0x523b, 0x544a,0x56fd,0x7a40,0x9177,0x9d60,0x9ed2,0x7344,0x6f09, 0x8170,0x7511,0x5ffd,0x60da,0x9aa8,0x72db,0x8fbc,0x6b64, 0x9803,0x4eca,0x56f0,0x5764,0x58be,0x5a5a,0x6068,0x61c7, 0x660f,0x6606,0x6839,0x68b1,0x6df7,0x75d5,0x7d3a,0x826e, 0x9b42,0x4e9b,0x4f50,0x53c9,0x5506,0x5d6f,0x5de6,0x5dee, 0x67fb,0x6c99,0x7473,0x7802,0x8a50,0x9396,0x88df,0x5750, 0x5ea7,0x632b,0x50b5,0x50ac,0x518d,0x6700,0x54c9,0x585e, 0x59bb,0x5bb0,0x5f69,0x624d,0x63a1,0x683d,0x6b73,0x6e08, 0x707d,0x91c7,0x7280,0x7815,0x7826,0x796d,0x658e,0x7d30, 0x83dc,0x88c1,0x8f09,0x969b,0x5264,0x5728,0x6750,0x7f6a, 0x8ca1,0x51b4,0x5742,0x962a,0x583a,0x698a,0x80b4,0x54b2, 0x5d0e,0x57fc,0x7895,0x9dfa,0x4f5c,0x524a,0x548b,0x643e, 0x6628,0x6714,0x67f5,0x7a84,0x7b56,0x7d22,0x932f,0x685c, 0x9bad,0x7b39,0x5319,0x518a,0x5237,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_8e[]= {	0x5bdf,0x62f6,0x64ae,0x64e6,0x672d,0x6bba,0x85a9,0x96d1, 0x7690,0x9bd6,0x634c,0x9306,0x9bab,0x76bf,0x6652,0x4e09, 0x5098,0x53c2,0x5c71,0x60e8,0x6492,0x6563,0x685f,0x71e6, 0x73ca,0x7523,0x7b97,0x7e82,0x8695,0x8b83,0x8cdb,0x9178, 0x9910,0x65ac,0x66ab,0x6b8b,0x4ed5,0x4ed4,0x4f3a,0x4f7f, 0x523a,0x53f8,0x53f2,0x55e3,0x56db,0x58eb,0x59cb,0x59c9, 0x59ff,0x5b50,0x5c4d,0x5e02,0x5e2b,0x5fd7,0x601d,0x6307, 0x652f,0x5b5c,0x65af,0x65bd,0x65e8,0x679d,0x6b62,0x30fb, 0x6b7b,0x6c0f,0x7345,0x7949,0x79c1,0x7cf8,0x7d19,0x7d2b, 0x80a2,0x8102,0x81f3,0x8996,0x8a5e,0x8a69,0x8a66,0x8a8c, 0x8aee,0x8cc7,0x8cdc,0x96cc,0x98fc,0x6b6f,0x4e8b,0x4f3c, 0x4f8d,0x5150,0x5b57,0x5bfa,0x6148,0x6301,0x6642,0x6b21, 0x6ecb,0x6cbb,0x723e,0x74bd,0x75d4,0x78c1,0x793a,0x800c, 0x8033,0x81ea,0x8494,0x8f9e,0x6c50,0x9e7f,0x5f0f,0x8b58, 0x9d2b,0x7afa,0x8ef8,0x5b8d,0x96eb,0x4e03,0x53f1,0x57f7, 0x5931,0x5ac9,0x5ba4,0x6089,0x6e7f,0x6f06,0x75be,0x8cea, 0x5b9f,0x8500,0x7be0,0x5072,0x67f4,0x829d,0x5c61,0x854a, 0x7e1e,0x820e,0x5199,0x5c04,0x6368,0x8d66,0x659c,0x716e, 0x793e,0x7d17,0x8005,0x8b1d,0x8eca,0x906e,0x86c7,0x90aa, 0x501f,0x52fa,0x5c3a,0x6753,0x707c,0x7235,0x914c,0x91c8, 0x932b,0x82e5,0x5bc2,0x5f31,0x60f9,0x4e3b,0x53d6,0x5b88, 0x624b,0x6731,0x6b8a,0x72e9,0x73e0,0x7a2e,0x816b,0x8da3, 0x9152,0x9996,0x5112,0x53d7,0x546a,0x5bff,0x6388,0x6a39, 0x7dac,0x9700,0x56da,0x53ce,0x5468,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_8f[]= { 0x5b97,0x5c31,0x5dde,0x4fee,0x6101,0x62fe,0x6d32,0x79c0, 0x79cb,0x7d42,0x7e4d,0x7fd2,0x81ed,0x821f,0x8490,0x8846, 0x8972,0x8b90,0x8e74,0x8f2f,0x9031,0x914b,0x916c,0x96c6, 0x919c,0x4ec0,0x4f4f,0x5145,0x5341,0x5f93,0x620e,0x67d4, 0x6c41,0x6e0b,0x7363,0x7e26,0x91cd,0x9283,0x53d4,0x5919, 0x5bbf,0x6dd1,0x795d,0x7e2e,0x7c9b,0x587e,0x719f,0x51fa, 0x8853,0x8ff0,0x4fca,0x5cfb,0x6625,0x77ac,0x7ae3,0x821c, 0x99ff,0x51c6,0x5faa,0x65ec,0x696f,0x6b89,0x6df3,0x30fb, 0x6e96,0x6f64,0x76fe,0x7d14,0x5de1,0x9075,0x9187,0x9806, 0x51e6,0x521d,0x6240,0x6691,0x66d9,0x6e1a,0x5eb6,0x7dd2, 0x7f72,0x66f8,0x85af,0x85f7,0x8af8,0x52a9,0x53d9,0x5973, 0x5e8f,0x5f90,0x6055,0x92e4,0x9664,0x50b7,0x511f,0x52dd, 0x5320,0x5347,0x53ec,0x54e8,0x5546,0x5531,0x5617,0x5968, 0x59be,0x5a3c,0x5bb5,0x5c06,0x5c0f,0x5c11,0x5c1a,0x5e84, 0x5e8a,0x5ee0,0x5f70,0x627f,0x6284,0x62db,0x638c,0x6377, 0x6607,0x660c,0x662d,0x6676,0x677e,0x68a2,0x6a1f,0x6a35, 0x6cbc,0x6d88,0x6e09,0x6e58,0x713c,0x7126,0x7167,0x75c7, 0x7701,0x785d,0x7901,0x7965,0x79f0,0x7ae0,0x7b11,0x7ca7, 0x7d39,0x8096,0x83d6,0x848b,0x8549,0x885d,0x88f3,0x8a1f, 0x8a3c,0x8a54,0x8a73,0x8c61,0x8cde,0x91a4,0x9266,0x937e, 0x9418,0x969c,0x9798,0x4e0a,0x4e08,0x4e1e,0x4e57,0x5197, 0x5270,0x57ce,0x5834,0x58cc,0x5b22,0x5e38,0x60c5,0x64fe, 0x6761,0x6756,0x6d44,0x72b6,0x7573,0x7a63,0x84b8,0x8b72, 0x91b8,0x9320,0x5631,0x57f4,0x98fe,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_90[]= {	0x62ed,0x690d,0x6b96,0x71ed,0x7e54,0x8077,0x8272,0x89e6, 0x98df,0x8755,0x8fb1,0x5c3b,0x4f38,0x4fe1,0x4fb5,0x5507, 0x5a20,0x5bdd,0x5be9,0x5fc3,0x614e,0x632f,0x65b0,0x664b, 0x68ee,0x699b,0x6d78,0x6df1,0x7533,0x75b9,0x771f,0x795e, 0x79e6,0x7d33,0x81e3,0x82af,0x85aa,0x89aa,0x8a3a,0x8eab, 0x8f9b,0x9032,0x91dd,0x9707,0x4eba,0x4ec1,0x5203,0x5875, 0x58ec,0x5c0b,0x751a,0x5c3d,0x814e,0x8a0a,0x8fc5,0x9663, 0x976d,0x7b25,0x8acf,0x9808,0x9162,0x56f3,0x53a8,0x30fb, 0x9017,0x5439,0x5782,0x5e25,0x63a8,0x6c34,0x708a,0x7761, 0x7c8b,0x7fe0,0x8870,0x9042,0x9154,0x9310,0x9318,0x968f, 0x745e,0x9ac4,0x5d07,0x5d69,0x6570,0x67a2,0x8da8,0x96db, 0x636e,0x6749,0x6919,0x83c5,0x9817,0x96c0,0x88fe,0x6f84, 0x647a,0x5bf8,0x4e16,0x702c,0x755d,0x662f,0x51c4,0x5236, 0x52e2,0x59d3,0x5f81,0x6027,0x6210,0x653f,0x6574,0x661f, 0x6674,0x68f2,0x6816,0x6b63,0x6e05,0x7272,0x751f,0x76db, 0x7cbe,0x8056,0x58f0,0x88fd,0x897f,0x8aa0,0x8a93,0x8acb, 0x901d,0x9192,0x9752,0x9759,0x6589,0x7a0e,0x8106,0x96bb, 0x5e2d,0x60dc,0x621a,0x65a5,0x6614,0x6790,0x77f3,0x7a4d, 0x7c4d,0x7e3e,0x810a,0x8cac,0x8d64,0x8de1,0x8e5f,0x78a9, 0x5207,0x62d9,0x63a5,0x6442,0x6298,0x8a2d,0x7a83,0x7bc0, 0x8aac,0x96ea,0x7d76,0x820c,0x8749,0x4ed9,0x5148,0x5343, 0x5360,0x5ba3,0x5c02,0x5c16,0x5ddd,0x6226,0x6247,0x64b0, 0x6813,0x6834,0x6cc9,0x6d45,0x6d17,0x67d3,0x6f5c,0x714e, 0x717d,0x65cb,0x7a7f,0x7bad,0x7dda,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_91[]= {	0x7e4a,0x7fa8,0x817a,0x821b,0x8239,0x85a6,0x8a6e,0x8cce, 0x8df5,0x9078,0x9077,0x92ad,0x9291,0x9583,0x9bae,0x524d, 0x5584,0x6f38,0x7136,0x5168,0x7985,0x7e55,0x81b3,0x7cce, 0x564c,0x5851,0x5ca8,0x63aa,0x66fe,0x66fd,0x695a,0x72d9, 0x758f,0x758e,0x790e,0x7956,0x79df,0x7c97,0x7d20,0x7d44, 0x8607,0x8a34,0x963b,0x9061,0x9f20,0x50e7,0x5275,0x53cc, 0x53e2,0x5009,0x55aa,0x58ee,0x594f,0x723d,0x5b8b,0x5c64, 0x531d,0x60e3,0x60f3,0x635c,0x6383,0x633f,0x63bb,0x30fb, 0x64cd,0x65e9,0x66f9,0x5de3,0x69cd,0x69fd,0x6f15,0x71e5, 0x4e89,0x75e9,0x76f8,0x7a93,0x7cdf,0x7dcf,0x7d9c,0x8061, 0x8349,0x8358,0x846c,0x84bc,0x85fb,0x88c5,0x8d70,0x9001, 0x906d,0x9397,0x971c,0x9a12,0x50cf,0x5897,0x618e,0x81d3, 0x8535,0x8d08,0x9020,0x4fc3,0x5074,0x5247,0x5373,0x606f, 0x6349,0x675f,0x6e2c,0x8db3,0x901f,0x4fd7,0x5c5e,0x8cca, 0x65cf,0x7d9a,0x5352,0x8896,0x5176,0x63c3,0x5b58,0x5b6b, 0x5c0a,0x640d,0x6751,0x905c,0x4ed6,0x591a,0x592a,0x6c70, 0x8a51,0x553e,0x5815,0x59a5,0x60f0,0x6253,0x67c1,0x8235, 0x6955,0x9640,0x99c4,0x9a28,0x4f53,0x5806,0x5bfe,0x8010, 0x5cb1,0x5e2f,0x5f85,0x6020,0x614b,0x6234,0x66ff,0x6cf0, 0x6ede,0x80ce,0x817f,0x82d4,0x888b,0x8cb8,0x9000,0x902e, 0x968a,0x9edb,0x9bdb,0x4ee3,0x53f0,0x5927,0x7b2c,0x918d, 0x984c,0x9df9,0x6edd,0x7027,0x5353,0x5544,0x5b85,0x6258, 0x629e,0x62d3,0x6ca2,0x6fef,0x7422,0x8a17,0x9438,0x6fc1, 0x8afe,0x8338,0x51e7,0x86f8,0x53ea,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_92[]= {	0x53e9,0x4f46,0x9054,0x8fb0,0x596a,0x8131,0x5dfd,0x7aea, 0x8fbf,0x68da,0x8c37,0x72f8,0x9c48,0x6a3d,0x8ab0,0x4e39, 0x5358,0x5606,0x5766,0x62c5,0x63a2,0x65e6,0x6b4e,0x6de1, 0x6e5b,0x70ad,0x77ed,0x7aef,0x7baa,0x7dbb,0x803d,0x80c6, 0x86cb,0x8a95,0x935b,0x56e3,0x58c7,0x5f3e,0x65ad,0x6696, 0x6a80,0x6bb5,0x7537,0x8ac7,0x5024,0x77e5,0x5730,0x5f1b, 0x6065,0x667a,0x6c60,0x75f4,0x7a1a,0x7f6e,0x81f4,0x8718, 0x9045,0x99b3,0x7bc9,0x755c,0x7af9,0x7b51,0x84c4,0x30fb, 0x9010,0x79e9,0x7a92,0x8336,0x5ae1,0x7740,0x4e2d,0x4ef2, 0x5b99,0x5fe0,0x62bd,0x663c,0x67f1,0x6ce8,0x866b,0x8877, 0x8a3b,0x914e,0x92f3,0x99d0,0x6a17,0x7026,0x732a,0x82e7, 0x8457,0x8caf,0x4e01,0x5146,0x51cb,0x558b,0x5bf5,0x5e16, 0x5e33,0x5e81,0x5f14,0x5f35,0x5f6b,0x5fb4,0x61f2,0x6311, 0x66a2,0x671d,0x6f6e,0x7252,0x753a,0x773a,0x8074,0x8139, 0x8178,0x8776,0x8abf,0x8adc,0x8d85,0x8df3,0x929a,0x9577, 0x9802,0x9ce5,0x52c5,0x6357,0x76f4,0x6715,0x6c88,0x73cd, 0x8cc3,0x93ae,0x9673,0x6d25,0x589c,0x690e,0x69cc,0x8ffd, 0x939a,0x75db,0x901a,0x585a,0x6802,0x63b4,0x69fb,0x4f43, 0x6f2c,0x67d8,0x8fbb,0x8526,0x7db4,0x9354,0x693f,0x6f70, 0x576a,0x58f7,0x5b2c,0x7d2c,0x722a,0x540a,0x91e3,0x9db4, 0x4ead,0x4f4e,0x505c,0x5075,0x5243,0x8c9e,0x5448,0x5824, 0x5b9a,0x5e1d,0x5e95,0x5ead,0x5ef7,0x5f1f,0x608c,0x62b5, 0x633a,0x63d0,0x68af,0x6c40,0x7887,0x798e,0x7a0b,0x7de0, 0x8247,0x8a02,0x8ae6,0x8e44,0x9013,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_93[]= {	0x90b8,0x912d,0x91d8,0x9f0e,0x6ce5,0x6458,0x64e2,0x6575, 0x6ef4,0x7684,0x7b1b,0x9069,0x93d1,0x6eba,0x54f2,0x5fb9, 0x64a4,0x8f4d,0x8fed,0x9244,0x5178,0x586b,0x5929,0x5c55, 0x5e97,0x6dfb,0x7e8f,0x751c,0x8cbc,0x8ee2,0x985b,0x70b9, 0x4f1d,0x6bbf,0x6fb1,0x7530,0x96fb,0x514e,0x5410,0x5835, 0x5857,0x59ac,0x5c60,0x5f92,0x6597,0x675c,0x6e21,0x767b, 0x83df,0x8ced,0x9014,0x90fd,0x934d,0x7825,0x783a,0x52aa, 0x5ea6,0x571f,0x5974,0x6012,0x5012,0x515a,0x51ac,0x30fb, 0x51cd,0x5200,0x5510,0x5854,0x5858,0x5957,0x5b95,0x5cf6, 0x5d8b,0x60bc,0x6295,0x642d,0x6771,0x6843,0x68bc,0x68df, 0x76d7,0x6dd8,0x6e6f,0x6d9b,0x706f,0x71c8,0x5f53,0x75d8, 0x7977,0x7b49,0x7b54,0x7b52,0x7cd6,0x7d71,0x5230,0x8463, 0x8569,0x85e4,0x8a0e,0x8b04,0x8c46,0x8e0f,0x9003,0x900f, 0x9419,0x9676,0x982d,0x9a30,0x95d8,0x50cd,0x52d5,0x540c, 0x5802,0x5c0e,0x61a7,0x649e,0x6d1e,0x77b3,0x7ae5,0x80f4, 0x8404,0x9053,0x9285,0x5ce0,0x9d07,0x533f,0x5f97,0x5fb3, 0x6d9c,0x7279,0x7763,0x79bf,0x7be4,0x6bd2,0x72ec,0x8aad, 0x6803,0x6a61,0x51f8,0x7a81,0x6934,0x5c4a,0x9cf6,0x82eb, 0x5bc5,0x9149,0x701e,0x5678,0x5c6f,0x60c7,0x6566,0x6c8c, 0x8c5a,0x9041,0x9813,0x5451,0x66c7,0x920d,0x5948,0x90a3, 0x5185,0x4e4d,0x51ea,0x8599,0x8b0e,0x7058,0x637a,0x934b, 0x6962,0x99b4,0x7e04,0x7577,0x5357,0x6960,0x8edf,0x96e3, 0x6c5d,0x4e8c,0x5c3c,0x5f10,0x8fe9,0x5302,0x8cd1,0x8089, 0x8679,0x5eff,0x65e5,0x4e73,0x5165,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_94[]= {	0x5982,0x5c3f,0x97ee,0x4efb,0x598a,0x5fcd,0x8a8d,0x6fe1, 0x79b0,0x7962,0x5be7,0x8471,0x732b,0x71b1,0x5e74,0x5ff5, 0x637b,0x649a,0x71c3,0x7c98,0x4e43,0x5efc,0x4e4b,0x57dc, 0x56a2,0x60a9,0x6fc3,0x7d0d,0x80fd,0x8133,0x81bf,0x8fb2, 0x8997,0x86a4,0x5df4,0x628a,0x64ad,0x8987,0x6777,0x6ce2, 0x6d3e,0x7436,0x7834,0x5a46,0x7f75,0x82ad,0x99ac,0x4ff3, 0x5ec3,0x62dd,0x6392,0x6557,0x676f,0x76c3,0x724c,0x80cc, 0x80ba,0x8f29,0x914d,0x500d,0x57f9,0x5a92,0x6885,0x30fb, 0x6973,0x7164,0x72fd,0x8cb7,0x58f2,0x8ce0,0x966a,0x9019, 0x877f,0x79e4,0x77e7,0x8429,0x4f2f,0x5265,0x535a,0x62cd, 0x67cf,0x6cca,0x767d,0x7b94,0x7c95,0x8236,0x8584,0x8feb, 0x66dd,0x6f20,0x7206,0x7e1b,0x83ab,0x99c1,0x9ea6,0x51fd, 0x7bb1,0x7872,0x7bb8,0x8087,0x7b48,0x6ae8,0x5e61,0x808c, 0x7551,0x7560,0x516b,0x9262,0x6e8c,0x767a,0x9197,0x9aea, 0x4f10,0x7f70,0x629c,0x7b4f,0x95a5,0x9ce9,0x567a,0x5859, 0x86e4,0x96bc,0x4f34,0x5224,0x534a,0x53cd,0x53db,0x5e06, 0x642c,0x6591,0x677f,0x6c3e,0x6c4e,0x7248,0x72af,0x73ed, 0x7554,0x7e41,0x822c,0x85e9,0x8ca9,0x7bc4,0x91c6,0x7169, 0x9812,0x98ef,0x633d,0x6669,0x756a,0x76e4,0x78d0,0x8543, 0x86ee,0x532a,0x5351,0x5426,0x5983,0x5e87,0x5f7c,0x60b2, 0x6249,0x6279,0x62ab,0x6590,0x6bd4,0x6ccc,0x75b2,0x76ae, 0x7891,0x79d8,0x7dcb,0x7f77,0x80a5,0x88ab,0x8ab9,0x8cbb, 0x907f,0x975e,0x98db,0x6a0b,0x7c38,0x5099,0x5c3e,0x5fae, 0x6787,0x6bd8,0x7435,0x7709,0x7f8e,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_95[]= {	0x9f3b,0x67ca,0x7a17,0x5339,0x758b,0x9aed,0x5f66,0x819d, 0x83f1,0x8098,0x5f3c,0x5fc5,0x7562,0x7b46,0x903c,0x6867, 0x59eb,0x5a9b,0x7d10,0x767e,0x8b2c,0x4ff5,0x5f6a,0x6a19, 0x6c37,0x6f02,0x74e2,0x7968,0x8868,0x8a55,0x8c79,0x5edf, 0x63cf,0x75c5,0x79d2,0x82d7,0x9328,0x92f2,0x849c,0x86ed, 0x9c2d,0x54c1,0x5f6c,0x658c,0x6d5c,0x7015,0x8ca7,0x8cd3, 0x983b,0x654f,0x74f6,0x4e0d,0x4ed8,0x57e0,0x592b,0x5a66, 0x5bcc,0x51a8,0x5e03,0x5e9c,0x6016,0x6276,0x6577,0x30fb, 0x65a7,0x666e,0x6d6e,0x7236,0x7b26,0x8150,0x819a,0x8299, 0x8b5c,0x8ca0,0x8ce6,0x8d74,0x961c,0x9644,0x4fae,0x64ab, 0x6b66,0x821e,0x8461,0x856a,0x90e8,0x5c01,0x6953,0x98a8, 0x847a,0x8557,0x4f0f,0x526f,0x5fa9,0x5e45,0x670d,0x798f, 0x8179,0x8907,0x8986,0x6df5,0x5f17,0x6255,0x6cb8,0x4ecf, 0x7269,0x9b92,0x5206,0x543b,0x5674,0x58b3,0x61a4,0x626e, 0x711a,0x596e,0x7c89,0x7cde,0x7d1b,0x96f0,0x6587,0x805e, 0x4e19,0x4f75,0x5175,0x5840,0x5e63,0x5e73,0x5f0a,0x67c4, 0x4e26,0x853d,0x9589,0x965b,0x7c73,0x9801,0x50fb,0x58c1, 0x7656,0x78a7,0x5225,0x77a5,0x8511,0x7b86,0x504f,0x5909, 0x7247,0x7bc7,0x7de8,0x8fba,0x8fd4,0x904d,0x4fbf,0x52c9, 0x5a29,0x5f01,0x97ad,0x4fdd,0x8217,0x92ea,0x5703,0x6355, 0x6b69,0x752b,0x88dc,0x8f14,0x7a42,0x52df,0x5893,0x6155, 0x620a,0x66ae,0x6bcd,0x7c3f,0x83e9,0x5023,0x4ff8,0x5305, 0x5446,0x5831,0x5949,0x5b9d,0x5cf0,0x5cef,0x5d29,0x5e96, 0x62b1,0x6367,0x653e,0x65b9,0x670b,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_96[]= {	0x6cd5,0x6ce1,0x70f9,0x7832,0x7e2b,0x80de,0x82b3,0x840c, 0x84ec,0x8702,0x8912,0x8a2a,0x8c4a,0x90a6,0x92d2,0x98fd, 0x9cf3,0x9d6c,0x4e4f,0x4ea1,0x508d,0x5256,0x574a,0x59a8, 0x5e3d,0x5fd8,0x5fd9,0x623f,0x66b4,0x671b,0x67d0,0x68d2, 0x5192,0x7d21,0x80aa,0x81a8,0x8b00,0x8c8c,0x8cbf,0x927e, 0x9632,0x5420,0x982c,0x5317,0x50d5,0x535c,0x58a8,0x64b2, 0x6734,0x7267,0x7766,0x7a46,0x91e6,0x52c3,0x6ca1,0x6b86, 0x5800,0x5e4c,0x5954,0x672c,0x7ffb,0x51e1,0x76c6,0x30fb, 0x6469,0x78e8,0x9b54,0x9ebb,0x57cb,0x59b9,0x6627,0x679a, 0x6bce,0x54e9,0x69d9,0x5e55,0x819c,0x6795,0x9baa,0x67fe, 0x9c52,0x685d,0x4ea6,0x4fe3,0x53c8,0x62b9,0x672b,0x6cab, 0x8fc4,0x4fad,0x7e6d,0x9ebf,0x4e07,0x6162,0x6e80,0x6f2b, 0x8513,0x5473,0x672a,0x9b45,0x5df3,0x7b95,0x5cac,0x5bc6, 0x871c,0x6e4a,0x84d1,0x7a14,0x8108,0x5999,0x7c8d,0x6c11, 0x7720,0x52d9,0x5922,0x7121,0x725f,0x77db,0x9727,0x9d61, 0x690b,0x5a7f,0x5a18,0x51a5,0x540d,0x547d,0x660e,0x76df, 0x8ff7,0x9298,0x9cf4,0x59ea,0x725d,0x6ec5,0x514d,0x68c9, 0x7dbf,0x7dec,0x9762,0x9eba,0x6478,0x6a21,0x8302,0x5984, 0x5b5f,0x6bdb,0x731b,0x76f2,0x7db2,0x8017,0x8499,0x5132, 0x6728,0x9ed9,0x76ee,0x6762,0x52ff,0x9905,0x5c24,0x623b, 0x7c7e,0x8cb0,0x554f,0x60b6,0x7d0b,0x9580,0x5301,0x4e5f, 0x51b6,0x591c,0x723a,0x8036,0x91ce,0x5f25,0x77e2,0x5384, 0x5f79,0x7d04,0x85ac,0x8a33,0x8e8d,0x9756,0x67f3,0x85ae, 0x9453,0x6109,0x6108,0x6cb9,0x7652,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_97[]= {	0x8aed,0x8f38,0x552f,0x4f51,0x512a,0x52c7,0x53cb,0x5ba5, 0x5e7d,0x60a0,0x6182,0x63d6,0x6709,0x67da,0x6e67,0x6d8c, 0x7336,0x7337,0x7531,0x7950,0x88d5,0x8a98,0x904a,0x9091, 0x90f5,0x96c4,0x878d,0x5915,0x4e88,0x4f59,0x4e0e,0x8a89, 0x8f3f,0x9810,0x50ad,0x5e7c,0x5996,0x5bb9,0x5eb8,0x63da, 0x63fa,0x64c1,0x66dc,0x694a,0x69d8,0x6d0b,0x6eb6,0x7194, 0x7528,0x7aaf,0x7f8a,0x8000,0x8449,0x84c9,0x8981,0x8b21, 0x8e0a,0x9065,0x967d,0x990a,0x617e,0x6291,0x6b32,0x30fb, 0x6c83,0x6d74,0x7fcc,0x7ffc,0x6dc0,0x7f85,0x87ba,0x88f8, 0x6765,0x83b1,0x983c,0x96f7,0x6d1b,0x7d61,0x843d,0x916a, 0x4e71,0x5375,0x5d50,0x6b04,0x6feb,0x85cd,0x862d,0x89a7, 0x5229,0x540f,0x5c65,0x674e,0x68a8,0x7406,0x7483,0x75e2, 0x88cf,0x88e1,0x91cc,0x96e2,0x9678,0x5f8b,0x7387,0x7acb, 0x844e,0x63a0,0x7565,0x5289,0x6d41,0x6e9c,0x7409,0x7559, 0x786b,0x7c92,0x9686,0x7adc,0x9f8d,0x4fb6,0x616e,0x65c5, 0x865c,0x4e86,0x4eae,0x50da,0x4e21,0x51cc,0x5bee,0x6599, 0x6881,0x6dbc,0x731f,0x7642,0x77ad,0x7a1c,0x7ce7,0x826f, 0x8ad2,0x907c,0x91cf,0x9675,0x9818,0x529b,0x7dd1,0x502b, 0x5398,0x6797,0x6dcb,0x71d0,0x7433,0x81e8,0x8f2a,0x96a3, 0x9c57,0x9e9f,0x7460,0x5841,0x6d99,0x7d2f,0x985e,0x4ee4, 0x4f36,0x4f8b,0x51b7,0x52b1,0x5dba,0x601c,0x73b2,0x793c, 0x82d3,0x9234,0x96b7,0x96f6,0x970a,0x9e97,0x9f62,0x66a6, 0x6b74,0x5217,0x52a3,0x70c8,0x88c2,0x5ec9,0x604b,0x6190, 0x6f23,0x7149,0x7c3e,0x7df4,0x806f,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_98[]= {	0x84ee,0x9023,0x932c,0x5442,0x9b6f,0x6ad3,0x7089,0x8cc2, 0x8def,0x9732,0x52b4,0x5a41,0x5eca,0x5f04,0x6717,0x697c, 0x6994,0x6d6a,0x6f0f,0x7262,0x72fc,0x7bed,0x8001,0x807e, 0x874b,0x90ce,0x516d,0x9e93,0x7984,0x808b,0x9332,0x8ad6, 0x502d,0x548c,0x8a71,0x6b6a,0x8cc4,0x8107,0x60d1,0x67a0, 0x9df2,0x4e99,0x4e98,0x9c10,0x8a6b,0x85c1,0x8568,0x6900, 0x6e7e,0x7897,0x8155,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x5f0c, 0x4e10,0x4e15,0x4e2a,0x4e31,0x4e36,0x4e3c,0x4e3f,0x4e42, 0x4e56,0x4e58,0x4e82,0x4e85,0x8c6b,0x4e8a,0x8212,0x5f0d, 0x4e8e,0x4e9e,0x4e9f,0x4ea0,0x4ea2,0x4eb0,0x4eb3,0x4eb6, 0x4ece,0x4ecd,0x4ec4,0x4ec6,0x4ec2,0x4ed7,0x4ede,0x4eed, 0x4edf,0x4ef7,0x4f09,0x4f5a,0x4f30,0x4f5b,0x4f5d,0x4f57, 0x4f47,0x4f76,0x4f88,0x4f8f,0x4f98,0x4f7b,0x4f69,0x4f70, 0x4f91,0x4f6f,0x4f86,0x4f96,0x5118,0x4fd4,0x4fdf,0x4fce, 0x4fd8,0x4fdb,0x4fd1,0x4fda,0x4fd0,0x4fe4,0x4fe5,0x501a, 0x5028,0x5014,0x502a,0x5025,0x5005,0x4f1c,0x4ff6,0x5021, 0x5029,0x502c,0x4ffe,0x4fef,0x5011,0x5006,0x5043,0x5047, 0x6703,0x5055,0x5050,0x5048,0x505a,0x5056,0x506c,0x5078, 0x5080,0x509a,0x5085,0x50b4,0x50b2,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_99[]= {	0x50c9,0x50ca,0x50b3,0x50c2,0x50d6,0x50de,0x50e5,0x50ed, 0x50e3,0x50ee,0x50f9,0x50f5,0x5109,0x5101,0x5102,0x5116, 0x5115,0x5114,0x511a,0x5121,0x513a,0x5137,0x513c,0x513b, 0x513f,0x5140,0x5152,0x514c,0x5154,0x5162,0x7af8,0x5169, 0x516a,0x516e,0x5180,0x5182,0x56d8,0x518c,0x5189,0x518f, 0x5191,0x5193,0x5195,0x5196,0x51a4,0x51a6,0x51a2,0x51a9, 0x51aa,0x51ab,0x51b3,0x51b1,0x51b2,0x51b0,0x51b5,0x51bd, 0x51c5,0x51c9,0x51db,0x51e0,0x8655,0x51e9,0x51ed,0x30fb, 0x51f0,0x51f5,0x51fe,0x5204,0x520b,0x5214,0x520e,0x5227, 0x522a,0x522e,0x5233,0x5239,0x524f,0x5244,0x524b,0x524c, 0x525e,0x5254,0x526a,0x5274,0x5269,0x5273,0x527f,0x527d, 0x528d,0x5294,0x5292,0x5271,0x5288,0x5291,0x8fa8,0x8fa7, 0x52ac,0x52ad,0x52bc,0x52b5,0x52c1,0x52cd,0x52d7,0x52de, 0x52e3,0x52e6,0x98ed,0x52e0,0x52f3,0x52f5,0x52f8,0x52f9, 0x5306,0x5308,0x7538,0x530d,0x5310,0x530f,0x5315,0x531a, 0x5323,0x532f,0x5331,0x5333,0x5338,0x5340,0x5346,0x5345, 0x4e17,0x5349,0x534d,0x51d6,0x535e,0x5369,0x536e,0x5918, 0x537b,0x5377,0x5382,0x5396,0x53a0,0x53a6,0x53a5,0x53ae, 0x53b0,0x53b6,0x53c3,0x7c12,0x96d9,0x53df,0x66fc,0x71ee, 0x53ee,0x53e8,0x53ed,0x53fa,0x5401,0x543d,0x5440,0x542c, 0x542d,0x543c,0x542e,0x5436,0x5429,0x541d,0x544e,0x548f, 0x5475,0x548e,0x545f,0x5471,0x5477,0x5470,0x5492,0x547b, 0x5480,0x5476,0x5484,0x5490,0x5486,0x54c7,0x54a2,0x54b8, 0x54a5,0x54ac,0x54c4,0x54c8,0x54a8,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_9a[]= {	0x54ab,0x54c2,0x54a4,0x54be,0x54bc,0x54d8,0x54e5,0x54e6, 0x550f,0x5514,0x54fd,0x54ee,0x54ed,0x54fa,0x54e2,0x5539, 0x5540,0x5563,0x554c,0x552e,0x555c,0x5545,0x5556,0x5557, 0x5538,0x5533,0x555d,0x5599,0x5580,0x54af,0x558a,0x559f, 0x557b,0x557e,0x5598,0x559e,0x55ae,0x557c,0x5583,0x55a9, 0x5587,0x55a8,0x55da,0x55c5,0x55df,0x55c4,0x55dc,0x55e4, 0x55d4,0x5614,0x55f7,0x5616,0x55fe,0x55fd,0x561b,0x55f9, 0x564e,0x5650,0x71df,0x5634,0x5636,0x5632,0x5638,0x30fb, 0x566b,0x5664,0x562f,0x566c,0x566a,0x5686,0x5680,0x568a, 0x56a0,0x5694,0x568f,0x56a5,0x56ae,0x56b6,0x56b4,0x56c2, 0x56bc,0x56c1,0x56c3,0x56c0,0x56c8,0x56ce,0x56d1,0x56d3, 0x56d7,0x56ee,0x56f9,0x5700,0x56ff,0x5704,0x5709,0x5708, 0x570b,0x570d,0x5713,0x5718,0x5716,0x55c7,0x571c,0x5726, 0x5737,0x5738,0x574e,0x573b,0x5740,0x574f,0x5769,0x57c0, 0x5788,0x5761,0x577f,0x5789,0x5793,0x57a0,0x57b3,0x57a4, 0x57aa,0x57b0,0x57c3,0x57c6,0x57d4,0x57d2,0x57d3,0x580a, 0x57d6,0x57e3,0x580b,0x5819,0x581d,0x5872,0x5821,0x5862, 0x584b,0x5870,0x6bc0,0x5852,0x583d,0x5879,0x5885,0x58b9, 0x589f,0x58ab,0x58ba,0x58de,0x58bb,0x58b8,0x58ae,0x58c5, 0x58d3,0x58d1,0x58d7,0x58d9,0x58d8,0x58e5,0x58dc,0x58e4, 0x58df,0x58ef,0x58fa,0x58f9,0x58fb,0x58fc,0x58fd,0x5902, 0x590a,0x5910,0x591b,0x68a6,0x5925,0x592c,0x592d,0x5932, 0x5938,0x593e,0x7ad2,0x5955,0x5950,0x594e,0x595a,0x5958, 0x5962,0x5960,0x5967,0x596c,0x5969,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_9b[]= {	0x5978,0x5981,0x599d,0x4f5e,0x4fab,0x59a3,0x59b2,0x59c6, 0x59e8,0x59dc,0x598d,0x59d9,0x59da,0x5a25,0x5a1f,0x5a11, 0x5a1c,0x5a09,0x5a1a,0x5a40,0x5a6c,0x5a49,0x5a35,0x5a36, 0x5a62,0x5a6a,0x5a9a,0x5abc,0x5abe,0x5acb,0x5ac2,0x5abd, 0x5ae3,0x5ad7,0x5ae6,0x5ae9,0x5ad6,0x5afa,0x5afb,0x5b0c, 0x5b0b,0x5b16,0x5b32,0x5ad0,0x5b2a,0x5b36,0x5b3e,0x5b43, 0x5b45,0x5b40,0x5b51,0x5b55,0x5b5a,0x5b5b,0x5b65,0x5b69, 0x5b70,0x5b73,0x5b75,0x5b78,0x6588,0x5b7a,0x5b80,0x30fb, 0x5b83,0x5ba6,0x5bb8,0x5bc3,0x5bc7,0x5bc9,0x5bd4,0x5bd0, 0x5be4,0x5be6,0x5be2,0x5bde,0x5be5,0x5beb,0x5bf0,0x5bf6, 0x5bf3,0x5c05,0x5c07,0x5c08,0x5c0d,0x5c13,0x5c20,0x5c22, 0x5c28,0x5c38,0x5c39,0x5c41,0x5c46,0x5c4e,0x5c53,0x5c50, 0x5c4f,0x5b71,0x5c6c,0x5c6e,0x4e62,0x5c76,0x5c79,0x5c8c, 0x5c91,0x5c94,0x599b,0x5cab,0x5cbb,0x5cb6,0x5cbc,0x5cb7, 0x5cc5,0x5cbe,0x5cc7,0x5cd9,0x5ce9,0x5cfd,0x5cfa,0x5ced, 0x5d8c,0x5cea,0x5d0b,0x5d15,0x5d17,0x5d5c,0x5d1f,0x5d1b, 0x5d11,0x5d14,0x5d22,0x5d1a,0x5d19,0x5d18,0x5d4c,0x5d52, 0x5d4e,0x5d4b,0x5d6c,0x5d73,0x5d76,0x5d87,0x5d84,0x5d82, 0x5da2,0x5d9d,0x5dac,0x5dae,0x5dbd,0x5d90,0x5db7,0x5dbc, 0x5dc9,0x5dcd,0x5dd3,0x5dd2,0x5dd6,0x5ddb,0x5deb,0x5df2, 0x5df5,0x5e0b,0x5e1a,0x5e19,0x5e11,0x5e1b,0x5e36,0x5e37, 0x5e44,0x5e43,0x5e40,0x5e4e,0x5e57,0x5e54,0x5e5f,0x5e62, 0x5e64,0x5e47,0x5e75,0x5e76,0x5e7a,0x9ebc,0x5e7f,0x5ea0, 0x5ec1,0x5ec2,0x5ec8,0x5ed0,0x5ecf,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_9c[]= {	0x5ed6,0x5ee3,0x5edd,0x5eda,0x5edb,0x5ee2,0x5ee1,0x5ee8, 0x5ee9,0x5eec,0x5ef1,0x5ef3,0x5ef0,0x5ef4,0x5ef8,0x5efe, 0x5f03,0x5f09,0x5f5d,0x5f5c,0x5f0b,0x5f11,0x5f16,0x5f29, 0x5f2d,0x5f38,0x5f41,0x5f48,0x5f4c,0x5f4e,0x5f2f,0x5f51, 0x5f56,0x5f57,0x5f59,0x5f61,0x5f6d,0x5f73,0x5f77,0x5f83, 0x5f82,0x5f7f,0x5f8a,0x5f88,0x5f91,0x5f87,0x5f9e,0x5f99, 0x5f98,0x5fa0,0x5fa8,0x5fad,0x5fbc,0x5fd6,0x5ffb,0x5fe4, 0x5ff8,0x5ff1,0x5fdd,0x60b3,0x5fff,0x6021,0x6060,0x30fb, 0x6019,0x6010,0x6029,0x600e,0x6031,0x601b,0x6015,0x602b, 0x6026,0x600f,0x603a,0x605a,0x6041,0x606a,0x6077,0x605f, 0x604a,0x6046,0x604d,0x6063,0x6043,0x6064,0x6042,0x606c, 0x606b,0x6059,0x6081,0x608d,0x60e7,0x6083,0x609a,0x6084, 0x609b,0x6096,0x6097,0x6092,0x60a7,0x608b,0x60e1,0x60b8, 0x60e0,0x60d3,0x60b4,0x5ff0,0x60bd,0x60c6,0x60b5,0x60d8, 0x614d,0x6115,0x6106,0x60f6,0x60f7,0x6100,0x60f4,0x60fa, 0x6103,0x6121,0x60fb,0x60f1,0x610d,0x610e,0x6147,0x613e, 0x6128,0x6127,0x614a,0x613f,0x613c,0x612c,0x6134,0x613d, 0x6142,0x6144,0x6173,0x6177,0x6158,0x6159,0x615a,0x616b, 0x6174,0x616f,0x6165,0x6171,0x615f,0x615d,0x6153,0x6175, 0x6199,0x6196,0x6187,0x61ac,0x6194,0x619a,0x618a,0x6191, 0x61ab,0x61ae,0x61cc,0x61ca,0x61c9,0x61f7,0x61c8,0x61c3, 0x61c6,0x61ba,0x61cb,0x7f79,0x61cd,0x61e6,0x61e3,0x61f6, 0x61fa,0x61f4,0x61ff,0x61fd,0x61fc,0x61fe,0x6200,0x6208, 0x6209,0x620d,0x620c,0x6214,0x621b,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_9d[]= {	0x621e,0x6221,0x622a,0x622e,0x6230,0x6232,0x6233,0x6241, 0x624e,0x625e,0x6263,0x625b,0x6260,0x6268,0x627c,0x6282, 0x6289,0x627e,0x6292,0x6293,0x6296,0x62d4,0x6283,0x6294, 0x62d7,0x62d1,0x62bb,0x62cf,0x62ff,0x62c6,0x64d4,0x62c8, 0x62dc,0x62cc,0x62ca,0x62c2,0x62c7,0x629b,0x62c9,0x630c, 0x62ee,0x62f1,0x6327,0x6302,0x6308,0x62ef,0x62f5,0x6350, 0x633e,0x634d,0x641c,0x634f,0x6396,0x638e,0x6380,0x63ab, 0x6376,0x63a3,0x638f,0x6389,0x639f,0x63b5,0x636b,0x30fb, 0x6369,0x63be,0x63e9,0x63c0,0x63c6,0x63e3,0x63c9,0x63d2, 0x63f6,0x63c4,0x6416,0x6434,0x6406,0x6413,0x6426,0x6436, 0x651d,0x6417,0x6428,0x640f,0x6467,0x646f,0x6476,0x644e, 0x652a,0x6495,0x6493,0x64a5,0x64a9,0x6488,0x64bc,0x64da, 0x64d2,0x64c5,0x64c7,0x64bb,0x64d8,0x64c2,0x64f1,0x64e7, 0x8209,0x64e0,0x64e1,0x62ac,0x64e3,0x64ef,0x652c,0x64f6, 0x64f4,0x64f2,0x64fa,0x6500,0x64fd,0x6518,0x651c,0x6505, 0x6524,0x6523,0x652b,0x6534,0x6535,0x6537,0x6536,0x6538, 0x754b,0x6548,0x6556,0x6555,0x654d,0x6558,0x655e,0x655d, 0x6572,0x6578,0x6582,0x6583,0x8b8a,0x659b,0x659f,0x65ab, 0x65b7,0x65c3,0x65c6,0x65c1,0x65c4,0x65cc,0x65d2,0x65db, 0x65d9,0x65e0,0x65e1,0x65f1,0x6772,0x660a,0x6603,0x65fb, 0x6773,0x6635,0x6636,0x6634,0x661c,0x664f,0x6644,0x6649, 0x6641,0x665e,0x665d,0x6664,0x6667,0x6668,0x665f,0x6662, 0x6670,0x6683,0x6688,0x668e,0x6689,0x6684,0x6698,0x669d, 0x66c1,0x66b9,0x66c9,0x66be,0x66bc,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_9e[]= {	0x66c4,0x66b8,0x66d6,0x66da,0x66e0,0x663f,0x66e6,0x66e9, 0x66f0,0x66f5,0x66f7,0x670f,0x6716,0x671e,0x6726,0x6727, 0x9738,0x672e,0x673f,0x6736,0x6741,0x6738,0x6737,0x6746, 0x675e,0x6760,0x6759,0x6763,0x6764,0x6789,0x6770,0x67a9, 0x677c,0x676a,0x678c,0x678b,0x67a6,0x67a1,0x6785,0x67b7, 0x67ef,0x67b4,0x67ec,0x67b3,0x67e9,0x67b8,0x67e4,0x67de, 0x67dd,0x67e2,0x67ee,0x67b9,0x67ce,0x67c6,0x67e7,0x6a9c, 0x681e,0x6846,0x6829,0x6840,0x684d,0x6832,0x684e,0x30fb, 0x68b3,0x682b,0x6859,0x6863,0x6877,0x687f,0x689f,0x688f, 0x68ad,0x6894,0x689d,0x689b,0x6883,0x6aae,0x68b9,0x6874, 0x68b5,0x68a0,0x68ba,0x690f,0x688d,0x687e,0x6901,0x68ca, 0x6908,0x68d8,0x6922,0x6926,0x68e1,0x690c,0x68cd,0x68d4, 0x68e7,0x68d5,0x6936,0x6912,0x6904,0x68d7,0x68e3,0x6925, 0x68f9,0x68e0,0x68ef,0x6928,0x692a,0x691a,0x6923,0x6921, 0x68c6,0x6979,0x6977,0x695c,0x6978,0x696b,0x6954,0x697e, 0x696e,0x6939,0x6974,0x693d,0x6959,0x6930,0x6961,0x695e, 0x695d,0x6981,0x696a,0x69b2,0x69ae,0x69d0,0x69bf,0x69c1, 0x69d3,0x69be,0x69ce,0x5be8,0x69ca,0x69dd,0x69bb,0x69c3, 0x69a7,0x6a2e,0x6991,0x69a0,0x699c,0x6995,0x69b4,0x69de, 0x69e8,0x6a02,0x6a1b,0x69ff,0x6b0a,0x69f9,0x69f2,0x69e7, 0x6a05,0x69b1,0x6a1e,0x69ed,0x6a14,0x69eb,0x6a0a,0x6a12, 0x6ac1,0x6a23,0x6a13,0x6a44,0x6a0c,0x6a72,0x6a36,0x6a78, 0x6a47,0x6a62,0x6a59,0x6a66,0x6a48,0x6a38,0x6a22,0x6a90, 0x6a8d,0x6aa0,0x6a84,0x6aa2,0x6aa3,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_9f[]= {	0x6a97,0x8617,0x6abb,0x6ac3,0x6ac2,0x6ab8,0x6ab3,0x6aac, 0x6ade,0x6ad1,0x6adf,0x6aaa,0x6ada,0x6aea,0x6afb,0x6b05, 0x8616,0x6afa,0x6b12,0x6b16,0x9b31,0x6b1f,0x6b38,0x6b37, 0x76dc,0x6b39,0x98ee,0x6b47,0x6b43,0x6b49,0x6b50,0x6b59, 0x6b54,0x6b5b,0x6b5f,0x6b61,0x6b78,0x6b79,0x6b7f,0x6b80, 0x6b84,0x6b83,0x6b8d,0x6b98,0x6b95,0x6b9e,0x6ba4,0x6baa, 0x6bab,0x6baf,0x6bb2,0x6bb1,0x6bb3,0x6bb7,0x6bbc,0x6bc6, 0x6bcb,0x6bd3,0x6bdf,0x6bec,0x6beb,0x6bf3,0x6bef,0x30fb, 0x9ebe,0x6c08,0x6c13,0x6c14,0x6c1b,0x6c24,0x6c23,0x6c5e, 0x6c55,0x6c62,0x6c6a,0x6c82,0x6c8d,0x6c9a,0x6c81,0x6c9b, 0x6c7e,0x6c68,0x6c73,0x6c92,0x6c90,0x6cc4,0x6cf1,0x6cd3, 0x6cbd,0x6cd7,0x6cc5,0x6cdd,0x6cae,0x6cb1,0x6cbe,0x6cba, 0x6cdb,0x6cef,0x6cd9,0x6cea,0x6d1f,0x884d,0x6d36,0x6d2b, 0x6d3d,0x6d38,0x6d19,0x6d35,0x6d33,0x6d12,0x6d0c,0x6d63, 0x6d93,0x6d64,0x6d5a,0x6d79,0x6d59,0x6d8e,0x6d95,0x6fe4, 0x6d85,0x6df9,0x6e15,0x6e0a,0x6db5,0x6dc7,0x6de6,0x6db8, 0x6dc6,0x6dec,0x6dde,0x6dcc,0x6de8,0x6dd2,0x6dc5,0x6dfa, 0x6dd9,0x6de4,0x6dd5,0x6dea,0x6dee,0x6e2d,0x6e6e,0x6e2e, 0x6e19,0x6e72,0x6e5f,0x6e3e,0x6e23,0x6e6b,0x6e2b,0x6e76, 0x6e4d,0x6e1f,0x6e43,0x6e3a,0x6e4e,0x6e24,0x6eff,0x6e1d, 0x6e38,0x6e82,0x6eaa,0x6e98,0x6ec9,0x6eb7,0x6ed3,0x6ebd, 0x6eaf,0x6ec4,0x6eb2,0x6ed4,0x6ed5,0x6e8f,0x6ea5,0x6ec2, 0x6e9f,0x6f41,0x6f11,0x704c,0x6eec,0x6ef8,0x6efe,0x6f3f, 0x6ef2,0x6f31,0x6eef,0x6f32,0x6ecc,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_e0[]= {	0x6f3e,0x6f13,0x6ef7,0x6f86,0x6f7a,0x6f78,0x6f81,0x6f80, 0x6f6f,0x6f5b,0x6ff3,0x6f6d,0x6f82,0x6f7c,0x6f58,0x6f8e, 0x6f91,0x6fc2,0x6f66,0x6fb3,0x6fa3,0x6fa1,0x6fa4,0x6fb9, 0x6fc6,0x6faa,0x6fdf,0x6fd5,0x6fec,0x6fd4,0x6fd8,0x6ff1, 0x6fee,0x6fdb,0x7009,0x700b,0x6ffa,0x7011,0x7001,0x700f, 0x6ffe,0x701b,0x701a,0x6f74,0x701d,0x7018,0x701f,0x7030, 0x703e,0x7032,0x7051,0x7063,0x7099,0x7092,0x70af,0x70f1, 0x70ac,0x70b8,0x70b3,0x70ae,0x70df,0x70cb,0x70dd,0x30fb, 0x70d9,0x7109,0x70fd,0x711c,0x7119,0x7165,0x7155,0x7188, 0x7166,0x7162,0x714c,0x7156,0x716c,0x718f,0x71fb,0x7184, 0x7195,0x71a8,0x71ac,0x71d7,0x71b9,0x71be,0x71d2,0x71c9, 0x71d4,0x71ce,0x71e0,0x71ec,0x71e7,0x71f5,0x71fc,0x71f9, 0x71ff,0x720d,0x7210,0x721b,0x7228,0x722d,0x722c,0x7230, 0x7232,0x723b,0x723c,0x723f,0x7240,0x7246,0x724b,0x7258, 0x7274,0x727e,0x7282,0x7281,0x7287,0x7292,0x7296,0x72a2, 0x72a7,0x72b9,0x72b2,0x72c3,0x72c6,0x72c4,0x72ce,0x72d2, 0x72e2,0x72e0,0x72e1,0x72f9,0x72f7,0x500f,0x7317,0x730a, 0x731c,0x7316,0x731d,0x7334,0x732f,0x7329,0x7325,0x733e, 0x734e,0x734f,0x9ed8,0x7357,0x736a,0x7368,0x7370,0x7378, 0x7375,0x737b,0x737a,0x73c8,0x73b3,0x73ce,0x73bb,0x73c0, 0x73e5,0x73ee,0x73de,0x74a2,0x7405,0x746f,0x7425,0x73f8, 0x7432,0x743a,0x7455,0x743f,0x745f,0x7459,0x7441,0x745c, 0x7469,0x7470,0x7463,0x746a,0x7476,0x747e,0x748b,0x749e, 0x74a7,0x74ca,0x74cf,0x74d4,0x73f1,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_e1[]= {	0x74e0,0x74e3,0x74e7,0x74e9,0x74ee,0x74f2,0x74f0,0x74f1, 0x74f8,0x74f7,0x7504,0x7503,0x7505,0x750c,0x750e,0x750d, 0x7515,0x7513,0x751e,0x7526,0x752c,0x753c,0x7544,0x754d, 0x754a,0x7549,0x755b,0x7546,0x755a,0x7569,0x7564,0x7567, 0x756b,0x756d,0x7578,0x7576,0x7586,0x7587,0x7574,0x758a, 0x7589,0x7582,0x7594,0x759a,0x759d,0x75a5,0x75a3,0x75c2, 0x75b3,0x75c3,0x75b5,0x75bd,0x75b8,0x75bc,0x75b1,0x75cd, 0x75ca,0x75d2,0x75d9,0x75e3,0x75de,0x75fe,0x75ff,0x30fb, 0x75fc,0x7601,0x75f0,0x75fa,0x75f2,0x75f3,0x760b,0x760d, 0x7609,0x761f,0x7627,0x7620,0x7621,0x7622,0x7624,0x7634, 0x7630,0x763b,0x7647,0x7648,0x7646,0x765c,0x7658,0x7661, 0x7662,0x7668,0x7669,0x766a,0x7667,0x766c,0x7670,0x7672, 0x7676,0x7678,0x767c,0x7680,0x7683,0x7688,0x768b,0x768e, 0x7696,0x7693,0x7699,0x769a,0x76b0,0x76b4,0x76b8,0x76b9, 0x76ba,0x76c2,0x76cd,0x76d6,0x76d2,0x76de,0x76e1,0x76e5, 0x76e7,0x76ea,0x862f,0x76fb,0x7708,0x7707,0x7704,0x7729, 0x7724,0x771e,0x7725,0x7726,0x771b,0x7737,0x7738,0x7747, 0x775a,0x7768,0x776b,0x775b,0x7765,0x777f,0x777e,0x7779, 0x778e,0x778b,0x7791,0x77a0,0x779e,0x77b0,0x77b6,0x77b9, 0x77bf,0x77bc,0x77bd,0x77bb,0x77c7,0x77cd,0x77d7,0x77da, 0x77dc,0x77e3,0x77ee,0x77fc,0x780c,0x7812,0x7926,0x7820, 0x792a,0x7845,0x788e,0x7874,0x7886,0x787c,0x789a,0x788c, 0x78a3,0x78b5,0x78aa,0x78af,0x78d1,0x78c6,0x78cb,0x78d4, 0x78be,0x78bc,0x78c5,0x78ca,0x78ec,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_e2[]= {	0x78e7,0x78da,0x78fd,0x78f4,0x7907,0x7912,0x7911,0x7919, 0x792c,0x792b,0x7940,0x7960,0x7957,0x795f,0x795a,0x7955, 0x7953,0x797a,0x797f,0x798a,0x799d,0x79a7,0x9f4b,0x79aa, 0x79ae,0x79b3,0x79b9,0x79ba,0x79c9,0x79d5,0x79e7,0x79ec, 0x79e1,0x79e3,0x7a08,0x7a0d,0x7a18,0x7a19,0x7a20,0x7a1f, 0x7980,0x7a31,0x7a3b,0x7a3e,0x7a37,0x7a43,0x7a57,0x7a49, 0x7a61,0x7a62,0x7a69,0x9f9d,0x7a70,0x7a79,0x7a7d,0x7a88, 0x7a97,0x7a95,0x7a98,0x7a96,0x7aa9,0x7ac8,0x7ab0,0x30fb, 0x7ab6,0x7ac5,0x7ac4,0x7abf,0x9083,0x7ac7,0x7aca,0x7acd, 0x7acf,0x7ad5,0x7ad3,0x7ad9,0x7ada,0x7add,0x7ae1,0x7ae2, 0x7ae6,0x7aed,0x7af0,0x7b02,0x7b0f,0x7b0a,0x7b06,0x7b33, 0x7b18,0x7b19,0x7b1e,0x7b35,0x7b28,0x7b36,0x7b50,0x7b7a, 0x7b04,0x7b4d,0x7b0b,0x7b4c,0x7b45,0x7b75,0x7b65,0x7b74, 0x7b67,0x7b70,0x7b71,0x7b6c,0x7b6e,0x7b9d,0x7b98,0x7b9f, 0x7b8d,0x7b9c,0x7b9a,0x7b8b,0x7b92,0x7b8f,0x7b5d,0x7b99, 0x7bcb,0x7bc1,0x7bcc,0x7bcf,0x7bb4,0x7bc6,0x7bdd,0x7be9, 0x7c11,0x7c14,0x7be6,0x7be5,0x7c60,0x7c00,0x7c07,0x7c13, 0x7bf3,0x7bf7,0x7c17,0x7c0d,0x7bf6,0x7c23,0x7c27,0x7c2a, 0x7c1f,0x7c37,0x7c2b,0x7c3d,0x7c4c,0x7c43,0x7c54,0x7c4f, 0x7c40,0x7c50,0x7c58,0x7c5f,0x7c64,0x7c56,0x7c65,0x7c6c, 0x7c75,0x7c83,0x7c90,0x7ca4,0x7cad,0x7ca2,0x7cab,0x7ca1, 0x7ca8,0x7cb3,0x7cb2,0x7cb1,0x7cae,0x7cb9,0x7cbd,0x7cc0, 0x7cc5,0x7cc2,0x7cd8,0x7cd2,0x7cdc,0x7ce2,0x9b3b,0x7cef, 0x7cf2,0x7cf4,0x7cf6,0x7cfa,0x7d06,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_e3[]= {	0x7d02,0x7d1c,0x7d15,0x7d0a,0x7d45,0x7d4b,0x7d2e,0x7d32, 0x7d3f,0x7d35,0x7d46,0x7d73,0x7d56,0x7d4e,0x7d72,0x7d68, 0x7d6e,0x7d4f,0x7d63,0x7d93,0x7d89,0x7d5b,0x7d8f,0x7d7d, 0x7d9b,0x7dba,0x7dae,0x7da3,0x7db5,0x7dc7,0x7dbd,0x7dab, 0x7e3d,0x7da2,0x7daf,0x7ddc,0x7db8,0x7d9f,0x7db0,0x7dd8, 0x7ddd,0x7de4,0x7dde,0x7dfb,0x7df2,0x7de1,0x7e05,0x7e0a, 0x7e23,0x7e21,0x7e12,0x7e31,0x7e1f,0x7e09,0x7e0b,0x7e22, 0x7e46,0x7e66,0x7e3b,0x7e35,0x7e39,0x7e43,0x7e37,0x30fb, 0x7e32,0x7e3a,0x7e67,0x7e5d,0x7e56,0x7e5e,0x7e59,0x7e5a, 0x7e79,0x7e6a,0x7e69,0x7e7c,0x7e7b,0x7e83,0x7dd5,0x7e7d, 0x8fae,0x7e7f,0x7e88,0x7e89,0x7e8c,0x7e92,0x7e90,0x7e93, 0x7e94,0x7e96,0x7e8e,0x7e9b,0x7e9c,0x7f38,0x7f3a,0x7f45, 0x7f4c,0x7f4d,0x7f4e,0x7f50,0x7f51,0x7f55,0x7f54,0x7f58, 0x7f5f,0x7f60,0x7f68,0x7f69,0x7f67,0x7f78,0x7f82,0x7f86, 0x7f83,0x7f88,0x7f87,0x7f8c,0x7f94,0x7f9e,0x7f9d,0x7f9a, 0x7fa3,0x7faf,0x7fb2,0x7fb9,0x7fae,0x7fb6,0x7fb8,0x8b71, 0x7fc5,0x7fc6,0x7fca,0x7fd5,0x7fd4,0x7fe1,0x7fe6,0x7fe9, 0x7ff3,0x7ff9,0x98dc,0x8006,0x8004,0x800b,0x8012,0x8018, 0x8019,0x801c,0x8021,0x8028,0x803f,0x803b,0x804a,0x8046, 0x8052,0x8058,0x805a,0x805f,0x8062,0x8068,0x8073,0x8072, 0x8070,0x8076,0x8079,0x807d,0x807f,0x8084,0x8086,0x8085, 0x809b,0x8093,0x809a,0x80ad,0x5190,0x80ac,0x80db,0x80e5, 0x80d9,0x80dd,0x80c4,0x80da,0x80d6,0x8109,0x80ef,0x80f1, 0x811b,0x8129,0x8123,0x812f,0x814b,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_e4[]= { 0x968b,0x8146,0x813e,0x8153,0x8151,0x80fc,0x8171,0x816e, 0x8165,0x8166,0x8174,0x8183,0x8188,0x818a,0x8180,0x8182, 0x81a0,0x8195,0x81a4,0x81a3,0x815f,0x8193,0x81a9,0x81b0, 0x81b5,0x81be,0x81b8,0x81bd,0x81c0,0x81c2,0x81ba,0x81c9, 0x81cd,0x81d1,0x81d9,0x81d8,0x81c8,0x81da,0x81df,0x81e0, 0x81e7,0x81fa,0x81fb,0x81fe,0x8201,0x8202,0x8205,0x8207, 0x820a,0x820d,0x8210,0x8216,0x8229,0x822b,0x8238,0x8233, 0x8240,0x8259,0x8258,0x825d,0x825a,0x825f,0x8264,0x30fb, 0x8262,0x8268,0x826a,0x826b,0x822e,0x8271,0x8277,0x8278, 0x827e,0x828d,0x8292,0x82ab,0x829f,0x82bb,0x82ac,0x82e1, 0x82e3,0x82df,0x82d2,0x82f4,0x82f3,0x82fa,0x8393,0x8303, 0x82fb,0x82f9,0x82de,0x8306,0x82dc,0x8309,0x82d9,0x8335, 0x8334,0x8316,0x8332,0x8331,0x8340,0x8339,0x8350,0x8345, 0x832f,0x832b,0x8317,0x8318,0x8385,0x839a,0x83aa,0x839f, 0x83a2,0x8396,0x8323,0x838e,0x8387,0x838a,0x837c,0x83b5, 0x8373,0x8375,0x83a0,0x8389,0x83a8,0x83f4,0x8413,0x83eb, 0x83ce,0x83fd,0x8403,0x83d8,0x840b,0x83c1,0x83f7,0x8407, 0x83e0,0x83f2,0x840d,0x8422,0x8420,0x83bd,0x8438,0x8506, 0x83fb,0x846d,0x842a,0x843c,0x855a,0x8484,0x8477,0x846b, 0x84ad,0x846e,0x8482,0x8469,0x8446,0x842c,0x846f,0x8479, 0x8435,0x84ca,0x8462,0x84b9,0x84bf,0x849f,0x84d9,0x84cd, 0x84bb,0x84da,0x84d0,0x84c1,0x84c6,0x84d6,0x84a1,0x8521, 0x84ff,0x84f4,0x8517,0x8518,0x852c,0x851f,0x8515,0x8514, 0x84fc,0x8540,0x8563,0x8558,0x8548,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_e5[]= {	0x8541,0x8602,0x854b,0x8555,0x8580,0x85a4,0x8588,0x8591, 0x858a,0x85a8,0x856d,0x8594,0x859b,0x85ea,0x8587,0x859c, 0x8577,0x857e,0x8590,0x85c9,0x85ba,0x85cf,0x85b9,0x85d0, 0x85d5,0x85dd,0x85e5,0x85dc,0x85f9,0x860a,0x8613,0x860b, 0x85fe,0x85fa,0x8606,0x8622,0x861a,0x8630,0x863f,0x864d, 0x4e55,0x8654,0x865f,0x8667,0x8671,0x8693,0x86a3,0x86a9, 0x86aa,0x868b,0x868c,0x86b6,0x86af,0x86c4,0x86c6,0x86b0, 0x86c9,0x8823,0x86ab,0x86d4,0x86de,0x86e9,0x86ec,0x30fb, 0x86df,0x86db,0x86ef,0x8712,0x8706,0x8708,0x8700,0x8703, 0x86fb,0x8711,0x8709,0x870d,0x86f9,0x870a,0x8734,0x873f, 0x8737,0x873b,0x8725,0x8729,0x871a,0x8760,0x875f,0x8778, 0x874c,0x874e,0x8774,0x8757,0x8768,0x876e,0x8759,0x8753, 0x8763,0x876a,0x8805,0x87a2,0x879f,0x8782,0x87af,0x87cb, 0x87bd,0x87c0,0x87d0,0x96d6,0x87ab,0x87c4,0x87b3,0x87c7, 0x87c6,0x87bb,0x87ef,0x87f2,0x87e0,0x880f,0x880d,0x87fe, 0x87f6,0x87f7,0x880e,0x87d2,0x8811,0x8816,0x8815,0x8822, 0x8821,0x8831,0x8836,0x8839,0x8827,0x883b,0x8844,0x8842, 0x8852,0x8859,0x885e,0x8862,0x886b,0x8881,0x887e,0x889e, 0x8875,0x887d,0x88b5,0x8872,0x8882,0x8897,0x8892,0x88ae, 0x8899,0x88a2,0x888d,0x88a4,0x88b0,0x88bf,0x88b1,0x88c3, 0x88c4,0x88d4,0x88d8,0x88d9,0x88dd,0x88f9,0x8902,0x88fc, 0x88f4,0x88e8,0x88f2,0x8904,0x890c,0x890a,0x8913,0x8943, 0x891e,0x8925,0x892a,0x892b,0x8941,0x8944,0x893b,0x8936, 0x8938,0x894c,0x891d,0x8960,0x895e,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_e6[]= {	0x8966,0x8964,0x896d,0x896a,0x896f,0x8974,0x8977,0x897e, 0x8983,0x8988,0x898a,0x8993,0x8998,0x89a1,0x89a9,0x89a6, 0x89ac,0x89af,0x89b2,0x89ba,0x89bd,0x89bf,0x89c0,0x89da, 0x89dc,0x89dd,0x89e7,0x89f4,0x89f8,0x8a03,0x8a16,0x8a10, 0x8a0c,0x8a1b,0x8a1d,0x8a25,0x8a36,0x8a41,0x8a5b,0x8a52, 0x8a46,0x8a48,0x8a7c,0x8a6d,0x8a6c,0x8a62,0x8a85,0x8a82, 0x8a84,0x8aa8,0x8aa1,0x8a91,0x8aa5,0x8aa6,0x8a9a,0x8aa3, 0x8ac4,0x8acd,0x8ac2,0x8ada,0x8aeb,0x8af3,0x8ae7,0x30fb, 0x8ae4,0x8af1,0x8b14,0x8ae0,0x8ae2,0x8af7,0x8ade,0x8adb, 0x8b0c,0x8b07,0x8b1a,0x8ae1,0x8b16,0x8b10,0x8b17,0x8b20, 0x8b33,0x97ab,0x8b26,0x8b2b,0x8b3e,0x8b28,0x8b41,0x8b4c, 0x8b4f,0x8b4e,0x8b49,0x8b56,0x8b5b,0x8b5a,0x8b6b,0x8b5f, 0x8b6c,0x8b6f,0x8b74,0x8b7d,0x8b80,0x8b8c,0x8b8e,0x8b92, 0x8b93,0x8b96,0x8b99,0x8b9a,0x8c3a,0x8c41,0x8c3f,0x8c48, 0x8c4c,0x8c4e,0x8c50,0x8c55,0x8c62,0x8c6c,0x8c78,0x8c7a, 0x8c82,0x8c89,0x8c85,0x8c8a,0x8c8d,0x8c8e,0x8c94,0x8c7c, 0x8c98,0x621d,0x8cad,0x8caa,0x8cbd,0x8cb2,0x8cb3,0x8cae, 0x8cb6,0x8cc8,0x8cc1,0x8ce4,0x8ce3,0x8cda,0x8cfd,0x8cfa, 0x8cfb,0x8d04,0x8d05,0x8d0a,0x8d07,0x8d0f,0x8d0d,0x8d10, 0x9f4e,0x8d13,0x8ccd,0x8d14,0x8d16,0x8d67,0x8d6d,0x8d71, 0x8d73,0x8d81,0x8d99,0x8dc2,0x8dbe,0x8dba,0x8dcf,0x8dda, 0x8dd6,0x8dcc,0x8ddb,0x8dcb,0x8dea,0x8deb,0x8ddf,0x8de3, 0x8dfc,0x8e08,0x8e09,0x8dff,0x8e1d,0x8e1e,0x8e10,0x8e1f, 0x8e42,0x8e35,0x8e30,0x8e34,0x8e4a,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_e7[]= {	0x8e47,0x8e49,0x8e4c,0x8e50,0x8e48,0x8e59,0x8e64,0x8e60, 0x8e2a,0x8e63,0x8e55,0x8e76,0x8e72,0x8e7c,0x8e81,0x8e87, 0x8e85,0x8e84,0x8e8b,0x8e8a,0x8e93,0x8e91,0x8e94,0x8e99, 0x8eaa,0x8ea1,0x8eac,0x8eb0,0x8ec6,0x8eb1,0x8ebe,0x8ec5, 0x8ec8,0x8ecb,0x8edb,0x8ee3,0x8efc,0x8efb,0x8eeb,0x8efe, 0x8f0a,0x8f05,0x8f15,0x8f12,0x8f19,0x8f13,0x8f1c,0x8f1f, 0x8f1b,0x8f0c,0x8f26,0x8f33,0x8f3b,0x8f39,0x8f45,0x8f42, 0x8f3e,0x8f4c,0x8f49,0x8f46,0x8f4e,0x8f57,0x8f5c,0x30fb, 0x8f62,0x8f63,0x8f64,0x8f9c,0x8f9f,0x8fa3,0x8fad,0x8faf, 0x8fb7,0x8fda,0x8fe5,0x8fe2,0x8fea,0x8fef,0x9087,0x8ff4, 0x9005,0x8ff9,0x8ffa,0x9011,0x9015,0x9021,0x900d,0x901e, 0x9016,0x900b,0x9027,0x9036,0x9035,0x9039,0x8ff8,0x904f, 0x9050,0x9051,0x9052,0x900e,0x9049,0x903e,0x9056,0x9058, 0x905e,0x9068,0x906f,0x9076,0x96a8,0x9072,0x9082,0x907d, 0x9081,0x9080,0x908a,0x9089,0x908f,0x90a8,0x90af,0x90b1, 0x90b5,0x90e2,0x90e4,0x6248,0x90db,0x9102,0x9112,0x9119, 0x9132,0x9130,0x914a,0x9156,0x9158,0x9163,0x9165,0x9169, 0x9173,0x9172,0x918b,0x9189,0x9182,0x91a2,0x91ab,0x91af, 0x91aa,0x91b5,0x91b4,0x91ba,0x91c0,0x91c1,0x91c9,0x91cb, 0x91d0,0x91d6,0x91df,0x91e1,0x91db,0x91fc,0x91f5,0x91f6, 0x921e,0x91ff,0x9214,0x922c,0x9215,0x9211,0x925e,0x9257, 0x9245,0x9249,0x9264,0x9248,0x9295,0x923f,0x924b,0x9250, 0x929c,0x9296,0x9293,0x929b,0x925a,0x92cf,0x92b9,0x92b7, 0x92e9,0x930f,0x92fa,0x9344,0x932e,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_e8[]= {	0x9319,0x9322,0x931a,0x9323,0x933a,0x9335,0x933b,0x935c, 0x9360,0x937c,0x936e,0x9356,0x93b0,0x93ac,0x93ad,0x9394, 0x93b9,0x93d6,0x93d7,0x93e8,0x93e5,0x93d8,0x93c3,0x93dd, 0x93d0,0x93c8,0x93e4,0x941a,0x9414,0x9413,0x9403,0x9407, 0x9410,0x9436,0x942b,0x9435,0x9421,0x943a,0x9441,0x9452, 0x9444,0x945b,0x9460,0x9462,0x945e,0x946a,0x9229,0x9470, 0x9475,0x9477,0x947d,0x945a,0x947c,0x947e,0x9481,0x947f, 0x9582,0x9587,0x958a,0x9594,0x9596,0x9598,0x9599,0x30fb, 0x95a0,0x95a8,0x95a7,0x95ad,0x95bc,0x95bb,0x95b9,0x95be, 0x95ca,0x6ff6,0x95c3,0x95cd,0x95cc,0x95d5,0x95d4,0x95d6, 0x95dc,0x95e1,0x95e5,0x95e2,0x9621,0x9628,0x962e,0x962f, 0x9642,0x964c,0x964f,0x964b,0x9677,0x965c,0x965e,0x965d, 0x965f,0x9666,0x9672,0x966c,0x968d,0x9698,0x9695,0x9697, 0x96aa,0x96a7,0x96b1,0x96b2,0x96b0,0x96b4,0x96b6,0x96b8, 0x96b9,0x96ce,0x96cb,0x96c9,0x96cd,0x894d,0x96dc,0x970d, 0x96d5,0x96f9,0x9704,0x9706,0x9708,0x9713,0x970e,0x9711, 0x970f,0x9716,0x9719,0x9724,0x972a,0x9730,0x9739,0x973d, 0x973e,0x9744,0x9746,0x9748,0x9742,0x9749,0x975c,0x9760, 0x9764,0x9766,0x9768,0x52d2,0x976b,0x9771,0x9779,0x9785, 0x977c,0x9781,0x977a,0x9786,0x978b,0x978f,0x9790,0x979c, 0x97a8,0x97a6,0x97a3,0x97b3,0x97b4,0x97c3,0x97c6,0x97c8, 0x97cb,0x97dc,0x97ed,0x9f4f,0x97f2,0x7adf,0x97f6,0x97f5, 0x980f,0x980c,0x9838,0x9824,0x9821,0x9837,0x983d,0x9846, 0x984f,0x984b,0x986b,0x986f,0x9870,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_e9[]= {	0x9871,0x9874,0x9873,0x98aa,0x98af,0x98b1,0x98b6,0x98c4, 0x98c3,0x98c6,0x98e9,0x98eb,0x9903,0x9909,0x9912,0x9914, 0x9918,0x9921,0x991d,0x991e,0x9924,0x9920,0x992c,0x992e, 0x993d,0x993e,0x9942,0x9949,0x9945,0x9950,0x994b,0x9951, 0x9952,0x994c,0x9955,0x9997,0x9998,0x99a5,0x99ad,0x99ae, 0x99bc,0x99df,0x99db,0x99dd,0x99d8,0x99d1,0x99ed,0x99ee, 0x99f1,0x99f2,0x99fb,0x99f8,0x9a01,0x9a0f,0x9a05,0x99e2, 0x9a19,0x9a2b,0x9a37,0x9a45,0x9a42,0x9a40,0x9a43,0x30fb, 0x9a3e,0x9a55,0x9a4d,0x9a5b,0x9a57,0x9a5f,0x9a62,0x9a65, 0x9a64,0x9a69,0x9a6b,0x9a6a,0x9aad,0x9ab0,0x9abc,0x9ac0, 0x9acf,0x9ad1,0x9ad3,0x9ad4,0x9ade,0x9adf,0x9ae2,0x9ae3, 0x9ae6,0x9aef,0x9aeb,0x9aee,0x9af4,0x9af1,0x9af7,0x9afb, 0x9b06,0x9b18,0x9b1a,0x9b1f,0x9b22,0x9b23,0x9b25,0x9b27, 0x9b28,0x9b29,0x9b2a,0x9b2e,0x9b2f,0x9b32,0x9b44,0x9b43, 0x9b4f,0x9b4d,0x9b4e,0x9b51,0x9b58,0x9b74,0x9b93,0x9b83, 0x9b91,0x9b96,0x9b97,0x9b9f,0x9ba0,0x9ba8,0x9bb4,0x9bc0, 0x9bca,0x9bb9,0x9bc6,0x9bcf,0x9bd1,0x9bd2,0x9be3,0x9be2, 0x9be4,0x9bd4,0x9be1,0x9c3a,0x9bf2,0x9bf1,0x9bf0,0x9c15, 0x9c14,0x9c09,0x9c13,0x9c0c,0x9c06,0x9c08,0x9c12,0x9c0a, 0x9c04,0x9c2e,0x9c1b,0x9c25,0x9c24,0x9c21,0x9c30,0x9c47, 0x9c32,0x9c46,0x9c3e,0x9c5a,0x9c60,0x9c67,0x9c76,0x9c78, 0x9ce7,0x9cec,0x9cf0,0x9d09,0x9d08,0x9ceb,0x9d03,0x9d06, 0x9d2a,0x9d26,0x9daf,0x9d23,0x9d1f,0x9d44,0x9d15,0x9d12, 0x9d41,0x9d3f,0x9d3e,0x9d46,0x9d48,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_ea[]= {	0x9d5d,0x9d5e,0x9d64,0x9d51,0x9d50,0x9d59,0x9d72,0x9d89, 0x9d87,0x9dab,0x9d6f,0x9d7a,0x9d9a,0x9da4,0x9da9,0x9db2, 0x9dc4,0x9dc1,0x9dbb,0x9db8,0x9dba,0x9dc6,0x9dcf,0x9dc2, 0x9dd9,0x9dd3,0x9df8,0x9de6,0x9ded,0x9def,0x9dfd,0x9e1a, 0x9e1b,0x9e1e,0x9e75,0x9e79,0x9e7d,0x9e81,0x9e88,0x9e8b, 0x9e8c,0x9e92,0x9e95,0x9e91,0x9e9d,0x9ea5,0x9ea9,0x9eb8, 0x9eaa,0x9ead,0x9761,0x9ecc,0x9ece,0x9ecf,0x9ed0,0x9ed4, 0x9edc,0x9ede,0x9edd,0x9ee0,0x9ee5,0x9ee8,0x9eef,0x30fb, 0x9ef4,0x9ef6,0x9ef7,0x9ef9,0x9efb,0x9efc,0x9efd,0x9f07, 0x9f08,0x76b7,0x9f15,0x9f21,0x9f2c,0x9f3e,0x9f4a,0x9f52, 0x9f54,0x9f63,0x9f5f,0x9f60,0x9f61,0x9f66,0x9f67,0x9f6c, 0x9f6a,0x9f77,0x9f72,0x9f76,0x9f95,0x9f9c,0x9fa0,0x582f, 0x69c7,0x9059,0x7464,0x51dc,0x7199,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb};
    #define s2u_eb s2u_80
    #define s2u_ec s2u_80
    static const unsigned short s2u_ed[]= {	0x7e8a,0x891c,0x9348,0x9288,0x84dc,0x4fc9,0x70bb,0x6631, 0x68c8,0x92f9,0x66fb,0x5f45,0x4e28,0x4ee1,0x4efc,0x4f00, 0x4f03,0x4f39,0x4f56,0x4f92,0x4f8a,0x4f9a,0x4f94,0x4fcd, 0x5040,0x5022,0x4fff,0x501e,0x5046,0x5070,0x5042,0x5094, 0x50f4,0x50d8,0x514a,0x5164,0x519d,0x51be,0x51ec,0x5215, 0x529c,0x52a6,0x52c0,0x52db,0x5300,0x5307,0x5324,0x5372, 0x5393,0x53b2,0x53dd,0xfa0e,0x549c,0x548a,0x54a9,0x54ff, 0x5586,0x5759,0x5765,0x57ac,0x57c8,0x57c7,0xfa0f,0x30fb, 0xfa10,0x589e,0x58b2,0x590b,0x5953,0x595b,0x595d,0x5963, 0x59a4,0x59ba,0x5b56,0x5bc0,0x752f,0x5bd8,0x5bec,0x5c1e, 0x5ca6,0x5cba,0x5cf5,0x5d27,0x5d53,0xfa11,0x5d42,0x5d6d, 0x5db8,0x5db9,0x5dd0,0x5f21,0x5f34,0x5f67,0x5fb7,0x5fde, 0x605d,0x6085,0x608a,0x60de,0x60d5,0x6120,0x60f2,0x6111, 0x6137,0x6130,0x6198,0x6213,0x62a6,0x63f5,0x6460,0x649d, 0x64ce,0x654e,0x6600,0x6615,0x663b,0x6609,0x662e,0x661e, 0x6624,0x6665,0x6657,0x6659,0xfa12,0x6673,0x6699,0x66a0, 0x66b2,0x66bf,0x66fa,0x670e,0xf929,0x6766,0x67bb,0x6852, 0x67c0,0x6801,0x6844,0x68cf,0xfa13,0x6968,0xfa14,0x6998, 0x69e2,0x6a30,0x6a6b,0x6a46,0x6a73,0x6a7e,0x6ae2,0x6ae4, 0x6bd6,0x6c3f,0x6c5c,0x6c86,0x6c6f,0x6cda,0x6d04,0x6d87, 0x6d6f,0x6d96,0x6dac,0x6dcf,0x6df8,0x6df2,0x6dfc,0x6e39, 0x6e5c,0x6e27,0x6e3c,0x6ebf,0x6f88,0x6fb5,0x6ff5,0x7005, 0x7007,0x7028,0x7085,0x70ab,0x710f,0x7104,0x715c,0x7146, 0x7147,0xfa15,0x71c1,0x71fe,0x72b1,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_ee[]= {	0x72be,0x7324,0xfa16,0x7377,0x73bd,0x73c9,0x73d6,0x73e3, 0x73d2,0x7407,0x73f5,0x7426,0x742a,0x7429,0x742e,0x7462, 0x7489,0x749f,0x7501,0x756f,0x7682,0x769c,0x769e,0x769b, 0x76a6,0xfa17,0x7746,0x52af,0x7821,0x784e,0x7864,0x787a, 0x7930,0xfa18,0xfa19,0xfa1a,0x7994,0xfa1b,0x799b,0x7ad1, 0x7ae7,0xfa1c,0x7aeb,0x7b9e,0xfa1d,0x7d48,0x7d5c,0x7db7, 0x7da0,0x7dd6,0x7e52,0x7f47,0x7fa1,0xfa1e,0x8301,0x8362, 0x837f,0x83c7,0x83f6,0x8448,0x84b4,0x8553,0x8559,0x30fb, 0x856b,0xfa1f,0x85b0,0xfa20,0xfa21,0x8807,0x88f5,0x8a12, 0x8a37,0x8a79,0x8aa7,0x8abe,0x8adf,0xfa22,0x8af6,0x8b53, 0x8b7f,0x8cf0,0x8cf4,0x8d12,0x8d76,0xfa23,0x8ecf,0xfa24, 0xfa25,0x9067,0x90de,0xfa26,0x9115,0x9127,0x91da,0x91d7, 0x91de,0x91ed,0x91ee,0x91e4,0x91e5,0x9206,0x9210,0x920a, 0x923a,0x9240,0x923c,0x924e,0x9259,0x9251,0x9239,0x9267, 0x92a7,0x9277,0x9278,0x92e7,0x92d7,0x92d9,0x92d0,0xfa27, 0x92d5,0x92e0,0x92d3,0x9325,0x9321,0x92fb,0xfa28,0x931e, 0x92ff,0x931d,0x9302,0x9370,0x9357,0x93a4,0x93c6,0x93de, 0x93f8,0x9431,0x9445,0x9448,0x9592,0xf9dc,0xfa29,0x969d, 0x96af,0x9733,0x973b,0x9743,0x974d,0x974f,0x9751,0x9755, 0x9857,0x9865,0xfa2a,0xfa2b,0x9927,0xfa2c,0x999e,0x9a4e, 0x9ad9,0x9adc,0x9b75,0x9b72,0x9b8f,0x9bb1,0x9bbb,0x9c00, 0x9d70,0x9d6b,0xfa2d,0x9e19,0x9ed1,0x30fb,0x30fb,0x2170, 0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177,0x2178, 0x2179,0xffe2,0xffe4,0xff07,0xff02,0x30fb,0x30fb,0x30fb};
    #define s2u_ef s2u_80
    #define s2u_f0 s2u_80
    #define s2u_f1 s2u_80
    #define s2u_f2 s2u_80
    #define s2u_f3 s2u_80
    #define s2u_f3 s2u_80
    #define s2u_f4 s2u_80
    #define s2u_f5 s2u_80
    #define s2u_f6 s2u_80
    #define s2u_f7 s2u_80
    #define s2u_f8 s2u_80
    #define s2u_f9 s2u_80
    static const unsigned short s2u_fa[]= {	0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177, 0x2178,0x2179,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165, 0x2166,0x2167,0x2168,0x2169,0xffe2,0xffe4,0xff07,0xff02, 0x3231,0x2116,0x2121,0x2235,0x7e8a,0x891c,0x9348,0x9288, 0x84dc,0x4fc9,0x70bb,0x6631,0x68c8,0x92f9,0x66fb,0x5f45, 0x4e28,0x4ee1,0x4efc,0x4f00,0x4f03,0x4f39,0x4f56,0x4f92, 0x4f8a,0x4f9a,0x4f94,0x4fcd,0x5040,0x5022,0x4fff,0x501e, 0x5046,0x5070,0x5042,0x5094,0x50f4,0x50d8,0x514a,0x30fb, 0x5164,0x519d,0x51be,0x51ec,0x5215,0x529c,0x52a6,0x52c0, 0x52db,0x5300,0x5307,0x5324,0x5372,0x5393,0x53b2,0x53dd, 0xfa0e,0x549c,0x548a,0x54a9,0x54ff,0x5586,0x5759,0x5765, 0x57ac,0x57c8,0x57c7,0xfa0f,0xfa10,0x589e,0x58b2,0x590b, 0x5953,0x595b,0x595d,0x5963,0x59a4,0x59ba,0x5b56,0x5bc0, 0x752f,0x5bd8,0x5bec,0x5c1e,0x5ca6,0x5cba,0x5cf5,0x5d27, 0x5d53,0xfa11,0x5d42,0x5d6d,0x5db8,0x5db9,0x5dd0,0x5f21, 0x5f34,0x5f67,0x5fb7,0x5fde,0x605d,0x6085,0x608a,0x60de, 0x60d5,0x6120,0x60f2,0x6111,0x6137,0x6130,0x6198,0x6213, 0x62a6,0x63f5,0x6460,0x649d,0x64ce,0x654e,0x6600,0x6615, 0x663b,0x6609,0x662e,0x661e,0x6624,0x6665,0x6657,0x6659, 0xfa12,0x6673,0x6699,0x66a0,0x66b2,0x66bf,0x66fa,0x670e, 0xf929,0x6766,0x67bb,0x6852,0x67c0,0x6801,0x6844,0x68cf, 0xfa13,0x6968,0xfa14,0x6998,0x69e2,0x6a30,0x6a6b,0x6a46, 0x6a73,0x6a7e,0x6ae2,0x6ae4,0x6bd6,0x6c3f,0x6c5c,0x6c86, 0x6c6f,0x6cda,0x6d04,0x6d87,0x6d6f,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_fb[]= {	0x6d96,0x6dac,0x6dcf,0x6df8,0x6df2,0x6dfc,0x6e39,0x6e5c, 0x6e27,0x6e3c,0x6ebf,0x6f88,0x6fb5,0x6ff5,0x7005,0x7007, 0x7028,0x7085,0x70ab,0x710f,0x7104,0x715c,0x7146,0x7147, 0xfa15,0x71c1,0x71fe,0x72b1,0x72be,0x7324,0xfa16,0x7377, 0x73bd,0x73c9,0x73d6,0x73e3,0x73d2,0x7407,0x73f5,0x7426, 0x742a,0x7429,0x742e,0x7462,0x7489,0x749f,0x7501,0x756f, 0x7682,0x769c,0x769e,0x769b,0x76a6,0xfa17,0x7746,0x52af, 0x7821,0x784e,0x7864,0x787a,0x7930,0xfa18,0xfa19,0x30fb, 0xfa1a,0x7994,0xfa1b,0x799b,0x7ad1,0x7ae7,0xfa1c,0x7aeb, 0x7b9e,0xfa1d,0x7d48,0x7d5c,0x7db7,0x7da0,0x7dd6,0x7e52, 0x7f47,0x7fa1,0xfa1e,0x8301,0x8362,0x837f,0x83c7,0x83f6, 0x8448,0x84b4,0x8553,0x8559,0x856b,0xfa1f,0x85b0,0xfa20, 0xfa21,0x8807,0x88f5,0x8a12,0x8a37,0x8a79,0x8aa7,0x8abe, 0x8adf,0xfa22,0x8af6,0x8b53,0x8b7f,0x8cf0,0x8cf4,0x8d12, 0x8d76,0xfa23,0x8ecf,0xfa24,0xfa25,0x9067,0x90de,0xfa26, 0x9115,0x9127,0x91da,0x91d7,0x91de,0x91ed,0x91ee,0x91e4, 0x91e5,0x9206,0x9210,0x920a,0x923a,0x9240,0x923c,0x924e, 0x9259,0x9251,0x9239,0x9267,0x92a7,0x9277,0x9278,0x92e7, 0x92d7,0x92d9,0x92d0,0xfa27,0x92d5,0x92e0,0x92d3,0x9325, 0x9321,0x92fb,0xfa28,0x931e,0x92ff,0x931d,0x9302,0x9370, 0x9357,0x93a4,0x93c6,0x93de,0x93f8,0x9431,0x9445,0x9448, 0x9592,0xf9dc,0xfa29,0x969d,0x96af,0x9733,0x973b,0x9743, 0x974d,0x974f,0x9751,0x9755,0x9857,0x9865,0xfa2a,0xfa2b, 0x9927,0xfa2c,0x999e,0x9a4e,0x9ad9,0x30fb,0x30fb,0x30fb};
    static const unsigned short s2u_fc[]= {	0x9adc,0x9b75,0x9b72,0x9b8f,0x9bb1,0x9bbb,0x9c00,0x9d70, 0x9d6b,0xfa2d,0x9e19,0x9ed1,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb, 0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb,0x30fb};
    #define s2u_fd s2u_80
    #define s2u_fe s2u_80
    #define s2u_ff s2u_80

    static const unsigned short __attribute__((aligned(16))) *s2u[] = {
	s2u_80,s2u_81,s2u_82,s2u_83,s2u_84,s2u_85,s2u_86,s2u_87,
	s2u_88,s2u_89,s2u_8a,s2u_8b,s2u_8c,s2u_8d,s2u_8e,s2u_8f,
	s2u_90,s2u_91,s2u_92,s2u_93,s2u_94,s2u_95,s2u_96,s2u_97,
	s2u_98,s2u_99,s2u_9a,s2u_9b,s2u_9c,s2u_9d,s2u_9e,s2u_9f,
	s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,
	s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,
	s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,
	s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,
	s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,
	s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,
	s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,
	s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,s2u_80,
	s2u_e0,s2u_e1,s2u_e2,s2u_e3,s2u_e4,s2u_e5,s2u_e6,s2u_e7,
	s2u_e8,s2u_e9,s2u_ea,s2u_eb,s2u_ec,s2u_ed,s2u_ee,s2u_ef,
	s2u_f0,s2u_f1,s2u_f2,s2u_f3,s2u_f4,s2u_f5,s2u_f6,s2u_f7,
	s2u_f8,s2u_f9,s2u_fa,s2u_fb,s2u_fc,s2u_fd,s2u_fe,s2u_ff};
	
	if (**text >= 0xa0 && **text <= 0xdf) {
		ucs2 = 0xff60 + (**text) - 0xa0; 
		(*text)++;
	} else if (**text&0x80) {
		ucs2 = s2u[**text - 0x80][*(*text+1) - 0x40];
		(*text) += 2;
	} else{
		ucs2 = **text; 
		(*text)++;
	}
#endif	
	
	return ucs2;
}

float intraFontPrintf(intraFont *font, float x, float y, const char *text, ...) {
	if(!font) return x;

	char buffer[256];
	va_list ap;
	
	va_start(ap, text);
	vsnprintf(buffer, 256, text, ap);
	va_end(ap);
	buffer[255] = 0;
	
	return intraFontPrint(font, x, y, buffer);
}

float intraFontPrint(intraFont *font, float x, float y, const char *text) {
    if (!text || strlen(text) == 0 || !font) return x;
	
	int i = 0, length = 0;
	if (font->options & INTRAFONT_STRING_SJIS) {
		while (text[i]) {
			length++;
			i += ( text[i] <= 0x7FU || (text[i] >= 0xA0U && text[i] <= 0xDFU) || text[i] >= 0xFDU) ? 1 : 2; //single or double byte
		}
	} else {
		length = strlen(text);
	}
	
    unsigned short* ucs2_text = (unsigned short*)malloc((length+1)*sizeof(unsigned short));
    if (!ucs2_text) return x;
	
	unsigned char* utext = (unsigned char*)text;
	for (i = 0; i < length; i++) {
		if (font->options & INTRAFONT_STRING_SJIS) {
			ucs2_text[i] = intraFontSJIS2UCS2((unsigned char**)&utext);
		} else {
			ucs2_text[i] = utext[i];
		}
	}
    ucs2_text[i] = 0;
	
    x = intraFontPrintUCS2(font, x, y, ucs2_text);
	
    free(ucs2_text);
	
    return x;
}

float intraFontPrintUCS2(intraFont *font, float x, float y, const unsigned short *text) {
	if(!font) return x;
	
	float glyphscale = font->size;
	float width = 0.0f, height = font->advancey * glyphscale / 4.0;
	float left = x, top = y - height; 
	if (font->options & INTRAFONT_ALIGN_RIGHT)  left -= intraFontMeasureTextUCS2(font, text);
	if (font->options & INTRAFONT_ALIGN_CENTER) left -= intraFontMeasureTextUCS2(font, text)/2.0;
	
	typedef struct {
		float u, v;
		unsigned int c;
		float x, y, z;
	} fontVertex;
	fontVertex *v, *v0, *v1, *s0, *s1;
	
	//count number of characters
	int length = 0;
	while (text[length] > 0) length++;
	if (length == 0) return x;
	
	//count number of glyphs to draw and cache BMPs
	int i, j, n_glyphs, last_n_glyphs, n_sglyphs, changed, count = 0;
	unsigned short char_id, subucs2, glyph_id;
	do {
		changed = 0;
		n_glyphs = 0;
		n_sglyphs = 0;
		last_n_glyphs = 0;
		for(i = 0; i < length; i++) {
		
			char_id = intraFontGetID(font,text[i]); //char
			if (char_id < font->n_chars) {
				if ((font->glyph[char_id].flags & PGF_BMP_OVERLAY) == PGF_BMP_OVERLAY) { //overlay glyph?
					for (j = 0; j < 3; j++) {
						subucs2 = font->fontdata[(font->glyph[char_id].ptr)+j*2] + font->fontdata[(font->glyph[char_id].ptr)+j*2+1] * 256;				
						if (subucs2) {
							glyph_id = intraFontGetID(font, subucs2);
							if (glyph_id < font->n_chars) {
								n_glyphs++;
								if (!(font->glyph[glyph_id].flags & PGF_CACHED)) {
									if (intraFontGetBMP(font,glyph_id,PGF_CHARGLYPH)) changed = 1; 
								}								
							}
						}
					}
				} else {
					n_glyphs++; 
					if (!(font->glyph[char_id].flags & PGF_CACHED)) {
						if (intraFontGetBMP(font,char_id,PGF_CHARGLYPH)) changed = 1; 
					}
				}
			
				if (n_glyphs > last_n_glyphs) {
					n_sglyphs++; //shadow
					if (!(font->shadowGlyph[font->glyph[char_id].shadowID].flags & PGF_CACHED)) {
						if (intraFontGetBMP(font,font->glyph[char_id].shadowID,PGF_SHADOWGLYPH)) changed = 1; 
					}
					last_n_glyphs = n_glyphs;
				}
				
			}
			
		}
		count++;
	} while (changed && count <= length);
	if (changed) return x; //not all chars fit into texture -> abort (better solution: split up string and call intraFontPrintUCS2 twice)
	
	//reserve memory in displaylist
	v = sceGuGetMemory(((n_glyphs+n_sglyphs)<<1) * sizeof(fontVertex));

	int s_index = 0, c_index = n_sglyphs, last_c_index = n_sglyphs; // index for shadow and character/overlay glyphs	
	for(i = 0; i < length; i++) {
		unsigned short char_id = intraFontGetID(font,text[i]);
		if (char_id < font->n_chars) {
		
			//center glyphs for monospace
			if (font->options & INTRAFONT_WIDTH_FIX) {
				width += ( ((float)(font->options & PGF_WIDTH_MASK))/2.0f - ((float)font->glyph[char_id].advance)/8.0f ) * glyphscale ;
			}
		
			//add vertices for subglyhs				
			for (j = 0; j < 3; j++) {			
				if ((font->glyph[char_id].flags & PGF_BMP_OVERLAY) == PGF_BMP_OVERLAY) {
					subucs2 = font->fontdata[(font->glyph[char_id].ptr)+j*2] + font->fontdata[(font->glyph[char_id].ptr)+j*2+1] * 256;				
					glyph_id = intraFontGetID(font, subucs2);
				} else {
					glyph_id = char_id;
					j = 2;
				}
		
				if (glyph_id < font->n_chars) {
					Glyph *glyph = &(font->glyph[glyph_id]);

					v0 = &v[(c_index<<1) + 0];
					v1 = &v[(c_index<<1) + 1];

					v0->u = glyph->x-0.25f;
					v0->v = glyph->y-0.25f;
					v0->c = font->color;
					v0->x = left + width + glyph->left*glyphscale;
					v0->y = top + height - glyph->top *glyphscale;
					v0->z = 0.0f;

					v1->u = (glyph->x + glyph->width)+0.25f;
					v1->v = (glyph->y + glyph->height)+0.25f;
					v1->c = font->color;
					v1->x = left + width + (glyph->width+glyph->left)*glyphscale;
					v1->y = top + height + (glyph->height-glyph->top)*glyphscale;
					v1->z = 0.0f;
					
					c_index++;
				}
			}
				
			//add vertices for shadow
			if (c_index > last_c_index) {
				Glyph *shadowGlyph = &(font->shadowGlyph[font->glyph[char_id].shadowID]);
		
				s0 = &v[(s_index<<1) + 0];
				s1 = &v[(s_index<<1) + 1];

				s0->u = shadowGlyph->x-0.25f;
				s0->v = shadowGlyph->y-0.25f;
				s0->c = font->shadowColor;
				s0->x = left + width + shadowGlyph->left*glyphscale*64.0f/((float)font->shadowscale);
				s0->y = top + height - shadowGlyph->top *glyphscale*64.0f/((float)font->shadowscale);
				s0->z = 0.0f;

				s1->u = (shadowGlyph->x + shadowGlyph->width)+0.25f;
				s1->v = (shadowGlyph->y + shadowGlyph->height)+0.25f;
				s1->c = font->shadowColor;
				s1->x = left + width + (shadowGlyph->width+shadowGlyph->left)*glyphscale*64.0f/((float)font->shadowscale);
				s1->y = top + height + (shadowGlyph->height-shadowGlyph->top)*glyphscale*64.0f/((float)font->shadowscale);
				s1->z = 0.0f;
			
				s_index++;
				last_c_index = c_index;
			}

			// advance
			if (font->options & INTRAFONT_WIDTH_FIX) {
				width += ( ((float)(font->options & PGF_WIDTH_MASK))/2.0f + ((float)font->glyph[char_id].advance)/8.0f ) * glyphscale; 
			} else {
				width += font->glyph[char_id].advance * glyphscale * 0.25;
			}
			
		} 
		
		if (text[i] == '\n') {
			left = x;
			if (font->options & INTRAFONT_ALIGN_RIGHT)  left -= intraFontMeasureTextUCS2(font, text+i+1);
			if (font->options & INTRAFONT_ALIGN_CENTER) left -= intraFontMeasureTextUCS2(font, text+i+1)/2.0;
			width = 0.0f;
			height += font->advancey * glyphscale / 4.0;
		}
	}
		
	//finalize and activate texture (if not already active or has been changed)
	sceKernelDcacheWritebackAll();
	if (!(font->options & INTRAFONT_ACTIVE)) intraFontActivate(font);
	
	sceGuDisable(GU_DEPTH_TEST);
	sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_COLOR_8888|GU_VERTEX_32BITF|GU_TRANSFORM_2D, (n_glyphs+n_sglyphs)<<1, 0, v);
	sceGuEnable(GU_DEPTH_TEST);
	
	return left+width;
}

float intraFontMeasureText(intraFont *font, const char *text) { 
    if (!font) return 0.0f; 
	
	int i, length = 0;
	float x = 0.0f;
	
	while ((text[length] > 0) && (text[length] != '\n')) length++; //strlen until end of string or newline
	
	for(i = 0; i < length; i++) { 
		unsigned short char_id = intraFontGetID(font,text[i]); 
		if (char_id < font->n_chars) 
			x += (font->options & INTRAFONT_WIDTH_FIX) ? (font->options & PGF_WIDTH_MASK)*font->size : (font->glyph[char_id].advance)*font->size*0.25f; 
	}    
	
    return x; 
} 

float intraFontMeasureTextUCS2(intraFont *font, const unsigned short *text) { 
   if(!font) return 0.0f; 

   int i, length = 0; 
   float x = 0.0f; 

   while ((text[length] > 0) && (text[length] != '\n')) length++; //strlen until end of string or newline

   for(i = 0; i < length; i++) { 
		unsigned short char_id = intraFontGetID(font,text[i]); 
		if (char_id < font->n_chars) 
			x += (font->options & INTRAFONT_WIDTH_FIX) ? (font->options & PGF_WIDTH_MASK)*font->size : (font->glyph[char_id].advance)*font->size*0.25f; 
	} 

   return x; 
}

Show on old repository browser