Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 4363 → Rev 4364

/contrib/network/netsurf/libnsfb/src/surface/Makefile
0,0 → 1,7
# Sources
OBJS := surface.o able.o ram.o linux.o sdl.o kolibri.o
 
OUTFILE = sup.o
 
CFLAGS += -I ../../include/ -I ../../ -I ../ -I ./ -I /home/sourcerer/kos_src/newenginek/kolibri/include
include $(MENUETDEV)/makefiles/Makefile_for_o_lib
/contrib/network/netsurf/libnsfb/src/surface/kolibri.c
0,0 → 1,545
/*
* Copyright 2013 SoUrcerer sourcerer@bk.ru
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
#include <stdbool.h>
#include <stdlib.h>
 
#include "libnsfb.h"
#include "libnsfb_event.h"
#include "libnsfb_plot.h"
#include "libnsfb_plot_util.h"
 
#include "nsfb.h"
#include "surface.h"
#include "palette.h"
#include "plot.h"
#include "cursor.h"
 
 
#include <menuet/os.h>
 
 
 
unsigned char * pixels;
 
inline void f65(unsigned x, unsigned y, unsigned w, unsigned h, char *d)
{
asm("pusha");
asm ("nop"::"D"(0), "c"(w*65536+h), "d"(x*65536+y), "b"(d));
asm ("xor %eax, %eax");
asm ("movl %eax, %ebp");
asm ("pushl $32");
asm ("popl %esi");
asm ("int $0x40"::"a"(65));
asm("popa");
}
 
 
unsigned kol_mouse_posw()
{
unsigned error;
asm volatile ("int $0x40":"=a"(error):"a"(37), "b"(1));
return error;
}
 
 
unsigned kol_mouse_btn()
{
unsigned error;
asm volatile ("int $0x40":"=a"(error):"a"(37), "b"(2));
return error;
}
 
unsigned kol_scancodes()
{
unsigned error;
asm volatile ("int $0x40":"=a"(error):"a"(66), "b"(1), "c"(1));
return error;
}
 
 
void kolibri_redraw(nsfb_t *nsfb){
 
f65(0,0, nsfb->width, nsfb->height, pixels);
 
}
 
 
unsigned kol_skin_h()
{
unsigned error;
asm volatile ("int $0x40":"=a"(error):"a"(48), "b"(4));
return error;
}
 
unsigned kol_area(char *data)
{
unsigned error;
asm volatile ("int $0x40":"=a"(error):"a"(9), "b"(data), "c"(0xffffffff));
return error;
}
 
 
void kolibri_window_redraw(nsfb_t *nsfb){
__menuet__window_redraw(1);
__menuet__define_window(100,100,nsfb->width+9,nsfb->height+kol_skin_h(),0x34000080,0x800000FF,"Netsurf");
//__menuet__write_text(3,3,0xFFFFFF,"Netsurf",7);
//__menuet__debug_out("f65 is mighty!\n");
 
//here put image pixels! it's 32bpp
f65(0,0, nsfb->width, nsfb->height, pixels);
__menuet__window_redraw(2);
}
 
 
 
static bool
kolibricopy(nsfb_t *nsfb, nsfb_bbox_t *srcbox, nsfb_bbox_t *dstbox)
{
char *pixels = nsfb->surface_priv;
nsfb_bbox_t allbox;
struct nsfb_cursor_s *cursor = nsfb->cursor;
 
nsfb_plot_add_rect(srcbox, dstbox, &allbox);
 
int x,y,w,h;
x = srcbox->x0;
y = srcbox->y0;
w = srcbox->x1 - srcbox->x0;
h = srcbox->y1 - srcbox->y0;
int tx, ty, tw, th;
tx = dstbox->x0;
ty = dstbox->y0;
tw = dstbox->x1 - dstbox->x0;
th = dstbox->y1 - dstbox->y0;
// char pst[255];
// sprintf (pst, "Src %d,%d %dx%d Dst %d,%d %dx%d \n", x,y,w,h,tx,ty,tw,th);
// __menuet__debug_out(pst);
int px, py, pp;
 
for (px=x; px<w; px++)
for (py=y;py<h;py++)
for (pp=0; pp<4; pp++) {
pixels[4*(px+tx)*nsfb->width+4*(py+ty)+pp]=pixels[4*px*nsfb->width+4*py+pp];
}
kolibri_redraw(nsfb);
 
return true;
 
}
 
static int kolibri_set_geometry(nsfb_t *nsfb, int width, int height,
enum nsfb_format_e format)
{
if (nsfb->surface_priv != NULL)
return -1; /* fail if surface already initialised */
 
nsfb->width = width;
nsfb->height = height;
nsfb->format = format;
pixels=(char *)malloc(width*height*4);
/* select default sw plotters for format */
select_plotters(nsfb);
 
//nsfb->plotter_fns->copy = kolibricopy;
 
return 0;
}
unsigned pz, pb;
 
static int kolibri_initialise(nsfb_t *nsfb)
{
enum nsfb_format_e fmt;
 
kol_scancodes();
 
pz=0;
pb=0;
 
__menuet__debug_out("Start UI\n");
 
if (nsfb->surface_priv != NULL)
return -1;
 
/* sanity checked depth. */
if ((nsfb->bpp != 32) ) {
__menuet__debug_out("Wrong bpp\n");
return -1; }
 
fmt = NSFB_FMT_XRGB8888;
/* If we didn't get what we asked for, reselect plotters */
if (nsfb->format != fmt) {
nsfb->format = fmt;
 
if (kolibri_set_geometry(nsfb, nsfb->width, nsfb->height,
nsfb->format) != 0) {
__menuet__debug_out("can't set geometry\n");
return -1;
}
}
 
nsfb->surface_priv = pixels;
 
nsfb->ptr = pixels;
nsfb->linelen = (nsfb->width * nsfb->bpp) / 8;
__menuet__debug_out("Redraw\n");
kolibri_redraw(nsfb);
__menuet__set_bitfield_for_wanted_events(EVENT_REDRAW|EVENT_KEY|EVENT_BUTTON|EVENT_MOUSE_CHANGE);
 
return 0;
}
 
 
 
static int kolibri_finalise(nsfb_t *nsfb)
{
nsfb=nsfb;
__menuet__sys_exit();
return 0;
}
 
 
 
int isup(int scan){
return (scan&0x80)>>7;
}
 
int scan2key(int scan){
int keycode=(scan&0x0FF7F);
/* MAIN KB - NUMS */
if (keycode == 0x02) return NSFB_KEY_1;
if (keycode == 0x03) return NSFB_KEY_2;
if (keycode == 0x04) return NSFB_KEY_3;
if (keycode == 0x05) return NSFB_KEY_4;
if (keycode == 0x06) return NSFB_KEY_5;
if (keycode == 0x07) return NSFB_KEY_6;
if (keycode == 0x08) return NSFB_KEY_7;
if (keycode == 0x09) return NSFB_KEY_8;
if (keycode == 0x0A) return NSFB_KEY_9;
if (keycode == 0x0B) return NSFB_KEY_0;
if (keycode == 0x10) return NSFB_KEY_q;
if (keycode == 0x11) return NSFB_KEY_w;
if (keycode == 0x12) return NSFB_KEY_e;
if (keycode == 0x13) return NSFB_KEY_r;
if (keycode == 0x14) return NSFB_KEY_t;
if (keycode == 0x15) return NSFB_KEY_y;
if (keycode == 0x16) return NSFB_KEY_u;
if (keycode == 0x17) return NSFB_KEY_i;
if (keycode == 0x18) return NSFB_KEY_o;
if (keycode == 0x19) return NSFB_KEY_p;
if (keycode == 0x1A) return NSFB_KEY_LEFTBRACKET;
if (keycode == 0x1B) return NSFB_KEY_RIGHTBRACKET;
if (keycode == 0x1E) return NSFB_KEY_a;
if (keycode == 0x1F) return NSFB_KEY_s;
if (keycode == 0x20) return NSFB_KEY_d;
if (keycode == 0x21) return NSFB_KEY_f;
if (keycode == 0x22) return NSFB_KEY_g;
if (keycode == 0x23) return NSFB_KEY_h;
if (keycode == 0x24) return NSFB_KEY_j;
if (keycode == 0x25) return NSFB_KEY_k;
if (keycode == 0x26) return NSFB_KEY_l;
if (keycode == 0x2C) return NSFB_KEY_z;
if (keycode == 0x2D) return NSFB_KEY_x;
if (keycode == 0x2E) return NSFB_KEY_c;
if (keycode == 0x2F) return NSFB_KEY_v;
if (keycode == 0x30) return NSFB_KEY_b;
if (keycode == 0x31) return NSFB_KEY_n;
if (keycode == 0x32) return NSFB_KEY_m;
if (keycode == 0x27) return NSFB_KEY_SEMICOLON;
if (keycode == 0x28) return NSFB_KEY_QUOTEDBL;
if (keycode == 0x2B) return NSFB_KEY_BACKSLASH;
if (keycode == 0x33) return NSFB_KEY_COMMA;
if (keycode == 0x34) return NSFB_KEY_PERIOD;
if (keycode == 0x35) return NSFB_KEY_SLASH;
if (keycode == 0x0C) return NSFB_KEY_MINUS;
if (keycode == 0x0D) return NSFB_KEY_EQUALS;
if (keycode == 0x0E) return NSFB_KEY_BACKSPACE;
if (keycode == 0xE053) return NSFB_KEY_DELETE;
if (keycode == 0x2A) return NSFB_KEY_LSHIFT;
if (keycode == 0x36) return NSFB_KEY_RSHIFT;
if (keycode == 0x1C) return NSFB_KEY_RETURN;
if (keycode == 0xE04B) return NSFB_KEY_LEFT;
if (keycode == 0xE04D) return NSFB_KEY_RIGHT;
if (keycode == 0xE048) return NSFB_KEY_UP;
if (keycode == 0xE050) return NSFB_KEY_DOWN;
if (keycode == 0x3F) return NSFB_KEY_F5;
if (keycode == 0x39) return NSFB_KEY_SPACE;
if (keycode == 0x01) return NSFB_KEY_ESCAPE;
if (keycode == 0x38) return NSFB_KEY_LALT;
if (keycode == 0x1D) return NSFB_KEY_LCTRL;
if (keycode == 0xE038) return NSFB_KEY_RALT;
if (keycode == 0xE01D) return NSFB_KEY_RCTRL;
if (keycode == 0xE047) return NSFB_KEY_HOME;
if (keycode == 0xE04F) return NSFB_KEY_END;
if (keycode == 0xE049) return NSFB_KEY_PAGEUP;
if (keycode == 0xE051) return NSFB_KEY_PAGEDOWN;
return NSFB_KEY_UNKNOWN;
}
 
int ispowerkey(int scan){
return (scan&0xE000)>>15;
}
 
 
static bool kolibri_input(nsfb_t *nsfb, nsfb_event_t *event, int timeout)
{
int got_event;
static int scanfull=0;
 
nsfb = nsfb; /* unused */
 
got_event = __menuet__check_for_event();
 
if (got_event == 0) {
return false;
}
 
event->type = NSFB_EVENT_NONE;
 
if (got_event==1) { //key pressed
kolibri_window_redraw(nsfb);
}
 
if (got_event==2) { //key pressed
int scanz = __menuet__getkey();
//char dbs[64];
//__menuet__debug_out("KEY PRESSED\n");
// sprintf (dbs, "FULLKEY BEFORE: F:%x\n", scanfull);
//__menuet__debug_out(dbs);
if (scanz==0xE0) {
scanfull=0xE000;
return true;
} else {
scanfull=scanfull+scanz;
}
//sprintf (dbs, "FULLKEY AFTER: F:%x\n", scanfull);
//__menuet__debug_out(dbs);
if (isup(scanfull)==1) {
event->type = NSFB_EVENT_KEY_UP;} else {
event->type = NSFB_EVENT_KEY_DOWN;}
event->value.keycode = scan2key(scanfull);
//sprintf (dbs, "KEY: %x F:%x %d %d\n", scanz, scanfull, isup(scanz), scan2key(scanz));
//__menuet__debug_out(dbs);
scanfull=0;
return true;
 
}
if (got_event==3) { //key pressed
if (__menuet__get_button_id()==1) kolibri_finalise(nsfb);
return true;
}
if (got_event==6) { //key pressed
unsigned z=kol_mouse_posw();
unsigned b=kol_mouse_btn();
if (pz!=z) {
event->type = NSFB_EVENT_MOVE_ABSOLUTE;
event->value.vector.x = (z&0xffff0000)>>16; //sdlevent.motion.x;
event->value.vector.y = z&0xffff; //sdlevent.motion.y;
event->value.vector.z = 0;
pz=z;
return true;
}
if (pb!=b) {
unsigned t=b&1;
if (t==0) {
event->type = NSFB_EVENT_KEY_UP;
event->value.keycode = NSFB_KEY_MOUSE_1;
} else {
event->type = NSFB_EVENT_KEY_DOWN;
event->value.keycode = NSFB_KEY_MOUSE_1;
}
pb=b;
return true;
}
}
 
/*
 
case SDL_MOUSEBUTTONDOWN:
event->type = NSFB_EVENT_KEY_DOWN;
 
switch (sdlevent.button.button) {
 
case SDL_BUTTON_LEFT:
event->value.keycode = NSFB_KEY_MOUSE_1;
break;
 
case SDL_BUTTON_MIDDLE:
event->value.keycode = NSFB_KEY_MOUSE_2;
break;
 
case SDL_BUTTON_RIGHT:
event->value.keycode = NSFB_KEY_MOUSE_3;
break;
 
}
break;
 
case SDL_MOUSEBUTTONUP:
event->type = NSFB_EVENT_KEY_UP;
 
switch (sdlevent.button.button) {
 
case SDL_BUTTON_LEFT:
event->value.keycode = NSFB_KEY_MOUSE_1;
break;
 
case SDL_BUTTON_MIDDLE:
event->value.keycode = NSFB_KEY_MOUSE_2;
break;
 
case SDL_BUTTON_RIGHT:
event->value.keycode = NSFB_KEY_MOUSE_3;
break;
 
}
break;
 
case SDL_MOUSEMOTION:
event->type = NSFB_EVENT_MOVE_ABSOLUTE;
event->value.vector.x = sdlevent.motion.x;
event->value.vector.y = sdlevent.motion.y;
event->value.vector.z = 0;
break;
 
case SDL_QUIT:
event->type = NSFB_EVENT_CONTROL;
event->value.controlcode = NSFB_CONTROL_QUIT;
break;
 
case SDL_USEREVENT:
event->type = NSFB_EVENT_CONTROL;
event->value.controlcode = NSFB_CONTROL_TIMEOUT;
break;
 
}
*/
return true;
}
 
 
static int kolibri_claim(nsfb_t *nsfb, nsfb_bbox_t *box)
{
/*
if ((cursor != NULL) &&
(cursor->plotted == true) &&
(nsfb_plot_bbox_intersect(box, &cursor->loc))) {
nsfb_cursor_clear(nsfb, cursor);
} */
return 0; //stub yet
}
 
static int kolibri_cursor(nsfb_t *nsfb, struct nsfb_cursor_s *cursor)
{
return true; //stub yet
}
 
 
 
static int kolibri_update(nsfb_t *nsfb, nsfb_bbox_t *box)
{
/*SDL_Surface *sdl_screen = nsfb->surface_priv;
struct nsfb_cursor_s *cursor = nsfb->cursor;
 
if ((cursor != NULL) &&
(cursor->plotted == false)) {
nsfb_cursor_plot(nsfb, cursor);
}
 
SDL_UpdateRect(sdl_screen,
box->x0,
box->y0,
box->x1 - box->x0,
box->y1 - box->y0);
*/
//Ask for window redraw here!
kolibri_redraw(nsfb);
return 0;
}
 
const nsfb_surface_rtns_t kolibri_rtns = {
.initialise = kolibri_initialise,
.finalise = kolibri_finalise,
.input = kolibri_input,
.claim = kolibri_claim,
.update = kolibri_update,
.cursor = kolibri_cursor,
.geometry = kolibri_set_geometry,
};
 
NSFB_SURFACE_DEF(kolibri, NSFB_SURFACE_KOLIBRI, &kolibri_rtns)
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/src/surface/able.c
0,0 → 1,59
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
#include <stdbool.h>
#include <stdio.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_event.h"
#include "nsfb.h"
#include "surface.h"
 
#define UNUSED(x) ((x) = (x))
 
static int able_set_geometry(nsfb_t *nsfb, int width, int height, enum nsfb_format_e format)
{
if (nsfb->surface_priv != NULL)
return -1; /* if were already initialised fail */
 
nsfb->width = width;
nsfb->height = height;
nsfb->format = format;
 
return 0;
}
 
static int able_initialise(nsfb_t *nsfb)
{
UNUSED(nsfb);
return 0;
}
 
static int able_finalise(nsfb_t *nsfb)
{
UNUSED(nsfb);
return 0;
}
 
static bool able_input(nsfb_t *nsfb, nsfb_event_t *event, int timeout)
{
UNUSED(nsfb);
UNUSED(event);
UNUSED(timeout);
return false;
}
 
const nsfb_surface_rtns_t able_rtns = {
.initialise = able_initialise,
.finalise = able_finalise,
.input = able_input,
.geometry = able_set_geometry,
};
 
NSFB_SURFACE_DEF(able, NSFB_SURFACE_ABLE, &able_rtns)
/contrib/network/netsurf/libnsfb/src/surface/linux.c
0,0 → 1,109
/*
* Copyright 2012 Vincent Sanders <vince@simtec.co.uk>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/mman.h>
 
//#include <linux/fb.h>
 
 
#include "libnsfb.h"
#include "libnsfb_event.h"
#include "libnsfb_plot.h"
#include "libnsfb_plot_util.h"
 
#include "nsfb.h"
#include "plot.h"
#include "surface.h"
#include "cursor.h"
 
 
 
#define UNUSED(x) ((x) = (x))
 
#define FB_NAME "/dev/fb0"
 
struct lnx_priv {
int fd;
};
 
static int linux_set_geometry(nsfb_t *nsfb, int width, int height, enum nsfb_format_e format)
{
 
return -1;
}
 
static enum nsfb_format_e
format_from_lstate(void )
{
 
return 0;
}
 
static int linux_initialise(nsfb_t *nsfb)
{
return -1;
}
 
static int linux_finalise(nsfb_t *nsfb)
{
return 0;
}
 
static bool linux_input(nsfb_t *nsfb, nsfb_event_t *event, int timeout)
{
UNUSED(nsfb);
UNUSED(event);
UNUSED(timeout);
return false;
}
 
static int linux_claim(nsfb_t *nsfb, nsfb_bbox_t *box)
{
return 0;
}
 
static int linux_cursor(nsfb_t *nsfb, struct nsfb_cursor_s *cursor)
{
return true;
}
 
 
static int linux_update(nsfb_t *nsfb, nsfb_bbox_t *box)
{
return 0;
}
 
const nsfb_surface_rtns_t linux_rtns = {
.initialise = linux_initialise,
.finalise = linux_finalise,
.input = linux_input,
.claim = linux_claim,
.update = linux_update,
.cursor = linux_cursor,
.geometry = linux_set_geometry,
};
 
NSFB_SURFACE_DEF(linux, NSFB_SURFACE_LINUX, &linux_rtns)
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/src/surface/ram.c
0,0 → 1,108
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_event.h"
 
#include "nsfb.h"
#include "surface.h"
#include "plot.h"
 
#define UNUSED(x) ((x) = (x))
 
static int ram_defaults(nsfb_t *nsfb)
{
nsfb->width = 0;
nsfb->height = 0;
nsfb->format = NSFB_FMT_ABGR8888;
 
/* select default sw plotters for bpp */
select_plotters(nsfb);
 
return 0;
}
 
 
static int ram_initialise(nsfb_t *nsfb)
{
size_t size = (nsfb->width * nsfb->height * nsfb->bpp) / 8;
 
nsfb->ptr = realloc(nsfb->ptr, size);
nsfb->linelen = (nsfb->width * nsfb->bpp) / 8;
 
return 0;
}
 
static int ram_set_geometry(nsfb_t *nsfb, int width, int height, enum nsfb_format_e format)
{
int startsize;
int endsize;
 
startsize = (nsfb->width * nsfb->height * nsfb->bpp) / 8;
 
if (width > 0) {
nsfb->width = width;
}
 
if (height > 0) {
nsfb->height = height;
}
 
if (format != NSFB_FMT_ANY) {
nsfb->format = format;
}
 
/* select soft plotters appropriate for format */
select_plotters(nsfb);
 
endsize = (nsfb->width * nsfb->height * nsfb->bpp) / 8;
if ((nsfb->ptr != NULL) && (startsize != endsize)) {
nsfb->ptr = realloc(nsfb->ptr, endsize);
}
nsfb->linelen = (nsfb->width * nsfb->bpp) / 8;
 
return 0;
}
 
 
static int ram_finalise(nsfb_t *nsfb)
{
free(nsfb->ptr);
 
return 0;
}
 
static bool ram_input(nsfb_t *nsfb, nsfb_event_t *event, int timeout)
{
UNUSED(nsfb);
UNUSED(event);
UNUSED(timeout);
return false;
}
 
const nsfb_surface_rtns_t ram_rtns = {
.defaults = ram_defaults,
.initialise = ram_initialise,
.finalise = ram_finalise,
.input = ram_input,
.geometry = ram_set_geometry,
};
 
NSFB_SURFACE_DEF(ram, NSFB_SURFACE_RAM, &ram_rtns)
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/src/surface/sdl.c
0,0 → 1,736
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
#include <stdbool.h>
#include <stdlib.h>
#include <SDL/SDL.h>
 
#include "libnsfb.h"
#include "libnsfb_event.h"
#include "libnsfb_plot.h"
#include "libnsfb_plot_util.h"
 
#include "nsfb.h"
#include "surface.h"
#include "palette.h"
#include "plot.h"
#include "cursor.h"
 
enum nsfb_key_code_e sdl_nsfb_map[] = {
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_BACKSPACE,
NSFB_KEY_TAB,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_CLEAR,
NSFB_KEY_RETURN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_PAUSE,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_ESCAPE,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_SPACE,
NSFB_KEY_EXCLAIM,
NSFB_KEY_QUOTEDBL,
NSFB_KEY_HASH,
NSFB_KEY_DOLLAR,
NSFB_KEY_UNKNOWN,
NSFB_KEY_AMPERSAND,
NSFB_KEY_QUOTE,
NSFB_KEY_LEFTPAREN,
NSFB_KEY_RIGHTPAREN,
NSFB_KEY_ASTERISK,
NSFB_KEY_PLUS,
NSFB_KEY_COMMA,
NSFB_KEY_MINUS,
NSFB_KEY_PERIOD,
NSFB_KEY_SLASH,
NSFB_KEY_0,
NSFB_KEY_1,
NSFB_KEY_2,
NSFB_KEY_3,
NSFB_KEY_4,
NSFB_KEY_5,
NSFB_KEY_6,
NSFB_KEY_7,
NSFB_KEY_8,
NSFB_KEY_9,
NSFB_KEY_COLON,
NSFB_KEY_SEMICOLON,
NSFB_KEY_LESS,
NSFB_KEY_EQUALS,
NSFB_KEY_GREATER,
NSFB_KEY_QUESTION,
NSFB_KEY_AT,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_LEFTBRACKET,
NSFB_KEY_BACKSLASH,
NSFB_KEY_RIGHTBRACKET,
NSFB_KEY_CARET,
NSFB_KEY_UNDERSCORE,
NSFB_KEY_BACKQUOTE,
NSFB_KEY_a,
NSFB_KEY_b,
NSFB_KEY_c,
NSFB_KEY_d,
NSFB_KEY_e,
NSFB_KEY_f,
NSFB_KEY_g,
NSFB_KEY_h,
NSFB_KEY_i,
NSFB_KEY_j,
NSFB_KEY_k,
NSFB_KEY_l,
NSFB_KEY_m,
NSFB_KEY_n,
NSFB_KEY_o,
NSFB_KEY_p,
NSFB_KEY_q,
NSFB_KEY_r,
NSFB_KEY_s,
NSFB_KEY_t,
NSFB_KEY_u,
NSFB_KEY_v,
NSFB_KEY_w,
NSFB_KEY_x,
NSFB_KEY_y,
NSFB_KEY_z,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_DELETE,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_KP0,
NSFB_KEY_KP1,
NSFB_KEY_KP2,
NSFB_KEY_KP3,
NSFB_KEY_KP4,
NSFB_KEY_KP5,
NSFB_KEY_KP6,
NSFB_KEY_KP7,
NSFB_KEY_KP8,
NSFB_KEY_KP9,
NSFB_KEY_KP_PERIOD,
NSFB_KEY_KP_DIVIDE,
NSFB_KEY_KP_MULTIPLY,
NSFB_KEY_KP_MINUS,
NSFB_KEY_KP_PLUS,
NSFB_KEY_KP_ENTER,
NSFB_KEY_KP_EQUALS,
NSFB_KEY_UP,
NSFB_KEY_DOWN,
NSFB_KEY_RIGHT,
NSFB_KEY_LEFT,
NSFB_KEY_INSERT,
NSFB_KEY_HOME,
NSFB_KEY_END,
NSFB_KEY_PAGEUP,
NSFB_KEY_PAGEDOWN,
NSFB_KEY_F1,
NSFB_KEY_F2,
NSFB_KEY_F3,
NSFB_KEY_F4,
NSFB_KEY_F5,
NSFB_KEY_F6,
NSFB_KEY_F7,
NSFB_KEY_F8,
NSFB_KEY_F9,
NSFB_KEY_F10,
NSFB_KEY_F11,
NSFB_KEY_F12,
NSFB_KEY_F13,
NSFB_KEY_F14,
NSFB_KEY_F15,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_NUMLOCK,
NSFB_KEY_CAPSLOCK,
NSFB_KEY_SCROLLOCK,
NSFB_KEY_RSHIFT,
NSFB_KEY_LSHIFT,
NSFB_KEY_RCTRL,
NSFB_KEY_LCTRL,
NSFB_KEY_RALT,
NSFB_KEY_LALT,
NSFB_KEY_RMETA,
NSFB_KEY_LMETA,
NSFB_KEY_LSUPER,
NSFB_KEY_RSUPER,
NSFB_KEY_MODE,
NSFB_KEY_COMPOSE,
NSFB_KEY_HELP,
NSFB_KEY_PRINT,
NSFB_KEY_SYSREQ,
NSFB_KEY_BREAK,
NSFB_KEY_MENU,
NSFB_KEY_POWER,
NSFB_KEY_EURO,
NSFB_KEY_UNDO,
};
 
 
static void
set_palette(nsfb_t *nsfb)
{
SDL_Surface *sdl_screen = nsfb->surface_priv;
SDL_Color palette[256];
int loop = 0;
 
/* Get libnsfb palette */
nsfb_palette_generate_nsfb_8bpp(nsfb->palette);
 
/* Create SDL palette from nsfb palette */
for (loop = 0; loop < 256; loop++) {
palette[loop].r = (nsfb->palette->data[loop] ) & 0xFF;
palette[loop].g = (nsfb->palette->data[loop] >> 8) & 0xFF;
palette[loop].b = (nsfb->palette->data[loop] >> 16) & 0xFF;
}
 
/* Set SDL palette */
SDL_SetColors(sdl_screen, palette, 0, 256);
 
}
 
static bool
sdlcopy(nsfb_t *nsfb, nsfb_bbox_t *srcbox, nsfb_bbox_t *dstbox)
{
SDL_Rect src;
SDL_Rect dst;
SDL_Surface *sdl_screen = nsfb->surface_priv;
nsfb_bbox_t allbox;
struct nsfb_cursor_s *cursor = nsfb->cursor;
 
nsfb_plot_add_rect(srcbox, dstbox, &allbox);
 
/* clear the cursor if its within the region to be altered */
if ((cursor != NULL) &&
(cursor->plotted == true) &&
(nsfb_plot_bbox_intersect(&allbox, &cursor->loc))) {
nsfb_cursor_clear(nsfb, cursor);
}
 
src.x = srcbox->x0;
src.y = srcbox->y0;
src.w = srcbox->x1 - srcbox->x0;
src.h = srcbox->y1 - srcbox->y0;
dst.x = dstbox->x0;
dst.y = dstbox->y0;
dst.w = dstbox->x1 - dstbox->x0;
dst.h = dstbox->y1 - dstbox->y0;
SDL_BlitSurface(sdl_screen, &src, sdl_screen , &dst);
 
if ((cursor != NULL) &&
(cursor->plotted == false)) {
nsfb_cursor_plot(nsfb, cursor);
}
 
SDL_UpdateRect(sdl_screen, dst.x, dst.y, dst.w, dst.h);
 
return true;
 
}
 
static int sdl_set_geometry(nsfb_t *nsfb, int width, int height,
enum nsfb_format_e format)
{
if (nsfb->surface_priv != NULL)
return -1; /* fail if surface already initialised */
 
nsfb->width = width;
nsfb->height = height;
nsfb->format = format;
 
/* select default sw plotters for format */
select_plotters(nsfb);
 
nsfb->plotter_fns->copy = sdlcopy;
 
return 0;
}
 
static int sdl_initialise(nsfb_t *nsfb)
{
SDL_Surface *sdl_screen;
SDL_PixelFormat *sdl_fmt;
enum nsfb_format_e fmt;
 
if (nsfb->surface_priv != NULL)
return -1;
 
/* sanity checked depth. */
if ((nsfb->bpp != 32) && (nsfb->bpp != 16) && (nsfb->bpp != 8))
return -1;
 
/* initialise SDL library */
if (SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO) < 0 ) {
fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
return -1;
}
 
sdl_screen = SDL_SetVideoMode(nsfb->width,
nsfb->height,
nsfb->bpp,
SDL_SWSURFACE);
 
if (sdl_screen == NULL ) {
fprintf(stderr, "Unable to set video: %s\n", SDL_GetError());
return -1;
}
 
/* find out what pixel format we got */
sdl_fmt = sdl_screen->format;
 
switch (sdl_fmt->BitsPerPixel) {
case 32:
if (sdl_fmt->Rshift == 0)
fmt = NSFB_FMT_XBGR8888;
else
fmt = NSFB_FMT_XRGB8888;
break;
 
default:
fmt = nsfb->format;
break;
}
 
/* If we didn't get what we asked for, reselect plotters */
if (nsfb->format != fmt) {
nsfb->format = fmt;
 
if (sdl_set_geometry(nsfb, nsfb->width, nsfb->height,
nsfb->format) != 0) {
return -1;
}
}
 
nsfb->surface_priv = sdl_screen;
 
if (nsfb->bpp == 8) {
nsfb_palette_new(&nsfb->palette, nsfb->width);
set_palette(nsfb);
}
 
nsfb->ptr = sdl_screen->pixels;
nsfb->linelen = sdl_screen->pitch;
 
SDL_ShowCursor(SDL_DISABLE);
SDL_EnableKeyRepeat(300, 50);
 
return 0;
}
 
static int sdl_finalise(nsfb_t *nsfb)
{
nsfb=nsfb;
SDL_Quit();
return 0;
}
 
static uint32_t wakeeventtimer(uint32_t ival, void *param)
{
SDL_Event event;
ival = ival;
param = param;
 
event.type = SDL_USEREVENT;
event.user.code = 0;
event.user.data1 = 0;
event.user.data2 = 0;
SDL_PushEvent(&event);
 
return 0;
}
 
static bool sdl_input(nsfb_t *nsfb, nsfb_event_t *event, int timeout)
{
int got_event;
SDL_Event sdlevent;
 
nsfb = nsfb; /* unused */
 
//if (timeout == 0) {
got_event = SDL_PollEvent(&sdlevent);
/*} else {
if (timeout > 0) {
/* setup wake timer to ensure the wait event below exits no later
* than when the timeout has occoured.
*/
// SDL_TimerID tid;
// tid = SDL_AddTimer(timeout, wakeeventtimer, NULL);
// got_event = SDL_WaitEvent(&sdlevent);
// if ((got_event == 0) || (sdlevent.type != SDL_USEREVENT)) {
// SDL_RemoveTimer(tid);
// }
// } else {
// got_event = SDL_WaitEvent(&sdlevent);
// }
//}
 
/* Do nothing if there was no event */
if (got_event == 0) {
return false;
}
 
event->type = NSFB_EVENT_NONE;
 
switch (sdlevent.type) {
case SDL_KEYDOWN:
event->type = NSFB_EVENT_KEY_DOWN;
event->value.keycode = sdl_nsfb_map[sdlevent.key.keysym.sym];
break;
 
case SDL_KEYUP:
event->type = NSFB_EVENT_KEY_UP;
event->value.keycode = sdl_nsfb_map[sdlevent.key.keysym.sym];
break;
 
case SDL_MOUSEBUTTONDOWN:
event->type = NSFB_EVENT_KEY_DOWN;
 
switch (sdlevent.button.button) {
 
case SDL_BUTTON_LEFT:
event->value.keycode = NSFB_KEY_MOUSE_1;
break;
 
case SDL_BUTTON_MIDDLE:
event->value.keycode = NSFB_KEY_MOUSE_2;
break;
 
case SDL_BUTTON_RIGHT:
event->value.keycode = NSFB_KEY_MOUSE_3;
break;
 
/*case SDL_BUTTON_WHEELUP:
event->value.keycode = NSFB_KEY_MOUSE_4;
break;
 
case SDL_BUTTON_WHEELDOWN:
event->value.keycode = NSFB_KEY_MOUSE_5;
break;
*/
}
break;
 
case SDL_MOUSEBUTTONUP:
event->type = NSFB_EVENT_KEY_UP;
 
switch (sdlevent.button.button) {
 
case SDL_BUTTON_LEFT:
event->value.keycode = NSFB_KEY_MOUSE_1;
break;
 
case SDL_BUTTON_MIDDLE:
event->value.keycode = NSFB_KEY_MOUSE_2;
break;
 
case SDL_BUTTON_RIGHT:
event->value.keycode = NSFB_KEY_MOUSE_3;
break;
 
/*case SDL_BUTTON_WHEELUP:
event->value.keycode = NSFB_KEY_MOUSE_4;
break;
 
case SDL_BUTTON_WHEELDOWN:
event->value.keycode = NSFB_KEY_MOUSE_5;
break;*/
}
break;
 
case SDL_MOUSEMOTION:
event->type = NSFB_EVENT_MOVE_ABSOLUTE;
event->value.vector.x = sdlevent.motion.x;
event->value.vector.y = sdlevent.motion.y;
event->value.vector.z = 0;
break;
 
case SDL_QUIT:
event->type = NSFB_EVENT_CONTROL;
event->value.controlcode = NSFB_CONTROL_QUIT;
break;
 
case SDL_USEREVENT:
event->type = NSFB_EVENT_CONTROL;
event->value.controlcode = NSFB_CONTROL_TIMEOUT;
break;
 
}
 
return true;
}
 
static int sdl_claim(nsfb_t *nsfb, nsfb_bbox_t *box)
{
struct nsfb_cursor_s *cursor = nsfb->cursor;
 
if ((cursor != NULL) &&
(cursor->plotted == true) &&
(nsfb_plot_bbox_intersect(box, &cursor->loc))) {
nsfb_cursor_clear(nsfb, cursor);
}
return 0;
}
 
static int
sdl_cursor(nsfb_t *nsfb, struct nsfb_cursor_s *cursor)
{
SDL_Surface *sdl_screen = nsfb->surface_priv;
nsfb_bbox_t redraw;
nsfb_bbox_t fbarea;
 
if ((cursor != NULL) && (cursor->plotted == true)) {
nsfb_bbox_t loc_shift = cursor->loc;
loc_shift.x0 -= cursor->hotspot_x;
loc_shift.y0 -= cursor->hotspot_y;
loc_shift.x1 -= cursor->hotspot_x;
loc_shift.y1 -= cursor->hotspot_y;
 
nsfb_plot_add_rect(&cursor->savloc, &loc_shift, &redraw);
 
/* screen area */
fbarea.x0 = 0;
fbarea.y0 = 0;
fbarea.x1 = nsfb->width;
fbarea.y1 = nsfb->height;
 
nsfb_plot_clip(&fbarea, &redraw);
 
nsfb_cursor_clear(nsfb, cursor);
 
nsfb_cursor_plot(nsfb, cursor);
 
SDL_UpdateRect(sdl_screen,
redraw.x0,
redraw.y0,
redraw.x1 - redraw.x0,
redraw.y1 - redraw.y0);
 
 
}
return true;
}
 
 
static int sdl_update(nsfb_t *nsfb, nsfb_bbox_t *box)
{
SDL_Surface *sdl_screen = nsfb->surface_priv;
struct nsfb_cursor_s *cursor = nsfb->cursor;
 
if ((cursor != NULL) &&
(cursor->plotted == false)) {
nsfb_cursor_plot(nsfb, cursor);
}
 
SDL_UpdateRect(sdl_screen,
box->x0,
box->y0,
box->x1 - box->x0,
box->y1 - box->y0);
 
return 0;
}
 
const nsfb_surface_rtns_t sdl_rtns = {
.initialise = sdl_initialise,
.finalise = sdl_finalise,
.input = sdl_input,
.claim = sdl_claim,
.update = sdl_update,
.cursor = sdl_cursor,
.geometry = sdl_set_geometry,
};
 
NSFB_SURFACE_DEF(sdl, NSFB_SURFACE_SDL, &sdl_rtns)
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/src/surface/surface.c
0,0 → 1,159
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
#include <stdbool.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
 
#include "surface.h"
#include "plot.h"
 
#define MAX_SURFACES 16
 
#define UNUSED(x) ((x) = (x))
 
struct nsfb_surface_s {
enum nsfb_type_e type;
const nsfb_surface_rtns_t *rtns;
const char *name;
};
 
static struct nsfb_surface_s surfaces[MAX_SURFACES];
static int surface_count = 0;
 
/* internal routine which lets surfaces register their presence at runtime */
void _nsfb_register_surface(const enum nsfb_type_e type,
const nsfb_surface_rtns_t *rtns,
const char *name)
{
if (surface_count >= MAX_SURFACES)
return; /* no space for additional surfaces */
 
surfaces[surface_count].type = type;
surfaces[surface_count].rtns = rtns;
surfaces[surface_count].name = name;
surface_count++;
}
 
/* default surface implementations */
 
static int surface_defaults(nsfb_t *nsfb)
{
nsfb->width = 800;
nsfb->height = 600;
nsfb->format = NSFB_FMT_XRGB8888;
 
/* select default sw plotters for bpp */
select_plotters(nsfb);
 
return 0;
}
 
static int surface_claim(nsfb_t *nsfb, nsfb_bbox_t *box)
{
UNUSED(nsfb);
UNUSED(box);
return 0;
}
 
static int surface_update(nsfb_t *nsfb, nsfb_bbox_t *box)
{
UNUSED(nsfb);
UNUSED(box);
return 0;
}
 
static int surface_cursor(nsfb_t *nsfb, struct nsfb_cursor_s *cursor)
{
UNUSED(nsfb);
UNUSED(cursor);
return 0;
}
 
static int surface_parameters(nsfb_t *nsfb, const char *parameters)
{
UNUSED(nsfb);
UNUSED(parameters);
return 0;
}
 
/* exported interface documented in surface.h */
nsfb_surface_rtns_t *
nsfb_surface_get_rtns(enum nsfb_type_e type)
{
int fend_loop;
nsfb_surface_rtns_t *rtns = NULL;
 
for (fend_loop = 0; fend_loop < surface_count; fend_loop++) {
/* surface type must match and have a initialisor, finaliser
* and input method
*/
if ((surfaces[fend_loop].type == type) &&
(surfaces[fend_loop].rtns->initialise != NULL) &&
(surfaces[fend_loop].rtns->finalise != NULL) &&
(surfaces[fend_loop].rtns->input != NULL) ) {
rtns = malloc(sizeof(nsfb_surface_rtns_t));
if (rtns == NULL) {
continue;
}
 
memcpy(rtns,
surfaces[fend_loop].rtns,
sizeof(nsfb_surface_rtns_t));
 
/* The rest may be empty but to avoid the null check every time
* provide default implementations.
*/
if (rtns->defaults == NULL) {
rtns->defaults = surface_defaults;
}
 
if (rtns->claim == NULL) {
rtns->claim = surface_claim;
}
 
if (rtns->update == NULL) {
rtns->update = surface_update;
}
 
if (rtns->cursor == NULL) {
rtns->cursor = surface_cursor;
}
 
if (rtns->parameters == NULL) {
rtns->parameters = surface_parameters;
}
break;
}
}
return rtns;
}
 
/* exported interface defined in libnsfb.h */
enum nsfb_type_e
nsfb_type_from_name(const char *name)
{
int fend_loop;
 
for (fend_loop = 0; fend_loop < surface_count; fend_loop++) {
if (strcmp(surfaces[fend_loop].name, name) == 0)
return surfaces[fend_loop].type;
}
return NSFB_SURFACE_NONE;
}
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/src/surface/vnc.c
0,0 → 1,567
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
#include <stdbool.h>
#include <stdio.h>
 
#include <rfb/rfb.h>
#include <rfb/keysym.h>
 
#include "libnsfb.h"
#include "libnsfb_event.h"
#include "libnsfb_plot.h"
 
#include "nsfb.h"
#include "surface.h"
#include "plot.h"
#include "cursor.h"
 
#define UNUSED(x) ((x) = (x))
 
static nsfb_event_t *gevent;
 
/* vnc special set codes */
static enum nsfb_key_code_e vnc_nsfb_map[256] = {
NSFB_KEY_UNKNOWN, /* 0x00 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_BACKSPACE, /* 0x08 */
NSFB_KEY_TAB,
NSFB_KEY_LF,
NSFB_KEY_CLEAR,
NSFB_KEY_UNKNOWN,
NSFB_KEY_RETURN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0x10 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_RETURN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0x18 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_ESCAPE,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_COMPOSE, /* 0x20 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0x28 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0x30 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0x38 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0x40 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0x48 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_HOME, /* 0x50 */
NSFB_KEY_LEFT,
NSFB_KEY_UP,
NSFB_KEY_RIGHT,
NSFB_KEY_DOWN,
NSFB_KEY_PAGEUP,
NSFB_KEY_PAGEDOWN,
NSFB_KEY_END,
NSFB_KEY_HOME, /* 0x58 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0x60 */
NSFB_KEY_PRINT,
NSFB_KEY_HELP,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNDO,
NSFB_KEY_UNKNOWN,
NSFB_KEY_MENU,
NSFB_KEY_UNKNOWN, /* 0x68 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_BREAK,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0x70 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0x78 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_MODE,
NSFB_KEY_NUMLOCK,
NSFB_KEY_UNKNOWN, /* 0x80 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0x88 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_KP_ENTER,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0x90 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0x98 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0xA0 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0xA8 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_KP_MULTIPLY,
NSFB_KEY_KP_PLUS,
NSFB_KEY_UNKNOWN,
NSFB_KEY_KP_MINUS,
NSFB_KEY_KP_PERIOD,
NSFB_KEY_KP_DIVIDE,
NSFB_KEY_KP0, /* 0xB0 */
NSFB_KEY_KP1,
NSFB_KEY_KP2,
NSFB_KEY_KP3,
NSFB_KEY_KP4,
NSFB_KEY_KP5,
NSFB_KEY_KP6,
NSFB_KEY_KP7,
NSFB_KEY_KP8, /* 0xB8 */
NSFB_KEY_KP9,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_KP_EQUALS,
NSFB_KEY_F1,
NSFB_KEY_F2,
NSFB_KEY_F3, /* 0xC0 */
NSFB_KEY_F4,
NSFB_KEY_F5,
NSFB_KEY_F6,
NSFB_KEY_F7,
NSFB_KEY_F8,
NSFB_KEY_F9,
NSFB_KEY_F10,
NSFB_KEY_F11, /* 0xC8 */
NSFB_KEY_F12,
NSFB_KEY_F13,
NSFB_KEY_F14,
NSFB_KEY_F15,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0xD0 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0xD8 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0xE0 */
NSFB_KEY_LSHIFT,
NSFB_KEY_RSHIFT,
NSFB_KEY_LCTRL,
NSFB_KEY_RCTRL,
NSFB_KEY_CAPSLOCK,
NSFB_KEY_SCROLLOCK,
NSFB_KEY_LMETA,
NSFB_KEY_RMETA, /* 0xE8 */
NSFB_KEY_LALT,
NSFB_KEY_RALT,
NSFB_KEY_LSUPER,
NSFB_KEY_RSUPER,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0xF0 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN, /* 0xF8 */
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_UNKNOWN,
NSFB_KEY_DELETE,
};
 
 
static void vnc_doptr(int buttonMask,int x,int y,rfbClientPtr cl)
{
static int prevbuttonMask = 0;
 
UNUSED(cl);
 
if (prevbuttonMask != buttonMask) {
/* button click */
if (((prevbuttonMask ^ buttonMask) & 0x01) == 0x01) {
if ((buttonMask & 0x01) == 0x01) {
gevent->type = NSFB_EVENT_KEY_DOWN;
} else {
gevent->type = NSFB_EVENT_KEY_UP;
}
gevent->value.keycode = NSFB_KEY_MOUSE_1;
} else if (((prevbuttonMask ^ buttonMask) & 0x02) == 0x02) {
if ((buttonMask & 0x01) == 0x01) {
gevent->type = NSFB_EVENT_KEY_DOWN;
} else {
gevent->type = NSFB_EVENT_KEY_UP;
}
gevent->value.keycode = NSFB_KEY_MOUSE_2;
} else if (((prevbuttonMask ^ buttonMask) & 0x04) == 0x04) {
if ((buttonMask & 0x01) == 0x01) {
gevent->type = NSFB_EVENT_KEY_DOWN;
} else {
gevent->type = NSFB_EVENT_KEY_UP;
}
gevent->value.keycode = NSFB_KEY_MOUSE_3;
} else if (((prevbuttonMask ^ buttonMask) & 0x08) == 0x08) {
if ((buttonMask & 0x01) == 0x01) {
gevent->type = NSFB_EVENT_KEY_DOWN;
} else {
gevent->type = NSFB_EVENT_KEY_UP;
}
gevent->value.keycode = NSFB_KEY_MOUSE_4;
} else if (((prevbuttonMask ^ buttonMask) & 0x10) == 0x10) {
if ((buttonMask & 0x01) == 0x01) {
gevent->type = NSFB_EVENT_KEY_DOWN;
} else {
gevent->type = NSFB_EVENT_KEY_UP;
}
gevent->value.keycode = NSFB_KEY_MOUSE_5;
}
prevbuttonMask = buttonMask;
} else {
gevent->type = NSFB_EVENT_MOVE_ABSOLUTE;
gevent->value.vector.x = x;
gevent->value.vector.y = y;
gevent->value.vector.z = 0;
}
 
}
 
 
static void vnc_dokey(rfbBool down, rfbKeySym key, rfbClientPtr cl)
{
enum nsfb_key_code_e keycode = NSFB_KEY_UNKNOWN;
 
UNUSED(cl);
 
if ((key >= XK_space) && (key <= XK_asciitilde)) {
/* ascii codes line up */
keycode = key;
} else if ((key & 0xff00) == 0xff00) {
/* bottom 8bits of keysyms in this range map via table */
keycode = vnc_nsfb_map[(key & 0xff)];
}
 
if (down == 0) {
/* key up */
gevent->type = NSFB_EVENT_KEY_UP;
} else {
/* key down */
gevent->type = NSFB_EVENT_KEY_DOWN;
}
gevent->value.keycode = keycode;
 
}
 
 
static int vnc_set_geometry(nsfb_t *nsfb, int width, int height, enum nsfb_format_e format)
{
if (nsfb->surface_priv != NULL)
return -1; /* fail if surface already initialised */
 
if (width > 0) {
nsfb->width = width;
}
 
if (height > 0) {
nsfb->height = height;
}
 
if (format != NSFB_FMT_ANY) {
nsfb->format = format;
}
 
/* select soft plotters appropriate for format */
select_plotters(nsfb);
 
return 0;
}
 
static int vnc_initialise(nsfb_t *nsfb)
{
rfbScreenInfoPtr vncscreen;
int argc = 0;
char **argv = NULL;
 
if (nsfb->surface_priv != NULL)
return -1; /* fail if surface already initialised */
 
/* sanity checked depth. */
if (nsfb->bpp != 32)
return -1;
 
/* create vnc screen with 8bits per sample, three samples per
* pixel and 4 bytes per pixel. */
vncscreen = rfbGetScreen(&argc, argv,
nsfb->width, nsfb->height,
8, 3, (nsfb->bpp / 8));
 
if (vncscreen == NULL) {
/* Note libvncserver does not check its own allocations/error
* paths so the faliure mode of the rfbGetScreen is to segfault.
*/
return -1;
}
 
vncscreen->frameBuffer = malloc(nsfb->width * nsfb->height * (nsfb->bpp / 8));
 
if (vncscreen->frameBuffer == NULL) {
rfbScreenCleanup(vncscreen);
return -1;
}
 
 
switch (nsfb->bpp) {
case 8:
break;
 
case 16:
vncscreen->serverFormat.trueColour=TRUE;
vncscreen->serverFormat.redShift = 11;
vncscreen->serverFormat.greenShift = 5;
vncscreen->serverFormat.blueShift = 0;
vncscreen->serverFormat.redMax = 31;
vncscreen->serverFormat.greenMax = 63;
vncscreen->serverFormat.blueMax = 31;
break;
 
case 32:
vncscreen->serverFormat.trueColour=TRUE;
vncscreen->serverFormat.redShift = 16;
vncscreen->serverFormat.greenShift = 8;
vncscreen->serverFormat.blueShift = 0;
break;
}
 
vncscreen->alwaysShared = TRUE;
vncscreen->autoPort = 1;
vncscreen->ptrAddEvent = vnc_doptr;
vncscreen->kbdAddEvent = vnc_dokey;
 
rfbInitServer(vncscreen);
 
/* keep parameters */
nsfb->surface_priv = vncscreen;
nsfb->ptr = (uint8_t *)vncscreen->frameBuffer;
nsfb->linelen = (nsfb->width * nsfb->bpp) / 8;
 
return 0;
}
 
static int vnc_finalise(nsfb_t *nsfb)
{
rfbScreenInfoPtr vncscreen = nsfb->surface_priv;
if (vncscreen != NULL) {
rfbScreenCleanup(vncscreen);
}
 
return 0;
}
 
 
static int vnc_update(nsfb_t *nsfb, nsfb_bbox_t *box)
{
rfbScreenInfoPtr vncscreen = nsfb->surface_priv;
 
rfbMarkRectAsModified(vncscreen, box->x0, box->y0, box->x1, box->y1);
 
return 0;
}
 
 
static bool vnc_input(nsfb_t *nsfb, nsfb_event_t *event, int timeout)
{
rfbScreenInfoPtr vncscreen = nsfb->surface_priv;
int ret;
 
if (vncscreen != NULL) {
 
gevent = event; /* blergh - have to use global state to pass data */
 
/* set default to timeout */
event->type = NSFB_EVENT_CONTROL;
event->value.controlcode = NSFB_CONTROL_TIMEOUT;
 
ret = rfbProcessEvents(vncscreen, timeout * 1000);
return true;
}
 
return false;
}
 
static int
vnc_cursor(nsfb_t *nsfb, struct nsfb_cursor_s *cursor)
{
rfbScreenInfoPtr vncscreen = nsfb->surface_priv;
rfbCursorPtr vnccursor = calloc(1,sizeof(rfbCursor));
int rwidth; /* rounded width */
int row;
int col;
const nsfb_colour_t *pixel;
uint8_t bit;
 
rwidth = (cursor->bmp_width + 7) / 8;
 
vnccursor->cleanup = 1; /* rfb lib will free this allocation */
vnccursor->width = cursor->bmp_width;
vnccursor->height = cursor->bmp_height;
vnccursor->foreRed = vnccursor->foreGreen = vnccursor->foreBlue = 0xffff;
 
vnccursor->source = calloc(rwidth, vnccursor->height);
vnccursor->cleanupSource = 1; /* rfb lib will free this allocation */
vnccursor->mask = calloc(rwidth, vnccursor->height);
vnccursor->cleanupMask = 1; /* rfb lib will free this allocation */
 
for (row = 0, pixel = cursor->pixel; row < vnccursor->height; row++) {
for (col = 0, bit = 0x80;
col < vnccursor->width;
col++, bit = (bit & 1)? 0x80 : bit>>1, pixel++) {
 
/* pixel luminance more than 50% */
if ((((((*pixel) & 0xff) * 77) +
((((*pixel) & 0xff00) >> 8) * 151) +
((((*pixel) & 0xff0000) >> 16) * 28)) / 256) > 128) {
vnccursor->source[row * rwidth + col/8] |= bit;
}
if (((*pixel) & 0xff000000) != 0) {
vnccursor->mask[row * rwidth + col/8] |= bit;
}
}
}
 
rfbSetCursor(vncscreen, vnccursor);
return true;
}
 
const nsfb_surface_rtns_t vnc_rtns = {
.initialise = vnc_initialise,
.finalise = vnc_finalise,
.input = vnc_input,
.update = vnc_update,
.cursor = vnc_cursor,
.geometry = vnc_set_geometry,
};
 
NSFB_SURFACE_DEF(vnc, NSFB_SURFACE_VNC, &vnc_rtns)
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/src/surface/x.c
0,0 → 1,1131
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
#define _XOPEN_SOURCE 500
 
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
#include <sys/ipc.h>
#include <sys/shm.h>
 
#include <xcb/xcb.h>
#include <xcb/xcb_image.h>
#include <xcb/xcb_atom.h>
#include <xcb/xcb_icccm.h>
#include <xcb/xcb_aux.h>
#include <xcb/xcb_keysyms.h>
 
#include "libnsfb.h"
#include "libnsfb_event.h"
#include "libnsfb_plot.h"
#include "libnsfb_plot_util.h"
 
#include "nsfb.h"
#include "surface.h"
#include "plot.h"
#include "cursor.h"
 
#if defined(NSFB_NEED_HINTS_ALLOC)
static xcb_size_hints_t *
xcb_alloc_size_hints(void)
{
return calloc(1, sizeof(xcb_size_hints_t));
}
 
static void
xcb_free_size_hints(xcb_size_hints_t *hints)
{
free(hints);
}
#endif
 
#if defined(NSFB_NEED_ICCCM_API_PREFIX)
#define xcb_size_hints_set_max_size xcb_icccm_size_hints_set_max_size
#define xcb_size_hints_set_min_size xcb_icccm_size_hints_set_min_size
#define xcb_set_wm_size_hints xcb_icccm_set_wm_size_hints
#endif
 
#if (NSFB_XCBPROTO_MAJOR_VERSION > 1) || \
(NSFB_XCBPROTO_MAJOR_VERSION == 1 && NSFB_XCBPROTO_MINOR_VERSION >= 6)
#define WM_NORMAL_HINTS XCB_ATOM_WM_NORMAL_HINTS
#endif
 
#define X_BUTTON_LEFT 1
#define X_BUTTON_MIDDLE 2
#define X_BUTTON_RIGHT 3
#define X_BUTTON_WHEELUP 4
#define X_BUTTON_WHEELDOWN 5
 
typedef struct xstate_s {
xcb_connection_t *connection; /* The x server connection */
xcb_screen_t *screen; /* The screen to put the window on */
xcb_key_symbols_t *keysymbols; /* keysym mappings */
 
xcb_shm_segment_info_t shminfo;
 
xcb_image_t *image; /* The X image buffer */
 
xcb_window_t window; /* The handle to the window */
xcb_pixmap_t pmap; /* The handle to the backing pixmap */
xcb_gcontext_t gc; /* The handle to the pixmap plotting graphics context */
xcb_shm_seg_t segment; /* The handle to the image shared memory */
} xstate_t;
 
/* X keyboard codepage to nsfb mapping*/
enum nsfb_key_code_e XCSKeyboardMap[256] = {
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_BACKSPACE, /* XK_BackSpace */
NSFB_KEY_TAB, /* XK_Tab */
NSFB_KEY_UNKNOWN, /* XK_Linefeed */
NSFB_KEY_CLEAR, /* XK_Clear */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_RETURN, /* XK_Return */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
/* 0x10 */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_PAUSE, /* XK_Pause */
NSFB_KEY_UNKNOWN, /* XK_Scroll_Lock */
NSFB_KEY_UNKNOWN, /* XK_Sys_Req */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_ESCAPE, /* XK_Escape */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
/* 0x20 */
NSFB_KEY_UNKNOWN, /* XK_Multi_key */
NSFB_KEY_UNKNOWN, /* XK_Kanji */
NSFB_KEY_UNKNOWN, /* XK_Muhenkan */
NSFB_KEY_UNKNOWN, /* XK_Henkan_Mode */
NSFB_KEY_UNKNOWN, /* XK_Henkan */
NSFB_KEY_UNKNOWN, /* XK_Romaji */
NSFB_KEY_UNKNOWN, /* XK_Hiragana*/
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
/* 0x30 */
NSFB_KEY_UNKNOWN, /* XK_Eisu_toggle */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* XK_Codeinput */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* XK_SingleCandidate */
NSFB_KEY_UNKNOWN, /* XK_MultipleCandidate */
NSFB_KEY_UNKNOWN, /* XK_PreviousCandidate */
NSFB_KEY_UNKNOWN, /* */
/* 0x40 */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
/* 0x50 */
NSFB_KEY_HOME, /* XK_Home */
NSFB_KEY_LEFT, /* XK_Left */
NSFB_KEY_UP, /* XK_Up */
NSFB_KEY_RIGHT, /* XK_Right */
NSFB_KEY_DOWN, /* XK_Down */
NSFB_KEY_PAGEUP, /* XK_Page_Up */
NSFB_KEY_PAGEDOWN, /* XK_Page_Down */
NSFB_KEY_END, /* XK_End */
NSFB_KEY_UNKNOWN, /* XK_Begin */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
/* 0x60 */
NSFB_KEY_UNKNOWN, /* XK_Select */
NSFB_KEY_UNKNOWN, /* XK_Print*/
NSFB_KEY_UNKNOWN, /* XK_Execute*/
NSFB_KEY_UNKNOWN, /* XK_Insert*/
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* XK_Undo*/
NSFB_KEY_UNKNOWN, /* XK_Redo */
NSFB_KEY_UNKNOWN, /* XK_Menu */
NSFB_KEY_UNKNOWN, /* XK_Find */
NSFB_KEY_UNKNOWN, /* XK_Cancel */
NSFB_KEY_UNKNOWN, /* XK_Help */
NSFB_KEY_UNKNOWN, /* XK_Break*/
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
/* 0x70 */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* XK_Mode_switch */
NSFB_KEY_UNKNOWN, /* XK_Num_Lock */
/* 0x80 */
NSFB_KEY_UNKNOWN, /* XK_KP_Space */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* XK_KP_Tab */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* XK_KP_Enter */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
/* 0x90 */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* XK_KP_F1*/
NSFB_KEY_UNKNOWN, /* XK_KP_F2*/
NSFB_KEY_UNKNOWN, /* XK_KP_F3*/
NSFB_KEY_UNKNOWN, /* XK_KP_F4*/
NSFB_KEY_UNKNOWN, /* XK_KP_Home*/
NSFB_KEY_UNKNOWN, /* XK_KP_Left*/
NSFB_KEY_UNKNOWN, /* XK_KP_Up*/
NSFB_KEY_UNKNOWN, /* XK_KP_Right*/
NSFB_KEY_UNKNOWN, /* XK_KP_Down*/
NSFB_KEY_UNKNOWN, /* XK_KP_Page_Up*/
NSFB_KEY_UNKNOWN, /* XK_KP_Page_Down*/
NSFB_KEY_UNKNOWN, /* XK_KP_End*/
NSFB_KEY_UNKNOWN, /* XK_KP_Begin*/
NSFB_KEY_UNKNOWN, /* XK_KP_Insert*/
NSFB_KEY_UNKNOWN, /* XK_KP_Delete*/
/* 0xa0 */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* XK_KP_Multiply*/
NSFB_KEY_UNKNOWN, /* XK_KP_Add*/
NSFB_KEY_UNKNOWN, /* XK_KP_Separator*/
NSFB_KEY_UNKNOWN, /* XK_KP_Subtract*/
NSFB_KEY_UNKNOWN, /* XK_KP_Decimal*/
NSFB_KEY_UNKNOWN, /* XK_KP_Divide*/
/* 0xb0 */
NSFB_KEY_UNKNOWN, /* XK_KP_0 */
NSFB_KEY_UNKNOWN, /* XK_KP_1 */
NSFB_KEY_UNKNOWN, /* XK_KP_2 */
NSFB_KEY_UNKNOWN, /* XK_KP_3 */
NSFB_KEY_UNKNOWN, /* XK_KP_4 */
NSFB_KEY_UNKNOWN, /* XK_KP_5 */
NSFB_KEY_UNKNOWN, /* XK_KP_6 */
NSFB_KEY_UNKNOWN, /* XK_KP_7 */
NSFB_KEY_UNKNOWN, /* XK_KP_8 */
NSFB_KEY_UNKNOWN, /* XK_KP_9 */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_F1, /* XK_F1 */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* XK_KP_Equal */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_F2, /* XK_F2 */
/* 0xc0 */
NSFB_KEY_F3, /* XK_F3*/
NSFB_KEY_F4, /* XK_F4*/
NSFB_KEY_F5, /* XK_F5*/
NSFB_KEY_F6, /* XK_F6*/
NSFB_KEY_F7, /* XK_F7*/
NSFB_KEY_F8, /* XK_F8*/
NSFB_KEY_F9, /* XK_F9*/
NSFB_KEY_F10, /* XK_F10*/
NSFB_KEY_F11, /* XK_F11*/
NSFB_KEY_F12, /* XK_F12*/
NSFB_KEY_F13, /* XK_F13 */
NSFB_KEY_F14, /* XK_F14 */
NSFB_KEY_F15, /* XK_F15 */
NSFB_KEY_UNKNOWN, /* XK_F16 */
NSFB_KEY_UNKNOWN, /* XK_F17 */
NSFB_KEY_UNKNOWN, /* XK_F18*/
/* 0xd0 */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
/* 0xe0 */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_LSHIFT, /* XK_Shift_L*/
NSFB_KEY_RSHIFT, /* XK_Shift_R*/
NSFB_KEY_UNKNOWN, /* XK_Control_L*/
NSFB_KEY_UNKNOWN, /* XK_Control_R*/
NSFB_KEY_UNKNOWN, /* XK_Caps_Lock*/
NSFB_KEY_UNKNOWN, /* XK_Shift_Lock*/
NSFB_KEY_UNKNOWN, /* XK_Meta_L*/
NSFB_KEY_UNKNOWN, /* XK_Meta_R*/
NSFB_KEY_UNKNOWN, /* XK_Alt_L */
NSFB_KEY_UNKNOWN, /* XK_Alt_R*/
NSFB_KEY_UNKNOWN, /* XK_Super_L*/
NSFB_KEY_UNKNOWN, /* XK_Super_R*/
NSFB_KEY_UNKNOWN, /* XK_Hyper_L*/
NSFB_KEY_UNKNOWN, /* XK_Hyper_R*/
NSFB_KEY_UNKNOWN, /* */
/* 0xf0 */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
NSFB_KEY_UNKNOWN, /* */
};
 
/* Convert an X keysym into a nsfb key code.
*
* Our approach is primarily to assume both codings are roughly ascii like.
*
* The Keysyms are defined in X11/keysymdef.h and our mapping for the
* "keyboard" keys i.e. those from code set 255 is from there
*/
static enum nsfb_key_code_e
xkeysym_to_nsfbkeycode(xcb_keysym_t ks)
{
enum nsfb_key_code_e nsfb_key = NSFB_KEY_UNKNOWN;
uint8_t codeset = (ks & 0xFF00) >> 8;
uint8_t chrcode = ks & 0xFF;
 
if (ks != XCB_NO_SYMBOL) {
switch (codeset) {
case 0x00: /* Latin 1 */
case 0x01: /* Latin 2 */
case 0x02: /* Latin 3 */
case 0x03: /* Latin 4 */
case 0x04: /* Katakana */
case 0x05: /* Arabic */
case 0x06: /* Cyrillic */
case 0x07: /* Greek */
case 0x08: /* Technical */
case 0x0A: /* Publishing */
case 0x0C: /* Hebrew */
case 0x0D: /* Thai */
/* this is somewhat incomplete, but the nsfb codes are lined up on
* the ascii codes and x seems to have done similar
*/
nsfb_key = (enum nsfb_key_code_e)chrcode;
break;
 
case 0xFF: /* Keyboard */
nsfb_key = XCSKeyboardMap[chrcode];
break;
}
}
 
return nsfb_key;
}
/*
static void
set_palette(nsfb_t *nsfb)
{
X_Surface *x_screen = nsfb->surface_priv;
X_Color palette[256];
int rloop, gloop, bloop;
int loop = 0;
 
// build a linear R:3 G:3 B:2 colour cube palette.
for (rloop = 0; rloop < 8; rloop++) {
for (gloop = 0; gloop < 8; gloop++) {
for (bloop = 0; bloop < 4; bloop++) {
palette[loop].r = (rloop << 5) | (rloop << 2) | (rloop >> 1);
palette[loop].g = (gloop << 5) | (gloop << 2) | (gloop >> 1);
palette[loop].b = (bloop << 6) | (bloop << 4) | (bloop << 2) | (bloop);
nsfb->palette[loop] = palette[loop].r |
palette[loop].g << 8 |
palette[loop].b << 16;
loop++;
}
}
}
 
// Set palette
//X_SetColors(x_screen, palette, 0, 256);
 
}
*/
static int
update_pixmap(xstate_t *xstate, int x, int y, int width, int height)
{
if (xstate->shminfo.shmseg == 0) {
/* not using shared memory */
xcb_put_image(xstate->connection,
xstate->image->format,
xstate->pmap,
xstate->gc,
xstate->image->width,
height,
0,
y,
0,
xstate->image->depth,
(height) * xstate->image->stride,
xstate->image->data + (y * xstate->image->stride));
} else {
/* shared memory */
xcb_image_shm_put(xstate->connection,
xstate->pmap,
xstate->gc,
xstate->image,
xstate->shminfo,
x,y,
x,y,
width,height,0);
}
 
return 0;
}
 
static int
update_and_redraw_pixmap(xstate_t *xstate, int x, int y, int width, int height)
{
update_pixmap(xstate, x, y, width, height);
 
xcb_copy_area(xstate->connection,
xstate->pmap,
xstate->window,
xstate->gc,
x, y,
x, y,
width, height);
 
xcb_flush(xstate->connection);
 
return 0;
}
 
 
static bool
xcopy(nsfb_t *nsfb, nsfb_bbox_t *srcbox, nsfb_bbox_t *dstbox)
{
xstate_t *xstate = nsfb->surface_priv;
nsfb_bbox_t allbox;
struct nsfb_cursor_s *cursor = nsfb->cursor;
uint8_t *srcptr;
uint8_t *dstptr;
int srcx = srcbox->x0;
int srcy = srcbox->y0;
int dstx = dstbox->x0;
int dsty = dstbox->y0;
int width = dstbox->x1 - dstbox->x0;
int height = dstbox->y1 - dstbox->y0;
int hloop;
 
nsfb_plot_add_rect(srcbox, dstbox, &allbox);
 
/* clear the cursor if its within the region to be altered */
if ((cursor != NULL) &&
(cursor->plotted == true) &&
(nsfb_plot_bbox_intersect(&allbox, &cursor->loc))) {
 
nsfb_cursor_clear(nsfb, cursor);
update_pixmap(xstate,
cursor->savloc.x0,
cursor->savloc.y0,
cursor->savloc.x1 - cursor->savloc.x0,
cursor->savloc.y1 - cursor->savloc.y0);
 
/* must sync here or local framebuffer and remote pixmap will not be
* consistant
*/
xcb_aux_sync(xstate->connection);
 
}
 
/* copy the area on the server */
xcb_copy_area(xstate->connection,
xstate->pmap,
xstate->pmap,
xstate->gc,
srcbox->x0,
srcbox->y0,
dstbox->x0,
dstbox->y0,
srcbox->x1 - srcbox->x0,
srcbox->y1 - srcbox->y0);
 
/* do the copy in the local memory too */
srcptr = (nsfb->ptr +
(srcy * nsfb->linelen) +
((srcx * nsfb->bpp) / 8));
 
dstptr = (nsfb->ptr +
(dsty * nsfb->linelen) +
((dstx * nsfb->bpp) / 8));
 
if (width == nsfb->width) {
/* take shortcut and use memmove */
memmove(dstptr, srcptr, (width * height * nsfb->bpp) / 8);
} else {
if (srcy > dsty) {
for (hloop = height; hloop > 0; hloop--) {
memmove(dstptr, srcptr, (width * nsfb->bpp) / 8);
srcptr += nsfb->linelen;
dstptr += nsfb->linelen;
}
} else {
srcptr += height * nsfb->linelen;
dstptr += height * nsfb->linelen;
for (hloop = height; hloop > 0; hloop--) {
srcptr -= nsfb->linelen;
dstptr -= nsfb->linelen;
memmove(dstptr, srcptr, (width * nsfb->bpp) / 8);
}
}
}
 
if ((cursor != NULL) &&
(cursor->plotted == false)) {
nsfb_cursor_plot(nsfb, cursor);
}
 
/* update the x window */
xcb_copy_area(xstate->connection,
xstate->pmap,
xstate->window,
xstate->gc,
dstx, dsty,
dstx, dsty,
width, height);
 
return true;
 
}
 
 
static int
x_set_geometry(nsfb_t *nsfb, int width, int height, enum nsfb_format_e format)
{
if (nsfb->surface_priv != NULL)
return -1; /* if were already initialised fail */
 
nsfb->width = width;
nsfb->height = height;
nsfb->format = format;
 
/* select default sw plotters for format */
select_plotters(nsfb);
 
nsfb->plotter_fns->copy = xcopy;
 
return 0;
}
 
 
static xcb_format_t *
find_format(xcb_connection_t * c, uint8_t depth, uint8_t bpp)
{
const xcb_setup_t *setup = xcb_get_setup(c);
xcb_format_t *fmt = xcb_setup_pixmap_formats(setup);
xcb_format_t *fmtend = fmt + xcb_setup_pixmap_formats_length(setup);
 
for(; fmt != fmtend; ++fmt) {
if((fmt->depth == depth) && (fmt->bits_per_pixel == bpp)) {
return fmt;
}
}
return 0;
}
 
static xcb_image_t *
create_shm_image(xstate_t *xstate, int width, int height, int bpp)
{
const xcb_setup_t *setup = xcb_get_setup(xstate->connection);
unsigned char *image_data;
xcb_format_t *fmt;
int depth = bpp;
uint32_t image_size;
int shmid;
 
xcb_shm_query_version_reply_t *rep;
xcb_shm_query_version_cookie_t ck;
xcb_void_cookie_t shm_attach_cookie;
xcb_generic_error_t *generic_error;
 
ck = xcb_shm_query_version(xstate->connection);
rep = xcb_shm_query_version_reply(xstate->connection, ck , NULL);
if (!rep) {
fprintf (stderr, "Server has no shm support.\n");
return NULL;
}
 
if ((rep->major_version < 1) ||
(rep->major_version == 1 && rep->minor_version == 0)) {
fprintf(stderr, "server SHM support is insufficient.\n");
free(rep);
return NULL;
}
free(rep);
 
if (bpp == 32)
depth = 24;
 
fmt = find_format(xstate->connection, depth, bpp);
if (fmt == NULL)
return NULL;
 
/* doing it this way ensures we deal with bpp smaller than 8 */
image_size = (bpp * width * height) >> 3;
 
/* get the shared memory segment */
shmid = shmget(IPC_PRIVATE, image_size, IPC_CREAT|0777);
if (shmid == -1)
return NULL;
 
xstate->shminfo.shmid = shmid;
 
xstate->shminfo.shmaddr = shmat(xstate->shminfo.shmid, 0, 0);
image_data = xstate->shminfo.shmaddr;
 
xstate->shminfo.shmseg = xcb_generate_id(xstate->connection);
shm_attach_cookie = xcb_shm_attach_checked(xstate->connection,
xstate->shminfo.shmseg,
xstate->shminfo.shmid,
0);
generic_error = xcb_request_check(xstate->connection, shm_attach_cookie);
 
/* either there is an error and the shm us no longer needed, or it now
* belongs to the x server - regardless release local reference to shared
* memory segment
*/
shmctl(xstate->shminfo.shmid, IPC_RMID, 0);
 
if (generic_error != NULL) {
/* unable to attach shm */
xstate->shminfo.shmseg = 0;
 
free(generic_error);
return NULL;
}
 
 
return xcb_image_create(width,
height,
XCB_IMAGE_FORMAT_Z_PIXMAP,
fmt->scanline_pad,
fmt->depth,
fmt->bits_per_pixel,
0,
setup->image_byte_order,
XCB_IMAGE_ORDER_LSB_FIRST,
image_data,
image_size,
image_data);
}
 
 
static xcb_image_t *
create_image(xcb_connection_t *c, int width, int height, int bpp)
{
const xcb_setup_t *setup = xcb_get_setup(c);
unsigned char *image_data;
xcb_format_t *fmt;
int depth = bpp;
uint32_t image_size;
 
if (bpp == 32)
depth = 24;
 
fmt = find_format(c, depth, bpp);
if (fmt == NULL)
return NULL;
 
/* doing it this way ensures we deal with bpp smaller than 8 */
image_size = (bpp * width * height) >> 3;
 
image_data = calloc(1, image_size);
if (image_data == NULL)
return NULL;
 
return xcb_image_create(width,
height,
XCB_IMAGE_FORMAT_Z_PIXMAP,
fmt->scanline_pad,
fmt->depth,
fmt->bits_per_pixel,
0,
setup->image_byte_order,
XCB_IMAGE_ORDER_LSB_FIRST,
image_data,
image_size,
image_data);
}
 
/**
* Create a blank cursor.
* The empty pixmaps is leaked.
*
* @param conn xcb connection
* @param scr xcb XCB screen
*/
static xcb_cursor_t
create_blank_cursor(xcb_connection_t *conn, const xcb_screen_t *scr)
{
xcb_cursor_t cur = xcb_generate_id(conn);
xcb_pixmap_t pix = xcb_generate_id(conn);
xcb_void_cookie_t ck;
xcb_generic_error_t *err;
 
ck = xcb_create_pixmap_checked (conn, 1, pix, scr->root, 1, 1);
err = xcb_request_check (conn, ck);
if (err) {
fprintf (stderr, "Cannot create pixmap: %d", err->error_code);
free (err);
}
ck = xcb_create_cursor_checked (conn, cur, pix, pix, 0, 0, 0, 0, 0, 0, 0, 0);
err = xcb_request_check (conn, ck);
if (err) {
fprintf (stderr, "Cannot create cursor: %d", err->error_code);
free (err);
}
return cur;
}
 
 
static int x_initialise(nsfb_t *nsfb)
{
uint32_t mask;
uint32_t values[3];
xcb_size_hints_t *hints;
xstate_t *xstate = nsfb->surface_priv;
xcb_cursor_t blank_cursor;
 
if (xstate != NULL)
return -1; /* already initialised */
 
/* sanity check bpp. */
if ((nsfb->bpp != 32) && (nsfb->bpp != 16) && (nsfb->bpp != 8))
return -1;
 
xstate = calloc(1, sizeof(xstate_t));
if (xstate == NULL)
return -1; /* no memory */
 
/* open connection with the server */
xstate->connection = xcb_connect(NULL, NULL);
if (xstate->connection == NULL) {
fprintf(stderr, "Memory error opening display\n");
free(xstate);
return -1; /* no memory */
}
 
if (xcb_connection_has_error(xstate->connection) != 0) {
fprintf(stderr, "Error opening display\n");
free(xstate);
return -1; /* no memory */
}
 
/* get screen */
xstate->screen = xcb_setup_roots_iterator(xcb_get_setup(xstate->connection)).data;
 
/* create image */
xstate->image = create_shm_image(xstate, nsfb->width, nsfb->height, nsfb->bpp);
 
if (xstate->image == NULL)
xstate->image = create_image(xstate->connection, nsfb->width, nsfb->height, nsfb->bpp);
 
if (xstate->image == NULL) {
fprintf(stderr, "Unable to create image\n");
free(xstate);
xcb_disconnect(xstate->connection);
return -1;
}
 
/* ensure plotting information is stored */
nsfb->surface_priv = xstate;
nsfb->ptr = xstate->image->data;
nsfb->linelen = xstate->image->stride;
 
/* get blank cursor */
blank_cursor = create_blank_cursor(xstate->connection, xstate->screen);
 
/* get keysymbol maps */
xstate->keysymbols = xcb_key_symbols_alloc(xstate->connection);
 
/* create window */
mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK | XCB_CW_CURSOR;
values[0] = xstate->screen->white_pixel;
values[1] = XCB_EVENT_MASK_EXPOSURE |
XCB_EVENT_MASK_KEY_PRESS |
XCB_EVENT_MASK_KEY_RELEASE |
XCB_EVENT_MASK_BUTTON_PRESS |
XCB_EVENT_MASK_BUTTON_RELEASE |
XCB_EVENT_MASK_POINTER_MOTION;
values[2] = blank_cursor;
 
xstate->window = xcb_generate_id(xstate->connection);
xcb_create_window (xstate->connection,
XCB_COPY_FROM_PARENT,
xstate->window,
xstate->screen->root,
0, 0, xstate->image->width, xstate->image->height, 1,
XCB_WINDOW_CLASS_INPUT_OUTPUT,
xstate->screen->root_visual,
mask, values);
/* set size hits on window */
hints = xcb_alloc_size_hints();
xcb_size_hints_set_max_size(hints, xstate->image->width, xstate->image->height);
xcb_size_hints_set_min_size(hints, xstate->image->width, xstate->image->height);
xcb_set_wm_size_hints(xstate->connection, xstate->window, WM_NORMAL_HINTS, hints);
xcb_free_size_hints(hints);
 
/* create backing pixmap */
xstate->pmap = xcb_generate_id(xstate->connection);
xcb_create_pixmap(xstate->connection, 24, xstate->pmap, xstate->window, xstate->image->width, xstate->image->height);
 
/* create pixmap plot gc */
mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND;
values[0] = xstate->screen->black_pixel;
values[1] = 0xffffff;
 
xstate->gc = xcb_generate_id (xstate->connection);
xcb_create_gc(xstate->connection, xstate->gc, xstate->pmap, mask, values);
 
/* if (nsfb->bpp == 8)
set_palette(nsfb);
*/
 
/* put the image into the pixmap */
update_and_redraw_pixmap(xstate, 0, 0, xstate->image->width, xstate->image->height);
 
 
/* show the window */
xcb_map_window (xstate->connection, xstate->window);
xcb_flush(xstate->connection);
 
return 0;
}
 
static int x_finalise(nsfb_t *nsfb)
{
xstate_t *xstate = nsfb->surface_priv;
if (xstate == NULL)
return 0;
 
xcb_key_symbols_free(xstate->keysymbols);
 
/* free pixmap */
xcb_free_pixmap(xstate->connection, xstate->pmap);
 
/* close connection to server */
xcb_disconnect(xstate->connection);
 
return 0;
}
 
static bool x_input(nsfb_t *nsfb, nsfb_event_t *event, int timeout)
{
xcb_generic_event_t *e;
xcb_expose_event_t *ee;
xcb_motion_notify_event_t *emn;
xcb_button_press_event_t *ebp;
xcb_key_press_event_t *ekp;
xcb_key_press_event_t *ekr;
xstate_t *xstate = nsfb->surface_priv;
 
if (xstate == NULL)
return false;
 
xcb_flush(xstate->connection);
 
/* try and retrive an event immediately */
e = xcb_poll_for_event(xstate->connection);
 
if ((e == NULL) && (timeout != 0)) {
if (timeout > 0) {
int confd;
fd_set rfds;
struct timeval tv;
int retval;
 
confd = xcb_get_file_descriptor(xstate->connection);
FD_ZERO(&rfds);
FD_SET(confd, &rfds);
 
tv.tv_sec = timeout / 1000;
tv.tv_usec = timeout % 1000;
 
retval = select(confd + 1, &rfds, NULL, NULL, &tv);
if (retval == 0) {
/* timeout, nothing happened */
event->type = NSFB_EVENT_CONTROL;
event->value.controlcode = NSFB_CONTROL_TIMEOUT;
return true;
}
}
e = xcb_wait_for_event(xstate->connection);
}
 
if (e == NULL) {
if (xcb_connection_has_error(xstate->connection) != 0) {
/* connection closed quiting time */
event->type = NSFB_EVENT_CONTROL;
event->value.controlcode = NSFB_CONTROL_QUIT;
return true;
} else {
return false; /* no event */
}
}
 
event->type = NSFB_EVENT_NONE;
 
switch (e->response_type) {
case XCB_EXPOSE:
ee = (xcb_expose_event_t *)e;
xcb_copy_area(xstate->connection,
xstate->pmap,
xstate->window,
xstate->gc,
ee->x, ee->y,
ee->x, ee->y,
ee->width, ee->height);
xcb_flush (xstate->connection);
break;
 
case XCB_MOTION_NOTIFY:
emn = (xcb_motion_notify_event_t *)e;
event->type = NSFB_EVENT_MOVE_ABSOLUTE;
event->value.vector.x = emn->event_x;
event->value.vector.y = emn->event_y;
event->value.vector.z = 0;
break;
 
 
case XCB_BUTTON_PRESS:
ebp = (xcb_button_press_event_t *)e;
event->type = NSFB_EVENT_KEY_DOWN;
 
switch (ebp->detail) {
 
case X_BUTTON_LEFT:
event->value.keycode = NSFB_KEY_MOUSE_1;
break;
 
case X_BUTTON_MIDDLE:
event->value.keycode = NSFB_KEY_MOUSE_2;
break;
 
case X_BUTTON_RIGHT:
event->value.keycode = NSFB_KEY_MOUSE_3;
break;
 
case X_BUTTON_WHEELUP:
event->value.keycode = NSFB_KEY_MOUSE_4;
break;
 
case X_BUTTON_WHEELDOWN:
event->value.keycode = NSFB_KEY_MOUSE_5;
break;
}
break;
 
case XCB_BUTTON_RELEASE:
ebp = (xcb_button_press_event_t *)e;
event->type = NSFB_EVENT_KEY_UP;
 
switch (ebp->detail) {
 
case X_BUTTON_LEFT:
event->value.keycode = NSFB_KEY_MOUSE_1;
break;
 
case X_BUTTON_MIDDLE:
event->value.keycode = NSFB_KEY_MOUSE_2;
break;
 
case X_BUTTON_RIGHT:
event->value.keycode = NSFB_KEY_MOUSE_3;
break;
 
case X_BUTTON_WHEELUP:
event->value.keycode = NSFB_KEY_MOUSE_4;
break;
 
case X_BUTTON_WHEELDOWN:
event->value.keycode = NSFB_KEY_MOUSE_5;
break;
}
break;
 
 
case XCB_KEY_PRESS:
ekp = (xcb_key_press_event_t *)e;
event->type = NSFB_EVENT_KEY_DOWN;
event->value.keycode = xkeysym_to_nsfbkeycode(xcb_key_symbols_get_keysym(xstate->keysymbols, ekp->detail, 0));
break;
 
case XCB_KEY_RELEASE:
ekr = (xcb_key_release_event_t *)e;
event->type = NSFB_EVENT_KEY_UP;
event->value.keycode = xkeysym_to_nsfbkeycode(xcb_key_symbols_get_keysym(xstate->keysymbols, ekr->detail, 0));
break;
 
}
 
free(e);
 
return true;
}
 
static int x_claim(nsfb_t *nsfb, nsfb_bbox_t *box)
{
struct nsfb_cursor_s *cursor = nsfb->cursor;
 
if ((cursor != NULL) &&
(cursor->plotted == true) &&
(nsfb_plot_bbox_intersect(box, &cursor->loc))) {
nsfb_cursor_clear(nsfb, cursor);
}
return 0;
}
 
 
 
static int
x_cursor(nsfb_t *nsfb, struct nsfb_cursor_s *cursor)
{
xstate_t *xstate = nsfb->surface_priv;
nsfb_bbox_t redraw;
nsfb_bbox_t fbarea;
 
if ((cursor != NULL) && (cursor->plotted == true)) {
 
nsfb_plot_add_rect(&cursor->savloc, &cursor->loc, &redraw);
 
/* screen area */
fbarea.x0 = 0;
fbarea.y0 = 0;
fbarea.x1 = nsfb->width;
fbarea.y1 = nsfb->height;
 
nsfb_plot_clip(&fbarea, &redraw);
 
nsfb_cursor_clear(nsfb, cursor);
 
nsfb_cursor_plot(nsfb, cursor);
 
/* TODO: This is hediously ineficient - should keep the pointer image
* as a pixmap and plot server side
*/
update_and_redraw_pixmap(xstate, redraw.x0, redraw.y0, redraw.x1 - redraw.x0, redraw.y1 - redraw.y0);
 
}
return true;
}
 
 
static int x_update(nsfb_t *nsfb, nsfb_bbox_t *box)
{
xstate_t *xstate = nsfb->surface_priv;
struct nsfb_cursor_s *cursor = nsfb->cursor;
 
if ((cursor != NULL) &&
(cursor->plotted == false)) {
nsfb_cursor_plot(nsfb, cursor);
}
 
update_and_redraw_pixmap(xstate, box->x0, box->y0, box->x1 - box->x0, box->y1 - box->y0);
 
return 0;
}
 
const nsfb_surface_rtns_t x_rtns = {
.initialise = x_initialise,
.finalise = x_finalise,
.input = x_input,
.claim = x_claim,
.update = x_update,
.cursor = x_cursor,
.geometry = x_set_geometry,
};
 
NSFB_SURFACE_DEF(x, NSFB_SURFACE_X, &x_rtns)
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/src/Makefile
0,0 → 1,7
# Sources
OBJS := libnsfb.o dump.o cursor.o palette.o
 
OUTFILE = libo.o
 
CFLAGS += -I ../../include/ -I ../../ -I ../ -I ./ -I /home/sourcerer/kos_src/newenginek/kolibri/include
include $(MENUETDEV)/makefiles/Makefile_for_o_lib
/contrib/network/netsurf/libnsfb/src/cursor.c
0,0 → 1,152
/*
* Copyright 2010 Vincent Sanders <vince@kyllikki.org>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
/** \file
* cursor (implementation).
*/
 
#include <stdbool.h>
#include <stdlib.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_cursor.h"
 
#include "nsfb.h"
#include "cursor.h"
#include "plot.h"
#include "surface.h"
 
bool nsfb_cursor_init(nsfb_t *nsfb)
{
if (nsfb->cursor != NULL)
return false;
 
nsfb->cursor = calloc(1, sizeof(struct nsfb_cursor_s));
if (nsfb->cursor == NULL)
return false;
 
nsfb->cursor->loc.x0 = nsfb->width / 2;
nsfb->cursor->loc.y0 = nsfb->height / 2;
return true;
}
 
bool nsfb_cursor_set(nsfb_t *nsfb, const nsfb_colour_t *pixel,
int bmp_width, int bmp_height, int bmp_stride,
int hotspot_x, int hotspot_y)
{
if (nsfb->cursor == NULL)
return false;
 
nsfb->cursor->pixel = pixel;
nsfb->cursor->bmp_width = bmp_width;
nsfb->cursor->bmp_height = bmp_height;
nsfb->cursor->bmp_stride = bmp_stride;
nsfb->cursor->loc.x1 = nsfb->cursor->loc.x0 + nsfb->cursor->bmp_width;
nsfb->cursor->loc.y1 = nsfb->cursor->loc.y0 + nsfb->cursor->bmp_height;
 
nsfb->cursor->hotspot_x = hotspot_x;
nsfb->cursor->hotspot_y = hotspot_y;
return nsfb->surface_rtns->cursor(nsfb, nsfb->cursor);
}
 
bool nsfb_cursor_loc_set(nsfb_t *nsfb, const nsfb_bbox_t *loc)
{
if (nsfb->cursor == NULL)
return false;
 
nsfb->cursor->loc = *loc;
nsfb->cursor->loc.x1 = nsfb->cursor->loc.x0 + nsfb->cursor->bmp_width;
nsfb->cursor->loc.y1 = nsfb->cursor->loc.y0 + nsfb->cursor->bmp_height;
 
return nsfb->surface_rtns->cursor(nsfb, nsfb->cursor);
}
 
bool nsfb_cursor_loc_get(nsfb_t *nsfb, nsfb_bbox_t *loc)
{
if (nsfb->cursor == NULL)
return false;
 
*loc = nsfb->cursor->loc;
return true;
}
 
/* documented in cursor.h */
bool nsfb_cursor_plot(nsfb_t *nsfb, struct nsfb_cursor_s *cursor)
{
int sav_size;
nsfb_bbox_t sclip; /* saved clipping area */
 
nsfb->plotter_fns->get_clip(nsfb, &sclip);
nsfb->plotter_fns->set_clip(nsfb, NULL);
 
/* offset cursor rect for hotspot */
cursor->loc.x0 -= cursor->hotspot_x;
cursor->loc.y0 -= cursor->hotspot_y;
cursor->loc.x1 -= cursor->hotspot_x;
cursor->loc.y1 -= cursor->hotspot_y;
 
cursor->savloc = cursor->loc;
 
cursor->sav_width = cursor->savloc.x1 - cursor->savloc.x0;
cursor->sav_height = cursor->savloc.y1 - cursor->savloc.y0;
 
sav_size = cursor->sav_width * cursor->sav_height * sizeof(nsfb_colour_t);
if (cursor->sav_size < sav_size) {
cursor->sav = realloc(cursor->sav, sav_size);
cursor->sav_size = sav_size;
}
 
nsfb->plotter_fns->readrect(nsfb, &cursor->savloc, cursor->sav);
cursor->sav_width = cursor->savloc.x1 - cursor->savloc.x0;
cursor->sav_height = cursor->savloc.y1 - cursor->savloc.y0;
 
nsfb->plotter_fns->set_clip(nsfb, NULL);
nsfb->plotter_fns->bitmap(nsfb,
&cursor->loc,
cursor->pixel,
cursor->bmp_width,
cursor->bmp_height,
cursor->bmp_stride,
true);
 
/* undo hotspot offset */
cursor->loc.x0 += cursor->hotspot_x;
cursor->loc.y0 += cursor->hotspot_y;
cursor->loc.x1 += cursor->hotspot_x;
cursor->loc.y1 += cursor->hotspot_y;
 
nsfb->plotter_fns->set_clip(nsfb, &sclip);
 
cursor->plotted = true;
 
return true;
}
 
bool nsfb_cursor_clear(nsfb_t *nsfb, struct nsfb_cursor_s *cursor)
{
nsfb_bbox_t sclip; /* saved clipping area */
 
nsfb->plotter_fns->get_clip(nsfb, &sclip);
nsfb->plotter_fns->set_clip(nsfb, NULL);
 
nsfb->plotter_fns->bitmap(nsfb,
&cursor->savloc,
cursor->sav,
cursor->sav_width,
cursor->sav_height,
cursor->sav_width,
false);
 
nsfb->plotter_fns->set_clip(nsfb, &sclip);
 
cursor->plotted = false;
return true;
 
}
/contrib/network/netsurf/libnsfb/src/dump.c
0,0 → 1,56
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_event.h"
#include "nsfb.h"
#include "surface.h"
 
/* exported interface documented in libnsfb.h */
bool
nsfb_dump(nsfb_t *nsfb, int fd)
{
FILE *outf;
int x;
int y;
 
outf = fdopen(dup(fd), "w");
if (outf == NULL) {
return false;
}
 
fprintf(outf,"P3\n#libnsfb buffer dump\n%d %d\n255\n",
nsfb->width, nsfb->height);
for (y=0; y < nsfb->height; y++) {
for (x=0; x < nsfb->width; x++) {
fprintf(outf,"%d %d %d ",
*(nsfb->ptr + (((nsfb->width * y) + x) * 4) + 2),
*(nsfb->ptr + (((nsfb->width * y) + x) * 4) + 1),
*(nsfb->ptr + (((nsfb->width * y) + x) * 4) + 0));
}
fprintf(outf,"\n");
}
 
fclose(outf);
 
return true;
}
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/src/libnsfb.c
0,0 → 1,152
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_event.h"
#include "nsfb.h"
#include "palette.h"
#include "surface.h"
 
/* exported interface documented in libnsfb.h */
nsfb_t*
nsfb_new(const enum nsfb_type_e surface_type)
{
nsfb_t *newfb;
newfb = calloc(1, sizeof(nsfb_t));
if (newfb == NULL)
return NULL;
 
/* obtain surface routines */
newfb->surface_rtns = nsfb_surface_get_rtns(surface_type);
if (newfb->surface_rtns == NULL) {
free(newfb);
return NULL;
}
 
newfb->surface_rtns->defaults(newfb);
 
return newfb;
}
 
/* exported interface documented in libnsfb.h */
int
nsfb_init(nsfb_t *nsfb)
{
return nsfb->surface_rtns->initialise(nsfb);
}
 
/* exported interface documented in libnsfb.h */
int
nsfb_free(nsfb_t *nsfb)
{
int ret;
 
if (nsfb->palette != NULL)
nsfb_palette_free(nsfb->palette);
 
ret = nsfb->surface_rtns->finalise(nsfb);
free(nsfb);
return ret;
}
 
/* exported interface documented in libnsfb.h */
bool
nsfb_event(nsfb_t *nsfb, nsfb_event_t *event, int timeout)
{
return nsfb->surface_rtns->input(nsfb, event, timeout);
}
 
/* exported interface documented in libnsfb.h */
int
nsfb_claim(nsfb_t *nsfb, nsfb_bbox_t *box)
{
return nsfb->surface_rtns->claim(nsfb, box);
}
 
/* exported interface documented in libnsfb.h */
int
nsfb_update(nsfb_t *nsfb, nsfb_bbox_t *box)
{
return nsfb->surface_rtns->update(nsfb, box);
}
 
/* exported interface documented in libnsfb.h */
int
nsfb_set_geometry(nsfb_t *nsfb, int width, int height, enum nsfb_format_e format)
{
if (width <= 0)
width = nsfb->width;
 
if (height <= 0)
height = nsfb->height;
 
if (format == NSFB_FMT_ANY)
format = nsfb->format;
 
return nsfb->surface_rtns->geometry(nsfb, width, height, format);
}
 
/* exported interface documented in libnsfb.h */
int nsfb_set_parameters(nsfb_t *nsfb, const char *parameters)
{
if ((parameters == NULL) || (*parameters == 0)) {
return -1;
}
 
if (nsfb->parameters != NULL) {
free(nsfb->parameters);
}
 
nsfb->parameters = strdup(parameters);
 
return nsfb->surface_rtns->parameters(nsfb, parameters);
}
 
/* exported interface documented in libnsfb.h */
int
nsfb_get_geometry(nsfb_t *nsfb, int *width, int *height, enum nsfb_format_e *format)
{
if (width != NULL)
*width = nsfb->width;
 
if (height != NULL)
*height = nsfb->height;
 
if (format != NULL)
*format = nsfb->format;
 
return 0;
}
 
/* exported interface documented in libnsfb.h */
int
nsfb_get_buffer(nsfb_t *nsfb, uint8_t **ptr, int *linelen)
{
if (ptr != NULL) {
*ptr = nsfb->ptr;
}
if (linelen != NULL) {
*linelen = nsfb->linelen;
}
return 0;
}
 
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
 
/contrib/network/netsurf/libnsfb/src/palette.c
0,0 → 1,117
/*
* Copyright 2012 Michael Drake <tlsa@netsurf-browser.org>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
/** \file
* Palette (implementation).
*/
 
#include <assert.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
 
#include "palette.h"
 
 
/** Create an empty palette object. */
bool nsfb_palette_new(struct nsfb_palette_s **palette, int width)
{
*palette = malloc(sizeof(struct nsfb_palette_s));
if (*palette == NULL) {
return false;
}
 
(*palette)->type = NSFB_PALETTE_EMPTY;
(*palette)->last = 0;
 
(*palette)->dither = false;
(*palette)->dither_ctx.data_len = width * 3;
(*palette)->dither_ctx.data = malloc(width * 3 * sizeof(int));
if ((*palette)->dither_ctx.data == NULL) {
nsfb_palette_free(*palette);
return false;
}
 
return true;
}
 
/** Free a palette object. */
void nsfb_palette_free(struct nsfb_palette_s *palette)
{
if (palette != NULL) {
if (palette->dither_ctx.data != NULL) {
free(palette->dither_ctx.data);
}
free(palette);
}
}
 
/** Init error diffusion for a plot. */
void nsfb_palette_dither_init(struct nsfb_palette_s *palette, int width)
{
palette->dither = true;
memset(palette->dither_ctx.data, 0, palette->dither_ctx.data_len);
palette->dither_ctx.width = width * 3;
palette->dither_ctx.current = 0;
}
 
/** Finalise error diffusion after a plot. */
void nsfb_palette_dither_fini(struct nsfb_palette_s *palette)
{
palette->dither = false;
}
 
/** Generate libnsfb 8bpp default palette. */
void nsfb_palette_generate_nsfb_8bpp(struct nsfb_palette_s *palette)
{
int rloop, gloop, bloop;
int loop = 0;
uint8_t r, g, b;
 
/* Build a linear 6-8-5 levels RGB colour cube palette.
* This accounts for 240 colours */
#define RLIM 6
#define GLIM 8
#define BLIM 5
for (rloop = 0; rloop < RLIM; rloop++) {
for (gloop = 0; gloop < GLIM; gloop++) {
for (bloop = 0; bloop < BLIM; bloop++) {
r = ((rloop * 255 * 2) + RLIM - 1) /
(2 * (RLIM - 1));
g = ((gloop * 255 * 2) + GLIM - 1) /
(2 * (GLIM - 1));
b = ((bloop * 255 * 2) + BLIM - 1) /
(2 * (BLIM - 1));
 
palette->data[loop] = r | g << 8 | b << 16;
loop++;
}
}
}
#undef RLIM
#undef GLIM
#undef BLIM
 
/* Should have 240 colours set */
assert(loop == 240);
 
/* Fill index 240 to index 255 with grayscales */
/* Note: already have full black and full white from RGB cube */
for (; loop < 256; loop++) {
int ngray = loop - 240 + 1;
r = ngray * 15; /* 17*15 = 255 */
 
g = b = r;
 
palette->data[loop] = r | g << 8 | b << 16;
}
 
/* Set palette details */
palette->type = NSFB_PALETTE_NSFB_8BPP;
palette->last = 255;
}
/contrib/network/netsurf/libnsfb/src/plot/16bpp.c
0,0 → 1,126
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
* Copyright 2010 Michael Drake <tlsa@netsurf-browser.org>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
#include <stdbool.h>
#include <endian.h>
#include <stdlib.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_plot_util.h"
 
#include "nsfb.h"
#include "plot.h"
 
#define UNUSED __attribute__((unused))
 
static inline uint16_t *get_xy_loc(nsfb_t *nsfb, int x, int y)
{
return (void *)(nsfb->ptr + (y * nsfb->linelen) + (x << 1));
}
 
static inline nsfb_colour_t pixel_to_colour(UNUSED nsfb_t *nsfb, uint16_t pixel)
{
return ((pixel & 0x1F) << 19) |
((pixel & 0x7E0) << 5) |
((pixel & 0xF800) >> 8);
}
 
/* convert a colour value to a 16bpp pixel value ready for screen output */
static inline uint16_t colour_to_pixel(UNUSED nsfb_t *nsfb, nsfb_colour_t c)
{
return ((c & 0xF8) << 8) | ((c & 0xFC00 ) >> 5) | ((c & 0xF80000) >> 19);
}
 
#define PLOT_TYPE uint16_t
#define PLOT_LINELEN(ll) ((ll) >> 1)
 
#include "common.c"
 
 
static bool fill(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t c)
{
int w;
uint16_t *pvid16;
uint16_t ent16;
uint32_t *pvid32;
uint32_t ent32;
uint32_t llen;
uint32_t width;
uint32_t height;
 
if (!nsfb_plot_clip_ctx(nsfb, rect))
return true; /* fill lies outside current clipping region */
 
ent16 = colour_to_pixel(nsfb, c);
width = rect->x1 - rect->x0;
height = rect->y1 - rect->y0;
 
pvid16 = get_xy_loc(nsfb, rect->x0, rect->y0);
 
if (((rect->x0 & 1) == 0) && ((width & 1) == 0)) {
/* aligned to 32bit value and width is even */
width = width >> 1;
llen = (nsfb->linelen >> 2) - width;
ent32 = ent16 | (ent16 << 16);
pvid32 = (void *)pvid16;
 
while (height-- > 0) {
w = width;
while (w >= 16) {
*pvid32++ = ent32; *pvid32++ = ent32;
*pvid32++ = ent32; *pvid32++ = ent32;
*pvid32++ = ent32; *pvid32++ = ent32;
*pvid32++ = ent32; *pvid32++ = ent32;
*pvid32++ = ent32; *pvid32++ = ent32;
*pvid32++ = ent32; *pvid32++ = ent32;
*pvid32++ = ent32; *pvid32++ = ent32;
*pvid32++ = ent32; *pvid32++ = ent32;
w-=16;
}
while (w >= 4) {
*pvid32++ = ent32; *pvid32++ = ent32;
*pvid32++ = ent32; *pvid32++ = ent32;
w-=4;
}
while (w > 0) {
*pvid32++ = ent32;
w--;
}
// for (w = width; w > 0; w--) *pvid32++ = ent32;
pvid32 += llen;
}
 
} else {
llen = (nsfb->linelen >> 1) - width;
 
 
while (height-- > 0) {
for (w = width; w > 0; w--) *pvid16++ = ent16;
pvid16 += llen;
}
}
return true;
}
 
const nsfb_plotter_fns_t _nsfb_16bpp_plotters = {
.line = line,
.fill = fill,
.point = point,
.bitmap = bitmap,
.glyph8 = glyph8,
.glyph1 = glyph1,
.readrect = readrect,
};
 
/*
* Local Variables:
* c-basic-offset:8
* End:
*/
/contrib/network/netsurf/libnsfb/src/plot/1bpp.c
0,0 → 1,266
/*
* Copyright 2008 Vincent Sanders <vince@simtec.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
* NetSurf is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* NetSurf is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
 
#include <sys/types.h>
#include <stdint.h>
#include <string.h>
#include <limits.h>
 
#include "utils/log.h"
#include "utils/utf8.h"
#include "desktop/plotters.h"
 
#include "framebuffer/fb_gui.h"
#include "framebuffer/fb_plotters.h"
#include "framebuffer/fb_bitmap.h"
#include "framebuffer/fb_font.h"
 
extern struct fb_info_s *fbinfo;
 
 
static bool fb_1bpp_rectangle(int x0, int y0, int width, int height,
int line_width, colour c, bool dotted, bool dashed)
{
LOG(("%s(%d, %d, %d, %d, %d, 0x%lx, %d, %d)\n", __func__,
x0,y0,width,height,line_width,c,dotted,dashed));
return true;
}
 
static bool fb_1bpp_line(int x0, int y0, int x1, int y1, int width,
colour c, bool dotted, bool dashed)
{
LOG(("%s(%d, %d, %d, %d, %d, 0x%lx, %d, %d)\n", __func__,
x0,y0,x1,y1,width,c,dotted,dashed));
 
return true;
}
 
static bool fb_1bpp_polygon(const int *p, unsigned int n, colour fill)
{
LOG(("%s(%p, %d, 0x%lx)\n", __func__, p,n,fill));
return true;
}
 
 
static bool fb_1bpp_fill(int x0, int y0, int x1, int y1, colour c)
{
int x;
int y;
int pent;
 
LOG(("%s(%d, %d, %d, %d, 0x%lx)\n", __func__,
x0,y0,x1,y1,c));
 
if (c != 0)
pent = 0xff;
else
pent = 0;
 
fb_plotters_clip_rect_ctx(&x0, &y0, &x1, &y1);
x = x1 - x0;
for (y = y0; y < y1; y++) {
memset(fb_plotters_get_xy_loc(x0, y, fbinfo), pent, x);
}
return true;
}
 
static bool fb_1bpp_clg(colour c)
{
LOG(("%s(%lx)\n", __func__, c));
fb_1bpp_fill(fb_plot_ctx.x0,
fb_plot_ctx.y0,
fb_plot_ctx.x1,
fb_plot_ctx.y1,
c);
return true;
}
 
 
static bool fb_1bpp_text(int x, int y, const struct css_style *style,
const char *text, size_t length, colour bg, colour c)
{
const struct fb_font_desc* fb_font = fb_get_font(style);
u8_t *video_char_start;
const u8_t *font_data;
int yloop;
unsigned char row;
int chr;
 
LOG(("%s(%d, %d, %p, %.*s , %d, 0x%lx, 0x%lx)\n", __func__,
x,y,style,length,text,length,bg,c));
 
for (chr=0; chr < length; chr++) {
video_char_start = fb_plotters_get_xy_loc(x + (chr * (fb_font->width)), y, fbinfo);
 
/* move our font-data to the correct position */
font_data = fb_font->data + (text[chr] * fb_font->height);
 
for (yloop = 0; yloop < fb_font->height; yloop++) {
row = font_data[yloop];
*video_char_start = row;
video_char_start += fbinfo->line_len;
}
}
return true;
 
 
/* copied from css/css.h - need to open the correct font here
* font properties *
css_font_family font_family;
struct {
css_font_size_type size;
union {
struct css_length length;
float absolute;
float percent;
} value;
} font_size;
css_font_style font_style;
css_font_variant font_variant;
css_font_weight font_weight;
*/
return true;
}
 
static bool fb_1bpp_disc(int x, int y, int radius, colour c, bool filled)
{
LOG(("%s(%d, %d, %d, 0x%lx, %d)\n", __func__,
x, y, radius, c, filled));
return true;
}
 
static bool fb_1bpp_arc(int x, int y, int radius, int angle1, int angle2,
colour c)
{
LOG(("x %d, y %d, radius %d, angle1 %d, angle2 %d, c 0x%lx",
x, y, radius, angle1, angle2, c));
return true;
}
 
static inline colour ablend(colour pixel)
{
return pixel;
}
 
 
static bool fb_1bpp_bitmap(int x, int y, int width, int height,
struct bitmap *bitmap, colour bg,
struct content *content)
{
u8_t *video_char_start;
colour *pixel = (colour *)bitmap->pixdata;
colour abpixel; /* alphablended pixel */
int xloop,yloop;
 
video_char_start = fb_plotters_get_xy_loc(x, y, fbinfo);
 
for (yloop = 0; yloop < height; yloop++) {
for (xloop = 0; xloop < width; xloop++) {
abpixel = pixel[(yloop * bitmap->width) + xloop];
if ((abpixel & 0xFF000000) != 0) {
if ((abpixel & 0xFF000000) != 0xFF)
abpixel = ablend(abpixel);
if (abpixel == 0)
video_char_start[xloop] |= (1 << (xloop % 8));
else
video_char_start[xloop] &= ~(1 << (xloop % 8));
 
}
}
video_char_start += fbinfo->line_len;
}
 
return true;
}
 
static bool fb_1bpp_bitmap_tile(int x, int y, int width, int height,
struct bitmap *bitmap, colour bg,
bool repeat_x, bool repeat_y,
struct content *content)
{
unsigned long xf,yf,wf,hf;
 
if (!(repeat_x || repeat_y)) {
/* Not repeating at all, so just pass it on */
return fb_1bpp_bitmap(x,y,width,height,bitmap,bg,content);
}
 
for (xf = 0; xf < width; xf += bitmap->width) {
for(yf = 0;yf < height; yf += bitmap->height) {
if(width > xf+bitmap->width)
{
wf = width-(xf+bitmap->width);
}
else
{
wf=bitmap->width;
}
 
if(height > yf+bitmap->height)
{
hf = height-(yf+bitmap->height);
}
else
{
hf=bitmap->height;
}
 
fb_1bpp_bitmap(x+xf, y+yf, wf, hf, bitmap, bg, content);
 
}
}
 
return true;
}
 
static bool fb_1bpp_flush(void)
{
LOG(("%s()\n", __func__));
return true;
}
 
static bool fb_1bpp_path(const float *p, unsigned int n, colour fill, float width,
colour c, const float transform[6])
{
LOG(("%s(%f, %d, 0x%lx, %f, 0x%lx, %f)\n", __func__,
*p, n, fill, width, c, *transform));
return true;
}
 
const struct plotter_table framebuffer_1bpp_plot = {
.clg = fb_1bpp_clg,
.rectangle = fb_1bpp_rectangle,
.line = fb_1bpp_line,
.polygon = fb_1bpp_polygon,
.fill = fb_1bpp_fill,
.clip = fb_clip,
.text = fb_1bpp_text,
.disc = fb_1bpp_disc,
.arc = fb_1bpp_arc,
.bitmap = fb_1bpp_bitmap,
.bitmap_tile = fb_1bpp_bitmap_tile,
.flush = fb_1bpp_flush,
.path = fb_1bpp_path
};
 
/*
* Local Variables:
* c-basic-offset:8
* End:
*/
/contrib/network/netsurf/libnsfb/src/plot/24bpp.c
0,0 → 1,442
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
#include <stdbool.h>
#include <endian.h>
#include <stdlib.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_plot_util.h"
 
#include "nsfb.h"
#include "plot.h"
 
static inline uint8_t *
get_xy_loc(nsfb_t *nsfb, int x, int y)
{
return (uint8_t *)(nsfb->ptr + (y * nsfb->linelen) + (x * 3));
}
 
#if __BYTE_ORDER == __BIG_ENDIAN
static inline nsfb_colour_t pixel_to_colour(uint8_t pixel)
{
return (pixel >> 8) & ~0xFF000000U;
}
 
/* convert a colour value to a 32bpp pixel value ready for screen output */
static inline uint32_t colour_to_pixel(nsfb_colour_t c)
{
return (c << 8);
}
#else /* __BYTE_ORDER == __BIG_ENDIAN */
static inline nsfb_colour_t pixel_to_colour(uint32_t pixel)
{
return ((pixel & 0xFF) << 16) |
((pixel & 0xFF00)) |
((pixel & 0xFF0000) >> 16);
}
 
/* convert a colour value to a 32bpp pixel value ready for screen output */
static inline uint32_t colour_to_pixel(nsfb_colour_t c)
{
return ((c & 0xff0000) >> 16) | (c & 0xff00) | ((c & 0xff) << 16);
}
#endif
 
#define SIGN(x) ((x<0) ? -1 : ((x>0) ? 1 : 0))
 
static bool
line(nsfb_t *nsfb, int linec, nsfb_bbox_t *line, nsfb_plot_pen_t *pen)
{
int w;
uint32_t ent;
uint32_t *pvideo;
int x, y, i;
int dx, dy, sdy;
int dxabs, dyabs;
 
ent = colour_to_pixel(pen->stroke_colour);
 
for (;linec > 0; linec--) {
 
if (line->y0 == line->y1) {
/* horizontal line special cased */
 
if (!nsfb_plot_clip_ctx(nsfb, line)) {
/* line outside clipping */
line++;
continue;
}
 
pvideo = get_xy_loc(nsfb, line->x0, line->y0);
 
w = line->x1 - line->x0;
while (w-- > 0)
*(pvideo + w) = ent;
 
} else {
/* standard bresenham line */
 
if (!nsfb_plot_clip_line_ctx(nsfb, line)) {
/* line outside clipping */
line++;
continue;
}
 
/* the horizontal distance of the line */
dx = line->x1 - line->x0;
dxabs = abs (dx);
 
/* the vertical distance of the line */
dy = line->y1 - line->y0;
dyabs = abs (dy);
 
sdy = dx ? SIGN(dy) * SIGN(dx) : SIGN(dy);
 
if (dx >= 0)
pvideo = get_xy_loc(nsfb, line->x0, line->y0);
else
pvideo = get_xy_loc(nsfb, line->x1, line->y1);
 
x = dyabs >> 1;
y = dxabs >> 1;
 
if (dxabs >= dyabs) {
/* the line is more horizontal than vertical */
for (i = 0; i < dxabs; i++) {
*pvideo = ent;
 
pvideo++;
y += dyabs;
if (y >= dxabs) {
y -= dxabs;
pvideo += sdy * (nsfb->linelen>>2);
}
}
} else {
/* the line is more vertical than horizontal */
for (i = 0; i < dyabs; i++) {
*pvideo = ent;
pvideo += sdy * (nsfb->linelen >> 2);
 
x += dxabs;
if (x >= dyabs) {
x -= dyabs;
pvideo++;
}
}
}
 
}
line++;
}
return true;
}
 
 
 
static bool fill(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t c)
{
int w;
uint32_t *pvid;
uint32_t ent;
uint32_t llen;
uint32_t width;
uint32_t height;
 
if (!nsfb_plot_clip_ctx(nsfb, rect))
return true; /* fill lies outside current clipping region */
 
ent = colour_to_pixel(c);
width = rect->x1 - rect->x0;
height = rect->y1 - rect->y0;
llen = (nsfb->linelen >> 2) - width;
 
pvid = get_xy_loc(nsfb, rect->x0, rect->y0);
 
while (height-- > 0) {
w = width;
while (w >= 16) {
*pvid++ = ent; *pvid++ = ent;
*pvid++ = ent; *pvid++ = ent;
*pvid++ = ent; *pvid++ = ent;
*pvid++ = ent; *pvid++ = ent;
*pvid++ = ent; *pvid++ = ent;
*pvid++ = ent; *pvid++ = ent;
*pvid++ = ent; *pvid++ = ent;
*pvid++ = ent; *pvid++ = ent;
w-=16;
}
while (w >= 4) {
*pvid++ = ent; *pvid++ = ent;
*pvid++ = ent; *pvid++ = ent;
w-=4;
}
while (w > 0) {
*pvid++ = ent;
w--;
}
pvid += llen;
}
 
return true;
}
 
 
 
 
static bool point(nsfb_t *nsfb, int x, int y, nsfb_colour_t c)
{
uint32_t *pvideo;
 
/* check point lies within clipping region */
if ((x < nsfb->clip.x0) ||
(x >= nsfb->clip.x1) ||
(y < nsfb->clip.y0) ||
(y >= nsfb->clip.y1))
return true;
 
pvideo = get_xy_loc(nsfb, x, y);
 
if ((c & 0xFF000000) != 0) {
if ((c & 0xFF000000) != 0xFF000000) {
c = nsfb_plot_ablend(c, pixel_to_colour(*pvideo));
}
 
*pvideo = colour_to_pixel(c);
}
return true;
}
 
static bool
glyph1(nsfb_t *nsfb,
nsfb_bbox_t *loc,
const uint8_t *pixel,
int pitch,
nsfb_colour_t c)
{
uint32_t *pvideo;
int xloop, yloop;
int xoff, yoff; /* x and y offset into image */
int x = loc->x0;
int y = loc->y0;
int width = loc->x1 - loc->x0;
int height = loc->y1 - loc->y0;
uint32_t fgcol;
const uint8_t *fntd;
uint8_t row;
 
if (!nsfb_plot_clip_ctx(nsfb, loc))
return true;
 
if (height > (loc->y1 - loc->y0))
height = (loc->y1 - loc->y0);
 
if (width > (loc->x1 - loc->x0))
width = (loc->x1 - loc->x0);
 
xoff = loc->x0 - x;
yoff = loc->y0 - y;
 
pvideo = get_xy_loc(nsfb, loc->x0, loc->y0);
 
fgcol = colour_to_pixel(c);
 
for (yloop = yoff; yloop < height; yloop++) {
fntd = pixel + (yloop * (pitch>>3)) + (xoff>>3);
row = (*fntd++) << (xoff & 3);
for (xloop = xoff; xloop < width ; xloop++) {
if (((xloop % 8) == 0) && (xloop != 0)) {
row = *fntd++;
}
 
if ((row & 0x80) != 0) {
*(pvideo + xloop) = fgcol;
}
row = row << 1;
 
}
 
pvideo += (nsfb->linelen >> 2);
}
 
return true;
}
 
static bool
glyph8(nsfb_t *nsfb,
nsfb_bbox_t *loc,
const uint8_t *pixel,
int pitch,
nsfb_colour_t c)
{
uint32_t *pvideo;
nsfb_colour_t abpixel; /* alphablended pixel */
int xloop, yloop;
int xoff, yoff; /* x and y offset into image */
int x = loc->x0;
int y = loc->y0;
int width = loc->x1 - loc->x0;
int height = loc->y1 - loc->y0;
uint32_t fgcol;
 
if (!nsfb_plot_clip_ctx(nsfb, loc))
return true;
 
if (height > (loc->y1 - loc->y0))
height = (loc->y1 - loc->y0);
 
if (width > (loc->x1 - loc->x0))
width = (loc->x1 - loc->x0);
 
xoff = loc->x0 - x;
yoff = loc->y0 - y;
 
pvideo = get_xy_loc(nsfb, loc->x0, loc->y0);
 
fgcol = c & 0xFFFFFF;
 
for (yloop = 0; yloop < height; yloop++) {
for (xloop = 0; xloop < width; xloop++) {
abpixel = (pixel[((yoff + yloop) * pitch) + xloop + xoff] << 24) | fgcol;
if ((abpixel & 0xFF000000) != 0) {
/* pixel is not transparent */
if ((abpixel & 0xFF000000) != 0xFF000000) {
abpixel = nsfb_plot_ablend(abpixel,
pixel_to_colour(*(pvideo + xloop)));
}
 
*(pvideo + xloop) = colour_to_pixel(abpixel);
}
}
pvideo += (nsfb->linelen >> 2);
}
 
return true;
}
 
static bool
bitmap(nsfb_t *nsfb,
const nsfb_bbox_t *loc,
const nsfb_colour_t *pixel,
int bmp_width,
int bmp_height,
int bmp_stride,
bool alpha)
{
uint32_t *pvideo;
nsfb_colour_t abpixel = 0; /* alphablended pixel */
int xloop, yloop;
int xoff, yoff; /* x and y offset into image */
int x = loc->x0;
int y = loc->y0;
int width = loc->x1 - loc->x0;
int height = loc->y1 - loc->y0;
nsfb_bbox_t clipped; /* clipped display */
 
/* TODO here we should scale the image from bmp_width to width, for
* now simply crop.
*/
if (width > bmp_width)
width = bmp_width;
 
if (height > bmp_height)
height = bmp_height;
 
/* The part of the scaled image actually displayed is cropped to the
* current context.
*/
clipped.x0 = x;
clipped.y0 = y;
clipped.x1 = x + width;
clipped.y1 = y + height;
 
if (!nsfb_plot_clip_ctx(nsfb, &clipped)) {
return true;
}
 
if (height > (clipped.y1 - clipped.y0))
height = (clipped.y1 - clipped.y0);
 
if (width > (clipped.x1 - clipped.x0))
width = (clipped.x1 - clipped.x0);
 
xoff = clipped.x0 - x;
yoff = (clipped.y0 - y) * bmp_width;
height = height * bmp_stride + yoff;
 
/* plot the image */
pvideo = get_xy_loc(nsfb, clipped.x0, clipped.y0);
 
if (alpha) {
for (yloop = yoff; yloop < height; yloop += bmp_stride) {
for (xloop = 0; xloop < width; xloop++) {
abpixel = pixel[yloop + xloop + xoff];
if ((abpixel & 0xFF000000) != 0) {
if ((abpixel & 0xFF000000) != 0xFF000000) {
abpixel = nsfb_plot_ablend(abpixel,
pixel_to_colour(*(pvideo + xloop)));
}
 
*(pvideo + xloop) = colour_to_pixel(abpixel);
}
}
pvideo += (nsfb->linelen >> 2);
}
} else {
for (yloop = yoff; yloop < height; yloop += bmp_stride) {
for (xloop = 0; xloop < width; xloop++) {
abpixel = pixel[yloop + xloop + xoff];
*(pvideo + xloop) = colour_to_pixel(abpixel);
}
pvideo += (nsfb->linelen >> 2);
}
}
return true;
}
 
static bool readrect(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t *buffer)
{
uint32_t *pvideo;
int xloop, yloop;
int width;
 
if (!nsfb_plot_clip_ctx(nsfb, rect)) {
return true;
}
 
width = rect->x1 - rect->x0;
 
pvideo = get_xy_loc(nsfb, rect->x0, rect->y0);
 
for (yloop = rect->y0; yloop < rect->y1; yloop += 1) {
for (xloop = 0; xloop < width; xloop++) {
*buffer = pixel_to_colour(*(pvideo + xloop));
buffer++;
}
pvideo += (nsfb->linelen >> 2);
}
return true;
}
 
const nsfb_plotter_fns_t _nsfb_24bpp_plotters = {
.line = line,
.fill = fill,
.point = point,
.bitmap = bitmap,
.glyph8 = glyph8,
.glyph1 = glyph1,
.readrect = readrect,
};
 
/*
* Local Variables:
* c-basic-offset:8
* End:
*/
/contrib/network/netsurf/libnsfb/src/plot/32bpp-common.c
0,0 → 1,67
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
* Copyright 2010 Michael Drake <tlsa@netsurf-browser.org>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
#include "common.c"
#include <menuet/os.h>
 
static bool fill(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t c)
{
int w;
uint32_t *pvid;
uint32_t ent;
uint32_t llen;
uint32_t width;
uint32_t height;
__menuet__debug_out("nsfb fill:in\n");
if (!nsfb_plot_clip_ctx(nsfb, rect))
return true; /* fill lies outside current clipping region */
 
ent = colour_to_pixel(nsfb, c);
width = rect->x1 - rect->x0;
height = rect->y1 - rect->y0;
llen = (nsfb->linelen >> 2) - width;
 
pvid = get_xy_loc(nsfb, rect->x0, rect->y0);
 
__menuet__debug_out("nsfb fill:loooop\n");
while (height-- > 0) {
w = width;
while (w >= 16) {
*pvid++ = ent; *pvid++ = ent;
*pvid++ = ent; *pvid++ = ent;
*pvid++ = ent; *pvid++ = ent;
*pvid++ = ent; *pvid++ = ent;
*pvid++ = ent; *pvid++ = ent;
*pvid++ = ent; *pvid++ = ent;
*pvid++ = ent; *pvid++ = ent;
*pvid++ = ent; *pvid++ = ent;
w-=16;
}
while (w >= 4) {
*pvid++ = ent; *pvid++ = ent;
*pvid++ = ent; *pvid++ = ent;
w-=4;
}
while (w > 0) {
*pvid++ = ent;
w--;
}
pvid += llen;
}
 
__menuet__debug_out("nsfb fill:finish\n");
return true;
}
 
/*
* Local Variables:
* c-basic-offset:8
* End:
*/
/contrib/network/netsurf/libnsfb/src/plot/32bpp-xbgr8888.c
0,0 → 1,74
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
* Copyright 2010 Michael Drake <tlsa@netsurf-browser.org>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
#include <stdbool.h>
#include <endian.h>
#include <stdlib.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_plot_util.h"
 
#include "nsfb.h"
#include "plot.h"
 
 
#define UNUSED __attribute__((unused))
 
static inline uint32_t *get_xy_loc(nsfb_t *nsfb, int x, int y)
{
return (void *)(nsfb->ptr + (y * nsfb->linelen) + (x << 2));
}
 
#if __BYTE_ORDER == __BIG_ENDIAN
static inline nsfb_colour_t pixel_to_colour(UNUSED nsfb_t *nsfb, uint32_t pixel)
{
/* TODO: FIX */
return (pixel >> 8) & ~0xFF000000U;
}
 
/* convert a colour value to a 32bpp pixel value ready for screen output */
static inline uint32_t colour_to_pixel(UNUSED nsfb_t *nsfb, nsfb_colour_t c)
{
/* TODO: FIX */
return (c << 8);
}
#else /* __BYTE_ORDER == __BIG_ENDIAN */
static inline nsfb_colour_t pixel_to_colour(UNUSED nsfb_t *nsfb, uint32_t pixel)
{
return pixel | 0xFF000000U;
}
 
/* convert a colour value to a 32bpp pixel value ready for screen output */
static inline uint32_t colour_to_pixel(UNUSED nsfb_t *nsfb, nsfb_colour_t c)
{
return c;
}
#endif
 
#define PLOT_TYPE uint32_t
#define PLOT_LINELEN(ll) ((ll) >> 2)
 
#include "32bpp-common.c"
 
const nsfb_plotter_fns_t _nsfb_32bpp_xbgr8888_plotters = {
.line = line,
.fill = fill,
.point = point,
.bitmap = bitmap,
.glyph8 = glyph8,
.glyph1 = glyph1,
.readrect = readrect,
};
 
/*
* Local Variables:
* c-basic-offset:8
* End:
*/
/contrib/network/netsurf/libnsfb/src/plot/32bpp-xrgb8888.c
0,0 → 1,79
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
* Copyright 2010 Michael Drake <tlsa@netsurf-browser.org>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
#include <stdbool.h>
#include <endian.h>
#include <stdlib.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_plot_util.h"
 
#include "nsfb.h"
#include "plot.h"
 
 
#define UNUSED __attribute__((unused))
 
static inline uint32_t *get_xy_loc(nsfb_t *nsfb, int x, int y)
{
return (void *)(nsfb->ptr + (y * nsfb->linelen) + (x << 2));
}
/*
//if __BYTE_ORDER == __BIG_ENDIAN
static inline nsfb_colour_t pixel_to_colour(UNUSED nsfb_t *nsfb, uint32_t pixel)
{
return (pixel >> 8) & ~0xFF000000U;
}
*/
 
/* convert a colour value to a 32bpp pixel value ready for screen output */
/*
static inline uint32_t colour_to_pixel(UNUSED nsfb_t *nsfb, nsfb_colour_t c)
{
return (c << 8);
}
*/
//#else /* __BYTE_ORDER == __BIG_ENDIAN */
 
 
static inline nsfb_colour_t pixel_to_colour(UNUSED nsfb_t *nsfb, uint32_t pixel)
{
return ((pixel & 0xFF) << 16) |
((pixel & 0xFF00)) |
((pixel & 0xFF0000) >> 16);
}
 
/* convert a colour value to a 32bpp pixel value ready for screen output */
static inline uint32_t colour_to_pixel(UNUSED nsfb_t *nsfb, nsfb_colour_t c)
{
return ((c & 0xff0000) >> 16) | (c & 0xff00) | ((c & 0xff) << 16);
}
//#endif
 
#define PLOT_TYPE uint32_t
#define PLOT_LINELEN(ll) ((ll) >> 2)
 
#include "32bpp-common.c"
 
const nsfb_plotter_fns_t _nsfb_32bpp_xrgb8888_plotters = {
.line = line,
.fill = fill,
.point = point,
.bitmap = bitmap,
.glyph8 = glyph8,
.glyph1 = glyph1,
.readrect = readrect,
};
 
/*
* Local Variables:
* c-basic-offset:8
* End:
*/
/contrib/network/netsurf/libnsfb/src/plot/8bpp.c
0,0 → 1,86
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
* Copyright 2010 Michael Drake <tlsa@netsurf-browser.org>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
#include <stdbool.h>
#include <endian.h>
#include <stdlib.h>
#include <string.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_plot_util.h"
 
#include "nsfb.h"
#include "palette.h"
#include "plot.h"
 
static inline uint8_t *get_xy_loc(nsfb_t *nsfb, int x, int y)
{
return (uint8_t *)(nsfb->ptr + (y * nsfb->linelen) + (x));
}
 
 
static inline nsfb_colour_t pixel_to_colour(nsfb_t *nsfb, uint8_t pixel)
{
if (nsfb->palette == NULL)
return 0;
 
return nsfb->palette->data[pixel];
}
 
static uint8_t colour_to_pixel(nsfb_t *nsfb, nsfb_colour_t c)
{
if (nsfb->palette == NULL)
return 0;
 
return nsfb_palette_best_match_dither(nsfb->palette, c);
}
 
#define PLOT_TYPE uint8_t
#define PLOT_LINELEN(ll) (ll)
 
#include "common.c"
 
static bool fill(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t c)
{
int y;
uint8_t ent;
uint8_t *pvideo;
 
if (!nsfb_plot_clip_ctx(nsfb, rect))
return true; /* fill lies outside current clipping region */
 
pvideo = get_xy_loc(nsfb, rect->x0, rect->y0);
 
ent = colour_to_pixel(nsfb, c);
 
for (y = rect->y0; y < rect->y1; y++) {
memset(pvideo, ent, rect->x1 - rect->x0);
pvideo += nsfb->linelen;
}
 
return true;
}
 
const nsfb_plotter_fns_t _nsfb_8bpp_plotters = {
.line = line,
.fill = fill,
.point = point,
.bitmap = bitmap,
.glyph8 = glyph8,
.glyph1 = glyph1,
.readrect = readrect,
};
 
 
/*
* Local Variables:
* c-basic-offset:8
* End:
*/
/contrib/network/netsurf/libnsfb/src/plot/Makefile
0,0 → 1,7
# Sources
OBJS := api.o util.o generic.o 32bpp-xrgb8888.o 32bpp-xbgr8888.o 16bpp.o 8bpp.o
 
OUTFILE = libo.o
 
CFLAGS += -I ../../include/ -I ../../ -I ../ -I ./ -I /home/sourcerer/kos_src/newenginek/kolibri/include
include $(MENUETDEV)/makefiles/Makefile_for_o_lib
/contrib/network/netsurf/libnsfb/src/plot/api.c
0,0 → 1,213
/* public plotter interface */
 
#include <stdbool.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
 
#include "nsfb.h"
#include "plot.h"
 
/** Sets a clip rectangle for subsequent plots.
*
* Sets a clipping area which constrains all subsequent plotting operations.
* The clipping area must lie within the framebuffer visible screen or false
* will be returned and the new clipping area not set.
*/
bool nsfb_plot_set_clip(nsfb_t *nsfb, nsfb_bbox_t *clip)
{
return nsfb->plotter_fns->set_clip(nsfb, clip);
}
 
/** Get the previously set clipping region.
*/
bool nsfb_plot_get_clip(nsfb_t *nsfb, nsfb_bbox_t *clip)
{
return nsfb->plotter_fns->get_clip(nsfb, clip);
}
 
/** Clears plotting area to a flat colour.
*/
bool nsfb_plot_clg(nsfb_t *nsfb, nsfb_colour_t c)
{
return nsfb->plotter_fns->clg(nsfb, c);
}
 
/** Plots a rectangle outline.
*
* The line can be solid, dotted or dashed. Top left corner at (x0,y0) and
* rectangle has given width and height.
*/
bool
nsfb_plot_rectangle(nsfb_t *nsfb,
nsfb_bbox_t *rect,
int line_width,
nsfb_colour_t c,
bool dotted,
bool dashed)
{
return nsfb->plotter_fns->rectangle(nsfb, rect, line_width, c, dotted, dashed);
 
}
 
/** Plots a filled rectangle. Top left corner at (x0,y0), bottom
* right corner at (x1,y1). Note: (x0,y0) is inside filled area,
* but (x1,y1) is below and to the right. See diagram below.
*/
bool nsfb_plot_rectangle_fill(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t c)
{
return nsfb->plotter_fns->fill(nsfb, rect, c);
}
 
/** Plots a line.
*
* Draw a line from (x0,y0) to (x1,y1). Coordinates are at centre of line
* width/thickness.
*/
bool nsfb_plot_line(nsfb_t *nsfb, nsfb_bbox_t *line, nsfb_plot_pen_t *pen)
{
return nsfb->plotter_fns->line(nsfb, 1, line, pen);
}
 
/** Plots more than one line.
*
* Draw a line from (x0,y0) to (x1,y1). Coordinates are at centre of line
* width/thickness.
*/
bool nsfb_plot_lines(nsfb_t *nsfb, int linec, nsfb_bbox_t *line, nsfb_plot_pen_t *pen)
{
return nsfb->plotter_fns->line(nsfb, linec, line, pen);
}
 
bool nsfb_plot_polylines(nsfb_t *nsfb, int pointc, const nsfb_point_t *points, nsfb_plot_pen_t *pen)
{
return nsfb->plotter_fns->polylines(nsfb, pointc, points, pen);
}
 
/** Plots a filled polygon.
*
* Plots a filled polygon with straight lines between points. The lines around
* the edge of the ploygon are not plotted. The polygon is filled with a
* non-zero winding rule.
*
*
*/
bool nsfb_plot_polygon(nsfb_t *nsfb, const int *p, unsigned int n, nsfb_colour_t fill)
{
return nsfb->plotter_fns->polygon(nsfb, p, n, fill);
}
 
/** Plots an arc.
*
* around (x,y), from anticlockwise from angle1 to angle2. Angles are measured
* anticlockwise from horizontal, in degrees.
*/
bool nsfb_plot_arc(nsfb_t *nsfb, int x, int y, int radius, int angle1, int angle2, nsfb_colour_t c)
{
return nsfb->plotter_fns->arc(nsfb, x, y, radius, angle1, angle2, c);
}
 
/** Plots an alpha blended pixel.
*
* plots an alpha blended pixel.
*/
bool nsfb_plot_point(nsfb_t *nsfb, int x, int y, nsfb_colour_t c)
{
return nsfb->plotter_fns->point(nsfb, x, y, c);
}
 
bool nsfb_plot_ellipse(nsfb_t *nsfb, nsfb_bbox_t *ellipse, nsfb_colour_t c)
{
return nsfb->plotter_fns->ellipse(nsfb, ellipse, c);
}
 
bool nsfb_plot_ellipse_fill(nsfb_t *nsfb, nsfb_bbox_t *ellipse, nsfb_colour_t c)
{
return nsfb->plotter_fns->ellipse_fill(nsfb, ellipse, c);
}
 
/* copy an area of surface from one location to another.
*
* @warning This implementation is woefully incomplete!
*/
bool
nsfb_plot_copy(nsfb_t *srcfb,
nsfb_bbox_t *srcbox,
nsfb_t *dstfb,
nsfb_bbox_t *dstbox)
{
bool trans = false;
nsfb_colour_t srccol;
 
if (srcfb == dstfb) {
return dstfb->plotter_fns->copy(srcfb, srcbox, dstbox);
}
 
if (srcfb->format == NSFB_FMT_ABGR8888) {
trans = true;
}
 
if ((srcfb->width == 1) && (srcfb->height == 1)) {
srccol = *(nsfb_colour_t *)(void *)(srcfb->ptr);
/* check for completely transparent */
if ((srccol & 0xff000000) == 0)
return true;
 
/* completely opaque pixels can be replaced with fill */
if ((srccol & 0xff000000) == 0xff)
return dstfb->plotter_fns->fill(dstfb, dstbox, srccol);
}
 
return dstfb->plotter_fns->bitmap(dstfb, dstbox, (const nsfb_colour_t *)(void *)srcfb->ptr, srcfb->width, srcfb->height, (srcfb->linelen * 8) / srcfb->bpp, trans);
}
 
bool nsfb_plot_bitmap(nsfb_t *nsfb, const nsfb_bbox_t *loc, const nsfb_colour_t *pixel, int bmp_width, int bmp_height, int bmp_stride, bool alpha)
{
return nsfb->plotter_fns->bitmap(nsfb, loc, pixel, bmp_width, bmp_height, bmp_stride, alpha);
}
 
/** Plot an 8 bit glyph.
*/
bool nsfb_plot_glyph8(nsfb_t *nsfb, nsfb_bbox_t *loc, const uint8_t *pixel, int pitch, nsfb_colour_t c)
{
return nsfb->plotter_fns->glyph8(nsfb, loc, pixel, pitch, c);
}
 
 
/** Plot an 1 bit glyph.
*/
bool nsfb_plot_glyph1(nsfb_t *nsfb, nsfb_bbox_t *loc, const uint8_t *pixel, int pitch, nsfb_colour_t c)
{
return nsfb->plotter_fns->glyph1(nsfb, loc, pixel, pitch, c);
}
 
/* read a rectangle from screen into buffer */
bool nsfb_plot_readrect(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t *buffer)
{
return nsfb->plotter_fns->readrect(nsfb, rect, buffer);
}
 
 
bool nsfb_plot_cubic_bezier(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsfb_point_t *ctrlb, nsfb_plot_pen_t *pen)
{
return nsfb->plotter_fns->cubic(nsfb, curve, ctrla, ctrlb, pen);
}
 
bool nsfb_plot_quadratic_bezier(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsfb_plot_pen_t *pen)
{
return nsfb->plotter_fns->quadratic(nsfb, curve, ctrla, pen);
}
 
bool nsfb_plot_path(nsfb_t *nsfb, int pathc, nsfb_plot_pathop_t *pathop, nsfb_plot_pen_t *pen)
{
return nsfb->plotter_fns->path(nsfb, pathc, pathop, pen);
}
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/src/plot/common.c
0,0 → 1,515
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
* Copyright 2010 Michael Drake <tlsa@netsurf-browser.org>
*
* Plot code common to all bpp just with differing types
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
#ifndef PLOT_TYPE
#error PLOT_TYPE must be set to uint8_t, uint16_t, or uint32_t
#endif
#ifndef PLOT_LINELEN
#error PLOT_LINELEN must be a macro to increment a line length
#endif
 
#include "palette.h"
 
#define SIGN(x) ((x<0) ? -1 : ((x>0) ? 1 : 0))
 
static bool
line(nsfb_t *nsfb, int linec, nsfb_bbox_t *line, nsfb_plot_pen_t *pen)
{
int w;
PLOT_TYPE ent;
PLOT_TYPE *pvideo;
int x, y, i;
int dx, dy, sdy;
int dxabs, dyabs;
 
ent = colour_to_pixel(nsfb, pen->stroke_colour);
 
for (;linec > 0; linec--) {
 
if (line->y0 == line->y1) {
/* horizontal line special cased */
 
if (!nsfb_plot_clip_ctx(nsfb, line)) {
/* line outside clipping */
line++;
continue;
}
 
pvideo = get_xy_loc(nsfb, line->x0, line->y0);
 
w = line->x1 - line->x0;
while (w-- > 0)
*(pvideo + w) = ent;
 
} else {
/* standard bresenham line */
 
if (!nsfb_plot_clip_line_ctx(nsfb, line)) {
/* line outside clipping */
line++;
continue;
}
 
/* the horizontal distance of the line */
dx = line->x1 - line->x0;
dxabs = abs (dx);
 
/* the vertical distance of the line */
dy = line->y1 - line->y0;
dyabs = abs (dy);
 
sdy = dx ? SIGN(dy) * SIGN(dx) : SIGN(dy);
 
if (dx >= 0)
pvideo = get_xy_loc(nsfb, line->x0, line->y0);
else
pvideo = get_xy_loc(nsfb, line->x1, line->y1);
 
x = dyabs >> 1;
y = dxabs >> 1;
 
if (dxabs >= dyabs) {
/* the line is more horizontal than vertical */
for (i = 0; i < dxabs; i++) {
*pvideo = ent;
 
pvideo++;
y += dyabs;
if (y >= dxabs) {
y -= dxabs;
pvideo += sdy * PLOT_LINELEN(nsfb->linelen);
}
}
} else {
/* the line is more vertical than horizontal */
for (i = 0; i < dyabs; i++) {
*pvideo = ent;
pvideo += sdy * PLOT_LINELEN(nsfb->linelen);
 
x += dxabs;
if (x >= dyabs) {
x -= dyabs;
pvideo++;
}
}
}
 
}
line++;
}
return true;
}
 
 
static bool point(nsfb_t *nsfb, int x, int y, nsfb_colour_t c)
{
PLOT_TYPE *pvideo;
 
/* check point lies within clipping region */
if ((x < nsfb->clip.x0) ||
(x >= nsfb->clip.x1) ||
(y < nsfb->clip.y0) ||
(y >= nsfb->clip.y1))
return true;
 
pvideo = get_xy_loc(nsfb, x, y);
 
if ((c & 0xFF000000) != 0) {
if ((c & 0xFF000000) != 0xFF000000) {
c = nsfb_plot_ablend(c, pixel_to_colour(nsfb, *pvideo));
}
 
*pvideo = colour_to_pixel(nsfb, c);
}
return true;
}
 
static bool
glyph1(nsfb_t *nsfb,
nsfb_bbox_t *loc,
const uint8_t *pixel,
int pitch,
nsfb_colour_t c)
{
PLOT_TYPE *pvideo;
PLOT_TYPE const *pvideo_limit;
PLOT_TYPE fgcol;
int xloop;
int xoff, yoff; /* x and y offset into image */
int x = loc->x0;
int y = loc->y0;
int width;
int height;
const size_t line_len = PLOT_LINELEN(nsfb->linelen);
const int first_col = 1 << (loc->x1 - loc->x0 - 1);
const uint8_t *row;
 
if (!nsfb_plot_clip_ctx(nsfb, loc))
return true;
 
height = loc->y1 - y;
width = loc->x1 - x;
 
xoff = loc->x0 - x;
yoff = loc->y0 - y;
 
fgcol = colour_to_pixel(nsfb, c);
 
pitch >>= 3; /* bits to bytes */
 
pvideo = get_xy_loc(nsfb, x, loc->y0);
pvideo_limit = pvideo + line_len * (height - yoff);
row = pixel + yoff * pitch;
 
for (; pvideo < pvideo_limit; pvideo += line_len) {
for (xloop = xoff; xloop < width; xloop++) {
 
if ((*row & (first_col >> xloop)) != 0) {
*(pvideo + xloop) = fgcol;
}
}
row += pitch;
}
 
return true;
}
 
static bool
glyph8(nsfb_t *nsfb,
nsfb_bbox_t *loc,
const uint8_t *pixel,
int pitch,
nsfb_colour_t c)
{
PLOT_TYPE *pvideo;
nsfb_colour_t fgcol;
nsfb_colour_t abpixel; /* alphablended pixel */
int xloop, yloop;
int xoff, yoff; /* x and y offset into image */
int x = loc->x0;
int y = loc->y0;
int width;
int height;
 
if (!nsfb_plot_clip_ctx(nsfb, loc))
return true;
 
height = (loc->y1 - loc->y0);
width = (loc->x1 - loc->x0);
 
xoff = loc->x0 - x;
yoff = loc->y0 - y;
 
pvideo = get_xy_loc(nsfb, loc->x0, loc->y0);
 
fgcol = c & 0xFFFFFF;
 
for (yloop = 0; yloop < height; yloop++) {
for (xloop = 0; xloop < width; xloop++) {
abpixel = (pixel[((yoff + yloop) * pitch) + xloop + xoff] << 24) | fgcol;
if ((abpixel & 0xFF000000) != 0) {
/* pixel is not transparent */
if ((abpixel & 0xFF000000) != 0xFF000000) {
abpixel = nsfb_plot_ablend(abpixel,
pixel_to_colour(nsfb, *(pvideo + xloop)));
}
 
*(pvideo + xloop) = colour_to_pixel(nsfb, abpixel);
}
}
pvideo += PLOT_LINELEN(nsfb->linelen);
}
 
return true;
}
 
static bool bitmap_scaled(nsfb_t *nsfb, const nsfb_bbox_t *loc,
const nsfb_colour_t *pixel, int bmp_width, int bmp_height,
int bmp_stride, bool alpha)
{
PLOT_TYPE *pvideo;
PLOT_TYPE *pvideo_limit;
nsfb_colour_t abpixel; /* alphablended pixel */
int xloop;
int xoff, yoff, xoffs; /* x and y offsets into image */
int x = loc->x0;
int y = loc->y0;
int width = loc->x1 - loc->x0; /* size to scale to */
int height = loc->y1 - loc->y0; /* size to scale to */
int rheight, rwidth; /* post-clipping render area dimensions */
int dx, dy; /* scale factor (integer part) */
int dxr, dyr; /* scale factor (remainder) */
int rx, ry, rxs; /* remainder trackers */
nsfb_bbox_t clipped; /* clipped display */
 
/* The part of the scaled image actually displayed is cropped to the
* current context. */
clipped.x0 = x;
clipped.y0 = y;
clipped.x1 = x + width;
clipped.y1 = y + height;
 
if (!nsfb_plot_clip_ctx(nsfb, &clipped))
return true;
 
/* get height of rendering region, after clipping */
if (height > (clipped.y1 - clipped.y0))
rheight = (clipped.y1 - clipped.y0);
else
rheight = height;
 
/* get width of rendering region, after clipping */
if (width > (clipped.x1 - clipped.x0))
rwidth = (clipped.x1 - clipped.x0);
else
rwidth = width;
 
if (nsfb->palette != NULL) {
nsfb_palette_dither_init(nsfb->palette, rwidth);
}
 
/* get veritcal (y) and horizontal (x) scale factors; both integer
* part and remainder */
dx = bmp_width / width;
dy = (bmp_height / height) * bmp_stride;
dxr = bmp_width % width;
dyr = bmp_height % height;
 
/* get start offsets to part of image being scaled, after clipping and
* set remainder trackers to correct starting value */
if (clipped.x0 - x != 0) {
xoffs = ((clipped.x0 - x) * bmp_width) / width;
rxs = ((clipped.x0 - x) * bmp_width) % width;
} else {
xoffs = 0;
rxs = 0;
}
if (clipped.y0 - y != 0) {
yoff = (((clipped.y0 - y) * bmp_height) / height) * bmp_stride;
ry = ((clipped.y0 - y) * bmp_height) % height;
} else {
yoff = 0;
ry = 0;
}
 
/* plot the image */
pvideo = get_xy_loc(nsfb, clipped.x0, clipped.y0);
pvideo_limit = pvideo + PLOT_LINELEN(nsfb->linelen) * rheight;
if (alpha) {
for (; pvideo < pvideo_limit;
pvideo += PLOT_LINELEN(nsfb->linelen)) {
/* looping through render area vertically */
xoff = xoffs;
rx = rxs;
for (xloop = 0; xloop < rwidth; xloop++) {
/* looping through render area horizontally */
/* get value of source pixel in question */
abpixel = pixel[yoff + xoff];
if ((abpixel & 0xFF000000) != 0) {
/* pixel is not transparent; have to
* plot something */
if ((abpixel & 0xFF000000) !=
0xFF000000) {
/* pixel is not opaque; need to
* blend */
abpixel = nsfb_plot_ablend(
abpixel,
pixel_to_colour(
nsfb,
*(pvideo +
xloop)));
}
/* plot pixel */
*(pvideo + xloop) = colour_to_pixel(
nsfb, abpixel);
}
/* handle horizontal interpolation */
xoff += dx;
rx += dxr;
if (rx >= width) {
xoff++;
rx -= width;
}
}
/* handle vertical interpolation */
yoff += dy;
ry += dyr;
if (ry >= height) {
yoff += bmp_stride;
ry -= height;
}
}
} else {
for (; pvideo < pvideo_limit;
pvideo += PLOT_LINELEN(nsfb->linelen)) {
/* looping through render area vertically */
xoff = xoffs;
rx = rxs;
for (xloop = 0; xloop < rwidth; xloop++) {
/* looping through render area horizontally */
/* get value of source pixel in question */
abpixel = pixel[yoff + xoff];
/* plot pixel */
*(pvideo + xloop) = colour_to_pixel(
nsfb, abpixel);
 
/* handle horizontal interpolation */
xoff += dx;
rx += dxr;
if (rx >= width) {
xoff++;
rx -= width;
}
}
/* handle vertical interpolation */
yoff += dy;
ry += dyr;
if (ry >= height) {
yoff += bmp_stride;
ry -= height;
}
}
}
 
if (nsfb->palette != NULL) {
nsfb_palette_dither_fini(nsfb->palette);
}
 
return true;
}
 
static bool
bitmap(nsfb_t *nsfb,
const nsfb_bbox_t *loc,
const nsfb_colour_t *pixel,
int bmp_width,
int bmp_height,
int bmp_stride,
bool alpha)
{
PLOT_TYPE *pvideo;
nsfb_colour_t abpixel; /* alphablended pixel */
int xloop, yloop;
int xoff, yoff; /* x and y offset into image */
int x = loc->x0;
int y = loc->y0;
int width = loc->x1 - loc->x0;
int height = loc->y1 - loc->y0;
nsfb_bbox_t clipped; /* clipped display */
 
if (width == 0 || height == 0)
return true;
 
/* Scaled bitmaps are handled by a separate function */
if (width != bmp_width || height != bmp_height)
return bitmap_scaled(nsfb, loc, pixel, bmp_width, bmp_height,
bmp_stride, alpha);
 
/* The part of the image actually displayed is cropped to the
* current context. */
clipped.x0 = x;
clipped.y0 = y;
clipped.x1 = x + width;
clipped.y1 = y + height;
 
if (!nsfb_plot_clip_ctx(nsfb, &clipped))
return true;
 
if (height > (clipped.y1 - clipped.y0))
height = (clipped.y1 - clipped.y0);
 
if (width > (clipped.x1 - clipped.x0))
width = (clipped.x1 - clipped.x0);
 
if (nsfb->palette != NULL) {
nsfb_palette_dither_init(nsfb->palette, width);
}
 
xoff = clipped.x0 - x;
yoff = (clipped.y0 - y) * bmp_stride;
height = height * bmp_stride + yoff;
 
/* plot the image */
pvideo = get_xy_loc(nsfb, clipped.x0, clipped.y0);
 
if (alpha) {
for (yloop = yoff; yloop < height; yloop += bmp_stride) {
for (xloop = 0; xloop < width; xloop++) {
abpixel = pixel[yloop + xloop + xoff];
if ((abpixel & 0xFF000000) != 0) {
/* pixel is not transparent; have to
* plot something */
if ((abpixel & 0xFF000000) !=
0xFF000000) {
/* pixel is not opaque; need to
* blend */
abpixel = nsfb_plot_ablend(
abpixel,
pixel_to_colour(
nsfb,
*(pvideo +
xloop)));
}
 
*(pvideo + xloop) = colour_to_pixel(
nsfb, abpixel);
}
}
pvideo += PLOT_LINELEN(nsfb->linelen);
}
} else {
for (yloop = yoff; yloop < height; yloop += bmp_stride) {
for (xloop = 0; xloop < width; xloop++) {
abpixel = pixel[yloop + xloop + xoff];
*(pvideo + xloop) = colour_to_pixel(
nsfb, abpixel);
}
pvideo += PLOT_LINELEN(nsfb->linelen);
}
}
 
if (nsfb->palette != NULL) {
nsfb_palette_dither_fini(nsfb->palette);
}
 
return true;
}
 
static bool readrect(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t *buffer)
{
PLOT_TYPE *pvideo;
int xloop, yloop;
int width;
 
if (!nsfb_plot_clip_ctx(nsfb, rect)) {
return true;
}
 
width = rect->x1 - rect->x0;
 
pvideo = get_xy_loc(nsfb, rect->x0, rect->y0);
 
for (yloop = rect->y0; yloop < rect->y1; yloop += 1) {
for (xloop = 0; xloop < width; xloop++) {
*buffer = pixel_to_colour(nsfb, *(pvideo + xloop));
buffer++;
}
pvideo += PLOT_LINELEN(nsfb->linelen);
}
return true;
}
 
 
/*
* Local Variables:
* c-basic-offset:8
* End:
*/
/contrib/network/netsurf/libnsfb/src/plot/generic.c
0,0 → 1,944
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
* Copyright 2009 Michael Drake <tlsa@netsurf-browser.org>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*/
 
/** \file
* generic plotter functions which are not depth dependant (implementation).
*/
 
#include <stdbool.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_plot_util.h"
 
#include "nsfb.h"
#include "plot.h"
#include "surface.h"
 
extern const nsfb_plotter_fns_t _nsfb_1bpp_plotters;
extern const nsfb_plotter_fns_t _nsfb_8bpp_plotters;
extern const nsfb_plotter_fns_t _nsfb_16bpp_plotters;
extern const nsfb_plotter_fns_t _nsfb_24bpp_plotters;
extern const nsfb_plotter_fns_t _nsfb_32bpp_xrgb8888_plotters;
extern const nsfb_plotter_fns_t _nsfb_32bpp_xbgr8888_plotters;
 
static bool set_clip(nsfb_t *nsfb, nsfb_bbox_t *clip)
{
nsfb_bbox_t fbarea;
 
/* screen area */
fbarea.x0 = 0;
fbarea.y0 = 0;
fbarea.x1 = nsfb->width;
fbarea.y1 = nsfb->height;
 
if (clip == NULL) {
nsfb->clip = fbarea;
} else {
if (!nsfb_plot_clip(&fbarea, clip))
return false;
 
nsfb->clip = *clip;
}
return true;
}
 
static bool get_clip(nsfb_t *nsfb, nsfb_bbox_t *clip)
{
*clip = nsfb->clip;
return true;
}
 
static bool clg(nsfb_t *nsfb, nsfb_colour_t c)
{
return nsfb->plotter_fns->fill(nsfb, &nsfb->clip, c);
}
 
/**
* Establish whether there is any value in a line's crossing.
* (Helper function for find_span().)
*
* \param x x coordinate of intersection
* \param y current y level
* \param x0 line start coordinate
* \param y0 line start coordinate
* \param x1 line end coordinate
* \param y1 line end coordinate
* \return true if crossing has value
*
* + | | /
* / | |/
* y level -- ----/---- ----+---- ----+---- ----+----
* / / /|
* + / / |
*
* (a) (b) (c) (d)
*
*
* Figure (a) values: 1 = 1 -- Odd -- Valid crossing
* Figure (b) values: 0 + 1 = 1 -- Odd -- Valid crossing
* Figure (c) values: 1 + 1 = 2 -- Even -- Not valid crossing
* Figure (d) values: 0 + 0 = 0 -- Even -- Not valid crossing
*
* Vertices are shared between consecutive lines. This function ensures that
* the vertex point is only counted as a crossing for one of the lines by
* only considering crossings of the top vertex. This is what NetSurf's
* plotter API expects.
*
* It's up to the client to call this function for both lines and check the
* evenness of the total.
*/
static bool establish_crossing_value(int x, int y, int x0, int y0,
int x1, int y1)
{
bool v1 = (x == x0 && y == y0); /* whether we're crossing 1st vertex */
bool v2 = (x == x1 && y == y1); /* whether we're crossing 2nd vertex */
 
if ((v1 && (y0 < y1)) || (v2 && (y1 < y0))) {
/* crossing top vertex */
return true;
} else if (!v1 && !v2) {
/* Intersection with current y level is not at a vertex.
* Normal crossing. */
return true;
}
return false;
}
 
 
/**
* Find first filled span along horizontal line at given coordinate
*
* \param p array of polygon vertices (x1, y1, x2, y2, ... , xN, yN)
* \param n number of polygon vertex values (N * 2)
* \param x current position along current scan line
* \param y position of current scan line
* \param x0 updated to start of filled area
* \param x1 updated to end of filled area
* \return true if an intersection was found
*/
static bool find_span(const int *p, int n, int x, int y, int *x0, int *x1)
{
int i;
int p_x0, p_y0;
int p_x1, p_y1;
int x0_min, x1_min;
int x_new;
unsigned int x0c, x1c; /* counters for crossings at span end points */
bool crossing_value;
bool found_span_start = false;
 
x0_min = x1_min = INT_MIN;
x0c = x1c = 0;
*x0 = *x1 = INT_MAX;
 
/* search row for next span, returning it if one exists */
do {
/* reset endpoint info, if valid span endpoints not found */
if (!found_span_start)
*x0 = INT_MAX;
*x1 = INT_MAX;
 
/* search all lines in polygon */
for (i = 0; i < n; i = i + 2) {
/* get line endpoints */
if (i != n - 2) {
/* not the last line */
p_x0 = p[i]; p_y0 = p[i + 1];
p_x1 = p[i + 2]; p_y1 = p[i + 3];
} else {
/* last line; 2nd endpoint is first vertex */
p_x0 = p[i]; p_y0 = p[i + 1];
p_x1 = p[0]; p_y1 = p[1];
}
/* ignore horizontal lines */
if (p_y0 == p_y1)
continue;
 
/* ignore lines that don't cross this y level */
if ((y < p_y0 && y < p_y1) || (y > p_y0 && y > p_y1))
continue;
 
if (p_x0 == p_x1) {
/* vertical line, x is constant */
x_new = p_x0;
} else {
/* find crossing (intersection of this line and
* current y level) */
int num = (y - p_y0) * (p_x1 - p_x0);
int den = (p_y1 - p_y0);
 
/* To round to nearest (rather than down)
* half the denominator is either added to
* or subtracted from the numerator,
* depending on whether the numerator and
* denominator have the same sign. */
num = ((num < 0) == (den < 0)) ?
num + (den / 2) :
num - (den / 2);
x_new = p_x0 + num / den;
}
 
/* ignore crossings before current x */
if (x_new < x ||
(!found_span_start && x_new < x0_min) ||
(found_span_start && x_new < x1_min))
continue;
 
crossing_value = establish_crossing_value(x_new, y,
p_x0, p_y0, p_x1, p_y1);
 
 
/* set nearest intersections as filled area endpoints */
if (!found_span_start &&
x_new < *x0 && crossing_value) {
/* nearer than first endpoint */
*x1 = *x0;
x1c = x0c;
*x0 = x_new;
x0c = 1;
} else if (!found_span_start &&
x_new == *x0 && crossing_value) {
/* same as first endpoint */
x0c++;
} else if (x_new < *x1 && crossing_value) {
/* nearer than second endpoint */
*x1 = x_new;
x1c = 1;
} else if (x_new == *x1 && crossing_value) {
/* same as second endpoint */
x1c++;
}
}
/* check whether the span endpoints have been found */
if (!found_span_start && x0c % 2 == 1) {
/* valid fill start found */
found_span_start = true;
 
}
if (x1c % 2 == 1) {
/* valid fill endpoint found */
if (!found_span_start) {
/* not got a start yet; use this as start */
found_span_start = true;
x0c = x1c;
*x0 = *x1;
} else {
/* got valid end of span */
return true;
}
}
/* if current positions aren't valid endpoints, set new
* minimums after current positions */
if (!found_span_start)
x0_min = *x0 + 1;
x1_min = *x1 + 1;
 
} while (*x1 != INT_MAX);
 
/* no spans found */
return false;
}
 
 
/**
* Plot a polygon
*
* \param nsfb framebuffer context
* \param p array of polygon vertices (x1, y1, x2, y2, ... , xN, yN)
* \param n number of polygon vertices (N)
* \param c fill colour
* \return true if no errors
*/
static bool polygon(nsfb_t *nsfb, const int *p, unsigned int n, nsfb_colour_t c)
{
int poly_x0, poly_y0; /* Bounding box top left corner */
int poly_x1, poly_y1; /* Bounding box bottom right corner */
int i, j; /* indexes */
int x0, x1; /* filled span extents */
int y; /* current y coordinate */
int y_max; /* bottom of plot area */
nsfb_bbox_t fline;
nsfb_plot_pen_t pen;
 
/* find no. of vertex values */
int v = n * 2;
 
/* Can't plot polygons with 2 or fewer vertices */
if (n <= 2)
return true;
 
pen.stroke_colour = c;
 
/* Find polygon bounding box */
poly_x0 = poly_x1 = *p;
poly_y0 = poly_y1 = p[1];
for (i = 2; i < v; i = i + 2) {
j = i + 1;
if (p[i] < poly_x0)
poly_x0 = p[i];
else if (p[i] > poly_x1)
poly_x1 = p[i];
if (p[j] < poly_y0)
poly_y0 = p[j];
else if (p[j] > poly_y1)
poly_y1 = p[j];
}
 
/* Don't try to plot it if it's outside the clip rectangle */
if (nsfb->clip.y1 < poly_y0 ||
nsfb->clip.y0 > poly_y1 ||
nsfb->clip.x1 < poly_x0 ||
nsfb->clip.x0 > poly_x1)
return true;
 
/* Find the top of the important area */
if (poly_y0 > nsfb->clip.y0)
y = poly_y0;
else
y = nsfb->clip.y0;
 
/* Find the bottom of the important area */
if (poly_y1 < nsfb->clip.y1)
y_max = poly_y1;
else
y_max = nsfb->clip.y1;
 
for (; y < y_max; y++) {
x1 = poly_x0 - 1;
/* For each row */
while (find_span(p, v, x1 + 1, y, &x0, &x1)) {
/* don't draw anything outside clip region */
if (x1 < nsfb->clip.x0)
continue;
else if (x0 < nsfb->clip.x0)
x0 = nsfb->clip.x0;
if (x0 > nsfb->clip.x1)
break;
else if (x1 > nsfb->clip.x1)
x1 = nsfb->clip.x1;
 
fline.x0 = x0;
fline.y0 = y;
fline.x1 = x1;
fline.y1 = y;
 
/* draw this filled span on current row */
nsfb->plotter_fns->line(nsfb, 1, &fline, &pen);
 
/* don't look for more spans if already at end of clip
* region or polygon */
if (x1 == nsfb->clip.x1 || x1 == poly_x1)
break;
}
}
return true;
}
 
static bool
rectangle(nsfb_t *nsfb, nsfb_bbox_t *rect,
int line_width, nsfb_colour_t c,
bool dotted, bool dashed)
{
nsfb_bbox_t side[4];
nsfb_plot_pen_t pen;
 
pen.stroke_colour = c;
pen.stroke_width = line_width;
if (dotted || dashed) {
pen.stroke_type = NFSB_PLOT_OPTYPE_PATTERN;
} else {
pen.stroke_type = NFSB_PLOT_OPTYPE_SOLID;
}
 
side[0] = *rect;
side[1] = *rect;
side[2] = *rect;
side[3] = *rect;
 
side[0].y1 = side[0].y0;
side[1].y0 = side[1].y1;
side[2].x1 = side[2].x0;
side[3].x0 = side[3].x1;
 
return nsfb->plotter_fns->line(nsfb, 4, side, &pen);
}
 
/* plotter routine for ellipse points */
static void
ellipsepoints(nsfb_t *nsfb, int cx, int cy, int x, int y, nsfb_colour_t c)
{
nsfb->plotter_fns->point(nsfb, cx + x, cy + y, c);
nsfb->plotter_fns->point(nsfb, cx - x, cy + y, c);
nsfb->plotter_fns->point(nsfb, cx + x, cy - y, c);
nsfb->plotter_fns->point(nsfb, cx - x, cy - y, c);
}
 
static void
ellipsefill(nsfb_t *nsfb, int cx, int cy, int x, int y, nsfb_colour_t c)
{
nsfb_bbox_t fline[2];
nsfb_plot_pen_t pen;
 
pen.stroke_colour = c;
 
fline[0].x0 = fline[1].x0 = cx - x;
fline[0].x1 = fline[1].x1 = cx + x;
fline[0].y0 = fline[0].y1 = cy + y;
fline[1].y0 = fline[1].y1 = cy - y;
 
nsfb->plotter_fns->line(nsfb, 2, fline, &pen);
 
}
 
#define ROUND(a) ((int)(a+0.5))
 
static bool
ellipse_midpoint(nsfb_t *nsfb,
int cx,
int cy,
int rx,
int ry,
nsfb_colour_t c,
void (ellipsefn)(nsfb_t *nsfb, int cx, int cy, int x, int y, nsfb_colour_t c))
{
int rx2 = rx * rx;
int ry2 = ry * ry;
int tworx2 = 2 * rx2;
int twory2 = 2 * ry2;
int p;
int x = 0;
int y = ry;
int px = 0;
int py = tworx2 * y;
 
ellipsefn(nsfb, cx, cy, x, y, c);
 
/* region 1 */
p = ROUND(ry2 - (rx2 * ry) + (0.25 * rx2));
while (px < py) {
x++;
px += twory2;
if (p <0) {
p+=ry2 + px;
} else {
y--;
py -= tworx2;
p+=ry2 + px - py;
}
ellipsefn(nsfb, cx, cy, x, y, c);
}
 
/* region 2 */
p = ROUND(ry2*(x+0.5)*(x+0.5) + rx2*(y-1)*(y-1) - rx2*ry2);
while (y > 0) {
y--;
py -= tworx2;
if (p > 0) {
p+=rx2 - py;
} else {
x++;
px += twory2;
p+=rx2 - py + px;
}
ellipsefn(nsfb, cx, cy, x, y, c);
}
return true;
}
 
 
/* plotter routine for 8way circle symetry */
static void
circlepoints(nsfb_t *nsfb, int cx, int cy, int x, int y, nsfb_colour_t c)
{
nsfb->plotter_fns->point(nsfb, cx + x, cy + y, c);
nsfb->plotter_fns->point(nsfb, cx - x, cy + y, c);
nsfb->plotter_fns->point(nsfb, cx + x, cy - y, c);
nsfb->plotter_fns->point(nsfb, cx - x, cy - y, c);
nsfb->plotter_fns->point(nsfb, cx + y, cy + x, c);
nsfb->plotter_fns->point(nsfb, cx - y, cy + x, c);
nsfb->plotter_fns->point(nsfb, cx + y, cy - x, c);
nsfb->plotter_fns->point(nsfb, cx - y, cy - x, c);
}
 
static void
circlefill(nsfb_t *nsfb, int cx, int cy, int x, int y, nsfb_colour_t c)
{
nsfb_bbox_t fline[4];
nsfb_plot_pen_t pen;
 
pen.stroke_colour = c;
 
fline[0].x0 = fline[1].x0 = cx - x;
fline[0].x1 = fline[1].x1 = cx + x;
fline[0].y0 = fline[0].y1 = cy + y;
fline[1].y0 = fline[1].y1 = cy - y;
 
fline[2].x0 = fline[3].x0 = cx - y;
fline[2].x1 = fline[3].x1 = cx + y;
fline[2].y0 = fline[2].y1 = cy + x;
fline[3].y0 = fline[3].y1 = cy - x;
 
nsfb->plotter_fns->line(nsfb, 4, fline, &pen);
}
 
static bool circle_midpoint(nsfb_t *nsfb,
int cx,
int cy,
int r,
nsfb_colour_t c,
void (circfn)(nsfb_t *nsfb, int cx, int cy, int x, int y, nsfb_colour_t c))
{
int x = 0;
int y = r;
int p = 1 - r;
 
circfn(nsfb, cx, cy, x, y, c);
while (x < y) {
x++;
if (p < 0) {
p += 2 * x + 1;
} else {
y--;
p += 2 * (x - y) + 1;
}
circfn(nsfb, cx, cy, x, y, c);
}
return true;
}
 
static bool ellipse(nsfb_t *nsfb, nsfb_bbox_t *ellipse, nsfb_colour_t c)
{
int width = (ellipse->x1 - ellipse->x0)>>1;
int height = (ellipse->y1 - ellipse->y0)>>1;
 
if (width == height) {
/* circle */
return circle_midpoint(nsfb, ellipse->x0 + width, ellipse->y0 + height, width, c, circlepoints);
} else {
return ellipse_midpoint(nsfb, ellipse->x0 + width, ellipse->y0 + height, width, height, c, ellipsepoints);
}
}
 
static bool ellipse_fill(nsfb_t *nsfb, nsfb_bbox_t *ellipse, nsfb_colour_t c)
{
int width = (ellipse->x1 - ellipse->x0) >> 1;
int height = (ellipse->y1 - ellipse->y0) >> 1;
 
if (width == height) {
/* circle */
return circle_midpoint(nsfb, ellipse->x0 + width, ellipse->y0 + height, width, c, circlefill);
} else {
return ellipse_midpoint(nsfb, ellipse->x0 + width, ellipse->y0 + height, width, height, c, ellipsefill);
}
}
 
 
 
/* copy an area of surface from one location to another.
*
* @warning This implementation is woefully incomplete!
*/
static bool
copy(nsfb_t *nsfb, nsfb_bbox_t *srcbox, nsfb_bbox_t *dstbox)
{
int srcx = srcbox->x0;
int srcy = srcbox->y0;
int dstx = dstbox->x0;
int dsty = dstbox->y0;
int width = dstbox->x1 - dstbox->x0;
int height = dstbox->y1 - dstbox->y0;
uint8_t *srcptr;
uint8_t *dstptr;
int hloop;
nsfb_bbox_t allbox;
 
nsfb_plot_add_rect(srcbox, dstbox, &allbox);
 
nsfb->surface_rtns->claim(nsfb, &allbox);
 
srcptr = (nsfb->ptr +
(srcy * nsfb->linelen) +
((srcx * nsfb->bpp) / 8));
 
dstptr = (nsfb->ptr +
(dsty * nsfb->linelen) +
((dstx * nsfb->bpp) / 8));
 
 
if (width == nsfb->width) {
/* take shortcut and use memmove */
memmove(dstptr, srcptr, (width * height * nsfb->bpp) / 8);
} else {
if (srcy > dsty) {
for (hloop = height; hloop > 0; hloop--) {
memmove(dstptr, srcptr, (width * nsfb->bpp) / 8);
srcptr += nsfb->linelen;
dstptr += nsfb->linelen;
}
} else {
srcptr += height * nsfb->linelen;
dstptr += height * nsfb->linelen;
for (hloop = height; hloop > 0; hloop--) {
srcptr -= nsfb->linelen;
dstptr -= nsfb->linelen;
memmove(dstptr, srcptr, (width * nsfb->bpp) / 8);
}
}
}
 
nsfb->surface_rtns->update(nsfb, dstbox);
 
return true;
}
 
 
 
static bool arc(nsfb_t *nsfb, int x, int y, int radius, int angle1, int angle2, nsfb_colour_t c)
{
nsfb=nsfb;
x = x;
y = y;
radius = radius;
c = c;
angle1=angle1;
angle2=angle2;
return true;
}
 
#define N_SEG 30
 
static int
cubic_points(unsigned int pointc,
nsfb_point_t *point,
nsfb_bbox_t *curve,
nsfb_point_t *ctrla,
nsfb_point_t *ctrlb)
{
unsigned int seg_loop;
double t;
double one_minus_t;
double a;
double b;
double c;
double d;
double x;
double y;
int cur_point;
 
point[0].x = curve->x0;
point[0].y = curve->y0;
cur_point = 1;
pointc--;
 
for (seg_loop = 1; seg_loop < pointc; ++seg_loop) {
t = (double)seg_loop / (double)pointc;
 
one_minus_t = 1.0 - t;
 
a = one_minus_t * one_minus_t * one_minus_t;
b = 3.0 * t * one_minus_t * one_minus_t;
c = 3.0 * t * t * one_minus_t;
d = t * t * t;
 
x = a * curve->x0 + b * ctrla->x + c * ctrlb->x + d * curve->x1;
y = a * curve->y0 + b * ctrla->y + c * ctrlb->y + d * curve->y1;
 
point[cur_point].x = x;
point[cur_point].y = y;
if ((point[cur_point].x != point[cur_point - 1].x) ||
(point[cur_point].y != point[cur_point - 1].y))
cur_point++;
}
 
point[cur_point].x = curve->x1;
point[cur_point].y = curve->y1;
if ((point[cur_point].x != point[cur_point - 1].x) ||
(point[cur_point].y != point[cur_point - 1].y))
cur_point++;
 
return cur_point;
}
 
/* calculate a series of points which describe a quadratic bezier spline.
*
* fills an array of points with values describing a quadratic curve. Both the
* start and end points are included as the first and last points
* respectively. Only if the next point on the curve is different from its
* predecessor is the point added which ensures points for the same position
* are not repeated.
*/
static int
quadratic_points(unsigned int pointc,
nsfb_point_t *point,
nsfb_bbox_t *curve,
nsfb_point_t *ctrla)
{
unsigned int seg_loop;
double t;
double one_minus_t;
double a;
double b;
double c;
double x;
double y;
int cur_point;
 
point[0].x = curve->x0;
point[0].y = curve->y0;
cur_point = 1;
pointc--; /* we have added the start point, one less point in the curve */
 
for (seg_loop = 1; seg_loop < pointc; ++seg_loop) {
t = (double)seg_loop / (double)pointc;
 
one_minus_t = 1.0 - t;
 
a = one_minus_t * one_minus_t;
b = 2.0 * t * one_minus_t;
c = t * t;
 
x = a * curve->x0 + b * ctrla->x + c * curve->x1;
y = a * curve->y0 + b * ctrla->y + c * curve->y1;
 
point[cur_point].x = x;
point[cur_point].y = y;
if ((point[cur_point].x != point[cur_point - 1].x) ||
(point[cur_point].y != point[cur_point - 1].y))
cur_point++;
}
 
point[cur_point].x = curve->x1;
point[cur_point].y = curve->y1;
if ((point[cur_point].x != point[cur_point - 1].x) ||
(point[cur_point].y != point[cur_point - 1].y))
cur_point++;
 
return cur_point;
}
 
static bool
polylines(nsfb_t *nsfb,
int pointc,
const nsfb_point_t *points,
nsfb_plot_pen_t *pen)
{
int point_loop;
nsfb_bbox_t line;
 
if (pen->stroke_type != NFSB_PLOT_OPTYPE_NONE) {
for (point_loop = 0; point_loop < (pointc - 1); point_loop++) {
line = *(nsfb_bbox_t *)&points[point_loop];
nsfb->plotter_fns->line(nsfb, 1, &line, pen);
}
}
return true;
}
 
 
 
static bool
quadratic(nsfb_t *nsfb,
nsfb_bbox_t *curve,
nsfb_point_t *ctrla,
nsfb_plot_pen_t *pen)
{
nsfb_point_t points[N_SEG];
 
if (pen->stroke_type == NFSB_PLOT_OPTYPE_NONE)
return false;
 
return polylines(nsfb, quadratic_points(N_SEG, points, curve, ctrla), points, pen);
}
 
static bool
cubic(nsfb_t *nsfb,
nsfb_bbox_t *curve,
nsfb_point_t *ctrla,
nsfb_point_t *ctrlb,
nsfb_plot_pen_t *pen)
{
nsfb_point_t points[N_SEG];
 
if (pen->stroke_type == NFSB_PLOT_OPTYPE_NONE)
return false;
 
return polylines(nsfb, cubic_points(N_SEG, points, curve, ctrla,ctrlb), points, pen);
}
 
 
static bool
path(nsfb_t *nsfb, int pathc, nsfb_plot_pathop_t *pathop, nsfb_plot_pen_t *pen)
{
int path_loop;
nsfb_point_t *pts;
nsfb_point_t *curpt;
int ptc = 0;
nsfb_bbox_t curve;
nsfb_point_t ctrla;
nsfb_point_t ctrlb;
int added_count = 0;
int bpts;
 
/* count the verticies in the path and add N_SEG extra for curves */
for (path_loop = 0; path_loop < pathc; path_loop++) {
ptc++;
if ((pathop[path_loop].operation == NFSB_PLOT_PATHOP_QUAD) ||
(pathop[path_loop].operation == NFSB_PLOT_PATHOP_CUBIC))
ptc += N_SEG;
}
 
/* allocate storage for the vertexes */
curpt = pts = malloc(ptc * sizeof(nsfb_point_t));
 
for (path_loop = 0; path_loop < pathc; path_loop++) {
switch (pathop[path_loop].operation) {
case NFSB_PLOT_PATHOP_QUAD:
curpt-=2;
added_count -= 2;
curve.x0 = pathop[path_loop - 2].point.x;
curve.y0 = pathop[path_loop - 2].point.y;
ctrla.x = pathop[path_loop - 1].point.x;
ctrla.y = pathop[path_loop - 1].point.y;
curve.x1 = pathop[path_loop].point.x;
curve.y1 = pathop[path_loop].point.y;
bpts = quadratic_points(N_SEG, curpt, &curve, &ctrla);
curpt += bpts;
added_count += bpts;
break;
 
case NFSB_PLOT_PATHOP_CUBIC:
curpt-=3;
added_count -=3;
curve.x0 = pathop[path_loop - 3].point.x;
curve.y0 = pathop[path_loop - 3].point.y;
ctrla.x = pathop[path_loop - 2].point.x;
ctrla.y = pathop[path_loop - 2].point.y;
ctrlb.x = pathop[path_loop - 1].point.x;
ctrlb.y = pathop[path_loop - 1].point.y;
curve.x1 = pathop[path_loop].point.x;
curve.y1 = pathop[path_loop].point.y;
bpts = cubic_points(N_SEG, curpt, &curve, &ctrla, &ctrlb);
curpt += bpts;
added_count += bpts;
break;
 
default:
*curpt = pathop[path_loop].point;
curpt++;
added_count ++;
break;
}
}
 
if (pen->fill_type != NFSB_PLOT_OPTYPE_NONE) {
polygon(nsfb, (int *)pts, added_count, pen->fill_colour);
}
 
if (pen->stroke_type != NFSB_PLOT_OPTYPE_NONE) {
polylines(nsfb, added_count, pts, pen);
}
 
free(pts);
 
return true;
}
 
bool select_plotters(nsfb_t *nsfb)
{
const nsfb_plotter_fns_t *table = NULL;
 
switch (nsfb->format) {
 
case NSFB_FMT_XBGR8888: /* 32bpp Unused Blue Green Red */
case NSFB_FMT_ABGR8888: /* 32bpp Alpha Blue Green Red */
table = &_nsfb_32bpp_xbgr8888_plotters;
nsfb->bpp = 32;
break;
 
case NSFB_FMT_XRGB8888: /* 32bpp Unused Red Green Blue */
case NSFB_FMT_ARGB8888: /* 32bpp Alpha Red Green Blue */
table = &_nsfb_32bpp_xrgb8888_plotters;
nsfb->bpp = 32;
break;
 
 
case NSFB_FMT_RGB888: /* 24 bpp Alpha Red Green Blue */
#ifdef ENABLE_24_BPP
table = &_nsfb_24bpp_plotters;
nsfb->bpp = 24;
break;
#else
return false;
#endif
 
case NSFB_FMT_ARGB1555: /* 16 bpp 555 */
case NSFB_FMT_RGB565: /* 16 bpp 565 */
table = &_nsfb_16bpp_plotters;
nsfb->bpp = 16;
break;
 
case NSFB_FMT_I8: /* 8bpp indexed */
table = &_nsfb_8bpp_plotters;
nsfb->bpp = 8;
break;
 
case NSFB_FMT_I1: /* black and white */
#ifdef ENABLE_1_BPP
table = &_nsfb_1bpp_plotters;
nsfb->bpp = 1
break;
#else
return false;
#endif
 
case NSFB_FMT_ANY: /* No specific format - use surface default */
default:
return false;
}
 
if (nsfb->plotter_fns != NULL)
free(nsfb->plotter_fns);
 
nsfb->plotter_fns = calloc(1, sizeof(nsfb_plotter_fns_t));
memcpy(nsfb->plotter_fns, table, sizeof(nsfb_plotter_fns_t));
 
/* set the generics */
nsfb->plotter_fns->clg = clg;
nsfb->plotter_fns->set_clip = set_clip;
nsfb->plotter_fns->get_clip = get_clip;
nsfb->plotter_fns->polygon = polygon;
nsfb->plotter_fns->rectangle = rectangle;
nsfb->plotter_fns->ellipse = ellipse;
nsfb->plotter_fns->ellipse_fill = ellipse_fill;
nsfb->plotter_fns->copy = copy;
nsfb->plotter_fns->arc = arc;
nsfb->plotter_fns->quadratic = quadratic;
nsfb->plotter_fns->cubic = cubic;
nsfb->plotter_fns->path = path;
nsfb->plotter_fns->polylines = polylines;
 
/* set default clip rectangle to size of framebuffer */
nsfb->clip.x0 = 0;
nsfb->clip.y0 = 0;
nsfb->clip.x1 = nsfb->width;
nsfb->clip.y1 = nsfb->height;
 
return true;
}
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/src/plot/util.c
0,0 → 1,201
#include <stdbool.h>
 
#define NULL 0
#include "palette.h"
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_plot_util.h"
 
#include "nsfb.h"
 
enum {
POINT_LEFTOF_REGION = 1,
POINT_RIGHTOF_REGION = 2,
POINT_ABOVE_REGION = 4,
POINT_BELOW_REGION = 8,
};
 
#define REGION(x,y,cx1,cx2,cy1,cy2) \
( ( (y) > (cy2) ? POINT_BELOW_REGION : 0) | \
( (y) < (cy1) ? POINT_ABOVE_REGION : 0) | \
( (x) > (cx2) ? POINT_RIGHTOF_REGION : 0) | \
( (x) < (cx1) ? POINT_LEFTOF_REGION : 0) )
 
#define SWAP(a, b) do { int t; t=(a); (a)=(b); (b)=t; } while(0)
 
/* clip a rectangle with another clipping rectangle.
*
* @param clip The rectangle to clip to.
* @param rect The rectangle to clip.
* @return false if the \a rect lies completely outside the \a clip rectangle,
* true if some of the \a rect is still visible.
*/
bool
nsfb_plot_clip(const nsfb_bbox_t * clip, nsfb_bbox_t * rect)
{
char region1;
char region2;
 
if (rect->x1 < rect->x0) SWAP(rect->x0, rect->x1);
 
if (rect->y1 < rect->y0) SWAP(rect->y0, rect->y1);
 
region1 = REGION(rect->x0, rect->y0, clip->x0, clip->x1 - 1, clip->y0, clip->y1 - 1);
region2 = REGION(rect->x1, rect->y1, clip->x0, clip->x1 - 1, clip->y0, clip->y1 - 1);
 
/* area lies entirely outside the clipping rectangle */
if ((region1 | region2) && (region1 & region2))
return false;
 
if (rect->x0 < clip->x0)
rect->x0 = clip->x0;
if (rect->x0 > clip->x1)
rect->x0 = clip->x1;
 
if (rect->x1 < clip->x0)
rect->x1 = clip->x0;
if (rect->x1 > clip->x1)
rect->x1 = clip->x1;
 
if (rect->y0 < clip->y0)
rect->y0 = clip->y0;
if (rect->y0 > clip->y1)
rect->y0 = clip->y1;
 
if (rect->y1 < clip->y0)
rect->y1 = clip->y0;
if (rect->y1 > clip->y1)
rect->y1 = clip->y1;
 
return true;
}
 
bool
nsfb_plot_clip_ctx(nsfb_t *nsfb, nsfb_bbox_t * rect)
{
return nsfb_plot_clip(&nsfb->clip, rect);
}
 
/** Clip a line to a bounding box.
*/
bool nsfb_plot_clip_line(const nsfb_bbox_t *clip, nsfb_bbox_t * line)
{
char region1;
char region2;
region1 = REGION(line->x0, line->y0, clip->x0, clip->x1 - 1, clip->y0, clip->y1 - 1);
region2 = REGION(line->x1, line->y1, clip->x0, clip->x1 - 1, clip->y0, clip->y1 - 1);
 
while (region1 | region2) {
if (region1 & region2) {
/* line lies entirely outside the clipping rectangle */
return false;
}
 
if (region1) {
/* first point */
if (region1 & POINT_BELOW_REGION) {
/* divide line at bottom */
line->x0 = (line->x0 + (line->x1 - line->x0) *
(clip->y1 - 1 - line->y0) / (line->y1 - line->y0));
line->y0 = clip->y1 - 1;
} else if (region1 & POINT_ABOVE_REGION) {
/* divide line at top */
line->x0 = (line->x0 + (line->x1 - line->x0) *
(clip->y0 - line->y0) / (line->y1 - line->y0));
line->y0 = clip->y0;
} else if (region1 & POINT_RIGHTOF_REGION) {
/* divide line at right */
line->y0 = (line->y0 + (line->y1 - line->y0) *
(clip->x1 - 1 - line->x0) / (line->x1 - line->x0));
line->x0 = clip->x1 - 1;
} else if (region1 & POINT_LEFTOF_REGION) {
/* divide line at right */
line->y0 = (line->y0 + (line->y1 - line->y0) *
(clip->x0 - line->x0) / (line->x1 - line->x0));
line->x0 = clip->x0;
}
 
region1 = REGION(line->x0, line->y0, clip->x0, clip->x1 - 1, clip->y0, clip->y1 - 1);
} else {
/* second point */
if (region2 & POINT_BELOW_REGION) {
/* divide line at bottom*/
line->x1 = (line->x0 + (line->x1 - line->x0) *
(clip->y1 - 1 - line->y0) / (line->y1 - line->y0));
line->y1 = clip->y1 - 1;
} else if (region2 & POINT_ABOVE_REGION) {
/* divide line at top*/
line->x1 = (line->x0 + (line->x1 - line->x0) *
(clip->y0 - line->y0) / (line->y1 - line->y0));
line->y1 = clip->y0;
} else if (region2 & POINT_RIGHTOF_REGION) {
/* divide line at right*/
line->y1 = (line->y0 + (line->y1 - line->y0) *
(clip->x1 - 1 - line->x0) / (line->x1 - line->x0));
line->x1 = clip->x1 - 1;
} else if (region2 & POINT_LEFTOF_REGION) {
/* divide line at right*/
line->y1 = (line->y0 + (line->y1 - line->y0) *
(clip->x0 - line->x0) / (line->x1 - line->x0));
line->x1 = clip->x0;
}
 
region2 = REGION(line->x1, line->y1, clip->x0, clip->x1 - 1, clip->y0, clip->y1 - 1);
}
}
 
return true;
}
 
bool nsfb_plot_clip_line_ctx(nsfb_t *nsfb, nsfb_bbox_t * line)
{
return nsfb_plot_clip_line(&nsfb->clip, line);
}
 
/* documented in libnsfb_plot_util.h */
bool
nsfb_plot_add_rect(const nsfb_bbox_t *box1, const nsfb_bbox_t *box2, nsfb_bbox_t *result)
{
/* lower x coordinate */
if (box1->x0 < box2->x0)
result->x0 = box1->x0;
else
result->x0 = box2->x0;
 
/* lower y coordinate */
if (box1->y0 < box2->y0)
result->y0 = box1->y0;
else
result->y0 = box2->y0;
 
/* upper x coordinate */
if (box1->x1 > box2->x1)
result->x1 = box1->x1;
else
result->x1 = box2->x1;
 
/* upper y coordinate */
if (box1->y1 > box2->y1)
result->y1 = box1->y1;
else
result->y1 = box2->y1;
 
return true;
}
 
bool nsfb_plot_bbox_intersect(const nsfb_bbox_t *box1, const nsfb_bbox_t *box2)
{
if (box2->x1 < box1->x0)
return false;
 
if (box2->y1 < box1->y0)
return false;
 
if (box2->x0 > box1->x1)
return false;
 
if (box2->y0 > box1->y1)
return false;
 
return true;
}
/contrib/network/netsurf/libnsfb/include/libnsfb.h
0,0 → 1,161
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*
* This is the exported interface for the libnsfb graphics library.
*/
 
#ifndef _LIBNSFB_H
#define _LIBNSFB_H 1
 
#include <stdint.h>
 
typedef struct nsfb_palette_s nsfb_palette_t;
typedef struct nsfb_cursor_s nsfb_cursor_t;
typedef struct nsfb_s nsfb_t;
typedef struct nsfb_event_s nsfb_event_t;
 
/** co-ordinate for plotting operations */
typedef struct nsfb_point_s {
int x;
int y;
} nsfb_point_t;
 
/** bounding box for plotting operations */
typedef struct nsfb_bbox_s {
int x0;
int y0;
int x1;
int y1;
} nsfb_bbox_t;
 
/** The type of framebuffer surface. */
enum nsfb_type_e {
NSFB_SURFACE_NONE = 0, /**< No surface */
NSFB_SURFACE_RAM, /**< RAM surface */
NSFB_SURFACE_SDL, /**< SDL surface */
NSFB_SURFACE_LINUX, /**< Linux framebuffer surface */
NSFB_SURFACE_VNC, /**< VNC surface */
NSFB_SURFACE_ABLE, /**< ABLE framebuffer surface */
NSFB_SURFACE_X, /**< X windows surface */
NSFB_SURFACE_KOLIBRI
};
 
enum nsfb_format_e {
NSFB_FMT_ANY = 0, /* No specific format - use surface default */
NSFB_FMT_XBGR8888, /* 32bpp Blue Green Red */
NSFB_FMT_XRGB8888, /* 32bpp Red Green Blue */
NSFB_FMT_ABGR8888, /* 32bpp Alpga Blue Green Red */
NSFB_FMT_ARGB8888, /* 32bpp Alpga Red Green Blue */
NSFB_FMT_RGB888, /* 24 bpp Alpga Red Green Blue */
NSFB_FMT_ARGB1555, /* 16 bpp 555 */
NSFB_FMT_RGB565, /* 16 bpp 565 */
NSFB_FMT_I8, /* 8bpp indexed */
NSFB_FMT_I4, /* 4bpp indexed */
NSFB_FMT_I1, /* black and white */
};
 
/** Select frontend type from a name.
*
* @param name The name to select a frontend.
* @return The surface type or NSFB_SURFACE_NONE if frontend with specified
* name was not available
*/
enum nsfb_type_e nsfb_type_from_name(const char *name);
 
/** Create a nsfb context.
*
* This creates a framebuffer surface context.
*
* @param surface_type The type of surface to create a context for.
*/
nsfb_t *nsfb_new(const enum nsfb_type_e surface_type);
 
/** Initialise selected surface context.
*
* @param nsfb The context returned from ::nsfb_init
*/
int nsfb_init(nsfb_t *nsfb);
 
/** Free nsfb context.
*
* This shuts down and releases all resources associated with an nsfb context.
*
* @param nsfb The context returned from ::nsfb_new to free
*/
int nsfb_free(nsfb_t *nsfb);
 
/** Claim an area of screen to be redrawn.
*
* Informs the nsfb library that an area of screen will be directly
* updated by the user program. This is neccisarry so the library can
* ensure the soft cursor plotting is correctly handled. After the
* update has been perfomed ::nsfb_update should be called.
*
* @param box The bounding box of the area which might be altered.
*/
int nsfb_claim(nsfb_t *nsfb, nsfb_bbox_t *box);
 
/** Update an area of screen which has been redrawn.
*
* Informs the nsfb library that an area of screen has been directly
* updated by the user program. Some surfaces only show the update on
* notification. The area updated does not neccisarrily have to
* corelate with a previous ::nsfb_claim bounding box, however if the
* redrawn area is larger than the claimed area pointer plotting
* artifacts may occour.
*
* @param box The bounding box of the area which has been altered.
*/
int nsfb_update(nsfb_t *nsfb, nsfb_bbox_t *box);
 
/** Obtain the geometry of a nsfb context.
*
* @param width a variable to store the framebuffer width in or NULL
* @param height a variable to store the framebuffer height in or NULL
* @param format a variable to store the framebuffer format in or NULL
*/
int nsfb_get_geometry(nsfb_t *nsfb, int *width, int *height, enum nsfb_format_e *format);
 
/** Alter the geometry of a surface
*
* @param nsfb The context to alter.
* @param width The new display width.
* @param height The new display height.
* @param format The desired surface format.
*/
int nsfb_set_geometry(nsfb_t *nsfb, int width, int height, enum nsfb_format_e format);
 
/** Set parameters a surface
*
* Some surface types can take additional parameters for
* attributes. For example the linux surface uses this to allow the
* setting of a different output device
*
* @param nsfb The surface to alter.
* @param parameters The parameters for the surface.
*/
int nsfb_set_parameters(nsfb_t *nsfb, const char *parameters);
 
/** Obtain the buffer memory base and stride.
*
* @param nsfb The context to read.
*/
int nsfb_get_buffer(nsfb_t *nsfb, uint8_t **ptr, int *linelen);
 
/** Dump the surface to fd in PPM format
*/
bool nsfb_dump(nsfb_t *nsfb, int fd);
 
 
#endif
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/include/cursor.h
0,0 → 1,41
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*
* This is the *internal* interface for the cursor.
*/
 
#ifndef CURSOR_H
#define CURSOR_H 1
 
struct nsfb_cursor_s {
bool plotted;
nsfb_bbox_t loc;
 
/* current cursor image */
const nsfb_colour_t *pixel;
int bmp_width;
int bmp_height;
int bmp_stride;
int hotspot_x;
int hotspot_y;
 
/* current saved image */
nsfb_bbox_t savloc;
nsfb_colour_t *sav;
int sav_size;
int sav_width;
int sav_height;
 
};
 
/** Plot the cursor saving the image underneath. */
bool nsfb_cursor_plot(nsfb_t *nsfb, struct nsfb_cursor_s *cursor);
 
/** Clear the cursor restoring the image underneath */
bool nsfb_cursor_clear(nsfb_t *nsfb, struct nsfb_cursor_s *cursor);
 
#endif /* CURSOR_H */
/contrib/network/netsurf/libnsfb/include/libnsfb_cursor.h
0,0 → 1,48
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*
* This is the exported interface for the libnsfb graphics library.
*/
 
#ifndef _LIBNSFB_CURSOR_H
#define _LIBNSFB_CURSOR_H 1
 
/** Initialise the cursor.
*/
bool nsfb_cursor_init(nsfb_t *nsfb);
 
/** Set cursor parameters.
*
* Set a cursor bitmap, the cursor will be shown at the location set by
* nsfb_cursor_loc_set. The pixel data may be referenced untill the cursor
* is altered or cleared
*
* @param nsfb The frambuffer context
* @param pixel The cursor bitmap data
* @param bmp_width The width of the cursor bitmap
* @param bmp_height The height of the cursor bitmap
* @param bmp_stride The cursor bitmap's row stride
* @param hotspot_x Coordinate within cursor image to place over cursor loc
* @param hotspot_y Coordinate within cursor image to place over cursor loc
*
* (hot_spot_x, hot_spot_y) is from top left. (0, 0) means top left pixel of
* cursor bitmap is to be rendered over the cursor location.
*/
bool nsfb_cursor_set(nsfb_t *nsfb, const nsfb_colour_t *pixel, int bmp_width, int bmp_height, int bmp_stride, int hotspot_x, int hotspot_y);
 
/** Set cursor location.
*
* @param nsfb The frambuffer context.
* @param loc The location of the cursor
*/
bool nsfb_cursor_loc_set(nsfb_t *nsfb, const nsfb_bbox_t *loc);
 
/** get the cursor location */
bool nsfb_cursor_loc_get(nsfb_t *nsfb, nsfb_bbox_t *loc);
 
 
#endif
/contrib/network/netsurf/libnsfb/include/libnsfb_event.h
0,0 → 1,219
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*
* This is the exported interface for the libnsfb graphics library.
*/
 
#ifndef _LIBNSFB_EVENT_H
#define _LIBNSFB_EVENT_H 1
 
enum nsfb_event_type_e {
NSFB_EVENT_NONE,
NSFB_EVENT_CONTROL,
NSFB_EVENT_KEY_DOWN,
NSFB_EVENT_KEY_UP,
NSFB_EVENT_MOVE_RELATIVE,
NSFB_EVENT_MOVE_ABSOLUTE,
};
 
 
/** keycodes which mostly map to ascii chars */
enum nsfb_key_code_e {
NSFB_KEY_UNKNOWN = 0,
NSFB_KEY_BACKSPACE = 8,
NSFB_KEY_TAB = 9,
NSFB_KEY_LF = 10,
NSFB_KEY_CLEAR = 12,
NSFB_KEY_RETURN = 13,
NSFB_KEY_PAUSE = 19,
NSFB_KEY_ESCAPE = 27,
NSFB_KEY_SPACE = 32,
NSFB_KEY_EXCLAIM = 33,
NSFB_KEY_QUOTEDBL = 34,
NSFB_KEY_HASH = 35,
NSFB_KEY_DOLLAR = 36,
NSFB_KEY_AMPERSAND = 38,
NSFB_KEY_QUOTE = 39,
NSFB_KEY_LEFTPAREN = 40,
NSFB_KEY_RIGHTPAREN = 41,
NSFB_KEY_ASTERISK = 42,
NSFB_KEY_PLUS = 43,
NSFB_KEY_COMMA = 44,
NSFB_KEY_MINUS = 45,
NSFB_KEY_PERIOD = 46,
NSFB_KEY_SLASH = 47,
NSFB_KEY_0 = 48,
NSFB_KEY_1 = 49,
NSFB_KEY_2 = 50,
NSFB_KEY_3 = 51,
NSFB_KEY_4 = 52,
NSFB_KEY_5 = 53,
NSFB_KEY_6 = 54,
NSFB_KEY_7 = 55,
NSFB_KEY_8 = 56,
NSFB_KEY_9 = 57,
NSFB_KEY_COLON = 58,
NSFB_KEY_SEMICOLON = 59,
NSFB_KEY_LESS = 60,
NSFB_KEY_EQUALS = 61,
NSFB_KEY_GREATER = 62,
NSFB_KEY_QUESTION = 63,
NSFB_KEY_AT = 64,
NSFB_KEY_LEFTBRACKET = 91,
NSFB_KEY_BACKSLASH = 92,
NSFB_KEY_RIGHTBRACKET = 93,
NSFB_KEY_CARET = 94,
NSFB_KEY_UNDERSCORE = 95,
NSFB_KEY_BACKQUOTE = 96,
NSFB_KEY_a = 97,
NSFB_KEY_b = 98,
NSFB_KEY_c = 99,
NSFB_KEY_d = 100,
NSFB_KEY_e = 101,
NSFB_KEY_f = 102,
NSFB_KEY_g = 103,
NSFB_KEY_h = 104,
NSFB_KEY_i = 105,
NSFB_KEY_j = 106,
NSFB_KEY_k = 107,
NSFB_KEY_l = 108,
NSFB_KEY_m = 109,
NSFB_KEY_n = 110,
NSFB_KEY_o = 111,
NSFB_KEY_p = 112,
NSFB_KEY_q = 113,
NSFB_KEY_r = 114,
NSFB_KEY_s = 115,
NSFB_KEY_t = 116,
NSFB_KEY_u = 117,
NSFB_KEY_v = 118,
NSFB_KEY_w = 119,
NSFB_KEY_x = 120,
NSFB_KEY_y = 121,
NSFB_KEY_z = 122,
NSFB_KEY_DELETE = 127,
 
NSFB_KEY_KP0 = 256,
NSFB_KEY_KP1 = 257,
NSFB_KEY_KP2 = 258,
NSFB_KEY_KP3 = 259,
NSFB_KEY_KP4 = 260,
NSFB_KEY_KP5 = 261,
NSFB_KEY_KP6 = 262,
NSFB_KEY_KP7 = 263,
NSFB_KEY_KP8 = 264,
NSFB_KEY_KP9 = 265,
NSFB_KEY_KP_PERIOD = 266,
NSFB_KEY_KP_DIVIDE = 267,
NSFB_KEY_KP_MULTIPLY = 268,
NSFB_KEY_KP_MINUS = 269,
NSFB_KEY_KP_PLUS = 270,
NSFB_KEY_KP_ENTER = 271,
NSFB_KEY_KP_EQUALS = 272,
 
NSFB_KEY_UP = 273,
NSFB_KEY_DOWN = 274,
NSFB_KEY_RIGHT = 275,
NSFB_KEY_LEFT = 276,
NSFB_KEY_INSERT = 277,
NSFB_KEY_HOME = 278,
NSFB_KEY_END = 279,
NSFB_KEY_PAGEUP = 280,
NSFB_KEY_PAGEDOWN = 281,
 
/* Function keys */
NSFB_KEY_F1 = 282,
NSFB_KEY_F2 = 283,
NSFB_KEY_F3 = 284,
NSFB_KEY_F4 = 285,
NSFB_KEY_F5 = 286,
NSFB_KEY_F6 = 287,
NSFB_KEY_F7 = 288,
NSFB_KEY_F8 = 289,
NSFB_KEY_F9 = 290,
NSFB_KEY_F10 = 291,
NSFB_KEY_F11 = 292,
NSFB_KEY_F12 = 293,
NSFB_KEY_F13 = 294,
NSFB_KEY_F14 = 295,
NSFB_KEY_F15 = 296,
 
/* Key state modifier keys */
NSFB_KEY_NUMLOCK = 300,
NSFB_KEY_CAPSLOCK = 301,
NSFB_KEY_SCROLLOCK = 302,
NSFB_KEY_RSHIFT = 303,
NSFB_KEY_LSHIFT = 304,
NSFB_KEY_RCTRL = 305,
NSFB_KEY_LCTRL = 306,
NSFB_KEY_RALT = 307,
NSFB_KEY_LALT = 308,
NSFB_KEY_RMETA = 309,
NSFB_KEY_LMETA = 310,
NSFB_KEY_LSUPER = 311,
NSFB_KEY_RSUPER = 312,
NSFB_KEY_MODE = 313,
NSFB_KEY_COMPOSE = 314,
 
/* Miscellaneous function keys */
NSFB_KEY_HELP = 315,
NSFB_KEY_PRINT = 316,
NSFB_KEY_SYSREQ = 317,
NSFB_KEY_BREAK = 318,
NSFB_KEY_MENU = 319,
NSFB_KEY_POWER = 320,
NSFB_KEY_EURO = 321,
NSFB_KEY_UNDO = 322,
 
/* mouse buttons */
NSFB_KEY_MOUSE_1 = 401,
NSFB_KEY_MOUSE_2 = 402,
NSFB_KEY_MOUSE_3 = 403,
NSFB_KEY_MOUSE_4 = 404,
NSFB_KEY_MOUSE_5 = 405,
 
};
 
enum nsfb_control_e {
NSFB_CONTROL_NONE,
NSFB_CONTROL_TIMEOUT, /* timeout event */
NSFB_CONTROL_QUIT, /* surface handler quit event */
};
 
struct nsfb_event_s {
enum nsfb_event_type_e type;
union {
enum nsfb_key_code_e keycode;
enum nsfb_control_e controlcode;
struct {
int x;
int y;
int z;
} vector;
} value;
};
 
/** Process input events.
*
* Gather events from a frontend.
*
* @param nsfb The library handle.
* @param event The event structure to fill.
* @param timeout The number of milliseconds to wait for input, -1 is wait
* forever, 0 returns immediately.
* @return If the /a event structure is updated true else false.
*/
bool nsfb_event(nsfb_t *nsfb, nsfb_event_t *event, int timeout);
 
#endif
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/include/libnsfb_plot.h
0,0 → 1,169
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*
* This is the exported plotter interface for the libnsfb graphics library.
*/
 
#ifndef _LIBNSFB_PLOT_H
#define _LIBNSFB_PLOT_H 1
 
/** representation of a colour.
*
* The colour value comprises of four components arranged in the order ABGR:
* bits 24-31 are the alpha value and represent the opacity. 0 is
* transparent i.e. there would be no change in the target surface if
* this colour were to be used and 0xFF is opaque.
*
* bits 16-23 are the Blue component of the colour.
*
* bits 8-15 are the Green component of the colour.
*
* bits 0-7 are the Red component of the colour.
*/
typedef uint32_t nsfb_colour_t;
 
/**
* Type of plot operation
*/
typedef enum nsfb_plot_optype_e {
NFSB_PLOT_OPTYPE_NONE = 0, /**< No operation */
NFSB_PLOT_OPTYPE_SOLID, /**< Solid colour */
NFSB_PLOT_OPTYPE_PATTERN, /**< Pattern plot */
} nsfb_plot_optype_t;
 
/** pen colour and raster operation for plotting primatives. */
typedef struct nsfb_plot_pen_s {
nsfb_plot_optype_t stroke_type; /**< Stroke plot type */
int stroke_width; /**< Width of stroke, in pixels */
nsfb_colour_t stroke_colour; /**< Colour of stroke */
uint32_t stroke_pattern;
nsfb_plot_optype_t fill_type; /**< Fill plot type */
nsfb_colour_t fill_colour; /**< Colour of fill */
} nsfb_plot_pen_t;
 
/** path operation type. */
typedef enum nsfb_plot_pathop_type_e {
NFSB_PLOT_PATHOP_MOVE,
NFSB_PLOT_PATHOP_LINE,
NFSB_PLOT_PATHOP_QUAD,
NFSB_PLOT_PATHOP_CUBIC,
} nsfb_plot_pathop_type_t;
 
/** path element */
typedef struct nsfb_plot_pathop_s {
nsfb_plot_pathop_type_t operation;
nsfb_point_t point;
} nsfb_plot_pathop_t;
 
/** Sets a clip rectangle for subsequent plots.
*
* Sets a clipping area which constrains all subsequent plotting operations.
* The clipping area must lie within the framebuffer visible screen or false
* will be returned and the new clipping area not set.
*/
bool nsfb_plot_set_clip(nsfb_t *nsfb, nsfb_bbox_t *clip);
 
/** Get the previously set clipping region.
*/
bool nsfb_plot_get_clip(nsfb_t *nsfb, nsfb_bbox_t *clip);
 
/** Clears plotting area to a flat colour.
*/
bool nsfb_plot_clg(nsfb_t *nsfb, nsfb_colour_t c);
 
/** Plots a rectangle outline.
*
* The line can be solid, dotted or dashed. Top left corner at (x0,y0) and
* rectangle has given width and height.
*/
bool nsfb_plot_rectangle(nsfb_t *nsfb, nsfb_bbox_t *rect, int line_width, nsfb_colour_t c, bool dotted, bool dashed);
 
/** Plots a filled rectangle. Top left corner at (x0,y0), bottom
* right corner at (x1,y1). Note: (x0,y0) is inside filled area,
* but (x1,y1) is below and to the right. See diagram below.
*/
bool nsfb_plot_rectangle_fill(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t c);
 
/** Plots a line.
*
* Draw a line from (x0,y0) to (x1,y1). Coordinates are at centre of line
* width/thickness.
*/
bool nsfb_plot_line(nsfb_t *nsfb, nsfb_bbox_t *line, nsfb_plot_pen_t *pen);
 
/** Plots a number of lines.
*
* Draw a series of lines.
*/
bool nsfb_plot_lines(nsfb_t *nsfb, int linec, nsfb_bbox_t *line, nsfb_plot_pen_t *pen);
 
/** Plots a number of connected lines.
*
* Draw a series of connected lines.
*/
bool nsfb_plot_polylines(nsfb_t *nsfb, int pointc, const nsfb_point_t *points, nsfb_plot_pen_t *pen);
 
/** Plots a filled polygon.
*
* Plots a filled polygon with straight lines between points. The lines around
* the edge of the ploygon are not plotted. The polygon is filled with a
* non-zero winding rule.
*
*
*/
bool nsfb_plot_polygon(nsfb_t *nsfb, const int *p, unsigned int n, nsfb_colour_t fill);
 
/** Plot an ellipse.
*/
bool nsfb_plot_ellipse(nsfb_t *nsfb, nsfb_bbox_t *ellipse, nsfb_colour_t c);
 
/** Plot a filled ellipse.
*/
bool nsfb_plot_ellipse_fill(nsfb_t *nsfb, nsfb_bbox_t *ellipse, nsfb_colour_t c);
 
/** Plots an arc.
*
* around (x,y), from anticlockwise from angle1 to angle2. Angles are measured
* anticlockwise from horizontal, in degrees.
*/
bool nsfb_plot_arc(nsfb_t *nsfb, int x, int y, int radius, int angle1, int angle2, nsfb_colour_t c);
 
/** Plots an alpha blended pixel.
*
* plots an alpha blended pixel.
*/
bool nsfb_plot_point(nsfb_t *nsfb, int x, int y, nsfb_colour_t c);
 
bool nsfb_plot_cubic_bezier(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsfb_point_t *ctrlb, nsfb_plot_pen_t *pen);
 
bool nsfb_plot_quadratic_bezier(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsfb_plot_pen_t *pen);
 
bool nsfb_plot_path(nsfb_t *nsfb, int pathc, nsfb_plot_pathop_t *pathop, nsfb_plot_pen_t *pen);
 
/** copy an area of screen
*
* Copy an area of the display.
*/
bool nsfb_plot_copy(nsfb_t *srcfb, nsfb_bbox_t *srcbox, nsfb_t *dstfb, nsfb_bbox_t *dstbox);
 
/** Plot bitmap.
*/
bool nsfb_plot_bitmap(nsfb_t *nsfb, const nsfb_bbox_t *loc, const nsfb_colour_t *pixel, int bmp_width, int bmp_height, int bmp_stride, bool alpha);
 
/** Plot an 8 bit glyph.
*/
bool nsfb_plot_glyph8(nsfb_t *nsfb, nsfb_bbox_t *loc, const uint8_t *pixel, int pitch, nsfb_colour_t c);
 
 
/** Plot an 1 bit glyph.
*/
bool nsfb_plot_glyph1(nsfb_t *nsfb, nsfb_bbox_t *loc, const uint8_t *pixel, int pitch, nsfb_colour_t c);
 
/* read rectangle into buffer */
bool nsfb_plot_readrect(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t *buffer);
 
#endif /* _LIBNSFB_PLOT_H */
/contrib/network/netsurf/libnsfb/include/libnsfb_plot_util.h
0,0 → 1,48
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*
* This is the exported interface for the libnsfb graphics library.
*/
 
#ifndef _LIBNSFB_PLOT_UTIL_H
#define _LIBNSFB_PLOT_UTIL_H 1
 
 
/* alpha blend two pixels together */
static inline nsfb_colour_t
nsfb_plot_ablend(nsfb_colour_t pixel, nsfb_colour_t scrpixel)
{
int opacity = pixel >> 24;
int transp = 0x100 - opacity;
uint32_t rb, g;
 
rb = ((pixel & 0xFF00FF) * opacity +
(scrpixel & 0xFF00FF) * transp) >> 8;
g = ((pixel & 0x00FF00) * opacity +
(scrpixel & 0x00FF00) * transp) >> 8;
 
return (rb & 0xFF00FF) | (g & 0xFF00);
}
 
 
bool nsfb_plot_clip(const nsfb_bbox_t * clip, nsfb_bbox_t * rect);
 
bool nsfb_plot_clip_ctx(nsfb_t *nsfb, nsfb_bbox_t * rect);
 
bool nsfb_plot_clip_line(const nsfb_bbox_t * clip, nsfb_bbox_t * line);
 
bool nsfb_plot_clip_line_ctx(nsfb_t *nsfb, nsfb_bbox_t * line);
 
/** Obtain a bounding box which is the superset of two source boxes.
*
*/
bool nsfb_plot_add_rect(const nsfb_bbox_t *box1, const nsfb_bbox_t *box2, nsfb_bbox_t *result);
 
/** Find if two boxes intersect. */
bool nsfb_plot_bbox_intersect(const nsfb_bbox_t *box1, const nsfb_bbox_t *box2);
 
#endif /* _LIBNSFB_PLOT_UTIL_H */
/contrib/network/netsurf/libnsfb/include/nsfb.h
0,0 → 1,49
/*
* Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*
* This is the internal interface for the libnsfb graphics library.
*/
 
#ifndef _NSFB_H
#define _NSFB_H 1
 
#include <stdint.h>
 
 
/** NS Framebuffer context
*/
struct nsfb_s {
int width; /**< Visible width. */
int height; /**< Visible height. */
 
char *parameters;
 
enum nsfb_format_e format; /**< Framebuffer format */
int bpp; /**< Bits per pixel - distinct from format */
 
uint8_t *ptr; /**< Base of video memory. */
int linelen; /**< length of a video line. */
 
struct nsfb_palette_s *palette; /**< palette for index modes */
nsfb_cursor_t *cursor; /**< cursor */
 
struct nsfb_surface_rtns_s *surface_rtns; /**< surface routines. */
void *surface_priv; /**< surface opaque data. */
 
nsfb_bbox_t clip; /**< current clipping rectangle for plotters */
struct nsfb_plotter_fns_s *plotter_fns; /**< Plotter methods */
};
 
 
#endif
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/include/palette.h
0,0 → 1,231
/*
* Copyright 2012 Michael Drake <tlsa@netsurf-browser.org>
*
* This file is part of libnsfb, http://www.netsurf-browser.org/
* Licenced under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
*
* This is the *internal* interface for the cursor.
*/
 
#ifndef PALETTE_H
#define PALETTE_H 1
 
#include <stdint.h>
#include <limits.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
 
enum nsfb_palette_type_e {
NSFB_PALETTE_EMPTY, /**< empty palette object */
NSFB_PALETTE_NSFB_8BPP, /**< libnsfb's own 8bpp palette */
NSFB_PALETTE_OTHER /**< any other palette */
};
 
struct nsfb_palette_s {
enum nsfb_palette_type_e type; /**< Palette type */
uint8_t last; /**< Last used palette index */
nsfb_colour_t data[256]; /**< Palette for index modes */
 
bool dither; /**< Whether to use error diffusion */
struct {
int width; /**< Length of error value buffer ring*/
int current; /**< Current pos in ring buffer*/
int *data; /**< Ring buffer error values */
int data_len; /**< Max size of ring */
} dither_ctx;
};
 
 
/** Create an empty palette object. */
bool nsfb_palette_new(struct nsfb_palette_s **palette, int width);
 
/** Free a palette object. */
void nsfb_palette_free(struct nsfb_palette_s *palette);
 
/** Init error diffusion for a plot. */
void nsfb_palette_dither_init(struct nsfb_palette_s *palette, int width);
 
/** Finalise error diffusion after a plot. */
void nsfb_palette_dither_fini(struct nsfb_palette_s *palette);
 
/** Generate libnsfb 8bpp default palette. */
void nsfb_palette_generate_nsfb_8bpp(struct nsfb_palette_s *palette);
 
/** Find best palette match for given colour. */
static inline uint8_t nsfb_palette_best_match(struct nsfb_palette_s *palette,
nsfb_colour_t c, int *r_error, int *g_error, int *b_error)
{
uint8_t best_col = 0;
 
nsfb_colour_t palent;
int col;
int dr, dg, db; /* delta red, green blue values */
 
int cur_distance;
int best_distance = INT_MAX;
 
switch (palette->type) {
case NSFB_PALETTE_NSFB_8BPP:
/* Index into colour cube part */
dr = ((( c & 0xFF) * 5) + 128) / 256;
dg = ((((c >> 8) & 0xFF) * 7) + 128) / 256;
db = ((((c >> 16) & 0xFF) * 4) + 128) / 256;
col = 40 * dr + 5 * dg + db;
 
palent = palette->data[col];
dr = ( c & 0xFF) - ( palent & 0xFF);
dg = ((c >> 8) & 0xFF) - ((palent >> 8 ) & 0xFF);
db = ((c >> 16) & 0xFF) - ((palent >> 16) & 0xFF);
cur_distance = (dr * dr) + (dg * dg) + (db * db);
 
best_col = col;
best_distance = cur_distance;
*r_error = dr;
*g_error = dg;
*b_error = db;
 
/* Index into grayscale part */
col = (( c & 0xFF) +
((c >> 8) & 0xFF) +
((c >> 16) & 0xFF) + (45 / 2)) / (15 * 3) - 1 + 240;
palent = palette->data[col];
 
dr = ( c & 0xFF) - ( palent & 0xFF);
dg = ((c >> 8) & 0xFF) - ((palent >> 8) & 0xFF);
db = ((c >> 16) & 0xFF) - ((palent >> 16) & 0xFF);
cur_distance = (dr * dr) + (dg * dg) + (db * db);
if (cur_distance < best_distance) {
best_distance = cur_distance;
best_col = col;
*r_error = dr;
*g_error = dg;
*b_error = db;
}
break;
 
case NSFB_PALETTE_OTHER:
/* Try all colours in palette */
for (col = 0; col <= palette->last; col++) {
palent = palette->data[col];
 
dr = ( c & 0xFF) - ( palent & 0xFF);
dg = ((c >> 8) & 0xFF) - ((palent >> 8) & 0xFF);
db = ((c >> 16) & 0xFF) - ((palent >> 16) & 0xFF);
cur_distance = (dr * dr) + (dg * dg) + (db * db);
if (cur_distance < best_distance) {
best_distance = cur_distance;
best_col = col;
*r_error = dr;
*g_error = dg;
*b_error = db;
}
}
break;
 
default:
break;
}
 
return best_col;
}
 
/** Find best palette match for given colour, with error diffusion. */
static inline uint8_t nsfb_palette_best_match_dither(
struct nsfb_palette_s *palette, nsfb_colour_t c)
{
int r, g, b;
int current;
int error;
int width = palette->dither_ctx.width;
uint8_t best_col_index;
 
if (palette == NULL)
return 0;
 
if (palette->dither == false)
return nsfb_palette_best_match(palette, c, &r, &g, &b);
 
current = palette->dither_ctx.current;
 
/* Get RGB components of colour, and apply error */
r = ( c & 0xFF) + palette->dither_ctx.data[current ];
g = ((c >> 8) & 0xFF) + palette->dither_ctx.data[current + 1];
b = ((c >> 16) & 0xFF) + palette->dither_ctx.data[current + 2];
 
/* Clamp new RGB components to range */
if (r < 0) r = 0;
if (r > 255) r = 255;
if (g < 0) g = 0;
if (g > 255) g = 255;
if (b < 0) b = 0;
if (b > 255) b = 255;
 
/* Reset error diffusion slots to 0 */
palette->dither_ctx.data[current ] = 0;
palette->dither_ctx.data[current + 1] = 0;
palette->dither_ctx.data[current + 2] = 0;
 
/* Rebuild colour from modified components */
c = r + (g << 8) + (b << 16);
 
/* Get best match for pixel, and find errors for each component */
best_col_index = nsfb_palette_best_match(palette, c, &r, &g, &b);
 
/* Advance one set of error diffusion slots */
current += 3;
if (current >= width)
current = 0;
palette->dither_ctx.current = current;
 
/* Save errors
*
* [*]-[N]
* / | \
* [l]-[m]-[r]
*/
error = current;
 
/* Error for [N] (next) */
if (error != 0) {
/* The pixel exists */
palette->dither_ctx.data[error ] += r * 7 / 16;
palette->dither_ctx.data[error + 1] += g * 7 / 16;
palette->dither_ctx.data[error + 2] += b * 7 / 16;
}
 
error += width - 2 * 3;
if (error >= width)
error -= width;
/* Error for [l] (below, left) */
if (error >= 0 && error != 3) {
/* The pixel exists */
palette->dither_ctx.data[error ] += r * 3 / 16;
palette->dither_ctx.data[error + 1] += g * 3 / 16;
palette->dither_ctx.data[error + 2] += b * 3 / 16;
}
 
error += 3;
if (error >= width)
error -= width;
/* Error for [m] (below, middle) */
palette->dither_ctx.data[error ] += r * 5 / 16;
palette->dither_ctx.data[error + 1] += g * 5 / 16;
palette->dither_ctx.data[error + 2] += b * 5 / 16;
 
error += 3;
if (error >= width)
error -= width;
/* Error for [r] (below, right) */
if (error != 0) {
/* The pixel exists */
palette->dither_ctx.data[error ] += r / 16;
palette->dither_ctx.data[error + 1] += g / 16;
palette->dither_ctx.data[error + 2] += b / 16;
}
 
return best_col_index;
}
 
#endif /* PALETTE_H */
/contrib/network/netsurf/libnsfb/include/plot.h
0,0 → 1,124
 
 
/** Clears plotting area to a flat colour (if needed)
*/
typedef bool (nsfb_plotfn_clg_t)(nsfb_t *nsfb, nsfb_colour_t c);
 
/** Plots a rectangle outline. The line can be solid, dotted or
* dashed. Top left corner at (x0,y0) and rectangle has given
* width and height.
*/
typedef bool (nsfb_plotfn_rectangle_t)(nsfb_t *nsfb, nsfb_bbox_t *rect, int line_width, nsfb_colour_t c, bool dotted, bool dashed);
 
/** Plots a line using a given pen.
*/
typedef bool (nsfb_plotfn_line_t)(nsfb_t *nsfb, int linec, nsfb_bbox_t *line, nsfb_plot_pen_t *pen);
 
/** Plots a filled polygon with straight lines between points.
* The lines around the edge of the ploygon are not plotted. The
* polygon is filled with the non-zero winding rule.
*/
typedef bool (nsfb_plotfn_polygon_t)(nsfb_t *nsfb, const int *p, unsigned int n, nsfb_colour_t fill);
 
/** Plots a filled rectangle. Top left corner at (x0,y0), bottom
* right corner at (x1,y1). Note: (x0,y0) is inside filled area,
* but (x1,y1) is below and to the right. See diagram below.
*/
typedef bool (nsfb_plotfn_fill_t)(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t c);
 
/** Clipping operations.
*/
typedef bool (nsfb_plotfn_clip_t)(nsfb_t *nsfb, nsfb_bbox_t *clip);
 
/** Plots an arc, around (x,y), from anticlockwise from angle1 to
* angle2. Angles are measured anticlockwise from horizontal, in
* degrees.
*/
typedef bool (nsfb_plotfn_arc_t)(nsfb_t *nsfb, int x, int y, int radius, int angle1, int angle2, nsfb_colour_t c);
 
/** Plots a point.
*
* Plot a single alpha blended pixel.
*/
typedef bool (nsfb_plotfn_point_t)(nsfb_t *nsfb, int x, int y, nsfb_colour_t c);
 
/** Plot an ellipse.
*
* plot an ellipse outline, note if teh bounding box is square this will plot a
* circle.
*/
typedef bool (nsfb_plotfn_ellipse_t)(nsfb_t *nsfb, nsfb_bbox_t *ellipse, nsfb_colour_t c);
 
/** Plot a filled ellipse.
*
* plot a filled ellipse, note if the bounding box is square this will plot a
* circle.
*/
typedef bool (nsfb_plotfn_ellipse_fill_t)(nsfb_t *nsfb, nsfb_bbox_t *ellipse, nsfb_colour_t c);
 
 
/** Plot bitmap
*/
typedef bool (nsfb_plotfn_bitmap_t)(nsfb_t *nsfb, const nsfb_bbox_t *loc, const nsfb_colour_t *pixel, int bmp_width, int bmp_height, int bmp_stride, bool alpha);
 
 
/** Copy an area of screen
*
* Copy an area of the display.
*/
typedef bool (nsfb_plotfn_copy_t)(nsfb_t *nsfb, nsfb_bbox_t *srcbox, nsfb_bbox_t *dstbox);
 
 
/** Plot an 8 bit per pixel glyph.
*/
typedef bool (nsfb_plotfn_glyph8_t)(nsfb_t *nsfb, nsfb_bbox_t *loc, const uint8_t *pixel, int pitch, nsfb_colour_t c);
 
 
/** Plot an 1 bit per pixel glyph.
*/
typedef bool (nsfb_plotfn_glyph1_t)(nsfb_t *nsfb, nsfb_bbox_t *loc, const uint8_t *pixel, int pitch, nsfb_colour_t c);
 
/** Read rectangle of screen into buffer
*/
typedef bool (nsfb_plotfn_readrect_t)(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t *buffer);
 
/** Plot quadratic bezier spline
*/
typedef bool (nsfb_plotfn_quadratic_bezier_t)(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsfb_plot_pen_t *pen);
 
/** Plot cubic bezier spline
*/
typedef bool (nsfb_plotfn_cubic_bezier_t)(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsfb_point_t *ctrlb, nsfb_plot_pen_t *pen);
 
typedef bool (nsfb_plotfn_polylines_t)(nsfb_t *nsfb, int pointc, const nsfb_point_t *points, nsfb_plot_pen_t *pen);
 
/** plot path */
typedef bool (nsfb_plotfn_path_t)(nsfb_t *nsfb, int pathc, nsfb_plot_pathop_t *pathop, nsfb_plot_pen_t *pen);
 
/** plotter function table. */
typedef struct nsfb_plotter_fns_s {
nsfb_plotfn_clg_t *clg;
nsfb_plotfn_rectangle_t *rectangle;
nsfb_plotfn_line_t *line;
nsfb_plotfn_polygon_t *polygon;
nsfb_plotfn_fill_t *fill;
nsfb_plotfn_clip_t *get_clip;
nsfb_plotfn_clip_t *set_clip;
nsfb_plotfn_ellipse_t *ellipse;
nsfb_plotfn_ellipse_fill_t *ellipse_fill;
nsfb_plotfn_arc_t *arc;
nsfb_plotfn_bitmap_t *bitmap;
nsfb_plotfn_point_t *point;
nsfb_plotfn_copy_t *copy;
nsfb_plotfn_glyph8_t *glyph8;
nsfb_plotfn_glyph1_t *glyph1;
nsfb_plotfn_readrect_t *readrect;
nsfb_plotfn_quadratic_bezier_t *quadratic;
nsfb_plotfn_cubic_bezier_t *cubic;
nsfb_plotfn_path_t *path;
nsfb_plotfn_polylines_t *polylines;
} nsfb_plotter_fns_t;
 
 
bool select_plotters(nsfb_t *nsfb);
 
/contrib/network/netsurf/libnsfb/include/surface.h
0,0 → 1,65
/* libnsfb framebuffer surface support */
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "nsfb.h"
 
/* surface default options */
typedef int (nsfb_surfacefn_defaults_t)(nsfb_t *nsfb);
 
/* surface init */
typedef int (nsfb_surfacefn_init_t)(nsfb_t *nsfb);
 
/* surface finalise */
typedef int (nsfb_surfacefn_fini_t)(nsfb_t *nsfb);
 
/* surface set geometry */
typedef int (nsfb_surfacefn_geometry_t)(nsfb_t *nsfb, int width, int height, enum nsfb_format_e format);
 
/* surface set parameters */
typedef int (nsfb_surfacefn_parameters_t)(nsfb_t *nsfb, const char *parameters);
 
/* surface input */
typedef bool (nsfb_surfacefn_input_t)(nsfb_t *nsfb, nsfb_event_t *event, int timeout);
 
/* surface area claim */
typedef int (nsfb_surfacefn_claim_t)(nsfb_t *nsfb, nsfb_bbox_t *box);
 
/* surface area update */
typedef int (nsfb_surfacefn_update_t)(nsfb_t *nsfb, nsfb_bbox_t *box);
 
/* surface cursor display */
typedef int (nsfb_surfacefn_cursor_t)(nsfb_t *nsfb, struct nsfb_cursor_s *cursor);
 
typedef struct nsfb_surface_rtns_s {
nsfb_surfacefn_defaults_t *defaults;
nsfb_surfacefn_init_t *initialise;
nsfb_surfacefn_fini_t *finalise;
nsfb_surfacefn_geometry_t *geometry;
nsfb_surfacefn_parameters_t *parameters;
nsfb_surfacefn_input_t *input;
nsfb_surfacefn_claim_t *claim;
nsfb_surfacefn_update_t *update;
nsfb_surfacefn_cursor_t *cursor;
} nsfb_surface_rtns_t;
 
void _nsfb_register_surface(const enum nsfb_type_e type, const nsfb_surface_rtns_t *rtns, const char *name);
 
 
/* macro which adds a builtin command with no argument limits */
#define NSFB_SURFACE_DEF(__name, __type, __rtns) \
static void __name##_register_surface(void) __attribute__((constructor)); \
void __name##_register_surface(void) { \
_nsfb_register_surface(__type, __rtns, #__name); \
}
 
/** Obtain routines for a surface
*
* Obtain a vlist of methods for a surface type.
*
* @param type The surface type.
* @return A vtable of routines which teh caller must deallocate or
* NULL on error
*/
nsfb_surface_rtns_t *nsfb_surface_get_rtns(enum nsfb_type_e type);
 
/contrib/network/netsurf/libnsfb/.gitignore
0,0 → 1,2
build-*
 
/contrib/network/netsurf/libnsfb/Makefile
0,0 → 1,93
# Component settings
COMPONENT := nsfb
COMPONENT_VERSION := 0.0.2
# Default to a static library
COMPONENT_TYPE ?= lib-static
 
# Setup the tooling
PREFIX ?= /opt/netsurf
NSSHARED ?= $(PREFIX)/share/netsurf-buildsystem
include $(NSSHARED)/makefiles/Makefile.tools
 
# Reevaluate when used, as BUILDDIR won't be defined yet
TESTRUNNER = test/runtest.sh $(BUILDDIR) $(EXEEXT)
 
# Toolchain flags
WARNFLAGS := -Wall -Wextra -Wundef -Wpointer-arith -Wcast-align \
-Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes \
-Wmissing-declarations -Wnested-externs -Werror -pedantic \
-Wno-overlength-strings # For nsglobe.c
CFLAGS := -g -std=c99 -D_BSD_SOURCE -D_POSIX_C_SOURCE=200112L \
-I$(CURDIR)/include/ -I$(CURDIR)/src $(WARNFLAGS) $(CFLAGS)
 
NSFB_XCB_PKG_NAMES := xcb xcb-icccm xcb-image xcb-keysyms xcb-atom
 
$(eval $(call pkg_config_package_available,NSFB_VNC_AVAILABLE,libvncserver))
$(eval $(call pkg_config_package_available,NSFB_SDL_AVAILABLE,sdl))
$(eval $(call pkg_config_package_available,NSFB_XCB_AVAILABLE,$(NSFB_XCB_PKG_NAMES)))
 
ifeq ($(NSFB_SDL_AVAILABLE),yes)
$(eval $(call pkg_config_package_add_flags,sdl,CFLAGS))
$(eval $(call pkg_config_package_add_flags,sdl,TESTCFLAGS,TESTLDFLAGS))
 
REQUIRED_PKGS := $(REQUIRED_PKGS) sdl
endif
 
ifeq ($(NSFB_XCB_AVAILABLE),yes)
# Size hint allocators were removed in xcb-icccm 0.3.0
$(eval $(call pkg_config_package_min_version,NSFB_XCB_ICCCM_SIZE_HINTS,xcb-icccm,0.3.0))
ifeq ($(NSFB_XCB_ICCCM_SIZE_HINTS),yes)
CFLAGS := $(CFLAGS) -DNSFB_NEED_HINTS_ALLOC
endif
 
# xcb-icccm 0.3.8 introduced an additional "icccm_" in function names
$(eval $(call pkg_config_package_min_version,NSFB_XCB_ICCCM_API_PREFIX,xcb-icccm,0.3.8))
ifeq ($(NSFB_XCB_ICCCM_API_PREFIX),yes)
CFLAGS := $(CFLAGS) -DNSFB_NEED_ICCCM_API_PREFIX
endif
 
# xcbproto 1.6 incorporated atoms previously found in xcb_atom
# However, libxcb <1.3 did not report xcbproto versions. Assume xcbproto 1.5 in this case.
$(eval $(call pkg_config_package_min_version,NSFB_HAVE_MODERN_XCB,xcb,1.3))
ifeq ($(NSFB_HAVE_MODERN_XCB),yes)
$(eval $(call pkg_config_get_variable,NSFB_XCBPROTO_VERSION,xcb,xcbproto_version))
NSFB_XCBPROTO_MAJOR_VERSION := $(word 1,$(subst ., ,$(NSFB_XCBPROTO_VERSION)))
NSFB_XCBPROTO_MINOR_VERSION := $(word 2,$(subst ., ,$(NSFB_XCBPROTO_VERSION)))
CFLAGS := $(CFLAGS) -DNSFB_XCBPROTO_MAJOR_VERSION=$(NSFB_XCBPROTO_MAJOR_VERSION)
CFLAGS := $(CFLAGS) -DNSFB_XCBPROTO_MINOR_VERSION=$(NSFB_XCBPROTO_MINOR_VERSION)
else
CFLAGS := $(CFLAGS) -DNSFB_XCBPROTO_MAJOR_VERSION=1
CFLAGS := $(CFLAGS) -DNSFB_XCBPROTO_MINOR_VERSION=5
endif
 
$(eval $(call pkg_config_package_add_flags,$(NSFB_XCB_PKG_NAMES),CFLAGS))
$(eval $(call pkg_config_package_add_flags,$(NSFB_XCB_PKG_NAMES),TESTCFLAGS,TESTLDFLAGS))
 
REQUIRED_PKGS := $(REQUIRED_PKGS) $(NSFB_XCB_PKG_NAMES)
 
$(eval $(call pkg_config_package_available,NSFB_XCB_UTIL_AVAILABLE,xcb-util))
ifeq ($(NSFB_XCB_UTIL_AVAILABLE),yes)
REQUIRED_PKGS := $(REQUIRED_PKGS) xcb-util
endif
endif
 
ifeq ($(NSFB_VNC_AVAILABLE),yes)
$(eval $(call pkg_config_package_add_flags,libvncserver,CFLAGS))
$(eval $(call pkg_config_package_add_flags,libvncserver,TESTCFLAGS,TESTLDFLAGS))
 
REQUIRED_PKGS := $(REQUIRED_PKGS) libvncserver
endif
 
TESTLDFLAGS := -lm -Wl,--whole-archive -l$(COMPONENT) -Wl,--no-whole-archive $(TESTLDFLAGS)
 
include $(NSBUILD)/Makefile.top
 
# Extra installation rules
I := /include
INSTALL_ITEMS := $(INSTALL_ITEMS) $(I):include/libnsfb.h
INSTALL_ITEMS := $(INSTALL_ITEMS) $(I):include/libnsfb_plot.h
INSTALL_ITEMS := $(INSTALL_ITEMS) $(I):include/libnsfb_plot_util.h
INSTALL_ITEMS := $(INSTALL_ITEMS) $(I):include/libnsfb_event.h
INSTALL_ITEMS := $(INSTALL_ITEMS) $(I):include/libnsfb_cursor.h
INSTALL_ITEMS := $(INSTALL_ITEMS) /lib/pkgconfig:lib$(COMPONENT).pc.in
INSTALL_ITEMS := $(INSTALL_ITEMS) /lib:$(OUTPUT)
/contrib/network/netsurf/libnsfb/NOTE
0,0 → 1,5
extern nsfb_surface_rtns_t sdl_rtns;
_nsfb_register_surface(NSFB_SURFACE_SDL, &sdl_rtns, "sdl");
 
NSFB_SURFACE_RAM IS NEEDED TOO
/contrib/network/netsurf/libnsfb/libnsfb.pc.in
0,0 → 1,11
prefix=PREFIX
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
 
Name: libnsfb
Description: Provides framebuffer access for netsurf.
Version: VERSION
REQUIRED
Libs: -L${libdir} -lnsfb
Cflags: -I${includedir}
/contrib/network/netsurf/libnsfb/test/Makefile
0,0 → 1,9
# Sources
OBJS := bitmap.o nsglobe.o
 
 
OUTFILE = bitmap
 
CFLAGS += -I ../../include/ -I ../../ -I ../ -I ./ -I /home/sourcerer/kos_src/newenginek/kolibri/include -I /home/sourcerer/kos_src/me/include/SDL/
LIBS += -L /home/sourcerer/kos_src/newenginek/kolibri/lib -lm --whole-archive -lnsfb --no-whole-archive -lSDL
include $(MENUETDEV)/makefiles/Makefile_for_program
/contrib/network/netsurf/libnsfb/test/bezier
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:executable
+*
\ No newline at end of property
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/contrib/network/netsurf/libnsfb/test/bezier.c
0,0 → 1,175
/* libnsfb plotetr test program */
 
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_event.h"
#include "surface.h"
//#include "../src/surface/sdl.c"
 
 
 
 
#define UNUSED(x) ((x) = (x))
 
#include <menuet/os.h>
 
int main(int argc, char **argv)
{
extern nsfb_surface_rtns_t sdl_rtns;
_nsfb_register_surface(NSFB_SURFACE_SDL, &sdl_rtns, "sdl");
__menuet__debug_out("Starting bezier\n");
freopen("stderr","w",stderr);
freopen("stdout","w",stdout);
 
const char *fename;
enum nsfb_type_e fetype;
nsfb_t *nsfb;
nsfb_event_t event;
int waitloop = 3;
 
nsfb_bbox_t box;
nsfb_bbox_t box2;
uint8_t *fbptr;
int fbstride;
nsfb_point_t ctrla;
nsfb_point_t ctrlb;
int loop;
nsfb_plot_pen_t pen;
 
if (argc < 2) {
fename="sdl";
} else {
fename = argv[1];
}
 
fetype = nsfb_type_from_name(fename);
if (fetype == NSFB_SURFACE_NONE) {
__menuet__debug_out("Can't convert\n");
fprintf(stderr, "Unable to convert \"%s\" to nsfb surface type\n", fename);
return 1;
}
 
nsfb = nsfb_new(fetype);
if (nsfb == NULL) {
__menuet__debug_out("Can't allocate\n");
fprintf(stderr, "Unable to allocate \"%s\" nsfb surface\n", fename);
return 2;
}
 
if (nsfb_init(nsfb) == -1) {
__menuet__debug_out("Init failed\n");
fprintf(stderr, "Unable to initialise nsfb surface\n");
nsfb_free(nsfb);
return 4;
}
 
/* get the geometry of the whole screen */
box.x0 = box.y0 = 0;
nsfb_get_geometry(nsfb, &box.x1, &box.y1, NULL);
 
nsfb_get_buffer(nsfb, &fbptr, &fbstride);
 
/* claim the whole screen for update */
nsfb_claim(nsfb, &box);
 
nsfb_plot_clg(nsfb, 0xffffffff);
 
box2.x0=100;
box2.y0=100;
 
box2.x1=400;
box2.y1=400;
 
pen.stroke_colour = 0xff000000;
pen.fill_colour = 0xffff0000;
pen.stroke_type = NFSB_PLOT_OPTYPE_SOLID;
pen.fill_type = NFSB_PLOT_OPTYPE_NONE;
 
for (loop=-300;loop < 600;loop+=100) {
ctrla.x = 100;
ctrla.y = loop;
 
ctrlb.x = 400;
ctrlb.y = 500 - loop;
 
nsfb_plot_cubic_bezier(nsfb, &box2, &ctrla, &ctrlb, &pen);
}
 
 
box2.x0=400;
box2.y0=100;
 
box2.x1=600;
box2.y1=400;
 
nsfb_plot_line(nsfb, &box2, &pen);
 
box2.x0=800;
box2.y0=100;
 
box2.x1=600;
box2.y1=400;
 
nsfb_plot_line(nsfb, &box2, &pen);
 
box2.x0=400;
box2.y0=100;
 
box2.x1=800;
box2.y1=100;
 
ctrla.x = 600;
ctrla.y = 400;
 
pen.stroke_colour = 0xffff0000;
 
nsfb_plot_cubic_bezier(nsfb, &box2, &ctrla, &ctrla, &pen);
 
box2.x0=400;
box2.y0=100;
 
box2.x1=800;
box2.y1=100;
 
ctrla.x = 600;
ctrla.y = 400;
 
pen.stroke_colour = 0xff0000ff;
 
nsfb_plot_quadratic_bezier(nsfb, &box2, &ctrla, &pen);
 
nsfb_update(nsfb, &box);
/* wait for quit event or timeout */
while (waitloop > 0) {
if (nsfb_event(nsfb, &event, 1000) == false) {
break;
}
if (event.type == NSFB_EVENT_CONTROL) {
if (event.value.controlcode == NSFB_CONTROL_TIMEOUT) {
/* timeout */
waitloop--;
} else if (event.value.controlcode == NSFB_CONTROL_QUIT) {
break;
}
}
}
 
nsfb_free(nsfb);
 
return 0;
}
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/test/bezier.map
0,0 → 1,1602
Archive member included because of file (symbol)
 
/home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o) (SDL_RemoveTimer)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o) (SDL_GetTicks)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o) (SDL_PushEvent)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (SDL_CheckKeyRepeat)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (SDL_MouseInit)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_quit.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (SDL_QuitInit)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o) (SDL_MoveCursor)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o) (SDL_MapRGB)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o) (SDL_UnRLESurface)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o) (SDL_LockSurface)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (current_video)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o) (mosvideo_bootstrab)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o) (SDL_Quit)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o) (SDL_ClearError)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o) (SDL_InstallParachute)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_getenv.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o) (SDL_getenv)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o) (SDL_AudioQuit)
/home/sourcerer/kos_src/me//lib/libSDL.a(init.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o) (InitSound)
/home/sourcerer/kos_src/me//lib/libSDL.a(setbuf.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o) (SetBuffer)
/home/sourcerer/kos_src/me//lib/libSDL.a(stopbuf.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o) (StopBuffer)
/home/sourcerer/kos_src/me//lib/libSDL.a(sndgetsize.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o) (GetBufferSize)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o) (SDL_mutexP)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o) (SDL_DestroySemaphore)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (SDL_ThreadID)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_thread.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (SDL_WaitThread)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_active.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (SDL_AppActiveInit)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_resize.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o) (SDL_PrivateResize)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o) (SDL_CalculateBlit)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o) (SDL_CalculateBlitN)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o) (MenuetOS_InitOSKeymap)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o) (SDL_CalculateBlit0)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o) (SDL_CalculateBlit1)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o) (SDL_CalculateAlphaBlit)
/home/sourcerer/kos_src/me//lib/libc.a(dup.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o) (dup)
/home/sourcerer/kos_src/me//lib/libc.a(fdopen.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o) (fdopen)
/home/sourcerer/kos_src/me//lib/libc.a(debug.o)
bezier.o (__menuet__debug_out)
/home/sourcerer/kos_src/me//lib/libc.a(window.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o) (__menuet__define_window)
/home/sourcerer/kos_src/me//lib/libc.a(param.o)
/home/sourcerer/kos_src/me//stub/crt0.o (__menuet__app_param_area)
/home/sourcerer/kos_src/me//lib/libc.a(keyb.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o) (__menuet__getkey)
/home/sourcerer/kos_src/me//lib/libc.a(image.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o) (__menuet__putimage)
/home/sourcerer/kos_src/me//lib/libc.a(exit.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o) (__menuet__sys_exit)
/home/sourcerer/kos_src/me//lib/libc.a(event.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o) (__menuet__check_for_event)
/home/sourcerer/kos_src/me//lib/libc.a(delay.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o) (__menuet__delay100)
/home/sourcerer/kos_src/me//lib/libc.a(button.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o) (__menuet__get_button_id)
/home/sourcerer/kos_src/me//lib/libc.a(setmode.o)
/home/sourcerer/kos_src/me//lib/libc.a(fdopen.o) (__setmode)
/home/sourcerer/kos_src/me//lib/libc.a(fmode.o)
/home/sourcerer/kos_src/me//lib/libc.a(fdopen.o) (_fmode)
/home/sourcerer/kos_src/me//lib/libc.a(crt1.o)
/home/sourcerer/kos_src/me//stub/crt0.o (__crt1_startup)
/home/sourcerer/kos_src/me//lib/libc.a(crt0.o)
/home/sourcerer/kos_src/me//lib/libc.a(crt1.o) (__crt0_setup_arguments)
/home/sourcerer/kos_src/me//lib/libc.a(brk.o)
/home/sourcerer/kos_src/me//lib/libc.a(crt1.o) (init_brk)
/home/sourcerer/kos_src/me//lib/libc.a(strdup.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o) (strdup)
/home/sourcerer/kos_src/me//lib/libc.a(memset.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o) (memset)
/home/sourcerer/kos_src/me//lib/libc.a(memmove.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o) (memmove)
/home/sourcerer/kos_src/me//lib/libc.a(strncpy.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o) (strncpy)
/home/sourcerer/kos_src/me//lib/libc.a(strncmp.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o) (strncmp)
/home/sourcerer/kos_src/me//lib/libc.a(strlen.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o) (strlen)
/home/sourcerer/kos_src/me//lib/libc.a(strcpy.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o) (strcpy)
/home/sourcerer/kos_src/me//lib/libc.a(strcmp.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o) (strcmp)
/home/sourcerer/kos_src/me//lib/libc.a(memcpy.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o) (memcpy)
/home/sourcerer/kos_src/me//lib/libc.a(memcmp.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o) (memcmp)
/home/sourcerer/kos_src/me//lib/libc.a(malloc.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o) (free)
/home/sourcerer/kos_src/me//lib/libc.a(exit.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o) (exit)
/home/sourcerer/kos_src/me//lib/libc.a(calloc.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o) (calloc)
/home/sourcerer/kos_src/me//lib/libc.a(abs.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o) (abs)
/home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o) (vsprintf)
/home/sourcerer/kos_src/me//lib/libc.a(stdout.o)
bezier.o (__dj_stdout)
/home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o)
/home/sourcerer/kos_src/me//lib/libc.a(stdout.o) (__stdio_cleanup_proc)
/home/sourcerer/kos_src/me//lib/libc.a(stderr.o)
bezier.o (__dj_stderr)
/home/sourcerer/kos_src/me//lib/libc.a(sprintf.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o) (sprintf)
/home/sourcerer/kos_src/me//lib/libc.a(fwalk.o)
/home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o) (_fwalk)
/home/sourcerer/kos_src/me//lib/libc.a(frlist.o)
/home/sourcerer/kos_src/me//lib/libc.a(fwalk.o) (__file_rec_list)
/home/sourcerer/kos_src/me//lib/libc.a(freopen.o)
bezier.o (freopen)
/home/sourcerer/kos_src/me//lib/libc.a(fprintf.o)
bezier.o (fprintf)
/home/sourcerer/kos_src/me//lib/libc.a(fflush.o)
/home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o) (fflush)
/home/sourcerer/kos_src/me//lib/libc.a(fclose.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o) (fclose)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
/home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o) (_doprnt)
/home/sourcerer/kos_src/me//lib/libc.a(allocfil.o)
/home/sourcerer/kos_src/me//lib/libc.a(fdopen.o) (__alloc_file)
/home/sourcerer/kos_src/me//lib/libc.a(modfl.o)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o) (__modfl)
/home/sourcerer/kos_src/me//lib/libc.a(lconv.o)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o) (localeconv)
/home/sourcerer/kos_src/me//lib/libc.a(errno.o)
/home/sourcerer/kos_src/me//lib/libc.a(brk.o) (errno)
/home/sourcerer/kos_src/me//lib/libc.a(ct_flags.o)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o) (__dj_ctype_flags)
/home/sourcerer/kos_src/me//lib/libc.a(debug.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o) (__libclog_vprintf)
/home/sourcerer/kos_src/me//lib/libc.a(write.o)
/home/sourcerer/kos_src/me//lib/libc.a(fflush.o) (write)
/home/sourcerer/kos_src/me//lib/libc.a(lseek.o)
/home/sourcerer/kos_src/me//lib/libc.a(fdopen.o) (lseek)
/home/sourcerer/kos_src/me//lib/libc.a(close.o)
/home/sourcerer/kos_src/me//lib/libc.a(fclose.o) (close)
/home/sourcerer/kos_src/me//lib/libc.a(open.o)
/home/sourcerer/kos_src/me//lib/libc.a(freopen.o) (open)
/home/sourcerer/kos_src/me//lib/libc.a(emu_init.o)
/home/sourcerer/kos_src/me//lib/libc.a(crt1.o) (dosemu_inithandles)
/home/sourcerer/kos_src/me//lib/libc.a(dosemu.o)
/home/sourcerer/kos_src/me//lib/libc.a(lseek.o) (dosemu_lseek)
/home/sourcerer/kos_src/me//lib/libc.a(_main.o)
/home/sourcerer/kos_src/me//lib/libc.a(crt1.o) (__main)
/home/sourcerer/kos_src/me//lib/libc.a(strrchr.o)
/home/sourcerer/kos_src/me//lib/libc.a(emu_init.o) (strrchr)
/home/sourcerer/kos_src/me//lib/libc.a(memchr.o)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o) (memchr)
/home/sourcerer/kos_src/me//lib/libc.a(stdin.o)
/home/sourcerer/kos_src/me//lib/libc.a(frlist.o) (__dj_stdin)
/home/sourcerer/kos_src/me//lib/libc.a(remove.o)
/home/sourcerer/kos_src/me//lib/libc.a(fclose.o) (remove)
/home/sourcerer/kos_src/me//lib/libc.a(putc.o)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o) (putc)
/home/sourcerer/kos_src/me//lib/libc.a(fputc.o)
/home/sourcerer/kos_src/me//lib/libc.a(putc.o) (fputc)
/home/sourcerer/kos_src/me//lib/libc.a(flsbuf.o)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o) (_flsbuf)
/home/sourcerer/kos_src/me//lib/libc.a(hooks.o)
/home/sourcerer/kos_src/me//lib/libc.a(fputc.o) (__libc_write_termios_hook)
/home/sourcerer/kos_src/me//lib/libc.a(fixpath.o)
/home/sourcerer/kos_src/me//lib/libc.a(dosemu.o) (_fixpath)
/home/sourcerer/kos_src/me//lib/libc.a(systree.o)
/home/sourcerer/kos_src/me//lib/libc.a(remove.o) (__kolibri__system_tree_access2)
/home/sourcerer/kos_src/me//lib/libc.a(dosio.o)
/home/sourcerer/kos_src/me//lib/libc.a(fputc.o) (__file_handle_modes)
/home/sourcerer/kos_src/me//lib/libc.a(curdir.o)
/home/sourcerer/kos_src/me//lib/libc.a(fixpath.o) (__libc_combine_path)
 
Memory Configuration
 
Name Origin Length Attributes
*default* 0x0000000000000000 0xffffffffffffffff
 
Linker script and memory map
 
 
.text 0x0000000000000000 0x23a48
0x0000000000000000 code = .
0x0000000000000000 _code = .
*(.text)
.text 0x0000000000000000 0x24 /home/sourcerer/kos_src/me//stub/crt0.o
0x0000000000000000 __menuet__app_header
0x0000000000000000 start
0x0000000000000014 __menuet__memsize
.text 0x0000000000000024 0x0 bezier.o
.text 0x0000000000000024 0x2a4 /home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
0x0000000000000024 nsfb_cursor_init
0x000000000000006f nsfb_cursor_set
0x00000000000000da nsfb_cursor_loc_set
0x000000000000011c nsfb_cursor_loc_get
0x0000000000000145 nsfb_cursor_plot
0x000000000000026a nsfb_cursor_clear
.text 0x00000000000002c8 0xbd /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
0x00000000000002c8 nsfb_dump
*fill* 0x0000000000000385 0x3 00
.text 0x0000000000000388 0x1a9 /home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
0x0000000000000388 nsfb_new
0x00000000000003d6 nsfb_init
0x00000000000003e5 nsfb_free
0x000000000000041f nsfb_event
0x000000000000042e nsfb_claim
0x000000000000043d nsfb_update
0x000000000000044c nsfb_set_geometry
0x0000000000000488 nsfb_set_parameters
0x00000000000004dc nsfb_get_geometry
0x000000000000050d nsfb_get_buffer
*fill* 0x0000000000000531 0x3 00
.text 0x0000000000000534 0x1ca /home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
0x0000000000000534 nsfb_palette_free
0x0000000000000567 nsfb_palette_new
0x00000000000005e0 nsfb_palette_dither_init
0x0000000000000623 nsfb_palette_dither_fini
0x0000000000000635 nsfb_palette_generate_nsfb_8bpp
*fill* 0x00000000000006fe 0x2 00
.text 0x0000000000000700 0x9df /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
*fill* 0x00000000000010df 0x1 00
.text 0x00000000000010e0 0x894 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
.text 0x0000000000001974 0x96e /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
*fill* 0x00000000000022e2 0x2 00
.text 0x00000000000022e4 0xcfb /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
*fill* 0x0000000000002fdf 0x1 00
.text 0x0000000000002fe0 0x1b6 /home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
0x0000000000002fe0 nsfb_plot_set_clip
0x0000000000002fef nsfb_plot_get_clip
0x0000000000002ffe nsfb_plot_clg
0x000000000000300c nsfb_plot_rectangle
0x000000000000301b nsfb_plot_rectangle_fill
0x000000000000302a nsfb_plot_line
0x0000000000003044 nsfb_plot_lines
0x0000000000003053 nsfb_plot_polylines
0x0000000000003062 nsfb_plot_polygon
0x0000000000003071 nsfb_plot_arc
0x0000000000003080 nsfb_plot_point
0x000000000000308f nsfb_plot_ellipse
0x000000000000309e nsfb_plot_ellipse_fill
0x00000000000030ad nsfb_plot_copy
0x000000000000312d nsfb_plot_bitmap
0x000000000000313c nsfb_plot_glyph8
0x000000000000314b nsfb_plot_glyph1
0x000000000000315a nsfb_plot_readrect
0x0000000000003169 nsfb_plot_cubic_bezier
0x0000000000003178 nsfb_plot_quadratic_bezier
0x0000000000003187 nsfb_plot_path
*fill* 0x0000000000003196 0x2 00
.text 0x0000000000003198 0x10d5 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
0x0000000000004165 select_plotters
*fill* 0x000000000000426d 0x3 00
.text 0x0000000000004270 0x466 /home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
0x0000000000004270 nsfb_plot_clip
0x000000000000439c nsfb_plot_clip_ctx
0x00000000000043ae nsfb_plot_clip_line
0x0000000000004638 nsfb_plot_clip_line_ctx
0x000000000000464a nsfb_plot_add_rect
0x00000000000046a5 nsfb_plot_bbox_intersect
*fill* 0x00000000000046d6 0x2 00
.text 0x00000000000046d8 0x3b /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
*fill* 0x0000000000004713 0x1 00
.text 0x0000000000004714 0x36 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
*fill* 0x000000000000474a 0x2 00
.text 0x000000000000474c 0x112 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
*fill* 0x000000000000485e 0x2 00
.text 0x0000000000004860 0x579 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
*fill* 0x0000000000004dd9 0x3 00
.text 0x0000000000004ddc 0x169 /home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
0x0000000000004e1f _nsfb_register_surface
0x0000000000004e52 nsfb_surface_get_rtns
0x0000000000004f08 nsfb_type_from_name
*fill* 0x0000000000004f45 0x3 00
.text 0x0000000000004f48 0x3fd /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
0x0000000000004f54 SDL_RemoveTimer
0x0000000000004fcd SDL_SetTimerThreaded
0x0000000000004ffd SDL_AddTimer
0x00000000000050ca SDL_SetTimer
0x0000000000005194 SDL_ThreadedTimerCheck
0x00000000000052a2 SDL_TimerQuit
0x00000000000052f2 SDL_TimerInit
*fill* 0x0000000000005345 0x3 00
.text 0x0000000000005348 0x67 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o)
0x0000000000005348 SDL_StartTicks
0x0000000000005360 SDL_GetTicks
0x000000000000537c SDL_SYS_TimerInit
0x0000000000005383 SDL_SYS_TimerQuit
0x0000000000005388 SDL_SYS_StartTimer
0x000000000000538f SDL_SYS_StopTimer
0x0000000000005394 SDL_Delay
*fill* 0x00000000000053af 0x1 00
.text 0x00000000000053b0 0x682 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
0x00000000000053b0 SDL_EventThreadID
0x00000000000053ba SDL_GetEventFilter
0x00000000000053c4 SDL_PumpEvents
0x00000000000053f1 SDL_PeepEvents
0x0000000000005611 SDL_PushEvent
0x0000000000005627 SDL_PrivateSysWMEvent
0x0000000000005685 SDL_WaitEvent
0x00000000000056cf SDL_PollEvent
0x00000000000056ea SDL_EventState
0x000000000000579e SDL_SetEventFilter
0x00000000000057c5 SDL_Unlock_EventThread
0x00000000000057f4 SDL_Lock_EventThread
0x00000000000058d4 SDL_StopEventLoop
0x0000000000005941 SDL_StartEventLoop
*fill* 0x0000000000005a32 0x2 00
.text 0x0000000000005a34 0xc2f /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
0x0000000000005a34 SDL_EnableUNICODE
0x0000000000005a4b SDL_GetKeyState
0x0000000000005a62 SDL_GetModState
0x0000000000005a6c SDL_SetModState
0x0000000000005a79 SDL_GetKeyName
0x0000000000005a98 SDL_CheckKeyRepeat
0x0000000000005a9d SDL_EnableKeyRepeat
0x0000000000005ae9 SDL_KeyboardInit
0x0000000000006446 SDL_PrivateKeyboard
0x0000000000006611 SDL_ResetKeyboard
*fill* 0x0000000000006663 0x1 00
.text 0x0000000000006664 0x3fb /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o)
0x0000000000006664 SDL_MouseInit
0x0000000000006696 SDL_GetMouseState
0x00000000000066c0 SDL_GetRelativeMouseState
0x0000000000006747 SDL_PrivateMouseButton
0x00000000000068d5 SDL_PrivateMouseMotion
*fill* 0x0000000000006a5f 0x1 00
.text 0x0000000000006a60 0x4d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_quit.o)
0x0000000000006a60 SDL_QuitInit
0x0000000000006a67 SDL_PrivateQuit
*fill* 0x0000000000006aad 0x3 00
.text 0x0000000000006ab0 0xfb3 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
0x0000000000006ab0 SDL_GetCursor
0x0000000000006aba SDL_CursorPaletteChanged
0x0000000000006ac9 SDL_MouseRect
0x0000000000006b5a SDL_ResetCursor
0x0000000000006b93 SDL_EraseCursorNoLock
0x0000000000006cf9 SDL_EraseCursor
0x0000000000006d86 SDL_DrawCursorNoLock
0x00000000000073fa SDL_DrawCursor
0x0000000000007487 SDL_MoveCursor
0x0000000000007526 SDL_WarpMouse
0x000000000000758f SDL_SetCursor
0x00000000000076f9 SDL_ShowCursor
0x0000000000007792 SDL_FreeCursor
0x0000000000007818 SDL_CreateCursor
0x0000000000007990 SDL_CursorInit
0x00000000000079e7 SDL_CursorQuit
*fill* 0x0000000000007a63 0x1 00
.text 0x0000000000007a64 0xc8e /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o)
0x0000000000007a64 SDL_DitherColors
0x0000000000007ad1 SDL_CalculatePitch
0x0000000000007b0a SDL_FindColor
0x0000000000007b82 SDL_MapRGB
0x0000000000007bf4 SDL_MapRGBA
0x0000000000007c82 SDL_GetRGBA
0x0000000000007d95 SDL_GetRGB
0x0000000000007e59 SDL_ApplyGamma
0x0000000000007eab SDL_InvalidateMap
0x0000000000007ee5 SDL_FormatChanged
0x0000000000007efd SDL_FreeBlitMap
0x0000000000007f3b SDL_FreeFormat
0x000000000000806c SDL_MapSurface
0x000000000000832e SDL_AllocBlitMap
0x00000000000083a0 SDL_AllocFormat
0x00000000000086ae SDL_ReallocFormat
*fill* 0x00000000000086f2 0x2 00
.text 0x00000000000086f4 0x39e4 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
0x00000000000086f4 SDL_RLEBlit
0x000000000000a7df SDL_RLEAlphaBlit
0x000000000000b65a SDL_UnRLESurface
0x000000000000b859 SDL_RLESurface
.text 0x000000000000c0d8 0xd19 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
0x000000000000c0d8 SDL_SetClipRect
0x000000000000c193 SDL_GetClipRect
0x000000000000c1b1 SDL_LockSurface
0x000000000000c208 SDL_FreeSurface
0x000000000000c2d4 SDL_UnlockSurface
0x000000000000c320 SDL_FillRect
0x000000000000c5c1 SDL_LowerBlit
0x000000000000c62d SDL_UpperBlit
0x000000000000c7e4 SDL_SetAlpha
0x000000000000c8fa SDL_SetColorKey
0x000000000000c9c5 SDL_CreateRGBSurface
0x000000000000cb98 SDL_ConvertSurface
0x000000000000cd94 SDL_CreateRGBSurfaceFrom
*fill* 0x000000000000cdf1 0x3 00
.text 0x000000000000cdf4 0x18ea /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
0x000000000000cdf4 SDL_GetVideoSurface
0x000000000000ce0b SDL_GetVideoInfo
0x000000000000ce1f SDL_ListModes
0x000000000000ce53 SDL_GL_SwapBuffers
0x000000000000ce75 SDL_GL_UpdateRectsLock
0x000000000000ce7a SDL_GL_UpdateRects
0x000000000000ce7f SDL_GL_Lock
0x000000000000ce84 SDL_GL_Unlock
0x000000000000ce89 SDL_WM_GetCaption
0x000000000000ceb7 SDL_WM_GrabInput
0x000000000000cf69 SDL_WM_IconifyWindow
0x000000000000cf8c SDL_WM_ToggleFullScreen
0x000000000000d02e SDL_GetWMInfo
0x000000000000d058 SDL_VideoModeOK
0x000000000000d12f SDL_WM_SetIcon
0x000000000000d362 SDL_WM_SetCaption
0x000000000000d436 SDL_GL_GetAttribute
0x000000000000d473 SDL_GL_SetAttribute
0x000000000000d507 SDL_GL_GetProcAddress
0x000000000000d54a SDL_GL_LoadLibrary
0x000000000000d57f SDL_VideoQuit
0x000000000000d6db SDL_UpdateRects
0x000000000000d8a5 SDL_UpdateRect
0x000000000000da5a SDL_SetPalette
0x000000000000dbc6 SDL_SetColors
0x000000000000dbe1 SDL_Flip
0x000000000000dcb8 SDL_DisplayFormat
0x000000000000dd03 SDL_DisplayFormatAlpha
0x000000000000dddb SDL_SetVideoMode
0x000000000000e44a SDL_VideoDriverName
0x000000000000e480 SDL_VideoInit
*fill* 0x000000000000e6de 0x2 00
.text 0x000000000000e6e0 0x6bc /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
0x000000000000e6e0 get_skinh
0x000000000000e70c MenuetOS_SetColors
0x000000000000e713 MenuetOS_VideoQuit
0x000000000000e73f MenuetOS_FinalQuit
0x000000000000e744 MenuetOS_SetCaption
0x000000000000e7b4 KolibriOS_FreeWMCursor
0x000000000000e7ca KolibriOS_CheckMouseMode
0x000000000000e9df KolibriOS_ShowWMCursor
0x000000000000ea63 KolibriOS_CreateWMCursor
0x000000000000ec00 MenuetOS_SDL_RepaintWnd
0x000000000000ec94 MenuetOS_SetVideoMode
.text 0x000000000000ed9c 0x1a8 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
0x000000000000ed9c SDL_WasInit
0x000000000000edb2 SDL_Linked_Version
0x000000000000edbc SDL_QuitSubSystem
0x000000000000ee0f SDL_Quit
0x000000000000ee28 SDL_InitSubSystem
0x000000000000ef0a SDL_Init
.text 0x000000000000ef44 0x4d4 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
0x000000000000ef44 SDL_ClearError
0x000000000000ef53 SDL_GetErrorMsgUNICODE
0x000000000000f1e1 SDL_GetErrorMsg
0x000000000000f248 SDL_GetError
0x000000000000f25f SDL_printf
0x000000000000f2bb SDL_SetError
0x000000000000f3cb SDL_Error
.text 0x000000000000f418 0x28 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o)
0x000000000000f418 SDL_InstallParachute
0x000000000000f41d SDL_UninstallParachute
0x000000000000f422 SDL_printf_error
.text 0x000000000000f440 0x179 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_getenv.o)
0x000000000000f440 SDL_getenv
0x000000000000f4b2 SDL_putenv
*fill* 0x000000000000f5b9 0x3 00
.text 0x000000000000f5bc 0xad6 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
0x000000000000f5bc SDL_AudioQuit
0x000000000000f5c1 SDL_PauseAudio
0x000000000000f603 SDL_LockAudio
0x000000000000f635 SDL_UnlockAudio
0x000000000000f644 SDL_CloseAudio
0x000000000000f6a0 SDL_OpenAudio
0x000000000001000c SDL_AudioDriverName
0x000000000001003c SDL_AudioInit
*fill* 0x0000000000010092 0xe 00
.text 0x00000000000100a0 0xbf /home/sourcerer/kos_src/me//lib/libSDL.a(init.o)
0x00000000000100a0 InitSound
0x0000000000010104 CreateBuffer
0x0000000000010134 DestroyBuffer
*fill* 0x000000000001015f 0x1 00
.text 0x0000000000010160 0x57 /home/sourcerer/kos_src/me//lib/libSDL.a(setbuf.o)
0x0000000000010160 SetBuffer
0x000000000001018c PlayBuffer
*fill* 0x00000000000101b7 0x9 00
.text 0x00000000000101c0 0x2b /home/sourcerer/kos_src/me//lib/libSDL.a(stopbuf.o)
0x00000000000101c0 StopBuffer
*fill* 0x00000000000101eb 0x5 00
.text 0x00000000000101f0 0x2e /home/sourcerer/kos_src/me//lib/libSDL.a(sndgetsize.o)
0x00000000000101f0 GetBufferSize
*fill* 0x000000000001021e 0x2 00
.text 0x0000000000010220 0x99 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o)
0x0000000000010220 SDL_mutexP
0x0000000000010227 SDL_mutexV
0x000000000001022e SDL_DestroyMutex
0x0000000000010260 SDL_CreateMutex
*fill* 0x00000000000102b9 0x3 00
.text 0x00000000000102bc 0x74 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
0x00000000000102bc SDL_DestroySemaphore
0x00000000000102c1 SDL_SemValue
0x00000000000102c8 SDL_SemPost
0x00000000000102dd SDL_SemWait
0x00000000000102f2 SDL_SemWaitTimeout
0x0000000000010307 SDL_SemTryWait
0x000000000001031c SDL_CreateSemaphore
.text 0x0000000000010330 0x2b /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
0x0000000000010330 SDL_SYS_SetupThread
0x0000000000010335 SDL_ThreadID
0x000000000001033c SDL_SYS_WaitThread
0x0000000000010341 SDL_SYS_KillThread
0x0000000000010346 SDL_SYS_CreateThread
*fill* 0x000000000001035b 0x1 00
.text 0x000000000001035c 0x39a /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_thread.o)
0x000000000001035c SDL_GetThreadID
0x00000000000103e2 SDL_WaitThread
0x0000000000010422 SDL_KillThread
0x000000000001044b SDL_GetErrBuf
0x00000000000104b6 SDL_RunThread
0x00000000000104fd SDL_ThreadsQuit
0x0000000000010524 SDL_ThreadsInit
0x000000000001054f SDL_CreateThread
*fill* 0x00000000000106f6 0x2 00
.text 0x00000000000106f8 0xbf /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_active.o)
0x00000000000106f8 SDL_AppActiveInit
0x0000000000010706 SDL_GetAppState
0x0000000000010710 SDL_PrivateAppActive
*fill* 0x00000000000107b7 0x1 00
.text 0x00000000000107b8 0xb9 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_resize.o)
0x00000000000107b8 SDL_PrivateResize
*fill* 0x0000000000010871 0x3 00
.text 0x0000000000010874 0x524 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
0x00000000000109e3 SDL_CalculateBlit
.text 0x0000000000010d98 0x4fa8 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
0x0000000000015bcc SDL_CalculateBlitN
.text 0x0000000000015d40 0x2e4 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
0x0000000000015d40 MenuetOS_InitOSKeymap
0x0000000000015d58 kol_event_wait_time
0x0000000000015d69 MenuetOS_PumpEvents
.text 0x0000000000016024 0xa1f /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
0x000000000001693f SDL_CalculateBlit0
*fill* 0x0000000000016a43 0x1 00
.text 0x0000000000016a44 0x1f10 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
0x00000000000188f9 SDL_CalculateBlit1
.text 0x0000000000018954 0x44a5 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
0x000000000001cc90 SDL_CalculateAlphaBlit
*fill* 0x000000000001cdf9 0x3 00
.text 0x000000000001cdfc 0x8 /home/sourcerer/kos_src/me//lib/libc.a(dup.o)
0x000000000001cdfc dup
.text 0x000000000001ce04 0x123 /home/sourcerer/kos_src/me//lib/libc.a(fdopen.o)
0x000000000001ce04 fdopen
*fill* 0x000000000001cf27 0x1 00
.text 0x000000000001cf28 0x1f /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
0x000000000001cf28 __menuet__debug_out
*fill* 0x000000000001cf47 0x1 00
.text 0x000000000001cf48 0x43 /home/sourcerer/kos_src/me//lib/libc.a(window.o)
0x000000000001cf48 __menuet__define_window
0x000000000001cf7a __menuet__window_redraw
*fill* 0x000000000001cf8b 0x1 00
.text 0x000000000001cf8c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(param.o)
.text 0x000000000001cf8c 0x17 /home/sourcerer/kos_src/me//lib/libc.a(keyb.o)
0x000000000001cf8c __menuet__getkey
*fill* 0x000000000001cfa3 0x1 00
.text 0x000000000001cfa4 0x2b /home/sourcerer/kos_src/me//lib/libc.a(image.o)
0x000000000001cfa4 __menuet__putimage
*fill* 0x000000000001cfcf 0x1 00
.text 0x000000000001cfd0 0xa /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
0x000000000001cfd0 __menuet__sys_exit
*fill* 0x000000000001cfda 0x2 00
.text 0x000000000001cfdc 0x29 /home/sourcerer/kos_src/me//lib/libc.a(event.o)
0x000000000001cfdc __menuet__wait_for_event
0x000000000001cfe8 __menuet__check_for_event
0x000000000001cff4 __menuet__set_bitfield_for_wanted_events
*fill* 0x000000000001d005 0x3 00
.text 0x000000000001d008 0x24 /home/sourcerer/kos_src/me//lib/libc.a(delay.o)
0x000000000001d008 __menuet__delay100
0x000000000001d019 __menuet(int, double, long,...)
.text 0x000000000001d02c 0x48 /home/sourcerer/kos_src/me//lib/libc.a(button.o)
0x000000000001d02c __menuet__make_button
0x000000000001d05c __menuet__get_button_id
.text 0x000000000001d074 0x7 /home/sourcerer/kos_src/me//lib/libc.a(setmode.o)
0x000000000001d074 __setmode
*fill* 0x000000000001d07b 0x1 00
.text 0x000000000001d07c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fmode.o)
.text 0x000000000001d07c 0x43 /home/sourcerer/kos_src/me//lib/libc.a(crt1.o)
0x000000000001d07c __crt1_startup
*fill* 0x000000000001d0bf 0x1 00
.text 0x000000000001d0c0 0x148 /home/sourcerer/kos_src/me//lib/libc.a(crt0.o)
0x000000000001d0c0 _exit
0x000000000001d14b __crt0_setup_arguments
.text 0x000000000001d208 0x163 /home/sourcerer/kos_src/me//lib/libc.a(brk.o)
0x000000000001d208 init_brk
0x000000000001d25c sbrk
*fill* 0x000000000001d36b 0x1 00
.text 0x000000000001d36c 0x3e /home/sourcerer/kos_src/me//lib/libc.a(strdup.o)
0x000000000001d36c strdup
*fill* 0x000000000001d3aa 0x2 00
.text 0x000000000001d3ac 0x3d /home/sourcerer/kos_src/me//lib/libc.a(memset.o)
0x000000000001d3ac memset
*fill* 0x000000000001d3e9 0x3 00
.text 0x000000000001d3ec 0x26 /home/sourcerer/kos_src/me//lib/libc.a(memmove.o)
0x000000000001d3ec memmove
*fill* 0x000000000001d412 0x2 00
.text 0x000000000001d414 0x21 /home/sourcerer/kos_src/me//lib/libc.a(strncpy.o)
0x000000000001d414 strncpy
*fill* 0x000000000001d435 0x3 00
.text 0x000000000001d438 0x25 /home/sourcerer/kos_src/me//lib/libc.a(strncmp.o)
0x000000000001d438 strncmp
*fill* 0x000000000001d45d 0x3 00
.text 0x000000000001d460 0x16 /home/sourcerer/kos_src/me//lib/libc.a(strlen.o)
0x000000000001d460 strlen
*fill* 0x000000000001d476 0x2 00
.text 0x000000000001d478 0x19 /home/sourcerer/kos_src/me//lib/libc.a(strcpy.o)
0x000000000001d478 strcpy
*fill* 0x000000000001d491 0x3 00
.text 0x000000000001d494 0x1f /home/sourcerer/kos_src/me//lib/libc.a(strcmp.o)
0x000000000001d494 strcmp
*fill* 0x000000000001d4b3 0x1 00
.text 0x000000000001d4b4 0x2b /home/sourcerer/kos_src/me//lib/libc.a(memcpy.o)
0x000000000001d4b4 memcpy
*fill* 0x000000000001d4df 0x1 00
.text 0x000000000001d4e0 0x35 /home/sourcerer/kos_src/me//lib/libc.a(memcmp.o)
0x000000000001d4e0 memcmp
*fill* 0x000000000001d515 0x3 00
.text 0x000000000001d518 0x373 /home/sourcerer/kos_src/me//lib/libc.a(malloc.o)
0x000000000001d518 free
0x000000000001d657 malloc
0x000000000001d829 realloc
*fill* 0x000000000001d88b 0x1 00
.text 0x000000000001d88c 0x23 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
0x000000000001d88c exit
*fill* 0x000000000001d8af 0x1 00
.text 0x000000000001d8b0 0x34 /home/sourcerer/kos_src/me//lib/libc.a(calloc.o)
0x000000000001d8b0 calloc
.text 0x000000000001d8e4 0xd /home/sourcerer/kos_src/me//lib/libc.a(abs.o)
0x000000000001d8e4 abs
*fill* 0x000000000001d8f1 0x3 00
.text 0x000000000001d8f4 0x31 /home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o)
0x000000000001d8f4 vsprintf
*fill* 0x000000000001d925 0x3 00
.text 0x000000000001d928 0x4 /home/sourcerer/kos_src/me//lib/libc.a(stdout.o)
.text 0x000000000001d92c 0x3f /home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o)
0x000000000001d92c __stdio_cleanup_proc
*fill* 0x000000000001d96b 0x1 00
.text 0x000000000001d96c 0x4 /home/sourcerer/kos_src/me//lib/libc.a(stderr.o)
.text 0x000000000001d970 0x32 /home/sourcerer/kos_src/me//lib/libc.a(sprintf.o)
0x000000000001d970 sprintf
*fill* 0x000000000001d9a2 0x2 00
.text 0x000000000001d9a4 0x3f /home/sourcerer/kos_src/me//lib/libc.a(fwalk.o)
0x000000000001d9a4 _fwalk
*fill* 0x000000000001d9e3 0x1 00
.text 0x000000000001d9e4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(frlist.o)
.text 0x000000000001d9e4 0x11f /home/sourcerer/kos_src/me//lib/libc.a(freopen.o)
0x000000000001d9e4 freopen
*fill* 0x000000000001db03 0x1 00
.text 0x000000000001db04 0x82 /home/sourcerer/kos_src/me//lib/libc.a(fprintf.o)
0x000000000001db04 fprintf
*fill* 0x000000000001db86 0x2 00
.text 0x000000000001db88 0xad /home/sourcerer/kos_src/me//lib/libc.a(fflush.o)
0x000000000001db88 fflush
*fill* 0x000000000001dc35 0x3 00
.text 0x000000000001dc38 0xb4 /home/sourcerer/kos_src/me//lib/libc.a(fclose.o)
0x000000000001dc38 fclose
.text 0x000000000001dcec 0x1517 /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
0x000000000001ded5 _doprnt
*fill* 0x000000000001f203 0x1 00
.text 0x000000000001f204 0x9a /home/sourcerer/kos_src/me//lib/libc.a(allocfil.o)
0x000000000001f208 __alloc_file
*fill* 0x000000000001f29e 0x2 00
.text 0x000000000001f2a0 0x2c /home/sourcerer/kos_src/me//lib/libc.a(modfl.o)
0x000000000001f2a0 __modfl
.text 0x000000000001f2cc 0xa /home/sourcerer/kos_src/me//lib/libc.a(lconv.o)
0x000000000001f2cc localeconv
*fill* 0x000000000001f2d6 0x2 00
.text 0x000000000001f2d8 0xa /home/sourcerer/kos_src/me//lib/libc.a(errno.o)
0x000000000001f2d8 __isatty
*fill* 0x000000000001f2e2 0x2 00
.text 0x000000000001f2e4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(ct_flags.o)
.text 0x000000000001f2e4 0x8b /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
0x000000000001f2e4 __libclog_vprintf
0x000000000001f349 __libclog_printf
*fill* 0x000000000001f36f 0x1 00
.text 0x000000000001f370 0xc /home/sourcerer/kos_src/me//lib/libc.a(write.o)
0x000000000001f370 write
.text 0x000000000001f37c 0xc /home/sourcerer/kos_src/me//lib/libc.a(lseek.o)
0x000000000001f37c lseek
.text 0x000000000001f388 0xc /home/sourcerer/kos_src/me//lib/libc.a(close.o)
0x000000000001f388 close
.text 0x000000000001f394 0x13 /home/sourcerer/kos_src/me//lib/libc.a(open.o)
0x000000000001f394 open
*fill* 0x000000000001f3a7 0x1 00
.text 0x000000000001f3a8 0x70 /home/sourcerer/kos_src/me//lib/libc.a(emu_init.o)
0x000000000001f3a8 dosemu_inithandles
0x000000000001f3ed init_dir_stack
.text 0x000000000001f418 0x5b3 /home/sourcerer/kos_src/me//lib/libc.a(dosemu.o)
0x000000000001f418 dosemu_file_exists
0x000000000001f467 dosemu_createtrunc
0x000000000001f4b2 dosemu_getiostruct
0x000000000001f4d7 dosemu_allochandle
0x000000000001f4f7 dosemu_freehandle
0x000000000001f513 dosemu_fileread
0x000000000001f56a dosemu_filewrite
0x000000000001f5cc dosemu_iosize
0x000000000001f5fd dosemu_filesize
0x000000000001f64c dosemu_tell
0x000000000001f677 dosemu_lseek
0x000000000001f6d5 dosemu_read
0x000000000001f74e dosemu_write
0x000000000001f783 dosemu_close
0x000000000001f7ba _dosemu_flush
0x000000000001f7bf dosemu_truncate
0x000000000001f849 dosemu_open
*fill* 0x000000000001f9cb 0x1 00
.text 0x000000000001f9cc 0x39 /home/sourcerer/kos_src/me//lib/libc.a(_main.o)
0x000000000001f9cc __main
*fill* 0x000000000001fa05 0x3 00
.text 0x000000000001fa08 0x24 /home/sourcerer/kos_src/me//lib/libc.a(strrchr.o)
0x000000000001fa08 strrchr
.text 0x000000000001fa2c 0x22 /home/sourcerer/kos_src/me//lib/libc.a(memchr.o)
0x000000000001fa2c memchr
*fill* 0x000000000001fa4e 0x2 00
.text 0x000000000001fa50 0x4 /home/sourcerer/kos_src/me//lib/libc.a(stdin.o)
.text 0x000000000001fa54 0x87 /home/sourcerer/kos_src/me//lib/libc.a(remove.o)
0x000000000001fa54 remove
*fill* 0x000000000001fadb 0x1 00
.text 0x000000000001fadc 0xc /home/sourcerer/kos_src/me//lib/libc.a(putc.o)
0x000000000001fadc putc
.text 0x000000000001fae8 0xb7 /home/sourcerer/kos_src/me//lib/libc.a(fputc.o)
0x000000000001fae8 fputc
*fill* 0x000000000001fb9f 0x1 00
.text 0x000000000001fba0 0x148 /home/sourcerer/kos_src/me//lib/libc.a(flsbuf.o)
0x000000000001fba0 _flsbuf
.text 0x000000000001fce8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(hooks.o)
.text 0x000000000001fce8 0x66 /home/sourcerer/kos_src/me//lib/libc.a(fixpath.o)
0x000000000001fce8 fix_slashes
0x000000000001fd2a _fixpath
*fill* 0x000000000001fd4e 0x2 00
.text 0x000000000001fd50 0x22 /home/sourcerer/kos_src/me//lib/libc.a(systree.o)
0x000000000001fd50 __kolibri__system_tree_access
0x000000000001fd61 __kolibri__system_tree_access2
*fill* 0x000000000001fd72 0x2 00
.text 0x000000000001fd74 0x14 /home/sourcerer/kos_src/me//lib/libc.a(dosio.o)
0x000000000001fd74 __file_handle_set
.text 0x000000000001fd88 0xe9 /home/sourcerer/kos_src/me//lib/libc.a(curdir.o)
0x000000000001fd88 __get_curdir
0x000000000001fe34 __libc_combine_path
0x000000000001fe5d __chdir
*(.fixup)
*(.gnu.warning)
*(.gnu.linkonce.t*)
*(.const)
*(.ro*)
.rodata.str1.1
0x000000000001fe71 0xc7 bezier.o
.rodata.str1.1
0x000000000001ff38 0x2d /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
0x31 (size before relaxing)
*fill* 0x000000000001ff65 0x3 00
.rodata 0x000000000001ff68 0x50 /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
0x000000000001ff68 _nsfb_16bpp_plotters
.rodata 0x000000000001ffb8 0x50 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
0x000000000001ffb8 _nsfb_32bpp_xbgr8888_plotters
.rodata 0x0000000000020008 0x50 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
0x0000000000020008 _nsfb_32bpp_xrgb8888_plotters
.rodata 0x0000000000020058 0x50 /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
0x0000000000020058 _nsfb_8bpp_plotters
.rodata 0x00000000000200a8 0x20 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
.rodata.cst4 0x00000000000200c8 0x10 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
.rodata.str1.1
0x00000000000200d8 0x5 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
*fill* 0x00000000000200dd 0x3 00
.rodata 0x00000000000200e0 0x24 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
0x00000000000200e0 able_rtns
.rodata.str1.1
0x0000000000020104 0x6 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
*fill* 0x000000000002010a 0x2 00
.rodata 0x000000000002010c 0x24 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
0x000000000002010c linux_rtns
.rodata.str1.1
0x0000000000020130 0x4 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.rodata 0x0000000000020134 0x24 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
0x0000000000020134 ram_rtns
.rodata.str1.1
0x0000000000020158 0x31 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
0x35 (size before relaxing)
*fill* 0x0000000000020189 0x3 00
.rodata 0x000000000002018c 0x24 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
0x000000000002018c sdl_rtns
.rodata.str1.1
0x00000000000201b0 0x9e /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
.rodata.str1.1
0x000000000002024e 0x1a /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
.rodata.str1.1
0x0000000000020268 0x567 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
0x5b3 (size before relaxing)
*fill* 0x00000000000207cf 0x1 00
.rodata 0x00000000000207d0 0x70 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
.rodata.str1.1
0x0000000000020840 0x2a /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
*fill* 0x000000000002086a 0x2 00
.rodata 0x000000000002086c 0x10 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
.rodata.str1.1
0x000000000002087c 0x67 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
.rodata.str1.1
0x00000000000208e3 0x19d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
.rodata 0x0000000000020a80 0x38 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
.rodata.str1.1
0x0000000000020ab8 0x20 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
.rodata.str1.1
0x0000000000020ad8 0x65 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
.rodata.str1.1
0x0000000000020b3d 0x8e /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
0x91 (size before relaxing)
.rodata.str1.1
0x0000000000020bcb 0x192 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
.rodata.str1.1
0x0000000000020d5d 0x27 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
.rodata.str1.1
0x0000000000020d84 0x2b /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
.rodata.str1.1
0x0000000000020daf 0x1f /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
*fill* 0x0000000000020dce 0x2 00
.rodata 0x0000000000020dd0 0x2350 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
.rodata 0x0000000000023120 0x600 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
.rodata 0x0000000000023720 0x28 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
.rodata 0x0000000000023748 0x140 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
.rodata 0x0000000000023888 0x1c /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
.rodata.str1.1
0x00000000000238a4 0x2a /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
*fill* 0x00000000000238ce 0x2 00
.rodata 0x00000000000238d0 0x13c /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
.rodata.cst4 0x0000000000023a0c 0x10 /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
0x14 (size before relaxing)
*fill* 0x0000000000023a1c 0x4 00
.rodata.cst16 0x0000000000023a20 0x20 /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
.rodata.cst8 0x0000000000023a40 0x8 /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
*(.gnu.linkonce.r*)
0x0000000000023a48 ecode = .
0x0000000000023a48 _ecode = .
 
.iplt 0x0000000000023a50 0x0
.iplt 0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
 
.text.startup 0x0000000000023a48 0x3a0
.text.startup 0x0000000000023a48 0x330 bezier.o
0x0000000000023a48 main
.text.startup 0x0000000000023d78 0x1c /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
.text.startup 0x0000000000023d94 0x1c /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
.text.startup 0x0000000000023db0 0x1c /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.text.startup 0x0000000000023dcc 0x1c /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
 
.rel.dyn 0x0000000000023de8 0x0
.rel.iplt 0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
.rel.text 0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
.rel.text.startup
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
.rel.rodata 0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
.rel.data 0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
 
.rdata
 
.data 0x0000000000023df0 0x201c
0x0000000000023df0 djgpp_first_ctor = .
*(.ctor)
*(.ctors)
0x0000000000023df0 djgpp_last_ctor = .
0x0000000000023df0 djgpp_first_dtor = .
*(.dtor)
*(.dtors)
0x0000000000023df0 djgpp_last_dtor = .
*(.gcc_exc*)
0x0000000000023df0 __EH_FRAME_BEGIN__ = .
*(.eh_fram*)
.eh_frame 0x0000000000023df0 0x5c bezier.o
.eh_frame 0x0000000000023e4c 0x120 /home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
0x138 (size before relaxing)
.eh_frame 0x0000000000023f6c 0x2c /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
0x44 (size before relaxing)
.eh_frame 0x0000000000023f98 0x170 /home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
0x188 (size before relaxing)
.eh_frame 0x0000000000024108 0xc4 /home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
0xdc (size before relaxing)
.eh_frame 0x00000000000241cc 0x1b0 /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
0x1c8 (size before relaxing)
.eh_frame 0x000000000002437c 0x16c /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
0x184 (size before relaxing)
.eh_frame 0x00000000000244e8 0x1ac /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
0x1c4 (size before relaxing)
.eh_frame 0x0000000000024694 0x1cc /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
0x1e4 (size before relaxing)
.eh_frame 0x0000000000024860 0x2bc /home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
0x2d4 (size before relaxing)
.eh_frame 0x0000000000024b1c 0x3d4 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
0x3ec (size before relaxing)
.eh_frame 0x0000000000024ef0 0xec /home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
0x104 (size before relaxing)
.eh_frame 0x0000000000024fdc 0xa0 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
0xb8 (size before relaxing)
.eh_frame 0x000000000002507c 0x100 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
0x118 (size before relaxing)
.eh_frame 0x000000000002517c 0xd8 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
0xf0 (size before relaxing)
.eh_frame 0x0000000000025254 0x1b0 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
0x1c8 (size before relaxing)
.eh_frame 0x0000000000025404 0x118 /home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
0x130 (size before relaxing)
0x000000000002551c __EH_FRAME_END__ = .
0x000000000002551c 0x4 LONG 0x0
*(.gnu.linkonce.d*)
*(.rodata)
*(.rodata.*)
*(.data)
.data 0x0000000000025520 0x0 bezier.o
.data 0x0000000000025520 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
.data 0x0000000000025520 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
.data 0x0000000000025520 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
.data 0x0000000000025520 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
.data 0x0000000000025520 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
.data 0x0000000000025520 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
.data 0x0000000000025520 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
.data 0x0000000000025520 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
.data 0x0000000000025520 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
.data 0x0000000000025520 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
.data 0x0000000000025520 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
.data 0x0000000000025520 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
.data 0x0000000000025520 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
.data 0x0000000000025520 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.data 0x0000000000025520 0x50c /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
0x0000000000025520 sdl_nsfb_map
.data 0x0000000000025a2c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
.data 0x0000000000025a2c 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
.data 0x0000000000025a2c 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o)
.data 0x0000000000025a2c 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
.data 0x0000000000025a2c 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
.data 0x0000000000025a2c 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o)
.data 0x0000000000025a2c 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_quit.o)
.data 0x0000000000025a2c 0x44 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
.data 0x0000000000025a70 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o)
.data 0x0000000000025a70 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
.data 0x0000000000025a70 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
.data 0x0000000000025a70 0x20 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
.data 0x0000000000025a90 0x24 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
0x0000000000025a90 def_title
0x0000000000025aa4 mosvideo_bootstrab
.data 0x0000000000025ab4 0x3 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
*fill* 0x0000000000025ab7 0x1 00
.data 0x0000000000025ab8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
.data 0x0000000000025ab8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o)
.data 0x0000000000025ab8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_getenv.o)
.data 0x0000000000025ab8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
*fill* 0x0000000000025ab8 0x8 00
.data 0x0000000000025ac0 0x17 /home/sourcerer/kos_src/me//lib/libSDL.a(init.o)
0x0000000000025ac0 hSound
0x0000000000025ac4 hrdwSound
*fill* 0x0000000000025ad7 0x1 00
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_thread.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_active.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_resize.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dup.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fdopen.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(window.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(param.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(keyb.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(image.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(event.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(delay.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(button.o)
.data 0x0000000000025ad8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(setmode.o)
.data 0x0000000000025ad8 0x4 /home/sourcerer/kos_src/me//lib/libc.a(fmode.o)
0x0000000000025ad8 _fmode
.data 0x0000000000025adc 0x4 /home/sourcerer/kos_src/me//lib/libc.a(crt1.o)
0x0000000000025adc __bss_count
.data 0x0000000000025ae0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(crt0.o)
.data 0x0000000000025ae0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(brk.o)
.data 0x0000000000025ae0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strdup.o)
.data 0x0000000000025ae0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memset.o)
.data 0x0000000000025ae0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memmove.o)
.data 0x0000000000025ae0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strncpy.o)
.data 0x0000000000025ae0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strncmp.o)
.data 0x0000000000025ae0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strlen.o)
.data 0x0000000000025ae0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strcpy.o)
.data 0x0000000000025ae0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strcmp.o)
.data 0x0000000000025ae0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memcpy.o)
.data 0x0000000000025ae0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memcmp.o)
.data 0x0000000000025ae0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(malloc.o)
.data 0x0000000000025ae0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.data 0x0000000000025ae0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(calloc.o)
.data 0x0000000000025ae0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(abs.o)
.data 0x0000000000025ae0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o)
.data 0x0000000000025ae0 0x24 /home/sourcerer/kos_src/me//lib/libc.a(stdout.o)
0x0000000000025ae0 __dj_stdout
.data 0x0000000000025b04 0x4 /home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o)
0x0000000000025b04 __stdio_cleanup_hook
.data 0x0000000000025b08 0x24 /home/sourcerer/kos_src/me//lib/libc.a(stderr.o)
0x0000000000025b08 __dj_stderr
.data 0x0000000000025b2c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(sprintf.o)
.data 0x0000000000025b2c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fwalk.o)
.data 0x0000000000025b2c 0x5c /home/sourcerer/kos_src/me//lib/libc.a(frlist.o)
0x0000000000025b2c __file_rec_list
.data 0x0000000000025b88 0x0 /home/sourcerer/kos_src/me//lib/libc.a(freopen.o)
.data 0x0000000000025b88 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fprintf.o)
.data 0x0000000000025b88 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fflush.o)
.data 0x0000000000025b88 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fclose.o)
.data 0x0000000000025b88 0xb /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
*fill* 0x0000000000025b93 0x1 00
.data 0x0000000000025b94 0x0 /home/sourcerer/kos_src/me//lib/libc.a(allocfil.o)
.data 0x0000000000025b94 0x0 /home/sourcerer/kos_src/me//lib/libc.a(modfl.o)
.data 0x0000000000025b94 0x33 /home/sourcerer/kos_src/me//lib/libc.a(lconv.o)
*fill* 0x0000000000025bc7 0x1 00
.data 0x0000000000025bc8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(errno.o)
.data 0x0000000000025bc8 0x202 /home/sourcerer/kos_src/me//lib/libc.a(ct_flags.o)
0x0000000000025bc8 __dj_ctype_flags
*fill* 0x0000000000025dca 0x2 00
.data 0x0000000000025dcc 0x0 /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.data 0x0000000000025dcc 0x0 /home/sourcerer/kos_src/me//lib/libc.a(write.o)
.data 0x0000000000025dcc 0x0 /home/sourcerer/kos_src/me//lib/libc.a(lseek.o)
.data 0x0000000000025dcc 0x0 /home/sourcerer/kos_src/me//lib/libc.a(close.o)
.data 0x0000000000025dcc 0x0 /home/sourcerer/kos_src/me//lib/libc.a(open.o)
.data 0x0000000000025dcc 0x0 /home/sourcerer/kos_src/me//lib/libc.a(emu_init.o)
.data 0x0000000000025dcc 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dosemu.o)
.data 0x0000000000025dcc 0x4 /home/sourcerer/kos_src/me//lib/libc.a(_main.o)
.data 0x0000000000025dd0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strrchr.o)
.data 0x0000000000025dd0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memchr.o)
.data 0x0000000000025dd0 0x24 /home/sourcerer/kos_src/me//lib/libc.a(stdin.o)
0x0000000000025dd0 __dj_stdin
.data 0x0000000000025df4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(remove.o)
.data 0x0000000000025df4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(putc.o)
.data 0x0000000000025df4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fputc.o)
.data 0x0000000000025df4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(flsbuf.o)
.data 0x0000000000025df4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(hooks.o)
.data 0x0000000000025df4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fixpath.o)
.data 0x0000000000025df4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(systree.o)
.data 0x0000000000025df4 0x18 /home/sourcerer/kos_src/me//lib/libc.a(dosio.o)
0x0000000000025df4 __file_handle_modes
.data 0x0000000000025e0c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(curdir.o)
0x0000000000025e0c edata = .
0x0000000000025e0c _edata = .
0x0000000000025e0c bss = .
 
.igot.plt 0x0000000000025e0c 0x0
.igot.plt 0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
 
.init_array 0x0000000000025e0c 0x10
.init_array 0x0000000000025e0c 0x4 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
.init_array 0x0000000000025e10 0x4 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
.init_array 0x0000000000025e14 0x4 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.init_array 0x0000000000025e18 0x4 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
 
.bss 0x0000000000025e1c 0x20230
*(.bss)
.bss 0x0000000000025e1c 0x10000 /home/sourcerer/kos_src/me//stub/crt0.o
.bss 0x0000000000035e1c 0x0 bezier.o
.bss 0x0000000000035e1c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
.bss 0x0000000000035e1c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
.bss 0x0000000000035e1c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
.bss 0x0000000000035e1c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
.bss 0x0000000000035e1c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
.bss 0x0000000000035e1c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
.bss 0x0000000000035e1c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
.bss 0x0000000000035e1c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
.bss 0x0000000000035e1c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
.bss 0x0000000000035e1c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
.bss 0x0000000000035e1c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
.bss 0x0000000000035e1c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
.bss 0x0000000000035e1c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
.bss 0x0000000000035e1c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.bss 0x0000000000035e1c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
.bss 0x0000000000035e1c 0xc4 /home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
.bss 0x0000000000035ee0 0x24 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
0x0000000000035ee0 SDL_timer_started
0x0000000000035ee4 SDL_timer_running
0x0000000000035ee8 SDL_alarm_interval
0x0000000000035eec SDL_alarm_callback
.bss 0x0000000000035f04 0x4 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o)
.bss 0x0000000000035f08 0xe4c /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
0x0000000000035f08 SDL_EventOK
0x0000000000035f0c SDL_ProcessEvents
.bss 0x0000000000036d54 0x678 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
0x0000000000036d54 SDL_TranslateUNICODE
0x0000000000036d58 SDL_KeyRepeat
.bss 0x00000000000373cc 0xa /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o)
*fill* 0x00000000000373d6 0x2 00
.bss 0x00000000000373d8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_quit.o)
.bss 0x00000000000373d8 0x18 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
0x00000000000373d8 SDL_cursorstate
0x00000000000373dc SDL_cursor
0x00000000000373e0 SDL_cursorlock
.bss 0x00000000000373f0 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o)
.bss 0x00000000000373f0 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
.bss 0x00000000000373f0 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
.bss 0x00000000000373f0 0x4 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
0x00000000000373f0 current_video
.bss 0x00000000000373f4 0x10 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
.bss 0x0000000000037404 0x8 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
.bss 0x000000000003740c 0xb08 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
.bss 0x0000000000037f14 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o)
.bss 0x0000000000037f14 0x4 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_getenv.o)
.bss 0x0000000000037f18 0x4438 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
0x0000000000037f18 audio_thread_stack
.bss 0x000000000003c350 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o)
.bss 0x000000000003c350 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
.bss 0x000000000003c350 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
.bss 0x000000000003c350 0x31c /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_thread.o)
0x000000000003c350 _creating_thread_lock
.bss 0x000000000003c66c 0x1 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_active.o)
*fill* 0x000000000003c66d 0x3 00
.bss 0x000000000003c670 0x8 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_resize.o)
.bss 0x000000000003c678 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
.bss 0x000000000003c678 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
.bss 0x000000000003c678 0xc /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
.bss 0x000000000003c684 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
.bss 0x000000000003c684 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
.bss 0x000000000003c684 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
.bss 0x000000000003c684 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dup.o)
.bss 0x000000000003c684 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fdopen.o)
.bss 0x000000000003c684 0x0 /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.bss 0x000000000003c684 0x0 /home/sourcerer/kos_src/me//lib/libc.a(window.o)
.bss 0x000000000003c684 0x800 /home/sourcerer/kos_src/me//lib/libc.a(param.o)
0x000000000003c684 __menuet__app_param_area
0x000000000003ca84 __menuet__app_path_area
.bss 0x000000000003ce84 0x0 /home/sourcerer/kos_src/me//lib/libc.a(keyb.o)
.bss 0x000000000003ce84 0x0 /home/sourcerer/kos_src/me//lib/libc.a(image.o)
.bss 0x000000000003ce84 0x0 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.bss 0x000000000003ce84 0x0 /home/sourcerer/kos_src/me//lib/libc.a(event.o)
.bss 0x000000000003ce84 0x0 /home/sourcerer/kos_src/me//lib/libc.a(delay.o)
.bss 0x000000000003ce84 0x0 /home/sourcerer/kos_src/me//lib/libc.a(button.o)
.bss 0x000000000003ce84 0x4 /home/sourcerer/kos_src/me//lib/libc.a(setmode.o)
0x000000000003ce84 __setmode_stdio_hook
.bss 0x000000000003ce88 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fmode.o)
.bss 0x000000000003ce88 0x14 /home/sourcerer/kos_src/me//lib/libc.a(crt1.o)
0x000000000003ce88 __crt0_argc
0x000000000003ce8c __crt0_argv
0x000000000003ce90 __dos_argv0
0x000000000003ce94 _crt0_startup_flags
0x000000000003ce98 environ
.bss 0x000000000003ce9c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(crt0.o)
.bss 0x000000000003ce9c 0x18 /home/sourcerer/kos_src/me//lib/libc.a(brk.o)
.bss 0x000000000003ceb4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strdup.o)
.bss 0x000000000003ceb4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memset.o)
.bss 0x000000000003ceb4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memmove.o)
.bss 0x000000000003ceb4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strncpy.o)
.bss 0x000000000003ceb4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strncmp.o)
.bss 0x000000000003ceb4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strlen.o)
.bss 0x000000000003ceb4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strcpy.o)
.bss 0x000000000003ceb4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strcmp.o)
.bss 0x000000000003ceb4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memcpy.o)
.bss 0x000000000003ceb4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memcmp.o)
.bss 0x000000000003ceb4 0x80 /home/sourcerer/kos_src/me//lib/libc.a(malloc.o)
.bss 0x000000000003cf34 0x8 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
0x000000000003cf34 __atexit_ptr
0x000000000003cf38 keypress_at_exit
.bss 0x000000000003cf3c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(calloc.o)
.bss 0x000000000003cf3c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(abs.o)
.bss 0x000000000003cf3c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o)
.bss 0x000000000003cf3c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stdout.o)
.bss 0x000000000003cf3c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o)
.bss 0x000000000003cf3c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stderr.o)
.bss 0x000000000003cf3c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(sprintf.o)
.bss 0x000000000003cf3c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fwalk.o)
.bss 0x000000000003cf3c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(frlist.o)
.bss 0x000000000003cf3c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(freopen.o)
.bss 0x000000000003cf3c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fprintf.o)
.bss 0x000000000003cf3c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fflush.o)
.bss 0x000000000003cf3c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fclose.o)
.bss 0x000000000003cf3c 0x4 /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
.bss 0x000000000003cf40 0x0 /home/sourcerer/kos_src/me//lib/libc.a(allocfil.o)
.bss 0x000000000003cf40 0x0 /home/sourcerer/kos_src/me//lib/libc.a(modfl.o)
.bss 0x000000000003cf40 0x0 /home/sourcerer/kos_src/me//lib/libc.a(lconv.o)
.bss 0x000000000003cf40 0x4 /home/sourcerer/kos_src/me//lib/libc.a(errno.o)
0x000000000003cf40 errno
.bss 0x000000000003cf44 0x0 /home/sourcerer/kos_src/me//lib/libc.a(ct_flags.o)
.bss 0x000000000003cf44 0x400 /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.bss 0x000000000003d344 0x0 /home/sourcerer/kos_src/me//lib/libc.a(write.o)
.bss 0x000000000003d344 0x0 /home/sourcerer/kos_src/me//lib/libc.a(lseek.o)
.bss 0x000000000003d344 0x0 /home/sourcerer/kos_src/me//lib/libc.a(close.o)
.bss 0x000000000003d344 0x0 /home/sourcerer/kos_src/me//lib/libc.a(open.o)
.bss 0x000000000003d344 0x8800 /home/sourcerer/kos_src/me//lib/libc.a(emu_init.o)
0x000000000003d344 _io_handles
0x0000000000045744 __curdir_buf
.bss 0x0000000000045b44 0x100 /home/sourcerer/kos_src/me//lib/libc.a(dosemu.o)
.bss 0x0000000000045c44 0x0 /home/sourcerer/kos_src/me//lib/libc.a(_main.o)
.bss 0x0000000000045c44 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strrchr.o)
.bss 0x0000000000045c44 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memchr.o)
.bss 0x0000000000045c44 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stdin.o)
.bss 0x0000000000045c44 0x0 /home/sourcerer/kos_src/me//lib/libc.a(remove.o)
.bss 0x0000000000045c44 0x0 /home/sourcerer/kos_src/me//lib/libc.a(putc.o)
.bss 0x0000000000045c44 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fputc.o)
.bss 0x0000000000045c44 0x0 /home/sourcerer/kos_src/me//lib/libc.a(flsbuf.o)
.bss 0x0000000000045c44 0x8 /home/sourcerer/kos_src/me//lib/libc.a(hooks.o)
0x0000000000045c44 __libc_read_termios_hook
0x0000000000045c48 __libc_write_termios_hook
.bss 0x0000000000045c4c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fixpath.o)
.bss 0x0000000000045c4c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(systree.o)
.bss 0x0000000000045c4c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dosio.o)
.bss 0x0000000000045c4c 0x400 /home/sourcerer/kos_src/me//lib/libc.a(curdir.o)
*(.note.gnu.build-id)
0x000000000004604c end = .
0x000000000004604c _end = .
LOAD /home/sourcerer/kos_src/me//stub/crt0.o
LOAD bezier.o
LOAD /home/sourcerer/kos_src/me//lib/libm.a
LOAD /home/sourcerer/kos_src/me//lib/libnsfb.a
LOAD /home/sourcerer/kos_src/me//lib/libSDL.a
LOAD /home/sourcerer/kos_src/me//lib/libc.a
OUTPUT(bezier elf32-i386)
 
.comment 0x0000000000000000 0x38
.comment 0x0000000000000000 0x1c bezier.o
0x1d (size before relaxing)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
.comment 0x000000000000001c 0x1c /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
0x1d (size before relaxing)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_quit.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_getenv.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_thread.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_active.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_resize.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(dup.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fdopen.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(window.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(param.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(keyb.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(image.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(event.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(delay.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(button.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(setmode.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fmode.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(crt1.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(crt0.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(brk.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strdup.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strncpy.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strncmp.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strlen.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strcpy.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strcmp.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(memcpy.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(memcmp.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(malloc.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(calloc.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(abs.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(stdout.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(stderr.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(sprintf.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fwalk.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(frlist.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(freopen.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fprintf.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fflush.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fclose.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(allocfil.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(lconv.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(errno.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(ct_flags.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(write.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(lseek.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(close.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(open.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(emu_init.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(dosemu.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(_main.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strrchr.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(memchr.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(stdin.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(remove.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(putc.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fputc.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(flsbuf.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(hooks.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fixpath.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(systree.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(dosio.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(curdir.o)
 
.note.GNU-stack
0x0000000000000000 0x0
.note.GNU-stack
0x0000000000000000 0x0 bezier.o
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_quit.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_getenv.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_thread.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_active.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_resize.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dup.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fdopen.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(window.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(param.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(keyb.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(image.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(event.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(delay.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(button.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(setmode.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fmode.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(crt1.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(crt0.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(brk.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strdup.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strncpy.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strncmp.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strlen.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strcpy.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strcmp.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memcpy.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memcmp.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(malloc.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(calloc.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(abs.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stdout.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stderr.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(sprintf.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fwalk.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(frlist.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(freopen.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fprintf.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fflush.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fclose.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(allocfil.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(lconv.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(errno.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(ct_flags.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(write.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(lseek.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(close.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(open.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(emu_init.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dosemu.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(_main.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strrchr.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memchr.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stdin.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(remove.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(putc.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fputc.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(flsbuf.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(hooks.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fixpath.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(systree.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dosio.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(curdir.o)
/contrib/network/netsurf/libnsfb/test/bitmap
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:executable
+*
\ No newline at end of property
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/contrib/network/netsurf/libnsfb/test/bitmap.c
0,0 → 1,187
/* libnsfb plotter test program */
 
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_event.h"
#include "surface.h"
 
#include <menuet/os.h>
 
#define UNUSED(x) ((x) = (x))
 
extern const struct {
unsigned int width;
unsigned int height;
unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */
unsigned char pixel_data[132 * 135 * 4 + 1];
} nsglobe;
 
static bool
dump(nsfb_t *nsfb, const char *filename)
{
int fd;
 
if (filename == NULL)
return false;
 
fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU);
if (fd < 0)
return false;
 
nsfb_dump(nsfb, fd);
close(fd);
 
return true;
}
 
int main(int argc, char **argv)
{
extern nsfb_surface_rtns_t sdl_rtns;
extern nsfb_surface_rtns_t ram_rtns;
_nsfb_register_surface(NSFB_SURFACE_SDL, &sdl_rtns, "sdl");
_nsfb_register_surface(NSFB_SURFACE_RAM, &ram_rtns, "ram");
const char *fename;
enum nsfb_type_e fetype;
nsfb_t *nsfb;
nsfb_t *bmp;
nsfb_event_t event;
int waitloop = 3;
 
nsfb_bbox_t box;
nsfb_bbox_t box2;
nsfb_bbox_t box3;
uint8_t *fbptr;
int fbstride;
const char *dumpfile = NULL;
 
__menuet__debug_out("Init..\n");
 
if (argc < 2) {
fename="sdl";
} else {
fename = argv[1];
if (argc >= 3) {
dumpfile = argv[2];
}
}
 
fetype = nsfb_type_from_name(fename);
if (fetype == NSFB_SURFACE_NONE) {
fprintf(stderr, "Unable to convert \"%s\" to nsfb surface type\n", fename);
return 1;
}
 
nsfb = nsfb_new(fetype);
if (nsfb == NULL) {
fprintf(stderr, "Unable to allocate \"%s\" nsfb surface\n", fename);
return 2;
}
 
if (nsfb_init(nsfb) == -1) {
fprintf(stderr, "Unable to initialise nsfb surface\n");
nsfb_free(nsfb);
return 4;
}
 
__menuet__debug_out("New ram surface...\n");
 
bmp = nsfb_new(NSFB_SURFACE_RAM);
if (bmp == NULL) {
__menuet__debug_out("No ram surface :D ..\n");
return 5;
}
__menuet__debug_out("Oh shit :D ..\n");
nsfb_set_geometry(bmp, nsglobe.width, nsglobe.height, NSFB_FMT_ABGR8888);
nsfb_init(bmp);
nsfb_get_buffer(bmp, &fbptr, &fbstride);
 
memcpy(fbptr, nsglobe.pixel_data, nsglobe.width * nsglobe.height * 4);
 
/* get the geometry of the whole screen */
box.x0 = box.y0 = 0;
nsfb_get_geometry(nsfb, &box.x1, &box.y1, NULL);
 
/* claim the whole screen for update */
nsfb_claim(nsfb, &box);
 
nsfb_plot_clg(nsfb, 0xffffffff);
 
box3.x0 = 0;
box3.y0 = 0;
box3.x1 = 132;
box3.y1 = 135;
 
nsfb_plot_copy(bmp, &box3, nsfb, &box3);
 
box3.x0 = 132;
box3.y0 = 135;
box3.x1 = box3.x0 + 264;
box3.y1 = box3.y0 + 135;
 
nsfb_plot_copy(bmp, &box3, nsfb, &box3);
 
box3.x0 = 396;
box3.y0 = 270;
box3.x1 = box3.x0 + 264;
box3.y1 = box3.y0 + 270;
 
nsfb_plot_copy(bmp, &box3, nsfb, &box3);
 
box2.x0 = 64;
box2.y0 = 64;
box2.x1 = 128;
box2.y1 = 128;
 
box3.x0 = 270;
box3.y0 = 270;
box3.x1 = box3.x0 + 64;
box3.y1 = box3.y0 + 64;
 
nsfb_plot_copy(nsfb, &box2, nsfb, &box3);
 
nsfb_update(nsfb, &box);
 
/* wait for quit event or timeout */
while (waitloop > 0) {
if (nsfb_event(nsfb, &event, 1000) == false) {
break;
}
if (event.type == NSFB_EVENT_CONTROL) {
if (event.value.controlcode == NSFB_CONTROL_TIMEOUT) {
/* timeout */
waitloop--;
} else if (event.value.controlcode == NSFB_CONTROL_QUIT) {
break;
}
}
}
 
//dump(nsfb, dumpfile);
 
nsfb_free(bmp);
 
nsfb_free(nsfb);
 
return 0;
}
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/test/bitmap.map
0,0 → 1,1593
Archive member included because of file (symbol)
 
/home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o) (SDL_RemoveTimer)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o) (SDL_GetTicks)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o) (SDL_PushEvent)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (SDL_CheckKeyRepeat)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (SDL_MouseInit)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_quit.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (SDL_QuitInit)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o) (SDL_MoveCursor)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o) (SDL_MapRGB)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o) (SDL_UnRLESurface)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o) (SDL_LockSurface)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (current_video)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o) (mosvideo_bootstrab)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o) (SDL_Quit)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o) (SDL_ClearError)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o) (SDL_InstallParachute)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_getenv.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o) (SDL_getenv)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o) (SDL_AudioQuit)
/home/sourcerer/kos_src/me//lib/libSDL.a(init.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o) (InitSound)
/home/sourcerer/kos_src/me//lib/libSDL.a(setbuf.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o) (SetBuffer)
/home/sourcerer/kos_src/me//lib/libSDL.a(stopbuf.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o) (StopBuffer)
/home/sourcerer/kos_src/me//lib/libSDL.a(sndgetsize.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o) (GetBufferSize)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o) (SDL_mutexP)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o) (SDL_DestroySemaphore)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (SDL_ThreadID)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_thread.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (SDL_WaitThread)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_active.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (SDL_AppActiveInit)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_resize.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o) (SDL_PrivateResize)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o) (SDL_CalculateBlit)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o) (SDL_CalculateBlitN)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o) (MenuetOS_InitOSKeymap)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o) (SDL_CalculateBlit0)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o) (SDL_CalculateBlit1)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o) (SDL_CalculateAlphaBlit)
/home/sourcerer/kos_src/me//lib/libc.a(dup.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o) (dup)
/home/sourcerer/kos_src/me//lib/libc.a(fdopen.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o) (fdopen)
/home/sourcerer/kos_src/me//lib/libc.a(debug.o)
bitmap.o (__menuet__debug_out)
/home/sourcerer/kos_src/me//lib/libc.a(window.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o) (__menuet__define_window)
/home/sourcerer/kos_src/me//lib/libc.a(param.o)
/home/sourcerer/kos_src/me//stub/crt0.o (__menuet__app_param_area)
/home/sourcerer/kos_src/me//lib/libc.a(keyb.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o) (__menuet__getkey)
/home/sourcerer/kos_src/me//lib/libc.a(image.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o) (__menuet__putimage)
/home/sourcerer/kos_src/me//lib/libc.a(exit.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o) (__menuet__sys_exit)
/home/sourcerer/kos_src/me//lib/libc.a(event.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o) (__menuet__check_for_event)
/home/sourcerer/kos_src/me//lib/libc.a(delay.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o) (__menuet__delay100)
/home/sourcerer/kos_src/me//lib/libc.a(button.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o) (__menuet__get_button_id)
/home/sourcerer/kos_src/me//lib/libc.a(setmode.o)
/home/sourcerer/kos_src/me//lib/libc.a(fdopen.o) (__setmode)
/home/sourcerer/kos_src/me//lib/libc.a(fmode.o)
/home/sourcerer/kos_src/me//lib/libc.a(fdopen.o) (_fmode)
/home/sourcerer/kos_src/me//lib/libc.a(crt1.o)
/home/sourcerer/kos_src/me//stub/crt0.o (__crt1_startup)
/home/sourcerer/kos_src/me//lib/libc.a(crt0.o)
/home/sourcerer/kos_src/me//lib/libc.a(crt1.o) (__crt0_setup_arguments)
/home/sourcerer/kos_src/me//lib/libc.a(brk.o)
/home/sourcerer/kos_src/me//lib/libc.a(crt1.o) (init_brk)
/home/sourcerer/kos_src/me//lib/libc.a(strdup.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o) (strdup)
/home/sourcerer/kos_src/me//lib/libc.a(memset.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o) (memset)
/home/sourcerer/kos_src/me//lib/libc.a(memmove.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o) (memmove)
/home/sourcerer/kos_src/me//lib/libc.a(strncpy.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o) (strncpy)
/home/sourcerer/kos_src/me//lib/libc.a(strncmp.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o) (strncmp)
/home/sourcerer/kos_src/me//lib/libc.a(strlen.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o) (strlen)
/home/sourcerer/kos_src/me//lib/libc.a(strcpy.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o) (strcpy)
/home/sourcerer/kos_src/me//lib/libc.a(strcmp.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o) (strcmp)
/home/sourcerer/kos_src/me//lib/libc.a(memcpy.o)
bitmap.o (memcpy)
/home/sourcerer/kos_src/me//lib/libc.a(memcmp.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o) (memcmp)
/home/sourcerer/kos_src/me//lib/libc.a(malloc.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o) (free)
/home/sourcerer/kos_src/me//lib/libc.a(exit.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o) (exit)
/home/sourcerer/kos_src/me//lib/libc.a(calloc.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o) (calloc)
/home/sourcerer/kos_src/me//lib/libc.a(abs.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o) (abs)
/home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o) (vsprintf)
/home/sourcerer/kos_src/me//lib/libc.a(stderr.o)
bitmap.o (__dj_stderr)
/home/sourcerer/kos_src/me//lib/libc.a(sprintf.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o) (sprintf)
/home/sourcerer/kos_src/me//lib/libc.a(fprintf.o)
bitmap.o (fprintf)
/home/sourcerer/kos_src/me//lib/libc.a(fflush.o)
/home/sourcerer/kos_src/me//lib/libc.a(fprintf.o) (fflush)
/home/sourcerer/kos_src/me//lib/libc.a(fclose.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o) (fclose)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
/home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o) (_doprnt)
/home/sourcerer/kos_src/me//lib/libc.a(allocfil.o)
/home/sourcerer/kos_src/me//lib/libc.a(fdopen.o) (__alloc_file)
/home/sourcerer/kos_src/me//lib/libc.a(modfl.o)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o) (__modfl)
/home/sourcerer/kos_src/me//lib/libc.a(lconv.o)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o) (localeconv)
/home/sourcerer/kos_src/me//lib/libc.a(errno.o)
/home/sourcerer/kos_src/me//lib/libc.a(brk.o) (errno)
/home/sourcerer/kos_src/me//lib/libc.a(ct_flags.o)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o) (__dj_ctype_flags)
/home/sourcerer/kos_src/me//lib/libc.a(debug.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o) (__libclog_vprintf)
/home/sourcerer/kos_src/me//lib/libc.a(write.o)
/home/sourcerer/kos_src/me//lib/libc.a(fflush.o) (write)
/home/sourcerer/kos_src/me//lib/libc.a(lseek.o)
/home/sourcerer/kos_src/me//lib/libc.a(fdopen.o) (lseek)
/home/sourcerer/kos_src/me//lib/libc.a(close.o)
/home/sourcerer/kos_src/me//lib/libc.a(fclose.o) (close)
/home/sourcerer/kos_src/me//lib/libc.a(emu_init.o)
/home/sourcerer/kos_src/me//lib/libc.a(crt1.o) (dosemu_inithandles)
/home/sourcerer/kos_src/me//lib/libc.a(dosemu.o)
/home/sourcerer/kos_src/me//lib/libc.a(lseek.o) (dosemu_lseek)
/home/sourcerer/kos_src/me//lib/libc.a(_main.o)
/home/sourcerer/kos_src/me//lib/libc.a(crt1.o) (__main)
/home/sourcerer/kos_src/me//lib/libc.a(strrchr.o)
/home/sourcerer/kos_src/me//lib/libc.a(emu_init.o) (strrchr)
/home/sourcerer/kos_src/me//lib/libc.a(memchr.o)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o) (memchr)
/home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o)
/home/sourcerer/kos_src/me//lib/libc.a(stderr.o) (__stdio_cleanup_proc)
/home/sourcerer/kos_src/me//lib/libc.a(remove.o)
/home/sourcerer/kos_src/me//lib/libc.a(fclose.o) (remove)
/home/sourcerer/kos_src/me//lib/libc.a(putc.o)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o) (putc)
/home/sourcerer/kos_src/me//lib/libc.a(fwalk.o)
/home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o) (_fwalk)
/home/sourcerer/kos_src/me//lib/libc.a(frlist.o)
/home/sourcerer/kos_src/me//lib/libc.a(allocfil.o) (__file_rec_list)
/home/sourcerer/kos_src/me//lib/libc.a(fputc.o)
/home/sourcerer/kos_src/me//lib/libc.a(putc.o) (fputc)
/home/sourcerer/kos_src/me//lib/libc.a(flsbuf.o)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o) (_flsbuf)
/home/sourcerer/kos_src/me//lib/libc.a(hooks.o)
/home/sourcerer/kos_src/me//lib/libc.a(fputc.o) (__libc_write_termios_hook)
/home/sourcerer/kos_src/me//lib/libc.a(fixpath.o)
/home/sourcerer/kos_src/me//lib/libc.a(dosemu.o) (_fixpath)
/home/sourcerer/kos_src/me//lib/libc.a(systree.o)
/home/sourcerer/kos_src/me//lib/libc.a(remove.o) (__kolibri__system_tree_access2)
/home/sourcerer/kos_src/me//lib/libc.a(dosio.o)
/home/sourcerer/kos_src/me//lib/libc.a(fputc.o) (__file_handle_modes)
/home/sourcerer/kos_src/me//lib/libc.a(curdir.o)
/home/sourcerer/kos_src/me//lib/libc.a(fixpath.o) (__libc_combine_path)
/home/sourcerer/kos_src/me//lib/libc.a(stdout.o)
/home/sourcerer/kos_src/me//lib/libc.a(frlist.o) (__dj_stdout)
/home/sourcerer/kos_src/me//lib/libc.a(stdin.o)
/home/sourcerer/kos_src/me//lib/libc.a(frlist.o) (__dj_stdin)
 
Memory Configuration
 
Name Origin Length Attributes
*default* 0x0000000000000000 0xffffffffffffffff
 
Linker script and memory map
 
 
.text 0x0000000000000000 0x34f98
0x0000000000000000 code = .
0x0000000000000000 _code = .
*(.text)
.text 0x0000000000000000 0x24 /home/sourcerer/kos_src/me//stub/crt0.o
0x0000000000000000 __menuet__app_header
0x0000000000000000 start
0x0000000000000014 __menuet__memsize
.text 0x0000000000000024 0x0 bitmap.o
.text 0x0000000000000024 0x0 nsglobe.o
.text 0x0000000000000024 0x2a4 /home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
0x0000000000000024 nsfb_cursor_init
0x000000000000006f nsfb_cursor_set
0x00000000000000da nsfb_cursor_loc_set
0x000000000000011c nsfb_cursor_loc_get
0x0000000000000145 nsfb_cursor_plot
0x000000000000026a nsfb_cursor_clear
.text 0x00000000000002c8 0xbd /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
0x00000000000002c8 nsfb_dump
*fill* 0x0000000000000385 0x3 00
.text 0x0000000000000388 0x1a9 /home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
0x0000000000000388 nsfb_new
0x00000000000003d6 nsfb_init
0x00000000000003e5 nsfb_free
0x000000000000041f nsfb_event
0x000000000000042e nsfb_claim
0x000000000000043d nsfb_update
0x000000000000044c nsfb_set_geometry
0x0000000000000488 nsfb_set_parameters
0x00000000000004dc nsfb_get_geometry
0x000000000000050d nsfb_get_buffer
*fill* 0x0000000000000531 0x3 00
.text 0x0000000000000534 0x1ca /home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
0x0000000000000534 nsfb_palette_free
0x0000000000000567 nsfb_palette_new
0x00000000000005e0 nsfb_palette_dither_init
0x0000000000000623 nsfb_palette_dither_fini
0x0000000000000635 nsfb_palette_generate_nsfb_8bpp
*fill* 0x00000000000006fe 0x2 00
.text 0x0000000000000700 0x9df /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
*fill* 0x00000000000010df 0x1 00
.text 0x00000000000010e0 0x894 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
.text 0x0000000000001974 0x96e /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
*fill* 0x00000000000022e2 0x2 00
.text 0x00000000000022e4 0xcfb /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
*fill* 0x0000000000002fdf 0x1 00
.text 0x0000000000002fe0 0x1b6 /home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
0x0000000000002fe0 nsfb_plot_set_clip
0x0000000000002fef nsfb_plot_get_clip
0x0000000000002ffe nsfb_plot_clg
0x000000000000300c nsfb_plot_rectangle
0x000000000000301b nsfb_plot_rectangle_fill
0x000000000000302a nsfb_plot_line
0x0000000000003044 nsfb_plot_lines
0x0000000000003053 nsfb_plot_polylines
0x0000000000003062 nsfb_plot_polygon
0x0000000000003071 nsfb_plot_arc
0x0000000000003080 nsfb_plot_point
0x000000000000308f nsfb_plot_ellipse
0x000000000000309e nsfb_plot_ellipse_fill
0x00000000000030ad nsfb_plot_copy
0x000000000000312d nsfb_plot_bitmap
0x000000000000313c nsfb_plot_glyph8
0x000000000000314b nsfb_plot_glyph1
0x000000000000315a nsfb_plot_readrect
0x0000000000003169 nsfb_plot_cubic_bezier
0x0000000000003178 nsfb_plot_quadratic_bezier
0x0000000000003187 nsfb_plot_path
*fill* 0x0000000000003196 0x2 00
.text 0x0000000000003198 0x10d5 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
0x0000000000004165 select_plotters
*fill* 0x000000000000426d 0x3 00
.text 0x0000000000004270 0x466 /home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
0x0000000000004270 nsfb_plot_clip
0x000000000000439c nsfb_plot_clip_ctx
0x00000000000043ae nsfb_plot_clip_line
0x0000000000004638 nsfb_plot_clip_line_ctx
0x000000000000464a nsfb_plot_add_rect
0x00000000000046a5 nsfb_plot_bbox_intersect
*fill* 0x00000000000046d6 0x2 00
.text 0x00000000000046d8 0x3b /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
*fill* 0x0000000000004713 0x1 00
.text 0x0000000000004714 0x36 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
*fill* 0x000000000000474a 0x2 00
.text 0x000000000000474c 0x112 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
*fill* 0x000000000000485e 0x2 00
.text 0x0000000000004860 0x579 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
*fill* 0x0000000000004dd9 0x3 00
.text 0x0000000000004ddc 0x169 /home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
0x0000000000004e1f _nsfb_register_surface
0x0000000000004e52 nsfb_surface_get_rtns
0x0000000000004f08 nsfb_type_from_name
*fill* 0x0000000000004f45 0x3 00
.text 0x0000000000004f48 0x3fd /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
0x0000000000004f54 SDL_RemoveTimer
0x0000000000004fcd SDL_SetTimerThreaded
0x0000000000004ffd SDL_AddTimer
0x00000000000050ca SDL_SetTimer
0x0000000000005194 SDL_ThreadedTimerCheck
0x00000000000052a2 SDL_TimerQuit
0x00000000000052f2 SDL_TimerInit
*fill* 0x0000000000005345 0x3 00
.text 0x0000000000005348 0x67 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o)
0x0000000000005348 SDL_StartTicks
0x0000000000005360 SDL_GetTicks
0x000000000000537c SDL_SYS_TimerInit
0x0000000000005383 SDL_SYS_TimerQuit
0x0000000000005388 SDL_SYS_StartTimer
0x000000000000538f SDL_SYS_StopTimer
0x0000000000005394 SDL_Delay
*fill* 0x00000000000053af 0x1 00
.text 0x00000000000053b0 0x682 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
0x00000000000053b0 SDL_EventThreadID
0x00000000000053ba SDL_GetEventFilter
0x00000000000053c4 SDL_PumpEvents
0x00000000000053f1 SDL_PeepEvents
0x0000000000005611 SDL_PushEvent
0x0000000000005627 SDL_PrivateSysWMEvent
0x0000000000005685 SDL_WaitEvent
0x00000000000056cf SDL_PollEvent
0x00000000000056ea SDL_EventState
0x000000000000579e SDL_SetEventFilter
0x00000000000057c5 SDL_Unlock_EventThread
0x00000000000057f4 SDL_Lock_EventThread
0x00000000000058d4 SDL_StopEventLoop
0x0000000000005941 SDL_StartEventLoop
*fill* 0x0000000000005a32 0x2 00
.text 0x0000000000005a34 0xc2f /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
0x0000000000005a34 SDL_EnableUNICODE
0x0000000000005a4b SDL_GetKeyState
0x0000000000005a62 SDL_GetModState
0x0000000000005a6c SDL_SetModState
0x0000000000005a79 SDL_GetKeyName
0x0000000000005a98 SDL_CheckKeyRepeat
0x0000000000005a9d SDL_EnableKeyRepeat
0x0000000000005ae9 SDL_KeyboardInit
0x0000000000006446 SDL_PrivateKeyboard
0x0000000000006611 SDL_ResetKeyboard
*fill* 0x0000000000006663 0x1 00
.text 0x0000000000006664 0x3fb /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o)
0x0000000000006664 SDL_MouseInit
0x0000000000006696 SDL_GetMouseState
0x00000000000066c0 SDL_GetRelativeMouseState
0x0000000000006747 SDL_PrivateMouseButton
0x00000000000068d5 SDL_PrivateMouseMotion
*fill* 0x0000000000006a5f 0x1 00
.text 0x0000000000006a60 0x4d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_quit.o)
0x0000000000006a60 SDL_QuitInit
0x0000000000006a67 SDL_PrivateQuit
*fill* 0x0000000000006aad 0x3 00
.text 0x0000000000006ab0 0xfb3 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
0x0000000000006ab0 SDL_GetCursor
0x0000000000006aba SDL_CursorPaletteChanged
0x0000000000006ac9 SDL_MouseRect
0x0000000000006b5a SDL_ResetCursor
0x0000000000006b93 SDL_EraseCursorNoLock
0x0000000000006cf9 SDL_EraseCursor
0x0000000000006d86 SDL_DrawCursorNoLock
0x00000000000073fa SDL_DrawCursor
0x0000000000007487 SDL_MoveCursor
0x0000000000007526 SDL_WarpMouse
0x000000000000758f SDL_SetCursor
0x00000000000076f9 SDL_ShowCursor
0x0000000000007792 SDL_FreeCursor
0x0000000000007818 SDL_CreateCursor
0x0000000000007990 SDL_CursorInit
0x00000000000079e7 SDL_CursorQuit
*fill* 0x0000000000007a63 0x1 00
.text 0x0000000000007a64 0xc8e /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o)
0x0000000000007a64 SDL_DitherColors
0x0000000000007ad1 SDL_CalculatePitch
0x0000000000007b0a SDL_FindColor
0x0000000000007b82 SDL_MapRGB
0x0000000000007bf4 SDL_MapRGBA
0x0000000000007c82 SDL_GetRGBA
0x0000000000007d95 SDL_GetRGB
0x0000000000007e59 SDL_ApplyGamma
0x0000000000007eab SDL_InvalidateMap
0x0000000000007ee5 SDL_FormatChanged
0x0000000000007efd SDL_FreeBlitMap
0x0000000000007f3b SDL_FreeFormat
0x000000000000806c SDL_MapSurface
0x000000000000832e SDL_AllocBlitMap
0x00000000000083a0 SDL_AllocFormat
0x00000000000086ae SDL_ReallocFormat
*fill* 0x00000000000086f2 0x2 00
.text 0x00000000000086f4 0x39e4 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
0x00000000000086f4 SDL_RLEBlit
0x000000000000a7df SDL_RLEAlphaBlit
0x000000000000b65a SDL_UnRLESurface
0x000000000000b859 SDL_RLESurface
.text 0x000000000000c0d8 0xd19 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
0x000000000000c0d8 SDL_SetClipRect
0x000000000000c193 SDL_GetClipRect
0x000000000000c1b1 SDL_LockSurface
0x000000000000c208 SDL_FreeSurface
0x000000000000c2d4 SDL_UnlockSurface
0x000000000000c320 SDL_FillRect
0x000000000000c5c1 SDL_LowerBlit
0x000000000000c62d SDL_UpperBlit
0x000000000000c7e4 SDL_SetAlpha
0x000000000000c8fa SDL_SetColorKey
0x000000000000c9c5 SDL_CreateRGBSurface
0x000000000000cb98 SDL_ConvertSurface
0x000000000000cd94 SDL_CreateRGBSurfaceFrom
*fill* 0x000000000000cdf1 0x3 00
.text 0x000000000000cdf4 0x18ea /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
0x000000000000cdf4 SDL_GetVideoSurface
0x000000000000ce0b SDL_GetVideoInfo
0x000000000000ce1f SDL_ListModes
0x000000000000ce53 SDL_GL_SwapBuffers
0x000000000000ce75 SDL_GL_UpdateRectsLock
0x000000000000ce7a SDL_GL_UpdateRects
0x000000000000ce7f SDL_GL_Lock
0x000000000000ce84 SDL_GL_Unlock
0x000000000000ce89 SDL_WM_GetCaption
0x000000000000ceb7 SDL_WM_GrabInput
0x000000000000cf69 SDL_WM_IconifyWindow
0x000000000000cf8c SDL_WM_ToggleFullScreen
0x000000000000d02e SDL_GetWMInfo
0x000000000000d058 SDL_VideoModeOK
0x000000000000d12f SDL_WM_SetIcon
0x000000000000d362 SDL_WM_SetCaption
0x000000000000d436 SDL_GL_GetAttribute
0x000000000000d473 SDL_GL_SetAttribute
0x000000000000d507 SDL_GL_GetProcAddress
0x000000000000d54a SDL_GL_LoadLibrary
0x000000000000d57f SDL_VideoQuit
0x000000000000d6db SDL_UpdateRects
0x000000000000d8a5 SDL_UpdateRect
0x000000000000da5a SDL_SetPalette
0x000000000000dbc6 SDL_SetColors
0x000000000000dbe1 SDL_Flip
0x000000000000dcb8 SDL_DisplayFormat
0x000000000000dd03 SDL_DisplayFormatAlpha
0x000000000000dddb SDL_SetVideoMode
0x000000000000e44a SDL_VideoDriverName
0x000000000000e480 SDL_VideoInit
*fill* 0x000000000000e6de 0x2 00
.text 0x000000000000e6e0 0x6bc /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
0x000000000000e6e0 get_skinh
0x000000000000e70c MenuetOS_SetColors
0x000000000000e713 MenuetOS_VideoQuit
0x000000000000e73f MenuetOS_FinalQuit
0x000000000000e744 MenuetOS_SetCaption
0x000000000000e7b4 KolibriOS_FreeWMCursor
0x000000000000e7ca KolibriOS_CheckMouseMode
0x000000000000e9df KolibriOS_ShowWMCursor
0x000000000000ea63 KolibriOS_CreateWMCursor
0x000000000000ec00 MenuetOS_SDL_RepaintWnd
0x000000000000ec94 MenuetOS_SetVideoMode
.text 0x000000000000ed9c 0x1a8 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
0x000000000000ed9c SDL_WasInit
0x000000000000edb2 SDL_Linked_Version
0x000000000000edbc SDL_QuitSubSystem
0x000000000000ee0f SDL_Quit
0x000000000000ee28 SDL_InitSubSystem
0x000000000000ef0a SDL_Init
.text 0x000000000000ef44 0x4d4 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
0x000000000000ef44 SDL_ClearError
0x000000000000ef53 SDL_GetErrorMsgUNICODE
0x000000000000f1e1 SDL_GetErrorMsg
0x000000000000f248 SDL_GetError
0x000000000000f25f SDL_printf
0x000000000000f2bb SDL_SetError
0x000000000000f3cb SDL_Error
.text 0x000000000000f418 0x28 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o)
0x000000000000f418 SDL_InstallParachute
0x000000000000f41d SDL_UninstallParachute
0x000000000000f422 SDL_printf_error
.text 0x000000000000f440 0x179 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_getenv.o)
0x000000000000f440 SDL_getenv
0x000000000000f4b2 SDL_putenv
*fill* 0x000000000000f5b9 0x3 00
.text 0x000000000000f5bc 0xad6 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
0x000000000000f5bc SDL_AudioQuit
0x000000000000f5c1 SDL_PauseAudio
0x000000000000f603 SDL_LockAudio
0x000000000000f635 SDL_UnlockAudio
0x000000000000f644 SDL_CloseAudio
0x000000000000f6a0 SDL_OpenAudio
0x000000000001000c SDL_AudioDriverName
0x000000000001003c SDL_AudioInit
*fill* 0x0000000000010092 0xe 00
.text 0x00000000000100a0 0xbf /home/sourcerer/kos_src/me//lib/libSDL.a(init.o)
0x00000000000100a0 InitSound
0x0000000000010104 CreateBuffer
0x0000000000010134 DestroyBuffer
*fill* 0x000000000001015f 0x1 00
.text 0x0000000000010160 0x57 /home/sourcerer/kos_src/me//lib/libSDL.a(setbuf.o)
0x0000000000010160 SetBuffer
0x000000000001018c PlayBuffer
*fill* 0x00000000000101b7 0x9 00
.text 0x00000000000101c0 0x2b /home/sourcerer/kos_src/me//lib/libSDL.a(stopbuf.o)
0x00000000000101c0 StopBuffer
*fill* 0x00000000000101eb 0x5 00
.text 0x00000000000101f0 0x2e /home/sourcerer/kos_src/me//lib/libSDL.a(sndgetsize.o)
0x00000000000101f0 GetBufferSize
*fill* 0x000000000001021e 0x2 00
.text 0x0000000000010220 0x99 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o)
0x0000000000010220 SDL_mutexP
0x0000000000010227 SDL_mutexV
0x000000000001022e SDL_DestroyMutex
0x0000000000010260 SDL_CreateMutex
*fill* 0x00000000000102b9 0x3 00
.text 0x00000000000102bc 0x74 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
0x00000000000102bc SDL_DestroySemaphore
0x00000000000102c1 SDL_SemValue
0x00000000000102c8 SDL_SemPost
0x00000000000102dd SDL_SemWait
0x00000000000102f2 SDL_SemWaitTimeout
0x0000000000010307 SDL_SemTryWait
0x000000000001031c SDL_CreateSemaphore
.text 0x0000000000010330 0x2b /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
0x0000000000010330 SDL_SYS_SetupThread
0x0000000000010335 SDL_ThreadID
0x000000000001033c SDL_SYS_WaitThread
0x0000000000010341 SDL_SYS_KillThread
0x0000000000010346 SDL_SYS_CreateThread
*fill* 0x000000000001035b 0x1 00
.text 0x000000000001035c 0x39a /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_thread.o)
0x000000000001035c SDL_GetThreadID
0x00000000000103e2 SDL_WaitThread
0x0000000000010422 SDL_KillThread
0x000000000001044b SDL_GetErrBuf
0x00000000000104b6 SDL_RunThread
0x00000000000104fd SDL_ThreadsQuit
0x0000000000010524 SDL_ThreadsInit
0x000000000001054f SDL_CreateThread
*fill* 0x00000000000106f6 0x2 00
.text 0x00000000000106f8 0xbf /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_active.o)
0x00000000000106f8 SDL_AppActiveInit
0x0000000000010706 SDL_GetAppState
0x0000000000010710 SDL_PrivateAppActive
*fill* 0x00000000000107b7 0x1 00
.text 0x00000000000107b8 0xb9 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_resize.o)
0x00000000000107b8 SDL_PrivateResize
*fill* 0x0000000000010871 0x3 00
.text 0x0000000000010874 0x524 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
0x00000000000109e3 SDL_CalculateBlit
.text 0x0000000000010d98 0x4fa8 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
0x0000000000015bcc SDL_CalculateBlitN
.text 0x0000000000015d40 0x2e4 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
0x0000000000015d40 MenuetOS_InitOSKeymap
0x0000000000015d58 kol_event_wait_time
0x0000000000015d69 MenuetOS_PumpEvents
.text 0x0000000000016024 0xa1f /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
0x000000000001693f SDL_CalculateBlit0
*fill* 0x0000000000016a43 0x1 00
.text 0x0000000000016a44 0x1f10 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
0x00000000000188f9 SDL_CalculateBlit1
.text 0x0000000000018954 0x44a5 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
0x000000000001cc90 SDL_CalculateAlphaBlit
*fill* 0x000000000001cdf9 0x3 00
.text 0x000000000001cdfc 0x8 /home/sourcerer/kos_src/me//lib/libc.a(dup.o)
0x000000000001cdfc dup
.text 0x000000000001ce04 0x123 /home/sourcerer/kos_src/me//lib/libc.a(fdopen.o)
0x000000000001ce04 fdopen
*fill* 0x000000000001cf27 0x1 00
.text 0x000000000001cf28 0x1f /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
0x000000000001cf28 __menuet__debug_out
*fill* 0x000000000001cf47 0x1 00
.text 0x000000000001cf48 0x43 /home/sourcerer/kos_src/me//lib/libc.a(window.o)
0x000000000001cf48 __menuet__define_window
0x000000000001cf7a __menuet__window_redraw
*fill* 0x000000000001cf8b 0x1 00
.text 0x000000000001cf8c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(param.o)
.text 0x000000000001cf8c 0x17 /home/sourcerer/kos_src/me//lib/libc.a(keyb.o)
0x000000000001cf8c __menuet__getkey
*fill* 0x000000000001cfa3 0x1 00
.text 0x000000000001cfa4 0x2b /home/sourcerer/kos_src/me//lib/libc.a(image.o)
0x000000000001cfa4 __menuet__putimage
*fill* 0x000000000001cfcf 0x1 00
.text 0x000000000001cfd0 0xa /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
0x000000000001cfd0 __menuet__sys_exit
*fill* 0x000000000001cfda 0x2 00
.text 0x000000000001cfdc 0x29 /home/sourcerer/kos_src/me//lib/libc.a(event.o)
0x000000000001cfdc __menuet__wait_for_event
0x000000000001cfe8 __menuet__check_for_event
0x000000000001cff4 __menuet__set_bitfield_for_wanted_events
*fill* 0x000000000001d005 0x3 00
.text 0x000000000001d008 0x24 /home/sourcerer/kos_src/me//lib/libc.a(delay.o)
0x000000000001d008 __menuet__delay100
0x000000000001d019 __menuet(int, double, long,...)
.text 0x000000000001d02c 0x48 /home/sourcerer/kos_src/me//lib/libc.a(button.o)
0x000000000001d02c __menuet__make_button
0x000000000001d05c __menuet__get_button_id
.text 0x000000000001d074 0x7 /home/sourcerer/kos_src/me//lib/libc.a(setmode.o)
0x000000000001d074 __setmode
*fill* 0x000000000001d07b 0x1 00
.text 0x000000000001d07c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fmode.o)
.text 0x000000000001d07c 0x43 /home/sourcerer/kos_src/me//lib/libc.a(crt1.o)
0x000000000001d07c __crt1_startup
*fill* 0x000000000001d0bf 0x1 00
.text 0x000000000001d0c0 0x148 /home/sourcerer/kos_src/me//lib/libc.a(crt0.o)
0x000000000001d0c0 _exit
0x000000000001d14b __crt0_setup_arguments
.text 0x000000000001d208 0x163 /home/sourcerer/kos_src/me//lib/libc.a(brk.o)
0x000000000001d208 init_brk
0x000000000001d25c sbrk
*fill* 0x000000000001d36b 0x1 00
.text 0x000000000001d36c 0x3e /home/sourcerer/kos_src/me//lib/libc.a(strdup.o)
0x000000000001d36c strdup
*fill* 0x000000000001d3aa 0x2 00
.text 0x000000000001d3ac 0x3d /home/sourcerer/kos_src/me//lib/libc.a(memset.o)
0x000000000001d3ac memset
*fill* 0x000000000001d3e9 0x3 00
.text 0x000000000001d3ec 0x26 /home/sourcerer/kos_src/me//lib/libc.a(memmove.o)
0x000000000001d3ec memmove
*fill* 0x000000000001d412 0x2 00
.text 0x000000000001d414 0x21 /home/sourcerer/kos_src/me//lib/libc.a(strncpy.o)
0x000000000001d414 strncpy
*fill* 0x000000000001d435 0x3 00
.text 0x000000000001d438 0x25 /home/sourcerer/kos_src/me//lib/libc.a(strncmp.o)
0x000000000001d438 strncmp
*fill* 0x000000000001d45d 0x3 00
.text 0x000000000001d460 0x16 /home/sourcerer/kos_src/me//lib/libc.a(strlen.o)
0x000000000001d460 strlen
*fill* 0x000000000001d476 0x2 00
.text 0x000000000001d478 0x19 /home/sourcerer/kos_src/me//lib/libc.a(strcpy.o)
0x000000000001d478 strcpy
*fill* 0x000000000001d491 0x3 00
.text 0x000000000001d494 0x1f /home/sourcerer/kos_src/me//lib/libc.a(strcmp.o)
0x000000000001d494 strcmp
*fill* 0x000000000001d4b3 0x1 00
.text 0x000000000001d4b4 0x2b /home/sourcerer/kos_src/me//lib/libc.a(memcpy.o)
0x000000000001d4b4 memcpy
*fill* 0x000000000001d4df 0x1 00
.text 0x000000000001d4e0 0x35 /home/sourcerer/kos_src/me//lib/libc.a(memcmp.o)
0x000000000001d4e0 memcmp
*fill* 0x000000000001d515 0x3 00
.text 0x000000000001d518 0x373 /home/sourcerer/kos_src/me//lib/libc.a(malloc.o)
0x000000000001d518 free
0x000000000001d657 malloc
0x000000000001d829 realloc
*fill* 0x000000000001d88b 0x1 00
.text 0x000000000001d88c 0x23 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
0x000000000001d88c exit
*fill* 0x000000000001d8af 0x1 00
.text 0x000000000001d8b0 0x34 /home/sourcerer/kos_src/me//lib/libc.a(calloc.o)
0x000000000001d8b0 calloc
.text 0x000000000001d8e4 0xd /home/sourcerer/kos_src/me//lib/libc.a(abs.o)
0x000000000001d8e4 abs
*fill* 0x000000000001d8f1 0x3 00
.text 0x000000000001d8f4 0x31 /home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o)
0x000000000001d8f4 vsprintf
*fill* 0x000000000001d925 0x3 00
.text 0x000000000001d928 0x4 /home/sourcerer/kos_src/me//lib/libc.a(stderr.o)
.text 0x000000000001d92c 0x32 /home/sourcerer/kos_src/me//lib/libc.a(sprintf.o)
0x000000000001d92c sprintf
*fill* 0x000000000001d95e 0x2 00
.text 0x000000000001d960 0x82 /home/sourcerer/kos_src/me//lib/libc.a(fprintf.o)
0x000000000001d960 fprintf
*fill* 0x000000000001d9e2 0x2 00
.text 0x000000000001d9e4 0xad /home/sourcerer/kos_src/me//lib/libc.a(fflush.o)
0x000000000001d9e4 fflush
*fill* 0x000000000001da91 0x3 00
.text 0x000000000001da94 0xb4 /home/sourcerer/kos_src/me//lib/libc.a(fclose.o)
0x000000000001da94 fclose
.text 0x000000000001db48 0x1517 /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
0x000000000001dd31 _doprnt
*fill* 0x000000000001f05f 0x1 00
.text 0x000000000001f060 0x9a /home/sourcerer/kos_src/me//lib/libc.a(allocfil.o)
0x000000000001f064 __alloc_file
*fill* 0x000000000001f0fa 0x2 00
.text 0x000000000001f0fc 0x2c /home/sourcerer/kos_src/me//lib/libc.a(modfl.o)
0x000000000001f0fc __modfl
.text 0x000000000001f128 0xa /home/sourcerer/kos_src/me//lib/libc.a(lconv.o)
0x000000000001f128 localeconv
*fill* 0x000000000001f132 0x2 00
.text 0x000000000001f134 0xa /home/sourcerer/kos_src/me//lib/libc.a(errno.o)
0x000000000001f134 __isatty
*fill* 0x000000000001f13e 0x2 00
.text 0x000000000001f140 0x0 /home/sourcerer/kos_src/me//lib/libc.a(ct_flags.o)
.text 0x000000000001f140 0x8b /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
0x000000000001f140 __libclog_vprintf
0x000000000001f1a5 __libclog_printf
*fill* 0x000000000001f1cb 0x1 00
.text 0x000000000001f1cc 0xc /home/sourcerer/kos_src/me//lib/libc.a(write.o)
0x000000000001f1cc write
.text 0x000000000001f1d8 0xc /home/sourcerer/kos_src/me//lib/libc.a(lseek.o)
0x000000000001f1d8 lseek
.text 0x000000000001f1e4 0xc /home/sourcerer/kos_src/me//lib/libc.a(close.o)
0x000000000001f1e4 close
.text 0x000000000001f1f0 0x70 /home/sourcerer/kos_src/me//lib/libc.a(emu_init.o)
0x000000000001f1f0 dosemu_inithandles
0x000000000001f235 init_dir_stack
.text 0x000000000001f260 0x5b3 /home/sourcerer/kos_src/me//lib/libc.a(dosemu.o)
0x000000000001f260 dosemu_file_exists
0x000000000001f2af dosemu_createtrunc
0x000000000001f2fa dosemu_getiostruct
0x000000000001f31f dosemu_allochandle
0x000000000001f33f dosemu_freehandle
0x000000000001f35b dosemu_fileread
0x000000000001f3b2 dosemu_filewrite
0x000000000001f414 dosemu_iosize
0x000000000001f445 dosemu_filesize
0x000000000001f494 dosemu_tell
0x000000000001f4bf dosemu_lseek
0x000000000001f51d dosemu_read
0x000000000001f596 dosemu_write
0x000000000001f5cb dosemu_close
0x000000000001f602 _dosemu_flush
0x000000000001f607 dosemu_truncate
0x000000000001f691 dosemu_open
*fill* 0x000000000001f813 0x1 00
.text 0x000000000001f814 0x39 /home/sourcerer/kos_src/me//lib/libc.a(_main.o)
0x000000000001f814 __main
*fill* 0x000000000001f84d 0x3 00
.text 0x000000000001f850 0x24 /home/sourcerer/kos_src/me//lib/libc.a(strrchr.o)
0x000000000001f850 strrchr
.text 0x000000000001f874 0x22 /home/sourcerer/kos_src/me//lib/libc.a(memchr.o)
0x000000000001f874 memchr
*fill* 0x000000000001f896 0x2 00
.text 0x000000000001f898 0x3f /home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o)
0x000000000001f898 __stdio_cleanup_proc
*fill* 0x000000000001f8d7 0x1 00
.text 0x000000000001f8d8 0x87 /home/sourcerer/kos_src/me//lib/libc.a(remove.o)
0x000000000001f8d8 remove
*fill* 0x000000000001f95f 0x1 00
.text 0x000000000001f960 0xc /home/sourcerer/kos_src/me//lib/libc.a(putc.o)
0x000000000001f960 putc
.text 0x000000000001f96c 0x3f /home/sourcerer/kos_src/me//lib/libc.a(fwalk.o)
0x000000000001f96c _fwalk
*fill* 0x000000000001f9ab 0x1 00
.text 0x000000000001f9ac 0x0 /home/sourcerer/kos_src/me//lib/libc.a(frlist.o)
.text 0x000000000001f9ac 0xb7 /home/sourcerer/kos_src/me//lib/libc.a(fputc.o)
0x000000000001f9ac fputc
*fill* 0x000000000001fa63 0x1 00
.text 0x000000000001fa64 0x148 /home/sourcerer/kos_src/me//lib/libc.a(flsbuf.o)
0x000000000001fa64 _flsbuf
.text 0x000000000001fbac 0x0 /home/sourcerer/kos_src/me//lib/libc.a(hooks.o)
.text 0x000000000001fbac 0x66 /home/sourcerer/kos_src/me//lib/libc.a(fixpath.o)
0x000000000001fbac fix_slashes
0x000000000001fbee _fixpath
*fill* 0x000000000001fc12 0x2 00
.text 0x000000000001fc14 0x22 /home/sourcerer/kos_src/me//lib/libc.a(systree.o)
0x000000000001fc14 __kolibri__system_tree_access
0x000000000001fc25 __kolibri__system_tree_access2
*fill* 0x000000000001fc36 0x2 00
.text 0x000000000001fc38 0x14 /home/sourcerer/kos_src/me//lib/libc.a(dosio.o)
0x000000000001fc38 __file_handle_set
.text 0x000000000001fc4c 0xe9 /home/sourcerer/kos_src/me//lib/libc.a(curdir.o)
0x000000000001fc4c __get_curdir
0x000000000001fcf8 __libc_combine_path
0x000000000001fd21 __chdir
*fill* 0x000000000001fd35 0x3 00
.text 0x000000000001fd38 0x4 /home/sourcerer/kos_src/me//lib/libc.a(stdout.o)
.text 0x000000000001fd3c 0x4 /home/sourcerer/kos_src/me//lib/libc.a(stdin.o)
*(.fixup)
*(.gnu.warning)
*(.gnu.linkonce.t*)
*(.const)
*(.ro*)
.rodata.str1.1
0x000000000001fd40 0xbf bitmap.o
*fill* 0x000000000001fdff 0x1 00
.rodata 0x000000000001fe00 0x11680 nsglobe.o
0x000000000001fe00 nsglobe
.rodata.str1.1
0x0000000000031480 0x2f /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
0x31 (size before relaxing)
*fill* 0x00000000000314af 0x1 00
.rodata 0x00000000000314b0 0x50 /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
0x00000000000314b0 _nsfb_16bpp_plotters
.rodata 0x0000000000031500 0x50 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
0x0000000000031500 _nsfb_32bpp_xbgr8888_plotters
.rodata 0x0000000000031550 0x50 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
0x0000000000031550 _nsfb_32bpp_xrgb8888_plotters
.rodata 0x00000000000315a0 0x50 /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
0x00000000000315a0 _nsfb_8bpp_plotters
.rodata 0x00000000000315f0 0x20 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
.rodata.cst4 0x0000000000031610 0x10 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
.rodata.str1.1
0x0000000000031620 0x5 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
*fill* 0x0000000000031625 0x3 00
.rodata 0x0000000000031628 0x24 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
0x0000000000031628 able_rtns
.rodata.str1.1
0x000000000003164c 0x6 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
*fill* 0x0000000000031652 0x2 00
.rodata 0x0000000000031654 0x24 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
0x0000000000031654 linux_rtns
.rodata.str1.1
0x0000000000000000 0x4 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.rodata 0x0000000000031678 0x24 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
0x0000000000031678 ram_rtns
.rodata.str1.1
0x000000000003169c 0x31 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
0x35 (size before relaxing)
*fill* 0x00000000000316cd 0x3 00
.rodata 0x00000000000316d0 0x24 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
0x00000000000316d0 sdl_rtns
.rodata.str1.1
0x00000000000316f4 0x9e /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
.rodata.str1.1
0x0000000000031792 0x1a /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
.rodata.str1.1
0x00000000000317ac 0x567 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
0x5b3 (size before relaxing)
*fill* 0x0000000000031d13 0x1 00
.rodata 0x0000000000031d14 0x70 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
.rodata.str1.1
0x0000000000031d84 0x2a /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
*fill* 0x0000000000031dae 0x2 00
.rodata 0x0000000000031db0 0x10 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
.rodata.str1.1
0x0000000000031dc0 0x67 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
.rodata.str1.1
0x0000000000031e27 0x19d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
.rodata 0x0000000000031fc4 0x38 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
.rodata.str1.1
0x0000000000031ffc 0x20 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
.rodata.str1.1
0x000000000003201c 0x65 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
.rodata.str1.1
0x0000000000032081 0x8e /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
0x91 (size before relaxing)
.rodata.str1.1
0x000000000003210f 0x192 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
.rodata.str1.1
0x00000000000322a1 0x27 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
.rodata.str1.1
0x00000000000322c8 0x2b /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
.rodata.str1.1
0x00000000000322f3 0x1f /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
*fill* 0x0000000000032312 0x2 00
.rodata 0x0000000000032314 0x2350 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
.rodata 0x0000000000034664 0x600 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
.rodata 0x0000000000034c64 0x28 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
.rodata 0x0000000000034c8c 0x140 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
.rodata 0x0000000000034dcc 0x1c /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
.rodata.str1.1
0x0000000000034de8 0x2a /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
*fill* 0x0000000000034e12 0xe 00
.rodata 0x0000000000034e20 0x13c /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
.rodata.cst4 0x0000000000034f5c 0x10 /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
0x14 (size before relaxing)
*fill* 0x0000000000034f6c 0x4 00
.rodata.cst16 0x0000000000034f70 0x20 /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
.rodata.cst8 0x0000000000034f90 0x8 /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
*(.gnu.linkonce.r*)
0x0000000000034f98 ecode = .
0x0000000000034f98 _ecode = .
 
.iplt 0x0000000000034fa0 0x0
.iplt 0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
 
.text.startup 0x0000000000034f98 0x34e
.text.startup 0x0000000000034f98 0x2de bitmap.o
0x0000000000034f98 main
.text.startup 0x0000000000035276 0x1c /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
.text.startup 0x0000000000035292 0x1c /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
.text.startup 0x00000000000352ae 0x1c /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.text.startup 0x00000000000352ca 0x1c /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
 
.rel.dyn 0x00000000000352e8 0x0
.rel.iplt 0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
.rel.text 0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
.rel.text.startup
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
.rel.rodata 0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
.rel.data 0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
 
.rdata
 
.data 0x00000000000352f0 0x201c
0x00000000000352f0 djgpp_first_ctor = .
*(.ctor)
*(.ctors)
0x00000000000352f0 djgpp_last_ctor = .
0x00000000000352f0 djgpp_first_dtor = .
*(.dtor)
*(.dtors)
0x00000000000352f0 djgpp_last_dtor = .
*(.gcc_exc*)
0x00000000000352f0 __EH_FRAME_BEGIN__ = .
*(.eh_fram*)
.eh_frame 0x00000000000352f0 0x5c bitmap.o
.eh_frame 0x000000000003534c 0x120 /home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
0x138 (size before relaxing)
.eh_frame 0x000000000003546c 0x2c /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
0x44 (size before relaxing)
.eh_frame 0x0000000000035498 0x170 /home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
0x188 (size before relaxing)
.eh_frame 0x0000000000035608 0xc4 /home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
0xdc (size before relaxing)
.eh_frame 0x00000000000356cc 0x1b0 /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
0x1c8 (size before relaxing)
.eh_frame 0x000000000003587c 0x16c /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
0x184 (size before relaxing)
.eh_frame 0x00000000000359e8 0x1ac /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
0x1c4 (size before relaxing)
.eh_frame 0x0000000000035b94 0x1cc /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
0x1e4 (size before relaxing)
.eh_frame 0x0000000000035d60 0x2bc /home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
0x2d4 (size before relaxing)
.eh_frame 0x000000000003601c 0x3d4 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
0x3ec (size before relaxing)
.eh_frame 0x00000000000363f0 0xec /home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
0x104 (size before relaxing)
.eh_frame 0x00000000000364dc 0xa0 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
0xb8 (size before relaxing)
.eh_frame 0x000000000003657c 0x100 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
0x118 (size before relaxing)
.eh_frame 0x000000000003667c 0xd8 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
0xf0 (size before relaxing)
.eh_frame 0x0000000000036754 0x1b0 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
0x1c8 (size before relaxing)
.eh_frame 0x0000000000036904 0x118 /home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
0x130 (size before relaxing)
0x0000000000036a1c __EH_FRAME_END__ = .
0x0000000000036a1c 0x4 LONG 0x0
*(.gnu.linkonce.d*)
*(.rodata)
*(.rodata.*)
*(.data)
.data 0x0000000000036a20 0x0 bitmap.o
.data 0x0000000000036a20 0x0 nsglobe.o
.data 0x0000000000036a20 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
.data 0x0000000000036a20 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
.data 0x0000000000036a20 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
.data 0x0000000000036a20 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
.data 0x0000000000036a20 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
.data 0x0000000000036a20 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
.data 0x0000000000036a20 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
.data 0x0000000000036a20 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
.data 0x0000000000036a20 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
.data 0x0000000000036a20 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
.data 0x0000000000036a20 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
.data 0x0000000000036a20 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
.data 0x0000000000036a20 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
.data 0x0000000000036a20 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.data 0x0000000000036a20 0x50c /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
0x0000000000036a20 sdl_nsfb_map
.data 0x0000000000036f2c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
.data 0x0000000000036f2c 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
.data 0x0000000000036f2c 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o)
.data 0x0000000000036f2c 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
.data 0x0000000000036f2c 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
.data 0x0000000000036f2c 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o)
.data 0x0000000000036f2c 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_quit.o)
.data 0x0000000000036f2c 0x44 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
.data 0x0000000000036f70 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o)
.data 0x0000000000036f70 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
.data 0x0000000000036f70 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
.data 0x0000000000036f70 0x20 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
.data 0x0000000000036f90 0x24 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
0x0000000000036f90 def_title
0x0000000000036fa4 mosvideo_bootstrab
.data 0x0000000000036fb4 0x3 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
*fill* 0x0000000000036fb7 0x1 00
.data 0x0000000000036fb8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
.data 0x0000000000036fb8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o)
.data 0x0000000000036fb8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_getenv.o)
.data 0x0000000000036fb8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
*fill* 0x0000000000036fb8 0x8 00
.data 0x0000000000036fc0 0x17 /home/sourcerer/kos_src/me//lib/libSDL.a(init.o)
0x0000000000036fc0 hSound
0x0000000000036fc4 hrdwSound
*fill* 0x0000000000036fd7 0x1 00
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_thread.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_active.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_resize.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dup.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fdopen.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(window.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(param.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(keyb.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(image.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(event.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(delay.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(button.o)
.data 0x0000000000036fd8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(setmode.o)
.data 0x0000000000036fd8 0x4 /home/sourcerer/kos_src/me//lib/libc.a(fmode.o)
0x0000000000036fd8 _fmode
.data 0x0000000000036fdc 0x4 /home/sourcerer/kos_src/me//lib/libc.a(crt1.o)
0x0000000000036fdc __bss_count
.data 0x0000000000036fe0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(crt0.o)
.data 0x0000000000036fe0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(brk.o)
.data 0x0000000000036fe0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strdup.o)
.data 0x0000000000036fe0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memset.o)
.data 0x0000000000036fe0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memmove.o)
.data 0x0000000000036fe0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strncpy.o)
.data 0x0000000000036fe0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strncmp.o)
.data 0x0000000000036fe0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strlen.o)
.data 0x0000000000036fe0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strcpy.o)
.data 0x0000000000036fe0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strcmp.o)
.data 0x0000000000036fe0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memcpy.o)
.data 0x0000000000036fe0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memcmp.o)
.data 0x0000000000036fe0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(malloc.o)
.data 0x0000000000036fe0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.data 0x0000000000036fe0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(calloc.o)
.data 0x0000000000036fe0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(abs.o)
.data 0x0000000000036fe0 0x0 /home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o)
.data 0x0000000000036fe0 0x24 /home/sourcerer/kos_src/me//lib/libc.a(stderr.o)
0x0000000000036fe0 __dj_stderr
.data 0x0000000000037004 0x0 /home/sourcerer/kos_src/me//lib/libc.a(sprintf.o)
.data 0x0000000000037004 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fprintf.o)
.data 0x0000000000037004 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fflush.o)
.data 0x0000000000037004 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fclose.o)
.data 0x0000000000037004 0xb /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
*fill* 0x000000000003700f 0x1 00
.data 0x0000000000037010 0x0 /home/sourcerer/kos_src/me//lib/libc.a(allocfil.o)
.data 0x0000000000037010 0x0 /home/sourcerer/kos_src/me//lib/libc.a(modfl.o)
.data 0x0000000000037010 0x33 /home/sourcerer/kos_src/me//lib/libc.a(lconv.o)
*fill* 0x0000000000037043 0x1 00
.data 0x0000000000037044 0x0 /home/sourcerer/kos_src/me//lib/libc.a(errno.o)
.data 0x0000000000037044 0x202 /home/sourcerer/kos_src/me//lib/libc.a(ct_flags.o)
0x0000000000037044 __dj_ctype_flags
*fill* 0x0000000000037246 0x2 00
.data 0x0000000000037248 0x0 /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.data 0x0000000000037248 0x0 /home/sourcerer/kos_src/me//lib/libc.a(write.o)
.data 0x0000000000037248 0x0 /home/sourcerer/kos_src/me//lib/libc.a(lseek.o)
.data 0x0000000000037248 0x0 /home/sourcerer/kos_src/me//lib/libc.a(close.o)
.data 0x0000000000037248 0x0 /home/sourcerer/kos_src/me//lib/libc.a(emu_init.o)
.data 0x0000000000037248 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dosemu.o)
.data 0x0000000000037248 0x4 /home/sourcerer/kos_src/me//lib/libc.a(_main.o)
.data 0x000000000003724c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strrchr.o)
.data 0x000000000003724c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memchr.o)
.data 0x000000000003724c 0x4 /home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o)
0x000000000003724c __stdio_cleanup_hook
.data 0x0000000000037250 0x0 /home/sourcerer/kos_src/me//lib/libc.a(remove.o)
.data 0x0000000000037250 0x0 /home/sourcerer/kos_src/me//lib/libc.a(putc.o)
.data 0x0000000000037250 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fwalk.o)
.data 0x0000000000037250 0x5c /home/sourcerer/kos_src/me//lib/libc.a(frlist.o)
0x0000000000037250 __file_rec_list
.data 0x00000000000372ac 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fputc.o)
.data 0x00000000000372ac 0x0 /home/sourcerer/kos_src/me//lib/libc.a(flsbuf.o)
.data 0x00000000000372ac 0x0 /home/sourcerer/kos_src/me//lib/libc.a(hooks.o)
.data 0x00000000000372ac 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fixpath.o)
.data 0x00000000000372ac 0x0 /home/sourcerer/kos_src/me//lib/libc.a(systree.o)
.data 0x00000000000372ac 0x18 /home/sourcerer/kos_src/me//lib/libc.a(dosio.o)
0x00000000000372ac __file_handle_modes
.data 0x00000000000372c4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(curdir.o)
.data 0x00000000000372c4 0x24 /home/sourcerer/kos_src/me//lib/libc.a(stdout.o)
0x00000000000372c4 __dj_stdout
.data 0x00000000000372e8 0x24 /home/sourcerer/kos_src/me//lib/libc.a(stdin.o)
0x00000000000372e8 __dj_stdin
0x000000000003730c edata = .
0x000000000003730c _edata = .
0x000000000003730c bss = .
 
.igot.plt 0x000000000003730c 0x0
.igot.plt 0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
 
.init_array 0x000000000003730c 0x10
.init_array 0x000000000003730c 0x4 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
.init_array 0x0000000000037310 0x4 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
.init_array 0x0000000000037314 0x4 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.init_array 0x0000000000037318 0x4 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
 
.bss 0x000000000003731c 0x20230
*(.bss)
.bss 0x000000000003731c 0x10000 /home/sourcerer/kos_src/me//stub/crt0.o
.bss 0x000000000004731c 0x0 bitmap.o
.bss 0x000000000004731c 0x0 nsglobe.o
.bss 0x000000000004731c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
.bss 0x000000000004731c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
.bss 0x000000000004731c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
.bss 0x000000000004731c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
.bss 0x000000000004731c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
.bss 0x000000000004731c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
.bss 0x000000000004731c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
.bss 0x000000000004731c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
.bss 0x000000000004731c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
.bss 0x000000000004731c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
.bss 0x000000000004731c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
.bss 0x000000000004731c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
.bss 0x000000000004731c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
.bss 0x000000000004731c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.bss 0x000000000004731c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
.bss 0x000000000004731c 0xc4 /home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
.bss 0x00000000000473e0 0x24 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
0x00000000000473e0 SDL_timer_started
0x00000000000473e4 SDL_timer_running
0x00000000000473e8 SDL_alarm_interval
0x00000000000473ec SDL_alarm_callback
.bss 0x0000000000047404 0x4 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o)
.bss 0x0000000000047408 0xe4c /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
0x0000000000047408 SDL_EventOK
0x000000000004740c SDL_ProcessEvents
.bss 0x0000000000048254 0x678 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
0x0000000000048254 SDL_TranslateUNICODE
0x0000000000048258 SDL_KeyRepeat
.bss 0x00000000000488cc 0xa /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o)
*fill* 0x00000000000488d6 0x2 00
.bss 0x00000000000488d8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_quit.o)
.bss 0x00000000000488d8 0x18 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
0x00000000000488d8 SDL_cursorstate
0x00000000000488dc SDL_cursor
0x00000000000488e0 SDL_cursorlock
.bss 0x00000000000488f0 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o)
.bss 0x00000000000488f0 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
.bss 0x00000000000488f0 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
.bss 0x00000000000488f0 0x4 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
0x00000000000488f0 current_video
.bss 0x00000000000488f4 0x10 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
.bss 0x0000000000048904 0x8 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
.bss 0x000000000004890c 0xb08 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
.bss 0x0000000000049414 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o)
.bss 0x0000000000049414 0x4 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_getenv.o)
.bss 0x0000000000049418 0x4438 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
0x0000000000049418 audio_thread_stack
.bss 0x000000000004d850 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o)
.bss 0x000000000004d850 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
.bss 0x000000000004d850 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
.bss 0x000000000004d850 0x31c /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_thread.o)
0x000000000004d850 _creating_thread_lock
.bss 0x000000000004db6c 0x1 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_active.o)
*fill* 0x000000000004db6d 0x3 00
.bss 0x000000000004db70 0x8 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_resize.o)
.bss 0x000000000004db78 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
.bss 0x000000000004db78 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
.bss 0x000000000004db78 0xc /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
.bss 0x000000000004db84 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
.bss 0x000000000004db84 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
.bss 0x000000000004db84 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
.bss 0x000000000004db84 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dup.o)
.bss 0x000000000004db84 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fdopen.o)
.bss 0x000000000004db84 0x0 /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.bss 0x000000000004db84 0x0 /home/sourcerer/kos_src/me//lib/libc.a(window.o)
.bss 0x000000000004db84 0x800 /home/sourcerer/kos_src/me//lib/libc.a(param.o)
0x000000000004db84 __menuet__app_param_area
0x000000000004df84 __menuet__app_path_area
.bss 0x000000000004e384 0x0 /home/sourcerer/kos_src/me//lib/libc.a(keyb.o)
.bss 0x000000000004e384 0x0 /home/sourcerer/kos_src/me//lib/libc.a(image.o)
.bss 0x000000000004e384 0x0 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.bss 0x000000000004e384 0x0 /home/sourcerer/kos_src/me//lib/libc.a(event.o)
.bss 0x000000000004e384 0x0 /home/sourcerer/kos_src/me//lib/libc.a(delay.o)
.bss 0x000000000004e384 0x0 /home/sourcerer/kos_src/me//lib/libc.a(button.o)
.bss 0x000000000004e384 0x4 /home/sourcerer/kos_src/me//lib/libc.a(setmode.o)
0x000000000004e384 __setmode_stdio_hook
.bss 0x000000000004e388 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fmode.o)
.bss 0x000000000004e388 0x14 /home/sourcerer/kos_src/me//lib/libc.a(crt1.o)
0x000000000004e388 __crt0_argc
0x000000000004e38c __crt0_argv
0x000000000004e390 __dos_argv0
0x000000000004e394 _crt0_startup_flags
0x000000000004e398 environ
.bss 0x000000000004e39c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(crt0.o)
.bss 0x000000000004e39c 0x18 /home/sourcerer/kos_src/me//lib/libc.a(brk.o)
.bss 0x000000000004e3b4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strdup.o)
.bss 0x000000000004e3b4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memset.o)
.bss 0x000000000004e3b4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memmove.o)
.bss 0x000000000004e3b4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strncpy.o)
.bss 0x000000000004e3b4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strncmp.o)
.bss 0x000000000004e3b4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strlen.o)
.bss 0x000000000004e3b4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strcpy.o)
.bss 0x000000000004e3b4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strcmp.o)
.bss 0x000000000004e3b4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memcpy.o)
.bss 0x000000000004e3b4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memcmp.o)
.bss 0x000000000004e3b4 0x80 /home/sourcerer/kos_src/me//lib/libc.a(malloc.o)
.bss 0x000000000004e434 0x8 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
0x000000000004e434 __atexit_ptr
0x000000000004e438 keypress_at_exit
.bss 0x000000000004e43c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(calloc.o)
.bss 0x000000000004e43c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(abs.o)
.bss 0x000000000004e43c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o)
.bss 0x000000000004e43c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stderr.o)
.bss 0x000000000004e43c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(sprintf.o)
.bss 0x000000000004e43c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fprintf.o)
.bss 0x000000000004e43c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fflush.o)
.bss 0x000000000004e43c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fclose.o)
.bss 0x000000000004e43c 0x4 /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
.bss 0x000000000004e440 0x0 /home/sourcerer/kos_src/me//lib/libc.a(allocfil.o)
.bss 0x000000000004e440 0x0 /home/sourcerer/kos_src/me//lib/libc.a(modfl.o)
.bss 0x000000000004e440 0x0 /home/sourcerer/kos_src/me//lib/libc.a(lconv.o)
.bss 0x000000000004e440 0x4 /home/sourcerer/kos_src/me//lib/libc.a(errno.o)
0x000000000004e440 errno
.bss 0x000000000004e444 0x0 /home/sourcerer/kos_src/me//lib/libc.a(ct_flags.o)
.bss 0x000000000004e444 0x400 /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.bss 0x000000000004e844 0x0 /home/sourcerer/kos_src/me//lib/libc.a(write.o)
.bss 0x000000000004e844 0x0 /home/sourcerer/kos_src/me//lib/libc.a(lseek.o)
.bss 0x000000000004e844 0x0 /home/sourcerer/kos_src/me//lib/libc.a(close.o)
.bss 0x000000000004e844 0x8800 /home/sourcerer/kos_src/me//lib/libc.a(emu_init.o)
0x000000000004e844 _io_handles
0x0000000000056c44 __curdir_buf
.bss 0x0000000000057044 0x100 /home/sourcerer/kos_src/me//lib/libc.a(dosemu.o)
.bss 0x0000000000057144 0x0 /home/sourcerer/kos_src/me//lib/libc.a(_main.o)
.bss 0x0000000000057144 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strrchr.o)
.bss 0x0000000000057144 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memchr.o)
.bss 0x0000000000057144 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o)
.bss 0x0000000000057144 0x0 /home/sourcerer/kos_src/me//lib/libc.a(remove.o)
.bss 0x0000000000057144 0x0 /home/sourcerer/kos_src/me//lib/libc.a(putc.o)
.bss 0x0000000000057144 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fwalk.o)
.bss 0x0000000000057144 0x0 /home/sourcerer/kos_src/me//lib/libc.a(frlist.o)
.bss 0x0000000000057144 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fputc.o)
.bss 0x0000000000057144 0x0 /home/sourcerer/kos_src/me//lib/libc.a(flsbuf.o)
.bss 0x0000000000057144 0x8 /home/sourcerer/kos_src/me//lib/libc.a(hooks.o)
0x0000000000057144 __libc_read_termios_hook
0x0000000000057148 __libc_write_termios_hook
.bss 0x000000000005714c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fixpath.o)
.bss 0x000000000005714c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(systree.o)
.bss 0x000000000005714c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dosio.o)
.bss 0x000000000005714c 0x400 /home/sourcerer/kos_src/me//lib/libc.a(curdir.o)
.bss 0x000000000005754c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stdout.o)
.bss 0x000000000005754c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stdin.o)
*(.note.gnu.build-id)
0x000000000005754c end = .
0x000000000005754c _end = .
LOAD /home/sourcerer/kos_src/me//stub/crt0.o
LOAD bitmap.o
LOAD nsglobe.o
LOAD /home/sourcerer/kos_src/me//lib/libm.a
LOAD /home/sourcerer/kos_src/me//lib/libnsfb.a
LOAD /home/sourcerer/kos_src/me//lib/libSDL.a
LOAD /home/sourcerer/kos_src/me//lib/libc.a
OUTPUT(bitmap elf32-i386)
 
.comment 0x0000000000000000 0x38
.comment 0x0000000000000000 0x1c bitmap.o
0x1d (size before relaxing)
.comment 0x0000000000000000 0x1d nsglobe.o
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
.comment 0x000000000000001c 0x1c /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
0x1d (size before relaxing)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_quit.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_getenv.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_thread.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_active.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_resize.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(dup.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fdopen.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(window.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(param.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(keyb.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(image.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(event.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(delay.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(button.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(setmode.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fmode.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(crt1.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(crt0.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(brk.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strdup.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strncpy.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strncmp.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strlen.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strcpy.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strcmp.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(memcpy.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(memcmp.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(malloc.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(calloc.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(abs.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(stderr.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(sprintf.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fprintf.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fflush.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fclose.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(allocfil.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(lconv.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(errno.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(ct_flags.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(write.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(lseek.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(close.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(emu_init.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(dosemu.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(_main.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strrchr.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(memchr.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(remove.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(putc.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fwalk.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(frlist.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fputc.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(flsbuf.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(hooks.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fixpath.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(systree.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(dosio.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(curdir.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(stdout.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(stdin.o)
 
.note.GNU-stack
0x0000000000000000 0x0
.note.GNU-stack
0x0000000000000000 0x0 bitmap.o
.note.GNU-stack
0x0000000000000000 0x0 nsglobe.o
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_quit.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_getenv.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_thread.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_active.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_resize.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dup.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fdopen.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(window.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(param.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(keyb.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(image.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(event.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(delay.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(button.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(setmode.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fmode.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(crt1.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(crt0.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(brk.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strdup.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strncpy.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strncmp.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strlen.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strcpy.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strcmp.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memcpy.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memcmp.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(malloc.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(calloc.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(abs.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stderr.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(sprintf.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fprintf.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fflush.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fclose.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(allocfil.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(lconv.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(errno.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(ct_flags.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(write.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(lseek.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(close.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(emu_init.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dosemu.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(_main.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strrchr.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memchr.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(remove.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(putc.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fwalk.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(frlist.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fputc.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(flsbuf.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(hooks.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fixpath.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(systree.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dosio.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(curdir.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stdout.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stdin.o)
/contrib/network/netsurf/libnsfb/test/frontend.c
0,0 → 1,72
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>
 
#include "libnsfb.h"
#include "libnsfb_event.h"
 
int main(int argc, char **argv)
{
nsfb_t *nsfb;
const char *fename;
enum nsfb_type_e fetype;
nsfb_event_t event;
 
int waitloop = 3;
 
if (argc < 2) {
fename="sdl";
} else {
fename = argv[1];
}
 
fetype = nsfb_type_from_name(fename);
if (fetype == NSFB_SURFACE_NONE) {
fprintf(stderr, "Unable to convert \"%s\" to nsfb surface type\n", fename);
return 1;
}
 
nsfb = nsfb_new(fetype);
if (nsfb == NULL) {
fprintf(stderr, "Unable to allocate \"%s\" nsfb surface\n", fename);
return 2;
}
 
if (nsfb_set_geometry(nsfb, 0, 0, NSFB_FMT_ANY) == -1) {
fprintf(stderr, "Unable to set surface geometry\n");
nsfb_free(nsfb);
return 3;
}
 
if (nsfb_init(nsfb) == -1) {
fprintf(stderr, "Unable to initialise nsfb surface\n");
nsfb_free(nsfb);
return 4;
}
 
/* wait for quit event or timeout */
while (waitloop > 0) {
if (nsfb_event(nsfb, &event, 1000) == false) {
break;
}
if (event.type == NSFB_EVENT_CONTROL) {
if (event.value.controlcode == NSFB_CONTROL_TIMEOUT) {
/* timeout */
waitloop--;
} else if (event.value.controlcode == NSFB_CONTROL_QUIT) {
break;
}
}
}
 
nsfb_free(nsfb);
return 0;
}
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/test/nsglobe.c
0,0 → 1,2933
/* GIMP RGBA C-Source image dump (nnglobe.c) */
 
const struct {
unsigned int width;
unsigned int height;
unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */
unsigned char pixel_data[132 * 135 * 4 + 1];
} nsglobe = {
132, 135, 4,
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\17$0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\4\12\15\377\24.=\377\36Qn\3773x\236\377G\211\253\377\\\301\370\377\\\301"
"\370\377\201\324\367\377|\326\377\377z\325\377\377z\325\377\377z\325\377"
"\377x\324\377\377v\323\377\377v\323\377\377o\317\377\377Z\277\367\377Z\277"
"\367\377G\211\253\3773x\236\377\36Qn\377\17$0\377\4\12\15\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\10\24\32\377\31Fb\377G\211\253\377|\326\377\377\211\334"
"\377\377\207\333\377\377\207\333\377\377\207\333\377\377\177\330\377\377"
"~\327\377\377~\327\377\377~\327\377\377~\327\377\377|\326\377\377z\325\377"
"\377z\325\377\377x\324\377\377v\323\377\377t\322\377\377t\322\377\377t\322"
"\377\377t\322\377\377o\317\377\377o\317\377\377k\315\377\377k\315\377\377"
"k\315\377\377Z\277\367\377G\211\253\377\36Qn\377\10\27\40\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\25<S\377A\202\244\377\203\316\353\377\216"
"\336\377\377\213\336\377\377\213\336\377\377\204\323\364\377\216\336\377"
"\377\207\333\377\377\207\333\377\377\207\333\377\377\201\324\367\377\204"
"\332\377\377~\327\377\377\177\330\377\377~\327\377\377|\326\377\377z\325"
"\377\377z\325\377\377x\324\377\377v\323\377\377t\322\377\377t\322\377\377"
"t\322\377\377l\316\377\377o\317\377\377o\317\377\377o\317\377\377o\317\377"
"\377h\314\377\377h\314\377\377e\312\377\377e\312\377\377e\312\377\377\\\301"
"\370\377>\211\263\377\25<S\377\3\4\6\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\17$0\3773x\236\377\201\313\347\377\222\341\377\377\222"
"\341\377\377\216\336\377\377\216\336\377\377\215\336\377\377\213\336\377"
"\377\213\336\377\377\211\334\377\377\207\333\377\377\207\333\377\377\207"
"\333\377\377\207\333\377\377\204\332\377\377~\327\377\377\177\330\377\377"
"~\327\377\377~\327\377\377|\326\377\377z\325\377\377z\325\377\377x\324\377"
"\377v\323\377\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377o\317"
"\377\377o\317\377\377k\315\377\377k\315\377\377h\314\377\377h\314\377\377"
"e\312\377\377e\312\377\377c\311\377\377c\311\377\377c\311\377\377Z\277\367"
"\3773x\236\377\24.=\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\4\12\15\377\36Qn\377\201\313\347\377\227\343"
"\377\377\222\341\377\377\222\341\377\377\222\341\377\377\222\341\377\377"
"\222\341\377\377\216\336\377\377\215\336\377\377\215\336\377\377\213\336"
"\377\377\213\336\377\377\213\336\377\377\207\333\377\377\207\333\377\377"
"\207\333\377\377\204\332\377\377\204\332\377\377\204\332\377\377~\327\377"
"\377~\327\377\377|\326\377\377z\325\377\377z\325\377\377x\324\377\377v\323"
"\377\377v\323\377\377t\322\377\377t\322\377\377l\316\377\377l\316\377\377"
"t\322\377\377l\316\377\377k\315\377\377k\315\377\377h\314\377\377h\314\377"
"\377e\312\377\377e\312\377\377c\311\377\377a\310\377\377a\310\377\377]\306"
"\377\377]\306\377\377D\271\376\377\35Wz\377\6\16\24\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\4\12\15\377\35Wz\377\203\316\353\377\231\344\376\377\231"
"\344\376\377\227\343\377\377\227\343\377\377\227\343\377\377\222\341\377"
"\377\222\341\377\377\222\341\377\377\222\341\377\377\215\336\377\377\215"
"\336\377\377\215\336\377\377\215\336\377\377\213\336\377\377\207\333\377"
"\377\211\334\377\377\207\333\377\377\207\333\377\377\204\332\377\377\177"
"\330\377\377\204\332\377\377~\327\377\377~\327\377\377|\326\377\377z\325"
"\377\377z\325\377\377x\324\377\377x\324\377\377t\322\377\377v\323\377\377"
"l\316\377\377l\316\377\377o\317\377\377l\316\377\377k\315\377\377k\315\377"
"\377k\315\377\377h\314\377\377e\312\377\377e\312\377\377c\311\377\377c\311"
"\377\377c\311\377\377_\307\377\377]\306\377\377]\306\377\377]\304\375\377"
"\\\301\370\3773x\236\377\10\24\32\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\6\16\24\3773x\236\377\204\323\364"
"\377\234\346\376\377\234\346\376\377\231\344\376\377\231\344\376\377\231"
"\344\376\377\227\343\377\377\222\341\377\377\225\343\377\377\222\341\377"
"\377\223\342\377\377\222\341\377\377\222\341\377\377\222\341\377\377\215"
"\336\377\377\211\334\377\377\213\336\377\377\213\336\377\377\211\334\377"
"\377\207\333\377\377\207\333\377\377\204\332\377\377\204\332\377\377~\327"
"\377\377\200\330\377\377~\327\377\377|\326\377\377|\326\377\377z\325\377"
"\377x\324\377\377v\323\377\377v\323\377\377t\322\377\377t\322\377\377t\322"
"\377\377t\322\377\377t\322\377\377k\315\377\377l\316\377\377h\314\377\377"
"h\314\377\377h\314\377\377e\312\377\377c\311\377\377c\311\377\377_\307\377"
"\377_\307\377\377_\307\377\377]\306\377\377]\304\375\377W\303\377\377V\302"
"\377\377T\301\376\3773x\236\377\10\24\32\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\25<S\377\203\316\353\377\241\350\377\377\241\350\377"
"\377\234\346\376\377\234\346\376\377\234\346\376\377\231\344\376\377\231"
"\344\376\377\231\344\376\377\231\344\376\377\225\343\377\377\225\343\377"
"\377\222\341\377\377\222\341\377\377\222\341\377\377\222\341\377\377\216"
"\336\377\377\216\336\377\377\215\336\377\377\213\336\377\377\211\334\377"
"\377\211\334\377\377\204\332\377\377\207\333\377\377\204\332\377\377~\327"
"\377\377\200\330\377\377\200\330\377\377~\327\377\377|\326\377\377z\325\377"
"\377z\325\377\377x\324\377\377v\323\377\377t\322\377\377t\322\377\377t\322"
"\377\377l\316\377\377t\322\377\377l\316\377\377l\316\377\377k\315\377\377"
"h\314\377\377h\314\377\377h\314\377\377e\312\377\377c\311\377\377_\307\377"
"\377c\311\377\377_\307\377\377]\304\375\377]\304\375\377W\303\377\377W\303"
"\377\377W\303\377\377V\302\377\377N\276\377\377&p\234\377\4\12\15\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\36Qn\377\234\346\376\377\241\350"
"\377\377\241\350\377\377\234\346\376\377\234\346\376\377\234\346\376\377"
"\234\346\376\377\231\344\376\377\231\344\376\377\231\344\376\377\225\343"
"\377\377\225\343\377\377\225\343\377\377\222\341\377\377\222\341\377\377"
"\222\341\377\377\216\336\377\377\215\336\377\377\213\336\377\377\213\336"
"\377\377\211\334\377\377\207\333\377\377\207\333\377\377\204\332\377\377"
"\204\332\377\377\200\330\377\377\200\330\377\377~\327\377\377|\326\377\377"
"z\325\377\377z\325\377\377x\324\377\377v\323\377\377x\324\377\377t\322\377"
"\377t\322\377\377t\322\377\377l\316\377\377l\316\377\377l\316\377\377k\315"
"\377\377h\314\377\377h\314\377\377e\312\377\377e\312\377\377c\311\377\377"
"c\311\377\377_\307\377\377_\307\377\377]\306\377\377]\304\375\377]\306\377"
"\377W\303\377\377W\303\377\377V\302\377\377T\301\376\377T\301\376\377D\266"
"\372\377\25<S\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\3\4\6\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377G\211\253\377"
"\241\350\377\377\241\350\377\377\241\350\377\377\234\346\376\377\241\350"
"\377\377\236\346\377\377\234\346\376\377\234\346\376\377\231\344\376\377"
"\231\344\376\377\231\344\376\377\225\343\377\377\223\342\377\377\223\342"
"\377\377\222\341\377\377\222\341\377\377\215\336\377\377\215\336\377\377"
"\215\336\377\377\213\336\377\377\211\334\377\377\207\333\377\377\207\333"
"\377\377\204\332\377\377\204\332\377\377\200\330\377\377\200\330\377\377"
"\200\330\377\377~\327\377\377~\327\377\377z\325\377\377z\325\377\377x\324"
"\377\377v\323\377\377v\323\377\377t\322\377\377p\320\377\377p\320\377\377"
"o\317\377\377k\315\377\377k\315\377\377k\315\377\377e\312\377\377h\314\377"
"\377c\311\377\377c\311\377\377c\311\377\377c\311\377\377]\306\377\377a\310"
"\377\377]\306\377\377]\304\375\377X\303\377\377V\302\377\377V\302\377\377"
"V\302\377\377T\301\376\377T\301\376\377N\276\377\377G\211\253\377\10\27\40"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\24""5H\377\24.=\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\203\316\353\377\241\350\377\377\241\350\377"
"\377\241\350\377\377\234\346\376\377\241\350\377\377\241\350\377\377\234"
"\346\376\377\234\346\376\377\234\346\376\377\231\344\376\377\231\344\376"
"\377\225\343\377\377\225\343\377\377\223\342\377\377\223\342\377\377\222"
"\341\377\377\222\341\377\377\215\336\377\377\215\336\377\377\213\336\377"
"\377\213\336\377\377\207\333\377\377\207\333\377\377\207\333\377\377\204"
"\332\377\377\205\332\377\377\200\330\377\377\200\330\377\377~\327\377\377"
"|\326\377\377|\326\377\377z\325\377\377x\324\377\377v\323\377\377v\323\377"
"\377t\322\377\377p\320\377\377p\320\377\377o\317\377\377o\317\377\377o\317"
"\377\377k\315\377\377k\315\377\377e\312\377\377h\314\377\377e\312\377\377"
"c\311\377\377c\311\377\377_\307\377\377]\306\377\377]\306\377\377]\304\375"
"\377V\302\377\377V\302\377\377V\302\377\377V\302\377\377T\301\376\377T\301"
"\376\377N\276\377\377N\276\377\377D\266\372\377\36Qn\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\3773x\236\377\234\346\376\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\17$0\377\246\354\377\377\246\354\377\377\241\350\377\377\246\354\377\377"
"\241\350\377\377\241\350\377\377\236\346\377\377\241\350\377\377\241\350"
"\377\377\234\346\376\377\234\346\376\377\231\344\376\377\231\344\376\377"
"\231\344\376\377\225\343\377\377\223\342\377\377\222\341\377\377\222\341"
"\377\377\215\336\377\377\215\336\377\377\215\336\377\377\213\336\377\377"
"\213\336\377\377\211\334\377\377\207\333\377\377\207\333\377\377\200\330"
"\377\377~\327\377\377~\327\377\377~\327\377\377~\327\377\377|\326\377\377"
"z\325\377\377x\324\377\377w\323\377\377v\323\377\377v\323\377\377t\322\377"
"\377p\320\377\377o\317\377\377o\317\377\377k\315\377\377k\315\377\377h\314"
"\377\377h\314\377\377e\312\377\377c\311\377\377c\311\377\377_\307\377\377"
"c\311\377\377]\306\377\377]\306\377\377]\306\377\377X\303\377\377]\304\375"
"\377W\303\377\377V\302\377\377T\301\376\377T\301\376\377N\276\377\377J\274"
"\377\377J\274\377\377J\274\377\3773x\236\377\4\12\15\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\10\24\32\377\201\313\347\377"
"\246\354\377\377G\211\253\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\36"
"Qn\377\246\354\377\377\246\354\377\377\246\354\377\377\241\350\377\377\246"
"\354\377\377\241\350\377\377\241\350\377\377\241\350\377\377\234\346\376"
"\377\234\346\376\377\237\347\377\377\231\344\376\377\225\343\377\377\231"
"\344\376\377\225\343\377\377\223\342\377\377\223\342\377\377\222\341\377"
"\377\222\341\377\377\222\341\377\377\213\336\377\377\213\336\377\377\213"
"\336\377\377\211\334\377\377\207\333\377\377\207\333\377\377\207\333\377"
"\377\207\333\377\377\200\330\377\377\200\330\377\377~\327\377\377|\326\377"
"\377|\326\377\377x\324\377\377w\323\377\377v\323\377\377p\320\377\377p\320"
"\377\377p\320\377\377p\320\377\377o\317\377\377o\317\377\377k\315\377\377"
"h\314\377\377h\314\377\377e\312\377\377e\312\377\377c\311\377\377c\311\377"
"\377_\307\377\377]\306\377\377]\306\377\377]\304\375\377X\303\377\377V\302"
"\377\377W\303\377\377V\302\377\377T\301\376\377T\301\376\377N\276\377\377"
"T\301\376\377Q\277\377\377J\274\377\377I\274\377\377\37\222\335\377\11\33"
"'\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\24.=\377\203\316\353\377\250"
"\355\377\377\250\355\377\377\35Wz\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377G\211\253\377\246\354\377\377\246\354\377\377\246\354\377\377\246\354"
"\377\377\241\350\377\377\243\351\377\377\241\350\377\377\241\350\377\377"
"\241\350\377\377\241\350\377\377\234\346\376\377\234\346\376\377\225\343"
"\377\377\231\344\376\377\231\344\376\377\225\343\377\377\223\342\377\377"
"\222\341\377\377\222\341\377\377\215\336\377\377\215\336\377\377\215\336"
"\377\377\213\336\377\377\213\336\377\377\211\334\377\377\207\333\377\377"
"\204\332\377\377\204\332\377\377~\327\377\377~\327\377\377~\327\377\377|"
"\326\377\377|\326\377\377x\324\377\377w\323\377\377w\323\377\377v\323\377"
"\377t\322\377\377p\320\377\377p\320\377\377o\317\377\377m\316\377\377k\315"
"\377\377h\314\377\377h\314\377\377h\314\377\377e\312\377\377c\311\377\377"
"c\311\377\377_\307\377\377\205\332\377\377\207\333\377\377]\304\375\377]"
"\306\377\377X\303\377\377V\302\377\377V\302\377\377V\302\377\377T\301\376"
"\377N\276\377\377N\276\377\377N\276\377\377T\301\376\377I\274\377\377I\274"
"\377\377D\266\372\377\31Fb\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\25<S\377\241\350"
"\377\377\250\355\377\377\255\357\377\377\250\355\377\377\24.=\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\203\316\353\377\250\355\377\377\246\354\377"
"\377\246\354\377\377\246\354\377\377\246\354\377\377\241\350\377\377\241"
"\350\377\377\241\350\377\377\234\346\376\377\241\350\377\377\237\347\377"
"\377\234\346\376\377\234\346\376\377\231\344\376\377\231\344\376\377\225"
"\343\377\377\223\342\377\377\223\342\377\377\222\341\377\377\222\341\377"
"\377\215\336\377\377\215\336\377\377\213\336\377\377\211\334\377\377\211"
"\334\377\377\207\333\377\377\207\333\377\377\204\332\377\377\204\332\377"
"\377\204\332\377\377~\327\377\377|\326\377\377|\326\377\377|\326\377\377"
"z\325\377\377w\323\377\377v\323\377\377v\323\377\377p\320\377\377p\320\377"
"\377o\317\377\377o\317\377\377k\315\377\377k\315\377\377h\314\377\377e\312"
"\377\377h\314\377\377c\311\377\377c\311\377\377h\314\377\377\370\374\377"
"\377\376\377\377\377t\322\377\377X\303\377\377X\303\377\377X\303\377\377"
"V\302\377\377Q\277\377\377N\276\377\377T\301\376\377T\301\376\377N\276\377"
"\377J\274\377\377J\274\377\377I\274\377\377I\274\377\377I\274\377\377\36"
"Qn\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\36Qn\377\246\354\377\377\250\355\377\377\255\357\377\377"
"\255\357\377\377\241\350\377\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\17$0\377\250\355\377\377\255\357\377\377\250\355\377\377\246\354\377\377"
"\246\354\377\377\246\354\377\377\243\351\377\377\243\351\377\377\243\351"
"\377\377\241\350\377\377\234\346\376\377\237\347\377\377\234\346\376\377"
"\234\346\376\377\231\344\376\377\231\344\376\377\225\343\377\377\225\343"
"\377\377\223\342\377\377\222\341\377\377\222\341\377\377\222\341\377\377"
"\216\336\377\377\213\336\377\377\213\336\377\377\211\334\377\377\207\333"
"\377\377\204\332\377\377\204\332\377\377~\327\377\377\177\330\377\377~\327"
"\377\377~\327\377\377|\326\377\377x\324\377\377w\323\377\377w\323\377\377"
"v\323\377\377s\321\377\377v\323\377\377p\320\377\377o\317\377\377o\317\377"
"\377l\316\377\377k\315\377\377h\314\377\377h\314\377\377e\312\377\377e\312"
"\377\377c\311\377\377\241\350\377\377\376\377\377\377\376\377\377\377\307"
"\363\377\377]\306\377\377X\303\377\377X\303\377\377V\302\377\377V\302\377"
"\377T\301\376\377J\274\377\377N\276\377\377J\274\377\377J\274\377\377J\274"
"\377\377I\274\377\377I\274\377\377D\271\376\377D\271\376\377\32e\225\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\35W"
"z\377\250\355\377\377\250\355\377\377\255\357\377\377\255\357\377\377\255"
"\357\377\377\201\313\347\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\36Q"
"n\377\255\357\377\377\250\355\377\377\255\357\377\377\250\355\377\377\250"
"\355\377\377\246\354\377\377\246\354\377\377\246\354\377\377\243\351\377"
"\377\241\350\377\377\241\350\377\377\237\347\377\377\237\347\377\377\237"
"\347\377\377\231\344\376\377\231\344\376\377\225\343\377\377\225\343\377"
"\377\223\342\377\377\222\341\377\377\222\341\377\377\215\336\377\377\216"
"\336\377\377\215\336\377\377\213\336\377\377\211\334\377\377\207\333\377"
"\377\207\333\377\377\204\332\377\377\207\333\377\377\177\330\377\377~\327"
"\377\377|\326\377\377|\326\377\377|\326\377\377w\323\377\377w\323\377\377"
"v\323\377\377v\323\377\377p\320\377\377p\320\377\377o\317\377\377o\317\377"
"\377l\316\377\377k\315\377\377h\314\377\377e\312\377\377h\314\377\377e\312"
"\377\377h\314\377\377\361\372\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\211\334\377\377X\303\377\377V\302\377\377V\302\377\377V\302"
"\377\377V\302\377\377T\301\376\377T\301\376\377N\276\377\377J\274\377\377"
"J\274\377\377I\274\377\377I\274\377\377G\272\377\377D\271\376\377B\270\376"
"\377&p\234\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377A\202\244"
"\377\250\355\377\377\250\355\377\377\255\357\377\377\255\357\377\377\255"
"\357\377\377\260\360\377\377A\202\244\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377G\211\253\377\255\357\377\377\255\357\377\377\255\357\377\377\250"
"\355\377\377\250\355\377\377\246\354\377\377\246\354\377\377\246\354\377"
"\377\241\350\377\377\243\351\377\377\241\350\377\377\237\347\377\377\237"
"\347\377\377\234\346\376\377\234\346\376\377\225\343\377\377\225\343\377"
"\377\225\343\377\377\225\343\377\377\223\342\377\377\222\341\377\377\222"
"\341\377\377\215\336\377\377\215\336\377\377\215\336\377\377\213\336\377"
"\377\211\334\377\377\207\333\377\377\204\332\377\377\204\332\377\377\177"
"\330\377\377~\327\377\377~\327\377\377~\327\377\377|\326\377\377y\325\377"
"\377x\324\377\377x\324\377\377t\322\377\377s\321\377\377p\320\377\377p\320"
"\377\377o\317\377\377l\316\377\377k\315\377\377h\314\377\377h\314\377\377"
"e\312\377\377e\312\377\377\241\350\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\352\370\377\377]\304\375\377V\302\377\377"
"V\302\377\377V\302\377\377T\301\376\377T\301\376\377J\274\377\377N\276\377"
"\377J\274\377\377J\274\377\377J\274\377\377I\274\377\377H\273\377\377D\271"
"\376\377D\271\376\377D\266\372\3773x\236\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\3773x\236\377\250\355\377\377\255\357\377\377\255\357\377\377\255\357"
"\377\377\255\357\377\377\255\357\377\377\260\360\377\377\255\357\377\377"
"\201\313\347\377G\211\253\377\36Qn\377\17$0\377\202\313\347\377\260\360\377"
"\377\260\360\377\377\255\357\377\377\255\357\377\377\255\357\377\377\250"
"\355\377\377\246\354\377\377\246\354\377\377\246\354\377\377\243\351\377"
"\377\241\350\377\377\237\347\377\377\237\347\377\377\237\347\377\377\234"
"\346\376\377\231\344\376\377\231\344\376\377\225\343\377\377\225\343\377"
"\377\222\341\377\377\222\341\377\377\222\341\377\377\215\336\377\377\215"
"\336\377\377\213\336\377\377\211\334\377\377\211\334\377\377\204\332\377"
"\377\207\333\377\377\204\332\377\377\177\330\377\377~\327\377\377~\327\377"
"\377|\326\377\377|\326\377\377y\325\377\377x\324\377\377t\322\377\377t\322"
"\377\377s\321\377\377p\320\377\377p\320\377\377p\320\377\377l\316\377\377"
"k\315\377\377h\314\377\377h\314\377\377e\312\377\377e\312\377\377\352\370"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\255\357\377\377V\302\377\377V\302\377\377V\302\377\377T"
"\301\376\377T\301\376\377T\301\376\377J\274\377\377J\274\377\377N\276\377"
"\377I\274\377\377k\315\377\377\250\355\377\377w\323\377\377D\271\376\377"
"@\267\377\377B\270\376\377&p\234\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\36Qn\377\246\354\377"
"\377\250\355\377\377\255\357\377\377\255\357\377\377\255\357\377\377\260"
"\360\377\377\260\360\377\377\263\361\377\377\263\361\377\377\263\361\377"
"\377\263\361\377\377\263\361\377\377\263\361\377\377\263\361\377\377\260"
"\360\377\377\260\360\377\377\255\357\377\377\255\357\377\377\255\357\377"
"\377\250\355\377\377\246\354\377\377\246\354\377\377\246\354\377\377\243"
"\351\377\377\243\351\377\377\237\347\377\377\237\347\377\377\237\347\377"
"\377\234\346\376\377\237\347\377\377\231\344\376\377\231\344\376\377\225"
"\343\377\377\225\343\377\377\222\341\377\377\225\343\377\377\215\336\377"
"\377\215\336\377\377\213\336\377\377\211\334\377\377\211\334\377\377\204"
"\332\377\377\207\333\377\377\204\332\377\377\177\330\377\377\204\332\377"
"\377~\327\377\377|\326\377\377|\326\377\377|\326\377\377x\324\377\377x\324"
"\377\377t\322\377\377s\321\377\377p\320\377\377p\320\377\377p\320\377\377"
"l\316\377\377l\316\377\377h\314\377\377h\314\377\377e\312\377\377\231\344"
"\376\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377o\317\377\377X\303\377\377"
"X\303\377\377T\301\376\377T\301\376\377J\274\377\377T\301\376\377]\306\377"
"\377\231\344\376\377\334\366\377\377\376\377\377\377\376\377\377\377\263"
"\361\377\377D\271\376\377D\271\376\377?\267\377\377<\265\376\377\27[\207"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\24""5H\377\241\350\377\377\246\354\377\377\250\355\377\377\250\355\377"
"\377\255\357\377\377\260\360\377\377\260\360\377\377\263\361\377\377\263"
"\361\377\377\263\361\377\377\263\361\377\377\263\361\377\377\263\361\377"
"\377\263\361\377\377\263\361\377\377\263\361\377\377\260\360\377\377\260"
"\360\377\377\255\357\377\377\250\355\377\377\250\355\377\377\246\354\377"
"\377\246\354\377\377\246\354\377\377\243\351\377\377\243\351\377\377\237"
"\347\377\377\237\347\377\377\237\347\377\377\237\347\377\377\231\344\376"
"\377\225\343\377\377\231\344\376\377\225\343\377\377\222\341\377\377\222"
"\341\377\377\222\341\377\377\215\336\377\377\215\336\377\377\213\336\377"
"\377\213\336\377\377\211\334\377\377\207\333\377\377\207\333\377\377\207"
"\333\377\377\177\330\377\377~\327\377\377~\327\377\377|\326\377\377|\326"
"\377\377x\324\377\377x\324\377\377t\322\377\377t\322\377\377v\323\377\377"
"p\320\377\377p\320\377\377p\320\377\377l\316\377\377l\316\377\377h\314\377"
"\377h\314\377\377e\312\377\377\352\370\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\307\363\377\377X\303\377\377Q\277\377\377T\301\376\377V\302"
"\377\377\216\336\377\377\307\363\377\377\376\377\377\377\374\376\377\377"
"\376\377\377\377\376\377\377\377\374\376\377\377\207\333\377\377D\271\376"
"\377@\267\377\377B\270\376\377<\265\376\377<\265\376\377\31Fb\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\24.=\377\231\344\376\377\246"
"\354\377\377\250\355\377\377\250\355\377\377\255\357\377\377\255\357\377"
"\377\260\360\377\377\260\360\377\377\263\361\377\377\263\361\377\377\263"
"\361\377\377\267\362\377\377\267\362\377\377\267\362\377\377\263\361\377"
"\377\263\361\377\377\263\361\377\377\260\360\377\377\260\360\377\377\255"
"\357\377\377\255\357\377\377\255\357\377\377\250\355\377\377\246\354\377"
"\377\243\351\377\377\246\354\377\377\241\350\377\377\237\347\377\377\237"
"\347\377\377\237\347\377\377\234\346\376\377\231\344\376\377\231\344\376"
"\377\225\343\377\377\225\343\377\377\223\342\377\377\222\341\377\377\222"
"\341\377\377\222\341\377\377\215\336\377\377\213\336\377\377\211\334\377"
"\377\211\334\377\377\207\333\377\377\207\333\377\377\204\332\377\377\177"
"\330\377\377\177\330\377\377\177\330\377\377|\326\377\377|\326\377\377|\326"
"\377\377\223\342\377\377\334\366\377\377\263\361\377\377\231\344\376\377"
"v\323\377\377p\320\377\377p\320\377\377l\316\377\377l\316\377\377k\315\377"
"\377h\314\377\377\216\336\377\377\374\376\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\207\333\377\377\200\327\376\377\307\363"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377]\304\375"
"\377D\271\376\377D\271\376\377@\267\377\377@\267\377\377<\265\376\3778\263"
"\376\377\24""5H\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\6\16\24\377\203"
"\316\353\377\246\354\377\377\246\354\377\377\250\355\377\377\255\357\377"
"\377\255\357\377\377\255\357\377\377\260\360\377\377\260\360\377\377\263"
"\361\377\377\263\361\377\377\267\362\377\377\267\362\377\377\267\362\377"
"\377\267\362\377\377\267\362\377\377\263\361\377\377\263\361\377\377\263"
"\361\377\377\260\360\377\377\255\357\377\377\255\357\377\377\250\355\377"
"\377\250\355\377\377\246\354\377\377\246\354\377\377\246\354\377\377\241"
"\350\377\377\241\350\377\377\237\347\377\377\237\347\377\377\234\346\376"
"\377\237\347\377\377\225\343\377\377\231\344\376\377\225\343\377\377\223"
"\342\377\377\222\341\377\377\222\341\377\377\215\336\377\377\215\336\377"
"\377\213\336\377\377\213\336\377\377\211\334\377\377\212\335\377\377\204"
"\332\377\377\204\332\377\377\177\330\377\377\204\332\377\377\177\330\377"
"\377|\326\377\377|\326\377\377|\326\377\377\253\356\377\377\376\377\377\377"
"\374\376\377\377\376\377\377\377\376\377\377\377\334\366\377\377\263\361"
"\377\377\222\341\377\377l\316\377\377k\315\377\377g\313\377\377\334\366\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\361\372\377\377D\271\376\377D\271\376\377@\267\377\377"
"@\267\377\377@\267\377\377<\265\376\377<\265\376\377:\262\373\377\11\33'"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377G\211\253\377\243\351\377\377\246\354"
"\377\377\246\354\377\377\250\355\377\377\250\355\377\377\255\357\377\377"
"\255\357\377\377\260\360\377\377\260\360\377\377\263\361\377\377\263\361"
"\377\377\267\362\377\377\267\362\377\377\267\362\377\377\267\362\377\377"
"\267\362\377\377\263\361\377\377\263\361\377\377\260\360\377\377\260\360"
"\377\377\255\357\377\377\255\357\377\377\255\357\377\377\250\355\377\377"
"\246\354\377\377\246\354\377\377\246\354\377\377\243\351\377\377\241\350"
"\377\377\237\347\377\377\237\347\377\377\234\346\376\377\237\347\377\377"
"\231\344\376\377\231\344\376\377\225\343\377\377\223\342\377\377\222\341"
"\377\377\223\342\377\377\215\336\377\377\215\336\377\377\213\336\377\377"
"\213\336\377\377\211\334\377\377\207\333\377\377\207\333\377\377\204\332"
"\377\377\177\330\377\377~\327\377\377\177\330\377\377~\327\377\377|\326\377"
"\377x\324\377\377|\326\377\377\374\376\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\334\366\377\377\307\363\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\267\362\377\377D\271\376\377D\271\376\377D\271\376\377@\267\377\377"
"<\265\376\377<\265\376\377<\265\376\377;\264\376\377!\216\323\377\3\4\6\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\36Qn\377\246\354\377\377\243\351\377\377\246\354\377\377\246"
"\354\377\377\250\355\377\377\250\355\377\377\255\357\377\377\255\357\377"
"\377\260\360\377\377\260\360\377\377\263\361\377\377\263\361\377\377\263"
"\361\377\377\267\362\377\377\267\362\377\377\267\362\377\377\263\361\377"
"\377\263\361\377\377\263\361\377\377\260\360\377\377\260\360\377\377\255"
"\357\377\377\255\357\377\377\255\357\377\377\250\355\377\377\246\354\377"
"\377\243\351\377\377\246\354\377\377\243\351\377\377\241\350\377\377\237"
"\347\377\377\237\347\377\377\237\347\377\377\231\344\376\377\225\343\377"
"\377\231\344\376\377\225\343\377\377\223\342\377\377\222\341\377\377\223"
"\342\377\377\215\336\377\377\215\336\377\377\213\336\377\377\211\334\377"
"\377\211\334\377\377\207\333\377\377\204\332\377\377\204\332\377\377\177"
"\330\377\377~\327\377\377\177\330\377\377|\326\377\377|\326\377\377|\326"
"\377\377x\324\377\377\307\363\377\377\374\376\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\374\376\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\370\374\377\377\216"
"\336\377\377D\271\376\377D\271\376\377@\267\377\377@\267\377\377@\267\377"
"\377<\265\376\377<\265\376\377;\264\376\3778\263\376\377\32e\225\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\24.=\377\234\346\376\377\246\354\377\377\241\350\377\377\246\354\377"
"\377\246\354\377\377\246\354\377\377\246\354\377\377\253\356\377\377\255"
"\357\377\377\255\357\377\377\260\360\377\377\263\361\377\377\263\361\377"
"\377\263\361\377\377\263\361\377\377\263\361\377\377\263\361\377\377\263"
"\361\377\377\263\361\377\377\263\361\377\377\260\360\377\377\260\360\377"
"\377\255\357\377\377\255\357\377\377\255\357\377\377\250\355\377\377\246"
"\354\377\377\246\354\377\377\241\350\377\377\241\350\377\377\241\350\377"
"\377\237\347\377\377\237\347\377\377\234\346\376\377\234\346\376\377\225"
"\343\377\377\231\344\376\377\225\343\377\377\223\342\377\377\222\341\377"
"\377\222\341\377\377\215\336\377\377\215\336\377\377\213\336\377\377\211"
"\334\377\377\211\334\377\377\207\333\377\377\207\333\377\377\205\332\377"
"\377\200\330\377\377\200\330\377\377\200\330\377\377|\326\377\377|\326\377"
"\377|\326\377\377w\323\377\377\234\346\376\377\376\376\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377a\310\377\377D\271\376\377D\271\376\377@\267\377\377@\267\377\377@\267"
"\377\377<\265\376\377<\265\376\377<\265\376\3778\263\376\3777\262\377\377"
"\24""5H\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\4\12\15\377\201\313\347\377\234\346\376\377\241\350\377\377\241\350\377"
"\377\246\354\377\377\246\354\377\377\246\354\377\377\250\355\377\377\250"
"\355\377\377\255\357\377\377\255\357\377\377\260\360\377\377\260\360\377"
"\377\263\361\377\377\263\361\377\377\263\361\377\377\263\361\377\377\263"
"\361\377\377\263\361\377\377\263\361\377\377\260\360\377\377\260\360\377"
"\377\255\357\377\377\255\357\377\377\250\355\377\377\250\355\377\377\246"
"\354\377\377\246\354\377\377\246\354\377\377\241\350\377\377\246\354\377"
"\377\237\347\377\377\237\347\377\377\237\347\377\377\234\346\376\377\234"
"\346\376\377\231\344\376\377\225\343\377\377\225\343\377\377\223\342\377"
"\377\222\341\377\377\222\341\377\377\222\341\377\377\215\336\377\377\213"
"\336\377\377\213\336\377\377\211\334\377\377\207\333\377\377\207\333\377"
"\377\200\330\377\377\200\330\377\377\200\330\377\377|\326\377\377|\326\377"
"\377|\326\377\377w\323\377\377w\323\377\377w\323\377\377\370\374\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\361\372\377\377D\271\376\377D\271\376\377D\271\376\377@\267\377\377@\267"
"\377\377<\265\376\377<\265\376\377<\265\376\377=\265\376\3778\263\376\377"
"7\262\377\3771\257\376\377\10\24\32\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377A\202\244\377\241\350\377\377\237\347\377\377\241\350"
"\377\377\246\354\377\377\246\354\377\377\246\354\377\377\246\354\377\377"
"\250\355\377\377\253\356\377\377\255\357\377\377\255\357\377\377\255\357"
"\377\377\260\360\377\377\260\360\377\377\260\360\377\377\263\361\377\377"
"\263\361\377\377\263\361\377\377\263\361\377\377\260\360\377\377\260\360"
"\377\377\260\360\377\377\255\357\377\377\255\357\377\377\250\355\377\377"
"\250\355\377\377\246\354\377\377\246\354\377\377\246\354\377\377\243\351"
"\377\377\241\350\377\377\237\347\377\377\237\347\377\377\237\347\377\377"
"\234\346\376\377\231\344\376\377\231\344\376\377\231\344\376\377\225\343"
"\377\377\222\341\377\377\222\341\377\377\222\341\377\377\215\336\377\377"
"\215\336\377\377\213\336\377\377\211\334\377\377\211\334\377\377\207\333"
"\377\377\207\333\377\377\205\332\377\377\200\330\377\377\200\330\377\377"
"|\326\377\377|\326\377\377|\326\377\377z\325\377\377w\323\377\377v\323\377"
"\377\307\363\377\377\376\376\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\307\363\377\377H\273\377\377D\271\376\377D\271\376\377"
"D\271\376\377@\267\377\377@\267\377\377<\265\376\377<\265\376\3778\263\376"
"\3778\263\376\3777\262\377\3777\262\377\377&p\234\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\11\33'\377\225\343\377\377\237\347\377\377\237"
"\347\377\377\241\350\377\377\241\350\377\377\243\351\377\377\246\354\377"
"\377\246\354\377\377\250\355\377\377\250\355\377\377\253\356\377\377\253"
"\356\377\377\255\357\377\377\255\357\377\377\260\360\377\377\260\360\377"
"\377\260\360\377\377\260\360\377\377\260\360\377\377\260\360\377\377\260"
"\360\377\377\260\360\377\377\255\357\377\377\255\357\377\377\255\357\377"
"\377\250\355\377\377\246\354\377\377\246\354\377\377\246\354\377\377\243"
"\351\377\377\243\351\377\377\241\350\377\377\237\347\377\377\237\347\377"
"\377\234\346\376\377\237\347\377\377\231\344\376\377\225\343\377\377\225"
"\343\377\377\223\342\377\377\225\343\377\377\222\341\377\377\222\341\377"
"\377\215\336\377\377\215\336\377\377\213\336\377\377\213\336\377\377\211"
"\334\377\377\207\333\377\377\200\330\377\377\205\332\377\377\200\330\377"
"\377\200\330\377\377\200\330\377\377|\326\377\377z\325\377\377z\325\377\377"
"z\325\377\377v\323\377\377\221\340\377\377\376\376\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\370\374\377\377\250\355\377\377D\271\376\377D\271"
"\376\377D\271\376\377@\267\377\377@\267\377\377<\265\376\377<\265\376\377"
"<\265\376\3778\263\376\3777\262\377\3777\262\377\3771\257\376\3771\257\377"
"\377\24.=\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377G\211\253\377\234\346\376"
"\377\241\350\377\377\237\347\377\377\237\347\377\377\241\350\377\377\241"
"\350\377\377\246\354\377\377\246\354\377\377\246\354\377\377\246\354\377"
"\377\250\355\377\377\253\356\377\377\253\356\377\377G\211\253\377\35Wz\377"
"G\211\253\377\202\313\347\377\246\354\377\377\260\360\377\377\260\360\377"
"\377\255\357\377\377\255\357\377\377\255\357\377\377\250\355\377\377\250"
"\355\377\377\250\355\377\377\246\354\377\377\246\354\377\377\243\351\377"
"\377\243\351\377\377\243\351\377\377\241\350\377\377\237\347\377\377\237"
"\347\377\377\234\346\376\377\231\344\376\377\231\344\376\377\225\343\377"
"\377\225\343\377\377\223\342\377\377\222\341\377\377\222\341\377\377\222"
"\341\377\377\216\336\377\377\216\336\377\377\211\334\377\377\213\336\377"
"\377\207\333\377\377\207\333\377\377\204\332\377\377\204\332\377\377~\327"
"\377\377\200\330\377\377\200\330\377\377|\326\377\377z\325\377\377z\325\377"
"\377z\325\377\377v\323\377\377v\323\377\377\361\372\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\376\377\377\376\376\377\377\334\366\377\377"
"\204\332\377\377D\266\372\377@\267\377\377@\267\377\377=\265\376\377=\265"
"\376\377=\265\376\3778\263\376\3778\263\376\3777\262\377\3777\262\377\377"
"1\257\377\377!\216\323\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\36Qn\377\231\344"
"\376\377\234\346\376\377\234\346\376\377\237\347\377\377\237\347\377\377"
"\241\350\377\377\241\350\377\377\241\350\377\377\246\354\377\377\246\354"
"\377\377\246\354\377\377\250\355\377\377\250\355\377\377\253\356\377\377"
"\24.=\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\250\355\377\377\255\357"
"\377\377\255\357\377\377\255\357\377\377\255\357\377\377\250\355\377\377"
"\250\355\377\377\246\354\377\377\246\354\377\377\246\354\377\377\241\350"
"\377\377\243\351\377\377\241\350\377\377\234\346\376\377\237\347\377\377"
"\237\347\377\377\234\346\376\377\231\344\376\377\231\344\376\377\231\344"
"\376\377\225\343\377\377\223\342\377\377\222\341\377\377\222\341\377\377"
"\215\336\377\377\215\336\377\377\213\336\377\377\213\336\377\377\207\333"
"\377\377\207\333\377\377\207\333\377\377\204\332\377\377\200\330\377\377"
"\200\330\377\377\200\330\377\377|\326\377\377|\326\377\377z\325\377\377w"
"\323\377\377w\323\377\377v\323\377\377t\322\377\377\267\362\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\352\370\377\377\216\336\377\377D\266\372\377=\265"
"\376\377=\265\376\3778\263\376\3778\263\376\3778\263\376\3777\262\377\377"
"1\257\377\3771\257\377\377/\256\377\377\31Fb\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\3\4\6\377\201"
"\313\347\377\231\344\376\377\231\344\376\377\234\346\376\377\237\347\377"
"\377\237\347\377\377\241\350\377\377\241\350\377\377\241\350\377\377\246"
"\354\377\377\243\351\377\377\246\354\377\377\246\354\377\377\246\354\377"
"\377\250\355\377\377\6\16\24\377\0\0\0\377\0\0\0\377\0\0\0\377\17$0\377\255"
"\357\377\377\250\355\377\377\250\355\377\377\255\357\377\377\250\355\377"
"\377\250\355\377\377\250\355\377\377\246\354\377\377\246\354\377\377\243"
"\351\377\377\241\350\377\377\241\350\377\377\241\350\377\377\241\350\377"
"\377\237\347\377\377\234\346\376\377\237\347\377\377\231\344\376\377\231"
"\344\376\377\225\343\377\377\223\342\377\377\223\342\377\377\222\341\377"
"\377\222\341\377\377\222\341\377\377\211\334\377\377\213\336\377\377\213"
"\336\377\377\211\334\377\377\207\333\377\377\207\333\377\377\204\332\377"
"\377\200\330\377\377\200\330\377\377\200\330\377\377|\326\377\377|\326\377"
"\377z\325\377\377v\323\377\377v\323\377\377v\323\377\377t\322\377\377\205"
"\332\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\361\372\377\377\221\340\377\377G\272\377\377=\265\376\3778\263\376\377"
"8\263\376\3777\262\377\3777\262\377\3771\257\377\3771\257\377\377*\253\377"
"\377\6\16\24\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\36Qn\377\227\343\377\377\231\344\376\377\231\344\376"
"\377\234\346\376\377\234\346\376\377\237\347\377\377\237\347\377\377\237"
"\347\377\377\241\350\377\377\241\350\377\377\243\351\377\377\246\354\377"
"\377\243\351\377\377\250\355\377\377\234\346\376\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\25<S\377\250\355\377\377\250\355\377\377\250\355\377"
"\377\250\355\377\377\246\354\377\377\246\354\377\377\250\355\377\377\243"
"\351\377\377\246\354\377\377\243\351\377\377\243\351\377\377\241\350\377"
"\377\241\350\377\377\234\346\376\377\234\346\376\377\234\346\376\377\231"
"\344\376\377\231\344\376\377\225\343\377\377\225\343\377\377\223\342\377"
"\377\222\341\377\377\222\341\377\377\215\336\377\377\216\336\377\377\216"
"\336\377\377\213\336\377\377\211\334\377\377\211\334\377\377\207\333\377"
"\377\207\333\377\377\207\333\377\377\200\330\377\377\200\330\377\377|\326"
"\377\377|\326\377\377|\326\377\377z\325\377\377w\323\377\377v\323\377\377"
"t\322\377\377t\322\377\377\227\343\377\377\376\376\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\374\376\377\377\370\374"
"\377\377\241\350\377\377H\273\377\3778\263\376\3777\262\377\3771\257\377"
"\3771\257\377\3771\257\377\377/\256\377\377\35Wz\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\203\316\353\377"
"\227\343\377\377\225\343\377\377\231\344\376\377\231\344\376\377\237\347"
"\377\377\234\346\376\377\237\347\377\377\237\347\377\377\241\350\377\377"
"\241\350\377\377\243\351\377\377\243\351\377\377\243\351\377\377\246\354"
"\377\377|\326\377\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\36Qn\377\246"
"\354\377\377\246\354\377\377\246\354\377\377\246\354\377\377\246\354\377"
"\377\246\354\377\377\246\354\377\377\241\350\377\377\243\351\377\377\243"
"\351\377\377\241\350\377\377\241\350\377\377\236\346\377\377\241\350\377"
"\377\234\346\376\377\231\344\376\377\231\344\376\377\231\344\376\377\225"
"\343\377\377\225\343\377\377\223\342\377\377\222\341\377\377\225\343\377"
"\377\215\336\377\377\213\336\377\377\213\336\377\377\212\335\377\377\212"
"\335\377\377\212\335\377\377\204\332\377\377\204\332\377\377\204\332\377"
"\377\204\332\377\377~\327\377\377~\327\377\377|\326\377\377|\326\377\377"
"x\324\377\377w\323\377\377w\323\377\377\205\332\377\377\334\366\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\370\374\377\377\376"
"\377\377\377l\316\377\3775\262\377\3772\260\377\3772\260\377\3771\257\377"
"\377/\256\377\377\30\230\355\377\4\12\15\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\36Qn\377\225\343\377\377\225\343\377\377\225"
"\343\377\377\225\343\377\377\231\344\376\377\231\344\376\377\237\347\377"
"\377\237\347\377\377\237\347\377\377\237\347\377\377\241\350\377\377\241"
"\350\377\377\243\351\377\377\243\351\377\377\250\355\377\377\202\313\347"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\3773x\236\377\246\354\377\377\246"
"\354\377\377\243\351\377\377\246\354\377\377\246\354\377\377\246\354\377"
"\377\243\351\377\377\243\351\377\377\241\350\377\377\241\350\377\377\241"
"\350\377\377\234\346\376\377\234\346\376\377\234\346\376\377\234\346\376"
"\377\231\344\376\377\231\344\376\377\225\343\377\377\225\343\377\377\225"
"\343\377\377\223\342\377\377\222\341\377\377\222\341\377\377\215\336\377"
"\377\215\336\377\377\213\336\377\377\212\335\377\377\212\335\377\377\204"
"\332\377\377\207\333\377\377\204\332\377\377~\327\377\377\177\330\377\377"
"\177\330\377\377~\327\377\377|\326\377\377|\326\377\377x\324\377\377w\323"
"\377\377\267\362\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\370\374\377\377\352\370\377\377"
"_\307\377\3775\262\377\3772\260\377\3772\260\377\377/\256\377\377/\256\377"
"\377,\255\377\377\36Qn\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377|\326\377\377\222\341\377\377\227\343\377\377\227\343\377"
"\377\225\343\377\377\231\344\376\377\231\344\376\377\234\346\376\377\234"
"\346\376\377\237\347\377\377\237\347\377\377\237\347\377\377\241\350\377"
"\377\241\350\377\377\243\351\377\377\243\351\377\377A\202\244\377\1\2\2\377"
"\0\0\0\377\0\0\0\377\0\0\0\377A\202\244\377\246\354\377\377\243\351\377\377"
"\246\354\377\377\246\354\377\377\243\351\377\377\243\351\377\377\243\351"
"\377\377\241\350\377\377\241\350\377\377\236\346\377\377\241\350\377\377"
"\236\346\377\377\234\346\376\377\234\346\376\377\231\344\376\377\231\344"
"\376\377\231\344\376\377\225\343\377\377\223\342\377\377\223\342\377\377"
"\222\341\377\377\223\342\377\377\215\336\377\377\215\336\377\377\213\336"
"\377\377\213\336\377\377\212\335\377\377\207\333\377\377\207\333\377\377"
"\204\332\377\377\204\332\377\377\204\332\377\377~\327\377\377~\327\377\377"
"|\326\377\377|\326\377\377x\324\377\377\237\347\377\377\361\372\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\376\377\377\376\377\377\377\243\351\377\377?\267\377\3775\262\377\3775\262"
"\377\3772\260\377\3772\260\377\3771\257\377\377/\256\377\377,\255\377\377"
"\32\225\347\377\3\4\6\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\25<S\377"
"\221\340\377\377\222\341\377\377\222\341\377\377\222\341\377\377\225\343"
"\377\377\231\344\376\377\231\344\376\377\231\344\376\377\234\346\376\377"
"\234\346\376\377\237\347\377\377\237\347\377\377\234\346\376\377\241\350"
"\377\377\243\351\377\377\243\351\377\377A\202\244\377\1\2\2\377\0\0\0\377"
"\0\0\0\377\0\0\0\377G\211\253\377\243\351\377\377\243\351\377\377\243\351"
"\377\377\241\350\377\377\243\351\377\377\241\350\377\377\241\350\377\377"
"\241\350\377\377\234\346\376\377\241\350\377\377\236\346\377\377\234\346"
"\376\377\234\346\376\377\234\346\376\377\231\344\376\377\231\344\376\377"
"\225\343\377\377\225\343\377\377\223\342\377\377\222\341\377\377\222\341"
"\377\377\215\336\377\377\215\336\377\377\215\336\377\377\213\336\377\377"
"\212\335\377\377\212\335\377\377\207\333\377\377\204\332\377\377\204\332"
"\377\377\204\332\377\377~\327\377\377~\327\377\377~\327\377\377|\326\377"
"\377\207\333\377\377\334\366\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\307"
"\363\377\377X\303\377\3778\263\376\377;\264\376\3775\262\377\3772\260\377"
"\3772\260\377\3771\257\377\3771\257\377\377/\256\377\377,\255\377\377/\256"
"\377\377\31Fb\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\1\2\2\377\1\2\2\377G\211\253\377"
"\221\340\377\377\221\340\377\377\221\340\377\377\221\340\377\377\225\343"
"\377\377\225\343\377\377\231\344\376\377\231\344\376\377\231\344\376\377"
"\234\346\376\377\234\346\376\377\234\346\376\377\241\350\377\377\234\346"
"\376\377\241\350\377\377\234\346\376\377\35Wz\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\201\313\347\377\241\350\377\377\241\350\377\377\241\350"
"\377\377\241\350\377\377\241\350\377\377\234\346\376\377\241\350\377\377"
"\234\346\376\377\234\346\376\377\241\350\377\377\234\346\376\377\234\346"
"\376\377\231\344\376\377\231\344\376\377\225\343\377\377\231\344\376\377"
"\225\343\377\377\223\342\377\377\223\342\377\377\222\341\377\377\222\341"
"\377\377\215\336\377\377\215\336\377\377\213\336\377\377\213\336\377\377"
"\213\336\377\377\207\333\377\377\207\333\377\377\207\333\377\377\204\332"
"\377\377\200\330\377\377\200\330\377\377~\327\377\377~\327\377\377\225\343"
"\377\377\376\377\377\377\374\376\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\370\374\377\377\361\372\377\377|\326\377\377=\265"
"\376\3778\263\376\3778\263\376\3775\262\377\3775\262\377\3777\262\377\377"
"1\257\377\3771\257\377\3771\257\377\377/\256\377\377,\255\377\377*\253\377"
"\377&\212\311\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\1\2\2\377\10\24\32\377\204\323"
"\364\377\221\340\377\377\221\340\377\377\231\344\376\377\221\340\377\377"
"\222\341\377\377\227\343\377\377\225\343\377\377\225\343\377\377\231\344"
"\376\377\231\344\376\377\234\346\376\377\234\346\376\377\233\345\376\377"
"\241\350\377\377\236\346\377\377\241\350\377\377\36Qn\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\201\313\347\377\241\350\377\377\241\350\377\377"
"\241\350\377\377\241\350\377\377\234\346\376\377\241\350\377\377\241\350"
"\377\377\241\350\377\377\234\346\376\377\234\346\376\377\234\346\376\377"
"\231\344\376\377\231\344\376\377\231\344\376\377\231\344\376\377\225\343"
"\377\377\222\341\377\377\223\342\377\377\222\341\377\377\223\342\377\377"
"\215\336\377\377\215\336\377\377\215\336\377\377\213\336\377\377\211\334"
"\377\377\211\334\377\377\207\333\377\377\207\333\377\377\204\332\377\377"
"\204\332\377\377\200\330\377\377\200\330\377\377~\327\377\377|\326\377\377"
"\222\341\377\377\361\372\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\376\377\377\376\376\377\377\243\351\377\377H\273\377\377<\265\376\377"
"=\265\376\377=\265\376\3778\263\376\3775\262\377\3775\262\377\3777\262\377"
"\3771\257\377\3771\257\377\377/\256\377\377,\255\377\377,\255\377\377*\253"
"\377\377*\253\377\377\10\27\40\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\31Fb\377\221"
"\340\377\377\217\337\377\377\223\342\377\377\221\340\377\377\221\340\377"
"\377\222\341\377\377\222\341\377\377\227\343\377\377\222\341\377\377\231"
"\344\376\377\227\343\377\377\231\344\376\377\231\344\376\377\234\346\376"
"\377\234\346\376\377\234\346\376\377\241\350\377\377\25<S\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\227\343\377\377\234\346\376\377\241\350\377"
"\377\241\350\377\377\234\346\376\377\234\346\376\377\241\350\377\377\234"
"\346\376\377\234\346\376\377\234\346\376\377\231\344\376\377\231\344\376"
"\377\227\343\377\377\231\344\376\377\227\343\377\377\225\343\377\377\223"
"\342\377\377\223\342\377\377\222\341\377\377\222\341\377\377\215\336\377"
"\377\215\336\377\377\215\336\377\377\213\336\377\377\211\334\377\377\211"
"\334\377\377\207\333\377\377\207\333\377\377\204\332\377\377\204\332\377"
"\377\204\332\377\377\200\330\377\377\200\330\377\377~\327\377\377|\326\377"
"\377z\325\377\377z\325\377\377\246\354\377\377\352\370\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\376\377\377a\310\377\377@\267\377\377@\267\377\377<\265\376\377<\265\376"
"\377=\265\376\3778\263\376\3775\262\377\3775\262\377\3771\257\377\3771\257"
"\377\3771\257\377\377/\256\377\377,\255\377\377/\256\377\377/\256\377\377"
"*\253\377\377\35Wz\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377z\325\377\377\217\337\377"
"\377\217\337\377\377\204\323\364\377\221\340\377\377\221\340\377\377\222"
"\341\377\377\222\341\377\377\222\341\377\377\227\343\377\377\227\343\377"
"\377\227\343\377\377\231\344\376\377\231\344\376\377\231\344\376\377\231"
"\344\376\377\234\346\376\377\234\346\376\377\24""5H\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\241\350\377\377\241\350\377\377\234\346\376\377\234"
"\346\376\377\234\346\376\377\234\346\376\377\234\346\376\377\234\346\376"
"\377\231\344\376\377\231\344\376\377\227\343\377\377\231\344\376\377\231"
"\344\376\377\222\341\377\377\227\343\377\377\223\342\377\377\223\342\377"
"\377\222\341\377\377\222\341\377\377\215\336\377\377\222\341\377\377\215"
"\336\377\377\213\336\377\377\213\336\377\377\213\336\377\377\211\334\377"
"\377\207\333\377\377\207\333\377\377\204\332\377\377~\327\377\377~\327\377"
"\377\200\330\377\377~\327\377\377z\325\377\377z\325\377\377z\325\377\377"
"z\325\377\377v\323\377\377v\323\377\377\234\346\376\377\334\366\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\370\374\377\377|\326\377\377"
"@\267\377\377<\265\376\377<\265\376\377<\265\376\377=\265\376\3778\263\376"
"\377;\264\376\3775\262\377\3775\262\377\3771\257\377\377/\256\377\377/\256"
"\377\377,\255\377\377*\253\377\377*\253\377\377*\253\377\377!\216\323\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\17$0\377\213\336\377\377\211\334\377\377\213\336\377"
"\377\215\336\377\377\215\336\377\377\215\336\377\377\223\342\377\377\222"
"\341\377\377\222\341\377\377\223\342\377\377\223\342\377\377\225\343\377"
"\377\225\343\377\377\231\344\376\377\231\344\376\377\231\344\376\377\231"
"\344\376\377\231\344\376\377\231\344\376\377\237\347\377\377\237\347\377"
"\377\234\346\376\377\234\346\376\377\234\346\376\377\234\346\376\377\234"
"\346\376\377\234\346\376\377\231\344\376\377\234\346\376\377\231\344\376"
"\377\231\344\376\377\231\344\376\377\225\343\377\377\231\344\376\377\225"
"\343\377\377\225\343\377\377\223\342\377\377\223\342\377\377\223\342\377"
"\377\222\341\377\377\222\341\377\377\215\336\377\377\222\341\377\377\211"
"\334\377\377\215\336\377\377\213\336\377\377\213\336\377\377\207\333\377"
"\377\207\333\377\377\207\333\377\377\204\332\377\377\204\332\377\377\204"
"\332\377\377~\327\377\377~\327\377\377~\327\377\377|\326\377\377z\325\377"
"\377z\325\377\377x\324\377\377v\323\377\377t\322\377\377t\322\377\377t\322"
"\377\377\222\341\377\377\334\366\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\307\363\377\377B\270\376\377<\265\376\377<\265\376\377<\265\376\377;\264"
"\376\377;\264\376\3777\262\377\3771\257\377\3771\257\377\3772\260\377\377"
"1\257\377\377/\256\377\377,\255\377\377,\255\377\377*\253\377\377'\252\376"
"\377'\252\376\377\17$0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\3773x\236\377\211\334\377\377\213\336"
"\377\377\213\336\377\377\213\336\377\377\215\336\377\377\215\336\377\377"
"\215\336\377\377\222\341\377\377\222\341\377\377\222\341\377\377\223\342"
"\377\377\223\342\377\377\225\343\377\377\225\343\377\377\225\343\377\377"
"\231\344\376\377\225\343\377\377\231\344\376\377\225\343\377\377\231\344"
"\376\377\231\344\376\377\231\344\376\377\231\344\376\377\231\344\376\377"
"\231\344\376\377\231\344\376\377\231\344\376\377\231\344\376\377\231\344"
"\376\377\231\344\376\377\231\344\376\377\231\344\376\377\231\344\376\377"
"\225\343\377\377\225\343\377\377\223\342\377\377\222\341\377\377\222\341"
"\377\377\222\341\377\377\222\341\377\377\222\341\377\377\215\336\377\377"
"\216\336\377\377\216\336\377\377\215\336\377\377\211\334\377\377\207\333"
"\377\377\207\333\377\377\207\333\377\377\204\332\377\377\204\332\377\377"
"\177\330\377\377\177\330\377\377~\327\377\377~\327\377\377|\326\377\377z"
"\325\377\377z\325\377\377x\324\377\377v\323\377\377v\323\377\377t\322\377"
"\377t\322\377\377o\317\377\377l\316\377\377o\317\377\377\211\334\377\377"
"\307\363\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377J\274\377\377@\267\377\377<\265\376\377:"
"\263\374\3775\262\377\3775\262\377\3777\262\377\3771\257\377\3772\260\377"
"\3771\257\377\377/\256\377\377/\256\377\377,\255\377\377,\255\377\377*\253"
"\377\377'\252\376\377'\252\376\377\27[\207\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377G\211\253\377\207"
"\333\377\377\207\333\377\377\213\336\377\377\213\336\377\377\213\336\377"
"\377\215\336\377\377\215\336\377\377\215\336\377\377\222\341\377\377\222"
"\341\377\377\222\341\377\377\223\342\377\377\223\342\377\377\223\342\377"
"\377\225\343\377\377\225\343\377\377\225\343\377\377\225\343\377\377\231"
"\344\376\377\231\344\376\377\231\344\376\377\231\344\376\377\231\344\376"
"\377\225\343\377\377\231\344\376\377\231\344\376\377\225\343\377\377\231"
"\344\376\377\225\343\377\377\231\344\376\377\225\343\377\377\225\343\377"
"\377\225\343\377\377\223\342\377\377\223\342\377\377\223\342\377\377\222"
"\341\377\377\222\341\377\377\222\341\377\377\215\336\377\377\222\341\377"
"\377\215\336\377\377\215\336\377\377\213\336\377\377\213\336\377\377\211"
"\334\377\377\207\333\377\377\207\333\377\377\207\333\377\377\204\332\377"
"\377\177\330\377\377\204\332\377\377~\327\377\377~\327\377\377|\326\377\377"
"z\325\377\377z\325\377\377z\325\377\377x\324\377\377v\323\377\377t\322\377"
"\377t\322\377\377l\316\377\377t\322\377\377o\317\377\377o\317\377\377k\315"
"\377\377k\315\377\377\246\354\377\377\374\376\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\374\376\377\377\225\343\377\377<\265\376\377<\265\376"
"\377<\265\376\377:\263\374\3777\262\377\3775\262\377\3775\262\377\3772\260"
"\377\3771\257\377\377/\256\377\377,\255\377\377,\255\377\377,\255\377\377"
"*\253\377\377'\252\376\377'\252\376\377&\212\311\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\4\12\15\377\201\324"
"\367\377\207\333\377\377\207\333\377\377\211\334\377\377\211\334\377\377"
"\213\336\377\377\213\336\377\377\215\336\377\377\215\336\377\377\215\336"
"\377\377\222\341\377\377\222\341\377\377\222\341\377\377\222\341\377\377"
"\223\342\377\377\225\343\377\377\222\341\377\377\225\343\377\377\225\343"
"\377\377\225\343\377\377\225\343\377\377\225\343\377\377\225\343\377\377"
"\227\343\377\377\227\343\377\377\225\343\377\377\231\344\376\377\225\343"
"\377\377\225\343\377\377\225\343\377\377\225\343\377\377\223\342\377\377"
"\223\342\377\377\223\342\377\377\223\342\377\377\222\341\377\377\222\341"
"\377\377\222\341\377\377\222\341\377\377\215\336\377\377\216\336\377\377"
"\216\336\377\377\211\334\377\377\213\336\377\377\211\334\377\377\211\334"
"\377\377\207\333\377\377\207\333\377\377\204\332\377\377\204\332\377\377"
"\204\332\377\377\177\330\377\377\177\330\377\377~\327\377\377~\327\377\377"
"|\326\377\377z\325\377\377z\325\377\377x\324\377\377t\322\377\377t\322\377"
"\377t\322\377\377t\322\377\377t\322\377\377l\316\377\377o\317\377\377k\315"
"\377\377k\315\377\377h\314\377\377\307\363\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\334\366\377\377<\265\376"
"\377<\265\376\377<\265\376\3775\262\377\3777\262\377\3775\262\377\3772\260"
"\377\3772\260\377\3771\257\377\377/\256\377\377,\255\377\377*\253\377\377"
"*\253\377\377*\253\377\377'\252\376\377'\252\376\377#\250\376\377\6\16\24"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\24""5H\377\204\332\377\377\207\333\377\377\204\332\377\377\207\333\377\377"
"\211\334\377\377\213\336\377\377\211\334\377\377\213\336\377\377\215\336"
"\377\377\215\336\377\377\215\336\377\377\215\336\377\377\222\341\377\377"
"\222\341\377\377\222\341\377\377\222\341\377\377\222\341\377\377\222\341"
"\377\377\223\342\377\377\223\342\377\377\223\342\377\377\223\342\377\377"
"\223\342\377\377\225\343\377\377\225\343\377\377\225\343\377\377\222\341"
"\377\377\227\343\377\377\223\342\377\377\223\342\377\377\223\342\377\377"
"\223\342\377\377\223\342\377\377\222\341\377\377\222\341\377\377\222\341"
"\377\377\222\341\377\377\215\336\377\377\215\336\377\377\215\336\377\377"
"\213\336\377\377\213\336\377\377\213\336\377\377\213\336\377\377\211\334"
"\377\377\207\333\377\377\207\333\377\377\207\333\377\377\204\332\377\377"
"\204\332\377\377\204\332\377\377\200\330\377\377~\327\377\377~\327\377\377"
"|\326\377\377|\326\377\377z\325\377\377x\324\377\377v\323\377\377v\323\377"
"\377t\322\377\377t\322\377\377t\322\377\377l\316\377\377o\317\377\377o\317"
"\377\377o\317\377\377k\315\377\377h\314\377\377\361\372\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377e\312\377\377;\264\376\377;\264\376\3775\262\377\3777\262\377\3775\262"
"\377\3771\257\377\3771\257\377\3771\257\377\377/\256\377\377/\256\377\377"
"*\253\377\377,\255\377\377*\253\377\377'\252\376\377'\252\376\377#\250\376"
"\377\24""5H\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\3773x\236\377\207\333\377\377\204\332\377\377\207\333\377\377\207"
"\333\377\377\207\333\377\377\211\334\377\377\211\334\377\377\211\334\377"
"\377\213\336\377\377\213\336\377\377\215\336\377\377\215\336\377\377\222"
"\341\377\377\216\336\377\377\222\341\377\377\222\341\377\377\222\341\377"
"\377\222\341\377\377\222\341\377\377\222\341\377\377\223\342\377\377\223"
"\342\377\377\223\342\377\377\223\342\377\377\223\342\377\377\222\341\377"
"\377\222\341\377\377\222\341\377\377\222\341\377\377\222\341\377\377\222"
"\341\377\377\222\341\377\377\223\342\377\377\222\341\377\377\222\341\377"
"\377\215\336\377\377\222\341\377\377\215\336\377\377\215\336\377\377\215"
"\336\377\377\213\336\377\377\213\336\377\377\213\336\377\377\211\334\377"
"\377\207\333\377\377\207\333\377\377\207\333\377\377\204\332\377\377\207"
"\333\377\377~\327\377\377\177\330\377\377~\327\377\377~\327\377\377|\326"
"\377\377|\326\377\377z\325\377\377z\325\377\377x\324\377\377v\323\377\377"
"t\322\377\377t\322\377\377t\322\377\377l\316\377\377t\322\377\377o\317\377"
"\377k\315\377\377k\315\377\377k\315\377\377z\325\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\361\372\377\377\255\357\377\377;\264\376\3775\262\377\3778\263\376\3777"
"\262\377\3775\262\377\3771\257\377\3771\257\377\3771\257\377\377/\256\377"
"\377,\255\377\377,\255\377\377*\253\377\377'\252\376\377'\252\376\377'\252"
"\376\377#\250\376\377\27[\207\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\\\301\370\377~\327\377\377\204\332\377\377\204"
"\332\377\377\207\333\377\377\207\333\377\377\207\333\377\377\211\334\377"
"\377\211\334\377\377\213\336\377\377\213\336\377\377\213\336\377\377\215"
"\336\377\377\215\336\377\377\216\336\377\377\215\336\377\377\215\336\377"
"\377\222\341\377\377\222\341\377\377\222\341\377\377\222\341\377\377\222"
"\341\377\377\223\342\377\377\223\342\377\377\222\341\377\377\222\341\377"
"\377\222\341\377\377\222\341\377\377\222\341\377\377\222\341\377\377\222"
"\341\377\377\222\341\377\377\222\341\377\377\215\336\377\377\222\341\377"
"\377\215\336\377\377\215\336\377\377\215\336\377\377\215\336\377\377\213"
"\336\377\377\213\336\377\377\211\334\377\377\213\336\377\377\207\333\377"
"\377\207\333\377\377\207\333\377\377\207\333\377\377\204\332\377\377\204"
"\332\377\377~\327\377\377\200\330\377\377~\327\377\377~\327\377\377~\327"
"\377\377z\325\377\377z\325\377\377z\325\377\377x\324\377\377v\323\377\377"
"v\323\377\377t\322\377\377t\322\377\377o\317\377\377l\316\377\377o\317\377"
"\377o\317\377\377k\315\377\377k\315\377\377e\312\377\377\234\346\376\377"
"\374\376\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\370\374\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\370\374\377\377?\267\377\377;\264\376\377"
"5\262\377\3775\262\377\3775\262\377\3771\257\377\3771\257\377\3771\257\377"
"\377,\255\377\377,\255\377\377,\255\377\377*\253\377\377'\252\376\377'\252"
"\376\377#\250\376\377#\250\376\377!\216\323\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\1\2\2\377\201\324\367\377\200\330\377\377"
"~\327\377\377~\327\377\377\204\332\377\377\204\332\377\377\207\333\377\377"
"\207\333\377\377\207\333\377\377\211\334\377\377\213\336\377\377\211\334"
"\377\377\213\336\377\377\211\334\377\377\216\336\377\377\216\336\377\377"
"\215\336\377\377\215\336\377\377\215\336\377\377\215\336\377\377\222\341"
"\377\377\215\336\377\377\215\336\377\377\223\342\377\377\222\341\377\377"
"\222\341\377\377\222\341\377\377\222\341\377\377\222\341\377\377\215\336"
"\377\377\222\341\377\377\215\336\377\377\215\336\377\377\215\336\377\377"
"\215\336\377\377\215\336\377\377\215\336\377\377\213\336\377\377\213\336"
"\377\377\213\336\377\377\213\336\377\377\211\334\377\377\207\333\377\377"
"\204\332\377\377\207\333\377\377\204\332\377\377\204\332\377\377\204\332"
"\377\377~\327\377\377\204\332\377\377~\327\377\377~\327\377\377|\326\377"
"\377|\326\377\377z\325\377\377z\325\377\377x\324\377\377x\324\377\377v\323"
"\377\377t\322\377\377t\322\377\377t\322\377\377o\317\377\377o\317\377\377"
"o\317\377\377k\315\377\377o\317\377\377e\312\377\377k\315\377\377\307\363"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\231\344\376\377\263\361\377\377"
"\361\372\377\377\376\377\377\377\361\372\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\370\374\377\377\204\332\377\377"
";\264\376\3775\262\377\3775\262\377\3771\257\377\3771\257\377\3771\257\377"
"\377/\256\377\377,\255\377\377*\253\377\377*\253\377\377*\253\377\377'\252"
"\376\377'\252\376\377#\250\376\377#\250\376\377#\250\376\377\3\4\6\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\11\33'\377\200\327\376\377"
"\200\330\377\377\200\330\377\377\200\330\377\377\200\330\377\377\205\332"
"\377\377\205\332\377\377\207\333\377\377\207\333\377\377\207\333\377\377"
"\207\333\377\377\211\334\377\377\213\336\377\377\212\335\377\377\213\336"
"\377\377\213\336\377\377\213\336\377\377\213\336\377\377\213\336\377\377"
"\215\336\377\377\215\336\377\377\215\336\377\377\215\336\377\377\215\336"
"\377\377\215\336\377\377\215\336\377\377\215\336\377\377\222\341\377\377"
"\215\336\377\377\215\336\377\377\215\336\377\377\215\336\377\377\215\336"
"\377\377\215\336\377\377\213\336\377\377\213\336\377\377\213\336\377\377"
"\213\336\377\377\213\336\377\377\207\333\377\377\211\334\377\377\207\333"
"\377\377\207\333\377\377\207\333\377\377\204\332\377\377\204\332\377\377"
"\204\332\377\377\204\332\377\377~\327\377\377\177\330\377\377~\327\377\377"
"|\326\377\377z\325\377\377z\325\377\377z\325\377\377x\324\377\377v\323\377"
"\377v\323\377\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377l\316"
"\377\377t\322\377\377k\315\377\377k\315\377\377h\314\377\377h\314\377\377"
"h\314\377\377\361\372\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\361\372\377\377\376\376\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\376\377\377\307\363\377\377H\273\377\377"
"D\271\376\377D\271\376\377a\310\377\377\231\344\376\377\307\363\377\377\376"
"\377\377\377\370\374\377\377\352\370\377\377\374\376\377\377\307\363\377"
"\3777\262\377\3775\262\377\3775\262\377\3771\257\377\3771\257\377\3771\257"
"\377\377/\256\377\377*\253\377\377/\256\377\377(\252\376\377(\252\376\377"
"'\252\376\377'\252\376\377#\250\376\377#\250\376\377!\247\376\377\11\33'"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\25<S\377|\326\377"
"\377|\326\377\377\200\330\377\377\200\330\377\377\200\330\377\377\200\330"
"\377\377\205\332\377\377\200\330\377\377\207\333\377\377\207\333\377\377"
"\207\333\377\377\207\333\377\377\212\335\377\377\207\333\377\377\212\335"
"\377\377\212\335\377\377\212\335\377\377\213\336\377\377\213\336\377\377"
"\213\336\377\377\213\336\377\377\215\336\377\377\215\336\377\377\215\336"
"\377\377\216\336\377\377\216\336\377\377\216\336\377\377\216\336\377\377"
"\215\336\377\377\215\336\377\377\215\336\377\377\213\336\377\377\213\336"
"\377\377\213\336\377\377\211\334\377\377\213\336\377\377\213\336\377\377"
"\207\333\377\377\207\333\377\377\207\333\377\377\207\333\377\377\207\333"
"\377\377\204\332\377\377\204\332\377\377\207\333\377\377~\327\377\377~\327"
"\377\377\177\330\377\377~\327\377\377~\327\377\377|\326\377\377|\326\377"
"\377z\325\377\377x\324\377\377x\324\377\377x\324\377\377v\323\377\377t\322"
"\377\377t\322\377\377t\322\377\377o\317\377\377l\316\377\377t\322\377\377"
"l\316\377\377o\317\377\377k\315\377\377h\314\377\377h\314\377\377v\323\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\352\370\377\377\250\355\377"
"\377k\315\377\377t\322\377\377\376\376\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\376\376\377\377v\323\377\377H\273\377\377H\273\377\377D\271"
"\376\377D\271\376\377D\271\376\377<\265\376\377B\270\376\377t\322\377\377"
"\241\350\377\377\334\366\377\377\334\366\377\3775\262\377\3775\262\377\377"
"5\262\377\3771\257\377\3771\257\377\377/\256\377\377*\253\377\377/\256\377"
"\377(\252\376\377/\256\377\377(\252\376\377'\252\376\377!\247\376\377#\250"
"\376\377!\247\376\377!\247\376\377\24""5H\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\35Wz\377|\326\377\377|\326\377\377~\327\377\377~\327"
"\377\377\200\330\377\377\200\330\377\377\200\330\377\377\200\330\377\377"
"\204\332\377\377\204\332\377\377\207\333\377\377\207\333\377\377\207\333"
"\377\377\207\333\377\377\213\336\377\377\207\333\377\377\211\334\377\377"
"\213\336\377\377\213\336\377\377\211\334\377\377\213\336\377\377\213\336"
"\377\377\213\336\377\377\213\336\377\377\213\336\377\377\213\336\377\377"
"\211\334\377\377\213\336\377\377\213\336\377\377\213\336\377\377\213\336"
"\377\377\211\334\377\377\211\334\377\377\213\336\377\377\211\334\377\377"
"\211\334\377\377\212\335\377\377\207\333\377\377\204\332\377\377\207\333"
"\377\377\207\333\377\377\204\332\377\377\204\332\377\377\204\332\377\377"
"\204\332\377\377~\327\377\377~\327\377\377~\327\377\377|\326\377\377|\326"
"\377\377|\326\377\377|\326\377\377x\324\377\377x\324\377\377v\323\377\377"
"x\324\377\377t\322\377\377t\322\377\377t\322\377\377o\317\377\377l\316\377"
"\377l\316\377\377l\316\377\377l\316\377\377k\315\377\377h\314\377\377h\314"
"\377\377h\314\377\377\234\346\376\377\376\377\377\377\376\377\377\377\376"
"\377\377\377\374\376\377\377\370\374\377\377\263\361\377\377y\325\377\377"
"]\306\377\377V\302\377\377X\303\377\377V\302\377\377\255\357\377\377\376"
"\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\334\366\377\377H\273\377\377H\273\377"
"\377D\271\376\377D\271\376\377@\267\377\377@\267\377\377@\267\377\377?\267"
"\377\377;\264\376\377;\264\376\377;\264\376\377:\263\374\3777\262\377\377"
"1\257\377\3772\260\377\3772\260\377\3771\257\377\377/\256\377\377*\253\377"
"\377*\253\377\377*\253\377\377(\252\376\377(\252\376\377'\252\376\377!\247"
"\376\377#\250\376\377!\247\376\377\37\246\376\377\36Qn\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377A\202\244\377z\325\377\377|\326\377"
"\377|\326\377\377~\327\377\377~\327\377\377\200\330\377\377\200\330\377\377"
"\200\330\377\377~\327\377\377\204\332\377\377\204\332\377\377\204\332\377"
"\377\207\333\377\377\204\332\377\377\207\333\377\377\207\333\377\377\207"
"\333\377\377\211\334\377\377\211\334\377\377\211\334\377\377A\202\244\377"
"\36Qn\377\36Qn\377\25<S\377\24.=\377\204\323\364\377\213\336\377\377\211"
"\334\377\377\211\334\377\377\211\334\377\377\211\334\377\377\211\334\377"
"\377\211\334\377\377\211\334\377\377\207\333\377\377\207\333\377\377\204"
"\332\377\377\207\333\377\377\207\333\377\377\204\332\377\377\204\332\377"
"\377\207\333\377\377~\327\377\377~\327\377\377\177\330\377\377\177\330\377"
"\377~\327\377\377~\327\377\377|\326\377\377|\326\377\377|\326\377\377y\325"
"\377\377x\324\377\377x\324\377\377t\322\377\377t\322\377\377t\322\377\377"
"t\322\377\377t\322\377\377l\316\377\377o\317\377\377t\322\377\377k\315\377"
"\377k\315\377\377h\314\377\377h\314\377\377h\314\377\377e\312\377\377\307"
"\363\377\377\376\377\377\377\376\377\377\377\307\363\377\377\213\336\377"
"\377_\307\377\377_\307\377\377]\304\375\377]\304\375\377V\302\377\377X\303"
"\377\377V\302\377\377]\304\375\377\361\372\377\377\376\377\377\377\376\377"
"\377\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377"
"\200\327\376\377D\271\376\377H\273\377\377D\266\372\377D\271\376\377D\271"
"\376\377@\267\377\377<\265\376\377?\267\377\377;\264\376\377;\264\376\377"
"5\262\377\3777\262\377\3777\262\377\3772\260\377\3771\257\377\3771\257\377"
"\3771\257\377\377/\256\377\377/\256\377\377*\253\377\377*\253\377\377(\252"
"\376\377'\252\376\377'\252\376\377!\247\376\377#\250\376\377!\247\376\377"
"\37\246\376\377\32e\225\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377G\211\253\377z\325\377\377z\325\377\377z\325\377\377z\325\377\377|"
"\326\377\377|\326\377\377~\327\377\377\200\330\377\377~\327\377\377\204\332"
"\377\377~\327\377\377\207\333\377\377\204\332\377\377\204\332\377\377\204"
"\332\377\377\207\333\377\377\207\333\377\377\207\333\377\377\207\333\377"
"\377\204\332\377\377\36Qn\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377|\326"
"\377\377\211\334\377\377\211\334\377\377\211\334\377\377\205\332\377\377"
"\207\333\377\377\207\333\377\377\207\333\377\377\207\333\377\377\207\333"
"\377\377\207\333\377\377\207\333\377\377\204\332\377\377\204\332\377\377"
"\204\332\377\377~\327\377\377\177\330\377\377\177\330\377\377\204\332\377"
"\377~\327\377\377~\327\377\377|\326\377\377|\326\377\377|\326\377\377|\326"
"\377\377x\324\377\377x\324\377\377x\324\377\377t\322\377\377t\322\377\377"
"t\322\377\377t\322\377\377o\317\377\377l\316\377\377t\322\377\377o\317\377"
"\377o\317\377\377k\315\377\377h\314\377\377g\313\377\377k\315\377\377e\312"
"\377\377e\312\377\377v\323\377\377\234\346\376\377e\312\377\377a\310\377"
"\377_\307\377\377]\306\377\377]\306\377\377]\306\377\377X\303\377\377X\303"
"\377\377V\302\377\377V\302\377\377Q\277\377\377\207\333\377\377\376\377\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\352"
"\370\377\377I\274\377\377H\273\377\377D\271\376\377D\271\376\377D\271\376"
"\377D\271\376\377<\265\376\377@\267\377\377<\265\376\377<\265\376\377;\264"
"\376\377;\264\376\3775\262\377\3775\262\377\3772\260\377\3772\260\377\377"
"1\257\377\377/\256\377\377/\256\377\377,\255\377\377(\252\376\377(\252\376"
"\377(\252\376\377(\252\376\377!\247\376\377'\252\376\377!\247\376\377\37"
"\246\376\377\37\246\376\377&\212\311\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377Z\277\367\377x\324\377\377z\325\377\377z\325\377\377"
"z\325\377\377|\326\377\377|\326\377\377~\327\377\377|\326\377\377~\327\377"
"\377~\327\377\377~\327\377\377\204\332\377\377~\327\377\377\204\332\377\377"
"\204\332\377\377\204\332\377\377\204\332\377\377\204\332\377\377\207\333"
"\377\377\207\333\377\377\36Qn\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\202\313\347\377\205\332\377\377\205\332\377\377\207\333\377\377\207\333"
"\377\377\207\333\377\377\207\333\377\377\207\333\377\377\204\332\377\377"
"\204\332\377\377\204\332\377\377\204\332\377\377\204\332\377\377\204\332"
"\377\377\177\330\377\377~\327\377\377\204\332\377\377\177\330\377\377~\327"
"\377\377~\327\377\377|\326\377\377|\326\377\377y\325\377\377y\325\377\377"
"y\325\377\377x\324\377\377x\324\377\377x\324\377\377t\322\377\377t\322\377"
"\377t\322\377\377o\317\377\377o\317\377\377o\317\377\377o\317\377\377o\317"
"\377\377k\315\377\377k\315\377\377h\314\377\377k\315\377\377g\313\377\377"
"e\312\377\377e\312\377\377a\310\377\377a\310\377\377a\310\377\377a\310\377"
"\377]\306\377\377]\306\377\377]\304\375\377W\303\377\377X\303\377\377V\302"
"\377\377V\302\377\377V\302\377\377V\302\377\377Q\277\377\377\307\363\377"
"\377\376\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\216"
"\336\377\377H\273\377\377H\273\377\377D\271\376\377D\271\376\377@\267\377"
"\377@\267\377\377@\267\377\377<\265\376\377;\264\376\377;\264\376\377;\264"
"\376\3775\262\377\3775\262\377\3772\260\377\3772\260\377\3771\257\377\377"
"1\257\377\377/\256\377\377,\255\377\377*\253\377\377/\256\377\377(\252\376"
"\377(\252\376\377'\252\376\377%\250\376\377!\247\376\377!\247\376\377\37"
"\246\376\377\37\246\376\377!\216\323\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377Z\277\367\377v\323\377\377v\323\377\377z\325\377\377"
"z\325\377\377z\325\377\377|\326\377\377|\326\377\377|\326\377\377~\327\377"
"\377~\327\377\377\177\330\377\377\177\330\377\377\177\330\377\377\204\332"
"\377\377~\327\377\377~\327\377\377\204\332\377\377\207\333\377\377\204\332"
"\377\377\207\333\377\3773x\236\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"G\211\253\377\205\332\377\377\205\332\377\377\205\332\377\377\205\332\377"
"\377\200\330\377\377\207\333\377\377\204\332\377\377\204\332\377\377\204"
"\332\377\377~\327\377\377~\327\377\377\177\330\377\377\204\332\377\377~\327"
"\377\377~\327\377\377~\327\377\377~\327\377\377|\326\377\377|\326\377\377"
"|\326\377\377|\326\377\377y\325\377\377x\324\377\377x\324\377\377x\324\377"
"\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377l\316"
"\377\377o\317\377\377o\317\377\377k\315\377\377k\315\377\377k\315\377\377"
"h\314\377\377h\314\377\377e\312\377\377e\312\377\377e\312\377\377c\311\377"
"\377c\311\377\377a\310\377\377]\306\377\377]\306\377\377]\304\375\377]\304"
"\375\377]\304\375\377X\303\377\377V\302\377\377V\302\377\377V\302\377\377"
"V\302\377\377Q\277\377\377Q\277\377\377e\312\377\377\376\377\377\377\376"
"\377\377\377\376\377\377\377\370\374\377\377J\274\377\377H\273\377\377H\273"
"\377\377D\271\376\377B\270\376\377D\271\376\377<\265\376\377<\265\376\377"
"<\265\376\377?\267\377\377;\264\376\377;\264\376\3775\262\377\3775\262\377"
"\3775\262\377\3772\260\377\3771\257\377\3771\257\377\377,\255\377\377,\255"
"\377\377,\255\377\377(\252\376\377(\252\376\377'\252\376\377'\252\376\377"
"!\247\376\377'\252\376\377!\247\376\377\37\246\376\377\37\246\376\377\32"
"\225\347\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377p\320\377"
"\377t\322\377\377v\323\377\377v\323\377\377x\324\377\377z\325\377\377z\325"
"\377\377z\325\377\377|\326\377\377|\326\377\377|\326\377\377~\327\377\377"
"~\327\377\377\177\330\377\377\177\330\377\377~\327\377\377\204\332\377\377"
"~\327\377\377~\327\377\377~\327\377\377~\327\377\377G\211\253\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377A\202\244\377\205\332\377\377\205\332\377\377"
"\200\330\377\377\207\333\377\377\200\330\377\377\200\330\377\377~\327\377"
"\377~\327\377\377\177\330\377\377\204\332\377\377\177\330\377\377\177\330"
"\377\377~\327\377\377~\327\377\377~\327\377\377|\326\377\377|\326\377\377"
"|\326\377\377|\326\377\377y\325\377\377x\324\377\377x\324\377\377x\324\377"
"\377t\322\377\377x\324\377\377t\322\377\377t\322\377\377t\322\377\377l\316"
"\377\377l\316\377\377t\322\377\377o\317\377\377o\317\377\377k\315\377\377"
"k\315\377\377h\314\377\377h\314\377\377k\315\377\377e\312\377\377e\312\377"
"\377c\311\377\377c\311\377\377a\310\377\377a\310\377\377a\310\377\377]\306"
"\377\377]\304\375\377]\304\375\377]\304\375\377X\303\377\377V\302\377\377"
"V\302\377\377V\302\377\377Q\277\377\377Q\277\377\377Q\277\377\377Q\277\377"
"\377\250\355\377\377\374\376\377\377\374\376\377\377\227\343\377\377H\273"
"\377\377D\271\376\377D\271\376\377D\271\376\377B\270\376\377@\267\377\377"
"@\267\377\377@\267\377\377<\265\376\377;\264\376\3775\262\377\377;\264\376"
"\3775\262\377\3775\262\377\3771\257\377\3772\260\377\3771\257\377\377/\256"
"\377\377,\255\377\377,\255\377\377*\253\377\377(\252\376\377'\252\376\377"
"'\252\376\377%\250\376\377!\247\376\377!\247\376\377\37\246\376\377\37\246"
"\376\377\37\246\376\377\30\230\355\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377t\322\377\377t\322\377\377t\322\377\377v\323\377\377t\322"
"\377\377x\324\377\377x\324\377\377x\324\377\377z\325\377\377z\325\377\377"
"|\326\377\377|\326\377\377|\326\377\377|\326\377\377~\327\377\377|\326\377"
"\377\200\330\377\377\200\330\377\377\200\330\377\377\200\330\377\377\200"
"\330\377\377Z\277\367\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\36Qn\377"
"\200\330\377\377\200\330\377\377\200\330\377\377\200\330\377\377\200\330"
"\377\377\200\330\377\377\200\330\377\377\200\330\377\377~\327\377\377\200"
"\330\377\377~\327\377\377~\327\377\377|\326\377\377|\326\377\377|\326\377"
"\377z\325\377\377z\325\377\377z\325\377\377z\325\377\377x\324\377\377x\324"
"\377\377v\323\377\377x\324\377\377t\322\377\377t\322\377\377t\322\377\377"
"t\322\377\377l\316\377\377p\320\377\377p\320\377\377o\317\377\377o\317\377"
"\377k\315\377\377k\315\377\377h\314\377\377h\314\377\377h\314\377\377h\314"
"\377\377c\311\377\377c\311\377\377c\311\377\377c\311\377\377_\307\377\377"
"_\307\377\377]\306\377\377]\306\377\377]\304\375\377W\303\377\377W\303\377"
"\377W\303\377\377V\302\377\377V\302\377\377T\301\376\377T\301\376\377J\274"
"\377\377T\301\376\377J\274\377\377T\301\376\377\352\370\377\377\374\376\377"
"\377Q\277\377\377H\273\377\377H\273\377\377D\271\376\377B\270\376\377B\270"
"\376\377@\267\377\377<\265\376\377<\265\376\377<\265\376\377;\264\376\377"
"5\262\377\377;\264\376\3775\262\377\3775\262\377\3771\257\377\3771\257\377"
"\3771\257\377\377/\256\377\377,\255\377\377*\253\377\377,\255\377\377(\252"
"\376\377'\252\376\377'\252\376\377#\250\376\377#\250\376\377!\247\376\377"
"\37\246\376\377\37\246\376\377\33\244\376\377\33\244\376\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\4\12\15\377t\322\377\377t\322\377\377t\322"
"\377\377t\322\377\377t\322\377\377v\323\377\377v\323\377\377x\324\377\377"
"x\324\377\377z\325\377\377z\325\377\377z\325\377\377z\325\377\377|\326\377"
"\377|\326\377\377|\326\377\377|\326\377\377~\327\377\377~\327\377\377~\327"
"\377\377~\327\377\377\201\313\347\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\25<S\377\200\330\377\377\200\330\377\377\200\330\377\377~\327\377\377"
"\200\330\377\377\200\330\377\377~\327\377\377~\327\377\377~\327\377\377~"
"\327\377\377|\326\377\377|\326\377\377|\326\377\377z\325\377\377z\325\377"
"\377z\325\377\377z\325\377\377x\324\377\377x\324\377\377v\323\377\377v\323"
"\377\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377"
"t\322\377\377t\322\377\377l\316\377\377l\316\377\377k\315\377\377k\315\377"
"\377k\315\377\377h\314\377\377h\314\377\377e\312\377\377e\312\377\377e\312"
"\377\377c\311\377\377c\311\377\377_\307\377\377c\311\377\377_\307\377\377"
"]\306\377\377]\306\377\377]\306\377\377]\304\375\377V\302\377\377W\303\377"
"\377W\303\377\377V\302\377\377T\301\376\377T\301\376\377T\301\376\377T\301"
"\376\377J\274\377\377J\274\377\377I\274\377\377e\312\377\377c\311\377\377"
"D\271\376\377D\271\376\377D\271\376\377D\271\376\377B\270\376\377@\267\377"
"\377<\265\376\377@\267\377\377<\265\376\377<\265\376\377;\264\376\3775\262"
"\377\3775\262\377\3772\260\377\3772\260\377\3771\257\377\377/\256\377\377"
"/\256\377\377,\255\377\377,\255\377\377*\253\377\377*\253\377\377'\252\376"
"\377'\252\376\377'\252\376\377#\250\376\377!\247\376\377\37\246\376\377\37"
"\246\376\377\37\246\376\377\32\243\376\377\32\243\376\377\4\12\15\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\10\24\32\377l\316\377\377o\317\377\377t\322"
"\377\377t\322\377\377t\322\377\377t\322\377\377v\323\377\377v\323\377\377"
"v\323\377\377x\324\377\377x\324\377\377z\325\377\377z\325\377\377z\325\377"
"\377z\325\377\377z\325\377\377|\326\377\377|\326\377\377|\326\377\377|\326"
"\377\377|\326\377\377|\326\377\377\4\12\15\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\17$0\377~\327\377\377~\327\377\377~\327\377\377~\327\377\377|\326\377"
"\377|\326\377\377|\326\377\377|\326\377\377|\326\377\377|\326\377\377|\326"
"\377\377z\325\377\377z\325\377\377z\325\377\377z\325\377\377x\324\377\377"
"x\324\377\377v\323\377\377v\323\377\377v\323\377\377t\322\377\377t\322\377"
"\377t\322\377\377t\322\377\377t\322\377\377l\316\377\377l\316\377\377l\316"
"\377\377p\320\377\377l\316\377\377k\315\377\377k\315\377\377h\314\377\377"
"h\314\377\377e\312\377\377h\314\377\377e\312\377\377c\311\377\377c\311\377"
"\377c\311\377\377_\307\377\377_\307\377\377]\306\377\377]\306\377\377]\306"
"\377\377]\304\375\377W\303\377\377]\304\375\377V\302\377\377V\302\377\377"
"T\301\376\377N\276\377\377T\301\376\377N\276\377\377N\276\377\377T\301\376"
"\377J\274\377\377J\274\377\377I\274\377\377H\273\377\377H\273\377\377D\271"
"\376\377D\271\376\377B\270\376\377B\270\376\377@\267\377\377@\267\377\377"
"<\265\376\377<\265\376\377<\265\376\3775\262\377\377;\264\376\3775\262\377"
"\3775\262\377\3772\260\377\3771\257\377\3771\257\377\377/\256\377\377,\255"
"\377\377,\255\377\377,\255\377\377*\253\377\377'\252\376\377'\252\376\377"
"#\250\376\377#\250\376\377!\247\376\377!\247\376\377\37\246\376\377\33\244"
"\376\377\33\244\376\377\27\242\377\377\6\16\24\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\10\24\32\377o\317\377\377o\317\377\377o\317\377\377t\322\377\377"
"t\322\377\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377v\323\377"
"\377x\324\377\377x\324\377\377x\324\377\377z\325\377\377z\325\377\377z\325"
"\377\377z\325\377\377z\325\377\377z\325\377\377|\326\377\377|\326\377\377"
"|\326\377\377\17$0\377\0\0\0\377\0\0\0\377\0\0\0\377\6\16\24\377|\326\377"
"\377|\326\377\377|\326\377\377|\326\377\377|\326\377\377z\325\377\377|\326"
"\377\377z\325\377\377z\325\377\377z\325\377\377z\325\377\377z\325\377\377"
"x\324\377\377x\324\377\377z\325\377\377v\323\377\377v\323\377\377v\323\377"
"\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377l\316"
"\377\377t\322\377\377l\316\377\377l\316\377\377t\322\377\377l\316\377\377"
"l\316\377\377k\315\377\377h\314\377\377k\315\377\377e\312\377\377h\314\377"
"\377e\312\377\377c\311\377\377c\311\377\377c\311\377\377_\307\377\377_\307"
"\377\377]\306\377\377]\306\377\377]\304\375\377]\306\377\377V\302\377\377"
"W\303\377\377V\302\377\377V\302\377\377V\302\377\377T\301\376\377T\301\376"
"\377N\276\377\377N\276\377\377J\274\377\377N\276\377\377J\274\377\377J\274"
"\377\377H\273\377\377I\274\377\377D\271\376\377D\271\376\377D\271\376\377"
"B\270\376\377@\267\377\377<\265\376\377<\265\376\377<\265\376\377<\265\376"
"\3778\263\376\377;\264\376\3775\262\377\3772\260\377\3772\260\377\3772\260"
"\377\3771\257\377\3771\257\377\377/\256\377\377,\255\377\377*\253\377\377"
"*\253\377\377'\252\376\377'\252\376\377'\252\376\377#\250\376\377#\250\376"
"\377!\247\376\377\37\246\376\377\37\246\376\377\33\244\376\377\33\244\376"
"\377\32\243\376\377\10\24\32\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\4\12\15"
"\377o\317\377\377o\317\377\377o\317\377\377l\316\377\377t\322\377\377t\322"
"\377\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377v\323\377\377"
"v\323\377\377v\323\377\377v\323\377\377x\324\377\377x\324\377\377x\324\377"
"\377z\325\377\377z\325\377\377z\325\377\377z\325\377\377z\325\377\377\24"
"""5H\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377|\326\377\377z\325\377\377"
"z\325\377\377z\325\377\377z\325\377\377z\325\377\377z\325\377\377z\325\377"
"\377x\324\377\377x\324\377\377x\324\377\377x\324\377\377v\323\377\377v\323"
"\377\377v\323\377\377v\323\377\377t\322\377\377t\322\377\377v\323\377\377"
"t\322\377\377t\322\377\377t\322\377\377l\316\377\377l\316\377\377t\322\377"
"\377l\316\377\377l\316\377\377l\316\377\377l\316\377\377l\316\377\377h\314"
"\377\377h\314\377\377h\314\377\377e\312\377\377c\311\377\377c\311\377\377"
"c\311\377\377_\307\377\377_\307\377\377_\307\377\377]\306\377\377]\306\377"
"\377]\304\375\377]\304\375\377W\303\377\377W\303\377\377V\302\377\377V\302"
"\377\377V\302\377\377T\301\376\377T\301\376\377T\301\376\377T\301\376\377"
"J\274\377\377J\274\377\377N\276\377\377I\274\377\377I\274\377\377I\274\377"
"\377D\271\376\377D\271\376\377D\271\376\377D\266\372\377@\267\377\377@\267"
"\377\377@\267\377\377<\265\376\377<\265\376\377=\265\376\3778\263\376\377"
";\264\376\3775\262\377\3772\260\377\3772\260\377\3771\257\377\377/\256\377"
"\377/\256\377\377,\255\377\377*\253\377\377,\255\377\377*\253\377\377'\252"
"\376\377'\252\376\377#\250\376\377#\250\376\377\37\246\376\377\37\246\376"
"\377\37\246\376\377\37\246\376\377\33\244\376\377\33\244\376\377\27\242\377"
"\377\4\12\15\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377o\317\377\377k"
"\315\377\377o\317\377\377t\322\377\377l\316\377\377l\316\377\377t\322\377"
"\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377t\322"
"\377\377v\323\377\377t\322\377\377v\323\377\377v\323\377\377x\324\377\377"
"x\324\377\377x\324\377\377x\324\377\377z\325\377\377\35Wz\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377A\202\244\377z\325\377\377x\324\377\377z\325"
"\377\377x\324\377\377x\324\377\377z\325\377\377z\325\377\377x\324\377\377"
"x\324\377\377v\323\377\377v\323\377\377v\323\377\377t\322\377\377t\322\377"
"\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377l\316\377\377o\317"
"\377\377l\316\377\377l\316\377\377t\322\377\377l\316\377\377o\317\377\377"
"l\316\377\377l\316\377\377f\313\377\377f\313\377\377h\314\377\377h\314\377"
"\377h\314\377\377e\312\377\377c\311\377\377c\311\377\377c\311\377\377c\311"
"\377\377_\307\377\377_\307\377\377]\306\377\377]\304\375\377]\304\375\377"
"W\303\377\377W\303\377\377W\303\377\377V\302\377\377V\302\377\377V\302\377"
"\377T\301\376\377Q\277\377\377J\274\377\377T\301\376\377Q\277\377\377J\274"
"\377\377J\274\377\377I\274\377\377I\274\377\377H\273\377\377H\273\377\377"
"D\271\376\377B\270\376\377B\270\376\377@\267\377\377<\265\376\377<\265\376"
"\377<\265\376\377=\265\376\3778\263\376\3778\263\376\3775\262\377\3772\260"
"\377\3772\260\377\3772\260\377\3771\257\377\377/\256\377\377,\255\377\377"
",\255\377\377*\253\377\377*\253\377\377'\252\376\377'\252\376\377'\252\376"
"\377#\250\376\377#\250\376\377#\250\376\377\37\246\376\377\37\246\376\377"
"\33\244\376\377\33\244\376\377\27\242\377\377\27\242\377\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\\\301\370\377k\315\377\377o\317"
"\377\377o\317\377\377o\317\377\377l\316\377\377t\322\377\377l\316\377\377"
"t\322\377\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377t\322\377"
"\377t\322\377\377t\322\377\377v\323\377\377v\323\377\377v\323\377\377v\323"
"\377\377v\323\377\377v\323\377\377G\211\253\377\4\12\15\377\24""5H\377\35"
"Wz\377A\202\244\377\\\301\370\377z\325\377\377v\323\377\377v\323\377\377"
"v\323\377\377v\323\377\377v\323\377\377v\323\377\377v\323\377\377v\323\377"
"\377t\322\377\377t\322\377\377t\322\377\377v\323\377\377t\322\377\377t\322"
"\377\377t\322\377\377o\317\377\377l\316\377\377t\322\377\377l\316\377\377"
"t\322\377\377l\316\377\377l\316\377\377o\317\377\377k\315\377\377f\313\377"
"\377l\316\377\377f\313\377\377f\313\377\377e\312\377\377h\314\377\377c\311"
"\377\377c\311\377\377c\311\377\377c\311\377\377_\307\377\377_\307\377\377"
"_\307\377\377]\306\377\377]\304\375\377]\304\375\377W\303\377\377W\303\377"
"\377W\303\377\377W\303\377\377V\302\377\377T\301\376\377T\301\376\377T\301"
"\376\377J\274\377\377T\301\376\377T\301\376\377J\274\377\377N\276\377\377"
"J\274\377\377I\274\377\377I\274\377\377D\271\376\377D\271\376\377D\271\376"
"\377B\270\376\377@\267\377\377<\265\376\377<\265\376\377<\265\376\377=\265"
"\376\3778\263\376\3778\263\376\3778\263\376\3775\262\377\3775\262\377\377"
"2\260\377\3771\257\377\3771\257\377\377/\256\377\377,\255\377\377*\253\377"
"\377,\255\377\377*\253\377\377'\252\376\377'\252\376\377#\250\376\377#\250"
"\376\377#\250\376\377\37\246\376\377\37\246\376\377\37\246\376\377\33\244"
"\376\377\33\244\376\377\33\244\376\377\22\231\364\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377Z\277\367\377k\315\377\377k\315\377\377k\315"
"\377\377o\317\377\377l\316\377\377t\322\377\377l\316\377\377t\322\377\377"
"l\316\377\377l\316\377\377o\317\377\377t\322\377\377t\322\377\377t\322\377"
"\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377t\322"
"\377\377v\323\377\377v\323\377\377v\323\377\377v\323\377\377z\325\377\377"
"x\324\377\377x\324\377\377x\324\377\377v\323\377\377v\323\377\377v\323\377"
"\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377t\322"
"\377\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377"
"l\316\377\377o\317\377\377o\317\377\377t\322\377\377l\316\377\377l\316\377"
"\377l\316\377\377k\315\377\377k\315\377\377k\315\377\377l\316\377\377f\313"
"\377\377f\313\377\377e\312\377\377c\311\377\377e\312\377\377c\311\377\377"
"c\311\377\377c\311\377\377_\307\377\377_\307\377\377]\306\377\377]\306\377"
"\377]\306\377\377]\304\375\377W\303\377\377]\304\375\377W\303\377\377V\302"
"\377\377W\303\377\377V\302\377\377T\301\376\377J\274\377\377Q\277\377\377"
"T\301\376\377J\274\377\377J\274\377\377J\274\377\377J\274\377\377I\274\377"
"\377I\274\377\377D\271\376\377D\271\376\377D\271\376\377D\271\376\377B\270"
"\376\377@\267\377\377@\267\377\377=\265\376\377=\265\376\3778\263\376\377"
"8\263\376\3777\262\377\3777\262\377\3772\260\377\3772\260\377\3772\260\377"
"\3771\257\377\377/\256\377\377,\255\377\377,\255\377\377,\255\377\377*\253"
"\377\377'\252\376\377'\252\376\377'\252\376\377#\250\376\377#\250\376\377"
"\37\246\376\377\37\246\376\377\37\246\376\377\33\244\376\377\33\244\376\377"
"\27\242\377\377\32\225\347\377\32\225\347\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377Z\277\367\377h\314\377\377h\314\377\377k\315\377\377"
"k\315\377\377l\316\377\377l\316\377\377l\316\377\377l\316\377\377l\316\377"
"\377t\322\377\377l\316\377\377t\322\377\377l\316\377\377t\322\377\377t\322"
"\377\377l\316\377\377v\323\377\377t\322\377\377t\322\377\377t\322\377\377"
"t\322\377\377t\322\377\377t\322\377\377t\322\377\377v\323\377\377v\323\377"
"\377v\323\377\377r\321\377\377v\323\377\377r\321\377\377r\321\377\377v\323"
"\377\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377l\316\377\377"
"t\322\377\377t\322\377\377l\316\377\377o\317\377\377o\317\377\377t\322\377"
"\377l\316\377\377l\316\377\377l\316\377\377l\316\377\377l\316\377\377l\316"
"\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377e\312\377\377"
"e\312\377\377e\312\377\377e\312\377\377e\312\377\377e\312\377\377_\307\377"
"\377_\307\377\377_\307\377\377]\306\377\377]\306\377\377]\306\377\377]\306"
"\377\377W\303\377\377W\303\377\377W\303\377\377W\303\377\377W\303\377\377"
"T\301\376\377T\301\376\377T\301\376\377N\276\377\377T\301\376\377J\274\377"
"\377J\274\377\377J\274\377\377J\274\377\377I\274\377\377G\272\377\377G\272"
"\377\377D\271\376\377B\270\376\377B\270\376\377B\270\376\377B\270\376\377"
"<\265\376\377@\267\377\377<\265\376\377<\265\376\377;\264\376\3775\262\377"
"\3775\262\377\3771\257\377\3771\257\377\3771\257\377\3771\257\377\3771\257"
"\377\377/\256\377\377,\255\377\377*\253\377\377*\253\377\377(\252\376\377"
"'\252\376\377'\252\376\377'\252\376\377!\247\376\377!\247\376\377\37\246"
"\376\377\37\246\376\377\37\246\376\377\32\243\376\377\33\244\376\377\21\233"
"\371\377\11\33'\377\17$0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377G\211\253\377h\314\377\377h\314\377\377h\314\377\377k\315\377\377"
"k\315\377\377l\316\377\377l\316\377\377l\316\377\377o\317\377\377o\317\377"
"\377o\317\377\377t\322\377\377l\316\377\377t\322\377\377l\316\377\377t\322"
"\377\377l\316\377\377t\322\377\377t\322\377\377t\322\377\377t\322\377\377"
"l\316\377\377t\322\377\377t\322\377\377s\321\377\377s\321\377\377r\321\377"
"\377v\323\377\377s\321\377\377s\321\377\377r\321\377\377r\321\377\377t\322"
"\377\377t\322\377\377o\317\377\377o\317\377\377t\322\377\377l\316\377\377"
"l\316\377\377t\322\377\377o\317\377\377o\317\377\377l\316\377\377l\316\377"
"\377l\316\377\377l\316\377\377o\317\377\377k\315\377\377h\314\377\377h\314"
"\377\377h\314\377\377h\314\377\377e\312\377\377e\312\377\377e\312\377\377"
"e\312\377\377c\311\377\377e\312\377\377_\307\377\377_\307\377\377_\307\377"
"\377]\306\377\377]\306\377\377]\304\375\377]\304\375\377W\303\377\377W\303"
"\377\377W\303\377\377W\303\377\377W\303\377\377T\301\376\377T\301\376\377"
"N\276\377\377T\301\376\377N\276\377\377N\276\377\377N\276\377\377N\276\377"
"\377I\274\377\377I\274\377\377I\274\377\377I\274\377\377G\272\377\377D\271"
"\376\377D\271\376\377B\270\376\377B\270\376\377<\265\376\377<\265\376\377"
"<\265\376\377<\265\376\377<\265\376\377;\264\376\3775\262\377\3775\262\377"
"\3777\262\377\3771\257\377\3771\257\377\3771\257\377\3771\257\377\377,\255"
"\377\377,\255\377\377,\255\377\377*\253\377\377(\252\376\377'\252\376\377"
"%\250\376\377!\247\376\377!\247\376\377!\247\376\377\37\246\376\377\37\246"
"\376\377\33\244\376\377\33\244\376\377\27\242\377\377\25<S\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377A\202\244\377"
"h\314\377\377e\312\377\377h\314\377\377h\314\377\377h\314\377\377k\315\377"
"\377k\315\377\377l\316\377\377k\315\377\377k\315\377\377o\317\377\377l\316"
"\377\377o\317\377\377o\317\377\377l\316\377\377t\322\377\377t\322\377\377"
"l\316\377\377l\316\377\377t\322\377\377l\316\377\377l\316\377\377t\322\377"
"\377l\316\377\377s\321\377\377s\321\377\377m\316\377\377m\316\377\377m\316"
"\377\377s\321\377\377m\316\377\377r\321\377\377t\322\377\377l\316\377\377"
"t\322\377\377l\316\377\377o\317\377\377o\317\377\377o\317\377\377l\316\377"
"\377k\315\377\377k\315\377\377o\317\377\377k\315\377\377k\315\377\377k\315"
"\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377e\312\377\377"
"e\312\377\377e\312\377\377e\312\377\377_\307\377\377e\312\377\377_\307\377"
"\377_\307\377\377_\307\377\377_\307\377\377_\307\377\377]\306\377\377]\304"
"\375\377]\304\375\377W\303\377\377W\303\377\377W\303\377\377W\303\377\377"
"V\302\377\377T\301\376\377T\301\376\377T\301\376\377T\301\376\377N\276\377"
"\377N\276\377\377N\276\377\377J\274\377\377I\274\377\377I\274\377\377I\274"
"\377\377G\272\377\377G\272\377\377D\271\376\377D\271\376\377B\270\376\377"
"B\270\376\377B\270\376\377<\265\376\377<\265\376\377<\265\376\3778\263\376"
"\3778\263\376\377;\264\376\3775\262\377\3771\257\377\3777\262\377\3771\257"
"\377\3771\257\377\3771\257\377\377/\256\377\377/\256\377\377*\253\377\377"
"*\253\377\377*\253\377\377'\252\376\377'\252\376\377!\247\376\377%\250\376"
"\377!\247\376\377!\247\376\377\37\246\376\377\37\246\376\377\33\244\376\377"
"\32\243\376\377\31Fb\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\35Wz\377c\311\377\377h\314\377\377e\312\377"
"\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377k\315"
"\377\377k\315\377\377k\315\377\377k\315\377\377k\315\377\377k\315\377\377"
"o\317\377\377o\317\377\377l\316\377\377t\322\377\377l\316\377\377l\316\377"
"\377t\322\377\377o\317\377\377o\317\377\377o\317\377\377m\316\377\377m\316"
"\377\377m\316\377\377s\321\377\377m\316\377\377m\316\377\377s\321\377\377"
"m\316\377\377l\316\377\377t\322\377\377l\316\377\377l\316\377\377o\317\377"
"\377k\315\377\377k\315\377\377k\315\377\377k\315\377\377k\315\377\377k\315"
"\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377"
"e\312\377\377h\314\377\377e\312\377\377e\312\377\377e\312\377\377e\312\377"
"\377e\312\377\377_\307\377\377c\311\377\377_\307\377\377_\307\377\377]\306"
"\377\377]\306\377\377]\306\377\377]\304\375\377V\302\377\377W\303\377\377"
"W\303\377\377W\303\377\377T\301\376\377T\301\376\377T\301\376\377T\301\376"
"\377N\276\377\377N\276\377\377T\301\376\377N\276\377\377I\274\377\377N\276"
"\377\377I\274\377\377I\274\377\377I\274\377\377G\272\377\377B\270\376\377"
"B\270\376\377B\270\376\377B\270\376\377?\267\377\377?\267\377\377<\265\376"
"\377<\265\376\377<\265\376\3778\263\376\3778\263\376\3775\262\377\3775\262"
"\377\3775\262\377\3771\257\377\3771\257\377\3771\257\377\377/\256\377\377"
"*\253\377\377*\253\377\377*\253\377\377*\253\377\377'\252\376\377'\252\376"
"\377'\252\376\377'\252\376\377!\247\376\377!\247\376\377\37\246\376\377\37"
"\246\376\377\33\244\376\377\33\244\376\377\35Wz\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\25"
"<S\377c\311\377\377e\312\377\377e\312\377\377h\314\377\377h\314\377\377h"
"\314\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377"
"\377h\314\377\377k\315\377\377k\315\377\377o\317\377\377k\315\377\377l\316"
"\377\377l\316\377\377l\316\377\377l\316\377\377l\316\377\377t\322\377\377"
"l\316\377\377l\316\377\377o\317\377\377o\317\377\377o\317\377\377o\317\377"
"\377s\321\377\377m\316\377\377r\321\377\377m\316\377\377l\316\377\377l\316"
"\377\377l\316\377\377l\316\377\377l\316\377\377k\315\377\377k\315\377\377"
"k\315\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377"
"\377e\312\377\377h\314\377\377c\311\377\377e\312\377\377e\312\377\377c\311"
"\377\377e\312\377\377e\312\377\377_\307\377\377_\307\377\377_\307\377\377"
"_\307\377\377_\307\377\377]\306\377\377]\306\377\377]\306\377\377]\304\375"
"\377W\303\377\377]\304\375\377W\303\377\377V\302\377\377V\302\377\377T\301"
"\376\377T\301\376\377T\301\376\377N\276\377\377N\276\377\377N\276\377\377"
"N\276\377\377N\276\377\377N\276\377\377I\274\377\377I\274\377\377G\272\377"
"\377G\272\377\377D\271\376\377D\271\376\377B\270\376\377B\270\376\377B\270"
"\376\377<\265\376\377?\267\377\377<\265\376\377=\265\376\377=\265\376\377"
"7\262\377\3777\262\377\3777\262\377\3771\257\377\3771\257\377\3771\257\377"
"\3771\257\377\377/\256\377\377,\255\377\377,\255\377\377*\253\377\377*\253"
"\377\377'\252\376\377'\252\376\377%\250\376\377%\250\376\377!\247\376\377"
"!\247\376\377\37\246\376\377\37\246\376\377\37\246\376\377\33\244\376\377"
"\31Fb\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\17$0\377c\311\377\377c\311\377\377c"
"\311\377\377e\312\377\377c\311\377\377c\311\377\377h\314\377\377h\314\377"
"\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377h\314"
"\377\377k\315\377\377k\315\377\377l\316\377\377l\316\377\377l\316\377\377"
"l\316\377\377l\316\377\377l\316\377\377l\316\377\377l\316\377\377l\316\377"
"\377l\316\377\377l\316\377\377k\315\377\377k\315\377\377k\315\377\377m\316"
"\377\377k\315\377\377l\316\377\377k\315\377\377k\315\377\377k\315\377\377"
"k\315\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377"
"\377h\314\377\377e\312\377\377e\312\377\377h\314\377\377e\312\377\377e\312"
"\377\377c\311\377\377e\312\377\377c\311\377\377_\307\377\377_\307\377\377"
"e\312\377\377_\307\377\377_\307\377\377]\306\377\377]\306\377\377]\306\377"
"\377]\304\375\377W\303\377\377W\303\377\377W\303\377\377W\303\377\377V\302"
"\377\377V\302\377\377T\301\376\377T\301\376\377T\301\376\377N\276\377\377"
"N\276\377\377T\301\376\377N\276\377\377L\275\377\377L\275\377\377I\274\377"
"\377I\274\377\377G\272\377\377G\272\377\377G\272\377\377D\271\376\377B\270"
"\376\377B\270\376\377B\270\376\377<\265\376\377?\267\377\377<\265\376\377"
"<\265\376\377=\265\376\3778\263\376\3777\262\377\3777\262\377\3777\262\377"
"\3771\257\377\3771\257\377\3771\257\377\3771\257\377\377/\256\377\377,\255"
"\377\377,\255\377\377,\255\377\377*\253\377\377'\252\376\377'\252\376\377"
"%\250\376\377!\247\376\377'\252\376\377!\247\376\377\37\246\376\377\37\246"
"\376\377\32\243\376\377\25<S\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\3\4"
"\6\377]\306\377\377_\307\377\377c\311\377\377c\311\377\377c\311\377\377c"
"\311\377\377e\312\377\377e\312\377\377h\314\377\377c\311\377\377h\314\377"
"\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377h\314"
"\377\377h\314\377\377l\316\377\377f\313\377\377l\316\377\377h\314\377\377"
"f\313\377\377l\316\377\377k\315\377\377k\315\377\377k\315\377\377k\315\377"
"\377h\314\377\377k\315\377\377k\315\377\377h\314\377\377h\314\377\377h\314"
"\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377"
"h\314\377\377h\314\377\377c\311\377\377h\314\377\377h\314\377\377e\312\377"
"\377c\311\377\377c\311\377\377c\311\377\377e\312\377\377_\307\377\377c\311"
"\377\377_\307\377\377_\307\377\377_\307\377\377]\306\377\377]\306\377\377"
"]\306\377\377]\304\375\377]\304\375\377W\303\377\377W\303\377\377W\303\377"
"\377W\303\377\377V\302\377\377V\302\377\377T\301\376\377T\301\376\377N\276"
"\377\377N\276\377\377T\301\376\377J\274\377\377N\276\377\377L\275\377\377"
"L\275\377\377I\274\377\377I\274\377\377I\274\377\377G\272\377\377G\272\377"
"\377B\270\376\377B\270\376\377B\270\376\377?\267\377\377?\267\377\377?\267"
"\377\377<\265\376\377;\264\376\377;\264\376\3778\263\376\3778\263\376\377"
"7\262\377\3777\262\377\3771\257\377\3771\257\377\3771\257\377\3771\257\377"
"\377/\256\377\377,\255\377\377,\255\377\377*\253\377\377*\253\377\377'\252"
"\376\377'\252\376\377'\252\376\377%\250\376\377!\247\376\377!\247\376\377"
"\37\246\376\377\37\246\376\377\30\230\355\377\24.=\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\4\12\15\377\3\4\6\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377!\216\323\377c\311\377\377_\307\377"
"\377c\311\377\377c\311\377\377c\311\377\377c\311\377\377c\311\377\377e\312"
"\377\377e\312\377\377c\311\377\377h\314\377\377c\311\377\377h\314\377\377"
"e\312\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377"
"\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377h\314"
"\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377h\314\377\377"
"h\314\377\377h\314\377\377h\314\377\377h\314\377\377e\312\377\377h\314\377"
"\377h\314\377\377c\311\377\377h\314\377\377h\314\377\377e\312\377\377e\312"
"\377\377c\311\377\377c\311\377\377c\311\377\377c\311\377\377c\311\377\377"
"c\311\377\377_\307\377\377_\307\377\377_\307\377\377_\307\377\377]\306\377"
"\377]\306\377\377]\306\377\377]\306\377\377]\306\377\377W\303\377\377W\303"
"\377\377W\303\377\377V\302\377\377V\302\377\377V\302\377\377T\301\376\377"
"T\301\376\377T\301\376\377N\276\377\377T\301\376\377J\274\377\377T\301\376"
"\377J\274\377\377N\276\377\377I\274\377\377I\274\377\377G\272\377\377G\272"
"\377\377G\272\377\377D\271\376\377B\270\376\377B\270\376\377B\270\376\377"
"?\267\377\377<\265\376\377<\265\376\377;\264\376\377;\264\376\377;\264\376"
"\3778\263\376\3777\262\377\3777\262\377\3771\257\376\3771\257\377\3771\257"
"\377\3771\257\377\3771\257\377\377,\255\377\377,\255\377\377,\255\377\377"
"*\253\377\377*\253\377\377'\252\376\377'\252\376\377#\250\376\377!\247\376"
"\377!\247\376\377\37\246\376\377\37\246\376\377\37\246\376\377\31Fb\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\4\12\15\377\32e\225\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\3773x\236"
"\377]\306\377\377a\310\377\377a\310\377\377a\310\377\377a\310\377\377a\310"
"\377\377e\312\377\377e\312\377\377c\311\377\377c\311\377\377e\312\377\377"
"e\312\377\377e\312\377\377e\312\377\377e\312\377\377h\314\377\377e\312\377"
"\377e\312\377\377h\314\377\377h\314\377\377e\312\377\377h\314\377\377h\314"
"\377\377h\314\377\377h\314\377\377h\314\377\377e\312\377\377e\312\377\377"
"k\315\377\377e\312\377\377e\312\377\377h\314\377\377e\312\377\377e\312\377"
"\377h\314\377\377e\312\377\377e\312\377\377e\312\377\377e\312\377\377e\312"
"\377\377e\312\377\377_\307\377\377e\312\377\377_\307\377\377_\307\377\377"
"_\307\377\377_\307\377\377_\307\377\377_\307\377\377_\307\377\377]\306\377"
"\377]\306\377\377]\304\375\377]\304\375\377]\306\377\377W\303\377\377W\303"
"\377\377W\303\377\377W\303\377\377W\303\377\377V\302\377\377T\301\376\377"
"T\301\376\377T\301\376\377Q\277\377\377Q\277\377\377T\301\376\377J\274\377"
"\377J\274\377\377J\274\377\377J\274\377\377J\274\377\377J\274\377\377H\273"
"\377\377H\273\377\377H\273\377\377D\271\376\377D\271\376\377@\267\377\377"
"B\270\376\377?\267\377\377?\267\377\377?\267\377\377;\264\376\377;\264\376"
"\377;\264\376\3775\262\377\3775\262\377\3775\262\377\3772\260\377\3772\260"
"\377\3771\257\377\3771\257\377\377/\256\377\377/\256\377\377/\256\377\377"
"+\254\377\377/\256\377\377(\252\376\377'\252\376\377'\252\376\377'\252\376"
"\377#\250\376\377'\252\376\377!\247\376\377\37\246\376\377\37\246\376\377"
"\33\244\376\377\30\230\355\377\11\33'\377\0\0\0\377\0\0\0\377\0\0\0\377\6"
"\16\24\377!\216\323\377\32e\225\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\24""5H\377]\306\377\377]\306\377\377]\306\377"
"\377]\306\377\377a\310\377\377a\310\377\377a\310\377\377c\311\377\377_\307"
"\377\377c\311\377\377c\311\377\377c\311\377\377c\311\377\377e\312\377\377"
"e\312\377\377e\312\377\377e\312\377\377e\312\377\377e\312\377\377e\312\377"
"\377e\312\377\377e\312\377\377e\312\377\377h\314\377\377e\312\377\377G\211"
"\253\377\35Wz\377\10\27\40\3773x\236\377e\312\377\377e\312\377\377e\312\377"
"\377e\312\377\377e\312\377\377e\312\377\377c\311\377\377c\311\377\377c\311"
"\377\377c\311\377\377_\307\377\377e\312\377\377_\307\377\377e\312\377\377"
"_\307\377\377e\312\377\377_\307\377\377_\307\377\377_\307\377\377_\307\377"
"\377]\306\377\377]\304\375\377]\304\375\377]\304\375\377T\301\376\377W\303"
"\377\377W\303\377\377W\303\377\377W\303\377\377T\301\376\377V\302\377\377"
"T\301\376\377T\301\376\377T\301\376\377T\301\376\377J\274\377\377J\274\377"
"\377Q\277\377\377Q\277\377\377J\274\377\377I\274\377\377I\274\377\377J\274"
"\377\377I\274\377\377D\271\376\377H\273\377\377D\271\376\377D\271\376\377"
"@\267\377\377D\271\376\377?\267\377\377?\267\377\377;\264\376\377;\264\376"
"\377;\264\376\377;\264\376\377;\264\376\3775\262\377\3775\262\377\3775\262"
"\377\3772\260\377\3772\260\377\3771\257\377\377/\256\377\377/\256\377\377"
",\255\377\377(\252\376\377+\254\377\377(\252\376\377(\252\376\377'\252\376"
"\377'\252\376\377!\247\376\377#\250\376\377!\247\376\377\37\246\376\377\37"
"\246\376\377\33\244\376\377\33\244\376\377\32\243\376\377!\216\323\377\4"
"\12\15\377\0\0\0\377\10\27\40\377\37\222\335\377\21\237\377\377\25<S\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\6\16"
"\24\377]\306\377\377]\306\377\377]\306\377\377]\306\377\377]\306\377\377"
"]\306\377\377a\310\377\377_\307\377\377c\311\377\377c\311\377\377_\307\377"
"\377_\307\377\377e\312\377\377c\311\377\377e\312\377\377e\312\377\377e\312"
"\377\377e\312\377\377_\307\377\377e\312\377\377e\312\377\377e\312\377\377"
"e\312\377\377\\\301\370\377\4\12\15\377\0\0\0\377\0\0\0\377\0\0\0\377\11"
"\33'\377c\311\377\377c\311\377\377c\311\377\377c\311\377\377c\311\377\377"
"c\311\377\377c\311\377\377c\311\377\377c\311\377\377_\307\377\377_\307\377"
"\377e\312\377\377_\307\377\377_\307\377\377_\307\377\377_\307\377\377_\307"
"\377\377]\306\377\377]\306\377\377]\306\377\377]\304\375\377]\306\377\377"
"W\303\377\377]\304\375\377W\303\377\377W\303\377\377W\303\377\377W\303\377"
"\377W\303\377\377T\301\376\377T\301\376\377N\276\377\377N\276\377\377N\276"
"\377\377T\301\376\377T\301\376\377J\274\377\377Q\277\377\377J\274\377\377"
"J\274\377\377J\274\377\377I\274\377\377I\274\377\377H\273\377\377D\271\376"
"\377D\271\376\377D\271\376\377B\270\376\377D\271\376\377@\267\377\377?\267"
"\377\377<\265\376\377<\265\376\377<\265\376\377;\264\376\3775\262\377\377"
";\264\376\3775\262\377\3775\262\377\3771\257\377\3772\260\377\3771\257\377"
"\3771\257\377\377/\256\377\377/\256\377\377*\253\377\377/\256\377\377(\252"
"\376\377(\252\376\377(\252\376\377'\252\376\377!\247\376\377#\250\376\377"
"!\247\376\377!\247\376\377\37\246\376\377\37\246\376\377\33\244\376\377\32"
"\243\376\377\27\242\377\377\27\242\377\377\36k\234\377\24""5H\377\30\230"
"\355\377\27\242\377\377\21\237\377\377\4\12\15\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377G\211\253\377]\306"
"\377\377]\306\377\377]\306\377\377]\306\377\377]\306\377\377]\306\377\377"
"_\307\377\377_\307\377\377_\307\377\377_\307\377\377_\307\377\377c\311\377"
"\377_\307\377\377_\307\377\377_\307\377\377_\307\377\377_\307\377\377e\312"
"\377\377_\307\377\377e\312\377\377e\312\377\377e\312\377\377c\311\377\377"
"\11\33'\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377G\211\253\377c\311\377"
"\377c\311\377\377c\311\377\377c\311\377\377_\307\377\377_\307\377\377c\311"
"\377\377_\307\377\377c\311\377\377_\307\377\377_\307\377\377_\307\377\377"
"]\306\377\377]\306\377\377]\306\377\377]\306\377\377]\306\377\377]\304\375"
"\377]\304\375\377W\303\377\377W\303\377\377W\303\377\377W\303\377\377W\303"
"\377\377V\302\377\377W\303\377\377T\301\376\377T\301\376\377T\301\376\377"
"T\301\376\377T\301\376\377N\276\377\377T\301\376\377J\274\377\377T\301\376"
"\377J\274\377\377J\274\377\377J\274\377\377J\274\377\377I\274\377\377I\274"
"\377\377H\273\377\377D\271\376\377D\271\376\377D\271\376\377B\270\376\377"
"B\270\376\377@\267\377\377<\265\376\377?\267\377\377<\265\376\377<\265\376"
"\377;\264\376\3775\262\377\377;\264\376\3775\262\377\3775\262\377\3775\262"
"\377\3772\260\377\3771\257\377\3771\257\377\377/\256\377\377,\255\377\377"
"*\253\377\377/\256\377\377/\256\377\377(\252\376\377'\252\376\377'\252\376"
"\377'\252\376\377!\247\376\377#\250\376\377!\247\376\377\37\246\376\377\37"
"\246\376\377\37\246\376\377\32\243\376\377\32\243\376\377\27\242\377\377"
"\27\242\377\377\27\242\377\377\27\242\377\377\21\237\377\377\17\236\377\377"
"!\216\323\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\27[\207\377X\303\377\377]\306\377\377]\306\377\377"
"]\304\375\377]\306\377\377]\306\377\377]\306\377\377]\306\377\377]\306\377"
"\377]\306\377\377_\307\377\377_\307\377\377_\307\377\377_\307\377\377_\307"
"\377\377e\312\377\377_\307\377\377_\307\377\377e\312\377\377_\307\377\377"
"_\307\377\377_\307\377\377c\311\377\3773x\236\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\31Fb\377c\311\377\377_\307\377\377c\311\377\377_\307\377"
"\377_\307\377\377_\307\377\377_\307\377\377_\307\377\377]\306\377\377]\306"
"\377\377]\306\377\377]\306\377\377]\306\377\377]\306\377\377]\304\375\377"
"]\304\375\377]\304\375\377T\301\376\377W\303\377\377W\303\377\377W\303\377"
"\377W\303\377\377W\303\377\377W\303\377\377V\302\377\377T\301\376\377T\301"
"\376\377J\274\377\377T\301\376\377N\276\377\377T\301\376\377N\276\377\377"
"J\274\377\377Q\277\377\377J\274\377\377J\274\377\377J\274\377\377I\274\377"
"\377H\273\377\377I\274\377\377D\271\376\377D\271\376\377D\271\376\377D\271"
"\376\377B\270\376\377B\270\376\377B\270\376\377<\265\376\377<\265\376\377"
"<\265\376\377<\265\376\377;\264\376\377;\264\376\377;\264\376\3775\262\377"
"\3775\262\377\3772\260\377\3771\257\377\3772\260\377\3771\257\377\3771\257"
"\377\377/\256\377\377*\253\377\377*\253\377\377*\253\377\377(\252\376\377"
"(\252\376\377'\252\376\377'\252\376\377#\250\376\377#\250\376\377!\247\376"
"\377!\247\376\377\37\246\376\377\33\244\376\377\33\244\376\377\32\243\376"
"\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377"
"\377\21\237\377\377\21\237\377\377\27[\207\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\24.=\377X\303"
"\377\377X\303\377\377X\303\377\377X\303\377\377]\306\377\377]\304\375\377"
"]\304\375\377]\306\377\377]\306\377\377]\306\377\377]\306\377\377]\306\377"
"\377]\306\377\377_\307\377\377]\306\377\377_\307\377\377]\306\377\377]\306"
"\377\377_\307\377\377_\307\377\377_\307\377\377_\307\377\377]\306\377\377"
"Z\277\367\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\3\4\6\377\\\301\370"
"\377_\307\377\377_\307\377\377_\307\377\377]\306\377\377]\306\377\377]\306"
"\377\377]\306\377\377]\306\377\377]\306\377\377]\304\375\377]\306\377\377"
"]\304\375\377]\304\375\377W\303\377\377W\303\377\377W\303\377\377W\303\377"
"\377W\303\377\377W\303\377\377T\301\376\377W\303\377\377W\303\377\377T\301"
"\376\377T\301\376\377T\301\376\377T\301\376\377T\301\376\377T\301\376\377"
"T\301\376\377J\274\377\377T\301\376\377J\274\377\377J\274\377\377J\274\377"
"\377J\274\377\377J\274\377\377H\273\377\377I\274\377\377D\271\376\377D\271"
"\376\377D\271\376\377B\270\376\377B\270\376\377B\270\376\377@\267\377\377"
"<\265\376\377@\267\377\377<\265\376\377<\265\376\377;\264\376\3775\262\377"
"\377:\263\374\3775\262\377\3775\262\377\3775\262\377\3772\260\377\3772\260"
"\377\3771\257\377\377/\256\377\377/\256\377\377*\253\377\377/\256\377\377"
"*\253\377\377*\253\377\377(\252\376\377'\252\376\377%\250\376\377\27[\207"
"\377\37\222\335\377!\247\376\377\37\246\376\377\37\246\376\377\33\244\376"
"\377\37\246\376\377\33\244\376\377\27\242\377\377\27\242\377\377\27\242\377"
"\377\27\242\377\377\21\237\377\377\21\237\377\377\21\237\377\377\17\236\377"
"\377\24.=\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377D\266\372\377V\302\377\377X\303\377\377X\303"
"\377\377V\302\377\377X\303\377\377W\303\377\377]\304\375\377]\306\377\377"
"]\304\375\377]\304\375\377]\304\375\377]\304\375\377]\306\377\377]\306\377"
"\377]\306\377\377]\306\377\377]\306\377\377]\306\377\377]\306\377\377_\307"
"\377\377]\306\377\377]\306\377\377]\306\377\377\25<S\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\3773x\236\377_\307\377\377]\306\377\377]\306\377\377"
"]\306\377\377]\306\377\377]\304\375\377]\306\377\377]\304\375\377]\304\375"
"\377]\306\377\377]\304\375\377W\303\377\377W\303\377\377W\303\377\377W\303"
"\377\377W\303\377\377W\303\377\377T\301\376\377W\303\377\377W\303\377\377"
"T\301\376\377T\301\376\377T\301\376\377T\301\376\377J\274\377\377T\301\376"
"\377T\301\376\377N\276\377\377J\274\377\377T\301\376\377I\274\377\377J\274"
"\377\377J\274\377\377J\274\377\377H\273\377\377I\274\377\377H\273\377\377"
"D\271\376\377D\271\376\377D\271\376\377B\270\376\377B\270\376\377B\270\376"
"\377<\265\376\377<\265\376\377<\265\376\377<\265\376\377<\265\376\377;\264"
"\376\377;\264\376\377;\264\376\3775\262\377\3775\262\377\3772\260\377\377"
"2\260\377\3772\260\377\3771\257\377\3771\257\377\377/\256\377\377,\255\377"
"\377/\256\377\377*\253\377\377(\252\376\377'\252\376\377'\252\376\377\32"
"e\225\377\10\24\32\377\0\0\0\377\25<S\377!\247\376\377\37\246\376\377\37"
"\246\376\377\37\246\376\377\32\243\376\377\32\243\376\377\32\243\376\377"
"\27\242\377\377\27\242\377\377\21\237\377\377\27\242\377\377\21\237\377\377"
"\21\237\377\377\37\222\335\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\35Wz\377V\302"
"\377\377V\302\377\377V\302\377\377X\303\377\377V\302\377\377W\303\377\377"
"W\303\377\377W\303\377\377W\303\377\377W\303\377\377]\306\377\377]\304\375"
"\377]\304\375\377]\306\377\377]\306\377\377]\304\375\377]\306\377\377]\306"
"\377\377]\306\377\377]\304\375\377]\306\377\377]\306\377\377]\306\377\377"
">\211\263\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\17$0\377]\306\377\377"
"]\304\375\377]\304\375\377]\304\375\377]\304\375\377]\306\377\377W\303\377"
"\377W\303\377\377W\303\377\377W\303\377\377W\303\377\377W\303\377\377W\303"
"\377\377W\303\377\377V\302\377\377V\302\377\377W\303\377\377W\303\377\377"
"T\301\376\377T\301\376\377N\276\377\377T\301\376\377N\276\377\377N\276\377"
"\377T\301\376\377J\274\377\377J\274\377\377T\301\376\377J\274\377\377N\276"
"\377\377J\274\377\377I\274\377\377I\274\377\377H\273\377\377H\273\377\377"
"D\271\376\377H\273\377\377D\271\376\377D\271\376\377B\270\376\377B\270\376"
"\377B\270\376\377B\270\376\377<\265\376\377@\267\377\377<\265\376\377<\265"
"\376\377<\265\376\377;\264\376\3775\262\377\3775\262\377\3775\262\377\377"
"5\262\377\3772\260\377\3772\260\377\3771\257\377\3771\257\377\377/\256\377"
"\377,\255\377\377,\255\377\377(\252\376\377(\252\376\377'\252\376\377\27"
"[\207\377\6\16\24\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377!\216\323\377"
"\37\246\376\377\37\246\376\377\32\243\376\377\32\243\376\377\32\243\376\377"
"\27\242\377\377\27\242\377\377\27\242\377\377\21\237\377\377\21\237\377\377"
"\21\237\377\377\17\236\377\377\27[\207\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\10"
"\27\40\377T\301\376\377V\302\377\377V\302\377\377V\302\377\377V\302\377\377"
"V\302\377\377V\302\377\377W\303\377\377W\303\377\377]\304\375\377V\302\377"
"\377W\303\377\377W\303\377\377W\303\377\377W\303\377\377V\302\377\377]\306"
"\377\377]\304\375\377]\306\377\377]\304\375\377]\306\377\377]\304\375\377"
"]\304\375\377]\304\375\377\10\24\32\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377>\211\263\377W\303\377\377W\303\377\377]\304\375\377W\303\377\377W"
"\303\377\377W\303\377\377W\303\377\377W\303\377\377W\303\377\377W\303\377"
"\377T\301\376\377W\303\377\377W\303\377\377W\303\377\377V\302\377\377T\301"
"\376\377T\301\376\377T\301\376\377T\301\376\377N\276\377\377R\300\376\377"
"R\300\376\377N\276\377\377J\274\377\377T\301\376\377J\274\377\377J\274\377"
"\377J\274\377\377J\274\377\377J\274\377\377H\273\377\377H\273\377\377H\273"
"\377\377H\273\377\377D\271\376\377D\271\376\377D\271\376\377B\270\376\377"
"B\270\376\377B\270\376\377<\265\376\377B\270\376\377<\265\376\377;\264\376"
"\377;\264\376\377;\264\376\3775\262\377\377;\264\376\3777\262\377\3771\257"
"\377\3772\260\377\3772\260\377\3772\260\377\3771\257\377\3771\257\377\377"
"/\256\377\377,\255\377\377,\255\377\377,\255\377\377\37\222\335\377\36Qn"
"\377\6\16\24\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\24""5H\377\37\246\376\377\33\244\376\377\32\243\376\377\27\242\377\377"
"\32\243\376\377\32\243\376\377\27\242\377\377\27\242\377\377\21\237\377\377"
"\21\237\377\377\17\236\377\377\17\236\377\377\11\33'\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377>\211\263\377V\302\377\377T\301\376\377T\301\376\377"
"V\302\377\377V\302\377\377V\302\377\377V\302\377\377V\302\377\377W\303\377"
"\377W\303\377\377W\303\377\377W\303\377\377]\304\375\377V\302\377\377]\304"
"\375\377W\303\377\377W\303\377\377W\303\377\377W\303\377\377W\303\377\377"
"W\303\377\377W\303\377\377V\302\377\377\35Wz\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\24""5H\377W\303\377\377W\303\377\377W\303\377\377W\303\377"
"\377W\303\377\377W\303\377\377W\303\377\377T\301\376\377W\303\377\377W\303"
"\377\377W\303\377\377T\301\376\377T\301\376\377T\301\376\377T\301\376\377"
"T\301\376\377T\301\376\377N\276\377\377N\276\377\377R\300\376\377N\276\377"
"\377N\276\377\377L\275\377\377J\274\377\377J\274\377\377J\274\377\377J\274"
"\377\377I\274\377\377I\274\377\377I\274\377\377H\273\377\377H\273\377\377"
"D\271\376\377D\271\376\377D\271\376\377B\270\376\377B\270\376\377B\270\376"
"\377@\267\377\377<\265\376\377<\265\376\377<\265\376\377<\265\376\377;\264"
"\376\377;\264\376\3775\262\377\377;\264\376\3777\262\377\3777\262\377\377"
"5\262\377\3771\257\377\3772\260\377\3771\257\377\3771\257\377\377/\256\377"
"\377,\255\377\377,\255\377\3771\210\275\377\25<S\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\11"
"\33'\377\30\230\355\377\33\244\376\377\32\243\376\377\32\243\376\377\27\242"
"\377\377\21\237\377\377\21\237\377\377\21\237\377\377\21\237\377\377\21\237"
"\377\377\17\236\377\377!\216\323\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\31Fb\377T\301\376\377T\301\376\377T\301\376\377T\301\376\377T\301"
"\376\377T\301\376\377V\302\377\377V\302\377\377V\302\377\377V\302\377\377"
"V\302\377\377V\302\377\377T\301\376\377W\303\377\377W\303\377\377W\303\377"
"\377W\303\377\377W\303\377\377V\302\377\377V\302\377\377W\303\377\377W\303"
"\377\377V\302\377\377D\266\372\377\3\4\6\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377>\211\263\377W\303\377\377V\302\377\377V\302\377\377V\302\377\377"
"V\302\377\377V\302\377\377W\303\377\377T\301\376\377T\301\376\377T\301\376"
"\377T\301\376\377T\301\376\377N\276\377\377N\276\377\377N\276\377\377N\276"
"\377\377N\276\377\377R\300\376\377N\276\377\377N\276\377\377L\275\377\377"
"L\275\377\377J\274\377\377J\274\377\377J\274\377\377J\274\377\377H\273\377"
"\377H\273\377\377I\274\377\377D\271\376\377D\271\376\377D\271\376\377D\271"
"\376\377@\267\377\377D\266\372\377@\267\377\377@\267\377\377<\265\376\377"
"<\265\376\377<\265\376\377<\265\376\377<\265\376\377<\265\376\377;\264\376"
"\3775\262\377\3777\262\377\3775\262\377\3775\262\377\3771\257\377\3772\260"
"\377\377/\256\377\3771\257\377\377/\256\377\377,\255\377\377,\255\377\377"
"*\253\377\377\17$0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\10\24\32\377\32e\225\377\32\243\376\377\33"
"\244\376\377\32\243\376\377\27\242\377\377\27\242\377\377\32\243\376\377"
"\27\242\377\377\21\237\377\377\21\237\377\377\17\236\377\377\17\236\377\377"
"\17\236\377\377\31Fb\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377D\266\372\377T\301\376\377J\274\377\377Q\277\377\377Q\277\377\377T\301"
"\376\377T\301\376\377T\301\376\377T\301\376\377T\301\376\377T\301\376\377"
"V\302\377\377V\302\377\377V\302\377\377V\302\377\377V\302\377\377V\302\377"
"\377V\302\377\377V\302\377\377T\301\376\377V\302\377\377W\303\377\377V\302"
"\377\377V\302\377\377\36Qn\377\0\0\0\377\0\0\0\377\4\12\15\377\35Wz\377C"
"\267\373\377V\302\377\377V\302\377\377V\302\377\377T\301\376\377T\301\376"
"\377T\301\376\377T\301\376\377T\301\376\377N\276\377\377T\301\376\377N\276"
"\377\377T\301\376\377N\276\377\377T\301\376\377T\301\376\377N\276\377\377"
"N\276\377\377N\276\377\377L\275\377\377L\275\377\377L\275\377\377L\275\377"
"\377J\274\377\377I\274\377\377I\274\377\377I\274\377\377H\273\377\377H\273"
"\377\377D\271\376\377D\271\376\377D\271\376\377D\271\376\377@\267\377\377"
"D\271\376\377@\267\377\377<\265\376\377@\267\377\377@\267\377\377<\265\376"
"\377<\265\376\377<\265\376\3778\263\376\3775\262\377\3777\262\377\3777\262"
"\377\3777\262\377\3775\262\377\3772\260\377\3772\260\377\3771\257\377\377"
"/\256\377\377/\256\377\377,\255\377\377,\255\377\377*\253\377\377,\255\377"
"\377\32e\225\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\11\33'\377\36k\234\377\37\246\376\377\37\246\376\377\33\244\376\377"
"\32\243\376\377\27\242\377\377\27\242\377\377\27\242\377\377\21\237\377\377"
"\32\243\376\377\21\237\377\377\21\237\377\377\17\236\377\377\16\235\377\377"
"\32\225\347\377\4\12\15\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\6\16\24\377>\211\263\377J\274\377\377T\301\376\377T\301\376\377Q\277"
"\377\377Q\277\377\377T\301\376\377T\301\376\377T\301\376\377T\301\376\377"
"T\301\376\377T\301\376\377T\301\376\377T\301\376\377T\301\376\377T\301\376"
"\377T\301\376\377T\301\376\377T\301\376\377T\301\376\377T\301\376\377T\301"
"\376\377T\301\376\377D\266\372\377\6\16\24\377\35Wz\377D\266\372\377T\301"
"\376\377V\302\377\377T\301\376\377T\301\376\377T\301\376\377T\301\376\377"
"T\301\376\377T\301\376\377T\301\376\377T\301\376\377N\276\377\377T\301\376"
"\377T\301\376\377N\276\377\377N\276\377\377L\275\377\377N\276\377\377N\276"
"\377\377L\275\377\377L\275\377\377L\275\377\377I\274\377\377L\275\377\377"
"I\274\377\377I\274\377\377I\274\377\377I\274\377\377D\271\376\377H\273\377"
"\377D\271\376\377D\271\376\377D\271\376\377@\267\377\377D\271\376\377@\267"
"\377\377@\267\377\377<\265\376\377<\265\376\377<\265\376\377<\265\376\377"
"<\265\376\377<\265\376\3778\263\376\3778\263\376\3778\263\376\3777\262\377"
"\3777\262\377\3771\257\377\3771\257\377\3771\257\377\3771\257\377\3771\257"
"\377\377/\256\377\377,\255\377\377,\255\377\377,\255\377\377*\253\377\377"
"*\253\377\377\30\230\355\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\24."
"=\377\36k\234\377\37\246\376\377\37\246\376\377\37\246\376\377\33\244\376"
"\377\32\243\376\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377"
"\377\21\237\377\377\27\242\377\377\21\237\377\377\21\237\377\377\17\236\377"
"\377\16\235\377\377\35Wz\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\17$0\3773x\236\377I\274\377\377Q\277"
"\377\377J\274\377\377T\301\376\377J\274\377\377T\301\376\377J\274\377\377"
"T\301\376\377T\301\376\377N\276\377\377T\301\376\377T\301\376\377T\301\376"
"\377T\301\376\377Q\277\377\377T\301\376\377T\301\376\377N\276\377\377T\301"
"\376\377T\301\376\377V\302\377\377J\274\377\377T\301\376\377T\301\376\377"
"T\301\376\377T\301\376\377J\274\377\377T\301\376\377J\274\377\377T\301\376"
"\377T\301\376\377J\274\377\377N\276\377\377N\276\377\377N\276\377\377N\276"
"\377\377N\276\377\377N\276\377\377N\276\377\377L\275\377\377L\275\377\377"
"L\275\377\377L\275\377\377L\275\377\377L\275\377\377L\275\377\377G\272\377"
"\377G\272\377\377I\274\377\377H\273\377\377D\271\376\377D\271\376\377D\271"
"\376\377D\271\376\377B\270\376\377B\270\376\377@\267\377\377@\267\377\377"
"@\267\377\377@\267\377\377@\267\377\377<\265\376\377<\265\376\3778\263\376"
"\377=\265\376\3778\263\376\3778\263\376\3778\263\376\3777\262\377\3771\257"
"\376\377&p\234\3771\210\275\3772\260\377\3771\257\377\3771\257\377\377/\256"
"\377\377,\255\377\377,\255\377\377*\253\377\377,\255\377\377*\253\377\377"
"'\252\376\377'\252\376\377\24""5H\377\3\4\6\377\31Fb\377!\216\323\377#\250"
"\376\377\37\246\376\377\37\246\376\377\37\246\376\377\33\244\376\377\33\244"
"\376\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377\377\21\237"
"\377\377\21\237\377\377\21\237\377\377\17\236\377\377\17\236\377\377\17\236"
"\377\377\22\231\364\377\4\12\15\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\6\16\24\377\36"
"Qn\377>\211\263\377T\301\376\377T\301\376\377J\274\377\377T\301\376\377N"
"\276\377\377N\276\377\377N\276\377\377J\274\377\377T\301\376\377J\274\377"
"\377T\301\376\377Q\277\377\377T\301\376\377J\274\377\377T\301\376\377N\276"
"\377\377T\301\376\377T\301\376\377Q\277\377\377T\301\376\377J\274\377\377"
"J\274\377\377T\301\376\377T\301\376\377T\301\376\377J\274\377\377T\301\376"
"\377J\274\377\377T\301\376\377N\276\377\377N\276\377\377N\276\377\377L\275"
"\377\377L\275\377\377L\275\377\377L\275\377\377L\275\377\377I\274\377\377"
"L\275\377\377G\272\377\377L\275\377\377G\272\377\377G\272\377\377G\272\377"
"\377G\272\377\377D\271\376\377D\271\376\377D\271\376\377D\271\376\377B\270"
"\376\377B\270\376\377B\270\376\377B\270\376\377@\267\377\377@\267\377\377"
"<\265\376\377<\265\376\377<\265\376\377<\265\376\377=\265\376\3778\263\376"
"\3778\263\376\3778\263\376\3771\210\275\377\35Wz\377\17$0\377\0\0\0\377\0"
"\0\0\377\24""5H\3771\257\377\3771\257\377\377/\256\377\377,\255\377\377,"
"\255\377\377,\255\377\377*\253\377\377*\253\377\377*\253\377\377'\252\376"
"\377'\252\376\377\37\222\335\377\30\230\355\377#\250\376\377#\250\376\377"
"\37\246\376\377\37\246\376\377\37\246\376\377\33\244\376\377\33\244\376\377"
"\32\243\376\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377\377"
"\21\237\377\377\21\237\377\377\21\237\377\377\17\236\377\377\17\236\377\377"
"\17\236\377\377\27[\207\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\11\33'\377\35Wz\377D\266\372\377N\276\377\377N\276\377"
"\377N\276\377\377T\301\376\377N\276\377\377N\276\377\377T\301\376\377T\301"
"\376\377J\274\377\377N\276\377\377T\301\376\377N\276\377\377T\301\376\377"
"J\274\377\377T\301\376\377J\274\377\377Q\277\377\377T\301\376\377T\301\376"
"\377J\274\377\377J\274\377\377T\301\376\377J\274\377\377T\301\376\377J\274"
"\377\377J\274\377\377L\275\377\377L\275\377\377L\275\377\377L\275\377\377"
"L\275\377\377L\275\377\377L\275\377\377I\274\377\377I\274\377\377I\274\377"
"\377G\272\377\377G\272\377\377G\272\377\377G\272\377\377G\272\377\377D\271"
"\376\377D\271\376\377D\271\376\377D\271\376\377B\270\376\377B\270\376\377"
"@\267\377\377@\267\377\377<\265\376\377@\267\377\377<\265\376\377<\265\376"
"\377<\265\376\377=\265\376\377\37\222\335\377&p\234\377\36Qn\377\24.=\377"
"\3\4\6\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\6\16\24\377"
"/\256\377\377/\256\377\377,\255\377\377,\255\377\377,\255\377\377*\253\377"
"\377*\253\377\377'\252\376\377'\252\376\377'\252\376\377#\250\376\377#\250"
"\376\377#\250\376\377#\250\376\377\37\246\376\377\37\246\376\377\37\246\376"
"\377\33\244\376\377\33\244\376\377\32\243\376\377\32\243\376\377\27\242\377"
"\377\32\243\376\377\27\242\377\377\21\237\377\377\21\237\377\377\21\237\377"
"\377\17\236\377\377\17\236\377\377\17\236\377\377\21\233\371\377\6\16\24"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\3\4\6\377D\266\372\377J\274\377\377J\274\377\377Q\277\377\377J\274\377"
"\377Q\277\377\377Q\277\377\377J\274\377\377J\274\377\377T\301\376\377J\274"
"\377\377Q\277\377\377J\274\377\377T\301\376\377Q\277\377\377J\274\377\377"
"T\301\376\377T\301\376\377J\274\377\377T\301\376\377Q\277\377\377J\274\377"
"\377J\274\377\377J\274\377\377J\274\377\377Q\277\377\377J\274\377\377J\274"
"\377\377J\274\377\377I\274\377\377I\274\377\377J\274\377\377I\274\377\377"
"H\273\377\377H\273\377\377G\272\377\377I\274\377\377G\272\377\377G\272\377"
"\377G\272\377\377D\271\376\377G\272\377\377B\270\376\377B\270\376\377B\270"
"\376\377B\270\376\377B\270\376\377B\270\376\377<\265\376\377<\265\376\377"
"?\267\377\377<\265\376\377;\264\376\377?\267\377\377;\264\376\377\32e\225"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377&\212\311\377*\253\377\377/\256\377"
"\377(\252\376\377+\254\377\377(\252\376\377'\252\376\377'\252\376\377'\252"
"\376\377#\250\376\377#\250\376\377#\250\376\377#\250\376\377\37\246\376\377"
"\37\246\376\377\37\246\376\377\37\246\376\377\32\243\376\377\32\243\376\377"
"\32\243\376\377\27\242\377\377\27\242\377\377\27\242\377\377\21\237\377\377"
"\21\237\377\377\21\237\377\377\21\237\377\377\21\237\377\377\17\236\377\377"
"\17\236\377\377\35Wz\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\24""5H\377I\274\377\377J\274\377\377J\274"
"\377\377Q\277\377\377J\274\377\377J\274\377\377J\274\377\377J\274\377\377"
"Q\277\377\377J\274\377\377J\274\377\377J\274\377\377J\274\377\377J\274\377"
"\377J\274\377\377J\274\377\377J\274\377\377J\274\377\377J\274\377\377J\274"
"\377\377J\274\377\377J\274\377\377J\274\377\377J\274\377\377I\274\377\377"
"I\274\377\377J\274\377\377J\274\377\377J\274\377\377I\274\377\377H\273\377"
"\377H\273\377\377H\273\377\377H\273\377\377H\273\377\377G\272\377\377G\272"
"\377\377G\272\377\377B\270\376\377D\271\376\377D\271\376\377B\270\376\377"
"B\270\376\377B\270\376\3778\263\376\377?\267\377\377<\265\376\377<\265\376"
"\377?\267\377\377<\265\376\377<\265\376\377<\265\376\377;\264\376\377;\264"
"\376\3775\262\377\377&\212\311\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\27"
"[\207\377/\256\377\377(\252\376\377/\256\377\377(\252\376\377'\252\376\377"
"'\252\376\377'\252\376\377#\250\376\377#\250\376\377#\250\376\377#\250\376"
"\377\37\246\376\377\37\246\376\377\37\246\376\377\33\244\376\377\32\243\376"
"\377\32\243\376\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377"
"\377\27\242\377\377\21\237\377\377\21\237\377\377\21\237\377\377\17\236\377"
"\377\16\235\377\377\17\236\377\377\37\222\335\377\3\4\6\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\4\12\15\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377&p\234"
"\377I\274\377\377I\274\377\377I\274\377\377I\274\377\377J\274\377\377J\274"
"\377\377J\274\377\377J\274\377\377J\274\377\377J\274\377\377D\266\372\377"
"\0\0\0\377\11\33'\377\17$0\377\31Fb\377\36Qn\377&p\234\377&p\234\3773x\236"
"\377&\212\311\377&\212\311\377&\212\311\377D\266\372\377I\274\377\377I\274"
"\377\377H\273\377\377H\273\377\377I\274\377\377H\273\377\377H\273\377\377"
"H\273\377\377D\271\376\377H\273\377\377\37\222\335\377&\212\311\377&p\234"
"\377&p\234\377\27[\207\377\31Fb\377\31Fb\377\17$0\377\17$0\377\10\27\40\377"
"\0\0\0\377\35Wz\377<\265\376\377B\270\376\377<\265\376\377<\265\376\377;"
"\264\376\377;\264\376\377;\264\376\377;\264\376\377;\264\376\377;\264\376"
"\3771\257\377\377\1\2\2\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\10\27\40\377\31Fb\377\36k\234\377(\252\376\377*"
"\253\377\377(\252\376\377+\254\377\377(\252\376\377(\252\376\377%\250\376"
"\377%\250\376\377#\250\376\377#\250\376\377\37\246\376\377\37\246\376\377"
"\37\246\376\377\37\246\376\377\33\244\376\377\33\244\376\377\32\243\376\377"
"\27\242\377\377\27\242\377\377\27\242\377\377\21\237\377\377\27\242\377\377"
"\21\237\377\377\21\237\377\377\21\237\377\377\17\236\377\377\16\235\377\377"
"\16\235\377\377\17\236\377\377\24""5H\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\27[\207\377\35Wz\377\17$0\377\0\0\0\377:\262\373\377H\273"
"\377\377H\273\377\377H\273\377\377H\273\377\377H\273\377\377H\273\377\377"
"H\273\377\377I\274\377\377J\274\377\377J\274\377\377!\216\323\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377=\265\376\377H\273\377\377H\273\377\377H\273"
"\377\377I\274\377\377H\273\377\377H\273\377\377D\271\376\377H\273\377\377"
"D\271\376\377D\271\376\377\31Fb\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\31Fb\377<\265"
"\376\377<\265\376\377<\265\376\377<\265\376\377;\264\376\377:\263\374\377"
";\264\376\3775\262\377\3775\262\377\3775\262\377\3775\262\377\377\17$0\377"
"\0\0\0\377\1\2\2\377\0\0\0\377\10\27\40\377\25<S\377\36k\234\377\37\222\335"
"\377/\256\377\377/\256\377\377*\253\377\377/\256\377\377*\253\377\377(\252"
"\376\377'\252\376\377'\252\376\377'\252\376\377'\252\376\377!\247\376\377"
"#\250\376\377#\250\376\377\37\246\376\377\37\246\376\377\37\246\376\377\33"
"\244\376\377\33\244\376\377\32\243\376\377\32\243\376\377\27\242\377\377"
"\27\242\377\377\32\243\376\377\27\242\377\377\21\237\377\377\21\237\377\377"
"\21\237\377\377\17\236\377\377\16\235\377\377\16\235\377\377\16\235\377\377"
"\36k\234\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\4\12\15"
"\3778\263\376\377D\271\376\377:\262\373\377D\271\376\377H\273\377\377D\271"
"\376\377H\273\377\377D\271\376\377H\273\377\377H\273\377\377I\274\377\377"
"I\274\377\377I\274\377\377I\274\377\3771\210\275\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377D\266\372\377H\273\377\377H\273\377\377D\271\376\377D\271"
"\376\377D\271\376\377D\271\376\377D\271\376\377D\271\376\377D\271\376\377"
"D\271\376\377\36Qn\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\17$0\377<\265\376\377"
"<\265\376\377<\265\376\377;\264\376\3775\262\377\3775\262\377\3775\262\377"
"\3777\262\377\3771\257\377\3775\262\377\3772\260\377\377\36k\234\377\27["
"\207\3771\210\275\377(\252\376\3771\257\377\377/\256\377\377*\253\377\377"
"*\253\377\377/\256\377\377*\253\377\377*\253\377\377(\252\376\377(\252\376"
"\377'\252\376\377'\252\376\377'\252\376\377%\250\376\377!\247\376\377%\250"
"\376\377#\250\376\377\37\246\376\377\37\246\376\377\37\246\376\377\33\244"
"\376\377\33\244\376\377\32\243\376\377\27\242\377\377\27\242\377\377\27\242"
"\377\377\21\237\377\377\21\237\377\377\21\237\377\377\21\237\377\377\17\236"
"\377\377\17\236\377\377\16\235\377\377\16\235\377\377\17\236\377\377\22\231"
"\364\377\10\27\40\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\24.=\377D\271\376\377D\271\376\377D\271\376\377D\271\376\377D"
"\271\376\377D\271\376\377D\271\376\377D\271\376\377H\273\377\377D\271\376"
"\377H\273\377\377D\271\376\377D\271\376\377\32e\225\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377D\266\372\377D\271\376\3773x\236\377\10\27\40\3771\210"
"\275\377D\271\376\377D\271\376\377B\270\376\377B\270\376\377D\271\376\377"
"@\267\377\377\36Qn\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\6\16\24\377<\265\376\377"
"8\263\376\3775\262\377\377;\264\376\377;\264\376\3777\262\377\3775\262\377"
"\3777\262\377\3775\262\377\3771\257\377\3772\260\377\3771\257\377\3771\257"
"\377\3771\257\377\377/\256\377\377/\256\377\377*\253\377\377/\256\377\377"
"/\256\377\377*\253\377\377*\253\377\377*\253\377\377(\252\376\377'\252\376"
"\377'\252\376\377'\252\376\377!\247\376\377%\250\376\377!\247\376\377!\247"
"\376\377\37\246\376\377\37\246\376\377\37\246\376\377\33\244\376\377\33\244"
"\376\377\32\243\376\377\27\242\377\377\27\242\377\377\32\243\376\377\27\242"
"\377\377\21\237\377\377\27\242\377\377\21\237\377\377\21\237\377\377\17\236"
"\377\377\16\235\377\377\16\235\377\377\16\235\377\377\17\236\377\377\31F"
"b\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\35Wz\377D\271\376\377B\270\376\377B\270\376\377B\270\376\377D"
"\271\376\377D\271\376\377D\271\376\377D\271\376\377D\271\376\377D\271\376"
"\377D\271\376\377D\271\376\3773x\236\377\17$0\377\10\24\32\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377!\216\323\377\24.=\377\0\0\0\377\0\0\0\377\10\24\32\3778\263\376"
"\377D\271\376\377B\270\376\377@\267\377\377@\267\377\377@\267\377\377\36"
"Qn\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\17$0\377\17$0\377\31Fb\377:\262\373\3778\263\376\3775\262"
"\377\3775\262\377\3775\262\377\3775\262\377\3775\262\377\3772\260\377\377"
"1\257\377\3771\257\377\3771\257\377\3771\257\377\3771\257\377\377/\256\377"
"\377,\255\377\377/\256\377\377/\256\377\377*\253\377\377/\256\377\377(\252"
"\376\377(\252\376\377'\252\376\377'\252\376\377'\252\376\377!\247\376\377"
"!\247\376\377!\247\376\377!\247\376\377!\247\376\377\37\246\376\377\37\246"
"\376\377\37\246\376\377\33\244\376\377\33\244\376\377\33\244\376\377\27\242"
"\377\377\27\242\377\377\27\242\377\377\27\242\377\377\21\237\377\377\21\237"
"\377\377\21\237\377\377\21\237\377\377\17\236\377\377\16\235\377\377\16\235"
"\377\377\16\235\377\377\16\235\377\377\32e\225\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"1\210\275\377@\267\377\377B\270\376\377B\270\376\377B\270\376\377B\270\376"
"\377D\271\376\377B\270\376\377B\270\376\377B\270\376\377B\270\376\377B\270"
"\376\377D\271\376\377B\270\376\377B\270\376\377B\270\376\3778\263\376\377"
"&\212\311\3773x\236\377&p\234\377&p\234\377\35Wz\377\31Fb\377\31Fb\377\4"
"\12\15\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\25<S\377@\267\377\377"
"B\270\376\377<\265\376\377<\265\376\377@\267\377\3773x\236\377\35Wz\377&"
"p\234\377&p\234\377&\212\311\377&\212\311\377\32\225\347\377<\265\376\377"
":\263\374\3775\262\377\3778\263\376\3778\263\376\3777\262\377\3777\262\377"
"\3775\262\377\3775\262\377\3775\262\377\3772\260\377\3771\257\377\3771\257"
"\377\3771\257\377\3771\257\377\3771\257\377\377/\256\377\377/\256\377\377"
",\255\377\377,\255\377\377*\253\377\377*\253\377\377*\253\377\377(\252\376"
"\377(\252\376\377'\252\376\377'\252\376\377%\250\376\377%\250\376\377!\247"
"\376\377'\252\376\377!\247\376\377!\247\376\377\37\246\376\377!\247\376\377"
"\37\246\376\377\33\244\376\377\33\244\376\377\33\244\376\377\27\242\377\377"
"\27\242\377\377\27\242\377\377\27\242\377\377\21\237\377\377\27\242\377\377"
"\21\237\377\377\21\237\377\377\17\236\377\377\17\236\377\377\16\235\377\377"
"\16\235\377\377\16\235\377\377!\216\323\377\4\12\15\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\6\16\24\377:\262\373\377@\267\377\377<\265\376\377@\267\377\377<\265"
"\376\377B\270\376\377@\267\377\377@\267\377\377@\267\377\377@\267\377\377"
"D\271\376\377B\270\376\377B\270\376\377B\270\376\377B\270\376\377B\270\376"
"\377B\270\376\377B\270\376\377B\270\376\377B\270\376\377?\267\377\377B\270"
"\376\377?\267\377\377&p\234\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377&p\234\377<\265\376\377<\265\376\377<\265\376\377<\265\376\377<\265"
"\376\377<\265\376\377<\265\376\377;\264\376\377;\264\376\377;\264\376\377"
";\264\376\3775\262\377\377;\264\376\377;\264\376\3777\262\377\3777\262\377"
"\3775\262\377\3777\262\377\3777\262\377\3771\257\377\3771\257\377\3771\257"
"\377\3771\257\377\3771\257\377\3771\257\377\377/\256\377\377/\256\377\377"
",\255\377\377,\255\377\377,\255\377\377*\253\377\377,\255\377\377*\253\377"
"\377*\253\377\377*\253\377\377'\252\376\377'\252\376\377'\252\376\377'\252"
"\376\377!\247\376\377!\247\376\377!\247\376\377!\247\376\377\37\246\376\377"
"\37\246\376\377\33\244\376\377\33\244\376\377\33\244\376\377\32\243\376\377"
"\27\242\377\377\27\242\377\377\27\242\377\377\21\237\377\377\21\237\377\377"
"\32\243\376\377\21\237\377\377\21\237\377\377\21\237\377\377\16\235\377\377"
"\16\235\377\377\16\235\377\377\16\235\377\377\21\233\371\377\11\33'\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\24.=\377:\262\373\377@\267\377\377"
"@\267\377\377@\267\377\377<\265\376\377<\265\376\377@\267\377\377@\267\377"
"\377<\265\376\377@\267\377\377<\265\376\377?\267\377\377<\265\376\377<\265"
"\376\377B\270\376\377<\265\376\377<\265\376\377<\265\376\377<\265\376\377"
"<\265\376\377<\265\376\377?\267\377\377?\267\377\377\24""5H\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\6\16\24\3778\263\376\377<\265\376\377<\265"
"\376\377<\265\376\377<\265\376\377<\265\376\377;\264\376\377;\264\376\377"
";\264\376\3777\262\377\377;\264\376\3775\262\377\3775\262\377\3775\262\377"
"\3771\257\377\3777\262\377\3775\262\377\3771\257\377\3771\257\377\3771\257"
"\377\3771\257\377\3771\257\377\3771\257\377\377/\256\377\377/\256\377\377"
"*\253\377\377,\255\377\377,\255\377\377,\255\377\377*\253\377\377*\253\377"
"\377*\253\377\377'\252\376\377'\252\376\377'\252\376\377'\252\376\377#\250"
"\376\377#\250\376\377!\247\376\377!\247\376\377!\247\376\377!\247\376\377"
"!\247\376\377\33\244\376\377\37\246\376\377\32\243\376\377\33\244\376\377"
"\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377\377"
"\27\242\377\377\21\237\377\377\21\237\377\377\21\237\377\377\16\235\377\377"
"\16\235\377\377\16\235\377\377\16\235\377\377\16\235\377\377\16\235\377\377"
"\31Fb\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\24""5H\377"
"8\263\376\377<\265\376\377<\265\376\377<\265\376\377@\267\377\377<\265\376"
"\377@\267\377\377<\265\376\377<\265\376\377@\267\377\377<\265\376\377?\267"
"\377\377?\267\377\377<\265\376\377B\270\376\377<\265\376\377<\265\376\377"
"B\270\376\377?\267\377\377<\265\376\377<\265\376\377<\265\376\377:\263\374"
"\377\6\16\24\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\24""5H\377<\265"
"\376\377<\265\376\377;\264\376\377;\264\376\3775\262\377\3775\262\377\377"
";\264\376\3777\262\377\3777\262\377\3775\262\377\3775\262\377\3775\262\377"
"\3772\260\377\3777\262\377\3771\257\377\3771\257\377\3771\257\377\3771\257"
"\377\3771\257\377\3771\257\377\3771\257\377\377/\256\377\377*\253\377\377"
"/\256\377\377*\253\377\377*\253\377\377,\255\377\377*\253\377\377*\253\377"
"\377*\253\377\377'\252\376\377'\252\376\377'\252\376\377'\252\376\377#\250"
"\376\377#\250\376\377#\250\376\377\37\246\376\377!\247\376\377\37\246\376"
"\377\37\246\376\377\33\244\376\377\33\244\376\377\33\244\376\377\32\243\376"
"\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377"
"\377\21\237\377\377\21\237\377\377\21\237\377\377\21\237\377\377\17\236\377"
"\377\16\235\377\377\16\235\377\377\17\236\377\377\17\236\377\377\17\236\377"
"\377\27[\207\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\31Fb\377<\265\376\377<\265\376\377<\265\376\377<\265\376"
"\377<\265\376\377<\265\376\377<\265\376\377<\265\376\377<\265\376\377<\265"
"\376\377<\265\376\377<\265\376\377;\264\376\377<\265\376\377<\265\376\377"
"<\265\376\377<\265\376\377<\265\376\377<\265\376\377;\264\376\377?\267\377"
"\377;\264\376\377&p\234\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\36k\234\3775\262\377\377;\264\376\3775\262\377\377;\264\376\3775\262"
"\377\3775\262\377\3771\257\377\3777\262\377\3775\262\377\3775\262\377\377"
"2\260\377\3772\260\377\3771\257\377\3771\257\377\3771\257\377\3771\257\377"
"\3771\257\377\377/\256\377\377/\256\377\377/\256\377\377/\256\377\377*\253"
"\377\377*\253\377\377/\256\377\377*\253\377\377*\253\377\377*\253\377\377"
"*\253\377\377'\252\376\377'\252\376\377'\252\376\377#\250\376\377#\250\376"
"\377#\250\376\377#\250\376\377\37\246\376\377\37\246\376\377\37\246\376\377"
"\37\246\376\377\37\246\376\377\37\246\376\377\33\244\376\377\32\243\376\377"
"\32\243\376\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377\377"
"\21\237\377\377\27\242\377\377\21\237\377\377\21\237\377\377\17\236\377\377"
"\16\235\377\377\16\235\377\377\16\235\377\377\17\236\377\377\17\236\377\377"
"\32e\225\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\35Wz\377;\264\376\377;\264\376\377;\264\376"
"\377;\264\376\377<\265\376\3778\263\376\377<\265\376\377=\265\376\377;\264"
"\376\377;\264\376\377;\264\376\377;\264\376\377;\264\376\377;\264\376\377"
";\264\376\377<\265\376\377<\265\376\377;\264\376\377;\264\376\377;\264\376"
"\377;\264\376\377;\264\376\377\25<S\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\3\4\6\377!\216\323\3777\262\377\3775\262\377\3775\262\377\3775\262"
"\377\3777\262\377\3775\262\377\3775\262\377\3771\257\377\3771\257\377\377"
"1\257\377\3772\260\377\3771\257\377\3771\257\377\377/\256\377\377/\256\377"
"\377/\256\377\377,\255\377\377,\255\377\377,\255\377\377/\256\377\377*\253"
"\377\377/\256\377\377(\252\376\377(\252\376\377(\252\376\377'\252\376\377"
"'\252\376\377'\252\376\377'\252\376\377#\250\376\377#\250\376\377#\250\376"
"\377\37\246\376\377#\250\376\377\37\246\376\377\37\246\376\377\37\246\376"
"\377\33\244\376\377\33\244\376\377\32\243\376\377\32\243\376\377\27\242\377"
"\377\32\243\376\377\27\242\377\377\27\242\377\377\27\242\377\377\21\237\377"
"\377\27\242\377\377\21\237\377\377\17\236\377\377\17\236\377\377\16\235\377"
"\377\16\235\377\377\16\235\377\377\16\235\377\377\16\235\377\377\36k\234"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\32e\225\3778\263\376\3778\263\376"
"\3778\263\376\3778\263\376\3778\263\376\3778\263\376\3778\263\376\377;\264"
"\376\377;\264\376\377;\264\376\3777\262\377\377;\264\376\3775\262\377\377"
";\264\376\3775\262\377\377;\264\376\3777\262\377\3775\262\377\3777\262\377"
"\3775\262\377\377;\264\376\377/\256\377\377\10\24\32\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\11\33'\3771\257\377\3771\257\377\3777\262\377\377"
"1\257\377\3771\257\377\3771\257\377\3771\257\377\3775\262\377\3771\257\377"
"\3771\257\377\3771\257\377\3771\257\377\377/\256\377\377/\256\377\377,\255"
"\377\377,\255\377\377,\255\377\377*\253\377\377,\255\377\377(\252\376\377"
"/\256\377\377(\252\376\377(\252\376\377(\252\376\377(\252\376\377%\250\376"
"\377'\252\376\377!\247\376\377#\250\376\377#\250\376\377#\250\376\377#\250"
"\376\377\37\246\376\377\37\246\376\377\37\246\376\377\37\246\376\377\37\246"
"\376\377\33\244\376\377\33\244\376\377\27\242\377\377\32\243\376\377\27\242"
"\377\377\32\243\376\377\27\242\377\377\21\237\377\377\21\237\377\377\27\242"
"\377\377\21\237\377\377\21\237\377\377\17\236\377\377\16\235\377\377\16\235"
"\377\377\16\235\377\377\17\236\377\377\17\236\377\377&\212\311\377\3\4\6"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\35Wz\3778\263\376\3777\262"
"\377\3777\262\377\3777\262\377\3778\263\376\3777\262\377\3775\262\377\377"
"5\262\377\377;\264\376\3775\262\377\3777\262\377\3777\262\377\3775\262\377"
"\377;\264\376\3775\262\377\377;\264\376\3777\262\377\3777\262\377\3775\262"
"\377\3775\262\377\3775\262\377\3771\210\275\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\27[\207\3777\262\377\3771\257\377\3771\257\377\3771\257\377"
"\3771\257\377\3771\257\377\3771\257\377\3771\257\377\3771\257\377\377/\256"
"\377\377/\256\377\377/\256\377\377,\255\377\377/\256\377\377,\255\377\377"
",\255\377\377*\253\377\377,\255\377\377*\253\377\377(\252\376\377(\252\376"
"\377(\252\376\377(\252\376\377'\252\376\377'\252\376\377'\252\376\377!\247"
"\376\377!\247\376\377'\252\376\377!\247\376\377!\247\376\377\37\246\376\377"
"\37\246\376\377\37\246\376\377\37\246\376\377\33\244\376\377\33\244\376\377"
"\32\243\376\377\27\242\377\377\27\242\377\377\27\242\377\377\32\243\376\377"
"\21\237\377\377\21\237\377\377\21\237\377\377\21\237\377\377\21\237\377\377"
"\17\236\377\377\17\236\377\377\16\235\377\377\16\235\377\377\16\235\377\377"
"\16\235\377\377\16\235\377\377\36k\234\377\3\4\6\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\31Fb\3771\257\377\3777\262\377\377"
"1\257\377\3777\262\377\3777\262\377\3775\262\377\3775\262\377\3775\262\377"
"\3775\262\377\3771\257\377\3777\262\377\3775\262\377\3771\257\377\3777\262"
"\377\3771\257\377\3777\262\377\3771\257\377\3775\262\377\3772\260\377\377"
"5\262\377\3772\260\377\377\35Wz\377\0\0\0\377\6\16\24\3771\210\275\3771\257"
"\377\3771\257\377\3771\257\377\3771\257\377\3771\257\377\3771\257\377\377"
"1\257\377\3771\257\377\377/\256\377\377/\256\377\377/\256\377\377*\253\377"
"\377,\255\377\377,\255\377\377*\253\377\377,\255\377\377*\253\377\377*\253"
"\377\377*\253\377\377'\252\376\377(\252\376\377'\252\376\377'\252\376\377"
"%\250\376\377'\252\376\377!\247\376\377!\247\376\377!\247\376\377!\247\376"
"\377!\247\376\377\37\246\376\377\37\246\376\377\37\246\376\377\37\246\376"
"\377\33\244\376\377\32\243\376\377\33\244\376\377\33\244\376\377\27\242\377"
"\377\27\242\377\377\27\242\377\377\27\242\377\377\32\243\376\377\21\237\377"
"\377\27\242\377\377\17\236\377\377\21\237\377\377\21\237\377\377\17\236\377"
"\377\17\236\377\377\16\235\377\377\16\235\377\377\16\235\377\377\16\235\377"
"\377\32e\225\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\25<S\3771\257\376\3777\262\377\3771\257\377"
"\3777\262\377\3775\262\377\3772\260\377\3775\262\377\3775\262\377\3775\262"
"\377\3772\260\377\3775\262\377\3771\257\377\3772\260\377\3772\260\377\377"
"2\260\377\3772\260\377\3772\260\377\3772\260\377\3772\260\377\3772\260\377"
"\3771\257\377\377\36Qn\377\37\222\335\377/\256\377\3771\257\377\377/\256"
"\377\3771\257\377\3771\257\377\377/\256\377\377/\256\377\377/\256\377\377"
"*\253\377\377*\253\377\377/\256\377\377/\256\377\377(\252\376\377,\255\377"
"\377*\253\377\377,\255\377\377*\253\377\377(\252\376\377'\252\376\377'\252"
"\376\377'\252\376\377'\252\376\377%\250\376\377'\252\376\377%\250\376\377"
"!\247\376\377!\247\376\377!\247\376\377!\247\376\377\37\246\376\377\37\246"
"\376\377\37\246\376\377\37\246\376\377\37\246\376\377\32\243\376\377\33\244"
"\376\377\33\244\376\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242"
"\377\377\32\243\376\377\27\242\377\377\21\237\377\377\21\237\377\377\21\237"
"\377\377\17\236\377\377\17\236\377\377\16\235\377\377\16\235\377\377\16\235"
"\377\377\17\236\377\377\17\236\377\377\17\236\377\377\27[\207\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\24.=\377/\256\377\3771\257\377\3771\257\377\3772\260\377"
"\3771\257\377\3771\257\377\3772\260\377\3772\260\377\3771\257\377\3772\260"
"\377\3771\257\377\3772\260\377\3772\260\377\3772\260\377\3771\257\377\377"
"1\257\377\3771\257\377\3771\257\377\3771\257\377\3771\257\377\3771\257\377"
"\3771\257\377\377/\256\377\377/\256\377\377/\256\377\377/\256\377\377/\256"
"\377\377,\255\377\377/\256\377\377*\253\377\377/\256\377\377*\253\377\377"
"*\253\377\377*\253\377\377/\256\377\377*\253\377\377*\253\377\377*\253\377"
"\377'\252\376\377'\252\376\377'\252\376\377'\252\376\377'\252\376\377%\250"
"\376\377!\247\376\377!\247\376\377!\247\376\377'\252\376\377!\247\376\377"
"!\247\376\377\37\246\376\377\37\246\376\377\37\246\376\377\37\246\376\377"
"\32\243\376\377\33\244\376\377\33\244\376\377\27\242\377\377\33\244\376\377"
"\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377\377\21\237\377\377"
"\21\237\377\377\21\237\377\377\21\237\377\377\21\237\377\377\17\236\377\377"
"\16\235\377\377\16\235\377\377\16\235\377\377\16\235\377\377\16\235\377\377"
"\17\236\377\377\31Fb\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\6\16\24"
"\3771\210\275\3771\257\377\3771\257\377\3771\257\377\3771\257\377\3771\257"
"\377\3771\257\377\3771\257\377\3771\257\377\3771\257\377\3771\257\377\377"
"1\257\377\3771\257\377\3771\257\377\377/\256\377\3771\257\377\377/\256\377"
"\377/\256\377\377/\256\377\377/\256\377\377/\256\377\377,\255\377\377*\253"
"\377\377/\256\377\377/\256\377\377*\253\377\377,\255\377\377*\253\377\377"
"*\253\377\377*\253\377\377/\256\377\377*\253\377\377(\252\376\377(\252\376"
"\377'\252\376\377'\252\376\377'\252\376\377'\252\376\377'\252\376\377'\252"
"\376\377#\250\376\377#\250\376\377!\247\376\377'\252\376\377!\247\376\377"
"!\247\376\377!\247\376\377!\247\376\377\37\246\376\377\37\246\376\377\37"
"\246\376\377\33\244\376\377\33\244\376\377\32\243\376\377\32\243\376\377"
"\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377\377"
"\21\237\377\377\27\242\377\377\21\237\377\377\21\237\377\377\21\237\377\377"
"\17\236\377\377\17\236\377\377\17\236\377\377\16\235\377\377\16\235\377\377"
"\16\235\377\377\16\235\377\377\32\225\347\377\17$0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\27[\207\377/\256\377\377"
"/\256\377\377/\256\377\377/\256\377\3771\257\377\377/\256\377\377/\256\377"
"\377/\256\377\377/\256\377\377/\256\377\377/\256\377\377/\256\377\377/\256"
"\377\377,\255\377\377,\255\377\377,\255\377\377,\255\377\377,\255\377\377"
",\255\377\377,\255\377\377,\255\377\377*\253\377\377*\253\377\377*\253\377"
"\377,\255\377\377*\253\377\377*\253\377\377*\253\377\377*\253\377\377'\252"
"\376\377'\252\376\377'\252\376\377'\252\376\377#\250\376\377'\252\376\377"
"'\252\376\377#\250\376\377#\250\376\377#\250\376\377#\250\376\377!\247\376"
"\377!\247\376\377!\247\376\377!\247\376\377\37\246\376\377\37\246\376\377"
"\37\246\376\377\33\244\376\377\33\244\376\377\33\244\376\377\32\243\376\377"
"\32\243\376\377\32\243\376\377\27\242\377\377\27\242\377\377\27\242\377\377"
"\27\242\377\377\21\237\377\377\27\242\377\377\21\237\377\377\21\237\377\377"
"\21\237\377\377\17\236\377\377\17\236\377\377\16\235\377\377\16\235\377\377"
"\16\235\377\377\16\235\377\377\16\235\377\377\36k\234\377\6\16\24\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\24""5H\377\30\230\355\377/\256\377\377,\255\377\377*\253\377\377"
"/\256\377\377/\256\377\377*\253\377\377,\255\377\377,\255\377\377,\255\377"
"\377,\255\377\377,\255\377\377,\255\377\377/\256\377\377,\255\377\377,\255"
"\377\377*\253\377\377,\255\377\377*\253\377\377*\253\377\377/\256\377\377"
"(\252\376\377*\253\377\377*\253\377\377*\253\377\377'\252\376\377'\252\376"
"\377'\252\376\377'\252\376\377'\252\376\377'\252\376\377'\252\376\377#\250"
"\376\377#\250\376\377#\250\376\377#\250\376\377#\250\376\377\37\246\376\377"
"#\250\376\377\37\246\376\377\37\246\376\377\37\246\376\377\37\246\376\377"
"\33\244\376\377!\247\376\377\33\244\376\377\33\244\376\377\32\243\376\377"
"\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377\377\32\243\376\377"
"\21\237\377\377\32\243\376\377\21\237\377\377\27\242\377\377\21\237\377\377"
"\21\237\377\377\21\237\377\377\17\236\377\377\16\235\377\377\16\235\377\377"
"\16\235\377\377\16\235\377\377\16\235\377\377\16\235\377\377\35Wz\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\4\12\15\377\32e\225\377,\255\377\377"
"*\253\377\377*\253\377\377*\253\377\377/\256\377\377*\253\377\377,\255\377"
"\377,\255\377\377*\253\377\377,\255\377\377*\253\377\377*\253\377\377*\253"
"\377\377*\253\377\377,\255\377\377*\253\377\377*\253\377\377(\252\376\377"
"(\252\376\377(\252\376\377(\252\376\377'\252\376\377'\252\376\377'\252\376"
"\377'\252\376\377'\252\376\377'\252\376\377!\247\376\377#\250\376\377#\250"
"\376\377#\250\376\377#\250\376\377#\250\376\377#\250\376\377\37\246\376\377"
"\37\246\376\377\37\246\376\377\37\246\376\377\37\246\376\377\37\246\376\377"
"\37\246\376\377\33\244\376\377\33\244\376\377\33\244\376\377\32\243\376\377"
"\32\243\376\377\27\242\377\377\27\242\377\377\27\242\377\377\21\237\377\377"
"\32\243\376\377\21\237\377\377\21\237\377\377\21\237\377\377\17\236\377\377"
"\21\237\377\377\17\236\377\377\17\236\377\377\16\235\377\377\16\235\377\377"
"\16\235\377\377\16\235\377\377\16\235\377\377&\212\311\377\11\33'\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\17$0\377!\216"
"\323\377*\253\377\377*\253\377\377*\253\377\377,\255\377\377*\253\377\377"
",\255\377\377*\253\377\377*\253\377\377*\253\377\377*\253\377\377*\253\377"
"\377*\253\377\377'\252\376\377'\252\376\377'\252\376\377'\252\376\377'\252"
"\376\377'\252\376\377'\252\376\377'\252\376\377'\252\376\377'\252\376\377"
"#\250\376\377!\216\323\377#\250\376\377#\250\376\377#\250\376\377#\250\376"
"\377#\250\376\377\37\246\376\377#\250\376\377\37\246\376\377\37\246\376\377"
"\37\246\376\377\37\246\376\377\33\244\376\377\37\246\376\377\32\243\376\377"
"\33\244\376\377\32\243\376\377\32\243\376\377\32\243\376\377\32\243\376\377"
"\27\242\377\377\27\242\377\377\27\242\377\377\32\243\376\377\21\237\377\377"
"\27\242\377\377\21\237\377\377\21\237\377\377\21\237\377\377\17\236\377\377"
"\17\236\377\377\16\235\377\377\16\235\377\377\16\235\377\377\16\235\377\377"
"\16\235\377\377\22\231\364\377\31Fb\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\1\2\2\377\36Qn\377"
"'\252\376\377(\252\376\377*\253\377\377*\253\377\377'\252\376\377'\252\376"
"\377'\252\376\377*\253\377\377'\252\376\377'\252\376\377'\252\376\377'\252"
"\376\377'\252\376\377'\252\376\377'\252\376\377'\252\376\377'\252\376\377"
"#\250\376\377#\250\376\377#\250\376\377\37\246\376\377\25<S\377\3\4\6\377"
"&\212\311\377!\247\376\377#\250\376\377#\250\376\377\37\246\376\377\37\246"
"\376\377\37\246\376\377\37\246\376\377\37\246\376\377\37\246\376\377\33\244"
"\376\377\32\243\376\377\32\243\376\377\32\243\376\377\32\243\376\377\32\243"
"\376\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377\377\32\243"
"\376\377\21\237\377\377\21\237\377\377\21\237\377\377\21\237\377\377\21\237"
"\377\377\21\237\377\377\21\237\377\377\17\236\377\377\17\236\377\377\17\236"
"\377\377\16\235\377\377\16\235\377\377\16\235\377\377\32e\225\377\6\16\24"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\4\12\15\377\35Wz\377\30\230"
"\355\377'\252\376\377'\252\376\377'\252\376\377'\252\376\377'\252\376\377"
"'\252\376\377'\252\376\377'\252\376\377'\252\376\377'\252\376\377#\250\376"
"\377#\250\376\377#\250\376\377#\250\376\377#\250\376\377#\250\376\377\30"
"\230\355\377\24.=\377\0\0\0\377\0\0\0\377\6\16\24\377\37\222\335\377\37\246"
"\376\377\37\246\376\377\37\246\376\377\33\244\376\377\37\246\376\377\37\246"
"\376\377\37\246\376\377\33\244\376\377\32\243\376\377\32\243\376\377\27\242"
"\377\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242"
"\377\377\21\237\377\377\27\242\377\377\21\237\377\377\21\237\377\377\21\237"
"\377\377\21\237\377\377\21\237\377\377\17\236\377\377\17\236\377\377\16\235"
"\377\377\16\235\377\377\17\236\377\377\17\236\377\377\17\236\377\377\32e"
"\225\377\11\33'\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\4\12\15\377\36Qn\377\30\230\355\377'\252\376\377%\250"
"\376\377!\247\376\377!\247\376\377'\252\376\377#\250\376\377#\250\376\377"
"#\250\376\377#\250\376\377#\250\376\377#\250\376\377#\250\376\377#\250\376"
"\377\37\246\376\377\10\24\32\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\10\27\40\377\32\225\347\377\37\246\376\377\37\246\376\377\33\244\376\377"
"\33\244\376\377\32\243\376\377\33\244\376\377\32\243\376\377\27\242\377\377"
"\32\243\376\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377\377"
"\27\242\377\377\21\237\377\377\27\242\377\377\27\242\377\377\21\237\377\377"
"\21\237\377\377\21\237\377\377\17\236\377\377\21\237\377\377\16\235\377\377"
"\16\235\377\377\16\235\377\377\17\236\377\377\16\235\377\377\32e\225\377"
"\11\33'\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\3\4\6\377\31Fb\377&\212"
"\311\377!\247\376\377#\250\376\377#\250\376\377#\250\376\377#\250\376\377"
"\37\246\376\377\37\246\376\377!\247\376\377#\250\376\377\37\246\376\377\37"
"\246\376\377\37\246\376\377\35Wz\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\17$0\377\30\230\355\377\32\243\376\377\33\244\376\377\33\244"
"\376\377\27\242\377\377\27\242\377\377\32\243\376\377\27\242\377\377\27\242"
"\377\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377\377\21\237"
"\377\377\27\242\377\377\21\237\377\377\21\237\377\377\21\237\377\377\21\237"
"\377\377\17\236\377\377\17\236\377\377\16\235\377\377\16\235\377\377\16\235"
"\377\377\32\225\347\377\27[\207\377\10\27\40\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\11\33'\377\27"
"[\207\377\32\225\347\377#\250\376\377\37\246\376\377\37\246\376\377#\250"
"\376\377\37\246\376\377\37\246\376\377\37\246\376\377\37\246\376\377\37\246"
"\376\377\37\246\376\377\25<S\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\17$0\377\21\233\371\377\27\242\377\377\33\244\376\377\27\242\377"
"\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377\377\21\237\377"
"\377\21\237\377\377\27\242\377\377\21\237\377\377\27\242\377\377\21\237\377"
"\377\21\237\377\377\21\237\377\377\17\236\377\377\17\236\377\377\17\236\377"
"\377\16\235\377\377\21\233\371\377\36k\234\377\24""5H\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\24.=\377\27[\207\377!\216\323"
"\377\37\246\376\377\37\246\376\377\37\246\376\377\37\246\376\377\33\244\376"
"\377\37\246\376\377\33\244\376\377\32\243\376\377\24.=\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\24""5H\377\21\233\371\377\27\242\377"
"\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377\377\27\242\377"
"\377\21\237\377\377\27\242\377\377\21\237\377\377\21\237\377\377\21\237\377"
"\377\21\237\377\377\17\236\377\377\17\236\377\377\17\236\377\377\30\230\355"
"\377\36k\234\377\31Fb\377\4\12\15\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\6\16"
"\24\377\25<S\377\32e\225\377\37\222\335\377\32\243\376\377\33\244\376\377"
"\33\244\376\377\32\243\376\377\16\234\375\377\17$0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\24""5H\377\21\233\371\377\27\242\377\377\21"
"\237\377\377\21\237\377\377\21\237\377\377\21\237\377\377\21\237\377\377"
"\17\236\377\377\21\237\377\377\21\237\377\377\17\236\377\377\22\231\364\377"
"\36k\234\377\35Wz\377\17$0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\17$0\377\25<S\377\35Wz\377\36k\234\377&\212\311\377\10\27\40\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\25<S\377\27\242\377\377\21\237\377"
"\377\27\242\377\377!\216\323\377&\212\311\377\36k\234\377\32e\225\377\31"
"Fb\377\24.=\377\10\24\32\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\3\4"
"\6\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0",
};
 
/contrib/network/netsurf/libnsfb/test/path.c
0,0 → 1,132
/* libnsfb plotetr test program */
 
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_event.h"
 
#define UNUSED(x) ((x) = (x))
 
#define PENT(op, xco, yco) path[count].operation = op; \
path[count].point.x = (xco); \
path[count].point.y = (yco); \
count++
 
static int fill_shape(nsfb_plot_pathop_t *path, int xoff, int yoff)
{
int count = 0;
 
PENT(NFSB_PLOT_PATHOP_MOVE, xoff, yoff);
PENT(NFSB_PLOT_PATHOP_LINE, xoff + 100, yoff + 100);
PENT(NFSB_PLOT_PATHOP_LINE, xoff + 100, yoff );
PENT(NFSB_PLOT_PATHOP_LINE, xoff + 200, yoff + 100);
PENT(NFSB_PLOT_PATHOP_MOVE, xoff + 200, yoff - 200);
PENT(NFSB_PLOT_PATHOP_MOVE, xoff + 300, yoff + 300);
PENT(NFSB_PLOT_PATHOP_CUBIC, xoff + 300, yoff );
PENT(NFSB_PLOT_PATHOP_LINE, xoff + 400, yoff + 100);
PENT(NFSB_PLOT_PATHOP_LINE, xoff + 400, yoff );
PENT(NFSB_PLOT_PATHOP_MOVE, xoff + 500, yoff + 200);
PENT(NFSB_PLOT_PATHOP_QUAD, xoff + 500, yoff );
PENT(NFSB_PLOT_PATHOP_LINE, xoff + 600, yoff + 150);
PENT(NFSB_PLOT_PATHOP_LINE, xoff, yoff + 150);
PENT(NFSB_PLOT_PATHOP_LINE, xoff, yoff);
 
return count;
}
 
int main(int argc, char **argv)
{
const char *fename;
enum nsfb_type_e fetype;
nsfb_t *nsfb;
 
int waitloop = 3;
 
nsfb_event_t event;
nsfb_bbox_t box;
uint8_t *fbptr;
int fbstride;
nsfb_plot_pen_t pen;
nsfb_plot_pathop_t path[20];
 
if (argc < 2) {
fename="sdl";
} else {
fename = argv[1];
}
 
fetype = nsfb_type_from_name(fename);
if (fetype == NSFB_SURFACE_NONE) {
fprintf(stderr, "Unable to convert \"%s\" to nsfb surface type\n", fename);
return 1;
}
 
nsfb = nsfb_new(fetype);
if (nsfb == NULL) {
fprintf(stderr, "Unable to allocate \"%s\" nsfb surface\n", fename);
return 2;
}
 
if (nsfb_init(nsfb) == -1) {
fprintf(stderr, "Unable to initialise nsfb surface\n");
nsfb_free(nsfb);
return 4;
}
 
/* get the geometry of the whole screen */
box.x0 = box.y0 = 0;
nsfb_get_geometry(nsfb, &box.x1, &box.y1, NULL);
 
nsfb_get_buffer(nsfb, &fbptr, &fbstride);
 
/* claim the whole screen for update */
nsfb_claim(nsfb, &box);
 
nsfb_plot_clg(nsfb, 0xffffffff);
 
pen.stroke_colour = 0xff0000ff;
pen.fill_colour = 0xffff0000;
pen.stroke_type = NFSB_PLOT_OPTYPE_SOLID;
pen.fill_type = NFSB_PLOT_OPTYPE_NONE;
 
nsfb_plot_path(nsfb, fill_shape(path, 100, 50), path, &pen);
 
pen.fill_type = NFSB_PLOT_OPTYPE_SOLID;
 
nsfb_plot_path(nsfb, fill_shape(path, 100, 200), path, &pen);
 
pen.stroke_type = NFSB_PLOT_OPTYPE_NONE;
 
nsfb_plot_path(nsfb, fill_shape(path, 100, 350), path, &pen);
 
nsfb_update(nsfb, &box);
 
/* wait for quit event or timeout */
while (waitloop > 0) {
if (nsfb_event(nsfb, &event, 1000) == false) {
break;
}
if (event.type == NSFB_EVENT_CONTROL) {
if (event.value.controlcode == NSFB_CONTROL_TIMEOUT) {
/* timeout */
waitloop--;
} else if (event.value.controlcode == NSFB_CONTROL_QUIT) {
break;
}
}
}
 
nsfb_free(nsfb);
 
return 0;
}
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/test/plottest.c
0,0 → 1,316
/* libnsfb plotter test program */
 
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_event.h"
 
#define UNUSED(x) ((x) = (x))
 
const struct {
unsigned int w;
unsigned int h;
unsigned char data[16];
} Mglyph1 = {
8, 16, {
0x00, /* 00000000 */
0x00, /* 00000000 */
0xc6, /* 11000110 */
0xee, /* 11101110 */
0xfe, /* 11111110 */
0xfe, /* 11111110 */
0xd6, /* 11010110 */
0xc6, /* 11000110 */
0xc6, /* 11000110 */
0xc6, /* 11000110 */
0xc6, /* 11000110 */
0xc6, /* 11000110 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
}
};
 
const struct {
unsigned int w;
unsigned int h;
unsigned char data[16 * 8];
} Mglyph8 = {
8, 16, {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 00000000 */
0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, /* 00000000 */
0xaa, 0xff, 0x00, 0x00, 0x00, 0xff, 0xaa, 0x00, /* 11000110 */
0xaa, 0xff, 0xff, 0x00, 0xff, 0xff, 0xaa, 0x00, /* 11101110 */
0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0x00, /* 11111110 */
0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0x00, /* 11111110 */
0xaa, 0xff, 0x00, 0x00, 0x00, 0xff, 0xaa, 0x00, /* 11010110 */
0xaa, 0xff, 0x00, 0x00, 0x00, 0xff, 0xaa, 0x00, /* 11000110 */
0xaa, 0xff, 0x00, 0x00, 0x00, 0xff, 0xaa, 0x00, /* 11000110 */
0xaa, 0xff, 0x00, 0x00, 0x00, 0xff, 0xaa, 0x00, /* 11000110 */
0xaa, 0xff, 0x00, 0x00, 0x00, 0xff, 0xaa, 0x00, /* 11000110 */
0xaa, 0xff, 0x00, 0x00, 0x00, 0xff, 0xaa, 0x00, /* 11000110 */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 00000000 */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 00000000 */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 00000000 */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 00000000 */
}
};
 
 
static bool
dump(nsfb_t *nsfb, const char *filename)
{
int fd;
 
if (filename == NULL)
return false;
 
fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU);
if (fd < 0)
return false;
 
nsfb_dump(nsfb, fd);
close(fd);
 
return true;
}
 
int main(int argc, char **argv)
{
const char *fename;
enum nsfb_type_e fetype;
nsfb_t *nsfb;
nsfb_event_t event;
int waitloop = 3;
 
nsfb_bbox_t box;
nsfb_bbox_t box2;
nsfb_bbox_t box3;
uint8_t *fbptr;
int fbstride;
int p[] = { 300,300, 350,350, 400,300, 450,250, 400,200};
int loop;
nsfb_plot_pen_t pen;
const char *dumpfile = NULL;
 
if (argc < 2) {
fename="sdl";
} else {
fename = argv[1];
if (argc >= 3) {
dumpfile = argv[2];
}
}
 
fetype = nsfb_type_from_name(fename);
if (fetype == NSFB_SURFACE_NONE) {
fprintf(stderr, "Unable to convert \"%s\" to nsfb surface type\n", fename);
return 1;
}
 
nsfb = nsfb_new(fetype);
if (nsfb == NULL) {
fprintf(stderr, "Unable to allocate \"%s\" nsfb surface\n", fename);
return 2;
}
 
if (nsfb_init(nsfb) == -1) {
fprintf(stderr, "Unable to initialise nsfb surface\n");
nsfb_free(nsfb);
return 4;
}
 
/* get the geometry of the whole screen */
box.x0 = box.y0 = 0;
nsfb_get_geometry(nsfb, &box.x1, &box.y1, NULL);
 
nsfb_get_buffer(nsfb, &fbptr, &fbstride);
 
/* claim the whole screen for update */
nsfb_claim(nsfb, &box);
 
/* first test, repeatedly clear the graphics area, should result in the
* same operation as a single clear to the final colour
*/
for (loop = 0; loop < 256;loop++) {
nsfb_plot_clg(nsfb, 0xffffff00 | loop);
}
 
/* draw black radial lines from the origin */
pen.stroke_colour = 0xff000000;
for (loop = 0; loop < box.x1; loop += 20) {
box2 = box;
box2.x1 = loop;
nsfb_plot_line(nsfb, &box2, &pen);
}
/* draw blue radial lines from the bottom right */
pen.stroke_colour = 0xffff0000;
for (loop = 0; loop < box.x1; loop += 20) {
box2 = box;
box2.x0 = loop;
nsfb_plot_line(nsfb, &box2, &pen);
}
/* draw green radial lines from the bottom left */
pen.stroke_colour = 0xff00ff00;
for (loop = 0; loop < box.x1; loop += 20) {
box2.x0 = box.x0;
box2.x1 = loop;
box2.y0 = box.y1;
box2.y1 = box.y0;
nsfb_plot_line(nsfb, &box2, &pen);
}
 
/* draw red radial lines from the top right */
pen.stroke_colour = 0xff0000ff;
for (loop = 0; loop < box.x1; loop += 20) {
box2.x0 = box.x1;
box2.x1 = loop;
box2.y0 = box.y0;
box2.y1 = box.y1;
nsfb_plot_line(nsfb, &box2, &pen);
}
 
/* draw an unclipped rectangle */
box2.x0 = box2.y0 = 100;
box2.x1 = box2.y1 = 300;
 
nsfb_plot_rectangle_fill(nsfb, &box2, 0xff0000ff);
 
nsfb_plot_rectangle(nsfb, &box2, 1, 0xff00ff00, false, false);
 
nsfb_plot_polygon(nsfb, p, 5, 0xffff0000);
 
nsfb_plot_set_clip(nsfb, &box2);
 
box3.x0 = box3.y0 = 200;
box3.x1 = box3.y1 = 400;
 
nsfb_plot_rectangle_fill(nsfb, &box3, 0xff00ffff);
 
nsfb_plot_rectangle(nsfb, &box3, 1, 0xffffff00, false, false);
 
for (loop = 100; loop < 400;loop++) {
nsfb_plot_point(nsfb, loop, 150, 0xffaa1111);
nsfb_plot_point(nsfb, loop, 160, 0x99aa1111);
}
 
nsfb_plot_set_clip(nsfb, NULL);
 
box3.x0 = box3.y0 = 400;
box3.x1 = box3.y1 = 600;
 
nsfb_plot_ellipse_fill(nsfb, &box3, 0xffff0000);
 
nsfb_plot_ellipse(nsfb, &box3, 0xff0000ff);
 
box3.x0 = 500;
box3.x1 = 700;
box3.y0 = 400;
box3.y1 = 500;
 
nsfb_plot_ellipse_fill(nsfb, &box3, 0xffff0000);
 
nsfb_plot_ellipse(nsfb, &box3, 0xff0000ff);
 
box3.x0 = 600;
box3.x1 = 700;
box3.y0 = 300;
box3.y1 = 500;
 
nsfb_plot_ellipse_fill(nsfb, &box3, 0xff0000ff);
 
nsfb_plot_ellipse(nsfb, &box3, 0xffff0000);
 
box2.x0 = 400;
box2.y0 = 400;
box2.x1 = 500;
box2.y1 = 500;
 
box3.x0 = 600;
box3.y0 = 200;
box3.x1 = 700;
box3.y1 = 300;
 
nsfb_plot_copy(nsfb, &box2, nsfb, &box3);
 
/* test glyph plotting */
for (loop = 100; loop < 200; loop+= Mglyph1.w) {
box3.x0 = loop;
box3.y0 = 20;
box3.x1 = box3.x0 + Mglyph8.w;
box3.y1 = box3.y0 + Mglyph8.h;
 
nsfb_plot_glyph1(nsfb, &box3, Mglyph1.data, Mglyph1.w, 0xff000000);
}
 
/* test glyph plotting */
for (loop = 100; loop < 200; loop+= Mglyph8.w) {
box3.x0 = loop;
box3.y0 = 50;
box3.x1 = box3.x0 + Mglyph8.w;
box3.y1 = box3.y0 + Mglyph8.h;
 
nsfb_plot_glyph8(nsfb, &box3, Mglyph8.data, Mglyph8.w, 0xff000000);
}
 
nsfb_update(nsfb, &box);
 
/* random rectangles in clipped area*/
box2.x0 = 400;
box2.y0 = 50;
box2.x1 = 600;
box2.y1 = 100;
 
nsfb_plot_set_clip(nsfb, &box2);
 
srand(1234);
 
for (loop=0; loop < 10000; loop++) {
nsfb_claim(nsfb, &box2);
box3.x0 = rand() / (RAND_MAX / box.x1);
box3.y0 = rand() / (RAND_MAX / box.y1);
box3.x1 = rand() / (RAND_MAX / 400);
box3.y1 = rand() / (RAND_MAX / 400);
nsfb_plot_rectangle_fill(nsfb, &box3, 0xff000000 | rand());
nsfb_update(nsfb, &box2);
}
 
/* wait for quit event or timeout */
while (waitloop > 0) {
if (nsfb_event(nsfb, &event, 1000) == false) {
break;
}
if (event.type == NSFB_EVENT_CONTROL) {
if (event.value.controlcode == NSFB_CONTROL_TIMEOUT) {
/* timeout */
waitloop--;
} else if (event.value.controlcode == NSFB_CONTROL_QUIT) {
break;
}
}
}
 
dump(nsfb, dumpfile);
 
nsfb_free(nsfb);
 
return 0;
}
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/test/polygon
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:executable
+*
\ No newline at end of property
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/contrib/network/netsurf/libnsfb/test/polygon.c
0,0 → 1,120
/* libnsfb ploygon plotter test program */
 
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <math.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_event.h"
#include "surface.h"
 
#define UNUSED(x) ((x) = (x))
 
 
int main(int argc, char **argv)
{
extern nsfb_surface_rtns_t sdl_rtns;
_nsfb_register_surface(NSFB_SURFACE_SDL, &sdl_rtns, "sdl");
const char *fename;
enum nsfb_type_e fetype;
nsfb_t *nsfb;
nsfb_event_t event;
int waitloop = 3;
 
nsfb_bbox_t box;
uint8_t *fbptr;
int fbstride;
 
int sides;
int radius;
nsfb_point_t *points;
int loop;
// nsfb_plot_pen_t pen;
 
if (argc < 2) {
fename="sdl";
} else {
fename = argv[1];
}
 
fetype = nsfb_type_from_name(fename);
if (fetype == NSFB_SURFACE_NONE) {
fprintf(stderr, "Unable to convert \"%s\" to nsfb surface type\n", fename);
return 1;
}
 
nsfb = nsfb_new(fetype);
if (nsfb == NULL) {
fprintf(stderr, "Unable to allocate \"%s\" nsfb surface\n", fename);
return 2;
}
 
if (nsfb_init(nsfb) == -1) {
fprintf(stderr, "Unable to initialise nsfb surface\n");
nsfb_free(nsfb);
return 4;
}
 
/* get the geometry of the whole screen */
box.x0 = box.y0 = 0;
nsfb_get_geometry(nsfb, &box.x1, &box.y1, NULL);
 
nsfb_get_buffer(nsfb, &fbptr, &fbstride);
 
/* claim the whole screen for update */
nsfb_claim(nsfb, &box);
 
nsfb_plot_clg(nsfb, 0xffffffff);
 
radius = (box.x1 / 3);
 
for (sides = 13; sides >=3; sides--) {
points = malloc(sizeof(nsfb_point_t) * sides);
 
for (loop = 0; loop < sides;loop++) {
points[loop].x = (box.x1 / 2) +
(radius * cos(loop * 2 * M_PI / sides));
points[loop].y = (box.y1 / 2) +
(radius * sin(loop * 2 * M_PI / sides));
}
 
nsfb_plot_polygon(nsfb, (const int *)points, sides,
0xff000000 | (0xffffff / (sides * 2)));
 
free(points);
radius -= 25;
}
 
nsfb_update(nsfb, &box);
/* wait for quit event or timeout */
while (waitloop > 0) {
if (nsfb_event(nsfb, &event, 1000) == false) {
break;
}
if (event.type == NSFB_EVENT_CONTROL) {
if (event.value.controlcode == NSFB_CONTROL_TIMEOUT) {
/* timeout */
waitloop--;
} else if (event.value.controlcode == NSFB_CONTROL_QUIT) {
break;
}
}
}
 
nsfb_free(nsfb);
 
return 0;
}
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/test/polygon.map
0,0 → 1,1587
Archive member included because of file (symbol)
 
/home/sourcerer/kos_src/me//lib/libm.a(s_cos.o)
polygon.o (cos)
/home/sourcerer/kos_src/me//lib/libm.a(s_sin.o)
polygon.o (sin)
/home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
(--whole-archive)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o) (SDL_RemoveTimer)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o) (SDL_GetTicks)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o) (SDL_PushEvent)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (SDL_CheckKeyRepeat)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (SDL_MouseInit)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_quit.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (SDL_QuitInit)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o) (SDL_MoveCursor)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o) (SDL_MapRGB)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o) (SDL_UnRLESurface)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o) (SDL_LockSurface)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (current_video)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o) (mosvideo_bootstrab)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o) (SDL_Quit)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o) (SDL_ClearError)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o) (SDL_InstallParachute)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_getenv.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o) (SDL_getenv)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o) (SDL_AudioQuit)
/home/sourcerer/kos_src/me//lib/libSDL.a(init.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o) (InitSound)
/home/sourcerer/kos_src/me//lib/libSDL.a(setbuf.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o) (SetBuffer)
/home/sourcerer/kos_src/me//lib/libSDL.a(stopbuf.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o) (StopBuffer)
/home/sourcerer/kos_src/me//lib/libSDL.a(sndgetsize.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o) (GetBufferSize)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o) (SDL_mutexP)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o) (SDL_DestroySemaphore)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (SDL_ThreadID)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_thread.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (SDL_WaitThread)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_active.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o) (SDL_AppActiveInit)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_resize.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o) (SDL_PrivateResize)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o) (SDL_CalculateBlit)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o) (SDL_CalculateBlitN)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o) (MenuetOS_InitOSKeymap)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o) (SDL_CalculateBlit0)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o) (SDL_CalculateBlit1)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o) (SDL_CalculateAlphaBlit)
/home/sourcerer/kos_src/me//lib/libc.a(dup.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o) (dup)
/home/sourcerer/kos_src/me//lib/libc.a(fdopen.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o) (fdopen)
/home/sourcerer/kos_src/me//lib/libc.a(window.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o) (__menuet__define_window)
/home/sourcerer/kos_src/me//lib/libc.a(param.o)
/home/sourcerer/kos_src/me//stub/crt0.o (__menuet__app_param_area)
/home/sourcerer/kos_src/me//lib/libc.a(keyb.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o) (__menuet__getkey)
/home/sourcerer/kos_src/me//lib/libc.a(image.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o) (__menuet__putimage)
/home/sourcerer/kos_src/me//lib/libc.a(exit.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o) (__menuet__sys_exit)
/home/sourcerer/kos_src/me//lib/libc.a(event.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o) (__menuet__check_for_event)
/home/sourcerer/kos_src/me//lib/libc.a(delay.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o) (__menuet__delay100)
/home/sourcerer/kos_src/me//lib/libc.a(button.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o) (__menuet__get_button_id)
/home/sourcerer/kos_src/me//lib/libc.a(setmode.o)
/home/sourcerer/kos_src/me//lib/libc.a(fdopen.o) (__setmode)
/home/sourcerer/kos_src/me//lib/libc.a(fmode.o)
/home/sourcerer/kos_src/me//lib/libc.a(fdopen.o) (_fmode)
/home/sourcerer/kos_src/me//lib/libc.a(crt1.o)
/home/sourcerer/kos_src/me//stub/crt0.o (__crt1_startup)
/home/sourcerer/kos_src/me//lib/libc.a(crt0.o)
/home/sourcerer/kos_src/me//lib/libc.a(crt1.o) (__crt0_setup_arguments)
/home/sourcerer/kos_src/me//lib/libc.a(brk.o)
/home/sourcerer/kos_src/me//lib/libc.a(crt1.o) (init_brk)
/home/sourcerer/kos_src/me//lib/libc.a(strdup.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o) (strdup)
/home/sourcerer/kos_src/me//lib/libc.a(memset.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o) (memset)
/home/sourcerer/kos_src/me//lib/libc.a(memmove.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o) (memmove)
/home/sourcerer/kos_src/me//lib/libc.a(strncpy.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o) (strncpy)
/home/sourcerer/kos_src/me//lib/libc.a(strncmp.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o) (strncmp)
/home/sourcerer/kos_src/me//lib/libc.a(strlen.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o) (strlen)
/home/sourcerer/kos_src/me//lib/libc.a(strcpy.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o) (strcpy)
/home/sourcerer/kos_src/me//lib/libc.a(strcmp.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o) (strcmp)
/home/sourcerer/kos_src/me//lib/libc.a(memcpy.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o) (memcpy)
/home/sourcerer/kos_src/me//lib/libc.a(memcmp.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o) (memcmp)
/home/sourcerer/kos_src/me//lib/libc.a(malloc.o)
polygon.o (free)
/home/sourcerer/kos_src/me//lib/libc.a(exit.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o) (exit)
/home/sourcerer/kos_src/me//lib/libc.a(calloc.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o) (calloc)
/home/sourcerer/kos_src/me//lib/libc.a(abs.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o) (abs)
/home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o) (vsprintf)
/home/sourcerer/kos_src/me//lib/libc.a(stderr.o)
polygon.o (__dj_stderr)
/home/sourcerer/kos_src/me//lib/libc.a(sprintf.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o) (sprintf)
/home/sourcerer/kos_src/me//lib/libc.a(fprintf.o)
polygon.o (fprintf)
/home/sourcerer/kos_src/me//lib/libc.a(fflush.o)
/home/sourcerer/kos_src/me//lib/libc.a(fprintf.o) (fflush)
/home/sourcerer/kos_src/me//lib/libc.a(fclose.o)
/home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o) (fclose)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
/home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o) (_doprnt)
/home/sourcerer/kos_src/me//lib/libc.a(allocfil.o)
/home/sourcerer/kos_src/me//lib/libc.a(fdopen.o) (__alloc_file)
/home/sourcerer/kos_src/me//lib/libc.a(modfl.o)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o) (__modfl)
/home/sourcerer/kos_src/me//lib/libc.a(lconv.o)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o) (localeconv)
/home/sourcerer/kos_src/me//lib/libc.a(errno.o)
/home/sourcerer/kos_src/me//lib/libc.a(brk.o) (errno)
/home/sourcerer/kos_src/me//lib/libc.a(ct_flags.o)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o) (__dj_ctype_flags)
/home/sourcerer/kos_src/me//lib/libc.a(debug.o)
/home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o) (__libclog_vprintf)
/home/sourcerer/kos_src/me//lib/libc.a(write.o)
/home/sourcerer/kos_src/me//lib/libc.a(fflush.o) (write)
/home/sourcerer/kos_src/me//lib/libc.a(lseek.o)
/home/sourcerer/kos_src/me//lib/libc.a(fdopen.o) (lseek)
/home/sourcerer/kos_src/me//lib/libc.a(close.o)
/home/sourcerer/kos_src/me//lib/libc.a(fclose.o) (close)
/home/sourcerer/kos_src/me//lib/libc.a(emu_init.o)
/home/sourcerer/kos_src/me//lib/libc.a(crt1.o) (dosemu_inithandles)
/home/sourcerer/kos_src/me//lib/libc.a(dosemu.o)
/home/sourcerer/kos_src/me//lib/libc.a(lseek.o) (dosemu_lseek)
/home/sourcerer/kos_src/me//lib/libc.a(_main.o)
/home/sourcerer/kos_src/me//lib/libc.a(crt1.o) (__main)
/home/sourcerer/kos_src/me//lib/libc.a(strrchr.o)
/home/sourcerer/kos_src/me//lib/libc.a(emu_init.o) (strrchr)
/home/sourcerer/kos_src/me//lib/libc.a(memchr.o)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o) (memchr)
/home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o)
/home/sourcerer/kos_src/me//lib/libc.a(stderr.o) (__stdio_cleanup_proc)
/home/sourcerer/kos_src/me//lib/libc.a(remove.o)
/home/sourcerer/kos_src/me//lib/libc.a(fclose.o) (remove)
/home/sourcerer/kos_src/me//lib/libc.a(putc.o)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o) (putc)
/home/sourcerer/kos_src/me//lib/libc.a(fwalk.o)
/home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o) (_fwalk)
/home/sourcerer/kos_src/me//lib/libc.a(frlist.o)
/home/sourcerer/kos_src/me//lib/libc.a(allocfil.o) (__file_rec_list)
/home/sourcerer/kos_src/me//lib/libc.a(fputc.o)
/home/sourcerer/kos_src/me//lib/libc.a(putc.o) (fputc)
/home/sourcerer/kos_src/me//lib/libc.a(flsbuf.o)
/home/sourcerer/kos_src/me//lib/libc.a(doprnt.o) (_flsbuf)
/home/sourcerer/kos_src/me//lib/libc.a(hooks.o)
/home/sourcerer/kos_src/me//lib/libc.a(fputc.o) (__libc_write_termios_hook)
/home/sourcerer/kos_src/me//lib/libc.a(fixpath.o)
/home/sourcerer/kos_src/me//lib/libc.a(dosemu.o) (_fixpath)
/home/sourcerer/kos_src/me//lib/libc.a(systree.o)
/home/sourcerer/kos_src/me//lib/libc.a(remove.o) (__kolibri__system_tree_access2)
/home/sourcerer/kos_src/me//lib/libc.a(dosio.o)
/home/sourcerer/kos_src/me//lib/libc.a(fputc.o) (__file_handle_modes)
/home/sourcerer/kos_src/me//lib/libc.a(curdir.o)
/home/sourcerer/kos_src/me//lib/libc.a(fixpath.o) (__libc_combine_path)
/home/sourcerer/kos_src/me//lib/libc.a(stdout.o)
/home/sourcerer/kos_src/me//lib/libc.a(frlist.o) (__dj_stdout)
/home/sourcerer/kos_src/me//lib/libc.a(stdin.o)
/home/sourcerer/kos_src/me//lib/libc.a(frlist.o) (__dj_stdin)
 
Memory Configuration
 
Name Origin Length Attributes
*default* 0x0000000000000000 0xffffffffffffffff
 
Linker script and memory map
 
 
.text 0x0000000000000000 0x238f8
0x0000000000000000 code = .
0x0000000000000000 _code = .
*(.text)
.text 0x0000000000000000 0x24 /home/sourcerer/kos_src/me//stub/crt0.o
0x0000000000000000 __menuet__app_header
0x0000000000000000 start
0x0000000000000014 __menuet__memsize
.text 0x0000000000000024 0x0 polygon.o
.text 0x0000000000000024 0x24 /home/sourcerer/kos_src/me//lib/libm.a(s_cos.o)
0x0000000000000024 cos
.text 0x0000000000000048 0x24 /home/sourcerer/kos_src/me//lib/libm.a(s_sin.o)
0x0000000000000048 sin
.text 0x000000000000006c 0x2a4 /home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
0x000000000000006c nsfb_cursor_init
0x00000000000000b7 nsfb_cursor_set
0x0000000000000122 nsfb_cursor_loc_set
0x0000000000000164 nsfb_cursor_loc_get
0x000000000000018d nsfb_cursor_plot
0x00000000000002b2 nsfb_cursor_clear
.text 0x0000000000000310 0xbd /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
0x0000000000000310 nsfb_dump
*fill* 0x00000000000003cd 0x3 00
.text 0x00000000000003d0 0x1a9 /home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
0x00000000000003d0 nsfb_new
0x000000000000041e nsfb_init
0x000000000000042d nsfb_free
0x0000000000000467 nsfb_event
0x0000000000000476 nsfb_claim
0x0000000000000485 nsfb_update
0x0000000000000494 nsfb_set_geometry
0x00000000000004d0 nsfb_set_parameters
0x0000000000000524 nsfb_get_geometry
0x0000000000000555 nsfb_get_buffer
*fill* 0x0000000000000579 0x3 00
.text 0x000000000000057c 0x1ca /home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
0x000000000000057c nsfb_palette_free
0x00000000000005af nsfb_palette_new
0x0000000000000628 nsfb_palette_dither_init
0x000000000000066b nsfb_palette_dither_fini
0x000000000000067d nsfb_palette_generate_nsfb_8bpp
*fill* 0x0000000000000746 0x2 00
.text 0x0000000000000748 0x9df /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
*fill* 0x0000000000001127 0x1 00
.text 0x0000000000001128 0x894 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
.text 0x00000000000019bc 0x96e /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
*fill* 0x000000000000232a 0x2 00
.text 0x000000000000232c 0xcfb /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
*fill* 0x0000000000003027 0x1 00
.text 0x0000000000003028 0x1b6 /home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
0x0000000000003028 nsfb_plot_set_clip
0x0000000000003037 nsfb_plot_get_clip
0x0000000000003046 nsfb_plot_clg
0x0000000000003054 nsfb_plot_rectangle
0x0000000000003063 nsfb_plot_rectangle_fill
0x0000000000003072 nsfb_plot_line
0x000000000000308c nsfb_plot_lines
0x000000000000309b nsfb_plot_polylines
0x00000000000030aa nsfb_plot_polygon
0x00000000000030b9 nsfb_plot_arc
0x00000000000030c8 nsfb_plot_point
0x00000000000030d7 nsfb_plot_ellipse
0x00000000000030e6 nsfb_plot_ellipse_fill
0x00000000000030f5 nsfb_plot_copy
0x0000000000003175 nsfb_plot_bitmap
0x0000000000003184 nsfb_plot_glyph8
0x0000000000003193 nsfb_plot_glyph1
0x00000000000031a2 nsfb_plot_readrect
0x00000000000031b1 nsfb_plot_cubic_bezier
0x00000000000031c0 nsfb_plot_quadratic_bezier
0x00000000000031cf nsfb_plot_path
*fill* 0x00000000000031de 0x2 00
.text 0x00000000000031e0 0x10d5 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
0x00000000000041ad select_plotters
*fill* 0x00000000000042b5 0x3 00
.text 0x00000000000042b8 0x466 /home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
0x00000000000042b8 nsfb_plot_clip
0x00000000000043e4 nsfb_plot_clip_ctx
0x00000000000043f6 nsfb_plot_clip_line
0x0000000000004680 nsfb_plot_clip_line_ctx
0x0000000000004692 nsfb_plot_add_rect
0x00000000000046ed nsfb_plot_bbox_intersect
*fill* 0x000000000000471e 0x2 00
.text 0x0000000000004720 0x3b /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
*fill* 0x000000000000475b 0x1 00
.text 0x000000000000475c 0x36 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
*fill* 0x0000000000004792 0x2 00
.text 0x0000000000004794 0x112 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
*fill* 0x00000000000048a6 0x2 00
.text 0x00000000000048a8 0x579 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
*fill* 0x0000000000004e21 0x3 00
.text 0x0000000000004e24 0x169 /home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
0x0000000000004e67 _nsfb_register_surface
0x0000000000004e9a nsfb_surface_get_rtns
0x0000000000004f50 nsfb_type_from_name
*fill* 0x0000000000004f8d 0x3 00
.text 0x0000000000004f90 0x3fd /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
0x0000000000004f9c SDL_RemoveTimer
0x0000000000005015 SDL_SetTimerThreaded
0x0000000000005045 SDL_AddTimer
0x0000000000005112 SDL_SetTimer
0x00000000000051dc SDL_ThreadedTimerCheck
0x00000000000052ea SDL_TimerQuit
0x000000000000533a SDL_TimerInit
*fill* 0x000000000000538d 0x3 00
.text 0x0000000000005390 0x67 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o)
0x0000000000005390 SDL_StartTicks
0x00000000000053a8 SDL_GetTicks
0x00000000000053c4 SDL_SYS_TimerInit
0x00000000000053cb SDL_SYS_TimerQuit
0x00000000000053d0 SDL_SYS_StartTimer
0x00000000000053d7 SDL_SYS_StopTimer
0x00000000000053dc SDL_Delay
*fill* 0x00000000000053f7 0x1 00
.text 0x00000000000053f8 0x682 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
0x00000000000053f8 SDL_EventThreadID
0x0000000000005402 SDL_GetEventFilter
0x000000000000540c SDL_PumpEvents
0x0000000000005439 SDL_PeepEvents
0x0000000000005659 SDL_PushEvent
0x000000000000566f SDL_PrivateSysWMEvent
0x00000000000056cd SDL_WaitEvent
0x0000000000005717 SDL_PollEvent
0x0000000000005732 SDL_EventState
0x00000000000057e6 SDL_SetEventFilter
0x000000000000580d SDL_Unlock_EventThread
0x000000000000583c SDL_Lock_EventThread
0x000000000000591c SDL_StopEventLoop
0x0000000000005989 SDL_StartEventLoop
*fill* 0x0000000000005a7a 0x2 00
.text 0x0000000000005a7c 0xc2f /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
0x0000000000005a7c SDL_EnableUNICODE
0x0000000000005a93 SDL_GetKeyState
0x0000000000005aaa SDL_GetModState
0x0000000000005ab4 SDL_SetModState
0x0000000000005ac1 SDL_GetKeyName
0x0000000000005ae0 SDL_CheckKeyRepeat
0x0000000000005ae5 SDL_EnableKeyRepeat
0x0000000000005b31 SDL_KeyboardInit
0x000000000000648e SDL_PrivateKeyboard
0x0000000000006659 SDL_ResetKeyboard
*fill* 0x00000000000066ab 0x1 00
.text 0x00000000000066ac 0x3fb /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o)
0x00000000000066ac SDL_MouseInit
0x00000000000066de SDL_GetMouseState
0x0000000000006708 SDL_GetRelativeMouseState
0x000000000000678f SDL_PrivateMouseButton
0x000000000000691d SDL_PrivateMouseMotion
*fill* 0x0000000000006aa7 0x1 00
.text 0x0000000000006aa8 0x4d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_quit.o)
0x0000000000006aa8 SDL_QuitInit
0x0000000000006aaf SDL_PrivateQuit
*fill* 0x0000000000006af5 0x3 00
.text 0x0000000000006af8 0xfb3 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
0x0000000000006af8 SDL_GetCursor
0x0000000000006b02 SDL_CursorPaletteChanged
0x0000000000006b11 SDL_MouseRect
0x0000000000006ba2 SDL_ResetCursor
0x0000000000006bdb SDL_EraseCursorNoLock
0x0000000000006d41 SDL_EraseCursor
0x0000000000006dce SDL_DrawCursorNoLock
0x0000000000007442 SDL_DrawCursor
0x00000000000074cf SDL_MoveCursor
0x000000000000756e SDL_WarpMouse
0x00000000000075d7 SDL_SetCursor
0x0000000000007741 SDL_ShowCursor
0x00000000000077da SDL_FreeCursor
0x0000000000007860 SDL_CreateCursor
0x00000000000079d8 SDL_CursorInit
0x0000000000007a2f SDL_CursorQuit
*fill* 0x0000000000007aab 0x1 00
.text 0x0000000000007aac 0xc8e /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o)
0x0000000000007aac SDL_DitherColors
0x0000000000007b19 SDL_CalculatePitch
0x0000000000007b52 SDL_FindColor
0x0000000000007bca SDL_MapRGB
0x0000000000007c3c SDL_MapRGBA
0x0000000000007cca SDL_GetRGBA
0x0000000000007ddd SDL_GetRGB
0x0000000000007ea1 SDL_ApplyGamma
0x0000000000007ef3 SDL_InvalidateMap
0x0000000000007f2d SDL_FormatChanged
0x0000000000007f45 SDL_FreeBlitMap
0x0000000000007f83 SDL_FreeFormat
0x00000000000080b4 SDL_MapSurface
0x0000000000008376 SDL_AllocBlitMap
0x00000000000083e8 SDL_AllocFormat
0x00000000000086f6 SDL_ReallocFormat
*fill* 0x000000000000873a 0x2 00
.text 0x000000000000873c 0x39e4 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
0x000000000000873c SDL_RLEBlit
0x000000000000a827 SDL_RLEAlphaBlit
0x000000000000b6a2 SDL_UnRLESurface
0x000000000000b8a1 SDL_RLESurface
.text 0x000000000000c120 0xd19 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
0x000000000000c120 SDL_SetClipRect
0x000000000000c1db SDL_GetClipRect
0x000000000000c1f9 SDL_LockSurface
0x000000000000c250 SDL_FreeSurface
0x000000000000c31c SDL_UnlockSurface
0x000000000000c368 SDL_FillRect
0x000000000000c609 SDL_LowerBlit
0x000000000000c675 SDL_UpperBlit
0x000000000000c82c SDL_SetAlpha
0x000000000000c942 SDL_SetColorKey
0x000000000000ca0d SDL_CreateRGBSurface
0x000000000000cbe0 SDL_ConvertSurface
0x000000000000cddc SDL_CreateRGBSurfaceFrom
*fill* 0x000000000000ce39 0x3 00
.text 0x000000000000ce3c 0x18ea /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
0x000000000000ce3c SDL_GetVideoSurface
0x000000000000ce53 SDL_GetVideoInfo
0x000000000000ce67 SDL_ListModes
0x000000000000ce9b SDL_GL_SwapBuffers
0x000000000000cebd SDL_GL_UpdateRectsLock
0x000000000000cec2 SDL_GL_UpdateRects
0x000000000000cec7 SDL_GL_Lock
0x000000000000cecc SDL_GL_Unlock
0x000000000000ced1 SDL_WM_GetCaption
0x000000000000ceff SDL_WM_GrabInput
0x000000000000cfb1 SDL_WM_IconifyWindow
0x000000000000cfd4 SDL_WM_ToggleFullScreen
0x000000000000d076 SDL_GetWMInfo
0x000000000000d0a0 SDL_VideoModeOK
0x000000000000d177 SDL_WM_SetIcon
0x000000000000d3aa SDL_WM_SetCaption
0x000000000000d47e SDL_GL_GetAttribute
0x000000000000d4bb SDL_GL_SetAttribute
0x000000000000d54f SDL_GL_GetProcAddress
0x000000000000d592 SDL_GL_LoadLibrary
0x000000000000d5c7 SDL_VideoQuit
0x000000000000d723 SDL_UpdateRects
0x000000000000d8ed SDL_UpdateRect
0x000000000000daa2 SDL_SetPalette
0x000000000000dc0e SDL_SetColors
0x000000000000dc29 SDL_Flip
0x000000000000dd00 SDL_DisplayFormat
0x000000000000dd4b SDL_DisplayFormatAlpha
0x000000000000de23 SDL_SetVideoMode
0x000000000000e492 SDL_VideoDriverName
0x000000000000e4c8 SDL_VideoInit
*fill* 0x000000000000e726 0x2 00
.text 0x000000000000e728 0x6bc /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
0x000000000000e728 get_skinh
0x000000000000e754 MenuetOS_SetColors
0x000000000000e75b MenuetOS_VideoQuit
0x000000000000e787 MenuetOS_FinalQuit
0x000000000000e78c MenuetOS_SetCaption
0x000000000000e7fc KolibriOS_FreeWMCursor
0x000000000000e812 KolibriOS_CheckMouseMode
0x000000000000ea27 KolibriOS_ShowWMCursor
0x000000000000eaab KolibriOS_CreateWMCursor
0x000000000000ec48 MenuetOS_SDL_RepaintWnd
0x000000000000ecdc MenuetOS_SetVideoMode
.text 0x000000000000ede4 0x1a8 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
0x000000000000ede4 SDL_WasInit
0x000000000000edfa SDL_Linked_Version
0x000000000000ee04 SDL_QuitSubSystem
0x000000000000ee57 SDL_Quit
0x000000000000ee70 SDL_InitSubSystem
0x000000000000ef52 SDL_Init
.text 0x000000000000ef8c 0x4d4 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
0x000000000000ef8c SDL_ClearError
0x000000000000ef9b SDL_GetErrorMsgUNICODE
0x000000000000f229 SDL_GetErrorMsg
0x000000000000f290 SDL_GetError
0x000000000000f2a7 SDL_printf
0x000000000000f303 SDL_SetError
0x000000000000f413 SDL_Error
.text 0x000000000000f460 0x28 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o)
0x000000000000f460 SDL_InstallParachute
0x000000000000f465 SDL_UninstallParachute
0x000000000000f46a SDL_printf_error
.text 0x000000000000f488 0x179 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_getenv.o)
0x000000000000f488 SDL_getenv
0x000000000000f4fa SDL_putenv
*fill* 0x000000000000f601 0x3 00
.text 0x000000000000f604 0xad6 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
0x000000000000f604 SDL_AudioQuit
0x000000000000f609 SDL_PauseAudio
0x000000000000f64b SDL_LockAudio
0x000000000000f67d SDL_UnlockAudio
0x000000000000f68c SDL_CloseAudio
0x000000000000f6e8 SDL_OpenAudio
0x0000000000010054 SDL_AudioDriverName
0x0000000000010084 SDL_AudioInit
*fill* 0x00000000000100da 0x6 00
.text 0x00000000000100e0 0xbf /home/sourcerer/kos_src/me//lib/libSDL.a(init.o)
0x00000000000100e0 InitSound
0x0000000000010144 CreateBuffer
0x0000000000010174 DestroyBuffer
*fill* 0x000000000001019f 0x1 00
.text 0x00000000000101a0 0x57 /home/sourcerer/kos_src/me//lib/libSDL.a(setbuf.o)
0x00000000000101a0 SetBuffer
0x00000000000101cc PlayBuffer
*fill* 0x00000000000101f7 0x9 00
.text 0x0000000000010200 0x2b /home/sourcerer/kos_src/me//lib/libSDL.a(stopbuf.o)
0x0000000000010200 StopBuffer
*fill* 0x000000000001022b 0x5 00
.text 0x0000000000010230 0x2e /home/sourcerer/kos_src/me//lib/libSDL.a(sndgetsize.o)
0x0000000000010230 GetBufferSize
*fill* 0x000000000001025e 0x2 00
.text 0x0000000000010260 0x99 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o)
0x0000000000010260 SDL_mutexP
0x0000000000010267 SDL_mutexV
0x000000000001026e SDL_DestroyMutex
0x00000000000102a0 SDL_CreateMutex
*fill* 0x00000000000102f9 0x3 00
.text 0x00000000000102fc 0x74 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
0x00000000000102fc SDL_DestroySemaphore
0x0000000000010301 SDL_SemValue
0x0000000000010308 SDL_SemPost
0x000000000001031d SDL_SemWait
0x0000000000010332 SDL_SemWaitTimeout
0x0000000000010347 SDL_SemTryWait
0x000000000001035c SDL_CreateSemaphore
.text 0x0000000000010370 0x2b /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
0x0000000000010370 SDL_SYS_SetupThread
0x0000000000010375 SDL_ThreadID
0x000000000001037c SDL_SYS_WaitThread
0x0000000000010381 SDL_SYS_KillThread
0x0000000000010386 SDL_SYS_CreateThread
*fill* 0x000000000001039b 0x1 00
.text 0x000000000001039c 0x39a /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_thread.o)
0x000000000001039c SDL_GetThreadID
0x0000000000010422 SDL_WaitThread
0x0000000000010462 SDL_KillThread
0x000000000001048b SDL_GetErrBuf
0x00000000000104f6 SDL_RunThread
0x000000000001053d SDL_ThreadsQuit
0x0000000000010564 SDL_ThreadsInit
0x000000000001058f SDL_CreateThread
*fill* 0x0000000000010736 0x2 00
.text 0x0000000000010738 0xbf /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_active.o)
0x0000000000010738 SDL_AppActiveInit
0x0000000000010746 SDL_GetAppState
0x0000000000010750 SDL_PrivateAppActive
*fill* 0x00000000000107f7 0x1 00
.text 0x00000000000107f8 0xb9 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_resize.o)
0x00000000000107f8 SDL_PrivateResize
*fill* 0x00000000000108b1 0x3 00
.text 0x00000000000108b4 0x524 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
0x0000000000010a23 SDL_CalculateBlit
.text 0x0000000000010dd8 0x4fa8 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
0x0000000000015c0c SDL_CalculateBlitN
.text 0x0000000000015d80 0x2e4 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
0x0000000000015d80 MenuetOS_InitOSKeymap
0x0000000000015d98 kol_event_wait_time
0x0000000000015da9 MenuetOS_PumpEvents
.text 0x0000000000016064 0xa1f /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
0x000000000001697f SDL_CalculateBlit0
*fill* 0x0000000000016a83 0x1 00
.text 0x0000000000016a84 0x1f10 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
0x0000000000018939 SDL_CalculateBlit1
.text 0x0000000000018994 0x44a5 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
0x000000000001ccd0 SDL_CalculateAlphaBlit
*fill* 0x000000000001ce39 0x3 00
.text 0x000000000001ce3c 0x8 /home/sourcerer/kos_src/me//lib/libc.a(dup.o)
0x000000000001ce3c dup
.text 0x000000000001ce44 0x123 /home/sourcerer/kos_src/me//lib/libc.a(fdopen.o)
0x000000000001ce44 fdopen
*fill* 0x000000000001cf67 0x1 00
.text 0x000000000001cf68 0x43 /home/sourcerer/kos_src/me//lib/libc.a(window.o)
0x000000000001cf68 __menuet__define_window
0x000000000001cf9a __menuet__window_redraw
*fill* 0x000000000001cfab 0x1 00
.text 0x000000000001cfac 0x0 /home/sourcerer/kos_src/me//lib/libc.a(param.o)
.text 0x000000000001cfac 0x17 /home/sourcerer/kos_src/me//lib/libc.a(keyb.o)
0x000000000001cfac __menuet__getkey
*fill* 0x000000000001cfc3 0x1 00
.text 0x000000000001cfc4 0x2b /home/sourcerer/kos_src/me//lib/libc.a(image.o)
0x000000000001cfc4 __menuet__putimage
*fill* 0x000000000001cfef 0x1 00
.text 0x000000000001cff0 0xa /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
0x000000000001cff0 __menuet__sys_exit
*fill* 0x000000000001cffa 0x2 00
.text 0x000000000001cffc 0x29 /home/sourcerer/kos_src/me//lib/libc.a(event.o)
0x000000000001cffc __menuet__wait_for_event
0x000000000001d008 __menuet__check_for_event
0x000000000001d014 __menuet__set_bitfield_for_wanted_events
*fill* 0x000000000001d025 0x3 00
.text 0x000000000001d028 0x24 /home/sourcerer/kos_src/me//lib/libc.a(delay.o)
0x000000000001d028 __menuet__delay100
0x000000000001d039 __menuet(int, double, long,...)
.text 0x000000000001d04c 0x48 /home/sourcerer/kos_src/me//lib/libc.a(button.o)
0x000000000001d04c __menuet__make_button
0x000000000001d07c __menuet__get_button_id
.text 0x000000000001d094 0x7 /home/sourcerer/kos_src/me//lib/libc.a(setmode.o)
0x000000000001d094 __setmode
*fill* 0x000000000001d09b 0x1 00
.text 0x000000000001d09c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fmode.o)
.text 0x000000000001d09c 0x43 /home/sourcerer/kos_src/me//lib/libc.a(crt1.o)
0x000000000001d09c __crt1_startup
*fill* 0x000000000001d0df 0x1 00
.text 0x000000000001d0e0 0x148 /home/sourcerer/kos_src/me//lib/libc.a(crt0.o)
0x000000000001d0e0 _exit
0x000000000001d16b __crt0_setup_arguments
.text 0x000000000001d228 0x163 /home/sourcerer/kos_src/me//lib/libc.a(brk.o)
0x000000000001d228 init_brk
0x000000000001d27c sbrk
*fill* 0x000000000001d38b 0x1 00
.text 0x000000000001d38c 0x3e /home/sourcerer/kos_src/me//lib/libc.a(strdup.o)
0x000000000001d38c strdup
*fill* 0x000000000001d3ca 0x2 00
.text 0x000000000001d3cc 0x3d /home/sourcerer/kos_src/me//lib/libc.a(memset.o)
0x000000000001d3cc memset
*fill* 0x000000000001d409 0x3 00
.text 0x000000000001d40c 0x26 /home/sourcerer/kos_src/me//lib/libc.a(memmove.o)
0x000000000001d40c memmove
*fill* 0x000000000001d432 0x2 00
.text 0x000000000001d434 0x21 /home/sourcerer/kos_src/me//lib/libc.a(strncpy.o)
0x000000000001d434 strncpy
*fill* 0x000000000001d455 0x3 00
.text 0x000000000001d458 0x25 /home/sourcerer/kos_src/me//lib/libc.a(strncmp.o)
0x000000000001d458 strncmp
*fill* 0x000000000001d47d 0x3 00
.text 0x000000000001d480 0x16 /home/sourcerer/kos_src/me//lib/libc.a(strlen.o)
0x000000000001d480 strlen
*fill* 0x000000000001d496 0x2 00
.text 0x000000000001d498 0x19 /home/sourcerer/kos_src/me//lib/libc.a(strcpy.o)
0x000000000001d498 strcpy
*fill* 0x000000000001d4b1 0x3 00
.text 0x000000000001d4b4 0x1f /home/sourcerer/kos_src/me//lib/libc.a(strcmp.o)
0x000000000001d4b4 strcmp
*fill* 0x000000000001d4d3 0x1 00
.text 0x000000000001d4d4 0x2b /home/sourcerer/kos_src/me//lib/libc.a(memcpy.o)
0x000000000001d4d4 memcpy
*fill* 0x000000000001d4ff 0x1 00
.text 0x000000000001d500 0x35 /home/sourcerer/kos_src/me//lib/libc.a(memcmp.o)
0x000000000001d500 memcmp
*fill* 0x000000000001d535 0x3 00
.text 0x000000000001d538 0x373 /home/sourcerer/kos_src/me//lib/libc.a(malloc.o)
0x000000000001d538 free
0x000000000001d677 malloc
0x000000000001d849 realloc
*fill* 0x000000000001d8ab 0x1 00
.text 0x000000000001d8ac 0x23 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
0x000000000001d8ac exit
*fill* 0x000000000001d8cf 0x1 00
.text 0x000000000001d8d0 0x34 /home/sourcerer/kos_src/me//lib/libc.a(calloc.o)
0x000000000001d8d0 calloc
.text 0x000000000001d904 0xd /home/sourcerer/kos_src/me//lib/libc.a(abs.o)
0x000000000001d904 abs
*fill* 0x000000000001d911 0x3 00
.text 0x000000000001d914 0x31 /home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o)
0x000000000001d914 vsprintf
*fill* 0x000000000001d945 0x3 00
.text 0x000000000001d948 0x4 /home/sourcerer/kos_src/me//lib/libc.a(stderr.o)
.text 0x000000000001d94c 0x32 /home/sourcerer/kos_src/me//lib/libc.a(sprintf.o)
0x000000000001d94c sprintf
*fill* 0x000000000001d97e 0x2 00
.text 0x000000000001d980 0x82 /home/sourcerer/kos_src/me//lib/libc.a(fprintf.o)
0x000000000001d980 fprintf
*fill* 0x000000000001da02 0x2 00
.text 0x000000000001da04 0xad /home/sourcerer/kos_src/me//lib/libc.a(fflush.o)
0x000000000001da04 fflush
*fill* 0x000000000001dab1 0x3 00
.text 0x000000000001dab4 0xb4 /home/sourcerer/kos_src/me//lib/libc.a(fclose.o)
0x000000000001dab4 fclose
.text 0x000000000001db68 0x1517 /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
0x000000000001dd51 _doprnt
*fill* 0x000000000001f07f 0x1 00
.text 0x000000000001f080 0x9a /home/sourcerer/kos_src/me//lib/libc.a(allocfil.o)
0x000000000001f084 __alloc_file
*fill* 0x000000000001f11a 0x2 00
.text 0x000000000001f11c 0x2c /home/sourcerer/kos_src/me//lib/libc.a(modfl.o)
0x000000000001f11c __modfl
.text 0x000000000001f148 0xa /home/sourcerer/kos_src/me//lib/libc.a(lconv.o)
0x000000000001f148 localeconv
*fill* 0x000000000001f152 0x2 00
.text 0x000000000001f154 0xa /home/sourcerer/kos_src/me//lib/libc.a(errno.o)
0x000000000001f154 __isatty
*fill* 0x000000000001f15e 0x2 00
.text 0x000000000001f160 0x0 /home/sourcerer/kos_src/me//lib/libc.a(ct_flags.o)
.text 0x000000000001f160 0x8b /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
0x000000000001f160 __libclog_vprintf
0x000000000001f1c5 __libclog_printf
*fill* 0x000000000001f1eb 0x1 00
.text 0x000000000001f1ec 0xc /home/sourcerer/kos_src/me//lib/libc.a(write.o)
0x000000000001f1ec write
.text 0x000000000001f1f8 0xc /home/sourcerer/kos_src/me//lib/libc.a(lseek.o)
0x000000000001f1f8 lseek
.text 0x000000000001f204 0xc /home/sourcerer/kos_src/me//lib/libc.a(close.o)
0x000000000001f204 close
.text 0x000000000001f210 0x70 /home/sourcerer/kos_src/me//lib/libc.a(emu_init.o)
0x000000000001f210 dosemu_inithandles
0x000000000001f255 init_dir_stack
.text 0x000000000001f280 0x5b3 /home/sourcerer/kos_src/me//lib/libc.a(dosemu.o)
0x000000000001f280 dosemu_file_exists
0x000000000001f2cf dosemu_createtrunc
0x000000000001f31a dosemu_getiostruct
0x000000000001f33f dosemu_allochandle
0x000000000001f35f dosemu_freehandle
0x000000000001f37b dosemu_fileread
0x000000000001f3d2 dosemu_filewrite
0x000000000001f434 dosemu_iosize
0x000000000001f465 dosemu_filesize
0x000000000001f4b4 dosemu_tell
0x000000000001f4df dosemu_lseek
0x000000000001f53d dosemu_read
0x000000000001f5b6 dosemu_write
0x000000000001f5eb dosemu_close
0x000000000001f622 _dosemu_flush
0x000000000001f627 dosemu_truncate
0x000000000001f6b1 dosemu_open
*fill* 0x000000000001f833 0x1 00
.text 0x000000000001f834 0x39 /home/sourcerer/kos_src/me//lib/libc.a(_main.o)
0x000000000001f834 __main
*fill* 0x000000000001f86d 0x3 00
.text 0x000000000001f870 0x24 /home/sourcerer/kos_src/me//lib/libc.a(strrchr.o)
0x000000000001f870 strrchr
.text 0x000000000001f894 0x22 /home/sourcerer/kos_src/me//lib/libc.a(memchr.o)
0x000000000001f894 memchr
*fill* 0x000000000001f8b6 0x2 00
.text 0x000000000001f8b8 0x3f /home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o)
0x000000000001f8b8 __stdio_cleanup_proc
*fill* 0x000000000001f8f7 0x1 00
.text 0x000000000001f8f8 0x87 /home/sourcerer/kos_src/me//lib/libc.a(remove.o)
0x000000000001f8f8 remove
*fill* 0x000000000001f97f 0x1 00
.text 0x000000000001f980 0xc /home/sourcerer/kos_src/me//lib/libc.a(putc.o)
0x000000000001f980 putc
.text 0x000000000001f98c 0x3f /home/sourcerer/kos_src/me//lib/libc.a(fwalk.o)
0x000000000001f98c _fwalk
*fill* 0x000000000001f9cb 0x1 00
.text 0x000000000001f9cc 0x0 /home/sourcerer/kos_src/me//lib/libc.a(frlist.o)
.text 0x000000000001f9cc 0xb7 /home/sourcerer/kos_src/me//lib/libc.a(fputc.o)
0x000000000001f9cc fputc
*fill* 0x000000000001fa83 0x1 00
.text 0x000000000001fa84 0x148 /home/sourcerer/kos_src/me//lib/libc.a(flsbuf.o)
0x000000000001fa84 _flsbuf
.text 0x000000000001fbcc 0x0 /home/sourcerer/kos_src/me//lib/libc.a(hooks.o)
.text 0x000000000001fbcc 0x66 /home/sourcerer/kos_src/me//lib/libc.a(fixpath.o)
0x000000000001fbcc fix_slashes
0x000000000001fc0e _fixpath
*fill* 0x000000000001fc32 0x2 00
.text 0x000000000001fc34 0x22 /home/sourcerer/kos_src/me//lib/libc.a(systree.o)
0x000000000001fc34 __kolibri__system_tree_access
0x000000000001fc45 __kolibri__system_tree_access2
*fill* 0x000000000001fc56 0x2 00
.text 0x000000000001fc58 0x14 /home/sourcerer/kos_src/me//lib/libc.a(dosio.o)
0x000000000001fc58 __file_handle_set
.text 0x000000000001fc6c 0xe9 /home/sourcerer/kos_src/me//lib/libc.a(curdir.o)
0x000000000001fc6c __get_curdir
0x000000000001fd18 __libc_combine_path
0x000000000001fd41 __chdir
*fill* 0x000000000001fd55 0x3 00
.text 0x000000000001fd58 0x4 /home/sourcerer/kos_src/me//lib/libc.a(stdout.o)
.text 0x000000000001fd5c 0x4 /home/sourcerer/kos_src/me//lib/libc.a(stdin.o)
*(.fixup)
*(.gnu.warning)
*(.gnu.linkonce.t*)
*(.const)
*(.ro*)
.rodata.str1.1
0x000000000001fd60 0x7a polygon.o
*fill* 0x000000000001fdda 0x6 00
.rodata.cst8 0x000000000001fde0 0x8 polygon.o
.rodata.str1.1
0x000000000001fde8 0x2f /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
0x31 (size before relaxing)
*fill* 0x000000000001fe17 0x1 00
.rodata 0x000000000001fe18 0x50 /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
0x000000000001fe18 _nsfb_16bpp_plotters
.rodata 0x000000000001fe68 0x50 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
0x000000000001fe68 _nsfb_32bpp_xbgr8888_plotters
.rodata 0x000000000001feb8 0x50 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
0x000000000001feb8 _nsfb_32bpp_xrgb8888_plotters
.rodata 0x000000000001ff08 0x50 /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
0x000000000001ff08 _nsfb_8bpp_plotters
.rodata 0x000000000001ff58 0x20 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
.rodata.cst4 0x000000000001ff78 0x10 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
.rodata.str1.1
0x000000000001ff88 0x5 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
*fill* 0x000000000001ff8d 0x3 00
.rodata 0x000000000001ff90 0x24 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
0x000000000001ff90 able_rtns
.rodata.str1.1
0x000000000001ffb4 0x6 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
*fill* 0x000000000001ffba 0x2 00
.rodata 0x000000000001ffbc 0x24 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
0x000000000001ffbc linux_rtns
.rodata.str1.1
0x000000000001ffe0 0x4 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.rodata 0x000000000001ffe4 0x24 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
0x000000000001ffe4 ram_rtns
.rodata.str1.1
0x0000000000020008 0x31 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
0x35 (size before relaxing)
*fill* 0x0000000000020039 0x3 00
.rodata 0x000000000002003c 0x24 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
0x000000000002003c sdl_rtns
.rodata.str1.1
0x0000000000020060 0x9e /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
.rodata.str1.1
0x00000000000200fe 0x1a /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
.rodata.str1.1
0x0000000000020118 0x567 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
0x5b3 (size before relaxing)
*fill* 0x000000000002067f 0x1 00
.rodata 0x0000000000020680 0x70 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
.rodata.str1.1
0x00000000000206f0 0x2a /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
*fill* 0x000000000002071a 0x2 00
.rodata 0x000000000002071c 0x10 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
.rodata.str1.1
0x000000000002072c 0x67 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
.rodata.str1.1
0x0000000000020793 0x19d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
.rodata 0x0000000000020930 0x38 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
.rodata.str1.1
0x0000000000020968 0x20 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
.rodata.str1.1
0x0000000000020988 0x65 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
.rodata.str1.1
0x00000000000209ed 0x8e /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
0x91 (size before relaxing)
.rodata.str1.1
0x0000000000020a7b 0x192 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
.rodata.str1.1
0x0000000000020c0d 0x27 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
.rodata.str1.1
0x0000000000020c34 0x2b /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
.rodata.str1.1
0x0000000000020c5f 0x1f /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
*fill* 0x0000000000020c7e 0x2 00
.rodata 0x0000000000020c80 0x2350 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
.rodata 0x0000000000022fd0 0x600 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
.rodata 0x00000000000235d0 0x28 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
.rodata 0x00000000000235f8 0x140 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
.rodata 0x0000000000023738 0x1c /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
.rodata.str1.1
0x0000000000023754 0x2a /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
*fill* 0x000000000002377e 0x2 00
.rodata 0x0000000000023780 0x13c /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
.rodata.cst4 0x00000000000238bc 0x10 /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
0x14 (size before relaxing)
*fill* 0x00000000000238cc 0x4 00
.rodata.cst16 0x00000000000238d0 0x20 /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
.rodata.cst8 0x00000000000238f0 0x8 /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
*(.gnu.linkonce.r*)
0x00000000000238f8 ecode = .
0x00000000000238f8 _ecode = .
 
.iplt 0x0000000000023900 0x0
.iplt 0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
 
.text.startup 0x00000000000238f8 0x318
.text.startup 0x00000000000238f8 0x2a8 polygon.o
0x00000000000238f8 main
.text.startup 0x0000000000023ba0 0x1c /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
.text.startup 0x0000000000023bbc 0x1c /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
.text.startup 0x0000000000023bd8 0x1c /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.text.startup 0x0000000000023bf4 0x1c /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
 
.rel.dyn 0x0000000000023c10 0x0
.rel.iplt 0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
.rel.text 0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
.rel.text.startup
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
.rel.rodata 0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
.rel.data 0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
 
.rdata
 
.data 0x0000000000023c10 0x201c
0x0000000000023c10 djgpp_first_ctor = .
*(.ctor)
*(.ctors)
0x0000000000023c10 djgpp_last_ctor = .
0x0000000000023c10 djgpp_first_dtor = .
*(.dtor)
*(.dtors)
0x0000000000023c10 djgpp_last_dtor = .
*(.gcc_exc*)
0x0000000000023c10 __EH_FRAME_BEGIN__ = .
*(.eh_fram*)
.eh_frame 0x0000000000023c10 0x5c polygon.o
.eh_frame 0x0000000000023c6c 0x120 /home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
0x138 (size before relaxing)
.eh_frame 0x0000000000023d8c 0x2c /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
0x44 (size before relaxing)
.eh_frame 0x0000000000023db8 0x170 /home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
0x188 (size before relaxing)
.eh_frame 0x0000000000023f28 0xc4 /home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
0xdc (size before relaxing)
.eh_frame 0x0000000000023fec 0x1b0 /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
0x1c8 (size before relaxing)
.eh_frame 0x000000000002419c 0x16c /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
0x184 (size before relaxing)
.eh_frame 0x0000000000024308 0x1ac /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
0x1c4 (size before relaxing)
.eh_frame 0x00000000000244b4 0x1cc /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
0x1e4 (size before relaxing)
.eh_frame 0x0000000000024680 0x2bc /home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
0x2d4 (size before relaxing)
.eh_frame 0x000000000002493c 0x3d4 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
0x3ec (size before relaxing)
.eh_frame 0x0000000000024d10 0xec /home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
0x104 (size before relaxing)
.eh_frame 0x0000000000024dfc 0xa0 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
0xb8 (size before relaxing)
.eh_frame 0x0000000000024e9c 0x100 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
0x118 (size before relaxing)
.eh_frame 0x0000000000024f9c 0xd8 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
0xf0 (size before relaxing)
.eh_frame 0x0000000000025074 0x1b0 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
0x1c8 (size before relaxing)
.eh_frame 0x0000000000025224 0x118 /home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
0x130 (size before relaxing)
0x000000000002533c __EH_FRAME_END__ = .
0x000000000002533c 0x4 LONG 0x0
*(.gnu.linkonce.d*)
*(.rodata)
*(.rodata.*)
*(.data)
.data 0x0000000000025340 0x0 polygon.o
.data 0x0000000000025340 0x0 /home/sourcerer/kos_src/me//lib/libm.a(s_cos.o)
.data 0x0000000000025340 0x0 /home/sourcerer/kos_src/me//lib/libm.a(s_sin.o)
.data 0x0000000000025340 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
.data 0x0000000000025340 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
.data 0x0000000000025340 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
.data 0x0000000000025340 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
.data 0x0000000000025340 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
.data 0x0000000000025340 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
.data 0x0000000000025340 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
.data 0x0000000000025340 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
.data 0x0000000000025340 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
.data 0x0000000000025340 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
.data 0x0000000000025340 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
.data 0x0000000000025340 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
.data 0x0000000000025340 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
.data 0x0000000000025340 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.data 0x0000000000025340 0x50c /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
0x0000000000025340 sdl_nsfb_map
.data 0x000000000002584c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
.data 0x000000000002584c 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
.data 0x000000000002584c 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o)
.data 0x000000000002584c 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
.data 0x000000000002584c 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
.data 0x000000000002584c 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o)
.data 0x000000000002584c 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_quit.o)
.data 0x000000000002584c 0x44 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
.data 0x0000000000025890 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o)
.data 0x0000000000025890 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
.data 0x0000000000025890 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
.data 0x0000000000025890 0x20 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
.data 0x00000000000258b0 0x24 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
0x00000000000258b0 def_title
0x00000000000258c4 mosvideo_bootstrab
.data 0x00000000000258d4 0x3 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
*fill* 0x00000000000258d7 0x1 00
.data 0x00000000000258d8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
.data 0x00000000000258d8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o)
.data 0x00000000000258d8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_getenv.o)
.data 0x00000000000258d8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
*fill* 0x00000000000258d8 0x8 00
.data 0x00000000000258e0 0x17 /home/sourcerer/kos_src/me//lib/libSDL.a(init.o)
0x00000000000258e0 hSound
0x00000000000258e4 hrdwSound
*fill* 0x00000000000258f7 0x1 00
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_thread.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_active.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_resize.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dup.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fdopen.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(window.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(param.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(keyb.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(image.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(event.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(delay.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(button.o)
.data 0x00000000000258f8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(setmode.o)
.data 0x00000000000258f8 0x4 /home/sourcerer/kos_src/me//lib/libc.a(fmode.o)
0x00000000000258f8 _fmode
.data 0x00000000000258fc 0x4 /home/sourcerer/kos_src/me//lib/libc.a(crt1.o)
0x00000000000258fc __bss_count
.data 0x0000000000025900 0x0 /home/sourcerer/kos_src/me//lib/libc.a(crt0.o)
.data 0x0000000000025900 0x0 /home/sourcerer/kos_src/me//lib/libc.a(brk.o)
.data 0x0000000000025900 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strdup.o)
.data 0x0000000000025900 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memset.o)
.data 0x0000000000025900 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memmove.o)
.data 0x0000000000025900 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strncpy.o)
.data 0x0000000000025900 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strncmp.o)
.data 0x0000000000025900 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strlen.o)
.data 0x0000000000025900 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strcpy.o)
.data 0x0000000000025900 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strcmp.o)
.data 0x0000000000025900 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memcpy.o)
.data 0x0000000000025900 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memcmp.o)
.data 0x0000000000025900 0x0 /home/sourcerer/kos_src/me//lib/libc.a(malloc.o)
.data 0x0000000000025900 0x0 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.data 0x0000000000025900 0x0 /home/sourcerer/kos_src/me//lib/libc.a(calloc.o)
.data 0x0000000000025900 0x0 /home/sourcerer/kos_src/me//lib/libc.a(abs.o)
.data 0x0000000000025900 0x0 /home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o)
.data 0x0000000000025900 0x24 /home/sourcerer/kos_src/me//lib/libc.a(stderr.o)
0x0000000000025900 __dj_stderr
.data 0x0000000000025924 0x0 /home/sourcerer/kos_src/me//lib/libc.a(sprintf.o)
.data 0x0000000000025924 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fprintf.o)
.data 0x0000000000025924 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fflush.o)
.data 0x0000000000025924 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fclose.o)
.data 0x0000000000025924 0xb /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
*fill* 0x000000000002592f 0x1 00
.data 0x0000000000025930 0x0 /home/sourcerer/kos_src/me//lib/libc.a(allocfil.o)
.data 0x0000000000025930 0x0 /home/sourcerer/kos_src/me//lib/libc.a(modfl.o)
.data 0x0000000000025930 0x33 /home/sourcerer/kos_src/me//lib/libc.a(lconv.o)
*fill* 0x0000000000025963 0x1 00
.data 0x0000000000025964 0x0 /home/sourcerer/kos_src/me//lib/libc.a(errno.o)
.data 0x0000000000025964 0x202 /home/sourcerer/kos_src/me//lib/libc.a(ct_flags.o)
0x0000000000025964 __dj_ctype_flags
*fill* 0x0000000000025b66 0x2 00
.data 0x0000000000025b68 0x0 /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.data 0x0000000000025b68 0x0 /home/sourcerer/kos_src/me//lib/libc.a(write.o)
.data 0x0000000000025b68 0x0 /home/sourcerer/kos_src/me//lib/libc.a(lseek.o)
.data 0x0000000000025b68 0x0 /home/sourcerer/kos_src/me//lib/libc.a(close.o)
.data 0x0000000000025b68 0x0 /home/sourcerer/kos_src/me//lib/libc.a(emu_init.o)
.data 0x0000000000025b68 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dosemu.o)
.data 0x0000000000025b68 0x4 /home/sourcerer/kos_src/me//lib/libc.a(_main.o)
.data 0x0000000000025b6c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strrchr.o)
.data 0x0000000000025b6c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memchr.o)
.data 0x0000000000025b6c 0x4 /home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o)
0x0000000000025b6c __stdio_cleanup_hook
.data 0x0000000000025b70 0x0 /home/sourcerer/kos_src/me//lib/libc.a(remove.o)
.data 0x0000000000025b70 0x0 /home/sourcerer/kos_src/me//lib/libc.a(putc.o)
.data 0x0000000000025b70 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fwalk.o)
.data 0x0000000000025b70 0x5c /home/sourcerer/kos_src/me//lib/libc.a(frlist.o)
0x0000000000025b70 __file_rec_list
.data 0x0000000000025bcc 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fputc.o)
.data 0x0000000000025bcc 0x0 /home/sourcerer/kos_src/me//lib/libc.a(flsbuf.o)
.data 0x0000000000025bcc 0x0 /home/sourcerer/kos_src/me//lib/libc.a(hooks.o)
.data 0x0000000000025bcc 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fixpath.o)
.data 0x0000000000025bcc 0x0 /home/sourcerer/kos_src/me//lib/libc.a(systree.o)
.data 0x0000000000025bcc 0x18 /home/sourcerer/kos_src/me//lib/libc.a(dosio.o)
0x0000000000025bcc __file_handle_modes
.data 0x0000000000025be4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(curdir.o)
.data 0x0000000000025be4 0x24 /home/sourcerer/kos_src/me//lib/libc.a(stdout.o)
0x0000000000025be4 __dj_stdout
.data 0x0000000000025c08 0x24 /home/sourcerer/kos_src/me//lib/libc.a(stdin.o)
0x0000000000025c08 __dj_stdin
0x0000000000025c2c edata = .
0x0000000000025c2c _edata = .
0x0000000000025c2c bss = .
 
.igot.plt 0x0000000000025c2c 0x0
.igot.plt 0x0000000000000000 0x0 /home/sourcerer/kos_src/me//stub/crt0.o
 
.init_array 0x0000000000025c2c 0x10
.init_array 0x0000000000025c2c 0x4 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
.init_array 0x0000000000025c30 0x4 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
.init_array 0x0000000000025c34 0x4 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.init_array 0x0000000000025c38 0x4 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
 
.bss 0x0000000000025c3c 0x20230
*(.bss)
.bss 0x0000000000025c3c 0x10000 /home/sourcerer/kos_src/me//stub/crt0.o
.bss 0x0000000000035c3c 0x0 polygon.o
.bss 0x0000000000035c3c 0x0 /home/sourcerer/kos_src/me//lib/libm.a(s_cos.o)
.bss 0x0000000000035c3c 0x0 /home/sourcerer/kos_src/me//lib/libm.a(s_sin.o)
.bss 0x0000000000035c3c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
.bss 0x0000000000035c3c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
.bss 0x0000000000035c3c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
.bss 0x0000000000035c3c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
.bss 0x0000000000035c3c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
.bss 0x0000000000035c3c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
.bss 0x0000000000035c3c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
.bss 0x0000000000035c3c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
.bss 0x0000000000035c3c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
.bss 0x0000000000035c3c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
.bss 0x0000000000035c3c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
.bss 0x0000000000035c3c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
.bss 0x0000000000035c3c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
.bss 0x0000000000035c3c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.bss 0x0000000000035c3c 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
.bss 0x0000000000035c3c 0xc4 /home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
.bss 0x0000000000035d00 0x24 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
0x0000000000035d00 SDL_timer_started
0x0000000000035d04 SDL_timer_running
0x0000000000035d08 SDL_alarm_interval
0x0000000000035d0c SDL_alarm_callback
.bss 0x0000000000035d24 0x4 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o)
.bss 0x0000000000035d28 0xe4c /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
0x0000000000035d28 SDL_EventOK
0x0000000000035d2c SDL_ProcessEvents
.bss 0x0000000000036b74 0x678 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
0x0000000000036b74 SDL_TranslateUNICODE
0x0000000000036b78 SDL_KeyRepeat
.bss 0x00000000000371ec 0xa /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o)
*fill* 0x00000000000371f6 0x2 00
.bss 0x00000000000371f8 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_quit.o)
.bss 0x00000000000371f8 0x18 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
0x00000000000371f8 SDL_cursorstate
0x00000000000371fc SDL_cursor
0x0000000000037200 SDL_cursorlock
.bss 0x0000000000037210 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o)
.bss 0x0000000000037210 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
.bss 0x0000000000037210 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
.bss 0x0000000000037210 0x4 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
0x0000000000037210 current_video
.bss 0x0000000000037214 0x10 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
.bss 0x0000000000037224 0x8 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
.bss 0x000000000003722c 0xb08 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
.bss 0x0000000000037d34 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o)
.bss 0x0000000000037d34 0x4 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_getenv.o)
.bss 0x0000000000037d38 0x4438 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
0x0000000000037d38 audio_thread_stack
.bss 0x000000000003c170 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o)
.bss 0x000000000003c170 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
.bss 0x000000000003c170 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
.bss 0x000000000003c170 0x31c /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_thread.o)
0x000000000003c170 _creating_thread_lock
.bss 0x000000000003c48c 0x1 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_active.o)
*fill* 0x000000000003c48d 0x3 00
.bss 0x000000000003c490 0x8 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_resize.o)
.bss 0x000000000003c498 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
.bss 0x000000000003c498 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
.bss 0x000000000003c498 0xc /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
.bss 0x000000000003c4a4 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
.bss 0x000000000003c4a4 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
.bss 0x000000000003c4a4 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
.bss 0x000000000003c4a4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dup.o)
.bss 0x000000000003c4a4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fdopen.o)
.bss 0x000000000003c4a4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(window.o)
.bss 0x000000000003c4a4 0x800 /home/sourcerer/kos_src/me//lib/libc.a(param.o)
0x000000000003c4a4 __menuet__app_param_area
0x000000000003c8a4 __menuet__app_path_area
.bss 0x000000000003cca4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(keyb.o)
.bss 0x000000000003cca4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(image.o)
.bss 0x000000000003cca4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.bss 0x000000000003cca4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(event.o)
.bss 0x000000000003cca4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(delay.o)
.bss 0x000000000003cca4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(button.o)
.bss 0x000000000003cca4 0x4 /home/sourcerer/kos_src/me//lib/libc.a(setmode.o)
0x000000000003cca4 __setmode_stdio_hook
.bss 0x000000000003cca8 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fmode.o)
.bss 0x000000000003cca8 0x14 /home/sourcerer/kos_src/me//lib/libc.a(crt1.o)
0x000000000003cca8 __crt0_argc
0x000000000003ccac __crt0_argv
0x000000000003ccb0 __dos_argv0
0x000000000003ccb4 _crt0_startup_flags
0x000000000003ccb8 environ
.bss 0x000000000003ccbc 0x0 /home/sourcerer/kos_src/me//lib/libc.a(crt0.o)
.bss 0x000000000003ccbc 0x18 /home/sourcerer/kos_src/me//lib/libc.a(brk.o)
.bss 0x000000000003ccd4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strdup.o)
.bss 0x000000000003ccd4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memset.o)
.bss 0x000000000003ccd4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memmove.o)
.bss 0x000000000003ccd4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strncpy.o)
.bss 0x000000000003ccd4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strncmp.o)
.bss 0x000000000003ccd4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strlen.o)
.bss 0x000000000003ccd4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strcpy.o)
.bss 0x000000000003ccd4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strcmp.o)
.bss 0x000000000003ccd4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memcpy.o)
.bss 0x000000000003ccd4 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memcmp.o)
.bss 0x000000000003ccd4 0x80 /home/sourcerer/kos_src/me//lib/libc.a(malloc.o)
.bss 0x000000000003cd54 0x8 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
0x000000000003cd54 __atexit_ptr
0x000000000003cd58 keypress_at_exit
.bss 0x000000000003cd5c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(calloc.o)
.bss 0x000000000003cd5c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(abs.o)
.bss 0x000000000003cd5c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o)
.bss 0x000000000003cd5c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stderr.o)
.bss 0x000000000003cd5c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(sprintf.o)
.bss 0x000000000003cd5c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fprintf.o)
.bss 0x000000000003cd5c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fflush.o)
.bss 0x000000000003cd5c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fclose.o)
.bss 0x000000000003cd5c 0x4 /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
.bss 0x000000000003cd60 0x0 /home/sourcerer/kos_src/me//lib/libc.a(allocfil.o)
.bss 0x000000000003cd60 0x0 /home/sourcerer/kos_src/me//lib/libc.a(modfl.o)
.bss 0x000000000003cd60 0x0 /home/sourcerer/kos_src/me//lib/libc.a(lconv.o)
.bss 0x000000000003cd60 0x4 /home/sourcerer/kos_src/me//lib/libc.a(errno.o)
0x000000000003cd60 errno
.bss 0x000000000003cd64 0x0 /home/sourcerer/kos_src/me//lib/libc.a(ct_flags.o)
.bss 0x000000000003cd64 0x400 /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.bss 0x000000000003d164 0x0 /home/sourcerer/kos_src/me//lib/libc.a(write.o)
.bss 0x000000000003d164 0x0 /home/sourcerer/kos_src/me//lib/libc.a(lseek.o)
.bss 0x000000000003d164 0x0 /home/sourcerer/kos_src/me//lib/libc.a(close.o)
.bss 0x000000000003d164 0x8800 /home/sourcerer/kos_src/me//lib/libc.a(emu_init.o)
0x000000000003d164 _io_handles
0x0000000000045564 __curdir_buf
.bss 0x0000000000045964 0x100 /home/sourcerer/kos_src/me//lib/libc.a(dosemu.o)
.bss 0x0000000000045a64 0x0 /home/sourcerer/kos_src/me//lib/libc.a(_main.o)
.bss 0x0000000000045a64 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strrchr.o)
.bss 0x0000000000045a64 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memchr.o)
.bss 0x0000000000045a64 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o)
.bss 0x0000000000045a64 0x0 /home/sourcerer/kos_src/me//lib/libc.a(remove.o)
.bss 0x0000000000045a64 0x0 /home/sourcerer/kos_src/me//lib/libc.a(putc.o)
.bss 0x0000000000045a64 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fwalk.o)
.bss 0x0000000000045a64 0x0 /home/sourcerer/kos_src/me//lib/libc.a(frlist.o)
.bss 0x0000000000045a64 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fputc.o)
.bss 0x0000000000045a64 0x0 /home/sourcerer/kos_src/me//lib/libc.a(flsbuf.o)
.bss 0x0000000000045a64 0x8 /home/sourcerer/kos_src/me//lib/libc.a(hooks.o)
0x0000000000045a64 __libc_read_termios_hook
0x0000000000045a68 __libc_write_termios_hook
.bss 0x0000000000045a6c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fixpath.o)
.bss 0x0000000000045a6c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(systree.o)
.bss 0x0000000000045a6c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dosio.o)
.bss 0x0000000000045a6c 0x400 /home/sourcerer/kos_src/me//lib/libc.a(curdir.o)
.bss 0x0000000000045e6c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stdout.o)
.bss 0x0000000000045e6c 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stdin.o)
*(.note.gnu.build-id)
0x0000000000045e6c end = .
0x0000000000045e6c _end = .
LOAD /home/sourcerer/kos_src/me//stub/crt0.o
LOAD polygon.o
LOAD /home/sourcerer/kos_src/me//lib/libm.a
LOAD /home/sourcerer/kos_src/me//lib/libnsfb.a
LOAD /home/sourcerer/kos_src/me//lib/libSDL.a
LOAD /home/sourcerer/kos_src/me//lib/libc.a
OUTPUT(polygon elf32-i386)
 
.comment 0x0000000000000000 0x38
.comment 0x0000000000000000 0x1c polygon.o
0x1d (size before relaxing)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
.comment 0x000000000000001c 0x1c /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
0x1d (size before relaxing)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_quit.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_getenv.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_thread.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_active.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_resize.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(dup.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fdopen.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(window.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(param.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(keyb.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(image.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(event.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(delay.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(button.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(setmode.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fmode.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(crt1.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(crt0.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(brk.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strdup.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strncpy.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strncmp.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strlen.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strcpy.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strcmp.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(memcpy.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(memcmp.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(malloc.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(calloc.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(abs.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(stderr.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(sprintf.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fprintf.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fflush.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fclose.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(allocfil.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(lconv.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(errno.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(ct_flags.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(write.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(lseek.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(close.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(emu_init.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(dosemu.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(_main.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(strrchr.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(memchr.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(remove.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(putc.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fwalk.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(frlist.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fputc.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(flsbuf.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(hooks.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(fixpath.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(systree.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(dosio.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(curdir.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(stdout.o)
.comment 0x0000000000000000 0x1d /home/sourcerer/kos_src/me//lib/libc.a(stdin.o)
 
.note.GNU-stack
0x0000000000000000 0x0
.note.GNU-stack
0x0000000000000000 0x0 polygon.o
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(cursor.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(dump.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(libnsfb.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(palette.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(16bpp.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xbgr8888.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(32bpp-xrgb8888.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(8bpp.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(api.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(generic.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(util.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(able.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(linux.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(ram.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(sdl.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libnsfb.a(surface.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_timer.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systimer.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_events.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_keyboard.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_mouse.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_quit.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_cursor.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_pixels.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_RLEaccel.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_surface.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_video.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetvideo.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_error.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_fatal.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_getenv.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_kolibri_audio.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_sysmutex.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_syssem.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_systhread.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_thread.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_active.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_resize.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_N.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_menuetevents.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_0.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_1.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libSDL.a(SDL_blit_A.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dup.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fdopen.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(window.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(param.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(keyb.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(image.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(event.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(delay.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(button.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(setmode.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fmode.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(crt1.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(crt0.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(brk.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strdup.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strncpy.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strncmp.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strlen.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strcpy.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strcmp.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memcpy.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memcmp.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(malloc.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(exit.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(calloc.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(abs.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(vsprintf.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stderr.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(sprintf.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fprintf.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fflush.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fclose.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(doprnt.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(allocfil.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(lconv.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(errno.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(ct_flags.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(debug.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(write.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(lseek.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(close.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(emu_init.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dosemu.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(_main.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(strrchr.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(memchr.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stdiohk.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(remove.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(putc.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fwalk.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(frlist.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fputc.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(flsbuf.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(hooks.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(fixpath.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(systree.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(dosio.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(curdir.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stdout.o)
.note.GNU-stack
0x0000000000000000 0x0 /home/sourcerer/kos_src/me//lib/libc.a(stdin.o)
/contrib/network/netsurf/libnsfb/test/polystar.c
0,0 → 1,144
/* libnsfb ploygon plotter test program */
 
#ifndef _POSIX_C_SOURCE
#define _POSIX_C_SOURCE 199506L
#endif
 
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <math.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_event.h"
 
 
#include <time.h>
// Sleep milliseconds
static void sleepMilli(long ms)
{
const struct timespec ts = {ms / 1000, ms % 1000 * 1000000};
nanosleep(&ts, NULL);
}
 
#define UNUSED(x) ((x) = (x))
 
int main(int argc, char **argv)
{
const char *fename;
enum nsfb_type_e fetype;
nsfb_t *nsfb;
 
int waitloop = 3;
 
nsfb_event_t event;
nsfb_bbox_t box;
uint8_t *fbptr;
int fbstride;
 
int sides;
int radius;
nsfb_point_t *points;
int loop;
nsfb_plot_pen_t pen;
 
double rotate;
 
if (argc < 2) {
fename="sdl";
} else {
fename = argv[1];
}
 
fetype = nsfb_type_from_name(fename);
if (fetype == NSFB_SURFACE_NONE) {
fprintf(stderr, "Unable to convert \"%s\" to nsfb surface type\n", fename);
return 1;
}
 
nsfb = nsfb_new(fetype);
if (nsfb == NULL) {
fprintf(stderr, "Unable to allocate \"%s\" nsfb surface\n", fename);
return 2;
}
 
if (nsfb_init(nsfb) == -1) {
fprintf(stderr, "Unable to initialise nsfb surface\n");
nsfb_free(nsfb);
return 4;
}
 
/* get the geometry of the whole screen */
box.x0 = box.y0 = 0;
nsfb_get_geometry(nsfb, &box.x1, &box.y1, NULL);
 
nsfb_get_buffer(nsfb, &fbptr, &fbstride);
 
 
pen.stroke_colour = 0xff000000;
pen.stroke_type = NFSB_PLOT_OPTYPE_SOLID;
 
 
for (rotate =0; rotate < (2 * M_PI); rotate += (M_PI / 8)) {
/* claim the whole screen for update */
nsfb_claim(nsfb, &box);
 
nsfb_plot_clg(nsfb, 0xffffffff);
 
radius = (box.y1 / 2);
 
for (sides = 18; sides >=9; sides-=2) {
points = malloc(sizeof(nsfb_point_t) * sides);
 
for (loop = 0; loop < sides;loop+=2) {
points[loop].x = (box.x1 / 2) +
(radius * cos((loop * 2 * M_PI / sides) + rotate));
points[loop].y = (box.y1 / 2) +
(radius * sin((loop * 2 * M_PI / sides) + rotate));
 
points[loop+1].x = (box.x1 / 2) +
((radius / 3) * cos(((loop+1) * 2 * M_PI / sides) + rotate));
points[loop+1].y = (box.y1 / 2) +
((radius / 3) * sin(((loop+1) * 2 * M_PI / sides) + rotate));
}
 
nsfb_plot_polygon(nsfb, (const int *)points, sides,
0xff000000 | (0xffffff / (sides * 2)));
 
nsfb_plot_polylines(nsfb, sides, points, &pen);
 
free(points);
radius -= 40;
}
 
nsfb_update(nsfb, &box);
sleepMilli(100);
}
/* wait for quit event or timeout */
while (waitloop > 0) {
if (nsfb_event(nsfb, &event, 1000) == false) {
break;
}
if (event.type == NSFB_EVENT_CONTROL) {
if (event.value.controlcode == NSFB_CONTROL_TIMEOUT) {
/* timeout */
waitloop--;
} else if (event.value.controlcode == NSFB_CONTROL_QUIT) {
break;
}
}
}
 
nsfb_free(nsfb);
 
return 0;
}
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/test/polystar2.c
0,0 → 1,137
/* libnsfb ploygon plotter test program */
 
#ifndef _POSIX_C_SOURCE
#define _POSIX_C_SOURCE 199506L
#endif
 
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <math.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_event.h"
 
 
#include <time.h>
// Sleep milliseconds
static void sleepMilli(long ms)
{
const struct timespec ts = {ms / 1000, ms % 1000 * 1000000};
nanosleep(&ts, NULL);
}
 
#define UNUSED(x) ((x) = (x))
 
 
int main(int argc, char **argv)
{
const char *fename;
enum nsfb_type_e fetype;
nsfb_t *nsfb;
 
int waitloop = 3;
 
nsfb_event_t event;
nsfb_bbox_t box;
uint8_t *fbptr;
int fbstride;
 
int sides;
int radius;
nsfb_point_t *points;
int loop;
int counter;
int colour;
 
if (argc < 2) {
fename="sdl";
} else {
fename = argv[1];
}
 
fetype = nsfb_type_from_name(fename);
if (fetype == NSFB_SURFACE_NONE) {
fprintf(stderr, "Unable to convert \"%s\" to nsfb surface type\n", fename);
return 1;
}
 
nsfb = nsfb_new(fetype);
if (nsfb == NULL) {
fprintf(stderr, "Unable to allocate \"%s\" nsfb surface\n", fename);
return 2;
}
 
if (nsfb_init(nsfb) == -1) {
fprintf(stderr, "Unable to initialise nsfb surface\n");
nsfb_free(nsfb);
return 4;
}
 
/* get the geometry of the whole screen */
box.x0 = box.y0 = 0;
nsfb_get_geometry(nsfb, &box.x1, &box.y1, NULL);
nsfb_get_buffer(nsfb, &fbptr, &fbstride);
 
radius = (box.x1 / 3);
sides = 5;
counter = 0;
 
for (counter = 0; counter < 20; counter++) {
/* claim the whole screen for update */
nsfb_claim(nsfb, &box);
 
nsfb_plot_clg(nsfb, 0xffffffff);
 
points = malloc(sizeof(nsfb_point_t) * sides);
 
for (loop = 0; loop < sides;loop++) {
points[(2 * loop) % sides].x = (box.x1 / 2) +
(radius * cos(loop * 2 * M_PI / sides));
points[(2 * loop) % sides].y = (box.y1 / 2) +
(radius * sin(loop * 2 * M_PI / sides));
}
 
if (counter % 3 == 0)
colour = 0xffff0000;
else if (counter % 3 == 1)
colour = 0xff00ff00;
else
colour = 0xff0000ff;
 
nsfb_plot_polygon(nsfb, (const int *)points, sides, colour);
free(points);
 
sides += 2;
 
nsfb_update(nsfb, &box);
sleepMilli(400);
}
 
/* wait for quit event or timeout */
while (waitloop > 0) {
if (nsfb_event(nsfb, &event, 1000) == false) {
break;
}
if (event.type == NSFB_EVENT_CONTROL) {
if (event.value.controlcode == NSFB_CONTROL_TIMEOUT) {
/* timeout */
waitloop--;
} else if (event.value.controlcode == NSFB_CONTROL_QUIT) {
break;
}
}
}
 
nsfb_free(nsfb);
 
return 0;
}
 
/*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* End:
*/
/contrib/network/netsurf/libnsfb/test/runtest.sh
0,0 → 1,15
#!/bin/sh
 
TEST_PATH=$1
 
TEST_FRONTEND=linux
 
${TEST_PATH}/test_frontend ${TEST_FRONTEND}
${TEST_PATH}/test_plottest ${TEST_FRONTEND}
${TEST_PATH}/test_bitmap ${TEST_FRONTEND}
${TEST_PATH}/test_bezier ${TEST_FRONTEND}
${TEST_PATH}/test_path ${TEST_FRONTEND}
${TEST_PATH}/test_polygon ${TEST_FRONTEND}
${TEST_PATH}/test_polystar ${TEST_FRONTEND}
${TEST_PATH}/test_polystar2 ${TEST_FRONTEND}
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/contrib/network/netsurf/libnsfb/test/svgtiny.c
0,0 → 1,247
/*
* This file is part of Libsvgtiny
* Licensed under the MIT License,
* http://opensource.org/licenses/mit-license.php
* Copyright 2008 James Bursa <james@semichrome.net>
*/
 
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdbool.h>
#include <stdlib.h>
 
#include <svgtiny.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_event.h"
 
nsfb_t *nsfb;
nsfb_bbox_t screen_box;
uint8_t *fbptr;
int fbstride;
nsfb_event_t event;
 
static int setup_fb(void)
{
nsfb = nsfb_init(NSFB_FRONTEND_SDL);
if (nsfb == NULL) {
fprintf(stderr, "Unable to initialise nsfb with SDL frontend\n");
return 1;
}
 
if (nsfb_init_frontend(nsfb) == -1) {
fprintf(stderr, "Unable to initialise nsfb frontend\n");
return 2;
}
 
/* get the geometry of the whole screen */
screen_box.x0 = screen_box.y0 = 0;
nsfb_get_geometry(nsfb, &screen_box.x1, &screen_box.y1, NULL);
 
nsfb_get_framebuffer(nsfb, &fbptr, &fbstride);
 
/* claim the whole screen for update */
nsfb_claim(nsfb, &screen_box);
 
nsfb_plot_clg(nsfb, 0xffffffff);
 
return 0;
}
 
int main(int argc, char *argv[])
{
FILE *fd;
float scale = 1.0;
struct stat sb;
char *buffer;
size_t size;
size_t n;
struct svgtiny_diagram *diagram;
svgtiny_code code;
 
if (argc != 2 && argc != 3) {
fprintf(stderr, "Usage: %s FILE [SCALE]\n", argv[0]);
return 1;
}
 
/* load file into memory buffer */
fd = fopen(argv[1], "rb");
if (!fd) {
perror(argv[1]);
return 1;
}
 
if (stat(argv[1], &sb)) {
perror(argv[1]);
return 1;
}
size = sb.st_size;
 
buffer = malloc(size);
if (!buffer) {
fprintf(stderr, "Unable to allocate %lld bytes\n",
(long long) size);
return 1;
}
 
n = fread(buffer, 1, size, fd);
if (n != size) {
perror(argv[1]);
return 1;
}
 
fclose(fd);
 
/* read scale argument */
if (argc == 3) {
scale = atof(argv[2]);
if (scale == 0)
scale = 1.0;
}
 
/* create svgtiny object */
diagram = svgtiny_create();
if (!diagram) {
fprintf(stderr, "svgtiny_create failed\n");
return 1;
}
 
/* parse */
code = svgtiny_parse(diagram, buffer, size, argv[1], 1000, 1000);
if (code != svgtiny_OK) {
fprintf(stderr, "svgtiny_parse failed: ");
switch (code) {
case svgtiny_OUT_OF_MEMORY:
fprintf(stderr, "svgtiny_OUT_OF_MEMORY");
break;
case svgtiny_LIBXML_ERROR:
fprintf(stderr, "svgtiny_LIBXML_ERROR");
break;
case svgtiny_NOT_SVG:
fprintf(stderr, "svgtiny_NOT_SVG");
break;
case svgtiny_SVG_ERROR:
fprintf(stderr, "svgtiny_SVG_ERROR: line %i: %s",
diagram->error_line,
diagram->error_message);
break;
default:
fprintf(stderr, "unknown svgtiny_code %i", code);
break;
}
fprintf(stderr, "\n");
}
 
free(buffer);
 
if (setup_fb() != 0)
return 1;
 
for (unsigned int i = 0; i != diagram->shape_count; i++) {
nsfb_plot_pen_t pen;
pen.stroke_colour = svgtiny_RED(diagram->shape[i].stroke) |
svgtiny_GREEN(diagram->shape[i].stroke) << 8|
svgtiny_BLUE(diagram->shape[i].stroke) << 16;
pen.fill_colour = svgtiny_RED(diagram->shape[i].fill) |
svgtiny_GREEN(diagram->shape[i].fill) << 8|
svgtiny_BLUE(diagram->shape[i].fill) << 16;
 
if (diagram->shape[i].fill == svgtiny_TRANSPARENT)
pen.fill_type = NFSB_PLOT_OPTYPE_NONE;
else
pen.fill_type = NFSB_PLOT_OPTYPE_SOLID;
 
if (diagram->shape[i].stroke == svgtiny_TRANSPARENT)
pen.stroke_type = NFSB_PLOT_OPTYPE_NONE;
else
pen.stroke_type = NFSB_PLOT_OPTYPE_SOLID;
 
pen.stroke_width = scale * diagram->shape[i].stroke_width;
 
if (diagram->shape[i].path) {
nsfb_plot_pathop_t *fb_path;
int fb_path_c;
unsigned int j;
fb_path = malloc(diagram->shape[i].path_length * 3 * sizeof(nsfb_plot_pathop_t));
fb_path_c = 0;
 
for (j = 0;
j != diagram->shape[i].path_length; ) {
switch ((int) diagram->shape[i].path[j]) {
case svgtiny_PATH_MOVE:
fb_path[fb_path_c].operation = NFSB_PLOT_PATHOP_MOVE;
fb_path[fb_path_c].point.x = scale * diagram->shape[i].path[j + 1];
fb_path[fb_path_c].point.y = scale * diagram->shape[i].path[j + 2];
fb_path_c++;
j += 3;
break;
 
case svgtiny_PATH_CLOSE:
fb_path[fb_path_c].operation = NFSB_PLOT_PATHOP_LINE;
fb_path[fb_path_c].point.x = fb_path[0].point.x;
fb_path[fb_path_c].point.y = fb_path[0].point.y;
fb_path_c++;
j += 1;
break;
 
case svgtiny_PATH_LINE:
fb_path[fb_path_c].operation = NFSB_PLOT_PATHOP_LINE;
fb_path[fb_path_c].point.x = scale * diagram->shape[i].path[j + 1];
fb_path[fb_path_c].point.y = scale * diagram->shape[i].path[j + 2];
fb_path_c++;
 
j += 3;
break;
 
case svgtiny_PATH_BEZIER:
fb_path[fb_path_c].operation = NFSB_PLOT_PATHOP_MOVE;
fb_path[fb_path_c].point.x = scale * diagram->shape[i].path[j + 1];
fb_path[fb_path_c].point.y = scale * diagram->shape[i].path[j + 2];
fb_path_c++;
fb_path[fb_path_c].operation = NFSB_PLOT_PATHOP_MOVE;
fb_path[fb_path_c].point.x = scale * diagram->shape[i].path[j + 3];
fb_path[fb_path_c].point.y = scale * diagram->shape[i].path[j + 4];
fb_path_c++;
fb_path[fb_path_c].operation = NFSB_PLOT_PATHOP_CUBIC;
fb_path[fb_path_c].point.x = scale * diagram->shape[i].path[j + 5];
fb_path[fb_path_c].point.y = scale * diagram->shape[i].path[j + 6];
fb_path_c++;
 
j += 7;
break;
 
default:
printf("error ");
j += 1;
}
}
 
nsfb_plot_path(nsfb, fb_path_c, fb_path, &pen);
} else if (diagram->shape[i].text) {
/* printf("text %g %g '%s' ",
scale * diagram->shape[i].text_x,
scale * diagram->shape[i].text_y,
diagram->shape[i].text);*/
}
}
 
svgtiny_free(diagram);
 
nsfb_update(nsfb, &screen_box);
while (event.type != NSFB_EVENT_CONTROL)
nsfb_event(nsfb, &event, -1);
 
return 0;
}
 
/*
 
cc -g -std=c99 -D_BSD_SOURCE -I/home/vince/netsurf/libnsfb/include/ -I/home/vince/netsurf/libnsfb/src -I/usr/local/include -I/usr/include/libxml2 -Wall -Wextra -Wundef -Wpointer-arith -Wcast-align -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Werror -pedantic -Wno-overlength-strings -DNDEBUG -O2 -DBUILD_TARGET_Linux -DBUILD_HOST_Linux -o build-Linux-Linux-release-lib-static/test_svgtiny.o -c test/svgtiny.c
 
cc -o build-Linux-Linux-release-lib-static/test_svgtiny build-Linux-Linux-release-lib-static/test_svgtiny.o -Wl,--whole-archive -lnsfb -Wl,--no-whole-archive -lSDL -Lbuild-Linux-Linux-release-lib-static/ -lnsfb -lsvgtiny -lxml2
 
*/
/contrib/network/netsurf/libnsfb/test/text-speed.c
0,0 → 1,112
/* libnsfb plotter test program */
 
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
 
#include "libnsfb.h"
#include "libnsfb_plot.h"
#include "libnsfb_event.h"
 
#define UNUSED(x) ((x) = (x))
 
const struct {
unsigned int w;
unsigned int h;
unsigned char data[16];
} Mglyph1 = {
8, 16,
{
0x00, /* 00000000 */
0x00, /* 00000000 */
0xc6, /* 11000110 */
0xee, /* 11101110 */
0xfe, /* 11111110 */
0xfe, /* 11111110 */
0xd6, /* 11010110 */
0xc6, /* 11000110 */
0xc6, /* 11000110 */
0xc6, /* 11000110 */
0xc6, /* 11000110 */
0xc6, /* 11000110 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
0x00, /* 00000000 */
}
};
 
int main(int argc, char **argv)
{
const char *fename;
enum nsfb_type_e fetype;
nsfb_t *nsfb;
 
nsfb_bbox_t box;
nsfb_bbox_t box3;
uint8_t *fbptr;
int fbstride;
int i;
unsigned int x, y;
 
if (argc < 2) {
fename="sdl";
} else {
fename = argv[1];
}
 
fetype = nsfb_type_from_name(fename);
if (fetype == NSFB_SURFACE_NONE) {
printf("Unable to convert \"%s\" to nsfb surface type\n",
fename);
return EXIT_FAILURE;
}
 
nsfb = nsfb_new(fetype);
if (nsfb == NULL) {
printf("Unable to allocate \"%s\" nsfb surface\n", fename);
return EXIT_FAILURE;
}
 
if (nsfb_init(nsfb) == -1) {
printf("Unable to initialise nsfb surface\n");
nsfb_free(nsfb);
return EXIT_FAILURE;
}
 
/* get the geometry of the whole screen */
box.x0 = box.y0 = 0;
nsfb_get_geometry(nsfb, &box.x1, &box.y1, NULL);
 
nsfb_get_buffer(nsfb, &fbptr, &fbstride);
nsfb_claim(nsfb, &box);
 
/* Clear to white */
nsfb_plot_clg(nsfb, 0xffffffff);
nsfb_update(nsfb, &box);
 
/* test glyph plotting */
for (i = 0; i < 1000; i++) {
for (y = 0; y < box.y1 - Mglyph1.h; y += Mglyph1.h) {
for (x = 0; x < box.x1 - Mglyph1.w; x += Mglyph1.w) {
box3.x0 = x;
box3.y0 = y;
box3.x1 = box3.x0 + Mglyph1.w;
box3.y1 = box3.y0 + Mglyph1.h;
 
nsfb_plot_glyph1(nsfb, &box3, Mglyph1.data,
Mglyph1.w, 0xff000000);
}
}
nsfb_update(nsfb, &box);
}
 
nsfb_update(nsfb, &box);
nsfb_free(nsfb);
 
return 0;
}
/contrib/network/netsurf/libnsfb/usage
0,0 → 1,40
Framebuffer abstraction library
-------------------------------
 
This library provides a generic abstraction to a linear section of
memory which coresponds to a visible array of pixel elements on a
display device. The memory starts at a base location and is logically
split into rows, the length of each row in memory is refered to as the
stride length.
 
The display device may use differing numbers of bits to represent each
pixel, this represented by the bpp value and may be one of 1, 4, 8,
16, 24 or 32. The library assumes packed pixels and does not support
colour depths which do not correspond to the bpp. The 1bpp mode is a
fixed black and white pallette, the 4 and 8 bpp modes use a 16 and 256
entry pallette respectively and the 16, and 24 bpp modes are direct
indexed RGB modes in 565 and 888 format. The 32bpp mode is RGB in 888
format with the top byte unused.
 
The library may be coupled to several display devices. The available
devices are controlled by compile time configuration.
 
Usage
-----
 
The library is initialised by calling nsfb_init() with the frontend
type as a parameter. The nsfb_t pointer returned is used in all calls
to the library. The geometry and physical settings may be altered
using the nsfb_set_geometry() and nsfb_set_physical() functions. The
frontend *must* then be initialised. The nsfb_set_geometry() and
nsfb_set_physical() functions may be called at any time, however they
are likely to fail once the frontend has been initialised.
 
The nsfb_finalise() function should be called to shut the library down
when finished.
 
When directly acessing the framebuffer memory the nsfb_claim() and
nsfb_release() calls should be used. These allow the frontends to
syncronise access and only update the altered regions of the drawing
area. Note the area claimed and released may not neccisarily be the
same.