diff options
Diffstat (limited to 'src/visualizations/Goom')
234 files changed, 77132 insertions, 0 deletions
diff --git a/src/visualizations/Goom/Main.cpp b/src/visualizations/Goom/Main.cpp new file mode 100644 index 0000000000..890e01a687 --- /dev/null +++ b/src/visualizations/Goom/Main.cpp @@ -0,0 +1,309 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + + +/* + +Goom Visualization Interface for XBMC +- Team XBMC + +*/ + +#define __STDC_LIMIT_MACROS + +#include "../../addons/include/xbmc_vis_dll.h" +#include <stdio.h> +#include <stdint.h> +#include <string.h> +#include <string> +extern "C" { +#include "goom.h" +} +#include "goom_config.h" +#include <GL/glew.h> + +extern int preset_index; +char g_visName[512]; +PluginInfo* g_goom = NULL; + +int g_tex_width = GOOM_TEXTURE_WIDTH; +int g_tex_height = GOOM_TEXTURE_HEIGHT; +int g_window_width = 512; +int g_window_height = 512; +int g_window_xpos = 0; +int g_window_ypos = 0; + +GLuint g_texid = 0; +unsigned char* g_goom_buffer = NULL; +short g_audio_data[2][512]; +std::string g_configFile; + +using namespace std; + +//-- Create ------------------------------------------------------------------- +// Called once when the visualisation is created by XBMC. Do any setup here. +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_Create(void* hdl, void* props) +{ + if (!props) + return ADDON_STATUS_UNKNOWN; + + VIS_PROPS* visprops = (VIS_PROPS*)props; + + strcpy(g_visName, visprops->name); + g_configFile = string(visprops->profile) + string("/goom.conf"); + std::string presetsDir = string(visprops->presets) + string("/resources"); + + /** Initialise Goom */ + if (g_goom) + { + goom_close( g_goom ); + g_goom = NULL; + } + + g_goom = goom_init(g_tex_width, g_tex_height); + if (!g_goom) + return ADDON_STATUS_UNKNOWN; + + g_goom_buffer = (unsigned char*)malloc(g_tex_width * g_tex_height * 4); + goom_set_screenbuffer( g_goom, g_goom_buffer ); + memset( g_audio_data, 0, sizeof(g_audio_data) ); + g_window_width = visprops->width; + g_window_height = visprops->height; + g_window_xpos = visprops->x; + g_window_ypos = visprops->y; + + return ADDON_STATUS_OK; +} + +//-- Destroy ------------------------------------------------------------------- +// Do everything before unload of this add-on +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" void ADDON_Destroy() +{ + if ( g_goom ) + { + goom_close( g_goom ); + g_goom = NULL; + } + if ( g_goom_buffer ) + { + free( g_goom_buffer ); + g_goom_buffer = NULL; + } +} + +//-- Start -------------------------------------------------------------------- +// Called when a new soundtrack is played +//----------------------------------------------------------------------------- +extern "C" void Start(int iChannels, int iSamplesPerSec, int iBitsPerSample, const char* szSongName) +{ + if ( g_goom ) + { + goom_update( g_goom, g_audio_data, 0, 0, (char*)szSongName, (char*)"XBMC" ); + } +} + +//-- Stop --------------------------------------------------------------------- +// Called when the visualisation is closed by XBMC +//----------------------------------------------------------------------------- +extern "C" void ADDON_Stop() +{ + if (g_texid) + { + glDeleteTextures( 1, &g_texid ); + g_texid = 0; + } +} + +//-- Audiodata ---------------------------------------------------------------- +// Called by XBMC to pass new audio data to the vis +//----------------------------------------------------------------------------- +extern "C" void AudioData(const float* pAudioData, int iAudioDataLength, float *pFreqData, int iFreqDataLength) +{ + int copysize = iAudioDataLength < (int)sizeof( g_audio_data ) >> 1 ? iAudioDataLength : (int)sizeof( g_audio_data ) >> 1; + int ipos, i; + for(ipos = 0, i = 0; i < copysize; i += 2, ++ipos) + { + g_audio_data[0][ipos] = (int)(pAudioData[i ] * (INT16_MAX+.5f)); + g_audio_data[1][ipos] = (int)(pAudioData[i+1] * (INT16_MAX+.5f)); + } +} + + +//-- Render ------------------------------------------------------------------- +// Called once per frame. Do all rendering here. +//----------------------------------------------------------------------------- +extern "C" void Render() +{ + if ( g_goom ) + { + goom_set_screenbuffer( g_goom, g_goom_buffer ); + if (!g_texid) + { + // initialize the texture we'll be using + glGenTextures( 1, &g_texid ); + if (!g_texid) + return; + goom_update( g_goom, g_audio_data, 0, 0, NULL, (char*)"XBMC" ); + glEnable(GL_TEXTURE_2D); + glBindTexture( GL_TEXTURE_2D, g_texid ); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexImage2D( GL_TEXTURE_2D, 0, 4, g_tex_width, g_tex_height, 0, + GL_RGBA, GL_UNSIGNED_BYTE, g_goom_buffer ); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + } + else + { + // update goom frame and copy to our texture + goom_update( g_goom, g_audio_data, 0, 0, NULL, (char*)"XBMC" ); + glEnable(GL_TEXTURE_2D); + glBindTexture( GL_TEXTURE_2D, g_texid ); + glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, g_tex_width, g_tex_height, + GL_RGBA, GL_UNSIGNED_BYTE, g_goom_buffer ); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + } + + glDisable(GL_BLEND); + glBegin( GL_QUADS ); + { + glColor3f( 1.0, 1.0, 1.0 ); + glTexCoord2f( 0.0, 0.0 ); + glVertex2f( g_window_xpos, g_window_ypos ); + + glTexCoord2f( 0.0, 1.0 ); + glVertex2f( g_window_xpos, g_window_ypos + g_window_height ); + + glTexCoord2f( 1.0, 1.0 ); + glVertex2f( g_window_xpos + g_window_width, g_window_ypos + g_window_height ); + + glTexCoord2f( 1.0, 0.0 ); + glVertex2f( g_window_xpos + g_window_width, g_window_ypos ); + } + glEnd(); + glDisable( GL_TEXTURE_2D ); + glEnable(GL_BLEND); + } +} + +//-- GetInfo ------------------------------------------------------------------ +// Tell XBMC our requirements +//----------------------------------------------------------------------------- +extern "C" void GetInfo(VIS_INFO* pInfo) +{ + pInfo->bWantsFreq = false; + pInfo->iSyncDelay = 0; +} + +//-- OnAction ----------------------------------------------------------------- +// Handle XBMC actions such as next preset, lock preset, album art changed etc +//----------------------------------------------------------------------------- +extern "C" bool OnAction(long flags, const void *param) +{ + bool ret = false; + return ret; +} + +//-- GetPresets --------------------------------------------------------------- +// Return a list of presets to XBMC for display +//----------------------------------------------------------------------------- +extern "C" unsigned int GetPresets(char ***presets) +{ + return 0; +} + +//-- GetPreset ---------------------------------------------------------------- +// Return the index of the current playing preset +//----------------------------------------------------------------------------- +extern "C" unsigned GetPreset() +{ + return 0; +} + +//-- IsLocked ----------------------------------------------------------------- +// Returns true if this add-on use settings +//----------------------------------------------------------------------------- +extern "C" bool IsLocked() +{ + return false; +} + +//-- GetSubModules ------------------------------------------------------------ +// Return any sub modules supported by this vis +//----------------------------------------------------------------------------- +extern "C" unsigned int GetSubModules(char ***names) +{ + return 0; // this vis supports 0 sub modules +} + +//-- HasSettings -------------------------------------------------------------- +// Returns true if this add-on use settings +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" bool ADDON_HasSettings() +{ + return false; +} + +//-- GetStatus --------------------------------------------------------------- +// Returns the current Status of this visualisation +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_GetStatus() +{ + return ADDON_STATUS_OK; +} + +//-- GetSettings -------------------------------------------------------------- +// Return the settings for XBMC to display +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet) +{ + return 0; +} + +//-- FreeSettings -------------------------------------------------------------- +// Free the settings struct passed from XBMC +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- + +extern "C" void ADDON_FreeSettings() +{ +} + +//-- SetSetting --------------------------------------------------------------- +// Set a specific Setting value (called from XBMC) +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" ADDON_STATUS ADDON_SetSetting(const char *strSetting, const void* value) +{ + return ADDON_STATUS_OK; +} + +//-- Announce ----------------------------------------------------------------- +// Receive announcements from XBMC +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +extern "C" void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} diff --git a/src/visualizations/Goom/Makefile.in b/src/visualizations/Goom/Makefile.in new file mode 100644 index 0000000000..a172e670b0 --- /dev/null +++ b/src/visualizations/Goom/Makefile.in @@ -0,0 +1,26 @@ +ARCH=@ARCH@ +INCLUDES=-I. -I.. -I../../linux -I../../ -Igoom2k4-0/src +OBJS=Main.o +SLIB=visualization.goom/Goom.vis +DEFINES+=-DHAS_SDL_OPENGL -DHAS_SDL +CXXFLAGS=-fPIC +DIRS=goom2k4-0 +DISTCLEAN_FILES=../../../addons/visualization.goom + +$(SLIB): $(OBJS) goom2k4-0/src/.libs/libgoom2.a +ifeq ($(findstring osx,$(ARCH)), osx) + $(CXX) $(CXXFLAGS) $(LDFLAGS) -Wl,-alias_list,@abs_top_srcdir@/src/cores/DllLoader/exports/wrapper_mach_alias \ + -bundle -undefined suppress -read_only_relocs suppress -o $(SLIB) \ + @abs_top_srcdir@/src/cores/DllLoader/exports/wrapper.o goom2k4-0/src/.libs/libgoom2.a $(OBJS) +else + $(CXX) $(LDFLAGS) -fPIC goom2k4-0/src/*.o -shared $(CXXFLAGS) -o $(SLIB) $(OBJS) \ + `cat ../../cores/DllLoader/exports/wrapper.def` \ + ../../cores/DllLoader/exports/wrapper.o +endif + @find visualization.goom -regextype posix-extended -type f -not -iregex ".*svn.*|.*\.so|.*\.dll|.*\.pyd|.*\.pvr|.*python/.*\.zlib|.*\.vis" -exec install -D -m 0644 "{}" ../../../addons/"{}" \; -printf " -- %-75.75f\r" + @find visualization.goom -type f -not -iregex ".*svn.*|.*win32(dx)?\.vis\.vis" -iregex ".*\.vis" -exec install -D "{}" ../../../addons/"{}" \; -printf " -- %-75.75f\r" + +goom2k4-0/src/.libs/libgoom2.a: + $(MAKE) -C goom2k4-0 + +include ../../../Makefile.include diff --git a/src/visualizations/Goom/build_xbmc_win32.sh b/src/visualizations/Goom/build_xbmc_win32.sh new file mode 100644 index 0000000000..1e586689dc --- /dev/null +++ b/src/visualizations/Goom/build_xbmc_win32.sh @@ -0,0 +1,36 @@ + +GOOM_SRC=" +goom2k4-0/src/config_param.c \ +goom2k4-0/src/convolve_fx.c \ +goom2k4-0/src/cpu_info.c \ +goom2k4-0/src/drawmethods.c \ +goom2k4-0/src/filters.c \ +goom2k4-0/src/flying_stars_fx.c \ +goom2k4-0/src/gfontlib.c \ +goom2k4-0/src/gfontrle.c \ +goom2k4-0/src/goom_core.c \ +goom2k4-0/src/goom_tools.c \ +goom2k4-0/src/goomsl.c \ +goom2k4-0/src/goomsl_hash.c \ +goom2k4-0/src/goomsl_heap.c \ +goom2k4-0/src/goomsl_lex.c \ +goom2k4-0/src/goomsl_yacc.c \ +goom2k4-0/src/graphic.c \ +goom2k4-0/src/ifs.c \ +goom2k4-0/src/jitc_test.c \ +goom2k4-0/src/jitc_x86.c \ +goom2k4-0/src/lines.c \ +goom2k4-0/src/mathtools.c \ +goom2k4-0/src/mmx.c \ +goom2k4-0/src/plugin_info.c \ +goom2k4-0/src/sound_tester.c \ +goom2k4-0/src/surf3d.c \ +goom2k4-0/src/tentacle3d.c \ +goom2k4-0/src/v3d.c \ +goom2k4-0/src/xmmx.c \ +" + +gcc -c -O3 -g -D_WIN32PC -DHAS_SDL_OPENGL -DHAVE_MMX -D_MINGW -Igoom2k4-0/src/ -I../../../lib/libSDL-WIN32/include/ -I../../../visualisations/ ${GOOM_SRC} Main.cpp + +gcc -g -s -shared -o ../../../visualisations/goom_win32.vis *.o -lopengl32 -lstdc++ +rm *.o diff --git a/src/visualizations/Goom/goom.patch b/src/visualizations/Goom/goom.patch new file mode 100644 index 0000000000..78a07d11c2 --- /dev/null +++ b/src/visualizations/Goom/goom.patch @@ -0,0 +1,26454 @@ +diff -Naur /home/d4rk/goom2k4-0/src/config_param.c /src/config_param.c +--- /home/d4rk/goom2k4-0/src/config_param.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/config_param.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,110 +0,0 @@ +-/*---------------------------------------------------------------------------*/ +-/* +-** config_param.c +-** Goom Project +-** +-** Created by Jean-Christophe Hoelt on Sat Jul 19 2003 +-** Copyright (c) 2003 iOS. All rights reserved. +-*/ +-/*---------------------------------------------------------------------------*/ +- +-#include "goom_config_param.h" +-#include <string.h> +- +-/* TODO: Ajouter goom_ devant ces fonctions */ +- +-static void empty_fct(PluginParam *dummy) { +-} +- +-PluginParam goom_secure_param() { +- PluginParam p; +- p.changed = empty_fct; +- p.change_listener = empty_fct; +- p.user_data = 0; +- p.name = p.desc = 0; +- p.rw = 1; +- return p; +-} +- +-PluginParam goom_secure_f_param(char *name) { +- PluginParam p = secure_param(); +- p.name = name; +- p.type = PARAM_FLOATVAL; +- FVAL(p) = 0.5f; +- FMIN(p) = 0.0f; +- FMAX(p) = 1.0f; +- FSTEP(p) = 0.01f; +- return p; +-} +- +-PluginParam goom_secure_f_feedback(char *name) { +- PluginParam p = secure_f_param(name); +- p.rw = 0; +- return p; +-} +- +-PluginParam goom_secure_s_param(char *name) { +- PluginParam p = secure_param(); +- p.name = name; +- p.type = PARAM_STRVAL; +- SVAL(p) = 0; +- return p; +-} +- +-PluginParam goom_secure_b_param(char *name, int value) { +- PluginParam p = secure_param(); +- p.name = name; +- p.type = PARAM_BOOLVAL; +- BVAL(p) = value; +- return p; +-} +- +-PluginParam goom_secure_i_param(char *name) { +- PluginParam p = secure_param(); +- p.name = name; +- p.type = PARAM_INTVAL; +- IVAL(p) = 50; +- IMIN(p) = 0; +- IMAX(p) = 100; +- ISTEP(p) = 1; +- return p; +-} +- +-PluginParam goom_secure_i_feedback(char *name) { +- PluginParam p = secure_i_param(name); +- p.rw = 0; +- return p; +-} +- +-PluginParameters goom_plugin_parameters(const char *name, int nb) { +- PluginParameters p; +- p.name = (char *)name; +- p.desc = ""; +- p.nbParams = nb; +- p.params = (PluginParam**)malloc(nb*sizeof(PluginParam*)); +- return p; +-} +- +-/*---------------------------------------------------------------------------*/ +- +-void goom_set_str_param_value(PluginParam *p, const char *str) { +- int len = strlen(str); +- if (SVAL(*p)) +- SVAL(*p) = (char*)realloc(SVAL(*p), len+1); +- else +- SVAL(*p) = (char*)malloc(len+1); +- memcpy(SVAL(*p), str, len+1); +-} +- +-void goom_set_list_param_value(PluginParam *p, const char *str) { +- int len = strlen(str); +-#ifdef VERBOSE +- printf("%s: %d\n", str, len); +-#endif +- if (LVAL(*p)) +- LVAL(*p) = (char*)realloc(LVAL(*p), len+1); +- else +- LVAL(*p) = (char*)malloc(len+1); +- memcpy(LVAL(*p), str, len+1); +-} +- +diff -Naur /home/d4rk/goom2k4-0/src/convolve_fx.c /src/convolve_fx.c +--- /home/d4rk/goom2k4-0/src/convolve_fx.c 2005-02-07 06:46:42.000000000 -0700 ++++ /src/convolve_fx.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,335 +0,0 @@ +-#include "goom_fx.h" +-#include "goom_plugin_info.h" +-#include "goomsl.h" +-#include "goom_config.h" +-#include <math.h> +-#include <stdio.h> +-#include <stdlib.h> +-#include <string.h> +- +-//#define CONV_MOTIF_W 32 +-//#define CONV_MOTIF_WMASK 0x1f +- +-#define CONV_MOTIF_W 128 +-#define CONV_MOTIF_WMASK 0x7f +- +-typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W]; +- +-#include "motif_goom1.h" +-#include "motif_goom2.h" +- +-#define NB_THETA 512 +- +-#define MAX 2.0f +- +-typedef struct _CONV_DATA{ +- PluginParam light; +- PluginParam factor_adj_p; +- PluginParam factor_p; +- PluginParameters params; +- +- GoomSL *script; +- +- /* rotozoom */ +- int theta; +- float ftheta; +- int h_sin[NB_THETA]; +- int h_cos[NB_THETA]; +- int h_height; +- float visibility; +- Motif conv_motif; +- int inverse_motif; +- +-} ConvData; +- +-/* init rotozoom tables */ +-static void compute_tables(VisualFX *_this, PluginInfo *info) +-{ +- ConvData *data = (ConvData*)_this->fx_data; +- double screen_coef; +- int i; +- double h; +- double radian; +- +- if (data->h_height == info->screen.height) return; +- +- screen_coef = 2.0 * 300.0 / (double)info->screen.height; +- data->h_height = info->screen.height; +- +- for ( i=0 ; i<NB_THETA ; i++ ) { +- radian = 2*i*M_PI/NB_THETA; +- h = (0.2 + cos (radian) / 15.0 * sin(radian * 2.0 + 12.123)) * screen_coef; +- data->h_cos[i] = 0x10000 * (-h * cos (radian) * cos(radian)); +- data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin(radian)); +- } +-} +- +-static void set_motif(ConvData *data, Motif motif) +-{ +- int i,j; +- for (i=0;i<CONV_MOTIF_W;++i) for (j=0;j<CONV_MOTIF_W;++j) +- data->conv_motif[i][j] = motif[CONV_MOTIF_W-i-1][CONV_MOTIF_W-j-1]; +-} +- +-static void convolve_init(VisualFX *_this, PluginInfo *info) { +- ConvData *data; +- data = (ConvData*)malloc(sizeof(ConvData)); +- _this->fx_data = (void*)data; +- +- data->light = secure_f_param("Screen Brightness"); +- data->light.param.fval.max = 300.0f; +- data->light.param.fval.step = 1.0f; +- data->light.param.fval.value = 100.0f; +- +- data->factor_adj_p = secure_f_param("Flash Intensity"); +- data->factor_adj_p.param.fval.max = 200.0f; +- data->factor_adj_p.param.fval.step = 1.0f; +- data->factor_adj_p.param.fval.value = 70.0f; +- +- data->factor_p = secure_f_feedback("Factor"); +- +- data->params = plugin_parameters ("Bright Flash", 5); +- data->params.params[0] = &data->light; +- data->params.params[1] = &data->factor_adj_p; +- data->params.params[2] = 0; +- data->params.params[3] = &data->factor_p; +- data->params.params[4] = 0; +- +- /* init rotozoom tables */ +- compute_tables(_this, info); +- data->theta = 0; +- data->ftheta = 0.0; +- data->visibility = 1.0; +- set_motif(data, CONV_MOTIF2); +- data->inverse_motif = 0; +- +- _this->params = &data->params; +-} +- +-static void convolve_free(VisualFX *_this) { +- free (_this->fx_data); +-} +- +-static void create_output_with_brightness(VisualFX *_this, Pixel *src, Pixel *dest, +- PluginInfo *info, int iff) +-{ +- ConvData *data = (ConvData*)_this->fx_data; +- +- int x,y; +- int i = 0;//info->screen.height * info->screen.width - 1; +- +- const int c = data->h_cos [data->theta]; +- const int s = data->h_sin [data->theta]; +- +- const int xi = -(info->screen.width/2) * c; +- const int yi = (info->screen.width/2) * s; +- +- const int xj = -(info->screen.height/2) * s; +- const int yj = -(info->screen.height/2) * c; +- +- int xprime = xj; +- int yprime = yj; +- +- int ifftab[16]; +- if (data->inverse_motif) { +- int i; +- for (i=0;i<16;++i) +- ifftab[i] = (double)iff * (1.0 + data->visibility * (15.0 - i) / 15.0); +- } +- else { +- int i; +- for (i=0;i<16;++i) +- ifftab[i] = (double)iff / (1.0 + data->visibility * (15.0 - i) / 15.0); +- } +- +- for (y=info->screen.height;y--;) { +- int xtex,ytex; +- +- xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2; +- xprime += s; +- +- ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2; +- yprime += c; +- +-#ifdef HAVE_MMX +- __asm__ __volatile__ +- ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ +- "\n\t movd %[xtex], %%mm2" +- "\n\t movd %[ytex], %%mm3" +- "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */ +- "\n\t movd %[c], %%mm4" +- "\n\t movd %[s], %%mm6" +- "\n\t pxor %%mm5, %%mm5" +- "\n\t psubd %%mm6, %%mm5" +- "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */ +- "\n\t movd %[motif], %%mm6" /* mm6 = motif */ +- +- ::[xtex]"g"(xtex) ,[ytex]"g"(ytex) +- , [c]"g"(c), [s]"g"(s) +- , [motif] "g"(&data->conv_motif[0][0])); +- +- for (x=info->screen.width;x--;) +- { +- __asm__ __volatile__ +- ( +- "\n\t movd %[src], %%mm0" /* mm0 = src */ +- "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */ +- "\n\t movd %%esi, %%mm5" /* save esi into mm5 */ +- "\n\t movq %%mm2, %%mm3" +- "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */ +- "\n\t movd %%mm3, %%eax" /* eax = xtex' */ +- +- "\n\t psrlq $25, %%mm3" +- "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */ +- +- "\n\t andl $127, %%eax" +- "\n\t andl $16256, %%ecx" +- +- "\n\t addl %%ecx, %%eax" +- "\n\t movd %%mm6, %%esi" /* esi = motif */ +- "\n\t xorl %%ecx, %%ecx" +- "\n\t movb (%%eax,%%esi), %%cl" +- +- "\n\t movl %[ifftab], %%eax" +- "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */ +- "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */ +- +- "\n\t punpcklwd %%mm1, %%mm1" +- "\n\t punpcklbw %%mm7, %%mm0" +- "\n\t punpckldq %%mm1, %%mm1" +- "\n\t psrlw $1, %%mm0" +- "\n\t psrlw $2, %%mm1" +- "\n\t pmullw %%mm1, %%mm0" +- "\n\t psrlw $5, %%mm0" +- "\n\t packuswb %%mm7, %%mm0" +- "\n\t movd %%mm0, %[dest]" +- : [dest] "=g" (dest[i].val) +- : [src] "g" (src[i].val) +- , [ifftab]"g"(&ifftab[0]) +- : "eax","ecx"); +- +- i++; +- } +-#else +- for (x=info->screen.width;x--;) { +- +- int iff2; +- unsigned int f0,f1,f2,f3; +- +- xtex += c; +- ytex -= s; +- +- iff2 = ifftab[data->conv_motif[(ytex >>16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]]; +- +-#define sat(a) ((a)>0xFF?0xFF:(a)) +- f0 = src[i].val; +- f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8; +- f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8; +- f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8; +- dest[i].val = (sat(f1) << R_OFFSET) | (sat(f2) << G_OFFSET) | (sat(f3) << B_OFFSET); +-/* +- f0 = (src[i].cop[0] * iff2) >> 8; +- f1 = (src[i].cop[1] * iff2) >> 8; +- f2 = (src[i].cop[2] * iff2) >> 8; +- f3 = (src[i].cop[3] * iff2) >> 8; +- +- dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0; +- dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1; +- dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2; +- dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3; +-*/ +- i++; +- } +-#endif +- } +-#ifdef HAVE_MMX +- __asm__ __volatile__ ("\n\t emms"); +-#endif +- +- compute_tables(_this, info); +-} +- +- +-/*#include <stdint.h> +- +-static uint64_t GetTick() +-{ +- uint64_t x; +- asm volatile ("RDTSC" : "=A" (x)); +- return x; +-}*/ +- +- +-static void convolve_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) { +- +- ConvData *data = (ConvData*)_this->fx_data; +- float ff; +- int iff; +- +- ff = (FVAL(data->factor_p) * FVAL(data->factor_adj_p) + FVAL(data->light) ) / 100.0f; +- iff = (unsigned int)(ff * 256); +- +- { +- double fcycle = (double)info->cycle; +- double rotate_param, rotate_coef; +- float INCREASE_RATE = 1.5; +- float DECAY_RATE = 0.955; +- if (FVAL(info->sound.last_goom_p) > 0.8) +- FVAL(data->factor_p) += FVAL(info->sound.goom_power_p) * INCREASE_RATE; +- FVAL(data->factor_p) *= DECAY_RATE; +- +- rotate_param = FVAL(info->sound.last_goom_p); +- if (rotate_param < 0.0) +- rotate_param = 0.0; +- rotate_param += FVAL(info->sound.goom_power_p); +- +- rotate_coef = 4.0 + FVAL(info->sound.goom_power_p) * 6.0; +- data->ftheta = (data->ftheta + rotate_coef * sin(rotate_param * 6.3)); +- data->theta = ((unsigned int)data->ftheta) % NB_THETA; +- data->visibility = (cos(fcycle * 0.001 + 1.5) * sin(fcycle * 0.008) + cos(fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5; +- if (data->visibility < 0.0) data->visibility = 0.0; +- data->factor_p.change_listener(&data->factor_p); +- } +- +- if (data->visibility < 0.01) { +- switch (goom_irand(info->gRandom, 300)) +- { +- case 1: +- set_motif(data, CONV_MOTIF1); data->inverse_motif = 1; break; +- case 2: +- set_motif(data, CONV_MOTIF2); data->inverse_motif = 0; break; +- } +- } +- +- if ((ff > 0.98f) && (ff < 1.02f)) +- memcpy(dest, src, info->screen.size * sizeof(Pixel)); +- else +- create_output_with_brightness(_this,src,dest,info,iff); +-/* +-// Benching suite... +- { +- uint64_t before, after; +- double timed; +- static double stimed = 10000.0; +- before = GetTick(); +- data->visibility = 1.0; +- create_output_with_brightness(_this,src,dest,info,iff); +- after = GetTick(); +- timed = (double)((after-before) / info->screen.size); +- if (timed < stimed) { +- stimed = timed; +- printf ("CLK = %3.0f CPP\n", stimed); +- } +- } +-*/ +-} +- +-VisualFX convolve_create(void) { +- VisualFX vfx = { +- init: convolve_init, +- free: convolve_free, +- apply: convolve_apply, +- fx_data: 0 +- }; +- return vfx; +-} +diff -Naur /home/d4rk/goom2k4-0/src/convolve_fx.c.jc /src/convolve_fx.c.jc +--- /home/d4rk/goom2k4-0/src/convolve_fx.c.jc 2005-02-07 06:46:42.000000000 -0700 ++++ /src/convolve_fx.c.jc 1969-12-31 17:00:00.000000000 -0700 +@@ -1,333 +0,0 @@ +-#include "goom_fx.h" +-#include "goom_plugin_info.h" +-#include "goomsl.h" +-#include "goom_config.h" +-#include <math.h> +-#include <stdio.h> +-#include <stdlib.h> +-#include <string.h> +- +-//#define CONV_MOTIF_W 32 +-//#define CONV_MOTIF_WMASK 0x1f +- +-#define CONV_MOTIF_W 128 +-#define CONV_MOTIF_WMASK 0x7f +- +-typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W]; +- +-#include "motif_goom1.h" +-#include "motif_goom2.h" +- +-#define NB_THETA 512 +- +-#define MAX 2.0f +- +-typedef struct _CONV_DATA{ +- PluginParam light; +- PluginParam factor_adj_p; +- PluginParam factor_p; +- PluginParameters params; +- +- GoomSL *script; +- +- /* rotozoom */ +- int theta; +- float ftheta; +- int h_sin[NB_THETA]; +- int h_cos[NB_THETA]; +- int h_height; +- float visibility; +- Motif conv_motif; +- int inverse_motif; +- +-} ConvData; +- +-/* init rotozoom tables */ +-static void compute_tables(VisualFX *_this, PluginInfo *info) +-{ +- ConvData *data = (ConvData*)_this->fx_data; +- double screen_coef; +- int i; +- double h; +- double radian; +- +- if (data->h_height == info->screen.height) return; +- +- screen_coef = 2.0 * 300.0 / (double)info->screen.height; +- data->h_height = info->screen.height; +- +- for ( i=0 ; i<NB_THETA ; i++ ) { +- radian = 2*i*M_PI/NB_THETA; +- h = (0.2 + cos (radian) / 15.0 * sin(radian * 2.0 + 12.123)) * screen_coef; +- data->h_cos[i] = 0x10000 * (-h * cos (radian) * cos(radian)); +- data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin(radian)); +- } +-} +- +-static void set_motif(ConvData *data, Motif motif) +-{ +- int i,j; +- for (i=0;i<CONV_MOTIF_W;++i) for (j=0;j<CONV_MOTIF_W;++j) +- data->conv_motif[i][j] = motif[CONV_MOTIF_W-i-1][CONV_MOTIF_W-j-1]; +-} +- +-static void convolve_init(VisualFX *_this, PluginInfo *info) { +- ConvData *data; +- data = (ConvData*)malloc(sizeof(ConvData)); +- _this->fx_data = (void*)data; +- +- data->light = secure_f_param("Screen Brightness"); +- data->light.param.fval.max = 300.0f; +- data->light.param.fval.step = 1.0f; +- data->light.param.fval.value = 100.0f; +- +- data->factor_adj_p = secure_f_param("Flash Intensity"); +- data->factor_adj_p.param.fval.max = 200.0f; +- data->factor_adj_p.param.fval.step = 1.0f; +- data->factor_adj_p.param.fval.value = 70.0f; +- +- data->factor_p = secure_f_feedback("Factor"); +- +- data->params = plugin_parameters ("Bright Flash", 5); +- data->params.params[0] = &data->light; +- data->params.params[1] = &data->factor_adj_p; +- data->params.params[2] = 0; +- data->params.params[3] = &data->factor_p; +- data->params.params[4] = 0; +- +- /* init rotozoom tables */ +- compute_tables(_this, info); +- data->theta = 0; +- data->ftheta = 0.0; +- data->visibility = 1.0; +- set_motif(data, CONV_MOTIF2); +- data->inverse_motif = 0; +- +- _this->params = &data->params; +-} +- +-static void convolve_free(VisualFX *_this) { +- free (_this->fx_data); +-} +- +-static void create_output_with_brightness(VisualFX *_this, Pixel *src, Pixel *dest, +- PluginInfo *info, int iff) +-{ +- ConvData *data = (ConvData*)_this->fx_data; +- +- int x,y; +- int i = 0;//info->screen.height * info->screen.width - 1; +- +- const int c = data->h_cos [data->theta]; +- const int s = data->h_sin [data->theta]; +- +- const int xi = -(info->screen.width/2) * c; +- const int yi = (info->screen.width/2) * s; +- +- const int xj = -(info->screen.height/2) * s; +- const int yj = -(info->screen.height/2) * c; +- +- int xprime = xj; +- int yprime = yj; +- +- int ifftab[16]; +- if (data->inverse_motif) { +- int i; +- for (i=0;i<16;++i) +- ifftab[i] = (double)iff * (1.0 + data->visibility * (15.0 - i) / 15.0); +- } +- else { +- int i; +- for (i=0;i<16;++i) +- ifftab[i] = (double)iff / (1.0 + data->visibility * (15.0 - i) / 15.0); +- } +- +- for (y=info->screen.height;y--;) { +- int xtex,ytex; +- +- xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2; +- xprime += s; +- +- ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2; +- yprime += c; +- +-#ifdef HAVE_MMX +- __asm__ __volatile__ +- ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ +- "\n\t movd %[xtex], %%mm2" +- "\n\t movd %[ytex], %%mm3" +- "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */ +- "\n\t movd %[c], %%mm4" +- "\n\t movd %[s], %%mm6" +- "\n\t pxor %%mm5, %%mm5" +- "\n\t psubd %%mm6, %%mm5" +- "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */ +- "\n\t movd %[motif], %%mm6" /* mm6 = motif */ +- +- ::[xtex]"g"(xtex) ,[ytex]"g"(ytex) +- , [c]"g"(c), [s]"g"(s) +- , [motif] "g"(&data->conv_motif[0][0])); +- +- for (x=info->screen.width;x--;) +- { +- __asm__ __volatile__ +- ( +- "\n\t movd %[src], %%mm0" /* mm0 = src */ +- "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */ +- "\n\t movd %%esi, %%mm5" /* save esi into mm5 */ +- "\n\t movq %%mm2, %%mm3" +- "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */ +- "\n\t movd %%mm3, %%eax" /* eax = xtex' */ +- +- "\n\t psrlq $25, %%mm3" +- "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */ +- +- "\n\t andl $127, %%eax" +- "\n\t andl $16256, %%ecx" +- +- "\n\t addl %%ecx, %%eax" +- "\n\t movd %%mm6, %%esi" /* esi = motif */ +- "\n\t xorl %%ecx, %%ecx" +- "\n\t movb (%%eax,%%esi), %%cl" +- +- "\n\t movl %[ifftab], %%eax" +- "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */ +- "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */ +- +- "\n\t punpcklwd %%mm1, %%mm1" +- "\n\t punpcklbw %%mm7, %%mm0" +- "\n\t punpckldq %%mm1, %%mm1" +- "\n\t psrlw $1, %%mm0" +- "\n\t psrlw $1, %%mm1" +- "\n\t pmullw %%mm1, %%mm0" +- "\n\t psrlw $6, %%mm0" +- "\n\t packuswb %%mm7, %%mm0" +- "\n\t movd %%mm0, %[dest]" +- : [dest] "=g" (dest[i].val) +- : [src] "g" (src[i].val) +- , [ifftab]"g"(&ifftab[0]) +- : "eax","ecx"); +- +- i++; +- } +-#else +- for (x=info->screen.width;x--;) { +- +- int iff2; +- unsigned int f0,f1,f2,f3; +- +- xtex += c; +- ytex -= s; +- +- iff2 = ifftab[data->conv_motif[(ytex >>16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]]; +- +-#define sat(a) ((a)>0xFF?0xFF:(a)) +- f0 = src[i].val; +- f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8; +- f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8; +- f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8; +- dest[i].val = (sat(f1) << R_OFFSET) | (sat(f2) << G_OFFSET) | (sat(f3) << B_OFFSET); +-/* +- f0 = (src[i].cop[0] * iff2) >> 8; +- f1 = (src[i].cop[1] * iff2) >> 8; +- f2 = (src[i].cop[2] * iff2) >> 8; +- f3 = (src[i].cop[3] * iff2) >> 8; +- +- dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0; +- dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1; +- dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2; +- dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3; +-*/ +- i++; +- } +-#endif +- } +- __asm__ __volatile__ ("\n\t emms"); +- +- compute_tables(_this, info); +-} +- +-/* +-#include <stdint.h> +- +-static uint64_t GetTick() +-{ +- uint64_t x; +- asm volatile ("RDTSC" : "=A" (x)); +- return x; +-} +-*/ +- +-static void convolve_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) { +- +- ConvData *data = (ConvData*)_this->fx_data; +- float ff; +- int iff; +- +- ff = (FVAL(data->factor_p) * FVAL(data->factor_adj_p) + FVAL(data->light) ) / 100.0f; +- iff = (unsigned int)(ff * 256); +- +- { +- double fcycle = (double)info->cycle; +- double rotate_param, rotate_coef; +- float INCREASE_RATE = 1.5; +- float DECAY_RATE = 0.955; +- if (FVAL(info->sound.last_goom_p) > 0.8) +- FVAL(data->factor_p) += FVAL(info->sound.goom_power_p) * INCREASE_RATE; +- FVAL(data->factor_p) *= DECAY_RATE; +- +- rotate_param = FVAL(info->sound.last_goom_p); +- if (rotate_param < 0.0) +- rotate_param = 0.0; +- rotate_param += FVAL(info->sound.goom_power_p); +- +- rotate_coef = 4.0 + FVAL(info->sound.goom_power_p) * 6.0; +- data->ftheta = (data->ftheta + rotate_coef * sin(rotate_param * 6.3)); +- data->theta = ((unsigned int)data->ftheta) % NB_THETA; +- data->visibility = (cos(fcycle * 0.001 + 1.5) * sin(fcycle * 0.008) + cos(fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5; +- if (data->visibility < 0.0) data->visibility = 0.0; +- data->factor_p.change_listener(&data->factor_p); +- } +- +- if (data->visibility < 0.01) { +- switch (goom_irand(info->gRandom, 300)) +- { +- case 1: +- set_motif(data, CONV_MOTIF1); data->inverse_motif = 1; break; +- case 2: +- set_motif(data, CONV_MOTIF2); data->inverse_motif = 0; break; +- } +- } +- +- if ((ff > 0.96f) && (ff < 1.04f)) +- memcpy(dest, src, info->screen.size * sizeof(Pixel)); +- else +- create_output_with_brightness(_this,src,dest,info,iff); +-/* +- Benching suite... +- { +- uint64_t before, after; +- double timed; +- static double stimed = 10000.0; +- before = GetTick(); +- data->visibility = 1.0; +- create_output_with_brightness(_this,src,dest,info,iff); +- after = GetTick(); +- timed = (double)((after-before) / info->screen.size); +- if (timed < stimed) { +- stimed = timed; +- printf ("CLK = %3.0f CPP\n", stimed); +- } +- } +-*/ +-} +- +-VisualFX convolve_create(void) { +- VisualFX vfx = { +- init: convolve_init, +- free: convolve_free, +- apply: convolve_apply, +- fx_data: 0 +- }; +- return vfx; +-} +diff -Naur /home/d4rk/goom2k4-0/src/cpu_info.c /src/cpu_info.c +--- /home/d4rk/goom2k4-0/src/cpu_info.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/cpu_info.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,71 +0,0 @@ +-/* +- * cpu_info.c +- * Goom +- * +- * Created by Guillaume Borios on Sun Dec 28 2003. +- * Copyright (c) 2003 iOS. All rights reserved. +- * +- */ +- +-#include "cpu_info.h" +- +-#ifdef CPU_X86 +-#include "mmx.h" +-#endif +- +-#ifdef CPU_POWERPC +-#include <sys/types.h> +-#include <stdlib.h> +-#endif +- +-static unsigned int CPU_FLAVOUR = 0; +-static unsigned int CPU_NUMBER = 1; +-static unsigned int CPU_DETECTED = 0; +- +-static void autoset_cpu_info (void) +-{ +- CPU_DETECTED = 1; +- +-#ifdef CPU_POWERPC +- int result; +- size_t size; +- +- result = 0; +- size = 4; +- if (sysctlbyname("hw.optional.altivec",&result,&size,NULL,NULL) == 0) +- { +- if (result != 0) CPU_FLAVOUR |= CPU_OPTION_ALTIVEC; +- } +- +- result = 0; +- size = 4; +- if (sysctlbyname("hw.optional.64bitops",&result,&size,NULL,NULL) == 0) +- { +- if (result != 0) CPU_FLAVOUR |= CPU_OPTION_64_BITS; +- } +- +- result = 0; +- size = 4; +- if (sysctlbyname("hw.ncpu",&result,&size,NULL,NULL) == 0) +- { +- if (result != 0) CPU_NUMBER = result; +- } +-#endif /* CPU_POWERPC */ +- +-#ifdef CPU_X86 +- if (mmx_supported()) CPU_FLAVOUR |= CPU_OPTION_MMX; +- if (xmmx_supported()) CPU_FLAVOUR |= CPU_OPTION_XMMX; +-#endif /* CPU_X86 */ +-} +- +-unsigned int cpu_flavour (void) +-{ +- if (CPU_DETECTED == 0) autoset_cpu_info(); +- return CPU_FLAVOUR; +-} +- +-unsigned int cpu_number (void) +-{ +- if (CPU_DETECTED == 0) autoset_cpu_info(); +- return CPU_NUMBER; +-} +diff -Naur /home/d4rk/goom2k4-0/src/cpu_info.h /src/cpu_info.h +--- /home/d4rk/goom2k4-0/src/cpu_info.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/cpu_info.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,34 +0,0 @@ +-#ifndef CPU_INFO_H +-#define CPU_INFO_H +- +-/* +- * cpu_info.h +- * Goom +- * +- * Created by Guillaume Borios on Sun Dec 28 2003. +- * Copyright (c) 2003 iOS. All rights reserved. +- * +- */ +- +-#ifdef HAVE_MMX +-#ifndef CPU_X86 +-#define CPU_X86 +-#endif +-#endif +- +-/* Returns the CPU flavour described with the constants below */ +-unsigned int cpu_flavour (void); +- +-#define CPU_OPTION_ALTIVEC 0x1 +-#define CPU_OPTION_64_BITS 0x2 +-#define CPU_OPTION_MMX 0x4 +-#define CPU_OPTION_XMMX 0x8 +-#define CPU_OPTION_SSE 0x10 +-#define CPU_OPTION_SSE2 0x20 +-#define CPU_OPTION_3DNOW 0x40 +- +- +-/* Returns the CPU number */ +-unsigned int cpu_number (void); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/default_script.goom /src/default_script.goom +--- /home/d4rk/goom2k4-0/src/default_script.goom 2005-02-07 06:46:41.000000000 -0700 ++++ /src/default_script.goom 1969-12-31 17:00:00.000000000 -0700 +@@ -1,34 +0,0 @@ +-/* +- * specify here high-level properties of a flash. +- */ +- +-flash_occurs when (Sound.Goom_Detection > 50%) and (Sound.Sound_Speed > 14%); +- +-max_flash = 200%; +-slow_down_coef = 96%; +- +-/* +- * Here you have the fx's state machin behaviour. +- */ +- +-(locked) ? locked--; +- +-(not locked) and (flash_occurs) ? +-{ +- cur_power = Sound_Speed.Goom_Detection; +- start flashing_up; +-} +- +-(not locked) and (flashing_up) ? +-{ +- factor += cur_power * 2 * (speedvar / 4 + 0.95); +- if (factor > max_flash) factor = max_flash; +- +- (not flash_occurs) ? +- { +- locked = 200; +- stop flashing_up; +- } +-} +- +-factor *= slow_down_coef; +diff -Naur /home/d4rk/goom2k4-0/src/default_scripts.h /src/default_scripts.h +--- /home/d4rk/goom2k4-0/src/default_scripts.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/default_scripts.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,6 +0,0 @@ +-#ifndef _DEFAULT_SCRIPTS_H +-#define _DEFAULT_SCRIPTS_H +- +-#define GOOM_MAIN_SCRIPT "" +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/DOCODE.TXT /src/DOCODE.TXT +--- /home/d4rk/goom2k4-0/src/DOCODE.TXT 2005-02-07 06:46:41.000000000 -0700 ++++ /src/DOCODE.TXT 1969-12-31 17:00:00.000000000 -0700 +@@ -1,55 +0,0 @@ +-Les différentes données.. +------ +- +-typedef struct { +- int32 * buf; +- int32 width; +- int32 height; +- int32 size; +- +- int32 * realstart; +-} Surface; +------ +- +->> taille du buffer de zoom +-guint32 mmx_zoom_size; +------ +- +->> les buffers bruts contiennent les px et py de chaque point +->> => brutS[0] = px0, brutS[1] = py0, brutS[2] = px1, [...] +- +-signed int *brutS = 0, *freebrutS = 0; // source +-signed int *brutD = 0, *freebrutD = 0; // dest +-signed int *brutT = 0, *freebrutT = 0; // temp (en cours de génération) +- +->> pointeur vers p1 +-guint32 *expix1 = 0; +->> pointeur vers p2 +-guint32 *expix2 = 0; +- +->> largeur d'une ligne = prevX +-guint32 zoom_width; +- +->> largeur et hauteur des differents buffers. +-int prevX=0,prevY=0; +------ +- +->> buffratio est un fixpoint : 16,16 +->> valeur normalement comprise entre 0 et 1, +->> soit 0<=buffratio<=BUFFPOINTMASK +- +-int buffratio = 0; +- +-#define BUFFPOINTNB 16 +-#define BUFFPOINTMASK 0xffff +-#define BUFFINCR 0xff +------ +- +-#define sqrtperte 16 +->> faire : a % sqrtperte <=> a & pertemask +-#define PERTEMASK 0xf +->> faire : a / sqrtperte <=> a >> PERTEDEC +-#define PERTEDEC 4 +------ +- +-int precalCoef[16][16]; +diff -Naur /home/d4rk/goom2k4-0/src/drawmethods.c /src/drawmethods.c +--- /home/d4rk/goom2k4-0/src/drawmethods.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/drawmethods.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,203 +0,0 @@ +-#include "drawmethods.h" +- +-#define DRAWMETHOD_PLUS(_out,_backbuf,_col) \ +-{\ +- int tra=0,i=0;\ +- unsigned char *bra = (unsigned char*)&(_backbuf);\ +- unsigned char *dra = (unsigned char*)&(_out);\ +- unsigned char *cra = (unsigned char*)&(_col);\ +- for (;i<4;i++) {\ +- tra = *cra;\ +- tra += *bra;\ +- if (tra>255) tra=255;\ +- *dra = tra;\ +- ++dra;++cra;++bra;\ +- }\ +-} +- +-#define DRAWMETHOD DRAWMETHOD_PLUS(*p,*p,col) +- +-void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) +-{ +- int x, y, dx, dy, yy, xx; +- Pixel *p; +- +- if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) return; +- +- /* clip to top edge +- if ((y1 < 0) && (y2 < 0)) +- return; +- +- if (y1 < 0) { +- x1 += (y1 * (x1 - x2)) / (y2 - y1); +- y1 = 0; +- } +- if (y2 < 0) { +- x2 += (y2 * (x1 - x2)) / (y2 - y1); +- y2 = 0; +- } +- +- clip to bottom edge +- if ((y1 >= screeny) && (y2 >= screeny)) +- return; +- if (y1 >= screeny) { +- x1 -= ((screeny - y1) * (x1 - x2)) / (y2 - y1); +- y1 = screeny - 1; +- } +- if (y2 >= screeny) { +- x2 -= ((screeny - y2) * (x1 - x2)) / (y2 - y1); +- y2 = screeny - 1; +- } +- clip to left edge +- if ((x1 < 0) && (x2 < 0)) +- return; +- if (x1 < 0) { +- y1 += (x1 * (y1 - y2)) / (x2 - x1); +- x1 = 0; +- } +- if (x2 < 0) { +- y2 += (x2 * (y1 - y2)) / (x2 - x1); +- x2 = 0; +- } +- clip to right edge +- if ((x1 >= screenx) && (x2 >= screenx)) +- return; +- if (x1 >= screenx) { +- y1 -= ((screenx - x1) * (y1 - y2)) / (x2 - x1); +- x1 = screenx - 1; +- } +- if (x2 >= screenx) { +- y2 -= ((screenx - x2) * (y1 - y2)) / (x2 - x1); +- x2 = screenx - 1; +- } +- */ +- +- dx = x2 - x1; +- dy = y2 - y1; +- if (x1 > x2) { +- int tmp; +- +- tmp = x1; +- x1 = x2; +- x2 = tmp; +- tmp = y1; +- y1 = y2; +- y2 = tmp; +- dx = x2 - x1; +- dy = y2 - y1; +- } +- +- /* vertical line */ +- if (dx == 0) { +- if (y1 < y2) { +- p = &(data[(screenx * y1) + x1]); +- for (y = y1; y <= y2; y++) { +- DRAWMETHOD; +- p += screenx; +- } +- } +- else { +- p = &(data[(screenx * y2) + x1]); +- for (y = y2; y <= y1; y++) { +- DRAWMETHOD; +- p += screenx; +- } +- } +- return; +- } +- /* horizontal line */ +- if (dy == 0) { +- if (x1 < x2) { +- p = &(data[(screenx * y1) + x1]); +- for (x = x1; x <= x2; x++) { +- DRAWMETHOD; +- p++; +- } +- return; +- } +- else { +- p = &(data[(screenx * y1) + x2]); +- for (x = x2; x <= x1; x++) { +- DRAWMETHOD; +- p++; +- } +- return; +- } +- } +- /* 1 */ +- /* \ */ +- /* \ */ +- /* 2 */ +- if (y2 > y1) { +- /* steep */ +- if (dy > dx) { +- dx = ((dx << 16) / dy); +- x = x1 << 16; +- for (y = y1; y <= y2; y++) { +- xx = x >> 16; +- p = &(data[(screenx * y) + xx]); +- DRAWMETHOD; +- if (xx < (screenx - 1)) { +- p++; +- /* DRAWMETHOD; */ +- } +- x += dx; +- } +- return; +- } +- /* shallow */ +- else { +- dy = ((dy << 16) / dx); +- y = y1 << 16; +- for (x = x1; x <= x2; x++) { +- yy = y >> 16; +- p = &(data[(screenx * yy) + x]); +- DRAWMETHOD; +- if (yy < (screeny - 1)) { +- p += screeny; +- /* DRAWMETHOD; */ +- } +- y += dy; +- } +- } +- } +- /* 2 */ +- /* / */ +- /* / */ +- /* 1 */ +- else { +- /* steep */ +- if (-dy > dx) { +- dx = ((dx << 16) / -dy); +- x = (x1 + 1) << 16; +- for (y = y1; y >= y2; y--) { +- xx = x >> 16; +- p = &(data[(screenx * y) + xx]); +- DRAWMETHOD; +- if (xx < (screenx - 1)) { +- p--; +- /* DRAWMETHOD; */ +- } +- x += dx; +- } +- return; +- } +- /* shallow */ +- else { +- dy = ((dy << 16) / dx); +- y = y1 << 16; +- for (x = x1; x <= x2; x++) { +- yy = y >> 16; +- p = &(data[(screenx * yy) + x]); +- DRAWMETHOD; +- if (yy < (screeny - 1)) { +- p += screeny; +- /* DRAWMETHOD; */ +- } +- y += dy; +- } +- return; +- } +- } +-} +- +diff -Naur /home/d4rk/goom2k4-0/src/drawmethods.h /src/drawmethods.h +--- /home/d4rk/goom2k4-0/src/drawmethods.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/drawmethods.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,9 +0,0 @@ +-#ifndef _DRAWMETHODS_H +-#define _DRAWMETHODS_H +- +-#include "goom_config.h" +-#include "goom_graphic.h" +- +-void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +- +-#endif /* _DRAWMETHODS_H */ +diff -Naur /home/d4rk/goom2k4-0/src/filters.c /src/filters.c +--- /home/d4rk/goom2k4-0/src/filters.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filters.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,767 +0,0 @@ +-// --- CHUI EN TRAIN DE SUPPRIMER LES EXTERN RESOLX ET C_RESOLY --- +- +-/* filter.c version 0.7 +-* contient les filtres applicable a un buffer +-* creation : 01/10/2000 +-* -ajout de sinFilter() +-* -ajout de zoomFilter() +-* -copie de zoomFilter() en zoomFilterRGB(), gerant les 3 couleurs +-* -optimisation de sinFilter (utilisant une table de sin) +-* -asm +-* -optimisation de la procedure de generation du buffer de transformation +-* la vitesse est maintenant comprise dans [0..128] au lieu de [0..100] +-*/ +- +-/* #define _DEBUG_PIXEL */ +- +-#include <string.h> +-#include <stdlib.h> +-#include <math.h> +-#include <stdio.h> +-#include <inttypes.h> +- +-#include "goom_filters.h" +-#include "goom_graphic.h" +-#include "goom_tools.h" +-#include "goom_plugin_info.h" +-#include "goom_fx.h" +-#include "v3d.h" +- +-/* TODO : MOVE THIS AWAY !!! */ +-/* jeko: j'ai essayer de le virer, mais si on veut les laisser inline c'est un peu lourdo... */ +-static inline void setPixelRGB (PluginInfo *goomInfo, Pixel *buffer, Uint x, Uint y, Color c) +-{ +- Pixel i; +- +- i.channels.b = c.b; +- i.channels.g = c.v; +- i.channels.r = c.r; +- *(buffer + (x + y * goomInfo->screen.width)) = i; +-} +- +-static inline void setPixelRGB_ (Pixel *buffer, Uint x, Color c) +-{ +- buffer[x].channels.r = c.r; +- buffer[x].channels.g = c.v; +- buffer[x].channels.b = c.b; +-} +- +-static inline void getPixelRGB (PluginInfo *goomInfo, Pixel *buffer, Uint x, Uint y, Color * c) +-{ +- Pixel i = *(buffer + (x + y * goomInfo->screen.width)); +- c->b = i.channels.b; +- c->v = i.channels.g; +- c->r = i.channels.r; +-} +- +-static inline void getPixelRGB_ (Pixel *buffer, Uint x, Color * c) +-{ +- Pixel i = *(buffer + x); +- c->b = i.channels.b; +- c->v = i.channels.g; +- c->r = i.channels.r; +-} +-/* END TODO */ +- +- +-/* DEPRECATED */ +-// retourne x>>s , en testant le signe de x +-//#define ShiftRight(_x,_s) (((_x)<0) ? -(-(_x)>>(_s)) : ((_x)>>(_s))) +-//#define EFFECT_DISTORS 4 +-//#define EFFECT_DISTORS_SL 2 +-//#define INTERLACE_ADD 9 +-//#define INTERLACE_AND 0xf +-/* END DEPRECATED */ +- +-#define BUFFPOINTNB 16 +-#define BUFFPOINTNBF 16.0f +-#define BUFFPOINTMASK 0xffff +- +-#define sqrtperte 16 +-/* faire : a % sqrtperte <=> a & pertemask */ +-#define PERTEMASK 0xf +-/* faire : a / sqrtperte <=> a >> PERTEDEC */ +-#define PERTEDEC 4 +- +-/* pure c version of the zoom filter */ +-static void c_zoom (Pixel *expix1, Pixel *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD, int buffratio, int precalCoef[BUFFPOINTNB][BUFFPOINTNB]); +- +-/* simple wrapper to give it the same proto than the others */ +-void zoom_filter_c (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]) { +- c_zoom(src, dest, sizeX, sizeY, brutS, brutD, buffratio, precalCoef); +-} +- +-static void generatePrecalCoef (int precalCoef[BUFFPOINTNB][BUFFPOINTNB]); +- +- +-typedef struct _ZOOM_FILTER_FX_WRAPPER_DATA { +- +- PluginParam enabled_bp; +- PluginParameters params; +- +- unsigned int *coeffs, *freecoeffs; +- +- signed int *brutS, *freebrutS; /* source */ +- signed int *brutD, *freebrutD; /* dest */ +- signed int *brutT, *freebrutT; /* temp (en cours de generation) */ +- +- guint32 zoom_width; +- +- unsigned int prevX, prevY; +- +- float general_speed; +- int reverse; /* reverse the speed */ +- char theMode; +- int waveEffect; +- int hypercosEffect; +- int vPlaneEffect; +- int hPlaneEffect; +- char noisify; +- int middleX, middleY; +- +- int mustInitBuffers; +- int interlace_start; +- +- /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */ +- int buffratio; +- int *firedec; +- +- /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */ +- int precalCoef[BUFFPOINTNB][BUFFPOINTNB]; +- +- /** calculatePXandPY statics */ +- int wave; +- int wavesp; +- +-} ZoomFilterFXWrapperData; +- +- +- +- +-static inline v2g zoomVector(ZoomFilterFXWrapperData *data, float X, float Y) +-{ +- v2g vecteur; +- float vx, vy; +- float sq_dist = X*X + Y*Y; +- +- /* sx = (X < 0.0f) ? -1.0f : 1.0f; +- sy = (Y < 0.0f) ? -1.0f : 1.0f; +- */ +- float coefVitesse = (1.0f+ data->general_speed) / 50.0f; +- +- // Effects +- +- /* Centralized FX */ +- +- switch (data->theMode) { +- case CRYSTAL_BALL_MODE: +- coefVitesse -= (sq_dist-0.3f)/15.0f; +- break; +- case AMULETTE_MODE: +- coefVitesse += sq_dist * 3.5f; +- break; +- case WAVE_MODE: +- coefVitesse += sin(sq_dist*20.0f) / 100.0f; +- break; +- case SCRUNCH_MODE: +- coefVitesse += sq_dist / 10.0f; +- break; +- //case HYPERCOS1_MODE: +- break; +- //case HYPERCOS2_MODE: +- break; +- //case YONLY_MODE: +- break; +- case SPEEDWAY_MODE: +- coefVitesse *= 4.0f * Y; +- break; +- default: +- break; +- } +- +- if (coefVitesse < -2.01f) +- coefVitesse = -2.01f; +- if (coefVitesse > 2.01f) +- coefVitesse = 2.01f; +- +- vx = coefVitesse * X; +- vy = coefVitesse * Y; +- +- /* Amulette 2 */ +- // vx = X * tan(dist); +- // vy = Y * tan(dist); +- +- /* Rotate */ +- //vx = (X+Y)*0.1; +- //vy = (Y-X)*0.1; +- +- +- // Effects adds-on +- +- /* Noise */ +- if (data->noisify) +- { +- vx += (((float)random()) / ((float)RAND_MAX) - 0.5f) / 50.0f; +- vy += (((float)random()) / ((float)RAND_MAX) - 0.5f) / 50.0f; +- } +- +- /* Hypercos */ +- if (data->hypercosEffect) +- { +- vx += sin(Y*10.0f)/120.0f; +- vy += sin(X*10.0f)/120.0f; +- } +- +- /* H Plane */ +- if (data->hPlaneEffect) vx += Y * 0.0025f * data->hPlaneEffect; +- +- /* V Plane */ +- if (data->vPlaneEffect) vy += X * 0.0025f * data->vPlaneEffect; +- +- /* TODO : Water Mode */ +- // if (data->waveEffect) +- +- vecteur.x = vx; +- vecteur.y = vy; +- +- return vecteur; +-} +- +- +-/* +- * Makes a stripe of a transform buffer (brutT) +- * +- * The transform is (in order) : +- * Translation (-data->middleX, -data->middleY) +- * Homothetie (Center : 0,0 Coeff : 2/data->prevX) +- */ +-static void makeZoomBufferStripe(ZoomFilterFXWrapperData * data, int INTERLACE_INCR) +-{ +- // Position of the pixel to compute in pixmap coordinates +- Uint x, y; +- // Where (verticaly) to stop generating the buffer stripe +- int maxEnd = (data->interlace_start + INTERLACE_INCR); +- // Ratio from pixmap to normalized coordinates +- float ratio = 2.0f/((float)data->prevX); +- // Ratio from normalized to virtual pixmap coordinates +- float inv_ratio = BUFFPOINTNBF/ratio; +- float min = ratio/BUFFPOINTNBF; +- // Y position of the pixel to compute in normalized coordinates +- float Y = ((float)(data->interlace_start - data->middleY)) * ratio; +- +- maxEnd = data->prevY; +- if (maxEnd > (data->interlace_start + INTERLACE_INCR)) +- maxEnd = (data->interlace_start + INTERLACE_INCR); +- +- for (y = data->interlace_start; (y < data->prevY) && ((signed int)y<maxEnd); y++) { +- Uint premul_y_prevX = y * data->prevX * 2; +- float X = - ((float)data->middleX) * ratio; +- for (x = 0; x < data->prevX; x++) +- { +- v2g vector = zoomVector (data, X, Y); +- +- /* Finish and avoid null displacement */ +- if (fabs(vector.x) < min) vector.x = (vector.x < 0.0f) ? -min : min; +- if (fabs(vector.y) < min) vector.y = (vector.y < 0.0f) ? -min : min; +- +- data->brutT[premul_y_prevX] = ((int)((X-vector.x)*inv_ratio)+((int)(data->middleX*BUFFPOINTNB))); +- data->brutT[premul_y_prevX+1] = ((int)((Y-vector.y)*inv_ratio)+((int)(data->middleY*BUFFPOINTNB))); +- premul_y_prevX += 2; +- X += ratio; +- } +- Y += ratio; +- } +- data->interlace_start += INTERLACE_INCR; +- if (y >= data->prevY-1) data->interlace_start = -1; +-} +- +- +-/* +- * calculer px et py en fonction de x,y,middleX,middleY et theMode +- * px et py indique la nouvelle position (en sqrtperte ieme de pixel) +- * (valeur * 16) +- +- inline void calculatePXandPY (PluginInfo *goomInfo, ZoomFilterFXWrapperData *data, int x, int y, int *px, int *py) +- { +- if (data->theMode == WATER_MODE) { +- int yy; +- +- yy = y + goom_irand(goomInfo->gRandom, 4) - goom_irand(goomInfo->gRandom, 4) + data->wave / 10; +- if (yy < 0) +- yy = 0; +- if (yy >= (signed int)goomInfo->screen.height) +- yy = goomInfo->screen.height - 1; +- +- *px = (x << 4) + data->firedec[yy] + (data->wave / 10); +- *py = (y << 4) + 132 - ((data->vitesse < 131) ? data->vitesse : 130); +- +- data->wavesp += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); +- if (data->wave < -10) +- data->wavesp += 2; +- if (data->wave > 10) +- data->wavesp -= 2; +- data->wave += (data->wavesp / 10) + goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); +- if (data->wavesp > 100) +- data->wavesp = (data->wavesp * 9) / 10; +- } +- else { +- int dist = 0, vx9, vy9; +- int vx, vy; +- int ppx, ppy; +- int fvitesse = data->vitesse << 4; +- +- if (data->noisify) { +- x += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify); +- y += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify); +- } +- vx = (x - data->middleX) << 9; +- vy = (y - data->middleY) << 9; +- +- if (data->hPlaneEffect) +- vx += data->hPlaneEffect * (y - data->middleY); +- +- if (data->vPlaneEffect) +- vy += data->vPlaneEffect * (x - data->middleX); +- +- if (data->waveEffect) { +- fvitesse *= +- 1024 + +- ShiftRight (goomInfo->sintable +- [(unsigned short) (dist * 0xffff + EFFECT_DISTORS)], 6); +- fvitesse /= 1024; +- } +- +- if (data->hypercosEffect) { +- vx += ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1); +- vy += ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1); +- } +- +- vx9 = ShiftRight (vx, 9); +- vy9 = ShiftRight (vy, 9); +- dist = vx9 * vx9 + vy9 * vy9; +- +- switch (data->theMode) { +- case WAVE_MODE: +- fvitesse *= +- 1024 + +- ShiftRight (goomInfo->sintable +- [(unsigned short) (dist * 0xffff * EFFECT_DISTORS)], 6); +- fvitesse>>=10; +- break; +- case CRYSTAL_BALL_MODE: +- fvitesse += (dist >> (10-EFFECT_DISTORS_SL)); +- break; +- case AMULETTE_MODE: +- fvitesse -= (dist >> (4 - EFFECT_DISTORS_SL)); +- break; +- case SCRUNCH_MODE: +- fvitesse -= (dist >> (10 - EFFECT_DISTORS_SL)); +- break; +- case HYPERCOS1_MODE: +- vx = vx + ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1); +- vy = vy + ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1); +- break; +- case HYPERCOS2_MODE: +- vx = +- vx + ShiftRight (goomInfo->sintable[(-ShiftRight (vy, 1) + dist) & 0xffff], 0); +- vy = +- vy + ShiftRight (goomInfo->sintable[(ShiftRight (vx, 1) + dist) & 0xffff], 0); +- fvitesse = 128 << 4; +- break; +- case YONLY_MODE: +- fvitesse *= 1024 + ShiftRight (goomInfo->sintable[vy & 0xffff], 6); +- fvitesse >>= 10; +- break; +- case SPEEDWAY_MODE: +- fvitesse -= (ShiftRight(vy,10-EFFECT_DISTORS_SL)); +- break; +- } +- +- if (fvitesse < -3024) +- fvitesse = -3024; +- +- if (vx < 0) // pb avec decalage sur nb negatif +- ppx = -(-(vx * fvitesse) >> 16); +- // 16 = 9 + 7 (7 = nb chiffre virgule de vitesse * (v = 128 => immobile) +- // * * * * * 9 = nb chiffre virgule de vx) +- else +- ppx = ((vx * fvitesse) >> 16); +- +- if (vy < 0) +- ppy = -(-(vy * fvitesse) >> 16); +- else +- ppy = ((vy * fvitesse) >> 16); +- +- *px = (data->middleX << 4) + ppx; +- *py = (data->middleY << 4) + ppy; +- } +- } +- */ +- +- +- +-static void c_zoom (Pixel *expix1, Pixel *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD, +- int buffratio, int precalCoef[16][16]) +-{ +- int myPos, myPos2; +- Color couleur; +- +- unsigned int ax = (prevX - 1) << PERTEDEC, ay = (prevY - 1) << PERTEDEC; +- +- int bufsize = prevX * prevY * 2; +- int bufwidth = prevX; +- +- expix1[0].val=expix1[prevX-1].val=expix1[prevX*prevY-1].val=expix1[prevX*prevY-prevX].val=0; +- +- for (myPos = 0; myPos < bufsize; myPos += 2) { +- Color col1, col2, col3, col4; +- int c1, c2, c3, c4, px, py; +- int pos; +- int coeffs; +- +- int brutSmypos = brutS[myPos]; +- +- myPos2 = myPos + 1; +- +- px = brutSmypos + (((brutD[myPos] - brutSmypos) * buffratio) >> BUFFPOINTNB); +- brutSmypos = brutS[myPos2]; +- py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB); +- +- if ((py >= ay) || (px >= ax)) { +- pos = coeffs = 0; +- } else { +- pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); +- /* coef en modulo 15 */ +- coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; +- } +- getPixelRGB_ (expix1, pos, &col1); +- getPixelRGB_ (expix1, pos + 1, &col2); +- getPixelRGB_ (expix1, pos + bufwidth, &col3); +- getPixelRGB_ (expix1, pos + bufwidth + 1, &col4); +- +- c1 = coeffs; +- c2 = (c1 >> 8) & 0xFF; +- c3 = (c1 >> 16) & 0xFF; +- c4 = (c1 >> 24) & 0xFF; +- c1 = c1 & 0xff; +- +- couleur.r = col1.r * c1 + col2.r * c2 + col3.r * c3 + col4.r * c4; +- if (couleur.r > 5) +- couleur.r -= 5; +- couleur.r >>= 8; +- +- couleur.v = col1.v * c1 + col2.v * c2 + col3.v * c3 + col4.v * c4; +- if (couleur.v > 5) +- couleur.v -= 5; +- couleur.v >>= 8; +- +- couleur.b = col1.b * c1 + col2.b * c2 + col3.b * c3 + col4.b * c4; +- if (couleur.b > 5) +- couleur.b -= 5; +- couleur.b >>= 8; +- +- setPixelRGB_ (expix2, myPos >> 1, couleur); +- } +-} +- +-/** generate the water fx horizontal direction buffer */ +-static void generateTheWaterFXHorizontalDirectionBuffer(PluginInfo *goomInfo, ZoomFilterFXWrapperData *data) { +- +- int loopv; +- int decc = goom_irand(goomInfo->gRandom, 8) - 4; +- int spdc = goom_irand(goomInfo->gRandom, 8) - 4; +- int accel = goom_irand(goomInfo->gRandom, 8) - 4; +- +- for (loopv = data->prevY; loopv != 0;) { +- +- loopv--; +- data->firedec[loopv] = decc; +- decc += spdc / 10; +- spdc += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); +- +- if (decc > 4) +- spdc -= 1; +- if (decc < -4) +- spdc += 1; +- +- if (spdc > 30) +- spdc = spdc - goom_irand(goomInfo->gRandom, 3) + accel / 10; +- if (spdc < -30) +- spdc = spdc + goom_irand(goomInfo->gRandom, 3) + accel / 10; +- +- if (decc > 8 && spdc > 1) +- spdc -= goom_irand(goomInfo->gRandom, 3) - 2; +- +- if (decc < -8 && spdc < -1) +- spdc += goom_irand(goomInfo->gRandom, 3) + 2; +- +- if (decc > 8 || decc < -8) +- decc = decc * 8 / 9; +- +- accel += goom_irand(goomInfo->gRandom, 2) - goom_irand(goomInfo->gRandom, 2); +- if (accel > 20) +- accel -= 2; +- if (accel < -20) +- accel += 2; +- } +-} +- +- +- +-/** +-* Main work for the dynamic displacement map. +- * +- * Reads data from pix1, write to pix2. +- * +- * Useful datas for this FX are stored in ZoomFilterData. +- * +- * If you think that this is a strange function name, let me say that a long time ago, +- * there has been a slow version and a gray-level only one. Then came these function, +- * fast and workin in RGB colorspace ! nice but it only was applying a zoom to the image. +- * So that is why you have this name, for the nostalgy of the first days of goom +- * when it was just a tiny program writen in Turbo Pascal on my i486... +- */ +-void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, Uint resx, Uint resy, int switchIncr, float switchMult) +-{ +- Uint x, y; +- +- ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)goomInfo->zoomFilter_fx.fx_data; +- +- if (!BVAL(data->enabled_bp)) return; +- +- /** changement de taille **/ +- if ((data->prevX != resx) || (data->prevY != resy)) { +- data->prevX = resx; +- data->prevY = resy; +- +- if (data->brutS) free (data->freebrutS); +- data->brutS = 0; +- if (data->brutD) free (data->freebrutD); +- data->brutD = 0; +- if (data->brutT) free (data->freebrutT); +- data->brutT = 0; +- +- data->middleX = resx / 2; +- data->middleY = resy / 2; +- data->mustInitBuffers = 1; +- if (data->firedec) free (data->firedec); +- data->firedec = 0; +- } +- +- if (data->interlace_start != -2) +- zf = NULL; +- +- /** changement de config **/ +- if (zf) { +- data->reverse = zf->reverse; +- data->general_speed = (float)(zf->vitesse-128)/128.0f; +- if (data->reverse) data->general_speed = -data->general_speed; +- data->middleX = zf->middleX; +- data->middleY = zf->middleY; +- data->theMode = zf->mode; +- data->hPlaneEffect = zf->hPlaneEffect; +- data->vPlaneEffect = zf->vPlaneEffect; +- data->waveEffect = zf->waveEffect; +- data->hypercosEffect = zf->hypercosEffect; +- data->noisify = zf->noisify; +- data->interlace_start = 0; +- } +- +- +- if (data->mustInitBuffers) { +- +- data->mustInitBuffers = 0; +- data->freebrutS = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); +- data->brutS = (gint32 *) ((1 + ((uintptr_t) (data->freebrutS)) / 128) * 128); +- +- data->freebrutD = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); +- data->brutD = (gint32 *) ((1 + ((uintptr_t) (data->freebrutD)) / 128) * 128); +- +- data->freebrutT = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); +- data->brutT = (gint32 *) ((1 + ((uintptr_t) (data->freebrutT)) / 128) * 128); +- +- data->buffratio = 0; +- +- data->firedec = (int *) malloc (data->prevY * sizeof (int)); +- generateTheWaterFXHorizontalDirectionBuffer(goomInfo, data); +- +- data->interlace_start = 0; +- makeZoomBufferStripe(data,resy); +- +- /* Copy the data from temp to dest and source */ +- memcpy(data->brutS,data->brutT,resx * resy * 2 * sizeof(int)); +- memcpy(data->brutD,data->brutT,resx * resy * 2 * sizeof(int)); +- } +- +- /* generation du buffer de trans */ +- if (data->interlace_start == -1) { +- +- /* sauvegarde de l'etat actuel dans la nouvelle source +- * TODO: write that in MMX (has been done in previous version, but did not follow some new fonctionnalities) */ +- y = data->prevX * data->prevY * 2; +- for (x = 0; x < y; x += 2) { +- int brutSmypos = data->brutS[x]; +- int x2 = x + 1; +- +- data->brutS[x] = brutSmypos + (((data->brutD[x] - brutSmypos) * data->buffratio) >> BUFFPOINTNB); +- brutSmypos = data->brutS[x2]; +- data->brutS[x2] = brutSmypos + (((data->brutD[x2] - brutSmypos) * data->buffratio) >> BUFFPOINTNB); +- } +- data->buffratio = 0; +- } +- +- if (data->interlace_start == -1) { +- signed int * tmp; +- tmp = data->brutD; +- data->brutD=data->brutT; +- data->brutT=tmp; +- tmp = data->freebrutD; +- data->freebrutD=data->freebrutT; +- data->freebrutT=tmp; +- data->interlace_start = -2; +- } +- +- if (data->interlace_start>=0) +- { +- /* creation de la nouvelle destination */ +- makeZoomBufferStripe(data,resy/16); +- } +- +- if (switchIncr != 0) { +- data->buffratio += switchIncr; +- if (data->buffratio > BUFFPOINTMASK) +- data->buffratio = BUFFPOINTMASK; +- } +- +- if (switchMult != 1.0f) { +- data->buffratio = (int) ((float) BUFFPOINTMASK * (1.0f - switchMult) + +- (float) data->buffratio * switchMult); +- } +- +- data->zoom_width = data->prevX; +- +- goomInfo->methods.zoom_filter (data->prevX, data->prevY, pix1, pix2, +- data->brutS, data->brutD, data->buffratio, data->precalCoef); +-} +- +-static void generatePrecalCoef (int precalCoef[16][16]) +-{ +- int coefh, coefv; +- +- for (coefh = 0; coefh < 16; coefh++) { +- for (coefv = 0; coefv < 16; coefv++) { +- +- int i; +- int diffcoeffh; +- int diffcoeffv; +- +- diffcoeffh = sqrtperte - coefh; +- diffcoeffv = sqrtperte - coefv; +- +- if (!(coefh || coefv)) { +- i = 255; +- } +- else { +- int i1, i2, i3, i4; +- +- i1 = diffcoeffh * diffcoeffv; +- i2 = coefh * diffcoeffv; +- i3 = diffcoeffh * coefv; +- i4 = coefh * coefv; +- +- // TODO: faire mieux... +- if (i1) i1--; +- if (i2) i2--; +- if (i3) i3--; +- if (i4) i4--; +- +- i = (i1) | (i2 << 8) | (i3 << 16) | (i4 << 24); +- } +- precalCoef[coefh][coefv] = i; +- } +- } +-} +- +-/* VisualFX Wrapper */ +- +-static void zoomFilterVisualFXWrapper_init (struct _VISUAL_FX *_this, PluginInfo *info) +-{ +- ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)malloc(sizeof(ZoomFilterFXWrapperData)); +- +- data->coeffs = 0; +- data->freecoeffs = 0; +- data->brutS = 0; +- data->freebrutS = 0; +- data->brutD = 0; +- data->freebrutD = 0; +- data->brutT = 0; +- data->freebrutT = 0; +- data->prevX = 0; +- data->prevY = 0; +- +- data->mustInitBuffers = 1; +- data->interlace_start = -2; +- +- data->general_speed = 0.0f; +- data->reverse = 0; +- data->theMode = AMULETTE_MODE; +- data->waveEffect = 0; +- data->hypercosEffect = 0; +- data->vPlaneEffect = 0; +- data->hPlaneEffect = 0; +- data->noisify = 2; +- +- /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */ +- data->buffratio = 0; +- data->firedec = 0; +- +- data->wave = data->wavesp = 0; +- +- data->enabled_bp = secure_b_param("Enabled", 1); +- +- data->params = plugin_parameters ("Zoom Filter", 1); +- data->params.params[0] = &data->enabled_bp; +- +- _this->params = &data->params; +- _this->fx_data = (void*)data; +- +- /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */ +- generatePrecalCoef(data->precalCoef); +-} +- +-static void zoomFilterVisualFXWrapper_free (struct _VISUAL_FX *_this) +-{ +- free(_this->fx_data); +-} +- +-static void zoomFilterVisualFXWrapper_apply (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info) +-{ +-} +- +-VisualFX zoomFilterVisualFXWrapper_create(void) +-{ +- VisualFX fx; +- fx.init = zoomFilterVisualFXWrapper_init; +- fx.free = zoomFilterVisualFXWrapper_free; +- fx.apply = zoomFilterVisualFXWrapper_apply; +- return fx; +-} +- +- +-/* TODO : MOVE THIS AWAY */ +- +-void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c, float t1, float t2, float t3, float t4, Uint cycle) +-{ +- Uint x = (Uint) ((int) (goomInfo->screen.width / 2) +- + (int) (t1 * cos ((float) cycle / t3))); +- Uint y = (Uint) ((int) (goomInfo->screen.height/2) +- + (int) (t2 * sin ((float) cycle / t4))); +- +- if ((x > 1) && (y > 1) && (x < goomInfo->screen.width - 2) && (y < goomInfo->screen.height - 2)) { +- setPixelRGB (goomInfo, pix1, x + 1, y, c); +- setPixelRGB (goomInfo, pix1, x, y + 1, c); +- setPixelRGB (goomInfo, pix1, x + 1, y + 1, WHITE); +- setPixelRGB (goomInfo, pix1, x + 2, y + 1, c); +- setPixelRGB (goomInfo, pix1, x + 1, y + 2, c); +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/filters.c.rej /src/filters.c.rej +--- /home/d4rk/goom2k4-0/src/filters.c.rej 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filters.c.rej 1969-12-31 17:00:00.000000000 -0700 +@@ -1,31 +0,0 @@ +-*************** +-*** 427,439 **** +- brutSmypos = brutS[myPos2]; +- py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB); +- +- pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); +- /* coef en modulo 15 */ +- coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; +-- +-- if ((py >= (signed int)ay) || (px >= (signed int)ax)) { +-- pos = coeffs = 0; +-- } +- +- getPixelRGB_ (expix1, pos, &col1); +- getPixelRGB_ (expix1, pos + 1, &col2); +---- 427,441 ---- +- brutSmypos = brutS[myPos2]; +- py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB); +- +-+ +-+ if ((py >= ay) || (px >= ax)) { +-+ pos = coeffs = 0; +-+ } else { +- pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); +- /* coef en modulo 15 */ +- coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; +-+ } +-+ +- +- getPixelRGB_ (expix1, pos, &col1); +- getPixelRGB_ (expix1, pos + 1, &col2); +diff -Naur /home/d4rk/goom2k4-0/src/filters_mmx.s /src/filters_mmx.s +--- /home/d4rk/goom2k4-0/src/filters_mmx.s 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filters_mmx.s 1969-12-31 17:00:00.000000000 -0700 +@@ -1,200 +0,0 @@ +-;// file : mmx_zoom.s +-;// author : JC Hoelt <jeko@free.fr> +-;// +-;// history +-;// 07/01/2001 : Changing FEMMS to EMMS : slower... but run on intel machines +-;// 03/01/2001 : WIDTH and HEIGHT are now variable +-;// 28/12/2000 : adding comments to the code, suppress some useless lines +-;// 27/12/2000 : reducing memory access... improving performance by 20% +-;// coefficients are now on 1 byte +-;// 22/12/2000 : Changing data structure +-;// 16/12/2000 : AT&T version +-;// 14/12/2000 : unrolling loop +-;// 12/12/2000 : 64 bits memory access +- +- +-.data +- +-chaine: +- .string "pos = %d\n\0" +- .long 0x0 +- +-thezero: +- .long 0x00000000 +- .long 0x00000000 +- +-.text +- +-.globl mmx_zoom ;// name of the function to call by C program +-/* .extern coeffs ;// the transformation buffer */ +-.extern expix1,expix2 ;// the source and destination buffer +-.extern mmx_zoom_size, zoom_width ;// size of the buffers +- +-.extern brutS,brutD,buffratio,precalCoef,prevX,prevY +- +-#define PERTEMASK 15 +-/* faire : a / sqrtperte <=> a >> PERTEDEC*/ +-#define PERTEDEC 4 +- +-.align 16 +-mmx_zoom: +- +- pushl %ebp +- movl %esp,%ebp +- subl $12,%esp +- +- movl prevX,%eax +- decl %eax +- sarl $4,%eax +- movl %eax,-4(%ebp) +- +- movl prevY,%eax +- decl %eax +- sarl $4,%eax +- movl %eax,-8(%ebp) +- +-;// initialisation du mm7 à zero +- movq (thezero), %mm7 +- +-movl mmx_zoom_size, %ecx +-decl %ecx +- +-.while: +- ;// esi <- nouvelle position +- movl brutS, %eax +- leal (%eax, %ecx, 8),%eax +- +- movl (%eax),%edx /* = brutS.px (brutSmypos) */ +- movl 4(%eax),%eax /* = brutS.py */ +- +- movl brutD,%ebx +- leal (%ebx, %ecx, 8),%ebx +- movl (%ebx),%esi +- subl %edx, %esi +- imull buffratio,%esi +- sarl $16,%esi +- addl %edx,%esi /* esi = px */ +- +- /* eax contient deja brutS.py = le nouveau brutSmypos*/ +- /* ebx pointe sur brutD[myPos] */ +- movl 4(%ebx),%edi +- subl %eax,%edi +- imull buffratio,%edi +- sarl $16,%edi +- addl %eax,%edi /* edi = py */ +- +-/* pushl %eax +- pushl %ebx*/ +-/* popl %ebx +- popl %eax*/ +- +- movl %esi,%eax +- andl $15,%eax /* eax = coefh */ +- movl %edi,%ebx +- andl $15,%ebx /* ebx = coefv */ +- +- leal 0(,%ebx,4),%ebx +- sall $6,%eax +- addl %ebx,%eax +- movl $precalCoef,%ebx +-/* movd (%eax,%ebx),%mm6*/ /* mm6 = coeffs */ +- +- cmpl -8(%ebp),%edi +- jge .then1 +- cmpl -4(%ebp),%esi +- jge .then1 +- +- sarl $4,%esi +- sarl $4,%edi +- imull zoom_width,%edi +- leal (%esi,%edi),%esi +- jmp .finsi1 +- +-.then1: +- movl $0,%esi +-.finsi1: +- +- /** apres ce calcul, %esi = pos, %mm6 = coeffs **/ +-/* pushl %esi +- pushl $chaine +- call printf +- addl $8,%esp*/ +- +- movl expix1,%eax +- +- ;// recuperation des deux premiers pixels dans mm0 et mm1 +-/* movq (%eax,%esi,4), %mm0 /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- movq %mm0, %mm1 /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- +- ;// depackage du premier pixel +- punpcklbw %mm7, %mm0 /* 00-b2-00-v2-00-r2-00-a2 */ +- +- movq %mm6, %mm5 /* ??-??-??-??-c4-c3-c2-c1 */ +- ;// depackage du 2ieme pixel +- punpckhbw %mm7, %mm1 /* 00-b1-00-v1-00-r1-00-a1 */ +- +- ;// extraction des coefficients... +- punpcklbw %mm5, %mm6 /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- movq %mm6, %mm4 /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- movq %mm6, %mm5 /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- +- punpcklbw %mm5, %mm6 /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- punpckhbw %mm5, %mm4 /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- +- movq %mm6, %mm3 /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- punpcklbw %mm7, %mm6 /* 00-c1-00-c1-00-c1-00-c1 */ +- punpckhbw %mm7, %mm3 /* 00-c2-00-c2-00-c2-00-c2 */ +- +- ;// multiplication des pixels par les coefficients +- pmullw %mm6, %mm0 /* c1*b2-c1*v2-c1*r2-c1*a2 */ +- pmullw %mm3, %mm1 /* c2*b1-c2*v1-c2*r1-c2*a1 */ +- paddw %mm1, %mm0 +- +- ;// ...extraction des 2 derniers coefficients +- movq %mm4, %mm5 /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- punpcklbw %mm7, %mm4 /* 00-c3-00-c3-00-c3-00-c3 */ +- punpckhbw %mm7, %mm5 /* 00-c4-00-c4-00-c4-00-c4 */ +- +- /* ajouter la longueur de ligne a esi */ +- addl prevX,%esi +- +- ;// recuperation des 2 derniers pixels +-/* movq (%eax,%esi,4), %mm1*/ +- movq %mm1, %mm2 +- +- ;// depackage des pixels +- punpcklbw %mm7, %mm1 +- punpckhbw %mm7, %mm2 +- +- ;// multiplication pas les coeffs +- pmullw %mm4, %mm1 +- pmullw %mm5, %mm2 +- +- ;// ajout des valeurs obtenues à la valeur finale +- paddw %mm1, %mm0 +- paddw %mm2, %mm0 +- +- ;// division par 256 = 16+16+16+16, puis repackage du pixel final +- psrlw $8, %mm0 +- packuswb %mm7, %mm0 +- +- ;// passage au suivant +- +- ;// enregistrement du resultat +- movl expix2,%eax +-/* movd %mm0,(%eax,%ecx,4)*/ +- +- decl %ecx +- ;// test de fin du tantque +- cmpl $0, %ecx ;// 400x300 +- +- jz .fin_while +- jmp .while +- +-.fin_while: +- emms +- +- movl %ebp,%esp +- popl %ebp +- +- ret ;//The End +diff -Naur /home/d4rk/goom2k4-0/src/filter_test/mmx.h /src/filter_test/mmx.h +--- /home/d4rk/goom2k4-0/src/filter_test/mmx.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filter_test/mmx.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,705 +0,0 @@ +-/* mmx.h +- +- MultiMedia eXtensions GCC interface library for IA32. +- +- To use this library, simply include this header file +- and compile with GCC. You MUST have inlining enabled +- in order for mmx_ok() to work; this can be done by +- simply using -O on the GCC command line. +- +- Compiling with -DMMX_TRACE will cause detailed trace +- output to be sent to stderr for each mmx operation. +- This adds lots of code, and obviously slows execution to +- a crawl, but can be very useful for debugging. +- +- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY +- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT +- LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY +- AND FITNESS FOR ANY PARTICULAR PURPOSE. +- +- 1997-99 by H. Dietz and R. Fisher +- +- Notes: +- It appears that the latest gas has the pand problem fixed, therefore +- I'll undefine BROKEN_PAND by default. +-*/ +- +-#ifndef _MMX_H +-#define _MMX_H +- +-/* Warning: at this writing, the version of GAS packaged +- with most Linux distributions does not handle the +- parallel AND operation mnemonic correctly. If the +- symbol BROKEN_PAND is defined, a slower alternative +- coding will be used. If execution of mmxtest results +- in an illegal instruction fault, define this symbol. +-*/ +-#undef BROKEN_PAND +- +- +-/* The type of an value that fits in an MMX register +- (note that long long constant values MUST be suffixed +- by LL and unsigned long long values by ULL, lest +- they be truncated by the compiler) +-*/ +-typedef union { +- long long q; /* Quadword (64-bit) value */ +- unsigned long long uq; /* Unsigned Quadword */ +- int d[2]; /* 2 Doubleword (32-bit) values */ +- unsigned int ud[2]; /* 2 Unsigned Doubleword */ +- short w[4]; /* 4 Word (16-bit) values */ +- unsigned short uw[4]; /* 4 Unsigned Word */ +- char b[8]; /* 8 Byte (8-bit) values */ +- unsigned char ub[8]; /* 8 Unsigned Byte */ +- float s[2]; /* Single-precision (32-bit) value */ +-} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ +- +- +- +-/* Function to test if multimedia instructions are supported... +-*/ +-inline extern int +-mm_support(void) +-{ +- /* Returns 1 if MMX instructions are supported, +- 3 if Cyrix MMX and Extended MMX instructions are supported +- 5 if AMD MMX and 3DNow! instructions are supported +- 0 if hardware does not support any of these +- */ +- register int rval = 0; +- +- __asm__ __volatile__ ( +- /* See if CPUID instruction is supported ... */ +- /* ... Get copies of EFLAGS into eax and ecx */ +- "pushf\n\t" +- "popl %%eax\n\t" +- "movl %%eax, %%ecx\n\t" +- +- /* ... Toggle the ID bit in one copy and store */ +- /* to the EFLAGS reg */ +- "xorl $0x200000, %%eax\n\t" +- "push %%eax\n\t" +- "popf\n\t" +- +- /* ... Get the (hopefully modified) EFLAGS */ +- "pushf\n\t" +- "popl %%eax\n\t" +- +- /* ... Compare and test result */ +- "xorl %%eax, %%ecx\n\t" +- "testl $0x200000, %%ecx\n\t" +- "jz NotSupported1\n\t" /* CPUID not supported */ +- +- +- /* Get standard CPUID information, and +- go to a specific vendor section */ +- "movl $0, %%eax\n\t" +- "cpuid\n\t" +- +- /* Check for Intel */ +- "cmpl $0x756e6547, %%ebx\n\t" +- "jne TryAMD\n\t" +- "cmpl $0x49656e69, %%edx\n\t" +- "jne TryAMD\n\t" +- "cmpl $0x6c65746e, %%ecx\n" +- "jne TryAMD\n\t" +- "jmp Intel\n\t" +- +- /* Check for AMD */ +- "\nTryAMD:\n\t" +- "cmpl $0x68747541, %%ebx\n\t" +- "jne TryCyrix\n\t" +- "cmpl $0x69746e65, %%edx\n\t" +- "jne TryCyrix\n\t" +- "cmpl $0x444d4163, %%ecx\n" +- "jne TryCyrix\n\t" +- "jmp AMD\n\t" +- +- /* Check for Cyrix */ +- "\nTryCyrix:\n\t" +- "cmpl $0x69727943, %%ebx\n\t" +- "jne NotSupported2\n\t" +- "cmpl $0x736e4978, %%edx\n\t" +- "jne NotSupported3\n\t" +- "cmpl $0x64616574, %%ecx\n\t" +- "jne NotSupported4\n\t" +- /* Drop through to Cyrix... */ +- +- +- /* Cyrix Section */ +- /* See if extended CPUID level 80000001 is supported */ +- /* The value of CPUID/80000001 for the 6x86MX is undefined +- according to the Cyrix CPU Detection Guide (Preliminary +- Rev. 1.01 table 1), so we'll check the value of eax for +- CPUID/0 to see if standard CPUID level 2 is supported. +- According to the table, the only CPU which supports level +- 2 is also the only one which supports extended CPUID levels. +- */ +- "cmpl $0x2, %%eax\n\t" +- "jne MMXtest\n\t" /* Use standard CPUID instead */ +- +- /* Extended CPUID supported (in theory), so get extended +- features */ +- "movl $0x80000001, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%eax\n\t" /* Test for MMX */ +- "jz NotSupported5\n\t" /* MMX not supported */ +- "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ +- "jnz EMMXSupported\n\t" +- "movl $1, %0:\n\n\t" /* MMX Supported */ +- "jmp Return\n\n" +- "EMMXSupported:\n\t" +- "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */ +- "jmp Return\n\t" +- +- +- /* AMD Section */ +- "AMD:\n\t" +- +- /* See if extended CPUID is supported */ +- "movl $0x80000000, %%eax\n\t" +- "cpuid\n\t" +- "cmpl $0x80000000, %%eax\n\t" +- "jl MMXtest\n\t" /* Use standard CPUID instead */ +- +- /* Extended CPUID supported, so get extended features */ +- "movl $0x80000001, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%edx\n\t" /* Test for MMX */ +- "jz NotSupported6\n\t" /* MMX not supported */ +- "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ +- "jnz ThreeDNowSupported\n\t" +- "movl $1, %0:\n\n\t" /* MMX Supported */ +- "jmp Return\n\n" +- "ThreeDNowSupported:\n\t" +- "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */ +- "jmp Return\n\t" +- +- +- /* Intel Section */ +- "Intel:\n\t" +- +- /* Check for MMX */ +- "MMXtest:\n\t" +- "movl $1, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%edx\n\t" /* Test for MMX */ +- "jz NotSupported7\n\t" /* MMX Not supported */ +- "movl $1, %0:\n\n\t" /* MMX Supported */ +- "jmp Return\n\t" +- +- /* Nothing supported */ +- "\nNotSupported1:\n\t" +- "#movl $101, %0:\n\n\t" +- "\nNotSupported2:\n\t" +- "#movl $102, %0:\n\n\t" +- "\nNotSupported3:\n\t" +- "#movl $103, %0:\n\n\t" +- "\nNotSupported4:\n\t" +- "#movl $104, %0:\n\n\t" +- "\nNotSupported5:\n\t" +- "#movl $105, %0:\n\n\t" +- "\nNotSupported6:\n\t" +- "#movl $106, %0:\n\n\t" +- "\nNotSupported7:\n\t" +- "#movl $107, %0:\n\n\t" +- "movl $0, %0:\n\n\t" +- +- "Return:\n\t" +- : "=a" (rval) +- : /* no input */ +- : "eax", "ebx", "ecx", "edx" +- ); +- +- /* Return */ +- return(rval); +-} +- +-/* Function to test if mmx instructions are supported... +-*/ +-inline extern int +-mmx_ok(void) +-{ +- /* Returns 1 if MMX instructions are supported, 0 otherwise */ +- return ( mm_support() & 0x1 ); +-} +- +- +-/* Helper functions for the instruction macros that follow... +- (note that memory-to-register, m2r, instructions are nearly +- as efficient as register-to-register, r2r, instructions; +- however, memory-to-memory instructions are really simulated +- as a convenience, and are only 1/3 as efficient) +-*/ +-#ifdef MMX_TRACE +- +-/* Include the stuff for printing a trace to stderr... +-*/ +- +-#include <stdio.h> +- +-#define mmx_i2r(op, imm, reg) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace.uq = (imm); \ +- printf(#op "_i2r(" #imm "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (imm)); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_m2r(op, mem, reg) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace = (mem); \ +- printf(#op "_m2r(" #mem "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (mem)); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_r2m(op, reg, mem) \ +- { \ +- mmx_t mmx_trace; \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#op "_r2m(" #reg "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- mmx_trace = (mem); \ +- printf(#mem "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %%" #reg ", %0" \ +- : "=X" (mem) \ +- : /* nothing */ ); \ +- mmx_trace = (mem); \ +- printf(#mem "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_r2r(op, regs, regd) \ +- { \ +- mmx_t mmx_trace; \ +- __asm__ __volatile__ ("movq %%" #regs ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#op "_r2r(" #regs "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #regd ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#regd "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ +- __asm__ __volatile__ ("movq %%" #regd ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#regd "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_m2m(op, mems, memd) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace = (mems); \ +- printf(#op "_m2m(" #mems "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- mmx_trace = (memd); \ +- printf(#memd "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ +- #op " %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (memd) \ +- : "X" (mems)); \ +- mmx_trace = (memd); \ +- printf(#memd "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#else +- +-/* These macros are a lot simpler without the tracing... +-*/ +- +-#define mmx_i2r(op, imm, reg) \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (imm) ) +- +-#define mmx_m2r(op, mem, reg) \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (mem)) +- +-#define mmx_r2m(op, reg, mem) \ +- __asm__ __volatile__ (#op " %%" #reg ", %0" \ +- : "=X" (mem) \ +- : /* nothing */ ) +- +-#define mmx_r2r(op, regs, regd) \ +- __asm__ __volatile__ (#op " %" #regs ", %" #regd) +- +-#define mmx_m2m(op, mems, memd) \ +- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ +- #op " %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (memd) \ +- : "X" (mems)) +- +-#endif +- +- +-/* 1x64 MOVe Quadword +- (this is both a load and a store... +- in fact, it is the only way to store) +-*/ +-#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +-#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +-#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +-#define movq(vars, vard) \ +- __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (vard) \ +- : "X" (vars)) +- +- +-/* 1x32 MOVe Doubleword +- (like movq, this is both load and store... +- but is most useful for moving things between +- mmx registers and ordinary registers) +-*/ +-#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +-#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +-#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +-#define movd(vars, vard) \ +- __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ +- "movd %%mm0, %0" \ +- : "=X" (vard) \ +- : "X" (vars)) +- +- +-/* 2x32, 4x16, and 8x8 Parallel ADDs +-*/ +-#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) +-#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) +-#define paddd(vars, vard) mmx_m2m(paddd, vars, vard) +- +-#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) +-#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) +-#define paddw(vars, vard) mmx_m2m(paddw, vars, vard) +- +-#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) +-#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) +-#define paddb(vars, vard) mmx_m2m(paddb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic +-*/ +-#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) +-#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) +-#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) +- +-#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) +-#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) +-#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic +-*/ +-#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) +-#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) +-#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) +- +-#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) +-#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) +-#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) +- +- +-/* 2x32, 4x16, and 8x8 Parallel SUBs +-*/ +-#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) +-#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) +-#define psubd(vars, vard) mmx_m2m(psubd, vars, vard) +- +-#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) +-#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) +-#define psubw(vars, vard) mmx_m2m(psubw, vars, vard) +- +-#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) +-#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) +-#define psubb(vars, vard) mmx_m2m(psubb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic +-*/ +-#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) +-#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) +-#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) +- +-#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) +-#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) +-#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic +-*/ +-#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) +-#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) +-#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) +- +-#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) +-#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) +-#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) +- +- +-/* 4x16 Parallel MULs giving Low 4x16 portions of results +-*/ +-#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) +-#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) +-#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) +- +- +-/* 4x16 Parallel MULs giving High 4x16 portions of results +-*/ +-#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) +-#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) +-#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) +- +- +-/* 4x16->2x32 Parallel Mul-ADD +- (muls like pmullw, then adds adjacent 16-bit fields +- in the multiply result to make the final 2x32 result) +-*/ +-#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) +-#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) +-#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) +- +- +-/* 1x64 bitwise AND +-*/ +-#ifdef BROKEN_PAND +-#define pand_m2r(var, reg) \ +- { \ +- mmx_m2r(pandn, (mmx_t) -1LL, reg); \ +- mmx_m2r(pandn, var, reg); \ +- } +-#define pand_r2r(regs, regd) \ +- { \ +- mmx_m2r(pandn, (mmx_t) -1LL, regd); \ +- mmx_r2r(pandn, regs, regd) \ +- } +-#define pand(vars, vard) \ +- { \ +- movq_m2r(vard, mm0); \ +- mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ +- mmx_m2r(pandn, vars, mm0); \ +- movq_r2m(mm0, vard); \ +- } +-#else +-#define pand_m2r(var, reg) mmx_m2r(pand, var, reg) +-#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) +-#define pand(vars, vard) mmx_m2m(pand, vars, vard) +-#endif +- +- +-/* 1x64 bitwise AND with Not the destination +-*/ +-#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) +-#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) +-#define pandn(vars, vard) mmx_m2m(pandn, vars, vard) +- +- +-/* 1x64 bitwise OR +-*/ +-#define por_m2r(var, reg) mmx_m2r(por, var, reg) +-#define por_r2r(regs, regd) mmx_r2r(por, regs, regd) +-#define por(vars, vard) mmx_m2m(por, vars, vard) +- +- +-/* 1x64 bitwise eXclusive OR +-*/ +-#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) +-#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) +-#define pxor(vars, vard) mmx_m2m(pxor, vars, vard) +- +- +-/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality +- (resulting fields are either 0 or -1) +-*/ +-#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) +-#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) +-#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) +- +-#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) +-#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) +-#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) +- +-#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) +-#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) +-#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) +- +- +-/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than +- (resulting fields are either 0 or -1) +-*/ +-#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) +-#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) +-#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) +- +-#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) +-#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) +-#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) +- +-#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) +-#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) +-#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) +- +- +-/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical +-*/ +-#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) +-#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) +-#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) +-#define psllq(vars, vard) mmx_m2m(psllq, vars, vard) +- +-#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) +-#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) +-#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) +-#define pslld(vars, vard) mmx_m2m(pslld, vars, vard) +- +-#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) +-#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) +-#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) +-#define psllw(vars, vard) mmx_m2m(psllw, vars, vard) +- +- +-/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical +-*/ +-#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) +-#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) +-#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) +-#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) +- +-#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) +-#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) +-#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) +-#define psrld(vars, vard) mmx_m2m(psrld, vars, vard) +- +-#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) +-#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) +-#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) +-#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) +- +- +-/* 2x32 and 4x16 Parallel Shift Right Arithmetic +-*/ +-#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) +-#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) +-#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) +-#define psrad(vars, vard) mmx_m2m(psrad, vars, vard) +- +-#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) +-#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) +-#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) +-#define psraw(vars, vard) mmx_m2m(psraw, vars, vard) +- +- +-/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate +- (packs source and dest fields into dest in that order) +-*/ +-#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) +-#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) +-#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) +- +-#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) +-#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) +-#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) +- +- +-/* 4x16->8x8 PACK and Unsigned Saturate +- (packs source and dest fields into dest in that order) +-*/ +-#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) +-#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) +-#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) +- +- +-/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low +- (interleaves low half of dest with low half of source +- as padding in each result field) +-*/ +-#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) +-#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) +-#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) +- +-#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) +-#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) +-#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) +- +-#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) +-#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) +-#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) +- +- +-/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High +- (interleaves high half of dest with high half of source +- as padding in each result field) +-*/ +-#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) +-#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) +-#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) +- +-#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) +-#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) +-#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) +- +-#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) +-#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) +-#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) +- +- +-/* Empty MMx State +- (used to clean-up when going from mmx to float use +- of the registers that are shared by both; note that +- there is no float-to-mmx operation needed, because +- only the float tag word info is corruptible) +-*/ +-#ifdef MMX_TRACE +- +-#define emms() \ +- { \ +- printf("emms()\n"); \ +- __asm__ __volatile__ ("emms"); \ +- } +- +-#else +- +-#define emms() __asm__ __volatile__ ("emms") +- +-#endif +- +-#endif +- +diff -Naur /home/d4rk/goom2k4-0/src/filter_test/px_py_calc.c /src/filter_test/px_py_calc.c +--- /home/d4rk/goom2k4-0/src/filter_test/px_py_calc.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filter_test/px_py_calc.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,94 +0,0 @@ +-#include "mmx.h" +- +-int testD [] = {0x1200, 0x2011, 0, 0x12, 0x5331, 0x8000}; +-int testS [] = {0x1205, 0x11, 0x4210, 0x412, 0x121, 0x1211}; +- +-int ratios [] = {0x8000, 0x4000, 0x1234, 0x6141, 0xffff, 0}; +- +-int main () { +- int nbERROR = 0; +- int i,j; +- volatile mmx_t ratiox; +- +- volatile mmx_t sortie; +- +- /* creation des variables de test */ +- volatile int buffratio = 0x8000; +- volatile int loop = 0; +- volatile int *buffS; +- volatile int *buffD; +- buffS = malloc (256); +- buffD = malloc (256); +- +- buffS = buffS + (unsigned)buffS % 64; +- buffD = buffD + (unsigned)buffD % 64; +- +- for (j=0;j<6;j++) +- for (i=0;i<3;i++) { +- +- buffratio = ratios[j]; +- +- buffS[0] = testS[i<<1]; +- buffS[1] = testS[(i<<1)+1]; +- +- buffD[0] = testD[i*2]; +- buffD[1] = testD[i*2+1]; +- +- /* code */ +- +- ratiox.d[0] = buffratio; +- ratiox.d[1] = buffratio; +- movq_m2r (ratiox, mm6); +- pslld_i2r (16,mm6); +- +- /* |0hhhhhhh|llllvvvv| +- x |00000000|bbbbbbbb| +- ================= +- |.bl.high|..bl.low| +- + |..bh.low|00000000| +- ================= +- result1 +- */ +- +- /* +- * pre : mm6 = [buffratio<<16|buffratio<<16] +- */ +- +- movq_m2r (buffS[loop],mm0); /* mm0 = S */ +- movq_m2r (buffD[loop],mm1); /* mm1 = D */ +- psubd_r2r (mm0,mm1); /* mm1 = D - S */ +- movq_r2r (mm1, mm2); /* mm2 = D - S */ +- +- pslld_i2r (16,mm1); +- mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ +- pmullw_r2r (mm6, mm2); +- +- paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ +- pslld_i2r (16,mm0); +- +- paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ +- psrld_i2r (16, mm0); +- movq_r2m (mm0, sortie); +- +- /* +- * post : mm0 = S + ((D-S)*buffratio)>>16 +- * modified = mm0,mm1,mm2 +- */ +- +- if ( +- (buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16) != sortie.d[0]) +- | (buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16) != sortie.d[1])) +- { +- nbERROR++; +- printf ("\ns : (0x%08x,0x%08x)\n", buffS[0], buffS[1]); +- printf ("d : (0x%08x,0x%08x)\n", buffD[0], buffD[1]); +- printf ("ratio : (0x%08x,0x%08x)\n", buffratio, buffratio); +- +- printf ("en mmx : (0x%08x,0x%08x)\n", sortie.d[0], sortie.d[1]); +- printf ("en c : (0x%08x,0x%08x)\n", +- buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16), +- buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16)); +- } +- } +- printf ("%d errors\n",nbERROR); +-} +diff -Naur /home/d4rk/goom2k4-0/src/filter_test/zoom_filter_mmx.c /src/filter_test/zoom_filter_mmx.c +--- /home/d4rk/goom2k4-0/src/filter_test/zoom_filter_mmx.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filter_test/zoom_filter_mmx.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,186 +0,0 @@ +- +-#define BUFFPOINTNB 16 +-#define BUFFPOINTMASK 0xffff +-#define BUFFINCR 0xff +- +-#define sqrtperte 16 +-// faire : a % sqrtperte <=> a & pertemask +-#define PERTEMASK 0xf +-// faire : a / sqrtperte <=> a >> PERTEDEC +-#define PERTEDEC 4 +- +-//#define MMX_TRACE +-#include "mmx.h" +- +-void zoom_filter_mmx (int prevX, int prevY, +- unsigned int *expix1, unsigned int *expix2, +- int *lbruS, int *lbruD, int buffratio, +- int precalCoef[16][16]) +-{ +- int bufsize = prevX * prevY; /* taille du buffer */ +- volatile int loop; /* variable de boucle */ +- +- mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ +- mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ +- +- int pos; +- +- volatile mmx_t prevXY; +- volatile mmx_t ratiox; +- volatile mmx_t interpix; +- +- volatile mmx_t mask; /* masque des nombres a virgules */ +- mask.ud[0] = BUFFPOINTMASK; +- mask.ud[1] = BUFFPOINTMASK; +- +- prevXY.ud[0] = (prevX-1)<<PERTEDEC; +- prevXY.ud[1] = (prevY-1)<<PERTEDEC; +- +- pxor_r2r (mm7,mm7); +- +- ratiox.d[0] = buffratio; +- ratiox.d[1] = buffratio; +- movq_m2r (ratiox, mm6); +- pslld_i2r (16,mm6); +- +- for (loop=0; loop<bufsize; loop++) +- { +- /* +- * pre : mm6 = [buffratio<<16|buffratio<<16] +- * post : mm0 = S + ((D-S)*buffratio)>>16 format [X|Y] +- * modified = mm0,mm1,mm2 +- */ +- +- movq_m2r (brutS[loop],mm0); /* mm0 = S */ +- movq_m2r (brutD[loop],mm1); /* mm1 = D */ +- psubd_r2r (mm0,mm1); /* mm1 = D - S */ +- movq_r2r (mm1, mm2); /* mm2 = D - S */ +- +- pslld_i2r (16,mm1); +- mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ +- pmullw_r2r (mm6, mm2); +- +- paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ +- pslld_i2r (16,mm0); +- +- paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ +- psrld_i2r (16, mm0); +- +- /* +- * pre : mm0 : position vector on screen +- * prevXY : coordinate of the lower-right point on screen +- * post : clipped mm0 +- * modified : mm0,mm1 +- */ +- movq_m2r (prevXY,mm1); +- pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient : +- 1111 si prevXY > px +- 0000 si prevXY <= px +- (idem pour y) */ +- pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */ +- +- +- /* +- * pre : mm0 : clipped position on screen +- * post : mm6 : coefs for this position +- * mm1 : X vector [0|X] +- * modif : eax,ebx +- */ +- __asm__ __volatile__ ( +- "movq %%mm0,%%mm1\n" +- "movd %%mm0,%%eax\n" +- "psrlq $32,%%mm1\n" +- "movd %%mm1,%%ebx\n" +- "and $15,%%eax\n" +- "and $15,%%ebx\n" +- "add %0,%%eax\n" +- "movd (%%eax,%%ebx,$16),%%mm6\n" +- ::"X"(precalCoef):"eax","ebx"); +- +- /* +- * pre : mm0 : Y pos [*|Y] +- * mm1 : X pos [*|X] +- * post : eax : absolute position of the source pixel. +- * modif : ebx +- */ +- psrld_i2r (PERTEDEC,mm0); +- psrld_i2r (PERTEDEC,mm1); +- __asm__ __volatile__ ( +- "movd %%mm1,%%eax\n" +-// "movl %1,%%ebx\n" +- "mull %1\n" +- "movd %%mm0,%%ebx\n" +- "addl %%ebx,%%eax\n" +- "movl %%eax,%0\n" +- :"=X"(pos):"X"(prevX):"eax","ebx" +- ); +- +- expix2[loop] = expix1[pos]; +- /* +- * coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; +- * coef en modulo 15 * +- * pos = ((px>>PERTEMASK) + prevX * (py>>PERTEMASK)); +- */ +-// precal + eax + ebx * 16 +- +-// movd_m2r (precalCoef[interpix.d[0]][interpix.d[1]],mm6); +- +- /* recuperation des deux premiers pixels dans mm0 et mm1 */ +-// movq_m2r (/*expix1[pos]*/a, mm0); /* b1-v1-r1-a1-b2-v2-r2-a2 */ +-// movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- +- /* depackage du premier pixel */ +-// punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ +- +-// movq_r2r (mm6, mm5); /* ??-??-??-??-c4-c3-c2-c1 */ +- /* depackage du 2ieme pixel */ +-// punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ +- +- /* extraction des coefficients... */ +-// punpcklbw_r2r (mm5, mm6); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +-// movq_r2r (mm6, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +-// movq_r2r (mm6, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- +-// punpcklbw_r2r (mm5, mm6); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +-// punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- +-// movq_r2r (mm6, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +-// punpcklbw_r2r (mm7, mm6); /* 00-c1-00-c1-00-c1-00-c1 */ +-// punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ +- +- /* multiplication des pixels par les coefficients */ +-// pmullw_r2r (mm6, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ +-// pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ +-// paddw_r2r (mm1, mm0); +- +- /* ...extraction des 2 derniers coefficients */ +-// movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ +-// punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ +-// punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ +- +- /* recuperation des 2 derniers pixels */ +-// movq_m2r (a/*expix1[pos+largeur]*/, mm1); +-// movq_r2r (mm1, mm2); +- +- /* depackage des pixels */ +-// punpcklbw_r2r (mm7, mm1); +-// punpckhbw_r2r (mm7, mm2); +- +- /* multiplication pas les coeffs */ +-// pmullw_r2r (mm4, mm1); +-// pmullw_r2r (mm5, mm2); +- +- /* ajout des valeurs obtenues à la valeur finale */ +-// paddw_r2r (mm1, mm0); +-// paddw_r2r (mm2, mm0); +- +- /* division par 256 = 16+16+16+16, puis repackage du pixel final */ +-// psrlw_i2r (8, mm0); +-// packuswb_r2r (mm7, mm0); +- +-// movd_r2m (mm0,expix2[loop]); +- +- // expix2[loop] = couleur; +- } +- emms(); /* __asm__ __volatile__ ("emms"); */ +-} +diff -Naur /home/d4rk/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c /src/filter_test/zoom_filter_mmx-v0.c +--- /home/d4rk/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/filter_test/zoom_filter_mmx-v0.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,202 +0,0 @@ +- +-#define BUFFPOINTNB 16 +-#define BUFFPOINTMASK 0xffff +-#define BUFFINCR 0xff +- +-#define sqrtperte 16 +-// faire : a % sqrtperte <=> a & pertemask +-#define PERTEMASK 0xf +-// faire : a / sqrtperte <=> a >> PERTEDEC +-#define PERTEDEC 4 +- +-//#define MMX_TRACE +-#include "mmx.h" +- +-void zoom_filter_mmx (int prevX, int prevY, +- unsigned int *expix1, unsigned int *expix2, +- int *lbruS, int *lbruD, int buffratio, +- int precalCoef[16][16]) +-{ +- int bufsize = prevX * prevY; /* taille du buffer */ +- volatile int loop; /* variable de boucle */ +- +- mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ +- mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ +- +- volatile mmx_t prevXY; +- volatile mmx_t ratiox; +- volatile mmx_t interpix; +- +- volatile mmx_t mask; /* masque des nombres a virgules */ +- mask.ud[0] = BUFFPOINTMASK; +- mask.ud[1] = BUFFPOINTMASK; +- +- prevXY.ud[0] = (prevX-1)<<PERTEDEC; +- prevXY.ud[1] = (prevY-1)<<PERTEDEC; +- +- pxor_r2r (mm7,mm7); +- +- ratiox.d[0] = buffratio; +- ratiox.d[1] = buffratio; +- movq_m2r (ratiox, mm6); +- pslld_i2r (16,mm6); +- +- loop=0; +- while (loop<bufsize) +- { +- movq_m2r (ratiox, mm6); +- pslld_i2r (16,mm6); +- +- /* +- * pre : mm6 = [buffratio<<16|buffratio<<16] +- * post : mm0 = S + ((D-S)*buffratio)>>16 format [X|Y] +- * modified = mm0,mm1,mm2 +- */ +- +- __asm__ __volatile__ ( +- "movq %0,%%mm0\n" +- "movq %1,%%mm1\n" +- : :"X"(brutS[loop]),"X"(brutD[loop]) +- ); /* mm0 = S */ +- +- psubd_r2r (mm0,mm1); /* mm1 = D - S */ +- movq_r2r (mm1, mm2); /* mm2 = D - S */ +- +- pslld_i2r (16,mm1); +- mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ +- pmullw_r2r (mm6, mm2); +- +- paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ +- pslld_i2r (16,mm0); +- +- paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ +- psrld_i2r (16, mm0); +- +- /* +- * pre : mm0 : position vector on screen +- * prevXY : coordinate of the lower-right point on screen +- * post : clipped mm0 +- * modified : mm0,mm1,mm2 +- */ +- movq_m2r (prevXY,mm1); +- pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient : +- 1111 si prevXY > px +- 0000 si prevXY <= px +- (idem pour y) */ +- movq_r2r (mm1,mm2); +- punpckldq_r2r (mm1,mm1); +- punpckhdq_r2r (mm2,mm2); +- pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */ +- pand_r2r (mm2, mm0); /* on met a zero la partie qui deborde */ +- +- /* +- * pre : mm0 : clipped position on screen +- * post : mm6 : coefs for this position +- * mm1 : X vector [0|X] +- * modif : eax,ebx +- */ +- __asm__ __volatile__ ( +- "movq %%mm0,%%mm1\n" +- "movd %%mm0,%%ebx\n" +- "psrlq $32,%%mm1\n" +- "movd %%mm1,%%eax\n" +- "andl $15,%%eax\n" +- "andl $15,%%ebx\n" +- +- "shll $2,%%eax\n" +- "shll $3,%%ebx\n" +- +- "addl %0,%%eax\n" +- +- "movd (%%eax,%%ebx,8),%%mm6\n" +- ::"X"(precalCoef):"eax","ebx"); +- +- /* +- * pre : mm0 : Y pos [*|Y] +- * mm1 : X pos [*|X] +- * post : eax : absolute position of the source pixel. +- * modif : ebx +- */ +- psrld_i2r (PERTEDEC,mm0); +- psrld_i2r (PERTEDEC,mm1); +- __asm__ __volatile__ ( +- "movd %%mm1,%%eax\n" +- "mull %1\n" +- "movd %%mm0,%%ebx\n" +- "addl %%ebx,%%eax\n" +- "movl %0,%%ebx\n" +- "movq (%%ebx,%%eax,4),%%mm0\n" +- "addl %1,%%eax\n" +- "movq (%%ebx,%%eax,4),%%mm2\n" +- +- : : "X"(expix1), "X"(prevX):"eax","ebx" +- ); +- +- /* +- * coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; +- * coef en modulo 15 * +- * pos = ((px>>PERTEMASK) + prevX * (py>>PERTEMASK)); +- */ +- +- /* recuperation des deux premiers pixels dans mm0 et mm1 */ +-// movq_m2r (expix1[pos], mm0); /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- +- /* recuperation des 2 derniers pixels */ +-// movq_m2r (expix1[pos+prevX], mm2); +- +- /* depackage du premier pixel */ +- punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ +- +- movq_r2r (mm6, mm5); /* ??-??-??-??-c4-c3-c2-c1 */ +- /* depackage du 2ieme pixel */ +- punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ +- +- /* extraction des coefficients... */ +- punpcklbw_r2r (mm5, mm6); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- movq_r2r (mm6, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- movq_r2r (mm6, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- +- punpcklbw_r2r (mm5, mm6); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- +- movq_r2r (mm6, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- punpcklbw_r2r (mm7, mm6); /* 00-c1-00-c1-00-c1-00-c1 */ +- punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ +- +- /* multiplication des pixels par les coefficients */ +- pmullw_r2r (mm6, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ +- pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ +- paddw_r2r (mm1, mm0); +- +- /* ...extraction des 2 derniers coefficients */ +- movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ +- punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ +- +- /* recuperation des 2 derniers pixels */ +- movq_r2r (mm2, mm1); +- +- /* depackage des pixels */ +- punpcklbw_r2r (mm7, mm1); +- punpckhbw_r2r (mm7, mm2); +- +- /* multiplication pas les coeffs */ +- pmullw_r2r (mm4, mm1); +- pmullw_r2r (mm5, mm2); +- +- /* ajout des valeurs obtenues à la valeur finale */ +- paddw_r2r (mm1, mm0); +- paddw_r2r (mm2, mm0); +- +- /* division par 256 = 16+16+16+16, puis repackage du pixel final */ +- psrlw_i2r (8, mm0); +- packuswb_r2r (mm7, mm0); +- +- movd_r2m (mm0,expix2[loop]); +- +- // expix2[loop] = couleur; +- ++loop; +- } +- emms(); /* __asm__ __volatile__ ("emms"); */ +-} +diff -Naur /home/d4rk/goom2k4-0/src/flying_stars_fx.c /src/flying_stars_fx.c +--- /home/d4rk/goom2k4-0/src/flying_stars_fx.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/flying_stars_fx.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,314 +0,0 @@ +-#include "goom_fx.h" +-#include "goom_plugin_info.h" +-#include "goom_tools.h" +- +-#include "mathtools.h" +- +-/* TODO:-- FAIRE PROPREMENT... BOAH... */ +-#define NCOL 15 +- +-/*static const int colval[] = { +-0xfdf6f5, +-0xfae4e4, +-0xf7d1d1, +-0xf3b6b5, +-0xefa2a2, +-0xec9190, +-0xea8282, +-0xe87575, +-0xe46060, +-0xe14b4c, +-0xde3b3b, +-0xdc2d2f, +-0xd92726, +-0xd81619, +-0xd50c09, +-0 +-}; +-*/ +-static const int colval[] = { +- 0x1416181a, +- 0x1419181a, +- 0x141f181a, +- 0x1426181a, +- 0x142a181a, +- 0x142f181a, +- 0x1436181a, +- 0x142f1819, +- 0x14261615, +- 0x13201411, +- 0x111a100a, +- 0x0c180508, +- 0x08100304, +- 0x00050101, +- 0x0 +-}; +- +- +-/* The different modes of the visual FX. +- * Put this values on fx_mode */ +-#define FIREWORKS_FX 0 +-#define RAIN_FX 1 +-#define FOUNTAIN_FX 2 +-#define LAST_FX 3 +- +-typedef struct _FS_STAR { +- float x,y; +- float vx,vy; +- float ax,ay; +- float age,vage; +-} Star; +- +-typedef struct _FS_DATA{ +- +- int fx_mode; +- int nbStars; +- +- int maxStars; +- Star *stars; +- +- float min_age; +- float max_age; +- +- PluginParam min_age_p; +- PluginParam max_age_p; +- PluginParam nbStars_p; +- PluginParam nbStars_limit_p; +- PluginParam fx_mode_p; +- +- PluginParameters params; +-} FSData; +- +-static void fs_init(VisualFX *_this, PluginInfo *info) { +- +- FSData *data; +- data = (FSData*)malloc(sizeof(FSData)); +- +- data->fx_mode = FIREWORKS_FX; +- data->maxStars = 4096; +- data->stars = (Star*)malloc(data->maxStars * sizeof(Star)); +- data->nbStars = 0; +- +- data->max_age_p = secure_i_param ("Fireworks Smallest Bombs"); +- IVAL(data->max_age_p) = 80; +- IMIN(data->max_age_p) = 0; +- IMAX(data->max_age_p) = 100; +- ISTEP(data->max_age_p) = 1; +- +- data->min_age_p = secure_i_param ("Fireworks Largest Bombs"); +- IVAL(data->min_age_p) = 99; +- IMIN(data->min_age_p) = 0; +- IMAX(data->min_age_p) = 100; +- ISTEP(data->min_age_p) = 1; +- +- data->nbStars_limit_p = secure_i_param ("Max Number of Particules"); +- IVAL(data->nbStars_limit_p) = 512; +- IMIN(data->nbStars_limit_p) = 0; +- IMAX(data->nbStars_limit_p) = data->maxStars; +- ISTEP(data->nbStars_limit_p) = 64; +- +- data->fx_mode_p = secure_i_param ("FX Mode"); +- IVAL(data->fx_mode_p) = data->fx_mode; +- IMIN(data->fx_mode_p) = 1; +- IMAX(data->fx_mode_p) = 3; +- ISTEP(data->fx_mode_p) = 1; +- +- data->nbStars_p = secure_f_feedback ("Number of Particules (% of Max)"); +- +- data->params = plugin_parameters ("Particule System", 7); +- data->params.params[0] = &data->fx_mode_p; +- data->params.params[1] = &data->nbStars_limit_p; +- data->params.params[2] = 0; +- data->params.params[3] = &data->min_age_p; +- data->params.params[4] = &data->max_age_p; +- data->params.params[5] = 0; +- data->params.params[6] = &data->nbStars_p; +- +- _this->params = &data->params; +- _this->fx_data = (void*)data; +-} +- +-static void fs_free(VisualFX *_this) { +- free (_this->fx_data); +-} +- +- +-/** +- * Cree une nouvelle 'bombe', c'est a dire une particule appartenant a une fusee d'artifice. +- */ +-static void addABomb (FSData *fs, int mx, int my, float radius, float vage, float gravity, PluginInfo *info) { +- +- int i = fs->nbStars; +- float ro; +- int theta; +- +- if (fs->nbStars >= fs->maxStars) +- return; +- fs->nbStars++; +- +- fs->stars[i].x = mx; +- fs->stars[i].y = my; +- +- ro = radius * (float)goom_irand(info->gRandom,100) / 100.0f; +- ro *= (float)goom_irand(info->gRandom,100)/100.0f + 1.0f; +- theta = goom_irand(info->gRandom,256); +- +- fs->stars[i].vx = ro * cos256[theta]; +- fs->stars[i].vy = -0.2f + ro * sin256[theta]; +- +- fs->stars[i].ax = 0; +- fs->stars[i].ay = gravity; +- +- fs->stars[i].age = 0; +- if (vage < fs->min_age) +- vage=fs->min_age; +- fs->stars[i].vage = vage; +-} +- +- +-/** +- * Met a jour la position et vitesse d'une particule. +- */ +-static void updateStar (Star *s) { +- s->x+=s->vx; +- s->y+=s->vy; +- s->vx+=s->ax; +- s->vy+=s->ay; +- s->age+=s->vage; +-} +- +- +-/** +- * Ajoute de nouvelles particules au moment d'un evenement sonore. +- */ +-static void fs_sound_event_occured(VisualFX *_this, PluginInfo *info) { +- +- FSData *data = (FSData*)_this->fx_data; +- int i; +- +- int max = (int)((1.0f+info->sound.goomPower)*goom_irand(info->gRandom,150)) + 100; +- float radius = (1.0f+info->sound.goomPower) * (float)(goom_irand(info->gRandom,150)+50)/300; +- int mx; +- int my; +- float vage, gravity = 0.02f; +- +- switch (data->fx_mode) { +- case FIREWORKS_FX: +- { +- double dx,dy; +- do { +- mx = goom_irand(info->gRandom,info->screen.width); +- my = goom_irand(info->gRandom,info->screen.height); +- dx = (mx - info->screen.width/2); +- dy = (my - info->screen.height/2); +- } while (dx*dx + dy*dy < (info->screen.height/2)*(info->screen.height/2)); +- vage = data->max_age * (1.0f - info->sound.goomPower); +- } +- break; +- case RAIN_FX: +- mx = goom_irand(info->gRandom,info->screen.width); +- if (mx > info->screen.width/2) +- mx = info->screen.width; +- else +- mx = 0; +- my = -(info->screen.height/3)-goom_irand(info->gRandom,info->screen.width/3); +- radius *= 1.5; +- vage = 0.002f; +- break; +- case FOUNTAIN_FX: +- my = info->screen.height+2; +- vage = 0.001f; +- radius += 1.0f; +- mx = info->screen.width / 2; +- gravity = 0.04f; +- break; +- default: +- return; +- /* my = i R A N D (info->screen.height); vage = 0.01f; */ +- } +- +- radius *= info->screen.height / 200.0f; /* why 200 ? because the FX was developped on 320x200 */ +- max *= info->screen.height / 200.0f; +- +- if (info->sound.timeSinceLastBigGoom < 1) { +- radius *= 1.5; +- max *= 2; +- } +- for (i=0;i<max;++i) +- addABomb (data,mx,my,radius,vage,gravity,info); +-} +- +- +-/** +- * Main methode of the FX. +- */ +-static void fs_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) { +- +- int i; +- int col; +- FSData *data = (FSData*)_this->fx_data; +- +- /* Get the new parameters values */ +- data->min_age = 1.0f - (float)IVAL(data->min_age_p)/100.0f; +- data->max_age = 1.0f - (float)IVAL(data->max_age_p)/100.0f; +- FVAL(data->nbStars_p) = (float)data->nbStars / (float)data->maxStars; +- data->nbStars_p.change_listener(&data->nbStars_p); +- data->maxStars = IVAL(data->nbStars_limit_p); +- data->fx_mode = IVAL(data->fx_mode_p); +- +- /* look for events */ +- if (info->sound.timeSinceLastGoom < 1) { +- fs_sound_event_occured(_this, info); +- if (goom_irand(info->gRandom,20)==1) { +- IVAL(data->fx_mode_p) = goom_irand(info->gRandom,(LAST_FX*3)); +- data->fx_mode_p.change_listener(&data->fx_mode_p); +- } +- } +- +- /* update particules */ +- for (i=0;i<data->nbStars;++i) { +- updateStar(&data->stars[i]); +- +- /* dead particule */ +- if (data->stars[i].age>=NCOL) +- continue; +- +- /* choose the color of the particule */ +- col = colval[(int)data->stars[i].age]; +- +- /* draws the particule */ +- info->methods.draw_line(dest,(int)data->stars[i].x,(int)data->stars[i].y, +- (int)(data->stars[i].x-data->stars[i].vx*6), +- (int)(data->stars[i].y-data->stars[i].vy*6), +- col, +- (int)info->screen.width, (int)info->screen.height); +- info->methods.draw_line(dest,(int)data->stars[i].x,(int)data->stars[i].y, +- (int)(data->stars[i].x-data->stars[i].vx*2), +- (int)(data->stars[i].y-data->stars[i].vy*2), +- col, +- (int)info->screen.width, (int)info->screen.height); +- } +- +- /* look for dead particules */ +- for (i=0;i<data->nbStars;) { +- +- if ((data->stars[i].x > info->screen.width + 64) +- ||((data->stars[i].vy>=0)&&(data->stars[i].y - 16*data->stars[i].vy > info->screen.height)) +- ||(data->stars[i].x < -64) +- ||(data->stars[i].age>=NCOL)) { +- data->stars[i] = data->stars[data->nbStars-1]; +- data->nbStars--; +- } +- else ++i; +- } +-} +- +-VisualFX flying_star_create(void) { +- VisualFX vfx = { +- init: fs_init, +- free: fs_free, +- apply: fs_apply, +- fx_data: 0 +- }; +- return vfx; +-} +diff -Naur /home/d4rk/goom2k4-0/src/gfontlib.c /src/gfontlib.c +--- /home/d4rk/goom2k4-0/src/gfontlib.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/gfontlib.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,229 +0,0 @@ +-#include "goom_config.h" +-#include "gfontrle.h" +-#include "gfontlib.h" +-#include <string.h> +-#include <stdlib.h> +- +-static Pixel ***font_chars; +-static int *font_width; +-static int *font_height; +-static Pixel ***small_font_chars; +-static int *small_font_width; +-static int *small_font_height; +- +-void gfont_load (void) { +- unsigned char *gfont; +- unsigned int i = 0, j = 0; +- unsigned int nba = 0; +- unsigned int current = 32; +- int *font_pos; +- /* decompress le rle */ +- +- +- +- gfont = malloc (the_font.width*the_font.height*the_font.bytes_per_pixel); +- while (i<the_font.rle_size) { +- unsigned char c = the_font.rle_pixel [i++]; +- if (c == 0) { +- unsigned int nb = the_font.rle_pixel [i++]; +- while (nb--) +- gfont[j++] = 0; +- } +- else +- gfont [j++] = c; +- } +- +- /* determiner les positions de chaque lettre. */ +- +- font_height = calloc (256,sizeof(int)); +- small_font_height = calloc (256,sizeof(int)); +- font_width = calloc (256,sizeof(int)); +- small_font_width = calloc (256,sizeof(int)); +- font_chars = calloc (256,sizeof(int**)); +- small_font_chars = calloc (256,sizeof(int**)); +- font_pos = calloc (256,sizeof(int)); +- +- for (i=0;i<the_font.width;i++) { +- unsigned char a = gfont [i*4 + 3]; +- if (a) +- nba ++; +- else +- nba = 0; +- if (nba == 2) { +- font_width [current] = i - font_pos [current]; +- small_font_width [current] = font_width [current]/2; +- font_pos [++current] = i; +- font_height [current] = the_font.height - 2; +- small_font_height [current] = font_height [current]/2; +- } +- } +- font_pos [current] = 0; +- font_height [current] = 0; +- small_font_height [current] = 0; +- +- /* charger les lettres et convertir au format de la machine */ +- +- for (i=33;i<current;i++) { +- int x; int y; +- font_chars [i] = malloc (font_height[i]*sizeof(int *)); +- small_font_chars [i] = malloc (font_height[i]*sizeof(int *)/2); +- for (y = 0; y < font_height[i]; y++) { +- font_chars [i][y] = malloc (font_width[i]*sizeof(int)); +- for (x = 0; x < font_width[i]; x++) { +- unsigned int r,g,b,a; +- r = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4)]; +- g = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+1)]; +- b = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+2)]; +- a = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+3)]; +- font_chars [i][y][x].val = +- (r<<(ROUGE*8))|(g<<(VERT*8))|(b<<(BLEU*8))|(a<<(ALPHA*8)); +- } +- } +- for (y = 0; y < font_height[i]/2; y++) { +- small_font_chars [i][y] = malloc (font_width[i]*sizeof(int)/2); +- for (x = 0; x < font_width[i]/2; x++) { +- unsigned int r1,g1,b1,a1,r2,g2,b2,a2,r3,g3,b3,a3,r4,g4,b4,a4; +- r1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4)]; +- g1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+1)]; +- b1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+2)]; +- a1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+3)]; +- r2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+4)]; +- g2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+5)]; +- b2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+6)]; +- a2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+7)]; +- r3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4)]; +- g3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+1)]; +- b3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+2)]; +- a3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+3)]; +- r4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+4)]; +- g4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+5)]; +- b4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+6)]; +- a4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+7)]; +- small_font_chars [i][y][x].val = +- (((r1 + r2 + r3 + r4)>>2)<<(ROUGE*8))| +- (((g1 + g2 + g3 + g4)>>2)<<(VERT*8))| +- (((b1 + b2 + b3 + b4)>>2)<<(BLEU*8))| +- (((a1 + a2 + a3 + a4)>>2)<<(ALPHA*8)); +- } +- } +- } +- +- /* definir les lettres restantes */ +- +- for (i=0;i<256;i++) { +- if (font_chars[i]==0) { +- font_chars[i]=font_chars[42]; +- small_font_chars[i]=small_font_chars[42]; +- font_width[i]=font_width[42]; +- font_pos[i]=font_pos[42]; +- font_height[i]=font_height[42]; +- small_font_width[i]=small_font_width[42]; +- small_font_height[i]=small_font_height[42]; +- } +- } +- +- font_width [32] = (the_font.height / 2) - 1; +- small_font_width [32] = font_width [32]/2; +- font_chars [32] = 0; +- small_font_chars [32] = 0; +-} +- +-void goom_draw_text (Pixel * buf,int resolx,int resoly, +- int x, int y, +- const char *str, float charspace, int center) { +- float fx = (float) x; +- int fin = 0; +- +- Pixel ***cur_font_chars; +- int *cur_font_width; +- int *cur_font_height; +- +- if (resolx>320) +- { +- /* printf("use big\n"); */ +- cur_font_chars = font_chars; +- cur_font_width = font_width; +- cur_font_height = font_height; +- } +- else +- { +- /* printf ("use small\n"); */ +- cur_font_chars = small_font_chars; +- cur_font_width = small_font_width; +- cur_font_height = small_font_height; +- } +- +- if (cur_font_chars == NULL) +- return ; +- +- if (center) { +- unsigned char *tmp = (unsigned char*)str; +- float lg = -charspace; +- +- while (*tmp != '\0') +- lg += cur_font_width[*(tmp++)] + charspace; +- +- fx -= lg / 2; +- } +- +- while (!fin) { +- unsigned char c = *str; +- +- x = (int) fx; +- +- if (c == '\0') +- fin = 1; +- else if (cur_font_chars[c]==0) { +- fx += cur_font_width[c] + charspace; +- } +- else { +- int xx, yy; +- int xmin = x; +- int xmax = x + cur_font_width[c]; +- int ymin = y - cur_font_height[c]; +- int ymax = y; +- +- yy = ymin; +- +- if (xmin < 0) +- xmin = 0; +- +- if (xmin >= resolx - 1) +- return; +- +- if (xmax >= (int) resolx) +- xmax = resolx - 1; +- +- if (yy < 0) +- yy = 0; +- +- if (yy <= (int) resoly - 1) { +- if (ymax >= (int) resoly - 1) +- ymax = resoly - 1; +- +- for (; yy < ymax; yy++) +- for (xx = xmin; xx < xmax; xx++) +- { +- Pixel color = cur_font_chars[c][yy - ymin][xx - x]; +- Pixel transparency; +- transparency.val = color.val & A_CHANNEL; +- if (transparency.val) +- { +- if (transparency.val==A_CHANNEL) buf[yy * resolx + xx] = color; +- else +- { +- Pixel back = buf[yy * resolx + xx]; +- unsigned int a1 = color.channels.a; +- unsigned int a2 = 255 - a1; +- buf[yy * resolx + xx].channels.r = (unsigned char)((((unsigned int)color.channels.r * a1) + ((unsigned int)back.channels.r * a2)) >> 8); +- buf[yy * resolx + xx].channels.g = (unsigned char)((((unsigned int)color.channels.g * a1) + ((unsigned int)back.channels.g * a2)) >> 8); +- buf[yy * resolx + xx].channels.b = (unsigned char)((((unsigned int)color.channels.b * a1) + ((unsigned int)back.channels.b * a2)) >> 8); +- } +- } +- } +- } +- fx += cur_font_width[c] + charspace; +- } +- str++; +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/gfontlib.h /src/gfontlib.h +--- /home/d4rk/goom2k4-0/src/gfontlib.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/gfontlib.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,10 +0,0 @@ +-#ifndef _GFONTLIB_H +-#define _GFONTLIB_H +- +-#include "goom_graphic.h" +- +-void gfont_load (void); +-void goom_draw_text (Pixel * buf,int resolx,int resoly, int x, int y, +- const char *str, float chspace, int center); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/gfontrle.c /src/gfontrle.c +--- /home/d4rk/goom2k4-0/src/gfontrle.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/gfontrle.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,2500 +0,0 @@ +-/* RGBA C-Source image dump (with zRLE compression) */ +- +-const struct { +- unsigned int width; +- unsigned int height; +- unsigned int bytes_per_pixel; +- unsigned int rle_size; +- unsigned char rle_pixel [49725]; +-} the_font = { +-1277, 21, 4, 49725, { +-121,17,164,255,121,17,164,255,121,17,164,255,121,17,164,255,0,8,121,17, +-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164, +-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0, +-1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1, +-121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121, +-17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17, +-164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164, +-255,121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255, +-121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255,121, +-17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164,255,121,17, +-164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +-255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255, +-121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +-17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +-164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +-255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +-0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +-44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +-121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +-17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17, +-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +-1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1, +-121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +-17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17, +-164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164, +-255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255, +-121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121, +-17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17, +-164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +-255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +-121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +-17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +-164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +-255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +-0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +-36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +-121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +-17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17, +-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +-1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1, +-121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121, +-17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +-164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164, +-255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +-121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +-17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17, +-164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +-255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +-121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +-17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +-164,255,0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +-255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +-0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +-44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20, +-121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121, +-17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20,121,17, +-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164, +-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0, +-1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1, +-121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +-17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +-164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164, +-255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +-121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +-17,164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17, +-164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +-255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +-121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +-17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +-164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +-255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +-0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +-44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +-121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +-17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17, +-164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +-0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +-1,121,17,164,255,121,17,164,255,121,17,164,255,0,28,121,17,164,0,1, +-121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +-17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +-164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164, +-255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +-121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +-17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17, +-164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164, +-255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255, +-121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +-17,164,255,121,17,164,255,121,17,164,255,0,56,121,17,164,0,1,121,17, +-164,255,121,17,164,255,13,4,17,0,1,13,4,17,0,1,13,4,17,0, +-1,16,5,22,0,13,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,25,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,25,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,33,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +-49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,33,16,5,22,0, +-1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +-1,16,5,22,0,33,16,5,22,0,1,14,4,19,0,1,13,4,17,0, +-1,13,4,17,0,1,16,5,22,0,61,16,5,22,0,1,14,4,19,0, +-255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +-255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +-25,8,6,3,57,10,8,5,85,9,7,4,76,0,12,8,6,3,54,9, +-8,4,96,9,7,4,85,0,12,8,6,3,57,9,8,4,96,9,7,4, +-85,0,24,8,6,3,57,11,8,4,85,9,7,4,79,0,12,8,6,3, +-51,10,8,5,85,8,6,3,85,0,40,8,6,3,57,11,8,4,85,8, +-6,3,85,0,32,8,6,3,57,10,8,5,85,9,7,4,85,0,28,5, +-4,2,14,8,6,3,85,9,7,4,85,0,24,8,6,3,74,9,7,4, +-113,8,6,3,167,8,6,3,139,9,7,4,85,5,4,2,14,0,36,8, +-6,3,57,9,8,4,110,9,7,4,85,0,24,5,4,2,20,9,7,4, +-85,9,8,4,85,0,16,9,8,4,57,9,8,4,85,6,5,3,48,0, +-255,0,29,5,4,2,17,8,6,3,85,9,7,4,82,0,20,5,4,2, +-3,8,6,3,85,9,7,4,93,8,6,3,153,8,6,3,161,8,6,3, +-110,9,8,4,85,8,6,3,85,6,5,3,31,0,32,5,4,2,3,8, +-6,3,85,10,8,5,85,10,7,5,85,0,36,5,4,2,57,8,6,3, +-85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3, +-108,8,6,3,85,6,5,3,71,0,24,5,4,2,42,8,6,3,85,9, +-7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3,108,8, +-6,3,85,6,5,3,71,0,48,5,4,2,3,8,6,3,85,9,8,4, +-85,9,7,4,74,0,16,8,6,3,42,9,7,4,85,8,6,3,85,9, +-7,4,85,8,6,3,125,8,6,3,170,7,6,4,170,9,7,4,170,12, +-9,7,170,19,14,10,170,19,13,10,142,8,6,5,28,0,16,5,4,2, +-51,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3, +-164,8,6,3,108,8,6,3,85,6,5,3,71,0,20,10,8,5,57,9, +-7,4,170,8,6,3,170,8,6,3,170,8,6,3,161,8,6,3,142,9, +-7,4,96,9,7,4,85,8,6,3,85,9,7,4,85,9,7,4,74,0, +-20,5,4,2,42,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3, +-170,8,6,3,164,8,6,3,108,8,6,3,85,6,5,3,76,0,24,8, +-6,5,82,10,8,7,133,12,9,7,170,15,11,8,170,15,11,8,170,15, +-11,8,170,13,10,8,170,10,8,7,161,10,8,7,85,6,5,5,28,0, +-96,8,6,3,74,9,8,4,85,8,6,3,57,0,68,7,6,4,28,9, +-7,4,85,9,7,4,85,5,4,2,17,0,40,5,4,2,42,8,6,3, +-85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3, +-108,8,6,3,85,6,5,3,85,0,24,8,6,5,85,10,8,7,133,12, +-9,7,170,15,10,8,170,15,11,8,170,15,11,8,170,13,10,8,170,10, +-8,7,150,8,6,5,62,0,24,8,6,5,82,10,8,7,133,12,9,7, +-170,15,10,8,170,14,10,7,170,9,7,4,170,8,6,5,147,10,8,5, +-85,7,6,4,85,5,4,4,3,0,16,12,9,7,57,11,8,6,161,9, +-7,6,170,10,8,7,170,13,10,8,170,14,10,7,170,13,10,8,170,12, +-9,7,170,10,8,7,156,10,8,7,85,6,5,5,25,0,20,6,5,3, +-57,8,7,5,85,9,7,4,110,9,7,4,170,10,8,5,170,10,8,5, +-170,11,8,6,170,10,8,7,150,10,8,7,85,6,5,5,25,0,16,15, +-11,8,57,11,8,6,170,9,7,6,170,10,8,7,170,13,10,8,170,15, +-11,8,170,15,11,8,170,13,10,8,170,10,8,7,159,10,8,7,85,6, +-5,5,25,0,16,15,11,8,59,11,9,6,170,9,7,4,125,10,8,5, +-85,8,6,3,133,8,6,3,167,8,6,3,170,8,6,3,170,9,8,4, +-113,0,16,8,6,3,42,10,8,5,85,10,7,5,85,9,7,4,125,10, +-8,5,170,12,10,7,170,14,11,7,170,19,14,10,170,19,14,10,142,8, +-6,5,28,0,16,8,6,5,82,10,8,7,133,12,9,7,170,15,11,8, +-170,15,11,8,170,15,11,8,170,13,10,8,170,10,8,7,161,10,8,7, +-85,6,5,5,25,0,16,12,10,7,74,14,10,7,170,12,9,7,139,7, +-6,4,28,0,16,10,8,7,110,14,10,7,170,13,10,8,125,0,16,13, +-10,8,71,15,11,8,170,13,10,8,130,5,5,4,8,0,44,11,8,6, +-85,9,7,4,170,10,8,5,93,0,16,12,9,7,57,10,8,5,167,11, +-8,6,110,6,5,3,8,0,16,11,8,6,57,10,7,5,159,11,8,6, +-102,0,16,8,6,3,51,10,8,5,85,9,7,4,85,0,40,10,7,5, +-57,11,9,6,85,7,6,4,57,0,28,7,5,4,28,10,8,5,85,11, +-8,6,85,0,16,8,6,3,48,10,8,5,85,8,6,3,85,0,20,8, +-6,3,57,11,8,4,85,9,7,4,79,0,20,5,4,2,45,8,6,3, +-85,9,7,4,85,9,7,4,88,9,7,4,108,9,8,4,93,9,7,4, +-85,8,6,3,85,6,5,3,74,0,20,8,6,3,45,9,7,4,85,8, +-6,3,85,9,7,4,85,8,6,3,125,8,6,3,170,8,6,3,164,8, +-6,3,108,8,6,3,85,6,5,3,74,0,24,6,5,3,57,8,7,5, +-85,10,8,5,85,9,7,4,119,8,6,3,142,9,7,4,130,10,8,5, +-91,10,7,5,85,6,5,3,85,0,20,9,7,4,57,10,8,5,85,10, +-7,5,85,10,8,5,85,8,6,3,144,8,6,3,170,8,6,3,164,8, +-6,3,108,8,6,3,85,6,5,3,71,0,24,5,4,2,45,8,6,3, +-85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,9,7,4, +-105,8,6,3,85,6,5,3,74,0,20,11,8,4,59,9,7,4,170,8, +-6,3,164,9,7,4,91,8,6,3,85,8,6,3,85,8,6,3,85,9, +-7,4,85,8,6,3,142,9,6,4,170,9,8,4,116,0,16,8,6,3, +-48,10,8,5,85,9,7,4,85,0,20,8,6,3,57,11,8,4,85,9, +-7,4,76,0,16,8,6,3,48,10,8,5,85,9,7,4,85,0,20,8, +-6,3,57,11,8,4,85,9,7,4,76,0,16,8,6,3,48,10,8,5, +-85,9,7,4,85,0,28,8,6,3,57,11,8,4,85,9,7,4,76,0, +-16,8,6,3,54,9,8,4,96,9,7,4,85,0,20,8,6,3,57,9, +-8,4,96,9,7,4,85,0,16,10,8,5,57,10,7,5,153,10,8,5, +-93,0,20,10,8,7,93,14,11,7,170,13,10,8,136,0,16,11,8,6, +-91,11,8,6,170,9,7,4,170,9,7,4,170,8,6,5,170,8,6,3, +-119,9,7,4,85,8,6,3,85,8,6,3,85,9,7,4,85,9,7,4, +-76,0,16,8,6,3,42,9,7,4,85,8,6,3,85,8,6,3,122,9, +-8,4,102,0,16,8,6,3,51,9,7,4,85,6,5,3,45,0,40,12, +-8,5,57,8,6,3,156,10,7,5,93,11,8,6,85,11,8,6,85,0, +-28,6,5,5,14,13,10,8,85,8,7,5,45,0,80,10,8,5,57,10, +-7,5,156,10,8,5,96,0,76,9,7,4,57,10,8,5,93,10,8,5, +-85,0,140,10,8,7,110,13,10,8,170,12,9,7,133,5,5,4,6,0, +-84,8,6,5,79,10,8,7,127,13,10,8,170,16,12,9,142,8,7,5, +-28,0,72,8,6,3,57,10,8,5,85,9,6,4,85,0,48,15,11,8, +-113,25,18,12,170,20,15,11,142,8,7,5,28,0,28,15,11,8,130,22, +-16,11,170,20,15,11,142,7,6,6,23,0,12,13,10,8,68,12,9,7, +-170,11,8,6,116,6,5,3,8,0,44,12,9,7,82,15,10,8,170,13, +-10,8,130,5,5,4,8,0,255,0,197,6,5,3,57,8,6,3,85,0, +-255,0,149,5,4,2,6,8,6,3,85,8,6,3,156,9,8,4,113,0, +-16,8,6,3,48,9,8,4,91,9,7,4,76,0,16,10,8,5,57,9, +-6,4,170,8,6,3,99,5,4,2,34,0,36,8,6,3,71,9,8,4, +-93,9,8,4,96,8,6,3,85,6,5,3,45,0,12,8,6,3,76,0, +-44,8,6,3,57,58,31,9,255,93,50,12,255,88,45,11,255,12,10,5, +-113,0,4,7,6,4,28,54,29,9,255,93,46,12,255,88,45,11,255,12, +-9,5,122,0,4,7,5,4,37,54,29,9,255,93,46,12,255,88,45,11, +-255,14,10,5,142,0,16,8,6,3,85,58,31,9,255,93,50,12,255,88, +-44,11,255,9,7,4,170,0,4,5,4,2,85,52,28,9,255,93,48,12, +-255,88,44,11,255,12,10,5,170,0,32,7,6,4,85,58,31,9,255,93, +-50,12,255,88,45,11,255,12,9,5,170,0,24,8,6,3,57,58,31,9, +-255,93,50,12,255,88,45,11,255,14,10,5,142,0,20,6,5,3,28,19, +-12,6,227,76,37,11,255,88,45,11,255,14,10,5,139,0,16,9,8,4, +-170,69,35,10,255,92,47,11,255,92,47,11,255,88,45,11,255,88,45,11, +-255,16,11,5,227,7,5,4,28,0,28,8,6,3,57,58,31,9,255,93, +-46,12,255,88,45,11,255,14,10,5,142,0,16,6,5,3,28,19,12,6, +-227,82,39,11,255,92,47,11,255,14,10,5,105,0,8,7,5,4,20,54, +-29,9,255,100,50,13,255,30,19,7,255,8,6,3,85,0,255,0,21,6, +-5,3,28,19,12,6,227,76,37,11,255,88,45,11,255,14,10,5,130,0, +-12,7,6,4,65,17,11,6,227,71,37,10,255,88,45,11,255,92,47,11, +-255,92,47,11,255,88,45,11,255,88,44,11,255,88,44,11,255,25,16,6, +-255,8,6,3,142,0,24,7,5,4,85,17,12,6,229,77,39,12,255,107, +-51,14,255,113,55,16,255,20,14,9,178,0,28,14,11,7,170,29,18,8, +-255,74,39,11,255,88,45,11,255,88,45,11,255,92,47,11,255,92,47,11, +-255,88,45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,5,4, +-23,0,12,9,7,4,170,26,17,6,255,74,39,11,255,88,45,11,255,88, +-45,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88,44,11,255,41, +-24,8,255,12,9,5,227,6,5,3,28,0,36,6,5,3,85,16,11,5, +-227,71,37,10,255,88,45,11,255,88,44,11,255,12,10,5,113,0,8,8, +-6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,88,45,11,255,92, +-46,13,255,100,52,13,255,109,53,16,255,121,63,20,255,158,74,23,255,180, +-88,27,255,183,90,28,255,26,17,11,142,0,12,10,7,5,170,26,17,6, +-255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11,255,92,47,11, +-255,88,45,11,255,88,45,11,255,41,24,8,255,12,9,5,227,6,5,3, +-28,0,8,7,6,4,8,61,32,10,255,102,51,13,255,92,46,13,255,92, +-46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,90,45,11,255,84, +-44,11,255,88,45,11,255,88,44,11,255,14,10,5,119,0,12,9,7,4, +-153,26,17,6,255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11, +-255,92,47,11,255,88,45,11,255,88,44,11,255,45,25,8,255,13,10,6, +-227,7,6,4,28,0,12,17,13,10,170,64,39,21,255,155,78,26,255,169, +-83,26,255,165,80,24,255,161,79,24,255,145,71,22,255,136,70,21,255,134, +-69,21,255,88,50,23,255,22,17,11,232,9,8,6,31,0,84,4,4,3, +-23,12,9,5,173,71,34,10,255,92,43,13,255,33,20,8,255,10,8,5, +-57,0,64,20,14,7,227,83,42,12,255,92,46,13,255,19,13,6,227,6, +-5,3,34,0,32,10,8,5,170,26,17,6,255,76,37,11,255,90,46,11, +-255,92,46,13,255,92,46,13,255,90,45,11,255,90,45,11,255,88,44,11, +-255,46,26,9,255,18,13,9,227,8,7,5,28,0,12,15,12,8,170,58, +-35,19,255,134,73,23,255,153,76,24,255,142,69,21,255,131,64,20,255,121, +-59,18,255,121,59,18,255,121,62,18,255,43,27,12,255,11,9,6,170,0, +-16,17,13,10,170,64,39,21,255,164,85,27,255,177,86,26,255,154,75,23, +-255,121,62,18,255,115,56,16,255,119,61,18,255,123,61,20,255,80,45,19, +-255,22,16,11,227,8,7,5,28,0,8,13,10,8,57,96,48,19,255,165, +-80,24,255,159,78,24,255,159,78,24,255,165,80,24,255,165,80,24,255,165, +-80,24,255,159,78,24,255,164,81,25,255,91,52,24,255,22,17,11,227,8, +-7,5,28,0,12,13,10,8,170,38,24,11,255,99,47,16,255,116,59,17, +-255,126,65,21,255,142,69,21,255,153,76,24,255,157,74,24,255,155,76,24, +-255,91,52,24,255,23,18,12,227,8,7,5,28,0,8,13,10,8,57,104, +-52,21,255,171,84,26,255,155,76,24,255,164,81,25,255,173,81,26,255,180, +-88,27,255,180,88,27,255,177,86,26,255,169,80,26,255,92,55,25,255,22, +-17,11,227,8,7,5,28,0,8,13,10,8,57,114,63,25,255,177,86,26, +-255,114,56,17,255,92,46,13,255,92,47,11,255,93,46,12,255,92,46,13, +-255,96,48,13,255,92,46,13,255,18,12,5,91,0,8,8,6,3,40,55, +-29,10,255,108,50,15,255,114,56,17,255,130,67,21,255,153,76,24,255,161, +-82,24,255,171,84,26,255,179,84,26,255,179,84,26,255,25,17,10,142,0, +-12,15,12,8,170,64,39,21,255,162,84,27,255,179,88,28,255,183,90,28, +-255,181,89,28,255,181,89,28,255,172,88,27,255,156,77,25,255,88,50,23, +-255,22,17,11,227,8,7,5,28,0,8,13,9,6,57,96,48,19,255,153, +-71,22,255,134,69,21,255,20,14,9,193,0,12,11,8,6,113,124,62,25, +-255,185,91,28,255,169,80,26,255,22,15,9,142,0,8,11,8,6,57,111, +-61,24,255,184,90,27,255,177,86,26,255,23,16,10,173,0,40,11,8,6, +-113,114,59,23,255,144,73,21,255,126,63,21,255,20,14,9,142,0,8,11, +-9,6,57,97,51,20,255,152,71,23,255,134,69,21,255,20,14,9,187,0, +-12,12,9,7,96,97,48,18,255,140,71,21,255,138,71,21,255,20,15,9, +-142,0,8,8,6,3,40,52,28,9,255,93,50,12,255,88,45,11,255,14, +-10,5,142,0,32,13,10,8,82,91,48,16,255,132,71,21,255,63,36,18, +-255,10,8,7,136,0,20,7,6,6,62,31,21,12,244,124,66,23,255,134, +-69,21,255,20,15,9,142,0,8,8,6,3,28,54,29,9,255,93,46,12, +-255,80,39,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93, +-50,12,255,88,44,11,255,14,10,5,116,0,12,9,7,4,153,26,17,6, +-255,74,39,11,255,88,45,11,255,88,45,11,255,88,45,11,255,88,45,11, +-255,88,44,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,4,4, +-17,0,8,8,6,3,34,54,29,9,255,92,43,11,255,88,44,11,255,88, +-45,11,255,92,43,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88, +-44,11,255,45,25,8,255,12,10,5,227,6,5,3,28,0,12,13,10,6, +-170,40,24,11,255,97,48,16,255,113,55,16,255,115,56,16,255,116,57,17, +-255,116,57,17,255,113,55,16,255,113,55,16,255,60,33,13,255,18,14,9, +-227,8,6,5,28,0,8,12,9,7,57,77,38,14,255,118,57,17,255,116, +-59,17,255,118,60,17,255,109,53,16,255,98,47,13,255,92,47,11,255,88, +-45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,6,5,3,28,0, +-12,10,8,5,170,28,18,7,255,76,37,11,255,90,45,11,255,92,46,13, +-255,94,45,13,255,94,45,13,255,92,46,13,255,92,46,13,255,46,26,9, +-255,13,10,6,227,6,5,5,28,0,8,7,6,4,8,61,32,10,255,100, +-50,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92, +-46,13,255,92,46,13,255,94,47,13,255,98,49,13,255,94,47,13,255,18, +-12,5,93,0,8,8,6,3,42,60,32,9,255,96,48,13,255,88,45,11, +-255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93,50,12,255,88, +-44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9,255,93,50,12, +-255,88,44,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93, +-50,12,255,88,44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9, +-255,93,50,12,255,88,44,11,255,14,10,5,142,0,20,8,6,3,57,58, +-31,9,255,93,50,12,255,88,44,11,255,12,10,5,113,0,8,7,6,4, +-28,54,29,9,255,93,50,12,255,88,45,11,255,14,10,5,142,0,12,8, +-7,3,57,60,31,9,255,96,48,13,255,92,46,13,255,14,10,5,127,0, +-8,10,8,5,57,82,42,15,255,135,66,20,255,121,60,20,255,20,15,9, +-176,0,12,11,9,6,108,107,56,22,255,172,84,25,255,158,74,23,255,22, +-15,9,142,0,8,11,8,6,54,98,51,19,255,142,72,21,255,136,70,21, +-255,138,71,21,255,121,59,18,255,100,52,13,255,90,46,11,255,88,44,11, +-255,88,44,11,255,88,44,11,255,88,45,11,255,12,10,5,113,0,8,8, +-6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,92,47,11,255,92, +-47,11,255,18,12,5,85,0,8,7,6,4,45,54,30,9,255,94,47,13, +-255,31,20,8,255,9,7,4,85,0,32,8,6,3,48,65,33,10,255,114, +-55,15,255,119,58,18,255,126,63,21,255,128,66,21,255,22,15,9,164,0, +-20,5,5,4,28,19,14,10,227,141,72,26,255,43,27,16,255,7,6,6, +-85,0,72,14,10,7,71,96,49,17,255,138,71,21,255,130,67,21,255,22, +-15,9,164,0,68,12,9,7,76,77,39,14,255,118,57,17,255,109,53,16, +-255,22,15,9,153,0,132,11,8,6,96,103,53,20,255,144,73,21,255,121, +-60,20,255,24,16,9,153,0,80,15,12,8,184,61,36,20,255,141,68,24, +-255,168,82,25,255,171,84,26,255,26,18,11,159,0,68,9,7,4,57,60, +-32,9,255,96,48,13,255,92,46,13,255,19,12,6,142,0,40,14,10,7, +-76,129,67,26,255,190,97,29,255,180,88,27,255,26,17,11,161,0,24,14, +-10,7,85,129,67,26,255,190,97,29,255,180,88,27,255,25,17,10,125,0, +-8,11,8,6,57,109,60,24,255,175,86,26,255,142,73,23,255,20,14,9, +-187,0,40,12,9,7,93,121,65,24,255,183,89,26,255,168,82,25,255,21, +-15,10,178,0,255,0,193,10,8,5,170,39,23,8,255,78,41,11,255,16, +-11,5,142,0,255,0,141,6,5,3,85,16,11,5,227,71,37,10,255,92, +-47,11,255,92,47,11,255,18,12,5,85,0,8,8,6,3,28,54,29,9, +-255,93,46,12,255,88,45,11,255,12,10,5,113,0,12,58,31,9,255,93, +-50,12,255,88,45,11,255,25,17,6,255,8,6,3,142,0,24,4,4,3, +-25,10,8,5,173,65,33,10,255,92,46,13,255,92,46,13,255,67,34,10, +-255,27,18,8,255,9,7,4,156,3,3,2,85,10,8,5,184,69,35,10, +-255,19,13,6,147,0,40,9,7,4,113,112,55,13,255,141,69,16,255,141, +-75,16,255,18,13,5,170,0,4,8,6,3,85,110,54,13,255,143,76,16, +-255,139,68,16,255,19,13,6,170,0,4,8,6,3,85,110,54,13,255,143, +-76,16,255,141,72,16,255,23,15,6,170,0,12,10,9,5,110,35,21,8, +-255,129,63,14,255,141,69,16,255,139,68,16,255,52,27,9,255,9,7,4, +-255,27,17,8,255,135,66,16,255,154,75,17,255,155,79,18,255,91,50,16, +-255,20,15,9,207,10,9,7,28,0,16,5,4,4,20,8,6,3,127,31, +-20,8,255,130,66,15,255,143,76,16,255,143,76,16,255,67,34,10,255,10, +-8,5,215,10,8,5,170,13,10,6,142,7,5,4,23,0,8,12,9,5, +-85,115,59,14,255,149,72,16,255,143,76,16,255,18,12,5,235,0,16,7, +-6,4,28,14,10,5,227,92,46,13,255,143,73,16,255,143,70,16,255,18, +-13,5,170,0,12,14,10,5,170,53,28,10,255,114,56,13,255,56,29,9, +-255,16,11,5,255,34,20,7,255,112,55,13,255,87,42,12,255,19,13,6, +-235,8,7,5,40,0,24,10,8,5,85,114,56,13,255,143,70,16,255,141, +-72,16,255,23,15,6,170,0,12,7,6,4,28,14,10,5,227,90,44,13, +-255,112,57,13,255,47,26,8,255,11,8,4,57,0,12,25,16,6,227,96, +-48,13,255,112,57,13,255,26,16,7,255,8,6,5,85,0,24,13,10,6, +-85,8,7,5,57,0,20,6,5,3,28,15,11,6,85,9,7,4,28,0, +-36,9,7,4,105,10,8,5,170,10,8,5,130,6,5,3,23,0,156,8, +-6,3,136,77,39,12,255,143,73,16,255,139,74,16,255,18,12,5,170,0, +-12,21,14,6,227,112,57,13,255,141,69,16,255,80,40,11,255,16,11,5, +-255,14,10,5,227,18,13,5,255,72,35,11,255,136,69,15,255,130,66,15, +-255,46,26,9,255,8,6,3,105,0,16,8,7,5,57,42,27,13,255,150, +-79,21,255,184,94,21,255,195,99,22,255,199,106,24,255,26,18,11,255,0, +-24,10,8,7,99,83,45,18,255,144,74,17,255,143,70,16,255,94,47,13, +-255,18,13,5,255,16,11,5,173,14,10,5,227,52,27,9,255,132,67,15, +-255,139,68,16,255,75,39,12,255,10,7,5,116,0,8,6,5,3,57,52, +-27,9,255,137,73,16,255,143,76,16,255,94,47,13,255,18,13,5,255,16, +-11,5,173,14,10,5,227,52,27,9,255,132,67,15,255,139,74,16,255,75, +-39,12,255,10,8,5,142,0,32,8,6,5,85,22,15,7,255,102,51,13, +-255,137,67,16,255,140,71,15,255,141,75,16,255,20,13,5,170,0,8,9, +-6,4,85,108,55,13,255,141,69,16,255,139,74,16,255,74,36,11,255,18, +-12,7,255,20,13,7,181,22,15,9,207,20,13,9,238,18,13,9,252,23, +-16,10,255,31,21,12,218,14,11,7,42,0,8,7,6,4,57,40,22,9, +-255,130,66,15,255,141,75,16,255,84,42,11,255,18,12,5,255,16,12,5, +-181,14,10,5,241,69,35,10,255,140,69,17,255,154,78,17,255,117,60,18, +-255,17,13,8,142,0,12,21,14,8,190,28,18,9,255,23,15,8,255,21, +-14,8,255,21,14,8,255,23,15,8,255,38,24,11,255,98,53,17,255,151, +-74,18,255,150,76,17,255,141,75,16,255,21,15,6,170,0,8,5,4,2, +-28,33,20,8,255,130,66,15,255,141,72,16,255,84,42,11,255,18,12,5, +-255,18,12,5,176,14,10,5,235,57,29,10,255,140,72,17,255,165,85,20, +-255,121,67,24,255,14,11,7,142,0,8,8,6,5,57,72,46,23,255,198, +-113,29,255,200,102,23,255,131,68,22,255,33,21,12,255,17,13,8,255,21, +-14,8,255,88,47,19,255,192,99,23,255,203,113,26,255,146,87,29,255,13, +-11,8,164,0,12,10,8,5,85,13,10,6,170,11,9,6,142,7,6,4, +-28,0,12,13,10,8,113,18,14,9,170,16,13,9,147,10,8,7,28,0, +-24,10,8,7,28,20,15,11,227,104,62,21,255,184,94,21,255,117,62,22, +-255,17,12,8,227,7,5,4,28,0,64,11,8,6,170,67,35,16,255,164, +-85,21,255,115,58,16,255,20,14,7,252,8,6,5,85,0,24,9,7,4, +-82,66,37,13,255,145,75,18,255,154,78,17,255,115,58,16,255,29,18,8, +-255,14,10,7,255,16,11,7,255,65,34,12,255,150,74,19,255,189,97,22, +-255,138,79,27,255,14,12,9,142,0,8,7,6,6,57,55,33,16,255,158, +-81,19,255,162,80,19,255,102,53,17,255,24,15,7,255,19,12,6,170,14, +-10,5,204,46,26,9,255,137,67,16,255,139,71,16,255,49,27,10,255,7, +-6,4,105,0,8,7,6,6,62,72,46,23,255,199,115,32,255,205,111,28, +-255,155,84,26,255,41,24,14,255,18,13,9,255,25,16,10,255,110,61,25, +-255,199,100,28,255,205,112,30,255,146,87,29,255,13,11,8,142,0,8,10, +-8,7,147,180,87,25,255,206,111,27,255,203,105,26,255,164,85,27,255,40, +-24,15,255,20,14,9,255,26,17,11,255,121,64,26,255,201,101,28,255,205, +-112,30,255,146,87,29,255,14,11,7,142,0,8,8,6,5,57,71,44,22, +-255,192,108,25,255,198,101,23,255,150,78,25,255,41,24,14,255,32,21,13, +-255,74,41,21,255,184,105,27,255,202,104,25,255,202,118,27,255,174,102,31, +-255,17,14,10,142,0,8,11,9,6,136,182,92,25,255,206,112,29,255,205, +-111,28,255,166,79,27,255,43,25,16,255,21,15,10,255,29,19,12,255,116, +-67,27,255,202,107,31,255,206,113,31,255,146,87,29,255,12,10,7,142,0, +-8,11,8,6,144,185,93,26,255,202,103,23,255,157,77,18,255,83,42,12, +-255,19,13,6,255,13,10,6,255,20,13,7,255,27,17,8,255,28,18,9, +-227,10,8,5,45,0,8,11,9,6,142,139,73,20,255,198,96,21,255,199, +-106,24,255,155,78,26,255,41,25,14,255,21,15,10,255,28,18,11,255,38, +-24,15,255,40,24,15,227,14,10,7,62,0,8,8,7,5,57,65,41,20, +-255,197,108,28,255,205,111,28,255,170,88,27,255,43,27,16,255,19,14,10, +-255,29,19,12,255,123,66,24,255,181,84,20,255,170,87,19,255,114,60,17, +-255,11,10,6,142,0,8,11,9,6,85,119,60,15,255,154,75,17,255,154, +-78,17,255,18,13,7,255,0,12,13,10,8,170,191,102,30,255,209,118,30, +-255,207,113,30,255,28,19,11,201,0,8,13,10,8,105,166,87,23,255,198, +-101,23,255,198,97,23,255,26,18,11,255,0,40,13,10,8,170,189,100,28, +-255,206,111,27,255,204,102,27,255,28,20,11,201,0,8,12,10,7,116,184, +-93,27,255,206,107,27,255,203,113,26,255,23,17,10,255,0,8,6,5,5, +-28,25,18,12,244,192,105,27,255,206,112,29,255,207,117,30,255,32,22,13, +-170,0,8,11,9,6,88,112,57,13,255,143,70,16,255,141,69,16,255,17, +-12,6,227,0,32,14,11,9,170,184,92,25,255,206,111,27,255,192,111,31, +-255,49,33,18,255,10,8,7,122,0,12,7,7,6,59,22,16,11,232,167, +-100,28,255,205,112,30,255,205,116,30,255,26,18,11,210,0,8,8,7,3, +-85,110,54,13,255,141,69,16,255,141,75,16,255,25,16,6,255,5,4,4, +-40,0,8,10,8,5,85,112,55,13,255,141,75,16,255,141,75,16,255,20, +-13,5,170,0,8,5,4,2,28,33,20,8,255,130,66,15,255,141,72,16, +-255,112,55,13,255,45,25,8,255,26,17,6,255,33,20,8,255,94,47,13, +-255,141,69,16,255,144,71,17,255,80,40,13,255,9,7,4,125,0,8,10, +-8,5,85,112,57,13,255,148,79,17,255,141,75,16,255,87,42,12,255,19, +-13,6,255,14,10,5,215,15,10,6,255,60,31,11,255,143,71,18,255,160, +-82,19,255,96,54,17,255,12,9,7,142,0,8,8,6,5,57,71,44,22, +-255,192,100,25,255,199,106,24,255,185,93,26,255,91,50,22,255,58,33,17, +-255,72,41,19,255,158,81,25,255,199,106,24,255,199,106,24,255,138,79,27, +-255,13,11,8,142,0,8,10,8,7,147,166,87,23,255,203,108,24,255,202, +-108,25,255,153,77,26,255,38,22,13,255,15,11,6,255,14,10,5,255,52, +-28,9,255,132,70,15,255,141,75,16,255,80,41,13,255,10,8,5,139,0, +-8,7,6,6,57,48,29,13,255,154,79,19,255,160,85,19,255,108,56,17, +-255,30,18,9,255,16,11,7,255,24,15,9,255,96,51,17,255,167,86,20, +-255,181,88,20,255,140,75,23,255,18,14,9,144,0,12,22,14,7,193,22, +-13,7,255,20,13,7,255,78,40,15,255,165,81,20,255,177,90,20,255,177, +-90,20,255,115,58,20,255,32,20,11,255,24,15,9,255,30,19,9,227,11, +-8,6,54,0,8,11,9,6,142,139,68,20,255,166,78,19,255,144,71,17, +-255,19,12,6,215,0,12,9,7,4,136,114,56,13,255,143,70,16,255,139, +-68,16,255,19,13,6,170,0,8,10,7,5,85,112,55,13,255,143,70,16, +-255,139,74,16,255,17,11,6,221,0,12,9,7,4,136,114,56,13,255,143, +-70,16,255,141,75,16,255,20,13,5,170,0,8,9,6,4,85,110,54,13, +-255,141,69,16,255,141,72,16,255,17,11,6,221,0,20,9,7,4,136,114, +-56,13,255,143,73,16,255,139,74,16,255,19,13,6,170,0,8,8,6,3, +-85,110,54,13,255,143,76,16,255,141,69,16,255,18,12,5,252,0,12,11, +-9,6,170,131,69,18,255,170,87,19,255,168,86,19,255,28,19,9,170,0, +-8,11,8,6,85,145,74,26,255,204,102,27,255,203,105,26,255,52,33,17, +-255,6,5,5,57,0,8,17,14,10,227,190,107,25,255,204,113,25,255,174, +-86,27,255,18,13,9,170,0,12,28,18,11,198,37,23,14,255,32,21,13, +-255,21,15,10,255,20,14,9,255,38,23,11,255,87,44,12,255,137,70,16, +-255,141,72,16,255,143,70,16,255,141,72,16,255,18,12,5,170,0,8,9, +-6,4,85,110,54,13,255,145,74,16,255,141,69,16,255,94,47,13,255,27, +-17,8,227,12,8,5,28,0,8,14,10,7,85,121,62,18,255,172,87,19, +-255,139,69,18,255,20,15,9,227,0,36,21,14,8,227,117,61,24,255,199, +-100,28,255,205,106,26,255,204,110,27,255,26,18,11,255,0,16,8,7,5, +-28,20,15,11,227,135,73,22,255,192,97,21,255,165,83,22,255,33,22,12, +-255,10,9,7,85,0,68,11,9,6,170,184,97,27,255,206,112,29,255,204, +-110,27,255,28,19,11,255,0,68,14,11,7,170,179,93,24,255,202,103,23, +-255,198,97,23,255,22,15,9,255,0,132,9,7,6,170,125,63,18,255,158, +-77,17,255,146,75,17,255,17,12,6,255,0,76,8,6,5,76,72,46,23, +-255,197,108,28,255,201,107,24,255,164,85,27,255,37,22,14,227,13,9,6, +-48,0,68,12,9,7,170,138,67,19,255,170,79,19,255,168,86,19,255,20, +-14,9,255,0,40,8,7,5,20,21,15,10,184,26,17,11,255,26,17,11, +-215,12,9,7,74,0,24,8,7,5,20,21,15,10,184,26,17,11,255,31, +-21,12,207,18,13,9,28,0,8,11,9,8,156,184,93,27,255,208,105,29, +-255,205,111,28,255,28,19,11,255,0,40,14,11,7,170,184,92,25,255,203, +-104,24,255,200,98,23,255,26,18,11,255,0,255,0,189,8,7,5,57,51, +-29,12,255,152,75,19,255,162,86,19,255,19,13,8,246,0,255,0,137,6, +-5,3,28,19,13,6,249,92,46,13,255,123,63,14,255,78,39,11,255,21, +-15,6,227,9,8,4,28,0,8,9,8,4,85,110,59,13,255,141,69,16, +-255,141,75,16,255,21,14,6,170,0,12,16,11,5,170,52,28,9,255,115, +-59,14,255,116,60,15,255,43,26,10,255,9,7,6,125,0,16,8,7,5, +-28,21,17,10,227,109,59,18,255,160,82,19,255,121,64,18,255,62,34,13, +-255,94,53,17,255,149,78,20,255,102,54,19,255,32,22,11,255,72,39,15, +-255,121,62,18,255,24,17,9,187,0,40,8,6,3,167,128,66,15,255,161, +-85,17,255,159,81,18,255,24,15,7,178,0,4,6,5,3,37,48,28,11, +-255,173,92,20,255,181,96,20,255,21,15,8,221,0,4,6,5,3,28,40, +-24,9,255,143,74,18,255,158,80,17,255,21,15,6,181,0,8,10,8,5, +-54,107,51,14,255,157,83,18,255,164,84,19,255,176,89,19,255,189,92,20, +-255,191,98,22,255,190,106,23,255,197,110,26,255,203,108,24,255,203,117,24, +-255,205,119,26,255,207,122,30,255,199,118,32,255,32,23,13,170,0,12,7, +-6,4,85,22,15,7,232,113,54,14,255,146,75,17,255,158,80,17,255,154, +-78,17,255,158,80,17,255,148,76,17,255,139,71,16,255,135,66,16,255,135, +-66,16,255,21,14,6,136,0,8,10,8,5,85,128,66,15,255,161,85,17, +-255,158,80,17,255,25,16,6,204,0,12,7,6,4,28,25,16,8,227,102, +-50,15,255,148,76,17,255,142,73,17,255,84,45,13,255,10,8,5,113,0, +-8,9,7,4,82,107,53,14,255,146,75,17,255,84,41,13,255,8,7,5, +-198,3,2,2,23,5,4,4,136,38,23,9,255,136,70,17,255,140,72,17, +-255,21,15,6,178,0,24,7,6,4,57,45,26,10,255,143,74,18,255,158, +-80,17,255,26,17,6,170,0,12,24,16,7,227,115,58,16,255,148,76,17, +-255,46,26,9,255,7,6,4,156,0,16,5,4,4,71,19,13,6,255,139, +-71,16,255,140,72,17,255,43,26,10,255,9,8,4,85,0,16,14,10,5, +-85,109,52,14,255,38,23,9,255,6,5,3,85,0,12,4,4,3,28,15, +-12,6,227,115,56,16,255,29,19,8,170,0,32,13,10,6,113,122,64,21, +-255,164,85,21,255,138,71,17,255,21,15,6,161,0,156,13,10,6,227,137, +-67,16,255,154,75,17,255,84,45,13,255,10,8,5,116,0,8,9,7,4, +-85,111,55,14,255,158,87,17,255,158,80,17,255,19,13,6,255,4,4,3, +-28,0,4,3,3,2,113,17,12,6,255,139,71,16,255,161,85,17,255,146, +-75,17,255,20,14,7,210,0,16,16,13,9,110,184,105,27,255,209,123,30, +-255,210,124,31,255,208,123,31,255,207,122,30,255,27,20,12,255,0,24,13, +-11,8,147,143,75,20,255,161,85,17,255,158,80,17,255,27,18,8,227,5, +-4,2,28,0,8,10,7,5,198,131,65,16,255,161,85,17,255,150,76,17, +-255,21,14,6,170,0,8,10,8,5,85,123,61,16,255,163,83,18,255,158, +-80,17,255,27,18,8,227,5,4,2,28,0,8,9,7,4,198,130,66,15, +-255,163,83,18,255,148,76,17,255,21,14,6,193,0,28,7,6,4,85,22, +-15,7,255,131,65,16,255,154,78,17,255,154,78,17,255,154,78,17,255,154, +-78,17,255,21,15,6,170,0,8,10,8,5,85,129,64,16,255,163,86,18, +-255,180,91,19,255,29,20,10,255,3,3,2,93,0,36,10,8,5,122,121, +-60,16,255,161,85,17,255,159,81,18,255,24,15,7,255,4,4,3,34,0, +-4,2,2,1,6,17,13,8,181,181,93,22,255,203,108,24,255,205,114,26, +-255,32,23,13,210,0,36,5,4,4,161,30,22,13,255,198,116,29,255,206, +-106,25,255,191,96,20,255,26,17,7,170,0,8,9,7,4,85,116,60,15, +-255,161,85,17,255,158,80,17,255,21,14,6,255,5,4,2,28,0,4,2, +-2,1,3,12,9,7,215,190,107,25,255,211,124,30,255,208,134,37,255,32, +-22,13,178,0,8,13,11,8,96,187,112,32,255,209,123,30,255,191,96,20, +-255,28,19,9,255,4,3,3,74,0,4,3,2,2,28,13,10,8,227,196, +-120,31,255,211,124,30,255,199,106,24,255,27,19,10,170,0,8,13,10,6, +-57,114,61,19,255,178,91,21,255,182,102,23,255,23,17,10,173,0,8,11, +-9,6,91,146,85,25,255,198,113,29,255,196,120,31,255,27,20,12,207,0, +-20,5,5,4,28,21,17,12,227,190,118,33,255,209,131,40,255,161,100,34, +-255,17,14,10,227,5,5,4,28,0,72,9,8,6,170,91,59,28,255,189, +-94,24,255,162,83,19,255,39,25,12,255,7,7,6,85,0,20,13,11,8, +-142,183,103,24,255,203,112,24,255,203,112,24,255,42,26,13,249,5,4,4, +-62,0,4,3,2,2,25,12,9,7,227,195,115,30,255,212,127,35,255,211, +-132,38,255,32,22,13,181,0,8,12,10,7,85,124,65,17,255,161,85,17, +-255,159,78,18,255,21,14,6,255,5,4,2,28,0,8,7,6,4,224,133, +-68,16,255,159,81,18,255,146,72,17,255,22,14,7,170,0,8,13,11,8, +-91,185,111,32,255,210,125,33,255,205,114,26,255,37,26,14,255,4,4,3, +-85,0,4,4,4,4,28,13,10,8,227,193,105,26,255,206,111,27,255,202, +-118,27,255,32,22,13,170,0,8,11,9,6,127,174,91,23,255,202,102,21, +-255,200,105,21,255,36,23,13,255,4,4,3,85,0,4,3,3,2,28,13, +-11,8,227,198,118,33,255,212,127,35,255,208,128,33,255,31,22,12,181,0, +-8,13,11,8,91,185,114,30,255,211,124,30,255,208,122,29,255,34,24,13, +-255,4,4,3,85,0,4,7,6,6,113,32,24,13,255,185,95,22,255,202, +-98,21,255,198,97,23,255,33,22,12,170,0,8,10,8,7,156,190,108,27, +-255,212,126,33,255,211,127,36,255,40,26,15,255,4,4,3,85,0,4,3, +-3,2,28,13,11,8,227,198,118,33,255,214,129,37,255,211,132,38,255,32, +-23,13,173,0,8,10,8,7,144,167,87,22,255,185,94,20,255,165,87,18, +-255,25,17,8,255,3,3,2,57,0,28,13,11,8,170,195,112,30,255,210, +-125,33,255,208,117,29,255,39,26,14,255,4,4,3,85,0,28,12,10,7, +-150,184,108,27,255,211,124,30,255,211,127,36,255,40,27,15,255,4,4,3, +-85,0,4,3,3,2,28,17,13,8,178,138,71,17,255,161,85,17,255,155, +-79,18,255,21,14,6,170,0,8,10,8,5,85,124,61,15,255,169,89,18, +-255,180,91,19,255,25,18,10,255,0,12,13,11,8,170,196,113,31,255,211, +-124,30,255,205,119,26,255,26,18,11,204,0,8,11,9,6,88,134,70,19, +-255,173,87,18,255,168,86,19,255,20,13,7,255,0,40,13,11,8,170,196, +-113,31,255,210,125,33,255,207,122,30,255,24,18,11,212,0,8,11,9,6, +-119,180,93,23,255,203,108,24,255,202,103,23,255,20,15,9,255,0,8,15, +-13,10,195,101,63,26,255,202,117,25,255,206,128,35,255,160,106,35,255,15, +-13,10,142,0,8,10,8,5,147,139,70,20,255,191,96,20,255,200,105,21, +-255,25,18,10,255,0,32,13,10,8,170,189,99,26,255,206,115,27,255,205, +-106,26,255,185,106,28,255,79,52,26,255,10,9,7,122,0,4,7,6,6, +-42,36,27,17,244,172,106,35,255,207,128,34,255,211,126,34,255,211,127,36, +-255,24,18,11,227,0,8,10,8,5,85,124,64,15,255,159,81,18,255,158, +-80,17,255,76,40,13,255,11,8,6,210,0,8,12,9,5,85,129,64,16, +-255,161,85,17,255,158,80,17,255,26,16,7,170,0,8,9,7,4,85,115, +-56,16,255,161,85,17,255,159,81,18,255,49,27,10,255,7,6,4,170,5, +-4,4,85,6,5,3,113,26,19,11,255,185,95,22,255,202,102,21,255,197, +-104,22,255,28,20,11,173,0,8,13,10,6,102,167,87,22,255,200,101,21, +-255,201,102,22,255,32,21,11,255,4,3,3,65,0,4,2,2,1,17,12, +-10,7,221,190,98,23,255,208,116,27,255,204,110,27,255,30,21,11,181,0, +-8,13,11,8,91,185,114,30,255,211,124,30,255,209,123,30,255,86,55,25, +-255,9,8,6,187,6,6,5,85,7,6,6,130,32,24,15,255,200,122,31, +-255,209,123,30,255,206,122,31,255,32,23,13,173,0,8,10,8,7,144,191, +-113,30,255,212,127,35,255,210,126,35,255,40,27,15,255,4,4,3,85,0, +-4,2,2,1,8,11,9,6,212,157,81,20,255,189,92,20,255,190,97,21, +-255,27,19,10,178,0,8,12,10,7,96,183,105,28,255,209,123,30,255,205, +-114,26,255,36,24,13,255,4,4,3,85,0,4,4,4,4,28,18,14,9, +-187,195,115,30,255,211,124,30,255,210,130,35,255,35,26,14,210,0,20,3, +-2,2,28,12,10,7,227,195,115,30,255,211,124,30,255,209,123,30,255,38, +-25,15,255,4,4,3,85,0,20,13,11,8,170,194,115,31,255,209,122,28, +-255,196,99,21,255,21,15,8,255,0,12,11,9,6,170,153,79,20,255,187, +-91,20,255,181,96,20,255,30,20,9,178,0,8,13,10,6,96,151,79,20, +-255,187,91,20,255,181,96,20,255,22,16,9,255,0,12,12,9,7,170,146, +-76,19,255,167,88,18,255,158,77,17,255,23,15,6,170,0,8,10,8,5, +-85,133,66,16,255,167,88,18,255,168,86,19,255,22,16,9,255,0,20,12, +-9,7,170,155,80,20,255,185,94,20,255,181,96,20,255,22,16,9,221,0, +-8,6,6,5,42,51,29,12,255,150,81,19,255,165,87,18,255,42,26,11, +-255,5,5,4,108,0,4,5,5,4,28,18,15,11,255,195,114,28,255,207, +-123,32,255,158,94,31,255,17,13,10,142,0,8,6,5,5,57,50,34,19, +-255,191,111,32,255,208,117,29,255,113,73,30,255,10,10,9,227,6,6,5, +-125,7,7,6,198,42,29,17,255,187,96,22,255,166,87,23,255,42,27,15, +-255,8,6,5,110,0,32,5,5,4,184,21,16,8,255,106,54,15,255,154, +-78,17,255,151,77,18,255,92,48,15,255,11,9,6,119,0,8,10,8,5, +-93,131,69,18,255,189,92,20,255,200,105,21,255,33,22,12,255,5,4,4, +-54,0,12,9,8,6,85,76,53,25,255,200,118,31,255,204,114,27,255,65, +-43,22,255,6,6,5,113,0,32,4,3,3,17,14,11,9,227,195,111,28, +-255,206,115,27,255,204,105,25,255,24,17,11,255,0,12,5,5,4,28,13, +-10,6,227,125,66,18,255,165,84,18,255,161,85,17,255,161,85,17,255,155, +-79,18,255,28,19,9,255,6,5,3,85,0,64,11,9,8,68,86,56,27, +-255,204,126,33,255,210,125,33,255,30,21,13,255,0,68,13,11,8,170,195, +-115,30,255,209,123,30,255,207,122,30,255,27,19,12,255,3,3,2,28,0, +-128,7,6,4,184,131,65,16,255,161,85,17,255,154,78,17,255,15,11,6, +-249,0,76,10,8,7,173,166,87,23,255,198,104,21,255,196,99,21,255,35, +-23,12,255,3,3,2,85,0,72,13,11,8,170,194,115,31,255,211,124,30, +-255,207,122,30,255,27,19,12,255,3,3,2,28,0,108,13,11,8,170,196, +-113,31,255,213,132,36,255,211,127,36,255,30,21,13,255,0,40,11,9,6, +-170,155,80,20,255,185,94,20,255,180,91,19,255,21,15,8,255,0,255,0, +-189,10,8,7,184,183,100,26,255,208,116,27,255,204,114,27,255,26,18,11, +-255,4,4,4,28,0,255,0,133,10,8,5,127,119,60,15,255,160,85,19, +-255,91,48,16,255,10,8,5,227,4,4,3,28,0,12,9,7,4,161,131, +-67,16,255,159,81,18,255,159,78,18,255,18,13,7,249,0,16,7,6,4, +-170,57,34,14,255,176,90,21,255,195,95,22,255,26,19,11,232,0,16,17, +-14,10,99,179,106,28,255,207,122,30,255,180,109,33,255,25,20,12,255,7, +-6,6,170,20,17,11,255,196,114,27,255,208,117,29,255,203,124,30,255,172, +-106,35,255,53,36,20,255,10,9,7,108,0,40,9,8,6,170,159,82,20, +-255,202,103,23,255,206,111,27,255,22,17,11,255,0,8,10,9,7,139,115, +-74,30,255,213,133,48,255,39,28,16,255,0,8,9,8,4,113,67,39,14, +-255,181,92,20,255,24,18,9,255,0,12,28,19,9,227,139,79,26,255,206, +-117,31,255,212,123,37,255,214,126,41,255,172,106,35,255,53,34,18,255,122, +-78,31,255,211,127,44,255,217,136,50,255,216,135,49,255,190,122,41,255,65, +-43,22,255,14,11,7,85,0,8,7,6,4,28,29,21,10,249,153,79,20, +-255,174,85,19,255,103,53,16,255,17,12,6,244,19,13,6,170,21,14,6, +-170,27,17,6,170,21,14,6,212,21,14,6,255,25,17,6,224,12,9,5, +-45,0,12,24,16,7,153,22,15,7,255,26,16,7,210,12,9,5,40,0, +-8,8,7,5,28,17,13,8,227,114,61,19,255,174,85,19,255,154,79,19, +-255,60,33,13,255,11,9,6,170,0,12,10,8,5,170,146,79,19,255,180, +-87,19,255,67,39,14,255,8,6,5,85,0,8,24,17,9,255,143,75,20, +-255,162,80,19,255,22,15,7,215,0,28,8,7,5,110,60,33,13,255,166, +-78,19,255,22,15,7,227,0,8,7,6,4,85,91,51,16,255,174,88,19, +-255,169,78,18,255,25,17,8,255,3,3,2,8,0,20,11,9,6,178,143, +-74,18,255,177,89,18,255,138,75,19,255,18,13,7,176,0,16,9,7,4, +-28,29,19,8,232,41,25,10,255,17,13,8,255,9,8,6,116,0,4,7, +-6,4,59,14,11,7,227,32,21,9,255,40,24,9,255,12,9,5,105,0, +-32,14,11,9,170,199,124,36,255,213,119,36,255,202,102,21,255,20,14,7, +-246,0,152,8,7,5,142,53,31,12,255,162,86,19,255,121,64,18,255,19, +-14,8,252,6,5,3,28,0,8,10,8,5,125,142,74,19,255,180,91,19, +-255,183,89,19,255,19,14,8,255,0,4,5,5,4,6,15,13,10,193,69, +-42,18,255,171,91,20,255,189,88,20,255,200,101,21,255,31,21,12,255,0, +-16,10,8,7,28,30,21,13,227,150,92,35,255,208,121,37,255,211,115,30, +-255,208,117,29,255,28,21,13,255,0,24,10,8,7,28,22,15,7,198,26, +-17,7,255,24,15,7,221,9,7,4,57,0,12,8,7,5,156,171,89,22, +-255,202,107,23,255,202,103,23,255,23,18,10,249,0,12,26,18,9,198,29, +-19,8,255,24,16,7,215,10,8,5,51,0,12,10,8,5,85,134,70,19, +-255,175,88,18,255,173,87,18,255,20,14,7,255,0,24,10,8,5,85,26, +-19,9,255,107,58,18,255,154,83,19,255,168,79,19,255,169,78,18,255,173, +-87,18,255,172,80,19,255,26,17,7,170,0,8,11,10,8,136,189,99,26, +-255,210,115,31,255,216,129,45,255,143,96,40,255,15,13,10,227,12,12,11, +-170,15,13,12,170,13,12,10,170,13,12,10,136,9,8,8,85,0,16,11, +-9,6,170,169,91,22,255,202,103,23,255,203,108,24,255,18,15,9,255,0, +-12,6,5,5,23,28,19,11,156,31,22,12,255,34,24,13,227,14,11,7, +-85,0,36,9,8,8,142,72,54,31,255,215,147,60,255,218,146,61,255,174, +-100,35,255,14,11,7,142,0,8,11,8,6,102,142,74,19,255,185,86,20, +-255,195,98,20,255,18,14,9,249,0,12,10,8,7,170,202,131,47,255,220, +-152,63,255,220,151,61,255,22,19,13,252,0,8,11,9,8,167,203,135,46, +-255,217,139,48,255,210,120,33,255,18,14,9,255,0,12,9,8,6,170,198, +-117,37,255,211,115,30,255,202,102,21,255,34,22,11,176,0,8,13,11,8, +-170,202,122,37,255,218,144,49,255,217,144,50,255,28,21,13,255,0,8,12, +-11,9,170,204,122,41,255,217,135,46,255,215,136,42,255,46,33,19,255,0, +-16,10,9,7,28,21,19,14,227,153,104,46,255,214,149,55,255,158,103,39, +-255,16,14,11,221,7,6,6,28,0,20,20,18,13,142,31,26,18,170,25, +-21,16,170,24,20,15,170,24,20,15,170,24,20,15,170,24,21,15,170,31, +-26,18,170,25,21,16,170,14,12,9,31,0,20,10,9,7,167,75,51,26, +-255,202,117,33,255,186,120,43,255,41,32,20,255,12,11,9,85,0,16,11, +-9,8,28,31,22,12,215,49,33,18,255,41,27,16,227,12,10,7,85,0, +-12,14,12,9,170,204,137,51,255,220,152,63,255,220,151,61,255,23,19,12, +-252,0,8,11,10,6,85,136,70,17,255,175,88,18,255,169,78,18,255,15, +-11,6,255,0,8,9,8,6,85,26,19,9,255,153,82,18,255,177,89,18, +-255,180,84,19,255,24,17,9,218,0,8,11,9,8,147,196,115,35,255,215, +-125,38,255,214,125,39,255,20,16,11,255,0,12,9,8,6,159,165,86,22, +-255,197,99,20,255,195,90,20,255,32,21,11,170,0,8,12,10,7,85,145, +-76,20,255,189,92,20,255,191,96,20,255,18,14,9,255,0,12,9,8,6, +-170,199,126,39,255,217,133,50,255,217,144,50,255,23,18,12,252,0,8,11, +-10,8,142,191,105,28,255,206,111,27,255,203,104,24,255,19,15,10,255,0, +-12,9,8,6,57,21,15,8,198,28,19,9,255,32,21,11,227,11,9,6, +-76,0,8,11,9,8,170,203,125,42,255,220,146,59,255,219,146,60,255,24, +-19,13,255,0,12,11,10,8,170,204,136,47,255,220,146,59,255,218,147,55, +-255,25,19,12,232,0,8,11,10,8,119,161,87,22,255,195,98,20,255,202, +-103,23,255,18,15,9,255,0,32,14,12,9,170,200,125,37,255,214,124,37, +-255,205,106,26,255,20,16,9,221,0,32,16,13,9,170,205,130,42,255,219, +-144,56,255,219,146,60,255,24,19,13,255,0,12,6,5,3,23,21,14,6, +-170,26,16,7,255,26,17,7,224,14,10,5,31,0,8,11,9,6,125,170, +-89,23,255,211,115,30,255,214,126,41,255,23,19,12,255,0,12,11,10,8, +-170,195,112,30,255,206,106,25,255,200,105,21,255,29,20,10,170,0,8,11, +-9,6,85,134,70,19,255,177,85,18,255,172,80,19,255,18,13,7,255,0, +-40,14,12,9,170,195,112,30,255,206,111,27,255,202,103,23,255,31,22,10, +-170,0,8,13,10,6,85,151,79,20,255,189,92,20,255,183,89,19,255,17, +-13,8,255,0,4,8,7,5,59,57,34,16,255,184,97,27,255,198,115,33, +-255,114,77,33,255,16,14,11,210,6,5,5,8,0,8,12,10,7,170,195, +-113,32,255,215,123,42,255,217,133,50,255,32,24,15,255,0,32,12,11,7, +-170,175,90,22,255,198,104,21,255,189,92,20,255,192,97,21,255,189,97,22, +-255,45,29,14,255,10,9,7,210,22,17,11,255,183,102,30,255,212,121,41, +-255,216,135,49,255,217,137,52,255,214,125,39,255,29,21,12,204,0,8,11, +-9,6,85,143,75,20,255,193,97,20,255,195,98,20,255,180,93,23,255,88, +-54,23,255,11,10,8,113,0,4,14,12,7,85,170,89,23,255,202,103,23, +-255,202,102,21,255,32,22,11,178,0,8,12,10,7,113,176,91,23,255,205, +-105,24,255,209,117,28,255,39,28,16,255,5,5,5,28,0,8,15,14,10, +-198,206,132,45,255,217,133,50,255,215,133,44,255,25,19,12,232,0,8,11, +-10,8,125,198,118,39,255,218,145,51,255,218,146,53,255,20,17,11,255,0, +-12,9,8,6,170,198,124,37,255,216,134,45,255,214,139,41,255,22,18,11, +-255,0,8,11,10,8,136,191,105,28,255,206,111,27,255,206,106,25,255,36, +-26,15,255,5,5,4,28,0,8,15,13,10,198,192,105,27,255,206,106,25, +-255,204,105,25,255,23,17,10,232,0,8,12,10,7,125,196,119,37,255,218, +-141,51,255,218,139,55,255,20,16,11,255,0,12,9,8,6,170,196,110,33, +-255,215,126,40,255,214,125,39,255,23,18,12,252,0,8,11,9,8,167,201, +-123,40,255,217,133,50,255,214,136,43,255,20,16,11,255,0,12,6,5,5, +-23,29,21,12,153,32,22,13,255,35,25,14,227,15,12,8,85,0,24,12, +-10,9,170,198,124,37,255,215,125,38,255,213,124,38,255,23,18,12,255,0, +-24,14,12,9,170,204,132,47,255,219,144,56,255,211,127,36,255,28,21,13, +-255,0,12,14,12,9,170,198,117,37,255,215,123,42,255,214,125,39,255,25, +-20,12,215,0,8,11,10,8,130,198,119,35,255,215,126,40,255,212,123,37, +-255,30,22,13,255,0,12,14,12,9,170,196,114,33,255,206,106,25,255,200, +-105,21,255,30,21,11,184,0,8,13,11,8,99,184,100,25,255,209,117,28, +-255,210,115,31,255,28,21,13,255,0,20,14,12,9,170,198,117,37,255,215, +-126,40,255,214,126,41,255,25,19,12,255,0,12,10,9,7,125,61,42,22, +-255,190,107,33,255,153,98,38,255,29,23,16,255,13,12,10,255,17,15,10, +-255,108,74,37,255,210,144,59,255,153,98,38,255,16,14,11,224,6,6,5, +-17,0,12,15,13,8,227,115,67,24,255,197,100,22,255,150,81,25,255,32, +-24,13,255,15,13,8,255,19,15,10,255,85,48,18,255,178,95,21,255,115, +-65,20,255,15,12,8,255,5,5,4,34,0,32,10,9,7,198,69,46,22, +-255,186,103,29,255,195,111,28,255,92,58,25,255,15,12,8,198,0,12,10, +-9,7,170,194,112,31,255,215,125,38,255,218,146,53,255,24,19,13,255,0, +-20,15,14,10,227,159,103,42,255,212,127,43,255,177,118,48,255,19,17,12, +-227,6,6,5,28,0,32,11,10,8,170,182,98,23,255,202,106,21,255,195, +-98,20,255,24,17,9,212,0,12,18,14,9,227,102,54,19,255,157,83,18, +-255,85,46,14,255,19,13,6,255,47,27,10,255,150,81,19,255,131,67,20, +-255,39,26,14,255,12,11,9,85,0,64,10,9,7,170,118,75,33,255,215, +-141,54,255,44,33,19,255,0,16,9,9,8,108,19,17,12,170,27,23,16, +-170,23,21,16,170,23,21,16,170,24,20,15,170,20,18,13,170,15,14,10, +-170,10,9,7,113,7,6,6,28,0,12,12,11,9,170,189,99,26,255,209, +-110,30,255,211,118,36,255,141,88,36,255,19,17,12,227,20,18,13,170,24, +-20,15,170,21,19,14,170,16,14,11,170,10,9,7,113,6,6,5,28,0, +-20,8,7,5,65,11,10,8,142,16,14,11,170,24,21,15,170,25,22,16, +-170,23,21,16,170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6, +-28,0,20,8,7,5,62,10,9,5,136,12,10,7,170,14,11,7,170,13, +-10,6,170,11,9,6,198,31,21,10,255,153,82,18,255,177,85,18,255,169, +-78,18,255,22,15,7,204,0,16,8,7,5,57,11,10,6,142,19,17,12, +-170,23,21,16,170,25,22,16,170,23,21,16,170,21,19,14,170,15,14,10, +-170,10,10,9,113,7,6,6,28,0,16,12,10,7,153,55,32,14,255,175, +-93,20,255,185,94,20,255,183,89,19,255,80,44,17,255,13,11,8,187,7, +-6,6,25,0,16,8,7,5,62,11,10,6,142,16,14,11,170,23,19,14, +-170,25,22,16,170,23,21,16,170,19,17,12,170,15,14,10,170,17,15,10, +-170,19,17,12,142,9,8,8,28,0,8,12,10,9,170,204,137,49,255,220, +-146,59,255,218,146,53,255,141,91,38,255,19,17,12,227,19,17,12,170,24, +-20,15,170,21,19,14,170,15,14,10,170,10,10,9,113,7,6,6,28,0, +-16,12,10,7,57,14,12,7,102,14,11,7,85,0,32,12,10,7,57,13, +-11,8,105,15,13,8,85,0,12,12,11,9,170,204,136,47,255,220,146,59, +-255,218,153,59,255,24,19,13,255,0,12,8,7,5,82,11,10,6,156,11, +-9,6,170,10,9,7,91,0,12,10,8,5,127,144,78,19,255,180,87,19, +-255,174,81,19,255,24,15,7,210,0,12,14,11,7,68,12,10,7,170,12, +-10,7,170,17,15,10,170,24,20,15,170,19,17,12,170,15,14,10,170,18, +-15,11,170,24,21,15,170,21,19,14,170,15,14,10,170,11,10,8,113,7, +-7,6,28,0,16,15,13,10,119,17,15,12,170,15,13,10,170,16,14,11, +-170,19,17,12,170,21,18,12,170,18,15,11,170,15,13,8,170,11,9,6, +-170,10,8,7,88,6,5,5,23,0,20,10,9,7,85,14,12,9,170,19, +-17,12,170,21,19,14,170,21,19,14,170,21,19,14,170,19,17,12,170,15, +-14,10,170,11,10,8,116,7,7,6,28,0,16,15,14,10,119,18,15,11, +-170,15,14,10,170,18,15,11,170,21,19,14,170,25,22,16,170,23,21,16, +-170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6,28,0,20,10, +-9,7,85,14,12,9,170,19,17,12,170,20,18,13,170,20,18,13,170,23, +-19,14,170,19,17,12,170,15,14,10,170,17,14,10,170,19,17,12,142,10, +-9,7,28,0,12,15,13,10,113,18,15,11,170,15,14,10,170,18,15,11, +-170,21,19,14,170,25,22,16,170,23,21,16,170,20,18,13,170,16,14,11, +-170,11,10,8,113,7,7,6,28,0,20,7,7,6,82,11,10,6,142,16, +-13,9,170,19,17,12,170,21,19,14,170,24,21,15,170,25,22,16,170,25, +-22,16,170,15,13,10,170,12,11,9,57,0,16,15,13,10,170,97,65,34, +-255,209,132,42,255,214,136,43,255,214,127,43,255,159,103,42,255,21,19,14, +-227,11,10,8,28,0,12,16,14,11,113,21,19,14,170,18,15,11,153,11, +-10,8,28,0,16,15,14,10,125,21,19,14,170,19,17,12,142,10,9,7, +-28,0,12,15,14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0, +-16,15,13,10,125,21,19,14,170,19,17,12,142,10,9,7,28,0,12,15, +-14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0,24,15,14,10, +-125,21,19,14,170,19,17,12,142,9,9,8,28,0,12,17,14,10,130,27, +-24,16,170,21,19,14,142,10,9,7,28,0,16,16,14,11,113,28,24,17, +-170,24,21,15,161,12,11,9,28,0,12,16,14,11,113,21,19,14,170,18, +-15,11,153,11,10,8,28,0,16,15,13,10,125,21,19,14,170,19,17,12, +-142,9,8,6,28,0,12,18,15,11,136,19,16,10,170,16,13,9,170,16, +-14,9,170,15,13,8,170,13,11,8,170,12,11,9,170,13,12,8,170,15, +-14,10,170,14,13,11,170,11,11,10,113,0,20,13,11,8,170,190,98,23, +-255,204,116,31,255,74,52,27,255,9,8,8,113,0,16,13,11,8,170,192, +-106,29,255,208,112,27,255,208,117,29,255,27,21,12,255,0,16,5,5,4, +-28,27,23,16,255,199,121,44,255,214,139,41,255,31,23,14,255,0,16,13, +-11,8,28,32,24,13,227,36,26,15,255,19,16,12,198,8,8,7,51,0, +-4,8,8,7,57,29,21,12,218,48,32,17,255,45,30,16,255,20,16,11, +-218,10,9,7,105,0,44,14,12,9,170,204,130,51,255,224,153,77,255,225, +-169,88,255,33,27,18,255,0,12,21,19,14,215,217,163,86,255,61,46,28, +-255,0,12,19,16,12,201,203,121,40,255,51,38,22,255,0,12,4,4,3, +-25,16,14,11,227,212,147,71,255,224,160,77,255,223,161,80,255,31,25,16, +-255,4,4,4,102,10,10,9,215,206,133,55,255,223,156,70,255,224,164,85, +-255,51,39,24,255,5,5,4,82,0,12,15,12,8,110,178,98,27,255,211, +-115,30,255,211,121,34,255,36,26,15,255,3,3,2,85,0,60,8,8,5, +-28,27,20,10,232,125,73,22,255,190,97,21,255,180,92,21,255,97,56,20, +-255,14,11,7,170,0,16,12,10,7,142,165,89,22,255,198,104,21,255,84, +-50,19,255,7,6,4,159,0,4,5,5,4,82,32,23,11,255,121,69,22, +-255,97,56,20,255,15,13,8,142,0,32,14,12,7,198,172,92,21,255,28, +-19,9,207,0,8,11,10,6,85,148,78,21,255,198,104,21,255,192,97,21, +-255,21,15,8,255,0,24,10,9,5,170,167,90,22,255,202,93,21,255,202, +-103,23,255,21,16,10,255,0,20,4,3,3,133,20,16,9,255,151,80,22, +-255,75,42,16,255,10,8,7,255,32,22,11,255,164,86,23,255,60,39,17, +-255,5,5,4,252,0,36,12,11,9,198,213,155,80,255,224,166,83,255,211, +-121,34,255,20,16,9,255,3,3,2,28,0,144,6,6,5,51,27,20,10, +-255,160,84,23,255,198,104,21,255,67,40,16,255,8,7,5,125,0,12,12, +-10,9,170,195,112,30,255,215,125,38,255,217,133,50,255,49,35,22,255,5, +-5,4,133,13,12,10,210,189,119,50,255,211,127,44,255,212,121,41,255,218, +-135,53,255,220,148,63,255,34,27,17,255,0,20,4,4,4,17,13,12,10, +-227,196,113,31,255,212,118,35,255,214,123,43,255,33,26,16,255,0,56,12, +-11,9,187,208,134,55,255,223,146,70,255,221,152,70,255,34,26,17,255,0, +-40,8,7,5,164,165,86,22,255,202,98,21,255,198,96,21,255,22,16,9, +-255,0,20,8,8,5,85,32,22,11,255,167,87,22,255,160,84,23,255,93, +-54,20,255,120,65,21,255,188,96,21,255,196,99,21,255,200,105,21,255,24, +-19,11,207,0,8,15,14,10,110,208,152,71,255,227,174,98,255,228,179,103, +-255,225,176,98,255,217,169,94,255,213,166,92,255,215,167,92,255,213,155,80, +-255,204,136,55,255,138,89,37,255,25,22,16,227,9,9,8,28,0,8,11, +-10,8,170,203,129,50,255,223,149,70,255,222,158,75,255,31,25,16,255,4, +-4,4,28,0,60,8,8,7,57,49,40,26,255,206,152,83,255,224,169,91, +-255,194,140,71,255,31,27,20,255,9,8,8,28,0,8,12,10,9,161,196, +-110,33,255,218,130,51,255,222,158,75,255,31,25,16,255,4,4,4,28,0, +-8,11,10,8,198,213,160,84,255,228,180,105,255,227,175,100,255,33,28,18, +-207,0,8,12,11,9,130,210,155,77,255,228,169,99,255,226,172,95,255,30, +-25,17,255,4,4,4,28,0,8,11,10,8,198,204,129,49,255,214,127,43, +-255,213,125,40,255,23,19,12,232,0,8,14,13,9,125,208,152,71,255,223, +-159,76,255,218,153,59,255,33,26,16,210,0,8,13,12,10,127,198,118,39, +-255,215,127,42,255,213,126,42,255,41,31,18,227,0,12,6,6,5,28,25, +-21,16,227,204,150,79,255,223,171,98,255,175,122,60,255,18,15,11,218,5, +-4,4,17,0,20,20,18,13,85,177,101,34,255,204,123,37,255,199,117,36, +-255,199,117,36,255,202,122,37,255,199,117,36,255,198,114,31,255,198,110,31, +-255,202,118,35,255,46,33,21,170,0,24,10,9,7,153,110,78,37,255,213, +-162,82,255,218,164,87,255,67,51,30,255,9,8,8,85,0,40,6,5,5, +-28,21,19,14,255,217,166,92,255,227,175,100,255,224,169,91,255,31,25,16, +-215,0,8,12,10,7,85,154,80,21,255,197,99,20,255,192,97,21,255,28, +-20,9,255,4,3,3,110,11,9,6,170,117,63,20,255,184,94,21,255,198, +-104,21,255,203,104,24,255,210,122,37,255,21,17,12,252,0,8,10,9,7, +-161,203,129,50,255,224,160,77,255,225,169,88,255,30,25,17,255,4,4,4, +-28,0,8,8,7,5,190,165,86,22,255,198,104,21,255,196,99,21,255,28, +-19,9,170,0,8,13,11,8,85,176,91,23,255,208,112,27,255,210,121,35, +-255,27,22,14,255,4,4,4,28,0,8,11,10,8,198,211,149,76,255,224, +-168,87,255,224,162,81,255,32,26,17,210,0,8,12,10,7,113,176,91,23, +-255,202,107,23,255,202,95,23,255,20,16,9,255,0,40,15,13,10,170,213, +-160,84,255,228,180,105,255,227,174,98,255,33,26,18,255,0,12,15,13,10, +-170,213,155,80,255,226,172,95,255,224,167,85,255,23,20,14,244,0,8,11, +-10,8,127,189,104,28,255,214,127,43,255,221,148,70,255,31,25,16,255,4, +-4,4,28,0,28,14,12,9,170,195,113,32,255,209,117,28,255,202,103,23, +-255,20,15,9,252,3,3,3,14,0,28,15,14,10,170,213,155,80,255,226, +-172,95,255,221,152,70,255,28,24,15,255,0,40,14,12,9,170,208,141,61, +-255,225,162,88,255,227,174,98,255,33,26,18,255,4,4,4,28,0,8,10, +-8,7,198,182,98,23,255,202,103,23,255,198,104,21,255,28,19,9,170,0, +-8,11,10,6,85,154,80,21,255,202,98,21,255,202,103,23,255,25,20,12, +-255,0,40,12,10,7,170,186,100,23,255,202,99,23,255,200,105,21,255,30, +-21,9,170,0,8,12,9,7,85,154,80,21,255,198,104,21,255,196,99,21, +-255,28,20,9,255,4,4,3,113,11,10,6,227,183,100,26,255,212,127,43, +-255,167,117,52,255,17,15,12,215,5,5,5,14,0,12,15,13,10,170,211, +-149,76,255,224,166,83,255,223,161,80,255,34,26,17,255,0,32,10,9,7, +-170,167,87,22,255,198,92,21,255,196,99,21,255,196,95,21,255,198,92,21, +-255,195,99,22,255,192,106,29,255,206,127,43,255,217,141,60,255,223,146,70, +-255,224,165,81,255,220,148,63,255,212,124,39,255,25,19,12,215,0,8,12, +-11,9,116,196,116,37,255,218,141,51,255,218,139,55,255,218,142,61,255,215, +-143,58,255,24,19,13,212,0,4,10,9,7,156,203,129,50,255,221,150,66, +-255,220,148,63,255,25,21,14,227,0,8,10,10,7,159,204,134,59,255,225, +-160,84,255,225,169,88,255,36,29,19,255,0,12,15,14,10,170,204,130,51, +-255,220,142,59,255,218,139,55,255,21,18,12,249,0,8,11,10,8,142,206, +-145,67,255,226,172,95,255,227,174,98,255,32,26,17,255,4,4,4,28,0, +-8,11,10,8,198,198,117,37,255,215,125,38,255,211,122,36,255,28,21,13, +-215,0,8,13,11,8,96,174,91,23,255,202,107,23,255,202,103,23,255,22, +-17,9,255,0,12,11,10,6,170,176,91,23,255,202,103,23,255,203,108,24, +-255,21,15,10,238,0,8,11,10,8,142,206,145,67,255,226,170,91,255,224, +-160,85,255,30,24,17,255,4,4,4,28,0,8,11,10,8,198,209,149,70, +-255,224,160,77,255,222,158,75,255,31,25,16,212,0,8,12,11,9,127,198, +-116,35,255,215,125,38,255,211,122,36,255,28,21,13,255,4,4,4,28,0, +-52,13,12,8,170,195,112,30,255,209,110,30,255,207,105,30,255,25,20,12, +-255,0,24,15,14,10,170,213,158,80,255,226,172,95,255,224,164,85,255,33, +-27,18,255,0,12,15,14,10,170,210,143,65,255,224,168,87,255,224,165,81, +-255,25,21,14,232,0,8,10,10,9,153,208,147,67,255,224,166,83,255,222, +-158,75,255,34,26,17,255,0,12,15,14,10,170,211,149,76,255,223,149,70, +-255,219,146,60,255,25,20,14,235,0,8,10,10,9,150,204,134,59,255,224, +-156,83,255,224,165,81,255,33,27,18,255,0,20,15,14,10,170,211,150,70, +-255,226,170,91,255,226,172,95,255,33,26,18,255,0,16,9,9,8,150,101, +-74,38,255,198,145,77,255,206,157,87,255,202,151,79,255,197,141,74,255,200, +-146,75,255,180,126,57,255,21,19,14,227,5,5,4,28,0,16,8,7,5, +-113,43,28,14,255,187,96,22,255,181,93,22,255,98,55,21,255,68,42,17, +-255,77,46,18,255,129,72,22,255,174,89,21,255,83,47,18,255,11,9,6, +-221,0,28,6,6,5,28,16,14,11,195,108,76,35,255,210,141,59,255,218, +-162,81,255,167,118,54,255,16,14,11,221,5,5,5,14,0,12,15,13,10, +-170,211,149,76,255,224,168,87,255,223,154,80,255,31,25,16,255,0,20,6, +-6,5,57,34,27,17,255,203,122,36,255,208,124,41,255,109,76,34,255,13, +-12,10,142,0,32,13,11,8,170,176,91,23,255,202,93,21,255,196,99,21, +-255,28,19,9,170,0,8,11,9,6,85,132,71,21,255,195,99,22,255,103, +-59,20,255,11,10,6,170,3,3,2,25,6,6,5,110,55,35,16,255,198, +-113,29,255,212,134,51,255,41,32,20,210,0,68,21,19,14,215,217,163,86, +-255,49,38,24,255,0,12,11,10,8,82,54,43,27,255,200,135,59,255,210, +-137,59,255,207,131,50,255,205,127,44,255,199,117,36,255,195,111,28,255,187, +-101,24,255,93,54,22,255,19,15,10,227,7,6,6,28,0,8,10,9,7, +-170,195,109,32,255,218,138,53,255,224,158,81,255,223,173,95,255,219,167,94, +-255,217,169,94,255,218,171,97,255,217,166,92,255,208,136,59,255,110,68,27, +-255,19,15,10,227,6,6,5,28,0,12,12,11,7,170,61,42,20,255,188, +-106,33,255,208,134,55,255,215,163,82,255,217,166,92,255,216,167,88,255,216, +-167,89,255,211,150,70,255,146,94,39,255,26,21,15,229,9,8,6,28,0, +-12,12,10,7,170,51,32,14,255,151,80,22,255,169,91,22,255,173,86,22, +-255,169,88,22,255,173,86,22,255,180,92,21,255,194,98,21,255,196,95,21, +-255,192,97,21,255,31,21,10,170,0,12,12,10,7,170,57,37,18,255,189, +-107,34,255,212,149,67,255,217,166,92,255,217,166,92,255,218,171,97,255,215, +-163,82,255,205,126,48,255,116,72,29,255,20,16,11,227,6,6,5,28,0, +-8,11,9,6,68,126,68,21,255,191,98,22,255,194,98,21,255,192,97,21, +-255,192,97,21,255,191,98,22,255,177,91,22,255,26,19,9,142,0,12,12, +-10,7,170,58,37,17,255,185,107,30,255,208,134,55,255,216,167,88,255,218, +-171,97,255,217,166,92,255,213,148,72,255,204,130,51,255,209,141,60,255,211, +-159,76,255,30,25,17,170,0,8,10,10,7,167,210,155,77,255,228,178,99, +-255,224,165,81,255,221,165,86,255,217,166,92,255,218,169,93,255,217,166,92, +-255,214,156,81,255,206,135,51,255,116,72,29,255,20,16,11,227,6,6,5, +-28,0,8,13,10,6,57,115,62,20,255,169,91,22,255,165,86,22,255,24, +-18,9,167,0,24,12,10,7,88,117,63,20,255,186,100,23,255,191,107,32, +-255,35,27,16,144,0,8,10,10,7,170,210,155,77,255,228,178,99,255,221, +-152,70,255,24,19,13,255,0,8,12,10,7,170,58,36,15,255,157,79,22, +-255,151,80,22,255,58,35,15,255,11,9,6,57,0,8,12,10,7,85,157, +-81,20,255,197,99,20,255,192,97,21,255,28,20,9,170,0,8,11,9,6, +-57,115,62,20,255,189,94,24,255,198,117,37,255,213,157,76,255,218,171,97, +-255,217,169,94,255,214,161,85,255,213,157,76,255,212,149,67,255,208,134,55, +-255,205,126,48,255,143,96,40,255,28,26,19,229,8,8,7,28,0,8,13, +-12,8,85,141,74,24,255,190,94,23,255,183,95,24,255,183,95,24,255,187, +-93,24,255,189,97,22,255,181,93,22,255,177,91,22,255,169,88,22,255,89, +-52,20,255,21,18,12,227,9,9,8,28,0,12,18,17,13,181,103,74,40, +-255,207,146,74,255,214,156,81,255,210,144,67,255,208,138,55,255,207,129,52, +-255,205,133,48,255,205,126,48,255,151,101,42,255,28,26,19,232,9,8,8, +-28,0,8,13,12,10,110,186,127,63,255,214,156,81,255,213,158,80,255,213, +-155,80,255,214,156,81,255,214,153,75,255,213,148,72,255,213,148,72,255,211, +-150,70,255,159,111,54,255,28,25,19,241,9,8,8,31,0,12,18,17,13, +-181,103,74,40,255,208,156,81,255,214,156,81,255,208,138,55,255,209,137,60, +-255,213,158,80,255,213,155,80,255,213,160,84,255,215,160,88,255,213,163,84, +-255,30,24,17,178,0,8,12,11,9,93,178,121,53,255,213,158,80,255,210, +-143,65,255,211,146,62,255,213,148,72,255,215,163,82,255,213,158,80,255,212, +-149,67,255,209,141,60,255,153,106,49,255,28,25,19,235,9,9,8,31,0, +-12,18,15,11,173,66,43,21,255,187,101,32,255,207,132,52,255,210,144,67, +-255,213,148,72,255,214,156,81,255,216,167,88,255,214,156,81,255,176,128,65, +-255,46,39,27,255,0,12,15,14,10,85,181,111,42,255,215,136,52,255,213, +-125,40,255,211,122,36,255,212,123,37,255,210,123,39,255,202,122,37,255,31, +-24,14,170,0,8,12,11,9,88,164,89,29,255,203,122,36,255,199,117,36, +-255,30,23,15,212,0,12,15,13,10,127,187,133,62,255,213,148,72,255,208, +-138,55,255,31,24,16,170,0,8,13,12,10,85,172,104,37,255,209,134,54, +-255,206,135,51,255,32,25,17,212,0,12,15,13,10,127,181,116,46,255,211, +-143,62,255,210,153,71,255,29,24,16,178,0,8,13,12,10,91,178,121,53, +-255,213,154,70,255,208,134,55,255,31,25,16,210,0,20,15,14,10,125,179, +-110,42,255,210,135,55,255,208,139,65,255,26,21,15,184,0,8,14,13,9, +-85,179,117,44,255,217,165,82,255,213,163,84,255,27,23,16,221,0,12,14, +-12,9,136,174,103,39,255,206,127,43,255,199,117,36,255,31,24,14,170,0, +-8,12,11,9,88,164,89,29,255,202,118,35,255,196,114,33,255,29,22,14, +-210,0,12,14,12,9,125,169,95,30,255,202,119,37,255,199,119,39,255,24, +-19,13,190,0,8,14,12,9,85,170,95,29,255,198,113,29,255,199,116,34, +-255,204,128,47,255,206,135,51,255,204,129,49,255,204,129,49,255,208,134,55, +-255,211,149,76,255,192,140,73,255,95,74,39,255,17,15,12,85,0,16,14, +-12,9,198,211,150,70,255,206,152,81,255,31,26,20,255,7,7,6,48,0, +-16,15,13,10,170,211,149,76,255,226,170,91,255,226,172,95,255,35,28,18, +-255,0,20,15,14,12,218,171,120,60,255,219,154,70,255,41,31,20,255,4, +-4,3,28,0,104,17,16,12,170,219,179,116,255,232,193,137,255,232,199,135, +-255,40,33,23,255,0,12,10,10,9,76,62,50,31,255,20,18,13,167,0, +-12,11,10,8,76,58,46,29,255,20,18,13,167,0,16,13,12,10,170,210, +-150,71,255,223,147,72,255,221,150,66,255,26,21,15,210,0,4,11,10,8, +-119,211,159,84,255,229,184,114,255,230,186,123,255,30,26,19,255,0,16,12, +-11,9,93,137,90,40,255,223,167,94,255,228,180,111,255,167,133,80,255,17, +-16,14,227,11,11,10,170,12,11,9,170,12,11,9,170,12,11,9,119,7, +-7,6,57,0,36,7,7,6,62,21,18,12,227,157,92,28,255,203,105,26, +-255,197,106,26,255,82,48,21,255,14,12,7,173,5,5,4,8,0,16,8, +-7,5,28,26,19,11,227,103,68,25,255,158,96,29,255,57,41,22,255,13, +-12,10,241,33,26,16,255,146,88,31,255,66,47,23,255,12,10,9,201,6, +-5,5,14,0,32,8,7,5,57,30,22,11,255,15,12,8,96,0,8,10, +-10,7,130,190,104,27,255,209,118,30,255,211,117,34,255,27,21,14,255,0, +-24,13,12,10,170,199,122,39,255,218,130,51,255,223,146,70,255,30,24,17, +-255,0,12,23,22,18,139,30,27,21,170,16,15,11,255,89,59,26,255,203, +-110,28,255,196,113,31,255,122,81,33,255,186,117,43,255,216,129,51,255,184, +-126,57,255,38,34,25,255,24,22,19,221,33,30,24,170,15,15,12,28,0, +-12,24,22,19,142,32,31,25,170,21,20,16,198,90,71,45,255,223,179,110, +-255,226,172,95,255,221,150,66,255,143,100,44,255,22,21,17,227,28,27,21, +-170,29,28,22,170,13,13,12,42,0,36,8,8,8,11,25,24,20,142,39, +-35,28,170,30,28,23,170,29,27,22,170,29,27,22,170,29,27,22,170,29, +-27,22,170,29,27,20,170,23,21,16,170,14,13,11,34,0,52,13,12,10, +-159,142,86,31,255,208,116,35,255,201,119,38,255,32,26,17,255,5,5,4, +-28,0,12,14,13,11,170,216,167,97,255,231,184,124,255,231,193,128,255,181, +-146,92,255,52,44,33,255,90,71,45,255,201,155,88,255,223,173,102,255,228, +-179,115,255,230,183,123,255,230,184,119,255,39,32,22,255,0,24,12,12,11, +-170,206,139,61,255,226,164,91,255,228,174,103,255,39,32,22,255,0,48,6, +-6,5,28,9,9,8,142,56,46,31,255,222,180,113,255,230,187,119,255,222, +-180,113,255,23,21,16,255,0,36,15,14,12,164,79,59,30,255,209,128,42, +-255,211,127,44,255,171,117,46,255,18,15,11,170,0,16,9,9,8,116,33, +-28,16,255,161,94,28,255,199,107,26,255,65,40,18,255,8,7,5,255,25, +-20,12,255,198,113,29,255,210,120,33,255,217,133,50,255,27,23,16,255,0, +-8,7,7,6,23,34,28,19,198,46,36,25,255,39,31,22,255,41,33,22, +-255,59,46,28,255,51,40,26,255,61,47,28,255,180,133,71,255,227,175,100, +-255,226,175,103,255,181,143,88,255,17,16,12,142,0,8,11,11,10,170,214, +-166,97,255,229,179,114,255,228,185,111,255,161,121,68,255,23,21,16,227,23, +-22,18,170,22,21,17,170,16,15,13,170,11,11,8,147,8,8,7,85,0, +-40,14,13,11,170,181,143,88,255,228,185,123,255,218,168,97,255,70,54,35, +-255,9,9,8,113,0,12,11,10,8,85,120,87,45,255,223,183,120,255,231, +-190,132,255,167,135,80,255,24,22,19,227,19,18,16,170,19,18,16,198,95, +-80,46,255,226,193,129,255,228,187,129,255,186,148,87,255,15,14,12,170,0, +-8,10,10,9,85,155,113,64,255,229,196,132,255,232,191,133,255,179,142,90, +-255,27,25,20,227,18,18,15,170,19,18,16,198,90,71,45,255,222,175,101, +-255,227,174,98,255,228,185,111,255,28,25,19,255,0,8,7,7,6,23,34, +-28,19,198,49,35,22,255,39,29,18,227,12,11,9,85,0,8,8,7,7, +-28,33,26,16,198,52,39,23,255,47,35,22,227,13,12,8,85,0,8,8, +-8,7,28,33,30,24,227,201,157,100,255,230,186,123,255,181,137,74,255,16, +-15,11,207,6,6,5,23,0,24,11,10,8,28,27,21,12,193,26,19,11, +-255,23,18,10,255,23,18,10,255,24,18,11,255,24,18,11,255,26,20,11, +-255,35,27,16,255,42,31,19,241,17,14,10,85,0,28,9,9,8,144,91, +-67,36,255,217,154,72,255,211,150,70,255,69,55,34,255,15,14,12,85,0, +-28,6,6,5,11,11,11,10,142,24,22,19,255,167,135,80,255,225,172,104, +-255,224,166,83,255,193,126,54,255,16,14,11,170,0,8,13,12,8,85,185, +-97,26,255,207,112,28,255,204,110,27,255,71,46,22,255,8,8,7,255,28, +-22,13,255,198,107,27,255,193,111,30,255,126,78,31,255,199,139,62,255,226, +-184,111,255,27,24,18,255,0,8,11,10,8,170,214,166,97,255,230,187,119, +-255,228,179,103,255,143,102,48,255,17,16,12,227,12,12,9,170,13,12,10, +-198,46,33,17,255,199,112,28,255,206,111,27,255,204,110,27,255,32,23,13, +-176,0,8,12,11,9,136,204,134,59,255,226,172,95,255,228,181,107,255,162, +-125,73,255,24,22,19,227,19,18,16,170,19,18,16,198,95,80,46,255,224, +-179,109,255,223,173,95,255,173,117,50,255,15,13,10,156,0,8,12,11,7, +-99,185,97,26,255,208,112,27,255,204,110,27,255,22,18,11,255,0,40,16, +-15,13,170,219,179,116,255,232,194,133,255,231,193,128,255,40,33,23,255,0, +-12,16,15,13,170,219,177,112,255,230,187,119,255,224,159,83,255,24,21,15, +-255,0,8,11,10,8,164,211,158,82,255,229,184,114,255,230,191,123,255,166, +-127,77,255,22,21,17,227,22,21,17,170,20,19,13,170,14,13,11,28,0, +-16,12,11,9,170,195,112,30,255,209,106,30,255,206,111,27,255,101,63,26, +-255,16,14,11,227,23,21,16,170,29,27,22,170,13,13,12,42,0,16,16, +-15,13,170,216,167,97,255,224,158,87,255,216,125,45,255,24,20,13,255,0, +-40,17,16,12,170,219,177,112,255,232,195,137,255,231,189,128,255,162,125,73, +-255,22,21,17,227,14,14,11,170,13,12,10,198,50,35,19,255,199,112,28, +-255,206,111,27,255,204,110,27,255,32,24,13,170,0,8,13,12,8,93,194, +-109,33,255,219,139,54,255,224,158,81,255,39,32,22,255,0,40,11,10,8, +-170,190,104,27,255,208,112,27,255,204,110,27,255,32,24,13,170,0,8,13, +-12,8,85,184,96,25,255,207,112,28,255,204,102,27,255,129,78,28,255,31, +-26,16,255,127,84,34,255,219,147,70,255,173,122,62,255,15,14,12,212,6, +-6,5,25,0,16,16,15,13,170,213,155,80,255,221,144,68,255,217,130,52, +-255,31,25,16,255,0,32,10,9,7,170,189,99,26,255,208,112,27,255,204, +-110,27,255,155,87,26,255,72,46,21,255,179,103,36,255,223,156,76,255,216, +-170,97,255,134,96,47,255,174,127,71,255,221,167,90,255,223,147,72,255,222, +-158,75,255,23,19,14,252,0,8,11,10,8,170,214,166,97,255,231,187,124, +-255,230,191,123,255,228,182,117,255,222,175,101,255,64,50,33,255,7,7,6, +-229,26,23,19,255,220,175,105,255,228,183,113,255,228,188,117,255,25,21,16, +-255,0,8,11,10,8,170,217,176,112,255,232,197,137,255,232,199,135,255,37, +-31,22,255,0,12,13,12,10,170,198,117,37,255,215,127,42,255,217,130,52, +-255,21,19,14,255,0,8,11,10,8,167,215,172,104,255,232,191,133,255,231, +-190,132,255,166,127,77,255,23,21,16,227,18,17,15,170,17,16,12,198,74, +-52,27,255,204,117,33,255,211,111,30,255,173,93,28,255,15,12,8,164,0, +-8,13,12,8,88,185,97,26,255,208,112,27,255,204,110,27,255,19,16,10, +-255,0,12,10,9,7,170,190,104,27,255,212,118,35,255,216,136,51,255,21, +-19,14,252,0,8,11,10,8,167,215,172,104,255,232,194,127,255,231,193,128, +-255,166,129,77,255,23,21,16,227,19,18,16,170,19,18,14,198,81,59,34, +-255,213,144,62,255,215,140,60,255,165,108,40,255,13,12,10,167,0,8,8, +-8,7,85,101,63,26,255,206,114,33,255,212,121,33,255,155,92,36,255,23, +-21,16,227,22,21,17,170,28,26,21,170,21,20,18,170,13,13,12,164,10, +-10,9,85,6,6,6,6,0,28,12,11,9,170,194,112,31,255,212,119,37, +-255,216,134,45,255,35,28,18,255,0,24,16,15,13,170,217,171,106,255,231, +-187,124,255,228,181,107,255,39,32,22,255,0,12,16,15,11,170,208,134,55, +-255,223,156,70,255,221,148,70,255,23,20,14,238,0,8,11,10,8,170,204, +-136,55,255,223,156,70,255,222,158,75,255,34,28,19,255,0,12,14,13,11, +-170,217,171,106,255,232,189,127,255,230,186,123,255,25,22,16,255,0,8,10, +-10,9,167,210,155,77,255,226,172,95,255,224,165,81,255,31,26,18,255,0, +-20,15,13,12,170,217,173,104,255,232,191,133,255,231,195,132,255,40,33,23, +-255,0,20,10,9,9,133,73,58,36,255,225,184,120,255,231,193,128,255,228, +-180,111,255,147,102,48,255,15,13,10,227,8,7,7,28,0,24,12,11,7, +-198,100,59,23,255,169,93,26,255,156,91,27,255,174,96,27,255,180,99,27, +-255,168,97,27,255,105,62,24,255,18,15,9,255,7,6,6,48,0,24,7, +-7,7,28,15,15,12,227,144,114,67,255,219,177,112,255,223,176,102,255,153, +-113,62,255,17,16,12,227,7,7,6,28,0,16,16,15,13,170,213,155,80, +-255,223,146,70,255,217,129,50,255,27,22,14,255,0,24,12,10,9,195,161, +-94,28,255,207,114,32,255,193,114,36,255,23,20,16,255,0,32,12,11,9, +-170,191,105,28,255,207,100,28,255,204,110,27,255,26,20,11,204,0,8,6, +-5,5,3,26,19,9,198,24,18,9,246,15,12,8,142,0,12,15,13,10, +-91,31,24,16,244,51,39,24,255,21,19,14,91,0,68,10,10,9,76,61, +-49,30,255,20,18,13,156,0,16,17,15,12,142,27,22,14,232,30,22,13, +-255,25,20,12,255,22,18,11,238,21,16,10,255,99,58,22,255,203,113,26, +-255,205,111,28,255,131,80,30,255,12,11,9,142,0,8,11,10,8,170,212, +-160,85,255,232,191,127,255,231,195,132,255,196,155,91,255,81,59,34,255,41, +-32,20,255,54,43,27,255,180,133,71,255,216,144,59,255,208,115,33,255,129, +-78,28,255,12,11,7,142,0,8,8,7,7,57,72,52,29,255,215,155,78, +-255,227,174,98,255,207,158,94,255,85,63,34,255,36,29,19,255,57,43,26, +-255,189,130,66,255,219,149,66,255,212,121,41,255,172,105,33,255,17,15,10, +-147,0,8,7,6,6,54,58,40,21,255,198,113,29,255,206,103,27,255,165, +-87,24,255,42,28,13,255,21,16,8,255,27,20,10,255,95,60,22,255,202, +-105,27,255,206,100,29,255,204,110,27,255,35,24,12,170,0,8,7,7,6, +-54,70,50,27,255,212,145,65,255,227,174,98,255,201,155,88,255,59,44,28, +-255,23,20,14,255,34,28,19,255,157,104,48,255,211,126,42,255,208,115,33, +-255,132,82,29,255,13,11,8,142,0,12,24,18,9,221,108,61,23,255,201, +-112,26,255,207,112,28,255,204,110,27,255,158,91,25,255,46,29,13,249,11, +-10,6,57,0,8,8,8,7,57,70,50,27,255,212,142,59,255,226,172,95, +-255,207,158,94,255,85,63,34,255,41,32,20,255,57,43,26,255,174,124,59, +-255,224,170,93,255,229,184,114,255,231,196,128,255,28,25,19,255,0,8,10, +-10,9,167,215,169,102,255,232,191,127,255,231,193,128,255,196,154,87,255,77, +-59,34,255,41,31,20,255,54,43,27,255,168,113,49,255,212,121,41,255,206, +-114,33,255,132,82,29,255,12,11,9,130,0,8,12,11,7,110,188,98,25, +-255,206,111,27,255,206,106,25,255,26,19,11,255,0,24,14,12,9,170,199, +-117,36,255,221,148,62,255,227,174,98,255,28,26,19,255,0,8,10,10,9, +-167,212,161,89,255,224,166,83,255,217,129,50,255,32,24,15,255,5,5,4, +-31,7,7,6,136,65,44,22,255,192,106,29,255,203,108,24,255,114,66,23, +-255,17,13,8,221,0,12,10,9,7,139,185,97,26,255,208,112,27,255,208, +-117,29,255,32,24,13,170,0,8,15,13,8,91,189,99,26,255,215,123,42, +-255,226,172,95,255,198,152,87,255,81,58,34,255,176,133,71,255,224,168,95, +-255,197,138,62,255,65,47,26,255,133,81,30,255,208,121,37,255,212,115,37, +-255,152,98,35,255,12,11,9,142,0,8,10,9,7,147,190,107,25,255,206, +-111,27,255,206,106,25,255,158,91,25,255,42,28,13,255,21,15,8,255,26, +-19,9,255,114,66,23,255,204,113,25,255,208,115,33,255,173,122,62,255,16, +-15,13,150,0,8,8,8,7,71,110,87,51,255,222,180,113,255,224,166,83, +-255,209,137,60,255,133,84,32,255,77,50,24,255,89,59,26,255,181,109,32, +-255,210,121,35,255,212,121,41,255,171,116,52,255,15,14,12,142,0,8,14, +-13,11,170,219,177,112,255,231,187,124,255,228,180,111,255,205,158,90,255,79, +-58,32,255,38,29,19,255,49,35,22,255,167,114,46,255,217,146,62,255,219, +-154,70,255,169,117,56,255,15,13,12,156,0,8,8,8,7,71,104,80,45, +-255,224,183,119,255,232,191,127,255,210,166,97,255,81,60,32,255,39,30,18, +-255,52,40,25,255,175,128,66,255,225,173,98,255,228,180,105,255,226,175,95, +-255,29,25,18,255,0,8,12,12,11,170,208,138,55,255,222,145,63,255,220, +-139,59,255,193,121,50,255,68,50,29,255,38,28,19,255,48,35,23,255,175, +-112,44,255,217,142,54,255,217,144,66,255,191,137,66,255,19,16,12,170,0, +-8,9,8,8,74,111,82,40,255,216,155,75,255,226,172,95,255,200,151,81, +-255,57,41,26,255,27,23,16,255,35,28,18,255,41,32,20,255,39,30,20, +-255,25,22,16,227,15,14,10,142,0,12,10,9,7,28,33,24,14,227,135, +-81,28,255,206,117,31,255,210,108,33,255,208,110,31,255,171,92,28,255,49, +-33,16,252,13,11,8,68,0,8,11,10,8,170,195,108,30,255,212,118,35, +-255,217,137,52,255,42,33,23,255,0,12,20,18,15,170,214,156,81,255,221, +-148,62,255,214,127,43,255,23,19,12,238,0,8,10,10,7,159,196,109,31, +-255,213,119,36,255,212,123,37,255,31,24,14,255,0,12,15,14,10,170,209, +-137,60,255,228,172,99,255,230,189,119,255,28,26,19,255,0,8,12,12,11, +-170,208,134,55,255,218,137,51,255,214,127,43,255,35,27,16,255,0,20,16, +-14,11,170,199,116,34,255,217,132,48,255,224,166,83,255,32,26,19,255,0, +-8,10,10,7,34,81,58,34,255,224,178,105,255,226,172,95,255,129,92,40, +-255,9,9,8,170,6,6,6,85,6,6,5,113,35,27,16,255,204,117,33, +-255,208,117,29,255,110,69,25,255,14,12,7,108,0,8,10,10,7,170,195, +-112,30,255,211,115,30,255,211,115,30,255,30,23,13,255,0,12,14,12,9, +-170,196,113,31,255,211,120,32,255,214,126,41,255,33,26,18,255,0,8,9, +-8,6,28,44,33,19,212,60,42,23,255,46,35,21,255,74,53,31,255,156, +-109,53,255,216,167,97,255,228,179,109,255,229,177,110,255,227,184,108,255,168, +-123,69,255,23,21,16,227,9,8,8,28,0,12,17,16,14,170,134,98,51, +-255,223,166,92,255,132,100,53,255,9,9,8,133,0,20,16,15,13,170,219, +-177,112,255,232,191,133,255,231,195,132,255,40,33,23,255,0,20,6,6,5, +-45,39,32,22,255,210,129,49,255,172,106,35,255,20,17,13,227,11,11,8, +-28,0,100,17,17,14,170,221,189,132,255,235,205,154,255,234,205,155,255,42, +-39,29,255,0,16,9,9,8,25,0,20,9,8,8,25,0,20,14,14,11, +-170,208,141,61,255,224,168,87,255,228,174,103,255,31,26,20,221,0,4,13, +-12,12,130,218,185,127,255,234,202,147,255,232,198,139,255,40,33,25,255,0, +-20,17,17,14,176,140,115,71,255,230,202,147,255,232,202,149,255,218,170,101, +-255,200,124,43,255,198,117,37,255,198,117,37,255,196,116,37,255,72,52,27, +-255,12,11,9,170,0,28,8,8,7,85,37,31,20,255,174,110,41,255,210, +-123,39,255,204,120,37,255,130,87,31,255,15,13,10,190,0,28,5,5,4, +-113,28,26,19,255,210,143,65,255,220,163,81,255,217,166,92,255,222,173,97, +-255,225,176,98,255,42,37,25,255,4,4,4,74,0,56,13,12,10,170,208, +-141,61,255,226,172,95,255,228,183,111,255,40,34,25,255,0,24,17,16,14, +-170,219,177,112,255,232,194,133,255,233,202,148,255,27,24,20,255,0,8,16, +-15,13,85,199,161,102,255,220,166,89,255,211,143,62,255,217,154,72,255,223, +-161,80,255,224,169,91,255,225,185,114,255,229,188,124,255,231,190,132,255,231, +-200,143,255,227,195,140,255,227,196,138,255,225,195,136,255,44,37,27,170,0, +-8,17,16,14,85,200,165,109,255,227,198,142,255,225,191,132,255,227,195,134, +-255,231,199,136,255,231,197,132,255,231,194,124,255,229,191,130,255,225,195,136, +-255,225,195,136,255,225,191,132,255,49,42,30,198,0,36,18,17,13,105,193, +-135,66,255,221,175,102,255,222,186,123,255,223,190,132,255,224,192,135,255,223, +-190,132,255,222,186,123,255,221,178,110,255,218,172,105,255,46,39,27,195,0, +-48,6,6,6,28,27,26,20,255,216,170,97,255,225,178,104,255,176,136,83, +-255,16,15,13,198,0,16,17,17,14,170,221,188,130,255,235,205,154,255,234, +-205,155,255,232,204,149,255,228,199,143,255,171,144,96,255,64,57,41,255,154, +-126,81,255,227,189,122,255,230,184,119,255,227,171,98,255,34,30,21,255,0, +-24,17,16,14,170,221,186,126,255,234,202,147,255,232,192,135,255,44,39,27, +-255,0,44,9,9,8,142,25,24,20,255,114,95,53,255,207,169,102,255,227, +-187,118,255,226,188,123,255,178,148,95,255,19,18,16,170,0,32,24,22,19, +-85,197,145,84,255,227,187,118,255,231,194,124,255,207,173,114,255,61,55,38, +-255,8,8,8,136,0,12,10,10,9,108,45,36,21,255,195,116,38,255,207, +-122,38,255,139,90,32,255,13,12,8,170,0,4,10,10,9,198,208,140,59, +-255,226,170,91,255,231,193,128,255,40,35,27,255,0,36,4,4,3,28,18, +-17,13,227,222,189,131,255,234,201,143,255,229,191,130,255,34,30,23,204,0, +-8,11,11,10,170,211,158,82,255,226,170,91,255,224,165,81,255,219,154,70, +-255,208,132,51,255,206,128,45,255,204,122,41,255,201,120,40,255,196,116,37, +-255,111,74,30,255,20,18,13,227,8,8,7,28,0,28,6,6,6,28,28, +-26,21,255,222,186,123,255,229,196,132,255,181,144,92,255,16,15,13,212,0, +-16,6,6,6,85,25,24,20,255,180,149,101,255,231,205,154,255,232,204,149, +-255,227,198,142,255,223,192,138,255,223,193,136,255,230,199,139,255,232,197,141, +-255,211,176,122,255,64,57,41,255,8,8,7,113,0,8,6,6,5,14,33, +-31,24,227,186,155,107,255,232,204,149,255,233,205,152,255,227,197,140,255,221, +-189,132,255,224,192,135,255,228,198,141,255,232,201,141,255,232,192,135,255,231, +-197,132,255,41,35,26,255,0,64,17,16,14,139,211,178,120,255,233,202,148, +-255,233,202,148,255,56,48,33,255,4,4,4,85,0,104,11,11,10,255,216, +-164,89,255,230,191,123,255,227,195,134,255,40,35,27,227,0,28,16,15,13, +-227,126,105,69,255,217,176,112,255,225,175,104,255,223,159,76,255,189,124,49, +-255,43,35,20,255,9,8,8,57,0,8,10,10,9,133,194,109,33,255,215, +-125,38,255,212,124,39,255,144,93,33,255,29,24,16,255,68,53,29,255,186, +-123,49,255,128,95,47,255,25,24,20,255,143,119,78,255,230,201,145,255,33, +-30,24,255,0,8,11,11,10,170,217,176,112,255,228,182,109,255,222,158,75, +-255,212,134,51,255,204,122,41,255,198,117,37,255,200,118,37,255,208,123,39, +-255,212,123,37,255,214,121,39,255,217,133,50,255,24,21,15,244,0,8,11, +-11,10,170,218,185,127,255,235,203,148,255,233,202,148,255,230,201,145,255,227, +-197,140,255,221,187,128,255,221,184,120,255,224,178,105,255,224,164,85,255,189, +-129,58,255,39,32,20,255,7,7,6,85,0,8,11,10,8,125,194,109,33, +-255,215,125,38,255,213,125,40,255,29,24,16,255,0,40,17,17,14,170,221, +-188,130,255,235,201,152,255,232,201,141,255,42,36,27,255,0,12,17,17,14, +-170,219,179,116,255,231,187,124,255,228,183,111,255,24,22,17,255,0,8,11, +-11,10,170,218,185,127,255,232,197,137,255,227,179,104,255,219,155,72,255,208, +-132,51,255,204,122,41,255,202,120,39,255,38,31,19,170,0,16,12,11,9, +-170,196,110,33,255,215,113,38,255,213,122,42,255,215,143,58,255,217,166,92, +-255,222,186,123,255,225,195,136,255,52,44,33,198,0,16,17,16,14,170,211, +-150,70,255,219,140,56,255,213,126,42,255,25,21,14,255,0,40,17,17,14, +-170,221,187,128,255,232,199,141,255,228,180,111,255,219,155,72,255,207,128,44, +-255,199,119,39,255,200,118,37,255,208,123,39,255,212,123,37,255,214,125,39, +-255,212,124,39,255,34,26,15,181,0,8,11,10,10,161,215,172,104,255,234, +-201,143,255,234,206,151,255,42,39,29,255,0,40,12,11,9,170,196,110,33, +-255,215,125,38,255,212,124,39,255,36,28,17,170,0,8,15,14,10,85,194, +-109,33,255,215,125,38,255,212,124,39,255,210,128,41,255,211,135,54,255,225, +-176,98,255,231,197,132,255,56,48,33,255,4,4,4,85,0,20,17,16,14, +-170,206,135,51,255,217,133,50,255,213,122,42,255,25,21,14,255,0,32,12, +-11,9,170,196,110,33,255,215,125,38,255,213,122,42,255,67,51,28,255,6, +-6,5,255,40,34,25,255,226,190,127,255,138,110,69,255,7,7,7,255,25, +-24,20,255,221,179,112,255,232,191,127,255,232,201,141,255,26,23,19,255,0, +-8,11,11,10,170,214,168,101,255,230,187,119,255,228,188,117,255,212,173,105, +-255,150,118,67,255,102,86,47,255,111,90,50,255,185,145,88,255,227,187,118, +-255,231,195,132,255,232,201,141,255,26,23,19,255,0,8,11,11,10,170,219, +-184,128,255,235,205,154,255,234,206,151,255,42,36,27,255,0,12,15,15,12, +-170,213,158,80,255,228,182,109,255,230,191,123,255,27,23,18,255,0,8,11, +-11,10,170,219,189,132,255,235,205,154,255,232,197,141,255,225,185,114,255,215, +-155,78,255,206,135,51,255,205,126,42,255,209,128,42,255,212,121,41,255,181, +-111,36,255,39,30,18,255,8,8,7,57,0,8,10,10,9,136,194,109,33, +-255,215,125,38,255,212,124,39,255,24,20,13,255,0,12,15,14,12,170,210, +-146,71,255,229,183,110,255,231,197,132,255,26,23,19,255,0,8,11,11,10, +-170,218,189,127,255,234,199,143,255,231,197,132,255,225,176,106,255,214,153,75, +-255,208,138,55,255,205,133,48,255,210,127,45,255,214,134,49,255,179,119,42, +-255,37,30,18,255,7,7,6,85,0,12,23,20,14,227,161,115,50,255,222, +-167,89,255,227,186,114,255,225,190,130,255,223,198,136,255,227,198,142,255,224, +-196,141,255,221,191,134,255,161,130,86,255,33,30,24,229,10,10,9,42,0, +-24,15,15,12,170,211,149,76,255,228,182,109,255,231,189,128,255,44,39,27, +-255,0,24,17,17,14,170,216,170,97,255,226,172,95,255,224,165,81,255,31, +-26,18,255,0,12,13,12,10,170,201,120,40,255,217,133,50,255,216,125,45, +-255,25,21,14,212,0,8,11,10,8,144,203,130,52,255,224,166,83,255,228, +-174,103,255,40,34,25,255,0,12,17,16,14,170,221,187,128,255,234,201,143, +-255,230,191,123,255,28,25,19,244,0,8,10,10,9,164,203,122,50,255,220, +-148,63,255,217,141,52,255,23,20,14,255,0,8,14,13,11,108,10,10,9, +-28,0,4,13,13,12,170,221,189,134,255,235,205,154,255,234,206,151,255,42, +-37,27,255,0,24,11,11,10,255,222,189,131,255,232,195,131,255,224,162,81, +-255,36,29,19,255,4,4,4,54,0,28,7,7,6,28,19,17,12,232,93, +-66,30,255,183,112,36,255,209,122,38,255,212,120,39,255,159,102,34,255,22, +-19,13,255,7,7,6,85,0,24,6,6,5,28,17,16,14,227,149,122,84, +-255,227,195,140,255,227,191,134,255,179,142,90,255,17,16,14,227,5,5,4, +-25,0,20,15,14,12,170,204,129,49,255,218,141,51,255,213,126,42,255,25, +-21,14,255,0,24,8,7,7,91,68,48,25,255,205,127,44,255,220,153,75, +-255,99,78,44,255,8,8,7,113,0,28,12,11,9,170,196,110,33,255,215, +-125,38,255,212,124,39,255,24,20,13,255,0,124,9,9,8,25,0,40,2, +-2,1,23,9,8,6,255,199,116,34,255,215,125,38,255,212,128,45,255,27, +-24,16,207,0,8,11,11,10,170,219,184,128,255,235,205,154,255,234,205,155, +-255,58,49,35,255,5,5,4,85,0,4,4,4,3,28,16,15,11,227,204, +-122,41,255,215,126,40,255,210,123,39,255,32,25,15,170,0,8,13,13,12, +-122,208,168,99,255,234,199,143,255,234,204,151,255,63,54,38,255,5,5,4, +-85,0,4,4,4,3,28,18,17,13,215,204,127,45,255,214,125,39,255,212, +-121,41,255,34,27,15,170,0,8,13,12,10,85,185,112,34,255,215,125,38, +-255,212,123,37,255,35,28,16,255,4,4,3,85,0,4,3,3,2,28,12, +-10,9,224,198,117,37,255,215,125,38,255,212,124,39,255,34,27,15,178,0, +-8,14,13,11,113,206,162,94,255,232,199,141,255,234,207,155,255,63,53,36, +-255,4,4,3,113,0,4,3,3,3,28,10,10,9,255,200,118,37,255,215, +-125,38,255,210,123,39,255,27,22,14,227,0,12,3,3,2,6,13,11,8, +-221,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,5,4,4, +-57,0,12,15,14,12,147,206,154,87,255,232,195,137,255,234,204,151,255,63, +-54,38,255,5,5,4,85,0,4,4,4,3,28,18,16,13,227,222,189,131, +-255,235,205,152,255,234,205,155,255,27,24,20,255,0,8,11,11,10,170,219, +-184,130,255,235,205,152,255,234,205,155,255,58,49,35,255,5,5,4,85,0, +-4,4,4,3,28,14,12,9,227,199,117,36,255,215,113,38,255,210,123,39, +-255,32,25,15,170,0,8,12,12,9,102,194,109,33,255,215,125,38,255,212, +-124,39,255,27,22,14,255,0,24,18,16,13,170,217,176,110,255,234,196,143, +-255,234,204,151,255,27,24,20,255,0,8,11,10,10,170,204,134,59,255,219, +-136,54,255,213,122,42,255,72,50,27,255,8,8,7,255,25,22,14,255,195, +-116,38,255,208,123,39,255,142,91,31,255,16,14,9,193,4,4,3,17,0, +-12,11,11,8,170,198,117,37,255,219,133,56,255,221,152,70,255,27,23,16, +-221,0,8,13,12,10,99,193,113,34,255,223,156,70,255,231,193,128,255,40, +-34,25,255,4,3,3,113,17,16,12,227,208,136,59,255,45,36,21,255,4, +-3,3,113,10,9,7,207,196,110,33,255,215,125,38,255,210,128,41,255,32, +-25,15,170,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212,124,39, +-255,35,27,16,255,4,4,3,85,0,4,3,3,2,28,12,11,9,227,199, +-117,36,255,221,150,66,255,229,191,126,255,32,29,23,210,0,8,13,13,12, +-122,204,150,79,255,223,159,76,255,217,141,52,255,84,57,29,255,9,8,6, +-170,5,5,4,85,6,6,5,113,27,22,14,255,207,128,44,255,223,147,72, +-255,227,187,118,255,34,30,23,207,0,8,12,11,11,170,218,180,119,255,229, +-184,114,255,224,167,85,255,50,40,25,255,5,5,4,85,0,4,4,4,3, +-28,14,12,9,227,203,125,42,255,217,128,48,255,213,128,45,255,35,27,16, +-173,0,8,12,12,11,130,209,163,98,255,235,203,148,255,233,202,148,255,63, +-54,36,255,5,5,4,85,0,4,4,4,3,28,15,15,12,227,209,137,60, +-255,221,151,68,255,219,147,62,255,23,20,14,238,0,8,10,10,9,150,196, +-121,41,255,217,128,48,255,215,133,44,255,40,31,19,255,5,5,5,85,0, +-4,4,4,3,28,16,14,11,207,201,120,40,255,217,133,50,255,221,161,76, +-255,57,44,28,170,0,8,15,14,12,105,211,165,98,255,232,197,137,255,232, +-199,141,255,58,49,35,255,4,4,3,113,0,40,3,3,2,17,12,11,9, +-227,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,4,4,3, +-62,0,12,12,11,9,170,200,120,41,255,223,159,76,255,230,191,123,255,44, +-37,27,255,0,12,18,17,15,170,208,140,59,255,217,133,50,255,213,125,40, +-255,27,23,14,195,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212, +-124,39,255,25,21,14,255,0,12,17,16,14,170,219,179,116,255,235,201,152, +-255,234,204,151,255,27,24,20,255,0,8,10,10,9,170,198,122,41,255,215, +-127,42,255,213,125,40,255,27,22,14,255,0,20,12,11,9,170,201,120,40, +-255,224,156,83,255,231,190,132,255,40,33,25,255,0,12,10,10,9,85,52, +-42,29,255,200,142,59,255,183,119,44,255,72,52,27,255,39,30,18,255,49, +-37,22,255,150,99,33,255,196,116,37,255,77,50,24,255,10,9,7,144,0, +-12,10,10,9,170,196,115,35,255,215,125,38,255,212,124,39,255,25,21,14, +-255,0,12,12,11,9,170,196,110,33,255,214,127,43,255,222,158,75,255,41, +-34,24,255,0,24,5,5,4,85,11,11,10,255,130,101,59,255,223,176,102, +-255,224,176,101,255,177,137,74,255,18,17,13,227,6,5,5,28,0,12,20, +-19,15,85,186,120,49,255,217,142,62,255,217,139,56,255,34,29,19,255,4, +-4,3,17,0,20,17,17,14,170,221,188,130,255,235,205,152,255,234,205,155, +-255,42,39,29,255,0,24,13,13,10,181,199,119,39,255,212,121,41,255,203, +-121,40,255,35,29,17,170,0,100,20,18,15,170,222,186,123,255,234,201,143, +-255,232,197,135,255,47,40,28,255,0,64,14,13,11,170,213,160,84,255,230, +-187,119,255,231,197,132,255,35,30,22,198,0,4,14,13,11,108,217,176,112, +-255,232,193,137,255,231,197,132,255,33,28,22,255,0,24,12,12,11,113,31, +-29,22,210,40,35,27,255,41,34,24,255,29,24,16,255,32,26,17,255,146, +-92,35,255,214,134,49,255,212,128,45,255,123,81,36,255,15,13,10,142,0, +-20,7,7,6,85,28,26,19,252,194,140,71,255,212,127,43,255,202,118,35, +-255,97,66,30,255,15,14,10,207,6,6,5,25,0,24,6,6,5,8,15, +-13,12,227,111,86,50,255,209,168,102,255,176,136,83,255,85,67,44,255,163, +-129,80,255,221,186,126,255,83,69,44,255,7,7,6,170,5,5,5,8,0, +-4,9,9,8,108,20,18,13,170,13,12,10,51,0,36,16,15,13,170,217, +-176,110,255,232,194,133,255,232,198,139,255,36,33,25,255,0,24,15,15,12, +-170,219,179,116,255,232,193,137,255,232,199,135,255,31,26,20,255,0,8,11, +-11,10,28,56,48,33,227,98,76,45,255,104,80,45,255,195,154,96,255,227, +-186,114,255,226,189,125,255,207,173,114,255,222,188,123,255,231,190,132,255,217, +-188,124,255,137,109,70,255,99,86,54,255,78,64,43,255,21,20,16,85,0, +-8,12,12,11,28,54,48,35,227,86,72,47,255,74,63,43,255,171,137,84, +-255,229,191,130,255,230,191,123,255,230,186,123,255,202,164,105,255,97,80,50, +-255,75,64,44,255,72,61,39,255,22,21,17,102,0,36,12,11,11,45,55, +-45,30,227,90,71,45,255,78,63,41,255,72,61,39,255,74,63,43,255,72, +-61,39,255,72,61,39,255,91,74,46,255,78,63,41,255,22,20,17,102,0, +-48,12,12,11,176,132,106,61,255,228,188,125,255,210,172,113,255,42,37,29, +-255,9,9,8,62,0,16,17,16,14,170,221,186,124,255,234,199,143,255,232, +-201,141,255,232,201,141,255,221,189,134,255,52,46,33,255,6,7,6,227,24, +-23,17,255,208,132,51,255,215,133,44,255,212,124,39,255,24,20,13,255,0, +-24,17,16,12,170,219,177,112,255,231,187,124,255,228,182,109,255,40,33,23, +-255,0,36,9,9,8,74,17,15,12,227,67,51,28,255,162,107,43,255,200, +-142,67,255,204,157,91,255,177,140,86,255,74,63,43,255,19,17,16,198,9, +-9,8,28,0,32,14,14,11,31,56,46,31,227,192,157,103,255,229,194,128, +-255,225,188,124,255,146,112,67,255,11,10,8,164,0,8,7,7,6,28,34, +-27,17,255,190,107,33,255,210,121,35,255,146,95,35,255,16,14,11,187,0, +-8,9,9,8,170,214,164,93,255,232,194,127,255,231,195,132,255,40,34,25, +-255,0,40,13,13,10,170,213,157,84,255,224,166,83,255,221,150,66,255,23, +-20,14,246,0,8,12,11,9,113,194,109,33,255,212,119,37,255,210,113,35, +-255,168,103,33,255,56,42,23,255,27,23,14,255,38,31,19,255,149,92,30, +-255,207,118,32,255,207,113,30,255,124,75,27,255,13,11,8,161,0,28,12, +-12,11,176,130,99,59,255,229,191,126,255,211,174,116,255,43,37,28,255,9, +-9,8,59,0,16,8,8,7,85,68,58,37,255,214,177,119,255,231,196,136, +-255,207,171,114,255,97,80,50,255,54,47,35,255,66,59,41,255,178,148,95, +-255,228,189,121,255,224,187,123,255,146,112,67,255,12,12,11,170,0,12,10, +-10,9,28,16,15,13,147,29,28,22,221,48,42,31,255,70,61,41,255,66, +-57,39,255,70,61,41,255,171,140,92,255,224,170,101,255,224,168,87,255,224, +-165,81,255,39,32,22,255,0,64,14,13,11,57,100,82,51,255,222,186,123, +-255,226,172,95,255,113,82,38,255,9,8,8,127,0,32,11,9,6,102,11, +-10,6,170,11,10,8,170,12,11,9,170,15,13,10,170,15,13,10,170,15, +-14,10,170,18,15,11,170,18,15,11,156,12,11,9,28,0,28,6,6,5, +-65,40,34,25,255,224,183,119,255,229,195,136,255,171,140,92,255,21,20,18, +-142,0,24,11,10,8,102,131,92,46,255,213,145,56,255,214,119,43,255,210, +-128,41,255,151,94,32,255,23,21,14,255,10,10,9,85,0,12,10,9,7, +-170,191,106,30,255,211,115,30,255,208,114,31,255,141,87,30,255,36,31,19, +-255,121,90,42,255,217,168,92,255,205,163,102,255,132,102,59,255,213,172,108, +-255,231,193,128,255,35,30,22,255,0,8,11,11,10,164,203,129,50,255,215, +-127,42,255,211,117,34,255,166,97,29,255,54,40,21,255,29,23,14,255,38, +-31,19,255,120,78,29,255,206,118,33,255,214,127,43,255,224,155,81,255,23, +-21,16,255,0,8,11,10,10,170,217,183,116,255,234,201,143,255,232,198,139, +-255,202,166,109,255,97,78,50,255,52,46,33,255,58,50,33,255,150,96,39, +-255,208,121,37,255,195,112,30,255,83,53,24,255,9,8,6,113,0,8,13, +-12,8,96,189,104,28,255,210,120,33,255,214,132,45,255,34,29,19,255,0, +-40,17,16,12,170,217,172,102,255,228,180,105,255,228,181,107,255,40,33,23, +-255,0,12,17,15,12,170,216,171,101,255,232,191,127,255,231,197,132,255,24, +-22,17,255,0,8,11,11,10,167,209,146,72,255,221,151,68,255,213,126,42, +-255,172,106,35,255,57,41,22,255,42,32,19,255,43,33,20,252,18,15,11, +-85,0,16,11,10,8,170,193,111,30,255,215,113,38,255,220,144,63,255,197, +-145,84,255,91,71,44,255,75,62,42,255,75,64,44,255,22,21,17,99,0, +-16,14,13,11,170,196,110,33,255,210,115,31,255,210,115,31,255,22,19,11, +-227,0,8,16,13,9,113,24,21,15,170,17,15,12,170,18,15,13,170,19, +-17,12,142,9,8,8,28,0,8,14,13,11,170,210,146,71,255,220,142,59, +-255,213,125,40,255,168,103,33,255,54,40,21,255,29,23,14,255,38,31,19, +-255,119,78,30,255,204,116,31,255,210,119,31,255,210,115,31,255,26,20,13, +-210,0,8,11,11,10,170,217,179,120,255,234,202,147,255,232,201,141,255,40, +-35,25,255,0,40,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31, +-255,36,25,13,170,0,8,14,12,9,85,190,105,29,255,210,107,31,255,208, +-114,31,255,187,124,42,255,143,111,56,255,210,171,109,255,229,187,128,255,131, +-99,54,255,8,8,7,156,0,20,13,12,10,170,194,112,31,255,210,107,31, +-255,210,115,31,255,22,19,11,255,0,32,11,10,8,170,193,111,30,255,215, +-125,38,255,218,141,59,255,39,33,22,255,5,5,5,28,12,12,11,170,156, +-126,83,255,27,24,20,227,5,5,5,23,14,13,11,198,219,177,112,255,232, +-191,127,255,230,191,123,255,25,22,16,249,0,8,11,10,8,153,200,120,41, +-255,214,127,43,255,213,126,42,255,93,66,32,255,11,11,10,255,34,31,23, +-255,206,152,81,255,226,179,111,255,231,189,128,255,232,192,135,255,232,201,141, +-255,25,22,18,255,0,8,11,10,10,170,215,171,102,255,228,174,105,255,222, +-158,75,255,27,24,16,255,0,12,15,15,12,170,219,177,112,255,232,193,137, +-255,232,201,141,255,25,22,18,255,0,8,11,10,10,170,215,172,104,255,228, +-182,109,255,221,155,70,255,177,114,46,255,55,42,24,255,35,28,18,255,41, +-31,18,255,35,28,17,255,27,22,14,255,17,16,12,187,9,9,8,79,0, +-12,10,9,7,170,191,106,30,255,211,115,30,255,210,115,31,255,33,25,14, +-255,0,12,21,20,16,170,221,180,116,255,232,193,137,255,232,201,141,255,25, +-22,18,255,0,8,11,11,10,170,212,160,85,255,224,156,83,255,218,141,59, +-255,175,115,44,255,55,42,24,255,31,25,16,255,38,30,19,255,127,82,30, +-255,204,116,31,255,195,112,30,255,82,55,25,255,11,10,8,150,0,12,9, +-9,8,28,15,14,12,142,28,25,19,221,46,40,29,255,71,60,38,255,66, +-57,39,255,70,61,41,255,193,159,106,255,227,184,108,255,221,153,72,255,155, +-98,36,255,13,12,10,170,0,24,17,15,12,170,219,180,112,255,232,197,137, +-255,232,201,141,255,40,35,25,255,0,24,14,13,11,170,198,117,37,255,213, +-124,38,255,210,121,35,255,23,19,12,255,0,12,11,10,8,170,193,111,30, +-255,211,115,30,255,208,114,31,255,23,19,12,207,0,8,14,13,11,85,181, +-132,68,255,228,185,117,255,231,193,128,255,54,46,31,255,5,5,4,8,0, +-8,21,20,16,178,215,160,88,255,223,147,72,255,206,135,51,255,23,20,14, +-170,0,8,12,11,9,102,192,111,31,255,210,108,33,255,208,114,31,255,22, +-18,11,255,0,4,10,10,9,113,79,61,38,255,17,16,12,198,0,4,16, +-15,13,170,219,179,116,255,231,187,124,255,224,169,91,255,33,28,20,255,0, +-20,9,8,8,85,39,33,24,255,217,166,92,255,219,140,56,255,210,121,35, +-255,66,44,21,255,7,7,6,133,0,32,6,6,5,74,19,18,12,255,183, +-102,30,255,207,105,30,255,210,111,31,255,73,51,24,255,8,8,7,116,0, +-24,6,6,6,28,15,13,12,227,144,112,61,255,221,180,116,255,224,178,113, +-255,152,116,65,255,18,17,13,221,8,8,7,28,0,24,12,10,9,170,193, +-111,30,255,210,107,31,255,210,115,31,255,22,19,11,255,0,28,16,15,13, +-227,164,122,63,255,225,185,114,255,192,153,97,255,21,19,16,232,7,7,6, +-28,0,24,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31,255,23, +-19,12,255,0,148,6,6,5,51,11,9,6,85,12,10,7,102,10,8,5, +-156,10,8,5,127,8,7,5,184,27,22,12,255,198,105,29,255,211,122,36, +-255,220,136,61,255,25,22,16,255,0,8,10,10,9,170,218,181,123,255,234, +-202,147,255,232,197,141,255,30,27,21,255,0,12,9,8,6,170,191,106,30, +-255,211,115,30,255,210,111,31,255,39,27,14,170,0,8,12,11,11,170,218, +-180,119,255,234,196,143,255,232,201,141,255,29,26,20,255,0,12,7,7,6, +-28,27,22,14,156,25,22,14,255,32,25,15,210,22,18,11,28,0,8,10, +-9,7,150,195,112,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0, +-12,9,9,8,170,191,106,30,255,211,111,30,255,208,114,31,255,25,20,12, +-204,0,8,12,11,11,170,218,180,119,255,234,202,147,255,232,201,141,255,142, +-111,63,255,14,12,9,227,10,9,7,127,8,7,5,181,35,25,14,255,199, +-112,28,255,209,118,30,255,209,117,28,255,30,22,13,255,0,16,9,8,6, +-167,191,106,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0,16,21, +-19,16,170,220,178,113,255,232,197,137,255,232,201,141,255,26,23,19,255,0, +-12,11,11,10,170,218,181,123,255,234,201,143,255,231,197,132,255,24,22,17, +-255,0,8,11,10,10,170,218,181,123,255,234,201,143,255,231,197,132,255,30, +-26,21,255,0,12,9,8,6,167,191,106,30,255,211,115,30,255,210,111,31, +-255,39,27,14,170,0,8,13,12,8,85,190,105,29,255,213,119,36,255,214, +-132,45,255,32,26,17,255,0,24,17,16,14,170,221,186,124,255,234,202,147, +-255,232,199,135,255,25,22,18,252,0,8,11,10,8,127,192,111,31,255,210, +-107,31,255,208,114,31,255,161,94,28,255,65,43,20,255,145,85,26,255,207, +-117,30,255,122,75,29,255,15,14,10,170,5,5,4,8,0,16,11,10,8, +-170,196,115,35,255,223,146,70,255,228,183,111,255,25,22,16,252,0,8,14, +-12,9,85,190,105,29,255,215,125,38,255,218,141,59,255,30,24,17,195,0, +-4,10,10,7,170,193,111,30,255,20,17,11,252,0,4,11,10,8,85,188, +-103,27,255,211,115,30,255,209,106,30,255,39,27,14,170,0,8,13,12,8, +-85,190,105,29,255,211,115,30,255,210,115,31,255,19,15,10,255,0,12,9, +-8,6,167,192,111,31,255,218,137,51,255,227,175,100,255,27,24,18,255,0, +-8,11,10,8,147,196,106,33,255,210,108,33,255,210,115,31,255,30,23,13, +-255,4,4,3,14,0,8,15,14,12,195,211,149,76,255,229,184,114,255,232, +-199,135,255,28,25,19,255,0,8,11,10,8,167,203,129,50,255,215,127,42, +-255,210,121,35,255,20,17,11,232,0,12,9,8,6,139,190,105,29,255,211, +-111,30,255,209,114,30,255,30,22,13,198,0,8,13,12,10,170,217,173,104, +-255,232,193,137,255,232,194,139,255,25,22,18,255,0,12,9,8,8,156,192, +-111,31,255,210,108,33,255,210,115,31,255,32,24,13,173,0,8,13,12,8, +-88,190,105,29,255,211,115,30,255,208,114,31,255,19,15,10,255,0,12,7, +-7,6,28,27,22,14,198,45,36,21,255,52,43,29,244,14,13,11,85,0, +-8,13,13,12,88,177,143,90,255,230,194,131,255,226,172,95,255,137,91,36, +-255,10,9,7,227,8,8,5,161,10,9,7,167,10,9,7,136,13,10,6, +-85,7,6,6,74,0,24,9,8,6,167,191,106,30,255,211,115,30,255,210, +-115,31,255,19,15,10,252,0,16,12,11,9,170,208,141,61,255,230,187,119, +-255,232,201,141,255,40,34,25,255,0,12,14,12,9,170,196,109,31,255,210, +-107,31,255,210,115,31,255,36,25,13,170,0,8,10,9,7,85,155,91,28, +-255,208,114,31,255,209,106,30,255,30,22,13,255,0,12,22,21,17,176,222, +-186,123,255,234,199,143,255,226,195,135,255,35,29,22,178,0,8,12,11,9, +-105,190,105,29,255,211,115,30,255,208,114,31,255,23,19,12,210,0,8,15, +-12,8,59,7,6,4,3,0,4,9,9,8,159,204,134,59,255,230,182,119, +-255,232,198,139,255,39,33,24,255,0,16,10,10,9,34,15,14,10,198,52, +-40,21,255,165,96,28,255,198,113,29,255,185,102,28,255,80,53,25,255,19, +-17,12,227,10,9,7,76,0,16,11,10,8,170,195,112,30,255,211,115,30, +-255,210,115,31,255,20,16,11,255,0,12,10,9,7,170,192,111,31,255,215, +-125,38,255,224,159,83,255,41,33,24,255,0,24,7,7,6,108,24,20,13, +-255,146,88,31,255,195,127,38,255,113,77,34,255,15,14,12,210,7,7,6, +-28,0,16,12,12,11,28,37,30,18,227,168,99,31,255,206,114,33,255,51, +-34,18,255,6,5,5,71,0,20,17,16,14,170,221,186,124,255,234,202,147, +-255,232,201,141,255,40,35,25,255,0,24,17,15,10,227,198,105,29,255,194, +-109,33,255,62,44,23,255,16,14,11,85,0,100,19,17,12,142,214,171,97, +-255,228,183,113,255,227,186,108,255,50,40,25,227,0,64,12,11,9,198,214, +-158,85,255,229,183,110,255,228,181,107,255,21,19,14,249,2,2,1,20,8, +-8,7,181,210,156,79,255,226,169,95,255,224,155,81,255,33,26,18,255,4, +-4,4,28,0,40,3,3,2,28,11,10,8,255,209,138,62,255,223,154,72, +-255,221,164,82,255,27,23,16,249,0,16,7,7,6,79,46,38,25,255,197, +-151,84,255,222,161,89,255,209,128,42,255,141,91,32,255,15,13,10,218,5, +-5,5,11,0,28,15,13,10,139,191,131,60,255,220,168,93,255,168,123,69, +-255,14,13,11,227,5,5,5,85,9,9,8,170,105,78,40,255,162,116,61, +-255,88,66,37,255,23,21,16,255,11,11,10,255,78,58,35,255,208,150,75, +-255,61,46,28,181,0,36,15,13,10,170,216,170,97,255,230,187,119,255,228, +-178,113,255,34,28,19,255,0,24,15,13,10,170,215,167,92,255,229,179,114, +-255,228,181,107,255,32,27,19,255,0,16,6,6,6,25,5,5,4,198,52, +-42,27,255,220,169,97,255,189,142,76,255,35,31,22,255,134,96,51,255,225, +-176,106,255,140,106,53,255,6,6,5,255,6,6,6,51,0,28,5,5,5, +-28,15,13,10,227,208,136,59,255,218,138,53,255,213,122,42,255,43,31,18, +-255,5,5,4,85,0,136,9,8,8,57,57,47,30,255,212,163,93,255,224, +-157,85,255,124,90,45,255,10,10,9,147,0,20,15,13,10,170,216,170,97, +-255,228,181,107,255,224,165,81,255,194,136,61,255,58,46,29,255,12,12,11, +-85,0,4,10,9,7,156,174,91,23,255,202,103,23,255,202,102,21,255,20, +-16,9,255,0,24,15,13,10,170,213,155,80,255,227,175,100,255,227,171,98, +-255,35,29,20,255,0,32,7,7,6,85,49,33,18,255,183,108,34,255,209, +-128,42,255,209,137,60,255,186,134,67,255,95,74,39,255,22,20,15,229,8, +-8,7,105,0,44,5,4,4,28,17,15,12,227,216,167,89,255,228,181,107, +-255,223,176,102,255,34,28,19,184,0,8,12,11,9,108,180,106,33,255,214, +-125,39,255,217,141,52,255,42,33,21,255,4,4,4,85,0,8,11,10,8, +-198,211,149,76,255,224,160,77,255,220,144,63,255,34,27,17,255,0,40,12, +-10,7,170,189,99,26,255,206,102,25,255,203,100,24,255,30,21,11,176,0, +-8,12,10,7,85,167,87,22,255,202,103,23,255,202,102,21,255,27,20,10, +-255,4,4,3,68,0,4,4,4,4,28,12,10,7,215,176,91,23,255,203, +-104,24,255,202,105,27,255,28,21,13,249,0,24,9,8,8,57,57,47,30, +-255,213,167,94,255,228,184,115,255,126,92,47,255,9,9,8,147,0,20,13, +-12,10,167,199,131,58,255,220,148,63,255,219,147,62,255,49,38,24,255,6, +-6,6,85,0,4,5,5,5,28,15,14,12,227,217,169,94,255,228,183,111, +-255,225,174,102,255,31,25,18,241,0,36,5,5,5,28,15,13,10,227,204, +-127,45,255,219,133,56,255,221,150,66,255,35,28,18,255,0,68,10,9,9, +-85,45,34,21,255,201,110,30,255,192,100,25,255,57,35,16,255,12,10,7, +-85,0,24,13,11,6,79,126,68,21,255,191,100,26,255,198,117,37,255,208, +-139,65,255,213,155,80,255,214,161,85,255,215,167,92,255,216,167,89,255,215, +-160,88,255,49,38,24,170,0,24,7,7,6,76,45,36,24,249,207,164,90, +-255,228,183,111,255,143,111,56,255,13,12,10,170,0,28,13,12,8,142,182, +-99,25,255,203,108,24,255,202,102,21,255,112,65,23,255,15,13,8,227,6, +-6,5,45,0,16,10,8,7,170,171,89,22,255,202,95,23,255,202,103,23, +-255,103,64,26,255,20,18,13,255,79,61,36,255,222,173,97,255,227,179,104, +-255,224,172,97,255,226,171,99,255,224,176,93,255,36,29,19,207,0,8,12, +-10,7,113,176,91,23,255,202,95,23,255,202,102,21,255,27,20,10,255,4, +-4,3,74,0,4,4,4,4,28,11,9,6,215,187,101,24,255,216,134,45, +-255,226,172,95,255,23,21,16,241,0,8,10,10,9,161,212,160,85,255,226, +-172,95,255,222,158,75,255,51,39,24,255,6,6,6,85,0,4,4,4,3, +-28,11,10,6,215,176,91,23,255,202,102,21,255,191,102,22,255,22,17,9, +-170,0,8,12,10,7,85,167,87,22,255,204,105,25,255,217,133,50,255,35, +-28,18,255,0,40,15,13,10,170,199,116,34,255,212,114,35,255,218,139,55, +-255,33,27,18,255,0,12,15,13,10,170,213,160,84,255,227,175,100,255,224, +-165,81,255,25,21,14,235,0,8,13,11,8,108,184,96,25,255,203,96,24, +-255,202,95,23,255,27,20,10,255,4,4,3,71,0,28,10,9,7,170,187, +-101,24,255,216,134,45,255,224,167,85,255,54,42,27,255,6,6,6,85,0, +-28,10,9,7,170,171,89,22,255,202,103,23,255,202,102,21,255,29,21,10, +-170,0,4,11,9,6,42,137,77,24,255,211,136,56,255,215,167,92,255,216, +-166,95,255,213,163,84,255,33,28,18,161,0,8,11,10,8,130,184,100,25, +-255,203,100,24,255,202,102,21,255,27,20,10,255,4,4,3,74,0,4,4, +-4,4,28,11,9,6,215,176,91,23,255,202,103,23,255,202,95,23,255,28, +-21,11,190,0,8,10,10,9,161,212,161,89,255,228,174,105,255,223,161,80, +-255,33,28,18,255,0,40,10,9,7,167,171,89,22,255,202,103,23,255,202, +-102,21,255,29,21,10,170,0,8,12,10,7,85,167,87,22,255,202,103,23, +-255,203,108,24,255,68,47,25,255,6,6,5,255,31,26,20,255,220,168,93, +-255,220,177,101,255,110,80,41,255,12,11,9,150,0,16,10,9,7,170,171, +-89,22,255,202,103,23,255,202,102,21,255,20,16,9,255,0,32,10,9,7, +-170,193,111,30,255,219,136,54,255,224,165,81,255,27,24,16,255,0,4,7, +-7,7,28,21,20,16,181,10,10,9,85,0,4,12,11,9,170,204,130,51, +-255,218,141,51,255,211,122,36,255,32,23,13,187,0,8,13,11,8,85,167, +-87,22,255,203,100,24,255,208,105,29,255,23,19,12,255,4,4,3,28,11, +-10,8,181,211,158,82,255,229,183,110,255,228,183,111,255,228,183,113,255,228, +-181,107,255,27,23,16,229,0,8,10,10,9,150,192,111,31,255,208,112,27, +-255,203,108,24,255,21,17,10,255,0,12,15,13,10,170,216,170,97,255,229, +-183,110,255,228,181,107,255,25,21,16,235,0,8,11,10,8,142,194,116,33, +-255,209,106,30,255,203,108,24,255,27,20,10,255,4,4,3,74,0,36,10, +-8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,42,28,13,255,6, +-5,5,48,0,4,6,6,6,28,21,19,14,255,221,175,102,255,229,179,114, +-255,228,181,107,255,24,20,15,246,0,8,12,11,9,127,190,104,27,255,206, +-106,25,255,202,103,23,255,27,20,10,255,4,4,3,74,0,4,4,4,4, +-28,11,10,6,215,176,91,23,255,204,105,25,255,207,122,38,255,28,22,15, +-238,0,36,5,5,5,28,15,13,10,227,195,111,28,255,204,105,25,255,197, +-100,22,255,22,17,9,224,0,24,15,13,10,170,216,170,97,255,229,184,114, +-255,228,181,107,255,34,28,19,255,0,24,10,9,7,170,174,91,23,255,202, +-103,23,255,202,102,21,255,20,16,9,252,0,12,10,9,7,170,171,89,22, +-255,202,107,23,255,206,111,27,255,22,17,11,252,0,8,8,7,7,45,73, +-59,36,255,218,174,105,255,228,178,107,255,89,67,36,255,7,7,6,113,0, +-4,5,5,4,28,20,18,13,255,199,110,30,255,202,105,27,255,88,54,23, +-255,10,9,7,113,0,8,13,11,6,85,167,87,22,255,202,95,23,255,202, +-90,23,255,32,24,13,255,4,4,3,178,19,16,12,238,212,163,93,255,66, +-52,31,255,5,5,5,184,14,13,11,255,205,133,48,255,212,114,35,255,208, +-117,29,255,29,22,14,255,0,16,12,11,9,85,101,74,38,255,189,121,49, +-255,185,104,32,255,180,98,25,255,180,93,23,255,154,82,23,255,75,44,18, +-255,11,9,6,144,0,32,10,9,7,170,157,79,22,255,202,102,21,255,202, +-102,21,255,22,17,9,255,0,28,14,13,11,224,136,98,53,255,217,165,82, +-255,213,145,56,255,150,92,35,255,19,16,12,173,5,5,5,8,0,28,10, +-8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,20,16,9,252,0, +-28,7,7,6,59,43,35,24,255,221,175,102,255,223,178,106,255,134,98,51, +-255,14,13,11,142,0,24,10,9,7,167,171,89,22,255,202,103,23,255,202, +-102,21,255,20,16,9,255,0,144,12,10,7,170,46,29,13,255,140,74,21, +-255,165,86,22,255,167,87,22,255,165,86,22,255,167,87,22,255,185,95,22, +-255,198,97,23,255,206,111,27,255,221,146,66,255,23,19,14,249,0,8,10, +-10,9,153,212,161,89,255,229,183,110,255,224,165,81,255,28,23,15,255,0, +-12,10,8,7,156,171,89,22,255,202,103,23,255,202,102,21,255,31,21,10, +-170,0,8,10,10,9,167,212,160,85,255,228,177,105,255,222,158,75,255,27, +-23,16,255,0,40,10,8,7,170,167,87,22,255,202,103,23,255,202,102,21, +-255,20,16,9,238,0,12,10,8,7,164,171,89,22,255,202,103,23,255,203, +-100,24,255,22,18,11,235,0,8,10,10,9,167,214,164,93,255,228,182,109, +-255,223,154,80,255,207,120,36,255,189,94,24,255,167,87,22,255,167,87,22, +-255,187,96,22,255,198,93,23,255,202,93,21,255,198,96,21,255,26,19,9, +-227,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20, +-15,9,252,0,16,17,15,12,170,216,170,97,255,229,183,110,255,224,164,85, +-255,29,24,16,255,3,3,2,28,0,8,12,11,9,198,211,149,76,255,221, +-151,68,255,219,146,60,255,22,19,13,246,0,8,10,10,9,161,210,155,77, +-255,223,147,72,255,213,122,42,255,23,18,12,255,0,12,10,8,7,167,171, +-89,22,255,202,103,23,255,202,102,21,255,29,21,10,170,0,8,12,10,7, +-85,166,87,23,255,209,118,30,255,218,139,55,255,33,27,18,255,0,24,15, +-13,10,170,215,159,92,255,226,169,95,255,218,141,59,255,34,26,15,190,0, +-8,13,10,6,85,167,87,22,255,202,103,23,255,198,96,21,255,197,96,22, +-255,189,97,22,255,198,96,21,255,198,96,21,255,25,19,10,255,4,4,3, +-28,0,20,10,9,7,170,178,92,23,255,210,107,31,255,215,128,44,255,33, +-24,14,193,0,8,12,10,7,85,167,87,22,255,202,95,23,255,202,103,23, +-255,32,22,11,170,0,4,10,8,7,170,171,89,22,255,24,17,9,249,0, +-4,12,10,7,85,163,82,22,255,202,103,23,255,202,102,21,255,29,21,10, +-170,0,8,12,10,7,85,166,87,23,255,202,103,23,255,202,102,21,255,20, +-15,9,255,0,12,10,8,7,167,170,89,23,255,206,106,25,255,208,115,33, +-255,28,21,13,207,0,8,13,10,6,85,167,87,22,255,202,95,23,255,202, +-102,21,255,20,16,9,255,0,12,15,13,10,170,214,158,85,255,229,183,110, +-255,228,185,111,255,24,20,15,249,0,8,12,11,9,108,176,91,23,255,202, +-95,23,255,202,102,21,255,18,15,9,255,2,2,1,8,0,8,8,7,5, +-184,171,89,22,255,202,95,23,255,202,102,21,255,34,23,11,173,0,8,12, +-11,9,136,212,160,85,255,228,180,105,255,225,165,88,255,31,25,18,255,3, +-3,2,28,0,8,8,7,5,178,171,89,22,255,202,103,23,255,202,102,21, +-255,30,21,11,170,0,8,12,10,7,85,167,87,22,255,202,103,23,255,202, +-102,21,255,20,15,9,255,0,40,7,7,6,28,30,27,21,238,167,111,50, +-255,206,110,33,255,199,102,24,255,175,90,22,255,165,86,22,255,167,87,22, +-255,167,87,22,255,161,87,22,255,84,48,19,255,18,15,9,227,8,7,5, +-28,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20, +-15,9,252,0,16,15,13,10,170,211,159,76,255,229,180,110,255,228,182,109, +-255,34,28,19,255,0,12,10,9,7,170,171,89,22,255,202,103,23,255,202, +-102,21,255,31,22,10,170,0,8,7,6,6,28,48,31,15,255,189,93,22, +-255,202,102,21,255,45,29,14,255,5,5,4,113,0,4,5,5,4,28,22, +-20,15,255,220,169,97,255,226,178,103,255,167,118,54,255,15,13,10,133,0, +-8,13,11,6,85,167,87,22,255,202,103,23,255,202,102,21,255,19,15,8, +-215,0,4,11,9,6,105,121,65,20,255,26,18,9,190,0,4,9,9,8, +-167,208,150,75,255,229,183,110,255,228,181,113,255,37,29,20,255,0,24,8, +-8,5,218,167,87,22,255,202,93,21,255,198,104,21,255,23,18,10,255,3, +-3,2,51,0,20,10,9,7,153,171,89,22,255,202,95,23,255,202,102,21, +-255,20,15,9,255,2,2,1,17,0,8,8,7,5,181,184,100,25,255,215, +-119,42,255,224,160,85,255,34,28,19,255,0,20,9,8,6,85,31,22,12, +-255,166,87,23,255,189,97,22,255,99,60,22,255,15,13,8,170,0,28,4, +-3,3,23,13,11,8,227,182,94,23,255,149,87,26,255,19,17,12,227,7, +-7,7,23,0,16,15,13,10,170,216,170,97,255,229,179,114,255,228,182,109, +-255,34,28,19,255,0,20,9,8,6,130,69,42,18,255,195,95,22,255,35, +-24,12,255,5,5,4,76,0,104,10,9,7,28,27,24,16,184,32,27,19, +-255,39,29,20,212,13,12,10,85,0,60,13,11,8,170,81,54,28,255,216, +-148,67,255,223,161,72,255,220,147,61,255,117,76,32,255,13,11,8,255,44, +-33,19,255,207,123,40,255,217,136,50,255,218,142,53,255,156,100,39,255,18, +-15,11,227,10,8,7,28,0,12,15,13,8,125,19,14,10,170,14,11,7, +-170,10,8,7,170,11,9,6,122,13,10,8,85,8,7,5,153,46,33,21, +-255,212,138,51,255,221,151,68,255,191,132,62,255,19,17,12,176,0,12,7, +-7,6,76,26,22,15,241,189,129,58,255,219,152,72,255,217,154,72,255,133, +-87,38,255,15,13,10,221,6,6,5,28,0,8,15,12,8,113,20,16,11, +-170,17,14,10,142,7,6,6,28,0,8,19,16,12,170,200,117,35,255,212, +-123,37,255,115,74,30,255,9,8,6,113,0,8,12,11,9,178,104,73,37, +-255,206,147,63,255,178,121,53,255,58,46,29,255,46,36,25,255,40,32,21, +-252,19,17,12,85,0,36,12,10,9,164,191,131,60,255,223,161,80,255,221, +-151,68,255,46,34,21,255,4,4,3,3,0,20,19,16,12,173,208,134,55, +-255,223,156,70,255,216,160,81,255,21,19,14,255,0,16,6,5,5,25,17, +-14,10,227,67,48,28,255,94,67,35,255,20,17,13,227,6,6,5,113,12, +-11,9,198,67,51,30,255,85,62,32,255,25,20,14,255,9,8,6,82,0, +-32,10,8,5,170,161,87,22,255,195,90,20,255,187,91,20,255,19,14,8, +-255,0,28,15,12,8,119,20,16,11,170,17,14,10,156,10,8,7,28,0, +-64,15,12,8,122,18,15,11,170,17,14,10,144,10,8,7,28,0,16,13, +-12,10,170,157,96,36,255,211,123,38,255,199,116,34,255,31,24,16,255,6, +-6,6,28,0,20,16,13,11,170,197,110,32,255,209,110,30,255,202,103,23, +-255,58,36,15,255,8,7,5,113,0,8,10,8,5,85,137,68,18,255,185, +-86,20,255,174,88,19,255,18,13,7,255,0,24,12,10,9,170,204,129,49, +-255,220,144,63,255,217,133,50,255,26,20,13,255,0,28,7,6,6,76,23, +-19,12,244,185,113,36,255,207,129,52,255,173,117,50,255,59,46,28,255,18, +-15,13,198,9,9,8,113,6,6,6,11,0,24,15,12,8,133,22,17,11, +-170,17,14,10,142,8,7,5,28,0,12,9,8,6,170,202,128,49,255,220, +-148,63,255,219,140,56,255,22,19,13,255,0,8,12,10,9,170,200,125,37, +-255,218,141,51,255,220,147,61,255,138,86,35,255,13,10,8,227,11,9,6, +-170,13,11,8,198,61,41,22,255,202,111,31,255,204,105,25,255,200,105,21, +-255,22,17,9,221,0,12,11,9,6,108,14,11,7,170,11,9,6,139,6, +-5,3,17,0,12,9,7,6,133,144,75,19,255,185,86,20,255,178,86,19, +-255,27,18,8,170,0,8,11,9,6,85,134,70,19,255,181,88,20,255,180, +-87,19,255,24,15,7,178,0,12,10,8,5,99,165,86,22,255,206,111,27, +-255,213,124,38,255,36,27,17,255,0,24,10,10,9,133,167,112,48,255,222, +-166,77,255,223,157,72,255,54,39,23,255,5,5,4,37,0,20,13,11,8, +-170,181,93,22,255,206,111,27,255,214,127,43,255,20,16,11,255,0,12,9, +-8,8,170,203,129,50,255,222,145,63,255,220,147,61,255,33,26,16,255,0, +-12,12,10,7,113,15,12,8,170,13,10,8,122,0,16,10,8,7,170,200, +-120,41,255,220,142,59,255,219,146,60,255,27,21,14,255,0,12,13,11,8, +-113,18,15,11,170,17,14,10,142,8,7,5,28,0,12,14,12,9,113,20, +-15,11,170,17,14,10,153,10,8,7,28,0,16,9,8,6,85,29,21,10, +-255,119,62,20,255,153,79,20,255,40,25,11,255,9,8,6,85,0,20,10, +-8,7,28,32,24,13,218,68,47,25,255,61,43,24,255,61,46,28,255,61, +-47,28,255,61,47,28,255,66,50,29,255,73,55,32,255,66,48,29,255,24, +-20,15,85,0,20,7,6,6,79,32,26,17,244,199,132,54,255,208,150,75, +-255,122,87,41,255,17,15,10,170,0,32,10,9,7,28,32,23,11,227,53, +-33,14,255,34,23,11,255,12,10,7,190,6,5,5,28,0,20,9,7,4, +-170,146,76,19,255,197,99,20,255,204,110,27,255,59,41,22,255,6,6,6, +-170,10,9,9,113,31,26,18,184,30,25,17,255,29,25,18,255,34,27,19, +-255,37,28,18,221,13,11,8,57,0,8,13,10,6,88,144,75,19,255,185, +-86,20,255,178,90,19,255,20,14,7,212,0,12,9,7,4,125,157,81,20, +-255,212,117,33,255,220,148,63,255,27,21,14,218,0,8,12,10,9,127,192, +-111,31,255,208,112,27,255,202,103,23,255,22,16,9,204,0,12,10,8,5, +-93,137,68,18,255,185,94,20,255,180,91,19,255,30,20,9,170,0,8,11, +-9,6,85,140,67,19,255,202,106,21,255,214,125,39,255,25,20,14,255,0, +-12,6,6,5,28,13,11,8,139,20,16,11,170,19,15,10,142,8,7,5, +-28,0,8,10,9,5,142,153,79,20,255,195,90,20,255,206,111,27,255,24, +-20,13,255,0,12,12,10,9,170,195,113,32,255,211,115,30,255,203,108,24, +-255,31,21,10,173,0,8,11,9,6,85,140,70,19,255,185,86,20,255,180, +-87,19,255,24,15,7,181,0,32,9,8,6,170,174,91,23,255,215,123,42, +-255,221,150,66,255,25,20,14,255,0,32,9,7,4,170,148,77,19,255,181, +-92,20,255,180,87,19,255,25,17,8,170,0,8,34,24,13,170,161,102,38, +-255,219,154,70,255,220,142,59,255,213,124,38,255,32,24,13,198,0,8,11, +-9,6,85,140,70,19,255,185,86,20,255,178,90,19,255,20,14,7,212,0, +-12,8,7,5,127,144,78,19,255,185,86,20,255,180,87,19,255,29,19,10, +-170,0,8,13,11,8,116,194,116,33,255,209,110,30,255,202,95,23,255,22, +-17,9,221,0,12,10,8,5,85,12,9,5,170,10,8,5,130,6,5,3, +-8,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,27, +-18,8,170,0,8,11,8,6,85,137,68,18,255,185,86,20,255,200,105,21, +-255,29,21,12,255,4,4,4,25,10,9,7,139,154,100,47,255,215,148,70, +-255,198,131,45,255,46,34,19,255,11,9,6,88,0,12,10,8,5,119,144, +-78,19,255,185,86,20,255,180,87,19,255,21,15,8,210,0,32,13,11,8, +-170,199,119,39,255,220,144,63,255,221,155,70,255,27,21,14,255,0,20,10, +-9,7,170,171,89,22,255,195,98,20,255,183,89,19,255,29,20,8,170,0, +-8,11,9,6,85,139,70,20,255,202,103,23,255,211,118,36,255,28,21,13, +-201,0,4,8,8,7,57,118,84,39,255,215,159,86,255,219,149,66,255,216, +-129,45,255,211,121,34,255,34,25,13,178,0,8,11,10,6,88,146,76,19, +-255,185,94,20,255,178,90,19,255,24,18,9,255,0,12,18,15,11,170,203, +-122,42,255,215,126,40,255,209,106,30,255,32,22,13,184,0,8,12,10,7, +-85,143,72,20,255,185,94,20,255,178,90,19,255,20,14,7,210,0,40,9, +-7,4,170,148,77,19,255,180,87,19,255,178,86,19,255,30,21,9,255,5, +-5,4,37,8,7,5,28,20,17,13,227,133,89,38,255,215,142,56,255,216, +-129,45,255,209,115,32,255,26,19,11,210,0,8,11,9,6,85,142,74,19, +-255,185,86,20,255,178,90,19,255,20,14,7,210,0,12,9,7,4,122,143, +-75,20,255,203,108,24,255,216,129,45,255,30,23,15,255,0,12,12,10,7, +-110,16,13,9,170,13,10,8,122,0,16,9,8,6,105,142,74,19,255,185, +-86,20,255,180,87,19,255,23,16,8,255,0,24,15,13,10,170,203,122,42, +-255,215,126,40,255,209,118,30,255,24,17,11,255,0,24,9,8,4,170,148, +-77,19,255,181,92,20,255,180,87,19,255,23,16,8,198,0,12,9,7,6, +-139,159,82,20,255,203,100,24,255,212,121,33,255,28,21,13,255,0,12,12, +-11,9,119,81,59,34,255,216,153,71,255,173,117,50,255,21,18,14,255,10, +-10,9,244,11,10,8,255,60,35,15,255,173,85,20,255,84,49,17,255,13, +-10,6,170,0,12,10,8,5,130,146,79,19,255,193,89,20,255,203,104,24, +-255,120,77,31,255,19,17,12,255,117,80,36,255,219,154,70,255,178,121,53, +-255,20,17,13,255,45,33,18,255,184,94,21,255,195,90,20,255,205,106,26, +-255,30,22,13,255,0,12,7,7,6,82,35,28,18,255,196,114,33,255,148, +-80,25,255,32,22,11,255,20,15,9,255,26,18,9,255,88,49,17,255,149, +-78,20,255,40,26,11,255,9,7,4,85,0,28,9,7,4,127,140,70,19, +-255,181,88,20,255,180,87,19,255,18,13,7,235,0,24,10,9,7,93,104, +-69,35,255,201,131,48,255,194,109,33,255,65,42,20,255,12,10,7,170,0, +-36,9,7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,23,16,8, +-198,0,32,15,14,10,198,188,133,61,255,219,149,66,255,194,115,37,255,17, +-15,10,244,0,24,10,8,5,113,144,78,19,255,185,86,20,255,180,87,19, +-255,18,13,7,255,0,140,7,6,4,65,53,31,12,255,162,83,19,255,185, +-94,20,255,130,70,21,255,31,22,10,255,25,19,10,198,22,17,9,246,70, +-40,15,255,169,87,20,255,200,105,21,255,212,123,37,255,28,21,13,221,0, +-8,12,10,9,133,200,127,41,255,210,120,33,255,202,95,23,255,19,14,8, +-238,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,28, +-19,9,170,0,8,12,10,9,133,194,112,31,255,209,110,30,255,202,102,21, +-255,21,15,8,235,0,16,9,7,4,57,12,10,5,88,10,8,5,85,0, +-12,10,8,5,125,146,79,19,255,181,88,20,255,180,87,19,255,25,17,8, +-195,0,12,10,8,5,119,144,78,19,255,185,94,20,255,200,105,21,255,23, +-18,10,221,0,8,11,9,8,153,200,123,41,255,212,117,33,255,202,103,23, +-255,111,63,20,255,27,20,10,255,20,16,9,246,22,17,9,249,28,20,9, +-198,30,21,9,170,24,17,9,215,28,20,9,201,10,8,5,85,0,16,9, +-7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,18,13,7,255,0, +-16,11,10,8,113,152,104,47,255,214,134,49,255,204,105,25,255,98,54,19, +-255,18,13,9,227,13,10,8,170,14,12,9,198,60,41,21,255,199,112,28, +-255,202,102,21,255,202,103,23,255,26,19,11,204,0,8,12,11,9,116,187, +-101,24,255,202,93,21,255,187,91,20,255,18,13,7,255,0,12,9,7,4, +-170,146,79,19,255,181,88,20,255,178,90,19,255,27,17,8,170,0,8,11, +-9,6,85,139,70,20,255,202,103,23,255,212,123,37,255,32,24,15,255,0, +-24,13,12,10,170,196,114,33,255,206,106,25,255,196,99,21,255,28,19,9, +-170,0,8,11,8,6,85,137,68,18,255,181,88,20,255,178,86,19,255,164, +-85,21,255,138,73,21,255,175,93,20,255,178,86,19,255,46,28,11,255,6, +-5,3,108,0,20,9,7,4,170,146,76,19,255,189,88,20,255,189,88,20, +-255,28,19,9,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,178, +-90,19,255,27,17,8,170,0,4,9,7,4,167,146,79,19,255,20,14,7, +-252,0,4,11,9,6,85,137,68,18,255,185,94,20,255,178,90,19,255,27, +-17,8,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,180,87,19, +-255,18,13,7,255,0,12,9,7,4,170,146,79,19,255,185,94,20,255,183, +-85,19,255,27,19,8,170,0,8,11,9,6,85,140,73,19,255,181,88,20, +-255,178,90,19,255,20,15,7,255,0,12,16,14,11,170,208,143,59,255,223, +-156,70,255,216,135,49,255,28,22,13,210,0,8,11,9,6,85,140,70,19, +-255,185,94,20,255,178,90,19,255,72,39,13,255,10,8,5,218,8,6,3, +-170,9,7,4,193,39,24,10,255,160,82,19,255,185,94,20,255,144,74,23, +-255,16,13,9,170,0,8,10,9,7,85,145,101,48,255,218,149,67,255,210, +-115,31,255,99,57,19,255,10,8,5,227,8,6,3,170,9,7,4,190,30, +-20,9,255,158,81,19,255,185,94,20,255,178,90,19,255,27,17,8,170,0, +-8,11,8,6,85,137,68,18,255,185,86,20,255,180,87,19,255,18,13,7, +-255,0,44,9,9,8,28,13,12,8,142,27,20,10,170,29,21,10,193,24, +-17,9,252,22,17,9,232,22,17,9,255,87,49,18,255,181,88,20,255,178, +-90,19,255,100,54,17,255,11,10,6,150,0,16,9,7,4,170,146,79,19, +-255,181,88,20,255,180,87,19,255,18,13,7,255,0,16,15,13,10,170,208, +-141,55,255,223,156,70,255,217,133,50,255,23,19,12,255,0,12,10,8,5, +-122,144,78,19,255,185,86,20,255,180,87,19,255,30,20,9,176,0,12,12, +-10,7,85,39,26,12,255,155,80,20,255,99,55,19,255,19,16,12,255,12, +-11,9,255,18,15,11,255,119,84,38,255,209,137,60,255,138,86,35,255,18, +-15,11,178,0,12,10,8,5,130,144,78,19,255,181,92,20,255,178,90,19, +-255,39,24,10,255,6,5,3,210,29,20,8,255,169,87,20,255,97,53,18, +-255,8,7,5,255,26,21,15,255,212,142,59,255,221,151,68,255,218,142,53, +-255,34,25,15,255,0,20,5,5,4,82,16,12,7,255,160,82,19,255,185, +-86,20,255,185,86,20,255,52,29,11,255,7,6,4,170,0,20,8,7,5, +-85,83,46,16,255,181,92,20,255,178,86,19,255,87,47,14,255,10,8,5, +-224,8,6,3,170,9,7,4,190,29,20,8,255,195,104,24,255,217,136,50, +-255,221,155,70,255,30,23,15,255,0,16,8,7,5,85,26,18,9,255,107, +-59,20,255,151,80,22,255,60,34,15,255,11,9,6,170,0,36,8,7,5, +-170,159,82,20,255,202,118,35,255,66,51,29,255,9,9,8,96,0,16,15, +-13,10,170,208,140,59,255,223,156,70,255,215,133,44,255,27,20,12,255,0, +-20,14,12,7,244,131,67,20,255,176,89,19,255,17,12,6,255,0,184,17, +-14,10,85,171,95,28,255,206,123,33,255,208,123,31,255,207,112,28,255,202, +-107,23,255,191,98,22,255,170,91,21,255,195,107,22,255,209,123,30,255,212, +-132,37,255,214,134,39,255,211,133,40,255,202,121,35,255,29,21,12,164,0, +-8,12,10,7,82,168,98,29,255,202,121,35,255,196,120,31,255,194,115,31, +-255,190,115,27,255,185,101,26,255,184,100,25,255,199,107,26,255,208,123,31, +-255,168,105,37,255,25,21,14,227,9,8,8,28,0,8,8,8,7,28,39, +-30,18,249,183,122,42,255,211,133,40,255,210,133,43,255,161,106,41,255,15, +-13,10,221,5,4,4,17,0,8,14,11,7,113,148,83,25,255,193,108,24, +-255,180,93,23,255,27,18,10,153,0,8,12,9,7,122,144,78,19,255,180, +-91,19,255,83,46,16,255,7,6,4,184,0,8,4,4,3,85,28,21,13, +-255,202,121,35,255,209,132,42,255,131,87,36,255,10,9,7,255,5,5,5, +-28,0,40,10,9,7,68,86,62,31,255,206,131,43,255,214,130,39,255,76, +-50,25,255,7,6,6,113,0,16,5,5,4,28,21,17,12,255,202,121,35, +-255,210,135,37,255,157,100,38,255,18,15,11,150,0,16,18,15,9,91,161, +-88,24,255,105,64,28,255,11,10,8,170,0,12,8,7,7,85,40,28,17, +-255,174,91,23,255,42,27,13,173,0,32,10,8,5,116,133,66,16,255,161, +-85,17,255,161,78,17,255,25,16,8,221,0,24,15,12,8,119,170,99,29, +-255,203,126,36,255,199,127,34,255,27,20,12,210,0,60,13,11,8,122,170, +-99,29,255,204,127,37,255,199,119,34,255,27,20,12,198,0,12,4,4,3, +-11,18,13,9,255,154,79,19,255,174,88,19,255,92,51,17,255,12,10,7, +-198,0,24,11,9,6,147,142,74,19,255,171,90,18,255,159,81,18,255,17, +-12,6,255,0,12,8,7,5,142,133,66,16,255,161,85,17,255,161,85,17, +-255,21,14,6,215,0,24,10,9,7,198,190,107,25,255,203,104,24,255,196, +-99,21,255,21,15,8,255,2,2,1,14,0,20,9,8,6,37,35,28,18, +-255,183,112,36,255,212,132,37,255,178,118,41,255,27,23,16,255,5,5,4, +-198,0,32,15,12,8,105,142,79,23,255,189,97,22,255,160,83,21,255,18, +-13,7,218,0,12,10,8,7,198,196,114,33,255,214,129,37,255,212,132,37, +-255,27,21,12,210,0,8,13,11,8,116,192,114,31,255,210,125,33,255,209, +-123,30,255,203,113,26,255,177,91,22,255,159,82,20,255,160,83,21,255,165, +-85,20,255,168,89,19,255,163,86,18,255,161,78,17,255,23,15,6,170,0, +-8,9,7,4,57,99,48,14,255,142,73,17,255,133,66,16,255,19,13,6, +-190,0,12,7,6,4,164,135,66,16,255,161,85,17,255,161,85,17,255,25, +-16,6,170,0,8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17, +-255,19,13,6,227,0,12,10,8,5,176,190,107,25,255,212,127,35,255,214, +-134,39,255,30,21,13,255,0,24,12,10,7,170,194,109,33,255,213,132,36, +-255,208,122,29,255,28,20,11,255,0,24,9,7,4,147,136,70,17,255,202, +-98,21,255,211,126,34,255,27,20,12,255,3,3,2,28,0,8,10,8,7, +-195,180,93,23,255,202,102,21,255,202,102,21,255,25,17,10,221,0,8,13, +-11,8,65,129,70,22,255,172,88,21,255,144,78,19,255,22,15,7,176,0, +-12,10,8,7,198,198,124,37,255,215,136,42,255,214,134,39,255,27,21,12, +-212,0,8,12,10,7,79,151,88,26,255,198,116,29,255,192,109,27,255,25, +-18,10,167,0,8,12,9,7,82,119,62,20,255,174,89,21,255,154,79,19, +-255,22,15,7,181,0,20,5,5,4,68,20,14,7,249,142,73,17,255,143, +-74,18,255,45,26,10,255,10,8,5,85,0,76,7,6,6,85,39,30,18, +-255,196,121,41,255,213,135,42,255,115,72,30,255,10,9,7,170,0,40,5, +-5,4,17,6,5,5,85,5,5,4,45,0,28,9,7,4,142,146,79,19, +-255,204,108,23,255,212,126,33,255,30,22,13,255,3,3,3,40,0,36,10, +-8,5,125,133,66,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0, +-12,10,8,5,127,136,70,17,255,193,97,20,255,203,108,24,255,30,21,11, +-193,0,8,13,10,6,85,134,70,19,255,171,90,18,255,159,81,18,255,17, +-12,6,238,0,12,8,6,5,144,135,66,16,255,161,85,17,255,161,85,17, +-255,23,15,6,170,0,8,10,7,5,85,133,66,16,255,185,94,20,255,209, +-123,30,255,23,18,12,255,3,3,2,28,0,4,5,5,4,28,18,15,11, +-227,134,72,21,255,158,81,19,255,143,74,18,255,22,15,7,142,0,8,10, +-8,5,85,131,65,16,255,163,79,18,255,178,90,19,255,22,16,9,255,3, +-2,2,20,0,8,9,7,6,176,144,78,19,255,175,88,18,255,163,79,18, +-255,26,16,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161, +-78,17,255,19,13,6,229,0,32,8,7,5,156,144,78,19,255,202,102,21, +-255,206,111,27,255,27,20,12,255,0,32,10,8,5,133,135,66,16,255,161, +-85,17,255,161,85,17,255,19,13,6,227,0,12,8,7,5,255,172,85,21, +-255,189,92,20,255,172,87,19,255,24,16,7,170,0,8,10,8,5,85,129, +-64,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0,12,10,8,5, +-127,135,66,16,255,161,85,17,255,161,85,17,255,26,16,7,170,0,8,11, +-9,6,85,134,70,19,255,171,90,18,255,159,78,18,255,23,15,6,170,0, +-8,9,7,4,57,98,49,13,255,139,71,16,255,133,66,16,255,19,13,6, +-193,0,12,7,6,4,176,133,66,16,255,161,85,17,255,161,85,17,255,23, +-15,6,170,0,8,10,8,5,85,129,64,16,255,165,87,18,255,180,91,19, +-255,20,15,9,255,0,4,5,5,4,17,26,21,15,227,126,75,25,255,178, +-95,21,255,142,74,19,255,46,28,11,255,10,8,5,57,0,8,10,8,5, +-85,131,65,16,255,161,85,17,255,161,85,17,255,17,12,6,252,2,1,1, +-8,0,28,13,11,8,170,199,119,34,255,215,136,42,255,214,139,41,255,28, +-20,13,255,0,20,8,7,5,170,135,66,16,255,161,85,17,255,161,85,17, +-255,23,15,6,170,0,8,10,8,5,85,131,67,16,255,202,102,21,255,211, +-127,36,255,22,17,11,249,0,8,16,14,11,201,101,67,28,255,191,98,22, +-255,185,94,20,255,172,87,19,255,26,17,7,170,0,8,10,8,5,85,129, +-64,16,255,161,85,17,255,161,85,17,255,31,20,8,255,5,5,4,102,0, +-4,5,4,4,28,16,13,9,255,164,85,21,255,180,91,19,255,165,87,18, +-255,26,17,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161, +-85,17,255,19,13,6,212,0,40,10,8,5,133,135,66,16,255,161,85,17, +-255,161,85,17,255,26,17,7,255,3,3,2,136,9,7,4,227,131,67,20, +-255,197,104,22,255,198,104,21,255,183,93,19,255,172,87,19,255,26,17,7, +-170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,19, +-13,6,212,0,12,10,8,5,127,135,66,16,255,193,97,20,255,209,123,30, +-255,19,15,10,252,0,8,13,11,8,65,125,68,22,255,174,86,21,255,146, +-76,19,255,22,14,7,178,0,12,8,6,5,144,135,66,16,255,161,85,17, +-255,161,85,17,255,19,14,6,238,0,24,13,11,8,170,163,87,20,255,180, +-91,19,255,165,87,18,255,17,12,6,255,0,24,9,7,4,139,135,66,16, +-255,161,85,17,255,161,85,17,255,15,11,6,246,0,12,9,7,6,184,180, +-93,23,255,211,115,30,255,213,133,38,255,28,20,13,255,0,16,12,11,9, +-170,152,91,31,255,188,105,31,255,115,66,22,255,91,50,16,255,84,46,15, +-255,116,59,17,255,118,62,17,255,15,11,6,221,0,16,10,8,5,116,146, +-79,19,255,202,103,23,255,209,128,32,255,200,127,41,255,167,106,40,255,197, +-122,42,255,210,130,35,255,186,106,27,255,88,51,19,255,102,55,17,255,157, +-83,18,255,189,92,20,255,209,123,30,255,29,21,12,224,0,8,7,6,6, +-28,41,31,18,235,160,84,23,255,170,87,19,255,45,26,10,255,5,5,4, +-170,4,4,4,8,4,4,3,99,15,12,6,255,140,72,17,255,138,71,17, +-255,45,26,10,255,10,8,5,85,0,24,8,7,5,142,133,66,16,255,161, +-85,17,255,161,85,17,255,19,13,6,229,0,24,13,11,8,170,160,86,21, +-255,185,90,20,255,91,50,16,255,7,6,4,255,0,40,8,7,5,150,133, +-66,16,255,161,85,17,255,161,85,17,255,15,11,6,246,0,32,8,8,7, +-110,74,52,27,255,191,103,24,255,176,89,19,255,34,22,9,255,6,5,3, +-57,0,20,8,6,5,161,133,66,16,255,161,85,17,255,161,78,17,255,15, +-11,6,252,0,140,12,10,5,85,123,61,16,255,161,85,17,255,161,85,17, +-255,22,15,7,255,2,2,1,85,0,8,7,6,4,244,133,66,16,255,167, +-88,18,255,189,92,20,255,27,19,10,195,0,8,12,10,7,110,160,83,21, +-255,177,85,18,255,161,78,17,255,15,11,6,252,0,12,7,6,4,161,133, +-66,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0,8,11,9,6, +-85,134,70,19,255,171,90,18,255,159,78,18,255,15,11,6,249,0,12,10, +-8,5,85,98,49,13,255,135,72,16,255,133,66,16,255,19,13,6,139,0, +-8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17,255,15,11,6, +-246,0,12,7,6,4,164,133,66,16,255,165,87,18,255,178,90,19,255,24, +-17,9,212,0,8,13,11,8,105,165,86,22,255,180,91,19,255,159,81,18, +-255,19,14,6,255,2,2,1,79,0,44,8,6,5,167,133,66,16,255,161, +-85,17,255,161,85,17,255,15,11,6,252,0,16,7,6,6,28,24,19,13, +-227,103,59,20,255,157,83,18,255,154,78,17,255,150,81,19,255,154,79,19, +-255,158,81,19,255,162,83,19,255,161,85,17,255,159,81,18,255,163,86,18, +-255,27,18,8,170,0,8,11,9,6,85,131,67,16,255,165,87,18,255,161, +-85,17,255,15,11,6,252,0,12,8,6,5,167,133,66,16,255,161,85,17, +-255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,131,65,16,255,175, +-88,18,255,191,96,20,255,25,18,10,255,0,24,11,9,6,170,148,77,19, +-255,169,82,18,255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,129, +-64,16,255,161,85,17,255,161,85,17,255,87,47,14,255,23,17,8,255,65, +-34,12,255,150,76,17,255,132,68,17,255,41,25,10,255,10,8,5,85,0, +-16,8,7,5,150,133,66,16,255,161,85,17,255,161,78,17,255,23,15,6, +-170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23, +-15,6,170,0,4,8,7,5,153,133,66,16,255,19,13,6,238,0,4,10, +-8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0, +-8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,15,11,6, +-252,0,12,8,6,5,167,133,66,16,255,161,85,17,255,161,85,17,255,23, +-15,6,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17, +-255,31,20,8,255,5,4,4,85,0,4,5,4,4,40,17,14,10,255,200, +-120,35,255,207,112,28,255,195,98,20,255,29,20,8,170,0,8,10,8,5, +-85,131,65,16,255,163,86,18,255,159,81,18,255,150,76,17,255,137,70,16, +-255,135,72,16,255,135,66,16,255,146,75,17,255,159,81,18,255,131,67,20, +-255,42,31,17,255,10,9,7,62,0,8,5,5,4,8,26,21,15,227,137, +-79,28,255,174,88,19,255,158,83,17,255,137,70,16,255,135,72,16,255,135, +-66,16,255,146,75,17,255,159,81,18,255,161,85,17,255,161,85,17,255,23, +-15,6,170,0,8,10,8,5,85,131,67,16,255,163,86,18,255,159,81,18, +-255,17,12,6,255,0,68,2,1,1,8,7,6,4,249,137,67,16,255,165, +-80,18,255,154,78,17,255,27,18,8,170,0,16,8,6,5,167,133,66,16, +-255,161,85,17,255,161,85,17,255,15,11,6,252,0,16,13,11,8,170,199, +-124,36,255,211,125,32,255,200,105,21,255,18,13,7,255,0,12,7,6,4, +-164,133,66,16,255,161,85,17,255,161,78,17,255,19,13,6,227,0,16,8, +-7,5,122,68,38,13,255,150,83,23,255,174,107,35,255,181,112,38,255,190, +-117,39,255,193,114,36,255,143,84,26,255,15,12,8,212,4,4,3,6,0, +-12,10,8,5,108,135,66,16,255,161,85,17,255,161,85,17,255,125,65,16, +-255,90,47,13,255,121,60,16,255,164,84,19,255,189,97,22,255,177,104,32, +-255,194,123,39,255,212,134,41,255,210,124,31,255,200,105,21,255,23,17,8, +-218,0,16,10,8,5,167,56,31,11,255,110,55,15,255,118,62,17,255,115, +-58,16,255,115,58,16,255,120,63,17,255,95,46,14,255,17,13,6,227,7, +-6,4,28,0,16,14,12,7,227,87,43,14,255,154,78,17,255,152,77,17, +-255,139,71,16,255,135,72,16,255,135,66,16,255,146,75,17,255,200,105,21, +-255,211,127,36,255,214,134,39,255,23,18,12,255,0,12,7,6,4,85,26, +-16,7,255,131,67,16,255,145,75,18,255,78,43,15,255,7,6,4,255,0, +-40,10,8,5,136,157,81,20,255,210,129,33,255,139,89,36,255,10,9,7, +-198,0,16,13,11,8,170,196,113,31,255,206,114,25,255,189,92,20,255,18, +-13,7,244,0,16,5,4,4,88,27,19,8,255,141,73,18,255,161,85,17, +-255,21,14,6,218,0,112,12,9,7,99,11,8,6,170,10,8,5,91,0, +-60,11,10,8,28,32,23,13,227,108,57,19,255,153,82,18,255,154,78,17, +-255,146,75,17,255,97,47,14,255,36,24,11,255,108,64,25,255,203,111,30, +-255,207,118,32,255,207,118,32,255,189,110,32,255,63,41,20,255,15,12,8, +-76,0,8,9,8,6,28,38,27,15,218,51,33,18,255,48,32,17,255,131, +-74,24,255,182,97,21,255,176,89,19,255,170,87,19,255,134,72,21,255,37, +-25,14,255,15,13,8,144,7,7,6,28,0,12,11,9,8,127,171,99,28, +-255,208,123,31,255,203,124,30,255,104,63,27,255,15,13,10,212,7,6,6, +-28,0,12,14,11,7,170,142,74,19,255,161,85,17,255,159,81,18,255,27, +-18,8,184,0,8,6,5,3,28,27,17,8,227,92,46,13,255,111,55,14, +-255,31,20,8,255,8,6,3,198,9,7,4,170,10,8,5,227,22,16,9, +-255,61,39,18,255,107,64,26,255,108,66,25,255,32,22,11,255,9,7,6, +-170,0,44,10,9,7,156,56,36,19,255,191,114,32,255,175,98,30,255,41, +-27,16,255,11,9,6,57,0,12,21,15,10,227,100,56,21,255,160,83,21, +-255,80,44,17,255,14,12,7,190,7,6,6,28,0,16,13,10,6,28,29, +-20,10,212,21,15,10,144,0,20,12,9,7,85,39,24,10,173,16,12,7, +-85,0,32,6,5,3,20,19,13,6,173,21,14,6,255,21,15,6,215,10, +-8,5,85,0,24,15,12,8,170,190,98,23,255,203,108,24,255,202,111,23, +-255,23,17,10,255,0,60,17,13,10,170,195,112,30,255,211,124,30,255,205, +-106,26,255,31,21,12,255,0,12,8,6,5,139,44,25,9,255,135,72,16, +-255,104,54,13,255,15,11,6,249,7,6,4,28,0,24,7,6,4,57,44, +-25,9,255,137,73,16,255,143,70,16,255,49,25,8,255,8,6,3,184,8, +-6,3,85,8,6,3,142,23,16,6,255,130,66,15,255,145,77,16,255,87, +-44,12,255,10,8,5,142,0,20,11,9,8,164,53,31,14,255,150,74,19, +-255,154,78,17,255,148,76,17,255,65,33,10,255,10,8,5,184,6,5,5, +-28,0,16,11,9,6,142,175,102,30,255,207,123,32,255,208,114,31,255,196, +-114,33,255,89,56,26,255,17,13,10,255,11,8,6,170,9,7,6,170,11, +-8,6,170,15,11,8,170,18,13,9,142,8,6,5,28,0,8,10,8,5, +-93,102,53,17,255,159,81,18,255,154,78,17,255,72,37,11,255,11,8,6, +-227,9,7,6,170,11,8,6,198,61,36,20,255,196,107,27,255,204,114,27, +-255,182,102,31,255,19,14,10,170,0,8,6,6,5,20,26,19,11,198,28, +-20,11,255,22,16,9,255,23,16,8,255,27,18,8,255,24,16,7,255,24, +-16,7,255,74,39,11,255,139,68,16,255,143,70,16,255,143,70,16,255,20, +-13,5,170,0,8,7,6,4,74,87,44,12,255,155,79,18,255,151,73,16, +-255,67,34,10,255,9,7,4,198,9,7,4,96,8,6,5,159,27,17,8, +-255,137,67,16,255,158,80,17,255,112,56,15,255,10,8,5,167,0,8,7, +-5,4,85,74,36,11,255,150,83,17,255,145,77,16,255,55,29,10,255,8, +-6,3,198,8,6,3,88,7,6,4,153,39,24,12,255,199,112,28,255,210, +-115,31,255,184,108,33,255,17,14,10,198,0,24,11,9,6,170,139,69,18, +-255,168,86,19,255,154,78,17,255,17,12,6,235,0,24,7,6,4,85,64, +-32,11,255,162,80,19,255,198,96,21,255,109,63,26,255,15,11,8,227,10, +-8,7,170,8,7,5,195,29,18,8,255,137,67,16,255,154,78,17,255,114, +-59,15,255,11,10,6,164,0,8,9,7,6,85,97,50,16,255,159,81,18, +-255,152,77,17,255,74,36,11,255,10,8,5,198,7,6,4,125,10,8,5, +-198,61,36,20,255,200,105,29,255,209,122,28,255,180,104,29,255,16,12,9, +-170,0,8,12,10,7,170,160,83,21,255,183,89,19,255,174,88,19,255,28, +-19,9,187,0,8,14,10,7,85,143,75,20,255,195,98,20,255,189,92,20, +-255,21,15,8,224,0,24,7,6,4,85,26,16,7,255,111,55,14,255,132, +-67,15,255,39,23,8,255,8,6,3,113,0,68,9,7,6,85,32,22,13, +-255,188,112,31,255,193,114,30,255,94,57,25,255,17,13,10,170,0,44,9, +-7,4,142,10,8,5,255,10,8,5,198,6,5,3,28,0,24,8,7,5, +-85,88,48,19,255,204,114,27,255,208,118,31,255,111,62,26,255,11,8,6, +-227,8,7,5,150,10,8,5,116,10,8,5,88,9,7,4,85,6,5,3, +-74,0,16,10,8,5,99,114,56,13,255,143,70,16,255,143,70,16,255,18, +-12,5,215,0,12,8,7,3,130,118,60,13,255,148,76,17,255,150,76,17, +-255,24,16,7,170,0,8,9,7,4,85,114,56,13,255,145,74,16,255,143, +-70,16,255,52,28,9,255,8,6,3,198,8,6,3,88,8,6,3,144,23, +-15,6,255,130,66,15,255,151,80,16,255,111,55,14,255,10,8,5,144,0, +-8,6,5,3,59,59,32,10,255,157,83,18,255,185,90,20,255,97,54,22, +-255,14,10,7,227,13,10,6,170,13,10,6,255,84,41,13,255,148,76,17, +-255,155,82,18,255,135,66,16,255,14,10,5,159,0,8,9,7,4,85,114, +-56,13,255,145,77,16,255,145,74,16,255,55,28,10,255,9,7,4,198,8, +-6,3,93,8,6,3,147,25,16,6,255,130,64,15,255,151,80,16,255,111, +-55,14,255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,145,77,16, +-255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3,102,8,6,3, +-139,8,6,3,170,9,8,4,113,0,12,10,8,5,91,114,56,13,255,150, +-76,17,255,150,76,17,255,17,12,6,252,0,32,7,6,4,85,64,33,11, +-255,145,77,16,255,143,70,16,255,56,29,9,255,8,6,3,198,8,6,3, +-85,6,5,3,119,14,11,5,255,128,66,15,255,151,73,16,255,143,76,16, +-255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143, +-70,16,255,18,12,5,215,0,12,8,7,3,130,114,56,13,255,143,70,16, +-255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143, +-70,16,255,143,70,16,255,20,13,5,170,0,8,7,6,4,71,87,44,12, +-255,158,87,17,255,161,85,17,255,103,53,20,255,15,11,8,227,10,8,7, +-170,10,8,7,195,33,20,10,255,137,67,16,255,151,73,16,255,111,55,14, +-255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,146, +-75,17,255,18,13,7,255,0,8,7,6,6,74,24,16,7,255,132,67,15, +-255,145,77,16,255,135,72,16,255,14,10,5,170,0,8,9,7,4,85,114, +-56,13,255,145,77,16,255,143,70,16,255,58,31,11,255,11,8,6,227,11, +-9,6,170,11,8,6,170,10,7,5,170,9,8,4,113,0,12,11,9,6, +-161,175,92,24,255,203,108,24,255,198,101,23,255,25,18,10,255,0,20,8, +-6,3,147,114,56,13,255,143,70,16,255,143,70,16,255,20,13,5,170,0, +-8,9,7,4,85,114,56,13,255,170,87,19,255,199,106,24,255,24,17,11, +-255,0,8,6,6,5,28,15,12,6,255,128,66,15,255,145,74,16,255,143, +-70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145,77,16, +-255,143,70,16,255,90,44,13,255,19,13,6,255,10,8,5,255,13,10,6, +-255,62,33,11,255,135,72,16,255,151,73,16,255,108,53,13,255,10,8,5, +-142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18, +-12,5,215,0,40,7,6,4,85,64,33,11,255,145,77,16,255,143,70,16, +-255,67,34,10,255,14,10,5,255,49,27,9,255,140,72,17,255,160,85,19, +-255,160,85,19,255,110,55,15,255,31,20,8,255,9,7,4,57,0,8,9, +-8,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18,12,5,215,0, +-12,8,7,3,136,118,60,13,255,154,75,17,255,172,87,19,255,24,17,9, +-204,0,8,8,7,5,85,95,49,16,255,161,85,17,255,152,77,17,255,71, +-34,10,255,9,7,4,198,8,6,3,88,8,6,3,142,23,15,6,255,130, +-66,15,255,151,80,16,255,111,55,14,255,14,10,5,170,0,24,9,7,4, +-164,118,56,15,255,145,74,16,255,143,70,16,255,16,12,5,224,0,24,9, +-7,4,85,85,43,12,255,151,80,16,255,143,70,16,255,55,29,10,255,8, +-6,3,198,8,6,3,93,8,6,5,173,45,27,14,255,199,112,28,255,210, +-124,31,255,199,119,34,255,19,15,10,221,0,20,13,11,8,170,46,28,11, +-255,131,65,16,255,145,74,16,255,137,67,16,255,70,35,11,255,12,10,5, +-224,7,6,4,28,0,16,8,6,5,34,37,25,14,255,181,100,28,255,206, +-113,31,255,207,123,32,255,199,119,34,255,107,67,28,255,28,20,11,255,28, +-19,9,255,84,41,13,255,141,75,16,255,145,74,16,255,159,82,20,255,88, +-53,25,255,13,11,8,99,0,8,13,10,6,85,114,60,17,255,148,76,17, +-255,143,70,16,255,21,14,6,255,0,12,10,8,5,170,119,61,14,255,145, +-77,16,255,135,72,16,255,19,13,6,170,0,24,8,7,3,142,114,56,13, +-255,143,70,16,255,143,70,16,255,16,12,5,218,0,24,11,8,6,170,126, +-62,15,255,151,80,16,255,112,57,13,255,19,13,6,255,8,6,3,144,8, +-6,3,85,9,7,4,113,8,6,3,167,8,6,3,170,8,6,3,170,9, +-8,4,113,0,12,10,8,5,91,114,56,13,255,145,74,16,255,143,70,16, +-255,61,32,10,255,9,8,4,170,0,32,12,10,7,207,74,36,11,255,139, +-74,16,255,79,40,12,255,10,8,5,210,0,16,9,7,4,85,27,17,6, +-255,130,66,15,255,143,70,16,255,143,76,16,255,16,12,5,221,0,140,8, +-6,3,85,74,39,11,255,145,77,16,255,143,70,16,255,41,23,8,255,7, +-6,4,173,5,5,2,85,6,5,3,113,14,10,5,255,129,65,14,255,145, +-74,16,255,145,74,16,255,24,16,7,170,0,8,10,8,5,85,112,57,13, +-255,145,77,16,255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3, +-88,8,6,3,144,23,15,6,255,130,66,15,255,151,80,16,255,111,55,14, +-255,10,8,5,144,0,8,6,5,3,59,63,34,10,255,145,77,16,255,143, +-70,16,255,55,29,10,255,8,6,3,198,8,6,3,85,8,6,3,144,32, +-19,7,255,139,74,16,255,155,79,18,255,135,66,16,255,14,10,5,170,0, +-8,6,5,3,57,57,31,10,255,145,77,16,255,143,70,16,255,55,29,10, +-255,8,6,3,198,8,6,3,88,8,6,3,144,21,15,6,255,130,66,15, +-255,143,76,16,255,146,75,17,255,24,15,7,184,0,8,7,6,4,71,66, +-33,11,255,148,79,17,255,143,70,16,255,45,25,8,255,7,5,4,176,7, +-5,4,85,8,6,3,85,9,7,4,85,8,6,3,82,0,28,8,7,3, +-136,114,56,13,255,143,70,16,255,143,70,16,255,16,12,5,221,0,20,7, +-6,4,28,10,8,5,130,19,13,6,170,29,19,8,173,24,16,7,212,27, +-18,8,193,20,13,7,246,55,29,10,255,139,74,16,255,143,70,16,255,143, +-70,16,255,18,13,5,170,0,8,9,7,4,85,115,54,14,255,143,70,16, +-255,143,70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143, +-70,16,255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13, +-255,145,74,16,255,145,74,16,255,17,11,6,252,0,24,10,8,5,170,119, +-61,14,255,145,74,16,255,143,70,16,255,18,13,5,170,0,8,9,7,4, +-85,114,56,13,255,143,70,16,255,143,70,16,255,33,20,8,255,5,4,4, +-195,8,6,5,198,46,26,9,255,126,62,15,255,132,67,15,255,35,22,8, +-255,9,7,4,93,0,12,10,8,5,93,114,56,13,255,143,70,16,255,143, +-70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16, +-255,143,70,16,255,20,13,5,170,0,4,9,7,4,125,114,56,13,255,21, +-13,6,210,0,4,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16, +-255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143, +-70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143,70,16, +-255,143,70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145, +-77,16,255,143,70,16,255,90,44,13,255,17,12,6,255,12,9,5,255,20, +-15,9,255,97,51,20,255,169,87,20,255,161,85,17,255,112,54,15,255,10, +-8,5,142,0,8,9,7,4,85,121,60,16,255,174,88,19,255,176,89,19, +-255,112,59,17,255,37,23,10,255,26,16,7,255,25,18,8,255,24,15,7, +-255,23,16,8,255,18,13,9,198,10,9,7,99,0,16,9,8,6,34,12, +-10,7,167,20,14,7,210,21,15,6,255,26,17,7,255,24,16,7,255,26, +-17,7,255,70,35,11,255,142,73,17,255,148,76,17,255,152,77,17,255,24, +-15,7,170,0,8,13,10,6,96,129,65,18,255,170,87,19,255,170,87,19, +-255,24,16,9,255,0,48,5,4,2,76,8,6,3,85,8,6,3,85,8, +-6,3,85,7,5,4,85,6,5,3,119,16,11,5,255,129,65,14,255,151, +-73,16,255,118,61,15,255,14,10,5,170,0,16,8,7,3,136,114,56,13, +-255,143,70,16,255,143,70,16,255,16,12,5,221,0,16,10,8,7,113,109, +-67,26,255,184,90,21,255,148,76,17,255,52,28,9,255,8,6,3,198,8, +-6,3,88,8,6,3,144,21,15,6,255,130,66,15,255,143,76,16,255,143, +-76,16,255,16,12,5,227,0,20,9,8,6,170,67,42,20,255,202,124,31, +-255,208,128,33,255,205,106,26,255,104,58,21,255,14,11,7,218,6,5,5, +-28,0,16,7,6,4,28,27,17,8,229,102,51,13,255,139,68,16,255,143, +-73,16,255,145,74,16,255,71,37,12,255,26,18,9,255,80,50,23,255,204, +-122,33,255,208,115,33,255,202,104,25,255,149,78,20,255,52,30,11,255,10, +-8,5,85,0,12,14,10,5,170,85,43,12,255,137,73,16,255,77,39,12, +-255,14,10,5,227,10,8,5,170,10,8,5,198,46,26,9,255,137,73,16, +-255,115,59,14,255,25,16,6,232,8,6,3,31,0,12,6,5,3,28,10, +-8,5,119,19,13,6,170,29,19,8,173,26,16,7,210,27,18,8,187,17, +-12,6,246,58,30,11,255,151,77,18,255,192,97,21,255,192,97,21,255,24, +-16,9,207,0,8,4,4,3,3,25,16,6,235,115,59,14,255,143,73,16, +-255,145,77,16,255,108,53,13,255,21,14,6,255,7,6,4,164,10,7,5, +-85,8,7,5,147,9,7,4,136,8,6,5,76,0,20,8,6,5,57,58, +-33,13,255,188,107,27,255,192,111,31,255,85,51,24,255,18,13,9,187,6, +-5,5,20,0,8,11,9,6,156,139,69,18,255,158,83,17,255,148,76,17, +-255,23,15,6,170,0,12,9,7,4,85,19,13,6,255,102,51,13,255,128, +-66,15,255,81,41,12,255,12,9,5,142,0,108,13,10,8,85,115,60,24, +-255,162,75,23,255,121,60,20,255,23,15,8,142,0,60,3,3,2,6,10, +-8,5,170,93,48,12,255,123,65,14,255,123,60,14,255,14,10,5,227,3, +-3,2,85,12,10,7,170,163,83,24,255,199,99,26,255,193,96,24,255,41, +-26,14,227,6,6,5,45,0,24,3,3,2,28,11,8,6,170,106,50,13, +-255,129,63,14,255,129,63,14,255,29,18,8,227,6,5,5,31,0,20,13, +-10,8,136,144,73,21,255,182,89,21,255,99,55,19,255,14,11,7,187,4, +-4,3,3,0,16,9,7,4,113,93,46,12,255,131,66,14,255,121,62,14, +-255,16,11,5,170,0,12,7,6,4,28,14,10,5,227,100,50,13,255,110, +-59,13,255,103,52,14,255,121,59,18,255,134,69,21,255,32,21,11,255,6, +-5,5,198,10,8,7,227,46,28,13,255,104,51,15,255,96,46,13,255,14, +-10,5,139,0,44,10,8,7,108,63,37,18,255,176,88,23,255,160,80,21, +-255,20,14,9,170,0,8,8,6,5,79,85,41,12,255,131,65,16,255,66, +-34,11,255,10,8,5,170,0,144,9,7,4,167,115,56,16,255,165,85,20, +-255,112,65,23,255,18,13,9,142,0,60,13,10,8,142,132,68,21,255,162, +-80,19,255,141,70,18,255,17,12,6,181,0,12,17,12,6,255,103,54,14, +-255,130,66,15,255,31,20,8,255,6,5,3,113,0,32,8,6,3,156,35, +-22,8,255,114,58,13,255,110,59,13,255,88,45,11,255,88,42,11,255,92, +-47,11,255,104,54,13,255,119,58,14,255,61,32,10,255,10,8,5,224,5, +-4,4,20,0,16,11,8,6,85,113,58,22,255,180,90,23,255,140,69,17, +-255,123,63,14,255,123,60,14,255,119,56,14,255,120,61,17,255,24,15,9, +-167,0,16,12,10,7,133,180,88,27,255,203,107,30,255,199,100,28,255,197, +-104,28,255,191,93,28,255,167,78,24,255,132,68,21,255,121,62,18,255,117, +-60,18,255,118,57,17,255,108,50,15,255,17,12,6,113,0,12,14,10,5, +-227,65,33,10,255,115,59,14,255,115,59,14,255,109,52,14,255,116,57,17, +-255,121,59,18,255,139,68,20,255,154,73,19,255,115,62,20,255,33,23,12, +-255,9,8,6,71,0,36,2,2,1,8,8,6,3,170,93,50,12,255,125, +-64,14,255,123,60,14,255,14,10,5,159,0,12,14,10,5,224,65,33,10, +-255,115,59,14,255,115,59,14,255,109,52,14,255,119,61,18,255,129,66,20, +-255,148,75,21,255,170,84,21,255,129,67,22,255,37,25,14,255,8,7,5, +-57,0,8,5,5,4,23,24,17,9,255,103,54,18,255,132,63,17,255,120, +-62,15,255,98,49,13,255,90,45,11,255,94,45,13,255,124,60,17,255,172, +-81,21,255,150,78,25,255,44,29,17,255,9,8,6,91,0,24,8,7,3, +-102,93,46,12,255,125,64,14,255,121,62,14,255,18,12,5,170,0,28,12, +-10,5,227,64,33,11,255,132,66,17,255,158,79,21,255,151,70,22,255,130, +-67,21,255,110,53,15,255,108,53,13,255,118,60,13,255,85,43,12,255,21, +-14,6,255,7,6,4,57,0,12,14,10,5,227,65,33,10,255,131,65,16, +-255,149,72,20,255,133,68,20,255,111,54,16,255,110,53,15,255,138,72,19, +-255,163,81,20,255,112,58,19,255,28,20,9,255,8,7,5,57,0,8,9, +-7,4,91,96,48,13,255,132,70,15,255,123,60,14,255,14,10,5,161,0, +-8,13,10,6,85,148,73,23,255,202,101,27,255,129,67,26,255,18,13,9, +-142,0,28,6,5,3,48,17,12,6,227,108,55,13,255,112,55,13,255,35, +-22,8,255,9,7,4,57,0,64,32,22,13,255,137,68,22,255,154,73,19, +-255,45,26,10,255,8,6,5,144,0,44,8,6,3,68,67,34,10,255,115, +-56,16,255,109,52,14,255,16,11,5,147,0,24,5,4,4,11,22,17,11, +-227,129,76,28,255,195,95,28,255,186,84,23,255,121,59,18,255,107,51,14, +-255,96,46,13,255,90,45,11,255,88,45,11,255,41,24,8,255,12,10,5, +-176,0,12,8,6,3,76,88,44,11,255,125,66,14,255,123,60,14,255,18, +-12,5,170,0,12,9,7,4,85,92,47,11,255,125,64,14,255,123,60,14, +-255,16,11,5,150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123, +-60,14,255,114,58,13,255,93,50,12,255,88,44,11,255,92,47,11,255,104, +-54,13,255,119,58,14,255,85,43,12,255,21,15,6,255,7,6,4,51,0, +-12,12,10,5,221,61,32,10,255,120,62,15,255,123,61,16,255,109,52,14, +-255,96,46,13,255,102,51,13,255,115,59,14,255,123,65,14,255,85,43,12, +-255,25,16,6,255,7,6,4,51,0,8,8,6,3,74,88,45,11,255,125, +-64,14,255,123,60,14,255,114,58,13,255,93,50,12,255,88,45,11,255,92, +-47,11,255,104,52,13,255,118,60,13,255,85,43,12,255,21,15,6,255,7, +-5,4,40,0,8,8,6,3,74,88,45,11,255,125,64,14,255,123,60,14, +-255,114,58,13,255,93,50,12,255,88,45,11,255,92,43,11,255,93,50,12, +-255,93,50,12,255,20,13,5,85,0,8,8,6,3,65,88,45,11,255,125, +-64,14,255,121,62,14,255,18,13,5,170,0,36,12,10,5,227,59,31,10, +-255,115,62,14,255,114,58,13,255,93,50,12,255,88,44,11,255,88,44,11, +-255,104,54,13,255,118,60,13,255,123,60,14,255,123,60,14,255,14,10,5, +-150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18, +-12,5,170,0,12,9,7,4,85,92,47,11,255,125,66,14,255,123,65,14, +-255,14,10,5,150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123, +-65,14,255,14,10,5,159,0,12,14,10,5,221,70,35,11,255,155,74,20, +-255,193,89,26,255,185,91,28,255,172,85,27,255,165,80,24,255,155,78,22, +-255,132,66,17,255,90,44,13,255,21,15,6,255,7,5,4,40,0,8,8, +-6,3,74,88,45,11,255,125,64,14,255,121,62,14,255,19,13,6,176,0, +-12,9,6,4,133,93,50,12,255,131,66,14,255,123,65,14,255,14,11,5, +-150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123,60,14,255,118, +-56,15,255,120,61,17,255,136,67,21,255,118,57,17,255,96,48,13,255,92, +-47,11,255,18,12,5,85,0,8,9,7,4,79,104,51,15,255,140,66,17, +-255,135,66,16,255,17,12,6,198,0,20,9,7,4,85,92,47,11,255,125, +-66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3,65,88,45,11, +-255,135,66,16,255,136,67,17,255,22,14,7,198,0,12,8,6,3,119,88, +-45,11,255,125,64,14,255,123,60,14,255,14,10,5,159,0,12,12,10,5, +-210,59,31,10,255,115,62,14,255,118,60,13,255,104,54,13,255,100,50,13, +-255,100,50,13,255,114,58,13,255,119,63,14,255,85,43,12,255,21,15,6, +-255,7,5,4,40,0,8,8,6,3,74,88,45,11,255,125,66,14,255,123, +-60,14,255,18,12,5,170,0,44,12,10,5,227,59,31,10,255,115,62,14, +-255,114,58,13,255,100,50,13,255,114,56,13,255,133,66,16,255,160,80,21, +-255,176,83,21,255,45,27,12,255,6,5,3,170,0,12,8,6,3,82,88, +-45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9,7,4, +-85,92,47,11,255,131,61,14,255,126,62,15,255,17,11,6,170,0,12,14, +-10,5,227,65,33,10,255,115,59,14,255,115,62,14,255,93,50,12,255,88, +-44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12,255,21, +-15,6,255,7,6,4,57,0,24,9,7,4,85,92,47,11,255,125,66,14, +-255,123,60,14,255,18,12,5,170,0,24,5,5,4,28,19,13,6,255,84, +-42,11,255,115,62,14,255,110,59,13,255,93,50,12,255,84,44,11,255,106, +-54,15,255,176,84,23,255,199,100,28,255,188,101,31,255,90,54,25,255,13, +-10,8,142,0,24,8,6,3,164,72,37,11,255,131,66,14,255,110,54,13, +-255,12,9,5,224,3,3,2,17,0,24,7,6,6,85,30,20,13,255,190, +-96,27,255,199,98,24,255,121,69,22,255,13,10,6,190,4,3,3,28,5, +-4,2,105,27,17,6,255,114,56,13,255,125,64,14,255,45,26,10,255,8, +-7,5,153,0,12,10,7,5,85,96,48,13,255,125,64,14,255,123,60,14, +-255,16,11,5,195,0,12,8,6,3,110,92,47,11,255,131,66,14,255,123, +-65,14,255,18,13,5,170,0,24,9,7,4,85,92,47,11,255,125,66,14, +-255,123,60,14,255,18,12,5,170,0,24,8,7,3,99,93,50,12,255,125, +-66,14,255,115,59,14,255,104,54,13,255,88,45,11,255,88,44,11,255,92, +-43,11,255,92,43,11,255,92,43,11,255,93,50,12,255,93,50,12,255,20, +-13,5,85,0,8,8,6,3,65,88,45,11,255,125,64,14,255,123,60,14, +-255,115,62,14,255,93,46,12,255,16,11,5,127,0,28,5,4,4,28,12, +-10,5,246,104,54,13,255,115,59,14,255,39,23,8,255,8,6,3,82,0, +-12,58,31,9,255,114,58,13,255,119,63,14,255,123,60,14,255,123,65,14, +-255,18,12,5,170,0,144,14,10,5,227,59,31,10,255,115,62,14,255,110, +-59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,104,54,13,255,115, +-59,14,255,123,60,14,255,123,60,14,255,16,11,5,150,0,8,8,6,3, +-65,88,44,11,255,125,64,14,255,123,60,14,255,114,58,13,255,93,50,12, +-255,88,44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12, +-255,21,15,6,255,7,6,4,51,0,12,12,9,5,224,63,32,10,255,115, +-62,14,255,114,56,13,255,93,50,12,255,88,44,11,255,88,45,11,255,110, +-59,13,255,119,61,14,255,85,43,12,255,25,16,6,255,7,6,4,57,0, +-12,12,10,5,221,59,31,10,255,115,62,14,255,114,56,13,255,93,50,12, +-255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14, +-255,121,62,14,255,16,11,5,167,0,12,12,10,5,218,59,31,10,255,115, +-62,14,255,110,59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,88, +-45,11,255,88,44,11,255,16,11,5,105,0,24,9,7,4,85,92,47,11, +-255,125,66,14,255,123,60,14,255,18,12,5,170,0,48,7,5,4,198,93, +-50,12,255,125,66,14,255,123,60,14,255,12,10,5,170,0,8,8,6,3, +-65,88,45,11,255,125,66,14,255,123,65,14,255,18,12,5,170,0,12,9, +-7,4,85,92,47,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0, +-8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18,13,5, +-170,0,20,3,3,2,11,9,7,4,227,100,50,13,255,123,60,14,255,123, +-60,14,255,12,10,5,170,0,8,8,6,3,62,88,45,11,255,125,66,14, +-255,123,60,14,255,14,10,5,198,0,8,8,6,3,170,35,22,8,255,115, +-59,14,255,112,55,13,255,33,21,8,255,8,6,3,37,0,8,8,6,3, +-74,88,45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8, +-6,3,65,88,45,11,255,125,66,14,255,123,65,14,255,14,11,5,147,0, +-4,9,7,4,85,92,47,11,255,20,13,5,170,0,4,8,6,3,62,88, +-45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3, +-65,88,45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9, +-7,4,85,92,47,11,255,125,66,14,255,123,60,14,255,14,10,5,159,0, +-12,12,10,5,210,59,31,10,255,115,59,14,255,118,60,13,255,104,54,13, +-255,102,51,13,255,112,53,13,255,122,63,15,255,123,58,14,255,85,43,12, +-255,21,15,6,255,7,5,4,45,0,8,8,6,3,85,113,55,16,255,196, +-92,23,255,195,96,24,255,25,17,10,255,4,3,3,79,0,64,3,2,2, +-28,10,8,5,227,138,71,21,255,177,87,20,255,174,86,21,255,24,16,9, +-170,0,8,13,10,8,85,142,73,23,255,195,96,24,255,194,91,23,255,24, +-17,11,227,0,44,12,9,5,150,35,22,8,255,80,42,11,255,84,44,11, +-255,88,44,11,255,80,42,11,255,88,44,11,255,97,50,12,255,118,60,13, +-255,85,43,12,255,21,15,6,255,8,6,3,57,0,16,9,7,4,85,92, +-47,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,16,6,5,5, +-28,17,13,8,227,68,34,11,255,115,59,14,255,110,59,13,255,93,50,12, +-255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14, +-255,123,65,14,255,18,12,5,170,0,24,12,9,7,170,131,69,24,255,191, +-90,22,255,136,71,19,255,15,11,6,227,4,3,3,17,0,24,7,6,4, +-31,16,11,5,227,104,52,13,255,131,66,14,255,98,49,13,255,10,8,5, +-193,3,2,2,68,8,7,5,170,121,66,26,255,195,96,24,255,156,74,19, +-255,34,21,9,255,9,7,4,85,0,12,8,6,3,51,69,35,10,255,121, +-62,14,255,123,60,14,255,16,11,5,227,4,3,3,28,0,8,8,6,3, +-170,92,47,11,255,125,64,14,255,108,55,13,255,14,10,5,164,0,40,7, +-5,4,198,96,48,13,255,134,65,15,255,133,66,16,255,15,11,6,170,0, +-8,7,5,4,85,78,39,11,255,130,64,15,255,130,64,15,255,134,65,15, +-255,136,67,17,255,124,62,17,255,114,56,17,255,113,55,16,255,118,60,17, +-255,107,55,20,255,48,29,15,255,12,10,7,85,0,20,9,8,6,170,45, +-27,12,255,139,70,20,255,131,66,18,255,107,53,14,255,19,13,6,99,0, +-8,8,6,5,85,92,46,13,255,131,61,14,255,125,64,14,255,14,10,5, +-170,0,12,58,31,9,255,110,59,13,255,115,59,14,255,56,29,9,255,10, +-8,5,227,5,4,4,23,0,108,10,8,7,28,28,18,11,212,49,28,16, +-255,35,21,12,241,13,10,6,85,0,68,14,10,5,142,20,14,5,170,16, +-12,5,164,8,6,3,28,0,8,24,16,9,142,21,15,8,252,23,15,8, +-184,11,8,6,34,0,36,14,10,5,142,20,14,5,170,16,11,5,170,10, +-8,5,28,0,24,7,6,4,25,20,13,7,147,22,15,7,170,10,8,5, +-142,5,4,4,3,0,24,14,10,5,142,20,13,5,170,16,11,5,170,9, +-7,4,28,0,16,7,5,4,28,14,10,5,156,14,10,5,229,24,15,9, +-255,32,20,11,255,28,18,11,244,12,9,7,108,0,8,10,8,5,142,19, +-13,8,235,24,15,7,227,10,8,5,59,0,48,10,8,5,93,23,15,8, +-170,28,18,9,173,15,11,6,28,0,12,18,12,5,142,21,14,6,170,9, +-7,4,133,0,148,8,6,5,113,89,44,14,255,100,51,21,255,13,10,8, +-227,6,5,5,28,0,60,6,5,5,8,17,12,6,142,26,16,7,170,18, +-12,5,170,9,7,4,28,0,8,6,5,3,85,54,28,11,255,136,66,19, +-255,121,59,18,255,15,10,6,241,0,40,8,6,3,57,12,9,5,170,18, +-13,5,178,14,10,5,241,14,10,5,255,14,10,5,252,16,11,5,195,16, +-11,5,170,8,6,3,113,0,24,8,6,5,28,24,16,9,204,24,17,9, +-255,17,12,6,210,14,10,5,170,16,11,5,170,17,11,6,246,27,17,10, +-246,14,10,7,85,0,16,8,6,5,28,21,14,10,195,22,15,11,255,18, +-13,9,255,18,13,9,255,22,15,9,255,19,13,8,255,17,12,6,255,17, +-11,6,255,15,11,6,255,17,12,6,255,19,13,6,204,12,9,5,28,0, +-12,5,4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5, +-235,15,11,6,255,15,11,6,255,19,12,6,204,19,13,6,170,10,8,5, +-170,8,6,5,57,0,48,14,10,5,142,21,13,6,170,16,11,5,170,9, +-7,4,28,0,12,5,4,2,25,8,6,3,125,14,10,5,170,14,10,5, +-210,23,15,8,255,30,20,11,255,30,20,11,255,23,17,10,255,20,14,9, +-244,16,12,9,170,9,8,6,79,0,16,9,7,6,65,15,11,8,170,17, +-12,8,232,21,14,8,255,26,16,9,255,23,15,8,255,21,14,8,255,15, +-11,6,255,22,15,7,178,11,9,6,170,10,8,7,57,0,32,12,10,5, +-142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,5,5,4,28,8, +-6,3,133,15,11,6,193,20,15,9,255,28,18,11,255,30,20,11,255,26, +-16,9,255,14,10,5,238,16,11,5,170,9,7,4,153,7,5,4,57,0, +-16,5,4,2,28,8,6,3,142,18,12,7,207,22,15,9,255,28,18,11, +-255,27,18,10,255,18,13,7,255,15,11,6,227,21,13,6,170,10,7,5, +-164,7,6,4,57,0,16,14,10,5,142,20,13,5,170,16,12,5,170,9, +-7,4,28,0,8,10,8,7,119,149,64,26,255,131,63,26,255,14,11,7, +-227,6,5,5,28,0,32,7,5,4,28,14,10,5,156,20,13,5,170,12, +-9,5,142,6,5,3,6,0,64,12,10,7,142,24,15,7,170,21,13,6, +-170,8,6,3,76,0,48,9,7,6,85,83,43,16,255,176,88,23,255,130, +-62,21,255,16,11,7,170,0,28,9,8,6,28,13,10,8,164,23,16,10, +-190,16,11,7,252,15,11,6,255,14,10,5,255,14,10,5,255,14,10,5, +-255,16,11,5,232,14,10,5,170,8,6,3,85,0,16,14,10,5,142,21, +-13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5,142,20,13,5, +-170,16,11,5,170,9,7,4,28,0,12,14,10,5,136,16,12,5,170,16, +-11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5,249,16, +-12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5,5,4, +-28,8,6,3,125,14,10,5,170,18,12,5,176,14,10,5,238,14,10,5, +-246,16,12,5,195,18,13,5,170,16,11,5,170,9,7,4,150,7,5,4, +-54,0,16,14,10,5,142,16,12,5,170,16,11,5,170,18,12,5,170,16, +-11,5,210,14,10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9, +-7,4,153,7,6,4,57,0,16,14,10,5,142,16,12,5,170,16,11,5, +-170,18,12,5,170,16,11,5,210,14,10,5,252,12,9,5,255,16,11,5, +-255,20,13,5,201,11,9,4,28,0,12,14,10,5,139,20,13,5,170,16, +-11,5,170,9,7,4,28,0,36,5,5,4,28,8,6,3,125,14,10,5, +-170,18,13,5,176,14,10,5,238,14,10,5,255,16,11,5,235,18,13,5, +-173,16,11,5,170,16,12,5,170,16,11,5,164,9,7,4,28,0,12,12, +-9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5, +-142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21, +-13,6,170,16,11,5,170,9,7,4,28,0,12,6,5,3,28,8,7,5, +-139,19,13,8,193,21,15,10,255,31,21,12,255,32,21,13,255,31,20,12, +-255,23,17,10,255,18,12,7,212,10,8,5,159,7,6,4,57,0,16,14, +-10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5, +-142,21,13,6,170,16,12,5,170,9,7,4,28,0,12,14,10,5,136,16, +-12,5,170,16,11,5,170,18,12,5,176,17,12,6,252,21,14,8,255,17, +-12,6,255,16,11,5,255,20,13,5,204,11,9,4,28,0,12,14,10,5, +-142,21,14,6,170,18,12,5,170,9,8,4,28,0,24,14,10,5,142,20, +-13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6, +-170,16,12,5,170,10,8,5,28,0,16,12,9,5,142,20,13,5,170,16, +-11,5,170,9,7,4,28,0,12,5,5,4,28,8,6,3,125,14,10,5, +-170,18,12,5,170,20,14,5,173,16,12,5,193,20,13,5,178,20,13,5, +-170,16,11,5,170,9,7,4,153,7,6,4,57,0,16,14,10,5,142,21, +-13,6,170,16,11,5,170,9,7,4,28,0,44,5,5,4,28,8,6,3, +-125,14,10,5,170,18,13,5,170,20,14,5,170,18,12,5,170,13,10,6, +-227,72,38,19,255,185,86,32,255,144,64,29,255,20,15,11,232,8,7,7, +-28,0,12,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0, +-16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,5, +-4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5,238,14, +-10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9,7,4,153,7, +-5,4,57,0,32,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4, +-28,0,28,8,6,3,57,9,7,4,164,14,10,5,170,18,13,5,173,14, +-10,5,229,14,10,5,255,17,12,6,255,22,15,9,255,20,14,9,252,21, +-15,10,176,11,9,6,139,0,32,11,8,4,122,18,12,5,170,14,10,5, +-150,7,5,4,28,0,32,8,7,7,57,24,16,11,173,26,18,9,190,13, +-10,6,142,5,4,4,11,0,8,8,7,3,68,14,10,5,170,16,11,5, +-170,9,7,4,74,0,20,14,10,5,142,20,14,5,170,16,11,5,170,9, +-7,4,28,0,16,14,10,5,142,20,14,5,170,16,11,5,170,9,8,4, +-28,0,28,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0, +-28,14,10,5,142,18,13,5,170,16,12,5,170,18,13,5,173,14,10,5, +-227,14,10,5,255,14,10,5,252,12,9,5,255,12,9,5,255,16,11,5, +-255,20,13,5,201,11,9,4,28,0,12,12,10,5,136,16,12,5,170,16, +-11,5,170,16,11,5,193,21,15,6,184,14,10,5,31,0,32,8,6,3, +-139,54,30,9,255,107,50,12,255,78,39,11,255,9,7,4,161,0,12,20, +-13,5,142,18,12,5,210,16,11,5,170,16,11,5,170,16,11,5,170,9, +-7,4,28,0,64,13,10,8,57,9,7,6,159,8,6,5,159,10,8,7, +-130,10,8,7,119,9,7,6,133,9,7,6,167,10,8,7,170,11,9,8, +-113,0,44,5,4,2,28,8,6,3,125,14,10,5,170,18,13,5,176,14, +-10,5,238,14,10,5,255,16,11,5,235,18,13,5,173,16,11,5,170,16, +-12,5,170,16,11,5,164,9,7,4,28,0,12,14,10,5,136,16,12,5, +-170,16,11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5, +-249,16,12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5, +-5,4,28,8,6,3,125,14,10,5,170,18,13,5,176,14,10,5,238,14, +-10,5,255,14,10,5,249,16,11,5,193,16,11,5,170,9,7,4,150,7, +-5,4,57,0,16,5,5,4,28,8,6,3,125,14,10,5,170,18,13,5, +-176,14,10,5,238,14,10,5,255,14,10,5,235,18,13,5,173,16,11,5, +-170,16,12,5,170,16,11,5,170,9,7,4,28,0,12,5,5,4,28,8, +-6,3,125,14,10,5,170,18,13,5,176,14,10,5,235,14,10,5,255,14, +-10,5,255,16,11,5,255,20,13,5,207,12,9,5,34,0,28,14,10,5, +-142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,6,5,3,85,7, +-5,4,85,6,5,3,85,5,4,4,85,5,4,4,105,9,8,4,241,72, +-37,11,255,110,54,13,255,67,34,10,255,8,6,3,144,0,12,14,10,5, +-142,21,14,6,170,16,12,5,170,9,8,4,28,0,16,14,10,5,142,21, +-13,6,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6, +-170,16,11,5,170,9,7,4,28,0,12,7,5,2,37,8,6,3,142,8, +-6,3,227,25,15,6,255,75,36,10,255,99,51,12,255,66,33,9,255,8, +-6,3,130,0,12,14,10,5,139,21,13,6,170,16,11,5,170,9,7,4, +-28,0,12,8,6,3,79,14,10,5,170,18,13,5,170,12,9,5,142,0, +-16,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,12,12, +-9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,8,20,13,5, +-85,11,8,4,28,0,8,12,9,5,142,21,13,6,170,16,11,5,170,9, +-7,4,28,0,12,12,9,5,142,21,13,6,170,16,11,5,170,9,7,4, +-28,0,16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0, +-12,5,5,4,28,8,6,3,125,14,10,5,170,18,12,5,170,20,14,5, +-173,16,12,5,193,20,13,5,178,20,13,5,170,16,11,5,170,9,7,4, +-161,7,6,4,57,0,12,8,6,3,85,84,40,13,255,164,73,23,255,184, +-79,27,255,15,11,8,246,0,72,11,10,10,170,176,83,37,255,196,87,33, +-255,192,88,31,255,22,15,11,193,0,12,21,15,10,159,26,17,11,255,24, +-17,11,221,10,8,7,85,0,44,8,7,3,59,12,9,5,170,16,11,5, +-210,14,10,5,255,14,10,5,255,14,10,5,255,14,10,5,246,16,12,5, +-193,16,11,5,170,9,7,4,153,6,5,3,57,0,24,14,10,5,142,20, +-13,5,170,16,11,5,170,9,7,4,28,0,20,6,5,3,28,8,6,3, +-127,14,10,5,170,18,13,5,176,14,10,5,238,14,10,5,255,14,10,5, +-235,18,13,5,173,16,11,5,170,16,12,5,170,16,11,5,170,9,7,4, +-28,0,28,14,11,7,142,29,19,8,170,17,11,6,159,8,6,3,28,0, +-32,7,5,4,28,14,10,5,150,20,13,5,170,12,9,5,142,5,4,2, +-14,0,8,15,11,8,142,26,18,9,178,19,13,6,170,8,6,3,68,0, +-20,18,12,5,142,16,11,5,238,16,11,5,170,9,7,4,28,0,16,12, +-9,5,142,16,11,5,215,18,13,5,187,11,9,4,28,0,16,4,4,3, +-6,5,4,2,82,5,4,2,85,5,4,2,85,5,4,2,85,5,4,2, +-99,9,7,4,241,72,37,11,255,112,53,13,255,77,39,12,255,10,8,5, +-170,0,12,19,13,8,184,20,14,9,255,16,11,7,255,14,11,7,255,17, +-12,8,255,22,15,9,255,27,17,10,255,30,19,11,255,28,18,11,255,21, +-15,10,255,15,12,8,198,9,7,6,28,0,24,8,6,5,91,15,11,6, +-170,14,11,5,238,19,13,6,198,12,9,5,28,0,8,6,5,3,85,54, +-29,9,255,100,48,13,255,109,52,14,255,15,11,6,170,0,12,19,13,6, +-144,14,10,5,255,16,11,5,178,8,6,3,119,0,255,0,255,0,174,12, +-9,7,88,99,44,20,255,26,16,11,232,5,4,4,28,0,92,6,5,3, +-57,60,28,11,255,158,67,23,255,88,44,23,255,11,9,6,142,0,255,0, +-255,0,150,12,9,7,110,126,51,25,255,25,17,12,232,5,4,4,28,0, +-184,6,5,5,28,19,14,10,227,52,29,17,255,30,20,13,255,9,8,6, +-82,0,255,0,255,0,255,0,255,0,8,12,10,9,170,172,81,49,255,213, +-125,94,255,185,88,58,255,23,16,14,159,0,255,0,255,0,106,5,4,2, +-28,16,11,5,244,68,34,9,255,62,33,9,255,9,8,4,139,0,96,10, +-8,7,48,71,33,18,255,108,47,23,255,107,48,22,255,113,51,24,255,109, +-50,24,255,104,45,21,255,104,45,21,255,113,49,24,255,115,50,24,255,18, +-13,9,136,0,255,0,129,9,7,6,34,18,13,9,244,66,31,15,255,84, +-37,17,255,83,36,16,255,75,34,14,255,73,35,14,255,91,41,16,255,110, +-47,19,255,79,40,16,255,24,16,9,255,8,6,5,57,0,100,22,14,5, +-244,40,23,7,255,42,23,7,255,54,28,9,255,60,31,9,255,36,22,7, +-255,12,9,5,244,6,5,3,28,0,255,0,29,9,7,6,85,72,34,13, +-255,126,56,21,255,148,63,25,255,25,17,14,190,0,72,15,12,12,133,178, +-86,57,255,200,89,55,255,194,82,47,255,30,20,17,187,0,255,0,169,9, +-7,4,99,17,12,6,255,42,22,9,255,49,25,9,255,54,26,11,255,52, +-26,11,255,59,28,12,255,82,37,15,255,111,49,18,255,84,39,17,255,25, +-17,10,255,8,7,5,57,0,112,6,5,3,57,38,22,7,255,85,39,12, +-255,124,52,21,255,20,13,9,170,0,255,0,255,0,202,8,6,5,28,26, +-16,11,170,11,8,6,85,0,100,12,8,5,119,20,14,9,170,12,9,7, +-142,0,255,0,255,0,154,9,7,6,28,27,17,12,170,11,9,8,85,0, +-192,7,6,6,28,8,7,5,85,8,6,5,57,0,255,0,255,0,255,0, +-255,0,16,25,17,16,161,41,27,26,255,40,26,23,235,14,12,11,82,0, +-255,0,255,0,110,8,6,3,37,9,7,4,142,9,7,4,136,6,5,3, +-6,0,100,23,15,10,153,19,13,10,255,16,11,9,255,16,11,9,255,16, +-11,9,255,16,11,9,255,16,11,9,255,18,13,9,255,24,16,11,204,16, +-11,9,31,0,255,0,133,10,8,7,142,18,12,9,207,18,13,9,255,16, +-11,9,255,15,11,8,255,15,11,8,252,18,13,9,195,18,12,9,170,11, +-8,6,167,8,7,5,57,0,104,9,8,4,142,14,10,5,170,13,10,6, +-170,13,9,6,170,11,8,6,170,7,6,4,130,6,5,3,28,0,255,0, +-37,14,10,7,142,21,14,10,170,19,13,10,170,14,11,9,31,0,72,8, +-7,8,14,25,17,16,142,27,18,16,193,26,18,15,170,15,11,10,34,0, +-255,0,169,9,7,4,28,11,8,6,170,14,10,7,232,15,10,8,255,15, +-10,8,255,15,10,8,255,15,10,8,252,18,12,9,195,18,12,9,170,11, +-8,6,167,9,7,6,57,0,120,9,7,4,91,16,11,7,170,20,13,9, +-170,13,10,8,28,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +-255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +-255,0,255,0,255}}; +- /* Created by MiniCompress.. an iOS RLE compressor. +- * Compress Rate : 46.36 % +- */ +diff -Naur /home/d4rk/goom2k4-0/src/gfontrle.h /src/gfontrle.h +--- /home/d4rk/goom2k4-0/src/gfontrle.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/gfontrle.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,7 +0,0 @@ +-extern const struct { +- unsigned int width; +- unsigned int height; +- unsigned int bytes_per_pixel; +- unsigned int rle_size; +- unsigned char rle_pixel [49725]; +-} the_font ; +diff -Naur /home/d4rk/goom2k4-0/src/goom_config.h /src/goom_config.h +--- /home/d4rk/goom2k4-0/src/goom_config.h 2008-08-03 19:23:12.000000000 -0600 ++++ /src/goom_config.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,28 +0,0 @@ +-#if WORDS_BIGENDIAN +-#define COLOR_ARGB +-#else +-#define COLOR_BGRA +-#endif +- +-#if 1 +-/* ndef COLOR_BGRA */ +-/** position des composantes **/ +- #define BLEU 2 +- #define VERT 1 +- #define ROUGE 0 +- #define ALPHA 3 +-#else +- #define ROUGE 1 +- #define BLEU 3 +- #define VERT 2 +- #define ALPHA 0 +-#endif +- +-#ifndef guint32 +-#define guint8 unsigned char +-#define guin16 unsigned short +-#define guint32 unsigned int +-#define gint8 signed char +-#define gint16 signed short int +-#define gint32 signed int +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_config_param.h /src/goom_config_param.h +--- /home/d4rk/goom2k4-0/src/goom_config_param.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_config_param.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,115 +0,0 @@ +-#ifndef _CONFIG_PARAM_H +-#define _CONFIG_PARAM_H +- +-#include <stdlib.h> +- +-/** +- * File created on 2003-05-24 by Jeko. +- * (c)2003, JC Hoelt for iOS-software. +- * +- * LGPL Licence. +- */ +- +-typedef enum { +- PARAM_INTVAL, +- PARAM_FLOATVAL, +- PARAM_BOOLVAL, +- PARAM_STRVAL, +- PARAM_LISTVAL, +-} ParamType; +- +-struct IntVal { +- int value; +- int min; +- int max; +- int step; +-}; +-struct FloatVal { +- float value; +- float min; +- float max; +- float step; +-}; +-struct StrVal { +- char *value; +-}; +-struct ListVal { +- char *value; +- int nbChoices; +- char **choices; +-}; +-struct BoolVal { +- int value; +-}; +- +- +-typedef struct _PARAM { +- char *name; +- char *desc; +- char rw; +- ParamType type; +- union { +- struct IntVal ival; +- struct FloatVal fval; +- struct StrVal sval; +- struct ListVal slist; +- struct BoolVal bval; +- } param; +- +- /* used by the core to inform the GUI of a change */ +- void (*change_listener)(struct _PARAM *_this); +- +- /* used by the GUI to inform the core of a change */ +- void (*changed)(struct _PARAM *_this); +- +- void *user_data; /* can be used by the GUI */ +-} PluginParam; +- +-#define IVAL(p) ((p).param.ival.value) +-#define SVAL(p) ((p).param.sval.value) +-#define FVAL(p) ((p).param.fval.value) +-#define BVAL(p) ((p).param.bval.value) +-#define LVAL(p) ((p).param.slist.value) +- +-#define FMIN(p) ((p).param.fval.min) +-#define FMAX(p) ((p).param.fval.max) +-#define FSTEP(p) ((p).param.fval.step) +- +-#define IMIN(p) ((p).param.ival.min) +-#define IMAX(p) ((p).param.ival.max) +-#define ISTEP(p) ((p).param.ival.step) +- +-PluginParam goom_secure_param(void); +- +-PluginParam goom_secure_f_param(char *name); +-PluginParam goom_secure_i_param(char *name); +-PluginParam goom_secure_b_param(char *name, int value); +-PluginParam goom_secure_s_param(char *name); +- +-PluginParam goom_secure_f_feedback(char *name); +-PluginParam goom_secure_i_feedback(char *name); +- +-void goom_set_str_param_value(PluginParam *p, const char *str); +-void goom_set_list_param_value(PluginParam *p, const char *str); +- +-typedef struct _PARAMETERS { +- char *name; +- char *desc; +- int nbParams; +- PluginParam **params; +-} PluginParameters; +- +-PluginParameters goom_plugin_parameters(const char *name, int nb); +- +-#define secure_param goom_secure_param +-#define secure_f_param goom_secure_f_param +-#define secure_i_param goom_secure_i_param +-#define secure_b_param goom_secure_b_param +-#define secure_s_param goom_secure_s_param +-#define secure_f_feedback goom_secure_f_feedback +-#define secure_i_feedback goom_secure_i_feedback +-#define set_list_param_value goom_set_list_param_value +-#define set_str_param_value goom_set_str_param_value +-#define plugin_parameters goom_plugin_parameters +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_core.c /src/goom_core.c +--- /home/d4rk/goom2k4-0/src/goom_core.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_core.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,886 +0,0 @@ +-/** +-* file: goom_core.c +- * author: Jean-Christophe Hoelt (which is not so proud of it) +- * +- * Contains the core of goom's work. +- * +- * (c)2000-2003, by iOS-software. +- */ +- +-#include <math.h> +-#include <stdio.h> +-#include <stdlib.h> +-#include <string.h> +-#include <inttypes.h> +- +-#include "goom.h" +-#include "goom_tools.h" +-#include "goom_filters.h" +-#include "lines.h" +-#include "ifs.h" +-#include "tentacle3d.h" +-#include "gfontlib.h" +- +-#include "sound_tester.h" +-#include "goom_plugin_info.h" +-#include "goom_fx.h" +-#include "goomsl.h" +- +-/* #define VERBOSE */ +- +-#define STOP_SPEED 128 +-/* TODO: put that as variable in PluginInfo */ +-#define TIME_BTW_CHG 300 +- +-static void choose_a_goom_line (PluginInfo *goomInfo, float *param1, float *param2, int *couleur, +- int *mode, float *amplitude, int far); +- +-static void update_message (PluginInfo *goomInfo, char *message); +- +-static void init_buffers(PluginInfo *goomInfo, int buffsize) +-{ +- goomInfo->pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); +- bzero (goomInfo->pixel, buffsize * sizeof (guint32) + 128); +- goomInfo->back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); +- bzero (goomInfo->back, buffsize * sizeof (guint32) + 128); +- goomInfo->conv = (Pixel *) malloc (buffsize * sizeof (guint32) + 128); +- bzero (goomInfo->conv, buffsize * sizeof (guint32) + 128); +- +- goomInfo->outputBuf = goomInfo->conv; +- +- goomInfo->p1 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->pixel)) / 128) * 128); +- goomInfo->p2 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->back)) / 128) * 128); +-} +- +-/************************** +-* INIT * +-**************************/ +-PluginInfo *goom_init (guint32 resx, guint32 resy) +-{ +- PluginInfo *goomInfo = (PluginInfo*)malloc(sizeof(PluginInfo)); +- +-#ifdef VERBOSE +- printf ("GOOM: init (%d, %d);\n", resx, resy); +-#endif +- +- plugin_info_init(goomInfo,4); +- +- goomInfo->star_fx = flying_star_create(); +- goomInfo->star_fx.init(&goomInfo->star_fx, goomInfo); +- +- goomInfo->zoomFilter_fx = zoomFilterVisualFXWrapper_create (); +- goomInfo->zoomFilter_fx.init(&goomInfo->zoomFilter_fx, goomInfo); +- +- goomInfo->tentacles_fx = tentacle_fx_create(); +- goomInfo->tentacles_fx.init(&goomInfo->tentacles_fx, goomInfo); +- +- goomInfo->convolve_fx = convolve_create(); +- goomInfo->convolve_fx.init(&goomInfo->convolve_fx, goomInfo); +- +- plugin_info_add_visual (goomInfo, 0, &goomInfo->zoomFilter_fx); +- plugin_info_add_visual (goomInfo, 1, &goomInfo->tentacles_fx); +- plugin_info_add_visual (goomInfo, 2, &goomInfo->star_fx); +- plugin_info_add_visual (goomInfo, 3, &goomInfo->convolve_fx); +- +- goomInfo->screen.width = resx; +- goomInfo->screen.height = resy; +- goomInfo->screen.size = resx * resy; +- +- init_buffers(goomInfo, goomInfo->screen.size); +- goomInfo->gRandom = goom_random_init((uintptr_t)goomInfo->pixel); +- +- goomInfo->cycle = 0; +- +- goomInfo->ifs_fx = ifs_visualfx_create(); +- goomInfo->ifs_fx.init(&goomInfo->ifs_fx, goomInfo); +- +- goomInfo->gmline1 = goom_lines_init (goomInfo, resx, goomInfo->screen.height, +- GML_HLINE, goomInfo->screen.height, GML_BLACK, +- GML_CIRCLE, 0.4f * (float) goomInfo->screen.height, GML_VERT); +- goomInfo->gmline2 = goom_lines_init (goomInfo, resx, goomInfo->screen.height, +- GML_HLINE, 0, GML_BLACK, +- GML_CIRCLE, 0.2f * (float) goomInfo->screen.height, GML_RED); +- +- gfont_load (); +- +- /* goom_set_main_script(goomInfo, goomInfo->main_script_str); */ +- +- return goomInfo; +-} +- +- +- +-void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy) +-{ +- free (goomInfo->pixel); +- free (goomInfo->back); +- free (goomInfo->conv); +- +- goomInfo->screen.width = resx; +- goomInfo->screen.height = resy; +- goomInfo->screen.size = resx * resy; +- +- init_buffers(goomInfo, goomInfo->screen.size); +- +- /* init_ifs (goomInfo, resx, goomInfo->screen.height); */ +- goomInfo->ifs_fx.free(&goomInfo->ifs_fx); +- goomInfo->ifs_fx.init(&goomInfo->ifs_fx, goomInfo); +- +- goom_lines_set_res (goomInfo->gmline1, resx, goomInfo->screen.height); +- goom_lines_set_res (goomInfo->gmline2, resx, goomInfo->screen.height); +-} +- +-int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer) +-{ +- goomInfo->outputBuf = (Pixel*)buffer; +- return 1; +-} +- +-/******************************************** +-* UPDATE * +-******************************************** +- +-* WARNING: this is a 600 lines function ! (21-11-2003) +-*/ +-guint32 *goom_update (PluginInfo *goomInfo, gint16 data[2][512], +- int forceMode, float fps, char *songTitle, char *message) +-{ +- Pixel *return_val; +- guint32 pointWidth; +- guint32 pointHeight; +- int i; +- float largfactor; /* elargissement de l'intervalle d'évolution des points */ +- Pixel *tmp; +- +- ZoomFilterData *pzfd; +- +- /* test if the config has changed, update it if so */ +- pointWidth = (goomInfo->screen.width * 2) / 5; +- pointHeight = ((goomInfo->screen.height) * 2) / 5; +- +- /* ! etude du signal ... */ +- evaluate_sound (data, &(goomInfo->sound)); +- +- /* goom_execute_main_script(goomInfo); */ +- +- /* ! calcul du deplacement des petits points ... */ +- largfactor = goomInfo->sound.speedvar / 150.0f + goomInfo->sound.volume / 1.5f; +- +- if (largfactor > 1.5f) +- largfactor = 1.5f; +- +- goomInfo->update.decay_ifs--; +- if (goomInfo->update.decay_ifs > 0) +- goomInfo->update.ifs_incr += 2; +- if (goomInfo->update.decay_ifs == 0) +- goomInfo->update.ifs_incr = 0; +- +- if (goomInfo->update.recay_ifs) { +- goomInfo->update.ifs_incr -= 2; +- goomInfo->update.recay_ifs--; +- if ((goomInfo->update.recay_ifs == 0)&&(goomInfo->update.ifs_incr<=0)) +- goomInfo->update.ifs_incr = 1; +- } +- +- if (goomInfo->update.ifs_incr > 0) +- goomInfo->ifs_fx.apply(&goomInfo->ifs_fx, goomInfo->p2, goomInfo->p1, goomInfo); +- +- if (goomInfo->curGState->drawPoints) { +- for (i = 1; i * 15 <= goomInfo->sound.speedvar*80.0f + 15; i++) { +- goomInfo->update.loopvar += goomInfo->sound.speedvar*50 + 1; +- +- pointFilter (goomInfo, goomInfo->p1, +- YELLOW, +- ((pointWidth - 6.0f) * largfactor + 5.0f), +- ((pointHeight - 6.0f) * largfactor + 5.0f), +- i * 152.0f, 128.0f, goomInfo->update.loopvar + i * 2032); +- pointFilter (goomInfo, goomInfo->p1, ORANGE, +- ((pointWidth / 2) * largfactor) / i + 10.0f * i, +- ((pointHeight / 2) * largfactor) / i + 10.0f * i, +- 96.0f, i * 80.0f, goomInfo->update.loopvar / i); +- pointFilter (goomInfo, goomInfo->p1, VIOLET, +- ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, +- ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, +- i + 122.0f, 134.0f, goomInfo->update.loopvar / i); +- pointFilter (goomInfo, goomInfo->p1, BLACK, +- ((pointHeight / 3) * largfactor + 20.0f), +- ((pointHeight / 3) * largfactor + 20.0f), +- 58.0f, i * 66.0f, goomInfo->update.loopvar / i); +- pointFilter (goomInfo, goomInfo->p1, WHITE, +- (pointHeight * largfactor + 10.0f * i) / i, +- (pointHeight * largfactor + 10.0f * i) / i, +- 66.0f, 74.0f, goomInfo->update.loopvar + i * 500); +- } +- } +- +- /* par défaut pas de changement de zoom */ +- pzfd = NULL; +- +- /* +- * Test forceMode +- */ +-#ifdef VERBOSE +- if (forceMode != 0) { +- printf ("forcemode = %d\n", forceMode); +- } +-#endif +- +- +- /* diminuer de 1 le temps de lockage */ +- /* note pour ceux qui n'ont pas suivis : le lockvar permet d'empecher un */ +- /* changement d'etat du plugin juste apres un autre changement d'etat. oki */ +- if (--goomInfo->update.lockvar < 0) +- goomInfo->update.lockvar = 0; +- +- /* on verifie qu'il ne se pas un truc interressant avec le son. */ +- if ((goomInfo->sound.timeSinceLastGoom == 0) +- || (forceMode > 0) +- || (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG)) { +- +- /* changement eventuel de mode */ +- if (goom_irand(goomInfo->gRandom,16) == 0) +- switch (goom_irand(goomInfo->gRandom,34)) { +- case 0: +- case 10: +- goomInfo->update.zoomFilterData.hypercosEffect = goom_irand(goomInfo->gRandom,2); +- case 13: +- case 20: +- case 21: +- goomInfo->update.zoomFilterData.mode = WAVE_MODE; +- goomInfo->update.zoomFilterData.reverse = 0; +- goomInfo->update.zoomFilterData.waveEffect = (goom_irand(goomInfo->gRandom,3) == 0); +- if (goom_irand(goomInfo->gRandom,2)) +- goomInfo->update.zoomFilterData.vitesse = (goomInfo->update.zoomFilterData.vitesse + 127) >> 1; +- break; +- case 1: +- case 11: +- goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = 0; +- break; +- case 2: +- case 12: +- goomInfo->update.zoomFilterData.mode = AMULETTE_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = 0; +- break; +- case 3: +- goomInfo->update.zoomFilterData.mode = WATER_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = 0; +- break; +- case 4: +- case 14: +- goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = 0; +- break; +- case 5: +- case 15: +- case 22: +- goomInfo->update.zoomFilterData.mode = HYPERCOS1_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = (goom_irand(goomInfo->gRandom,3) == 0); +- break; +- case 6: +- case 16: +- goomInfo->update.zoomFilterData.mode = HYPERCOS2_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = 0; +- break; +- case 7: +- case 17: +- goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE; +- goomInfo->update.zoomFilterData.waveEffect = (goom_irand(goomInfo->gRandom,4) == 0); +- goomInfo->update.zoomFilterData.hypercosEffect = goom_irand(goomInfo->gRandom,2); +- break; +- case 8: +- case 18: +- case 19: +- goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 1; +- goomInfo->update.zoomFilterData.hypercosEffect = 1; +- break; +- case 29: +- case 30: +- goomInfo->update.zoomFilterData.mode = YONLY_MODE; +- break; +- case 31: +- case 32: +- case 33: +- goomInfo->update.zoomFilterData.mode = SPEEDWAY_MODE; +- break; +- default: +- goomInfo->update.zoomFilterData.mode = NORMAL_MODE; +- goomInfo->update.zoomFilterData.waveEffect = 0; +- goomInfo->update.zoomFilterData.hypercosEffect = 0; +- } +- } +- +- /* tout ceci ne sera fait qu'en cas de non-blocage */ +- if (goomInfo->update.lockvar == 0) { +- /* reperage de goom (acceleration forte de l'acceleration du volume) */ +- /* -> coup de boost de la vitesse si besoin.. */ +- if (goomInfo->sound.timeSinceLastGoom == 0) { +- +- int i; +- goomInfo->update.goomvar++; +- +- /* SELECTION OF THE GOOM STATE */ +- if ((!goomInfo->update.stateSelectionBlocker)&&(goom_irand(goomInfo->gRandom,3))) { +- goomInfo->update.stateSelectionRnd = goom_irand(goomInfo->gRandom,goomInfo->statesRangeMax); +- goomInfo->update.stateSelectionBlocker = 3; +- } +- else if (goomInfo->update.stateSelectionBlocker) goomInfo->update.stateSelectionBlocker--; +- +- for (i=0;i<goomInfo->statesNumber;i++) +- if ((goomInfo->update.stateSelectionRnd >= goomInfo->states[i].rangemin) +- && (goomInfo->update.stateSelectionRnd <= goomInfo->states[i].rangemax)) +- goomInfo->curGState = &(goomInfo->states[i]); +- +- if ((goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr<=0)) { +- goomInfo->update.recay_ifs = 5; +- goomInfo->update.ifs_incr = 11; +- } +- +- if ((!goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr>0) && (goomInfo->update.decay_ifs<=0)) +- goomInfo->update.decay_ifs = 100; +- +- if (!goomInfo->curGState->drawScope) +- goomInfo->update.stop_lines = 0xf000 & 5; +- +- if (!goomInfo->curGState->drawScope) { +- goomInfo->update.stop_lines = 0; +- goomInfo->update.lineMode = goomInfo->update.drawLinesDuration; +- } +- +- /* if (goomInfo->update.goomvar % 1 == 0) */ +- { +- guint32 vtmp; +- guint32 newvit; +- +- goomInfo->update.lockvar = 50; +- newvit = STOP_SPEED + 1 - ((float)3.5f * log10(goomInfo->sound.speedvar * 60 + 1)); +- /* retablir le zoom avant.. */ +- if ((goomInfo->update.zoomFilterData.reverse) && (!(goomInfo->cycle % 13)) && (rand () % 5 == 0)) { +- goomInfo->update.zoomFilterData.reverse = 0; +- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 2; +- goomInfo->update.lockvar = 75; +- } +- if (goom_irand(goomInfo->gRandom,10) == 0) { +- goomInfo->update.zoomFilterData.reverse = 1; +- goomInfo->update.lockvar = 100; +- } +- +- if (goom_irand(goomInfo->gRandom,10) == 0) +- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1; +- if (goom_irand(goomInfo->gRandom,12) == 0) +- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED + 1; +- +- /* changement de milieu.. */ +- switch (goom_irand(goomInfo->gRandom,25)) { +- case 0: +- case 3: +- case 6: +- goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height - 1; +- goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; +- break; +- case 1: +- case 4: +- goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width - 1; +- break; +- case 2: +- case 5: +- goomInfo->update.zoomFilterData.middleX = 1; +- break; +- default: +- goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2; +- goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; +- } +- +- if ((goomInfo->update.zoomFilterData.mode == WATER_MODE) +- || (goomInfo->update.zoomFilterData.mode == YONLY_MODE) +- || (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE)) { +- goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; +- goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2; +- } +- +- switch (vtmp = (goom_irand(goomInfo->gRandom,15))) { +- case 0: +- goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,3) +- - goom_irand(goomInfo->gRandom,3); +- goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,3) +- - goom_irand(goomInfo->gRandom,3); +- break; +- case 3: +- goomInfo->update.zoomFilterData.vPlaneEffect = 0; +- goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,8) +- - goom_irand(goomInfo->gRandom,8); +- break; +- case 4: +- case 5: +- case 6: +- case 7: +- goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,5) +- - goom_irand(goomInfo->gRandom,5); +- goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.vPlaneEffect; +- break; +- case 8: +- goomInfo->update.zoomFilterData.hPlaneEffect = 5 + goom_irand(goomInfo->gRandom,8); +- goomInfo->update.zoomFilterData.vPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect; +- break; +- case 9: +- goomInfo->update.zoomFilterData.vPlaneEffect = 5 + goom_irand(goomInfo->gRandom,8); +- goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect; +- break; +- case 13: +- goomInfo->update.zoomFilterData.hPlaneEffect = 0; +- goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,10) +- - goom_irand(goomInfo->gRandom,10); +- break; +- case 14: +- goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,10) +- - goom_irand(goomInfo->gRandom,10); +- goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,10) +- - goom_irand(goomInfo->gRandom,10); +- break; +- default: +- if (vtmp < 10) { +- goomInfo->update.zoomFilterData.vPlaneEffect = 0; +- goomInfo->update.zoomFilterData.hPlaneEffect = 0; +- } +- } +- +- if (goom_irand(goomInfo->gRandom,5) != 0) +- goomInfo->update.zoomFilterData.noisify = 0; +- else { +- goomInfo->update.zoomFilterData.noisify = goom_irand(goomInfo->gRandom,2) + 1; +- goomInfo->update.lockvar *= 2; +- } +- +- if (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE) { +- goomInfo->update.zoomFilterData.vPlaneEffect = 0; +- goomInfo->update.zoomFilterData.hPlaneEffect = 0; +- goomInfo->update.zoomFilterData.noisify = 0; +- } +- +- if ((goomInfo->update.zoomFilterData.middleX == 1) || (goomInfo->update.zoomFilterData.middleX == (signed int)goomInfo->screen.width - 1)) { +- goomInfo->update.zoomFilterData.vPlaneEffect = 0; +- if (goom_irand(goomInfo->gRandom,2)) +- goomInfo->update.zoomFilterData.hPlaneEffect = 0; +- } +- +- if ((signed int)newvit < goomInfo->update.zoomFilterData.vitesse) /* on accelere */ +- { +- pzfd = &goomInfo->update.zoomFilterData; +- if (((newvit < STOP_SPEED - 7) && +- (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 6) && +- (goomInfo->cycle % 3 == 0)) || (goom_irand(goomInfo->gRandom,40) == 0)) { +- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - goom_irand(goomInfo->gRandom,2) +- + goom_irand(goomInfo->gRandom,2); +- goomInfo->update.zoomFilterData.reverse = !goomInfo->update.zoomFilterData.reverse; +- } +- else { +- goomInfo->update.zoomFilterData.vitesse = (newvit + goomInfo->update.zoomFilterData.vitesse * 7) / 8; +- } +- goomInfo->update.lockvar += 50; +- } +- } +- +- if (goomInfo->update.lockvar > 150) { +- goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; +- goomInfo->update.switchMult = 1.0f; +- } +- } +- /* mode mega-lent */ +- if (goom_irand(goomInfo->gRandom,700) == 0) { +- /* +- * printf ("coup du sort...\n") ; +- */ +- pzfd = &goomInfo->update.zoomFilterData; +- goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1; +- goomInfo->update.zoomFilterData.pertedec = 8; +- goomInfo->update.zoomFilterData.sqrtperte = 16; +- goomInfo->update.goomvar = 1; +- goomInfo->update.lockvar += 50; +- goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; +- goomInfo->update.switchMult = 1.0f; +- } +- } +- +- /* +- * gros frein si la musique est calme +- */ +- if ((goomInfo->sound.speedvar < 0.01f) +- && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 4) +- && (goomInfo->cycle % 16 == 0)) { +- pzfd = &goomInfo->update.zoomFilterData; +- goomInfo->update.zoomFilterData.vitesse += 3; +- goomInfo->update.zoomFilterData.pertedec = 8; +- goomInfo->update.zoomFilterData.sqrtperte = 16; +- goomInfo->update.goomvar = 0; +- } +- +- /* +- * baisser regulierement la vitesse... +- */ +- if ((goomInfo->cycle % 73 == 0) && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 5)) { +- pzfd = &goomInfo->update.zoomFilterData; +- goomInfo->update.zoomFilterData.vitesse++; +- } +- +- /* +- * arreter de decrémenter au bout d'un certain temps +- */ +- if ((goomInfo->cycle % 101 == 0) && (goomInfo->update.zoomFilterData.pertedec == 7)) { +- pzfd = &goomInfo->update.zoomFilterData; +- goomInfo->update.zoomFilterData.pertedec = 8; +- goomInfo->update.zoomFilterData.sqrtperte = 16; +- } +- +- /* +- * Permet de forcer un effet. +- */ +- if ((forceMode > 0) && (forceMode <= NB_FX)) { +- pzfd = &goomInfo->update.zoomFilterData; +- pzfd->mode = forceMode - 1; +- } +- +- if (forceMode == -1) { +- pzfd = NULL; +- } +- +- /* +- * Changement d'effet de zoom ! +- */ +- if (pzfd != NULL) { +- int dif; +- +- goomInfo->update.cyclesSinceLastChange = 0; +- +- goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; +- +- dif = goomInfo->update.zoomFilterData.vitesse - goomInfo->update.previousZoomSpeed; +- if (dif < 0) +- dif = -dif; +- +- if (dif > 2) { +- goomInfo->update.switchIncr *= (dif + 2) / 2; +- } +- goomInfo->update.previousZoomSpeed = goomInfo->update.zoomFilterData.vitesse; +- goomInfo->update.switchMult = 1.0f; +- +- if (((goomInfo->sound.timeSinceLastGoom == 0) +- && (goomInfo->sound.totalgoom < 2)) || (forceMode > 0)) { +- goomInfo->update.switchIncr = 0; +- goomInfo->update.switchMult = goomInfo->update.switchMultAmount; +- } +- } +- else { +- if (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG) { +- pzfd = &goomInfo->update.zoomFilterData; +- goomInfo->update.cyclesSinceLastChange = 0; +- } +- else +- goomInfo->update.cyclesSinceLastChange++; +- } +- +-#ifdef VERBOSE +- if (pzfd) { +- printf ("GOOM: pzfd->mode = %d\n", pzfd->mode); +- } +-#endif +- +- /* Zoom here ! */ +- zoomFilterFastRGB (goomInfo, goomInfo->p1, goomInfo->p2, pzfd, goomInfo->screen.width, goomInfo->screen.height, +- goomInfo->update.switchIncr, goomInfo->update.switchMult); +- +- /* +- * Affichage tentacule +- */ +- +- goomInfo->tentacles_fx.apply(&goomInfo->tentacles_fx, goomInfo->p1, goomInfo->p2, goomInfo); +- goomInfo->star_fx.apply (&goomInfo->star_fx,goomInfo->p2,goomInfo->p1,goomInfo); +- +- /* +- * Affichage de texte +- */ +- { +- /*char title[1024];*/ +- char text[64]; +- +- /* +- * Le message +- */ +- update_message (goomInfo, message); +- +- if (fps > 0) { +- sprintf (text, "%2.0f fps", fps); +- goom_draw_text (goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, +- 10, 24, text, 1, 0); +- } +- +- /* +- * Le titre +- */ +- if (songTitle != NULL) { +- strncpy (goomInfo->update.titleText, songTitle, 1023); +- goomInfo->update.titleText[1023]=0; +- goomInfo->update.timeOfTitleDisplay = 200; +- } +- +- if (goomInfo->update.timeOfTitleDisplay) { +- goom_draw_text (goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, +- goomInfo->screen.width / 2, goomInfo->screen.height / 2 + 7, goomInfo->update.titleText, +- ((float) (190 - goomInfo->update.timeOfTitleDisplay) / 10.0f), 1); +- goomInfo->update.timeOfTitleDisplay--; +- if (goomInfo->update.timeOfTitleDisplay < 4) +- goom_draw_text (goomInfo->p2,goomInfo->screen.width,goomInfo->screen.height, +- goomInfo->screen.width / 2, goomInfo->screen.height / 2 + 7, goomInfo->update.titleText, +- ((float) (190 - goomInfo->update.timeOfTitleDisplay) / 10.0f), 1); +- } +- } +- +- /* +- * Gestion du Scope +- */ +- +- /* +- * arret demande +- */ +- if ((goomInfo->update.stop_lines & 0xf000)||(!goomInfo->curGState->drawScope)) { +- float param1, param2, amplitude; +- int couleur; +- int mode; +- +- choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur, &mode, &litude,1); +- couleur = GML_BLACK; +- +- goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur); +- goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur); +- goomInfo->update.stop_lines &= 0x0fff; +- } +- +- /* +- * arret aleatore.. changement de mode de ligne.. +- */ +- if (goomInfo->update.lineMode != goomInfo->update.drawLinesDuration) { +- goomInfo->update.lineMode--; +- if (goomInfo->update.lineMode == -1) +- goomInfo->update.lineMode = 0; +- } +- else +- if ((goomInfo->cycle%80==0)&&(goom_irand(goomInfo->gRandom,5)==0)&&goomInfo->update.lineMode) +- goomInfo->update.lineMode--; +- +- if ((goomInfo->cycle % 120 == 0) +- && (goom_irand(goomInfo->gRandom,4) == 0) +- && (goomInfo->curGState->drawScope)) { +- if (goomInfo->update.lineMode == 0) +- goomInfo->update.lineMode = goomInfo->update.drawLinesDuration; +- else if (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration) { +- float param1, param2, amplitude; +- int couleur1,couleur2; +- int mode; +- +- goomInfo->update.lineMode--; +- choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur1, +- &mode, &litude,goomInfo->update.stop_lines); +- +- couleur2 = 5-couleur1; +- if (goomInfo->update.stop_lines) { +- goomInfo->update.stop_lines--; +- if (goom_irand(goomInfo->gRandom,2)) +- couleur2=couleur1 = GML_BLACK; +- } +- +- goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1); +- goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2); +- } +- } +- +- /* +- * si on est dans un goom : afficher les lignes... +- */ +- if ((goomInfo->update.lineMode != 0) || (goomInfo->sound.timeSinceLastGoom < 5)) { +- goomInfo->gmline2->power = goomInfo->gmline1->power; +- +- goom_lines_draw (goomInfo, goomInfo->gmline1, data[0], goomInfo->p2); +- goom_lines_draw (goomInfo, goomInfo->gmline2, data[1], goomInfo->p2); +- +- if (((goomInfo->cycle % 121) == 9) && (goom_irand(goomInfo->gRandom,3) == 1) +- && ((goomInfo->update.lineMode == 0) || (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration))) { +- float param1, param2, amplitude; +- int couleur1,couleur2; +- int mode; +- +- choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur1, +- &mode, &litude, goomInfo->update.stop_lines); +- couleur2 = 5-couleur1; +- +- if (goomInfo->update.stop_lines) { +- goomInfo->update.stop_lines--; +- if (goom_irand(goomInfo->gRandom,2)) +- couleur2=couleur1 = GML_BLACK; +- } +- goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1); +- goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2); +- } +- } +- +- return_val = goomInfo->p1; +- tmp = goomInfo->p1; +- goomInfo->p1 = goomInfo->p2; +- goomInfo->p2 = tmp; +- +- /* affichage et swappage des buffers.. */ +- goomInfo->cycle++; +- +- goomInfo->convolve_fx.apply(&goomInfo->convolve_fx,return_val,goomInfo->outputBuf,goomInfo); +- +- return (guint32*)goomInfo->outputBuf; +-} +- +-/**************************************** +-* CLOSE * +-****************************************/ +-void goom_close (PluginInfo *goomInfo) +-{ +- if (goomInfo->pixel != NULL) +- free (goomInfo->pixel); +- if (goomInfo->back != NULL) +- free (goomInfo->back); +- if (goomInfo->conv != NULL) +- free (goomInfo->conv); +- +- goomInfo->pixel = goomInfo->back = NULL; +- goomInfo->conv = NULL; +- goom_random_free(goomInfo->gRandom); +- goom_lines_free (&goomInfo->gmline1); +- goom_lines_free (&goomInfo->gmline2); +- +- /* release_ifs (); */ +- goomInfo->ifs_fx.free(&goomInfo->ifs_fx); +- goomInfo->convolve_fx.free(&goomInfo->convolve_fx); +- goomInfo->star_fx.free(&goomInfo->star_fx); +- goomInfo->tentacles_fx.free(&goomInfo->tentacles_fx); +- goomInfo->zoomFilter_fx.free(&goomInfo->zoomFilter_fx); +- +- free(goomInfo); +-} +- +- +-/* *** */ +-void +-choose_a_goom_line (PluginInfo *goomInfo, float *param1, float *param2, int *couleur, int *mode, +- float *amplitude, int far) +-{ +- *mode = goom_irand(goomInfo->gRandom,3); +- *amplitude = 1.0f; +- switch (*mode) { +- case GML_CIRCLE: +- if (far) { +- *param1 = *param2 = 0.47f; +- *amplitude = 0.8f; +- break; +- } +- if (goom_irand(goomInfo->gRandom,3) == 0) { +- *param1 = *param2 = 0; +- *amplitude = 3.0f; +- } +- else if (goom_irand(goomInfo->gRandom,2)) { +- *param1 = 0.40f * goomInfo->screen.height; +- *param2 = 0.22f * goomInfo->screen.height; +- } +- else { +- *param1 = *param2 = goomInfo->screen.height * 0.35; +- } +- break; +- case GML_HLINE: +- if (goom_irand(goomInfo->gRandom,4) || far) { +- *param1 = goomInfo->screen.height / 7; +- *param2 = 6.0f * goomInfo->screen.height / 7.0f; +- } +- else { +- *param1 = *param2 = goomInfo->screen.height / 2.0f; +- *amplitude = 2.0f; +- } +- break; +- case GML_VLINE: +- if (goom_irand(goomInfo->gRandom,3) || far) { +- *param1 = goomInfo->screen.width / 7.0f; +- *param2 = 6.0f * goomInfo->screen.width / 7.0f; +- } +- else { +- *param1 = *param2 = goomInfo->screen.width / 2.0f; +- *amplitude = 1.5f; +- } +- break; +- } +- +- *couleur = goom_irand(goomInfo->gRandom,6); +-} +- +-#define ECART_VARIATION 1.5 +-#define POS_VARIATION 3.0 +-#define SCROLLING_SPEED 80 +- +-/* +- * Met a jour l'affichage du message defilant +- */ +-void update_message (PluginInfo *goomInfo, char *message) { +- +- int fin = 0; +- +- if (message) { +- int i=1,j=0; +- sprintf (goomInfo->update_message.message, message); +- for (j=0;goomInfo->update_message.message[j];j++) +- if (goomInfo->update_message.message[j]=='\n') +- i++; +- goomInfo->update_message.numberOfLinesInMessage = i; +- goomInfo->update_message.affiche = goomInfo->screen.height + goomInfo->update_message.numberOfLinesInMessage * 25 + 105; +- goomInfo->update_message.longueur = strlen(goomInfo->update_message.message); +- } +- if (goomInfo->update_message.affiche) { +- int i = 0; +- char *msg = malloc(goomInfo->update_message.longueur + 1); +- char *ptr = msg; +- int pos; +- float ecart; +- message = msg; +- sprintf (msg, goomInfo->update_message.message); +- +- while (!fin) { +- while (1) { +- if (*ptr == 0) { +- fin = 1; +- break; +- } +- if (*ptr == '\n') { +- *ptr = 0; +- break; +- } +- ++ptr; +- } +- pos = goomInfo->update_message.affiche - (goomInfo->update_message.numberOfLinesInMessage - i)*25; +- pos += POS_VARIATION * (cos((double)pos / 20.0)); +- pos -= SCROLLING_SPEED; +- ecart = (ECART_VARIATION * sin((double)pos / 20.0)); +- if ((fin) && (2 * pos < (int)goomInfo->screen.height)) +- pos = (int)goomInfo->screen.height / 2; +- pos += 7; +- +- goom_draw_text(goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, +- goomInfo->screen.width/2, pos, +- message, +- ecart, +- 1); +- message = ++ptr; +- i++; +- } +- goomInfo->update_message.affiche --; +- free (msg); +- } +-} +- +diff -Naur /home/d4rk/goom2k4-0/src/goom_filters.h /src/goom_filters.h +--- /home/d4rk/goom2k4-0/src/goom_filters.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_filters.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,52 +0,0 @@ +-#ifndef FILTERS_H +-#define FILTERS_H +- +-#include "goom_config.h" +-#include "goom_typedefs.h" +-#include "goom_visual_fx.h" +-#include "goom_graphic.h" +- +-VisualFX zoomFilterVisualFXWrapper_create(void); +- +-struct _ZOOM_FILTER_DATA +-{ +- int vitesse; /* 128 = vitesse nule... * * 256 = en arriere +- * hyper vite.. * * 0 = en avant hype vite. */ +- unsigned char pertedec; +- unsigned char sqrtperte; +- int middleX, middleY; /* milieu de l'effet */ +- char reverse; /* inverse la vitesse */ +- char mode; /* type d'effet à appliquer (cf les #define) */ +- /** @since June 2001 */ +- int hPlaneEffect; /* deviation horitontale */ +- int vPlaneEffect; /* deviation verticale */ +- /** @since April 2002 */ +- int waveEffect; /* applique une "surcouche" de wave effect */ +- int hypercosEffect; /* applique une "surcouche de hypercos effect */ +- +- char noisify; /* ajoute un bruit a la transformation */ +-}; +- +-#define NORMAL_MODE 0 +-#define WAVE_MODE 1 +-#define CRYSTAL_BALL_MODE 2 +-#define SCRUNCH_MODE 3 +-#define AMULETTE_MODE 4 +-#define WATER_MODE 5 +-#define HYPERCOS1_MODE 6 +-#define HYPERCOS2_MODE 7 +-#define YONLY_MODE 8 +-#define SPEEDWAY_MODE 9 +- +-void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c, +- float t1, float t2, float t3, float t4, guint32 cycle); +- +-/* filtre de zoom : +- * le contenu de pix1 est copie dans pix2. +- * zf : si non NULL, configure l'effet. +- * resx,resy : taille des buffers. +- */ +-void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, guint32 resx, +- guint32 resy, int switchIncr, float switchMult); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_fx.h /src/goom_fx.h +--- /home/d4rk/goom2k4-0/src/goom_fx.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_fx.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,12 +0,0 @@ +-#ifndef _GOOM_FX_H +-#define _GOOM_FX_H +- +-#include "goom_visual_fx.h" +-#include "goom_plugin_info.h" +- +-VisualFX convolve_create (); +-VisualFX flying_star_create (void); +- +-void zoom_filter_c(int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_graphic.h /src/goom_graphic.h +--- /home/d4rk/goom2k4-0/src/goom_graphic.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_graphic.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,74 +0,0 @@ +-#ifndef GRAPHIC_H +-#define GRAPHIC_H +- +-typedef unsigned int Uint; +- +-typedef struct +-{ +- unsigned short r, v, b; +-} +-Color; +- +-extern const Color BLACK; +-extern const Color WHITE; +-extern const Color RED; +-extern const Color BLUE; +-extern const Color GREEN; +-extern const Color YELLOW; +-extern const Color ORANGE; +-extern const Color VIOLET; +- +- +-#ifdef COLOR_BGRA +- +-#define B_CHANNEL 0xFF000000 +-#define G_CHANNEL 0x00FF0000 +-#define R_CHANNEL 0x0000FF00 +-#define A_CHANNEL 0x000000FF +-#define B_OFFSET 24 +-#define G_OFFSET 16 +-#define R_OFFSET 8 +-#define A_OFFSET 0 +- +-typedef union _PIXEL { +- struct { +- unsigned char b; +- unsigned char g; +- unsigned char r; +- unsigned char a; +- } channels; +- unsigned int val; +- unsigned char cop[4]; +-} Pixel; +- +-#else +- +-#define A_CHANNEL 0xFF000000 +-#define R_CHANNEL 0x00FF0000 +-#define G_CHANNEL 0x0000FF00 +-#define B_CHANNEL 0x000000FF +-#define A_OFFSET 24 +-#define R_OFFSET 16 +-#define G_OFFSET 8 +-#define B_OFFSET 0 +- +-typedef union _PIXEL { +- struct { +- unsigned char a; +- unsigned char r; +- unsigned char g; +- unsigned char b; +- } channels; +- unsigned int val; +- unsigned char cop[4]; +-} Pixel; +- +-#endif /* COLOR_BGRA */ +- +-/* +-inline void setPixelRGB (Pixel * buffer, Uint x, Uint y, Color c); +-inline void getPixelRGB (Pixel * buffer, Uint x, Uint y, Color * c); +-*/ +- +- +-#endif /* GRAPHIC_H */ +diff -Naur /home/d4rk/goom2k4-0/src/goom.h /src/goom.h +--- /home/d4rk/goom2k4-0/src/goom.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,30 +0,0 @@ +-#ifndef _GOOMCORE_H +-#define _GOOMCORE_H +- +-#include "goom_config.h" +-#include "goom_plugin_info.h" +-#include "goomsl.h" +- +-#define NB_FX 10 +- +-PluginInfo *goom_init (guint32 resx, guint32 resy); +-void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy); +- +-/* +- * forceMode == 0 : do nothing +- * forceMode == -1 : lock the FX +- * forceMode == 1..NB_FX : force a switch to FX n# forceMode +- * +- * songTitle = pointer to the title of the song... +- * - NULL if it is not the start of the song +- * - only have a value at the start of the song +- */ +-guint32 *goom_update (PluginInfo *goomInfo, gint16 data[2][512], int forceMode, float fps, +- char *songTitle, char *message); +- +-/* returns 0 if the buffer wasn't accepted */ +-int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer); +- +-void goom_close (PluginInfo *goomInfo); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_hash.c /src/goom_hash.c +--- /home/d4rk/goom2k4-0/src/goom_hash.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_hash.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,100 +0,0 @@ +-#include "goom_hash.h" +-#include <string.h> +-#include <stdlib.h> +- +-static GoomHashEntry *entry_new(const char *key, HashValue value) { +- +- GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry)); +- +- entry->key = (char *)malloc(strlen(key)+1); +- strcpy(entry->key,key); +- entry->value = value; +- entry->lower = NULL; +- entry->upper = NULL; +- +- return entry; +-} +- +-static void entry_free(GoomHashEntry *entry) { +- if (entry!=NULL) { +- entry_free(entry->lower); +- entry_free(entry->upper); +- free(entry->key); +- free(entry); +- } +-} +- +-static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) { +- int cmp = strcmp(key,entry->key); +- if (cmp==0) { +- entry->value = value; +- } +- else if (cmp > 0) { +- if (entry->upper == NULL) +- entry->upper = entry_new(key,value); +- else +- entry_put(entry->upper, key, value); +- } +- else { +- if (entry->lower == NULL) +- entry->lower = entry_new(key,value); +- else +- entry_put(entry->lower, key, value); +- } +-} +- +-static HashValue *entry_get(GoomHashEntry *entry, const char *key) { +- +- int cmp; +- if (entry==NULL) +- return NULL; +- cmp = strcmp(key,entry->key); +- if (cmp > 0) +- return entry_get(entry->upper, key); +- else if (cmp < 0) +- return entry_get(entry->lower, key); +- else +- return &(entry->value); +-} +- +-GoomHash *goom_hash_new(void) { +- GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash)); +- _this->root = NULL; +- return _this; +-} +- +-void goom_hash_free(GoomHash *_this) { +- entry_free(_this->root); +- free(_this); +-} +- +-void goom_hash_put(GoomHash *_this, const char *key, HashValue value) { +- if (_this->root == NULL) +- _this->root = entry_new(key,value); +- else +- entry_put(_this->root,key,value); +-} +- +-HashValue *goom_hash_get(GoomHash *_this, const char *key) { +- return entry_get(_this->root,key); +-} +- +-void goom_hash_put_int(GoomHash *_this, const char *key, int i) { +- HashValue value; +- value.i = i; +- goom_hash_put(_this,key,value); +-} +- +-void goom_hash_put_float(GoomHash *_this, const char *key, float f) { +- HashValue value; +- value.f = f; +- goom_hash_put(_this,key,value); +-} +- +-void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) { +- HashValue value; +- value.ptr = ptr; +- goom_hash_put(_this,key,value); +-} +- +- +diff -Naur /home/d4rk/goom2k4-0/src/goom_hash.h /src/goom_hash.h +--- /home/d4rk/goom2k4-0/src/goom_hash.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_hash.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,34 +0,0 @@ +-#ifndef _GOOM_HASH_H +-#define _GOOM_HASH_H +- +-typedef struct GOOM_HASH_ENTRY GoomHashEntry; +-typedef struct GOOM_HASH GoomHash; +- +-typedef union { +- void *ptr; +- int i; +- float f; +-} HashValue; +- +-struct GOOM_HASH_ENTRY { +- char *key; +- HashValue value; +- GoomHashEntry *lower; +- GoomHashEntry *upper; +-}; +- +-struct GOOM_HASH { +- GoomHashEntry *root; +-}; +- +-GoomHash *goom_hash_new(void); +-void goom_hash_free(GoomHash *gh); +- +-void goom_hash_put(GoomHash *gh, const char *key, HashValue value); +-HashValue *goom_hash_get(GoomHash *gh, const char *key); +- +-void goom_hash_put_int(GoomHash *_this, const char *key, int i); +-void goom_hash_put_float(GoomHash *_this, const char *key, float f); +-void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr); +- +-#endif /* _GOOM_HASH_H */ +diff -Naur /home/d4rk/goom2k4-0/src/goom_plugin_info.h /src/goom_plugin_info.h +--- /home/d4rk/goom2k4-0/src/goom_plugin_info.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_plugin_info.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,176 +0,0 @@ +-#ifndef _PLUGIN_INFO_H +-#define _PLUGIN_INFO_H +- +-#include "goom_typedefs.h" +- +-#include "goom_config.h" +- +-#include "goom_graphic.h" +-#include "goom_config_param.h" +-#include "goom_visual_fx.h" +-#include "goom_filters.h" +-#include "goom_tools.h" +-#include "goomsl.h" +- +-typedef struct { +- char drawIFS; +- char drawPoints; +- char drawTentacle; +- +- char drawScope; +- int farScope; +- +- int rangemin; +- int rangemax; +-} GoomState; +- +-#define STATES_MAX_NB 128 +- +-/** +- * Gives informations about the sound. +- */ +-struct _SOUND_INFO { +- +- /* nota : a Goom is just a sound event... */ +- +- int timeSinceLastGoom; /* >= 0 */ +- float goomPower; /* power of the last Goom [0..1] */ +- +- int timeSinceLastBigGoom; /* >= 0 */ +- +- float volume; /* [0..1] */ +- short samples[2][512]; +- +- /* other "internal" datas for the sound_tester */ +- float goom_limit; /* auto-updated limit of goom_detection */ +- float bigGoomLimit; +- float accelvar; /* acceleration of the sound - [0..1] */ +- float speedvar; /* speed of the sound - [0..100] */ +- int allTimesMax; +- int totalgoom; /* number of goom since last reset +- * (a reset every 64 cycles) */ +- +- float prov_max; /* accel max since last reset */ +- +- int cycle; +- +- /* private */ +- PluginParam volume_p; +- PluginParam speed_p; +- PluginParam accel_p; +- PluginParam goom_limit_p; +- PluginParam goom_power_p; +- PluginParam last_goom_p; +- PluginParam last_biggoom_p; +- PluginParam biggoom_speed_limit_p; +- PluginParam biggoom_factor_p; +- +- PluginParameters params; /* contains the previously defined parameters. */ +-}; +- +- +-/** +- * Allows FXs to know the current state of the plugin. +- */ +-struct _PLUGIN_INFO { +- +- /* public datas */ +- +- int nbParams; +- PluginParameters *params; +- +- /* private datas */ +- +- struct _SIZE_TYPE { +- int width; +- int height; +- int size; /* == screen.height * screen.width. */ +- } screen; +- +- SoundInfo sound; +- +- int nbVisuals; +- VisualFX **visuals; /* pointers on all the visual fx */ +- +- /** The known FX */ +- VisualFX convolve_fx; +- VisualFX star_fx; +- VisualFX zoomFilter_fx; +- VisualFX tentacles_fx; +- VisualFX ifs_fx; +- +- /** image buffers */ +- guint32 *pixel; +- guint32 *back; +- Pixel *p1, *p2; +- Pixel *conv; +- Pixel *outputBuf; +- +- /** state of goom */ +- guint32 cycle; +- GoomState states[STATES_MAX_NB]; +- int statesNumber; +- int statesRangeMax; +- +- GoomState *curGState; +- +- /** effet de ligne.. */ +- GMLine *gmline1; +- GMLine *gmline2; +- +- /** sinus table */ +- int sintable[0x10000]; +- +- /* INTERNALS */ +- +- /** goom_update internals. +- * I took all static variables from goom_update and put them here.. for the moment. +- */ +- struct { +- int lockvar; /* pour empecher de nouveaux changements */ +- int goomvar; /* boucle des gooms */ +- int loopvar; /* mouvement des points */ +- int stop_lines; +- int ifs_incr; /* dessiner l'ifs (0 = non: > = increment) */ +- int decay_ifs; /* disparition de l'ifs */ +- int recay_ifs; /* dedisparition de l'ifs */ +- int cyclesSinceLastChange; /* nombre de Cycle Depuis Dernier Changement */ +- int drawLinesDuration; /* duree de la transition entre afficher les lignes ou pas */ +- int lineMode; /* l'effet lineaire a dessiner */ +- float switchMultAmount; /* SWITCHMULT (29.0f/30.0f) */ +- int switchIncrAmount; /* 0x7f */ +- float switchMult; /* 1.0f */ +- int switchIncr; /* = SWITCHINCR; */ +- int stateSelectionRnd; +- int stateSelectionBlocker; +- int previousZoomSpeed; +- int timeOfTitleDisplay; +- char titleText[1024]; +- ZoomFilterData zoomFilterData; +- } update; +- +- struct { +- int numberOfLinesInMessage; +- char message[0x800]; +- int affiche; +- int longueur; +- } update_message; +- +- struct { +- void (*draw_line) (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +- void (*zoom_filter) (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +- } methods; +- +- GoomRandom *gRandom; +- +- GoomSL *scanner; +- GoomSL *main_scanner; +- const char *main_script_str; +-}; +- +-void plugin_info_init(PluginInfo *p, int nbVisual); +- +-/* i = [0..p->nbVisual-1] */ +-void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goomsl.c /src/goomsl.c +--- /home/d4rk/goom2k4-0/src/goomsl.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,1509 +0,0 @@ +-#include <math.h> +-#include <stdlib.h> +-#include <stdio.h> +-#include <string.h> +-#include "goomsl.h" +-#include "goomsl_private.h" +-#include "goomsl_yacc.h" +- +-/*#define TRACE_SCRIPT*/ +- +- /* {{{ definition of the instructions number */ +-#define INSTR_SETI_VAR_INTEGER 1 +-#define INSTR_SETI_VAR_VAR 2 +-#define INSTR_SETF_VAR_FLOAT 3 +-#define INSTR_SETF_VAR_VAR 4 +-#define INSTR_NOP 5 +-/* #define INSTR_JUMP 6 */ +-#define INSTR_SETP_VAR_PTR 7 +-#define INSTR_SETP_VAR_VAR 8 +-#define INSTR_SUBI_VAR_INTEGER 9 +-#define INSTR_SUBI_VAR_VAR 10 +-#define INSTR_SUBF_VAR_FLOAT 11 +-#define INSTR_SUBF_VAR_VAR 12 +-#define INSTR_ISLOWERF_VAR_VAR 13 +-#define INSTR_ISLOWERF_VAR_FLOAT 14 +-#define INSTR_ISLOWERI_VAR_VAR 15 +-#define INSTR_ISLOWERI_VAR_INTEGER 16 +-#define INSTR_ADDI_VAR_INTEGER 17 +-#define INSTR_ADDI_VAR_VAR 18 +-#define INSTR_ADDF_VAR_FLOAT 19 +-#define INSTR_ADDF_VAR_VAR 20 +-#define INSTR_MULI_VAR_INTEGER 21 +-#define INSTR_MULI_VAR_VAR 22 +-#define INSTR_MULF_VAR_FLOAT 23 +-#define INSTR_MULF_VAR_VAR 24 +-#define INSTR_DIVI_VAR_INTEGER 25 +-#define INSTR_DIVI_VAR_VAR 26 +-#define INSTR_DIVF_VAR_FLOAT 27 +-#define INSTR_DIVF_VAR_VAR 28 +-/* #define INSTR_JZERO 29 */ +-#define INSTR_ISEQUALP_VAR_VAR 30 +-#define INSTR_ISEQUALP_VAR_PTR 31 +-#define INSTR_ISEQUALI_VAR_VAR 32 +-#define INSTR_ISEQUALI_VAR_INTEGER 33 +-#define INSTR_ISEQUALF_VAR_VAR 34 +-#define INSTR_ISEQUALF_VAR_FLOAT 35 +-/* #define INSTR_CALL 36 */ +-/* #define INSTR_RET 37 */ +-/* #define INSTR_EXT_CALL 38 */ +-#define INSTR_NOT_VAR 39 +-/* #define INSTR_JNZERO 40 */ +-#define INSTR_SETS_VAR_VAR 41 +-#define INSTR_ISEQUALS_VAR_VAR 42 +-#define INSTR_ADDS_VAR_VAR 43 +-#define INSTR_SUBS_VAR_VAR 44 +-#define INSTR_MULS_VAR_VAR 45 +-#define INSTR_DIVS_VAR_VAR 46 +- +- /* }}} */ +-/* {{{ definition of the validation error types */ +-static const char *VALIDATE_OK = "ok"; +-#define VALIDATE_ERROR "error while validating " +-#define VALIDATE_TODO "todo" +-#define VALIDATE_SYNTHAX_ERROR "synthax error" +-#define VALIDATE_NO_SUCH_INT "no such integer variable" +-#define VALIDATE_NO_SUCH_VAR "no such variable" +-#define VALIDATE_NO_SUCH_DEST_VAR "no such destination variable" +-#define VALIDATE_NO_SUCH_SRC_VAR "no such src variable" +-/* }}} */ +- +- /***********************************/ +- /* PROTOTYPE OF INTERNAL FUNCTIONS */ +-/***********************************/ +- +-/* {{{ */ +-static void gsl_instr_free(Instruction *_this); +-static const char *gsl_instr_validate(Instruction *_this); +-static void gsl_instr_display(Instruction *_this); +- +-static InstructionFlow *iflow_new(void); +-static void iflow_add_instr(InstructionFlow *_this, Instruction *instr); +-static void iflow_clean(InstructionFlow *_this); +-static void iflow_free(InstructionFlow *_this); +-static void iflow_execute(FastInstructionFlow *_this, GoomSL *gsl); +-/* }}} */ +- +- /************************************/ +- /* DEFINITION OF INTERNAL FUNCTIONS */ +-/************************************/ +- +-void iflow_free(InstructionFlow *_this) +-{ /* {{{ */ +- goom_hash_free(_this->labels); +- free(_this); /*TODO: finir cette fonction */ +-} /* }}} */ +- +-void iflow_clean(InstructionFlow *_this) +-{ /* {{{ */ +- /* TODO: clean chaque instruction du flot */ +- _this->number = 0; +- goom_hash_free(_this->labels); +- _this->labels = goom_hash_new(); +-} /* }}} */ +- +-InstructionFlow *iflow_new(void) +-{ /* {{{ */ +- InstructionFlow *_this = (InstructionFlow*)malloc(sizeof(InstructionFlow)); +- _this->number = 0; +- _this->tabsize = 6; +- _this->instr = (Instruction**)malloc(_this->tabsize * sizeof(Instruction*)); +- _this->labels = goom_hash_new(); +- +- return _this; +-} /* }}} */ +- +-void iflow_add_instr(InstructionFlow *_this, Instruction *instr) +-{ /* {{{ */ +- if (_this->number == _this->tabsize) { +- _this->tabsize *= 2; +- _this->instr = (Instruction**)realloc(_this->instr, _this->tabsize * sizeof(Instruction*)); +- } +- _this->instr[_this->number] = instr; +- instr->address = _this->number; +- _this->number++; +-} /* }}} */ +- +-void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns) +-{ /* {{{ */ +- if (_this->cur_param <= 0) { +- fprintf(stderr, "ERROR: Line %d, No more params to instructions\n", _this->line_number); +- exit(1); +- } +- _this->vnamespace[_this->cur_param-1] = ns; +-} /* }}} */ +- +-void gsl_instr_add_param(Instruction *instr, char *param, int type) +-{ /* {{{ */ +- int len; +- if (instr==NULL) +- return; +- if (instr->cur_param==0) +- return; +- --instr->cur_param; +- len = strlen(param); +- instr->params[instr->cur_param] = (char*)malloc(len+1); +- strcpy(instr->params[instr->cur_param], param); +- instr->types[instr->cur_param] = type; +- if (instr->cur_param == 0) { +- +- const char *result = gsl_instr_validate(instr); +- if (result != VALIDATE_OK) { +- printf("ERROR: Line %d: ", instr->parent->num_lines + 1); +- gsl_instr_display(instr); +- printf("... %s\n", result); +- instr->parent->compilationOK = 0; +- exit(1); +- } +- +-#if USE_JITC_X86 +- iflow_add_instr(instr->parent->iflow, instr); +-#else +- if (instr->id != INSTR_NOP) +- iflow_add_instr(instr->parent->iflow, instr); +- else +- gsl_instr_free(instr); +-#endif +- } +-} /* }}} */ +- +-Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number) +-{ /* {{{ */ +- Instruction *instr = (Instruction*)malloc(sizeof(Instruction)); +- instr->params = (char**)malloc(nb_param*sizeof(char*)); +- instr->vnamespace = (GoomHash**)malloc(nb_param*sizeof(GoomHash*)); +- instr->types = (int*)malloc(nb_param*sizeof(int)); +- instr->cur_param = instr->nb_param = nb_param; +- instr->parent = parent; +- instr->id = id; +- instr->name = name; +- instr->jump_label = NULL; +- instr->line_number = line_number; +- return instr; +-} /* }}} */ +- +-void gsl_instr_free(Instruction *_this) +-{ /* {{{ */ +- int i; +- free(_this->types); +- for (i=_this->cur_param; i<_this->nb_param; ++i) +- free(_this->params[i]); +- free(_this->params); +- free(_this); +-} /* }}} */ +- +-void gsl_instr_display(Instruction *_this) +-{ /* {{{ */ +- int i=_this->nb_param-1; +- printf("%s", _this->name); +- while(i>=_this->cur_param) { +- printf(" %s", _this->params[i]); +- --i; +- } +-} /* }}} */ +- +- /****************************************/ +- /* VALIDATION OF INSTRUCTION PARAMETERS */ +-/****************************************/ +- +-static const char *validate_v_v(Instruction *_this) +-{ /* {{{ */ +- HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); +- HashValue *src = goom_hash_get(_this->vnamespace[0], _this->params[0]); +- +- if (dest == NULL) { +- return VALIDATE_NO_SUCH_DEST_VAR; +- } +- if (src == NULL) { +- return VALIDATE_NO_SUCH_SRC_VAR; +- } +- _this->data.udest.var = dest->ptr; +- _this->data.usrc.var = src->ptr; +- return VALIDATE_OK; +-} /* }}} */ +- +-static const char *validate_v_i(Instruction *_this) +-{ /* {{{ */ +- HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); +- _this->data.usrc.value_int = strtol(_this->params[0],NULL,0); +- +- if (dest == NULL) { +- return VALIDATE_NO_SUCH_INT; +- } +- _this->data.udest.var = dest->ptr; +- return VALIDATE_OK; +-} /* }}} */ +- +-static const char *validate_v_p(Instruction *_this) +-{ /* {{{ */ +- HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); +- _this->data.usrc.value_ptr = strtol(_this->params[0],NULL,0); +- +- if (dest == NULL) { +- return VALIDATE_NO_SUCH_INT; +- } +- _this->data.udest.var = dest->ptr; +- return VALIDATE_OK; +-} /* }}} */ +- +-static const char *validate_v_f(Instruction *_this) +-{ /* {{{ */ +- HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); +- _this->data.usrc.value_float = atof(_this->params[0]); +- +- if (dest == NULL) { +- return VALIDATE_NO_SUCH_VAR; +- } +- _this->data.udest.var = dest->ptr; +- return VALIDATE_OK; +-} /* }}} */ +- +-static const char *validate(Instruction *_this, +- int vf_f_id, int vf_v_id, +- int vi_i_id, int vi_v_id, +- int vp_p_id, int vp_v_id, +- int vs_v_id) +-{ /* {{{ */ +- if ((_this->types[1] == TYPE_FVAR) && (_this->types[0] == TYPE_FLOAT)) { +- _this->id = vf_f_id; +- return validate_v_f(_this); +- } +- else if ((_this->types[1] == TYPE_FVAR) && (_this->types[0] == TYPE_FVAR)) { +- _this->id = vf_v_id; +- return validate_v_v(_this); +- } +- else if ((_this->types[1] == TYPE_IVAR) && (_this->types[0] == TYPE_INTEGER)) { +- _this->id = vi_i_id; +- return validate_v_i(_this); +- } +- else if ((_this->types[1] == TYPE_IVAR) && (_this->types[0] == TYPE_IVAR)) { +- _this->id = vi_v_id; +- return validate_v_v(_this); +- } +- else if ((_this->types[1] == TYPE_PVAR) && (_this->types[0] == TYPE_PTR)) { +- if (vp_p_id == INSTR_NOP) return VALIDATE_ERROR; +- _this->id = vp_p_id; +- return validate_v_p(_this); +- } +- else if ((_this->types[1] == TYPE_PVAR) && (_this->types[0] == TYPE_PVAR)) { +- _this->id = vp_v_id; +- if (vp_v_id == INSTR_NOP) return VALIDATE_ERROR; +- return validate_v_v(_this); +- } +- else if ((_this->types[1] < FIRST_RESERVED) && (_this->types[1] >= 0) && (_this->types[0] == _this->types[1])) { +- _this->id = vs_v_id; +- if (vs_v_id == INSTR_NOP) return "Impossible operation to perform between two structs"; +- return validate_v_v(_this); +- } +- return VALIDATE_ERROR; +-} /* }}} */ +- +-const char *gsl_instr_validate(Instruction *_this) +-{ /* {{{ */ +- if (_this->id != INSTR_EXT_CALL) { +- int i = _this->nb_param; +- while (i>0) +- { +- i--; +- if (_this->types[i] == TYPE_VAR) { +- int type = gsl_type_of_var(_this->vnamespace[i], _this->params[i]); +- +- if (type == INSTR_INT) +- _this->types[i] = TYPE_IVAR; +- else if (type == INSTR_FLOAT) +- _this->types[i] = TYPE_FVAR; +- else if (type == INSTR_PTR) +- _this->types[i] = TYPE_PVAR; +- else if ((type >= 0) && (type < FIRST_RESERVED)) +- _this->types[i] = type; +- else fprintf(stderr,"WARNING: Line %d, %s has no namespace\n", _this->line_number, _this->params[i]); +- } +- } +- } +- +- switch (_this->id) { +- +- /* set */ +- case INSTR_SET: +- return validate(_this, +- INSTR_SETF_VAR_FLOAT, INSTR_SETF_VAR_VAR, +- INSTR_SETI_VAR_INTEGER, INSTR_SETI_VAR_VAR, +- INSTR_SETP_VAR_PTR, INSTR_SETP_VAR_VAR, +- INSTR_SETS_VAR_VAR); +- +- /* extcall */ +- case INSTR_EXT_CALL: +- if (_this->types[0] == TYPE_VAR) { +- HashValue *fval = goom_hash_get(_this->parent->functions, _this->params[0]); +- if (fval) { +- _this->data.udest.external_function = (struct _ExternalFunctionStruct*)fval->ptr; +- return VALIDATE_OK; +- } +- } +- return VALIDATE_ERROR; +- +- /* call */ +- case INSTR_CALL: +- if (_this->types[0] == TYPE_LABEL) { +- _this->jump_label = _this->params[0]; +- return VALIDATE_OK; +- } +- return VALIDATE_ERROR; +- +- /* ret */ +- case INSTR_RET: +- return VALIDATE_OK; +- +- /* jump */ +- case INSTR_JUMP: +- +- if (_this->types[0] == TYPE_LABEL) { +- _this->jump_label = _this->params[0]; +- return VALIDATE_OK; +- } +- return VALIDATE_ERROR; +- +- /* jzero / jnzero */ +- case INSTR_JZERO: +- case INSTR_JNZERO: +- +- if (_this->types[0] == TYPE_LABEL) { +- _this->jump_label = _this->params[0]; +- return VALIDATE_OK; +- } +- return VALIDATE_ERROR; +- +- /* label */ +- case INSTR_LABEL: +- +- if (_this->types[0] == TYPE_LABEL) { +- _this->id = INSTR_NOP; +- _this->nop_label = _this->params[0]; +- goom_hash_put_int(_this->parent->iflow->labels, _this->params[0], _this->parent->iflow->number); +- return VALIDATE_OK; +- } +- return VALIDATE_ERROR; +- +- /* isequal */ +- case INSTR_ISEQUAL: +- return validate(_this, +- INSTR_ISEQUALF_VAR_FLOAT, INSTR_ISEQUALF_VAR_VAR, +- INSTR_ISEQUALI_VAR_INTEGER, INSTR_ISEQUALI_VAR_VAR, +- INSTR_ISEQUALP_VAR_PTR, INSTR_ISEQUALP_VAR_VAR, +- INSTR_ISEQUALS_VAR_VAR); +- +- /* not */ +- case INSTR_NOT: +- _this->id = INSTR_NOT_VAR; +- return VALIDATE_OK; +- +- /* islower */ +- case INSTR_ISLOWER: +- return validate(_this, +- INSTR_ISLOWERF_VAR_FLOAT, INSTR_ISLOWERF_VAR_VAR, +- INSTR_ISLOWERI_VAR_INTEGER, INSTR_ISLOWERI_VAR_VAR, +- INSTR_NOP, INSTR_NOP, INSTR_NOP); +- +- /* add */ +- case INSTR_ADD: +- return validate(_this, +- INSTR_ADDF_VAR_FLOAT, INSTR_ADDF_VAR_VAR, +- INSTR_ADDI_VAR_INTEGER, INSTR_ADDI_VAR_VAR, +- INSTR_NOP, INSTR_NOP, +- INSTR_ADDS_VAR_VAR); +- +- /* mul */ +- case INSTR_MUL: +- return validate(_this, +- INSTR_MULF_VAR_FLOAT, INSTR_MULF_VAR_VAR, +- INSTR_MULI_VAR_INTEGER, INSTR_MULI_VAR_VAR, +- INSTR_NOP, INSTR_NOP, +- INSTR_MULS_VAR_VAR); +- +- /* sub */ +- case INSTR_SUB: +- return validate(_this, +- INSTR_SUBF_VAR_FLOAT, INSTR_SUBF_VAR_VAR, +- INSTR_SUBI_VAR_INTEGER, INSTR_SUBI_VAR_VAR, +- INSTR_NOP, INSTR_NOP, +- INSTR_SUBS_VAR_VAR); +- +- /* div */ +- case INSTR_DIV: +- return validate(_this, +- INSTR_DIVF_VAR_FLOAT, INSTR_DIVF_VAR_VAR, +- INSTR_DIVI_VAR_INTEGER, INSTR_DIVI_VAR_VAR, +- INSTR_NOP,INSTR_NOP, +- INSTR_DIVS_VAR_VAR); +- +- default: +- return VALIDATE_TODO; +- } +- return VALIDATE_ERROR; +-} /* }}} */ +- +- /*************/ +- /* EXECUTION */ +-/*************/ +-void iflow_execute(FastInstructionFlow *_this, GoomSL *gsl) +-{ /* {{{ */ +- int flag = 0; +- int ip = 0; +- FastInstruction *instr = _this->instr; +- int stack[0x10000]; +- int stack_pointer = 0; +- +- stack[stack_pointer++] = -1; +- +- /* Quelques Macro pour rendre le code plus lisible */ +-#define pSRC_VAR instr[ip].data.usrc.var +-#define SRC_VAR_INT *instr[ip].data.usrc.var_int +-#define SRC_VAR_FLOAT *instr[ip].data.usrc.var_float +-#define SRC_VAR_PTR *instr[ip].data.usrc.var_ptr +- +-#define pDEST_VAR instr[ip].data.udest.var +-#define DEST_VAR_INT *instr[ip].data.udest.var_int +-#define DEST_VAR_FLOAT *instr[ip].data.udest.var_float +-#define DEST_VAR_PTR *instr[ip].data.udest.var_ptr +- +-#define VALUE_INT instr[ip].data.usrc.value_int +-#define VALUE_FLOAT instr[ip].data.usrc.value_float +-#define VALUE_PTR instr[ip].data.usrc.value_ptr +- +-#define JUMP_OFFSET instr[ip].data.udest.jump_offset +- +-#define SRC_STRUCT_ID instr[ip].data.usrc.var_int[-1] +-#define DEST_STRUCT_ID instr[ip].data.udest.var_int[-1] +-#define SRC_STRUCT_IBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i] +-#define SRC_STRUCT_FBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i] +-#define DEST_STRUCT_IBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i] +-#define DEST_STRUCT_FBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i] +-#define DEST_STRUCT_IBLOCK_VAR(i,j) \ +- ((int*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i].data))[j] +-#define DEST_STRUCT_FBLOCK_VAR(i,j) \ +- ((float*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i].data))[j] +-#define SRC_STRUCT_IBLOCK_VAR(i,j) \ +- ((int*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i].data))[j] +-#define SRC_STRUCT_FBLOCK_VAR(i,j) \ +- ((float*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i].data))[j] +-#define DEST_STRUCT_SIZE gsl->gsl_struct[DEST_STRUCT_ID]->size +- +- while (1) +- { +- int i; +-#ifdef TRACE_SCRIPT +- printf("execute "); gsl_instr_display(instr[ip].proto); printf("\n"); +-#endif +- switch (instr[ip].id) { +- +- /* SET.I */ +- case INSTR_SETI_VAR_INTEGER: +- DEST_VAR_INT = VALUE_INT; +- ++ip; break; +- +- case INSTR_SETI_VAR_VAR: +- DEST_VAR_INT = SRC_VAR_INT; +- ++ip; break; +- +- /* SET.F */ +- case INSTR_SETF_VAR_FLOAT: +- DEST_VAR_FLOAT = VALUE_FLOAT; +- ++ip; break; +- +- case INSTR_SETF_VAR_VAR: +- DEST_VAR_FLOAT = SRC_VAR_FLOAT; +- ++ip; break; +- +- /* SET.P */ +- case INSTR_SETP_VAR_VAR: +- DEST_VAR_PTR = SRC_VAR_PTR; +- ++ip; break; +- +- case INSTR_SETP_VAR_PTR: +- DEST_VAR_PTR = VALUE_PTR; +- ++ip; break; +- +- /* JUMP */ +- case INSTR_JUMP: +- ip += JUMP_OFFSET; break; +- +- /* JZERO */ +- case INSTR_JZERO: +- ip += (flag ? 1 : JUMP_OFFSET); break; +- +- case INSTR_NOP: +- ++ip; break; +- +- /* ISEQUAL.P */ +- case INSTR_ISEQUALP_VAR_VAR: +- flag = (DEST_VAR_PTR == SRC_VAR_PTR); +- ++ip; break; +- +- case INSTR_ISEQUALP_VAR_PTR: +- flag = (DEST_VAR_PTR == VALUE_PTR); +- ++ip; break; +- +- /* ISEQUAL.I */ +- case INSTR_ISEQUALI_VAR_VAR: +- flag = (DEST_VAR_INT == SRC_VAR_INT); +- ++ip; break; +- +- case INSTR_ISEQUALI_VAR_INTEGER: +- flag = (DEST_VAR_INT == VALUE_INT); +- ++ip; break; +- +- /* ISEQUAL.F */ +- case INSTR_ISEQUALF_VAR_VAR: +- flag = (DEST_VAR_FLOAT == SRC_VAR_FLOAT); +- ++ip; break; +- +- case INSTR_ISEQUALF_VAR_FLOAT: +- flag = (DEST_VAR_FLOAT == VALUE_FLOAT); +- ++ip; break; +- +- /* ISLOWER.I */ +- case INSTR_ISLOWERI_VAR_VAR: +- flag = (DEST_VAR_INT < SRC_VAR_INT); +- ++ip; break; +- +- case INSTR_ISLOWERI_VAR_INTEGER: +- flag = (DEST_VAR_INT < VALUE_INT); +- ++ip; break; +- +- /* ISLOWER.F */ +- case INSTR_ISLOWERF_VAR_VAR: +- flag = (DEST_VAR_FLOAT < SRC_VAR_FLOAT); +- ++ip; break; +- +- case INSTR_ISLOWERF_VAR_FLOAT: +- flag = (DEST_VAR_FLOAT < VALUE_FLOAT); +- ++ip; break; +- +- /* ADD.I */ +- case INSTR_ADDI_VAR_VAR: +- DEST_VAR_INT += SRC_VAR_INT; +- ++ip; break; +- +- case INSTR_ADDI_VAR_INTEGER: +- DEST_VAR_INT += VALUE_INT; +- ++ip; break; +- +- /* ADD.F */ +- case INSTR_ADDF_VAR_VAR: +- DEST_VAR_FLOAT += SRC_VAR_FLOAT; +- ++ip; break; +- +- case INSTR_ADDF_VAR_FLOAT: +- DEST_VAR_FLOAT += VALUE_FLOAT; +- ++ip; break; +- +- /* MUL.I */ +- case INSTR_MULI_VAR_VAR: +- DEST_VAR_INT *= SRC_VAR_INT; +- ++ip; break; +- +- case INSTR_MULI_VAR_INTEGER: +- DEST_VAR_INT *= VALUE_INT; +- ++ip; break; +- +- /* MUL.F */ +- case INSTR_MULF_VAR_FLOAT: +- DEST_VAR_FLOAT *= VALUE_FLOAT; +- ++ip; break; +- +- case INSTR_MULF_VAR_VAR: +- DEST_VAR_FLOAT *= SRC_VAR_FLOAT; +- ++ip; break; +- +- /* DIV.I */ +- case INSTR_DIVI_VAR_VAR: +- DEST_VAR_INT /= SRC_VAR_INT; +- ++ip; break; +- +- case INSTR_DIVI_VAR_INTEGER: +- DEST_VAR_INT /= VALUE_INT; +- ++ip; break; +- +- /* DIV.F */ +- case INSTR_DIVF_VAR_FLOAT: +- DEST_VAR_FLOAT /= VALUE_FLOAT; +- ++ip; break; +- +- case INSTR_DIVF_VAR_VAR: +- DEST_VAR_FLOAT /= SRC_VAR_FLOAT; +- ++ip; break; +- +- /* SUB.I */ +- case INSTR_SUBI_VAR_VAR: +- DEST_VAR_INT -= SRC_VAR_INT; +- ++ip; break; +- +- case INSTR_SUBI_VAR_INTEGER: +- DEST_VAR_INT -= VALUE_INT; +- ++ip; break; +- +- /* SUB.F */ +- case INSTR_SUBF_VAR_FLOAT: +- DEST_VAR_FLOAT -= VALUE_FLOAT; +- ++ip; break; +- +- case INSTR_SUBF_VAR_VAR: +- DEST_VAR_FLOAT -= SRC_VAR_FLOAT; +- ++ip; break; +- +- /* CALL */ +- case INSTR_CALL: +- stack[stack_pointer++] = ip + 1; +- ip += JUMP_OFFSET; break; +- +- /* RET */ +- case INSTR_RET: +- ip = stack[--stack_pointer]; +- if (ip<0) return; +- break; +- +- /* EXT_CALL */ +- case INSTR_EXT_CALL: +- instr[ip].data.udest.external_function->function(gsl, gsl->vars, instr[ip].data.udest.external_function->vars); +- ++ip; break; +- +- /* NOT */ +- case INSTR_NOT_VAR: +- flag = !flag; +- ++ip; break; +- +- /* JNZERO */ +- case INSTR_JNZERO: +- ip += (flag ? JUMP_OFFSET : 1); break; +- +- case INSTR_SETS_VAR_VAR: +- memcpy(pDEST_VAR, pSRC_VAR, DEST_STRUCT_SIZE); +- ++ip; break; +- +- case INSTR_ISEQUALS_VAR_VAR: +- break; +- +- case INSTR_ADDS_VAR_VAR: +- /* process integers */ +- i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_IBLOCK_VAR(i,j) += SRC_STRUCT_IBLOCK_VAR(i,j); +- } +- ++i; +- } +- /* process floats */ +- i=0; +- while (DEST_STRUCT_FBLOCK(i).size > 0) { +- int j=DEST_STRUCT_FBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_FBLOCK_VAR(i,j) += SRC_STRUCT_FBLOCK_VAR(i,j); +- } +- ++i; +- } +- ++ip; break; +- +- case INSTR_SUBS_VAR_VAR: +- /* process integers */ +- i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_IBLOCK_VAR(i,j) -= SRC_STRUCT_IBLOCK_VAR(i,j); +- } +- ++i; +- } +- /* process floats */ +- i=0; +- while (DEST_STRUCT_FBLOCK(i).size > 0) { +- int j=DEST_STRUCT_FBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_FBLOCK_VAR(i,j) -= SRC_STRUCT_FBLOCK_VAR(i,j); +- } +- ++i; +- } +- ++ip; break; +- +- case INSTR_MULS_VAR_VAR: +- /* process integers */ +- i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_IBLOCK_VAR(i,j) *= SRC_STRUCT_IBLOCK_VAR(i,j); +- } +- ++i; +- } +- /* process floats */ +- i=0; +- while (DEST_STRUCT_FBLOCK(i).size > 0) { +- int j=DEST_STRUCT_FBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_FBLOCK_VAR(i,j) *= SRC_STRUCT_FBLOCK_VAR(i,j); +- } +- ++i; +- } +- ++ip; break; +- +- case INSTR_DIVS_VAR_VAR: +- /* process integers */ +- i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_IBLOCK_VAR(i,j) /= SRC_STRUCT_IBLOCK_VAR(i,j); +- } +- ++i; +- } +- /* process floats */ +- i=0; +- while (DEST_STRUCT_FBLOCK(i).size > 0) { +- int j=DEST_STRUCT_FBLOCK(i).size; +- while (j--) { +- DEST_STRUCT_FBLOCK_VAR(i,j) /= SRC_STRUCT_FBLOCK_VAR(i,j); +- } +- ++i; +- } +- ++ip; break; +- +- default: +- printf("NOT IMPLEMENTED : %d\n", instr[ip].id); +- ++ip; +- exit(1); +- } +- } +-} /* }}} */ +- +-int gsl_malloc(GoomSL *_this, int size) +-{ /* {{{ */ +- if (_this->nbPtr >= _this->ptrArraySize) { +- _this->ptrArraySize *= 2; +- _this->ptrArray = (void**)realloc(_this->ptrArray, sizeof(void*) * _this->ptrArraySize); +- } +- _this->ptrArray[_this->nbPtr] = malloc(size); +- return _this->nbPtr++; +-} /* }}} */ +- +-void *gsl_get_ptr(GoomSL *_this, int id) +-{ /* {{{ */ +- if ((id>=0)&&(id<_this->nbPtr)) +- return _this->ptrArray[id]; +- fprintf(stderr,"INVALID GET PTR 0x%08x\n", id); +- return NULL; +-} /* }}} */ +- +-void gsl_free_ptr(GoomSL *_this, int id) +-{ /* {{{ */ +- if ((id>=0)&&(id<_this->nbPtr)) { +- free(_this->ptrArray[id]); +- _this->ptrArray[id] = 0; +- } +-} /* }}} */ +- +-void gsl_enternamespace(const char *name) +-{ /* {{{ */ +- HashValue *val = goom_hash_get(currentGoomSL->functions, name); +- if (val) { +- ExternalFunctionStruct *function = (ExternalFunctionStruct*)val->ptr; +- currentGoomSL->currentNS++; +- currentGoomSL->namespaces[currentGoomSL->currentNS] = function->vars; +- } +- else { +- fprintf(stderr, "ERROR: Line %d, Could not find namespace: %s\n", currentGoomSL->num_lines, name); +- exit(1); +- } +-} /* }}} */ +- +-void gsl_reenternamespace(GoomHash *nsinfo) { +- currentGoomSL->currentNS++; +- currentGoomSL->namespaces[currentGoomSL->currentNS] = nsinfo; +-} +- +-GoomHash *gsl_leavenamespace(void) +-{ /* {{{ */ +- currentGoomSL->currentNS--; +- return currentGoomSL->namespaces[currentGoomSL->currentNS+1]; +-} /* }}} */ +- +-GoomHash *gsl_find_namespace(const char *name) +-{ /* {{{ */ +- int i; +- for (i=currentGoomSL->currentNS;i>=0;--i) { +- if (goom_hash_get(currentGoomSL->namespaces[i], name)) +- return currentGoomSL->namespaces[i]; +- } +- return NULL; +-} /* }}} */ +- +-void gsl_declare_task(const char *name) +-{ /* {{{ */ +- if (goom_hash_get(currentGoomSL->functions, name)) { +- return; +- } +- else { +- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)malloc(sizeof(ExternalFunctionStruct)); +- gef->function = 0; +- gef->vars = goom_hash_new(); +- gef->is_extern = 0; +- goom_hash_put_ptr(currentGoomSL->functions, name, (void*)gef); +- } +-} /* }}} */ +- +-void gsl_declare_external_task(const char *name) +-{ /* {{{ */ +- if (goom_hash_get(currentGoomSL->functions, name)) { +- fprintf(stderr, "ERROR: Line %d, Duplicate declaration of %s\n", currentGoomSL->num_lines, name); +- return; +- } +- else { +- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)malloc(sizeof(ExternalFunctionStruct)); +- gef->function = 0; +- gef->vars = goom_hash_new(); +- gef->is_extern = 1; +- goom_hash_put_ptr(currentGoomSL->functions, name, (void*)gef); +- } +-} /* }}} */ +- +-static void reset_scanner(GoomSL *gss) +-{ /* {{{ */ +- gss->num_lines = 0; +- gss->instr = NULL; +- iflow_clean(gss->iflow); +- +- /* reset variables */ +- goom_hash_free(gss->vars); +- gss->vars = goom_hash_new(); +- gss->currentNS = 0; +- gss->namespaces[0] = gss->vars; +- +- goom_hash_free(gss->structIDS); +- gss->structIDS = goom_hash_new(); +- +- while (gss->nbStructID > 0) { +- int i; +- gss->nbStructID--; +- for(i=0;i<gss->gsl_struct[gss->nbStructID]->nbFields;++i) +- free(gss->gsl_struct[gss->nbStructID]->fields[i]); +- free(gss->gsl_struct[gss->nbStructID]); +- } +- +- gss->compilationOK = 1; +- +- goom_heap_delete(gss->data_heap); +- gss->data_heap = goom_heap_new(); +-} /* }}} */ +- +-static void calculate_labels(InstructionFlow *iflow) +-{ /* {{{ */ +- int i = 0; +- while (i < iflow->number) { +- Instruction *instr = iflow->instr[i]; +- if (instr->jump_label) { +- HashValue *label = goom_hash_get(iflow->labels,instr->jump_label); +- if (label) { +- instr->data.udest.jump_offset = -instr->address + label->i; +- } +- else { +- fprintf(stderr, "ERROR: Line %d, Could not find label %s\n", instr->line_number, instr->jump_label); +- instr->id = INSTR_NOP; +- instr->nop_label = 0; +- exit(1); +- } +- } +- ++i; +- } +-} /* }}} */ +- +-static int powerOfTwo(int i) +-{ +- int b; +- for (b=0;b<31;b++) +- if (i == (1<<b)) +- return b; +- return 0; +-} +- +-/* Cree un flow d'instruction optimise */ +-static void gsl_create_fast_iflow(void) +-{ /* {{{ */ +- int number = currentGoomSL->iflow->number; +- int i; +-#ifdef USE_JITC_X86 +- +- /* pour compatibilite avec les MACROS servant a execution */ +- int ip = 0; +- GoomSL *gsl = currentGoomSL; +- +- JitcX86Env *jitc; +- +- if (currentGoomSL->jitc != NULL) +- jitc_x86_delete(currentGoomSL->jitc); +- jitc = currentGoomSL->jitc = jitc_x86_env_new(0xffff); +- currentGoomSL->jitc_func = jitc_prepare_func(jitc); +- +-#if 0 +-#define SRC_STRUCT_ID instr[ip].data.usrc.var_int[-1] +-#define DEST_STRUCT_ID instr[ip].data.udest.var_int[-1] +-#define SRC_STRUCT_IBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i] +-#define SRC_STRUCT_FBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i] +-#define DEST_STRUCT_IBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i] +-#define DEST_STRUCT_FBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i] +-#define DEST_STRUCT_IBLOCK_VAR(i,j) \ +- ((int*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i].data))[j] +-#define DEST_STRUCT_FBLOCK_VAR(i,j) \ +- ((float*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i].data))[j] +-#define SRC_STRUCT_IBLOCK_VAR(i,j) \ +- ((int*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i].data))[j] +-#define SRC_STRUCT_FBLOCK_VAR(i,j) \ +- ((float*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i].data))[j] +-#define DEST_STRUCT_SIZE gsl->gsl_struct[DEST_STRUCT_ID]->size +-#endif +- +- JITC_JUMP_LABEL(jitc, "__very_end__"); +- JITC_ADD_LABEL (jitc, "__very_start__"); +- +- for (i=0;i<number;++i) { +- Instruction *instr = currentGoomSL->iflow->instr[i]; +- switch (instr->id) { +- case INSTR_SETI_VAR_INTEGER : +- jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_int, instr->data.usrc.value_int); +- break; +- case INSTR_SETI_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_int); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- break; +- /* SET.F */ +- case INSTR_SETF_VAR_FLOAT : +- jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_float, *(int*)(&instr->data.usrc.value_float)); +- break; +- case INSTR_SETF_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_float); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_float); +- break; +- case INSTR_NOP : +- if (instr->nop_label != 0) +- JITC_ADD_LABEL(jitc, instr->nop_label); +- break; +- case INSTR_JUMP : +- JITC_JUMP_LABEL(jitc,instr->jump_label); +- break; +- case INSTR_SETP_VAR_PTR : +- jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_ptr, instr->data.usrc.value_ptr); +- break; +- case INSTR_SETP_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_ptr); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_ptr); +- break; +- case INSTR_SUBI_VAR_INTEGER : +- jitc_add(jitc, "add [$d], $d", instr->data.udest.var_int, -instr->data.usrc.value_int); +- break; +- case INSTR_SUBI_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "sub eax, [$d]", instr->data.usrc.var_int); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- break; +- case INSTR_SUBF_VAR_FLOAT : +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_SUBF_VAR_VAR : +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_ISLOWERF_VAR_VAR: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_ISLOWERF_VAR_FLOAT: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_ISLOWERI_VAR_VAR: +- jitc_add(jitc,"mov edx, [$d]", instr->data.udest.var_int); +- jitc_add(jitc,"sub edx, [$d]", instr->data.usrc.var_int); +- jitc_add(jitc,"shr edx, $d", 31); +- break; +- case INSTR_ISLOWERI_VAR_INTEGER: +- jitc_add(jitc,"mov edx, [$d]", instr->data.udest.var_int); +- jitc_add(jitc,"sub edx, $d", instr->data.usrc.value_int); +- jitc_add(jitc,"shr edx, $d", 31); +- break; +- case INSTR_ADDI_VAR_INTEGER: +- jitc_add(jitc, "add [$d], $d", instr->data.udest.var_int, instr->data.usrc.value_int); +- break; +- case INSTR_ADDI_VAR_VAR: +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "add eax, [$d]", instr->data.usrc.var_int); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- break; +- case INSTR_ADDF_VAR_FLOAT: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_ADDF_VAR_VAR: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_MULI_VAR_INTEGER: +- if (instr->data.usrc.value_int != 1) +- { +- int po2 = powerOfTwo(instr->data.usrc.value_int); +- if (po2) { +- /* performs (V / 2^n) by doing V >> n */ +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "sal eax, $d", po2); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- } +- else { +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "imul eax, $d", instr->data.usrc.value_int); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- } +- } +- break; +- case INSTR_MULI_VAR_VAR: +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "imul eax, [$d]", instr->data.usrc.var_int); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- break; +- case INSTR_MULF_VAR_FLOAT: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_MULF_VAR_VAR: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_DIVI_VAR_INTEGER: +- if ((instr->data.usrc.value_int != 1) && (instr->data.usrc.value_int != 0)) +- { +- int po2 = powerOfTwo(instr->data.usrc.value_int); +- if (po2) { +- /* performs (V / 2^n) by doing V >> n */ +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "sar eax, $d", po2); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- } +- else { +- /* performs (V/n) by doing (V*(32^2/n)) */ +- long coef; +- double dcoef = (double)4294967296.0 / (double)instr->data.usrc.value_int; +- if (dcoef < 0.0) dcoef = -dcoef; +- coef = (long)floor(dcoef); +- dcoef -= floor(dcoef); +- if (dcoef < 0.5) coef += 1; +- +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "mov edx, $d", coef); +- jitc_add(jitc, "imul edx"); +- if (instr->data.usrc.value_int < 0) +- jitc_add(jitc, "neg edx"); +- jitc_add(jitc, "mov [$d], edx", instr->data.udest.var_int); +- } +- } +- break; +- case INSTR_DIVI_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "cdq"); /* sign extend eax into edx */ +- jitc_add(jitc, "idiv [$d]", instr->data.usrc.var_int); +- jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); +- break; +- case INSTR_DIVF_VAR_FLOAT: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_DIVF_VAR_VAR: +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_JZERO: +- jitc_add(jitc, "cmp edx, $d", 0); +- jitc_add(jitc, "je $s", instr->jump_label); +- break; +- case INSTR_ISEQUALP_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_ptr); +- jitc_add(jitc, "mov edx, $d", 0); +- jitc_add(jitc, "cmp eax, [$d]", instr->data.usrc.var_ptr); +- jitc_add(jitc, "jne $d", 1); +- jitc_add(jitc, "inc edx"); +- break; +- case INSTR_ISEQUALP_VAR_PTR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_ptr); +- jitc_add(jitc, "mov edx, $d", 0); +- jitc_add(jitc, "cmp eax, $d", instr->data.usrc.value_ptr); +- jitc_add(jitc, "jne $d", 1); +- jitc_add(jitc, "inc edx"); +- break; +- case INSTR_ISEQUALI_VAR_VAR : +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "mov edx, $d", 0); +- jitc_add(jitc, "cmp eax, [$d]", instr->data.usrc.var_int); +- jitc_add(jitc, "jne $d", 1); +- jitc_add(jitc, "inc edx"); +- break; +- case INSTR_ISEQUALI_VAR_INTEGER : +- jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); +- jitc_add(jitc, "mov edx, $d", 0); +- jitc_add(jitc, "cmp eax, $d", instr->data.usrc.value_int); +- jitc_add(jitc, "jne $d", 1); +- jitc_add(jitc, "inc edx"); +- break; +- case INSTR_ISEQUALF_VAR_VAR : +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_ISEQUALF_VAR_FLOAT : +- printf("NOT IMPLEMENTED : %d\n", instr->id); +- break; +- case INSTR_CALL: +- jitc_add(jitc, "call $s", instr->jump_label); +- break; +- case INSTR_RET: +- jitc_add(jitc, "ret"); +- break; +- case INSTR_EXT_CALL: +- jitc_add(jitc, "mov eax, [$d]", &(instr->data.udest.external_function->vars)); +- jitc_add(jitc, "push eax"); +- jitc_add(jitc, "mov edx, [$d]", &(currentGoomSL->vars)); +- jitc_add(jitc, "push edx"); +- jitc_add(jitc, "mov eax, [$d]", &(currentGoomSL)); +- jitc_add(jitc, "push eax"); +- +- jitc_add(jitc, "mov eax, [$d]", &(instr->data.udest.external_function)); +- jitc_add(jitc, "mov eax, [eax]"); +- jitc_add(jitc, "call [eax]"); +- jitc_add(jitc, "add esp, $d", 12); +- break; +- case INSTR_NOT_VAR: +- jitc_add(jitc, "mov eax, edx"); +- jitc_add(jitc, "mov edx, $d", 1); +- jitc_add(jitc, "sub edx, eax"); +- break; +- case INSTR_JNZERO: +- jitc_add(jitc, "cmp edx, $d", 0); +- jitc_add(jitc, "jne $s", instr->jump_label); +- break; +- case INSTR_SETS_VAR_VAR: +- { +- int loop = DEST_STRUCT_SIZE / sizeof(int); +- int dst = (int)pDEST_VAR; +- int src = (int)pSRC_VAR; +- +- while (loop--) { +- jitc_add(jitc,"mov eax, [$d]", src); +- jitc_add(jitc,"mov [$d], eax", dst); +- src += 4; +- dst += 4; +- } +- } +- break; +- case INSTR_ISEQUALS_VAR_VAR: +- break; +- case INSTR_ADDS_VAR_VAR: +- { +- /* process integers */ +- int i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { /* TODO interlace 2 */ +- jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "add eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- } +- ++i; +- } +- /* process floats */ +- i=0; +- while (DEST_STRUCT_FBLOCK(i).size > 0) { +- int j=DEST_STRUCT_FBLOCK(i).size; +- while (j--) { +- /* DEST_STRUCT_FBLOCK_VAR(i,j) += SRC_STRUCT_FBLOCK_VAR(i,j); */ +- /* TODO */ +- } +- ++i; +- } +- break; +- } +- case INSTR_SUBS_VAR_VAR: +- { +- /* process integers */ +- int i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "sub eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- } +- ++i; +- } +- break; +- } +- case INSTR_MULS_VAR_VAR: +- { +- /* process integers */ +- int i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "imul eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- } +- ++i; +- } +- break; +- } +- case INSTR_DIVS_VAR_VAR: +- { +- /* process integers */ +- int i=0; +- while (DEST_STRUCT_IBLOCK(i).size > 0) { +- int j=DEST_STRUCT_IBLOCK(i).size; +- while (j--) { +- jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "cdq"); +- jitc_add(jitc, "idiv [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); +- jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); +- } +- ++i; +- } +- break; +- } +- } +- } +- +- JITC_ADD_LABEL (jitc, "__very_end__"); +- jitc_add(jitc, "call $s", "__very_start__"); +- jitc_add(jitc, "mov eax, $d", 0); +- jitc_validate_func(jitc); +-#else +- InstructionFlow *iflow = currentGoomSL->iflow; +- FastInstructionFlow *fastiflow = (FastInstructionFlow*)malloc(sizeof(FastInstructionFlow)); +- fastiflow->mallocedInstr = calloc(number*16, sizeof(FastInstruction)); +- /* fastiflow->instr = (FastInstruction*)(((int)fastiflow->mallocedInstr) + 16 - (((int)fastiflow->mallocedInstr)%16)); */ +- fastiflow->instr = (FastInstruction*)fastiflow->mallocedInstr; +- fastiflow->number = number; +- for(i=0;i<number;++i) { +- fastiflow->instr[i].id = iflow->instr[i]->id; +- fastiflow->instr[i].data = iflow->instr[i]->data; +- fastiflow->instr[i].proto = iflow->instr[i]; +- } +- currentGoomSL->fastiflow = fastiflow; +-#endif +-} /* }}} */ +- +-void yy_scan_string(const char *str); +-void yyparse(void); +- +-GoomHash *gsl_globals(GoomSL *_this) +-{ +- return _this->vars; +-} +- +- +-/** +- * Some native external functions +- */ +-static void ext_charAt(GoomSL *gsl, GoomHash *global, GoomHash *local) +-{ +- char *string = GSL_LOCAL_PTR(gsl, local, "value"); +- int index = GSL_LOCAL_INT(gsl, local, "index"); +- GSL_GLOBAL_INT(gsl, "charAt") = 0; +- if (string == NULL) { +- return; +- } +- if (index < strlen(string)) +- GSL_GLOBAL_INT(gsl, "charAt") = string[index]; +-} +- +-static void ext_i2f(GoomSL *gsl, GoomHash *global, GoomHash *local) +-{ +- int i = GSL_LOCAL_INT(gsl, local, "value"); +- GSL_GLOBAL_FLOAT(gsl, "i2f") = i; +-} +- +-static void ext_f2i(GoomSL *gsl, GoomHash *global, GoomHash *local) +-{ +- float f = GSL_LOCAL_FLOAT(gsl, local, "value"); +- GSL_GLOBAL_INT(gsl, "f2i") = f; +-} +- +-/** +- * +- */ +-void gsl_compile(GoomSL *_currentGoomSL, const char *script) +-{ /* {{{ */ +- char *script_and_externals; +- static const char *sBinds = +- "external <charAt: string value, int index> : int\n" +- "external <f2i: float value> : int\n" +- "external <i2f: int value> : float\n"; +- +-#ifdef VERBOSE +- printf("\n=== Starting Compilation ===\n"); +-#endif +- +- script_and_externals = malloc(strlen(script) + strlen(sBinds) + 2); +- strcpy(script_and_externals, sBinds); +- strcat(script_and_externals, script); +- +- /* 0- reset */ +- currentGoomSL = _currentGoomSL; +- reset_scanner(currentGoomSL); +- +- /* 1- create the syntaxic tree */ +- yy_scan_string(script_and_externals); +- yyparse(); +- +- /* 2- generate code */ +- gsl_commit_compilation(); +- +- /* 3- resolve symbols */ +- calculate_labels(currentGoomSL->iflow); +- +- /* 4- optimize code */ +- gsl_create_fast_iflow(); +- +- /* 5- bind a few internal functions */ +- gsl_bind_function(currentGoomSL, "charAt", ext_charAt); +- gsl_bind_function(currentGoomSL, "f2i", ext_f2i); +- gsl_bind_function(currentGoomSL, "i2f", ext_i2f); +- free(script_and_externals); +- +-#ifdef VERBOSE +- printf("=== Compilation done. # of lines: %d. # of instr: %d ===\n", currentGoomSL->num_lines, currentGoomSL->iflow->number); +-#endif +-} /* }}} */ +- +-void gsl_execute(GoomSL *scanner) +-{ /* {{{ */ +- if (scanner->compilationOK) { +-#if USE_JITC_X86 +- scanner->jitc_func(); +-#else +- iflow_execute(scanner->fastiflow, scanner); +-#endif +- } +-} /* }}} */ +- +-GoomSL *gsl_new(void) +-{ /* {{{ */ +- GoomSL *gss = (GoomSL*)malloc(sizeof(GoomSL)); +- +- gss->iflow = iflow_new(); +- gss->vars = goom_hash_new(); +- gss->functions = goom_hash_new(); +- gss->nbStructID = 0; +- gss->structIDS = goom_hash_new(); +- gss->gsl_struct_size = 32; +- gss->gsl_struct = (GSL_Struct**)malloc(gss->gsl_struct_size * sizeof(GSL_Struct*)); +- gss->currentNS = 0; +- gss->namespaces[0] = gss->vars; +- gss->data_heap = goom_heap_new(); +- +- reset_scanner(gss); +- +- gss->compilationOK = 0; +- gss->nbPtr=0; +- gss->ptrArraySize=256; +- gss->ptrArray = (void**)malloc(gss->ptrArraySize * sizeof(void*)); +-#ifdef USE_JITC_X86 +- gss->jitc = NULL; +-#endif +- return gss; +-} /* }}} */ +- +-void gsl_bind_function(GoomSL *gss, const char *fname, GoomSL_ExternalFunction func) +-{ /* {{{ */ +- HashValue *val = goom_hash_get(gss->functions, fname); +- if (val) { +- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)val->ptr; +- gef->function = func; +- } +- else fprintf(stderr, "Unable to bind function %s\n", fname); +-} /* }}} */ +- +-int gsl_is_compiled(GoomSL *gss) +-{ /* {{{ */ +- return gss->compilationOK; +-} /* }}} */ +- +-void gsl_free(GoomSL *gss) +-{ /* {{{ */ +- iflow_free(gss->iflow); +- free(gss->vars); +- free(gss->functions); +- free(gss); +-} /* }}} */ +- +- +-static int gsl_nb_import; +-static char gsl_already_imported[256][256]; +- +-char *gsl_init_buffer(const char *fname) +-{ +- char *fbuffer; +- fbuffer = (char*)malloc(512); +- fbuffer[0]=0; +- gsl_nb_import = 0; +- if (fname) +- gsl_append_file_to_buffer(fname,&fbuffer); +- return fbuffer; +-} +- +-static char *gsl_read_file(const char *fname) +-{ +- FILE *f; +- char *buffer; +- int fsize; +- f = fopen(fname,"rt"); +- if (!f) { +- fprintf(stderr, "ERROR: Could not load file %s\n", fname); +- exit(1); +- } +- fseek(f,0,SEEK_END); +- fsize = ftell(f); +- rewind(f); +- buffer = (char*)malloc(fsize+512); +- fread(buffer,1,fsize,f); +- fclose(f); +- buffer[fsize]=0; +- return buffer; +-} +- +-void gsl_append_file_to_buffer(const char *fname, char **buffer) +-{ +- char *fbuffer; +- int size,fsize,i=0; +- char reset_msg[256]; +- +- /* look if the file have not been already imported */ +- for (i=0;i<gsl_nb_import;++i) { +- if (strcmp(gsl_already_imported[i], fname) == 0) +- return; +- } +- +- /* add fname to the already imported files. */ +- strcpy(gsl_already_imported[gsl_nb_import++], fname); +- +- /* load the file */ +- fbuffer = gsl_read_file(fname); +- fsize = strlen(fbuffer); +- +- /* look for #import */ +- while (fbuffer[i]) { +- if ((fbuffer[i]=='#') && (fbuffer[i+1]=='i')) { +- char impName[256]; +- int j; +- while (fbuffer[i] && (fbuffer[i]!=' ')) +- i++; +- i++; +- j=0; +- while (fbuffer[i] && (fbuffer[i]!='\n')) +- impName[j++] = fbuffer[i++]; +- impName[j++] = 0; +- gsl_append_file_to_buffer(impName, buffer); +- } +- i++; +- } +- +- sprintf(reset_msg, "\n#FILE %s#\n#RST_LINE#\n", fname); +- strcat(*buffer, reset_msg); +- size=strlen(*buffer); +- *buffer = (char*)realloc(*buffer, size+fsize+256); +- strcat((*buffer)+size, fbuffer); +- free(fbuffer); +-} +- +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl.h /src/goomsl.h +--- /home/d4rk/goom2k4-0/src/goomsl.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,34 +0,0 @@ +-#ifndef _GOOMSL_H +-#define _GOOMSL_H +- +-#include "goomsl_hash.h" +- +-typedef struct _GoomSL GoomSL; +-typedef void (*GoomSL_ExternalFunction)(GoomSL *gsl, GoomHash *global_vars, GoomHash *local_vars); +- +-GoomSL*gsl_new(void); +-void gsl_free(GoomSL *gss); +- +-char *gsl_init_buffer(const char *file_name); +-void gsl_append_file_to_buffer(const char *file_name, char **buffer); +- +-void gsl_compile (GoomSL *scanner, const char *script); +-void gsl_execute (GoomSL *scanner); +-int gsl_is_compiled (GoomSL *gss); +-void gsl_bind_function(GoomSL *gss, const char *fname, GoomSL_ExternalFunction func); +- +-int gsl_malloc (GoomSL *_this, int size); +-void *gsl_get_ptr (GoomSL *_this, int id); +-void gsl_free_ptr(GoomSL *_this, int id); +- +-GoomHash *gsl_globals(GoomSL *_this); +- +-#define GSL_LOCAL_PTR(gsl,local,name) gsl_get_ptr(gsl, *(int*)goom_hash_get(local,name)->ptr) +-#define GSL_LOCAL_INT(gsl,local,name) (*(int*)goom_hash_get(local,name)->ptr) +-#define GSL_LOCAL_FLOAT(gsl,local,name) (*(float*)goom_hash_get(local,name)->ptr) +- +-#define GSL_GLOBAL_PTR(gsl,name) gsl_get_ptr(gsl, *(int*)goom_hash_get(gsl_globals(gsl),name)->ptr) +-#define GSL_GLOBAL_INT(gsl,name) (*(int*)goom_hash_get(gsl_globals(gsl),name)->ptr) +-#define GSL_GLOBAL_FLOAT(gsl,name) (*(float*)goom_hash_get(gsl_globals(gsl),name)->ptr) +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_hash.c /src/goomsl_hash.c +--- /home/d4rk/goom2k4-0/src/goomsl_hash.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_hash.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,120 +0,0 @@ +-#include "goomsl_hash.h" +-#include <string.h> +-#include <stdlib.h> +- +-static GoomHashEntry *entry_new(const char *key, HashValue value) { +- +- int len = strlen(key); +- GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry)); +- +- entry->key = (char *)malloc(len+1); +- memcpy(entry->key,key,len+1); +- entry->value = value; +- entry->lower = NULL; +- entry->upper = NULL; +- +- return entry; +-} +- +-static void entry_free(GoomHashEntry *entry) { +- if (entry!=NULL) { +- entry_free(entry->lower); +- entry_free(entry->upper); +- free(entry->key); +- free(entry); +- } +-} +- +-static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) { +- int cmp = strcmp(key,entry->key); +- if (cmp==0) { +- entry->value = value; +- } +- else if (cmp > 0) { +- if (entry->upper == NULL) +- entry->upper = entry_new(key,value); +- else +- entry_put(entry->upper, key, value); +- } +- else { +- if (entry->lower == NULL) +- entry->lower = entry_new(key,value); +- else +- entry_put(entry->lower, key, value); +- } +-} +- +-static HashValue *entry_get(GoomHashEntry *entry, const char *key) { +- +- int cmp; +- if (entry==NULL) +- return NULL; +- cmp = strcmp(key,entry->key); +- if (cmp > 0) +- return entry_get(entry->upper, key); +- else if (cmp < 0) +- return entry_get(entry->lower, key); +- else +- return &(entry->value); +-} +- +-GoomHash *goom_hash_new() { +- GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash)); +- _this->root = NULL; +- _this->number_of_puts = 0; +- return _this; +-} +- +-void goom_hash_free(GoomHash *_this) { +- entry_free(_this->root); +- free(_this); +-} +- +-void goom_hash_put(GoomHash *_this, const char *key, HashValue value) { +- _this->number_of_puts += 1; +- if (_this->root == NULL) +- _this->root = entry_new(key,value); +- else +- entry_put(_this->root,key,value); +-} +- +-HashValue *goom_hash_get(GoomHash *_this, const char *key) { +- if (_this == NULL) return NULL; +- return entry_get(_this->root,key); +-} +- +-void goom_hash_put_int(GoomHash *_this, const char *key, int i) { +- HashValue value; +- value.i = i; +- goom_hash_put(_this,key,value); +-} +- +-void goom_hash_put_float(GoomHash *_this, const char *key, float f) { +- HashValue value; +- value.f = f; +- goom_hash_put(_this,key,value); +-} +- +-void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) { +- HashValue value; +- value.ptr = ptr; +- goom_hash_put(_this,key,value); +-} +- +-/* FOR EACH */ +- +-static void _goom_hash_for_each(GoomHash *_this, GoomHashEntry *entry, GH_Func func) +-{ +- if (entry == NULL) return; +- func(_this, entry->key, &(entry->value)); +- _goom_hash_for_each(_this, entry->lower, func); +- _goom_hash_for_each(_this, entry->upper, func); +-} +- +-void goom_hash_for_each(GoomHash *_this, GH_Func func) { +- _goom_hash_for_each(_this, _this->root, func); +-} +- +-int goom_hash_number_of_puts(GoomHash *_this) { +- return _this->number_of_puts; +-} +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_hash.h /src/goomsl_hash.h +--- /home/d4rk/goom2k4-0/src/goomsl_hash.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_hash.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,40 +0,0 @@ +-#ifndef _GOOMSL_HASH_H +-#define _GOOMSL_HASH_H +- +-typedef struct GOOM_HASH_ENTRY GoomHashEntry; +-typedef struct GOOM_HASH GoomHash; +- +-typedef union { +- void *ptr; +- int i; +- float f; +-} HashValue; +- +-struct GOOM_HASH_ENTRY { +- char *key; +- HashValue value; +- GoomHashEntry *lower; +- GoomHashEntry *upper; +-}; +- +-struct GOOM_HASH { +- GoomHashEntry *root; +- int number_of_puts; +-}; +- +-GoomHash *goom_hash_new(); +-void goom_hash_free(GoomHash *gh); +- +-void goom_hash_put(GoomHash *gh, const char *key, HashValue value); +-HashValue *goom_hash_get(GoomHash *gh, const char *key); +- +-void goom_hash_put_int (GoomHash *_this, const char *key, int i); +-void goom_hash_put_float(GoomHash *_this, const char *key, float f); +-void goom_hash_put_ptr (GoomHash *_this, const char *key, void *ptr); +- +-typedef void (*GH_Func)(GoomHash *caller, const char *key, HashValue *value); +- +-void goom_hash_for_each(GoomHash *_this, GH_Func func); +-int goom_hash_number_of_puts(GoomHash *_this); +- +-#endif /* _GOOM_HASH_H */ +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_heap.c /src/goomsl_heap.c +--- /home/d4rk/goom2k4-0/src/goomsl_heap.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_heap.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,105 +0,0 @@ +-#include "goomsl_heap.h" +-#include <stdlib.h> +- +-struct _GOOM_HEAP { +- void **arrays; +- int number_of_arrays; +- int size_of_each_array; +- int consumed_in_last_array; +-}; +- +-/* Constructors / Destructor */ +-GoomHeap *goom_heap_new(void) +-{ +- return goom_heap_new_with_granularity(4096); +-} +- +-GoomHeap *goom_heap_new_with_granularity(int granularity) +-{ +- GoomHeap *_this; +- _this = (GoomHeap*)malloc(sizeof(GoomHeap)); +- _this->number_of_arrays = 0; +- _this->size_of_each_array = granularity; +- _this->consumed_in_last_array = 0; +- _this->arrays = (void**)malloc(sizeof(void*)); +- return _this; +-} +- +-void goom_heap_delete(GoomHeap *_this) +-{ +- int i; +- for (i=0;i<_this->number_of_arrays;++i) { +- free(_this->arrays[i]); +- } +- free(_this->arrays); +- free(_this); +-} +- +-static void align_it(GoomHeap *_this, int alignment) +-{ +- if ((alignment > 1) && (_this->number_of_arrays>0)) { +- void *last_array = _this->arrays[_this->number_of_arrays - 1]; +- int last_address = (int)last_array + _this->consumed_in_last_array; +- int decal = (last_address % alignment); +- if (decal != 0) { +- _this->consumed_in_last_array += alignment - decal; +- } +- } +-} +- +-void *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes, +- int alignment, int prefix_bytes) +-{ +- void *retval = NULL; +- +- /* d'abord on gere les problemes d'alignement */ +- _this->consumed_in_last_array += prefix_bytes; +- align_it(_this, alignment); +- +- /* ensuite on verifie que la quantite de memoire demandee tient dans le buffer */ +- if ((_this->consumed_in_last_array + nb_bytes >= _this->size_of_each_array) +- || (_this->number_of_arrays == 0)) { +- +- if (prefix_bytes + nb_bytes + alignment >= _this->size_of_each_array) { +- +- /* Si la zone demandee est plus grosse que la granularitee */ +- /* On alloue un buffer plus gros que les autres */ +- _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * (_this->number_of_arrays+2)); +- +- _this->number_of_arrays += 1; +- _this->consumed_in_last_array = prefix_bytes; +- +- _this->arrays[_this->number_of_arrays - 1] = malloc(prefix_bytes + nb_bytes + alignment); +- align_it(_this,alignment); +- retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array); +- +- /* puis on repart sur un nouveau buffer vide */ +- _this->number_of_arrays += 1; +- _this->consumed_in_last_array = 0; +- _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array); +- return retval; +- } +- else { +- _this->number_of_arrays += 1; +- _this->consumed_in_last_array = prefix_bytes; +- _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * _this->number_of_arrays); +- +- _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array); +- align_it(_this,alignment); +- } +- } +- retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array); +- _this->consumed_in_last_array += nb_bytes; +- return retval; +-} +- +-void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment) +-{ +- return goom_heap_malloc_with_alignment_prefixed(_this, nb_bytes, alignment, 0); +-} +- +-void *goom_heap_malloc(GoomHeap *_this, int nb_bytes) +-{ +- return goom_heap_malloc_with_alignment(_this,nb_bytes,1); +-} +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_heap.h /src/goomsl_heap.h +--- /home/d4rk/goom2k4-0/src/goomsl_heap.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_heap.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,29 +0,0 @@ +-#ifndef GOOMSL_HEAP +-#define GOOMSL_HEAP +- +-/** +- * Resizable Array that guarranty that resizes don't change address of +- * the stored datas. +- * +- * This is implemented as an array of arrays... granularity is the size +- * of each arrays. +- */ +- +-typedef struct _GOOM_HEAP GoomHeap; +- +-/* Constructors / Destructor */ +-GoomHeap *goom_heap_new(void); +-GoomHeap *goom_heap_new_with_granularity(int granularity); +-void goom_heap_delete(GoomHeap *_this); +- +-/* This method behaves like malloc. */ +-void *goom_heap_malloc(GoomHeap *_this, int nb_bytes); +-/* This adds an alignment constraint. */ +-void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment); +- +-/* Returns a pointeur on the bytes... prefix is before */ +-void *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes, +- int alignment, int prefix_bytes); +- +-#endif +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_lex.c /src/goomsl_lex.c +--- /home/d4rk/goom2k4-0/src/goomsl_lex.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_lex.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,2108 +0,0 @@ +-#line 2 "goomsl_lex.c" +- +-#line 4 "goomsl_lex.c" +- +-#define YY_INT_ALIGNED short int +- +-/* A lexical scanner generated by flex */ +- +-#define FLEX_SCANNER +-#define YY_FLEX_MAJOR_VERSION 2 +-#define YY_FLEX_MINOR_VERSION 5 +-#define YY_FLEX_SUBMINOR_VERSION 31 +-#if YY_FLEX_SUBMINOR_VERSION > 0 +-#define FLEX_BETA +-#endif +- +-/* First, we deal with platform-specific or compiler-specific issues. */ +- +-/* begin standard C headers. */ +-#include <stdio.h> +-#include <string.h> +-#include <errno.h> +-#include <stdlib.h> +- +-/* end standard C headers. */ +- +-/* flex integer type definitions */ +- +-#ifndef FLEXINT_H +-#define FLEXINT_H +- +-/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */ +- +-#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L +-#include <inttypes.h> +-typedef int8_t flex_int8_t; +-typedef uint8_t flex_uint8_t; +-typedef int16_t flex_int16_t; +-typedef uint16_t flex_uint16_t; +-typedef int32_t flex_int32_t; +-typedef uint32_t flex_uint32_t; +-#else +-typedef signed char flex_int8_t; +-typedef short int flex_int16_t; +-typedef int flex_int32_t; +-typedef unsigned char flex_uint8_t; +-typedef unsigned short int flex_uint16_t; +-typedef unsigned int flex_uint32_t; +-#endif /* ! C99 */ +- +-/* Limits of integral types. */ +-#ifndef INT8_MIN +-#define INT8_MIN (-128) +-#endif +-#ifndef INT16_MIN +-#define INT16_MIN (-32767-1) +-#endif +-#ifndef INT32_MIN +-#define INT32_MIN (-2147483647-1) +-#endif +-#ifndef INT8_MAX +-#define INT8_MAX (127) +-#endif +-#ifndef INT16_MAX +-#define INT16_MAX (32767) +-#endif +-#ifndef INT32_MAX +-#define INT32_MAX (2147483647) +-#endif +-#ifndef UINT8_MAX +-#define UINT8_MAX (255U) +-#endif +-#ifndef UINT16_MAX +-#define UINT16_MAX (65535U) +-#endif +-#ifndef UINT32_MAX +-#define UINT32_MAX (4294967295U) +-#endif +- +-#endif /* ! FLEXINT_H */ +- +-#ifdef __cplusplus +- +-/* The "const" storage-class-modifier is valid. */ +-#define YY_USE_CONST +- +-#else /* ! __cplusplus */ +- +-#if __STDC__ +- +-#define YY_USE_CONST +- +-#endif /* __STDC__ */ +-#endif /* ! __cplusplus */ +- +-#ifdef YY_USE_CONST +-#define yyconst const +-#else +-#define yyconst +-#endif +- +-/* Returned upon end-of-file. */ +-#define YY_NULL 0 +- +-/* Promotes a possibly negative, possibly signed char to an unsigned +- * integer for use as an array index. If the signed char is negative, +- * we want to instead treat it as an 8-bit unsigned char, hence the +- * double cast. +- */ +-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) +- +-/* Enter a start condition. This macro really ought to take a parameter, +- * but we do it the disgusting crufty way forced on us by the ()-less +- * definition of BEGIN. +- */ +-#define BEGIN (yy_start) = 1 + 2 * +- +-/* Translate the current start state into a value that can be later handed +- * to BEGIN to return to the state. The YYSTATE alias is for lex +- * compatibility. +- */ +-#define YY_START (((yy_start) - 1) / 2) +-#define YYSTATE YY_START +- +-/* Action number for EOF rule of a given start state. */ +-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) +- +-/* Special action meaning "start processing a new file". */ +-#define YY_NEW_FILE yyrestart(yyin ) +- +-#define YY_END_OF_BUFFER_CHAR 0 +- +-/* Size of default input buffer. */ +-#ifndef YY_BUF_SIZE +-#define YY_BUF_SIZE 16384 +-#endif +- +-#ifndef YY_TYPEDEF_YY_BUFFER_STATE +-#define YY_TYPEDEF_YY_BUFFER_STATE +-typedef struct yy_buffer_state *YY_BUFFER_STATE; +-#endif +- +-extern int yyleng; +- +-extern FILE *yyin, *yyout; +- +-#define EOB_ACT_CONTINUE_SCAN 0 +-#define EOB_ACT_END_OF_FILE 1 +-#define EOB_ACT_LAST_MATCH 2 +- +- /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires +- * access to the local variable yy_act. Since yyless() is a macro, it would break +- * existing scanners that call yyless() from OUTSIDE yylex. +- * One obvious solution it to make yy_act a global. I tried that, and saw +- * a 5% performance hit in a non-yylineno scanner, because yy_act is +- * normally declared as a register variable-- so it is not worth it. +- */ +- #define YY_LESS_LINENO(n) \ +- do { \ +- int yyl;\ +- for ( yyl = n; yyl < yyleng; ++yyl )\ +- if ( yytext[yyl] == '\n' )\ +- --yylineno;\ +- }while(0) +- +-/* Return all but the first "n" matched characters back to the input stream. */ +-#define yyless(n) \ +- do \ +- { \ +- /* Undo effects of setting up yytext. */ \ +- int yyless_macro_arg = (n); \ +- YY_LESS_LINENO(yyless_macro_arg);\ +- *yy_cp = (yy_hold_char); \ +- YY_RESTORE_YY_MORE_OFFSET \ +- (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ +- YY_DO_BEFORE_ACTION; /* set up yytext again */ \ +- } \ +- while ( 0 ) +- +-#define unput(c) yyunput( c, (yytext_ptr) ) +- +-/* The following is because we cannot portably get our hands on size_t +- * (without autoconf's help, which isn't available because we want +- * flex-generated scanners to compile on their own). +- */ +- +-#ifndef YY_TYPEDEF_YY_SIZE_T +-#define YY_TYPEDEF_YY_SIZE_T +-typedef unsigned int yy_size_t; +-#endif +- +-#ifndef YY_STRUCT_YY_BUFFER_STATE +-#define YY_STRUCT_YY_BUFFER_STATE +-struct yy_buffer_state +- { +- FILE *yy_input_file; +- +- char *yy_ch_buf; /* input buffer */ +- char *yy_buf_pos; /* current position in input buffer */ +- +- /* Size of input buffer in bytes, not including room for EOB +- * characters. +- */ +- yy_size_t yy_buf_size; +- +- /* Number of characters read into yy_ch_buf, not including EOB +- * characters. +- */ +- int yy_n_chars; +- +- /* Whether we "own" the buffer - i.e., we know we created it, +- * and can realloc() it to grow it, and should free() it to +- * delete it. +- */ +- int yy_is_our_buffer; +- +- /* Whether this is an "interactive" input source; if so, and +- * if we're using stdio for input, then we want to use getc() +- * instead of fread(), to make sure we stop fetching input after +- * each newline. +- */ +- int yy_is_interactive; +- +- /* Whether we're considered to be at the beginning of a line. +- * If so, '^' rules will be active on the next match, otherwise +- * not. +- */ +- int yy_at_bol; +- +- int yy_bs_lineno; /**< The line count. */ +- int yy_bs_column; /**< The column count. */ +- +- /* Whether to try to fill the input buffer when we reach the +- * end of it. +- */ +- int yy_fill_buffer; +- +- int yy_buffer_status; +- +-#define YY_BUFFER_NEW 0 +-#define YY_BUFFER_NORMAL 1 +- /* When an EOF's been seen but there's still some text to process +- * then we mark the buffer as YY_EOF_PENDING, to indicate that we +- * shouldn't try reading from the input source any more. We might +- * still have a bunch of tokens to match, though, because of +- * possible backing-up. +- * +- * When we actually see the EOF, we change the status to "new" +- * (via yyrestart()), so that the user can continue scanning by +- * just pointing yyin at a new input file. +- */ +-#define YY_BUFFER_EOF_PENDING 2 +- +- }; +-#endif /* !YY_STRUCT_YY_BUFFER_STATE */ +- +-/* Stack of input buffers. */ +-static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +-static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +-static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ +- +-/* We provide macros for accessing buffer states in case in the +- * future we want to put the buffer states in a more general +- * "scanner state". +- * +- * Returns the top of the stack, or NULL. +- */ +-#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ +- ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ +- : NULL) +- +-/* Same as previous macro, but useful when we know that the buffer stack is not +- * NULL or when we need an lvalue. For internal use only. +- */ +-#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] +- +-/* yy_hold_char holds the character lost when yytext is formed. */ +-static char yy_hold_char; +-static int yy_n_chars; /* number of characters read into yy_ch_buf */ +-int yyleng; +- +-/* Points to current character in buffer. */ +-static char *yy_c_buf_p = (char *) 0; +-static int yy_init = 1; /* whether we need to initialize */ +-static int yy_start = 0; /* start state number */ +- +-/* Flag which is used to allow yywrap()'s to do buffer switches +- * instead of setting up a fresh yyin. A bit of a hack ... +- */ +-static int yy_did_buffer_switch_on_eof; +- +-void yyrestart (FILE *input_file ); +-void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +-YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); +-void yy_delete_buffer (YY_BUFFER_STATE b ); +-void yy_flush_buffer (YY_BUFFER_STATE b ); +-void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); +-void yypop_buffer_state (void ); +- +-static void yyensure_buffer_stack (void ); +-static void yy_load_buffer_state (void ); +-static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); +- +-#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) +- +-YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); +-YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); +-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); +- +-void *yyalloc (yy_size_t ); +-void *yyrealloc (void *,yy_size_t ); +-void yyfree (void * ); +- +-#define yy_new_buffer yy_create_buffer +- +-#define yy_set_interactive(is_interactive) \ +- { \ +- if ( ! YY_CURRENT_BUFFER ){ \ +- yyensure_buffer_stack (); \ +- YY_CURRENT_BUFFER_LVALUE = \ +- yy_create_buffer(yyin,YY_BUF_SIZE ); \ +- } \ +- YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ +- } +- +-#define yy_set_bol(at_bol) \ +- { \ +- if ( ! YY_CURRENT_BUFFER ){\ +- yyensure_buffer_stack (); \ +- YY_CURRENT_BUFFER_LVALUE = \ +- yy_create_buffer(yyin,YY_BUF_SIZE ); \ +- } \ +- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ +- } +- +-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) +- +-/* Begin user sect3 */ +- +-typedef unsigned char YY_CHAR; +- +-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +- +-typedef int yy_state_type; +- +-#define YY_FLEX_LEX_COMPAT +-extern int yylineno; +- +-int yylineno = 1; +- +-extern char yytext[]; +- +-static yy_state_type yy_get_previous_state (void ); +-static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +-static int yy_get_next_buffer (void ); +-static void yy_fatal_error (yyconst char msg[] ); +- +-/* Done after the current pattern has been matched and before the +- * corresponding action - sets up yytext. +- */ +-#define YY_DO_BEFORE_ACTION \ +- (yytext_ptr) = yy_bp; \ +- yyleng = (size_t) (yy_cp - yy_bp); \ +- (yy_hold_char) = *yy_cp; \ +- *yy_cp = '\0'; \ +- if ( yyleng + (yy_more_offset) >= YYLMAX ) \ +- YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ +- yy_flex_strncpy( &yytext[(yy_more_offset)], (yytext_ptr), yyleng + 1 ); \ +- yyleng += (yy_more_offset); \ +- (yy_prev_more_offset) = (yy_more_offset); \ +- (yy_more_offset) = 0; \ +- (yy_c_buf_p) = yy_cp; +- +-#define YY_NUM_RULES 49 +-#define YY_END_OF_BUFFER 50 +-/* This struct is not used in this scanner, +- but its presence is necessary. */ +-struct yy_trans_info +- { +- flex_int32_t yy_verify; +- flex_int32_t yy_nxt; +- }; +-static yyconst flex_int16_t yy_acclist[214] = +- { 0, +- 50, 48, 49, 47, 48, 49, 4, 49, 48, 49, +- 13, 48, 49, 10, 48, 49, 33, 48, 49, 48, +- 49, 48, 49, 48, 49, 48, 49, 48, 49, 34, +- 48, 49, 34, 48, 49, 48, 49, 48, 49, 33, +- 48, 49, 33, 48, 49, 33, 48, 49, 33, 48, +- 49, 33, 48, 49, 33, 48, 49, 33, 48, 49, +- 33, 48, 49, 33, 48, 49, 33, 48, 49, 47, +- 48, 49, 1, 4, 49, 48, 49, 7, 49, 6, +- 49, 7, 49, 7, 49, 1, 6, 49, 7, 49, +- 3, 49, 1, 3, 49, 17, 49, 49, 16, 17, +- +- 49, 17, 49, 47, 45, 10, 10, 10, 33, 40, +- 39, 41, 11, 12, 42, 38, 37, 34, 43, 46, +- 44, 33, 33, 28, 33, 33, 33, 33, 33, 30, +- 33, 33, 33, 33, 33, 33, 47, 1, 12, 5, +- 15, 14, 10, 10, 35, 37, 36, 33, 33, 33, +- 33, 33, 29, 33, 19, 33, 26, 33, 21, 33, +- 33, 33, 33, 2, 10, 10, 33, 33, 33, 33, +- 33, 33, 33, 31, 33, 33, 10, 10, 33, 33, +- 33, 32, 33, 18, 33, 33, 33, 27, 33, 10, +- 10, 33, 33, 33, 22, 33, 25, 33, 10, 9, +- +- 10, 10, 20, 33, 23, 33, 33, 10, 24, 33, +- 10, 8, 10 +- } ; +- +-static yyconst flex_int16_t yy_accept[152] = +- { 0, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, +- 4, 7, 9, 11, 14, 17, 20, 22, 24, 26, +- 28, 30, 33, 36, 38, 40, 43, 46, 49, 52, +- 55, 58, 61, 64, 67, 70, 73, 76, 78, 80, +- 82, 84, 86, 89, 91, 93, 96, 98, 99, 102, +- 104, 105, 106, 107, 108, 109, 110, 110, 111, 112, +- 113, 114, 115, 116, 117, 118, 119, 119, 120, 121, +- 122, 123, 124, 126, 127, 128, 129, 130, 132, 133, +- 134, 135, 136, 137, 138, 139, 139, 140, 141, 141, +- 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, +- +- 151, 152, 153, 155, 157, 159, 161, 162, 163, 164, +- 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, +- 174, 176, 177, 178, 179, 180, 181, 182, 184, 186, +- 187, 188, 190, 191, 192, 193, 194, 195, 197, 199, +- 200, 202, 203, 205, 207, 208, 209, 211, 212, 214, +- 214 +- } ; +- +-static yyconst flex_int32_t yy_ec[256] = +- { 0, +- 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 4, 5, 6, 7, 1, 8, 9, 10, 1, +- 1, 11, 12, 1, 13, 14, 15, 16, 17, 17, +- 17, 17, 17, 17, 17, 17, 17, 1, 1, 18, +- 19, 20, 1, 9, 21, 21, 21, 21, 22, 23, +- 21, 21, 24, 21, 21, 25, 21, 26, 21, 21, +- 21, 27, 28, 29, 21, 21, 21, 21, 21, 21, +- 1, 30, 1, 1, 31, 1, 32, 33, 34, 35, +- +- 36, 37, 38, 39, 40, 21, 21, 41, 21, 42, +- 43, 44, 21, 45, 46, 47, 48, 21, 49, 50, +- 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1 +- } ; +- +-static yyconst flex_int32_t yy_meta[51] = +- { 0, +- 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 3, 1, 4, 4, 1, 1, 1, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, +- 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 +- } ; +- +-static yyconst flex_int16_t yy_base[159] = +- { 0, +- 0, 49, 51, 54, 221, 57, 60, 64, 223, 225, +- 69, 225, 203, 225, 51, 0, 0, 202, 201, 200, +- 64, 68, 72, 72, 199, 174, 57, 166, 55, 173, +- 171, 166, 165, 166, 171, 99, 225, 93, 225, 225, +- 194, 107, 225, 193, 225, 225, 225, 225, 225, 71, +- 93, 225, 0, 183, 178, 0, 195, 225, 225, 225, +- 225, 225, 225, 225, 89, 107, 0, 225, 225, 225, +- 161, 169, 0, 155, 160, 157, 154, 151, 150, 151, +- 150, 146, 153, 123, 225, 177, 188, 225, 126, 187, +- 225, 225, 164, 159, 225, 100, 0, 146, 145, 149, +- +- 138, 151, 0, 0, 0, 0, 59, 146, 140, 177, +- 225, 157, 147, 141, 144, 130, 138, 126, 130, 137, +- 0, 134, 165, 143, 133, 112, 109, 0, 0, 102, +- 92, 0, 130, 112, 93, 98, 101, 0, 0, 125, +- 124, 94, 0, 0, 78, 59, 0, 61, 0, 225, +- 141, 145, 149, 151, 155, 51, 159, 163 +- } ; +- +-static yyconst flex_int16_t yy_def[159] = +- { 0, +- 150, 1, 151, 151, 151, 151, 152, 152, 150, 150, +- 150, 150, 150, 150, 153, 154, 155, 150, 150, 150, +- 150, 150, 150, 150, 150, 154, 154, 154, 154, 154, +- 154, 154, 154, 154, 154, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 153, 153, 153, 154, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 156, 150, 150, 150, +- 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, +- 154, 154, 154, 150, 150, 150, 157, 150, 150, 157, +- 150, 150, 153, 153, 150, 150, 156, 154, 154, 154, +- +- 154, 154, 154, 154, 154, 154, 154, 154, 154, 157, +- 150, 153, 153, 154, 154, 154, 154, 154, 154, 154, +- 154, 154, 153, 153, 154, 154, 154, 154, 154, 154, +- 154, 154, 158, 153, 154, 154, 154, 154, 154, 158, +- 158, 153, 154, 154, 154, 153, 154, 153, 153, 0, +- 150, 150, 150, 150, 150, 150, 150, 150 +- } ; +- +-static yyconst flex_int16_t yy_nxt[276] = +- { 0, +- 10, 11, 12, 11, 13, 14, 15, 10, 16, 17, +- 18, 19, 20, 10, 21, 22, 23, 24, 10, 25, +- 16, 16, 16, 16, 16, 16, 16, 16, 16, 10, +- 16, 16, 26, 16, 27, 28, 29, 16, 16, 30, +- 16, 31, 16, 32, 16, 33, 34, 16, 35, 16, +- 36, 37, 36, 40, 97, 42, 43, 42, 42, 46, +- 42, 41, 48, 38, 41, 49, 48, 149, 44, 49, +- 51, 44, 51, 54, 61, 64, 91, 55, 62, 64, +- 148, 65, 63, 66, 66, 65, 75, 66, 66, 50, +- 68, 69, 72, 50, 51, 76, 51, 77, 119, 73, +- +- 84, 85, 84, 61, 96, 96, 120, 87, 89, 85, +- 89, 63, 92, 86, 64, 96, 96, 67, 147, 146, +- 65, 86, 66, 66, 84, 85, 84, 89, 85, 89, +- 141, 141, 145, 144, 143, 142, 141, 86, 139, 138, +- 86, 39, 39, 39, 39, 47, 47, 47, 47, 53, +- 137, 53, 53, 56, 56, 57, 136, 57, 57, 110, +- 110, 110, 110, 140, 135, 140, 140, 134, 133, 132, +- 131, 130, 129, 128, 127, 126, 125, 124, 123, 111, +- 122, 121, 118, 117, 116, 115, 114, 113, 112, 111, +- 111, 90, 109, 108, 107, 106, 105, 104, 103, 102, +- +- 101, 100, 99, 98, 95, 94, 93, 90, 88, 83, +- 82, 81, 80, 79, 78, 74, 71, 70, 60, 59, +- 58, 52, 150, 45, 9, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150 +- } ; +- +-static yyconst flex_int16_t yy_chk[276] = +- { 0, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +- 2, 2, 2, 3, 156, 4, 4, 4, 6, 6, +- 6, 3, 7, 2, 4, 7, 8, 148, 4, 8, +- 11, 6, 11, 15, 21, 22, 50, 15, 21, 23, +- 146, 22, 21, 22, 22, 23, 29, 23, 23, 7, +- 24, 24, 27, 8, 51, 29, 51, 29, 107, 27, +- +- 36, 36, 36, 38, 65, 65, 107, 38, 42, 42, +- 42, 38, 50, 36, 66, 96, 96, 22, 145, 142, +- 66, 42, 66, 66, 84, 84, 84, 89, 89, 89, +- 141, 140, 137, 136, 135, 134, 133, 84, 131, 130, +- 89, 151, 151, 151, 151, 152, 152, 152, 152, 153, +- 127, 153, 153, 154, 154, 155, 126, 155, 155, 157, +- 157, 157, 157, 158, 125, 158, 158, 124, 123, 122, +- 120, 119, 118, 117, 116, 115, 114, 113, 112, 110, +- 109, 108, 102, 101, 100, 99, 98, 94, 93, 90, +- 87, 86, 83, 82, 81, 80, 79, 78, 77, 76, +- +- 75, 74, 72, 71, 57, 55, 54, 44, 41, 35, +- 34, 33, 32, 31, 30, 28, 26, 25, 20, 19, +- 18, 13, 9, 5, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, +- 150, 150, 150, 150, 150 +- } ; +- +-/* Table of booleans, true if rule could match eol. */ +-static yyconst flex_int32_t yy_rule_can_match_eol[50] = +- { 0, +-1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; +- +-extern int yy_flex_debug; +-int yy_flex_debug = 0; +- +-static yy_state_type *yy_state_buf=0, *yy_state_ptr=0; +-static char *yy_full_match; +-static int yy_lp; +-#define REJECT \ +-{ \ +-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \ +-yy_cp = (yy_full_match); /* restore poss. backed-over text */ \ +-++(yy_lp); \ +-goto find_rule; \ +-} +- +-static int yy_more_offset = 0; +-static int yy_prev_more_offset = 0; +-#define yymore() ((yy_more_offset) = yy_flex_strlen( yytext )) +-#define YY_NEED_STRLEN +-#define YY_MORE_ADJ 0 +-#define YY_RESTORE_YY_MORE_OFFSET \ +- { \ +- (yy_more_offset) = (yy_prev_more_offset); \ +- yyleng -= (yy_more_offset); \ +- } +-#ifndef YYLMAX +-#define YYLMAX 8192 +-#endif +- +-char yytext[YYLMAX]; +-char *yytext_ptr; +-#line 1 "goomsl_lex.l" +-#line 2 "goomsl_lex.l" +- +-#include <math.h> +-#include <stdlib.h> +-#include <string.h> +-#include "goomsl.h" +-#include "goomsl_private.h" +-#include "goomsl_yacc.h" +-void yyerror(char *); +-void yyparse(void); +- +-GoomSL *currentGoomSL; +-static int string_size; +-static char string[1024]; +- +- +- +-#line 639 "goomsl_lex.c" +- +-#define INITIAL 0 +-#define C_COMMENT 1 +-#define LINE_COMMENT 2 +-#define STRING 3 +- +-/* Special case for "unistd.h", since it is non-ANSI. We include it way +- * down here because we want the user's section 1 to have been scanned first. +- * The user has a chance to override it with an option. +- */ +-#include <unistd.h> +- +-#ifndef YY_EXTRA_TYPE +-#define YY_EXTRA_TYPE void * +-#endif +- +-/* Macros after this point can all be overridden by user definitions in +- * section 1. +- */ +- +-#ifndef YY_SKIP_YYWRAP +-#ifdef __cplusplus +-extern "C" int yywrap (void ); +-#else +-extern int yywrap (void ); +-#endif +-#endif +- +- static void yyunput (int c,char *buf_ptr ); +- +-#ifndef yytext_ptr +-static void yy_flex_strncpy (char *,yyconst char *,int ); +-#endif +- +-#ifdef YY_NEED_STRLEN +-static int yy_flex_strlen (yyconst char * ); +-#endif +- +-#ifndef YY_NO_INPUT +- +-#ifdef __cplusplus +-static int yyinput (void ); +-#else +-static int input (void ); +-#endif +- +-#endif +- +-/* Amount of stuff to slurp up with each read. */ +-#ifndef YY_READ_BUF_SIZE +-#define YY_READ_BUF_SIZE 8192 +-#endif +- +-/* Copy whatever the last rule matched to the standard output. */ +-#ifndef ECHO +-/* This used to be an fputs(), but since the string might contain NUL's, +- * we now use fwrite(). +- */ +-#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +-#endif +- +-/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, +- * is returned in "result". +- */ +-#ifndef YY_INPUT +-#define YY_INPUT(buf,result,max_size) \ +- if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ +- { \ +- int c = '*'; \ +- size_t n; \ +- for ( n = 0; n < max_size && \ +- (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ +- buf[n] = (char) c; \ +- if ( c == '\n' ) \ +- buf[n++] = (char) c; \ +- if ( c == EOF && ferror( yyin ) ) \ +- YY_FATAL_ERROR( "input in flex scanner failed" ); \ +- result = n; \ +- } \ +- else \ +- { \ +- errno=0; \ +- while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ +- { \ +- if( errno != EINTR) \ +- { \ +- YY_FATAL_ERROR( "input in flex scanner failed" ); \ +- break; \ +- } \ +- errno=0; \ +- clearerr(yyin); \ +- } \ +- }\ +-\ +- +-#endif +- +-/* No semi-colon after return; correct usage is to write "yyterminate();" - +- * we don't want an extra ';' after the "return" because that will cause +- * some compilers to complain about unreachable statements. +- */ +-#ifndef yyterminate +-#define yyterminate() return YY_NULL +-#endif +- +-/* Number of entries by which start-condition stack grows. */ +-#ifndef YY_START_STACK_INCR +-#define YY_START_STACK_INCR 25 +-#endif +- +-/* Report a fatal error. */ +-#ifndef YY_FATAL_ERROR +-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +-#endif +- +-/* end tables serialization structures and prototypes */ +- +-/* Default declaration of generated scanner - a define so the user can +- * easily add parameters. +- */ +-#ifndef YY_DECL +-#define YY_DECL_IS_OURS 1 +- +-extern int yylex (void); +- +-#define YY_DECL int yylex (void) +-#endif /* !YY_DECL */ +- +-/* Code executed at the beginning of each rule, after yytext and yyleng +- * have been set up. +- */ +-#ifndef YY_USER_ACTION +-#define YY_USER_ACTION +-#endif +- +-/* Code executed at the end of each rule. */ +-#ifndef YY_BREAK +-#define YY_BREAK break; +-#endif +- +-#define YY_RULE_SETUP \ +- if ( yyleng > 0 ) \ +- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ +- (yytext[yyleng - 1] == '\n'); \ +- YY_USER_ACTION +- +-/** The main scanner function which does all the work. +- */ +-YY_DECL +-{ +- register yy_state_type yy_current_state; +- register char *yy_cp, *yy_bp; +- register int yy_act; +- +-#line 25 "goomsl_lex.l" +- +- +-#line 797 "goomsl_lex.c" +- +- if ( (yy_init) ) +- { +- (yy_init) = 0; +- +-#ifdef YY_USER_INIT +- YY_USER_INIT; +-#endif +- +- if ( ! (yy_state_buf) ) +- (yy_state_buf) = (yy_state_type *)yyalloc(YY_BUF_SIZE + 2 ); +- +- if ( ! (yy_start) ) +- (yy_start) = 1; /* first start state */ +- +- if ( ! yyin ) +- yyin = stdin; +- +- if ( ! yyout ) +- yyout = stdout; +- +- if ( ! YY_CURRENT_BUFFER ) { +- yyensure_buffer_stack (); +- YY_CURRENT_BUFFER_LVALUE = +- yy_create_buffer(yyin,YY_BUF_SIZE ); +- } +- +- yy_load_buffer_state( ); +- } +- +- while ( 1 ) /* loops until end-of-file is reached */ +- { +- yy_cp = (yy_c_buf_p); +- +- /* Support of yytext. */ +- *yy_cp = (yy_hold_char); +- +- /* yy_bp points to the position in yy_ch_buf of the start of +- * the current run. +- */ +- yy_bp = yy_cp; +- +- yy_current_state = (yy_start); +- yy_current_state += YY_AT_BOL(); +- +- (yy_state_ptr) = (yy_state_buf); +- *(yy_state_ptr)++ = yy_current_state; +- +-yy_match: +- do +- { +- register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; +- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +- { +- yy_current_state = (int) yy_def[yy_current_state]; +- if ( yy_current_state >= 151 ) +- yy_c = yy_meta[(unsigned int) yy_c]; +- } +- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +- *(yy_state_ptr)++ = yy_current_state; +- ++yy_cp; +- } +- while ( yy_base[yy_current_state] != 225 ); +- +-yy_find_action: +- yy_current_state = *--(yy_state_ptr); +- (yy_lp) = yy_accept[yy_current_state]; +-find_rule: /* we branch to this label when backing up */ +- for ( ; ; ) /* until we find what rule we matched */ +- { +- if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] ) +- { +- yy_act = yy_acclist[(yy_lp)]; +- { +- (yy_full_match) = yy_cp; +- break; +- } +- } +- --yy_cp; +- yy_current_state = *--(yy_state_ptr); +- (yy_lp) = yy_accept[yy_current_state]; +- } +- +- YY_DO_BEFORE_ACTION; +- +- if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) +- { +- int yyl; +- for ( yyl = (yy_prev_more_offset); yyl < yyleng; ++yyl ) +- if ( yytext[yyl] == '\n' ) +- +- yylineno++; +-; +- } +- +-do_action: /* This label is used only to access EOF actions. */ +- +- switch ( yy_act ) +- { /* beginning of action switch */ +-case 1: +-/* rule 1 can match eol */ +-YY_RULE_SETUP +-#line 27 "goomsl_lex.l" +-{ ++currentGoomSL->num_lines; /* Ignore empty lines */ } +- YY_BREAK +-case 2: +-/* rule 2 can match eol */ +-YY_RULE_SETUP +-#line 28 "goomsl_lex.l" +-{ ++currentGoomSL->num_lines; /* Ignore empty lines */ } +- YY_BREAK +-case 3: +-/* rule 3 can match eol */ +-YY_RULE_SETUP +-#line 30 "goomsl_lex.l" +-{ ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; } +- YY_BREAK +-case 4: +-/* rule 4 can match eol */ +-YY_RULE_SETUP +-#line 31 "goomsl_lex.l" +-{ ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; } +- YY_BREAK +-case 5: +-YY_RULE_SETUP +-#line 33 "goomsl_lex.l" +-{ BEGIN INITIAL; } +- YY_BREAK +-case 6: +-/* rule 6 can match eol */ +-YY_RULE_SETUP +-#line 34 "goomsl_lex.l" +-{ ++currentGoomSL->num_lines; } +- YY_BREAK +-case 7: +-YY_RULE_SETUP +-#line 35 "goomsl_lex.l" +-{ /* eat up comment */ } +- YY_BREAK +-case 8: +-YY_RULE_SETUP +-#line 37 "goomsl_lex.l" +-{ currentGoomSL->num_lines = 0; } +- YY_BREAK +-case 9: +-YY_RULE_SETUP +-#line 38 "goomsl_lex.l" +-{ currentGoomSL->num_lines = 0; printf("%s\n", yytext); } +- YY_BREAK +-case 10: +-YY_RULE_SETUP +-#line 39 "goomsl_lex.l" +-{ /* ignore preprocessor lines */ } +- YY_BREAK +-case 11: +-YY_RULE_SETUP +-#line 41 "goomsl_lex.l" +-{ BEGIN C_COMMENT; } +- YY_BREAK +-case 12: +-YY_RULE_SETUP +-#line 42 "goomsl_lex.l" +-{ BEGIN LINE_COMMENT; } +- YY_BREAK +-case 13: +-YY_RULE_SETUP +-#line 43 "goomsl_lex.l" +-{ BEGIN STRING; string_size=0; } +- YY_BREAK +-case 14: +-YY_RULE_SETUP +-#line 45 "goomsl_lex.l" +-{ string[string_size++] = '\n'; } +- YY_BREAK +-case 15: +-YY_RULE_SETUP +-#line 46 "goomsl_lex.l" +-{ string[string_size++] = '\"'; } +- YY_BREAK +-case 16: +-YY_RULE_SETUP +-#line 47 "goomsl_lex.l" +-{ /* fin de la chaine: on cree le pointeur qui va bien */ +- unsigned int tmp; +- BEGIN INITIAL; +- string[string_size]=0; +- tmp = gsl_malloc(currentGoomSL, string_size+1); +- strcpy((char*)currentGoomSL->ptrArray[tmp],string); +- sprintf(yylval.strValue, "0x%08x", tmp); +- return LTYPE_PTR; +- } +- YY_BREAK +-case 17: +-YY_RULE_SETUP +-#line 56 "goomsl_lex.l" +-{ string[string_size++] = *yytext; } +- YY_BREAK +-case 18: +-YY_RULE_SETUP +-#line 58 "goomsl_lex.l" +-{ return FLOAT_TK; } +- YY_BREAK +-case 19: +-YY_RULE_SETUP +-#line 59 "goomsl_lex.l" +-{ return INT_TK; } +- YY_BREAK +-case 20: +-YY_RULE_SETUP +-#line 60 "goomsl_lex.l" +-{ return INT_TK; } +- YY_BREAK +-case 21: +-YY_RULE_SETUP +-#line 61 "goomsl_lex.l" +-{ return PTR_TK; } +- YY_BREAK +-case 22: +-YY_RULE_SETUP +-#line 62 "goomsl_lex.l" +-{ return PTR_TK; } +- YY_BREAK +-case 23: +-YY_RULE_SETUP +-#line 63 "goomsl_lex.l" +-{ return DECLARE; } +- YY_BREAK +-case 24: +-YY_RULE_SETUP +-#line 64 "goomsl_lex.l" +-{ return EXTERNAL; } +- YY_BREAK +-case 25: +-YY_RULE_SETUP +-#line 65 "goomsl_lex.l" +-{ return STRUCT; } +- YY_BREAK +-case 26: +-YY_RULE_SETUP +-#line 66 "goomsl_lex.l" +-{ return NOT; } +- YY_BREAK +-case 27: +-YY_RULE_SETUP +-#line 67 "goomsl_lex.l" +-{ return WHILE; } +- YY_BREAK +-case 28: +-YY_RULE_SETUP +-#line 68 "goomsl_lex.l" +-{ return DO; } +- YY_BREAK +-case 29: +-YY_RULE_SETUP +-#line 69 "goomsl_lex.l" +-{ return FOR; } +- YY_BREAK +-case 30: +-YY_RULE_SETUP +-#line 70 "goomsl_lex.l" +-{ return IN; } +- YY_BREAK +-case 31: +-YY_RULE_SETUP +-#line 71 "goomsl_lex.l" +-{ strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; } +- YY_BREAK +-case 32: +-YY_RULE_SETUP +-#line 72 "goomsl_lex.l" +-{ strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; } +- YY_BREAK +-case 33: +-YY_RULE_SETUP +-#line 73 "goomsl_lex.l" +-{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; } +- YY_BREAK +-case 34: +-YY_RULE_SETUP +-#line 74 "goomsl_lex.l" +-{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } +- YY_BREAK +-case 35: +-YY_RULE_SETUP +-#line 75 "goomsl_lex.l" +-{ sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; } +- YY_BREAK +-case 36: +-YY_RULE_SETUP +-#line 76 "goomsl_lex.l" +-{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } +- YY_BREAK +-case 37: +-YY_RULE_SETUP +-#line 77 "goomsl_lex.l" +-{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; } +- YY_BREAK +-case 38: +-YY_RULE_SETUP +-#line 78 "goomsl_lex.l" +-{ sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; } +- YY_BREAK +-case 39: +-YY_RULE_SETUP +-#line 79 "goomsl_lex.l" +-{ return PLUS_EQ; } +- YY_BREAK +-case 40: +-YY_RULE_SETUP +-#line 80 "goomsl_lex.l" +-{ return MUL_EQ; } +- YY_BREAK +-case 41: +-YY_RULE_SETUP +-#line 81 "goomsl_lex.l" +-{ return SUB_EQ; } +- YY_BREAK +-case 42: +-YY_RULE_SETUP +-#line 82 "goomsl_lex.l" +-{ return DIV_EQ; } +- YY_BREAK +-case 43: +-YY_RULE_SETUP +-#line 83 "goomsl_lex.l" +-{ return LOW_EQ; } +- YY_BREAK +-case 44: +-YY_RULE_SETUP +-#line 84 "goomsl_lex.l" +-{ return SUP_EQ; } +- YY_BREAK +-case 45: +-YY_RULE_SETUP +-#line 85 "goomsl_lex.l" +-{ return NOT_EQ; } +- YY_BREAK +-case 46: +-YY_RULE_SETUP +-#line 86 "goomsl_lex.l" +-{ return NOT_EQ; } +- YY_BREAK +-case 47: +-YY_RULE_SETUP +-#line 87 "goomsl_lex.l" +-/* eat up whitespace */ +- YY_BREAK +-case 48: +-YY_RULE_SETUP +-#line 88 "goomsl_lex.l" +-{ yylval.charValue = *yytext; return *yytext; } +- YY_BREAK +-case 49: +-YY_RULE_SETUP +-#line 90 "goomsl_lex.l" +-ECHO; +- YY_BREAK +-#line 1155 "goomsl_lex.c" +- case YY_STATE_EOF(INITIAL): +- case YY_STATE_EOF(C_COMMENT): +- case YY_STATE_EOF(LINE_COMMENT): +- case YY_STATE_EOF(STRING): +- yyterminate(); +- +- case YY_END_OF_BUFFER: +- { +- /* Amount of text matched not including the EOB char. */ +- int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; +- +- /* Undo the effects of YY_DO_BEFORE_ACTION. */ +- *yy_cp = (yy_hold_char); +- YY_RESTORE_YY_MORE_OFFSET +- +- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) +- { +- /* We're scanning a new file or input source. It's +- * possible that this happened because the user +- * just pointed yyin at a new source and called +- * yylex(). If so, then we have to assure +- * consistency between YY_CURRENT_BUFFER and our +- * globals. Here is the right place to do so, because +- * this is the first action (other than possibly a +- * back-up) that will match for the new input source. +- */ +- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; +- YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; +- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; +- } +- +- /* Note that here we test for yy_c_buf_p "<=" to the position +- * of the first EOB in the buffer, since yy_c_buf_p will +- * already have been incremented past the NUL character +- * (since all states make transitions on EOB to the +- * end-of-buffer state). Contrast this with the test +- * in input(). +- */ +- if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) +- { /* This was really a NUL. */ +- yy_state_type yy_next_state; +- +- (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; +- +- yy_current_state = yy_get_previous_state( ); +- +- /* Okay, we're now positioned to make the NUL +- * transition. We couldn't have +- * yy_get_previous_state() go ahead and do it +- * for us because it doesn't know how to deal +- * with the possibility of jamming (and we don't +- * want to build jamming into it because then it +- * will run more slowly). +- */ +- +- yy_next_state = yy_try_NUL_trans( yy_current_state ); +- +- yy_bp = (yytext_ptr) + YY_MORE_ADJ; +- +- if ( yy_next_state ) +- { +- /* Consume the NUL. */ +- yy_cp = ++(yy_c_buf_p); +- yy_current_state = yy_next_state; +- goto yy_match; +- } +- +- else +- { +- yy_cp = (yy_c_buf_p); +- goto yy_find_action; +- } +- } +- +- else switch ( yy_get_next_buffer( ) ) +- { +- case EOB_ACT_END_OF_FILE: +- { +- (yy_did_buffer_switch_on_eof) = 0; +- +- if ( yywrap( ) ) +- { +- /* Note: because we've taken care in +- * yy_get_next_buffer() to have set up +- * yytext, we can now set up +- * yy_c_buf_p so that if some total +- * hoser (like flex itself) wants to +- * call the scanner after we return the +- * YY_NULL, it'll still work - another +- * YY_NULL will get returned. +- */ +- (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; +- +- yy_act = YY_STATE_EOF(YY_START); +- goto do_action; +- } +- +- else +- { +- if ( ! (yy_did_buffer_switch_on_eof) ) +- YY_NEW_FILE; +- } +- break; +- } +- +- case EOB_ACT_CONTINUE_SCAN: +- (yy_c_buf_p) = +- (yytext_ptr) + yy_amount_of_matched_text; +- +- yy_current_state = yy_get_previous_state( ); +- +- yy_cp = (yy_c_buf_p); +- yy_bp = (yytext_ptr) + YY_MORE_ADJ; +- goto yy_match; +- +- case EOB_ACT_LAST_MATCH: +- (yy_c_buf_p) = +- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; +- +- yy_current_state = yy_get_previous_state( ); +- +- yy_cp = (yy_c_buf_p); +- yy_bp = (yytext_ptr) + YY_MORE_ADJ; +- goto yy_find_action; +- } +- break; +- } +- +- default: +- YY_FATAL_ERROR( +- "fatal flex scanner internal error--no action found" ); +- } /* end of action switch */ +- } /* end of scanning one token */ +-} /* end of yylex */ +- +-/* yy_get_next_buffer - try to read in a new buffer +- * +- * Returns a code representing an action: +- * EOB_ACT_LAST_MATCH - +- * EOB_ACT_CONTINUE_SCAN - continue scanning from current position +- * EOB_ACT_END_OF_FILE - end of file +- */ +-static int yy_get_next_buffer (void) +-{ +- register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; +- register char *source = (yytext_ptr); +- register int number_to_move, i; +- int ret_val; +- +- if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) +- YY_FATAL_ERROR( +- "fatal flex scanner internal error--end of buffer missed" ); +- +- if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) +- { /* Don't try to fill the buffer, so this is an EOF. */ +- if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) +- { +- /* We matched a single character, the EOB, so +- * treat this as a final EOF. +- */ +- return EOB_ACT_END_OF_FILE; +- } +- +- else +- { +- /* We matched some text prior to the EOB, first +- * process it. +- */ +- return EOB_ACT_LAST_MATCH; +- } +- } +- +- /* Try to read more data. */ +- +- /* First move last chars to start of buffer. */ +- number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; +- +- for ( i = 0; i < number_to_move; ++i ) +- *(dest++) = *(source++); +- +- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) +- /* don't do the read, it's not guaranteed to return an EOF, +- * just force an EOF +- */ +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; +- +- else +- { +- size_t num_to_read = +- YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; +- +- while ( num_to_read <= 0 ) +- { /* Not enough room in the buffer - grow it. */ +- +- YY_FATAL_ERROR( +-"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +- +- } +- +- if ( num_to_read > YY_READ_BUF_SIZE ) +- num_to_read = YY_READ_BUF_SIZE; +- +- /* Read in more data. */ +- YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), +- (yy_n_chars), num_to_read ); +- +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); +- } +- +- if ( (yy_n_chars) == 0 ) +- { +- if ( number_to_move == YY_MORE_ADJ ) +- { +- ret_val = EOB_ACT_END_OF_FILE; +- yyrestart(yyin ); +- } +- +- else +- { +- ret_val = EOB_ACT_LAST_MATCH; +- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = +- YY_BUFFER_EOF_PENDING; +- } +- } +- +- else +- ret_val = EOB_ACT_CONTINUE_SCAN; +- +- (yy_n_chars) += number_to_move; +- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; +- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; +- +- (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; +- +- return ret_val; +-} +- +-/* yy_get_previous_state - get the state just before the EOB char was reached */ +- +- static yy_state_type yy_get_previous_state (void) +-{ +- register yy_state_type yy_current_state; +- register char *yy_cp; +- +- yy_current_state = (yy_start); +- yy_current_state += YY_AT_BOL(); +- +- (yy_state_ptr) = (yy_state_buf); +- *(yy_state_ptr)++ = yy_current_state; +- +- for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) +- { +- register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); +- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +- { +- yy_current_state = (int) yy_def[yy_current_state]; +- if ( yy_current_state >= 151 ) +- yy_c = yy_meta[(unsigned int) yy_c]; +- } +- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +- *(yy_state_ptr)++ = yy_current_state; +- } +- +- return yy_current_state; +-} +- +-/* yy_try_NUL_trans - try to make a transition on the NUL character +- * +- * synopsis +- * next_state = yy_try_NUL_trans( current_state ); +- */ +- static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +-{ +- register int yy_is_jam; +- +- register YY_CHAR yy_c = 1; +- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +- { +- yy_current_state = (int) yy_def[yy_current_state]; +- if ( yy_current_state >= 151 ) +- yy_c = yy_meta[(unsigned int) yy_c]; +- } +- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +- yy_is_jam = (yy_current_state == 150); +- if ( ! yy_is_jam ) +- *(yy_state_ptr)++ = yy_current_state; +- +- return yy_is_jam ? 0 : yy_current_state; +-} +- +- static void yyunput (int c, register char * yy_bp ) +-{ +- register char *yy_cp; +- +- yy_cp = (yy_c_buf_p); +- +- /* undo effects of setting up yytext */ +- *yy_cp = (yy_hold_char); +- +- if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) +- { /* need to shift things up to make room */ +- /* +2 for EOB chars. */ +- register int number_to_move = (yy_n_chars) + 2; +- register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ +- YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; +- register char *source = +- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; +- +- while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) +- *--dest = *--source; +- +- yy_cp += (int) (dest - source); +- yy_bp += (int) (dest - source); +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = +- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; +- +- if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) +- YY_FATAL_ERROR( "flex scanner push-back overflow" ); +- } +- +- *--yy_cp = (char) c; +- +- if ( c == '\n' ){ +- --yylineno; +- } +- +- (yytext_ptr) = yy_bp; +- (yy_hold_char) = *yy_cp; +- (yy_c_buf_p) = yy_cp; +-} +- +-#ifndef YY_NO_INPUT +-#ifdef __cplusplus +- static int yyinput (void) +-#else +- static int input (void) +-#endif +- +-{ +- int c; +- +- *(yy_c_buf_p) = (yy_hold_char); +- +- if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) +- { +- /* yy_c_buf_p now points to the character we want to return. +- * If this occurs *before* the EOB characters, then it's a +- * valid NUL; if not, then we've hit the end of the buffer. +- */ +- if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) +- /* This was really a NUL. */ +- *(yy_c_buf_p) = '\0'; +- +- else +- { /* need more input */ +- int offset = (yy_c_buf_p) - (yytext_ptr); +- ++(yy_c_buf_p); +- +- switch ( yy_get_next_buffer( ) ) +- { +- case EOB_ACT_LAST_MATCH: +- /* This happens because yy_g_n_b() +- * sees that we've accumulated a +- * token and flags that we need to +- * try matching the token before +- * proceeding. But for input(), +- * there's no matching to consider. +- * So convert the EOB_ACT_LAST_MATCH +- * to EOB_ACT_END_OF_FILE. +- */ +- +- /* Reset buffer status. */ +- yyrestart(yyin ); +- +- /*FALLTHROUGH*/ +- +- case EOB_ACT_END_OF_FILE: +- { +- if ( yywrap( ) ) +- return EOF; +- +- if ( ! (yy_did_buffer_switch_on_eof) ) +- YY_NEW_FILE; +-#ifdef __cplusplus +- return yyinput(); +-#else +- return input(); +-#endif +- } +- +- case EOB_ACT_CONTINUE_SCAN: +- (yy_c_buf_p) = (yytext_ptr) + offset; +- break; +- } +- } +- } +- +- c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ +- *(yy_c_buf_p) = '\0'; /* preserve yytext */ +- (yy_hold_char) = *++(yy_c_buf_p); +- +- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); +- if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol ) +- +- yylineno++; +-; +- +- return c; +-} +-#endif /* ifndef YY_NO_INPUT */ +- +-/** Immediately switch to a different input stream. +- * @param input_file A readable stream. +- * +- * @note This function does not reset the start condition to @c INITIAL . +- */ +- void yyrestart (FILE * input_file ) +-{ +- +- if ( ! YY_CURRENT_BUFFER ){ +- yyensure_buffer_stack (); +- YY_CURRENT_BUFFER_LVALUE = +- yy_create_buffer(yyin,YY_BUF_SIZE ); +- } +- +- yy_init_buffer(YY_CURRENT_BUFFER,input_file ); +- yy_load_buffer_state( ); +-} +- +-/** Switch to a different input buffer. +- * @param new_buffer The new input buffer. +- * +- */ +- void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +-{ +- +- /* TODO. We should be able to replace this entire function body +- * with +- * yypop_buffer_state(); +- * yypush_buffer_state(new_buffer); +- */ +- yyensure_buffer_stack (); +- if ( YY_CURRENT_BUFFER == new_buffer ) +- return; +- +- if ( YY_CURRENT_BUFFER ) +- { +- /* Flush out information for old buffer. */ +- *(yy_c_buf_p) = (yy_hold_char); +- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); +- } +- +- YY_CURRENT_BUFFER_LVALUE = new_buffer; +- yy_load_buffer_state( ); +- +- /* We don't actually know whether we did this switch during +- * EOF (yywrap()) processing, but the only time this flag +- * is looked at is after yywrap() is called, so it's safe +- * to go ahead and always set it. +- */ +- (yy_did_buffer_switch_on_eof) = 1; +-} +- +-static void yy_load_buffer_state (void) +-{ +- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; +- (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; +- yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; +- (yy_hold_char) = *(yy_c_buf_p); +-} +- +-/** Allocate and initialize an input buffer state. +- * @param file A readable stream. +- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. +- * +- * @return the allocated buffer state. +- */ +- YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) +-{ +- YY_BUFFER_STATE b; +- +- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); +- if ( ! b ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); +- +- b->yy_buf_size = size; +- +- /* yy_ch_buf has to be 2 characters longer than the size given because +- * we need to put in 2 end-of-buffer characters. +- */ +- b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); +- if ( ! b->yy_ch_buf ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); +- +- b->yy_is_our_buffer = 1; +- +- yy_init_buffer(b,file ); +- +- return b; +-} +- +-/** Destroy the buffer. +- * @param b a buffer created with yy_create_buffer() +- * +- */ +- void yy_delete_buffer (YY_BUFFER_STATE b ) +-{ +- +- if ( ! b ) +- return; +- +- if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ +- YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; +- +- if ( b->yy_is_our_buffer ) +- yyfree((void *) b->yy_ch_buf ); +- +- yyfree((void *) b ); +-} +- +-#ifndef __cplusplus +-extern int isatty (int ); +-#endif /* __cplusplus */ +- +-/* Initializes or reinitializes a buffer. +- * This function is sometimes called more than once on the same buffer, +- * such as during a yyrestart() or at EOF. +- */ +- static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) +- +-{ +- int oerrno = errno; +- +- yy_flush_buffer(b ); +- +- b->yy_input_file = file; +- b->yy_fill_buffer = 1; +- +- /* If b is the current buffer, then yy_init_buffer was _probably_ +- * called from yyrestart() or through yy_get_next_buffer. +- * In that case, we don't want to reset the lineno or column. +- */ +- if (b != YY_CURRENT_BUFFER){ +- b->yy_bs_lineno = 1; +- b->yy_bs_column = 0; +- } +- +- b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +- +- errno = oerrno; +-} +- +-/** Discard all buffered characters. On the next scan, YY_INPUT will be called. +- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. +- * +- */ +- void yy_flush_buffer (YY_BUFFER_STATE b ) +-{ +- if ( ! b ) +- return; +- +- b->yy_n_chars = 0; +- +- /* We always need two end-of-buffer characters. The first causes +- * a transition to the end-of-buffer state. The second causes +- * a jam in that state. +- */ +- b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; +- b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; +- +- b->yy_buf_pos = &b->yy_ch_buf[0]; +- +- b->yy_at_bol = 1; +- b->yy_buffer_status = YY_BUFFER_NEW; +- +- if ( b == YY_CURRENT_BUFFER ) +- yy_load_buffer_state( ); +-} +- +-/** Pushes the new state onto the stack. The new state becomes +- * the current state. This function will allocate the stack +- * if necessary. +- * @param new_buffer The new state. +- * +- */ +-void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +-{ +- if (new_buffer == NULL) +- return; +- +- yyensure_buffer_stack(); +- +- /* This block is copied from yy_switch_to_buffer. */ +- if ( YY_CURRENT_BUFFER ) +- { +- /* Flush out information for old buffer. */ +- *(yy_c_buf_p) = (yy_hold_char); +- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); +- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); +- } +- +- /* Only push if top exists. Otherwise, replace top. */ +- if (YY_CURRENT_BUFFER) +- (yy_buffer_stack_top)++; +- YY_CURRENT_BUFFER_LVALUE = new_buffer; +- +- /* copied from yy_switch_to_buffer. */ +- yy_load_buffer_state( ); +- (yy_did_buffer_switch_on_eof) = 1; +-} +- +-/** Removes and deletes the top of the stack, if present. +- * The next element becomes the new top. +- * +- */ +-void yypop_buffer_state (void) +-{ +- if (!YY_CURRENT_BUFFER) +- return; +- +- yy_delete_buffer(YY_CURRENT_BUFFER ); +- YY_CURRENT_BUFFER_LVALUE = NULL; +- if ((yy_buffer_stack_top) > 0) +- --(yy_buffer_stack_top); +- +- if (YY_CURRENT_BUFFER) { +- yy_load_buffer_state( ); +- (yy_did_buffer_switch_on_eof) = 1; +- } +-} +- +-/* Allocates the stack if it does not exist. +- * Guarantees space for at least one push. +- */ +-static void yyensure_buffer_stack (void) +-{ +- int num_to_alloc; +- +- if (!(yy_buffer_stack)) { +- +- /* First allocation is just for 2 elements, since we don't know if this +- * scanner will even need a stack. We use 2 instead of 1 to avoid an +- * immediate realloc on the next call. +- */ +- num_to_alloc = 1; +- (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc +- (num_to_alloc * sizeof(struct yy_buffer_state*) +- ); +- +- memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); +- +- (yy_buffer_stack_max) = num_to_alloc; +- (yy_buffer_stack_top) = 0; +- return; +- } +- +- if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ +- +- /* Increase the buffer to prepare for a possible push. */ +- int grow_size = 8 /* arbitrary grow size */; +- +- num_to_alloc = (yy_buffer_stack_max) + grow_size; +- (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc +- ((yy_buffer_stack), +- num_to_alloc * sizeof(struct yy_buffer_state*) +- ); +- +- /* zero only the new slots.*/ +- memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); +- (yy_buffer_stack_max) = num_to_alloc; +- } +-} +- +-/** Setup the input buffer state to scan directly from a user-specified character buffer. +- * @param base the character buffer +- * @param size the size in bytes of the character buffer +- * +- * @return the newly allocated buffer state object. +- */ +-YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) +-{ +- YY_BUFFER_STATE b; +- +- if ( size < 2 || +- base[size-2] != YY_END_OF_BUFFER_CHAR || +- base[size-1] != YY_END_OF_BUFFER_CHAR ) +- /* They forgot to leave room for the EOB's. */ +- return 0; +- +- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); +- if ( ! b ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); +- +- b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ +- b->yy_buf_pos = b->yy_ch_buf = base; +- b->yy_is_our_buffer = 0; +- b->yy_input_file = 0; +- b->yy_n_chars = b->yy_buf_size; +- b->yy_is_interactive = 0; +- b->yy_at_bol = 1; +- b->yy_fill_buffer = 0; +- b->yy_buffer_status = YY_BUFFER_NEW; +- +- yy_switch_to_buffer(b ); +- +- return b; +-} +- +-/** Setup the input buffer state to scan a string. The next call to yylex() will +- * scan from a @e copy of @a str. +- * @param str a NUL-terminated string to scan +- * +- * @return the newly allocated buffer state object. +- * @note If you want to scan bytes that may contain NUL values, then use +- * yy_scan_bytes() instead. +- */ +-YY_BUFFER_STATE yy_scan_string (yyconst char * str ) +-{ +- +- return yy_scan_bytes(str,strlen(str) ); +-} +- +-/** Setup the input buffer state to scan the given bytes. The next call to yylex() will +- * scan from a @e copy of @a bytes. +- * @param bytes the byte buffer to scan +- * @param len the number of bytes in the buffer pointed to by @a bytes. +- * +- * @return the newly allocated buffer state object. +- */ +-YY_BUFFER_STATE yy_scan_bytes (yyconst char * bytes, int len ) +-{ +- YY_BUFFER_STATE b; +- char *buf; +- yy_size_t n; +- int i; +- +- /* Get memory for full buffer, including space for trailing EOB's. */ +- n = len + 2; +- buf = (char *) yyalloc(n ); +- if ( ! buf ) +- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); +- +- for ( i = 0; i < len; ++i ) +- buf[i] = bytes[i]; +- +- buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; +- +- b = yy_scan_buffer(buf,n ); +- if ( ! b ) +- YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); +- +- /* It's okay to grow etc. this buffer, and we should throw it +- * away when we're done. +- */ +- b->yy_is_our_buffer = 1; +- +- return b; +-} +- +-#ifndef YY_EXIT_FAILURE +-#define YY_EXIT_FAILURE 2 +-#endif +- +-static void yy_fatal_error (yyconst char* msg ) +-{ +- (void) fprintf( stderr, "%s\n", msg ); +- exit( YY_EXIT_FAILURE ); +-} +- +-/* Redefine yyless() so it works in section 3 code. */ +- +-#undef yyless +-#define yyless(n) \ +- do \ +- { \ +- /* Undo effects of setting up yytext. */ \ +- int yyless_macro_arg = (n); \ +- YY_LESS_LINENO(yyless_macro_arg);\ +- yytext[yyleng] = (yy_hold_char); \ +- (yy_c_buf_p) = yytext + yyless_macro_arg; \ +- (yy_hold_char) = *(yy_c_buf_p); \ +- *(yy_c_buf_p) = '\0'; \ +- yyleng = yyless_macro_arg; \ +- } \ +- while ( 0 ) +- +-/* Accessor methods (get/set functions) to struct members. */ +- +-/** Get the current line number. +- * +- */ +-int yyget_lineno (void) +-{ +- +- return yylineno; +-} +- +-/** Get the input stream. +- * +- */ +-FILE *yyget_in (void) +-{ +- return yyin; +-} +- +-/** Get the output stream. +- * +- */ +-FILE *yyget_out (void) +-{ +- return yyout; +-} +- +-/** Get the length of the current token. +- * +- */ +-int yyget_leng (void) +-{ +- return yyleng; +-} +- +-/** Get the current token. +- * +- */ +- +-char *yyget_text (void) +-{ +- return yytext; +-} +- +-/** Set the current line number. +- * @param line_number +- * +- */ +-void yyset_lineno (int line_number ) +-{ +- +- yylineno = line_number; +-} +- +-/** Set the input stream. This does not discard the current +- * input buffer. +- * @param in_str A readable stream. +- * +- * @see yy_switch_to_buffer +- */ +-void yyset_in (FILE * in_str ) +-{ +- yyin = in_str ; +-} +- +-void yyset_out (FILE * out_str ) +-{ +- yyout = out_str ; +-} +- +-int yyget_debug (void) +-{ +- return yy_flex_debug; +-} +- +-void yyset_debug (int bdebug ) +-{ +- yy_flex_debug = bdebug ; +-} +- +-/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +-int yylex_destroy (void) +-{ +- +- /* Pop the buffer stack, destroying each element. */ +- while(YY_CURRENT_BUFFER){ +- yy_delete_buffer(YY_CURRENT_BUFFER ); +- YY_CURRENT_BUFFER_LVALUE = NULL; +- yypop_buffer_state(); +- } +- +- /* Destroy the stack itself. */ +- yyfree((yy_buffer_stack) ); +- (yy_buffer_stack) = NULL; +- +- yyfree ( (yy_state_buf) ); +- +- return 0; +-} +- +-/* +- * Internal utility routines. +- */ +- +-#ifndef yytext_ptr +-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +-{ +- register int i; +- for ( i = 0; i < n; ++i ) +- s1[i] = s2[i]; +-} +-#endif +- +-#ifdef YY_NEED_STRLEN +-static int yy_flex_strlen (yyconst char * s ) +-{ +- register int n; +- for ( n = 0; s[n]; ++n ) +- ; +- +- return n; +-} +-#endif +- +-void *yyalloc (yy_size_t size ) +-{ +- return (void *) malloc( size ); +-} +- +-void *yyrealloc (void * ptr, yy_size_t size ) +-{ +- /* The cast to (char *) in the following accommodates both +- * implementations that use char* generic pointers, and those +- * that use void* generic pointers. It works with the latter +- * because both ANSI C and C++ allow castless assignment from +- * any pointer type to void*, and deal with argument conversions +- * as though doing an assignment. +- */ +- return (void *) realloc( (char *) ptr, size ); +-} +- +-void yyfree (void * ptr ) +-{ +- free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +-} +- +-#define YYTABLES_NAME "yytables" +- +-#undef YY_NEW_FILE +-#undef YY_FLUSH_BUFFER +-#undef yy_set_bol +-#undef yy_new_buffer +-#undef yy_set_interactive +-#undef YY_DO_BEFORE_ACTION +- +-#ifdef YY_DECL_IS_OURS +-#undef YY_DECL_IS_OURS +-#undef YY_DECL +-#endif +-#line 90 "goomsl_lex.l" +- +- +- +- +-int yywrap(void) { return 1; yyunput(0,0); } +- +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_lex.l /src/goomsl_lex.l +--- /home/d4rk/goom2k4-0/src/goomsl_lex.l 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_lex.l 1969-12-31 17:00:00.000000000 -0700 +@@ -1,94 +0,0 @@ +-%{ +- +-#include <math.h> +-#include <stdlib.h> +-#include <string.h> +-#include "goomsl.h" +-#include "goomsl_private.h" +-#include "goomsl_yacc.h" +-void yyerror(char *); +-void yyparse(void); +- +-GoomSL *currentGoomSL; +-static int string_size; +-static char string[1024]; +-%} +- +-DIGIT [0-9] +-XDIGIT [0-9a-f] +-ID [a-zA-Z_@&][a-zA-Z0-9_\.]* +- +-%S C_COMMENT +-%S LINE_COMMENT +-%S STRING +- +-%% +- +-<LINE_COMMENT,C_COMMENT,INITIAL>^[ \t]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ } +-<LINE_COMMENT,C_COMMENT,INITIAL>^[ \t]*"//"[^\n]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ } +- +-<LINE_COMMENT>\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; } +-<INITIAL>\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; } +- +-<C_COMMENT>"*/" { BEGIN INITIAL; } +-<C_COMMENT>\n { ++currentGoomSL->num_lines; } +-<C_COMMENT,LINE_COMMENT>. { /* eat up comment */ } +- +-<INITIAL>"#RST_LINE#" { currentGoomSL->num_lines = 0; } +-<INITIAL>"#FILE ".*"#" { currentGoomSL->num_lines = 0; printf("%s\n", yytext); } +-<INITIAL>"#"[^\n]* { /* ignore preprocessor lines */ } +- +-<INITIAL>"/*" { BEGIN C_COMMENT; } +-<INITIAL>"//" { BEGIN LINE_COMMENT; } +-<INITIAL>\" { BEGIN STRING; string_size=0; } +- +-<STRING>"\\n" { string[string_size++] = '\n'; } +-<STRING>"\\\"" { string[string_size++] = '\"'; } +-<STRING>\" { /* fin de la chaine: on cree le pointeur qui va bien */ +- unsigned int tmp; +- BEGIN INITIAL; +- string[string_size]=0; +- tmp = gsl_malloc(currentGoomSL, string_size+1); +- strcpy((char*)currentGoomSL->ptrArray[tmp],string); +- sprintf(yylval.strValue, "0x%08x", tmp); +- return LTYPE_PTR; +- } +-<STRING>. { string[string_size++] = *yytext; } +- +-<INITIAL>"float" { return FLOAT_TK; } +-<INITIAL>"int" { return INT_TK; } +-<INITIAL>"boolean" { return INT_TK; } +-<INITIAL>"ptr" { return PTR_TK; } +-<INITIAL>"string" { return PTR_TK; } +-<INITIAL>"declare" { return DECLARE; } +-<INITIAL>"external" { return EXTERNAL; } +-<INITIAL>"struct" { return STRUCT; } +-<INITIAL>"not" { return NOT; } +-<INITIAL>"while" { return WHILE; } +-<INITIAL>"do" { return DO; } +-<INITIAL>"for" { return FOR; } +-<INITIAL>"in" { return IN; } +-<INITIAL>"true" { strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; } +-<INITIAL>"false" { strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; } +-<INITIAL>{ID} { strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; } +-<INITIAL>{DIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } +-<INITIAL>\'.\' { sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; } +-<INITIAL>"0x"{XDIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } +-<INITIAL>{DIGIT}+"."{DIGIT}* { strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; } +-<INITIAL>{DIGIT}+"%" { sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; } +-<INITIAL>"+=" { return PLUS_EQ; } +-<INITIAL>"*=" { return MUL_EQ; } +-<INITIAL>"-=" { return SUB_EQ; } +-<INITIAL>"/=" { return DIV_EQ; } +-<INITIAL>"<=" { return LOW_EQ; } +-<INITIAL>">=" { return SUP_EQ; } +-<INITIAL>"!=" { return NOT_EQ; } +-<INITIAL>"<>" { return NOT_EQ; } +-<INITIAL>[ \t]+ /* eat up whitespace */ +-<INITIAL>. { yylval.charValue = *yytext; return *yytext; } +- +-%% +- +- +-int yywrap(void) { return 1; yyunput(0,0); } +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_private.h /src/goomsl_private.h +--- /home/d4rk/goom2k4-0/src/goomsl_private.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_private.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,251 +0,0 @@ +-#ifndef _GSL_PRIVATE_H +-#define _GSL_PRIVATE_H +- +-/* -- internal use -- */ +- +-#include "goomsl.h" +- +-#ifdef USE_JITC_X86 +-#include "jitc_x86.h" +-#endif +- +-#include "goomsl_heap.h" +- +-/* {{{ type of nodes */ +-#define EMPTY_NODE 0 +-#define CONST_INT_NODE 1 +-#define CONST_FLOAT_NODE 2 +-#define CONST_PTR_NODE 3 +-#define VAR_NODE 4 +-#define PARAM_NODE 5 +-#define READ_PARAM_NODE 6 +-#define OPR_NODE 7 +-/* }}} */ +-/* {{{ type of operations */ +-#define OPR_SET 1 +-#define OPR_IF 2 +-#define OPR_WHILE 3 +-#define OPR_BLOCK 4 +-#define OPR_ADD 5 +-#define OPR_MUL 6 +-#define OPR_EQU 7 +-#define OPR_NOT 8 +-#define OPR_LOW 9 +-#define OPR_DIV 10 +-#define OPR_SUB 11 +-#define OPR_FUNC_INTRO 12 +-#define OPR_FUNC_OUTRO 13 +-#define OPR_CALL 14 +-#define OPR_EXT_CALL 15 +-#define OPR_PLUS_EQ 16 +-#define OPR_SUB_EQ 17 +-#define OPR_MUL_EQ 18 +-#define OPR_DIV_EQ 19 +-#define OPR_CALL_EXPR 20 +-#define OPR_AFFECT_LIST 21 +-#define OPR_FOREACH 22 +-#define OPR_VAR_LIST 23 +- +-/* }}} */ +- +-typedef struct _ConstIntNodeType { /* {{{ */ +- int val; +-} ConstIntNodeType; /* }}} */ +-typedef struct _ConstFloatNodeType { /* {{{ */ +- float val; +-} ConstFloatNodeType; /* }}} */ +-typedef struct _ConstPtrNodeType { /* {{{ */ +- int id; +-} ConstPtrNodeType; /* }}} */ +-typedef struct _OprNodeType { /* {{{ */ +- int type; +- int nbOp; +- struct _NODE_TYPE *op[3]; /* maximal number of operand needed */ +- struct _NODE_TYPE *next; +-} OprNodeType; /* }}} */ +-typedef struct _NODE_TYPE { /* {{{ */ +- int type; +- char *str; +- GoomHash *vnamespace; +- int line_number; +- union { +- ConstIntNodeType constInt; +- ConstFloatNodeType constFloat; +- ConstPtrNodeType constPtr; +- OprNodeType opr; +- } unode; +-} NodeType; /* }}} */ +-typedef struct _INSTRUCTION_DATA { /* {{{ */ +- +- union { +- void *var; +- int *var_int; +- int *var_ptr; +- float *var_float; +- int jump_offset; +- struct _ExternalFunctionStruct *external_function; +- } udest; +- +- union { +- void *var; +- int *var_int; +- int *var_ptr; +- float *var_float; +- int value_int; +- int value_ptr; +- float value_float; +- } usrc; +-} InstructionData; +-/* }}} */ +-typedef struct _INSTRUCTION { /* {{{ */ +- +- int id; +- InstructionData data; +- GoomSL *parent; +- const char *name; /* name of the instruction */ +- +- char **params; /* parametres de l'instruction */ +- GoomHash **vnamespace; +- int *types; /* type des parametres de l'instruction */ +- int cur_param; +- int nb_param; +- +- int address; +- char *jump_label; +- char *nop_label; +- +- int line_number; +- +-} Instruction; +-/* }}} */ +-typedef struct _INSTRUCTION_FLOW { /* {{{ */ +- +- Instruction **instr; +- int number; +- int tabsize; +- GoomHash *labels; +-} InstructionFlow; +-/* }}} */ +-typedef struct _FAST_INSTRUCTION { /* {{{ */ +- int id; +- InstructionData data; +- Instruction *proto; +-} FastInstruction; +-/* }}} */ +-typedef struct _FastInstructionFlow { /* {{{ */ +- int number; +- FastInstruction *instr; +- void *mallocedInstr; +-} FastInstructionFlow; +-/* }}} */ +-typedef struct _ExternalFunctionStruct { /* {{{ */ +- GoomSL_ExternalFunction function; +- GoomHash *vars; +- int is_extern; +-} ExternalFunctionStruct; +-/* }}} */ +-typedef struct _Block { +- int data; +- int size; +-} Block; +-typedef struct _GSL_StructField { /* {{{ */ +- int type; +- char name[256]; +- int offsetInStruct; /* Where this field is stored... */ +-} GSL_StructField; +- /* }}} */ +-typedef struct _GSL_Struct { /* {{{ */ +- int nbFields; +- GSL_StructField *fields[64]; +- int size; +- Block iBlock[64]; +- Block fBlock[64]; +-} GSL_Struct; +- /* }}} */ +-struct _GoomSL { /* {{{ */ +- int num_lines; +- Instruction *instr; /* instruction en cours de construction */ +- +- InstructionFlow *iflow; /* flow d'instruction 'normal' */ +- FastInstructionFlow *fastiflow; /* flow d'instruction optimise */ +- +- GoomHash *vars; /* table de variables */ +- int currentNS; +- GoomHash *namespaces[16]; +- +- GoomHash *functions; /* table des fonctions externes */ +- +- GoomHeap *data_heap; /* GSL Heap-like memory space */ +- +- int nbStructID; +- GoomHash *structIDS; +- GSL_Struct **gsl_struct; +- int gsl_struct_size; +- +- int nbPtr; +- int ptrArraySize; +- void **ptrArray; +- +- int compilationOK; +-#ifdef USE_JITC_X86 +- JitcX86Env *jitc; +- JitcFunc jitc_func; +-#endif +-}; /* }}} */ +- +-extern GoomSL *currentGoomSL; +- +-Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number); +-void gsl_instr_add_param(Instruction *_this, char *param, int type); +-void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns); +- +-void gsl_declare_task(const char *name); +-void gsl_declare_external_task(const char *name); +- +-int gsl_type_of_var(GoomHash *namespace, const char *name); +- +-void gsl_enternamespace(const char *name); +-void gsl_reenternamespace(GoomHash *ns); +-GoomHash *gsl_leavenamespace(void); +-GoomHash *gsl_find_namespace(const char *name); +- +-void gsl_commit_compilation(void); +- +-/* #define TYPE_PARAM 1 */ +- +-#define FIRST_RESERVED 0x80000 +- +-#define TYPE_INTEGER 0x90001 +-#define TYPE_FLOAT 0x90002 +-#define TYPE_VAR 0x90003 +-#define TYPE_PTR 0x90004 +-#define TYPE_LABEL 0x90005 +- +-#define TYPE_OP_EQUAL 6 +-#define TYPE_IVAR 0xa0001 +-#define TYPE_FVAR 0xa0002 +-#define TYPE_PVAR 0xa0003 +-#define TYPE_SVAR 0xa0004 +- +-#define INSTR_JUMP 6 +-#define INSTR_JZERO 29 +-#define INSTR_CALL 36 +-#define INSTR_RET 37 +-#define INSTR_EXT_CALL 38 +-#define INSTR_JNZERO 40 +- +-#define INSTR_SET 0x80001 +-#define INSTR_INT 0x80002 +-#define INSTR_FLOAT 0x80003 +-#define INSTR_PTR 0x80004 +-#define INSTR_LABEL 0x80005 +-#define INSTR_ISLOWER 0x80006 +-#define INSTR_ADD 0x80007 +-#define INSTR_MUL 0x80008 +-#define INSTR_DIV 0x80009 +-#define INSTR_SUB 0x80010 +-#define INSTR_ISEQUAL 0x80011 +-#define INSTR_NOT 0x80012 +- +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_yacc.c /src/goomsl_yacc.c +--- /home/d4rk/goom2k4-0/src/goomsl_yacc.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_yacc.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,2997 +0,0 @@ +-/* A Bison parser, made by GNU Bison 1.875. */ +- +-/* Skeleton parser for Yacc-like parsing with Bison, +- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. +- +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. +- +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 59 Temple Place - Suite 330, +- Boston, MA 02111-1307, USA. */ +- +-/* As a special exception, when this file is copied by Bison into a +- Bison output file, you may use that output file without restriction. +- This special exception was added by the Free Software Foundation +- in version 1.24 of Bison. */ +- +-/* Written by Richard Stallman by simplifying the original so called +- ``semantic'' parser. */ +- +-/* All symbols defined below should begin with yy or YY, to avoid +- infringing on user name space. This should be done even for local +- variables, as they might otherwise be expanded by user macros. +- There are some unavoidable exceptions within include files to +- define necessary library symbols; they are noted "INFRINGES ON +- USER NAME SPACE" below. */ +- +-/* Identify Bison output. */ +-#define YYBISON 1 +- +-/* Skeleton name. */ +-#define YYSKELETON_NAME "yacc.c" +- +-/* Pure parsers. */ +-#define YYPURE 0 +- +-/* Using locations. */ +-#define YYLSP_NEEDED 0 +- +- +- +-/* Tokens. */ +-#ifndef YYTOKENTYPE +-# define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- LTYPE_INTEGER = 258, +- LTYPE_FLOAT = 259, +- LTYPE_VAR = 260, +- LTYPE_PTR = 261, +- PTR_TK = 262, +- INT_TK = 263, +- FLOAT_TK = 264, +- DECLARE = 265, +- EXTERNAL = 266, +- WHILE = 267, +- DO = 268, +- NOT = 269, +- PLUS_EQ = 270, +- SUB_EQ = 271, +- DIV_EQ = 272, +- MUL_EQ = 273, +- SUP_EQ = 274, +- LOW_EQ = 275, +- NOT_EQ = 276, +- STRUCT = 277, +- FOR = 278, +- IN = 279 +- }; +-#endif +-#define LTYPE_INTEGER 258 +-#define LTYPE_FLOAT 259 +-#define LTYPE_VAR 260 +-#define LTYPE_PTR 261 +-#define PTR_TK 262 +-#define INT_TK 263 +-#define FLOAT_TK 264 +-#define DECLARE 265 +-#define EXTERNAL 266 +-#define WHILE 267 +-#define DO 268 +-#define NOT 269 +-#define PLUS_EQ 270 +-#define SUB_EQ 271 +-#define DIV_EQ 272 +-#define MUL_EQ 273 +-#define SUP_EQ 274 +-#define LOW_EQ 275 +-#define NOT_EQ 276 +-#define STRUCT 277 +-#define FOR 278 +-#define IN 279 +- +- +- +- +-/* Copy the first part of user declarations. */ +-#line 6 "goomsl_yacc.y" +- +- #include <stdio.h> +- #include <stdlib.h> +- #include <string.h> +- #include "goomsl.h" +- #include "goomsl_private.h" +- +-#define STRUCT_ALIGNMENT 16 +-/* #define VERBOSE */ +- +- int yylex(void); +- void yyerror(char *); +- extern GoomSL *currentGoomSL; +- +- static NodeType *nodeNew(const char *str, int type, int line_number); +- static NodeType *nodeClone(NodeType *node); +- static void nodeFreeInternals(NodeType *node); +- static void nodeFree(NodeType *node); +- +- static void commit_node(NodeType *node, int releaseIfTemp); +- static void precommit_node(NodeType *node); +- +- static NodeType *new_constInt(const char *str, int line_number); +- static NodeType *new_constFloat(const char *str, int line_number); +- static NodeType *new_constPtr(const char *str, int line_number); +- static NodeType *new_var(const char *str, int line_number); +- static NodeType *new_nop(const char *str); +- static NodeType *new_op(const char *str, int type, int nbOp); +- +- static int allocateLabel(); +- static int allocateTemp(); +- static void releaseTemp(int n); +- static void releaseAllTemps(); +- +- static int is_tmp_expr(NodeType *node) { +- if (node->str) { +- return (!strncmp(node->str,"_i_tmp_",7)) +- || (!strncmp(node->str,"_f_tmp_",7)) +- || (!strncmp(node->str,"_p_tmp",7)); +- } +- return 0; +- } +- /* pre: is_tmp_expr(node); */ +- static int get_tmp_id(NodeType *node) { return atoi((node->str)+5); } +- +- static int is_commutative_expr(int itype) +- { /* {{{ */ +- return (itype == INSTR_ADD) +- || (itype == INSTR_MUL) +- || (itype == INSTR_ISEQUAL); +- } /* }}} */ +- +- static void GSL_PUT_LABEL(char *name, int line_number) +- { /* {{{ */ +-#ifdef VERBOSE +- printf("label %s\n", name); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, line_number); +- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); +- } /* }}} */ +- static void GSL_PUT_JUMP(char *name, int line_number) +- { /* {{{ */ +-#ifdef VERBOSE +- printf("jump %s\n", name); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "jump", INSTR_JUMP, 1, line_number); +- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); +- } /* }}} */ +- +- static void GSL_PUT_JXXX(char *name, char *iname, int instr_id, int line_number) +- { /* {{{ */ +-#ifdef VERBOSE +- printf("%s %s\n", iname, name); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, iname, instr_id, 1, line_number); +- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); +- } /* }}} */ +- static void GSL_PUT_JZERO(char *name,int line_number) +- { /* {{{ */ +- GSL_PUT_JXXX(name,"jzero.i",INSTR_JZERO,line_number); +- } /* }}} */ +- static void GSL_PUT_JNZERO(char *name, int line_number) +- { /* {{{ */ +- GSL_PUT_JXXX(name,"jnzero.i",INSTR_JNZERO,line_number); +- } /* }}} */ +- +- /* Structures Management */ +- +-#define ALIGN_ADDR(_addr,_align) {\ +- if (_align>1) {\ +- int _dec = (_addr%_align);\ +- if (_dec != 0) _addr += _align - _dec;\ +- }} +- +- /* */ +- void gsl_prepare_struct(GSL_Struct *s, int s_align, int i_align, int f_align) +- { +- int i; +- int consumed = 0; +- int iblk=0, fblk=0; +- +- s->iBlock[0].size = 0; +- s->iBlock[0].data = 0; +- s->fBlock[0].size = 0; +- s->fBlock[0].data = 0; +- +- /* Prepare sub-struct and calculate space needed for their storage */ +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type < FIRST_RESERVED) +- { +- int j=0; +- GSL_Struct *substruct = currentGoomSL->gsl_struct[s->fields[i]->type]; +- consumed += sizeof(int); /* stocke le prefix */ +- ALIGN_ADDR(consumed, s_align); +- s->fields[i]->offsetInStruct = consumed; +- gsl_prepare_struct(substruct, s_align, i_align, f_align); +- for(j=0;substruct->iBlock[j].size>0;++j) { +- s->iBlock[iblk].data = consumed + substruct->iBlock[j].data; +- s->iBlock[iblk].size = substruct->iBlock[j].size; +- iblk++; +- } +- for(j=0;substruct->fBlock[j].size>0;++j) { +- s->fBlock[fblk].data = consumed + substruct->fBlock[j].data; +- s->fBlock[fblk].size = substruct->fBlock[j].size; +- fblk++; +- } +- consumed += substruct->size; +- } +- } +- +- /* Then prepare integers */ +- ALIGN_ADDR(consumed, i_align); +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type == INSTR_INT) +- { +- if (s->iBlock[iblk].size == 0) { +- s->iBlock[iblk].size = 1; +- s->iBlock[iblk].data = consumed; +- } else { +- s->iBlock[iblk].size += 1; +- } +- s->fields[i]->offsetInStruct = consumed; +- consumed += sizeof(int); +- } +- } +- +- iblk++; +- s->iBlock[iblk].size = 0; +- s->iBlock[iblk].data = 0; +- +- /* Then prepare floats */ +- ALIGN_ADDR(consumed, f_align); +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type == INSTR_FLOAT) +- { +- if (s->fBlock[fblk].size == 0) { +- s->fBlock[fblk].size = 1; +- s->fBlock[fblk].data = consumed; +- } else { +- s->fBlock[fblk].size += 1; +- } +- s->fields[i]->offsetInStruct = consumed; +- consumed += sizeof(int); +- } +- } +- +- fblk++; +- s->fBlock[fblk].size = 0; +- s->fBlock[fblk].data = 0; +- +- /* Finally prepare pointers */ +- ALIGN_ADDR(consumed, i_align); +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type == INSTR_PTR) +- { +- s->fields[i]->offsetInStruct = consumed; +- consumed += sizeof(int); +- } +- } +- s->size = consumed; +- } +- +- /* Returns the ID of a struct from its name */ +- int gsl_get_struct_id(const char *name) /* {{{ */ +- { +- HashValue *ret = goom_hash_get(currentGoomSL->structIDS, name); +- if (ret != NULL) return ret->i; +- return -1; +- } /* }}} */ +- +- /* Adds the definition of a struct */ +- void gsl_add_struct(const char *name, GSL_Struct *gsl_struct) /* {{{ */ +- { +- /* Prepare the struct: ie calculate internal storage format */ +- gsl_prepare_struct(gsl_struct, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT); +- +- /* If the struct does not already exists */ +- if (gsl_get_struct_id(name) < 0) +- { +- /* adds it */ +- int id = currentGoomSL->nbStructID++; +- goom_hash_put_int(currentGoomSL->structIDS, name, id); +- if (currentGoomSL->gsl_struct_size <= id) { +- currentGoomSL->gsl_struct_size *= 2; +- currentGoomSL->gsl_struct = (GSL_Struct**)realloc(currentGoomSL->gsl_struct, +- sizeof(GSL_Struct*) * currentGoomSL->gsl_struct_size); +- } +- currentGoomSL->gsl_struct[id] = gsl_struct; +- } +- } /* }}} */ +- +- /* Creates a field for a struct */ +- GSL_StructField *gsl_new_struct_field(const char *name, int type) +- { +- GSL_StructField *field = (GSL_StructField*)malloc(sizeof(GSL_StructField)); +- strcpy(field->name, name); +- field->type = type; +- return field; +- } +- +- /* Create as field for a struct which will be a struct itself */ +- GSL_StructField *gsl_new_struct_field_struct(const char *name, const char *type) +- { +- GSL_StructField *field = gsl_new_struct_field(name, gsl_get_struct_id(type)); +- if (field->type < 0) { +- fprintf(stderr, "ERROR: Line %d, Unknown structure: '%s'\n", +- currentGoomSL->num_lines, type); +- exit(1); +- } +- return field; +- } +- +- /* Creates a Struct */ +- GSL_Struct *gsl_new_struct(GSL_StructField *field) +- { +- GSL_Struct *s = (GSL_Struct*)malloc(sizeof(GSL_Struct)); +- s->nbFields = 1; +- s->fields[0] = field; +- return s; +- } +- +- /* Adds a field to a struct */ +- void gsl_add_struct_field(GSL_Struct *s, GSL_StructField *field) +- { +- s->fields[s->nbFields++] = field; +- } +- +- int gsl_type_of_var(GoomHash *ns, const char *name) +- { +- char type_of[256]; +- HashValue *hv; +- sprintf(type_of, "__type_of_%s", name); +- hv = goom_hash_get(ns, type_of); +- if (hv != NULL) +- return hv->i; +- fprintf(stderr, "ERROR: Unknown variable type: '%s'\n", name); +- return -1; +- } +- +- static void gsl_declare_var(GoomHash *ns, const char *name, int type, void *space) +- { +- char type_of[256]; +- if (name[0] == '@') { ns = currentGoomSL->vars; } +- +- if (space == NULL) { +- switch (type) { +- case INSTR_INT: +- case INSTR_FLOAT: +- case INSTR_PTR: +- space = goom_heap_malloc_with_alignment(currentGoomSL->data_heap, +- sizeof(int), sizeof(int)); +- break; +- case -1: +- fprintf(stderr, "What the fuck!\n"); +- exit(1); +- default: /* On a un struct_id */ +- space = goom_heap_malloc_with_alignment_prefixed(currentGoomSL->data_heap, +- currentGoomSL->gsl_struct[type]->size, STRUCT_ALIGNMENT, sizeof(int)); +- } +- } +- goom_hash_put_ptr(ns, name, (void*)space); +- sprintf(type_of, "__type_of_%s", name); +- goom_hash_put_int(ns, type_of, type); +- +- /* Ensuite le hack: on ajoute les champs en tant que variables. */ +- if (type < FIRST_RESERVED) +- { +- int i; +- GSL_Struct *gsl_struct = currentGoomSL->gsl_struct[type]; +- ((int*)space)[-1] = type; /* stockage du type dans le prefixe de structure */ +- for (i = 0; i < gsl_struct->nbFields; ++i) +- { +- char full_name[256]; +- char *cspace = (char*)space + gsl_struct->fields[i]->offsetInStruct; +- sprintf(full_name, "%s.%s", name, gsl_struct->fields[i]->name); +- gsl_declare_var(ns, full_name, gsl_struct->fields[i]->type, cspace); +- } +- } +- } +- +- /* Declare a variable which will be a struct */ +- static void gsl_struct_decl(GoomHash *namespace, const char *struct_name, const char *name) +- { +- int struct_id = gsl_get_struct_id(struct_name); +- gsl_declare_var(namespace, name, struct_id, NULL); +- } +- +- static void gsl_float_decl_global(const char *name) +- { +- gsl_declare_var(currentGoomSL->vars, name, INSTR_FLOAT, NULL); +- } +- static void gsl_int_decl_global(const char *name) +- { +- gsl_declare_var(currentGoomSL->vars, name, INSTR_INT, NULL); +- } +- static void gsl_ptr_decl_global(const char *name) +- { +- gsl_declare_var(currentGoomSL->vars, name, INSTR_PTR, NULL); +- } +- static void gsl_struct_decl_global_from_id(const char *name, int id) +- { +- gsl_declare_var(currentGoomSL->vars, name, id, NULL); +- } +- +- /* FLOAT */ +- static void gsl_float_decl_local(const char *name) +- { +- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_FLOAT, NULL); +- } +- /* INT */ +- static void gsl_int_decl_local(const char *name) +- { +- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_INT, NULL); +- } +- /* PTR */ +- static void gsl_ptr_decl_local(const char *name) +- { +- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_PTR, NULL); +- } +- /* STRUCT */ +- static void gsl_struct_decl_local(const char *struct_name, const char *name) +- { +- gsl_struct_decl(currentGoomSL->namespaces[currentGoomSL->currentNS],struct_name,name); +- } +- +- +- static void commit_test2(NodeType *set,const char *type, int instr); +- static NodeType *new_call(const char *name, NodeType *affect_list); +- +- /* SETTER */ +- static NodeType *new_set(NodeType *lvalue, NodeType *expression) +- { /* {{{ */ +- NodeType *set = new_op("set", OPR_SET, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } /* }}} */ +- static void commit_set(NodeType *set) +- { /* {{{ */ +- commit_test2(set,"set",INSTR_SET); +- } /* }}} */ +- +- /* PLUS_EQ */ +- static NodeType *new_plus_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("plus_eq", OPR_PLUS_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_plus_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("add %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "add", INSTR_ADD, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* SUB_EQ */ +- static NodeType *new_sub_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("sub_eq", OPR_SUB_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_sub_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("sub %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "sub", INSTR_SUB, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* MUL_EQ */ +- static NodeType *new_mul_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("mul_eq", OPR_MUL_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_mul_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("mul %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "mul", INSTR_MUL, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* DIV_EQ */ +- static NodeType *new_div_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("div_eq", OPR_DIV_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_div_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("div %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "div", INSTR_DIV, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* commodity method for add, mult, ... */ +- +- static void precommit_expr(NodeType *expr, const char *type, int instr_id) +- { /* {{{ */ +- NodeType *tmp, *tmpcpy; +- int toAdd; +- +- /* compute "left" and "right" */ +- switch (expr->unode.opr.nbOp) { +- case 2: +- precommit_node(expr->unode.opr.op[1]); +- case 1: +- precommit_node(expr->unode.opr.op[0]); +- } +- +- if (is_tmp_expr(expr->unode.opr.op[0])) { +- tmp = expr->unode.opr.op[0]; +- toAdd = 1; +- } +- else if (is_commutative_expr(instr_id) && (expr->unode.opr.nbOp==2) && is_tmp_expr(expr->unode.opr.op[1])) { +- tmp = expr->unode.opr.op[1]; +- toAdd = 0; +- } +- else { +- char stmp[256]; +- /* declare a temporary variable to store the result */ +- if (expr->unode.opr.op[0]->type == CONST_INT_NODE) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (expr->unode.opr.op[0]->type == CONST_FLOAT_NODE) { +- sprintf(stmp,"_f_tmp%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (expr->unode.opr.op[0]->type == CONST_PTR_NODE) { +- sprintf(stmp,"_p_tmp%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- else { +- int type = gsl_type_of_var(expr->unode.opr.op[0]->vnamespace, expr->unode.opr.op[0]->str); +- if (type == INSTR_FLOAT) { +- sprintf(stmp,"_f_tmp_%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (type == INSTR_PTR) { +- sprintf(stmp,"_p_tmp_%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- else if (type == INSTR_INT) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (type == -1) { +- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", +- expr->line_number, expr->unode.opr.op[0]->str); +- exit(1); +- } +- else { /* type is a struct_id */ +- sprintf(stmp,"_s_tmp_%i",allocateTemp()); +- gsl_struct_decl_global_from_id(stmp,type); +- } +- } +- tmp = new_var(stmp,expr->line_number); +- +- /* set the tmp to the value of "op1" */ +- tmpcpy = nodeClone(tmp); +- commit_node(new_set(tmp,expr->unode.opr.op[0]),0); +- toAdd = 1; +- +- tmp = tmpcpy; +- } +- +- /* add op2 to tmp */ +-#ifdef VERBOSE +- if (expr->unode.opr.nbOp == 2) +- printf("%s %s %s\n", type, tmp->str, expr->unode.opr.op[toAdd]->str); +- else +- printf("%s %s\n", type, tmp->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr_id, expr->unode.opr.nbOp, expr->line_number); +- tmpcpy = nodeClone(tmp); +- commit_node(tmp,0); +- if (expr->unode.opr.nbOp == 2) { +- commit_node(expr->unode.opr.op[toAdd],1); +- } +- +- /* redefine the ADD node now as the computed variable */ +- nodeFreeInternals(expr); +- *expr = *tmpcpy; +- free(tmpcpy); +- } /* }}} */ +- +- static NodeType *new_expr1(const char *name, int id, NodeType *expr1) +- { /* {{{ */ +- NodeType *add = new_op(name, id, 1); +- add->unode.opr.op[0] = expr1; +- return add; +- } /* }}} */ +- +- static NodeType *new_expr2(const char *name, int id, NodeType *expr1, NodeType *expr2) +- { /* {{{ */ +- NodeType *add = new_op(name, id, 2); +- add->unode.opr.op[0] = expr1; +- add->unode.opr.op[1] = expr2; +- return add; +- } /* }}} */ +- +- /* ADD */ +- static NodeType *new_add(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("add", OPR_ADD, expr1, expr2); +- } +- static void precommit_add(NodeType *add) { +- precommit_expr(add,"add",INSTR_ADD); +- } /* }}} */ +- +- /* SUB */ +- static NodeType *new_sub(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("sub", OPR_SUB, expr1, expr2); +- } +- static void precommit_sub(NodeType *sub) { +- precommit_expr(sub,"sub",INSTR_SUB); +- } /* }}} */ +- +- /* NEG */ +- static NodeType *new_neg(NodeType *expr) { /* {{{ */ +- NodeType *zeroConst = NULL; +- if (expr->type == CONST_INT_NODE) +- zeroConst = new_constInt("0", currentGoomSL->num_lines); +- else if (expr->type == CONST_FLOAT_NODE) +- zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); +- else if (expr->type == CONST_PTR_NODE) { +- fprintf(stderr, "ERROR: Line %d, Could not negate const pointer.\n", +- currentGoomSL->num_lines); +- exit(1); +- } +- else { +- int type = gsl_type_of_var(expr->vnamespace, expr->str); +- if (type == INSTR_FLOAT) +- zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); +- else if (type == INSTR_PTR) { +- fprintf(stderr, "ERROR: Line %d, Could not negate pointer.\n", +- currentGoomSL->num_lines); +- exit(1); +- } +- else if (type == INSTR_INT) +- zeroConst = new_constInt("0", currentGoomSL->num_lines); +- else if (type == -1) { +- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", +- expr->line_number, expr->unode.opr.op[0]->str); +- exit(1); +- } +- else { /* type is a struct_id */ +- fprintf(stderr, "ERROR: Line %d, Could not negate struct '%s'\n", +- expr->line_number, expr->str); +- exit(1); +- } +- } +- return new_expr2("sub", OPR_SUB, zeroConst, expr); +- } +- /* }}} */ +- +- /* MUL */ +- static NodeType *new_mul(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("mul", OPR_MUL, expr1, expr2); +- } +- static void precommit_mul(NodeType *mul) { +- precommit_expr(mul,"mul",INSTR_MUL); +- } /* }}} */ +- +- /* DIV */ +- static NodeType *new_div(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("div", OPR_DIV, expr1, expr2); +- } +- static void precommit_div(NodeType *mul) { +- precommit_expr(mul,"div",INSTR_DIV); +- } /* }}} */ +- +- /* CALL EXPRESSION */ +- static NodeType *new_call_expr(const char *name, NodeType *affect_list) { /* {{{ */ +- NodeType *call = new_call(name,affect_list); +- NodeType *node = new_expr1(name, OPR_CALL_EXPR, call); +- node->vnamespace = gsl_find_namespace(name); +- if (node->vnamespace == NULL) +- fprintf(stderr, "ERROR: Line %d, No return type for: '%s'\n", currentGoomSL->num_lines, name); +- return node; +- } +- static void precommit_call_expr(NodeType *call) { +- char stmp[256]; +- NodeType *tmp,*tmpcpy; +- int type = gsl_type_of_var(call->vnamespace, call->str); +- if (type == INSTR_FLOAT) { +- sprintf(stmp,"_f_tmp_%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (type == INSTR_PTR) { +- sprintf(stmp,"_p_tmp_%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- else if (type == INSTR_INT) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (type == -1) { +- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", +- call->line_number, call->str); +- exit(1); +- } +- else { /* type is a struct_id */ +- sprintf(stmp,"_s_tmp_%i",allocateTemp()); +- gsl_struct_decl_global_from_id(stmp,type); +- } +- tmp = new_var(stmp,call->line_number); +- commit_node(call->unode.opr.op[0],0); +- tmpcpy = nodeClone(tmp); +- commit_node(new_set(tmp,new_var(call->str,call->line_number)),0); +- +- nodeFreeInternals(call); +- *call = *tmpcpy; +- free(tmpcpy); +- } /* }}} */ +- +- static void commit_test2(NodeType *set,const char *type, int instr) +- { /* {{{ */ +- NodeType *tmp; +- char stmp[256]; +- precommit_node(set->unode.opr.op[0]); +- precommit_node(set->unode.opr.op[1]); +- tmp = set->unode.opr.op[0]; +- +- stmp[0] = 0; +- if (set->unode.opr.op[0]->type == CONST_INT_NODE) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (set->unode.opr.op[0]->type == CONST_FLOAT_NODE) { +- sprintf(stmp,"_f_tmp%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (set->unode.opr.op[0]->type == CONST_PTR_NODE) { +- sprintf(stmp,"_p_tmp%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- if (stmp[0]) { +- NodeType *tmpcpy; +- tmp = new_var(stmp, set->line_number); +- tmpcpy = nodeClone(tmp); +- commit_node(new_set(tmp,set->unode.opr.op[0]),0); +- tmp = tmpcpy; +- } +- +-#ifdef VERBOSE +- printf("%s %s %s\n", type, tmp->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr, 2, set->line_number); +- commit_node(tmp,instr!=INSTR_SET); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* NOT */ +- static NodeType *new_not(NodeType *expr1) { /* {{{ */ +- return new_expr1("not", OPR_NOT, expr1); +- } +- static void commit_not(NodeType *set) +- { +- commit_node(set->unode.opr.op[0],0); +-#ifdef VERBOSE +- printf("not\n"); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "not", INSTR_NOT, 1, set->line_number); +- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +- } /* }}} */ +- +- /* EQU */ +- static NodeType *new_equ(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("isequal", OPR_EQU, expr1, expr2); +- } +- static void commit_equ(NodeType *mul) { +- commit_test2(mul,"isequal",INSTR_ISEQUAL); +- } /* }}} */ +- +- /* INF */ +- static NodeType *new_low(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("islower", OPR_LOW, expr1, expr2); +- } +- static void commit_low(NodeType *mul) { +- commit_test2(mul,"islower",INSTR_ISLOWER); +- } /* }}} */ +- +- /* WHILE */ +- static NodeType *new_while(NodeType *expression, NodeType *instr) { /* {{{ */ +- NodeType *node = new_op("while", OPR_WHILE, 2); +- node->unode.opr.op[0] = expression; +- node->unode.opr.op[1] = instr; +- return node; +- } +- +- static void commit_while(NodeType *node) +- { +- int lbl = allocateLabel(); +- char start_while[1024], test_while[1024]; +- sprintf(start_while, "|start_while_%d|", lbl); +- sprintf(test_while, "|test_while_%d|", lbl); +- +- GSL_PUT_JUMP(test_while,node->line_number); +- GSL_PUT_LABEL(start_while,node->line_number); +- +- /* code */ +- commit_node(node->unode.opr.op[1],0); +- +- GSL_PUT_LABEL(test_while,node->line_number); +- commit_node(node->unode.opr.op[0],0); +- GSL_PUT_JNZERO(start_while,node->line_number); +- } /* }}} */ +- +- /* FOR EACH */ +- static NodeType *new_static_foreach(NodeType *var, NodeType *var_list, NodeType *instr) { /* {{{ */ +- NodeType *node = new_op("for", OPR_FOREACH, 3); +- node->unode.opr.op[0] = var; +- node->unode.opr.op[1] = var_list; +- node->unode.opr.op[2] = instr; +- node->line_number = currentGoomSL->num_lines; +- return node; +- } +- static void commit_foreach(NodeType *node) +- { +- NodeType *cur = node->unode.opr.op[1]; +- char tmp_func[256], tmp_loop[256]; +- int lbl = allocateLabel(); +- sprintf(tmp_func, "|foreach_func_%d|", lbl); +- sprintf(tmp_loop, "|foreach_loop_%d|", lbl); +- +- GSL_PUT_JUMP(tmp_loop, node->line_number); +- GSL_PUT_LABEL(tmp_func, node->line_number); +- +- precommit_node(node->unode.opr.op[2]); +- commit_node(node->unode.opr.op[2], 0); +- +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +-#ifdef VERBOSE +- printf("ret\n"); +-#endif +- +- GSL_PUT_LABEL(tmp_loop, node->line_number); +- +- while (cur != NULL) +- { +- NodeType *x, *var; +- +- /* 1: x=var */ +- x = nodeClone(node->unode.opr.op[0]); +- var = nodeClone(cur->unode.opr.op[0]); +- commit_node(new_set(x, var),0); +- +- /* 2: instr */ +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, tmp_func, TYPE_LABEL); +-#ifdef VERBOSE +- printf("call %s\n", tmp_func); +-#endif +- +- /* 3: var=x */ +- x = nodeClone(node->unode.opr.op[0]); +- var = cur->unode.opr.op[0]; +- commit_node(new_set(var, x),0); +- cur = cur->unode.opr.op[1]; +- } +- nodeFree(node->unode.opr.op[0]); +- } /* }}} */ +- +- /* IF */ +- static NodeType *new_if(NodeType *expression, NodeType *instr) { /* {{{ */ +- NodeType *node = new_op("if", OPR_IF, 2); +- node->unode.opr.op[0] = expression; +- node->unode.opr.op[1] = instr; +- return node; +- } +- static void commit_if(NodeType *node) { +- +- char slab[1024]; +- sprintf(slab, "|eif%d|", allocateLabel()); +- commit_node(node->unode.opr.op[0],0); +- GSL_PUT_JZERO(slab,node->line_number); +- /* code */ +- commit_node(node->unode.opr.op[1],0); +- GSL_PUT_LABEL(slab,node->line_number); +- } /* }}} */ +- +- /* BLOCK */ +- static NodeType *new_block(NodeType *lastNode) { /* {{{ */ +- NodeType *blk = new_op("block", OPR_BLOCK, 2); +- blk->unode.opr.op[0] = new_nop("start_of_block"); +- blk->unode.opr.op[1] = lastNode; +- return blk; +- } +- static void commit_block(NodeType *node) { +- commit_node(node->unode.opr.op[0]->unode.opr.next,0); +- } /* }}} */ +- +- /* FUNCTION INTRO */ +- static NodeType *new_function_intro(const char *name) { /* {{{ */ +- char stmp[256]; +- if (strlen(name) < 200) { +- sprintf(stmp, "|__func_%s|", name); +- } +- return new_op(stmp, OPR_FUNC_INTRO, 0); +- } +- static void commit_function_intro(NodeType *node) { +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +-#ifdef VERBOSE +- printf("label %s\n", node->str); +-#endif +- } /* }}} */ +- +- /* FUNCTION OUTRO */ +- static NodeType *new_function_outro() { /* {{{ */ +- return new_op("ret", OPR_FUNC_OUTRO, 0); +- } +- static void commit_function_outro(NodeType *node) { +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +- releaseAllTemps(); +-#ifdef VERBOSE +- printf("ret\n"); +-#endif +- } /* }}} */ +- +- /* AFFECTATION LIST */ +- static NodeType *new_affec_list(NodeType *set, NodeType *next) /* {{{ */ +- { +- NodeType *node = new_op("affect_list", OPR_AFFECT_LIST, 2); +- node->unode.opr.op[0] = set; +- node->unode.opr.op[1] = next; +- return node; +- } +- static NodeType *new_affect_list_after(NodeType *affect_list) +- { +- NodeType *ret = NULL; +- NodeType *cur = affect_list; +- while(cur != NULL) { +- NodeType *set = cur->unode.opr.op[0]; +- NodeType *next = cur->unode.opr.op[1]; +- NodeType *lvalue = set->unode.opr.op[0]; +- NodeType *expression = set->unode.opr.op[1]; +- if ((lvalue->str[0] == '&') && (expression->type == VAR_NODE)) { +- NodeType *nset = new_set(nodeClone(expression), nodeClone(lvalue)); +- ret = new_affec_list(nset, ret); +- } +- cur = next; +- } +- return ret; +- } +- static void commit_affect_list(NodeType *node) +- { +- NodeType *cur = node; +- while(cur != NULL) { +- NodeType *set = cur->unode.opr.op[0]; +- precommit_node(set->unode.opr.op[0]); +- precommit_node(set->unode.opr.op[1]); +- cur = cur->unode.opr.op[1]; +- } +- cur = node; +- while(cur != NULL) { +- NodeType *set = cur->unode.opr.op[0]; +- commit_node(set,0); +- cur = cur->unode.opr.op[1]; +- } +- } /* }}} */ +- +- /* VAR LIST */ +- static NodeType *new_var_list(NodeType *var, NodeType *next) /* {{{ */ +- { +- NodeType *node = new_op("var_list", OPR_VAR_LIST, 2); +- node->unode.opr.op[0] = var; +- node->unode.opr.op[1] = next; +- return node; +- } +- static void commit_var_list(NodeType *node) +- { +- } /* }}} */ +- +- /* FUNCTION CALL */ +- static NodeType *new_call(const char *name, NodeType *affect_list) { /* {{{ */ +- HashValue *fval; +- fval = goom_hash_get(currentGoomSL->functions, name); +- if (!fval) { +- gsl_declare_task(name); +- fval = goom_hash_get(currentGoomSL->functions, name); +- } +- if (!fval) { +- fprintf(stderr, "ERROR: Line %d, Could not find function %s\n", currentGoomSL->num_lines, name); +- exit(1); +- return NULL; +- } +- else { +- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)fval->ptr; +- if (gef->is_extern) { +- NodeType *node = new_op(name, OPR_EXT_CALL, 1); +- node->unode.opr.op[0] = affect_list; +- return node; +- } +- else { +- NodeType *node; +- char stmp[256]; +- if (strlen(name) < 200) { +- sprintf(stmp, "|__func_%s|", name); +- } +- node = new_op(stmp, OPR_CALL, 1); +- node->unode.opr.op[0] = affect_list; +- return node; +- } +- } +- } +- static void commit_ext_call(NodeType *node) { +- NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); +- commit_node(node->unode.opr.op[0],0); +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "extcall", INSTR_EXT_CALL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); +-#ifdef VERBOSE +- printf("extcall %s\n", node->str); +-#endif +- commit_node(alafter,0); +- } +- static void commit_call(NodeType *node) { +- NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); +- commit_node(node->unode.opr.op[0],0); +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +-#ifdef VERBOSE +- printf("call %s\n", node->str); +-#endif +- commit_node(alafter,0); +- } /* }}} */ +- +- /** **/ +- +- static NodeType *rootNode = 0; /* TODO: reinitialiser a chaque compilation. */ +- static NodeType *lastNode = 0; +- static NodeType *gsl_append(NodeType *curNode) { +- if (curNode == 0) return 0; /* {{{ */ +- if (lastNode) +- lastNode->unode.opr.next = curNode; +- lastNode = curNode; +- while(lastNode->unode.opr.next) lastNode = lastNode->unode.opr.next; +- if (rootNode == 0) +- rootNode = curNode; +- return curNode; +- } /* }}} */ +- +-#if 1 +- int allocateTemp() { +- return allocateLabel(); +- } +- void releaseAllTemps() {} +- void releaseTemp(int n) {} +-#else +- static int nbTemp = 0; +- static int *tempArray = 0; +- static int tempArraySize = 0; +- int allocateTemp() { /* TODO: allocateITemp, allocateFTemp */ +- int i = 0; /* {{{ */ +- if (tempArray == 0) { +- tempArraySize = 256; +- tempArray = (int*)malloc(tempArraySize * sizeof(int)); +- } +- while (1) { +- int j; +- for (j=0;j<nbTemp;++j) { +- if (tempArray[j] == i) break; +- } +- if (j == nbTemp) { +- if (nbTemp == tempArraySize) { +- tempArraySize *= 2; +- tempArray = (int*)realloc(tempArray,tempArraySize * sizeof(int)); +- } +- tempArray[nbTemp++] = i; +- return i; +- } +- i++; +- } +- } /* }}} */ +- void releaseAllTemps() { +- nbTemp = 0; /* {{{ */ +- } /* }}} */ +- void releaseTemp(int n) { +- int j; /* {{{ */ +- for (j=0;j<nbTemp;++j) { +- if (tempArray[j] == n) { +- tempArray[j] = tempArray[--nbTemp]; +- break; +- } +- } +- } /* }}} */ +-#endif +- +- static int lastLabel = 0; +- int allocateLabel() { +- return ++lastLabel; /* {{{ */ +- } /* }}} */ +- +- void gsl_commit_compilation() +- { /* {{{ */ +- commit_node(rootNode,0); +- rootNode = 0; +- lastNode = 0; +- } /* }}} */ +- +- void precommit_node(NodeType *node) +- { /* {{{ */ +- /* do here stuff for expression.. for exemple */ +- if (node->type == OPR_NODE) +- switch(node->unode.opr.type) { +- case OPR_ADD: precommit_add(node); break; +- case OPR_SUB: precommit_sub(node); break; +- case OPR_MUL: precommit_mul(node); break; +- case OPR_DIV: precommit_div(node); break; +- case OPR_CALL_EXPR: precommit_call_expr(node); break; +- } +- } /* }}} */ +- +- void commit_node(NodeType *node, int releaseIfTmp) +- { /* {{{ */ +- if (node == 0) return; +- +- switch(node->type) { +- case OPR_NODE: +- switch(node->unode.opr.type) { +- case OPR_SET: commit_set(node); break; +- case OPR_PLUS_EQ: commit_plus_eq(node); break; +- case OPR_SUB_EQ: commit_sub_eq(node); break; +- case OPR_MUL_EQ: commit_mul_eq(node); break; +- case OPR_DIV_EQ: commit_div_eq(node); break; +- case OPR_IF: commit_if(node); break; +- case OPR_WHILE: commit_while(node); break; +- case OPR_BLOCK: commit_block(node); break; +- case OPR_FUNC_INTRO: commit_function_intro(node); break; +- case OPR_FUNC_OUTRO: commit_function_outro(node); break; +- case OPR_CALL: commit_call(node); break; +- case OPR_EXT_CALL: commit_ext_call(node); break; +- case OPR_EQU: commit_equ(node); break; +- case OPR_LOW: commit_low(node); break; +- case OPR_NOT: commit_not(node); break; +- case OPR_AFFECT_LIST: commit_affect_list(node); break; +- case OPR_FOREACH: commit_foreach(node); break; +- case OPR_VAR_LIST: commit_var_list(node); break; +-#ifdef VERBOSE +- case EMPTY_NODE: printf("NOP\n"); break; +-#endif +- } +- +- commit_node(node->unode.opr.next,0); /* recursive for the moment, maybe better to do something iterative? */ +- break; +- +- case VAR_NODE: gsl_instr_set_namespace(currentGoomSL->instr, node->vnamespace); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); break; +- case CONST_INT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_INTEGER); break; +- case CONST_FLOAT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_FLOAT); break; +- case CONST_PTR_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_PTR); break; +- } +- if (releaseIfTmp && is_tmp_expr(node)) +- releaseTemp(get_tmp_id(node)); +- +- nodeFree(node); +- } /* }}} */ +- +- NodeType *nodeNew(const char *str, int type, int line_number) { +- NodeType *node = (NodeType*)malloc(sizeof(NodeType)); /* {{{ */ +- node->type = type; +- node->str = (char*)malloc(strlen(str)+1); +- node->vnamespace = NULL; +- node->line_number = line_number; +- strcpy(node->str, str); +- return node; +- } /* }}} */ +- static NodeType *nodeClone(NodeType *node) { +- NodeType *ret = nodeNew(node->str, node->type, node->line_number); /* {{{ */ +- ret->vnamespace = node->vnamespace; +- ret->unode = node->unode; +- return ret; +- } /* }}} */ +- +- void nodeFreeInternals(NodeType *node) { +- free(node->str); /* {{{ */ +- } /* }}} */ +- +- void nodeFree(NodeType *node) { +- nodeFreeInternals(node); /* {{{ */ +- free(node); +- } /* }}} */ +- +- NodeType *new_constInt(const char *str, int line_number) { +- NodeType *node = nodeNew(str, CONST_INT_NODE, line_number); /* {{{ */ +- node->unode.constInt.val = atoi(str); +- return node; +- } /* }}} */ +- +- NodeType *new_constPtr(const char *str, int line_number) { +- NodeType *node = nodeNew(str, CONST_PTR_NODE, line_number); /* {{{ */ +- node->unode.constPtr.id = strtol(str,NULL,0); +- return node; +- } /* }}} */ +- +- NodeType *new_constFloat(const char *str, int line_number) { +- NodeType *node = nodeNew(str, CONST_FLOAT_NODE, line_number); /* {{{ */ +- node->unode.constFloat.val = atof(str); +- return node; +- } /* }}} */ +- +- NodeType *new_var(const char *str, int line_number) { +- NodeType *node = nodeNew(str, VAR_NODE, line_number); /* {{{ */ +- node->vnamespace = gsl_find_namespace(str); +- if (node->vnamespace == 0) { +- fprintf(stderr, "ERROR: Line %d, Variable not found: '%s'\n", line_number, str); +- exit(1); +- } +- return node; +- } /* }}} */ +- +- NodeType *new_nop(const char *str) { +- NodeType *node = new_op(str, EMPTY_NODE, 0); /* {{{ */ +- return node; +- } /* }}} */ +- +- NodeType *new_op(const char *str, int type, int nbOp) { +- int i; /* {{{ */ +- NodeType *node = nodeNew(str, OPR_NODE, currentGoomSL->num_lines); +- node->unode.opr.next = 0; +- node->unode.opr.type = type; +- node->unode.opr.nbOp = nbOp; +- for (i=0;i<nbOp;++i) node->unode.opr.op[i] = 0; +- return node; +- } /* }}} */ +- +- +- void gsl_declare_global_variable(int type, char *name) { +- switch(type){ +- case -1: break; +- case FLOAT_TK:gsl_float_decl_global(name);break; +- case INT_TK: gsl_int_decl_global(name);break; +- case PTR_TK: gsl_ptr_decl_global(name);break; +- default: +- { +- int id = type - 1000; +- gsl_struct_decl_global_from_id(name,id); +- } +- } +- } +- +- +- +-/* Enabling traces. */ +-#ifndef YYDEBUG +-# define YYDEBUG 0 +-#endif +- +-/* Enabling verbose error messages. */ +-#ifdef YYERROR_VERBOSE +-# undef YYERROR_VERBOSE +-# define YYERROR_VERBOSE 1 +-#else +-# define YYERROR_VERBOSE 0 +-#endif +- +-#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +-#line 1199 "goomsl_yacc.y" +-typedef union YYSTYPE { +- int intValue; +- float floatValue; +- char charValue; +- char strValue[2048]; +- NodeType *nPtr; +- GoomHash *namespace; +- GSL_Struct *gsl_struct; +- GSL_StructField *gsl_struct_field; +- } YYSTYPE; +-/* Line 191 of yacc.c. */ +-#line 1327 "goomsl_yacc.c" +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +-# define YYSTYPE_IS_DECLARED 1 +-# define YYSTYPE_IS_TRIVIAL 1 +-#endif +- +- +- +-/* Copy the second part of user declarations. */ +- +- +-/* Line 214 of yacc.c. */ +-#line 1339 "goomsl_yacc.c" +- +-#if ! defined (yyoverflow) || YYERROR_VERBOSE +- +-/* The parser invokes alloca or malloc; define the necessary symbols. */ +- +-# if YYSTACK_USE_ALLOCA +-# define YYSTACK_ALLOC alloca +-# else +-# ifndef YYSTACK_USE_ALLOCA +-# if defined (alloca) || defined (_ALLOCA_H) +-# define YYSTACK_ALLOC alloca +-# else +-# ifdef __GNUC__ +-# define YYSTACK_ALLOC __builtin_alloca +-# endif +-# endif +-# endif +-# endif +- +-# ifdef YYSTACK_ALLOC +- /* Pacify GCC's `empty if-body' warning. */ +-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +-# else +-# if defined (__STDC__) || defined (__cplusplus) +-# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ +-# define YYSIZE_T size_t +-# endif +-# define YYSTACK_ALLOC malloc +-# define YYSTACK_FREE free +-# endif +-#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ +- +- +-#if (! defined (yyoverflow) \ +- && (! defined (__cplusplus) \ +- || (YYSTYPE_IS_TRIVIAL))) +- +-/* A type that is properly aligned for any stack member. */ +-union yyalloc +-{ +- short yyss; +- YYSTYPE yyvs; +- }; +- +-/* The size of the maximum gap between one aligned stack and the next. */ +-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) +- +-/* The size of an array large to enough to hold all stacks, each with +- N elements. */ +-# define YYSTACK_BYTES(N) \ +- ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ +- + YYSTACK_GAP_MAXIMUM) +- +-/* Copy COUNT objects from FROM to TO. The source and destination do +- not overlap. */ +-# ifndef YYCOPY +-# if 1 < __GNUC__ +-# define YYCOPY(To, From, Count) \ +- __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +-# else +-# define YYCOPY(To, From, Count) \ +- do \ +- { \ +- register YYSIZE_T yyi; \ +- for (yyi = 0; yyi < (Count); yyi++) \ +- (To)[yyi] = (From)[yyi]; \ +- } \ +- while (0) +-# endif +-# endif +- +-/* Relocate STACK from its old location to the new one. The +- local variables YYSIZE and YYSTACKSIZE give the old and new number of +- elements in the stack, and YYPTR gives the new location of the +- stack. Advance YYPTR to a properly aligned location for the next +- stack. */ +-# define YYSTACK_RELOCATE(Stack) \ +- do \ +- { \ +- YYSIZE_T yynewbytes; \ +- YYCOPY (&yyptr->Stack, Stack, yysize); \ +- Stack = &yyptr->Stack; \ +- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ +- yyptr += yynewbytes / sizeof (*yyptr); \ +- } \ +- while (0) +- +-#endif +- +-#if defined (__STDC__) || defined (__cplusplus) +- typedef signed char yysigned_char; +-#else +- typedef short yysigned_char; +-#endif +- +-/* YYFINAL -- State number of the termination state. */ +-#define YYFINAL 3 +-/* YYLAST -- Last index in YYTABLE. */ +-#define YYLAST 229 +- +-/* YYNTOKENS -- Number of terminals. */ +-#define YYNTOKENS 42 +-/* YYNNTS -- Number of nonterminals. */ +-#define YYNNTS 30 +-/* YYNRULES -- Number of rules. */ +-#define YYNRULES 89 +-/* YYNRULES -- Number of states. */ +-#define YYNSTATES 217 +- +-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +-#define YYUNDEFTOK 2 +-#define YYMAXUTOK 279 +- +-#define YYTRANSLATE(YYX) \ +- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) +- +-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +-static const unsigned char yytranslate[] = +-{ +- 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 35, 36, 32, 29, 34, 30, 2, 31, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 33, 2, +- 27, 26, 28, 37, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 40, 2, 41, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 38, 2, 39, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +- 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, +- 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, +- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 +-}; +- +-#if YYDEBUG +-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in +- YYRHS. */ +-static const unsigned short yyprhs[] = +-{ +- 0, 0, 3, 7, 10, 19, 30, 39, 50, 53, +- 56, 57, 65, 68, 73, 76, 79, 82, 85, 87, +- 89, 90, 93, 96, 99, 102, 104, 108, 111, 112, +- 116, 122, 130, 131, 132, 137, 142, 147, 152, 154, +- 157, 160, 163, 166, 169, 172, 179, 186, 193, 195, +- 199, 203, 207, 211, 218, 222, 224, 227, 231, 232, +- 234, 236, 240, 244, 248, 252, 255, 259, 261, 265, +- 269, 273, 277, 281, 285, 288, 290, 292, 294, 298, +- 304, 310, 318, 323, 330, 333, 335, 340, 344, 346 +-}; +- +-/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +-static const yysigned_char yyrhs[] = +-{ +- 43, 0, -1, 44, 55, 52, -1, 44, 59, -1, +- 44, 11, 27, 48, 28, 50, 25, 56, -1, 44, +- 11, 27, 48, 33, 51, 28, 50, 25, 56, -1, +- 44, 10, 27, 49, 28, 50, 25, 56, -1, 44, +- 10, 27, 49, 33, 51, 28, 50, 25, 56, -1, +- 44, 45, -1, 44, 25, -1, -1, 22, 27, 5, +- 33, 46, 28, 25, -1, 71, 47, -1, 46, 34, +- 71, 47, -1, 8, 5, -1, 9, 5, -1, 7, +- 5, -1, 5, 5, -1, 5, -1, 5, -1, -1, +- 33, 8, -1, 33, 9, -1, 33, 7, -1, 33, +- 5, -1, 58, -1, 58, 34, 51, -1, 52, 53, +- -1, -1, 54, 44, 55, -1, 27, 49, 28, 50, +- 25, -1, 27, 49, 33, 51, 28, 50, 25, -1, +- -1, -1, 9, 5, 26, 64, -1, 8, 5, 26, +- 64, -1, 7, 5, 26, 64, -1, 5, 5, 26, +- 64, -1, 58, -1, 9, 5, -1, 8, 5, -1, +- 7, 5, -1, 5, 5, -1, 62, 25, -1, 57, +- 25, -1, 35, 65, 36, 37, 71, 59, -1, 12, +- 65, 71, 13, 71, 59, -1, 38, 25, 63, 44, +- 39, 25, -1, 67, -1, 5, 15, 64, -1, 5, +- 16, 64, -1, 5, 18, 64, -1, 5, 17, 64, +- -1, 23, 5, 24, 60, 13, 59, -1, 35, 61, +- 36, -1, 5, -1, 5, 61, -1, 5, 26, 64, +- -1, -1, 5, -1, 66, -1, 64, 32, 64, -1, +- 64, 31, 64, -1, 64, 29, 64, -1, 64, 30, +- 64, -1, 30, 64, -1, 35, 64, 36, -1, 68, +- -1, 64, 26, 64, -1, 64, 27, 64, -1, 64, +- 28, 64, -1, 64, 19, 64, -1, 64, 20, 64, +- -1, 64, 21, 64, -1, 14, 65, -1, 4, -1, +- 3, -1, 6, -1, 49, 25, 56, -1, 49, 33, +- 69, 25, 56, -1, 40, 49, 41, 25, 56, -1, +- 40, 49, 33, 69, 41, 25, 56, -1, 40, 49, +- 56, 41, -1, 40, 49, 33, 69, 41, 56, -1, +- 70, 69, -1, 70, -1, 5, 26, 56, 64, -1, +- 33, 56, 64, -1, 25, -1, -1 +-}; +- +-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +-static const unsigned short yyrline[] = +-{ +- 0, 1236, 1236, 1238, 1239, 1240, 1241, 1242, 1243, 1244, +- 1245, 1250, 1253, 1254, 1257, 1258, 1259, 1260, 1265, 1267, +- 1270, 1271, 1272, 1273, 1274, 1277, 1278, 1283, 1284, 1287, +- 1289, 1291, 1294, 1296, 1300, 1301, 1302, 1303, 1304, 1307, +- 1308, 1309, 1310, 1315, 1316, 1317, 1318, 1319, 1320, 1321, +- 1322, 1323, 1324, 1325, 1328, 1330, 1331, 1334, 1336, 1339, +- 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1350, 1351, +- 1352, 1353, 1354, 1355, 1356, 1359, 1360, 1361, 1366, 1367, +- 1368, 1369, 1373, 1374, 1377, 1378, 1380, 1384, 1393, 1393 +-}; +-#endif +- +-#if YYDEBUG || YYERROR_VERBOSE +-/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. +- First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +-static const char *const yytname[] = +-{ +- "$end", "error", "$undefined", "LTYPE_INTEGER", "LTYPE_FLOAT", +- "LTYPE_VAR", "LTYPE_PTR", "PTR_TK", "INT_TK", "FLOAT_TK", "DECLARE", +- "EXTERNAL", "WHILE", "DO", "NOT", "PLUS_EQ", "SUB_EQ", "DIV_EQ", +- "MUL_EQ", "SUP_EQ", "LOW_EQ", "NOT_EQ", "STRUCT", "FOR", "IN", "'\\n'", +- "'='", "'<'", "'>'", "'+'", "'-'", "'/'", "'*'", "':'", "','", "'('", +- "')'", "'?'", "'{'", "'}'", "'['", "']'", "$accept", "gsl", "gsl_code", +- "struct_declaration", "struct_members", "struct_member", +- "ext_task_name", "task_name", "return_type", "arglist", +- "gsl_def_functions", "function", "function_intro", "function_outro", +- "leave_namespace", "declaration", "empty_declaration", "instruction", +- "var_list", "var_list_content", "affectation", "start_block", +- "expression", "test", "constValue", "func_call", "func_call_expression", +- "affectation_list", "affectation_in_list", "opt_nl", 0 +-}; +-#endif +- +-# ifdef YYPRINT +-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to +- token YYLEX-NUM. */ +-static const unsigned short yytoknum[] = +-{ +- 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, +- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, +- 275, 276, 277, 278, 279, 10, 61, 60, 62, 43, +- 45, 47, 42, 58, 44, 40, 41, 63, 123, 125, +- 91, 93 +-}; +-# endif +- +-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +-static const unsigned char yyr1[] = +-{ +- 0, 42, 43, 44, 44, 44, 44, 44, 44, 44, +- 44, 45, 46, 46, 47, 47, 47, 47, 48, 49, +- 50, 50, 50, 50, 50, 51, 51, 52, 52, 53, +- 54, 54, 55, 56, 57, 57, 57, 57, 57, 58, +- 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, +- 59, 59, 59, 59, 60, 61, 61, 62, 63, 64, +- 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, +- 65, 65, 65, 65, 65, 66, 66, 66, 67, 67, +- 67, 67, 68, 68, 69, 69, 70, 70, 71, 71 +-}; +- +-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +-static const unsigned char yyr2[] = +-{ +- 0, 2, 3, 2, 8, 10, 8, 10, 2, 2, +- 0, 7, 2, 4, 2, 2, 2, 2, 1, 1, +- 0, 2, 2, 2, 2, 1, 3, 2, 0, 3, +- 5, 7, 0, 0, 4, 4, 4, 4, 1, 2, +- 2, 2, 2, 2, 2, 6, 6, 6, 1, 3, +- 3, 3, 3, 6, 3, 1, 2, 3, 0, 1, +- 1, 3, 3, 3, 3, 2, 3, 1, 3, 3, +- 3, 3, 3, 3, 2, 1, 1, 1, 3, 5, +- 5, 7, 4, 6, 2, 1, 4, 3, 1, 0 +-}; +- +-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state +- STATE-NUM when YYTABLE doesn't specify something else to do. Zero +- means the default is an error. */ +-static const unsigned char yydefact[] = +-{ +- 10, 0, 32, 1, 19, 0, 0, 0, 0, 0, +- 0, 0, 0, 9, 0, 0, 0, 8, 0, 28, +- 0, 38, 3, 0, 48, 42, 0, 0, 0, 0, +- 0, 41, 40, 39, 0, 0, 76, 75, 59, 77, +- 0, 0, 0, 0, 0, 89, 60, 67, 0, 0, +- 0, 58, 19, 0, 33, 0, 2, 44, 43, 0, +- 49, 50, 52, 51, 57, 0, 0, 0, 0, 18, +- 0, 74, 65, 0, 33, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, +- 10, 0, 0, 78, 0, 33, 0, 85, 0, 27, +- 10, 37, 36, 35, 34, 20, 0, 20, 0, 66, +- 0, 0, 71, 72, 73, 68, 69, 70, 63, 64, +- 62, 61, 89, 89, 0, 0, 89, 0, 0, 33, +- 33, 0, 33, 84, 0, 32, 0, 0, 0, 0, +- 0, 0, 0, 25, 0, 0, 0, 82, 0, 0, +- 0, 55, 0, 0, 0, 0, 0, 80, 0, 87, +- 79, 20, 0, 29, 24, 23, 21, 22, 33, 42, +- 41, 40, 39, 20, 0, 33, 20, 33, 46, 0, +- 89, 0, 0, 0, 0, 12, 56, 54, 53, 45, +- 47, 33, 86, 0, 0, 6, 0, 26, 4, 0, +- 83, 11, 0, 17, 16, 14, 15, 81, 30, 20, +- 33, 33, 13, 0, 7, 5, 31 +-}; +- +-/* YYDEFGOTO[NTERM-NUM]. */ +-static const short yydefgoto[] = +-{ +- -1, 1, 2, 17, 149, 185, 70, 18, 137, 142, +- 56, 99, 100, 19, 93, 20, 21, 22, 125, 152, +- 23, 90, 44, 45, 46, 24, 47, 96, 97, 86 +-}; +- +-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing +- STATE-NUM. */ +-#define YYPACT_NINF -116 +-static const short yypact[] = +-{ +- -116, 40, 136, -116, 103, 39, 66, 68, 61, 65, +- 1, 77, 101, -116, 1, 84, 109, -116, 12, -116, +- 91, -116, -116, 97, -116, 98, 72, 72, 72, 72, +- 72, 99, 104, 113, 109, 130, -116, -116, -116, -116, +- 1, 72, 72, 109, 166, 115, -116, -116, 145, 131, +- 118, -116, -116, -24, -116, -3, 138, -116, -116, 72, +- 159, 159, 159, 159, 159, 72, 72, 72, 14, -116, +- 51, -116, 22, 102, 124, 72, 72, 72, 72, 72, +- 72, 72, 72, 72, 72, -116, 160, 139, 140, 141, +- -116, -3, 152, -116, 154, -116, 156, -3, 109, -116, +- -116, 159, 159, 159, 159, 150, 82, 150, 82, -116, +- -3, 158, 159, 159, 159, 159, 159, 159, 22, 22, +- -116, -116, 115, 115, 195, 188, 115, 88, 162, -116, +- -116, 72, -116, -116, 52, 136, 155, 177, 199, 200, +- 201, 202, 180, 175, 185, 183, 171, -116, 144, 18, +- 161, 195, 178, 144, 144, 190, 191, -116, 72, 159, +- -116, 150, 82, -116, -116, -116, -116, -116, -116, -116, +- -116, -116, -116, 150, 82, -116, 150, -116, -116, 192, +- 115, 208, 213, 214, 215, -116, -116, -116, -116, -116, +- -116, -116, 159, 196, 194, -116, 198, -116, -116, 203, +- -116, -116, 161, -116, -116, -116, -116, -116, -116, 150, +- -116, -116, -116, 204, -116, -116, -116 +-}; +- +-/* YYPGOTO[NTERM-NUM]. */ +-static const yysigned_char yypgoto[] = +-{ +- -116, -116, -68, -116, -116, 23, -116, -15, -104, -92, +- -116, -116, -116, 89, -74, -116, -88, -115, -116, 75, +- -116, -116, -16, -6, -116, -116, -116, -62, -116, -99 +-}; +- +-/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If +- positive, shift that token. If negative, reduce the rule which +- number is the opposite. If zero, do what YYDEFACT says. +- If YYTABLE_NINF, syntax error. */ +-#define YYTABLE_NINF -1 +-static const unsigned char yytable[] = +-{ +- 111, 53, 94, 144, 36, 37, 38, 39, 50, 91, +- 60, 61, 62, 63, 64, 40, 145, 92, 143, 68, +- 143, 131, 127, 148, 150, 72, 73, 154, 74, 128, +- 95, 41, 135, 178, 71, 133, 42, 54, 188, 189, +- 3, 43, 105, 101, 31, 55, 179, 106, 146, 102, +- 103, 104, 180, 83, 84, 157, 158, 193, 160, 112, +- 113, 114, 115, 116, 117, 118, 119, 120, 121, 196, +- 194, 32, 199, 33, 143, 36, 37, 38, 39, 107, +- 161, 202, 197, 134, 108, 162, 143, 138, 34, 139, +- 140, 141, 35, 4, 195, 5, 6, 7, 8, 9, +- 10, 198, 41, 200, 48, 213, 49, 42, 25, 51, +- 11, 12, 43, 13, 52, 159, 57, 207, 26, 27, +- 28, 29, 58, 14, 59, 65, 15, 155, 16, 30, +- 66, 81, 82, 83, 84, 69, 214, 215, 109, 67, +- 85, 4, 192, 5, 6, 7, 8, 9, 10, 4, +- 87, 5, 6, 7, 89, 88, 10, 110, 11, 12, +- 164, 13, 165, 166, 167, 98, 181, 12, 182, 183, +- 184, 14, 123, 122, 15, 124, 16, 129, 126, 14, +- 130, 132, 15, 136, 16, 75, 76, 77, 81, 82, +- 83, 84, 78, 79, 80, 81, 82, 83, 84, 147, +- 151, 153, 168, 156, 169, 170, 171, 172, 173, 174, +- 175, 176, 177, 203, 187, 190, 191, 201, 204, 205, +- 206, 208, 209, 210, 163, 212, 186, 0, 211, 216 +-}; +- +-static const short yycheck[] = +-{ +- 74, 16, 5, 107, 3, 4, 5, 6, 14, 33, +- 26, 27, 28, 29, 30, 14, 108, 41, 106, 34, +- 108, 95, 90, 122, 123, 41, 42, 126, 43, 91, +- 33, 30, 100, 148, 40, 97, 35, 25, 153, 154, +- 0, 40, 28, 59, 5, 33, 28, 33, 110, 65, +- 66, 67, 34, 31, 32, 129, 130, 161, 132, 75, +- 76, 77, 78, 79, 80, 81, 82, 83, 84, 173, +- 162, 5, 176, 5, 162, 3, 4, 5, 6, 28, +- 28, 180, 174, 98, 33, 33, 174, 5, 27, 7, +- 8, 9, 27, 5, 168, 7, 8, 9, 10, 11, +- 12, 175, 30, 177, 27, 209, 5, 35, 5, 25, +- 22, 23, 40, 25, 5, 131, 25, 191, 15, 16, +- 17, 18, 25, 35, 26, 26, 38, 39, 40, 26, +- 26, 29, 30, 31, 32, 5, 210, 211, 36, 26, +- 25, 5, 158, 7, 8, 9, 10, 11, 12, 5, +- 5, 7, 8, 9, 36, 24, 12, 33, 22, 23, +- 5, 25, 7, 8, 9, 27, 5, 23, 7, 8, +- 9, 35, 33, 13, 38, 35, 40, 25, 37, 35, +- 26, 25, 38, 33, 40, 19, 20, 21, 29, 30, +- 31, 32, 26, 27, 28, 29, 30, 31, 32, 41, +- 5, 13, 25, 41, 5, 5, 5, 5, 28, 34, +- 25, 28, 41, 5, 36, 25, 25, 25, 5, 5, +- 5, 25, 28, 25, 135, 202, 151, -1, 25, 25 +-}; +- +-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing +- symbol of state STATE-NUM. */ +-static const unsigned char yystos[] = +-{ +- 0, 43, 44, 0, 5, 7, 8, 9, 10, 11, +- 12, 22, 23, 25, 35, 38, 40, 45, 49, 55, +- 57, 58, 59, 62, 67, 5, 15, 16, 17, 18, +- 26, 5, 5, 5, 27, 27, 3, 4, 5, 6, +- 14, 30, 35, 40, 64, 65, 66, 68, 27, 5, +- 65, 25, 5, 49, 25, 33, 52, 25, 25, 26, +- 64, 64, 64, 64, 64, 26, 26, 26, 49, 5, +- 48, 65, 64, 64, 49, 19, 20, 21, 26, 27, +- 28, 29, 30, 31, 32, 25, 71, 5, 24, 36, +- 63, 33, 41, 56, 5, 33, 69, 70, 27, 53, +- 54, 64, 64, 64, 64, 28, 33, 28, 33, 36, +- 33, 56, 64, 64, 64, 64, 64, 64, 64, 64, +- 64, 64, 13, 33, 35, 60, 37, 44, 69, 25, +- 26, 56, 25, 69, 49, 44, 33, 50, 5, 7, +- 8, 9, 51, 58, 50, 51, 69, 41, 71, 46, +- 71, 5, 61, 13, 71, 39, 41, 56, 56, 64, +- 56, 28, 33, 55, 5, 7, 8, 9, 25, 5, +- 5, 5, 5, 28, 34, 25, 28, 41, 59, 28, +- 34, 5, 7, 8, 9, 47, 61, 36, 59, 59, +- 25, 25, 64, 50, 51, 56, 50, 51, 56, 50, +- 56, 25, 71, 5, 5, 5, 5, 56, 25, 28, +- 25, 25, 47, 50, 56, 56, 25 +-}; +- +-#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +-# define YYSIZE_T __SIZE_TYPE__ +-#endif +-#if ! defined (YYSIZE_T) && defined (size_t) +-# define YYSIZE_T size_t +-#endif +-#if ! defined (YYSIZE_T) +-# if defined (__STDC__) || defined (__cplusplus) +-# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ +-# define YYSIZE_T size_t +-# endif +-#endif +-#if ! defined (YYSIZE_T) +-# define YYSIZE_T unsigned int +-#endif +- +-#define yyerrok (yyerrstatus = 0) +-#define yyclearin (yychar = YYEMPTY) +-#define YYEMPTY (-2) +-#define YYEOF 0 +- +-#define YYACCEPT goto yyacceptlab +-#define YYABORT goto yyabortlab +-#define YYERROR goto yyerrlab1 +- +- +-/* Like YYERROR except do call yyerror. This remains here temporarily +- to ease the transition to the new meaning of YYERROR, for GCC. +- Once GCC version 2 has supplanted version 1, this can go. */ +- +-#define YYFAIL goto yyerrlab +- +-#define YYRECOVERING() (!!yyerrstatus) +- +-#define YYBACKUP(Token, Value) \ +-do \ +- if (yychar == YYEMPTY && yylen == 1) \ +- { \ +- yychar = (Token); \ +- yylval = (Value); \ +- yytoken = YYTRANSLATE (yychar); \ +- YYPOPSTACK; \ +- goto yybackup; \ +- } \ +- else \ +- { \ +- yyerror ("syntax error: cannot back up");\ +- YYERROR; \ +- } \ +-while (0) +- +-#define YYTERROR 1 +-#define YYERRCODE 256 +- +-/* YYLLOC_DEFAULT -- Compute the default location (before the actions +- are run). */ +- +-#ifndef YYLLOC_DEFAULT +-# define YYLLOC_DEFAULT(Current, Rhs, N) \ +- Current.first_line = Rhs[1].first_line; \ +- Current.first_column = Rhs[1].first_column; \ +- Current.last_line = Rhs[N].last_line; \ +- Current.last_column = Rhs[N].last_column; +-#endif +- +-/* YYLEX -- calling `yylex' with the right arguments. */ +- +-#ifdef YYLEX_PARAM +-# define YYLEX yylex (YYLEX_PARAM) +-#else +-# define YYLEX yylex () +-#endif +- +-/* Enable debugging if requested. */ +-#if YYDEBUG +- +-# ifndef YYFPRINTF +-# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ +-# define YYFPRINTF fprintf +-# endif +- +-# define YYDPRINTF(Args) \ +-do { \ +- if (yydebug) \ +- YYFPRINTF Args; \ +-} while (0) +- +-# define YYDSYMPRINT(Args) \ +-do { \ +- if (yydebug) \ +- yysymprint Args; \ +-} while (0) +- +-# define YYDSYMPRINTF(Title, Token, Value, Location) \ +-do { \ +- if (yydebug) \ +- { \ +- YYFPRINTF (stderr, "%s ", Title); \ +- yysymprint (stderr, \ +- Token, Value); \ +- YYFPRINTF (stderr, "\n"); \ +- } \ +-} while (0) +- +-/*------------------------------------------------------------------. +-| yy_stack_print -- Print the state stack from its BOTTOM up to its | +-| TOP (cinluded). | +-`------------------------------------------------------------------*/ +- +-#if defined (__STDC__) || defined (__cplusplus) +-static void +-yy_stack_print (short *bottom, short *top) +-#else +-static void +-yy_stack_print (bottom, top) +- short *bottom; +- short *top; +-#endif +-{ +- YYFPRINTF (stderr, "Stack now"); +- for (/* Nothing. */; bottom <= top; ++bottom) +- YYFPRINTF (stderr, " %d", *bottom); +- YYFPRINTF (stderr, "\n"); +-} +- +-# define YY_STACK_PRINT(Bottom, Top) \ +-do { \ +- if (yydebug) \ +- yy_stack_print ((Bottom), (Top)); \ +-} while (0) +- +- +-/*------------------------------------------------. +-| Report that the YYRULE is going to be reduced. | +-`------------------------------------------------*/ +- +-#if defined (__STDC__) || defined (__cplusplus) +-static void +-yy_reduce_print (int yyrule) +-#else +-static void +-yy_reduce_print (yyrule) +- int yyrule; +-#endif +-{ +- int yyi; +- unsigned int yylineno = yyrline[yyrule]; +- YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", +- yyrule - 1, yylineno); +- /* Print the symbols being reduced, and their result. */ +- for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) +- YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); +- YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); +-} +- +-# define YY_REDUCE_PRINT(Rule) \ +-do { \ +- if (yydebug) \ +- yy_reduce_print (Rule); \ +-} while (0) +- +-/* Nonzero means print parse trace. It is left uninitialized so that +- multiple parsers can coexist. */ +-int yydebug; +-#else /* !YYDEBUG */ +-# define YYDPRINTF(Args) +-# define YYDSYMPRINT(Args) +-# define YYDSYMPRINTF(Title, Token, Value, Location) +-# define YY_STACK_PRINT(Bottom, Top) +-# define YY_REDUCE_PRINT(Rule) +-#endif /* !YYDEBUG */ +- +- +-/* YYINITDEPTH -- initial size of the parser's stacks. */ +-#ifndef YYINITDEPTH +-# define YYINITDEPTH 200 +-#endif +- +-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only +- if the built-in stack extension method is used). +- +- Do not make this value too large; the results are undefined if +- SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) +- evaluated with infinite-precision integer arithmetic. */ +- +-#if YYMAXDEPTH == 0 +-# undef YYMAXDEPTH +-#endif +- +-#ifndef YYMAXDEPTH +-# define YYMAXDEPTH 10000 +-#endif +- +- +- +-#if YYERROR_VERBOSE +- +-# ifndef yystrlen +-# if defined (__GLIBC__) && defined (_STRING_H) +-# define yystrlen strlen +-# else +-/* Return the length of YYSTR. */ +-static YYSIZE_T +-# if defined (__STDC__) || defined (__cplusplus) +-yystrlen (const char *yystr) +-# else +-yystrlen (yystr) +- const char *yystr; +-# endif +-{ +- register const char *yys = yystr; +- +- while (*yys++ != '\0') +- continue; +- +- return yys - yystr - 1; +-} +-# endif +-# endif +- +-# ifndef yystpcpy +-# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +-# define yystpcpy stpcpy +-# else +-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in +- YYDEST. */ +-static char * +-# if defined (__STDC__) || defined (__cplusplus) +-yystpcpy (char *yydest, const char *yysrc) +-# else +-yystpcpy (yydest, yysrc) +- char *yydest; +- const char *yysrc; +-# endif +-{ +- register char *yyd = yydest; +- register const char *yys = yysrc; +- +- while ((*yyd++ = *yys++) != '\0') +- continue; +- +- return yyd - 1; +-} +-# endif +-# endif +- +-#endif /* !YYERROR_VERBOSE */ +- +- +- +-#if YYDEBUG +-/*--------------------------------. +-| Print this symbol on YYOUTPUT. | +-`--------------------------------*/ +- +-#if defined (__STDC__) || defined (__cplusplus) +-static void +-yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +-#else +-static void +-yysymprint (yyoutput, yytype, yyvaluep) +- FILE *yyoutput; +- int yytype; +- YYSTYPE *yyvaluep; +-#endif +-{ +- /* Pacify ``unused variable'' warnings. */ +- (void) yyvaluep; +- +- if (yytype < YYNTOKENS) +- { +- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +-# ifdef YYPRINT +- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +-# endif +- } +- else +- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); +- +- switch (yytype) +- { +- default: +- break; +- } +- YYFPRINTF (yyoutput, ")"); +-} +- +-#endif /* ! YYDEBUG */ +-/*-----------------------------------------------. +-| Release the memory associated to this symbol. | +-`-----------------------------------------------*/ +- +-#if defined (__STDC__) || defined (__cplusplus) +-static void +-yydestruct (int yytype, YYSTYPE *yyvaluep) +-#else +-static void +-yydestruct (yytype, yyvaluep) +- int yytype; +- YYSTYPE *yyvaluep; +-#endif +-{ +- /* Pacify ``unused variable'' warnings. */ +- (void) yyvaluep; +- +- switch (yytype) +- { +- +- default: +- break; +- } +-} +- +- +-/* Prevent warnings from -Wmissing-prototypes. */ +- +-#ifdef YYPARSE_PARAM +-# if defined (__STDC__) || defined (__cplusplus) +-int yyparse (void *YYPARSE_PARAM); +-# else +-int yyparse (); +-# endif +-#else /* ! YYPARSE_PARAM */ +-#if defined (__STDC__) || defined (__cplusplus) +-int yyparse (void); +-#else +-int yyparse (); +-#endif +-#endif /* ! YYPARSE_PARAM */ +- +- +- +-/* The lookahead symbol. */ +-int yychar; +- +-/* The semantic value of the lookahead symbol. */ +-YYSTYPE yylval; +- +-/* Number of syntax errors so far. */ +-int yynerrs; +- +- +- +-/*----------. +-| yyparse. | +-`----------*/ +- +-#ifdef YYPARSE_PARAM +-# if defined (__STDC__) || defined (__cplusplus) +-int yyparse (void *YYPARSE_PARAM) +-# else +-int yyparse (YYPARSE_PARAM) +- void *YYPARSE_PARAM; +-# endif +-#else /* ! YYPARSE_PARAM */ +-#if defined (__STDC__) || defined (__cplusplus) +-int +-yyparse (void) +-#else +-int +-yyparse () +- +-#endif +-#endif +-{ +- +- register int yystate; +- register int yyn; +- int yyresult; +- /* Number of tokens to shift before error messages enabled. */ +- int yyerrstatus; +- /* Lookahead token as an internal (translated) token number. */ +- int yytoken = 0; +- +- /* Three stacks and their tools: +- `yyss': related to states, +- `yyvs': related to semantic values, +- `yyls': related to locations. +- +- Refer to the stacks thru separate pointers, to allow yyoverflow +- to reallocate them elsewhere. */ +- +- /* The state stack. */ +- short yyssa[YYINITDEPTH]; +- short *yyss = yyssa; +- register short *yyssp; +- +- /* The semantic value stack. */ +- YYSTYPE yyvsa[YYINITDEPTH]; +- YYSTYPE *yyvs = yyvsa; +- register YYSTYPE *yyvsp; +- +- +- +-#define YYPOPSTACK (yyvsp--, yyssp--) +- +- YYSIZE_T yystacksize = YYINITDEPTH; +- +- /* The variables used to return semantic value and location from the +- action routines. */ +- YYSTYPE yyval; +- +- +- /* When reducing, the number of symbols on the RHS of the reduced +- rule. */ +- int yylen; +- +- YYDPRINTF ((stderr, "Starting parse\n")); +- +- yystate = 0; +- yyerrstatus = 0; +- yynerrs = 0; +- yychar = YYEMPTY; /* Cause a token to be read. */ +- +- /* Initialize stack pointers. +- Waste one element of value and location stack +- so that they stay on the same level as the state stack. +- The wasted elements are never initialized. */ +- +- yyssp = yyss; +- yyvsp = yyvs; +- +- goto yysetstate; +- +-/*------------------------------------------------------------. +-| yynewstate -- Push a new state, which is found in yystate. | +-`------------------------------------------------------------*/ +- yynewstate: +- /* In all cases, when you get here, the value and location stacks +- have just been pushed. so pushing a state here evens the stacks. +- */ +- yyssp++; +- +- yysetstate: +- *yyssp = yystate; +- +- if (yyss + yystacksize - 1 <= yyssp) +- { +- /* Get the current used size of the three stacks, in elements. */ +- YYSIZE_T yysize = yyssp - yyss + 1; +- +-#ifdef yyoverflow +- { +- /* Give user a chance to reallocate the stack. Use copies of +- these so that the &'s don't force the real ones into +- memory. */ +- YYSTYPE *yyvs1 = yyvs; +- short *yyss1 = yyss; +- +- +- /* Each stack pointer address is followed by the size of the +- data in use in that stack, in bytes. This used to be a +- conditional around just the two extra args, but that might +- be undefined if yyoverflow is a macro. */ +- yyoverflow ("parser stack overflow", +- &yyss1, yysize * sizeof (*yyssp), +- &yyvs1, yysize * sizeof (*yyvsp), +- +- &yystacksize); +- +- yyss = yyss1; +- yyvs = yyvs1; +- } +-#else /* no yyoverflow */ +-# ifndef YYSTACK_RELOCATE +- goto yyoverflowlab; +-# else +- /* Extend the stack our own way. */ +- if (YYMAXDEPTH <= yystacksize) +- goto yyoverflowlab; +- yystacksize *= 2; +- if (YYMAXDEPTH < yystacksize) +- yystacksize = YYMAXDEPTH; +- +- { +- short *yyss1 = yyss; +- union yyalloc *yyptr = +- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); +- if (! yyptr) +- goto yyoverflowlab; +- YYSTACK_RELOCATE (yyss); +- YYSTACK_RELOCATE (yyvs); +- +-# undef YYSTACK_RELOCATE +- if (yyss1 != yyssa) +- YYSTACK_FREE (yyss1); +- } +-# endif +-#endif /* no yyoverflow */ +- +- yyssp = yyss + yysize - 1; +- yyvsp = yyvs + yysize - 1; +- +- +- YYDPRINTF ((stderr, "Stack size increased to %lu\n", +- (unsigned long int) yystacksize)); +- +- if (yyss + yystacksize - 1 <= yyssp) +- YYABORT; +- } +- +- YYDPRINTF ((stderr, "Entering state %d\n", yystate)); +- +- goto yybackup; +- +-/*-----------. +-| yybackup. | +-`-----------*/ +-yybackup: +- +-/* Do appropriate processing given the current state. */ +-/* Read a lookahead token if we need one and don't already have one. */ +-/* yyresume: */ +- +- /* First try to decide what to do without reference to lookahead token. */ +- +- yyn = yypact[yystate]; +- if (yyn == YYPACT_NINF) +- goto yydefault; +- +- /* Not known => get a lookahead token if don't already have one. */ +- +- /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ +- if (yychar == YYEMPTY) +- { +- YYDPRINTF ((stderr, "Reading a token: ")); +- yychar = YYLEX; +- } +- +- if (yychar <= YYEOF) +- { +- yychar = yytoken = YYEOF; +- YYDPRINTF ((stderr, "Now at end of input.\n")); +- } +- else +- { +- yytoken = YYTRANSLATE (yychar); +- YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); +- } +- +- /* If the proper action on seeing token YYTOKEN is to reduce or to +- detect an error, take that action. */ +- yyn += yytoken; +- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) +- goto yydefault; +- yyn = yytable[yyn]; +- if (yyn <= 0) +- { +- if (yyn == 0 || yyn == YYTABLE_NINF) +- goto yyerrlab; +- yyn = -yyn; +- goto yyreduce; +- } +- +- if (yyn == YYFINAL) +- YYACCEPT; +- +- /* Shift the lookahead token. */ +- YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); +- +- /* Discard the token being shifted unless it is eof. */ +- if (yychar != YYEOF) +- yychar = YYEMPTY; +- +- *++yyvsp = yylval; +- +- +- /* Count tokens shifted since error; after three, turn off error +- status. */ +- if (yyerrstatus) +- yyerrstatus--; +- +- yystate = yyn; +- goto yynewstate; +- +- +-/*-----------------------------------------------------------. +-| yydefault -- do the default action for the current state. | +-`-----------------------------------------------------------*/ +-yydefault: +- yyn = yydefact[yystate]; +- if (yyn == 0) +- goto yyerrlab; +- goto yyreduce; +- +- +-/*-----------------------------. +-| yyreduce -- Do a reduction. | +-`-----------------------------*/ +-yyreduce: +- /* yyn is the number of a rule to reduce with. */ +- yylen = yyr2[yyn]; +- +- /* If YYLEN is nonzero, implement the default value of the action: +- `$$ = $1'. +- +- Otherwise, the following line sets YYVAL to garbage. +- This behavior is undocumented and Bison +- users should not rely upon it. Assigning to YYVAL +- unconditionally makes the parser a bit smaller, and it avoids a +- GCC warning that YYVAL may be used uninitialized. */ +- yyval = yyvsp[1-yylen]; +- +- +- YY_REDUCE_PRINT (yyn); +- switch (yyn) +- { +- case 3: +-#line 1238 "goomsl_yacc.y" +- { gsl_append(yyvsp[0].nPtr); } +- break; +- +- case 4: +-#line 1239 "goomsl_yacc.y" +- { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-4].strValue); } +- break; +- +- case 5: +-#line 1240 "goomsl_yacc.y" +- { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-6].strValue); } +- break; +- +- case 6: +-#line 1241 "goomsl_yacc.y" +- { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-4].strValue); } +- break; +- +- case 7: +-#line 1242 "goomsl_yacc.y" +- { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-6].strValue); } +- break; +- +- case 11: +-#line 1250 "goomsl_yacc.y" +- { gsl_add_struct(yyvsp[-4].strValue, yyvsp[-2].gsl_struct); } +- break; +- +- case 12: +-#line 1253 "goomsl_yacc.y" +- { yyval.gsl_struct = gsl_new_struct(yyvsp[0].gsl_struct_field); } +- break; +- +- case 13: +-#line 1254 "goomsl_yacc.y" +- { yyval.gsl_struct = yyvsp[-3].gsl_struct; gsl_add_struct_field(yyvsp[-3].gsl_struct, yyvsp[0].gsl_struct_field); } +- break; +- +- case 14: +-#line 1257 "goomsl_yacc.y" +- { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_INT); } +- break; +- +- case 15: +-#line 1258 "goomsl_yacc.y" +- { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_FLOAT); } +- break; +- +- case 16: +-#line 1259 "goomsl_yacc.y" +- { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_PTR); } +- break; +- +- case 17: +-#line 1260 "goomsl_yacc.y" +- { yyval.gsl_struct_field = gsl_new_struct_field_struct(yyvsp[0].strValue, yyvsp[-1].strValue); } +- break; +- +- case 18: +-#line 1265 "goomsl_yacc.y" +- { gsl_declare_external_task(yyvsp[0].strValue); gsl_enternamespace(yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); } +- break; +- +- case 19: +-#line 1267 "goomsl_yacc.y" +- { gsl_declare_task(yyvsp[0].strValue); gsl_enternamespace(yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); } +- break; +- +- case 20: +-#line 1270 "goomsl_yacc.y" +- { yyval.intValue=-1; } +- break; +- +- case 21: +-#line 1271 "goomsl_yacc.y" +- { yyval.intValue=INT_TK; } +- break; +- +- case 22: +-#line 1272 "goomsl_yacc.y" +- { yyval.intValue=FLOAT_TK; } +- break; +- +- case 23: +-#line 1273 "goomsl_yacc.y" +- { yyval.intValue=PTR_TK; } +- break; +- +- case 24: +-#line 1274 "goomsl_yacc.y" +- { yyval.intValue= 1000 + gsl_get_struct_id(yyvsp[0].strValue); } +- break; +- +- case 29: +-#line 1287 "goomsl_yacc.y" +- { gsl_leavenamespace(); } +- break; +- +- case 30: +-#line 1289 "goomsl_yacc.y" +- { gsl_append(new_function_intro(yyvsp[-3].strValue)); +- gsl_declare_global_variable(yyvsp[-1].intValue,yyvsp[-3].strValue); } +- break; +- +- case 31: +-#line 1291 "goomsl_yacc.y" +- { gsl_append(new_function_intro(yyvsp[-5].strValue)); +- gsl_declare_global_variable(yyvsp[-1].intValue,yyvsp[-5].strValue); } +- break; +- +- case 32: +-#line 1294 "goomsl_yacc.y" +- { gsl_append(new_function_outro()); } +- break; +- +- case 33: +-#line 1296 "goomsl_yacc.y" +- { yyval.namespace = gsl_leavenamespace(); } +- break; +- +- case 34: +-#line 1300 "goomsl_yacc.y" +- { gsl_float_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } +- break; +- +- case 35: +-#line 1301 "goomsl_yacc.y" +- { gsl_int_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } +- break; +- +- case 36: +-#line 1302 "goomsl_yacc.y" +- { gsl_ptr_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } +- break; +- +- case 37: +-#line 1303 "goomsl_yacc.y" +- { gsl_struct_decl_local(yyvsp[-3].strValue,yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } +- break; +- +- case 38: +-#line 1304 "goomsl_yacc.y" +- { yyval.nPtr = 0; } +- break; +- +- case 39: +-#line 1307 "goomsl_yacc.y" +- { gsl_float_decl_local(yyvsp[0].strValue); } +- break; +- +- case 40: +-#line 1308 "goomsl_yacc.y" +- { gsl_int_decl_local(yyvsp[0].strValue); } +- break; +- +- case 41: +-#line 1309 "goomsl_yacc.y" +- { gsl_ptr_decl_local(yyvsp[0].strValue); } +- break; +- +- case 42: +-#line 1310 "goomsl_yacc.y" +- { gsl_struct_decl_local(yyvsp[-1].strValue,yyvsp[0].strValue); } +- break; +- +- case 43: +-#line 1315 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[-1].nPtr; } +- break; +- +- case 44: +-#line 1316 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[-1].nPtr; } +- break; +- +- case 45: +-#line 1317 "goomsl_yacc.y" +- { yyval.nPtr = new_if(yyvsp[-4].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 46: +-#line 1318 "goomsl_yacc.y" +- { yyval.nPtr = new_while(yyvsp[-4].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 47: +-#line 1319 "goomsl_yacc.y" +- { lastNode = yyvsp[-3].nPtr->unode.opr.op[1]; yyval.nPtr=yyvsp[-3].nPtr; } +- break; +- +- case 48: +-#line 1320 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[0].nPtr; } +- break; +- +- case 49: +-#line 1321 "goomsl_yacc.y" +- { yyval.nPtr = new_plus_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } +- break; +- +- case 50: +-#line 1322 "goomsl_yacc.y" +- { yyval.nPtr = new_sub_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } +- break; +- +- case 51: +-#line 1323 "goomsl_yacc.y" +- { yyval.nPtr = new_mul_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } +- break; +- +- case 52: +-#line 1324 "goomsl_yacc.y" +- { yyval.nPtr = new_div_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } +- break; +- +- case 53: +-#line 1325 "goomsl_yacc.y" +- { yyval.nPtr = new_static_foreach(new_var(yyvsp[-4].strValue, currentGoomSL->num_lines), yyvsp[-2].nPtr, yyvsp[0].nPtr); } +- break; +- +- case 54: +-#line 1328 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[-1].nPtr; } +- break; +- +- case 55: +-#line 1330 "goomsl_yacc.y" +- { yyval.nPtr = new_var_list(new_var(yyvsp[0].strValue,currentGoomSL->num_lines), NULL); } +- break; +- +- case 56: +-#line 1331 "goomsl_yacc.y" +- { yyval.nPtr = new_var_list(new_var(yyvsp[-1].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } +- break; +- +- case 57: +-#line 1334 "goomsl_yacc.y" +- { yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } +- break; +- +- case 58: +-#line 1336 "goomsl_yacc.y" +- { yyval.nPtr = new_block(lastNode); lastNode = yyval.nPtr->unode.opr.op[0]; } +- break; +- +- case 59: +-#line 1339 "goomsl_yacc.y" +- { yyval.nPtr = new_var(yyvsp[0].strValue,currentGoomSL->num_lines); } +- break; +- +- case 60: +-#line 1340 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[0].nPtr; } +- break; +- +- case 61: +-#line 1341 "goomsl_yacc.y" +- { yyval.nPtr = new_mul(yyvsp[-2].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 62: +-#line 1342 "goomsl_yacc.y" +- { yyval.nPtr = new_div(yyvsp[-2].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 63: +-#line 1343 "goomsl_yacc.y" +- { yyval.nPtr = new_add(yyvsp[-2].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 64: +-#line 1344 "goomsl_yacc.y" +- { yyval.nPtr = new_sub(yyvsp[-2].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 65: +-#line 1345 "goomsl_yacc.y" +- { yyval.nPtr = new_neg(yyvsp[0].nPtr); } +- break; +- +- case 66: +-#line 1346 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[-1].nPtr; } +- break; +- +- case 67: +-#line 1347 "goomsl_yacc.y" +- { yyval.nPtr = yyvsp[0].nPtr; } +- break; +- +- case 68: +-#line 1350 "goomsl_yacc.y" +- { yyval.nPtr = new_equ(yyvsp[-2].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 69: +-#line 1351 "goomsl_yacc.y" +- { yyval.nPtr = new_low(yyvsp[-2].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 70: +-#line 1352 "goomsl_yacc.y" +- { yyval.nPtr = new_low(yyvsp[0].nPtr,yyvsp[-2].nPtr); } +- break; +- +- case 71: +-#line 1353 "goomsl_yacc.y" +- { yyval.nPtr = new_not(new_low(yyvsp[-2].nPtr,yyvsp[0].nPtr)); } +- break; +- +- case 72: +-#line 1354 "goomsl_yacc.y" +- { yyval.nPtr = new_not(new_low(yyvsp[0].nPtr,yyvsp[-2].nPtr)); } +- break; +- +- case 73: +-#line 1355 "goomsl_yacc.y" +- { yyval.nPtr = new_not(new_equ(yyvsp[-2].nPtr,yyvsp[0].nPtr)); } +- break; +- +- case 74: +-#line 1356 "goomsl_yacc.y" +- { yyval.nPtr = new_not(yyvsp[0].nPtr); } +- break; +- +- case 75: +-#line 1359 "goomsl_yacc.y" +- { yyval.nPtr = new_constFloat(yyvsp[0].strValue,currentGoomSL->num_lines); } +- break; +- +- case 76: +-#line 1360 "goomsl_yacc.y" +- { yyval.nPtr = new_constInt(yyvsp[0].strValue,currentGoomSL->num_lines); } +- break; +- +- case 77: +-#line 1361 "goomsl_yacc.y" +- { yyval.nPtr = new_constPtr(yyvsp[0].strValue,currentGoomSL->num_lines); } +- break; +- +- case 78: +-#line 1366 "goomsl_yacc.y" +- { yyval.nPtr = new_call(yyvsp[-2].strValue,NULL); } +- break; +- +- case 79: +-#line 1367 "goomsl_yacc.y" +- { yyval.nPtr = new_call(yyvsp[-4].strValue,yyvsp[-2].nPtr); } +- break; +- +- case 80: +-#line 1368 "goomsl_yacc.y" +- { yyval.nPtr = new_call(yyvsp[-3].strValue,NULL); } +- break; +- +- case 81: +-#line 1369 "goomsl_yacc.y" +- { yyval.nPtr = new_call(yyvsp[-5].strValue,yyvsp[-3].nPtr); } +- break; +- +- case 82: +-#line 1373 "goomsl_yacc.y" +- { yyval.nPtr = new_call_expr(yyvsp[-2].strValue,NULL); } +- break; +- +- case 83: +-#line 1374 "goomsl_yacc.y" +- { yyval.nPtr = new_call_expr(yyvsp[-4].strValue,yyvsp[-2].nPtr); } +- break; +- +- case 84: +-#line 1377 "goomsl_yacc.y" +- { yyval.nPtr = new_affec_list(yyvsp[-1].nPtr,yyvsp[0].nPtr); } +- break; +- +- case 85: +-#line 1378 "goomsl_yacc.y" +- { yyval.nPtr = new_affec_list(yyvsp[0].nPtr,NULL); } +- break; +- +- case 86: +-#line 1380 "goomsl_yacc.y" +- { +- gsl_reenternamespace(yyvsp[-1].namespace); +- yyval.nPtr = new_set(new_var(yyvsp[-3].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); +- } +- break; +- +- case 87: +-#line 1384 "goomsl_yacc.y" +- { +- gsl_reenternamespace(yyvsp[-1].namespace); +- yyval.nPtr = new_set(new_var("&this", currentGoomSL->num_lines),yyvsp[0].nPtr); +- } +- break; +- +- +- } +- +-/* Line 999 of yacc.c. */ +-#line 2792 "goomsl_yacc.c" +- +- yyvsp -= yylen; +- yyssp -= yylen; +- +- +- YY_STACK_PRINT (yyss, yyssp); +- +- *++yyvsp = yyval; +- +- +- /* Now `shift' the result of the reduction. Determine what state +- that goes to, based on the state we popped back to and the rule +- number reduced by. */ +- +- yyn = yyr1[yyn]; +- +- yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; +- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) +- yystate = yytable[yystate]; +- else +- yystate = yydefgoto[yyn - YYNTOKENS]; +- +- goto yynewstate; +- +- +-/*------------------------------------. +-| yyerrlab -- here on detecting error | +-`------------------------------------*/ +-yyerrlab: +- /* If not already recovering from an error, report this error. */ +- if (!yyerrstatus) +- { +- ++yynerrs; +-#if YYERROR_VERBOSE +- yyn = yypact[yystate]; +- +- if (YYPACT_NINF < yyn && yyn < YYLAST) +- { +- YYSIZE_T yysize = 0; +- int yytype = YYTRANSLATE (yychar); +- char *yymsg; +- int yyx, yycount; +- +- yycount = 0; +- /* Start YYX at -YYN if negative to avoid negative indexes in +- YYCHECK. */ +- for (yyx = yyn < 0 ? -yyn : 0; +- yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) +- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) +- yysize += yystrlen (yytname[yyx]) + 15, yycount++; +- yysize += yystrlen ("syntax error, unexpected ") + 1; +- yysize += yystrlen (yytname[yytype]); +- yymsg = (char *) YYSTACK_ALLOC (yysize); +- if (yymsg != 0) +- { +- char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); +- yyp = yystpcpy (yyp, yytname[yytype]); +- +- if (yycount < 5) +- { +- yycount = 0; +- for (yyx = yyn < 0 ? -yyn : 0; +- yyx < (int) (sizeof (yytname) / sizeof (char *)); +- yyx++) +- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) +- { +- const char *yyq = ! yycount ? ", expecting " : " or "; +- yyp = yystpcpy (yyp, yyq); +- yyp = yystpcpy (yyp, yytname[yyx]); +- yycount++; +- } +- } +- yyerror (yymsg); +- YYSTACK_FREE (yymsg); +- } +- else +- yyerror ("syntax error; also virtual memory exhausted"); +- } +- else +-#endif /* YYERROR_VERBOSE */ +- yyerror ("syntax error"); +- } +- +- +- +- if (yyerrstatus == 3) +- { +- /* If just tried and failed to reuse lookahead token after an +- error, discard it. */ +- +- /* Return failure if at end of input. */ +- if (yychar == YYEOF) +- { +- /* Pop the error token. */ +- YYPOPSTACK; +- /* Pop the rest of the stack. */ +- while (yyss < yyssp) +- { +- YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); +- yydestruct (yystos[*yyssp], yyvsp); +- YYPOPSTACK; +- } +- YYABORT; +- } +- +- YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); +- yydestruct (yytoken, &yylval); +- yychar = YYEMPTY; +- +- } +- +- /* Else will try to reuse lookahead token after shifting the error +- token. */ +- goto yyerrlab1; +- +- +-/*----------------------------------------------------. +-| yyerrlab1 -- error raised explicitly by an action. | +-`----------------------------------------------------*/ +-yyerrlab1: +- yyerrstatus = 3; /* Each real token shifted decrements this. */ +- +- for (;;) +- { +- yyn = yypact[yystate]; +- if (yyn != YYPACT_NINF) +- { +- yyn += YYTERROR; +- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) +- { +- yyn = yytable[yyn]; +- if (0 < yyn) +- break; +- } +- } +- +- /* Pop the current state because it cannot handle the error token. */ +- if (yyssp == yyss) +- YYABORT; +- +- YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); +- yydestruct (yystos[yystate], yyvsp); +- yyvsp--; +- yystate = *--yyssp; +- +- YY_STACK_PRINT (yyss, yyssp); +- } +- +- if (yyn == YYFINAL) +- YYACCEPT; +- +- YYDPRINTF ((stderr, "Shifting error token, ")); +- +- *++yyvsp = yylval; +- +- +- yystate = yyn; +- goto yynewstate; +- +- +-/*-------------------------------------. +-| yyacceptlab -- YYACCEPT comes here. | +-`-------------------------------------*/ +-yyacceptlab: +- yyresult = 0; +- goto yyreturn; +- +-/*-----------------------------------. +-| yyabortlab -- YYABORT comes here. | +-`-----------------------------------*/ +-yyabortlab: +- yyresult = 1; +- goto yyreturn; +- +-#ifndef yyoverflow +-/*----------------------------------------------. +-| yyoverflowlab -- parser overflow comes here. | +-`----------------------------------------------*/ +-yyoverflowlab: +- yyerror ("parser stack overflow"); +- yyresult = 2; +- /* Fall through. */ +-#endif +- +-yyreturn: +-#ifndef yyoverflow +- if (yyss != yyssa) +- YYSTACK_FREE (yyss); +-#endif +- return yyresult; +-} +- +- +-#line 1396 "goomsl_yacc.y" +- +- +- +-void yyerror(char *str) +-{ /* {{{ */ +- fprintf(stderr, "ERROR: Line %d, %s\n", currentGoomSL->num_lines, str); +- currentGoomSL->compilationOK = 0; +- exit(1); +-} /* }}} */ +- +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_yacc.h /src/goomsl_yacc.h +--- /home/d4rk/goom2k4-0/src/goomsl_yacc.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_yacc.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,104 +0,0 @@ +-/* A Bison parser, made by GNU Bison 1.875. */ +- +-/* Skeleton parser for Yacc-like parsing with Bison, +- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. +- +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. +- +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 59 Temple Place - Suite 330, +- Boston, MA 02111-1307, USA. */ +- +-/* As a special exception, when this file is copied by Bison into a +- Bison output file, you may use that output file without restriction. +- This special exception was added by the Free Software Foundation +- in version 1.24 of Bison. */ +- +-/* Tokens. */ +-#ifndef YYTOKENTYPE +-# define YYTOKENTYPE +- /* Put the tokens into the symbol table, so that GDB and other debuggers +- know about them. */ +- enum yytokentype { +- LTYPE_INTEGER = 258, +- LTYPE_FLOAT = 259, +- LTYPE_VAR = 260, +- LTYPE_PTR = 261, +- PTR_TK = 262, +- INT_TK = 263, +- FLOAT_TK = 264, +- DECLARE = 265, +- EXTERNAL = 266, +- WHILE = 267, +- DO = 268, +- NOT = 269, +- PLUS_EQ = 270, +- SUB_EQ = 271, +- DIV_EQ = 272, +- MUL_EQ = 273, +- SUP_EQ = 274, +- LOW_EQ = 275, +- NOT_EQ = 276, +- STRUCT = 277, +- FOR = 278, +- IN = 279 +- }; +-#endif +-#define LTYPE_INTEGER 258 +-#define LTYPE_FLOAT 259 +-#define LTYPE_VAR 260 +-#define LTYPE_PTR 261 +-#define PTR_TK 262 +-#define INT_TK 263 +-#define FLOAT_TK 264 +-#define DECLARE 265 +-#define EXTERNAL 266 +-#define WHILE 267 +-#define DO 268 +-#define NOT 269 +-#define PLUS_EQ 270 +-#define SUB_EQ 271 +-#define DIV_EQ 272 +-#define MUL_EQ 273 +-#define SUP_EQ 274 +-#define LOW_EQ 275 +-#define NOT_EQ 276 +-#define STRUCT 277 +-#define FOR 278 +-#define IN 279 +- +- +- +- +-#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +-#line 1199 "goomsl_yacc.y" +-typedef union YYSTYPE { +- int intValue; +- float floatValue; +- char charValue; +- char strValue[2048]; +- NodeType *nPtr; +- GoomHash *namespace; +- GSL_Struct *gsl_struct; +- GSL_StructField *gsl_struct_field; +- } YYSTYPE; +-/* Line 1240 of yacc.c. */ +-#line 95 "goomsl_yacc.h" +-# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +-# define YYSTYPE_IS_DECLARED 1 +-# define YYSTYPE_IS_TRIVIAL 1 +-#endif +- +-extern YYSTYPE yylval; +- +- +- +diff -Naur /home/d4rk/goom2k4-0/src/goomsl_yacc.y /src/goomsl_yacc.y +--- /home/d4rk/goom2k4-0/src/goomsl_yacc.y 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goomsl_yacc.y 1969-12-31 17:00:00.000000000 -0700 +@@ -1,1405 +0,0 @@ +-/** +- * copyright 2004, Jean-Christophe Hoelt <jeko@ios-software.com> +- * +- * This program is released under the terms of the GNU Lesser General Public Licence. +- */ +-%{ +- #include <stdio.h> +- #include <stdlib.h> +- #include <string.h> +- #include "goomsl.h" +- #include "goomsl_private.h" +- +-#define STRUCT_ALIGNMENT 16 +-/* #define VERBOSE */ +- +- int yylex(void); +- void yyerror(char *); +- extern GoomSL *currentGoomSL; +- +- static NodeType *nodeNew(const char *str, int type, int line_number); +- static NodeType *nodeClone(NodeType *node); +- static void nodeFreeInternals(NodeType *node); +- static void nodeFree(NodeType *node); +- +- static void commit_node(NodeType *node, int releaseIfTemp); +- static void precommit_node(NodeType *node); +- +- static NodeType *new_constInt(const char *str, int line_number); +- static NodeType *new_constFloat(const char *str, int line_number); +- static NodeType *new_constPtr(const char *str, int line_number); +- static NodeType *new_var(const char *str, int line_number); +- static NodeType *new_nop(const char *str); +- static NodeType *new_op(const char *str, int type, int nbOp); +- +- static int allocateLabel(); +- static int allocateTemp(); +- static void releaseTemp(int n); +- static void releaseAllTemps(); +- +- static int is_tmp_expr(NodeType *node) { +- if (node->str) { +- return (!strncmp(node->str,"_i_tmp_",7)) +- || (!strncmp(node->str,"_f_tmp_",7)) +- || (!strncmp(node->str,"_p_tmp",7)); +- } +- return 0; +- } +- /* pre: is_tmp_expr(node); */ +- static int get_tmp_id(NodeType *node) { return atoi((node->str)+5); } +- +- static int is_commutative_expr(int itype) +- { /* {{{ */ +- return (itype == INSTR_ADD) +- || (itype == INSTR_MUL) +- || (itype == INSTR_ISEQUAL); +- } /* }}} */ +- +- static void GSL_PUT_LABEL(char *name, int line_number) +- { /* {{{ */ +-#ifdef VERBOSE +- printf("label %s\n", name); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, line_number); +- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); +- } /* }}} */ +- static void GSL_PUT_JUMP(char *name, int line_number) +- { /* {{{ */ +-#ifdef VERBOSE +- printf("jump %s\n", name); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "jump", INSTR_JUMP, 1, line_number); +- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); +- } /* }}} */ +- +- static void GSL_PUT_JXXX(char *name, char *iname, int instr_id, int line_number) +- { /* {{{ */ +-#ifdef VERBOSE +- printf("%s %s\n", iname, name); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, iname, instr_id, 1, line_number); +- gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); +- } /* }}} */ +- static void GSL_PUT_JZERO(char *name,int line_number) +- { /* {{{ */ +- GSL_PUT_JXXX(name,"jzero.i",INSTR_JZERO,line_number); +- } /* }}} */ +- static void GSL_PUT_JNZERO(char *name, int line_number) +- { /* {{{ */ +- GSL_PUT_JXXX(name,"jnzero.i",INSTR_JNZERO,line_number); +- } /* }}} */ +- +- /* Structures Management */ +- +-#define ALIGN_ADDR(_addr,_align) {\ +- if (_align>1) {\ +- int _dec = (_addr%_align);\ +- if (_dec != 0) _addr += _align - _dec;\ +- }} +- +- /* */ +- void gsl_prepare_struct(GSL_Struct *s, int s_align, int i_align, int f_align) +- { +- int i; +- int consumed = 0; +- int iblk=0, fblk=0; +- +- s->iBlock[0].size = 0; +- s->iBlock[0].data = 0; +- s->fBlock[0].size = 0; +- s->fBlock[0].data = 0; +- +- /* Prepare sub-struct and calculate space needed for their storage */ +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type < FIRST_RESERVED) +- { +- int j=0; +- GSL_Struct *substruct = currentGoomSL->gsl_struct[s->fields[i]->type]; +- consumed += sizeof(int); /* stocke le prefix */ +- ALIGN_ADDR(consumed, s_align); +- s->fields[i]->offsetInStruct = consumed; +- gsl_prepare_struct(substruct, s_align, i_align, f_align); +- for(j=0;substruct->iBlock[j].size>0;++j) { +- s->iBlock[iblk].data = consumed + substruct->iBlock[j].data; +- s->iBlock[iblk].size = substruct->iBlock[j].size; +- iblk++; +- } +- for(j=0;substruct->fBlock[j].size>0;++j) { +- s->fBlock[fblk].data = consumed + substruct->fBlock[j].data; +- s->fBlock[fblk].size = substruct->fBlock[j].size; +- fblk++; +- } +- consumed += substruct->size; +- } +- } +- +- /* Then prepare integers */ +- ALIGN_ADDR(consumed, i_align); +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type == INSTR_INT) +- { +- if (s->iBlock[iblk].size == 0) { +- s->iBlock[iblk].size = 1; +- s->iBlock[iblk].data = consumed; +- } else { +- s->iBlock[iblk].size += 1; +- } +- s->fields[i]->offsetInStruct = consumed; +- consumed += sizeof(int); +- } +- } +- +- iblk++; +- s->iBlock[iblk].size = 0; +- s->iBlock[iblk].data = 0; +- +- /* Then prepare floats */ +- ALIGN_ADDR(consumed, f_align); +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type == INSTR_FLOAT) +- { +- if (s->fBlock[fblk].size == 0) { +- s->fBlock[fblk].size = 1; +- s->fBlock[fblk].data = consumed; +- } else { +- s->fBlock[fblk].size += 1; +- } +- s->fields[i]->offsetInStruct = consumed; +- consumed += sizeof(int); +- } +- } +- +- fblk++; +- s->fBlock[fblk].size = 0; +- s->fBlock[fblk].data = 0; +- +- /* Finally prepare pointers */ +- ALIGN_ADDR(consumed, i_align); +- for (i = 0; i < s->nbFields; ++i) +- { +- if (s->fields[i]->type == INSTR_PTR) +- { +- s->fields[i]->offsetInStruct = consumed; +- consumed += sizeof(int); +- } +- } +- s->size = consumed; +- } +- +- /* Returns the ID of a struct from its name */ +- int gsl_get_struct_id(const char *name) /* {{{ */ +- { +- HashValue *ret = goom_hash_get(currentGoomSL->structIDS, name); +- if (ret != NULL) return ret->i; +- return -1; +- } /* }}} */ +- +- /* Adds the definition of a struct */ +- void gsl_add_struct(const char *name, GSL_Struct *gsl_struct) /* {{{ */ +- { +- /* Prepare the struct: ie calculate internal storage format */ +- gsl_prepare_struct(gsl_struct, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT); +- +- /* If the struct does not already exists */ +- if (gsl_get_struct_id(name) < 0) +- { +- /* adds it */ +- int id = currentGoomSL->nbStructID++; +- goom_hash_put_int(currentGoomSL->structIDS, name, id); +- if (currentGoomSL->gsl_struct_size <= id) { +- currentGoomSL->gsl_struct_size *= 2; +- currentGoomSL->gsl_struct = (GSL_Struct**)realloc(currentGoomSL->gsl_struct, +- sizeof(GSL_Struct*) * currentGoomSL->gsl_struct_size); +- } +- currentGoomSL->gsl_struct[id] = gsl_struct; +- } +- } /* }}} */ +- +- /* Creates a field for a struct */ +- GSL_StructField *gsl_new_struct_field(const char *name, int type) +- { +- GSL_StructField *field = (GSL_StructField*)malloc(sizeof(GSL_StructField)); +- strcpy(field->name, name); +- field->type = type; +- return field; +- } +- +- /* Create as field for a struct which will be a struct itself */ +- GSL_StructField *gsl_new_struct_field_struct(const char *name, const char *type) +- { +- GSL_StructField *field = gsl_new_struct_field(name, gsl_get_struct_id(type)); +- if (field->type < 0) { +- fprintf(stderr, "ERROR: Line %d, Unknown structure: '%s'\n", +- currentGoomSL->num_lines, type); +- exit(1); +- } +- return field; +- } +- +- /* Creates a Struct */ +- GSL_Struct *gsl_new_struct(GSL_StructField *field) +- { +- GSL_Struct *s = (GSL_Struct*)malloc(sizeof(GSL_Struct)); +- s->nbFields = 1; +- s->fields[0] = field; +- return s; +- } +- +- /* Adds a field to a struct */ +- void gsl_add_struct_field(GSL_Struct *s, GSL_StructField *field) +- { +- s->fields[s->nbFields++] = field; +- } +- +- int gsl_type_of_var(GoomHash *ns, const char *name) +- { +- char type_of[256]; +- HashValue *hv; +- sprintf(type_of, "__type_of_%s", name); +- hv = goom_hash_get(ns, type_of); +- if (hv != NULL) +- return hv->i; +- fprintf(stderr, "ERROR: Unknown variable type: '%s'\n", name); +- return -1; +- } +- +- static void gsl_declare_var(GoomHash *ns, const char *name, int type, void *space) +- { +- char type_of[256]; +- if (name[0] == '@') { ns = currentGoomSL->vars; } +- +- if (space == NULL) { +- switch (type) { +- case INSTR_INT: +- case INSTR_FLOAT: +- case INSTR_PTR: +- space = goom_heap_malloc_with_alignment(currentGoomSL->data_heap, +- sizeof(int), sizeof(int)); +- break; +- case -1: +- fprintf(stderr, "What the fuck!\n"); +- exit(1); +- default: /* On a un struct_id */ +- space = goom_heap_malloc_with_alignment_prefixed(currentGoomSL->data_heap, +- currentGoomSL->gsl_struct[type]->size, STRUCT_ALIGNMENT, sizeof(int)); +- } +- } +- goom_hash_put_ptr(ns, name, (void*)space); +- sprintf(type_of, "__type_of_%s", name); +- goom_hash_put_int(ns, type_of, type); +- +- /* Ensuite le hack: on ajoute les champs en tant que variables. */ +- if (type < FIRST_RESERVED) +- { +- int i; +- GSL_Struct *gsl_struct = currentGoomSL->gsl_struct[type]; +- ((int*)space)[-1] = type; /* stockage du type dans le prefixe de structure */ +- for (i = 0; i < gsl_struct->nbFields; ++i) +- { +- char full_name[256]; +- char *cspace = (char*)space + gsl_struct->fields[i]->offsetInStruct; +- sprintf(full_name, "%s.%s", name, gsl_struct->fields[i]->name); +- gsl_declare_var(ns, full_name, gsl_struct->fields[i]->type, cspace); +- } +- } +- } +- +- /* Declare a variable which will be a struct */ +- static void gsl_struct_decl(GoomHash *namespace, const char *struct_name, const char *name) +- { +- int struct_id = gsl_get_struct_id(struct_name); +- gsl_declare_var(namespace, name, struct_id, NULL); +- } +- +- static void gsl_float_decl_global(const char *name) +- { +- gsl_declare_var(currentGoomSL->vars, name, INSTR_FLOAT, NULL); +- } +- static void gsl_int_decl_global(const char *name) +- { +- gsl_declare_var(currentGoomSL->vars, name, INSTR_INT, NULL); +- } +- static void gsl_ptr_decl_global(const char *name) +- { +- gsl_declare_var(currentGoomSL->vars, name, INSTR_PTR, NULL); +- } +- static void gsl_struct_decl_global_from_id(const char *name, int id) +- { +- gsl_declare_var(currentGoomSL->vars, name, id, NULL); +- } +- +- /* FLOAT */ +- static void gsl_float_decl_local(const char *name) +- { +- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_FLOAT, NULL); +- } +- /* INT */ +- static void gsl_int_decl_local(const char *name) +- { +- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_INT, NULL); +- } +- /* PTR */ +- static void gsl_ptr_decl_local(const char *name) +- { +- gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_PTR, NULL); +- } +- /* STRUCT */ +- static void gsl_struct_decl_local(const char *struct_name, const char *name) +- { +- gsl_struct_decl(currentGoomSL->namespaces[currentGoomSL->currentNS],struct_name,name); +- } +- +- +- static void commit_test2(NodeType *set,const char *type, int instr); +- static NodeType *new_call(const char *name, NodeType *affect_list); +- +- /* SETTER */ +- static NodeType *new_set(NodeType *lvalue, NodeType *expression) +- { /* {{{ */ +- NodeType *set = new_op("set", OPR_SET, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } /* }}} */ +- static void commit_set(NodeType *set) +- { /* {{{ */ +- commit_test2(set,"set",INSTR_SET); +- } /* }}} */ +- +- /* PLUS_EQ */ +- static NodeType *new_plus_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("plus_eq", OPR_PLUS_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_plus_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("add %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "add", INSTR_ADD, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* SUB_EQ */ +- static NodeType *new_sub_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("sub_eq", OPR_SUB_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_sub_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("sub %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "sub", INSTR_SUB, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* MUL_EQ */ +- static NodeType *new_mul_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("mul_eq", OPR_MUL_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_mul_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("mul %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "mul", INSTR_MUL, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* DIV_EQ */ +- static NodeType *new_div_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ +- { +- NodeType *set = new_op("div_eq", OPR_DIV_EQ, 2); +- set->unode.opr.op[0] = lvalue; +- set->unode.opr.op[1] = expression; +- return set; +- } +- static void commit_div_eq(NodeType *set) +- { +- precommit_node(set->unode.opr.op[1]); +-#ifdef VERBOSE +- printf("div %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "div", INSTR_DIV, 2, set->line_number); +- commit_node(set->unode.opr.op[0],0); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* commodity method for add, mult, ... */ +- +- static void precommit_expr(NodeType *expr, const char *type, int instr_id) +- { /* {{{ */ +- NodeType *tmp, *tmpcpy; +- int toAdd; +- +- /* compute "left" and "right" */ +- switch (expr->unode.opr.nbOp) { +- case 2: +- precommit_node(expr->unode.opr.op[1]); +- case 1: +- precommit_node(expr->unode.opr.op[0]); +- } +- +- if (is_tmp_expr(expr->unode.opr.op[0])) { +- tmp = expr->unode.opr.op[0]; +- toAdd = 1; +- } +- else if (is_commutative_expr(instr_id) && (expr->unode.opr.nbOp==2) && is_tmp_expr(expr->unode.opr.op[1])) { +- tmp = expr->unode.opr.op[1]; +- toAdd = 0; +- } +- else { +- char stmp[256]; +- /* declare a temporary variable to store the result */ +- if (expr->unode.opr.op[0]->type == CONST_INT_NODE) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (expr->unode.opr.op[0]->type == CONST_FLOAT_NODE) { +- sprintf(stmp,"_f_tmp%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (expr->unode.opr.op[0]->type == CONST_PTR_NODE) { +- sprintf(stmp,"_p_tmp%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- else { +- int type = gsl_type_of_var(expr->unode.opr.op[0]->vnamespace, expr->unode.opr.op[0]->str); +- if (type == INSTR_FLOAT) { +- sprintf(stmp,"_f_tmp_%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (type == INSTR_PTR) { +- sprintf(stmp,"_p_tmp_%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- else if (type == INSTR_INT) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (type == -1) { +- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", +- expr->line_number, expr->unode.opr.op[0]->str); +- exit(1); +- } +- else { /* type is a struct_id */ +- sprintf(stmp,"_s_tmp_%i",allocateTemp()); +- gsl_struct_decl_global_from_id(stmp,type); +- } +- } +- tmp = new_var(stmp,expr->line_number); +- +- /* set the tmp to the value of "op1" */ +- tmpcpy = nodeClone(tmp); +- commit_node(new_set(tmp,expr->unode.opr.op[0]),0); +- toAdd = 1; +- +- tmp = tmpcpy; +- } +- +- /* add op2 to tmp */ +-#ifdef VERBOSE +- if (expr->unode.opr.nbOp == 2) +- printf("%s %s %s\n", type, tmp->str, expr->unode.opr.op[toAdd]->str); +- else +- printf("%s %s\n", type, tmp->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr_id, expr->unode.opr.nbOp, expr->line_number); +- tmpcpy = nodeClone(tmp); +- commit_node(tmp,0); +- if (expr->unode.opr.nbOp == 2) { +- commit_node(expr->unode.opr.op[toAdd],1); +- } +- +- /* redefine the ADD node now as the computed variable */ +- nodeFreeInternals(expr); +- *expr = *tmpcpy; +- free(tmpcpy); +- } /* }}} */ +- +- static NodeType *new_expr1(const char *name, int id, NodeType *expr1) +- { /* {{{ */ +- NodeType *add = new_op(name, id, 1); +- add->unode.opr.op[0] = expr1; +- return add; +- } /* }}} */ +- +- static NodeType *new_expr2(const char *name, int id, NodeType *expr1, NodeType *expr2) +- { /* {{{ */ +- NodeType *add = new_op(name, id, 2); +- add->unode.opr.op[0] = expr1; +- add->unode.opr.op[1] = expr2; +- return add; +- } /* }}} */ +- +- /* ADD */ +- static NodeType *new_add(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("add", OPR_ADD, expr1, expr2); +- } +- static void precommit_add(NodeType *add) { +- precommit_expr(add,"add",INSTR_ADD); +- } /* }}} */ +- +- /* SUB */ +- static NodeType *new_sub(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("sub", OPR_SUB, expr1, expr2); +- } +- static void precommit_sub(NodeType *sub) { +- precommit_expr(sub,"sub",INSTR_SUB); +- } /* }}} */ +- +- /* NEG */ +- static NodeType *new_neg(NodeType *expr) { /* {{{ */ +- NodeType *zeroConst = NULL; +- if (expr->type == CONST_INT_NODE) +- zeroConst = new_constInt("0", currentGoomSL->num_lines); +- else if (expr->type == CONST_FLOAT_NODE) +- zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); +- else if (expr->type == CONST_PTR_NODE) { +- fprintf(stderr, "ERROR: Line %d, Could not negate const pointer.\n", +- currentGoomSL->num_lines); +- exit(1); +- } +- else { +- int type = gsl_type_of_var(expr->vnamespace, expr->str); +- if (type == INSTR_FLOAT) +- zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); +- else if (type == INSTR_PTR) { +- fprintf(stderr, "ERROR: Line %d, Could not negate pointer.\n", +- currentGoomSL->num_lines); +- exit(1); +- } +- else if (type == INSTR_INT) +- zeroConst = new_constInt("0", currentGoomSL->num_lines); +- else if (type == -1) { +- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", +- expr->line_number, expr->unode.opr.op[0]->str); +- exit(1); +- } +- else { /* type is a struct_id */ +- fprintf(stderr, "ERROR: Line %d, Could not negate struct '%s'\n", +- expr->line_number, expr->str); +- exit(1); +- } +- } +- return new_expr2("sub", OPR_SUB, zeroConst, expr); +- } +- /* }}} */ +- +- /* MUL */ +- static NodeType *new_mul(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("mul", OPR_MUL, expr1, expr2); +- } +- static void precommit_mul(NodeType *mul) { +- precommit_expr(mul,"mul",INSTR_MUL); +- } /* }}} */ +- +- /* DIV */ +- static NodeType *new_div(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("div", OPR_DIV, expr1, expr2); +- } +- static void precommit_div(NodeType *mul) { +- precommit_expr(mul,"div",INSTR_DIV); +- } /* }}} */ +- +- /* CALL EXPRESSION */ +- static NodeType *new_call_expr(const char *name, NodeType *affect_list) { /* {{{ */ +- NodeType *call = new_call(name,affect_list); +- NodeType *node = new_expr1(name, OPR_CALL_EXPR, call); +- node->vnamespace = gsl_find_namespace(name); +- if (node->vnamespace == NULL) +- fprintf(stderr, "ERROR: Line %d, No return type for: '%s'\n", currentGoomSL->num_lines, name); +- return node; +- } +- static void precommit_call_expr(NodeType *call) { +- char stmp[256]; +- NodeType *tmp,*tmpcpy; +- int type = gsl_type_of_var(call->vnamespace, call->str); +- if (type == INSTR_FLOAT) { +- sprintf(stmp,"_f_tmp_%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (type == INSTR_PTR) { +- sprintf(stmp,"_p_tmp_%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- else if (type == INSTR_INT) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (type == -1) { +- fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", +- call->line_number, call->str); +- exit(1); +- } +- else { /* type is a struct_id */ +- sprintf(stmp,"_s_tmp_%i",allocateTemp()); +- gsl_struct_decl_global_from_id(stmp,type); +- } +- tmp = new_var(stmp,call->line_number); +- commit_node(call->unode.opr.op[0],0); +- tmpcpy = nodeClone(tmp); +- commit_node(new_set(tmp,new_var(call->str,call->line_number)),0); +- +- nodeFreeInternals(call); +- *call = *tmpcpy; +- free(tmpcpy); +- } /* }}} */ +- +- static void commit_test2(NodeType *set,const char *type, int instr) +- { /* {{{ */ +- NodeType *tmp; +- char stmp[256]; +- precommit_node(set->unode.opr.op[0]); +- precommit_node(set->unode.opr.op[1]); +- tmp = set->unode.opr.op[0]; +- +- stmp[0] = 0; +- if (set->unode.opr.op[0]->type == CONST_INT_NODE) { +- sprintf(stmp,"_i_tmp_%i",allocateTemp()); +- gsl_int_decl_global(stmp); +- } +- else if (set->unode.opr.op[0]->type == CONST_FLOAT_NODE) { +- sprintf(stmp,"_f_tmp%i",allocateTemp()); +- gsl_float_decl_global(stmp); +- } +- else if (set->unode.opr.op[0]->type == CONST_PTR_NODE) { +- sprintf(stmp,"_p_tmp%i",allocateTemp()); +- gsl_ptr_decl_global(stmp); +- } +- if (stmp[0]) { +- NodeType *tmpcpy; +- tmp = new_var(stmp, set->line_number); +- tmpcpy = nodeClone(tmp); +- commit_node(new_set(tmp,set->unode.opr.op[0]),0); +- tmp = tmpcpy; +- } +- +-#ifdef VERBOSE +- printf("%s %s %s\n", type, tmp->str, set->unode.opr.op[1]->str); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr, 2, set->line_number); +- commit_node(tmp,instr!=INSTR_SET); +- commit_node(set->unode.opr.op[1],1); +- } /* }}} */ +- +- /* NOT */ +- static NodeType *new_not(NodeType *expr1) { /* {{{ */ +- return new_expr1("not", OPR_NOT, expr1); +- } +- static void commit_not(NodeType *set) +- { +- commit_node(set->unode.opr.op[0],0); +-#ifdef VERBOSE +- printf("not\n"); +-#endif +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "not", INSTR_NOT, 1, set->line_number); +- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +- } /* }}} */ +- +- /* EQU */ +- static NodeType *new_equ(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("isequal", OPR_EQU, expr1, expr2); +- } +- static void commit_equ(NodeType *mul) { +- commit_test2(mul,"isequal",INSTR_ISEQUAL); +- } /* }}} */ +- +- /* INF */ +- static NodeType *new_low(NodeType *expr1, NodeType *expr2) { /* {{{ */ +- return new_expr2("islower", OPR_LOW, expr1, expr2); +- } +- static void commit_low(NodeType *mul) { +- commit_test2(mul,"islower",INSTR_ISLOWER); +- } /* }}} */ +- +- /* WHILE */ +- static NodeType *new_while(NodeType *expression, NodeType *instr) { /* {{{ */ +- NodeType *node = new_op("while", OPR_WHILE, 2); +- node->unode.opr.op[0] = expression; +- node->unode.opr.op[1] = instr; +- return node; +- } +- +- static void commit_while(NodeType *node) +- { +- int lbl = allocateLabel(); +- char start_while[1024], test_while[1024]; +- sprintf(start_while, "|start_while_%d|", lbl); +- sprintf(test_while, "|test_while_%d|", lbl); +- +- GSL_PUT_JUMP(test_while,node->line_number); +- GSL_PUT_LABEL(start_while,node->line_number); +- +- /* code */ +- commit_node(node->unode.opr.op[1],0); +- +- GSL_PUT_LABEL(test_while,node->line_number); +- commit_node(node->unode.opr.op[0],0); +- GSL_PUT_JNZERO(start_while,node->line_number); +- } /* }}} */ +- +- /* FOR EACH */ +- static NodeType *new_static_foreach(NodeType *var, NodeType *var_list, NodeType *instr) { /* {{{ */ +- NodeType *node = new_op("for", OPR_FOREACH, 3); +- node->unode.opr.op[0] = var; +- node->unode.opr.op[1] = var_list; +- node->unode.opr.op[2] = instr; +- node->line_number = currentGoomSL->num_lines; +- return node; +- } +- static void commit_foreach(NodeType *node) +- { +- NodeType *cur = node->unode.opr.op[1]; +- char tmp_func[256], tmp_loop[256]; +- int lbl = allocateLabel(); +- sprintf(tmp_func, "|foreach_func_%d|", lbl); +- sprintf(tmp_loop, "|foreach_loop_%d|", lbl); +- +- GSL_PUT_JUMP(tmp_loop, node->line_number); +- GSL_PUT_LABEL(tmp_func, node->line_number); +- +- precommit_node(node->unode.opr.op[2]); +- commit_node(node->unode.opr.op[2], 0); +- +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +-#ifdef VERBOSE +- printf("ret\n"); +-#endif +- +- GSL_PUT_LABEL(tmp_loop, node->line_number); +- +- while (cur != NULL) +- { +- NodeType *x, *var; +- +- /* 1: x=var */ +- x = nodeClone(node->unode.opr.op[0]); +- var = nodeClone(cur->unode.opr.op[0]); +- commit_node(new_set(x, var),0); +- +- /* 2: instr */ +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, tmp_func, TYPE_LABEL); +-#ifdef VERBOSE +- printf("call %s\n", tmp_func); +-#endif +- +- /* 3: var=x */ +- x = nodeClone(node->unode.opr.op[0]); +- var = cur->unode.opr.op[0]; +- commit_node(new_set(var, x),0); +- cur = cur->unode.opr.op[1]; +- } +- nodeFree(node->unode.opr.op[0]); +- } /* }}} */ +- +- /* IF */ +- static NodeType *new_if(NodeType *expression, NodeType *instr) { /* {{{ */ +- NodeType *node = new_op("if", OPR_IF, 2); +- node->unode.opr.op[0] = expression; +- node->unode.opr.op[1] = instr; +- return node; +- } +- static void commit_if(NodeType *node) { +- +- char slab[1024]; +- sprintf(slab, "|eif%d|", allocateLabel()); +- commit_node(node->unode.opr.op[0],0); +- GSL_PUT_JZERO(slab,node->line_number); +- /* code */ +- commit_node(node->unode.opr.op[1],0); +- GSL_PUT_LABEL(slab,node->line_number); +- } /* }}} */ +- +- /* BLOCK */ +- static NodeType *new_block(NodeType *lastNode) { /* {{{ */ +- NodeType *blk = new_op("block", OPR_BLOCK, 2); +- blk->unode.opr.op[0] = new_nop("start_of_block"); +- blk->unode.opr.op[1] = lastNode; +- return blk; +- } +- static void commit_block(NodeType *node) { +- commit_node(node->unode.opr.op[0]->unode.opr.next,0); +- } /* }}} */ +- +- /* FUNCTION INTRO */ +- static NodeType *new_function_intro(const char *name) { /* {{{ */ +- char stmp[256]; +- if (strlen(name) < 200) { +- sprintf(stmp, "|__func_%s|", name); +- } +- return new_op(stmp, OPR_FUNC_INTRO, 0); +- } +- static void commit_function_intro(NodeType *node) { +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +-#ifdef VERBOSE +- printf("label %s\n", node->str); +-#endif +- } /* }}} */ +- +- /* FUNCTION OUTRO */ +- static NodeType *new_function_outro() { /* {{{ */ +- return new_op("ret", OPR_FUNC_OUTRO, 0); +- } +- static void commit_function_outro(NodeType *node) { +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +- releaseAllTemps(); +-#ifdef VERBOSE +- printf("ret\n"); +-#endif +- } /* }}} */ +- +- /* AFFECTATION LIST */ +- static NodeType *new_affec_list(NodeType *set, NodeType *next) /* {{{ */ +- { +- NodeType *node = new_op("affect_list", OPR_AFFECT_LIST, 2); +- node->unode.opr.op[0] = set; +- node->unode.opr.op[1] = next; +- return node; +- } +- static NodeType *new_affect_list_after(NodeType *affect_list) +- { +- NodeType *ret = NULL; +- NodeType *cur = affect_list; +- while(cur != NULL) { +- NodeType *set = cur->unode.opr.op[0]; +- NodeType *next = cur->unode.opr.op[1]; +- NodeType *lvalue = set->unode.opr.op[0]; +- NodeType *expression = set->unode.opr.op[1]; +- if ((lvalue->str[0] == '&') && (expression->type == VAR_NODE)) { +- NodeType *nset = new_set(nodeClone(expression), nodeClone(lvalue)); +- ret = new_affec_list(nset, ret); +- } +- cur = next; +- } +- return ret; +- } +- static void commit_affect_list(NodeType *node) +- { +- NodeType *cur = node; +- while(cur != NULL) { +- NodeType *set = cur->unode.opr.op[0]; +- precommit_node(set->unode.opr.op[0]); +- precommit_node(set->unode.opr.op[1]); +- cur = cur->unode.opr.op[1]; +- } +- cur = node; +- while(cur != NULL) { +- NodeType *set = cur->unode.opr.op[0]; +- commit_node(set,0); +- cur = cur->unode.opr.op[1]; +- } +- } /* }}} */ +- +- /* VAR LIST */ +- static NodeType *new_var_list(NodeType *var, NodeType *next) /* {{{ */ +- { +- NodeType *node = new_op("var_list", OPR_VAR_LIST, 2); +- node->unode.opr.op[0] = var; +- node->unode.opr.op[1] = next; +- return node; +- } +- static void commit_var_list(NodeType *node) +- { +- } /* }}} */ +- +- /* FUNCTION CALL */ +- static NodeType *new_call(const char *name, NodeType *affect_list) { /* {{{ */ +- HashValue *fval; +- fval = goom_hash_get(currentGoomSL->functions, name); +- if (!fval) { +- gsl_declare_task(name); +- fval = goom_hash_get(currentGoomSL->functions, name); +- } +- if (!fval) { +- fprintf(stderr, "ERROR: Line %d, Could not find function %s\n", currentGoomSL->num_lines, name); +- exit(1); +- return NULL; +- } +- else { +- ExternalFunctionStruct *gef = (ExternalFunctionStruct*)fval->ptr; +- if (gef->is_extern) { +- NodeType *node = new_op(name, OPR_EXT_CALL, 1); +- node->unode.opr.op[0] = affect_list; +- return node; +- } +- else { +- NodeType *node; +- char stmp[256]; +- if (strlen(name) < 200) { +- sprintf(stmp, "|__func_%s|", name); +- } +- node = new_op(stmp, OPR_CALL, 1); +- node->unode.opr.op[0] = affect_list; +- return node; +- } +- } +- } +- static void commit_ext_call(NodeType *node) { +- NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); +- commit_node(node->unode.opr.op[0],0); +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "extcall", INSTR_EXT_CALL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); +-#ifdef VERBOSE +- printf("extcall %s\n", node->str); +-#endif +- commit_node(alafter,0); +- } +- static void commit_call(NodeType *node) { +- NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); +- commit_node(node->unode.opr.op[0],0); +- currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +-#ifdef VERBOSE +- printf("call %s\n", node->str); +-#endif +- commit_node(alafter,0); +- } /* }}} */ +- +- /** **/ +- +- static NodeType *rootNode = 0; /* TODO: reinitialiser a chaque compilation. */ +- static NodeType *lastNode = 0; +- static NodeType *gsl_append(NodeType *curNode) { +- if (curNode == 0) return 0; /* {{{ */ +- if (lastNode) +- lastNode->unode.opr.next = curNode; +- lastNode = curNode; +- while(lastNode->unode.opr.next) lastNode = lastNode->unode.opr.next; +- if (rootNode == 0) +- rootNode = curNode; +- return curNode; +- } /* }}} */ +- +-#if 1 +- int allocateTemp() { +- return allocateLabel(); +- } +- void releaseAllTemps() {} +- void releaseTemp(int n) {} +-#else +- static int nbTemp = 0; +- static int *tempArray = 0; +- static int tempArraySize = 0; +- int allocateTemp() { /* TODO: allocateITemp, allocateFTemp */ +- int i = 0; /* {{{ */ +- if (tempArray == 0) { +- tempArraySize = 256; +- tempArray = (int*)malloc(tempArraySize * sizeof(int)); +- } +- while (1) { +- int j; +- for (j=0;j<nbTemp;++j) { +- if (tempArray[j] == i) break; +- } +- if (j == nbTemp) { +- if (nbTemp == tempArraySize) { +- tempArraySize *= 2; +- tempArray = (int*)realloc(tempArray,tempArraySize * sizeof(int)); +- } +- tempArray[nbTemp++] = i; +- return i; +- } +- i++; +- } +- } /* }}} */ +- void releaseAllTemps() { +- nbTemp = 0; /* {{{ */ +- } /* }}} */ +- void releaseTemp(int n) { +- int j; /* {{{ */ +- for (j=0;j<nbTemp;++j) { +- if (tempArray[j] == n) { +- tempArray[j] = tempArray[--nbTemp]; +- break; +- } +- } +- } /* }}} */ +-#endif +- +- static int lastLabel = 0; +- int allocateLabel() { +- return ++lastLabel; /* {{{ */ +- } /* }}} */ +- +- void gsl_commit_compilation() +- { /* {{{ */ +- commit_node(rootNode,0); +- rootNode = 0; +- lastNode = 0; +- } /* }}} */ +- +- void precommit_node(NodeType *node) +- { /* {{{ */ +- /* do here stuff for expression.. for exemple */ +- if (node->type == OPR_NODE) +- switch(node->unode.opr.type) { +- case OPR_ADD: precommit_add(node); break; +- case OPR_SUB: precommit_sub(node); break; +- case OPR_MUL: precommit_mul(node); break; +- case OPR_DIV: precommit_div(node); break; +- case OPR_CALL_EXPR: precommit_call_expr(node); break; +- } +- } /* }}} */ +- +- void commit_node(NodeType *node, int releaseIfTmp) +- { /* {{{ */ +- if (node == 0) return; +- +- switch(node->type) { +- case OPR_NODE: +- switch(node->unode.opr.type) { +- case OPR_SET: commit_set(node); break; +- case OPR_PLUS_EQ: commit_plus_eq(node); break; +- case OPR_SUB_EQ: commit_sub_eq(node); break; +- case OPR_MUL_EQ: commit_mul_eq(node); break; +- case OPR_DIV_EQ: commit_div_eq(node); break; +- case OPR_IF: commit_if(node); break; +- case OPR_WHILE: commit_while(node); break; +- case OPR_BLOCK: commit_block(node); break; +- case OPR_FUNC_INTRO: commit_function_intro(node); break; +- case OPR_FUNC_OUTRO: commit_function_outro(node); break; +- case OPR_CALL: commit_call(node); break; +- case OPR_EXT_CALL: commit_ext_call(node); break; +- case OPR_EQU: commit_equ(node); break; +- case OPR_LOW: commit_low(node); break; +- case OPR_NOT: commit_not(node); break; +- case OPR_AFFECT_LIST: commit_affect_list(node); break; +- case OPR_FOREACH: commit_foreach(node); break; +- case OPR_VAR_LIST: commit_var_list(node); break; +-#ifdef VERBOSE +- case EMPTY_NODE: printf("NOP\n"); break; +-#endif +- } +- +- commit_node(node->unode.opr.next,0); /* recursive for the moment, maybe better to do something iterative? */ +- break; +- +- case VAR_NODE: gsl_instr_set_namespace(currentGoomSL->instr, node->vnamespace); +- gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); break; +- case CONST_INT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_INTEGER); break; +- case CONST_FLOAT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_FLOAT); break; +- case CONST_PTR_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_PTR); break; +- } +- if (releaseIfTmp && is_tmp_expr(node)) +- releaseTemp(get_tmp_id(node)); +- +- nodeFree(node); +- } /* }}} */ +- +- NodeType *nodeNew(const char *str, int type, int line_number) { +- NodeType *node = (NodeType*)malloc(sizeof(NodeType)); /* {{{ */ +- node->type = type; +- node->str = (char*)malloc(strlen(str)+1); +- node->vnamespace = NULL; +- node->line_number = line_number; +- strcpy(node->str, str); +- return node; +- } /* }}} */ +- static NodeType *nodeClone(NodeType *node) { +- NodeType *ret = nodeNew(node->str, node->type, node->line_number); /* {{{ */ +- ret->vnamespace = node->vnamespace; +- ret->unode = node->unode; +- return ret; +- } /* }}} */ +- +- void nodeFreeInternals(NodeType *node) { +- free(node->str); /* {{{ */ +- } /* }}} */ +- +- void nodeFree(NodeType *node) { +- nodeFreeInternals(node); /* {{{ */ +- free(node); +- } /* }}} */ +- +- NodeType *new_constInt(const char *str, int line_number) { +- NodeType *node = nodeNew(str, CONST_INT_NODE, line_number); /* {{{ */ +- node->unode.constInt.val = atoi(str); +- return node; +- } /* }}} */ +- +- NodeType *new_constPtr(const char *str, int line_number) { +- NodeType *node = nodeNew(str, CONST_PTR_NODE, line_number); /* {{{ */ +- node->unode.constPtr.id = strtol(str,NULL,0); +- return node; +- } /* }}} */ +- +- NodeType *new_constFloat(const char *str, int line_number) { +- NodeType *node = nodeNew(str, CONST_FLOAT_NODE, line_number); /* {{{ */ +- node->unode.constFloat.val = atof(str); +- return node; +- } /* }}} */ +- +- NodeType *new_var(const char *str, int line_number) { +- NodeType *node = nodeNew(str, VAR_NODE, line_number); /* {{{ */ +- node->vnamespace = gsl_find_namespace(str); +- if (node->vnamespace == 0) { +- fprintf(stderr, "ERROR: Line %d, Variable not found: '%s'\n", line_number, str); +- exit(1); +- } +- return node; +- } /* }}} */ +- +- NodeType *new_nop(const char *str) { +- NodeType *node = new_op(str, EMPTY_NODE, 0); /* {{{ */ +- return node; +- } /* }}} */ +- +- NodeType *new_op(const char *str, int type, int nbOp) { +- int i; /* {{{ */ +- NodeType *node = nodeNew(str, OPR_NODE, currentGoomSL->num_lines); +- node->unode.opr.next = 0; +- node->unode.opr.type = type; +- node->unode.opr.nbOp = nbOp; +- for (i=0;i<nbOp;++i) node->unode.opr.op[i] = 0; +- return node; +- } /* }}} */ +- +- +- void gsl_declare_global_variable(int type, char *name) { +- switch(type){ +- case -1: break; +- case FLOAT_TK:gsl_float_decl_global(name);break; +- case INT_TK: gsl_int_decl_global(name);break; +- case PTR_TK: gsl_ptr_decl_global(name);break; +- default: +- { +- int id = type - 1000; +- gsl_struct_decl_global_from_id(name,id); +- } +- } +- } +- +-%} +- +-%union { +- int intValue; +- float floatValue; +- char charValue; +- char strValue[2048]; +- NodeType *nPtr; +- GoomHash *namespace; +- GSL_Struct *gsl_struct; +- GSL_StructField *gsl_struct_field; +- }; +- +-%token <strValue> LTYPE_INTEGER +-%token <strValue> LTYPE_FLOAT +-%token <strValue> LTYPE_VAR +-%token <strValue> LTYPE_PTR +- +-%token PTR_TK INT_TK FLOAT_TK DECLARE EXTERNAL WHILE DO NOT PLUS_EQ SUB_EQ DIV_EQ MUL_EQ SUP_EQ LOW_EQ NOT_EQ STRUCT FOR IN +- +-%type <intValue> return_type +-%type <nPtr> expression constValue instruction test func_call func_call_expression +-%type <nPtr> start_block affectation_list affectation_in_list affectation declaration +-%type <nPtr> var_list_content var_list +-%type <strValue> task_name ext_task_name +-%type <namespace> leave_namespace +-%type <gsl_struct> struct_members +-%type <gsl_struct_field> struct_member +-%left '\n' +-%left PLUS_EQ SUB_EQ MUL_EQ DIV_EQ +-%left NOT +-%left '=' '<' '>' +-%left '+' '-' +-%left '/' '*' +- +-%% +- +-/* -------------- Global architechture of a GSL program ------------*/ +- +-gsl: gsl_code function_outro gsl_def_functions ; +- +-gsl_code: gsl_code instruction { gsl_append($2); } +- | gsl_code EXTERNAL '<' ext_task_name '>' return_type '\n' leave_namespace { gsl_declare_global_variable($6,$4); } +- | gsl_code EXTERNAL '<' ext_task_name ':' arglist '>' return_type '\n' leave_namespace { gsl_declare_global_variable($8,$4); } +- | gsl_code DECLARE '<' task_name '>' return_type '\n' leave_namespace { gsl_declare_global_variable($6,$4); } +- | gsl_code DECLARE '<' task_name ':' arglist '>' return_type '\n' leave_namespace { gsl_declare_global_variable($8,$4); } +- | gsl_code struct_declaration +- | gsl_code '\n' +- | +- ; +- +-/* ------------- Declaration of a structure ------------ */ +- +-struct_declaration: STRUCT '<' LTYPE_VAR ':' struct_members '>' '\n' { gsl_add_struct($3, $5); } +- ; +- +-struct_members: opt_nl struct_member { $$ = gsl_new_struct($2); } +- | struct_members ',' opt_nl struct_member { $$ = $1; gsl_add_struct_field($1, $4); } +- ; +- +-struct_member: INT_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_INT); } +- | FLOAT_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_FLOAT); } +- | PTR_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_PTR); } +- | LTYPE_VAR LTYPE_VAR { $$ = gsl_new_struct_field_struct($2, $1); } +- ; +- +-/* ------------- Fonction declarations -------------- */ +- +-ext_task_name: LTYPE_VAR { gsl_declare_external_task($1); gsl_enternamespace($1); strcpy($$,$1); } +- ; +-task_name: LTYPE_VAR { gsl_declare_task($1); gsl_enternamespace($1); strcpy($$,$1); strcpy($$,$1); } +- ; +- +-return_type: { $$=-1; } +- | ':' INT_TK { $$=INT_TK; } +- | ':' FLOAT_TK { $$=FLOAT_TK; } +- | ':' PTR_TK { $$=PTR_TK; } +- | ':' LTYPE_VAR { $$= 1000 + gsl_get_struct_id($2); } +- ; +- +-arglist: empty_declaration +- | empty_declaration ',' arglist +- ; +- +-/* ------------- Fonction definition -------------- */ +- +-gsl_def_functions: gsl_def_functions function +- | +- ; +- +-function: function_intro gsl_code function_outro { gsl_leavenamespace(); } +- +-function_intro: '<' task_name '>' return_type '\n' { gsl_append(new_function_intro($2)); +- gsl_declare_global_variable($4,$2); } +- | '<' task_name ':' arglist '>' return_type '\n' { gsl_append(new_function_intro($2)); +- gsl_declare_global_variable($6,$2); } +- ; +-function_outro: { gsl_append(new_function_outro()); } ; +- +-leave_namespace: { $$ = gsl_leavenamespace(); }; +- +-/* ------------ Variable declaration ---------------- */ +- +-declaration: FLOAT_TK LTYPE_VAR '=' expression { gsl_float_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } +- | INT_TK LTYPE_VAR '=' expression { gsl_int_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } +- | PTR_TK LTYPE_VAR '=' expression { gsl_ptr_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } +- | LTYPE_VAR LTYPE_VAR '=' expression { gsl_struct_decl_local($1,$2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } +- | empty_declaration { $$ = 0; } +- ; +- +-empty_declaration: FLOAT_TK LTYPE_VAR { gsl_float_decl_local($2); } +- | INT_TK LTYPE_VAR { gsl_int_decl_local($2); } +- | PTR_TK LTYPE_VAR { gsl_ptr_decl_local($2); } +- | LTYPE_VAR LTYPE_VAR { gsl_struct_decl_local($1,$2); } +- ; +- +-/* -------------- Instructions and Expressions ------------------ */ +- +-instruction: affectation '\n' { $$ = $1; } +- | declaration '\n' { $$ = $1; } +- | '(' test ')' '?' opt_nl instruction { $$ = new_if($2,$6); } +- | WHILE test opt_nl DO opt_nl instruction { $$ = new_while($2,$6); } +- | '{' '\n' start_block gsl_code '}' '\n' { lastNode = $3->unode.opr.op[1]; $$=$3; } +- | func_call { $$ = $1; } +- | LTYPE_VAR PLUS_EQ expression { $$ = new_plus_eq(new_var($1,currentGoomSL->num_lines),$3); } +- | LTYPE_VAR SUB_EQ expression { $$ = new_sub_eq(new_var($1,currentGoomSL->num_lines),$3); } +- | LTYPE_VAR MUL_EQ expression { $$ = new_mul_eq(new_var($1,currentGoomSL->num_lines),$3); } +- | LTYPE_VAR DIV_EQ expression { $$ = new_div_eq(new_var($1,currentGoomSL->num_lines),$3); } +- | FOR LTYPE_VAR IN var_list DO instruction { $$ = new_static_foreach(new_var($2, currentGoomSL->num_lines), $4, $6); } +- ; +- +-var_list: '(' var_list_content ')' { $$ = $2; } +- ; +-var_list_content: LTYPE_VAR { $$ = new_var_list(new_var($1,currentGoomSL->num_lines), NULL); } +- | LTYPE_VAR var_list_content { $$ = new_var_list(new_var($1,currentGoomSL->num_lines), $2); } +- ; +- +-affectation: LTYPE_VAR '=' expression { $$ = new_set(new_var($1,currentGoomSL->num_lines),$3); } ; +- +-start_block: { $$ = new_block(lastNode); lastNode = $$->unode.opr.op[0]; } +- ; +- +-expression: LTYPE_VAR { $$ = new_var($1,currentGoomSL->num_lines); } +- | constValue { $$ = $1; } +- | expression '*' expression { $$ = new_mul($1,$3); } +- | expression '/' expression { $$ = new_div($1,$3); } +- | expression '+' expression { $$ = new_add($1,$3); } +- | expression '-' expression { $$ = new_sub($1,$3); } +- | '-' expression { $$ = new_neg($2); } +- | '(' expression ')' { $$ = $2; } +- | func_call_expression { $$ = $1; } +- ; +- +-test: expression '=' expression { $$ = new_equ($1,$3); } +- | expression '<' expression { $$ = new_low($1,$3); } +- | expression '>' expression { $$ = new_low($3,$1); } +- | expression SUP_EQ expression { $$ = new_not(new_low($1,$3)); } +- | expression LOW_EQ expression { $$ = new_not(new_low($3,$1)); } +- | expression NOT_EQ expression { $$ = new_not(new_equ($1,$3)); } +- | NOT test { $$ = new_not($2); } +- ; +- +-constValue: LTYPE_FLOAT { $$ = new_constFloat($1,currentGoomSL->num_lines); } +- | LTYPE_INTEGER { $$ = new_constInt($1,currentGoomSL->num_lines); } +- | LTYPE_PTR { $$ = new_constPtr($1,currentGoomSL->num_lines); } +- ; +- +-/* ---------------- Function Calls ------------------ */ +- +-func_call: task_name '\n' leave_namespace { $$ = new_call($1,NULL); } +- | task_name ':' affectation_list '\n' leave_namespace { $$ = new_call($1,$3); } +- | '[' task_name ']' '\n' leave_namespace { $$ = new_call($2,NULL); } +- | '[' task_name ':' affectation_list ']' '\n' leave_namespace { $$ = new_call($2,$4); } +- ; +- +-func_call_expression: +- '[' task_name leave_namespace ']' { $$ = new_call_expr($2,NULL); } +- | '[' task_name ':' affectation_list ']' leave_namespace { $$ = new_call_expr($2,$4); } +- ; +- +-affectation_list: affectation_in_list affectation_list { $$ = new_affec_list($1,$2); } +- | affectation_in_list { $$ = new_affec_list($1,NULL); } +- +-affectation_in_list: LTYPE_VAR '=' leave_namespace expression { +- gsl_reenternamespace($3); +- $$ = new_set(new_var($1,currentGoomSL->num_lines),$4); +- } +- | ':' leave_namespace expression { +- gsl_reenternamespace($2); +- $$ = new_set(new_var("&this", currentGoomSL->num_lines),$3); +- } +- ; +- +- +-/* ------------ Misc ---------- */ +- +-opt_nl: '\n' | ; +- +- +-%% +- +- +-void yyerror(char *str) +-{ /* {{{ */ +- fprintf(stderr, "ERROR: Line %d, %s\n", currentGoomSL->num_lines, str); +- currentGoomSL->compilationOK = 0; +- exit(1); +-} /* }}} */ +- +diff -Naur /home/d4rk/goom2k4-0/src/goom_tools.c /src/goom_tools.c +--- /home/d4rk/goom2k4-0/src/goom_tools.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_tools.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,25 +0,0 @@ +-#include "goom_tools.h" +-#include <stdlib.h> +- +-GoomRandom *goom_random_init(int i) { +- GoomRandom *grandom = (GoomRandom*)malloc(sizeof(GoomRandom)); +- srand (i); +- grandom->pos = 1; +- goom_random_update_array(grandom, GOOM_NB_RAND); +- return grandom; +-} +- +-void goom_random_free(GoomRandom *grandom) { +- free(grandom); +-} +- +-void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange) { +- while (numberOfValuesToChange > 0) { +-#if RAND_MAX < 0x10000 +- grandom->array[grandom->pos++] = ((rand()<<16)+rand()) / 127; +-#else +- grandom->array[grandom->pos++] = rand() / 127; +-#endif +- numberOfValuesToChange--; +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/goom_tools.h /src/goom_tools.h +--- /home/d4rk/goom2k4-0/src/goom_tools.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_tools.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,33 +0,0 @@ +-#ifndef _GOOMTOOLS_H +-#define _GOOMTOOLS_H +- +-/** +- * Random number generator wrapper for faster random number. +- */ +- +-#define GOOM_NB_RAND 0x10000 +- +-typedef struct _GOOM_RANDOM { +- int array[GOOM_NB_RAND]; +- unsigned short pos; +-} GoomRandom; +- +-GoomRandom *goom_random_init(int i); +-void goom_random_free(GoomRandom *grandom); +- +-inline static int goom_random(GoomRandom *grandom) { +- +- grandom->pos++; /* works because pos is an unsigned short */ +- return grandom->array[grandom->pos]; +-} +- +-inline static int goom_irand(GoomRandom *grandom, int i) { +- +- grandom->pos++; +- return grandom->array[grandom->pos] % i; +-} +- +-/* called to change the specified number of value in the array, so that the array does not remain the same*/ +-void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_typedefs.h /src/goom_typedefs.h +--- /home/d4rk/goom2k4-0/src/goom_typedefs.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_typedefs.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,11 +0,0 @@ +-#ifndef _GOOM_TYPEDEFS_H +-#define _GOOM_TYPEDEFS_H +- +-typedef struct _PLUGIN_INFO PluginInfo; +-typedef struct _SOUND_INFO SoundInfo; +-typedef struct _GMLINE GMLine; +-typedef struct _GMUNITPOINTER GMUnitPointer; +-typedef struct _ZOOM_FILTER_DATA ZoomFilterData; +-typedef struct _VISUAL_FX VisualFX; +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/goom_visual_fx.h /src/goom_visual_fx.h +--- /home/d4rk/goom2k4-0/src/goom_visual_fx.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/goom_visual_fx.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,26 +0,0 @@ +-#ifndef _VISUAL_FX_H +-#define _VISUAL_FX_H +- +-/** +- * File created on 2003-05-21 by Jeko. +- * (c)2003, JC Hoelt for iOS-software. +- * +- * LGPL Licence. +- * If you use this file on a visual program, +- * please make my name being visible on it. +- */ +- +-#include "goom_config_param.h" +-#include "goom_graphic.h" +-#include "goom_typedefs.h" +- +-struct _VISUAL_FX { +- void (*init) (struct _VISUAL_FX *_this, PluginInfo *info); +- void (*free) (struct _VISUAL_FX *_this); +- void (*apply) (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info); +- void *fx_data; +- +- PluginParameters *params; +-}; +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/graphic.c /src/graphic.c +--- /home/d4rk/goom2k4-0/src/graphic.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/graphic.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,10 +0,0 @@ +-#include "goom_graphic.h" +- +-const Color BLACK = { 0, 0, 0 }; +-const Color WHITE = { 0xff, 0xff, 0xff }; +-const Color RED = { 0xff, 0x05, 0x05 }; +-const Color GREEN = { 0x05, 0xff, 0x05 }; +-const Color BLUE = { 0x05, 0x05, 0xff }; +-const Color YELLOW = { 0xff, 0xff, 0x33 }; +-const Color ORANGE = { 0xff, 0xcc, 0x05 }; +-const Color VIOLET = { 0x55, 0x05, 0xff }; +diff -Naur /home/d4rk/goom2k4-0/src/ifs.c /src/ifs.c +--- /home/d4rk/goom2k4-0/src/ifs.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/ifs.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,763 +0,0 @@ +-/* +- * ifs.c --- modified iterated functions system for goom. +- */ +- +-/*- +- * Copyright (c) 1997 by Massimino Pascal <Pascal.Massimon@ens.fr> +- * +- * Permission to use, copy, modify, and distribute this software and its +- * documentation for any purpose and without fee is hereby granted, +- * provided that the above copyright notice appear in all copies and that +- * both that copyright notice and this permission notice appear in +- * supporting documentation. +- * +- * This file is provided AS IS with no warranties of any kind. The author +- * shall have no liability with respect to the infringement of copyrights, +- * trade secrets or any patents by this file or any part thereof. In no +- * event will the author be liable for any lost revenue or profits or +- * other special, indirect and consequential damages. +- * +- * If this mode is weird and you have an old MetroX server, it is buggy. +- * There is a free SuSE-enhanced MetroX X server that is fine. +- * +- * When shown ifs, Diana Rose (4 years old) said, "It looks like dancing." +- * +- * Revision History: +- * 13-Dec-2003: Added some goom specific stuffs (to make ifs a VisualFX). +- * 11-Apr-2002: jeko@ios-software.com: Make ifs.c system-indendant. (ifs.h added) +- * 01-Nov-2000: Allocation checks +- * 10-May-1997: jwz@jwz.org: turned into a standalone program. +- * Made it render into an offscreen bitmap and then copy +- * that onto the screen, to reduce flicker. +- */ +- +-/* #ifdef STANDALONE */ +- +-#include <math.h> +-#include <stdlib.h> +-#include <stdio.h> +- +-#include "goom_config.h" +- +-#ifdef HAVE_MMX +-#include "mmx.h" +-#endif +- +-#include "goom_graphic.h" +-#include "ifs.h" +-#include "goom_tools.h" +- +-typedef struct _ifsPoint +-{ +- gint32 x, y; +-} +-IFSPoint; +- +- +-#define MODE_ifs +- +-#define PROGCLASS "IFS" +- +-#define HACK_INIT init_ifs +-#define HACK_DRAW draw_ifs +- +-#define ifs_opts xlockmore_opts +- +-#define DEFAULTS "*delay: 20000 \n" \ +-"*ncolors: 100 \n" +- +-#define SMOOTH_COLORS +- +-#define LRAND() ((long) (goom_random(goomInfo->gRandom) & 0x7fffffff)) +-#define NRAND(n) ((int) (LRAND() % (n))) +- +-#if RAND_MAX < 0x10000 +-#define MAXRAND (((float)(RAND_MAX<16)+((float)RAND_MAX)+1.0f)/127.0f) +-#else +-#define MAXRAND (2147483648.0/127.0) /* unsigned 1<<31 / 127.0 (cf goom_tools) as a float */ +-#endif +- +-/*****************************************************/ +- +-typedef float DBL; +-typedef int F_PT; +- +-/* typedef float F_PT; */ +- +-/*****************************************************/ +- +-#define FIX 12 +-#define UNIT ( 1<<FIX ) +-#define MAX_SIMI 6 +- +-#define MAX_DEPTH_2 10 +-#define MAX_DEPTH_3 6 +-#define MAX_DEPTH_4 4 +-#define MAX_DEPTH_5 2 +- +-/* PREVIOUS VALUE +-#define MAX_SIMI 6 +- +- * settings for a PC 120Mhz... * +-#define MAX_DEPTH_2 10 +-#define MAX_DEPTH_3 6 +-#define MAX_DEPTH_4 4 +-#define MAX_DEPTH_5 3 +-*/ +- +-#define DBL_To_F_PT(x) (F_PT)( (DBL)(UNIT)*(x) ) +- +-typedef struct Similitude_Struct SIMI; +-typedef struct Fractal_Struct FRACTAL; +- +-struct Similitude_Struct +-{ +- +- DBL c_x, c_y; +- DBL r, r2, A, A2; +- F_PT Ct, St, Ct2, St2; +- F_PT Cx, Cy; +- F_PT R, R2; +-}; +- +- +-struct Fractal_Struct +-{ +- +- int Nb_Simi; +- SIMI Components[5 * MAX_SIMI]; +- int Depth, Col; +- int Count, Speed; +- int Width, Height, Lx, Ly; +- DBL r_mean, dr_mean, dr2_mean; +- int Cur_Pt, Max_Pt; +- +- IFSPoint *Buffer1, *Buffer2; +-}; +- +-typedef struct _IFS_DATA { +- FRACTAL *Root; +- FRACTAL *Cur_F; +- +- /* Used by the Trace recursive method */ +- IFSPoint *Buf; +- int Cur_Pt; +- int initalized; +-} IfsData; +- +- +-/*****************************************************/ +- +-static DBL +-Gauss_Rand (PluginInfo *goomInfo, DBL c, DBL A, DBL S) +-{ +- DBL y; +- +- y = (DBL) LRAND () / MAXRAND; +- y = A * (1.0 - exp (-y * y * S)) / (1.0 - exp (-S)); +- if (NRAND (2)) +- return (c + y); +- return (c - y); +-} +- +-static DBL +-Half_Gauss_Rand (PluginInfo *goomInfo, DBL c, DBL A, DBL S) +-{ +- DBL y; +- +- y = (DBL) LRAND () / MAXRAND; +- y = A * (1.0 - exp (-y * y * S)) / (1.0 - exp (-S)); +- return (c + y); +-} +- +-static void +-Random_Simis (PluginInfo *goomInfo, FRACTAL * F, SIMI * Cur, int i) +-{ +- while (i--) { +- Cur->c_x = Gauss_Rand (goomInfo, 0.0, .8, 4.0); +- Cur->c_y = Gauss_Rand (goomInfo, 0.0, .8, 4.0); +- Cur->r = Gauss_Rand (goomInfo, F->r_mean, F->dr_mean, 3.0); +- Cur->r2 = Half_Gauss_Rand (goomInfo, 0.0, F->dr2_mean, 2.0); +- Cur->A = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (M_PI / 180.0); +- Cur->A2 = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (M_PI / 180.0); +- Cur++; +- } +-} +- +-static void +-free_ifs_buffers (FRACTAL * Fractal) +-{ +- if (Fractal->Buffer1 != NULL) { +- (void) free ((void *) Fractal->Buffer1); +- Fractal->Buffer1 = (IFSPoint *) NULL; +- } +- if (Fractal->Buffer2 != NULL) { +- (void) free ((void *) Fractal->Buffer2); +- Fractal->Buffer2 = (IFSPoint *) NULL; +- } +-} +- +- +-static void +-free_ifs (FRACTAL * Fractal) +-{ +- free_ifs_buffers (Fractal); +-} +- +-/***************************************************************/ +- +-static void +-init_ifs (PluginInfo *goomInfo, IfsData *data) +-{ +- int i; +- FRACTAL *Fractal; +- int width = goomInfo->screen.width; +- int height = goomInfo->screen.height; +- +- if (data->Root == NULL) { +- data->Root = (FRACTAL *) malloc (sizeof (FRACTAL)); +- if (data->Root == NULL) +- return; +- data->Root->Buffer1 = (IFSPoint *) NULL; +- data->Root->Buffer2 = (IFSPoint *) NULL; +- } +- Fractal = data->Root; +- +- free_ifs_buffers (Fractal); +- +- i = (NRAND (4)) + 2; /* Number of centers */ +- switch (i) { +- case 3: +- Fractal->Depth = MAX_DEPTH_3; +- Fractal->r_mean = .6; +- Fractal->dr_mean = .4; +- Fractal->dr2_mean = .3; +- break; +- +- case 4: +- Fractal->Depth = MAX_DEPTH_4; +- Fractal->r_mean = .5; +- Fractal->dr_mean = .4; +- Fractal->dr2_mean = .3; +- break; +- +- case 5: +- Fractal->Depth = MAX_DEPTH_5; +- Fractal->r_mean = .5; +- Fractal->dr_mean = .4; +- Fractal->dr2_mean = .3; +- break; +- +- default: +- case 2: +- Fractal->Depth = MAX_DEPTH_2; +- Fractal->r_mean = .7; +- Fractal->dr_mean = .3; +- Fractal->dr2_mean = .4; +- break; +- } +- Fractal->Nb_Simi = i; +- Fractal->Max_Pt = Fractal->Nb_Simi - 1; +- for (i = 0; i <= Fractal->Depth + 2; ++i) +- Fractal->Max_Pt *= Fractal->Nb_Simi; +- +- if ((Fractal->Buffer1 = (IFSPoint *) calloc (Fractal->Max_Pt, +- sizeof (IFSPoint))) == NULL) { +- free_ifs (Fractal); +- return; +- } +- if ((Fractal->Buffer2 = (IFSPoint *) calloc (Fractal->Max_Pt, +- sizeof (IFSPoint))) == NULL) { +- free_ifs (Fractal); +- return; +- } +- +- Fractal->Speed = 6; +- Fractal->Width = width; /* modif by JeKo */ +- Fractal->Height = height; /* modif by JeKo */ +- Fractal->Cur_Pt = 0; +- Fractal->Count = 0; +- Fractal->Lx = (Fractal->Width - 1) / 2; +- Fractal->Ly = (Fractal->Height - 1) / 2; +- Fractal->Col = rand () % (width * height); /* modif by JeKo */ +- +- Random_Simis (goomInfo, Fractal, Fractal->Components, 5 * MAX_SIMI); +-} +- +- +-/***************************************************************/ +- +-static inline void +-Transform (SIMI * Simi, F_PT xo, F_PT yo, F_PT * x, F_PT * y) +-{ +- F_PT xx, yy; +- +- xo = xo - Simi->Cx; +- xo = (xo * Simi->R) >> FIX; /* / UNIT; */ +- yo = yo - Simi->Cy; +- yo = (yo * Simi->R) >> FIX; /* / UNIT; */ +- +- xx = xo - Simi->Cx; +- xx = (xx * Simi->R2) >> FIX; /* / UNIT; */ +- yy = -yo - Simi->Cy; +- yy = (yy * Simi->R2) >> FIX; /* / UNIT; */ +- +- *x = +- ((xo * Simi->Ct - yo * Simi->St + xx * Simi->Ct2 - yy * Simi->St2) +- >> FIX /* / UNIT */ ) + Simi->Cx; +- *y = +- ((xo * Simi->St + yo * Simi->Ct + xx * Simi->St2 + yy * Simi->Ct2) +- >> FIX /* / UNIT */ ) + Simi->Cy; +-} +- +-/***************************************************************/ +- +-static void +-Trace (FRACTAL * F, F_PT xo, F_PT yo, IfsData *data) +-{ +- F_PT x, y, i; +- SIMI *Cur; +- +- Cur = data->Cur_F->Components; +- for (i = data->Cur_F->Nb_Simi; i; --i, Cur++) { +- Transform (Cur, xo, yo, &x, &y); +- +- data->Buf->x = F->Lx + ((x * F->Lx) >> (FIX+1) /* /(UNIT*2) */ ); +- data->Buf->y = F->Ly - ((y * F->Ly) >> (FIX+1) /* /(UNIT*2) */ ); +- data->Buf++; +- +- data->Cur_Pt++; +- +- if (F->Depth && ((x - xo) >> 4) && ((y - yo) >> 4)) { +- F->Depth--; +- Trace (F, x, y, data); +- F->Depth++; +- } +- } +-} +- +-static void +-Draw_Fractal (IfsData *data) +-{ +- FRACTAL *F = data->Root; +- int i, j; +- F_PT x, y, xo, yo; +- SIMI *Cur, *Simi; +- +- for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { +- Cur->Cx = DBL_To_F_PT (Cur->c_x); +- Cur->Cy = DBL_To_F_PT (Cur->c_y); +- +- Cur->Ct = DBL_To_F_PT (cos (Cur->A)); +- Cur->St = DBL_To_F_PT (sin (Cur->A)); +- Cur->Ct2 = DBL_To_F_PT (cos (Cur->A2)); +- Cur->St2 = DBL_To_F_PT (sin (Cur->A2)); +- +- Cur->R = DBL_To_F_PT (Cur->r); +- Cur->R2 = DBL_To_F_PT (Cur->r2); +- } +- +- +- data->Cur_Pt = 0; +- data->Cur_F = F; +- data->Buf = F->Buffer2; +- for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { +- xo = Cur->Cx; +- yo = Cur->Cy; +- for (Simi = F->Components, j = F->Nb_Simi; j; --j, Simi++) { +- if (Simi == Cur) +- continue; +- Transform (Simi, xo, yo, &x, &y); +- Trace (F, x, y, data); +- } +- } +- +- /* Erase previous */ +- +- F->Cur_Pt = data->Cur_Pt; +- data->Buf = F->Buffer1; +- F->Buffer1 = F->Buffer2; +- F->Buffer2 = data->Buf; +-} +- +- +-static IFSPoint * +-draw_ifs (PluginInfo *goomInfo, int *nbpt, IfsData *data) +-{ +- int i; +- DBL u, uu, v, vv, u0, u1, u2, u3; +- SIMI *S, *S1, *S2, *S3, *S4; +- FRACTAL *F; +- +- if (data->Root == NULL) +- return NULL; +- F = data->Root; +- if (F->Buffer1 == NULL) +- return NULL; +- +- u = (DBL) (F->Count) * (DBL) (F->Speed) / 1000.0; +- uu = u * u; +- v = 1.0 - u; +- vv = v * v; +- u0 = vv * v; +- u1 = 3.0 * vv * u; +- u2 = 3.0 * v * uu; +- u3 = u * uu; +- +- S = F->Components; +- S1 = S + F->Nb_Simi; +- S2 = S1 + F->Nb_Simi; +- S3 = S2 + F->Nb_Simi; +- S4 = S3 + F->Nb_Simi; +- +- for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { +- S->c_x = u0 * S1->c_x + u1 * S2->c_x + u2 * S3->c_x + u3 * S4->c_x; +- S->c_y = u0 * S1->c_y + u1 * S2->c_y + u2 * S3->c_y + u3 * S4->c_y; +- S->r = u0 * S1->r + u1 * S2->r + u2 * S3->r + u3 * S4->r; +- S->r2 = u0 * S1->r2 + u1 * S2->r2 + u2 * S3->r2 + u3 * S4->r2; +- S->A = u0 * S1->A + u1 * S2->A + u2 * S3->A + u3 * S4->A; +- S->A2 = u0 * S1->A2 + u1 * S2->A2 + u2 * S3->A2 + u3 * S4->A2; +- } +- +- Draw_Fractal (data); +- +- if (F->Count >= 1000 / F->Speed) { +- S = F->Components; +- S1 = S + F->Nb_Simi; +- S2 = S1 + F->Nb_Simi; +- S3 = S2 + F->Nb_Simi; +- S4 = S3 + F->Nb_Simi; +- +- for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { +- S2->c_x = 2.0 * S4->c_x - S3->c_x; +- S2->c_y = 2.0 * S4->c_y - S3->c_y; +- S2->r = 2.0 * S4->r - S3->r; +- S2->r2 = 2.0 * S4->r2 - S3->r2; +- S2->A = 2.0 * S4->A - S3->A; +- S2->A2 = 2.0 * S4->A2 - S3->A2; +- +- *S1 = *S4; +- } +- Random_Simis (goomInfo, F, F->Components + 3 * F->Nb_Simi, F->Nb_Simi); +- +- Random_Simis (goomInfo, F, F->Components + 4 * F->Nb_Simi, F->Nb_Simi); +- +- F->Count = 0; +- } +- else +- F->Count++; +- +- F->Col++; +- +- (*nbpt) = data->Cur_Pt; +- return F->Buffer2; +-} +- +- +-/***************************************************************/ +- +-static void release_ifs (IfsData *data) +-{ +- if (data->Root != NULL) { +- free_ifs (data->Root); +- (void) free ((void *) data->Root); +- data->Root = (FRACTAL *) NULL; +- } +-} +- +-#define RAND() goom_random(goomInfo->gRandom) +- +-static void ifs_update (PluginInfo *goomInfo, Pixel * data, Pixel * back, int increment, IfsData *fx_data) +-{ +- static int couleur = 0xc0c0c0c0; +- static int v[4] = { 2, 4, 3, 2 }; +- static int col[4] = { 2, 4, 3, 2 }; +- +-#define MOD_MER 0 +-#define MOD_FEU 1 +-#define MOD_MERVER 2 +- static int mode = MOD_MERVER; +- static int justChanged = 0; +- static int cycle = 0; +- int cycle10; +- +- int nbpt; +- IFSPoint *points; +- int i; +- +- int couleursl = couleur; +- int width = goomInfo->screen.width; +- int height = goomInfo->screen.height; +- +- cycle++; +- if (cycle >= 80) +- cycle = 0; +- +- if (cycle < 40) +- cycle10 = cycle / 10; +- else +- cycle10 = 7 - cycle / 10; +- +- { +- unsigned char *tmp = (unsigned char *) &couleursl; +- +- for (i = 0; i < 4; i++) { +- *tmp = (*tmp) >> cycle10; +- tmp++; +- } +- } +- +- points = draw_ifs (goomInfo, &nbpt, fx_data); +- nbpt--; +- +-#ifdef HAVE_MMX +- movd_m2r (couleursl, mm1); +- punpckldq_r2r (mm1, mm1); +- for (i = 0; i < nbpt; i += increment) { +- int x = points[i].x; +- int y = points[i].y; +- +- if ((x < width) && (y < height) && (x > 0) && (y > 0)) { +- int pos = x + (y * width); +- movd_m2r (back[pos], mm0); +- paddusb_r2r (mm1, mm0); +- movd_r2m (mm0, data[pos]); +- } +- } +- emms();/*__asm__ __volatile__ ("emms");*/ +-#else +- for (i = 0; i < nbpt; i += increment) { +- int x = (int) points[i].x & 0x7fffffff; +- int y = (int) points[i].y & 0x7fffffff; +- +- if ((x < width) && (y < height)) { +- int pos = x + (int) (y * width); +- int tra = 0, i = 0; +- unsigned char *bra = (unsigned char *) &back[pos]; +- unsigned char *dra = (unsigned char *) &data[pos]; +- unsigned char *cra = (unsigned char *) &couleursl; +- +- for (; i < 4; i++) { +- tra = *cra; +- tra += *bra; +- if (tra > 255) +- tra = 255; +- *dra = tra; +- ++dra; +- ++cra; +- ++bra; +- } +- } +- } +-#endif /*MMX*/ +- justChanged--; +- +- col[ALPHA] = couleur >> (ALPHA * 8) & 0xff; +- col[BLEU] = couleur >> (BLEU * 8) & 0xff; +- col[VERT] = couleur >> (VERT * 8) & 0xff; +- col[ROUGE] = couleur >> (ROUGE * 8) & 0xff; +- +- if (mode == MOD_MER) { +- col[BLEU] += v[BLEU]; +- if (col[BLEU] > 255) { +- col[BLEU] = 255; +- v[BLEU] = -(RAND() % 4) - 1; +- } +- if (col[BLEU] < 32) { +- col[BLEU] = 32; +- v[BLEU] = (RAND() % 4) + 1; +- } +- +- col[VERT] += v[VERT]; +- if (col[VERT] > 200) { +- col[VERT] = 200; +- v[VERT] = -(RAND() % 3) - 2; +- } +- if (col[VERT] > col[BLEU]) { +- col[VERT] = col[BLEU]; +- v[VERT] = v[BLEU]; +- } +- if (col[VERT] < 32) { +- col[VERT] = 32; +- v[VERT] = (RAND() % 3) + 2; +- } +- +- col[ROUGE] += v[ROUGE]; +- if (col[ROUGE] > 64) { +- col[ROUGE] = 64; +- v[ROUGE] = -(RAND () % 4) - 1; +- } +- if (col[ROUGE] < 0) { +- col[ROUGE] = 0; +- v[ROUGE] = (RAND () % 4) + 1; +- } +- +- col[ALPHA] += v[ALPHA]; +- if (col[ALPHA] > 0) { +- col[ALPHA] = 0; +- v[ALPHA] = -(RAND () % 4) - 1; +- } +- if (col[ALPHA] < 0) { +- col[ALPHA] = 0; +- v[ALPHA] = (RAND () % 4) + 1; +- } +- +- if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40) +- && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64) +- && (RAND () % 20 == 0)) && (justChanged < 0)) { +- mode = RAND () % 3 ? MOD_FEU : MOD_MERVER; +- justChanged = 250; +- } +- } +- else if (mode == MOD_MERVER) { +- col[BLEU] += v[BLEU]; +- if (col[BLEU] > 128) { +- col[BLEU] = 128; +- v[BLEU] = -(RAND () % 4) - 1; +- } +- if (col[BLEU] < 16) { +- col[BLEU] = 16; +- v[BLEU] = (RAND () % 4) + 1; +- } +- +- col[VERT] += v[VERT]; +- if (col[VERT] > 200) { +- col[VERT] = 200; +- v[VERT] = -(RAND () % 3) - 2; +- } +- if (col[VERT] > col[ALPHA]) { +- col[VERT] = col[ALPHA]; +- v[VERT] = v[ALPHA]; +- } +- if (col[VERT] < 32) { +- col[VERT] = 32; +- v[VERT] = (RAND () % 3) + 2; +- } +- +- col[ROUGE] += v[ROUGE]; +- if (col[ROUGE] > 128) { +- col[ROUGE] = 128; +- v[ROUGE] = -(RAND () % 4) - 1; +- } +- if (col[ROUGE] < 0) { +- col[ROUGE] = 0; +- v[ROUGE] = (RAND () % 4) + 1; +- } +- +- col[ALPHA] += v[ALPHA]; +- if (col[ALPHA] > 255) { +- col[ALPHA] = 255; +- v[ALPHA] = -(RAND () % 4) - 1; +- } +- if (col[ALPHA] < 0) { +- col[ALPHA] = 0; +- v[ALPHA] = (RAND () % 4) + 1; +- } +- +- if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40) +- && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64) +- && (RAND () % 20 == 0)) && (justChanged < 0)) { +- mode = RAND () % 3 ? MOD_FEU : MOD_MER; +- justChanged = 250; +- } +- } +- else if (mode == MOD_FEU) { +- +- col[BLEU] += v[BLEU]; +- if (col[BLEU] > 64) { +- col[BLEU] = 64; +- v[BLEU] = -(RAND () % 4) - 1; +- } +- if (col[BLEU] < 0) { +- col[BLEU] = 0; +- v[BLEU] = (RAND () % 4) + 1; +- } +- +- col[VERT] += v[VERT]; +- if (col[VERT] > 200) { +- col[VERT] = 200; +- v[VERT] = -(RAND () % 3) - 2; +- } +- if (col[VERT] > col[ROUGE] + 20) { +- col[VERT] = col[ROUGE] + 20; +- v[VERT] = -(RAND () % 3) - 2; +- v[ROUGE] = (RAND () % 4) + 1; +- v[BLEU] = (RAND () % 4) + 1; +- } +- if (col[VERT] < 0) { +- col[VERT] = 0; +- v[VERT] = (RAND () % 3) + 2; +- } +- +- col[ROUGE] += v[ROUGE]; +- if (col[ROUGE] > 255) { +- col[ROUGE] = 255; +- v[ROUGE] = -(RAND () % 4) - 1; +- } +- if (col[ROUGE] > col[VERT] + 40) { +- col[ROUGE] = col[VERT] + 40; +- v[ROUGE] = -(RAND () % 4) - 1; +- } +- if (col[ROUGE] < 0) { +- col[ROUGE] = 0; +- v[ROUGE] = (RAND () % 4) + 1; +- } +- +- col[ALPHA] += v[ALPHA]; +- if (col[ALPHA] > 0) { +- col[ALPHA] = 0; +- v[ALPHA] = -(RAND () % 4) - 1; +- } +- if (col[ALPHA] < 0) { +- col[ALPHA] = 0; +- v[ALPHA] = (RAND () % 4) + 1; +- } +- +- if (((col[ROUGE] < 64) && (col[VERT] > 32) && (col[VERT] < col[BLEU]) +- && (col[BLEU] > 32) +- && (RAND () % 20 == 0)) && (justChanged < 0)) { +- mode = RAND () % 2 ? MOD_MER : MOD_MERVER; +- justChanged = 250; +- } +- } +- +- couleur = (col[ALPHA] << (ALPHA * 8)) +- | (col[BLEU] << (BLEU * 8)) +- | (col[VERT] << (VERT * 8)) +- | (col[ROUGE] << (ROUGE * 8)); +-} +- +-/** VISUAL_FX WRAPPER FOR IFS */ +- +-static void ifs_vfx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo) { +- +- IfsData *data = (IfsData*)_this->fx_data; +- if (!data->initalized) { +- data->initalized = 1; +- init_ifs(goomInfo, data); +- } +- ifs_update (goomInfo, dest, src, goomInfo->update.ifs_incr, data); +- /*TODO: trouver meilleur soluce pour increment (mettre le code de gestion de l'ifs dans ce fichier: ifs_vfx_apply) */ +-} +- +-static void ifs_vfx_init(VisualFX *_this, PluginInfo *info) { +- +- IfsData *data = (IfsData*)malloc(sizeof(IfsData)); +- data->Root = (FRACTAL*)NULL; +- data->initalized = 0; +- _this->fx_data = data; +-} +- +-static void ifs_vfx_free(VisualFX *_this) { +- IfsData *data = (IfsData*)_this->fx_data; +- release_ifs(data); +- free(data); +-} +- +-VisualFX ifs_visualfx_create(void) { +- VisualFX vfx; +- vfx.init = ifs_vfx_init; +- vfx.free = ifs_vfx_free; +- vfx.apply = ifs_vfx_apply; +- return vfx; +-} +diff -Naur /home/d4rk/goom2k4-0/src/ifs.h /src/ifs.h +--- /home/d4rk/goom2k4-0/src/ifs.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/ifs.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,27 +0,0 @@ +-/* +- * File created 11 april 2002 by JeKo <jeko@free.fr> +- */ +- +-#ifndef IFS_H +-#define IFS_H +- +-#include "goom_config.h" +-#include "goom_graphic.h" +-#include "goom_plugin_info.h" +-#include "goom_visual_fx.h" +- +-VisualFX ifs_visualfx_create(void); +- +-/* init ifs for a (width)x(height) output. * / +-void init_ifs (PluginInfo *goomInfo, int width, int height); +- +-/ * draw an ifs on the buffer (which size is width * height) +- increment means that we draw 1/increment of the ifs's points * / +-void ifs_update (PluginInfo *goomInfo, Pixel * buffer, Pixel * back, int width, int height, int increment); +- +-/ * free all ifs's data. * / +-void release_ifs (void); +-*/ +- +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/jitc_test.c /src/jitc_test.c +--- /home/d4rk/goom2k4-0/src/jitc_test.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/jitc_test.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,38 +0,0 @@ +-#include "jitc_x86.h" +-#include <stdio.h> +- +-int main(int c, char **v) +-{ +- int i; +- int j; +- JitcX86Env *jitc = jitc_x86_env_new(0xffff); +- JitcFunc func = jitc_prepare_func(jitc); +- +- jitc_add(jitc, "mov edx, $d", 0xffffffff); +- jitc_add(jitc, "mov eax, $d", 40); +- jitc_add(jitc, "mov ebx, $d", 2); +- jitc_add(jitc, "idiv ebx"); +- jitc_add(jitc, "mov eax, [$d]", 0xdeadbeaf); +- +- jitc_add(jitc, "sal edx, $d", 7); +- jitc_add(jitc, "imul ecx"); +- jitc_add(jitc, "idiv ecx"); +- jitc_add(jitc, "imul $d[ecx]", 2); +- jitc_add(jitc, "imul ecx, [ecx]"); +- jitc_add(jitc, "mov ecx, $d", (char*)(&i)-12); +- jitc_add(jitc, "dec $d[ecx]", 2); +- jitc_add(jitc, "add ecx, $d", 12); +- jitc_add(jitc, "dec [ecx]"); +- jitc_add(jitc, "dec ecx"); +- +- JITC_FLD_pIMM32(jitc,&i); +- JITC_FSTP_pIMM32(jitc,&j); +- +- jitc_validate_func(jitc); +- func(); +- +- printf("i = 0x%08x\n", i); +- +- jitc_x86_delete(jitc); +- return 0; +-} +diff -Naur /home/d4rk/goom2k4-0/src/jitc_x86.c /src/jitc_x86.c +--- /home/d4rk/goom2k4-0/src/jitc_x86.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/jitc_x86.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,530 +0,0 @@ +-#include "jitc_x86.h" +- +-#include <stdio.h> +-#include <stdlib.h> +-#include <stdarg.h> +- +-#define PARAM_INT 1 +-#define PARAM_FLOAT 2 +-#define PARAM_REG 3 +-#define PARAM_dispREG 4 +-#define PARAM_DISP32 5 +-#define PARAM_LABEL 6 +-#define PARAM_NONE 666 +- +-typedef struct { +- int id; +- int i; +- double f; +- int reg; +- int disp; +- char label[256]; +-} IParam; +- +-struct { +- char *name; +- int reg; +-} RegsName[] = { +- {"eax",EAX}, {"ebx",EBX}, {"ecx",ECX}, {"edx",EDX}, +- {"edi",EDI}, {"esi",ESI}, {"ebp",EBP}, {"esp",ESP}, +- {"st0",0}, {"st1",1}, {"st2",2}, {"st3",3}, +- {"st4",4}, {"st5",5}, {"st6",6}, {"st7",7}, +- {"mm0",0}, {"mm1",1}, {"mm2",2}, {"mm3",3}, +- {"mm4",4}, {"mm5",5}, {"mm6",6}, {"mm7",7}, {NULL,0} +-}; +- +-void modrm(JitcX86Env *jitc, int opcode, IParam *iparam) +-{ +- int dest = 0; +- int src = 1; +- int direction = 0x0; +- unsigned int byte = 666; +- unsigned int int32 = 0; +- unsigned int need32 = 0; +- +- if ((iparam[0].id == PARAM_REG) && (iparam[1].id != PARAM_REG)) { +- dest = 1; +- src = 0; +- direction = 0x02; +- } +- +- if (iparam[src].id != PARAM_REG) { +- fprintf(stderr, "JITC_x86: Invalid Instruction Parameters: %d %d.\n", iparam[0].id, iparam[1].id); +- exit(1); +- } +- +- if (iparam[dest].id == PARAM_REG) { +- byte = ((int)JITC_MOD_REG_REG << 6) | (iparam[src].reg << 3) | (iparam[0].reg); +- } +- +- else if (iparam[dest].id == PARAM_dispREG) +- { +- if (iparam[dest].disp == 0) +- byte = ((int)JITC_MOD_pREG_REG << 6) | (iparam[src].reg << 3) | (iparam[dest].reg); +- } +- +- else if (iparam[dest].id == PARAM_DISP32) +- { +- byte = ((int)JITC_MOD_pREG_REG << 6) | (iparam[src].reg << 3) | JITC_RM_DISP32; +- need32 = 1; +- int32 = iparam[dest].disp; +- } +- +- if (byte == 666) { +- fprintf(stderr, "JITC_x86: Invalid Instruction Parameters: %d %d.\n", iparam[0].id, iparam[1].id); +- exit(1); +- } +- else { +- if (opcode < 0x100) +- JITC_ADD_UCHAR(jitc, opcode + direction); +- else { +- JITC_ADD_UCHAR(jitc, (opcode>>8)&0xff); +- JITC_ADD_UCHAR(jitc, (opcode&0xff)/* + direction*/); +- } +- JITC_ADD_UCHAR(jitc, byte); +- if (need32) +- JITC_ADD_UINT(jitc, int32); +- } +-} +- +-static void imul_like_modrm_1param(JitcX86Env *jitc, int opcode, int digit, IParam *iparam) +-{ +- if (iparam[0].id == PARAM_REG) +- { +- JITC_ADD_UCHAR(jitc, opcode); +- JITC_MODRM(jitc, 0x03, digit, iparam[0].reg); +- return; +- } +- if (iparam[0].id == PARAM_dispREG) { +- JITC_ADD_UCHAR(jitc, opcode); +- if (iparam[0].disp == 0) +- { +- JITC_MODRM(jitc, 0x00, digit, iparam[0].reg); +- } +- else if ((iparam[0].disp & 0xff) == iparam[0].disp) +- { +- JITC_MODRM(jitc, 0x01, digit, iparam[0].reg); +- JITC_ADD_UCHAR(jitc, iparam[0].disp); +- } +- else +- { +- JITC_MODRM(jitc, 0x02, digit, iparam[0].reg); +- JITC_ADD_UINT(jitc, iparam[0].disp); +- } +- return; +- } +- if (iparam[0].id == PARAM_DISP32) { +- JITC_ADD_UCHAR(jitc, opcode); +- JITC_MODRM(jitc, JITC_MOD_pREG_REG, digit, JITC_RM_DISP32); +- JITC_ADD_UINT(jitc, iparam[0].disp); +- return; +- } +-} +- +-/* 1 byte encoded opcode including register... imm32 parameter */ +-#define INSTR_1bReg_IMM32(opcode,dest,src) { \ +- JITC_ADD_UCHAR(jitc, opcode + iparam[dest].reg); \ +- JITC_ADD_UINT (jitc, (int)iparam[src].i); } +- +-typedef struct { +- char *name; +- int opcode; +- int opcode_reg_int; +- int digit_reg_int; +- int opcode_eax_int; +-} AddLikeInstr; +- +-static AddLikeInstr addLike[] = { +- { "add", 0x01, 0x81, 0x00, 0x05 }, +- { "and", 0x21, 0x81, 0x04, 0x25 }, +- { "or", 0x0B, 0x81, 0x01, 0x0D }, +- { "cmp", 0x39, 0x81, 0x07, 0x3D }, +- { "imul", 0x0FAF, 0x69, 0x00, 0x10000 }, +- { "sub", 0x29, 0x81, 0x05, 0X2D }, +- { NULL, -1, -1, -1, -1 } +-}; +- +-int checkAddLike(JitcX86Env *jitc, char *op, IParam *iparam, int nbParams) +-{ +- int i; +- for (i=0;addLike[i].name;++i) +- { +- if (strcmp(op,addLike[i].name) == 0) +- { +- if ((iparam[0].id == PARAM_REG) && (iparam[1].id == PARAM_INT)) { +- if ((iparam[0].reg == EAX) && (addLike[i].opcode_eax_int != 0x10000)) { +- JITC_ADD_UCHAR(jitc, addLike[i].opcode_eax_int); +- JITC_ADD_UINT(jitc, iparam[1].i); +- return 1; +- } +- else { +- JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); +- JITC_MODRM(jitc, 0x03, addLike[i].digit_reg_int, iparam[0].reg); +- JITC_ADD_UINT(jitc, iparam[1].i); +- return 1; +- } +- } +- else if ((iparam[0].id == PARAM_dispREG) && (iparam[1].id == PARAM_INT)) { +- JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); +- if ((iparam[0].disp & 0xff) == iparam[0].disp) +- { +- JITC_MODRM(jitc, 0x01, addLike[i].digit_reg_int, iparam[0].reg); +- JITC_ADD_UCHAR(jitc, iparam[0].disp); +- } +- else +- { +- JITC_MODRM(jitc, 0x00, addLike[i].digit_reg_int, iparam[0].reg); +- JITC_ADD_UINT(jitc, iparam[0].disp); +- } +- JITC_ADD_UINT(jitc, iparam[1].i); +- return 1; +- } +- else if ((iparam[0].id == PARAM_DISP32) && (iparam[1].id == PARAM_INT)) { +- JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); +- JITC_MODRM(jitc, 0x00, addLike[i].digit_reg_int, 0x05); +- JITC_ADD_UINT(jitc, iparam[0].disp); +- JITC_ADD_UINT(jitc, iparam[1].i); +- return 1; +- } +- else { +- modrm(jitc, addLike[i].opcode, iparam); +- return 1; +- } +- } +- } +- return 0; +-} +- +-/** +- * Check all kind of known instruction... perform special optimisations.. +- */ +-static void jitc_add_op(JitcX86Env *jitc, char *op, IParam *iparam, int nbParams) +-{ +- /* MOV */ +- if (strcmp(op,"mov") == 0) +- { +- if ((iparam[0].id == PARAM_REG) && (iparam[1].id == PARAM_INT)) { +- INSTR_1bReg_IMM32(0xb8,0,1); +- } +- else if ((iparam[0].id == PARAM_DISP32) && (iparam[1].id == PARAM_INT)) { +- JITC_ADD_UCHAR(jitc, 0xc7); +- JITC_MODRM(jitc, 0x00, 0x00, 0x05); +- JITC_ADD_UINT(jitc, iparam[0].disp); +- JITC_ADD_UINT(jitc, iparam[1].i); +- } +- else +- modrm(jitc, 0x89, iparam); +- return; +- } +- +-#define IMUL_LIKE(_OP,_opcode,_digit)\ +- if (strcmp(op, _OP) == 0) { \ +- if (nbParams == 1) { \ +- imul_like_modrm_1param(jitc, _opcode, _digit, iparam); \ +- return; }} +- +-#define SHIFT_LIKE(_name,_op1,_op2,_digit) \ +- if (strcmp(op, _name) == 0) { \ +- if (iparam[1].id == PARAM_INT) { \ +- if (iparam[1].i == 1) \ +- imul_like_modrm_1param(jitc, _op1, _digit, iparam); \ +- else { \ +- imul_like_modrm_1param(jitc, _op2, _digit, iparam); \ +- JITC_ADD_UCHAR(jitc, iparam[1].i); \ +- } \ +- return; \ +- } \ +- } +- +-#define POP_LIKE(_OP,_opcode) \ +- if (strcmp(op, _OP) == 0) { \ +- if (iparam[0].id == PARAM_REG) { \ +- JITC_ADD_UCHAR(jitc, _opcode + iparam[0].reg); \ +- return; } } +- +- IMUL_LIKE("neg", 0xf7, 0x03); +- IMUL_LIKE("imul", 0xf7, 0x05); +- IMUL_LIKE("idiv", 0xf7, 0x07); +- +- POP_LIKE("pop", 0x58); +- POP_LIKE("push", 0x50); +- +- SHIFT_LIKE("sal", 0xd1, 0xc1, 0x04); +- SHIFT_LIKE("sar", 0xd1, 0xc1, 0x07); +- SHIFT_LIKE("shl", 0xd1, 0xc1, 0x04); +- SHIFT_LIKE("shr", 0xd1, 0xc1, 0x05); +- +- /* INC */ +- if (strcmp(op, "inc") == 0) { +- if (iparam[0].id == PARAM_REG) { +- JITC_ADD_UCHAR(jitc, 0x40 + iparam[0].reg); +- return; +- } +- imul_like_modrm_1param(jitc, 0xff, 0x00, iparam); +- return; +- } +- +- /* DEC */ +- if (strcmp(op, "dec") == 0) { +- if (iparam[0].id == PARAM_REG) { +- JITC_ADD_UCHAR(jitc, 0x48 + iparam[0].reg); +- return; +- } +- imul_like_modrm_1param(jitc, 0xff, 0x01, iparam); +- return; +- } +- +- if (strcmp(op, "call") == 0) +- { +- if (iparam[0].id == PARAM_LABEL) { +- jitc_add_used_label(jitc,iparam[0].label,jitc->used+1); +- JITC_CALL(jitc,0); +- return; +- } +- if (iparam[0].id == PARAM_INT) { +- JITC_CALL(jitc,iparam[0].i); +- return; +- } +- if (iparam[0].id == PARAM_dispREG) { +- JITC_ADD_UCHAR(jitc,0xff); +- JITC_ADD_UCHAR(jitc,0xd0+iparam[0].reg); +- return; +- } +- } +- +-#define MONOBYTE_INSTR(_OP,_opcode) \ +- if (strcmp(op, _OP) == 0) { \ +- JITC_ADD_UCHAR(jitc, _opcode); \ +- return; } +- +- MONOBYTE_INSTR("ret", 0xc3); +- MONOBYTE_INSTR("leave", 0xc9); +- MONOBYTE_INSTR("cdq", 0x99); +- +- /* JNE */ +- if (strcmp(op, "jne") == 0) { +- if (iparam[0].id == PARAM_LABEL) { +- JITC_JUMP_COND_LABEL(jitc,COND_NOT_EQUAL,iparam[0].label); +- return; +- } +- if (iparam[0].id == PARAM_INT) { +- JITC_JUMP_COND(jitc,COND_NOT_EQUAL,iparam[0].i); +- return; +- } +- } +- +- /* JE */ +- if (strcmp(op, "je") == 0) { +- if (iparam[0].id == PARAM_LABEL) { +- JITC_JUMP_COND_LABEL(jitc,COND_EQUAL,iparam[0].label); +- return; +- } +- if (iparam[0].id == PARAM_INT) { +- JITC_JUMP_COND(jitc,COND_EQUAL,iparam[0].i); +- return; +- } +- } +- +- /* ADD LIKE */ +- if (checkAddLike(jitc, op, iparam, nbParams)) return; +- +- /* BSWAP : 0F C8+rd */ +- +- fprintf(stderr, "JITC_x86: Invalid Operation '%s'\n", op); +- exit(1); +-} +- +-/** +- * Adds a new instruction to the just in time compiled function +- */ +-void jitc_add(JitcX86Env *jitc, const char *_instr, ...) +-{ +- char instr[256]; +- char *op; +- char *sparam[16]; int nbParam=0; int i; +- IParam iparam[16]; +- va_list ap; +- strcpy(instr,_instr); +- +-#ifdef DISPLAY_GENCODE +- printf("|"); +-#endif +- +- op = strtok(instr, " ,"); +- if (!op) return; +- +- /* decoupage en tokens */ +- while ((sparam[nbParam] = strtok(NULL, " ,")) != NULL) if (strlen(sparam[nbParam])>0) nbParam++; +- +- /* Reconnaissance des parametres */ +- va_start(ap, _instr); +- for (i=0;i<nbParam;++i) +- { +- int r; +- char regname[256]; +- iparam[i].id = PARAM_NONE; +- if (strcmp(sparam[i], "$d") == 0) { +- iparam[i].id = PARAM_INT; +- iparam[i].i = va_arg(ap, int); +- } +- else if (strcmp(sparam[i], "$f") == 0) { +- iparam[i].id = PARAM_FLOAT; +- iparam[i].f = va_arg(ap, double); +- } +- else if (strcmp(sparam[i], "[$d]") == 0) { +- iparam[i].id = PARAM_DISP32; +- iparam[i].disp = va_arg(ap, int); +- } +- else if (strcmp(sparam[i], "$s") == 0) { +- iparam[i].id = PARAM_LABEL; +- strcpy(iparam[i].label, va_arg(ap, char*)); +- } +- else +- for (r=0;RegsName[r].name;r++) { +- if (strcmp(sparam[i], RegsName[r].name) == 0) { +- iparam[i].id = PARAM_REG; +- iparam[i].reg = RegsName[r].reg; +- } +- else +- { +- if (sscanf(sparam[i], "$d[%3s]", regname) > 0) { +- if (strcmp(regname, RegsName[r].name) == 0) { +- iparam[i].id = PARAM_dispREG; +- iparam[i].reg = RegsName[r].reg; +- iparam[i].disp = va_arg(ap, int); +- } +- } +- if (sscanf(sparam[i], "[%3s]", regname) > 0) { +- if (strcmp(regname, RegsName[r].name) == 0) { +- iparam[i].id = PARAM_dispREG; +- iparam[i].reg = RegsName[r].reg; +- iparam[i].disp = 0; +- } +- } +- } +- } +- if (iparam[i].id == PARAM_NONE) { +- fprintf(stderr, "JITC_x86: Unrecognized parameter '%s'\n", sparam[i]); +- exit(1); +- } +- } +- va_end(ap); +- +- jitc_add_op(jitc, op, &(iparam[0]), nbParam); +-#ifdef DISPLAY_GENCODE +- printf(" ;;; %s", op); +- for (i=0;i<nbParam;++i) +- { +- if (iparam[i].id == PARAM_INT) +- printf(" 0x%x", iparam[i].i); +- else if (iparam[i].id == PARAM_DISP32) +- printf(" [0x%x]", iparam[i].disp); +- else if (iparam[i].id == PARAM_LABEL) +- printf(" %s", iparam[i].label); +- else +- printf(" %s", sparam[i]); +- } +- printf("\n"); +- +-#endif +-} +- +-JitcX86Env *jitc_x86_env_new(int memory_size) { +- +- JitcX86Env *jitc = (JitcX86Env*)malloc(sizeof(JitcX86Env)); +- jitc->_memory = (unsigned char*)malloc(memory_size); +- jitc->used = 0; +- jitc->memory = (unsigned char*)((int)jitc->_memory + (32-((int)jitc->_memory)%32)%32); +- +- jitc->nbUsedLabel = 0; +- jitc->nbKnownLabel = 0; +- +- jitc->usedLabel = (LabelAddr*)malloc(sizeof(LabelAddr) * JITC_MAXLABEL); +- jitc->knownLabel = (LabelAddr*)malloc(sizeof(LabelAddr) * JITC_MAXLABEL); +- +- return jitc; +-} +- +-void jitc_x86_delete(JitcX86Env *jitc) { +- +- free(jitc->usedLabel); +- free(jitc->knownLabel); +- free(jitc->_memory); +- free(jitc); +-} +- +-JitcFunc jitc_prepare_func(JitcX86Env *jitc) { +- +- JitcFunc ptr = 0; +- jitc->used = (32 - jitc->used%32)%32; +- ptr = (JitcFunc)&(jitc->memory[jitc->used]); +- +-#ifdef DISPLAY_GENCODE +- printf("\n------------------------------------------\n"); +- printf("-- Function Intro --\n"); +- printf("------------------------------------------\n"); +-#endif +- +- /* save the state */ +- jitc_add(jitc,"push ebp"); +- jitc_add(jitc,"mov ebp, esp"); +- jitc_add(jitc,"sub esp, $d", 8); +- JITC_PUSH_ALL(jitc); +-#ifdef DISPLAY_GENCODE +- printf("\n------------------------------------------\n"); +-#endif +- return ptr; +-} +- +-void jitc_validate_func(JitcX86Env *jitc) { +- +-#ifdef DISPLAY_GENCODE +- printf("\n------------------------------------------\n"); +- printf("-- Function Outro --\n"); +- printf("------------------------------------------\n"); +-#endif +- /* restore the state */ +- JITC_POP_ALL(jitc); +- jitc_add(jitc, "leave"); +- jitc_add(jitc, "ret"); +- jitc_resolve_labels(jitc); +-#ifdef DISPLAY_GENCODE +- printf("\n------------------------------------------\n"); +-#endif +-} +- +-void jitc_add_used_label(JitcX86Env *jitc, char *label, int where) { +- +- strncpy(jitc->usedLabel[jitc->nbUsedLabel].label, label, JITC_LABEL_SIZE); +- jitc->usedLabel[jitc->nbUsedLabel].address = where; +- jitc->nbUsedLabel++; +-} +- +-void jitc_add_known_label(JitcX86Env *jitc, char *label, int where) { +- +-#ifdef DISPLAY_GENCODE +- printf("%s:\n", label); +-#endif +- strncpy(jitc->knownLabel[jitc->nbKnownLabel].label, label, JITC_LABEL_SIZE); +- jitc->knownLabel[jitc->nbKnownLabel].address = where; +- jitc->nbKnownLabel++; +-} +- +-void jitc_resolve_labels(JitcX86Env *jitc) { +- +- int i,j; +- for (i=jitc->nbUsedLabel;i-->0;) { +- +- LabelAddr used = jitc->usedLabel[i]; +- for (j=jitc->nbKnownLabel;j-->0;) { +- +- LabelAddr known = jitc->knownLabel[j]; +- if (strcmp(known.label, used.label) == 0) { +- int *offset = (int*)&(jitc->memory[used.address]); +- *offset = known.address - used.address - 4; /* always using long offset */ +- break; +- } +- } +- } +- jitc->nbUsedLabel = jitc->nbKnownLabel = 0; +-} +diff -Naur /home/d4rk/goom2k4-0/src/jitc_x86.h /src/jitc_x86.h +--- /home/d4rk/goom2k4-0/src/jitc_x86.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/jitc_x86.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,214 +0,0 @@ +-/** +- * Copyright (c)2004 Jean-Christophe Hoelt <jeko@ios-software.com> +- */ +- +-#include <stdlib.h> +-#include <string.h> +- +-#define JITC_MAXLABEL 1024 +-#define JITC_LABEL_SIZE 64 +- +-/** +- * low level macros +- */ +- +- /* {{{ Registres Generaux */ +-#define EAX 0 +-#define ECX 1 +-#define EDX 2 +-#define EBX 3 +-#define ESP 4 +-#define EBP 5 +-#define ESI 6 +-#define EDI 7 +- /* }}} */ +- /* {{{ Registres MMX */ +-#define MM0 0 +-#define MM1 1 +-#define MM2 2 +-#define MM3 3 +-#define MM4 4 +-#define MM5 5 +-#define MM6 6 +-#define MM7 7 +- /* }}} */ +- /* {{{ Registres SSE*/ +-#define XMM0 0 +-#define XMM1 1 +-#define XMM2 2 +-#define XMM3 3 +-#define XMM4 4 +-#define XMM5 5 +-#define XMM6 6 +-#define XMM7 7 +- /* }}} */ +- /* {{{ Alias aux registres */ +-#define R0 0 +-#define R1 1 +-#define R2 2 +-#define R3 3 +-#define R4 4 +-#define R5 5 +-#define R6 6 +-#define R7 7 +- /* }}} */ +- +- /* {{{ Conditions */ +-#define COND_OVERFLOW 0 +-#define COND_NO_OVERFLOW 1 +-#define COND_BELOW 2 +-#define COND_NOT_BELOW 3 +-#define COND_EQUAL 4 +-#define COND_ZERO 4 +-#define COND_NOT_EQUAL 5 +-#define COND_NOT_ZERO 5 +-#define COND_NOT_ABOVE 6 +-#define COND_ABOVE 7 +-#define COND_SIGN 8 +-#define COND_NOT_SIGN 9 +-#define COND_EVEN 10 +-#define COND_ODD 11 +-#define COND_LESS_THAN 12 +-#define COND_GREATER_EQUAL 13 +-#define COND_LESS_EQUAL 14 +-#define COND_GREATER_THAN 15 +- /* }}} */ +- +-typedef int (*JitcFunc)(void); +- +-typedef struct _LABEL_ADDR { +- char label[JITC_LABEL_SIZE]; +- int address; +-} LabelAddr; +- +-typedef struct _JITC_X86_ENV { +- unsigned char *_memory; +- unsigned char *memory; +- unsigned int used; +- +- int nbUsedLabel; +- int nbKnownLabel; +- LabelAddr *usedLabel; +- LabelAddr *knownLabel; +-} JitcX86Env; +- +-#define DISPLAY_GENCODE +-/*#define DISPLAY_GENCODE_HEXA*/ +- +-#ifdef DISPLAY_GENCODE_HEXA +- #define JITC_ADD_UCHAR(jitc,op) printf(" 0x%02x", op) && (jitc->memory[jitc->used++]=op) +-#else +- #define JITC_ADD_UCHAR(jitc,op) (jitc->memory[jitc->used++]=op) +-#endif +- +-#define JITC_ADD_USHORT(jitc,i) { JITC_ADD_UCHAR(jitc,i&0xff); JITC_ADD_UCHAR(jitc,(i>>8)&0xff); } +-#define JITC_ADD_UINT(jitc,i) { \ +- JITC_ADD_UCHAR(jitc,i&0xff); \ +- JITC_ADD_UCHAR(jitc,(i>>8)&0xff); \ +- JITC_ADD_UCHAR(jitc,(i>>16)&0xff); \ +- JITC_ADD_UCHAR(jitc,(i>>24)&0xff); \ +-} +-#define JITC_ADD_2UCHAR(jitc,op1,op2) {JITC_ADD_UCHAR(jitc,op1); JITC_ADD_UCHAR(jitc,op2);} +- +-#define JITC_MODRM(jitc,mod,reg,rm) { JITC_ADD_UCHAR(jitc,((int)mod<<6)|((int)reg<<3)|((int)rm)); } +- +-/* special values for R/M */ +-#define JITC_RM_DISP32 0x05 +- +-#define JITC_MOD_pREG_REG 0x00 +-#define JITC_MOD_disp8REG_REG 0x01 +-#define JITC_MOD_disp32REG_REG 0x02 +-#define JITC_MOD_REG_REG 0x03 +-/* cf 24319101 p.27 */ +- +-#define JITC_OP_REG_REG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,0xc0+(src<<3)+dest); } +-#define JITC_OP_REG_pREG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,(dest<<3)+src); } +-#define JITC_OP_pREG_REG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,(src<<3)+dest); } +- +-/** +- * "high" level macro +- */ +- +-#define JITC_LOAD_REG_IMM32(jitc,reg,imm32) { JITC_ADD_UCHAR (jitc,0xb8+reg); JITC_ADD_UINT(jitc,(int)(imm32)); } +-#define JITC_LOAD_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x89,dest,src); } +- +-#define JITC_LOAD_REG_pREG(jitc,dest,src) { JITC_OP_REG_pREG(jitc,0x8b,dest,src); } +-#define JITC_LOAD_pREG_REG(jitc,dest,src) { JITC_OP_pREG_REG(jitc,0x89,dest,src); } +- +-#define JITC_DEC_REG(jitc,reg) { JITC_ADD_UCHAR (jitc,0x48+reg); } +-#define JITC_INC_REG(jitc,reg) { JITC_ADD_UCHAR (jitc,0x40+reg); } +- +-#define JITC_ADD_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x01,dest,src); } +-#define JITC_ADD_REG_IMM32(jitc,reg,imm32) { JITC_ADD_UCHAR (jitc,0x81);\ +- JITC_ADD_UCHAR (jitc,0xc0+reg);\ +- JITC_ADD_UINT (jitc,(int)imm32); } +- +-#define JITC_AND_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x21,dest,src); } +-#define JITC_CMP_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x39,dest,src); } +-#define JITC_CMP_REG_IMM32(jitc,reg,imm32) { JITC_ADD_2UCHAR (jitc,0x81,0xf8+reg); \ +- JITC_ADD_UINT (jitc,(int)imm32); } +- +-#define JITC_IDIV_EAX_REG(jitc,reg) { JITC_ADD_2UCHAR(jitc, 0xf7, 0xf8+reg); } +-#define JITC_IMUL_EAX_REG(jitc,reg) { JITC_ADD_2UCHAR(jitc, 0xf7, 0xe8+reg); } +- +-/*#define JITC_SUB_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x29,dest,src); } +-#define JITC_SUB_EAX_IMM32(jitc,imm32) { JITC_ADD_UCHAR (jitc,0x2d); JITC_ADD_UINT(jitc,(int)imm32); } +-#define JITC_SUB_REG_IMM32(jitc,reg,imm32) { JITC_ADD_2UCHAR (jitc,0x81, 0xe8+reg);\ +- JITC_ADD_UINT (jitc,(int)imm32); }*/ +-#define JITC_SUB_REG_IMM8(jitc,reg,imm8) { JITC_ADD_2UCHAR (jitc,0x83, 0xe8+reg);\ +- JITC_ADD_UCHAR(jitc,imm8); } +- +-/* Floating points */ +- +-#define JITC_FLD_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ +- JITC_MODRM (jitc, 0x00, 0x00,JITC_RM_DISP32); \ +- JITC_ADD_UINT(jitc,(int)(address)); } +-#define JITC_FLD_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xD9, 0xC0+reg); } +- +-#define JITC_FST_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ +- JITC_MODRM (jitc, 0x00, 0x02,JITC_RM_DISP32); \ +- JITC_ADD_UINT(jitc,(int)(ADDRess)); } +-#define JITC_FST_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xDD, 0xD0+reg); } +- +-#define JITC_FSTP_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ +- JITC_MODRM (jitc, 0x00, 0x03, JITC_RM_DISP32); \ +- JITC_ADD_UINT(jitc,(int)(address)); } +-#define JITC_FSTP_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xDD, 0xD8+reg); } +- +-#define JITC_FADD +- +-/* Jumps */ +- +-#define JITC_ADD_LABEL(jitc,label) { jitc_add_known_label(jitc,label,jitc->used); } +- +-#define JITC_JUMP(jitc,offset) { JITC_ADD_UCHAR(jitc,0xe9); JITC_ADD_UINT(jitc,offset); } +-#define JITC_JUMP_LABEL(jitc,label) { jitc_add_used_label(jitc,label,jitc->used+1); JITC_JUMP(jitc,0); } +-#define JITC_JUMP_COND(jitc,cond,offset) { JITC_ADD_UCHAR(jitc,0x0f);\ +- JITC_ADD_UCHAR(jitc,0x80+cond);\ +- JITC_ADD_UINT(jitc,offset); } +-#define JITC_JUMP_COND_LABEL(jitc,cond,label) { jitc_add_used_label(jitc,label,jitc->used+2); JITC_JUMP_COND(jitc,cond,0); } +-#define JITC_CALL(jitc,function) { int __offset__ = (int)function - (int)(&jitc->memory[jitc->used+5]);\ +- JITC_ADD_UCHAR(jitc,0xe8); JITC_ADD_UINT(jitc,__offset__); } +-/*#define JITC_CALL_pREG(jitc,reg) { JITC_ADD_UCHAR(jitc,0xff); JITC_ADD_UCHAR(jitc,0xd0+reg); } +-#define JITC_CALL_LABEL(jitc,label) { jitc_add_used_label(jitc,label,jitc->used+1); JITC_CALL(jitc,0); }*/ +- +-/* save all registers (except EAX,ESP,EBP) */ +-#define JITC_PUSH_ALL(jitc) { jitc_add(jitc,"push ecx"); jitc_add(jitc,"push edx"); jitc_add(jitc,"push ebx"); \ +- jitc_add(jitc,"push esi"); jitc_add(jitc,"push edi"); } +- +-/* restore all registers (except EAX,ESP,EBP) */ +-#define JITC_POP_ALL(jitc) { jitc_add(jitc,"pop edi"); jitc_add(jitc,"pop esi"); jitc_add(jitc,"pop ebx"); \ +- jitc_add(jitc,"pop edx"); jitc_add(jitc,"pop ecx"); } +- +-/* public methods */ +-JitcX86Env *jitc_x86_env_new(int memory_size); +-JitcFunc jitc_prepare_func(JitcX86Env *jitc); +-void jitc_add(JitcX86Env *jitc, const char *instr, ...); +-void jitc_validate_func(JitcX86Env *jitc); +-void jitc_x86_delete(JitcX86Env *jitc); +- +- +-/* private methods */ +-void jitc_add_used_label(JitcX86Env *jitc, char *label, int where); +-void jitc_add_known_label(JitcX86Env *jitc, char *label, int where); +-void jitc_resolve_labels(JitcX86Env *jitc); +diff -Naur /home/d4rk/goom2k4-0/src/lines.c /src/lines.c +--- /home/d4rk/goom2k4-0/src/lines.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/lines.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,238 +0,0 @@ +-/* +- * lines.c +- */ +- +-#include "lines.h" +-#include <math.h> +-#include <stdlib.h> +-#include <stdio.h> +-#include "goom_tools.h" +-#include "drawmethods.h" +-#include "goom_plugin_info.h" +- +-static inline unsigned char lighten (unsigned char value, float power) +-{ +- int val = value; +- float t = (float) val * log10(power) / 2.0; +- +- if (t > 0) { +- val = (int) t; /* (32.0f * log (t)); */ +- if (val > 255) +- val = 255; +- if (val < 0) +- val = 0; +- return val; +- } +- else { +- return 0; +- } +-} +- +-static void lightencolor (guint32 *col, float power) +-{ +- unsigned char *color; +- +- color = (unsigned char *) col; +- *color = lighten (*color, power); +- color++; +- *color = lighten (*color, power); +- color++; +- *color = lighten (*color, power); +- color++; +- *color = lighten (*color, power); +-} +- +- +- +-static void +-genline (int id, float param, GMUnitPointer * l, int rx, int ry) +-{ +- int i; +- +- switch (id) { +- case GML_HLINE: +- for (i = 0; i < 512; i++) { +- l[i].x = ((float) i * rx) / 512.0f; +- l[i].y = param; +- l[i].angle = M_PI / 2.0f; +- } +- return; +- case GML_VLINE: +- for (i = 0; i < 512; i++) { +- l[i].y = ((float) i * ry) / 512.0f; +- l[i].x = param; +- l[i].angle = 0.0f; +- } +- return; +- case GML_CIRCLE: +- for (i = 0; i < 512; i++) { +- float cosa, sina; +- +- l[i].angle = 2.0f * M_PI * (float) i / 512.0f; +- cosa = param * cos (l[i].angle); +- sina = param * sin (l[i].angle); +- l[i].x = ((float) rx / 2.0f) + cosa; +- l[i].y = (float) ry / 2.0f + sina; +- } +- return; +- } +-} +- +-static guint32 getcouleur (int mode) +-{ +- switch (mode) { +- case GML_RED: +- return (230 << (ROUGE * 8)) | (120 << (VERT * 8)) | (18 << (BLEU * 8)); +- case GML_ORANGE_J: +- return (120 << (VERT * 8)) | (252 << (ROUGE * 8)) | (18 << (BLEU * 8)); +- case GML_ORANGE_V: +- return (160 << (VERT * 8)) | (236 << (ROUGE * 8)) | (40 << (BLEU * 8)); +- case GML_BLEUBLANC: +- return (40 << (BLEU * 8)) | (220 << (ROUGE * 8)) | (140 << (VERT * 8)); +- case GML_VERT: +- return (200 << (VERT * 8)) | (80 << (ROUGE * 8)) | (18 << (BLEU * 8)); +- case GML_BLEU: +- return (250 << (BLEU * 8)) | (30 << (VERT * 8)) | (80 << (ROUGE * 8)); +- case GML_BLACK: +- return (16 << (BLEU * 8)) | (16 << (VERT * 8)) | (16 << (ROUGE * 8)); +- } +- return 0; +-} +- +-void +-goom_lines_set_res (GMLine * gml, int rx, int ry) +-{ +- if (gml != NULL) { +- gml->screenX = rx; +- gml->screenY = ry; +- +- genline (gml->IDdest, gml->param, gml->points2, rx, ry); +- } +-} +- +- +-static void +-goom_lines_move (GMLine * l) +-{ +- int i; +- unsigned char *c1, *c2; +- +- for (i = 0; i < 512; i++) { +- l->points[i].x = (l->points2[i].x + 39.0f * l->points[i].x) / 40.0f; +- l->points[i].y = (l->points2[i].y + 39.0f * l->points[i].y) / 40.0f; +- l->points[i].angle = +- (l->points2[i].angle + 39.0f * l->points[i].angle) / 40.0f; +- } +- +- c1 = (unsigned char *) &l->color; +- c2 = (unsigned char *) &l->color2; +- for (i = 0; i < 4; i++) { +- int cc1, cc2; +- +- cc1 = *c1; +- cc2 = *c2; +- *c1 = (unsigned char) ((cc1 * 63 + cc2) >> 6); +- ++c1; +- ++c2; +- } +- +- l->power += l->powinc; +- if (l->power < 1.1f) { +- l->power = 1.1f; +- l->powinc = (float) (goom_irand(l->goomInfo->gRandom,20) + 10) / 300.0f; +- } +- if (l->power > 17.5f) { +- l->power = 17.5f; +- l->powinc = -(float) (goom_irand(l->goomInfo->gRandom,20) + 10) / 300.0f; +- } +- +- l->amplitude = (99.0f * l->amplitude + l->amplitudeF) / 100.0f; +-} +- +-void +-goom_lines_switch_to (GMLine * gml, int IDdest, +- float param, float amplitude, int col) +-{ +- genline (IDdest, param, gml->points2, gml->screenX, gml->screenY); +- gml->IDdest = IDdest; +- gml->param = param; +- gml->amplitudeF = amplitude; +- gml->color2 = getcouleur (col); +-} +- +-GMLine * +-goom_lines_init (PluginInfo *goomInfo, int rx, int ry, +- int IDsrc, float paramS, int coulS, +- int IDdest, float paramD, int coulD) +-{ +- GMLine *l = (GMLine *) malloc (sizeof (GMLine)); +- +- l->goomInfo = goomInfo; +- +- l->points = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer)); +- l->points2 = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer)); +- l->nbPoints = 512; +- +- l->IDdest = IDdest; +- l->param = paramD; +- +- l->amplitude = l->amplitudeF = 1.0f; +- +- genline (IDsrc, paramS, l->points, rx, ry); +- genline (IDdest, paramD, l->points2, rx, ry); +- +- l->color = getcouleur (coulS); +- l->color2 = getcouleur (coulD); +- +- l->screenX = rx; +- l->screenY = ry; +- +- l->power = 0.0f; +- l->powinc = 0.01f; +- +- goom_lines_switch_to (l, IDdest, paramD, 1.0f, coulD); +- +- return l; +-} +- +-void +-goom_lines_free (GMLine ** l) +-{ +- free ((*l)->points); +- free (*l); +- l = NULL; +-} +- +-void goom_lines_draw (PluginInfo *plug, GMLine * line, gint16 data[512], Pixel *p) +-{ +- if (line != NULL) { +- int i, x1, y1; +- guint32 color = line->color; +- GMUnitPointer *pt = &(line->points[0]); +- +- float cosa = cos (pt->angle) / 1000.0f; +- float sina = sin (pt->angle) / 1000.0f; +- +- lightencolor (&color, line->power); +- +- x1 = (int) (pt->x + cosa * line->amplitude * data[0]); +- y1 = (int) (pt->y + sina * line->amplitude * data[0]); +- +- for (i = 1; i < 512; i++) { +- int x2, y2; +- GMUnitPointer *pt = &(line->points[i]); +- +- float cosa = cos (pt->angle) / 1000.0f; +- float sina = sin (pt->angle) / 1000.0f; +- +- x2 = (int) (pt->x + cosa * line->amplitude * data[i]); +- y2 = (int) (pt->y + sina * line->amplitude * data[i]); +- +- plug->methods.draw_line (p, x1, y1, x2, y2, color, line->screenX, line->screenY); +- +- x1 = x2; +- y1 = y2; +- } +- goom_lines_move (line); +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/lines.h /src/lines.h +--- /home/d4rk/goom2k4-0/src/lines.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/lines.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,81 +0,0 @@ +-#ifndef _LINES_H +-#define _LINES_H +- +-/* +- * lines.h +- * Goom +- * Copyright (c) 2000-2003 iOS-software. All rights reserved. +- */ +- +-#include "goom_typedefs.h" +-#include "goom_graphic.h" +-#include "goom_config.h" +- +-struct _GMUNITPOINTER +-{ +- float x; +- float y; +- float angle; +-}; +- +-/* tableau de points */ +-struct _GMLINE +-{ +- +- GMUnitPointer *points; +- GMUnitPointer *points2; +- int IDdest; +- float param; +- float amplitudeF; +- float amplitude; +- +- int nbPoints; +- guint32 color; /* pour l'instant je stocke la couleur a terme, on stockera le mode couleur et l'on animera */ +- guint32 color2; +- +- int screenX; +- int screenY; +- +- float power; +- float powinc; +- +- PluginInfo *goomInfo; +-}; +- +-/* les ID possibles */ +- +-#define GML_CIRCLE 0 +-/* (param = radius) */ +- +-#define GML_HLINE 1 +-/* (param = y) */ +- +-#define GML_VLINE 2 +-/* (param = x) */ +- +-/* les modes couleur possible (si tu mets un autre c'est noir) */ +- +-#define GML_BLEUBLANC 0 +-#define GML_RED 1 +-#define GML_ORANGE_V 2 +-#define GML_ORANGE_J 3 +-#define GML_VERT 4 +-#define GML_BLEU 5 +-#define GML_BLACK 6 +- +-/* construit un effet de line (une ligne horitontale pour commencer) */ +-GMLine *goom_lines_init (PluginInfo *goomInfo, int rx, int ry, +- int IDsrc, float paramS, int modeCoulSrc, +- int IDdest, float paramD, int modeCoulDest); +- +-void goom_lines_switch_to (GMLine * gml, int IDdest, float param, +- float amplitude, +- int modeCoul); +- +-void goom_lines_set_res (GMLine * gml, int rx, int ry); +- +-void goom_lines_free (GMLine ** gml); +- +-void goom_lines_draw (PluginInfo *plugInfo, GMLine * gml, gint16 data[512], Pixel *p); +- +-#endif /* _LINES_H */ +diff -Naur /home/d4rk/goom2k4-0/src/Makefile.am /src/Makefile.am +--- /home/d4rk/goom2k4-0/src/Makefile.am 2005-02-07 06:46:41.000000000 -0700 ++++ /src/Makefile.am 1969-12-31 17:00:00.000000000 -0700 +@@ -1,34 +0,0 @@ +-# libgoom2 +- +-if HAVE_MMX +-MMX_FILES=mmx.c xmmx.c +-else +-MMX_FILES= +-endif +- +-if HAVE_PPC +-PPC_FILES=ppc_zoom_ultimate.s ppc_drawings.s +-else +-PPC_FILES= +-endif +- +-goom2_lib_LTLIBRARIES = libgoom2.la +-goom2_libdir = $(libdir) +- +-goom2_library_includedir=$(includedir)/goom +-goom2_library_include_HEADERS = goom.h goom_plugin_info.h goom_typedefs.h goom_graphic.h goom_config_param.h goom_visual_fx.h goom_filters.h goom_tools.h goomsl.h goomsl_hash.h goomsl_heap.h goom_tools.h goom_config.h +-libgoom2_la_LDFLAGS = -export-dynamic -export-symbols-regex "goom.*" +-libgoom2_la_SOURCES = \ +- goomsl_yacc.y goomsl_lex.l goomsl.c goomsl_hash.c goomsl_heap.c \ +- goom_tools.c $(MMX_FILES) $(PPC_FILES) \ +- config_param.c convolve_fx.c filters.c \ +- flying_stars_fx.c gfontlib.c gfontrle.c \ +- goom_core.c graphic.c ifs.c lines.c \ +- mathtools.c sound_tester.c surf3d.c \ +- tentacle3d.c plugin_info.c \ +- v3d.c drawmethods.c \ +- cpu_info.c +- +-AM_YFLAGS=-d +- +-noinst_HEADERS = mmx.h +diff -Naur /home/d4rk/goom2k4-0/src/Makefile.in /src/Makefile.in +--- /home/d4rk/goom2k4-0/src/Makefile.in 2005-02-07 06:49:26.000000000 -0700 ++++ /src/Makefile.in 1969-12-31 17:00:00.000000000 -0700 +@@ -1,621 +0,0 @@ +-# Makefile.in generated by automake 1.9.4 from Makefile.am. +-# @configure_input@ +- +-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. +-# This Makefile.in is free software; the Free Software Foundation +-# gives unlimited permission to copy and/or distribute it, +-# with or without modifications, as long as this notice is preserved. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +-# PARTICULAR PURPOSE. +- +-@SET_MAKE@ +- +-# libgoom2 +- +- +-SOURCES = $(libgoom2_la_SOURCES) +- +-srcdir = @srcdir@ +-top_srcdir = @top_srcdir@ +-VPATH = @srcdir@ +-pkgdatadir = $(datadir)/@PACKAGE@ +-pkglibdir = $(libdir)/@PACKAGE@ +-pkgincludedir = $(includedir)/@PACKAGE@ +-top_builddir = .. +-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +-INSTALL = @INSTALL@ +-install_sh_DATA = $(install_sh) -c -m 644 +-install_sh_PROGRAM = $(install_sh) -c +-install_sh_SCRIPT = $(install_sh) -c +-INSTALL_HEADER = $(INSTALL_DATA) +-transform = $(program_transform_name) +-NORMAL_INSTALL = : +-PRE_INSTALL = : +-POST_INSTALL = : +-NORMAL_UNINSTALL = : +-PRE_UNINSTALL = : +-POST_UNINSTALL = : +-build_triplet = @build@ +-host_triplet = @host@ +-subdir = src +-DIST_COMMON = $(goom2_library_include_HEADERS) $(noinst_HEADERS) \ +- $(srcdir)/Makefile.am $(srcdir)/Makefile.in TODO goomsl_lex.c \ +- goomsl_yacc.c goomsl_yacc.h +-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +-am__aclocal_m4_deps = $(top_srcdir)/m4/sdl.m4 $(top_srcdir)/m4/xmms.m4 \ +- $(top_srcdir)/configure.in +-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ +- $(ACLOCAL_M4) +-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +-CONFIG_CLEAN_FILES = +-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +-am__vpath_adj = case $$p in \ +- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ +- *) f=$$p;; \ +- esac; +-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +-am__installdirs = "$(DESTDIR)$(goom2_libdir)" \ +- "$(DESTDIR)$(goom2_library_includedir)" +-goom2_libLTLIBRARIES_INSTALL = $(INSTALL) +-LTLIBRARIES = $(goom2_lib_LTLIBRARIES) +-libgoom2_la_LIBADD = +-am__libgoom2_la_SOURCES_DIST = goomsl_yacc.y goomsl_lex.l goomsl.c \ +- goomsl_hash.c goomsl_heap.c goom_tools.c mmx.c xmmx.c \ +- ppc_zoom_ultimate.s ppc_drawings.s config_param.c \ +- convolve_fx.c filters.c flying_stars_fx.c gfontlib.c \ +- gfontrle.c goom_core.c graphic.c ifs.c lines.c mathtools.c \ +- sound_tester.c surf3d.c tentacle3d.c plugin_info.c v3d.c \ +- drawmethods.c cpu_info.c +-@HAVE_MMX_TRUE@am__objects_1 = mmx.lo xmmx.lo +-@HAVE_PPC_TRUE@am__objects_2 = ppc_zoom_ultimate.lo ppc_drawings.lo +-am_libgoom2_la_OBJECTS = goomsl_yacc.lo goomsl_lex.lo goomsl.lo \ +- goomsl_hash.lo goomsl_heap.lo goom_tools.lo $(am__objects_1) \ +- $(am__objects_2) config_param.lo convolve_fx.lo filters.lo \ +- flying_stars_fx.lo gfontlib.lo gfontrle.lo goom_core.lo \ +- graphic.lo ifs.lo lines.lo mathtools.lo sound_tester.lo \ +- surf3d.lo tentacle3d.lo plugin_info.lo v3d.lo drawmethods.lo \ +- cpu_info.lo +-libgoom2_la_OBJECTS = $(am_libgoom2_la_OBJECTS) +-DEFAULT_INCLUDES = -I. -I$(srcdir) +-depcomp = $(SHELL) $(top_srcdir)/depcomp +-am__depfiles_maybe = depfiles +-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ +- $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ +- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ +- $(AM_CFLAGS) $(CFLAGS) +-CCLD = $(CC) +-LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ +- $(AM_LDFLAGS) $(LDFLAGS) -o $@ +-LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) +-LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +-CCASCOMPILE = $(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS) +-LTCCASCOMPILE = $(LIBTOOL) --mode=compile $(CCAS) $(AM_CCASFLAGS) \ +- $(CCASFLAGS) +-YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) +-LTYACCCOMPILE = $(LIBTOOL) --mode=compile $(YACC) $(YFLAGS) \ +- $(AM_YFLAGS) +-SOURCES = $(libgoom2_la_SOURCES) +-DIST_SOURCES = $(am__libgoom2_la_SOURCES_DIST) +-goom2_library_includeHEADERS_INSTALL = $(INSTALL_HEADER) +-HEADERS = $(goom2_library_include_HEADERS) $(noinst_HEADERS) +-ETAGS = etags +-CTAGS = ctags +-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +-ACLOCAL = @ACLOCAL@ +-AMDEP_FALSE = @AMDEP_FALSE@ +-AMDEP_TRUE = @AMDEP_TRUE@ +-AMTAR = @AMTAR@ +-AR = @AR@ +-AUTOCONF = @AUTOCONF@ +-AUTOHEADER = @AUTOHEADER@ +-AUTOMAKE = @AUTOMAKE@ +-AWK = @AWK@ +-CC = @CC@ +-CCAS = @CCAS@ +-CCASFLAGS = @CCASFLAGS@ +-CCDEPMODE = @CCDEPMODE@ +-CFLAGS = @CFLAGS@ +-CPP = @CPP@ +-CPPFLAGS = @CPPFLAGS@ +-CXX = @CXX@ +-CXXCPP = @CXXCPP@ +-CXXDEPMODE = @CXXDEPMODE@ +-CXXFLAGS = @CXXFLAGS@ +-CYGPATH_W = @CYGPATH_W@ +-DEFS = @DEFS@ +-DEPDIR = @DEPDIR@ +-ECHO = @ECHO@ +-ECHO_C = @ECHO_C@ +-ECHO_N = @ECHO_N@ +-ECHO_T = @ECHO_T@ +-EGREP = @EGREP@ +-EXEEXT = @EXEEXT@ +-F77 = @F77@ +-FFLAGS = @FFLAGS@ +-HAVE_MMX_FALSE = @HAVE_MMX_FALSE@ +-HAVE_MMX_TRUE = @HAVE_MMX_TRUE@ +-HAVE_PPC_FALSE = @HAVE_PPC_FALSE@ +-HAVE_PPC_TRUE = @HAVE_PPC_TRUE@ +-HAVE_SDL_FALSE = @HAVE_SDL_FALSE@ +-HAVE_SDL_TRUE = @HAVE_SDL_TRUE@ +-HAVE_XMMS_FALSE = @HAVE_XMMS_FALSE@ +-HAVE_XMMS_TRUE = @HAVE_XMMS_TRUE@ +-INSTALL_DATA = @INSTALL_DATA@ +-INSTALL_PROGRAM = @INSTALL_PROGRAM@ +-INSTALL_SCRIPT = @INSTALL_SCRIPT@ +-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +-LDFLAGS = @LDFLAGS@ +-LEX = @LEX@ +-LEXLIB = @LEXLIB@ +-LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +-LIBOBJS = @LIBOBJS@ +-LIBS = @LIBS@ +-LIBTOOL = @LIBTOOL@ +-LN_S = @LN_S@ +-LTLIBOBJS = @LTLIBOBJS@ +-MACFOLDER = @MACFOLDER@ +-MACTARGET_FALSE = @MACTARGET_FALSE@ +-MACTARGET_TRUE = @MACTARGET_TRUE@ +-MAKEINFO = @MAKEINFO@ +-OBJEXT = @OBJEXT@ +-PACKAGE = @PACKAGE@ +-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +-PACKAGE_NAME = @PACKAGE_NAME@ +-PACKAGE_STRING = @PACKAGE_STRING@ +-PACKAGE_TARNAME = @PACKAGE_TARNAME@ +-PACKAGE_VERSION = @PACKAGE_VERSION@ +-PATH_SEPARATOR = @PATH_SEPARATOR@ +-PTHREAD_LIBS = @PTHREAD_LIBS@ +-RANLIB = @RANLIB@ +-SDL_CFLAGS = @SDL_CFLAGS@ +-SDL_CONFIG = @SDL_CONFIG@ +-SDL_LIBS = @SDL_LIBS@ +-SET_MAKE = @SET_MAKE@ +-SHELL = @SHELL@ +-STRIP = @STRIP@ +-VERSION = @VERSION@ +-XMMS_CFLAGS = @XMMS_CFLAGS@ +-XMMS_CONFIG = @XMMS_CONFIG@ +-XMMS_DATA_DIR = @XMMS_DATA_DIR@ +-XMMS_EFFECT_PLUGIN_DIR = @XMMS_EFFECT_PLUGIN_DIR@ +-XMMS_GENERAL_PLUGIN_DIR = @XMMS_GENERAL_PLUGIN_DIR@ +-XMMS_INPUT_PLUGIN_DIR = @XMMS_INPUT_PLUGIN_DIR@ +-XMMS_LIBS = @XMMS_LIBS@ +-XMMS_OUTPUT_PLUGIN_DIR = @XMMS_OUTPUT_PLUGIN_DIR@ +-XMMS_PLUGIN_DIR = @XMMS_PLUGIN_DIR@ +-XMMS_VERSION = @XMMS_VERSION@ +-XMMS_VISUALIZATION_PLUGIN_DIR = @XMMS_VISUALIZATION_PLUGIN_DIR@ +-YACC = @YACC@ +-ac_ct_AR = @ac_ct_AR@ +-ac_ct_CC = @ac_ct_CC@ +-ac_ct_CXX = @ac_ct_CXX@ +-ac_ct_F77 = @ac_ct_F77@ +-ac_ct_RANLIB = @ac_ct_RANLIB@ +-ac_ct_STRIP = @ac_ct_STRIP@ +-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +-am__include = @am__include@ +-am__leading_dot = @am__leading_dot@ +-am__quote = @am__quote@ +-am__tar = @am__tar@ +-am__untar = @am__untar@ +-bindir = @bindir@ +-build = @build@ +-build_alias = @build_alias@ +-build_cpu = @build_cpu@ +-build_os = @build_os@ +-build_vendor = @build_vendor@ +-datadir = @datadir@ +-exec_prefix = @exec_prefix@ +-host = @host@ +-host_alias = @host_alias@ +-host_cpu = @host_cpu@ +-host_os = @host_os@ +-host_vendor = @host_vendor@ +-includedir = @includedir@ +-infodir = @infodir@ +-install_sh = @install_sh@ +-libdir = @libdir@ +-libexecdir = @libexecdir@ +-localstatedir = @localstatedir@ +-mandir = @mandir@ +-mkdir_p = @mkdir_p@ +-oldincludedir = @oldincludedir@ +-prefix = @prefix@ +-program_transform_name = @program_transform_name@ +-sbindir = @sbindir@ +-sharedstatedir = @sharedstatedir@ +-sysconfdir = @sysconfdir@ +-target_alias = @target_alias@ +-@HAVE_MMX_FALSE@MMX_FILES = +-@HAVE_MMX_TRUE@MMX_FILES = mmx.c xmmx.c +-@HAVE_PPC_FALSE@PPC_FILES = +-@HAVE_PPC_TRUE@PPC_FILES = ppc_zoom_ultimate.s ppc_drawings.s +-goom2_lib_LTLIBRARIES = libgoom2.la +-goom2_libdir = $(libdir) +-goom2_library_includedir = $(includedir)/goom +-goom2_library_include_HEADERS = goom.h goom_plugin_info.h goom_typedefs.h goom_graphic.h goom_config_param.h goom_visual_fx.h goom_filters.h goom_tools.h goomsl.h goomsl_hash.h goomsl_heap.h goom_tools.h goom_config.h +-libgoom2_la_LDFLAGS = -export-dynamic -export-symbols-regex "goom.*" +-libgoom2_la_SOURCES = \ +- goomsl_yacc.y goomsl_lex.l goomsl.c goomsl_hash.c goomsl_heap.c \ +- goom_tools.c $(MMX_FILES) $(PPC_FILES) \ +- config_param.c convolve_fx.c filters.c \ +- flying_stars_fx.c gfontlib.c gfontrle.c \ +- goom_core.c graphic.c ifs.c lines.c \ +- mathtools.c sound_tester.c surf3d.c \ +- tentacle3d.c plugin_info.c \ +- v3d.c drawmethods.c \ +- cpu_info.c +- +-AM_YFLAGS = -d +-noinst_HEADERS = mmx.h +-all: all-am +- +-.SUFFIXES: +-.SUFFIXES: .c .l .lo .o .obj .s .y +-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) +- @for dep in $?; do \ +- case '$(am__configure_deps)' in \ +- *$$dep*) \ +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ +- && exit 0; \ +- exit 1;; \ +- esac; \ +- done; \ +- echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ +- cd $(top_srcdir) && \ +- $(AUTOMAKE) --foreign src/Makefile +-.PRECIOUS: Makefile +-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status +- @case '$?' in \ +- *config.status*) \ +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ +- *) \ +- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ +- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ +- esac; +- +-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +- +-$(top_srcdir)/configure: $(am__configure_deps) +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +-$(ACLOCAL_M4): $(am__aclocal_m4_deps) +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +-install-goom2_libLTLIBRARIES: $(goom2_lib_LTLIBRARIES) +- @$(NORMAL_INSTALL) +- test -z "$(goom2_libdir)" || $(mkdir_p) "$(DESTDIR)$(goom2_libdir)" +- @list='$(goom2_lib_LTLIBRARIES)'; for p in $$list; do \ +- if test -f $$p; then \ +- f=$(am__strip_dir) \ +- echo " $(LIBTOOL) --mode=install $(goom2_libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(goom2_libdir)/$$f'"; \ +- $(LIBTOOL) --mode=install $(goom2_libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(goom2_libdir)/$$f"; \ +- else :; fi; \ +- done +- +-uninstall-goom2_libLTLIBRARIES: +- @$(NORMAL_UNINSTALL) +- @set -x; list='$(goom2_lib_LTLIBRARIES)'; for p in $$list; do \ +- p=$(am__strip_dir) \ +- echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(goom2_libdir)/$$p'"; \ +- $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(goom2_libdir)/$$p"; \ +- done +- +-clean-goom2_libLTLIBRARIES: +- -test -z "$(goom2_lib_LTLIBRARIES)" || rm -f $(goom2_lib_LTLIBRARIES) +- @list='$(goom2_lib_LTLIBRARIES)'; for p in $$list; do \ +- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ +- test "$$dir" != "$$p" || dir=.; \ +- echo "rm -f \"$${dir}/so_locations\""; \ +- rm -f "$${dir}/so_locations"; \ +- done +-goomsl_yacc.h: goomsl_yacc.c +- @if test ! -f $@; then \ +- rm -f goomsl_yacc.c; \ +- $(MAKE) goomsl_yacc.c; \ +- else :; fi +-libgoom2.la: $(libgoom2_la_OBJECTS) $(libgoom2_la_DEPENDENCIES) +- $(LINK) -rpath $(goom2_libdir) $(libgoom2_la_LDFLAGS) $(libgoom2_la_OBJECTS) $(libgoom2_la_LIBADD) $(LIBS) +- +-mostlyclean-compile: +- -rm -f *.$(OBJEXT) +- +-distclean-compile: +- -rm -f *.tab.c +- +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/config_param.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convolve_fx.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu_info.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drawmethods.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filters.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flying_stars_fx.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfontlib.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfontrle.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goom_core.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goom_tools.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl_hash.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl_heap.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl_lex.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goomsl_yacc.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphic.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ifs.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lines.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathtools.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmx.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin_info.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sound_tester.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/surf3d.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tentacle3d.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v3d.Plo@am__quote@ +-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmmx.Plo@am__quote@ +- +-.c.o: +-@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +-@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +-@am__fastdepCC_FALSE@ $(COMPILE) -c $< +- +-.c.obj: +-@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +-@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +-@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +- +-.c.lo: +-@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +-@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +-@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +- +-.l.c: +- $(LEXCOMPILE) $< +- sed '/^#/ s|$(LEX_OUTPUT_ROOT)\.c|$@|' $(LEX_OUTPUT_ROOT).c >$@ +- rm -f $(LEX_OUTPUT_ROOT).c +- +-.s.o: +- $(CCASCOMPILE) -c $< +- +-.s.obj: +- $(CCASCOMPILE) -c `$(CYGPATH_W) '$<'` +- +-.s.lo: +- $(LTCCASCOMPILE) -c -o $@ $< +- +-.y.c: +- $(YACCCOMPILE) $< +- if test -f y.tab.h; then \ +- to=`echo "$*_H" | sed \ +- -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ +- -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`; \ +- sed -e "/^#/!b" -e "s/Y_TAB_H/$$to/g" -e "s|y\.tab\.h|$*.h|" \ +- y.tab.h >$*.ht; \ +- rm -f y.tab.h; \ +- if cmp -s $*.ht $*.h; then \ +- rm -f $*.ht ;\ +- else \ +- mv $*.ht $*.h; \ +- fi; \ +- fi +- if test -f y.output; then \ +- mv y.output $*.output; \ +- fi +- sed '/^#/ s|y\.tab\.c|$@|' y.tab.c >$@t && mv $@t $@ +- rm -f y.tab.c +- +-mostlyclean-libtool: +- -rm -f *.lo +- +-clean-libtool: +- -rm -rf .libs _libs +- +-distclean-libtool: +- -rm -f libtool +-uninstall-info-am: +-install-goom2_library_includeHEADERS: $(goom2_library_include_HEADERS) +- @$(NORMAL_INSTALL) +- test -z "$(goom2_library_includedir)" || $(mkdir_p) "$(DESTDIR)$(goom2_library_includedir)" +- @list='$(goom2_library_include_HEADERS)'; for p in $$list; do \ +- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ +- f=$(am__strip_dir) \ +- echo " $(goom2_library_includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(goom2_library_includedir)/$$f'"; \ +- $(goom2_library_includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(goom2_library_includedir)/$$f"; \ +- done +- +-uninstall-goom2_library_includeHEADERS: +- @$(NORMAL_UNINSTALL) +- @list='$(goom2_library_include_HEADERS)'; for p in $$list; do \ +- f=$(am__strip_dir) \ +- echo " rm -f '$(DESTDIR)$(goom2_library_includedir)/$$f'"; \ +- rm -f "$(DESTDIR)$(goom2_library_includedir)/$$f"; \ +- done +- +-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) ' { files[$$0] = 1; } \ +- END { for (i in files) print i; }'`; \ +- mkid -fID $$unique +-tags: TAGS +- +-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ +- $(TAGS_FILES) $(LISP) +- tags=; \ +- here=`pwd`; \ +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) ' { files[$$0] = 1; } \ +- END { for (i in files) print i; }'`; \ +- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ +- test -n "$$unique" || unique=$$empty_fix; \ +- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ +- $$tags $$unique; \ +- fi +-ctags: CTAGS +-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ +- $(TAGS_FILES) $(LISP) +- tags=; \ +- here=`pwd`; \ +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) ' { files[$$0] = 1; } \ +- END { for (i in files) print i; }'`; \ +- test -z "$(CTAGS_ARGS)$$tags$$unique" \ +- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ +- $$tags $$unique +- +-GTAGS: +- here=`$(am__cd) $(top_builddir) && pwd` \ +- && cd $(top_srcdir) \ +- && gtags -i $(GTAGS_ARGS) $$here +- +-distclean-tags: +- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +- +-distdir: $(DISTFILES) +- @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ +- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ +- list='$(DISTFILES)'; for file in $$list; do \ +- case $$file in \ +- $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ +- $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ +- esac; \ +- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ +- dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ +- if test "$$dir" != "$$file" && test "$$dir" != "."; then \ +- dir="/$$dir"; \ +- $(mkdir_p) "$(distdir)$$dir"; \ +- else \ +- dir=''; \ +- fi; \ +- if test -d $$d/$$file; then \ +- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ +- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ +- fi; \ +- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ +- else \ +- test -f $(distdir)/$$file \ +- || cp -p $$d/$$file $(distdir)/$$file \ +- || exit 1; \ +- fi; \ +- done +-check-am: all-am +-check: check-am +-all-am: Makefile $(LTLIBRARIES) $(HEADERS) +-installdirs: +- for dir in "$(DESTDIR)$(goom2_libdir)" "$(DESTDIR)$(goom2_library_includedir)"; do \ +- test -z "$$dir" || $(mkdir_p) "$$dir"; \ +- done +-install: install-am +-install-exec: install-exec-am +-install-data: install-data-am +-uninstall: uninstall-am +- +-install-am: all-am +- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +- +-installcheck: installcheck-am +-install-strip: +- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ +- `test -z '$(STRIP)' || \ +- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +-mostlyclean-generic: +- +-clean-generic: +- +-distclean-generic: +- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) +- +-maintainer-clean-generic: +- @echo "This command is intended for maintainers to use" +- @echo "it deletes files that may require special tools to rebuild." +- -rm -f goomsl_lex.c +- -rm -f goomsl_yacc.c +- -rm -f goomsl_yacc.h +-clean: clean-am +- +-clean-am: clean-generic clean-goom2_libLTLIBRARIES clean-libtool \ +- mostlyclean-am +- +-distclean: distclean-am +- -rm -rf ./$(DEPDIR) +- -rm -f Makefile +-distclean-am: clean-am distclean-compile distclean-generic \ +- distclean-libtool distclean-tags +- +-dvi: dvi-am +- +-dvi-am: +- +-html: html-am +- +-info: info-am +- +-info-am: +- +-install-data-am: install-goom2_libLTLIBRARIES \ +- install-goom2_library_includeHEADERS +- +-install-exec-am: +- +-install-info: install-info-am +- +-install-man: +- +-installcheck-am: +- +-maintainer-clean: maintainer-clean-am +- -rm -rf ./$(DEPDIR) +- -rm -f Makefile +-maintainer-clean-am: distclean-am maintainer-clean-generic +- +-mostlyclean: mostlyclean-am +- +-mostlyclean-am: mostlyclean-compile mostlyclean-generic \ +- mostlyclean-libtool +- +-pdf: pdf-am +- +-pdf-am: +- +-ps: ps-am +- +-ps-am: +- +-uninstall-am: uninstall-goom2_libLTLIBRARIES \ +- uninstall-goom2_library_includeHEADERS uninstall-info-am +- +-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ +- clean-goom2_libLTLIBRARIES clean-libtool ctags distclean \ +- distclean-compile distclean-generic distclean-libtool \ +- distclean-tags distdir dvi dvi-am html html-am info info-am \ +- install install-am install-data install-data-am install-exec \ +- install-exec-am install-goom2_libLTLIBRARIES \ +- install-goom2_library_includeHEADERS install-info \ +- install-info-am install-man install-strip installcheck \ +- installcheck-am installdirs maintainer-clean \ +- maintainer-clean-generic mostlyclean mostlyclean-compile \ +- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ +- tags uninstall uninstall-am uninstall-goom2_libLTLIBRARIES \ +- uninstall-goom2_library_includeHEADERS uninstall-info-am +- +-# Tell versions [3.59,3.63) of GNU make to not export all variables. +-# Otherwise a system limit (for SysV at least) may be exceeded. +-.NOEXPORT: +diff -Naur /home/d4rk/goom2k4-0/src/mathtools.c /src/mathtools.c +--- /home/d4rk/goom2k4-0/src/mathtools.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/mathtools.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,84 +0,0 @@ +-/*---------------------------------------------------------------------------*/ +-/* +-** mathtools.c +-** Goom Project +-** +-** Created by Jeko on Sun Jul 20 2003 +- ** Copyright (c) 2003 iOS. All rights reserved. +-*/ +-/*---------------------------------------------------------------------------*/ +- +-#include "mathtools.h" +- +-float sin256[256] = { +- 0,0.0245412,0.0490677,0.0735646,0.0980171,0.122411,0.14673,0.170962 +- ,0.19509,0.219101,0.24298,0.266713,0.290285,0.313682,0.33689,0.359895 +- ,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998 +- ,0.55557,0.575808,0.595699,0.615232,0.634393,0.653173,0.671559,0.689541 +- ,0.707107,0.724247,0.740951,0.757209,0.77301,0.788346,0.803208,0.817585 +- ,0.83147,0.844854,0.857729,0.870087,0.881921,0.893224,0.903989,0.91421 +- ,0.92388,0.932993,0.941544,0.949528,0.95694,0.963776,0.970031,0.975702 +- ,0.980785,0.985278,0.989177,0.99248,0.995185,0.99729,0.998795,0.999699 +- ,1,0.999699,0.998795,0.99729,0.995185,0.99248,0.989177,0.985278 +- ,0.980785,0.975702,0.970031,0.963776,0.95694,0.949528,0.941544,0.932993 +- ,0.92388,0.91421,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854 +- ,0.83147,0.817585,0.803208,0.788346,0.77301,0.757209,0.740951,0.724247 +- ,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808 +- ,0.55557,0.534998,0.514103,0.492898,0.471397,0.449611,0.427555,0.405241 +- ,0.382683,0.359895,0.33689,0.313682,0.290285,0.266713,0.24298,0.219101 +- ,0.19509,0.170962,0.14673,0.122411,0.0980171,0.0735646,0.0490677,0.0245412 +- ,1.22465e-16,-0.0245412,-0.0490677,-0.0735646,-0.0980171,-0.122411,-0.14673,-0.170962 +- ,-0.19509,-0.219101,-0.24298,-0.266713,-0.290285,-0.313682,-0.33689,-0.359895 +- ,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998 +- ,-0.55557,-0.575808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541 +- ,-0.707107,-0.724247,-0.740951,-0.757209,-0.77301,-0.788346,-0.803208,-0.817585 +- ,-0.83147,-0.844854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.91421 +- ,-0.92388,-0.932993,-0.941544,-0.949528,-0.95694,-0.963776,-0.970031,-0.975702 +- ,-0.980785,-0.985278,-0.989177,-0.99248,-0.995185,-0.99729,-0.998795,-0.999699 +- ,-1,-0.999699,-0.998795,-0.99729,-0.995185,-0.99248,-0.989177,-0.985278 +- ,-0.980785,-0.975702,-0.970031,-0.963776,-0.95694,-0.949528,-0.941544,-0.932993 +- ,-0.92388,-0.91421,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854 +- ,-0.83147,-0.817585,-0.803208,-0.788346,-0.77301,-0.757209,-0.740951,-0.724247 +- ,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808 +- ,-0.55557,-0.534998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241 +- ,-0.382683,-0.359895,-0.33689,-0.313682,-0.290285,-0.266713,-0.24298,-0.219101 +- ,-0.19509,-0.170962,-0.14673,-0.122411,-0.0980171,-0.0735646,-0.0490677,-0.0245412 +- +-}; +- +-float cos256[256] = { +- 0,0.999699,0.998795,0.99729,0.995185,0.99248,0.989177,0.985278 +- ,0.980785,0.975702,0.970031,0.963776,0.95694,0.949528,0.941544,0.932993 +- ,0.92388,0.91421,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854 +- ,0.83147,0.817585,0.803208,0.788346,0.77301,0.757209,0.740951,0.724247 +- ,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808 +- ,0.55557,0.534998,0.514103,0.492898,0.471397,0.449611,0.427555,0.405241 +- ,0.382683,0.359895,0.33689,0.313682,0.290285,0.266713,0.24298,0.219101 +- ,0.19509,0.170962,0.14673,0.122411,0.0980171,0.0735646,0.0490677,0.0245412 +- ,6.12323e-17,-0.0245412,-0.0490677,-0.0735646,-0.0980171,-0.122411,-0.14673,-0.170962 +- ,-0.19509,-0.219101,-0.24298,-0.266713,-0.290285,-0.313682,-0.33689,-0.359895 +- ,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998 +- ,-0.55557,-0.575808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541 +- ,-0.707107,-0.724247,-0.740951,-0.757209,-0.77301,-0.788346,-0.803208,-0.817585 +- ,-0.83147,-0.844854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.91421 +- ,-0.92388,-0.932993,-0.941544,-0.949528,-0.95694,-0.963776,-0.970031,-0.975702 +- ,-0.980785,-0.985278,-0.989177,-0.99248,-0.995185,-0.99729,-0.998795,-0.999699 +- ,-1,-0.999699,-0.998795,-0.99729,-0.995185,-0.99248,-0.989177,-0.985278 +- ,-0.980785,-0.975702,-0.970031,-0.963776,-0.95694,-0.949528,-0.941544,-0.932993 +- ,-0.92388,-0.91421,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854 +- ,-0.83147,-0.817585,-0.803208,-0.788346,-0.77301,-0.757209,-0.740951,-0.724247 +- ,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808 +- ,-0.55557,-0.534998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241 +- ,-0.382683,-0.359895,-0.33689,-0.313682,-0.290285,-0.266713,-0.24298,-0.219101 +- ,-0.19509,-0.170962,-0.14673,-0.122411,-0.0980171,-0.0735646,-0.0490677,-0.0245412 +- ,-1.83697e-16,0.0245412,0.0490677,0.0735646,0.0980171,0.122411,0.14673,0.170962 +- ,0.19509,0.219101,0.24298,0.266713,0.290285,0.313682,0.33689,0.359895 +- ,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998 +- ,0.55557,0.575808,0.595699,0.615232,0.634393,0.653173,0.671559,0.689541 +- ,0.707107,0.724247,0.740951,0.757209,0.77301,0.788346,0.803208,0.817585 +- ,0.83147,0.844854,0.857729,0.870087,0.881921,0.893224,0.903989,0.91421 +- ,0.92388,0.932993,0.941544,0.949528,0.95694,0.963776,0.970031,0.975702 +- ,0.980785,0.985278,0.989177,0.99248,0.995185,0.99729,0.998795,0.999699 +- +-}; +- +diff -Naur /home/d4rk/goom2k4-0/src/mathtools.h /src/mathtools.h +--- /home/d4rk/goom2k4-0/src/mathtools.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/mathtools.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,36 +0,0 @@ +-#ifndef MATHTOOLS_H +-#define MATHTOOLS_H +- +- +-#define _double2fixmagic (68719476736.0*1.5) +-/* 2^36 * 1.5, (52-_shiftamt=36) uses limited precisicion to floor */ +-#define _shiftamt 16 +-/* 16.16 fixed point representation */ +- +-#if BigEndian_ +-#define iexp_ 0 +-#define iman_ 1 +-#else +-#define iexp_ 1 +-#define iman_ 0 +-#endif /* BigEndian_ */ +- +-/* TODO: this optimization is very efficient: put it again when all works +-#ifdef HAVE_MMX +-#define F2I(dbl,i) {double d = dbl + _double2fixmagic; i = ((int*)&d)[iman_] >> _shiftamt;} +-#else*/ +-#define F2I(dbl,i) i=(int)dbl; +-/*#endif*/ +- +-#if 0 +-#define SINCOS(f,s,c) \ +- __asm__ __volatile__ ("fsincos" : "=t" (c), "=u" (s) : "0" (f)) +-#else +-#define SINCOS(f,s,c) {s=sin(f);c=cos(f);} +-#endif +- +-extern float sin256[256]; +-extern float cos256[256]; +- +-#endif +- +diff -Naur /home/d4rk/goom2k4-0/src/mmx.c /src/mmx.c +--- /home/d4rk/goom2k4-0/src/mmx.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/mmx.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,275 +0,0 @@ +-#ifdef HAVE_MMX +- +-#define BUFFPOINTNB 16 +-#define BUFFPOINTMASK 0xffff +-#define BUFFINCR 0xff +- +-#include "mmx.h" +-#include "goom_graphic.h" +- +-#define sqrtperte 16 +-// faire : a % sqrtperte <=> a & pertemask +-#define PERTEMASK 0xf +-// faire : a / sqrtperte <=> a >> PERTEDEC +-#define PERTEDEC 4 +- +-int mmx_supported (void) { +- return (mm_support()&0x1); +-} +- +-void zoom_filter_mmx (int prevX, int prevY, +- Pixel *expix1, Pixel *expix2, +- int *brutS, int *brutD, int buffratio, +- int precalCoef[16][16]) +-{ +- unsigned int ax = (prevX-1)<<PERTEDEC, ay = (prevY-1)<<PERTEDEC; +- +- int bufsize = prevX * prevY; +- int loop; +- +- __asm__ __volatile__ ("pxor %mm7,%mm7"); +- +- for (loop=0; loop<bufsize; loop++) +- { +- /* int couleur; */ +- int px,py; +- int pos; +- int coeffs; +- +- int myPos = loop << 1, +- myPos2 = myPos + 1; +- int brutSmypos = brutS[myPos]; +- +- px = brutSmypos + (((brutD[myPos] - brutSmypos)*buffratio) >> BUFFPOINTNB); +- brutSmypos = brutS[myPos2]; +- py = brutSmypos + (((brutD[myPos2] - brutSmypos)*buffratio) >> BUFFPOINTNB); +- +- if ((py>=ay) || (px>=ax)) { +- pos=coeffs=0; +- } +- else { +- pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); +- // coef en modulo 15 +- coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; +- } +- +- __asm__ __volatile__ ( +- "movd %2, %%mm6 \n\t" +- +- /* recuperation des deux premiers pixels dans mm0 et mm1 */ +- "movq (%3,%1,4), %%mm0 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- "movq %%mm0, %%mm1 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- +- /* depackage du premier pixel */ +- "punpcklbw %%mm7, %%mm0 \n\t" /* 00-b2-00-v2-00-r2-00-a2 */ +- +- "movq %%mm6, %%mm5 \n\t" /* ??-??-??-??-c4-c3-c2-c1 */ +- /* depackage du 2ieme pixel */ +- "punpckhbw %%mm7, %%mm1 \n\t" /* 00-b1-00-v1-00-r1-00-a1 */ +- +- /* extraction des coefficients... */ +- "punpcklbw %%mm5, %%mm6 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- "movq %%mm6, %%mm4 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- "movq %%mm6, %%mm5 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ +- +- "punpcklbw %%mm5, %%mm6 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- "punpckhbw %%mm5, %%mm4 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- +- "movq %%mm6, %%mm3 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- +- "punpcklbw %%mm7, %%mm6 \n\t" /* 00-c1-00-c1-00-c1-00-c1 */ +- "punpckhbw %%mm7, %%mm3 \n\t" /* 00-c2-00-c2-00-c2-00-c2 */ +- +- /* multiplication des pixels par les coefficients */ +- "pmullw %%mm6, %%mm0 \n\t" /* c1*b2-c1*v2-c1*r2-c1*a2 */ +- "pmullw %%mm3, %%mm1 \n\t" /* c2*b1-c2*v1-c2*r1-c2*a1 */ +- "paddw %%mm1, %%mm0 \n\t" +- +- /* ...extraction des 2 derniers coefficients */ +- "movq %%mm4, %%mm5 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- "punpcklbw %%mm7, %%mm4 \n\t" /* 00-c3-00-c3-00-c3-00-c3 */ +- "punpckhbw %%mm7, %%mm5 \n\t" /* 00-c4-00-c4-00-c4-00-c4 */ +- +- /* ajouter la longueur de ligne a esi */ +- "addl 8(%%ebp),%1 \n\t" +- +- /* recuperation des 2 derniers pixels */ +- "movq (%3,%1,4), %%mm1 \n\t" +- "movq %%mm1, %%mm2 \n\t" +- +- /* depackage des pixels */ +- "punpcklbw %%mm7, %%mm1 \n\t" +- "punpckhbw %%mm7, %%mm2 \n\t" +- +- /* multiplication pas les coeffs */ +- "pmullw %%mm4, %%mm1 \n\t" +- "pmullw %%mm5, %%mm2 \n\t" +- +- /* ajout des valeurs obtenues à la valeur finale */ +- "paddw %%mm1, %%mm0 \n\t" +- "paddw %%mm2, %%mm0 \n\t" +- +- /* division par 256 = 16+16+16+16, puis repackage du pixel final */ +- "psrlw $8, %%mm0 \n\t" +- "packuswb %%mm7, %%mm0 \n\t" +- +- "movd %%mm0,%0 \n\t" +- :"=g"(expix2[loop]) +- :"r"(pos),"r"(coeffs),"r"(expix1) +- +- ); +- +- emms(); +- } +-} +- +-#define DRAWMETHOD_PLUS_MMX(_out,_backbuf,_col) \ +-{ \ +- movd_m2r(_backbuf, mm0); \ +- paddusb_m2r(_col, mm0); \ +- movd_r2m(mm0, _out); \ +-} +- +-#define DRAWMETHOD DRAWMETHOD_PLUS_MMX(*p,*p,col) +- +-void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) +-{ +- int x, y, dx, dy, yy, xx; +- Pixel *p; +- +- if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) +- goto end_of_line; +- +- dx = x2 - x1; +- dy = y2 - y1; +- if (x1 >= x2) { +- int tmp; +- +- tmp = x1; +- x1 = x2; +- x2 = tmp; +- tmp = y1; +- y1 = y2; +- y2 = tmp; +- dx = x2 - x1; +- dy = y2 - y1; +- } +- +- /* vertical line */ +- if (dx == 0) { +- if (y1 < y2) { +- p = &(data[(screenx * y1) + x1]); +- for (y = y1; y <= y2; y++) { +- DRAWMETHOD; +- p += screenx; +- } +- } +- else { +- p = &(data[(screenx * y2) + x1]); +- for (y = y2; y <= y1; y++) { +- DRAWMETHOD; +- p += screenx; +- } +- } +- goto end_of_line; +- } +- /* horizontal line */ +- if (dy == 0) { +- if (x1 < x2) { +- p = &(data[(screenx * y1) + x1]); +- for (x = x1; x <= x2; x++) { +- DRAWMETHOD; +- p++; +- } +- goto end_of_line; +- } +- else { +- p = &(data[(screenx * y1) + x2]); +- for (x = x2; x <= x1; x++) { +- DRAWMETHOD; +- p++; +- } +- goto end_of_line; +- } +- } +- /* 1 */ +- /* \ */ +- /* \ */ +- /* 2 */ +- if (y2 > y1) { +- /* steep */ +- if (dy > dx) { +- dx = ((dx << 16) / dy); +- x = x1 << 16; +- for (y = y1; y <= y2; y++) { +- xx = x >> 16; +- p = &(data[(screenx * y) + xx]); +- DRAWMETHOD; +- if (xx < (screenx - 1)) { +- p++; +- /* DRAWMETHOD; */ +- } +- x += dx; +- } +- goto end_of_line; +- } +- /* shallow */ +- else { +- dy = ((dy << 16) / dx); +- y = y1 << 16; +- for (x = x1; x <= x2; x++) { +- yy = y >> 16; +- p = &(data[(screenx * yy) + x]); +- DRAWMETHOD; +- if (yy < (screeny - 1)) { +- p += screeny; +- /* DRAWMETHOD; */ +- } +- y += dy; +- } +- } +- } +- /* 2 */ +- /* / */ +- /* / */ +- /* 1 */ +- else { +- /* steep */ +- if (-dy > dx) { +- dx = ((dx << 16) / -dy); +- x = (x1 + 1) << 16; +- for (y = y1; y >= y2; y--) { +- xx = x >> 16; +- p = &(data[(screenx * y) + xx]); +- DRAWMETHOD; +- if (xx < (screenx - 1)) { +- p--; +- /* DRAWMETHOD; */ +- } +- x += dx; +- } +- goto end_of_line; +- } +- /* shallow */ +- else { +- dy = ((dy << 16) / dx); +- y = y1 << 16; +- for (x = x1; x <= x2; x++) { +- yy = y >> 16; +- p = &(data[(screenx * yy) + x]); +- DRAWMETHOD; +- if (yy < (screeny - 1)) { +- p += screeny; +- /* DRAWMETHOD; */ +- } +- y += dy; +- } +- goto end_of_line; +- } +- } +-end_of_line: +- emms(); +- /* __asm__ __volatile__ ("emms"); */ +-} +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/mmx.h /src/mmx.h +--- /home/d4rk/goom2k4-0/src/mmx.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/mmx.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,729 +0,0 @@ +-/* mmx.h +- +- MultiMedia eXtensions GCC interface library for IA32. +- +- To use this library, simply include this header file +- and compile with GCC. You MUST have inlining enabled +- in order for mmx_ok() to work; this can be done by +- simply using -O on the GCC command line. +- +- Compiling with -DMMX_TRACE will cause detailed trace +- output to be sent to stderr for each mmx operation. +- This adds lots of code, and obviously slows execution to +- a crawl, but can be very useful for debugging. +- +- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY +- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT +- LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY +- AND FITNESS FOR ANY PARTICULAR PURPOSE. +- +- 1997-99 by H. Dietz and R. Fisher +- +- Notes: +- It appears that the latest gas has the pand problem fixed, therefore +- I'll undefine BROKEN_PAND by default. +-*/ +- +-#ifndef _MMX_H +-#define _MMX_H +- +-#include "goom_graphic.h" +- +-/* Warning: at this writing, the version of GAS packaged +- with most Linux distributions does not handle the +- parallel AND operation mnemonic correctly. If the +- symbol BROKEN_PAND is defined, a slower alternative +- coding will be used. If execution of mmxtest results +- in an illegal instruction fault, define this symbol. +-*/ +-#undef BROKEN_PAND +- +- +-/* The type of an value that fits in an MMX register +- (note that long long constant values MUST be suffixed +- by LL and unsigned long long values by ULL, lest +- they be truncated by the compiler) +-*/ +-typedef union { +- long long q; /* Quadword (64-bit) value */ +- unsigned long long uq; /* Unsigned Quadword */ +- int d[2]; /* 2 Doubleword (32-bit) values */ +- unsigned int ud[2]; /* 2 Unsigned Doubleword */ +- short w[4]; /* 4 Word (16-bit) values */ +- unsigned short uw[4]; /* 4 Unsigned Word */ +- char b[8]; /* 8 Byte (8-bit) values */ +- unsigned char ub[8]; /* 8 Unsigned Byte */ +- float s[2]; /* Single-precision (32-bit) value */ +-} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ +- +- +- +-/* Function to test if multimedia instructions are supported... +-*/ +-static int +-mm_support(void) +-{ +- /* Returns 1 if MMX instructions are supported, +- 3 if Cyrix MMX and Extended MMX instructions are supported +- 5 if AMD MMX and 3DNow! instructions are supported +- 13 if AMD Extended MMX, &3dNow supported +- 0 if hardware does not support any of these +- */ +- register int rval = 0; +- +- __asm__ __volatile__ ( +- /* See if CPUID instruction is supported ... */ +- /* ... Get copies of EFLAGS into eax and ecx */ +- "pushl %%ebx\n\t" +- "pushf\n\t" +- "popl %%eax\n\t" +- "movl %%eax, %%ecx\n\t" +- +- /* ... Toggle the ID bit in one copy and store */ +- /* to the EFLAGS reg */ +- "xorl $0x200000, %%eax\n\t" +- "push %%eax\n\t" +- "popf\n\t" +- +- /* ... Get the (hopefully modified) EFLAGS */ +- "pushf\n\t" +- "popl %%eax\n\t" +- +- /* ... Compare and test result */ +- "xorl %%eax, %%ecx\n\t" +- "testl $0x200000, %%ecx\n\t" +- "jz NotSupported1\n\t" /* CPUID not supported */ +- +- +- /* Get standard CPUID information, and +- go to a specific vendor section */ +- "movl $0, %%eax\n\t" +- "cpuid\n\t" +- +- /* Check for Intel */ +- "cmpl $0x756e6547, %%ebx\n\t" +- "jne TryAMD\n\t" +- "cmpl $0x49656e69, %%edx\n\t" +- "jne TryAMD\n\t" +- "cmpl $0x6c65746e, %%ecx\n" +- "jne TryAMD\n\t" +- "jmp Intel\n\t" +- +- /* Check for AMD */ +- "\nTryAMD:\n\t" +- "cmpl $0x68747541, %%ebx\n\t" +- "jne TryCyrix\n\t" +- "cmpl $0x69746e65, %%edx\n\t" +- "jne TryCyrix\n\t" +- "cmpl $0x444d4163, %%ecx\n" +- "jne TryCyrix\n\t" +- "jmp AMD\n\t" +- +- /* Check for Cyrix */ +- "\nTryCyrix:\n\t" +- "cmpl $0x69727943, %%ebx\n\t" +- "jne NotSupported2\n\t" +- "cmpl $0x736e4978, %%edx\n\t" +- "jne NotSupported3\n\t" +- "cmpl $0x64616574, %%ecx\n\t" +- "jne NotSupported4\n\t" +- /* Drop through to Cyrix... */ +- +- +- /* Cyrix Section */ +- /* See if extended CPUID level 80000001 is supported */ +- /* The value of CPUID/80000001 for the 6x86MX is undefined +- according to the Cyrix CPU Detection Guide (Preliminary +- Rev. 1.01 table 1), so we'll check the value of eax for +- CPUID/0 to see if standard CPUID level 2 is supported. +- According to the table, the only CPU which supports level +- 2 is also the only one which supports extended CPUID levels. +- */ +- "cmpl $0x2, %%eax\n\t" +- "jne MMXtest\n\t" /* Use standard CPUID instead */ +- +- /* Extended CPUID supported (in theory), so get extended +- features */ +- "movl $0x80000001, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%eax\n\t" /* Test for MMX */ +- "jz NotSupported5\n\t" /* MMX not supported */ +- "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ +- "jnz EMMXSupported\n\t" +- "movl $1, %0\n\n\t" /* MMX Supported */ +- "jmp Return\n\n" +- "EMMXSupported:\n\t" +- "movl $3, %0\n\n\t" /* EMMX and MMX Supported */ +- "jmp Return\n\t" +- +- +- /* AMD Section */ +- "AMD:\n\t" +- +- /* See if extended CPUID is supported */ +- "movl $0x80000000, %%eax\n\t" +- "cpuid\n\t" +- "cmpl $0x80000000, %%eax\n\t" +- "jl MMXtest\n\t" /* Use standard CPUID instead */ +- +- /* Extended CPUID supported, so get extended features */ +- "movl $0x80000001, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%edx\n\t" /* Test for MMX */ +- "jz NotSupported6\n\t" /* MMX not supported */ +- "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ +- "jnz ThreeDNowSupported\n\t" +- "movl $1, %0\n\n\t" /* MMX Supported */ +- "jmp Return\n\n" +- "ThreeDNowSupported:\n\t" +- "testl $0x40000000, %%edx\n\t" /* Test AMD Extended MMX */ +- "jnz AMDXMMXSupported\n\t" +- "movl $5, %0\n\n\t" /* 3DNow! and MMX Supported */ +- "jmp Return\n\t" +- "AMDXMMXSupported:\n\t" +- "movl $13, %0\n\n\t" /* XMMX, 3DNow! and MMX Supported */ +- "jmp Return\n\t" +- +- +- /* Intel Section */ +- "Intel:\n\t" +- +- /* Check for MMX */ +- "MMXtest:\n\t" +- "movl $1, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%edx\n\t" /* Test for MMX */ +- "jz NotSupported7\n\t" /* MMX Not supported */ +- "movl $1, %0\n\n\t" /* MMX Supported */ +- "jmp Return\n\t" +- +- /* Nothing supported */ +- "\nNotSupported1:\n\t" +- "#movl $101, %0\n\n\t" +- "\nNotSupported2:\n\t" +- "#movl $102, %0\n\n\t" +- "\nNotSupported3:\n\t" +- "#movl $103, %0\n\n\t" +- "\nNotSupported4:\n\t" +- "#movl $104, %0\n\n\t" +- "\nNotSupported5:\n\t" +- "#movl $105, %0\n\n\t" +- "\nNotSupported6:\n\t" +- "#movl $106, %0\n\n\t" +- "\nNotSupported7:\n\t" +- "#movl $107, %0\n\n\t" +- "movl $0, %0\n\n\t" +- +- "Return:\n\t" +- "popl %%ebx\n\t" +- : "=X" (rval) +- : /* no input */ +- : "eax", "ecx", "edx" +- ); +- +- /* Return */ +- return(rval); +-} +- +-/* Function to test if mmx instructions are supported... +-*/ +-static inline int +-mmx_ok(void) +-{ +- /* Returns 1 if MMX instructions are supported, 0 otherwise */ +- return ( mm_support() & 0x1 ); +-} +- +-int mmx_supported (void); +-int xmmx_supported (void); +- +- +-/* MMX optimized implementations */ +-void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +-void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +-void zoom_filter_mmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2, +- int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +-void zoom_filter_xmmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2, +- int *lbruS, int *lbruD, int buffratio, int precalCoef[16][16]); +- +- +-/* Helper functions for the instruction macros that follow... +- (note that memory-to-register, m2r, instructions are nearly +- as efficient as register-to-register, r2r, instructions; +- however, memory-to-memory instructions are really simulated +- as a convenience, and are only 1/3 as efficient) +-*/ +-#ifdef MMX_TRACE +- +-/* Include the stuff for printing a trace to stderr... +-*/ +- +-#include <stdio.h> +- +-#define mmx_i2r(op, imm, reg) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace.uq = (imm); \ +- printf(#op "_i2r(" #imm "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (imm)); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_m2r(op, mem, reg) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace = (mem); \ +- printf(#op "_m2r(" #mem "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "m" (mem)); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#reg "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_r2m(op, reg, mem) \ +- { \ +- mmx_t mmx_trace; \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#op "_r2m(" #reg "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- mmx_trace = (mem); \ +- printf(#mem "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %%" #reg ", %0" \ +- : "=m" (mem) \ +- : /* nothing */ ); \ +- mmx_trace = (mem); \ +- printf(#mem "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_r2r(op, regs, regd) \ +- { \ +- mmx_t mmx_trace; \ +- __asm__ __volatile__ ("movq %%" #regs ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#op "_r2r(" #regs "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #regd ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#regd "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ +- __asm__ __volatile__ ("movq %%" #regd ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- printf(#regd "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_m2m(op, mems, memd) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace = (mems); \ +- printf(#op "_m2m(" #mems "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- mmx_trace = (memd); \ +- printf(#memd "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ +- #op " %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=m" (memd) \ +- : "m" (mems)); \ +- mmx_trace = (memd); \ +- printf(#memd "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#else +- +-/* These macros are a lot simpler without the tracing... +-*/ +- +-#define mmx_i2r(op, imm, reg) \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (imm) ) +- +-#define mmx_m2r(op, mem, reg) \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "m" (mem)) +- +-#define mmx_r2m(op, reg, mem) \ +- __asm__ __volatile__ (#op " %%" #reg ", %0" \ +- : "=m" (mem) \ +- : /* nothing */ ) +- +-#define mmx_r2r(op, regs, regd) \ +- __asm__ __volatile__ (#op " %" #regs ", %" #regd) +- +-#define mmx_m2m(op, mems, memd) \ +- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ +- #op " %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=m" (memd) \ +- : "m" (mems)) +- +-#endif +- +- +-/* 1x64 MOVe Quadword +- (this is both a load and a store... +- in fact, it is the only way to store) +-*/ +-#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +-#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +-#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +-#define movq(vars, vard) \ +- __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (vard) \ +- : "X" (vars)) +- +- +-/* 1x32 MOVe Doubleword +- (like movq, this is both load and store... +- but is most useful for moving things between +- mmx registers and ordinary registers) +-*/ +-#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +-#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +-#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +-#define movd(vars, vard) \ +- __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ +- "movd %%mm0, %0" \ +- : "=X" (vard) \ +- : "X" (vars)) +- +- +-/* 2x32, 4x16, and 8x8 Parallel ADDs +-*/ +-#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) +-#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) +-#define paddd(vars, vard) mmx_m2m(paddd, vars, vard) +- +-#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) +-#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) +-#define paddw(vars, vard) mmx_m2m(paddw, vars, vard) +- +-#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) +-#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) +-#define paddb(vars, vard) mmx_m2m(paddb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic +-*/ +-#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) +-#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) +-#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) +- +-#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) +-#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) +-#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic +-*/ +-#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) +-#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) +-#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) +- +-#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) +-#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) +-#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) +- +- +-/* 2x32, 4x16, and 8x8 Parallel SUBs +-*/ +-#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) +-#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) +-#define psubd(vars, vard) mmx_m2m(psubd, vars, vard) +- +-#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) +-#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) +-#define psubw(vars, vard) mmx_m2m(psubw, vars, vard) +- +-#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) +-#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) +-#define psubb(vars, vard) mmx_m2m(psubb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic +-*/ +-#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) +-#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) +-#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) +- +-#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) +-#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) +-#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) +- +- +-/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic +-*/ +-#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) +-#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) +-#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) +- +-#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) +-#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) +-#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) +- +- +-/* 4x16 Parallel MULs giving Low 4x16 portions of results +-*/ +-#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) +-#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) +-#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) +- +- +-/* 4x16 Parallel MULs giving High 4x16 portions of results +-*/ +-#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) +-#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) +-#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) +- +- +-/* 4x16->2x32 Parallel Mul-ADD +- (muls like pmullw, then adds adjacent 16-bit fields +- in the multiply result to make the final 2x32 result) +-*/ +-#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) +-#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) +-#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) +- +- +-/* 1x64 bitwise AND +-*/ +-#ifdef BROKEN_PAND +-#define pand_m2r(var, reg) \ +- { \ +- mmx_m2r(pandn, (mmx_t) -1LL, reg); \ +- mmx_m2r(pandn, var, reg); \ +- } +-#define pand_r2r(regs, regd) \ +- { \ +- mmx_m2r(pandn, (mmx_t) -1LL, regd); \ +- mmx_r2r(pandn, regs, regd) \ +- } +-#define pand(vars, vard) \ +- { \ +- movq_m2r(vard, mm0); \ +- mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ +- mmx_m2r(pandn, vars, mm0); \ +- movq_r2m(mm0, vard); \ +- } +-#else +-#define pand_m2r(var, reg) mmx_m2r(pand, var, reg) +-#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) +-#define pand(vars, vard) mmx_m2m(pand, vars, vard) +-#endif +- +- +-/* 1x64 bitwise AND with Not the destination +-*/ +-#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) +-#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) +-#define pandn(vars, vard) mmx_m2m(pandn, vars, vard) +- +- +-/* 1x64 bitwise OR +-*/ +-#define por_m2r(var, reg) mmx_m2r(por, var, reg) +-#define por_r2r(regs, regd) mmx_r2r(por, regs, regd) +-#define por(vars, vard) mmx_m2m(por, vars, vard) +- +- +-/* 1x64 bitwise eXclusive OR +-*/ +-#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) +-#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) +-#define pxor(vars, vard) mmx_m2m(pxor, vars, vard) +- +- +-/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality +- (resulting fields are either 0 or -1) +-*/ +-#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) +-#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) +-#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) +- +-#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) +-#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) +-#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) +- +-#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) +-#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) +-#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) +- +- +-/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than +- (resulting fields are either 0 or -1) +-*/ +-#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) +-#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) +-#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) +- +-#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) +-#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) +-#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) +- +-#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) +-#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) +-#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) +- +- +-/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical +-*/ +-#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) +-#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) +-#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) +-#define psllq(vars, vard) mmx_m2m(psllq, vars, vard) +- +-#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) +-#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) +-#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) +-#define pslld(vars, vard) mmx_m2m(pslld, vars, vard) +- +-#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) +-#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) +-#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) +-#define psllw(vars, vard) mmx_m2m(psllw, vars, vard) +- +- +-/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical +-*/ +-#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) +-#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) +-#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) +-#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) +- +-#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) +-#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) +-#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) +-#define psrld(vars, vard) mmx_m2m(psrld, vars, vard) +- +-#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) +-#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) +-#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) +-#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) +- +- +-/* 2x32 and 4x16 Parallel Shift Right Arithmetic +-*/ +-#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) +-#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) +-#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) +-#define psrad(vars, vard) mmx_m2m(psrad, vars, vard) +- +-#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) +-#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) +-#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) +-#define psraw(vars, vard) mmx_m2m(psraw, vars, vard) +- +- +-/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate +- (packs source and dest fields into dest in that order) +-*/ +-#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) +-#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) +-#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) +- +-#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) +-#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) +-#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) +- +- +-/* 4x16->8x8 PACK and Unsigned Saturate +- (packs source and dest fields into dest in that order) +-*/ +-#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) +-#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) +-#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) +- +- +-/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low +- (interleaves low half of dest with low half of source +- as padding in each result field) +-*/ +-#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) +-#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) +-#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) +- +-#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) +-#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) +-#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) +- +-#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) +-#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) +-#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) +- +- +-/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High +- (interleaves high half of dest with high half of source +- as padding in each result field) +-*/ +-#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) +-#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) +-#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) +- +-#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) +-#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) +-#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) +- +-#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) +-#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) +-#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) +- +- +-/* Empty MMx State +- (used to clean-up when going from mmx to float use +- of the registers that are shared by both; note that +- there is no float-to-mmx operation needed, because +- only the float tag word info is corruptible) +-*/ +-#ifdef MMX_TRACE +- +-#define emms() \ +- { \ +- printf("emms()\n"); \ +- __asm__ __volatile__ ("emms" \ +- "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)"); \ +- } +- +-#else +- +-#define emms() __asm__ __volatile__ ("emms"::: \ +- "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)") +- +-#endif +- +-#endif +- +diff -Naur /home/d4rk/goom2k4-0/src/motif_goom1.h /src/motif_goom1.h +--- /home/d4rk/goom2k4-0/src/motif_goom1.h 2005-02-07 06:46:42.000000000 -0700 ++++ /src/motif_goom1.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,1026 +0,0 @@ +-static Motif CONV_MOTIF1 = { +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,14,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,13,9,9,7,2,2,9,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, +- 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,12,7,4,0,0,0,2,0,0,3,14,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,12,10,9,9,4,1,0, +- 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,10,3,0,0,0,1,1,3,5,0,0,1,14,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,14,6,3,1,1,4,9,1, +- 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 10,3,0,0,2,7,13,14,14,14,7,0,0,2,14,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,12,1,9,15,15,15,15,3, +- 0,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,4, +- 0,0,2,10,15,15,15,15,15,15,1,0,0,10,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,9,0,2,14,15,15,15,7, +- 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,14,6,0,0, +- 2,9,15,15,15,15,15,15,15,13,0,0,3,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,11,0,0,10,15,15,15,9, +- 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,13,3,0,1,5, +- 5,4,4,4,6,12,15,15,15,13,0,0,7,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,14,0,0,5,15,15,15,10, +- 0,7,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,11,1,0,3,3,1, +- 0,0,0,0,0,0,5,13,15,12,0,0,13,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,13,14,15, +- 15,15,15,15,15,15,15,15,14,0,0,1,15,15,15,12, +- 0,3,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,10,1,2,4,0,0,1, +- 9,12,12,12,9,3,0,2,14,5,0,7,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,14,7,4,4,1,1,12, +- 15,15,15,15,15,15,15,15,14,1,0,0,12,15,15,15, +- 1,0,12,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,10,0,3,2,0,0,3,12, +- 15,15,15,15,15,14,2,1,13,2,0,12,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,14,3,0,0,0,0,0,2, +- 13,15,15,15,15,15,15,15,14,1,0,0,8,15,15,15, +- 1,0,9,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,12,2,1,0,0,0,9,14,15, +- 15,15,15,15,15,14,1,1,11,0,3,14,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,7,4,11,12,10,1,0, +- 3,12,15,15,15,15,15,15,13,1,1,0,4,15,15,15, +- 2,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,2,1,0,0,3,12,15,15,15, +- 15,15,15,15,15,11,0,5,9,1,12,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,5,1,13,15,15,12,1, +- 0,1,9,15,15,15,15,15,14,2,5,0,1,14,15,15, +- 2,0,7,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,14,3,0,0,0,7,14,15,15,15,15, +- 15,15,15,15,15,9,0,8,7,4,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,7,0,7,8,11,15,13, +- 2,0,0,3,10,15,15,15,15,5,11,0,0,11,15,15, +- 6,0,2,14,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,6,0,0,0,8,15,15,15,15,15,15, +- 15,15,15,15,15,6,0,4,0,6,15,15,15,15,15,15, +- 14,9,14,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,11,0,3,3,0,8,15, +- 14,5,0,0,0,4,12,15,15,5,13,2,0,6,15,15, +- 12,0,0,11,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,10,0,0,0,8,15,15,15,15,15,15,15, +- 15,15,15,15,10,1,7,6,4,13,15,15,15,15,13,11, +- 6,0,8,11,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,1,1,11,2,0,5, +- 14,15,8,0,0,0,0,7,15,5,14,6,0,2,15,15, +- 15,3,0,5,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,13,1,0,0,7,15,15,15,15,15,15,15,15, +- 15,15,15,15,7,9,15,15,15,15,15,15,12,6,2,1, +- 1,1,8,6,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,4,0,6,12,1,0, +- 3,13,15,11,2,0,0,0,8,4,14,10,0,0,13,15, +- 15,7,0,1,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,5,0,0,5,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,13,15,15,15,15,14,8,3,1,2,7,11, +- 5,4,5,6,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,8,0,1,14,11,0, +- 0,1,9,15,14,5,0,0,2,4,14,13,0,0,10,15, +- 15,12,0,0,12,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,10,0,0,1,14,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,13,7,2,0,5,9,15,15,15, +- 5,3,6,9,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,13,0,0,9,15,12, +- 2,0,0,4,13,14,4,0,3,2,12,15,1,0,5,15, +- 15,14,1,0,8,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,2,0,0,9,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,11,6,1,0,2,3,10,15,15,15,15,7, +- 1,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,5,0,3,14,15, +- 9,2,0,0,1,6,12,13,13,1,9,12,0,0,2,14, +- 15,15,4,0,4,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,10,0,0,2,14,15,15,15,15,15,15,15,15,15,15, +- 13,9,6,0,1,2,9,10,15,15,15,15,14,7,1,0, +- 6,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,11,0,0,9,15, +- 4,4,11,6,1,0,0,1,1,0,10,4,0,0,0,12, +- 15,15,9,0,1,14,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,3,0,0,8,15,15,15,15,15,15,15,13,12,4,4, +- 1,1,3,10,12,15,15,15,15,15,9,2,1,0,1,6, +- 6,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,4,0,3,14, +- 4,3,15,15,14,9,7,9,1,0,0,0,0,1,0,7, +- 15,15,13,0,0,9,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 13,0,0,1,14,15,15,15,15,15,12,9,1,0,1,4, +- 7,15,15,15,15,15,15,14,8,2,0,0,0,2,13,9, +- 0,4,14,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,11,0,0,9, +- 3,0,8,14,15,15,15,15,10,5,4,4,7,4,0,3, +- 15,15,15,4,0,3,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 5,0,0,5,15,15,15,15,14,8,7,8,10,12,14,15, +- 15,15,15,15,15,15,11,1,0,0,0,5,11,15,13,1, +- 1,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,3,0,4, +- 4,0,0,2,6,10,15,15,15,15,15,15,15,10,0,0, +- 12,15,15,9,0,0,12,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 1,0,0,10,15,15,15,15,15,13,14,15,15,15,15,15, +- 15,15,15,15,14,7,1,0,0,3,12,15,15,15,6,0, +- 7,15,15,15,12,10,9,10,12,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,9,0,0, +- 8,3,1,4,1,0,1,12,15,15,15,15,15,14,2,0, +- 6,15,15,15,2,0,6,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 0,0,1,14,15,15,15,15,14,5,15,15,15,15,15,15, +- 15,15,15,7,2,0,0,1,8,15,15,15,15,12,0,2, +- 14,15,12,4,0,0,0,0,0,1,5,10,14,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,14,0,0, +- 5,4,1,14,15,10,7,13,15,15,15,15,15,15,8,0, +- 1,14,15,15,7,0,1,14,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, +- 0,0,4,15,15,15,15,15,13,2,13,15,15,15,15,15, +- 12,7,0,0,0,0,5,12,15,15,15,15,14,3,0,9, +- 11,1,0,0,1,1,0,1,0,0,0,0,2,12,15,15, +- 15,15,15,15,15,15,15,14,15,15,15,15,15,15,2,0, +- 5,2,1,14,15,14,13,15,15,15,15,15,15,15,12,0, +- 0,10,15,15,13,0,0,9,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, +- 0,0,4,15,15,15,15,15,12,0,12,15,15,15,12,6, +- 0,0,0,0,6,14,15,15,15,15,15,15,7,0,0,12, +- 1,0,0,2,2,1,1,7,12,8,3,0,0,1,13,15, +- 15,15,15,15,15,8,4,8,12,15,15,15,15,15,8,0, +- 4,2,0,14,15,11,9,15,15,15,15,15,15,15,15,3, +- 0,5,15,15,15,5,0,3,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, +- 0,0,4,15,15,15,15,15,12,0,12,15,13,3,1,0, +- 0,0,5,12,15,15,15,15,15,15,15,12,0,0,7,7, +- 0,0,0,0,0,0,0,1,12,15,15,12,3,0,5,15, +- 15,15,15,14,5,0,0,0,0,2,2,3,7,14,9,8, +- 14,2,1,14,15,2,12,13,15,15,15,15,15,15,15,9, +- 0,0,13,15,15,10,0,0,12,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, +- 0,0,5,15,15,15,15,15,12,0,11,10,1,0,0,1, +- 5,14,15,15,15,15,15,15,15,15,15,6,0,2,7,0, +- 0,0,0,1,2,7,4,0,3,14,15,15,14,2,0,12, +- 15,15,15,9,0,1,2,1,0,0,0,0,0,1,3,7, +- 15,3,0,14,15,4,12,15,15,15,15,15,15,15,15,14, +- 1,0,8,15,15,14,1,0,8,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, +- 0,0,4,15,15,15,15,15,12,0,2,0,0,1,10,15, +- 15,15,15,15,15,15,15,15,15,15,12,0,0,6,0,0, +- 0,1,10,14,15,15,11,1,0,9,15,15,15,8,0,9, +- 15,15,12,4,8,14,15,8,1,0,0,0,0,0,1,9, +- 15,2,0,13,15,1,9,15,15,15,15,15,15,15,15,15, +- 6,0,1,14,15,14,1,0,3,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, +- 1,0,1,14,15,15,15,15,12,1,3,7,9,13,15,15, +- 15,15,15,15,15,15,15,15,15,15,3,0,2,3,0,4, +- 0,8,15,15,15,15,15,13,1,2,14,15,15,10,0,6, +- 15,14,2,6,15,15,15,1,3,7,3,0,0,0,0,1, +- 11,1,0,11,12,0,12,15,15,15,15,15,15,15,15,15, +- 11,0,0,9,15,15,4,0,0,12,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 6,0,0,9,15,15,15,15,15,12,14,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,11,0,0,3,0,8,14, +- 2,5,15,15,15,15,15,15,5,0,8,15,15,12,0,4, +- 15,5,2,14,15,15,10,0,13,15,13,2,4,5,5,0, +- 9,1,0,10,9,1,14,15,15,15,15,15,15,15,15,15, +- 13,0,0,3,15,15,9,0,0,8,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 12,0,0,3,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,3,0,1,1,5,14,15, +- 11,0,12,15,15,15,15,15,14,1,1,14,15,12,0,4, +- 10,0,9,15,15,11,1,8,15,15,8,1,14,15,14,2, +- 5,0,0,10,6,2,15,15,15,15,15,15,15,15,15,15, +- 15,3,0,0,12,15,13,0,0,2,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,3,0,0,10,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,10,0,0,1,0,11,15,15, +- 15,2,6,15,15,15,15,15,15,6,0,9,15,13,0,6, +- 3,0,13,15,14,2,6,15,15,13,1,8,15,15,15,4, +- 3,1,0,10,7,2,15,15,15,15,15,15,15,15,15,15, +- 15,9,0,0,6,15,15,3,0,0,13,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,9,0,0,2,14,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,11,10,2,0,3,0,3,15,15,15, +- 15,8,1,14,15,15,15,15,15,13,0,2,15,9,1,10, +- 0,3,15,15,6,2,14,15,14,3,1,14,15,15,15,2, +- 4,0,0,12,5,3,15,15,15,15,15,15,15,15,15,15, +- 15,14,1,0,1,14,15,5,0,0,12,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,4,0,0,6,15,15,15,15,15,15,15,15,14,12, +- 12,9,5,4,4,3,0,0,0,0,4,0,8,15,15,15, +- 15,13,1,10,15,15,15,15,15,15,2,0,11,3,5,10, +- 0,7,15,9,1,11,15,15,8,0,6,15,15,15,10,0, +- 3,0,0,13,3,6,15,15,15,15,15,15,15,15,15,15, +- 15,15,6,0,0,12,15,5,0,0,7,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,13,1,0,0,8,14,15,15,13,6,4,4,1,0, +- 0,0,0,0,0,0,2,0,0,4,3,0,12,15,15,15, +- 15,15,5,3,15,15,15,15,14,8,0,0,1,1,12,9, +- 0,9,10,0,6,15,15,15,2,2,14,15,15,13,2,0, +- 4,0,1,13,0,10,15,15,15,15,15,15,15,15,15,15, +- 15,15,13,1,0,10,15,10,0,0,5,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,9,0,0,0,3,2,2,1,0,0,0,1,4, +- 4,5,10,12,12,12,11,0,0,11,4,0,12,15,15,15, +- 15,15,12,0,7,13,15,15,5,0,0,0,1,6,15,9, +- 0,3,0,0,1,6,14,10,0,12,15,15,11,2,0,2, +- 3,0,3,12,1,11,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,3,0,6,8,7,0,0,5,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,9,1,0,0,0,2,6,10,12,12,14,15, +- 15,15,15,15,11,5,4,0,2,14,4,0,12,15,15,15, +- 15,15,15,4,0,3,13,6,0,0,0,1,2,14,15,12, +- 0,0,0,0,0,0,2,2,6,15,14,8,0,0,0,7, +- 4,0,4,12,0,12,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,0,0,0,0,0,0,1,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,12,2,0,0,0,1,6,11,15,15,15, +- 15,15,15,15,2,1,0,0,9,15,6,0,7,15,15,15, +- 15,15,15,13,2,0,0,0,0,0,0,1,12,15,15,15, +- 4,0,0,0,0,0,0,6,13,6,1,0,0,4,13,15, +- 6,0,6,12,0,12,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,14,5,0,0,0,0,0,5,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,5,0,0,0,0,0,2,4,5, +- 7,3,6,3,0,2,0,2,15,15,11,0,0,9,15,15, +- 15,15,15,15,11,0,0,0,0,0,2,11,15,15,15,15, +- 12,1,0,0,1,4,6,10,2,0,0,0,7,14,15,15, +- 9,0,9,9,0,12,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,13,9,8,9,7,13,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,12,6,1,0,0,0,0,0, +- 0,0,0,2,8,0,0,9,15,15,14,4,0,0,3,10, +- 14,15,15,15,15,13,3,0,0,4,14,15,15,15,15,15, +- 15,11,2,0,0,1,1,0,0,0,1,11,15,15,15,15, +- 9,0,10,5,3,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,14,12,10,5,4,6, +- 2,4,10,14,8,0,1,14,15,15,15,14,5,0,0,0, +- 1,2,4,4,4,3,1,2,9,14,15,15,15,15,15,15, +- 15,15,15,11,11,13,10,9,9,11,15,15,15,15,15,15, +- 10,0,8,2,4,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 2,7,15,14,1,0,6,15,15,15,15,15,15,10,6,4, +- 2,2,4,4,4,3,9,14,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 11,0,3,1,4,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, +- 1,10,15,9,0,0,13,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 11,0,11,11,11,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,2, +- 5,15,14,2,0,5,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 14,1,13,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,10,1, +- 13,15,11,0,0,12,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,5,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,8,1, +- 15,15,5,0,3,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,10,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,12,2,3, +- 15,14,1,0,7,15,15,15,15,15,13,15,15,15,15,14, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,13,12,12,11,9,4,7,14,15, +- 14,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,12,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,14,3,0,10, +- 15,9,0,0,8,7,4,2,2,1,0,3,4,3,4,9, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,14,13,11,7,4,2,0,0,0,0,0,0,1,12,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,14,13,11,7,4,2,2,13,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,12,0,3,11, +- 7,1,0,0,0,0,0,1,4,9,11,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,14,12,11,9,7,4, +- 3,1,0,0,0,0,0,0,0,0,0,2,11,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,13,11,8, +- 4,3,1,0,0,0,0,3,8,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,14,11,3,0,0,0, +- 0,0,0,2,6,9,12,14,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,13,9,6,3,1,0,0,0,0,0,0, +- 0,0,0,0,1,4,7,11,12,12,12,14,15,15,15,15, +- 15,15,15,15,15,15,15,14,12,11,7,4,2,0,0,0, +- 0,0,0,1,5,10,13,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,12,7,3,1,0,0,0,2,5, +- 2,0,2,14,15,15,15,15,15,15,15,15,15,14,13,12, +- 11,9,6,4,2,0,0,0,0,0,0,0,0,1,2,4, +- 5,9,11,13,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,14,12,11,7,4,3,1,0,0,0,0,0,0,0,1, +- 4,5,10,14,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,13,10,5,1,0,0,0,1,0,0,2,13,14, +- 1,0,8,15,15,14,12,11,9,8,4,3,2,1,0,0, +- 0,0,0,0,1,3,2,3,5,9,10,12,13,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,13,11,10,6,4, +- 3,1,0,0,0,0,0,0,0,0,1,4,7,11,13,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,11,4,0,0,0,1,4,9,13,13,1,0,0,1,7, +- 0,0,7,8,5,2,0,0,0,0,0,0,1,2,3,4, +- 5,9,10,12,14,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,14,11,8,4,3,1,0,0,0,0,0, +- 0,0,0,0,1,4,5,9,12,13,15,15,15,15,15,15, +- 15,15,14,12,9,8,8,7,4,2,5,4,5,5,12,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,14,10,5, +- 1,0,1,3,6,11,14,15,15,15,15,13,12,8,3,2, +- 0,0,1,1,3,3,4,5,8,10,12,13,14,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, +- 11,9,6,4,2,1,0,0,0,0,0,0,0,1,2,4, +- 6,10,11,13,15,15,15,15,15,15,15,15,13,11,9,7, +- 4,2,1,0,0,0,0,2,4,7,12,14,14,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,10,5,1,1,3, +- 8,12,14,15,15,15,15,15,15,15,15,15,15,15,15,9, +- 3,11,14,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,8,6,9,9,9,9,9,8,5,4,4,3,1,0, +- 0,0,0,0,1,2,3,2,4,5,9,11,12,14,15,15, +- 15,15,15,15,15,15,15,14,12,9,5,2,0,0,0,0, +- 0,1,2,4,7,10,14,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,14,9,4,1,3,9,13,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, +- 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,13,3,1,1,1,1,1,1,1,0,0,0,0,2,3, +- 5,8,10,12,14,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,12,5,2,0,0,0,1,3,4,7,10, +- 12,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,13,11,13,13,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,14,12,12,12,13,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,8,1,0,1,4,7,11,13,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,13,7,8,11,14,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 +- }; +diff -Naur /home/d4rk/goom2k4-0/src/motif_goom2.h /src/motif_goom2.h +--- /home/d4rk/goom2k4-0/src/motif_goom2.h 2005-02-07 06:46:42.000000000 -0700 ++++ /src/motif_goom2.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,1026 +0,0 @@ +-static Motif CONV_MOTIF2 = { +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,12,5,14, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,12,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,10,1,14, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,10,0,12,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,6,0,12, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,7,0,8,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,13,2,0,10, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,6,0,2,14,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,5,0,0,10, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,9,0,0,12,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,14,9,0,0,1,14, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,8,0,0,8,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,14,8,3,0,0,0,9,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,11,0,0,2,14,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,13,9,5,3,4,1,0,0,0,0,7,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,14,4,0,0,4,11,13,13,15,15,14,12,10,8,5, +- 6,4,1,0,0,0,0,0,0,0,0,0,0,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,12,1,0,0,0,0,0,0,0,0,0,0,0,0, +- 0,0,0,0,0,0,0,0,0,0,0,0,9,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 13,9,10,13,14,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,3,0,0,0,0,0,0,0,0,0,0,0, +- 0,0,0,0,0,2,5,6,0,0,0,0,12,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 5,0,0,0,3,10,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,14,9,2,1,0,0,0,1,4,6,6,1, +- 0,0,0,8,13,15,15,15,12,1,0,2,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, +- 2,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,3,0,0,10,15,15,15,10, +- 0,0,4,15,15,15,15,15,15,2,0,6,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,5, +- 3,11,5,0,0,0,0,0,4,11,14,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,0,13,15,15,15,11, +- 0,0,7,15,15,15,15,15,15,1,0,9,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,9,0, +- 13,15,15,12,5,0,0,0,0,0,1,8,14,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,1,14,15,15,15,11, +- 0,0,7,15,15,15,15,15,14,0,0,9,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,11,1,10, +- 15,15,15,15,15,11,5,0,0,0,0,0,1,6,13,15, +- 15,15,15,15,14,8,11,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,6,0,2,15,15,15,15,11, +- 0,0,6,15,15,15,15,15,13,0,0,11,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,11,1,6,15, +- 15,15,15,15,15,15,15,14,5,0,0,0,0,0,0,6, +- 14,15,15,15,6,0,4,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,5,15,15,15,15,11, +- 0,0,5,15,15,15,15,15,12,0,0,12,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,13,2,1,13,15, +- 15,15,15,15,15,15,15,15,15,12,2,0,0,0,0,0, +- 1,6,11,7,0,0,4,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,7,15,15,15,15,11, +- 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,5,0,7,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,11,5,0,0,0, +- 0,0,0,0,0,1,11,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, +- 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,10,0,4,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,13,7,0, +- 0,0,0,0,0,1,6,12,14,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, +- 0,0,7,15,15,15,15,15,12,0,0,12,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,13,1,1,12,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, +- 5,0,0,0,0,0,0,0,3,10,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, +- 0,0,7,15,15,15,15,15,11,0,0,13,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,14,4,0,8,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 13,0,0,0,1,0,0,0,0,1,13,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, +- 0,0,8,15,15,15,15,15,8,0,2,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,9,0,4,14,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, +- 4,0,0,5,13,12,6,2,0,2,13,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, +- 0,0,7,15,15,15,15,15,4,0,4,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,13,1,1,13,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, +- 0,0,1,13,15,15,15,14,9,13,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,5,0,6,15,15,15,15,11, +- 0,0,8,15,15,15,15,15,2,0,8,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,5,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,11,15,15,15,15,15,15,15,9, +- 0,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11, +- 0,0,7,15,15,15,15,13,0,0,11,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,10,0,3,14,15,15,15,15,15,15, +- 15,15,15,15,15,14,3,0,13,15,15,15,15,15,15,14, +- 9,11,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11, +- 0,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,14,2,1,12,15,15,15,15,15,15,15, +- 15,15,15,15,14,3,0,0,9,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,6,0,3,15,15,15,15,13, +- 1,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,9,0,5,15,15,15,15,15,15,15,15, +- 15,15,15,14,4,0,0,0,10,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,8,0,2,15,15,15,15,15, +- 3,0,13,15,15,15,15,12,0,0,12,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,13,2,1,12,15,15,15,15,15,15,15,15, +- 15,15,15,7,0,0,0,0,8,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,10,0,1,14,15,15,15,15, +- 11,5,15,15,15,15,15,12,0,0,11,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,6,0,7,15,15,15,15,15,15,15,15,15, +- 15,15,8,0,0,0,0,0,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,12,0,0,12,15,15,15,15, +- 15,14,15,15,15,15,15,10,0,0,12,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,13,1,2,14,15,15,15,15,15,15,15,15,15, +- 15,10,0,0,0,6,6,0,0,0,5,12,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,12, +- 15,15,15,15,15,15,15,15,13,0,0,11,15,15,15,15, +- 15,15,15,15,15,15,15,9,0,1,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,7,0,8,15,15,15,15,15,15,15,15,15,15, +- 15,9,0,0,4,15,15,8,0,0,0,1,5,13,15,15, +- 15,15,15,15,15,15,15,15,15,15,12,8,7,6,5,3, +- 3,3,4,12,15,15,15,15,15,15,15,15,15,7,0,6, +- 15,15,15,15,15,15,15,15,14,1,0,10,15,15,15,15, +- 15,15,15,15,15,15,15,6,0,3,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,13,1,0,13,15,15,15,15,15,15,15,15,15,15, +- 15,14,7,8,13,15,15,15,11,2,0,0,0,0,5,11, +- 15,15,15,15,15,15,15,15,13,3,0,0,0,0,0,0, +- 0,0,0,5,15,15,15,15,15,15,15,15,12,1,0,0, +- 3,11,15,15,15,15,15,15,13,1,0,10,15,15,15,15, +- 15,15,15,15,15,15,15,3,0,5,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,9,0,5,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,14,8,1,0,0,0,0, +- 4,12,15,15,15,15,15,15,4,0,0,0,0,0,0,0, +- 0,0,0,2,15,15,15,15,15,15,15,14,4,0,0,0, +- 0,0,9,15,15,15,15,15,14,1,0,10,15,15,15,15, +- 15,15,15,15,15,15,15,2,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,14,4,0,11,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,14,8,2,0,0, +- 0,0,4,10,14,15,15,15,4,0,0,0,0,0,0,0, +- 0,0,0,3,15,15,15,15,15,15,15,6,0,0,0,2, +- 3,0,0,8,15,15,15,15,14,1,0,10,15,15,15,15, +- 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 14,5,0,4,14,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,14,9,3, +- 0,0,0,0,2,5,10,15,5,0,1,11,11,12,13,15, +- 11,0,0,7,15,15,15,15,15,15,8,0,0,0,1,12, +- 14,6,0,0,7,14,15,15,14,1,0,9,15,15,15,15, +- 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 9,0,1,13,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, +- 10,2,0,0,0,0,1,14,4,0,1,14,15,15,15,15, +- 9,0,0,9,15,15,15,15,15,9,0,0,0,0,9,15, +- 15,15,7,0,0,6,14,15,15,3,0,6,15,15,15,15, +- 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9, +- 0,0,1,10,14,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,13,1,0,0,0,1,14,3,0,0,14,15,15,15,15, +- 5,0,0,11,15,15,15,15,13,1,0,0,0,6,15,15, +- 15,15,15,8,0,0,2,10,15,6,0,3,15,15,15,15, +- 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1, +- 0,0,0,0,3,9,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,6,1,0,0,0,8,15,1,0,0,14,15,15,15,15, +- 4,0,0,13,15,15,15,14,4,0,0,0,3,14,15,15, +- 15,15,15,15,5,0,0,1,14,9,0,1,14,15,15,15, +- 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1, +- 0,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 9,0,0,0,0,7,15,15,1,0,0,14,15,15,15,14, +- 2,0,1,14,15,15,15,12,0,0,0,3,13,15,15,15, +- 15,15,15,9,0,0,0,1,14,12,0,0,12,15,15,15, +- 15,15,15,15,15,15,14,1,0,10,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, +- 3,0,0,0,0,0,0,1,8,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9, +- 0,0,0,0,7,15,15,15,1,0,0,14,15,15,15,13, +- 0,0,1,15,15,15,15,12,0,0,0,6,14,15,15,15, +- 15,15,12,0,0,0,0,3,14,12,0,0,12,15,15,15, +- 15,15,15,15,15,15,12,0,0,12,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,13,3,0,0,0,0,0,0,1,6,13,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,0, +- 0,0,0,3,15,15,15,12,0,0,0,14,15,15,15,11, +- 0,0,3,15,15,15,15,15,12,7,0,0,4,14,15,15, +- 15,11,1,0,0,0,4,13,15,12,0,0,12,15,15,15, +- 15,15,15,15,15,15,10,0,1,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,7,0,0,0,0,0,0,0,3,8,12,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,4,0, +- 0,0,1,13,15,15,15,6,0,0,0,14,15,15,15,8, +- 0,0,7,15,15,15,15,15,15,15,8,1,0,2,13,15, +- 14,2,0,0,0,4,14,15,15,13,1,0,10,15,15,15, +- 15,15,15,15,15,15,9,0,2,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,11,6,2,0,0,0,0,0,0,0,1, +- 10,15,15,15,15,15,15,15,15,15,15,15,15,8,0,0, +- 0,0,10,15,15,15,15,4,0,0,1,15,15,15,15,4, +- 0,0,8,15,15,15,15,15,15,15,15,10,1,0,1,8, +- 2,0,0,0,5,15,15,15,15,15,2,0,6,15,15,15, +- 15,15,15,15,15,15,9,0,1,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,9,1,0,0,0,0,0,0, +- 0,1,7,13,14,15,15,15,15,15,15,15,9,0,0,0, +- 0,6,15,15,15,15,15,4,0,0,4,15,15,15,14,1, +- 0,0,9,15,15,15,15,15,15,15,15,15,12,2,0,0, +- 0,0,0,4,14,15,15,15,15,15,4,0,4,15,15,15, +- 15,15,15,15,15,15,7,0,0,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,14,11,6,2,0,0,0, +- 0,0,0,0,1,9,12,15,15,15,15,14,3,0,0,0, +- 4,15,15,15,15,15,15,4,0,0,3,6,4,4,2,0, +- 0,0,13,15,15,15,15,15,15,15,15,15,15,12,1,0, +- 0,0,3,14,15,15,15,15,15,15,4,0,4,15,15,15, +- 15,15,15,15,15,15,5,0,0,12,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,8,2,0, +- 0,0,0,0,0,0,0,1,9,15,15,5,0,0,0,0, +- 12,15,15,15,15,15,15,4,0,0,0,0,0,0,0,0, +- 0,3,15,15,15,15,15,15,15,15,15,15,15,14,4,0, +- 0,1,12,15,15,15,15,15,15,15,6,0,1,14,15,15, +- 15,15,15,15,15,15,5,0,0,13,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, +- 7,1,0,0,0,0,0,0,0,5,7,0,0,0,0,10, +- 15,15,15,15,15,15,15,7,0,0,0,0,0,0,0,0, +- 1,10,15,15,15,15,15,15,15,15,15,15,15,14,3,0, +- 3,12,15,15,15,15,15,15,15,15,12,0,0,12,15,15, +- 15,15,15,15,15,15,5,0,0,1,1,4,11,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,11,6,1,0,0,0,0,0,0,0,0,0,7,15, +- 15,15,15,15,15,15,15,14,7,4,4,4,5,9,12,13, +- 14,15,15,15,15,15,15,15,15,15,15,15,15,15,11,9, +- 14,15,15,14,12,11,11,11,10,9,7,0,0,5,13,15, +- 15,15,15,15,15,12,1,0,0,0,0,0,0,10,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,14,7,1,0,0,0,0,0,3,14,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,13,2,0,0,0,0,0,0,0,0,0,0,0,8, +- 15,15,15,15,15,11,0,0,0,0,0,0,0,9,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,13,5,0,0,0,0,12,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,8,0,0,0,0,0,0,0,0,0,0,0,0,5, +- 15,15,15,15,15,15,10,5,6,7,7,7,9,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,8,3,2,2,2,2,5,14,15, +- 15,15,15,15,15,15,15,15,15,10,3,0,6,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,13,3,1,0,1,0,1,1,2,4,4,3,9,14, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,12,4,0,1,6,7,7,4,1,3,13, +- 15,15,15,15,15,15,15,15,15,15,14,10,13,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,11,11,15,15,15,15, +- 15,15,15,14,14,14,14,14,14,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,14,2,0,4,13,15,15,15,15,10,0,12, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,13,14,12,12,12,12,12,12,12, +- 12,14,15,15,15,15,15,15,15,15,4,14,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,7,1,5,14,15,15,15,15,15,12,1,11, +- 15,15,15,13,12,13,15,15,14,11,13,15,15,15,15,15, +- 15,15,15,11,6,3,1,1,1,0,0,0,0,0,0,0, +- 0,1,4,7,11,14,15,15,15,14,4,15,13,10,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,14,7,4,5, +- 12,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,13,1,1,14,15,15,14,10,12,15,11,1,12, +- 15,15,11,1,0,4,15,15,6,0,2,14,15,15,15,15, +- 15,15,14,8,6,3,3,2,2,1,0,0,0,0,0,0, +- 0,0,0,0,0,3,11,15,15,11,8,15,12,6,15,9, +- 8,15,15,15,15,15,15,15,15,15,15,15,10,4,4,1, +- 4,15,15,15,15,11,6,2,8,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,0,4,15,15,15,11,2,10,15,9,1,13, +- 15,13,1,7,6,2,14,14,1,2,1,14,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,13,12,12,12,12,12,12, +- 11,11,11,10,9,10,12,15,15,6,7,15,9,4,15,4, +- 1,14,15,15,15,15,15,15,15,15,15,15,2,11,15,4, +- 4,15,15,15,15,3,9,4,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,0,4,15,15,15,5,0,6,6,1,9,15, +- 15,4,1,13,10,1,13,9,2,7,1,14,14,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,3,5,15,3,5,14,1, +- 0,12,13,9,14,15,15,15,15,15,15,15,2,2,4,1, +- 6,15,15,15,14,1,5,6,0,9,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,0,4,15,15,15,12,4,2,2,10,15,15, +- 11,0,6,15,12,0,10,7,9,10,1,14,7,14,15,15, +- 15,15,15,15,15,15,13,12,11,11,10,9,9,10,11,13, +- 15,15,15,15,15,15,15,15,15,1,9,15,2,7,14,1, +- 0,10,7,0,8,15,15,15,15,15,15,15,11,4,4,4, +- 13,15,15,15,15,10,2,2,4,14,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,15, +- 4,2,14,15,15,1,9,5,14,9,1,14,8,14,15,15, +- 15,15,15,15,15,10,3,0,1,0,0,0,0,0,0,5, +- 15,15,15,15,15,15,15,15,15,1,9,14,1,8,14,1, +- 0,11,13,6,11,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,11, +- 0,6,15,15,15,1,5,3,13,10,0,6,8,15,15,15, +- 15,15,15,15,15,15,13,12,12,11,10,9,9,10,11,13, +- 15,15,15,15,15,15,15,15,15,1,9,12,1,11,15,4, +- 1,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 14,10,4,2,12,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,12,1,3,14,15,15,15,15,15,15,15,15,4, +- 3,14,15,15,15,5,1,8,15,14,5,2,9,15,15,15, +- 15,15,15,15,15,15,15,15,15,11,9,13,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,1,9,12,1,12,15,13, +- 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 10,2,9,2,3,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,14,4,0,5,14,15,15,15,15,15,15,11,0, +- 6,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,8,1,0,3,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,1,9,15,11,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 7,1,12,6,1,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,11,1,0,3,8,9,9,10,11,9,5,4, +- 13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,12,9,13,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,5,11,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 10,3,4,1,5,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,12,2,0,0,0,0,0,0,1,8,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,14,12,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,13,8,8,10,9,10,11,14,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, +- 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 +- }; +diff -Naur /home/d4rk/goom2k4-0/src/plugin_info.c /src/plugin_info.c +--- /home/d4rk/goom2k4-0/src/plugin_info.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/plugin_info.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,202 +0,0 @@ +-#include "goom_plugin_info.h" +-#include "goom_fx.h" +-#include "cpu_info.h" +-#include "default_scripts.h" +-#include "drawmethods.h" +-#include <math.h> +-#include <stdio.h> +- +- +-#ifdef CPU_POWERPC +-#include <sys/types.h> +-#include <sys/sysctl.h> +-#include "ppc_zoom_ultimate.h" +-#include "ppc_drawings.h" +-#endif /* CPU_POWERPC */ +- +- +-#ifdef CPU_X86 +-#include "mmx.h" +-#endif /* CPU_X86 */ +- +- +- +-static void setOptimizedMethods(PluginInfo *p) { +- +- unsigned int cpuFlavour = cpu_flavour(); +- +- /* set default methods */ +- p->methods.draw_line = draw_line; +- p->methods.zoom_filter = zoom_filter_c; +-/* p->methods.create_output_with_brightness = create_output_with_brightness;*/ +- +-#ifdef CPU_X86 +- if (cpuFlavour & CPU_OPTION_XMMX) { +-#ifdef VERBOSE +- printf ("Extented MMX detected. Using the fastest methods !\n"); +-#endif +- p->methods.draw_line = draw_line_mmx; +- p->methods.zoom_filter = zoom_filter_xmmx; +- } +- else if (cpuFlavour & CPU_OPTION_MMX) { +-#ifdef VERBOSE +- printf ("MMX detected. Using fast methods !\n"); +-#endif +- p->methods.draw_line = draw_line_mmx; +- p->methods.zoom_filter = zoom_filter_mmx; +- } +-#ifdef VERBOSE +- else +- printf ("Too bad ! No SIMD optimization available for your CPU.\n"); +-#endif +-#endif /* CPU_X86 */ +- +-#ifdef CPU_POWERPC +- +- if ((cpuFlavour & CPU_OPTION_64_BITS) != 0) { +-/* p->methods.create_output_with_brightness = ppc_brightness_G5; */ +- p->methods.zoom_filter = ppc_zoom_generic; +- } +- else if ((cpuFlavour & CPU_OPTION_ALTIVEC) != 0) { +-/* p->methods.create_output_with_brightness = ppc_brightness_G4; */ +- p->methods.zoom_filter = ppc_zoom_G4; +- } +- else +- { +-/* p->methods.create_output_with_brightness = ppc_brightness_generic;*/ +- p->methods.zoom_filter = ppc_zoom_generic; +- } +-#endif /* CPU_POWERPC */ +- +-} +- +-void plugin_info_init(PluginInfo *pp, int nbVisuals) { +- +- PluginInfo p; +- int i; +- +- p.sound.speedvar = p.sound.accelvar = p.sound.totalgoom = 0; +- p.sound.prov_max = 0; +- p.sound.goom_limit = 1; +- p.sound.allTimesMax = 1; +- +- p.sound.volume_p = secure_f_feedback("Sound Volume"); +- p.sound.accel_p = secure_f_feedback("Sound Acceleration"); +- p.sound.speed_p = secure_f_feedback("Sound Speed"); +- p.sound.goom_limit_p = secure_f_feedback("Goom Limit"); +- p.sound.last_goom_p = secure_f_feedback("Goom Detection"); +- p.sound.last_biggoom_p = secure_f_feedback("Big Goom Detection"); +- p.sound.goom_power_p = secure_f_feedback("Goom Power"); +- +- p.sound.biggoom_speed_limit_p = secure_i_param("Big Goom Speed Limit"); +- IVAL(p.sound.biggoom_speed_limit_p) = 10; +- IMIN(p.sound.biggoom_speed_limit_p) = 0; +- IMAX(p.sound.biggoom_speed_limit_p) = 100; +- ISTEP(p.sound.biggoom_speed_limit_p) = 1; +- +- p.sound.biggoom_factor_p = secure_i_param("Big Goom Factor"); +- IVAL(p.sound.biggoom_factor_p) = 10; +- IMIN(p.sound.biggoom_factor_p) = 0; +- IMAX(p.sound.biggoom_factor_p) = 100; +- ISTEP(p.sound.biggoom_factor_p) = 1; +- +- p.sound.params = plugin_parameters ("Sound", 11); +- +- p.nbParams = 0; +- p.nbVisuals = nbVisuals; +- p.visuals = (VisualFX**)malloc(sizeof(VisualFX*)*nbVisuals); +- +- *pp = p; +- pp->sound.params.params[0] = &pp->sound.biggoom_speed_limit_p; +- pp->sound.params.params[1] = &pp->sound.biggoom_factor_p; +- pp->sound.params.params[2] = 0; +- pp->sound.params.params[3] = &pp->sound.volume_p; +- pp->sound.params.params[4] = &pp->sound.accel_p; +- pp->sound.params.params[5] = &pp->sound.speed_p; +- pp->sound.params.params[6] = 0; +- pp->sound.params.params[7] = &pp->sound.goom_limit_p; +- pp->sound.params.params[8] = &pp->sound.goom_power_p; +- pp->sound.params.params[9] = &pp->sound.last_goom_p; +- pp->sound.params.params[10] = &pp->sound.last_biggoom_p; +- +- pp->statesNumber = 8; +- pp->statesRangeMax = 510; +- { +- GoomState states[8] = { +- {1,0,0,1,4, 0, 100}, +- {1,0,0,0,1, 101, 140}, +- {1,0,0,1,2, 141, 200}, +- {0,1,0,1,2, 201, 260}, +- {0,1,0,1,0, 261, 330}, +- {0,1,1,1,4, 331, 400}, +- {0,0,1,0,5, 401, 450}, +- {0,0,1,1,1, 451, 510}}; +- for (i=0;i<8;++i) +- pp->states[i] = states[i]; +- } +- pp->curGState = &(pp->states[6]); +- +- /* datas for the update loop */ +- pp->update.lockvar = 0; +- pp->update.goomvar = 0; +- pp->update.loopvar = 0; +- pp->update.stop_lines = 0; +- pp->update.ifs_incr = 1; /* dessiner l'ifs (0 = non: > = increment) */ +- pp->update.decay_ifs = 0; /* disparition de l'ifs */ +- pp->update.recay_ifs = 0; /* dedisparition de l'ifs */ +- pp->update.cyclesSinceLastChange = 0; +- pp->update.drawLinesDuration = 80; +- pp->update.lineMode= pp->update.drawLinesDuration; +- +- pp->update.switchMultAmount = (29.0f/30.0f); +- pp->update.switchIncrAmount = 0x7f; +- pp->update.switchMult = 1.0f; +- pp->update.switchIncr = pp->update.switchIncrAmount; +- +- pp->update.stateSelectionRnd = 0; +- pp->update.stateSelectionBlocker = 0; +- pp->update.previousZoomSpeed = 128; +- pp->update.timeOfTitleDisplay = 0; +- +- pp->update_message.affiche = 0; +- +- { +- ZoomFilterData zfd = { +- 127, 8, 16, +- 1, 1, 0, NORMAL_MODE, +- 0, 0, 0, 0, 0 +- }; +- pp->update.zoomFilterData = zfd; +- } +- +- setOptimizedMethods(pp); +- +- pp->scanner = gsl_new(); +- pp->main_scanner = gsl_new(); +- pp->main_script_str = GOOM_MAIN_SCRIPT; +- +- for (i = 0; i < 0xffff; i++) { +- pp->sintable[i] = (int) (1024 * sin ((double) i * 360 / (sizeof (pp->sintable) / sizeof (pp->sintable[0]) - 1) * 3.141592 / 180) + .5); +- /* sintable [us] = (int)(1024.0f * sin (us*2*3.31415f/0xffff)) ; */ +- } +-} +- +-void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual) { +- p->visuals[i] = visual; +- if (i == p->nbVisuals-1) { +- ++i; +- p->nbParams = 1; +- while (i--) { +- if (p->visuals[i]->params) +- p->nbParams++; +- } +- p->params = (PluginParameters *)malloc(sizeof(PluginParameters)*p->nbParams); +- i = p->nbVisuals; +- p->nbParams = 1; +- p->params[0] = p->sound.params; +- while (i--) { +- if (p->visuals[i]->params) +- p->params[p->nbParams++] = *(p->visuals[i]->params); +- } +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/pngload.c /src/pngload.c +--- /home/d4rk/goom2k4-0/src/pngload.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/pngload.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,141 +0,0 @@ +-#include <png.h> +- +-int +-loadpng (char *file_name, int *w, int *h, unsigned int ***buf) +-{ +- FILE *fp; +- png_uint_32 width, height; +- int bit_depth, +- +- color_type, interlace_type, compression_type, filter_type; +- int rowbytes; +- +- png_structp png_ptr; +- png_infop info_ptr; +- png_infop end_info; +- +- int x, y; +- unsigned int **row_pointers; +- +- /* OUVERTURE DU FICHIER */ +- +- fp = fopen (file_name, "rb"); +- +- if (!fp) { +- // fprintf (stderr, "Couldn't open file\n"); +- return 1; +- } +- +- /* CREATION DES STRUCTURES */ +- png_ptr = png_create_read_struct +- (PNG_LIBPNG_VER_STRING, (png_voidp) NULL, NULL, NULL); +- if (!png_ptr) { +- fprintf (stderr, "Memory error\n"); +- return 1; +- } +- +- info_ptr = png_create_info_struct (png_ptr); +- if (!info_ptr) { +- png_destroy_read_struct (&png_ptr, (png_infopp) NULL, (png_infopp) NULL); +- fprintf (stderr, "Read error 1\n"); +- return 1; +- } +- +- end_info = png_create_info_struct (png_ptr); +- if (!end_info) { +- png_destroy_read_struct (&png_ptr, &info_ptr, (png_infopp) NULL); +- fprintf (stderr, "Read error 2\n"); +- return 1; +- } +- +- /* CHARGEMENT DE L'IMAGE */ +- if (setjmp (png_ptr->jmpbuf)) { +- png_destroy_read_struct (&png_ptr, &info_ptr, &end_info); +- fclose (fp); +- fprintf (stderr, "Erreur de chargement\n"); +- return 1; +- } +- +- png_init_io (png_ptr, fp); +- png_set_read_status_fn (png_ptr, NULL); +- +- png_read_info (png_ptr, info_ptr); +- +- png_get_IHDR (png_ptr, info_ptr, &width, &height, +- &bit_depth, &color_type, &interlace_type, +- &compression_type, &filter_type); +-/* +- printf ("taille : %dx%d\n",width,height); +- printf ("depth : %d\n",bit_depth); +- printf ("color type : "); +- switch (color_type) { +- case PNG_COLOR_TYPE_GRAY: +- printf ("PNG_COLOR_TYPE_GRAY (bit depths 1, 2, 4, 8, 16)\n"); +- break; +- case PNG_COLOR_TYPE_GRAY_ALPHA: +- printf ("PNG_COLOR_TYPE_GRAY_ALPHA (bit depths 8, 16)\n"); +- break; +- case PNG_COLOR_TYPE_PALETTE: +- printf ("PNG_COLOR_TYPE_PALETTE (bit depths 1, 2, 4, 8)\n"); +- break; +- case PNG_COLOR_TYPE_RGB: +- printf ("PNG_COLOR_TYPE_RGB (bit_depths 8, 16)\n"); +- break; +- case PNG_COLOR_TYPE_RGB_ALPHA: +- printf ("PNG_COLOR_TYPE_RGB_ALPHA (bit_depths 8, 16)\n"); +- break; +- } +- */ +- // printf ("PNG_COLOR_MASK_ALPHA : %x\n", PNG_COLOR_MASK_ALPHA); +- // printf ("PNG_COLOR_MASK_COLOR : %x\n", PNG_COLOR_MASK_COLOR); +- // printf ("PNG_COLOR_MASK_PALETTE : %x\n", PNG_COLOR_MASK_PALETTE); +- +- if (color_type == PNG_COLOR_TYPE_PALETTE && bit_depth <= 8) +- png_set_palette_to_rgb (png_ptr); +- +- if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) +- png_set_gray_1_2_4_to_8 (png_ptr); +- else if (color_type == PNG_COLOR_TYPE_GRAY || +- color_type == PNG_COLOR_TYPE_GRAY_ALPHA) +- png_set_gray_to_rgb (png_ptr); +- +- if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS)) +- png_set_tRNS_to_alpha (png_ptr); +- +- png_read_update_info (png_ptr, info_ptr); +- +-// printf ("channels : %d\n", png_get_channels (png_ptr, info_ptr)); +- rowbytes = png_get_rowbytes (png_ptr, info_ptr); +-// printf ("rowbytes : %d\n", rowbytes); +- +- row_pointers = (unsigned int **) malloc (height * sizeof (unsigned int *)); +- +- for (y = 0; y < height; y++) +- row_pointers[y] = (unsigned int *) malloc (4 * width); +- png_read_image (png_ptr, (png_bytepp) row_pointers); +- +- // for (y=0;y<height;y++) { +-// for (x=0;x<width;x++) { +-// if (row_pointers[y][x] & 0xf000) +- // printf ("%x ",(((unsigned int**)row_pointers)[y][x])&0xf); +- // else +-// printf (" "); +- // } +- // printf ("\n"); +- // } +- +- png_read_end (png_ptr, end_info); +- png_destroy_read_struct (&png_ptr, &info_ptr, &end_info); +- +- (*buf) = (unsigned int **) malloc (height * sizeof (void *)); +- +- for (y = 0; y < height; y++) { +- (*buf)[y] = (unsigned int *) malloc (width * 4); +- for (x = 0; x < width; x++) +- (*buf)[y][x] = row_pointers[y][x]; +- } +- *w = width; +- *h = height; +- +- return 0; +-} +diff -Naur /home/d4rk/goom2k4-0/src/powerpc/Copie de ppc_zoom_ultimate.s /src/powerpc/Copie de ppc_zoom_ultimate.s +--- /home/d4rk/goom2k4-0/src/powerpc/Copie de ppc_zoom_ultimate.s 2005-02-07 06:46:41.000000000 -0700 ++++ /src/powerpc/Copie de ppc_zoom_ultimate.s 1969-12-31 17:00:00.000000000 -0700 +@@ -1,305 +0,0 @@ +-; PowerPC optimized zoom for Goom +-; © 2001-2003 Guillaume Borios +-; This Source Code is released under the terms of the General Public License +- +-; Change log : +-; 21 Dec 2003 : Use of altivec is now determined with a parameter +- +-; Section definition : We use a read only section +-.text +- +-; name of the function to call by C program : ppc_zoom +-; We declare this label as a global to extend its scope outside this file +-.globl _ppc_zoom_generic +-.globl _ppc_zoom_G4 +- +-; Description : +-; This routine dynamically computes and applies a zoom filter +- +-; parameters : +-; r3 <=> unsigned int * frompixmap +-; r4 <=> unsigned int * topixmap +-; r5 <=> unsigned int sizeX (in pixels) +-; r6 <=> unsigned int sizeY (in pixels) +-; r7 <=> unsigned int * brutS +-; r8 <=> unsigned int * brutD +-; r9 <=> unsigned int buffratio +-; r10 <=> int [16][16] precalccoeffs +- +-; globals after init +-; r3 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r3) +-; r4 <=> topixmap - 1 byte needed for preincremental fetch (replaces r4) +-; r5 <=> ax = x max in 16th of pixels (replaces old r5) +-; r6 <=> ay = y max in 16th of pixels (replaces old r6) +-; r20 <=> row size in bytes +-; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing) +-; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7) +-; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8) +- +-; ABI notes : +-; r1 is the Stack Pointer (SP) => Do not use +-; r13..r31 are non-volatiles => Do not use +- +-_ppc_zoom_generic: +- +-; Saves the used non volatile registers in the Mach-O stack s Red-Zone +-stmw r18,-56(r1) +- +-; init +-li r18,0 ; Default value if out of range : 0 (Black) +-mr r11,r10 +-lis r12,0xFF +-mullw r2,r5,r6 ; Number of pixels to compute +-subi r30,r8,0 +-slwi r20,r5,2 +-srawi r19,r20,2 +-ori r12,r12,0xFF +-subi r5,r5,1 +-subi r6,r6,1 +-mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +-subi r31,r7,0 +-subi r4,r4,4 +-slwi r5,r5,4 +-slwi r6,r6,4 +- +-;pre init for loop +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +- +-L1: +- +-; computes dynamically the position to fetch +-sub r8,r8,r2 +-sub r10,r10,r29 +-mullw r8,r8,r9 +-addi r31,r31,8 +-mullw r10,r10,r9 +-addi r30,r30,8 +- +-srawi r8,r8,16 +-srawi r10,r10,16 +-add r2,r2,r8 +-add r29,r29,r10 +- +-; if px>ax or py>ay goto outofrange +-; computes the attenuation coeffs and the original point address +-rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +-cmpl cr6,0,r2,r5 +-rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10) +-cmpl cr7,0,r29,r6 +-srawi r29,r29,4 ; pos computing +-bge- cr6,L4 +-srawi r2,r2,4 ; pos computing +-mullw r29, r29,r19 ; pos computing +-bge- cr7,L4 +- +-; Channels notation : 00112233 (AARRVVBB) +- +-add r2,r2,r29 ; pos computing +-lwzx r10,r11,r10 ; Loads coefs +-slwi r2,r2,2 ; pos computing +-add r2,r2,r3 ; pos computing +-rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +-lwz r25,0(r2) ; Loads col1 -> r25 +-lwz r26,4(r2) ; Loads col2 -> r26 +-rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +-rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +-add r2,r2,r20 ; Adds one line for future load of col3 and col4 +-and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +-rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +-andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +-mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 +- +- +-; computes final pixel color +-and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +-lwz r27,0(r2) ; Loads col3 -> r27 +-mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +-mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +-andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +-mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +-lwz r28,4(r2) ; Loads col4 -> r28 +-add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +-and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +-add r25,r25,r29 ; Adds col1 & col2 channel 2 +-mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +-andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +-mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +-lwz r2,0(r31) ; px +-add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +-and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +-mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +-add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +-lwz r8,0(r30) ; px2 +-andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +-add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +-lwz r10,4(r30) ; py2 +-mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +-srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +-lwz r29,4(r31) ; py +-add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +-rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +-stwu r7,4(r4) ; Stores the computed pixel +-bdnz L1 ; Iterate again if needed +-b L3 ;goto end ; If not, returns from the function +- +- +-; if out of range +-L4: +-stwu r18,4(r4) +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-bdnz L1 +- +- +-L3: +- +-; Restore saved registers and return +-lmw r18,-56(r1) +-blr +- +- +- +- +- +- +- +- +-_ppc_zoom_G4: +- +-; Saves the used non volatile registers in the Mach-O stack s Red-Zone +-stmw r17,-60(r1) +- +-; init +-li r18,0 ; Default value if out of range : 0 (Black) +-mr r11,r10 +-lis r12,0xFF +-mullw r2,r5,r6 ; Number of pixels to compute +-subi r30,r8,0 +-slwi r20,r5,2 +-srawi r19,r20,2 +-ori r12,r12,0xFF +-subi r5,r5,1 +-subi r6,r6,1 +-mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +-subi r31,r7,0 +-subi r4,r4,4 +-slwi r5,r5,4 +-slwi r6,r6,4 +- +-;pre init for loop +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +- +-;********************* +-lis r17,0x0F01 +- +-L100: +- +-; computes dynamically the position to fetch +-;mullw r8,r8,r29 +-;mullw r2,r2,r29 +-;add r2,r8,r2 +-;srawi r2,r2,17 +- +-sub r8,r8,r2 +-sub r10,r10,r29 +-mullw r8,r8,r9 +-addi r31,r31,8 +-mullw r10,r10,r9 +-addi r30,r30,8 +- +-dst r30,r17,0 +- +-srawi r8,r8,16 +-srawi r10,r10,16 +-add r2,r2,r8 +-add r29,r29,r10 +- +-dst r31,r17,1 +- +-; if px>ax or py>ay goto outofrange +-; computes the attenuation coeffs and the original point address +-rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +-cmpl cr6,0,r2,r5 +-rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10) +-cmpl cr7,0,r29,r6 +-srawi r29,r29,4 ; pos computing +-bge- cr6,L400 +-srawi r2,r2,4 ; pos computing +-mullw r29, r29,r19 ; pos computing +-bge- cr7,L400 +- +-; Channels notation : 00112233 (AARRVVBB) +- +-add r2,r2,r29 ; pos computing +-lwzx r10,r11,r10 ; Loads coefs +-slwi r2,r2,2 ; pos computing +-add r2,r2,r3 ; pos computing +-rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +-lwz r25,0(r2) ; Loads col1 -> r25 +-lwz r26,4(r2) ; Loads col2 -> r26 +-rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +-rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +-add r2,r2,r20 ; Adds one line for future load of col3 and col4 +-and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +-rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +-dst r2,r17,2 +-andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +-mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 +- +- +-; computes final pixel color +-and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +-lwz r27,0(r2) ; Loads col3 -> r27 +-mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +-mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +-andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +-mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +-lwz r28,4(r2) ; Loads col4 -> r28 +-add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +-and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +-add r25,r25,r29 ; Adds col1 & col2 channel 2 +-mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +-andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +-mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +-lwz r2,0(r31) ; px +-add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +-and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +-mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +-add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +-lwz r8,0(r30) ; px2 +-andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +-add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +-lwz r10,4(r30) ; py2 +-mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +-srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +-lwz r29,4(r31) ; py +-add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +-rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +-stwu r7,4(r4) ; Stores the computed pixel +-bdnz L100 ; Iterate again if needed +-b L300 ;goto end ; If not, returns from the function +- +- +-; if out of range +-L400: +-stwu r18,4(r4) +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-bdnz L100 +- +- +-L300: +- +-; Restore saved registers and return +-lmw r17,-60(r1) +-blr +diff -Naur /home/d4rk/goom2k4-0/src/powerpc/ppc_doubling.s /src/powerpc/ppc_doubling.s +--- /home/d4rk/goom2k4-0/src/powerpc/ppc_doubling.s 2005-02-07 06:46:41.000000000 -0700 ++++ /src/powerpc/ppc_doubling.s 1969-12-31 17:00:00.000000000 -0700 +@@ -1,50 +0,0 @@ +-.section regular,__TEXT +-.globl _ppc_doubling ; name of the function to call by C program +- +-; width (src width)->r3 +-; myx (src) ->r4 +-; myX (dest) ->r5 +-; myX2 (dest + 1 complete line)->r6 +-; heigth (src height)->r7 +-; inc (increment for next line in dest) ->r8 +- +-_ppc_doubling: +- +-mtspr ctr,r3 +- +-addi r4,r4,-4 +-addi r5,r5,-4 +-addi r6,r6,-4 +- +-1:;boucle: +- +-lwzu r10,4(r4) +-stwu r10,4(r5) +-stwu r10,4(r5) +-stwu r10,4(r6) +-stwu r10,4(r6) +- +-bdnz 1boucle +- +-subi r7,r7,1 +-add r5,r5,r8 +-cmpwi cr1,r7,0 +-add r6,r6,r8 +-mtspr ctr,r3 +-bgt cr1,1boucle +- +-blr +- +-;backup +- +-lwzu r10,4(r4) +-stwu r10,4(r5) +-stwu r10,4(r6) +-stwu r10,4(r5) +-stwu r10,4(r6) +- +-lwzu r10,4(r4) +-stwu r10,4(r5) +-stwu r10,4(r6) +-stwu r10,4(r5) +-stwu r10,4(r6) +diff -Naur /home/d4rk/goom2k4-0/src/ppc_drawings.h /src/ppc_drawings.h +--- /home/d4rk/goom2k4-0/src/ppc_drawings.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/ppc_drawings.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,18 +0,0 @@ +-/* +- * ppc_drawings.h +- * Goom +- * +- * Created by Guillaume Borios on Sun Dec 28 2003. +- * Copyright (c) 2003 iOS. All rights reserved. +- * +- */ +- +-/* Generic PowerPC Code */ +-void ppc_brightness_generic(Pixel *src, Pixel *dest, int size, int coeff); +- +-/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */ +-void ppc_brightness_G4(Pixel *src, Pixel *dest, int size, int coeff); +- +-/* G5 Specific PowerPC Code (Possible use of Altivec) */ +-void ppc_brightness_G5(Pixel *src, Pixel *dest, int size, int coeff); +- +diff -Naur /home/d4rk/goom2k4-0/src/ppc_drawings.s /src/ppc_drawings.s +--- /home/d4rk/goom2k4-0/src/ppc_drawings.s 2005-02-07 06:46:41.000000000 -0700 ++++ /src/ppc_drawings.s 1969-12-31 17:00:00.000000000 -0700 +@@ -1,381 +0,0 @@ +-; PowerPC optimized drawing methods for Goom +-; © 2003 Guillaume Borios +-; This Source Code is released under the terms of the General Public License +- +-; Change log : +-; 30 May 2003 : File creation +- +-; Section definition : We use a read only code section for the whole file +-.section __TEXT,__text,regular,pure_instructions +- +- +-; -------------------------------------------------------------------------------------- +-; Single 32b pixel drawing macros +-; Usage : +-; DRAWMETHOD_XXXX_MACRO *pixelIN, *pixelOUT, COLOR, WR1, WR2, WR3, WR4 +-; Only the work registers (WR) can be touched by the macros +-; +-; Available methods : +-; DRAWMETHOD_DFLT_MACRO : Default drawing method (Actually OVRW) +-; DRAWMETHOD_PLUS_MACRO : RVB Saturated per channel addition (SLOWEST) +-; DRAWMETHOD_HALF_MACRO : 50% Transparency color drawing +-; DRAWMETHOD_OVRW_MACRO : Direct COLOR drawing (FASTEST) +-; DRAWMETHOD_B_OR_MACRO : Bitwise OR +-; DRAWMETHOD_BAND_MACRO : Bitwise AND +-; DRAWMETHOD_BXOR_MACRO : Bitwise XOR +-; DRAWMETHOD_BNOT_MACRO : Bitwise NOT +-; -------------------------------------------------------------------------------------- +- +-.macro DRAWMETHOD_OVRW_MACRO +- stw $2,0($1) ;; *$1 <- $2 +-.endmacro +- +-.macro DRAWMETHOD_B_OR_MACRO +- lwz $3,0($0) ;; $3 <- *$0 +- or $3,$3,$2 ;; $3 <- $3 | $2 +- stw $3,0($1) ;; *$1 <- $3 +-.endmacro +- +-.macro DRAWMETHOD_BAND_MACRO +- lwz $3,0($0) ;; $3 <- *$0 +- and $3,$3,$2 ;; $3 <- $3 & $2 +- stw $3,0($1) ;; *$1 <- $3 +-.endmacro +- +-.macro DRAWMETHOD_BXOR_MACRO +- lwz $3,0($0) ;; $3 <- *$0 +- xor $3,$3,$2 ;; $3 <- $3 ^ $2 +- stw $3,0($1) ;; *$1 <- $3 +-.endmacro +- +-.macro DRAWMETHOD_BNOT_MACRO +- lwz $3,0($0) ;; $3 <- *$0 +- nand $3,$3,$3 ;; $3 <- ~$3 +- stw $3,0($1) ;; *$1 <- $3 +-.endmacro +- +-.macro DRAWMETHOD_PLUS_MACRO +- lwz $4,0($0) ;; $4 <- *$0 +- andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00 +- andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00 +- add $3,$3,$5 ;; $3 <- $3 + $5 +- rlwinm $5,$3,15,0,0 ;; $5 <- 0 | ($3[15] << 15) +- srawi $5,$5,23 ;; $5 <- $5 >> 23 (algebraic for sign extension) +- or $3,$3,$5 ;; $3 <- $3 | $5 +- lis $5,0xFF ;; $5 <- 0x00FF00FF +- addi $5,$5,0xFF +- and $4,$4,$5 ;; $4 <- $4 & $5 +- and $6,$2,$5 ;; $6 <- $2 & $5 +- add $4,$4,$6 ;; $4 <- $4 + $6 +- rlwinm $6,$4,7,0,0 ;; $6 <- 0 | ($4[7] << 7) +- srawi $6,$6,15 ;; $6 <- $6 >> 15 (algebraic for sign extension) +- rlwinm $5,$4,23,0,0 ;; $5 <- 0 | ($4[23] << 23) +- srawi $5,$5,31 ;; $5 <- $5 >> 31 (algebraic for sign extension) +- rlwimi $6,$5,0,24,31 ;; $6[24..31] <- $5[24..31] +- or $4,$4,$6 ;; $4 <- $4 | $6 +- rlwimi $4,$3,0,16,23 ;; $4[16..23] <- $3[16..23] +- stw $4,0($1) ;; *$1 <- $4 +-.endmacro +- +-.macro DRAWMETHOD_HALF_MACRO +- lwz $4,0($0) ;; $4 <- *$0 +- andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00 +- andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00 +- add $3,$3,$5 ;; $3 <- $3 + $5 +- lis $5,0xFF ;; $5 <- 0x00FF00FF +- addi $5,$5,0xFF +- and $4,$4,$5 ;; $4 <- $4 & $5 +- and $5,$2,$5 ;; $5 <- $2 & $5 +- add $4,$4,$5 ;; $4 <- $4 + $5 +- srwi $4,$4,1 ;; $4 <- $4 >> 1 +- rlwimi $4,$3,31,16,23 ;; $4[16..23] <- $3[15..22] +- stw $4,0($1) ;; *$1 <- $4 +-.endmacro +- +-.macro DRAWMETHOD_DFLT_MACRO +- DRAWMETHOD_PLUS_MACRO +-.endmacro +- +-; -------------------------------------------------------------------------------------- +- +- +- +-; ************************************************************************************** +-; void DRAWMETHOD_PLUS_PPC(unsigned int * buf, unsigned int _col); +-; void DRAWMETHOD_PLUS_2_PPC(unsigned * in, unsigned int * out, unsigned int _col); +-; ************************************************************************************** +-.globl _DRAWMETHOD_PLUS_2_PPC +-.align 3 +-_DRAWMETHOD_PLUS_2_PPC: +- DRAWMETHOD_PLUS_MACRO r3,r4,r5,r6,r7,r8,r9 +- blr ;; return +- +-.globl _DRAWMETHOD_PLUS_PPC +-.align 3 +-_DRAWMETHOD_PLUS_PPC: +- DRAWMETHOD_PLUS_MACRO r3,r3,r4,r5,r6,r7,r9 +- blr ;; return +- +- +-; ************************************************************************************** +-; void DRAWMETHOD_HALF_PPC(unsigned int * buf, unsigned int _col); +-; void DRAWMETHOD_HALF_2_PPC(unsigned * in, unsigned int * out, unsigned int _col); +-; ************************************************************************************** +-.globl _DRAWMETHOD_HALF_2_PPC +-.align 3 +-_DRAWMETHOD_HALF_2_PPC: +- DRAWMETHOD_HALF_MACRO r3,r4,r5,r6,r7,r8 +- blr ;; return +- +-.globl _DRAWMETHOD_HALF_PPC +-.align 3 +-_DRAWMETHOD_HALF_PPC: +- DRAWMETHOD_HALF_MACRO r3,r3,r4,r5,r6,r7 +- blr ;; return +- +- +-; ************************************************************************************** +-; void DRAW_LINE_PPC(unsigned int *data, int x1, int y1, int x2, int y2, unsigned int col, +-; unsigned int screenx, unsigned int screeny) +-; ************************************************************************************** +-.globl _DRAW_LINE_PPC +-.align 3 +-_DRAW_LINE_PPC: +- ;; NOT IMPLEMENTED YET +- blr ;; return +- +- +-; ************************************************************************************** +-; void _ppc_brightness(Pixel * src, Pixel * dest, unsigned int size, unsigned int coeff) +-; ************************************************************************************** +- +- +-.const +-.align 4 +-vectorZERO: +- .long 0,0,0,0 +- .long 0x10101000, 0x10101001, 0x10101002, 0x10101003 +- .long 0x10101004, 0x10101005, 0x10101006, 0x10101007 +- .long 0x10101008, 0x10101009, 0x1010100A, 0x1010100B +- .long 0x1010100C, 0x1010100D, 0x1010100E, 0x1010100F +- +- +-.section __TEXT,__text,regular,pure_instructions +- +-.globl _ppc_brightness_G4 +-.align 3 +-_ppc_brightness_G4: +- +- +-;; PowerPC Altivec code +- srwi r5,r5,2 +- mtctr r5 +- +-;;vrsave +- mfspr r11,256 +- lis r12,0xCFFC +- mtspr 256,r12 +- +- mflr r0 +- bcl 20,31,"L00000000001$pb" +-"L00000000001$pb": +- mflr r10 +- mtlr r0 +- +- addis r9,r10,ha16(vectorZERO-"L00000000001$pb") +- addi r9,r9,lo16(vectorZERO-"L00000000001$pb") +- +- vxor v0,v0,v0 ;; V0 = NULL vector +- +- addi r9,r9,16 +- lvx v10,0,r9 +- addi r9,r9,16 +- lvx v11,0,r9 +- addi r9,r9,16 +- lvx v12,0,r9 +- addi r9,r9,16 +- lvx v13,0,r9 +- +- addis r9,r10,ha16(vectortmpwork-"L00000000001$pb") +- addi r9,r9,lo16(vectortmpwork-"L00000000001$pb") +- stw r6,0(r9) +- li r6,8 +- stw r6,4(r9) +- lvx v9,0,r9 +- li r9,128 +- vspltw v8,v9,0 +- vspltw v9,v9,1 +- +-;; elt counter +- li r9,0 +- lis r7,0x0F01 +- b L7 +-.align 4 +-L7: +- lvx v1,r9,r3 +- +- vperm v4,v1,v0,v10 +- ;********************* +- add r10,r9,r3 +- ;********************* +- vperm v5,v1,v0,v11 +- vperm v6,v1,v0,v12 +- vperm v7,v1,v0,v13 +- +- vmulouh v4,v4,v8 +- ;********************* +- dst r10,r7,3 +- ;********************* +- vmulouh v5,v5,v8 +- vmulouh v6,v6,v8 +- vmulouh v7,v7,v8 +- vsrw v4,v4,v9 +- vsrw v5,v5,v9 +- vsrw v6,v6,v9 +- vsrw v7,v7,v9 +- +- vpkuwus v4,v4,v5 +- vpkuwus v6,v6,v7 +- vpkuhus v1,v4,v6 +- +- stvx v1,r9,r4 +- addi r9,r9,16 +- +- bdnz L7 +- +- mtspr 256,r11 +- blr +- +- +-.globl _ppc_brightness_G5 +-.align 3 +-_ppc_brightness_G5: +- +-;; PowerPC Altivec G5 code +- srwi r5,r5,2 +- mtctr r5 +- +-;;vrsave +- mfspr r11,256 +- lis r12,0xCFFC +- mtspr 256,r12 +- +- mflr r0 +- bcl 20,31,"L00000000002$pb" +-"L00000000002$pb": +- mflr r10 +- mtlr r0 +- +- addis r9,r10,ha16(vectorZERO-"L00000000002$pb") +- addi r9,r9,lo16(vectorZERO-"L00000000002$pb") +- +- vxor v0,v0,v0 ;; V0 = NULL vector +- +- addi r9,r9,16 +- lvx v10,0,r9 +- addi r9,r9,16 +- lvx v11,0,r9 +- addi r9,r9,16 +- lvx v12,0,r9 +- addi r9,r9,16 +- lvx v13,0,r9 +- +- addis r9,r10,ha16(vectortmpwork-"L00000000002$pb") +- addi r9,r9,lo16(vectortmpwork-"L00000000002$pb") +- stw r6,0(r9) +- li r6,8 +- stw r6,4(r9) +- lvx v9,0,r9 +- li r9,128 +- vspltw v8,v9,0 +- vspltw v9,v9,1 +- +-;; elt counter +- li r9,0 +- lis r7,0x0F01 +- b L6 +-.align 4 +-L6: +- lvx v1,r9,r3 +- +- vperm v4,v1,v0,v10 +- ;********************* +- add r10,r9,r3 +- ;********************* +- vperm v5,v1,v0,v11 +- vperm v6,v1,v0,v12 +- vperm v7,v1,v0,v13 +- +- vmulouh v4,v4,v8 +- vmulouh v5,v5,v8 +- vmulouh v6,v6,v8 +- vmulouh v7,v7,v8 +- vsrw v4,v4,v9 +- vsrw v5,v5,v9 +- vsrw v6,v6,v9 +- vsrw v7,v7,v9 +- +- vpkuwus v4,v4,v5 +- vpkuwus v6,v6,v7 +- vpkuhus v1,v4,v6 +- +- stvx v1,r9,r4 +- addi r9,r9,16 +- +- bdnz L6 +- +- mtspr 256,r11 +- blr +- +- +-.globl _ppc_brightness_generic +-.align 3 +-_ppc_brightness_generic: +- lis r12,0x00FF +- ori r12,r12,0x00FF +- subi r3,r3,4 +- subi r4,r4,4 +- mtctr r5 +- b L1 +-.align 4 +-L1: +- lwzu r7,4(r3) +- +- rlwinm r8,r7,16,24,31 +- rlwinm r9,r7,24,24,31 +- mullw r8,r8,r6 +- rlwinm r10,r7,0,24,31 +- mullw r9,r9,r6 +- srwi r8,r8,8 +- mullw r10,r10,r6 +- srwi r9,r9,8 +- +- rlwinm. r11,r8,0,0,23 +- beq L2 +- li r8,0xFF +-L2: +- srwi r10,r10,8 +- rlwinm. r11,r9,0,0,23 +- beq L3 +- li r9,0xFF +-L3: +- rlwinm r7,r8,16,8,15 +- rlwinm. r11,r10,0,0,23 +- beq L4 +- li r10,0xFF +-L4: +- rlwimi r7,r9,8,16,23 +- rlwimi r7,r10,0,24,31 +- +- stwu r7,4(r4) +- bdnz L1 +- +- blr +- +- +- +-.static_data +-.align 4 +-vectortmpwork: +- .long 0,0,0,0 +- +diff -Naur /home/d4rk/goom2k4-0/src/ppc_zoom_ultimate.h /src/ppc_zoom_ultimate.h +--- /home/d4rk/goom2k4-0/src/ppc_zoom_ultimate.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/ppc_zoom_ultimate.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,14 +0,0 @@ +-/* +- * ppc_zoom_ultimate.h +- * Goom +- * +- * Created by Guillaume Borios on Sun Dec 28 2003. +- * Copyright (c) 2003 iOS. All rights reserved. +- * +- */ +- +-/* Generic PowerPC Code */ +-void ppc_zoom_generic (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +- +-/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */ +-void ppc_zoom_G4 (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +\ No newline at end of file +diff -Naur /home/d4rk/goom2k4-0/src/ppc_zoom_ultimate.s /src/ppc_zoom_ultimate.s +--- /home/d4rk/goom2k4-0/src/ppc_zoom_ultimate.s 2005-02-07 06:46:41.000000000 -0700 ++++ /src/ppc_zoom_ultimate.s 1969-12-31 17:00:00.000000000 -0700 +@@ -1,323 +0,0 @@ +-; PowerPC optimized zoom for Goom +-; © 2001-2003 Guillaume Borios +-; This Source Code is released under the terms of the General Public License +- +-; Change log : +-; 21 Dec 2003 : Use of altivec is now determined with a parameter +- +-; Section definition : We use a read only section +-.text +- +-; name of the function to call by C program : ppc_zoom +-; We declare this label as a global to extend its scope outside this file +-.globl _ppc_zoom_generic +-.globl _ppc_zoom_G4 +- +-; Description : +-; This routine dynamically computes and applies a zoom filter +- +-; parameters : +-; r3 <=> unsigned int sizeX (in pixels) +-; r4 <=> unsigned int sizeY (in pixels) +-; r5 <=> unsigned int * frompixmap +-; r6 <=> unsigned int * topixmap +-; r7 <=> unsigned int * brutS +-; r8 <=> unsigned int * brutD +-; r9 <=> unsigned int buffratio +-; r10 <=> int [16][16] precalccoeffs +- +-; globals after init +-; r5 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r5) +-; r6 <=> topixmap - 1 byte needed for preincremental fetch (replaces r6) +-; r3 <=> ax = x max in 16th of pixels (replaces old r3) +-; r4 <=> ay = y max in 16th of pixels (replaces old r4) +-; r20 <=> row size in bytes +-; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing) +-; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7) +-; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8) +- +-; ABI notes : +-; r1 is the Stack Pointer (SP) => Do not use +-; r13..r31 are non-volatiles => Do not use +- +-_ppc_zoom_generic: +- +-; Saves the used non volatile registers in the Mach-O stack s Red-Zone +-stmw r18,-56(r1) +- +-; init +-li r18,0 ; Default value if out of range : 0 (Black) +-mr r11,r10 +-lis r12,0xFF +-mullw r2,r3,r4 ; Number of pixels to compute +-subi r30,r8,0 +-slwi r20,r3,2 +-srawi r19,r20,2 +-ori r12,r12,0xFF +-subi r3,r3,1 +-subi r4,r4,1 +-mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +-subi r31,r7,0 +-subi r6,r6,4 +-slwi r3,r3,4 +-slwi r4,r4,4 +- +-;pre init for loop +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +- +-b L1 +-.align 5 +-L1: +- +-; computes dynamically the position to fetch +-sub r8,r8,r2 +-sub r10,r10,r29 +-mullw r8,r8,r9 +-addi r31,r31,8 +-mullw r10,r10,r9 +-addi r30,r30,8 +- +-srawi r8,r8,16 +-srawi r10,r10,16 +-add r2,r2,r8 +-add r29,r29,r10 +- +-; if px>ax or py>ay goto outofrange +-; computes the attenuation coeffs and the original point address +-rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +-cmpl cr4,0,r2,r3 +-rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10) +-cmpl cr7,0,r29,r4 +-srawi r29,r29,4 ; pos computing +-bge- cr4,L4 +-srawi r2,r2,4 ; pos computing +-mullw r29, r29,r19 ; pos computing +-bge- cr7,L4 +- +-; Channels notation : 00112233 (AARRVVBB) +- +-add r2,r2,r29 ; pos computing +-lwzx r10,r11,r10 ; Loads coefs +-slwi r2,r2,2 ; pos computing +-add r2,r2,r5 ; pos computing +-rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +-lwz r25,0(r2) ; Loads col1 -> r25 +-lwz r26,4(r2) ; Loads col2 -> r26 +-rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +-rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +-add r2,r2,r20 ; Adds one line for future load of col3 and col4 +-and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +-rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +-andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +-mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 +- +- +-; computes final pixel color +-and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +-lwz r27,0(r2) ; Loads col3 -> r27 +-mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +-mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +-andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +-mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +-lwz r28,4(r2) ; Loads col4 -> r28 +-add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +-and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +-add r25,r25,r29 ; Adds col1 & col2 channel 2 +-mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +-andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +-mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +-lwz r2,0(r31) ; px +-add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +-and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +-mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +-add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +-lwz r8,0(r30) ; px2 +-andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +-add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +-lwz r10,4(r30) ; py2 +-mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +-srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +-lwz r29,4(r31) ; py +-add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +-rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +-stwu r7,4(r6) ; Stores the computed pixel +-bdnz L1 ; Iterate again if needed +-b L3 ;goto end ; If not, returns from the function +- +- +-; if out of range +-L4: +-stwu r18,4(r6) +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-bdnz L1 +- +- +-L3: +- +-; Restore saved registers and return +-lmw r18,-56(r1) +-blr +- +- +- +- +- +- +- +- +-_ppc_zoom_G4: +- +-; Saves the used non volatile registers in the Mach-O stack s Red-Zone +-stmw r17,-60(r1) +- +-; init +-li r18,0 ; Default value if out of range : 0 (Black) +-mr r11,r10 +-lis r12,0xFF +-mullw r2,r3,r4 ; Number of pixels to compute +-subi r30,r8,0 +-slwi r20,r3,2 +-srawi r19,r20,2 +-ori r12,r12,0xFF +-subi r3,r3,1 +-subi r4,r4,1 +-mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +-subi r31,r7,0 +-subi r6,r6,4 +-slwi r3,r3,4 +-slwi r4,r4,4 +- +-;pre init for loop +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +- +-;********************* +-lis r17,0x0F01 +- +-b L100 +-.align 5 +-L100: +- +-addi r6,r6,4 +- +-; Optimization to ensure the destination buffer +-; won't be loaded into the data cache +-rlwinm. r0,r6,0,27,31 +-bne+ L500 +-dcbz 0,r6 +-;dcba 0,r6 +-L500: +- +-; computes dynamically the position to fetch +-;mullw r8,r8,r29 +-;mullw r2,r2,r29 +-;add r2,r8,r2 +-;srawi r2,r2,17 +- +-sub r8,r8,r2 +-sub r10,r10,r29 +-mullw r8,r8,r9 +-addi r31,r31,8 +-mullw r10,r10,r9 +-addi r30,r30,8 +- +-dst r30,r17,0 +- +-srawi r8,r8,16 +-srawi r10,r10,16 +-add r2,r2,r8 +-add r29,r29,r10 +- +-dst r31,r17,1 +- +-; if px>ax or py>ay goto outofrange +-; computes the attenuation coeffs and the original point address +-rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +-cmpl cr4,0,r2,r3 +-rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10) +-cmpl cr7,0,r29,r4 +-srawi r29,r29,4 ; pos computing +-bge- cr4,L400 +-srawi r2,r2,4 ; pos computing +-mullw r29, r29,r19 ; pos computing +-bge- cr7,L400 +- +-; Channels notation : 00112233 (AARRVVBB) +- +-add r2,r2,r29 ; pos computing +-lwzx r10,r11,r10 ; Loads coefs +-slwi r2,r2,2 ; pos computing +-add r2,r2,r5 ; pos computing +-rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +-lwz r25,0(r2) ; Loads col1 -> r25 +-lwz r26,4(r2) ; Loads col2 -> r26 +-rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +-rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +-add r2,r2,r20 ; Adds one line for future load of col3 and col4 +-and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +-rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +-dst r2,r17,2 +-rlwinm r25,r25,0,16,23 ; Masks col1 channel 2 : 0x0000XX00 +-;andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +-mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 +- +- +-; computes final pixel color +-and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +-lwz r27,0(r2) ; Loads col3 -> r27 +-mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +-mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +-rlwinm r29,r26,0,16,23 ; Masks col2 channel 2 : 0x0000XX00 +-;andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +-mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +-lwz r28,4(r2) ; Loads col4 -> r28 +-add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +-and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +-add r25,r25,r29 ; Adds col1 & col2 channel 2 +-mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +-rlwinm r29,r27,0,16,23 ; Masks col3 channel 2 : 0x0000XX00 +-;andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +-mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +-lwz r2,0(r31) ; px +-add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +-and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +-mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +-add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +-lwz r8,0(r30) ; px2 +-rlwinm r28,r28,0,16,23 ; Masks col4 channel 2 : 0x0000XX00 +-;andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +-add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +-lwz r10,4(r30) ; py2 +-mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +-srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +-lwz r29,4(r31) ; py +-add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +-rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +-stw r7,0(r6) ; Stores the computed pixel +-bdnz L100 ; Iterate again if needed +-b L300 ;goto end ; If not, returns from the function +- +- +-; if out of range +-L400: +-stw r18,0(r6) +-lwz r8,0(r30) ; px2 +-lwz r10,4(r30) ; py2 +-lwz r2,0(r31) ; px +-lwz r29,4(r31) ; py +-bdnz L100 +- +- +-L300: +- +-; Restore saved registers and return +-lmw r17,-60(r1) +-blr +diff -Naur /home/d4rk/goom2k4-0/src/sound_tester.c /src/sound_tester.c +--- /home/d4rk/goom2k4-0/src/sound_tester.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/sound_tester.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,138 +0,0 @@ +-#include "sound_tester.h" +- +-#include <stdlib.h> +-#include <string.h> +- +-/* some constants */ +-#define BIG_GOOM_DURATION 100 +-#define BIG_GOOM_SPEED_LIMIT 0.1f +- +-#define ACCEL_MULT 0.95f +-#define SPEED_MULT 0.99f +- +- +-void evaluate_sound(gint16 data[2][512], SoundInfo *info) { +- +- int i; +- float difaccel; +- float prevspeed; +- +- /* find the max */ +- int incvar = 0; +- for (i = 0; i < 512; i+=2) { +- if (incvar < data[0][i]) +- incvar = data[0][i]; +- } +- +- if (incvar > info->allTimesMax) +- info->allTimesMax = incvar; +- +- /* volume sonore */ +- info->volume = (float)incvar / (float)info->allTimesMax; +- memcpy(info->samples[0],data[0],512*sizeof(short)); +- memcpy(info->samples[1],data[1],512*sizeof(short)); +- +- difaccel = info->accelvar; +- info->accelvar = info->volume; /* accel entre 0 et 1 */ +- +- /* transformations sur la vitesse du son */ +- if (info->speedvar > 1.0f) +- info->speedvar = 1.0f; +- +- if (info->speedvar < 0.1f) +- info->accelvar *= (1.0f - (float)info->speedvar); +- else if (info->speedvar < 0.3f) +- info->accelvar *= (0.9f - (float)(info->speedvar-0.1f)/2.0f); +- else +- info->accelvar *= (0.8f - (float)(info->speedvar-0.3f)/4.0f); +- +- /* adoucissement de l'acceleration */ +- info->accelvar *= ACCEL_MULT; +- if (info->accelvar < 0) +- info->accelvar = 0; +- +- difaccel = info->accelvar - difaccel; +- if (difaccel < 0) +- difaccel = - difaccel; +- +- /* mise a jour de la vitesse */ +- prevspeed = info->speedvar; +- info->speedvar = (info->speedvar + difaccel * 0.5f) / 2; +- info->speedvar *= SPEED_MULT; +- info->speedvar = (info->speedvar + 3.0f * prevspeed) / 4.0f; +- if (info->speedvar < 0) +- info->speedvar = 0; +- if (info->speedvar > 1) +- info->speedvar = 1; +- +- /* temps du goom */ +- info->timeSinceLastGoom++; +- info->timeSinceLastBigGoom++; +- info->cycle++; +- +- /* detection des nouveaux gooms */ +- if ((info->speedvar > (float)IVAL(info->biggoom_speed_limit_p)/100.0f) +- && (info->accelvar > info->bigGoomLimit) +- && (info->timeSinceLastBigGoom > BIG_GOOM_DURATION)) { +- info->timeSinceLastBigGoom = 0; +- } +- +- if (info->accelvar > info->goom_limit) { +- /* TODO: tester && (info->timeSinceLastGoom > 20)) { */ +- info->totalgoom ++; +- info->timeSinceLastGoom = 0; +- info->goomPower = info->accelvar - info->goom_limit; +- } +- +- if (info->accelvar > info->prov_max) +- info->prov_max = info->accelvar; +- +- if (info->goom_limit>1) +- info->goom_limit=1; +- +- /* toute les 2 secondes : vérifier si le taux de goom est correct +- * et le modifier sinon.. */ +- if (info->cycle % 64 == 0) { +- if (info->speedvar<0.01f) +- info->goom_limit *= 0.91; +- if (info->totalgoom > 4) { +- info->goom_limit+=0.02; +- } +- if (info->totalgoom > 7) { +- info->goom_limit*=1.03f; +- info->goom_limit+=0.03; +- } +- if (info->totalgoom > 16) { +- info->goom_limit*=1.05f; +- info->goom_limit+=0.04; +- } +- if (info->totalgoom == 0) { +- info->goom_limit = info->prov_max - 0.02; +- } +- if ((info->totalgoom == 1) && (info->goom_limit > 0.02)) +- info->goom_limit-=0.01; +- info->totalgoom = 0; +- info->bigGoomLimit = info->goom_limit * (1.0f + (float)IVAL(info->biggoom_factor_p)/500.0f); +- info->prov_max = 0; +- } +- +- /* mise a jour des parametres pour la GUI */ +- FVAL(info->volume_p) = info->volume; +- info->volume_p.change_listener(&info->volume_p); +- FVAL(info->speed_p) = info->speedvar * 4; +- info->speed_p.change_listener(&info->speed_p); +- FVAL(info->accel_p) = info->accelvar; +- info->accel_p.change_listener(&info->accel_p); +- +- FVAL(info->goom_limit_p) = info->goom_limit; +- info->goom_limit_p.change_listener(&info->goom_limit_p); +- FVAL(info->goom_power_p) = info->goomPower; +- info->goom_power_p.change_listener(&info->goom_power_p); +- FVAL(info->last_goom_p) = 1.0-((float)info->timeSinceLastGoom/20.0f); +- info->last_goom_p.change_listener(&info->last_goom_p); +- FVAL(info->last_biggoom_p) = 1.0-((float)info->timeSinceLastBigGoom/40.0f); +- info->last_biggoom_p.change_listener(&info->last_biggoom_p); +- +- /* bigGoomLimit ==goomLimit*9/8+7 ? */ +- } +- +diff -Naur /home/d4rk/goom2k4-0/src/sound_tester.h /src/sound_tester.h +--- /home/d4rk/goom2k4-0/src/sound_tester.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/sound_tester.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,11 +0,0 @@ +-#ifndef _SOUND_TESTER_H +-#define _SOUND_TESTER_H +- +-#include "goom_plugin_info.h" +-#include "goom_config.h" +- +-/** change les donnees du SoundInfo */ +-void evaluate_sound(gint16 data[2][512], SoundInfo *sndInfo); +- +-#endif +- +diff -Naur /home/d4rk/goom2k4-0/src/surf3d.c /src/surf3d.c +--- /home/d4rk/goom2k4-0/src/surf3d.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/surf3d.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,107 +0,0 @@ +-#include "surf3d.h" +-#include "goom_plugin_info.h" +-#include <stdlib.h> +-#include <stdio.h> +-#include <string.h> +- +-grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center) { +- int x = defx; +- int y = defz; +- grid3d *g = malloc (sizeof(grid3d)); +- surf3d *s = &(g->surf); +- s->nbvertex = x*y; +- s->vertex = malloc (x*y*sizeof(v3d)); +- s->svertex = malloc (x*y*sizeof(v3d)); +- s->center = center; +- +- g->defx=defx; +- g->sizex=sizex; +- g->defz=defz; +- g->sizez=sizez; +- g->mode=0; +- +- while (y) { +- --y; +- x = defx; +- while (x) { +- --x; +- s->vertex[x+defx*y].x = (float)(x-defx/2)*sizex/defx; +- s->vertex[x+defx*y].y = 0; +- s->vertex[x+defx*y].z = (float)(y-defz/2)*sizez/defz; +- } +- } +- return g; +-} +- +-void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow, +- int dist, Pixel *buf, Pixel *back, int W,int H) { +- +- int x; +- v2d v2,v2x; +- +- v2d *v2_array = malloc(g->surf.nbvertex * sizeof(v2d)); +- v3d_to_v2d(g->surf.svertex, g->surf.nbvertex, W, H, dist, v2_array); +- +- for (x=0;x<g->defx;x++) { +- int z; +- v2x = v2_array[x]; +- +- for (z=1;z<g->defz;z++) { +- v2 = v2_array[z*g->defx + x]; +- if (((v2.x != -666) || (v2.y!=-666)) +- && ((v2x.x != -666) || (v2x.y!=-666))) { +- plug->methods.draw_line (buf,v2x.x,v2x.y,v2.x,v2.y, colorlow, W, H); +- plug->methods.draw_line (back,v2x.x,v2x.y,v2.x,v2.y, color, W, H); +- } +- v2x = v2; +- } +- } +- +- free(v2_array); +-} +- +-void surf3d_rotate (surf3d *s, float angle) { +- int i; +- float cosa; +- float sina; +- SINCOS(angle,sina,cosa); +- for (i=0;i<s->nbvertex;i++) { +- Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina); +- } +-} +- +-void surf3d_translate (surf3d *s) { +- int i; +- for (i=0;i<s->nbvertex;i++) { +- TRANSLATE_V3D(s->center,s->svertex[i]); +- } +-} +- +-void grid3d_update (grid3d *g, float angle, float *vals, float dist) { +- int i; +- float cosa; +- float sina; +- surf3d *s = &(g->surf); +- v3d cam = s->center; +- cam.z += dist; +- +- SINCOS((angle/4.3f),sina,cosa); +- cam.y += sina*2.0f; +- SINCOS(angle,sina,cosa); +- +- if (g->mode==0) { +- if (vals) +- for (i=0;i<g->defx;i++) +- s->vertex[i].y = s->vertex[i].y*0.2 + vals[i]*0.8; +- +- for (i=g->defx;i<s->nbvertex;i++) { +- s->vertex[i].y *= 0.255f; +- s->vertex[i].y += (s->vertex[i-g->defx].y * 0.777f); +- } +- } +- +- for (i=0;i<s->nbvertex;i++) { +- Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina); +- TRANSLATE_V3D(cam,s->svertex[i]); +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/surf3d.h /src/surf3d.h +--- /home/d4rk/goom2k4-0/src/surf3d.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/surf3d.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,38 +0,0 @@ +-#ifndef _SURF3D_H +-#define _SURF3D_H +- +-#include "v3d.h" +-#include "goom_graphic.h" +-#include "goom_typedefs.h" +- +-typedef struct { +- v3d *vertex; +- v3d *svertex; +- int nbvertex; +- +- v3d center; +-} surf3d; +- +-typedef struct { +- surf3d surf; +- +- int defx; +- int sizex; +- int defz; +- int sizez; +- int mode; +-} grid3d; +- +-/* hi-level */ +- +-/* works on grid3d */ +-grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center); +-void grid3d_update (grid3d *s, float angle, float *vals, float dist); +- +-/* low level */ +-void surf3d_draw (surf3d *s, int color, int dist, int *buf, int *back, int W,int H); +-void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow, int dist, Pixel *buf, Pixel *back, int W,int H); +-void surf3d_rotate (surf3d *s, float angle); +-void surf3d_translate (surf3d *s); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/surf3d.s /src/surf3d.s +--- /home/d4rk/goom2k4-0/src/surf3d.s 2005-02-07 06:46:41.000000000 -0700 ++++ /src/surf3d.s 1969-12-31 17:00:00.000000000 -0700 +@@ -1,484 +0,0 @@ +- .file "surf3d.c" +- .version "01.01" +-gcc2_compiled.: +-.text +- .align 4 +-.globl grid3d_new +- .type grid3d_new,@function +-grid3d_new: +- pushl %ebp +- movl %esp,%ebp +- subl $44,%esp +- pushl %edi +- pushl %esi +- pushl %ebx +- movl 20(%ebp),%eax +- movl 12(%ebp),%esi +- movl %eax,-8(%ebp) +- addl $-12,%esp +- pushl $44 +- call malloc +- movl %esi,%edx +- imull -8(%ebp),%edx +- movl %eax,%edi +- movl %edx,-12(%ebp) +- leal (%edx,%edx,2),%ebx +- movl %edx,8(%edi) +- addl $-12,%esp +- sall $2,%ebx +- pushl %ebx +- call malloc +- addl $32,%esp +- movl %eax,(%edi) +- addl $-12,%esp +- pushl %ebx +- call malloc +- movl %eax,4(%edi) +- movl 24(%ebp),%eax +- movl %eax,12(%edi) +- movl 28(%ebp),%eax +- movl %eax,16(%edi) +- movl 32(%ebp),%eax +- movl %eax,20(%edi) +- movl 8(%ebp),%eax +- movl %eax,28(%edi) +- movl %esi,24(%edi) +- movl -8(%ebp),%edx +- movl 16(%ebp),%eax +- movl %edx,32(%edi) +- movl %eax,36(%edi) +- movl $0,40(%edi) +- testl %edx,%edx +- je .L480 +- movl %esi,%eax +- movl %esi,-28(%ebp) +- shrl $31,%eax +- addl %eax,%esi +- movl -8(%ebp),%eax +- shrl $31,%eax +- addl -8(%ebp),%eax +- movl -12(%ebp),%edx +- sarl $1,%eax +- movl %edx,-24(%ebp) +- negl -28(%ebp) +- movl %esi,-16(%ebp) +- movl %eax,-20(%ebp) +- .p2align 4,,7 +-.L481: +- movl -28(%ebp),%eax +- addl %eax,-24(%ebp) +- decl -8(%ebp) +- movl 12(%ebp),%esi +- testl %esi,%esi +- je .L479 +- movl -8(%ebp),%eax +- subl -20(%ebp),%eax +- movl %eax,-4(%ebp) +- fildl -4(%ebp) +- movl %esi,-4(%ebp) +- movl -24(%ebp),%edx +- leal (%edx,%esi),%eax +- movl -16(%ebp),%ebx +- fildl 16(%ebp) +- leal (%eax,%eax,2),%eax +- sarl $1,%ebx +- leal 0(,%eax,4),%ecx +- fmulp %st,%st(1) +- fildl 20(%ebp) +- fdivrp %st,%st(1) +- fildl 8(%ebp) +- fildl -4(%ebp) +- jmp .L484 +-.L487: +- fxch %st(2) +- .p2align 4,,7 +-.L484: +- decl %esi +- movl %esi,%eax +- movl (%edi),%edx +- subl %ebx,%eax +- movl %eax,-4(%ebp) +- fildl -4(%ebp) +- addl $-12,%ecx +- fmul %st(2),%st +- fdiv %st(1),%st +- fstps (%edx,%ecx) +- fxch %st(2) +- movl (%edi),%eax +- movl $0,4(%eax,%ecx) +- movl (%edi),%eax +- fsts 8(%eax,%ecx) +- testl %esi,%esi +- jne .L487 +- fstp %st(0) +- fstp %st(0) +- fstp %st(0) +-.L479: +- cmpl $0,-8(%ebp) +- jne .L481 +-.L480: +- leal -56(%ebp),%esp +- popl %ebx +- movl %edi,%eax +- popl %esi +- popl %edi +- leave +- ret +-.Lfe1: +- .size grid3d_new,.Lfe1-grid3d_new +-.section .rodata +- .align 8 +-.LC48: +- .long 0x0,0x3fe00000 +- .align 4 +-.LC49: +- .long 0x3f19999a +- .align 4 +-.LC50: +- .long 0x3ee3d70a +-.text +- .align 4 +-.globl grid3d_update +- .type grid3d_update,@function +-grid3d_update: +- pushl %ebp +- movl %esp,%ebp +- subl $32,%esp +- pushl %esi +- pushl %ebx +- flds 12(%ebp) +- movl 8(%ebp),%ebx +- movl 16(%ebp),%ecx +- fld %st(0) +-#APP +- fsin +-#NO_APP +- fstps -4(%ebp) +- flds -4(%ebp) +- fxch %st(1) +-#APP +- fcos +-#NO_APP +- fstps -4(%ebp) +- flds -4(%ebp) +- cmpl $0,40(%ebx) +- jne .L519 +- testl %ecx,%ecx +- je .L520 +- xorl %esi,%esi +- cmpl 24(%ebx),%esi +- jge .L520 +- fldl .LC48 +- xorl %edx,%edx +- .p2align 4,,7 +-.L524: +- movl (%ebx),%eax +- fld %st(0) +- fld %st(1) +- fxch %st(1) +- fmuls 4(%eax,%edx) +- fxch %st(1) +- fmuls (%ecx,%esi,4) +- faddp %st,%st(1) +- incl %esi +- fstps 4(%eax,%edx) +- addl $12,%edx +- cmpl 24(%ebx),%esi +- jl .L524 +- fstp %st(0) +-.L520: +- movl 24(%ebx),%esi +- cmpl 8(%ebx),%esi +- jge .L519 +- leal (%esi,%esi,2),%eax +- flds .LC49 +- flds .LC50 +- leal 0(,%eax,4),%ecx +- .p2align 4,,7 +-.L529: +- movl (%ebx),%eax +- flds 4(%eax,%ecx) +- fmul %st(2),%st +- fstps 4(%eax,%ecx) +- movl %esi,%eax +- subl 24(%ebx),%eax +- movl (%ebx),%edx +- leal (%eax,%eax,2),%eax +- flds 4(%edx,%eax,4) +- fmul %st(1),%st +- fadds 4(%edx,%ecx) +- incl %esi +- fstps 4(%edx,%ecx) +- addl $12,%ecx +- cmpl 8(%ebx),%esi +- jl .L529 +- fstp %st(0) +- fstp %st(0) +-.L519: +- xorl %esi,%esi +- cmpl 8(%ebx),%esi +- jge .L536 +- xorl %ecx,%ecx +- .p2align 4,,7 +-.L534: +- movl (%ebx),%eax +- flds (%eax,%ecx) +- flds 8(%eax,%ecx) +- fmul %st(2),%st +- fxch %st(1) +- fmul %st(3),%st +- fsubp %st,%st(1) +- movl 4(%ebx),%edx +- incl %esi +- fstps (%edx,%ecx) +- movl (%ebx),%eax +- flds (%eax,%ecx) +- flds 8(%eax,%ecx) +- fxch %st(1) +- fmul %st(2),%st +- fxch %st(1) +- fmul %st(3),%st +- faddp %st,%st(1) +- movl 4(%ebx),%edx +- fstps 8(%edx,%ecx) +- movl (%ebx),%eax +- flds 4(%eax,%ecx) +- movl 4(%ebx),%edx +- fstps 4(%edx,%ecx) +- movl 4(%ebx),%eax +- flds (%eax,%ecx) +- fadds 12(%ebx) +- fstps (%eax,%ecx) +- movl 4(%ebx),%eax +- flds 4(%eax,%ecx) +- fadds 16(%ebx) +- fstps 4(%eax,%ecx) +- movl 4(%ebx),%eax +- flds 8(%eax,%ecx) +- fadds 20(%ebx) +- fstps 8(%eax,%ecx) +- addl $12,%ecx +- cmpl 8(%ebx),%esi +- jl .L534 +-.L536: +- fstp %st(0) +- fstp %st(0) +- popl %ebx +- popl %esi +- leave +- ret +-.Lfe2: +- .size grid3d_update,.Lfe2-grid3d_update +-.section .rodata +- .align 4 +-.LC51: +- .long 0x40000000 +- .align 8 +-.LC52: +- .long 0x0,0x42380000 +-.text +- .align 4 +-.globl surf3d_draw +- .type surf3d_draw,@function +-surf3d_draw: +- pushl %ebp +- movl %esp,%ebp +- subl $60,%esp +- pushl %edi +- pushl %esi +- pushl %ebx +- movl $0,-20(%ebp) +- movl -20(%ebp),%edx +- movl 8(%ebp),%eax +- cmpl 8(%eax),%edx +- jge .L493 +- fldl .LC52 +- flds .LC51 +- xorl %edi,%edi +- .p2align 4,,7 +-.L495: +- movl 8(%ebp),%eax +- movl 4(%eax),%eax +- movl %eax,-36(%ebp) +- fcoms 8(%eax,%edi) +- fnstsw %ax +- andb $69,%ah +- cmpb $1,%ah +- jne .L496 +- fildl 16(%ebp) +- movl -36(%ebp),%edx +- fld %st(0) +- fmuls (%edx,%edi) +- fdivs 8(%edx,%edi) +- fld %st(3) +- faddp %st,%st(1) +- fstpl -32(%ebp) +- movl -32(%ebp),%eax +- movl -28(%ebp),%edx +- movl %eax,-40(%ebp) +- sarl $16,-40(%ebp) +- movl -36(%ebp),%edx +- fmuls 4(%edx,%edi) +- fdivs 8(%edx,%edi) +- movl -40(%ebp),%ecx +- fld %st(2) +- faddp %st,%st(1) +- fstpl -32(%ebp) +- movl -32(%ebp),%eax +- movl -28(%ebp),%edx +- movl %eax,-44(%ebp) +- movl 28(%ebp),%eax +- sarl $1,%eax +- addl %eax,%ecx +- movl 32(%ebp),%eax +- sarl $16,-44(%ebp) +- sarl $1,%eax +- movl %ecx,%ebx +- subl -44(%ebp),%eax +- movl %eax,%esi +- cmpl 28(%ebp),%ebx +- jge .L496 +- testl %ecx,%ecx +- jl .L496 +- cmpl 32(%ebp),%esi +- jge .L496 +- testl %eax,%eax +- jge .L499 +-.L496: +- xorl %esi,%esi +- xorl %ebx,%ebx +-.L499: +- movl 20(%ebp),%eax +- movl %ebx,%edx +- leal (%eax,%edx,4),%edx +- movl 28(%ebp),%eax +- imull %esi,%eax +- leal (%edx,%eax,4),%eax +- testl %ebx,%ebx +- je .L494 +- testl %esi,%esi +- je .L494 +-#APP +- movd (%eax), %mm0 +- paddusb 12(%ebp), %mm0 +- movd %mm0, (%eax) +-#NO_APP +-.L494: +- incl -20(%ebp) +- addl $12,%edi +- movl -20(%ebp),%eax +- movl 8(%ebp),%edx +- cmpl 8(%edx),%eax +- jl .L495 +- fstp %st(0) +- fstp %st(0) +-.L493: +- popl %ebx +- popl %esi +- popl %edi +- leave +- ret +-.Lfe3: +- .size surf3d_draw,.Lfe3-surf3d_draw +- .align 4 +-.globl surf3d_rotate +- .type surf3d_rotate,@function +-surf3d_rotate: +- pushl %ebp +- movl %esp,%ebp +- subl $32,%esp +- pushl %esi +- pushl %ebx +- flds 12(%ebp) +- movl 8(%ebp),%ebx +- fld %st(0) +-#APP +- fsin +-#NO_APP +- fstps -4(%ebp) +- flds -4(%ebp) +- fxch %st(1) +-#APP +- fcos +-#NO_APP +- fstps -4(%ebp) +- xorl %esi,%esi +- flds -4(%ebp) +- cmpl 8(%ebx),%esi +- jge .L537 +- xorl %ecx,%ecx +- .p2align 4,,7 +-.L508: +- movl (%ebx),%eax +- flds (%eax,%ecx) +- flds 8(%eax,%ecx) +- fmul %st(2),%st +- fxch %st(1) +- fmul %st(3),%st +- fsubp %st,%st(1) +- movl 4(%ebx),%edx +- incl %esi +- fstps (%edx,%ecx) +- movl (%ebx),%eax +- flds (%eax,%ecx) +- flds 8(%eax,%ecx) +- fxch %st(1) +- fmul %st(2),%st +- fxch %st(1) +- fmul %st(3),%st +- faddp %st,%st(1) +- movl 4(%ebx),%edx +- fstps 8(%edx,%ecx) +- movl (%ebx),%eax +- flds 4(%eax,%ecx) +- movl 4(%ebx),%edx +- fstps 4(%edx,%ecx) +- addl $12,%ecx +- cmpl 8(%ebx),%esi +- jl .L508 +-.L537: +- fstp %st(0) +- fstp %st(0) +- popl %ebx +- popl %esi +- leave +- ret +-.Lfe4: +- .size surf3d_rotate,.Lfe4-surf3d_rotate +- .align 4 +-.globl surf3d_translate +- .type surf3d_translate,@function +-surf3d_translate: +- pushl %ebp +- movl %esp,%ebp +- pushl %ebx +- movl 8(%ebp),%ecx +- xorl %ebx,%ebx +- cmpl 8(%ecx),%ebx +- jge .L512 +- xorl %edx,%edx +- .p2align 4,,7 +-.L514: +- movl 4(%ecx),%eax +- flds (%eax,%edx) +- fadds 12(%ecx) +- incl %ebx +- fstps (%eax,%edx) +- movl 4(%ecx),%eax +- flds 4(%eax,%edx) +- fadds 16(%ecx) +- fstps 4(%eax,%edx) +- movl 4(%ecx),%eax +- flds 8(%eax,%edx) +- fadds 20(%ecx) +- fstps 8(%eax,%edx) +- addl $12,%edx +- cmpl 8(%ecx),%ebx +- jl .L514 +-.L512: +- popl %ebx +- leave +- ret +-.Lfe5: +- .size surf3d_translate,.Lfe5-surf3d_translate +- .ident "GCC: (GNU) 2.95.3 19991030 (prerelease)" +diff -Naur /home/d4rk/goom2k4-0/src/tentacle3d.c /src/tentacle3d.c +--- /home/d4rk/goom2k4-0/src/tentacle3d.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/tentacle3d.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,290 +0,0 @@ +-#include <stdlib.h> +- +-#include "v3d.h" +-#include "surf3d.h" +-#include "goom_tools.h" +-#include "goom_config.h" +-#include "goom_plugin_info.h" +-#include "tentacle3d.h" +- +-#define D 256.0f +- +-#define nbgrid 6 +-#define definitionx 15 +-#define definitionz 45 +- +-typedef struct _TENTACLE_FX_DATA { +- PluginParam enabled_bp; +- PluginParameters params; +- +- float cycle; +- grid3d *grille[nbgrid]; +- float *vals; +- +-#define NB_TENTACLE_COLORS 4 +- int colors[NB_TENTACLE_COLORS]; +- +- int col; +- int dstcol; +- float lig; +- float ligs; +- +- /* statics from pretty_move */ +- float distt; +- float distt2; +- float rot; /* entre 0 et 2 * M_PI */ +- int happens; +- int rotation; +- int lock; +-} TentacleFXData; +- +-static void tentacle_new (TentacleFXData *data); +-static void tentacle_update(PluginInfo *goomInfo, Pixel *buf, Pixel *back, int W, int H, +- short[2][512], float, int drawit, TentacleFXData *data); +-static void tentacle_free (TentacleFXData *data); +- +-/* +- * VisualFX wrapper for the tentacles +- */ +- +-static void tentacle_fx_init(VisualFX *_this, PluginInfo *info) { +- +- TentacleFXData *data = (TentacleFXData*)malloc(sizeof(TentacleFXData)); +- +- data->enabled_bp = secure_b_param("Enabled", 1); +- data->params = plugin_parameters ("3D Tentacles", 1); +- data->params.params[0] = &data->enabled_bp; +- +- data->cycle = 0.0f; +- data->col = (0x28<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x5f<<(BLEU*8)); +- data->dstcol = 0; +- data->lig = 1.15f; +- data->ligs = 0.1f; +- +- data->distt = 10.0f; +- data->distt2 = 0.0f; +- data->rot = 0.0f; /* entre 0 et 2 * M_PI */ +- data->happens = 0; +- +- data->rotation = 0; +- data->lock = 0; +- data->colors[0] = (0x18<<(ROUGE*8))|(0x4c<<(VERT*8))|(0x2f<<(BLEU*8)); +- data->colors[1] = (0x48<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x6f<<(BLEU*8)); +- data->colors[2] = (0x58<<(ROUGE*8))|(0x3c<<(VERT*8))|(0x0f<<(BLEU*8)); +- data->colors[3] = (0x87<<(ROUGE*8))|(0x55<<(VERT*8))|(0x74<<(BLEU*8)); +- tentacle_new(data); +- +- _this->params = &data->params; +- _this->fx_data = (void*)data; +-} +- +-static void tentacle_fx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo) +-{ +- TentacleFXData *data = (TentacleFXData*)_this->fx_data; +- if (BVAL(data->enabled_bp)) { +- tentacle_update(goomInfo, dest, src, goomInfo->screen.width, +- goomInfo->screen.height, goomInfo->sound.samples, +- (float)goomInfo->sound.accelvar, +- goomInfo->curGState->drawTentacle, data); +- } +-} +- +-static void tentacle_fx_free(VisualFX *_this) { +- tentacle_free((TentacleFXData*)_this->fx_data); +- free(_this->fx_data); +-} +- +-VisualFX tentacle_fx_create(void) { +- VisualFX fx; +- fx.init = tentacle_fx_init; +- fx.apply = tentacle_fx_apply; +- fx.free = tentacle_fx_free; +- return fx; +-} +- +-/* ----- */ +- +-static void tentacle_free (TentacleFXData *data) { +- /* TODO : un vrai FREE GRID!! */ +- free (data->vals); +-} +- +-static void tentacle_new (TentacleFXData *data) { +- int tmp; +- +- v3d center = {0,-17.0,0}; +- data->vals = (float*)malloc ((definitionx+20)*sizeof(float)); +- +- for (tmp=0;tmp<nbgrid;tmp++) { +- int x,z; +- z = 45 + rand() % 30; +- x = 85 + rand() % 5; +- center.z = z; +- data->grille[tmp] = grid3d_new (x, definitionx, z, definitionz + rand() % 10, center); +- center.y += 8; +- } +-} +- +-static inline unsigned char lighten (unsigned char value, float power) +-{ +- int val = value; +- float t = (float) val * log10(power) / 2.0; +- +- if (t > 0) { +- val = (int) t; /* (32.0f * log (t)); */ +- if (val > 255) +- val = 255; +- if (val < 0) +- val = 0; +- return val; +- } +- else { +- return 0; +- } +-} +- +-static void lightencolor (int *col, float power) +-{ +- unsigned char *color; +- +- color = (unsigned char *) col; +- *color = lighten (*color, power); +- color++; +- *color = lighten (*color, power); +- color++; +- *color = lighten (*color, power); +- color++; +- *color = lighten (*color, power); +-} +- +-/* retourne x>>s , en testant le signe de x */ +-#define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s)) +- +-static int evolutecolor (unsigned int src,unsigned int dest, +- unsigned int mask, unsigned int incr) { +- +- int color = src & (~mask); +- src &= mask; +- dest &= mask; +- +- if ((src!=mask) +- &&(src<dest)) +- src += incr; +- +- if (src>dest) +- src -= incr; +- return (src&mask)|color; +-} +- +-static void pretty_move (PluginInfo *goomInfo, float cycle, float *dist, float *dist2, float *rotangle, TentacleFXData *fx_data) { +- +- float tmp; +- +- /* many magic numbers here... I don't really like that. */ +- if (fx_data->happens) +- fx_data->happens -= 1; +- else if (fx_data->lock == 0) { +- fx_data->happens = goom_irand(goomInfo->gRandom,200)?0:100+goom_irand(goomInfo->gRandom,60); +- fx_data->lock = fx_data->happens * 3 / 2; +- } +- else fx_data->lock --; +- +- tmp = fx_data->happens?8.0f:0; +- *dist2 = fx_data->distt2 = (tmp + 15.0f*fx_data->distt2)/16.0f; +- +- tmp = 30+D-90.0f*(1.0f+sin(cycle*19/20)); +- if (fx_data->happens) +- tmp *= 0.6f; +- +- *dist = fx_data->distt = (tmp + 3.0f*fx_data->distt)/4.0f; +- +- if (!fx_data->happens){ +- tmp = M_PI*sin(cycle)/32+3*M_PI/2; +- } +- else { +- fx_data->rotation = goom_irand(goomInfo->gRandom,500)?fx_data->rotation:goom_irand(goomInfo->gRandom,2); +- if (fx_data->rotation) +- cycle *= 2.0f*M_PI; +- else +- cycle *= -1.0f*M_PI; +- tmp = cycle - (M_PI*2.0) * floor(cycle/(M_PI*2.0)); +- } +- +- if (abs(tmp-fx_data->rot) > abs(tmp-(fx_data->rot+2.0*M_PI))) { +- fx_data->rot = (tmp + 15.0f*(fx_data->rot+2*M_PI)) / 16.0f; +- if (fx_data->rot>2.0*M_PI) +- fx_data->rot -= 2.0*M_PI; +- *rotangle = fx_data->rot; +- } +- else if (abs(tmp-fx_data->rot) > abs(tmp-(fx_data->rot-2.0*M_PI))) { +- fx_data->rot = (tmp + 15.0f*(fx_data->rot-2.0*M_PI)) / 16.0f; +- if (fx_data->rot<0.0f) +- fx_data->rot += 2.0*M_PI; +- *rotangle = fx_data->rot; +- } +- else +- *rotangle = fx_data->rot = (tmp + 15.0f*fx_data->rot) / 16.0f; +-} +- +-static void tentacle_update(PluginInfo *goomInfo, Pixel *buf, Pixel *back, int W, int H, +- short data[2][512], float rapport, int drawit, TentacleFXData *fx_data) { +- +- int tmp; +- int tmp2; +- +- int color; +- int colorlow; +- +- float dist,dist2,rotangle; +- +- if ((!drawit) && (fx_data->ligs>0.0f)) +- fx_data->ligs = -fx_data->ligs; +- +- fx_data->lig += fx_data->ligs; +- +- if (fx_data->lig > 1.01f) { +- if ((fx_data->lig>10.0f) | (fx_data->lig<1.1f)) fx_data->ligs = -fx_data->ligs; +- +- if ((fx_data->lig<6.3f)&&(goom_irand(goomInfo->gRandom,30)==0)) +- fx_data->dstcol=goom_irand(goomInfo->gRandom,NB_TENTACLE_COLORS); +- +- fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff,0x01); +- fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff00,0x0100); +- fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff0000,0x010000); +- fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff000000,0x01000000); +- +- color = fx_data->col; +- colorlow = fx_data->col; +- +- lightencolor(&color,fx_data->lig * 2.0f + 2.0f); +- lightencolor(&colorlow,(fx_data->lig/3.0f)+0.67f); +- +- rapport = 1.0f + 2.0f * (rapport - 1.0f); +- rapport *= 1.2f; +- if (rapport > 1.12f) +- rapport = 1.12f; +- +- pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data); +- +- for (tmp=0;tmp<nbgrid;tmp++) { +- for (tmp2=0;tmp2<definitionx;tmp2++) { +- float val = (float)(ShiftRight(data[0][goom_irand(goomInfo->gRandom,511)],10)) * rapport; +- fx_data->vals[tmp2] = val; +- } +- +- grid3d_update (fx_data->grille[tmp], rotangle, fx_data->vals, dist2); +- } +- fx_data->cycle+=0.01f; +- for (tmp=0;tmp<nbgrid;tmp++) +- grid3d_draw (goomInfo, fx_data->grille[tmp],color,colorlow,dist,buf,back,W,H); +- } +- else { +- fx_data->lig = 1.05f; +- if (fx_data->ligs < 0.0f) +- fx_data->ligs = -fx_data->ligs; +- pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data); +- fx_data->cycle+=0.1f; +- if (fx_data->cycle > 1000) +- fx_data->cycle = 0; +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/tentacle3d.h /src/tentacle3d.h +--- /home/d4rk/goom2k4-0/src/tentacle3d.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/tentacle3d.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,8 +0,0 @@ +-#ifndef _TENTACLE3D_H +-#define _TENTACLE3D_H +- +-#include "goom_visual_fx.h" +- +-VisualFX tentacle_fx_create(void); +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/TODO /src/TODO +--- /home/d4rk/goom2k4-0/src/TODO 2005-02-07 06:46:41.000000000 -0700 ++++ /src/TODO 1969-12-31 17:00:00.000000000 -0700 +@@ -1,32 +0,0 @@ +-Idees: +- +-- Flash lights (Phosphor) +- --> --> --> +- <-- <-- <-- +- +-- Re-remplir RAND regulierement (1/tour) +- +-- Un effect qui affecte la displacement map: +- +-- Enregistrer l'etat de la config, s'en servir pour definir un etat de goom. +- +-- PluginParam de type Button, avec juste un listener en donnee. +- +-- PluginParam de type TextField. +- +-- Liste des modes possibles pour l'effet de BG. +- +-- Goom lui-meme : liste des effets actifs. +- mode automatique / manuel (plus de changement aleatoires) +- +-- Possibilite d'envoyer des commandes format text au Core. exemples : +-" BRIGHT_FLASH.SCREEN_BRIGHTNESS=200.0 +- if SOUND.GOOM_DETECTION > 0 +- 3D_TENTACLES.ENABLED = 1 +- endif +- CORE.MAIN_SCRIPT="..." +-" +- void goom_execute_script(const char *cmds); +- void goom_set_main_script(const char *script); /// peut retourner un message d'erreur ? +- char *goom_create_state_script(); /* retourne un script permettant de remettre goom dans l'etat actuel */ +- +diff -Naur /home/d4rk/goom2k4-0/src/v3d.c /src/v3d.c +--- /home/d4rk/goom2k4-0/src/v3d.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/v3d.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,15 +0,0 @@ +-#include "v3d.h" +- +-void v3d_to_v2d(v3d *v3, int nbvertex, int width, int height, float distance, v2d *v2) { +- int i; +- for (i=0;i<nbvertex;++i) { +- if (v3[i].z > 2) { +- int Xp, Yp; +- F2I((distance * v3[i].x / v3[i].z),Xp); +- F2I((distance * v3[i].y / v3[i].z),Yp); +- v2[i].x = Xp + (width>>1); +- v2[i].y = -Yp + (height>>1); +- } +- else v2[i].x=v2[i].y=-666; +- } +-} +diff -Naur /home/d4rk/goom2k4-0/src/v3d.h /src/v3d.h +--- /home/d4rk/goom2k4-0/src/v3d.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/v3d.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,65 +0,0 @@ +-#ifndef _V3D_H +-#define _V3D_H +- +-#include <math.h> +-#include <stdlib.h> +-#include <stdio.h> +- +-#include "mathtools.h" +- +-typedef struct { +- float x,y,z; +-} v3d; +- +-typedef struct { +- int x,y; +-} v2d; +- +-typedef struct { +- double x,y; +-} v2g; +- +-/* +- * projete le vertex 3D sur le plan d'affichage +- * retourne (0,0) si le point ne doit pas etre affiche. +- * +- * bonne valeur pour distance : 256 +- */ +-#define V3D_TO_V2D(v3,v2,width,height,distance) \ +-{ \ +- int Xp, Yp; \ +- if (v3.z > 2) { \ +- F2I((distance * v3.x / v3.z),Xp) ; \ +- F2I((distance * v3.y / v3.z),Yp) ; \ +- v2.x = Xp + (width>>1); \ +- v2.y = -Yp + (height>>1); \ +- } \ +- else v2.x=v2.y=-666; \ +-} +- +-void v3d_to_v2d(v3d *src, int nbvertex, int width, int height, float distance, v2d *v2_array); +- +-/* +- * rotation selon Y du v3d vi d'angle a (cosa=cos(a), sina=sin(a)) +- * centerz = centre de rotation en z +- */ +-#define Y_ROTATE_V3D(vi,vf,sina,cosa)\ +-{\ +- vf.x = vi.x * cosa - vi.z * sina;\ +- vf.z = vi.x * sina + vi.z * cosa;\ +- vf.y = vi.y;\ +-} +- +-/* +- * translation +- */ +-#define TRANSLATE_V3D(vsrc,vdest)\ +-{\ +- vdest.x += vsrc.x;\ +- vdest.y += vsrc.y;\ +- vdest.z += vsrc.z;\ +-} +- +-#define MUL_V3D(lf,v) {v.x*=lf;v.y*=lf;v.z*=lf;} +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/xmmx.c /src/xmmx.c +--- /home/d4rk/goom2k4-0/src/xmmx.c 2005-02-07 06:46:41.000000000 -0700 ++++ /src/xmmx.c 1969-12-31 17:00:00.000000000 -0700 +@@ -1,393 +0,0 @@ +- +-#ifdef HAVE_MMX +- +-/* a definir pour avoir exactement le meme resultat que la fonction C +- * (un chouillat plus lent).. mais la difference est assez peu notable. +- */ +-// #define STRICT_COMPAT +- +-#define BUFFPOINTNB 16 +-#define BUFFPOINTMASK 0xffff +-#define BUFFINCR 0xff +- +-#define sqrtperte 16 +-/* faire : a % sqrtperte <=> a & pertemask*/ +-#define PERTEMASK 0xf +-/* faire : a / sqrtperte <=> a >> PERTEDEC*/ +-#define PERTEDEC 4 +- +- +-/*#define MMX_TRACE*/ +-#include "mmx.h" +-/*#include "xmmx.h"*/ +-#include "goom_graphic.h" +- +-int xmmx_supported (void) { +- return (mm_support()&0x8)>>3; +-} +- +-void zoom_filter_xmmx (int prevX, int prevY, +- Pixel *expix1, Pixel *expix2, +- int *lbruS, int *lbruD, int buffratio, +- int precalCoef[16][16]) +-{ +- int bufsize = prevX * prevY; /* taille du buffer */ +- volatile int loop; /* variable de boucle */ +- +- mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ +- mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ +- +- volatile mmx_t prevXY; +- volatile mmx_t ratiox; +- /* volatile mmx_t interpix; */ +- +- expix1[0].val=expix1[prevX-1].val=expix1[prevX*prevY-1].val=expix1[prevX*prevY-prevX].val=0; +- +- prevXY.ud[0] = (prevX-1)<<PERTEDEC; +- prevXY.ud[1] = (prevY-1)<<PERTEDEC; +- +- ratiox.d[0] = buffratio; +- ratiox.d[1] = buffratio; +- +- asm volatile +- ("\n\t movq %[ratio], %%mm6" +- "\n\t pslld $16, %%mm6" /* mm6 = [rat16=buffratio<<16 | rat16=buffratio<<16] */ +- "\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ +- ::[ratio]"m"(ratiox)); +- +- loop=0; +- +- /* +- * NOTE : mm6 et mm7 ne sont pas modifies dans la boucle. +- */ +- while (loop < bufsize) +- { +- /* Thread #1 +- * pre : mm6 = [rat16|rat16] +- * post : mm0 = S + ((D-S)*rat16 format [X|Y] +- * modified = mm0,mm1,mm2 +- */ +- +- asm volatile +- ("#1 \n\t movq %[brutS], %%mm0" +- "#1 \n\t movq %[brutD], %%mm1" +- "#1 \n\t psubd %%mm0, %%mm1" /* mm1 = D - S */ +- "#1 \n\t movq %%mm1, %%mm2" /* mm2 = D - S */ +- "#1 \n\t pslld $16, %%mm1" +- "#1 \n\t pmullw %%mm6, %%mm2" +- "#1 \n\t pmulhuw %%mm6, %%mm1" +- +- "#1 \n\t pslld $16, %%mm0" +- "#1 \n\t paddd %%mm2, %%mm1" /* mm1 = (D - S) * buffratio >> 16 */ +- +- "#1 \n\t paddd %%mm1, %%mm0" /* mm0 = S + mm1 */ +- "#1 \n\t psrld $16, %%mm0" +- : +- : [brutS]"g"(brutS[loop]) +- , [brutD]"g"(brutD[loop]) +- ); /* mm0 = S */ +- +- /* +- * pre : mm0 : position vector on screen +- * prevXY : coordinate of the lower-right point on screen +- * post : clipped mm0 +- * modified : mm0,mm1,mm2 +- */ +- asm volatile +- ("#1 \n\t movq %[prevXY], %%mm1" +- "#1 \n\t pcmpgtd %%mm0, %%mm1" +- /* mm0 en X contient (idem pour Y) : +- * 1111 si prevXY > px +- * 0000 si prevXY <= px */ +-#ifdef STRICT_COMPAT +- "#1 \n\t movq %%mm1, %%mm2" +- "#1 \n\t punpckhdq %%mm2, %%mm2" +- "#1 \n\t punpckldq %%mm1, %%mm1" +- "#1 \n\t pand %%mm2, %%mm0" +-#endif +- +- "#1 \n\t pand %%mm1, %%mm0" /* on met a zero la partie qui deborde */ +- ::[prevXY]"m"(prevXY)); +- +- /* Thread #2 +- * pre : mm0 : clipped position on screen +- * +- * post : mm3 : coefs for this position +- * mm1 : X vector [0|X] +- * +- * modif : eax,esi +- */ +- __asm__ __volatile__ ( +- "#2 \n\t movd %%mm0,%%esi" +- "#2 \n\t movq %%mm0,%%mm1" +- +- "#2 \n\t andl $15,%%esi" +- "#2 \n\t psrlq $32,%%mm1" +- +- "#2 \n\t shll $6,%%esi" +- "#2 \n\t movd %%mm1,%%eax" +- +- "#2 \n\t addl %[precalCoef],%%esi" +- "#2 \n\t andl $15,%%eax" +- +- "#2 \n\t movd (%%esi,%%eax,4),%%mm3" +- ::[precalCoef]"g"(precalCoef):"eax","esi"); +- +- /* +- * extraction des coefficients... (Thread #3) +- * +- * pre : coef dans mm3 +- * +- * post : coef extraits dans mm3 (c1 & c2) +- * et mm4 (c3 & c4) +- * +- * modif : mm5 +- */ +- +- /* (Thread #4) +- * pre : mm0 : Y pos [*|Y] +- * mm1 : X pos [*|X] +- * +- * post : mm0 : expix1[position] +- * mm2 : expix1[position+largeur] +- * +- * modif : eax, esi +- */ +- __asm__ __volatile__ ( +- "#2 \n\t psrld $4, %%mm0" +- "#2 \n\t psrld $4, %%mm1" /* PERTEDEC = $4 */ +- +- "#4 \n\t movd %%mm1,%%eax" +- "#3 \n\t movq %%mm3,%%mm5" +- +- "#4 \n\t mull %[prevX]" +- "#4 \n\t movd %%mm0,%%esi" +- +- "#3 \n\t punpcklbw %%mm5, %%mm3" +- "#4 \n\t addl %%esi, %%eax" +- +- "#3 \n\t movq %%mm3, %%mm4" +- "#3 \n\t movq %%mm3, %%mm5" +- +- "#4 \n\t movl %[expix1], %%esi" +- "#3 \n\t punpcklbw %%mm5, %%mm3" +- +- "#4 \n\t movq (%%esi,%%eax,4),%%mm0" +- "#3 \n\t punpckhbw %%mm5, %%mm4" +- +- "#4 \n\t addl %[prevX],%%eax" +- "#4 \n\t movq (%%esi,%%eax,4),%%mm2" +- +- : +- : [expix1] "g"(expix1) +- , [prevX] "g"(prevX) +- :"eax","esi" +- ); +- +- /* +- * pre : mm0 : expix1[position] +- * mm2 : expix1[position+largeur] +- * mm3 & mm4 : coefs +- */ +- +- /* recopie des deux premiers pixels dans mm0 et mm1 */ +- movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ +- +- /* depackage du premier pixel */ +- punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ +- +- /* extraction des coefficients... */ +- +- movq_r2r (mm3, mm5); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +- +- /*^en parrallele^*/ /* depackage du 2ieme pixel */ +- /*^*/ punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ +- +- punpcklbw_r2r (mm7, mm5); /* 00-c1-00-c1-00-c1-00-c1 */ +- punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ +- +- /* multiplication des pixels par les coefficients */ +- pmullw_r2r (mm5, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ +- pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ +- paddw_r2r (mm1, mm0); +- +- /* ...extraction des 2 derniers coefficients */ +- movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ +- punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ +- punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ +- +- /* recuperation des 2 derniers pixels */ +- movq_r2r (mm2, mm1); +- +- /* depackage des pixels */ +- punpcklbw_r2r (mm7, mm1); +- punpckhbw_r2r (mm7, mm2); +- +- /* multiplication pas les coeffs */ +- pmullw_r2r (mm4, mm1); +- pmullw_r2r (mm5, mm2); +- +- /* ajout des valeurs obtenues à la valeur finale */ +- paddw_r2r (mm1, mm0); +- paddw_r2r (mm2, mm0); +- +- /* division par 256 = 16+16+16+16, puis repackage du pixel final */ +- psrlw_i2r (8, mm0); +- packuswb_r2r (mm7, mm0); +- +- movd_r2m (mm0,expix2[loop]); +- +- ++loop; +- } +- __asm__ __volatile__ ("femms\n"); +-} +- +-#define DRAWMETHOD_PLUS_XMMX(_out,_backbuf,_col) \ +-{ \ +- movd_m2r(_backbuf, mm0); \ +- paddusb_m2r(_col, mm0); \ +- movd_r2m(mm0, _out); \ +-} +- +-#define DRAWMETHOD DRAWMETHOD_PLUS_XMMX(*p,*p,col) +- +-void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) +-{ +- int x, y, dx, dy, yy, xx; +- Pixel *p; +- +- if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) +- goto end_of_line; +- +- dx = x2 - x1; +- dy = y2 - y1; +- if (x1 >= x2) { +- int tmp; +- +- tmp = x1; +- x1 = x2; +- x2 = tmp; +- tmp = y1; +- y1 = y2; +- y2 = tmp; +- dx = x2 - x1; +- dy = y2 - y1; +- } +- +- /* vertical line */ +- if (dx == 0) { +- if (y1 < y2) { +- p = &(data[(screenx * y1) + x1]); +- for (y = y1; y <= y2; y++) { +- DRAWMETHOD; +- p += screenx; +- } +- } +- else { +- p = &(data[(screenx * y2) + x1]); +- for (y = y2; y <= y1; y++) { +- DRAWMETHOD; +- p += screenx; +- } +- } +- goto end_of_line; +- } +- /* horizontal line */ +- if (dy == 0) { +- if (x1 < x2) { +- p = &(data[(screenx * y1) + x1]); +- for (x = x1; x <= x2; x++) { +- DRAWMETHOD; +- p++; +- } +- goto end_of_line; +- } +- else { +- p = &(data[(screenx * y1) + x2]); +- for (x = x2; x <= x1; x++) { +- DRAWMETHOD; +- p++; +- } +- goto end_of_line; +- } +- } +- /* 1 */ +- /* \ */ +- /* \ */ +- /* 2 */ +- if (y2 > y1) { +- /* steep */ +- if (dy > dx) { +- dx = ((dx << 16) / dy); +- x = x1 << 16; +- for (y = y1; y <= y2; y++) { +- xx = x >> 16; +- p = &(data[(screenx * y) + xx]); +- DRAWMETHOD; +- if (xx < (screenx - 1)) { +- p++; +- /* DRAWMETHOD; */ +- } +- x += dx; +- } +- goto end_of_line; +- } +- /* shallow */ +- else { +- dy = ((dy << 16) / dx); +- y = y1 << 16; +- for (x = x1; x <= x2; x++) { +- yy = y >> 16; +- p = &(data[(screenx * yy) + x]); +- DRAWMETHOD; +- if (yy < (screeny - 1)) { +- p += screeny; +- /* DRAWMETHOD; */ +- } +- y += dy; +- } +- } +- } +- /* 2 */ +- /* / */ +- /* / */ +- /* 1 */ +- else { +- /* steep */ +- if (-dy > dx) { +- dx = ((dx << 16) / -dy); +- x = (x1 + 1) << 16; +- for (y = y1; y >= y2; y--) { +- xx = x >> 16; +- p = &(data[(screenx * y) + xx]); +- DRAWMETHOD; +- if (xx < (screenx - 1)) { +- p--; +- /* DRAWMETHOD; */ +- } +- x += dx; +- } +- goto end_of_line; +- } +- /* shallow */ +- else { +- dy = ((dy << 16) / dx); +- y = y1 << 16; +- for (x = x1; x <= x2; x++) { +- yy = y >> 16; +- p = &(data[(screenx * yy) + x]); +- DRAWMETHOD; +- if (yy < (screeny - 1)) { +- p += screeny; +- /* DRAWMETHOD; */ +- } +- y += dy; +- } +- goto end_of_line; +- } +- } +-end_of_line: +- __asm__ __volatile__ ("femms\n"); +-} +- +-#endif +diff -Naur /home/d4rk/goom2k4-0/src/xmmx.h /src/xmmx.h +--- /home/d4rk/goom2k4-0/src/xmmx.h 2005-02-07 06:46:41.000000000 -0700 ++++ /src/xmmx.h 1969-12-31 17:00:00.000000000 -0700 +@@ -1,537 +0,0 @@ +-/* xmmx.h +- +- eXtended MultiMedia eXtensions GCC interface library for IA32. +- +- To use this library, simply include this header file +- and compile with GCC. You MUST have inlining enabled +- in order for xmmx_ok() to work; this can be done by +- simply using -O on the GCC command line. +- +- Compiling with -DXMMX_TRACE will cause detailed trace +- output to be sent to stderr for each mmx operation. +- This adds lots of code, and obviously slows execution to +- a crawl, but can be very useful for debugging. +- +- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY +- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT +- LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY +- AND FITNESS FOR ANY PARTICULAR PURPOSE. +- +- 1999 by R. Fisher +- Based on libmmx, 1997-99 by H. Dietz and R. Fisher +- +- Notes: +- It appears that the latest gas has the pand problem fixed, therefore +- I'll undefine BROKEN_PAND by default. +-*/ +- +-#ifndef _XMMX_H +-#define _XMMX_H +- +- +-/* Warning: at this writing, the version of GAS packaged +- with most Linux distributions does not handle the +- parallel AND operation mnemonic correctly. If the +- symbol BROKEN_PAND is defined, a slower alternative +- coding will be used. If execution of mmxtest results +- in an illegal instruction fault, define this symbol. +-*/ +-#undef BROKEN_PAND +- +- +-/* The type of an value that fits in an (Extended) MMX register +- (note that long long constant values MUST be suffixed +- by LL and unsigned long long values by ULL, lest +- they be truncated by the compiler) +-*/ +-#ifndef _MMX_H +-typedef union { +- long long q; /* Quadword (64-bit) value */ +- unsigned long long uq; /* Unsigned Quadword */ +- int d[2]; /* 2 Doubleword (32-bit) values */ +- unsigned int ud[2]; /* 2 Unsigned Doubleword */ +- short w[4]; /* 4 Word (16-bit) values */ +- unsigned short uw[4]; /* 4 Unsigned Word */ +- char b[8]; /* 8 Byte (8-bit) values */ +- unsigned char ub[8]; /* 8 Unsigned Byte */ +- float s[2]; /* Single-precision (32-bit) value */ +-} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ +-#endif +- +- +- +-/* Function to test if multimedia instructions are supported... +-*/ +-static int +-mm_support(void) +-{ +- /* Returns 1 if MMX instructions are supported, +- 3 if Cyrix MMX and Extended MMX instructions are supported +- 5 if AMD MMX and 3DNow! instructions are supported +- 0 if hardware does not support any of these +- */ +- register int rval = 0; +- +- __asm__ __volatile__ ( +- /* See if CPUID instruction is supported ... */ +- /* ... Get copies of EFLAGS into eax and ecx */ +- "pushf\n\t" +- "popl %%eax\n\t" +- "movl %%eax, %%ecx\n\t" +- +- /* ... Toggle the ID bit in one copy and store */ +- /* to the EFLAGS reg */ +- "xorl $0x200000, %%eax\n\t" +- "push %%eax\n\t" +- "popf\n\t" +- +- /* ... Get the (hopefully modified) EFLAGS */ +- "pushf\n\t" +- "popl %%eax\n\t" +- +- /* ... Compare and test result */ +- "xorl %%eax, %%ecx\n\t" +- "testl $0x200000, %%ecx\n\t" +- "jz NotSupported1\n\t" /* CPUID not supported */ +- +- +- /* Get standard CPUID information, and +- go to a specific vendor section */ +- "movl $0, %%eax\n\t" +- "cpuid\n\t" +- +- /* Check for Intel */ +- "cmpl $0x756e6547, %%ebx\n\t" +- "jne TryAMD\n\t" +- "cmpl $0x49656e69, %%edx\n\t" +- "jne TryAMD\n\t" +- "cmpl $0x6c65746e, %%ecx\n" +- "jne TryAMD\n\t" +- "jmp Intel\n\t" +- +- /* Check for AMD */ +- "\nTryAMD:\n\t" +- "cmpl $0x68747541, %%ebx\n\t" +- "jne TryCyrix\n\t" +- "cmpl $0x69746e65, %%edx\n\t" +- "jne TryCyrix\n\t" +- "cmpl $0x444d4163, %%ecx\n" +- "jne TryCyrix\n\t" +- "jmp AMD\n\t" +- +- /* Check for Cyrix */ +- "\nTryCyrix:\n\t" +- "cmpl $0x69727943, %%ebx\n\t" +- "jne NotSupported2\n\t" +- "cmpl $0x736e4978, %%edx\n\t" +- "jne NotSupported3\n\t" +- "cmpl $0x64616574, %%ecx\n\t" +- "jne NotSupported4\n\t" +- /* Drop through to Cyrix... */ +- +- +- /* Cyrix Section */ +- /* See if extended CPUID level 80000001 is supported */ +- /* The value of CPUID/80000001 for the 6x86MX is undefined +- according to the Cyrix CPU Detection Guide (Preliminary +- Rev. 1.01 table 1), so we'll check the value of eax for +- CPUID/0 to see if standard CPUID level 2 is supported. +- According to the table, the only CPU which supports level +- 2 is also the only one which supports extended CPUID levels. +- */ +- "cmpl $0x2, %%eax\n\t" +- "jne MMXtest\n\t" /* Use standard CPUID instead */ +- +- /* Extended CPUID supported (in theory), so get extended +- features */ +- "movl $0x80000001, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%eax\n\t" /* Test for MMX */ +- "jz NotSupported5\n\t" /* MMX not supported */ +- "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ +- "jnz EMMXSupported\n\t" +- "movl $1, %0:\n\n\t" /* MMX Supported */ +- "jmp Return\n\n" +- "EMMXSupported:\n\t" +- "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */ +- "jmp Return\n\t" +- +- +- /* AMD Section */ +- "AMD:\n\t" +- +- /* See if extended CPUID is supported */ +- "movl $0x80000000, %%eax\n\t" +- "cpuid\n\t" +- "cmpl $0x80000000, %%eax\n\t" +- "jl MMXtest\n\t" /* Use standard CPUID instead */ +- +- /* Extended CPUID supported, so get extended features */ +- "movl $0x80000001, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%edx\n\t" /* Test for MMX */ +- "jz NotSupported6\n\t" /* MMX not supported */ +- "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ +- "jnz ThreeDNowSupported\n\t" +- "movl $1, %0:\n\n\t" /* MMX Supported */ +- "jmp Return\n\n" +- "ThreeDNowSupported:\n\t" +- "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */ +- "jmp Return\n\t" +- +- +- /* Intel Section */ +- "Intel:\n\t" +- +- /* Check for MMX */ +- "MMXtest:\n\t" +- "movl $1, %%eax\n\t" +- "cpuid\n\t" +- "testl $0x00800000, %%edx\n\t" /* Test for MMX */ +- "jz NotSupported7\n\t" /* MMX Not supported */ +- "movl $1, %0:\n\n\t" /* MMX Supported */ +- "jmp Return\n\t" +- +- /* Nothing supported */ +- "\nNotSupported1:\n\t" +- "#movl $101, %0:\n\n\t" +- "\nNotSupported2:\n\t" +- "#movl $102, %0:\n\n\t" +- "\nNotSupported3:\n\t" +- "#movl $103, %0:\n\n\t" +- "\nNotSupported4:\n\t" +- "#movl $104, %0:\n\n\t" +- "\nNotSupported5:\n\t" +- "#movl $105, %0:\n\n\t" +- "\nNotSupported6:\n\t" +- "#movl $106, %0:\n\n\t" +- "\nNotSupported7:\n\t" +- "#movl $107, %0:\n\n\t" +- "movl $0, %0:\n\n\t" +- +- "Return:\n\t" +- : "=a" (rval) +- : /* no input */ +- : "eax", "ebx", "ecx", "edx" +- ); +- +- /* Return */ +- return(rval); +-} +- +-/* Function to test if mmx instructions are supported... +-*/ +-#ifndef _XMMX_H +-inline extern int +-mmx_ok(void) +-{ +- /* Returns 1 if MMX instructions are supported, 0 otherwise */ +- return ( mm_support() & 0x1 ); +-} +-#endif +- +-/* Function to test if xmmx instructions are supported... +-*/ +-inline extern int +-xmmx_ok(void) +-{ +- /* Returns 1 if Extended MMX instructions are supported, 0 otherwise */ +- return ( (mm_support() & 0x2) >> 1 ); +-} +- +- +-/* Helper functions for the instruction macros that follow... +- (note that memory-to-register, m2r, instructions are nearly +- as efficient as register-to-register, r2r, instructions; +- however, memory-to-memory instructions are really simulated +- as a convenience, and are only 1/3 as efficient) +-*/ +-#ifdef XMMX_TRACE +- +-/* Include the stuff for printing a trace to stderr... +-*/ +- +-#include <stdio.h> +- +-#define mmx_i2r(op, imm, reg) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace.uq = (imm); \ +- fprintf(stderr, #op "_i2r(" #imm "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #reg "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (imm)); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #reg "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_m2r(op, mem, reg) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace = (mem); \ +- fprintf(stderr, #op "_m2r(" #mem "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #reg "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (mem)); \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #reg "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_r2m(op, reg, mem) \ +- { \ +- mmx_t mmx_trace; \ +- __asm__ __volatile__ ("movq %%" #reg ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #op "_r2m(" #reg "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- mmx_trace = (mem); \ +- fprintf(stderr, #mem "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %%" #reg ", %0" \ +- : "=X" (mem) \ +- : /* nothing */ ); \ +- mmx_trace = (mem); \ +- fprintf(stderr, #mem "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_r2r(op, regs, regd) \ +- { \ +- mmx_t mmx_trace; \ +- __asm__ __volatile__ ("movq %%" #regs ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #op "_r2r(" #regs "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %%" #regd ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #regd "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ +- __asm__ __volatile__ ("movq %%" #regd ", %0" \ +- : "=X" (mmx_trace) \ +- : /* nothing */ ); \ +- fprintf(stderr, #regd "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#define mmx_m2m(op, mems, memd) \ +- { \ +- mmx_t mmx_trace; \ +- mmx_trace = (mems); \ +- fprintf(stderr, #op "_m2m(" #mems "=0x%08x%08x, ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- mmx_trace = (memd); \ +- fprintf(stderr, #memd "=0x%08x%08x) => ", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ +- #op " %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (memd) \ +- : "X" (mems)); \ +- mmx_trace = (memd); \ +- fprintf(stderr, #memd "=0x%08x%08x\n", \ +- mmx_trace.d[1], mmx_trace.d[0]); \ +- } +- +-#else +- +-/* These macros are a lot simpler without the tracing... +-*/ +- +-#define mmx_i2r(op, imm, reg) \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (imm) ) +- +-#define mmx_m2r(op, mem, reg) \ +- __asm__ __volatile__ (#op " %0, %%" #reg \ +- : /* nothing */ \ +- : "X" (mem)) +- +-#define mmx_m2ir(op, mem, rs) \ +- __asm__ __volatile__ (#op " %0, %%" #rs \ +- : /* nothing */ \ +- : "X" (mem) ) +- +-#define mmx_r2m(op, reg, mem) \ +- __asm__ __volatile__ (#op " %%" #reg ", %0" \ +- : "=X" (mem) \ +- : /* nothing */ ) +- +-#define mmx_r2r(op, regs, regd) \ +- __asm__ __volatile__ (#op " %" #regs ", %" #regd) +- +-#define mmx_r2ir(op, rs1, rs2) \ +- __asm__ __volatile__ (#op " %%" #rs1 ", %%" #rs2 \ +- : /* nothing */ \ +- : /* nothing */ ) +- +-#define mmx_m2m(op, mems, memd) \ +- __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ +- #op " %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (memd) \ +- : "X" (mems)) +- +-#endif +- +- +- +-/* 1x64 MOVe Quadword +- (this is both a load and a store... +- in fact, it is the only way to store) +-*/ +-#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +-#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +-#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +-#define movq(vars, vard) \ +- __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ +- "movq %%mm0, %0" \ +- : "=X" (vard) \ +- : "X" (vars)) +- +- +-/* 1x32 MOVe Doubleword +- (like movq, this is both load and store... +- but is most useful for moving things between +- mmx registers and ordinary registers) +-*/ +-#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +-#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +-#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +-#define movd(vars, vard) \ +- __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ +- "movd %%mm0, %0" \ +- : "=X" (vard) \ +- : "X" (vars)) +- +- +- +-/* 4x16 Parallel MAGnitude +-*/ +-#define pmagw_m2r(var, reg) mmx_m2r(pmagw, var, reg) +-#define pmagw_r2r(regs, regd) mmx_r2r(pmagw, regs, regd) +-#define pmagw(vars, vard) mmx_m2m(pmagw, vars, vard) +- +- +-/* 4x16 Parallel ADDs using Saturation arithmetic +- and Implied destination +-*/ +-#define paddsiw_m2ir(var, rs) mmx_m2ir(paddsiw, var, rs) +-#define paddsiw_r2ir(rs1, rs2) mmx_r2ir(paddsiw, rs1, rs2) +-#define paddsiw(vars, vard) mmx_m2m(paddsiw, vars, vard) +- +- +-/* 4x16 Parallel SUBs using Saturation arithmetic +- and Implied destination +-*/ +-#define psubsiw_m2ir(var, rs) mmx_m2ir(psubsiw, var, rs) +-#define psubsiw_r2ir(rs1, rs2) mmx_r2ir(psubsiw, rs1, rs2) +-#define psubsiw(vars, vard) mmx_m2m(psubsiw, vars, vard) +- +- +-/* 4x16 Parallel MULs giving High 4x16 portions of results +- Rounded with 1/2 bit 15. +-*/ +-#define pmulhrw_m2r(var, reg) mmx_m2r(pmulhrw, var, reg) +-#define pmulhrw_r2r(regs, regd) mmx_r2r(pmulhrw, regs, regd) +-#define pmulhrw(vars, vard) mmx_m2m(pmulhrw, vars, vard) +- +- +-/* 4x16 Parallel MULs giving High 4x16 portions of results +- Rounded with 1/2 bit 15, storing to Implied register +-*/ +-#define pmulhriw_m2ir(var, rs) mmx_m2ir(pmulhriw, var, rs) +-#define pmulhriw_r2ir(rs1, rs2) mmx_r2ir(pmulhriw, rs1, rs2) +-#define pmulhriw(vars, vard) mmx_m2m(pmulhriw, vars, vard) +- +- +-/* 4x16 Parallel Muls (and ACcumulate) giving High 4x16 portions +- of results Rounded with 1/2 bit 15, accumulating with Implied register +-*/ +-#define pmachriw_m2ir(var, rs) mmx_m2ir(pmachriw, var, rs) +-#define pmachriw_r2ir(rs1, rs2) mmx_r2ir(pmachriw, rs1, rs2) +-#define pmachriw(vars, vard) mmx_m2m(pmachriw, vars, vard) +- +- +-/* 8x8u Parallel AVErage +-*/ +-#define paveb_m2r(var, reg) mmx_m2r(paveb, var, reg) +-#define paveb_r2r(regs, regd) mmx_r2r(paveb, regs, regd) +-#define paveb(vars, vard) mmx_m2m(paveb, vars, vard) +- +- +-/* 8x8u Parallel DISTance and accumulate with +- unsigned saturation to Implied register +-*/ +-#define pdistib_m2ir(var, rs) mmx_m2ir(pdistib, var, rs) +-#define pdistib(vars, vard) mmx_m2m(pdistib, vars, vard) +- +- +-/* 8x8 Parallel conditional MoVe +- if implied register field is Zero +-*/ +-#define pmvzb_m2ir(var, rs) mmx_m2ir(pmvzb, var, rs) +- +- +-/* 8x8 Parallel conditional MoVe +- if implied register field is Not Zero +-*/ +-#define pmvnzb_m2ir(var, rs) mmx_m2ir(pmvnzb, var, rs) +- +- +-/* 8x8 Parallel conditional MoVe +- if implied register field is Less than Zero +-*/ +-#define pmvlzb_m2ir(var, rs) mmx_m2ir(pmvlzb, var, rs) +- +- +-/* 8x8 Parallel conditional MoVe +- if implied register field is Greater than or Equal to Zero +-*/ +-#define pmvgezb_m2ir(var, rs) mmx_m2ir(pmvgezb, var, rs) +- +- +-/* Fast Empty MMx State +- (used to clean-up when going from mmx to float use +- of the registers that are shared by both; note that +- there is no float-to-xmmx operation needed, because +- only the float tag word info is corruptible) +-*/ +-#ifdef XMMX_TRACE +- +-#define femms() \ +- { \ +- fprintf(stderr, "femms()\n"); \ +- __asm__ __volatile__ ("femms"); \ +- } +- +-#else +- +-#define femms() __asm__ __volatile__ ("femms") +- +-#endif +- +-#endif +- diff --git a/src/visualizations/Goom/goom2k4-0/AUTHORS b/src/visualizations/Goom/goom2k4-0/AUTHORS new file mode 100644 index 0000000000..af63c2f2e4 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/AUTHORS @@ -0,0 +1,9 @@ +What a GOOM! +============ + +Copyright (c)2000-2004, Jean-Christophe Hoelt <jeko@ios-software.com> +Programmer and Software Designer at iOS software. + +iTunes port/PowerPC/Core-Hacking: Guillaume Borios <gyom@ios-software.com> +WINAMP/WMP port: Fred + diff --git a/src/visualizations/Goom/goom2k4-0/COPYING b/src/visualizations/Goom/goom2k4-0/COPYING new file mode 100644 index 0000000000..a76126bf30 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/COPYING @@ -0,0 +1,3 @@ +This program is under the LGPL. +You can find the terms of this licence somewhere on the internet. +(for exemple, search "LGPL" on your favorite search engine). diff --git a/src/visualizations/Goom/goom2k4-0/ChangeLog b/src/visualizations/Goom/goom2k4-0/ChangeLog new file mode 100644 index 0000000000..3c2a986e41 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/ChangeLog @@ -0,0 +1,85 @@ +ChangeLogs for GOOM +------------------- + +.10/03/2004: version 2k4-dev12 + - A Goom Scripting Language embedded in. It allows hi level of + configuration and easy hacking of the effect's behaviour. + - Zoom filter now works on relative screen coordinates. +.04/12/2003: version 2k4-dev2 + A long time since last entry here but some work has been done during + this year, Goom v2 is now on the track and working pretty well. + Added: + - Configurability. + - A particule system for rain, fireworks and fountains. + - Dynamic brightness changes to make gooms more impressive. + - Cleaning the code. +.30/12/2002: + Auto-CPU detection. New font.. now stored in the binary file. +.28/12/2002: + Optimisation of the asm loop in ExtendedMMX +.30/11/2002: + Added tentacle3d. +.15/11/2002: + Dirty Hack to make inline asm compile well : + remove the -fPIC flag (by modifying ltconfig) +.11/11/2002: + Partial rewriting of the sound evaluator. +.10/11/2002: + bug fixes (crash with some song title, ...) + display/hide of the fps. + show information messages. +.10/08/2002: + xmms-goom now uses SDL. +.**/07/2002: + display the title. +.07/06/2002: version 1.9 + Slow change between FX. +.20/04/2002: version 1.8.1 + Hypercos effect. + - added a param to goom_core to force the fx change + - fullscreen for xmms works well + - keyboard input for xmms + - xmms-ctrl (control xmms from goom) + - auto-change fx after a large number of cycle with the same one +.11/04/2002: version 1.8.0 + IFS point effect.. +.10/12/2001: + Adding some new stuff from iGoom (circle line) + removing the init-close bug. + adding the oportunity to double the size of the pixel. +.11/07/2001: + Hello mister proper.. The code is more portable now. +.16/06/2001: + Fixing a little bug with the initial config loading. + Using the 2 new FX of the zoom filter. + + +ChangeLogs for KOP2ZEDEMO: the zoom filter +------------------------------------------ + +.16/06/2001: + NEW FX -> vPlane & hPlane. (to do rotations) + NEW FX -> noisify ; to add noise to the transformation buffer. +.03/01/2001: + All buffers are now created by a malloc + reduction of the performances... but it is now more configurable... + .(MMX version is now 50 clocks per pixel) +.28/12/2000: + Optimizing a little the sinFilter +.27/12/2000: + Optimizing the buffer generator + .(previous : 767 clocks/pixel => now : 234 clk/pxl) + Adding two effect: AMULETTE and SCRUNCH +.22/12/2000: + Good optimization : reducing mem access + .(MMX version is now 45 clocks per pixel) +.13/12/2000: + Unrolling loop +.12/12/2000: + Optimisation of the ASM code -> 64bits RAM access + .(MMX version is now 55 clocks per pixel) +.10/12/2000: + MMX version of the zoomer + .(MMX version is now 70 clocks per pixel) + +author: Jean-Christophe Hoelt <jeko@ios-software.com> diff --git a/src/visualizations/Goom/goom2k4-0/KNOWNBUGS b/src/visualizations/Goom/goom2k4-0/KNOWNBUGS new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/KNOWNBUGS @@ -0,0 +1 @@ + diff --git a/src/visualizations/Goom/goom2k4-0/Makefile.am b/src/visualizations/Goom/goom2k4-0/Makefile.am new file mode 100644 index 0000000000..a4392f2f03 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/Makefile.am @@ -0,0 +1,7 @@ +SUBDIRS = src xmms-goom sdl-goom @MACFOLDER@ + +#.pc file +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libgoom2.pc + +DISTCLEANFILES = libgoom2.pc diff --git a/src/visualizations/Goom/goom2k4-0/NEWS b/src/visualizations/Goom/goom2k4-0/NEWS new file mode 100644 index 0000000000..38a7ad034a --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/NEWS @@ -0,0 +1 @@ +see ChangeLog diff --git a/src/visualizations/Goom/goom2k4-0/README b/src/visualizations/Goom/goom2k4-0/README new file mode 100644 index 0000000000..161ecb62c9 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/README @@ -0,0 +1,25 @@ +************************** +* What a GOOM! version 2 * +************************** +copyright 2000-2004, by Jean-Christophe Hoelt <jeko@ios-software.com> + +This is my first visual plugins for XMMS, and I think that it's the best +I have ever done ! + + /-----------------\\ +--< where to get Goom >-- + \\-----------------/ + +You can find the last version on the website of +iOS software: +http://www.ios-software.com/ + + /------\\ +--< thanks >-- + \\------/ + +Skal for the code of IFS +Burkhard for the initial fullscreen patch +Gyom for the iTunes version +Fred for the Windows version and a lot of other Goom Stuff + diff --git a/src/visualizations/Goom/goom2k4-0/autogen.sh b/src/visualizations/Goom/goom2k4-0/autogen.sh new file mode 100755 index 0000000000..c817953cfb --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/autogen.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +if libtoolize --version 2> /dev/null; then +aclocal -I m4 && libtoolize --copy --force && automake --foreign --add-missing && autoconf && ./configure $* +else +aclocal -I m4 && glibtoolize --copy --force && automake --foreign --add-missing && autoconf && ./configure $* +fi + diff --git a/src/visualizations/Goom/goom2k4-0/configure.in b/src/visualizations/Goom/goom2k4-0/configure.in new file mode 100644 index 0000000000..aab2d75ed2 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/configure.in @@ -0,0 +1,147 @@ +AC_INIT(README) + +AM_DISABLE_STATIC +AM_INIT_AUTOMAKE(SDL_Goom, 2k4) + +ACLOCAL="$ACLOCAL -I m4" + +AM_PROG_LIBTOOL +AC_PROG_CC +AC_PROG_LN_S +AM_PROG_LEX +AC_PROG_YACC + +AC_C_BIGENDIAN + +dnl Get the CFlags +CFLAGS="${CFLAGS}" +LDFLAGS="${LDFLAGS}" + +dnl *** check for xmms *** + +HAVE_XMMS="no" +AM_CONDITIONAL(HAVE_XMMS,test "x$HAVE_XMMS" = "xyes") + + +dnl *** SDL *** + +HAVE_SDL="no" +AM_CONDITIONAL(HAVE_SDL,test "x$HAVE_SDL" = "xyes") + + +dnl *** MMX *** + +dnl rm -f mmx_zoom.s +HAVE_MMX="no" +HAVE_PPC="no" +MACTARGET="no" + +dnl HOST +case "$host" in +*-apple-darwin*) + MACTARGET="no" + MACFOLDER="" + AC_SUBST(MACFOLDER) + CCAS='$(CC)' + AC_SUBST(CCAS) + ;; +*-*-cygwin*) + CFLAGS="$CFLAGS -mno-cygwin -mwindows" + LDFLAGS="$LDFLAGS -lmingw32" + ;; +esac + +dnl ARCH +case "$host" in +i*86-*-*) + AC_DEFINE(HAVE_MMX) + AC_DEFINE(CPU_X86) + HAVE_MMX="yes" + ;; + +powerpc-*-*) + CCASFLAGS=-force_cpusubtype_ALL + AC_SUBST(CCASFLAGS) + AC_DEFINE(CPU_POWERPC) + HAVE_PPC="yes" + ;; + +esac +AM_CONDITIONAL(HAVE_MMX,test "x$HAVE_MMX" = "xyes") +AM_CONDITIONAL(HAVE_PPC,test "x$HAVE_PPC" = "xyes") +AM_CONDITIONAL(MACTARGET,test "x$MACTARGET" = "xyes") + + +AC_CHECK_HEADER(pthread.h,,AC_MSG_ERROR([*** POSIX thread support not installed - please install first ***])) + +PTHREAD_LIBS=error +AC_CHECK_LIB(pthread, pthread_attr_init, PTHREAD_LIBS="-lpthread") + +if test "x$PTHREAD_LIBS" = xerror; then + AC_CHECK_LIB(pthreads, pthread_attr_init, PTHREAD_LIBS="-lpthreads") +fi + +if test "x$PTHREAD_LIBS" = xerror; then + AC_CHECK_LIB(c_r, pthread_attr_init, PTHREAD_LIBS="-lc_r") +fi + +if test "x$PTHREAD_LIBS" = xerror; then + AC_CHECK_FUNC(pthread_attr_init, PTHREAD_LIBS="") +fi + +AC_SUBST(PTHREAD_LIBS) + +dnl rm -f mmx_zoom.s +dnl echo -n checking for nasm... +dnl if nasm -r 1> /dev/null 2> /dev/null +dnl then +dnl echo " `nasm -r` founded.."; +dnl else +dnl echo " not found." +dnl echo '*** NASM needed to build x86 assembly..***' +dnl AC_MSG_ERROR +dnl fi +dnl esac + +dnl AC_DEFINE(USE_ASM_MMX) +dnl ln -s mmx_zoom_x86.s mmx_zoom.s ;; +dnl *) +dnl ln -s mmx_zoom_dummy.s mmx_zoom.s ;; +dnl esac + +AC_SUBST(CFLAGS) +AC_SUBST(LDFLAGS) + +AC_OUTPUT(Makefile src/Makefile xmms-goom/Makefile sdl-goom/Makefile libgoom2.pc) + +dnl *** nice user info *** + +AC_MSG_NOTICE([goom2k4 was configured with the following options:]) +if test "x$HAVE_PPC" = "xyes"; then + AC_MSG_NOTICE([ ** PPC support enabled]) +else + AC_MSG_NOTICE([ PPC support disabled]) +fi +if test "x$HAVE_MMX" = "xyes"; then + AC_MSG_NOTICE([ ** MMX support enabled]) +else + AC_MSG_NOTICE([ MMX support disabled]) +fi +AC_MSG_NOTICE([ ** goom lib will be built]) +if test "x$HAVE_XMMS" = "xyes"; then + AC_MSG_NOTICE([ ** XMMS plugin will be built]) +else + AC_MSG_NOTICE([ XMMS plugin will not be built]) +fi +if test "x$MACTARGET" = "xyes"; then + AC_MSG_NOTICE([ ** goom mac application will be built]) + AC_MSG_NOTICE([ ** goom mac iTunes plugin will be built]) +else + AC_MSG_NOTICE([ goom mac application will not be built]) + AC_MSG_NOTICE([ goom mac iTunes plugin will not be built]) +fi +if test "x$HAVE_SDL" = "xyes"; then + AC_MSG_NOTICE([ ** goom sdl application will be built]) +else + AC_MSG_NOTICE([ goom sdl application will not be built]) +fi diff --git a/src/visualizations/Goom/goom2k4-0/goom2k4.png b/src/visualizations/Goom/goom2k4-0/goom2k4.png Binary files differnew file mode 100644 index 0000000000..957402dcfe --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/goom2k4.png diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/ABOUT-NLS b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/ABOUT-NLS new file mode 100644 index 0000000000..28d38c76fd --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/ABOUT-NLS @@ -0,0 +1,226 @@ +Notes on the Free Translation Project +************************************* + + Free software is going international! The Free Translation Project +is a way to get maintainers of free software, translators, and users all +together, so that will gradually become able to speak many languages. +A few packages already provide translations for their messages. + + If you found this `ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU `gettext' internally, +itself available at your nearest GNU archive site. But you do *not* +need to install GNU `gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work at translations should contact the appropriate team. + + When reporting bugs in the `intl/' directory or bugs which may be +related to internationalization, you should tell about the version of +`gettext' which is used. The information can be found in the +`intl/VERSION' file, in internationalized packages. + +One advise in advance +===================== + + If you want to exploit the full power of internationalization, you +should configure it using + + ./configure --with-included-gettext + +to force usage of internationalizing routines provided within this +package, despite the existence of internationalizing capabilities in the +operating system where this package is being installed. So far, only +the `gettext' implementation in the GNU C library version 2 provides as +many features (such as locale alias or message inheritance) as the +implementation here. It is also not possible to offer this additional +functionality on top of a `catgets' implementation. Future versions of +GNU `gettext' will very likely convey even more functionality. So it +might be a good idea to change to GNU `gettext' as soon as possible. + + So you need not provide this option if you are using GNU libc 2 or +you have installed a recent copy of the GNU gettext package with the +included `libintl'. + +INSTALL Matters +=============== + + Some packages are "localizable" when properly installed; the +programs they contain can be made to speak your own native language. +Most such packages use GNU `gettext'. Other packages have their own +ways to internationalization, predating GNU `gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system provides +usable `catgets' (if using this is selected by the installer) or +`gettext' functions. If neither is available, the GNU `gettext' own +library will be used. This library is wholly contained within this +package, usually in the `intl/' subdirectory, so prior installation of +the GNU `gettext' package is *not* required. Installers may use +special options at configuration time for changing the default +behaviour. The commands: + + ./configure --with-included-gettext + ./configure --with-catgets + ./configure --disable-nls + +will respectively bypass any pre-existing `catgets' or `gettext' to use +the internationalizing routines provided within this package, enable +the use of the `catgets' functions (if found on the locale system), or +else, *totally* disable translation of messages. + + When you already have GNU `gettext' installed on your system and run +configure without an option for your new package, `configure' will +probably detect the previously built and installed `libintl.a' file and +will decide to use this. This might be not what is desirable. You +should use the more recent version of the GNU `gettext' library. I.e. +if the file `intl/VERSION' shows that the library which comes with this +package is more recent, you should use + + ./configure --with-included-gettext + +to prevent auto-detection. + + By default the configuration process will not test for the `catgets' +function and therefore they will not be used. The reasons are already +given above: the emulation on top of `catgets' cannot provide all the +extensions provided by the GNU `gettext' library. If you nevertheless +want to use the `catgets' functions use + + ./configure --with-catgets + +to enable the test for `catgets' (this causes no harm if `catgets' is +not available on your system). If you really select this option we +would like to hear about the reasons because we cannot think of any +good one ourself. + + Internationalized packages have usually many `po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at `configure' time by using the +`--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable `LINGUAS' +may be set, prior to configuration, to limit the installed set. +`LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +Using This Package +================== + + As a user, if your language has been installed for this package, you +only have to set the `LANG' environment variable to the appropriate +ISO 639 `LL' two-letter code prior to using the programs in the +package. For example, let's suppose that you speak German. At the +shell prompt, merely execute `setenv LANG de' (in `csh'), +`export LANG; LANG=de' (in `sh') or `export LANG=de' (in `bash'). This +can be done from your `.login' or `.profile' file, once and for all. + + An operating system might already offer message localization for +many of its programs, while other programs have been installed locally +with the full capabilities of GNU `gettext'. Just using `gettext' +extended syntax for `LANG' would break proper localization of already +available operating system programs. In this case, users should set +both `LANGUAGE' and `LANG' variables in their environment, as programs +using GNU `gettext' give preference to `LANGUAGE'. For example, some +Swedish users would rather read translations in German than English for +when Swedish is not available. This is easily accomplished by setting +`LANGUAGE' to `sv:de' while leaving `LANG' to `sv'. + +Translating Teams +================= + + For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list, courtesy of Linux +International. You may reach your translation team at the address +`LL@li.org', replacing LL by the two-letter ISO 639 code for your +language. Language codes are *not* the same as the country codes given +in ISO 3166. The following translation teams exist, as of December +1997: + + Chinese `zh', Czech `cs', Danish `da', Dutch `nl', English `en', + Esperanto `eo', Finnish `fi', French `fr', German `de', Hungarian + `hu', Irish `ga', Italian `it', Indonesian `id', Japanese `ja', + Korean `ko', Latin `la', Norwegian `no', Persian `fa', Polish + `pl', Portuguese `pt', Russian `ru', Slovenian `sl', Spanish `es', + Swedish `sv', and Turkish `tr'. + +For example, you may reach the Chinese translation team by writing to +`zh@li.org'. + + If you'd like to volunteer to *work* at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is *not* the same as the list itself, it has +`-request' appended. For example, speakers of Swedish can send a +message to `sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate +*actively* in translations, or at solving translational difficulties, +rather than merely lurking around. If your team does not exist yet and +you want to start one, or if you are unsure about what to do or how to +get started, please write to `translation@iro.umontreal.ca' to reach the +coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skill are praised more than +programming skill, here. + +Available Packages +================== + + Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of December +1997. The matrix shows, in regard of each package, for which languages +PO files have been submitted to translation coordination. + + Ready PO files cs da de en es fi fr it ja ko nl no pl pt ru sl sv + .----------------------------------------------------. + bash | [] [] [] | 3 + bison | [] [] [] | 3 + clisp | [] [] [] [] | 4 + cpio | [] [] [] [] [] [] | 6 + diffutils | [] [] [] [] [] | 5 + enscript | [] [] [] [] [] [] | 6 + fileutils | [] [] [] [] [] [] [] [] [] [] | 10 + findutils | [] [] [] [] [] [] [] [] [] | 9 + flex | [] [] [] [] | 4 + gcal | [] [] [] [] [] | 5 + gettext | [] [] [] [] [] [] [] [] [] [] [] | 12 + grep | [] [] [] [] [] [] [] [] [] [] | 10 + hello | [] [] [] [] [] [] [] [] [] [] [] | 11 + id-utils | [] [] [] | 3 + indent | [] [] [] [] [] | 5 + libc | [] [] [] [] [] [] [] | 7 + m4 | [] [] [] [] [] [] | 6 + make | [] [] [] [] [] [] | 6 + music | [] [] | 2 + ptx | [] [] [] [] [] [] [] [] | 8 + recode | [] [] [] [] [] [] [] [] [] | 9 + sh-utils | [] [] [] [] [] [] [] [] | 8 + sharutils | [] [] [] [] [] [] | 6 + tar | [] [] [] [] [] [] [] [] [] [] [] | 11 + texinfo | [] [] [] | 3 + textutils | [] [] [] [] [] [] [] [] [] | 9 + wdiff | [] [] [] [] [] [] [] [] | 8 + `----------------------------------------------------' + 17 languages cs da de en es fi fr it ja ko nl no pl pt ru sl sv + 27 packages 6 4 25 1 18 1 26 2 1 12 20 9 19 7 4 7 17 179 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and +distributed as such by its maintainer. There might be an observable +lag between the mere existence a PO file and its wide availability in a +distribution. + + If December 1997 seems to be old, you may fetch a more recent copy +of this `ABOUT-NLS' file on most GNU archive sites. + diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/AUTHORS b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/AUTHORS new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/AUTHORS diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/COPYING b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/COPYING new file mode 100644 index 0000000000..d60c31a97a --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/ChangeLog b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/ChangeLog new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/ChangeLog diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/INSTALL b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/INSTALL new file mode 100644 index 0000000000..62ea076c1f --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/INSTALL @@ -0,0 +1,231 @@ +Copyright 1994, 1995, 1996, 1999, 2000, 2001 Free Software Foundation, +Inc. + + This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for variables by setting +them in the environment. You can do that on the command line like this: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it cannot guess the host type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are _building_ compiler tools for cross-compiling, you should +use the `--target=TYPE' option to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the host +platform (i.e., that on which the generated programs will eventually be +run) with `--host=TYPE'. In this case, you should also specify the +build platform with `--build=TYPE', because, in this case, it may not +be possible to guess the build platform (it sometimes involves +compiling and running simple test programs, and this can't be done if +the compiler is a cross compiler). + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/Makefile.am b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/Makefile.am new file mode 100644 index 0000000000..7d8239ce1d --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/Makefile.am @@ -0,0 +1,29 @@ +## Process this file with automake to produce Makefile.in + +SUBDIRS = intl po gtk-gui + +EXTRA_DIST = \ + autogen.sh \ + goom2.glade + +install-data-local: + @$(NORMAL_INSTALL) + if test -d $(srcdir)/pixmaps; then \ + $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/pixmaps; \ + for pixmap in $(srcdir)/pixmaps/*; do \ + if test -f $$pixmap; then \ + $(INSTALL_DATA) $$pixmap $(DESTDIR)$(pkgdatadir)/pixmaps; \ + fi \ + done \ + fi + +dist-hook: + if test -d pixmaps; then \ + mkdir $(distdir)/pixmaps; \ + for pixmap in pixmaps/*; do \ + if test -f $$pixmap; then \ + cp -p $$pixmap $(distdir)/pixmaps; \ + fi \ + done \ + fi + diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/NEWS b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/NEWS new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/NEWS diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/README b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/README new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/README diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/acconfig.h b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/acconfig.h new file mode 100644 index 0000000000..4a321c874e --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/acconfig.h @@ -0,0 +1,9 @@ +#undef ENABLE_NLS +#undef HAVE_CATGETS +#undef HAVE_GETTEXT +#undef HAVE_LC_MESSAGES +#undef HAVE_STPCPY +#undef HAVE_LIBSM +#undef PACKAGE_LOCALE_DIR +#undef PACKAGE_DATA_DIR +#undef PACKAGE_SOURCE_DIR diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/aclocal.m4 b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/aclocal.m4 new file mode 100644 index 0000000000..4008210d10 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/aclocal.m4 @@ -0,0 +1,796 @@ +dnl aclocal.m4 generated automatically by aclocal 1.4a + +dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. + +# Do all the work for Automake. This macro actually does too much -- +# some checks are only needed if your package does certain things. +# But this isn't really a big deal. + +# serial 1 + +dnl Usage: +dnl AM_INIT_AUTOMAKE(package,version, [no-define]) + +AC_DEFUN(AM_INIT_AUTOMAKE, +[AC_REQUIRE([AC_PROG_INSTALL]) +dnl We require 2.13 because we rely on SHELL being computed by configure. +AC_PREREQ([2.13]) +PACKAGE=[$1] +AC_SUBST(PACKAGE) +VERSION=[$2] +AC_SUBST(VERSION) +dnl test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi +ifelse([$3],, +AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) +AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) +AC_REQUIRE([AM_SANITY_CHECK]) +AC_REQUIRE([AC_ARG_PROGRAM]) +dnl FIXME This is truly gross. +missing_dir=`cd $ac_aux_dir && pwd` +AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) +AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) +AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) +AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) +AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) +AC_REQUIRE([AC_PROG_MAKE_SET])]) + +# +# Check to make sure that the build environment is sane. +# + +AC_DEFUN(AM_SANITY_CHECK, +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftestfile +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` + if test "[$]*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "[$]*" != "X $srcdir/configure conftestfile" \ + && test "[$]*" != "X conftestfile $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "[$]2" = conftestfile + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +rm -f conftest* +AC_MSG_RESULT(yes)]) + +dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) +dnl The program must properly implement --version. +AC_DEFUN(AM_MISSING_PROG, +[AC_MSG_CHECKING(for working $2) +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if ($2 --version) < /dev/null > /dev/null 2>&1; then + $1=$2 + AC_MSG_RESULT(found) +else + $1="$3/missing $2" + AC_MSG_RESULT(missing) +fi +AC_SUBST($1)]) + +# Like AC_CONFIG_HEADER, but automatically create stamp file. + +AC_DEFUN(AM_CONFIG_HEADER, +[AC_PREREQ([2.12]) +AC_CONFIG_HEADER([$1]) +dnl When config.status generates a header, we must update the stamp-h file. +dnl This file resides in the same directory as the config header +dnl that is generated. We must strip everything past the first ":", +dnl and everything past the last "/". +AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl +ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, +<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, +<<am_indx=1 +for am_file in <<$1>>; do + case " <<$>>CONFIG_HEADERS " in + *" <<$>>am_file "*<<)>> + echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx + ;; + esac + am_indx=`expr "<<$>>am_indx" + 1` +done<<>>dnl>>) +changequote([,]))]) + + +# serial 1 + +# @defmac AC_PROG_CC_STDC +# @maindex PROG_CC_STDC +# @ovindex CC +# If the C compiler in not in ANSI C mode by default, try to add an option +# to output variable @code{CC} to make it so. This macro tries various +# options that select ANSI C on some system or another. It considers the +# compiler to be in ANSI C mode if it handles function prototypes correctly. +# +# If you use this macro, you should check after calling it whether the C +# compiler has been set to accept ANSI C; if not, the shell variable +# @code{am_cv_prog_cc_stdc} is set to @samp{no}. If you wrote your source +# code in ANSI C, you can make an un-ANSIfied copy of it by using the +# program @code{ansi2knr}, which comes with Ghostscript. +# @end defmac + +AC_DEFUN(AM_PROG_CC_STDC, +[AC_REQUIRE([AC_PROG_CC]) +AC_BEFORE([$0], [AC_C_INLINE]) +AC_BEFORE([$0], [AC_C_CONST]) +dnl Force this before AC_PROG_CPP. Some cpp's, eg on HPUX, require +dnl a magic option to avoid problems with ANSI preprocessor commands +dnl like #elif. +dnl FIXME: can't do this because then AC_AIX won't work due to a +dnl circular dependency. +dnl AC_BEFORE([$0], [AC_PROG_CPP]) +AC_MSG_CHECKING(for ${CC-cc} option to accept ANSI C) +AC_CACHE_VAL(am_cv_prog_cc_stdc, +[am_cv_prog_cc_stdc=no +ac_save_CC="$CC" +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + AC_TRY_COMPILE( +[#include <stdarg.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +], [ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; +], +[am_cv_prog_cc_stdc="$ac_arg"; break]) +done +CC="$ac_save_CC" +]) +if test -z "$am_cv_prog_cc_stdc"; then + AC_MSG_RESULT([none needed]) +else + AC_MSG_RESULT($am_cv_prog_cc_stdc) +fi +case "x$am_cv_prog_cc_stdc" in + x|xno) ;; + *) CC="$CC $am_cv_prog_cc_stdc" ;; +esac +]) + +# Configure paths for GTK+ +# Owen Taylor 97-11-3 + +dnl AM_PATH_GTK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) +dnl Test for GTK, and define GTK_CFLAGS and GTK_LIBS +dnl +AC_DEFUN(AM_PATH_GTK, +[dnl +dnl Get the cflags and libraries from the gtk-config script +dnl +AC_ARG_WITH(gtk-prefix,[ --with-gtk-prefix=PFX Prefix where GTK is installed (optional)], + gtk_config_prefix="$withval", gtk_config_prefix="") +AC_ARG_WITH(gtk-exec-prefix,[ --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)], + gtk_config_exec_prefix="$withval", gtk_config_exec_prefix="") +AC_ARG_ENABLE(gtktest, [ --disable-gtktest Do not try to compile and run a test GTK program], + , enable_gtktest=yes) + + for module in . $4 + do + case "$module" in + gthread) + gtk_config_args="$gtk_config_args gthread" + ;; + esac + done + + if test x$gtk_config_exec_prefix != x ; then + gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix" + if test x${GTK_CONFIG+set} != xset ; then + GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config + fi + fi + if test x$gtk_config_prefix != x ; then + gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix" + if test x${GTK_CONFIG+set} != xset ; then + GTK_CONFIG=$gtk_config_prefix/bin/gtk-config + fi + fi + + AC_PATH_PROG(GTK_CONFIG, gtk-config, no) + min_gtk_version=ifelse([$1], ,0.99.7,$1) + AC_MSG_CHECKING(for GTK - version >= $min_gtk_version) + no_gtk="" + if test "$GTK_CONFIG" = "no" ; then + no_gtk=yes + else + GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags` + GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs` + gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_gtktest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$GTK_LIBS $LIBS" +dnl +dnl Now check if the installed GTK is sufficiently new. (Also sanity +dnl checks the results of gtk-config to some extent +dnl + rm -f conf.gtktest + AC_TRY_RUN([ +#include <gtk/gtk.h> +#include <stdio.h> +#include <stdlib.h> + +int +main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.gtktest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = g_strdup("$min_gtk_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_gtk_version"); + exit(1); + } + + if ((gtk_major_version != $gtk_config_major_version) || + (gtk_minor_version != $gtk_config_minor_version) || + (gtk_micro_version != $gtk_config_micro_version)) + { + printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", + $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, + gtk_major_version, gtk_minor_version, gtk_micro_version); + printf ("*** was found! If gtk-config was correct, then it is best\n"); + printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n"); + printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n"); + printf("*** before re-running configure\n"); + } +#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION) + else if ((gtk_major_version != GTK_MAJOR_VERSION) || + (gtk_minor_version != GTK_MINOR_VERSION) || + (gtk_micro_version != GTK_MICRO_VERSION)) + { + printf("*** GTK+ header files (version %d.%d.%d) do not match\n", + GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + gtk_major_version, gtk_minor_version, gtk_micro_version); + } +#endif /* defined (GTK_MAJOR_VERSION) ... */ + else + { + if ((gtk_major_version > major) || + ((gtk_major_version == major) && (gtk_minor_version > minor)) || + ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", + gtk_major_version, gtk_minor_version, gtk_micro_version); + printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", + major, minor, micro); + printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the gtk-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n"); + printf("*** correct copy of gtk-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} +],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_gtk" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$GTK_CONFIG" = "no" ; then + echo "*** The gtk-config script installed by GTK could not be found" + echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the GTK_CONFIG environment variable to the" + echo "*** full path to gtk-config." + else + if test -f conf.gtktest ; then + : + else + echo "*** Could not run GTK test program, checking why..." + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$LIBS $GTK_LIBS" + AC_TRY_LINK([ +#include <gtk/gtk.h> +#include <stdio.h> +], [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GTK or finding the wrong" + echo "*** version of GTK. If it is not finding GTK, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" + echo "***" + echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" + echo "*** came with the system with the command" + echo "***" + echo "*** rpm --erase --nodeps gtk gtk-devel" ], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GTK was incorrectly installed" + echo "*** or that you have moved GTK since it was installed. In the latter case, you" + echo "*** may want to edit the gtk-config script: $GTK_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GTK_CFLAGS="" + GTK_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GTK_CFLAGS) + AC_SUBST(GTK_LIBS) + rm -f conf.gtktest +]) + +# Macro to add for using GNU gettext. +# Ulrich Drepper <drepper@cygnus.com>, 1995. +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU Public License +# but which still want to provide support for the GNU gettext functionality. +# Please note that the actual code is *not* freely available. + +# serial 5 + +AC_DEFUN(AM_WITH_NLS, + [AC_MSG_CHECKING([whether NLS is requested]) + dnl Default is enabled NLS + AC_ARG_ENABLE(nls, + [ --disable-nls do not use Native Language Support], + USE_NLS=$enableval, USE_NLS=yes) + AC_MSG_RESULT($USE_NLS) + AC_SUBST(USE_NLS) + + USE_INCLUDED_LIBINTL=no + + dnl If we use NLS figure out what method + if test "$USE_NLS" = "yes"; then + AC_DEFINE(ENABLE_NLS) + AC_MSG_CHECKING([whether included gettext is requested]) + AC_ARG_WITH(included-gettext, + [ --with-included-gettext use the GNU gettext library included here], + nls_cv_force_use_gnu_gettext=$withval, + nls_cv_force_use_gnu_gettext=no) + AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + dnl User does not insist on using GNU NLS library. Figure out what + dnl to use. If gettext or catgets are available (in this order) we + dnl use this. Else we have to fall back to GNU NLS library. + dnl catgets is only used if permitted by option --with-catgets. + nls_cv_header_intl= + nls_cv_header_libgt= + CATOBJEXT=NONE + + AC_CHECK_HEADER(libintl.h, + [AC_CACHE_CHECK([for gettext in libc], gt_cv_func_gettext_libc, + [AC_TRY_LINK([#include <libintl.h>], [return (int) gettext ("")], + gt_cv_func_gettext_libc=yes, gt_cv_func_gettext_libc=no)]) + + if test "$gt_cv_func_gettext_libc" != "yes"; then + AC_CHECK_LIB(intl, bindtextdomain, + [AC_CACHE_CHECK([for gettext in libintl], + gt_cv_func_gettext_libintl, + [AC_CHECK_LIB(intl, gettext, + gt_cv_func_gettext_libintl=yes, + gt_cv_func_gettext_libintl=no)], + gt_cv_func_gettext_libintl=no)]) + fi + + if test "$gt_cv_func_gettext_libc" = "yes" \ + || test "$gt_cv_func_gettext_libintl" = "yes"; then + AC_DEFINE(HAVE_GETTEXT) + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl + if test "$MSGFMT" != "no"; then + AC_CHECK_FUNCS(dcgettext) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; + return _nl_msg_cat_cntr], + [CATOBJEXT=.gmo + DATADIRNAME=share], + [CATOBJEXT=.mo + DATADIRNAME=lib]) + INSTOBJEXT=.mo + fi + fi + ]) + + if test "$CATOBJEXT" = "NONE"; then + AC_MSG_CHECKING([whether catgets can be used]) + AC_ARG_WITH(catgets, + [ --with-catgets use catgets functions if available], + nls_cv_use_catgets=$withval, nls_cv_use_catgets=no) + AC_MSG_RESULT($nls_cv_use_catgets) + + if test "$nls_cv_use_catgets" = "yes"; then + dnl No gettext in C library. Try catgets next. + AC_CHECK_LIB(i, main) + AC_CHECK_FUNC(catgets, + [AC_DEFINE(HAVE_CATGETS) + INTLOBJS="\$(CATOBJS)" + AC_PATH_PROG(GENCAT, gencat, no)dnl + if test "$GENCAT" != "no"; then + AC_PATH_PROG(GMSGFMT, gmsgfmt, no) + if test "$GMSGFMT" = "no"; then + AM_PATH_PROG_WITH_TEST(GMSGFMT, msgfmt, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no) + fi + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + USE_INCLUDED_LIBINTL=yes + CATOBJEXT=.cat + INSTOBJEXT=.cat + DATADIRNAME=lib + INTLDEPS='$(top_builddir)/intl/libintl.a' + INTLLIBS=$INTLDEPS + LIBS=`echo $LIBS | sed -e 's/-lintl//'` + nls_cv_header_intl=intl/libintl.h + nls_cv_header_libgt=intl/libgettext.h + fi]) + fi + fi + + if test "$CATOBJEXT" = "NONE"; then + dnl Neither gettext nor catgets in included in the C library. + dnl Fall back on GNU gettext library. + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions used to generate GNU NLS library. + INTLOBJS="\$(GETTOBJS)" + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], msgfmt) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + AC_SUBST(MSGFMT) + USE_INCLUDED_LIBINTL=yes + CATOBJEXT=.gmo + INSTOBJEXT=.mo + DATADIRNAME=share + INTLDEPS='$(top_builddir)/intl/libintl.a' + INTLLIBS=$INTLDEPS + LIBS=`echo $LIBS | sed -e 's/-lintl//'` + nls_cv_header_intl=intl/libintl.h + nls_cv_header_libgt=intl/libgettext.h + fi + + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + AC_MSG_RESULT( + [found xgettext program is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + fi + + # We need to process the po/ directory. + POSUB=po + else + DATADIRNAME=share + nls_cv_header_intl=intl/libintl.h + nls_cv_header_libgt=intl/libgettext.h + fi + AC_LINK_FILES($nls_cv_header_libgt, $nls_cv_header_intl) + AC_OUTPUT_COMMANDS( + [case "$CONFIG_FILES" in *po/Makefile.in*) + sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile + esac]) + + + # If this is used in GNU gettext we have to set USE_NLS to `yes' + # because some of the sources are only built for this goal. + if test "$PACKAGE" = gettext; then + USE_NLS=yes + USE_INCLUDED_LIBINTL=yes + fi + + dnl These rules are solely for the distribution goal. While doing this + dnl we only have to keep exactly one list of the available catalogs + dnl in configure.in. + for lang in $ALL_LINGUAS; do + GMOFILES="$GMOFILES $lang.gmo" + POFILES="$POFILES $lang.po" + done + + dnl Make all variables we use known to autoconf. + AC_SUBST(USE_INCLUDED_LIBINTL) + AC_SUBST(CATALOGS) + AC_SUBST(CATOBJEXT) + AC_SUBST(DATADIRNAME) + AC_SUBST(GMOFILES) + AC_SUBST(INSTOBJEXT) + AC_SUBST(INTLDEPS) + AC_SUBST(INTLLIBS) + AC_SUBST(INTLOBJS) + AC_SUBST(POFILES) + AC_SUBST(POSUB) + ]) + +AC_DEFUN(AM_GNU_GETTEXT, + [AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_ISC_POSIX])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_C_CONST])dnl + AC_REQUIRE([AC_C_INLINE])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + + AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h string.h \ +unistd.h sys/param.h]) + AC_CHECK_FUNCS([getcwd munmap putenv setenv setlocale strchr strcasecmp \ +strdup __argz_count __argz_stringify __argz_next]) + + if test "${ac_cv_func_stpcpy+set}" != "set"; then + AC_CHECK_FUNCS(stpcpy) + fi + if test "${ac_cv_func_stpcpy}" = "yes"; then + AC_DEFINE(HAVE_STPCPY) + fi + + AM_LC_MESSAGES + AM_WITH_NLS + + if test "x$CATOBJEXT" != "x"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + AC_MSG_CHECKING(for catalogs to be installed) + NEW_LINGUAS= + for lang in ${LINGUAS=$ALL_LINGUAS}; do + case "$ALL_LINGUAS" in + *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; + esac + done + LINGUAS=$NEW_LINGUAS + AC_MSG_RESULT($LINGUAS) + fi + + dnl Construct list of names of catalog files to be constructed. + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + dnl The reference to <locale.h> in the installed <libintl.h> file + dnl must be resolved because we cannot expect the users of this + dnl to define HAVE_LOCALE_H. + if test $ac_cv_header_locale_h = yes; then + INCLUDE_LOCALE_H="#include <locale.h>" + else + INCLUDE_LOCALE_H="\ +/* The system does not provide the header <locale.h>. Take care yourself. */" + fi + AC_SUBST(INCLUDE_LOCALE_H) + + dnl Determine which catalog format we have (if any is needed) + dnl For now we know about two different formats: + dnl Linux libc-5 and the normal X/Open format + test -d intl || mkdir intl + if test "$CATOBJEXT" = ".cat"; then + AC_CHECK_HEADER(linux/version.h, msgformat=linux, msgformat=xopen) + + dnl Transform the SED scripts while copying because some dumb SEDs + dnl cannot handle comments. + sed -e '/^#/d' $srcdir/intl/$msgformat-msg.sed > intl/po2msg.sed + fi + dnl po2tbl.sed is always needed. + sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \ + $srcdir/intl/po2tbl.sed.in > intl/po2tbl.sed + + dnl In the intl/Makefile.in we have a special dependency which makes + dnl only sense for gettext. We comment this out for non-gettext + dnl packages. + if test "$PACKAGE" = "gettext"; then + GT_NO="#NO#" + GT_YES= + else + GT_NO= + GT_YES="#YES#" + fi + AC_SUBST(GT_NO) + AC_SUBST(GT_YES) + + dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly + dnl find the mkinstalldirs script in another subdir but ($top_srcdir). + dnl Try to locate is. + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + AC_SUBST(MKINSTALLDIRS) + + dnl *** For now the libtool support in intl/Makefile is not for real. + l= + AC_SUBST(l) + + dnl Generate list of files to be processed by xgettext which will + dnl be included in po/Makefile. + test -d po || mkdir po + if test "x$srcdir" != "x."; then + if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then + posrcprefix="$srcdir/" + else + posrcprefix="../$srcdir/" + fi + else + posrcprefix="../" + fi + rm -f po/POTFILES + sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ + < $srcdir/po/POTFILES.in > po/POTFILES + ]) + +# Search path for a program which passes the given test. +# Ulrich Drepper <drepper@cygnus.com>, 1996. +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU Public License +# but which still want to provide support for the GNU gettext functionality. +# Please note that the actual code is *not* freely available. + +# serial 1 + +dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN(AM_PATH_PROG_WITH_TEST, +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test -n "[$]$1"; then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) + +# Check whether LC_MESSAGES is available in <locale.h>. +# Ulrich Drepper <drepper@cygnus.com>, 1995. +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU Public License +# but which still want to provide support for the GNU gettext functionality. +# Please note that the actual code is *not* freely available. + +# serial 1 + +AC_DEFUN(AM_LC_MESSAGES, + [if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES) + fi + fi]) + diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/autogen.sh b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/autogen.sh new file mode 100755 index 0000000000..293b7972e8 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/autogen.sh @@ -0,0 +1,148 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +srcdir=`dirname $0` +PKG_NAME="the package." + +DIE=0 + +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`autoconf' installed to." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +(grep "^AM_PROG_LIBTOOL" $srcdir/configure.in >/dev/null) && { + (libtool --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`libtool' installed." + echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +grep "^AM_GNU_GETTEXT" $srcdir/configure.in >/dev/null && { + grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \ + (gettext --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`gettext' installed." + echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +grep "^AM_GNOME_GETTEXT" $srcdir/configure.in >/dev/null && { + grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \ + (gettext --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`gettext' installed." + echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +(automake --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`automake' installed." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + NO_AUTOMAKE=yes +} + + +# if no automake, don't bother testing for aclocal +test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: Missing \`aclocal'. The version of \`automake'" + echo "installed doesn't appear recent enough." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 +} + +if test "$DIE" -eq 1; then + exit 1 +fi + +if test -z "$*"; then + echo "**Warning**: I am going to run \`configure' with no arguments." + echo "If you wish to pass any to it, please specify them on the" + echo \`$0\'" command line." + echo +fi + +case $CC in +xlc ) + am_opt=--include-deps;; +esac + +for coin in `find $srcdir -name configure.in -print` +do + dr=`dirname $coin` + if test -f $dr/NO-AUTO-GEN; then + echo skipping $dr -- flagged as no auto-gen + else + echo processing $dr + macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin` + ( cd $dr + aclocalinclude="$ACLOCAL_FLAGS" + for k in $macrodirs; do + if test -d $k; then + aclocalinclude="$aclocalinclude -I $k" + ##else + ## echo "**Warning**: No such directory \`$k'. Ignored." + fi + done + if grep "^AM_GNU_GETTEXT" configure.in >/dev/null; then + if grep "sed.*POTFILES" configure.in >/dev/null; then + : do nothing -- we still have an old unmodified configure.in + else + echo "Creating $dr/aclocal.m4 ..." + test -r $dr/aclocal.m4 || touch $dr/aclocal.m4 + echo "Running gettextize... Ignore non-fatal messages." + echo "no" | gettextize --force --copy + echo "Making $dr/aclocal.m4 writable ..." + test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4 + fi + fi + if grep "^AM_GNOME_GETTEXT" configure.in >/dev/null; then + echo "Creating $dr/aclocal.m4 ..." + test -r $dr/aclocal.m4 || touch $dr/aclocal.m4 + echo "Running gettextize... Ignore non-fatal messages." + echo "no" | gettextize --force --copy + echo "Making $dr/aclocal.m4 writable ..." + test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4 + fi + if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then + echo "Running libtoolize..." + libtoolize --force --copy + fi + echo "Running aclocal $aclocalinclude ..." + aclocal $aclocalinclude + if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then + echo "Running autoheader..." + autoheader + fi + echo "Running automake --gnu $am_opt ..." + automake --add-missing --gnu $am_opt + echo "Running autoconf ..." + autoconf + ) + fi +done + +#conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c + +if test x$NOCONFIGURE = x; then + echo Running $srcdir/configure $conf_flags "$@" ... + $srcdir/configure $conf_flags "$@" \ + && echo Now type \`make\' to compile $PKG_NAME +else + echo Skipping configure process. +fi diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/config.h.in b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/config.h.in new file mode 100644 index 0000000000..accf1c8def --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/config.h.in @@ -0,0 +1,134 @@ +/* config.h.in. Generated automatically from configure.in by autoheader. */ + +/* Define if using alloca.c. */ +#undef C_ALLOCA + +/* Define to empty if the keyword does not work. */ +#undef const + +/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. + This function is required for alloca.c support on those systems. */ +#undef CRAY_STACKSEG_END + +/* Define if you have alloca, as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define if you have <alloca.h> and it should be used (not on Ultrix). */ +#undef HAVE_ALLOCA_H + +/* Define if you have a working `mmap' system call. */ +#undef HAVE_MMAP + +/* Define as __inline if that's what the C compiler calls it. */ +#undef inline + +/* Define to `long' if <sys/types.h> doesn't define. */ +#undef off_t + +/* Define if you need to in order for stat and other things to work. */ +#undef _POSIX_SOURCE + +/* Define to `unsigned' if <sys/types.h> doesn't define. */ +#undef size_t + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown + */ +#undef STACK_DIRECTION + +/* Define if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define if your processor stores words with the most significant + byte first (like Motorola and SPARC, unlike Intel and VAX). */ +#undef WORDS_BIGENDIAN + +#undef ENABLE_NLS +#undef HAVE_CATGETS +#undef HAVE_GETTEXT +#undef HAVE_LC_MESSAGES +#undef HAVE_STPCPY +#undef HAVE_LIBSM +#undef PACKAGE_LOCALE_DIR +#undef PACKAGE_DATA_DIR +#undef PACKAGE_SOURCE_DIR + +/* Define if you have the __argz_count function. */ +#undef HAVE___ARGZ_COUNT + +/* Define if you have the __argz_next function. */ +#undef HAVE___ARGZ_NEXT + +/* Define if you have the __argz_stringify function. */ +#undef HAVE___ARGZ_STRINGIFY + +/* Define if you have the dcgettext function. */ +#undef HAVE_DCGETTEXT + +/* Define if you have the getcwd function. */ +#undef HAVE_GETCWD + +/* Define if you have the getpagesize function. */ +#undef HAVE_GETPAGESIZE + +/* Define if you have the munmap function. */ +#undef HAVE_MUNMAP + +/* Define if you have the putenv function. */ +#undef HAVE_PUTENV + +/* Define if you have the setenv function. */ +#undef HAVE_SETENV + +/* Define if you have the setlocale function. */ +#undef HAVE_SETLOCALE + +/* Define if you have the stpcpy function. */ +#undef HAVE_STPCPY + +/* Define if you have the strcasecmp function. */ +#undef HAVE_STRCASECMP + +/* Define if you have the strchr function. */ +#undef HAVE_STRCHR + +/* Define if you have the strdup function. */ +#undef HAVE_STRDUP + +/* Define if you have the <argz.h> header file. */ +#undef HAVE_ARGZ_H + +/* Define if you have the <limits.h> header file. */ +#undef HAVE_LIMITS_H + +/* Define if you have the <locale.h> header file. */ +#undef HAVE_LOCALE_H + +/* Define if you have the <malloc.h> header file. */ +#undef HAVE_MALLOC_H + +/* Define if you have the <nl_types.h> header file. */ +#undef HAVE_NL_TYPES_H + +/* Define if you have the <string.h> header file. */ +#undef HAVE_STRING_H + +/* Define if you have the <sys/param.h> header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define if you have the <unistd.h> header file. */ +#undef HAVE_UNISTD_H + +/* Define if you have the i library (-li). */ +#undef HAVE_LIBI + +/* Name of package */ +#undef PACKAGE + +/* Version number of package */ +#undef VERSION + diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure new file mode 100755 index 0000000000..3b328cda9a --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure @@ -0,0 +1,4206 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.13 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: +ac_help="$ac_help + --with-gtk-prefix=PFX Prefix where GTK is installed (optional)" +ac_help="$ac_help + --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)" +ac_help="$ac_help + --disable-gtktest Do not try to compile and run a test GTK program" +ac_help="$ac_help + --disable-nls do not use Native Language Support" +ac_help="$ac_help + --with-included-gettext use the GNU gettext library included here" +ac_help="$ac_help + --with-catgets use catgets functions if available" + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.13" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=configure.in + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +ac_exeext= +ac_objext=o +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } +fi +ac_config_guess=$ac_aux_dir/config.guess +ac_config_sub=$ac_aux_dir/config.sub +ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +echo "configure:568: checking for a BSD compatible install" >&5 +if test -z "$INSTALL"; then +if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" + for ac_dir in $PATH; do + # Account for people who put trailing slashes in PATH elements. + case "$ac_dir/" in + /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if test -f $ac_dir/$ac_prog; then + if test $ac_prog = install && + grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + IFS="$ac_save_IFS" + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL="$ac_cv_path_install" + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL="$ac_install_sh" + fi +fi +echo "$ac_t""$INSTALL" 1>&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 +echo "configure:621: checking whether build environment is sane" >&5 +# Just in case +sleep 1 +echo timestamp > conftestfile +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "$*" != "X $srcdir/configure conftestfile" \ + && test "$*" != "X conftestfile $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { echo "configure: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" 1>&2; exit 1; } + fi + + test "$2" = conftestfile + ) +then + # Ok. + : +else + { echo "configure: error: newly created file is older than distributed files! +Check your system clock" 1>&2; exit 1; } +fi +rm -f conftest* +echo "$ac_t""yes" 1>&6 +if test "$program_transform_name" = s,x,x,; then + program_transform_name= +else + # Double any \ or $. echo might interpret backslashes. + cat <<\EOF_SED > conftestsed +s,\\,\\\\,g; s,\$,$$,g +EOF_SED + program_transform_name="`echo $program_transform_name|sed -f conftestsed`" + rm -f conftestsed +fi +test "$program_prefix" != NONE && + program_transform_name="s,^,${program_prefix},; $program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" + +# sed with no file args requires a program. +test "$program_transform_name" = "" && program_transform_name="s,x,x," + +echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 +echo "configure:678: checking whether ${MAKE-make} sets \${MAKE}" >&5 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftestmake <<\EOF +all: + @echo 'ac_maketemp="${MAKE}"' +EOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftestmake +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$ac_t""yes" 1>&6 + SET_MAKE= +else + echo "$ac_t""no" 1>&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + + + +PACKAGE=goom2 + +VERSION=0.1 + +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } +fi +cat >> confdefs.h <<EOF +#define PACKAGE "$PACKAGE" +EOF + +cat >> confdefs.h <<EOF +#define VERSION "$VERSION" +EOF + + + +missing_dir=`cd $ac_aux_dir && pwd` +echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 +echo "configure:725: checking for working aclocal" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (aclocal --version) < /dev/null > /dev/null 2>&1; then + ACLOCAL=aclocal + echo "$ac_t""found" 1>&6 +else + ACLOCAL="$missing_dir/missing aclocal" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 +echo "configure:738: checking for working autoconf" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoconf --version) < /dev/null > /dev/null 2>&1; then + AUTOCONF=autoconf + echo "$ac_t""found" 1>&6 +else + AUTOCONF="$missing_dir/missing autoconf" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working automake""... $ac_c" 1>&6 +echo "configure:751: checking for working automake" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (automake --version) < /dev/null > /dev/null 2>&1; then + AUTOMAKE=automake + echo "$ac_t""found" 1>&6 +else + AUTOMAKE="$missing_dir/missing automake" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 +echo "configure:764: checking for working autoheader" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoheader --version) < /dev/null > /dev/null 2>&1; then + AUTOHEADER=autoheader + echo "$ac_t""found" 1>&6 +else + AUTOHEADER="$missing_dir/missing autoheader" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 +echo "configure:777: checking for working makeinfo" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (makeinfo --version) < /dev/null > /dev/null 2>&1; then + MAKEINFO=makeinfo + echo "$ac_t""found" 1>&6 +else + MAKEINFO="$missing_dir/missing makeinfo" + echo "$ac_t""missing" 1>&6 +fi + + + + + + +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:797: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:827: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_prog_rejected=no + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test -z "$CC"; then + case "`uname -s`" in + *win32* | *WIN32*) + # Extract the first word of "cl", so it can be a program name with args. +set dummy cl; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:878: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="cl" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + ;; + esac + fi + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:910: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext << EOF + +#line 921 "configure" +#include "confdefs.h" + +main(){return(0);} +EOF +if { (eval echo configure:926: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:952: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:957: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <<EOF +#ifdef __GNUC__ + yes; +#endif +EOF +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:966: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes +else + GCC= +fi + +ac_test_CFLAGS="${CFLAGS+set}" +ac_save_CFLAGS="$CFLAGS" +CFLAGS= +echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:985: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi + +echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6 +echo "configure:1017: checking for POSIXized ISC" >&5 +if test -d /etc/conf/kconfig.d && + grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1 +then + echo "$ac_t""yes" 1>&6 + ISC=yes # If later tests want to check for ISC. + cat >> confdefs.h <<\EOF +#define _POSIX_SOURCE 1 +EOF + + if test "$GCC" = yes; then + CC="$CC -posix" + else + CC="$CC -Xp" + fi +else + echo "$ac_t""no" 1>&6 + ISC= +fi + +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1040: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1070: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_prog_rejected=no + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test -z "$CC"; then + case "`uname -s`" in + *win32* | *WIN32*) + # Extract the first word of "cl", so it can be a program name with args. +set dummy cl; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1121: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="cl" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + ;; + esac + fi + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:1153: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext << EOF + +#line 1164 "configure" +#include "confdefs.h" + +main(){return(0);} +EOF +if { (eval echo configure:1169: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:1195: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:1200: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <<EOF +#ifdef __GNUC__ + yes; +#endif +EOF +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1209: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes +else + GCC= +fi + +ac_test_CFLAGS="${CFLAGS+set}" +ac_save_CFLAGS="$CFLAGS" +CFLAGS= +echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:1228: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi + + + + +echo $ac_n "checking for ${CC-cc} option to accept ANSI C""... $ac_c" 1>&6 +echo "configure:1263: checking for ${CC-cc} option to accept ANSI C" >&5 +if eval "test \"`echo '$''{'am_cv_prog_cc_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + am_cv_prog_cc_stdc=no +ac_save_CC="$CC" +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + cat > conftest.$ac_ext <<EOF +#line 1279 "configure" +#include "confdefs.h" +#include <stdarg.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; + +int main() { + +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + +; return 0; } +EOF +if { (eval echo configure:1316: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + am_cv_prog_cc_stdc="$ac_arg"; break +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* +done +CC="$ac_save_CC" + +fi + +if test -z "$am_cv_prog_cc_stdc"; then + echo "$ac_t""none needed" 1>&6 +else + echo "$ac_t""$am_cv_prog_cc_stdc" 1>&6 +fi +case "x$am_cv_prog_cc_stdc" in + x|xno) ;; + *) CC="$CC $am_cv_prog_cc_stdc" ;; +esac + +echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +echo "configure:1340: checking how to run the C preprocessor" >&5 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext <<EOF +#line 1355 "configure" +#include "confdefs.h" +#include <assert.h> +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1361: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext <<EOF +#line 1372 "configure" +#include "confdefs.h" +#include <assert.h> +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1378: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -nologo -E" + cat > conftest.$ac_ext <<EOF +#line 1389 "configure" +#include "confdefs.h" +#include <assert.h> +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1395: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + +echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 +echo "configure:1420: checking for ANSI C header files" >&5 +if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 1425 "configure" +#include "confdefs.h" +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <float.h> +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1433: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + ac_cv_header_stdc=yes +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +cat > conftest.$ac_ext <<EOF +#line 1450 "configure" +#include "confdefs.h" +#include <string.h> +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "memchr" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. +cat > conftest.$ac_ext <<EOF +#line 1468 "configure" +#include "confdefs.h" +#include <stdlib.h> +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "free" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +if test "$cross_compiling" = yes; then + : +else + cat > conftest.$ac_ext <<EOF +#line 1489 "configure" +#include "confdefs.h" +#include <ctype.h> +#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int main () { int i; for (i = 0; i < 256; i++) +if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); +exit (0); } + +EOF +if { (eval echo configure:1500: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_header_stdc=no +fi +rm -fr conftest* +fi + +fi +fi + +echo "$ac_t""$ac_cv_header_stdc" 1>&6 +if test $ac_cv_header_stdc = yes; then + cat >> confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + +echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6 +echo "configure:1524: checking whether byte ordering is bigendian" >&5 +if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_cv_c_bigendian=unknown +# See if sys/param.h defines the BYTE_ORDER macro. +cat > conftest.$ac_ext <<EOF +#line 1531 "configure" +#include "confdefs.h" +#include <sys/types.h> +#include <sys/param.h> +int main() { + +#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN + bogus endian macros +#endif +; return 0; } +EOF +if { (eval echo configure:1542: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + # It does; now see whether it defined to BIG_ENDIAN or not. +cat > conftest.$ac_ext <<EOF +#line 1546 "configure" +#include "confdefs.h" +#include <sys/types.h> +#include <sys/param.h> +int main() { + +#if BYTE_ORDER != BIG_ENDIAN + not big endian +#endif +; return 0; } +EOF +if { (eval echo configure:1557: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_bigendian=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_c_bigendian=no +fi +rm -f conftest* +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* +if test $ac_cv_c_bigendian = unknown; then +if test "$cross_compiling" = yes; then + { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } +else + cat > conftest.$ac_ext <<EOF +#line 1577 "configure" +#include "confdefs.h" +main () { + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long l; + char c[sizeof (long)]; + } u; + u.l = 1; + exit (u.c[sizeof (long) - 1] == 1); +} +EOF +if { (eval echo configure:1590: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_c_bigendian=no +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_c_bigendian=yes +fi +rm -fr conftest* +fi + +fi +fi + +echo "$ac_t""$ac_cv_c_bigendian" 1>&6 +if test $ac_cv_c_bigendian = yes; then + cat >> confdefs.h <<\EOF +#define WORDS_BIGENDIAN 1 +EOF + +fi + + + +# Check whether --with-gtk-prefix or --without-gtk-prefix was given. +if test "${with_gtk_prefix+set}" = set; then + withval="$with_gtk_prefix" + gtk_config_prefix="$withval" +else + gtk_config_prefix="" +fi + +# Check whether --with-gtk-exec-prefix or --without-gtk-exec-prefix was given. +if test "${with_gtk_exec_prefix+set}" = set; then + withval="$with_gtk_exec_prefix" + gtk_config_exec_prefix="$withval" +else + gtk_config_exec_prefix="" +fi + +# Check whether --enable-gtktest or --disable-gtktest was given. +if test "${enable_gtktest+set}" = set; then + enableval="$enable_gtktest" + : +else + enable_gtktest=yes +fi + + + for module in . + do + case "$module" in + gthread) + gtk_config_args="$gtk_config_args gthread" + ;; + esac + done + + if test x$gtk_config_exec_prefix != x ; then + gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix" + if test x${GTK_CONFIG+set} != xset ; then + GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config + fi + fi + if test x$gtk_config_prefix != x ; then + gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix" + if test x${GTK_CONFIG+set} != xset ; then + GTK_CONFIG=$gtk_config_prefix/bin/gtk-config + fi + fi + + # Extract the first word of "gtk-config", so it can be a program name with args. +set dummy gtk-config; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1665: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_GTK_CONFIG'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$GTK_CONFIG" in + /*) + ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_GTK_CONFIG="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_GTK_CONFIG" && ac_cv_path_GTK_CONFIG="no" + ;; +esac +fi +GTK_CONFIG="$ac_cv_path_GTK_CONFIG" +if test -n "$GTK_CONFIG"; then + echo "$ac_t""$GTK_CONFIG" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + min_gtk_version=1.2.0 + echo $ac_n "checking for GTK - version >= $min_gtk_version""... $ac_c" 1>&6 +echo "configure:1700: checking for GTK - version >= $min_gtk_version" >&5 + no_gtk="" + if test "$GTK_CONFIG" = "no" ; then + no_gtk=yes + else + GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags` + GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs` + gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + if test "x$enable_gtktest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$GTK_LIBS $LIBS" + rm -f conf.gtktest + if test "$cross_compiling" = yes; then + echo $ac_n "cross compiling; assumed OK... $ac_c" +else + cat > conftest.$ac_ext <<EOF +#line 1723 "configure" +#include "confdefs.h" + +#include <gtk/gtk.h> +#include <stdio.h> +#include <stdlib.h> + +int +main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.gtktest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = g_strdup("$min_gtk_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_gtk_version"); + exit(1); + } + + if ((gtk_major_version != $gtk_config_major_version) || + (gtk_minor_version != $gtk_config_minor_version) || + (gtk_micro_version != $gtk_config_micro_version)) + { + printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", + $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, + gtk_major_version, gtk_minor_version, gtk_micro_version); + printf ("*** was found! If gtk-config was correct, then it is best\n"); + printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n"); + printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n"); + printf("*** before re-running configure\n"); + } +#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION) + else if ((gtk_major_version != GTK_MAJOR_VERSION) || + (gtk_minor_version != GTK_MINOR_VERSION) || + (gtk_micro_version != GTK_MICRO_VERSION)) + { + printf("*** GTK+ header files (version %d.%d.%d) do not match\n", + GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + gtk_major_version, gtk_minor_version, gtk_micro_version); + } +#endif /* defined (GTK_MAJOR_VERSION) ... */ + else + { + if ((gtk_major_version > major) || + ((gtk_major_version == major) && (gtk_minor_version > minor)) || + ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", + gtk_major_version, gtk_minor_version, gtk_micro_version); + printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", + major, minor, micro); + printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the gtk-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n"); + printf("*** correct copy of gtk-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} + +EOF +if { (eval echo configure:1801: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + no_gtk=yes +fi +rm -fr conftest* +fi + + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_gtk" = x ; then + echo "$ac_t""yes" 1>&6 + : + else + echo "$ac_t""no" 1>&6 + if test "$GTK_CONFIG" = "no" ; then + echo "*** The gtk-config script installed by GTK could not be found" + echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the GTK_CONFIG environment variable to the" + echo "*** full path to gtk-config." + else + if test -f conf.gtktest ; then + : + else + echo "*** Could not run GTK test program, checking why..." + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$LIBS $GTK_LIBS" + cat > conftest.$ac_ext <<EOF +#line 1835 "configure" +#include "confdefs.h" + +#include <gtk/gtk.h> +#include <stdio.h> + +int main() { + return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); +; return 0; } +EOF +if { (eval echo configure:1845: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GTK or finding the wrong" + echo "*** version of GTK. If it is not finding GTK, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" + echo "***" + echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" + echo "*** came with the system with the command" + echo "***" + echo "*** rpm --erase --nodeps gtk gtk-devel" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GTK was incorrectly installed" + echo "*** or that you have moved GTK since it was installed. In the latter case, you" + echo "*** may want to edit the gtk-config script: $GTK_CONFIG" +fi +rm -f conftest* + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GTK_CFLAGS="" + GTK_LIBS="" + { echo "configure: error: Cannot find GTK: Is gtk-config in path?" 1>&2; exit 1; } + fi + + + rm -f conf.gtktest + + +ALL_LINGUAS="" +# Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1888: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_RANLIB="ranlib" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" +fi +fi +RANLIB="$ac_cv_prog_RANLIB" +if test -n "$RANLIB"; then + echo "$ac_t""$RANLIB" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +echo $ac_n "checking for working const""... $ac_c" 1>&6 +echo "configure:1916: checking for working const" >&5 +if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 1921 "configure" +#include "confdefs.h" + +int main() { + +/* Ultrix mips cc rejects this. */ +typedef int charset[2]; const charset x; +/* SunOS 4.1.1 cc rejects this. */ +char const *const *ccp; +char **p; +/* NEC SVR4.0.2 mips cc rejects this. */ +struct point {int x, y;}; +static struct point const zero = {0,0}; +/* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in an arm + of an if-expression whose if-part is not a constant expression */ +const char *g = "string"; +ccp = &g + (g ? g-g : 0); +/* HPUX 7.0 cc rejects these. */ +++ccp; +p = (char**) ccp; +ccp = (char const *const *) p; +{ /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; +} +{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; +} +{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; +} +{ /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; +} +{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; +} + +; return 0; } +EOF +if { (eval echo configure:1970: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_const=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_c_const=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_c_const" 1>&6 +if test $ac_cv_c_const = no; then + cat >> confdefs.h <<\EOF +#define const +EOF + +fi + +echo $ac_n "checking for inline""... $ac_c" 1>&6 +echo "configure:1991: checking for inline" >&5 +if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat > conftest.$ac_ext <<EOF +#line 1998 "configure" +#include "confdefs.h" + +int main() { +} $ac_kw foo() { +; return 0; } +EOF +if { (eval echo configure:2005: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_inline=$ac_kw; break +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* +done + +fi + +echo "$ac_t""$ac_cv_c_inline" 1>&6 +case "$ac_cv_c_inline" in + inline | yes) ;; + no) cat >> confdefs.h <<\EOF +#define inline +EOF + ;; + *) cat >> confdefs.h <<EOF +#define inline $ac_cv_c_inline +EOF + ;; +esac + +echo $ac_n "checking for off_t""... $ac_c" 1>&6 +echo "configure:2031: checking for off_t" >&5 +if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 2036 "configure" +#include "confdefs.h" +#include <sys/types.h> +#if STDC_HEADERS +#include <stdlib.h> +#include <stddef.h> +#endif +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_type_off_t=yes +else + rm -rf conftest* + ac_cv_type_off_t=no +fi +rm -f conftest* + +fi +echo "$ac_t""$ac_cv_type_off_t" 1>&6 +if test $ac_cv_type_off_t = no; then + cat >> confdefs.h <<\EOF +#define off_t long +EOF + +fi + +echo $ac_n "checking for size_t""... $ac_c" 1>&6 +echo "configure:2064: checking for size_t" >&5 +if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 2069 "configure" +#include "confdefs.h" +#include <sys/types.h> +#if STDC_HEADERS +#include <stdlib.h> +#include <stddef.h> +#endif +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_type_size_t=yes +else + rm -rf conftest* + ac_cv_type_size_t=no +fi +rm -f conftest* + +fi +echo "$ac_t""$ac_cv_type_size_t" 1>&6 +if test $ac_cv_type_size_t = no; then + cat >> confdefs.h <<\EOF +#define size_t unsigned +EOF + +fi + +# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +# for constant arguments. Useless! +echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 +echo "configure:2099: checking for working alloca.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 2104 "configure" +#include "confdefs.h" +#include <alloca.h> +int main() { +char *p = alloca(2 * sizeof(int)); +; return 0; } +EOF +if { (eval echo configure:2111: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + ac_cv_header_alloca_h=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_alloca_h=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_header_alloca_h" 1>&6 +if test $ac_cv_header_alloca_h = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_ALLOCA_H 1 +EOF + +fi + +echo $ac_n "checking for alloca""... $ac_c" 1>&6 +echo "configure:2132: checking for alloca" >&5 +if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 2137 "configure" +#include "confdefs.h" + +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# ifdef _MSC_VER +# include <malloc.h> +# define alloca _alloca +# else +# if HAVE_ALLOCA_H +# include <alloca.h> +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +int main() { +char *p = (char *) alloca(1); +; return 0; } +EOF +if { (eval echo configure:2165: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + ac_cv_func_alloca_works=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_func_alloca_works=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_func_alloca_works" 1>&6 +if test $ac_cv_func_alloca_works = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_ALLOCA 1 +EOF + +fi + +if test $ac_cv_func_alloca_works = no; then + # The SVR3 libPW and SVR4 libucb both contain incompatible functions + # that cause trouble. Some versions do not even contain alloca or + # contain a buggy version. If you still want to use their alloca, + # use ar to extract alloca.o from them instead of compiling alloca.c. + ALLOCA=alloca.${ac_objext} + cat >> confdefs.h <<\EOF +#define C_ALLOCA 1 +EOF + + +echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 +echo "configure:2197: checking whether alloca needs Cray hooks" >&5 +if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 2202 "configure" +#include "confdefs.h" +#if defined(CRAY) && ! defined(CRAY2) +webecray +#else +wenotbecray +#endif + +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "webecray" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_os_cray=yes +else + rm -rf conftest* + ac_cv_os_cray=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_os_cray" 1>&6 +if test $ac_cv_os_cray = yes; then +for ac_func in _getb67 GETB67 getb67; do + echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:2227: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 2232 "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func(); below. */ +#include <assert.h> +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2255: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<EOF +#define CRAY_STACKSEG_END $ac_func +EOF + + break +else + echo "$ac_t""no" 1>&6 +fi + +done +fi + +echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 +echo "configure:2282: checking stack direction for C alloca" >&5 +if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + ac_cv_c_stack_direction=0 +else + cat > conftest.$ac_ext <<EOF +#line 2290 "configure" +#include "confdefs.h" +find_stack_direction () +{ + static char *addr = 0; + auto char dummy; + if (addr == 0) + { + addr = &dummy; + return find_stack_direction (); + } + else + return (&dummy > addr) ? 1 : -1; +} +main () +{ + exit (find_stack_direction() < 0); +} +EOF +if { (eval echo configure:2309: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_c_stack_direction=1 +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_c_stack_direction=-1 +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$ac_cv_c_stack_direction" 1>&6 +cat >> confdefs.h <<EOF +#define STACK_DIRECTION $ac_cv_c_stack_direction +EOF + +fi + +for ac_hdr in unistd.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:2334: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 2339 "configure" +#include "confdefs.h" +#include <$ac_hdr> +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:2344: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <<EOF +#define $ac_tr_hdr 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi +done + +for ac_func in getpagesize +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:2373: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 2378 "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func(); below. */ +#include <assert.h> +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2401: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <<EOF +#define $ac_tr_func 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi +done + +echo $ac_n "checking for working mmap""... $ac_c" 1>&6 +echo "configure:2426: checking for working mmap" >&5 +if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_mmap_fixed_mapped=no +else + cat > conftest.$ac_ext <<EOF +#line 2434 "configure" +#include "confdefs.h" + +/* Thanks to Mike Haertel and Jim Avera for this test. + Here is a matrix of mmap possibilities: + mmap private not fixed + mmap private fixed at somewhere currently unmapped + mmap private fixed at somewhere already mapped + mmap shared not fixed + mmap shared fixed at somewhere currently unmapped + mmap shared fixed at somewhere already mapped + For private mappings, we should verify that changes cannot be read() + back from the file, nor mmap's back from the file at a different + address. (There have been systems where private was not correctly + implemented like the infamous i386 svr4.0, and systems where the + VM page cache was not coherent with the filesystem buffer cache + like early versions of FreeBSD and possibly contemporary NetBSD.) + For shared mappings, we should conversely verify that changes get + propogated back to all the places they're supposed to be. + + Grep wants private fixed already mapped. + The main things grep needs to know about mmap are: + * does it exist and is it safe to write into the mmap'd area + * how to use it (BSD variants) */ +#include <sys/types.h> +#include <fcntl.h> +#include <sys/mman.h> + +/* This mess was copied from the GNU getpagesize.h. */ +#ifndef HAVE_GETPAGESIZE +# ifdef HAVE_UNISTD_H +# include <unistd.h> +# endif + +/* Assume that all systems that can run configure have sys/param.h. */ +# ifndef HAVE_SYS_PARAM_H +# define HAVE_SYS_PARAM_H 1 +# endif + +# ifdef _SC_PAGESIZE +# define getpagesize() sysconf(_SC_PAGESIZE) +# else /* no _SC_PAGESIZE */ +# ifdef HAVE_SYS_PARAM_H +# include <sys/param.h> +# ifdef EXEC_PAGESIZE +# define getpagesize() EXEC_PAGESIZE +# else /* no EXEC_PAGESIZE */ +# ifdef NBPG +# define getpagesize() NBPG * CLSIZE +# ifndef CLSIZE +# define CLSIZE 1 +# endif /* no CLSIZE */ +# else /* no NBPG */ +# ifdef NBPC +# define getpagesize() NBPC +# else /* no NBPC */ +# ifdef PAGESIZE +# define getpagesize() PAGESIZE +# endif /* PAGESIZE */ +# endif /* no NBPC */ +# endif /* no NBPG */ +# endif /* no EXEC_PAGESIZE */ +# else /* no HAVE_SYS_PARAM_H */ +# define getpagesize() 8192 /* punt totally */ +# endif /* no HAVE_SYS_PARAM_H */ +# endif /* no _SC_PAGESIZE */ + +#endif /* no HAVE_GETPAGESIZE */ + +#ifdef __cplusplus +extern "C" { void *malloc(unsigned); } +#else +char *malloc(); +#endif + +int +main() +{ + char *data, *data2, *data3; + int i, pagesize; + int fd; + + pagesize = getpagesize(); + + /* + * First, make a file with some known garbage in it. + */ + data = malloc(pagesize); + if (!data) + exit(1); + for (i = 0; i < pagesize; ++i) + *(data + i) = rand(); + umask(0); + fd = creat("conftestmmap", 0600); + if (fd < 0) + exit(1); + if (write(fd, data, pagesize) != pagesize) + exit(1); + close(fd); + + /* + * Next, try to mmap the file at a fixed address which + * already has something else allocated at it. If we can, + * also make sure that we see the same garbage. + */ + fd = open("conftestmmap", O_RDWR); + if (fd < 0) + exit(1); + data2 = malloc(2 * pagesize); + if (!data2) + exit(1); + data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1); + if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED, fd, 0L)) + exit(1); + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data2 + i)) + exit(1); + + /* + * Finally, make sure that changes to the mapped area + * do not percolate back to the file as seen by read(). + * (This is a bug on some variants of i386 svr4.0.) + */ + for (i = 0; i < pagesize; ++i) + *(data2 + i) = *(data2 + i) + 1; + data3 = malloc(pagesize); + if (!data3) + exit(1); + if (read(fd, data3, pagesize) != pagesize) + exit(1); + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data3 + i)) + exit(1); + close(fd); + unlink("conftestmmap"); + exit(0); +} + +EOF +if { (eval echo configure:2574: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_func_mmap_fixed_mapped=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_func_mmap_fixed_mapped=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6 +if test $ac_cv_func_mmap_fixed_mapped = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_MMAP 1 +EOF + +fi + + + for ac_hdr in argz.h limits.h locale.h nl_types.h malloc.h string.h \ +unistd.h sys/param.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:2602: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 2607 "configure" +#include "confdefs.h" +#include <$ac_hdr> +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:2612: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <<EOF +#define $ac_tr_hdr 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi +done + + for ac_func in getcwd munmap putenv setenv setlocale strchr strcasecmp \ +strdup __argz_count __argz_stringify __argz_next +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:2642: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 2647 "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func(); below. */ +#include <assert.h> +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2670: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <<EOF +#define $ac_tr_func 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi +done + + + if test "${ac_cv_func_stpcpy+set}" != "set"; then + for ac_func in stpcpy +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:2699: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 2704 "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func(); below. */ +#include <assert.h> +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2727: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <<EOF +#define $ac_tr_func 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi +done + + fi + if test "${ac_cv_func_stpcpy}" = "yes"; then + cat >> confdefs.h <<\EOF +#define HAVE_STPCPY 1 +EOF + + fi + + if test $ac_cv_header_locale_h = yes; then + echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6 +echo "configure:2761: checking for LC_MESSAGES" >&5 +if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 2766 "configure" +#include "confdefs.h" +#include <locale.h> +int main() { +return LC_MESSAGES +; return 0; } +EOF +if { (eval echo configure:2773: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + am_cv_val_LC_MESSAGES=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + am_cv_val_LC_MESSAGES=no +fi +rm -f conftest* +fi + +echo "$ac_t""$am_cv_val_LC_MESSAGES" 1>&6 + if test $am_cv_val_LC_MESSAGES = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_LC_MESSAGES 1 +EOF + + fi + fi + echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6 +echo "configure:2794: checking whether NLS is requested" >&5 + # Check whether --enable-nls or --disable-nls was given. +if test "${enable_nls+set}" = set; then + enableval="$enable_nls" + USE_NLS=$enableval +else + USE_NLS=yes +fi + + echo "$ac_t""$USE_NLS" 1>&6 + + + USE_INCLUDED_LIBINTL=no + + if test "$USE_NLS" = "yes"; then + cat >> confdefs.h <<\EOF +#define ENABLE_NLS 1 +EOF + + echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6 +echo "configure:2814: checking whether included gettext is requested" >&5 + # Check whether --with-included-gettext or --without-included-gettext was given. +if test "${with_included_gettext+set}" = set; then + withval="$with_included_gettext" + nls_cv_force_use_gnu_gettext=$withval +else + nls_cv_force_use_gnu_gettext=no +fi + + echo "$ac_t""$nls_cv_force_use_gnu_gettext" 1>&6 + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + nls_cv_header_intl= + nls_cv_header_libgt= + CATOBJEXT=NONE + + ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for libintl.h""... $ac_c" 1>&6 +echo "configure:2833: checking for libintl.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 2838 "configure" +#include "confdefs.h" +#include <libintl.h> +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:2843: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + echo $ac_n "checking for gettext in libc""... $ac_c" 1>&6 +echo "configure:2860: checking for gettext in libc" >&5 +if eval "test \"`echo '$''{'gt_cv_func_gettext_libc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 2865 "configure" +#include "confdefs.h" +#include <libintl.h> +int main() { +return (int) gettext ("") +; return 0; } +EOF +if { (eval echo configure:2872: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + gt_cv_func_gettext_libc=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + gt_cv_func_gettext_libc=no +fi +rm -f conftest* +fi + +echo "$ac_t""$gt_cv_func_gettext_libc" 1>&6 + + if test "$gt_cv_func_gettext_libc" != "yes"; then + echo $ac_n "checking for bindtextdomain in -lintl""... $ac_c" 1>&6 +echo "configure:2888: checking for bindtextdomain in -lintl" >&5 +ac_lib_var=`echo intl'_'bindtextdomain | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lintl $LIBS" +cat > conftest.$ac_ext <<EOF +#line 2896 "configure" +#include "confdefs.h" +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char bindtextdomain(); + +int main() { +bindtextdomain() +; return 0; } +EOF +if { (eval echo configure:2907: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + echo $ac_n "checking for gettext in libintl""... $ac_c" 1>&6 +echo "configure:2923: checking for gettext in libintl" >&5 +if eval "test \"`echo '$''{'gt_cv_func_gettext_libintl'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo $ac_n "checking for gettext in -lintl""... $ac_c" 1>&6 +echo "configure:2928: checking for gettext in -lintl" >&5 +ac_lib_var=`echo intl'_'gettext | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lintl $LIBS" +cat > conftest.$ac_ext <<EOF +#line 2936 "configure" +#include "confdefs.h" +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gettext(); + +int main() { +gettext() +; return 0; } +EOF +if { (eval echo configure:2947: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + gt_cv_func_gettext_libintl=yes +else + echo "$ac_t""no" 1>&6 +gt_cv_func_gettext_libintl=no +fi + +fi + +echo "$ac_t""$gt_cv_func_gettext_libintl" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + fi + + if test "$gt_cv_func_gettext_libc" = "yes" \ + || test "$gt_cv_func_gettext_libintl" = "yes"; then + cat >> confdefs.h <<\EOF +#define HAVE_GETTEXT 1 +EOF + + # Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:2986: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$MSGFMT" in + /*) + ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then + ac_cv_path_MSGFMT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" + ;; +esac +fi +MSGFMT="$ac_cv_path_MSGFMT" +if test -n "$MSGFMT"; then + echo "$ac_t""$MSGFMT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + if test "$MSGFMT" != "no"; then + for ac_func in dcgettext +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:3020: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 3025 "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func(); below. */ +#include <assert.h> +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:3048: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <<EOF +#define $ac_tr_func 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi +done + + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3075: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$GMSGFMT" in + /*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_GMSGFMT="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT="$ac_cv_path_GMSGFMT" +if test -n "$GMSGFMT"; then + echo "$ac_t""$GMSGFMT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + # Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3111: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$XGETTEXT" in + /*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test -n "$XGETTEXT"; then + echo "$ac_t""$XGETTEXT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + cat > conftest.$ac_ext <<EOF +#line 3143 "configure" +#include "confdefs.h" + +int main() { +extern int _nl_msg_cat_cntr; + return _nl_msg_cat_cntr +; return 0; } +EOF +if { (eval echo configure:3151: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + CATOBJEXT=.gmo + DATADIRNAME=share +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CATOBJEXT=.mo + DATADIRNAME=lib +fi +rm -f conftest* + INSTOBJEXT=.mo + fi + fi + +else + echo "$ac_t""no" 1>&6 +fi + + + if test "$CATOBJEXT" = "NONE"; then + echo $ac_n "checking whether catgets can be used""... $ac_c" 1>&6 +echo "configure:3174: checking whether catgets can be used" >&5 + # Check whether --with-catgets or --without-catgets was given. +if test "${with_catgets+set}" = set; then + withval="$with_catgets" + nls_cv_use_catgets=$withval +else + nls_cv_use_catgets=no +fi + + echo "$ac_t""$nls_cv_use_catgets" 1>&6 + + if test "$nls_cv_use_catgets" = "yes"; then + echo $ac_n "checking for main in -li""... $ac_c" 1>&6 +echo "configure:3187: checking for main in -li" >&5 +ac_lib_var=`echo i'_'main | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-li $LIBS" +cat > conftest.$ac_ext <<EOF +#line 3195 "configure" +#include "confdefs.h" + +int main() { +main() +; return 0; } +EOF +if { (eval echo configure:3202: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo i | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <<EOF +#define $ac_tr_lib 1 +EOF + + LIBS="-li $LIBS" + +else + echo "$ac_t""no" 1>&6 +fi + + echo $ac_n "checking for catgets""... $ac_c" 1>&6 +echo "configure:3230: checking for catgets" >&5 +if eval "test \"`echo '$''{'ac_cv_func_catgets'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 3235 "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char catgets(); below. */ +#include <assert.h> +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char catgets(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_catgets) || defined (__stub___catgets) +choke me +#else +catgets(); +#endif + +; return 0; } +EOF +if { (eval echo configure:3258: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_catgets=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_catgets=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'catgets`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_CATGETS 1 +EOF + + INTLOBJS="\$(CATOBJS)" + # Extract the first word of "gencat", so it can be a program name with args. +set dummy gencat; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3280: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_GENCAT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$GENCAT" in + /*) + ac_cv_path_GENCAT="$GENCAT" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_GENCAT="$GENCAT" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_GENCAT="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_GENCAT" && ac_cv_path_GENCAT="no" + ;; +esac +fi +GENCAT="$ac_cv_path_GENCAT" +if test -n "$GENCAT"; then + echo "$ac_t""$GENCAT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + if test "$GENCAT" != "no"; then + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3316: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$GMSGFMT" in + /*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_GMSGFMT="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="no" + ;; +esac +fi +GMSGFMT="$ac_cv_path_GMSGFMT" +if test -n "$GMSGFMT"; then + echo "$ac_t""$GMSGFMT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test "$GMSGFMT" = "no"; then + # Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3353: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$GMSGFMT" in + /*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then + ac_cv_path_GMSGFMT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="no" + ;; +esac +fi +GMSGFMT="$ac_cv_path_GMSGFMT" +if test -n "$GMSGFMT"; then + echo "$ac_t""$GMSGFMT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + fi + # Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3388: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$XGETTEXT" in + /*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test -n "$XGETTEXT"; then + echo "$ac_t""$XGETTEXT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + USE_INCLUDED_LIBINTL=yes + CATOBJEXT=.cat + INSTOBJEXT=.cat + DATADIRNAME=lib + INTLDEPS='$(top_builddir)/intl/libintl.a' + INTLLIBS=$INTLDEPS + LIBS=`echo $LIBS | sed -e 's/-lintl//'` + nls_cv_header_intl=intl/libintl.h + nls_cv_header_libgt=intl/libgettext.h + fi +else + echo "$ac_t""no" 1>&6 +fi + + fi + fi + + if test "$CATOBJEXT" = "NONE"; then + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + INTLOBJS="\$(GETTOBJS)" + # Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3446: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$MSGFMT" in + /*) + ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then + ac_cv_path_MSGFMT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="msgfmt" + ;; +esac +fi +MSGFMT="$ac_cv_path_MSGFMT" +if test -n "$MSGFMT"; then + echo "$ac_t""$MSGFMT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3480: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$GMSGFMT" in + /*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_GMSGFMT="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT="$ac_cv_path_GMSGFMT" +if test -n "$GMSGFMT"; then + echo "$ac_t""$GMSGFMT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + # Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3516: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$XGETTEXT" in + /*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test -n "$XGETTEXT"; then + echo "$ac_t""$XGETTEXT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + + USE_INCLUDED_LIBINTL=yes + CATOBJEXT=.gmo + INSTOBJEXT=.mo + DATADIRNAME=share + INTLDEPS='$(top_builddir)/intl/libintl.a' + INTLLIBS=$INTLDEPS + LIBS=`echo $LIBS | sed -e 's/-lintl//'` + nls_cv_header_intl=intl/libintl.h + nls_cv_header_libgt=intl/libgettext.h + fi + + if test "$XGETTEXT" != ":"; then + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + echo "$ac_t""found xgettext program is not GNU xgettext; ignore it" 1>&6 + XGETTEXT=":" + fi + fi + + # We need to process the po/ directory. + POSUB=po + else + DATADIRNAME=share + nls_cv_header_intl=intl/libintl.h + nls_cv_header_libgt=intl/libgettext.h + fi + + + + + # If this is used in GNU gettext we have to set USE_NLS to `yes' + # because some of the sources are only built for this goal. + if test "$PACKAGE" = gettext; then + USE_NLS=yes + USE_INCLUDED_LIBINTL=yes + fi + + for lang in $ALL_LINGUAS; do + GMOFILES="$GMOFILES $lang.gmo" + POFILES="$POFILES $lang.po" + done + + + + + + + + + + + + + + + if test "x$CATOBJEXT" != "x"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6 +echo "configure:3609: checking for catalogs to be installed" >&5 + NEW_LINGUAS= + for lang in ${LINGUAS=$ALL_LINGUAS}; do + case "$ALL_LINGUAS" in + *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; + esac + done + LINGUAS=$NEW_LINGUAS + echo "$ac_t""$LINGUAS" 1>&6 + fi + + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + if test $ac_cv_header_locale_h = yes; then + INCLUDE_LOCALE_H="#include <locale.h>" + else + INCLUDE_LOCALE_H="\ +/* The system does not provide the header <locale.h>. Take care yourself. */" + fi + + + test -d intl || mkdir intl + if test "$CATOBJEXT" = ".cat"; then + ac_safe=`echo "linux/version.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for linux/version.h""... $ac_c" 1>&6 +echo "configure:3637: checking for linux/version.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 3642 "configure" +#include "confdefs.h" +#include <linux/version.h> +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:3647: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + msgformat=linux +else + echo "$ac_t""no" 1>&6 +msgformat=xopen +fi + + + sed -e '/^#/d' $srcdir/intl/$msgformat-msg.sed > intl/po2msg.sed + fi + sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \ + $srcdir/intl/po2tbl.sed.in > intl/po2tbl.sed + + if test "$PACKAGE" = "gettext"; then + GT_NO="#NO#" + GT_YES= + else + GT_NO= + GT_YES="#YES#" + fi + + + + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + + + l= + + + test -d po || mkdir po + if test "x$srcdir" != "x."; then + if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then + posrcprefix="$srcdir/" + else + posrcprefix="../$srcdir/" + fi + else + posrcprefix="../" + fi + rm -f po/POTFILES + sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ + < $srcdir/po/POTFILES.in > po/POTFILES + + +if test "x${prefix}" = "xNONE"; then + cat >> confdefs.h <<EOF +#define PACKAGE_LOCALE_DIR "${ac_default_prefix}/${DATADIRNAME}/locale" +EOF + +else + cat >> confdefs.h <<EOF +#define PACKAGE_LOCALE_DIR "${prefix}/${DATADIRNAME}/locale" +EOF + +fi + +if test "x${datadir}" = 'x${prefix}/share'; then + if test "x${prefix}" = "xNONE"; then + cat >> confdefs.h <<EOF +#define PACKAGE_DATA_DIR "${ac_default_prefix}/share/${PACKAGE}" +EOF + + else + cat >> confdefs.h <<EOF +#define PACKAGE_DATA_DIR "${prefix}/share/${PACKAGE}" +EOF + + fi +else + cat >> confdefs.h <<EOF +#define PACKAGE_DATA_DIR "${datadir}/${PACKAGE}" +EOF + +fi + +packagesrcdir=`cd $srcdir && pwd` +cat >> confdefs.h <<EOF +#define PACKAGE_SOURCE_DIR "${packagesrcdir}" +EOF + + +if test "x$GCC" = "xyes"; then + case " $CFLAGS " in + *[\ \ ]-Wall[\ \ ]*) ;; + *) CFLAGS="$CFLAGS -Wall" ;; + esac +fi + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +DEFS=-DHAVE_CONFIG_H + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS <<EOF +#! /bin/sh +# Generated automatically by configure. +# Run this file to recreate the current configuration. +# This directory was configured as follows, +# on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir +ac_given_INSTALL="$INSTALL" + +trap 'rm -fr `echo " +Makefile +gtk-gui/Makefile +intl/Makefile +po/Makefile.in + config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS <<EOF + +# Protect against being on the right side of a sed subst in config.status. +sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g; + s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@FFLAGS@%$FFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g +s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g +s%@INSTALL_DATA@%$INSTALL_DATA%g +s%@PACKAGE@%$PACKAGE%g +s%@VERSION@%$VERSION%g +s%@ACLOCAL@%$ACLOCAL%g +s%@AUTOCONF@%$AUTOCONF%g +s%@AUTOMAKE@%$AUTOMAKE%g +s%@AUTOHEADER@%$AUTOHEADER%g +s%@MAKEINFO@%$MAKEINFO%g +s%@SET_MAKE@%$SET_MAKE%g +s%@CC@%$CC%g +s%@CPP@%$CPP%g +s%@GTK_CONFIG@%$GTK_CONFIG%g +s%@GTK_CFLAGS@%$GTK_CFLAGS%g +s%@GTK_LIBS@%$GTK_LIBS%g +s%@RANLIB@%$RANLIB%g +s%@ALLOCA@%$ALLOCA%g +s%@USE_NLS@%$USE_NLS%g +s%@MSGFMT@%$MSGFMT%g +s%@GMSGFMT@%$GMSGFMT%g +s%@XGETTEXT@%$XGETTEXT%g +s%@GENCAT@%$GENCAT%g +s%@USE_INCLUDED_LIBINTL@%$USE_INCLUDED_LIBINTL%g +s%@CATALOGS@%$CATALOGS%g +s%@CATOBJEXT@%$CATOBJEXT%g +s%@DATADIRNAME@%$DATADIRNAME%g +s%@GMOFILES@%$GMOFILES%g +s%@INSTOBJEXT@%$INSTOBJEXT%g +s%@INTLDEPS@%$INTLDEPS%g +s%@INTLLIBS@%$INTLLIBS%g +s%@INTLOBJS@%$INTLOBJS%g +s%@POFILES@%$POFILES%g +s%@POSUB@%$POSUB%g +s%@INCLUDE_LOCALE_H@%$INCLUDE_LOCALE_H%g +s%@GT_NO@%$GT_NO%g +s%@GT_YES@%$GT_YES%g +s%@MKINSTALLDIRS@%$MKINSTALLDIRS%g +s%@l@%$l%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <<EOF + +CONFIG_FILES=\${CONFIG_FILES-"Makefile +gtk-gui/Makefile +intl/Makefile +po/Makefile.in +"} +EOF +cat >> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + case "$ac_given_INSTALL" in + [/$]*) INSTALL="$ac_given_INSTALL" ;; + *) INSTALL="$ac_dots$ac_given_INSTALL" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +s%@INSTALL@%$INSTALL%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' +ac_dC='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +if test "${CONFIG_HEADERS+set}" != set; then +EOF +cat >> $CONFIG_STATUS <<EOF + CONFIG_HEADERS="config.h" +EOF +cat >> $CONFIG_STATUS <<\EOF +fi +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + cat $ac_file_inputs > conftest.in + +EOF + +# Transform confdefs.h into a sed script conftest.vals that substitutes +# the proper values into config.h.in to produce config.h. And first: +# Protect against being on the right side of a sed subst in config.status. +# Protect against being in an unquoted here document in config.status. +rm -f conftest.vals +cat > conftest.hdr <<\EOF +s/[\\&%]/\\&/g +s%[\\$`]%\\&%g +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +s%ac_d%ac_u%gp +s%ac_u%ac_e%gp +EOF +sed -n -f conftest.hdr confdefs.h > conftest.vals +rm -f conftest.hdr + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >> conftest.vals <<\EOF +s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% +EOF + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. + +rm -f conftest.tail +while : +do + ac_lines=`grep -c . conftest.vals` + # grep -c gives empty output for an empty file on some AIX systems. + if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi + # Write a limited-size here document to conftest.frag. + echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS + echo 'CEOF + sed -f conftest.frag conftest.in > conftest.out + rm -f conftest.in + mv conftest.out conftest.in +' >> $CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +cat >> $CONFIG_STATUS <<\EOF + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + fi + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + +EOF + +cat >> $CONFIG_STATUS <<EOF +ac_sources="$nls_cv_header_libgt" +ac_dests="$nls_cv_header_intl" +EOF + +cat >> $CONFIG_STATUS <<\EOF +srcdir=$ac_given_srcdir +while test -n "$ac_sources"; do + set $ac_dests; ac_dest=$1; shift; ac_dests=$* + set $ac_sources; ac_source=$1; shift; ac_sources=$* + + echo "linking $srcdir/$ac_source to $ac_dest" + + if test ! -r $srcdir/$ac_source; then + { echo "configure: error: $srcdir/$ac_source: File not found" 1>&2; exit 1; } + fi + rm -f $ac_dest + + # Make relative symlinks. + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dest_dir=`echo $ac_dest|sed 's%/[^/][^/]*$%%'` + if test "$ac_dest_dir" != "$ac_dest" && test "$ac_dest_dir" != .; then + # The dest file is in a subdirectory. + test ! -d "$ac_dest_dir" && mkdir "$ac_dest_dir" + ac_dest_dir_suffix="/`echo $ac_dest_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dest_dir_suffix. + ac_dots=`echo $ac_dest_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dest_dir_suffix= ac_dots= + fi + + case "$srcdir" in + [/$]*) ac_rel_source="$srcdir/$ac_source" ;; + *) ac_rel_source="$ac_dots$srcdir/$ac_source" ;; + esac + + # Make a symlink if possible; otherwise try a hard link. + if ln -s $ac_rel_source $ac_dest 2>/dev/null || + ln $srcdir/$ac_source $ac_dest; then : + else + { echo "configure: error: can not link $ac_dest to $srcdir/$ac_source" 1>&2; exit 1; } + fi +done +EOF +cat >> $CONFIG_STATUS <<EOF + + + +EOF +cat >> $CONFIG_STATUS <<\EOF +test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h +case "$CONFIG_FILES" in *po/Makefile.in*) + sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile + esac + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + + diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure.in b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure.in new file mode 100644 index 0000000000..cc0646f630 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/configure.in @@ -0,0 +1,58 @@ +dnl Process this file with autoconf to produce a configure script. + +AC_INIT(configure.in) +AM_INIT_AUTOMAKE(goom2, 0.1) +AC_CONFIG_HEADERS(config.h) + +AC_ISC_POSIX +AC_PROG_CC +AC_HEADER_STDC +AC_C_BIGENDIAN + + +AM_PATH_GTK(1.2.0, , + AC_MSG_ERROR(Cannot find GTK: Is gtk-config in path?)) + +dnl Add the languages which your application supports here. +ALL_LINGUAS="" +AM_GNU_GETTEXT + +dnl Set PACKAGE_LOCALE_DIR in config.h. +if test "x${prefix}" = "xNONE"; then + AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${ac_default_prefix}/${DATADIRNAME}/locale") +else + AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${prefix}/${DATADIRNAME}/locale") +fi + +dnl Set PACKAGE_DATA_DIR in config.h. +if test "x${datadir}" = 'x${prefix}/share'; then + if test "x${prefix}" = "xNONE"; then + AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${ac_default_prefix}/share/${PACKAGE}") + else + AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${prefix}/share/${PACKAGE}") + fi +else + AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${datadir}/${PACKAGE}") +fi + +dnl Set PACKAGE_SOURCE_DIR in config.h. +packagesrcdir=`cd $srcdir && pwd` +AC_DEFINE_UNQUOTED(PACKAGE_SOURCE_DIR, "${packagesrcdir}") + +dnl Use -Wall if we have gcc. +changequote(,)dnl +if test "x$GCC" = "xyes"; then + case " $CFLAGS " in + *[\ \ ]-Wall[\ \ ]*) ;; + *) CFLAGS="$CFLAGS -Wall" ;; + esac +fi +changequote([,])dnl + +AC_OUTPUT([ +Makefile +gtk-gui/Makefile +intl/Makefile +po/Makefile.in +]) + diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/goom2.glade b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/goom2.glade new file mode 100644 index 0000000000..d06490d65d --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/goom2.glade @@ -0,0 +1,158 @@ +<?xml version="1.0"?> +<GTK-Interface> + +<project> + <name>Goom2</name> + <program_name>goom2</program_name> + <directory></directory> + <source_directory>gtk-gui</source_directory> + <pixmaps_directory>pixmaps</pixmaps_directory> + <language>C</language> + <gnome_support>False</gnome_support> + <gettext_support>True</gettext_support> + <use_widget_names>True</use_widget_names> + <output_main_file>False</output_main_file> + <main_source_file>gtk-interface.c</main_source_file> + <main_header_file>gtk-interface.h</main_header_file> + <handler_source_file>gtk-callbacks.c</handler_source_file> + <handler_header_file>gtk-callbacks.h</handler_header_file> + <support_source_file>gtk-support.c</support_source_file> + <support_header_file>gtk-support.h</support_header_file> +</project> + +<widget> + <class>GtkWindow</class> + <name>config_window</name> + <signal> + <name>destroy_event</name> + <handler>on_config_window_destroy_event</handler> + <last_modification_time>Fri, 23 May 2003 09:08:30 GMT</last_modification_time> + </signal> + <signal> + <name>delete_event</name> + <handler>on_config_window_delete_event</handler> + <last_modification_time>Fri, 23 May 2003 09:09:21 GMT</last_modification_time> + </signal> + <title>Goom Control Center</title> + <type>GTK_WINDOW_TOPLEVEL</type> + <position>GTK_WIN_POS_NONE</position> + <modal>False</modal> + <allow_shrink>False</allow_shrink> + <allow_grow>True</allow_grow> + <auto_shrink>False</auto_shrink> + + <widget> + <class>GtkVBox</class> + <name>vbox1</name> + <homogeneous>False</homogeneous> + <spacing>0</spacing> + + <widget> + <class>GtkToolbar</class> + <name>toolbar1</name> + <border_width>3</border_width> + <orientation>GTK_ORIENTATION_HORIZONTAL</orientation> + <type>GTK_TOOLBAR_TEXT</type> + <space_size>8</space_size> + <space_style>GTK_TOOLBAR_SPACE_LINE</space_style> + <relief>GTK_RELIEF_NORMAL</relief> + <tooltips>True</tooltips> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + + <widget> + <class>GtkButton</class> + <child_name>Toolbar:button</child_name> + <name>b_open_config</name> + <label>Open...</label> + </widget> + + <widget> + <class>GtkButton</class> + <child_name>Toolbar:button</child_name> + <name>b_save_config</name> + <label>Save...</label> + </widget> + </widget> + + <widget> + <class>GtkNotebook</class> + <name>notebook1</name> + <can_focus>True</can_focus> + <show_tabs>True</show_tabs> + <show_border>True</show_border> + <tab_pos>GTK_POS_LEFT</tab_pos> + <scrollable>False</scrollable> + <tab_hborder>2</tab_hborder> + <tab_vborder>2</tab_vborder> + <popup_enable>False</popup_enable> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + + <widget> + <class>GtkScrolledWindow</class> + <name>scrolledwindow1</name> + <hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy> + <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy> + <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy> + <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy> + + <widget> + <class>GtkText</class> + <name>text1</name> + <width>400</width> + <height>300</height> + <can_focus>True</can_focus> + <editable>False</editable> + <text>What a GOOM!! v2 + +copyright 2000-2003, by J.C. Hoelt <jeko@free.fr> + +This is my first visual plugins for XMMS, and I +think that it's the best I have ever done ! + +--- + +This dialog will help you to configure goom. +Many options here will seem strange to you, +anyway, just try things and look what happen ! + +Enjoy, + + Jeko</text> + </widget> + </widget> + + <widget> + <class>GtkLabel</class> + <child_name>Notebook:tab</child_name> + <name>goom_control</name> + <label>About goom...</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + </widget> + + <widget> + <class>GtkStatusbar</class> + <name>statusbar1</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + </widget> + </widget> +</widget> + +</GTK-Interface> diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/Makefile.am b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/Makefile.am new file mode 100644 index 0000000000..ff6e08d409 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/Makefile.am @@ -0,0 +1,16 @@ +## Process this file with automake to produce Makefile.in + +INCLUDES = \ + -I$(top_srcdir)/intl \ + @GTK_CFLAGS@ + +bin_PROGRAMS = goom2 + +goom2_SOURCES = \ + main.c \ + support.c support.h \ + interface.c interface.h \ + callbacks.c callbacks.h + +goom2_LDADD = @GTK_LIBS@ $(INTLLIBS) + diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.c new file mode 100644 index 0000000000..3cb208ecf3 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.c @@ -0,0 +1,267 @@ +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <gtk/gtk.h> + +#include "gtk-callbacks.h" +#include "gtk-interface.h" +#include "gtk-support.h" + +#define WINSIZE_COMBO "combo_winsize" + +#include "sdl_goom.h" +#include "config_param.h" + +#include <stdio.h> +#include <stdlib.h> + +static SdlGoom *sdlGoom; +static GtkObject *owin; + +void +on_spinbutton_int_changed (GtkEditable *editable, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param"); + IVAL(*param) = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(editable)); + param->changed(param); +} + +void +on_list_changed (GtkEditable *editable, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param"); + LVAL(*param) = gtk_editable_get_chars (editable,0,-1); + param->changed(param); +} + +void +on_bool_toggled (GtkToggleButton *togglebutton, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(togglebutton),"param"); + BVAL(*param) = gtk_toggle_button_get_active(togglebutton); + param->changed(param); +} + +void my_int_listener (PluginParam *param) { + GtkEditable *editable; + + if (sdlGoom->config_win == 0) return; + editable = GTK_EDITABLE(param->user_data); + + if (editable) { + int pos = 0; + char str[256]; + sprintf (str, "%d", IVAL(*param)); + if (strcmp(str,gtk_editable_get_chars(editable,0,-1))) { + gtk_editable_delete_text (editable,0,-1); + gtk_editable_insert_text (editable,str,strlen(str),&pos); + } + } +} + +void my_list_listener (PluginParam *param) { + GtkEntry *editable; + + if (sdlGoom->config_win == 0) return; + editable = GTK_ENTRY(param->user_data); + + if (editable) { + if (strcmp(gtk_entry_get_text(editable),LVAL(*param))) { + gtk_entry_set_text (editable, LVAL(*param)); + } + } +} + +void my_bool_listener (PluginParam *param) { + GtkCheckButton *editable; + + if (sdlGoom->config_win == 0) return; + editable = GTK_CHECK_BUTTON(param->user_data); + + if (editable) { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(editable)) != BVAL(*param)) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(editable),BVAL(*param)); + } +} + +void my_float_listener (PluginParam *param) { + GtkProgressBar *progress; + + if (sdlGoom->config_win == 0) return; + progress = GTK_PROGRESS_BAR(param->user_data); + + if (progress) { + if (FVAL(*param)<FMIN(*param)) + FVAL(*param) = FMIN(*param); + if (FVAL(*param)>FMAX(*param)) + FVAL(*param) = FMAX(*param); + gtk_progress_bar_update (progress, FVAL(*param)); + } +} + +void addParams (GtkNotebook *notebook, PluginParameters *params) { + int n; + GtkWidget *table = gtk_table_new (params->nbParams, 2, FALSE); + gtk_container_set_border_width (GTK_CONTAINER (table), 11); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + + for (n=0;n<params->nbParams;++n) { + if (params->params[n] == 0) { + GtkWidget *hseparator = gtk_hseparator_new (); + gtk_widget_show (hseparator); + gtk_table_attach (GTK_TABLE (table), hseparator, 0, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 5); + } else { + PluginParam *p = params->params[n]; + + if (p->type != PARAM_BOOLVAL) { + GtkWidget *label4 = gtk_label_new (p->name); + gtk_widget_show (label4); + gtk_table_attach (GTK_TABLE (table), label4, 0, 1, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (label4), GTK_JUSTIFY_RIGHT); + gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5); + } + + switch (p->type) { + case PARAM_INTVAL: { + GtkWidget *spinbutton_adj,*spinbutton; + + spinbutton_adj = (GtkWidget*)gtk_adjustment_new ( + p->param.ival.value, + p->param.ival.min, p->param.ival.max, + p->param.ival.step, p->param.ival.step*10, + p->param.ival.step*10); + spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0); + gtk_widget_show (spinbutton); + gtk_table_attach (GTK_TABLE (table), spinbutton, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 1); + gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE); + gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinbutton), + GTK_UPDATE_IF_VALID); + p->user_data = spinbutton; + gtk_object_set_data (GTK_OBJECT(spinbutton),"param",(void*)p); + p->change_listener = my_int_listener; + gtk_signal_connect (GTK_OBJECT (spinbutton), "changed", + GTK_SIGNAL_FUNC (on_spinbutton_int_changed), + NULL); + break; + } + + case PARAM_FLOATVAL: { + GtkWidget *progress,*prog_adj; + + prog_adj = (GtkWidget*)gtk_adjustment_new ( + p->param.fval.value, + p->param.fval.min, p->param.fval.max, + p->param.fval.step, p->param.fval.step*10, + p->param.fval.step*10); + + progress = gtk_progress_bar_new_with_adjustment(GTK_ADJUSTMENT(prog_adj)); + gtk_widget_show(progress); + gtk_table_attach (GTK_TABLE (table), progress, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 1); + + p->user_data = progress; + p->change_listener = my_float_listener; + break; + } + + case PARAM_LISTVAL: { + int i; + GList *combo_winsize_items = NULL; + GtkWidget *combo_entry_winsize = NULL; + GtkWidget *combo_winsize = gtk_combo_new (); + gtk_widget_show (combo_winsize); + gtk_table_attach (GTK_TABLE (table), combo_winsize, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_combo_set_value_in_list (GTK_COMBO (combo_winsize), TRUE, TRUE); + for (i=0;i<p->param.slist.nbChoices;++i) + combo_winsize_items = g_list_append (combo_winsize_items, + p->param.slist.choices[i]); + gtk_combo_set_popdown_strings (GTK_COMBO (combo_winsize), combo_winsize_items); + g_list_free (combo_winsize_items); + + combo_entry_winsize = GTK_COMBO (combo_winsize)->entry; + gtk_widget_show (combo_entry_winsize); + gtk_entry_set_editable (GTK_ENTRY (combo_entry_winsize), FALSE); + gtk_entry_set_text (GTK_ENTRY (combo_entry_winsize), LVAL(*p)); + p->change_listener = my_list_listener; + p->user_data = combo_entry_winsize; + gtk_object_set_data (GTK_OBJECT(combo_entry_winsize),"param",(void*)p); + gtk_signal_connect (GTK_OBJECT (combo_entry_winsize), "changed", + GTK_SIGNAL_FUNC (on_list_changed), + NULL); + break; + } + + case PARAM_BOOLVAL: { + GtkWidget *checkbutton_double = + gtk_check_button_new_with_label (p->name); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_double),BVAL(*p)); + gtk_widget_show (checkbutton_double); + gtk_table_attach (GTK_TABLE (table), checkbutton_double, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_signal_connect (GTK_OBJECT (checkbutton_double), "toggled", + GTK_SIGNAL_FUNC (on_bool_toggled), + NULL); + gtk_object_set_data (GTK_OBJECT(checkbutton_double),"param",(void*)p); + p->user_data = checkbutton_double; + p->change_listener = my_bool_listener; + break; + } + } + } + } + + gtk_widget_show_all(GTK_WIDGET(table)); + gtk_container_add(GTK_CONTAINER(notebook),table); + gtk_notebook_set_tab_label_text(notebook,GTK_WIDGET(table),params->name); +} + +void gtk_data_init(SdlGoom *sg) { + sdlGoom = sg; + if (sdlGoom->config_win) { + int i; + GtkNotebook *notebook; + owin = GTK_OBJECT(sdlGoom->config_win); + notebook = GTK_NOTEBOOK(gtk_object_get_data (owin, "notebook1")); + addParams (notebook, &sdlGoom->screen); + for (i = 0; i < sdlGoom->plugin->nbParams; ++i) { + addParams (notebook, &sdlGoom->plugin->params[i]); + } + } +} + +gboolean +on_config_window_destroy_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + sdlGoom->config_win = 0; + owin = 0; + return FALSE; +} + + +gboolean +on_config_window_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + sdlGoom->config_win = 0; + owin = 0; + return FALSE; +} + diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.h b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.h new file mode 100644 index 0000000000..15749d22db --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.h @@ -0,0 +1,24 @@ +#include <gtk/gtk.h> + + +void +on_checkbutton_double_toggled (GtkToggleButton *togglebutton, + gpointer user_data); + +void +on_spinbutton_fps_changed (GtkEditable *editable, + gpointer user_data); + +void +on_combo_entry_winsize_changed (GtkEditable *editable, + gpointer user_data); + +gboolean +on_config_window_destroy_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data); + +gboolean +on_config_window_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data); diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.c new file mode 100644 index 0000000000..9d21ba0cdd --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.c @@ -0,0 +1,137 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <string.h> + +#include <gdk/gdkkeysyms.h> +#include <gtk/gtk.h> + +#include "gtk-callbacks.h" +#include "gtk-interface.h" +#include "gtk-support.h" + +GtkWidget* +create_config_window (void) +{ + GtkWidget *config_window; + GtkWidget *vbox1; + GtkWidget *toolbar1; + GtkWidget *b_open_config; + GtkWidget *b_save_config; + GtkWidget *notebook1; + GtkWidget *scrolledwindow1; + GtkWidget *text1; + GtkWidget *goom_control; + GtkWidget *statusbar1; + + config_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_widget_set_name (config_window, "config_window"); + gtk_object_set_data (GTK_OBJECT (config_window), "config_window", config_window); + gtk_window_set_title (GTK_WINDOW (config_window), _("Goom Control Center")); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_widget_set_name (vbox1, "vbox1"); + gtk_widget_ref (vbox1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "vbox1", vbox1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (vbox1); + gtk_container_add (GTK_CONTAINER (config_window), vbox1); + + toolbar1 = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_TEXT); + gtk_widget_set_name (toolbar1, "toolbar1"); + gtk_widget_ref (toolbar1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "toolbar1", toolbar1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (toolbar1); + gtk_box_pack_start (GTK_BOX (vbox1), toolbar1, FALSE, FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (toolbar1), 3); + gtk_toolbar_set_space_size (GTK_TOOLBAR (toolbar1), 8); + gtk_toolbar_set_space_style (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_SPACE_LINE); + + b_open_config = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), + GTK_TOOLBAR_CHILD_BUTTON, + NULL, + _("Open..."), + NULL, NULL, + NULL, NULL, NULL); + gtk_widget_set_name (b_open_config, "b_open_config"); + gtk_widget_ref (b_open_config); + gtk_object_set_data_full (GTK_OBJECT (config_window), "b_open_config", b_open_config, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (b_open_config); + + b_save_config = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), + GTK_TOOLBAR_CHILD_BUTTON, + NULL, + _("Save..."), + NULL, NULL, + NULL, NULL, NULL); + gtk_widget_set_name (b_save_config, "b_save_config"); + gtk_widget_ref (b_save_config); + gtk_object_set_data_full (GTK_OBJECT (config_window), "b_save_config", b_save_config, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (b_save_config); + + notebook1 = gtk_notebook_new (); + gtk_widget_set_name (notebook1, "notebook1"); + gtk_widget_ref (notebook1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "notebook1", notebook1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (notebook1); + gtk_box_pack_start (GTK_BOX (vbox1), notebook1, TRUE, TRUE, 0); + gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook1), GTK_POS_LEFT); + + scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL); + gtk_widget_set_name (scrolledwindow1, "scrolledwindow1"); + gtk_widget_ref (scrolledwindow1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "scrolledwindow1", scrolledwindow1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (scrolledwindow1); + gtk_container_add (GTK_CONTAINER (notebook1), scrolledwindow1); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); + + text1 = gtk_text_new (NULL, NULL); + gtk_widget_set_name (text1, "text1"); + gtk_widget_ref (text1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "text1", text1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (text1); + gtk_container_add (GTK_CONTAINER (scrolledwindow1), text1); + gtk_widget_set_usize (text1, 400, 300); + gtk_text_insert (GTK_TEXT (text1), NULL, NULL, NULL, + _("What a GOOM!! v2\n\ncopyright 2000-2003, by J.C. Hoelt <jeko@free.fr>\n\nThis is my first visual plugins for XMMS, and I\nthink that it's the best I have ever done !\n\n---\n\nThis dialog will help you to configure goom.\nMany options here will seem strange to you,\nanyway, just try things and look what happen !\n\nEnjoy,\n\n\tJeko"), 317); + + goom_control = gtk_label_new (_("About goom...")); + gtk_widget_set_name (goom_control, "goom_control"); + gtk_widget_ref (goom_control); + gtk_object_set_data_full (GTK_OBJECT (config_window), "goom_control", goom_control, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (goom_control); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), goom_control); + + statusbar1 = gtk_statusbar_new (); + gtk_widget_set_name (statusbar1, "statusbar1"); + gtk_widget_ref (statusbar1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "statusbar1", statusbar1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (statusbar1); + gtk_box_pack_start (GTK_BOX (vbox1), statusbar1, FALSE, FALSE, 0); + + gtk_signal_connect (GTK_OBJECT (config_window), "destroy_event", + GTK_SIGNAL_FUNC (on_config_window_destroy_event), + NULL); + gtk_signal_connect (GTK_OBJECT (config_window), "delete_event", + GTK_SIGNAL_FUNC (on_config_window_delete_event), + NULL); + + return config_window; +} + diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.h b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.h new file mode 100644 index 0000000000..95b003d030 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.h @@ -0,0 +1,5 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +GtkWidget* create_config_window (void); diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.c new file mode 100644 index 0000000000..732554c1cb --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.c @@ -0,0 +1,162 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <string.h> + +#include <gtk/gtk.h> + +#include "gtk-support.h" + +/* This is an internally used function to check if a pixmap file exists. */ +static gchar* check_file_exists (const gchar *directory, + const gchar *filename); + +/* This is an internally used function to create pixmaps. */ +static GtkWidget* create_dummy_pixmap (GtkWidget *widget); + +GtkWidget* +lookup_widget (GtkWidget *widget, + const gchar *widget_name) +{ + GtkWidget *parent, *found_widget; + + for (;;) + { + if (GTK_IS_MENU (widget)) + parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); + else + parent = widget->parent; + if (parent == NULL) + break; + widget = parent; + } + + found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget), + widget_name); + if (!found_widget) + g_warning ("Widget not found: %s", widget_name); + return found_widget; +} + +/* This is a dummy pixmap we use when a pixmap can't be found. */ +static char *dummy_pixmap_xpm[] = { +/* columns rows colors chars-per-pixel */ +"1 1 1 1", +" c None", +/* pixels */ +" " +}; + +/* This is an internally used function to create pixmaps. */ +static GtkWidget* +create_dummy_pixmap (GtkWidget *widget) +{ + GdkColormap *colormap; + GdkPixmap *gdkpixmap; + GdkBitmap *mask; + GtkWidget *pixmap; + + colormap = gtk_widget_get_colormap (widget); + gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask, + NULL, dummy_pixmap_xpm); + if (gdkpixmap == NULL) + g_error ("Couldn't create replacement pixmap."); + pixmap = gtk_pixmap_new (gdkpixmap, mask); + gdk_pixmap_unref (gdkpixmap); + gdk_bitmap_unref (mask); + return pixmap; +} + +static GList *pixmaps_directories = NULL; + +/* Use this function to set the directory containing installed pixmaps. */ +void +add_pixmap_directory (const gchar *directory) +{ + pixmaps_directories = g_list_prepend (pixmaps_directories, + g_strdup (directory)); +} + +/* This is an internally used function to create pixmaps. */ +GtkWidget* +create_pixmap (GtkWidget *widget, + const gchar *filename) +{ + gchar *found_filename = NULL; + GdkColormap *colormap; + GdkPixmap *gdkpixmap; + GdkBitmap *mask; + GtkWidget *pixmap; + GList *elem; + + if (!filename || !filename[0]) + return create_dummy_pixmap (widget); + + /* We first try any pixmaps directories set by the application. */ + elem = pixmaps_directories; + while (elem) + { + found_filename = check_file_exists ((gchar*)elem->data, filename); + if (found_filename) + break; + elem = elem->next; + } + + /* If we haven't found the pixmap, try the source directory. */ + if (!found_filename) + { + found_filename = check_file_exists ("../pixmaps", filename); + } + + if (!found_filename) + { + g_warning (_("Couldn't find pixmap file: %s"), filename); + return create_dummy_pixmap (widget); + } + + colormap = gtk_widget_get_colormap (widget); + gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask, + NULL, found_filename); + if (gdkpixmap == NULL) + { + g_warning (_("Error loading pixmap file: %s"), found_filename); + g_free (found_filename); + return create_dummy_pixmap (widget); + } + g_free (found_filename); + pixmap = gtk_pixmap_new (gdkpixmap, mask); + gdk_pixmap_unref (gdkpixmap); + gdk_bitmap_unref (mask); + return pixmap; +} + +/* This is an internally used function to check if a pixmap file exists. */ +gchar* +check_file_exists (const gchar *directory, + const gchar *filename) +{ + gchar *full_filename; + struct stat s; + gint status; + + full_filename = (gchar*) g_malloc (strlen (directory) + 1 + + strlen (filename) + 1); + strcpy (full_filename, directory); + strcat (full_filename, G_DIR_SEPARATOR_S); + strcat (full_filename, filename); + + status = stat (full_filename, &s); + if (status == 0 && S_ISREG (s.st_mode)) + return full_filename; + g_free (full_filename); + return NULL; +} + diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.h b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.h new file mode 100644 index 0000000000..931bc5ad04 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.h @@ -0,0 +1,61 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <gtk/gtk.h> + +/* + * Standard gettext macros. + */ +#ifdef ENABLE_NLS +# include <libintl.h> +# undef _ +# define _(String) dgettext (PACKAGE, String) +# ifdef gettext_noop +# define N_(String) gettext_noop (String) +# else +# define N_(String) (String) +# endif +#else +# define textdomain(String) (String) +# define gettext(String) (String) +# define dgettext(Domain,Message) (Message) +# define dcgettext(Domain,Message,Type) (Message) +# define bindtextdomain(Domain,Directory) (Domain) +# define _(String) (String) +# define N_(String) (String) +#endif + + +/* + * Public Functions. + */ + +/* + * This function returns a widget in a component created by Glade. + * Call it with the toplevel widget in the component (i.e. a window/dialog), + * or alternatively any widget in the component, and the name of the widget + * you want returned. + */ +GtkWidget* lookup_widget (GtkWidget *widget, + const gchar *widget_name); + +/* get_widget() is deprecated. Use lookup_widget instead. */ +#define get_widget lookup_widget + +/* Use this function to set the directory containing installed pixmaps. */ +void add_pixmap_directory (const gchar *directory); + + +/* + * Private Functions. + */ + +/* This is used to create the pixmaps in the interface. */ +GtkWidget* create_pixmap (GtkWidget *widget, + const gchar *filename); + diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/main.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/main.c new file mode 100644 index 0000000000..40393e5b66 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/gtk-gui/main.c @@ -0,0 +1,42 @@ +/* + * Initial main.c file generated by Glade. Edit as required. + * Glade will not overwrite this file. + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <gtk/gtk.h> + +#include "interface.h" +#include "support.h" + +int +main (int argc, char *argv[]) +{ + GtkWidget *config_window; + +#ifdef ENABLE_NLS + bindtextdomain (PACKAGE, PACKAGE_LOCALE_DIR); + textdomain (PACKAGE); +#endif + + gtk_set_locale (); + gtk_init (&argc, &argv); + + add_pixmap_directory (PACKAGE_DATA_DIR "/pixmaps"); + add_pixmap_directory (PACKAGE_SOURCE_DIR "/pixmaps"); + + /* + * The following code was added by Glade to create one of each component + * (except popup menus), just so that you see something after building + * the project. Delete any components that you don't want shown initially. + */ + config_window = create_config_window (); + gtk_widget_show (config_window); + + gtk_main (); + return 0; +} + diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/install-sh b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/install-sh new file mode 100755 index 0000000000..398a88e142 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/install-sh @@ -0,0 +1,251 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + : +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + chmodcmd="" + else + instcmd=$mkdirprog + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + : + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + : + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + : + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' + ' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + : + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + : + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/ChangeLog b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/ChangeLog new file mode 100644 index 0000000000..198950159d --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/ChangeLog @@ -0,0 +1,1086 @@ +1998-04-29 Ulrich Drepper <drepper@cygnus.com> + + * intl/localealias.c (read_alias_file): Use unsigned char for + local variables. Remove unused variable tp. + * intl/l10nflist.c (_nl_normalize_codeset): Use unsigned char * + for type of codeset. For loosing Solaris systems. + * intl/loadinfo.h: Adapt prototype of _nl_normalize_codeset. + * intl/bindtextdom.c (BINDTEXTDOMAIN): Don't define local variable + len if not needed. + Patches by Jim Meyering. + +1998-04-28 Ulrich Drepper <drepper@cygnus.com> + + * loadmsgcat.c (_nl_load_domain): Don't assign the element use_mmap if + mmap is not supported. + + * hash-string.h: Don't include <values.h>. + +1998-04-27 Ulrich Drepper <drepper@cygnus.com> + + * textdomain.c: Use strdup is available. + + * localealias.c: Define HAVE_MEMPCPY so that we can use this + function. Define and use semapahores to protect modfication of + global objects when compiling for glibc. Add code to allow + freeing alias table. + + * l10nflist.c: Don't assume stpcpy not being a macro. + + * gettextP.h: Define internal_function macri if not already done. + Use glibc byte-swap macros instead of defining SWAP when compiled + for glibc. + (struct loaded_domain): Add elements to allow unloading. + + * Makefile.in (distclean): Don't remove libintl.h here. + + * bindtextdomain.c: Carry over changes from glibc. Use strdup if + available. + + * dcgettext.c: Don't assume stpcpy not being a macro. Mark internal + functions. Add memory freeing code for glibc. + + * dgettext.c: Update copyright. + + * explodename.c: Include stdlib.h and string.h only if they exist. + Use strings.h eventually. + + * finddomain.c: Mark internal functions. Use strdup if available. + Add memory freeing code for glibc. + +1997-10-10 20:00 Ulrich Drepper <drepper@cygnus.com> + + * libgettext.h: Fix dummy textdomain and bindtextdomain macros. + They should return reasonable values. + Reported by Tom Tromey <tromey@cygnus.com>. + +1997-09-16 03:33 Ulrich Drepper <drepper@cygnus.com> + + * libgettext.h: Define PARAMS also to `args' if __cplusplus is defined. + * intlh.inst.in: Likewise. + Reported by Jean-Marc Lasgouttes <Jean-Marc.Lasgouttes@inria.fr>. + + * libintl.glibc: Update from current glibc version. + +1997-09-06 02:10 Ulrich Drepper <drepper@cygnus.com> + + * intlh.inst.in: Reformat copyright. + +1997-08-19 15:22 Ulrich Drepper <drepper@cygnus.com> + + * dcgettext.c (DCGETTEXT): Remove wrong comment. + +1997-08-16 00:13 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (install-data): Don't change directory to install. + +1997-08-01 14:30 Ulrich Drepper <drepper@cygnus.com> + + * cat-compat.c: Fix copyright. + + * localealias.c: Don't define strchr unless !HAVE_STRCHR. + + * loadmsgcat.c: Update copyright. Fix typos. + + * l10nflist.c: Don't define strchr unless !HAVE_STRCHR. + (_nl_make_l10nflist): Handle sponsor and revision correctly. + + * gettext.c: Update copyright. + * gettext.h: Likewise. + * hash-string.h: Likewise. + + * finddomain.c: Remoave dead code. Define strchr only if + !HAVE_STRCHR. + + * explodename.c: Include <sys/types.h>. + + * explodename.c: Reformat copyright text. + (_nl_explode_name): Fix typo. + + * dcgettext.c: Define and use __set_errno. + (guess_category_value): Don't use setlocale if HAVE_LC_MESSAGES is + not defined. + + * bindtextdom.c: Pretty printing. + +1997-05-01 02:25 Ulrich Drepper <drepper@cygnus.com> + + * dcgettext.c (guess_category_value): Don't depend on + HAVE_LC_MESSAGES. We don't need the macro here. + Patch by Bruno Haible <haible@ilog.fr>. + + * cat-compat.c (textdomain): DoN't refer to HAVE_SETLOCALE_NULL + macro. Instead use HAVE_LOCALE_NULL and define it when using + glibc, as in dcgettext.c. + Patch by Bruno Haible <haible@ilog.fr>. + + * Makefile.in (CPPFLAGS): New variable. Reported by Franc,ois + Pinard. + +Mon Mar 10 06:51:17 1997 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in: Implement handling of libtool. + + * gettextP.h: Change data structures for use of generic lowlevel + i18n file handling. + +Wed Dec 4 20:21:18 1996 Ulrich Drepper <drepper@cygnus.com> + + * textdomain.c: Put parentheses around arguments of memcpy macro + definition. + * localealias.c: Likewise. + * l10nflist.c: Likewise. + * finddomain.c: Likewise. + * bindtextdom.c: Likewise. + Reported by Thomas Esken. + +Mon Nov 25 22:57:51 1996 Ulrich Drepper <drepper@cygnus.com> + + * textdomain.c: Move definition of `memcpy` macro to right + position. + +Fri Nov 22 04:01:58 1996 Ulrich Drepper <drepper@cygnus.com> + + * finddomain.c [!HAVE_STRING_H && !_LIBC]: Define memcpy using + bcopy if not already defined. Reported by Thomas Esken. + * bindtextdom.c: Likewise. + * l10nflist.c: Likewise. + * localealias.c: Likewise. + * textdomain.c: Likewise. + +Tue Oct 29 11:10:27 1996 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (libdir): Change to use exec_prefix instead of + prefix. Reported by Knut-HåvardAksnes <etokna@eto.ericsson.se>. + +Sat Aug 31 03:07:09 1996 Ulrich Drepper <drepper@cygnus.com> + + * l10nflist.c (_nl_normalize_codeset): We convert to lower case, + so don't prepend uppercase `ISO' for only numeric arg. + +Fri Jul 19 00:15:46 1996 Ulrich Drepper <drepper@cygnus.com> + + * l10nflist.c: Move inclusion of argz.h, ctype.h, stdlib.h after + definition of _GNU_SOURCE. Patch by Roland McGrath. + + * Makefile.in (uninstall): Fix another bug with `for' loop and + empty arguments. Patch by Jim Meyering. Correct name os + uninstalled files: no intl- prefix anymore. + + * Makefile.in (install-data): Again work around shells which + cannot handle mpty for list. Reported by Jim Meyering. + +Sat Jul 13 18:11:35 1996 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (install): Split goal. Now depend on install-exec + and install-data. + (install-exec, install-data): New goals. Created from former + install goal. + Reported by Karl Berry. + +Sat Jun 22 04:58:14 1996 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (MKINSTALLDIRS): New variable. Path to + mkinstalldirs script. + (install): use MKINSTALLDIRS variable or if the script is not present + try to find it in the $top_scrdir). + +Wed Jun 19 02:56:56 1996 Ulrich Drepper <drepper@cygnus.com> + + * l10nflist.c: Linux libc *partly* includes the argz_* functions. + Grr. Work around by renaming the static version and use macros + for renaming. + +Tue Jun 18 20:11:17 1996 Ulrich Drepper <drepper@cygnus.com> + + * l10nflist.c: Correct presence test macros of __argz_* functions. + + * l10nflist.c: Include <argz.h> based on test of it instead when + __argz_* functions are available. + Reported by Andreas Schwab. + +Thu Jun 13 15:17:44 1996 Ulrich Drepper <drepper@cygnus.com> + + * explodename.c, l10nflist.c: Define NULL for dumb systems. + +Tue Jun 11 17:05:13 1996 Ulrich Drepper <drepper@cygnus.com> + + * intlh.inst.in, libgettext.h (dcgettext): Rename local variable + result to __result to prevent name clash. + + * l10nflist.c, localealias.c, dcgettext.c: Define _GNU_SOURCE to + get prototype for stpcpy and strcasecmp. + + * intlh.inst.in, libgettext.h: Move declaration of + `_nl_msg_cat_cntr' outside __extension__ block to prevent warning + from gcc's -Wnested-extern option. + +Fri Jun 7 01:58:00 1996 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (install): Remove comment. + +Thu Jun 6 17:28:17 1996 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (install): Work around for another Buglix stupidity. + Always use an `else' close for `if's. Reported by Nelson Beebe. + + * Makefile.in (intlh.inst): Correct typo in phony rule. + Reported by Nelson Beebe. + +Thu Jun 6 01:49:52 1996 Ulrich Drepper <drepper@cygnus.com> + + * dcgettext.c (read_alias_file): Rename variable alloca_list to + block_list as the macro calls assume. + Patch by Eric Backus. + + * localealias.c [!HAVE_ALLOCA]: Define alloca as macro using + malloc. + (read_alias_file): Rename varriabe alloca_list to block_list as the + macro calls assume. + Patch by Eric Backus. + + * l10nflist.c: Correct conditional for <argz.h> inclusion. + Reported by Roland McGrath. + + * Makefile.in (all): Depend on all-@USE_INCLUDED_LIBINTL@, not + all-@USE_NLS@. + + * Makefile.in (install): intlh.inst comes from local dir, not + $(srcdir). + + * Makefile.in (intlh.inst): Special handling of this goal. If + used in gettext, this is really a rul to construct this file. If + used in any other package it is defined as a .PHONY rule with + empty body. + + * finddomain.c: Extract locale file information handling into + l10nfile.c. Rename local stpcpy__ function to stpcpy. + + * dcgettext.c (stpcpy): Add local definition. + + * l10nflist.c: Solve some portability problems. Patches partly by + Thomas Esken. Add local definition of stpcpy. + +Tue Jun 4 02:47:49 1996 Ulrich Drepper <drepper@cygnus.com> + + * intlh.inst.in: Don't depend including <locale.h> on + HAVE_LOCALE_H. Instead configure must rewrite this fiile + depending on the result of the configure run. + + * Makefile.in (install): libintl.inst is now called intlh.inst. + Add rules for updating intlh.inst from intlh.inst.in. + + * libintl.inst: Renamed to intlh.inst.in. + + * localealias.c, dcgettext.c [__GNUC__]: Define HAVE_ALLOCA to 1 + because gcc has __buitlin_alloca. + Reported by Roland McGrath. + +Mon Jun 3 00:32:16 1996 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (installcheck): New goal to fulfill needs of + automake's distcheck. + + * Makefile.in (install): Reorder commands so that VERSION is + found. + + * Makefile.in (gettextsrcdir): Now use subdirectory intl/ in + @datadir@/gettext. + (COMSRCS): Add l10nfile.c. + (OBJECTS): Add l10nfile.o. + (DISTFILES): Rename to DISTFILE.normal. Remove $(DISTFILES.common). + (DISTFILE.gettext): Remove $(DISTFILES.common). + (all-gettext): Remove goal. + (install): If $(PACKAGE) = gettext install, otherwose do nothing. No + package but gettext itself should install libintl.h + headers. + (dist): Extend goal to work for gettext, too. + (dist-gettext): Remove goal. + + * dcgettext.c [!HAVE_ALLOCA]: Define macro alloca by using malloc. + +Sun Jun 2 17:33:06 1996 Ulrich Drepper <drepper@cygnus.com> + + * loadmsgcat.c (_nl_load_domain): Parameter is now comes from + find_l10nfile. + +Sat Jun 1 02:23:03 1996 Ulrich Drepper <drepper@cygnus.com> + + * l10nflist.c (__argz_next): Add definition. + + * dcgettext.c [!HAVE_ALLOCA]: Add code for handling missing alloca + code. Use new l10nfile handling. + + * localealias.c [!HAVE_ALLOCA]: Add code for handling missing + alloca code. + + * l10nflist.c: Initial revision. + +Tue Apr 2 18:51:18 1996 Ulrich Drepper <drepper@myware> + + * Makefile.in (all-gettext): New goal. Same as all-yes. + +Thu Mar 28 23:01:22 1996 Karl Eichwalder <ke@ke.central.de> + + * Makefile.in (gettextsrcdir): Define using @datadir@. + +Tue Mar 26 12:39:14 1996 Ulrich Drepper <drepper@myware> + + * finddomain.c: Include <ctype.h>. Reported by Roland McGrath. + +Sat Mar 23 02:00:35 1996 Ulrich Drepper <drepper@myware> + + * finddomain.c (stpcpy): Rename to stpcpy__ to prevent clashing + with external declaration. + +Sat Mar 2 00:47:09 1996 Ulrich Drepper <drepper@myware> + + * Makefile.in (all-no): Rename from all_no. + +Sat Feb 17 00:25:59 1996 Ulrich Drepper <drepper@myware> + + * gettextP.h [loaded_domain]: Array `successor' must now contain up + to 63 elements (because of codeset name normalization). + + * finddomain.c: Implement codeset name normalization. + +Thu Feb 15 04:39:09 1996 Ulrich Drepper <drepper@myware> + + * Makefile.in (all): Define to `all-@USE_NLS@'. + (all-yes, all_no): New goals. `all-no' is noop, `all-yes' + is former all. + +Mon Jan 15 21:46:01 1996 Howard Gayle <howard@hal.com> + + * localealias.c (alias_compare): Increment string pointers in loop + of strcasecmp replacement. + +Fri Dec 29 21:16:34 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (install-src): Who commented this goal out ? :-) + +Fri Dec 29 15:08:16 1995 Ulrich Drepper <drepper@myware> + + * dcgettext.c (DCGETTEXT): Save `errno'. Failing system calls + should not effect it because a missing catalog is no error. + Reported by Harald K<o:>nig <koenig@tat.physik.uni-tuebingen.de>. + +Tue Dec 19 22:09:13 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (Makefile): Explicitly use $(SHELL) for running + shell scripts. + +Fri Dec 15 17:34:59 1995 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * Makefile.in (install-src): Only install library and header when + we use the own implementation. Don't do it when using the + system's gettext or catgets functions. + + * dcgettext.c (find_msg): Must not swap domain->hash_size here. + +Sat Dec 9 16:24:37 1995 Ulrich Drepper <drepper@myware> + + * localealias.c, libintl.inst, libgettext.h, hash-string.h, + gettextP.h, finddomain.c, dcgettext.c, cat-compat.c: + Use PARAMS instead of __P. Suggested by Roland McGrath. + +Tue Dec 5 11:39:14 1995 Larry Schwimmer <rosebud@cyclone.stanford.edu> + + * libgettext.h: Use `#if !defined (_LIBINTL_H)' instead of `#if + !_LIBINTL_H' because Solaris defines _LIBINTL_H as empty. + +Mon Dec 4 15:42:07 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (install-src): + Install libintl.inst instead of libintl.h.install. + +Sat Dec 2 22:51:38 1995 Marcus Daniels <marcus@sysc.pdx.edu> + + * cat-compat.c (textdomain): + Reverse order in which files are tried you load. First + try local file, when this failed absolute path. + +Wed Nov 29 02:03:53 1995 Nelson H. F. Beebe <beebe@math.utah.edu> + + * cat-compat.c (bindtextdomain): Add missing { }. + +Sun Nov 26 18:21:41 1995 Ulrich Drepper <drepper@myware> + + * libintl.inst: Add missing __P definition. Reported by Nelson Beebe. + + * Makefile.in: + Add dummy `all' and `dvi' goals. Reported by Tom Tromey. + +Sat Nov 25 16:12:01 1995 Franc,ois Pinard <pinard@iro.umontreal.ca> + + * hash-string.h: Capitalize arguments of macros. + +Sat Nov 25 12:01:36 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (DISTFILES): Prevent files names longer than 13 + characters. libintl.h.glibc->libintl.glibc, + libintl.h.install->libintl.inst. Reported by Joshua R. Poulson. + +Sat Nov 25 11:31:12 1995 Eric Backus <ericb@lsid.hp.com> + + * dcgettext.c: Fix bug in preprocessor conditionals. + +Sat Nov 25 02:35:27 1995 Nelson H. F. Beebe <beebe@math.utah.edu> + + * libgettext.h: Solaris cc does not understand + #if !SYMBOL1 && !SYMBOL2. Sad but true. + +Thu Nov 23 16:22:14 1995 Ulrich Drepper <drepper@myware> + + * hash-string.h (hash_string): + Fix for machine with >32 bit `unsigned long's. + + * dcgettext.c (DCGETTEXT): + Fix horrible bug in loop for alternative translation. + +Thu Nov 23 01:45:29 1995 Ulrich Drepper <drepper@myware> + + * po2tbl.sed.in, linux-msg.sed, xopen-msg.sed: + Some further simplifications in message number generation. + +Mon Nov 20 21:08:43 1995 Ulrich Drepper <drepper@myware> + + * libintl.h.glibc: Use __const instead of const in prototypes. + + * Makefile.in (install-src): + Install libintl.h.install instead of libintl.h. This + is a stripped-down version. Suggested by Peter Miller. + + * libintl.h.install, libintl.h.glibc: Initial revision. + + * localealias.c (_nl_expand_alias, read_alias_file): + Protect prototypes in type casts by __P. + +Tue Nov 14 16:43:58 1995 Ulrich Drepper <drepper@myware> + + * hash-string.h: Correct prototype for hash_string. + +Sun Nov 12 12:42:30 1995 Ulrich Drepper <drepper@myware> + + * hash-string.h (hash_string): Add prototype. + + * gettextP.h: Fix copyright. + (SWAP): Add prototype. + +Wed Nov 8 22:56:33 1995 Ulrich Drepper <drepper@myware> + + * localealias.c (read_alias_file): Forgot sizeof. + Avoid calling *printf function. This introduces a big overhead. + Patch by Roland McGrath. + +Tue Nov 7 14:21:08 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c, cat-compat.c: Wrong indentation in #if for stpcpy. + + * finddomain.c (stpcpy): + Define substitution function local. The macro was to flaky. + + * cat-compat.c: Fix typo. + + * xopen-msg.sed, linux-msg.sed: + While bringing message number to right place only accept digits. + + * linux-msg.sed, xopen-msg.sed: Now that the counter does not have + leading 0s we don't need to remove them. Reported by Marcus + Daniels. + + * Makefile.in (../po/cat-id-tbl.o): Use $(top_srdir) in + dependency. Reported by Marcus Daniels. + + * cat-compat.c: (stpcpy) [!_LIBC && !HAVE_STPCPY]: Define replacement. + Generally cleanup using #if instead of #ifndef. + + * Makefile.in: Correct typos in comment. By Franc,ois Pinard. + +Mon Nov 6 00:27:02 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (install-src): Don't install libintl.h and libintl.a + if we use an available gettext implementation. + +Sun Nov 5 22:02:08 1995 Ulrich Drepper <drepper@myware> + + * libgettext.h: Fix typo: HAVE_CATGETTS -> HAVE_CATGETS. Reported + by Franc,ois Pinard. + + * libgettext.h: Use #if instead of #ifdef/#ifndef. + + * finddomain.c: + Comments describing what has to be done should start with FIXME. + +Sun Nov 5 19:38:01 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (DISTFILES): Split. Use DISTFILES with normal meaning. + DISTFILES.common names the files common to both dist goals. + DISTFILES.gettext are the files only distributed in GNU gettext. + +Sun Nov 5 17:32:54 1995 Ulrich Drepper <drepper@myware> + + * dcgettext.c (DCGETTEXT): Correct searching in derived locales. + This was necessary since a change in _nl_find_msg several weeks + ago. I really don't know this is still not fixed. + +Sun Nov 5 12:43:12 1995 Ulrich Drepper <drepper@myware> + + * loadmsgcat.c (_nl_load_domain): Test for FILENAME == NULL. This + might mark a special condition. + + * finddomain.c (make_entry_rec): Don't make illegal entry as decided. + + * Makefile.in (dist): Suppress error message when ln failed. + Get files from $(srcdir) explicitly. + + * libgettext.h (gettext_const): Rename to gettext_noop. + +Fri Nov 3 07:36:50 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c (make_entry_rec): + Protect against wrong locale names by testing mask. + + * libgettext.h (gettext_const): Add macro definition. + Capitalize macro arguments. + +Thu Nov 2 23:15:51 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c (_nl_find_domain): + Test for pointer != NULL before accessing value. + Reported by Tom Tromey. + + * gettext.c (NULL): + Define as (void*)0 instad of 0. Reported by Franc,ois Pinard. + +Mon Oct 30 21:28:52 1995 Ulrich Drepper <drepper@myware> + + * po2tbl.sed.in: Serious typo bug fixed by Jim Meyering. + +Sat Oct 28 23:20:47 1995 Ulrich Drepper <drepper@myware> + + * libgettext.h: Disable dcgettext optimization for Solaris 2.3. + + * localealias.c (alias_compare): + Peter Miller reported that tolower in some systems is + even dumber than I thought. Protect call by `isupper'. + +Fri Oct 27 22:22:51 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (libdir, includedir): New variables. + (install-src): Install libintl.a and libintl.h in correct dirs. + +Fri Oct 27 22:07:29 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (SOURCES): Fix typo: intrl.compat.c -> intl-compat.c. + + * po2tbl.sed.in: Patch for buggy SEDs by Christian von Roques. + + * localealias.c: + Fix typo and superflous test. Reported by Christian von Roques. + +Fri Oct 6 11:52:05 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c (_nl_find_domain): + Correct some remainder from the pre-CEN syntax. Now + we don't have a constant number of successors anymore. + +Wed Sep 27 21:41:13 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (DISTFILES): Add libintl.h.glibc. + + * Makefile.in (dist-libc): Add goal for packing sources for glibc. + (COMSRCS, COMHDRS): Splitted to separate sources shared with glibc. + + * loadmsgcat.c: Forget to continue #if line. + + * localealias.c: + [_LIBC]: Rename strcasecmp to __strcasecmp to keep ANSI C name + space clean. + + * dcgettext.c, finddomain.c: Better comment to last change. + + * loadmsgcat.c: + [_LIBC]: Rename fstat, open, close, read, mmap, and munmap to + __fstat, __open, __close, __read, __mmap, and __munmap resp + to keep ANSI C name space clean. + + * finddomain.c: + [_LIBC]: Rename stpcpy to __stpcpy to keep ANSI C name space clean. + + * dcgettext.c: + [_LIBC]: Rename getced and stpcpy to __getcwd and __stpcpy resp to + keep ANSI C name space clean. + + * libgettext.h: + Include sys/types.h for those old SysV systems out there. + Reported by Francesco Potorti`. + + * loadmsgcat.c (use_mmap): Define if compiled for glibc. + + * bindtextdom.c: Include all those standard headers + unconditionally if _LIBC is defined. + + * finddomain.c: Fix 2 times defiend -> defined. + + * textdomain.c: Include libintl.h instead of libgettext.h when + compiling for glibc. Include all those standard headers + unconditionally if _LIBC is defined. + + * localealias.c, loadmsgcat.c: Prepare to be compiled in glibc. + + * gettext.c: + Include libintl.h instead of libgettext.h when compiling for glibc. + Get NULL from stddef.h if we compile for glibc. + + * finddomain.c: Include libintl.h instead of libgettext.h when + compiling for glibc. Include all those standard headers + unconditionally if _LIBC is defined. + + * dcgettext.c: Include all those standard headers unconditionally + if _LIBC is defined. + + * dgettext.c: If compiled in glibc include libintl.h instead of + libgettext.h. + (locale.h): Don't rely on HAVE_LOCALE_H when compiling for glibc. + + * dcgettext.c: If compiled in glibc include libintl.h instead of + libgettext.h. + (getcwd): Don't rely on HAVE_GETCWD when compiling for glibc. + + * bindtextdom.c: + If compiled in glibc include libintl.h instead of libgettext.h. + +Mon Sep 25 22:23:06 1995 Ulrich Drepper <drepper@myware> + + * localealias.c (_nl_expand_alias): Don't call bsearch if NMAP <= 0. + Reported by Marcus Daniels. + + * cat-compat.c (bindtextdomain): + String used in putenv must not be recycled. + Reported by Marcus Daniels. + + * libgettext.h (__USE_GNU_GETTEXT): + Additional symbol to signal that we use GNU gettext + library. + + * cat-compat.c (bindtextdomain): + Fix bug with the strange stpcpy replacement. + Reported by Nelson Beebe. + +Sat Sep 23 08:23:51 1995 Ulrich Drepper <drepper@myware> + + * cat-compat.c: Include <string.h> for stpcpy prototype. + + * localealias.c (read_alias_file): + While expand strdup code temporary variable `cp' hided + higher level variable with same name. Rename to `tp'. + + * textdomain.c (textdomain): + Avoid warning by using temporary variable in strdup code. + + * finddomain.c (_nl_find_domain): Remove unused variable `application'. + +Thu Sep 21 15:51:44 1995 Ulrich Drepper <drepper@myware> + + * localealias.c (alias_compare): + Use strcasecmp() only if available. Else use + implementation in place. + + * intl-compat.c: + Wrapper functions now call *__ functions instead of __*. + + * libgettext.h: Declare prototypes for *__ functions instead for __*. + + * cat-compat.c, loadmsgcat.c: + Don't use xmalloc, xstrdup, and stpcpy. These functions are not part + of the standard libc and so prevent libintl.a from being used + standalone. + + * bindtextdom.c: + Don't use xmalloc, xstrdup, and stpcpy. These functions are not part + of the standard libc and so prevent libintl.a from being used + standalone. + Rename to bindtextdomain__ if not used in GNU C Library. + + * dgettext.c: + Rename function to dgettext__ if not used in GNU C Library. + + * gettext.c: + Don't use xmalloc, xstrdup, and stpcpy. These functions are not part + of the standard libc and so prevent libintl.a from being used + standalone. + Functions now called gettext__ if not used in GNU C Library. + + * dcgettext.c, localealias.c, textdomain.c, finddomain.c: + Don't use xmalloc, xstrdup, and stpcpy. These functions are not part + of the standard libc and so prevent libintl.a from being used + standalone. + +Sun Sep 17 23:14:49 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c: Correct some bugs in handling of CEN standard + locale definitions. + +Thu Sep 7 01:49:28 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c: Implement CEN syntax. + + * gettextP.h (loaded_domain): Extend number of successors to 31. + +Sat Aug 19 19:25:29 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (aliaspath): Remove path to X11 locale dir. + + * Makefile.in: Make install-src depend on install. This helps + gettext to install the sources and other packages can use the + install goal. + +Sat Aug 19 15:19:33 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (uninstall): Remove stuff installed by install-src. + +Tue Aug 15 13:13:53 1995 Ulrich Drepper <drepper@myware> + + * VERSION.in: Initial revision. + + * Makefile.in (DISTFILES): + Add VERSION file. This is not necessary for gettext, but + for other packages using this library. + +Tue Aug 15 06:16:44 1995 Ulrich Drepper <drepper@myware> + + * gettextP.h (_nl_find_domain): + New prototype after changing search strategy. + + * finddomain.c (_nl_find_domain): + We now try only to find a specified catalog. Fall back to other + catalogs listed in the locale list is now done in __dcgettext. + + * dcgettext.c (__dcgettext): + Now we provide message fall back even to different languages. + I.e. if a message is not available in one language all the other + in the locale list a tried. Formerly fall back was only possible + within one language. Implemented by moving one loop from + _nl_find_domain to here. + +Mon Aug 14 23:45:50 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (gettextsrcdir): + Directory where source of GNU gettext library are made + available. + (INSTALL, INSTALL_DATA): Programs used for installing sources. + (gettext-src): New. Rule to install GNU gettext sources for use in + gettextize shell script. + +Sun Aug 13 14:40:48 1995 Ulrich Drepper <drepper@myware> + + * loadmsgcat.c (_nl_load_domain): + Use mmap for loading only when munmap function is + also available. + + * Makefile.in (install): Depend on `all' goal. + +Wed Aug 9 11:04:33 1995 Ulrich Drepper <drepper@myware> + + * localealias.c (read_alias_file): + Do not overwrite '\n' when terminating alias value string. + + * localealias.c (read_alias_file): + Handle long lines. Ignore the rest not fitting in + the buffer after the initial `fgets' call. + +Wed Aug 9 00:54:29 1995 Ulrich Drepper <drepper@myware> + + * gettextP.h (_nl_load_domain): + Add prototype, replacing prototype for _nl_load_msg_cat. + + * finddomain.c (_nl_find_domain): + Remove unneeded variable filename and filename_len. + (expand_alias): Remove prototype because functions does not + exist anymore. + + * localealias.c (read_alias_file): + Change type of fname_len parameter to int. + (xmalloc): Add prototype. + + * loadmsgcat.c: Better prototypes for xmalloc. + +Tue Aug 8 22:30:39 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c (_nl_find_domain): + Allow alias name to be constructed from the four components. + + * Makefile.in (aliaspath): New variable. Set to preliminary value. + (SOURCES): Add localealias.c. + (OBJECTS): Add localealias.o. + + * gettextP.h: Add prototype for _nl_expand_alias. + + * finddomain.c: Aliasing handled in intl/localealias.c. + + * localealias.c: Aliasing for locale names. + + * bindtextdom.c: Better prototypes for xmalloc and xstrdup. + +Mon Aug 7 23:47:42 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (DISTFILES): gettext.perl is now found in misc/. + + * cat-compat.c (bindtextdomain): + Correct implementation. dirname parameter was not used. + Reported by Marcus Daniels. + + * gettextP.h (loaded_domain): + New fields `successor' and `decided' for oo, lazy + message handling implementation. + + * dcgettext.c: + Adopt for oo, lazy message handliing. + Now we can inherit translations from less specific locales. + (find_msg): New function. + + * loadmsgcat.c, finddomain.c: + Complete rewrite. Implement oo, lazy message handling :-). + We now have an additional environment variable `LANGUAGE' with + a higher priority than LC_ALL for the LC_MESSAGE locale. + Here we can set a colon separated list of specifications each + of the form `language[_territory[.codeset]][@modifier]'. + +Sat Aug 5 09:55:42 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c (unistd.h): + Include to get _PC_PATH_MAX defined on system having it. + +Fri Aug 4 22:42:00 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c (stpcpy): Include prototype. + + * Makefile.in (dist): Remove `copying instead' message. + +Wed Aug 2 18:52:03 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (ID, TAGS): Do not use $^. + +Tue Aug 1 20:07:11 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (TAGS, ID): Use $^ as command argument. + (TAGS): Give etags -o option t write to current directory, + not $(srcdir). + (ID): Use $(srcdir) instead os $(top_srcdir)/src. + (distclean): Remove ID. + +Sun Jul 30 11:51:46 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (gnulocaledir): + New variable, always using share/ for data directory. + (DEFS): Add GNULOCALEDIR, used in finddomain.c. + + * finddomain.c (_nl_default_dirname): + Set to GNULOCALEDIR, because it always has to point + to the directory where GNU gettext Library writes it to. + + * intl-compat.c (textdomain, bindtextdomain): + Undefine macros before function definition. + +Sat Jul 22 01:10:02 1995 Ulrich Drepper <drepper@myware> + + * libgettext.h (_LIBINTL_H): + Protect definition in case where this file is included as + libgettext.h on Solaris machines. Add comment about this. + +Wed Jul 19 02:36:42 1995 Ulrich Drepper <drepper@myware> + + * intl-compat.c (textdomain): Correct typo. + +Wed Jul 19 01:51:35 1995 Ulrich Drepper <drepper@myware> + + * dcgettext.c (dcgettext): Function now called __dcgettext. + + * dgettext.c (dgettext): Now called __dgettext and calls + __dcgettext. + + * gettext.c (gettext): + Function now called __gettext and calls __dgettext. + + * textdomain.c (textdomain): Function now called __textdomain. + + * bindtextdom.c (bindtextdomain): Function now called + __bindtextdomain. + + * intl-compat.c: Initial revision. + + * Makefile.in (SOURCES): Add intl-compat.c. + (OBJECTS): We always compile the GNU gettext library functions. + OBJECTS contains all objects but cat-compat.o, ../po/cat-if-tbl.o, + and intl-compat.o. + (GETTOBJS): Contains now only intl-compat.o. + + * libgettext.h: + Re-include protection matches dualistic character of libgettext.h. + For all functions in GNU gettext library define __ counter part. + + * finddomain.c (strchr): Define as index if not found in C library. + (_nl_find_domain): For relative paths paste / in between. + +Tue Jul 18 16:37:45 1995 Ulrich Drepper <drepper@myware> + + * loadmsgcat.c, finddomain.c: Add inclusion of sys/types.h. + + * xopen-msg.sed: Fix bug with `msgstr ""' lines. + A little bit better comments. + +Tue Jul 18 01:18:27 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in: + po-mode.el, makelinks, combine-sh are now found in ../misc. + + * po-mode.el, makelinks, combine-sh, elisp-comp: + Moved to ../misc/. + + * libgettext.h, gettextP.h, gettext.h: Uniform test for __STDC__. + +Sun Jul 16 22:33:02 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (INSTALL, INSTALL_DATA): New variables. + (install-data, uninstall): Install/uninstall .elc file. + + * po-mode.el (Installation comment): + Add .pox as possible extension of .po files. + +Sun Jul 16 13:23:27 1995 Ulrich Drepper <drepper@myware> + + * elisp-comp: Complete new version by Franc,ois: This does not + fail when not compiling in the source directory. + +Sun Jul 16 00:12:17 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (../po/cat-id-tbl.o): + Use $(MAKE) instead of make for recursive make. + + * Makefile.in (.el.elc): Use $(SHELL) instead of /bin/sh. + (install-exec): Add missing dummy goal. + (install-data, uninstall): @ in multi-line shell command at + beginning, not in front of echo. Reported by Eric Backus. + +Sat Jul 15 00:21:28 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (DISTFILES): + Rename libgettext.perl to gettext.perl to fit in 14 chars + file systems. + + * gettext.perl: + Rename to gettext.perl to fit in 14 chars file systems. + +Thu Jul 13 23:17:20 1995 Ulrich Drepper <drepper@myware> + + * cat-compat.c: If !STDC_HEADERS try to include malloc.h. + +Thu Jul 13 20:55:02 1995 Ulrich Drepper <drepper@myware> + + * po2tbl.sed.in: Pretty printing. + + * linux-msg.sed, xopen-msg.sed: + Correct bugs with handling substitute flags in branches. + + * hash-string.h (hash_string): + Old K&R compilers don't under stand `unsigned char'. + + * gettext.h (nls_uint32): + Some old K&R compilers (eg HP) don't understand `unsigned int'. + + * cat-compat.c (msg_to_cat_id): De-ANSI-fy prototypes. + +Thu Jul 13 01:34:33 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (ELCFILES): New variable. + (DISTFILES): Add elisp-comp. + Add implicit rule for .el -> .elc compilation. + (install-data): install $ELCFILES + (clean): renamed po-to-tbl and po-to-msg to po2tbl and po2msg resp. + + * elisp-comp: Initial revision + +Wed Jul 12 16:14:52 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in: + cat-id-tbl.c is now found in po/. This enables us to use an identical + intl/ directory in all packages. + + * dcgettext.c (dcgettext): hashing does not work for table size <= 2. + + * textdomain.c: fix typo (#if def -> #if defined) + +Tue Jul 11 18:44:43 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (stamp-cat-id): use top_srcdir to address source files + (DISTFILES,distclean): move tupdate.perl to src/ + + * po-to-tbl.sed.in: + add additional jump to clear change flag to recognize multiline strings + +Tue Jul 11 01:32:50 1995 Ulrich Drepper <drepper@myware> + + * textdomain.c: Protect inclusion of stdlib.h and string.h. + + * loadmsgcat.c: Protect inclusion of stdlib.h. + + * libgettext.h: Protect inclusion of locale.h. + Allow use in C++ programs. + Define NULL is not happened already. + + * Makefile.in (DISTFILES): ship po-to-tbl.sed.in instead of + po-to-tbl.sed. + (distclean): remove po-to-tbl.sed and tupdate.perl. + + * tupdate.perl.in: Substitute Perl path even in exec line. + Don't include entries without translation from old .po file. + +Tue Jul 4 00:41:51 1995 Ulrich Drepper <drepper@myware> + + * tupdate.perl.in: use "Updated: " in msgid "". + + * cat-compat.c: Fix typo (LOCALDIR -> LOCALEDIR). + Define getenv if !__STDC__. + + * bindtextdom.c: Protect stdlib.h and string.h inclusion. + Define free if !__STDC__. + + * finddomain.c: Change DEF_MSG_DOM_DIR to LOCALEDIR. + Define free if !__STDC__. + + * cat-compat.c: Change DEF_MSG_DOM_DIR to LOCALEDIR. + +Mon Jul 3 23:56:30 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in: Use LOCALEDIR instead of DEF_MSG_DOM_DIR. + Remove unneeded $(srcdir) from Makefile.in dependency. + + * makelinks: Add copyright and short description. + + * po-mode.el: Last version for 0.7. + + * tupdate.perl.in: Fix die message. + + * dcgettext.c: Protect include of string.h. + + * gettext.c: Protect include of stdlib.h and further tries to get NULL. + + * finddomain.c: Some corrections in includes. + + * Makefile.in (INCLUDES): Prune list correct path to Makefile.in. + + * po-to-tbl.sed: Adopt for new .po file format. + + * linux-msg.sed, xopen-msg.sed: Adopt for new .po file format. + +Sun Jul 2 23:55:03 1995 Ulrich Drepper <drepper@myware> + + * tupdate.perl.in: Complete rewrite for new .po file format. + +Sun Jul 2 02:06:50 1995 Ulrich Drepper <drepper@myware> + + * First official release. This directory contains all the code + needed to internationalize own packages. It provides functions + which allow to use the X/Open catgets function with an interface + like the Uniforum gettext function. For system which does not + have neither of those a complete implementation is provided. diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/VERSION b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/VERSION new file mode 100644 index 0000000000..ee66b0612b --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/VERSION @@ -0,0 +1 @@ +GNU gettext library from gettext-0.10.35 diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/bindtextdom.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/bindtextdom.c new file mode 100644 index 0000000000..d9c3f349e0 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/bindtextdom.c @@ -0,0 +1,203 @@ +/* Implementation of the bindtextdomain(3) function + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#else +# ifdef HAVE_MALLOC_H +# include <malloc.h> +# else +void free (); +# endif +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# include <string.h> +#else +# include <strings.h> +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) +# endif +#endif + +#ifdef _LIBC +# include <libintl.h> +#else +# include "libgettext.h" +#endif +#include "gettext.h" +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +/* Contains the default location of the message catalogs. */ +extern const char _nl_default_dirname[]; + +/* List with bindings of specific domains. */ +extern struct binding *_nl_domain_bindings; + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define BINDTEXTDOMAIN __bindtextdomain +# ifndef strdup +# define strdup(str) __strdup (str) +# endif +#else +# define BINDTEXTDOMAIN bindtextdomain__ +#endif + +/* Specify that the DOMAINNAME message catalog will be found + in DIRNAME rather than in the system locale data base. */ +char * +BINDTEXTDOMAIN (domainname, dirname) + const char *domainname; + const char *dirname; +{ + struct binding *binding; + + /* Some sanity checks. */ + if (domainname == NULL || domainname[0] == '\0') + return NULL; + + for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) + { + int compare = strcmp (domainname, binding->domainname); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It is not in the list. */ + binding = NULL; + break; + } + } + + if (dirname == NULL) + /* The current binding has be to returned. */ + return binding == NULL ? (char *) _nl_default_dirname : binding->dirname; + + if (binding != NULL) + { + /* The domain is already bound. If the new value and the old + one are equal we simply do nothing. Otherwise replace the + old binding. */ + if (strcmp (dirname, binding->dirname) != 0) + { + char *new_dirname; + + if (strcmp (dirname, _nl_default_dirname) == 0) + new_dirname = (char *) _nl_default_dirname; + else + { +#if defined _LIBC || defined HAVE_STRDUP + new_dirname = strdup (dirname); + if (new_dirname == NULL) + return NULL; +#else + size_t len = strlen (dirname) + 1; + new_dirname = (char *) malloc (len); + if (new_dirname == NULL) + return NULL; + + memcpy (new_dirname, dirname, len); +#endif + } + + if (binding->dirname != _nl_default_dirname) + free (binding->dirname); + + binding->dirname = new_dirname; + } + } + else + { + /* We have to create a new binding. */ +#if !defined _LIBC && !defined HAVE_STRDUP + size_t len; +#endif + struct binding *new_binding = + (struct binding *) malloc (sizeof (*new_binding)); + + if (new_binding == NULL) + return NULL; + +#if defined _LIBC || defined HAVE_STRDUP + new_binding->domainname = strdup (domainname); + if (new_binding->domainname == NULL) + return NULL; +#else + len = strlen (domainname) + 1; + new_binding->domainname = (char *) malloc (len); + if (new_binding->domainname == NULL) + return NULL; + memcpy (new_binding->domainname, domainname, len); +#endif + + if (strcmp (dirname, _nl_default_dirname) == 0) + new_binding->dirname = (char *) _nl_default_dirname; + else + { +#if defined _LIBC || defined HAVE_STRDUP + new_binding->dirname = strdup (dirname); + if (new_binding->dirname == NULL) + return NULL; +#else + len = strlen (dirname) + 1; + new_binding->dirname = (char *) malloc (len); + if (new_binding->dirname == NULL) + return NULL; + memcpy (new_binding->dirname, dirname, len); +#endif + } + + /* Now enqueue it. */ + if (_nl_domain_bindings == NULL + || strcmp (domainname, _nl_domain_bindings->domainname) < 0) + { + new_binding->next = _nl_domain_bindings; + _nl_domain_bindings = new_binding; + } + else + { + binding = _nl_domain_bindings; + while (binding->next != NULL + && strcmp (domainname, binding->next->domainname) > 0) + binding = binding->next; + + new_binding->next = binding->next; + binding->next = new_binding; + } + + binding = new_binding; + } + + return binding->dirname; +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__bindtextdomain, bindtextdomain); +#endif diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/cat-compat.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/cat-compat.c new file mode 100644 index 0000000000..867d901b8f --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/cat-compat.c @@ -0,0 +1,262 @@ +/* Compatibility code for gettext-using-catgets interface. + Copyright (C) 1995, 1997 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdio.h> + +#ifdef STDC_HEADERS +# include <stdlib.h> +# include <string.h> +#else +char *getenv (); +# ifdef HAVE_MALLOC_H +# include <malloc.h> +# endif +#endif + +#ifdef HAVE_NL_TYPES_H +# include <nl_types.h> +#endif + +#include "libgettext.h" + +/* @@ end of prolog @@ */ + +/* XPG3 defines the result of `setlocale (category, NULL)' as: + ``Directs `setlocale()' to query `category' and return the current + setting of `local'.'' + However it does not specify the exact format. And even worse: POSIX + defines this not at all. So we can use this feature only on selected + system (e.g. those using GNU C Library). */ +#ifdef _LIBC +# define HAVE_LOCALE_NULL +#endif + +/* The catalog descriptor. */ +static nl_catd catalog = (nl_catd) -1; + +/* Name of the default catalog. */ +static const char default_catalog_name[] = "messages"; + +/* Name of currently used catalog. */ +static const char *catalog_name = default_catalog_name; + +/* Get ID for given string. If not found return -1. */ +static int msg_to_cat_id PARAMS ((const char *msg)); + +/* Substitution for systems lacking this function in their C library. */ +#if !_LIBC && !HAVE_STPCPY +static char *stpcpy PARAMS ((char *dest, const char *src)); +#endif + + +/* Set currently used domain/catalog. */ +char * +textdomain (domainname) + const char *domainname; +{ + nl_catd new_catalog; + char *new_name; + size_t new_name_len; + char *lang; + +#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES \ + && defined HAVE_LOCALE_NULL + lang = setlocale (LC_MESSAGES, NULL); +#else + lang = getenv ("LC_ALL"); + if (lang == NULL || lang[0] == '\0') + { + lang = getenv ("LC_MESSAGES"); + if (lang == NULL || lang[0] == '\0') + lang = getenv ("LANG"); + } +#endif + if (lang == NULL || lang[0] == '\0') + lang = "C"; + + /* See whether name of currently used domain is asked. */ + if (domainname == NULL) + return (char *) catalog_name; + + if (domainname[0] == '\0') + domainname = default_catalog_name; + + /* Compute length of added path element. */ + new_name_len = sizeof (LOCALEDIR) - 1 + 1 + strlen (lang) + + sizeof ("/LC_MESSAGES/") - 1 + sizeof (PACKAGE) - 1 + + sizeof (".cat"); + + new_name = (char *) malloc (new_name_len); + if (new_name == NULL) + return NULL; + + strcpy (new_name, PACKAGE); + new_catalog = catopen (new_name, 0); + + if (new_catalog == (nl_catd) -1) + { + /* NLSPATH search didn't work, try absolute path */ + sprintf (new_name, "%s/%s/LC_MESSAGES/%s.cat", LOCALEDIR, lang, + PACKAGE); + new_catalog = catopen (new_name, 0); + + if (new_catalog == (nl_catd) -1) + { + free (new_name); + return (char *) catalog_name; + } + } + + /* Close old catalog. */ + if (catalog != (nl_catd) -1) + catclose (catalog); + if (catalog_name != default_catalog_name) + free ((char *) catalog_name); + + catalog = new_catalog; + catalog_name = new_name; + + return (char *) catalog_name; +} + +char * +bindtextdomain (domainname, dirname) + const char *domainname; + const char *dirname; +{ +#if HAVE_SETENV || HAVE_PUTENV + char *old_val, *new_val, *cp; + size_t new_val_len; + + /* This does not make much sense here but to be compatible do it. */ + if (domainname == NULL) + return NULL; + + /* Compute length of added path element. If we use setenv we don't need + the first byts for NLSPATH=, but why complicate the code for this + peanuts. */ + new_val_len = sizeof ("NLSPATH=") - 1 + strlen (dirname) + + sizeof ("/%L/LC_MESSAGES/%N.cat"); + + old_val = getenv ("NLSPATH"); + if (old_val == NULL || old_val[0] == '\0') + { + old_val = NULL; + new_val_len += 1 + sizeof (LOCALEDIR) - 1 + + sizeof ("/%L/LC_MESSAGES/%N.cat"); + } + else + new_val_len += strlen (old_val); + + new_val = (char *) malloc (new_val_len); + if (new_val == NULL) + return NULL; + +# if HAVE_SETENV + cp = new_val; +# else + cp = stpcpy (new_val, "NLSPATH="); +# endif + + cp = stpcpy (cp, dirname); + cp = stpcpy (cp, "/%L/LC_MESSAGES/%N.cat:"); + + if (old_val == NULL) + { +# if __STDC__ + stpcpy (cp, LOCALEDIR "/%L/LC_MESSAGES/%N.cat"); +# else + + cp = stpcpy (cp, LOCALEDIR); + stpcpy (cp, "/%L/LC_MESSAGES/%N.cat"); +# endif + } + else + stpcpy (cp, old_val); + +# if HAVE_SETENV + setenv ("NLSPATH", new_val, 1); + free (new_val); +# else + putenv (new_val); + /* Do *not* free the environment entry we just entered. It is used + from now on. */ +# endif + +#endif + + return (char *) domainname; +} + +#undef gettext +char * +gettext (msg) + const char *msg; +{ + int msgid; + + if (msg == NULL || catalog == (nl_catd) -1) + return (char *) msg; + + /* Get the message from the catalog. We always use set number 1. + The message ID is computed by the function `msg_to_cat_id' + which works on the table generated by `po-to-tbl'. */ + msgid = msg_to_cat_id (msg); + if (msgid == -1) + return (char *) msg; + + return catgets (catalog, 1, msgid, (char *) msg); +} + +/* Look through the table `_msg_tbl' which has `_msg_tbl_length' entries + for the one equal to msg. If it is found return the ID. In case when + the string is not found return -1. */ +static int +msg_to_cat_id (msg) + const char *msg; +{ + int cnt; + + for (cnt = 0; cnt < _msg_tbl_length; ++cnt) + if (strcmp (msg, _msg_tbl[cnt]._msg) == 0) + return _msg_tbl[cnt]._msg_number; + + return -1; +} + + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (dest, src) + char *dest; + const char *src; +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dcgettext.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dcgettext.c new file mode 100644 index 0000000000..c4c7a2c7d1 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dcgettext.c @@ -0,0 +1,624 @@ +/* Implementation of the dcgettext(3) function. + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <sys/types.h> + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include <alloca.h> +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +#endif + +#include <errno.h> +#ifndef errno +extern int errno; +#endif +#ifndef __set_errno +# define __set_errno(val) errno = (val) +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#else +char *getenv (); +# ifdef HAVE_MALLOC_H +# include <malloc.h> +# else +void free (); +# endif +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +# endif +# include <string.h> +#else +# include <strings.h> +#endif +#if !HAVE_STRCHR && !defined _LIBC +# ifndef strchr +# define strchr index +# endif +#endif + +#if defined HAVE_UNISTD_H || defined _LIBC +# include <unistd.h> +#endif + +#include "gettext.h" +#include "gettextP.h" +#ifdef _LIBC +# include <libintl.h> +#else +# include "libgettext.h" +#endif +#include "hash-string.h" + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define getcwd __getcwd +# ifndef stpcpy +# define stpcpy __stpcpy +# endif +#else +# if !defined HAVE_GETCWD +char *getwd (); +# define getcwd(buf, max) getwd (buf) +# else +char *getcwd (); +# endif +# ifndef HAVE_STPCPY +static char *stpcpy PARAMS ((char *dest, const char *src)); +# endif +#endif + +/* Amount to increase buffer size by in each try. */ +#define PATH_INCR 32 + +/* The following is from pathmax.h. */ +/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define + PATH_MAX but might cause redefinition warnings when sys/param.h is + later included (as on MORE/BSD 4.3). */ +#if defined(_POSIX_VERSION) || (defined(HAVE_LIMITS_H) && !defined(__GNUC__)) +# include <limits.h> +#endif + +#ifndef _POSIX_PATH_MAX +# define _POSIX_PATH_MAX 255 +#endif + +#if !defined(PATH_MAX) && defined(_PC_PATH_MAX) +# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX)) +#endif + +/* Don't include sys/param.h if it already has been. */ +#if defined(HAVE_SYS_PARAM_H) && !defined(PATH_MAX) && !defined(MAXPATHLEN) +# include <sys/param.h> +#endif + +#if !defined(PATH_MAX) && defined(MAXPATHLEN) +# define PATH_MAX MAXPATHLEN +#endif + +#ifndef PATH_MAX +# define PATH_MAX _POSIX_PATH_MAX +#endif + +/* XPG3 defines the result of `setlocale (category, NULL)' as: + ``Directs `setlocale()' to query `category' and return the current + setting of `local'.'' + However it does not specify the exact format. And even worse: POSIX + defines this not at all. So we can use this feature only on selected + system (e.g. those using GNU C Library). */ +#ifdef _LIBC +# define HAVE_LOCALE_NULL +#endif + +/* Name of the default domain used for gettext(3) prior any call to + textdomain(3). The default value for this is "messages". */ +const char _nl_default_default_domain[] = "messages"; + +/* Value used as the default domain for gettext(3). */ +const char *_nl_current_default_domain = _nl_default_default_domain; + +/* Contains the default location of the message catalogs. */ +const char _nl_default_dirname[] = GNULOCALEDIR; + +/* List with bindings of specific domains created by bindtextdomain() + calls. */ +struct binding *_nl_domain_bindings; + +/* Prototypes for local functions. */ +static char *find_msg PARAMS ((struct loaded_l10nfile *domain_file, + const char *msgid)) internal_function; +static const char *category_to_name PARAMS ((int category)) internal_function; +static const char *guess_category_value PARAMS ((int category, + const char *categoryname)) + internal_function; + + +/* For those loosing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +/* Nothing has to be done. */ +# define ADD_BLOCK(list, address) /* nothing */ +# define FREE_BLOCKS(list) /* nothing */ +#else +struct block_list +{ + void *address; + struct block_list *next; +}; +# define ADD_BLOCK(list, addr) \ + do { \ + struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ + /* If we cannot get a free block we cannot add the new element to \ + the list. */ \ + if (newp != NULL) { \ + newp->address = (addr); \ + newp->next = (list); \ + (list) = newp; \ + } \ + } while (0) +# define FREE_BLOCKS(list) \ + do { \ + while (list != NULL) { \ + struct block_list *old = list; \ + list = list->next; \ + free (old); \ + } \ + } while (0) +# undef alloca +# define alloca(size) (malloc (size)) +#endif /* have alloca */ + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DCGETTEXT __dcgettext +#else +# define DCGETTEXT dcgettext__ +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +char * +DCGETTEXT (domainname, msgid, category) + const char *domainname; + const char *msgid; + int category; +{ +#ifndef HAVE_ALLOCA + struct block_list *block_list = NULL; +#endif + struct loaded_l10nfile *domain; + struct binding *binding; + const char *categoryname; + const char *categoryvalue; + char *dirname, *xdomainname; + char *single_locale; + char *retval; + int saved_errno = errno; + + /* If no real MSGID is given return NULL. */ + if (msgid == NULL) + return NULL; + + /* If DOMAINNAME is NULL, we are interested in the default domain. If + CATEGORY is not LC_MESSAGES this might not make much sense but the + defintion left this undefined. */ + if (domainname == NULL) + domainname = _nl_current_default_domain; + + /* First find matching binding. */ + for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) + { + int compare = strcmp (domainname, binding->domainname); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It is not in the list. */ + binding = NULL; + break; + } + } + + if (binding == NULL) + dirname = (char *) _nl_default_dirname; + else if (binding->dirname[0] == '/') + dirname = binding->dirname; + else + { + /* We have a relative path. Make it absolute now. */ + size_t dirname_len = strlen (binding->dirname) + 1; + size_t path_max; + char *ret; + + path_max = (unsigned) PATH_MAX; + path_max += 2; /* The getcwd docs say to do this. */ + + dirname = (char *) alloca (path_max + dirname_len); + ADD_BLOCK (block_list, dirname); + + __set_errno (0); + while ((ret = getcwd (dirname, path_max)) == NULL && errno == ERANGE) + { + path_max += PATH_INCR; + dirname = (char *) alloca (path_max + dirname_len); + ADD_BLOCK (block_list, dirname); + __set_errno (0); + } + + if (ret == NULL) + { + /* We cannot get the current working directory. Don't signal an + error but simply return the default string. */ + FREE_BLOCKS (block_list); + __set_errno (saved_errno); + return (char *) msgid; + } + + stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname); + } + + /* Now determine the symbolic name of CATEGORY and its value. */ + categoryname = category_to_name (category); + categoryvalue = guess_category_value (category, categoryname); + + xdomainname = (char *) alloca (strlen (categoryname) + + strlen (domainname) + 5); + ADD_BLOCK (block_list, xdomainname); + + stpcpy (stpcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"), + domainname), + ".mo"); + + /* Creating working area. */ + single_locale = (char *) alloca (strlen (categoryvalue) + 1); + ADD_BLOCK (block_list, single_locale); + + + /* Search for the given string. This is a loop because we perhaps + got an ordered list of languages to consider for th translation. */ + while (1) + { + /* Make CATEGORYVALUE point to the next element of the list. */ + while (categoryvalue[0] != '\0' && categoryvalue[0] == ':') + ++categoryvalue; + if (categoryvalue[0] == '\0') + { + /* The whole contents of CATEGORYVALUE has been searched but + no valid entry has been found. We solve this situation + by implicitly appending a "C" entry, i.e. no translation + will take place. */ + single_locale[0] = 'C'; + single_locale[1] = '\0'; + } + else + { + char *cp = single_locale; + while (categoryvalue[0] != '\0' && categoryvalue[0] != ':') + *cp++ = *categoryvalue++; + *cp = '\0'; + } + + /* If the current locale value is C (or POSIX) we don't load a + domain. Return the MSGID. */ + if (strcmp (single_locale, "C") == 0 + || strcmp (single_locale, "POSIX") == 0) + { + FREE_BLOCKS (block_list); + __set_errno (saved_errno); + return (char *) msgid; + } + + + /* Find structure describing the message catalog matching the + DOMAINNAME and CATEGORY. */ + domain = _nl_find_domain (dirname, single_locale, xdomainname); + + if (domain != NULL) + { + retval = find_msg (domain, msgid); + + if (retval == NULL) + { + int cnt; + + for (cnt = 0; domain->successor[cnt] != NULL; ++cnt) + { + retval = find_msg (domain->successor[cnt], msgid); + + if (retval != NULL) + break; + } + } + + if (retval != NULL) + { + FREE_BLOCKS (block_list); + __set_errno (saved_errno); + return retval; + } + } + } + /* NOTREACHED */ +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dcgettext, dcgettext); +#endif + + +static char * +internal_function +find_msg (domain_file, msgid) + struct loaded_l10nfile *domain_file; + const char *msgid; +{ + size_t top, act, bottom; + struct loaded_domain *domain; + + if (domain_file->decided == 0) + _nl_load_domain (domain_file); + + if (domain_file->data == NULL) + return NULL; + + domain = (struct loaded_domain *) domain_file->data; + + /* Locate the MSGID and its translation. */ + if (domain->hash_size > 2 && domain->hash_tab != NULL) + { + /* Use the hashing table. */ + nls_uint32 len = strlen (msgid); + nls_uint32 hash_val = hash_string (msgid); + nls_uint32 idx = hash_val % domain->hash_size; + nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); + nls_uint32 nstr = W (domain->must_swap, domain->hash_tab[idx]); + + if (nstr == 0) + /* Hash table entry is empty. */ + return NULL; + + if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len + && strcmp (msgid, + domain->data + W (domain->must_swap, + domain->orig_tab[nstr - 1].offset)) == 0) + return (char *) domain->data + W (domain->must_swap, + domain->trans_tab[nstr - 1].offset); + + while (1) + { + if (idx >= domain->hash_size - incr) + idx -= domain->hash_size - incr; + else + idx += incr; + + nstr = W (domain->must_swap, domain->hash_tab[idx]); + if (nstr == 0) + /* Hash table entry is empty. */ + return NULL; + + if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len + && strcmp (msgid, + domain->data + W (domain->must_swap, + domain->orig_tab[nstr - 1].offset)) + == 0) + return (char *) domain->data + + W (domain->must_swap, domain->trans_tab[nstr - 1].offset); + } + /* NOTREACHED */ + } + + /* Now we try the default method: binary search in the sorted + array of messages. */ + bottom = 0; + top = domain->nstrings; + while (bottom < top) + { + int cmp_val; + + act = (bottom + top) / 2; + cmp_val = strcmp (msgid, domain->data + + W (domain->must_swap, + domain->orig_tab[act].offset)); + if (cmp_val < 0) + top = act; + else if (cmp_val > 0) + bottom = act + 1; + else + break; + } + + /* If an translation is found return this. */ + return bottom >= top ? NULL : (char *) domain->data + + W (domain->must_swap, + domain->trans_tab[act].offset); +} + + +/* Return string representation of locale CATEGORY. */ +static const char * +internal_function +category_to_name (category) + int category; +{ + const char *retval; + + switch (category) + { +#ifdef LC_COLLATE + case LC_COLLATE: + retval = "LC_COLLATE"; + break; +#endif +#ifdef LC_CTYPE + case LC_CTYPE: + retval = "LC_CTYPE"; + break; +#endif +#ifdef LC_MONETARY + case LC_MONETARY: + retval = "LC_MONETARY"; + break; +#endif +#ifdef LC_NUMERIC + case LC_NUMERIC: + retval = "LC_NUMERIC"; + break; +#endif +#ifdef LC_TIME + case LC_TIME: + retval = "LC_TIME"; + break; +#endif +#ifdef LC_MESSAGES + case LC_MESSAGES: + retval = "LC_MESSAGES"; + break; +#endif +#ifdef LC_RESPONSE + case LC_RESPONSE: + retval = "LC_RESPONSE"; + break; +#endif +#ifdef LC_ALL + case LC_ALL: + /* This might not make sense but is perhaps better than any other + value. */ + retval = "LC_ALL"; + break; +#endif + default: + /* If you have a better idea for a default value let me know. */ + retval = "LC_XXX"; + } + + return retval; +} + +/* Guess value of current locale from value of the environment variables. */ +static const char * +internal_function +guess_category_value (category, categoryname) + int category; + const char *categoryname; +{ + const char *retval; + + /* The highest priority value is the `LANGUAGE' environment + variable. This is a GNU extension. */ + retval = getenv ("LANGUAGE"); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* `LANGUAGE' is not set. So we have to proceed with the POSIX + methods of looking to `LC_ALL', `LC_xxx', and `LANG'. On some + systems this can be done by the `setlocale' function itself. */ +#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL + return setlocale (category, NULL); +#else + /* Setting of LC_ALL overwrites all other. */ + retval = getenv ("LC_ALL"); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* Next comes the name of the desired category. */ + retval = getenv (categoryname); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* Last possibility is the LANG environment variable. */ + retval = getenv ("LANG"); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* We use C as the default domain. POSIX says this is implementation + defined. */ + return "C"; +#endif +} + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (dest, src) + char *dest; + const char *src; +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif + + +#ifdef _LIBC +/* If we want to free all resources we have to do some work at + program's end. */ +static void __attribute__ ((unused)) +free_mem (void) +{ + struct binding *runp; + + for (runp = _nl_domain_bindings; runp != NULL; runp = runp->next) + { + free (runp->domainname); + if (runp->dirname != _nl_default_dirname) + /* Yes, this is a pointer comparison. */ + free (runp->dirname); + } + + if (_nl_current_default_domain != _nl_default_default_domain) + /* Yes, again a pointer comparison. */ + free ((char *) _nl_current_default_domain); +} + +text_set_element (__libc_subfreeres, free_mem); +#endif diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dgettext.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dgettext.c new file mode 100644 index 0000000000..0510c2b071 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/dgettext.c @@ -0,0 +1,59 @@ +/* Implementation of the dgettext(3) function + Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#if defined HAVE_LOCALE_H || defined _LIBC +# include <locale.h> +#endif + +#ifdef _LIBC +# include <libintl.h> +#else +# include "libgettext.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DGETTEXT __dgettext +# define DCGETTEXT __dcgettext +#else +# define DGETTEXT dgettext__ +# define DCGETTEXT dcgettext__ +#endif + +/* Look up MSGID in the DOMAINNAME message catalog of the current + LC_MESSAGES locale. */ +char * +DGETTEXT (domainname, msgid) + const char *domainname; + const char *msgid; +{ + return DCGETTEXT (domainname, msgid, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dgettext, dgettext); +#endif diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/explodename.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/explodename.c new file mode 100644 index 0000000000..8066dc2996 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/explodename.c @@ -0,0 +1,188 @@ +/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# include <string.h> +#else +# include <strings.h> +#endif +#include <sys/types.h> + +#include "loadinfo.h" + +/* On some strange systems still no definition of NULL is found. Sigh! */ +#ifndef NULL +# if defined __STDC__ && __STDC__ +# define NULL ((void *) 0) +# else +# define NULL 0 +# endif +#endif + +/* @@ end of prolog @@ */ + +int +_nl_explode_name (name, language, modifier, territory, codeset, + normalized_codeset, special, sponsor, revision) + char *name; + const char **language; + const char **modifier; + const char **territory; + const char **codeset; + const char **normalized_codeset; + const char **special; + const char **sponsor; + const char **revision; +{ + enum { undecided, xpg, cen } syntax; + char *cp; + int mask; + + *modifier = NULL; + *territory = NULL; + *codeset = NULL; + *normalized_codeset = NULL; + *special = NULL; + *sponsor = NULL; + *revision = NULL; + + /* Now we determine the single parts of the locale name. First + look for the language. Termination symbols are `_' and `@' if + we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ + mask = 0; + syntax = undecided; + *language = cp = name; + while (cp[0] != '\0' && cp[0] != '_' && cp[0] != '@' + && cp[0] != '+' && cp[0] != ',') + ++cp; + + if (*language == cp) + /* This does not make sense: language has to be specified. Use + this entry as it is without exploding. Perhaps it is an alias. */ + cp = strchr (*language, '\0'); + else if (cp[0] == '_') + { + /* Next is the territory. */ + cp[0] = '\0'; + *territory = ++cp; + + while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@' + && cp[0] != '+' && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= TERRITORY; + + if (cp[0] == '.') + { + /* Next is the codeset. */ + syntax = xpg; + cp[0] = '\0'; + *codeset = ++cp; + + while (cp[0] != '\0' && cp[0] != '@') + ++cp; + + mask |= XPG_CODESET; + + if (*codeset != cp && (*codeset)[0] != '\0') + { + *normalized_codeset = _nl_normalize_codeset (*codeset, + cp - *codeset); + if (strcmp (*codeset, *normalized_codeset) == 0) + free ((char *) *normalized_codeset); + else + mask |= XPG_NORM_CODESET; + } + } + } + + if (cp[0] == '@' || (syntax != xpg && cp[0] == '+')) + { + /* Next is the modifier. */ + syntax = cp[0] == '@' ? xpg : cen; + cp[0] = '\0'; + *modifier = ++cp; + + while (syntax == cen && cp[0] != '\0' && cp[0] != '+' + && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= XPG_MODIFIER | CEN_AUDIENCE; + } + + if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_')) + { + syntax = cen; + + if (cp[0] == '+') + { + /* Next is special application (CEN syntax). */ + cp[0] = '\0'; + *special = ++cp; + + while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= CEN_SPECIAL; + } + + if (cp[0] == ',') + { + /* Next is sponsor (CEN syntax). */ + cp[0] = '\0'; + *sponsor = ++cp; + + while (cp[0] != '\0' && cp[0] != '_') + ++cp; + + mask |= CEN_SPONSOR; + } + + if (cp[0] == '_') + { + /* Next is revision (CEN syntax). */ + cp[0] = '\0'; + *revision = ++cp; + + mask |= CEN_REVISION; + } + } + + /* For CEN syntax values it might be important to have the + separator character in the file name, not for XPG syntax. */ + if (syntax == xpg) + { + if (*territory != NULL && (*territory)[0] == '\0') + mask &= ~TERRITORY; + + if (*codeset != NULL && (*codeset)[0] == '\0') + mask &= ~XPG_CODESET; + + if (*modifier != NULL && (*modifier)[0] == '\0') + mask &= ~XPG_MODIFIER; + } + + return mask; +} diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/finddomain.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/finddomain.c new file mode 100644 index 0000000000..81ea29bf4e --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/finddomain.c @@ -0,0 +1,216 @@ +/* Handle list of needed message catalogs + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <ctype.h> +#include <errno.h> +#include <stdio.h> +#include <sys/types.h> + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#else +# ifdef HAVE_MALLOC_H +# include <malloc.h> +# else +void free (); +# endif +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# include <string.h> +#else +# include <strings.h> +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) +# endif +#endif +#if !HAVE_STRCHR && !defined _LIBC +# ifndef strchr +# define strchr index +# endif +#endif + +#if defined HAVE_UNISTD_H || defined _LIBC +# include <unistd.h> +#endif + +#include "gettext.h" +#include "gettextP.h" +#ifdef _LIBC +# include <libintl.h> +#else +# include "libgettext.h" +#endif + +/* @@ end of prolog @@ */ +/* List of already loaded domains. */ +static struct loaded_l10nfile *_nl_loaded_domains; + + +/* Return a data structure describing the message catalog described by + the DOMAINNAME and CATEGORY parameters with respect to the currently + established bindings. */ +struct loaded_l10nfile * +internal_function +_nl_find_domain (dirname, locale, domainname) + const char *dirname; + char *locale; + const char *domainname; +{ + struct loaded_l10nfile *retval; + const char *language; + const char *modifier; + const char *territory; + const char *codeset; + const char *normalized_codeset; + const char *special; + const char *sponsor; + const char *revision; + const char *alias_value; + int mask; + + /* LOCALE can consist of up to four recognized parts for the XPG syntax: + + language[_territory[.codeset]][@modifier] + + and six parts for the CEN syntax: + + language[_territory][+audience][+special][,[sponsor][_revision]] + + Beside the first part all of them are allowed to be missing. If + the full specified locale is not found, the less specific one are + looked for. The various parts will be stripped off according to + the following order: + (1) revision + (2) sponsor + (3) special + (4) codeset + (5) normalized codeset + (6) territory + (7) audience/modifier + */ + + /* If we have already tested for this locale entry there has to + be one data set in the list of loaded domains. */ + retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, + strlen (dirname) + 1, 0, locale, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, domainname, 0); + if (retval != NULL) + { + /* We know something about this locale. */ + int cnt; + + if (retval->decided == 0) + _nl_load_domain (retval); + + if (retval->data != NULL) + return retval; + + for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) + { + if (retval->successor[cnt]->decided == 0) + _nl_load_domain (retval->successor[cnt]); + + if (retval->successor[cnt]->data != NULL) + break; + } + return cnt >= 0 ? retval : NULL; + /* NOTREACHED */ + } + + /* See whether the locale value is an alias. If yes its value + *overwrites* the alias name. No test for the original value is + done. */ + alias_value = _nl_expand_alias (locale); + if (alias_value != NULL) + { +#if defined _LIBC || defined HAVE_STRDUP + locale = strdup (alias_value); + if (locale == NULL) + return NULL; +#else + size_t len = strlen (alias_value) + 1; + locale = (char *) malloc (len); + if (locale == NULL) + return NULL; + + memcpy (locale, alias_value, len); +#endif + } + + /* Now we determine the single parts of the locale name. First + look for the language. Termination symbols are `_' and `@' if + we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ + mask = _nl_explode_name (locale, &language, &modifier, &territory, + &codeset, &normalized_codeset, &special, + &sponsor, &revision); + + /* Create all possible locale entries which might be interested in + generalization. */ + retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, + strlen (dirname) + 1, mask, language, territory, + codeset, normalized_codeset, modifier, special, + sponsor, revision, domainname, 1); + if (retval == NULL) + /* This means we are out of core. */ + return NULL; + + if (retval->decided == 0) + _nl_load_domain (retval); + if (retval->data == NULL) + { + int cnt; + for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) + { + if (retval->successor[cnt]->decided == 0) + _nl_load_domain (retval->successor[cnt]); + if (retval->successor[cnt]->data != NULL) + break; + } + } + + /* The room for an alias was dynamically allocated. Free it now. */ + if (alias_value != NULL) + free (locale); + + return retval; +} + + +#ifdef _LIBC +static void __attribute__ ((unused)) +free_mem (void) +{ + struct loaded_l10nfile *runp = _nl_loaded_domains; + + while (runp != NULL) + { + struct loaded_l10nfile *here = runp; + if (runp->data != NULL) + _nl_unload_domain ((struct loaded_domain *) runp->data); + runp = runp->next; + free (here); + } +} + +text_set_element (__libc_subfreeres, free_mem); +#endif diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.c new file mode 100644 index 0000000000..d929f98d68 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.c @@ -0,0 +1,70 @@ +/* Implementation of gettext(3) function. + Copyright (C) 1995, 1997 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#ifdef _LIBC +# define __need_NULL +# include <stddef.h> +#else +# ifdef STDC_HEADERS +# include <stdlib.h> /* Just for NULL. */ +# else +# ifdef HAVE_STRING_H +# include <string.h> +# else +# define NULL ((void *) 0) +# endif +# endif +#endif + +#ifdef _LIBC +# include <libintl.h> +#else +# include "libgettext.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define GETTEXT __gettext +# define DGETTEXT __dgettext +#else +# define GETTEXT gettext__ +# define DGETTEXT dgettext__ +#endif + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +char * +GETTEXT (msgid) + const char *msgid; +{ + return DGETTEXT (NULL, msgid); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__gettext, gettext); +#endif diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.h b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.h new file mode 100644 index 0000000000..3cd23d7d6a --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettext.h @@ -0,0 +1,105 @@ +/* Internal header for GNU gettext internationalization functions. + Copyright (C) 1995, 1997 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _GETTEXT_H +#define _GETTEXT_H 1 + +#include <stdio.h> + +#if HAVE_LIMITS_H || _LIBC +# include <limits.h> +#endif + +/* @@ end of prolog @@ */ + +/* The magic number of the GNU message catalog format. */ +#define _MAGIC 0x950412de +#define _MAGIC_SWAPPED 0xde120495 + +/* Revision number of the currently used .mo (binary) file format. */ +#define MO_REVISION_NUMBER 0 + +/* The following contortions are an attempt to use the C preprocessor + to determine an unsigned integral type that is 32 bits wide. An + alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but + doing that would require that the configure script compile and *run* + the resulting executable. Locally running cross-compiled executables + is usually not possible. */ + +#if __STDC__ +# define UINT_MAX_32_BITS 4294967295U +#else +# define UINT_MAX_32_BITS 0xFFFFFFFF +#endif + +/* If UINT_MAX isn't defined, assume it's a 32-bit type. + This should be valid for all systems GNU cares about because + that doesn't include 16-bit systems, and only modern systems + (that certainly have <limits.h>) have 64+-bit integral types. */ + +#ifndef UINT_MAX +# define UINT_MAX UINT_MAX_32_BITS +#endif + +#if UINT_MAX == UINT_MAX_32_BITS +typedef unsigned nls_uint32; +#else +# if USHRT_MAX == UINT_MAX_32_BITS +typedef unsigned short nls_uint32; +# else +# if ULONG_MAX == UINT_MAX_32_BITS +typedef unsigned long nls_uint32; +# else + /* The following line is intended to throw an error. Using #error is + not portable enough. */ + "Cannot determine unsigned 32-bit data type." +# endif +# endif +#endif + + +/* Header for binary .mo file format. */ +struct mo_file_header +{ + /* The magic number. */ + nls_uint32 magic; + /* The revision number of the file format. */ + nls_uint32 revision; + /* The number of strings pairs. */ + nls_uint32 nstrings; + /* Offset of table with start offsets of original strings. */ + nls_uint32 orig_tab_offset; + /* Offset of table with start offsets of translation strings. */ + nls_uint32 trans_tab_offset; + /* Size of hashing table. */ + nls_uint32 hash_tab_size; + /* Offset of first hashing entry. */ + nls_uint32 hash_tab_offset; +}; + +struct string_desc +{ + /* Length of addressed string. */ + nls_uint32 length; + /* Offset of string in file. */ + nls_uint32 offset; +}; + +/* @@ begin of epilog @@ */ + +#endif /* gettext.h */ diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettextP.h b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettextP.h new file mode 100644 index 0000000000..00c5203197 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/gettextP.h @@ -0,0 +1,89 @@ +/* Header describing internals of gettext library + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _GETTEXTP_H +#define _GETTEXTP_H + +#include "loadinfo.h" + +/* @@ end of prolog @@ */ + +#ifndef PARAMS +# if __STDC__ +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +#ifndef internal_function +# define internal_function +#endif + +#ifndef W +# define W(flag, data) ((flag) ? SWAP (data) : (data)) +#endif + + +#ifdef _LIBC +# include <byteswap.h> +# define SWAP(i) bswap_32 (i) +#else +static nls_uint32 SWAP PARAMS ((nls_uint32 i)); + +static inline nls_uint32 +SWAP (i) + nls_uint32 i; +{ + return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24); +} +#endif + + +struct loaded_domain +{ + const char *data; + int use_mmap; + size_t mmap_size; + int must_swap; + nls_uint32 nstrings; + struct string_desc *orig_tab; + struct string_desc *trans_tab; + nls_uint32 hash_size; + nls_uint32 *hash_tab; +}; + +struct binding +{ + struct binding *next; + char *domainname; + char *dirname; +}; + +struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname, + char *__locale, + const char *__domainname)) + internal_function; +void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain)) + internal_function; +void _nl_unload_domain PARAMS ((struct loaded_domain *__domain)) + internal_function; + +/* @@ begin of epilog @@ */ + +#endif /* gettextP.h */ diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/hash-string.h b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/hash-string.h new file mode 100644 index 0000000000..cacb38e479 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/hash-string.h @@ -0,0 +1,59 @@ +/* Implements a string hashing function. + Copyright (C) 1995, 1997 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* @@ end of prolog @@ */ + +#ifndef PARAMS +# if __STDC__ +# define PARAMS(Args) Args +# else +# define PARAMS(Args) () +# endif +#endif + +/* We assume to have `unsigned long int' value with at least 32 bits. */ +#define HASHWORDBITS 32 + + +/* Defines the so called `hashpjw' function by P.J. Weinberger + [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools, + 1986, 1987 Bell Telephone Laboratories, Inc.] */ +static unsigned long hash_string PARAMS ((const char *__str_param)); + +static inline unsigned long +hash_string (str_param) + const char *str_param; +{ + unsigned long int hval, g; + const char *str = str_param; + + /* Compute the hash value for the given string. */ + hval = 0; + while (*str != '\0') + { + hval <<= 4; + hval += (unsigned long) *str++; + g = hval & ((unsigned long) 0xf << (HASHWORDBITS - 4)); + if (g != 0) + { + hval ^= g >> (HASHWORDBITS - 8); + hval ^= g; + } + } + return hval; +} diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/intl-compat.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/intl-compat.c new file mode 100644 index 0000000000..503efa0fa9 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/intl-compat.c @@ -0,0 +1,76 @@ +/* intl-compat.c - Stub functions to call gettext functions from GNU gettext + Library. + Copyright (C) 1995 Software Foundation, Inc. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "libgettext.h" + +/* @@ end of prolog @@ */ + + +#undef gettext +#undef dgettext +#undef dcgettext +#undef textdomain +#undef bindtextdomain + + +char * +bindtextdomain (domainname, dirname) + const char *domainname; + const char *dirname; +{ + return bindtextdomain__ (domainname, dirname); +} + + +char * +dcgettext (domainname, msgid, category) + const char *domainname; + const char *msgid; + int category; +{ + return dcgettext__ (domainname, msgid, category); +} + + +char * +dgettext (domainname, msgid) + const char *domainname; + const char *msgid; +{ + return dgettext__ (domainname, msgid); +} + + +char * +gettext (msgid) + const char *msgid; +{ + return gettext__ (msgid); +} + + +char * +textdomain (domainname) + const char *domainname; +{ + return textdomain__ (domainname); +} diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/l10nflist.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/l10nflist.c new file mode 100644 index 0000000000..9c7dc18360 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/l10nflist.c @@ -0,0 +1,411 @@ +/* Handle list of needed message catalogs + Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + + +#if defined HAVE_STRING_H || defined _LIBC +# ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +# endif +# include <string.h> +#else +# include <strings.h> +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) +# endif +#endif +#if !HAVE_STRCHR && !defined _LIBC +# ifndef strchr +# define strchr index +# endif +#endif + +#if defined _LIBC || defined HAVE_ARGZ_H +# include <argz.h> +#endif +#include <ctype.h> +#include <sys/types.h> + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#endif + +#include "loadinfo.h" + +/* On some strange systems still no definition of NULL is found. Sigh! */ +#ifndef NULL +# if defined __STDC__ && __STDC__ +# define NULL ((void *) 0) +# else +# define NULL 0 +# endif +#endif + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# ifndef stpcpy +# define stpcpy(dest, src) __stpcpy(dest, src) +# endif +#else +# ifndef HAVE_STPCPY +static char *stpcpy PARAMS ((char *dest, const char *src)); +# endif +#endif + +/* Define function which are usually not available. */ + +#if !defined _LIBC && !defined HAVE___ARGZ_COUNT +/* Returns the number of strings in ARGZ. */ +static size_t argz_count__ PARAMS ((const char *argz, size_t len)); + +static size_t +argz_count__ (argz, len) + const char *argz; + size_t len; +{ + size_t count = 0; + while (len > 0) + { + size_t part_len = strlen (argz); + argz += part_len + 1; + len -= part_len + 1; + count++; + } + return count; +} +# undef __argz_count +# define __argz_count(argz, len) argz_count__ (argz, len) +#endif /* !_LIBC && !HAVE___ARGZ_COUNT */ + +#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY +/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's + except the last into the character SEP. */ +static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep)); + +static void +argz_stringify__ (argz, len, sep) + char *argz; + size_t len; + int sep; +{ + while (len > 0) + { + size_t part_len = strlen (argz); + argz += part_len; + len -= part_len + 1; + if (len > 0) + *argz++ = sep; + } +} +# undef __argz_stringify +# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep) +#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */ + +#if !defined _LIBC && !defined HAVE___ARGZ_NEXT +static char *argz_next__ PARAMS ((char *argz, size_t argz_len, + const char *entry)); + +static char * +argz_next__ (argz, argz_len, entry) + char *argz; + size_t argz_len; + const char *entry; +{ + if (entry) + { + if (entry < argz + argz_len) + entry = strchr (entry, '\0') + 1; + + return entry >= argz + argz_len ? NULL : (char *) entry; + } + else + if (argz_len > 0) + return argz; + else + return 0; +} +# undef __argz_next +# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry) +#endif /* !_LIBC && !HAVE___ARGZ_NEXT */ + + +/* Return number of bits set in X. */ +static int pop PARAMS ((int x)); + +static inline int +pop (x) + int x; +{ + /* We assume that no more than 16 bits are used. */ + x = ((x & ~0x5555) >> 1) + (x & 0x5555); + x = ((x & ~0x3333) >> 2) + (x & 0x3333); + x = ((x >> 4) + x) & 0x0f0f; + x = ((x >> 8) + x) & 0xff; + + return x; +} + + +struct loaded_l10nfile * +_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language, + territory, codeset, normalized_codeset, modifier, special, + sponsor, revision, filename, do_allocate) + struct loaded_l10nfile **l10nfile_list; + const char *dirlist; + size_t dirlist_len; + int mask; + const char *language; + const char *territory; + const char *codeset; + const char *normalized_codeset; + const char *modifier; + const char *special; + const char *sponsor; + const char *revision; + const char *filename; + int do_allocate; +{ + char *abs_filename; + struct loaded_l10nfile *last = NULL; + struct loaded_l10nfile *retval; + char *cp; + size_t entries; + int cnt; + + /* Allocate room for the full file name. */ + abs_filename = (char *) malloc (dirlist_len + + strlen (language) + + ((mask & TERRITORY) != 0 + ? strlen (territory) + 1 : 0) + + ((mask & XPG_CODESET) != 0 + ? strlen (codeset) + 1 : 0) + + ((mask & XPG_NORM_CODESET) != 0 + ? strlen (normalized_codeset) + 1 : 0) + + (((mask & XPG_MODIFIER) != 0 + || (mask & CEN_AUDIENCE) != 0) + ? strlen (modifier) + 1 : 0) + + ((mask & CEN_SPECIAL) != 0 + ? strlen (special) + 1 : 0) + + (((mask & CEN_SPONSOR) != 0 + || (mask & CEN_REVISION) != 0) + ? (1 + ((mask & CEN_SPONSOR) != 0 + ? strlen (sponsor) + 1 : 0) + + ((mask & CEN_REVISION) != 0 + ? strlen (revision) + 1 : 0)) : 0) + + 1 + strlen (filename) + 1); + + if (abs_filename == NULL) + return NULL; + + retval = NULL; + last = NULL; + + /* Construct file name. */ + memcpy (abs_filename, dirlist, dirlist_len); + __argz_stringify (abs_filename, dirlist_len, ':'); + cp = abs_filename + (dirlist_len - 1); + *cp++ = '/'; + cp = stpcpy (cp, language); + + if ((mask & TERRITORY) != 0) + { + *cp++ = '_'; + cp = stpcpy (cp, territory); + } + if ((mask & XPG_CODESET) != 0) + { + *cp++ = '.'; + cp = stpcpy (cp, codeset); + } + if ((mask & XPG_NORM_CODESET) != 0) + { + *cp++ = '.'; + cp = stpcpy (cp, normalized_codeset); + } + if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0) + { + /* This component can be part of both syntaces but has different + leading characters. For CEN we use `+', else `@'. */ + *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@'; + cp = stpcpy (cp, modifier); + } + if ((mask & CEN_SPECIAL) != 0) + { + *cp++ = '+'; + cp = stpcpy (cp, special); + } + if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0) + { + *cp++ = ','; + if ((mask & CEN_SPONSOR) != 0) + cp = stpcpy (cp, sponsor); + if ((mask & CEN_REVISION) != 0) + { + *cp++ = '_'; + cp = stpcpy (cp, revision); + } + } + + *cp++ = '/'; + stpcpy (cp, filename); + + /* Look in list of already loaded domains whether it is already + available. */ + last = NULL; + for (retval = *l10nfile_list; retval != NULL; retval = retval->next) + if (retval->filename != NULL) + { + int compare = strcmp (retval->filename, abs_filename); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It's not in the list. */ + retval = NULL; + break; + } + + last = retval; + } + + if (retval != NULL || do_allocate == 0) + { + free (abs_filename); + return retval; + } + + retval = (struct loaded_l10nfile *) + malloc (sizeof (*retval) + (__argz_count (dirlist, dirlist_len) + * (1 << pop (mask)) + * sizeof (struct loaded_l10nfile *))); + if (retval == NULL) + return NULL; + + retval->filename = abs_filename; + retval->decided = (__argz_count (dirlist, dirlist_len) != 1 + || ((mask & XPG_CODESET) != 0 + && (mask & XPG_NORM_CODESET) != 0)); + retval->data = NULL; + + if (last == NULL) + { + retval->next = *l10nfile_list; + *l10nfile_list = retval; + } + else + { + retval->next = last->next; + last->next = retval; + } + + entries = 0; + /* If the DIRLIST is a real list the RETVAL entry corresponds not to + a real file. So we have to use the DIRLIST separation mechanism + of the inner loop. */ + cnt = __argz_count (dirlist, dirlist_len) == 1 ? mask - 1 : mask; + for (; cnt >= 0; --cnt) + if ((cnt & ~mask) == 0 + && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0) + && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0)) + { + /* Iterate over all elements of the DIRLIST. */ + char *dir = NULL; + + while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir)) + != NULL) + retval->successor[entries++] + = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt, + language, territory, codeset, + normalized_codeset, modifier, special, + sponsor, revision, filename, 1); + } + retval->successor[entries] = NULL; + + return retval; +} + +/* Normalize codeset name. There is no standard for the codeset + names. Normalization allows the user to use any of the common + names. */ +const char * +_nl_normalize_codeset (codeset, name_len) + const unsigned char *codeset; + size_t name_len; +{ + int len = 0; + int only_digit = 1; + char *retval; + char *wp; + size_t cnt; + + for (cnt = 0; cnt < name_len; ++cnt) + if (isalnum (codeset[cnt])) + { + ++len; + + if (isalpha (codeset[cnt])) + only_digit = 0; + } + + retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1); + + if (retval != NULL) + { + if (only_digit) + wp = stpcpy (retval, "iso"); + else + wp = retval; + + for (cnt = 0; cnt < name_len; ++cnt) + if (isalpha (codeset[cnt])) + *wp++ = tolower (codeset[cnt]); + else if (isdigit (codeset[cnt])) + *wp++ = codeset[cnt]; + + *wp = '\0'; + } + + return (const char *) retval; +} + + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (dest, src) + char *dest; + const char *src; +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/libgettext.h b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/libgettext.h new file mode 100644 index 0000000000..3a92960ae3 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/libgettext.h @@ -0,0 +1,182 @@ +/* Message catalogs for internationalization. + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Because on some systems (e.g. Solaris) we sometimes have to include + the systems libintl.h as well as this file we have more complex + include protection above. But the systems header might perhaps also + define _LIBINTL_H and therefore we have to protect the definition here. */ + +#if !defined _LIBINTL_H || !defined _LIBGETTEXT_H +#ifndef _LIBINTL_H +# define _LIBINTL_H 1 +#endif +#define _LIBGETTEXT_H 1 + +/* We define an additional symbol to signal that we use the GNU + implementation of gettext. */ +#define __USE_GNU_GETTEXT 1 + +#include <sys/types.h> + +#if HAVE_LOCALE_H +# include <locale.h> +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +/* @@ end of prolog @@ */ + +#ifndef PARAMS +# if __STDC__ || defined __cplusplus +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +#ifndef NULL +# if !defined __cplusplus || defined __GNUC__ +# define NULL ((void *) 0) +# else +# define NULL (0) +# endif +#endif + +#if !HAVE_LC_MESSAGES +/* This value determines the behaviour of the gettext() and dgettext() + function. But some system does not have this defined. Define it + to a default value. */ +# define LC_MESSAGES (-1) +#endif + + +/* Declarations for gettext-using-catgets interface. Derived from + Jim Meyering's libintl.h. */ +struct _msg_ent +{ + const char *_msg; + int _msg_number; +}; + + +#if HAVE_CATGETS +/* These two variables are defined in the automatically by po-to-tbl.sed + generated file `cat-id-tbl.c'. */ +extern const struct _msg_ent _msg_tbl[]; +extern int _msg_tbl_length; +#endif + + +/* For automatical extraction of messages sometimes no real + translation is needed. Instead the string itself is the result. */ +#define gettext_noop(Str) (Str) + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +extern char *gettext PARAMS ((const char *__msgid)); +extern char *gettext__ PARAMS ((const char *__msgid)); + +/* Look up MSGID in the DOMAINNAME message catalog for the current + LC_MESSAGES locale. */ +extern char *dgettext PARAMS ((const char *__domainname, const char *__msgid)); +extern char *dgettext__ PARAMS ((const char *__domainname, + const char *__msgid)); + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +extern char *dcgettext PARAMS ((const char *__domainname, const char *__msgid, + int __category)); +extern char *dcgettext__ PARAMS ((const char *__domainname, + const char *__msgid, int __category)); + + +/* Set the current default message catalog to DOMAINNAME. + If DOMAINNAME is null, return the current default. + If DOMAINNAME is "", reset to the default of "messages". */ +extern char *textdomain PARAMS ((const char *__domainname)); +extern char *textdomain__ PARAMS ((const char *__domainname)); + +/* Specify that the DOMAINNAME message catalog will be found + in DIRNAME rather than in the system locale data base. */ +extern char *bindtextdomain PARAMS ((const char *__domainname, + const char *__dirname)); +extern char *bindtextdomain__ PARAMS ((const char *__domainname, + const char *__dirname)); + +#if ENABLE_NLS + +/* Solaris 2.3 has the gettext function but dcgettext is missing. + So we omit this optimization for Solaris 2.3. BTW, Solaris 2.4 + has dcgettext. */ +# if !HAVE_CATGETS && (!HAVE_GETTEXT || HAVE_DCGETTEXT) + +# define gettext(Msgid) \ + dgettext (NULL, Msgid) + +# define dgettext(Domainname, Msgid) \ + dcgettext (Domainname, Msgid, LC_MESSAGES) + +# if defined __GNUC__ && __GNUC__ == 2 && __GNUC_MINOR__ >= 7 +/* This global variable is defined in loadmsgcat.c. We need a sign, + whether a new catalog was loaded, which can be associated with all + translations. */ +extern int _nl_msg_cat_cntr; + +# define dcgettext(Domainname, Msgid, Category) \ + (__extension__ \ + ({ \ + char *__result; \ + if (__builtin_constant_p (Msgid)) \ + { \ + static char *__translation__; \ + static int __catalog_counter__; \ + if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr) \ + { \ + __translation__ = \ + dcgettext__ (Domainname, Msgid, Category); \ + __catalog_counter__ = _nl_msg_cat_cntr; \ + } \ + __result = __translation__; \ + } \ + else \ + __result = dcgettext__ (Domainname, Msgid, Category); \ + __result; \ + })) +# endif +# endif + +#else + +# define gettext(Msgid) (Msgid) +# define dgettext(Domainname, Msgid) (Msgid) +# define dcgettext(Domainname, Msgid, Category) (Msgid) +# define textdomain(Domainname) ((char *) Domainname) +# define bindtextdomain(Domainname, Dirname) ((char *) Dirname) + +#endif + +/* @@ begin of epilog @@ */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/linux-msg.sed b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/linux-msg.sed new file mode 100644 index 0000000000..5918e720a9 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/linux-msg.sed @@ -0,0 +1,100 @@ +# po2msg.sed - Convert Uniforum style .po file to Linux style .msg file +# Copyright (C) 1995 Free Software Foundation, Inc. +# Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# +# The first directive in the .msg should be the definition of the +# message set number. We use always set number 1. +# +1 { + i\ +$set 1 # Automatically created by po2msg.sed + h + s/.*/0/ + x +} +# +# Mitch's old catalog format does not allow comments. +# +# We copy the original message as a comment into the .msg file. +# +/^msgid/ { + s/msgid[ ]*"// +# +# This does not work now with the new format. +# /"$/! { +# s/\\$// +# s/$/ ... (more lines following)"/ +# } + x +# The following nice solution is by +# Bruno <Haible@ma2s2.mathematik.uni-karlsruhe.de> + td +# Increment a decimal number in pattern space. +# First hide trailing `9' digits. + :d + s/9\(_*\)$/_\1/ + td +# Assure at least one digit is available. + s/^\(_*\)$/0\1/ +# Increment the last digit. + s/8\(_*\)$/9\1/ + s/7\(_*\)$/8\1/ + s/6\(_*\)$/7\1/ + s/5\(_*\)$/6\1/ + s/4\(_*\)$/5\1/ + s/3\(_*\)$/4\1/ + s/2\(_*\)$/3\1/ + s/1\(_*\)$/2\1/ + s/0\(_*\)$/1\1/ +# Convert the hidden `9' digits to `0's. + s/_/0/g + x + G + s/\(.*\)"\n\([0-9]*\)/$ #\2 Original Message:(\1)/p +} +# +# The .msg file contains, other then the .po file, only the translations +# but each given a unique ID. Starting from 1 and incrementing by 1 for +# each message we assign them to the messages. +# It is important that the .po file used to generate the cat-id-tbl.c file +# (with po-to-tbl) is the same as the one used here. (At least the order +# of declarations must not be changed.) +# +/^msgstr/ { + s/msgstr[ ]*"\(.*\)"/# \1/ +# Clear substitution flag. + tb +# Append the next line. + :b + N +# Look whether second part is continuation line. + s/\(.*\n\)"\(.*\)"/\1\2/ +# Yes, then branch. + ta + P + D +# Note that D includes a jump to the start!! +# We found a continuation line. But before printing insert '\'. + :a + s/\(.*\)\(\n.*\)/\1\\\2/ + P +# We cannot use D here. + s/.*\n\(.*\)/\1/ + tb +} +d diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadinfo.h b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadinfo.h new file mode 100644 index 0000000000..f4ebf6d811 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadinfo.h @@ -0,0 +1,76 @@ +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef PARAMS +# if __STDC__ +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +/* Encoding of locale name parts. */ +#define CEN_REVISION 1 +#define CEN_SPONSOR 2 +#define CEN_SPECIAL 4 +#define XPG_NORM_CODESET 8 +#define XPG_CODESET 16 +#define TERRITORY 32 +#define CEN_AUDIENCE 64 +#define XPG_MODIFIER 128 + +#define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE) +#define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER) + + +struct loaded_l10nfile +{ + const char *filename; + int decided; + + const void *data; + + struct loaded_l10nfile *next; + struct loaded_l10nfile *successor[1]; +}; + + +extern const char *_nl_normalize_codeset PARAMS ((const unsigned char *codeset, + size_t name_len)); + +extern struct loaded_l10nfile * +_nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list, + const char *dirlist, size_t dirlist_len, int mask, + const char *language, const char *territory, + const char *codeset, + const char *normalized_codeset, + const char *modifier, const char *special, + const char *sponsor, const char *revision, + const char *filename, int do_allocate)); + + +extern const char *_nl_expand_alias PARAMS ((const char *name)); + +extern int _nl_explode_name PARAMS ((char *name, const char **language, + const char **modifier, + const char **territory, + const char **codeset, + const char **normalized_codeset, + const char **special, + const char **sponsor, + const char **revision)); diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadmsgcat.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadmsgcat.c new file mode 100644 index 0000000000..515892dfb8 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/loadmsgcat.c @@ -0,0 +1,222 @@ +/* Load needed message catalogs. + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#endif + +#if defined HAVE_UNISTD_H || defined _LIBC +# include <unistd.h> +#endif + +#if (defined HAVE_MMAP && defined HAVE_MUNMAP) || defined _LIBC +# include <sys/mman.h> +#endif + +#include "gettext.h" +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ISO C functions. This is required by the standard + because some ISO C functions will require linking with this object + file and the name space must not be polluted. */ +# define open __open +# define close __close +# define read __read +# define mmap __mmap +# define munmap __munmap +#endif + +/* We need a sign, whether a new catalog was loaded, which can be associated + with all translations. This is important if the translations are + cached by one of GCC's features. */ +int _nl_msg_cat_cntr = 0; + + +/* Load the message catalogs specified by FILENAME. If it is no valid + message catalog do nothing. */ +void +internal_function +_nl_load_domain (domain_file) + struct loaded_l10nfile *domain_file; +{ + int fd; + size_t size; + struct stat st; + struct mo_file_header *data = (struct mo_file_header *) -1; +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + int use_mmap = 0; +#endif + struct loaded_domain *domain; + + domain_file->decided = 1; + domain_file->data = NULL; + + /* If the record does not represent a valid locale the FILENAME + might be NULL. This can happen when according to the given + specification the locale file name is different for XPG and CEN + syntax. */ + if (domain_file->filename == NULL) + return; + + /* Try to open the addressed file. */ + fd = open (domain_file->filename, O_RDONLY); + if (fd == -1) + return; + + /* We must know about the size of the file. */ + if (fstat (fd, &st) != 0 + || (size = (size_t) st.st_size) != st.st_size + || size < sizeof (struct mo_file_header)) + { + /* Something went wrong. */ + close (fd); + return; + } + +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + /* Now we are ready to load the file. If mmap() is available we try + this first. If not available or it failed we try to load it. */ + data = (struct mo_file_header *) mmap (NULL, size, PROT_READ, + MAP_PRIVATE, fd, 0); + + if (data != (struct mo_file_header *) -1) + { + /* mmap() call was successful. */ + close (fd); + use_mmap = 1; + } +#endif + + /* If the data is not yet available (i.e. mmap'ed) we try to load + it manually. */ + if (data == (struct mo_file_header *) -1) + { + size_t to_read; + char *read_ptr; + + data = (struct mo_file_header *) malloc (size); + if (data == NULL) + return; + + to_read = size; + read_ptr = (char *) data; + do + { + long int nb = (long int) read (fd, read_ptr, to_read); + if (nb == -1) + { + close (fd); + return; + } + + read_ptr += nb; + to_read -= nb; + } + while (to_read > 0); + + close (fd); + } + + /* Using the magic number we can test whether it really is a message + catalog file. */ + if (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED) + { + /* The magic number is wrong: not a message catalog file. */ +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + if (use_mmap) + munmap ((caddr_t) data, size); + else +#endif + free (data); + return; + } + + domain_file->data + = (struct loaded_domain *) malloc (sizeof (struct loaded_domain)); + if (domain_file->data == NULL) + return; + + domain = (struct loaded_domain *) domain_file->data; + domain->data = (char *) data; +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + domain->use_mmap = use_mmap; +#endif + domain->mmap_size = size; + domain->must_swap = data->magic != _MAGIC; + + /* Fill in the information about the available tables. */ + switch (W (domain->must_swap, data->revision)) + { + case 0: + domain->nstrings = W (domain->must_swap, data->nstrings); + domain->orig_tab = (struct string_desc *) + ((char *) data + W (domain->must_swap, data->orig_tab_offset)); + domain->trans_tab = (struct string_desc *) + ((char *) data + W (domain->must_swap, data->trans_tab_offset)); + domain->hash_size = W (domain->must_swap, data->hash_tab_size); + domain->hash_tab = (nls_uint32 *) + ((char *) data + W (domain->must_swap, data->hash_tab_offset)); + break; + default: + /* This is an illegal revision. */ +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + if (use_mmap) + munmap ((caddr_t) data, size); + else +#endif + free (data); + free (domain); + domain_file->data = NULL; + return; + } + + /* Show that one domain is changed. This might make some cached + translations invalid. */ + ++_nl_msg_cat_cntr; +} + + +#ifdef _LIBC +void +internal_function +_nl_unload_domain (domain) + struct loaded_domain *domain; +{ + if (domain->use_mmap) + munmap ((caddr_t) domain->data, domain->mmap_size); + else + free ((void *) domain->data); + + free (domain); +} +#endif diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/localealias.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/localealias.c new file mode 100644 index 0000000000..bca555a610 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/localealias.c @@ -0,0 +1,424 @@ +/* Handle aliases for locale names. + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <ctype.h> +#include <stdio.h> +#include <sys/types.h> + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include <alloca.h> +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#else +char *getenv (); +# ifdef HAVE_MALLOC_H +# include <malloc.h> +# else +void free (); +# endif +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +# endif +# include <string.h> +#else +# include <strings.h> +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) +# endif +#endif +#if !HAVE_STRCHR && !defined _LIBC +# ifndef strchr +# define strchr index +# endif +#endif + +#include "gettext.h" +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define strcasecmp __strcasecmp + +# define mempcpy __mempcpy +# define HAVE_MEMPCPY 1 + +/* We need locking here since we can be called from different places. */ +# include <bits/libc-lock.h> + +__libc_lock_define_initialized (static, lock); +#endif + + +/* For those loosing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +/* Nothing has to be done. */ +# define ADD_BLOCK(list, address) /* nothing */ +# define FREE_BLOCKS(list) /* nothing */ +#else +struct block_list +{ + void *address; + struct block_list *next; +}; +# define ADD_BLOCK(list, addr) \ + do { \ + struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ + /* If we cannot get a free block we cannot add the new element to \ + the list. */ \ + if (newp != NULL) { \ + newp->address = (addr); \ + newp->next = (list); \ + (list) = newp; \ + } \ + } while (0) +# define FREE_BLOCKS(list) \ + do { \ + while (list != NULL) { \ + struct block_list *old = list; \ + list = list->next; \ + free (old); \ + } \ + } while (0) +# undef alloca +# define alloca(size) (malloc (size)) +#endif /* have alloca */ + + +struct alias_map +{ + const char *alias; + const char *value; +}; + + +static char *string_space = NULL; +static size_t string_space_act = 0; +static size_t string_space_max = 0; +static struct alias_map *map; +static size_t nmap = 0; +static size_t maxmap = 0; + + +/* Prototypes for local functions. */ +static size_t read_alias_file PARAMS ((const char *fname, int fname_len)) + internal_function; +static void extend_alias_table PARAMS ((void)); +static int alias_compare PARAMS ((const struct alias_map *map1, + const struct alias_map *map2)); + + +const char * +_nl_expand_alias (name) + const char *name; +{ + static const char *locale_alias_path = LOCALE_ALIAS_PATH; + struct alias_map *retval; + const char *result = NULL; + size_t added; + +#ifdef _LIBC + __libc_lock_lock (lock); +#endif + + do + { + struct alias_map item; + + item.alias = name; + + if (nmap > 0) + retval = (struct alias_map *) bsearch (&item, map, nmap, + sizeof (struct alias_map), + (int (*) PARAMS ((const void *, + const void *)) + ) alias_compare); + else + retval = NULL; + + /* We really found an alias. Return the value. */ + if (retval != NULL) + { + result = retval->value; + break; + } + + /* Perhaps we can find another alias file. */ + added = 0; + while (added == 0 && locale_alias_path[0] != '\0') + { + const char *start; + + while (locale_alias_path[0] == ':') + ++locale_alias_path; + start = locale_alias_path; + + while (locale_alias_path[0] != '\0' && locale_alias_path[0] != ':') + ++locale_alias_path; + + if (start < locale_alias_path) + added = read_alias_file (start, locale_alias_path - start); + } + } + while (added != 0); + +#ifdef _LIBC + __libc_lock_unlock (lock); +#endif + + return result; +} + + +static size_t +internal_function +read_alias_file (fname, fname_len) + const char *fname; + int fname_len; +{ +#ifndef HAVE_ALLOCA + struct block_list *block_list = NULL; +#endif + FILE *fp; + char *full_fname; + size_t added; + static const char aliasfile[] = "/locale.alias"; + + full_fname = (char *) alloca (fname_len + sizeof aliasfile); + ADD_BLOCK (block_list, full_fname); +#ifdef HAVE_MEMPCPY + mempcpy (mempcpy (full_fname, fname, fname_len), + aliasfile, sizeof aliasfile); +#else + memcpy (full_fname, fname, fname_len); + memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile); +#endif + + fp = fopen (full_fname, "r"); + if (fp == NULL) + { + FREE_BLOCKS (block_list); + return 0; + } + + added = 0; + while (!feof (fp)) + { + /* It is a reasonable approach to use a fix buffer here because + a) we are only interested in the first two fields + b) these fields must be usable as file names and so must not + be that long + */ + unsigned char buf[BUFSIZ]; + unsigned char *alias; + unsigned char *value; + unsigned char *cp; + + if (fgets (buf, sizeof buf, fp) == NULL) + /* EOF reached. */ + break; + + /* Possibly not the whole line fits into the buffer. Ignore + the rest of the line. */ + if (strchr (buf, '\n') == NULL) + { + char altbuf[BUFSIZ]; + do + if (fgets (altbuf, sizeof altbuf, fp) == NULL) + /* Make sure the inner loop will be left. The outer loop + will exit at the `feof' test. */ + break; + while (strchr (altbuf, '\n') == NULL); + } + + cp = buf; + /* Ignore leading white space. */ + while (isspace (cp[0])) + ++cp; + + /* A leading '#' signals a comment line. */ + if (cp[0] != '\0' && cp[0] != '#') + { + alias = cp++; + while (cp[0] != '\0' && !isspace (cp[0])) + ++cp; + /* Terminate alias name. */ + if (cp[0] != '\0') + *cp++ = '\0'; + + /* Now look for the beginning of the value. */ + while (isspace (cp[0])) + ++cp; + + if (cp[0] != '\0') + { + size_t alias_len; + size_t value_len; + + value = cp++; + while (cp[0] != '\0' && !isspace (cp[0])) + ++cp; + /* Terminate value. */ + if (cp[0] == '\n') + { + /* This has to be done to make the following test + for the end of line possible. We are looking for + the terminating '\n' which do not overwrite here. */ + *cp++ = '\0'; + *cp = '\n'; + } + else if (cp[0] != '\0') + *cp++ = '\0'; + + if (nmap >= maxmap) + extend_alias_table (); + + alias_len = strlen (alias) + 1; + value_len = strlen (value) + 1; + + if (string_space_act + alias_len + value_len > string_space_max) + { + /* Increase size of memory pool. */ + size_t new_size = (string_space_max + + (alias_len + value_len > 1024 + ? alias_len + value_len : 1024)); + char *new_pool = (char *) realloc (string_space, new_size); + if (new_pool == NULL) + { + FREE_BLOCKS (block_list); + return added; + } + string_space = new_pool; + string_space_max = new_size; + } + + map[nmap].alias = memcpy (&string_space[string_space_act], + alias, alias_len); + string_space_act += alias_len; + + map[nmap].value = memcpy (&string_space[string_space_act], + value, value_len); + string_space_act += value_len; + + ++nmap; + ++added; + } + } + } + + /* Should we test for ferror()? I think we have to silently ignore + errors. --drepper */ + fclose (fp); + + if (added > 0) + qsort (map, nmap, sizeof (struct alias_map), + (int (*) PARAMS ((const void *, const void *))) alias_compare); + + FREE_BLOCKS (block_list); + return added; +} + + +static void +extend_alias_table () +{ + size_t new_size; + struct alias_map *new_map; + + new_size = maxmap == 0 ? 100 : 2 * maxmap; + new_map = (struct alias_map *) realloc (map, (new_size + * sizeof (struct alias_map))); + if (new_map == NULL) + /* Simply don't extend: we don't have any more core. */ + return; + + map = new_map; + maxmap = new_size; +} + + +#ifdef _LIBC +static void __attribute__ ((unused)) +free_mem (void) +{ + if (string_space != NULL) + free (string_space); + if (map != NULL) + free (map); +} +text_set_element (__libc_subfreeres, free_mem); +#endif + + +static int +alias_compare (map1, map2) + const struct alias_map *map1; + const struct alias_map *map2; +{ +#if defined _LIBC || defined HAVE_STRCASECMP + return strcasecmp (map1->alias, map2->alias); +#else + const unsigned char *p1 = (const unsigned char *) map1->alias; + const unsigned char *p2 = (const unsigned char *) map2->alias; + unsigned char c1, c2; + + if (p1 == p2) + return 0; + + do + { + /* I know this seems to be odd but the tolower() function in + some systems libc cannot handle nonalpha characters. */ + c1 = isupper (*p1) ? tolower (*p1) : *p1; + c2 = isupper (*p2) ? tolower (*p2) : *p2; + if (c1 == '\0') + break; + ++p1; + ++p2; + } + while (c1 == c2); + + return c1 - c2; +#endif +} diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/po2tbl.sed.in b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/po2tbl.sed.in new file mode 100644 index 0000000000..b3bcca4d73 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/po2tbl.sed.in @@ -0,0 +1,102 @@ +# po2tbl.sed - Convert Uniforum style .po file to lookup table for catgets +# Copyright (C) 1995 Free Software Foundation, Inc. +# Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +1 { + i\ +/* Automatically generated by po2tbl.sed from @PACKAGE NAME@.pot. */\ +\ +#if HAVE_CONFIG_H\ +# include <config.h>\ +#endif\ +\ +#include "libgettext.h"\ +\ +const struct _msg_ent _msg_tbl[] = { + h + s/.*/0/ + x +} +# +# Write msgid entries in C array form. +# +/^msgid/ { + s/msgid[ ]*\(".*"\)/ {\1/ + tb +# Append the next line + :b + N +# Look whether second part is continuation line. + s/\(.*\)"\(\n\)"\(.*"\)/\1\2\3/ +# Yes, then branch. + ta +# Because we assume that the input file correctly formed the line +# just read cannot be again be a msgid line. So it's safe to ignore +# it. + s/\(.*\)\n.*/\1/ + bc +# We found a continuation line. But before printing insert '\'. + :a + s/\(.*\)\(\n.*\)/\1\\\2/ + P +# We cannot use D here. + s/.*\n\(.*\)/\1/ +# Some buggy seds do not clear the `successful substitution since last ``t''' +# flag on `N', so we do a `t' here to clear it. + tb +# Not reached + :c + x +# The following nice solution is by +# Bruno <Haible@ma2s2.mathematik.uni-karlsruhe.de> + td +# Increment a decimal number in pattern space. +# First hide trailing `9' digits. + :d + s/9\(_*\)$/_\1/ + td +# Assure at least one digit is available. + s/^\(_*\)$/0\1/ +# Increment the last digit. + s/8\(_*\)$/9\1/ + s/7\(_*\)$/8\1/ + s/6\(_*\)$/7\1/ + s/5\(_*\)$/6\1/ + s/4\(_*\)$/5\1/ + s/3\(_*\)$/4\1/ + s/2\(_*\)$/3\1/ + s/1\(_*\)$/2\1/ + s/0\(_*\)$/1\1/ +# Convert the hidden `9' digits to `0's. + s/_/0/g + x + G + s/\(.*\)\n\([0-9]*\)/\1, \2},/ + s/\(.*\)"$/\1/ + p +} +# +# Last line. +# +$ { + i\ +};\ + + g + s/0*\(.*\)/int _msg_tbl_length = \1;/p +} +d diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/textdomain.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/textdomain.c new file mode 100644 index 0000000000..88557460f3 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/textdomain.c @@ -0,0 +1,108 @@ +/* Implementation of the textdomain(3) function. + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#endif + +#if defined STDC_HEADERS || defined HAVE_STRING_H || defined _LIBC +# include <string.h> +#else +# include <strings.h> +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) +# endif +#endif + +#ifdef _LIBC +# include <libintl.h> +#else +# include "libgettext.h" +#endif + +/* @@ end of prolog @@ */ + +/* Name of the default text domain. */ +extern const char _nl_default_default_domain[]; + +/* Default text domain in which entries for gettext(3) are to be found. */ +extern const char *_nl_current_default_domain; + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define TEXTDOMAIN __textdomain +# ifndef strdup +# define strdup(str) __strdup (str) +# endif +#else +# define TEXTDOMAIN textdomain__ +#endif + +/* Set the current default message catalog to DOMAINNAME. + If DOMAINNAME is null, return the current default. + If DOMAINNAME is "", reset to the default of "messages". */ +char * +TEXTDOMAIN (domainname) + const char *domainname; +{ + char *old; + + /* A NULL pointer requests the current setting. */ + if (domainname == NULL) + return (char *) _nl_current_default_domain; + + old = (char *) _nl_current_default_domain; + + /* If domain name is the null string set to default domain "messages". */ + if (domainname[0] == '\0' + || strcmp (domainname, _nl_default_default_domain) == 0) + _nl_current_default_domain = _nl_default_default_domain; + else + { + /* If the following malloc fails `_nl_current_default_domain' + will be NULL. This value will be returned and so signals we + are out of core. */ +#if defined _LIBC || defined HAVE_STRDUP + _nl_current_default_domain = strdup (domainname); +#else + size_t len = strlen (domainname) + 1; + char *cp = (char *) malloc (len); + if (cp != NULL) + memcpy (cp, domainname, len); + _nl_current_default_domain = cp; +#endif + } + + if (old != _nl_default_default_domain) + free (old); + + return (char *) _nl_current_default_domain; +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__textdomain, textdomain); +#endif diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/xopen-msg.sed b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/xopen-msg.sed new file mode 100644 index 0000000000..b19c0bbd0e --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/intl/xopen-msg.sed @@ -0,0 +1,104 @@ +# po2msg.sed - Convert Uniforum style .po file to X/Open style .msg file +# Copyright (C) 1995 Free Software Foundation, Inc. +# Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# +# The first directive in the .msg should be the definition of the +# message set number. We use always set number 1. +# +1 { + i\ +$set 1 # Automatically created by po2msg.sed + h + s/.*/0/ + x +} +# +# We copy all comments into the .msg file. Perhaps they can help. +# +/^#/ s/^#[ ]*/$ /p +# +# We copy the original message as a comment into the .msg file. +# +/^msgid/ { +# Does not work now +# /"$/! { +# s/\\$// +# s/$/ ... (more lines following)"/ +# } + s/^msgid[ ]*"\(.*\)"$/$ Original Message: \1/ + p +} +# +# The .msg file contains, other then the .po file, only the translations +# but each given a unique ID. Starting from 1 and incrementing by 1 for +# each message we assign them to the messages. +# It is important that the .po file used to generate the cat-id-tbl.c file +# (with po-to-tbl) is the same as the one used here. (At least the order +# of declarations must not be changed.) +# +/^msgstr/ { + s/msgstr[ ]*"\(.*\)"/\1/ + x +# The following nice solution is by +# Bruno <Haible@ma2s2.mathematik.uni-karlsruhe.de> + td +# Increment a decimal number in pattern space. +# First hide trailing `9' digits. + :d + s/9\(_*\)$/_\1/ + td +# Assure at least one digit is available. + s/^\(_*\)$/0\1/ +# Increment the last digit. + s/8\(_*\)$/9\1/ + s/7\(_*\)$/8\1/ + s/6\(_*\)$/7\1/ + s/5\(_*\)$/6\1/ + s/4\(_*\)$/5\1/ + s/3\(_*\)$/4\1/ + s/2\(_*\)$/3\1/ + s/1\(_*\)$/2\1/ + s/0\(_*\)$/1\1/ +# Convert the hidden `9' digits to `0's. + s/_/0/g + x +# Bring the line in the format `<number> <message>' + G + s/^[^\n]*$/& / + s/\(.*\)\n\([0-9]*\)/\2 \1/ +# Clear flag from last substitution. + tb +# Append the next line. + :b + N +# Look whether second part is a continuation line. + s/\(.*\n\)"\(.*\)"/\1\2/ +# Yes, then branch. + ta + P + D +# Note that `D' includes a jump to the start!! +# We found a continuation line. But before printing insert '\'. + :a + s/\(.*\)\(\n.*\)/\1\\\2/ + P +# We cannot use the sed command `D' here + s/.*\n\(.*\)/\1/ + tb +} +d diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/missing b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/missing new file mode 100755 index 0000000000..dd583709f5 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/missing @@ -0,0 +1,336 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. +# Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +case "$1" in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case "$1" in + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch]" + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing 0.4 - GNU automake" + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + + aclocal*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case "$f" in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. + You can get \`$1Help2man' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` + test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` + fi + if [ -f "$file" ]; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then + # We have makeinfo, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi + touch $file + ;; + + tar) + shift + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + fi + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar ${1+"$@"} && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar ${1+"$@"} && exit 0 + fi + firstarg="$1" + if shift; then + case "$firstarg" in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" ${1+"$@"} && exit 0 + ;; + esac + case "$firstarg" in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" ${1+"$@"} && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequirements for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/mkinstalldirs b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/mkinstalldirs new file mode 100755 index 0000000000..a120c392de --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/mkinstalldirs @@ -0,0 +1,101 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman <friedman@prep.ai.mit.edu> +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs,v 1.1.1.1 2004/12/10 13:59:00 jchoelt Exp $ + +errstatus=0 +dirmode="" + +usage="\ +Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." + +# process command line arguments +while test $# -gt 0 ; do + case "${1}" in + -h | --help | --h* ) # -h for help + echo "${usage}" 1>&2; exit 0 ;; + -m ) # -m PERM arg + shift + test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; } + dirmode="${1}" + shift ;; + -- ) shift; break ;; # stop option processing + -* ) echo "${usage}" 1>&2; exit 1 ;; # unknown option + * ) break ;; # first non-opt arg + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in +0) exit 0 ;; +esac + +case $dirmode in +'') + if mkdir -p -- . 2>/dev/null; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + fi ;; +*) + if mkdir -m "$dirmode" -p -- . 2>/dev/null; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + fi ;; +esac + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + + lasterr="" + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 3 +# End: +# mkinstalldirs ends here diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/ChangeLog b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/ChangeLog new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/ChangeLog diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/Makefile.in.in b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/Makefile.in.in new file mode 100644 index 0000000000..111b40fcbb --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/Makefile.in.in @@ -0,0 +1,248 @@ +# Makefile for program source directory in GNU NLS utilities package. +# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <drepper@gnu.ai.mit.edu> +# +# This file file be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU Public License +# but which still want to provide support for the GNU gettext functionality. +# Please note that the actual code is *not* freely available. + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = /bin/sh +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datadir = $(prefix)/@DATADIRNAME@ +localedir = $(datadir)/locale +gnulocaledir = $(prefix)/share/locale +gettextsrcdir = $(prefix)/share/gettext/po +subdir = po + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +MKINSTALLDIRS = $(top_srcdir)/@MKINSTALLDIRS@ + +CC = @CC@ +GENCAT = @GENCAT@ +GMSGFMT = PATH=../src:$$PATH @GMSGFMT@ +MSGFMT = @MSGFMT@ +XGETTEXT = PATH=../src:$$PATH @XGETTEXT@ +MSGMERGE = PATH=../src:$$PATH msgmerge + +DEFS = @DEFS@ +CFLAGS = @CFLAGS@ +CPPFLAGS = @CPPFLAGS@ + +INCLUDES = -I.. -I$(top_srcdir)/intl + +COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) + +SOURCES = cat-id-tbl.c +POFILES = @POFILES@ +GMOFILES = @GMOFILES@ +DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(PACKAGE).pot \ +stamp-cat-id $(POFILES) $(GMOFILES) $(SOURCES) + +POTFILES = \ + +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +INSTOBJEXT = @INSTOBJEXT@ + +.SUFFIXES: +.SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat + +.c.o: + $(COMPILE) $< + +.po.pox: + $(MAKE) $(PACKAGE).pot + $(MSGMERGE) $< $(srcdir)/$(PACKAGE).pot -o $*.pox + +.po.mo: + $(MSGFMT) -o $@ $< + +.po.gmo: + file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \ + && rm -f $$file && $(GMSGFMT) -o $$file $< + +.po.cat: + sed -f ../intl/po2msg.sed < $< > $*.msg \ + && rm -f $@ && $(GENCAT) $@ $*.msg + + +all: all-@USE_NLS@ + +all-yes: cat-id-tbl.c $(CATALOGS) +all-no: + +$(srcdir)/$(PACKAGE).pot: $(POTFILES) + $(XGETTEXT) --default-domain=$(PACKAGE) --directory=$(top_srcdir) \ + --add-comments --keyword=_ --keyword=N_ \ + --files-from=$(srcdir)/POTFILES.in \ + && test ! -f $(PACKAGE).po \ + || ( rm -f $(srcdir)/$(PACKAGE).pot \ + && mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot ) + +$(srcdir)/cat-id-tbl.c: stamp-cat-id; @: +$(srcdir)/stamp-cat-id: $(PACKAGE).pot + rm -f cat-id-tbl.tmp + sed -f ../intl/po2tbl.sed $(srcdir)/$(PACKAGE).pot \ + | sed -e "s/@PACKAGE NAME@/$(PACKAGE)/" > cat-id-tbl.tmp + if cmp -s cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; then \ + rm cat-id-tbl.tmp; \ + else \ + echo cat-id-tbl.c changed; \ + rm -f $(srcdir)/cat-id-tbl.c; \ + mv cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; \ + fi + cd $(srcdir) && rm -f stamp-cat-id && echo timestamp > stamp-cat-id + + +install: install-exec install-data +install-exec: +install-data: install-data-@USE_NLS@ +install-data-no: all +install-data-yes: all + if test -r "$(MKINSTALLDIRS)"; then \ + $(MKINSTALLDIRS) $(datadir); \ + else \ + $(SHELL) $(top_srcdir)/mkinstalldirs $(datadir); \ + fi + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + case "$$cat" in \ + *.gmo) destdir=$(gnulocaledir);; \ + *) destdir=$(localedir);; \ + esac; \ + lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ + dir=$$destdir/$$lang/LC_MESSAGES; \ + if test -r "$(MKINSTALLDIRS)"; then \ + $(MKINSTALLDIRS) $$dir; \ + else \ + $(SHELL) $(top_srcdir)/mkinstalldirs $$dir; \ + fi; \ + if test -r $$cat; then \ + $(INSTALL_DATA) $$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \ + echo "installing $$cat as $$dir/$(PACKAGE)$(INSTOBJEXT)"; \ + else \ + $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \ + echo "installing $(srcdir)/$$cat as" \ + "$$dir/$(PACKAGE)$(INSTOBJEXT)"; \ + fi; \ + if test -r $$cat.m; then \ + $(INSTALL_DATA) $$cat.m $$dir/$(PACKAGE)$(INSTOBJEXT).m; \ + echo "installing $$cat.m as $$dir/$(PACKAGE)$(INSTOBJEXT).m"; \ + else \ + if test -r $(srcdir)/$$cat.m ; then \ + $(INSTALL_DATA) $(srcdir)/$$cat.m \ + $$dir/$(PACKAGE)$(INSTOBJEXT).m; \ + echo "installing $(srcdir)/$$cat as" \ + "$$dir/$(PACKAGE)$(INSTOBJEXT).m"; \ + else \ + true; \ + fi; \ + fi; \ + done + if test "$(PACKAGE)" = "gettext"; then \ + if test -r "$(MKINSTALLDIRS)"; then \ + $(MKINSTALLDIRS) $(gettextsrcdir); \ + else \ + $(SHELL) $(top_srcdir)/mkinstalldirs $(gettextsrcdir); \ + fi; \ + $(INSTALL_DATA) $(srcdir)/Makefile.in.in \ + $(gettextsrcdir)/Makefile.in.in; \ + else \ + : ; \ + fi + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ + rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \ + rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \ + rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \ + rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \ + done + rm -f $(gettextsrcdir)/po-Makefile.in.in + +check: all + +cat-id-tbl.o: ../intl/libgettext.h + +dvi info tags TAGS ID: + +mostlyclean: + rm -f core core.* *.pox $(PACKAGE).po *.old.po cat-id-tbl.tmp + rm -fr *.o + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f $(GMOFILES) + +distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: update-po $(DISTFILES) + dists="$(DISTFILES)"; \ + for file in $$dists; do \ + ln $(srcdir)/$$file $(distdir) 2> /dev/null \ + || cp -p $(srcdir)/$$file $(distdir); \ + done + +update-po: Makefile + $(MAKE) $(PACKAGE).pot + PATH=`pwd`/../src:$$PATH; \ + cd $(srcdir); \ + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ + mv $$lang.po $$lang.old.po; \ + echo "$$lang:"; \ + if $(MSGMERGE) $$lang.old.po $(PACKAGE).pot -o $$lang.po; then \ + rm -f $$lang.old.po; \ + else \ + echo "msgmerge for $$cat failed!"; \ + rm -f $$lang.po; \ + mv $$lang.old.po $$lang.po; \ + fi; \ + done + +POTFILES: POTFILES.in + ( if test 'x$(srcdir)' != 'x.'; then \ + posrcprefix='$(top_srcdir)/'; \ + else \ + posrcprefix="../"; \ + fi; \ + rm -f $@-t $@ \ + && (sed -e '/^#/d' -e '/^[ ]*$$/d' \ + -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \ + | sed -e '$$s/\\$$//') > $@-t \ + && chmod a-w $@-t \ + && mv $@-t $@ ) + +Makefile: Makefile.in.in ../config.status POTFILES + cd .. \ + && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ + $(SHELL) ./config.status + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/POTFILES.in b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/POTFILES.in new file mode 100644 index 0000000000..a90bb60567 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/POTFILES.in @@ -0,0 +1,6 @@ +# List of source files containing translatable strings. + +gtk-gui/main.c +gtk-gui/interface.c +gtk-gui/callbacks.c +gtk-gui/support.c diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/cat-id-tbl.c b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/cat-id-tbl.c new file mode 100644 index 0000000000..3d23a1fe1a --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/cat-id-tbl.c @@ -0,0 +1,25 @@ +/* Automatically generated by po2tbl.sed from goom2.pot. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include "libgettext.h" + +const struct _msg_ent _msg_tbl[] = { + {"", 1}, + {"Goom Control Window", 2}, + {"_File", 3}, + {"Window Y-Size:", 4}, + {"Window X-Size:", 5}, + {"Double Pixel:", 6}, + {"Frame Rate Limiter:", 7}, + {"Display", 8}, + {"TODO", 9}, + {"Inspect", 10}, + {"Customize", 11}, + {"Couldn't find pixmap file: %s", 12}, + {"Error loading pixmap file: %s", 13}, +}; + +int _msg_tbl_length = 13; diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/goom2.pot b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/goom2.pot new file mode 100644 index 0000000000..edcc0f13df --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/goom2.pot @@ -0,0 +1,65 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2003-04-27 17:01+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" + +#: gtk-gui/interface.c:56 +msgid "Goom Control Window" +msgstr "" + +#: gtk-gui/interface.c:74 +msgid "_File" +msgstr "" + +#: gtk-gui/interface.c:107 +msgid "Window Y-Size:" +msgstr "" + +#: gtk-gui/interface.c:154 +msgid "Window X-Size:" +msgstr "" + +#: gtk-gui/interface.c:174 +msgid "Double Pixel:" +msgstr "" + +#: gtk-gui/interface.c:185 +msgid "Frame Rate Limiter:" +msgstr "" + +#: gtk-gui/interface.c:206 +msgid "Display" +msgstr "" + +#: gtk-gui/interface.c:213 gtk-gui/interface.c:227 +msgid "TODO" +msgstr "" + +#: gtk-gui/interface.c:220 +msgid "Inspect" +msgstr "" + +#: gtk-gui/interface.c:234 +msgid "Customize" +msgstr "" + +#: gtk-gui/support.c:121 +#, c-format +msgid "Couldn't find pixmap file: %s" +msgstr "" + +#: gtk-gui/support.c:130 +#, c-format +msgid "Error loading pixmap file: %s" +msgstr "" diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/stamp-cat-id b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/stamp-cat-id new file mode 100644 index 0000000000..9788f70238 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/po/stamp-cat-id @@ -0,0 +1 @@ +timestamp diff --git a/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/stamp-h.in b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/stamp-h.in new file mode 100644 index 0000000000..9788f70238 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/gtk-gui-devel/stamp-h.in @@ -0,0 +1 @@ +timestamp diff --git a/src/visualizations/Goom/goom2k4-0/libgoom2.pc.in b/src/visualizations/Goom/goom2k4-0/libgoom2.pc.in new file mode 100644 index 0000000000..8a3a6a6898 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/libgoom2.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libgoom2 +Version: @VERSION@ +Description: goom audio visualisation effects. +Requires: +Libs: -L${libdir} -lgoom2 +Cflags: -I${includedir} + diff --git a/src/visualizations/Goom/goom2k4-0/m4/sdl.m4 b/src/visualizations/Goom/goom2k4-0/m4/sdl.m4 new file mode 100644 index 0000000000..4c851b1e74 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/m4/sdl.m4 @@ -0,0 +1,175 @@ +# Configure paths for SDL +# Sam Lantinga 9/21/99 +# stolen from Manish Singh +# stolen back from Frank Belew +# stolen from Manish Singh +# Shamelessly stolen from Owen Taylor + +dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS +dnl +AC_DEFUN([AM_PATH_SDL2], +[dnl +dnl Get the cflags and libraries from the sdl-config script +dnl +AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)], + sdl_prefix="$withval", sdl_prefix="") +AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)], + sdl_exec_prefix="$withval", sdl_exec_prefix="") +AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program], + , enable_sdltest=yes) + + if test x$sdl_exec_prefix != x ; then + sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config + fi + fi + if test x$sdl_prefix != x ; then + sdl_args="$sdl_args --prefix=$sdl_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_prefix/bin/sdl-config + fi + fi + + AC_REQUIRE([AC_CANONICAL_HOST]) + PATH="$prefix/bin:$prefix/usr/bin:$PATH" + AC_PATH_PROG(SDL_CONFIG, sdl-config, no, [$PATH]) + min_sdl_version=ifelse([$1], ,0.11.0,$1) + AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) + no_sdl="" + if test "$SDL_CONFIG" = "no" ; then + no_sdl=yes + else + SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` + SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` + + sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_sdltest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" +dnl +dnl Now check if the installed SDL is sufficiently new. (Also sanity +dnl checks the results of sdl-config to some extent +dnl + rm -f conf.sdltest + AC_TRY_RUN([ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "SDL.h" + +char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main (int argc, char *argv[]) +{ + int major, minor, micro; + char *tmp_version; + + /* This hangs on some systems (?) + system ("touch conf.sdltest"); + */ + { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_sdl_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_sdl_version"); + exit(1); + } + + if (($sdl_major_version > major) || + (($sdl_major_version == major) && ($sdl_minor_version > minor)) || + (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); + printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); + printf("*** best to upgrade to the required version.\n"); + printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); + printf("*** to point to the correct copy of sdl-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + return 1; + } +} + +],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_sdl" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$SDL_CONFIG" = "no" ; then + echo "*** The sdl-config script installed by SDL could not be found" + echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the SDL_CONFIG environment variable to the" + echo "*** full path to sdl-config." + else + if test -f conf.sdltest ; then + : + else + echo "*** Could not run SDL test program, checking why..." + CFLAGS="$CFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" + AC_TRY_LINK([ +#include <stdio.h> +#include "SDL.h" + +int main(int argc, char *argv[]) +{ return 0; } +#undef main +#define main K_and_R_C_main +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding SDL or finding the wrong" + echo "*** version of SDL. If it is not finding SDL, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means SDL was incorrectly installed" + echo "*** or that you have moved SDL since it was installed. In the latter case, you" + echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + SDL_CFLAGS="" + SDL_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(SDL_CFLAGS) + AC_SUBST(SDL_LIBS) + rm -f conf.sdltest +]) diff --git a/src/visualizations/Goom/goom2k4-0/m4/xmms.m4 b/src/visualizations/Goom/goom2k4-0/m4/xmms.m4 new file mode 100644 index 0000000000..d221ce8d6d --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/m4/xmms.m4 @@ -0,0 +1,148 @@ +# CFLAGS and library paths for XMMS +# written 15 December 1999 by Ben Gertzfield <che@debian.org> + +dnl Usage: +dnl AM_PATH_XMMS([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl +dnl Example: +dnl AM_PATH_XMMS(0.9.5.1, , AC_MSG_ERROR([*** XMMS >= 0.9.5.1 not installed - please install first ***])) +dnl +dnl Defines XMMS_CFLAGS, XMMS_LIBS, XMMS_DATA_DIR, XMMS_PLUGIN_DIR, +dnl XMMS_VISUALIZATION_PLUGIN_DIR, XMMS_INPUT_PLUGIN_DIR, +dnl XMMS_OUTPUT_PLUGIN_DIR, XMMS_GENERAL_PLUGIN_DIR, XMMS_EFFECT_PLUGIN_DIR, +dnl and XMMS_VERSION for your plugin pleasure. +dnl + +dnl XMMS_TEST_VERSION(AVAILABLE-VERSION, NEEDED-VERSION [, ACTION-IF-OKAY [, ACTION-IF-NOT-OKAY]]) +AC_DEFUN(XMMS_TEST_VERSION2, [ + +# Determine which version number is greater. Prints 2 to stdout if +# the second number is greater, 1 if the first number is greater, +# 0 if the numbers are equal. + +# Written 15 December 1999 by Ben Gertzfield <che@debian.org> +# Revised 15 December 1999 by Jim Monty <monty@primenet.com> + + AC_PROG_AWK + xmms_got_version=[` $AWK ' \ +BEGIN { \ + print vercmp(ARGV[1], ARGV[2]); \ +} \ + \ +function vercmp(ver1, ver2, ver1arr, ver2arr, \ + ver1len, ver2len, \ + ver1int, ver2int, len, i, p) { \ + \ + ver1len = split(ver1, ver1arr, /\./); \ + ver2len = split(ver2, ver2arr, /\./); \ + \ + len = ver1len > ver2len ? ver1len : ver2len; \ + \ + for (i = 1; i <= len; i++) { \ + p = 1000 ^ (len - i); \ + ver1int += ver1arr[i] * p; \ + ver2int += ver2arr[i] * p; \ + } \ + \ + if (ver1int < ver2int) \ + return 2; \ + else if (ver1int > ver2int) \ + return 1; \ + else \ + return 0; \ +}' $1 $2`] + + if test $xmms_got_version -eq 2; then # failure + ifelse([$4], , :, $4) + else # success! + ifelse([$3], , :, $3) + fi +]) + +AC_DEFUN(AM_PATH_XMMS2, +[ +AC_ARG_WITH(xmms-prefix,[ --with-xmms-prefix=PFX Prefix where XMMS is installed (optional)], + xmms_config_prefix="$withval", xmms_config_prefix="") +AC_ARG_WITH(xmms-exec-prefix,[ --with-xmms-exec-prefix=PFX Exec prefix where XMMS is installed (optional)], + xmms_config_exec_prefix="$withval", xmms_config_exec_prefix="") + +if test x$xmms_config_exec_prefix != x; then + xmms_config_args="$xmms_config_args --exec-prefix=$xmms_config_exec_prefix" + if test x${XMMS_CONFIG+set} != xset; then + XMMS_CONFIG=$xmms_config_exec_prefix/bin/xmms-config + fi +fi + +if test x$xmms_config_prefix != x; then + xmms_config_args="$xmms_config_args --prefix=$xmms_config_prefix" + if test x${XMMS_CONFIG+set} != xset; then + XMMS_CONFIG=$xmms_config_prefix/bin/xmms-config + fi +fi + +AC_PATH_PROG(XMMS_CONFIG, xmms-config, no) +min_xmms_version=ifelse([$1], ,0.9.5.1, $1) + +if test "$XMMS_CONFIG" = "no"; then + no_xmms=yes +else + XMMS_CFLAGS=`$XMMS_CONFIG $xmms_config_args --cflags` + XMMS_LIBS=`$XMMS_CONFIG $xmms_config_args --libs` + XMMS_VERSION=`$XMMS_CONFIG $xmms_config_args --version` + XMMS_DATA_DIR=`$XMMS_CONFIG $xmms_config_args --data-dir` + XMMS_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --plugin-dir` + XMMS_VISUALIZATION_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args \ + --visualization-plugin-dir` + XMMS_INPUT_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --input-plugin-dir` + XMMS_OUTPUT_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --output-plugin-dir` + XMMS_EFFECT_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --effect-plugin-dir` + XMMS_GENERAL_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --general-plugin-dir` + + XMMS_TEST_VERSION2($XMMS_VERSION, $min_xmms_version, ,no_xmms=version) +fi + +AC_MSG_CHECKING(for XMMS - version >= $min_xmms_version) + +if test "x$no_xmms" = x; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) +else + AC_MSG_RESULT(no) + + if test "$XMMS_CONFIG" = "no" ; then + echo "*** The xmms-config script installed by XMMS could not be found." + echo "*** If XMMS was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the XMMS_CONFIG environment variable to the" + echo "*** full path to xmms-config." + else + if test "$no_xmms" = "version"; then + echo "*** An old version of XMMS, $XMMS_VERSION, was found." + echo "*** You need a version of XMMS newer than $min_xmms_version." + echo "*** The latest version of XMMS is always available from" + echo "*** http://www.xmms.org/" + echo "***" + + echo "*** If you have already installed a sufficiently new version, this error" + echo "*** probably means that the wrong copy of the xmms-config shell script is" + echo "*** being found. The easiest way to fix this is to remove the old version" + echo "*** of XMMS, but you can also set the XMMS_CONFIG environment to point to the" + echo "*** correct copy of xmms-config. (In this case, you will have to" + echo "*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf" + echo "*** so that the correct libraries are found at run-time)" + fi + fi + XMMS_CFLAGS="" + XMMS_LIBS="" + ifelse([$3], , :, [$3]) +fi +AC_SUBST(XMMS_CFLAGS) +AC_SUBST(XMMS_LIBS) +AC_SUBST(XMMS_VERSION) +AC_SUBST(XMMS_DATA_DIR) +AC_SUBST(XMMS_PLUGIN_DIR) +AC_SUBST(XMMS_VISUALIZATION_PLUGIN_DIR) +AC_SUBST(XMMS_INPUT_PLUGIN_DIR) +AC_SUBST(XMMS_OUTPUT_PLUGIN_DIR) +AC_SUBST(XMMS_GENERAL_PLUGIN_DIR) +AC_SUBST(XMMS_EFFECT_PLUGIN_DIR) +]) diff --git a/src/visualizations/Goom/goom2k4-0/mac/Makefile b/src/visualizations/Goom/goom2k4-0/mac/Makefile new file mode 100755 index 0000000000..ea5cdefb5d --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/Makefile @@ -0,0 +1,88 @@ +# Makefile +# author: Gyom / iOS-Software +# Jan 2005 + + +############### +# Settings +macimage_name=iGoom +libobjects=../src/.libs/*.o +#buildroot=defaults read com.apple.Xcode "PBXApplicationwideBuildSettings" | cut -f2 -d"SYMROOT" | cut -f2 -d"\"" +buildroot=. +BUNDLE=$(buildroot)/iGoom.bundle +APP=$(buildroot)/iGoom.app +installer=iTunes/iTunes-Installer.app + + +all: $(APP) $(BUNDLE) + + +############### +# Misc library Targets + +# We build an embedable version of libgoom +StandAlone/libgoom2.0.dylib:$(libobjects) + gcc -dynamiclib -flat_namespace -o StandAlone/libgoom2.0.dylib $(libobjects) -install_name @executable_path/../Frameworks/libgoom2.0.dylib -compatibility_version 1 -current_version 1.0 -seg1addr 0x40000 -prebind + +# We link static only with iTunes because the install_path +# cannot be set properly to embed the lib in the bundle +# We must not place it in the mac folder because the bundle will +# link against the dynamic version if it is present +iTunes/libgoom2.0.a:$(libobjects) + libtool -static -o iTunes/libgoom2.0.a $(libobjects) + + +######################### +# Standalone Application + +standalone:$(APP) + +$(APP): StandAlone/libgoom2.0.dylib Makefile + xcodebuild -target "iGoom - StandAlone" -buildstyle Deployment SYMROOT=$(buildroot) + +cleanstandalone: + xcodebuild clean -target "iGoom - StandAlone" -buildstyle Deployment SYMROOT=$(buildroot) + + + +############### +# iTunes Plugin + +itunes:$(BUNDLE) + +$(BUNDLE):iTunes/libgoom2.0.a Makefile + xcodebuild -target "iGoom - iTunes" -buildstyle Deployment SYMROOT=$(buildroot) + +cleanitunes: + xcodebuild clean -target "iGoom - iTunes" -buildstyle Deployment SYMROOT=$(buildroot) + +$(installer):iTunes/Installer.applescript + osacompile -o $(installer) -x iTunes/Installer.applescript + + + +###################### +# Distribution Package + +all: $(APP) $(BUNDLE) + +package:$(macimage_name).dmg + +$(macimage_name).dmg:all ReadMe.rtf $(installer) + rm -rf $(macimage_name).dmg $(macimage_name) + mkdir -p $(macimage_name) + cp -r $(BUNDLE) $(macimage_name) + cp -r $(APP) $(macimage_name) + cp ReadMe.rtf $(macimage_name) + cp -rf $(installer) $(macimage_name)/ + hdiutil create -srcfolder $(macimage_name) $(macimage_name).dmg + + +########## +# Clean up + +clean: + rm -rf $(BUNDLE) $(APP) $(installer) + rm -rf $(macimage_name).dmg $(macimage_name) $(buildroot)/iGoom.build + rm -f StandAlone/libgoom2.* iTunes/libgoom2.* libgoom2.* + diff --git a/src/visualizations/Goom/goom2k4-0/mac/ReadMe.rtf b/src/visualizations/Goom/goom2k4-0/mac/ReadMe.rtf new file mode 100755 index 0000000000..a05598b841 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/ReadMe.rtf @@ -0,0 +1,256 @@ +{\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fnil\fcharset77 LucidaGrande; +} +{\colortbl;\red255\green255\blue255;\red255\green0\blue0;\red1\green128\blue0;\red0\green12\blue255; +\red0\green0\blue255;\red0\green22\blue255;\red0\green0\blue0;\red0\green132\blue14;} +\vieww15220\viewh13580\viewkind0 +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\qc + +\f0\b\fs36 \cf0 iGoom 2k4\ +\'a9 2001/2005 iOS-Software\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0\fs24 \cf0 \ +\cf2 \ +iGoom\cf0 is a wonderful visual effect plug-in for \cf3 iTunes\cf0 for Mac OS X. A mac standalone version is now also available. This is the Mac version of Goom, originally written by Jean-Christophe Hoelt "jeko" (\cf4 \ul \ulc4 jeko@ios-software.com\cf0 \ulnone ) and ported to iTunes by Guillaume Borios "gyom" (\cf4 \ul gyom@ios-software.com\cf0 \ulnone ).\ +\ +Check for informations or updates at \cf5 \ul \ulc5 http://www.\cf4 \ul \ulc4 ios-software.com\cf5 \ul \ulc5 /?page=projet&quoi=1\cf0 \ulnone .\cf6 \ul \ulc6 \ +\cf0 \ulnone \ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b\fs28 \cf0 License and Warranty\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0\fs24 \cf0 \ +The iTunes plug-in and the StandAlone application are\cf7 distributed under the terms of the GNU General Public License.\ +See \cf5 http://www.gnu.org/licenses/gpl.html\cf7 .\ +\cf0 \ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b\fs28 \cf0 How to install\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0\fs24 \cf0 \ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 iTunes:\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 Use the included install script\ +OR\ +Quit iTunes and drag the iGoom.bundle file into your "~/Library/iTunes/iTunes Plug-ins" folder. (the "~" means your home folder, the one with your user name). If any previous version of iGoom was already there, you MUST overwrite it or put it away, don't just rename.\ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 Standalone:\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 Drag and drop the application anywhere you want on your hard drive.\ +\ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b\fs28 \cf0 How to use the iTunes plugin\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0\fs24 \cf0 Launch iTunes, then select iGoom in the iTunes "Visual" menu, enable the visual effects ( +\f2 \AppleTypeServicesU1 \uc0\u8984 +\f1 \AppleTypeServicesU0 +T) and play your favorite songs.\ +\ +When iGoom is activated you can click the option button in the iTunes window to get the Preference panel.\ +\ +The preferences can also be set 'live' by simply hitting the following keys :\ +\ +* \cf8 Pixel doubling\cf0 (Key : Q): when activated, iGoom calculates a half sized image and artificially doubles its size when rendering.\ +* \cf8 Sensitivity\cf0 (Keys : < to decrease and > to increase) : Use this to make iGoom match the music YOU hear.\ +* \cf8 Presets\cf0 (Keys : 0 to 9) : Presets selection (0 Blocks the current effect).\ +* \cf8 Framerate\cf0 (Key : F) : Display the frame rate.\ +* \cf8 Information display\cf0 (Key : T) : Toggle information display when iTunes is Idle.\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b\fs28 \cf0 \ +\ +Performance tips +\f1\b0\fs24 \ +To accelerate iGoom, try these tips :\ +\'a5 Quit all other applications you don't need\ +\'a5 Enable the Quick Mode (Lower quality)\ +\'a5 Prefer the full screen mode to large windows in iTunes (full screen mode switches the resolution)\ +\'a5 Reduce the render size in iTunes (select medium size or low size in the visual menu).\ +\'a5 Buy a new Machine ;-)\ +\ +For full screen playback, I recommend at least a G4@800 (better with G4 or G5 and higher clock rates of course). Please note that iGoom can't use a lot of 3D acceleration and is not easily optimizable with Velocity Engine. \cf2 A fast CPU with lots of cache is the key.\cf0 \ +\ +\ + +\f0\b\fs28 Known bugs / Things to do\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0\fs24 \cf0 Try to make it even faster (But don't expect too much now...),\ +Add new effects,\ +Finish the scripting system,\ +Enhance the functionalities of the standalone application.\ +\ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b\fs28 \cf0 Version history +\f1\b0\fs24 \ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +2k4 ~ January 2005\ +\'a5 +\f1\b0 In sync with the final Goom 2k4\ +\'a5 The StandAlone version is available.\ +\'a5 The source tree is back to the sourceforge cvs and mac compatible. +\f0\b \ +\ +2k4 dev 14 ~ March 2004\ +\'a5 +\f1\b0 Added the scripting system into the core (not yet scriptable without recompilation). +\f0\b \ +\ +2k4 dev 8 ~ February 2004\ +\'a5 +\f1\b0 Added G5 optimizations. +\f0\b \ +\'a5 +\f1\b0 Caught a crashing bug in the PowerPC render.\ + +\f0\b \'a5 +\f1\b0 Added luminosity post-processing. +\f0\b \ +\'a5 +\f1\b0 Rewrote the transformation computation to make it independent from the resolution.\ + +\f0\b \'a5 +\f1\b0 A new fireworks effect. +\f0\b \ +\'a5 +\f1\b0 Lots of internal modifications to prepare future features. +\f0\b \ +\'a5 +\f1\b0 Many little optimizations. +\f0\b \ +\ +1.99.5 ~ January 7th 2003\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Information display can now be set on and off using the key T or the preference panel. Since many users seem to find it annoying, this feature is off by default.\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +1.99.4 ~ January 6th 2003\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Not faster but does more than before.\ +\'a5 Smoother animations.\ +\'a5 Nice text display with cool font and effect.\ +\'a5 New "tentacle" line effect.\ +\'a5 New zooms.\ +\'a5 Resize crashing bug hopefully corrected.\ +\'a5 Tuned many effects.\ +\'a5 Preferences window modified.\ +\'a5 iGoom now uses its own preference file instead of parasiting the iTune's one. \ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +1.9Dev5 ~ July 21st 2002\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Dynamic transitions between transforms.\ +\'a5 Dynamic lines effects transitions with new colors.\ +\'a5 1 new transform.\ +\'a5 Assembly routines rewritten but G4 optimisations disabled.\ +\'a5 Tuned many effects.\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +1.7.8 ~ April 12th 2002\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Added a tuned version of the fabulous ifs effect.\ +(Copyright (c) 1997 by Massimino Pascal <Pascal.Massimon@ens.fr>).\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +1.7.7 ~ April 5th 2002\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Little speed bump (+8%) on G3\ +(Improved the G3 assembly code, lend me a G4 and I'll do it for Altivec too!)\ +\'a5 Finally caught the crashing lines bug.\ +\'a5 Enabled the original lines effects again.\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +1.7.6 ~ March 15th 2002\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 In sync with goom 1.7.6,\ +\'a5 Now retains the quality mode.\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +1.7.5a3 ~ Not released\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Big speed bump on Smooth Mode (full quality) of about 30%.\ +\'a5 Little speed bump on Quick Mode (doubled pixels) of about 5%.\ +\'a5 Minor speed bump for G3 users.\ +\'a5 Added graphic visualization of setup (not available on fullscreen smooth mode).\ +\'a5 Added sensitivity setup.\ +\'a5 Tuned the moving pixels filter.\ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 1.7.4 ~ November 8th 2001\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Pixel doubling mode is now the default.\ +\'a5 Better default parameters.\ +\'a5 Accelerated the full quality mode by about 8%\ +\'a5 Added that nice (?) purple circle in the centre.\ +\'a5 Code clean-up (1.7.0 - 180kb -> 1.7.4 - 72kb)\ +\'a5 Version number corrected again (should be good this time)\ +\'a5 The random resizing crashes seem to be corrected by the code clean up.\ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 1.7.3 ~ July 26th 2001 +\f1\b0 \ +\'a5 The 1.7.2 archive was broken for G3, corrected the archive\ +\ + +\f0\b 1.7.2 ~ July 26th 2001 +\f1\b0 \ +\'a5 Now detects if Altivec (Velocity Engine) is present or not and enables a new G4 assembly zoom routine whenever possible. This makes it about 30% faster than before on G4 CPUs.\ +\'a5 Corrected a bug that would make the render go weird with odd horizontal resolutions and pixel doubling enabled.\ +\'a5 G3 Assembly acceleration rewritten for easier Altivec integration (No speed loss).\ +\'a5 Core goom code cleaned up to make possible Altivec accelerations (better data alignment and misc details). This make the G3 version a bit faster too and should accelerate future releases for other platforms.\ +\'a5 Corrected the bundle version number\ +\ + +\f0\b 1.7.1 ~ July 19th 2001 +\f1\b0 \ +\'a5 Added a PowerPC assembly routine instead of pure C to execute the critical part of the zoom (just like on MMX processors). We gain about 50% more Frame Per Second !\ +\ + +\f0\b 1.7.0 ~ July 17th 2001 +\f1\b0 \ +\'a5 In sync with Goom 1.7 (with some new effects available).\ +\'a5 Code clean up.\ +\'a5 Rendering functions (both normal and pixel doubling) rewritten for speed concerns.\ +\ + +\f0\b 1.6.1 ~ July 14th 2001 +\f1\b0 \ +\'a5 Pixel doubling bug corrected.\ +\ + +\f0\b 1.6.0 ~ July 11th 2001 +\f1\b0 \ +\'a5 Initial release, in sync with Goom 1.6 for XMMS.}
\ No newline at end of file diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.h b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.h new file mode 100755 index 0000000000..eae2594220 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.h @@ -0,0 +1,38 @@ +#import <Cocoa/Cocoa.h> + +#import "Goom.h" + +#import "MainOpenGLView.h" + +@interface AppController : NSResponder +{ + // Views + IBOutlet NSWindow * PrefWin; + IBOutlet NSTabView * TabView; + + IBOutlet MainOpenGLView * GLView; + + IBOutlet NSButton * HQButton; + IBOutlet NSTextField * QEWarning; + IBOutlet NSTextField * FPSCounter; + + // Model + BOOL isAnimating; + NSTimer *animationTimer; + CFAbsoluteTime timeBefore; + + BOOL stayInFullScreenMode; + NSOpenGLContext *fullScreenContext; + + IBOutlet Goom * myGoom; + float FrameRate; + float lastFPS; + AbsoluteTime backUpTime; +} + +- (IBAction) goFullScreen:(id)sender; +- (IBAction) setHighQuality:(id)sender; +- (IBAction) setFrameRate:(id)sender; +- (BOOL) isInFullScreenMode; + +@end diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.m b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.m new file mode 100755 index 0000000000..9f3d8964d6 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/AppController.m @@ -0,0 +1,438 @@ +#import "AppController.h" +#import "GoomFXView.h" +#include "src/goom.h" + +#import <OpenGL/OpenGL.h> + +@interface AppController (AnimationMethods) +- (BOOL) isAnimating; +- (void) startAnimation; +- (void) stopAnimation; +- (void) toggleAnimation; + +- (void) startAnimationTimer; +- (void) stopAnimationTimer; +- (void) animationTimerFired:(NSTimer *)timer; +@end + +static float HowLong(AbsoluteTime * backUpTime) +{ + AbsoluteTime absTime; + Nanoseconds nanosec; + + absTime = SubAbsoluteFromAbsolute(UpTime(), *backUpTime); + nanosec = AbsoluteToNanoseconds(absTime); + //fprintf(stderr,"Time : %f\n", (float) UnsignedWideToUInt64( nanosec ) / 1000000000.0); + //fprintf(stderr,"FPS : %f\n", (float) 1000000000.0f/UnsignedWideToUInt64( nanosec )); + *backUpTime = UpTime(); + return (float) (1000000000.0f/UnsignedWideToUInt64( nanosec )); +} + +static void logGLError(int line) +{ + GLenum err = glGetError(); + char * code; + + if (err == GL_NO_ERROR) return; + + switch (err) + { + case GL_INVALID_ENUM: + code = "GL_INVALID_ENUM"; + break; + case GL_INVALID_VALUE: + code = "GL_INVALID_VALUE"; + break; + case GL_INVALID_OPERATION: + code = "GL_INVALID_OPERATION"; + break; + case GL_STACK_OVERFLOW: + code = "GL_STACK_OVERFLOW"; + break; + case GL_STACK_UNDERFLOW: + code = "GL_STACK_UNDERFLOW"; + break; + case GL_OUT_OF_MEMORY: + code = "GL_OUT_OF_MEMORY"; + break; + default: + code = "Unknown Error"; + break; + } + fprintf(stderr,"iGoom OpenGL error : %s", code); + +} + +@implementation AppController + +-(void) awakeFromNib +{ + PluginInfo * goomInfos; + int i; + + goomInfos = [myGoom infos]; + + for (i=0; i < goomInfos->nbParams; i++) + { + NSTabViewItem * item = [[[NSTabViewItem alloc] initWithIdentifier:nil] autorelease]; + [item setLabel:[NSString stringWithCString:goomInfos->params[i].name]]; + [item setView:[[[GoomFXView alloc] initWithFrame:[TabView contentRect] andFX:goomInfos->params[i]] autorelease]]; + [TabView addTabViewItem:item]; + + // Create and load textures for the first time + //[GLView loadTextures:GL_TRUE]; + } + + //[self goFullScreen:self]; + isAnimating = NO; + lastFPS = 0.0f; + backUpTime=UpTime(); + FrameRate = 0.028f; // ~35 FPS + + if ([GLView canBeHQ]) + { + [HQButton setEnabled:YES]; + [QEWarning removeFromSuperview]; + } + + [self startAnimation]; +} + + +// Action method wired up to fire when the user clicks the "Go FullScreen" button. We remain in this method until the user exits FullScreen mode. +- (IBAction) goFullScreen:(id)sender +{ + CFAbsoluteTime timeNow; + CGLContextObj cglContext; + CGDisplayErr err; + long oldSwapInterval; + long newSwapInterval; + BOOL plugrunning = YES; + long rendererID; + + // Pixel Format Attributes for the FullScreen NSOpenGLContext + NSOpenGLPixelFormatAttribute attrs[] = { + + // Specify that we want a full-screen OpenGL context. + NSOpenGLPFAFullScreen, + + // We may be on a multi-display system (and each screen may be driven by a different renderer), + // so we need to specify which screen we want to take over. + // For this demo, we'll specify the main screen. + NSOpenGLPFAScreenMask, CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), + + // Attributes Common to FullScreen and non-FullScreen + NSOpenGLPFAColorSize, 24, + NSOpenGLPFADepthSize, 16, + NSOpenGLPFADoubleBuffer, + NSOpenGLPFAAccelerated, + 0 + }; + + // Create the FullScreen NSOpenGLContext with the attributes listed above. + NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; + if (pixelFormat == nil) { + NSLog(@"Failed to create 1st pixelFormat, trying another format..."); + NSOpenGLPixelFormatAttribute attrs2[] = { + NSOpenGLPFAFullScreen, + NSOpenGLPFAScreenMask, CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), + 0 + }; + + // Create the FullScreen NSOpenGLContext with the attributes listed above. + NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs2]; + if (pixelFormat == nil) { + NSLog(@"Failed to create 2nd pixelFormat, canceling full screen mode."); + return; + } + } + + // Just as a diagnostic, report the renderer ID that this pixel format binds to. + // CGLRenderers.h contains a list of known renderers and their corresponding RendererID codes. + [pixelFormat getValues:&rendererID forAttribute:NSOpenGLPFARendererID forVirtualScreen:0]; + + // Create an NSOpenGLContext with the FullScreen pixel format. + // By specifying the non-FullScreen context as our "shareContext", + // we automatically inherit all of the textures, display lists, and other OpenGL objects it has defined. + fullScreenContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:[GLView openGLContext]]; + [pixelFormat release]; + pixelFormat = nil; + + if (fullScreenContext == nil) { + NSLog(@"Failed to create fullScreenContext"); + return; + } + + // Pause animation in the OpenGL view. + // While we're in full-screen mode, we'll drive the animation actively instead of using a timer callback. + if ([self isAnimating]) { + [self stopAnimationTimer]; + } + + // Take control of the display where we're about to go FullScreen. + err = CGCaptureAllDisplays(); + if (err != CGDisplayNoErr) { + [fullScreenContext release]; + fullScreenContext = nil; + return; + } + + // Enter FullScreen mode and make our FullScreen context the active context for OpenGL commands. + [fullScreenContext setFullScreen]; + [fullScreenContext makeCurrentContext]; + + // Save the current swap interval so we can restore it later, and then set the new swap interval to lock us to the display's refresh rate. + cglContext = CGLGetCurrentContext(); + CGLGetParameter(cglContext, kCGLCPSwapInterval, &oldSwapInterval); + newSwapInterval = 1; + CGLSetParameter(cglContext, kCGLCPSwapInterval, &newSwapInterval); + + // Tell the myGoom the dimensions of the area it's going to render to, so it can set up an appropriate viewport and viewing transformation. + [myGoom setSize:NSMakeSize(CGDisplayPixelsWide(kCGDirectMainDisplay), CGDisplayPixelsHigh(kCGDirectMainDisplay))]; + + // Now that we've got the screen, we enter a loop in which we alternately process input events and computer and render the next frame of our animation. The shift here is from a model in which we passively receive events handed to us by the AppKit to one in which we are actively driving event processing. + timeBefore = CFAbsoluteTimeGetCurrent(); + stayInFullScreenMode = YES; + while (stayInFullScreenMode) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + // Check for and process input events. + NSEvent *event; + while (event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES]) { + switch ([event type]) { + case NSLeftMouseDown: + [self mouseDown:event]; + break; + + case NSLeftMouseUp: + plugrunning = plugrunning?NO:YES; + [self mouseUp:event]; + break; + + case NSRightMouseUp: + plugrunning = plugrunning?NO:YES; + break; + + case NSLeftMouseDragged: + [self mouseDragged:event]; + break; + + case NSKeyDown: + [self keyDown:event]; + break; + + default: + break; + } + } + + // Render a frame, and swap the front and back buffers. + timeNow = CFAbsoluteTimeGetCurrent(); + if ((timeNow-timeBefore) >= FrameRate) + { + timeBefore = timeNow; + if (plugrunning==YES) { + [myGoom render]; + [fullScreenContext flushBuffer]; + } + } + + + // Clean up any autoreleased objects that were created this time through the loop. + [pool release]; + } + + // Clear the front and back framebuffers before switching out of FullScreen mode. (This is not strictly necessary, but avoids an untidy flash of garbage.) + glClearColor(0.0, 0.0, 0.0, 0.0); + glClear(GL_COLOR_BUFFER_BIT); + [fullScreenContext flushBuffer]; + glClear(GL_COLOR_BUFFER_BIT); + [fullScreenContext flushBuffer]; + + // Restore the previously set swap interval. + CGLSetParameter(cglContext, kCGLCPSwapInterval, &oldSwapInterval); + + // Exit fullscreen mode and release our FullScreen NSOpenGLContext. + [NSOpenGLContext clearCurrentContext]; + [fullScreenContext clearDrawable]; + [fullScreenContext release]; + fullScreenContext = nil; + + // Release control of the display. + CGReleaseAllDisplays(); + + // Reset the size to the window size + [myGoom setSize:[GLView frame].size]; + + // Mark our view as needing drawing. (The animation has advanced while we were in FullScreen mode, so its current contents are stale.) + [GLView setNeedsDisplay:YES]; + + // Resume animation timer firings. + if ([self isAnimating]) { + [self startAnimationTimer]; + } +} + +- (IBAction) setHighQuality:(id)sender +{ + [myGoom setHighQuality:([sender state]==NSOnState)]; +} + +- (IBAction) setFrameRate:(id)sender +{ + FrameRate = 1.0f/[sender floatValue]; + [self stopAnimation]; + [self startAnimation]; +} + +- (void) keyDown:(NSEvent *)event +{ + unichar c = [[event charactersIgnoringModifiers] characterAtIndex:0]; + switch (c) { + + // [Esc] exits FullScreen mode. + case 27: + stayInFullScreenMode = NO; + break; + + // [space] toggles rotation of the globe. + case 32: + [self toggleAnimation]; + break; + + case 'l': + case 'L': + [myGoom setHighQuality:NO]; + break; + + case 'h': + case 'H': + [myGoom setHighQuality:YES]; + break; + + default: + break; + } +} +/* +- (void)mouseDown:(NSEvent *)theEvent +{ + BOOL wasAnimating = [self isAnimating]; + BOOL dragging = YES; + NSPoint windowPoint; + NSPoint lastWindowPoint = [theEvent locationInWindow]; + float dx, dy; + + if (wasAnimating) { + [self stopAnimation]; + } + while (dragging) { + theEvent = [[GLView window] nextEventMatchingMask:NSLeftMouseUpMask | NSLeftMouseDraggedMask]; + windowPoint = [theEvent locationInWindow]; + switch ([theEvent type]) { + case NSLeftMouseUp: + dragging = NO; + break; + + case NSLeftMouseDragged: + dx = windowPoint.x - lastWindowPoint.x; + dy = windowPoint.y - lastWindowPoint.y; + lastWindowPoint = windowPoint; + + // Render a frame. + if (fullScreenContext) { + [myGoom render]; + [fullScreenContext flushBuffer]; + } else { + [GLView display]; + } + break; + + default: + break; + } + } + if (wasAnimating) { + [self startAnimation]; + timeBefore = CFAbsoluteTimeGetCurrent(); + } +} +*/ +- (BOOL) isInFullScreenMode +{ + return fullScreenContext != nil; +} + +@end + +@implementation AppController (AnimationMethods) + +- (BOOL) isAnimating +{ + return isAnimating; +} + +- (void) startAnimation +{ + if (!isAnimating) { + isAnimating = YES; + if (![self isInFullScreenMode]) + { + [self startAnimationTimer]; + } + } +} + +- (void) stopAnimation +{ + if (isAnimating) { + if (animationTimer != nil) { + [self stopAnimationTimer]; + } + isAnimating = NO; + } +} + +- (void) toggleAnimation +{ + if ([self isAnimating]) [self stopAnimation]; + else [self startAnimation]; +} + +- (void) startAnimationTimer +{ + if (animationTimer == nil) { + animationTimer = [[NSTimer scheduledTimerWithTimeInterval:FrameRate target:self selector:@selector(animationTimerFired:) userInfo:nil repeats:YES] retain]; + } +} + +- (void) stopAnimationTimer +{ + if (animationTimer != nil) { + [animationTimer invalidate]; + [animationTimer release]; + animationTimer = nil; + } +} + +- (void) animationTimerFired:(NSTimer *)timer +{ + lastFPS = (HowLong(&backUpTime) + lastFPS) * 0.5f; + [FPSCounter setStringValue:[NSString stringWithFormat:@"%d/%d FPS",(int)lastFPS,(int)(1.0f/FrameRate)]]; + [GLView setNeedsDisplay:YES]; +} + +// TAB VIEW DELEGATE +- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem +{ + NSRect frame = [PrefWin frame]; + float height; + if(![[tabViewItem identifier] isEqual:@"maintab"]) height = ((GoomFXView*)[tabViewItem view])->height; + else height = 356.0f; + height += 20.0f; + frame.origin.y -= height-frame.size.height; + frame.size.height = height; + [PrefWin setFrame:frame display:YES animate:YES]; +} + +@end diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.cpp b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.cpp new file mode 100644 index 0000000000..d37b6e9dae --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.cpp @@ -0,0 +1,126 @@ +/* + * CoreAudioDevice.cpp + * iGoom + * + * Created by Guillaume Borios on 14/01/05. + * Copyright 2005 iOS Software. All rights reserved. + * + */ + +#include "CoreAudioDevice.h" + + +CoreAudioDevice::CoreAudioDevice(AudioDeviceID devId):deviceID(devId) {} + +CoreAudioDevice::~CoreAudioDevice() {} + + +CFStringRef CoreAudioDevice::name() const +{ + CFStringRef nom; + try + { + UInt32 size = sizeof(CFStringRef); + propertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyDeviceNameCFString, size, &nom); + } + catch(...) + { + nom = CFSTR(""); + } + return nom; +} + +UInt32 CoreAudioDevice::propertyDataSize(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property) const +{ + UInt32 size = 0; + if (AudioDeviceGetPropertyInfo(deviceID, channel, section, property, &size, NULL) != 0) + { + fprintf(stderr,"Error while fetching audio device property size. Exiting."); + exit(0); + } + return size; +} + +void CoreAudioDevice::propertyData(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property, UInt32 &size, void* data) const +{ + AudioDeviceGetProperty(deviceID, channel, section, property, &size, data) != 0; +} + +void CoreAudioDevice::setPropertyData(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property, UInt32 inDataSize, const void* data) +{ + OSStatus theError = AudioDeviceSetProperty(deviceID, NULL, channel, section, property, inDataSize, data); + //if (theError) fprintf(stderr,"Error"); +} + +UInt32 CoreAudioDevice::numberOfChannels(CoreAudioDeviceSection section) const +{ + UInt32 n = 0; + UInt32 size = propertyDataSize(0, section, kAudioDevicePropertyStreamConfiguration); + AudioBufferList* bufList=(AudioBufferList*)malloc(size); + + propertyData(0, section, kAudioDevicePropertyStreamConfiguration, size, bufList); + for(UInt32 i = 0; i < bufList->mNumberBuffers; ++i) + { + n += bufList->mBuffers[i].mNumberChannels; + } + free(bufList); + return n; +} + +pid_t CoreAudioDevice::hogModeOwner() const +{ + pid_t retour = 0; + UInt32 size = sizeof(pid_t); + propertyData(0, kAudioDeviceSectionInput, kAudioDevicePropertyHogMode, size, &retour); + return retour; +} + + +void CoreAudioDevice::AddPropertyListener(UInt32 inChannel, CoreAudioDeviceSection inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc, void* inClientData) +{ + if (AudioDeviceAddPropertyListener(deviceID, inChannel, inSection, inPropertyID, inListenerProc, inClientData) != 0) + { + fprintf(stderr,"Error while Installing device notifications listener. Exiting."); + exit(0); + } +} + +void CoreAudioDevice::RemovePropertyListener(UInt32 inChannel, CoreAudioDeviceSection inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc) +{ + if (AudioDeviceRemovePropertyListener(deviceID, inChannel, inSection, inPropertyID, inListenerProc) !=0) + { + //fprintf(stderr,"Error while Removing device notifications listener. Exiting."); + //exit(0); + } +} + +// *************************************** VOLUME CONTROL *************************************** + +bool CoreAudioDevice::HasVolumeControl(UInt32 channel, CoreAudioDeviceSection section) const +{ + OSStatus theError = AudioDeviceGetPropertyInfo(deviceID, channel, section, kAudioDevicePropertyVolumeScalar, NULL, NULL); + return (theError == 0); +} + +bool CoreAudioDevice::VolumeControlIsSettable(UInt32 channel, CoreAudioDeviceSection section) const +{ + Boolean isWritable = false; + OSStatus theError = AudioDeviceGetPropertyInfo(deviceID, channel, section, kAudioDevicePropertyVolumeScalar, NULL, &isWritable); + return (isWritable != 0); +} + +Float32 CoreAudioDevice::GetVolumeControlScalarValue(UInt32 channel, CoreAudioDeviceSection section) const +{ + Float32 value = 0.0; + UInt32 size = sizeof(Float32); + propertyData(channel, section, kAudioDevicePropertyVolumeScalar, size, &value); + return value; +} + +void CoreAudioDevice::SetVolumeControlScalarValue(UInt32 channel, CoreAudioDeviceSection section, Float32 value) +{ + UInt32 size = sizeof(Float32); + setPropertyData(channel, section, kAudioDevicePropertyVolumeScalar, size, &value); +} + + diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.h b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.h new file mode 100644 index 0000000000..1e8576580b --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioDevice.h @@ -0,0 +1,53 @@ +/* + * CoreAudioDevice.h + * iGoom + * + * Created by Guillaume Borios on 14/01/05. + * Copyright 2005 iOS Software. All rights reserved. + * + */ + +#include <CoreFoundation/CoreFoundation.h> +#include <CoreAudio/CoreAudio.h> + +#ifndef COREAUDIODEVICE +#define COREAUDIODEVICE + +typedef UInt8 CoreAudioDeviceSection; +#define kAudioDeviceSectionInput ((CoreAudioDeviceSection)0x01) +#define kAudioDeviceSectionOutput ((CoreAudioDeviceSection)0x00) +#define kAudioDeviceSectionGlobal ((CoreAudioDeviceSection)0x00) +#define kAudioDeviceSectionWildcard ((CoreAudioDeviceSection)0xFF) + +class CoreAudioDevice +{ + +public: + CoreAudioDevice(AudioDeviceID devId); + ~CoreAudioDevice(); + + AudioDeviceID getDeviceID() const { return deviceID; } + CFStringRef name() const; + + UInt32 propertyDataSize(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property) const; + void propertyData(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property, UInt32 &size, void* data) const; + void setPropertyData(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property, UInt32 inDataSize, const void* data); + + UInt32 numberOfChannels(CoreAudioDeviceSection section) const; + + pid_t hogModeOwner() const; + + void AddPropertyListener(UInt32 inChannel, CoreAudioDeviceSection inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc, void* inClientData); + void RemovePropertyListener(UInt32 inChannel, CoreAudioDeviceSection inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc); + + bool CoreAudioDevice::HasVolumeControl(UInt32 channel, CoreAudioDeviceSection section) const; + bool CoreAudioDevice::VolumeControlIsSettable(UInt32 channel, CoreAudioDeviceSection section) const; + Float32 CoreAudioDevice::GetVolumeControlScalarValue(UInt32 channel, CoreAudioDeviceSection section) const; + void CoreAudioDevice::SetVolumeControlScalarValue(UInt32 channel, CoreAudioDeviceSection section, Float32 value); + +private: + AudioDeviceID deviceID; +}; + + +#endif /* COREAUDIODEVICE */
\ No newline at end of file diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.cpp b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.cpp new file mode 100644 index 0000000000..cd9c27673d --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.cpp @@ -0,0 +1,70 @@ +/* + * CoreAudioHardware.cpp + * iGoom + * + * Created by Guillaume Borios on 14/01/05. + * Copyright 2005 iOS Software. All rights reserved. + * + */ + +#include "CoreAudioHardware.h" +#include <stdio.h> +#include <stdlib.h> + +UInt32 CoreAudioHardware::numberOfDevices() +{ + return ( propertyDataSize(kAudioHardwarePropertyDevices) / sizeof(AudioDeviceID) ); +} + +AudioDeviceID CoreAudioHardware::deviceAtIndex(unsigned int i) +{ + AudioDeviceID devID = 0; + int n = numberOfDevices(); + if((n > 0) && (i < n)) + { + UInt32 size = n * sizeof(AudioDeviceID); + AudioDeviceID * list = (AudioDeviceID *)malloc(size); + propertyData(kAudioHardwarePropertyDevices, size, list); + devID = list[i]; + free(list); + } + return devID; +} + +UInt32 CoreAudioHardware::propertyDataSize(AudioHardwarePropertyID property) +{ + UInt32 size = 0; + if (AudioHardwareGetPropertyInfo(property, &size, NULL) != 0) + { + fprintf(stderr,"Error while fetching audio property size. Exiting."); + exit(0); + } + return size; +} + +void CoreAudioHardware::propertyData(AudioHardwarePropertyID property, UInt32 &size, void *data) +{ + if (AudioHardwareGetProperty(property, &size, data) != 0) + { + fprintf(stderr,"Error while fetching audio property. Exiting."); + exit(0); + } +} + +void CoreAudioHardware::AddPropertyListener(AudioHardwarePropertyID property, AudioHardwarePropertyListenerProc proc, void* data) +{ + if (AudioHardwareAddPropertyListener(property, proc, data)!= 0) + { + fprintf(stderr,"Error could not add a property listener. Exiting."); + exit(0); + } +} + +void CoreAudioHardware::RemovePropertyListener(AudioHardwarePropertyID property, AudioHardwarePropertyListenerProc proc) +{ + if (AudioHardwareRemovePropertyListener(property, proc)!= 0) + { + fprintf(stderr,"Error could not remove a property listener. Exiting."); + exit(0); + } +} diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.h b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.h new file mode 100644 index 0000000000..6aa451d1d7 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/CoreAudioHardware.h @@ -0,0 +1,29 @@ +/* + * CoreAudioHardware.h + * iGoom + * + * Created by Guillaume Borios on 14/01/05. + * Copyright 2005 iOS Software. All rights reserved. + * + */ + +#include <CoreAudio/CoreAudio.h> + + +#ifndef COREAUDIOHARDWARE +#define COREAUDIOHARDWARE + +class CoreAudioHardware +{ +public: + static UInt32 numberOfDevices(); + static AudioDeviceID deviceAtIndex(unsigned int i); +public: + static UInt32 propertyDataSize(AudioHardwarePropertyID property); + static void propertyData(AudioHardwarePropertyID property, UInt32 &size, void *data); + static void AddPropertyListener(AudioHardwarePropertyID property, AudioHardwarePropertyListenerProc listenerProc, void* inClientData); + static void RemovePropertyListener(AudioHardwarePropertyID property, AudioHardwarePropertyListenerProc listenerProc); + +}; + +#endif /*COREAUDIOHARDWARE*/ diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/InfoPlist.strings b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/InfoPlist.strings new file mode 100755 index 0000000000..ec736bd74a --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/InfoPlist.strings @@ -0,0 +1,7 @@ +/* Localized versions of Info.plist keys */ + +CFBundleName = "iGoom"; +CFBundleShortVersionString = "2.0"; +CFBundleGetInfoString = "iGoom version 2.0, Copyright 2001~2005, iOS-Software.\nhttp://www.ios-software.com/"; +NSHumanReadableCopyright = "Copyright 2001~2005, iOS-Software.\nhttp://www.ios-software.com/"; +CFBundleVersion = "2.0"; diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/classes.nib b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/classes.nib new file mode 100755 index 0000000000..2ea29a9a5a --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/classes.nib @@ -0,0 +1,44 @@ +{ + IBClasses = ( + { + ACTIONS = {goFullScreen = id; setFrameRate = id; setHighQuality = id; }; + CLASS = AppController; + LANGUAGE = ObjC; + OUTLETS = { + FPSCounter = NSTextField; + GLView = MainOpenGLView; + HQButton = NSButton; + PrefWin = NSWindow; + QEWarning = NSTextField; + TabView = NSTabView; + myGoom = Goom; + }; + SUPERCLASS = NSResponder; + }, + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + {CLASS = Goom; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + ACTIONS = { + clientStorage = id; + frameRate = id; + rectTextures = id; + setFullscreen = id; + textureHint = id; + textureRange = id; + }; + CLASS = MainOpenGLView; + LANGUAGE = ObjC; + OUTLETS = {StartingView = NSView; myGoom = Goom; sizeField = NSTextField; }; + SUPERCLASS = NSOpenGLView; + }, + {CLASS = MyApplication; LANGUAGE = ObjC; SUPERCLASS = NSApplication; }, + { + ACTIONS = {changeAudioDevice = id; changeAudioVolume = id; }; + CLASS = SoundSampler; + LANGUAGE = ObjC; + OUTLETS = {ODeviceList = NSPopUpButton; OSoundVolume = NSSlider; }; + SUPERCLASS = NSObject; + } + ); + IBVersion = 1; +}
\ No newline at end of file diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/info.nib b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/info.nib new file mode 100755 index 0000000000..d5104f8674 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/info.nib @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>IBDocumentLocation</key> + <string>46 72 356 295 0 0 1024 746 </string> + <key>IBEditorPositions</key> + <dict> + <key>29</key> + <string>43 545 183 44 0 0 1280 1002 </string> + </dict> + <key>IBFramework Version</key> + <string>364.0</string> + <key>IBOpenObjects</key> + <array> + <integer>29</integer> + <integer>508</integer> + <integer>21</integer> + </array> + <key>IBSystem Version</key> + <string>7S215</string> +</dict> +</plist> diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/keyedobjects.nib b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/keyedobjects.nib Binary files differnew file mode 100755 index 0000000000..9c43c77a93 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/keyedobjects.nib diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/French.lproj/Localizable.strings b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/French.lproj/Localizable.strings new file mode 100755 index 0000000000..4eedd76a9c --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/French.lproj/Localizable.strings @@ -0,0 +1,14 @@ +//---------------------------------------------------------------------------// +// +// Localizable.strings +// iGoom StandAlone Project +// +// Copyright (c) 2002-2003 iOS. All rights reserved. +// +//---------------------------------------------------------------------------// + +/* */ +"" = ""; + +/* Audio Input Devices */ +"Built-in Audio" = "Audio intégré"; diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.h b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.h new file mode 100755 index 0000000000..8073c62d11 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.h @@ -0,0 +1,46 @@ +// +// Goom.h +// iGoom +// +// Created by Guillaume Borios on Sat Dec 20 2003. +// Copyright (c) 2003 iOS. All rights reserved. +// + +#import <Cocoa/Cocoa.h> +#import <OpenGL/OpenGL.h> +#import <OpenGL/glu.h> +#include <OpenGL/glext.h> +#include "src/goom.h" + +@interface Goom : NSObject { + + PluginInfo * goomInfos; + + gint16 sndData[2][512]; + + GLuint textureName; + AbsoluteTime backUpTime; + + GLenum texture_hint; + GLboolean client_storage; + + NSSize curSize; + BOOL HQ; + BOOL dirty; +} + +- (void)setSize:(NSSize)_size; + +- (PluginInfo*)infos; + +-(void)render; + +-(void)setHighQuality:(BOOL)quality; +- (void)prepareTextures; + +- (guint32 *)getGoomDataWithFPS:(float)fps; + +-(void)setTextureHint:(GLenum)hint; +-(void)clientStorage:(GLboolean)client; + +@end diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.m b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.m new file mode 100755 index 0000000000..db3a162d11 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/Goom.m @@ -0,0 +1,294 @@ +// +// Goom.m +// iGoom +// +// Created by Guillaume Borios on Sat Dec 20 2003. +// Copyright (c) 2003 iOS. All rights reserved. +// + +#import "Goom.h" +#import <OpenGL/glu.h> +#include <OpenGL/glext.h> +#import "SoundSampler.h" + +@implementation Goom + +unsigned int IMAGE_SIZE(NSSize curSize) +{ + int retour = (1<<(int)(log((curSize.width>curSize.height)?curSize.width:curSize.height)/log(2.0f))); + if (retour > 512) retour = 512; + return retour; +} + +-(Goom*)init +{ + self = [super init]; + + if (self != nil) + { + curSize = NSMakeSize(16,16); + HQ = NO; + dirty = YES; + goomInfos = goom_init(16,16); + backUpTime = UpTime(); + + client_storage = GL_TRUE; + texture_hint = GL_STORAGE_SHARED_APPLE; + } + //NSLog(@"Goom Init"); + return self; +} + +-(Goom*)initWithSize:(NSSize)_size +{ + self = [super init]; + + if (self != nil) + { + curSize = _size; + HQ = NO; + dirty = YES; + backUpTime = UpTime(); + } + //NSLog(@"Goom Init with Size : %f x %f",_size.width,_size.height); + return self; +} + +- (PluginInfo*)infos +{ + return goomInfos; +} + +-(void)setSize:(NSSize)_size +{ + if ((curSize.width != _size.width) || (curSize.height != _size.height)) + { + //NSLog(@"Set size (%f,%f)",_size.width, _size.height); + curSize = _size; + dirty = YES; + } +} + +-(void)render +{ + if (dirty==YES) [self prepareTextures]; + + //glClear(0); + + // Bind, update and draw new image + if(HQ==YES) + { + //NSLog(@"Render HQ (%f,%f)",curSize.width, curSize.height); + + glEnable(GL_TEXTURE_RECTANGLE_EXT); + + glBindTexture(GL_TEXTURE_RECTANGLE_EXT, textureName); + glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1); + glTexSubImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, curSize.width, curSize.height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, [self getGoomDataWithFPS:0]); + + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); + glVertex2f(-1.0f, 1.0f); + glTexCoord2f(0.0f, curSize.height); + glVertex2f(-1.0f, -1.0f); + glTexCoord2f(curSize.width, curSize.height); + glVertex2f(1.0f, -1.0f); + glTexCoord2f(curSize.width, 0.0f); + glVertex2f(1.0f, 1.0f); + glEnd(); + + glDisable(GL_TEXTURE_RECTANGLE_EXT); + + } + else + { + int loggedSize = IMAGE_SIZE(curSize); + float ratio = curSize.width/curSize.height; + + //NSLog(@"Render LQ (%f,%f / %d)",curSize.width, curSize.height,IMAGE_SIZE(curSize)); + + glEnable(GL_TEXTURE_2D); + + //glColor4f(0.0, 0.5, 0.1, 0.0); + glBindTexture(GL_TEXTURE_2D, textureName); + glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, loggedSize, loggedSize, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, [self getGoomDataWithFPS:0]); + + //glShadeModel(GL_SMOOTH); + + glBegin(GL_POLYGON); + + if (ratio>1.0f) + { + float o=0.5f-0.5f/ratio; + float y=1.0f/ratio+o; + //glColor4f(0.0, 0.5, 0.1, 1.0); + glTexCoord2f(0.0f, o); + glVertex2f(-1.0f, 1.0f); + //glColor4f(0.3, 0.5, 0.1, 0.5); + glTexCoord2f(0.0f, y); + glVertex2f(-1.0f, -1.0f); + //glColor4f(0.6, 0.5, 0.1, 0.2); + glTexCoord2f(1.0f, y); + glVertex2f(1.0f, -1.0f); + //glColor4f(0.9, 0.5, 0.1, 0.0); + glTexCoord2f(1.0f, o); + glVertex2f(1.0f, 1.0f); + } + else + { + float o=0.5f-0.5f*ratio; + float x=ratio+o; + //glColor4f(0.0, 0.5, 0.1, 1.0); + glTexCoord2f(o, 0.0f); + glVertex2f(-1.0f, 1.0f); + //glColor4f(0.3, 0.5, 0.1, 0.5); + glTexCoord2f(o, 1.0f); + glVertex2f(-1.0f, -1.0f); + //glColor4f(0.6, 0.5, 0.1, 0.2); + glTexCoord2f(x, 1.0f); + glVertex2f(1.0f, -1.0f); + //glColor4f(0.9, 0.5, 0.1, 0.0); + glTexCoord2f(x, 0.0f); + glVertex2f(1.0f, 1.0f); + } + + glEnd(); + + glDisable(GL_TEXTURE_2D); + //glShadeModel(GL_FLAT); + + /* + glBegin(GL_QUADS); + + glColor4f(0.0, 0.1, 0.0, 1.0); + glVertex3f(-1.0, -1.0, 0.0); + glVertex3f( 1.0, -1.0, 0.0); + + glColor4f(0.0, 0.5, 0.1, 1.0); + glVertex3f( 1.0, 1.0, 0.0); + glVertex3f(-1.0, 1.0, 0.0); + + glEnd();*/ + + } + + //glFlush(); +} + + +-(guint32 *)getGoomDataWithFPS:(float)fps +{ + + if (fps>0) return goom_update(goomInfos, [[SoundSampler sharedSampler] getData], 0, fps, 0, 0); + else return goom_update(goomInfos, [[SoundSampler sharedSampler] getData], 0, 0, 0, 0); + // return goom_update(goomInfos, sndData, 0, fps, 0, 0); + +} + + + +-(void)setHighQuality:(BOOL)quality +{ + HQ = quality; + dirty = YES; +} + +- (void)prepareTextures +{ + //static BOOL first = YES; + //[[self openGLContext] update]; + + // Setup some basic OpenGL stuff + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glClearColor(1.0f, 1.0f, 1.0f, 0.0f); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + + dirty = NO; + + glViewport(0, 0, (int) curSize.width, (int) curSize.height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + //glEnable(GL_LIGHTING); + + + if(HQ==YES) + { + //NSLog(@"Prepare HQ (%f,%f)",curSize.width, curSize.height); + + //glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL); + + glDeleteTextures(1, &textureName); + glDisable(GL_TEXTURE_2D); + glEnable(GL_TEXTURE_RECTANGLE_EXT); + + glGenTextures( 1, &textureName ); + glBindTexture(GL_TEXTURE_RECTANGLE_EXT, textureName); + + glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL); + + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , client_storage); + glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, texture_hint); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + goom_set_resolution (goomInfos, curSize.width, curSize.height); + glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, curSize.width, curSize.height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, [self getGoomDataWithFPS:0]); + } + else + { + //NSLog(@"Prepare LQ (%f,%f)",curSize.width, curSize.height); + + //glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL); + + glDeleteTextures(1, &textureName); + glDisable(GL_TEXTURE_RECTANGLE_EXT); + glEnable(GL_TEXTURE_2D); + + glGenTextures( 1, &textureName ); + glBindTexture(GL_TEXTURE_2D, textureName); + + glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_STORAGE_HINT_APPLE , client_storage); + glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, texture_hint); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + goom_set_resolution (goomInfos, IMAGE_SIZE(curSize), IMAGE_SIZE(curSize)); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, IMAGE_SIZE(curSize), IMAGE_SIZE(curSize), 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, [self getGoomDataWithFPS:0]); + + } + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); +} + +-(void)setTextureHint:(GLenum)hint +{ + texture_hint = hint; +} + +-(void)clientStorage:(GLboolean)client +{ + client_storage = client; +} + + +- (void)dealloc +{ + goom_close(goomInfos); + [super dealloc]; +} + + + +@end diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.h b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.h new file mode 100755 index 0000000000..c8ec67cb31 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.h @@ -0,0 +1,26 @@ +// +// GoomFXParam.h +// iGoom copie +// +// Created by Guillaume Borios on Sun Jul 20 2003. +// Copyright (c) 2003 iOS. All rights reserved. +// + +#import <Cocoa/Cocoa.h> + +#include "src/goom.h" + +@interface GoomFXParam : NSObject { + PluginParam * parametres; + NSProgressIndicator * progress; + NSSlider * slider; + NSButton * button; + + NSTextField * value; +} + +- (GoomFXParam*)initWithParam:(PluginParam*)p; +- (NSView*)makeViewAtHeight:(float)h; +- (void)setValue:(id)sender; + +@end diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.m b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.m new file mode 100755 index 0000000000..dab5dad865 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXParam.m @@ -0,0 +1,213 @@ +// +// GoomFXParam.m +// iGoom copie +// +// Created by Guillaume Borios on Sun Jul 20 2003. +// Copyright (c) 2003 iOS. All rights reserved. +// + +#import "GoomFXParam.h" + +NSMutableDictionary * paramlist = nil; + +void goom_input_stub(PluginParam *_this) +{ + [(GoomFXParam*)[paramlist objectForKey:[NSString stringWithFormat:@"%p",_this]] setValue:nil]; +} + +@implementation GoomFXParam + +- (GoomFXParam*)initWithParam:(PluginParam*)p +{ + self = [super init]; + + if (self) + { + parametres = p; + if (paramlist == nil) paramlist = [[NSMutableDictionary alloc] init]; + [paramlist setObject:self forKey:[NSString stringWithFormat:@"%p",p]]; + } + return self; +} + +- (void)setValue:(id)sender +{ + + switch (parametres->type) + { + case PARAM_INTVAL: + if (parametres->rw == TRUE) + { + if (sender) + { + parametres->param.ival.value = [sender intValue]; + parametres->changed(parametres); + } + else [slider setIntValue:parametres->param.ival.value]; + [value setIntValue:parametres->param.ival.value]; + } + else + { + [progress setDoubleValue:(double)parametres->param.ival.value]; + } + break; + case PARAM_FLOATVAL: + if (parametres->rw == TRUE) + { + if (sender) + { + parametres->param.fval.value = (float)[sender doubleValue]; + parametres->changed(parametres); + } + else [slider setDoubleValue:(double)parametres->param.fval.value]; + [value setDoubleValue:(double)parametres->param.fval.value]; + } + else + { + [progress setDoubleValue:(double)parametres->param.fval.value]; + } + break; + case PARAM_BOOLVAL: + if ((parametres->rw == TRUE) && (sender != nil)) + { + parametres->param.bval.value = ([sender state]==NSOnState); + parametres->changed(parametres); + } + else + { + [button setState:(parametres->param.bval.value == YES)?NSOnState:NSOffState]; + } + break; + case PARAM_STRVAL: + break; + case PARAM_LISTVAL: + break; + default: + break; + } +} + +- (NSView*)makeViewAtHeight:(float)h +{ + NSView * container; + NSTextField * text; + + container = [[NSView alloc] initWithFrame:NSMakeRect(20,h,420,25)]; + + if (parametres->type != PARAM_BOOLVAL) + { + text = [[NSTextField alloc] initWithFrame:NSMakeRect(0,5,214,15)]; + [text setStringValue:[NSString stringWithCString:parametres->name]]; + [text setDrawsBackground:NO]; + [text setSelectable:NO]; + [text setEditable:NO]; + [text setBordered:NO]; + [container addSubview:[text autorelease]]; + } + + + if (parametres->rw == TRUE) + { + switch (parametres->type) + { + case PARAM_INTVAL: + case PARAM_FLOATVAL: + // Value text field + value = [[NSTextField alloc] initWithFrame:NSMakeRect(374,5,214,15)]; + [value setDrawsBackground:NO]; + [value setSelectable:NO]; + [value setEditable:NO]; + [value setBordered:NO]; + + [container addSubview:[value autorelease]]; + //slider + slider = [[NSSlider alloc] initWithFrame:NSMakeRect(222,2,144,20)]; + [slider setAction:@selector(setValue:)]; + [slider setTickMarkPosition:NSTickMarkAbove]; + [slider setTarget:self]; + [container addSubview:[slider autorelease]]; + //values + if (parametres->type == PARAM_INTVAL) + { + [value setIntValue:parametres->param.ival.value]; + [slider setMaxValue:(double)parametres->param.ival.max]; + [slider setMinValue:(double)parametres->param.ival.min]; + [slider setIntValue:parametres->param.ival.value]; + } + else + { + [value setDoubleValue:parametres->param.fval.value]; + [[value cell] setFloatingPointFormat:YES left:1 right:1]; + [slider setMaxValue:(double)parametres->param.fval.max]; + [slider setMinValue:(double)parametres->param.fval.min]; + [slider setDoubleValue:(double)parametres->param.fval.value]; + } + break; + case PARAM_BOOLVAL: + button = [[NSButton alloc] initWithFrame:NSMakeRect(0,2,344,18)]; + [button setEnabled:YES]; + [button setState:(parametres->param.bval.value == YES)?NSOnState:NSOffState]; + [button setTitle:[NSString stringWithCString:parametres->name]]; + [button setButtonType:NSSwitchButton]; + [button setTransparent:NO]; + [button setTarget:self]; + [button setAction:@selector(setValue:)]; + [container addSubview:[button autorelease]]; + break; + case PARAM_STRVAL: + NSLog(@"PARAM_STRVAL rw not implemented"); + break; + case PARAM_LISTVAL: + NSLog(@"PARAM_LISTVAL rw not implemented"); + break; + default: + break; + } + } + else + { + switch (parametres->type) + { + case PARAM_INTVAL: + //slider + progress = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(222,7,144,10)]; + [progress setMaxValue:(double)parametres->param.ival.max]; + [progress setMinValue:(double)parametres->param.ival.min]; + [progress setDoubleValue:(double)parametres->param.ival.value]; + [progress setIndeterminate:NO]; + [container addSubview:[progress autorelease]]; + break; + case PARAM_FLOATVAL: + //slider + progress = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(222,7,144,10)]; + [progress setMaxValue:(double)parametres->param.fval.max]; + [progress setMinValue:(double)parametres->param.fval.min]; + [progress setDoubleValue:(double)parametres->param.fval.value]; + [progress setIndeterminate:NO]; + [container addSubview:[progress autorelease]]; + break; + case PARAM_BOOLVAL: + button = [[NSButton alloc] initWithFrame:NSMakeRect(0,2,344,18)]; + [button setEnabled:NO]; + [button setState:(parametres->param.bval.value == YES)?NSOnState:NSOffState]; + [button setTitle:[NSString stringWithCString:parametres->name]]; + [button setButtonType:NSSwitchButton]; + [button setTransparent:NO]; + [container addSubview:[button autorelease]]; + break; + case PARAM_STRVAL: + NSLog(@"PARAM_STRVAL ro not implemented"); + break; + case PARAM_LISTVAL: + NSLog(@"PARAM_LISTVAL ro not implemented"); + break; + default: + break; + } + parametres->change_listener = goom_input_stub; + } + + return [container autorelease]; +} + +@end diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.h b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.h new file mode 100755 index 0000000000..128eb60fab --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.h @@ -0,0 +1,22 @@ +// +// GoomFXView.h +// iGoom copie +// +// Created by Guillaume Borios on Sun Jul 20 2003. +// Copyright (c) 2003 iOS. All rights reserved. +// + +#import <AppKit/AppKit.h> + +#include "src/goom.h" + +@interface GoomFXView : NSTabView { + + NSMutableArray * params; + @public + float height; +} + +- (id)initWithFrame:(NSRect)frame andFX:(PluginParameters)FX ; + +@end diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.m b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.m new file mode 100755 index 0000000000..c2189f023d --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/GoomFXView.m @@ -0,0 +1,65 @@ +// +// GoomFXView.m +// iGoom copie +// +// Created by Guillaume Borios on Sun Jul 20 2003. +// Copyright (c) 2003 iOS. All rights reserved. +// + +#import "GoomFXView.h" +#import "GoomFXParam.h" + + +@implementation GoomFXView + +- (id)initWithFrame:(NSRect)frame andFX:(PluginParameters)FX { + self = [super initWithFrame:frame]; + if (self) { + int i; + height = 15.0f; + params = [[NSMutableArray alloc] init]; + for (i=0; i < FX.nbParams; i++) + { + if (FX.params[i] != NULL) + { + GoomFXParam * FXP = [[[GoomFXParam alloc]initWithParam:FX.params[i]]autorelease]; + [params addObject:FXP]; + [self addSubview:[FXP makeViewAtHeight:height]]; + height += 29.0f; + } + else + { + height += 12.0f; + } + } + } + + height += 73.0f; + + return self; +} + +- (void)resizeWindow +{ + NSWindow * parent = [self window]; + NSRect frame = [parent frame]; + if (frame.size.height != height) + { + frame.origin.y -= height-frame.size.height; + frame.size.height = height; + [parent setFrame:frame display:NO animate:NO]; + } +} + +- (void)drawRect:(NSRect)rect { + // Drawing code here. +} + +-(void)dealloc +{ + [params release]; + + [super dealloc]; +} + +@end diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.h b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.h new file mode 100755 index 0000000000..90f1a923cc --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.h @@ -0,0 +1,88 @@ +/* + * + Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. + ("Apple") in consideration of your agreement to the following terms, and your + use, installation, modification or redistribution of this Apple software + constitutes acceptance of these terms. If you do not agree with these terms, + please do not use, install, modify or redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and subject + to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs + copyrights in this original Apple software (the "Apple Software"), to use, + reproduce, modify and redistribute the Apple Software, with or without + modifications, in source and/or binary forms; provided that if you redistribute + the Apple Software in its entirety and without modifications, you must retain + this notice and the following text and disclaimers in all such redistributions of + the Apple Software. Neither the name, trademarks, service marks or logos of + Apple Computer, Inc. may be used to endorse or promote products derived from the + Apple Software without specific prior written permission from Apple. Except as + expressly stated in this notice, no other rights or licenses, express or implied, + are granted by Apple herein, including but not limited to any patent rights that + may be infringed by your derivative works or by other works in which the Apple + Software may be incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED + WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN + COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION + OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT + (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#import <Cocoa/Cocoa.h> + +#include <OpenGL/gl.h> +#include <OpenGL/glext.h> +#include <OpenGL/glu.h> + +#include <sys/time.h> +#include <unistd.h> + +#import "Goom.h" + +#define STAT_UPDATE 0.6f +#define IMAGE_DEPTH 32 + +@interface MainOpenGLView : NSOpenGLView +{ + GLubyte *image; + + GLint buffers; + GLint frame_rate; + + GLboolean rect_texture; + GLboolean client_storage; + GLboolean texture_range; + + bool fullscreen; + NSWindow * FullScreenWindow; + IBOutlet NSView * StartingView; + + + struct timeval cycle_time; + + IBOutlet NSTextField *sizeField; + + IBOutlet Goom * myGoom; + + NSTimer* timer; + + @public + float avg_fps; +} + +- (IBAction) clientStorage: (id) sender; +- (IBAction) textureHint: (id) sender; +- (IBAction) rectTextures: (id) sender; + +- (BOOL)canBeHQ; + +@end diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.m b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.m new file mode 100755 index 0000000000..f2bed83169 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MainOpenGLView.m @@ -0,0 +1,249 @@ +#define IMAGE_SIZE (1<<(int)(log(([self bounds].size.width<[self bounds].size.height)?[self bounds].size.width:[self bounds].size.height)/log(2.0f))) + +#include <sys/time.h> +#include <unistd.h> +#include <math.h> + +#include "src/goom.h" + +#include <QuickTime/ImageCompression.h> // for image loading and decompression +#include <QuickTime/QuickTimeComponents.h> // for file type support + +#include <OpenGL/CGLCurrent.h> +#include <OpenGL/CGLContext.h> +#include <OpenGL/gl.h> + +#import "MainOpenGLView.h" + +@implementation MainOpenGLView + +- (void) dealloc +{ + [super dealloc]; +} + +- (id)initWithFrame:(NSRect)frameRect +{ + // Init pixel format attribs + NSOpenGLPixelFormatAttribute attrs[] = + { + // Attributes Common to FullScreen and non-FullScreen + NSOpenGLPFAColorSize, 24, + NSOpenGLPFADepthSize, 16, + NSOpenGLPFADoubleBuffer, + NSOpenGLPFAAccelerated, + NSOpenGLPFANoRecovery, + 0 + }; + + // Get pixel format from OpenGL + NSOpenGLPixelFormat* pixFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; + if (!pixFmt) + { + NSLog(@"No pixel format -- exiting"); + exit(1); + } + + self = [super initWithFrame:frameRect pixelFormat:pixFmt]; + return self; +} +/* +- (void)displayMPixels +{ + static long loop_count = 0; + struct timeval t2; + unsigned long t; + + loop_count++; + + gettimeofday(&t2, NULL); + t = 1000000 * (t2.tv_sec - cycle_time.tv_sec) + (t2.tv_usec - cycle_time.tv_usec); + + // Display the average data rate + if(t > 1000000 * STAT_UPDATE) + { + gettimeofday(&t2, NULL); + t = 1000000 * (t2.tv_sec - cycle_time.tv_sec) + (t2.tv_usec - cycle_time.tv_usec); + gettimeofday(&cycle_time, NULL); + avg_fps = (1000000.0f * (float) loop_count) / (float) t; + + loop_count = 0; + + gettimeofday(&cycle_time, NULL); + } +} +*/ + +- (BOOL)canBeHQ +{ + [[self openGLContext] makeCurrentContext]; + return (strstr(glGetString(GL_EXTENSIONS),"GL_EXT_texture_rectangle") != NULL); +} + + - (void) drawRect:(NSRect)rect + { + // Delegate to our scene object for rendering. + + [[self openGLContext] makeCurrentContext]; + + glViewport(0, 0, (GLsizei) rect.size.width, (GLsizei) rect.size.height); + + //GLfloat clear_color[4] = { 1.0f, 0.0f, 0.0f, 0.0f }; + //glClearColor(clear_color[0], clear_color[1], clear_color[2], clear_color[3]); + //glClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT+GL_STENCIL_BUFFER_BIT); + + [myGoom render]; + + [[self openGLContext] flushBuffer]; + } + + +- (void)update // moved or resized +{ + NSRect rect; + + [myGoom setSize:[self bounds].size]; + + [super update]; + + [[self openGLContext] makeCurrentContext]; + [[self openGLContext] update]; + + rect = [self bounds]; + + glViewport(0, 0, (int) rect.size.width, (int) rect.size.height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + + [self setNeedsDisplay:true]; +} + +- (void)reshape // scrolled, moved or resized +{ + NSRect rect; + + [myGoom setSize:[self bounds].size]; + + [super reshape]; + + [[self openGLContext] makeCurrentContext]; + [[self openGLContext] update]; + + //[myGoom setSize:[self bounds].size]; + + + rect = [self bounds]; + + glViewport(0, 0, (int) rect.size.width, (int) rect.size.height); + + //[self loadTextures:GL_FALSE]; + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + [self setNeedsDisplay:true]; +} + +- (IBAction) clientStorage: (id) sender +{ + [myGoom clientStorage:([sender state]==NSOnState)?GL_TRUE:GL_FALSE]; + + //[self loadTextures:GL_FALSE]; +} + +- (IBAction) rectTextures: (id) sender +{ + [myGoom setHighQuality:(rect_texture==NSOnState)?YES:NO]; + + //[self loadTextures:GL_FALSE]; +} + +- (IBAction) textureHint: (id) sender +{ + int tag = [[sender selectedItem] tag]; + GLenum texture_hint = GL_STORAGE_CACHED_APPLE; + if(tag == 1) texture_hint = GL_STORAGE_PRIVATE_APPLE; + if(tag == 2) texture_hint = GL_STORAGE_SHARED_APPLE; + + [myGoom setTextureHint:texture_hint]; + //[self loadTextures:YES]; +} +/* +- (void)loadTextures: (GLboolean)first +{ + NSLog(@"LoadsTExtures"); + PluginInfo * goomInfos = [myGoom infos]; + + NSRect rect = [self bounds]; + + [[self openGLContext] makeCurrentContext]; + [[self openGLContext] update]; + glEnable(GL_LIGHTING); + if(rect_texture) + { + if(!first) + { + GLint dt = 1; + glDeleteTextures(1, &dt); + } + + goom_set_resolution (goomInfos, rect.size.width, rect.size.height); + + glDisable(GL_TEXTURE_2D); + glEnable(GL_TEXTURE_RECTANGLE_EXT); + glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 1); + + glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL); + + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , texture_hint); + glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, client_storage); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + + glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, [self bounds].size.width, + [self bounds].size.height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, [myGoom getGoomDataWithFPS:avg_fps]); + } + else + { + glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL); + glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL); + + if(!first) + { + GLint dt = 1; + glDeleteTextures(1, &dt); + } + + goom_set_resolution (goomInfos,IMAGE_SIZE, IMAGE_SIZE); + + glDisable(GL_TEXTURE_RECTANGLE_EXT); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, 1); + + glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL); + + glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , texture_hint); + glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, client_storage); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, IMAGE_SIZE, + IMAGE_SIZE, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, [myGoom getGoomDataWithFPS:avg_fps]); + } +} +*/ +@end diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.h b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.h new file mode 100755 index 0000000000..e6b3c375c6 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.h @@ -0,0 +1,45 @@ +/* + * + Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. + ("Apple") in consideration of your agreement to the following terms, and your + use, installation, modification or redistribution of this Apple software + constitutes acceptance of these terms. If you do not agree with these terms, + please do not use, install, modify or redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and subject + to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs + copyrights in this original Apple software (the "Apple Software"), to use, + reproduce, modify and redistribute the Apple Software, with or without + modifications, in source and/or binary forms; provided that if you redistribute + the Apple Software in its entirety and without modifications, you must retain + this notice and the following text and disclaimers in all such redistributions of + the Apple Software. Neither the name, trademarks, service marks or logos of + Apple Computer, Inc. may be used to endorse or promote products derived from the + Apple Software without specific prior written permission from Apple. Except as + expressly stated in this notice, no other rights or licenses, express or implied, + are granted by Apple herein, including but not limited to any patent rights that + may be infringed by your derivative works or by other works in which the Apple + Software may be incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED + WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN + COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION + OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT + (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#import <Cocoa/Cocoa.h> + +@interface MyApplication : NSApplication +{ +} +@end diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.m b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.m new file mode 100755 index 0000000000..38388c86c3 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/MyApplication.m @@ -0,0 +1,57 @@ +/* + * + Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. + ("Apple") in consideration of your agreement to the following terms, and your + use, installation, modification or redistribution of this Apple software + constitutes acceptance of these terms. If you do not agree with these terms, + please do not use, install, modify or redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and subject + to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs + copyrights in this original Apple software (the "Apple Software"), to use, + reproduce, modify and redistribute the Apple Software, with or without + modifications, in source and/or binary forms; provided that if you redistribute + the Apple Software in its entirety and without modifications, you must retain + this notice and the following text and disclaimers in all such redistributions of + the Apple Software. Neither the name, trademarks, service marks or logos of + Apple Computer, Inc. may be used to endorse or promote products derived from the + Apple Software without specific prior written permission from Apple. Except as + expressly stated in this notice, no other rights or licenses, express or implied, + are granted by Apple herein, including but not limited to any patent rights that + may be infringed by your derivative works or by other works in which the Apple + Software may be incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED + WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN + COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION + OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT + (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#import "MyApplication.h" +#import "AppController.h" + +@implementation MyApplication + +- (NSEvent *)nextEventMatchingMask:(unsigned int)mask + untilDate:(NSDate *)expiration inMode:(NSString *)mode dequeue:(BOOL)flag +{ + NSEvent *event; + + event = [super nextEventMatchingMask:mask untilDate:expiration inMode:mode dequeue:flag]; + + //[[self delegate] UpdateDrawing]; + + return event; +} + +@end diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.h b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.h new file mode 100755 index 0000000000..7954b48a14 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.h @@ -0,0 +1,36 @@ +// +// SoundSampler.h +// iGoom +// +// Created by Guillaume Borios on Thu May 27 2004. +// Copyright (c) 2004 iOS. All rights reserved. +// + +#import <Foundation/Foundation.h> +#include <CoreAudio/CoreAudio.h> + + +@interface SoundSampler : NSObject { + + @private + + IBOutlet NSPopUpButton * ODeviceList; + IBOutlet NSSlider * OSoundVolume; + + AudioDeviceID oldDevice, curDevice; + + signed short data[3][2][512]; + int BufferIndexReady, BufferIndexRead, BufferIndexWrite; + NSLock * BufferLock; +} + ++(SoundSampler*)sharedSampler; +-(void*)getData; +-(void) UpdateDeviceList; +-(void)updateBuffer:(const AudioBufferList *)inInputData withDevice:(AudioDeviceID)inDevice; + +-(IBAction)changeAudioDevice:(id)sender; +-(IBAction)changeAudioVolume:(id)sender; +-(void)refreshAudioVolumeInterface:(float)value; + +@end diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.mm b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.mm new file mode 100755 index 0000000000..b9d321b799 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/SoundSampler.mm @@ -0,0 +1,372 @@ +// +// SoundSampler.mm +// iGoom +// +// Created by Guillaume Borios on Thu May 27 2004. +// Copyright (c) 2004 iOS. All rights reserved. +// + +#import "SoundSampler.h" + +#import "CoreAudioHardware.h" +#import "CoreAudioDevice.h" + +#include <sys/types.h> +#include <unistd.h> + +#define kAudioDeviceNone 0 +#define kAudioDeviceUndefined 0xFFFF + + +OSStatus deviceChanged(AudioDeviceID inDevice, UInt32 /*inChannel*/, Boolean inIsInput, AudioDevicePropertyID inPropertyID, void * deviceController) +{ + if (inIsInput) + { + NS_DURING + + switch(inPropertyID) + { + case kAudioDevicePropertyDeviceIsAlive: + case kAudioDevicePropertyHogMode: + case kAudioDevicePropertyDeviceHasChanged: + { + [(SoundSampler*)deviceController UpdateDeviceList]; + CoreAudioDevice theDevice(inDevice); + [(SoundSampler*)deviceController refreshAudioVolumeInterface:theDevice.GetVolumeControlScalarValue(1,kAudioDeviceSectionInput)]; + } + break; + + default: + break; + }; + + NS_HANDLER + NS_ENDHANDLER + } + return 0; +} + +OSStatus devicesChanged(AudioHardwarePropertyID property, void * deviceController) +{ + NS_DURING + + switch(property) + { + case kAudioHardwarePropertyDevices: + [(SoundSampler*)deviceController UpdateDeviceList]; + break; + + default: + break; + }; + + NS_HANDLER + NS_ENDHANDLER + + return 0; +} + +static SoundSampler * sharedInstance = nil; + +@implementation SoundSampler + +-(SoundSampler*)init +{ + self = [super init]; + if (self) + { + if (sharedInstance==nil) sharedInstance = self; + oldDevice = curDevice = kAudioDeviceUndefined; + BufferIndexReady = 2; + BufferIndexRead = 0; + BufferIndexWrite = 1; + BufferLock = [[NSLock alloc] init]; + } + return self; +} + ++(SoundSampler*)sharedSampler +{ + if (sharedInstance==nil) + { + NSLog(@"Error : Sound Sampler invoked to early"); + exit(0); + } + return sharedInstance; +} + +-(void)awakeFromNib +{ + [ODeviceList setAutoenablesItems:NO]; + [self UpdateDeviceList]; + CoreAudioHardware::AddPropertyListener(kAudioHardwarePropertyDevices, (AudioHardwarePropertyListenerProc)devicesChanged, self); +} + +-(void) dealloc +{ + CoreAudioHardware::RemovePropertyListener(kAudioHardwarePropertyDevices, (AudioHardwarePropertyListenerProc)devicesChanged); + [super dealloc]; +} + + +OSStatus myDeviceProc(AudioDeviceID inDevice, const AudioTimeStamp * inNow, + const AudioBufferList * inInputData, + const AudioTimeStamp * inInputTime, + AudioBufferList * outOutputData, + const AudioTimeStamp * inOutputTime, void * inClientData) +{ + [(SoundSampler*)inClientData updateBuffer:inInputData withDevice:inDevice]; +} + +#define maxValue 32567.0f + +-(void)swapBuffersForRead:(BOOL)read +{ + int tmp; + + [BufferLock lock]; + if (read) + { + tmp = BufferIndexRead; + BufferIndexRead = BufferIndexReady; + BufferIndexReady = tmp; + } + else + { + tmp = BufferIndexWrite; + BufferIndexWrite = BufferIndexReady; + BufferIndexReady = tmp; + } + [BufferLock unlock]; +} + +-(void)updateBuffer:(const AudioBufferList *)inInputData withDevice:(AudioDeviceID)inDevice +{ + // WARNING !!! This function assumes the input format is (interleaved) Float32 !!! + int curBuffer; + int curPosition = 512-1; + int i; + for (curBuffer = inInputData->mNumberBuffers-1; (curBuffer >= 0) && (curPosition >= 0); --curBuffer) + { + UInt32 channels = inInputData->mBuffers[curBuffer].mNumberChannels; + UInt32 size = inInputData->mBuffers[curBuffer].mDataByteSize / (sizeof(Float32)*channels); + if ( (channels > 0) && (size > 0) ) + { + if (channels == 1) + { + // We will duplicate the first channel + for (i=size-1; (i >=0 ) && (curPosition >= 0); --i) + { + data[BufferIndexWrite][0][curPosition]=(short)(maxValue * ((Float32*)inInputData->mBuffers[curBuffer].mData)[i]); + data[BufferIndexWrite][1][curPosition]=data[BufferIndexWrite][0][curPosition]; + curPosition--; + } + } + else + { + // Uses only the 2 first channels + for (i=size-1; (i >=0 ) && (curPosition >= 1); --i) + { + data[BufferIndexWrite][0][curPosition]=(short)(maxValue * ((Float32*)inInputData->mBuffers[curBuffer].mData)[i]); + i--; + data[BufferIndexWrite][1][curPosition]=(short)(maxValue * ((Float32*)inInputData->mBuffers[curBuffer].mData)[i]); + curPosition--; + } + } + } + } + [self swapBuffersForRead:NO]; +} + +-(void*)getData +{ + if (oldDevice != curDevice ) + { + // The device changed + + // Stop the old one + if ( (oldDevice != kAudioDeviceUndefined) && (oldDevice != kAudioDeviceNone) ) + { + AudioDeviceStop(oldDevice, myDeviceProc); + AudioDeviceRemoveIOProc(oldDevice, myDeviceProc); + bzero((void*)data,3*2*512*sizeof(short)); + } + oldDevice = curDevice; + + //Start the new one + if ( (curDevice != kAudioDeviceUndefined) && (curDevice != kAudioDeviceNone) ) + { + AudioDeviceAddIOProc(curDevice, myDeviceProc, (void*)self); + AudioDeviceStart(curDevice, myDeviceProc); + } + } + + [self swapBuffersForRead:YES]; + + return (void*)(&(data[BufferIndexRead][0][0])); +} + + + + +-(IBAction)_changeAudioDevice:(AudioDeviceID)device +{ + if (oldDevice==device) return; + + //NSLog(@"Changing audio device from %d to %d",oldDevice,device); + + if ( (oldDevice != kAudioDeviceUndefined) && (oldDevice != kAudioDeviceNone) ) + { + CoreAudioDevice old(oldDevice); + old.RemovePropertyListener(kAudioPropertyWildcardChannel, kAudioPropertyWildcardSection, kAudioPropertyWildcardPropertyID, (AudioDevicePropertyListenerProc)deviceChanged); + } + + curDevice = device; + + if (device == kAudioDeviceNone) + { + [OSoundVolume setEnabled:NO]; + [OSoundVolume setFloatValue:0.0f]; + } + else + { + CoreAudioDevice theDevice(device); + theDevice.AddPropertyListener(kAudioPropertyWildcardChannel, kAudioPropertyWildcardSection, kAudioPropertyWildcardPropertyID, (AudioDevicePropertyListenerProc)deviceChanged, self); + if (theDevice.HasVolumeControl(1,kAudioDeviceSectionInput)) + { + [OSoundVolume setEnabled:theDevice.VolumeControlIsSettable(1,kAudioDeviceSectionInput)]; + [OSoundVolume setFloatValue:theDevice.GetVolumeControlScalarValue(1,kAudioDeviceSectionInput)]; + } + else + { + [OSoundVolume setEnabled:NO]; + [OSoundVolume setFloatValue:0.0f]; + } + } +} + +-(IBAction)changeAudioDevice:(id)sender +{ + //NSLog(@"Will change to %@",[[ODeviceList selectedItem]title]); + [self _changeAudioDevice:[[ODeviceList selectedItem]tag]]; +} + + +-(void) AddDeviceToMenu:(CoreAudioDevice *)dev +{ + if (dev == nil) + { + [ODeviceList addItemWithTitle:[[NSBundle bundleForClass:[self class]] localizedStringForKey:@"None" value:nil table:nil]]; + [[ODeviceList lastItem] setTag:kAudioDeviceNone]; + } + else + { + [ODeviceList addItemWithTitle:@""]; + NSMenuItem* zeItem = [ODeviceList lastItem]; + + NSString* name = (NSString*)dev->name(); + [zeItem setTitle: [[NSBundle bundleForClass:[self class]] localizedStringForKey:name value:nil table:nil]]; + [name release]; + [zeItem setTag: dev->getDeviceID()]; + } +} + + +-(void) UpdateDeviceList +{ + int i,c; + + + // Cleanup + [ODeviceList removeAllItems]; + [self AddDeviceToMenu:nil]; + + + // List devices + int n = CoreAudioHardware::numberOfDevices(); + //NSLog(@"Current device %d",curDevice); + for(i = 0; i < n; i++) + { + CoreAudioDevice theDevice(CoreAudioHardware::deviceAtIndex(i)); + + // select audio devices with input streams only + if (theDevice.numberOfChannels(kAudioDeviceSectionInput) > 0) + { + [self AddDeviceToMenu:&theDevice]; + } + //NSLog(@"Tag %d : %d",i,[ODeviceList lastItem]); + } + + // Set up the new selection + pid_t theHogModeOwner; + + + // Choose the old device, if not hogged... + c = [ODeviceList indexOfItemWithTag: curDevice]; + if (c != -1) + { + CoreAudioDevice dev(CoreAudioHardware::deviceAtIndex(i-1)); + theHogModeOwner = dev.hogModeOwner(); + if ((theHogModeOwner != -1) && (theHogModeOwner != getpid())) + { + c = -1; + } + } + + // Disables all hogged audio inputs, and choose one if necessary and possible + int m = 1; + for (i = 0; i < n; i++) + { + CoreAudioDevice dev(CoreAudioHardware::deviceAtIndex(i)); + if (dev.numberOfChannels(kAudioDeviceSectionInput) > 0) + { + theHogModeOwner = dev.hogModeOwner(); + if ((theHogModeOwner != -1) && (theHogModeOwner != getpid())) + { + NS_DURING + [[ODeviceList itemAtIndex:m] setEnabled:NO]; + NS_HANDLER + //NSLog(@"Exception 1 a pété ! c = %d, i = %d, n = %d, max = %d",c,i,n,[ODeviceList numberOfItems]); + NS_ENDHANDLER + } + else if (c == -1) + { + c = m; + NS_DURING + [self _changeAudioDevice:[[ODeviceList itemAtIndex:c] tag]]; + NS_HANDLER + //NSLog(@"Exception 2 a pété ! c = %d, i = %d, n = %d, max = %d",c,i,n,[ODeviceList numberOfItems]); + NS_ENDHANDLER + } + m++; + } + } + + // If nothing could be selected, choose "None" + if (c == -1) + { + c = 0; + [self _changeAudioDevice:kAudioDeviceNone]; + } + + [ODeviceList selectItemAtIndex:c]; +} + + +-(void)refreshAudioVolumeInterface:(float)value +{ + [OSoundVolume setFloatValue:value]; +} + +-(IBAction)changeAudioVolume:(id)sender +{ + CoreAudioDevice theDevice(curDevice); + if (theDevice.VolumeControlIsSettable(1,kAudioDeviceSectionInput)) + theDevice.SetVolumeControlScalarValue(1,kAudioDeviceSectionInput,[sender floatValue]); + if (theDevice.VolumeControlIsSettable(2,kAudioDeviceSectionInput)) + theDevice.SetVolumeControlScalarValue(2,kAudioDeviceSectionInput,[sender floatValue]); +} + + + +@end diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom-StandAlone.plist b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom-StandAlone.plist new file mode 100755 index 0000000000..bd9a0901b8 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom-StandAlone.plist @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>iGoom</string> + <key>CFBundleGetInfoString</key> + <string></string> + <key>CFBundleIconFile</key> + <string>icon.icns</string> + <key>CFBundleIdentifier</key> + <string>com.ios.igoom.standalone</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string></string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string></string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>2.0</string> + <key>NSMainNibFile</key> + <string>MainMenu</string> + <key>NSPrincipalClass</key> + <string>NSApplication</string> +</dict> +</plist> diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom_Prefix.pch b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom_Prefix.pch new file mode 100755 index 0000000000..13686a200a --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/iGoom_Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'iGoom' target in the 'iGoom' project +// + +#ifdef __OBJC__ + #import <Cocoa/Cocoa.h> +#endif diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/icon.icns b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/icon.icns Binary files differnew file mode 100644 index 0000000000..5eec9d8614 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/icon.icns diff --git a/src/visualizations/Goom/goom2k4-0/mac/StandAlone/main.m b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/main.m new file mode 100755 index 0000000000..b320f38777 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/StandAlone/main.m @@ -0,0 +1,45 @@ +/* + * + Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. + ("Apple") in consideration of your agreement to the following terms, and your + use, installation, modification or redistribution of this Apple software + constitutes acceptance of these terms. If you do not agree with these terms, + please do not use, install, modify or redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and subject + to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs + copyrights in this original Apple software (the "Apple Software"), to use, + reproduce, modify and redistribute the Apple Software, with or without + modifications, in source and/or binary forms; provided that if you redistribute + the Apple Software in its entirety and without modifications, you must retain + this notice and the following text and disclaimers in all such redistributions of + the Apple Software. Neither the name, trademarks, service marks or logos of + Apple Computer, Inc. may be used to endorse or promote products derived from the + Apple Software without specific prior written permission from Apple. Except as + expressly stated in this notice, no other rights or licenses, express or implied, + are granted by Apple herein, including but not limited to any patent rights that + may be infringed by your derivative works or by other works in which the Apple + Software may be incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED + WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN + COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION + OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT + (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#import <Cocoa/Cocoa.h> + +int main(int argc, const char *argv[]) +{ + return NSApplicationMain(argc, argv); +} diff --git a/src/visualizations/Goom/goom2k4-0/mac/iGoom.xcode/project.pbxproj b/src/visualizations/Goom/goom2k4-0/mac/iGoom.xcode/project.pbxproj new file mode 100755 index 0000000000..e29b627bb1 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/iGoom.xcode/project.pbxproj @@ -0,0 +1,1130 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 39; + objects = { + 1058C7A0FEA54F0111CA2CBB = { + children = ( + 1058C7A1FEA54F0111CA2CBB, + 3B336C0906D1537B003DCDCB, + 3B336CD606D159F9003DCDCB, + ); + isa = PBXGroup; + name = "Linked Frameworks"; + refType = 4; + sourceTree = "<group>"; + }; + 1058C7A1FEA54F0111CA2CBB = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = Cocoa.framework; + path = /System/Library/Frameworks/Cocoa.framework; + refType = 0; + sourceTree = "<absolute>"; + }; + 1058C7A2FEA54F0111CA2CBB = { + children = ( + 3BE13CC706D3FE26005DAB04, + 29B97325FDCFA39411CA2CEA, + 29B97324FDCFA39411CA2CEA, + ); + isa = PBXGroup; + name = "Other Frameworks"; + refType = 4; + sourceTree = "<group>"; + }; +//100 +//101 +//102 +//103 +//104 +//190 +//191 +//192 +//193 +//194 + 19C28FACFE9D520D11CA2CBB = { + children = ( + 8D1107320486CEB800E47090, + 3BE13C9406D3FD5D005DAB04, + ); + isa = PBXGroup; + name = Products; + refType = 4; + sourceTree = "<group>"; + }; +//190 +//191 +//192 +//193 +//194 +//290 +//291 +//292 +//293 +//294 + 29B97313FDCFA39411CA2CEA = { + buildSettings = { + }; + buildStyles = ( + 4A9504CCFFE6A4B311CA0CBA, + 4A9504CDFFE6A4B311CA0CBA, + ); + hasScannedForEncodings = 1; + isa = PBXProject; + mainGroup = 29B97314FDCFA39411CA2CEA; + projectDirPath = ""; + targets = ( + 8D1107260486CEB800E47090, + 3BE13C9306D3FD5D005DAB04, + ); + }; + 29B97314FDCFA39411CA2CEA = { + children = ( + 3BE13CAB06D3FDB2005DAB04, + 3BE13C9B06D3FDB2005DAB04, + 3B336D8A06D3DE8E003DCDCB, + 29B97315FDCFA39411CA2CEA, + 29B97323FDCFA39411CA2CEA, + 19C28FACFE9D520D11CA2CBB, + ); + isa = PBXGroup; + name = iGoom; + path = ""; + refType = 4; + sourceTree = "<group>"; + }; + 29B97315FDCFA39411CA2CEA = { + children = ( + 32CA4F630368D1EE00C91783, + ); + isa = PBXGroup; + name = "Other Sources"; + path = ""; + refType = 4; + sourceTree = "<group>"; + }; + 29B97323FDCFA39411CA2CEA = { + children = ( + 3BA6971006D8B8EF007E5D2B, + 3BE13C7E06D3FAE8005DAB04, + 1058C7A0FEA54F0111CA2CBB, + 1058C7A2FEA54F0111CA2CBB, + ); + isa = PBXGroup; + name = Frameworks; + path = ""; + refType = 4; + sourceTree = "<group>"; + }; + 29B97324FDCFA39411CA2CEA = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = AppKit.framework; + path = /System/Library/Frameworks/AppKit.framework; + refType = 0; + sourceTree = "<absolute>"; + }; + 29B97325FDCFA39411CA2CEA = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = Foundation.framework; + path = /System/Library/Frameworks/Foundation.framework; + refType = 0; + sourceTree = "<absolute>"; + }; +//290 +//291 +//292 +//293 +//294 +//320 +//321 +//322 +//323 +//324 + 32CA4F630368D1EE00C91783 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = iGoom_Prefix.pch; + refType = 4; + sourceTree = "<group>"; + }; +//320 +//321 +//322 +//323 +//324 +//3B0 +//3B1 +//3B2 +//3B3 +//3B4 + 3B336C0906D1537B003DCDCB = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = OpenGL.framework; + path = /System/Library/Frameworks/OpenGL.framework; + refType = 0; + sourceTree = "<absolute>"; + }; + 3B336C0A06D1537B003DCDCB = { + fileRef = 3B336C0906D1537B003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336CD606D159F9003DCDCB = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = CoreAudio.framework; + path = /System/Library/Frameworks/CoreAudio.framework; + refType = 0; + sourceTree = "<absolute>"; + }; + 3B336CD706D159F9003DCDCB = { + fileRef = 3B336CD606D159F9003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336D8A06D3DE8E003DCDCB = { + children = ( + 3B336D9A06D3DE8E003DCDCB, + 3B336D8B06D3DE8E003DCDCB, + 3B336D8C06D3DE8E003DCDCB, + 3B336D9D06D3DE8E003DCDCB, + 3B336D9E06D3DE8E003DCDCB, + 3BCD10C30798B01500910E20, + 3BCD10C40798B02D00910E20, + 3B336D9B06D3DE8E003DCDCB, + 3B336D9C06D3DE8E003DCDCB, + 3B336D9306D3DE8E003DCDCB, + 3B336D9406D3DE8E003DCDCB, + 3B336D9506D3DE8E003DCDCB, + 3B336D9606D3DE8E003DCDCB, + 3B336D9706D3DE8E003DCDCB, + 3B336D9806D3DE8E003DCDCB, + ); + isa = PBXGroup; + path = StandAlone; + refType = 4; + sourceTree = "<group>"; + }; + 3B336D8B06D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = AppController.h; + refType = 4; + sourceTree = "<group>"; + }; + 3B336D8C06D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = AppController.m; + refType = 4; + sourceTree = "<group>"; + }; + 3B336D8F06D3DE8E003DCDCB = { + children = ( + 3B336D9006D3DE8E003DCDCB, + ); + isa = PBXVariantGroup; + name = InfoPlist.strings; + path = ""; + refType = 4; + sourceTree = "<group>"; + }; + 3B336D9006D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = text.plist.strings; + name = English; + path = English.lproj/InfoPlist.strings; + refType = 4; + sourceTree = "<group>"; + }; + 3B336D9106D3DE8E003DCDCB = { + children = ( + 3B336D9206D3DE8E003DCDCB, + ); + isa = PBXVariantGroup; + name = MainMenu.nib; + path = ""; + refType = 4; + sourceTree = "<group>"; + }; + 3B336D9206D3DE8E003DCDCB = { + isa = PBXFileReference; + lastKnownFileType = wrapper.nib; + name = English; + path = English.lproj/MainMenu.nib; + refType = 4; + sourceTree = "<group>"; + }; + 3B336D9306D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = Goom.h; + refType = 4; + sourceTree = "<group>"; + }; + 3B336D9406D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = Goom.m; + refType = 4; + sourceTree = "<group>"; + }; + 3B336D9506D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = GoomFXParam.h; + refType = 4; + sourceTree = "<group>"; + }; + 3B336D9606D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = GoomFXParam.m; + refType = 4; + sourceTree = "<group>"; + }; + 3B336D9706D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = GoomFXView.h; + refType = 4; + sourceTree = "<group>"; + }; + 3B336D9806D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = GoomFXView.m; + refType = 4; + sourceTree = "<group>"; + }; + 3B336D9A06D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = main.m; + refType = 4; + sourceTree = "<group>"; + }; + 3B336D9B06D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = MainOpenGLView.h; + refType = 4; + sourceTree = "<group>"; + }; + 3B336D9C06D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = MainOpenGLView.m; + refType = 4; + sourceTree = "<group>"; + }; + 3B336D9D06D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = MyApplication.h; + refType = 4; + sourceTree = "<group>"; + }; + 3B336D9E06D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = MyApplication.m; + refType = 4; + sourceTree = "<group>"; + }; + 3B336D9F06D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SoundSampler.h; + refType = 4; + sourceTree = "<group>"; + }; + 3B336DA006D3DE8E003DCDCB = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.objcpp; + path = SoundSampler.mm; + refType = 4; + sourceTree = "<group>"; + }; + 3B336DA106D3DE8E003DCDCB = { + fileRef = 3B336D8B06D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DA206D3DE8E003DCDCB = { + fileRef = 3B336D8C06D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DA506D3DE8E003DCDCB = { + fileRef = 3B336D8F06D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DA606D3DE8E003DCDCB = { + fileRef = 3B336D9106D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DA706D3DE8E003DCDCB = { + fileRef = 3B336D9306D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DA806D3DE8E003DCDCB = { + fileRef = 3B336D9406D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DA906D3DE8E003DCDCB = { + fileRef = 3B336D9506D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DAA06D3DE8E003DCDCB = { + fileRef = 3B336D9606D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DAB06D3DE8E003DCDCB = { + fileRef = 3B336D9706D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DAC06D3DE8E003DCDCB = { + fileRef = 3B336D9806D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DAE06D3DE8E003DCDCB = { + fileRef = 3B336D9A06D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DAF06D3DE8E003DCDCB = { + fileRef = 3B336D9B06D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DB006D3DE8E003DCDCB = { + fileRef = 3B336D9C06D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DB106D3DE8E003DCDCB = { + fileRef = 3B336D9D06D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DB206D3DE8E003DCDCB = { + fileRef = 3B336D9E06D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DB306D3DE8E003DCDCB = { + fileRef = 3B336D9F06D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336DB406D3DE8E003DCDCB = { + fileRef = 3B336DA006D3DE8E003DCDCB; + isa = PBXBuildFile; + settings = { + }; + }; + 3B336E1206D3F5D2003DCDCB = { + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 3BA696BF06D7FAA2007E5D2B, + ); + isa = PBXCopyFilesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 3B73A57E0798599C001B0B2B = { + isa = PBXFileReference; + lastKnownFileType = image.png; + name = goom2k4.png; + path = ../../goom2k4.png; + refType = 4; + sourceTree = "<group>"; + }; + 3B73A57F0798599C001B0B2B = { + fileRef = 3B73A57E0798599C001B0B2B; + isa = PBXBuildFile; + settings = { + }; + }; + 3B73A60207986421001B0B2B = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = CoreAudioHardware.h; + refType = 4; + sourceTree = "<group>"; + }; + 3B73A60307986421001B0B2B = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = CoreAudioHardware.cpp; + refType = 4; + sourceTree = "<group>"; + }; + 3B73A60407986421001B0B2B = { + fileRef = 3B73A60207986421001B0B2B; + isa = PBXBuildFile; + settings = { + }; + }; + 3B73A60507986421001B0B2B = { + fileRef = 3B73A60307986421001B0B2B; + isa = PBXBuildFile; + settings = { + }; + }; + 3B73A67107986CB2001B0B2B = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = CoreAudioDevice.h; + refType = 4; + sourceTree = "<group>"; + }; + 3B73A67207986CB2001B0B2B = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = CoreAudioDevice.cpp; + refType = 4; + sourceTree = "<group>"; + }; + 3B73A67307986CB2001B0B2B = { + fileRef = 3B73A67107986CB2001B0B2B; + isa = PBXBuildFile; + settings = { + }; + }; + 3B73A67407986CB2001B0B2B = { + fileRef = 3B73A67207986CB2001B0B2B; + isa = PBXBuildFile; + settings = { + }; + }; + 3BA4F62007A1C93D00722D4D = { + fileRef = 3BA7946306D4005C0013ADCC; + isa = PBXBuildFile; + settings = { + }; + }; + 3BA696BE06D7FA9A007E5D2B = { + fileRef = 3BE13C7E06D3FAE8005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BA696BF06D7FAA2007E5D2B = { + fileRef = 3BE13C7E06D3FAE8005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BA6971006D8B8EF007E5D2B = { + isa = PBXFileReference; + lastKnownFileType = archive.ar; + name = libgoom2.0.a; + path = iTunes/libgoom2.0.a; + refType = 4; + sourceTree = "<group>"; + }; + 3BA6971E06D8BCE9007E5D2B = { + fileRef = 3BA6971006D8B8EF007E5D2B; + isa = PBXBuildFile; + settings = { + }; + }; + 3BA7946306D4005C0013ADCC = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = text.xml; + path = "iGoom-StandAlone.plist"; + refType = 4; + sourceTree = "<group>"; + }; + 3BCD10A60798AF8300910E20 = { + children = ( + 3BCD10A70798AF8300910E20, + ); + isa = PBXVariantGroup; + name = Localizable.strings; + path = French.lproj; + refType = 4; + sourceTree = "<group>"; + }; + 3BCD10A70798AF8300910E20 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = text.plist.strings; + name = French; + path = Localizable.strings; + refType = 4; + sourceTree = "<group>"; + }; + 3BCD10A80798AF8300910E20 = { + fileRef = 3BCD10A60798AF8300910E20; + isa = PBXBuildFile; + settings = { + }; + }; + 3BCD10C30798B01500910E20 = { + children = ( + 3B73A67107986CB2001B0B2B, + 3B73A67207986CB2001B0B2B, + 3B73A60207986421001B0B2B, + 3B73A60307986421001B0B2B, + 3B336D9F06D3DE8E003DCDCB, + 3B336DA006D3DE8E003DCDCB, + ); + isa = PBXGroup; + name = AudioRecorder; + refType = 4; + sourceTree = "<group>"; + }; + 3BCD10C40798B02D00910E20 = { + children = ( + 3B73A57E0798599C001B0B2B, + 3BA7946306D4005C0013ADCC, + 3B336D8F06D3DE8E003DCDCB, + 3B336D9106D3DE8E003DCDCB, + 3BCD10A60798AF8300910E20, + 3BCD18E9079A034800910E20, + ); + isa = PBXGroup; + name = Ressources; + refType = 4; + sourceTree = "<group>"; + }; + 3BCD18E9079A034800910E20 = { + isa = PBXFileReference; + lastKnownFileType = image.icns; + path = icon.icns; + refType = 4; + sourceTree = "<group>"; + }; + 3BCD18EA079A034800910E20 = { + fileRef = 3BCD18E9079A034800910E20; + isa = PBXBuildFile; + settings = { + }; + }; + 3BE13C7E06D3FAE8005DAB04 = { + isa = PBXFileReference; + lastKnownFileType = "compiled.mach-o.dylib"; + name = libgoom2.0.dylib; + path = StandAlone/libgoom2.0.dylib; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 3BE13C9006D3FD5D005DAB04 = { + buildActionMask = 2147483647; + files = ( + 3BE13CAC06D3FDB2005DAB04, + 3BE13CAD06D3FDB2005DAB04, + 3BE13CAE06D3FDB2005DAB04, + 3BE13CB006D3FDB2005DAB04, + 3BE13CB106D3FDB2005DAB04, + ); + isa = PBXResourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 3BE13C9106D3FD5D005DAB04 = { + buildActionMask = 2147483647; + files = ( + 3BE13CAF06D3FDB2005DAB04, + 3BE13CBE06D3FE0D005DAB04, + 3BE13D6B06D3FF60005DAB04, + ); + isa = PBXSourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 3BE13C9206D3FD5D005DAB04 = { + buildActionMask = 2147483647; + files = ( + 3BE13CC806D3FE26005DAB04, + 3BA6971E06D8BCE9007E5D2B, + ); + isa = PBXFrameworksBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 3BE13C9306D3FD5D005DAB04 = { + buildPhases = ( + 3BE13C9006D3FD5D005DAB04, + 3BE13C9106D3FD5D005DAB04, + 3BE13C9206D3FD5D005DAB04, + ); + buildRules = ( + ); + buildSettings = { + DSTROOT = "$(USER_LIBRARY_DIR)/iTunes/iTunes Plug-ins/"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h"; + GENERATE_PKGINFO_FILE = YES; + HEADER_SEARCH_PATHS = "/usr/local/include/ ../"; + INFOPLIST_FILE = "iTunes/iGoom-Info.plist"; + INSTALL_PATH = ""; + LIBRARY_SEARCH_PATHS = "$(SRCROOT)/iTunes"; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = "-framework Carbon"; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = iGoom; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; + }; + dependencies = ( + ); + isa = PBXNativeTarget; + name = "iGoom - iTunes"; + productName = iGoom; + productReference = 3BE13C9406D3FD5D005DAB04; + productSettingsXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> +<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\"> +<plist version=\"1.0\"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>iGoom</string> + <key>CFBundleIdentifier</key> + <string>com.yourcompany.iGoom</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1.0</string> + <key>CSResourcesFileMapped</key> + <string>yes</string> +</dict> +</plist> +"; + productType = "com.apple.product-type.bundle"; + }; + 3BE13C9406D3FD5D005DAB04 = { + explicitFileType = wrapper.cfbundle; + includeInIndex = 0; + isa = PBXFileReference; + path = iGoom.bundle; + refType = 3; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3BE13C9506D3FD5D005DAB04 = { + isa = PBXFileReference; + lastKnownFileType = text.xml; + path = "iGoom-Info.plist"; + refType = 4; + sourceTree = "<group>"; + }; + 3BE13C9B06D3FDB2005DAB04 = { + children = ( + 3BE13CBD06D3FE0D005DAB04, + 3BE13D6A06D3FF60005DAB04, + 3BE13C9C06D3FDB2005DAB04, + 3BE13C9E06D3FDB2005DAB04, + 3BE13CA006D3FDB2005DAB04, + 3BE13CA506D3FDB2005DAB04, + 3BE13C9506D3FD5D005DAB04, + ); + isa = PBXGroup; + path = iTunes; + refType = 4; + sourceTree = "<group>"; + }; + 3BE13C9C06D3FDB2005DAB04 = { + children = ( + 3BE13C9D06D3FDB2005DAB04, + 3BE13CA206D3FDB2005DAB04, + ); + isa = PBXVariantGroup; + name = About.strings; + path = ""; + refType = 4; + sourceTree = "<group>"; + }; + 3BE13C9D06D3FDB2005DAB04 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = text.plist.strings; + name = English; + path = English.lproj/About.strings; + refType = 4; + sourceTree = "<group>"; + }; + 3BE13C9E06D3FDB2005DAB04 = { + children = ( + 3BE13C9F06D3FDB2005DAB04, + 3BE13CA306D3FDB2005DAB04, + ); + isa = PBXVariantGroup; + name = InfoPlist.strings; + path = ""; + refType = 4; + sourceTree = "<group>"; + }; + 3BE13C9F06D3FDB2005DAB04 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = text.plist.strings; + name = English; + path = English.lproj/InfoPlist.strings; + refType = 4; + sourceTree = "<group>"; + }; + 3BE13CA006D3FDB2005DAB04 = { + children = ( + 3BE13CA106D3FDB2005DAB04, + 3BE13CA406D3FDB2005DAB04, + ); + isa = PBXVariantGroup; + name = SettingsDialog.nib; + path = ""; + refType = 4; + sourceTree = "<group>"; + }; + 3BE13CA106D3FDB2005DAB04 = { + isa = PBXFileReference; + lastKnownFileType = wrapper.nib; + name = English; + path = English.lproj/SettingsDialog.nib; + refType = 4; + sourceTree = "<group>"; + }; + 3BE13CA206D3FDB2005DAB04 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = text.plist.strings; + name = French; + path = French.lproj/About.strings; + refType = 4; + sourceTree = "<group>"; + }; + 3BE13CA306D3FDB2005DAB04 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = text.plist.strings; + name = French; + path = French.lproj/InfoPlist.strings; + refType = 4; + sourceTree = "<group>"; + }; + 3BE13CA406D3FDB2005DAB04 = { + isa = PBXFileReference; + lastKnownFileType = wrapper.nib; + name = French; + path = French.lproj/SettingsDialog.nib; + refType = 4; + sourceTree = "<group>"; + }; + 3BE13CA506D3FDB2005DAB04 = { + children = ( + 3BE13CA606D3FDB2005DAB04, + 3BE13CA706D3FDB2005DAB04, + 3BE13CA806D3FDB2005DAB04, + ); + isa = PBXGroup; + path = iTuneVisualAPI; + refType = 4; + sourceTree = "<group>"; + }; + 3BE13CA606D3FDB2005DAB04 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.c; + path = iTunesAPI.c; + refType = 4; + sourceTree = "<group>"; + }; + 3BE13CA706D3FDB2005DAB04 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = iTunesAPI.h; + refType = 4; + sourceTree = "<group>"; + }; + 3BE13CA806D3FDB2005DAB04 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = iTunesVisualAPI.h; + refType = 4; + sourceTree = "<group>"; + }; + 3BE13CAB06D3FDB2005DAB04 = { + isa = PBXFileReference; + lastKnownFileType = text.rtf; + path = ReadMe.rtf; + refType = 4; + sourceTree = "<group>"; + }; + 3BE13CAC06D3FDB2005DAB04 = { + fileRef = 3BE13C9C06D3FDB2005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BE13CAD06D3FDB2005DAB04 = { + fileRef = 3BE13C9E06D3FDB2005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BE13CAE06D3FDB2005DAB04 = { + fileRef = 3BE13CA006D3FDB2005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BE13CAF06D3FDB2005DAB04 = { + fileRef = 3BE13CA606D3FDB2005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BE13CB006D3FDB2005DAB04 = { + fileRef = 3BE13CA706D3FDB2005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BE13CB106D3FDB2005DAB04 = { + fileRef = 3BE13CA806D3FDB2005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BE13CBD06D3FE0D005DAB04 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.c; + path = iGoom.c; + refType = 4; + sourceTree = "<group>"; + }; + 3BE13CBE06D3FE0D005DAB04 = { + fileRef = 3BE13CBD06D3FE0D005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BE13CC706D3FE26005DAB04 = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = Carbon.framework; + path = /System/Library/Frameworks/Carbon.framework; + refType = 0; + sourceTree = "<absolute>"; + }; + 3BE13CC806D3FE26005DAB04 = { + fileRef = 3BE13CC706D3FE26005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; + 3BE13D6A06D3FF60005DAB04 = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.asm; + path = ppc_doubling.s; + refType = 4; + sourceTree = "<group>"; + }; + 3BE13D6B06D3FF60005DAB04 = { + fileRef = 3BE13D6A06D3FF60005DAB04; + isa = PBXBuildFile; + settings = { + }; + }; +//3B0 +//3B1 +//3B2 +//3B3 +//3B4 +//4A0 +//4A1 +//4A2 +//4A3 +//4A4 + 4A9504CCFFE6A4B311CA0CBA = { + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + ZERO_LINK = YES; + }; + isa = PBXBuildStyle; + name = Development; + }; + 4A9504CDFFE6A4B311CA0CBA = { + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + ZERO_LINK = NO; + }; + isa = PBXBuildStyle; + name = Deployment; + }; +//4A0 +//4A1 +//4A2 +//4A3 +//4A4 +//8D0 +//8D1 +//8D2 +//8D3 +//8D4 + 8D1107260486CEB800E47090 = { + buildPhases = ( + 8D1107290486CEB800E47090, + 8D11072C0486CEB800E47090, + 8D11072E0486CEB800E47090, + 3B336E1206D3F5D2003DCDCB, + ); + buildRules = ( + ); + buildSettings = { + GCC_DYNAMIC_NO_PIC = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Standalone/iGoom_Prefix.pch; + HEADER_SEARCH_PATHS = "/usr/local/include/ ../"; + INFOPLIST_FILE = "StandAlone/iGoom-StandAlone.plist"; + INSTALL_PATH = "$(HOME)/Applications"; + LIBRARY_SEARCH_PATHS = "$(SRCROOT)/StandAlone"; + LIBRARY_STYLE = STATIC; + OTHER_LDFLAGS = ""; + PRODUCT_NAME = iGoom; + WRAPPER_EXTENSION = app; + }; + dependencies = ( + ); + isa = PBXNativeTarget; + name = "iGoom - StandAlone"; + productInstallPath = "$(HOME)/Applications"; + productName = iGoom; + productReference = 8D1107320486CEB800E47090; + productType = "com.apple.product-type.application"; + }; + 8D1107290486CEB800E47090 = { + buildActionMask = 2147483647; + files = ( + 3B336DA106D3DE8E003DCDCB, + 3B336DA506D3DE8E003DCDCB, + 3B336DA606D3DE8E003DCDCB, + 3B336DA706D3DE8E003DCDCB, + 3B336DA906D3DE8E003DCDCB, + 3B336DAB06D3DE8E003DCDCB, + 3B336DAF06D3DE8E003DCDCB, + 3B336DB106D3DE8E003DCDCB, + 3B336DB306D3DE8E003DCDCB, + 3B73A57F0798599C001B0B2B, + 3B73A60407986421001B0B2B, + 3B73A67307986CB2001B0B2B, + 3BCD10A80798AF8300910E20, + 3BCD18EA079A034800910E20, + 3BA4F62007A1C93D00722D4D, + ); + isa = PBXResourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 8D11072C0486CEB800E47090 = { + buildActionMask = 2147483647; + files = ( + 3B336DA206D3DE8E003DCDCB, + 3B336DA806D3DE8E003DCDCB, + 3B336DAA06D3DE8E003DCDCB, + 3B336DAC06D3DE8E003DCDCB, + 3B336DAE06D3DE8E003DCDCB, + 3B336DB006D3DE8E003DCDCB, + 3B336DB206D3DE8E003DCDCB, + 3B336DB406D3DE8E003DCDCB, + 3B73A60507986421001B0B2B, + 3B73A67407986CB2001B0B2B, + ); + isa = PBXSourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 8D11072E0486CEB800E47090 = { + buildActionMask = 2147483647; + files = ( + 8D11072F0486CEB800E47090, + 3B336C0A06D1537B003DCDCB, + 3B336CD706D159F9003DCDCB, + 3BA696BE06D7FA9A007E5D2B, + ); + isa = PBXFrameworksBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 8D11072F0486CEB800E47090 = { + fileRef = 1058C7A1FEA54F0111CA2CBB; + isa = PBXBuildFile; + settings = { + }; + }; + 8D1107320486CEB800E47090 = { + explicitFileType = wrapper.application; + includeInIndex = 0; + isa = PBXFileReference; + path = iGoom.app; + refType = 3; + sourceTree = BUILT_PRODUCTS_DIR; + }; + }; + rootObject = 29B97313FDCFA39411CA2CEA; +} diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/About.strings b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/About.strings new file mode 100755 index 0000000000..da13a7f257 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/About.strings @@ -0,0 +1,3 @@ +/* Localized versions of about strings */ + +"AboutString" = "Made by Jeko, Gyom and Fred\n \nKeys :\nQ to switch Quality (Pixel Doubling)\nF to toggle frame rate display\nT to disable this display\n< and > to change sensitivity\n \nContact : Gyom (gyom@ios-software.com)"; diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/InfoPlist.strings b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/InfoPlist.strings new file mode 100755 index 0000000000..a782e35463 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/InfoPlist.strings @@ -0,0 +1,7 @@ +/* Localized versions of Info.plist keys */ + +CFBundleName = "iGoom"; +CFBundleShortVersionString = "2.0"; +CFBundleGetInfoString = "iGoom version 2.0, Copyright 2001/2003, iOS."; +NSHumanReadableCopyright = "Copyright 2001/2003, iOS."; +CFBundleVersion = "2.0";
\ No newline at end of file diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/classes.nib b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/classes.nib new file mode 100755 index 0000000000..ea58db1189 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/classes.nib @@ -0,0 +1,4 @@ +{ +IBClasses = (); +IBVersion = 1; +} diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/info.nib b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/info.nib new file mode 100755 index 0000000000..af29c6e4a1 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/info.nib @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>IBDocumentLocation</key> + <string>123 115 356 240 0 0 1280 1002 </string> + <key>IBFramework Version</key> + <string>364.0</string> + <key>IBOpenObjects</key> + <array> + <integer>166</integer> + </array> + <key>IBSystem Version</key> + <string>7M34</string> + <key>targetFramework</key> + <string>IBCarbonFramework</string> +</dict> +</plist> diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/objects.xib b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/objects.xib new file mode 100755 index 0000000000..a1bd3ab781 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/objects.xib @@ -0,0 +1,138 @@ +<?xml version="1.0" standalone="yes"?> +<object class="NSIBObjectData"> + <string name="targetFramework">IBCarbonFramework</string> + <object name="rootObject" class="NSCustomObject" id="1"> + <string name="customClass">NSApplication</string> + </object> + <array count="12" name="allObjects"> + <object class="IBCarbonWindow" id="166"> + <string name="windowRect">226 360 483 751 </string> + <string name="title">Settings</string> + <object name="rootControl" class="IBCarbonRootControl" id="167"> + <string name="bounds">0 0 257 391 </string> + <string name="viewFrame">0 0 391 257 </string> + <array count="10" name="subviews"> + <object class="IBCarbonGroupBox" id="208"> + <string name="bounds">20 20 143 170 </string> + <string name="viewFrame">20 20 150 123 </string> + <boolean name="primary">FALSE</boolean> + </object> + <object class="IBCarbonCheckBox" id="180"> + <string name="bounds">20 194 38 351 </string> + <string name="viewFrame">194 20 157 18 </string> + <ostype name="controlSignature">cbox</ostype> + <int name="controlID">2</int> + <string name="title">Pixel doubling (Q)</string> + </object> + <object class="IBCarbonButton" id="184"> + <string name="bounds">217 163 237 233 </string> + <string name="viewFrame">163 217 70 20 </string> + <int name="controlID">1</int> + <string name="title">OK</string> + <ostype name="command">ok </ostype> + <int name="buttonType">1</int> + </object> + <object class="IBCarbonStaticText" id="185"> + <string name="bounds">72 20 86 170 </string> + <string name="viewFrame">20 72 150 14 </string> + <string name="title">iGoom 2k4</string> + <int name="justification">1</int> + </object> + <object class="IBCarbonStaticText" id="199"> + <string name="bounds">189 30 205 361 </string> + <string name="viewFrame">30 189 331 16 </string> + <string name="title">http://www.ios-software.com/</string> + <int name="justification">1</int> + </object> + <object class="IBCarbonCheckBox" id="201"> + <string name="bounds">46 194 60 351 </string> + <string name="viewFrame">194 46 157 14 </string> + <ostype name="controlSignature">cbox</ostype> + <int name="controlID">3</int> + <string name="title">Show frame rate (F)</string> + </object> + <object class="IBCarbonStaticText" id="203"> + <string name="bounds">165 30 181 361 </string> + <string name="viewFrame">30 165 331 16 </string> + <string name="title">Support and bug report : gyom@ios-software.com</string> + <int name="justification">1</int> + </object> + <object class="IBCarbonSlider" id="204"> + <string name="bounds">119 193 145 371 </string> + <string name="viewFrame">193 119 178 26 </string> + <ostype name="controlSignature">slid</ostype> + <int name="controlID">4</int> + <boolean name="isLive">TRUE</boolean> + <int name="numTickMarks">11</int> + <int name="initialValue">160</int> + <int name="minimumValue">70</int> + <int name="maximumValue">250</int> + </object> + <object class="IBCarbonStaticText" id="205"> + <string name="bounds">99 194 115 371 </string> + <string name="viewFrame">194 99 177 16 </string> + <string name="title">Sensitivity (< and >) :</string> + </object> + <object class="IBCarbonCheckBox" id="209"> + <string name="bounds">68 194 82 371 </string> + <string name="viewFrame">194 68 177 14 </string> + <ostype name="controlSignature">cbox</ostype> + <int name="controlID">5</int> + <string name="title">Show infos when idle (T)</string> + </object> + </array> + </object> + <boolean name="receiveActivates">FALSE</boolean> + <boolean name="receiveUpdates">FALSE</boolean> + <boolean name="hasCollapseBox">FALSE</boolean> + <boolean name="hasHorizontalZoom">FALSE</boolean> + <boolean name="isResizable">FALSE</boolean> + <boolean name="hasVerticalZoom">FALSE</boolean> + <boolean name="compositing">TRUE</boolean> + <int name="carbonWindowClass">4</int> + <int name="windowPosition">1</int> + </object> + <reference idRef="167"/> + <reference idRef="180"/> + <reference idRef="184"/> + <reference idRef="185"/> + <reference idRef="199"/> + <reference idRef="201"/> + <reference idRef="203"/> + <reference idRef="204"/> + <reference idRef="205"/> + <reference idRef="208"/> + <reference idRef="209"/> + </array> + <array count="12" name="allParents"> + <reference idRef="1"/> + <reference idRef="166"/> + <reference idRef="167"/> + <reference idRef="167"/> + <reference idRef="167"/> + <reference idRef="167"/> + <reference idRef="167"/> + <reference idRef="167"/> + <reference idRef="167"/> + <reference idRef="167"/> + <reference idRef="167"/> + <reference idRef="167"/> + </array> + <dictionary count="7" name="nameTable"> + <string>File's Owner</string> + <reference idRef="1"/> + <string>IBCarbonButton</string> + <reference idRef="184"/> + <string>IBCarbonCheckBox</string> + <reference idRef="180"/> + <string>IBCarbonStaticText</string> + <reference idRef="185"/> + <string>IBCarbonStaticText21</string> + <reference idRef="199"/> + <string>IBCarbonStaticText211</string> + <reference idRef="203"/> + <string>PluginSettings</string> + <reference idRef="166"/> + </dictionary> + <unsigned_int name="nextObjectID">210</unsigned_int> +</object> diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/About.strings b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/About.strings new file mode 100755 index 0000000000..04effbffcd --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/About.strings @@ -0,0 +1,3 @@ +/* Localized versions of about strings */ + +"AboutString" = "Ecrit par Jeko, Gyom et Fred\n \nTouches :\nQ pour changer de qualite\nF pour voir la frequence d'affichage\nT pour desactiver cet affichage\n< et > pour modifier la sensibilite\n \nContact : Gyom (gyom@ios-software.com)"; diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/InfoPlist.strings b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/InfoPlist.strings new file mode 100755 index 0000000000..a782e35463 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/InfoPlist.strings @@ -0,0 +1,7 @@ +/* Localized versions of Info.plist keys */ + +CFBundleName = "iGoom"; +CFBundleShortVersionString = "2.0"; +CFBundleGetInfoString = "iGoom version 2.0, Copyright 2001/2003, iOS."; +NSHumanReadableCopyright = "Copyright 2001/2003, iOS."; +CFBundleVersion = "2.0";
\ No newline at end of file diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/classes.nib b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/classes.nib new file mode 100755 index 0000000000..ea58db1189 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/classes.nib @@ -0,0 +1,4 @@ +{ +IBClasses = (); +IBVersion = 1; +} diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/info.nib b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/info.nib new file mode 100755 index 0000000000..af29c6e4a1 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/info.nib @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>IBDocumentLocation</key> + <string>123 115 356 240 0 0 1280 1002 </string> + <key>IBFramework Version</key> + <string>364.0</string> + <key>IBOpenObjects</key> + <array> + <integer>166</integer> + </array> + <key>IBSystem Version</key> + <string>7M34</string> + <key>targetFramework</key> + <string>IBCarbonFramework</string> +</dict> +</plist> diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/objects.xib b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/objects.xib new file mode 100755 index 0000000000..b36e6fc27f --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/objects.xib @@ -0,0 +1,138 @@ +<?xml version="1.0" standalone="yes"?> +<object class="NSIBObjectData"> + <string name="targetFramework">IBCarbonFramework</string> + <object name="rootObject" class="NSCustomObject" id="1"> + <string name="customClass">NSApplication</string> + </object> + <array count="12" name="allObjects"> + <object class="IBCarbonWindow" id="166"> + <string name="windowRect">61 758 318 1149 </string> + <string name="title">Réglages</string> + <object name="rootControl" class="IBCarbonRootControl" id="167"> + <string name="bounds">0 0 257 391 </string> + <string name="viewFrame">0 0 391 257 </string> + <array count="10" name="subviews"> + <object class="IBCarbonGroupBox" id="208"> + <string name="bounds">20 20 143 170 </string> + <string name="viewFrame">20 20 150 123 </string> + <boolean name="primary">FALSE</boolean> + </object> + <object class="IBCarbonCheckBox" id="180"> + <string name="bounds">20 194 38 371 </string> + <string name="viewFrame">194 20 177 18 </string> + <ostype name="controlSignature">cbox</ostype> + <int name="controlID">2</int> + <string name="title">Pixels doublés (Q)</string> + </object> + <object class="IBCarbonButton" id="184"> + <string name="bounds">217 163 237 233 </string> + <string name="viewFrame">163 217 70 20 </string> + <int name="controlID">1</int> + <string name="title">OK</string> + <ostype name="command">ok </ostype> + <int name="buttonType">1</int> + </object> + <object class="IBCarbonStaticText" id="185"> + <string name="bounds">72 20 86 170 </string> + <string name="viewFrame">20 72 150 14 </string> + <string name="title">iGoom 2k4</string> + <int name="justification">1</int> + </object> + <object class="IBCarbonStaticText" id="199"> + <string name="bounds">189 30 205 361 </string> + <string name="viewFrame">30 189 331 16 </string> + <string name="title">http://www.ios-software.com/</string> + <int name="justification">1</int> + </object> + <object class="IBCarbonCheckBox" id="201"> + <string name="bounds">46 194 60 371 </string> + <string name="viewFrame">194 46 177 14 </string> + <ostype name="controlSignature">cbox</ostype> + <int name="controlID">3</int> + <string name="title">Fréquence d'affichage (F)</string> + </object> + <object class="IBCarbonStaticText" id="203"> + <string name="bounds">165 20 181 371 </string> + <string name="viewFrame">20 165 351 16 </string> + <string name="title">Support et retours de bugs : gyom@ios-software.com</string> + <int name="justification">1</int> + </object> + <object class="IBCarbonSlider" id="204"> + <string name="bounds">119 193 145 371 </string> + <string name="viewFrame">193 119 178 26 </string> + <ostype name="controlSignature">slid</ostype> + <int name="controlID">4</int> + <boolean name="isLive">TRUE</boolean> + <int name="numTickMarks">11</int> + <int name="initialValue">160</int> + <int name="minimumValue">70</int> + <int name="maximumValue">250</int> + </object> + <object class="IBCarbonStaticText" id="205"> + <string name="bounds">99 194 115 371 </string> + <string name="viewFrame">194 99 177 16 </string> + <string name="title">Sensibilité (< et >) :</string> + </object> + <object class="IBCarbonCheckBox" id="209"> + <string name="bounds">68 194 82 371 </string> + <string name="viewFrame">194 68 177 14 </string> + <ostype name="controlSignature">cbox</ostype> + <int name="controlID">5</int> + <string name="title">Afficher les infos (T)</string> + </object> + </array> + </object> + <boolean name="receiveActivates">FALSE</boolean> + <boolean name="receiveUpdates">FALSE</boolean> + <boolean name="hasCollapseBox">FALSE</boolean> + <boolean name="hasHorizontalZoom">FALSE</boolean> + <boolean name="isResizable">FALSE</boolean> + <boolean name="hasVerticalZoom">FALSE</boolean> + <boolean name="compositing">TRUE</boolean> + <int name="carbonWindowClass">4</int> + <int name="windowPosition">1</int> + </object> + <reference idRef="167"/> + <reference idRef="180"/> + <reference idRef="184"/> + <reference idRef="185"/> + <reference idRef="199"/> + <reference idRef="201"/> + <reference idRef="203"/> + <reference idRef="204"/> + <reference idRef="205"/> + <reference idRef="208"/> + <reference idRef="209"/> + </array> + <array count="12" name="allParents"> + <reference idRef="1"/> + <reference idRef="166"/> + <reference idRef="167"/> + <reference idRef="167"/> + <reference idRef="167"/> + <reference idRef="167"/> + <reference idRef="167"/> + <reference idRef="167"/> + <reference idRef="167"/> + <reference idRef="167"/> + <reference idRef="167"/> + <reference idRef="167"/> + </array> + <dictionary count="7" name="nameTable"> + <string>File's Owner</string> + <reference idRef="1"/> + <string>IBCarbonButton</string> + <reference idRef="184"/> + <string>IBCarbonCheckBox</string> + <reference idRef="180"/> + <string>IBCarbonStaticText</string> + <reference idRef="185"/> + <string>IBCarbonStaticText21</string> + <reference idRef="199"/> + <string>IBCarbonStaticText211</string> + <reference idRef="203"/> + <string>PluginSettings</string> + <reference idRef="166"/> + </dictionary> + <unsigned_int name="nextObjectID">210</unsigned_int> +</object> diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/Installer.applescript b/src/visualizations/Goom/goom2k4-0/mac/iTunes/Installer.applescript new file mode 100644 index 0000000000..ca1af282df --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/Installer.applescript @@ -0,0 +1 @@ +(* iTunes installer script for iGoom *)
(* If application is running, warn and quit it *)
set pid to do shell script "ps -U ${USER} | grep /Applications/iTunes.app/Contents/MacOS/iTunes | grep -v grep | cut -c1-5"
if pid is not "" then
display dialog "iTunes must not be running while installing. Can I quit it?" with icon 2
tell application "iTunes"
quit
end tell
end if
(* Install the new plugin *)
set cmd to "\\rm -rf ~/\"Library/iTunes/iTunes Plug-ins\"iGoom.bundle"
do shell script cmd
set r to "err"
set cmd to "\\cp -Rf /Volumes/iGoom/iGoom.bundle ~/\"Library/iTunes/iTunes Plug-ins\""
try
do shell script cmd
set r to ""
end try
if r is not "" then
(* Troubleshooting *)
display dialog "There was a problem during installation." buttons {"Open ReadMe", "Forum", "OK"} default button 1 with icon 0
set dresult to button returned of result
if dresult is "Open ReadMe" then
do shell script "open /Volumes/iGoom/ReadMe.rtf"
else
if dresult is "Forum" then
open location "http://www.ios-software.com/?page=forum&quoi=1"
end if
end if
else
(* relaunch, but not too quickly ! *)
set relaunched to false
repeat until relaunched is true
try
tell application "iTunes"
activate
end tell
set relaunched to true
end try
end repeat
(* Select the new plugin et show it if possible *)
tell application "iTunes"
repeat with i in visuals
if name of i is "iGoom" then
set current visual to i
try
set full screen to false
set visuals enabled to true
play first item of library playlists
end try
end if
end repeat
end tell
(* Tell the user the plugin was successfully installed *)
activate
display dialog "Installation was successful. If you like Goom, consider donating or buying some goodies !" buttons {"iOS Store", "Donate", "Use Goom"} default button "iOS Store" with icon 1
set dresult to button returned of result
if dresult is "iOS Store" then
open location "http://www.cafepress.com/iossoftware"
end if
if dresult is "Donate" then
open location "http://www.ios-software.com/?page=index&what=about"
end if
if dresult is "Use Goom" then
tell application "iTunes"
activate
end tell
end if
end if
\ No newline at end of file diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom-Info.plist b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom-Info.plist new file mode 100755 index 0000000000..9e574906e7 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom-Info.plist @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>iGoom</string> + <key>CFBundleGetInfoString</key> + <string>2k4 iGoom for iTunes © gyom & jeko / iOS</string> + <key>CFBundleIdentifier</key> + <string>com.ios.igoom</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>iGoom !</string> + <key>CFBundlePackageType</key> + <string>hvpl</string> + <key>CFBundleShortVersionString</key> + <string>2.4.1</string> + <key>CFBundleSignature</key> + <string>hook</string> + <key>CFBundleVersion</key> + <string>2.4.2</string> + <key>CFPlugInDynamicRegisterFunction</key> + <string></string> + <key>CFPlugInDynamicRegistration</key> + <string>NO</string> + <key>CFPlugInFactories</key> + <dict> + <key>00000000-0000-0000-0000-000000000000</key> + <string>MyFactoryFunction</string> + </dict> + <key>CFPlugInTypes</key> + <dict> + <key>00000000-0000-0000-0000-000000000000</key> + <array> + <string>00000000-0000-0000-0000-000000000000</string> + </array> + </dict> + <key>CFPlugInUnloadFunction</key> + <string></string> + <key>NSMainNibFile</key> + <string></string> +</dict> +</plist> diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom.c b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom.c new file mode 100755 index 0000000000..28deaa10d4 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iGoom.c @@ -0,0 +1,896 @@ +// includes +#include <stdio.h> +#include "iTunesVisualAPI.h" +#include "iTunesAPI.h" +#include "src/goom.h" +#include <CoreFoundation/CFBundle.h> +#include <Carbon/Carbon.h> + +//***************************************************** +#include <stdlib.h> +#include <string.h> +//***************************************************** + +CFStringRef CFBundleIdentifier; + +extern void ppc_doubling(unsigned int,UInt32 *,UInt32 *,UInt32 *,UInt32,UInt32); + +// typedef's, struct's, enum's, etc. +#define kTVisualPluginName "\piGoom" +#define kTVisualPluginCreator 'gyom' +#define kTVisualPluginMajorVersion 2 +#define kTVisualPluginMinorVersion 4 +#define kTVisualPluginReleaseStage betaStage +#define kTVisualPluginNonFinalRelease 1 + +#define VERSION "2k4" + +#define kPixelDoublingPrefName "PixelDoubling" +#define kShowFPSPrefName "ShowFPS" +#define kSensitivityPrefName "Sensitivity" +#define kShowAboutWhenIdlePrefName "ShowAboutWhenIdle" + +//#define Timers + +enum +{ + kOKSettingID = 1, + kPixelDoublingSettingID = 2, + kFrameRateSettingID = 3, + kSensitivitySettingID = 4, + kShowAboutWhenIdleSettingID = 5 +}; + +typedef struct VisualPluginData { + void * appCookie; + ITAppProcPtr appProc; + ITFileSpec pluginFileSpec; + + CGrafPtr destPort; + Rect destRect; + OptionBits destOptions; + UInt32 destBitDepth; + + ITTrackInfo trackInfo; + ITStreamInfo streamInfo; + + Boolean playing; + + // Plugin-specific data + GWorldPtr offscreen; + signed short data[2][512]; +} VisualPluginData; + + +// local (static) globals +//static unsigned int useSpectrum = 0; +static CGrafPtr gSavePort; +static GDHandle gSaveDevice; +static unsigned int changeRes = FALSE; +static unsigned int oldx = 0, oldy = 0; +static signed int forced = 0; +static unsigned int showFPS = 0; +static int showTexte = 0, showTitle = 1; +static Boolean doublePixels = true; +static int sensitivity = 160; +static int ShowAboutWhenIdle = 0; +static AbsoluteTime backUpTime; +static char * aboutMessage; + +static PluginInfo * goomInfo; + + +// exported function prototypes +extern OSStatus iTunesPluginMainMachO(OSType message,PluginMessageInfo *messageInfo,void *refCon); + +// Calcul de diff de temps +#ifdef Timers +static void HowLong(const char* text) +{ + AbsoluteTime absTime; + Nanoseconds nanosec; + + absTime = SubAbsoluteFromAbsolute(UpTime(), backUpTime); + nanosec = AbsoluteToNanoseconds(absTime); + fprintf(stderr,"Time for %s: %f\n", text, (float) UnsignedWideToUInt64( nanosec ) / 1000000.0); + backUpTime = UpTime(); +} +#else +#define HowLong(a) +#endif + +// ProcessRenderData --> preprocessing des donnees en entrŽe +static void ProcessRenderData(VisualPluginData *visualPluginData,const RenderVisualData *renderData) +{ + SInt16 index; + SInt32 channel; + + if (renderData == nil) + { + bzero(&visualPluginData->data,sizeof(visualPluginData->data)); + return; + } + else + { + for (channel = 0;channel < 2;channel++) + { + for (index = 0; index < 512; index++) + visualPluginData->data[channel][index] = (renderData->waveformData[channel][index]-127)*sensitivity; + } + } +} + +// GetPortCopyBitsBitMap +// +static BitMap* GetPortCopyBitsBitMap(CGrafPtr port) +{ + BitMap* destBMap; + +#if ACCESSOR_CALLS_ARE_FUNCTIONS + destBMap = (BitMap*)GetPortBitMapForCopyBits(port); +#else +#if OPAQUE_TOOLBOX_STRUCTS + PixMapHandle pixMap; + + pixMap = GetPortPixMap(port); + destBMap = (BitMap*) (*pixMap); +#else + destBMap = (BitMap*) &((GrafPtr)port)->portBits; +#endif +#endif + return destBMap; +} + +// RenderVisualPort +/* OK, This is pretty weird : if we are not in pixel doubling mode, +the goom internal buffer is copied on destPort via CopyBits(). +Now, if we are in pixel doubling mode : if we are full screen, +the goom internal buffer is copied on another buffer with ppc_doubling() +and then to destPort with CopyBits().*/ + +char * Str255ToC(Str255 source) +{ + static char dst[255]; + char * cur = dst, * src = (char*)source; + int i; + int size = *src; + if (source == NULL) return ""; + src++; + for (i=0; i<size; i++) + { + *cur = *src; + switch (*cur) + { + case 'Ë' : + *cur = 'A'; + break; + case 'ˆ' : + case '‡' : + case 'Š' : + case '‰' : + *cur = 'a'; + break; + case 'æ' : + case 'é' : + case 'ƒ' : + *cur = 'E'; + break; + case 'Ž' : + case '' : + case '' : + case '‘' : + *cur = 'e'; + break; + case '“' : + case '•' : + case '”' : + case '’' : + *cur = 'i'; + break; + case '–' : + *cur = 'n'; + break; + case '' : + *cur = 'c'; + break; + case '˜' : + case '—' : + case 'š' : + case '™' : + *cur = 'o'; + break; + case '' : + case 'œ' : + case 'ž' : + case 'Ÿ' : + *cur = 'u'; + break; + default : break; + } + src++; + cur++; + } + *cur = 0; + return dst; +} + +static void RenderVisualPort(VisualPluginData *visualPluginData,CGrafPtr destPort,const Rect *destRect,Boolean onlyUpdate) +{ + BitMap* srcBitMap; + BitMap* dstBitMap; + unsigned int right, bottom; + Rect srcRect= *destRect; + Rect dstRect = srcRect; + int fullscreen; + static GWorldPtr offscreen; + PixMapHandle pixMapHdl = GetGWorldPixMap(visualPluginData->offscreen); + Point pt = {0,0}; + static float fpssampler = 0; + static char textBuffer[15]; + static char titleBuffer[255]; + unsigned char * str, * str2; + + AbsoluteTime absTime; + Nanoseconds nanosec; + + LocalToGlobal(&pt); + fullscreen = (pt.v == 0); + + if ((NULL == destPort) || (NULL == destRect) || (NULL == visualPluginData->offscreen)) return; + + absTime = SubAbsoluteFromAbsolute(UpTime(), backUpTime); + nanosec = AbsoluteToNanoseconds(absTime); + fpssampler = 1000000000.0 / (float) UnsignedWideToUInt64( nanosec ); + if (fpssampler>35) return; + backUpTime = UpTime(); + + + GetGWorld(&gSavePort,&gSaveDevice); + SetGWorld(destPort,nil); + + srcBitMap = GetPortCopyBitsBitMap(visualPluginData->offscreen); + dstBitMap = GetPortCopyBitsBitMap(destPort); + + OffsetRect(&srcRect,-srcRect.left,-srcRect.top); + if (!pixMapHdl || !*pixMapHdl) return; + + right = srcRect.right; + bottom = srcRect.bottom; + if ((right<2) || (bottom<2)) return; + + // Update our offscreen pixmap + if ((changeRes) || (oldx != right) || (oldy != bottom)) + { + if (doublePixels) + goom_set_resolution (goomInfo,right%2 + right/2, bottom/2 + bottom%2); + else + goom_set_resolution (goomInfo,right, bottom); + oldx = right; + oldy = bottom; + changeRes = FALSE; + } + + str2 = NULL; + if (showTitle == 0) + { + strcpy(titleBuffer, Str255ToC(visualPluginData->trackInfo.name)); + str2 = titleBuffer; + str = " "; + showTexte = 10000; + } + else + { + if (ShowAboutWhenIdle) + { + switch (showTexte) + { + case 0: + str2 = " "; + sprintf(textBuffer,"The iGoom %s",VERSION); + str = textBuffer; + break; + case 500: + str = "http://www.ios-software.com/"; + break; + case 1000 : + str = aboutMessage; + break; + default : + str = NULL; + break; + } + } + else + { + str = " "; + } + } + + if (doublePixels) + { + UInt32 rowBytes = (GetPixRowBytes(pixMapHdl))>>2; + register UInt32 *myX = (UInt32*) GetPixBaseAddr(pixMapHdl); + register UInt32 inc = 2*rowBytes - right - right%2; + register UInt32 *myx = (UInt32*) goom_update (goomInfo,visualPluginData->data,forced,(showFPS > 0)?fpssampler:-1,str2,str); + + ppc_doubling(right/2 + right%2, myx, myX, myX + rowBytes, bottom/2,inc*4); + srcBitMap = GetPortCopyBitsBitMap(visualPluginData->offscreen); + CopyBits(srcBitMap,dstBitMap,&srcRect,&dstRect,srcCopy,nil); + } + else + { + NewGWorldFromPtr(&offscreen, k32ARGBPixelFormat,&srcRect, NULL, NULL, 0, (Ptr) goom_update (goomInfo,visualPluginData->data,forced, (showFPS > 0)?fpssampler:-1, str2, str), right*4); + HowLong("Goom"); + srcBitMap = GetPortCopyBitsBitMap(offscreen); + CopyBits(srcBitMap,dstBitMap,&srcRect,&dstRect,srcCopy,nil); + DisposeGWorld(offscreen); + } + showTexte++; + if (showTexte>10000) showTexte = 10000; + showTitle = 1; + if (forced>0) forced = -1; + + SetGWorld(gSavePort,gSaveDevice); +} + + +/* AllocateVisualData is where you should allocate any information that depends +on the port or rect changing (like offscreen GWorlds). */ +static OSStatus AllocateVisualData(VisualPluginData *visualPluginData,CGrafPtr destPort,const Rect *destRect) +{ + OSStatus status; + Rect allocateRect; + + (void) destPort; + + GetGWorld(&gSavePort,&gSaveDevice); + + allocateRect = *destRect; + OffsetRect(&allocateRect,-allocateRect.left,-allocateRect.top); + + status = NewGWorld(&visualPluginData->offscreen,32,&allocateRect,nil,nil,useTempMem); + if (status == noErr) + { + PixMapHandle pix = GetGWorldPixMap(visualPluginData->offscreen); + LockPixels(pix); + + // Offscreen starts out black + SetGWorld(visualPluginData->offscreen,nil); + ForeColor(blackColor); + PaintRect(&allocateRect); + } + SetGWorld(gSavePort,gSaveDevice); + + return status; +} + +// DeallocateVisualData is where you should deallocate the . +static void DeallocateVisualData(VisualPluginData *visualPluginData) +{ + CFPreferencesAppSynchronize(CFBundleIdentifier); + + if (visualPluginData->offscreen != nil) + { + DisposeGWorld(visualPluginData->offscreen); + visualPluginData->offscreen = nil; + } +} + +// ChangeVisualPort +static OSStatus ChangeVisualPort(VisualPluginData *visualPluginData,CGrafPtr destPort,const Rect *destRect) +{ + OSStatus status; + Boolean doAllocate; + Boolean doDeallocate; + + status = noErr; + + doAllocate = false; + doDeallocate = false; + + if (destPort != nil) + { + if (visualPluginData->destPort != nil) + { + if (false == EqualRect(destRect,&visualPluginData->destRect)) + { + doDeallocate = true; + doAllocate = true; + } + } + else + { + doAllocate = true; + } + } + else + { + doDeallocate = true; + } + + if (doDeallocate) + DeallocateVisualData(visualPluginData); + + if (doAllocate) + status = AllocateVisualData(visualPluginData,destPort,destRect); + + if (status != noErr) + destPort = nil; + + visualPluginData->destPort = destPort; + if (destRect != nil) + visualPluginData->destRect = *destRect; + + return status; +} + +// ResetRenderData +static void ResetRenderData(VisualPluginData *visualPluginData) +{ + bzero(&visualPluginData->data,sizeof(visualPluginData->data)); +} + +// settingsControlHandler +pascal OSStatus settingsControlHandler(EventHandlerCallRef inRef,EventRef inEvent, void* userData) +{ + WindowRef wind=NULL; + ControlID controlID; + ControlRef control=NULL; + //get control hit by event + GetEventParameter(inEvent,kEventParamDirectObject,typeControlRef,NULL,sizeof(ControlRef),NULL,&control); + wind=GetControlOwner(control); + GetControlID(control,&controlID); + switch(controlID.id){ + + case kShowAboutWhenIdleSettingID: + ShowAboutWhenIdle = GetControlValue(control); + CFPreferencesSetAppValue (CFSTR(kShowAboutWhenIdlePrefName),ShowAboutWhenIdle?CFSTR("YES"):CFSTR("NO"),CFBundleIdentifier); + break; + + case kPixelDoublingSettingID: + doublePixels = GetControlValue(control); + CFPreferencesSetAppValue (CFSTR(kPixelDoublingPrefName),doublePixels?CFSTR("YES"):CFSTR("NO"),CFBundleIdentifier); + changeRes = TRUE; + break; + + case kFrameRateSettingID: + showFPS = GetControlValue( control ); + CFPreferencesSetAppValue (CFSTR(kShowFPSPrefName),showFPS?CFSTR("YES"):CFSTR("NO"),CFBundleIdentifier); + break; + + case kSensitivitySettingID: + sensitivity = GetControlValue( control ); + { + CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &sensitivity); + CFPreferencesSetAppValue (CFSTR(kSensitivityPrefName), value, CFBundleIdentifier); + CFRelease(value); + } + break; + + case kOKSettingID: + HideWindow(wind); + break; + } + return noErr; +} + +// VisualPluginHandler +static OSStatus VisualPluginHandler(OSType message,VisualPluginMessageInfo *messageInfo,void *refCon) +{ + OSStatus status; + VisualPluginData * visualPluginData; + + visualPluginData = (VisualPluginData*) refCon; + + status = noErr; + + switch (message) + { + // Sent when the visual plugin is registered. The plugin should do minimal + // memory allocations here. The resource fork of the plugin is still available. + case kVisualPluginInitMessage: + { + visualPluginData = (VisualPluginData*) NewPtrClear(sizeof(VisualPluginData)); + if (visualPluginData == nil) + { + status = memFullErr; + break; + } + visualPluginData->appCookie = messageInfo->u.initMessage.appCookie; + visualPluginData->appProc = messageInfo->u.initMessage.appProc; + // Remember the file spec of our plugin file. + // We need this so we can open our resource fork during + // the configuration message + + status = PlayerGetPluginFileSpec(visualPluginData->appCookie, visualPluginData->appProc, &visualPluginData->pluginFileSpec); + messageInfo->u.initMessage.refCon = (void*) visualPluginData; + goomInfo = goom_init(100,100); + + //fprintf(stderr,"Loc : %s\n", CFStringGetCStringPtr(CFCopyLocalizedStringFromTableInBundle(CFSTR("AboutString"), CFSTR("About"), CFBundleGetBundleWithIdentifier(CFBundleIdentifier), NULL),kCFStringEncodingMacRoman)); + + aboutMessage = (char*)CFStringGetCStringPtr(CFCopyLocalizedStringFromTableInBundle(CFSTR("AboutString"), CFSTR("About"), CFBundleGetBundleWithIdentifier(CFBundleIdentifier), NULL),kCFStringEncodingMacRoman); + + break; + } + + // Sent when the visual plugin is unloaded + case kVisualPluginCleanupMessage: + if (visualPluginData != nil) + DisposePtr((Ptr)visualPluginData); + + goom_close(goomInfo); + break; + + // Sent when the visual plugin is enabled. iTunes currently enables all + // loaded visual plugins. The plugin should not do anything here. + case kVisualPluginEnableMessage: + if (true == visualPluginData->playing) + { + showTexte = 10000; + showTitle = 0; + } + else + { + showTexte = 0; + showTitle = 1; + } + case kVisualPluginDisableMessage: + break; + + // Sent if the plugin requests idle messages. Do this by setting the kVisualWantsIdleMessages + // option in the RegisterVisualMessage.options field. + case kVisualPluginIdleMessage: + RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,false); + break; + + // Sent if the plugin requests the ability for the user to configure it. Do this by setting + // the kVisualWantsConfigure option in the RegisterVisualMessage.options field. + case kVisualPluginConfigureMessage: + { + + // kOKSettingID = 1, + //kPixelDoublingSettingID = 2, + //kFrameRateSettingID = 3, + //kSensitivitySettingID = 4 + + static EventTypeSpec controlEvent={kEventClassControl,kEventControlHit}; + static const ControlID kPixelDoublingSettingControlID={'cbox',kPixelDoublingSettingID}; + static const ControlID kFrameRateSettingControlID={'cbox',kFrameRateSettingID}; + static const ControlID kSensitivitySettingControlID={'slid',kSensitivitySettingID}; + static const ControlID kShowAboutWhenIdleSettingControlID={'cbox',kShowAboutWhenIdleSettingID}; + static WindowRef settingsDialog=NULL; + static ControlRef PixelDoublingCTRL=NULL; + static ControlRef FrameRateCTRL=NULL; + static ControlRef SensitivityCTRL=NULL; + static ControlRef ShowAboutWhenIdleCTRL=NULL; + + if(settingsDialog==NULL){ + IBNibRef nibRef; + CFBundleRef iGoomPlugin; + //we have to find our bundle to load the nib inside of it + iGoomPlugin=CFBundleGetBundleWithIdentifier(CFBundleIdentifier); + CreateNibReferenceWithCFBundle(iGoomPlugin,CFSTR("SettingsDialog"), &nibRef); + CreateWindowFromNib(nibRef, CFSTR("PluginSettings"), &settingsDialog); + DisposeNibReference(nibRef); + + + //fprintf (stderr,"Picture @ %d\n", (PicHandle)GetPicture (12866)); + + InstallWindowEventHandler(settingsDialog,NewEventHandlerUPP(settingsControlHandler), + 1,&controlEvent,0,NULL); + GetControlByID(settingsDialog,&kPixelDoublingSettingControlID,&PixelDoublingCTRL); + GetControlByID(settingsDialog,&kFrameRateSettingControlID,&FrameRateCTRL); + GetControlByID(settingsDialog,&kSensitivitySettingControlID,&SensitivityCTRL); + GetControlByID(settingsDialog,&kShowAboutWhenIdleSettingControlID,&ShowAboutWhenIdleCTRL); + } + SetControlValue(PixelDoublingCTRL,doublePixels); + SetControlValue(FrameRateCTRL,showFPS); + SetControlValue(SensitivityCTRL,sensitivity); + SetControlValue(ShowAboutWhenIdleCTRL,ShowAboutWhenIdle); + + ShowWindow(settingsDialog); + } + break; + + // Sent when iTunes is going to show the visual plugin in a port. At + // this point,the plugin should allocate any large buffers it needs. + case kVisualPluginShowWindowMessage: + if (true == visualPluginData->playing) + { + showTexte = 10000; + showTitle = 0; + } + else + { + showTexte = 0; + showTitle = 1; + } + visualPluginData->destOptions = messageInfo->u.showWindowMessage.options; + status = ChangeVisualPort( visualPluginData, messageInfo->u.showWindowMessage.port, + &messageInfo->u.showWindowMessage.drawRect); + //FIXME setres here + break; + // Sent when iTunes is no longer displayed. + case kVisualPluginHideWindowMessage: + + (void) ChangeVisualPort(visualPluginData,nil,nil); + + bzero(&visualPluginData->trackInfo,sizeof(visualPluginData->trackInfo)); + bzero(&visualPluginData->streamInfo,sizeof(visualPluginData->streamInfo)); + break; + + // Sent when iTunes needs to change the port or rectangle of the currently + // displayed visual. + case kVisualPluginSetWindowMessage: + visualPluginData->destOptions = messageInfo->u.setWindowMessage.options; + + status = ChangeVisualPort( visualPluginData, + messageInfo->u.setWindowMessage.port, + &messageInfo->u.setWindowMessage.drawRect); + break; + + // Sent for the visual plugin to render a frame. + case kVisualPluginRenderMessage: + ProcessRenderData(visualPluginData,messageInfo->u.renderMessage.renderData); + RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,false); + break; + + // Sent in response to an update event. The visual plugin should update + // into its remembered port. This will only be sent if the plugin has been + // previously given a ShowWindow message. + case kVisualPluginUpdateMessage: + RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,true); + break; + + // Sent when the player starts. + case kVisualPluginPlayMessage: + if (messageInfo->u.playMessage.trackInfo != nil) + visualPluginData->trackInfo = *messageInfo->u.playMessage.trackInfo; + else + bzero(&visualPluginData->trackInfo,sizeof(visualPluginData->trackInfo)); + + if (messageInfo->u.playMessage.streamInfo != nil) + visualPluginData->streamInfo = *messageInfo->u.playMessage.streamInfo; + else + bzero(&visualPluginData->streamInfo,sizeof(visualPluginData->streamInfo)); + + visualPluginData->playing = true; + showTexte = 10000; + showTitle = 0; + break; + + // Sent when the player changes the current track information. This + // is used when the information about a track changes,or when the CD + // moves onto the next track. The visual plugin should update any displayed + // information about the currently playing song. + case kVisualPluginChangeTrackMessage: + if (messageInfo->u.changeTrackMessage.trackInfo != nil) + visualPluginData->trackInfo = *messageInfo->u.changeTrackMessage.trackInfo; + else + bzero(&visualPluginData->trackInfo,sizeof(visualPluginData->trackInfo)); + + if (messageInfo->u.changeTrackMessage.streamInfo != nil) + visualPluginData->streamInfo = *messageInfo->u.changeTrackMessage.streamInfo; + else + bzero(&visualPluginData->streamInfo,sizeof(visualPluginData->streamInfo)); + showTexte = 10000; + showTitle = 0; + break; + + // Sent when the player stops. + case kVisualPluginStopMessage: + visualPluginData->playing = false; + ResetRenderData(visualPluginData); + //RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,true); + showTexte = 0; + showTitle = 1; + break; + + // Sent when the player changes position. + case kVisualPluginSetPositionMessage: + break; + + // Sent when the player pauses. iTunes does not currently use pause or unpause. + // A pause in iTunes is handled by stopping and remembering the position. + case kVisualPluginPauseMessage: + visualPluginData->playing = false; + ResetRenderData(visualPluginData); + //RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,true); + break; + + // Sent when the player unpauses. iTunes does not currently use pause or unpause. + // A pause in iTunes is handled by stopping and remembering the position. + case kVisualPluginUnpauseMessage: + visualPluginData->playing = true; + break; + + // Sent to the plugin in response to a MacOS event. The plugin should return noErr + // for any event it handles completely,or an error (unimpErr) if iTunes should handle it. + case kVisualPluginEventMessage: + { + EventRecord* tEventPtr = messageInfo->u.eventMessage.event; + if ((tEventPtr->what == keyDown) || (tEventPtr->what == autoKey)) + { // charCodeMask,keyCodeMask; + char theChar = tEventPtr->message & charCodeMask; + + switch (theChar) // Process keys here + { + + case 't': + case 'T': + ShowAboutWhenIdle = (ShowAboutWhenIdle==0)?1:0; + CFPreferencesSetAppValue (CFSTR(kShowAboutWhenIdlePrefName),ShowAboutWhenIdle?CFSTR("YES"):CFSTR("NO"), CFBundleIdentifier); + break; + case 'q': + case 'Q': + doublePixels = (doublePixels==0)?1:0; + CFPreferencesSetAppValue (CFSTR(kPixelDoublingPrefName),doublePixels?CFSTR("YES"):CFSTR("NO"), CFBundleIdentifier); + changeRes = TRUE; + break; + case '0': + forced = (forced == 0) ? -1 : 0; + break; + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + forced = theChar - '0'; + break; + case 'f': + case 'F': + showFPS = (showFPS==0)?1:0; + CFPreferencesSetAppValue (CFSTR(kShowFPSPrefName),showFPS?CFSTR("YES"):CFSTR("NO"),CFBundleIdentifier); + break; + + case '>': + if (sensitivity <= 240) sensitivity += 10; + { + CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &sensitivity); + CFPreferencesSetAppValue (CFSTR(kSensitivityPrefName), value, CFBundleIdentifier); + CFRelease(value); + } + break; + case '<': + if (sensitivity >= 80) sensitivity -= 10; + { + CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &sensitivity); + CFPreferencesSetAppValue (CFSTR(kSensitivityPrefName), value, CFBundleIdentifier); + CFRelease(value); + } + break; + + case '\r': + case '\n': + break; + default: + status = unimpErr; + break; + } + } + else + status = unimpErr; + } + break; + + default: + status = unimpErr; + break; + } + return status; +} + +// RegisterVisualPlugin +static OSStatus RegisterVisualPlugin(PluginMessageInfo *messageInfo) +{ + OSStatus status; + PlayerMessageInfo playerMessageInfo; + Str255 pluginName = kTVisualPluginName; +#ifdef Timers + backUpTime = UpTime(); +#endif + + CFStringRef aString; + CFNumberRef aNumber; + CFComparisonResult result; + + CFBundleIdentifier = CFSTR("com.ios.igoom"); + + // Read the preferences + aString = CFPreferencesCopyAppValue(CFSTR(kPixelDoublingPrefName),CFBundleIdentifier); + if (aString != NULL) + { + result = CFStringCompareWithOptions(aString, CFSTR("YES"), CFRangeMake(0,CFStringGetLength(aString)), kCFCompareCaseInsensitive); + if (result == kCFCompareEqualTo) { + doublePixels = true; + } + else doublePixels = false; + } + + aString = CFPreferencesCopyAppValue(CFSTR(kShowFPSPrefName),CFBundleIdentifier); + if (aString != NULL) + { + result = CFStringCompareWithOptions(aString, CFSTR("YES"), CFRangeMake(0,CFStringGetLength(aString)), kCFCompareCaseInsensitive); + if (result == kCFCompareEqualTo) { + showFPS = true; + } + else showFPS = false; + } + + aString = CFPreferencesCopyAppValue(CFSTR(kShowAboutWhenIdlePrefName),CFBundleIdentifier); + if (aString != NULL) + { + result = CFStringCompareWithOptions(aString, CFSTR("YES"), CFRangeMake(0,CFStringGetLength(aString)), kCFCompareCaseInsensitive); + if (result == kCFCompareEqualTo) { + ShowAboutWhenIdle = true; + } + else ShowAboutWhenIdle = false; + } + + aNumber = CFPreferencesCopyAppValue(CFSTR(kSensitivityPrefName),CFBundleIdentifier); + if (aNumber != NULL) + { + CFNumberGetValue(aNumber,kCFNumberIntType,&sensitivity); + } + + + + + bzero(&playerMessageInfo.u.registerVisualPluginMessage,sizeof(playerMessageInfo.u.registerVisualPluginMessage)); + BlockMoveData((Ptr)&pluginName[0],(Ptr)&playerMessageInfo.u.registerVisualPluginMessage.name[0],pluginName[0] + 1); + + SetNumVersion(&playerMessageInfo.u.registerVisualPluginMessage.pluginVersion, kTVisualPluginMajorVersion, kTVisualPluginMinorVersion, kTVisualPluginReleaseStage, kTVisualPluginNonFinalRelease); + + playerMessageInfo.u.registerVisualPluginMessage.options = kVisualWantsIdleMessages | kVisualWantsConfigure; + playerMessageInfo.u.registerVisualPluginMessage.handler = (VisualPluginProcPtr)VisualPluginHandler; + playerMessageInfo.u.registerVisualPluginMessage.registerRefCon = 0; + playerMessageInfo.u.registerVisualPluginMessage.creator = kTVisualPluginCreator; + + playerMessageInfo.u.registerVisualPluginMessage.timeBetweenDataInMS = 0xFFFFFFFF; // 16 milliseconds = 1 Tick, 0xFFFFFFFF = Often as possible. + playerMessageInfo.u.registerVisualPluginMessage.numWaveformChannels = 2; + playerMessageInfo.u.registerVisualPluginMessage.numSpectrumChannels = 0; + + playerMessageInfo.u.registerVisualPluginMessage.minWidth = 100; + playerMessageInfo.u.registerVisualPluginMessage.minHeight = 100; + playerMessageInfo.u.registerVisualPluginMessage.maxWidth = 2000; + playerMessageInfo.u.registerVisualPluginMessage.maxHeight = 2000; + playerMessageInfo.u.registerVisualPluginMessage.minFullScreenBitDepth = 32; + playerMessageInfo.u.registerVisualPluginMessage.maxFullScreenBitDepth = 32; + playerMessageInfo.u.registerVisualPluginMessage.windowAlignmentInBytes = 0; + + status = PlayerRegisterVisualPlugin(messageInfo->u.initMessage.appCookie,messageInfo->u.initMessage.appProc,&playerMessageInfo); +/* + Gestalt(gestaltPowerPCProcessorFeatures,&CPU); + if (1 & (CPU >> gestaltPowerPCHasVectorInstructions)) CPU_FLAVOUR = 1; + else CPU_FLAVOUR = 0; +*/ + + return status; +} + +// main entrypoint +OSStatus iTunesPluginMainMachO(OSType message,PluginMessageInfo *messageInfo,void *refCon) +{ + OSStatus status; + + (void) refCon; + + switch (message) + { + case kPluginInitMessage: + status = RegisterVisualPlugin(messageInfo); + break; + case kPluginCleanupMessage: + status = noErr; + break; + default: + status = unimpErr; + break; + } + + return status; +} diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.c b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.c new file mode 100755 index 0000000000..ef68202c2a --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.c @@ -0,0 +1 @@ +/*
File: iTunesAPI.c
Contains: iTunes Plug-ins interfaces
Version: Technology: iTunes
Release: 1.1
Copyright: © 2001 by Apple Computer, Inc., all rights reserved.
Bugs?: For bug reports, consult the following page on
the World Wide Web:
http://developer.apple.com/bugreporter/
*/
#include "iTunesAPI.h"
#include "iTunesVisualAPI.h"
// MemClear
//
static void MemClear (LogicalAddress dest, SInt32 length)
{
register unsigned char *ptr;
ptr = (unsigned char *) dest;
if( length > 16 )
{
register unsigned long *longPtr;
while( ((unsigned long) ptr & 3) != 0 )
{
*ptr++ = 0;
--length;
}
longPtr = (unsigned long *) ptr;
while( length >= 4 )
{
*longPtr++ = 0;
length -= 4;
}
ptr = (unsigned char *) longPtr;
}
while( --length >= 0 )
{
*ptr++ = 0;
}
}
// SetNumVersion
//
void SetNumVersion (NumVersion *numVersion, UInt8 majorRev, UInt8 minorAndBugRev, UInt8 stage, UInt8 nonRelRev)
{
numVersion->majorRev = majorRev;
numVersion->minorAndBugRev = minorAndBugRev;
numVersion->stage = stage;
numVersion->nonRelRev = nonRelRev;
}
// ITCallApplication
//
OSStatus ITCallApplication (void *appCookie, ITAppProcPtr handler, OSType message, PlayerMessageInfo *messageInfo)
{
PlayerMessageInfo localMessageInfo;
if (messageInfo == nil)
{
MemClear(&localMessageInfo, sizeof(localMessageInfo));
messageInfo = &localMessageInfo;
}
messageInfo->messageMajorVersion = kITCurrentPluginMajorMessageVersion;
messageInfo->messageMinorVersion = kITCurrentPluginMinorMessageVersion;
messageInfo->messageInfoSize = sizeof(PlayerMessageInfo);
return handler(appCookie, message, messageInfo);
}
// PlayerSetFullScreen
//
OSStatus PlayerSetFullScreen (void *appCookie, ITAppProcPtr appProc, Boolean fullScreen)
{
PlayerMessageInfo messageInfo;
MemClear(&messageInfo, sizeof(messageInfo));
messageInfo.u.setFullScreenMessage.fullScreen = fullScreen;
return ITCallApplication(appCookie, appProc, kPlayerSetFullScreenMessage, &messageInfo);
}
// PlayerSetFullScreenOptions
//
OSStatus PlayerSetFullScreenOptions (void *appCookie, ITAppProcPtr appProc, SInt16 minBitDepth, SInt16 maxBitDepth, SInt16 preferredBitDepth, SInt16 desiredWidth, SInt16 desiredHeight)
{
PlayerMessageInfo messageInfo;
MemClear(&messageInfo, sizeof(messageInfo));
messageInfo.u.setFullScreenOptionsMessage.minBitDepth = minBitDepth;
messageInfo.u.setFullScreenOptionsMessage.maxBitDepth = maxBitDepth;
messageInfo.u.setFullScreenOptionsMessage.preferredBitDepth = preferredBitDepth;
messageInfo.u.setFullScreenOptionsMessage.desiredWidth = desiredWidth;
messageInfo.u.setFullScreenOptionsMessage.desiredHeight = desiredHeight;
return ITCallApplication(appCookie, appProc, kPlayerSetFullScreenOptionsMessage, &messageInfo);
}
// PlayerGetPluginData
//
OSStatus PlayerGetPluginData (void *appCookie, ITAppProcPtr appProc, void *dataPtr, UInt32 dataBufferSize, UInt32 *dataSize)
{
OSStatus status;
PlayerMessageInfo messageInfo;
MemClear(&messageInfo, sizeof(messageInfo));
messageInfo.u.getPluginDataMessage.dataPtr = dataPtr;
messageInfo.u.getPluginDataMessage.dataBufferSize = dataBufferSize;
status = ITCallApplication(appCookie, appProc, kPlayerGetPluginDataMessage, &messageInfo);
if (dataSize != nil)
*dataSize = messageInfo.u.getPluginDataMessage.dataSize;
return status;
}
// PlayerSetPluginData
//
OSStatus PlayerSetPluginData (void *appCookie, ITAppProcPtr appProc, void *dataPtr, UInt32 dataSize)
{
PlayerMessageInfo messageInfo;
MemClear(&messageInfo, sizeof(messageInfo));
messageInfo.u.setPluginDataMessage.dataPtr = dataPtr;
messageInfo.u.setPluginDataMessage.dataSize = dataSize;
return ITCallApplication(appCookie, appProc, kPlayerSetPluginDataMessage, &messageInfo);
}
// PlayerGetPluginNamedData
//
OSStatus PlayerGetPluginNamedData (void *appCookie, ITAppProcPtr appProc, ConstStringPtr dataName, void *dataPtr, UInt32 dataBufferSize, UInt32 *dataSize)
{
OSStatus status;
PlayerMessageInfo messageInfo;
MemClear(&messageInfo, sizeof(messageInfo));
messageInfo.u.getPluginNamedDataMessage.dataName = dataName;
messageInfo.u.getPluginNamedDataMessage.dataPtr = dataPtr;
messageInfo.u.getPluginNamedDataMessage.dataBufferSize = dataBufferSize;
status = ITCallApplication(appCookie, appProc, kPlayerGetPluginNamedDataMessage, &messageInfo);
if (dataSize != nil)
*dataSize = messageInfo.u.getPluginNamedDataMessage.dataSize;
return status;
}
// PlayerSetPluginNamedData
//
OSStatus PlayerSetPluginNamedData (void *appCookie, ITAppProcPtr appProc, ConstStringPtr dataName, void *dataPtr, UInt32 dataSize)
{
PlayerMessageInfo messageInfo;
MemClear(&messageInfo, sizeof(messageInfo));
messageInfo.u.setPluginNamedDataMessage.dataName = dataName;
messageInfo.u.setPluginNamedDataMessage.dataPtr = dataPtr;
messageInfo.u.setPluginNamedDataMessage.dataSize = dataSize;
return ITCallApplication(appCookie, appProc, kPlayerSetPluginNamedDataMessage, &messageInfo);
}
// PlayerIdle
//
OSStatus PlayerIdle (void *appCookie, ITAppProcPtr appProc)
{
return ITCallApplication(appCookie, appProc, kPlayerIdleMessage, nil);
}
// PlayerShowAbout
//
void PlayerShowAbout (void *appCookie, ITAppProcPtr appProc)
{
ITCallApplication(appCookie, appProc, kPlayerShowAboutMessage, nil);
}
// PlayerOpenURL
//
void PlayerOpenURL (void *appCookie, ITAppProcPtr appProc, SInt8 *string, UInt32 length)
{
PlayerMessageInfo messageInfo;
MemClear(&messageInfo, sizeof(messageInfo));
messageInfo.u.openURLMessage.url = string;
messageInfo.u.openURLMessage.length = length;
ITCallApplication(appCookie, appProc, kPlayerOpenURLMessage, &messageInfo);
}
// PlayerUnregisterPlugin
//
OSStatus PlayerUnregisterPlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo)
{
return ITCallApplication(appCookie, appProc, kPlayerUnregisterPluginMessage, messageInfo);
}
// PlayerRegisterVisualPlugin
//
OSStatus PlayerRegisterVisualPlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo)
{
return ITCallApplication(appCookie, appProc, kPlayerRegisterVisualPluginMessage, messageInfo);
}
// PlayerRegisterDevicePlugin
//
OSStatus PlayerRegisterDevicePlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo)
{
return ITCallApplication(appCookie, appProc, kPlayerRegisterDevicePluginMessage, messageInfo);
}
// PlayerSetDeviceSerialNumber
//
OSStatus PlayerSetDeviceSerialNumber (void *appCookie, ITAppProcPtr appProc, ConstStringPtr serialNumber)
{
PlayerMessageInfo messageInfo;
MemClear(&messageInfo, sizeof(messageInfo));
messageInfo.u.setDeviceSerialNumberMessage.serialNumber = serialNumber;
return ITCallApplication(appCookie, appProc, kPlayerSetDeviceSerialNumberMessage, &messageInfo);
}
// PlayerHandleMacOSEvent
//
OSStatus PlayerHandleMacOSEvent (void *appCookie, ITAppProcPtr appProc, const EventRecord *theEvent, Boolean *eventHandled)
{
PlayerMessageInfo messageInfo;
OSStatus status;
MemClear(&messageInfo, sizeof(messageInfo));
messageInfo.u.handleMacOSEventMessage.theEvent = theEvent;
status = ITCallApplication(appCookie, appProc, kPlayerHandleMacOSEventMessage, &messageInfo);
if( eventHandled != nil )
*eventHandled = messageInfo.u.handleMacOSEventMessage.handled;
return status;
}
// PlayerGetPluginFileSpec
//
OSStatus PlayerGetPluginFileSpec (void *appCookie, ITAppProcPtr appProc, FSSpec *pluginFileSpec)
{
PlayerMessageInfo messageInfo;
MemClear(&messageInfo, sizeof(messageInfo));
messageInfo.u.getPluginFileSpecMessage.fileSpec = pluginFileSpec;
return ITCallApplication(appCookie, appProc, kPlayerGetPluginFileSpecMessage, &messageInfo);
}
\ No newline at end of file diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.h b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.h new file mode 100755 index 0000000000..69e651d862 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.h @@ -0,0 +1 @@ +/*
File: iTunesAPI.h
Contains: iTunes Plug-ins interfaces
Version: Technology: iTunes
Release: 1.1
Copyright: � 2001 by Apple Computer, Inc., all rights reserved.
Bugs?: For bug reports, consult the following page on
the World Wide Web:
http://developer.apple.com/bugreporter/
*/
#ifndef __ITUNESAPI__
#define __ITUNESAPI__
#include <Carbon/Carbon.h>
/*
#if PRAGMA_ONCE
#pragma once
#endif
*/
#ifdef __cplusplus
extern "C" {
#endif
/*
#if PRAGMA_STRUCT_ALIGN
#pragma options align=power
#elif PRAGMA_STRUCT_PACKPUSH
#pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
#pragma pack(2)
#endif
*/
enum {
kITCurrentPluginMajorMessageVersion = 10,
kITCurrentPluginMinorMessageVersion = 1
};
enum {
kTrackSupportsID3Tags = (1L << 0),
kTrackHasVariableBitRate = (1L << 1),
kTrackIsFolder = (1L << 2), /* Device tracks only. Information returned is for a folder */
kTrackIsLocked = (1L << 3), /* Device tracks only. Track cannot be deleted or renamed */
kTrackCanBeDownloaded = (1L << 4), /* Device tracks only. Track can be copied from device to desktop. */
kTrackIsHidden = (1L << 5) /* Device tracks only. Track should not be displayed in the device window. */
};
typedef OptionBits ITTrackAttributes;
enum {
/*
These mask values are specified in ITTrackInfo.validFields
to indicate which fields contain valid data
*/
kITTINameFieldMask = (1L << 0),
kITTIFileNameFieldMask = (1L << 1),
kITTIArtistFieldMask = (1L << 2),
kITTIAlbumFieldMask = (1L << 3),
kITTIGenreFieldMask = (1L << 4),
kITTIKindFieldMask = (1L << 5),
kITTITrackNumberFieldsMask = (1L << 6),
kITTIYearFieldMask = (1L << 7),
kITTISoundVolumeFieldMask = (1L << 8),
kITTICommentsFieldMask = (1L << 10),
kITTITotalTimeFieldMask = (1L << 11),
kITTIStartTimeFieldMask = (1L << 12),
kITTIStopTimeFieldMask = (1L << 13),
kITTISizeFieldMask = (1L << 14),
kITTIBitRateFieldMask = (1L << 15),
kITTISampleRateFieldMask = (1L << 16),
kITTIAttributesFieldMask = (1L << 17),
kITTIFileTypeFieldMask = (1L << 18),
kITTIDateFieldMask = (1L << 19)
};
typedef OptionBits ITTIFieldMask;
struct ITTrackInfo {
ITTIFieldMask validFields;
UInt32 reserved; /* Must be zero */
Str255 name;
Str255 fileName;
Str255 artist;
Str255 album;
Str255 genre;
Str255 kind;
UInt32 trackNumber;
UInt32 numTracks;
UInt16 year;
SInt16 soundVolumeAdjustment; /* Valid range is -255 to +255 */
Str255 unusedReserved1; /* Must be empty string */
Str255 comments;
UInt32 totalTimeInMS;
UInt32 startTimeInMS;
UInt32 stopTimeInMS;
UInt32 sizeInBytes;
UInt32 bitRate;
UInt32 sampleRateFixed;
OSType fileType;
UInt32 date;
UInt32 unusedReserved2; /* Must be zero */
ITTrackAttributes attributes;
ITTrackAttributes validAttributes; /* Mask indicating which attributes are applicable */
};
typedef struct ITTrackInfo ITTrackInfo;
enum {
kCurrentITStreamInfoVersion = 1
};
typedef FSSpec ITFileSpec;
struct ITFileLocation {
ITFileSpec spec;
FInfo fInfo;
};
typedef struct ITFileLocation ITFileLocation;
struct ITStreamInfo {
SInt32 version;
Str255 streamTitle;
Str255 streamURL;
Str255 streamMessage;
};
typedef struct ITStreamInfo ITStreamInfo;
enum {
/* messages sent to plugin main */
kPluginInitMessage = 'init',
kPluginCleanupMessage = 'clr ',
kPluginIdleMessage = 'idle'
};
enum {
/* PluginInitMessage.options */
kPluginWantsIdleMessages = (1L << 1), /* Send idle messages to plugin main */
kPluginWantsToBeLeftOpen = (1L << 2) /* Don't close this plugin just because */
/* it didn't register anyone */
};
enum {
/* iTunes API messages */
kPlayerRegisterVisualPluginMessage = 'rvis', /* Register a visual plugin */
kPlayerRegisterDevicePluginMessage = 'rdev', /* Register a device plugin */
/* Available for all plugins */
kPlayerIdleMessage = 'idle', /* Give iTunes some time */
kPlayerShowAboutMessage = 'abou', /* Show the about box. */
kPlayerOpenURLMessage = 'url ', /* Open a URL */
kPlayerSetPluginDataMessage = 'sprf', /* Set plugin preferences */
kPlayerGetPluginDataMessage = 'gprf', /* Get plugin preferences */
kPlayerSetPluginNamedDataMessage = 'snpr', /* Set plugin named preferenes */
kPlayerGetPluginNamedDataMessage = 'gnpr', /* Get plugin named preferenes */
kPlayerHandleMacOSEventMessage = 'evnt', /* Tell player to handle unhandled event */
kPlayerGetPluginFileSpecMessage = 'pspc', /* Get the location of the plugin executable */
/* Available for visual plugins */
kPlayerSetFullScreenMessage = 'sful', /* Set full screen mode */
kPlayerSetFullScreenOptionsMessage = 'sfop', /* Set full screen options */
/* Available for device plugins */
kPlayerSetDeviceSerialNumberMessage = 'dvsn', /* Set a serial number string for a device. Needed for per-device prefs */
kPlayerUnregisterPluginMessage = 'unrg' /* Unregister the plugin this comes from */
};
typedef OSStatus (*ITAppProcPtr)(void *appCookie, OSType message,void *messageInfo);
/*
Plugin main Messages
*/
struct PluginInitMessage {
UInt32 majorVersion; /* Input */
UInt32 minorVersion; /* Input */
void * appCookie; /* Input */
ITAppProcPtr appProc; /* Input */
OptionBits options; /* Output, see above for values */
void * refCon; /* Output */
};
typedef struct PluginInitMessage PluginInitMessage;
struct PluginMessageInfo {
union {
PluginInitMessage initMessage;
} u;
};
typedef struct PluginMessageInfo PluginMessageInfo;
/* Plugin main entry point message handler */
typedef OSStatus (*PluginProcPtr)(OSType message, PluginMessageInfo *messageInfo, void *refCon);
/* Visual plugin message handler */
typedef OSStatus (*VisualPluginProcPtr)(OSType message,void *messageInfo, void *refCon);
/* Device plugin message handler */
typedef OSStatus (*DevicePluginProcPtr)(OSType message,void *messageInfo, void *refCon);
/*
Callbacks to iTunes
*/
enum {
/* PlayerRegisterVisualPluginMessage.options */
kVisualWantsIdleMessages = (1L << 3),
kVisualWantsConfigure = (1L << 5)
};
struct PlayerRegisterVisualPluginMessage {
/* Input from plugin */
Str63 name; /* Displayed in the Visual menu */
OptionBits options; /* See above */
OSType creator; /* Identifies the plugin */
NumVersion pluginVersion; /* Version number of the plugin */
VisualPluginProcPtr handler; /* Handler for the plugin's messages */
void * registerRefCon; /* RefCon for the plugin's handler */
UInt32 timeBetweenDataInMS; /* How often to call the plugin (0xFFFFFFFF = as often as possible) */
UInt32 numWaveformChannels; /* 0-2 waveforms requested */
UInt32 numSpectrumChannels; /* 0-2 spectrums requested */
SInt16 minWidth; /* Minimum resizeable width */
SInt16 minHeight; /* Minimum resizeable height */
SInt16 maxWidth; /* Maximum resizeable width */
SInt16 maxHeight; /* Maximum resizeable height */
UInt16 minFullScreenBitDepth; /* 0 = Any */
UInt16 maxFullScreenBitDepth; /* 0 = Any */
UInt16 windowAlignmentInBytes; /* Reserved (should be zero) */
};
typedef struct PlayerRegisterVisualPluginMessage PlayerRegisterVisualPluginMessage;
enum {
/* PlayerRegisterDevicePluginMessage.options */
kDeviceWantsIdleMessages = (1L << 0)
};
struct PlayerRegisterDevicePluginMessage {
/* Input from plugin */
Str63 name; /* Used internally. Not currently displayed */
OptionBits options; /* See above */
NumVersion pluginVersion; /* Version number of the plugin */
DevicePluginProcPtr handler; /* Handler for the plugin's messages */
void * registerRefCon; /* RefCon for the plugin's handler */
UInt32 reserved[2]; /* Must be zero */
};
typedef struct PlayerRegisterDevicePluginMessage PlayerRegisterDevicePluginMessage;
struct PlayerSetFullScreenMessage {
Boolean fullScreen;
};
typedef struct PlayerSetFullScreenMessage PlayerSetFullScreenMessage;
struct PlayerSetFullScreenOptionsMessage {
SInt16 minBitDepth; /* 0 = Any */
SInt16 maxBitDepth; /* 0 = Any */
SInt16 preferredBitDepth; /* 0 = Current */
SInt16 desiredWidth; /* Must be within minWidth & maxWidth */
SInt16 desiredHeight; /* Must be within minHeight & maxHeight */
};
typedef struct PlayerSetFullScreenOptionsMessage PlayerSetFullScreenOptionsMessage;
struct PlayerOpenURLMessage {
SInt8 * url;
UInt32 length;
};
typedef struct PlayerOpenURLMessage PlayerOpenURLMessage;
struct PlayerSetPluginDataMessage {
void * dataPtr; /* Input */
UInt32 dataSize; /* Input */
};
typedef struct PlayerSetPluginDataMessage PlayerSetPluginDataMessage;
struct PlayerGetPluginDataMessage {
void * dataPtr; /* Input */
UInt32 dataBufferSize; /* Input */
UInt32 dataSize; /* Output */
};
typedef struct PlayerGetPluginDataMessage PlayerGetPluginDataMessage;
struct PlayerSetPluginNamedDataMessage {
ConstStringPtr dataName; /* Input */
void * dataPtr; /* Input */
UInt32 dataSize; /* Input */
};
typedef struct PlayerSetPluginNamedDataMessage PlayerSetPluginNamedDataMessage;
struct PlayerGetPluginNamedDataMessage {
ConstStringPtr dataName; /* Input */
void * dataPtr; /* Input */
UInt32 dataBufferSize; /* Input */
UInt32 dataSize; /* Output */
};
typedef struct PlayerGetPluginNamedDataMessage PlayerGetPluginNamedDataMessage;
struct PlayerHandleMacOSEventMessage {
const EventRecord * theEvent; /* Input */
Boolean handled; /* Output */
};
typedef struct PlayerHandleMacOSEventMessage PlayerHandleMacOSEventMessage;
struct PlayerGetPluginFileSpecMessage {
FSSpec * fileSpec; /* Output */
};
typedef struct PlayerGetPluginFileSpecMessage PlayerGetPluginFileSpecMessage;
struct PlayerSetDeviceSerialNumberMessage {
ConstStringPtr serialNumber; /* Input */
};
typedef struct PlayerSetDeviceSerialNumberMessage PlayerSetDeviceSerialNumberMessage;
struct PlayerMessageInfo {
UInt32 messageMajorVersion; /* Should be kITCurrentPluginMajorMessageVersion */
UInt32 messageMinorVersion; /* Should be kITCurrentPluginMinorMessageVersion */
UInt32 messageInfoSize; /* Should be sizeof(PlayerMessageInfo) */
union {
PlayerRegisterVisualPluginMessage registerVisualPluginMessage;
PlayerRegisterDevicePluginMessage registerDevicePluginMessage;
PlayerOpenURLMessage openURLMessage;
PlayerSetPluginDataMessage setPluginDataMessage;
PlayerGetPluginDataMessage getPluginDataMessage;
PlayerSetPluginNamedDataMessage setPluginNamedDataMessage;
PlayerGetPluginNamedDataMessage getPluginNamedDataMessage;
PlayerHandleMacOSEventMessage handleMacOSEventMessage;
PlayerGetPluginFileSpecMessage getPluginFileSpecMessage;
PlayerSetFullScreenMessage setFullScreenMessage;
PlayerSetFullScreenOptionsMessage setFullScreenOptionsMessage;
PlayerSetDeviceSerialNumberMessage setDeviceSerialNumberMessage;
} u;
};
typedef struct PlayerMessageInfo PlayerMessageInfo;
extern OSStatus ITCallApplication (void *appCookie, ITAppProcPtr appProc, OSType message, PlayerMessageInfo *messageInfo);
extern void SetNumVersion (NumVersion *numVersion, UInt8 majorRev, UInt8 minorAndBugRev, UInt8 stage, UInt8 nonRelRev);
/* for use from plugin main */
extern OSStatus PlayerRegisterVisualPlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo);
extern OSStatus PlayerRegisterDevicePlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo);
/* For all plugins */
extern OSStatus PlayerIdle (void *appCookie, ITAppProcPtr appProc);
extern void PlayerShowAbout (void *appCookie, ITAppProcPtr appProc);
extern void PlayerOpenURL (void *appCookie, ITAppProcPtr appProc, SInt8 *string, UInt32 length);
extern OSStatus PlayerGetPluginData (void *appCookie, ITAppProcPtr appProc, void *dataPtr, UInt32 dataBufferSize, UInt32 *dataSize);
extern OSStatus PlayerSetPluginData (void *appCookie, ITAppProcPtr appProc, void *dataPtr, UInt32 dataSize);
extern OSStatus PlayerGetPluginNamedData (void *appCookie, ITAppProcPtr appProc, ConstStringPtr dataName, void *dataPtr, UInt32 dataBufferSize, UInt32 *dataSize);
extern OSStatus PlayerSetPluginNamedData (void *appCookie, ITAppProcPtr appProc, ConstStringPtr dataName, void *dataPtr, UInt32 dataSize);
extern OSStatus PlayerHandleMacOSEvent (void *appCookie, ITAppProcPtr appProc, const EventRecord *theEvent, Boolean *eventHandled);
extern OSStatus PlayerGetPluginFileSpec (void *appCookie, ITAppProcPtr appProc, FSSpec *pluginFileSpec);
/* For visual plugins */
extern OSStatus PlayerSetFullScreen (void *appCookie, ITAppProcPtr appProc, Boolean fullScreen);
extern OSStatus PlayerSetFullScreenOptions (void *appCookie, ITAppProcPtr appProc, SInt16 minBitDepth, SInt16 maxBitDepth, SInt16 preferredBitDepth, SInt16 desiredWidth, SInt16 desiredHeight);
/* For device plugins */
extern OSStatus PlayerSetDeviceSerialNumber (void *appCookie, ITAppProcPtr appProc, ConstStringPtr serialNumber);
extern OSStatus PlayerUnregisterPlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo);
/*
#if PRAGMA_STRUCT_ALIGN
#pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
#pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
#pragma pack()
#endif
*/
#ifdef __cplusplus
}
#endif
#endif /* __ITUNESAPI__ */
\ No newline at end of file diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesVisualAPI.h b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesVisualAPI.h new file mode 100755 index 0000000000..a63f977285 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesVisualAPI.h @@ -0,0 +1 @@ +/*
File: iTunesVisualAPI.h
Contains: iTunes Visual Plug-ins interfaces
Version: Technology: iTunes
Release: 1.1
Copyright: � 2001 by Apple Computer, Inc., all rights reserved.
Bugs?: For bug reports, consult the following page on
the World Wide Web:
http://developer.apple.com/bugreporter/
*/
#ifndef __ITUNESVISUALAPI__
#define __ITUNESVISUALAPI__
#include "iTunesAPI.h"
/*
#if PRAGMA_ONCE
#pragma once
#endif
*/
#ifdef __cplusplus
extern "C" {
#endif
/*
#if PRAGMA_STRUCT_ALIGN
#pragma options align=power
#elif PRAGMA_STRUCT_PACKPUSH
#pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
#pragma pack(2)
#endif
*/
enum {
/* VisualPlugin messages */
kVisualPluginIdleMessage = 'null',
kVisualPluginInitMessage = 'init',
kVisualPluginCleanupMessage = 'clr ',
kVisualPluginConfigureMessage = 'cnfg', /* Configure the plugin (may not be enabled) */
kVisualPluginEnableMessage = 'von ', /* Turn on the module (automatic)*/
kVisualPluginDisableMessage = 'voff', /* Turn off the module */
kVisualPluginShowWindowMessage = 'show', /* Show the plugin window (allocate large memory here!) */
kVisualPluginHideWindowMessage = 'hide', /* Hide the plugin window (deallocate large memory here!) */
kVisualPluginSetWindowMessage = 'swin', /* Change the window parameters */
kVisualPluginRenderMessage = 'vrnd', /* Render to window */
kVisualPluginUpdateMessage = 'vupd', /* Update the window */
kVisualPluginPlayMessage = 'vply', /* Playing a track */
kVisualPluginChangeTrackMessage = 'ctrk', /* Change track (for CD continuous play) */
kVisualPluginStopMessage = 'vstp', /* Stopping a track */
kVisualPluginSetPositionMessage = 'setp', /* Setting the position of a track */
kVisualPluginPauseMessage = 'vpau', /* Pausing a track (unused - Pause is stop) */
kVisualPluginUnpauseMessage = 'vunp', /* Unpausing a track (unused - Pause is stop) */
kVisualPluginEventMessage = 'vevt' /* Mac-event. */
};
/*
VisualPlugin messages
*/
enum {
kVisualMaxDataChannels = 2,
kVisualNumWaveformEntries = 512,
kVisualNumSpectrumEntries = 512
};
enum {
/* ShowWindow options */
kWindowIsFullScreen = (1L << 0)
};
struct RenderVisualData {
UInt8 numWaveformChannels;
UInt8 waveformData[kVisualMaxDataChannels][kVisualNumWaveformEntries];
UInt8 numSpectrumChannels;
UInt8 spectrumData[kVisualMaxDataChannels][kVisualNumSpectrumEntries];
};
typedef struct RenderVisualData RenderVisualData;
struct VisualPluginInitMessage {
UInt32 messageMajorVersion; /* Input */
UInt32 messageMinorVersion; /* Input */
NumVersion appVersion; /* Input */
void * appCookie; /* Input */
ITAppProcPtr appProc; /* Input */
OptionBits options; /* Output */
void * refCon; /* Output */
};
typedef struct VisualPluginInitMessage VisualPluginInitMessage;
struct VisualPluginShowWindowMessage {
CGrafPtr port; /* Input */
Rect drawRect; /* Input */
OptionBits options; /* Input */
};
typedef struct VisualPluginShowWindowMessage VisualPluginShowWindowMessage;
struct VisualPluginSetWindowMessage {
CGrafPtr port; /* Input */
Rect drawRect; /* Input */
OptionBits options; /* Input */
};
typedef struct VisualPluginSetWindowMessage VisualPluginSetWindowMessage;
struct VisualPluginPlayMessage {
ITTrackInfo * trackInfo; /* Input */
ITStreamInfo * streamInfo; /* Input */
SInt32 volume; /* Input */
UInt32 bitRate; /* Input */
SoundComponentData soundFormat; /* Input */
};
typedef struct VisualPluginPlayMessage VisualPluginPlayMessage;
struct VisualPluginChangeTrackMessage {
ITTrackInfo * trackInfo; /* Input */
ITStreamInfo * streamInfo; /* Input */
};
typedef struct VisualPluginChangeTrackMessage VisualPluginChangeTrackMessage;
struct VisualPluginRenderMessage {
RenderVisualData * renderData; /* Input */
UInt32 timeStampID; /* Input */
};
typedef struct VisualPluginRenderMessage VisualPluginRenderMessage;
struct VisualPluginSetPositionMessage {
UInt32 positionTimeInMS; /* Input */
};
typedef struct VisualPluginSetPositionMessage VisualPluginSetPositionMessage;
struct VisualPluginEventMessage {
EventRecord * event; /* Input */
};
typedef struct VisualPluginEventMessage VisualPluginEventMessage;
struct VisualPluginMessageInfo {
union {
VisualPluginInitMessage initMessage;
VisualPluginShowWindowMessage showWindowMessage;
VisualPluginSetWindowMessage setWindowMessage;
VisualPluginPlayMessage playMessage;
VisualPluginChangeTrackMessage changeTrackMessage;
VisualPluginRenderMessage renderMessage;
VisualPluginSetPositionMessage setPositionMessage;
VisualPluginEventMessage eventMessage;
} u;
};
typedef struct VisualPluginMessageInfo VisualPluginMessageInfo;
/*
#if PRAGMA_STRUCT_ALIGN
#pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
#pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
#pragma pack()
#endif
*/
#ifdef __cplusplus
}
#endif
#endif /* __ITUNESVISUALAPI__ */
\ No newline at end of file diff --git a/src/visualizations/Goom/goom2k4-0/mac/iTunes/ppc_doubling.s b/src/visualizations/Goom/goom2k4-0/mac/iTunes/ppc_doubling.s new file mode 100755 index 0000000000..161326152f --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mac/iTunes/ppc_doubling.s @@ -0,0 +1,50 @@ +.section regular,__TEXT +.globl _ppc_doubling ; name of the function to call by C program + +; width (src width)->r3 +; myx (src) ->r4 +; myX (dest) ->r5 +; myX2 (dest + 1 complete line)->r6 +; heigth (src height)->r7 +; inc (increment for next line in dest) ->r8 + +_ppc_doubling: + +mtspr ctr,r3 + +addi r4,r4,-4 +addi r5,r5,-4 +addi r6,r6,-4 + +1:;boucle: + +lwzu r10,4(r4) +stwu r10,4(r5) +stwu r10,4(r5) +stwu r10,4(r6) +stwu r10,4(r6) + +bdnz 1boucle + +subi r7,r7,1 +add r5,r5,r8 +cmpwi cr1,r7,0 +add r6,r6,r8 +mtspr ctr,r3 +bgt cr1,1boucle + +blr + +;backup + +lwzu r10,4(r4) +stwu r10,4(r5) +stwu r10,4(r6) +stwu r10,4(r5) +stwu r10,4(r6) + +lwzu r10,4(r4) +stwu r10,4(r5) +stwu r10,4(r6) +stwu r10,4(r5) +stwu r10,4(r6) diff --git a/src/visualizations/Goom/goom2k4-0/mkinstalldirs b/src/visualizations/Goom/goom2k4-0/mkinstalldirs new file mode 100755 index 0000000000..4191a45dbd --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/mkinstalldirs @@ -0,0 +1,162 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy + +scriptversion=2009-04-28.21; # UTC + +# Original author: Noah Friedman <friedman@prep.ai.mit.edu> +# Created: 1993-05-16 +# Public domain. +# +# This file is maintained in Automake, please report +# bugs to <bug-automake@gnu.org> or send patches to +# <automake-patches@gnu.org>. + +nl=' +' +IFS=" "" $nl" +errstatus=0 +dirmode= + +usage="\ +Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... + +Create each directory DIR (with mode MODE, if specified), including all +leading file name components. + +Report bugs to <bug-automake@gnu.org>." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" + exit $? + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --version) + echo "$0 $scriptversion" + exit $? + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and +# mkdir -p a/c at the same time, both will detect that a is missing, +# one will create a, then the other will try to create a and die with +# a "File exists" error. This is a problem when calling mkinstalldirs +# from a parallel make. We use --version in the probe to restrict +# ourselves to GNU mkdir, which is thread-safe. +case $dirmode in + '') + if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + test -d ./-p && rmdir ./-p + test -d ./--version && rmdir ./--version + fi + ;; + *) + if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && + test ! -d ./--version; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + else + # Clean up after NextStep and OpenStep mkdir. + for d in ./-m ./-p ./--version "./$dirmode"; + do + test -d $d && rmdir $d + done + fi + ;; +esac + +for file +do + case $file in + /*) pathcomp=/ ;; + *) pathcomp= ;; + esac + oIFS=$IFS + IFS=/ + set fnord $file + shift + IFS=$oIFS + + for d + do + test "x$d" = x && continue + + pathcomp=$pathcomp$d + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr= + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp=$pathcomp/ + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/Makefile.am b/src/visualizations/Goom/goom2k4-0/sdl-goom/Makefile.am new file mode 100644 index 0000000000..417329b020 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/Makefile.am @@ -0,0 +1,11 @@ +# the goom2 stand alone program + +if HAVE_SDL +bin_PROGRAMS = goom2 + +goom2_LDADD = $(top_builddir)/src/libgoom2.la +goom2_LDFLAGS = $(SDL_LIBS) `gtk-config --libs` +goom2_SOURCES = frame_rate_tester.c gmtimer.c gtk-callbacks.c gtk-interface.c gtk-support.c pixeldoubler.c readme.c sdl_goom.c sdl_pixeldoubler.c surface.c +INCLUDES=$(SDL_CFLAGS) `gtk-config --cflags` -I../src/ +endif + diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.c new file mode 100644 index 0000000000..3e438790dd --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.c @@ -0,0 +1,83 @@ +/* + * file : frame_rate_tester.c + * author : JC Hoelt <jeko@free.fr> + * + * birth : 2001-03-07 22:56 + * version : 2001-03-07 22:56 + * + * content : the function to calculate the frame rate + */ + +#include "goom_config.h" +#include "frame_rate_tester.h" +#include "gmtimer.h" +#include <pthread.h> + +pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; + +/************** data ******************/ + +#define NUMBER_OF_FRAMES_IN_BUFFER 20 + +static float endlessTable[NUMBER_OF_FRAMES_IN_BUFFER]; +static guint32 currentPosInET; + +static GMTimer *timer = 0; + +/************** functions **************/ + +/* initialize the tester. do nothing if it has ever been initialized */ +void +framerate_tester_init () +{ + float curTime; + guint32 i; + + pthread_mutex_lock (&mut); + + if (!timer) { + timer = gmtimer_new (); + } + curTime = gmtimer_getvalue (timer); + for (i = 0; i < NUMBER_OF_FRAMES_IN_BUFFER; i++) + endlessTable[i] = curTime; + currentPosInET = 0; + + pthread_mutex_unlock (&mut); +} + +/* close the tester. do nothing if it hasn't been initialized */ +void +framerate_tester_close () +{ + pthread_mutex_lock (&mut); + gmtimer_delete (&timer); + timer = 0; + pthread_mutex_unlock (&mut); +} + +/* return the frame displayed by seconds */ +float +framerate_tester_getvalue () +{ + guint32 oldPos; + int ret; + + pthread_mutex_lock (&mut); + oldPos = (currentPosInET + 1) % NUMBER_OF_FRAMES_IN_BUFFER; + + ret = (float) NUMBER_OF_FRAMES_IN_BUFFER + / (endlessTable[currentPosInET] - endlessTable[oldPos]); + pthread_mutex_unlock (&mut); + return ret; +} + +/* inform the tester that a new frame has been displayed */ +void +framerate_tester_newframe () +{ + pthread_mutex_lock (&mut); + currentPosInET = (currentPosInET + 1) % NUMBER_OF_FRAMES_IN_BUFFER; + endlessTable[currentPosInET] = gmtimer_getvalue (timer); + pthread_mutex_unlock (&mut); +} diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.h b/src/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.h new file mode 100644 index 0000000000..07aa4d6815 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/frame_rate_tester.h @@ -0,0 +1,30 @@ +/* + * file : frame_rate_tester.h + * author : JC Hoelt <jeko@free.fr> + * + * birth : 2001-03-07 22:56 + * version : 2001-03-07 22:56 + * + * content : the function to calculate the frame rate + */ + +#ifndef _FRAME_RATE_TESTER_H +#define _FRAME_RATE_TESTER_H + +#include "goom_config.h" + +/************** functions **************/ + +/* initialize the tester. do nothing if it has ever been initialized */ +void framerate_tester_init (); + +/* close the tester. do nothing if it hasn't been initialized */ +void framerate_tester_close (); + +/* return the frame displayed per seconds */ +float framerate_tester_getvalue (); + +/* inform the tester that a new frame has been displayed */ +void framerate_tester_newframe (); + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.c new file mode 100644 index 0000000000..a3f00ca06a --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.c @@ -0,0 +1,42 @@ +/* + * file : linux/glibfunc.c + * author : JC Hoelt <jeko@free.fr> + * + * birth : 2001-03-03 13:42 + * version : 2001-03-03 14:10 + * + * content : the function to manipulate the time, etc. + */ + +#include <glib.h> +#include "gmtimer.h" + +/************** functions **************/ + +/* initialize the timer. do nothing if the timer has ever been initialized */ +GMTimer * +gmtimer_new () +{ + GTimer *goom_timer = g_timer_new (); + + g_timer_start (goom_timer); + return (void *) goom_timer; +} + +/* close the timer. do nothing if the timer hasn't been initialized */ +void +gmtimer_delete (GMTimer ** t) +{ + GTimer *goom_timer = *(GTimer **) t; + + g_timer_stop (goom_timer); + g_free (goom_timer); + *t = 0; +} + +/* return the number of seconds since the initialization of the timer */ +float +gmtimer_getvalue (GMTimer * t) +{ + return g_timer_elapsed ((GTimer *) t, NULL); +} diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.h b/src/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.h new file mode 100644 index 0000000000..951369a9f6 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/gmtimer.h @@ -0,0 +1,31 @@ +/* + * file : timer.h + * author : JC Hoelt <jeko@free.fr> + * + * birth : 2001-03-03 13:42 + * version : 2001-03-03 13:42 + * + * content : the function to manipulate the time. + * + * this functions are implemented on an os-dependant directory. + */ + +#ifndef _GMTIMER_H +#define _GMTIMER_H + +#include "goom_config.h" + +typedef void GMTimer; + +/************** functions **************/ + +/* initialize the timer. do nothing if the timer has ever been initialized */ +GMTimer *gmtimer_new (); + +/* close the timer. do nothing if the timer hasn't been initialized */ +void gmtimer_delete (GMTimer ** t); + +/* return the number of seconds since the initialization of the timer */ +float gmtimer_getvalue (GMTimer *); + +#endif /* _GMTIMER_H */ diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.c new file mode 100644 index 0000000000..d402abafc8 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.c @@ -0,0 +1,416 @@ +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <gtk/gtk.h> + +#include "gtk-callbacks.h" +#include "gtk-interface.h" +#include "gtk-support.h" + +#define WINSIZE_COMBO "combo_winsize" + +#include "sdl_goom.h" +#include "goom_config_param.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +static SdlGoom *sdlGoom; +static GtkObject *owin; + +static GdkColor color_blue; +static GdkColor color_red; + +void highlight_buffer(GtkText *editable) +{ + static int last_len = 0; + int i, len; + int next_add = 0; + + return; + + gint save_pos = gtk_editable_get_position(GTK_EDITABLE(editable)); /* save current pos */ + gchar *txt = gtk_editable_get_chars (GTK_EDITABLE(editable),0,-1); + len = strlen(txt); + if (len == 0) return; + + if (len == last_len) return; + last_len = len; + + gtk_text_freeze(editable); + + gtk_text_set_point(editable,0); + gtk_text_forward_delete(editable,len); + + for (i=0;i<len-1;++i) { + if ((txt[i]=='/')&&(txt[i+1]=='*')) { + if (i>next_add) { + gtk_text_insert (editable, 0, 0, 0, txt+next_add, i-next_add); + next_add = i; + } + } + if ((txt[i]=='*')&&(txt[i+1]=='/')) { + if (i>next_add) { + gtk_text_insert (editable, 0, &color_blue, 0, txt+next_add, i-next_add+2); + next_add = i + 2; + } + } + } + if (next_add < len) { + gtk_text_insert (editable, 0, 0, 0, txt+next_add, len-next_add); + } + + /* gtk_editable_set_position(GTK_EDITABLE(editable),save_pos+40); + gtk_editable_set_position(GTK_EDITABLE(editable),save_pos-40); */ + + gtk_editable_set_position(GTK_EDITABLE(editable),save_pos); /* restore current pos */ + gtk_text_thaw(editable); + g_free(txt); +} + +void +on_spinbutton_int_changed (GtkEditable *editable, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param"); + IVAL(*param) = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(editable)); + param->changed(param); +} + +void +on_adj_float_changed (GtkWidget *w, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(w),"param"); + FVAL(*param) = GTK_ADJUSTMENT(w)->value; + param->changed(param); +} + +void +on_text_changed (GtkEditable *editable, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param"); + gchar *txt = gtk_editable_get_chars (editable,0,-1); + set_str_param_value(param, txt); + param->changed(param); + g_free(txt); + highlight_buffer(GTK_TEXT(editable)); +} + +void +on_list_changed (GtkEditable *editable, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param"); + gchar *txt = gtk_editable_get_chars (editable,0,-1); + set_list_param_value(param, txt); + param->changed(param); + g_free(txt); +} + +void +on_bool_toggled (GtkToggleButton *togglebutton, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(togglebutton),"param"); + BVAL(*param) = gtk_toggle_button_get_active(togglebutton); + param->changed(param); +} + +void my_int_listener (PluginParam *param) { + GtkEditable *editable; + + if (sdlGoom->config_win == 0) return; + editable = GTK_EDITABLE(param->user_data); + + if (editable) { + int pos = 0; + char str[256]; + sprintf (str, "%d", IVAL(*param)); + if (strcmp(str,gtk_editable_get_chars(editable,0,-1))) { + gtk_editable_delete_text (editable,0,-1); + gtk_editable_insert_text (editable,str,strlen(str),&pos); + } + } +} + +void my_list_listener (PluginParam *param) { + GtkEntry *editable; + + if (sdlGoom->config_win == 0) return; + editable = GTK_ENTRY(param->user_data); + + if (editable) { + if (strcmp(gtk_entry_get_text(editable),LVAL(*param))) { + gtk_entry_set_text (editable, LVAL(*param)); + } + } +} + +void my_bool_listener (PluginParam *param) { + GtkCheckButton *editable; + + if (sdlGoom->config_win == 0) return; + editable = GTK_CHECK_BUTTON(param->user_data); + + if (editable) { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(editable)) != BVAL(*param)) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(editable),BVAL(*param)); + } +} + +void my_float_listener_progress (PluginParam *param) { + GtkProgressBar *progress; + + if (sdlGoom->config_win == 0) return; + progress = GTK_PROGRESS_BAR(param->user_data); + + if (progress) { + if (FVAL(*param)<FMIN(*param)) + FVAL(*param) = FMIN(*param); + if (FVAL(*param)>FMAX(*param)) + FVAL(*param) = FMAX(*param); + gtk_progress_bar_update (progress, FVAL(*param)); + } +} + +void my_float_listener_scale (PluginParam *param) { + GtkRange *range; + + if (sdlGoom->config_win == 0) return; + range = GTK_RANGE(param->user_data); + + if (range) { + GtkAdjustment *adj; + if (FVAL(*param) < FMIN(*param)) + FVAL(*param) = FMIN(*param); + if (FVAL(*param) > FMAX(*param)) + FVAL(*param) = FMAX(*param); + + adj = gtk_range_get_adjustment(range); + adj->value = FVAL(*param); + gtk_adjustment_value_changed(adj); +// gtk_range_set_adjustment(range, adj); + } +} + +void addParams (GtkNotebook *notebook, PluginParameters *params) { + int n; + GtkWidget *table = gtk_table_new (params->nbParams, 2, FALSE); + gtk_container_set_border_width (GTK_CONTAINER (table), 11); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + + for (n=0;n<params->nbParams;++n) { + if (params->params[n] == 0) { + GtkWidget *hseparator = gtk_hseparator_new (); + gtk_widget_show (hseparator); + gtk_table_attach (GTK_TABLE (table), hseparator, 0, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 5); + } else { + PluginParam *p = params->params[n]; + int type = p->type; + + if (type != PARAM_BOOLVAL) { + GtkWidget *label4 = gtk_label_new (p->name); + gtk_widget_show (label4); + gtk_table_attach (GTK_TABLE (table), label4, 0, 1, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (label4), GTK_JUSTIFY_RIGHT); + gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5); + } + + switch (type) { + case PARAM_INTVAL: { + GtkWidget *spinbutton_adj,*spinbutton; + + spinbutton_adj = (GtkWidget*)gtk_adjustment_new ( + p->param.ival.value, + p->param.ival.min, p->param.ival.max, + p->param.ival.step, p->param.ival.step*10, + p->param.ival.step*10); + spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0); + gtk_widget_show (spinbutton); + gtk_table_attach (GTK_TABLE (table), spinbutton, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 1); + gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE); + gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinbutton), + GTK_UPDATE_IF_VALID); + p->user_data = spinbutton; + gtk_object_set_data (GTK_OBJECT(spinbutton),"param",(void*)p); + p->change_listener = my_int_listener; + gtk_signal_connect (GTK_OBJECT (spinbutton), "changed", + GTK_SIGNAL_FUNC (on_spinbutton_int_changed), + NULL); + break; + } + + case PARAM_FLOATVAL: { + GtkWidget *progress,*prog_adj; + + prog_adj = (GtkWidget*)gtk_adjustment_new ( + p->param.fval.value, + p->param.fval.min, p->param.fval.max, + p->param.fval.step, p->param.fval.step*10, + p->param.fval.step*10); + + if (p->rw) + progress = gtk_hscale_new(GTK_ADJUSTMENT(prog_adj)); + else + progress = gtk_progress_bar_new_with_adjustment(GTK_ADJUSTMENT(prog_adj)); + gtk_widget_show(progress); + gtk_table_attach (GTK_TABLE (table), progress, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 1); + + p->user_data = progress; + if (p->rw) { + p->change_listener = my_float_listener_scale; + gtk_object_set_data (GTK_OBJECT(prog_adj),"param",(void*)p); + gtk_signal_connect (GTK_OBJECT (prog_adj), "value-changed", + GTK_SIGNAL_FUNC (on_adj_float_changed), + NULL); + } + else + p->change_listener = my_float_listener_progress; + break; + } + + case PARAM_STRVAL: { + GtkWidget *vscrollbar = 0; + GtkWidget *text_winsize = gtk_text_new (0,0); + gtk_widget_show (text_winsize); + gtk_table_attach (GTK_TABLE (table), text_winsize, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); + gtk_text_insert (GTK_TEXT(text_winsize), 0, 0, 0, p->param.sval.value, strlen(p->param.sval.value)); + gtk_text_set_editable(GTK_TEXT(text_winsize), p->rw); + /* Add a vertical scrollbar to the GtkText widget */ + vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text_winsize)->vadj); + gtk_table_attach (GTK_TABLE (table), vscrollbar, 2, 3, n, n+1, + GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); + gtk_widget_show (vscrollbar); + +/* combo_entry_winsize = GTK_COMBO (combo_winsize)->entry; + gtk_widget_show (combo_entry_winsize); + gtk_entry_set_editable (GTK_ENTRY (combo_entry_winsize), FALSE); + gtk_entry_set_text (GTK_ENTRY (combo_entry_winsize), LVAL(*p)); + p->change_listener = my_list_listener;*/ + p->user_data = text_winsize; + gtk_object_set_data (GTK_OBJECT(text_winsize),"param",(void*)p); + gtk_signal_connect (GTK_OBJECT (text_winsize), "changed", + GTK_SIGNAL_FUNC (on_text_changed), + NULL); + break; + } + + case PARAM_LISTVAL: { + int i; + GList *combo_winsize_items = NULL; + GtkWidget *combo_entry_winsize = NULL; + GtkWidget *combo_winsize = gtk_combo_new (); + gtk_widget_show (combo_winsize); + gtk_table_attach (GTK_TABLE (table), combo_winsize, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_combo_set_value_in_list (GTK_COMBO (combo_winsize), TRUE, TRUE); + for (i=0;i<p->param.slist.nbChoices;++i) + combo_winsize_items = g_list_append (combo_winsize_items, + p->param.slist.choices[i]); + gtk_combo_set_popdown_strings (GTK_COMBO (combo_winsize), combo_winsize_items); + g_list_free (combo_winsize_items); + + combo_entry_winsize = GTK_COMBO (combo_winsize)->entry; + gtk_widget_show (combo_entry_winsize); + gtk_entry_set_editable (GTK_ENTRY (combo_entry_winsize), FALSE); + gtk_entry_set_text (GTK_ENTRY (combo_entry_winsize), LVAL(*p)); + p->change_listener = my_list_listener; + p->user_data = combo_entry_winsize; + gtk_object_set_data (GTK_OBJECT(combo_entry_winsize),"param",(void*)p); + gtk_signal_connect (GTK_OBJECT (combo_entry_winsize), "changed", + GTK_SIGNAL_FUNC (on_list_changed), + NULL); + break; + } + + case PARAM_BOOLVAL: { + GtkWidget *checkbutton_double = + gtk_check_button_new_with_label (p->name); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_double),BVAL(*p)); + gtk_widget_show (checkbutton_double); + gtk_table_attach (GTK_TABLE (table), checkbutton_double, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_signal_connect (GTK_OBJECT (checkbutton_double), "toggled", + GTK_SIGNAL_FUNC (on_bool_toggled), + NULL); + gtk_object_set_data (GTK_OBJECT(checkbutton_double),"param",(void*)p); + p->user_data = checkbutton_double; + p->change_listener = my_bool_listener; + break; + } + } + } + } + + gtk_widget_show_all(GTK_WIDGET(table)); + gtk_container_add(GTK_CONTAINER(notebook),table); + gtk_notebook_set_tab_label_text(notebook,GTK_WIDGET(table),params->name); +} + +void gtk_data_init(SdlGoom *sg) { + + sdlGoom = sg; + if (sdlGoom->config_win) { + int i; + GtkNotebook *notebook; + GdkColormap *cmap; + + cmap = gdk_colormap_get_system(); + color_blue.red = 0; + color_blue.blue = 0xffff; + color_blue.green = 0; + color_red.red = 0xffff; + color_red.blue = 0; + color_red.green = 0; + if ((!gdk_color_alloc(cmap, &color_blue))||(!gdk_color_alloc(cmap, &color_red))) { + g_error("couldn't allocate color"); + } + + owin = GTK_OBJECT(sdlGoom->config_win); + notebook = GTK_NOTEBOOK(gtk_object_get_data (owin, "notebook1")); + addParams (notebook, &sdlGoom->screen); + for (i = 0; i < sdlGoom->plugin->nbParams; ++i) { + addParams (notebook, &sdlGoom->plugin->params[i]); + } + } + +} + +gboolean +on_config_window_destroy_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + sdlGoom->config_win = 0; + owin = 0; + return FALSE; +} + + +gboolean +on_config_window_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + sdlGoom->config_win = 0; + owin = 0; + return FALSE; +} + diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.h b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.h new file mode 100644 index 0000000000..15749d22db --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-callbacks.h @@ -0,0 +1,24 @@ +#include <gtk/gtk.h> + + +void +on_checkbutton_double_toggled (GtkToggleButton *togglebutton, + gpointer user_data); + +void +on_spinbutton_fps_changed (GtkEditable *editable, + gpointer user_data); + +void +on_combo_entry_winsize_changed (GtkEditable *editable, + gpointer user_data); + +gboolean +on_config_window_destroy_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data); + +gboolean +on_config_window_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data); diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.c new file mode 100644 index 0000000000..8adc7942a8 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.c @@ -0,0 +1,138 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <string.h> + +#include <gdk/gdkkeysyms.h> +#include <gtk/gtk.h> + +#include "gtk-callbacks.h" +#include "gtk-interface.h" +#include "gtk-support.h" + +GtkWidget* +create_config_window (void) +{ + GtkWidget *config_window; + GtkWidget *vbox1; + GtkWidget *toolbar1; + GtkWidget *b_open_config; + GtkWidget *b_save_config; + GtkWidget *notebook1; + GtkWidget *scrolledwindow1; + GtkWidget *text1; + GtkWidget *goom_control; + GtkWidget *statusbar1; + + config_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_widget_set_name (config_window, "config_window"); + gtk_object_set_data (GTK_OBJECT (config_window), "config_window", config_window); + gtk_window_set_title (GTK_WINDOW (config_window), _("Goom Control Center")); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_widget_set_name (vbox1, "vbox1"); + gtk_widget_ref (vbox1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "vbox1", vbox1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (vbox1); + gtk_container_add (GTK_CONTAINER (config_window), vbox1); + + toolbar1 = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_TEXT); + gtk_widget_set_name (toolbar1, "toolbar1"); + gtk_widget_ref (toolbar1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "toolbar1", toolbar1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (toolbar1); + gtk_box_pack_start (GTK_BOX (vbox1), toolbar1, FALSE, FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (toolbar1), 3); + gtk_toolbar_set_space_size (GTK_TOOLBAR (toolbar1), 8); + gtk_toolbar_set_space_style (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_SPACE_LINE); + + b_open_config = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), + GTK_TOOLBAR_CHILD_BUTTON, + NULL, + _("Open..."), + NULL, NULL, + NULL, NULL, NULL); + gtk_widget_set_name (b_open_config, "b_open_config"); + gtk_widget_ref (b_open_config); + gtk_object_set_data_full (GTK_OBJECT (config_window), "b_open_config", b_open_config, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (b_open_config); + + b_save_config = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), + GTK_TOOLBAR_CHILD_BUTTON, + NULL, + _("Save..."), + NULL, NULL, + NULL, NULL, NULL); + gtk_widget_set_name (b_save_config, "b_save_config"); + gtk_widget_ref (b_save_config); + gtk_object_set_data_full (GTK_OBJECT (config_window), "b_save_config", b_save_config, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (b_save_config); + + notebook1 = gtk_notebook_new (); + gtk_widget_set_name (notebook1, "notebook1"); + gtk_widget_ref (notebook1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "notebook1", notebook1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (notebook1); + gtk_box_pack_start (GTK_BOX (vbox1), notebook1, TRUE, TRUE, 0); + gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook1), GTK_POS_LEFT); + + scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL); + gtk_widget_set_name (scrolledwindow1, "scrolledwindow1"); + gtk_widget_ref (scrolledwindow1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "scrolledwindow1", scrolledwindow1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (scrolledwindow1); + gtk_container_add (GTK_CONTAINER (notebook1), scrolledwindow1); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); + + text1 = gtk_text_new (NULL, NULL); + gtk_widget_set_name (text1, "text1"); + gtk_widget_ref (text1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "text1", text1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (text1); + gtk_container_add (GTK_CONTAINER (scrolledwindow1), text1); + gtk_widget_set_usize (text1, 400, 300); + { char *str = _("What a GOOM!!\n\nCopyright (c)2000-2004, by Jean-Christophe Hoelt <jeko@ios-software.com>\n\nThis is my first visual plugins for XMMS, and I\nthink that it's the best I have ever done!\nYou can grab our last version and help us with a donation at\nhttp://www.ios-software.com/\nThanks and enjoy!\n\n\tJeko"); + gtk_text_insert (GTK_TEXT (text1), NULL, NULL, NULL, str, strlen(str)); + } + + goom_control = gtk_label_new (_("About goom...")); + gtk_widget_set_name (goom_control, "goom_control"); + gtk_widget_ref (goom_control); + gtk_object_set_data_full (GTK_OBJECT (config_window), "goom_control", goom_control, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (goom_control); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), goom_control); + + statusbar1 = gtk_statusbar_new (); + gtk_widget_set_name (statusbar1, "statusbar1"); + gtk_widget_ref (statusbar1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "statusbar1", statusbar1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (statusbar1); + gtk_box_pack_start (GTK_BOX (vbox1), statusbar1, FALSE, FALSE, 0); + + gtk_signal_connect (GTK_OBJECT (config_window), "destroy_event", + GTK_SIGNAL_FUNC (on_config_window_destroy_event), + NULL); + gtk_signal_connect (GTK_OBJECT (config_window), "delete_event", + GTK_SIGNAL_FUNC (on_config_window_delete_event), + NULL); + + return config_window; +} + diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.h b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.h new file mode 100644 index 0000000000..95b003d030 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-interface.h @@ -0,0 +1,5 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +GtkWidget* create_config_window (void); diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.c new file mode 100644 index 0000000000..732554c1cb --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.c @@ -0,0 +1,162 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <string.h> + +#include <gtk/gtk.h> + +#include "gtk-support.h" + +/* This is an internally used function to check if a pixmap file exists. */ +static gchar* check_file_exists (const gchar *directory, + const gchar *filename); + +/* This is an internally used function to create pixmaps. */ +static GtkWidget* create_dummy_pixmap (GtkWidget *widget); + +GtkWidget* +lookup_widget (GtkWidget *widget, + const gchar *widget_name) +{ + GtkWidget *parent, *found_widget; + + for (;;) + { + if (GTK_IS_MENU (widget)) + parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); + else + parent = widget->parent; + if (parent == NULL) + break; + widget = parent; + } + + found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget), + widget_name); + if (!found_widget) + g_warning ("Widget not found: %s", widget_name); + return found_widget; +} + +/* This is a dummy pixmap we use when a pixmap can't be found. */ +static char *dummy_pixmap_xpm[] = { +/* columns rows colors chars-per-pixel */ +"1 1 1 1", +" c None", +/* pixels */ +" " +}; + +/* This is an internally used function to create pixmaps. */ +static GtkWidget* +create_dummy_pixmap (GtkWidget *widget) +{ + GdkColormap *colormap; + GdkPixmap *gdkpixmap; + GdkBitmap *mask; + GtkWidget *pixmap; + + colormap = gtk_widget_get_colormap (widget); + gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask, + NULL, dummy_pixmap_xpm); + if (gdkpixmap == NULL) + g_error ("Couldn't create replacement pixmap."); + pixmap = gtk_pixmap_new (gdkpixmap, mask); + gdk_pixmap_unref (gdkpixmap); + gdk_bitmap_unref (mask); + return pixmap; +} + +static GList *pixmaps_directories = NULL; + +/* Use this function to set the directory containing installed pixmaps. */ +void +add_pixmap_directory (const gchar *directory) +{ + pixmaps_directories = g_list_prepend (pixmaps_directories, + g_strdup (directory)); +} + +/* This is an internally used function to create pixmaps. */ +GtkWidget* +create_pixmap (GtkWidget *widget, + const gchar *filename) +{ + gchar *found_filename = NULL; + GdkColormap *colormap; + GdkPixmap *gdkpixmap; + GdkBitmap *mask; + GtkWidget *pixmap; + GList *elem; + + if (!filename || !filename[0]) + return create_dummy_pixmap (widget); + + /* We first try any pixmaps directories set by the application. */ + elem = pixmaps_directories; + while (elem) + { + found_filename = check_file_exists ((gchar*)elem->data, filename); + if (found_filename) + break; + elem = elem->next; + } + + /* If we haven't found the pixmap, try the source directory. */ + if (!found_filename) + { + found_filename = check_file_exists ("../pixmaps", filename); + } + + if (!found_filename) + { + g_warning (_("Couldn't find pixmap file: %s"), filename); + return create_dummy_pixmap (widget); + } + + colormap = gtk_widget_get_colormap (widget); + gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask, + NULL, found_filename); + if (gdkpixmap == NULL) + { + g_warning (_("Error loading pixmap file: %s"), found_filename); + g_free (found_filename); + return create_dummy_pixmap (widget); + } + g_free (found_filename); + pixmap = gtk_pixmap_new (gdkpixmap, mask); + gdk_pixmap_unref (gdkpixmap); + gdk_bitmap_unref (mask); + return pixmap; +} + +/* This is an internally used function to check if a pixmap file exists. */ +gchar* +check_file_exists (const gchar *directory, + const gchar *filename) +{ + gchar *full_filename; + struct stat s; + gint status; + + full_filename = (gchar*) g_malloc (strlen (directory) + 1 + + strlen (filename) + 1); + strcpy (full_filename, directory); + strcat (full_filename, G_DIR_SEPARATOR_S); + strcat (full_filename, filename); + + status = stat (full_filename, &s); + if (status == 0 && S_ISREG (s.st_mode)) + return full_filename; + g_free (full_filename); + return NULL; +} + diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.h b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.h new file mode 100644 index 0000000000..931bc5ad04 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/gtk-support.h @@ -0,0 +1,61 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <gtk/gtk.h> + +/* + * Standard gettext macros. + */ +#ifdef ENABLE_NLS +# include <libintl.h> +# undef _ +# define _(String) dgettext (PACKAGE, String) +# ifdef gettext_noop +# define N_(String) gettext_noop (String) +# else +# define N_(String) (String) +# endif +#else +# define textdomain(String) (String) +# define gettext(String) (String) +# define dgettext(Domain,Message) (Message) +# define dcgettext(Domain,Message,Type) (Message) +# define bindtextdomain(Domain,Directory) (Domain) +# define _(String) (String) +# define N_(String) (String) +#endif + + +/* + * Public Functions. + */ + +/* + * This function returns a widget in a component created by Glade. + * Call it with the toplevel widget in the component (i.e. a window/dialog), + * or alternatively any widget in the component, and the name of the widget + * you want returned. + */ +GtkWidget* lookup_widget (GtkWidget *widget, + const gchar *widget_name); + +/* get_widget() is deprecated. Use lookup_widget instead. */ +#define get_widget lookup_widget + +/* Use this function to set the directory containing installed pixmaps. */ +void add_pixmap_directory (const gchar *directory); + + +/* + * Private Functions. + */ + +/* This is used to create the pixmaps in the interface. */ +GtkWidget* create_pixmap (GtkWidget *widget, + const gchar *filename); + diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.c new file mode 100644 index 0000000000..04a6827088 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.c @@ -0,0 +1,44 @@ +#include "pixeldoubler.h" +#include <stdlib.h> +#include <string.h> + +void pixel_doubler (Surface *src, Surface *dest) { + register int *d; // pointeur sur le pixel courant a marquer + register int *s; // pointeur sur le pixel coutant en cours de lecture + int sw; // nombre d'octet de largeur de ligne de la surface source + int sw2; + int fd; // adresse de la fin du buffer destination + int fin; // adresse de fin d'une ligne du buffer source + + d = dest->buf; + s = src->buf; + + sw = src->width << 2; + sw2 = sw << 1; + + fin = (int)s; + fd = (int)d + (dest->size<<2); + + // tant que tout le buffer source n'est pas remplit + while ((int)d < fd) { + + // passer a la ligne suivante du buffer source + fin += sw; + + // l'afficher sur une ligne du buffer destination + while ((int)s < fin) { + register int col = *(s++); + // 2 affichage par point du buffer source (doubling horizontal) + *(d++) = col; *(d++) = col; + } + + // puis l'afficher sur une autre ligne (doubling vertical) + memcpy (d, ((char*)d) - sw2, sw2); +/* s = (int*)((int)s - sw); // retour au debut de la ligne src + while ((int)s < fin) { + register int col = *(s++); + *(d++) = col; *(d++) = col; // idem (cf plus haut) + } */ + d = (int*)((char*)d + sw2); + } +} diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.h b/src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.h new file mode 100644 index 0000000000..a1b6d9f303 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.h @@ -0,0 +1,58 @@ +#ifndef _PIXELDOUBLER_H +#define _PIXELDOUBLER_H + +#include "surface.h" + +/* + * copie la surface src dans la surface dest en doublant la taille des pixels. + * + * la surface dest doit faire exactement 2 fois la taille de la surface src. + * (segfault sinon). + * + * auteur : JeKo <jeko@free.fr> + * + * bench : <2001-11-28|20h00> 9 cycles par pixel marqué (cpm) sur un PII 266. + * (surement limité par le debit de la memoire vive.. + * je fonce chez moi verifier) + * <chez moi|1h10> 11 cpm sur un Duron 800. (i.e. pas loin de 300fps) + * surement que les acces memoires sont assez penalisant. + * je tente d'aligner les données des surfaces pour voir. + * => pas mieux : le systeme doit deja faire ca comme il faut. + * mais pour l'alignement 64bits ca va etre utile : je passe a l'ASM + * <3h00> l'optimisation asm a permi de gagner vraiment pas grand + * chose (0.1 ms sur mon Duron).. le code en C semble suffisant. + * et je persiste a croire ke la vitesse est plafonné par la vitesse + * d'acces a la memoire.. ceci expliquerait aussi cela. + * + * <2001-12-08|1h20> Travail sur le code assembleur : + * pour reduire les temps d'acces memoire, utilisation de + * l'instruction 3Dnow! PREFETCH/W pour le prechargement des + * page de cache. pour pousser cette optimisation jusque au bout : + * j'ai déroulé la boucle pour qu'elle traite a chaque passage + * une page de cache complete en lecture et 2 en ecriture. + * (optimisé sur un Duron=Athlon, page de cache = 64 octets) + * preformances sur mon Duron 800 : 9 CPM. + * (ce qui fait 18% de mieux que la version en C) + * ATTENTION : CETTE VERSION NE SUPPORTE DONC QUE DES TAILLES DE + * SURFACE AYANT UNE LARGEUR MULTIPLE DE 32 POUR DEST, + * DONC 16 POUR SRC. (ce qui n'est pas tres genant puisque ce sont + * des resolutions standard, mais il faut le savoir) + * explication : alignement des données sur la taille des pages de + * cache. + * + * <2001-12-08|14h20> Apres intense potassage de la doc de l'Athlon, + * decouverte certaines subtilités de ce FABULEUX processeur :) + * entrelacement de la copie de 2 pixel, plus utilisation de + * l'instruction de transfert rapide 3Dnow! MOVNTQ... attention les + * chiffres -> sur mon Duron 800 : 4 CPM !!!!! + * + * note : ne fonctionne que sur un systeme 32bits.. mais le faire fonctionner + * sur une machine autre ne posera aucun probleme. + * (le seul truc c'est ke j'ai considéré mes pointeurs comme des entiers + * 32bits <- je sais je suis vaxiste, et alors???:) + * + * copyright (c)2001, JC Hoelt for iOS software. + */ +void pixel_doubler (Surface *src, Surface *dest) ; + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler_athlon.s b/src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler_athlon.s new file mode 100644 index 0000000000..efc790171c --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler_athlon.s @@ -0,0 +1,118 @@ +bits 32 +global pixel_doubler + +%macro twopixproc 0 +%rep 2 + movq mm0,[esi] ; -> P1P2 + movq mm2,[esi+8] ; -> P3P4 + + movq mm1,mm0 + movq mm3,mm2 + + punpckldq mm1,mm1 ; P1P2 | P1P2 -> P1P1 + punpckhdq mm0,mm0 ; P1P2 | P1P2 -> P2P2 + + movntq [edi],mm1 + punpckldq mm3,mm3 ; P3P4 | P3P4 -> P3P3 + + movntq [edi+8],mm0 + punpckhdq mm2,mm2 ; P3P4 | P3P4 -> P4P4 + + movntq [edi+16],mm3 + movq mm4,[esi+16] + + movntq [edi+24],mm2 + movq mm6,[esi+24] + + movq mm5,mm4 + movq mm7,mm6 + + punpckldq mm5,mm5 ; P1P2 | P1P2 -> P1P1 + punpckhdq mm4,mm4 ; P1P2 | P1P2 -> P2P2 + + movntq [edi+32],mm5 + punpckldq mm7,mm7 ; P3P4 | P3P4 -> P3P3 + + movntq [edi+40],mm4 + punpckhdq mm6,mm6 ; P3P4 | P3P4 -> P4P4 + + movntq [edi+48],mm7 + add esi,32 + + movntq [edi+56],mm6 + add edi,64 +%endrep +%endmacro + +%macro prefetcher 0 + prefetch [esi+128] +%endmacro + + +align 16 +pixel_doubler: + push ebp + mov ebp,esp + push edi + push esi + push ebx + push ecx + push edx + + mov ecx,[ebp+8] ; ecx <- src + mov edx,[ebp+12] ; edx <- dest + + mov esi,[ecx] ; esi <- src->buf + mov edi,[edx] ; edi <- dest->buf + + mov ebx,[ecx+4] ; ebx <- src->width + mov eax,[ecx+8] ; eax <- src->height + + shl ebx,2 ; width *= 4 (in byte) + mov edx,ebx ; edx <- width in byte + shr ebx,6 ; width in cache page + +align 16 +while_1: + prefetch [esi] ; prefetch the first cache line + prefetch [esi+64] + + mov ecx,ebx + +while_2: + prefetcher + twopixproc + + dec ecx + jnz while_2 +; end_while_2 + + sub esi,edx + mov ecx,ebx + + prefetch [esi] ; prefetch the first cache line + prefetch [esi+64] + +while_3: + prefetcher + twopixproc + + dec ecx + jnz while_3 +; end_while_3 + + dec eax ; decremente le nombre de ligne testee + jnz while_1 ; on continue si c'etait pas la derniere + +; end_while_1: + + sfence + femms + + pop edx + pop ecx + pop ebx + pop esi + pop edi + leave + ret diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/readme.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/readme.c new file mode 100644 index 0000000000..23df8ea872 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/readme.c @@ -0,0 +1,49 @@ +#ifndef _GOOM_README_H +#define _GOOM_README_H + +/* Automatically generated from README, via Makefile.am */ +static char goom_readme[] = +"TAB - Enter/Leave Fullscreen\n" +"Numpad +/- - Change resolution\n" +"F1-F8 - Set Background FX\n" +"\n" +"F - Display Frame Rate\n" +"Q - Quit\n"; + +static char goom_big_readme[] = +"****************************\n" +"* What a GOOM! version 2k4 *\n" +"****************************\n" +"by Jean-Christophe 'Jeko' Hoelt\n" +"\n" +"\n" +"The incredible trippy visualization plugin!!\n" +"\n" +"\n" +"\n" +"...... freely offered by iOS-Software\n" +"Wanna find the last version of goom or support\n" +"us with a donation? There you go:\n" +"\n" +"http://www.ios-software.com/\n" +"\n" +"\n" +"\n" +"...... many thanks to:\n" +"\n" +"Skal for the code of IFS\n" +"\n" +"Gyom for the iTunes version\n" +" and some of the main work\n" +"\n" +"Fred for the Windows version and a lot of\n" +" other Goom Stuff\n" +"\n" +"Dennis and guys of libvisual for their\n" +" help on the unix package\n" +"\n" +"\n" +"\n" +"Enjoy!"; + +#endif /* _GOOM_README_H */ diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.c new file mode 100644 index 0000000000..3ae99fc4c9 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.c @@ -0,0 +1,746 @@ +#include <glib.h> +#include <gtk/gtk.h> +#include "goom_config.h" + +#include <SDL.h> +#include <SDL_thread.h> + +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include <sys/time.h> +#include <sys/types.h> + +#include "goom_tools.h" +#include "goom.h" + +#include "frame_rate_tester.h" +#include "gmtimer.h" + +#include "pixeldoubler.h" +#include "sdl_pixeldoubler.h" + +#include "readme.c" + +#include "gtk-support.h" +#include "gtk-interface.h" + +#include "sdl_goom.h" + +static SdlGoom sdlGoom; + +//#define BENCHMARK_X86 +#ifdef BENCHMARK_X86 +#include <stdint.h> +static uint64_t GetTick() +{ + uint64_t x; + /* __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));*/ + asm volatile ("RDTSC" : "=A" (x)); + return x; +} +#endif + +/** + * Callback des parametres + */ +static void screen_size_changed (PluginParam *); +static void fps_limit_changed (PluginParam *); +static void pix_double_changed (PluginParam *); +static void hide_cursor_changed (PluginParam *); + +/** + * Initialise les parametres de la version SDL + */ +static void init_parameters() { + + static char *resolutions[4] = {"320x240","400x300","640x480","800x600"}; + static struct ListVal reslist = { + value:0, + nbChoices:4, + choices:resolutions + }; + + sdlGoom.screen_size = secure_param (); + sdlGoom.screen_size.name = "Window's Size:"; + sdlGoom.screen_size.desc = ""; + sdlGoom.screen_size.type = PARAM_LISTVAL; + sdlGoom.screen_size.param.slist = reslist; + sdlGoom.screen_size.changed = screen_size_changed; + set_list_param_value(&sdlGoom.screen_size, "400x300"); + + sdlGoom.fps_limit = secure_param (); + sdlGoom.fps_limit.name = "Frame Rate:"; + sdlGoom.fps_limit.desc = ""; + sdlGoom.fps_limit.type = PARAM_INTVAL; + sdlGoom.fps_limit.param.ival.min = 1; + sdlGoom.fps_limit.param.ival.max = 35; + sdlGoom.fps_limit.param.ival.value = 30; + sdlGoom.fps_limit.param.ival.step = 1; + sdlGoom.fps_limit.changed = fps_limit_changed; + + sdlGoom.pix_double = secure_param (); + sdlGoom.pix_double.name = "Double Pixel"; + sdlGoom.pix_double.type = PARAM_BOOLVAL; + sdlGoom.pix_double.changed = pix_double_changed; + BVAL(sdlGoom.pix_double) = 0; + + sdlGoom.hide_cursor = secure_param (); + sdlGoom.hide_cursor.name = "Hide Cursor"; + sdlGoom.hide_cursor.type = PARAM_BOOLVAL; + sdlGoom.hide_cursor.changed = hide_cursor_changed; + BVAL(sdlGoom.hide_cursor) = 1; + + sdlGoom.display_fps = secure_param (); + sdlGoom.display_fps.name = "Display FPS"; + sdlGoom.display_fps.type = PARAM_BOOLVAL; + BVAL(sdlGoom.display_fps) = 0; + + sdlGoom.screen = plugin_parameters("Display", 7); + sdlGoom.screen.params[0]=&sdlGoom.screen_size; + sdlGoom.screen.params[1]=&sdlGoom.pix_double; + sdlGoom.screen.params[2]=0; + sdlGoom.screen.params[3]=&sdlGoom.fps_limit; + sdlGoom.screen.params[4]=&sdlGoom.display_fps; + sdlGoom.screen.params[5]=0; + sdlGoom.screen.params[6]=&sdlGoom.hide_cursor; + + sdlGoom.config_win = 0; + sdlGoom.screen_height = 300; + sdlGoom.screen_width = 400; + sdlGoom.doublepix = 0; + sdlGoom.active = 1; +} + +/* + * Methodes utilitaires + */ +char *sdl_goom_set_doublepix (int dp); +static void apply_double (); + + +static int resx = 400; +static int resy = 300; +static int doublepix = 0; +static int doubledec = 0; + +static int MAX_FRAMERATE = 32; +static double INTERPIX = 1000.0f / 32; + +static SDL_Surface *surface = NULL; +static int is_fs = 0; + +/* static void thread_func (); */ + +static void sdl_goom_init (int argc, char **argv); +static void sdl_goom_cleanup (); +static void sdl_goom_loop (); +static void sdl_goom_render_pcm (gint16 data[2][512], gchar *title); + +static Surface *gsurf2 = NULL; +static Surface gsurf; +static char *main_script = NULL; +static char *init_script = NULL; + +static int fini = 0; +static int disable = 0; +static gint16 snd_data[2][512]; + +#include <signal.h> + +void on_kill(int i) { + fini = 1; + disable = 1; +} + +int main (int argc, char **argv) { + + gtk_set_locale (); + gtk_init (&argc, &argv); + + sdl_goom_init(argc, argv); + signal(SIGQUIT, on_kill); + sdl_goom_loop(); + sdl_goom_cleanup(); + return 0; +} + +static char *load_file(const char *fname) +{ + FILE *f = fopen(fname, "rt"); + long size; + char *sc; + + if (!f) { + fprintf(stderr, "Could not load file %s\n", fname); + return ""; + } + + fseek(f, 0L, SEEK_END); + size = ftell(f); + rewind(f); + sc = (char*)malloc(size+1); + fread(sc,1,size,f); + sc[size] = 0; + fclose(f); + printf("%s loaded\n", fname); + return sc; +} + +static void display_help() +{ + printf("usage: goom2 <init_script> <main_script>\n"); +} + +static void check_arg(int argc, char *argv) +{ + static int has_init = 0; + static int has_main = 0; + + if (argv[0] == '-') { + if ((!strcmp(argv,"-h"))||(!strcmp(argv,"--help"))) { + display_help(); + exit(0); + } + } + else if (!has_init) { + init_script = load_file(argv); + has_init = 1; + } + else if (!has_main) { + main_script = load_file(argv); + has_main = 1; + } +} + +void sdl_goom_init (int argc, char **argv) +{ + gint16 data[2][512]; + int i; + int init_flags = SDL_INIT_VIDEO; + + for (i=1; i<argc; ++i) { + check_arg(i,argv[i]); + } + + init_parameters(); + +#ifdef VERBOSE + printf ("--> INITIALIZING GOOM\n"); +#endif + + fini = FALSE; +#ifdef THIS_MAKES_ATI_CARDS_TO_CRASH__linux__ + /* This Hack Allows Hardware Surface on Linux */ + setenv("SDL_VIDEODRIVER","dga",0); + + if (SDL_Init(init_flags) < 0) { + printf(":-( Could not use DGA. Try using goom2 as root.\n"); + setenv("SDL_VIDEODRIVER","x11",1); + if (SDL_Init(init_flags) < 0) { + fprintf(stderr, "SDL initialisation error: %s\n", SDL_GetError()); + exit(1); + } + } + else { + printf(":-) DGA Available !\n"); + SDL_WM_GrabInput(SDL_GRAB_ON); + } +#else + if ( SDL_Init(init_flags) < 0 ) { + fprintf(stderr, "SDL initialisation error: %s\n", SDL_GetError()); + exit(1); + } +#endif + surface = SDL_SetVideoMode (resx, resy, 32, + SDL_RESIZABLE|SDL_SWSURFACE); + SDL_WM_SetCaption ("What A Goom!!", NULL); + SDL_ShowCursor (0); + SDL_EnableKeyRepeat (0, 0); + atexit(SDL_Quit); + + apply_double (); + sdlGoom.plugin = goom_init (resx, resy); + + /*if (init_script != NULL) { + gsl_ex(sdlGoom.plugin, init_script); + } + + if (main_script != NULL) { + goom_set_main_script(sdlGoom.plugin, main_script); + }*/ + + for (i = 0; i < 512; i++) { + data[0][i] = 0; + data[1][i] = 0; + } + + framerate_tester_init (); +} + +/* retourne x>>s , en testant le signe de x */ +#define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s)) + +static void +sdl_goom_loop() +{ + static double tnext = 0; + static gint16 prev0 = 0; + static int i, j; + gchar *ptitle = NULL; + static char title[2048]; + + if (tnext < 0.01) + tnext = INTERPIX + SDL_GetTicks(); + + while (!fini) { + double t; + sdl_goom_render_pcm (snd_data, ptitle); + ptitle = NULL; + + /* load the sound data */ + { + fd_set rfds; + struct timeval tv; + int retval; + + tv.tv_sec = 0; + tv.tv_usec = 10; + + FD_ZERO(&rfds); + FD_SET(0, &rfds); + retval = select(1, &rfds, NULL, NULL, &tv); + + if (retval) { + int type; + read (0, &type, sizeof(int)); + switch (type) { + case 0: + read (0, snd_data, 512*2*2); + break; + case 1: + read (0, title, 2048); + ptitle = &title[0]; + break; + case 2: + fini = 1; + disable = TRUE; + break; + } + } + } + + if (prev0 == snd_data[0][0]) { + for (i = 0; i < 2; i++) + for (j = 0; j < 512; j++) + snd_data[i][j] = ShiftRight((snd_data[i][j] * 31),5); + } + prev0 = snd_data[0][0]; + + t = SDL_GetTicks(); + if (t < tnext) { + float t2s = (tnext-t); + while (t2s>20) { + usleep(20*1000); + gtk_main_iteration_do(FALSE); + t = SDL_GetTicks(); + t2s = tnext-t; + } + tnext += INTERPIX; + } + else { + tnext = t+INTERPIX; + } + i = 0; + while (gtk_main_iteration_do(FALSE) == TRUE) { + if (i++ > 10) + break; + } + } + /* else { + * gtk_main_quit(); + * } + */ +} + +static void +sdl_goom_cleanup (void) +{ +#ifdef VERBOSE + printf ("--> CLEANUP GOOM\n"); +#endif + + if (is_fs) { + SDL_WM_ToggleFullScreen (surface); + } + SDL_Quit (); + + goom_close (sdlGoom.plugin); + framerate_tester_close (); +} + + +/*===============================*/ + +static void apply_double () { + + if (gsurf2) surface_delete (&gsurf2); + if (!doublepix) + return; + + if (surface->format->BytesPerPixel == 4) + doublepix = 2; + else + doublepix = 1; + + if (doublepix==2) { + resx /= 2; + resy /= 2; + doubledec = 0; + } + else if (doublepix == 1) { + doubledec = resx % 32; + resx = resx - doubledec; + resx /= 2; + resy /= 2; + doubledec /= 2; + gsurf2 = surface_new (resx*2,resy*2); + } + + gsurf.width = resx; + gsurf.height = resy; + gsurf.size = resx*resy; +} + + +static char * resize_win (int w, int h, int force) { + static char s[256]; + if ((w != sdlGoom.screen_width)||(h != sdlGoom.screen_height)||force) { + static SDL_Event e; + e.resize.type = SDL_VIDEORESIZE; + e.resize.w = w; + e.resize.h = h; + SDL_PushEvent (&e); + } + sprintf (s,"%dx%d",w,h); + return s; +} + +static void +sdl_goom_render_pcm (gint16 data[2][512], gchar *title) +{ +#ifdef BENCHMARK_X86 + uint64_t t0,t1,t2; +#endif + static char *msg_tab[] = { + "What a GOOM! version " VERSION + "\n\n\n\n\n\n\n\n" + "an iOS sotfware production.\n" + "\n\n\n" + "http://www.ios-software.com/", + goom_readme, + goom_big_readme, + "Copyright (c)2000-2004, by Jeko" + }; + static int msg_pos = 0; +#define ENCORE_NUL_LOCK (32*200) + static int encore_nul = 0; + + guint32 *buf; + SDL_Surface *tmpsurf = NULL; + + /* static int spos = -1; */ + + gchar *message = NULL; + + /* TODO : Utiliser une commande dans le pipe * + * int pos = xmms_remote_get_playlist_pos (jeko_vp.xmms_session); + */ + + int forceMode = 0; + +#define NBresoli 11 + static int resoli = 7; + static int resolx[] = {320,320,400,400,512,512,640,640,640,800,800}; + static int resoly[] = {180,240,200,300,280,384,320,400,480,400,600}; + + int i; + SDL_Event event; + + /* Check for events */ + while (SDL_PollEvent (&event)) { /* Loop until there are no events left on + * the queue */ + switch (event.type) { /* Process the appropiate event type */ + case SDL_QUIT: + { + fini = 1; + disable = TRUE; + } + break; + + case SDL_ACTIVEEVENT: + if (event.active.state & SDL_APPACTIVE) + sdlGoom.active = event.active.gain; + break; + + case SDL_KEYDOWN: /* Handle a KEYDOWN event */ + if (event.key.keysym.sym == SDLK_TAB) { + SDL_WM_ToggleFullScreen (surface); + is_fs = !is_fs; + } + + if (event.key.keysym.sym == SDLK_q) { + fini = 1; + } + /* + * TODO : GERER TOUT CA AVEC XMMS REMOTE CTRL ? ou le pipe * + if (event.key.keysym.sym == SDLK_q) { + xmms_remote_quit (jeko_vp.xmms_session); + } + + if (event.key.keysym.sym == SDLK_x) + xmms_remote_play (jeko_vp.xmms_session); + if (event.key.keysym.sym == SDLK_c) + xmms_remote_pause (jeko_vp.xmms_session); + if (event.key.keysym.sym == SDLK_v) + xmms_remote_stop (jeko_vp.xmms_session); + if (event.key.keysym.sym == SDLK_b) + xmms_remote_playlist_next (jeko_vp.xmms_session); + if (event.key.keysym.sym == SDLK_z) + xmms_remote_playlist_prev (jeko_vp.xmms_session); + */ + + if (event.key.keysym.sym == SDLK_f) { + BVAL(sdlGoom.display_fps) = !BVAL(sdlGoom.display_fps); + sdlGoom.display_fps.change_listener(&sdlGoom.display_fps); + } + + if ((event.key.keysym.sym == SDLK_KP_PLUS) && (resoli+1<NBresoli)) { + resoli = resoli+1; + resize_win (resolx[resoli],resoly[resoli],FALSE); + } + if ((event.key.keysym.sym == SDLK_KP_MINUS) && (resoli>0)) { + resoli = resoli-1; + resize_win (resolx[resoli],resoly[resoli],FALSE); + } + + if (event.key.keysym.sym == SDLK_KP_MULTIPLY) { + title = sdl_goom_set_doublepix (!doublepix); + } + if (event.key.keysym.sym == SDLK_ESCAPE) { + if (is_fs) { + SDL_WM_ToggleFullScreen (surface); + is_fs = !is_fs; + } + else if (sdlGoom.config_win == 0) { + sdlGoom.config_win = create_config_window (); + gtk_data_init (&sdlGoom); + gtk_widget_show (sdlGoom.config_win); + message = ""; + } + else { + message = "Configuration Window is Already Open"; + } + } + if (event.key.keysym.sym == SDLK_SPACE) { + encore_nul = ENCORE_NUL_LOCK; + } + + if (event.key.keysym.sym == SDLK_F1) + forceMode = 1; + if (event.key.keysym.sym == SDLK_F2) + forceMode = 2; + if (event.key.keysym.sym == SDLK_F3) + forceMode = 3; + if (event.key.keysym.sym == SDLK_F4) + forceMode = 4; + if (event.key.keysym.sym == SDLK_F5) + forceMode = 5; + if (event.key.keysym.sym == SDLK_F6) + forceMode = 6; + if (event.key.keysym.sym == SDLK_F7) + forceMode = 7; + if (event.key.keysym.sym == SDLK_F8) + forceMode = 8; + if (event.key.keysym.sym == SDLK_F9) + forceMode = 9; + if (event.key.keysym.sym == SDLK_F10) + forceMode = 10; + + break; + case SDL_VIDEORESIZE: + resx = sdlGoom.screen_width = event.resize.w; + resy = sdlGoom.screen_height = event.resize.h; + sdlGoom.doublepix = doublepix; + { + static char s[512]; + sprintf (s,"%dx%d",resx,resy); + title = s; + set_list_param_value(&sdlGoom.screen_size, s); + sdlGoom.screen_size.change_listener (&sdlGoom.screen_size); + } + surface = SDL_SetVideoMode (resx, resy, 32, + SDL_RESIZABLE|SDL_SWSURFACE); + apply_double(); + goom_set_resolution (sdlGoom.plugin,resx, resy); + if (is_fs) + SDL_WM_ToggleFullScreen (surface); + break; + /* default: * Report an unhandled event */ + /* printf("I don't know what this event is!\n"); */ + } + } + + for (i=0;i<512;i++) + if (data[0][i]>2) { + if (encore_nul > ENCORE_NUL_LOCK) + encore_nul = 0; + break; + } + + if ((i == 512) && (!encore_nul)) + encore_nul = ENCORE_NUL_LOCK + 100; + + if (encore_nul == ENCORE_NUL_LOCK) { + message = msg_tab[msg_pos]; + msg_pos ++; + msg_pos %= 4; + } + + if (encore_nul) + encore_nul --; + + if (!sdlGoom.active) { + return; + } + + /* + * TODO: + * if (pos != spos) { + * title = xmms_remote_get_playlist_title (jeko_vp.xmms_session, pos); + * spos = pos; + * } + */ + +#ifdef BENCHMARK_X86 + t0 = GetTick(); +#endif + if (doublepix == 0) + goom_set_screenbuffer(sdlGoom.plugin, surface->pixels); + + buf = goom_update (sdlGoom.plugin, data, forceMode, + BVAL(sdlGoom.display_fps)?framerate_tester_getvalue ():-1, + title, message); + +#ifdef BENCHMARK_X86 + t1 = GetTick(); +#endif + + if (doublepix == 2) { + gsurf.buf = buf; + sdl_pixel_doubler (&gsurf,surface); + } else if (doublepix == 1) { + SDL_Rect rect; + gsurf.buf = buf; + pixel_doubler (&gsurf,gsurf2); + tmpsurf = + SDL_CreateRGBSurfaceFrom (gsurf2->buf, resx*2, resy*2, + 32, resx*8, + 0x00ff0000, 0x0000ff00, 0x000000ff, + 0x00000000); + rect.x = doubledec; + rect.y = 0; + rect.w = resx * 2; + rect.h = resy * 2; + SDL_BlitSurface (tmpsurf, NULL, surface, &rect); + SDL_FreeSurface (tmpsurf); + } + else { +/* tmpsurf = + SDL_CreateRGBSurfaceFrom (buf, resx, resy, 32, resx * 4, + 0x00ff0000, 0x0000ff00, 0x000000ff, + 0x00000000); + SDL_BlitSurface (tmpsurf, NULL, surface, NULL); + SDL_FreeSurface (tmpsurf); + SDL_LockSurface(surface); + memcpy(surface->pixels, buf, resx * resy * 4); + SDL_UnlockSurface(surface); +*/ + } + SDL_Flip (surface); +#ifdef BENCHMARK_X86 + t2 = GetTick(); + + t2 -= t1; + t1 -= t0; + { + double ft1, ft2; + static double min_t1 = 1000.0, + min_t2 = 1000.0; + static double moy_t1 = 150.0; + static double moy_t2 = 40.0; + + ft1 = (double)(t1 / sdlGoom.plugin->screen.size); + ft2 = (double)(t2 / sdlGoom.plugin->screen.size); + + if (ft1 < min_t1) + min_t1 = ft1; + if (ft2 < min_t2) + min_t2 = ft2; + + moy_t1 = ((moy_t1 * 15.0) + ft1) / 16.0; + moy_t2 = ((moy_t2 * 15.0) + ft2) / 16.0; + printf("UPDATE = %4.0f/%3.0f CPP ", moy_t1, min_t1); + printf("DISPLAY = %4.0f/%3.0f CPP\n", moy_t2, min_t2); + } +#endif + + framerate_tester_newframe (); +} + + +char *sdl_goom_set_doublepix (int dp) { + if (doublepix && dp) return " "; + if (!doublepix && !dp) return " "; + + doublepix = dp; + BVAL(sdlGoom.pix_double) = dp; + sdlGoom.pix_double.change_listener(&sdlGoom.pix_double); + if (doublepix) + return resize_win (resx,resy,TRUE); + else + return resize_win (resx*2,resy*2,TRUE); +} + +void sdl_goom_set_fps (int fps) { + MAX_FRAMERATE = fps; + INTERPIX = 1000.0 / MAX_FRAMERATE; +} + +void pix_double_changed (PluginParam *p) { + sdl_goom_set_doublepix (BVAL(*p)); +} + +void screen_size_changed (PluginParam *p) { + int i; + static struct Resol { char*name; int x; int y; } res[4] = { + {"320x240", 320, 240}, + {"400x300", 400, 300}, + {"640x480", 640, 480}, + {"800x600", 800, 600}}; + + for (i=4;i--;) { + if (!strcmp(LVAL(*p),res[i].name)) + resize_win (res[i].x,res[i].y,FALSE); + } +} + +void fps_limit_changed (PluginParam *p) { + MAX_FRAMERATE = IVAL(*p); + INTERPIX = 1000.0 / MAX_FRAMERATE; +} + +void hide_cursor_changed (PluginParam *p) { + SDL_ShowCursor(!BVAL(*p)); +} diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.h b/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.h new file mode 100644 index 0000000000..6bb1b9d811 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_goom.h @@ -0,0 +1,30 @@ +#ifndef _SDL_GOOM_H +#define _SDL_GOOM_H + +#include <gtk/gtk.h> +#include "goom_config_param.h" +#include "goom_plugin_info.h" + +typedef struct _SDL_GOOM { + GtkWidget *config_win; + + int screen_width; + int screen_height; + int doublepix; + int active; + + PluginInfo *plugin; /* infos about the plugin (see plugin_info.h) */ + + PluginParameters screen; /* contains screen_size, pix_double, fps_limit */ + + PluginParam screen_size; + PluginParam pix_double; + PluginParam fps_limit; + PluginParam display_fps; + PluginParam hide_cursor; + +} SdlGoom; + +void gtk_data_init(SdlGoom *sdlGoom); + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.c new file mode 100644 index 0000000000..e3587ac957 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.c @@ -0,0 +1,51 @@ +#include "pixeldoubler.h" +#include <SDL/SDL.h> +#include <stdlib.h> +#include <string.h> + +void sdl_pixel_doubler (Surface *src, SDL_Surface *dest) { + register int *d; // pointeur sur le pixel courant a marquer + register int *s; // pointeur sur le pixel coutant en cours de lecture + int sw; // nombre d'octet de largeur de ligne de la surface source + int sw2,swd; + int fd; // adresse de la fin du buffer destination + int fin; // adresse de fin d'une ligne du buffer source + + SDL_LockSurface (dest); + + d = dest->pixels; + s = src->buf; + + sw = src->width << 2; + sw2 = dest->pitch; + swd = sw2 - sw * 2; + + fin = (int)s; + fd = (int)d + (sw2 * src->height * 2); + + // tant que tout le buffer source n'est pas remplit + while ((int)d < fd) { + + // passer a la ligne suivante du buffer source + fin += sw; + + // l'afficher sur une ligne du buffer destination + while ((int)s < fin) { + register int col = *(s++); + // 2 affichage par point du buffer source (doubling horizontal) + *(d++) = col; *(d++) = col; + } + d = (int*)((char*)d + swd); + + // puis l'afficher sur une autre ligne (doubling vertical) + memcpy (d, ((char*)d) - sw2, sw2); +/* s = (int*)((int)s - sw); // retour au debut de la ligne src + while ((int)s < fin) { + register int col = *(s++); + *(d++) = col; *(d++) = col; // idem (cf plus haut) + } */ + d = (int*)((char*)d + sw2); + } + + SDL_UnlockSurface (dest); +} diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.h b/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.h new file mode 100644 index 0000000000..24a60398cb --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/sdl_pixeldoubler.h @@ -0,0 +1,2 @@ +#include <SDL/SDL.h> +void sdl_pixel_doubler (Surface *src, SDL_Surface *dest); diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/surface.c b/src/visualizations/Goom/goom2k4-0/sdl-goom/surface.c new file mode 100644 index 0000000000..2a452564b0 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/surface.c @@ -0,0 +1,18 @@ +#include "surface.h" +#include <stdlib.h> + +Surface * surface_new (int w, int h) { + Surface * s = (Surface*)malloc(sizeof(Surface)); + s->realstart = (int*)malloc(w*h*4 + 128); + s->buf = (int*)((int)s->realstart + 128 - (((int)s->realstart) % 128)); + s->size = w*h; + s->width = w; + s->height = h; + return s; +} + +void surface_delete (Surface **s) { + free ((*s)->realstart); + free (*s); + *s = NULL; +} diff --git a/src/visualizations/Goom/goom2k4-0/sdl-goom/surface.h b/src/visualizations/Goom/goom2k4-0/sdl-goom/surface.h new file mode 100644 index 0000000000..61c73d19a4 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/sdl-goom/surface.h @@ -0,0 +1,16 @@ +#ifndef _SURFACE_H +#define _SURFACE_H + +typedef struct { + int * buf; + int width; + int height; + int size; + + int * realstart; +} Surface; + +Surface * surface_new (int w, int h) ; +void surface_delete (Surface **s) ; + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/DOCODE.TXT b/src/visualizations/Goom/goom2k4-0/src/DOCODE.TXT new file mode 100644 index 0000000000..76c820af6c --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/DOCODE.TXT @@ -0,0 +1,55 @@ +Les différentes données.. +----- + +typedef struct { + int32 * buf; + int32 width; + int32 height; + int32 size; + + int32 * realstart; +} Surface; +----- + +>> taille du buffer de zoom +guint32 mmx_zoom_size; +----- + +>> les buffers bruts contiennent les px et py de chaque point +>> => brutS[0] = px0, brutS[1] = py0, brutS[2] = px1, [...] + +signed int *brutS = 0, *freebrutS = 0; // source +signed int *brutD = 0, *freebrutD = 0; // dest +signed int *brutT = 0, *freebrutT = 0; // temp (en cours de génération) + +>> pointeur vers p1 +guint32 *expix1 = 0; +>> pointeur vers p2 +guint32 *expix2 = 0; + +>> largeur d'une ligne = prevX +guint32 zoom_width; + +>> largeur et hauteur des differents buffers. +int prevX=0,prevY=0; +----- + +>> buffratio est un fixpoint : 16,16 +>> valeur normalement comprise entre 0 et 1, +>> soit 0<=buffratio<=BUFFPOINTMASK + +int buffratio = 0; + +#define BUFFPOINTNB 16 +#define BUFFPOINTMASK 0xffff +#define BUFFINCR 0xff +----- + +#define sqrtperte 16 +>> faire : a % sqrtperte <=> a & pertemask +#define PERTEMASK 0xf +>> faire : a / sqrtperte <=> a >> PERTEDEC +#define PERTEDEC 4 +----- + +int precalCoef[16][16]; diff --git a/src/visualizations/Goom/goom2k4-0/src/Makefile.am b/src/visualizations/Goom/goom2k4-0/src/Makefile.am new file mode 100644 index 0000000000..c03dc51d2c --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/Makefile.am @@ -0,0 +1,34 @@ +# libgoom2 + +if HAVE_MMX +MMX_FILES=mmx.c xmmx.c +else +MMX_FILES= +endif + +if HAVE_PPC +PPC_FILES=ppc_zoom_ultimate.s ppc_drawings.s +else +PPC_FILES= +endif + +goom2_lib_LTLIBRARIES = libgoom2.la +goom2_libdir = $(libdir) + +goom2_library_includedir=$(includedir)/goom +goom2_library_include_HEADERS = goom.h goom_plugin_info.h goom_typedefs.h goom_graphic.h goom_config_param.h goom_visual_fx.h goom_filters.h goom_tools.h goomsl.h goomsl_hash.h goomsl_heap.h goom_tools.h goom_config.h +libgoom2_la_LDFLAGS = -export-dynamic -export-symbols-regex "goom.*" +libgoom2_la_SOURCES = \ + goomsl_yacc.y goomsl_lex.l goomsl.c goomsl_hash.c goomsl_heap.c \ + goom_tools.c $(MMX_FILES) $(PPC_FILES) \ + config_param.c convolve_fx.c filters.c \ + flying_stars_fx.c gfontlib.c gfontrle.c \ + goom_core.c graphic.c ifs.c lines.c \ + mathtools.c sound_tester.c surf3d.c \ + tentacle3d.c plugin_info.c \ + v3d.c drawmethods.c \ + cpu_info.c + +AM_YFLAGS=-d + +noinst_HEADERS = mmx.h diff --git a/src/visualizations/Goom/goom2k4-0/src/TODO b/src/visualizations/Goom/goom2k4-0/src/TODO new file mode 100644 index 0000000000..63a13f5775 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/TODO @@ -0,0 +1,32 @@ +Idees: + +- Flash lights (Phosphor) + --> --> --> + <-- <-- <-- + +- Re-remplir RAND regulierement (1/tour) + +- Un effect qui affecte la displacement map: + +- Enregistrer l'etat de la config, s'en servir pour definir un etat de goom. + +- PluginParam de type Button, avec juste un listener en donnee. + +- PluginParam de type TextField. + +- Liste des modes possibles pour l'effet de BG. + +- Goom lui-meme : liste des effets actifs. + mode automatique / manuel (plus de changement aleatoires) + +- Possibilite d'envoyer des commandes format text au Core. exemples : +" BRIGHT_FLASH.SCREEN_BRIGHTNESS=200.0 + if SOUND.GOOM_DETECTION > 0 + 3D_TENTACLES.ENABLED = 1 + endif + CORE.MAIN_SCRIPT="..." +" + void goom_execute_script(const char *cmds); + void goom_set_main_script(const char *script); /// peut retourner un message d'erreur ? + char *goom_create_state_script(); /* retourne un script permettant de remettre goom dans l'etat actuel */ + diff --git a/src/visualizations/Goom/goom2k4-0/src/config_param.c b/src/visualizations/Goom/goom2k4-0/src/config_param.c new file mode 100644 index 0000000000..c6402834ad --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/config_param.c @@ -0,0 +1,110 @@ +/*---------------------------------------------------------------------------*/ +/* +** config_param.c +** Goom Project +** +** Created by Jean-Christophe Hoelt on Sat Jul 19 2003 +** Copyright (c) 2003 iOS. All rights reserved. +*/ +/*---------------------------------------------------------------------------*/ + +#include "goom_config_param.h" +#include <string.h> + +/* TODO: Ajouter goom_ devant ces fonctions */ + +static void empty_fct(PluginParam *dummy) { +} + +PluginParam goom_secure_param() { + PluginParam p; + p.changed = empty_fct; + p.change_listener = empty_fct; + p.user_data = 0; + p.name = p.desc = 0; + p.rw = 1; + return p; +} + +PluginParam goom_secure_f_param(char *name) { + PluginParam p = secure_param(); + p.name = name; + p.type = PARAM_FLOATVAL; + FVAL(p) = 0.5f; + FMIN(p) = 0.0f; + FMAX(p) = 1.0f; + FSTEP(p) = 0.01f; + return p; +} + +PluginParam goom_secure_f_feedback(char *name) { + PluginParam p = secure_f_param(name); + p.rw = 0; + return p; +} + +PluginParam goom_secure_s_param(char *name) { + PluginParam p = secure_param(); + p.name = name; + p.type = PARAM_STRVAL; + SVAL(p) = 0; + return p; +} + +PluginParam goom_secure_b_param(char *name, int value) { + PluginParam p = secure_param(); + p.name = name; + p.type = PARAM_BOOLVAL; + BVAL(p) = value; + return p; +} + +PluginParam goom_secure_i_param(char *name) { + PluginParam p = secure_param(); + p.name = name; + p.type = PARAM_INTVAL; + IVAL(p) = 50; + IMIN(p) = 0; + IMAX(p) = 100; + ISTEP(p) = 1; + return p; +} + +PluginParam goom_secure_i_feedback(char *name) { + PluginParam p = secure_i_param(name); + p.rw = 0; + return p; +} + +PluginParameters goom_plugin_parameters(const char *name, int nb) { + PluginParameters p; + p.name = (char *)name; + p.desc = ""; + p.nbParams = nb; + p.params = (PluginParam**)malloc(nb*sizeof(PluginParam*)); + return p; +} + +/*---------------------------------------------------------------------------*/ + +void goom_set_str_param_value(PluginParam *p, const char *str) { + int len = strlen(str); + if (SVAL(*p)) + SVAL(*p) = (char*)realloc(SVAL(*p), len+1); + else + SVAL(*p) = (char*)malloc(len+1); + memcpy(SVAL(*p), str, len+1); +} + +void goom_set_list_param_value(PluginParam *p, const char *str) { + int len = strlen(str); +#ifdef VERBOSE + printf("%s: %d\n", str, len); +#endif + if (LVAL(*p)) + LVAL(*p) = (char*)realloc(LVAL(*p), len+1); + else + LVAL(*p) = (char*)malloc(len+1); + memcpy(LVAL(*p), str, len+1); +} + diff --git a/src/visualizations/Goom/goom2k4-0/src/convolve_fx.c b/src/visualizations/Goom/goom2k4-0/src/convolve_fx.c new file mode 100644 index 0000000000..ce11382a64 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/convolve_fx.c @@ -0,0 +1,336 @@ +#include "goom_fx.h" +#include "goom_plugin_info.h" +#include "goomsl.h" +#include "goom_config.h" +#include <math.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +//#define CONV_MOTIF_W 32 +//#define CONV_MOTIF_WMASK 0x1f + +#define CONV_MOTIF_W 128 +#define CONV_MOTIF_WMASK 0x7f + +typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W]; + +#include "motif_goom1.h" +#include "motif_goom2.h" + +#define NB_THETA 512 + +#define MAX 2.0f + +typedef struct _CONV_DATA{ + PluginParam light; + PluginParam factor_adj_p; + PluginParam factor_p; + PluginParameters params; + + GoomSL *script; + + /* rotozoom */ + int theta; + float ftheta; + int h_sin[NB_THETA]; + int h_cos[NB_THETA]; + int h_height; + float visibility; + Motif conv_motif; + int inverse_motif; + +} ConvData; + +/* init rotozoom tables */ +static void compute_tables(VisualFX *_this, PluginInfo *info) +{ + ConvData *data = (ConvData*)_this->fx_data; + double screen_coef; + int i; + double h; + double radian; + + if (data->h_height == info->screen.height) return; + + screen_coef = 2.0 * 300.0 / (double)info->screen.height; + data->h_height = info->screen.height; + + for ( i=0 ; i<NB_THETA ; i++ ) { + radian = 2*i*M_PI/NB_THETA; + h = (0.2 + cos (radian) / 15.0 * sin(radian * 2.0 + 12.123)) * screen_coef; + data->h_cos[i] = 0x10000 * (-h * cos (radian) * cos(radian)); + data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin(radian)); + } +} + +static void set_motif(ConvData *data, Motif motif) +{ + int i,j; + for (i=0;i<CONV_MOTIF_W;++i) for (j=0;j<CONV_MOTIF_W;++j) + data->conv_motif[i][j] = motif[CONV_MOTIF_W-i-1][CONV_MOTIF_W-j-1]; +} + +static void convolve_init(VisualFX *_this, PluginInfo *info) { + ConvData *data; + data = (ConvData*)malloc(sizeof(ConvData)); + _this->fx_data = (void*)data; + + data->light = secure_f_param("Screen Brightness"); + data->light.param.fval.max = 300.0f; + data->light.param.fval.step = 1.0f; + data->light.param.fval.value = 100.0f; + + data->factor_adj_p = secure_f_param("Flash Intensity"); + data->factor_adj_p.param.fval.max = 200.0f; + data->factor_adj_p.param.fval.step = 1.0f; + data->factor_adj_p.param.fval.value = 70.0f; + + data->factor_p = secure_f_feedback("Factor"); + + data->params = plugin_parameters ("Bright Flash", 5); + data->params.params[0] = &data->light; + data->params.params[1] = &data->factor_adj_p; + data->params.params[2] = 0; + data->params.params[3] = &data->factor_p; + data->params.params[4] = 0; + + /* init rotozoom tables */ + compute_tables(_this, info); + data->theta = 0; + data->ftheta = 0.0; + data->visibility = 1.0; + set_motif(data, CONV_MOTIF2); + data->inverse_motif = 0; + + _this->params = &data->params; +} + +static void convolve_free(VisualFX *_this) { + ConvData *data = _this->fx_data; + free (data->params.params); + free (data); +} + +static void create_output_with_brightness(VisualFX *_this, Pixel *src, Pixel *dest, + PluginInfo *info, int iff) +{ + ConvData *data = (ConvData*)_this->fx_data; + + int x,y; + int i = 0;//info->screen.height * info->screen.width - 1; + + const int c = data->h_cos [data->theta]; + const int s = data->h_sin [data->theta]; + + const int xi = -(info->screen.width/2) * c; + const int yi = (info->screen.width/2) * s; + + const int xj = -(info->screen.height/2) * s; + const int yj = -(info->screen.height/2) * c; + + int xprime = xj; + int yprime = yj; + + int ifftab[16]; + if (data->inverse_motif) { + int i; + for (i=0;i<16;++i) + ifftab[i] = (double)iff * (1.0 + data->visibility * (15.0 - i) / 15.0); + } + else { + int i; + for (i=0;i<16;++i) + ifftab[i] = (double)iff / (1.0 + data->visibility * (15.0 - i) / 15.0); + } + + for (y=info->screen.height;y--;) { + int xtex,ytex; + + xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2; + xprime += s; + + ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2; + yprime += c; + +#ifdef HAVE_MMX + __asm__ __volatile__ + ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ + "\n\t movd %[xtex], %%mm2" + "\n\t movd %[ytex], %%mm3" + "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */ + "\n\t movd %[c], %%mm4" + "\n\t movd %[s], %%mm6" + "\n\t pxor %%mm5, %%mm5" + "\n\t psubd %%mm6, %%mm5" + "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */ + "\n\t movd %[motif], %%mm6" /* mm6 = motif */ + + ::[xtex]"g"(xtex) ,[ytex]"g"(ytex) + , [c]"g"(c), [s]"g"(s) + , [motif] "g"(&data->conv_motif[0][0])); + + for (x=info->screen.width;x--;) + { + __asm__ __volatile__ + ( + "\n\t movd %[src], %%mm0" /* mm0 = src */ + "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */ + "\n\t movd %%esi, %%mm5" /* save esi into mm5 */ + "\n\t movq %%mm2, %%mm3" + "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */ + "\n\t movd %%mm3, %%eax" /* eax = xtex' */ + + "\n\t psrlq $25, %%mm3" + "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */ + + "\n\t andl $127, %%eax" + "\n\t andl $16256, %%ecx" + + "\n\t addl %%ecx, %%eax" + "\n\t movd %%mm6, %%esi" /* esi = motif */ + "\n\t xorl %%ecx, %%ecx" + "\n\t movb (%%eax,%%esi), %%cl" + + "\n\t movl %[ifftab], %%eax" + "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */ + "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */ + + "\n\t punpcklwd %%mm1, %%mm1" + "\n\t punpcklbw %%mm7, %%mm0" + "\n\t punpckldq %%mm1, %%mm1" + "\n\t psrlw $1, %%mm0" + "\n\t psrlw $2, %%mm1" + "\n\t pmullw %%mm1, %%mm0" + "\n\t psrlw $5, %%mm0" + "\n\t packuswb %%mm7, %%mm0" + "\n\t movd %%mm0, %[dest]" + : [dest] "=g" (dest[i].val) + : [src] "g" (src[i].val) + , [ifftab]"g"(&ifftab[0]) + : "eax","ecx"); + + i++; + } +#else + for (x=info->screen.width;x--;) { + + int iff2; + unsigned int f0,f1,f2,f3; + + xtex += c; + ytex -= s; + + iff2 = ifftab[data->conv_motif[(ytex >>16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]]; + +#define sat(a) ((a)>0xFF?0xFF:(a)) + f0 = src[i].val; + f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8; + f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8; + f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8; + dest[i].val = (sat(f1) << R_OFFSET) | (sat(f2) << G_OFFSET) | (sat(f3) << B_OFFSET); +/* + f0 = (src[i].cop[0] * iff2) >> 8; + f1 = (src[i].cop[1] * iff2) >> 8; + f2 = (src[i].cop[2] * iff2) >> 8; + f3 = (src[i].cop[3] * iff2) >> 8; + + dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0; + dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1; + dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2; + dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3; +*/ + i++; + } +#endif + } +#ifdef HAVE_MMX + __asm__ __volatile__ ("\n\t emms"); +#endif + + compute_tables(_this, info); +} + + +/*#include <stdint.h> + +static uint64_t GetTick() +{ + uint64_t x; + asm volatile ("RDTSC" : "=A" (x)); + return x; +}*/ + + +static void convolve_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) { + + ConvData *data = (ConvData*)_this->fx_data; + float ff; + int iff; + + ff = (FVAL(data->factor_p) * FVAL(data->factor_adj_p) + FVAL(data->light) ) / 100.0f; + iff = (unsigned int)(ff * 256); + + { + double fcycle = (double)info->cycle; + double rotate_param, rotate_coef; + float INCREASE_RATE = 1.5; + float DECAY_RATE = 0.955; + if (FVAL(info->sound.last_goom_p) > 0.8) + FVAL(data->factor_p) += FVAL(info->sound.goom_power_p) * INCREASE_RATE; + FVAL(data->factor_p) *= DECAY_RATE; + + rotate_param = FVAL(info->sound.last_goom_p); + if (rotate_param < 0.0) + rotate_param = 0.0; + rotate_param += FVAL(info->sound.goom_power_p); + + rotate_coef = 4.0 + FVAL(info->sound.goom_power_p) * 6.0; + data->ftheta = (data->ftheta + rotate_coef * sin(rotate_param * 6.3)); + data->theta = ((unsigned int)data->ftheta) % NB_THETA; + data->visibility = (cos(fcycle * 0.001 + 1.5) * sin(fcycle * 0.008) + cos(fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5; + if (data->visibility < 0.0) data->visibility = 0.0; + data->factor_p.change_listener(&data->factor_p); + } + + if (data->visibility < 0.01) { + switch (goom_irand(info->gRandom, 300)) + { + case 1: + set_motif(data, CONV_MOTIF1); data->inverse_motif = 1; break; + case 2: + set_motif(data, CONV_MOTIF2); data->inverse_motif = 0; break; + } + } + + if ((ff > 0.98f) && (ff < 1.02f)) + memcpy(dest, src, info->screen.size * sizeof(Pixel)); + else + create_output_with_brightness(_this,src,dest,info,iff); +/* +// Benching suite... + { + uint64_t before, after; + double timed; + static double stimed = 10000.0; + before = GetTick(); + data->visibility = 1.0; + create_output_with_brightness(_this,src,dest,info,iff); + after = GetTick(); + timed = (double)((after-before) / info->screen.size); + if (timed < stimed) { + stimed = timed; + printf ("CLK = %3.0f CPP\n", stimed); + } + } +*/ +} + +VisualFX convolve_create(void) { + VisualFX vfx; + vfx.init = convolve_init; + vfx.free = convolve_free; + vfx.apply = convolve_apply; + vfx.fx_data = 0; + return vfx; +} diff --git a/src/visualizations/Goom/goom2k4-0/src/convolve_fx.c.jc b/src/visualizations/Goom/goom2k4-0/src/convolve_fx.c.jc new file mode 100644 index 0000000000..bd4c3e0850 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/convolve_fx.c.jc @@ -0,0 +1,333 @@ +#include "goom_fx.h" +#include "goom_plugin_info.h" +#include "goomsl.h" +#include "goom_config.h" +#include <math.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +//#define CONV_MOTIF_W 32 +//#define CONV_MOTIF_WMASK 0x1f + +#define CONV_MOTIF_W 128 +#define CONV_MOTIF_WMASK 0x7f + +typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W]; + +#include "motif_goom1.h" +#include "motif_goom2.h" + +#define NB_THETA 512 + +#define MAX 2.0f + +typedef struct _CONV_DATA{ + PluginParam light; + PluginParam factor_adj_p; + PluginParam factor_p; + PluginParameters params; + + GoomSL *script; + + /* rotozoom */ + int theta; + float ftheta; + int h_sin[NB_THETA]; + int h_cos[NB_THETA]; + int h_height; + float visibility; + Motif conv_motif; + int inverse_motif; + +} ConvData; + +/* init rotozoom tables */ +static void compute_tables(VisualFX *_this, PluginInfo *info) +{ + ConvData *data = (ConvData*)_this->fx_data; + double screen_coef; + int i; + double h; + double radian; + + if (data->h_height == info->screen.height) return; + + screen_coef = 2.0 * 300.0 / (double)info->screen.height; + data->h_height = info->screen.height; + + for ( i=0 ; i<NB_THETA ; i++ ) { + radian = 2*i*M_PI/NB_THETA; + h = (0.2 + cos (radian) / 15.0 * sin(radian * 2.0 + 12.123)) * screen_coef; + data->h_cos[i] = 0x10000 * (-h * cos (radian) * cos(radian)); + data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin(radian)); + } +} + +static void set_motif(ConvData *data, Motif motif) +{ + int i,j; + for (i=0;i<CONV_MOTIF_W;++i) for (j=0;j<CONV_MOTIF_W;++j) + data->conv_motif[i][j] = motif[CONV_MOTIF_W-i-1][CONV_MOTIF_W-j-1]; +} + +static void convolve_init(VisualFX *_this, PluginInfo *info) { + ConvData *data; + data = (ConvData*)malloc(sizeof(ConvData)); + _this->fx_data = (void*)data; + + data->light = secure_f_param("Screen Brightness"); + data->light.param.fval.max = 300.0f; + data->light.param.fval.step = 1.0f; + data->light.param.fval.value = 100.0f; + + data->factor_adj_p = secure_f_param("Flash Intensity"); + data->factor_adj_p.param.fval.max = 200.0f; + data->factor_adj_p.param.fval.step = 1.0f; + data->factor_adj_p.param.fval.value = 70.0f; + + data->factor_p = secure_f_feedback("Factor"); + + data->params = plugin_parameters ("Bright Flash", 5); + data->params.params[0] = &data->light; + data->params.params[1] = &data->factor_adj_p; + data->params.params[2] = 0; + data->params.params[3] = &data->factor_p; + data->params.params[4] = 0; + + /* init rotozoom tables */ + compute_tables(_this, info); + data->theta = 0; + data->ftheta = 0.0; + data->visibility = 1.0; + set_motif(data, CONV_MOTIF2); + data->inverse_motif = 0; + + _this->params = &data->params; +} + +static void convolve_free(VisualFX *_this) { + free (_this->fx_data); +} + +static void create_output_with_brightness(VisualFX *_this, Pixel *src, Pixel *dest, + PluginInfo *info, int iff) +{ + ConvData *data = (ConvData*)_this->fx_data; + + int x,y; + int i = 0;//info->screen.height * info->screen.width - 1; + + const int c = data->h_cos [data->theta]; + const int s = data->h_sin [data->theta]; + + const int xi = -(info->screen.width/2) * c; + const int yi = (info->screen.width/2) * s; + + const int xj = -(info->screen.height/2) * s; + const int yj = -(info->screen.height/2) * c; + + int xprime = xj; + int yprime = yj; + + int ifftab[16]; + if (data->inverse_motif) { + int i; + for (i=0;i<16;++i) + ifftab[i] = (double)iff * (1.0 + data->visibility * (15.0 - i) / 15.0); + } + else { + int i; + for (i=0;i<16;++i) + ifftab[i] = (double)iff / (1.0 + data->visibility * (15.0 - i) / 15.0); + } + + for (y=info->screen.height;y--;) { + int xtex,ytex; + + xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2; + xprime += s; + + ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2; + yprime += c; + +#ifdef HAVE_MMX + __asm__ __volatile__ + ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ + "\n\t movd %[xtex], %%mm2" + "\n\t movd %[ytex], %%mm3" + "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */ + "\n\t movd %[c], %%mm4" + "\n\t movd %[s], %%mm6" + "\n\t pxor %%mm5, %%mm5" + "\n\t psubd %%mm6, %%mm5" + "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */ + "\n\t movd %[motif], %%mm6" /* mm6 = motif */ + + ::[xtex]"g"(xtex) ,[ytex]"g"(ytex) + , [c]"g"(c), [s]"g"(s) + , [motif] "g"(&data->conv_motif[0][0])); + + for (x=info->screen.width;x--;) + { + __asm__ __volatile__ + ( + "\n\t movd %[src], %%mm0" /* mm0 = src */ + "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */ + "\n\t movd %%esi, %%mm5" /* save esi into mm5 */ + "\n\t movq %%mm2, %%mm3" + "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */ + "\n\t movd %%mm3, %%eax" /* eax = xtex' */ + + "\n\t psrlq $25, %%mm3" + "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */ + + "\n\t andl $127, %%eax" + "\n\t andl $16256, %%ecx" + + "\n\t addl %%ecx, %%eax" + "\n\t movd %%mm6, %%esi" /* esi = motif */ + "\n\t xorl %%ecx, %%ecx" + "\n\t movb (%%eax,%%esi), %%cl" + + "\n\t movl %[ifftab], %%eax" + "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */ + "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */ + + "\n\t punpcklwd %%mm1, %%mm1" + "\n\t punpcklbw %%mm7, %%mm0" + "\n\t punpckldq %%mm1, %%mm1" + "\n\t psrlw $1, %%mm0" + "\n\t psrlw $1, %%mm1" + "\n\t pmullw %%mm1, %%mm0" + "\n\t psrlw $6, %%mm0" + "\n\t packuswb %%mm7, %%mm0" + "\n\t movd %%mm0, %[dest]" + : [dest] "=g" (dest[i].val) + : [src] "g" (src[i].val) + , [ifftab]"g"(&ifftab[0]) + : "eax","ecx"); + + i++; + } +#else + for (x=info->screen.width;x--;) { + + int iff2; + unsigned int f0,f1,f2,f3; + + xtex += c; + ytex -= s; + + iff2 = ifftab[data->conv_motif[(ytex >>16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]]; + +#define sat(a) ((a)>0xFF?0xFF:(a)) + f0 = src[i].val; + f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8; + f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8; + f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8; + dest[i].val = (sat(f1) << R_OFFSET) | (sat(f2) << G_OFFSET) | (sat(f3) << B_OFFSET); +/* + f0 = (src[i].cop[0] * iff2) >> 8; + f1 = (src[i].cop[1] * iff2) >> 8; + f2 = (src[i].cop[2] * iff2) >> 8; + f3 = (src[i].cop[3] * iff2) >> 8; + + dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0; + dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1; + dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2; + dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3; +*/ + i++; + } +#endif + } + __asm__ __volatile__ ("\n\t emms"); + + compute_tables(_this, info); +} + +/* +#include <stdint.h> + +static uint64_t GetTick() +{ + uint64_t x; + asm volatile ("RDTSC" : "=A" (x)); + return x; +} +*/ + +static void convolve_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) { + + ConvData *data = (ConvData*)_this->fx_data; + float ff; + int iff; + + ff = (FVAL(data->factor_p) * FVAL(data->factor_adj_p) + FVAL(data->light) ) / 100.0f; + iff = (unsigned int)(ff * 256); + + { + double fcycle = (double)info->cycle; + double rotate_param, rotate_coef; + float INCREASE_RATE = 1.5; + float DECAY_RATE = 0.955; + if (FVAL(info->sound.last_goom_p) > 0.8) + FVAL(data->factor_p) += FVAL(info->sound.goom_power_p) * INCREASE_RATE; + FVAL(data->factor_p) *= DECAY_RATE; + + rotate_param = FVAL(info->sound.last_goom_p); + if (rotate_param < 0.0) + rotate_param = 0.0; + rotate_param += FVAL(info->sound.goom_power_p); + + rotate_coef = 4.0 + FVAL(info->sound.goom_power_p) * 6.0; + data->ftheta = (data->ftheta + rotate_coef * sin(rotate_param * 6.3)); + data->theta = ((unsigned int)data->ftheta) % NB_THETA; + data->visibility = (cos(fcycle * 0.001 + 1.5) * sin(fcycle * 0.008) + cos(fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5; + if (data->visibility < 0.0) data->visibility = 0.0; + data->factor_p.change_listener(&data->factor_p); + } + + if (data->visibility < 0.01) { + switch (goom_irand(info->gRandom, 300)) + { + case 1: + set_motif(data, CONV_MOTIF1); data->inverse_motif = 1; break; + case 2: + set_motif(data, CONV_MOTIF2); data->inverse_motif = 0; break; + } + } + + if ((ff > 0.96f) && (ff < 1.04f)) + memcpy(dest, src, info->screen.size * sizeof(Pixel)); + else + create_output_with_brightness(_this,src,dest,info,iff); +/* + Benching suite... + { + uint64_t before, after; + double timed; + static double stimed = 10000.0; + before = GetTick(); + data->visibility = 1.0; + create_output_with_brightness(_this,src,dest,info,iff); + after = GetTick(); + timed = (double)((after-before) / info->screen.size); + if (timed < stimed) { + stimed = timed; + printf ("CLK = %3.0f CPP\n", stimed); + } + } +*/ +} + +VisualFX convolve_create(void) { + VisualFX vfx = { + init: convolve_init, + free: convolve_free, + apply: convolve_apply, + fx_data: 0 + }; + return vfx; +} diff --git a/src/visualizations/Goom/goom2k4-0/src/cpu_info.c b/src/visualizations/Goom/goom2k4-0/src/cpu_info.c new file mode 100644 index 0000000000..14e150e159 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/cpu_info.c @@ -0,0 +1,71 @@ +/* + * cpu_info.c + * Goom + * + * Created by Guillaume Borios on Sun Dec 28 2003. + * Copyright (c) 2003 iOS. All rights reserved. + * + */ + +#include "cpu_info.h" + +#ifdef CPU_X86 +#include "mmx.h" +#endif + +#ifdef CPU_POWERPC +#include <sys/types.h> +#include <stdlib.h> +#endif + +static unsigned int CPU_FLAVOUR = 0; +static unsigned int CPU_NUMBER = 1; +static unsigned int CPU_DETECTED = 0; + +static void autoset_cpu_info (void) +{ + CPU_DETECTED = 1; + +#ifdef CPU_POWERPC + int result; + size_t size; + + result = 0; + size = 4; + if (sysctlbyname("hw.optional.altivec",&result,&size,NULL,NULL) == 0) + { + if (result != 0) CPU_FLAVOUR |= CPU_OPTION_ALTIVEC; + } + + result = 0; + size = 4; + if (sysctlbyname("hw.optional.64bitops",&result,&size,NULL,NULL) == 0) + { + if (result != 0) CPU_FLAVOUR |= CPU_OPTION_64_BITS; + } + + result = 0; + size = 4; + if (sysctlbyname("hw.ncpu",&result,&size,NULL,NULL) == 0) + { + if (result != 0) CPU_NUMBER = result; + } +#endif /* CPU_POWERPC */ + +#ifdef CPU_X86 + if (mmx_supported()) CPU_FLAVOUR |= CPU_OPTION_MMX; + if (xmmx_supported()) CPU_FLAVOUR |= CPU_OPTION_XMMX; +#endif /* CPU_X86 */ +} + +unsigned int cpu_flavour (void) +{ + if (CPU_DETECTED == 0) autoset_cpu_info(); + return CPU_FLAVOUR; +} + +unsigned int cpu_number (void) +{ + if (CPU_DETECTED == 0) autoset_cpu_info(); + return CPU_NUMBER; +} diff --git a/src/visualizations/Goom/goom2k4-0/src/cpu_info.h b/src/visualizations/Goom/goom2k4-0/src/cpu_info.h new file mode 100644 index 0000000000..81e66b5f1a --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/cpu_info.h @@ -0,0 +1,34 @@ +#ifndef CPU_INFO_H +#define CPU_INFO_H + +/* + * cpu_info.h + * Goom + * + * Created by Guillaume Borios on Sun Dec 28 2003. + * Copyright (c) 2003 iOS. All rights reserved. + * + */ + +#ifdef HAVE_MMX +#ifndef CPU_X86 +#define CPU_X86 +#endif +#endif + +/* Returns the CPU flavour described with the constants below */ +unsigned int cpu_flavour (void); + +#define CPU_OPTION_ALTIVEC 0x1 +#define CPU_OPTION_64_BITS 0x2 +#define CPU_OPTION_MMX 0x4 +#define CPU_OPTION_XMMX 0x8 +#define CPU_OPTION_SSE 0x10 +#define CPU_OPTION_SSE2 0x20 +#define CPU_OPTION_3DNOW 0x40 + + +/* Returns the CPU number */ +unsigned int cpu_number (void); + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/default_script.goom b/src/visualizations/Goom/goom2k4-0/src/default_script.goom new file mode 100644 index 0000000000..be64141a71 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/default_script.goom @@ -0,0 +1,34 @@ +/* + * specify here high-level properties of a flash. + */ + +flash_occurs when (Sound.Goom_Detection > 50%) and (Sound.Sound_Speed > 14%); + +max_flash = 200%; +slow_down_coef = 96%; + +/* + * Here you have the fx's state machin behaviour. + */ + +(locked) ? locked--; + +(not locked) and (flash_occurs) ? +{ + cur_power = Sound_Speed.Goom_Detection; + start flashing_up; +} + +(not locked) and (flashing_up) ? +{ + factor += cur_power * 2 * (speedvar / 4 + 0.95); + if (factor > max_flash) factor = max_flash; + + (not flash_occurs) ? + { + locked = 200; + stop flashing_up; + } +} + +factor *= slow_down_coef; diff --git a/src/visualizations/Goom/goom2k4-0/src/default_scripts.h b/src/visualizations/Goom/goom2k4-0/src/default_scripts.h new file mode 100644 index 0000000000..5984d7055c --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/default_scripts.h @@ -0,0 +1,6 @@ +#ifndef _DEFAULT_SCRIPTS_H +#define _DEFAULT_SCRIPTS_H + +#define GOOM_MAIN_SCRIPT "" + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/drawmethods.c b/src/visualizations/Goom/goom2k4-0/src/drawmethods.c new file mode 100644 index 0000000000..f5cdec4fd3 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/drawmethods.c @@ -0,0 +1,203 @@ +#include "drawmethods.h" + +#define DRAWMETHOD_PLUS(_out,_backbuf,_col) \ +{\ + int tra=0,i=0;\ + unsigned char *bra = (unsigned char*)&(_backbuf);\ + unsigned char *dra = (unsigned char*)&(_out);\ + unsigned char *cra = (unsigned char*)&(_col);\ + for (;i<4;i++) {\ + tra = *cra;\ + tra += *bra;\ + if (tra>255) tra=255;\ + *dra = tra;\ + ++dra;++cra;++bra;\ + }\ +} + +#define DRAWMETHOD DRAWMETHOD_PLUS(*p,*p,col) + +void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) +{ + int x, y, dx, dy, yy, xx; + Pixel *p; + + if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) return; + + /* clip to top edge + if ((y1 < 0) && (y2 < 0)) + return; + + if (y1 < 0) { + x1 += (y1 * (x1 - x2)) / (y2 - y1); + y1 = 0; + } + if (y2 < 0) { + x2 += (y2 * (x1 - x2)) / (y2 - y1); + y2 = 0; + } + + clip to bottom edge + if ((y1 >= screeny) && (y2 >= screeny)) + return; + if (y1 >= screeny) { + x1 -= ((screeny - y1) * (x1 - x2)) / (y2 - y1); + y1 = screeny - 1; + } + if (y2 >= screeny) { + x2 -= ((screeny - y2) * (x1 - x2)) / (y2 - y1); + y2 = screeny - 1; + } + clip to left edge + if ((x1 < 0) && (x2 < 0)) + return; + if (x1 < 0) { + y1 += (x1 * (y1 - y2)) / (x2 - x1); + x1 = 0; + } + if (x2 < 0) { + y2 += (x2 * (y1 - y2)) / (x2 - x1); + x2 = 0; + } + clip to right edge + if ((x1 >= screenx) && (x2 >= screenx)) + return; + if (x1 >= screenx) { + y1 -= ((screenx - x1) * (y1 - y2)) / (x2 - x1); + x1 = screenx - 1; + } + if (x2 >= screenx) { + y2 -= ((screenx - x2) * (y1 - y2)) / (x2 - x1); + x2 = screenx - 1; + } + */ + + dx = x2 - x1; + dy = y2 - y1; + if (x1 > x2) { + int tmp; + + tmp = x1; + x1 = x2; + x2 = tmp; + tmp = y1; + y1 = y2; + y2 = tmp; + dx = x2 - x1; + dy = y2 - y1; + } + + /* vertical line */ + if (dx == 0) { + if (y1 < y2) { + p = &(data[(screenx * y1) + x1]); + for (y = y1; y <= y2; y++) { + DRAWMETHOD; + p += screenx; + } + } + else { + p = &(data[(screenx * y2) + x1]); + for (y = y2; y <= y1; y++) { + DRAWMETHOD; + p += screenx; + } + } + return; + } + /* horizontal line */ + if (dy == 0) { + if (x1 < x2) { + p = &(data[(screenx * y1) + x1]); + for (x = x1; x <= x2; x++) { + DRAWMETHOD; + p++; + } + return; + } + else { + p = &(data[(screenx * y1) + x2]); + for (x = x2; x <= x1; x++) { + DRAWMETHOD; + p++; + } + return; + } + } + /* 1 */ + /* \ */ + /* \ */ + /* 2 */ + if (y2 > y1) { + /* steep */ + if (dy > dx) { + dx = ((dx << 16) / dy); + x = x1 << 16; + for (y = y1; y <= y2; y++) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p++; + /* DRAWMETHOD; */ + } + x += dx; + } + return; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + } + } + /* 2 */ + /* / */ + /* / */ + /* 1 */ + else { + /* steep */ + if (-dy > dx) { + dx = ((dx << 16) / -dy); + x = (x1 + 1) << 16; + for (y = y1; y >= y2; y--) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p--; + /* DRAWMETHOD; */ + } + x += dx; + } + return; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + return; + } + } +} + diff --git a/src/visualizations/Goom/goom2k4-0/src/drawmethods.h b/src/visualizations/Goom/goom2k4-0/src/drawmethods.h new file mode 100644 index 0000000000..76ad6ca09a --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/drawmethods.h @@ -0,0 +1,9 @@ +#ifndef _DRAWMETHODS_H +#define _DRAWMETHODS_H + +#include "goom_config.h" +#include "goom_graphic.h" + +void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); + +#endif /* _DRAWMETHODS_H */ diff --git a/src/visualizations/Goom/goom2k4-0/src/empty_script.goom b/src/visualizations/Goom/goom2k4-0/src/empty_script.goom new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/empty_script.goom diff --git a/src/visualizations/Goom/goom2k4-0/src/filter_test/mmx.h b/src/visualizations/Goom/goom2k4-0/src/filter_test/mmx.h new file mode 100644 index 0000000000..7067bf347d --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/filter_test/mmx.h @@ -0,0 +1,705 @@ +/* mmx.h + + MultiMedia eXtensions GCC interface library for IA32. + + To use this library, simply include this header file + and compile with GCC. You MUST have inlining enabled + in order for mmx_ok() to work; this can be done by + simply using -O on the GCC command line. + + Compiling with -DMMX_TRACE will cause detailed trace + output to be sent to stderr for each mmx operation. + This adds lots of code, and obviously slows execution to + a crawl, but can be very useful for debugging. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT + LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR ANY PARTICULAR PURPOSE. + + 1997-99 by H. Dietz and R. Fisher + + Notes: + It appears that the latest gas has the pand problem fixed, therefore + I'll undefine BROKEN_PAND by default. +*/ + +#ifndef _MMX_H +#define _MMX_H + +/* Warning: at this writing, the version of GAS packaged + with most Linux distributions does not handle the + parallel AND operation mnemonic correctly. If the + symbol BROKEN_PAND is defined, a slower alternative + coding will be used. If execution of mmxtest results + in an illegal instruction fault, define this symbol. +*/ +#undef BROKEN_PAND + + +/* The type of an value that fits in an MMX register + (note that long long constant values MUST be suffixed + by LL and unsigned long long values by ULL, lest + they be truncated by the compiler) +*/ +typedef union { + long long q; /* Quadword (64-bit) value */ + unsigned long long uq; /* Unsigned Quadword */ + int d[2]; /* 2 Doubleword (32-bit) values */ + unsigned int ud[2]; /* 2 Unsigned Doubleword */ + short w[4]; /* 4 Word (16-bit) values */ + unsigned short uw[4]; /* 4 Unsigned Word */ + char b[8]; /* 8 Byte (8-bit) values */ + unsigned char ub[8]; /* 8 Unsigned Byte */ + float s[2]; /* Single-precision (32-bit) value */ +} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ + + + +/* Function to test if multimedia instructions are supported... +*/ +inline extern int +mm_support(void) +{ + /* Returns 1 if MMX instructions are supported, + 3 if Cyrix MMX and Extended MMX instructions are supported + 5 if AMD MMX and 3DNow! instructions are supported + 0 if hardware does not support any of these + */ + register int rval = 0; + + __asm__ __volatile__ ( + /* See if CPUID instruction is supported ... */ + /* ... Get copies of EFLAGS into eax and ecx */ + "pushf\n\t" + "popl %%eax\n\t" + "movl %%eax, %%ecx\n\t" + + /* ... Toggle the ID bit in one copy and store */ + /* to the EFLAGS reg */ + "xorl $0x200000, %%eax\n\t" + "push %%eax\n\t" + "popf\n\t" + + /* ... Get the (hopefully modified) EFLAGS */ + "pushf\n\t" + "popl %%eax\n\t" + + /* ... Compare and test result */ + "xorl %%eax, %%ecx\n\t" + "testl $0x200000, %%ecx\n\t" + "jz NotSupported1\n\t" /* CPUID not supported */ + + + /* Get standard CPUID information, and + go to a specific vendor section */ + "movl $0, %%eax\n\t" + "cpuid\n\t" + + /* Check for Intel */ + "cmpl $0x756e6547, %%ebx\n\t" + "jne TryAMD\n\t" + "cmpl $0x49656e69, %%edx\n\t" + "jne TryAMD\n\t" + "cmpl $0x6c65746e, %%ecx\n" + "jne TryAMD\n\t" + "jmp Intel\n\t" + + /* Check for AMD */ + "\nTryAMD:\n\t" + "cmpl $0x68747541, %%ebx\n\t" + "jne TryCyrix\n\t" + "cmpl $0x69746e65, %%edx\n\t" + "jne TryCyrix\n\t" + "cmpl $0x444d4163, %%ecx\n" + "jne TryCyrix\n\t" + "jmp AMD\n\t" + + /* Check for Cyrix */ + "\nTryCyrix:\n\t" + "cmpl $0x69727943, %%ebx\n\t" + "jne NotSupported2\n\t" + "cmpl $0x736e4978, %%edx\n\t" + "jne NotSupported3\n\t" + "cmpl $0x64616574, %%ecx\n\t" + "jne NotSupported4\n\t" + /* Drop through to Cyrix... */ + + + /* Cyrix Section */ + /* See if extended CPUID level 80000001 is supported */ + /* The value of CPUID/80000001 for the 6x86MX is undefined + according to the Cyrix CPU Detection Guide (Preliminary + Rev. 1.01 table 1), so we'll check the value of eax for + CPUID/0 to see if standard CPUID level 2 is supported. + According to the table, the only CPU which supports level + 2 is also the only one which supports extended CPUID levels. + */ + "cmpl $0x2, %%eax\n\t" + "jne MMXtest\n\t" /* Use standard CPUID instead */ + + /* Extended CPUID supported (in theory), so get extended + features */ + "movl $0x80000001, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%eax\n\t" /* Test for MMX */ + "jz NotSupported5\n\t" /* MMX not supported */ + "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ + "jnz EMMXSupported\n\t" + "movl $1, %0:\n\n\t" /* MMX Supported */ + "jmp Return\n\n" + "EMMXSupported:\n\t" + "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */ + "jmp Return\n\t" + + + /* AMD Section */ + "AMD:\n\t" + + /* See if extended CPUID is supported */ + "movl $0x80000000, %%eax\n\t" + "cpuid\n\t" + "cmpl $0x80000000, %%eax\n\t" + "jl MMXtest\n\t" /* Use standard CPUID instead */ + + /* Extended CPUID supported, so get extended features */ + "movl $0x80000001, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%edx\n\t" /* Test for MMX */ + "jz NotSupported6\n\t" /* MMX not supported */ + "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ + "jnz ThreeDNowSupported\n\t" + "movl $1, %0:\n\n\t" /* MMX Supported */ + "jmp Return\n\n" + "ThreeDNowSupported:\n\t" + "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */ + "jmp Return\n\t" + + + /* Intel Section */ + "Intel:\n\t" + + /* Check for MMX */ + "MMXtest:\n\t" + "movl $1, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%edx\n\t" /* Test for MMX */ + "jz NotSupported7\n\t" /* MMX Not supported */ + "movl $1, %0:\n\n\t" /* MMX Supported */ + "jmp Return\n\t" + + /* Nothing supported */ + "\nNotSupported1:\n\t" + "#movl $101, %0:\n\n\t" + "\nNotSupported2:\n\t" + "#movl $102, %0:\n\n\t" + "\nNotSupported3:\n\t" + "#movl $103, %0:\n\n\t" + "\nNotSupported4:\n\t" + "#movl $104, %0:\n\n\t" + "\nNotSupported5:\n\t" + "#movl $105, %0:\n\n\t" + "\nNotSupported6:\n\t" + "#movl $106, %0:\n\n\t" + "\nNotSupported7:\n\t" + "#movl $107, %0:\n\n\t" + "movl $0, %0:\n\n\t" + + "Return:\n\t" + : "=a" (rval) + : /* no input */ + : "eax", "ebx", "ecx", "edx" + ); + + /* Return */ + return(rval); +} + +/* Function to test if mmx instructions are supported... +*/ +inline extern int +mmx_ok(void) +{ + /* Returns 1 if MMX instructions are supported, 0 otherwise */ + return ( mm_support() & 0x1 ); +} + + +/* Helper functions for the instruction macros that follow... + (note that memory-to-register, m2r, instructions are nearly + as efficient as register-to-register, r2r, instructions; + however, memory-to-memory instructions are really simulated + as a convenience, and are only 1/3 as efficient) +*/ +#ifdef MMX_TRACE + +/* Include the stuff for printing a trace to stderr... +*/ + +#include <stdio.h> + +#define mmx_i2r(op, imm, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace.uq = (imm); \ + printf(#op "_i2r(" #imm "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2r(op, mem, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mem); \ + printf(#op "_m2r(" #mem "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2m(op, reg, mem) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#op "_r2m(" #reg "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (mem); \ + printf(#mem "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ); \ + mmx_trace = (mem); \ + printf(#mem "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2r(op, regs, regd) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #regs ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#op "_r2r(" #regs "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#regd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#regd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2m(op, mems, memd) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mems); \ + printf(#op "_m2m(" #mems "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (memd); \ + printf(#memd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)); \ + mmx_trace = (memd); \ + printf(#memd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#else + +/* These macros are a lot simpler without the tracing... +*/ + +#define mmx_i2r(op, imm, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm) ) + +#define mmx_m2r(op, mem, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)) + +#define mmx_r2m(op, reg, mem) \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ) + +#define mmx_r2r(op, regs, regd) \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd) + +#define mmx_m2m(op, mems, memd) \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)) + +#endif + + +/* 1x64 MOVe Quadword + (this is both a load and a store... + in fact, it is the only way to store) +*/ +#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +#define movq(vars, vard) \ + __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 1x32 MOVe Doubleword + (like movq, this is both load and store... + but is most useful for moving things between + mmx registers and ordinary registers) +*/ +#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +#define movd(vars, vard) \ + __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ + "movd %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 2x32, 4x16, and 8x8 Parallel ADDs +*/ +#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) +#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) +#define paddd(vars, vard) mmx_m2m(paddd, vars, vard) + +#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) +#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) +#define paddw(vars, vard) mmx_m2m(paddw, vars, vard) + +#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) +#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) +#define paddb(vars, vard) mmx_m2m(paddb, vars, vard) + + +/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic +*/ +#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) +#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) +#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) + +#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) +#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) +#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) + + +/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic +*/ +#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) +#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) +#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) + +#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) +#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) +#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel SUBs +*/ +#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) +#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) +#define psubd(vars, vard) mmx_m2m(psubd, vars, vard) + +#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) +#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) +#define psubw(vars, vard) mmx_m2m(psubw, vars, vard) + +#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) +#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) +#define psubb(vars, vard) mmx_m2m(psubb, vars, vard) + + +/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic +*/ +#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) +#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) +#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) + +#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) +#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) +#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) + + +/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic +*/ +#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) +#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) +#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) + +#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) +#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) +#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) + + +/* 4x16 Parallel MULs giving Low 4x16 portions of results +*/ +#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) +#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) +#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results +*/ +#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) +#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) +#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) + + +/* 4x16->2x32 Parallel Mul-ADD + (muls like pmullw, then adds adjacent 16-bit fields + in the multiply result to make the final 2x32 result) +*/ +#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) +#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) +#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) + + +/* 1x64 bitwise AND +*/ +#ifdef BROKEN_PAND +#define pand_m2r(var, reg) \ + { \ + mmx_m2r(pandn, (mmx_t) -1LL, reg); \ + mmx_m2r(pandn, var, reg); \ + } +#define pand_r2r(regs, regd) \ + { \ + mmx_m2r(pandn, (mmx_t) -1LL, regd); \ + mmx_r2r(pandn, regs, regd) \ + } +#define pand(vars, vard) \ + { \ + movq_m2r(vard, mm0); \ + mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ + mmx_m2r(pandn, vars, mm0); \ + movq_r2m(mm0, vard); \ + } +#else +#define pand_m2r(var, reg) mmx_m2r(pand, var, reg) +#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) +#define pand(vars, vard) mmx_m2m(pand, vars, vard) +#endif + + +/* 1x64 bitwise AND with Not the destination +*/ +#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) +#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) +#define pandn(vars, vard) mmx_m2m(pandn, vars, vard) + + +/* 1x64 bitwise OR +*/ +#define por_m2r(var, reg) mmx_m2r(por, var, reg) +#define por_r2r(regs, regd) mmx_r2r(por, regs, regd) +#define por(vars, vard) mmx_m2m(por, vars, vard) + + +/* 1x64 bitwise eXclusive OR +*/ +#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) +#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) +#define pxor(vars, vard) mmx_m2m(pxor, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality + (resulting fields are either 0 or -1) +*/ +#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) +#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) +#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) + +#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) +#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) +#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) + +#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) +#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) +#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than + (resulting fields are either 0 or -1) +*/ +#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) +#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) +#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) + +#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) +#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) +#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) + +#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) +#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) +#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) + + +/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical +*/ +#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) +#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) +#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) +#define psllq(vars, vard) mmx_m2m(psllq, vars, vard) + +#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) +#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) +#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) +#define pslld(vars, vard) mmx_m2m(pslld, vars, vard) + +#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) +#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) +#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) +#define psllw(vars, vard) mmx_m2m(psllw, vars, vard) + + +/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical +*/ +#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) +#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) +#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) +#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) + +#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) +#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) +#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) +#define psrld(vars, vard) mmx_m2m(psrld, vars, vard) + +#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) +#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) +#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) +#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) + + +/* 2x32 and 4x16 Parallel Shift Right Arithmetic +*/ +#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) +#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) +#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) +#define psrad(vars, vard) mmx_m2m(psrad, vars, vard) + +#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) +#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) +#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) +#define psraw(vars, vard) mmx_m2m(psraw, vars, vard) + + +/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate + (packs source and dest fields into dest in that order) +*/ +#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) +#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) +#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) + +#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) +#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) +#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) + + +/* 4x16->8x8 PACK and Unsigned Saturate + (packs source and dest fields into dest in that order) +*/ +#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) +#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) +#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) + + +/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low + (interleaves low half of dest with low half of source + as padding in each result field) +*/ +#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) +#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) +#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) + +#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) +#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) +#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) + +#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) +#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) +#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) + + +/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High + (interleaves high half of dest with high half of source + as padding in each result field) +*/ +#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) +#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) +#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) + +#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) +#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) +#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) + +#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) +#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) +#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) + + +/* Empty MMx State + (used to clean-up when going from mmx to float use + of the registers that are shared by both; note that + there is no float-to-mmx operation needed, because + only the float tag word info is corruptible) +*/ +#ifdef MMX_TRACE + +#define emms() \ + { \ + printf("emms()\n"); \ + __asm__ __volatile__ ("emms"); \ + } + +#else + +#define emms() __asm__ __volatile__ ("emms") + +#endif + +#endif + diff --git a/src/visualizations/Goom/goom2k4-0/src/filter_test/px_py_calc.c b/src/visualizations/Goom/goom2k4-0/src/filter_test/px_py_calc.c new file mode 100644 index 0000000000..b2cf2d5c16 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/filter_test/px_py_calc.c @@ -0,0 +1,94 @@ +#include "mmx.h" + +int testD [] = {0x1200, 0x2011, 0, 0x12, 0x5331, 0x8000}; +int testS [] = {0x1205, 0x11, 0x4210, 0x412, 0x121, 0x1211}; + +int ratios [] = {0x8000, 0x4000, 0x1234, 0x6141, 0xffff, 0}; + +int main () { + int nbERROR = 0; + int i,j; + volatile mmx_t ratiox; + + volatile mmx_t sortie; + + /* creation des variables de test */ + volatile int buffratio = 0x8000; + volatile int loop = 0; + volatile int *buffS; + volatile int *buffD; + buffS = malloc (256); + buffD = malloc (256); + + buffS = buffS + (unsigned)buffS % 64; + buffD = buffD + (unsigned)buffD % 64; + + for (j=0;j<6;j++) + for (i=0;i<3;i++) { + + buffratio = ratios[j]; + + buffS[0] = testS[i<<1]; + buffS[1] = testS[(i<<1)+1]; + + buffD[0] = testD[i*2]; + buffD[1] = testD[i*2+1]; + + /* code */ + + ratiox.d[0] = buffratio; + ratiox.d[1] = buffratio; + movq_m2r (ratiox, mm6); + pslld_i2r (16,mm6); + + /* |0hhhhhhh|llllvvvv| + x |00000000|bbbbbbbb| + ================= + |.bl.high|..bl.low| + + |..bh.low|00000000| + ================= + result1 + */ + + /* + * pre : mm6 = [buffratio<<16|buffratio<<16] + */ + + movq_m2r (buffS[loop],mm0); /* mm0 = S */ + movq_m2r (buffD[loop],mm1); /* mm1 = D */ + psubd_r2r (mm0,mm1); /* mm1 = D - S */ + movq_r2r (mm1, mm2); /* mm2 = D - S */ + + pslld_i2r (16,mm1); + mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ + pmullw_r2r (mm6, mm2); + + paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ + pslld_i2r (16,mm0); + + paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ + psrld_i2r (16, mm0); + movq_r2m (mm0, sortie); + + /* + * post : mm0 = S + ((D-S)*buffratio)>>16 + * modified = mm0,mm1,mm2 + */ + + if ( + (buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16) != sortie.d[0]) + | (buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16) != sortie.d[1])) + { + nbERROR++; + printf ("\ns : (0x%08x,0x%08x)\n", buffS[0], buffS[1]); + printf ("d : (0x%08x,0x%08x)\n", buffD[0], buffD[1]); + printf ("ratio : (0x%08x,0x%08x)\n", buffratio, buffratio); + + printf ("en mmx : (0x%08x,0x%08x)\n", sortie.d[0], sortie.d[1]); + printf ("en c : (0x%08x,0x%08x)\n", + buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16), + buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16)); + } + } + printf ("%d errors\n",nbERROR); +} diff --git a/src/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c b/src/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c new file mode 100644 index 0000000000..41c5bc5b25 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c @@ -0,0 +1,202 @@ + +#define BUFFPOINTNB 16 +#define BUFFPOINTMASK 0xffff +#define BUFFINCR 0xff + +#define sqrtperte 16 +// faire : a % sqrtperte <=> a & pertemask +#define PERTEMASK 0xf +// faire : a / sqrtperte <=> a >> PERTEDEC +#define PERTEDEC 4 + +//#define MMX_TRACE +#include "mmx.h" + +void zoom_filter_mmx (int prevX, int prevY, + unsigned int *expix1, unsigned int *expix2, + int *lbruS, int *lbruD, int buffratio, + int precalCoef[16][16]) +{ + int bufsize = prevX * prevY; /* taille du buffer */ + volatile int loop; /* variable de boucle */ + + mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ + mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ + + volatile mmx_t prevXY; + volatile mmx_t ratiox; + volatile mmx_t interpix; + + volatile mmx_t mask; /* masque des nombres a virgules */ + mask.ud[0] = BUFFPOINTMASK; + mask.ud[1] = BUFFPOINTMASK; + + prevXY.ud[0] = (prevX-1)<<PERTEDEC; + prevXY.ud[1] = (prevY-1)<<PERTEDEC; + + pxor_r2r (mm7,mm7); + + ratiox.d[0] = buffratio; + ratiox.d[1] = buffratio; + movq_m2r (ratiox, mm6); + pslld_i2r (16,mm6); + + loop=0; + while (loop<bufsize) + { + movq_m2r (ratiox, mm6); + pslld_i2r (16,mm6); + + /* + * pre : mm6 = [buffratio<<16|buffratio<<16] + * post : mm0 = S + ((D-S)*buffratio)>>16 format [X|Y] + * modified = mm0,mm1,mm2 + */ + + __asm__ __volatile__ ( + "movq %0,%%mm0\n" + "movq %1,%%mm1\n" + : :"X"(brutS[loop]),"X"(brutD[loop]) + ); /* mm0 = S */ + + psubd_r2r (mm0,mm1); /* mm1 = D - S */ + movq_r2r (mm1, mm2); /* mm2 = D - S */ + + pslld_i2r (16,mm1); + mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ + pmullw_r2r (mm6, mm2); + + paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ + pslld_i2r (16,mm0); + + paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ + psrld_i2r (16, mm0); + + /* + * pre : mm0 : position vector on screen + * prevXY : coordinate of the lower-right point on screen + * post : clipped mm0 + * modified : mm0,mm1,mm2 + */ + movq_m2r (prevXY,mm1); + pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient : + 1111 si prevXY > px + 0000 si prevXY <= px + (idem pour y) */ + movq_r2r (mm1,mm2); + punpckldq_r2r (mm1,mm1); + punpckhdq_r2r (mm2,mm2); + pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */ + pand_r2r (mm2, mm0); /* on met a zero la partie qui deborde */ + + /* + * pre : mm0 : clipped position on screen + * post : mm6 : coefs for this position + * mm1 : X vector [0|X] + * modif : eax,ebx + */ + __asm__ __volatile__ ( + "movq %%mm0,%%mm1\n" + "movd %%mm0,%%ebx\n" + "psrlq $32,%%mm1\n" + "movd %%mm1,%%eax\n" + "andl $15,%%eax\n" + "andl $15,%%ebx\n" + + "shll $2,%%eax\n" + "shll $3,%%ebx\n" + + "addl %0,%%eax\n" + + "movd (%%eax,%%ebx,8),%%mm6\n" + ::"X"(precalCoef):"eax","ebx"); + + /* + * pre : mm0 : Y pos [*|Y] + * mm1 : X pos [*|X] + * post : eax : absolute position of the source pixel. + * modif : ebx + */ + psrld_i2r (PERTEDEC,mm0); + psrld_i2r (PERTEDEC,mm1); + __asm__ __volatile__ ( + "movd %%mm1,%%eax\n" + "mull %1\n" + "movd %%mm0,%%ebx\n" + "addl %%ebx,%%eax\n" + "movl %0,%%ebx\n" + "movq (%%ebx,%%eax,4),%%mm0\n" + "addl %1,%%eax\n" + "movq (%%ebx,%%eax,4),%%mm2\n" + + : : "X"(expix1), "X"(prevX):"eax","ebx" + ); + + /* + * coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; + * coef en modulo 15 * + * pos = ((px>>PERTEMASK) + prevX * (py>>PERTEMASK)); + */ + + /* recuperation des deux premiers pixels dans mm0 et mm1 */ +// movq_m2r (expix1[pos], mm0); /* b1-v1-r1-a1-b2-v2-r2-a2 */ + movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ + + /* recuperation des 2 derniers pixels */ +// movq_m2r (expix1[pos+prevX], mm2); + + /* depackage du premier pixel */ + punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ + + movq_r2r (mm6, mm5); /* ??-??-??-??-c4-c3-c2-c1 */ + /* depackage du 2ieme pixel */ + punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ + + /* extraction des coefficients... */ + punpcklbw_r2r (mm5, mm6); /* c4-c4-c3-c3-c2-c2-c1-c1 */ + movq_r2r (mm6, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */ + movq_r2r (mm6, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */ + + punpcklbw_r2r (mm5, mm6); /* c2-c2-c2-c2-c1-c1-c1-c1 */ + punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */ + + movq_r2r (mm6, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */ + punpcklbw_r2r (mm7, mm6); /* 00-c1-00-c1-00-c1-00-c1 */ + punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ + + /* multiplication des pixels par les coefficients */ + pmullw_r2r (mm6, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ + pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ + paddw_r2r (mm1, mm0); + + /* ...extraction des 2 derniers coefficients */ + movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ + punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ + punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ + + /* recuperation des 2 derniers pixels */ + movq_r2r (mm2, mm1); + + /* depackage des pixels */ + punpcklbw_r2r (mm7, mm1); + punpckhbw_r2r (mm7, mm2); + + /* multiplication pas les coeffs */ + pmullw_r2r (mm4, mm1); + pmullw_r2r (mm5, mm2); + + /* ajout des valeurs obtenues à la valeur finale */ + paddw_r2r (mm1, mm0); + paddw_r2r (mm2, mm0); + + /* division par 256 = 16+16+16+16, puis repackage du pixel final */ + psrlw_i2r (8, mm0); + packuswb_r2r (mm7, mm0); + + movd_r2m (mm0,expix2[loop]); + + // expix2[loop] = couleur; + ++loop; + } + emms(); /* __asm__ __volatile__ ("emms"); */ +} diff --git a/src/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx.c b/src/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx.c new file mode 100644 index 0000000000..dd2d022afd --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/filter_test/zoom_filter_mmx.c @@ -0,0 +1,186 @@ + +#define BUFFPOINTNB 16 +#define BUFFPOINTMASK 0xffff +#define BUFFINCR 0xff + +#define sqrtperte 16 +// faire : a % sqrtperte <=> a & pertemask +#define PERTEMASK 0xf +// faire : a / sqrtperte <=> a >> PERTEDEC +#define PERTEDEC 4 + +//#define MMX_TRACE +#include "mmx.h" + +void zoom_filter_mmx (int prevX, int prevY, + unsigned int *expix1, unsigned int *expix2, + int *lbruS, int *lbruD, int buffratio, + int precalCoef[16][16]) +{ + int bufsize = prevX * prevY; /* taille du buffer */ + volatile int loop; /* variable de boucle */ + + mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ + mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ + + int pos; + + volatile mmx_t prevXY; + volatile mmx_t ratiox; + volatile mmx_t interpix; + + volatile mmx_t mask; /* masque des nombres a virgules */ + mask.ud[0] = BUFFPOINTMASK; + mask.ud[1] = BUFFPOINTMASK; + + prevXY.ud[0] = (prevX-1)<<PERTEDEC; + prevXY.ud[1] = (prevY-1)<<PERTEDEC; + + pxor_r2r (mm7,mm7); + + ratiox.d[0] = buffratio; + ratiox.d[1] = buffratio; + movq_m2r (ratiox, mm6); + pslld_i2r (16,mm6); + + for (loop=0; loop<bufsize; loop++) + { + /* + * pre : mm6 = [buffratio<<16|buffratio<<16] + * post : mm0 = S + ((D-S)*buffratio)>>16 format [X|Y] + * modified = mm0,mm1,mm2 + */ + + movq_m2r (brutS[loop],mm0); /* mm0 = S */ + movq_m2r (brutD[loop],mm1); /* mm1 = D */ + psubd_r2r (mm0,mm1); /* mm1 = D - S */ + movq_r2r (mm1, mm2); /* mm2 = D - S */ + + pslld_i2r (16,mm1); + mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ + pmullw_r2r (mm6, mm2); + + paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ + pslld_i2r (16,mm0); + + paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ + psrld_i2r (16, mm0); + + /* + * pre : mm0 : position vector on screen + * prevXY : coordinate of the lower-right point on screen + * post : clipped mm0 + * modified : mm0,mm1 + */ + movq_m2r (prevXY,mm1); + pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient : + 1111 si prevXY > px + 0000 si prevXY <= px + (idem pour y) */ + pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */ + + + /* + * pre : mm0 : clipped position on screen + * post : mm6 : coefs for this position + * mm1 : X vector [0|X] + * modif : eax,ebx + */ + __asm__ __volatile__ ( + "movq %%mm0,%%mm1\n" + "movd %%mm0,%%eax\n" + "psrlq $32,%%mm1\n" + "movd %%mm1,%%ebx\n" + "and $15,%%eax\n" + "and $15,%%ebx\n" + "add %0,%%eax\n" + "movd (%%eax,%%ebx,$16),%%mm6\n" + ::"X"(precalCoef):"eax","ebx"); + + /* + * pre : mm0 : Y pos [*|Y] + * mm1 : X pos [*|X] + * post : eax : absolute position of the source pixel. + * modif : ebx + */ + psrld_i2r (PERTEDEC,mm0); + psrld_i2r (PERTEDEC,mm1); + __asm__ __volatile__ ( + "movd %%mm1,%%eax\n" +// "movl %1,%%ebx\n" + "mull %1\n" + "movd %%mm0,%%ebx\n" + "addl %%ebx,%%eax\n" + "movl %%eax,%0\n" + :"=X"(pos):"X"(prevX):"eax","ebx" + ); + + expix2[loop] = expix1[pos]; + /* + * coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; + * coef en modulo 15 * + * pos = ((px>>PERTEMASK) + prevX * (py>>PERTEMASK)); + */ +// precal + eax + ebx * 16 + +// movd_m2r (precalCoef[interpix.d[0]][interpix.d[1]],mm6); + + /* recuperation des deux premiers pixels dans mm0 et mm1 */ +// movq_m2r (/*expix1[pos]*/a, mm0); /* b1-v1-r1-a1-b2-v2-r2-a2 */ +// movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ + + /* depackage du premier pixel */ +// punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ + +// movq_r2r (mm6, mm5); /* ??-??-??-??-c4-c3-c2-c1 */ + /* depackage du 2ieme pixel */ +// punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ + + /* extraction des coefficients... */ +// punpcklbw_r2r (mm5, mm6); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +// movq_r2r (mm6, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +// movq_r2r (mm6, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */ + +// punpcklbw_r2r (mm5, mm6); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +// punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */ + +// movq_r2r (mm6, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +// punpcklbw_r2r (mm7, mm6); /* 00-c1-00-c1-00-c1-00-c1 */ +// punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ + + /* multiplication des pixels par les coefficients */ +// pmullw_r2r (mm6, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ +// pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ +// paddw_r2r (mm1, mm0); + + /* ...extraction des 2 derniers coefficients */ +// movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ +// punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ +// punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ + + /* recuperation des 2 derniers pixels */ +// movq_m2r (a/*expix1[pos+largeur]*/, mm1); +// movq_r2r (mm1, mm2); + + /* depackage des pixels */ +// punpcklbw_r2r (mm7, mm1); +// punpckhbw_r2r (mm7, mm2); + + /* multiplication pas les coeffs */ +// pmullw_r2r (mm4, mm1); +// pmullw_r2r (mm5, mm2); + + /* ajout des valeurs obtenues à la valeur finale */ +// paddw_r2r (mm1, mm0); +// paddw_r2r (mm2, mm0); + + /* division par 256 = 16+16+16+16, puis repackage du pixel final */ +// psrlw_i2r (8, mm0); +// packuswb_r2r (mm7, mm0); + +// movd_r2m (mm0,expix2[loop]); + + // expix2[loop] = couleur; + } + emms(); /* __asm__ __volatile__ ("emms"); */ +} diff --git a/src/visualizations/Goom/goom2k4-0/src/filters.c b/src/visualizations/Goom/goom2k4-0/src/filters.c new file mode 100644 index 0000000000..b6de4de5cd --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/filters.c @@ -0,0 +1,773 @@ +// --- CHUI EN TRAIN DE SUPPRIMER LES EXTERN RESOLX ET C_RESOLY --- + +/* filter.c version 0.7 +* contient les filtres applicable a un buffer +* creation : 01/10/2000 +* -ajout de sinFilter() +* -ajout de zoomFilter() +* -copie de zoomFilter() en zoomFilterRGB(), gerant les 3 couleurs +* -optimisation de sinFilter (utilisant une table de sin) +* -asm +* -optimisation de la procedure de generation du buffer de transformation +* la vitesse est maintenant comprise dans [0..128] au lieu de [0..100] +*/ + +/* #define _DEBUG_PIXEL */ + +#include <string.h> +#include <stdlib.h> +#include <math.h> +#include <stdio.h> +#include <inttypes.h> + +#include "goom_filters.h" +#include "goom_graphic.h" +#include "goom_tools.h" +#include "goom_plugin_info.h" +#include "goom_fx.h" +#include "v3d.h" + +/* TODO : MOVE THIS AWAY !!! */ +/* jeko: j'ai essayer de le virer, mais si on veut les laisser inline c'est un peu lourdo... */ +static inline void setPixelRGB (PluginInfo *goomInfo, Pixel *buffer, Uint x, Uint y, Color c) +{ + Pixel i; + + i.channels.b = c.b; + i.channels.g = c.v; + i.channels.r = c.r; + *(buffer + (x + y * goomInfo->screen.width)) = i; +} + +static inline void setPixelRGB_ (Pixel *buffer, Uint x, Color c) +{ + buffer[x].channels.r = c.r; + buffer[x].channels.g = c.v; + buffer[x].channels.b = c.b; +} + +static inline void getPixelRGB (PluginInfo *goomInfo, Pixel *buffer, Uint x, Uint y, Color * c) +{ + Pixel i = *(buffer + (x + y * goomInfo->screen.width)); + c->b = i.channels.b; + c->v = i.channels.g; + c->r = i.channels.r; +} + +static inline void getPixelRGB_ (Pixel *buffer, Uint x, Color * c) +{ + Pixel i = *(buffer + x); + c->b = i.channels.b; + c->v = i.channels.g; + c->r = i.channels.r; +} +/* END TODO */ + + +/* DEPRECATED */ +// retourne x>>s , en testant le signe de x +//#define ShiftRight(_x,_s) (((_x)<0) ? -(-(_x)>>(_s)) : ((_x)>>(_s))) +//#define EFFECT_DISTORS 4 +//#define EFFECT_DISTORS_SL 2 +//#define INTERLACE_ADD 9 +//#define INTERLACE_AND 0xf +/* END DEPRECATED */ + +#define BUFFPOINTNB 16 +#define BUFFPOINTNBF 16.0f +#define BUFFPOINTMASK 0xffff + +#define sqrtperte 16 +/* faire : a % sqrtperte <=> a & pertemask */ +#define PERTEMASK 0xf +/* faire : a / sqrtperte <=> a >> PERTEDEC */ +#define PERTEDEC 4 + +/* pure c version of the zoom filter */ +static void c_zoom (Pixel *expix1, Pixel *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD, int buffratio, int precalCoef[BUFFPOINTNB][BUFFPOINTNB]); + +/* simple wrapper to give it the same proto than the others */ +void zoom_filter_c (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]) { + c_zoom(src, dest, sizeX, sizeY, brutS, brutD, buffratio, precalCoef); +} + +static void generatePrecalCoef (int precalCoef[BUFFPOINTNB][BUFFPOINTNB]); + + +typedef struct _ZOOM_FILTER_FX_WRAPPER_DATA { + + PluginParam enabled_bp; + PluginParameters params; + + unsigned int *coeffs, *freecoeffs; + + signed int *brutS, *freebrutS; /* source */ + signed int *brutD, *freebrutD; /* dest */ + signed int *brutT, *freebrutT; /* temp (en cours de generation) */ + + guint32 zoom_width; + + unsigned int prevX, prevY; + + float general_speed; + int reverse; /* reverse the speed */ + char theMode; + int waveEffect; + int hypercosEffect; + int vPlaneEffect; + int hPlaneEffect; + char noisify; + int middleX, middleY; + + int mustInitBuffers; + int interlace_start; + + /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */ + int buffratio; + int *firedec; + + /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */ + int precalCoef[BUFFPOINTNB][BUFFPOINTNB]; + + /** calculatePXandPY statics */ + int wave; + int wavesp; + +} ZoomFilterFXWrapperData; + + + + +static inline v2g zoomVector(ZoomFilterFXWrapperData *data, float X, float Y) +{ + v2g vecteur; + float vx, vy; + float sq_dist = X*X + Y*Y; + + /* sx = (X < 0.0f) ? -1.0f : 1.0f; + sy = (Y < 0.0f) ? -1.0f : 1.0f; + */ + float coefVitesse = (1.0f+ data->general_speed) / 50.0f; + + // Effects + + /* Centralized FX */ + + switch (data->theMode) { + case CRYSTAL_BALL_MODE: + coefVitesse -= (sq_dist-0.3f)/15.0f; + break; + case AMULETTE_MODE: + coefVitesse += sq_dist * 3.5f; + break; + case WAVE_MODE: + coefVitesse += sin(sq_dist*20.0f) / 100.0f; + break; + case SCRUNCH_MODE: + coefVitesse += sq_dist / 10.0f; + break; + //case HYPERCOS1_MODE: + break; + //case HYPERCOS2_MODE: + break; + //case YONLY_MODE: + break; + case SPEEDWAY_MODE: + coefVitesse *= 4.0f * Y; + break; + default: + break; + } + + if (coefVitesse < -2.01f) + coefVitesse = -2.01f; + if (coefVitesse > 2.01f) + coefVitesse = 2.01f; + + vx = coefVitesse * X; + vy = coefVitesse * Y; + + /* Amulette 2 */ + // vx = X * tan(dist); + // vy = Y * tan(dist); + + /* Rotate */ + //vx = (X+Y)*0.1; + //vy = (Y-X)*0.1; + + + // Effects adds-on + + /* Noise */ + if (data->noisify) + { + vx += (((float)random()) / ((float)RAND_MAX) - 0.5f) / 50.0f; + vy += (((float)random()) / ((float)RAND_MAX) - 0.5f) / 50.0f; + } + + /* Hypercos */ + if (data->hypercosEffect) + { + vx += sin(Y*10.0f)/120.0f; + vy += sin(X*10.0f)/120.0f; + } + + /* H Plane */ + if (data->hPlaneEffect) vx += Y * 0.0025f * data->hPlaneEffect; + + /* V Plane */ + if (data->vPlaneEffect) vy += X * 0.0025f * data->vPlaneEffect; + + /* TODO : Water Mode */ + // if (data->waveEffect) + + vecteur.x = vx; + vecteur.y = vy; + + return vecteur; +} + + +/* + * Makes a stripe of a transform buffer (brutT) + * + * The transform is (in order) : + * Translation (-data->middleX, -data->middleY) + * Homothetie (Center : 0,0 Coeff : 2/data->prevX) + */ +static void makeZoomBufferStripe(ZoomFilterFXWrapperData * data, int INTERLACE_INCR) +{ + // Position of the pixel to compute in pixmap coordinates + Uint x, y; + // Where (verticaly) to stop generating the buffer stripe + int maxEnd = (data->interlace_start + INTERLACE_INCR); + // Ratio from pixmap to normalized coordinates + float ratio = 2.0f/((float)data->prevX); + // Ratio from normalized to virtual pixmap coordinates + float inv_ratio = BUFFPOINTNBF/ratio; + float min = ratio/BUFFPOINTNBF; + // Y position of the pixel to compute in normalized coordinates + float Y = ((float)(data->interlace_start - data->middleY)) * ratio; + + maxEnd = data->prevY; + if (maxEnd > (data->interlace_start + INTERLACE_INCR)) + maxEnd = (data->interlace_start + INTERLACE_INCR); + + for (y = data->interlace_start; (y < data->prevY) && ((signed int)y<maxEnd); y++) { + Uint premul_y_prevX = y * data->prevX * 2; + float X = - ((float)data->middleX) * ratio; + for (x = 0; x < data->prevX; x++) + { + v2g vector = zoomVector (data, X, Y); + + /* Finish and avoid null displacement */ + if (fabs(vector.x) < min) vector.x = (vector.x < 0.0f) ? -min : min; + if (fabs(vector.y) < min) vector.y = (vector.y < 0.0f) ? -min : min; + + data->brutT[premul_y_prevX] = ((int)((X-vector.x)*inv_ratio)+((int)(data->middleX*BUFFPOINTNB))); + data->brutT[premul_y_prevX+1] = ((int)((Y-vector.y)*inv_ratio)+((int)(data->middleY*BUFFPOINTNB))); + premul_y_prevX += 2; + X += ratio; + } + Y += ratio; + } + data->interlace_start += INTERLACE_INCR; + if (y >= data->prevY-1) data->interlace_start = -1; +} + + +/* + * calculer px et py en fonction de x,y,middleX,middleY et theMode + * px et py indique la nouvelle position (en sqrtperte ieme de pixel) + * (valeur * 16) + + inline void calculatePXandPY (PluginInfo *goomInfo, ZoomFilterFXWrapperData *data, int x, int y, int *px, int *py) + { + if (data->theMode == WATER_MODE) { + int yy; + + yy = y + goom_irand(goomInfo->gRandom, 4) - goom_irand(goomInfo->gRandom, 4) + data->wave / 10; + if (yy < 0) + yy = 0; + if (yy >= (signed int)goomInfo->screen.height) + yy = goomInfo->screen.height - 1; + + *px = (x << 4) + data->firedec[yy] + (data->wave / 10); + *py = (y << 4) + 132 - ((data->vitesse < 131) ? data->vitesse : 130); + + data->wavesp += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); + if (data->wave < -10) + data->wavesp += 2; + if (data->wave > 10) + data->wavesp -= 2; + data->wave += (data->wavesp / 10) + goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); + if (data->wavesp > 100) + data->wavesp = (data->wavesp * 9) / 10; + } + else { + int dist = 0, vx9, vy9; + int vx, vy; + int ppx, ppy; + int fvitesse = data->vitesse << 4; + + if (data->noisify) { + x += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify); + y += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify); + } + vx = (x - data->middleX) << 9; + vy = (y - data->middleY) << 9; + + if (data->hPlaneEffect) + vx += data->hPlaneEffect * (y - data->middleY); + + if (data->vPlaneEffect) + vy += data->vPlaneEffect * (x - data->middleX); + + if (data->waveEffect) { + fvitesse *= + 1024 + + ShiftRight (goomInfo->sintable + [(unsigned short) (dist * 0xffff + EFFECT_DISTORS)], 6); + fvitesse /= 1024; + } + + if (data->hypercosEffect) { + vx += ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1); + vy += ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1); + } + + vx9 = ShiftRight (vx, 9); + vy9 = ShiftRight (vy, 9); + dist = vx9 * vx9 + vy9 * vy9; + + switch (data->theMode) { + case WAVE_MODE: + fvitesse *= + 1024 + + ShiftRight (goomInfo->sintable + [(unsigned short) (dist * 0xffff * EFFECT_DISTORS)], 6); + fvitesse>>=10; + break; + case CRYSTAL_BALL_MODE: + fvitesse += (dist >> (10-EFFECT_DISTORS_SL)); + break; + case AMULETTE_MODE: + fvitesse -= (dist >> (4 - EFFECT_DISTORS_SL)); + break; + case SCRUNCH_MODE: + fvitesse -= (dist >> (10 - EFFECT_DISTORS_SL)); + break; + case HYPERCOS1_MODE: + vx = vx + ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1); + vy = vy + ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1); + break; + case HYPERCOS2_MODE: + vx = + vx + ShiftRight (goomInfo->sintable[(-ShiftRight (vy, 1) + dist) & 0xffff], 0); + vy = + vy + ShiftRight (goomInfo->sintable[(ShiftRight (vx, 1) + dist) & 0xffff], 0); + fvitesse = 128 << 4; + break; + case YONLY_MODE: + fvitesse *= 1024 + ShiftRight (goomInfo->sintable[vy & 0xffff], 6); + fvitesse >>= 10; + break; + case SPEEDWAY_MODE: + fvitesse -= (ShiftRight(vy,10-EFFECT_DISTORS_SL)); + break; + } + + if (fvitesse < -3024) + fvitesse = -3024; + + if (vx < 0) // pb avec decalage sur nb negatif + ppx = -(-(vx * fvitesse) >> 16); + // 16 = 9 + 7 (7 = nb chiffre virgule de vitesse * (v = 128 => immobile) + // * * * * * 9 = nb chiffre virgule de vx) + else + ppx = ((vx * fvitesse) >> 16); + + if (vy < 0) + ppy = -(-(vy * fvitesse) >> 16); + else + ppy = ((vy * fvitesse) >> 16); + + *px = (data->middleX << 4) + ppx; + *py = (data->middleY << 4) + ppy; + } + } + */ + + + +static void c_zoom (Pixel *expix1, Pixel *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD, + int buffratio, int precalCoef[16][16]) +{ + int myPos, myPos2; + Color couleur; + + unsigned int ax = (prevX - 1) << PERTEDEC, ay = (prevY - 1) << PERTEDEC; + + int bufsize = prevX * prevY * 2; + int bufwidth = prevX; + + expix1[0].val=expix1[prevX-1].val=expix1[prevX*prevY-1].val=expix1[prevX*prevY-prevX].val=0; + + for (myPos = 0; myPos < bufsize; myPos += 2) { + Color col1, col2, col3, col4; + int c1, c2, c3, c4, px, py; + int pos; + int coeffs; + + int brutSmypos = brutS[myPos]; + + myPos2 = myPos + 1; + + px = brutSmypos + (((brutD[myPos] - brutSmypos) * buffratio) >> BUFFPOINTNB); + brutSmypos = brutS[myPos2]; + py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB); + + if ((py >= ay) || (px >= ax)) { + pos = coeffs = 0; + } else { + pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); + /* coef en modulo 15 */ + coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; + } + getPixelRGB_ (expix1, pos, &col1); + getPixelRGB_ (expix1, pos + 1, &col2); + getPixelRGB_ (expix1, pos + bufwidth, &col3); + getPixelRGB_ (expix1, pos + bufwidth + 1, &col4); + + c1 = coeffs; + c2 = (c1 >> 8) & 0xFF; + c3 = (c1 >> 16) & 0xFF; + c4 = (c1 >> 24) & 0xFF; + c1 = c1 & 0xff; + + couleur.r = col1.r * c1 + col2.r * c2 + col3.r * c3 + col4.r * c4; + if (couleur.r > 5) + couleur.r -= 5; + couleur.r >>= 8; + + couleur.v = col1.v * c1 + col2.v * c2 + col3.v * c3 + col4.v * c4; + if (couleur.v > 5) + couleur.v -= 5; + couleur.v >>= 8; + + couleur.b = col1.b * c1 + col2.b * c2 + col3.b * c3 + col4.b * c4; + if (couleur.b > 5) + couleur.b -= 5; + couleur.b >>= 8; + + setPixelRGB_ (expix2, myPos >> 1, couleur); + } +} + +/** generate the water fx horizontal direction buffer */ +static void generateTheWaterFXHorizontalDirectionBuffer(PluginInfo *goomInfo, ZoomFilterFXWrapperData *data) { + + int loopv; + int decc = goom_irand(goomInfo->gRandom, 8) - 4; + int spdc = goom_irand(goomInfo->gRandom, 8) - 4; + int accel = goom_irand(goomInfo->gRandom, 8) - 4; + + for (loopv = data->prevY; loopv != 0;) { + + loopv--; + data->firedec[loopv] = decc; + decc += spdc / 10; + spdc += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); + + if (decc > 4) + spdc -= 1; + if (decc < -4) + spdc += 1; + + if (spdc > 30) + spdc = spdc - goom_irand(goomInfo->gRandom, 3) + accel / 10; + if (spdc < -30) + spdc = spdc + goom_irand(goomInfo->gRandom, 3) + accel / 10; + + if (decc > 8 && spdc > 1) + spdc -= goom_irand(goomInfo->gRandom, 3) - 2; + + if (decc < -8 && spdc < -1) + spdc += goom_irand(goomInfo->gRandom, 3) + 2; + + if (decc > 8 || decc < -8) + decc = decc * 8 / 9; + + accel += goom_irand(goomInfo->gRandom, 2) - goom_irand(goomInfo->gRandom, 2); + if (accel > 20) + accel -= 2; + if (accel < -20) + accel += 2; + } +} + + + +/** +* Main work for the dynamic displacement map. + * + * Reads data from pix1, write to pix2. + * + * Useful datas for this FX are stored in ZoomFilterData. + * + * If you think that this is a strange function name, let me say that a long time ago, + * there has been a slow version and a gray-level only one. Then came these function, + * fast and workin in RGB colorspace ! nice but it only was applying a zoom to the image. + * So that is why you have this name, for the nostalgy of the first days of goom + * when it was just a tiny program writen in Turbo Pascal on my i486... + */ +void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, Uint resx, Uint resy, int switchIncr, float switchMult) +{ + Uint x, y; + + ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)goomInfo->zoomFilter_fx.fx_data; + + if (!BVAL(data->enabled_bp)) return; + + /** changement de taille **/ + if ((data->prevX != resx) || (data->prevY != resy)) { + data->prevX = resx; + data->prevY = resy; + + if (data->brutS) free (data->freebrutS); + data->brutS = 0; + if (data->brutD) free (data->freebrutD); + data->brutD = 0; + if (data->brutT) free (data->freebrutT); + data->brutT = 0; + + data->middleX = resx / 2; + data->middleY = resy / 2; + data->mustInitBuffers = 1; + if (data->firedec) free (data->firedec); + data->firedec = 0; + } + + if (data->interlace_start != -2) + zf = NULL; + + /** changement de config **/ + if (zf) { + data->reverse = zf->reverse; + data->general_speed = (float)(zf->vitesse-128)/128.0f; + if (data->reverse) data->general_speed = -data->general_speed; + data->middleX = zf->middleX; + data->middleY = zf->middleY; + data->theMode = zf->mode; + data->hPlaneEffect = zf->hPlaneEffect; + data->vPlaneEffect = zf->vPlaneEffect; + data->waveEffect = zf->waveEffect; + data->hypercosEffect = zf->hypercosEffect; + data->noisify = zf->noisify; + data->interlace_start = 0; + } + + + if (data->mustInitBuffers) { + + data->mustInitBuffers = 0; + data->freebrutS = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); + data->brutS = (gint32 *) ((1 + ((uintptr_t) (data->freebrutS)) / 128) * 128); + + data->freebrutD = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); + data->brutD = (gint32 *) ((1 + ((uintptr_t) (data->freebrutD)) / 128) * 128); + + data->freebrutT = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); + data->brutT = (gint32 *) ((1 + ((uintptr_t) (data->freebrutT)) / 128) * 128); + + data->buffratio = 0; + + data->firedec = (int *) malloc (data->prevY * sizeof (int)); + generateTheWaterFXHorizontalDirectionBuffer(goomInfo, data); + + data->interlace_start = 0; + makeZoomBufferStripe(data,resy); + + /* Copy the data from temp to dest and source */ + memcpy(data->brutS,data->brutT,resx * resy * 2 * sizeof(int)); + memcpy(data->brutD,data->brutT,resx * resy * 2 * sizeof(int)); + } + + /* generation du buffer de trans */ + if (data->interlace_start == -1) { + + /* sauvegarde de l'etat actuel dans la nouvelle source + * TODO: write that in MMX (has been done in previous version, but did not follow some new fonctionnalities) */ + y = data->prevX * data->prevY * 2; + for (x = 0; x < y; x += 2) { + int brutSmypos = data->brutS[x]; + int x2 = x + 1; + + data->brutS[x] = brutSmypos + (((data->brutD[x] - brutSmypos) * data->buffratio) >> BUFFPOINTNB); + brutSmypos = data->brutS[x2]; + data->brutS[x2] = brutSmypos + (((data->brutD[x2] - brutSmypos) * data->buffratio) >> BUFFPOINTNB); + } + data->buffratio = 0; + } + + if (data->interlace_start == -1) { + signed int * tmp; + tmp = data->brutD; + data->brutD=data->brutT; + data->brutT=tmp; + tmp = data->freebrutD; + data->freebrutD=data->freebrutT; + data->freebrutT=tmp; + data->interlace_start = -2; + } + + if (data->interlace_start>=0) + { + /* creation de la nouvelle destination */ + makeZoomBufferStripe(data,resy/16); + } + + if (switchIncr != 0) { + data->buffratio += switchIncr; + if (data->buffratio > BUFFPOINTMASK) + data->buffratio = BUFFPOINTMASK; + } + + if (switchMult != 1.0f) { + data->buffratio = (int) ((float) BUFFPOINTMASK * (1.0f - switchMult) + + (float) data->buffratio * switchMult); + } + + data->zoom_width = data->prevX; + + goomInfo->methods.zoom_filter (data->prevX, data->prevY, pix1, pix2, + data->brutS, data->brutD, data->buffratio, data->precalCoef); +} + +static void generatePrecalCoef (int precalCoef[16][16]) +{ + int coefh, coefv; + + for (coefh = 0; coefh < 16; coefh++) { + for (coefv = 0; coefv < 16; coefv++) { + + int i; + int diffcoeffh; + int diffcoeffv; + + diffcoeffh = sqrtperte - coefh; + diffcoeffv = sqrtperte - coefv; + + if (!(coefh || coefv)) { + i = 255; + } + else { + int i1, i2, i3, i4; + + i1 = diffcoeffh * diffcoeffv; + i2 = coefh * diffcoeffv; + i3 = diffcoeffh * coefv; + i4 = coefh * coefv; + + // TODO: faire mieux... + if (i1) i1--; + if (i2) i2--; + if (i3) i3--; + if (i4) i4--; + + i = (i1) | (i2 << 8) | (i3 << 16) | (i4 << 24); + } + precalCoef[coefh][coefv] = i; + } + } +} + +/* VisualFX Wrapper */ + +static void zoomFilterVisualFXWrapper_init (struct _VISUAL_FX *_this, PluginInfo *info) +{ + ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)malloc(sizeof(ZoomFilterFXWrapperData)); + + data->coeffs = 0; + data->freecoeffs = 0; + data->brutS = 0; + data->freebrutS = 0; + data->brutD = 0; + data->freebrutD = 0; + data->brutT = 0; + data->freebrutT = 0; + data->prevX = 0; + data->prevY = 0; + + data->mustInitBuffers = 1; + data->interlace_start = -2; + + data->general_speed = 0.0f; + data->reverse = 0; + data->theMode = AMULETTE_MODE; + data->waveEffect = 0; + data->hypercosEffect = 0; + data->vPlaneEffect = 0; + data->hPlaneEffect = 0; + data->noisify = 2; + + /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */ + data->buffratio = 0; + data->firedec = 0; + + data->wave = data->wavesp = 0; + + data->enabled_bp = secure_b_param("Enabled", 1); + + data->params = plugin_parameters ("Zoom Filter", 1); + data->params.params[0] = &data->enabled_bp; + + _this->params = &data->params; + _this->fx_data = (void*)data; + + /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */ + generatePrecalCoef(data->precalCoef); +} + +static void zoomFilterVisualFXWrapper_free (struct _VISUAL_FX *_this) +{ + ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)_this->fx_data; + free (data->freebrutS); + free (data->freebrutD); + free (data->freebrutT); + free (data->firedec); + free (data->params.params); + free(_this->fx_data); +} + +static void zoomFilterVisualFXWrapper_apply (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info) +{ +} + +VisualFX zoomFilterVisualFXWrapper_create(void) +{ + VisualFX fx; + fx.init = zoomFilterVisualFXWrapper_init; + fx.free = zoomFilterVisualFXWrapper_free; + fx.apply = zoomFilterVisualFXWrapper_apply; + return fx; +} + + +/* TODO : MOVE THIS AWAY */ + +void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c, float t1, float t2, float t3, float t4, Uint cycle) +{ + Uint x = (Uint) ((int) (goomInfo->screen.width / 2) + + (int) (t1 * cos ((float) cycle / t3))); + Uint y = (Uint) ((int) (goomInfo->screen.height/2) + + (int) (t2 * sin ((float) cycle / t4))); + + if ((x > 1) && (y > 1) && (x < goomInfo->screen.width - 2) && (y < goomInfo->screen.height - 2)) { + setPixelRGB (goomInfo, pix1, x + 1, y, c); + setPixelRGB (goomInfo, pix1, x, y + 1, c); + setPixelRGB (goomInfo, pix1, x + 1, y + 1, WHITE); + setPixelRGB (goomInfo, pix1, x + 2, y + 1, c); + setPixelRGB (goomInfo, pix1, x + 1, y + 2, c); + } +} diff --git a/src/visualizations/Goom/goom2k4-0/src/filters_mmx.s b/src/visualizations/Goom/goom2k4-0/src/filters_mmx.s new file mode 100644 index 0000000000..765f1588e1 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/filters_mmx.s @@ -0,0 +1,200 @@ +;// file : mmx_zoom.s +;// author : JC Hoelt <jeko@free.fr> +;// +;// history +;// 07/01/2001 : Changing FEMMS to EMMS : slower... but run on intel machines +;// 03/01/2001 : WIDTH and HEIGHT are now variable +;// 28/12/2000 : adding comments to the code, suppress some useless lines +;// 27/12/2000 : reducing memory access... improving performance by 20% +;// coefficients are now on 1 byte +;// 22/12/2000 : Changing data structure +;// 16/12/2000 : AT&T version +;// 14/12/2000 : unrolling loop +;// 12/12/2000 : 64 bits memory access + + +.data + +chaine: + .string "pos = %d\n\0" + .long 0x0 + +thezero: + .long 0x00000000 + .long 0x00000000 + +.text + +.globl mmx_zoom ;// name of the function to call by C program +/* .extern coeffs ;// the transformation buffer */ +.extern expix1,expix2 ;// the source and destination buffer +.extern mmx_zoom_size, zoom_width ;// size of the buffers + +.extern brutS,brutD,buffratio,precalCoef,prevX,prevY + +#define PERTEMASK 15 +/* faire : a / sqrtperte <=> a >> PERTEDEC*/ +#define PERTEDEC 4 + +.align 16 +mmx_zoom: + + pushl %ebp + movl %esp,%ebp + subl $12,%esp + + movl prevX,%eax + decl %eax + sarl $4,%eax + movl %eax,-4(%ebp) + + movl prevY,%eax + decl %eax + sarl $4,%eax + movl %eax,-8(%ebp) + +;// initialisation du mm7 à zero + movq (thezero), %mm7 + +movl mmx_zoom_size, %ecx +decl %ecx + +.while: + ;// esi <- nouvelle position + movl brutS, %eax + leal (%eax, %ecx, 8),%eax + + movl (%eax),%edx /* = brutS.px (brutSmypos) */ + movl 4(%eax),%eax /* = brutS.py */ + + movl brutD,%ebx + leal (%ebx, %ecx, 8),%ebx + movl (%ebx),%esi + subl %edx, %esi + imull buffratio,%esi + sarl $16,%esi + addl %edx,%esi /* esi = px */ + + /* eax contient deja brutS.py = le nouveau brutSmypos*/ + /* ebx pointe sur brutD[myPos] */ + movl 4(%ebx),%edi + subl %eax,%edi + imull buffratio,%edi + sarl $16,%edi + addl %eax,%edi /* edi = py */ + +/* pushl %eax + pushl %ebx*/ +/* popl %ebx + popl %eax*/ + + movl %esi,%eax + andl $15,%eax /* eax = coefh */ + movl %edi,%ebx + andl $15,%ebx /* ebx = coefv */ + + leal 0(,%ebx,4),%ebx + sall $6,%eax + addl %ebx,%eax + movl $precalCoef,%ebx +/* movd (%eax,%ebx),%mm6*/ /* mm6 = coeffs */ + + cmpl -8(%ebp),%edi + jge .then1 + cmpl -4(%ebp),%esi + jge .then1 + + sarl $4,%esi + sarl $4,%edi + imull zoom_width,%edi + leal (%esi,%edi),%esi + jmp .finsi1 + +.then1: + movl $0,%esi +.finsi1: + + /** apres ce calcul, %esi = pos, %mm6 = coeffs **/ +/* pushl %esi + pushl $chaine + call printf + addl $8,%esp*/ + + movl expix1,%eax + + ;// recuperation des deux premiers pixels dans mm0 et mm1 +/* movq (%eax,%esi,4), %mm0 /* b1-v1-r1-a1-b2-v2-r2-a2 */ + movq %mm0, %mm1 /* b1-v1-r1-a1-b2-v2-r2-a2 */ + + ;// depackage du premier pixel + punpcklbw %mm7, %mm0 /* 00-b2-00-v2-00-r2-00-a2 */ + + movq %mm6, %mm5 /* ??-??-??-??-c4-c3-c2-c1 */ + ;// depackage du 2ieme pixel + punpckhbw %mm7, %mm1 /* 00-b1-00-v1-00-r1-00-a1 */ + + ;// extraction des coefficients... + punpcklbw %mm5, %mm6 /* c4-c4-c3-c3-c2-c2-c1-c1 */ + movq %mm6, %mm4 /* c4-c4-c3-c3-c2-c2-c1-c1 */ + movq %mm6, %mm5 /* c4-c4-c3-c3-c2-c2-c1-c1 */ + + punpcklbw %mm5, %mm6 /* c2-c2-c2-c2-c1-c1-c1-c1 */ + punpckhbw %mm5, %mm4 /* c4-c4-c4-c4-c3-c3-c3-c3 */ + + movq %mm6, %mm3 /* c2-c2-c2-c2-c1-c1-c1-c1 */ + punpcklbw %mm7, %mm6 /* 00-c1-00-c1-00-c1-00-c1 */ + punpckhbw %mm7, %mm3 /* 00-c2-00-c2-00-c2-00-c2 */ + + ;// multiplication des pixels par les coefficients + pmullw %mm6, %mm0 /* c1*b2-c1*v2-c1*r2-c1*a2 */ + pmullw %mm3, %mm1 /* c2*b1-c2*v1-c2*r1-c2*a1 */ + paddw %mm1, %mm0 + + ;// ...extraction des 2 derniers coefficients + movq %mm4, %mm5 /* c4-c4-c4-c4-c3-c3-c3-c3 */ + punpcklbw %mm7, %mm4 /* 00-c3-00-c3-00-c3-00-c3 */ + punpckhbw %mm7, %mm5 /* 00-c4-00-c4-00-c4-00-c4 */ + + /* ajouter la longueur de ligne a esi */ + addl prevX,%esi + + ;// recuperation des 2 derniers pixels +/* movq (%eax,%esi,4), %mm1*/ + movq %mm1, %mm2 + + ;// depackage des pixels + punpcklbw %mm7, %mm1 + punpckhbw %mm7, %mm2 + + ;// multiplication pas les coeffs + pmullw %mm4, %mm1 + pmullw %mm5, %mm2 + + ;// ajout des valeurs obtenues à la valeur finale + paddw %mm1, %mm0 + paddw %mm2, %mm0 + + ;// division par 256 = 16+16+16+16, puis repackage du pixel final + psrlw $8, %mm0 + packuswb %mm7, %mm0 + + ;// passage au suivant + + ;// enregistrement du resultat + movl expix2,%eax +/* movd %mm0,(%eax,%ecx,4)*/ + + decl %ecx + ;// test de fin du tantque + cmpl $0, %ecx ;// 400x300 + + jz .fin_while + jmp .while + +.fin_while: + emms + + movl %ebp,%esp + popl %ebp + + ret ;//The End diff --git a/src/visualizations/Goom/goom2k4-0/src/flying_stars_fx.c b/src/visualizations/Goom/goom2k4-0/src/flying_stars_fx.c new file mode 100644 index 0000000000..970ba9d48a --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/flying_stars_fx.c @@ -0,0 +1,316 @@ +#include "goom_fx.h" +#include "goom_plugin_info.h" +#include "goom_tools.h" + +#include "mathtools.h" + +/* TODO:-- FAIRE PROPREMENT... BOAH... */ +#define NCOL 15 + +/*static const int colval[] = { +0xfdf6f5, +0xfae4e4, +0xf7d1d1, +0xf3b6b5, +0xefa2a2, +0xec9190, +0xea8282, +0xe87575, +0xe46060, +0xe14b4c, +0xde3b3b, +0xdc2d2f, +0xd92726, +0xd81619, +0xd50c09, +0 +}; +*/ +static const int colval[] = { + 0x1416181a, + 0x1419181a, + 0x141f181a, + 0x1426181a, + 0x142a181a, + 0x142f181a, + 0x1436181a, + 0x142f1819, + 0x14261615, + 0x13201411, + 0x111a100a, + 0x0c180508, + 0x08100304, + 0x00050101, + 0x0 +}; + + +/* The different modes of the visual FX. + * Put this values on fx_mode */ +#define FIREWORKS_FX 0 +#define RAIN_FX 1 +#define FOUNTAIN_FX 2 +#define LAST_FX 3 + +typedef struct _FS_STAR { + float x,y; + float vx,vy; + float ax,ay; + float age,vage; +} Star; + +typedef struct _FS_DATA{ + + int fx_mode; + int nbStars; + + int maxStars; + Star *stars; + + float min_age; + float max_age; + + PluginParam min_age_p; + PluginParam max_age_p; + PluginParam nbStars_p; + PluginParam nbStars_limit_p; + PluginParam fx_mode_p; + + PluginParameters params; +} FSData; + +static void fs_init(VisualFX *_this, PluginInfo *info) { + + FSData *data; + data = (FSData*)malloc(sizeof(FSData)); + + data->fx_mode = FIREWORKS_FX; + data->maxStars = 4096; + data->stars = (Star*)malloc(data->maxStars * sizeof(Star)); + data->nbStars = 0; + + data->max_age_p = secure_i_param ("Fireworks Smallest Bombs"); + IVAL(data->max_age_p) = 80; + IMIN(data->max_age_p) = 0; + IMAX(data->max_age_p) = 100; + ISTEP(data->max_age_p) = 1; + + data->min_age_p = secure_i_param ("Fireworks Largest Bombs"); + IVAL(data->min_age_p) = 99; + IMIN(data->min_age_p) = 0; + IMAX(data->min_age_p) = 100; + ISTEP(data->min_age_p) = 1; + + data->nbStars_limit_p = secure_i_param ("Max Number of Particules"); + IVAL(data->nbStars_limit_p) = 512; + IMIN(data->nbStars_limit_p) = 0; + IMAX(data->nbStars_limit_p) = data->maxStars; + ISTEP(data->nbStars_limit_p) = 64; + + data->fx_mode_p = secure_i_param ("FX Mode"); + IVAL(data->fx_mode_p) = data->fx_mode; + IMIN(data->fx_mode_p) = 1; + IMAX(data->fx_mode_p) = 3; + ISTEP(data->fx_mode_p) = 1; + + data->nbStars_p = secure_f_feedback ("Number of Particules (% of Max)"); + + data->params = plugin_parameters ("Particule System", 7); + data->params.params[0] = &data->fx_mode_p; + data->params.params[1] = &data->nbStars_limit_p; + data->params.params[2] = 0; + data->params.params[3] = &data->min_age_p; + data->params.params[4] = &data->max_age_p; + data->params.params[5] = 0; + data->params.params[6] = &data->nbStars_p; + + _this->params = &data->params; + _this->fx_data = (void*)data; +} + +static void fs_free(VisualFX *_this) { + FSData *data = (FSData*)_this->fx_data; + free (data->stars); + free (data->params.params); + free (data); +} + + +/** + * Cree une nouvelle 'bombe', c'est a dire une particule appartenant a une fusee d'artifice. + */ +static void addABomb (FSData *fs, int mx, int my, float radius, float vage, float gravity, PluginInfo *info) { + + int i = fs->nbStars; + float ro; + int theta; + + if (fs->nbStars >= fs->maxStars) + return; + fs->nbStars++; + + fs->stars[i].x = mx; + fs->stars[i].y = my; + + ro = radius * (float)goom_irand(info->gRandom,100) / 100.0f; + ro *= (float)goom_irand(info->gRandom,100)/100.0f + 1.0f; + theta = goom_irand(info->gRandom,256); + + fs->stars[i].vx = ro * cos256[theta]; + fs->stars[i].vy = -0.2f + ro * sin256[theta]; + + fs->stars[i].ax = 0; + fs->stars[i].ay = gravity; + + fs->stars[i].age = 0; + if (vage < fs->min_age) + vage=fs->min_age; + fs->stars[i].vage = vage; +} + + +/** + * Met a jour la position et vitesse d'une particule. + */ +static void updateStar (Star *s) { + s->x+=s->vx; + s->y+=s->vy; + s->vx+=s->ax; + s->vy+=s->ay; + s->age+=s->vage; +} + + +/** + * Ajoute de nouvelles particules au moment d'un evenement sonore. + */ +static void fs_sound_event_occured(VisualFX *_this, PluginInfo *info) { + + FSData *data = (FSData*)_this->fx_data; + int i; + + int max = (int)((1.0f+info->sound.goomPower)*goom_irand(info->gRandom,150)) + 100; + float radius = (1.0f+info->sound.goomPower) * (float)(goom_irand(info->gRandom,150)+50)/300; + int mx; + int my; + float vage, gravity = 0.02f; + + switch (data->fx_mode) { + case FIREWORKS_FX: + { + double dx,dy; + do { + mx = goom_irand(info->gRandom,info->screen.width); + my = goom_irand(info->gRandom,info->screen.height); + dx = (mx - info->screen.width/2); + dy = (my - info->screen.height/2); + } while (dx*dx + dy*dy < (info->screen.height/2)*(info->screen.height/2)); + vage = data->max_age * (1.0f - info->sound.goomPower); + } + break; + case RAIN_FX: + mx = goom_irand(info->gRandom,info->screen.width); + if (mx > info->screen.width/2) + mx = info->screen.width; + else + mx = 0; + my = -(info->screen.height/3)-goom_irand(info->gRandom,info->screen.width/3); + radius *= 1.5; + vage = 0.002f; + break; + case FOUNTAIN_FX: + my = info->screen.height+2; + vage = 0.001f; + radius += 1.0f; + mx = info->screen.width / 2; + gravity = 0.04f; + break; + default: + return; + /* my = i R A N D (info->screen.height); vage = 0.01f; */ + } + + radius *= info->screen.height / 200.0f; /* why 200 ? because the FX was developped on 320x200 */ + max *= info->screen.height / 200.0f; + + if (info->sound.timeSinceLastBigGoom < 1) { + radius *= 1.5; + max *= 2; + } + for (i=0;i<max;++i) + addABomb (data,mx,my,radius,vage,gravity,info); +} + + +/** + * Main methode of the FX. + */ +static void fs_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) { + + int i; + int col; + FSData *data = (FSData*)_this->fx_data; + + /* Get the new parameters values */ + data->min_age = 1.0f - (float)IVAL(data->min_age_p)/100.0f; + data->max_age = 1.0f - (float)IVAL(data->max_age_p)/100.0f; + FVAL(data->nbStars_p) = (float)data->nbStars / (float)data->maxStars; + data->nbStars_p.change_listener(&data->nbStars_p); + data->maxStars = IVAL(data->nbStars_limit_p); + data->fx_mode = IVAL(data->fx_mode_p); + + /* look for events */ + if (info->sound.timeSinceLastGoom < 1) { + fs_sound_event_occured(_this, info); + if (goom_irand(info->gRandom,20)==1) { + IVAL(data->fx_mode_p) = goom_irand(info->gRandom,(LAST_FX*3)); + data->fx_mode_p.change_listener(&data->fx_mode_p); + } + } + + /* update particules */ + for (i=0;i<data->nbStars;++i) { + updateStar(&data->stars[i]); + + /* dead particule */ + if (data->stars[i].age>=NCOL) + continue; + + /* choose the color of the particule */ + col = colval[(int)data->stars[i].age]; + + /* draws the particule */ + info->methods.draw_line(dest,(int)data->stars[i].x,(int)data->stars[i].y, + (int)(data->stars[i].x-data->stars[i].vx*6), + (int)(data->stars[i].y-data->stars[i].vy*6), + col, + (int)info->screen.width, (int)info->screen.height); + info->methods.draw_line(dest,(int)data->stars[i].x,(int)data->stars[i].y, + (int)(data->stars[i].x-data->stars[i].vx*2), + (int)(data->stars[i].y-data->stars[i].vy*2), + col, + (int)info->screen.width, (int)info->screen.height); + } + + /* look for dead particules */ + for (i=0;i<data->nbStars;) { + + if ((data->stars[i].x > info->screen.width + 64) + ||((data->stars[i].vy>=0)&&(data->stars[i].y - 16*data->stars[i].vy > info->screen.height)) + ||(data->stars[i].x < -64) + ||(data->stars[i].age>=NCOL)) { + data->stars[i] = data->stars[data->nbStars-1]; + data->nbStars--; + } + else ++i; + } +} + +VisualFX flying_star_create(void) { + VisualFX vfx; + vfx.init = fs_init; + vfx.free = fs_free; + vfx.apply = fs_apply; + vfx.fx_data = 0; + return vfx; +} diff --git a/src/visualizations/Goom/goom2k4-0/src/gfontlib.c b/src/visualizations/Goom/goom2k4-0/src/gfontlib.c new file mode 100644 index 0000000000..596981db44 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/gfontlib.c @@ -0,0 +1,231 @@ +#include "goom_config.h" +#include "gfontrle.h" +#include "gfontlib.h" +#include <string.h> +#include <stdlib.h> + +static Pixel ***font_chars; +static int *font_width; +static int *font_height; +static Pixel ***small_font_chars; +static int *small_font_width; +static int *small_font_height; + +void gfont_load (void) { + unsigned char *gfont; + unsigned int i = 0, j = 0; + unsigned int nba = 0; + unsigned int current = 32; + int *font_pos; + /* decompress le rle */ + + + + gfont = malloc (the_font.width*the_font.height*the_font.bytes_per_pixel); + while (i<the_font.rle_size) { + unsigned char c = the_font.rle_pixel [i++]; + if (c == 0) { + unsigned int nb = the_font.rle_pixel [i++]; + while (nb--) + gfont[j++] = 0; + } + else + gfont [j++] = c; + } + + /* determiner les positions de chaque lettre. */ + + font_height = calloc (256,sizeof(int)); + small_font_height = calloc (256,sizeof(int)); + font_width = calloc (256,sizeof(int)); + small_font_width = calloc (256,sizeof(int)); + font_chars = calloc (256,sizeof(int**)); + small_font_chars = calloc (256,sizeof(int**)); + font_pos = calloc (256,sizeof(int)); + + for (i=0;i<the_font.width;i++) { + unsigned char a = gfont [i*4 + 3]; + if (a) + nba ++; + else + nba = 0; + if (nba == 2) { + font_width [current] = i - font_pos [current]; + small_font_width [current] = font_width [current]/2; + font_pos [++current] = i; + font_height [current] = the_font.height - 2; + small_font_height [current] = font_height [current]/2; + } + } + font_pos [current] = 0; + font_height [current] = 0; + small_font_height [current] = 0; + + /* charger les lettres et convertir au format de la machine */ + + for (i=33;i<current;i++) { + int x; int y; + font_chars [i] = malloc (font_height[i]*sizeof(int *)); + small_font_chars [i] = malloc (font_height[i]*sizeof(int *)/2); + for (y = 0; y < font_height[i]; y++) { + font_chars [i][y] = malloc (font_width[i]*sizeof(int)); + for (x = 0; x < font_width[i]; x++) { + unsigned int r,g,b,a; + r = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4)]; + g = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+1)]; + b = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+2)]; + a = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+3)]; + font_chars [i][y][x].val = + (r<<(ROUGE*8))|(g<<(VERT*8))|(b<<(BLEU*8))|(a<<(ALPHA*8)); + } + } + for (y = 0; y < font_height[i]/2; y++) { + small_font_chars [i][y] = malloc (font_width[i]*sizeof(int)/2); + for (x = 0; x < font_width[i]/2; x++) { + unsigned int r1,g1,b1,a1,r2,g2,b2,a2,r3,g3,b3,a3,r4,g4,b4,a4; + r1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4)]; + g1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+1)]; + b1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+2)]; + a1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+3)]; + r2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+4)]; + g2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+5)]; + b2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+6)]; + a2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+7)]; + r3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4)]; + g3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+1)]; + b3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+2)]; + a3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+3)]; + r4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+4)]; + g4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+5)]; + b4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+6)]; + a4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+7)]; + small_font_chars [i][y][x].val = + (((r1 + r2 + r3 + r4)>>2)<<(ROUGE*8))| + (((g1 + g2 + g3 + g4)>>2)<<(VERT*8))| + (((b1 + b2 + b3 + b4)>>2)<<(BLEU*8))| + (((a1 + a2 + a3 + a4)>>2)<<(ALPHA*8)); + } + } + } + + /* definir les lettres restantes */ + + for (i=0;i<256;i++) { + if (font_chars[i]==0) { + font_chars[i]=font_chars[42]; + small_font_chars[i]=small_font_chars[42]; + font_width[i]=font_width[42]; + font_pos[i]=font_pos[42]; + font_height[i]=font_height[42]; + small_font_width[i]=small_font_width[42]; + small_font_height[i]=small_font_height[42]; + } + } + + font_width [32] = (the_font.height / 2) - 1; + small_font_width [32] = font_width [32]/2; + font_chars [32] = 0; + small_font_chars [32] = 0; + free( gfont ); + free( font_pos ); +} + +void goom_draw_text (Pixel * buf,int resolx,int resoly, + int x, int y, + const char *str, float charspace, int center) { + float fx = (float) x; + int fin = 0; + + Pixel ***cur_font_chars; + int *cur_font_width; + int *cur_font_height; + + if (resolx>320) + { + /* printf("use big\n"); */ + cur_font_chars = font_chars; + cur_font_width = font_width; + cur_font_height = font_height; + } + else + { + /* printf ("use small\n"); */ + cur_font_chars = small_font_chars; + cur_font_width = small_font_width; + cur_font_height = small_font_height; + } + + if (cur_font_chars == NULL) + return ; + + if (center) { + unsigned char *tmp = (unsigned char*)str; + float lg = -charspace; + + while (*tmp != '\0') + lg += cur_font_width[*(tmp++)] + charspace; + + fx -= lg / 2; + } + + while (!fin) { + unsigned char c = *str; + + x = (int) fx; + + if (c == '\0') + fin = 1; + else if (cur_font_chars[c]==0) { + fx += cur_font_width[c] + charspace; + } + else { + int xx, yy; + int xmin = x; + int xmax = x + cur_font_width[c]; + int ymin = y - cur_font_height[c]; + int ymax = y; + + yy = ymin; + + if (xmin < 0) + xmin = 0; + + if (xmin >= resolx - 1) + return; + + if (xmax >= (int) resolx) + xmax = resolx - 1; + + if (yy < 0) + yy = 0; + + if (yy <= (int) resoly - 1) { + if (ymax >= (int) resoly - 1) + ymax = resoly - 1; + + for (; yy < ymax; yy++) + for (xx = xmin; xx < xmax; xx++) + { + Pixel color = cur_font_chars[c][yy - ymin][xx - x]; + Pixel transparency; + transparency.val = color.val & A_CHANNEL; + if (transparency.val) + { + if (transparency.val==A_CHANNEL) buf[yy * resolx + xx] = color; + else + { + Pixel back = buf[yy * resolx + xx]; + unsigned int a1 = color.channels.a; + unsigned int a2 = 255 - a1; + buf[yy * resolx + xx].channels.r = (unsigned char)((((unsigned int)color.channels.r * a1) + ((unsigned int)back.channels.r * a2)) >> 8); + buf[yy * resolx + xx].channels.g = (unsigned char)((((unsigned int)color.channels.g * a1) + ((unsigned int)back.channels.g * a2)) >> 8); + buf[yy * resolx + xx].channels.b = (unsigned char)((((unsigned int)color.channels.b * a1) + ((unsigned int)back.channels.b * a2)) >> 8); + } + } + } + } + fx += cur_font_width[c] + charspace; + } + str++; + } +} diff --git a/src/visualizations/Goom/goom2k4-0/src/gfontlib.h b/src/visualizations/Goom/goom2k4-0/src/gfontlib.h new file mode 100644 index 0000000000..0520b7da9f --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/gfontlib.h @@ -0,0 +1,10 @@ +#ifndef _GFONTLIB_H +#define _GFONTLIB_H + +#include "goom_graphic.h" + +void gfont_load (void); +void goom_draw_text (Pixel * buf,int resolx,int resoly, int x, int y, + const char *str, float chspace, int center); + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/gfontrle.c b/src/visualizations/Goom/goom2k4-0/src/gfontrle.c new file mode 100644 index 0000000000..8a4b32cd0f --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/gfontrle.c @@ -0,0 +1,2500 @@ +/* RGBA C-Source image dump (with zRLE compression) */ + +const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; + unsigned int rle_size; + unsigned char rle_pixel [49725]; +} the_font = { +1277, 21, 4, 49725, { +121,17,164,255,121,17,164,255,121,17,164,255,121,17,164,255,0,8,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +164,255,0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20, +121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121, +17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,28,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,121,17,164,255,121,17,164,255,0,56,121,17,164,0,1,121,17, +164,255,121,17,164,255,13,4,17,0,1,13,4,17,0,1,13,4,17,0, +1,16,5,22,0,13,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,25,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,25,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,33,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,33,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,33,16,5,22,0,1,14,4,19,0,1,13,4,17,0, +1,13,4,17,0,1,16,5,22,0,61,16,5,22,0,1,14,4,19,0, +255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +25,8,6,3,57,10,8,5,85,9,7,4,76,0,12,8,6,3,54,9, +8,4,96,9,7,4,85,0,12,8,6,3,57,9,8,4,96,9,7,4, +85,0,24,8,6,3,57,11,8,4,85,9,7,4,79,0,12,8,6,3, +51,10,8,5,85,8,6,3,85,0,40,8,6,3,57,11,8,4,85,8, +6,3,85,0,32,8,6,3,57,10,8,5,85,9,7,4,85,0,28,5, +4,2,14,8,6,3,85,9,7,4,85,0,24,8,6,3,74,9,7,4, +113,8,6,3,167,8,6,3,139,9,7,4,85,5,4,2,14,0,36,8, +6,3,57,9,8,4,110,9,7,4,85,0,24,5,4,2,20,9,7,4, +85,9,8,4,85,0,16,9,8,4,57,9,8,4,85,6,5,3,48,0, +255,0,29,5,4,2,17,8,6,3,85,9,7,4,82,0,20,5,4,2, +3,8,6,3,85,9,7,4,93,8,6,3,153,8,6,3,161,8,6,3, +110,9,8,4,85,8,6,3,85,6,5,3,31,0,32,5,4,2,3,8, +6,3,85,10,8,5,85,10,7,5,85,0,36,5,4,2,57,8,6,3, +85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3, +108,8,6,3,85,6,5,3,71,0,24,5,4,2,42,8,6,3,85,9, +7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3,108,8, +6,3,85,6,5,3,71,0,48,5,4,2,3,8,6,3,85,9,8,4, +85,9,7,4,74,0,16,8,6,3,42,9,7,4,85,8,6,3,85,9, +7,4,85,8,6,3,125,8,6,3,170,7,6,4,170,9,7,4,170,12, +9,7,170,19,14,10,170,19,13,10,142,8,6,5,28,0,16,5,4,2, +51,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3, +164,8,6,3,108,8,6,3,85,6,5,3,71,0,20,10,8,5,57,9, +7,4,170,8,6,3,170,8,6,3,170,8,6,3,161,8,6,3,142,9, +7,4,96,9,7,4,85,8,6,3,85,9,7,4,85,9,7,4,74,0, +20,5,4,2,42,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3, +170,8,6,3,164,8,6,3,108,8,6,3,85,6,5,3,76,0,24,8, +6,5,82,10,8,7,133,12,9,7,170,15,11,8,170,15,11,8,170,15, +11,8,170,13,10,8,170,10,8,7,161,10,8,7,85,6,5,5,28,0, +96,8,6,3,74,9,8,4,85,8,6,3,57,0,68,7,6,4,28,9, +7,4,85,9,7,4,85,5,4,2,17,0,40,5,4,2,42,8,6,3, +85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3, +108,8,6,3,85,6,5,3,85,0,24,8,6,5,85,10,8,7,133,12, +9,7,170,15,10,8,170,15,11,8,170,15,11,8,170,13,10,8,170,10, +8,7,150,8,6,5,62,0,24,8,6,5,82,10,8,7,133,12,9,7, +170,15,10,8,170,14,10,7,170,9,7,4,170,8,6,5,147,10,8,5, +85,7,6,4,85,5,4,4,3,0,16,12,9,7,57,11,8,6,161,9, +7,6,170,10,8,7,170,13,10,8,170,14,10,7,170,13,10,8,170,12, +9,7,170,10,8,7,156,10,8,7,85,6,5,5,25,0,20,6,5,3, +57,8,7,5,85,9,7,4,110,9,7,4,170,10,8,5,170,10,8,5, +170,11,8,6,170,10,8,7,150,10,8,7,85,6,5,5,25,0,16,15, +11,8,57,11,8,6,170,9,7,6,170,10,8,7,170,13,10,8,170,15, +11,8,170,15,11,8,170,13,10,8,170,10,8,7,159,10,8,7,85,6, +5,5,25,0,16,15,11,8,59,11,9,6,170,9,7,4,125,10,8,5, +85,8,6,3,133,8,6,3,167,8,6,3,170,8,6,3,170,9,8,4, +113,0,16,8,6,3,42,10,8,5,85,10,7,5,85,9,7,4,125,10, +8,5,170,12,10,7,170,14,11,7,170,19,14,10,170,19,14,10,142,8, +6,5,28,0,16,8,6,5,82,10,8,7,133,12,9,7,170,15,11,8, +170,15,11,8,170,15,11,8,170,13,10,8,170,10,8,7,161,10,8,7, +85,6,5,5,25,0,16,12,10,7,74,14,10,7,170,12,9,7,139,7, +6,4,28,0,16,10,8,7,110,14,10,7,170,13,10,8,125,0,16,13, +10,8,71,15,11,8,170,13,10,8,130,5,5,4,8,0,44,11,8,6, +85,9,7,4,170,10,8,5,93,0,16,12,9,7,57,10,8,5,167,11, +8,6,110,6,5,3,8,0,16,11,8,6,57,10,7,5,159,11,8,6, +102,0,16,8,6,3,51,10,8,5,85,9,7,4,85,0,40,10,7,5, +57,11,9,6,85,7,6,4,57,0,28,7,5,4,28,10,8,5,85,11, +8,6,85,0,16,8,6,3,48,10,8,5,85,8,6,3,85,0,20,8, +6,3,57,11,8,4,85,9,7,4,79,0,20,5,4,2,45,8,6,3, +85,9,7,4,85,9,7,4,88,9,7,4,108,9,8,4,93,9,7,4, +85,8,6,3,85,6,5,3,74,0,20,8,6,3,45,9,7,4,85,8, +6,3,85,9,7,4,85,8,6,3,125,8,6,3,170,8,6,3,164,8, +6,3,108,8,6,3,85,6,5,3,74,0,24,6,5,3,57,8,7,5, +85,10,8,5,85,9,7,4,119,8,6,3,142,9,7,4,130,10,8,5, +91,10,7,5,85,6,5,3,85,0,20,9,7,4,57,10,8,5,85,10, +7,5,85,10,8,5,85,8,6,3,144,8,6,3,170,8,6,3,164,8, +6,3,108,8,6,3,85,6,5,3,71,0,24,5,4,2,45,8,6,3, +85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,9,7,4, +105,8,6,3,85,6,5,3,74,0,20,11,8,4,59,9,7,4,170,8, +6,3,164,9,7,4,91,8,6,3,85,8,6,3,85,8,6,3,85,9, +7,4,85,8,6,3,142,9,6,4,170,9,8,4,116,0,16,8,6,3, +48,10,8,5,85,9,7,4,85,0,20,8,6,3,57,11,8,4,85,9, +7,4,76,0,16,8,6,3,48,10,8,5,85,9,7,4,85,0,20,8, +6,3,57,11,8,4,85,9,7,4,76,0,16,8,6,3,48,10,8,5, +85,9,7,4,85,0,28,8,6,3,57,11,8,4,85,9,7,4,76,0, +16,8,6,3,54,9,8,4,96,9,7,4,85,0,20,8,6,3,57,9, +8,4,96,9,7,4,85,0,16,10,8,5,57,10,7,5,153,10,8,5, +93,0,20,10,8,7,93,14,11,7,170,13,10,8,136,0,16,11,8,6, +91,11,8,6,170,9,7,4,170,9,7,4,170,8,6,5,170,8,6,3, +119,9,7,4,85,8,6,3,85,8,6,3,85,9,7,4,85,9,7,4, +76,0,16,8,6,3,42,9,7,4,85,8,6,3,85,8,6,3,122,9, +8,4,102,0,16,8,6,3,51,9,7,4,85,6,5,3,45,0,40,12, +8,5,57,8,6,3,156,10,7,5,93,11,8,6,85,11,8,6,85,0, +28,6,5,5,14,13,10,8,85,8,7,5,45,0,80,10,8,5,57,10, +7,5,156,10,8,5,96,0,76,9,7,4,57,10,8,5,93,10,8,5, +85,0,140,10,8,7,110,13,10,8,170,12,9,7,133,5,5,4,6,0, +84,8,6,5,79,10,8,7,127,13,10,8,170,16,12,9,142,8,7,5, +28,0,72,8,6,3,57,10,8,5,85,9,6,4,85,0,48,15,11,8, +113,25,18,12,170,20,15,11,142,8,7,5,28,0,28,15,11,8,130,22, +16,11,170,20,15,11,142,7,6,6,23,0,12,13,10,8,68,12,9,7, +170,11,8,6,116,6,5,3,8,0,44,12,9,7,82,15,10,8,170,13, +10,8,130,5,5,4,8,0,255,0,197,6,5,3,57,8,6,3,85,0, +255,0,149,5,4,2,6,8,6,3,85,8,6,3,156,9,8,4,113,0, +16,8,6,3,48,9,8,4,91,9,7,4,76,0,16,10,8,5,57,9, +6,4,170,8,6,3,99,5,4,2,34,0,36,8,6,3,71,9,8,4, +93,9,8,4,96,8,6,3,85,6,5,3,45,0,12,8,6,3,76,0, +44,8,6,3,57,58,31,9,255,93,50,12,255,88,45,11,255,12,10,5, +113,0,4,7,6,4,28,54,29,9,255,93,46,12,255,88,45,11,255,12, +9,5,122,0,4,7,5,4,37,54,29,9,255,93,46,12,255,88,45,11, +255,14,10,5,142,0,16,8,6,3,85,58,31,9,255,93,50,12,255,88, +44,11,255,9,7,4,170,0,4,5,4,2,85,52,28,9,255,93,48,12, +255,88,44,11,255,12,10,5,170,0,32,7,6,4,85,58,31,9,255,93, +50,12,255,88,45,11,255,12,9,5,170,0,24,8,6,3,57,58,31,9, +255,93,50,12,255,88,45,11,255,14,10,5,142,0,20,6,5,3,28,19, +12,6,227,76,37,11,255,88,45,11,255,14,10,5,139,0,16,9,8,4, +170,69,35,10,255,92,47,11,255,92,47,11,255,88,45,11,255,88,45,11, +255,16,11,5,227,7,5,4,28,0,28,8,6,3,57,58,31,9,255,93, +46,12,255,88,45,11,255,14,10,5,142,0,16,6,5,3,28,19,12,6, +227,82,39,11,255,92,47,11,255,14,10,5,105,0,8,7,5,4,20,54, +29,9,255,100,50,13,255,30,19,7,255,8,6,3,85,0,255,0,21,6, +5,3,28,19,12,6,227,76,37,11,255,88,45,11,255,14,10,5,130,0, +12,7,6,4,65,17,11,6,227,71,37,10,255,88,45,11,255,92,47,11, +255,92,47,11,255,88,45,11,255,88,44,11,255,88,44,11,255,25,16,6, +255,8,6,3,142,0,24,7,5,4,85,17,12,6,229,77,39,12,255,107, +51,14,255,113,55,16,255,20,14,9,178,0,28,14,11,7,170,29,18,8, +255,74,39,11,255,88,45,11,255,88,45,11,255,92,47,11,255,92,47,11, +255,88,45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,5,4, +23,0,12,9,7,4,170,26,17,6,255,74,39,11,255,88,45,11,255,88, +45,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88,44,11,255,41, +24,8,255,12,9,5,227,6,5,3,28,0,36,6,5,3,85,16,11,5, +227,71,37,10,255,88,45,11,255,88,44,11,255,12,10,5,113,0,8,8, +6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,88,45,11,255,92, +46,13,255,100,52,13,255,109,53,16,255,121,63,20,255,158,74,23,255,180, +88,27,255,183,90,28,255,26,17,11,142,0,12,10,7,5,170,26,17,6, +255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11,255,92,47,11, +255,88,45,11,255,88,45,11,255,41,24,8,255,12,9,5,227,6,5,3, +28,0,8,7,6,4,8,61,32,10,255,102,51,13,255,92,46,13,255,92, +46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,90,45,11,255,84, +44,11,255,88,45,11,255,88,44,11,255,14,10,5,119,0,12,9,7,4, +153,26,17,6,255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11, +255,92,47,11,255,88,45,11,255,88,44,11,255,45,25,8,255,13,10,6, +227,7,6,4,28,0,12,17,13,10,170,64,39,21,255,155,78,26,255,169, +83,26,255,165,80,24,255,161,79,24,255,145,71,22,255,136,70,21,255,134, +69,21,255,88,50,23,255,22,17,11,232,9,8,6,31,0,84,4,4,3, +23,12,9,5,173,71,34,10,255,92,43,13,255,33,20,8,255,10,8,5, +57,0,64,20,14,7,227,83,42,12,255,92,46,13,255,19,13,6,227,6, +5,3,34,0,32,10,8,5,170,26,17,6,255,76,37,11,255,90,46,11, +255,92,46,13,255,92,46,13,255,90,45,11,255,90,45,11,255,88,44,11, +255,46,26,9,255,18,13,9,227,8,7,5,28,0,12,15,12,8,170,58, +35,19,255,134,73,23,255,153,76,24,255,142,69,21,255,131,64,20,255,121, +59,18,255,121,59,18,255,121,62,18,255,43,27,12,255,11,9,6,170,0, +16,17,13,10,170,64,39,21,255,164,85,27,255,177,86,26,255,154,75,23, +255,121,62,18,255,115,56,16,255,119,61,18,255,123,61,20,255,80,45,19, +255,22,16,11,227,8,7,5,28,0,8,13,10,8,57,96,48,19,255,165, +80,24,255,159,78,24,255,159,78,24,255,165,80,24,255,165,80,24,255,165, +80,24,255,159,78,24,255,164,81,25,255,91,52,24,255,22,17,11,227,8, +7,5,28,0,12,13,10,8,170,38,24,11,255,99,47,16,255,116,59,17, +255,126,65,21,255,142,69,21,255,153,76,24,255,157,74,24,255,155,76,24, +255,91,52,24,255,23,18,12,227,8,7,5,28,0,8,13,10,8,57,104, +52,21,255,171,84,26,255,155,76,24,255,164,81,25,255,173,81,26,255,180, +88,27,255,180,88,27,255,177,86,26,255,169,80,26,255,92,55,25,255,22, +17,11,227,8,7,5,28,0,8,13,10,8,57,114,63,25,255,177,86,26, +255,114,56,17,255,92,46,13,255,92,47,11,255,93,46,12,255,92,46,13, +255,96,48,13,255,92,46,13,255,18,12,5,91,0,8,8,6,3,40,55, +29,10,255,108,50,15,255,114,56,17,255,130,67,21,255,153,76,24,255,161, +82,24,255,171,84,26,255,179,84,26,255,179,84,26,255,25,17,10,142,0, +12,15,12,8,170,64,39,21,255,162,84,27,255,179,88,28,255,183,90,28, +255,181,89,28,255,181,89,28,255,172,88,27,255,156,77,25,255,88,50,23, +255,22,17,11,227,8,7,5,28,0,8,13,9,6,57,96,48,19,255,153, +71,22,255,134,69,21,255,20,14,9,193,0,12,11,8,6,113,124,62,25, +255,185,91,28,255,169,80,26,255,22,15,9,142,0,8,11,8,6,57,111, +61,24,255,184,90,27,255,177,86,26,255,23,16,10,173,0,40,11,8,6, +113,114,59,23,255,144,73,21,255,126,63,21,255,20,14,9,142,0,8,11, +9,6,57,97,51,20,255,152,71,23,255,134,69,21,255,20,14,9,187,0, +12,12,9,7,96,97,48,18,255,140,71,21,255,138,71,21,255,20,15,9, +142,0,8,8,6,3,40,52,28,9,255,93,50,12,255,88,45,11,255,14, +10,5,142,0,32,13,10,8,82,91,48,16,255,132,71,21,255,63,36,18, +255,10,8,7,136,0,20,7,6,6,62,31,21,12,244,124,66,23,255,134, +69,21,255,20,15,9,142,0,8,8,6,3,28,54,29,9,255,93,46,12, +255,80,39,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93, +50,12,255,88,44,11,255,14,10,5,116,0,12,9,7,4,153,26,17,6, +255,74,39,11,255,88,45,11,255,88,45,11,255,88,45,11,255,88,45,11, +255,88,44,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,4,4, +17,0,8,8,6,3,34,54,29,9,255,92,43,11,255,88,44,11,255,88, +45,11,255,92,43,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88, +44,11,255,45,25,8,255,12,10,5,227,6,5,3,28,0,12,13,10,6, +170,40,24,11,255,97,48,16,255,113,55,16,255,115,56,16,255,116,57,17, +255,116,57,17,255,113,55,16,255,113,55,16,255,60,33,13,255,18,14,9, +227,8,6,5,28,0,8,12,9,7,57,77,38,14,255,118,57,17,255,116, +59,17,255,118,60,17,255,109,53,16,255,98,47,13,255,92,47,11,255,88, +45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,6,5,3,28,0, +12,10,8,5,170,28,18,7,255,76,37,11,255,90,45,11,255,92,46,13, +255,94,45,13,255,94,45,13,255,92,46,13,255,92,46,13,255,46,26,9, +255,13,10,6,227,6,5,5,28,0,8,7,6,4,8,61,32,10,255,100, +50,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92, +46,13,255,92,46,13,255,94,47,13,255,98,49,13,255,94,47,13,255,18, +12,5,93,0,8,8,6,3,42,60,32,9,255,96,48,13,255,88,45,11, +255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93,50,12,255,88, +44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9,255,93,50,12, +255,88,44,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93, +50,12,255,88,44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9, +255,93,50,12,255,88,44,11,255,14,10,5,142,0,20,8,6,3,57,58, +31,9,255,93,50,12,255,88,44,11,255,12,10,5,113,0,8,7,6,4, +28,54,29,9,255,93,50,12,255,88,45,11,255,14,10,5,142,0,12,8, +7,3,57,60,31,9,255,96,48,13,255,92,46,13,255,14,10,5,127,0, +8,10,8,5,57,82,42,15,255,135,66,20,255,121,60,20,255,20,15,9, +176,0,12,11,9,6,108,107,56,22,255,172,84,25,255,158,74,23,255,22, +15,9,142,0,8,11,8,6,54,98,51,19,255,142,72,21,255,136,70,21, +255,138,71,21,255,121,59,18,255,100,52,13,255,90,46,11,255,88,44,11, +255,88,44,11,255,88,44,11,255,88,45,11,255,12,10,5,113,0,8,8, +6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,92,47,11,255,92, +47,11,255,18,12,5,85,0,8,7,6,4,45,54,30,9,255,94,47,13, +255,31,20,8,255,9,7,4,85,0,32,8,6,3,48,65,33,10,255,114, +55,15,255,119,58,18,255,126,63,21,255,128,66,21,255,22,15,9,164,0, +20,5,5,4,28,19,14,10,227,141,72,26,255,43,27,16,255,7,6,6, +85,0,72,14,10,7,71,96,49,17,255,138,71,21,255,130,67,21,255,22, +15,9,164,0,68,12,9,7,76,77,39,14,255,118,57,17,255,109,53,16, +255,22,15,9,153,0,132,11,8,6,96,103,53,20,255,144,73,21,255,121, +60,20,255,24,16,9,153,0,80,15,12,8,184,61,36,20,255,141,68,24, +255,168,82,25,255,171,84,26,255,26,18,11,159,0,68,9,7,4,57,60, +32,9,255,96,48,13,255,92,46,13,255,19,12,6,142,0,40,14,10,7, +76,129,67,26,255,190,97,29,255,180,88,27,255,26,17,11,161,0,24,14, +10,7,85,129,67,26,255,190,97,29,255,180,88,27,255,25,17,10,125,0, +8,11,8,6,57,109,60,24,255,175,86,26,255,142,73,23,255,20,14,9, +187,0,40,12,9,7,93,121,65,24,255,183,89,26,255,168,82,25,255,21, +15,10,178,0,255,0,193,10,8,5,170,39,23,8,255,78,41,11,255,16, +11,5,142,0,255,0,141,6,5,3,85,16,11,5,227,71,37,10,255,92, +47,11,255,92,47,11,255,18,12,5,85,0,8,8,6,3,28,54,29,9, +255,93,46,12,255,88,45,11,255,12,10,5,113,0,12,58,31,9,255,93, +50,12,255,88,45,11,255,25,17,6,255,8,6,3,142,0,24,4,4,3, +25,10,8,5,173,65,33,10,255,92,46,13,255,92,46,13,255,67,34,10, +255,27,18,8,255,9,7,4,156,3,3,2,85,10,8,5,184,69,35,10, +255,19,13,6,147,0,40,9,7,4,113,112,55,13,255,141,69,16,255,141, +75,16,255,18,13,5,170,0,4,8,6,3,85,110,54,13,255,143,76,16, +255,139,68,16,255,19,13,6,170,0,4,8,6,3,85,110,54,13,255,143, +76,16,255,141,72,16,255,23,15,6,170,0,12,10,9,5,110,35,21,8, +255,129,63,14,255,141,69,16,255,139,68,16,255,52,27,9,255,9,7,4, +255,27,17,8,255,135,66,16,255,154,75,17,255,155,79,18,255,91,50,16, +255,20,15,9,207,10,9,7,28,0,16,5,4,4,20,8,6,3,127,31, +20,8,255,130,66,15,255,143,76,16,255,143,76,16,255,67,34,10,255,10, +8,5,215,10,8,5,170,13,10,6,142,7,5,4,23,0,8,12,9,5, +85,115,59,14,255,149,72,16,255,143,76,16,255,18,12,5,235,0,16,7, +6,4,28,14,10,5,227,92,46,13,255,143,73,16,255,143,70,16,255,18, +13,5,170,0,12,14,10,5,170,53,28,10,255,114,56,13,255,56,29,9, +255,16,11,5,255,34,20,7,255,112,55,13,255,87,42,12,255,19,13,6, +235,8,7,5,40,0,24,10,8,5,85,114,56,13,255,143,70,16,255,141, +72,16,255,23,15,6,170,0,12,7,6,4,28,14,10,5,227,90,44,13, +255,112,57,13,255,47,26,8,255,11,8,4,57,0,12,25,16,6,227,96, +48,13,255,112,57,13,255,26,16,7,255,8,6,5,85,0,24,13,10,6, +85,8,7,5,57,0,20,6,5,3,28,15,11,6,85,9,7,4,28,0, +36,9,7,4,105,10,8,5,170,10,8,5,130,6,5,3,23,0,156,8, +6,3,136,77,39,12,255,143,73,16,255,139,74,16,255,18,12,5,170,0, +12,21,14,6,227,112,57,13,255,141,69,16,255,80,40,11,255,16,11,5, +255,14,10,5,227,18,13,5,255,72,35,11,255,136,69,15,255,130,66,15, +255,46,26,9,255,8,6,3,105,0,16,8,7,5,57,42,27,13,255,150, +79,21,255,184,94,21,255,195,99,22,255,199,106,24,255,26,18,11,255,0, +24,10,8,7,99,83,45,18,255,144,74,17,255,143,70,16,255,94,47,13, +255,18,13,5,255,16,11,5,173,14,10,5,227,52,27,9,255,132,67,15, +255,139,68,16,255,75,39,12,255,10,7,5,116,0,8,6,5,3,57,52, +27,9,255,137,73,16,255,143,76,16,255,94,47,13,255,18,13,5,255,16, +11,5,173,14,10,5,227,52,27,9,255,132,67,15,255,139,74,16,255,75, +39,12,255,10,8,5,142,0,32,8,6,5,85,22,15,7,255,102,51,13, +255,137,67,16,255,140,71,15,255,141,75,16,255,20,13,5,170,0,8,9, +6,4,85,108,55,13,255,141,69,16,255,139,74,16,255,74,36,11,255,18, +12,7,255,20,13,7,181,22,15,9,207,20,13,9,238,18,13,9,252,23, +16,10,255,31,21,12,218,14,11,7,42,0,8,7,6,4,57,40,22,9, +255,130,66,15,255,141,75,16,255,84,42,11,255,18,12,5,255,16,12,5, +181,14,10,5,241,69,35,10,255,140,69,17,255,154,78,17,255,117,60,18, +255,17,13,8,142,0,12,21,14,8,190,28,18,9,255,23,15,8,255,21, +14,8,255,21,14,8,255,23,15,8,255,38,24,11,255,98,53,17,255,151, +74,18,255,150,76,17,255,141,75,16,255,21,15,6,170,0,8,5,4,2, +28,33,20,8,255,130,66,15,255,141,72,16,255,84,42,11,255,18,12,5, +255,18,12,5,176,14,10,5,235,57,29,10,255,140,72,17,255,165,85,20, +255,121,67,24,255,14,11,7,142,0,8,8,6,5,57,72,46,23,255,198, +113,29,255,200,102,23,255,131,68,22,255,33,21,12,255,17,13,8,255,21, +14,8,255,88,47,19,255,192,99,23,255,203,113,26,255,146,87,29,255,13, +11,8,164,0,12,10,8,5,85,13,10,6,170,11,9,6,142,7,6,4, +28,0,12,13,10,8,113,18,14,9,170,16,13,9,147,10,8,7,28,0, +24,10,8,7,28,20,15,11,227,104,62,21,255,184,94,21,255,117,62,22, +255,17,12,8,227,7,5,4,28,0,64,11,8,6,170,67,35,16,255,164, +85,21,255,115,58,16,255,20,14,7,252,8,6,5,85,0,24,9,7,4, +82,66,37,13,255,145,75,18,255,154,78,17,255,115,58,16,255,29,18,8, +255,14,10,7,255,16,11,7,255,65,34,12,255,150,74,19,255,189,97,22, +255,138,79,27,255,14,12,9,142,0,8,7,6,6,57,55,33,16,255,158, +81,19,255,162,80,19,255,102,53,17,255,24,15,7,255,19,12,6,170,14, +10,5,204,46,26,9,255,137,67,16,255,139,71,16,255,49,27,10,255,7, +6,4,105,0,8,7,6,6,62,72,46,23,255,199,115,32,255,205,111,28, +255,155,84,26,255,41,24,14,255,18,13,9,255,25,16,10,255,110,61,25, +255,199,100,28,255,205,112,30,255,146,87,29,255,13,11,8,142,0,8,10, +8,7,147,180,87,25,255,206,111,27,255,203,105,26,255,164,85,27,255,40, +24,15,255,20,14,9,255,26,17,11,255,121,64,26,255,201,101,28,255,205, +112,30,255,146,87,29,255,14,11,7,142,0,8,8,6,5,57,71,44,22, +255,192,108,25,255,198,101,23,255,150,78,25,255,41,24,14,255,32,21,13, +255,74,41,21,255,184,105,27,255,202,104,25,255,202,118,27,255,174,102,31, +255,17,14,10,142,0,8,11,9,6,136,182,92,25,255,206,112,29,255,205, +111,28,255,166,79,27,255,43,25,16,255,21,15,10,255,29,19,12,255,116, +67,27,255,202,107,31,255,206,113,31,255,146,87,29,255,12,10,7,142,0, +8,11,8,6,144,185,93,26,255,202,103,23,255,157,77,18,255,83,42,12, +255,19,13,6,255,13,10,6,255,20,13,7,255,27,17,8,255,28,18,9, +227,10,8,5,45,0,8,11,9,6,142,139,73,20,255,198,96,21,255,199, +106,24,255,155,78,26,255,41,25,14,255,21,15,10,255,28,18,11,255,38, +24,15,255,40,24,15,227,14,10,7,62,0,8,8,7,5,57,65,41,20, +255,197,108,28,255,205,111,28,255,170,88,27,255,43,27,16,255,19,14,10, +255,29,19,12,255,123,66,24,255,181,84,20,255,170,87,19,255,114,60,17, +255,11,10,6,142,0,8,11,9,6,85,119,60,15,255,154,75,17,255,154, +78,17,255,18,13,7,255,0,12,13,10,8,170,191,102,30,255,209,118,30, +255,207,113,30,255,28,19,11,201,0,8,13,10,8,105,166,87,23,255,198, +101,23,255,198,97,23,255,26,18,11,255,0,40,13,10,8,170,189,100,28, +255,206,111,27,255,204,102,27,255,28,20,11,201,0,8,12,10,7,116,184, +93,27,255,206,107,27,255,203,113,26,255,23,17,10,255,0,8,6,5,5, +28,25,18,12,244,192,105,27,255,206,112,29,255,207,117,30,255,32,22,13, +170,0,8,11,9,6,88,112,57,13,255,143,70,16,255,141,69,16,255,17, +12,6,227,0,32,14,11,9,170,184,92,25,255,206,111,27,255,192,111,31, +255,49,33,18,255,10,8,7,122,0,12,7,7,6,59,22,16,11,232,167, +100,28,255,205,112,30,255,205,116,30,255,26,18,11,210,0,8,8,7,3, +85,110,54,13,255,141,69,16,255,141,75,16,255,25,16,6,255,5,4,4, +40,0,8,10,8,5,85,112,55,13,255,141,75,16,255,141,75,16,255,20, +13,5,170,0,8,5,4,2,28,33,20,8,255,130,66,15,255,141,72,16, +255,112,55,13,255,45,25,8,255,26,17,6,255,33,20,8,255,94,47,13, +255,141,69,16,255,144,71,17,255,80,40,13,255,9,7,4,125,0,8,10, +8,5,85,112,57,13,255,148,79,17,255,141,75,16,255,87,42,12,255,19, +13,6,255,14,10,5,215,15,10,6,255,60,31,11,255,143,71,18,255,160, +82,19,255,96,54,17,255,12,9,7,142,0,8,8,6,5,57,71,44,22, +255,192,100,25,255,199,106,24,255,185,93,26,255,91,50,22,255,58,33,17, +255,72,41,19,255,158,81,25,255,199,106,24,255,199,106,24,255,138,79,27, +255,13,11,8,142,0,8,10,8,7,147,166,87,23,255,203,108,24,255,202, +108,25,255,153,77,26,255,38,22,13,255,15,11,6,255,14,10,5,255,52, +28,9,255,132,70,15,255,141,75,16,255,80,41,13,255,10,8,5,139,0, +8,7,6,6,57,48,29,13,255,154,79,19,255,160,85,19,255,108,56,17, +255,30,18,9,255,16,11,7,255,24,15,9,255,96,51,17,255,167,86,20, +255,181,88,20,255,140,75,23,255,18,14,9,144,0,12,22,14,7,193,22, +13,7,255,20,13,7,255,78,40,15,255,165,81,20,255,177,90,20,255,177, +90,20,255,115,58,20,255,32,20,11,255,24,15,9,255,30,19,9,227,11, +8,6,54,0,8,11,9,6,142,139,68,20,255,166,78,19,255,144,71,17, +255,19,12,6,215,0,12,9,7,4,136,114,56,13,255,143,70,16,255,139, +68,16,255,19,13,6,170,0,8,10,7,5,85,112,55,13,255,143,70,16, +255,139,74,16,255,17,11,6,221,0,12,9,7,4,136,114,56,13,255,143, +70,16,255,141,75,16,255,20,13,5,170,0,8,9,6,4,85,110,54,13, +255,141,69,16,255,141,72,16,255,17,11,6,221,0,20,9,7,4,136,114, +56,13,255,143,73,16,255,139,74,16,255,19,13,6,170,0,8,8,6,3, +85,110,54,13,255,143,76,16,255,141,69,16,255,18,12,5,252,0,12,11, +9,6,170,131,69,18,255,170,87,19,255,168,86,19,255,28,19,9,170,0, +8,11,8,6,85,145,74,26,255,204,102,27,255,203,105,26,255,52,33,17, +255,6,5,5,57,0,8,17,14,10,227,190,107,25,255,204,113,25,255,174, +86,27,255,18,13,9,170,0,12,28,18,11,198,37,23,14,255,32,21,13, +255,21,15,10,255,20,14,9,255,38,23,11,255,87,44,12,255,137,70,16, +255,141,72,16,255,143,70,16,255,141,72,16,255,18,12,5,170,0,8,9, +6,4,85,110,54,13,255,145,74,16,255,141,69,16,255,94,47,13,255,27, +17,8,227,12,8,5,28,0,8,14,10,7,85,121,62,18,255,172,87,19, +255,139,69,18,255,20,15,9,227,0,36,21,14,8,227,117,61,24,255,199, +100,28,255,205,106,26,255,204,110,27,255,26,18,11,255,0,16,8,7,5, +28,20,15,11,227,135,73,22,255,192,97,21,255,165,83,22,255,33,22,12, +255,10,9,7,85,0,68,11,9,6,170,184,97,27,255,206,112,29,255,204, +110,27,255,28,19,11,255,0,68,14,11,7,170,179,93,24,255,202,103,23, +255,198,97,23,255,22,15,9,255,0,132,9,7,6,170,125,63,18,255,158, +77,17,255,146,75,17,255,17,12,6,255,0,76,8,6,5,76,72,46,23, +255,197,108,28,255,201,107,24,255,164,85,27,255,37,22,14,227,13,9,6, +48,0,68,12,9,7,170,138,67,19,255,170,79,19,255,168,86,19,255,20, +14,9,255,0,40,8,7,5,20,21,15,10,184,26,17,11,255,26,17,11, +215,12,9,7,74,0,24,8,7,5,20,21,15,10,184,26,17,11,255,31, +21,12,207,18,13,9,28,0,8,11,9,8,156,184,93,27,255,208,105,29, +255,205,111,28,255,28,19,11,255,0,40,14,11,7,170,184,92,25,255,203, +104,24,255,200,98,23,255,26,18,11,255,0,255,0,189,8,7,5,57,51, +29,12,255,152,75,19,255,162,86,19,255,19,13,8,246,0,255,0,137,6, +5,3,28,19,13,6,249,92,46,13,255,123,63,14,255,78,39,11,255,21, +15,6,227,9,8,4,28,0,8,9,8,4,85,110,59,13,255,141,69,16, +255,141,75,16,255,21,14,6,170,0,12,16,11,5,170,52,28,9,255,115, +59,14,255,116,60,15,255,43,26,10,255,9,7,6,125,0,16,8,7,5, +28,21,17,10,227,109,59,18,255,160,82,19,255,121,64,18,255,62,34,13, +255,94,53,17,255,149,78,20,255,102,54,19,255,32,22,11,255,72,39,15, +255,121,62,18,255,24,17,9,187,0,40,8,6,3,167,128,66,15,255,161, +85,17,255,159,81,18,255,24,15,7,178,0,4,6,5,3,37,48,28,11, +255,173,92,20,255,181,96,20,255,21,15,8,221,0,4,6,5,3,28,40, +24,9,255,143,74,18,255,158,80,17,255,21,15,6,181,0,8,10,8,5, +54,107,51,14,255,157,83,18,255,164,84,19,255,176,89,19,255,189,92,20, +255,191,98,22,255,190,106,23,255,197,110,26,255,203,108,24,255,203,117,24, +255,205,119,26,255,207,122,30,255,199,118,32,255,32,23,13,170,0,12,7, +6,4,85,22,15,7,232,113,54,14,255,146,75,17,255,158,80,17,255,154, +78,17,255,158,80,17,255,148,76,17,255,139,71,16,255,135,66,16,255,135, +66,16,255,21,14,6,136,0,8,10,8,5,85,128,66,15,255,161,85,17, +255,158,80,17,255,25,16,6,204,0,12,7,6,4,28,25,16,8,227,102, +50,15,255,148,76,17,255,142,73,17,255,84,45,13,255,10,8,5,113,0, +8,9,7,4,82,107,53,14,255,146,75,17,255,84,41,13,255,8,7,5, +198,3,2,2,23,5,4,4,136,38,23,9,255,136,70,17,255,140,72,17, +255,21,15,6,178,0,24,7,6,4,57,45,26,10,255,143,74,18,255,158, +80,17,255,26,17,6,170,0,12,24,16,7,227,115,58,16,255,148,76,17, +255,46,26,9,255,7,6,4,156,0,16,5,4,4,71,19,13,6,255,139, +71,16,255,140,72,17,255,43,26,10,255,9,8,4,85,0,16,14,10,5, +85,109,52,14,255,38,23,9,255,6,5,3,85,0,12,4,4,3,28,15, +12,6,227,115,56,16,255,29,19,8,170,0,32,13,10,6,113,122,64,21, +255,164,85,21,255,138,71,17,255,21,15,6,161,0,156,13,10,6,227,137, +67,16,255,154,75,17,255,84,45,13,255,10,8,5,116,0,8,9,7,4, +85,111,55,14,255,158,87,17,255,158,80,17,255,19,13,6,255,4,4,3, +28,0,4,3,3,2,113,17,12,6,255,139,71,16,255,161,85,17,255,146, +75,17,255,20,14,7,210,0,16,16,13,9,110,184,105,27,255,209,123,30, +255,210,124,31,255,208,123,31,255,207,122,30,255,27,20,12,255,0,24,13, +11,8,147,143,75,20,255,161,85,17,255,158,80,17,255,27,18,8,227,5, +4,2,28,0,8,10,7,5,198,131,65,16,255,161,85,17,255,150,76,17, +255,21,14,6,170,0,8,10,8,5,85,123,61,16,255,163,83,18,255,158, +80,17,255,27,18,8,227,5,4,2,28,0,8,9,7,4,198,130,66,15, +255,163,83,18,255,148,76,17,255,21,14,6,193,0,28,7,6,4,85,22, +15,7,255,131,65,16,255,154,78,17,255,154,78,17,255,154,78,17,255,154, +78,17,255,21,15,6,170,0,8,10,8,5,85,129,64,16,255,163,86,18, +255,180,91,19,255,29,20,10,255,3,3,2,93,0,36,10,8,5,122,121, +60,16,255,161,85,17,255,159,81,18,255,24,15,7,255,4,4,3,34,0, +4,2,2,1,6,17,13,8,181,181,93,22,255,203,108,24,255,205,114,26, +255,32,23,13,210,0,36,5,4,4,161,30,22,13,255,198,116,29,255,206, +106,25,255,191,96,20,255,26,17,7,170,0,8,9,7,4,85,116,60,15, +255,161,85,17,255,158,80,17,255,21,14,6,255,5,4,2,28,0,4,2, +2,1,3,12,9,7,215,190,107,25,255,211,124,30,255,208,134,37,255,32, +22,13,178,0,8,13,11,8,96,187,112,32,255,209,123,30,255,191,96,20, +255,28,19,9,255,4,3,3,74,0,4,3,2,2,28,13,10,8,227,196, +120,31,255,211,124,30,255,199,106,24,255,27,19,10,170,0,8,13,10,6, +57,114,61,19,255,178,91,21,255,182,102,23,255,23,17,10,173,0,8,11, +9,6,91,146,85,25,255,198,113,29,255,196,120,31,255,27,20,12,207,0, +20,5,5,4,28,21,17,12,227,190,118,33,255,209,131,40,255,161,100,34, +255,17,14,10,227,5,5,4,28,0,72,9,8,6,170,91,59,28,255,189, +94,24,255,162,83,19,255,39,25,12,255,7,7,6,85,0,20,13,11,8, +142,183,103,24,255,203,112,24,255,203,112,24,255,42,26,13,249,5,4,4, +62,0,4,3,2,2,25,12,9,7,227,195,115,30,255,212,127,35,255,211, +132,38,255,32,22,13,181,0,8,12,10,7,85,124,65,17,255,161,85,17, +255,159,78,18,255,21,14,6,255,5,4,2,28,0,8,7,6,4,224,133, +68,16,255,159,81,18,255,146,72,17,255,22,14,7,170,0,8,13,11,8, +91,185,111,32,255,210,125,33,255,205,114,26,255,37,26,14,255,4,4,3, +85,0,4,4,4,4,28,13,10,8,227,193,105,26,255,206,111,27,255,202, +118,27,255,32,22,13,170,0,8,11,9,6,127,174,91,23,255,202,102,21, +255,200,105,21,255,36,23,13,255,4,4,3,85,0,4,3,3,2,28,13, +11,8,227,198,118,33,255,212,127,35,255,208,128,33,255,31,22,12,181,0, +8,13,11,8,91,185,114,30,255,211,124,30,255,208,122,29,255,34,24,13, +255,4,4,3,85,0,4,7,6,6,113,32,24,13,255,185,95,22,255,202, +98,21,255,198,97,23,255,33,22,12,170,0,8,10,8,7,156,190,108,27, +255,212,126,33,255,211,127,36,255,40,26,15,255,4,4,3,85,0,4,3, +3,2,28,13,11,8,227,198,118,33,255,214,129,37,255,211,132,38,255,32, +23,13,173,0,8,10,8,7,144,167,87,22,255,185,94,20,255,165,87,18, +255,25,17,8,255,3,3,2,57,0,28,13,11,8,170,195,112,30,255,210, +125,33,255,208,117,29,255,39,26,14,255,4,4,3,85,0,28,12,10,7, +150,184,108,27,255,211,124,30,255,211,127,36,255,40,27,15,255,4,4,3, +85,0,4,3,3,2,28,17,13,8,178,138,71,17,255,161,85,17,255,155, +79,18,255,21,14,6,170,0,8,10,8,5,85,124,61,15,255,169,89,18, +255,180,91,19,255,25,18,10,255,0,12,13,11,8,170,196,113,31,255,211, +124,30,255,205,119,26,255,26,18,11,204,0,8,11,9,6,88,134,70,19, +255,173,87,18,255,168,86,19,255,20,13,7,255,0,40,13,11,8,170,196, +113,31,255,210,125,33,255,207,122,30,255,24,18,11,212,0,8,11,9,6, +119,180,93,23,255,203,108,24,255,202,103,23,255,20,15,9,255,0,8,15, +13,10,195,101,63,26,255,202,117,25,255,206,128,35,255,160,106,35,255,15, +13,10,142,0,8,10,8,5,147,139,70,20,255,191,96,20,255,200,105,21, +255,25,18,10,255,0,32,13,10,8,170,189,99,26,255,206,115,27,255,205, +106,26,255,185,106,28,255,79,52,26,255,10,9,7,122,0,4,7,6,6, +42,36,27,17,244,172,106,35,255,207,128,34,255,211,126,34,255,211,127,36, +255,24,18,11,227,0,8,10,8,5,85,124,64,15,255,159,81,18,255,158, +80,17,255,76,40,13,255,11,8,6,210,0,8,12,9,5,85,129,64,16, +255,161,85,17,255,158,80,17,255,26,16,7,170,0,8,9,7,4,85,115, +56,16,255,161,85,17,255,159,81,18,255,49,27,10,255,7,6,4,170,5, +4,4,85,6,5,3,113,26,19,11,255,185,95,22,255,202,102,21,255,197, +104,22,255,28,20,11,173,0,8,13,10,6,102,167,87,22,255,200,101,21, +255,201,102,22,255,32,21,11,255,4,3,3,65,0,4,2,2,1,17,12, +10,7,221,190,98,23,255,208,116,27,255,204,110,27,255,30,21,11,181,0, +8,13,11,8,91,185,114,30,255,211,124,30,255,209,123,30,255,86,55,25, +255,9,8,6,187,6,6,5,85,7,6,6,130,32,24,15,255,200,122,31, +255,209,123,30,255,206,122,31,255,32,23,13,173,0,8,10,8,7,144,191, +113,30,255,212,127,35,255,210,126,35,255,40,27,15,255,4,4,3,85,0, +4,2,2,1,8,11,9,6,212,157,81,20,255,189,92,20,255,190,97,21, +255,27,19,10,178,0,8,12,10,7,96,183,105,28,255,209,123,30,255,205, +114,26,255,36,24,13,255,4,4,3,85,0,4,4,4,4,28,18,14,9, +187,195,115,30,255,211,124,30,255,210,130,35,255,35,26,14,210,0,20,3, +2,2,28,12,10,7,227,195,115,30,255,211,124,30,255,209,123,30,255,38, +25,15,255,4,4,3,85,0,20,13,11,8,170,194,115,31,255,209,122,28, +255,196,99,21,255,21,15,8,255,0,12,11,9,6,170,153,79,20,255,187, +91,20,255,181,96,20,255,30,20,9,178,0,8,13,10,6,96,151,79,20, +255,187,91,20,255,181,96,20,255,22,16,9,255,0,12,12,9,7,170,146, +76,19,255,167,88,18,255,158,77,17,255,23,15,6,170,0,8,10,8,5, +85,133,66,16,255,167,88,18,255,168,86,19,255,22,16,9,255,0,20,12, +9,7,170,155,80,20,255,185,94,20,255,181,96,20,255,22,16,9,221,0, +8,6,6,5,42,51,29,12,255,150,81,19,255,165,87,18,255,42,26,11, +255,5,5,4,108,0,4,5,5,4,28,18,15,11,255,195,114,28,255,207, +123,32,255,158,94,31,255,17,13,10,142,0,8,6,5,5,57,50,34,19, +255,191,111,32,255,208,117,29,255,113,73,30,255,10,10,9,227,6,6,5, +125,7,7,6,198,42,29,17,255,187,96,22,255,166,87,23,255,42,27,15, +255,8,6,5,110,0,32,5,5,4,184,21,16,8,255,106,54,15,255,154, +78,17,255,151,77,18,255,92,48,15,255,11,9,6,119,0,8,10,8,5, +93,131,69,18,255,189,92,20,255,200,105,21,255,33,22,12,255,5,4,4, +54,0,12,9,8,6,85,76,53,25,255,200,118,31,255,204,114,27,255,65, +43,22,255,6,6,5,113,0,32,4,3,3,17,14,11,9,227,195,111,28, +255,206,115,27,255,204,105,25,255,24,17,11,255,0,12,5,5,4,28,13, +10,6,227,125,66,18,255,165,84,18,255,161,85,17,255,161,85,17,255,155, +79,18,255,28,19,9,255,6,5,3,85,0,64,11,9,8,68,86,56,27, +255,204,126,33,255,210,125,33,255,30,21,13,255,0,68,13,11,8,170,195, +115,30,255,209,123,30,255,207,122,30,255,27,19,12,255,3,3,2,28,0, +128,7,6,4,184,131,65,16,255,161,85,17,255,154,78,17,255,15,11,6, +249,0,76,10,8,7,173,166,87,23,255,198,104,21,255,196,99,21,255,35, +23,12,255,3,3,2,85,0,72,13,11,8,170,194,115,31,255,211,124,30, +255,207,122,30,255,27,19,12,255,3,3,2,28,0,108,13,11,8,170,196, +113,31,255,213,132,36,255,211,127,36,255,30,21,13,255,0,40,11,9,6, +170,155,80,20,255,185,94,20,255,180,91,19,255,21,15,8,255,0,255,0, +189,10,8,7,184,183,100,26,255,208,116,27,255,204,114,27,255,26,18,11, +255,4,4,4,28,0,255,0,133,10,8,5,127,119,60,15,255,160,85,19, +255,91,48,16,255,10,8,5,227,4,4,3,28,0,12,9,7,4,161,131, +67,16,255,159,81,18,255,159,78,18,255,18,13,7,249,0,16,7,6,4, +170,57,34,14,255,176,90,21,255,195,95,22,255,26,19,11,232,0,16,17, +14,10,99,179,106,28,255,207,122,30,255,180,109,33,255,25,20,12,255,7, +6,6,170,20,17,11,255,196,114,27,255,208,117,29,255,203,124,30,255,172, +106,35,255,53,36,20,255,10,9,7,108,0,40,9,8,6,170,159,82,20, +255,202,103,23,255,206,111,27,255,22,17,11,255,0,8,10,9,7,139,115, +74,30,255,213,133,48,255,39,28,16,255,0,8,9,8,4,113,67,39,14, +255,181,92,20,255,24,18,9,255,0,12,28,19,9,227,139,79,26,255,206, +117,31,255,212,123,37,255,214,126,41,255,172,106,35,255,53,34,18,255,122, +78,31,255,211,127,44,255,217,136,50,255,216,135,49,255,190,122,41,255,65, +43,22,255,14,11,7,85,0,8,7,6,4,28,29,21,10,249,153,79,20, +255,174,85,19,255,103,53,16,255,17,12,6,244,19,13,6,170,21,14,6, +170,27,17,6,170,21,14,6,212,21,14,6,255,25,17,6,224,12,9,5, +45,0,12,24,16,7,153,22,15,7,255,26,16,7,210,12,9,5,40,0, +8,8,7,5,28,17,13,8,227,114,61,19,255,174,85,19,255,154,79,19, +255,60,33,13,255,11,9,6,170,0,12,10,8,5,170,146,79,19,255,180, +87,19,255,67,39,14,255,8,6,5,85,0,8,24,17,9,255,143,75,20, +255,162,80,19,255,22,15,7,215,0,28,8,7,5,110,60,33,13,255,166, +78,19,255,22,15,7,227,0,8,7,6,4,85,91,51,16,255,174,88,19, +255,169,78,18,255,25,17,8,255,3,3,2,8,0,20,11,9,6,178,143, +74,18,255,177,89,18,255,138,75,19,255,18,13,7,176,0,16,9,7,4, +28,29,19,8,232,41,25,10,255,17,13,8,255,9,8,6,116,0,4,7, +6,4,59,14,11,7,227,32,21,9,255,40,24,9,255,12,9,5,105,0, +32,14,11,9,170,199,124,36,255,213,119,36,255,202,102,21,255,20,14,7, +246,0,152,8,7,5,142,53,31,12,255,162,86,19,255,121,64,18,255,19, +14,8,252,6,5,3,28,0,8,10,8,5,125,142,74,19,255,180,91,19, +255,183,89,19,255,19,14,8,255,0,4,5,5,4,6,15,13,10,193,69, +42,18,255,171,91,20,255,189,88,20,255,200,101,21,255,31,21,12,255,0, +16,10,8,7,28,30,21,13,227,150,92,35,255,208,121,37,255,211,115,30, +255,208,117,29,255,28,21,13,255,0,24,10,8,7,28,22,15,7,198,26, +17,7,255,24,15,7,221,9,7,4,57,0,12,8,7,5,156,171,89,22, +255,202,107,23,255,202,103,23,255,23,18,10,249,0,12,26,18,9,198,29, +19,8,255,24,16,7,215,10,8,5,51,0,12,10,8,5,85,134,70,19, +255,175,88,18,255,173,87,18,255,20,14,7,255,0,24,10,8,5,85,26, +19,9,255,107,58,18,255,154,83,19,255,168,79,19,255,169,78,18,255,173, +87,18,255,172,80,19,255,26,17,7,170,0,8,11,10,8,136,189,99,26, +255,210,115,31,255,216,129,45,255,143,96,40,255,15,13,10,227,12,12,11, +170,15,13,12,170,13,12,10,170,13,12,10,136,9,8,8,85,0,16,11, +9,6,170,169,91,22,255,202,103,23,255,203,108,24,255,18,15,9,255,0, +12,6,5,5,23,28,19,11,156,31,22,12,255,34,24,13,227,14,11,7, +85,0,36,9,8,8,142,72,54,31,255,215,147,60,255,218,146,61,255,174, +100,35,255,14,11,7,142,0,8,11,8,6,102,142,74,19,255,185,86,20, +255,195,98,20,255,18,14,9,249,0,12,10,8,7,170,202,131,47,255,220, +152,63,255,220,151,61,255,22,19,13,252,0,8,11,9,8,167,203,135,46, +255,217,139,48,255,210,120,33,255,18,14,9,255,0,12,9,8,6,170,198, +117,37,255,211,115,30,255,202,102,21,255,34,22,11,176,0,8,13,11,8, +170,202,122,37,255,218,144,49,255,217,144,50,255,28,21,13,255,0,8,12, +11,9,170,204,122,41,255,217,135,46,255,215,136,42,255,46,33,19,255,0, +16,10,9,7,28,21,19,14,227,153,104,46,255,214,149,55,255,158,103,39, +255,16,14,11,221,7,6,6,28,0,20,20,18,13,142,31,26,18,170,25, +21,16,170,24,20,15,170,24,20,15,170,24,20,15,170,24,21,15,170,31, +26,18,170,25,21,16,170,14,12,9,31,0,20,10,9,7,167,75,51,26, +255,202,117,33,255,186,120,43,255,41,32,20,255,12,11,9,85,0,16,11, +9,8,28,31,22,12,215,49,33,18,255,41,27,16,227,12,10,7,85,0, +12,14,12,9,170,204,137,51,255,220,152,63,255,220,151,61,255,23,19,12, +252,0,8,11,10,6,85,136,70,17,255,175,88,18,255,169,78,18,255,15, +11,6,255,0,8,9,8,6,85,26,19,9,255,153,82,18,255,177,89,18, +255,180,84,19,255,24,17,9,218,0,8,11,9,8,147,196,115,35,255,215, +125,38,255,214,125,39,255,20,16,11,255,0,12,9,8,6,159,165,86,22, +255,197,99,20,255,195,90,20,255,32,21,11,170,0,8,12,10,7,85,145, +76,20,255,189,92,20,255,191,96,20,255,18,14,9,255,0,12,9,8,6, +170,199,126,39,255,217,133,50,255,217,144,50,255,23,18,12,252,0,8,11, +10,8,142,191,105,28,255,206,111,27,255,203,104,24,255,19,15,10,255,0, +12,9,8,6,57,21,15,8,198,28,19,9,255,32,21,11,227,11,9,6, +76,0,8,11,9,8,170,203,125,42,255,220,146,59,255,219,146,60,255,24, +19,13,255,0,12,11,10,8,170,204,136,47,255,220,146,59,255,218,147,55, +255,25,19,12,232,0,8,11,10,8,119,161,87,22,255,195,98,20,255,202, +103,23,255,18,15,9,255,0,32,14,12,9,170,200,125,37,255,214,124,37, +255,205,106,26,255,20,16,9,221,0,32,16,13,9,170,205,130,42,255,219, +144,56,255,219,146,60,255,24,19,13,255,0,12,6,5,3,23,21,14,6, +170,26,16,7,255,26,17,7,224,14,10,5,31,0,8,11,9,6,125,170, +89,23,255,211,115,30,255,214,126,41,255,23,19,12,255,0,12,11,10,8, +170,195,112,30,255,206,106,25,255,200,105,21,255,29,20,10,170,0,8,11, +9,6,85,134,70,19,255,177,85,18,255,172,80,19,255,18,13,7,255,0, +40,14,12,9,170,195,112,30,255,206,111,27,255,202,103,23,255,31,22,10, +170,0,8,13,10,6,85,151,79,20,255,189,92,20,255,183,89,19,255,17, +13,8,255,0,4,8,7,5,59,57,34,16,255,184,97,27,255,198,115,33, +255,114,77,33,255,16,14,11,210,6,5,5,8,0,8,12,10,7,170,195, +113,32,255,215,123,42,255,217,133,50,255,32,24,15,255,0,32,12,11,7, +170,175,90,22,255,198,104,21,255,189,92,20,255,192,97,21,255,189,97,22, +255,45,29,14,255,10,9,7,210,22,17,11,255,183,102,30,255,212,121,41, +255,216,135,49,255,217,137,52,255,214,125,39,255,29,21,12,204,0,8,11, +9,6,85,143,75,20,255,193,97,20,255,195,98,20,255,180,93,23,255,88, +54,23,255,11,10,8,113,0,4,14,12,7,85,170,89,23,255,202,103,23, +255,202,102,21,255,32,22,11,178,0,8,12,10,7,113,176,91,23,255,205, +105,24,255,209,117,28,255,39,28,16,255,5,5,5,28,0,8,15,14,10, +198,206,132,45,255,217,133,50,255,215,133,44,255,25,19,12,232,0,8,11, +10,8,125,198,118,39,255,218,145,51,255,218,146,53,255,20,17,11,255,0, +12,9,8,6,170,198,124,37,255,216,134,45,255,214,139,41,255,22,18,11, +255,0,8,11,10,8,136,191,105,28,255,206,111,27,255,206,106,25,255,36, +26,15,255,5,5,4,28,0,8,15,13,10,198,192,105,27,255,206,106,25, +255,204,105,25,255,23,17,10,232,0,8,12,10,7,125,196,119,37,255,218, +141,51,255,218,139,55,255,20,16,11,255,0,12,9,8,6,170,196,110,33, +255,215,126,40,255,214,125,39,255,23,18,12,252,0,8,11,9,8,167,201, +123,40,255,217,133,50,255,214,136,43,255,20,16,11,255,0,12,6,5,5, +23,29,21,12,153,32,22,13,255,35,25,14,227,15,12,8,85,0,24,12, +10,9,170,198,124,37,255,215,125,38,255,213,124,38,255,23,18,12,255,0, +24,14,12,9,170,204,132,47,255,219,144,56,255,211,127,36,255,28,21,13, +255,0,12,14,12,9,170,198,117,37,255,215,123,42,255,214,125,39,255,25, +20,12,215,0,8,11,10,8,130,198,119,35,255,215,126,40,255,212,123,37, +255,30,22,13,255,0,12,14,12,9,170,196,114,33,255,206,106,25,255,200, +105,21,255,30,21,11,184,0,8,13,11,8,99,184,100,25,255,209,117,28, +255,210,115,31,255,28,21,13,255,0,20,14,12,9,170,198,117,37,255,215, +126,40,255,214,126,41,255,25,19,12,255,0,12,10,9,7,125,61,42,22, +255,190,107,33,255,153,98,38,255,29,23,16,255,13,12,10,255,17,15,10, +255,108,74,37,255,210,144,59,255,153,98,38,255,16,14,11,224,6,6,5, +17,0,12,15,13,8,227,115,67,24,255,197,100,22,255,150,81,25,255,32, +24,13,255,15,13,8,255,19,15,10,255,85,48,18,255,178,95,21,255,115, +65,20,255,15,12,8,255,5,5,4,34,0,32,10,9,7,198,69,46,22, +255,186,103,29,255,195,111,28,255,92,58,25,255,15,12,8,198,0,12,10, +9,7,170,194,112,31,255,215,125,38,255,218,146,53,255,24,19,13,255,0, +20,15,14,10,227,159,103,42,255,212,127,43,255,177,118,48,255,19,17,12, +227,6,6,5,28,0,32,11,10,8,170,182,98,23,255,202,106,21,255,195, +98,20,255,24,17,9,212,0,12,18,14,9,227,102,54,19,255,157,83,18, +255,85,46,14,255,19,13,6,255,47,27,10,255,150,81,19,255,131,67,20, +255,39,26,14,255,12,11,9,85,0,64,10,9,7,170,118,75,33,255,215, +141,54,255,44,33,19,255,0,16,9,9,8,108,19,17,12,170,27,23,16, +170,23,21,16,170,23,21,16,170,24,20,15,170,20,18,13,170,15,14,10, +170,10,9,7,113,7,6,6,28,0,12,12,11,9,170,189,99,26,255,209, +110,30,255,211,118,36,255,141,88,36,255,19,17,12,227,20,18,13,170,24, +20,15,170,21,19,14,170,16,14,11,170,10,9,7,113,6,6,5,28,0, +20,8,7,5,65,11,10,8,142,16,14,11,170,24,21,15,170,25,22,16, +170,23,21,16,170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6, +28,0,20,8,7,5,62,10,9,5,136,12,10,7,170,14,11,7,170,13, +10,6,170,11,9,6,198,31,21,10,255,153,82,18,255,177,85,18,255,169, +78,18,255,22,15,7,204,0,16,8,7,5,57,11,10,6,142,19,17,12, +170,23,21,16,170,25,22,16,170,23,21,16,170,21,19,14,170,15,14,10, +170,10,10,9,113,7,6,6,28,0,16,12,10,7,153,55,32,14,255,175, +93,20,255,185,94,20,255,183,89,19,255,80,44,17,255,13,11,8,187,7, +6,6,25,0,16,8,7,5,62,11,10,6,142,16,14,11,170,23,19,14, +170,25,22,16,170,23,21,16,170,19,17,12,170,15,14,10,170,17,15,10, +170,19,17,12,142,9,8,8,28,0,8,12,10,9,170,204,137,49,255,220, +146,59,255,218,146,53,255,141,91,38,255,19,17,12,227,19,17,12,170,24, +20,15,170,21,19,14,170,15,14,10,170,10,10,9,113,7,6,6,28,0, +16,12,10,7,57,14,12,7,102,14,11,7,85,0,32,12,10,7,57,13, +11,8,105,15,13,8,85,0,12,12,11,9,170,204,136,47,255,220,146,59, +255,218,153,59,255,24,19,13,255,0,12,8,7,5,82,11,10,6,156,11, +9,6,170,10,9,7,91,0,12,10,8,5,127,144,78,19,255,180,87,19, +255,174,81,19,255,24,15,7,210,0,12,14,11,7,68,12,10,7,170,12, +10,7,170,17,15,10,170,24,20,15,170,19,17,12,170,15,14,10,170,18, +15,11,170,24,21,15,170,21,19,14,170,15,14,10,170,11,10,8,113,7, +7,6,28,0,16,15,13,10,119,17,15,12,170,15,13,10,170,16,14,11, +170,19,17,12,170,21,18,12,170,18,15,11,170,15,13,8,170,11,9,6, +170,10,8,7,88,6,5,5,23,0,20,10,9,7,85,14,12,9,170,19, +17,12,170,21,19,14,170,21,19,14,170,21,19,14,170,19,17,12,170,15, +14,10,170,11,10,8,116,7,7,6,28,0,16,15,14,10,119,18,15,11, +170,15,14,10,170,18,15,11,170,21,19,14,170,25,22,16,170,23,21,16, +170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6,28,0,20,10, +9,7,85,14,12,9,170,19,17,12,170,20,18,13,170,20,18,13,170,23, +19,14,170,19,17,12,170,15,14,10,170,17,14,10,170,19,17,12,142,10, +9,7,28,0,12,15,13,10,113,18,15,11,170,15,14,10,170,18,15,11, +170,21,19,14,170,25,22,16,170,23,21,16,170,20,18,13,170,16,14,11, +170,11,10,8,113,7,7,6,28,0,20,7,7,6,82,11,10,6,142,16, +13,9,170,19,17,12,170,21,19,14,170,24,21,15,170,25,22,16,170,25, +22,16,170,15,13,10,170,12,11,9,57,0,16,15,13,10,170,97,65,34, +255,209,132,42,255,214,136,43,255,214,127,43,255,159,103,42,255,21,19,14, +227,11,10,8,28,0,12,16,14,11,113,21,19,14,170,18,15,11,153,11, +10,8,28,0,16,15,14,10,125,21,19,14,170,19,17,12,142,10,9,7, +28,0,12,15,14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0, +16,15,13,10,125,21,19,14,170,19,17,12,142,10,9,7,28,0,12,15, +14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0,24,15,14,10, +125,21,19,14,170,19,17,12,142,9,9,8,28,0,12,17,14,10,130,27, +24,16,170,21,19,14,142,10,9,7,28,0,16,16,14,11,113,28,24,17, +170,24,21,15,161,12,11,9,28,0,12,16,14,11,113,21,19,14,170,18, +15,11,153,11,10,8,28,0,16,15,13,10,125,21,19,14,170,19,17,12, +142,9,8,6,28,0,12,18,15,11,136,19,16,10,170,16,13,9,170,16, +14,9,170,15,13,8,170,13,11,8,170,12,11,9,170,13,12,8,170,15, +14,10,170,14,13,11,170,11,11,10,113,0,20,13,11,8,170,190,98,23, +255,204,116,31,255,74,52,27,255,9,8,8,113,0,16,13,11,8,170,192, +106,29,255,208,112,27,255,208,117,29,255,27,21,12,255,0,16,5,5,4, +28,27,23,16,255,199,121,44,255,214,139,41,255,31,23,14,255,0,16,13, +11,8,28,32,24,13,227,36,26,15,255,19,16,12,198,8,8,7,51,0, +4,8,8,7,57,29,21,12,218,48,32,17,255,45,30,16,255,20,16,11, +218,10,9,7,105,0,44,14,12,9,170,204,130,51,255,224,153,77,255,225, +169,88,255,33,27,18,255,0,12,21,19,14,215,217,163,86,255,61,46,28, +255,0,12,19,16,12,201,203,121,40,255,51,38,22,255,0,12,4,4,3, +25,16,14,11,227,212,147,71,255,224,160,77,255,223,161,80,255,31,25,16, +255,4,4,4,102,10,10,9,215,206,133,55,255,223,156,70,255,224,164,85, +255,51,39,24,255,5,5,4,82,0,12,15,12,8,110,178,98,27,255,211, +115,30,255,211,121,34,255,36,26,15,255,3,3,2,85,0,60,8,8,5, +28,27,20,10,232,125,73,22,255,190,97,21,255,180,92,21,255,97,56,20, +255,14,11,7,170,0,16,12,10,7,142,165,89,22,255,198,104,21,255,84, +50,19,255,7,6,4,159,0,4,5,5,4,82,32,23,11,255,121,69,22, +255,97,56,20,255,15,13,8,142,0,32,14,12,7,198,172,92,21,255,28, +19,9,207,0,8,11,10,6,85,148,78,21,255,198,104,21,255,192,97,21, +255,21,15,8,255,0,24,10,9,5,170,167,90,22,255,202,93,21,255,202, +103,23,255,21,16,10,255,0,20,4,3,3,133,20,16,9,255,151,80,22, +255,75,42,16,255,10,8,7,255,32,22,11,255,164,86,23,255,60,39,17, +255,5,5,4,252,0,36,12,11,9,198,213,155,80,255,224,166,83,255,211, +121,34,255,20,16,9,255,3,3,2,28,0,144,6,6,5,51,27,20,10, +255,160,84,23,255,198,104,21,255,67,40,16,255,8,7,5,125,0,12,12, +10,9,170,195,112,30,255,215,125,38,255,217,133,50,255,49,35,22,255,5, +5,4,133,13,12,10,210,189,119,50,255,211,127,44,255,212,121,41,255,218, +135,53,255,220,148,63,255,34,27,17,255,0,20,4,4,4,17,13,12,10, +227,196,113,31,255,212,118,35,255,214,123,43,255,33,26,16,255,0,56,12, +11,9,187,208,134,55,255,223,146,70,255,221,152,70,255,34,26,17,255,0, +40,8,7,5,164,165,86,22,255,202,98,21,255,198,96,21,255,22,16,9, +255,0,20,8,8,5,85,32,22,11,255,167,87,22,255,160,84,23,255,93, +54,20,255,120,65,21,255,188,96,21,255,196,99,21,255,200,105,21,255,24, +19,11,207,0,8,15,14,10,110,208,152,71,255,227,174,98,255,228,179,103, +255,225,176,98,255,217,169,94,255,213,166,92,255,215,167,92,255,213,155,80, +255,204,136,55,255,138,89,37,255,25,22,16,227,9,9,8,28,0,8,11, +10,8,170,203,129,50,255,223,149,70,255,222,158,75,255,31,25,16,255,4, +4,4,28,0,60,8,8,7,57,49,40,26,255,206,152,83,255,224,169,91, +255,194,140,71,255,31,27,20,255,9,8,8,28,0,8,12,10,9,161,196, +110,33,255,218,130,51,255,222,158,75,255,31,25,16,255,4,4,4,28,0, +8,11,10,8,198,213,160,84,255,228,180,105,255,227,175,100,255,33,28,18, +207,0,8,12,11,9,130,210,155,77,255,228,169,99,255,226,172,95,255,30, +25,17,255,4,4,4,28,0,8,11,10,8,198,204,129,49,255,214,127,43, +255,213,125,40,255,23,19,12,232,0,8,14,13,9,125,208,152,71,255,223, +159,76,255,218,153,59,255,33,26,16,210,0,8,13,12,10,127,198,118,39, +255,215,127,42,255,213,126,42,255,41,31,18,227,0,12,6,6,5,28,25, +21,16,227,204,150,79,255,223,171,98,255,175,122,60,255,18,15,11,218,5, +4,4,17,0,20,20,18,13,85,177,101,34,255,204,123,37,255,199,117,36, +255,199,117,36,255,202,122,37,255,199,117,36,255,198,114,31,255,198,110,31, +255,202,118,35,255,46,33,21,170,0,24,10,9,7,153,110,78,37,255,213, +162,82,255,218,164,87,255,67,51,30,255,9,8,8,85,0,40,6,5,5, +28,21,19,14,255,217,166,92,255,227,175,100,255,224,169,91,255,31,25,16, +215,0,8,12,10,7,85,154,80,21,255,197,99,20,255,192,97,21,255,28, +20,9,255,4,3,3,110,11,9,6,170,117,63,20,255,184,94,21,255,198, +104,21,255,203,104,24,255,210,122,37,255,21,17,12,252,0,8,10,9,7, +161,203,129,50,255,224,160,77,255,225,169,88,255,30,25,17,255,4,4,4, +28,0,8,8,7,5,190,165,86,22,255,198,104,21,255,196,99,21,255,28, +19,9,170,0,8,13,11,8,85,176,91,23,255,208,112,27,255,210,121,35, +255,27,22,14,255,4,4,4,28,0,8,11,10,8,198,211,149,76,255,224, +168,87,255,224,162,81,255,32,26,17,210,0,8,12,10,7,113,176,91,23, +255,202,107,23,255,202,95,23,255,20,16,9,255,0,40,15,13,10,170,213, +160,84,255,228,180,105,255,227,174,98,255,33,26,18,255,0,12,15,13,10, +170,213,155,80,255,226,172,95,255,224,167,85,255,23,20,14,244,0,8,11, +10,8,127,189,104,28,255,214,127,43,255,221,148,70,255,31,25,16,255,4, +4,4,28,0,28,14,12,9,170,195,113,32,255,209,117,28,255,202,103,23, +255,20,15,9,252,3,3,3,14,0,28,15,14,10,170,213,155,80,255,226, +172,95,255,221,152,70,255,28,24,15,255,0,40,14,12,9,170,208,141,61, +255,225,162,88,255,227,174,98,255,33,26,18,255,4,4,4,28,0,8,10, +8,7,198,182,98,23,255,202,103,23,255,198,104,21,255,28,19,9,170,0, +8,11,10,6,85,154,80,21,255,202,98,21,255,202,103,23,255,25,20,12, +255,0,40,12,10,7,170,186,100,23,255,202,99,23,255,200,105,21,255,30, +21,9,170,0,8,12,9,7,85,154,80,21,255,198,104,21,255,196,99,21, +255,28,20,9,255,4,4,3,113,11,10,6,227,183,100,26,255,212,127,43, +255,167,117,52,255,17,15,12,215,5,5,5,14,0,12,15,13,10,170,211, +149,76,255,224,166,83,255,223,161,80,255,34,26,17,255,0,32,10,9,7, +170,167,87,22,255,198,92,21,255,196,99,21,255,196,95,21,255,198,92,21, +255,195,99,22,255,192,106,29,255,206,127,43,255,217,141,60,255,223,146,70, +255,224,165,81,255,220,148,63,255,212,124,39,255,25,19,12,215,0,8,12, +11,9,116,196,116,37,255,218,141,51,255,218,139,55,255,218,142,61,255,215, +143,58,255,24,19,13,212,0,4,10,9,7,156,203,129,50,255,221,150,66, +255,220,148,63,255,25,21,14,227,0,8,10,10,7,159,204,134,59,255,225, +160,84,255,225,169,88,255,36,29,19,255,0,12,15,14,10,170,204,130,51, +255,220,142,59,255,218,139,55,255,21,18,12,249,0,8,11,10,8,142,206, +145,67,255,226,172,95,255,227,174,98,255,32,26,17,255,4,4,4,28,0, +8,11,10,8,198,198,117,37,255,215,125,38,255,211,122,36,255,28,21,13, +215,0,8,13,11,8,96,174,91,23,255,202,107,23,255,202,103,23,255,22, +17,9,255,0,12,11,10,6,170,176,91,23,255,202,103,23,255,203,108,24, +255,21,15,10,238,0,8,11,10,8,142,206,145,67,255,226,170,91,255,224, +160,85,255,30,24,17,255,4,4,4,28,0,8,11,10,8,198,209,149,70, +255,224,160,77,255,222,158,75,255,31,25,16,212,0,8,12,11,9,127,198, +116,35,255,215,125,38,255,211,122,36,255,28,21,13,255,4,4,4,28,0, +52,13,12,8,170,195,112,30,255,209,110,30,255,207,105,30,255,25,20,12, +255,0,24,15,14,10,170,213,158,80,255,226,172,95,255,224,164,85,255,33, +27,18,255,0,12,15,14,10,170,210,143,65,255,224,168,87,255,224,165,81, +255,25,21,14,232,0,8,10,10,9,153,208,147,67,255,224,166,83,255,222, +158,75,255,34,26,17,255,0,12,15,14,10,170,211,149,76,255,223,149,70, +255,219,146,60,255,25,20,14,235,0,8,10,10,9,150,204,134,59,255,224, +156,83,255,224,165,81,255,33,27,18,255,0,20,15,14,10,170,211,150,70, +255,226,170,91,255,226,172,95,255,33,26,18,255,0,16,9,9,8,150,101, +74,38,255,198,145,77,255,206,157,87,255,202,151,79,255,197,141,74,255,200, +146,75,255,180,126,57,255,21,19,14,227,5,5,4,28,0,16,8,7,5, +113,43,28,14,255,187,96,22,255,181,93,22,255,98,55,21,255,68,42,17, +255,77,46,18,255,129,72,22,255,174,89,21,255,83,47,18,255,11,9,6, +221,0,28,6,6,5,28,16,14,11,195,108,76,35,255,210,141,59,255,218, +162,81,255,167,118,54,255,16,14,11,221,5,5,5,14,0,12,15,13,10, +170,211,149,76,255,224,168,87,255,223,154,80,255,31,25,16,255,0,20,6, +6,5,57,34,27,17,255,203,122,36,255,208,124,41,255,109,76,34,255,13, +12,10,142,0,32,13,11,8,170,176,91,23,255,202,93,21,255,196,99,21, +255,28,19,9,170,0,8,11,9,6,85,132,71,21,255,195,99,22,255,103, +59,20,255,11,10,6,170,3,3,2,25,6,6,5,110,55,35,16,255,198, +113,29,255,212,134,51,255,41,32,20,210,0,68,21,19,14,215,217,163,86, +255,49,38,24,255,0,12,11,10,8,82,54,43,27,255,200,135,59,255,210, +137,59,255,207,131,50,255,205,127,44,255,199,117,36,255,195,111,28,255,187, +101,24,255,93,54,22,255,19,15,10,227,7,6,6,28,0,8,10,9,7, +170,195,109,32,255,218,138,53,255,224,158,81,255,223,173,95,255,219,167,94, +255,217,169,94,255,218,171,97,255,217,166,92,255,208,136,59,255,110,68,27, +255,19,15,10,227,6,6,5,28,0,12,12,11,7,170,61,42,20,255,188, +106,33,255,208,134,55,255,215,163,82,255,217,166,92,255,216,167,88,255,216, +167,89,255,211,150,70,255,146,94,39,255,26,21,15,229,9,8,6,28,0, +12,12,10,7,170,51,32,14,255,151,80,22,255,169,91,22,255,173,86,22, +255,169,88,22,255,173,86,22,255,180,92,21,255,194,98,21,255,196,95,21, +255,192,97,21,255,31,21,10,170,0,12,12,10,7,170,57,37,18,255,189, +107,34,255,212,149,67,255,217,166,92,255,217,166,92,255,218,171,97,255,215, +163,82,255,205,126,48,255,116,72,29,255,20,16,11,227,6,6,5,28,0, +8,11,9,6,68,126,68,21,255,191,98,22,255,194,98,21,255,192,97,21, +255,192,97,21,255,191,98,22,255,177,91,22,255,26,19,9,142,0,12,12, +10,7,170,58,37,17,255,185,107,30,255,208,134,55,255,216,167,88,255,218, +171,97,255,217,166,92,255,213,148,72,255,204,130,51,255,209,141,60,255,211, +159,76,255,30,25,17,170,0,8,10,10,7,167,210,155,77,255,228,178,99, +255,224,165,81,255,221,165,86,255,217,166,92,255,218,169,93,255,217,166,92, +255,214,156,81,255,206,135,51,255,116,72,29,255,20,16,11,227,6,6,5, +28,0,8,13,10,6,57,115,62,20,255,169,91,22,255,165,86,22,255,24, +18,9,167,0,24,12,10,7,88,117,63,20,255,186,100,23,255,191,107,32, +255,35,27,16,144,0,8,10,10,7,170,210,155,77,255,228,178,99,255,221, +152,70,255,24,19,13,255,0,8,12,10,7,170,58,36,15,255,157,79,22, +255,151,80,22,255,58,35,15,255,11,9,6,57,0,8,12,10,7,85,157, +81,20,255,197,99,20,255,192,97,21,255,28,20,9,170,0,8,11,9,6, +57,115,62,20,255,189,94,24,255,198,117,37,255,213,157,76,255,218,171,97, +255,217,169,94,255,214,161,85,255,213,157,76,255,212,149,67,255,208,134,55, +255,205,126,48,255,143,96,40,255,28,26,19,229,8,8,7,28,0,8,13, +12,8,85,141,74,24,255,190,94,23,255,183,95,24,255,183,95,24,255,187, +93,24,255,189,97,22,255,181,93,22,255,177,91,22,255,169,88,22,255,89, +52,20,255,21,18,12,227,9,9,8,28,0,12,18,17,13,181,103,74,40, +255,207,146,74,255,214,156,81,255,210,144,67,255,208,138,55,255,207,129,52, +255,205,133,48,255,205,126,48,255,151,101,42,255,28,26,19,232,9,8,8, +28,0,8,13,12,10,110,186,127,63,255,214,156,81,255,213,158,80,255,213, +155,80,255,214,156,81,255,214,153,75,255,213,148,72,255,213,148,72,255,211, +150,70,255,159,111,54,255,28,25,19,241,9,8,8,31,0,12,18,17,13, +181,103,74,40,255,208,156,81,255,214,156,81,255,208,138,55,255,209,137,60, +255,213,158,80,255,213,155,80,255,213,160,84,255,215,160,88,255,213,163,84, +255,30,24,17,178,0,8,12,11,9,93,178,121,53,255,213,158,80,255,210, +143,65,255,211,146,62,255,213,148,72,255,215,163,82,255,213,158,80,255,212, +149,67,255,209,141,60,255,153,106,49,255,28,25,19,235,9,9,8,31,0, +12,18,15,11,173,66,43,21,255,187,101,32,255,207,132,52,255,210,144,67, +255,213,148,72,255,214,156,81,255,216,167,88,255,214,156,81,255,176,128,65, +255,46,39,27,255,0,12,15,14,10,85,181,111,42,255,215,136,52,255,213, +125,40,255,211,122,36,255,212,123,37,255,210,123,39,255,202,122,37,255,31, +24,14,170,0,8,12,11,9,88,164,89,29,255,203,122,36,255,199,117,36, +255,30,23,15,212,0,12,15,13,10,127,187,133,62,255,213,148,72,255,208, +138,55,255,31,24,16,170,0,8,13,12,10,85,172,104,37,255,209,134,54, +255,206,135,51,255,32,25,17,212,0,12,15,13,10,127,181,116,46,255,211, +143,62,255,210,153,71,255,29,24,16,178,0,8,13,12,10,91,178,121,53, +255,213,154,70,255,208,134,55,255,31,25,16,210,0,20,15,14,10,125,179, +110,42,255,210,135,55,255,208,139,65,255,26,21,15,184,0,8,14,13,9, +85,179,117,44,255,217,165,82,255,213,163,84,255,27,23,16,221,0,12,14, +12,9,136,174,103,39,255,206,127,43,255,199,117,36,255,31,24,14,170,0, +8,12,11,9,88,164,89,29,255,202,118,35,255,196,114,33,255,29,22,14, +210,0,12,14,12,9,125,169,95,30,255,202,119,37,255,199,119,39,255,24, +19,13,190,0,8,14,12,9,85,170,95,29,255,198,113,29,255,199,116,34, +255,204,128,47,255,206,135,51,255,204,129,49,255,204,129,49,255,208,134,55, +255,211,149,76,255,192,140,73,255,95,74,39,255,17,15,12,85,0,16,14, +12,9,198,211,150,70,255,206,152,81,255,31,26,20,255,7,7,6,48,0, +16,15,13,10,170,211,149,76,255,226,170,91,255,226,172,95,255,35,28,18, +255,0,20,15,14,12,218,171,120,60,255,219,154,70,255,41,31,20,255,4, +4,3,28,0,104,17,16,12,170,219,179,116,255,232,193,137,255,232,199,135, +255,40,33,23,255,0,12,10,10,9,76,62,50,31,255,20,18,13,167,0, +12,11,10,8,76,58,46,29,255,20,18,13,167,0,16,13,12,10,170,210, +150,71,255,223,147,72,255,221,150,66,255,26,21,15,210,0,4,11,10,8, +119,211,159,84,255,229,184,114,255,230,186,123,255,30,26,19,255,0,16,12, +11,9,93,137,90,40,255,223,167,94,255,228,180,111,255,167,133,80,255,17, +16,14,227,11,11,10,170,12,11,9,170,12,11,9,170,12,11,9,119,7, +7,6,57,0,36,7,7,6,62,21,18,12,227,157,92,28,255,203,105,26, +255,197,106,26,255,82,48,21,255,14,12,7,173,5,5,4,8,0,16,8, +7,5,28,26,19,11,227,103,68,25,255,158,96,29,255,57,41,22,255,13, +12,10,241,33,26,16,255,146,88,31,255,66,47,23,255,12,10,9,201,6, +5,5,14,0,32,8,7,5,57,30,22,11,255,15,12,8,96,0,8,10, +10,7,130,190,104,27,255,209,118,30,255,211,117,34,255,27,21,14,255,0, +24,13,12,10,170,199,122,39,255,218,130,51,255,223,146,70,255,30,24,17, +255,0,12,23,22,18,139,30,27,21,170,16,15,11,255,89,59,26,255,203, +110,28,255,196,113,31,255,122,81,33,255,186,117,43,255,216,129,51,255,184, +126,57,255,38,34,25,255,24,22,19,221,33,30,24,170,15,15,12,28,0, +12,24,22,19,142,32,31,25,170,21,20,16,198,90,71,45,255,223,179,110, +255,226,172,95,255,221,150,66,255,143,100,44,255,22,21,17,227,28,27,21, +170,29,28,22,170,13,13,12,42,0,36,8,8,8,11,25,24,20,142,39, +35,28,170,30,28,23,170,29,27,22,170,29,27,22,170,29,27,22,170,29, +27,22,170,29,27,20,170,23,21,16,170,14,13,11,34,0,52,13,12,10, +159,142,86,31,255,208,116,35,255,201,119,38,255,32,26,17,255,5,5,4, +28,0,12,14,13,11,170,216,167,97,255,231,184,124,255,231,193,128,255,181, +146,92,255,52,44,33,255,90,71,45,255,201,155,88,255,223,173,102,255,228, +179,115,255,230,183,123,255,230,184,119,255,39,32,22,255,0,24,12,12,11, +170,206,139,61,255,226,164,91,255,228,174,103,255,39,32,22,255,0,48,6, +6,5,28,9,9,8,142,56,46,31,255,222,180,113,255,230,187,119,255,222, +180,113,255,23,21,16,255,0,36,15,14,12,164,79,59,30,255,209,128,42, +255,211,127,44,255,171,117,46,255,18,15,11,170,0,16,9,9,8,116,33, +28,16,255,161,94,28,255,199,107,26,255,65,40,18,255,8,7,5,255,25, +20,12,255,198,113,29,255,210,120,33,255,217,133,50,255,27,23,16,255,0, +8,7,7,6,23,34,28,19,198,46,36,25,255,39,31,22,255,41,33,22, +255,59,46,28,255,51,40,26,255,61,47,28,255,180,133,71,255,227,175,100, +255,226,175,103,255,181,143,88,255,17,16,12,142,0,8,11,11,10,170,214, +166,97,255,229,179,114,255,228,185,111,255,161,121,68,255,23,21,16,227,23, +22,18,170,22,21,17,170,16,15,13,170,11,11,8,147,8,8,7,85,0, +40,14,13,11,170,181,143,88,255,228,185,123,255,218,168,97,255,70,54,35, +255,9,9,8,113,0,12,11,10,8,85,120,87,45,255,223,183,120,255,231, +190,132,255,167,135,80,255,24,22,19,227,19,18,16,170,19,18,16,198,95, +80,46,255,226,193,129,255,228,187,129,255,186,148,87,255,15,14,12,170,0, +8,10,10,9,85,155,113,64,255,229,196,132,255,232,191,133,255,179,142,90, +255,27,25,20,227,18,18,15,170,19,18,16,198,90,71,45,255,222,175,101, +255,227,174,98,255,228,185,111,255,28,25,19,255,0,8,7,7,6,23,34, +28,19,198,49,35,22,255,39,29,18,227,12,11,9,85,0,8,8,7,7, +28,33,26,16,198,52,39,23,255,47,35,22,227,13,12,8,85,0,8,8, +8,7,28,33,30,24,227,201,157,100,255,230,186,123,255,181,137,74,255,16, +15,11,207,6,6,5,23,0,24,11,10,8,28,27,21,12,193,26,19,11, +255,23,18,10,255,23,18,10,255,24,18,11,255,24,18,11,255,26,20,11, +255,35,27,16,255,42,31,19,241,17,14,10,85,0,28,9,9,8,144,91, +67,36,255,217,154,72,255,211,150,70,255,69,55,34,255,15,14,12,85,0, +28,6,6,5,11,11,11,10,142,24,22,19,255,167,135,80,255,225,172,104, +255,224,166,83,255,193,126,54,255,16,14,11,170,0,8,13,12,8,85,185, +97,26,255,207,112,28,255,204,110,27,255,71,46,22,255,8,8,7,255,28, +22,13,255,198,107,27,255,193,111,30,255,126,78,31,255,199,139,62,255,226, +184,111,255,27,24,18,255,0,8,11,10,8,170,214,166,97,255,230,187,119, +255,228,179,103,255,143,102,48,255,17,16,12,227,12,12,9,170,13,12,10, +198,46,33,17,255,199,112,28,255,206,111,27,255,204,110,27,255,32,23,13, +176,0,8,12,11,9,136,204,134,59,255,226,172,95,255,228,181,107,255,162, +125,73,255,24,22,19,227,19,18,16,170,19,18,16,198,95,80,46,255,224, +179,109,255,223,173,95,255,173,117,50,255,15,13,10,156,0,8,12,11,7, +99,185,97,26,255,208,112,27,255,204,110,27,255,22,18,11,255,0,40,16, +15,13,170,219,179,116,255,232,194,133,255,231,193,128,255,40,33,23,255,0, +12,16,15,13,170,219,177,112,255,230,187,119,255,224,159,83,255,24,21,15, +255,0,8,11,10,8,164,211,158,82,255,229,184,114,255,230,191,123,255,166, +127,77,255,22,21,17,227,22,21,17,170,20,19,13,170,14,13,11,28,0, +16,12,11,9,170,195,112,30,255,209,106,30,255,206,111,27,255,101,63,26, +255,16,14,11,227,23,21,16,170,29,27,22,170,13,13,12,42,0,16,16, +15,13,170,216,167,97,255,224,158,87,255,216,125,45,255,24,20,13,255,0, +40,17,16,12,170,219,177,112,255,232,195,137,255,231,189,128,255,162,125,73, +255,22,21,17,227,14,14,11,170,13,12,10,198,50,35,19,255,199,112,28, +255,206,111,27,255,204,110,27,255,32,24,13,170,0,8,13,12,8,93,194, +109,33,255,219,139,54,255,224,158,81,255,39,32,22,255,0,40,11,10,8, +170,190,104,27,255,208,112,27,255,204,110,27,255,32,24,13,170,0,8,13, +12,8,85,184,96,25,255,207,112,28,255,204,102,27,255,129,78,28,255,31, +26,16,255,127,84,34,255,219,147,70,255,173,122,62,255,15,14,12,212,6, +6,5,25,0,16,16,15,13,170,213,155,80,255,221,144,68,255,217,130,52, +255,31,25,16,255,0,32,10,9,7,170,189,99,26,255,208,112,27,255,204, +110,27,255,155,87,26,255,72,46,21,255,179,103,36,255,223,156,76,255,216, +170,97,255,134,96,47,255,174,127,71,255,221,167,90,255,223,147,72,255,222, +158,75,255,23,19,14,252,0,8,11,10,8,170,214,166,97,255,231,187,124, +255,230,191,123,255,228,182,117,255,222,175,101,255,64,50,33,255,7,7,6, +229,26,23,19,255,220,175,105,255,228,183,113,255,228,188,117,255,25,21,16, +255,0,8,11,10,8,170,217,176,112,255,232,197,137,255,232,199,135,255,37, +31,22,255,0,12,13,12,10,170,198,117,37,255,215,127,42,255,217,130,52, +255,21,19,14,255,0,8,11,10,8,167,215,172,104,255,232,191,133,255,231, +190,132,255,166,127,77,255,23,21,16,227,18,17,15,170,17,16,12,198,74, +52,27,255,204,117,33,255,211,111,30,255,173,93,28,255,15,12,8,164,0, +8,13,12,8,88,185,97,26,255,208,112,27,255,204,110,27,255,19,16,10, +255,0,12,10,9,7,170,190,104,27,255,212,118,35,255,216,136,51,255,21, +19,14,252,0,8,11,10,8,167,215,172,104,255,232,194,127,255,231,193,128, +255,166,129,77,255,23,21,16,227,19,18,16,170,19,18,14,198,81,59,34, +255,213,144,62,255,215,140,60,255,165,108,40,255,13,12,10,167,0,8,8, +8,7,85,101,63,26,255,206,114,33,255,212,121,33,255,155,92,36,255,23, +21,16,227,22,21,17,170,28,26,21,170,21,20,18,170,13,13,12,164,10, +10,9,85,6,6,6,6,0,28,12,11,9,170,194,112,31,255,212,119,37, +255,216,134,45,255,35,28,18,255,0,24,16,15,13,170,217,171,106,255,231, +187,124,255,228,181,107,255,39,32,22,255,0,12,16,15,11,170,208,134,55, +255,223,156,70,255,221,148,70,255,23,20,14,238,0,8,11,10,8,170,204, +136,55,255,223,156,70,255,222,158,75,255,34,28,19,255,0,12,14,13,11, +170,217,171,106,255,232,189,127,255,230,186,123,255,25,22,16,255,0,8,10, +10,9,167,210,155,77,255,226,172,95,255,224,165,81,255,31,26,18,255,0, +20,15,13,12,170,217,173,104,255,232,191,133,255,231,195,132,255,40,33,23, +255,0,20,10,9,9,133,73,58,36,255,225,184,120,255,231,193,128,255,228, +180,111,255,147,102,48,255,15,13,10,227,8,7,7,28,0,24,12,11,7, +198,100,59,23,255,169,93,26,255,156,91,27,255,174,96,27,255,180,99,27, +255,168,97,27,255,105,62,24,255,18,15,9,255,7,6,6,48,0,24,7, +7,7,28,15,15,12,227,144,114,67,255,219,177,112,255,223,176,102,255,153, +113,62,255,17,16,12,227,7,7,6,28,0,16,16,15,13,170,213,155,80, +255,223,146,70,255,217,129,50,255,27,22,14,255,0,24,12,10,9,195,161, +94,28,255,207,114,32,255,193,114,36,255,23,20,16,255,0,32,12,11,9, +170,191,105,28,255,207,100,28,255,204,110,27,255,26,20,11,204,0,8,6, +5,5,3,26,19,9,198,24,18,9,246,15,12,8,142,0,12,15,13,10, +91,31,24,16,244,51,39,24,255,21,19,14,91,0,68,10,10,9,76,61, +49,30,255,20,18,13,156,0,16,17,15,12,142,27,22,14,232,30,22,13, +255,25,20,12,255,22,18,11,238,21,16,10,255,99,58,22,255,203,113,26, +255,205,111,28,255,131,80,30,255,12,11,9,142,0,8,11,10,8,170,212, +160,85,255,232,191,127,255,231,195,132,255,196,155,91,255,81,59,34,255,41, +32,20,255,54,43,27,255,180,133,71,255,216,144,59,255,208,115,33,255,129, +78,28,255,12,11,7,142,0,8,8,7,7,57,72,52,29,255,215,155,78, +255,227,174,98,255,207,158,94,255,85,63,34,255,36,29,19,255,57,43,26, +255,189,130,66,255,219,149,66,255,212,121,41,255,172,105,33,255,17,15,10, +147,0,8,7,6,6,54,58,40,21,255,198,113,29,255,206,103,27,255,165, +87,24,255,42,28,13,255,21,16,8,255,27,20,10,255,95,60,22,255,202, +105,27,255,206,100,29,255,204,110,27,255,35,24,12,170,0,8,7,7,6, +54,70,50,27,255,212,145,65,255,227,174,98,255,201,155,88,255,59,44,28, +255,23,20,14,255,34,28,19,255,157,104,48,255,211,126,42,255,208,115,33, +255,132,82,29,255,13,11,8,142,0,12,24,18,9,221,108,61,23,255,201, +112,26,255,207,112,28,255,204,110,27,255,158,91,25,255,46,29,13,249,11, +10,6,57,0,8,8,8,7,57,70,50,27,255,212,142,59,255,226,172,95, +255,207,158,94,255,85,63,34,255,41,32,20,255,57,43,26,255,174,124,59, +255,224,170,93,255,229,184,114,255,231,196,128,255,28,25,19,255,0,8,10, +10,9,167,215,169,102,255,232,191,127,255,231,193,128,255,196,154,87,255,77, +59,34,255,41,31,20,255,54,43,27,255,168,113,49,255,212,121,41,255,206, +114,33,255,132,82,29,255,12,11,9,130,0,8,12,11,7,110,188,98,25, +255,206,111,27,255,206,106,25,255,26,19,11,255,0,24,14,12,9,170,199, +117,36,255,221,148,62,255,227,174,98,255,28,26,19,255,0,8,10,10,9, +167,212,161,89,255,224,166,83,255,217,129,50,255,32,24,15,255,5,5,4, +31,7,7,6,136,65,44,22,255,192,106,29,255,203,108,24,255,114,66,23, +255,17,13,8,221,0,12,10,9,7,139,185,97,26,255,208,112,27,255,208, +117,29,255,32,24,13,170,0,8,15,13,8,91,189,99,26,255,215,123,42, +255,226,172,95,255,198,152,87,255,81,58,34,255,176,133,71,255,224,168,95, +255,197,138,62,255,65,47,26,255,133,81,30,255,208,121,37,255,212,115,37, +255,152,98,35,255,12,11,9,142,0,8,10,9,7,147,190,107,25,255,206, +111,27,255,206,106,25,255,158,91,25,255,42,28,13,255,21,15,8,255,26, +19,9,255,114,66,23,255,204,113,25,255,208,115,33,255,173,122,62,255,16, +15,13,150,0,8,8,8,7,71,110,87,51,255,222,180,113,255,224,166,83, +255,209,137,60,255,133,84,32,255,77,50,24,255,89,59,26,255,181,109,32, +255,210,121,35,255,212,121,41,255,171,116,52,255,15,14,12,142,0,8,14, +13,11,170,219,177,112,255,231,187,124,255,228,180,111,255,205,158,90,255,79, +58,32,255,38,29,19,255,49,35,22,255,167,114,46,255,217,146,62,255,219, +154,70,255,169,117,56,255,15,13,12,156,0,8,8,8,7,71,104,80,45, +255,224,183,119,255,232,191,127,255,210,166,97,255,81,60,32,255,39,30,18, +255,52,40,25,255,175,128,66,255,225,173,98,255,228,180,105,255,226,175,95, +255,29,25,18,255,0,8,12,12,11,170,208,138,55,255,222,145,63,255,220, +139,59,255,193,121,50,255,68,50,29,255,38,28,19,255,48,35,23,255,175, +112,44,255,217,142,54,255,217,144,66,255,191,137,66,255,19,16,12,170,0, +8,9,8,8,74,111,82,40,255,216,155,75,255,226,172,95,255,200,151,81, +255,57,41,26,255,27,23,16,255,35,28,18,255,41,32,20,255,39,30,20, +255,25,22,16,227,15,14,10,142,0,12,10,9,7,28,33,24,14,227,135, +81,28,255,206,117,31,255,210,108,33,255,208,110,31,255,171,92,28,255,49, +33,16,252,13,11,8,68,0,8,11,10,8,170,195,108,30,255,212,118,35, +255,217,137,52,255,42,33,23,255,0,12,20,18,15,170,214,156,81,255,221, +148,62,255,214,127,43,255,23,19,12,238,0,8,10,10,7,159,196,109,31, +255,213,119,36,255,212,123,37,255,31,24,14,255,0,12,15,14,10,170,209, +137,60,255,228,172,99,255,230,189,119,255,28,26,19,255,0,8,12,12,11, +170,208,134,55,255,218,137,51,255,214,127,43,255,35,27,16,255,0,20,16, +14,11,170,199,116,34,255,217,132,48,255,224,166,83,255,32,26,19,255,0, +8,10,10,7,34,81,58,34,255,224,178,105,255,226,172,95,255,129,92,40, +255,9,9,8,170,6,6,6,85,6,6,5,113,35,27,16,255,204,117,33, +255,208,117,29,255,110,69,25,255,14,12,7,108,0,8,10,10,7,170,195, +112,30,255,211,115,30,255,211,115,30,255,30,23,13,255,0,12,14,12,9, +170,196,113,31,255,211,120,32,255,214,126,41,255,33,26,18,255,0,8,9, +8,6,28,44,33,19,212,60,42,23,255,46,35,21,255,74,53,31,255,156, +109,53,255,216,167,97,255,228,179,109,255,229,177,110,255,227,184,108,255,168, +123,69,255,23,21,16,227,9,8,8,28,0,12,17,16,14,170,134,98,51, +255,223,166,92,255,132,100,53,255,9,9,8,133,0,20,16,15,13,170,219, +177,112,255,232,191,133,255,231,195,132,255,40,33,23,255,0,20,6,6,5, +45,39,32,22,255,210,129,49,255,172,106,35,255,20,17,13,227,11,11,8, +28,0,100,17,17,14,170,221,189,132,255,235,205,154,255,234,205,155,255,42, +39,29,255,0,16,9,9,8,25,0,20,9,8,8,25,0,20,14,14,11, +170,208,141,61,255,224,168,87,255,228,174,103,255,31,26,20,221,0,4,13, +12,12,130,218,185,127,255,234,202,147,255,232,198,139,255,40,33,25,255,0, +20,17,17,14,176,140,115,71,255,230,202,147,255,232,202,149,255,218,170,101, +255,200,124,43,255,198,117,37,255,198,117,37,255,196,116,37,255,72,52,27, +255,12,11,9,170,0,28,8,8,7,85,37,31,20,255,174,110,41,255,210, +123,39,255,204,120,37,255,130,87,31,255,15,13,10,190,0,28,5,5,4, +113,28,26,19,255,210,143,65,255,220,163,81,255,217,166,92,255,222,173,97, +255,225,176,98,255,42,37,25,255,4,4,4,74,0,56,13,12,10,170,208, +141,61,255,226,172,95,255,228,183,111,255,40,34,25,255,0,24,17,16,14, +170,219,177,112,255,232,194,133,255,233,202,148,255,27,24,20,255,0,8,16, +15,13,85,199,161,102,255,220,166,89,255,211,143,62,255,217,154,72,255,223, +161,80,255,224,169,91,255,225,185,114,255,229,188,124,255,231,190,132,255,231, +200,143,255,227,195,140,255,227,196,138,255,225,195,136,255,44,37,27,170,0, +8,17,16,14,85,200,165,109,255,227,198,142,255,225,191,132,255,227,195,134, +255,231,199,136,255,231,197,132,255,231,194,124,255,229,191,130,255,225,195,136, +255,225,195,136,255,225,191,132,255,49,42,30,198,0,36,18,17,13,105,193, +135,66,255,221,175,102,255,222,186,123,255,223,190,132,255,224,192,135,255,223, +190,132,255,222,186,123,255,221,178,110,255,218,172,105,255,46,39,27,195,0, +48,6,6,6,28,27,26,20,255,216,170,97,255,225,178,104,255,176,136,83, +255,16,15,13,198,0,16,17,17,14,170,221,188,130,255,235,205,154,255,234, +205,155,255,232,204,149,255,228,199,143,255,171,144,96,255,64,57,41,255,154, +126,81,255,227,189,122,255,230,184,119,255,227,171,98,255,34,30,21,255,0, +24,17,16,14,170,221,186,126,255,234,202,147,255,232,192,135,255,44,39,27, +255,0,44,9,9,8,142,25,24,20,255,114,95,53,255,207,169,102,255,227, +187,118,255,226,188,123,255,178,148,95,255,19,18,16,170,0,32,24,22,19, +85,197,145,84,255,227,187,118,255,231,194,124,255,207,173,114,255,61,55,38, +255,8,8,8,136,0,12,10,10,9,108,45,36,21,255,195,116,38,255,207, +122,38,255,139,90,32,255,13,12,8,170,0,4,10,10,9,198,208,140,59, +255,226,170,91,255,231,193,128,255,40,35,27,255,0,36,4,4,3,28,18, +17,13,227,222,189,131,255,234,201,143,255,229,191,130,255,34,30,23,204,0, +8,11,11,10,170,211,158,82,255,226,170,91,255,224,165,81,255,219,154,70, +255,208,132,51,255,206,128,45,255,204,122,41,255,201,120,40,255,196,116,37, +255,111,74,30,255,20,18,13,227,8,8,7,28,0,28,6,6,6,28,28, +26,21,255,222,186,123,255,229,196,132,255,181,144,92,255,16,15,13,212,0, +16,6,6,6,85,25,24,20,255,180,149,101,255,231,205,154,255,232,204,149, +255,227,198,142,255,223,192,138,255,223,193,136,255,230,199,139,255,232,197,141, +255,211,176,122,255,64,57,41,255,8,8,7,113,0,8,6,6,5,14,33, +31,24,227,186,155,107,255,232,204,149,255,233,205,152,255,227,197,140,255,221, +189,132,255,224,192,135,255,228,198,141,255,232,201,141,255,232,192,135,255,231, +197,132,255,41,35,26,255,0,64,17,16,14,139,211,178,120,255,233,202,148, +255,233,202,148,255,56,48,33,255,4,4,4,85,0,104,11,11,10,255,216, +164,89,255,230,191,123,255,227,195,134,255,40,35,27,227,0,28,16,15,13, +227,126,105,69,255,217,176,112,255,225,175,104,255,223,159,76,255,189,124,49, +255,43,35,20,255,9,8,8,57,0,8,10,10,9,133,194,109,33,255,215, +125,38,255,212,124,39,255,144,93,33,255,29,24,16,255,68,53,29,255,186, +123,49,255,128,95,47,255,25,24,20,255,143,119,78,255,230,201,145,255,33, +30,24,255,0,8,11,11,10,170,217,176,112,255,228,182,109,255,222,158,75, +255,212,134,51,255,204,122,41,255,198,117,37,255,200,118,37,255,208,123,39, +255,212,123,37,255,214,121,39,255,217,133,50,255,24,21,15,244,0,8,11, +11,10,170,218,185,127,255,235,203,148,255,233,202,148,255,230,201,145,255,227, +197,140,255,221,187,128,255,221,184,120,255,224,178,105,255,224,164,85,255,189, +129,58,255,39,32,20,255,7,7,6,85,0,8,11,10,8,125,194,109,33, +255,215,125,38,255,213,125,40,255,29,24,16,255,0,40,17,17,14,170,221, +188,130,255,235,201,152,255,232,201,141,255,42,36,27,255,0,12,17,17,14, +170,219,179,116,255,231,187,124,255,228,183,111,255,24,22,17,255,0,8,11, +11,10,170,218,185,127,255,232,197,137,255,227,179,104,255,219,155,72,255,208, +132,51,255,204,122,41,255,202,120,39,255,38,31,19,170,0,16,12,11,9, +170,196,110,33,255,215,113,38,255,213,122,42,255,215,143,58,255,217,166,92, +255,222,186,123,255,225,195,136,255,52,44,33,198,0,16,17,16,14,170,211, +150,70,255,219,140,56,255,213,126,42,255,25,21,14,255,0,40,17,17,14, +170,221,187,128,255,232,199,141,255,228,180,111,255,219,155,72,255,207,128,44, +255,199,119,39,255,200,118,37,255,208,123,39,255,212,123,37,255,214,125,39, +255,212,124,39,255,34,26,15,181,0,8,11,10,10,161,215,172,104,255,234, +201,143,255,234,206,151,255,42,39,29,255,0,40,12,11,9,170,196,110,33, +255,215,125,38,255,212,124,39,255,36,28,17,170,0,8,15,14,10,85,194, +109,33,255,215,125,38,255,212,124,39,255,210,128,41,255,211,135,54,255,225, +176,98,255,231,197,132,255,56,48,33,255,4,4,4,85,0,20,17,16,14, +170,206,135,51,255,217,133,50,255,213,122,42,255,25,21,14,255,0,32,12, +11,9,170,196,110,33,255,215,125,38,255,213,122,42,255,67,51,28,255,6, +6,5,255,40,34,25,255,226,190,127,255,138,110,69,255,7,7,7,255,25, +24,20,255,221,179,112,255,232,191,127,255,232,201,141,255,26,23,19,255,0, +8,11,11,10,170,214,168,101,255,230,187,119,255,228,188,117,255,212,173,105, +255,150,118,67,255,102,86,47,255,111,90,50,255,185,145,88,255,227,187,118, +255,231,195,132,255,232,201,141,255,26,23,19,255,0,8,11,11,10,170,219, +184,128,255,235,205,154,255,234,206,151,255,42,36,27,255,0,12,15,15,12, +170,213,158,80,255,228,182,109,255,230,191,123,255,27,23,18,255,0,8,11, +11,10,170,219,189,132,255,235,205,154,255,232,197,141,255,225,185,114,255,215, +155,78,255,206,135,51,255,205,126,42,255,209,128,42,255,212,121,41,255,181, +111,36,255,39,30,18,255,8,8,7,57,0,8,10,10,9,136,194,109,33, +255,215,125,38,255,212,124,39,255,24,20,13,255,0,12,15,14,12,170,210, +146,71,255,229,183,110,255,231,197,132,255,26,23,19,255,0,8,11,11,10, +170,218,189,127,255,234,199,143,255,231,197,132,255,225,176,106,255,214,153,75, +255,208,138,55,255,205,133,48,255,210,127,45,255,214,134,49,255,179,119,42, +255,37,30,18,255,7,7,6,85,0,12,23,20,14,227,161,115,50,255,222, +167,89,255,227,186,114,255,225,190,130,255,223,198,136,255,227,198,142,255,224, +196,141,255,221,191,134,255,161,130,86,255,33,30,24,229,10,10,9,42,0, +24,15,15,12,170,211,149,76,255,228,182,109,255,231,189,128,255,44,39,27, +255,0,24,17,17,14,170,216,170,97,255,226,172,95,255,224,165,81,255,31, +26,18,255,0,12,13,12,10,170,201,120,40,255,217,133,50,255,216,125,45, +255,25,21,14,212,0,8,11,10,8,144,203,130,52,255,224,166,83,255,228, +174,103,255,40,34,25,255,0,12,17,16,14,170,221,187,128,255,234,201,143, +255,230,191,123,255,28,25,19,244,0,8,10,10,9,164,203,122,50,255,220, +148,63,255,217,141,52,255,23,20,14,255,0,8,14,13,11,108,10,10,9, +28,0,4,13,13,12,170,221,189,134,255,235,205,154,255,234,206,151,255,42, +37,27,255,0,24,11,11,10,255,222,189,131,255,232,195,131,255,224,162,81, +255,36,29,19,255,4,4,4,54,0,28,7,7,6,28,19,17,12,232,93, +66,30,255,183,112,36,255,209,122,38,255,212,120,39,255,159,102,34,255,22, +19,13,255,7,7,6,85,0,24,6,6,5,28,17,16,14,227,149,122,84, +255,227,195,140,255,227,191,134,255,179,142,90,255,17,16,14,227,5,5,4, +25,0,20,15,14,12,170,204,129,49,255,218,141,51,255,213,126,42,255,25, +21,14,255,0,24,8,7,7,91,68,48,25,255,205,127,44,255,220,153,75, +255,99,78,44,255,8,8,7,113,0,28,12,11,9,170,196,110,33,255,215, +125,38,255,212,124,39,255,24,20,13,255,0,124,9,9,8,25,0,40,2, +2,1,23,9,8,6,255,199,116,34,255,215,125,38,255,212,128,45,255,27, +24,16,207,0,8,11,11,10,170,219,184,128,255,235,205,154,255,234,205,155, +255,58,49,35,255,5,5,4,85,0,4,4,4,3,28,16,15,11,227,204, +122,41,255,215,126,40,255,210,123,39,255,32,25,15,170,0,8,13,13,12, +122,208,168,99,255,234,199,143,255,234,204,151,255,63,54,38,255,5,5,4, +85,0,4,4,4,3,28,18,17,13,215,204,127,45,255,214,125,39,255,212, +121,41,255,34,27,15,170,0,8,13,12,10,85,185,112,34,255,215,125,38, +255,212,123,37,255,35,28,16,255,4,4,3,85,0,4,3,3,2,28,12, +10,9,224,198,117,37,255,215,125,38,255,212,124,39,255,34,27,15,178,0, +8,14,13,11,113,206,162,94,255,232,199,141,255,234,207,155,255,63,53,36, +255,4,4,3,113,0,4,3,3,3,28,10,10,9,255,200,118,37,255,215, +125,38,255,210,123,39,255,27,22,14,227,0,12,3,3,2,6,13,11,8, +221,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,5,4,4, +57,0,12,15,14,12,147,206,154,87,255,232,195,137,255,234,204,151,255,63, +54,38,255,5,5,4,85,0,4,4,4,3,28,18,16,13,227,222,189,131, +255,235,205,152,255,234,205,155,255,27,24,20,255,0,8,11,11,10,170,219, +184,130,255,235,205,152,255,234,205,155,255,58,49,35,255,5,5,4,85,0, +4,4,4,3,28,14,12,9,227,199,117,36,255,215,113,38,255,210,123,39, +255,32,25,15,170,0,8,12,12,9,102,194,109,33,255,215,125,38,255,212, +124,39,255,27,22,14,255,0,24,18,16,13,170,217,176,110,255,234,196,143, +255,234,204,151,255,27,24,20,255,0,8,11,10,10,170,204,134,59,255,219, +136,54,255,213,122,42,255,72,50,27,255,8,8,7,255,25,22,14,255,195, +116,38,255,208,123,39,255,142,91,31,255,16,14,9,193,4,4,3,17,0, +12,11,11,8,170,198,117,37,255,219,133,56,255,221,152,70,255,27,23,16, +221,0,8,13,12,10,99,193,113,34,255,223,156,70,255,231,193,128,255,40, +34,25,255,4,3,3,113,17,16,12,227,208,136,59,255,45,36,21,255,4, +3,3,113,10,9,7,207,196,110,33,255,215,125,38,255,210,128,41,255,32, +25,15,170,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212,124,39, +255,35,27,16,255,4,4,3,85,0,4,3,3,2,28,12,11,9,227,199, +117,36,255,221,150,66,255,229,191,126,255,32,29,23,210,0,8,13,13,12, +122,204,150,79,255,223,159,76,255,217,141,52,255,84,57,29,255,9,8,6, +170,5,5,4,85,6,6,5,113,27,22,14,255,207,128,44,255,223,147,72, +255,227,187,118,255,34,30,23,207,0,8,12,11,11,170,218,180,119,255,229, +184,114,255,224,167,85,255,50,40,25,255,5,5,4,85,0,4,4,4,3, +28,14,12,9,227,203,125,42,255,217,128,48,255,213,128,45,255,35,27,16, +173,0,8,12,12,11,130,209,163,98,255,235,203,148,255,233,202,148,255,63, +54,36,255,5,5,4,85,0,4,4,4,3,28,15,15,12,227,209,137,60, +255,221,151,68,255,219,147,62,255,23,20,14,238,0,8,10,10,9,150,196, +121,41,255,217,128,48,255,215,133,44,255,40,31,19,255,5,5,5,85,0, +4,4,4,3,28,16,14,11,207,201,120,40,255,217,133,50,255,221,161,76, +255,57,44,28,170,0,8,15,14,12,105,211,165,98,255,232,197,137,255,232, +199,141,255,58,49,35,255,4,4,3,113,0,40,3,3,2,17,12,11,9, +227,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,4,4,3, +62,0,12,12,11,9,170,200,120,41,255,223,159,76,255,230,191,123,255,44, +37,27,255,0,12,18,17,15,170,208,140,59,255,217,133,50,255,213,125,40, +255,27,23,14,195,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212, +124,39,255,25,21,14,255,0,12,17,16,14,170,219,179,116,255,235,201,152, +255,234,204,151,255,27,24,20,255,0,8,10,10,9,170,198,122,41,255,215, +127,42,255,213,125,40,255,27,22,14,255,0,20,12,11,9,170,201,120,40, +255,224,156,83,255,231,190,132,255,40,33,25,255,0,12,10,10,9,85,52, +42,29,255,200,142,59,255,183,119,44,255,72,52,27,255,39,30,18,255,49, +37,22,255,150,99,33,255,196,116,37,255,77,50,24,255,10,9,7,144,0, +12,10,10,9,170,196,115,35,255,215,125,38,255,212,124,39,255,25,21,14, +255,0,12,12,11,9,170,196,110,33,255,214,127,43,255,222,158,75,255,41, +34,24,255,0,24,5,5,4,85,11,11,10,255,130,101,59,255,223,176,102, +255,224,176,101,255,177,137,74,255,18,17,13,227,6,5,5,28,0,12,20, +19,15,85,186,120,49,255,217,142,62,255,217,139,56,255,34,29,19,255,4, +4,3,17,0,20,17,17,14,170,221,188,130,255,235,205,152,255,234,205,155, +255,42,39,29,255,0,24,13,13,10,181,199,119,39,255,212,121,41,255,203, +121,40,255,35,29,17,170,0,100,20,18,15,170,222,186,123,255,234,201,143, +255,232,197,135,255,47,40,28,255,0,64,14,13,11,170,213,160,84,255,230, +187,119,255,231,197,132,255,35,30,22,198,0,4,14,13,11,108,217,176,112, +255,232,193,137,255,231,197,132,255,33,28,22,255,0,24,12,12,11,113,31, +29,22,210,40,35,27,255,41,34,24,255,29,24,16,255,32,26,17,255,146, +92,35,255,214,134,49,255,212,128,45,255,123,81,36,255,15,13,10,142,0, +20,7,7,6,85,28,26,19,252,194,140,71,255,212,127,43,255,202,118,35, +255,97,66,30,255,15,14,10,207,6,6,5,25,0,24,6,6,5,8,15, +13,12,227,111,86,50,255,209,168,102,255,176,136,83,255,85,67,44,255,163, +129,80,255,221,186,126,255,83,69,44,255,7,7,6,170,5,5,5,8,0, +4,9,9,8,108,20,18,13,170,13,12,10,51,0,36,16,15,13,170,217, +176,110,255,232,194,133,255,232,198,139,255,36,33,25,255,0,24,15,15,12, +170,219,179,116,255,232,193,137,255,232,199,135,255,31,26,20,255,0,8,11, +11,10,28,56,48,33,227,98,76,45,255,104,80,45,255,195,154,96,255,227, +186,114,255,226,189,125,255,207,173,114,255,222,188,123,255,231,190,132,255,217, +188,124,255,137,109,70,255,99,86,54,255,78,64,43,255,21,20,16,85,0, +8,12,12,11,28,54,48,35,227,86,72,47,255,74,63,43,255,171,137,84, +255,229,191,130,255,230,191,123,255,230,186,123,255,202,164,105,255,97,80,50, +255,75,64,44,255,72,61,39,255,22,21,17,102,0,36,12,11,11,45,55, +45,30,227,90,71,45,255,78,63,41,255,72,61,39,255,74,63,43,255,72, +61,39,255,72,61,39,255,91,74,46,255,78,63,41,255,22,20,17,102,0, +48,12,12,11,176,132,106,61,255,228,188,125,255,210,172,113,255,42,37,29, +255,9,9,8,62,0,16,17,16,14,170,221,186,124,255,234,199,143,255,232, +201,141,255,232,201,141,255,221,189,134,255,52,46,33,255,6,7,6,227,24, +23,17,255,208,132,51,255,215,133,44,255,212,124,39,255,24,20,13,255,0, +24,17,16,12,170,219,177,112,255,231,187,124,255,228,182,109,255,40,33,23, +255,0,36,9,9,8,74,17,15,12,227,67,51,28,255,162,107,43,255,200, +142,67,255,204,157,91,255,177,140,86,255,74,63,43,255,19,17,16,198,9, +9,8,28,0,32,14,14,11,31,56,46,31,227,192,157,103,255,229,194,128, +255,225,188,124,255,146,112,67,255,11,10,8,164,0,8,7,7,6,28,34, +27,17,255,190,107,33,255,210,121,35,255,146,95,35,255,16,14,11,187,0, +8,9,9,8,170,214,164,93,255,232,194,127,255,231,195,132,255,40,34,25, +255,0,40,13,13,10,170,213,157,84,255,224,166,83,255,221,150,66,255,23, +20,14,246,0,8,12,11,9,113,194,109,33,255,212,119,37,255,210,113,35, +255,168,103,33,255,56,42,23,255,27,23,14,255,38,31,19,255,149,92,30, +255,207,118,32,255,207,113,30,255,124,75,27,255,13,11,8,161,0,28,12, +12,11,176,130,99,59,255,229,191,126,255,211,174,116,255,43,37,28,255,9, +9,8,59,0,16,8,8,7,85,68,58,37,255,214,177,119,255,231,196,136, +255,207,171,114,255,97,80,50,255,54,47,35,255,66,59,41,255,178,148,95, +255,228,189,121,255,224,187,123,255,146,112,67,255,12,12,11,170,0,12,10, +10,9,28,16,15,13,147,29,28,22,221,48,42,31,255,70,61,41,255,66, +57,39,255,70,61,41,255,171,140,92,255,224,170,101,255,224,168,87,255,224, +165,81,255,39,32,22,255,0,64,14,13,11,57,100,82,51,255,222,186,123, +255,226,172,95,255,113,82,38,255,9,8,8,127,0,32,11,9,6,102,11, +10,6,170,11,10,8,170,12,11,9,170,15,13,10,170,15,13,10,170,15, +14,10,170,18,15,11,170,18,15,11,156,12,11,9,28,0,28,6,6,5, +65,40,34,25,255,224,183,119,255,229,195,136,255,171,140,92,255,21,20,18, +142,0,24,11,10,8,102,131,92,46,255,213,145,56,255,214,119,43,255,210, +128,41,255,151,94,32,255,23,21,14,255,10,10,9,85,0,12,10,9,7, +170,191,106,30,255,211,115,30,255,208,114,31,255,141,87,30,255,36,31,19, +255,121,90,42,255,217,168,92,255,205,163,102,255,132,102,59,255,213,172,108, +255,231,193,128,255,35,30,22,255,0,8,11,11,10,164,203,129,50,255,215, +127,42,255,211,117,34,255,166,97,29,255,54,40,21,255,29,23,14,255,38, +31,19,255,120,78,29,255,206,118,33,255,214,127,43,255,224,155,81,255,23, +21,16,255,0,8,11,10,10,170,217,183,116,255,234,201,143,255,232,198,139, +255,202,166,109,255,97,78,50,255,52,46,33,255,58,50,33,255,150,96,39, +255,208,121,37,255,195,112,30,255,83,53,24,255,9,8,6,113,0,8,13, +12,8,96,189,104,28,255,210,120,33,255,214,132,45,255,34,29,19,255,0, +40,17,16,12,170,217,172,102,255,228,180,105,255,228,181,107,255,40,33,23, +255,0,12,17,15,12,170,216,171,101,255,232,191,127,255,231,197,132,255,24, +22,17,255,0,8,11,11,10,167,209,146,72,255,221,151,68,255,213,126,42, +255,172,106,35,255,57,41,22,255,42,32,19,255,43,33,20,252,18,15,11, +85,0,16,11,10,8,170,193,111,30,255,215,113,38,255,220,144,63,255,197, +145,84,255,91,71,44,255,75,62,42,255,75,64,44,255,22,21,17,99,0, +16,14,13,11,170,196,110,33,255,210,115,31,255,210,115,31,255,22,19,11, +227,0,8,16,13,9,113,24,21,15,170,17,15,12,170,18,15,13,170,19, +17,12,142,9,8,8,28,0,8,14,13,11,170,210,146,71,255,220,142,59, +255,213,125,40,255,168,103,33,255,54,40,21,255,29,23,14,255,38,31,19, +255,119,78,30,255,204,116,31,255,210,119,31,255,210,115,31,255,26,20,13, +210,0,8,11,11,10,170,217,179,120,255,234,202,147,255,232,201,141,255,40, +35,25,255,0,40,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31, +255,36,25,13,170,0,8,14,12,9,85,190,105,29,255,210,107,31,255,208, +114,31,255,187,124,42,255,143,111,56,255,210,171,109,255,229,187,128,255,131, +99,54,255,8,8,7,156,0,20,13,12,10,170,194,112,31,255,210,107,31, +255,210,115,31,255,22,19,11,255,0,32,11,10,8,170,193,111,30,255,215, +125,38,255,218,141,59,255,39,33,22,255,5,5,5,28,12,12,11,170,156, +126,83,255,27,24,20,227,5,5,5,23,14,13,11,198,219,177,112,255,232, +191,127,255,230,191,123,255,25,22,16,249,0,8,11,10,8,153,200,120,41, +255,214,127,43,255,213,126,42,255,93,66,32,255,11,11,10,255,34,31,23, +255,206,152,81,255,226,179,111,255,231,189,128,255,232,192,135,255,232,201,141, +255,25,22,18,255,0,8,11,10,10,170,215,171,102,255,228,174,105,255,222, +158,75,255,27,24,16,255,0,12,15,15,12,170,219,177,112,255,232,193,137, +255,232,201,141,255,25,22,18,255,0,8,11,10,10,170,215,172,104,255,228, +182,109,255,221,155,70,255,177,114,46,255,55,42,24,255,35,28,18,255,41, +31,18,255,35,28,17,255,27,22,14,255,17,16,12,187,9,9,8,79,0, +12,10,9,7,170,191,106,30,255,211,115,30,255,210,115,31,255,33,25,14, +255,0,12,21,20,16,170,221,180,116,255,232,193,137,255,232,201,141,255,25, +22,18,255,0,8,11,11,10,170,212,160,85,255,224,156,83,255,218,141,59, +255,175,115,44,255,55,42,24,255,31,25,16,255,38,30,19,255,127,82,30, +255,204,116,31,255,195,112,30,255,82,55,25,255,11,10,8,150,0,12,9, +9,8,28,15,14,12,142,28,25,19,221,46,40,29,255,71,60,38,255,66, +57,39,255,70,61,41,255,193,159,106,255,227,184,108,255,221,153,72,255,155, +98,36,255,13,12,10,170,0,24,17,15,12,170,219,180,112,255,232,197,137, +255,232,201,141,255,40,35,25,255,0,24,14,13,11,170,198,117,37,255,213, +124,38,255,210,121,35,255,23,19,12,255,0,12,11,10,8,170,193,111,30, +255,211,115,30,255,208,114,31,255,23,19,12,207,0,8,14,13,11,85,181, +132,68,255,228,185,117,255,231,193,128,255,54,46,31,255,5,5,4,8,0, +8,21,20,16,178,215,160,88,255,223,147,72,255,206,135,51,255,23,20,14, +170,0,8,12,11,9,102,192,111,31,255,210,108,33,255,208,114,31,255,22, +18,11,255,0,4,10,10,9,113,79,61,38,255,17,16,12,198,0,4,16, +15,13,170,219,179,116,255,231,187,124,255,224,169,91,255,33,28,20,255,0, +20,9,8,8,85,39,33,24,255,217,166,92,255,219,140,56,255,210,121,35, +255,66,44,21,255,7,7,6,133,0,32,6,6,5,74,19,18,12,255,183, +102,30,255,207,105,30,255,210,111,31,255,73,51,24,255,8,8,7,116,0, +24,6,6,6,28,15,13,12,227,144,112,61,255,221,180,116,255,224,178,113, +255,152,116,65,255,18,17,13,221,8,8,7,28,0,24,12,10,9,170,193, +111,30,255,210,107,31,255,210,115,31,255,22,19,11,255,0,28,16,15,13, +227,164,122,63,255,225,185,114,255,192,153,97,255,21,19,16,232,7,7,6, +28,0,24,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31,255,23, +19,12,255,0,148,6,6,5,51,11,9,6,85,12,10,7,102,10,8,5, +156,10,8,5,127,8,7,5,184,27,22,12,255,198,105,29,255,211,122,36, +255,220,136,61,255,25,22,16,255,0,8,10,10,9,170,218,181,123,255,234, +202,147,255,232,197,141,255,30,27,21,255,0,12,9,8,6,170,191,106,30, +255,211,115,30,255,210,111,31,255,39,27,14,170,0,8,12,11,11,170,218, +180,119,255,234,196,143,255,232,201,141,255,29,26,20,255,0,12,7,7,6, +28,27,22,14,156,25,22,14,255,32,25,15,210,22,18,11,28,0,8,10, +9,7,150,195,112,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0, +12,9,9,8,170,191,106,30,255,211,111,30,255,208,114,31,255,25,20,12, +204,0,8,12,11,11,170,218,180,119,255,234,202,147,255,232,201,141,255,142, +111,63,255,14,12,9,227,10,9,7,127,8,7,5,181,35,25,14,255,199, +112,28,255,209,118,30,255,209,117,28,255,30,22,13,255,0,16,9,8,6, +167,191,106,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0,16,21, +19,16,170,220,178,113,255,232,197,137,255,232,201,141,255,26,23,19,255,0, +12,11,11,10,170,218,181,123,255,234,201,143,255,231,197,132,255,24,22,17, +255,0,8,11,10,10,170,218,181,123,255,234,201,143,255,231,197,132,255,30, +26,21,255,0,12,9,8,6,167,191,106,30,255,211,115,30,255,210,111,31, +255,39,27,14,170,0,8,13,12,8,85,190,105,29,255,213,119,36,255,214, +132,45,255,32,26,17,255,0,24,17,16,14,170,221,186,124,255,234,202,147, +255,232,199,135,255,25,22,18,252,0,8,11,10,8,127,192,111,31,255,210, +107,31,255,208,114,31,255,161,94,28,255,65,43,20,255,145,85,26,255,207, +117,30,255,122,75,29,255,15,14,10,170,5,5,4,8,0,16,11,10,8, +170,196,115,35,255,223,146,70,255,228,183,111,255,25,22,16,252,0,8,14, +12,9,85,190,105,29,255,215,125,38,255,218,141,59,255,30,24,17,195,0, +4,10,10,7,170,193,111,30,255,20,17,11,252,0,4,11,10,8,85,188, +103,27,255,211,115,30,255,209,106,30,255,39,27,14,170,0,8,13,12,8, +85,190,105,29,255,211,115,30,255,210,115,31,255,19,15,10,255,0,12,9, +8,6,167,192,111,31,255,218,137,51,255,227,175,100,255,27,24,18,255,0, +8,11,10,8,147,196,106,33,255,210,108,33,255,210,115,31,255,30,23,13, +255,4,4,3,14,0,8,15,14,12,195,211,149,76,255,229,184,114,255,232, +199,135,255,28,25,19,255,0,8,11,10,8,167,203,129,50,255,215,127,42, +255,210,121,35,255,20,17,11,232,0,12,9,8,6,139,190,105,29,255,211, +111,30,255,209,114,30,255,30,22,13,198,0,8,13,12,10,170,217,173,104, +255,232,193,137,255,232,194,139,255,25,22,18,255,0,12,9,8,8,156,192, +111,31,255,210,108,33,255,210,115,31,255,32,24,13,173,0,8,13,12,8, +88,190,105,29,255,211,115,30,255,208,114,31,255,19,15,10,255,0,12,7, +7,6,28,27,22,14,198,45,36,21,255,52,43,29,244,14,13,11,85,0, +8,13,13,12,88,177,143,90,255,230,194,131,255,226,172,95,255,137,91,36, +255,10,9,7,227,8,8,5,161,10,9,7,167,10,9,7,136,13,10,6, +85,7,6,6,74,0,24,9,8,6,167,191,106,30,255,211,115,30,255,210, +115,31,255,19,15,10,252,0,16,12,11,9,170,208,141,61,255,230,187,119, +255,232,201,141,255,40,34,25,255,0,12,14,12,9,170,196,109,31,255,210, +107,31,255,210,115,31,255,36,25,13,170,0,8,10,9,7,85,155,91,28, +255,208,114,31,255,209,106,30,255,30,22,13,255,0,12,22,21,17,176,222, +186,123,255,234,199,143,255,226,195,135,255,35,29,22,178,0,8,12,11,9, +105,190,105,29,255,211,115,30,255,208,114,31,255,23,19,12,210,0,8,15, +12,8,59,7,6,4,3,0,4,9,9,8,159,204,134,59,255,230,182,119, +255,232,198,139,255,39,33,24,255,0,16,10,10,9,34,15,14,10,198,52, +40,21,255,165,96,28,255,198,113,29,255,185,102,28,255,80,53,25,255,19, +17,12,227,10,9,7,76,0,16,11,10,8,170,195,112,30,255,211,115,30, +255,210,115,31,255,20,16,11,255,0,12,10,9,7,170,192,111,31,255,215, +125,38,255,224,159,83,255,41,33,24,255,0,24,7,7,6,108,24,20,13, +255,146,88,31,255,195,127,38,255,113,77,34,255,15,14,12,210,7,7,6, +28,0,16,12,12,11,28,37,30,18,227,168,99,31,255,206,114,33,255,51, +34,18,255,6,5,5,71,0,20,17,16,14,170,221,186,124,255,234,202,147, +255,232,201,141,255,40,35,25,255,0,24,17,15,10,227,198,105,29,255,194, +109,33,255,62,44,23,255,16,14,11,85,0,100,19,17,12,142,214,171,97, +255,228,183,113,255,227,186,108,255,50,40,25,227,0,64,12,11,9,198,214, +158,85,255,229,183,110,255,228,181,107,255,21,19,14,249,2,2,1,20,8, +8,7,181,210,156,79,255,226,169,95,255,224,155,81,255,33,26,18,255,4, +4,4,28,0,40,3,3,2,28,11,10,8,255,209,138,62,255,223,154,72, +255,221,164,82,255,27,23,16,249,0,16,7,7,6,79,46,38,25,255,197, +151,84,255,222,161,89,255,209,128,42,255,141,91,32,255,15,13,10,218,5, +5,5,11,0,28,15,13,10,139,191,131,60,255,220,168,93,255,168,123,69, +255,14,13,11,227,5,5,5,85,9,9,8,170,105,78,40,255,162,116,61, +255,88,66,37,255,23,21,16,255,11,11,10,255,78,58,35,255,208,150,75, +255,61,46,28,181,0,36,15,13,10,170,216,170,97,255,230,187,119,255,228, +178,113,255,34,28,19,255,0,24,15,13,10,170,215,167,92,255,229,179,114, +255,228,181,107,255,32,27,19,255,0,16,6,6,6,25,5,5,4,198,52, +42,27,255,220,169,97,255,189,142,76,255,35,31,22,255,134,96,51,255,225, +176,106,255,140,106,53,255,6,6,5,255,6,6,6,51,0,28,5,5,5, +28,15,13,10,227,208,136,59,255,218,138,53,255,213,122,42,255,43,31,18, +255,5,5,4,85,0,136,9,8,8,57,57,47,30,255,212,163,93,255,224, +157,85,255,124,90,45,255,10,10,9,147,0,20,15,13,10,170,216,170,97, +255,228,181,107,255,224,165,81,255,194,136,61,255,58,46,29,255,12,12,11, +85,0,4,10,9,7,156,174,91,23,255,202,103,23,255,202,102,21,255,20, +16,9,255,0,24,15,13,10,170,213,155,80,255,227,175,100,255,227,171,98, +255,35,29,20,255,0,32,7,7,6,85,49,33,18,255,183,108,34,255,209, +128,42,255,209,137,60,255,186,134,67,255,95,74,39,255,22,20,15,229,8, +8,7,105,0,44,5,4,4,28,17,15,12,227,216,167,89,255,228,181,107, +255,223,176,102,255,34,28,19,184,0,8,12,11,9,108,180,106,33,255,214, +125,39,255,217,141,52,255,42,33,21,255,4,4,4,85,0,8,11,10,8, +198,211,149,76,255,224,160,77,255,220,144,63,255,34,27,17,255,0,40,12, +10,7,170,189,99,26,255,206,102,25,255,203,100,24,255,30,21,11,176,0, +8,12,10,7,85,167,87,22,255,202,103,23,255,202,102,21,255,27,20,10, +255,4,4,3,68,0,4,4,4,4,28,12,10,7,215,176,91,23,255,203, +104,24,255,202,105,27,255,28,21,13,249,0,24,9,8,8,57,57,47,30, +255,213,167,94,255,228,184,115,255,126,92,47,255,9,9,8,147,0,20,13, +12,10,167,199,131,58,255,220,148,63,255,219,147,62,255,49,38,24,255,6, +6,6,85,0,4,5,5,5,28,15,14,12,227,217,169,94,255,228,183,111, +255,225,174,102,255,31,25,18,241,0,36,5,5,5,28,15,13,10,227,204, +127,45,255,219,133,56,255,221,150,66,255,35,28,18,255,0,68,10,9,9, +85,45,34,21,255,201,110,30,255,192,100,25,255,57,35,16,255,12,10,7, +85,0,24,13,11,6,79,126,68,21,255,191,100,26,255,198,117,37,255,208, +139,65,255,213,155,80,255,214,161,85,255,215,167,92,255,216,167,89,255,215, +160,88,255,49,38,24,170,0,24,7,7,6,76,45,36,24,249,207,164,90, +255,228,183,111,255,143,111,56,255,13,12,10,170,0,28,13,12,8,142,182, +99,25,255,203,108,24,255,202,102,21,255,112,65,23,255,15,13,8,227,6, +6,5,45,0,16,10,8,7,170,171,89,22,255,202,95,23,255,202,103,23, +255,103,64,26,255,20,18,13,255,79,61,36,255,222,173,97,255,227,179,104, +255,224,172,97,255,226,171,99,255,224,176,93,255,36,29,19,207,0,8,12, +10,7,113,176,91,23,255,202,95,23,255,202,102,21,255,27,20,10,255,4, +4,3,74,0,4,4,4,4,28,11,9,6,215,187,101,24,255,216,134,45, +255,226,172,95,255,23,21,16,241,0,8,10,10,9,161,212,160,85,255,226, +172,95,255,222,158,75,255,51,39,24,255,6,6,6,85,0,4,4,4,3, +28,11,10,6,215,176,91,23,255,202,102,21,255,191,102,22,255,22,17,9, +170,0,8,12,10,7,85,167,87,22,255,204,105,25,255,217,133,50,255,35, +28,18,255,0,40,15,13,10,170,199,116,34,255,212,114,35,255,218,139,55, +255,33,27,18,255,0,12,15,13,10,170,213,160,84,255,227,175,100,255,224, +165,81,255,25,21,14,235,0,8,13,11,8,108,184,96,25,255,203,96,24, +255,202,95,23,255,27,20,10,255,4,4,3,71,0,28,10,9,7,170,187, +101,24,255,216,134,45,255,224,167,85,255,54,42,27,255,6,6,6,85,0, +28,10,9,7,170,171,89,22,255,202,103,23,255,202,102,21,255,29,21,10, +170,0,4,11,9,6,42,137,77,24,255,211,136,56,255,215,167,92,255,216, +166,95,255,213,163,84,255,33,28,18,161,0,8,11,10,8,130,184,100,25, +255,203,100,24,255,202,102,21,255,27,20,10,255,4,4,3,74,0,4,4, +4,4,28,11,9,6,215,176,91,23,255,202,103,23,255,202,95,23,255,28, +21,11,190,0,8,10,10,9,161,212,161,89,255,228,174,105,255,223,161,80, +255,33,28,18,255,0,40,10,9,7,167,171,89,22,255,202,103,23,255,202, +102,21,255,29,21,10,170,0,8,12,10,7,85,167,87,22,255,202,103,23, +255,203,108,24,255,68,47,25,255,6,6,5,255,31,26,20,255,220,168,93, +255,220,177,101,255,110,80,41,255,12,11,9,150,0,16,10,9,7,170,171, +89,22,255,202,103,23,255,202,102,21,255,20,16,9,255,0,32,10,9,7, +170,193,111,30,255,219,136,54,255,224,165,81,255,27,24,16,255,0,4,7, +7,7,28,21,20,16,181,10,10,9,85,0,4,12,11,9,170,204,130,51, +255,218,141,51,255,211,122,36,255,32,23,13,187,0,8,13,11,8,85,167, +87,22,255,203,100,24,255,208,105,29,255,23,19,12,255,4,4,3,28,11, +10,8,181,211,158,82,255,229,183,110,255,228,183,111,255,228,183,113,255,228, +181,107,255,27,23,16,229,0,8,10,10,9,150,192,111,31,255,208,112,27, +255,203,108,24,255,21,17,10,255,0,12,15,13,10,170,216,170,97,255,229, +183,110,255,228,181,107,255,25,21,16,235,0,8,11,10,8,142,194,116,33, +255,209,106,30,255,203,108,24,255,27,20,10,255,4,4,3,74,0,36,10, +8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,42,28,13,255,6, +5,5,48,0,4,6,6,6,28,21,19,14,255,221,175,102,255,229,179,114, +255,228,181,107,255,24,20,15,246,0,8,12,11,9,127,190,104,27,255,206, +106,25,255,202,103,23,255,27,20,10,255,4,4,3,74,0,4,4,4,4, +28,11,10,6,215,176,91,23,255,204,105,25,255,207,122,38,255,28,22,15, +238,0,36,5,5,5,28,15,13,10,227,195,111,28,255,204,105,25,255,197, +100,22,255,22,17,9,224,0,24,15,13,10,170,216,170,97,255,229,184,114, +255,228,181,107,255,34,28,19,255,0,24,10,9,7,170,174,91,23,255,202, +103,23,255,202,102,21,255,20,16,9,252,0,12,10,9,7,170,171,89,22, +255,202,107,23,255,206,111,27,255,22,17,11,252,0,8,8,7,7,45,73, +59,36,255,218,174,105,255,228,178,107,255,89,67,36,255,7,7,6,113,0, +4,5,5,4,28,20,18,13,255,199,110,30,255,202,105,27,255,88,54,23, +255,10,9,7,113,0,8,13,11,6,85,167,87,22,255,202,95,23,255,202, +90,23,255,32,24,13,255,4,4,3,178,19,16,12,238,212,163,93,255,66, +52,31,255,5,5,5,184,14,13,11,255,205,133,48,255,212,114,35,255,208, +117,29,255,29,22,14,255,0,16,12,11,9,85,101,74,38,255,189,121,49, +255,185,104,32,255,180,98,25,255,180,93,23,255,154,82,23,255,75,44,18, +255,11,9,6,144,0,32,10,9,7,170,157,79,22,255,202,102,21,255,202, +102,21,255,22,17,9,255,0,28,14,13,11,224,136,98,53,255,217,165,82, +255,213,145,56,255,150,92,35,255,19,16,12,173,5,5,5,8,0,28,10, +8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,20,16,9,252,0, +28,7,7,6,59,43,35,24,255,221,175,102,255,223,178,106,255,134,98,51, +255,14,13,11,142,0,24,10,9,7,167,171,89,22,255,202,103,23,255,202, +102,21,255,20,16,9,255,0,144,12,10,7,170,46,29,13,255,140,74,21, +255,165,86,22,255,167,87,22,255,165,86,22,255,167,87,22,255,185,95,22, +255,198,97,23,255,206,111,27,255,221,146,66,255,23,19,14,249,0,8,10, +10,9,153,212,161,89,255,229,183,110,255,224,165,81,255,28,23,15,255,0, +12,10,8,7,156,171,89,22,255,202,103,23,255,202,102,21,255,31,21,10, +170,0,8,10,10,9,167,212,160,85,255,228,177,105,255,222,158,75,255,27, +23,16,255,0,40,10,8,7,170,167,87,22,255,202,103,23,255,202,102,21, +255,20,16,9,238,0,12,10,8,7,164,171,89,22,255,202,103,23,255,203, +100,24,255,22,18,11,235,0,8,10,10,9,167,214,164,93,255,228,182,109, +255,223,154,80,255,207,120,36,255,189,94,24,255,167,87,22,255,167,87,22, +255,187,96,22,255,198,93,23,255,202,93,21,255,198,96,21,255,26,19,9, +227,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20, +15,9,252,0,16,17,15,12,170,216,170,97,255,229,183,110,255,224,164,85, +255,29,24,16,255,3,3,2,28,0,8,12,11,9,198,211,149,76,255,221, +151,68,255,219,146,60,255,22,19,13,246,0,8,10,10,9,161,210,155,77, +255,223,147,72,255,213,122,42,255,23,18,12,255,0,12,10,8,7,167,171, +89,22,255,202,103,23,255,202,102,21,255,29,21,10,170,0,8,12,10,7, +85,166,87,23,255,209,118,30,255,218,139,55,255,33,27,18,255,0,24,15, +13,10,170,215,159,92,255,226,169,95,255,218,141,59,255,34,26,15,190,0, +8,13,10,6,85,167,87,22,255,202,103,23,255,198,96,21,255,197,96,22, +255,189,97,22,255,198,96,21,255,198,96,21,255,25,19,10,255,4,4,3, +28,0,20,10,9,7,170,178,92,23,255,210,107,31,255,215,128,44,255,33, +24,14,193,0,8,12,10,7,85,167,87,22,255,202,95,23,255,202,103,23, +255,32,22,11,170,0,4,10,8,7,170,171,89,22,255,24,17,9,249,0, +4,12,10,7,85,163,82,22,255,202,103,23,255,202,102,21,255,29,21,10, +170,0,8,12,10,7,85,166,87,23,255,202,103,23,255,202,102,21,255,20, +15,9,255,0,12,10,8,7,167,170,89,23,255,206,106,25,255,208,115,33, +255,28,21,13,207,0,8,13,10,6,85,167,87,22,255,202,95,23,255,202, +102,21,255,20,16,9,255,0,12,15,13,10,170,214,158,85,255,229,183,110, +255,228,185,111,255,24,20,15,249,0,8,12,11,9,108,176,91,23,255,202, +95,23,255,202,102,21,255,18,15,9,255,2,2,1,8,0,8,8,7,5, +184,171,89,22,255,202,95,23,255,202,102,21,255,34,23,11,173,0,8,12, +11,9,136,212,160,85,255,228,180,105,255,225,165,88,255,31,25,18,255,3, +3,2,28,0,8,8,7,5,178,171,89,22,255,202,103,23,255,202,102,21, +255,30,21,11,170,0,8,12,10,7,85,167,87,22,255,202,103,23,255,202, +102,21,255,20,15,9,255,0,40,7,7,6,28,30,27,21,238,167,111,50, +255,206,110,33,255,199,102,24,255,175,90,22,255,165,86,22,255,167,87,22, +255,167,87,22,255,161,87,22,255,84,48,19,255,18,15,9,227,8,7,5, +28,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20, +15,9,252,0,16,15,13,10,170,211,159,76,255,229,180,110,255,228,182,109, +255,34,28,19,255,0,12,10,9,7,170,171,89,22,255,202,103,23,255,202, +102,21,255,31,22,10,170,0,8,7,6,6,28,48,31,15,255,189,93,22, +255,202,102,21,255,45,29,14,255,5,5,4,113,0,4,5,5,4,28,22, +20,15,255,220,169,97,255,226,178,103,255,167,118,54,255,15,13,10,133,0, +8,13,11,6,85,167,87,22,255,202,103,23,255,202,102,21,255,19,15,8, +215,0,4,11,9,6,105,121,65,20,255,26,18,9,190,0,4,9,9,8, +167,208,150,75,255,229,183,110,255,228,181,113,255,37,29,20,255,0,24,8, +8,5,218,167,87,22,255,202,93,21,255,198,104,21,255,23,18,10,255,3, +3,2,51,0,20,10,9,7,153,171,89,22,255,202,95,23,255,202,102,21, +255,20,15,9,255,2,2,1,17,0,8,8,7,5,181,184,100,25,255,215, +119,42,255,224,160,85,255,34,28,19,255,0,20,9,8,6,85,31,22,12, +255,166,87,23,255,189,97,22,255,99,60,22,255,15,13,8,170,0,28,4, +3,3,23,13,11,8,227,182,94,23,255,149,87,26,255,19,17,12,227,7, +7,7,23,0,16,15,13,10,170,216,170,97,255,229,179,114,255,228,182,109, +255,34,28,19,255,0,20,9,8,6,130,69,42,18,255,195,95,22,255,35, +24,12,255,5,5,4,76,0,104,10,9,7,28,27,24,16,184,32,27,19, +255,39,29,20,212,13,12,10,85,0,60,13,11,8,170,81,54,28,255,216, +148,67,255,223,161,72,255,220,147,61,255,117,76,32,255,13,11,8,255,44, +33,19,255,207,123,40,255,217,136,50,255,218,142,53,255,156,100,39,255,18, +15,11,227,10,8,7,28,0,12,15,13,8,125,19,14,10,170,14,11,7, +170,10,8,7,170,11,9,6,122,13,10,8,85,8,7,5,153,46,33,21, +255,212,138,51,255,221,151,68,255,191,132,62,255,19,17,12,176,0,12,7, +7,6,76,26,22,15,241,189,129,58,255,219,152,72,255,217,154,72,255,133, +87,38,255,15,13,10,221,6,6,5,28,0,8,15,12,8,113,20,16,11, +170,17,14,10,142,7,6,6,28,0,8,19,16,12,170,200,117,35,255,212, +123,37,255,115,74,30,255,9,8,6,113,0,8,12,11,9,178,104,73,37, +255,206,147,63,255,178,121,53,255,58,46,29,255,46,36,25,255,40,32,21, +252,19,17,12,85,0,36,12,10,9,164,191,131,60,255,223,161,80,255,221, +151,68,255,46,34,21,255,4,4,3,3,0,20,19,16,12,173,208,134,55, +255,223,156,70,255,216,160,81,255,21,19,14,255,0,16,6,5,5,25,17, +14,10,227,67,48,28,255,94,67,35,255,20,17,13,227,6,6,5,113,12, +11,9,198,67,51,30,255,85,62,32,255,25,20,14,255,9,8,6,82,0, +32,10,8,5,170,161,87,22,255,195,90,20,255,187,91,20,255,19,14,8, +255,0,28,15,12,8,119,20,16,11,170,17,14,10,156,10,8,7,28,0, +64,15,12,8,122,18,15,11,170,17,14,10,144,10,8,7,28,0,16,13, +12,10,170,157,96,36,255,211,123,38,255,199,116,34,255,31,24,16,255,6, +6,6,28,0,20,16,13,11,170,197,110,32,255,209,110,30,255,202,103,23, +255,58,36,15,255,8,7,5,113,0,8,10,8,5,85,137,68,18,255,185, +86,20,255,174,88,19,255,18,13,7,255,0,24,12,10,9,170,204,129,49, +255,220,144,63,255,217,133,50,255,26,20,13,255,0,28,7,6,6,76,23, +19,12,244,185,113,36,255,207,129,52,255,173,117,50,255,59,46,28,255,18, +15,13,198,9,9,8,113,6,6,6,11,0,24,15,12,8,133,22,17,11, +170,17,14,10,142,8,7,5,28,0,12,9,8,6,170,202,128,49,255,220, +148,63,255,219,140,56,255,22,19,13,255,0,8,12,10,9,170,200,125,37, +255,218,141,51,255,220,147,61,255,138,86,35,255,13,10,8,227,11,9,6, +170,13,11,8,198,61,41,22,255,202,111,31,255,204,105,25,255,200,105,21, +255,22,17,9,221,0,12,11,9,6,108,14,11,7,170,11,9,6,139,6, +5,3,17,0,12,9,7,6,133,144,75,19,255,185,86,20,255,178,86,19, +255,27,18,8,170,0,8,11,9,6,85,134,70,19,255,181,88,20,255,180, +87,19,255,24,15,7,178,0,12,10,8,5,99,165,86,22,255,206,111,27, +255,213,124,38,255,36,27,17,255,0,24,10,10,9,133,167,112,48,255,222, +166,77,255,223,157,72,255,54,39,23,255,5,5,4,37,0,20,13,11,8, +170,181,93,22,255,206,111,27,255,214,127,43,255,20,16,11,255,0,12,9, +8,8,170,203,129,50,255,222,145,63,255,220,147,61,255,33,26,16,255,0, +12,12,10,7,113,15,12,8,170,13,10,8,122,0,16,10,8,7,170,200, +120,41,255,220,142,59,255,219,146,60,255,27,21,14,255,0,12,13,11,8, +113,18,15,11,170,17,14,10,142,8,7,5,28,0,12,14,12,9,113,20, +15,11,170,17,14,10,153,10,8,7,28,0,16,9,8,6,85,29,21,10, +255,119,62,20,255,153,79,20,255,40,25,11,255,9,8,6,85,0,20,10, +8,7,28,32,24,13,218,68,47,25,255,61,43,24,255,61,46,28,255,61, +47,28,255,61,47,28,255,66,50,29,255,73,55,32,255,66,48,29,255,24, +20,15,85,0,20,7,6,6,79,32,26,17,244,199,132,54,255,208,150,75, +255,122,87,41,255,17,15,10,170,0,32,10,9,7,28,32,23,11,227,53, +33,14,255,34,23,11,255,12,10,7,190,6,5,5,28,0,20,9,7,4, +170,146,76,19,255,197,99,20,255,204,110,27,255,59,41,22,255,6,6,6, +170,10,9,9,113,31,26,18,184,30,25,17,255,29,25,18,255,34,27,19, +255,37,28,18,221,13,11,8,57,0,8,13,10,6,88,144,75,19,255,185, +86,20,255,178,90,19,255,20,14,7,212,0,12,9,7,4,125,157,81,20, +255,212,117,33,255,220,148,63,255,27,21,14,218,0,8,12,10,9,127,192, +111,31,255,208,112,27,255,202,103,23,255,22,16,9,204,0,12,10,8,5, +93,137,68,18,255,185,94,20,255,180,91,19,255,30,20,9,170,0,8,11, +9,6,85,140,67,19,255,202,106,21,255,214,125,39,255,25,20,14,255,0, +12,6,6,5,28,13,11,8,139,20,16,11,170,19,15,10,142,8,7,5, +28,0,8,10,9,5,142,153,79,20,255,195,90,20,255,206,111,27,255,24, +20,13,255,0,12,12,10,9,170,195,113,32,255,211,115,30,255,203,108,24, +255,31,21,10,173,0,8,11,9,6,85,140,70,19,255,185,86,20,255,180, +87,19,255,24,15,7,181,0,32,9,8,6,170,174,91,23,255,215,123,42, +255,221,150,66,255,25,20,14,255,0,32,9,7,4,170,148,77,19,255,181, +92,20,255,180,87,19,255,25,17,8,170,0,8,34,24,13,170,161,102,38, +255,219,154,70,255,220,142,59,255,213,124,38,255,32,24,13,198,0,8,11, +9,6,85,140,70,19,255,185,86,20,255,178,90,19,255,20,14,7,212,0, +12,8,7,5,127,144,78,19,255,185,86,20,255,180,87,19,255,29,19,10, +170,0,8,13,11,8,116,194,116,33,255,209,110,30,255,202,95,23,255,22, +17,9,221,0,12,10,8,5,85,12,9,5,170,10,8,5,130,6,5,3, +8,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,27, +18,8,170,0,8,11,8,6,85,137,68,18,255,185,86,20,255,200,105,21, +255,29,21,12,255,4,4,4,25,10,9,7,139,154,100,47,255,215,148,70, +255,198,131,45,255,46,34,19,255,11,9,6,88,0,12,10,8,5,119,144, +78,19,255,185,86,20,255,180,87,19,255,21,15,8,210,0,32,13,11,8, +170,199,119,39,255,220,144,63,255,221,155,70,255,27,21,14,255,0,20,10, +9,7,170,171,89,22,255,195,98,20,255,183,89,19,255,29,20,8,170,0, +8,11,9,6,85,139,70,20,255,202,103,23,255,211,118,36,255,28,21,13, +201,0,4,8,8,7,57,118,84,39,255,215,159,86,255,219,149,66,255,216, +129,45,255,211,121,34,255,34,25,13,178,0,8,11,10,6,88,146,76,19, +255,185,94,20,255,178,90,19,255,24,18,9,255,0,12,18,15,11,170,203, +122,42,255,215,126,40,255,209,106,30,255,32,22,13,184,0,8,12,10,7, +85,143,72,20,255,185,94,20,255,178,90,19,255,20,14,7,210,0,40,9, +7,4,170,148,77,19,255,180,87,19,255,178,86,19,255,30,21,9,255,5, +5,4,37,8,7,5,28,20,17,13,227,133,89,38,255,215,142,56,255,216, +129,45,255,209,115,32,255,26,19,11,210,0,8,11,9,6,85,142,74,19, +255,185,86,20,255,178,90,19,255,20,14,7,210,0,12,9,7,4,122,143, +75,20,255,203,108,24,255,216,129,45,255,30,23,15,255,0,12,12,10,7, +110,16,13,9,170,13,10,8,122,0,16,9,8,6,105,142,74,19,255,185, +86,20,255,180,87,19,255,23,16,8,255,0,24,15,13,10,170,203,122,42, +255,215,126,40,255,209,118,30,255,24,17,11,255,0,24,9,8,4,170,148, +77,19,255,181,92,20,255,180,87,19,255,23,16,8,198,0,12,9,7,6, +139,159,82,20,255,203,100,24,255,212,121,33,255,28,21,13,255,0,12,12, +11,9,119,81,59,34,255,216,153,71,255,173,117,50,255,21,18,14,255,10, +10,9,244,11,10,8,255,60,35,15,255,173,85,20,255,84,49,17,255,13, +10,6,170,0,12,10,8,5,130,146,79,19,255,193,89,20,255,203,104,24, +255,120,77,31,255,19,17,12,255,117,80,36,255,219,154,70,255,178,121,53, +255,20,17,13,255,45,33,18,255,184,94,21,255,195,90,20,255,205,106,26, +255,30,22,13,255,0,12,7,7,6,82,35,28,18,255,196,114,33,255,148, +80,25,255,32,22,11,255,20,15,9,255,26,18,9,255,88,49,17,255,149, +78,20,255,40,26,11,255,9,7,4,85,0,28,9,7,4,127,140,70,19, +255,181,88,20,255,180,87,19,255,18,13,7,235,0,24,10,9,7,93,104, +69,35,255,201,131,48,255,194,109,33,255,65,42,20,255,12,10,7,170,0, +36,9,7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,23,16,8, +198,0,32,15,14,10,198,188,133,61,255,219,149,66,255,194,115,37,255,17, +15,10,244,0,24,10,8,5,113,144,78,19,255,185,86,20,255,180,87,19, +255,18,13,7,255,0,140,7,6,4,65,53,31,12,255,162,83,19,255,185, +94,20,255,130,70,21,255,31,22,10,255,25,19,10,198,22,17,9,246,70, +40,15,255,169,87,20,255,200,105,21,255,212,123,37,255,28,21,13,221,0, +8,12,10,9,133,200,127,41,255,210,120,33,255,202,95,23,255,19,14,8, +238,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,28, +19,9,170,0,8,12,10,9,133,194,112,31,255,209,110,30,255,202,102,21, +255,21,15,8,235,0,16,9,7,4,57,12,10,5,88,10,8,5,85,0, +12,10,8,5,125,146,79,19,255,181,88,20,255,180,87,19,255,25,17,8, +195,0,12,10,8,5,119,144,78,19,255,185,94,20,255,200,105,21,255,23, +18,10,221,0,8,11,9,8,153,200,123,41,255,212,117,33,255,202,103,23, +255,111,63,20,255,27,20,10,255,20,16,9,246,22,17,9,249,28,20,9, +198,30,21,9,170,24,17,9,215,28,20,9,201,10,8,5,85,0,16,9, +7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,18,13,7,255,0, +16,11,10,8,113,152,104,47,255,214,134,49,255,204,105,25,255,98,54,19, +255,18,13,9,227,13,10,8,170,14,12,9,198,60,41,21,255,199,112,28, +255,202,102,21,255,202,103,23,255,26,19,11,204,0,8,12,11,9,116,187, +101,24,255,202,93,21,255,187,91,20,255,18,13,7,255,0,12,9,7,4, +170,146,79,19,255,181,88,20,255,178,90,19,255,27,17,8,170,0,8,11, +9,6,85,139,70,20,255,202,103,23,255,212,123,37,255,32,24,15,255,0, +24,13,12,10,170,196,114,33,255,206,106,25,255,196,99,21,255,28,19,9, +170,0,8,11,8,6,85,137,68,18,255,181,88,20,255,178,86,19,255,164, +85,21,255,138,73,21,255,175,93,20,255,178,86,19,255,46,28,11,255,6, +5,3,108,0,20,9,7,4,170,146,76,19,255,189,88,20,255,189,88,20, +255,28,19,9,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,178, +90,19,255,27,17,8,170,0,4,9,7,4,167,146,79,19,255,20,14,7, +252,0,4,11,9,6,85,137,68,18,255,185,94,20,255,178,90,19,255,27, +17,8,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,180,87,19, +255,18,13,7,255,0,12,9,7,4,170,146,79,19,255,185,94,20,255,183, +85,19,255,27,19,8,170,0,8,11,9,6,85,140,73,19,255,181,88,20, +255,178,90,19,255,20,15,7,255,0,12,16,14,11,170,208,143,59,255,223, +156,70,255,216,135,49,255,28,22,13,210,0,8,11,9,6,85,140,70,19, +255,185,94,20,255,178,90,19,255,72,39,13,255,10,8,5,218,8,6,3, +170,9,7,4,193,39,24,10,255,160,82,19,255,185,94,20,255,144,74,23, +255,16,13,9,170,0,8,10,9,7,85,145,101,48,255,218,149,67,255,210, +115,31,255,99,57,19,255,10,8,5,227,8,6,3,170,9,7,4,190,30, +20,9,255,158,81,19,255,185,94,20,255,178,90,19,255,27,17,8,170,0, +8,11,8,6,85,137,68,18,255,185,86,20,255,180,87,19,255,18,13,7, +255,0,44,9,9,8,28,13,12,8,142,27,20,10,170,29,21,10,193,24, +17,9,252,22,17,9,232,22,17,9,255,87,49,18,255,181,88,20,255,178, +90,19,255,100,54,17,255,11,10,6,150,0,16,9,7,4,170,146,79,19, +255,181,88,20,255,180,87,19,255,18,13,7,255,0,16,15,13,10,170,208, +141,55,255,223,156,70,255,217,133,50,255,23,19,12,255,0,12,10,8,5, +122,144,78,19,255,185,86,20,255,180,87,19,255,30,20,9,176,0,12,12, +10,7,85,39,26,12,255,155,80,20,255,99,55,19,255,19,16,12,255,12, +11,9,255,18,15,11,255,119,84,38,255,209,137,60,255,138,86,35,255,18, +15,11,178,0,12,10,8,5,130,144,78,19,255,181,92,20,255,178,90,19, +255,39,24,10,255,6,5,3,210,29,20,8,255,169,87,20,255,97,53,18, +255,8,7,5,255,26,21,15,255,212,142,59,255,221,151,68,255,218,142,53, +255,34,25,15,255,0,20,5,5,4,82,16,12,7,255,160,82,19,255,185, +86,20,255,185,86,20,255,52,29,11,255,7,6,4,170,0,20,8,7,5, +85,83,46,16,255,181,92,20,255,178,86,19,255,87,47,14,255,10,8,5, +224,8,6,3,170,9,7,4,190,29,20,8,255,195,104,24,255,217,136,50, +255,221,155,70,255,30,23,15,255,0,16,8,7,5,85,26,18,9,255,107, +59,20,255,151,80,22,255,60,34,15,255,11,9,6,170,0,36,8,7,5, +170,159,82,20,255,202,118,35,255,66,51,29,255,9,9,8,96,0,16,15, +13,10,170,208,140,59,255,223,156,70,255,215,133,44,255,27,20,12,255,0, +20,14,12,7,244,131,67,20,255,176,89,19,255,17,12,6,255,0,184,17, +14,10,85,171,95,28,255,206,123,33,255,208,123,31,255,207,112,28,255,202, +107,23,255,191,98,22,255,170,91,21,255,195,107,22,255,209,123,30,255,212, +132,37,255,214,134,39,255,211,133,40,255,202,121,35,255,29,21,12,164,0, +8,12,10,7,82,168,98,29,255,202,121,35,255,196,120,31,255,194,115,31, +255,190,115,27,255,185,101,26,255,184,100,25,255,199,107,26,255,208,123,31, +255,168,105,37,255,25,21,14,227,9,8,8,28,0,8,8,8,7,28,39, +30,18,249,183,122,42,255,211,133,40,255,210,133,43,255,161,106,41,255,15, +13,10,221,5,4,4,17,0,8,14,11,7,113,148,83,25,255,193,108,24, +255,180,93,23,255,27,18,10,153,0,8,12,9,7,122,144,78,19,255,180, +91,19,255,83,46,16,255,7,6,4,184,0,8,4,4,3,85,28,21,13, +255,202,121,35,255,209,132,42,255,131,87,36,255,10,9,7,255,5,5,5, +28,0,40,10,9,7,68,86,62,31,255,206,131,43,255,214,130,39,255,76, +50,25,255,7,6,6,113,0,16,5,5,4,28,21,17,12,255,202,121,35, +255,210,135,37,255,157,100,38,255,18,15,11,150,0,16,18,15,9,91,161, +88,24,255,105,64,28,255,11,10,8,170,0,12,8,7,7,85,40,28,17, +255,174,91,23,255,42,27,13,173,0,32,10,8,5,116,133,66,16,255,161, +85,17,255,161,78,17,255,25,16,8,221,0,24,15,12,8,119,170,99,29, +255,203,126,36,255,199,127,34,255,27,20,12,210,0,60,13,11,8,122,170, +99,29,255,204,127,37,255,199,119,34,255,27,20,12,198,0,12,4,4,3, +11,18,13,9,255,154,79,19,255,174,88,19,255,92,51,17,255,12,10,7, +198,0,24,11,9,6,147,142,74,19,255,171,90,18,255,159,81,18,255,17, +12,6,255,0,12,8,7,5,142,133,66,16,255,161,85,17,255,161,85,17, +255,21,14,6,215,0,24,10,9,7,198,190,107,25,255,203,104,24,255,196, +99,21,255,21,15,8,255,2,2,1,14,0,20,9,8,6,37,35,28,18, +255,183,112,36,255,212,132,37,255,178,118,41,255,27,23,16,255,5,5,4, +198,0,32,15,12,8,105,142,79,23,255,189,97,22,255,160,83,21,255,18, +13,7,218,0,12,10,8,7,198,196,114,33,255,214,129,37,255,212,132,37, +255,27,21,12,210,0,8,13,11,8,116,192,114,31,255,210,125,33,255,209, +123,30,255,203,113,26,255,177,91,22,255,159,82,20,255,160,83,21,255,165, +85,20,255,168,89,19,255,163,86,18,255,161,78,17,255,23,15,6,170,0, +8,9,7,4,57,99,48,14,255,142,73,17,255,133,66,16,255,19,13,6, +190,0,12,7,6,4,164,135,66,16,255,161,85,17,255,161,85,17,255,25, +16,6,170,0,8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17, +255,19,13,6,227,0,12,10,8,5,176,190,107,25,255,212,127,35,255,214, +134,39,255,30,21,13,255,0,24,12,10,7,170,194,109,33,255,213,132,36, +255,208,122,29,255,28,20,11,255,0,24,9,7,4,147,136,70,17,255,202, +98,21,255,211,126,34,255,27,20,12,255,3,3,2,28,0,8,10,8,7, +195,180,93,23,255,202,102,21,255,202,102,21,255,25,17,10,221,0,8,13, +11,8,65,129,70,22,255,172,88,21,255,144,78,19,255,22,15,7,176,0, +12,10,8,7,198,198,124,37,255,215,136,42,255,214,134,39,255,27,21,12, +212,0,8,12,10,7,79,151,88,26,255,198,116,29,255,192,109,27,255,25, +18,10,167,0,8,12,9,7,82,119,62,20,255,174,89,21,255,154,79,19, +255,22,15,7,181,0,20,5,5,4,68,20,14,7,249,142,73,17,255,143, +74,18,255,45,26,10,255,10,8,5,85,0,76,7,6,6,85,39,30,18, +255,196,121,41,255,213,135,42,255,115,72,30,255,10,9,7,170,0,40,5, +5,4,17,6,5,5,85,5,5,4,45,0,28,9,7,4,142,146,79,19, +255,204,108,23,255,212,126,33,255,30,22,13,255,3,3,3,40,0,36,10, +8,5,125,133,66,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0, +12,10,8,5,127,136,70,17,255,193,97,20,255,203,108,24,255,30,21,11, +193,0,8,13,10,6,85,134,70,19,255,171,90,18,255,159,81,18,255,17, +12,6,238,0,12,8,6,5,144,135,66,16,255,161,85,17,255,161,85,17, +255,23,15,6,170,0,8,10,7,5,85,133,66,16,255,185,94,20,255,209, +123,30,255,23,18,12,255,3,3,2,28,0,4,5,5,4,28,18,15,11, +227,134,72,21,255,158,81,19,255,143,74,18,255,22,15,7,142,0,8,10, +8,5,85,131,65,16,255,163,79,18,255,178,90,19,255,22,16,9,255,3, +2,2,20,0,8,9,7,6,176,144,78,19,255,175,88,18,255,163,79,18, +255,26,16,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161, +78,17,255,19,13,6,229,0,32,8,7,5,156,144,78,19,255,202,102,21, +255,206,111,27,255,27,20,12,255,0,32,10,8,5,133,135,66,16,255,161, +85,17,255,161,85,17,255,19,13,6,227,0,12,8,7,5,255,172,85,21, +255,189,92,20,255,172,87,19,255,24,16,7,170,0,8,10,8,5,85,129, +64,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0,12,10,8,5, +127,135,66,16,255,161,85,17,255,161,85,17,255,26,16,7,170,0,8,11, +9,6,85,134,70,19,255,171,90,18,255,159,78,18,255,23,15,6,170,0, +8,9,7,4,57,98,49,13,255,139,71,16,255,133,66,16,255,19,13,6, +193,0,12,7,6,4,176,133,66,16,255,161,85,17,255,161,85,17,255,23, +15,6,170,0,8,10,8,5,85,129,64,16,255,165,87,18,255,180,91,19, +255,20,15,9,255,0,4,5,5,4,17,26,21,15,227,126,75,25,255,178, +95,21,255,142,74,19,255,46,28,11,255,10,8,5,57,0,8,10,8,5, +85,131,65,16,255,161,85,17,255,161,85,17,255,17,12,6,252,2,1,1, +8,0,28,13,11,8,170,199,119,34,255,215,136,42,255,214,139,41,255,28, +20,13,255,0,20,8,7,5,170,135,66,16,255,161,85,17,255,161,85,17, +255,23,15,6,170,0,8,10,8,5,85,131,67,16,255,202,102,21,255,211, +127,36,255,22,17,11,249,0,8,16,14,11,201,101,67,28,255,191,98,22, +255,185,94,20,255,172,87,19,255,26,17,7,170,0,8,10,8,5,85,129, +64,16,255,161,85,17,255,161,85,17,255,31,20,8,255,5,5,4,102,0, +4,5,4,4,28,16,13,9,255,164,85,21,255,180,91,19,255,165,87,18, +255,26,17,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161, +85,17,255,19,13,6,212,0,40,10,8,5,133,135,66,16,255,161,85,17, +255,161,85,17,255,26,17,7,255,3,3,2,136,9,7,4,227,131,67,20, +255,197,104,22,255,198,104,21,255,183,93,19,255,172,87,19,255,26,17,7, +170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,19, +13,6,212,0,12,10,8,5,127,135,66,16,255,193,97,20,255,209,123,30, +255,19,15,10,252,0,8,13,11,8,65,125,68,22,255,174,86,21,255,146, +76,19,255,22,14,7,178,0,12,8,6,5,144,135,66,16,255,161,85,17, +255,161,85,17,255,19,14,6,238,0,24,13,11,8,170,163,87,20,255,180, +91,19,255,165,87,18,255,17,12,6,255,0,24,9,7,4,139,135,66,16, +255,161,85,17,255,161,85,17,255,15,11,6,246,0,12,9,7,6,184,180, +93,23,255,211,115,30,255,213,133,38,255,28,20,13,255,0,16,12,11,9, +170,152,91,31,255,188,105,31,255,115,66,22,255,91,50,16,255,84,46,15, +255,116,59,17,255,118,62,17,255,15,11,6,221,0,16,10,8,5,116,146, +79,19,255,202,103,23,255,209,128,32,255,200,127,41,255,167,106,40,255,197, +122,42,255,210,130,35,255,186,106,27,255,88,51,19,255,102,55,17,255,157, +83,18,255,189,92,20,255,209,123,30,255,29,21,12,224,0,8,7,6,6, +28,41,31,18,235,160,84,23,255,170,87,19,255,45,26,10,255,5,5,4, +170,4,4,4,8,4,4,3,99,15,12,6,255,140,72,17,255,138,71,17, +255,45,26,10,255,10,8,5,85,0,24,8,7,5,142,133,66,16,255,161, +85,17,255,161,85,17,255,19,13,6,229,0,24,13,11,8,170,160,86,21, +255,185,90,20,255,91,50,16,255,7,6,4,255,0,40,8,7,5,150,133, +66,16,255,161,85,17,255,161,85,17,255,15,11,6,246,0,32,8,8,7, +110,74,52,27,255,191,103,24,255,176,89,19,255,34,22,9,255,6,5,3, +57,0,20,8,6,5,161,133,66,16,255,161,85,17,255,161,78,17,255,15, +11,6,252,0,140,12,10,5,85,123,61,16,255,161,85,17,255,161,85,17, +255,22,15,7,255,2,2,1,85,0,8,7,6,4,244,133,66,16,255,167, +88,18,255,189,92,20,255,27,19,10,195,0,8,12,10,7,110,160,83,21, +255,177,85,18,255,161,78,17,255,15,11,6,252,0,12,7,6,4,161,133, +66,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0,8,11,9,6, +85,134,70,19,255,171,90,18,255,159,78,18,255,15,11,6,249,0,12,10, +8,5,85,98,49,13,255,135,72,16,255,133,66,16,255,19,13,6,139,0, +8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17,255,15,11,6, +246,0,12,7,6,4,164,133,66,16,255,165,87,18,255,178,90,19,255,24, +17,9,212,0,8,13,11,8,105,165,86,22,255,180,91,19,255,159,81,18, +255,19,14,6,255,2,2,1,79,0,44,8,6,5,167,133,66,16,255,161, +85,17,255,161,85,17,255,15,11,6,252,0,16,7,6,6,28,24,19,13, +227,103,59,20,255,157,83,18,255,154,78,17,255,150,81,19,255,154,79,19, +255,158,81,19,255,162,83,19,255,161,85,17,255,159,81,18,255,163,86,18, +255,27,18,8,170,0,8,11,9,6,85,131,67,16,255,165,87,18,255,161, +85,17,255,15,11,6,252,0,12,8,6,5,167,133,66,16,255,161,85,17, +255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,131,65,16,255,175, +88,18,255,191,96,20,255,25,18,10,255,0,24,11,9,6,170,148,77,19, +255,169,82,18,255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,129, +64,16,255,161,85,17,255,161,85,17,255,87,47,14,255,23,17,8,255,65, +34,12,255,150,76,17,255,132,68,17,255,41,25,10,255,10,8,5,85,0, +16,8,7,5,150,133,66,16,255,161,85,17,255,161,78,17,255,23,15,6, +170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23, +15,6,170,0,4,8,7,5,153,133,66,16,255,19,13,6,238,0,4,10, +8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0, +8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,15,11,6, +252,0,12,8,6,5,167,133,66,16,255,161,85,17,255,161,85,17,255,23, +15,6,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17, +255,31,20,8,255,5,4,4,85,0,4,5,4,4,40,17,14,10,255,200, +120,35,255,207,112,28,255,195,98,20,255,29,20,8,170,0,8,10,8,5, +85,131,65,16,255,163,86,18,255,159,81,18,255,150,76,17,255,137,70,16, +255,135,72,16,255,135,66,16,255,146,75,17,255,159,81,18,255,131,67,20, +255,42,31,17,255,10,9,7,62,0,8,5,5,4,8,26,21,15,227,137, +79,28,255,174,88,19,255,158,83,17,255,137,70,16,255,135,72,16,255,135, +66,16,255,146,75,17,255,159,81,18,255,161,85,17,255,161,85,17,255,23, +15,6,170,0,8,10,8,5,85,131,67,16,255,163,86,18,255,159,81,18, +255,17,12,6,255,0,68,2,1,1,8,7,6,4,249,137,67,16,255,165, +80,18,255,154,78,17,255,27,18,8,170,0,16,8,6,5,167,133,66,16, +255,161,85,17,255,161,85,17,255,15,11,6,252,0,16,13,11,8,170,199, +124,36,255,211,125,32,255,200,105,21,255,18,13,7,255,0,12,7,6,4, +164,133,66,16,255,161,85,17,255,161,78,17,255,19,13,6,227,0,16,8, +7,5,122,68,38,13,255,150,83,23,255,174,107,35,255,181,112,38,255,190, +117,39,255,193,114,36,255,143,84,26,255,15,12,8,212,4,4,3,6,0, +12,10,8,5,108,135,66,16,255,161,85,17,255,161,85,17,255,125,65,16, +255,90,47,13,255,121,60,16,255,164,84,19,255,189,97,22,255,177,104,32, +255,194,123,39,255,212,134,41,255,210,124,31,255,200,105,21,255,23,17,8, +218,0,16,10,8,5,167,56,31,11,255,110,55,15,255,118,62,17,255,115, +58,16,255,115,58,16,255,120,63,17,255,95,46,14,255,17,13,6,227,7, +6,4,28,0,16,14,12,7,227,87,43,14,255,154,78,17,255,152,77,17, +255,139,71,16,255,135,72,16,255,135,66,16,255,146,75,17,255,200,105,21, +255,211,127,36,255,214,134,39,255,23,18,12,255,0,12,7,6,4,85,26, +16,7,255,131,67,16,255,145,75,18,255,78,43,15,255,7,6,4,255,0, +40,10,8,5,136,157,81,20,255,210,129,33,255,139,89,36,255,10,9,7, +198,0,16,13,11,8,170,196,113,31,255,206,114,25,255,189,92,20,255,18, +13,7,244,0,16,5,4,4,88,27,19,8,255,141,73,18,255,161,85,17, +255,21,14,6,218,0,112,12,9,7,99,11,8,6,170,10,8,5,91,0, +60,11,10,8,28,32,23,13,227,108,57,19,255,153,82,18,255,154,78,17, +255,146,75,17,255,97,47,14,255,36,24,11,255,108,64,25,255,203,111,30, +255,207,118,32,255,207,118,32,255,189,110,32,255,63,41,20,255,15,12,8, +76,0,8,9,8,6,28,38,27,15,218,51,33,18,255,48,32,17,255,131, +74,24,255,182,97,21,255,176,89,19,255,170,87,19,255,134,72,21,255,37, +25,14,255,15,13,8,144,7,7,6,28,0,12,11,9,8,127,171,99,28, +255,208,123,31,255,203,124,30,255,104,63,27,255,15,13,10,212,7,6,6, +28,0,12,14,11,7,170,142,74,19,255,161,85,17,255,159,81,18,255,27, +18,8,184,0,8,6,5,3,28,27,17,8,227,92,46,13,255,111,55,14, +255,31,20,8,255,8,6,3,198,9,7,4,170,10,8,5,227,22,16,9, +255,61,39,18,255,107,64,26,255,108,66,25,255,32,22,11,255,9,7,6, +170,0,44,10,9,7,156,56,36,19,255,191,114,32,255,175,98,30,255,41, +27,16,255,11,9,6,57,0,12,21,15,10,227,100,56,21,255,160,83,21, +255,80,44,17,255,14,12,7,190,7,6,6,28,0,16,13,10,6,28,29, +20,10,212,21,15,10,144,0,20,12,9,7,85,39,24,10,173,16,12,7, +85,0,32,6,5,3,20,19,13,6,173,21,14,6,255,21,15,6,215,10, +8,5,85,0,24,15,12,8,170,190,98,23,255,203,108,24,255,202,111,23, +255,23,17,10,255,0,60,17,13,10,170,195,112,30,255,211,124,30,255,205, +106,26,255,31,21,12,255,0,12,8,6,5,139,44,25,9,255,135,72,16, +255,104,54,13,255,15,11,6,249,7,6,4,28,0,24,7,6,4,57,44, +25,9,255,137,73,16,255,143,70,16,255,49,25,8,255,8,6,3,184,8, +6,3,85,8,6,3,142,23,16,6,255,130,66,15,255,145,77,16,255,87, +44,12,255,10,8,5,142,0,20,11,9,8,164,53,31,14,255,150,74,19, +255,154,78,17,255,148,76,17,255,65,33,10,255,10,8,5,184,6,5,5, +28,0,16,11,9,6,142,175,102,30,255,207,123,32,255,208,114,31,255,196, +114,33,255,89,56,26,255,17,13,10,255,11,8,6,170,9,7,6,170,11, +8,6,170,15,11,8,170,18,13,9,142,8,6,5,28,0,8,10,8,5, +93,102,53,17,255,159,81,18,255,154,78,17,255,72,37,11,255,11,8,6, +227,9,7,6,170,11,8,6,198,61,36,20,255,196,107,27,255,204,114,27, +255,182,102,31,255,19,14,10,170,0,8,6,6,5,20,26,19,11,198,28, +20,11,255,22,16,9,255,23,16,8,255,27,18,8,255,24,16,7,255,24, +16,7,255,74,39,11,255,139,68,16,255,143,70,16,255,143,70,16,255,20, +13,5,170,0,8,7,6,4,74,87,44,12,255,155,79,18,255,151,73,16, +255,67,34,10,255,9,7,4,198,9,7,4,96,8,6,5,159,27,17,8, +255,137,67,16,255,158,80,17,255,112,56,15,255,10,8,5,167,0,8,7, +5,4,85,74,36,11,255,150,83,17,255,145,77,16,255,55,29,10,255,8, +6,3,198,8,6,3,88,7,6,4,153,39,24,12,255,199,112,28,255,210, +115,31,255,184,108,33,255,17,14,10,198,0,24,11,9,6,170,139,69,18, +255,168,86,19,255,154,78,17,255,17,12,6,235,0,24,7,6,4,85,64, +32,11,255,162,80,19,255,198,96,21,255,109,63,26,255,15,11,8,227,10, +8,7,170,8,7,5,195,29,18,8,255,137,67,16,255,154,78,17,255,114, +59,15,255,11,10,6,164,0,8,9,7,6,85,97,50,16,255,159,81,18, +255,152,77,17,255,74,36,11,255,10,8,5,198,7,6,4,125,10,8,5, +198,61,36,20,255,200,105,29,255,209,122,28,255,180,104,29,255,16,12,9, +170,0,8,12,10,7,170,160,83,21,255,183,89,19,255,174,88,19,255,28, +19,9,187,0,8,14,10,7,85,143,75,20,255,195,98,20,255,189,92,20, +255,21,15,8,224,0,24,7,6,4,85,26,16,7,255,111,55,14,255,132, +67,15,255,39,23,8,255,8,6,3,113,0,68,9,7,6,85,32,22,13, +255,188,112,31,255,193,114,30,255,94,57,25,255,17,13,10,170,0,44,9, +7,4,142,10,8,5,255,10,8,5,198,6,5,3,28,0,24,8,7,5, +85,88,48,19,255,204,114,27,255,208,118,31,255,111,62,26,255,11,8,6, +227,8,7,5,150,10,8,5,116,10,8,5,88,9,7,4,85,6,5,3, +74,0,16,10,8,5,99,114,56,13,255,143,70,16,255,143,70,16,255,18, +12,5,215,0,12,8,7,3,130,118,60,13,255,148,76,17,255,150,76,17, +255,24,16,7,170,0,8,9,7,4,85,114,56,13,255,145,74,16,255,143, +70,16,255,52,28,9,255,8,6,3,198,8,6,3,88,8,6,3,144,23, +15,6,255,130,66,15,255,151,80,16,255,111,55,14,255,10,8,5,144,0, +8,6,5,3,59,59,32,10,255,157,83,18,255,185,90,20,255,97,54,22, +255,14,10,7,227,13,10,6,170,13,10,6,255,84,41,13,255,148,76,17, +255,155,82,18,255,135,66,16,255,14,10,5,159,0,8,9,7,4,85,114, +56,13,255,145,77,16,255,145,74,16,255,55,28,10,255,9,7,4,198,8, +6,3,93,8,6,3,147,25,16,6,255,130,64,15,255,151,80,16,255,111, +55,14,255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,145,77,16, +255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3,102,8,6,3, +139,8,6,3,170,9,8,4,113,0,12,10,8,5,91,114,56,13,255,150, +76,17,255,150,76,17,255,17,12,6,252,0,32,7,6,4,85,64,33,11, +255,145,77,16,255,143,70,16,255,56,29,9,255,8,6,3,198,8,6,3, +85,6,5,3,119,14,11,5,255,128,66,15,255,151,73,16,255,143,76,16, +255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143, +70,16,255,18,12,5,215,0,12,8,7,3,130,114,56,13,255,143,70,16, +255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143, +70,16,255,143,70,16,255,20,13,5,170,0,8,7,6,4,71,87,44,12, +255,158,87,17,255,161,85,17,255,103,53,20,255,15,11,8,227,10,8,7, +170,10,8,7,195,33,20,10,255,137,67,16,255,151,73,16,255,111,55,14, +255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,146, +75,17,255,18,13,7,255,0,8,7,6,6,74,24,16,7,255,132,67,15, +255,145,77,16,255,135,72,16,255,14,10,5,170,0,8,9,7,4,85,114, +56,13,255,145,77,16,255,143,70,16,255,58,31,11,255,11,8,6,227,11, +9,6,170,11,8,6,170,10,7,5,170,9,8,4,113,0,12,11,9,6, +161,175,92,24,255,203,108,24,255,198,101,23,255,25,18,10,255,0,20,8, +6,3,147,114,56,13,255,143,70,16,255,143,70,16,255,20,13,5,170,0, +8,9,7,4,85,114,56,13,255,170,87,19,255,199,106,24,255,24,17,11, +255,0,8,6,6,5,28,15,12,6,255,128,66,15,255,145,74,16,255,143, +70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145,77,16, +255,143,70,16,255,90,44,13,255,19,13,6,255,10,8,5,255,13,10,6, +255,62,33,11,255,135,72,16,255,151,73,16,255,108,53,13,255,10,8,5, +142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18, +12,5,215,0,40,7,6,4,85,64,33,11,255,145,77,16,255,143,70,16, +255,67,34,10,255,14,10,5,255,49,27,9,255,140,72,17,255,160,85,19, +255,160,85,19,255,110,55,15,255,31,20,8,255,9,7,4,57,0,8,9, +8,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18,12,5,215,0, +12,8,7,3,136,118,60,13,255,154,75,17,255,172,87,19,255,24,17,9, +204,0,8,8,7,5,85,95,49,16,255,161,85,17,255,152,77,17,255,71, +34,10,255,9,7,4,198,8,6,3,88,8,6,3,142,23,15,6,255,130, +66,15,255,151,80,16,255,111,55,14,255,14,10,5,170,0,24,9,7,4, +164,118,56,15,255,145,74,16,255,143,70,16,255,16,12,5,224,0,24,9, +7,4,85,85,43,12,255,151,80,16,255,143,70,16,255,55,29,10,255,8, +6,3,198,8,6,3,93,8,6,5,173,45,27,14,255,199,112,28,255,210, +124,31,255,199,119,34,255,19,15,10,221,0,20,13,11,8,170,46,28,11, +255,131,65,16,255,145,74,16,255,137,67,16,255,70,35,11,255,12,10,5, +224,7,6,4,28,0,16,8,6,5,34,37,25,14,255,181,100,28,255,206, +113,31,255,207,123,32,255,199,119,34,255,107,67,28,255,28,20,11,255,28, +19,9,255,84,41,13,255,141,75,16,255,145,74,16,255,159,82,20,255,88, +53,25,255,13,11,8,99,0,8,13,10,6,85,114,60,17,255,148,76,17, +255,143,70,16,255,21,14,6,255,0,12,10,8,5,170,119,61,14,255,145, +77,16,255,135,72,16,255,19,13,6,170,0,24,8,7,3,142,114,56,13, +255,143,70,16,255,143,70,16,255,16,12,5,218,0,24,11,8,6,170,126, +62,15,255,151,80,16,255,112,57,13,255,19,13,6,255,8,6,3,144,8, +6,3,85,9,7,4,113,8,6,3,167,8,6,3,170,8,6,3,170,9, +8,4,113,0,12,10,8,5,91,114,56,13,255,145,74,16,255,143,70,16, +255,61,32,10,255,9,8,4,170,0,32,12,10,7,207,74,36,11,255,139, +74,16,255,79,40,12,255,10,8,5,210,0,16,9,7,4,85,27,17,6, +255,130,66,15,255,143,70,16,255,143,76,16,255,16,12,5,221,0,140,8, +6,3,85,74,39,11,255,145,77,16,255,143,70,16,255,41,23,8,255,7, +6,4,173,5,5,2,85,6,5,3,113,14,10,5,255,129,65,14,255,145, +74,16,255,145,74,16,255,24,16,7,170,0,8,10,8,5,85,112,57,13, +255,145,77,16,255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3, +88,8,6,3,144,23,15,6,255,130,66,15,255,151,80,16,255,111,55,14, +255,10,8,5,144,0,8,6,5,3,59,63,34,10,255,145,77,16,255,143, +70,16,255,55,29,10,255,8,6,3,198,8,6,3,85,8,6,3,144,32, +19,7,255,139,74,16,255,155,79,18,255,135,66,16,255,14,10,5,170,0, +8,6,5,3,57,57,31,10,255,145,77,16,255,143,70,16,255,55,29,10, +255,8,6,3,198,8,6,3,88,8,6,3,144,21,15,6,255,130,66,15, +255,143,76,16,255,146,75,17,255,24,15,7,184,0,8,7,6,4,71,66, +33,11,255,148,79,17,255,143,70,16,255,45,25,8,255,7,5,4,176,7, +5,4,85,8,6,3,85,9,7,4,85,8,6,3,82,0,28,8,7,3, +136,114,56,13,255,143,70,16,255,143,70,16,255,16,12,5,221,0,20,7, +6,4,28,10,8,5,130,19,13,6,170,29,19,8,173,24,16,7,212,27, +18,8,193,20,13,7,246,55,29,10,255,139,74,16,255,143,70,16,255,143, +70,16,255,18,13,5,170,0,8,9,7,4,85,115,54,14,255,143,70,16, +255,143,70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143, +70,16,255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13, +255,145,74,16,255,145,74,16,255,17,11,6,252,0,24,10,8,5,170,119, +61,14,255,145,74,16,255,143,70,16,255,18,13,5,170,0,8,9,7,4, +85,114,56,13,255,143,70,16,255,143,70,16,255,33,20,8,255,5,4,4, +195,8,6,5,198,46,26,9,255,126,62,15,255,132,67,15,255,35,22,8, +255,9,7,4,93,0,12,10,8,5,93,114,56,13,255,143,70,16,255,143, +70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16, +255,143,70,16,255,20,13,5,170,0,4,9,7,4,125,114,56,13,255,21, +13,6,210,0,4,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16, +255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143, +70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143,70,16, +255,143,70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145, +77,16,255,143,70,16,255,90,44,13,255,17,12,6,255,12,9,5,255,20, +15,9,255,97,51,20,255,169,87,20,255,161,85,17,255,112,54,15,255,10, +8,5,142,0,8,9,7,4,85,121,60,16,255,174,88,19,255,176,89,19, +255,112,59,17,255,37,23,10,255,26,16,7,255,25,18,8,255,24,15,7, +255,23,16,8,255,18,13,9,198,10,9,7,99,0,16,9,8,6,34,12, +10,7,167,20,14,7,210,21,15,6,255,26,17,7,255,24,16,7,255,26, +17,7,255,70,35,11,255,142,73,17,255,148,76,17,255,152,77,17,255,24, +15,7,170,0,8,13,10,6,96,129,65,18,255,170,87,19,255,170,87,19, +255,24,16,9,255,0,48,5,4,2,76,8,6,3,85,8,6,3,85,8, +6,3,85,7,5,4,85,6,5,3,119,16,11,5,255,129,65,14,255,151, +73,16,255,118,61,15,255,14,10,5,170,0,16,8,7,3,136,114,56,13, +255,143,70,16,255,143,70,16,255,16,12,5,221,0,16,10,8,7,113,109, +67,26,255,184,90,21,255,148,76,17,255,52,28,9,255,8,6,3,198,8, +6,3,88,8,6,3,144,21,15,6,255,130,66,15,255,143,76,16,255,143, +76,16,255,16,12,5,227,0,20,9,8,6,170,67,42,20,255,202,124,31, +255,208,128,33,255,205,106,26,255,104,58,21,255,14,11,7,218,6,5,5, +28,0,16,7,6,4,28,27,17,8,229,102,51,13,255,139,68,16,255,143, +73,16,255,145,74,16,255,71,37,12,255,26,18,9,255,80,50,23,255,204, +122,33,255,208,115,33,255,202,104,25,255,149,78,20,255,52,30,11,255,10, +8,5,85,0,12,14,10,5,170,85,43,12,255,137,73,16,255,77,39,12, +255,14,10,5,227,10,8,5,170,10,8,5,198,46,26,9,255,137,73,16, +255,115,59,14,255,25,16,6,232,8,6,3,31,0,12,6,5,3,28,10, +8,5,119,19,13,6,170,29,19,8,173,26,16,7,210,27,18,8,187,17, +12,6,246,58,30,11,255,151,77,18,255,192,97,21,255,192,97,21,255,24, +16,9,207,0,8,4,4,3,3,25,16,6,235,115,59,14,255,143,73,16, +255,145,77,16,255,108,53,13,255,21,14,6,255,7,6,4,164,10,7,5, +85,8,7,5,147,9,7,4,136,8,6,5,76,0,20,8,6,5,57,58, +33,13,255,188,107,27,255,192,111,31,255,85,51,24,255,18,13,9,187,6, +5,5,20,0,8,11,9,6,156,139,69,18,255,158,83,17,255,148,76,17, +255,23,15,6,170,0,12,9,7,4,85,19,13,6,255,102,51,13,255,128, +66,15,255,81,41,12,255,12,9,5,142,0,108,13,10,8,85,115,60,24, +255,162,75,23,255,121,60,20,255,23,15,8,142,0,60,3,3,2,6,10, +8,5,170,93,48,12,255,123,65,14,255,123,60,14,255,14,10,5,227,3, +3,2,85,12,10,7,170,163,83,24,255,199,99,26,255,193,96,24,255,41, +26,14,227,6,6,5,45,0,24,3,3,2,28,11,8,6,170,106,50,13, +255,129,63,14,255,129,63,14,255,29,18,8,227,6,5,5,31,0,20,13, +10,8,136,144,73,21,255,182,89,21,255,99,55,19,255,14,11,7,187,4, +4,3,3,0,16,9,7,4,113,93,46,12,255,131,66,14,255,121,62,14, +255,16,11,5,170,0,12,7,6,4,28,14,10,5,227,100,50,13,255,110, +59,13,255,103,52,14,255,121,59,18,255,134,69,21,255,32,21,11,255,6, +5,5,198,10,8,7,227,46,28,13,255,104,51,15,255,96,46,13,255,14, +10,5,139,0,44,10,8,7,108,63,37,18,255,176,88,23,255,160,80,21, +255,20,14,9,170,0,8,8,6,5,79,85,41,12,255,131,65,16,255,66, +34,11,255,10,8,5,170,0,144,9,7,4,167,115,56,16,255,165,85,20, +255,112,65,23,255,18,13,9,142,0,60,13,10,8,142,132,68,21,255,162, +80,19,255,141,70,18,255,17,12,6,181,0,12,17,12,6,255,103,54,14, +255,130,66,15,255,31,20,8,255,6,5,3,113,0,32,8,6,3,156,35, +22,8,255,114,58,13,255,110,59,13,255,88,45,11,255,88,42,11,255,92, +47,11,255,104,54,13,255,119,58,14,255,61,32,10,255,10,8,5,224,5, +4,4,20,0,16,11,8,6,85,113,58,22,255,180,90,23,255,140,69,17, +255,123,63,14,255,123,60,14,255,119,56,14,255,120,61,17,255,24,15,9, +167,0,16,12,10,7,133,180,88,27,255,203,107,30,255,199,100,28,255,197, +104,28,255,191,93,28,255,167,78,24,255,132,68,21,255,121,62,18,255,117, +60,18,255,118,57,17,255,108,50,15,255,17,12,6,113,0,12,14,10,5, +227,65,33,10,255,115,59,14,255,115,59,14,255,109,52,14,255,116,57,17, +255,121,59,18,255,139,68,20,255,154,73,19,255,115,62,20,255,33,23,12, +255,9,8,6,71,0,36,2,2,1,8,8,6,3,170,93,50,12,255,125, +64,14,255,123,60,14,255,14,10,5,159,0,12,14,10,5,224,65,33,10, +255,115,59,14,255,115,59,14,255,109,52,14,255,119,61,18,255,129,66,20, +255,148,75,21,255,170,84,21,255,129,67,22,255,37,25,14,255,8,7,5, +57,0,8,5,5,4,23,24,17,9,255,103,54,18,255,132,63,17,255,120, +62,15,255,98,49,13,255,90,45,11,255,94,45,13,255,124,60,17,255,172, +81,21,255,150,78,25,255,44,29,17,255,9,8,6,91,0,24,8,7,3, +102,93,46,12,255,125,64,14,255,121,62,14,255,18,12,5,170,0,28,12, +10,5,227,64,33,11,255,132,66,17,255,158,79,21,255,151,70,22,255,130, +67,21,255,110,53,15,255,108,53,13,255,118,60,13,255,85,43,12,255,21, +14,6,255,7,6,4,57,0,12,14,10,5,227,65,33,10,255,131,65,16, +255,149,72,20,255,133,68,20,255,111,54,16,255,110,53,15,255,138,72,19, +255,163,81,20,255,112,58,19,255,28,20,9,255,8,7,5,57,0,8,9, +7,4,91,96,48,13,255,132,70,15,255,123,60,14,255,14,10,5,161,0, +8,13,10,6,85,148,73,23,255,202,101,27,255,129,67,26,255,18,13,9, +142,0,28,6,5,3,48,17,12,6,227,108,55,13,255,112,55,13,255,35, +22,8,255,9,7,4,57,0,64,32,22,13,255,137,68,22,255,154,73,19, +255,45,26,10,255,8,6,5,144,0,44,8,6,3,68,67,34,10,255,115, +56,16,255,109,52,14,255,16,11,5,147,0,24,5,4,4,11,22,17,11, +227,129,76,28,255,195,95,28,255,186,84,23,255,121,59,18,255,107,51,14, +255,96,46,13,255,90,45,11,255,88,45,11,255,41,24,8,255,12,10,5, +176,0,12,8,6,3,76,88,44,11,255,125,66,14,255,123,60,14,255,18, +12,5,170,0,12,9,7,4,85,92,47,11,255,125,64,14,255,123,60,14, +255,16,11,5,150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123, +60,14,255,114,58,13,255,93,50,12,255,88,44,11,255,92,47,11,255,104, +54,13,255,119,58,14,255,85,43,12,255,21,15,6,255,7,6,4,51,0, +12,12,10,5,221,61,32,10,255,120,62,15,255,123,61,16,255,109,52,14, +255,96,46,13,255,102,51,13,255,115,59,14,255,123,65,14,255,85,43,12, +255,25,16,6,255,7,6,4,51,0,8,8,6,3,74,88,45,11,255,125, +64,14,255,123,60,14,255,114,58,13,255,93,50,12,255,88,45,11,255,92, +47,11,255,104,52,13,255,118,60,13,255,85,43,12,255,21,15,6,255,7, +5,4,40,0,8,8,6,3,74,88,45,11,255,125,64,14,255,123,60,14, +255,114,58,13,255,93,50,12,255,88,45,11,255,92,43,11,255,93,50,12, +255,93,50,12,255,20,13,5,85,0,8,8,6,3,65,88,45,11,255,125, +64,14,255,121,62,14,255,18,13,5,170,0,36,12,10,5,227,59,31,10, +255,115,62,14,255,114,58,13,255,93,50,12,255,88,44,11,255,88,44,11, +255,104,54,13,255,118,60,13,255,123,60,14,255,123,60,14,255,14,10,5, +150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18, +12,5,170,0,12,9,7,4,85,92,47,11,255,125,66,14,255,123,65,14, +255,14,10,5,150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123, +65,14,255,14,10,5,159,0,12,14,10,5,221,70,35,11,255,155,74,20, +255,193,89,26,255,185,91,28,255,172,85,27,255,165,80,24,255,155,78,22, +255,132,66,17,255,90,44,13,255,21,15,6,255,7,5,4,40,0,8,8, +6,3,74,88,45,11,255,125,64,14,255,121,62,14,255,19,13,6,176,0, +12,9,6,4,133,93,50,12,255,131,66,14,255,123,65,14,255,14,11,5, +150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123,60,14,255,118, +56,15,255,120,61,17,255,136,67,21,255,118,57,17,255,96,48,13,255,92, +47,11,255,18,12,5,85,0,8,9,7,4,79,104,51,15,255,140,66,17, +255,135,66,16,255,17,12,6,198,0,20,9,7,4,85,92,47,11,255,125, +66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3,65,88,45,11, +255,135,66,16,255,136,67,17,255,22,14,7,198,0,12,8,6,3,119,88, +45,11,255,125,64,14,255,123,60,14,255,14,10,5,159,0,12,12,10,5, +210,59,31,10,255,115,62,14,255,118,60,13,255,104,54,13,255,100,50,13, +255,100,50,13,255,114,58,13,255,119,63,14,255,85,43,12,255,21,15,6, +255,7,5,4,40,0,8,8,6,3,74,88,45,11,255,125,66,14,255,123, +60,14,255,18,12,5,170,0,44,12,10,5,227,59,31,10,255,115,62,14, +255,114,58,13,255,100,50,13,255,114,56,13,255,133,66,16,255,160,80,21, +255,176,83,21,255,45,27,12,255,6,5,3,170,0,12,8,6,3,82,88, +45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9,7,4, +85,92,47,11,255,131,61,14,255,126,62,15,255,17,11,6,170,0,12,14, +10,5,227,65,33,10,255,115,59,14,255,115,62,14,255,93,50,12,255,88, +44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12,255,21, +15,6,255,7,6,4,57,0,24,9,7,4,85,92,47,11,255,125,66,14, +255,123,60,14,255,18,12,5,170,0,24,5,5,4,28,19,13,6,255,84, +42,11,255,115,62,14,255,110,59,13,255,93,50,12,255,84,44,11,255,106, +54,15,255,176,84,23,255,199,100,28,255,188,101,31,255,90,54,25,255,13, +10,8,142,0,24,8,6,3,164,72,37,11,255,131,66,14,255,110,54,13, +255,12,9,5,224,3,3,2,17,0,24,7,6,6,85,30,20,13,255,190, +96,27,255,199,98,24,255,121,69,22,255,13,10,6,190,4,3,3,28,5, +4,2,105,27,17,6,255,114,56,13,255,125,64,14,255,45,26,10,255,8, +7,5,153,0,12,10,7,5,85,96,48,13,255,125,64,14,255,123,60,14, +255,16,11,5,195,0,12,8,6,3,110,92,47,11,255,131,66,14,255,123, +65,14,255,18,13,5,170,0,24,9,7,4,85,92,47,11,255,125,66,14, +255,123,60,14,255,18,12,5,170,0,24,8,7,3,99,93,50,12,255,125, +66,14,255,115,59,14,255,104,54,13,255,88,45,11,255,88,44,11,255,92, +43,11,255,92,43,11,255,92,43,11,255,93,50,12,255,93,50,12,255,20, +13,5,85,0,8,8,6,3,65,88,45,11,255,125,64,14,255,123,60,14, +255,115,62,14,255,93,46,12,255,16,11,5,127,0,28,5,4,4,28,12, +10,5,246,104,54,13,255,115,59,14,255,39,23,8,255,8,6,3,82,0, +12,58,31,9,255,114,58,13,255,119,63,14,255,123,60,14,255,123,65,14, +255,18,12,5,170,0,144,14,10,5,227,59,31,10,255,115,62,14,255,110, +59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,104,54,13,255,115, +59,14,255,123,60,14,255,123,60,14,255,16,11,5,150,0,8,8,6,3, +65,88,44,11,255,125,64,14,255,123,60,14,255,114,58,13,255,93,50,12, +255,88,44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12, +255,21,15,6,255,7,6,4,51,0,12,12,9,5,224,63,32,10,255,115, +62,14,255,114,56,13,255,93,50,12,255,88,44,11,255,88,45,11,255,110, +59,13,255,119,61,14,255,85,43,12,255,25,16,6,255,7,6,4,57,0, +12,12,10,5,221,59,31,10,255,115,62,14,255,114,56,13,255,93,50,12, +255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14, +255,121,62,14,255,16,11,5,167,0,12,12,10,5,218,59,31,10,255,115, +62,14,255,110,59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,88, +45,11,255,88,44,11,255,16,11,5,105,0,24,9,7,4,85,92,47,11, +255,125,66,14,255,123,60,14,255,18,12,5,170,0,48,7,5,4,198,93, +50,12,255,125,66,14,255,123,60,14,255,12,10,5,170,0,8,8,6,3, +65,88,45,11,255,125,66,14,255,123,65,14,255,18,12,5,170,0,12,9, +7,4,85,92,47,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0, +8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18,13,5, +170,0,20,3,3,2,11,9,7,4,227,100,50,13,255,123,60,14,255,123, +60,14,255,12,10,5,170,0,8,8,6,3,62,88,45,11,255,125,66,14, +255,123,60,14,255,14,10,5,198,0,8,8,6,3,170,35,22,8,255,115, +59,14,255,112,55,13,255,33,21,8,255,8,6,3,37,0,8,8,6,3, +74,88,45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8, +6,3,65,88,45,11,255,125,66,14,255,123,65,14,255,14,11,5,147,0, +4,9,7,4,85,92,47,11,255,20,13,5,170,0,4,8,6,3,62,88, +45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3, +65,88,45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9, +7,4,85,92,47,11,255,125,66,14,255,123,60,14,255,14,10,5,159,0, +12,12,10,5,210,59,31,10,255,115,59,14,255,118,60,13,255,104,54,13, +255,102,51,13,255,112,53,13,255,122,63,15,255,123,58,14,255,85,43,12, +255,21,15,6,255,7,5,4,45,0,8,8,6,3,85,113,55,16,255,196, +92,23,255,195,96,24,255,25,17,10,255,4,3,3,79,0,64,3,2,2, +28,10,8,5,227,138,71,21,255,177,87,20,255,174,86,21,255,24,16,9, +170,0,8,13,10,8,85,142,73,23,255,195,96,24,255,194,91,23,255,24, +17,11,227,0,44,12,9,5,150,35,22,8,255,80,42,11,255,84,44,11, +255,88,44,11,255,80,42,11,255,88,44,11,255,97,50,12,255,118,60,13, +255,85,43,12,255,21,15,6,255,8,6,3,57,0,16,9,7,4,85,92, +47,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,16,6,5,5, +28,17,13,8,227,68,34,11,255,115,59,14,255,110,59,13,255,93,50,12, +255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14, +255,123,65,14,255,18,12,5,170,0,24,12,9,7,170,131,69,24,255,191, +90,22,255,136,71,19,255,15,11,6,227,4,3,3,17,0,24,7,6,4, +31,16,11,5,227,104,52,13,255,131,66,14,255,98,49,13,255,10,8,5, +193,3,2,2,68,8,7,5,170,121,66,26,255,195,96,24,255,156,74,19, +255,34,21,9,255,9,7,4,85,0,12,8,6,3,51,69,35,10,255,121, +62,14,255,123,60,14,255,16,11,5,227,4,3,3,28,0,8,8,6,3, +170,92,47,11,255,125,64,14,255,108,55,13,255,14,10,5,164,0,40,7, +5,4,198,96,48,13,255,134,65,15,255,133,66,16,255,15,11,6,170,0, +8,7,5,4,85,78,39,11,255,130,64,15,255,130,64,15,255,134,65,15, +255,136,67,17,255,124,62,17,255,114,56,17,255,113,55,16,255,118,60,17, +255,107,55,20,255,48,29,15,255,12,10,7,85,0,20,9,8,6,170,45, +27,12,255,139,70,20,255,131,66,18,255,107,53,14,255,19,13,6,99,0, +8,8,6,5,85,92,46,13,255,131,61,14,255,125,64,14,255,14,10,5, +170,0,12,58,31,9,255,110,59,13,255,115,59,14,255,56,29,9,255,10, +8,5,227,5,4,4,23,0,108,10,8,7,28,28,18,11,212,49,28,16, +255,35,21,12,241,13,10,6,85,0,68,14,10,5,142,20,14,5,170,16, +12,5,164,8,6,3,28,0,8,24,16,9,142,21,15,8,252,23,15,8, +184,11,8,6,34,0,36,14,10,5,142,20,14,5,170,16,11,5,170,10, +8,5,28,0,24,7,6,4,25,20,13,7,147,22,15,7,170,10,8,5, +142,5,4,4,3,0,24,14,10,5,142,20,13,5,170,16,11,5,170,9, +7,4,28,0,16,7,5,4,28,14,10,5,156,14,10,5,229,24,15,9, +255,32,20,11,255,28,18,11,244,12,9,7,108,0,8,10,8,5,142,19, +13,8,235,24,15,7,227,10,8,5,59,0,48,10,8,5,93,23,15,8, +170,28,18,9,173,15,11,6,28,0,12,18,12,5,142,21,14,6,170,9, +7,4,133,0,148,8,6,5,113,89,44,14,255,100,51,21,255,13,10,8, +227,6,5,5,28,0,60,6,5,5,8,17,12,6,142,26,16,7,170,18, +12,5,170,9,7,4,28,0,8,6,5,3,85,54,28,11,255,136,66,19, +255,121,59,18,255,15,10,6,241,0,40,8,6,3,57,12,9,5,170,18, +13,5,178,14,10,5,241,14,10,5,255,14,10,5,252,16,11,5,195,16, +11,5,170,8,6,3,113,0,24,8,6,5,28,24,16,9,204,24,17,9, +255,17,12,6,210,14,10,5,170,16,11,5,170,17,11,6,246,27,17,10, +246,14,10,7,85,0,16,8,6,5,28,21,14,10,195,22,15,11,255,18, +13,9,255,18,13,9,255,22,15,9,255,19,13,8,255,17,12,6,255,17, +11,6,255,15,11,6,255,17,12,6,255,19,13,6,204,12,9,5,28,0, +12,5,4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5, +235,15,11,6,255,15,11,6,255,19,12,6,204,19,13,6,170,10,8,5, +170,8,6,5,57,0,48,14,10,5,142,21,13,6,170,16,11,5,170,9, +7,4,28,0,12,5,4,2,25,8,6,3,125,14,10,5,170,14,10,5, +210,23,15,8,255,30,20,11,255,30,20,11,255,23,17,10,255,20,14,9, +244,16,12,9,170,9,8,6,79,0,16,9,7,6,65,15,11,8,170,17, +12,8,232,21,14,8,255,26,16,9,255,23,15,8,255,21,14,8,255,15, +11,6,255,22,15,7,178,11,9,6,170,10,8,7,57,0,32,12,10,5, +142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,5,5,4,28,8, +6,3,133,15,11,6,193,20,15,9,255,28,18,11,255,30,20,11,255,26, +16,9,255,14,10,5,238,16,11,5,170,9,7,4,153,7,5,4,57,0, +16,5,4,2,28,8,6,3,142,18,12,7,207,22,15,9,255,28,18,11, +255,27,18,10,255,18,13,7,255,15,11,6,227,21,13,6,170,10,7,5, +164,7,6,4,57,0,16,14,10,5,142,20,13,5,170,16,12,5,170,9, +7,4,28,0,8,10,8,7,119,149,64,26,255,131,63,26,255,14,11,7, +227,6,5,5,28,0,32,7,5,4,28,14,10,5,156,20,13,5,170,12, +9,5,142,6,5,3,6,0,64,12,10,7,142,24,15,7,170,21,13,6, +170,8,6,3,76,0,48,9,7,6,85,83,43,16,255,176,88,23,255,130, +62,21,255,16,11,7,170,0,28,9,8,6,28,13,10,8,164,23,16,10, +190,16,11,7,252,15,11,6,255,14,10,5,255,14,10,5,255,14,10,5, +255,16,11,5,232,14,10,5,170,8,6,3,85,0,16,14,10,5,142,21, +13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5,142,20,13,5, +170,16,11,5,170,9,7,4,28,0,12,14,10,5,136,16,12,5,170,16, +11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5,249,16, +12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5,5,4, +28,8,6,3,125,14,10,5,170,18,12,5,176,14,10,5,238,14,10,5, +246,16,12,5,195,18,13,5,170,16,11,5,170,9,7,4,150,7,5,4, +54,0,16,14,10,5,142,16,12,5,170,16,11,5,170,18,12,5,170,16, +11,5,210,14,10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9, +7,4,153,7,6,4,57,0,16,14,10,5,142,16,12,5,170,16,11,5, +170,18,12,5,170,16,11,5,210,14,10,5,252,12,9,5,255,16,11,5, +255,20,13,5,201,11,9,4,28,0,12,14,10,5,139,20,13,5,170,16, +11,5,170,9,7,4,28,0,36,5,5,4,28,8,6,3,125,14,10,5, +170,18,13,5,176,14,10,5,238,14,10,5,255,16,11,5,235,18,13,5, +173,16,11,5,170,16,12,5,170,16,11,5,164,9,7,4,28,0,12,12, +9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5, +142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21, +13,6,170,16,11,5,170,9,7,4,28,0,12,6,5,3,28,8,7,5, +139,19,13,8,193,21,15,10,255,31,21,12,255,32,21,13,255,31,20,12, +255,23,17,10,255,18,12,7,212,10,8,5,159,7,6,4,57,0,16,14, +10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5, +142,21,13,6,170,16,12,5,170,9,7,4,28,0,12,14,10,5,136,16, +12,5,170,16,11,5,170,18,12,5,176,17,12,6,252,21,14,8,255,17, +12,6,255,16,11,5,255,20,13,5,204,11,9,4,28,0,12,14,10,5, +142,21,14,6,170,18,12,5,170,9,8,4,28,0,24,14,10,5,142,20, +13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6, +170,16,12,5,170,10,8,5,28,0,16,12,9,5,142,20,13,5,170,16, +11,5,170,9,7,4,28,0,12,5,5,4,28,8,6,3,125,14,10,5, +170,18,12,5,170,20,14,5,173,16,12,5,193,20,13,5,178,20,13,5, +170,16,11,5,170,9,7,4,153,7,6,4,57,0,16,14,10,5,142,21, +13,6,170,16,11,5,170,9,7,4,28,0,44,5,5,4,28,8,6,3, +125,14,10,5,170,18,13,5,170,20,14,5,170,18,12,5,170,13,10,6, +227,72,38,19,255,185,86,32,255,144,64,29,255,20,15,11,232,8,7,7, +28,0,12,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0, +16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,5, +4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5,238,14, +10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9,7,4,153,7, +5,4,57,0,32,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4, +28,0,28,8,6,3,57,9,7,4,164,14,10,5,170,18,13,5,173,14, +10,5,229,14,10,5,255,17,12,6,255,22,15,9,255,20,14,9,252,21, +15,10,176,11,9,6,139,0,32,11,8,4,122,18,12,5,170,14,10,5, +150,7,5,4,28,0,32,8,7,7,57,24,16,11,173,26,18,9,190,13, +10,6,142,5,4,4,11,0,8,8,7,3,68,14,10,5,170,16,11,5, +170,9,7,4,74,0,20,14,10,5,142,20,14,5,170,16,11,5,170,9, +7,4,28,0,16,14,10,5,142,20,14,5,170,16,11,5,170,9,8,4, +28,0,28,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0, +28,14,10,5,142,18,13,5,170,16,12,5,170,18,13,5,173,14,10,5, +227,14,10,5,255,14,10,5,252,12,9,5,255,12,9,5,255,16,11,5, +255,20,13,5,201,11,9,4,28,0,12,12,10,5,136,16,12,5,170,16, +11,5,170,16,11,5,193,21,15,6,184,14,10,5,31,0,32,8,6,3, +139,54,30,9,255,107,50,12,255,78,39,11,255,9,7,4,161,0,12,20, +13,5,142,18,12,5,210,16,11,5,170,16,11,5,170,16,11,5,170,9, +7,4,28,0,64,13,10,8,57,9,7,6,159,8,6,5,159,10,8,7, +130,10,8,7,119,9,7,6,133,9,7,6,167,10,8,7,170,11,9,8, +113,0,44,5,4,2,28,8,6,3,125,14,10,5,170,18,13,5,176,14, +10,5,238,14,10,5,255,16,11,5,235,18,13,5,173,16,11,5,170,16, +12,5,170,16,11,5,164,9,7,4,28,0,12,14,10,5,136,16,12,5, +170,16,11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5, +249,16,12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5, +5,4,28,8,6,3,125,14,10,5,170,18,13,5,176,14,10,5,238,14, +10,5,255,14,10,5,249,16,11,5,193,16,11,5,170,9,7,4,150,7, +5,4,57,0,16,5,5,4,28,8,6,3,125,14,10,5,170,18,13,5, +176,14,10,5,238,14,10,5,255,14,10,5,235,18,13,5,173,16,11,5, +170,16,12,5,170,16,11,5,170,9,7,4,28,0,12,5,5,4,28,8, +6,3,125,14,10,5,170,18,13,5,176,14,10,5,235,14,10,5,255,14, +10,5,255,16,11,5,255,20,13,5,207,12,9,5,34,0,28,14,10,5, +142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,6,5,3,85,7, +5,4,85,6,5,3,85,5,4,4,85,5,4,4,105,9,8,4,241,72, +37,11,255,110,54,13,255,67,34,10,255,8,6,3,144,0,12,14,10,5, +142,21,14,6,170,16,12,5,170,9,8,4,28,0,16,14,10,5,142,21, +13,6,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6, +170,16,11,5,170,9,7,4,28,0,12,7,5,2,37,8,6,3,142,8, +6,3,227,25,15,6,255,75,36,10,255,99,51,12,255,66,33,9,255,8, +6,3,130,0,12,14,10,5,139,21,13,6,170,16,11,5,170,9,7,4, +28,0,12,8,6,3,79,14,10,5,170,18,13,5,170,12,9,5,142,0, +16,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,12,12, +9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,8,20,13,5, +85,11,8,4,28,0,8,12,9,5,142,21,13,6,170,16,11,5,170,9, +7,4,28,0,12,12,9,5,142,21,13,6,170,16,11,5,170,9,7,4, +28,0,16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0, +12,5,5,4,28,8,6,3,125,14,10,5,170,18,12,5,170,20,14,5, +173,16,12,5,193,20,13,5,178,20,13,5,170,16,11,5,170,9,7,4, +161,7,6,4,57,0,12,8,6,3,85,84,40,13,255,164,73,23,255,184, +79,27,255,15,11,8,246,0,72,11,10,10,170,176,83,37,255,196,87,33, +255,192,88,31,255,22,15,11,193,0,12,21,15,10,159,26,17,11,255,24, +17,11,221,10,8,7,85,0,44,8,7,3,59,12,9,5,170,16,11,5, +210,14,10,5,255,14,10,5,255,14,10,5,255,14,10,5,246,16,12,5, +193,16,11,5,170,9,7,4,153,6,5,3,57,0,24,14,10,5,142,20, +13,5,170,16,11,5,170,9,7,4,28,0,20,6,5,3,28,8,6,3, +127,14,10,5,170,18,13,5,176,14,10,5,238,14,10,5,255,14,10,5, +235,18,13,5,173,16,11,5,170,16,12,5,170,16,11,5,170,9,7,4, +28,0,28,14,11,7,142,29,19,8,170,17,11,6,159,8,6,3,28,0, +32,7,5,4,28,14,10,5,150,20,13,5,170,12,9,5,142,5,4,2, +14,0,8,15,11,8,142,26,18,9,178,19,13,6,170,8,6,3,68,0, +20,18,12,5,142,16,11,5,238,16,11,5,170,9,7,4,28,0,16,12, +9,5,142,16,11,5,215,18,13,5,187,11,9,4,28,0,16,4,4,3, +6,5,4,2,82,5,4,2,85,5,4,2,85,5,4,2,85,5,4,2, +99,9,7,4,241,72,37,11,255,112,53,13,255,77,39,12,255,10,8,5, +170,0,12,19,13,8,184,20,14,9,255,16,11,7,255,14,11,7,255,17, +12,8,255,22,15,9,255,27,17,10,255,30,19,11,255,28,18,11,255,21, +15,10,255,15,12,8,198,9,7,6,28,0,24,8,6,5,91,15,11,6, +170,14,11,5,238,19,13,6,198,12,9,5,28,0,8,6,5,3,85,54, +29,9,255,100,48,13,255,109,52,14,255,15,11,6,170,0,12,19,13,6, +144,14,10,5,255,16,11,5,178,8,6,3,119,0,255,0,255,0,174,12, +9,7,88,99,44,20,255,26,16,11,232,5,4,4,28,0,92,6,5,3, +57,60,28,11,255,158,67,23,255,88,44,23,255,11,9,6,142,0,255,0, +255,0,150,12,9,7,110,126,51,25,255,25,17,12,232,5,4,4,28,0, +184,6,5,5,28,19,14,10,227,52,29,17,255,30,20,13,255,9,8,6, +82,0,255,0,255,0,255,0,255,0,8,12,10,9,170,172,81,49,255,213, +125,94,255,185,88,58,255,23,16,14,159,0,255,0,255,0,106,5,4,2, +28,16,11,5,244,68,34,9,255,62,33,9,255,9,8,4,139,0,96,10, +8,7,48,71,33,18,255,108,47,23,255,107,48,22,255,113,51,24,255,109, +50,24,255,104,45,21,255,104,45,21,255,113,49,24,255,115,50,24,255,18, +13,9,136,0,255,0,129,9,7,6,34,18,13,9,244,66,31,15,255,84, +37,17,255,83,36,16,255,75,34,14,255,73,35,14,255,91,41,16,255,110, +47,19,255,79,40,16,255,24,16,9,255,8,6,5,57,0,100,22,14,5, +244,40,23,7,255,42,23,7,255,54,28,9,255,60,31,9,255,36,22,7, +255,12,9,5,244,6,5,3,28,0,255,0,29,9,7,6,85,72,34,13, +255,126,56,21,255,148,63,25,255,25,17,14,190,0,72,15,12,12,133,178, +86,57,255,200,89,55,255,194,82,47,255,30,20,17,187,0,255,0,169,9, +7,4,99,17,12,6,255,42,22,9,255,49,25,9,255,54,26,11,255,52, +26,11,255,59,28,12,255,82,37,15,255,111,49,18,255,84,39,17,255,25, +17,10,255,8,7,5,57,0,112,6,5,3,57,38,22,7,255,85,39,12, +255,124,52,21,255,20,13,9,170,0,255,0,255,0,202,8,6,5,28,26, +16,11,170,11,8,6,85,0,100,12,8,5,119,20,14,9,170,12,9,7, +142,0,255,0,255,0,154,9,7,6,28,27,17,12,170,11,9,8,85,0, +192,7,6,6,28,8,7,5,85,8,6,5,57,0,255,0,255,0,255,0, +255,0,16,25,17,16,161,41,27,26,255,40,26,23,235,14,12,11,82,0, +255,0,255,0,110,8,6,3,37,9,7,4,142,9,7,4,136,6,5,3, +6,0,100,23,15,10,153,19,13,10,255,16,11,9,255,16,11,9,255,16, +11,9,255,16,11,9,255,16,11,9,255,18,13,9,255,24,16,11,204,16, +11,9,31,0,255,0,133,10,8,7,142,18,12,9,207,18,13,9,255,16, +11,9,255,15,11,8,255,15,11,8,252,18,13,9,195,18,12,9,170,11, +8,6,167,8,7,5,57,0,104,9,8,4,142,14,10,5,170,13,10,6, +170,13,9,6,170,11,8,6,170,7,6,4,130,6,5,3,28,0,255,0, +37,14,10,7,142,21,14,10,170,19,13,10,170,14,11,9,31,0,72,8, +7,8,14,25,17,16,142,27,18,16,193,26,18,15,170,15,11,10,34,0, +255,0,169,9,7,4,28,11,8,6,170,14,10,7,232,15,10,8,255,15, +10,8,255,15,10,8,255,15,10,8,252,18,12,9,195,18,12,9,170,11, +8,6,167,9,7,6,57,0,120,9,7,4,91,16,11,7,170,20,13,9, +170,13,10,8,28,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +255,0,255,0,255}}; + /* Created by MiniCompress.. an iOS RLE compressor. + * Compress Rate : 46.36 % + */ diff --git a/src/visualizations/Goom/goom2k4-0/src/gfontrle.h b/src/visualizations/Goom/goom2k4-0/src/gfontrle.h new file mode 100644 index 0000000000..41e2462fdb --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/gfontrle.h @@ -0,0 +1,7 @@ +extern const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; + unsigned int rle_size; + unsigned char rle_pixel [49725]; +} the_font ; diff --git a/src/visualizations/Goom/goom2k4-0/src/goom.h b/src/visualizations/Goom/goom2k4-0/src/goom.h new file mode 100644 index 0000000000..b0ddab17e3 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goom.h @@ -0,0 +1,30 @@ +#ifndef _GOOMCORE_H +#define _GOOMCORE_H + +#include "goom_config.h" +#include "goom_plugin_info.h" +#include "goomsl.h" + +#define NB_FX 10 + +PluginInfo *goom_init (guint32 resx, guint32 resy); +void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy); + +/* + * forceMode == 0 : do nothing + * forceMode == -1 : lock the FX + * forceMode == 1..NB_FX : force a switch to FX n# forceMode + * + * songTitle = pointer to the title of the song... + * - NULL if it is not the start of the song + * - only have a value at the start of the song + */ +guint32 *goom_update (PluginInfo *goomInfo, gint16 data[2][512], int forceMode, float fps, + char *songTitle, char *message); + +/* returns 0 if the buffer wasn't accepted */ +int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer); + +void goom_close (PluginInfo *goomInfo); + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_config.h b/src/visualizations/Goom/goom2k4-0/src/goom_config.h new file mode 100644 index 0000000000..84630ff74c --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goom_config.h @@ -0,0 +1,28 @@ +#if WORDS_BIGENDIAN +#define COLOR_ARGB +#else +#define COLOR_BGRA +#endif + +#if 1 +/* ndef COLOR_BGRA */ +/** position des composantes **/ + #define BLEU 2 + #define VERT 1 + #define ROUGE 0 + #define ALPHA 3 +#else + #define ROUGE 1 + #define BLEU 3 + #define VERT 2 + #define ALPHA 0 +#endif + +#ifndef guint32 +#define guint8 unsigned char +#define guin16 unsigned short +#define guint32 unsigned int +#define gint8 signed char +#define gint16 signed short int +#define gint32 signed int +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_config_param.h b/src/visualizations/Goom/goom2k4-0/src/goom_config_param.h new file mode 100644 index 0000000000..3c6838d307 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goom_config_param.h @@ -0,0 +1,115 @@ +#ifndef _CONFIG_PARAM_H +#define _CONFIG_PARAM_H + +#include <stdlib.h> + +/** + * File created on 2003-05-24 by Jeko. + * (c)2003, JC Hoelt for iOS-software. + * + * LGPL Licence. + */ + +typedef enum { + PARAM_INTVAL, + PARAM_FLOATVAL, + PARAM_BOOLVAL, + PARAM_STRVAL, + PARAM_LISTVAL, +} ParamType; + +struct IntVal { + int value; + int min; + int max; + int step; +}; +struct FloatVal { + float value; + float min; + float max; + float step; +}; +struct StrVal { + char *value; +}; +struct ListVal { + char *value; + int nbChoices; + char **choices; +}; +struct BoolVal { + int value; +}; + + +typedef struct _PARAM { + char *name; + char *desc; + char rw; + ParamType type; + union { + struct IntVal ival; + struct FloatVal fval; + struct StrVal sval; + struct ListVal slist; + struct BoolVal bval; + } param; + + /* used by the core to inform the GUI of a change */ + void (*change_listener)(struct _PARAM *_this); + + /* used by the GUI to inform the core of a change */ + void (*changed)(struct _PARAM *_this); + + void *user_data; /* can be used by the GUI */ +} PluginParam; + +#define IVAL(p) ((p).param.ival.value) +#define SVAL(p) ((p).param.sval.value) +#define FVAL(p) ((p).param.fval.value) +#define BVAL(p) ((p).param.bval.value) +#define LVAL(p) ((p).param.slist.value) + +#define FMIN(p) ((p).param.fval.min) +#define FMAX(p) ((p).param.fval.max) +#define FSTEP(p) ((p).param.fval.step) + +#define IMIN(p) ((p).param.ival.min) +#define IMAX(p) ((p).param.ival.max) +#define ISTEP(p) ((p).param.ival.step) + +PluginParam goom_secure_param(void); + +PluginParam goom_secure_f_param(char *name); +PluginParam goom_secure_i_param(char *name); +PluginParam goom_secure_b_param(char *name, int value); +PluginParam goom_secure_s_param(char *name); + +PluginParam goom_secure_f_feedback(char *name); +PluginParam goom_secure_i_feedback(char *name); + +void goom_set_str_param_value(PluginParam *p, const char *str); +void goom_set_list_param_value(PluginParam *p, const char *str); + +typedef struct _PARAMETERS { + char *name; + char *desc; + int nbParams; + PluginParam **params; +} PluginParameters; + +PluginParameters goom_plugin_parameters(const char *name, int nb); + +#define secure_param goom_secure_param +#define secure_f_param goom_secure_f_param +#define secure_i_param goom_secure_i_param +#define secure_b_param goom_secure_b_param +#define secure_s_param goom_secure_s_param +#define secure_f_feedback goom_secure_f_feedback +#define secure_i_feedback goom_secure_i_feedback +#define set_list_param_value goom_set_list_param_value +#define set_str_param_value goom_set_str_param_value +#define plugin_parameters goom_plugin_parameters + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_core.c b/src/visualizations/Goom/goom2k4-0/src/goom_core.c new file mode 100644 index 0000000000..836e1c3046 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goom_core.c @@ -0,0 +1,895 @@ +/** +* file: goom_core.c + * author: Jean-Christophe Hoelt (which is not so proud of it) + * + * Contains the core of goom's work. + * + * (c)2000-2003, by iOS-software. + */ + +#include <math.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <inttypes.h> + +#include "goom.h" +#include "goom_tools.h" +#include "goom_filters.h" +#include "lines.h" +#include "ifs.h" +#include "tentacle3d.h" +#include "gfontlib.h" + +#include "sound_tester.h" +#include "goom_plugin_info.h" +#include "goom_fx.h" +#include "goomsl.h" + +/* #define VERBOSE */ + +#define STOP_SPEED 128 +/* TODO: put that as variable in PluginInfo */ +#define TIME_BTW_CHG 300 + +static void choose_a_goom_line (PluginInfo *goomInfo, float *param1, float *param2, int *couleur, + int *mode, float *amplitude, int far); + +static void update_message (PluginInfo *goomInfo, char *message); + +static void init_buffers(PluginInfo *goomInfo, int buffsize) +{ + goomInfo->pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); + bzero (goomInfo->pixel, buffsize * sizeof (guint32) + 128); + goomInfo->back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); + bzero (goomInfo->back, buffsize * sizeof (guint32) + 128); + goomInfo->conv = (Pixel *) malloc (buffsize * sizeof (guint32) + 128); + bzero (goomInfo->conv, buffsize * sizeof (guint32) + 128); + + goomInfo->outputBuf = goomInfo->conv; + + goomInfo->p1 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->pixel)) / 128) * 128); + goomInfo->p2 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->back)) / 128) * 128); +} + +/************************** +* INIT * +**************************/ +PluginInfo *goom_init (guint32 resx, guint32 resy) +{ + PluginInfo *goomInfo = (PluginInfo*)malloc(sizeof(PluginInfo)); + +#ifdef VERBOSE + printf ("GOOM: init (%d, %d);\n", resx, resy); +#endif + + plugin_info_init(goomInfo,4); + + goomInfo->star_fx = flying_star_create(); + goomInfo->star_fx.init(&goomInfo->star_fx, goomInfo); + + goomInfo->zoomFilter_fx = zoomFilterVisualFXWrapper_create (); + goomInfo->zoomFilter_fx.init(&goomInfo->zoomFilter_fx, goomInfo); + + goomInfo->tentacles_fx = tentacle_fx_create(); + goomInfo->tentacles_fx.init(&goomInfo->tentacles_fx, goomInfo); + + goomInfo->convolve_fx = convolve_create(); + goomInfo->convolve_fx.init(&goomInfo->convolve_fx, goomInfo); + + plugin_info_add_visual (goomInfo, 0, &goomInfo->zoomFilter_fx); + plugin_info_add_visual (goomInfo, 1, &goomInfo->tentacles_fx); + plugin_info_add_visual (goomInfo, 2, &goomInfo->star_fx); + plugin_info_add_visual (goomInfo, 3, &goomInfo->convolve_fx); + + goomInfo->screen.width = resx; + goomInfo->screen.height = resy; + goomInfo->screen.size = resx * resy; + + init_buffers(goomInfo, goomInfo->screen.size); + goomInfo->gRandom = goom_random_init((uintptr_t)goomInfo->pixel); + + goomInfo->cycle = 0; + + goomInfo->ifs_fx = ifs_visualfx_create(); + goomInfo->ifs_fx.init(&goomInfo->ifs_fx, goomInfo); + + goomInfo->gmline1 = goom_lines_init (goomInfo, resx, goomInfo->screen.height, + GML_HLINE, goomInfo->screen.height, GML_BLACK, + GML_CIRCLE, 0.4f * (float) goomInfo->screen.height, GML_VERT); + goomInfo->gmline2 = goom_lines_init (goomInfo, resx, goomInfo->screen.height, + GML_HLINE, 0, GML_BLACK, + GML_CIRCLE, 0.2f * (float) goomInfo->screen.height, GML_RED); + + gfont_load (); + + /* goom_set_main_script(goomInfo, goomInfo->main_script_str); */ + + return goomInfo; +} + + + +void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy) +{ + free (goomInfo->pixel); + free (goomInfo->back); + free (goomInfo->conv); + + goomInfo->screen.width = resx; + goomInfo->screen.height = resy; + goomInfo->screen.size = resx * resy; + + init_buffers(goomInfo, goomInfo->screen.size); + + /* init_ifs (goomInfo, resx, goomInfo->screen.height); */ + goomInfo->ifs_fx.free(&goomInfo->ifs_fx); + goomInfo->ifs_fx.init(&goomInfo->ifs_fx, goomInfo); + + goom_lines_set_res (goomInfo->gmline1, resx, goomInfo->screen.height); + goom_lines_set_res (goomInfo->gmline2, resx, goomInfo->screen.height); +} + +int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer) +{ + goomInfo->outputBuf = (Pixel*)buffer; + return 1; +} + +/******************************************** +* UPDATE * +******************************************** + +* WARNING: this is a 600 lines function ! (21-11-2003) +*/ +guint32 *goom_update (PluginInfo *goomInfo, gint16 data[2][512], + int forceMode, float fps, char *songTitle, char *message) +{ + Pixel *return_val; + guint32 pointWidth; + guint32 pointHeight; + int i; + float largfactor; /* elargissement de l'intervalle d'évolution des points */ + Pixel *tmp; + + ZoomFilterData *pzfd; + + /* test if the config has changed, update it if so */ + pointWidth = (goomInfo->screen.width * 2) / 5; + pointHeight = ((goomInfo->screen.height) * 2) / 5; + + /* ! etude du signal ... */ + evaluate_sound (data, &(goomInfo->sound)); + + /* goom_execute_main_script(goomInfo); */ + + /* ! calcul du deplacement des petits points ... */ + largfactor = goomInfo->sound.speedvar / 150.0f + goomInfo->sound.volume / 1.5f; + + if (largfactor > 1.5f) + largfactor = 1.5f; + + goomInfo->update.decay_ifs--; + if (goomInfo->update.decay_ifs > 0) + goomInfo->update.ifs_incr += 2; + if (goomInfo->update.decay_ifs == 0) + goomInfo->update.ifs_incr = 0; + + if (goomInfo->update.recay_ifs) { + goomInfo->update.ifs_incr -= 2; + goomInfo->update.recay_ifs--; + if ((goomInfo->update.recay_ifs == 0)&&(goomInfo->update.ifs_incr<=0)) + goomInfo->update.ifs_incr = 1; + } + + if (goomInfo->update.ifs_incr > 0) + goomInfo->ifs_fx.apply(&goomInfo->ifs_fx, goomInfo->p2, goomInfo->p1, goomInfo); + + if (goomInfo->curGState->drawPoints) { + for (i = 1; i * 15 <= goomInfo->sound.speedvar*80.0f + 15; i++) { + goomInfo->update.loopvar += goomInfo->sound.speedvar*50 + 1; + + pointFilter (goomInfo, goomInfo->p1, + YELLOW, + ((pointWidth - 6.0f) * largfactor + 5.0f), + ((pointHeight - 6.0f) * largfactor + 5.0f), + i * 152.0f, 128.0f, goomInfo->update.loopvar + i * 2032); + pointFilter (goomInfo, goomInfo->p1, ORANGE, + ((pointWidth / 2) * largfactor) / i + 10.0f * i, + ((pointHeight / 2) * largfactor) / i + 10.0f * i, + 96.0f, i * 80.0f, goomInfo->update.loopvar / i); + pointFilter (goomInfo, goomInfo->p1, VIOLET, + ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, + ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, + i + 122.0f, 134.0f, goomInfo->update.loopvar / i); + pointFilter (goomInfo, goomInfo->p1, BLACK, + ((pointHeight / 3) * largfactor + 20.0f), + ((pointHeight / 3) * largfactor + 20.0f), + 58.0f, i * 66.0f, goomInfo->update.loopvar / i); + pointFilter (goomInfo, goomInfo->p1, WHITE, + (pointHeight * largfactor + 10.0f * i) / i, + (pointHeight * largfactor + 10.0f * i) / i, + 66.0f, 74.0f, goomInfo->update.loopvar + i * 500); + } + } + + /* par défaut pas de changement de zoom */ + pzfd = NULL; + + /* + * Test forceMode + */ +#ifdef VERBOSE + if (forceMode != 0) { + printf ("forcemode = %d\n", forceMode); + } +#endif + + + /* diminuer de 1 le temps de lockage */ + /* note pour ceux qui n'ont pas suivis : le lockvar permet d'empecher un */ + /* changement d'etat du plugin juste apres un autre changement d'etat. oki */ + if (--goomInfo->update.lockvar < 0) + goomInfo->update.lockvar = 0; + + /* on verifie qu'il ne se pas un truc interressant avec le son. */ + if ((goomInfo->sound.timeSinceLastGoom == 0) + || (forceMode > 0) + || (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG)) { + + /* changement eventuel de mode */ + if (goom_irand(goomInfo->gRandom,16) == 0) + switch (goom_irand(goomInfo->gRandom,34)) { + case 0: + case 10: + goomInfo->update.zoomFilterData.hypercosEffect = goom_irand(goomInfo->gRandom,2); + case 13: + case 20: + case 21: + goomInfo->update.zoomFilterData.mode = WAVE_MODE; + goomInfo->update.zoomFilterData.reverse = 0; + goomInfo->update.zoomFilterData.waveEffect = (goom_irand(goomInfo->gRandom,3) == 0); + if (goom_irand(goomInfo->gRandom,2)) + goomInfo->update.zoomFilterData.vitesse = (goomInfo->update.zoomFilterData.vitesse + 127) >> 1; + break; + case 1: + case 11: + goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 2: + case 12: + goomInfo->update.zoomFilterData.mode = AMULETTE_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 3: + goomInfo->update.zoomFilterData.mode = WATER_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 4: + case 14: + goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 5: + case 15: + case 22: + goomInfo->update.zoomFilterData.mode = HYPERCOS1_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = (goom_irand(goomInfo->gRandom,3) == 0); + break; + case 6: + case 16: + goomInfo->update.zoomFilterData.mode = HYPERCOS2_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 7: + case 17: + goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE; + goomInfo->update.zoomFilterData.waveEffect = (goom_irand(goomInfo->gRandom,4) == 0); + goomInfo->update.zoomFilterData.hypercosEffect = goom_irand(goomInfo->gRandom,2); + break; + case 8: + case 18: + case 19: + goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE; + goomInfo->update.zoomFilterData.waveEffect = 1; + goomInfo->update.zoomFilterData.hypercosEffect = 1; + break; + case 29: + case 30: + goomInfo->update.zoomFilterData.mode = YONLY_MODE; + break; + case 31: + case 32: + case 33: + goomInfo->update.zoomFilterData.mode = SPEEDWAY_MODE; + break; + default: + goomInfo->update.zoomFilterData.mode = NORMAL_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + } + } + + /* tout ceci ne sera fait qu'en cas de non-blocage */ + if (goomInfo->update.lockvar == 0) { + /* reperage de goom (acceleration forte de l'acceleration du volume) */ + /* -> coup de boost de la vitesse si besoin.. */ + if (goomInfo->sound.timeSinceLastGoom == 0) { + + int i; + goomInfo->update.goomvar++; + + /* SELECTION OF THE GOOM STATE */ + if ((!goomInfo->update.stateSelectionBlocker)&&(goom_irand(goomInfo->gRandom,3))) { + goomInfo->update.stateSelectionRnd = goom_irand(goomInfo->gRandom,goomInfo->statesRangeMax); + goomInfo->update.stateSelectionBlocker = 3; + } + else if (goomInfo->update.stateSelectionBlocker) goomInfo->update.stateSelectionBlocker--; + + for (i=0;i<goomInfo->statesNumber;i++) + if ((goomInfo->update.stateSelectionRnd >= goomInfo->states[i].rangemin) + && (goomInfo->update.stateSelectionRnd <= goomInfo->states[i].rangemax)) + goomInfo->curGState = &(goomInfo->states[i]); + + if ((goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr<=0)) { + goomInfo->update.recay_ifs = 5; + goomInfo->update.ifs_incr = 11; + } + + if ((!goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr>0) && (goomInfo->update.decay_ifs<=0)) + goomInfo->update.decay_ifs = 100; + + if (!goomInfo->curGState->drawScope) + goomInfo->update.stop_lines = 0xf000 & 5; + + if (!goomInfo->curGState->drawScope) { + goomInfo->update.stop_lines = 0; + goomInfo->update.lineMode = goomInfo->update.drawLinesDuration; + } + + /* if (goomInfo->update.goomvar % 1 == 0) */ + { + guint32 vtmp; + guint32 newvit; + + goomInfo->update.lockvar = 50; + newvit = STOP_SPEED + 1 - ((float)3.5f * log10(goomInfo->sound.speedvar * 60 + 1)); + /* retablir le zoom avant.. */ + if ((goomInfo->update.zoomFilterData.reverse) && (!(goomInfo->cycle % 13)) && (rand () % 5 == 0)) { + goomInfo->update.zoomFilterData.reverse = 0; + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 2; + goomInfo->update.lockvar = 75; + } + if (goom_irand(goomInfo->gRandom,10) == 0) { + goomInfo->update.zoomFilterData.reverse = 1; + goomInfo->update.lockvar = 100; + } + + if (goom_irand(goomInfo->gRandom,10) == 0) + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1; + if (goom_irand(goomInfo->gRandom,12) == 0) + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED + 1; + + /* changement de milieu.. */ + switch (goom_irand(goomInfo->gRandom,25)) { + case 0: + case 3: + case 6: + goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height - 1; + goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; + break; + case 1: + case 4: + goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width - 1; + break; + case 2: + case 5: + goomInfo->update.zoomFilterData.middleX = 1; + break; + default: + goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2; + goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; + } + + if ((goomInfo->update.zoomFilterData.mode == WATER_MODE) + || (goomInfo->update.zoomFilterData.mode == YONLY_MODE) + || (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE)) { + goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; + goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2; + } + + switch (vtmp = (goom_irand(goomInfo->gRandom,15))) { + case 0: + goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,3) + - goom_irand(goomInfo->gRandom,3); + goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,3) + - goom_irand(goomInfo->gRandom,3); + break; + case 3: + goomInfo->update.zoomFilterData.vPlaneEffect = 0; + goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,8) + - goom_irand(goomInfo->gRandom,8); + break; + case 4: + case 5: + case 6: + case 7: + goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,5) + - goom_irand(goomInfo->gRandom,5); + goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.vPlaneEffect; + break; + case 8: + goomInfo->update.zoomFilterData.hPlaneEffect = 5 + goom_irand(goomInfo->gRandom,8); + goomInfo->update.zoomFilterData.vPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect; + break; + case 9: + goomInfo->update.zoomFilterData.vPlaneEffect = 5 + goom_irand(goomInfo->gRandom,8); + goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect; + break; + case 13: + goomInfo->update.zoomFilterData.hPlaneEffect = 0; + goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,10) + - goom_irand(goomInfo->gRandom,10); + break; + case 14: + goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,10) + - goom_irand(goomInfo->gRandom,10); + goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,10) + - goom_irand(goomInfo->gRandom,10); + break; + default: + if (vtmp < 10) { + goomInfo->update.zoomFilterData.vPlaneEffect = 0; + goomInfo->update.zoomFilterData.hPlaneEffect = 0; + } + } + + if (goom_irand(goomInfo->gRandom,5) != 0) + goomInfo->update.zoomFilterData.noisify = 0; + else { + goomInfo->update.zoomFilterData.noisify = goom_irand(goomInfo->gRandom,2) + 1; + goomInfo->update.lockvar *= 2; + } + + if (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE) { + goomInfo->update.zoomFilterData.vPlaneEffect = 0; + goomInfo->update.zoomFilterData.hPlaneEffect = 0; + goomInfo->update.zoomFilterData.noisify = 0; + } + + if ((goomInfo->update.zoomFilterData.middleX == 1) || (goomInfo->update.zoomFilterData.middleX == (signed int)goomInfo->screen.width - 1)) { + goomInfo->update.zoomFilterData.vPlaneEffect = 0; + if (goom_irand(goomInfo->gRandom,2)) + goomInfo->update.zoomFilterData.hPlaneEffect = 0; + } + + if ((signed int)newvit < goomInfo->update.zoomFilterData.vitesse) /* on accelere */ + { + pzfd = &goomInfo->update.zoomFilterData; + if (((newvit < STOP_SPEED - 7) && + (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 6) && + (goomInfo->cycle % 3 == 0)) || (goom_irand(goomInfo->gRandom,40) == 0)) { + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - goom_irand(goomInfo->gRandom,2) + + goom_irand(goomInfo->gRandom,2); + goomInfo->update.zoomFilterData.reverse = !goomInfo->update.zoomFilterData.reverse; + } + else { + goomInfo->update.zoomFilterData.vitesse = (newvit + goomInfo->update.zoomFilterData.vitesse * 7) / 8; + } + goomInfo->update.lockvar += 50; + } + } + + if (goomInfo->update.lockvar > 150) { + goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; + goomInfo->update.switchMult = 1.0f; + } + } + /* mode mega-lent */ + if (goom_irand(goomInfo->gRandom,700) == 0) { + /* + * printf ("coup du sort...\n") ; + */ + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1; + goomInfo->update.zoomFilterData.pertedec = 8; + goomInfo->update.zoomFilterData.sqrtperte = 16; + goomInfo->update.goomvar = 1; + goomInfo->update.lockvar += 50; + goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; + goomInfo->update.switchMult = 1.0f; + } + } + + /* + * gros frein si la musique est calme + */ + if ((goomInfo->sound.speedvar < 0.01f) + && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 4) + && (goomInfo->cycle % 16 == 0)) { + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.zoomFilterData.vitesse += 3; + goomInfo->update.zoomFilterData.pertedec = 8; + goomInfo->update.zoomFilterData.sqrtperte = 16; + goomInfo->update.goomvar = 0; + } + + /* + * baisser regulierement la vitesse... + */ + if ((goomInfo->cycle % 73 == 0) && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 5)) { + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.zoomFilterData.vitesse++; + } + + /* + * arreter de decrémenter au bout d'un certain temps + */ + if ((goomInfo->cycle % 101 == 0) && (goomInfo->update.zoomFilterData.pertedec == 7)) { + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.zoomFilterData.pertedec = 8; + goomInfo->update.zoomFilterData.sqrtperte = 16; + } + + /* + * Permet de forcer un effet. + */ + if ((forceMode > 0) && (forceMode <= NB_FX)) { + pzfd = &goomInfo->update.zoomFilterData; + pzfd->mode = forceMode - 1; + } + + if (forceMode == -1) { + pzfd = NULL; + } + + /* + * Changement d'effet de zoom ! + */ + if (pzfd != NULL) { + int dif; + + goomInfo->update.cyclesSinceLastChange = 0; + + goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; + + dif = goomInfo->update.zoomFilterData.vitesse - goomInfo->update.previousZoomSpeed; + if (dif < 0) + dif = -dif; + + if (dif > 2) { + goomInfo->update.switchIncr *= (dif + 2) / 2; + } + goomInfo->update.previousZoomSpeed = goomInfo->update.zoomFilterData.vitesse; + goomInfo->update.switchMult = 1.0f; + + if (((goomInfo->sound.timeSinceLastGoom == 0) + && (goomInfo->sound.totalgoom < 2)) || (forceMode > 0)) { + goomInfo->update.switchIncr = 0; + goomInfo->update.switchMult = goomInfo->update.switchMultAmount; + } + } + else { + if (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG) { + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.cyclesSinceLastChange = 0; + } + else + goomInfo->update.cyclesSinceLastChange++; + } + +#ifdef VERBOSE + if (pzfd) { + printf ("GOOM: pzfd->mode = %d\n", pzfd->mode); + } +#endif + + /* Zoom here ! */ + zoomFilterFastRGB (goomInfo, goomInfo->p1, goomInfo->p2, pzfd, goomInfo->screen.width, goomInfo->screen.height, + goomInfo->update.switchIncr, goomInfo->update.switchMult); + + /* + * Affichage tentacule + */ + + goomInfo->tentacles_fx.apply(&goomInfo->tentacles_fx, goomInfo->p1, goomInfo->p2, goomInfo); + goomInfo->star_fx.apply (&goomInfo->star_fx,goomInfo->p2,goomInfo->p1,goomInfo); + + /* + * Affichage de texte + */ + { + /*char title[1024];*/ + char text[64]; + + /* + * Le message + */ + update_message (goomInfo, message); + + if (fps > 0) { + sprintf (text, "%2.0f fps", fps); + goom_draw_text (goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, + 10, 24, text, 1, 0); + } + + /* + * Le titre + */ + if (songTitle != NULL) { + strncpy (goomInfo->update.titleText, songTitle, 1023); + goomInfo->update.titleText[1023]=0; + goomInfo->update.timeOfTitleDisplay = 200; + } + + if (goomInfo->update.timeOfTitleDisplay) { + goom_draw_text (goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, + goomInfo->screen.width / 2, goomInfo->screen.height / 2 + 7, goomInfo->update.titleText, + ((float) (190 - goomInfo->update.timeOfTitleDisplay) / 10.0f), 1); + goomInfo->update.timeOfTitleDisplay--; + if (goomInfo->update.timeOfTitleDisplay < 4) + goom_draw_text (goomInfo->p2,goomInfo->screen.width,goomInfo->screen.height, + goomInfo->screen.width / 2, goomInfo->screen.height / 2 + 7, goomInfo->update.titleText, + ((float) (190 - goomInfo->update.timeOfTitleDisplay) / 10.0f), 1); + } + } + + /* + * Gestion du Scope + */ + + /* + * arret demande + */ + if ((goomInfo->update.stop_lines & 0xf000)||(!goomInfo->curGState->drawScope)) { + float param1, param2, amplitude; + int couleur; + int mode; + + choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur, &mode, &litude,1); + couleur = GML_BLACK; + + goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur); + goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur); + goomInfo->update.stop_lines &= 0x0fff; + } + + /* + * arret aleatore.. changement de mode de ligne.. + */ + if (goomInfo->update.lineMode != goomInfo->update.drawLinesDuration) { + goomInfo->update.lineMode--; + if (goomInfo->update.lineMode == -1) + goomInfo->update.lineMode = 0; + } + else + if ((goomInfo->cycle%80==0)&&(goom_irand(goomInfo->gRandom,5)==0)&&goomInfo->update.lineMode) + goomInfo->update.lineMode--; + + if ((goomInfo->cycle % 120 == 0) + && (goom_irand(goomInfo->gRandom,4) == 0) + && (goomInfo->curGState->drawScope)) { + if (goomInfo->update.lineMode == 0) + goomInfo->update.lineMode = goomInfo->update.drawLinesDuration; + else if (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration) { + float param1, param2, amplitude; + int couleur1,couleur2; + int mode; + + goomInfo->update.lineMode--; + choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur1, + &mode, &litude,goomInfo->update.stop_lines); + + couleur2 = 5-couleur1; + if (goomInfo->update.stop_lines) { + goomInfo->update.stop_lines--; + if (goom_irand(goomInfo->gRandom,2)) + couleur2=couleur1 = GML_BLACK; + } + + goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1); + goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2); + } + } + + /* + * si on est dans un goom : afficher les lignes... + */ + if ((goomInfo->update.lineMode != 0) || (goomInfo->sound.timeSinceLastGoom < 5)) { + goomInfo->gmline2->power = goomInfo->gmline1->power; + + goom_lines_draw (goomInfo, goomInfo->gmline1, data[0], goomInfo->p2); + goom_lines_draw (goomInfo, goomInfo->gmline2, data[1], goomInfo->p2); + + if (((goomInfo->cycle % 121) == 9) && (goom_irand(goomInfo->gRandom,3) == 1) + && ((goomInfo->update.lineMode == 0) || (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration))) { + float param1, param2, amplitude; + int couleur1,couleur2; + int mode; + + choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur1, + &mode, &litude, goomInfo->update.stop_lines); + couleur2 = 5-couleur1; + + if (goomInfo->update.stop_lines) { + goomInfo->update.stop_lines--; + if (goom_irand(goomInfo->gRandom,2)) + couleur2=couleur1 = GML_BLACK; + } + goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1); + goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2); + } + } + + return_val = goomInfo->p1; + tmp = goomInfo->p1; + goomInfo->p1 = goomInfo->p2; + goomInfo->p2 = tmp; + + /* affichage et swappage des buffers.. */ + goomInfo->cycle++; + + goomInfo->convolve_fx.apply(&goomInfo->convolve_fx,return_val,goomInfo->outputBuf,goomInfo); + + return (guint32*)goomInfo->outputBuf; +} + +/**************************************** +* CLOSE * +****************************************/ +void goom_close (PluginInfo *goomInfo) +{ + if (goomInfo->pixel != NULL) + free (goomInfo->pixel); + if (goomInfo->back != NULL) + free (goomInfo->back); + if (goomInfo->conv != NULL) + free (goomInfo->conv); + + goomInfo->pixel = goomInfo->back = NULL; + goomInfo->conv = NULL; + goom_random_free(goomInfo->gRandom); + goom_lines_free (&goomInfo->gmline1); + goom_lines_free (&goomInfo->gmline2); + + /* release_ifs (); */ + goomInfo->ifs_fx.free(&goomInfo->ifs_fx); + goomInfo->convolve_fx.free(&goomInfo->convolve_fx); + goomInfo->star_fx.free(&goomInfo->star_fx); + goomInfo->tentacles_fx.free(&goomInfo->tentacles_fx); + goomInfo->zoomFilter_fx.free(&goomInfo->zoomFilter_fx); + + // Release info visual + free (goomInfo->params); + free (goomInfo->sound.params.params); + + // Release PluginInfo + free (goomInfo->visuals); + gsl_free (goomInfo->scanner); + gsl_free (goomInfo->main_scanner); + + free(goomInfo); +} + + +/* *** */ +void +choose_a_goom_line (PluginInfo *goomInfo, float *param1, float *param2, int *couleur, int *mode, + float *amplitude, int far) +{ + *mode = goom_irand(goomInfo->gRandom,3); + *amplitude = 1.0f; + switch (*mode) { + case GML_CIRCLE: + if (far) { + *param1 = *param2 = 0.47f; + *amplitude = 0.8f; + break; + } + if (goom_irand(goomInfo->gRandom,3) == 0) { + *param1 = *param2 = 0; + *amplitude = 3.0f; + } + else if (goom_irand(goomInfo->gRandom,2)) { + *param1 = 0.40f * goomInfo->screen.height; + *param2 = 0.22f * goomInfo->screen.height; + } + else { + *param1 = *param2 = goomInfo->screen.height * 0.35; + } + break; + case GML_HLINE: + if (goom_irand(goomInfo->gRandom,4) || far) { + *param1 = goomInfo->screen.height / 7; + *param2 = 6.0f * goomInfo->screen.height / 7.0f; + } + else { + *param1 = *param2 = goomInfo->screen.height / 2.0f; + *amplitude = 2.0f; + } + break; + case GML_VLINE: + if (goom_irand(goomInfo->gRandom,3) || far) { + *param1 = goomInfo->screen.width / 7.0f; + *param2 = 6.0f * goomInfo->screen.width / 7.0f; + } + else { + *param1 = *param2 = goomInfo->screen.width / 2.0f; + *amplitude = 1.5f; + } + break; + } + + *couleur = goom_irand(goomInfo->gRandom,6); +} + +#define ECART_VARIATION 1.5 +#define POS_VARIATION 3.0 +#define SCROLLING_SPEED 80 + +/* + * Met a jour l'affichage du message defilant + */ +void update_message (PluginInfo *goomInfo, char *message) { + + int fin = 0; + + if (message) { + int i=1,j=0; + strcpy (goomInfo->update_message.message, message); + for (j=0;goomInfo->update_message.message[j];j++) + if (goomInfo->update_message.message[j]=='\n') + i++; + goomInfo->update_message.numberOfLinesInMessage = i; + goomInfo->update_message.affiche = goomInfo->screen.height + goomInfo->update_message.numberOfLinesInMessage * 25 + 105; + goomInfo->update_message.longueur = strlen(goomInfo->update_message.message); + } + if (goomInfo->update_message.affiche) { + int i = 0; + char *msg = malloc(goomInfo->update_message.longueur + 1); + char *ptr = msg; + int pos; + float ecart; + message = msg; + strcpy (msg, goomInfo->update_message.message); + + while (!fin) { + while (1) { + if (*ptr == 0) { + fin = 1; + break; + } + if (*ptr == '\n') { + *ptr = 0; + break; + } + ++ptr; + } + pos = goomInfo->update_message.affiche - (goomInfo->update_message.numberOfLinesInMessage - i)*25; + pos += POS_VARIATION * (cos((double)pos / 20.0)); + pos -= SCROLLING_SPEED; + ecart = (ECART_VARIATION * sin((double)pos / 20.0)); + if ((fin) && (2 * pos < (int)goomInfo->screen.height)) + pos = (int)goomInfo->screen.height / 2; + pos += 7; + + goom_draw_text(goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, + goomInfo->screen.width/2, pos, + message, + ecart, + 1); + message = ++ptr; + i++; + } + goomInfo->update_message.affiche --; + free (msg); + } +} + diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_filters.h b/src/visualizations/Goom/goom2k4-0/src/goom_filters.h new file mode 100644 index 0000000000..f015499a87 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goom_filters.h @@ -0,0 +1,52 @@ +#ifndef FILTERS_H +#define FILTERS_H + +#include "goom_config.h" +#include "goom_typedefs.h" +#include "goom_visual_fx.h" +#include "goom_graphic.h" + +VisualFX zoomFilterVisualFXWrapper_create(void); + +struct _ZOOM_FILTER_DATA +{ + int vitesse; /* 128 = vitesse nule... * * 256 = en arriere + * hyper vite.. * * 0 = en avant hype vite. */ + unsigned char pertedec; + unsigned char sqrtperte; + int middleX, middleY; /* milieu de l'effet */ + char reverse; /* inverse la vitesse */ + char mode; /* type d'effet à appliquer (cf les #define) */ + /** @since June 2001 */ + int hPlaneEffect; /* deviation horitontale */ + int vPlaneEffect; /* deviation verticale */ + /** @since April 2002 */ + int waveEffect; /* applique une "surcouche" de wave effect */ + int hypercosEffect; /* applique une "surcouche de hypercos effect */ + + char noisify; /* ajoute un bruit a la transformation */ +}; + +#define NORMAL_MODE 0 +#define WAVE_MODE 1 +#define CRYSTAL_BALL_MODE 2 +#define SCRUNCH_MODE 3 +#define AMULETTE_MODE 4 +#define WATER_MODE 5 +#define HYPERCOS1_MODE 6 +#define HYPERCOS2_MODE 7 +#define YONLY_MODE 8 +#define SPEEDWAY_MODE 9 + +void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c, + float t1, float t2, float t3, float t4, guint32 cycle); + +/* filtre de zoom : + * le contenu de pix1 est copie dans pix2. + * zf : si non NULL, configure l'effet. + * resx,resy : taille des buffers. + */ +void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, guint32 resx, + guint32 resy, int switchIncr, float switchMult); + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_fx.h b/src/visualizations/Goom/goom2k4-0/src/goom_fx.h new file mode 100644 index 0000000000..e672ece3de --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goom_fx.h @@ -0,0 +1,12 @@ +#ifndef _GOOM_FX_H +#define _GOOM_FX_H + +#include "goom_visual_fx.h" +#include "goom_plugin_info.h" + +VisualFX convolve_create (); +VisualFX flying_star_create (void); + +void zoom_filter_c(int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_graphic.h b/src/visualizations/Goom/goom2k4-0/src/goom_graphic.h new file mode 100644 index 0000000000..2568396ecf --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goom_graphic.h @@ -0,0 +1,74 @@ +#ifndef GRAPHIC_H +#define GRAPHIC_H + +typedef unsigned int Uint; + +typedef struct +{ + unsigned short r, v, b; +} +Color; + +extern const Color BLACK; +extern const Color WHITE; +extern const Color RED; +extern const Color BLUE; +extern const Color GREEN; +extern const Color YELLOW; +extern const Color ORANGE; +extern const Color VIOLET; + + +#ifdef COLOR_BGRA + +#define R_CHANNEL 0xFF000000 +#define G_CHANNEL 0x00FF0000 +#define B_CHANNEL 0x0000FF00 +#define A_CHANNEL 0x000000FF +#define R_OFFSET 24 +#define G_OFFSET 16 +#define B_OFFSET 8 +#define A_OFFSET 0 + +typedef union _PIXEL { + struct { + unsigned char r; + unsigned char g; + unsigned char b; + unsigned char a; + } channels; + unsigned int val; + unsigned char cop[4]; +} Pixel; + +#else + +#define A_CHANNEL 0xFF000000 +#define R_CHANNEL 0x00FF0000 +#define G_CHANNEL 0x0000FF00 +#define B_CHANNEL 0x000000FF +#define A_OFFSET 24 +#define R_OFFSET 16 +#define G_OFFSET 8 +#define B_OFFSET 0 + +typedef union _PIXEL { + struct { + unsigned char a; + unsigned char r; + unsigned char g; + unsigned char b; + } channels; + unsigned int val; + unsigned char cop[4]; +} Pixel; + +#endif /* COLOR_BGRA */ + +/* +inline void setPixelRGB (Pixel * buffer, Uint x, Uint y, Color c); +inline void getPixelRGB (Pixel * buffer, Uint x, Uint y, Color * c); +*/ + + +#endif /* GRAPHIC_H */ diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_hash.c b/src/visualizations/Goom/goom2k4-0/src/goom_hash.c new file mode 100644 index 0000000000..f21a6d6c32 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goom_hash.c @@ -0,0 +1,100 @@ +#include "goom_hash.h" +#include <string.h> +#include <stdlib.h> + +static GoomHashEntry *entry_new(const char *key, HashValue value) { + + GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry)); + + entry->key = (char *)malloc(strlen(key)+1); + strcpy(entry->key,key); + entry->value = value; + entry->lower = NULL; + entry->upper = NULL; + + return entry; +} + +static void entry_free(GoomHashEntry *entry) { + if (entry!=NULL) { + entry_free(entry->lower); + entry_free(entry->upper); + free(entry->key); + free(entry); + } +} + +static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) { + int cmp = strcmp(key,entry->key); + if (cmp==0) { + entry->value = value; + } + else if (cmp > 0) { + if (entry->upper == NULL) + entry->upper = entry_new(key,value); + else + entry_put(entry->upper, key, value); + } + else { + if (entry->lower == NULL) + entry->lower = entry_new(key,value); + else + entry_put(entry->lower, key, value); + } +} + +static HashValue *entry_get(GoomHashEntry *entry, const char *key) { + + int cmp; + if (entry==NULL) + return NULL; + cmp = strcmp(key,entry->key); + if (cmp > 0) + return entry_get(entry->upper, key); + else if (cmp < 0) + return entry_get(entry->lower, key); + else + return &(entry->value); +} + +GoomHash *goom_hash_new(void) { + GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash)); + _this->root = NULL; + return _this; +} + +void goom_hash_free(GoomHash *_this) { + entry_free(_this->root); + free(_this); +} + +void goom_hash_put(GoomHash *_this, const char *key, HashValue value) { + if (_this->root == NULL) + _this->root = entry_new(key,value); + else + entry_put(_this->root,key,value); +} + +HashValue *goom_hash_get(GoomHash *_this, const char *key) { + return entry_get(_this->root,key); +} + +void goom_hash_put_int(GoomHash *_this, const char *key, int i) { + HashValue value; + value.i = i; + goom_hash_put(_this,key,value); +} + +void goom_hash_put_float(GoomHash *_this, const char *key, float f) { + HashValue value; + value.f = f; + goom_hash_put(_this,key,value); +} + +void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) { + HashValue value; + value.ptr = ptr; + goom_hash_put(_this,key,value); +} + + diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_hash.h b/src/visualizations/Goom/goom2k4-0/src/goom_hash.h new file mode 100644 index 0000000000..c8eae37ed9 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goom_hash.h @@ -0,0 +1,34 @@ +#ifndef _GOOM_HASH_H +#define _GOOM_HASH_H + +typedef struct GOOM_HASH_ENTRY GoomHashEntry; +typedef struct GOOM_HASH GoomHash; + +typedef union { + void *ptr; + int i; + float f; +} HashValue; + +struct GOOM_HASH_ENTRY { + char *key; + HashValue value; + GoomHashEntry *lower; + GoomHashEntry *upper; +}; + +struct GOOM_HASH { + GoomHashEntry *root; +}; + +GoomHash *goom_hash_new(void); +void goom_hash_free(GoomHash *gh); + +void goom_hash_put(GoomHash *gh, const char *key, HashValue value); +HashValue *goom_hash_get(GoomHash *gh, const char *key); + +void goom_hash_put_int(GoomHash *_this, const char *key, int i); +void goom_hash_put_float(GoomHash *_this, const char *key, float f); +void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr); + +#endif /* _GOOM_HASH_H */ diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_plugin_info.h b/src/visualizations/Goom/goom2k4-0/src/goom_plugin_info.h new file mode 100644 index 0000000000..8d5d098bab --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goom_plugin_info.h @@ -0,0 +1,176 @@ +#ifndef _PLUGIN_INFO_H +#define _PLUGIN_INFO_H + +#include "goom_typedefs.h" + +#include "goom_config.h" + +#include "goom_graphic.h" +#include "goom_config_param.h" +#include "goom_visual_fx.h" +#include "goom_filters.h" +#include "goom_tools.h" +#include "goomsl.h" + +typedef struct { + char drawIFS; + char drawPoints; + char drawTentacle; + + char drawScope; + int farScope; + + int rangemin; + int rangemax; +} GoomState; + +#define STATES_MAX_NB 128 + +/** + * Gives informations about the sound. + */ +struct _SOUND_INFO { + + /* nota : a Goom is just a sound event... */ + + int timeSinceLastGoom; /* >= 0 */ + float goomPower; /* power of the last Goom [0..1] */ + + int timeSinceLastBigGoom; /* >= 0 */ + + float volume; /* [0..1] */ + short samples[2][512]; + + /* other "internal" datas for the sound_tester */ + float goom_limit; /* auto-updated limit of goom_detection */ + float bigGoomLimit; + float accelvar; /* acceleration of the sound - [0..1] */ + float speedvar; /* speed of the sound - [0..100] */ + int allTimesMax; + int totalgoom; /* number of goom since last reset + * (a reset every 64 cycles) */ + + float prov_max; /* accel max since last reset */ + + int cycle; + + /* private */ + PluginParam volume_p; + PluginParam speed_p; + PluginParam accel_p; + PluginParam goom_limit_p; + PluginParam goom_power_p; + PluginParam last_goom_p; + PluginParam last_biggoom_p; + PluginParam biggoom_speed_limit_p; + PluginParam biggoom_factor_p; + + PluginParameters params; /* contains the previously defined parameters. */ +}; + + +/** + * Allows FXs to know the current state of the plugin. + */ +struct _PLUGIN_INFO { + + /* public datas */ + + int nbParams; + PluginParameters *params; + + /* private datas */ + + struct _SIZE_TYPE { + int width; + int height; + int size; /* == screen.height * screen.width. */ + } screen; + + SoundInfo sound; + + int nbVisuals; + VisualFX **visuals; /* pointers on all the visual fx */ + + /** The known FX */ + VisualFX convolve_fx; + VisualFX star_fx; + VisualFX zoomFilter_fx; + VisualFX tentacles_fx; + VisualFX ifs_fx; + + /** image buffers */ + guint32 *pixel; + guint32 *back; + Pixel *p1, *p2; + Pixel *conv; + Pixel *outputBuf; + + /** state of goom */ + guint32 cycle; + GoomState states[STATES_MAX_NB]; + int statesNumber; + int statesRangeMax; + + GoomState *curGState; + + /** effet de ligne.. */ + GMLine *gmline1; + GMLine *gmline2; + + /** sinus table */ + int sintable[0x10000]; + + /* INTERNALS */ + + /** goom_update internals. + * I took all static variables from goom_update and put them here.. for the moment. + */ + struct { + int lockvar; /* pour empecher de nouveaux changements */ + int goomvar; /* boucle des gooms */ + int loopvar; /* mouvement des points */ + int stop_lines; + int ifs_incr; /* dessiner l'ifs (0 = non: > = increment) */ + int decay_ifs; /* disparition de l'ifs */ + int recay_ifs; /* dedisparition de l'ifs */ + int cyclesSinceLastChange; /* nombre de Cycle Depuis Dernier Changement */ + int drawLinesDuration; /* duree de la transition entre afficher les lignes ou pas */ + int lineMode; /* l'effet lineaire a dessiner */ + float switchMultAmount; /* SWITCHMULT (29.0f/30.0f) */ + int switchIncrAmount; /* 0x7f */ + float switchMult; /* 1.0f */ + int switchIncr; /* = SWITCHINCR; */ + int stateSelectionRnd; + int stateSelectionBlocker; + int previousZoomSpeed; + int timeOfTitleDisplay; + char titleText[1024]; + ZoomFilterData zoomFilterData; + } update; + + struct { + int numberOfLinesInMessage; + char message[0x800]; + int affiche; + int longueur; + } update_message; + + struct { + void (*draw_line) (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); + void (*zoom_filter) (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); + } methods; + + GoomRandom *gRandom; + + GoomSL *scanner; + GoomSL *main_scanner; + const char *main_script_str; +}; + +void plugin_info_init(PluginInfo *p, int nbVisual); + +/* i = [0..p->nbVisual-1] */ +void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual); + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_tools.c b/src/visualizations/Goom/goom2k4-0/src/goom_tools.c new file mode 100644 index 0000000000..8bd6202fff --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goom_tools.c @@ -0,0 +1,25 @@ +#include "goom_tools.h" +#include <stdlib.h> + +GoomRandom *goom_random_init(int i) { + GoomRandom *grandom = (GoomRandom*)malloc(sizeof(GoomRandom)); + srand (i); + grandom->pos = 1; + goom_random_update_array(grandom, GOOM_NB_RAND); + return grandom; +} + +void goom_random_free(GoomRandom *grandom) { + free(grandom); +} + +void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange) { + while (numberOfValuesToChange > 0) { +#if RAND_MAX < 0x10000 + grandom->array[grandom->pos++] = ((rand()<<16)+rand()) / 127; +#else + grandom->array[grandom->pos++] = rand() / 127; +#endif + numberOfValuesToChange--; + } +} diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_tools.h b/src/visualizations/Goom/goom2k4-0/src/goom_tools.h new file mode 100644 index 0000000000..500bfa5672 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goom_tools.h @@ -0,0 +1,42 @@ +#ifndef _GOOMTOOLS_H +#define _GOOMTOOLS_H + +/** + * Random number generator wrapper for faster random number. + */ + +#ifdef _WIN32PC +#define inline __inline +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif +#define random rand +#define bzero(x,y) memset(x,0,y) +#endif + +#define GOOM_NB_RAND 0x10000 + +typedef struct _GOOM_RANDOM { + int array[GOOM_NB_RAND]; + unsigned short pos; +} GoomRandom; + +GoomRandom *goom_random_init(int i); +void goom_random_free(GoomRandom *grandom); + +inline static int goom_random(GoomRandom *grandom) { + + grandom->pos++; /* works because pos is an unsigned short */ + return grandom->array[grandom->pos]; +} + +inline static int goom_irand(GoomRandom *grandom, int i) { + + grandom->pos++; + return grandom->array[grandom->pos] % i; +} + +/* called to change the specified number of value in the array, so that the array does not remain the same*/ +void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange); + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_typedefs.h b/src/visualizations/Goom/goom2k4-0/src/goom_typedefs.h new file mode 100644 index 0000000000..76036504b3 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goom_typedefs.h @@ -0,0 +1,11 @@ +#ifndef _GOOM_TYPEDEFS_H +#define _GOOM_TYPEDEFS_H + +typedef struct _PLUGIN_INFO PluginInfo; +typedef struct _SOUND_INFO SoundInfo; +typedef struct _GMLINE GMLine; +typedef struct _GMUNITPOINTER GMUnitPointer; +typedef struct _ZOOM_FILTER_DATA ZoomFilterData; +typedef struct _VISUAL_FX VisualFX; + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/goom_visual_fx.h b/src/visualizations/Goom/goom2k4-0/src/goom_visual_fx.h new file mode 100644 index 0000000000..6939ac8041 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goom_visual_fx.h @@ -0,0 +1,26 @@ +#ifndef _VISUAL_FX_H +#define _VISUAL_FX_H + +/** + * File created on 2003-05-21 by Jeko. + * (c)2003, JC Hoelt for iOS-software. + * + * LGPL Licence. + * If you use this file on a visual program, + * please make my name being visible on it. + */ + +#include "goom_config_param.h" +#include "goom_graphic.h" +#include "goom_typedefs.h" + +struct _VISUAL_FX { + void (*init) (struct _VISUAL_FX *_this, PluginInfo *info); + void (*free) (struct _VISUAL_FX *_this); + void (*apply) (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info); + void *fx_data; + + PluginParameters *params; +}; + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl.c b/src/visualizations/Goom/goom2k4-0/src/goomsl.c new file mode 100644 index 0000000000..7bf61ab03c --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goomsl.c @@ -0,0 +1,1514 @@ +#include <math.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include "goomsl.h" +#include "goomsl_private.h" +#include "goomsl_yacc.h" + +/*#define TRACE_SCRIPT*/ + + /* {{{ definition of the instructions number */ +#define INSTR_SETI_VAR_INTEGER 1 +#define INSTR_SETI_VAR_VAR 2 +#define INSTR_SETF_VAR_FLOAT 3 +#define INSTR_SETF_VAR_VAR 4 +#define INSTR_NOP 5 +/* #define INSTR_JUMP 6 */ +#define INSTR_SETP_VAR_PTR 7 +#define INSTR_SETP_VAR_VAR 8 +#define INSTR_SUBI_VAR_INTEGER 9 +#define INSTR_SUBI_VAR_VAR 10 +#define INSTR_SUBF_VAR_FLOAT 11 +#define INSTR_SUBF_VAR_VAR 12 +#define INSTR_ISLOWERF_VAR_VAR 13 +#define INSTR_ISLOWERF_VAR_FLOAT 14 +#define INSTR_ISLOWERI_VAR_VAR 15 +#define INSTR_ISLOWERI_VAR_INTEGER 16 +#define INSTR_ADDI_VAR_INTEGER 17 +#define INSTR_ADDI_VAR_VAR 18 +#define INSTR_ADDF_VAR_FLOAT 19 +#define INSTR_ADDF_VAR_VAR 20 +#define INSTR_MULI_VAR_INTEGER 21 +#define INSTR_MULI_VAR_VAR 22 +#define INSTR_MULF_VAR_FLOAT 23 +#define INSTR_MULF_VAR_VAR 24 +#define INSTR_DIVI_VAR_INTEGER 25 +#define INSTR_DIVI_VAR_VAR 26 +#define INSTR_DIVF_VAR_FLOAT 27 +#define INSTR_DIVF_VAR_VAR 28 +/* #define INSTR_JZERO 29 */ +#define INSTR_ISEQUALP_VAR_VAR 30 +#define INSTR_ISEQUALP_VAR_PTR 31 +#define INSTR_ISEQUALI_VAR_VAR 32 +#define INSTR_ISEQUALI_VAR_INTEGER 33 +#define INSTR_ISEQUALF_VAR_VAR 34 +#define INSTR_ISEQUALF_VAR_FLOAT 35 +/* #define INSTR_CALL 36 */ +/* #define INSTR_RET 37 */ +/* #define INSTR_EXT_CALL 38 */ +#define INSTR_NOT_VAR 39 +/* #define INSTR_JNZERO 40 */ +#define INSTR_SETS_VAR_VAR 41 +#define INSTR_ISEQUALS_VAR_VAR 42 +#define INSTR_ADDS_VAR_VAR 43 +#define INSTR_SUBS_VAR_VAR 44 +#define INSTR_MULS_VAR_VAR 45 +#define INSTR_DIVS_VAR_VAR 46 + + /* }}} */ +/* {{{ definition of the validation error types */ +static const char *VALIDATE_OK = "ok"; +#define VALIDATE_ERROR "error while validating " +#define VALIDATE_TODO "todo" +#define VALIDATE_SYNTHAX_ERROR "synthax error" +#define VALIDATE_NO_SUCH_INT "no such integer variable" +#define VALIDATE_NO_SUCH_VAR "no such variable" +#define VALIDATE_NO_SUCH_DEST_VAR "no such destination variable" +#define VALIDATE_NO_SUCH_SRC_VAR "no such src variable" +/* }}} */ + + /***********************************/ + /* PROTOTYPE OF INTERNAL FUNCTIONS */ +/***********************************/ + +/* {{{ */ +static void gsl_instr_free(Instruction *_this); +static const char *gsl_instr_validate(Instruction *_this); +static void gsl_instr_display(Instruction *_this); + +static InstructionFlow *iflow_new(void); +static void iflow_add_instr(InstructionFlow *_this, Instruction *instr); +static void iflow_clean(InstructionFlow *_this); +static void iflow_free(InstructionFlow *_this); +static void iflow_execute(FastInstructionFlow *_this, GoomSL *gsl); +/* }}} */ + + /************************************/ + /* DEFINITION OF INTERNAL FUNCTIONS */ +/************************************/ + +void iflow_free(InstructionFlow *_this) +{ /* {{{ */ + free(_this->instr); + goom_hash_free(_this->labels); + free(_this); /*TODO: finir cette fonction */ +} /* }}} */ + +void iflow_clean(InstructionFlow *_this) +{ /* {{{ */ + /* TODO: clean chaque instruction du flot */ + _this->number = 0; + goom_hash_free(_this->labels); + _this->labels = goom_hash_new(); +} /* }}} */ + +InstructionFlow *iflow_new(void) +{ /* {{{ */ + InstructionFlow *_this = (InstructionFlow*)malloc(sizeof(InstructionFlow)); + _this->number = 0; + _this->tabsize = 6; + _this->instr = (Instruction**)malloc(_this->tabsize * sizeof(Instruction*)); + _this->labels = goom_hash_new(); + + return _this; +} /* }}} */ + +void iflow_add_instr(InstructionFlow *_this, Instruction *instr) +{ /* {{{ */ + if (_this->number == _this->tabsize) { + _this->tabsize *= 2; + _this->instr = (Instruction**)realloc(_this->instr, _this->tabsize * sizeof(Instruction*)); + } + _this->instr[_this->number] = instr; + instr->address = _this->number; + _this->number++; +} /* }}} */ + +void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns) +{ /* {{{ */ + if (_this->cur_param <= 0) { + fprintf(stderr, "ERROR: Line %d, No more params to instructions\n", _this->line_number); + exit(1); + } + _this->vnamespace[_this->cur_param-1] = ns; +} /* }}} */ + +void gsl_instr_add_param(Instruction *instr, char *param, int type) +{ /* {{{ */ + int len; + if (instr==NULL) + return; + if (instr->cur_param==0) + return; + --instr->cur_param; + len = strlen(param); + instr->params[instr->cur_param] = (char*)malloc(len+1); + strcpy(instr->params[instr->cur_param], param); + instr->types[instr->cur_param] = type; + if (instr->cur_param == 0) { + + const char *result = gsl_instr_validate(instr); + if (result != VALIDATE_OK) { + printf("ERROR: Line %d: ", instr->parent->num_lines + 1); + gsl_instr_display(instr); + printf("... %s\n", result); + instr->parent->compilationOK = 0; + exit(1); + } + +#if USE_JITC_X86 + iflow_add_instr(instr->parent->iflow, instr); +#else + if (instr->id != INSTR_NOP) + iflow_add_instr(instr->parent->iflow, instr); + else + gsl_instr_free(instr); +#endif + } +} /* }}} */ + +Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number) +{ /* {{{ */ + Instruction *instr = (Instruction*)malloc(sizeof(Instruction)); + instr->params = (char**)malloc(nb_param*sizeof(char*)); + instr->vnamespace = (GoomHash**)malloc(nb_param*sizeof(GoomHash*)); + instr->types = (int*)malloc(nb_param*sizeof(int)); + instr->cur_param = instr->nb_param = nb_param; + instr->parent = parent; + instr->id = id; + instr->name = name; + instr->jump_label = NULL; + instr->line_number = line_number; + return instr; +} /* }}} */ + +void gsl_instr_free(Instruction *_this) +{ /* {{{ */ + int i; + free(_this->types); + for (i=_this->cur_param; i<_this->nb_param; ++i) + free(_this->params[i]); + free(_this->params); + free(_this); +} /* }}} */ + +void gsl_instr_display(Instruction *_this) +{ /* {{{ */ + int i=_this->nb_param-1; + printf("%s", _this->name); + while(i>=_this->cur_param) { + printf(" %s", _this->params[i]); + --i; + } +} /* }}} */ + + /****************************************/ + /* VALIDATION OF INSTRUCTION PARAMETERS */ +/****************************************/ + +static const char *validate_v_v(Instruction *_this) +{ /* {{{ */ + HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); + HashValue *src = goom_hash_get(_this->vnamespace[0], _this->params[0]); + + if (dest == NULL) { + return VALIDATE_NO_SUCH_DEST_VAR; + } + if (src == NULL) { + return VALIDATE_NO_SUCH_SRC_VAR; + } + _this->data.udest.var = dest->ptr; + _this->data.usrc.var = src->ptr; + return VALIDATE_OK; +} /* }}} */ + +static const char *validate_v_i(Instruction *_this) +{ /* {{{ */ + HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); + _this->data.usrc.value_int = strtol(_this->params[0],NULL,0); + + if (dest == NULL) { + return VALIDATE_NO_SUCH_INT; + } + _this->data.udest.var = dest->ptr; + return VALIDATE_OK; +} /* }}} */ + +static const char *validate_v_p(Instruction *_this) +{ /* {{{ */ + HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); + _this->data.usrc.value_ptr = strtol(_this->params[0],NULL,0); + + if (dest == NULL) { + return VALIDATE_NO_SUCH_INT; + } + _this->data.udest.var = dest->ptr; + return VALIDATE_OK; +} /* }}} */ + +static const char *validate_v_f(Instruction *_this) +{ /* {{{ */ + HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); + _this->data.usrc.value_float = atof(_this->params[0]); + + if (dest == NULL) { + return VALIDATE_NO_SUCH_VAR; + } + _this->data.udest.var = dest->ptr; + return VALIDATE_OK; +} /* }}} */ + +static const char *validate(Instruction *_this, + int vf_f_id, int vf_v_id, + int vi_i_id, int vi_v_id, + int vp_p_id, int vp_v_id, + int vs_v_id) +{ /* {{{ */ + if ((_this->types[1] == TYPE_FVAR) && (_this->types[0] == TYPE_FLOAT)) { + _this->id = vf_f_id; + return validate_v_f(_this); + } + else if ((_this->types[1] == TYPE_FVAR) && (_this->types[0] == TYPE_FVAR)) { + _this->id = vf_v_id; + return validate_v_v(_this); + } + else if ((_this->types[1] == TYPE_IVAR) && (_this->types[0] == TYPE_INTEGER)) { + _this->id = vi_i_id; + return validate_v_i(_this); + } + else if ((_this->types[1] == TYPE_IVAR) && (_this->types[0] == TYPE_IVAR)) { + _this->id = vi_v_id; + return validate_v_v(_this); + } + else if ((_this->types[1] == TYPE_PVAR) && (_this->types[0] == TYPE_PTR)) { + if (vp_p_id == INSTR_NOP) return VALIDATE_ERROR; + _this->id = vp_p_id; + return validate_v_p(_this); + } + else if ((_this->types[1] == TYPE_PVAR) && (_this->types[0] == TYPE_PVAR)) { + _this->id = vp_v_id; + if (vp_v_id == INSTR_NOP) return VALIDATE_ERROR; + return validate_v_v(_this); + } + else if ((_this->types[1] < FIRST_RESERVED) && (_this->types[1] >= 0) && (_this->types[0] == _this->types[1])) { + _this->id = vs_v_id; + if (vs_v_id == INSTR_NOP) return "Impossible operation to perform between two structs"; + return validate_v_v(_this); + } + return VALIDATE_ERROR; +} /* }}} */ + +const char *gsl_instr_validate(Instruction *_this) +{ /* {{{ */ + if (_this->id != INSTR_EXT_CALL) { + int i = _this->nb_param; + while (i>0) + { + i--; + if (_this->types[i] == TYPE_VAR) { + int type = gsl_type_of_var(_this->vnamespace[i], _this->params[i]); + + if (type == INSTR_INT) + _this->types[i] = TYPE_IVAR; + else if (type == INSTR_FLOAT) + _this->types[i] = TYPE_FVAR; + else if (type == INSTR_PTR) + _this->types[i] = TYPE_PVAR; + else if ((type >= 0) && (type < FIRST_RESERVED)) + _this->types[i] = type; + else fprintf(stderr,"WARNING: Line %d, %s has no namespace\n", _this->line_number, _this->params[i]); + } + } + } + + switch (_this->id) { + + /* set */ + case INSTR_SET: + return validate(_this, + INSTR_SETF_VAR_FLOAT, INSTR_SETF_VAR_VAR, + INSTR_SETI_VAR_INTEGER, INSTR_SETI_VAR_VAR, + INSTR_SETP_VAR_PTR, INSTR_SETP_VAR_VAR, + INSTR_SETS_VAR_VAR); + + /* extcall */ + case INSTR_EXT_CALL: + if (_this->types[0] == TYPE_VAR) { + HashValue *fval = goom_hash_get(_this->parent->functions, _this->params[0]); + if (fval) { + _this->data.udest.external_function = (struct _ExternalFunctionStruct*)fval->ptr; + return VALIDATE_OK; + } + } + return VALIDATE_ERROR; + + /* call */ + case INSTR_CALL: + if (_this->types[0] == TYPE_LABEL) { + _this->jump_label = _this->params[0]; + return VALIDATE_OK; + } + return VALIDATE_ERROR; + + /* ret */ + case INSTR_RET: + return VALIDATE_OK; + + /* jump */ + case INSTR_JUMP: + + if (_this->types[0] == TYPE_LABEL) { + _this->jump_label = _this->params[0]; + return VALIDATE_OK; + } + return VALIDATE_ERROR; + + /* jzero / jnzero */ + case INSTR_JZERO: + case INSTR_JNZERO: + + if (_this->types[0] == TYPE_LABEL) { + _this->jump_label = _this->params[0]; + return VALIDATE_OK; + } + return VALIDATE_ERROR; + + /* label */ + case INSTR_LABEL: + + if (_this->types[0] == TYPE_LABEL) { + _this->id = INSTR_NOP; + _this->nop_label = _this->params[0]; + goom_hash_put_int(_this->parent->iflow->labels, _this->params[0], _this->parent->iflow->number); + return VALIDATE_OK; + } + return VALIDATE_ERROR; + + /* isequal */ + case INSTR_ISEQUAL: + return validate(_this, + INSTR_ISEQUALF_VAR_FLOAT, INSTR_ISEQUALF_VAR_VAR, + INSTR_ISEQUALI_VAR_INTEGER, INSTR_ISEQUALI_VAR_VAR, + INSTR_ISEQUALP_VAR_PTR, INSTR_ISEQUALP_VAR_VAR, + INSTR_ISEQUALS_VAR_VAR); + + /* not */ + case INSTR_NOT: + _this->id = INSTR_NOT_VAR; + return VALIDATE_OK; + + /* islower */ + case INSTR_ISLOWER: + return validate(_this, + INSTR_ISLOWERF_VAR_FLOAT, INSTR_ISLOWERF_VAR_VAR, + INSTR_ISLOWERI_VAR_INTEGER, INSTR_ISLOWERI_VAR_VAR, + INSTR_NOP, INSTR_NOP, INSTR_NOP); + + /* add */ + case INSTR_ADD: + return validate(_this, + INSTR_ADDF_VAR_FLOAT, INSTR_ADDF_VAR_VAR, + INSTR_ADDI_VAR_INTEGER, INSTR_ADDI_VAR_VAR, + INSTR_NOP, INSTR_NOP, + INSTR_ADDS_VAR_VAR); + + /* mul */ + case INSTR_MUL: + return validate(_this, + INSTR_MULF_VAR_FLOAT, INSTR_MULF_VAR_VAR, + INSTR_MULI_VAR_INTEGER, INSTR_MULI_VAR_VAR, + INSTR_NOP, INSTR_NOP, + INSTR_MULS_VAR_VAR); + + /* sub */ + case INSTR_SUB: + return validate(_this, + INSTR_SUBF_VAR_FLOAT, INSTR_SUBF_VAR_VAR, + INSTR_SUBI_VAR_INTEGER, INSTR_SUBI_VAR_VAR, + INSTR_NOP, INSTR_NOP, + INSTR_SUBS_VAR_VAR); + + /* div */ + case INSTR_DIV: + return validate(_this, + INSTR_DIVF_VAR_FLOAT, INSTR_DIVF_VAR_VAR, + INSTR_DIVI_VAR_INTEGER, INSTR_DIVI_VAR_VAR, + INSTR_NOP,INSTR_NOP, + INSTR_DIVS_VAR_VAR); + + default: + return VALIDATE_TODO; + } + return VALIDATE_ERROR; +} /* }}} */ + + /*************/ + /* EXECUTION */ +/*************/ +void iflow_execute(FastInstructionFlow *_this, GoomSL *gsl) +{ /* {{{ */ + int flag = 0; + int ip = 0; + FastInstruction *instr = _this->instr; + int stack[0x10000]; + int stack_pointer = 0; + + stack[stack_pointer++] = -1; + + /* Quelques Macro pour rendre le code plus lisible */ +#define pSRC_VAR instr[ip].data.usrc.var +#define SRC_VAR_INT *instr[ip].data.usrc.var_int +#define SRC_VAR_FLOAT *instr[ip].data.usrc.var_float +#define SRC_VAR_PTR *instr[ip].data.usrc.var_ptr + +#define pDEST_VAR instr[ip].data.udest.var +#define DEST_VAR_INT *instr[ip].data.udest.var_int +#define DEST_VAR_FLOAT *instr[ip].data.udest.var_float +#define DEST_VAR_PTR *instr[ip].data.udest.var_ptr + +#define VALUE_INT instr[ip].data.usrc.value_int +#define VALUE_FLOAT instr[ip].data.usrc.value_float +#define VALUE_PTR instr[ip].data.usrc.value_ptr + +#define JUMP_OFFSET instr[ip].data.udest.jump_offset + +#define SRC_STRUCT_ID instr[ip].data.usrc.var_int[-1] +#define DEST_STRUCT_ID instr[ip].data.udest.var_int[-1] +#define SRC_STRUCT_IBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i] +#define SRC_STRUCT_FBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i] +#define DEST_STRUCT_IBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i] +#define DEST_STRUCT_FBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i] +#define DEST_STRUCT_IBLOCK_VAR(i,j) \ + ((int*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i].data))[j] +#define DEST_STRUCT_FBLOCK_VAR(i,j) \ + ((float*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i].data))[j] +#define SRC_STRUCT_IBLOCK_VAR(i,j) \ + ((int*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i].data))[j] +#define SRC_STRUCT_FBLOCK_VAR(i,j) \ + ((float*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i].data))[j] +#define DEST_STRUCT_SIZE gsl->gsl_struct[DEST_STRUCT_ID]->size + + while (1) + { + int i; +#ifdef TRACE_SCRIPT + printf("execute "); gsl_instr_display(instr[ip].proto); printf("\n"); +#endif + switch (instr[ip].id) { + + /* SET.I */ + case INSTR_SETI_VAR_INTEGER: + DEST_VAR_INT = VALUE_INT; + ++ip; break; + + case INSTR_SETI_VAR_VAR: + DEST_VAR_INT = SRC_VAR_INT; + ++ip; break; + + /* SET.F */ + case INSTR_SETF_VAR_FLOAT: + DEST_VAR_FLOAT = VALUE_FLOAT; + ++ip; break; + + case INSTR_SETF_VAR_VAR: + DEST_VAR_FLOAT = SRC_VAR_FLOAT; + ++ip; break; + + /* SET.P */ + case INSTR_SETP_VAR_VAR: + DEST_VAR_PTR = SRC_VAR_PTR; + ++ip; break; + + case INSTR_SETP_VAR_PTR: + DEST_VAR_PTR = VALUE_PTR; + ++ip; break; + + /* JUMP */ + case INSTR_JUMP: + ip += JUMP_OFFSET; break; + + /* JZERO */ + case INSTR_JZERO: + ip += (flag ? 1 : JUMP_OFFSET); break; + + case INSTR_NOP: + ++ip; break; + + /* ISEQUAL.P */ + case INSTR_ISEQUALP_VAR_VAR: + flag = (DEST_VAR_PTR == SRC_VAR_PTR); + ++ip; break; + + case INSTR_ISEQUALP_VAR_PTR: + flag = (DEST_VAR_PTR == VALUE_PTR); + ++ip; break; + + /* ISEQUAL.I */ + case INSTR_ISEQUALI_VAR_VAR: + flag = (DEST_VAR_INT == SRC_VAR_INT); + ++ip; break; + + case INSTR_ISEQUALI_VAR_INTEGER: + flag = (DEST_VAR_INT == VALUE_INT); + ++ip; break; + + /* ISEQUAL.F */ + case INSTR_ISEQUALF_VAR_VAR: + flag = (DEST_VAR_FLOAT == SRC_VAR_FLOAT); + ++ip; break; + + case INSTR_ISEQUALF_VAR_FLOAT: + flag = (DEST_VAR_FLOAT == VALUE_FLOAT); + ++ip; break; + + /* ISLOWER.I */ + case INSTR_ISLOWERI_VAR_VAR: + flag = (DEST_VAR_INT < SRC_VAR_INT); + ++ip; break; + + case INSTR_ISLOWERI_VAR_INTEGER: + flag = (DEST_VAR_INT < VALUE_INT); + ++ip; break; + + /* ISLOWER.F */ + case INSTR_ISLOWERF_VAR_VAR: + flag = (DEST_VAR_FLOAT < SRC_VAR_FLOAT); + ++ip; break; + + case INSTR_ISLOWERF_VAR_FLOAT: + flag = (DEST_VAR_FLOAT < VALUE_FLOAT); + ++ip; break; + + /* ADD.I */ + case INSTR_ADDI_VAR_VAR: + DEST_VAR_INT += SRC_VAR_INT; + ++ip; break; + + case INSTR_ADDI_VAR_INTEGER: + DEST_VAR_INT += VALUE_INT; + ++ip; break; + + /* ADD.F */ + case INSTR_ADDF_VAR_VAR: + DEST_VAR_FLOAT += SRC_VAR_FLOAT; + ++ip; break; + + case INSTR_ADDF_VAR_FLOAT: + DEST_VAR_FLOAT += VALUE_FLOAT; + ++ip; break; + + /* MUL.I */ + case INSTR_MULI_VAR_VAR: + DEST_VAR_INT *= SRC_VAR_INT; + ++ip; break; + + case INSTR_MULI_VAR_INTEGER: + DEST_VAR_INT *= VALUE_INT; + ++ip; break; + + /* MUL.F */ + case INSTR_MULF_VAR_FLOAT: + DEST_VAR_FLOAT *= VALUE_FLOAT; + ++ip; break; + + case INSTR_MULF_VAR_VAR: + DEST_VAR_FLOAT *= SRC_VAR_FLOAT; + ++ip; break; + + /* DIV.I */ + case INSTR_DIVI_VAR_VAR: + DEST_VAR_INT /= SRC_VAR_INT; + ++ip; break; + + case INSTR_DIVI_VAR_INTEGER: + DEST_VAR_INT /= VALUE_INT; + ++ip; break; + + /* DIV.F */ + case INSTR_DIVF_VAR_FLOAT: + DEST_VAR_FLOAT /= VALUE_FLOAT; + ++ip; break; + + case INSTR_DIVF_VAR_VAR: + DEST_VAR_FLOAT /= SRC_VAR_FLOAT; + ++ip; break; + + /* SUB.I */ + case INSTR_SUBI_VAR_VAR: + DEST_VAR_INT -= SRC_VAR_INT; + ++ip; break; + + case INSTR_SUBI_VAR_INTEGER: + DEST_VAR_INT -= VALUE_INT; + ++ip; break; + + /* SUB.F */ + case INSTR_SUBF_VAR_FLOAT: + DEST_VAR_FLOAT -= VALUE_FLOAT; + ++ip; break; + + case INSTR_SUBF_VAR_VAR: + DEST_VAR_FLOAT -= SRC_VAR_FLOAT; + ++ip; break; + + /* CALL */ + case INSTR_CALL: + stack[stack_pointer++] = ip + 1; + ip += JUMP_OFFSET; break; + + /* RET */ + case INSTR_RET: + ip = stack[--stack_pointer]; + if (ip<0) return; + break; + + /* EXT_CALL */ + case INSTR_EXT_CALL: + instr[ip].data.udest.external_function->function(gsl, gsl->vars, instr[ip].data.udest.external_function->vars); + ++ip; break; + + /* NOT */ + case INSTR_NOT_VAR: + flag = !flag; + ++ip; break; + + /* JNZERO */ + case INSTR_JNZERO: + ip += (flag ? JUMP_OFFSET : 1); break; + + case INSTR_SETS_VAR_VAR: + memcpy(pDEST_VAR, pSRC_VAR, DEST_STRUCT_SIZE); + ++ip; break; + + case INSTR_ISEQUALS_VAR_VAR: + break; + + case INSTR_ADDS_VAR_VAR: + /* process integers */ + i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + DEST_STRUCT_IBLOCK_VAR(i,j) += SRC_STRUCT_IBLOCK_VAR(i,j); + } + ++i; + } + /* process floats */ + i=0; + while (DEST_STRUCT_FBLOCK(i).size > 0) { + int j=DEST_STRUCT_FBLOCK(i).size; + while (j--) { + DEST_STRUCT_FBLOCK_VAR(i,j) += SRC_STRUCT_FBLOCK_VAR(i,j); + } + ++i; + } + ++ip; break; + + case INSTR_SUBS_VAR_VAR: + /* process integers */ + i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + DEST_STRUCT_IBLOCK_VAR(i,j) -= SRC_STRUCT_IBLOCK_VAR(i,j); + } + ++i; + } + /* process floats */ + i=0; + while (DEST_STRUCT_FBLOCK(i).size > 0) { + int j=DEST_STRUCT_FBLOCK(i).size; + while (j--) { + DEST_STRUCT_FBLOCK_VAR(i,j) -= SRC_STRUCT_FBLOCK_VAR(i,j); + } + ++i; + } + ++ip; break; + + case INSTR_MULS_VAR_VAR: + /* process integers */ + i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + DEST_STRUCT_IBLOCK_VAR(i,j) *= SRC_STRUCT_IBLOCK_VAR(i,j); + } + ++i; + } + /* process floats */ + i=0; + while (DEST_STRUCT_FBLOCK(i).size > 0) { + int j=DEST_STRUCT_FBLOCK(i).size; + while (j--) { + DEST_STRUCT_FBLOCK_VAR(i,j) *= SRC_STRUCT_FBLOCK_VAR(i,j); + } + ++i; + } + ++ip; break; + + case INSTR_DIVS_VAR_VAR: + /* process integers */ + i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + DEST_STRUCT_IBLOCK_VAR(i,j) /= SRC_STRUCT_IBLOCK_VAR(i,j); + } + ++i; + } + /* process floats */ + i=0; + while (DEST_STRUCT_FBLOCK(i).size > 0) { + int j=DEST_STRUCT_FBLOCK(i).size; + while (j--) { + DEST_STRUCT_FBLOCK_VAR(i,j) /= SRC_STRUCT_FBLOCK_VAR(i,j); + } + ++i; + } + ++ip; break; + + default: + printf("NOT IMPLEMENTED : %d\n", instr[ip].id); + ++ip; + exit(1); + } + } +} /* }}} */ + +int gsl_malloc(GoomSL *_this, int size) +{ /* {{{ */ + if (_this->nbPtr >= _this->ptrArraySize) { + _this->ptrArraySize *= 2; + _this->ptrArray = (void**)realloc(_this->ptrArray, sizeof(void*) * _this->ptrArraySize); + } + _this->ptrArray[_this->nbPtr] = malloc(size); + return _this->nbPtr++; +} /* }}} */ + +void *gsl_get_ptr(GoomSL *_this, int id) +{ /* {{{ */ + if ((id>=0)&&(id<_this->nbPtr)) + return _this->ptrArray[id]; + fprintf(stderr,"INVALID GET PTR 0x%08x\n", id); + return NULL; +} /* }}} */ + +void gsl_free_ptr(GoomSL *_this, int id) +{ /* {{{ */ + if ((id>=0)&&(id<_this->nbPtr)) { + free(_this->ptrArray[id]); + _this->ptrArray[id] = 0; + } +} /* }}} */ + +void gsl_enternamespace(const char *name) +{ /* {{{ */ + HashValue *val = goom_hash_get(currentGoomSL->functions, name); + if (val) { + ExternalFunctionStruct *function = (ExternalFunctionStruct*)val->ptr; + currentGoomSL->currentNS++; + currentGoomSL->namespaces[currentGoomSL->currentNS] = function->vars; + } + else { + fprintf(stderr, "ERROR: Line %d, Could not find namespace: %s\n", currentGoomSL->num_lines, name); + exit(1); + } +} /* }}} */ + +void gsl_reenternamespace(GoomHash *nsinfo) { + currentGoomSL->currentNS++; + currentGoomSL->namespaces[currentGoomSL->currentNS] = nsinfo; +} + +GoomHash *gsl_leavenamespace(void) +{ /* {{{ */ + currentGoomSL->currentNS--; + return currentGoomSL->namespaces[currentGoomSL->currentNS+1]; +} /* }}} */ + +GoomHash *gsl_find_namespace(const char *name) +{ /* {{{ */ + int i; + for (i=currentGoomSL->currentNS;i>=0;--i) { + if (goom_hash_get(currentGoomSL->namespaces[i], name)) + return currentGoomSL->namespaces[i]; + } + return NULL; +} /* }}} */ + +void gsl_declare_task(const char *name) +{ /* {{{ */ + if (goom_hash_get(currentGoomSL->functions, name)) { + return; + } + else { + ExternalFunctionStruct *gef = (ExternalFunctionStruct*)malloc(sizeof(ExternalFunctionStruct)); + gef->function = 0; + gef->vars = goom_hash_new(); + gef->is_extern = 0; + goom_hash_put_ptr(currentGoomSL->functions, name, (void*)gef); + } +} /* }}} */ + +void gsl_declare_external_task(const char *name) +{ /* {{{ */ + if (goom_hash_get(currentGoomSL->functions, name)) { + fprintf(stderr, "ERROR: Line %d, Duplicate declaration of %s\n", currentGoomSL->num_lines, name); + return; + } + else { + ExternalFunctionStruct *gef = (ExternalFunctionStruct*)malloc(sizeof(ExternalFunctionStruct)); + gef->function = 0; + gef->vars = goom_hash_new(); + gef->is_extern = 1; + goom_hash_put_ptr(currentGoomSL->functions, name, (void*)gef); + } +} /* }}} */ + +static void reset_scanner(GoomSL *gss) +{ /* {{{ */ + gss->num_lines = 0; + gss->instr = NULL; + iflow_clean(gss->iflow); + + /* reset variables */ + goom_hash_free(gss->vars); + gss->vars = goom_hash_new(); + gss->currentNS = 0; + gss->namespaces[0] = gss->vars; + + goom_hash_free(gss->structIDS); + gss->structIDS = goom_hash_new(); + + while (gss->nbStructID > 0) { + int i; + gss->nbStructID--; + for(i=0;i<gss->gsl_struct[gss->nbStructID]->nbFields;++i) + free(gss->gsl_struct[gss->nbStructID]->fields[i]); + free(gss->gsl_struct[gss->nbStructID]); + } + + gss->compilationOK = 1; + + goom_heap_delete(gss->data_heap); + gss->data_heap = goom_heap_new(); +} /* }}} */ + +static void calculate_labels(InstructionFlow *iflow) +{ /* {{{ */ + int i = 0; + while (i < iflow->number) { + Instruction *instr = iflow->instr[i]; + if (instr->jump_label) { + HashValue *label = goom_hash_get(iflow->labels,instr->jump_label); + if (label) { + instr->data.udest.jump_offset = -instr->address + label->i; + } + else { + fprintf(stderr, "ERROR: Line %d, Could not find label %s\n", instr->line_number, instr->jump_label); + instr->id = INSTR_NOP; + instr->nop_label = 0; + exit(1); + } + } + ++i; + } +} /* }}} */ + +static int powerOfTwo(int i) +{ + int b; + for (b=0;b<31;b++) + if (i == (1<<b)) + return b; + return 0; +} + +/* Cree un flow d'instruction optimise */ +static void gsl_create_fast_iflow(void) +{ /* {{{ */ + int number = currentGoomSL->iflow->number; + int i; +#ifdef USE_JITC_X86 + + /* pour compatibilite avec les MACROS servant a execution */ + int ip = 0; + GoomSL *gsl = currentGoomSL; + + JitcX86Env *jitc; + + if (currentGoomSL->jitc != NULL) + jitc_x86_delete(currentGoomSL->jitc); + jitc = currentGoomSL->jitc = jitc_x86_env_new(0xffff); + currentGoomSL->jitc_func = jitc_prepare_func(jitc); + +#if 0 +#define SRC_STRUCT_ID instr[ip].data.usrc.var_int[-1] +#define DEST_STRUCT_ID instr[ip].data.udest.var_int[-1] +#define SRC_STRUCT_IBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i] +#define SRC_STRUCT_FBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i] +#define DEST_STRUCT_IBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i] +#define DEST_STRUCT_FBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i] +#define DEST_STRUCT_IBLOCK_VAR(i,j) \ + ((int*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i].data))[j] +#define DEST_STRUCT_FBLOCK_VAR(i,j) \ + ((float*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i].data))[j] +#define SRC_STRUCT_IBLOCK_VAR(i,j) \ + ((int*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i].data))[j] +#define SRC_STRUCT_FBLOCK_VAR(i,j) \ + ((float*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i].data))[j] +#define DEST_STRUCT_SIZE gsl->gsl_struct[DEST_STRUCT_ID]->size +#endif + + JITC_JUMP_LABEL(jitc, "__very_end__"); + JITC_ADD_LABEL (jitc, "__very_start__"); + + for (i=0;i<number;++i) { + Instruction *instr = currentGoomSL->iflow->instr[i]; + switch (instr->id) { + case INSTR_SETI_VAR_INTEGER : + jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_int, instr->data.usrc.value_int); + break; + case INSTR_SETI_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_int); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + break; + /* SET.F */ + case INSTR_SETF_VAR_FLOAT : + jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_float, *(int*)(&instr->data.usrc.value_float)); + break; + case INSTR_SETF_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_float); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_float); + break; + case INSTR_NOP : + if (instr->nop_label != 0) + JITC_ADD_LABEL(jitc, instr->nop_label); + break; + case INSTR_JUMP : + JITC_JUMP_LABEL(jitc,instr->jump_label); + break; + case INSTR_SETP_VAR_PTR : + jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_ptr, instr->data.usrc.value_ptr); + break; + case INSTR_SETP_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_ptr); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_ptr); + break; + case INSTR_SUBI_VAR_INTEGER : + jitc_add(jitc, "add [$d], $d", instr->data.udest.var_int, -instr->data.usrc.value_int); + break; + case INSTR_SUBI_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "sub eax, [$d]", instr->data.usrc.var_int); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + break; + case INSTR_SUBF_VAR_FLOAT : + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_SUBF_VAR_VAR : + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_ISLOWERF_VAR_VAR: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_ISLOWERF_VAR_FLOAT: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_ISLOWERI_VAR_VAR: + jitc_add(jitc,"mov edx, [$d]", instr->data.udest.var_int); + jitc_add(jitc,"sub edx, [$d]", instr->data.usrc.var_int); + jitc_add(jitc,"shr edx, $d", 31); + break; + case INSTR_ISLOWERI_VAR_INTEGER: + jitc_add(jitc,"mov edx, [$d]", instr->data.udest.var_int); + jitc_add(jitc,"sub edx, $d", instr->data.usrc.value_int); + jitc_add(jitc,"shr edx, $d", 31); + break; + case INSTR_ADDI_VAR_INTEGER: + jitc_add(jitc, "add [$d], $d", instr->data.udest.var_int, instr->data.usrc.value_int); + break; + case INSTR_ADDI_VAR_VAR: + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "add eax, [$d]", instr->data.usrc.var_int); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + break; + case INSTR_ADDF_VAR_FLOAT: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_ADDF_VAR_VAR: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_MULI_VAR_INTEGER: + if (instr->data.usrc.value_int != 1) + { + int po2 = powerOfTwo(instr->data.usrc.value_int); + if (po2) { + /* performs (V / 2^n) by doing V >> n */ + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "sal eax, $d", po2); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + } + else { + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "imul eax, $d", instr->data.usrc.value_int); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + } + } + break; + case INSTR_MULI_VAR_VAR: + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "imul eax, [$d]", instr->data.usrc.var_int); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + break; + case INSTR_MULF_VAR_FLOAT: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_MULF_VAR_VAR: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_DIVI_VAR_INTEGER: + if ((instr->data.usrc.value_int != 1) && (instr->data.usrc.value_int != 0)) + { + int po2 = powerOfTwo(instr->data.usrc.value_int); + if (po2) { + /* performs (V / 2^n) by doing V >> n */ + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "sar eax, $d", po2); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + } + else { + /* performs (V/n) by doing (V*(32^2/n)) */ + long coef; + double dcoef = (double)4294967296.0 / (double)instr->data.usrc.value_int; + if (dcoef < 0.0) dcoef = -dcoef; + coef = (long)floor(dcoef); + dcoef -= floor(dcoef); + if (dcoef < 0.5) coef += 1; + + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "mov edx, $d", coef); + jitc_add(jitc, "imul edx"); + if (instr->data.usrc.value_int < 0) + jitc_add(jitc, "neg edx"); + jitc_add(jitc, "mov [$d], edx", instr->data.udest.var_int); + } + } + break; + case INSTR_DIVI_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "cdq"); /* sign extend eax into edx */ + jitc_add(jitc, "idiv [$d]", instr->data.usrc.var_int); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + break; + case INSTR_DIVF_VAR_FLOAT: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_DIVF_VAR_VAR: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_JZERO: + jitc_add(jitc, "cmp edx, $d", 0); + jitc_add(jitc, "je $s", instr->jump_label); + break; + case INSTR_ISEQUALP_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_ptr); + jitc_add(jitc, "mov edx, $d", 0); + jitc_add(jitc, "cmp eax, [$d]", instr->data.usrc.var_ptr); + jitc_add(jitc, "jne $d", 1); + jitc_add(jitc, "inc edx"); + break; + case INSTR_ISEQUALP_VAR_PTR : + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_ptr); + jitc_add(jitc, "mov edx, $d", 0); + jitc_add(jitc, "cmp eax, $d", instr->data.usrc.value_ptr); + jitc_add(jitc, "jne $d", 1); + jitc_add(jitc, "inc edx"); + break; + case INSTR_ISEQUALI_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "mov edx, $d", 0); + jitc_add(jitc, "cmp eax, [$d]", instr->data.usrc.var_int); + jitc_add(jitc, "jne $d", 1); + jitc_add(jitc, "inc edx"); + break; + case INSTR_ISEQUALI_VAR_INTEGER : + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "mov edx, $d", 0); + jitc_add(jitc, "cmp eax, $d", instr->data.usrc.value_int); + jitc_add(jitc, "jne $d", 1); + jitc_add(jitc, "inc edx"); + break; + case INSTR_ISEQUALF_VAR_VAR : + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_ISEQUALF_VAR_FLOAT : + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_CALL: + jitc_add(jitc, "call $s", instr->jump_label); + break; + case INSTR_RET: + jitc_add(jitc, "ret"); + break; + case INSTR_EXT_CALL: + jitc_add(jitc, "mov eax, [$d]", &(instr->data.udest.external_function->vars)); + jitc_add(jitc, "push eax"); + jitc_add(jitc, "mov edx, [$d]", &(currentGoomSL->vars)); + jitc_add(jitc, "push edx"); + jitc_add(jitc, "mov eax, [$d]", &(currentGoomSL)); + jitc_add(jitc, "push eax"); + + jitc_add(jitc, "mov eax, [$d]", &(instr->data.udest.external_function)); + jitc_add(jitc, "mov eax, [eax]"); + jitc_add(jitc, "call [eax]"); + jitc_add(jitc, "add esp, $d", 12); + break; + case INSTR_NOT_VAR: + jitc_add(jitc, "mov eax, edx"); + jitc_add(jitc, "mov edx, $d", 1); + jitc_add(jitc, "sub edx, eax"); + break; + case INSTR_JNZERO: + jitc_add(jitc, "cmp edx, $d", 0); + jitc_add(jitc, "jne $s", instr->jump_label); + break; + case INSTR_SETS_VAR_VAR: + { + int loop = DEST_STRUCT_SIZE / sizeof(int); + int dst = (int)pDEST_VAR; + int src = (int)pSRC_VAR; + + while (loop--) { + jitc_add(jitc,"mov eax, [$d]", src); + jitc_add(jitc,"mov [$d], eax", dst); + src += 4; + dst += 4; + } + } + break; + case INSTR_ISEQUALS_VAR_VAR: + break; + case INSTR_ADDS_VAR_VAR: + { + /* process integers */ + int i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { /* TODO interlace 2 */ + jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "add eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); + } + ++i; + } + /* process floats */ + i=0; + while (DEST_STRUCT_FBLOCK(i).size > 0) { + int j=DEST_STRUCT_FBLOCK(i).size; + while (j--) { + /* DEST_STRUCT_FBLOCK_VAR(i,j) += SRC_STRUCT_FBLOCK_VAR(i,j); */ + /* TODO */ + } + ++i; + } + break; + } + case INSTR_SUBS_VAR_VAR: + { + /* process integers */ + int i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "sub eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); + } + ++i; + } + break; + } + case INSTR_MULS_VAR_VAR: + { + /* process integers */ + int i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "imul eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); + } + ++i; + } + break; + } + case INSTR_DIVS_VAR_VAR: + { + /* process integers */ + int i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "cdq"); + jitc_add(jitc, "idiv [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); + } + ++i; + } + break; + } + } + } + + JITC_ADD_LABEL (jitc, "__very_end__"); + jitc_add(jitc, "call $s", "__very_start__"); + jitc_add(jitc, "mov eax, $d", 0); + jitc_validate_func(jitc); +#else + InstructionFlow *iflow = currentGoomSL->iflow; + FastInstructionFlow *fastiflow = (FastInstructionFlow*)malloc(sizeof(FastInstructionFlow)); + fastiflow->mallocedInstr = calloc(number*16, sizeof(FastInstruction)); + /* fastiflow->instr = (FastInstruction*)(((int)fastiflow->mallocedInstr) + 16 - (((int)fastiflow->mallocedInstr)%16)); */ + fastiflow->instr = (FastInstruction*)fastiflow->mallocedInstr; + fastiflow->number = number; + for(i=0;i<number;++i) { + fastiflow->instr[i].id = iflow->instr[i]->id; + fastiflow->instr[i].data = iflow->instr[i]->data; + fastiflow->instr[i].proto = iflow->instr[i]; + } + currentGoomSL->fastiflow = fastiflow; +#endif +} /* }}} */ + +void yy_scan_string(const char *str); +void yyparse(void); + +GoomHash *gsl_globals(GoomSL *_this) +{ + return _this->vars; +} + + +/** + * Some native external functions + */ +static void ext_charAt(GoomSL *gsl, GoomHash *global, GoomHash *local) +{ + char *string = GSL_LOCAL_PTR(gsl, local, "value"); + int index = GSL_LOCAL_INT(gsl, local, "index"); + GSL_GLOBAL_INT(gsl, "charAt") = 0; + if (string == NULL) { + return; + } + if (index < strlen(string)) + GSL_GLOBAL_INT(gsl, "charAt") = string[index]; +} + +static void ext_i2f(GoomSL *gsl, GoomHash *global, GoomHash *local) +{ + int i = GSL_LOCAL_INT(gsl, local, "value"); + GSL_GLOBAL_FLOAT(gsl, "i2f") = i; +} + +static void ext_f2i(GoomSL *gsl, GoomHash *global, GoomHash *local) +{ + float f = GSL_LOCAL_FLOAT(gsl, local, "value"); + GSL_GLOBAL_INT(gsl, "f2i") = f; +} + +/** + * + */ +void gsl_compile(GoomSL *_currentGoomSL, const char *script) +{ /* {{{ */ + char *script_and_externals; + static const char *sBinds = + "external <charAt: string value, int index> : int\n" + "external <f2i: float value> : int\n" + "external <i2f: int value> : float\n"; + +#ifdef VERBOSE + printf("\n=== Starting Compilation ===\n"); +#endif + + script_and_externals = malloc(strlen(script) + strlen(sBinds) + 2); + strcpy(script_and_externals, sBinds); + strcat(script_and_externals, script); + + /* 0- reset */ + currentGoomSL = _currentGoomSL; + reset_scanner(currentGoomSL); + + /* 1- create the syntaxic tree */ + yy_scan_string(script_and_externals); + yyparse(); + + /* 2- generate code */ + gsl_commit_compilation(); + + /* 3- resolve symbols */ + calculate_labels(currentGoomSL->iflow); + + /* 4- optimize code */ + gsl_create_fast_iflow(); + + /* 5- bind a few internal functions */ + gsl_bind_function(currentGoomSL, "charAt", ext_charAt); + gsl_bind_function(currentGoomSL, "f2i", ext_f2i); + gsl_bind_function(currentGoomSL, "i2f", ext_i2f); + free(script_and_externals); + +#ifdef VERBOSE + printf("=== Compilation done. # of lines: %d. # of instr: %d ===\n", currentGoomSL->num_lines, currentGoomSL->iflow->number); +#endif +} /* }}} */ + +void gsl_execute(GoomSL *scanner) +{ /* {{{ */ + if (scanner->compilationOK) { +#if USE_JITC_X86 + scanner->jitc_func(); +#else + iflow_execute(scanner->fastiflow, scanner); +#endif + } +} /* }}} */ + +GoomSL *gsl_new(void) +{ /* {{{ */ + GoomSL *gss = (GoomSL*)malloc(sizeof(GoomSL)); + + gss->iflow = iflow_new(); + gss->vars = goom_hash_new(); + gss->functions = goom_hash_new(); + gss->nbStructID = 0; + gss->structIDS = goom_hash_new(); + gss->gsl_struct_size = 32; + gss->gsl_struct = (GSL_Struct**)malloc(gss->gsl_struct_size * sizeof(GSL_Struct*)); + gss->currentNS = 0; + gss->namespaces[0] = gss->vars; + gss->data_heap = goom_heap_new(); + + reset_scanner(gss); + + gss->compilationOK = 0; + gss->nbPtr=0; + gss->ptrArraySize=256; + gss->ptrArray = (void**)malloc(gss->ptrArraySize * sizeof(void*)); +#ifdef USE_JITC_X86 + gss->jitc = NULL; +#endif + return gss; +} /* }}} */ + +void gsl_bind_function(GoomSL *gss, const char *fname, GoomSL_ExternalFunction func) +{ /* {{{ */ + HashValue *val = goom_hash_get(gss->functions, fname); + if (val) { + ExternalFunctionStruct *gef = (ExternalFunctionStruct*)val->ptr; + gef->function = func; + } + else fprintf(stderr, "Unable to bind function %s\n", fname); +} /* }}} */ + +int gsl_is_compiled(GoomSL *gss) +{ /* {{{ */ + return gss->compilationOK; +} /* }}} */ + +void gsl_free(GoomSL *gss) +{ /* {{{ */ + iflow_free(gss->iflow); + goom_hash_free(gss->vars); + goom_hash_free(gss->functions); + goom_hash_free(gss->structIDS); + free(gss->gsl_struct); + goom_heap_delete(gss->data_heap); + free(gss->ptrArray); + free(gss); +} /* }}} */ + + +static int gsl_nb_import; +static char gsl_already_imported[256][256]; + +char *gsl_init_buffer(const char *fname) +{ + char *fbuffer; + fbuffer = (char*)malloc(512); + fbuffer[0]=0; + gsl_nb_import = 0; + if (fname) + gsl_append_file_to_buffer(fname,&fbuffer); + return fbuffer; +} + +static char *gsl_read_file(const char *fname) +{ + FILE *f; + char *buffer; + int fsize; + f = fopen(fname,"rt"); + if (!f) { + fprintf(stderr, "ERROR: Could not load file %s\n", fname); + exit(1); + } + fseek(f,0,SEEK_END); + fsize = ftell(f); + rewind(f); + buffer = (char*)malloc(fsize+512); + fread(buffer,1,fsize,f); + fclose(f); + buffer[fsize]=0; + return buffer; +} + +void gsl_append_file_to_buffer(const char *fname, char **buffer) +{ + char *fbuffer; + int size,fsize,i=0; + char reset_msg[256]; + + /* look if the file have not been already imported */ + for (i=0;i<gsl_nb_import;++i) { + if (strcmp(gsl_already_imported[i], fname) == 0) + return; + } + + /* add fname to the already imported files. */ + strcpy(gsl_already_imported[gsl_nb_import++], fname); + + /* load the file */ + fbuffer = gsl_read_file(fname); + fsize = strlen(fbuffer); + + /* look for #import */ + while (fbuffer[i]) { + if ((fbuffer[i]=='#') && (fbuffer[i+1]=='i')) { + char impName[256]; + int j; + while (fbuffer[i] && (fbuffer[i]!=' ')) + i++; + i++; + j=0; + while (fbuffer[i] && (fbuffer[i]!='\n')) + impName[j++] = fbuffer[i++]; + impName[j++] = 0; + gsl_append_file_to_buffer(impName, buffer); + } + i++; + } + + sprintf(reset_msg, "\n#FILE %s#\n#RST_LINE#\n", fname); + strcat(*buffer, reset_msg); + size=strlen(*buffer); + *buffer = (char*)realloc(*buffer, size+fsize+256); + strcat((*buffer)+size, fbuffer); + free(fbuffer); +} + + diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl.h b/src/visualizations/Goom/goom2k4-0/src/goomsl.h new file mode 100644 index 0000000000..b9f20d6cc4 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goomsl.h @@ -0,0 +1,34 @@ +#ifndef _GOOMSL_H +#define _GOOMSL_H + +#include "goomsl_hash.h" + +typedef struct _GoomSL GoomSL; +typedef void (*GoomSL_ExternalFunction)(GoomSL *gsl, GoomHash *global_vars, GoomHash *local_vars); + +GoomSL*gsl_new(void); +void gsl_free(GoomSL *gss); + +char *gsl_init_buffer(const char *file_name); +void gsl_append_file_to_buffer(const char *file_name, char **buffer); + +void gsl_compile (GoomSL *scanner, const char *script); +void gsl_execute (GoomSL *scanner); +int gsl_is_compiled (GoomSL *gss); +void gsl_bind_function(GoomSL *gss, const char *fname, GoomSL_ExternalFunction func); + +int gsl_malloc (GoomSL *_this, int size); +void *gsl_get_ptr (GoomSL *_this, int id); +void gsl_free_ptr(GoomSL *_this, int id); + +GoomHash *gsl_globals(GoomSL *_this); + +#define GSL_LOCAL_PTR(gsl,local,name) gsl_get_ptr(gsl, *(int*)goom_hash_get(local,name)->ptr) +#define GSL_LOCAL_INT(gsl,local,name) (*(int*)goom_hash_get(local,name)->ptr) +#define GSL_LOCAL_FLOAT(gsl,local,name) (*(float*)goom_hash_get(local,name)->ptr) + +#define GSL_GLOBAL_PTR(gsl,name) gsl_get_ptr(gsl, *(int*)goom_hash_get(gsl_globals(gsl),name)->ptr) +#define GSL_GLOBAL_INT(gsl,name) (*(int*)goom_hash_get(gsl_globals(gsl),name)->ptr) +#define GSL_GLOBAL_FLOAT(gsl,name) (*(float*)goom_hash_get(gsl_globals(gsl),name)->ptr) + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_hash.c b/src/visualizations/Goom/goom2k4-0/src/goomsl_hash.c new file mode 100644 index 0000000000..af2ec44a66 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_hash.c @@ -0,0 +1,120 @@ +#include "goomsl_hash.h" +#include <string.h> +#include <stdlib.h> + +static GoomHashEntry *entry_new(const char *key, HashValue value) { + + int len = strlen(key); + GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry)); + + entry->key = (char *)malloc(len+1); + memcpy(entry->key,key,len+1); + entry->value = value; + entry->lower = NULL; + entry->upper = NULL; + + return entry; +} + +static void entry_free(GoomHashEntry *entry) { + if (entry!=NULL) { + entry_free(entry->lower); + entry_free(entry->upper); + free(entry->key); + free(entry); + } +} + +static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) { + int cmp = strcmp(key,entry->key); + if (cmp==0) { + entry->value = value; + } + else if (cmp > 0) { + if (entry->upper == NULL) + entry->upper = entry_new(key,value); + else + entry_put(entry->upper, key, value); + } + else { + if (entry->lower == NULL) + entry->lower = entry_new(key,value); + else + entry_put(entry->lower, key, value); + } +} + +static HashValue *entry_get(GoomHashEntry *entry, const char *key) { + + int cmp; + if (entry==NULL) + return NULL; + cmp = strcmp(key,entry->key); + if (cmp > 0) + return entry_get(entry->upper, key); + else if (cmp < 0) + return entry_get(entry->lower, key); + else + return &(entry->value); +} + +GoomHash *goom_hash_new() { + GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash)); + _this->root = NULL; + _this->number_of_puts = 0; + return _this; +} + +void goom_hash_free(GoomHash *_this) { + entry_free(_this->root); + free(_this); +} + +void goom_hash_put(GoomHash *_this, const char *key, HashValue value) { + _this->number_of_puts += 1; + if (_this->root == NULL) + _this->root = entry_new(key,value); + else + entry_put(_this->root,key,value); +} + +HashValue *goom_hash_get(GoomHash *_this, const char *key) { + if (_this == NULL) return NULL; + return entry_get(_this->root,key); +} + +void goom_hash_put_int(GoomHash *_this, const char *key, int i) { + HashValue value; + value.i = i; + goom_hash_put(_this,key,value); +} + +void goom_hash_put_float(GoomHash *_this, const char *key, float f) { + HashValue value; + value.f = f; + goom_hash_put(_this,key,value); +} + +void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) { + HashValue value; + value.ptr = ptr; + goom_hash_put(_this,key,value); +} + +/* FOR EACH */ + +static void _goom_hash_for_each(GoomHash *_this, GoomHashEntry *entry, GH_Func func) +{ + if (entry == NULL) return; + func(_this, entry->key, &(entry->value)); + _goom_hash_for_each(_this, entry->lower, func); + _goom_hash_for_each(_this, entry->upper, func); +} + +void goom_hash_for_each(GoomHash *_this, GH_Func func) { + _goom_hash_for_each(_this, _this->root, func); +} + +int goom_hash_number_of_puts(GoomHash *_this) { + return _this->number_of_puts; +} diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_hash.h b/src/visualizations/Goom/goom2k4-0/src/goomsl_hash.h new file mode 100644 index 0000000000..26f4516738 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_hash.h @@ -0,0 +1,40 @@ +#ifndef _GOOMSL_HASH_H +#define _GOOMSL_HASH_H + +typedef struct GOOM_HASH_ENTRY GoomHashEntry; +typedef struct GOOM_HASH GoomHash; + +typedef union { + void *ptr; + int i; + float f; +} HashValue; + +struct GOOM_HASH_ENTRY { + char *key; + HashValue value; + GoomHashEntry *lower; + GoomHashEntry *upper; +}; + +struct GOOM_HASH { + GoomHashEntry *root; + int number_of_puts; +}; + +GoomHash *goom_hash_new(); +void goom_hash_free(GoomHash *gh); + +void goom_hash_put(GoomHash *gh, const char *key, HashValue value); +HashValue *goom_hash_get(GoomHash *gh, const char *key); + +void goom_hash_put_int (GoomHash *_this, const char *key, int i); +void goom_hash_put_float(GoomHash *_this, const char *key, float f); +void goom_hash_put_ptr (GoomHash *_this, const char *key, void *ptr); + +typedef void (*GH_Func)(GoomHash *caller, const char *key, HashValue *value); + +void goom_hash_for_each(GoomHash *_this, GH_Func func); +int goom_hash_number_of_puts(GoomHash *_this); + +#endif /* _GOOM_HASH_H */ diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_heap.c b/src/visualizations/Goom/goom2k4-0/src/goomsl_heap.c new file mode 100644 index 0000000000..73943bf952 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_heap.c @@ -0,0 +1,105 @@ +#include "goomsl_heap.h" +#include <stdlib.h> + +struct _GOOM_HEAP { + void **arrays; + int number_of_arrays; + int size_of_each_array; + int consumed_in_last_array; +}; + +/* Constructors / Destructor */ +GoomHeap *goom_heap_new(void) +{ + return goom_heap_new_with_granularity(4096); +} + +GoomHeap *goom_heap_new_with_granularity(int granularity) +{ + GoomHeap *_this; + _this = (GoomHeap*)malloc(sizeof(GoomHeap)); + _this->number_of_arrays = 0; + _this->size_of_each_array = granularity; + _this->consumed_in_last_array = 0; + _this->arrays = (void**)malloc(sizeof(void*)); + return _this; +} + +void goom_heap_delete(GoomHeap *_this) +{ + int i; + for (i=0;i<_this->number_of_arrays;++i) { + free(_this->arrays[i]); + } + free(_this->arrays); + free(_this); +} + +static void align_it(GoomHeap *_this, int alignment) +{ + if ((alignment > 1) && (_this->number_of_arrays>0)) { + void *last_array = _this->arrays[_this->number_of_arrays - 1]; + int last_address = (int)last_array + _this->consumed_in_last_array; + int decal = (last_address % alignment); + if (decal != 0) { + _this->consumed_in_last_array += alignment - decal; + } + } +} + +void *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes, + int alignment, int prefix_bytes) +{ + void *retval = NULL; + + /* d'abord on gere les problemes d'alignement */ + _this->consumed_in_last_array += prefix_bytes; + align_it(_this, alignment); + + /* ensuite on verifie que la quantite de memoire demandee tient dans le buffer */ + if ((_this->consumed_in_last_array + nb_bytes >= _this->size_of_each_array) + || (_this->number_of_arrays == 0)) { + + if (prefix_bytes + nb_bytes + alignment >= _this->size_of_each_array) { + + /* Si la zone demandee est plus grosse que la granularitee */ + /* On alloue un buffer plus gros que les autres */ + _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * (_this->number_of_arrays+2)); + + _this->number_of_arrays += 1; + _this->consumed_in_last_array = prefix_bytes; + + _this->arrays[_this->number_of_arrays - 1] = malloc(prefix_bytes + nb_bytes + alignment); + align_it(_this,alignment); + retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array); + + /* puis on repart sur un nouveau buffer vide */ + _this->number_of_arrays += 1; + _this->consumed_in_last_array = 0; + _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array); + return retval; + } + else { + _this->number_of_arrays += 1; + _this->consumed_in_last_array = prefix_bytes; + _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * _this->number_of_arrays); + + _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array); + align_it(_this,alignment); + } + } + retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array); + _this->consumed_in_last_array += nb_bytes; + return retval; +} + +void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment) +{ + return goom_heap_malloc_with_alignment_prefixed(_this, nb_bytes, alignment, 0); +} + +void *goom_heap_malloc(GoomHeap *_this, int nb_bytes) +{ + return goom_heap_malloc_with_alignment(_this,nb_bytes,1); +} + diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_heap.h b/src/visualizations/Goom/goom2k4-0/src/goomsl_heap.h new file mode 100644 index 0000000000..a22bac695a --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_heap.h @@ -0,0 +1,29 @@ +#ifndef GOOMSL_HEAP +#define GOOMSL_HEAP + +/** + * Resizable Array that guarranty that resizes don't change address of + * the stored datas. + * + * This is implemented as an array of arrays... granularity is the size + * of each arrays. + */ + +typedef struct _GOOM_HEAP GoomHeap; + +/* Constructors / Destructor */ +GoomHeap *goom_heap_new(void); +GoomHeap *goom_heap_new_with_granularity(int granularity); +void goom_heap_delete(GoomHeap *_this); + +/* This method behaves like malloc. */ +void *goom_heap_malloc(GoomHeap *_this, int nb_bytes); +/* This adds an alignment constraint. */ +void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment); + +/* Returns a pointeur on the bytes... prefix is before */ +void *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes, + int alignment, int prefix_bytes); + +#endif + diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_lex.c b/src/visualizations/Goom/goom2k4-0/src/goomsl_lex.c new file mode 100644 index 0000000000..e7cf569b70 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_lex.c @@ -0,0 +1,2110 @@ +#line 2 "goomsl_lex.c" + +#line 4 "goomsl_lex.c" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 31 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <stdlib.h> + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */ + +#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L +#include <inttypes.h> +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart(yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +extern int yyleng; + +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires + * access to the local variable yy_act. Since yyless() is a macro, it would break + * existing scanners that call yyless() from OUTSIDE yylex. + * One obvious solution it to make yy_act a global. I tried that, and saw + * a 5% performance hit in a non-yylineno scanner, because yy_act is + * normally declared as a register variable-- so it is not worth it. + */ + #define YY_LESS_LINENO(n) \ + do { \ + int yyl;\ + for ( yyl = n; yyl < yyleng; ++yyl )\ + if ( yytext[yyl] == '\n' )\ + --yylineno;\ + }while(0) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef unsigned int yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart (FILE *input_file ); +void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); +void yy_delete_buffer (YY_BUFFER_STATE b ); +void yy_flush_buffer (YY_BUFFER_STATE b ); +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); +void yypop_buffer_state (void ); + +static void yyensure_buffer_stack (void ); +static void yy_load_buffer_state (void ); +static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); + +void *yyalloc (yy_size_t ); +void *yyrealloc (void *,yy_size_t ); +void yyfree (void * ); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +typedef unsigned char YY_CHAR; + +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; + +typedef int yy_state_type; + +#define YY_FLEX_LEX_COMPAT +extern int yylineno; + +int yylineno = 1; + +extern char yytext[]; + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + yyleng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + if ( yyleng + (yy_more_offset) >= YYLMAX ) \ + YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ + yy_flex_strncpy( &yytext[(yy_more_offset)], (yytext_ptr), yyleng + 1 ); \ + yyleng += (yy_more_offset); \ + (yy_prev_more_offset) = (yy_more_offset); \ + (yy_more_offset) = 0; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 49 +#define YY_END_OF_BUFFER 50 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_acclist[214] = + { 0, + 50, 48, 49, 47, 48, 49, 4, 49, 48, 49, + 13, 48, 49, 10, 48, 49, 33, 48, 49, 48, + 49, 48, 49, 48, 49, 48, 49, 48, 49, 34, + 48, 49, 34, 48, 49, 48, 49, 48, 49, 33, + 48, 49, 33, 48, 49, 33, 48, 49, 33, 48, + 49, 33, 48, 49, 33, 48, 49, 33, 48, 49, + 33, 48, 49, 33, 48, 49, 33, 48, 49, 47, + 48, 49, 1, 4, 49, 48, 49, 7, 49, 6, + 49, 7, 49, 7, 49, 1, 6, 49, 7, 49, + 3, 49, 1, 3, 49, 17, 49, 49, 16, 17, + + 49, 17, 49, 47, 45, 10, 10, 10, 33, 40, + 39, 41, 11, 12, 42, 38, 37, 34, 43, 46, + 44, 33, 33, 28, 33, 33, 33, 33, 33, 30, + 33, 33, 33, 33, 33, 33, 47, 1, 12, 5, + 15, 14, 10, 10, 35, 37, 36, 33, 33, 33, + 33, 33, 29, 33, 19, 33, 26, 33, 21, 33, + 33, 33, 33, 2, 10, 10, 33, 33, 33, 33, + 33, 33, 33, 31, 33, 33, 10, 10, 33, 33, + 33, 32, 33, 18, 33, 33, 33, 27, 33, 10, + 10, 33, 33, 33, 22, 33, 25, 33, 10, 9, + + 10, 10, 20, 33, 23, 33, 33, 10, 24, 33, + 10, 8, 10 + } ; + +static yyconst flex_int16_t yy_accept[152] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 4, 7, 9, 11, 14, 17, 20, 22, 24, 26, + 28, 30, 33, 36, 38, 40, 43, 46, 49, 52, + 55, 58, 61, 64, 67, 70, 73, 76, 78, 80, + 82, 84, 86, 89, 91, 93, 96, 98, 99, 102, + 104, 105, 106, 107, 108, 109, 110, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 119, 120, 121, + 122, 123, 124, 126, 127, 128, 129, 130, 132, 133, + 134, 135, 136, 137, 138, 139, 139, 140, 141, 141, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + + 151, 152, 153, 155, 157, 159, 161, 162, 163, 164, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 176, 177, 178, 179, 180, 181, 182, 184, 186, + 187, 188, 190, 191, 192, 193, 194, 195, 197, 199, + 200, 202, 203, 205, 207, 208, 209, 211, 212, 214, + 214 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 4, 5, 6, 7, 1, 8, 9, 10, 1, + 1, 11, 12, 1, 13, 14, 15, 16, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 1, 1, 18, + 19, 20, 1, 9, 21, 21, 21, 21, 22, 23, + 21, 21, 24, 21, 21, 25, 21, 26, 21, 21, + 21, 27, 28, 29, 21, 21, 21, 21, 21, 21, + 1, 30, 1, 1, 31, 1, 32, 33, 34, 35, + + 36, 37, 38, 39, 40, 21, 21, 41, 21, 42, + 43, 44, 21, 45, 46, 47, 48, 21, 49, 50, + 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst flex_int32_t yy_meta[51] = + { 0, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 3, 1, 4, 4, 1, 1, 1, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, + 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 + } ; + +static yyconst flex_int16_t yy_base[159] = + { 0, + 0, 49, 51, 54, 221, 57, 60, 64, 223, 225, + 69, 225, 203, 225, 51, 0, 0, 202, 201, 200, + 64, 68, 72, 72, 199, 174, 57, 166, 55, 173, + 171, 166, 165, 166, 171, 99, 225, 93, 225, 225, + 194, 107, 225, 193, 225, 225, 225, 225, 225, 71, + 93, 225, 0, 183, 178, 0, 195, 225, 225, 225, + 225, 225, 225, 225, 89, 107, 0, 225, 225, 225, + 161, 169, 0, 155, 160, 157, 154, 151, 150, 151, + 150, 146, 153, 123, 225, 177, 188, 225, 126, 187, + 225, 225, 164, 159, 225, 100, 0, 146, 145, 149, + + 138, 151, 0, 0, 0, 0, 59, 146, 140, 177, + 225, 157, 147, 141, 144, 130, 138, 126, 130, 137, + 0, 134, 165, 143, 133, 112, 109, 0, 0, 102, + 92, 0, 130, 112, 93, 98, 101, 0, 0, 125, + 124, 94, 0, 0, 78, 59, 0, 61, 0, 225, + 141, 145, 149, 151, 155, 51, 159, 163 + } ; + +static yyconst flex_int16_t yy_def[159] = + { 0, + 150, 1, 151, 151, 151, 151, 152, 152, 150, 150, + 150, 150, 150, 150, 153, 154, 155, 150, 150, 150, + 150, 150, 150, 150, 150, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 153, 153, 153, 154, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 156, 150, 150, 150, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 150, 150, 150, 157, 150, 150, 157, + 150, 150, 153, 153, 150, 150, 156, 154, 154, 154, + + 154, 154, 154, 154, 154, 154, 154, 154, 154, 157, + 150, 153, 153, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 153, 153, 154, 154, 154, 154, 154, 154, + 154, 154, 158, 153, 154, 154, 154, 154, 154, 158, + 158, 153, 154, 154, 154, 153, 154, 153, 153, 0, + 150, 150, 150, 150, 150, 150, 150, 150 + } ; + +static yyconst flex_int16_t yy_nxt[276] = + { 0, + 10, 11, 12, 11, 13, 14, 15, 10, 16, 17, + 18, 19, 20, 10, 21, 22, 23, 24, 10, 25, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 10, + 16, 16, 26, 16, 27, 28, 29, 16, 16, 30, + 16, 31, 16, 32, 16, 33, 34, 16, 35, 16, + 36, 37, 36, 40, 97, 42, 43, 42, 42, 46, + 42, 41, 48, 38, 41, 49, 48, 149, 44, 49, + 51, 44, 51, 54, 61, 64, 91, 55, 62, 64, + 148, 65, 63, 66, 66, 65, 75, 66, 66, 50, + 68, 69, 72, 50, 51, 76, 51, 77, 119, 73, + + 84, 85, 84, 61, 96, 96, 120, 87, 89, 85, + 89, 63, 92, 86, 64, 96, 96, 67, 147, 146, + 65, 86, 66, 66, 84, 85, 84, 89, 85, 89, + 141, 141, 145, 144, 143, 142, 141, 86, 139, 138, + 86, 39, 39, 39, 39, 47, 47, 47, 47, 53, + 137, 53, 53, 56, 56, 57, 136, 57, 57, 110, + 110, 110, 110, 140, 135, 140, 140, 134, 133, 132, + 131, 130, 129, 128, 127, 126, 125, 124, 123, 111, + 122, 121, 118, 117, 116, 115, 114, 113, 112, 111, + 111, 90, 109, 108, 107, 106, 105, 104, 103, 102, + + 101, 100, 99, 98, 95, 94, 93, 90, 88, 83, + 82, 81, 80, 79, 78, 74, 71, 70, 60, 59, + 58, 52, 150, 45, 9, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150 + } ; + +static yyconst flex_int16_t yy_chk[276] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 3, 156, 4, 4, 4, 6, 6, + 6, 3, 7, 2, 4, 7, 8, 148, 4, 8, + 11, 6, 11, 15, 21, 22, 50, 15, 21, 23, + 146, 22, 21, 22, 22, 23, 29, 23, 23, 7, + 24, 24, 27, 8, 51, 29, 51, 29, 107, 27, + + 36, 36, 36, 38, 65, 65, 107, 38, 42, 42, + 42, 38, 50, 36, 66, 96, 96, 22, 145, 142, + 66, 42, 66, 66, 84, 84, 84, 89, 89, 89, + 141, 140, 137, 136, 135, 134, 133, 84, 131, 130, + 89, 151, 151, 151, 151, 152, 152, 152, 152, 153, + 127, 153, 153, 154, 154, 155, 126, 155, 155, 157, + 157, 157, 157, 158, 125, 158, 158, 124, 123, 122, + 120, 119, 118, 117, 116, 115, 114, 113, 112, 110, + 109, 108, 102, 101, 100, 99, 98, 94, 93, 90, + 87, 86, 83, 82, 81, 80, 79, 78, 77, 76, + + 75, 74, 72, 71, 57, 55, 54, 44, 41, 35, + 34, 33, 32, 31, 30, 28, 26, 25, 20, 19, + 18, 13, 9, 5, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150 + } ; + +/* Table of booleans, true if rule could match eol. */ +static yyconst flex_int32_t yy_rule_can_match_eol[50] = + { 0, +1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; + +extern int yy_flex_debug; +int yy_flex_debug = 0; + +static yy_state_type *yy_state_buf=0, *yy_state_ptr=0; +static char *yy_full_match; +static int yy_lp; +#define REJECT \ +{ \ +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \ +yy_cp = (yy_full_match); /* restore poss. backed-over text */ \ +++(yy_lp); \ +goto find_rule; \ +} + +static int yy_more_offset = 0; +static int yy_prev_more_offset = 0; +#define yymore() ((yy_more_offset) = yy_flex_strlen( yytext )) +#define YY_NEED_STRLEN +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET \ + { \ + (yy_more_offset) = (yy_prev_more_offset); \ + yyleng -= (yy_more_offset); \ + } +#ifndef YYLMAX +#define YYLMAX 8192 +#endif + +char yytext[YYLMAX]; +char *yytext_ptr; +#line 1 "goomsl_lex.l" +#line 2 "goomsl_lex.l" + +#include <math.h> +#include <stdlib.h> +#include <string.h> +#include "goomsl.h" +#include "goomsl_private.h" +#include "goomsl_yacc.h" +void yyerror(char *); +void yyparse(void); + +GoomSL *currentGoomSL; +static int string_size; +static char string[1024]; + + + +#line 639 "goomsl_lex.c" + +#define INITIAL 0 +#define C_COMMENT 1 +#define LINE_COMMENT 2 +#define STRING 3 + +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#ifndef _WIN32PC +#include <unistd.h> +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap (void ); +#else +extern int yywrap (void ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + size_t n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex (void); + +#define YY_DECL int yylex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + if ( yyleng > 0 ) \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ + (yytext[yyleng - 1] == '\n'); \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 25 "goomsl_lex.l" + + +#line 797 "goomsl_lex.c" + + if ( (yy_init) ) + { + (yy_init) = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_state_buf) ) + (yy_state_buf) = (yy_state_type *)yyalloc(YY_BUF_SIZE + 2 ); + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_load_buffer_state( ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of yytext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); + yy_current_state += YY_AT_BOL(); + + (yy_state_ptr) = (yy_state_buf); + *(yy_state_ptr)++ = yy_current_state; + +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 151 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *(yy_state_ptr)++ = yy_current_state; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 225 ); + +yy_find_action: + yy_current_state = *--(yy_state_ptr); + (yy_lp) = yy_accept[yy_current_state]; +find_rule: /* we branch to this label when backing up */ + for ( ; ; ) /* until we find what rule we matched */ + { + if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] ) + { + yy_act = yy_acclist[(yy_lp)]; + { + (yy_full_match) = yy_cp; + break; + } + } + --yy_cp; + yy_current_state = *--(yy_state_ptr); + (yy_lp) = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) + { + int yyl; + for ( yyl = (yy_prev_more_offset); yyl < yyleng; ++yyl ) + if ( yytext[yyl] == '\n' ) + + yylineno++; +; + } + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ +case 1: +/* rule 1 can match eol */ +YY_RULE_SETUP +#line 27 "goomsl_lex.l" +{ ++currentGoomSL->num_lines; /* Ignore empty lines */ } + YY_BREAK +case 2: +/* rule 2 can match eol */ +YY_RULE_SETUP +#line 28 "goomsl_lex.l" +{ ++currentGoomSL->num_lines; /* Ignore empty lines */ } + YY_BREAK +case 3: +/* rule 3 can match eol */ +YY_RULE_SETUP +#line 30 "goomsl_lex.l" +{ ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; } + YY_BREAK +case 4: +/* rule 4 can match eol */ +YY_RULE_SETUP +#line 31 "goomsl_lex.l" +{ ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 33 "goomsl_lex.l" +{ BEGIN INITIAL; } + YY_BREAK +case 6: +/* rule 6 can match eol */ +YY_RULE_SETUP +#line 34 "goomsl_lex.l" +{ ++currentGoomSL->num_lines; } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 35 "goomsl_lex.l" +{ /* eat up comment */ } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 37 "goomsl_lex.l" +{ currentGoomSL->num_lines = 0; } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 38 "goomsl_lex.l" +{ currentGoomSL->num_lines = 0; printf("%s\n", yytext); } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 39 "goomsl_lex.l" +{ /* ignore preprocessor lines */ } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 41 "goomsl_lex.l" +{ BEGIN C_COMMENT; } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 42 "goomsl_lex.l" +{ BEGIN LINE_COMMENT; } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 43 "goomsl_lex.l" +{ BEGIN STRING; string_size=0; } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 45 "goomsl_lex.l" +{ string[string_size++] = '\n'; } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 46 "goomsl_lex.l" +{ string[string_size++] = '\"'; } + YY_BREAK +case 16: +YY_RULE_SETUP +#line 47 "goomsl_lex.l" +{ /* fin de la chaine: on cree le pointeur qui va bien */ + unsigned int tmp; + BEGIN INITIAL; + string[string_size]=0; + tmp = gsl_malloc(currentGoomSL, string_size+1); + strcpy((char*)currentGoomSL->ptrArray[tmp],string); + sprintf(yylval.strValue, "0x%08x", tmp); + return LTYPE_PTR; + } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 56 "goomsl_lex.l" +{ string[string_size++] = *yytext; } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 58 "goomsl_lex.l" +{ return FLOAT_TK; } + YY_BREAK +case 19: +YY_RULE_SETUP +#line 59 "goomsl_lex.l" +{ return INT_TK; } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 60 "goomsl_lex.l" +{ return INT_TK; } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 61 "goomsl_lex.l" +{ return PTR_TK; } + YY_BREAK +case 22: +YY_RULE_SETUP +#line 62 "goomsl_lex.l" +{ return PTR_TK; } + YY_BREAK +case 23: +YY_RULE_SETUP +#line 63 "goomsl_lex.l" +{ return DECLARE; } + YY_BREAK +case 24: +YY_RULE_SETUP +#line 64 "goomsl_lex.l" +{ return EXTERNAL; } + YY_BREAK +case 25: +YY_RULE_SETUP +#line 65 "goomsl_lex.l" +{ return STRUCT; } + YY_BREAK +case 26: +YY_RULE_SETUP +#line 66 "goomsl_lex.l" +{ return NOT; } + YY_BREAK +case 27: +YY_RULE_SETUP +#line 67 "goomsl_lex.l" +{ return WHILE; } + YY_BREAK +case 28: +YY_RULE_SETUP +#line 68 "goomsl_lex.l" +{ return DO; } + YY_BREAK +case 29: +YY_RULE_SETUP +#line 69 "goomsl_lex.l" +{ return FOR; } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 70 "goomsl_lex.l" +{ return IN; } + YY_BREAK +case 31: +YY_RULE_SETUP +#line 71 "goomsl_lex.l" +{ strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; } + YY_BREAK +case 32: +YY_RULE_SETUP +#line 72 "goomsl_lex.l" +{ strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; } + YY_BREAK +case 33: +YY_RULE_SETUP +#line 73 "goomsl_lex.l" +{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; } + YY_BREAK +case 34: +YY_RULE_SETUP +#line 74 "goomsl_lex.l" +{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } + YY_BREAK +case 35: +YY_RULE_SETUP +#line 75 "goomsl_lex.l" +{ sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; } + YY_BREAK +case 36: +YY_RULE_SETUP +#line 76 "goomsl_lex.l" +{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } + YY_BREAK +case 37: +YY_RULE_SETUP +#line 77 "goomsl_lex.l" +{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; } + YY_BREAK +case 38: +YY_RULE_SETUP +#line 78 "goomsl_lex.l" +{ sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; } + YY_BREAK +case 39: +YY_RULE_SETUP +#line 79 "goomsl_lex.l" +{ return PLUS_EQ; } + YY_BREAK +case 40: +YY_RULE_SETUP +#line 80 "goomsl_lex.l" +{ return MUL_EQ; } + YY_BREAK +case 41: +YY_RULE_SETUP +#line 81 "goomsl_lex.l" +{ return SUB_EQ; } + YY_BREAK +case 42: +YY_RULE_SETUP +#line 82 "goomsl_lex.l" +{ return DIV_EQ; } + YY_BREAK +case 43: +YY_RULE_SETUP +#line 83 "goomsl_lex.l" +{ return LOW_EQ; } + YY_BREAK +case 44: +YY_RULE_SETUP +#line 84 "goomsl_lex.l" +{ return SUP_EQ; } + YY_BREAK +case 45: +YY_RULE_SETUP +#line 85 "goomsl_lex.l" +{ return NOT_EQ; } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 86 "goomsl_lex.l" +{ return NOT_EQ; } + YY_BREAK +case 47: +YY_RULE_SETUP +#line 87 "goomsl_lex.l" +/* eat up whitespace */ + YY_BREAK +case 48: +YY_RULE_SETUP +#line 88 "goomsl_lex.l" +{ yylval.charValue = *yytext; return *yytext; } + YY_BREAK +case 49: +YY_RULE_SETUP +#line 90 "goomsl_lex.l" +ECHO; + YY_BREAK +#line 1155 "goomsl_lex.c" + case YY_STATE_EOF(INITIAL): + case YY_STATE_EOF(C_COMMENT): + case YY_STATE_EOF(LINE_COMMENT): + case YY_STATE_EOF(STRING): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( yywrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + size_t num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart(yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + yy_current_state += YY_AT_BOL(); + + (yy_state_ptr) = (yy_state_buf); + *(yy_state_ptr)++ = yy_current_state; + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 151 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *(yy_state_ptr)++ = yy_current_state; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + + register YY_CHAR yy_c = 1; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 151 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 150); + if ( ! yy_is_jam ) + *(yy_state_ptr)++ = yy_current_state; + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp ) +{ + register char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up yytext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = (yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + if ( c == '\n' ){ + --yylineno; + } + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart(yyin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap( ) ) + return EOF; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve yytext */ + (yy_hold_char) = *++(yy_c_buf_p); + + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); + if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol ) + + yylineno++; +; + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void yyrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_init_buffer(YY_CURRENT_BUFFER,input_file ); + yy_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void yy_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * + */ + void yy_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yyfree((void *) b->yy_ch_buf ); + + yyfree((void *) b ); +} + +#ifndef __cplusplus +extern int isatty (int ); +#endif /* __cplusplus */ + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + yy_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void yy_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + yy_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + yyensure_buffer_stack(); + + /* This block is copied from yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void yypop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void yyensure_buffer_stack (void) +{ + int num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param str a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * yy_scan_bytes() instead. + */ +YY_BUFFER_STATE yy_scan_string (yyconst char * str ) +{ + + return yy_scan_bytes(str,strlen(str) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_bytes (yyconst char * bytes, int len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yyalloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = (yy_hold_char); \ + (yy_c_buf_p) = yytext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int yyget_lineno (void) +{ + + return yylineno; +} + +/** Get the input stream. + * + */ +FILE *yyget_in (void) +{ + return yyin; +} + +/** Get the output stream. + * + */ +FILE *yyget_out (void) +{ + return yyout; +} + +/** Get the length of the current token. + * + */ +int yyget_leng (void) +{ + return yyleng; +} + +/** Get the current token. + * + */ + +char *yyget_text (void) +{ + return yytext; +} + +/** Set the current line number. + * @param line_number + * + */ +void yyset_lineno (int line_number ) +{ + + yylineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see yy_switch_to_buffer + */ +void yyset_in (FILE * in_str ) +{ + yyin = in_str ; +} + +void yyset_out (FILE * out_str ) +{ + yyout = out_str ; +} + +int yyget_debug (void) +{ + return yy_flex_debug; +} + +void yyset_debug (int bdebug ) +{ + yy_flex_debug = bdebug ; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(); + } + + /* Destroy the stack itself. */ + yyfree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + yyfree ( (yy_state_buf) ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *yyalloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *yyrealloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void yyfree (void * ptr ) +{ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#undef YY_NEW_FILE +#undef YY_FLUSH_BUFFER +#undef yy_set_bol +#undef yy_new_buffer +#undef yy_set_interactive +#undef YY_DO_BEFORE_ACTION + +#ifdef YY_DECL_IS_OURS +#undef YY_DECL_IS_OURS +#undef YY_DECL +#endif +#line 90 "goomsl_lex.l" + + + + +int yywrap(void) { return 1; yyunput(0,0); } + + diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_lex.l b/src/visualizations/Goom/goom2k4-0/src/goomsl_lex.l new file mode 100644 index 0000000000..3079c022a2 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_lex.l @@ -0,0 +1,94 @@ +%{ + +#include <math.h> +#include <stdlib.h> +#include <string.h> +#include "goomsl.h" +#include "goomsl_private.h" +#include "goomsl_yacc.h" +void yyerror(char *); +void yyparse(void); + +GoomSL *currentGoomSL; +static int string_size; +static char string[1024]; +%} + +DIGIT [0-9] +XDIGIT [0-9a-f] +ID [a-zA-Z_@&][a-zA-Z0-9_\.]* + +%S C_COMMENT +%S LINE_COMMENT +%S STRING + +%% + +<LINE_COMMENT,C_COMMENT,INITIAL>^[ \t]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ } +<LINE_COMMENT,C_COMMENT,INITIAL>^[ \t]*"//"[^\n]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ } + +<LINE_COMMENT>\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; } +<INITIAL>\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; } + +<C_COMMENT>"*/" { BEGIN INITIAL; } +<C_COMMENT>\n { ++currentGoomSL->num_lines; } +<C_COMMENT,LINE_COMMENT>. { /* eat up comment */ } + +<INITIAL>"#RST_LINE#" { currentGoomSL->num_lines = 0; } +<INITIAL>"#FILE ".*"#" { currentGoomSL->num_lines = 0; printf("%s\n", yytext); } +<INITIAL>"#"[^\n]* { /* ignore preprocessor lines */ } + +<INITIAL>"/*" { BEGIN C_COMMENT; } +<INITIAL>"//" { BEGIN LINE_COMMENT; } +<INITIAL>\" { BEGIN STRING; string_size=0; } + +<STRING>"\\n" { string[string_size++] = '\n'; } +<STRING>"\\\"" { string[string_size++] = '\"'; } +<STRING>\" { /* fin de la chaine: on cree le pointeur qui va bien */ + unsigned int tmp; + BEGIN INITIAL; + string[string_size]=0; + tmp = gsl_malloc(currentGoomSL, string_size+1); + strcpy((char*)currentGoomSL->ptrArray[tmp],string); + sprintf(yylval.strValue, "0x%08x", tmp); + return LTYPE_PTR; + } +<STRING>. { string[string_size++] = *yytext; } + +<INITIAL>"float" { return FLOAT_TK; } +<INITIAL>"int" { return INT_TK; } +<INITIAL>"boolean" { return INT_TK; } +<INITIAL>"ptr" { return PTR_TK; } +<INITIAL>"string" { return PTR_TK; } +<INITIAL>"declare" { return DECLARE; } +<INITIAL>"external" { return EXTERNAL; } +<INITIAL>"struct" { return STRUCT; } +<INITIAL>"not" { return NOT; } +<INITIAL>"while" { return WHILE; } +<INITIAL>"do" { return DO; } +<INITIAL>"for" { return FOR; } +<INITIAL>"in" { return IN; } +<INITIAL>"true" { strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; } +<INITIAL>"false" { strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; } +<INITIAL>{ID} { strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; } +<INITIAL>{DIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } +<INITIAL>\'.\' { sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; } +<INITIAL>"0x"{XDIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } +<INITIAL>{DIGIT}+"."{DIGIT}* { strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; } +<INITIAL>{DIGIT}+"%" { sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; } +<INITIAL>"+=" { return PLUS_EQ; } +<INITIAL>"*=" { return MUL_EQ; } +<INITIAL>"-=" { return SUB_EQ; } +<INITIAL>"/=" { return DIV_EQ; } +<INITIAL>"<=" { return LOW_EQ; } +<INITIAL>">=" { return SUP_EQ; } +<INITIAL>"!=" { return NOT_EQ; } +<INITIAL>"<>" { return NOT_EQ; } +<INITIAL>[ \t]+ /* eat up whitespace */ +<INITIAL>. { yylval.charValue = *yytext; return *yytext; } + +%% + + +int yywrap(void) { return 1; yyunput(0,0); } + diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_private.h b/src/visualizations/Goom/goom2k4-0/src/goomsl_private.h new file mode 100644 index 0000000000..8be151577d --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_private.h @@ -0,0 +1,251 @@ +#ifndef _GSL_PRIVATE_H +#define _GSL_PRIVATE_H + +/* -- internal use -- */ + +#include "goomsl.h" + +#ifdef USE_JITC_X86 +#include "jitc_x86.h" +#endif + +#include "goomsl_heap.h" + +/* {{{ type of nodes */ +#define EMPTY_NODE 0 +#define CONST_INT_NODE 1 +#define CONST_FLOAT_NODE 2 +#define CONST_PTR_NODE 3 +#define VAR_NODE 4 +#define PARAM_NODE 5 +#define READ_PARAM_NODE 6 +#define OPR_NODE 7 +/* }}} */ +/* {{{ type of operations */ +#define OPR_SET 1 +#define OPR_IF 2 +#define OPR_WHILE 3 +#define OPR_BLOCK 4 +#define OPR_ADD 5 +#define OPR_MUL 6 +#define OPR_EQU 7 +#define OPR_NOT 8 +#define OPR_LOW 9 +#define OPR_DIV 10 +#define OPR_SUB 11 +#define OPR_FUNC_INTRO 12 +#define OPR_FUNC_OUTRO 13 +#define OPR_CALL 14 +#define OPR_EXT_CALL 15 +#define OPR_PLUS_EQ 16 +#define OPR_SUB_EQ 17 +#define OPR_MUL_EQ 18 +#define OPR_DIV_EQ 19 +#define OPR_CALL_EXPR 20 +#define OPR_AFFECT_LIST 21 +#define OPR_FOREACH 22 +#define OPR_VAR_LIST 23 + +/* }}} */ + +typedef struct _ConstIntNodeType { /* {{{ */ + int val; +} ConstIntNodeType; /* }}} */ +typedef struct _ConstFloatNodeType { /* {{{ */ + float val; +} ConstFloatNodeType; /* }}} */ +typedef struct _ConstPtrNodeType { /* {{{ */ + int id; +} ConstPtrNodeType; /* }}} */ +typedef struct _OprNodeType { /* {{{ */ + int type; + int nbOp; + struct _NODE_TYPE *op[3]; /* maximal number of operand needed */ + struct _NODE_TYPE *next; +} OprNodeType; /* }}} */ +typedef struct _NODE_TYPE { /* {{{ */ + int type; + char *str; + GoomHash *vnamespace; + int line_number; + union { + ConstIntNodeType constInt; + ConstFloatNodeType constFloat; + ConstPtrNodeType constPtr; + OprNodeType opr; + } unode; +} NodeType; /* }}} */ +typedef struct _INSTRUCTION_DATA { /* {{{ */ + + union { + void *var; + int *var_int; + int *var_ptr; + float *var_float; + int jump_offset; + struct _ExternalFunctionStruct *external_function; + } udest; + + union { + void *var; + int *var_int; + int *var_ptr; + float *var_float; + int value_int; + int value_ptr; + float value_float; + } usrc; +} InstructionData; +/* }}} */ +typedef struct _INSTRUCTION { /* {{{ */ + + int id; + InstructionData data; + GoomSL *parent; + const char *name; /* name of the instruction */ + + char **params; /* parametres de l'instruction */ + GoomHash **vnamespace; + int *types; /* type des parametres de l'instruction */ + int cur_param; + int nb_param; + + int address; + char *jump_label; + char *nop_label; + + int line_number; + +} Instruction; +/* }}} */ +typedef struct _INSTRUCTION_FLOW { /* {{{ */ + + Instruction **instr; + int number; + int tabsize; + GoomHash *labels; +} InstructionFlow; +/* }}} */ +typedef struct _FAST_INSTRUCTION { /* {{{ */ + int id; + InstructionData data; + Instruction *proto; +} FastInstruction; +/* }}} */ +typedef struct _FastInstructionFlow { /* {{{ */ + int number; + FastInstruction *instr; + void *mallocedInstr; +} FastInstructionFlow; +/* }}} */ +typedef struct _ExternalFunctionStruct { /* {{{ */ + GoomSL_ExternalFunction function; + GoomHash *vars; + int is_extern; +} ExternalFunctionStruct; +/* }}} */ +typedef struct _Block { + int data; + int size; +} Block; +typedef struct _GSL_StructField { /* {{{ */ + int type; + char name[256]; + int offsetInStruct; /* Where this field is stored... */ +} GSL_StructField; + /* }}} */ +typedef struct _GSL_Struct { /* {{{ */ + int nbFields; + GSL_StructField *fields[64]; + int size; + Block iBlock[64]; + Block fBlock[64]; +} GSL_Struct; + /* }}} */ +struct _GoomSL { /* {{{ */ + int num_lines; + Instruction *instr; /* instruction en cours de construction */ + + InstructionFlow *iflow; /* flow d'instruction 'normal' */ + FastInstructionFlow *fastiflow; /* flow d'instruction optimise */ + + GoomHash *vars; /* table de variables */ + int currentNS; + GoomHash *namespaces[16]; + + GoomHash *functions; /* table des fonctions externes */ + + GoomHeap *data_heap; /* GSL Heap-like memory space */ + + int nbStructID; + GoomHash *structIDS; + GSL_Struct **gsl_struct; + int gsl_struct_size; + + int nbPtr; + int ptrArraySize; + void **ptrArray; + + int compilationOK; +#ifdef USE_JITC_X86 + JitcX86Env *jitc; + JitcFunc jitc_func; +#endif +}; /* }}} */ + +extern GoomSL *currentGoomSL; + +Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number); +void gsl_instr_add_param(Instruction *_this, char *param, int type); +void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns); + +void gsl_declare_task(const char *name); +void gsl_declare_external_task(const char *name); + +int gsl_type_of_var(GoomHash *namespace, const char *name); + +void gsl_enternamespace(const char *name); +void gsl_reenternamespace(GoomHash *ns); +GoomHash *gsl_leavenamespace(void); +GoomHash *gsl_find_namespace(const char *name); + +void gsl_commit_compilation(void); + +/* #define TYPE_PARAM 1 */ + +#define FIRST_RESERVED 0x80000 + +#define TYPE_INTEGER 0x90001 +#define TYPE_FLOAT 0x90002 +#define TYPE_VAR 0x90003 +#define TYPE_PTR 0x90004 +#define TYPE_LABEL 0x90005 + +#define TYPE_OP_EQUAL 6 +#define TYPE_IVAR 0xa0001 +#define TYPE_FVAR 0xa0002 +#define TYPE_PVAR 0xa0003 +#define TYPE_SVAR 0xa0004 + +#define INSTR_JUMP 6 +#define INSTR_JZERO 29 +#define INSTR_CALL 36 +#define INSTR_RET 37 +#define INSTR_EXT_CALL 38 +#define INSTR_JNZERO 40 + +#define INSTR_SET 0x80001 +#define INSTR_INT 0x80002 +#define INSTR_FLOAT 0x80003 +#define INSTR_PTR 0x80004 +#define INSTR_LABEL 0x80005 +#define INSTR_ISLOWER 0x80006 +#define INSTR_ADD 0x80007 +#define INSTR_MUL 0x80008 +#define INSTR_DIV 0x80009 +#define INSTR_SUB 0x80010 +#define INSTR_ISEQUAL 0x80011 +#define INSTR_NOT 0x80012 + + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.c b/src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.c new file mode 100644 index 0000000000..589b171beb --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.c @@ -0,0 +1,2997 @@ +/* A Bison parser, made by GNU Bison 1.875. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + LTYPE_INTEGER = 258, + LTYPE_FLOAT = 259, + LTYPE_VAR = 260, + LTYPE_PTR = 261, + PTR_TK = 262, + INT_TK = 263, + FLOAT_TK = 264, + DECLARE = 265, + EXTERNAL = 266, + WHILE = 267, + DO = 268, + NOT = 269, + PLUS_EQ = 270, + SUB_EQ = 271, + DIV_EQ = 272, + MUL_EQ = 273, + SUP_EQ = 274, + LOW_EQ = 275, + NOT_EQ = 276, + STRUCT = 277, + FOR = 278, + IN = 279 + }; +#endif +#define LTYPE_INTEGER 258 +#define LTYPE_FLOAT 259 +#define LTYPE_VAR 260 +#define LTYPE_PTR 261 +#define PTR_TK 262 +#define INT_TK 263 +#define FLOAT_TK 264 +#define DECLARE 265 +#define EXTERNAL 266 +#define WHILE 267 +#define DO 268 +#define NOT 269 +#define PLUS_EQ 270 +#define SUB_EQ 271 +#define DIV_EQ 272 +#define MUL_EQ 273 +#define SUP_EQ 274 +#define LOW_EQ 275 +#define NOT_EQ 276 +#define STRUCT 277 +#define FOR 278 +#define IN 279 + + + + +/* Copy the first part of user declarations. */ +#line 6 "goomsl_yacc.y" + + #include <stdio.h> + #include <stdlib.h> + #include <string.h> + #include "goomsl.h" + #include "goomsl_private.h" + +#define STRUCT_ALIGNMENT 16 +/* #define VERBOSE */ + + int yylex(void); + void yyerror(char *); + extern GoomSL *currentGoomSL; + + static NodeType *nodeNew(const char *str, int type, int line_number); + static NodeType *nodeClone(NodeType *node); + static void nodeFreeInternals(NodeType *node); + static void nodeFree(NodeType *node); + + static void commit_node(NodeType *node, int releaseIfTemp); + static void precommit_node(NodeType *node); + + static NodeType *new_constInt(const char *str, int line_number); + static NodeType *new_constFloat(const char *str, int line_number); + static NodeType *new_constPtr(const char *str, int line_number); + static NodeType *new_var(const char *str, int line_number); + static NodeType *new_nop(const char *str); + static NodeType *new_op(const char *str, int type, int nbOp); + + static int allocateLabel(); + static int allocateTemp(); + static void releaseTemp(int n); + static void releaseAllTemps(); + + static int is_tmp_expr(NodeType *node) { + if (node->str) { + return (!strncmp(node->str,"_i_tmp_",7)) + || (!strncmp(node->str,"_f_tmp_",7)) + || (!strncmp(node->str,"_p_tmp",7)); + } + return 0; + } + /* pre: is_tmp_expr(node); */ + static int get_tmp_id(NodeType *node) { return atoi((node->str)+5); } + + static int is_commutative_expr(int itype) + { /* {{{ */ + return (itype == INSTR_ADD) + || (itype == INSTR_MUL) + || (itype == INSTR_ISEQUAL); + } /* }}} */ + + static void GSL_PUT_LABEL(char *name, int line_number) + { /* {{{ */ +#ifdef VERBOSE + printf("label %s\n", name); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, line_number); + gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); + } /* }}} */ + static void GSL_PUT_JUMP(char *name, int line_number) + { /* {{{ */ +#ifdef VERBOSE + printf("jump %s\n", name); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "jump", INSTR_JUMP, 1, line_number); + gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); + } /* }}} */ + + static void GSL_PUT_JXXX(char *name, char *iname, int instr_id, int line_number) + { /* {{{ */ +#ifdef VERBOSE + printf("%s %s\n", iname, name); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, iname, instr_id, 1, line_number); + gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); + } /* }}} */ + static void GSL_PUT_JZERO(char *name,int line_number) + { /* {{{ */ + GSL_PUT_JXXX(name,"jzero.i",INSTR_JZERO,line_number); + } /* }}} */ + static void GSL_PUT_JNZERO(char *name, int line_number) + { /* {{{ */ + GSL_PUT_JXXX(name,"jnzero.i",INSTR_JNZERO,line_number); + } /* }}} */ + + /* Structures Management */ + +#define ALIGN_ADDR(_addr,_align) {\ + if (_align>1) {\ + int _dec = (_addr%_align);\ + if (_dec != 0) _addr += _align - _dec;\ + }} + + /* */ + void gsl_prepare_struct(GSL_Struct *s, int s_align, int i_align, int f_align) + { + int i; + int consumed = 0; + int iblk=0, fblk=0; + + s->iBlock[0].size = 0; + s->iBlock[0].data = 0; + s->fBlock[0].size = 0; + s->fBlock[0].data = 0; + + /* Prepare sub-struct and calculate space needed for their storage */ + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type < FIRST_RESERVED) + { + int j=0; + GSL_Struct *substruct = currentGoomSL->gsl_struct[s->fields[i]->type]; + consumed += sizeof(int); /* stocke le prefix */ + ALIGN_ADDR(consumed, s_align); + s->fields[i]->offsetInStruct = consumed; + gsl_prepare_struct(substruct, s_align, i_align, f_align); + for(j=0;substruct->iBlock[j].size>0;++j) { + s->iBlock[iblk].data = consumed + substruct->iBlock[j].data; + s->iBlock[iblk].size = substruct->iBlock[j].size; + iblk++; + } + for(j=0;substruct->fBlock[j].size>0;++j) { + s->fBlock[fblk].data = consumed + substruct->fBlock[j].data; + s->fBlock[fblk].size = substruct->fBlock[j].size; + fblk++; + } + consumed += substruct->size; + } + } + + /* Then prepare integers */ + ALIGN_ADDR(consumed, i_align); + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type == INSTR_INT) + { + if (s->iBlock[iblk].size == 0) { + s->iBlock[iblk].size = 1; + s->iBlock[iblk].data = consumed; + } else { + s->iBlock[iblk].size += 1; + } + s->fields[i]->offsetInStruct = consumed; + consumed += sizeof(int); + } + } + + iblk++; + s->iBlock[iblk].size = 0; + s->iBlock[iblk].data = 0; + + /* Then prepare floats */ + ALIGN_ADDR(consumed, f_align); + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type == INSTR_FLOAT) + { + if (s->fBlock[fblk].size == 0) { + s->fBlock[fblk].size = 1; + s->fBlock[fblk].data = consumed; + } else { + s->fBlock[fblk].size += 1; + } + s->fields[i]->offsetInStruct = consumed; + consumed += sizeof(int); + } + } + + fblk++; + s->fBlock[fblk].size = 0; + s->fBlock[fblk].data = 0; + + /* Finally prepare pointers */ + ALIGN_ADDR(consumed, i_align); + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type == INSTR_PTR) + { + s->fields[i]->offsetInStruct = consumed; + consumed += sizeof(int); + } + } + s->size = consumed; + } + + /* Returns the ID of a struct from its name */ + int gsl_get_struct_id(const char *name) /* {{{ */ + { + HashValue *ret = goom_hash_get(currentGoomSL->structIDS, name); + if (ret != NULL) return ret->i; + return -1; + } /* }}} */ + + /* Adds the definition of a struct */ + void gsl_add_struct(const char *name, GSL_Struct *gsl_struct) /* {{{ */ + { + /* Prepare the struct: ie calculate internal storage format */ + gsl_prepare_struct(gsl_struct, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT); + + /* If the struct does not already exists */ + if (gsl_get_struct_id(name) < 0) + { + /* adds it */ + int id = currentGoomSL->nbStructID++; + goom_hash_put_int(currentGoomSL->structIDS, name, id); + if (currentGoomSL->gsl_struct_size <= id) { + currentGoomSL->gsl_struct_size *= 2; + currentGoomSL->gsl_struct = (GSL_Struct**)realloc(currentGoomSL->gsl_struct, + sizeof(GSL_Struct*) * currentGoomSL->gsl_struct_size); + } + currentGoomSL->gsl_struct[id] = gsl_struct; + } + } /* }}} */ + + /* Creates a field for a struct */ + GSL_StructField *gsl_new_struct_field(const char *name, int type) + { + GSL_StructField *field = (GSL_StructField*)malloc(sizeof(GSL_StructField)); + strcpy(field->name, name); + field->type = type; + return field; + } + + /* Create as field for a struct which will be a struct itself */ + GSL_StructField *gsl_new_struct_field_struct(const char *name, const char *type) + { + GSL_StructField *field = gsl_new_struct_field(name, gsl_get_struct_id(type)); + if (field->type < 0) { + fprintf(stderr, "ERROR: Line %d, Unknown structure: '%s'\n", + currentGoomSL->num_lines, type); + exit(1); + } + return field; + } + + /* Creates a Struct */ + GSL_Struct *gsl_new_struct(GSL_StructField *field) + { + GSL_Struct *s = (GSL_Struct*)malloc(sizeof(GSL_Struct)); + s->nbFields = 1; + s->fields[0] = field; + return s; + } + + /* Adds a field to a struct */ + void gsl_add_struct_field(GSL_Struct *s, GSL_StructField *field) + { + s->fields[s->nbFields++] = field; + } + + int gsl_type_of_var(GoomHash *ns, const char *name) + { + char type_of[256]; + HashValue *hv; + sprintf(type_of, "__type_of_%s", name); + hv = goom_hash_get(ns, type_of); + if (hv != NULL) + return hv->i; + fprintf(stderr, "ERROR: Unknown variable type: '%s'\n", name); + return -1; + } + + static void gsl_declare_var(GoomHash *ns, const char *name, int type, void *space) + { + char type_of[256]; + if (name[0] == '@') { ns = currentGoomSL->vars; } + + if (space == NULL) { + switch (type) { + case INSTR_INT: + case INSTR_FLOAT: + case INSTR_PTR: + space = goom_heap_malloc_with_alignment(currentGoomSL->data_heap, + sizeof(int), sizeof(int)); + break; + case -1: + fprintf(stderr, "What the fuck!\n"); + exit(1); + default: /* On a un struct_id */ + space = goom_heap_malloc_with_alignment_prefixed(currentGoomSL->data_heap, + currentGoomSL->gsl_struct[type]->size, STRUCT_ALIGNMENT, sizeof(int)); + } + } + goom_hash_put_ptr(ns, name, (void*)space); + sprintf(type_of, "__type_of_%s", name); + goom_hash_put_int(ns, type_of, type); + + /* Ensuite le hack: on ajoute les champs en tant que variables. */ + if (type < FIRST_RESERVED) + { + int i; + GSL_Struct *gsl_struct = currentGoomSL->gsl_struct[type]; + ((int*)space)[-1] = type; /* stockage du type dans le prefixe de structure */ + for (i = 0; i < gsl_struct->nbFields; ++i) + { + char full_name[256]; + char *cspace = (char*)space + gsl_struct->fields[i]->offsetInStruct; + sprintf(full_name, "%s.%s", name, gsl_struct->fields[i]->name); + gsl_declare_var(ns, full_name, gsl_struct->fields[i]->type, cspace); + } + } + } + + /* Declare a variable which will be a struct */ + static void gsl_struct_decl(GoomHash *namespace, const char *struct_name, const char *name) + { + int struct_id = gsl_get_struct_id(struct_name); + gsl_declare_var(namespace, name, struct_id, NULL); + } + + static void gsl_float_decl_global(const char *name) + { + gsl_declare_var(currentGoomSL->vars, name, INSTR_FLOAT, NULL); + } + static void gsl_int_decl_global(const char *name) + { + gsl_declare_var(currentGoomSL->vars, name, INSTR_INT, NULL); + } + static void gsl_ptr_decl_global(const char *name) + { + gsl_declare_var(currentGoomSL->vars, name, INSTR_PTR, NULL); + } + static void gsl_struct_decl_global_from_id(const char *name, int id) + { + gsl_declare_var(currentGoomSL->vars, name, id, NULL); + } + + /* FLOAT */ + static void gsl_float_decl_local(const char *name) + { + gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_FLOAT, NULL); + } + /* INT */ + static void gsl_int_decl_local(const char *name) + { + gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_INT, NULL); + } + /* PTR */ + static void gsl_ptr_decl_local(const char *name) + { + gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_PTR, NULL); + } + /* STRUCT */ + static void gsl_struct_decl_local(const char *struct_name, const char *name) + { + gsl_struct_decl(currentGoomSL->namespaces[currentGoomSL->currentNS],struct_name,name); + } + + + static void commit_test2(NodeType *set,const char *type, int instr); + static NodeType *new_call(const char *name, NodeType *affect_list); + + /* SETTER */ + static NodeType *new_set(NodeType *lvalue, NodeType *expression) + { /* {{{ */ + NodeType *set = new_op("set", OPR_SET, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } /* }}} */ + static void commit_set(NodeType *set) + { /* {{{ */ + commit_test2(set,"set",INSTR_SET); + } /* }}} */ + + /* PLUS_EQ */ + static NodeType *new_plus_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("plus_eq", OPR_PLUS_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_plus_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("add %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "add", INSTR_ADD, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* SUB_EQ */ + static NodeType *new_sub_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("sub_eq", OPR_SUB_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_sub_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("sub %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "sub", INSTR_SUB, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* MUL_EQ */ + static NodeType *new_mul_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("mul_eq", OPR_MUL_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_mul_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("mul %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "mul", INSTR_MUL, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* DIV_EQ */ + static NodeType *new_div_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("div_eq", OPR_DIV_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_div_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("div %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "div", INSTR_DIV, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* commodity method for add, mult, ... */ + + static void precommit_expr(NodeType *expr, const char *type, int instr_id) + { /* {{{ */ + NodeType *tmp, *tmpcpy; + int toAdd; + + /* compute "left" and "right" */ + switch (expr->unode.opr.nbOp) { + case 2: + precommit_node(expr->unode.opr.op[1]); + case 1: + precommit_node(expr->unode.opr.op[0]); + } + + if (is_tmp_expr(expr->unode.opr.op[0])) { + tmp = expr->unode.opr.op[0]; + toAdd = 1; + } + else if (is_commutative_expr(instr_id) && (expr->unode.opr.nbOp==2) && is_tmp_expr(expr->unode.opr.op[1])) { + tmp = expr->unode.opr.op[1]; + toAdd = 0; + } + else { + char stmp[256]; + /* declare a temporary variable to store the result */ + if (expr->unode.opr.op[0]->type == CONST_INT_NODE) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (expr->unode.opr.op[0]->type == CONST_FLOAT_NODE) { + sprintf(stmp,"_f_tmp%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (expr->unode.opr.op[0]->type == CONST_PTR_NODE) { + sprintf(stmp,"_p_tmp%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + else { + int type = gsl_type_of_var(expr->unode.opr.op[0]->vnamespace, expr->unode.opr.op[0]->str); + if (type == INSTR_FLOAT) { + sprintf(stmp,"_f_tmp_%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (type == INSTR_PTR) { + sprintf(stmp,"_p_tmp_%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + else if (type == INSTR_INT) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (type == -1) { + fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", + expr->line_number, expr->unode.opr.op[0]->str); + exit(1); + } + else { /* type is a struct_id */ + sprintf(stmp,"_s_tmp_%i",allocateTemp()); + gsl_struct_decl_global_from_id(stmp,type); + } + } + tmp = new_var(stmp,expr->line_number); + + /* set the tmp to the value of "op1" */ + tmpcpy = nodeClone(tmp); + commit_node(new_set(tmp,expr->unode.opr.op[0]),0); + toAdd = 1; + + tmp = tmpcpy; + } + + /* add op2 to tmp */ +#ifdef VERBOSE + if (expr->unode.opr.nbOp == 2) + printf("%s %s %s\n", type, tmp->str, expr->unode.opr.op[toAdd]->str); + else + printf("%s %s\n", type, tmp->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr_id, expr->unode.opr.nbOp, expr->line_number); + tmpcpy = nodeClone(tmp); + commit_node(tmp,0); + if (expr->unode.opr.nbOp == 2) { + commit_node(expr->unode.opr.op[toAdd],1); + } + + /* redefine the ADD node now as the computed variable */ + nodeFreeInternals(expr); + *expr = *tmpcpy; + free(tmpcpy); + } /* }}} */ + + static NodeType *new_expr1(const char *name, int id, NodeType *expr1) + { /* {{{ */ + NodeType *add = new_op(name, id, 1); + add->unode.opr.op[0] = expr1; + return add; + } /* }}} */ + + static NodeType *new_expr2(const char *name, int id, NodeType *expr1, NodeType *expr2) + { /* {{{ */ + NodeType *add = new_op(name, id, 2); + add->unode.opr.op[0] = expr1; + add->unode.opr.op[1] = expr2; + return add; + } /* }}} */ + + /* ADD */ + static NodeType *new_add(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("add", OPR_ADD, expr1, expr2); + } + static void precommit_add(NodeType *add) { + precommit_expr(add,"add",INSTR_ADD); + } /* }}} */ + + /* SUB */ + static NodeType *new_sub(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("sub", OPR_SUB, expr1, expr2); + } + static void precommit_sub(NodeType *sub) { + precommit_expr(sub,"sub",INSTR_SUB); + } /* }}} */ + + /* NEG */ + static NodeType *new_neg(NodeType *expr) { /* {{{ */ + NodeType *zeroConst = NULL; + if (expr->type == CONST_INT_NODE) + zeroConst = new_constInt("0", currentGoomSL->num_lines); + else if (expr->type == CONST_FLOAT_NODE) + zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); + else if (expr->type == CONST_PTR_NODE) { + fprintf(stderr, "ERROR: Line %d, Could not negate const pointer.\n", + currentGoomSL->num_lines); + exit(1); + } + else { + int type = gsl_type_of_var(expr->vnamespace, expr->str); + if (type == INSTR_FLOAT) + zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); + else if (type == INSTR_PTR) { + fprintf(stderr, "ERROR: Line %d, Could not negate pointer.\n", + currentGoomSL->num_lines); + exit(1); + } + else if (type == INSTR_INT) + zeroConst = new_constInt("0", currentGoomSL->num_lines); + else if (type == -1) { + fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", + expr->line_number, expr->unode.opr.op[0]->str); + exit(1); + } + else { /* type is a struct_id */ + fprintf(stderr, "ERROR: Line %d, Could not negate struct '%s'\n", + expr->line_number, expr->str); + exit(1); + } + } + return new_expr2("sub", OPR_SUB, zeroConst, expr); + } + /* }}} */ + + /* MUL */ + static NodeType *new_mul(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("mul", OPR_MUL, expr1, expr2); + } + static void precommit_mul(NodeType *mul) { + precommit_expr(mul,"mul",INSTR_MUL); + } /* }}} */ + + /* DIV */ + static NodeType *new_div(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("div", OPR_DIV, expr1, expr2); + } + static void precommit_div(NodeType *mul) { + precommit_expr(mul,"div",INSTR_DIV); + } /* }}} */ + + /* CALL EXPRESSION */ + static NodeType *new_call_expr(const char *name, NodeType *affect_list) { /* {{{ */ + NodeType *call = new_call(name,affect_list); + NodeType *node = new_expr1(name, OPR_CALL_EXPR, call); + node->vnamespace = gsl_find_namespace(name); + if (node->vnamespace == NULL) + fprintf(stderr, "ERROR: Line %d, No return type for: '%s'\n", currentGoomSL->num_lines, name); + return node; + } + static void precommit_call_expr(NodeType *call) { + char stmp[256]; + NodeType *tmp,*tmpcpy; + int type = gsl_type_of_var(call->vnamespace, call->str); + if (type == INSTR_FLOAT) { + sprintf(stmp,"_f_tmp_%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (type == INSTR_PTR) { + sprintf(stmp,"_p_tmp_%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + else if (type == INSTR_INT) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (type == -1) { + fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", + call->line_number, call->str); + exit(1); + } + else { /* type is a struct_id */ + sprintf(stmp,"_s_tmp_%i",allocateTemp()); + gsl_struct_decl_global_from_id(stmp,type); + } + tmp = new_var(stmp,call->line_number); + commit_node(call->unode.opr.op[0],0); + tmpcpy = nodeClone(tmp); + commit_node(new_set(tmp,new_var(call->str,call->line_number)),0); + + nodeFreeInternals(call); + *call = *tmpcpy; + free(tmpcpy); + } /* }}} */ + + static void commit_test2(NodeType *set,const char *type, int instr) + { /* {{{ */ + NodeType *tmp; + char stmp[256]; + precommit_node(set->unode.opr.op[0]); + precommit_node(set->unode.opr.op[1]); + tmp = set->unode.opr.op[0]; + + stmp[0] = 0; + if (set->unode.opr.op[0]->type == CONST_INT_NODE) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (set->unode.opr.op[0]->type == CONST_FLOAT_NODE) { + sprintf(stmp,"_f_tmp%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (set->unode.opr.op[0]->type == CONST_PTR_NODE) { + sprintf(stmp,"_p_tmp%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + if (stmp[0]) { + NodeType *tmpcpy; + tmp = new_var(stmp, set->line_number); + tmpcpy = nodeClone(tmp); + commit_node(new_set(tmp,set->unode.opr.op[0]),0); + tmp = tmpcpy; + } + +#ifdef VERBOSE + printf("%s %s %s\n", type, tmp->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr, 2, set->line_number); + commit_node(tmp,instr!=INSTR_SET); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* NOT */ + static NodeType *new_not(NodeType *expr1) { /* {{{ */ + return new_expr1("not", OPR_NOT, expr1); + } + static void commit_not(NodeType *set) + { + commit_node(set->unode.opr.op[0],0); +#ifdef VERBOSE + printf("not\n"); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "not", INSTR_NOT, 1, set->line_number); + gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); + } /* }}} */ + + /* EQU */ + static NodeType *new_equ(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("isequal", OPR_EQU, expr1, expr2); + } + static void commit_equ(NodeType *mul) { + commit_test2(mul,"isequal",INSTR_ISEQUAL); + } /* }}} */ + + /* INF */ + static NodeType *new_low(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("islower", OPR_LOW, expr1, expr2); + } + static void commit_low(NodeType *mul) { + commit_test2(mul,"islower",INSTR_ISLOWER); + } /* }}} */ + + /* WHILE */ + static NodeType *new_while(NodeType *expression, NodeType *instr) { /* {{{ */ + NodeType *node = new_op("while", OPR_WHILE, 2); + node->unode.opr.op[0] = expression; + node->unode.opr.op[1] = instr; + return node; + } + + static void commit_while(NodeType *node) + { + int lbl = allocateLabel(); + char start_while[1024], test_while[1024]; + sprintf(start_while, "|start_while_%d|", lbl); + sprintf(test_while, "|test_while_%d|", lbl); + + GSL_PUT_JUMP(test_while,node->line_number); + GSL_PUT_LABEL(start_while,node->line_number); + + /* code */ + commit_node(node->unode.opr.op[1],0); + + GSL_PUT_LABEL(test_while,node->line_number); + commit_node(node->unode.opr.op[0],0); + GSL_PUT_JNZERO(start_while,node->line_number); + } /* }}} */ + + /* FOR EACH */ + static NodeType *new_static_foreach(NodeType *var, NodeType *var_list, NodeType *instr) { /* {{{ */ + NodeType *node = new_op("for", OPR_FOREACH, 3); + node->unode.opr.op[0] = var; + node->unode.opr.op[1] = var_list; + node->unode.opr.op[2] = instr; + node->line_number = currentGoomSL->num_lines; + return node; + } + static void commit_foreach(NodeType *node) + { + NodeType *cur = node->unode.opr.op[1]; + char tmp_func[256], tmp_loop[256]; + int lbl = allocateLabel(); + sprintf(tmp_func, "|foreach_func_%d|", lbl); + sprintf(tmp_loop, "|foreach_loop_%d|", lbl); + + GSL_PUT_JUMP(tmp_loop, node->line_number); + GSL_PUT_LABEL(tmp_func, node->line_number); + + precommit_node(node->unode.opr.op[2]); + commit_node(node->unode.opr.op[2], 0); + + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +#ifdef VERBOSE + printf("ret\n"); +#endif + + GSL_PUT_LABEL(tmp_loop, node->line_number); + + while (cur != NULL) + { + NodeType *x, *var; + + /* 1: x=var */ + x = nodeClone(node->unode.opr.op[0]); + var = nodeClone(cur->unode.opr.op[0]); + commit_node(new_set(x, var),0); + + /* 2: instr */ + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, tmp_func, TYPE_LABEL); +#ifdef VERBOSE + printf("call %s\n", tmp_func); +#endif + + /* 3: var=x */ + x = nodeClone(node->unode.opr.op[0]); + var = cur->unode.opr.op[0]; + commit_node(new_set(var, x),0); + cur = cur->unode.opr.op[1]; + } + nodeFree(node->unode.opr.op[0]); + } /* }}} */ + + /* IF */ + static NodeType *new_if(NodeType *expression, NodeType *instr) { /* {{{ */ + NodeType *node = new_op("if", OPR_IF, 2); + node->unode.opr.op[0] = expression; + node->unode.opr.op[1] = instr; + return node; + } + static void commit_if(NodeType *node) { + + char slab[1024]; + sprintf(slab, "|eif%d|", allocateLabel()); + commit_node(node->unode.opr.op[0],0); + GSL_PUT_JZERO(slab,node->line_number); + /* code */ + commit_node(node->unode.opr.op[1],0); + GSL_PUT_LABEL(slab,node->line_number); + } /* }}} */ + + /* BLOCK */ + static NodeType *new_block(NodeType *lastNode) { /* {{{ */ + NodeType *blk = new_op("block", OPR_BLOCK, 2); + blk->unode.opr.op[0] = new_nop("start_of_block"); + blk->unode.opr.op[1] = lastNode; + return blk; + } + static void commit_block(NodeType *node) { + commit_node(node->unode.opr.op[0]->unode.opr.next,0); + } /* }}} */ + + /* FUNCTION INTRO */ + static NodeType *new_function_intro(const char *name) { /* {{{ */ + char stmp[256]; + if (strlen(name) < 200) { + sprintf(stmp, "|__func_%s|", name); + } + return new_op(stmp, OPR_FUNC_INTRO, 0); + } + static void commit_function_intro(NodeType *node) { + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +#ifdef VERBOSE + printf("label %s\n", node->str); +#endif + } /* }}} */ + + /* FUNCTION OUTRO */ + static NodeType *new_function_outro() { /* {{{ */ + return new_op("ret", OPR_FUNC_OUTRO, 0); + } + static void commit_function_outro(NodeType *node) { + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); + releaseAllTemps(); +#ifdef VERBOSE + printf("ret\n"); +#endif + } /* }}} */ + + /* AFFECTATION LIST */ + static NodeType *new_affec_list(NodeType *set, NodeType *next) /* {{{ */ + { + NodeType *node = new_op("affect_list", OPR_AFFECT_LIST, 2); + node->unode.opr.op[0] = set; + node->unode.opr.op[1] = next; + return node; + } + static NodeType *new_affect_list_after(NodeType *affect_list) + { + NodeType *ret = NULL; + NodeType *cur = affect_list; + while(cur != NULL) { + NodeType *set = cur->unode.opr.op[0]; + NodeType *next = cur->unode.opr.op[1]; + NodeType *lvalue = set->unode.opr.op[0]; + NodeType *expression = set->unode.opr.op[1]; + if ((lvalue->str[0] == '&') && (expression->type == VAR_NODE)) { + NodeType *nset = new_set(nodeClone(expression), nodeClone(lvalue)); + ret = new_affec_list(nset, ret); + } + cur = next; + } + return ret; + } + static void commit_affect_list(NodeType *node) + { + NodeType *cur = node; + while(cur != NULL) { + NodeType *set = cur->unode.opr.op[0]; + precommit_node(set->unode.opr.op[0]); + precommit_node(set->unode.opr.op[1]); + cur = cur->unode.opr.op[1]; + } + cur = node; + while(cur != NULL) { + NodeType *set = cur->unode.opr.op[0]; + commit_node(set,0); + cur = cur->unode.opr.op[1]; + } + } /* }}} */ + + /* VAR LIST */ + static NodeType *new_var_list(NodeType *var, NodeType *next) /* {{{ */ + { + NodeType *node = new_op("var_list", OPR_VAR_LIST, 2); + node->unode.opr.op[0] = var; + node->unode.opr.op[1] = next; + return node; + } + static void commit_var_list(NodeType *node) + { + } /* }}} */ + + /* FUNCTION CALL */ + static NodeType *new_call(const char *name, NodeType *affect_list) { /* {{{ */ + HashValue *fval; + fval = goom_hash_get(currentGoomSL->functions, name); + if (!fval) { + gsl_declare_task(name); + fval = goom_hash_get(currentGoomSL->functions, name); + } + if (!fval) { + fprintf(stderr, "ERROR: Line %d, Could not find function %s\n", currentGoomSL->num_lines, name); + exit(1); + return NULL; + } + else { + ExternalFunctionStruct *gef = (ExternalFunctionStruct*)fval->ptr; + if (gef->is_extern) { + NodeType *node = new_op(name, OPR_EXT_CALL, 1); + node->unode.opr.op[0] = affect_list; + return node; + } + else { + NodeType *node; + char stmp[256]; + if (strlen(name) < 200) { + sprintf(stmp, "|__func_%s|", name); + } + node = new_op(stmp, OPR_CALL, 1); + node->unode.opr.op[0] = affect_list; + return node; + } + } + } + static void commit_ext_call(NodeType *node) { + NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); + commit_node(node->unode.opr.op[0],0); + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "extcall", INSTR_EXT_CALL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); +#ifdef VERBOSE + printf("extcall %s\n", node->str); +#endif + commit_node(alafter,0); + } + static void commit_call(NodeType *node) { + NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); + commit_node(node->unode.opr.op[0],0); + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +#ifdef VERBOSE + printf("call %s\n", node->str); +#endif + commit_node(alafter,0); + } /* }}} */ + + /** **/ + + static NodeType *rootNode = 0; /* TODO: reinitialiser a chaque compilation. */ + static NodeType *lastNode = 0; + static NodeType *gsl_append(NodeType *curNode) { + if (curNode == 0) return 0; /* {{{ */ + if (lastNode) + lastNode->unode.opr.next = curNode; + lastNode = curNode; + while(lastNode->unode.opr.next) lastNode = lastNode->unode.opr.next; + if (rootNode == 0) + rootNode = curNode; + return curNode; + } /* }}} */ + +#if 1 + int allocateTemp() { + return allocateLabel(); + } + void releaseAllTemps() {} + void releaseTemp(int n) {} +#else + static int nbTemp = 0; + static int *tempArray = 0; + static int tempArraySize = 0; + int allocateTemp() { /* TODO: allocateITemp, allocateFTemp */ + int i = 0; /* {{{ */ + if (tempArray == 0) { + tempArraySize = 256; + tempArray = (int*)malloc(tempArraySize * sizeof(int)); + } + while (1) { + int j; + for (j=0;j<nbTemp;++j) { + if (tempArray[j] == i) break; + } + if (j == nbTemp) { + if (nbTemp == tempArraySize) { + tempArraySize *= 2; + tempArray = (int*)realloc(tempArray,tempArraySize * sizeof(int)); + } + tempArray[nbTemp++] = i; + return i; + } + i++; + } + } /* }}} */ + void releaseAllTemps() { + nbTemp = 0; /* {{{ */ + } /* }}} */ + void releaseTemp(int n) { + int j; /* {{{ */ + for (j=0;j<nbTemp;++j) { + if (tempArray[j] == n) { + tempArray[j] = tempArray[--nbTemp]; + break; + } + } + } /* }}} */ +#endif + + static int lastLabel = 0; + int allocateLabel() { + return ++lastLabel; /* {{{ */ + } /* }}} */ + + void gsl_commit_compilation() + { /* {{{ */ + commit_node(rootNode,0); + rootNode = 0; + lastNode = 0; + } /* }}} */ + + void precommit_node(NodeType *node) + { /* {{{ */ + /* do here stuff for expression.. for exemple */ + if (node->type == OPR_NODE) + switch(node->unode.opr.type) { + case OPR_ADD: precommit_add(node); break; + case OPR_SUB: precommit_sub(node); break; + case OPR_MUL: precommit_mul(node); break; + case OPR_DIV: precommit_div(node); break; + case OPR_CALL_EXPR: precommit_call_expr(node); break; + } + } /* }}} */ + + void commit_node(NodeType *node, int releaseIfTmp) + { /* {{{ */ + if (node == 0) return; + + switch(node->type) { + case OPR_NODE: + switch(node->unode.opr.type) { + case OPR_SET: commit_set(node); break; + case OPR_PLUS_EQ: commit_plus_eq(node); break; + case OPR_SUB_EQ: commit_sub_eq(node); break; + case OPR_MUL_EQ: commit_mul_eq(node); break; + case OPR_DIV_EQ: commit_div_eq(node); break; + case OPR_IF: commit_if(node); break; + case OPR_WHILE: commit_while(node); break; + case OPR_BLOCK: commit_block(node); break; + case OPR_FUNC_INTRO: commit_function_intro(node); break; + case OPR_FUNC_OUTRO: commit_function_outro(node); break; + case OPR_CALL: commit_call(node); break; + case OPR_EXT_CALL: commit_ext_call(node); break; + case OPR_EQU: commit_equ(node); break; + case OPR_LOW: commit_low(node); break; + case OPR_NOT: commit_not(node); break; + case OPR_AFFECT_LIST: commit_affect_list(node); break; + case OPR_FOREACH: commit_foreach(node); break; + case OPR_VAR_LIST: commit_var_list(node); break; +#ifdef VERBOSE + case EMPTY_NODE: printf("NOP\n"); break; +#endif + } + + commit_node(node->unode.opr.next,0); /* recursive for the moment, maybe better to do something iterative? */ + break; + + case VAR_NODE: gsl_instr_set_namespace(currentGoomSL->instr, node->vnamespace); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); break; + case CONST_INT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_INTEGER); break; + case CONST_FLOAT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_FLOAT); break; + case CONST_PTR_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_PTR); break; + } + if (releaseIfTmp && is_tmp_expr(node)) + releaseTemp(get_tmp_id(node)); + + nodeFree(node); + } /* }}} */ + + NodeType *nodeNew(const char *str, int type, int line_number) { + NodeType *node = (NodeType*)malloc(sizeof(NodeType)); /* {{{ */ + node->type = type; + node->str = (char*)malloc(strlen(str)+1); + node->vnamespace = NULL; + node->line_number = line_number; + strcpy(node->str, str); + return node; + } /* }}} */ + static NodeType *nodeClone(NodeType *node) { + NodeType *ret = nodeNew(node->str, node->type, node->line_number); /* {{{ */ + ret->vnamespace = node->vnamespace; + ret->unode = node->unode; + return ret; + } /* }}} */ + + void nodeFreeInternals(NodeType *node) { + free(node->str); /* {{{ */ + } /* }}} */ + + void nodeFree(NodeType *node) { + nodeFreeInternals(node); /* {{{ */ + free(node); + } /* }}} */ + + NodeType *new_constInt(const char *str, int line_number) { + NodeType *node = nodeNew(str, CONST_INT_NODE, line_number); /* {{{ */ + node->unode.constInt.val = atoi(str); + return node; + } /* }}} */ + + NodeType *new_constPtr(const char *str, int line_number) { + NodeType *node = nodeNew(str, CONST_PTR_NODE, line_number); /* {{{ */ + node->unode.constPtr.id = strtol(str,NULL,0); + return node; + } /* }}} */ + + NodeType *new_constFloat(const char *str, int line_number) { + NodeType *node = nodeNew(str, CONST_FLOAT_NODE, line_number); /* {{{ */ + node->unode.constFloat.val = atof(str); + return node; + } /* }}} */ + + NodeType *new_var(const char *str, int line_number) { + NodeType *node = nodeNew(str, VAR_NODE, line_number); /* {{{ */ + node->vnamespace = gsl_find_namespace(str); + if (node->vnamespace == 0) { + fprintf(stderr, "ERROR: Line %d, Variable not found: '%s'\n", line_number, str); + exit(1); + } + return node; + } /* }}} */ + + NodeType *new_nop(const char *str) { + NodeType *node = new_op(str, EMPTY_NODE, 0); /* {{{ */ + return node; + } /* }}} */ + + NodeType *new_op(const char *str, int type, int nbOp) { + int i; /* {{{ */ + NodeType *node = nodeNew(str, OPR_NODE, currentGoomSL->num_lines); + node->unode.opr.next = 0; + node->unode.opr.type = type; + node->unode.opr.nbOp = nbOp; + for (i=0;i<nbOp;++i) node->unode.opr.op[i] = 0; + return node; + } /* }}} */ + + + void gsl_declare_global_variable(int type, char *name) { + switch(type){ + case -1: break; + case FLOAT_TK:gsl_float_decl_global(name);break; + case INT_TK: gsl_int_decl_global(name);break; + case PTR_TK: gsl_ptr_decl_global(name);break; + default: + { + int id = type - 1000; + gsl_struct_decl_global_from_id(name,id); + } + } + } + + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 1199 "goomsl_yacc.y" +typedef union YYSTYPE { + int intValue; + float floatValue; + char charValue; + char strValue[2048]; + NodeType *nPtr; + GoomHash *namespace; + GSL_Struct *gsl_struct; + GSL_StructField *gsl_struct_field; + } YYSTYPE; +/* Line 191 of yacc.c. */ +#line 1327 "goomsl_yacc.c" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 214 of yacc.c. */ +#line 1339 "goomsl_yacc.c" + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# if YYSTACK_USE_ALLOCA +# define YYSTACK_ALLOC alloca +# else +# ifndef YYSTACK_USE_ALLOCA +# if defined (alloca) || defined (_ALLOCA_H) +# define YYSTACK_ALLOC alloca +# else +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC malloc +# define YYSTACK_FREE free +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short yysigned_char; +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 3 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 229 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 42 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 30 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 89 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 217 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 279 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 35, 36, 32, 29, 34, 30, 2, 31, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 33, 2, + 27, 26, 28, 37, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 40, 2, 41, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 38, 2, 39, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned short yyprhs[] = +{ + 0, 0, 3, 7, 10, 19, 30, 39, 50, 53, + 56, 57, 65, 68, 73, 76, 79, 82, 85, 87, + 89, 90, 93, 96, 99, 102, 104, 108, 111, 112, + 116, 122, 130, 131, 132, 137, 142, 147, 152, 154, + 157, 160, 163, 166, 169, 172, 179, 186, 193, 195, + 199, 203, 207, 211, 218, 222, 224, 227, 231, 232, + 234, 236, 240, 244, 248, 252, 255, 259, 261, 265, + 269, 273, 277, 281, 285, 288, 290, 292, 294, 298, + 304, 310, 318, 323, 330, 333, 335, 340, 344, 346 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yysigned_char yyrhs[] = +{ + 43, 0, -1, 44, 55, 52, -1, 44, 59, -1, + 44, 11, 27, 48, 28, 50, 25, 56, -1, 44, + 11, 27, 48, 33, 51, 28, 50, 25, 56, -1, + 44, 10, 27, 49, 28, 50, 25, 56, -1, 44, + 10, 27, 49, 33, 51, 28, 50, 25, 56, -1, + 44, 45, -1, 44, 25, -1, -1, 22, 27, 5, + 33, 46, 28, 25, -1, 71, 47, -1, 46, 34, + 71, 47, -1, 8, 5, -1, 9, 5, -1, 7, + 5, -1, 5, 5, -1, 5, -1, 5, -1, -1, + 33, 8, -1, 33, 9, -1, 33, 7, -1, 33, + 5, -1, 58, -1, 58, 34, 51, -1, 52, 53, + -1, -1, 54, 44, 55, -1, 27, 49, 28, 50, + 25, -1, 27, 49, 33, 51, 28, 50, 25, -1, + -1, -1, 9, 5, 26, 64, -1, 8, 5, 26, + 64, -1, 7, 5, 26, 64, -1, 5, 5, 26, + 64, -1, 58, -1, 9, 5, -1, 8, 5, -1, + 7, 5, -1, 5, 5, -1, 62, 25, -1, 57, + 25, -1, 35, 65, 36, 37, 71, 59, -1, 12, + 65, 71, 13, 71, 59, -1, 38, 25, 63, 44, + 39, 25, -1, 67, -1, 5, 15, 64, -1, 5, + 16, 64, -1, 5, 18, 64, -1, 5, 17, 64, + -1, 23, 5, 24, 60, 13, 59, -1, 35, 61, + 36, -1, 5, -1, 5, 61, -1, 5, 26, 64, + -1, -1, 5, -1, 66, -1, 64, 32, 64, -1, + 64, 31, 64, -1, 64, 29, 64, -1, 64, 30, + 64, -1, 30, 64, -1, 35, 64, 36, -1, 68, + -1, 64, 26, 64, -1, 64, 27, 64, -1, 64, + 28, 64, -1, 64, 19, 64, -1, 64, 20, 64, + -1, 64, 21, 64, -1, 14, 65, -1, 4, -1, + 3, -1, 6, -1, 49, 25, 56, -1, 49, 33, + 69, 25, 56, -1, 40, 49, 41, 25, 56, -1, + 40, 49, 33, 69, 41, 25, 56, -1, 40, 49, + 56, 41, -1, 40, 49, 33, 69, 41, 56, -1, + 70, 69, -1, 70, -1, 5, 26, 56, 64, -1, + 33, 56, 64, -1, 25, -1, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short yyrline[] = +{ + 0, 1236, 1236, 1238, 1239, 1240, 1241, 1242, 1243, 1244, + 1245, 1250, 1253, 1254, 1257, 1258, 1259, 1260, 1265, 1267, + 1270, 1271, 1272, 1273, 1274, 1277, 1278, 1283, 1284, 1287, + 1289, 1291, 1294, 1296, 1300, 1301, 1302, 1303, 1304, 1307, + 1308, 1309, 1310, 1315, 1316, 1317, 1318, 1319, 1320, 1321, + 1322, 1323, 1324, 1325, 1328, 1330, 1331, 1334, 1336, 1339, + 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1350, 1351, + 1352, 1353, 1354, 1355, 1356, 1359, 1360, 1361, 1366, 1367, + 1368, 1369, 1373, 1374, 1377, 1378, 1380, 1384, 1393, 1393 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "LTYPE_INTEGER", "LTYPE_FLOAT", + "LTYPE_VAR", "LTYPE_PTR", "PTR_TK", "INT_TK", "FLOAT_TK", "DECLARE", + "EXTERNAL", "WHILE", "DO", "NOT", "PLUS_EQ", "SUB_EQ", "DIV_EQ", + "MUL_EQ", "SUP_EQ", "LOW_EQ", "NOT_EQ", "STRUCT", "FOR", "IN", "'\\n'", + "'='", "'<'", "'>'", "'+'", "'-'", "'/'", "'*'", "':'", "','", "'('", + "')'", "'?'", "'{'", "'}'", "'['", "']'", "$accept", "gsl", "gsl_code", + "struct_declaration", "struct_members", "struct_member", + "ext_task_name", "task_name", "return_type", "arglist", + "gsl_def_functions", "function", "function_intro", "function_outro", + "leave_namespace", "declaration", "empty_declaration", "instruction", + "var_list", "var_list_content", "affectation", "start_block", + "expression", "test", "constValue", "func_call", "func_call_expression", + "affectation_list", "affectation_in_list", "opt_nl", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 10, 61, 60, 62, 43, + 45, 47, 42, 58, 44, 40, 41, 63, 123, 125, + 91, 93 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 42, 43, 44, 44, 44, 44, 44, 44, 44, + 44, 45, 46, 46, 47, 47, 47, 47, 48, 49, + 50, 50, 50, 50, 50, 51, 51, 52, 52, 53, + 54, 54, 55, 56, 57, 57, 57, 57, 57, 58, + 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 60, 61, 61, 62, 63, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, + 65, 65, 65, 65, 65, 66, 66, 66, 67, 67, + 67, 67, 68, 68, 69, 69, 70, 70, 71, 71 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 3, 2, 8, 10, 8, 10, 2, 2, + 0, 7, 2, 4, 2, 2, 2, 2, 1, 1, + 0, 2, 2, 2, 2, 1, 3, 2, 0, 3, + 5, 7, 0, 0, 4, 4, 4, 4, 1, 2, + 2, 2, 2, 2, 2, 6, 6, 6, 1, 3, + 3, 3, 3, 6, 3, 1, 2, 3, 0, 1, + 1, 3, 3, 3, 3, 2, 3, 1, 3, 3, + 3, 3, 3, 3, 2, 1, 1, 1, 3, 5, + 5, 7, 4, 6, 2, 1, 4, 3, 1, 0 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned char yydefact[] = +{ + 10, 0, 32, 1, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 0, 0, 0, 8, 0, 28, + 0, 38, 3, 0, 48, 42, 0, 0, 0, 0, + 0, 41, 40, 39, 0, 0, 76, 75, 59, 77, + 0, 0, 0, 0, 0, 89, 60, 67, 0, 0, + 0, 58, 19, 0, 33, 0, 2, 44, 43, 0, + 49, 50, 52, 51, 57, 0, 0, 0, 0, 18, + 0, 74, 65, 0, 33, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, + 10, 0, 0, 78, 0, 33, 0, 85, 0, 27, + 10, 37, 36, 35, 34, 20, 0, 20, 0, 66, + 0, 0, 71, 72, 73, 68, 69, 70, 63, 64, + 62, 61, 89, 89, 0, 0, 89, 0, 0, 33, + 33, 0, 33, 84, 0, 32, 0, 0, 0, 0, + 0, 0, 0, 25, 0, 0, 0, 82, 0, 0, + 0, 55, 0, 0, 0, 0, 0, 80, 0, 87, + 79, 20, 0, 29, 24, 23, 21, 22, 33, 42, + 41, 40, 39, 20, 0, 33, 20, 33, 46, 0, + 89, 0, 0, 0, 0, 12, 56, 54, 53, 45, + 47, 33, 86, 0, 0, 6, 0, 26, 4, 0, + 83, 11, 0, 17, 16, 14, 15, 81, 30, 20, + 33, 33, 13, 0, 7, 5, 31 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const short yydefgoto[] = +{ + -1, 1, 2, 17, 149, 185, 70, 18, 137, 142, + 56, 99, 100, 19, 93, 20, 21, 22, 125, 152, + 23, 90, 44, 45, 46, 24, 47, 96, 97, 86 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -116 +static const short yypact[] = +{ + -116, 40, 136, -116, 103, 39, 66, 68, 61, 65, + 1, 77, 101, -116, 1, 84, 109, -116, 12, -116, + 91, -116, -116, 97, -116, 98, 72, 72, 72, 72, + 72, 99, 104, 113, 109, 130, -116, -116, -116, -116, + 1, 72, 72, 109, 166, 115, -116, -116, 145, 131, + 118, -116, -116, -24, -116, -3, 138, -116, -116, 72, + 159, 159, 159, 159, 159, 72, 72, 72, 14, -116, + 51, -116, 22, 102, 124, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, -116, 160, 139, 140, 141, + -116, -3, 152, -116, 154, -116, 156, -3, 109, -116, + -116, 159, 159, 159, 159, 150, 82, 150, 82, -116, + -3, 158, 159, 159, 159, 159, 159, 159, 22, 22, + -116, -116, 115, 115, 195, 188, 115, 88, 162, -116, + -116, 72, -116, -116, 52, 136, 155, 177, 199, 200, + 201, 202, 180, 175, 185, 183, 171, -116, 144, 18, + 161, 195, 178, 144, 144, 190, 191, -116, 72, 159, + -116, 150, 82, -116, -116, -116, -116, -116, -116, -116, + -116, -116, -116, 150, 82, -116, 150, -116, -116, 192, + 115, 208, 213, 214, 215, -116, -116, -116, -116, -116, + -116, -116, 159, 196, 194, -116, 198, -116, -116, 203, + -116, -116, 161, -116, -116, -116, -116, -116, -116, 150, + -116, -116, -116, 204, -116, -116, -116 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yysigned_char yypgoto[] = +{ + -116, -116, -68, -116, -116, 23, -116, -15, -104, -92, + -116, -116, -116, 89, -74, -116, -88, -115, -116, 75, + -116, -116, -16, -6, -116, -116, -116, -62, -116, -99 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -1 +static const unsigned char yytable[] = +{ + 111, 53, 94, 144, 36, 37, 38, 39, 50, 91, + 60, 61, 62, 63, 64, 40, 145, 92, 143, 68, + 143, 131, 127, 148, 150, 72, 73, 154, 74, 128, + 95, 41, 135, 178, 71, 133, 42, 54, 188, 189, + 3, 43, 105, 101, 31, 55, 179, 106, 146, 102, + 103, 104, 180, 83, 84, 157, 158, 193, 160, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 196, + 194, 32, 199, 33, 143, 36, 37, 38, 39, 107, + 161, 202, 197, 134, 108, 162, 143, 138, 34, 139, + 140, 141, 35, 4, 195, 5, 6, 7, 8, 9, + 10, 198, 41, 200, 48, 213, 49, 42, 25, 51, + 11, 12, 43, 13, 52, 159, 57, 207, 26, 27, + 28, 29, 58, 14, 59, 65, 15, 155, 16, 30, + 66, 81, 82, 83, 84, 69, 214, 215, 109, 67, + 85, 4, 192, 5, 6, 7, 8, 9, 10, 4, + 87, 5, 6, 7, 89, 88, 10, 110, 11, 12, + 164, 13, 165, 166, 167, 98, 181, 12, 182, 183, + 184, 14, 123, 122, 15, 124, 16, 129, 126, 14, + 130, 132, 15, 136, 16, 75, 76, 77, 81, 82, + 83, 84, 78, 79, 80, 81, 82, 83, 84, 147, + 151, 153, 168, 156, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 203, 187, 190, 191, 201, 204, 205, + 206, 208, 209, 210, 163, 212, 186, 0, 211, 216 +}; + +static const short yycheck[] = +{ + 74, 16, 5, 107, 3, 4, 5, 6, 14, 33, + 26, 27, 28, 29, 30, 14, 108, 41, 106, 34, + 108, 95, 90, 122, 123, 41, 42, 126, 43, 91, + 33, 30, 100, 148, 40, 97, 35, 25, 153, 154, + 0, 40, 28, 59, 5, 33, 28, 33, 110, 65, + 66, 67, 34, 31, 32, 129, 130, 161, 132, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 173, + 162, 5, 176, 5, 162, 3, 4, 5, 6, 28, + 28, 180, 174, 98, 33, 33, 174, 5, 27, 7, + 8, 9, 27, 5, 168, 7, 8, 9, 10, 11, + 12, 175, 30, 177, 27, 209, 5, 35, 5, 25, + 22, 23, 40, 25, 5, 131, 25, 191, 15, 16, + 17, 18, 25, 35, 26, 26, 38, 39, 40, 26, + 26, 29, 30, 31, 32, 5, 210, 211, 36, 26, + 25, 5, 158, 7, 8, 9, 10, 11, 12, 5, + 5, 7, 8, 9, 36, 24, 12, 33, 22, 23, + 5, 25, 7, 8, 9, 27, 5, 23, 7, 8, + 9, 35, 33, 13, 38, 35, 40, 25, 37, 35, + 26, 25, 38, 33, 40, 19, 20, 21, 29, 30, + 31, 32, 26, 27, 28, 29, 30, 31, 32, 41, + 5, 13, 25, 41, 5, 5, 5, 5, 28, 34, + 25, 28, 41, 5, 36, 25, 25, 25, 5, 5, + 5, 25, 28, 25, 135, 202, 151, -1, 25, 25 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 43, 44, 0, 5, 7, 8, 9, 10, 11, + 12, 22, 23, 25, 35, 38, 40, 45, 49, 55, + 57, 58, 59, 62, 67, 5, 15, 16, 17, 18, + 26, 5, 5, 5, 27, 27, 3, 4, 5, 6, + 14, 30, 35, 40, 64, 65, 66, 68, 27, 5, + 65, 25, 5, 49, 25, 33, 52, 25, 25, 26, + 64, 64, 64, 64, 64, 26, 26, 26, 49, 5, + 48, 65, 64, 64, 49, 19, 20, 21, 26, 27, + 28, 29, 30, 31, 32, 25, 71, 5, 24, 36, + 63, 33, 41, 56, 5, 33, 69, 70, 27, 53, + 54, 64, 64, 64, 64, 28, 33, 28, 33, 36, + 33, 56, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 13, 33, 35, 60, 37, 44, 69, 25, + 26, 56, 25, 69, 49, 44, 33, 50, 5, 7, + 8, 9, 51, 58, 50, 51, 69, 41, 71, 46, + 71, 5, 61, 13, 71, 39, 41, 56, 56, 64, + 56, 28, 33, 55, 5, 7, 8, 9, 25, 5, + 5, 5, 5, 28, 34, 25, 28, 41, 59, 28, + 34, 5, 7, 8, 9, 47, 61, 36, 59, 59, + 25, 25, 64, 50, 51, 56, 50, 51, 56, 50, + 56, 25, 71, 5, 5, 5, 5, 56, 25, 28, + 25, 25, 47, 50, 56, 56, 25 +}; + +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrlab1 + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror ("syntax error: cannot back up");\ + YYERROR; \ + } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ + +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + Current.first_line = Rhs[1].first_line; \ + Current.first_column = Rhs[1].first_column; \ + Current.last_line = Rhs[N].last_line; \ + Current.last_column = Rhs[N].last_column; +#endif + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) + +# define YYDSYMPRINTF(Title, Token, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Token, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (cinluded). | +`------------------------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_stack_print (short *bottom, short *top) +#else +static void +yy_stack_print (bottom, top) + short *bottom; + short *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_reduce_print (int yyrule) +#else +static void +yy_reduce_print (yyrule) + int yyrule; +#endif +{ + int yyi; + unsigned int yylineno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", + yyrule - 1, yylineno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +# define YYDSYMPRINTF(Title, Token, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#if YYMAXDEPTH == 0 +# undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + register char *yyd = yydest; + register const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +#endif /* !YYERROR_VERBOSE */ + + + +#if YYDEBUG +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +#else +static void +yysymprint (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +# ifdef YYPRINT + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + } + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); +} + +#endif /* ! YYDEBUG */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yydestruct (int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yytype, yyvaluep) + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + switch (yytype) + { + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM); +# else +int yyparse (); +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM) +# else +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + + register int yystate; + register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short yyssa[YYINITDEPTH]; + short *yyss = yyssa; + register short *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; + + + +#define YYPOPSTACK (yyvsp--, yyssp--) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ + int yylen; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyoverflowlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + short *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; + + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + yystate = yyn; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 3: +#line 1238 "goomsl_yacc.y" + { gsl_append(yyvsp[0].nPtr); } + break; + + case 4: +#line 1239 "goomsl_yacc.y" + { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-4].strValue); } + break; + + case 5: +#line 1240 "goomsl_yacc.y" + { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-6].strValue); } + break; + + case 6: +#line 1241 "goomsl_yacc.y" + { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-4].strValue); } + break; + + case 7: +#line 1242 "goomsl_yacc.y" + { gsl_declare_global_variable(yyvsp[-2].intValue,yyvsp[-6].strValue); } + break; + + case 11: +#line 1250 "goomsl_yacc.y" + { gsl_add_struct(yyvsp[-4].strValue, yyvsp[-2].gsl_struct); } + break; + + case 12: +#line 1253 "goomsl_yacc.y" + { yyval.gsl_struct = gsl_new_struct(yyvsp[0].gsl_struct_field); } + break; + + case 13: +#line 1254 "goomsl_yacc.y" + { yyval.gsl_struct = yyvsp[-3].gsl_struct; gsl_add_struct_field(yyvsp[-3].gsl_struct, yyvsp[0].gsl_struct_field); } + break; + + case 14: +#line 1257 "goomsl_yacc.y" + { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_INT); } + break; + + case 15: +#line 1258 "goomsl_yacc.y" + { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_FLOAT); } + break; + + case 16: +#line 1259 "goomsl_yacc.y" + { yyval.gsl_struct_field = gsl_new_struct_field(yyvsp[0].strValue, INSTR_PTR); } + break; + + case 17: +#line 1260 "goomsl_yacc.y" + { yyval.gsl_struct_field = gsl_new_struct_field_struct(yyvsp[0].strValue, yyvsp[-1].strValue); } + break; + + case 18: +#line 1265 "goomsl_yacc.y" + { gsl_declare_external_task(yyvsp[0].strValue); gsl_enternamespace(yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); } + break; + + case 19: +#line 1267 "goomsl_yacc.y" + { gsl_declare_task(yyvsp[0].strValue); gsl_enternamespace(yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); strcpy(yyval.strValue,yyvsp[0].strValue); } + break; + + case 20: +#line 1270 "goomsl_yacc.y" + { yyval.intValue=-1; } + break; + + case 21: +#line 1271 "goomsl_yacc.y" + { yyval.intValue=INT_TK; } + break; + + case 22: +#line 1272 "goomsl_yacc.y" + { yyval.intValue=FLOAT_TK; } + break; + + case 23: +#line 1273 "goomsl_yacc.y" + { yyval.intValue=PTR_TK; } + break; + + case 24: +#line 1274 "goomsl_yacc.y" + { yyval.intValue= 1000 + gsl_get_struct_id(yyvsp[0].strValue); } + break; + + case 29: +#line 1287 "goomsl_yacc.y" + { gsl_leavenamespace(); } + break; + + case 30: +#line 1289 "goomsl_yacc.y" + { gsl_append(new_function_intro(yyvsp[-3].strValue)); + gsl_declare_global_variable(yyvsp[-1].intValue,yyvsp[-3].strValue); } + break; + + case 31: +#line 1291 "goomsl_yacc.y" + { gsl_append(new_function_intro(yyvsp[-5].strValue)); + gsl_declare_global_variable(yyvsp[-1].intValue,yyvsp[-5].strValue); } + break; + + case 32: +#line 1294 "goomsl_yacc.y" + { gsl_append(new_function_outro()); } + break; + + case 33: +#line 1296 "goomsl_yacc.y" + { yyval.namespace = gsl_leavenamespace(); } + break; + + case 34: +#line 1300 "goomsl_yacc.y" + { gsl_float_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } + break; + + case 35: +#line 1301 "goomsl_yacc.y" + { gsl_int_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } + break; + + case 36: +#line 1302 "goomsl_yacc.y" + { gsl_ptr_decl_local(yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } + break; + + case 37: +#line 1303 "goomsl_yacc.y" + { gsl_struct_decl_local(yyvsp[-3].strValue,yyvsp[-2].strValue); yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } + break; + + case 38: +#line 1304 "goomsl_yacc.y" + { yyval.nPtr = 0; } + break; + + case 39: +#line 1307 "goomsl_yacc.y" + { gsl_float_decl_local(yyvsp[0].strValue); } + break; + + case 40: +#line 1308 "goomsl_yacc.y" + { gsl_int_decl_local(yyvsp[0].strValue); } + break; + + case 41: +#line 1309 "goomsl_yacc.y" + { gsl_ptr_decl_local(yyvsp[0].strValue); } + break; + + case 42: +#line 1310 "goomsl_yacc.y" + { gsl_struct_decl_local(yyvsp[-1].strValue,yyvsp[0].strValue); } + break; + + case 43: +#line 1315 "goomsl_yacc.y" + { yyval.nPtr = yyvsp[-1].nPtr; } + break; + + case 44: +#line 1316 "goomsl_yacc.y" + { yyval.nPtr = yyvsp[-1].nPtr; } + break; + + case 45: +#line 1317 "goomsl_yacc.y" + { yyval.nPtr = new_if(yyvsp[-4].nPtr,yyvsp[0].nPtr); } + break; + + case 46: +#line 1318 "goomsl_yacc.y" + { yyval.nPtr = new_while(yyvsp[-4].nPtr,yyvsp[0].nPtr); } + break; + + case 47: +#line 1319 "goomsl_yacc.y" + { lastNode = yyvsp[-3].nPtr->unode.opr.op[1]; yyval.nPtr=yyvsp[-3].nPtr; } + break; + + case 48: +#line 1320 "goomsl_yacc.y" + { yyval.nPtr = yyvsp[0].nPtr; } + break; + + case 49: +#line 1321 "goomsl_yacc.y" + { yyval.nPtr = new_plus_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } + break; + + case 50: +#line 1322 "goomsl_yacc.y" + { yyval.nPtr = new_sub_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } + break; + + case 51: +#line 1323 "goomsl_yacc.y" + { yyval.nPtr = new_mul_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } + break; + + case 52: +#line 1324 "goomsl_yacc.y" + { yyval.nPtr = new_div_eq(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } + break; + + case 53: +#line 1325 "goomsl_yacc.y" + { yyval.nPtr = new_static_foreach(new_var(yyvsp[-4].strValue, currentGoomSL->num_lines), yyvsp[-2].nPtr, yyvsp[0].nPtr); } + break; + + case 54: +#line 1328 "goomsl_yacc.y" + { yyval.nPtr = yyvsp[-1].nPtr; } + break; + + case 55: +#line 1330 "goomsl_yacc.y" + { yyval.nPtr = new_var_list(new_var(yyvsp[0].strValue,currentGoomSL->num_lines), NULL); } + break; + + case 56: +#line 1331 "goomsl_yacc.y" + { yyval.nPtr = new_var_list(new_var(yyvsp[-1].strValue,currentGoomSL->num_lines), yyvsp[0].nPtr); } + break; + + case 57: +#line 1334 "goomsl_yacc.y" + { yyval.nPtr = new_set(new_var(yyvsp[-2].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); } + break; + + case 58: +#line 1336 "goomsl_yacc.y" + { yyval.nPtr = new_block(lastNode); lastNode = yyval.nPtr->unode.opr.op[0]; } + break; + + case 59: +#line 1339 "goomsl_yacc.y" + { yyval.nPtr = new_var(yyvsp[0].strValue,currentGoomSL->num_lines); } + break; + + case 60: +#line 1340 "goomsl_yacc.y" + { yyval.nPtr = yyvsp[0].nPtr; } + break; + + case 61: +#line 1341 "goomsl_yacc.y" + { yyval.nPtr = new_mul(yyvsp[-2].nPtr,yyvsp[0].nPtr); } + break; + + case 62: +#line 1342 "goomsl_yacc.y" + { yyval.nPtr = new_div(yyvsp[-2].nPtr,yyvsp[0].nPtr); } + break; + + case 63: +#line 1343 "goomsl_yacc.y" + { yyval.nPtr = new_add(yyvsp[-2].nPtr,yyvsp[0].nPtr); } + break; + + case 64: +#line 1344 "goomsl_yacc.y" + { yyval.nPtr = new_sub(yyvsp[-2].nPtr,yyvsp[0].nPtr); } + break; + + case 65: +#line 1345 "goomsl_yacc.y" + { yyval.nPtr = new_neg(yyvsp[0].nPtr); } + break; + + case 66: +#line 1346 "goomsl_yacc.y" + { yyval.nPtr = yyvsp[-1].nPtr; } + break; + + case 67: +#line 1347 "goomsl_yacc.y" + { yyval.nPtr = yyvsp[0].nPtr; } + break; + + case 68: +#line 1350 "goomsl_yacc.y" + { yyval.nPtr = new_equ(yyvsp[-2].nPtr,yyvsp[0].nPtr); } + break; + + case 69: +#line 1351 "goomsl_yacc.y" + { yyval.nPtr = new_low(yyvsp[-2].nPtr,yyvsp[0].nPtr); } + break; + + case 70: +#line 1352 "goomsl_yacc.y" + { yyval.nPtr = new_low(yyvsp[0].nPtr,yyvsp[-2].nPtr); } + break; + + case 71: +#line 1353 "goomsl_yacc.y" + { yyval.nPtr = new_not(new_low(yyvsp[-2].nPtr,yyvsp[0].nPtr)); } + break; + + case 72: +#line 1354 "goomsl_yacc.y" + { yyval.nPtr = new_not(new_low(yyvsp[0].nPtr,yyvsp[-2].nPtr)); } + break; + + case 73: +#line 1355 "goomsl_yacc.y" + { yyval.nPtr = new_not(new_equ(yyvsp[-2].nPtr,yyvsp[0].nPtr)); } + break; + + case 74: +#line 1356 "goomsl_yacc.y" + { yyval.nPtr = new_not(yyvsp[0].nPtr); } + break; + + case 75: +#line 1359 "goomsl_yacc.y" + { yyval.nPtr = new_constFloat(yyvsp[0].strValue,currentGoomSL->num_lines); } + break; + + case 76: +#line 1360 "goomsl_yacc.y" + { yyval.nPtr = new_constInt(yyvsp[0].strValue,currentGoomSL->num_lines); } + break; + + case 77: +#line 1361 "goomsl_yacc.y" + { yyval.nPtr = new_constPtr(yyvsp[0].strValue,currentGoomSL->num_lines); } + break; + + case 78: +#line 1366 "goomsl_yacc.y" + { yyval.nPtr = new_call(yyvsp[-2].strValue,NULL); } + break; + + case 79: +#line 1367 "goomsl_yacc.y" + { yyval.nPtr = new_call(yyvsp[-4].strValue,yyvsp[-2].nPtr); } + break; + + case 80: +#line 1368 "goomsl_yacc.y" + { yyval.nPtr = new_call(yyvsp[-3].strValue,NULL); } + break; + + case 81: +#line 1369 "goomsl_yacc.y" + { yyval.nPtr = new_call(yyvsp[-5].strValue,yyvsp[-3].nPtr); } + break; + + case 82: +#line 1373 "goomsl_yacc.y" + { yyval.nPtr = new_call_expr(yyvsp[-2].strValue,NULL); } + break; + + case 83: +#line 1374 "goomsl_yacc.y" + { yyval.nPtr = new_call_expr(yyvsp[-4].strValue,yyvsp[-2].nPtr); } + break; + + case 84: +#line 1377 "goomsl_yacc.y" + { yyval.nPtr = new_affec_list(yyvsp[-1].nPtr,yyvsp[0].nPtr); } + break; + + case 85: +#line 1378 "goomsl_yacc.y" + { yyval.nPtr = new_affec_list(yyvsp[0].nPtr,NULL); } + break; + + case 86: +#line 1380 "goomsl_yacc.y" + { + gsl_reenternamespace(yyvsp[-1].namespace); + yyval.nPtr = new_set(new_var(yyvsp[-3].strValue,currentGoomSL->num_lines),yyvsp[0].nPtr); + } + break; + + case 87: +#line 1384 "goomsl_yacc.y" + { + gsl_reenternamespace(yyvsp[-1].namespace); + yyval.nPtr = new_set(new_var("&this", currentGoomSL->num_lines),yyvsp[0].nPtr); + } + break; + + + } + +/* Line 999 of yacc.c. */ +#line 2792 "goomsl_yacc.c" + + yyvsp -= yylen; + yyssp -= yylen; + + + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (YYPACT_NINF < yyn && yyn < YYLAST) + { + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + char *yymsg; + int yyx, yycount; + + yycount = 0; + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + yysize += yystrlen (yytname[yyx]) + 15, yycount++; + yysize += yystrlen ("syntax error, unexpected ") + 1; + yysize += yystrlen (yytname[yytype]); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) + { + char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); + + if (yycount < 5) + { + yycount = 0; + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); + yyx++) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + const char *yyq = ! yycount ? ", expecting " : " or "; + yyp = yystpcpy (yyp, yyq); + yyp = yystpcpy (yyp, yytname[yyx]); + yycount++; + } + } + yyerror (yymsg); + YYSTACK_FREE (yymsg); + } + else + yyerror ("syntax error; also virtual memory exhausted"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror ("syntax error"); + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + /* Return failure if at end of input. */ + if (yychar == YYEOF) + { + /* Pop the error token. */ + YYPOPSTACK; + /* Pop the rest of the stack. */ + while (yyss < yyssp) + { + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[*yyssp], yyvsp); + YYPOPSTACK; + } + YYABORT; + } + + YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); + yydestruct (yytoken, &yylval); + yychar = YYEMPTY; + + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*----------------------------------------------------. +| yyerrlab1 -- error raised explicitly by an action. | +`----------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[yystate], yyvsp); + yyvsp--; + yystate = *--yyssp; + + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + YYDPRINTF ((stderr, "Shifting error token, ")); + + *++yyvsp = yylval; + + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + return yyresult; +} + + +#line 1396 "goomsl_yacc.y" + + + +void yyerror(char *str) +{ /* {{{ */ + fprintf(stderr, "ERROR: Line %d, %s\n", currentGoomSL->num_lines, str); + currentGoomSL->compilationOK = 0; + exit(1); +} /* }}} */ + + diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.h b/src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.h new file mode 100644 index 0000000000..fae0c010f6 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.h @@ -0,0 +1,104 @@ +/* A Bison parser, made by GNU Bison 1.875. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + LTYPE_INTEGER = 258, + LTYPE_FLOAT = 259, + LTYPE_VAR = 260, + LTYPE_PTR = 261, + PTR_TK = 262, + INT_TK = 263, + FLOAT_TK = 264, + DECLARE = 265, + EXTERNAL = 266, + WHILE = 267, + DO = 268, + NOT = 269, + PLUS_EQ = 270, + SUB_EQ = 271, + DIV_EQ = 272, + MUL_EQ = 273, + SUP_EQ = 274, + LOW_EQ = 275, + NOT_EQ = 276, + STRUCT = 277, + FOR = 278, + IN = 279 + }; +#endif +#define LTYPE_INTEGER 258 +#define LTYPE_FLOAT 259 +#define LTYPE_VAR 260 +#define LTYPE_PTR 261 +#define PTR_TK 262 +#define INT_TK 263 +#define FLOAT_TK 264 +#define DECLARE 265 +#define EXTERNAL 266 +#define WHILE 267 +#define DO 268 +#define NOT 269 +#define PLUS_EQ 270 +#define SUB_EQ 271 +#define DIV_EQ 272 +#define MUL_EQ 273 +#define SUP_EQ 274 +#define LOW_EQ 275 +#define NOT_EQ 276 +#define STRUCT 277 +#define FOR 278 +#define IN 279 + + + + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 1199 "goomsl_yacc.y" +typedef union YYSTYPE { + int intValue; + float floatValue; + char charValue; + char strValue[2048]; + NodeType *nPtr; + GoomHash *namespace; + GSL_Struct *gsl_struct; + GSL_StructField *gsl_struct_field; + } YYSTYPE; +/* Line 1240 of yacc.c. */ +#line 95 "goomsl_yacc.h" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + +extern YYSTYPE yylval; + + + diff --git a/src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.y b/src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.y new file mode 100644 index 0000000000..c424a50a6c --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/goomsl_yacc.y @@ -0,0 +1,1405 @@ +/** + * copyright 2004, Jean-Christophe Hoelt <jeko@ios-software.com> + * + * This program is released under the terms of the GNU Lesser General Public Licence. + */ +%{ + #include <stdio.h> + #include <stdlib.h> + #include <string.h> + #include "goomsl.h" + #include "goomsl_private.h" + +#define STRUCT_ALIGNMENT 16 +/* #define VERBOSE */ + + int yylex(void); + void yyerror(char *); + extern GoomSL *currentGoomSL; + + static NodeType *nodeNew(const char *str, int type, int line_number); + static NodeType *nodeClone(NodeType *node); + static void nodeFreeInternals(NodeType *node); + static void nodeFree(NodeType *node); + + static void commit_node(NodeType *node, int releaseIfTemp); + static void precommit_node(NodeType *node); + + static NodeType *new_constInt(const char *str, int line_number); + static NodeType *new_constFloat(const char *str, int line_number); + static NodeType *new_constPtr(const char *str, int line_number); + static NodeType *new_var(const char *str, int line_number); + static NodeType *new_nop(const char *str); + static NodeType *new_op(const char *str, int type, int nbOp); + + static int allocateLabel(); + static int allocateTemp(); + static void releaseTemp(int n); + static void releaseAllTemps(); + + static int is_tmp_expr(NodeType *node) { + if (node->str) { + return (!strncmp(node->str,"_i_tmp_",7)) + || (!strncmp(node->str,"_f_tmp_",7)) + || (!strncmp(node->str,"_p_tmp",7)); + } + return 0; + } + /* pre: is_tmp_expr(node); */ + static int get_tmp_id(NodeType *node) { return atoi((node->str)+5); } + + static int is_commutative_expr(int itype) + { /* {{{ */ + return (itype == INSTR_ADD) + || (itype == INSTR_MUL) + || (itype == INSTR_ISEQUAL); + } /* }}} */ + + static void GSL_PUT_LABEL(char *name, int line_number) + { /* {{{ */ +#ifdef VERBOSE + printf("label %s\n", name); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, line_number); + gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); + } /* }}} */ + static void GSL_PUT_JUMP(char *name, int line_number) + { /* {{{ */ +#ifdef VERBOSE + printf("jump %s\n", name); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "jump", INSTR_JUMP, 1, line_number); + gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); + } /* }}} */ + + static void GSL_PUT_JXXX(char *name, char *iname, int instr_id, int line_number) + { /* {{{ */ +#ifdef VERBOSE + printf("%s %s\n", iname, name); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, iname, instr_id, 1, line_number); + gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); + } /* }}} */ + static void GSL_PUT_JZERO(char *name,int line_number) + { /* {{{ */ + GSL_PUT_JXXX(name,"jzero.i",INSTR_JZERO,line_number); + } /* }}} */ + static void GSL_PUT_JNZERO(char *name, int line_number) + { /* {{{ */ + GSL_PUT_JXXX(name,"jnzero.i",INSTR_JNZERO,line_number); + } /* }}} */ + + /* Structures Management */ + +#define ALIGN_ADDR(_addr,_align) {\ + if (_align>1) {\ + int _dec = (_addr%_align);\ + if (_dec != 0) _addr += _align - _dec;\ + }} + + /* */ + void gsl_prepare_struct(GSL_Struct *s, int s_align, int i_align, int f_align) + { + int i; + int consumed = 0; + int iblk=0, fblk=0; + + s->iBlock[0].size = 0; + s->iBlock[0].data = 0; + s->fBlock[0].size = 0; + s->fBlock[0].data = 0; + + /* Prepare sub-struct and calculate space needed for their storage */ + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type < FIRST_RESERVED) + { + int j=0; + GSL_Struct *substruct = currentGoomSL->gsl_struct[s->fields[i]->type]; + consumed += sizeof(int); /* stocke le prefix */ + ALIGN_ADDR(consumed, s_align); + s->fields[i]->offsetInStruct = consumed; + gsl_prepare_struct(substruct, s_align, i_align, f_align); + for(j=0;substruct->iBlock[j].size>0;++j) { + s->iBlock[iblk].data = consumed + substruct->iBlock[j].data; + s->iBlock[iblk].size = substruct->iBlock[j].size; + iblk++; + } + for(j=0;substruct->fBlock[j].size>0;++j) { + s->fBlock[fblk].data = consumed + substruct->fBlock[j].data; + s->fBlock[fblk].size = substruct->fBlock[j].size; + fblk++; + } + consumed += substruct->size; + } + } + + /* Then prepare integers */ + ALIGN_ADDR(consumed, i_align); + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type == INSTR_INT) + { + if (s->iBlock[iblk].size == 0) { + s->iBlock[iblk].size = 1; + s->iBlock[iblk].data = consumed; + } else { + s->iBlock[iblk].size += 1; + } + s->fields[i]->offsetInStruct = consumed; + consumed += sizeof(int); + } + } + + iblk++; + s->iBlock[iblk].size = 0; + s->iBlock[iblk].data = 0; + + /* Then prepare floats */ + ALIGN_ADDR(consumed, f_align); + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type == INSTR_FLOAT) + { + if (s->fBlock[fblk].size == 0) { + s->fBlock[fblk].size = 1; + s->fBlock[fblk].data = consumed; + } else { + s->fBlock[fblk].size += 1; + } + s->fields[i]->offsetInStruct = consumed; + consumed += sizeof(int); + } + } + + fblk++; + s->fBlock[fblk].size = 0; + s->fBlock[fblk].data = 0; + + /* Finally prepare pointers */ + ALIGN_ADDR(consumed, i_align); + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type == INSTR_PTR) + { + s->fields[i]->offsetInStruct = consumed; + consumed += sizeof(int); + } + } + s->size = consumed; + } + + /* Returns the ID of a struct from its name */ + int gsl_get_struct_id(const char *name) /* {{{ */ + { + HashValue *ret = goom_hash_get(currentGoomSL->structIDS, name); + if (ret != NULL) return ret->i; + return -1; + } /* }}} */ + + /* Adds the definition of a struct */ + void gsl_add_struct(const char *name, GSL_Struct *gsl_struct) /* {{{ */ + { + /* Prepare the struct: ie calculate internal storage format */ + gsl_prepare_struct(gsl_struct, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT); + + /* If the struct does not already exists */ + if (gsl_get_struct_id(name) < 0) + { + /* adds it */ + int id = currentGoomSL->nbStructID++; + goom_hash_put_int(currentGoomSL->structIDS, name, id); + if (currentGoomSL->gsl_struct_size <= id) { + currentGoomSL->gsl_struct_size *= 2; + currentGoomSL->gsl_struct = (GSL_Struct**)realloc(currentGoomSL->gsl_struct, + sizeof(GSL_Struct*) * currentGoomSL->gsl_struct_size); + } + currentGoomSL->gsl_struct[id] = gsl_struct; + } + } /* }}} */ + + /* Creates a field for a struct */ + GSL_StructField *gsl_new_struct_field(const char *name, int type) + { + GSL_StructField *field = (GSL_StructField*)malloc(sizeof(GSL_StructField)); + strcpy(field->name, name); + field->type = type; + return field; + } + + /* Create as field for a struct which will be a struct itself */ + GSL_StructField *gsl_new_struct_field_struct(const char *name, const char *type) + { + GSL_StructField *field = gsl_new_struct_field(name, gsl_get_struct_id(type)); + if (field->type < 0) { + fprintf(stderr, "ERROR: Line %d, Unknown structure: '%s'\n", + currentGoomSL->num_lines, type); + exit(1); + } + return field; + } + + /* Creates a Struct */ + GSL_Struct *gsl_new_struct(GSL_StructField *field) + { + GSL_Struct *s = (GSL_Struct*)malloc(sizeof(GSL_Struct)); + s->nbFields = 1; + s->fields[0] = field; + return s; + } + + /* Adds a field to a struct */ + void gsl_add_struct_field(GSL_Struct *s, GSL_StructField *field) + { + s->fields[s->nbFields++] = field; + } + + int gsl_type_of_var(GoomHash *ns, const char *name) + { + char type_of[256]; + HashValue *hv; + sprintf(type_of, "__type_of_%s", name); + hv = goom_hash_get(ns, type_of); + if (hv != NULL) + return hv->i; + fprintf(stderr, "ERROR: Unknown variable type: '%s'\n", name); + return -1; + } + + static void gsl_declare_var(GoomHash *ns, const char *name, int type, void *space) + { + char type_of[256]; + if (name[0] == '@') { ns = currentGoomSL->vars; } + + if (space == NULL) { + switch (type) { + case INSTR_INT: + case INSTR_FLOAT: + case INSTR_PTR: + space = goom_heap_malloc_with_alignment(currentGoomSL->data_heap, + sizeof(int), sizeof(int)); + break; + case -1: + fprintf(stderr, "What the fuck!\n"); + exit(1); + default: /* On a un struct_id */ + space = goom_heap_malloc_with_alignment_prefixed(currentGoomSL->data_heap, + currentGoomSL->gsl_struct[type]->size, STRUCT_ALIGNMENT, sizeof(int)); + } + } + goom_hash_put_ptr(ns, name, (void*)space); + sprintf(type_of, "__type_of_%s", name); + goom_hash_put_int(ns, type_of, type); + + /* Ensuite le hack: on ajoute les champs en tant que variables. */ + if (type < FIRST_RESERVED) + { + int i; + GSL_Struct *gsl_struct = currentGoomSL->gsl_struct[type]; + ((int*)space)[-1] = type; /* stockage du type dans le prefixe de structure */ + for (i = 0; i < gsl_struct->nbFields; ++i) + { + char full_name[256]; + char *cspace = (char*)space + gsl_struct->fields[i]->offsetInStruct; + sprintf(full_name, "%s.%s", name, gsl_struct->fields[i]->name); + gsl_declare_var(ns, full_name, gsl_struct->fields[i]->type, cspace); + } + } + } + + /* Declare a variable which will be a struct */ + static void gsl_struct_decl(GoomHash *namespace, const char *struct_name, const char *name) + { + int struct_id = gsl_get_struct_id(struct_name); + gsl_declare_var(namespace, name, struct_id, NULL); + } + + static void gsl_float_decl_global(const char *name) + { + gsl_declare_var(currentGoomSL->vars, name, INSTR_FLOAT, NULL); + } + static void gsl_int_decl_global(const char *name) + { + gsl_declare_var(currentGoomSL->vars, name, INSTR_INT, NULL); + } + static void gsl_ptr_decl_global(const char *name) + { + gsl_declare_var(currentGoomSL->vars, name, INSTR_PTR, NULL); + } + static void gsl_struct_decl_global_from_id(const char *name, int id) + { + gsl_declare_var(currentGoomSL->vars, name, id, NULL); + } + + /* FLOAT */ + static void gsl_float_decl_local(const char *name) + { + gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_FLOAT, NULL); + } + /* INT */ + static void gsl_int_decl_local(const char *name) + { + gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_INT, NULL); + } + /* PTR */ + static void gsl_ptr_decl_local(const char *name) + { + gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_PTR, NULL); + } + /* STRUCT */ + static void gsl_struct_decl_local(const char *struct_name, const char *name) + { + gsl_struct_decl(currentGoomSL->namespaces[currentGoomSL->currentNS],struct_name,name); + } + + + static void commit_test2(NodeType *set,const char *type, int instr); + static NodeType *new_call(const char *name, NodeType *affect_list); + + /* SETTER */ + static NodeType *new_set(NodeType *lvalue, NodeType *expression) + { /* {{{ */ + NodeType *set = new_op("set", OPR_SET, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } /* }}} */ + static void commit_set(NodeType *set) + { /* {{{ */ + commit_test2(set,"set",INSTR_SET); + } /* }}} */ + + /* PLUS_EQ */ + static NodeType *new_plus_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("plus_eq", OPR_PLUS_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_plus_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("add %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "add", INSTR_ADD, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* SUB_EQ */ + static NodeType *new_sub_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("sub_eq", OPR_SUB_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_sub_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("sub %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "sub", INSTR_SUB, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* MUL_EQ */ + static NodeType *new_mul_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("mul_eq", OPR_MUL_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_mul_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("mul %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "mul", INSTR_MUL, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* DIV_EQ */ + static NodeType *new_div_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("div_eq", OPR_DIV_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_div_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("div %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "div", INSTR_DIV, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* commodity method for add, mult, ... */ + + static void precommit_expr(NodeType *expr, const char *type, int instr_id) + { /* {{{ */ + NodeType *tmp, *tmpcpy; + int toAdd; + + /* compute "left" and "right" */ + switch (expr->unode.opr.nbOp) { + case 2: + precommit_node(expr->unode.opr.op[1]); + case 1: + precommit_node(expr->unode.opr.op[0]); + } + + if (is_tmp_expr(expr->unode.opr.op[0])) { + tmp = expr->unode.opr.op[0]; + toAdd = 1; + } + else if (is_commutative_expr(instr_id) && (expr->unode.opr.nbOp==2) && is_tmp_expr(expr->unode.opr.op[1])) { + tmp = expr->unode.opr.op[1]; + toAdd = 0; + } + else { + char stmp[256]; + /* declare a temporary variable to store the result */ + if (expr->unode.opr.op[0]->type == CONST_INT_NODE) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (expr->unode.opr.op[0]->type == CONST_FLOAT_NODE) { + sprintf(stmp,"_f_tmp%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (expr->unode.opr.op[0]->type == CONST_PTR_NODE) { + sprintf(stmp,"_p_tmp%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + else { + int type = gsl_type_of_var(expr->unode.opr.op[0]->vnamespace, expr->unode.opr.op[0]->str); + if (type == INSTR_FLOAT) { + sprintf(stmp,"_f_tmp_%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (type == INSTR_PTR) { + sprintf(stmp,"_p_tmp_%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + else if (type == INSTR_INT) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (type == -1) { + fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", + expr->line_number, expr->unode.opr.op[0]->str); + exit(1); + } + else { /* type is a struct_id */ + sprintf(stmp,"_s_tmp_%i",allocateTemp()); + gsl_struct_decl_global_from_id(stmp,type); + } + } + tmp = new_var(stmp,expr->line_number); + + /* set the tmp to the value of "op1" */ + tmpcpy = nodeClone(tmp); + commit_node(new_set(tmp,expr->unode.opr.op[0]),0); + toAdd = 1; + + tmp = tmpcpy; + } + + /* add op2 to tmp */ +#ifdef VERBOSE + if (expr->unode.opr.nbOp == 2) + printf("%s %s %s\n", type, tmp->str, expr->unode.opr.op[toAdd]->str); + else + printf("%s %s\n", type, tmp->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr_id, expr->unode.opr.nbOp, expr->line_number); + tmpcpy = nodeClone(tmp); + commit_node(tmp,0); + if (expr->unode.opr.nbOp == 2) { + commit_node(expr->unode.opr.op[toAdd],1); + } + + /* redefine the ADD node now as the computed variable */ + nodeFreeInternals(expr); + *expr = *tmpcpy; + free(tmpcpy); + } /* }}} */ + + static NodeType *new_expr1(const char *name, int id, NodeType *expr1) + { /* {{{ */ + NodeType *add = new_op(name, id, 1); + add->unode.opr.op[0] = expr1; + return add; + } /* }}} */ + + static NodeType *new_expr2(const char *name, int id, NodeType *expr1, NodeType *expr2) + { /* {{{ */ + NodeType *add = new_op(name, id, 2); + add->unode.opr.op[0] = expr1; + add->unode.opr.op[1] = expr2; + return add; + } /* }}} */ + + /* ADD */ + static NodeType *new_add(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("add", OPR_ADD, expr1, expr2); + } + static void precommit_add(NodeType *add) { + precommit_expr(add,"add",INSTR_ADD); + } /* }}} */ + + /* SUB */ + static NodeType *new_sub(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("sub", OPR_SUB, expr1, expr2); + } + static void precommit_sub(NodeType *sub) { + precommit_expr(sub,"sub",INSTR_SUB); + } /* }}} */ + + /* NEG */ + static NodeType *new_neg(NodeType *expr) { /* {{{ */ + NodeType *zeroConst = NULL; + if (expr->type == CONST_INT_NODE) + zeroConst = new_constInt("0", currentGoomSL->num_lines); + else if (expr->type == CONST_FLOAT_NODE) + zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); + else if (expr->type == CONST_PTR_NODE) { + fprintf(stderr, "ERROR: Line %d, Could not negate const pointer.\n", + currentGoomSL->num_lines); + exit(1); + } + else { + int type = gsl_type_of_var(expr->vnamespace, expr->str); + if (type == INSTR_FLOAT) + zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); + else if (type == INSTR_PTR) { + fprintf(stderr, "ERROR: Line %d, Could not negate pointer.\n", + currentGoomSL->num_lines); + exit(1); + } + else if (type == INSTR_INT) + zeroConst = new_constInt("0", currentGoomSL->num_lines); + else if (type == -1) { + fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", + expr->line_number, expr->unode.opr.op[0]->str); + exit(1); + } + else { /* type is a struct_id */ + fprintf(stderr, "ERROR: Line %d, Could not negate struct '%s'\n", + expr->line_number, expr->str); + exit(1); + } + } + return new_expr2("sub", OPR_SUB, zeroConst, expr); + } + /* }}} */ + + /* MUL */ + static NodeType *new_mul(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("mul", OPR_MUL, expr1, expr2); + } + static void precommit_mul(NodeType *mul) { + precommit_expr(mul,"mul",INSTR_MUL); + } /* }}} */ + + /* DIV */ + static NodeType *new_div(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("div", OPR_DIV, expr1, expr2); + } + static void precommit_div(NodeType *mul) { + precommit_expr(mul,"div",INSTR_DIV); + } /* }}} */ + + /* CALL EXPRESSION */ + static NodeType *new_call_expr(const char *name, NodeType *affect_list) { /* {{{ */ + NodeType *call = new_call(name,affect_list); + NodeType *node = new_expr1(name, OPR_CALL_EXPR, call); + node->vnamespace = gsl_find_namespace(name); + if (node->vnamespace == NULL) + fprintf(stderr, "ERROR: Line %d, No return type for: '%s'\n", currentGoomSL->num_lines, name); + return node; + } + static void precommit_call_expr(NodeType *call) { + char stmp[256]; + NodeType *tmp,*tmpcpy; + int type = gsl_type_of_var(call->vnamespace, call->str); + if (type == INSTR_FLOAT) { + sprintf(stmp,"_f_tmp_%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (type == INSTR_PTR) { + sprintf(stmp,"_p_tmp_%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + else if (type == INSTR_INT) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (type == -1) { + fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", + call->line_number, call->str); + exit(1); + } + else { /* type is a struct_id */ + sprintf(stmp,"_s_tmp_%i",allocateTemp()); + gsl_struct_decl_global_from_id(stmp,type); + } + tmp = new_var(stmp,call->line_number); + commit_node(call->unode.opr.op[0],0); + tmpcpy = nodeClone(tmp); + commit_node(new_set(tmp,new_var(call->str,call->line_number)),0); + + nodeFreeInternals(call); + *call = *tmpcpy; + free(tmpcpy); + } /* }}} */ + + static void commit_test2(NodeType *set,const char *type, int instr) + { /* {{{ */ + NodeType *tmp; + char stmp[256]; + precommit_node(set->unode.opr.op[0]); + precommit_node(set->unode.opr.op[1]); + tmp = set->unode.opr.op[0]; + + stmp[0] = 0; + if (set->unode.opr.op[0]->type == CONST_INT_NODE) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (set->unode.opr.op[0]->type == CONST_FLOAT_NODE) { + sprintf(stmp,"_f_tmp%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (set->unode.opr.op[0]->type == CONST_PTR_NODE) { + sprintf(stmp,"_p_tmp%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + if (stmp[0]) { + NodeType *tmpcpy; + tmp = new_var(stmp, set->line_number); + tmpcpy = nodeClone(tmp); + commit_node(new_set(tmp,set->unode.opr.op[0]),0); + tmp = tmpcpy; + } + +#ifdef VERBOSE + printf("%s %s %s\n", type, tmp->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr, 2, set->line_number); + commit_node(tmp,instr!=INSTR_SET); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* NOT */ + static NodeType *new_not(NodeType *expr1) { /* {{{ */ + return new_expr1("not", OPR_NOT, expr1); + } + static void commit_not(NodeType *set) + { + commit_node(set->unode.opr.op[0],0); +#ifdef VERBOSE + printf("not\n"); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "not", INSTR_NOT, 1, set->line_number); + gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); + } /* }}} */ + + /* EQU */ + static NodeType *new_equ(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("isequal", OPR_EQU, expr1, expr2); + } + static void commit_equ(NodeType *mul) { + commit_test2(mul,"isequal",INSTR_ISEQUAL); + } /* }}} */ + + /* INF */ + static NodeType *new_low(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("islower", OPR_LOW, expr1, expr2); + } + static void commit_low(NodeType *mul) { + commit_test2(mul,"islower",INSTR_ISLOWER); + } /* }}} */ + + /* WHILE */ + static NodeType *new_while(NodeType *expression, NodeType *instr) { /* {{{ */ + NodeType *node = new_op("while", OPR_WHILE, 2); + node->unode.opr.op[0] = expression; + node->unode.opr.op[1] = instr; + return node; + } + + static void commit_while(NodeType *node) + { + int lbl = allocateLabel(); + char start_while[1024], test_while[1024]; + sprintf(start_while, "|start_while_%d|", lbl); + sprintf(test_while, "|test_while_%d|", lbl); + + GSL_PUT_JUMP(test_while,node->line_number); + GSL_PUT_LABEL(start_while,node->line_number); + + /* code */ + commit_node(node->unode.opr.op[1],0); + + GSL_PUT_LABEL(test_while,node->line_number); + commit_node(node->unode.opr.op[0],0); + GSL_PUT_JNZERO(start_while,node->line_number); + } /* }}} */ + + /* FOR EACH */ + static NodeType *new_static_foreach(NodeType *var, NodeType *var_list, NodeType *instr) { /* {{{ */ + NodeType *node = new_op("for", OPR_FOREACH, 3); + node->unode.opr.op[0] = var; + node->unode.opr.op[1] = var_list; + node->unode.opr.op[2] = instr; + node->line_number = currentGoomSL->num_lines; + return node; + } + static void commit_foreach(NodeType *node) + { + NodeType *cur = node->unode.opr.op[1]; + char tmp_func[256], tmp_loop[256]; + int lbl = allocateLabel(); + sprintf(tmp_func, "|foreach_func_%d|", lbl); + sprintf(tmp_loop, "|foreach_loop_%d|", lbl); + + GSL_PUT_JUMP(tmp_loop, node->line_number); + GSL_PUT_LABEL(tmp_func, node->line_number); + + precommit_node(node->unode.opr.op[2]); + commit_node(node->unode.opr.op[2], 0); + + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +#ifdef VERBOSE + printf("ret\n"); +#endif + + GSL_PUT_LABEL(tmp_loop, node->line_number); + + while (cur != NULL) + { + NodeType *x, *var; + + /* 1: x=var */ + x = nodeClone(node->unode.opr.op[0]); + var = nodeClone(cur->unode.opr.op[0]); + commit_node(new_set(x, var),0); + + /* 2: instr */ + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, tmp_func, TYPE_LABEL); +#ifdef VERBOSE + printf("call %s\n", tmp_func); +#endif + + /* 3: var=x */ + x = nodeClone(node->unode.opr.op[0]); + var = cur->unode.opr.op[0]; + commit_node(new_set(var, x),0); + cur = cur->unode.opr.op[1]; + } + nodeFree(node->unode.opr.op[0]); + } /* }}} */ + + /* IF */ + static NodeType *new_if(NodeType *expression, NodeType *instr) { /* {{{ */ + NodeType *node = new_op("if", OPR_IF, 2); + node->unode.opr.op[0] = expression; + node->unode.opr.op[1] = instr; + return node; + } + static void commit_if(NodeType *node) { + + char slab[1024]; + sprintf(slab, "|eif%d|", allocateLabel()); + commit_node(node->unode.opr.op[0],0); + GSL_PUT_JZERO(slab,node->line_number); + /* code */ + commit_node(node->unode.opr.op[1],0); + GSL_PUT_LABEL(slab,node->line_number); + } /* }}} */ + + /* BLOCK */ + static NodeType *new_block(NodeType *lastNode) { /* {{{ */ + NodeType *blk = new_op("block", OPR_BLOCK, 2); + blk->unode.opr.op[0] = new_nop("start_of_block"); + blk->unode.opr.op[1] = lastNode; + return blk; + } + static void commit_block(NodeType *node) { + commit_node(node->unode.opr.op[0]->unode.opr.next,0); + } /* }}} */ + + /* FUNCTION INTRO */ + static NodeType *new_function_intro(const char *name) { /* {{{ */ + char stmp[256]; + if (strlen(name) < 200) { + sprintf(stmp, "|__func_%s|", name); + } + return new_op(stmp, OPR_FUNC_INTRO, 0); + } + static void commit_function_intro(NodeType *node) { + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +#ifdef VERBOSE + printf("label %s\n", node->str); +#endif + } /* }}} */ + + /* FUNCTION OUTRO */ + static NodeType *new_function_outro() { /* {{{ */ + return new_op("ret", OPR_FUNC_OUTRO, 0); + } + static void commit_function_outro(NodeType *node) { + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); + releaseAllTemps(); +#ifdef VERBOSE + printf("ret\n"); +#endif + } /* }}} */ + + /* AFFECTATION LIST */ + static NodeType *new_affec_list(NodeType *set, NodeType *next) /* {{{ */ + { + NodeType *node = new_op("affect_list", OPR_AFFECT_LIST, 2); + node->unode.opr.op[0] = set; + node->unode.opr.op[1] = next; + return node; + } + static NodeType *new_affect_list_after(NodeType *affect_list) + { + NodeType *ret = NULL; + NodeType *cur = affect_list; + while(cur != NULL) { + NodeType *set = cur->unode.opr.op[0]; + NodeType *next = cur->unode.opr.op[1]; + NodeType *lvalue = set->unode.opr.op[0]; + NodeType *expression = set->unode.opr.op[1]; + if ((lvalue->str[0] == '&') && (expression->type == VAR_NODE)) { + NodeType *nset = new_set(nodeClone(expression), nodeClone(lvalue)); + ret = new_affec_list(nset, ret); + } + cur = next; + } + return ret; + } + static void commit_affect_list(NodeType *node) + { + NodeType *cur = node; + while(cur != NULL) { + NodeType *set = cur->unode.opr.op[0]; + precommit_node(set->unode.opr.op[0]); + precommit_node(set->unode.opr.op[1]); + cur = cur->unode.opr.op[1]; + } + cur = node; + while(cur != NULL) { + NodeType *set = cur->unode.opr.op[0]; + commit_node(set,0); + cur = cur->unode.opr.op[1]; + } + } /* }}} */ + + /* VAR LIST */ + static NodeType *new_var_list(NodeType *var, NodeType *next) /* {{{ */ + { + NodeType *node = new_op("var_list", OPR_VAR_LIST, 2); + node->unode.opr.op[0] = var; + node->unode.opr.op[1] = next; + return node; + } + static void commit_var_list(NodeType *node) + { + } /* }}} */ + + /* FUNCTION CALL */ + static NodeType *new_call(const char *name, NodeType *affect_list) { /* {{{ */ + HashValue *fval; + fval = goom_hash_get(currentGoomSL->functions, name); + if (!fval) { + gsl_declare_task(name); + fval = goom_hash_get(currentGoomSL->functions, name); + } + if (!fval) { + fprintf(stderr, "ERROR: Line %d, Could not find function %s\n", currentGoomSL->num_lines, name); + exit(1); + return NULL; + } + else { + ExternalFunctionStruct *gef = (ExternalFunctionStruct*)fval->ptr; + if (gef->is_extern) { + NodeType *node = new_op(name, OPR_EXT_CALL, 1); + node->unode.opr.op[0] = affect_list; + return node; + } + else { + NodeType *node; + char stmp[256]; + if (strlen(name) < 200) { + sprintf(stmp, "|__func_%s|", name); + } + node = new_op(stmp, OPR_CALL, 1); + node->unode.opr.op[0] = affect_list; + return node; + } + } + } + static void commit_ext_call(NodeType *node) { + NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); + commit_node(node->unode.opr.op[0],0); + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "extcall", INSTR_EXT_CALL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); +#ifdef VERBOSE + printf("extcall %s\n", node->str); +#endif + commit_node(alafter,0); + } + static void commit_call(NodeType *node) { + NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); + commit_node(node->unode.opr.op[0],0); + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +#ifdef VERBOSE + printf("call %s\n", node->str); +#endif + commit_node(alafter,0); + } /* }}} */ + + /** **/ + + static NodeType *rootNode = 0; /* TODO: reinitialiser a chaque compilation. */ + static NodeType *lastNode = 0; + static NodeType *gsl_append(NodeType *curNode) { + if (curNode == 0) return 0; /* {{{ */ + if (lastNode) + lastNode->unode.opr.next = curNode; + lastNode = curNode; + while(lastNode->unode.opr.next) lastNode = lastNode->unode.opr.next; + if (rootNode == 0) + rootNode = curNode; + return curNode; + } /* }}} */ + +#if 1 + int allocateTemp() { + return allocateLabel(); + } + void releaseAllTemps() {} + void releaseTemp(int n) {} +#else + static int nbTemp = 0; + static int *tempArray = 0; + static int tempArraySize = 0; + int allocateTemp() { /* TODO: allocateITemp, allocateFTemp */ + int i = 0; /* {{{ */ + if (tempArray == 0) { + tempArraySize = 256; + tempArray = (int*)malloc(tempArraySize * sizeof(int)); + } + while (1) { + int j; + for (j=0;j<nbTemp;++j) { + if (tempArray[j] == i) break; + } + if (j == nbTemp) { + if (nbTemp == tempArraySize) { + tempArraySize *= 2; + tempArray = (int*)realloc(tempArray,tempArraySize * sizeof(int)); + } + tempArray[nbTemp++] = i; + return i; + } + i++; + } + } /* }}} */ + void releaseAllTemps() { + nbTemp = 0; /* {{{ */ + } /* }}} */ + void releaseTemp(int n) { + int j; /* {{{ */ + for (j=0;j<nbTemp;++j) { + if (tempArray[j] == n) { + tempArray[j] = tempArray[--nbTemp]; + break; + } + } + } /* }}} */ +#endif + + static int lastLabel = 0; + int allocateLabel() { + return ++lastLabel; /* {{{ */ + } /* }}} */ + + void gsl_commit_compilation() + { /* {{{ */ + commit_node(rootNode,0); + rootNode = 0; + lastNode = 0; + } /* }}} */ + + void precommit_node(NodeType *node) + { /* {{{ */ + /* do here stuff for expression.. for exemple */ + if (node->type == OPR_NODE) + switch(node->unode.opr.type) { + case OPR_ADD: precommit_add(node); break; + case OPR_SUB: precommit_sub(node); break; + case OPR_MUL: precommit_mul(node); break; + case OPR_DIV: precommit_div(node); break; + case OPR_CALL_EXPR: precommit_call_expr(node); break; + } + } /* }}} */ + + void commit_node(NodeType *node, int releaseIfTmp) + { /* {{{ */ + if (node == 0) return; + + switch(node->type) { + case OPR_NODE: + switch(node->unode.opr.type) { + case OPR_SET: commit_set(node); break; + case OPR_PLUS_EQ: commit_plus_eq(node); break; + case OPR_SUB_EQ: commit_sub_eq(node); break; + case OPR_MUL_EQ: commit_mul_eq(node); break; + case OPR_DIV_EQ: commit_div_eq(node); break; + case OPR_IF: commit_if(node); break; + case OPR_WHILE: commit_while(node); break; + case OPR_BLOCK: commit_block(node); break; + case OPR_FUNC_INTRO: commit_function_intro(node); break; + case OPR_FUNC_OUTRO: commit_function_outro(node); break; + case OPR_CALL: commit_call(node); break; + case OPR_EXT_CALL: commit_ext_call(node); break; + case OPR_EQU: commit_equ(node); break; + case OPR_LOW: commit_low(node); break; + case OPR_NOT: commit_not(node); break; + case OPR_AFFECT_LIST: commit_affect_list(node); break; + case OPR_FOREACH: commit_foreach(node); break; + case OPR_VAR_LIST: commit_var_list(node); break; +#ifdef VERBOSE + case EMPTY_NODE: printf("NOP\n"); break; +#endif + } + + commit_node(node->unode.opr.next,0); /* recursive for the moment, maybe better to do something iterative? */ + break; + + case VAR_NODE: gsl_instr_set_namespace(currentGoomSL->instr, node->vnamespace); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); break; + case CONST_INT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_INTEGER); break; + case CONST_FLOAT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_FLOAT); break; + case CONST_PTR_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_PTR); break; + } + if (releaseIfTmp && is_tmp_expr(node)) + releaseTemp(get_tmp_id(node)); + + nodeFree(node); + } /* }}} */ + + NodeType *nodeNew(const char *str, int type, int line_number) { + NodeType *node = (NodeType*)malloc(sizeof(NodeType)); /* {{{ */ + node->type = type; + node->str = (char*)malloc(strlen(str)+1); + node->vnamespace = NULL; + node->line_number = line_number; + strcpy(node->str, str); + return node; + } /* }}} */ + static NodeType *nodeClone(NodeType *node) { + NodeType *ret = nodeNew(node->str, node->type, node->line_number); /* {{{ */ + ret->vnamespace = node->vnamespace; + ret->unode = node->unode; + return ret; + } /* }}} */ + + void nodeFreeInternals(NodeType *node) { + free(node->str); /* {{{ */ + } /* }}} */ + + void nodeFree(NodeType *node) { + nodeFreeInternals(node); /* {{{ */ + free(node); + } /* }}} */ + + NodeType *new_constInt(const char *str, int line_number) { + NodeType *node = nodeNew(str, CONST_INT_NODE, line_number); /* {{{ */ + node->unode.constInt.val = atoi(str); + return node; + } /* }}} */ + + NodeType *new_constPtr(const char *str, int line_number) { + NodeType *node = nodeNew(str, CONST_PTR_NODE, line_number); /* {{{ */ + node->unode.constPtr.id = strtol(str,NULL,0); + return node; + } /* }}} */ + + NodeType *new_constFloat(const char *str, int line_number) { + NodeType *node = nodeNew(str, CONST_FLOAT_NODE, line_number); /* {{{ */ + node->unode.constFloat.val = atof(str); + return node; + } /* }}} */ + + NodeType *new_var(const char *str, int line_number) { + NodeType *node = nodeNew(str, VAR_NODE, line_number); /* {{{ */ + node->vnamespace = gsl_find_namespace(str); + if (node->vnamespace == 0) { + fprintf(stderr, "ERROR: Line %d, Variable not found: '%s'\n", line_number, str); + exit(1); + } + return node; + } /* }}} */ + + NodeType *new_nop(const char *str) { + NodeType *node = new_op(str, EMPTY_NODE, 0); /* {{{ */ + return node; + } /* }}} */ + + NodeType *new_op(const char *str, int type, int nbOp) { + int i; /* {{{ */ + NodeType *node = nodeNew(str, OPR_NODE, currentGoomSL->num_lines); + node->unode.opr.next = 0; + node->unode.opr.type = type; + node->unode.opr.nbOp = nbOp; + for (i=0;i<nbOp;++i) node->unode.opr.op[i] = 0; + return node; + } /* }}} */ + + + void gsl_declare_global_variable(int type, char *name) { + switch(type){ + case -1: break; + case FLOAT_TK:gsl_float_decl_global(name);break; + case INT_TK: gsl_int_decl_global(name);break; + case PTR_TK: gsl_ptr_decl_global(name);break; + default: + { + int id = type - 1000; + gsl_struct_decl_global_from_id(name,id); + } + } + } + +%} + +%union { + int intValue; + float floatValue; + char charValue; + char strValue[2048]; + NodeType *nPtr; + GoomHash *namespace; + GSL_Struct *gsl_struct; + GSL_StructField *gsl_struct_field; + }; + +%token <strValue> LTYPE_INTEGER +%token <strValue> LTYPE_FLOAT +%token <strValue> LTYPE_VAR +%token <strValue> LTYPE_PTR + +%token PTR_TK INT_TK FLOAT_TK DECLARE EXTERNAL WHILE DO NOT PLUS_EQ SUB_EQ DIV_EQ MUL_EQ SUP_EQ LOW_EQ NOT_EQ STRUCT FOR IN + +%type <intValue> return_type +%type <nPtr> expression constValue instruction test func_call func_call_expression +%type <nPtr> start_block affectation_list affectation_in_list affectation declaration +%type <nPtr> var_list_content var_list +%type <strValue> task_name ext_task_name +%type <namespace> leave_namespace +%type <gsl_struct> struct_members +%type <gsl_struct_field> struct_member +%left '\n' +%left PLUS_EQ SUB_EQ MUL_EQ DIV_EQ +%left NOT +%left '=' '<' '>' +%left '+' '-' +%left '/' '*' + +%% + +/* -------------- Global architechture of a GSL program ------------*/ + +gsl: gsl_code function_outro gsl_def_functions ; + +gsl_code: gsl_code instruction { gsl_append($2); } + | gsl_code EXTERNAL '<' ext_task_name '>' return_type '\n' leave_namespace { gsl_declare_global_variable($6,$4); } + | gsl_code EXTERNAL '<' ext_task_name ':' arglist '>' return_type '\n' leave_namespace { gsl_declare_global_variable($8,$4); } + | gsl_code DECLARE '<' task_name '>' return_type '\n' leave_namespace { gsl_declare_global_variable($6,$4); } + | gsl_code DECLARE '<' task_name ':' arglist '>' return_type '\n' leave_namespace { gsl_declare_global_variable($8,$4); } + | gsl_code struct_declaration + | gsl_code '\n' + | + ; + +/* ------------- Declaration of a structure ------------ */ + +struct_declaration: STRUCT '<' LTYPE_VAR ':' struct_members '>' '\n' { gsl_add_struct($3, $5); } + ; + +struct_members: opt_nl struct_member { $$ = gsl_new_struct($2); } + | struct_members ',' opt_nl struct_member { $$ = $1; gsl_add_struct_field($1, $4); } + ; + +struct_member: INT_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_INT); } + | FLOAT_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_FLOAT); } + | PTR_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_PTR); } + | LTYPE_VAR LTYPE_VAR { $$ = gsl_new_struct_field_struct($2, $1); } + ; + +/* ------------- Fonction declarations -------------- */ + +ext_task_name: LTYPE_VAR { gsl_declare_external_task($1); gsl_enternamespace($1); strcpy($$,$1); } + ; +task_name: LTYPE_VAR { gsl_declare_task($1); gsl_enternamespace($1); strcpy($$,$1); strcpy($$,$1); } + ; + +return_type: { $$=-1; } + | ':' INT_TK { $$=INT_TK; } + | ':' FLOAT_TK { $$=FLOAT_TK; } + | ':' PTR_TK { $$=PTR_TK; } + | ':' LTYPE_VAR { $$= 1000 + gsl_get_struct_id($2); } + ; + +arglist: empty_declaration + | empty_declaration ',' arglist + ; + +/* ------------- Fonction definition -------------- */ + +gsl_def_functions: gsl_def_functions function + | + ; + +function: function_intro gsl_code function_outro { gsl_leavenamespace(); } + +function_intro: '<' task_name '>' return_type '\n' { gsl_append(new_function_intro($2)); + gsl_declare_global_variable($4,$2); } + | '<' task_name ':' arglist '>' return_type '\n' { gsl_append(new_function_intro($2)); + gsl_declare_global_variable($6,$2); } + ; +function_outro: { gsl_append(new_function_outro()); } ; + +leave_namespace: { $$ = gsl_leavenamespace(); }; + +/* ------------ Variable declaration ---------------- */ + +declaration: FLOAT_TK LTYPE_VAR '=' expression { gsl_float_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } + | INT_TK LTYPE_VAR '=' expression { gsl_int_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } + | PTR_TK LTYPE_VAR '=' expression { gsl_ptr_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } + | LTYPE_VAR LTYPE_VAR '=' expression { gsl_struct_decl_local($1,$2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } + | empty_declaration { $$ = 0; } + ; + +empty_declaration: FLOAT_TK LTYPE_VAR { gsl_float_decl_local($2); } + | INT_TK LTYPE_VAR { gsl_int_decl_local($2); } + | PTR_TK LTYPE_VAR { gsl_ptr_decl_local($2); } + | LTYPE_VAR LTYPE_VAR { gsl_struct_decl_local($1,$2); } + ; + +/* -------------- Instructions and Expressions ------------------ */ + +instruction: affectation '\n' { $$ = $1; } + | declaration '\n' { $$ = $1; } + | '(' test ')' '?' opt_nl instruction { $$ = new_if($2,$6); } + | WHILE test opt_nl DO opt_nl instruction { $$ = new_while($2,$6); } + | '{' '\n' start_block gsl_code '}' '\n' { lastNode = $3->unode.opr.op[1]; $$=$3; } + | func_call { $$ = $1; } + | LTYPE_VAR PLUS_EQ expression { $$ = new_plus_eq(new_var($1,currentGoomSL->num_lines),$3); } + | LTYPE_VAR SUB_EQ expression { $$ = new_sub_eq(new_var($1,currentGoomSL->num_lines),$3); } + | LTYPE_VAR MUL_EQ expression { $$ = new_mul_eq(new_var($1,currentGoomSL->num_lines),$3); } + | LTYPE_VAR DIV_EQ expression { $$ = new_div_eq(new_var($1,currentGoomSL->num_lines),$3); } + | FOR LTYPE_VAR IN var_list DO instruction { $$ = new_static_foreach(new_var($2, currentGoomSL->num_lines), $4, $6); } + ; + +var_list: '(' var_list_content ')' { $$ = $2; } + ; +var_list_content: LTYPE_VAR { $$ = new_var_list(new_var($1,currentGoomSL->num_lines), NULL); } + | LTYPE_VAR var_list_content { $$ = new_var_list(new_var($1,currentGoomSL->num_lines), $2); } + ; + +affectation: LTYPE_VAR '=' expression { $$ = new_set(new_var($1,currentGoomSL->num_lines),$3); } ; + +start_block: { $$ = new_block(lastNode); lastNode = $$->unode.opr.op[0]; } + ; + +expression: LTYPE_VAR { $$ = new_var($1,currentGoomSL->num_lines); } + | constValue { $$ = $1; } + | expression '*' expression { $$ = new_mul($1,$3); } + | expression '/' expression { $$ = new_div($1,$3); } + | expression '+' expression { $$ = new_add($1,$3); } + | expression '-' expression { $$ = new_sub($1,$3); } + | '-' expression { $$ = new_neg($2); } + | '(' expression ')' { $$ = $2; } + | func_call_expression { $$ = $1; } + ; + +test: expression '=' expression { $$ = new_equ($1,$3); } + | expression '<' expression { $$ = new_low($1,$3); } + | expression '>' expression { $$ = new_low($3,$1); } + | expression SUP_EQ expression { $$ = new_not(new_low($1,$3)); } + | expression LOW_EQ expression { $$ = new_not(new_low($3,$1)); } + | expression NOT_EQ expression { $$ = new_not(new_equ($1,$3)); } + | NOT test { $$ = new_not($2); } + ; + +constValue: LTYPE_FLOAT { $$ = new_constFloat($1,currentGoomSL->num_lines); } + | LTYPE_INTEGER { $$ = new_constInt($1,currentGoomSL->num_lines); } + | LTYPE_PTR { $$ = new_constPtr($1,currentGoomSL->num_lines); } + ; + +/* ---------------- Function Calls ------------------ */ + +func_call: task_name '\n' leave_namespace { $$ = new_call($1,NULL); } + | task_name ':' affectation_list '\n' leave_namespace { $$ = new_call($1,$3); } + | '[' task_name ']' '\n' leave_namespace { $$ = new_call($2,NULL); } + | '[' task_name ':' affectation_list ']' '\n' leave_namespace { $$ = new_call($2,$4); } + ; + +func_call_expression: + '[' task_name leave_namespace ']' { $$ = new_call_expr($2,NULL); } + | '[' task_name ':' affectation_list ']' leave_namespace { $$ = new_call_expr($2,$4); } + ; + +affectation_list: affectation_in_list affectation_list { $$ = new_affec_list($1,$2); } + | affectation_in_list { $$ = new_affec_list($1,NULL); } + +affectation_in_list: LTYPE_VAR '=' leave_namespace expression { + gsl_reenternamespace($3); + $$ = new_set(new_var($1,currentGoomSL->num_lines),$4); + } + | ':' leave_namespace expression { + gsl_reenternamespace($2); + $$ = new_set(new_var("&this", currentGoomSL->num_lines),$3); + } + ; + + +/* ------------ Misc ---------- */ + +opt_nl: '\n' | ; + + +%% + + +void yyerror(char *str) +{ /* {{{ */ + fprintf(stderr, "ERROR: Line %d, %s\n", currentGoomSL->num_lines, str); + currentGoomSL->compilationOK = 0; + exit(1); +} /* }}} */ + diff --git a/src/visualizations/Goom/goom2k4-0/src/graphic.c b/src/visualizations/Goom/goom2k4-0/src/graphic.c new file mode 100644 index 0000000000..2ee71a6dd0 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/graphic.c @@ -0,0 +1,10 @@ +#include "goom_graphic.h" + +const Color BLACK = { 0, 0, 0 }; +const Color WHITE = { 0xff, 0xff, 0xff }; +const Color RED = { 0xff, 0x05, 0x05 }; +const Color GREEN = { 0x05, 0xff, 0x05 }; +const Color BLUE = { 0x05, 0x05, 0xff }; +const Color YELLOW = { 0xff, 0xff, 0x33 }; +const Color ORANGE = { 0xff, 0xcc, 0x05 }; +const Color VIOLET = { 0x55, 0x05, 0xff }; diff --git a/src/visualizations/Goom/goom2k4-0/src/ifs.c b/src/visualizations/Goom/goom2k4-0/src/ifs.c new file mode 100644 index 0000000000..968535e3b0 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/ifs.c @@ -0,0 +1,763 @@ +/* + * ifs.c --- modified iterated functions system for goom. + */ + +/*- + * Copyright (c) 1997 by Massimino Pascal <Pascal.Massimon@ens.fr> + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation. + * + * This file is provided AS IS with no warranties of any kind. The author + * shall have no liability with respect to the infringement of copyrights, + * trade secrets or any patents by this file or any part thereof. In no + * event will the author be liable for any lost revenue or profits or + * other special, indirect and consequential damages. + * + * If this mode is weird and you have an old MetroX server, it is buggy. + * There is a free SuSE-enhanced MetroX X server that is fine. + * + * When shown ifs, Diana Rose (4 years old) said, "It looks like dancing." + * + * Revision History: + * 13-Dec-2003: Added some goom specific stuffs (to make ifs a VisualFX). + * 11-Apr-2002: jeko@ios-software.com: Make ifs.c system-indendant. (ifs.h added) + * 01-Nov-2000: Allocation checks + * 10-May-1997: jwz@jwz.org: turned into a standalone program. + * Made it render into an offscreen bitmap and then copy + * that onto the screen, to reduce flicker. + */ + +/* #ifdef STANDALONE */ + +#include <math.h> +#include <stdlib.h> +#include <stdio.h> + +#include "goom_config.h" + +#ifdef HAVE_MMX +#include "mmx.h" +#endif + +#include "goom_graphic.h" +#include "ifs.h" +#include "goom_tools.h" + +typedef struct _ifsPoint +{ + gint32 x, y; +} +IFSPoint; + + +#define MODE_ifs + +#define PROGCLASS "IFS" + +#define HACK_INIT init_ifs +#define HACK_DRAW draw_ifs + +#define ifs_opts xlockmore_opts + +#define DEFAULTS "*delay: 20000 \n" \ +"*ncolors: 100 \n" + +#define SMOOTH_COLORS + +#define LRAND() ((long) (goom_random(goomInfo->gRandom) & 0x7fffffff)) +#define NRAND(n) ((int) (LRAND() % (n))) + +#if RAND_MAX < 0x10000 +#define MAXRAND (((float)(RAND_MAX<16)+((float)RAND_MAX)+1.0f)/127.0f) +#else +#define MAXRAND (2147483648.0/127.0) /* unsigned 1<<31 / 127.0 (cf goom_tools) as a float */ +#endif + +/*****************************************************/ + +typedef float DBL; +typedef int F_PT; + +/* typedef float F_PT; */ + +/*****************************************************/ + +#define FIX 12 +#define UNIT ( 1<<FIX ) +#define MAX_SIMI 6 + +#define MAX_DEPTH_2 10 +#define MAX_DEPTH_3 6 +#define MAX_DEPTH_4 4 +#define MAX_DEPTH_5 2 + +/* PREVIOUS VALUE +#define MAX_SIMI 6 + + * settings for a PC 120Mhz... * +#define MAX_DEPTH_2 10 +#define MAX_DEPTH_3 6 +#define MAX_DEPTH_4 4 +#define MAX_DEPTH_5 3 +*/ + +#define DBL_To_F_PT(x) (F_PT)( (DBL)(UNIT)*(x) ) + +typedef struct Similitude_Struct SIMI; +typedef struct Fractal_Struct FRACTAL; + +struct Similitude_Struct +{ + + DBL c_x, c_y; + DBL r, r2, A, A2; + F_PT Ct, St, Ct2, St2; + F_PT Cx, Cy; + F_PT R, R2; +}; + + +struct Fractal_Struct +{ + + int Nb_Simi; + SIMI Components[5 * MAX_SIMI]; + int Depth, Col; + int Count, Speed; + int Width, Height, Lx, Ly; + DBL r_mean, dr_mean, dr2_mean; + int Cur_Pt, Max_Pt; + + IFSPoint *Buffer1, *Buffer2; +}; + +typedef struct _IFS_DATA { + FRACTAL *Root; + FRACTAL *Cur_F; + + /* Used by the Trace recursive method */ + IFSPoint *Buf; + int Cur_Pt; + int initalized; +} IfsData; + + +/*****************************************************/ + +static DBL +Gauss_Rand (PluginInfo *goomInfo, DBL c, DBL A, DBL S) +{ + DBL y; + + y = (DBL) LRAND () / MAXRAND; + y = A * (1.0 - exp (-y * y * S)) / (1.0 - exp (-S)); + if (NRAND (2)) + return (c + y); + return (c - y); +} + +static DBL +Half_Gauss_Rand (PluginInfo *goomInfo, DBL c, DBL A, DBL S) +{ + DBL y; + + y = (DBL) LRAND () / MAXRAND; + y = A * (1.0 - exp (-y * y * S)) / (1.0 - exp (-S)); + return (c + y); +} + +static void +Random_Simis (PluginInfo *goomInfo, FRACTAL * F, SIMI * Cur, int i) +{ + while (i--) { + Cur->c_x = Gauss_Rand (goomInfo, 0.0, .8, 4.0); + Cur->c_y = Gauss_Rand (goomInfo, 0.0, .8, 4.0); + Cur->r = Gauss_Rand (goomInfo, F->r_mean, F->dr_mean, 3.0); + Cur->r2 = Half_Gauss_Rand (goomInfo, 0.0, F->dr2_mean, 2.0); + Cur->A = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (M_PI / 180.0); + Cur->A2 = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (M_PI / 180.0); + Cur++; + } +} + +static void +free_ifs_buffers (FRACTAL * Fractal) +{ + if (Fractal->Buffer1 != NULL) { + (void) free ((void *) Fractal->Buffer1); + Fractal->Buffer1 = (IFSPoint *) NULL; + } + if (Fractal->Buffer2 != NULL) { + (void) free ((void *) Fractal->Buffer2); + Fractal->Buffer2 = (IFSPoint *) NULL; + } +} + + +static void +free_ifs (FRACTAL * Fractal) +{ + free_ifs_buffers (Fractal); +} + +/***************************************************************/ + +static void +init_ifs (PluginInfo *goomInfo, IfsData *data) +{ + int i; + FRACTAL *Fractal; + int width = goomInfo->screen.width; + int height = goomInfo->screen.height; + + if (data->Root == NULL) { + data->Root = (FRACTAL *) malloc (sizeof (FRACTAL)); + if (data->Root == NULL) + return; + data->Root->Buffer1 = (IFSPoint *) NULL; + data->Root->Buffer2 = (IFSPoint *) NULL; + } + Fractal = data->Root; + + free_ifs_buffers (Fractal); + + i = (NRAND (4)) + 2; /* Number of centers */ + switch (i) { + case 3: + Fractal->Depth = MAX_DEPTH_3; + Fractal->r_mean = .6; + Fractal->dr_mean = .4; + Fractal->dr2_mean = .3; + break; + + case 4: + Fractal->Depth = MAX_DEPTH_4; + Fractal->r_mean = .5; + Fractal->dr_mean = .4; + Fractal->dr2_mean = .3; + break; + + case 5: + Fractal->Depth = MAX_DEPTH_5; + Fractal->r_mean = .5; + Fractal->dr_mean = .4; + Fractal->dr2_mean = .3; + break; + + default: + case 2: + Fractal->Depth = MAX_DEPTH_2; + Fractal->r_mean = .7; + Fractal->dr_mean = .3; + Fractal->dr2_mean = .4; + break; + } + Fractal->Nb_Simi = i; + Fractal->Max_Pt = Fractal->Nb_Simi - 1; + for (i = 0; i <= Fractal->Depth + 2; ++i) + Fractal->Max_Pt *= Fractal->Nb_Simi; + + if ((Fractal->Buffer1 = (IFSPoint *) calloc (Fractal->Max_Pt, + sizeof (IFSPoint))) == NULL) { + free_ifs (Fractal); + return; + } + if ((Fractal->Buffer2 = (IFSPoint *) calloc (Fractal->Max_Pt, + sizeof (IFSPoint))) == NULL) { + free_ifs (Fractal); + return; + } + + Fractal->Speed = 6; + Fractal->Width = width; /* modif by JeKo */ + Fractal->Height = height; /* modif by JeKo */ + Fractal->Cur_Pt = 0; + Fractal->Count = 0; + Fractal->Lx = (Fractal->Width - 1) / 2; + Fractal->Ly = (Fractal->Height - 1) / 2; + Fractal->Col = rand () % (width * height); /* modif by JeKo */ + + Random_Simis (goomInfo, Fractal, Fractal->Components, 5 * MAX_SIMI); +} + + +/***************************************************************/ + +static inline void +Transform (SIMI * Simi, F_PT xo, F_PT yo, F_PT * x, F_PT * y) +{ + F_PT xx, yy; + + xo = xo - Simi->Cx; + xo = (xo * Simi->R) >> FIX; /* / UNIT; */ + yo = yo - Simi->Cy; + yo = (yo * Simi->R) >> FIX; /* / UNIT; */ + + xx = xo - Simi->Cx; + xx = (xx * Simi->R2) >> FIX; /* / UNIT; */ + yy = -yo - Simi->Cy; + yy = (yy * Simi->R2) >> FIX; /* / UNIT; */ + + *x = + ((xo * Simi->Ct - yo * Simi->St + xx * Simi->Ct2 - yy * Simi->St2) + >> FIX /* / UNIT */ ) + Simi->Cx; + *y = + ((xo * Simi->St + yo * Simi->Ct + xx * Simi->St2 + yy * Simi->Ct2) + >> FIX /* / UNIT */ ) + Simi->Cy; +} + +/***************************************************************/ + +static void +Trace (FRACTAL * F, F_PT xo, F_PT yo, IfsData *data) +{ + F_PT x, y, i; + SIMI *Cur; + + Cur = data->Cur_F->Components; + for (i = data->Cur_F->Nb_Simi; i; --i, Cur++) { + Transform (Cur, xo, yo, &x, &y); + + data->Buf->x = F->Lx + ((x * F->Lx) >> (FIX+1) /* /(UNIT*2) */ ); + data->Buf->y = F->Ly - ((y * F->Ly) >> (FIX+1) /* /(UNIT*2) */ ); + data->Buf++; + + data->Cur_Pt++; + + if (F->Depth && ((x - xo) >> 4) && ((y - yo) >> 4)) { + F->Depth--; + Trace (F, x, y, data); + F->Depth++; + } + } +} + +static void +Draw_Fractal (IfsData *data) +{ + FRACTAL *F = data->Root; + int i, j; + F_PT x, y, xo, yo; + SIMI *Cur, *Simi; + + for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { + Cur->Cx = DBL_To_F_PT (Cur->c_x); + Cur->Cy = DBL_To_F_PT (Cur->c_y); + + Cur->Ct = DBL_To_F_PT (cos (Cur->A)); + Cur->St = DBL_To_F_PT (sin (Cur->A)); + Cur->Ct2 = DBL_To_F_PT (cos (Cur->A2)); + Cur->St2 = DBL_To_F_PT (sin (Cur->A2)); + + Cur->R = DBL_To_F_PT (Cur->r); + Cur->R2 = DBL_To_F_PT (Cur->r2); + } + + + data->Cur_Pt = 0; + data->Cur_F = F; + data->Buf = F->Buffer2; + for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { + xo = Cur->Cx; + yo = Cur->Cy; + for (Simi = F->Components, j = F->Nb_Simi; j; --j, Simi++) { + if (Simi == Cur) + continue; + Transform (Simi, xo, yo, &x, &y); + Trace (F, x, y, data); + } + } + + /* Erase previous */ + + F->Cur_Pt = data->Cur_Pt; + data->Buf = F->Buffer1; + F->Buffer1 = F->Buffer2; + F->Buffer2 = data->Buf; +} + + +static IFSPoint * +draw_ifs (PluginInfo *goomInfo, int *nbpt, IfsData *data) +{ + int i; + DBL u, uu, v, vv, u0, u1, u2, u3; + SIMI *S, *S1, *S2, *S3, *S4; + FRACTAL *F; + + if (data->Root == NULL) + return NULL; + F = data->Root; + if (F->Buffer1 == NULL) + return NULL; + + u = (DBL) (F->Count) * (DBL) (F->Speed) / 1000.0; + uu = u * u; + v = 1.0 - u; + vv = v * v; + u0 = vv * v; + u1 = 3.0 * vv * u; + u2 = 3.0 * v * uu; + u3 = u * uu; + + S = F->Components; + S1 = S + F->Nb_Simi; + S2 = S1 + F->Nb_Simi; + S3 = S2 + F->Nb_Simi; + S4 = S3 + F->Nb_Simi; + + for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { + S->c_x = u0 * S1->c_x + u1 * S2->c_x + u2 * S3->c_x + u3 * S4->c_x; + S->c_y = u0 * S1->c_y + u1 * S2->c_y + u2 * S3->c_y + u3 * S4->c_y; + S->r = u0 * S1->r + u1 * S2->r + u2 * S3->r + u3 * S4->r; + S->r2 = u0 * S1->r2 + u1 * S2->r2 + u2 * S3->r2 + u3 * S4->r2; + S->A = u0 * S1->A + u1 * S2->A + u2 * S3->A + u3 * S4->A; + S->A2 = u0 * S1->A2 + u1 * S2->A2 + u2 * S3->A2 + u3 * S4->A2; + } + + Draw_Fractal (data); + + if (F->Count >= 1000 / F->Speed) { + S = F->Components; + S1 = S + F->Nb_Simi; + S2 = S1 + F->Nb_Simi; + S3 = S2 + F->Nb_Simi; + S4 = S3 + F->Nb_Simi; + + for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { + S2->c_x = 2.0 * S4->c_x - S3->c_x; + S2->c_y = 2.0 * S4->c_y - S3->c_y; + S2->r = 2.0 * S4->r - S3->r; + S2->r2 = 2.0 * S4->r2 - S3->r2; + S2->A = 2.0 * S4->A - S3->A; + S2->A2 = 2.0 * S4->A2 - S3->A2; + + *S1 = *S4; + } + Random_Simis (goomInfo, F, F->Components + 3 * F->Nb_Simi, F->Nb_Simi); + + Random_Simis (goomInfo, F, F->Components + 4 * F->Nb_Simi, F->Nb_Simi); + + F->Count = 0; + } + else + F->Count++; + + F->Col++; + + (*nbpt) = data->Cur_Pt; + return F->Buffer2; +} + + +/***************************************************************/ + +static void release_ifs (IfsData *data) +{ + if (data->Root != NULL) { + free_ifs (data->Root); + (void) free ((void *) data->Root); + data->Root = (FRACTAL *) NULL; + } +} + +#define RAND() goom_random(goomInfo->gRandom) + +static void ifs_update (PluginInfo *goomInfo, Pixel * data, Pixel * back, int increment, IfsData *fx_data) +{ + static int couleur = 0xc0c0c0c0; + static int v[4] = { 2, 4, 3, 2 }; + static int col[4] = { 2, 4, 3, 2 }; + +#define MOD_MER 0 +#define MOD_FEU 1 +#define MOD_MERVER 2 + static int mode = MOD_MERVER; + static int justChanged = 0; + static int cycle = 0; + int cycle10; + + int nbpt; + IFSPoint *points; + int i; + + int couleursl = couleur; + int width = goomInfo->screen.width; + int height = goomInfo->screen.height; + + cycle++; + if (cycle >= 80) + cycle = 0; + + if (cycle < 40) + cycle10 = cycle / 10; + else + cycle10 = 7 - cycle / 10; + + { + unsigned char *tmp = (unsigned char *) &couleursl; + + for (i = 0; i < 4; i++) { + *tmp = (*tmp) >> cycle10; + tmp++; + } + } + + points = draw_ifs (goomInfo, &nbpt, fx_data); + nbpt--; + +#ifdef HAVE_MMX + movd_m2r (couleursl, mm1); + punpckldq_r2r (mm1, mm1); + for (i = 0; i < nbpt; i += increment) { + int x = points[i].x; + int y = points[i].y; + + if ((x < width) && (y < height) && (x > 0) && (y > 0)) { + int pos = x + (y * width); + movd_m2r (back[pos], mm0); + paddusb_r2r (mm1, mm0); + movd_r2m (mm0, data[pos]); + } + } + emms();/*__asm__ __volatile__ ("emms");*/ +#else + for (i = 0; i < nbpt; i += increment) { + int x = (int) points[i].x & 0x7fffffff; + int y = (int) points[i].y & 0x7fffffff; + + if ((x < width) && (y < height)) { + int pos = x + (int) (y * width); + int tra = 0, i = 0; + unsigned char *bra = (unsigned char *) &back[pos]; + unsigned char *dra = (unsigned char *) &data[pos]; + unsigned char *cra = (unsigned char *) &couleursl; + + for (; i < 4; i++) { + tra = *cra; + tra += *bra; + if (tra > 255) + tra = 255; + *dra = tra; + ++dra; + ++cra; + ++bra; + } + } + } +#endif /*MMX*/ + justChanged--; + + col[ALPHA] = couleur >> (ALPHA * 8) & 0xff; + col[BLEU] = couleur >> (BLEU * 8) & 0xff; + col[VERT] = couleur >> (VERT * 8) & 0xff; + col[ROUGE] = couleur >> (ROUGE * 8) & 0xff; + + if (mode == MOD_MER) { + col[BLEU] += v[BLEU]; + if (col[BLEU] > 255) { + col[BLEU] = 255; + v[BLEU] = -(RAND() % 4) - 1; + } + if (col[BLEU] < 32) { + col[BLEU] = 32; + v[BLEU] = (RAND() % 4) + 1; + } + + col[VERT] += v[VERT]; + if (col[VERT] > 200) { + col[VERT] = 200; + v[VERT] = -(RAND() % 3) - 2; + } + if (col[VERT] > col[BLEU]) { + col[VERT] = col[BLEU]; + v[VERT] = v[BLEU]; + } + if (col[VERT] < 32) { + col[VERT] = 32; + v[VERT] = (RAND() % 3) + 2; + } + + col[ROUGE] += v[ROUGE]; + if (col[ROUGE] > 64) { + col[ROUGE] = 64; + v[ROUGE] = -(RAND () % 4) - 1; + } + if (col[ROUGE] < 0) { + col[ROUGE] = 0; + v[ROUGE] = (RAND () % 4) + 1; + } + + col[ALPHA] += v[ALPHA]; + if (col[ALPHA] > 0) { + col[ALPHA] = 0; + v[ALPHA] = -(RAND () % 4) - 1; + } + if (col[ALPHA] < 0) { + col[ALPHA] = 0; + v[ALPHA] = (RAND () % 4) + 1; + } + + if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40) + && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64) + && (RAND () % 20 == 0)) && (justChanged < 0)) { + mode = RAND () % 3 ? MOD_FEU : MOD_MERVER; + justChanged = 250; + } + } + else if (mode == MOD_MERVER) { + col[BLEU] += v[BLEU]; + if (col[BLEU] > 128) { + col[BLEU] = 128; + v[BLEU] = -(RAND () % 4) - 1; + } + if (col[BLEU] < 16) { + col[BLEU] = 16; + v[BLEU] = (RAND () % 4) + 1; + } + + col[VERT] += v[VERT]; + if (col[VERT] > 200) { + col[VERT] = 200; + v[VERT] = -(RAND () % 3) - 2; + } + if (col[VERT] > col[ALPHA]) { + col[VERT] = col[ALPHA]; + v[VERT] = v[ALPHA]; + } + if (col[VERT] < 32) { + col[VERT] = 32; + v[VERT] = (RAND () % 3) + 2; + } + + col[ROUGE] += v[ROUGE]; + if (col[ROUGE] > 128) { + col[ROUGE] = 128; + v[ROUGE] = -(RAND () % 4) - 1; + } + if (col[ROUGE] < 0) { + col[ROUGE] = 0; + v[ROUGE] = (RAND () % 4) + 1; + } + + col[ALPHA] += v[ALPHA]; + if (col[ALPHA] > 255) { + col[ALPHA] = 255; + v[ALPHA] = -(RAND () % 4) - 1; + } + if (col[ALPHA] < 0) { + col[ALPHA] = 0; + v[ALPHA] = (RAND () % 4) + 1; + } + + if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40) + && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64) + && (RAND () % 20 == 0)) && (justChanged < 0)) { + mode = RAND () % 3 ? MOD_FEU : MOD_MER; + justChanged = 250; + } + } + else if (mode == MOD_FEU) { + + col[BLEU] += v[BLEU]; + if (col[BLEU] > 64) { + col[BLEU] = 64; + v[BLEU] = -(RAND () % 4) - 1; + } + if (col[BLEU] < 0) { + col[BLEU] = 0; + v[BLEU] = (RAND () % 4) + 1; + } + + col[VERT] += v[VERT]; + if (col[VERT] > 200) { + col[VERT] = 200; + v[VERT] = -(RAND () % 3) - 2; + } + if (col[VERT] > col[ROUGE] + 20) { + col[VERT] = col[ROUGE] + 20; + v[VERT] = -(RAND () % 3) - 2; + v[ROUGE] = (RAND () % 4) + 1; + v[BLEU] = (RAND () % 4) + 1; + } + if (col[VERT] < 0) { + col[VERT] = 0; + v[VERT] = (RAND () % 3) + 2; + } + + col[ROUGE] += v[ROUGE]; + if (col[ROUGE] > 255) { + col[ROUGE] = 255; + v[ROUGE] = -(RAND () % 4) - 1; + } + if (col[ROUGE] > col[VERT] + 40) { + col[ROUGE] = col[VERT] + 40; + v[ROUGE] = -(RAND () % 4) - 1; + } + if (col[ROUGE] < 0) { + col[ROUGE] = 0; + v[ROUGE] = (RAND () % 4) + 1; + } + + col[ALPHA] += v[ALPHA]; + if (col[ALPHA] > 0) { + col[ALPHA] = 0; + v[ALPHA] = -(RAND () % 4) - 1; + } + if (col[ALPHA] < 0) { + col[ALPHA] = 0; + v[ALPHA] = (RAND () % 4) + 1; + } + + if (((col[ROUGE] < 64) && (col[VERT] > 32) && (col[VERT] < col[BLEU]) + && (col[BLEU] > 32) + && (RAND () % 20 == 0)) && (justChanged < 0)) { + mode = RAND () % 2 ? MOD_MER : MOD_MERVER; + justChanged = 250; + } + } + + couleur = (col[ALPHA] << (ALPHA * 8)) + | (col[BLEU] << (BLEU * 8)) + | (col[VERT] << (VERT * 8)) + | (col[ROUGE] << (ROUGE * 8)); +} + +/** VISUAL_FX WRAPPER FOR IFS */ + +static void ifs_vfx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo) { + + IfsData *data = (IfsData*)_this->fx_data; + if (!data->initalized) { + data->initalized = 1; + init_ifs(goomInfo, data); + } + ifs_update (goomInfo, dest, src, goomInfo->update.ifs_incr, data); + /*TODO: trouver meilleur soluce pour increment (mettre le code de gestion de l'ifs dans ce fichier: ifs_vfx_apply) */ +} + +static void ifs_vfx_init(VisualFX *_this, PluginInfo *info) { + + IfsData *data = (IfsData*)malloc(sizeof(IfsData)); + data->Root = (FRACTAL*)NULL; + data->initalized = 0; + _this->fx_data = data; +} + +static void ifs_vfx_free(VisualFX *_this) { + IfsData *data = (IfsData*)_this->fx_data; + release_ifs(data); + free(data); +} + +VisualFX ifs_visualfx_create(void) { + VisualFX vfx; + vfx.init = ifs_vfx_init; + vfx.free = ifs_vfx_free; + vfx.apply = ifs_vfx_apply; + return vfx; +} diff --git a/src/visualizations/Goom/goom2k4-0/src/ifs.h b/src/visualizations/Goom/goom2k4-0/src/ifs.h new file mode 100644 index 0000000000..fab0426683 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/ifs.h @@ -0,0 +1,27 @@ +/* + * File created 11 april 2002 by JeKo <jeko@free.fr> + */ + +#ifndef IFS_H +#define IFS_H + +#include "goom_config.h" +#include "goom_graphic.h" +#include "goom_plugin_info.h" +#include "goom_visual_fx.h" + +VisualFX ifs_visualfx_create(void); + +/* init ifs for a (width)x(height) output. * / +void init_ifs (PluginInfo *goomInfo, int width, int height); + +/ * draw an ifs on the buffer (which size is width * height) + increment means that we draw 1/increment of the ifs's points * / +void ifs_update (PluginInfo *goomInfo, Pixel * buffer, Pixel * back, int width, int height, int increment); + +/ * free all ifs's data. * / +void release_ifs (void); +*/ + + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/jitc_test.c b/src/visualizations/Goom/goom2k4-0/src/jitc_test.c new file mode 100644 index 0000000000..cab03e82f7 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/jitc_test.c @@ -0,0 +1,38 @@ +#include "jitc_x86.h" +#include <stdio.h> + +int main(int c, char **v) +{ + int i; + int j; + JitcX86Env *jitc = jitc_x86_env_new(0xffff); + JitcFunc func = jitc_prepare_func(jitc); + + jitc_add(jitc, "mov edx, $d", 0xffffffff); + jitc_add(jitc, "mov eax, $d", 40); + jitc_add(jitc, "mov ebx, $d", 2); + jitc_add(jitc, "idiv ebx"); + jitc_add(jitc, "mov eax, [$d]", 0xdeadbeaf); + + jitc_add(jitc, "sal edx, $d", 7); + jitc_add(jitc, "imul ecx"); + jitc_add(jitc, "idiv ecx"); + jitc_add(jitc, "imul $d[ecx]", 2); + jitc_add(jitc, "imul ecx, [ecx]"); + jitc_add(jitc, "mov ecx, $d", (char*)(&i)-12); + jitc_add(jitc, "dec $d[ecx]", 2); + jitc_add(jitc, "add ecx, $d", 12); + jitc_add(jitc, "dec [ecx]"); + jitc_add(jitc, "dec ecx"); + + JITC_FLD_pIMM32(jitc,&i); + JITC_FSTP_pIMM32(jitc,&j); + + jitc_validate_func(jitc); + func(); + + printf("i = 0x%08x\n", i); + + jitc_x86_delete(jitc); + return 0; +} diff --git a/src/visualizations/Goom/goom2k4-0/src/jitc_x86.c b/src/visualizations/Goom/goom2k4-0/src/jitc_x86.c new file mode 100644 index 0000000000..21213b8932 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/jitc_x86.c @@ -0,0 +1,530 @@ +#include "jitc_x86.h" + +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> + +#define PARAM_INT 1 +#define PARAM_FLOAT 2 +#define PARAM_REG 3 +#define PARAM_dispREG 4 +#define PARAM_DISP32 5 +#define PARAM_LABEL 6 +#define PARAM_NONE 666 + +typedef struct { + int id; + int i; + double f; + int reg; + int disp; + char label[256]; +} IParam; + +struct { + char *name; + int reg; +} RegsName[] = { + {"eax",EAX}, {"ebx",EBX}, {"ecx",ECX}, {"edx",EDX}, + {"edi",EDI}, {"esi",ESI}, {"ebp",EBP}, {"esp",ESP}, + {"st0",0}, {"st1",1}, {"st2",2}, {"st3",3}, + {"st4",4}, {"st5",5}, {"st6",6}, {"st7",7}, + {"mm0",0}, {"mm1",1}, {"mm2",2}, {"mm3",3}, + {"mm4",4}, {"mm5",5}, {"mm6",6}, {"mm7",7}, {NULL,0} +}; + +void modrm(JitcX86Env *jitc, int opcode, IParam *iparam) +{ + int dest = 0; + int src = 1; + int direction = 0x0; + unsigned int byte = 666; + unsigned int int32 = 0; + unsigned int need32 = 0; + + if ((iparam[0].id == PARAM_REG) && (iparam[1].id != PARAM_REG)) { + dest = 1; + src = 0; + direction = 0x02; + } + + if (iparam[src].id != PARAM_REG) { + fprintf(stderr, "JITC_x86: Invalid Instruction Parameters: %d %d.\n", iparam[0].id, iparam[1].id); + exit(1); + } + + if (iparam[dest].id == PARAM_REG) { + byte = ((int)JITC_MOD_REG_REG << 6) | (iparam[src].reg << 3) | (iparam[0].reg); + } + + else if (iparam[dest].id == PARAM_dispREG) + { + if (iparam[dest].disp == 0) + byte = ((int)JITC_MOD_pREG_REG << 6) | (iparam[src].reg << 3) | (iparam[dest].reg); + } + + else if (iparam[dest].id == PARAM_DISP32) + { + byte = ((int)JITC_MOD_pREG_REG << 6) | (iparam[src].reg << 3) | JITC_RM_DISP32; + need32 = 1; + int32 = iparam[dest].disp; + } + + if (byte == 666) { + fprintf(stderr, "JITC_x86: Invalid Instruction Parameters: %d %d.\n", iparam[0].id, iparam[1].id); + exit(1); + } + else { + if (opcode < 0x100) + JITC_ADD_UCHAR(jitc, opcode + direction); + else { + JITC_ADD_UCHAR(jitc, (opcode>>8)&0xff); + JITC_ADD_UCHAR(jitc, (opcode&0xff)/* + direction*/); + } + JITC_ADD_UCHAR(jitc, byte); + if (need32) + JITC_ADD_UINT(jitc, int32); + } +} + +static void imul_like_modrm_1param(JitcX86Env *jitc, int opcode, int digit, IParam *iparam) +{ + if (iparam[0].id == PARAM_REG) + { + JITC_ADD_UCHAR(jitc, opcode); + JITC_MODRM(jitc, 0x03, digit, iparam[0].reg); + return; + } + if (iparam[0].id == PARAM_dispREG) { + JITC_ADD_UCHAR(jitc, opcode); + if (iparam[0].disp == 0) + { + JITC_MODRM(jitc, 0x00, digit, iparam[0].reg); + } + else if ((iparam[0].disp & 0xff) == iparam[0].disp) + { + JITC_MODRM(jitc, 0x01, digit, iparam[0].reg); + JITC_ADD_UCHAR(jitc, iparam[0].disp); + } + else + { + JITC_MODRM(jitc, 0x02, digit, iparam[0].reg); + JITC_ADD_UINT(jitc, iparam[0].disp); + } + return; + } + if (iparam[0].id == PARAM_DISP32) { + JITC_ADD_UCHAR(jitc, opcode); + JITC_MODRM(jitc, JITC_MOD_pREG_REG, digit, JITC_RM_DISP32); + JITC_ADD_UINT(jitc, iparam[0].disp); + return; + } +} + +/* 1 byte encoded opcode including register... imm32 parameter */ +#define INSTR_1bReg_IMM32(opcode,dest,src) { \ + JITC_ADD_UCHAR(jitc, opcode + iparam[dest].reg); \ + JITC_ADD_UINT (jitc, (int)iparam[src].i); } + +typedef struct { + char *name; + int opcode; + int opcode_reg_int; + int digit_reg_int; + int opcode_eax_int; +} AddLikeInstr; + +static AddLikeInstr addLike[] = { + { "add", 0x01, 0x81, 0x00, 0x05 }, + { "and", 0x21, 0x81, 0x04, 0x25 }, + { "or", 0x0B, 0x81, 0x01, 0x0D }, + { "cmp", 0x39, 0x81, 0x07, 0x3D }, + { "imul", 0x0FAF, 0x69, 0x00, 0x10000 }, + { "sub", 0x29, 0x81, 0x05, 0X2D }, + { NULL, -1, -1, -1, -1 } +}; + +int checkAddLike(JitcX86Env *jitc, char *op, IParam *iparam, int nbParams) +{ + int i; + for (i=0;addLike[i].name;++i) + { + if (strcmp(op,addLike[i].name) == 0) + { + if ((iparam[0].id == PARAM_REG) && (iparam[1].id == PARAM_INT)) { + if ((iparam[0].reg == EAX) && (addLike[i].opcode_eax_int != 0x10000)) { + JITC_ADD_UCHAR(jitc, addLike[i].opcode_eax_int); + JITC_ADD_UINT(jitc, iparam[1].i); + return 1; + } + else { + JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); + JITC_MODRM(jitc, 0x03, addLike[i].digit_reg_int, iparam[0].reg); + JITC_ADD_UINT(jitc, iparam[1].i); + return 1; + } + } + else if ((iparam[0].id == PARAM_dispREG) && (iparam[1].id == PARAM_INT)) { + JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); + if ((iparam[0].disp & 0xff) == iparam[0].disp) + { + JITC_MODRM(jitc, 0x01, addLike[i].digit_reg_int, iparam[0].reg); + JITC_ADD_UCHAR(jitc, iparam[0].disp); + } + else + { + JITC_MODRM(jitc, 0x00, addLike[i].digit_reg_int, iparam[0].reg); + JITC_ADD_UINT(jitc, iparam[0].disp); + } + JITC_ADD_UINT(jitc, iparam[1].i); + return 1; + } + else if ((iparam[0].id == PARAM_DISP32) && (iparam[1].id == PARAM_INT)) { + JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); + JITC_MODRM(jitc, 0x00, addLike[i].digit_reg_int, 0x05); + JITC_ADD_UINT(jitc, iparam[0].disp); + JITC_ADD_UINT(jitc, iparam[1].i); + return 1; + } + else { + modrm(jitc, addLike[i].opcode, iparam); + return 1; + } + } + } + return 0; +} + +/** + * Check all kind of known instruction... perform special optimisations.. + */ +static void jitc_add_op(JitcX86Env *jitc, char *op, IParam *iparam, int nbParams) +{ + /* MOV */ + if (strcmp(op,"mov") == 0) + { + if ((iparam[0].id == PARAM_REG) && (iparam[1].id == PARAM_INT)) { + INSTR_1bReg_IMM32(0xb8,0,1); + } + else if ((iparam[0].id == PARAM_DISP32) && (iparam[1].id == PARAM_INT)) { + JITC_ADD_UCHAR(jitc, 0xc7); + JITC_MODRM(jitc, 0x00, 0x00, 0x05); + JITC_ADD_UINT(jitc, iparam[0].disp); + JITC_ADD_UINT(jitc, iparam[1].i); + } + else + modrm(jitc, 0x89, iparam); + return; + } + +#define IMUL_LIKE(_OP,_opcode,_digit)\ + if (strcmp(op, _OP) == 0) { \ + if (nbParams == 1) { \ + imul_like_modrm_1param(jitc, _opcode, _digit, iparam); \ + return; }} + +#define SHIFT_LIKE(_name,_op1,_op2,_digit) \ + if (strcmp(op, _name) == 0) { \ + if (iparam[1].id == PARAM_INT) { \ + if (iparam[1].i == 1) \ + imul_like_modrm_1param(jitc, _op1, _digit, iparam); \ + else { \ + imul_like_modrm_1param(jitc, _op2, _digit, iparam); \ + JITC_ADD_UCHAR(jitc, iparam[1].i); \ + } \ + return; \ + } \ + } + +#define POP_LIKE(_OP,_opcode) \ + if (strcmp(op, _OP) == 0) { \ + if (iparam[0].id == PARAM_REG) { \ + JITC_ADD_UCHAR(jitc, _opcode + iparam[0].reg); \ + return; } } + + IMUL_LIKE("neg", 0xf7, 0x03); + IMUL_LIKE("imul", 0xf7, 0x05); + IMUL_LIKE("idiv", 0xf7, 0x07); + + POP_LIKE("pop", 0x58); + POP_LIKE("push", 0x50); + + SHIFT_LIKE("sal", 0xd1, 0xc1, 0x04); + SHIFT_LIKE("sar", 0xd1, 0xc1, 0x07); + SHIFT_LIKE("shl", 0xd1, 0xc1, 0x04); + SHIFT_LIKE("shr", 0xd1, 0xc1, 0x05); + + /* INC */ + if (strcmp(op, "inc") == 0) { + if (iparam[0].id == PARAM_REG) { + JITC_ADD_UCHAR(jitc, 0x40 + iparam[0].reg); + return; + } + imul_like_modrm_1param(jitc, 0xff, 0x00, iparam); + return; + } + + /* DEC */ + if (strcmp(op, "dec") == 0) { + if (iparam[0].id == PARAM_REG) { + JITC_ADD_UCHAR(jitc, 0x48 + iparam[0].reg); + return; + } + imul_like_modrm_1param(jitc, 0xff, 0x01, iparam); + return; + } + + if (strcmp(op, "call") == 0) + { + if (iparam[0].id == PARAM_LABEL) { + jitc_add_used_label(jitc,iparam[0].label,jitc->used+1); + JITC_CALL(jitc,0); + return; + } + if (iparam[0].id == PARAM_INT) { + JITC_CALL(jitc,iparam[0].i); + return; + } + if (iparam[0].id == PARAM_dispREG) { + JITC_ADD_UCHAR(jitc,0xff); + JITC_ADD_UCHAR(jitc,0xd0+iparam[0].reg); + return; + } + } + +#define MONOBYTE_INSTR(_OP,_opcode) \ + if (strcmp(op, _OP) == 0) { \ + JITC_ADD_UCHAR(jitc, _opcode); \ + return; } + + MONOBYTE_INSTR("ret", 0xc3); + MONOBYTE_INSTR("leave", 0xc9); + MONOBYTE_INSTR("cdq", 0x99); + + /* JNE */ + if (strcmp(op, "jne") == 0) { + if (iparam[0].id == PARAM_LABEL) { + JITC_JUMP_COND_LABEL(jitc,COND_NOT_EQUAL,iparam[0].label); + return; + } + if (iparam[0].id == PARAM_INT) { + JITC_JUMP_COND(jitc,COND_NOT_EQUAL,iparam[0].i); + return; + } + } + + /* JE */ + if (strcmp(op, "je") == 0) { + if (iparam[0].id == PARAM_LABEL) { + JITC_JUMP_COND_LABEL(jitc,COND_EQUAL,iparam[0].label); + return; + } + if (iparam[0].id == PARAM_INT) { + JITC_JUMP_COND(jitc,COND_EQUAL,iparam[0].i); + return; + } + } + + /* ADD LIKE */ + if (checkAddLike(jitc, op, iparam, nbParams)) return; + + /* BSWAP : 0F C8+rd */ + + fprintf(stderr, "JITC_x86: Invalid Operation '%s'\n", op); + exit(1); +} + +/** + * Adds a new instruction to the just in time compiled function + */ +void jitc_add(JitcX86Env *jitc, const char *_instr, ...) +{ + char instr[256]; + char *op; + char *sparam[16]; int nbParam=0; int i; + IParam iparam[16]; + va_list ap; + strcpy(instr,_instr); + +#ifdef DISPLAY_GENCODE + printf("|"); +#endif + + op = strtok(instr, " ,"); + if (!op) return; + + /* decoupage en tokens */ + while ((sparam[nbParam] = strtok(NULL, " ,")) != NULL) if (strlen(sparam[nbParam])>0) nbParam++; + + /* Reconnaissance des parametres */ + va_start(ap, _instr); + for (i=0;i<nbParam;++i) + { + int r; + char regname[256]; + iparam[i].id = PARAM_NONE; + if (strcmp(sparam[i], "$d") == 0) { + iparam[i].id = PARAM_INT; + iparam[i].i = va_arg(ap, int); + } + else if (strcmp(sparam[i], "$f") == 0) { + iparam[i].id = PARAM_FLOAT; + iparam[i].f = va_arg(ap, double); + } + else if (strcmp(sparam[i], "[$d]") == 0) { + iparam[i].id = PARAM_DISP32; + iparam[i].disp = va_arg(ap, int); + } + else if (strcmp(sparam[i], "$s") == 0) { + iparam[i].id = PARAM_LABEL; + strcpy(iparam[i].label, va_arg(ap, char*)); + } + else + for (r=0;RegsName[r].name;r++) { + if (strcmp(sparam[i], RegsName[r].name) == 0) { + iparam[i].id = PARAM_REG; + iparam[i].reg = RegsName[r].reg; + } + else + { + if (sscanf(sparam[i], "$d[%3s]", regname) > 0) { + if (strcmp(regname, RegsName[r].name) == 0) { + iparam[i].id = PARAM_dispREG; + iparam[i].reg = RegsName[r].reg; + iparam[i].disp = va_arg(ap, int); + } + } + if (sscanf(sparam[i], "[%3s]", regname) > 0) { + if (strcmp(regname, RegsName[r].name) == 0) { + iparam[i].id = PARAM_dispREG; + iparam[i].reg = RegsName[r].reg; + iparam[i].disp = 0; + } + } + } + } + if (iparam[i].id == PARAM_NONE) { + fprintf(stderr, "JITC_x86: Unrecognized parameter '%s'\n", sparam[i]); + exit(1); + } + } + va_end(ap); + + jitc_add_op(jitc, op, &(iparam[0]), nbParam); +#ifdef DISPLAY_GENCODE + printf(" ;;; %s", op); + for (i=0;i<nbParam;++i) + { + if (iparam[i].id == PARAM_INT) + printf(" 0x%x", iparam[i].i); + else if (iparam[i].id == PARAM_DISP32) + printf(" [0x%x]", iparam[i].disp); + else if (iparam[i].id == PARAM_LABEL) + printf(" %s", iparam[i].label); + else + printf(" %s", sparam[i]); + } + printf("\n"); + +#endif +} + +JitcX86Env *jitc_x86_env_new(int memory_size) { + + JitcX86Env *jitc = (JitcX86Env*)malloc(sizeof(JitcX86Env)); + jitc->_memory = (unsigned char*)malloc(memory_size); + jitc->used = 0; + jitc->memory = (unsigned char*)((int)jitc->_memory + (32-((int)jitc->_memory)%32)%32); + + jitc->nbUsedLabel = 0; + jitc->nbKnownLabel = 0; + + jitc->usedLabel = (LabelAddr*)malloc(sizeof(LabelAddr) * JITC_MAXLABEL); + jitc->knownLabel = (LabelAddr*)malloc(sizeof(LabelAddr) * JITC_MAXLABEL); + + return jitc; +} + +void jitc_x86_delete(JitcX86Env *jitc) { + + free(jitc->usedLabel); + free(jitc->knownLabel); + free(jitc->_memory); + free(jitc); +} + +JitcFunc jitc_prepare_func(JitcX86Env *jitc) { + + JitcFunc ptr = 0; + jitc->used = (32 - jitc->used%32)%32; + ptr = (JitcFunc)&(jitc->memory[jitc->used]); + +#ifdef DISPLAY_GENCODE + printf("\n------------------------------------------\n"); + printf("-- Function Intro --\n"); + printf("------------------------------------------\n"); +#endif + + /* save the state */ + jitc_add(jitc,"push ebp"); + jitc_add(jitc,"mov ebp, esp"); + jitc_add(jitc,"sub esp, $d", 8); + JITC_PUSH_ALL(jitc); +#ifdef DISPLAY_GENCODE + printf("\n------------------------------------------\n"); +#endif + return ptr; +} + +void jitc_validate_func(JitcX86Env *jitc) { + +#ifdef DISPLAY_GENCODE + printf("\n------------------------------------------\n"); + printf("-- Function Outro --\n"); + printf("------------------------------------------\n"); +#endif + /* restore the state */ + JITC_POP_ALL(jitc); + jitc_add(jitc, "leave"); + jitc_add(jitc, "ret"); + jitc_resolve_labels(jitc); +#ifdef DISPLAY_GENCODE + printf("\n------------------------------------------\n"); +#endif +} + +void jitc_add_used_label(JitcX86Env *jitc, char *label, int where) { + + strncpy(jitc->usedLabel[jitc->nbUsedLabel].label, label, JITC_LABEL_SIZE); + jitc->usedLabel[jitc->nbUsedLabel].address = where; + jitc->nbUsedLabel++; +} + +void jitc_add_known_label(JitcX86Env *jitc, char *label, int where) { + +#ifdef DISPLAY_GENCODE + printf("%s:\n", label); +#endif + strncpy(jitc->knownLabel[jitc->nbKnownLabel].label, label, JITC_LABEL_SIZE); + jitc->knownLabel[jitc->nbKnownLabel].address = where; + jitc->nbKnownLabel++; +} + +void jitc_resolve_labels(JitcX86Env *jitc) { + + int i,j; + for (i=jitc->nbUsedLabel;i-->0;) { + + LabelAddr used = jitc->usedLabel[i]; + for (j=jitc->nbKnownLabel;j-->0;) { + + LabelAddr known = jitc->knownLabel[j]; + if (strcmp(known.label, used.label) == 0) { + int *offset = (int*)&(jitc->memory[used.address]); + *offset = known.address - used.address - 4; /* always using long offset */ + break; + } + } + } + jitc->nbUsedLabel = jitc->nbKnownLabel = 0; +} diff --git a/src/visualizations/Goom/goom2k4-0/src/jitc_x86.h b/src/visualizations/Goom/goom2k4-0/src/jitc_x86.h new file mode 100644 index 0000000000..c81fa9ccdc --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/jitc_x86.h @@ -0,0 +1,214 @@ +/** + * Copyright (c)2004 Jean-Christophe Hoelt <jeko@ios-software.com> + */ + +#include <stdlib.h> +#include <string.h> + +#define JITC_MAXLABEL 1024 +#define JITC_LABEL_SIZE 64 + +/** + * low level macros + */ + + /* {{{ Registres Generaux */ +#define EAX 0 +#define ECX 1 +#define EDX 2 +#define EBX 3 +#define ESP 4 +#define EBP 5 +#define ESI 6 +#define EDI 7 + /* }}} */ + /* {{{ Registres MMX */ +#define MM0 0 +#define MM1 1 +#define MM2 2 +#define MM3 3 +#define MM4 4 +#define MM5 5 +#define MM6 6 +#define MM7 7 + /* }}} */ + /* {{{ Registres SSE*/ +#define XMM0 0 +#define XMM1 1 +#define XMM2 2 +#define XMM3 3 +#define XMM4 4 +#define XMM5 5 +#define XMM6 6 +#define XMM7 7 + /* }}} */ + /* {{{ Alias aux registres */ +#define R0 0 +#define R1 1 +#define R2 2 +#define R3 3 +#define R4 4 +#define R5 5 +#define R6 6 +#define R7 7 + /* }}} */ + + /* {{{ Conditions */ +#define COND_OVERFLOW 0 +#define COND_NO_OVERFLOW 1 +#define COND_BELOW 2 +#define COND_NOT_BELOW 3 +#define COND_EQUAL 4 +#define COND_ZERO 4 +#define COND_NOT_EQUAL 5 +#define COND_NOT_ZERO 5 +#define COND_NOT_ABOVE 6 +#define COND_ABOVE 7 +#define COND_SIGN 8 +#define COND_NOT_SIGN 9 +#define COND_EVEN 10 +#define COND_ODD 11 +#define COND_LESS_THAN 12 +#define COND_GREATER_EQUAL 13 +#define COND_LESS_EQUAL 14 +#define COND_GREATER_THAN 15 + /* }}} */ + +typedef int (*JitcFunc)(void); + +typedef struct _LABEL_ADDR { + char label[JITC_LABEL_SIZE]; + int address; +} LabelAddr; + +typedef struct _JITC_X86_ENV { + unsigned char *_memory; + unsigned char *memory; + unsigned int used; + + int nbUsedLabel; + int nbKnownLabel; + LabelAddr *usedLabel; + LabelAddr *knownLabel; +} JitcX86Env; + +#define DISPLAY_GENCODE +/*#define DISPLAY_GENCODE_HEXA*/ + +#ifdef DISPLAY_GENCODE_HEXA + #define JITC_ADD_UCHAR(jitc,op) printf(" 0x%02x", op) && (jitc->memory[jitc->used++]=op) +#else + #define JITC_ADD_UCHAR(jitc,op) (jitc->memory[jitc->used++]=op) +#endif + +#define JITC_ADD_USHORT(jitc,i) { JITC_ADD_UCHAR(jitc,i&0xff); JITC_ADD_UCHAR(jitc,(i>>8)&0xff); } +#define JITC_ADD_UINT(jitc,i) { \ + JITC_ADD_UCHAR(jitc,i&0xff); \ + JITC_ADD_UCHAR(jitc,(i>>8)&0xff); \ + JITC_ADD_UCHAR(jitc,(i>>16)&0xff); \ + JITC_ADD_UCHAR(jitc,(i>>24)&0xff); \ +} +#define JITC_ADD_2UCHAR(jitc,op1,op2) {JITC_ADD_UCHAR(jitc,op1); JITC_ADD_UCHAR(jitc,op2);} + +#define JITC_MODRM(jitc,mod,reg,rm) { JITC_ADD_UCHAR(jitc,((int)mod<<6)|((int)reg<<3)|((int)rm)); } + +/* special values for R/M */ +#define JITC_RM_DISP32 0x05 + +#define JITC_MOD_pREG_REG 0x00 +#define JITC_MOD_disp8REG_REG 0x01 +#define JITC_MOD_disp32REG_REG 0x02 +#define JITC_MOD_REG_REG 0x03 +/* cf 24319101 p.27 */ + +#define JITC_OP_REG_REG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,0xc0+(src<<3)+dest); } +#define JITC_OP_REG_pREG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,(dest<<3)+src); } +#define JITC_OP_pREG_REG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,(src<<3)+dest); } + +/** + * "high" level macro + */ + +#define JITC_LOAD_REG_IMM32(jitc,reg,imm32) { JITC_ADD_UCHAR (jitc,0xb8+reg); JITC_ADD_UINT(jitc,(int)(imm32)); } +#define JITC_LOAD_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x89,dest,src); } + +#define JITC_LOAD_REG_pREG(jitc,dest,src) { JITC_OP_REG_pREG(jitc,0x8b,dest,src); } +#define JITC_LOAD_pREG_REG(jitc,dest,src) { JITC_OP_pREG_REG(jitc,0x89,dest,src); } + +#define JITC_DEC_REG(jitc,reg) { JITC_ADD_UCHAR (jitc,0x48+reg); } +#define JITC_INC_REG(jitc,reg) { JITC_ADD_UCHAR (jitc,0x40+reg); } + +#define JITC_ADD_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x01,dest,src); } +#define JITC_ADD_REG_IMM32(jitc,reg,imm32) { JITC_ADD_UCHAR (jitc,0x81);\ + JITC_ADD_UCHAR (jitc,0xc0+reg);\ + JITC_ADD_UINT (jitc,(int)imm32); } + +#define JITC_AND_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x21,dest,src); } +#define JITC_CMP_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x39,dest,src); } +#define JITC_CMP_REG_IMM32(jitc,reg,imm32) { JITC_ADD_2UCHAR (jitc,0x81,0xf8+reg); \ + JITC_ADD_UINT (jitc,(int)imm32); } + +#define JITC_IDIV_EAX_REG(jitc,reg) { JITC_ADD_2UCHAR(jitc, 0xf7, 0xf8+reg); } +#define JITC_IMUL_EAX_REG(jitc,reg) { JITC_ADD_2UCHAR(jitc, 0xf7, 0xe8+reg); } + +/*#define JITC_SUB_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x29,dest,src); } +#define JITC_SUB_EAX_IMM32(jitc,imm32) { JITC_ADD_UCHAR (jitc,0x2d); JITC_ADD_UINT(jitc,(int)imm32); } +#define JITC_SUB_REG_IMM32(jitc,reg,imm32) { JITC_ADD_2UCHAR (jitc,0x81, 0xe8+reg);\ + JITC_ADD_UINT (jitc,(int)imm32); }*/ +#define JITC_SUB_REG_IMM8(jitc,reg,imm8) { JITC_ADD_2UCHAR (jitc,0x83, 0xe8+reg);\ + JITC_ADD_UCHAR(jitc,imm8); } + +/* Floating points */ + +#define JITC_FLD_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ + JITC_MODRM (jitc, 0x00, 0x00,JITC_RM_DISP32); \ + JITC_ADD_UINT(jitc,(int)(address)); } +#define JITC_FLD_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xD9, 0xC0+reg); } + +#define JITC_FST_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ + JITC_MODRM (jitc, 0x00, 0x02,JITC_RM_DISP32); \ + JITC_ADD_UINT(jitc,(int)(ADDRess)); } +#define JITC_FST_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xDD, 0xD0+reg); } + +#define JITC_FSTP_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ + JITC_MODRM (jitc, 0x00, 0x03, JITC_RM_DISP32); \ + JITC_ADD_UINT(jitc,(int)(address)); } +#define JITC_FSTP_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xDD, 0xD8+reg); } + +#define JITC_FADD + +/* Jumps */ + +#define JITC_ADD_LABEL(jitc,label) { jitc_add_known_label(jitc,label,jitc->used); } + +#define JITC_JUMP(jitc,offset) { JITC_ADD_UCHAR(jitc,0xe9); JITC_ADD_UINT(jitc,offset); } +#define JITC_JUMP_LABEL(jitc,label) { jitc_add_used_label(jitc,label,jitc->used+1); JITC_JUMP(jitc,0); } +#define JITC_JUMP_COND(jitc,cond,offset) { JITC_ADD_UCHAR(jitc,0x0f);\ + JITC_ADD_UCHAR(jitc,0x80+cond);\ + JITC_ADD_UINT(jitc,offset); } +#define JITC_JUMP_COND_LABEL(jitc,cond,label) { jitc_add_used_label(jitc,label,jitc->used+2); JITC_JUMP_COND(jitc,cond,0); } +#define JITC_CALL(jitc,function) { int __offset__ = (int)function - (int)(&jitc->memory[jitc->used+5]);\ + JITC_ADD_UCHAR(jitc,0xe8); JITC_ADD_UINT(jitc,__offset__); } +/*#define JITC_CALL_pREG(jitc,reg) { JITC_ADD_UCHAR(jitc,0xff); JITC_ADD_UCHAR(jitc,0xd0+reg); } +#define JITC_CALL_LABEL(jitc,label) { jitc_add_used_label(jitc,label,jitc->used+1); JITC_CALL(jitc,0); }*/ + +/* save all registers (except EAX,ESP,EBP) */ +#define JITC_PUSH_ALL(jitc) { jitc_add(jitc,"push ecx"); jitc_add(jitc,"push edx"); jitc_add(jitc,"push ebx"); \ + jitc_add(jitc,"push esi"); jitc_add(jitc,"push edi"); } + +/* restore all registers (except EAX,ESP,EBP) */ +#define JITC_POP_ALL(jitc) { jitc_add(jitc,"pop edi"); jitc_add(jitc,"pop esi"); jitc_add(jitc,"pop ebx"); \ + jitc_add(jitc,"pop edx"); jitc_add(jitc,"pop ecx"); } + +/* public methods */ +JitcX86Env *jitc_x86_env_new(int memory_size); +JitcFunc jitc_prepare_func(JitcX86Env *jitc); +void jitc_add(JitcX86Env *jitc, const char *instr, ...); +void jitc_validate_func(JitcX86Env *jitc); +void jitc_x86_delete(JitcX86Env *jitc); + + +/* private methods */ +void jitc_add_used_label(JitcX86Env *jitc, char *label, int where); +void jitc_add_known_label(JitcX86Env *jitc, char *label, int where); +void jitc_resolve_labels(JitcX86Env *jitc); diff --git a/src/visualizations/Goom/goom2k4-0/src/lines.c b/src/visualizations/Goom/goom2k4-0/src/lines.c new file mode 100644 index 0000000000..2c39b1a7a4 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/lines.c @@ -0,0 +1,239 @@ +/* + * lines.c + */ + +#include "lines.h" +#include <math.h> +#include <stdlib.h> +#include <stdio.h> +#include "goom_tools.h" +#include "drawmethods.h" +#include "goom_plugin_info.h" + +static inline unsigned char lighten (unsigned char value, float power) +{ + int val = value; + float t = (float) val * log10(power) / 2.0; + + if (t > 0) { + val = (int) t; /* (32.0f * log (t)); */ + if (val > 255) + val = 255; + if (val < 0) + val = 0; + return val; + } + else { + return 0; + } +} + +static void lightencolor (guint32 *col, float power) +{ + unsigned char *color; + + color = (unsigned char *) col; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); +} + + + +static void +genline (int id, float param, GMUnitPointer * l, int rx, int ry) +{ + int i; + + switch (id) { + case GML_HLINE: + for (i = 0; i < 512; i++) { + l[i].x = ((float) i * rx) / 512.0f; + l[i].y = param; + l[i].angle = M_PI / 2.0f; + } + return; + case GML_VLINE: + for (i = 0; i < 512; i++) { + l[i].y = ((float) i * ry) / 512.0f; + l[i].x = param; + l[i].angle = 0.0f; + } + return; + case GML_CIRCLE: + for (i = 0; i < 512; i++) { + float cosa, sina; + + l[i].angle = 2.0f * M_PI * (float) i / 512.0f; + cosa = param * cos (l[i].angle); + sina = param * sin (l[i].angle); + l[i].x = ((float) rx / 2.0f) + cosa; + l[i].y = (float) ry / 2.0f + sina; + } + return; + } +} + +static guint32 getcouleur (int mode) +{ + switch (mode) { + case GML_RED: + return (230 << (ROUGE * 8)) | (120 << (VERT * 8)) | (18 << (BLEU * 8)); + case GML_ORANGE_J: + return (120 << (VERT * 8)) | (252 << (ROUGE * 8)) | (18 << (BLEU * 8)); + case GML_ORANGE_V: + return (160 << (VERT * 8)) | (236 << (ROUGE * 8)) | (40 << (BLEU * 8)); + case GML_BLEUBLANC: + return (40 << (BLEU * 8)) | (220 << (ROUGE * 8)) | (140 << (VERT * 8)); + case GML_VERT: + return (200 << (VERT * 8)) | (80 << (ROUGE * 8)) | (18 << (BLEU * 8)); + case GML_BLEU: + return (250 << (BLEU * 8)) | (30 << (VERT * 8)) | (80 << (ROUGE * 8)); + case GML_BLACK: + return (16 << (BLEU * 8)) | (16 << (VERT * 8)) | (16 << (ROUGE * 8)); + } + return 0; +} + +void +goom_lines_set_res (GMLine * gml, int rx, int ry) +{ + if (gml != NULL) { + gml->screenX = rx; + gml->screenY = ry; + + genline (gml->IDdest, gml->param, gml->points2, rx, ry); + } +} + + +static void +goom_lines_move (GMLine * l) +{ + int i; + unsigned char *c1, *c2; + + for (i = 0; i < 512; i++) { + l->points[i].x = (l->points2[i].x + 39.0f * l->points[i].x) / 40.0f; + l->points[i].y = (l->points2[i].y + 39.0f * l->points[i].y) / 40.0f; + l->points[i].angle = + (l->points2[i].angle + 39.0f * l->points[i].angle) / 40.0f; + } + + c1 = (unsigned char *) &l->color; + c2 = (unsigned char *) &l->color2; + for (i = 0; i < 4; i++) { + int cc1, cc2; + + cc1 = *c1; + cc2 = *c2; + *c1 = (unsigned char) ((cc1 * 63 + cc2) >> 6); + ++c1; + ++c2; + } + + l->power += l->powinc; + if (l->power < 1.1f) { + l->power = 1.1f; + l->powinc = (float) (goom_irand(l->goomInfo->gRandom,20) + 10) / 300.0f; + } + if (l->power > 17.5f) { + l->power = 17.5f; + l->powinc = -(float) (goom_irand(l->goomInfo->gRandom,20) + 10) / 300.0f; + } + + l->amplitude = (99.0f * l->amplitude + l->amplitudeF) / 100.0f; +} + +void +goom_lines_switch_to (GMLine * gml, int IDdest, + float param, float amplitude, int col) +{ + genline (IDdest, param, gml->points2, gml->screenX, gml->screenY); + gml->IDdest = IDdest; + gml->param = param; + gml->amplitudeF = amplitude; + gml->color2 = getcouleur (col); +} + +GMLine * +goom_lines_init (PluginInfo *goomInfo, int rx, int ry, + int IDsrc, float paramS, int coulS, + int IDdest, float paramD, int coulD) +{ + GMLine *l = (GMLine *) malloc (sizeof (GMLine)); + + l->goomInfo = goomInfo; + + l->points = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer)); + l->points2 = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer)); + l->nbPoints = 512; + + l->IDdest = IDdest; + l->param = paramD; + + l->amplitude = l->amplitudeF = 1.0f; + + genline (IDsrc, paramS, l->points, rx, ry); + genline (IDdest, paramD, l->points2, rx, ry); + + l->color = getcouleur (coulS); + l->color2 = getcouleur (coulD); + + l->screenX = rx; + l->screenY = ry; + + l->power = 0.0f; + l->powinc = 0.01f; + + goom_lines_switch_to (l, IDdest, paramD, 1.0f, coulD); + + return l; +} + +void +goom_lines_free (GMLine ** l) +{ + free ((*l)->points); + free ((*l)->points2); + free (*l); + l = NULL; +} + +void goom_lines_draw (PluginInfo *plug, GMLine * line, gint16 data[512], Pixel *p) +{ + if (line != NULL) { + int i, x1, y1; + guint32 color = line->color; + GMUnitPointer *pt = &(line->points[0]); + + float cosa = cos (pt->angle) / 1000.0f; + float sina = sin (pt->angle) / 1000.0f; + + lightencolor (&color, line->power); + + x1 = (int) (pt->x + cosa * line->amplitude * data[0]); + y1 = (int) (pt->y + sina * line->amplitude * data[0]); + + for (i = 1; i < 512; i++) { + int x2, y2; + GMUnitPointer *pt = &(line->points[i]); + + float cosa = cos (pt->angle) / 1000.0f; + float sina = sin (pt->angle) / 1000.0f; + + x2 = (int) (pt->x + cosa * line->amplitude * data[i]); + y2 = (int) (pt->y + sina * line->amplitude * data[i]); + + plug->methods.draw_line (p, x1, y1, x2, y2, color, line->screenX, line->screenY); + + x1 = x2; + y1 = y2; + } + goom_lines_move (line); + } +} diff --git a/src/visualizations/Goom/goom2k4-0/src/lines.h b/src/visualizations/Goom/goom2k4-0/src/lines.h new file mode 100644 index 0000000000..9c6df9240c --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/lines.h @@ -0,0 +1,81 @@ +#ifndef _LINES_H +#define _LINES_H + +/* + * lines.h + * Goom + * Copyright (c) 2000-2003 iOS-software. All rights reserved. + */ + +#include "goom_typedefs.h" +#include "goom_graphic.h" +#include "goom_config.h" + +struct _GMUNITPOINTER +{ + float x; + float y; + float angle; +}; + +/* tableau de points */ +struct _GMLINE +{ + + GMUnitPointer *points; + GMUnitPointer *points2; + int IDdest; + float param; + float amplitudeF; + float amplitude; + + int nbPoints; + guint32 color; /* pour l'instant je stocke la couleur a terme, on stockera le mode couleur et l'on animera */ + guint32 color2; + + int screenX; + int screenY; + + float power; + float powinc; + + PluginInfo *goomInfo; +}; + +/* les ID possibles */ + +#define GML_CIRCLE 0 +/* (param = radius) */ + +#define GML_HLINE 1 +/* (param = y) */ + +#define GML_VLINE 2 +/* (param = x) */ + +/* les modes couleur possible (si tu mets un autre c'est noir) */ + +#define GML_BLEUBLANC 0 +#define GML_RED 1 +#define GML_ORANGE_V 2 +#define GML_ORANGE_J 3 +#define GML_VERT 4 +#define GML_BLEU 5 +#define GML_BLACK 6 + +/* construit un effet de line (une ligne horitontale pour commencer) */ +GMLine *goom_lines_init (PluginInfo *goomInfo, int rx, int ry, + int IDsrc, float paramS, int modeCoulSrc, + int IDdest, float paramD, int modeCoulDest); + +void goom_lines_switch_to (GMLine * gml, int IDdest, float param, + float amplitude, + int modeCoul); + +void goom_lines_set_res (GMLine * gml, int rx, int ry); + +void goom_lines_free (GMLine ** gml); + +void goom_lines_draw (PluginInfo *plugInfo, GMLine * gml, gint16 data[512], Pixel *p); + +#endif /* _LINES_H */ diff --git a/src/visualizations/Goom/goom2k4-0/src/mathtools.c b/src/visualizations/Goom/goom2k4-0/src/mathtools.c new file mode 100644 index 0000000000..b2b02ea05b --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/mathtools.c @@ -0,0 +1,84 @@ +/*---------------------------------------------------------------------------*/ +/* +** mathtools.c +** Goom Project +** +** Created by Jeko on Sun Jul 20 2003 + ** Copyright (c) 2003 iOS. All rights reserved. +*/ +/*---------------------------------------------------------------------------*/ + +#include "mathtools.h" + +float sin256[256] = { + 0,0.0245412,0.0490677,0.0735646,0.0980171,0.122411,0.14673,0.170962 + ,0.19509,0.219101,0.24298,0.266713,0.290285,0.313682,0.33689,0.359895 + ,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998 + ,0.55557,0.575808,0.595699,0.615232,0.634393,0.653173,0.671559,0.689541 + ,0.707107,0.724247,0.740951,0.757209,0.77301,0.788346,0.803208,0.817585 + ,0.83147,0.844854,0.857729,0.870087,0.881921,0.893224,0.903989,0.91421 + ,0.92388,0.932993,0.941544,0.949528,0.95694,0.963776,0.970031,0.975702 + ,0.980785,0.985278,0.989177,0.99248,0.995185,0.99729,0.998795,0.999699 + ,1,0.999699,0.998795,0.99729,0.995185,0.99248,0.989177,0.985278 + ,0.980785,0.975702,0.970031,0.963776,0.95694,0.949528,0.941544,0.932993 + ,0.92388,0.91421,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854 + ,0.83147,0.817585,0.803208,0.788346,0.77301,0.757209,0.740951,0.724247 + ,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808 + ,0.55557,0.534998,0.514103,0.492898,0.471397,0.449611,0.427555,0.405241 + ,0.382683,0.359895,0.33689,0.313682,0.290285,0.266713,0.24298,0.219101 + ,0.19509,0.170962,0.14673,0.122411,0.0980171,0.0735646,0.0490677,0.0245412 + ,1.22465e-16,-0.0245412,-0.0490677,-0.0735646,-0.0980171,-0.122411,-0.14673,-0.170962 + ,-0.19509,-0.219101,-0.24298,-0.266713,-0.290285,-0.313682,-0.33689,-0.359895 + ,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998 + ,-0.55557,-0.575808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541 + ,-0.707107,-0.724247,-0.740951,-0.757209,-0.77301,-0.788346,-0.803208,-0.817585 + ,-0.83147,-0.844854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.91421 + ,-0.92388,-0.932993,-0.941544,-0.949528,-0.95694,-0.963776,-0.970031,-0.975702 + ,-0.980785,-0.985278,-0.989177,-0.99248,-0.995185,-0.99729,-0.998795,-0.999699 + ,-1,-0.999699,-0.998795,-0.99729,-0.995185,-0.99248,-0.989177,-0.985278 + ,-0.980785,-0.975702,-0.970031,-0.963776,-0.95694,-0.949528,-0.941544,-0.932993 + ,-0.92388,-0.91421,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854 + ,-0.83147,-0.817585,-0.803208,-0.788346,-0.77301,-0.757209,-0.740951,-0.724247 + ,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808 + ,-0.55557,-0.534998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241 + ,-0.382683,-0.359895,-0.33689,-0.313682,-0.290285,-0.266713,-0.24298,-0.219101 + ,-0.19509,-0.170962,-0.14673,-0.122411,-0.0980171,-0.0735646,-0.0490677,-0.0245412 + +}; + +float cos256[256] = { + 0,0.999699,0.998795,0.99729,0.995185,0.99248,0.989177,0.985278 + ,0.980785,0.975702,0.970031,0.963776,0.95694,0.949528,0.941544,0.932993 + ,0.92388,0.91421,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854 + ,0.83147,0.817585,0.803208,0.788346,0.77301,0.757209,0.740951,0.724247 + ,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808 + ,0.55557,0.534998,0.514103,0.492898,0.471397,0.449611,0.427555,0.405241 + ,0.382683,0.359895,0.33689,0.313682,0.290285,0.266713,0.24298,0.219101 + ,0.19509,0.170962,0.14673,0.122411,0.0980171,0.0735646,0.0490677,0.0245412 + ,6.12323e-17,-0.0245412,-0.0490677,-0.0735646,-0.0980171,-0.122411,-0.14673,-0.170962 + ,-0.19509,-0.219101,-0.24298,-0.266713,-0.290285,-0.313682,-0.33689,-0.359895 + ,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998 + ,-0.55557,-0.575808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541 + ,-0.707107,-0.724247,-0.740951,-0.757209,-0.77301,-0.788346,-0.803208,-0.817585 + ,-0.83147,-0.844854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.91421 + ,-0.92388,-0.932993,-0.941544,-0.949528,-0.95694,-0.963776,-0.970031,-0.975702 + ,-0.980785,-0.985278,-0.989177,-0.99248,-0.995185,-0.99729,-0.998795,-0.999699 + ,-1,-0.999699,-0.998795,-0.99729,-0.995185,-0.99248,-0.989177,-0.985278 + ,-0.980785,-0.975702,-0.970031,-0.963776,-0.95694,-0.949528,-0.941544,-0.932993 + ,-0.92388,-0.91421,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854 + ,-0.83147,-0.817585,-0.803208,-0.788346,-0.77301,-0.757209,-0.740951,-0.724247 + ,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808 + ,-0.55557,-0.534998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241 + ,-0.382683,-0.359895,-0.33689,-0.313682,-0.290285,-0.266713,-0.24298,-0.219101 + ,-0.19509,-0.170962,-0.14673,-0.122411,-0.0980171,-0.0735646,-0.0490677,-0.0245412 + ,-1.83697e-16,0.0245412,0.0490677,0.0735646,0.0980171,0.122411,0.14673,0.170962 + ,0.19509,0.219101,0.24298,0.266713,0.290285,0.313682,0.33689,0.359895 + ,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998 + ,0.55557,0.575808,0.595699,0.615232,0.634393,0.653173,0.671559,0.689541 + ,0.707107,0.724247,0.740951,0.757209,0.77301,0.788346,0.803208,0.817585 + ,0.83147,0.844854,0.857729,0.870087,0.881921,0.893224,0.903989,0.91421 + ,0.92388,0.932993,0.941544,0.949528,0.95694,0.963776,0.970031,0.975702 + ,0.980785,0.985278,0.989177,0.99248,0.995185,0.99729,0.998795,0.999699 + +}; + diff --git a/src/visualizations/Goom/goom2k4-0/src/mathtools.h b/src/visualizations/Goom/goom2k4-0/src/mathtools.h new file mode 100644 index 0000000000..0e2293c3fa --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/mathtools.h @@ -0,0 +1,36 @@ +#ifndef MATHTOOLS_H +#define MATHTOOLS_H + + +#define _double2fixmagic (68719476736.0*1.5) +/* 2^36 * 1.5, (52-_shiftamt=36) uses limited precisicion to floor */ +#define _shiftamt 16 +/* 16.16 fixed point representation */ + +#if BigEndian_ +#define iexp_ 0 +#define iman_ 1 +#else +#define iexp_ 1 +#define iman_ 0 +#endif /* BigEndian_ */ + +/* TODO: this optimization is very efficient: put it again when all works +#ifdef HAVE_MMX +#define F2I(dbl,i) {double d = dbl + _double2fixmagic; i = ((int*)&d)[iman_] >> _shiftamt;} +#else*/ +#define F2I(dbl,i) i=(int)dbl; +/*#endif*/ + +#if 0 +#define SINCOS(f,s,c) \ + __asm__ __volatile__ ("fsincos" : "=t" (c), "=u" (s) : "0" (f)) +#else +#define SINCOS(f,s,c) {s=sin(f);c=cos(f);} +#endif + +extern float sin256[256]; +extern float cos256[256]; + +#endif + diff --git a/src/visualizations/Goom/goom2k4-0/src/mmx.c b/src/visualizations/Goom/goom2k4-0/src/mmx.c new file mode 100644 index 0000000000..8effa520fd --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/mmx.c @@ -0,0 +1,275 @@ +#ifdef HAVE_MMX + +#define BUFFPOINTNB 16 +#define BUFFPOINTMASK 0xffff +#define BUFFINCR 0xff + +#include "mmx.h" +#include "goom_graphic.h" + +#define sqrtperte 16 +// faire : a % sqrtperte <=> a & pertemask +#define PERTEMASK 0xf +// faire : a / sqrtperte <=> a >> PERTEDEC +#define PERTEDEC 4 + +int mmx_supported (void) { + return (mm_support()&0x1); +} + +void zoom_filter_mmx (int prevX, int prevY, + Pixel *expix1, Pixel *expix2, + int *brutS, int *brutD, int buffratio, + int precalCoef[16][16]) +{ + unsigned int ax = (prevX-1)<<PERTEDEC, ay = (prevY-1)<<PERTEDEC; + + int bufsize = prevX * prevY; + int loop; + + __asm__ __volatile__ ("pxor %mm7,%mm7"); + + for (loop=0; loop<bufsize; loop++) + { + /* int couleur; */ + int px,py; + int pos; + int coeffs; + + int myPos = loop << 1, + myPos2 = myPos + 1; + int brutSmypos = brutS[myPos]; + + px = brutSmypos + (((brutD[myPos] - brutSmypos)*buffratio) >> BUFFPOINTNB); + brutSmypos = brutS[myPos2]; + py = brutSmypos + (((brutD[myPos2] - brutSmypos)*buffratio) >> BUFFPOINTNB); + + if ((py>=ay) || (px>=ax)) { + pos=coeffs=0; + } + else { + pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); + // coef en modulo 15 + coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; + } + + __asm__ __volatile__ ( + "movd %2, %%mm6 \n\t" + + /* recuperation des deux premiers pixels dans mm0 et mm1 */ + "movq (%3,%1,4), %%mm0 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */ + "movq %%mm0, %%mm1 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */ + + /* depackage du premier pixel */ + "punpcklbw %%mm7, %%mm0 \n\t" /* 00-b2-00-v2-00-r2-00-a2 */ + + "movq %%mm6, %%mm5 \n\t" /* ??-??-??-??-c4-c3-c2-c1 */ + /* depackage du 2ieme pixel */ + "punpckhbw %%mm7, %%mm1 \n\t" /* 00-b1-00-v1-00-r1-00-a1 */ + + /* extraction des coefficients... */ + "punpcklbw %%mm5, %%mm6 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ + "movq %%mm6, %%mm4 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ + "movq %%mm6, %%mm5 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ + + "punpcklbw %%mm5, %%mm6 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */ + "punpckhbw %%mm5, %%mm4 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */ + + "movq %%mm6, %%mm3 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */ + + "punpcklbw %%mm7, %%mm6 \n\t" /* 00-c1-00-c1-00-c1-00-c1 */ + "punpckhbw %%mm7, %%mm3 \n\t" /* 00-c2-00-c2-00-c2-00-c2 */ + + /* multiplication des pixels par les coefficients */ + "pmullw %%mm6, %%mm0 \n\t" /* c1*b2-c1*v2-c1*r2-c1*a2 */ + "pmullw %%mm3, %%mm1 \n\t" /* c2*b1-c2*v1-c2*r1-c2*a1 */ + "paddw %%mm1, %%mm0 \n\t" + + /* ...extraction des 2 derniers coefficients */ + "movq %%mm4, %%mm5 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */ + "punpcklbw %%mm7, %%mm4 \n\t" /* 00-c3-00-c3-00-c3-00-c3 */ + "punpckhbw %%mm7, %%mm5 \n\t" /* 00-c4-00-c4-00-c4-00-c4 */ + + /* ajouter la longueur de ligne a esi */ + "addl %4,%1 \n\t" + + /* recuperation des 2 derniers pixels */ + "movq (%3,%1,4), %%mm1 \n\t" + "movq %%mm1, %%mm2 \n\t" + + /* depackage des pixels */ + "punpcklbw %%mm7, %%mm1 \n\t" + "punpckhbw %%mm7, %%mm2 \n\t" + + /* multiplication pas les coeffs */ + "pmullw %%mm4, %%mm1 \n\t" + "pmullw %%mm5, %%mm2 \n\t" + + /* ajout des valeurs obtenues à la valeur finale */ + "paddw %%mm1, %%mm0 \n\t" + "paddw %%mm2, %%mm0 \n\t" + + /* division par 256 = 16+16+16+16, puis repackage du pixel final */ + "psrlw $8, %%mm0 \n\t" + "packuswb %%mm7, %%mm0 \n\t" + + "movd %%mm0,%0 \n\t" + :"=g"(expix2[loop]) + :"r"(pos),"r"(coeffs),"r"(expix1),"r"(prevX) + + ); + + emms(); + } +} + +#define DRAWMETHOD_PLUS_MMX(_out,_backbuf,_col) \ +{ \ + movd_m2r(_backbuf, mm0); \ + paddusb_m2r(_col, mm0); \ + movd_r2m(mm0, _out); \ +} + +#define DRAWMETHOD DRAWMETHOD_PLUS_MMX(*p,*p,col) + +void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) +{ + int x, y, dx, dy, yy, xx; + Pixel *p; + + if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) + goto end_of_line; + + dx = x2 - x1; + dy = y2 - y1; + if (x1 >= x2) { + int tmp; + + tmp = x1; + x1 = x2; + x2 = tmp; + tmp = y1; + y1 = y2; + y2 = tmp; + dx = x2 - x1; + dy = y2 - y1; + } + + /* vertical line */ + if (dx == 0) { + if (y1 < y2) { + p = &(data[(screenx * y1) + x1]); + for (y = y1; y <= y2; y++) { + DRAWMETHOD; + p += screenx; + } + } + else { + p = &(data[(screenx * y2) + x1]); + for (y = y2; y <= y1; y++) { + DRAWMETHOD; + p += screenx; + } + } + goto end_of_line; + } + /* horizontal line */ + if (dy == 0) { + if (x1 < x2) { + p = &(data[(screenx * y1) + x1]); + for (x = x1; x <= x2; x++) { + DRAWMETHOD; + p++; + } + goto end_of_line; + } + else { + p = &(data[(screenx * y1) + x2]); + for (x = x2; x <= x1; x++) { + DRAWMETHOD; + p++; + } + goto end_of_line; + } + } + /* 1 */ + /* \ */ + /* \ */ + /* 2 */ + if (y2 > y1) { + /* steep */ + if (dy > dx) { + dx = ((dx << 16) / dy); + x = x1 << 16; + for (y = y1; y <= y2; y++) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p++; + /* DRAWMETHOD; */ + } + x += dx; + } + goto end_of_line; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + } + } + /* 2 */ + /* / */ + /* / */ + /* 1 */ + else { + /* steep */ + if (-dy > dx) { + dx = ((dx << 16) / -dy); + x = (x1 + 1) << 16; + for (y = y1; y >= y2; y--) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p--; + /* DRAWMETHOD; */ + } + x += dx; + } + goto end_of_line; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + goto end_of_line; + } + } +end_of_line: + emms(); + /* __asm__ __volatile__ ("emms"); */ +} + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/mmx.h b/src/visualizations/Goom/goom2k4-0/src/mmx.h new file mode 100644 index 0000000000..3fae26b985 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/mmx.h @@ -0,0 +1,729 @@ +/* mmx.h + + MultiMedia eXtensions GCC interface library for IA32. + + To use this library, simply include this header file + and compile with GCC. You MUST have inlining enabled + in order for mmx_ok() to work; this can be done by + simply using -O on the GCC command line. + + Compiling with -DMMX_TRACE will cause detailed trace + output to be sent to stderr for each mmx operation. + This adds lots of code, and obviously slows execution to + a crawl, but can be very useful for debugging. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT + LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR ANY PARTICULAR PURPOSE. + + 1997-99 by H. Dietz and R. Fisher + + Notes: + It appears that the latest gas has the pand problem fixed, therefore + I'll undefine BROKEN_PAND by default. +*/ + +#ifndef _MMX_H +#define _MMX_H + +#include "goom_graphic.h" + +/* Warning: at this writing, the version of GAS packaged + with most Linux distributions does not handle the + parallel AND operation mnemonic correctly. If the + symbol BROKEN_PAND is defined, a slower alternative + coding will be used. If execution of mmxtest results + in an illegal instruction fault, define this symbol. +*/ +#undef BROKEN_PAND + + +/* The type of an value that fits in an MMX register + (note that long long constant values MUST be suffixed + by LL and unsigned long long values by ULL, lest + they be truncated by the compiler) +*/ +typedef union { + long long q; /* Quadword (64-bit) value */ + unsigned long long uq; /* Unsigned Quadword */ + int d[2]; /* 2 Doubleword (32-bit) values */ + unsigned int ud[2]; /* 2 Unsigned Doubleword */ + short w[4]; /* 4 Word (16-bit) values */ + unsigned short uw[4]; /* 4 Unsigned Word */ + char b[8]; /* 8 Byte (8-bit) values */ + unsigned char ub[8]; /* 8 Unsigned Byte */ + float s[2]; /* Single-precision (32-bit) value */ +} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ + + + +/* Function to test if multimedia instructions are supported... +*/ +static int +mm_support(void) +{ + /* Returns 1 if MMX instructions are supported, + 3 if Cyrix MMX and Extended MMX instructions are supported + 5 if AMD MMX and 3DNow! instructions are supported + 13 if AMD Extended MMX, &3dNow supported + 0 if hardware does not support any of these + */ + register int rval = 0; + + __asm__ __volatile__ ( + /* See if CPUID instruction is supported ... */ + /* ... Get copies of EFLAGS into eax and ecx */ + "pushl %%ebx\n\t" + "pushf\n\t" + "popl %%eax\n\t" + "movl %%eax, %%ecx\n\t" + + /* ... Toggle the ID bit in one copy and store */ + /* to the EFLAGS reg */ + "xorl $0x200000, %%eax\n\t" + "push %%eax\n\t" + "popf\n\t" + + /* ... Get the (hopefully modified) EFLAGS */ + "pushf\n\t" + "popl %%eax\n\t" + + /* ... Compare and test result */ + "xorl %%eax, %%ecx\n\t" + "testl $0x200000, %%ecx\n\t" + "jz NotSupported1\n\t" /* CPUID not supported */ + + + /* Get standard CPUID information, and + go to a specific vendor section */ + "movl $0, %%eax\n\t" + "cpuid\n\t" + + /* Check for Intel */ + "cmpl $0x756e6547, %%ebx\n\t" + "jne TryAMD\n\t" + "cmpl $0x49656e69, %%edx\n\t" + "jne TryAMD\n\t" + "cmpl $0x6c65746e, %%ecx\n" + "jne TryAMD\n\t" + "jmp Intel\n\t" + + /* Check for AMD */ + "\nTryAMD:\n\t" + "cmpl $0x68747541, %%ebx\n\t" + "jne TryCyrix\n\t" + "cmpl $0x69746e65, %%edx\n\t" + "jne TryCyrix\n\t" + "cmpl $0x444d4163, %%ecx\n" + "jne TryCyrix\n\t" + "jmp AMD\n\t" + + /* Check for Cyrix */ + "\nTryCyrix:\n\t" + "cmpl $0x69727943, %%ebx\n\t" + "jne NotSupported2\n\t" + "cmpl $0x736e4978, %%edx\n\t" + "jne NotSupported3\n\t" + "cmpl $0x64616574, %%ecx\n\t" + "jne NotSupported4\n\t" + /* Drop through to Cyrix... */ + + + /* Cyrix Section */ + /* See if extended CPUID level 80000001 is supported */ + /* The value of CPUID/80000001 for the 6x86MX is undefined + according to the Cyrix CPU Detection Guide (Preliminary + Rev. 1.01 table 1), so we'll check the value of eax for + CPUID/0 to see if standard CPUID level 2 is supported. + According to the table, the only CPU which supports level + 2 is also the only one which supports extended CPUID levels. + */ + "cmpl $0x2, %%eax\n\t" + "jne MMXtest\n\t" /* Use standard CPUID instead */ + + /* Extended CPUID supported (in theory), so get extended + features */ + "movl $0x80000001, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%eax\n\t" /* Test for MMX */ + "jz NotSupported5\n\t" /* MMX not supported */ + "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ + "jnz EMMXSupported\n\t" + "movl $1, %0\n\n\t" /* MMX Supported */ + "jmp Return\n\n" + "EMMXSupported:\n\t" + "movl $3, %0\n\n\t" /* EMMX and MMX Supported */ + "jmp Return\n\t" + + + /* AMD Section */ + "AMD:\n\t" + + /* See if extended CPUID is supported */ + "movl $0x80000000, %%eax\n\t" + "cpuid\n\t" + "cmpl $0x80000000, %%eax\n\t" + "jl MMXtest\n\t" /* Use standard CPUID instead */ + + /* Extended CPUID supported, so get extended features */ + "movl $0x80000001, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%edx\n\t" /* Test for MMX */ + "jz NotSupported6\n\t" /* MMX not supported */ + "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ + "jnz ThreeDNowSupported\n\t" + "movl $1, %0\n\n\t" /* MMX Supported */ + "jmp Return\n\n" + "ThreeDNowSupported:\n\t" + "testl $0x40000000, %%edx\n\t" /* Test AMD Extended MMX */ + "jnz AMDXMMXSupported\n\t" + "movl $5, %0\n\n\t" /* 3DNow! and MMX Supported */ + "jmp Return\n\t" + "AMDXMMXSupported:\n\t" + "movl $13, %0\n\n\t" /* XMMX, 3DNow! and MMX Supported */ + "jmp Return\n\t" + + + /* Intel Section */ + "Intel:\n\t" + + /* Check for MMX */ + "MMXtest:\n\t" + "movl $1, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%edx\n\t" /* Test for MMX */ + "jz NotSupported7\n\t" /* MMX Not supported */ + "movl $1, %0\n\n\t" /* MMX Supported */ + "jmp Return\n\t" + + /* Nothing supported */ + "\nNotSupported1:\n\t" + "#movl $101, %0\n\n\t" + "\nNotSupported2:\n\t" + "#movl $102, %0\n\n\t" + "\nNotSupported3:\n\t" + "#movl $103, %0\n\n\t" + "\nNotSupported4:\n\t" + "#movl $104, %0\n\n\t" + "\nNotSupported5:\n\t" + "#movl $105, %0\n\n\t" + "\nNotSupported6:\n\t" + "#movl $106, %0\n\n\t" + "\nNotSupported7:\n\t" + "#movl $107, %0\n\n\t" + "movl $0, %0\n\n\t" + + "Return:\n\t" + "popl %%ebx\n\t" + : "=X" (rval) + : /* no input */ + : "eax", "ecx", "edx" + ); + + /* Return */ + return(rval); +} + +/* Function to test if mmx instructions are supported... +*/ +static inline int +mmx_ok(void) +{ + /* Returns 1 if MMX instructions are supported, 0 otherwise */ + return ( mm_support() & 0x1 ); +} + +int mmx_supported (void); +int xmmx_supported (void); + + +/* MMX optimized implementations */ +void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +void zoom_filter_mmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2, + int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +void zoom_filter_xmmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2, + int *lbruS, int *lbruD, int buffratio, int precalCoef[16][16]); + + +/* Helper functions for the instruction macros that follow... + (note that memory-to-register, m2r, instructions are nearly + as efficient as register-to-register, r2r, instructions; + however, memory-to-memory instructions are really simulated + as a convenience, and are only 1/3 as efficient) +*/ +#ifdef MMX_TRACE + +/* Include the stuff for printing a trace to stderr... +*/ + +#include <stdio.h> + +#define mmx_i2r(op, imm, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace.uq = (imm); \ + printf(#op "_i2r(" #imm "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2r(op, mem, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mem); \ + printf(#op "_m2r(" #mem "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "m" (mem)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2m(op, reg, mem) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#op "_r2m(" #reg "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (mem); \ + printf(#mem "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=m" (mem) \ + : /* nothing */ ); \ + mmx_trace = (mem); \ + printf(#mem "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2r(op, regs, regd) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #regs ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#op "_r2r(" #regs "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#regd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#regd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2m(op, mems, memd) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mems); \ + printf(#op "_m2m(" #mems "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (memd); \ + printf(#memd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=m" (memd) \ + : "m" (mems)); \ + mmx_trace = (memd); \ + printf(#memd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#else + +/* These macros are a lot simpler without the tracing... +*/ + +#define mmx_i2r(op, imm, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm) ) + +#define mmx_m2r(op, mem, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "m" (mem)) + +#define mmx_r2m(op, reg, mem) \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=m" (mem) \ + : /* nothing */ ) + +#define mmx_r2r(op, regs, regd) \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd) + +#define mmx_m2m(op, mems, memd) \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=m" (memd) \ + : "m" (mems)) + +#endif + + +/* 1x64 MOVe Quadword + (this is both a load and a store... + in fact, it is the only way to store) +*/ +#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +#define movq(vars, vard) \ + __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 1x32 MOVe Doubleword + (like movq, this is both load and store... + but is most useful for moving things between + mmx registers and ordinary registers) +*/ +#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +#define movd(vars, vard) \ + __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ + "movd %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 2x32, 4x16, and 8x8 Parallel ADDs +*/ +#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) +#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) +#define paddd(vars, vard) mmx_m2m(paddd, vars, vard) + +#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) +#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) +#define paddw(vars, vard) mmx_m2m(paddw, vars, vard) + +#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) +#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) +#define paddb(vars, vard) mmx_m2m(paddb, vars, vard) + + +/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic +*/ +#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) +#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) +#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) + +#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) +#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) +#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) + + +/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic +*/ +#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) +#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) +#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) + +#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) +#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) +#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel SUBs +*/ +#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) +#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) +#define psubd(vars, vard) mmx_m2m(psubd, vars, vard) + +#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) +#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) +#define psubw(vars, vard) mmx_m2m(psubw, vars, vard) + +#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) +#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) +#define psubb(vars, vard) mmx_m2m(psubb, vars, vard) + + +/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic +*/ +#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) +#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) +#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) + +#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) +#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) +#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) + + +/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic +*/ +#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) +#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) +#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) + +#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) +#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) +#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) + + +/* 4x16 Parallel MULs giving Low 4x16 portions of results +*/ +#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) +#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) +#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results +*/ +#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) +#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) +#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) + + +/* 4x16->2x32 Parallel Mul-ADD + (muls like pmullw, then adds adjacent 16-bit fields + in the multiply result to make the final 2x32 result) +*/ +#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) +#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) +#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) + + +/* 1x64 bitwise AND +*/ +#ifdef BROKEN_PAND +#define pand_m2r(var, reg) \ + { \ + mmx_m2r(pandn, (mmx_t) -1LL, reg); \ + mmx_m2r(pandn, var, reg); \ + } +#define pand_r2r(regs, regd) \ + { \ + mmx_m2r(pandn, (mmx_t) -1LL, regd); \ + mmx_r2r(pandn, regs, regd) \ + } +#define pand(vars, vard) \ + { \ + movq_m2r(vard, mm0); \ + mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ + mmx_m2r(pandn, vars, mm0); \ + movq_r2m(mm0, vard); \ + } +#else +#define pand_m2r(var, reg) mmx_m2r(pand, var, reg) +#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) +#define pand(vars, vard) mmx_m2m(pand, vars, vard) +#endif + + +/* 1x64 bitwise AND with Not the destination +*/ +#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) +#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) +#define pandn(vars, vard) mmx_m2m(pandn, vars, vard) + + +/* 1x64 bitwise OR +*/ +#define por_m2r(var, reg) mmx_m2r(por, var, reg) +#define por_r2r(regs, regd) mmx_r2r(por, regs, regd) +#define por(vars, vard) mmx_m2m(por, vars, vard) + + +/* 1x64 bitwise eXclusive OR +*/ +#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) +#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) +#define pxor(vars, vard) mmx_m2m(pxor, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality + (resulting fields are either 0 or -1) +*/ +#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) +#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) +#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) + +#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) +#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) +#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) + +#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) +#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) +#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than + (resulting fields are either 0 or -1) +*/ +#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) +#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) +#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) + +#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) +#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) +#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) + +#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) +#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) +#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) + + +/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical +*/ +#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) +#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) +#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) +#define psllq(vars, vard) mmx_m2m(psllq, vars, vard) + +#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) +#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) +#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) +#define pslld(vars, vard) mmx_m2m(pslld, vars, vard) + +#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) +#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) +#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) +#define psllw(vars, vard) mmx_m2m(psllw, vars, vard) + + +/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical +*/ +#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) +#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) +#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) +#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) + +#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) +#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) +#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) +#define psrld(vars, vard) mmx_m2m(psrld, vars, vard) + +#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) +#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) +#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) +#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) + + +/* 2x32 and 4x16 Parallel Shift Right Arithmetic +*/ +#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) +#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) +#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) +#define psrad(vars, vard) mmx_m2m(psrad, vars, vard) + +#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) +#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) +#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) +#define psraw(vars, vard) mmx_m2m(psraw, vars, vard) + + +/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate + (packs source and dest fields into dest in that order) +*/ +#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) +#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) +#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) + +#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) +#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) +#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) + + +/* 4x16->8x8 PACK and Unsigned Saturate + (packs source and dest fields into dest in that order) +*/ +#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) +#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) +#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) + + +/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low + (interleaves low half of dest with low half of source + as padding in each result field) +*/ +#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) +#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) +#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) + +#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) +#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) +#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) + +#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) +#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) +#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) + + +/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High + (interleaves high half of dest with high half of source + as padding in each result field) +*/ +#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) +#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) +#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) + +#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) +#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) +#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) + +#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) +#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) +#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) + + +/* Empty MMx State + (used to clean-up when going from mmx to float use + of the registers that are shared by both; note that + there is no float-to-mmx operation needed, because + only the float tag word info is corruptible) +*/ +#ifdef MMX_TRACE + +#define emms() \ + { \ + printf("emms()\n"); \ + __asm__ __volatile__ ("emms" \ + "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)"); \ + } + +#else + +#define emms() __asm__ __volatile__ ("emms"::: \ + "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)") + +#endif + +#endif + diff --git a/src/visualizations/Goom/goom2k4-0/src/motif_goom1.h b/src/visualizations/Goom/goom2k4-0/src/motif_goom1.h new file mode 100644 index 0000000000..b4a9f3f1d2 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/motif_goom1.h @@ -0,0 +1,1026 @@ +static Motif CONV_MOTIF1 = { + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,13,9,9,7,2,2,9,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, + 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,12,7,4,0,0,0,2,0,0,3,14,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,12,10,9,9,4,1,0, + 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,10,3,0,0,0,1,1,3,5,0,0,1,14,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,6,3,1,1,4,9,1, + 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 10,3,0,0,2,7,13,14,14,14,7,0,0,2,14,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,12,1,9,15,15,15,15,3, + 0,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,4, + 0,0,2,10,15,15,15,15,15,15,1,0,0,10,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,9,0,2,14,15,15,15,7, + 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,14,6,0,0, + 2,9,15,15,15,15,15,15,15,13,0,0,3,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,11,0,0,10,15,15,15,9, + 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,13,3,0,1,5, + 5,4,4,4,6,12,15,15,15,13,0,0,7,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,0,0,5,15,15,15,10, + 0,7,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,11,1,0,3,3,1, + 0,0,0,0,0,0,5,13,15,12,0,0,13,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,13,14,15, + 15,15,15,15,15,15,15,15,14,0,0,1,15,15,15,12, + 0,3,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,10,1,2,4,0,0,1, + 9,12,12,12,9,3,0,2,14,5,0,7,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,14,7,4,4,1,1,12, + 15,15,15,15,15,15,15,15,14,1,0,0,12,15,15,15, + 1,0,12,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,10,0,3,2,0,0,3,12, + 15,15,15,15,15,14,2,1,13,2,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,3,0,0,0,0,0,2, + 13,15,15,15,15,15,15,15,14,1,0,0,8,15,15,15, + 1,0,9,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,12,2,1,0,0,0,9,14,15, + 15,15,15,15,15,14,1,1,11,0,3,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,7,4,11,12,10,1,0, + 3,12,15,15,15,15,15,15,13,1,1,0,4,15,15,15, + 2,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,2,1,0,0,3,12,15,15,15, + 15,15,15,15,15,11,0,5,9,1,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,5,1,13,15,15,12,1, + 0,1,9,15,15,15,15,15,14,2,5,0,1,14,15,15, + 2,0,7,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,14,3,0,0,0,7,14,15,15,15,15, + 15,15,15,15,15,9,0,8,7,4,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,7,0,7,8,11,15,13, + 2,0,0,3,10,15,15,15,15,5,11,0,0,11,15,15, + 6,0,2,14,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,6,0,0,0,8,15,15,15,15,15,15, + 15,15,15,15,15,6,0,4,0,6,15,15,15,15,15,15, + 14,9,14,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,11,0,3,3,0,8,15, + 14,5,0,0,0,4,12,15,15,5,13,2,0,6,15,15, + 12,0,0,11,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,10,0,0,0,8,15,15,15,15,15,15,15, + 15,15,15,15,10,1,7,6,4,13,15,15,15,15,13,11, + 6,0,8,11,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,1,1,11,2,0,5, + 14,15,8,0,0,0,0,7,15,5,14,6,0,2,15,15, + 15,3,0,5,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,1,0,0,7,15,15,15,15,15,15,15,15, + 15,15,15,15,7,9,15,15,15,15,15,15,12,6,2,1, + 1,1,8,6,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,4,0,6,12,1,0, + 3,13,15,11,2,0,0,0,8,4,14,10,0,0,13,15, + 15,7,0,1,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,5,0,0,5,15,15,15,15,15,15,15,15,15, + 15,15,15,15,13,15,15,15,15,14,8,3,1,2,7,11, + 5,4,5,6,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,8,0,1,14,11,0, + 0,1,9,15,14,5,0,0,2,4,14,13,0,0,10,15, + 15,12,0,0,12,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,10,0,0,1,14,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,13,7,2,0,5,9,15,15,15, + 5,3,6,9,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,13,0,0,9,15,12, + 2,0,0,4,13,14,4,0,3,2,12,15,1,0,5,15, + 15,14,1,0,8,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,2,0,0,9,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,11,6,1,0,2,3,10,15,15,15,15,7, + 1,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,5,0,3,14,15, + 9,2,0,0,1,6,12,13,13,1,9,12,0,0,2,14, + 15,15,4,0,4,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,10,0,0,2,14,15,15,15,15,15,15,15,15,15,15, + 13,9,6,0,1,2,9,10,15,15,15,15,14,7,1,0, + 6,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,11,0,0,9,15, + 4,4,11,6,1,0,0,1,1,0,10,4,0,0,0,12, + 15,15,9,0,1,14,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,3,0,0,8,15,15,15,15,15,15,15,13,12,4,4, + 1,1,3,10,12,15,15,15,15,15,9,2,1,0,1,6, + 6,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,4,0,3,14, + 4,3,15,15,14,9,7,9,1,0,0,0,0,1,0,7, + 15,15,13,0,0,9,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 13,0,0,1,14,15,15,15,15,15,12,9,1,0,1,4, + 7,15,15,15,15,15,15,14,8,2,0,0,0,2,13,9, + 0,4,14,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,11,0,0,9, + 3,0,8,14,15,15,15,15,10,5,4,4,7,4,0,3, + 15,15,15,4,0,3,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 5,0,0,5,15,15,15,15,14,8,7,8,10,12,14,15, + 15,15,15,15,15,15,11,1,0,0,0,5,11,15,13,1, + 1,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,3,0,4, + 4,0,0,2,6,10,15,15,15,15,15,15,15,10,0,0, + 12,15,15,9,0,0,12,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 1,0,0,10,15,15,15,15,15,13,14,15,15,15,15,15, + 15,15,15,15,14,7,1,0,0,3,12,15,15,15,6,0, + 7,15,15,15,12,10,9,10,12,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,9,0,0, + 8,3,1,4,1,0,1,12,15,15,15,15,15,14,2,0, + 6,15,15,15,2,0,6,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 0,0,1,14,15,15,15,15,14,5,15,15,15,15,15,15, + 15,15,15,7,2,0,0,1,8,15,15,15,15,12,0,2, + 14,15,12,4,0,0,0,0,0,1,5,10,14,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,14,0,0, + 5,4,1,14,15,10,7,13,15,15,15,15,15,15,8,0, + 1,14,15,15,7,0,1,14,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 0,0,4,15,15,15,15,15,13,2,13,15,15,15,15,15, + 12,7,0,0,0,0,5,12,15,15,15,15,14,3,0,9, + 11,1,0,0,1,1,0,1,0,0,0,0,2,12,15,15, + 15,15,15,15,15,15,15,14,15,15,15,15,15,15,2,0, + 5,2,1,14,15,14,13,15,15,15,15,15,15,15,12,0, + 0,10,15,15,13,0,0,9,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, + 0,0,4,15,15,15,15,15,12,0,12,15,15,15,12,6, + 0,0,0,0,6,14,15,15,15,15,15,15,7,0,0,12, + 1,0,0,2,2,1,1,7,12,8,3,0,0,1,13,15, + 15,15,15,15,15,8,4,8,12,15,15,15,15,15,8,0, + 4,2,0,14,15,11,9,15,15,15,15,15,15,15,15,3, + 0,5,15,15,15,5,0,3,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, + 0,0,4,15,15,15,15,15,12,0,12,15,13,3,1,0, + 0,0,5,12,15,15,15,15,15,15,15,12,0,0,7,7, + 0,0,0,0,0,0,0,1,12,15,15,12,3,0,5,15, + 15,15,15,14,5,0,0,0,0,2,2,3,7,14,9,8, + 14,2,1,14,15,2,12,13,15,15,15,15,15,15,15,9, + 0,0,13,15,15,10,0,0,12,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 0,0,5,15,15,15,15,15,12,0,11,10,1,0,0,1, + 5,14,15,15,15,15,15,15,15,15,15,6,0,2,7,0, + 0,0,0,1,2,7,4,0,3,14,15,15,14,2,0,12, + 15,15,15,9,0,1,2,1,0,0,0,0,0,1,3,7, + 15,3,0,14,15,4,12,15,15,15,15,15,15,15,15,14, + 1,0,8,15,15,14,1,0,8,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 0,0,4,15,15,15,15,15,12,0,2,0,0,1,10,15, + 15,15,15,15,15,15,15,15,15,15,12,0,0,6,0,0, + 0,1,10,14,15,15,11,1,0,9,15,15,15,8,0,9, + 15,15,12,4,8,14,15,8,1,0,0,0,0,0,1,9, + 15,2,0,13,15,1,9,15,15,15,15,15,15,15,15,15, + 6,0,1,14,15,14,1,0,3,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, + 1,0,1,14,15,15,15,15,12,1,3,7,9,13,15,15, + 15,15,15,15,15,15,15,15,15,15,3,0,2,3,0,4, + 0,8,15,15,15,15,15,13,1,2,14,15,15,10,0,6, + 15,14,2,6,15,15,15,1,3,7,3,0,0,0,0,1, + 11,1,0,11,12,0,12,15,15,15,15,15,15,15,15,15, + 11,0,0,9,15,15,4,0,0,12,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 6,0,0,9,15,15,15,15,15,12,14,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,11,0,0,3,0,8,14, + 2,5,15,15,15,15,15,15,5,0,8,15,15,12,0,4, + 15,5,2,14,15,15,10,0,13,15,13,2,4,5,5,0, + 9,1,0,10,9,1,14,15,15,15,15,15,15,15,15,15, + 13,0,0,3,15,15,9,0,0,8,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 12,0,0,3,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,3,0,1,1,5,14,15, + 11,0,12,15,15,15,15,15,14,1,1,14,15,12,0,4, + 10,0,9,15,15,11,1,8,15,15,8,1,14,15,14,2, + 5,0,0,10,6,2,15,15,15,15,15,15,15,15,15,15, + 15,3,0,0,12,15,13,0,0,2,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,3,0,0,10,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,10,0,0,1,0,11,15,15, + 15,2,6,15,15,15,15,15,15,6,0,9,15,13,0,6, + 3,0,13,15,14,2,6,15,15,13,1,8,15,15,15,4, + 3,1,0,10,7,2,15,15,15,15,15,15,15,15,15,15, + 15,9,0,0,6,15,15,3,0,0,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,9,0,0,2,14,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,11,10,2,0,3,0,3,15,15,15, + 15,8,1,14,15,15,15,15,15,13,0,2,15,9,1,10, + 0,3,15,15,6,2,14,15,14,3,1,14,15,15,15,2, + 4,0,0,12,5,3,15,15,15,15,15,15,15,15,15,15, + 15,14,1,0,1,14,15,5,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,4,0,0,6,15,15,15,15,15,15,15,15,14,12, + 12,9,5,4,4,3,0,0,0,0,4,0,8,15,15,15, + 15,13,1,10,15,15,15,15,15,15,2,0,11,3,5,10, + 0,7,15,9,1,11,15,15,8,0,6,15,15,15,10,0, + 3,0,0,13,3,6,15,15,15,15,15,15,15,15,15,15, + 15,15,6,0,0,12,15,5,0,0,7,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,13,1,0,0,8,14,15,15,13,6,4,4,1,0, + 0,0,0,0,0,0,2,0,0,4,3,0,12,15,15,15, + 15,15,5,3,15,15,15,15,14,8,0,0,1,1,12,9, + 0,9,10,0,6,15,15,15,2,2,14,15,15,13,2,0, + 4,0,1,13,0,10,15,15,15,15,15,15,15,15,15,15, + 15,15,13,1,0,10,15,10,0,0,5,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,9,0,0,0,3,2,2,1,0,0,0,1,4, + 4,5,10,12,12,12,11,0,0,11,4,0,12,15,15,15, + 15,15,12,0,7,13,15,15,5,0,0,0,1,6,15,9, + 0,3,0,0,1,6,14,10,0,12,15,15,11,2,0,2, + 3,0,3,12,1,11,15,15,15,15,15,15,15,15,15,15, + 15,15,15,3,0,6,8,7,0,0,5,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,9,1,0,0,0,2,6,10,12,12,14,15, + 15,15,15,15,11,5,4,0,2,14,4,0,12,15,15,15, + 15,15,15,4,0,3,13,6,0,0,0,1,2,14,15,12, + 0,0,0,0,0,0,2,2,6,15,14,8,0,0,0,7, + 4,0,4,12,0,12,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,0,0,0,0,0,1,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,12,2,0,0,0,1,6,11,15,15,15, + 15,15,15,15,2,1,0,0,9,15,6,0,7,15,15,15, + 15,15,15,13,2,0,0,0,0,0,0,1,12,15,15,15, + 4,0,0,0,0,0,0,6,13,6,1,0,0,4,13,15, + 6,0,6,12,0,12,15,15,15,15,15,15,15,15,15,15, + 15,15,15,14,5,0,0,0,0,0,5,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,5,0,0,0,0,0,2,4,5, + 7,3,6,3,0,2,0,2,15,15,11,0,0,9,15,15, + 15,15,15,15,11,0,0,0,0,0,2,11,15,15,15,15, + 12,1,0,0,1,4,6,10,2,0,0,0,7,14,15,15, + 9,0,9,9,0,12,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,13,9,8,9,7,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,12,6,1,0,0,0,0,0, + 0,0,0,2,8,0,0,9,15,15,14,4,0,0,3,10, + 14,15,15,15,15,13,3,0,0,4,14,15,15,15,15,15, + 15,11,2,0,0,1,1,0,0,0,1,11,15,15,15,15, + 9,0,10,5,3,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,14,12,10,5,4,6, + 2,4,10,14,8,0,1,14,15,15,15,14,5,0,0,0, + 1,2,4,4,4,3,1,2,9,14,15,15,15,15,15,15, + 15,15,15,11,11,13,10,9,9,11,15,15,15,15,15,15, + 10,0,8,2,4,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 2,7,15,14,1,0,6,15,15,15,15,15,15,10,6,4, + 2,2,4,4,4,3,9,14,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 11,0,3,1,4,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, + 1,10,15,9,0,0,13,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 11,0,11,11,11,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,2, + 5,15,14,2,0,5,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 14,1,13,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,10,1, + 13,15,11,0,0,12,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,5,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,8,1, + 15,15,5,0,3,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,10,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,12,2,3, + 15,14,1,0,7,15,15,15,15,15,13,15,15,15,15,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,13,12,12,11,9,4,7,14,15, + 14,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,12,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,14,3,0,10, + 15,9,0,0,8,7,4,2,2,1,0,3,4,3,4,9, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,14,13,11,7,4,2,0,0,0,0,0,0,1,12,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,14,13,11,7,4,2,2,13,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,12,0,3,11, + 7,1,0,0,0,0,0,1,4,9,11,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,14,12,11,9,7,4, + 3,1,0,0,0,0,0,0,0,0,0,2,11,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,13,11,8, + 4,3,1,0,0,0,0,3,8,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,14,11,3,0,0,0, + 0,0,0,2,6,9,12,14,15,15,15,15,15,15,15,15, + 15,15,15,15,15,13,9,6,3,1,0,0,0,0,0,0, + 0,0,0,0,1,4,7,11,12,12,12,14,15,15,15,15, + 15,15,15,15,15,15,15,14,12,11,7,4,2,0,0,0, + 0,0,0,1,5,10,13,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,12,7,3,1,0,0,0,2,5, + 2,0,2,14,15,15,15,15,15,15,15,15,15,14,13,12, + 11,9,6,4,2,0,0,0,0,0,0,0,0,1,2,4, + 5,9,11,13,15,15,15,15,15,15,15,15,15,15,15,15, + 15,14,12,11,7,4,3,1,0,0,0,0,0,0,0,1, + 4,5,10,14,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,10,5,1,0,0,0,1,0,0,2,13,14, + 1,0,8,15,15,14,12,11,9,8,4,3,2,1,0,0, + 0,0,0,0,1,3,2,3,5,9,10,12,13,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,13,11,10,6,4, + 3,1,0,0,0,0,0,0,0,0,1,4,7,11,13,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,11,4,0,0,0,1,4,9,13,13,1,0,0,1,7, + 0,0,7,8,5,2,0,0,0,0,0,0,1,2,3,4, + 5,9,10,12,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,14,11,8,4,3,1,0,0,0,0,0, + 0,0,0,0,1,4,5,9,12,13,15,15,15,15,15,15, + 15,15,14,12,9,8,8,7,4,2,5,4,5,5,12,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,14,10,5, + 1,0,1,3,6,11,14,15,15,15,15,13,12,8,3,2, + 0,0,1,1,3,3,4,5,8,10,12,13,14,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 11,9,6,4,2,1,0,0,0,0,0,0,0,1,2,4, + 6,10,11,13,15,15,15,15,15,15,15,15,13,11,9,7, + 4,2,1,0,0,0,0,2,4,7,12,14,14,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,10,5,1,1,3, + 8,12,14,15,15,15,15,15,15,15,15,15,15,15,15,9, + 3,11,14,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,8,6,9,9,9,9,9,8,5,4,4,3,1,0, + 0,0,0,0,1,2,3,2,4,5,9,11,12,14,15,15, + 15,15,15,15,15,15,15,14,12,9,5,2,0,0,0,0, + 0,1,2,4,7,10,14,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,9,4,1,3,9,13,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,13,3,1,1,1,1,1,1,1,0,0,0,0,2,3, + 5,8,10,12,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,12,5,2,0,0,0,1,3,4,7,10, + 12,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,13,11,13,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,14,12,12,12,13,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,8,1,0,1,4,7,11,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,7,8,11,14,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 + }; diff --git a/src/visualizations/Goom/goom2k4-0/src/motif_goom2.h b/src/visualizations/Goom/goom2k4-0/src/motif_goom2.h new file mode 100644 index 0000000000..4bde2a3d0a --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/motif_goom2.h @@ -0,0 +1,1026 @@ +static Motif CONV_MOTIF2 = { + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,12,5,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,12,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,10,1,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,10,0,12,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,6,0,12, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,7,0,8,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,13,2,0,10, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,6,0,2,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,5,0,0,10, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,9,0,0,12,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,14,9,0,0,1,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,8,0,0,8,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,8,3,0,0,0,9,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,11,0,0,2,14,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,9,5,3,4,1,0,0,0,0,7,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,14,4,0,0,4,11,13,13,15,15,14,12,10,8,5, + 6,4,1,0,0,0,0,0,0,0,0,0,0,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,12,1,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,9,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 13,9,10,13,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,3,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,2,5,6,0,0,0,0,12,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 5,0,0,0,3,10,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,14,9,2,1,0,0,0,1,4,6,6,1, + 0,0,0,8,13,15,15,15,12,1,0,2,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, + 2,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,3,0,0,10,15,15,15,10, + 0,0,4,15,15,15,15,15,15,2,0,6,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,5, + 3,11,5,0,0,0,0,0,4,11,14,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,0,13,15,15,15,11, + 0,0,7,15,15,15,15,15,15,1,0,9,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,9,0, + 13,15,15,12,5,0,0,0,0,0,1,8,14,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,1,14,15,15,15,11, + 0,0,7,15,15,15,15,15,14,0,0,9,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,11,1,10, + 15,15,15,15,15,11,5,0,0,0,0,0,1,6,13,15, + 15,15,15,15,14,8,11,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,6,0,2,15,15,15,15,11, + 0,0,6,15,15,15,15,15,13,0,0,11,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,11,1,6,15, + 15,15,15,15,15,15,15,14,5,0,0,0,0,0,0,6, + 14,15,15,15,6,0,4,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,5,15,15,15,15,11, + 0,0,5,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,13,2,1,13,15, + 15,15,15,15,15,15,15,15,15,12,2,0,0,0,0,0, + 1,6,11,7,0,0,4,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,7,15,15,15,15,11, + 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,5,0,7,15,15, + 15,15,15,15,15,15,15,15,15,15,15,11,5,0,0,0, + 0,0,0,0,0,1,11,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,10,0,4,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,13,7,0, + 0,0,0,0,0,1,6,12,14,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,7,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,13,1,1,12,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 5,0,0,0,0,0,0,0,3,10,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,7,15,15,15,15,15,11,0,0,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,4,0,8,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 13,0,0,0,1,0,0,0,0,1,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,8,15,15,15,15,15,8,0,2,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,9,0,4,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, + 4,0,0,5,13,12,6,2,0,2,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,7,15,15,15,15,15,4,0,4,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,13,1,1,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, + 0,0,1,13,15,15,15,14,9,13,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,5,0,6,15,15,15,15,11, + 0,0,8,15,15,15,15,15,2,0,8,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,5,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,14,11,15,15,15,15,15,15,15,9, + 0,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11, + 0,0,7,15,15,15,15,13,0,0,11,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,10,0,3,14,15,15,15,15,15,15, + 15,15,15,15,15,14,3,0,13,15,15,15,15,15,15,14, + 9,11,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11, + 0,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,14,2,1,12,15,15,15,15,15,15,15, + 15,15,15,15,14,3,0,0,9,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,6,0,3,15,15,15,15,13, + 1,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,9,0,5,15,15,15,15,15,15,15,15, + 15,15,15,14,4,0,0,0,10,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,8,0,2,15,15,15,15,15, + 3,0,13,15,15,15,15,12,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,13,2,1,12,15,15,15,15,15,15,15,15, + 15,15,15,7,0,0,0,0,8,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,10,0,1,14,15,15,15,15, + 11,5,15,15,15,15,15,12,0,0,11,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,6,0,7,15,15,15,15,15,15,15,15,15, + 15,15,8,0,0,0,0,0,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,14,15,15,15,15,15,10,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,1,2,14,15,15,15,15,15,15,15,15,15, + 15,10,0,0,0,6,6,0,0,0,5,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,12, + 15,15,15,15,15,15,15,15,13,0,0,11,15,15,15,15, + 15,15,15,15,15,15,15,9,0,1,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,7,0,8,15,15,15,15,15,15,15,15,15,15, + 15,9,0,0,4,15,15,8,0,0,0,1,5,13,15,15, + 15,15,15,15,15,15,15,15,15,15,12,8,7,6,5,3, + 3,3,4,12,15,15,15,15,15,15,15,15,15,7,0,6, + 15,15,15,15,15,15,15,15,14,1,0,10,15,15,15,15, + 15,15,15,15,15,15,15,6,0,3,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,13,1,0,13,15,15,15,15,15,15,15,15,15,15, + 15,14,7,8,13,15,15,15,11,2,0,0,0,0,5,11, + 15,15,15,15,15,15,15,15,13,3,0,0,0,0,0,0, + 0,0,0,5,15,15,15,15,15,15,15,15,12,1,0,0, + 3,11,15,15,15,15,15,15,13,1,0,10,15,15,15,15, + 15,15,15,15,15,15,15,3,0,5,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,9,0,5,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,14,8,1,0,0,0,0, + 4,12,15,15,15,15,15,15,4,0,0,0,0,0,0,0, + 0,0,0,2,15,15,15,15,15,15,15,14,4,0,0,0, + 0,0,9,15,15,15,15,15,14,1,0,10,15,15,15,15, + 15,15,15,15,15,15,15,2,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,14,4,0,11,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,14,8,2,0,0, + 0,0,4,10,14,15,15,15,4,0,0,0,0,0,0,0, + 0,0,0,3,15,15,15,15,15,15,15,6,0,0,0,2, + 3,0,0,8,15,15,15,15,14,1,0,10,15,15,15,15, + 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 14,5,0,4,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,14,9,3, + 0,0,0,0,2,5,10,15,5,0,1,11,11,12,13,15, + 11,0,0,7,15,15,15,15,15,15,8,0,0,0,1,12, + 14,6,0,0,7,14,15,15,14,1,0,9,15,15,15,15, + 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 9,0,1,13,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, + 10,2,0,0,0,0,1,14,4,0,1,14,15,15,15,15, + 9,0,0,9,15,15,15,15,15,9,0,0,0,0,9,15, + 15,15,7,0,0,6,14,15,15,3,0,6,15,15,15,15, + 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9, + 0,0,1,10,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,13,1,0,0,0,1,14,3,0,0,14,15,15,15,15, + 5,0,0,11,15,15,15,15,13,1,0,0,0,6,15,15, + 15,15,15,8,0,0,2,10,15,6,0,3,15,15,15,15, + 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1, + 0,0,0,0,3,9,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,6,1,0,0,0,8,15,1,0,0,14,15,15,15,15, + 4,0,0,13,15,15,15,14,4,0,0,0,3,14,15,15, + 15,15,15,15,5,0,0,1,14,9,0,1,14,15,15,15, + 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1, + 0,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 9,0,0,0,0,7,15,15,1,0,0,14,15,15,15,14, + 2,0,1,14,15,15,15,12,0,0,0,3,13,15,15,15, + 15,15,15,9,0,0,0,1,14,12,0,0,12,15,15,15, + 15,15,15,15,15,15,14,1,0,10,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, + 3,0,0,0,0,0,0,1,8,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9, + 0,0,0,0,7,15,15,15,1,0,0,14,15,15,15,13, + 0,0,1,15,15,15,15,12,0,0,0,6,14,15,15,15, + 15,15,12,0,0,0,0,3,14,12,0,0,12,15,15,15, + 15,15,15,15,15,15,12,0,0,12,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,13,3,0,0,0,0,0,0,1,6,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,0, + 0,0,0,3,15,15,15,12,0,0,0,14,15,15,15,11, + 0,0,3,15,15,15,15,15,12,7,0,0,4,14,15,15, + 15,11,1,0,0,0,4,13,15,12,0,0,12,15,15,15, + 15,15,15,15,15,15,10,0,1,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,7,0,0,0,0,0,0,0,3,8,12,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,4,0, + 0,0,1,13,15,15,15,6,0,0,0,14,15,15,15,8, + 0,0,7,15,15,15,15,15,15,15,8,1,0,2,13,15, + 14,2,0,0,0,4,14,15,15,13,1,0,10,15,15,15, + 15,15,15,15,15,15,9,0,2,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,11,6,2,0,0,0,0,0,0,0,1, + 10,15,15,15,15,15,15,15,15,15,15,15,15,8,0,0, + 0,0,10,15,15,15,15,4,0,0,1,15,15,15,15,4, + 0,0,8,15,15,15,15,15,15,15,15,10,1,0,1,8, + 2,0,0,0,5,15,15,15,15,15,2,0,6,15,15,15, + 15,15,15,15,15,15,9,0,1,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,9,1,0,0,0,0,0,0, + 0,1,7,13,14,15,15,15,15,15,15,15,9,0,0,0, + 0,6,15,15,15,15,15,4,0,0,4,15,15,15,14,1, + 0,0,9,15,15,15,15,15,15,15,15,15,12,2,0,0, + 0,0,0,4,14,15,15,15,15,15,4,0,4,15,15,15, + 15,15,15,15,15,15,7,0,0,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,14,11,6,2,0,0,0, + 0,0,0,0,1,9,12,15,15,15,15,14,3,0,0,0, + 4,15,15,15,15,15,15,4,0,0,3,6,4,4,2,0, + 0,0,13,15,15,15,15,15,15,15,15,15,15,12,1,0, + 0,0,3,14,15,15,15,15,15,15,4,0,4,15,15,15, + 15,15,15,15,15,15,5,0,0,12,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,8,2,0, + 0,0,0,0,0,0,0,1,9,15,15,5,0,0,0,0, + 12,15,15,15,15,15,15,4,0,0,0,0,0,0,0,0, + 0,3,15,15,15,15,15,15,15,15,15,15,15,14,4,0, + 0,1,12,15,15,15,15,15,15,15,6,0,1,14,15,15, + 15,15,15,15,15,15,5,0,0,13,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, + 7,1,0,0,0,0,0,0,0,5,7,0,0,0,0,10, + 15,15,15,15,15,15,15,7,0,0,0,0,0,0,0,0, + 1,10,15,15,15,15,15,15,15,15,15,15,15,14,3,0, + 3,12,15,15,15,15,15,15,15,15,12,0,0,12,15,15, + 15,15,15,15,15,15,5,0,0,1,1,4,11,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,11,6,1,0,0,0,0,0,0,0,0,0,7,15, + 15,15,15,15,15,15,15,14,7,4,4,4,5,9,12,13, + 14,15,15,15,15,15,15,15,15,15,15,15,15,15,11,9, + 14,15,15,14,12,11,11,11,10,9,7,0,0,5,13,15, + 15,15,15,15,15,12,1,0,0,0,0,0,0,10,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,14,7,1,0,0,0,0,0,3,14,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,13,2,0,0,0,0,0,0,0,0,0,0,0,8, + 15,15,15,15,15,11,0,0,0,0,0,0,0,9,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,13,5,0,0,0,0,12,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,8,0,0,0,0,0,0,0,0,0,0,0,0,5, + 15,15,15,15,15,15,10,5,6,7,7,7,9,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,8,3,2,2,2,2,5,14,15, + 15,15,15,15,15,15,15,15,15,10,3,0,6,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,13,3,1,0,1,0,1,1,2,4,4,3,9,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,12,4,0,1,6,7,7,4,1,3,13, + 15,15,15,15,15,15,15,15,15,15,14,10,13,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,11,11,15,15,15,15, + 15,15,15,14,14,14,14,14,14,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,14,2,0,4,13,15,15,15,15,10,0,12, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,13,14,12,12,12,12,12,12,12, + 12,14,15,15,15,15,15,15,15,15,4,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,7,1,5,14,15,15,15,15,15,12,1,11, + 15,15,15,13,12,13,15,15,14,11,13,15,15,15,15,15, + 15,15,15,11,6,3,1,1,1,0,0,0,0,0,0,0, + 0,1,4,7,11,14,15,15,15,14,4,15,13,10,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,14,7,4,5, + 12,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,1,1,14,15,15,14,10,12,15,11,1,12, + 15,15,11,1,0,4,15,15,6,0,2,14,15,15,15,15, + 15,15,14,8,6,3,3,2,2,1,0,0,0,0,0,0, + 0,0,0,0,0,3,11,15,15,11,8,15,12,6,15,9, + 8,15,15,15,15,15,15,15,15,15,15,15,10,4,4,1, + 4,15,15,15,15,11,6,2,8,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,11,2,10,15,9,1,13, + 15,13,1,7,6,2,14,14,1,2,1,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,13,12,12,12,12,12,12, + 11,11,11,10,9,10,12,15,15,6,7,15,9,4,15,4, + 1,14,15,15,15,15,15,15,15,15,15,15,2,11,15,4, + 4,15,15,15,15,3,9,4,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,5,0,6,6,1,9,15, + 15,4,1,13,10,1,13,9,2,7,1,14,14,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,3,5,15,3,5,14,1, + 0,12,13,9,14,15,15,15,15,15,15,15,2,2,4,1, + 6,15,15,15,14,1,5,6,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,12,4,2,2,10,15,15, + 11,0,6,15,12,0,10,7,9,10,1,14,7,14,15,15, + 15,15,15,15,15,15,13,12,11,11,10,9,9,10,11,13, + 15,15,15,15,15,15,15,15,15,1,9,15,2,7,14,1, + 0,10,7,0,8,15,15,15,15,15,15,15,11,4,4,4, + 13,15,15,15,15,10,2,2,4,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,15, + 4,2,14,15,15,1,9,5,14,9,1,14,8,14,15,15, + 15,15,15,15,15,10,3,0,1,0,0,0,0,0,0,5, + 15,15,15,15,15,15,15,15,15,1,9,14,1,8,14,1, + 0,11,13,6,11,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,11, + 0,6,15,15,15,1,5,3,13,10,0,6,8,15,15,15, + 15,15,15,15,15,15,13,12,12,11,10,9,9,10,11,13, + 15,15,15,15,15,15,15,15,15,1,9,12,1,11,15,4, + 1,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 14,10,4,2,12,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,1,3,14,15,15,15,15,15,15,15,15,4, + 3,14,15,15,15,5,1,8,15,14,5,2,9,15,15,15, + 15,15,15,15,15,15,15,15,15,11,9,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,1,9,12,1,12,15,13, + 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 10,2,9,2,3,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,14,4,0,5,14,15,15,15,15,15,15,11,0, + 6,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,8,1,0,3,15,15,15,15, + 15,15,15,15,15,15,15,15,15,1,9,15,11,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 7,1,12,6,1,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,11,1,0,3,8,9,9,10,11,9,5,4, + 13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,12,9,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,5,11,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 10,3,4,1,5,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,12,2,0,0,0,0,0,0,1,8,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,14,12,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,13,8,8,10,9,10,11,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 + }; diff --git a/src/visualizations/Goom/goom2k4-0/src/plugin_info.c b/src/visualizations/Goom/goom2k4-0/src/plugin_info.c new file mode 100644 index 0000000000..7fbdd41254 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/plugin_info.c @@ -0,0 +1,202 @@ +#include "goom_plugin_info.h" +#include "goom_fx.h" +#include "cpu_info.h" +#include "default_scripts.h" +#include "drawmethods.h" +#include <math.h> +#include <stdio.h> + + +#ifdef CPU_POWERPC +#include <sys/types.h> +#include <sys/sysctl.h> +#include "ppc_zoom_ultimate.h" +#include "ppc_drawings.h" +#endif /* CPU_POWERPC */ + + +#ifdef CPU_X86 +#include "mmx.h" +#endif /* CPU_X86 */ + + + +static void setOptimizedMethods(PluginInfo *p) { + + unsigned int cpuFlavour = cpu_flavour(); + + /* set default methods */ + p->methods.draw_line = draw_line; + p->methods.zoom_filter = zoom_filter_c; +/* p->methods.create_output_with_brightness = create_output_with_brightness;*/ + +#ifdef CPU_X86 + if (cpuFlavour & CPU_OPTION_XMMX) { +#ifdef VERBOSE + printf ("Extented MMX detected. Using the fastest methods !\n"); +#endif + p->methods.draw_line = draw_line_mmx; + p->methods.zoom_filter = zoom_filter_xmmx; + } + else if (cpuFlavour & CPU_OPTION_MMX) { +#ifdef VERBOSE + printf ("MMX detected. Using fast methods !\n"); +#endif + p->methods.draw_line = draw_line_mmx; + p->methods.zoom_filter = zoom_filter_mmx; + } +#ifdef VERBOSE + else + printf ("Too bad ! No SIMD optimization available for your CPU.\n"); +#endif +#endif /* CPU_X86 */ + +#ifdef CPU_POWERPC + + if ((cpuFlavour & CPU_OPTION_64_BITS) != 0) { +/* p->methods.create_output_with_brightness = ppc_brightness_G5; */ + p->methods.zoom_filter = ppc_zoom_generic; + } + else if ((cpuFlavour & CPU_OPTION_ALTIVEC) != 0) { +/* p->methods.create_output_with_brightness = ppc_brightness_G4; */ + p->methods.zoom_filter = ppc_zoom_G4; + } + else + { +/* p->methods.create_output_with_brightness = ppc_brightness_generic;*/ + p->methods.zoom_filter = ppc_zoom_generic; + } +#endif /* CPU_POWERPC */ + +} + +void plugin_info_init(PluginInfo *pp, int nbVisuals) { + + PluginInfo p; + int i; + + p.sound.speedvar = p.sound.accelvar = p.sound.totalgoom = 0; + p.sound.prov_max = 0; + p.sound.goom_limit = 1; + p.sound.allTimesMax = 1; + + p.sound.volume_p = secure_f_feedback("Sound Volume"); + p.sound.accel_p = secure_f_feedback("Sound Acceleration"); + p.sound.speed_p = secure_f_feedback("Sound Speed"); + p.sound.goom_limit_p = secure_f_feedback("Goom Limit"); + p.sound.last_goom_p = secure_f_feedback("Goom Detection"); + p.sound.last_biggoom_p = secure_f_feedback("Big Goom Detection"); + p.sound.goom_power_p = secure_f_feedback("Goom Power"); + + p.sound.biggoom_speed_limit_p = secure_i_param("Big Goom Speed Limit"); + IVAL(p.sound.biggoom_speed_limit_p) = 10; + IMIN(p.sound.biggoom_speed_limit_p) = 0; + IMAX(p.sound.biggoom_speed_limit_p) = 100; + ISTEP(p.sound.biggoom_speed_limit_p) = 1; + + p.sound.biggoom_factor_p = secure_i_param("Big Goom Factor"); + IVAL(p.sound.biggoom_factor_p) = 10; + IMIN(p.sound.biggoom_factor_p) = 0; + IMAX(p.sound.biggoom_factor_p) = 100; + ISTEP(p.sound.biggoom_factor_p) = 1; + + p.sound.params = plugin_parameters ("Sound", 11); + + p.nbParams = 0; + p.nbVisuals = nbVisuals; + p.visuals = (VisualFX**)malloc(sizeof(VisualFX*)*nbVisuals); + + *pp = p; + pp->sound.params.params[0] = &pp->sound.biggoom_speed_limit_p; + pp->sound.params.params[1] = &pp->sound.biggoom_factor_p; + pp->sound.params.params[2] = 0; + pp->sound.params.params[3] = &pp->sound.volume_p; + pp->sound.params.params[4] = &pp->sound.accel_p; + pp->sound.params.params[5] = &pp->sound.speed_p; + pp->sound.params.params[6] = 0; + pp->sound.params.params[7] = &pp->sound.goom_limit_p; + pp->sound.params.params[8] = &pp->sound.goom_power_p; + pp->sound.params.params[9] = &pp->sound.last_goom_p; + pp->sound.params.params[10] = &pp->sound.last_biggoom_p; + + pp->statesNumber = 8; + pp->statesRangeMax = 510; + { + GoomState states[8] = { + {1,0,0,1,4, 0, 100}, + {1,0,0,0,1, 101, 140}, + {1,0,0,1,2, 141, 200}, + {0,1,0,1,2, 201, 260}, + {0,1,0,1,0, 261, 330}, + {0,1,1,1,4, 331, 400}, + {0,0,1,0,5, 401, 450}, + {0,0,1,1,1, 451, 510}}; + for (i=0;i<8;++i) + pp->states[i] = states[i]; + } + pp->curGState = &(pp->states[6]); + + /* datas for the update loop */ + pp->update.lockvar = 0; + pp->update.goomvar = 0; + pp->update.loopvar = 0; + pp->update.stop_lines = 0; + pp->update.ifs_incr = 1; /* dessiner l'ifs (0 = non: > = increment) */ + pp->update.decay_ifs = 0; /* disparition de l'ifs */ + pp->update.recay_ifs = 0; /* dedisparition de l'ifs */ + pp->update.cyclesSinceLastChange = 0; + pp->update.drawLinesDuration = 80; + pp->update.lineMode= pp->update.drawLinesDuration; + + pp->update.switchMultAmount = (29.0f/30.0f); + pp->update.switchIncrAmount = 0x7f; + pp->update.switchMult = 1.0f; + pp->update.switchIncr = pp->update.switchIncrAmount; + + pp->update.stateSelectionRnd = 0; + pp->update.stateSelectionBlocker = 0; + pp->update.previousZoomSpeed = 128; + pp->update.timeOfTitleDisplay = 0; + + pp->update_message.affiche = 0; + + { + ZoomFilterData zfd = { + 127, 8, 16, + 1, 1, 0, NORMAL_MODE, + 0, 0, 0, 0, 0 + }; + pp->update.zoomFilterData = zfd; + } + + setOptimizedMethods(pp); + + pp->scanner = gsl_new(); + pp->main_scanner = gsl_new(); + pp->main_script_str = GOOM_MAIN_SCRIPT; + + for (i = 0; i < 0xffff; i++) { + pp->sintable[i] = (int) (1024 * sin ((double) i * 360 / (sizeof (pp->sintable) / sizeof (pp->sintable[0]) - 1) * 3.141592 / 180) + .5); + /* sintable [us] = (int)(1024.0f * sin (us*2*3.31415f/0xffff)) ; */ + } +} + +void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual) { + p->visuals[i] = visual; + if (i == p->nbVisuals-1) { + ++i; + p->nbParams = 1; + while (i--) { + if (p->visuals[i]->params) + p->nbParams++; + } + p->params = (PluginParameters *)malloc(sizeof(PluginParameters)*p->nbParams); + i = p->nbVisuals; + p->nbParams = 1; + p->params[0] = p->sound.params; + while (i--) { + if (p->visuals[i]->params) + p->params[p->nbParams++] = *(p->visuals[i]->params); + } + } +} diff --git a/src/visualizations/Goom/goom2k4-0/src/pngload.c b/src/visualizations/Goom/goom2k4-0/src/pngload.c new file mode 100644 index 0000000000..5335eb2772 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/pngload.c @@ -0,0 +1,144 @@ +#include <png.h> + +int +loadpng (char *file_name, int *w, int *h, unsigned int ***buf) +{ + FILE *fp; + png_uint_32 width, height; + int bit_depth, + + color_type, interlace_type, compression_type, filter_type; + int rowbytes; + + png_structp png_ptr; + png_infop info_ptr; + png_infop end_info; + + int x, y; + unsigned int **row_pointers; + + /* OUVERTURE DU FICHIER */ + + fp = fopen (file_name, "rb"); + + if (!fp) { + // fprintf (stderr, "Couldn't open file\n"); + return 1; + } + + /* CREATION DES STRUCTURES */ + png_ptr = png_create_read_struct + (PNG_LIBPNG_VER_STRING, (png_voidp) NULL, NULL, NULL); + if (!png_ptr) { + fclose (fp); + fprintf (stderr, "Memory error\n"); + return 1; + } + + info_ptr = png_create_info_struct (png_ptr); + if (!info_ptr) { + png_destroy_read_struct (&png_ptr, (png_infopp) NULL, (png_infopp) NULL); + fclose (fp); + fprintf (stderr, "Read error 1\n"); + return 1; + } + + end_info = png_create_info_struct (png_ptr); + if (!end_info) { + png_destroy_read_struct (&png_ptr, &info_ptr, (png_infopp) NULL); + fclose (fp); + fprintf (stderr, "Read error 2\n"); + return 1; + } + + /* CHARGEMENT DE L'IMAGE */ + if (setjmp (png_ptr->jmpbuf)) { + png_destroy_read_struct (&png_ptr, &info_ptr, &end_info); + fclose (fp); + fprintf (stderr, "Erreur de chargement\n"); + return 1; + } + + png_init_io (png_ptr, fp); + png_set_read_status_fn (png_ptr, NULL); + + png_read_info (png_ptr, info_ptr); + + png_get_IHDR (png_ptr, info_ptr, &width, &height, + &bit_depth, &color_type, &interlace_type, + &compression_type, &filter_type); +/* + printf ("taille : %dx%d\n",width,height); + printf ("depth : %d\n",bit_depth); + printf ("color type : "); + switch (color_type) { + case PNG_COLOR_TYPE_GRAY: + printf ("PNG_COLOR_TYPE_GRAY (bit depths 1, 2, 4, 8, 16)\n"); + break; + case PNG_COLOR_TYPE_GRAY_ALPHA: + printf ("PNG_COLOR_TYPE_GRAY_ALPHA (bit depths 8, 16)\n"); + break; + case PNG_COLOR_TYPE_PALETTE: + printf ("PNG_COLOR_TYPE_PALETTE (bit depths 1, 2, 4, 8)\n"); + break; + case PNG_COLOR_TYPE_RGB: + printf ("PNG_COLOR_TYPE_RGB (bit_depths 8, 16)\n"); + break; + case PNG_COLOR_TYPE_RGB_ALPHA: + printf ("PNG_COLOR_TYPE_RGB_ALPHA (bit_depths 8, 16)\n"); + break; + } + */ + // printf ("PNG_COLOR_MASK_ALPHA : %x\n", PNG_COLOR_MASK_ALPHA); + // printf ("PNG_COLOR_MASK_COLOR : %x\n", PNG_COLOR_MASK_COLOR); + // printf ("PNG_COLOR_MASK_PALETTE : %x\n", PNG_COLOR_MASK_PALETTE); + + if (color_type == PNG_COLOR_TYPE_PALETTE && bit_depth <= 8) + png_set_palette_to_rgb (png_ptr); + + if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) + png_set_expand_gray_1_2_4_to_8 (png_ptr); + else if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_gray_to_rgb (png_ptr); + + if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS)) + png_set_tRNS_to_alpha (png_ptr); + + png_read_update_info (png_ptr, info_ptr); + +// printf ("channels : %d\n", png_get_channels (png_ptr, info_ptr)); + rowbytes = png_get_rowbytes (png_ptr, info_ptr); +// printf ("rowbytes : %d\n", rowbytes); + + row_pointers = (unsigned int **) malloc (height * sizeof (unsigned int *)); + + for (y = 0; y < height; y++) + row_pointers[y] = (unsigned int *) malloc (4 * width); + png_read_image (png_ptr, (png_bytepp) row_pointers); + + // for (y=0;y<height;y++) { +// for (x=0;x<width;x++) { +// if (row_pointers[y][x] & 0xf000) + // printf ("%x ",(((unsigned int**)row_pointers)[y][x])&0xf); + // else +// printf (" "); + // } + // printf ("\n"); + // } + + png_read_end (png_ptr, end_info); + png_destroy_read_struct (&png_ptr, &info_ptr, &end_info); + + (*buf) = (unsigned int **) malloc (height * sizeof (void *)); + + for (y = 0; y < height; y++) { + (*buf)[y] = (unsigned int *) malloc (width * 4); + for (x = 0; x < width; x++) + (*buf)[y][x] = row_pointers[y][x]; + } + *w = width; + *h = height; + + return 0; +} diff --git a/src/visualizations/Goom/goom2k4-0/src/powerpc/Copie de ppc_zoom_ultimate.s b/src/visualizations/Goom/goom2k4-0/src/powerpc/Copie de ppc_zoom_ultimate.s new file mode 100644 index 0000000000..c6f5027b08 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/powerpc/Copie de ppc_zoom_ultimate.s @@ -0,0 +1,305 @@ +; PowerPC optimized zoom for Goom +; © 2001-2003 Guillaume Borios +; This Source Code is released under the terms of the General Public License + +; Change log : +; 21 Dec 2003 : Use of altivec is now determined with a parameter + +; Section definition : We use a read only section +.text + +; name of the function to call by C program : ppc_zoom +; We declare this label as a global to extend its scope outside this file +.globl _ppc_zoom_generic +.globl _ppc_zoom_G4 + +; Description : +; This routine dynamically computes and applies a zoom filter + +; parameters : +; r3 <=> unsigned int * frompixmap +; r4 <=> unsigned int * topixmap +; r5 <=> unsigned int sizeX (in pixels) +; r6 <=> unsigned int sizeY (in pixels) +; r7 <=> unsigned int * brutS +; r8 <=> unsigned int * brutD +; r9 <=> unsigned int buffratio +; r10 <=> int [16][16] precalccoeffs + +; globals after init +; r3 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r3) +; r4 <=> topixmap - 1 byte needed for preincremental fetch (replaces r4) +; r5 <=> ax = x max in 16th of pixels (replaces old r5) +; r6 <=> ay = y max in 16th of pixels (replaces old r6) +; r20 <=> row size in bytes +; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing) +; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7) +; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8) + +; ABI notes : +; r1 is the Stack Pointer (SP) => Do not use +; r13..r31 are non-volatiles => Do not use + +_ppc_zoom_generic: + +; Saves the used non volatile registers in the Mach-O stack s Red-Zone +stmw r18,-56(r1) + +; init +li r18,0 ; Default value if out of range : 0 (Black) +mr r11,r10 +lis r12,0xFF +mullw r2,r5,r6 ; Number of pixels to compute +subi r30,r8,0 +slwi r20,r5,2 +srawi r19,r20,2 +ori r12,r12,0xFF +subi r5,r5,1 +subi r6,r6,1 +mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +subi r31,r7,0 +subi r4,r4,4 +slwi r5,r5,4 +slwi r6,r6,4 + +;pre init for loop +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 + +L1: + +; computes dynamically the position to fetch +sub r8,r8,r2 +sub r10,r10,r29 +mullw r8,r8,r9 +addi r31,r31,8 +mullw r10,r10,r9 +addi r30,r30,8 + +srawi r8,r8,16 +srawi r10,r10,16 +add r2,r2,r8 +add r29,r29,r10 + +; if px>ax or py>ay goto outofrange +; computes the attenuation coeffs and the original point address +rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +cmpl cr6,0,r2,r5 +rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10) +cmpl cr7,0,r29,r6 +srawi r29,r29,4 ; pos computing +bge- cr6,L4 +srawi r2,r2,4 ; pos computing +mullw r29, r29,r19 ; pos computing +bge- cr7,L4 + +; Channels notation : 00112233 (AARRVVBB) + +add r2,r2,r29 ; pos computing +lwzx r10,r11,r10 ; Loads coefs +slwi r2,r2,2 ; pos computing +add r2,r2,r3 ; pos computing +rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +lwz r25,0(r2) ; Loads col1 -> r25 +lwz r26,4(r2) ; Loads col2 -> r26 +rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +add r2,r2,r20 ; Adds one line for future load of col3 and col4 +and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 + + +; computes final pixel color +and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +lwz r27,0(r2) ; Loads col3 -> r27 +mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +lwz r28,4(r2) ; Loads col4 -> r28 +add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +add r25,r25,r29 ; Adds col1 & col2 channel 2 +mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +lwz r2,0(r31) ; px +add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +lwz r8,0(r30) ; px2 +andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +lwz r10,4(r30) ; py2 +mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +lwz r29,4(r31) ; py +add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +stwu r7,4(r4) ; Stores the computed pixel +bdnz L1 ; Iterate again if needed +b L3 ;goto end ; If not, returns from the function + + +; if out of range +L4: +stwu r18,4(r4) +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +bdnz L1 + + +L3: + +; Restore saved registers and return +lmw r18,-56(r1) +blr + + + + + + + + +_ppc_zoom_G4: + +; Saves the used non volatile registers in the Mach-O stack s Red-Zone +stmw r17,-60(r1) + +; init +li r18,0 ; Default value if out of range : 0 (Black) +mr r11,r10 +lis r12,0xFF +mullw r2,r5,r6 ; Number of pixels to compute +subi r30,r8,0 +slwi r20,r5,2 +srawi r19,r20,2 +ori r12,r12,0xFF +subi r5,r5,1 +subi r6,r6,1 +mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +subi r31,r7,0 +subi r4,r4,4 +slwi r5,r5,4 +slwi r6,r6,4 + +;pre init for loop +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 + +;********************* +lis r17,0x0F01 + +L100: + +; computes dynamically the position to fetch +;mullw r8,r8,r29 +;mullw r2,r2,r29 +;add r2,r8,r2 +;srawi r2,r2,17 + +sub r8,r8,r2 +sub r10,r10,r29 +mullw r8,r8,r9 +addi r31,r31,8 +mullw r10,r10,r9 +addi r30,r30,8 + +dst r30,r17,0 + +srawi r8,r8,16 +srawi r10,r10,16 +add r2,r2,r8 +add r29,r29,r10 + +dst r31,r17,1 + +; if px>ax or py>ay goto outofrange +; computes the attenuation coeffs and the original point address +rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +cmpl cr6,0,r2,r5 +rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10) +cmpl cr7,0,r29,r6 +srawi r29,r29,4 ; pos computing +bge- cr6,L400 +srawi r2,r2,4 ; pos computing +mullw r29, r29,r19 ; pos computing +bge- cr7,L400 + +; Channels notation : 00112233 (AARRVVBB) + +add r2,r2,r29 ; pos computing +lwzx r10,r11,r10 ; Loads coefs +slwi r2,r2,2 ; pos computing +add r2,r2,r3 ; pos computing +rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +lwz r25,0(r2) ; Loads col1 -> r25 +lwz r26,4(r2) ; Loads col2 -> r26 +rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +add r2,r2,r20 ; Adds one line for future load of col3 and col4 +and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +dst r2,r17,2 +andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 + + +; computes final pixel color +and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +lwz r27,0(r2) ; Loads col3 -> r27 +mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +lwz r28,4(r2) ; Loads col4 -> r28 +add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +add r25,r25,r29 ; Adds col1 & col2 channel 2 +mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +lwz r2,0(r31) ; px +add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +lwz r8,0(r30) ; px2 +andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +lwz r10,4(r30) ; py2 +mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +lwz r29,4(r31) ; py +add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +stwu r7,4(r4) ; Stores the computed pixel +bdnz L100 ; Iterate again if needed +b L300 ;goto end ; If not, returns from the function + + +; if out of range +L400: +stwu r18,4(r4) +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +bdnz L100 + + +L300: + +; Restore saved registers and return +lmw r17,-60(r1) +blr diff --git a/src/visualizations/Goom/goom2k4-0/src/powerpc/ppc_doubling.s b/src/visualizations/Goom/goom2k4-0/src/powerpc/ppc_doubling.s new file mode 100644 index 0000000000..161326152f --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/powerpc/ppc_doubling.s @@ -0,0 +1,50 @@ +.section regular,__TEXT +.globl _ppc_doubling ; name of the function to call by C program + +; width (src width)->r3 +; myx (src) ->r4 +; myX (dest) ->r5 +; myX2 (dest + 1 complete line)->r6 +; heigth (src height)->r7 +; inc (increment for next line in dest) ->r8 + +_ppc_doubling: + +mtspr ctr,r3 + +addi r4,r4,-4 +addi r5,r5,-4 +addi r6,r6,-4 + +1:;boucle: + +lwzu r10,4(r4) +stwu r10,4(r5) +stwu r10,4(r5) +stwu r10,4(r6) +stwu r10,4(r6) + +bdnz 1boucle + +subi r7,r7,1 +add r5,r5,r8 +cmpwi cr1,r7,0 +add r6,r6,r8 +mtspr ctr,r3 +bgt cr1,1boucle + +blr + +;backup + +lwzu r10,4(r4) +stwu r10,4(r5) +stwu r10,4(r6) +stwu r10,4(r5) +stwu r10,4(r6) + +lwzu r10,4(r4) +stwu r10,4(r5) +stwu r10,4(r6) +stwu r10,4(r5) +stwu r10,4(r6) diff --git a/src/visualizations/Goom/goom2k4-0/src/ppc_drawings.h b/src/visualizations/Goom/goom2k4-0/src/ppc_drawings.h new file mode 100644 index 0000000000..ee438c2895 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/ppc_drawings.h @@ -0,0 +1,18 @@ +/* + * ppc_drawings.h + * Goom + * + * Created by Guillaume Borios on Sun Dec 28 2003. + * Copyright (c) 2003 iOS. All rights reserved. + * + */ + +/* Generic PowerPC Code */ +void ppc_brightness_generic(Pixel *src, Pixel *dest, int size, int coeff); + +/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */ +void ppc_brightness_G4(Pixel *src, Pixel *dest, int size, int coeff); + +/* G5 Specific PowerPC Code (Possible use of Altivec) */ +void ppc_brightness_G5(Pixel *src, Pixel *dest, int size, int coeff); + diff --git a/src/visualizations/Goom/goom2k4-0/src/ppc_drawings.s b/src/visualizations/Goom/goom2k4-0/src/ppc_drawings.s new file mode 100644 index 0000000000..845e5ea166 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/ppc_drawings.s @@ -0,0 +1,381 @@ +; PowerPC optimized drawing methods for Goom +; © 2003 Guillaume Borios +; This Source Code is released under the terms of the General Public License + +; Change log : +; 30 May 2003 : File creation + +; Section definition : We use a read only code section for the whole file +.section __TEXT,__text,regular,pure_instructions + + +; -------------------------------------------------------------------------------------- +; Single 32b pixel drawing macros +; Usage : +; DRAWMETHOD_XXXX_MACRO *pixelIN, *pixelOUT, COLOR, WR1, WR2, WR3, WR4 +; Only the work registers (WR) can be touched by the macros +; +; Available methods : +; DRAWMETHOD_DFLT_MACRO : Default drawing method (Actually OVRW) +; DRAWMETHOD_PLUS_MACRO : RVB Saturated per channel addition (SLOWEST) +; DRAWMETHOD_HALF_MACRO : 50% Transparency color drawing +; DRAWMETHOD_OVRW_MACRO : Direct COLOR drawing (FASTEST) +; DRAWMETHOD_B_OR_MACRO : Bitwise OR +; DRAWMETHOD_BAND_MACRO : Bitwise AND +; DRAWMETHOD_BXOR_MACRO : Bitwise XOR +; DRAWMETHOD_BNOT_MACRO : Bitwise NOT +; -------------------------------------------------------------------------------------- + +.macro DRAWMETHOD_OVRW_MACRO + stw $2,0($1) ;; *$1 <- $2 +.endmacro + +.macro DRAWMETHOD_B_OR_MACRO + lwz $3,0($0) ;; $3 <- *$0 + or $3,$3,$2 ;; $3 <- $3 | $2 + stw $3,0($1) ;; *$1 <- $3 +.endmacro + +.macro DRAWMETHOD_BAND_MACRO + lwz $3,0($0) ;; $3 <- *$0 + and $3,$3,$2 ;; $3 <- $3 & $2 + stw $3,0($1) ;; *$1 <- $3 +.endmacro + +.macro DRAWMETHOD_BXOR_MACRO + lwz $3,0($0) ;; $3 <- *$0 + xor $3,$3,$2 ;; $3 <- $3 ^ $2 + stw $3,0($1) ;; *$1 <- $3 +.endmacro + +.macro DRAWMETHOD_BNOT_MACRO + lwz $3,0($0) ;; $3 <- *$0 + nand $3,$3,$3 ;; $3 <- ~$3 + stw $3,0($1) ;; *$1 <- $3 +.endmacro + +.macro DRAWMETHOD_PLUS_MACRO + lwz $4,0($0) ;; $4 <- *$0 + andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00 + andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00 + add $3,$3,$5 ;; $3 <- $3 + $5 + rlwinm $5,$3,15,0,0 ;; $5 <- 0 | ($3[15] << 15) + srawi $5,$5,23 ;; $5 <- $5 >> 23 (algebraic for sign extension) + or $3,$3,$5 ;; $3 <- $3 | $5 + lis $5,0xFF ;; $5 <- 0x00FF00FF + addi $5,$5,0xFF + and $4,$4,$5 ;; $4 <- $4 & $5 + and $6,$2,$5 ;; $6 <- $2 & $5 + add $4,$4,$6 ;; $4 <- $4 + $6 + rlwinm $6,$4,7,0,0 ;; $6 <- 0 | ($4[7] << 7) + srawi $6,$6,15 ;; $6 <- $6 >> 15 (algebraic for sign extension) + rlwinm $5,$4,23,0,0 ;; $5 <- 0 | ($4[23] << 23) + srawi $5,$5,31 ;; $5 <- $5 >> 31 (algebraic for sign extension) + rlwimi $6,$5,0,24,31 ;; $6[24..31] <- $5[24..31] + or $4,$4,$6 ;; $4 <- $4 | $6 + rlwimi $4,$3,0,16,23 ;; $4[16..23] <- $3[16..23] + stw $4,0($1) ;; *$1 <- $4 +.endmacro + +.macro DRAWMETHOD_HALF_MACRO + lwz $4,0($0) ;; $4 <- *$0 + andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00 + andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00 + add $3,$3,$5 ;; $3 <- $3 + $5 + lis $5,0xFF ;; $5 <- 0x00FF00FF + addi $5,$5,0xFF + and $4,$4,$5 ;; $4 <- $4 & $5 + and $5,$2,$5 ;; $5 <- $2 & $5 + add $4,$4,$5 ;; $4 <- $4 + $5 + srwi $4,$4,1 ;; $4 <- $4 >> 1 + rlwimi $4,$3,31,16,23 ;; $4[16..23] <- $3[15..22] + stw $4,0($1) ;; *$1 <- $4 +.endmacro + +.macro DRAWMETHOD_DFLT_MACRO + DRAWMETHOD_PLUS_MACRO +.endmacro + +; -------------------------------------------------------------------------------------- + + + +; ************************************************************************************** +; void DRAWMETHOD_PLUS_PPC(unsigned int * buf, unsigned int _col); +; void DRAWMETHOD_PLUS_2_PPC(unsigned * in, unsigned int * out, unsigned int _col); +; ************************************************************************************** +.globl _DRAWMETHOD_PLUS_2_PPC +.align 3 +_DRAWMETHOD_PLUS_2_PPC: + DRAWMETHOD_PLUS_MACRO r3,r4,r5,r6,r7,r8,r9 + blr ;; return + +.globl _DRAWMETHOD_PLUS_PPC +.align 3 +_DRAWMETHOD_PLUS_PPC: + DRAWMETHOD_PLUS_MACRO r3,r3,r4,r5,r6,r7,r9 + blr ;; return + + +; ************************************************************************************** +; void DRAWMETHOD_HALF_PPC(unsigned int * buf, unsigned int _col); +; void DRAWMETHOD_HALF_2_PPC(unsigned * in, unsigned int * out, unsigned int _col); +; ************************************************************************************** +.globl _DRAWMETHOD_HALF_2_PPC +.align 3 +_DRAWMETHOD_HALF_2_PPC: + DRAWMETHOD_HALF_MACRO r3,r4,r5,r6,r7,r8 + blr ;; return + +.globl _DRAWMETHOD_HALF_PPC +.align 3 +_DRAWMETHOD_HALF_PPC: + DRAWMETHOD_HALF_MACRO r3,r3,r4,r5,r6,r7 + blr ;; return + + +; ************************************************************************************** +; void DRAW_LINE_PPC(unsigned int *data, int x1, int y1, int x2, int y2, unsigned int col, +; unsigned int screenx, unsigned int screeny) +; ************************************************************************************** +.globl _DRAW_LINE_PPC +.align 3 +_DRAW_LINE_PPC: + ;; NOT IMPLEMENTED YET + blr ;; return + + +; ************************************************************************************** +; void _ppc_brightness(Pixel * src, Pixel * dest, unsigned int size, unsigned int coeff) +; ************************************************************************************** + + +.const +.align 4 +vectorZERO: + .long 0,0,0,0 + .long 0x10101000, 0x10101001, 0x10101002, 0x10101003 + .long 0x10101004, 0x10101005, 0x10101006, 0x10101007 + .long 0x10101008, 0x10101009, 0x1010100A, 0x1010100B + .long 0x1010100C, 0x1010100D, 0x1010100E, 0x1010100F + + +.section __TEXT,__text,regular,pure_instructions + +.globl _ppc_brightness_G4 +.align 3 +_ppc_brightness_G4: + + +;; PowerPC Altivec code + srwi r5,r5,2 + mtctr r5 + +;;vrsave + mfspr r11,256 + lis r12,0xCFFC + mtspr 256,r12 + + mflr r0 + bcl 20,31,"L00000000001$pb" +"L00000000001$pb": + mflr r10 + mtlr r0 + + addis r9,r10,ha16(vectorZERO-"L00000000001$pb") + addi r9,r9,lo16(vectorZERO-"L00000000001$pb") + + vxor v0,v0,v0 ;; V0 = NULL vector + + addi r9,r9,16 + lvx v10,0,r9 + addi r9,r9,16 + lvx v11,0,r9 + addi r9,r9,16 + lvx v12,0,r9 + addi r9,r9,16 + lvx v13,0,r9 + + addis r9,r10,ha16(vectortmpwork-"L00000000001$pb") + addi r9,r9,lo16(vectortmpwork-"L00000000001$pb") + stw r6,0(r9) + li r6,8 + stw r6,4(r9) + lvx v9,0,r9 + li r9,128 + vspltw v8,v9,0 + vspltw v9,v9,1 + +;; elt counter + li r9,0 + lis r7,0x0F01 + b L7 +.align 4 +L7: + lvx v1,r9,r3 + + vperm v4,v1,v0,v10 + ;********************* + add r10,r9,r3 + ;********************* + vperm v5,v1,v0,v11 + vperm v6,v1,v0,v12 + vperm v7,v1,v0,v13 + + vmulouh v4,v4,v8 + ;********************* + dst r10,r7,3 + ;********************* + vmulouh v5,v5,v8 + vmulouh v6,v6,v8 + vmulouh v7,v7,v8 + vsrw v4,v4,v9 + vsrw v5,v5,v9 + vsrw v6,v6,v9 + vsrw v7,v7,v9 + + vpkuwus v4,v4,v5 + vpkuwus v6,v6,v7 + vpkuhus v1,v4,v6 + + stvx v1,r9,r4 + addi r9,r9,16 + + bdnz L7 + + mtspr 256,r11 + blr + + +.globl _ppc_brightness_G5 +.align 3 +_ppc_brightness_G5: + +;; PowerPC Altivec G5 code + srwi r5,r5,2 + mtctr r5 + +;;vrsave + mfspr r11,256 + lis r12,0xCFFC + mtspr 256,r12 + + mflr r0 + bcl 20,31,"L00000000002$pb" +"L00000000002$pb": + mflr r10 + mtlr r0 + + addis r9,r10,ha16(vectorZERO-"L00000000002$pb") + addi r9,r9,lo16(vectorZERO-"L00000000002$pb") + + vxor v0,v0,v0 ;; V0 = NULL vector + + addi r9,r9,16 + lvx v10,0,r9 + addi r9,r9,16 + lvx v11,0,r9 + addi r9,r9,16 + lvx v12,0,r9 + addi r9,r9,16 + lvx v13,0,r9 + + addis r9,r10,ha16(vectortmpwork-"L00000000002$pb") + addi r9,r9,lo16(vectortmpwork-"L00000000002$pb") + stw r6,0(r9) + li r6,8 + stw r6,4(r9) + lvx v9,0,r9 + li r9,128 + vspltw v8,v9,0 + vspltw v9,v9,1 + +;; elt counter + li r9,0 + lis r7,0x0F01 + b L6 +.align 4 +L6: + lvx v1,r9,r3 + + vperm v4,v1,v0,v10 + ;********************* + add r10,r9,r3 + ;********************* + vperm v5,v1,v0,v11 + vperm v6,v1,v0,v12 + vperm v7,v1,v0,v13 + + vmulouh v4,v4,v8 + vmulouh v5,v5,v8 + vmulouh v6,v6,v8 + vmulouh v7,v7,v8 + vsrw v4,v4,v9 + vsrw v5,v5,v9 + vsrw v6,v6,v9 + vsrw v7,v7,v9 + + vpkuwus v4,v4,v5 + vpkuwus v6,v6,v7 + vpkuhus v1,v4,v6 + + stvx v1,r9,r4 + addi r9,r9,16 + + bdnz L6 + + mtspr 256,r11 + blr + + +.globl _ppc_brightness_generic +.align 3 +_ppc_brightness_generic: + lis r12,0x00FF + ori r12,r12,0x00FF + subi r3,r3,4 + subi r4,r4,4 + mtctr r5 + b L1 +.align 4 +L1: + lwzu r7,4(r3) + + rlwinm r8,r7,16,24,31 + rlwinm r9,r7,24,24,31 + mullw r8,r8,r6 + rlwinm r10,r7,0,24,31 + mullw r9,r9,r6 + srwi r8,r8,8 + mullw r10,r10,r6 + srwi r9,r9,8 + + rlwinm. r11,r8,0,0,23 + beq L2 + li r8,0xFF +L2: + srwi r10,r10,8 + rlwinm. r11,r9,0,0,23 + beq L3 + li r9,0xFF +L3: + rlwinm r7,r8,16,8,15 + rlwinm. r11,r10,0,0,23 + beq L4 + li r10,0xFF +L4: + rlwimi r7,r9,8,16,23 + rlwimi r7,r10,0,24,31 + + stwu r7,4(r4) + bdnz L1 + + blr + + + +.static_data +.align 4 +vectortmpwork: + .long 0,0,0,0 + diff --git a/src/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.h b/src/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.h new file mode 100644 index 0000000000..d6932e7e61 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.h @@ -0,0 +1,14 @@ +/* + * ppc_zoom_ultimate.h + * Goom + * + * Created by Guillaume Borios on Sun Dec 28 2003. + * Copyright (c) 2003 iOS. All rights reserved. + * + */ + +/* Generic PowerPC Code */ +void ppc_zoom_generic (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); + +/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */ +void ppc_zoom_G4 (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]);
\ No newline at end of file diff --git a/src/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.s b/src/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.s new file mode 100644 index 0000000000..da252c676f --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/ppc_zoom_ultimate.s @@ -0,0 +1,323 @@ +; PowerPC optimized zoom for Goom +; © 2001-2003 Guillaume Borios +; This Source Code is released under the terms of the General Public License + +; Change log : +; 21 Dec 2003 : Use of altivec is now determined with a parameter + +; Section definition : We use a read only section +.text + +; name of the function to call by C program : ppc_zoom +; We declare this label as a global to extend its scope outside this file +.globl _ppc_zoom_generic +.globl _ppc_zoom_G4 + +; Description : +; This routine dynamically computes and applies a zoom filter + +; parameters : +; r3 <=> unsigned int sizeX (in pixels) +; r4 <=> unsigned int sizeY (in pixels) +; r5 <=> unsigned int * frompixmap +; r6 <=> unsigned int * topixmap +; r7 <=> unsigned int * brutS +; r8 <=> unsigned int * brutD +; r9 <=> unsigned int buffratio +; r10 <=> int [16][16] precalccoeffs + +; globals after init +; r5 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r5) +; r6 <=> topixmap - 1 byte needed for preincremental fetch (replaces r6) +; r3 <=> ax = x max in 16th of pixels (replaces old r3) +; r4 <=> ay = y max in 16th of pixels (replaces old r4) +; r20 <=> row size in bytes +; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing) +; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7) +; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8) + +; ABI notes : +; r1 is the Stack Pointer (SP) => Do not use +; r13..r31 are non-volatiles => Do not use + +_ppc_zoom_generic: + +; Saves the used non volatile registers in the Mach-O stack s Red-Zone +stmw r18,-56(r1) + +; init +li r18,0 ; Default value if out of range : 0 (Black) +mr r11,r10 +lis r12,0xFF +mullw r2,r3,r4 ; Number of pixels to compute +subi r30,r8,0 +slwi r20,r3,2 +srawi r19,r20,2 +ori r12,r12,0xFF +subi r3,r3,1 +subi r4,r4,1 +mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +subi r31,r7,0 +subi r6,r6,4 +slwi r3,r3,4 +slwi r4,r4,4 + +;pre init for loop +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 + +b L1 +.align 5 +L1: + +; computes dynamically the position to fetch +sub r8,r8,r2 +sub r10,r10,r29 +mullw r8,r8,r9 +addi r31,r31,8 +mullw r10,r10,r9 +addi r30,r30,8 + +srawi r8,r8,16 +srawi r10,r10,16 +add r2,r2,r8 +add r29,r29,r10 + +; if px>ax or py>ay goto outofrange +; computes the attenuation coeffs and the original point address +rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +cmpl cr4,0,r2,r3 +rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10) +cmpl cr7,0,r29,r4 +srawi r29,r29,4 ; pos computing +bge- cr4,L4 +srawi r2,r2,4 ; pos computing +mullw r29, r29,r19 ; pos computing +bge- cr7,L4 + +; Channels notation : 00112233 (AARRVVBB) + +add r2,r2,r29 ; pos computing +lwzx r10,r11,r10 ; Loads coefs +slwi r2,r2,2 ; pos computing +add r2,r2,r5 ; pos computing +rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +lwz r25,0(r2) ; Loads col1 -> r25 +lwz r26,4(r2) ; Loads col2 -> r26 +rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +add r2,r2,r20 ; Adds one line for future load of col3 and col4 +and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 + + +; computes final pixel color +and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +lwz r27,0(r2) ; Loads col3 -> r27 +mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +lwz r28,4(r2) ; Loads col4 -> r28 +add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +add r25,r25,r29 ; Adds col1 & col2 channel 2 +mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +lwz r2,0(r31) ; px +add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +lwz r8,0(r30) ; px2 +andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +lwz r10,4(r30) ; py2 +mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +lwz r29,4(r31) ; py +add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +stwu r7,4(r6) ; Stores the computed pixel +bdnz L1 ; Iterate again if needed +b L3 ;goto end ; If not, returns from the function + + +; if out of range +L4: +stwu r18,4(r6) +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +bdnz L1 + + +L3: + +; Restore saved registers and return +lmw r18,-56(r1) +blr + + + + + + + + +_ppc_zoom_G4: + +; Saves the used non volatile registers in the Mach-O stack s Red-Zone +stmw r17,-60(r1) + +; init +li r18,0 ; Default value if out of range : 0 (Black) +mr r11,r10 +lis r12,0xFF +mullw r2,r3,r4 ; Number of pixels to compute +subi r30,r8,0 +slwi r20,r3,2 +srawi r19,r20,2 +ori r12,r12,0xFF +subi r3,r3,1 +subi r4,r4,1 +mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +subi r31,r7,0 +subi r6,r6,4 +slwi r3,r3,4 +slwi r4,r4,4 + +;pre init for loop +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 + +;********************* +lis r17,0x0F01 + +b L100 +.align 5 +L100: + +addi r6,r6,4 + +; Optimization to ensure the destination buffer +; won't be loaded into the data cache +rlwinm. r0,r6,0,27,31 +bne+ L500 +dcbz 0,r6 +;dcba 0,r6 +L500: + +; computes dynamically the position to fetch +;mullw r8,r8,r29 +;mullw r2,r2,r29 +;add r2,r8,r2 +;srawi r2,r2,17 + +sub r8,r8,r2 +sub r10,r10,r29 +mullw r8,r8,r9 +addi r31,r31,8 +mullw r10,r10,r9 +addi r30,r30,8 + +dst r30,r17,0 + +srawi r8,r8,16 +srawi r10,r10,16 +add r2,r2,r8 +add r29,r29,r10 + +dst r31,r17,1 + +; if px>ax or py>ay goto outofrange +; computes the attenuation coeffs and the original point address +rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +cmpl cr4,0,r2,r3 +rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10) +cmpl cr7,0,r29,r4 +srawi r29,r29,4 ; pos computing +bge- cr4,L400 +srawi r2,r2,4 ; pos computing +mullw r29, r29,r19 ; pos computing +bge- cr7,L400 + +; Channels notation : 00112233 (AARRVVBB) + +add r2,r2,r29 ; pos computing +lwzx r10,r11,r10 ; Loads coefs +slwi r2,r2,2 ; pos computing +add r2,r2,r5 ; pos computing +rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +lwz r25,0(r2) ; Loads col1 -> r25 +lwz r26,4(r2) ; Loads col2 -> r26 +rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +add r2,r2,r20 ; Adds one line for future load of col3 and col4 +and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +dst r2,r17,2 +rlwinm r25,r25,0,16,23 ; Masks col1 channel 2 : 0x0000XX00 +;andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 + + +; computes final pixel color +and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +lwz r27,0(r2) ; Loads col3 -> r27 +mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +rlwinm r29,r26,0,16,23 ; Masks col2 channel 2 : 0x0000XX00 +;andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +lwz r28,4(r2) ; Loads col4 -> r28 +add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +add r25,r25,r29 ; Adds col1 & col2 channel 2 +mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +rlwinm r29,r27,0,16,23 ; Masks col3 channel 2 : 0x0000XX00 +;andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +lwz r2,0(r31) ; px +add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +lwz r8,0(r30) ; px2 +rlwinm r28,r28,0,16,23 ; Masks col4 channel 2 : 0x0000XX00 +;andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +lwz r10,4(r30) ; py2 +mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +lwz r29,4(r31) ; py +add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +stw r7,0(r6) ; Stores the computed pixel +bdnz L100 ; Iterate again if needed +b L300 ;goto end ; If not, returns from the function + + +; if out of range +L400: +stw r18,0(r6) +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +bdnz L100 + + +L300: + +; Restore saved registers and return +lmw r17,-60(r1) +blr diff --git a/src/visualizations/Goom/goom2k4-0/src/sound_tester.c b/src/visualizations/Goom/goom2k4-0/src/sound_tester.c new file mode 100644 index 0000000000..ac50a11b26 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/sound_tester.c @@ -0,0 +1,138 @@ +#include "sound_tester.h" + +#include <stdlib.h> +#include <string.h> + +/* some constants */ +#define BIG_GOOM_DURATION 100 +#define BIG_GOOM_SPEED_LIMIT 0.1f + +#define ACCEL_MULT 0.95f +#define SPEED_MULT 0.99f + + +void evaluate_sound(gint16 data[2][512], SoundInfo *info) { + + int i; + float difaccel; + float prevspeed; + + /* find the max */ + int incvar = 0; + for (i = 0; i < 512; i+=2) { + if (incvar < data[0][i]) + incvar = data[0][i]; + } + + if (incvar > info->allTimesMax) + info->allTimesMax = incvar; + + /* volume sonore */ + info->volume = (float)incvar / (float)info->allTimesMax; + memcpy(info->samples[0],data[0],512*sizeof(short)); + memcpy(info->samples[1],data[1],512*sizeof(short)); + + difaccel = info->accelvar; + info->accelvar = info->volume; /* accel entre 0 et 1 */ + + /* transformations sur la vitesse du son */ + if (info->speedvar > 1.0f) + info->speedvar = 1.0f; + + if (info->speedvar < 0.1f) + info->accelvar *= (1.0f - (float)info->speedvar); + else if (info->speedvar < 0.3f) + info->accelvar *= (0.9f - (float)(info->speedvar-0.1f)/2.0f); + else + info->accelvar *= (0.8f - (float)(info->speedvar-0.3f)/4.0f); + + /* adoucissement de l'acceleration */ + info->accelvar *= ACCEL_MULT; + if (info->accelvar < 0) + info->accelvar = 0; + + difaccel = info->accelvar - difaccel; + if (difaccel < 0) + difaccel = - difaccel; + + /* mise a jour de la vitesse */ + prevspeed = info->speedvar; + info->speedvar = (info->speedvar + difaccel * 0.5f) / 2; + info->speedvar *= SPEED_MULT; + info->speedvar = (info->speedvar + 3.0f * prevspeed) / 4.0f; + if (info->speedvar < 0) + info->speedvar = 0; + if (info->speedvar > 1) + info->speedvar = 1; + + /* temps du goom */ + info->timeSinceLastGoom++; + info->timeSinceLastBigGoom++; + info->cycle++; + + /* detection des nouveaux gooms */ + if ((info->speedvar > (float)IVAL(info->biggoom_speed_limit_p)/100.0f) + && (info->accelvar > info->bigGoomLimit) + && (info->timeSinceLastBigGoom > BIG_GOOM_DURATION)) { + info->timeSinceLastBigGoom = 0; + } + + if (info->accelvar > info->goom_limit) { + /* TODO: tester && (info->timeSinceLastGoom > 20)) { */ + info->totalgoom ++; + info->timeSinceLastGoom = 0; + info->goomPower = info->accelvar - info->goom_limit; + } + + if (info->accelvar > info->prov_max) + info->prov_max = info->accelvar; + + if (info->goom_limit>1) + info->goom_limit=1; + + /* toute les 2 secondes : vérifier si le taux de goom est correct + * et le modifier sinon.. */ + if (info->cycle % 64 == 0) { + if (info->speedvar<0.01f) + info->goom_limit *= 0.91; + if (info->totalgoom > 4) { + info->goom_limit+=0.02; + } + if (info->totalgoom > 7) { + info->goom_limit*=1.03f; + info->goom_limit+=0.03; + } + if (info->totalgoom > 16) { + info->goom_limit*=1.05f; + info->goom_limit+=0.04; + } + if (info->totalgoom == 0) { + info->goom_limit = info->prov_max - 0.02; + } + if ((info->totalgoom == 1) && (info->goom_limit > 0.02)) + info->goom_limit-=0.01; + info->totalgoom = 0; + info->bigGoomLimit = info->goom_limit * (1.0f + (float)IVAL(info->biggoom_factor_p)/500.0f); + info->prov_max = 0; + } + + /* mise a jour des parametres pour la GUI */ + FVAL(info->volume_p) = info->volume; + info->volume_p.change_listener(&info->volume_p); + FVAL(info->speed_p) = info->speedvar * 4; + info->speed_p.change_listener(&info->speed_p); + FVAL(info->accel_p) = info->accelvar; + info->accel_p.change_listener(&info->accel_p); + + FVAL(info->goom_limit_p) = info->goom_limit; + info->goom_limit_p.change_listener(&info->goom_limit_p); + FVAL(info->goom_power_p) = info->goomPower; + info->goom_power_p.change_listener(&info->goom_power_p); + FVAL(info->last_goom_p) = 1.0-((float)info->timeSinceLastGoom/20.0f); + info->last_goom_p.change_listener(&info->last_goom_p); + FVAL(info->last_biggoom_p) = 1.0-((float)info->timeSinceLastBigGoom/40.0f); + info->last_biggoom_p.change_listener(&info->last_biggoom_p); + + /* bigGoomLimit ==goomLimit*9/8+7 ? */ + } + diff --git a/src/visualizations/Goom/goom2k4-0/src/sound_tester.h b/src/visualizations/Goom/goom2k4-0/src/sound_tester.h new file mode 100644 index 0000000000..51545a80e1 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/sound_tester.h @@ -0,0 +1,11 @@ +#ifndef _SOUND_TESTER_H +#define _SOUND_TESTER_H + +#include "goom_plugin_info.h" +#include "goom_config.h" + +/** change les donnees du SoundInfo */ +void evaluate_sound(gint16 data[2][512], SoundInfo *sndInfo); + +#endif + diff --git a/src/visualizations/Goom/goom2k4-0/src/surf3d.c b/src/visualizations/Goom/goom2k4-0/src/surf3d.c new file mode 100644 index 0000000000..ba8c69094d --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/surf3d.c @@ -0,0 +1,107 @@ +#include "surf3d.h" +#include "goom_plugin_info.h" +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center) { + int x = defx; + int y = defz; + grid3d *g = malloc (sizeof(grid3d)); + surf3d *s = &(g->surf); + s->nbvertex = x*y; + s->vertex = malloc (x*y*sizeof(v3d)); + s->svertex = malloc (x*y*sizeof(v3d)); + s->center = center; + + g->defx=defx; + g->sizex=sizex; + g->defz=defz; + g->sizez=sizez; + g->mode=0; + + while (y) { + --y; + x = defx; + while (x) { + --x; + s->vertex[x+defx*y].x = (float)(x-defx/2)*sizex/defx; + s->vertex[x+defx*y].y = 0; + s->vertex[x+defx*y].z = (float)(y-defz/2)*sizez/defz; + } + } + return g; +} + +void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow, + int dist, Pixel *buf, Pixel *back, int W,int H) { + + int x; + v2d v2,v2x; + + v2d *v2_array = malloc(g->surf.nbvertex * sizeof(v2d)); + v3d_to_v2d(g->surf.svertex, g->surf.nbvertex, W, H, dist, v2_array); + + for (x=0;x<g->defx;x++) { + int z; + v2x = v2_array[x]; + + for (z=1;z<g->defz;z++) { + v2 = v2_array[z*g->defx + x]; + if (((v2.x != -666) || (v2.y!=-666)) + && ((v2x.x != -666) || (v2x.y!=-666))) { + plug->methods.draw_line (buf,v2x.x,v2x.y,v2.x,v2.y, colorlow, W, H); + plug->methods.draw_line (back,v2x.x,v2x.y,v2.x,v2.y, color, W, H); + } + v2x = v2; + } + } + + free(v2_array); +} + +void surf3d_rotate (surf3d *s, float angle) { + int i; + float cosa; + float sina; + SINCOS(angle,sina,cosa); + for (i=0;i<s->nbvertex;i++) { + Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina); + } +} + +void surf3d_translate (surf3d *s) { + int i; + for (i=0;i<s->nbvertex;i++) { + TRANSLATE_V3D(s->center,s->svertex[i]); + } +} + +void grid3d_update (grid3d *g, float angle, float *vals, float dist) { + int i; + float cosa; + float sina; + surf3d *s = &(g->surf); + v3d cam = s->center; + cam.z += dist; + + SINCOS((angle/4.3f),sina,cosa); + cam.y += sina*2.0f; + SINCOS(angle,sina,cosa); + + if (g->mode==0) { + if (vals) + for (i=0;i<g->defx;i++) + s->vertex[i].y = s->vertex[i].y*0.2 + vals[i]*0.8; + + for (i=g->defx;i<s->nbvertex;i++) { + s->vertex[i].y *= 0.255f; + s->vertex[i].y += (s->vertex[i-g->defx].y * 0.777f); + } + } + + for (i=0;i<s->nbvertex;i++) { + Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina); + TRANSLATE_V3D(cam,s->svertex[i]); + } +} diff --git a/src/visualizations/Goom/goom2k4-0/src/surf3d.h b/src/visualizations/Goom/goom2k4-0/src/surf3d.h new file mode 100644 index 0000000000..482b6a090c --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/surf3d.h @@ -0,0 +1,38 @@ +#ifndef _SURF3D_H +#define _SURF3D_H + +#include "v3d.h" +#include "goom_graphic.h" +#include "goom_typedefs.h" + +typedef struct { + v3d *vertex; + v3d *svertex; + int nbvertex; + + v3d center; +} surf3d; + +typedef struct { + surf3d surf; + + int defx; + int sizex; + int defz; + int sizez; + int mode; +} grid3d; + +/* hi-level */ + +/* works on grid3d */ +grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center); +void grid3d_update (grid3d *s, float angle, float *vals, float dist); + +/* low level */ +void surf3d_draw (surf3d *s, int color, int dist, int *buf, int *back, int W,int H); +void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow, int dist, Pixel *buf, Pixel *back, int W,int H); +void surf3d_rotate (surf3d *s, float angle); +void surf3d_translate (surf3d *s); + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/surf3d.s b/src/visualizations/Goom/goom2k4-0/src/surf3d.s new file mode 100644 index 0000000000..f8c8c5d440 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/surf3d.s @@ -0,0 +1,484 @@ + .file "surf3d.c" + .version "01.01" +gcc2_compiled.: +.text + .align 4 +.globl grid3d_new + .type grid3d_new,@function +grid3d_new: + pushl %ebp + movl %esp,%ebp + subl $44,%esp + pushl %edi + pushl %esi + pushl %ebx + movl 20(%ebp),%eax + movl 12(%ebp),%esi + movl %eax,-8(%ebp) + addl $-12,%esp + pushl $44 + call malloc + movl %esi,%edx + imull -8(%ebp),%edx + movl %eax,%edi + movl %edx,-12(%ebp) + leal (%edx,%edx,2),%ebx + movl %edx,8(%edi) + addl $-12,%esp + sall $2,%ebx + pushl %ebx + call malloc + addl $32,%esp + movl %eax,(%edi) + addl $-12,%esp + pushl %ebx + call malloc + movl %eax,4(%edi) + movl 24(%ebp),%eax + movl %eax,12(%edi) + movl 28(%ebp),%eax + movl %eax,16(%edi) + movl 32(%ebp),%eax + movl %eax,20(%edi) + movl 8(%ebp),%eax + movl %eax,28(%edi) + movl %esi,24(%edi) + movl -8(%ebp),%edx + movl 16(%ebp),%eax + movl %edx,32(%edi) + movl %eax,36(%edi) + movl $0,40(%edi) + testl %edx,%edx + je .L480 + movl %esi,%eax + movl %esi,-28(%ebp) + shrl $31,%eax + addl %eax,%esi + movl -8(%ebp),%eax + shrl $31,%eax + addl -8(%ebp),%eax + movl -12(%ebp),%edx + sarl $1,%eax + movl %edx,-24(%ebp) + negl -28(%ebp) + movl %esi,-16(%ebp) + movl %eax,-20(%ebp) + .p2align 4,,7 +.L481: + movl -28(%ebp),%eax + addl %eax,-24(%ebp) + decl -8(%ebp) + movl 12(%ebp),%esi + testl %esi,%esi + je .L479 + movl -8(%ebp),%eax + subl -20(%ebp),%eax + movl %eax,-4(%ebp) + fildl -4(%ebp) + movl %esi,-4(%ebp) + movl -24(%ebp),%edx + leal (%edx,%esi),%eax + movl -16(%ebp),%ebx + fildl 16(%ebp) + leal (%eax,%eax,2),%eax + sarl $1,%ebx + leal 0(,%eax,4),%ecx + fmulp %st,%st(1) + fildl 20(%ebp) + fdivrp %st,%st(1) + fildl 8(%ebp) + fildl -4(%ebp) + jmp .L484 +.L487: + fxch %st(2) + .p2align 4,,7 +.L484: + decl %esi + movl %esi,%eax + movl (%edi),%edx + subl %ebx,%eax + movl %eax,-4(%ebp) + fildl -4(%ebp) + addl $-12,%ecx + fmul %st(2),%st + fdiv %st(1),%st + fstps (%edx,%ecx) + fxch %st(2) + movl (%edi),%eax + movl $0,4(%eax,%ecx) + movl (%edi),%eax + fsts 8(%eax,%ecx) + testl %esi,%esi + jne .L487 + fstp %st(0) + fstp %st(0) + fstp %st(0) +.L479: + cmpl $0,-8(%ebp) + jne .L481 +.L480: + leal -56(%ebp),%esp + popl %ebx + movl %edi,%eax + popl %esi + popl %edi + leave + ret +.Lfe1: + .size grid3d_new,.Lfe1-grid3d_new +.section .rodata + .align 8 +.LC48: + .long 0x0,0x3fe00000 + .align 4 +.LC49: + .long 0x3f19999a + .align 4 +.LC50: + .long 0x3ee3d70a +.text + .align 4 +.globl grid3d_update + .type grid3d_update,@function +grid3d_update: + pushl %ebp + movl %esp,%ebp + subl $32,%esp + pushl %esi + pushl %ebx + flds 12(%ebp) + movl 8(%ebp),%ebx + movl 16(%ebp),%ecx + fld %st(0) +#APP + fsin +#NO_APP + fstps -4(%ebp) + flds -4(%ebp) + fxch %st(1) +#APP + fcos +#NO_APP + fstps -4(%ebp) + flds -4(%ebp) + cmpl $0,40(%ebx) + jne .L519 + testl %ecx,%ecx + je .L520 + xorl %esi,%esi + cmpl 24(%ebx),%esi + jge .L520 + fldl .LC48 + xorl %edx,%edx + .p2align 4,,7 +.L524: + movl (%ebx),%eax + fld %st(0) + fld %st(1) + fxch %st(1) + fmuls 4(%eax,%edx) + fxch %st(1) + fmuls (%ecx,%esi,4) + faddp %st,%st(1) + incl %esi + fstps 4(%eax,%edx) + addl $12,%edx + cmpl 24(%ebx),%esi + jl .L524 + fstp %st(0) +.L520: + movl 24(%ebx),%esi + cmpl 8(%ebx),%esi + jge .L519 + leal (%esi,%esi,2),%eax + flds .LC49 + flds .LC50 + leal 0(,%eax,4),%ecx + .p2align 4,,7 +.L529: + movl (%ebx),%eax + flds 4(%eax,%ecx) + fmul %st(2),%st + fstps 4(%eax,%ecx) + movl %esi,%eax + subl 24(%ebx),%eax + movl (%ebx),%edx + leal (%eax,%eax,2),%eax + flds 4(%edx,%eax,4) + fmul %st(1),%st + fadds 4(%edx,%ecx) + incl %esi + fstps 4(%edx,%ecx) + addl $12,%ecx + cmpl 8(%ebx),%esi + jl .L529 + fstp %st(0) + fstp %st(0) +.L519: + xorl %esi,%esi + cmpl 8(%ebx),%esi + jge .L536 + xorl %ecx,%ecx + .p2align 4,,7 +.L534: + movl (%ebx),%eax + flds (%eax,%ecx) + flds 8(%eax,%ecx) + fmul %st(2),%st + fxch %st(1) + fmul %st(3),%st + fsubp %st,%st(1) + movl 4(%ebx),%edx + incl %esi + fstps (%edx,%ecx) + movl (%ebx),%eax + flds (%eax,%ecx) + flds 8(%eax,%ecx) + fxch %st(1) + fmul %st(2),%st + fxch %st(1) + fmul %st(3),%st + faddp %st,%st(1) + movl 4(%ebx),%edx + fstps 8(%edx,%ecx) + movl (%ebx),%eax + flds 4(%eax,%ecx) + movl 4(%ebx),%edx + fstps 4(%edx,%ecx) + movl 4(%ebx),%eax + flds (%eax,%ecx) + fadds 12(%ebx) + fstps (%eax,%ecx) + movl 4(%ebx),%eax + flds 4(%eax,%ecx) + fadds 16(%ebx) + fstps 4(%eax,%ecx) + movl 4(%ebx),%eax + flds 8(%eax,%ecx) + fadds 20(%ebx) + fstps 8(%eax,%ecx) + addl $12,%ecx + cmpl 8(%ebx),%esi + jl .L534 +.L536: + fstp %st(0) + fstp %st(0) + popl %ebx + popl %esi + leave + ret +.Lfe2: + .size grid3d_update,.Lfe2-grid3d_update +.section .rodata + .align 4 +.LC51: + .long 0x40000000 + .align 8 +.LC52: + .long 0x0,0x42380000 +.text + .align 4 +.globl surf3d_draw + .type surf3d_draw,@function +surf3d_draw: + pushl %ebp + movl %esp,%ebp + subl $60,%esp + pushl %edi + pushl %esi + pushl %ebx + movl $0,-20(%ebp) + movl -20(%ebp),%edx + movl 8(%ebp),%eax + cmpl 8(%eax),%edx + jge .L493 + fldl .LC52 + flds .LC51 + xorl %edi,%edi + .p2align 4,,7 +.L495: + movl 8(%ebp),%eax + movl 4(%eax),%eax + movl %eax,-36(%ebp) + fcoms 8(%eax,%edi) + fnstsw %ax + andb $69,%ah + cmpb $1,%ah + jne .L496 + fildl 16(%ebp) + movl -36(%ebp),%edx + fld %st(0) + fmuls (%edx,%edi) + fdivs 8(%edx,%edi) + fld %st(3) + faddp %st,%st(1) + fstpl -32(%ebp) + movl -32(%ebp),%eax + movl -28(%ebp),%edx + movl %eax,-40(%ebp) + sarl $16,-40(%ebp) + movl -36(%ebp),%edx + fmuls 4(%edx,%edi) + fdivs 8(%edx,%edi) + movl -40(%ebp),%ecx + fld %st(2) + faddp %st,%st(1) + fstpl -32(%ebp) + movl -32(%ebp),%eax + movl -28(%ebp),%edx + movl %eax,-44(%ebp) + movl 28(%ebp),%eax + sarl $1,%eax + addl %eax,%ecx + movl 32(%ebp),%eax + sarl $16,-44(%ebp) + sarl $1,%eax + movl %ecx,%ebx + subl -44(%ebp),%eax + movl %eax,%esi + cmpl 28(%ebp),%ebx + jge .L496 + testl %ecx,%ecx + jl .L496 + cmpl 32(%ebp),%esi + jge .L496 + testl %eax,%eax + jge .L499 +.L496: + xorl %esi,%esi + xorl %ebx,%ebx +.L499: + movl 20(%ebp),%eax + movl %ebx,%edx + leal (%eax,%edx,4),%edx + movl 28(%ebp),%eax + imull %esi,%eax + leal (%edx,%eax,4),%eax + testl %ebx,%ebx + je .L494 + testl %esi,%esi + je .L494 +#APP + movd (%eax), %mm0 + paddusb 12(%ebp), %mm0 + movd %mm0, (%eax) +#NO_APP +.L494: + incl -20(%ebp) + addl $12,%edi + movl -20(%ebp),%eax + movl 8(%ebp),%edx + cmpl 8(%edx),%eax + jl .L495 + fstp %st(0) + fstp %st(0) +.L493: + popl %ebx + popl %esi + popl %edi + leave + ret +.Lfe3: + .size surf3d_draw,.Lfe3-surf3d_draw + .align 4 +.globl surf3d_rotate + .type surf3d_rotate,@function +surf3d_rotate: + pushl %ebp + movl %esp,%ebp + subl $32,%esp + pushl %esi + pushl %ebx + flds 12(%ebp) + movl 8(%ebp),%ebx + fld %st(0) +#APP + fsin +#NO_APP + fstps -4(%ebp) + flds -4(%ebp) + fxch %st(1) +#APP + fcos +#NO_APP + fstps -4(%ebp) + xorl %esi,%esi + flds -4(%ebp) + cmpl 8(%ebx),%esi + jge .L537 + xorl %ecx,%ecx + .p2align 4,,7 +.L508: + movl (%ebx),%eax + flds (%eax,%ecx) + flds 8(%eax,%ecx) + fmul %st(2),%st + fxch %st(1) + fmul %st(3),%st + fsubp %st,%st(1) + movl 4(%ebx),%edx + incl %esi + fstps (%edx,%ecx) + movl (%ebx),%eax + flds (%eax,%ecx) + flds 8(%eax,%ecx) + fxch %st(1) + fmul %st(2),%st + fxch %st(1) + fmul %st(3),%st + faddp %st,%st(1) + movl 4(%ebx),%edx + fstps 8(%edx,%ecx) + movl (%ebx),%eax + flds 4(%eax,%ecx) + movl 4(%ebx),%edx + fstps 4(%edx,%ecx) + addl $12,%ecx + cmpl 8(%ebx),%esi + jl .L508 +.L537: + fstp %st(0) + fstp %st(0) + popl %ebx + popl %esi + leave + ret +.Lfe4: + .size surf3d_rotate,.Lfe4-surf3d_rotate + .align 4 +.globl surf3d_translate + .type surf3d_translate,@function +surf3d_translate: + pushl %ebp + movl %esp,%ebp + pushl %ebx + movl 8(%ebp),%ecx + xorl %ebx,%ebx + cmpl 8(%ecx),%ebx + jge .L512 + xorl %edx,%edx + .p2align 4,,7 +.L514: + movl 4(%ecx),%eax + flds (%eax,%edx) + fadds 12(%ecx) + incl %ebx + fstps (%eax,%edx) + movl 4(%ecx),%eax + flds 4(%eax,%edx) + fadds 16(%ecx) + fstps 4(%eax,%edx) + movl 4(%ecx),%eax + flds 8(%eax,%edx) + fadds 20(%ecx) + fstps 8(%eax,%edx) + addl $12,%edx + cmpl 8(%ecx),%ebx + jl .L514 +.L512: + popl %ebx + leave + ret +.Lfe5: + .size surf3d_translate,.Lfe5-surf3d_translate + .ident "GCC: (GNU) 2.95.3 19991030 (prerelease)" diff --git a/src/visualizations/Goom/goom2k4-0/src/tentacle3d.c b/src/visualizations/Goom/goom2k4-0/src/tentacle3d.c new file mode 100644 index 0000000000..343c106cc6 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/tentacle3d.c @@ -0,0 +1,299 @@ +#include <stdlib.h> + +#include "v3d.h" +#include "surf3d.h" +#include "goom_tools.h" +#include "goom_config.h" +#include "goom_plugin_info.h" +#include "tentacle3d.h" + +#define D 256.0f + +#define nbgrid 6 +#define definitionx 15 +#define definitionz 45 + +typedef struct _TENTACLE_FX_DATA { + PluginParam enabled_bp; + PluginParameters params; + + float cycle; + grid3d *grille[nbgrid]; + float *vals; + +#define NB_TENTACLE_COLORS 4 + int colors[NB_TENTACLE_COLORS]; + + int col; + int dstcol; + float lig; + float ligs; + + /* statics from pretty_move */ + float distt; + float distt2; + float rot; /* entre 0 et 2 * M_PI */ + int happens; + int rotation; + int lock; +} TentacleFXData; + +static void tentacle_new (TentacleFXData *data); +static void tentacle_update(PluginInfo *goomInfo, Pixel *buf, Pixel *back, int W, int H, + short[2][512], float, int drawit, TentacleFXData *data); +static void tentacle_free (TentacleFXData *data); + +/* + * VisualFX wrapper for the tentacles + */ + +static void tentacle_fx_init(VisualFX *_this, PluginInfo *info) { + + TentacleFXData *data = (TentacleFXData*)malloc(sizeof(TentacleFXData)); + + data->enabled_bp = secure_b_param("Enabled", 1); + data->params = plugin_parameters ("3D Tentacles", 1); + data->params.params[0] = &data->enabled_bp; + + data->cycle = 0.0f; + data->col = (0x28<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x5f<<(BLEU*8)); + data->dstcol = 0; + data->lig = 1.15f; + data->ligs = 0.1f; + + data->distt = 10.0f; + data->distt2 = 0.0f; + data->rot = 0.0f; /* entre 0 et 2 * M_PI */ + data->happens = 0; + + data->rotation = 0; + data->lock = 0; + data->colors[0] = (0x18<<(ROUGE*8))|(0x4c<<(VERT*8))|(0x2f<<(BLEU*8)); + data->colors[1] = (0x48<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x6f<<(BLEU*8)); + data->colors[2] = (0x58<<(ROUGE*8))|(0x3c<<(VERT*8))|(0x0f<<(BLEU*8)); + data->colors[3] = (0x87<<(ROUGE*8))|(0x55<<(VERT*8))|(0x74<<(BLEU*8)); + tentacle_new(data); + + _this->params = &data->params; + _this->fx_data = (void*)data; +} + +static void tentacle_fx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo) +{ + TentacleFXData *data = (TentacleFXData*)_this->fx_data; + if (BVAL(data->enabled_bp)) { + tentacle_update(goomInfo, dest, src, goomInfo->screen.width, + goomInfo->screen.height, goomInfo->sound.samples, + (float)goomInfo->sound.accelvar, + goomInfo->curGState->drawTentacle, data); + } +} + +static void tentacle_fx_free(VisualFX *_this) { + TentacleFXData *data = (TentacleFXData*)_this->fx_data; + free(data->params.params); + tentacle_free(data); + free(_this->fx_data); +} + +VisualFX tentacle_fx_create(void) { + VisualFX fx; + fx.init = tentacle_fx_init; + fx.apply = tentacle_fx_apply; + fx.free = tentacle_fx_free; + return fx; +} + +/* ----- */ + +static void tentacle_free (TentacleFXData *data) { + /* TODO : un vrai FREE GRID!! */ + int tmp; + for (tmp=0;tmp<nbgrid;tmp++){ + grid3d *g = data->grille[tmp]; + free (g->surf.vertex); + free (g->surf.svertex); + free (g); + } + free (data->vals); +} + +static void tentacle_new (TentacleFXData *data) { + int tmp; + + v3d center = {0,-17.0,0}; + data->vals = (float*)malloc ((definitionx+20)*sizeof(float)); + + for (tmp=0;tmp<nbgrid;tmp++) { + int x,z; + z = 45 + rand() % 30; + x = 85 + rand() % 5; + center.z = z; + data->grille[tmp] = grid3d_new (x, definitionx, z, definitionz + rand() % 10, center); + center.y += 8; + } +} + +static inline unsigned char lighten (unsigned char value, float power) +{ + int val = value; + float t = (float) val * log10(power) / 2.0; + + if (t > 0) { + val = (int) t; /* (32.0f * log (t)); */ + if (val > 255) + val = 255; + if (val < 0) + val = 0; + return val; + } + else { + return 0; + } +} + +static void lightencolor (int *col, float power) +{ + unsigned char *color; + + color = (unsigned char *) col; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); +} + +/* retourne x>>s , en testant le signe de x */ +#define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s)) + +static int evolutecolor (unsigned int src,unsigned int dest, + unsigned int mask, unsigned int incr) { + + int color = src & (~mask); + src &= mask; + dest &= mask; + + if ((src!=mask) + &&(src<dest)) + src += incr; + + if (src>dest) + src -= incr; + return (src&mask)|color; +} + +static void pretty_move (PluginInfo *goomInfo, float cycle, float *dist, float *dist2, float *rotangle, TentacleFXData *fx_data) { + + float tmp; + + /* many magic numbers here... I don't really like that. */ + if (fx_data->happens) + fx_data->happens -= 1; + else if (fx_data->lock == 0) { + fx_data->happens = goom_irand(goomInfo->gRandom,200)?0:100+goom_irand(goomInfo->gRandom,60); + fx_data->lock = fx_data->happens * 3 / 2; + } + else fx_data->lock --; + + tmp = fx_data->happens?8.0f:0; + *dist2 = fx_data->distt2 = (tmp + 15.0f*fx_data->distt2)/16.0f; + + tmp = 30+D-90.0f*(1.0f+sin(cycle*19/20)); + if (fx_data->happens) + tmp *= 0.6f; + + *dist = fx_data->distt = (tmp + 3.0f*fx_data->distt)/4.0f; + + if (!fx_data->happens){ + tmp = M_PI*sin(cycle)/32+3*M_PI/2; + } + else { + fx_data->rotation = goom_irand(goomInfo->gRandom,500)?fx_data->rotation:goom_irand(goomInfo->gRandom,2); + if (fx_data->rotation) + cycle *= 2.0f*M_PI; + else + cycle *= -1.0f*M_PI; + tmp = cycle - (M_PI*2.0) * floor(cycle/(M_PI*2.0)); + } + + if (abs(tmp-fx_data->rot) > abs(tmp-(fx_data->rot+2.0*M_PI))) { + fx_data->rot = (tmp + 15.0f*(fx_data->rot+2*M_PI)) / 16.0f; + if (fx_data->rot>2.0*M_PI) + fx_data->rot -= 2.0*M_PI; + *rotangle = fx_data->rot; + } + else if (abs(tmp-fx_data->rot) > abs(tmp-(fx_data->rot-2.0*M_PI))) { + fx_data->rot = (tmp + 15.0f*(fx_data->rot-2.0*M_PI)) / 16.0f; + if (fx_data->rot<0.0f) + fx_data->rot += 2.0*M_PI; + *rotangle = fx_data->rot; + } + else + *rotangle = fx_data->rot = (tmp + 15.0f*fx_data->rot) / 16.0f; +} + +static void tentacle_update(PluginInfo *goomInfo, Pixel *buf, Pixel *back, int W, int H, + short data[2][512], float rapport, int drawit, TentacleFXData *fx_data) { + + int tmp; + int tmp2; + + int color; + int colorlow; + + float dist,dist2,rotangle; + + if ((!drawit) && (fx_data->ligs>0.0f)) + fx_data->ligs = -fx_data->ligs; + + fx_data->lig += fx_data->ligs; + + if (fx_data->lig > 1.01f) { + if ((fx_data->lig>10.0f) | (fx_data->lig<1.1f)) fx_data->ligs = -fx_data->ligs; + + if ((fx_data->lig<6.3f)&&(goom_irand(goomInfo->gRandom,30)==0)) + fx_data->dstcol=goom_irand(goomInfo->gRandom,NB_TENTACLE_COLORS); + + fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff,0x01); + fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff00,0x0100); + fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff0000,0x010000); + fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff000000,0x01000000); + + color = fx_data->col; + colorlow = fx_data->col; + + lightencolor(&color,fx_data->lig * 2.0f + 2.0f); + lightencolor(&colorlow,(fx_data->lig/3.0f)+0.67f); + + rapport = 1.0f + 2.0f * (rapport - 1.0f); + rapport *= 1.2f; + if (rapport > 1.12f) + rapport = 1.12f; + + pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data); + + for (tmp=0;tmp<nbgrid;tmp++) { + for (tmp2=0;tmp2<definitionx;tmp2++) { + float val = (float)(ShiftRight(data[0][goom_irand(goomInfo->gRandom,511)],10)) * rapport; + fx_data->vals[tmp2] = val; + } + + grid3d_update (fx_data->grille[tmp], rotangle, fx_data->vals, dist2); + } + fx_data->cycle+=0.01f; + for (tmp=0;tmp<nbgrid;tmp++) + grid3d_draw (goomInfo, fx_data->grille[tmp],color,colorlow,dist,buf,back,W,H); + } + else { + fx_data->lig = 1.05f; + if (fx_data->ligs < 0.0f) + fx_data->ligs = -fx_data->ligs; + pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data); + fx_data->cycle+=0.1f; + if (fx_data->cycle > 1000) + fx_data->cycle = 0; + } +} diff --git a/src/visualizations/Goom/goom2k4-0/src/tentacle3d.h b/src/visualizations/Goom/goom2k4-0/src/tentacle3d.h new file mode 100644 index 0000000000..ad0858fadf --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/tentacle3d.h @@ -0,0 +1,8 @@ +#ifndef _TENTACLE3D_H +#define _TENTACLE3D_H + +#include "goom_visual_fx.h" + +VisualFX tentacle_fx_create(void); + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/v3d.c b/src/visualizations/Goom/goom2k4-0/src/v3d.c new file mode 100644 index 0000000000..1614e8afdb --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/v3d.c @@ -0,0 +1,15 @@ +#include "v3d.h" + +void v3d_to_v2d(v3d *v3, int nbvertex, int width, int height, float distance, v2d *v2) { + int i; + for (i=0;i<nbvertex;++i) { + if (v3[i].z > 2) { + int Xp, Yp; + F2I((distance * v3[i].x / v3[i].z),Xp); + F2I((distance * v3[i].y / v3[i].z),Yp); + v2[i].x = Xp + (width>>1); + v2[i].y = -Yp + (height>>1); + } + else v2[i].x=v2[i].y=-666; + } +} diff --git a/src/visualizations/Goom/goom2k4-0/src/v3d.h b/src/visualizations/Goom/goom2k4-0/src/v3d.h new file mode 100644 index 0000000000..7690847f20 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/v3d.h @@ -0,0 +1,65 @@ +#ifndef _V3D_H +#define _V3D_H + +#include <math.h> +#include <stdlib.h> +#include <stdio.h> + +#include "mathtools.h" + +typedef struct { + float x,y,z; +} v3d; + +typedef struct { + int x,y; +} v2d; + +typedef struct { + double x,y; +} v2g; + +/* + * projete le vertex 3D sur le plan d'affichage + * retourne (0,0) si le point ne doit pas etre affiche. + * + * bonne valeur pour distance : 256 + */ +#define V3D_TO_V2D(v3,v2,width,height,distance) \ +{ \ + int Xp, Yp; \ + if (v3.z > 2) { \ + F2I((distance * v3.x / v3.z),Xp) ; \ + F2I((distance * v3.y / v3.z),Yp) ; \ + v2.x = Xp + (width>>1); \ + v2.y = -Yp + (height>>1); \ + } \ + else v2.x=v2.y=-666; \ +} + +void v3d_to_v2d(v3d *src, int nbvertex, int width, int height, float distance, v2d *v2_array); + +/* + * rotation selon Y du v3d vi d'angle a (cosa=cos(a), sina=sin(a)) + * centerz = centre de rotation en z + */ +#define Y_ROTATE_V3D(vi,vf,sina,cosa)\ +{\ + vf.x = vi.x * cosa - vi.z * sina;\ + vf.z = vi.x * sina + vi.z * cosa;\ + vf.y = vi.y;\ +} + +/* + * translation + */ +#define TRANSLATE_V3D(vsrc,vdest)\ +{\ + vdest.x += vsrc.x;\ + vdest.y += vsrc.y;\ + vdest.z += vsrc.z;\ +} + +#define MUL_V3D(lf,v) {v.x*=lf;v.y*=lf;v.z*=lf;} + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/xmmx.c b/src/visualizations/Goom/goom2k4-0/src/xmmx.c new file mode 100644 index 0000000000..217e17cfbc --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/xmmx.c @@ -0,0 +1,390 @@ + +#ifdef HAVE_MMX + +/* a definir pour avoir exactement le meme resultat que la fonction C + * (un chouillat plus lent).. mais la difference est assez peu notable. + */ +// #define STRICT_COMPAT + +#define BUFFPOINTNB 16 +#define BUFFPOINTMASK 0xffff +#define BUFFINCR 0xff + +#define sqrtperte 16 +/* faire : a % sqrtperte <=> a & pertemask*/ +#define PERTEMASK 0xf +/* faire : a / sqrtperte <=> a >> PERTEDEC*/ +#define PERTEDEC 4 + + +/*#define MMX_TRACE*/ +#include "mmx.h" +/*#include "xmmx.h"*/ +#include "goom_graphic.h" + +int xmmx_supported (void) { + return (mm_support()&0x8)>>3; +} + +void zoom_filter_xmmx (int prevX, int prevY, + Pixel *expix1, Pixel *expix2, + int *lbruS, int *lbruD, int buffratio, + int precalCoef[16][16]) +{ + int bufsize = prevX * prevY; /* taille du buffer */ + volatile int loop; /* variable de boucle */ + + mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ + mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ + + volatile mmx_t prevXY; + volatile mmx_t ratiox; + /* volatile mmx_t interpix; */ + + expix1[0].val=expix1[prevX-1].val=expix1[prevX*prevY-1].val=expix1[prevX*prevY-prevX].val=0; + + prevXY.ud[0] = (prevX-1)<<PERTEDEC; + prevXY.ud[1] = (prevY-1)<<PERTEDEC; + + ratiox.d[0] = buffratio; + ratiox.d[1] = buffratio; + + asm volatile + ("\n\t movq %[ratio], %%mm6" + "\n\t pslld $16, %%mm6" /* mm6 = [rat16=buffratio<<16 | rat16=buffratio<<16] */ + "\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ + ::[ratio]"m"(ratiox)); + + loop=0; + + /* + * NOTE : mm6 et mm7 ne sont pas modifies dans la boucle. + */ + while (loop < bufsize) + { + /* Thread #1 + * pre : mm6 = [rat16|rat16] + * post : mm0 = S + ((D-S)*rat16 format [X|Y] + * modified = mm0,mm1,mm2 + */ + + asm volatile ("#1 \n\t movq 0(%[brutS]), %%mm0" + "#1 \n\t movq 0(%[brutD]), %%mm1" + "#1 \n\t psubd %%mm0, %%mm1" /* mm1 = D - S */ + "#1 \n\t movq %%mm1, %%mm2" /* mm2 = D - S */ + "#1 \n\t pslld $16, %%mm1" + "#1 \n\t pmullw %%mm6, %%mm2" + "#1 \n\t pmulhuw %%mm6, %%mm1" + "#1 \n\t pslld $16, %%mm0" + "#1 \n\t paddd %%mm2, %%mm1" /* mm1 = (D - S) * buffratio >> 16 */ + + "#1 \n\t paddd %%mm1, %%mm0" /* mm0 = S + mm1 */ + "#1 \n\t psrld $16, %%mm0" + : + :[brutS] "r" (&brutS[loop]) ,[brutD] "r" (&brutD[loop]) + ); /* mm0 = S */ + + /* + * pre : mm0 : position vector on screen + * prevXY : coordinate of the lower-right point on screen + * post : clipped mm0 + * modified : mm0,mm1,mm2 + */ + asm volatile + ("#1 \n\t movq %[prevXY], %%mm1" + "#1 \n\t pcmpgtd %%mm0, %%mm1" + /* mm0 en X contient (idem pour Y) : + * 1111 si prevXY > px + * 0000 si prevXY <= px */ +#ifdef STRICT_COMPAT + "#1 \n\t movq %%mm1, %%mm2" + "#1 \n\t punpckhdq %%mm2, %%mm2" + "#1 \n\t punpckldq %%mm1, %%mm1" + "#1 \n\t pand %%mm2, %%mm0" +#endif + + "#1 \n\t pand %%mm1, %%mm0" /* on met a zero la partie qui deborde */ + ::[prevXY]"m"(prevXY)); + + /* Thread #2 + * pre : mm0 : clipped position on screen + * + * post : mm3 : coefs for this position + * mm1 : X vector [0|X] + * + * modif : eax,esi + */ + __asm__ __volatile__ ( + "#2 \n\t movd %%mm0,%%esi" + "#2 \n\t movq %%mm0,%%mm1" + + "#2 \n\t andl $15,%%esi" + "#2 \n\t psrlq $32,%%mm1" + + "#2 \n\t shll $6,%%esi" + "#2 \n\t movd %%mm1,%%eax" + + "#2 \n\t addl %[precalCoef],%%esi" + "#2 \n\t andl $15,%%eax" + + "#2 \n\t movd (%%esi,%%eax,4),%%mm3" + ::[precalCoef]"g"(precalCoef):"eax","esi"); + + /* + * extraction des coefficients... (Thread #3) + * + * pre : coef dans mm3 + * + * post : coef extraits dans mm3 (c1 & c2) + * et mm4 (c3 & c4) + * + * modif : mm5 + */ + + /* (Thread #4) + * pre : mm0 : Y pos [*|Y] + * mm1 : X pos [*|X] + * + * post : mm0 : expix1[position] + * mm2 : expix1[position+largeur] + * + * modif : eax, esi + */ + __asm__ __volatile__ ( + "#2 \n\t psrld $4, %%mm0" + "#2 \n\t psrld $4, %%mm1" /* PERTEDEC = $4 */ + + "#4 \n\t movd %%mm1,%%eax" + "#3 \n\t movq %%mm3,%%mm5" + + "#4 \n\t mull %[prevX]" + "#4 \n\t movd %%mm0,%%esi" + + "#3 \n\t punpcklbw %%mm5, %%mm3" + "#4 \n\t addl %%esi, %%eax" + + "#3 \n\t movq %%mm3, %%mm4" + "#3 \n\t movq %%mm3, %%mm5" + + "#4 \n\t movl %[expix1], %%esi" + "#3 \n\t punpcklbw %%mm5, %%mm3" + + "#4 \n\t movq (%%esi,%%eax,4),%%mm0" + "#3 \n\t punpckhbw %%mm5, %%mm4" + + "#4 \n\t addl %[prevX],%%eax" + "#4 \n\t movq (%%esi,%%eax,4),%%mm2" + + : + : [expix1] "g"(expix1) + , [prevX] "g"(prevX) + :"eax","esi" + ); + + /* + * pre : mm0 : expix1[position] + * mm2 : expix1[position+largeur] + * mm3 & mm4 : coefs + */ + + /* recopie des deux premiers pixels dans mm0 et mm1 */ + movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ + + /* depackage du premier pixel */ + punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ + + /* extraction des coefficients... */ + + movq_r2r (mm3, mm5); /* c2-c2-c2-c2-c1-c1-c1-c1 */ + + /*^en parrallele^*/ /* depackage du 2ieme pixel */ + /*^*/ punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ + + punpcklbw_r2r (mm7, mm5); /* 00-c1-00-c1-00-c1-00-c1 */ + punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ + + /* multiplication des pixels par les coefficients */ + pmullw_r2r (mm5, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ + pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ + paddw_r2r (mm1, mm0); + + /* ...extraction des 2 derniers coefficients */ + movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ + punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ + punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ + + /* recuperation des 2 derniers pixels */ + movq_r2r (mm2, mm1); + + /* depackage des pixels */ + punpcklbw_r2r (mm7, mm1); + punpckhbw_r2r (mm7, mm2); + + /* multiplication pas les coeffs */ + pmullw_r2r (mm4, mm1); + pmullw_r2r (mm5, mm2); + + /* ajout des valeurs obtenues à la valeur finale */ + paddw_r2r (mm1, mm0); + paddw_r2r (mm2, mm0); + + /* division par 256 = 16+16+16+16, puis repackage du pixel final */ + psrlw_i2r (8, mm0); + packuswb_r2r (mm7, mm0); + + movd_r2m (mm0,expix2[loop]); + + ++loop; + } + __asm__ __volatile__ ("emms\n"); +} + +#define DRAWMETHOD_PLUS_XMMX(_out,_backbuf,_col) \ +{ \ + movd_m2r(_backbuf, mm0); \ + paddusb_m2r(_col, mm0); \ + movd_r2m(mm0, _out); \ +} + +#define DRAWMETHOD DRAWMETHOD_PLUS_XMMX(*p,*p,col) + +void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) +{ + int x, y, dx, dy, yy, xx; + Pixel *p; + + if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) + goto end_of_line; + + dx = x2 - x1; + dy = y2 - y1; + if (x1 >= x2) { + int tmp; + + tmp = x1; + x1 = x2; + x2 = tmp; + tmp = y1; + y1 = y2; + y2 = tmp; + dx = x2 - x1; + dy = y2 - y1; + } + + /* vertical line */ + if (dx == 0) { + if (y1 < y2) { + p = &(data[(screenx * y1) + x1]); + for (y = y1; y <= y2; y++) { + DRAWMETHOD; + p += screenx; + } + } + else { + p = &(data[(screenx * y2) + x1]); + for (y = y2; y <= y1; y++) { + DRAWMETHOD; + p += screenx; + } + } + goto end_of_line; + } + /* horizontal line */ + if (dy == 0) { + if (x1 < x2) { + p = &(data[(screenx * y1) + x1]); + for (x = x1; x <= x2; x++) { + DRAWMETHOD; + p++; + } + goto end_of_line; + } + else { + p = &(data[(screenx * y1) + x2]); + for (x = x2; x <= x1; x++) { + DRAWMETHOD; + p++; + } + goto end_of_line; + } + } + /* 1 */ + /* \ */ + /* \ */ + /* 2 */ + if (y2 > y1) { + /* steep */ + if (dy > dx) { + dx = ((dx << 16) / dy); + x = x1 << 16; + for (y = y1; y <= y2; y++) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p++; + /* DRAWMETHOD; */ + } + x += dx; + } + goto end_of_line; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + } + } + /* 2 */ + /* / */ + /* / */ + /* 1 */ + else { + /* steep */ + if (-dy > dx) { + dx = ((dx << 16) / -dy); + x = (x1 + 1) << 16; + for (y = y1; y >= y2; y--) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p--; + /* DRAWMETHOD; */ + } + x += dx; + } + goto end_of_line; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + goto end_of_line; + } + } +end_of_line: + __asm__ __volatile__ ("emms\n"); +} + +#endif diff --git a/src/visualizations/Goom/goom2k4-0/src/xmmx.h b/src/visualizations/Goom/goom2k4-0/src/xmmx.h new file mode 100644 index 0000000000..70ef36143e --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/src/xmmx.h @@ -0,0 +1,537 @@ +/* xmmx.h + + eXtended MultiMedia eXtensions GCC interface library for IA32. + + To use this library, simply include this header file + and compile with GCC. You MUST have inlining enabled + in order for xmmx_ok() to work; this can be done by + simply using -O on the GCC command line. + + Compiling with -DXMMX_TRACE will cause detailed trace + output to be sent to stderr for each mmx operation. + This adds lots of code, and obviously slows execution to + a crawl, but can be very useful for debugging. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT + LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR ANY PARTICULAR PURPOSE. + + 1999 by R. Fisher + Based on libmmx, 1997-99 by H. Dietz and R. Fisher + + Notes: + It appears that the latest gas has the pand problem fixed, therefore + I'll undefine BROKEN_PAND by default. +*/ + +#ifndef _XMMX_H +#define _XMMX_H + + +/* Warning: at this writing, the version of GAS packaged + with most Linux distributions does not handle the + parallel AND operation mnemonic correctly. If the + symbol BROKEN_PAND is defined, a slower alternative + coding will be used. If execution of mmxtest results + in an illegal instruction fault, define this symbol. +*/ +#undef BROKEN_PAND + + +/* The type of an value that fits in an (Extended) MMX register + (note that long long constant values MUST be suffixed + by LL and unsigned long long values by ULL, lest + they be truncated by the compiler) +*/ +#ifndef _MMX_H +typedef union { + long long q; /* Quadword (64-bit) value */ + unsigned long long uq; /* Unsigned Quadword */ + int d[2]; /* 2 Doubleword (32-bit) values */ + unsigned int ud[2]; /* 2 Unsigned Doubleword */ + short w[4]; /* 4 Word (16-bit) values */ + unsigned short uw[4]; /* 4 Unsigned Word */ + char b[8]; /* 8 Byte (8-bit) values */ + unsigned char ub[8]; /* 8 Unsigned Byte */ + float s[2]; /* Single-precision (32-bit) value */ +} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ +#endif + + + +/* Function to test if multimedia instructions are supported... +*/ +static int +mm_support(void) +{ + /* Returns 1 if MMX instructions are supported, + 3 if Cyrix MMX and Extended MMX instructions are supported + 5 if AMD MMX and 3DNow! instructions are supported + 0 if hardware does not support any of these + */ + register int rval = 0; + + __asm__ __volatile__ ( + /* See if CPUID instruction is supported ... */ + /* ... Get copies of EFLAGS into eax and ecx */ + "pushf\n\t" + "popl %%eax\n\t" + "movl %%eax, %%ecx\n\t" + + /* ... Toggle the ID bit in one copy and store */ + /* to the EFLAGS reg */ + "xorl $0x200000, %%eax\n\t" + "push %%eax\n\t" + "popf\n\t" + + /* ... Get the (hopefully modified) EFLAGS */ + "pushf\n\t" + "popl %%eax\n\t" + + /* ... Compare and test result */ + "xorl %%eax, %%ecx\n\t" + "testl $0x200000, %%ecx\n\t" + "jz NotSupported1\n\t" /* CPUID not supported */ + + + /* Get standard CPUID information, and + go to a specific vendor section */ + "movl $0, %%eax\n\t" + "cpuid\n\t" + + /* Check for Intel */ + "cmpl $0x756e6547, %%ebx\n\t" + "jne TryAMD\n\t" + "cmpl $0x49656e69, %%edx\n\t" + "jne TryAMD\n\t" + "cmpl $0x6c65746e, %%ecx\n" + "jne TryAMD\n\t" + "jmp Intel\n\t" + + /* Check for AMD */ + "\nTryAMD:\n\t" + "cmpl $0x68747541, %%ebx\n\t" + "jne TryCyrix\n\t" + "cmpl $0x69746e65, %%edx\n\t" + "jne TryCyrix\n\t" + "cmpl $0x444d4163, %%ecx\n" + "jne TryCyrix\n\t" + "jmp AMD\n\t" + + /* Check for Cyrix */ + "\nTryCyrix:\n\t" + "cmpl $0x69727943, %%ebx\n\t" + "jne NotSupported2\n\t" + "cmpl $0x736e4978, %%edx\n\t" + "jne NotSupported3\n\t" + "cmpl $0x64616574, %%ecx\n\t" + "jne NotSupported4\n\t" + /* Drop through to Cyrix... */ + + + /* Cyrix Section */ + /* See if extended CPUID level 80000001 is supported */ + /* The value of CPUID/80000001 for the 6x86MX is undefined + according to the Cyrix CPU Detection Guide (Preliminary + Rev. 1.01 table 1), so we'll check the value of eax for + CPUID/0 to see if standard CPUID level 2 is supported. + According to the table, the only CPU which supports level + 2 is also the only one which supports extended CPUID levels. + */ + "cmpl $0x2, %%eax\n\t" + "jne MMXtest\n\t" /* Use standard CPUID instead */ + + /* Extended CPUID supported (in theory), so get extended + features */ + "movl $0x80000001, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%eax\n\t" /* Test for MMX */ + "jz NotSupported5\n\t" /* MMX not supported */ + "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ + "jnz EMMXSupported\n\t" + "movl $1, %0:\n\n\t" /* MMX Supported */ + "jmp Return\n\n" + "EMMXSupported:\n\t" + "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */ + "jmp Return\n\t" + + + /* AMD Section */ + "AMD:\n\t" + + /* See if extended CPUID is supported */ + "movl $0x80000000, %%eax\n\t" + "cpuid\n\t" + "cmpl $0x80000000, %%eax\n\t" + "jl MMXtest\n\t" /* Use standard CPUID instead */ + + /* Extended CPUID supported, so get extended features */ + "movl $0x80000001, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%edx\n\t" /* Test for MMX */ + "jz NotSupported6\n\t" /* MMX not supported */ + "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ + "jnz ThreeDNowSupported\n\t" + "movl $1, %0:\n\n\t" /* MMX Supported */ + "jmp Return\n\n" + "ThreeDNowSupported:\n\t" + "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */ + "jmp Return\n\t" + + + /* Intel Section */ + "Intel:\n\t" + + /* Check for MMX */ + "MMXtest:\n\t" + "movl $1, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%edx\n\t" /* Test for MMX */ + "jz NotSupported7\n\t" /* MMX Not supported */ + "movl $1, %0:\n\n\t" /* MMX Supported */ + "jmp Return\n\t" + + /* Nothing supported */ + "\nNotSupported1:\n\t" + "#movl $101, %0:\n\n\t" + "\nNotSupported2:\n\t" + "#movl $102, %0:\n\n\t" + "\nNotSupported3:\n\t" + "#movl $103, %0:\n\n\t" + "\nNotSupported4:\n\t" + "#movl $104, %0:\n\n\t" + "\nNotSupported5:\n\t" + "#movl $105, %0:\n\n\t" + "\nNotSupported6:\n\t" + "#movl $106, %0:\n\n\t" + "\nNotSupported7:\n\t" + "#movl $107, %0:\n\n\t" + "movl $0, %0:\n\n\t" + + "Return:\n\t" + : "=a" (rval) + : /* no input */ + : "eax", "ebx", "ecx", "edx" + ); + + /* Return */ + return(rval); +} + +/* Function to test if mmx instructions are supported... +*/ +#ifndef _XMMX_H +inline extern int +mmx_ok(void) +{ + /* Returns 1 if MMX instructions are supported, 0 otherwise */ + return ( mm_support() & 0x1 ); +} +#endif + +/* Function to test if xmmx instructions are supported... +*/ +inline extern int +xmmx_ok(void) +{ + /* Returns 1 if Extended MMX instructions are supported, 0 otherwise */ + return ( (mm_support() & 0x2) >> 1 ); +} + + +/* Helper functions for the instruction macros that follow... + (note that memory-to-register, m2r, instructions are nearly + as efficient as register-to-register, r2r, instructions; + however, memory-to-memory instructions are really simulated + as a convenience, and are only 1/3 as efficient) +*/ +#ifdef XMMX_TRACE + +/* Include the stuff for printing a trace to stderr... +*/ + +#include <stdio.h> + +#define mmx_i2r(op, imm, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace.uq = (imm); \ + fprintf(stderr, #op "_i2r(" #imm "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2r(op, mem, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mem); \ + fprintf(stderr, #op "_m2r(" #mem "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2m(op, reg, mem) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #op "_r2m(" #reg "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (mem); \ + fprintf(stderr, #mem "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ); \ + mmx_trace = (mem); \ + fprintf(stderr, #mem "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2r(op, regs, regd) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #regs ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #op "_r2r(" #regs "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #regd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #regd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2m(op, mems, memd) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mems); \ + fprintf(stderr, #op "_m2m(" #mems "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (memd); \ + fprintf(stderr, #memd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)); \ + mmx_trace = (memd); \ + fprintf(stderr, #memd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#else + +/* These macros are a lot simpler without the tracing... +*/ + +#define mmx_i2r(op, imm, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm) ) + +#define mmx_m2r(op, mem, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)) + +#define mmx_m2ir(op, mem, rs) \ + __asm__ __volatile__ (#op " %0, %%" #rs \ + : /* nothing */ \ + : "X" (mem) ) + +#define mmx_r2m(op, reg, mem) \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ) + +#define mmx_r2r(op, regs, regd) \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd) + +#define mmx_r2ir(op, rs1, rs2) \ + __asm__ __volatile__ (#op " %%" #rs1 ", %%" #rs2 \ + : /* nothing */ \ + : /* nothing */ ) + +#define mmx_m2m(op, mems, memd) \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)) + +#endif + + + +/* 1x64 MOVe Quadword + (this is both a load and a store... + in fact, it is the only way to store) +*/ +#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +#define movq(vars, vard) \ + __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 1x32 MOVe Doubleword + (like movq, this is both load and store... + but is most useful for moving things between + mmx registers and ordinary registers) +*/ +#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +#define movd(vars, vard) \ + __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ + "movd %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + + +/* 4x16 Parallel MAGnitude +*/ +#define pmagw_m2r(var, reg) mmx_m2r(pmagw, var, reg) +#define pmagw_r2r(regs, regd) mmx_r2r(pmagw, regs, regd) +#define pmagw(vars, vard) mmx_m2m(pmagw, vars, vard) + + +/* 4x16 Parallel ADDs using Saturation arithmetic + and Implied destination +*/ +#define paddsiw_m2ir(var, rs) mmx_m2ir(paddsiw, var, rs) +#define paddsiw_r2ir(rs1, rs2) mmx_r2ir(paddsiw, rs1, rs2) +#define paddsiw(vars, vard) mmx_m2m(paddsiw, vars, vard) + + +/* 4x16 Parallel SUBs using Saturation arithmetic + and Implied destination +*/ +#define psubsiw_m2ir(var, rs) mmx_m2ir(psubsiw, var, rs) +#define psubsiw_r2ir(rs1, rs2) mmx_r2ir(psubsiw, rs1, rs2) +#define psubsiw(vars, vard) mmx_m2m(psubsiw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results + Rounded with 1/2 bit 15. +*/ +#define pmulhrw_m2r(var, reg) mmx_m2r(pmulhrw, var, reg) +#define pmulhrw_r2r(regs, regd) mmx_r2r(pmulhrw, regs, regd) +#define pmulhrw(vars, vard) mmx_m2m(pmulhrw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results + Rounded with 1/2 bit 15, storing to Implied register +*/ +#define pmulhriw_m2ir(var, rs) mmx_m2ir(pmulhriw, var, rs) +#define pmulhriw_r2ir(rs1, rs2) mmx_r2ir(pmulhriw, rs1, rs2) +#define pmulhriw(vars, vard) mmx_m2m(pmulhriw, vars, vard) + + +/* 4x16 Parallel Muls (and ACcumulate) giving High 4x16 portions + of results Rounded with 1/2 bit 15, accumulating with Implied register +*/ +#define pmachriw_m2ir(var, rs) mmx_m2ir(pmachriw, var, rs) +#define pmachriw_r2ir(rs1, rs2) mmx_r2ir(pmachriw, rs1, rs2) +#define pmachriw(vars, vard) mmx_m2m(pmachriw, vars, vard) + + +/* 8x8u Parallel AVErage +*/ +#define paveb_m2r(var, reg) mmx_m2r(paveb, var, reg) +#define paveb_r2r(regs, regd) mmx_r2r(paveb, regs, regd) +#define paveb(vars, vard) mmx_m2m(paveb, vars, vard) + + +/* 8x8u Parallel DISTance and accumulate with + unsigned saturation to Implied register +*/ +#define pdistib_m2ir(var, rs) mmx_m2ir(pdistib, var, rs) +#define pdistib(vars, vard) mmx_m2m(pdistib, vars, vard) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Zero +*/ +#define pmvzb_m2ir(var, rs) mmx_m2ir(pmvzb, var, rs) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Not Zero +*/ +#define pmvnzb_m2ir(var, rs) mmx_m2ir(pmvnzb, var, rs) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Less than Zero +*/ +#define pmvlzb_m2ir(var, rs) mmx_m2ir(pmvlzb, var, rs) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Greater than or Equal to Zero +*/ +#define pmvgezb_m2ir(var, rs) mmx_m2ir(pmvgezb, var, rs) + + +/* Fast Empty MMx State + (used to clean-up when going from mmx to float use + of the registers that are shared by both; note that + there is no float-to-xmmx operation needed, because + only the float tag word info is corruptible) +*/ +#ifdef XMMX_TRACE + +#define femms() \ + { \ + fprintf(stderr, "femms()\n"); \ + __asm__ __volatile__ ("femms"); \ + } + +#else + +#define femms() __asm__ __volatile__ ("femms") + +#endif + +#endif + diff --git a/src/visualizations/Goom/goom2k4-0/test/testapp.c b/src/visualizations/Goom/goom2k4-0/test/testapp.c new file mode 100644 index 0000000000..6d24676472 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/test/testapp.c @@ -0,0 +1,17 @@ +#include <goom/goom.h> +#include <stdio.h> + +gint16 data[2][512]; + +int main() +{ + int i; + PluginInfo *goom; + goom = goom_init (640, 480); + for (i = 0; i<100; i++) + { + fprintf(stderr,"*"); + goom_update (goom, data, 0, -1, 0, 0); + } + return 0; +} diff --git a/src/visualizations/Goom/goom2k4-0/tools/Makefile.devel b/src/visualizations/Goom/goom2k4-0/tools/Makefile.devel new file mode 100644 index 0000000000..00f414d2dc --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/tools/Makefile.devel @@ -0,0 +1,5 @@ +minicompress:minicompress.c + gcc -o minicompress -Wall minicompress.c + +clean: + rm -f *~ *.o minicompress diff --git a/src/visualizations/Goom/goom2k4-0/tools/gfont.c b/src/visualizations/Goom/goom2k4-0/tools/gfont.c new file mode 100644 index 0000000000..71440bb3f8 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/tools/gfont.c @@ -0,0 +1,3483 @@ +/* GIMP RGBA C-Source image dump (gfont.c) */ + +static const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */ + char *comment; + unsigned char pixel_data[1277 * 21 * 4]; +} the_font = { + 1277, 21, 4, + "Created with The GIMP", + "y\21\244\377y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377" + "y\21\244\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\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244" + "\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\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\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\0y\21\244\0y\21\244\377y\21\244\377" + "y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" + "\244\377y\21\244\377y\21\244\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\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244" + "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377" + "y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" + "\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21" + "\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244" + "\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244" + "\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377" + "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21" + "\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244" + "\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0" + "\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\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\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244" + "\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244" + "\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244" + "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0" + "\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244" + "\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244" + "\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\0y\21\244\0y\21" + "\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" + "\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\0y\21\244\0y\21" + "\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\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\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244" + "\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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" + "\0y\21\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\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\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21" + "\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\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\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0" + "y\21\244\377y\21\244\377y\21\244\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\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377y\21\244" + "\377y\21\244\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\0y\21\244\0y\21\244" + "\377y\21\244\377\15\4\21\0\15\4\21\0\15\4\21\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" + "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4" + "\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23" + "\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23" + "\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20" + "\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23" + "\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4" + "\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" + "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" + "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" + "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16" + "\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" + "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20" + "\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" + "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" + "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" + "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" + "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" + "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" + "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16" + "\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" + "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0" + "\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\20\5\26\0\16\4\23\0\15\4\21\0\15\4\21\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\10\6\3""9\12\10\5U\11\7\4L\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""6\11\10\4`\11" + "\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\11\10\4`\11\7\4U\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4O\0\0\0\0\0\0\0" + "\0\0\0\0\0\10\6\3""3\12\10\5U\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\13\10\4U\10\6\3U\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9" + "\12\10\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\5\4\2\16\10\6\3U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\10\6\3J\11\7\4q\10\6\3\247\10\6\3\213\11\7\4U\5\4\2\16\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\11\10\4" + "n\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\24\11\7\4" + "U\11\10\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4""9\11\10\4U\6\5\3""0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\21\10" + "\6\3U\11\7\4R\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\3\10\6\3U\11" + "\7\4]\10\6\3\231\10\6\3\241\10\6\3n\11\10\4U\10\6\3U\6\5\3\37\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\3\10\6\3U\12\10" + "\5U\12\7\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\5\4\2""9\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6" + "\3l\10\6\3U\6\5\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2" + "*\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5\3" + "G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\3\10\6\3U\11\10\4U\11\7\4J\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\6\3*\11\7\4U\10\6\3U\11\7\4U\10\6\3}\10\6\3\252\7\6\4" + "\252\11\7\4\252\14\11\7\252\23\16\12\252\23\15\12\216\10\6\5\34\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\5\4\2""3\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10" + "\6\3\244\10\6\3l\10\6\3U\6\5\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12" + "\10\5""9\11\7\4\252\10\6\3\252\10\6\3\252\10\6\3\241\10\6\3\216\11\7\4`\11" + "\7\4U\10\6\3U\11\7\4U\11\7\4J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4" + "\2*\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5" + "\3L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5R\12\10\7\205\14" + "\11\7\252\17\13\10\252\17\13\10\252\17\13\10\252\15\12\10\252\12\10\7\241" + "\12\10\7U\6\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3" + "J\11\10\4U\10\6\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\7\6\4\34\11\7\4U\11\7\4U\5\4\2\21\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2*\10\6\3U\11" + "\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5\3U\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5U\12\10\7\205\14\11\7\252\17\12" + "\10\252\17\13\10\252\17\13\10\252\15\12\10\252\12\10\7\226\10\6\5>\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5R\12\10\7\205\14\11\7\252" + "\17\12\10\252\16\12\7\252\11\7\4\252\10\6\5\223\12\10\5U\7\6\4U\5\4\4\3\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7""9\13\10\6\241\11\7\6\252\12\10\7" + "\252\15\12\10\252\16\12\7\252\15\12\10\252\14\11\7\252\12\10\7\234\12\10" + "\7U\6\5\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9\10\7\5U\11" + "\7\4n\11\7\4\252\12\10\5\252\12\10\5\252\13\10\6\252\12\10\7\226\12\10\7" + "U\6\5\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\13\10""9\13\10\6\252\11\7\6" + "\252\12\10\7\252\15\12\10\252\17\13\10\252\17\13\10\252\15\12\10\252\12\10" + "\7\237\12\10\7U\6\5\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\13\10;\13\11" + "\6\252\11\7\4}\12\10\5U\10\6\3\205\10\6\3\247\10\6\3\252\10\6\3\252\11\10" + "\4q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3*\12\10\5U\12\7\5U\11\7\4}\12\10" + "\5\252\14\12\7\252\16\13\7\252\23\16\12\252\23\16\12\216\10\6\5\34\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5R\12\10\7\205\14\11\7\252\17\13\10\252\17" + "\13\10\252\17\13\10\252\15\12\10\252\12\10\7\241\12\10\7U\6\5\5\31\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7J\16\12\7\252\14\11\7\213\7\6\4\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7n\16\12\7\252\15\12\10}\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\15\12\10G\17\13\10\252\15\12\10\202\5\5\4\10\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\13\10\6U\11\7\4\252\12\10\5]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11" + "\7""9\12\10\5\247\13\10\6n\6\5\3\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10" + "\6""9\12\7\5\237\13\10\6f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""3\12\10" + "\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\12\7\5""9\13\11\6U\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\34\12\10\5U\13\10\6U\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\6\3""0\12\10\5U\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4O\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\5\4\2-\10\6\3U\11\7\4U\11\7\4X\11\7\4l\11\10\4]\11\7\4U\10\6\3U\6\5" + "\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3-\11\7\4U\10\6\3U\11\7" + "\4U\10\6\3}\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5\3J\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9\10\7\5U\12\10\5U\11\7\4w\10\6\3" + "\216\11\7\4\202\12\10\5[\12\7\5U\6\5\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\11\7\4""9\12\10\5U\12\7\5U\12\10\5U\10\6\3\220\10\6\3\252\10\6\3\244" + "\10\6\3l\10\6\3U\6\5\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5" + "\4\2-\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\11\7\4i\10\6\3U\6" + "\5\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\4;\11\7\4\252\10\6\3" + "\244\11\7\4[\10\6\3U\10\6\3U\10\6\3U\11\7\4U\10\6\3\216\11\6\4\252\11\10" + "\4t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""0\12\10\5U\11\7\4U\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4L\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\6\3""0\12\10\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\6\3""0\12\10\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\10\6\3""9\13\10\4U\11\7\4L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6" + "\3""6\11\10\4`\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9" + "\11\10\4`\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5""9\12\7\5\231\12" + "\10\5]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7]\16\13\7\252\15\12" + "\10\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6[\13\10\6\252\11\7\4\252\11" + "\7\4\252\10\6\5\252\10\6\3w\11\7\4U\10\6\3U\10\6\3U\11\7\4U\11\7\4L\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3*\11\7\4U\10\6\3U\10\6\3z\11\10\4f\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""3\11\7\4U\6\5\3-\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\10\5""9\10" + "\6\3\234\12\7\5]\13\10\6U\13\10\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\6\5\5\16\15\12\10U\10\7\5-\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5""9\12" + "\7\5\234\12\10\5`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4""9\12\10\5]\12\10\5U\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7n\15\12\10\252\14\11" + "\7\205\5\5\4\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5O\12\10\7\177\15\12\10\252\20" + "\14\11\216\10\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\10\6\3""9\12\10\5U\11\6\4U\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17" + "\13\10q\31\22\14\252\24\17\13\216\10\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\17\13\10\202\26\20\13\252\24\17\13\216\7\6\6\27" + "\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10D\14\11\7\252\13\10\6t\6\5\3\10\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\14\11\7R\17\12\10\252\15\12\10\202\5\5\4\10\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\6\5\3""9\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\6\10\6\3U\10\6" + "\3\234\11\10\4q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""0\11\10\4[\11\7\4" + "L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5""9\11\6\4\252\10\6\3c\5\4\2\"\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\6\3G\11\10\4]\11\10\4`\10\6\3U\6\5\3-\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3L\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\10\6\3""9:\37\11\377]2\14\377X-\13\377\14\12\5q\0\0\0\0\7" + "\6\4\34""6\35\11\377].\14\377X-\13\377\14\11\5z\0\0\0\0\7\5\4%6\35\11\377" + "].\14\377X-\13\377\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3U:\37" + "\11\377]2\14\377X,\13\377\11\7\4\252\0\0\0\0\5\4\2U4\34\11\377]0\14\377X" + ",\13\377\14\12\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\7\6\4U:\37\11\377]2\14\377X-\13\377\14\11\5\252\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9:\37\11\377]2\14\377X-\13\377" + "\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\23\14\6\343" + "L%\13\377X-\13\377\16\12\5\213\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4\252" + "E#\12\377\\/\13\377\\/\13\377X-\13\377X-\13\377\20\13\5\343\7\5\4\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9:\37\11\377" + "].\14\377X-\13\377\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\23" + "\14\6\343R'\13\377\\/\13\377\16\12\5i\0\0\0\0\0\0\0\0\7\5\4\24""6\35\11\377" + "d2\15\377\36\23\7\377\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\6\5\3\34\23\14\6\343L%\13\377X-\13\377\16\12\5\202\0\0\0\0\0\0\0\0\0" + "\0\0\0\7\6\4A\21\13\6\343G%\12\377X-\13\377\\/\13\377\\/\13\377X-\13\377" + "X,\13\377X,\13\377\31\20\6\377\10\6\3\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\7\5\4U\21\14\6\345M'\14\377k3\16\377q7\20\377\24\16\11\262" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\13\7\252\35\22" + "\10\377J'\13\377X-\13\377X-\13\377\\/\13\377\\/\13\377X-\13\377X,\13\377" + ")\27\10\377\14\11\5\343\5\5\4\27\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\252\32\21" + "\6\377J'\13\377X-\13\377X-\13\377\\/\13\377\\/\13\377X-\13\377X,\13\377)" + "\30\10\377\14\11\5\343\6\5\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3U\20\13\5\343G%\12\377X-\13\377X,\13" + "\377\14\12\5q\0\0\0\0\0\0\0\0\10\6\3\34""6\35\11\377\\/\13\377X,\13\377X" + "-\13\377\\.\15\377d4\15\377m5\20\377y?\24\377\236J\27\377\264X\33\377\267" + "Z\34\377\32\21\13\216\0\0\0\0\0\0\0\0\0\0\0\0\12\7\5\252\32\21\6\377J'\13" + "\377X-\13\377\\/\13\377\\/\13\377\\/\13\377X-\13\377X-\13\377)\30\10\377" + "\14\11\5\343\6\5\3\34\0\0\0\0\0\0\0\0\7\6\4\10=\40\12\377f3\15\377\\.\15" + "\377\\.\15\377\\.\15\377\\.\15\377\\.\15\377Z-\13\377T,\13\377X-\13\377X" + ",\13\377\16\12\5w\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\231\32\21\6\377J'\13\377" + "X-\13\377\\/\13\377\\/\13\377\\/\13\377X-\13\377X,\13\377-\31\10\377\15\12" + "\6\343\7\6\4\34\0\0\0\0\0\0\0\0\0\0\0\0\21\15\12\252@'\25\377\233N\32\377" + "\251S\32\377\245P\30\377\241O\30\377\221G\26\377\210F\25\377\206E\25\377" + "X2\27\377\26\21\13\350\11\10\6\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\27\14\11\5" + "\255G\"\12\377\\+\15\377!\24\10\377\12\10\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\16\7\343S*\14\377\\.\15\377\23\15\6\343" + "\6\5\3\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\12\10\5\252\32\21\6\377L%\13\377Z.\13\377\\.\15\377\\.\15\377Z-\13\377Z" + "-\13\377X,\13\377.\32\11\377\22\15\11\343\10\7\5\34\0\0\0\0\0\0\0\0\0\0\0" + "\0\17\14\10\252:#\23\377\206I\27\377\231L\30\377\216E\25\377\203@\24\377" + "y;\22\377y;\22\377y>\22\377+\33\14\377\13\11\6\252\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\21\15\12\252@'\25\377\244U\33\377\261V\32\377\232K\27\377y>\22" + "\377s8\20\377w=\22\377{=\24\377P-\23\377\26\20\13\343\10\7\5\34\0\0\0\0\0" + "\0\0\0\15\12\10""9`0\23\377\245P\30\377\237N\30\377\237N\30\377\245P\30\377" + "\245P\30\377\245P\30\377\237N\30\377\244Q\31\377[4\30\377\26\21\13\343\10" + "\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10\252&\30\13\377c/\20\377t;\21\377" + "~A\25\377\216E\25\377\231L\30\377\235J\30\377\233L\30\377[4\30\377\27\22" + "\14\343\10\7\5\34\0\0\0\0\0\0\0\0\15\12\10""9h4\25\377\253T\32\377\233L\30" + "\377\244Q\31\377\255Q\32\377\264X\33\377\264X\33\377\261V\32\377\251P\32" + "\377\\7\31\377\26\21\13\343\10\7\5\34\0\0\0\0\0\0\0\0\15\12\10""9r?\31\377" + "\261V\32\377r8\21\377\\.\15\377\\/\13\377].\14\377\\.\15\377`0\15\377\\." + "\15\377\22\14\5[\0\0\0\0\0\0\0\0\10\6\3(7\35\12\377l2\17\377r8\21\377\202" + "C\25\377\231L\30\377\241R\30\377\253T\32\377\263T\32\377\263T\32\377\31\21" + "\12\216\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10\252@'\25\377\242T\33\377\263X\34" + "\377\267Z\34\377\265Y\34\377\265Y\34\377\254X\33\377\234M\31\377X2\27\377" + "\26\21\13\343\10\7\5\34\0\0\0\0\0\0\0\0\15\11\6""9`0\23\377\231G\26\377\206" + "E\25\377\24\16\11\301\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6q|>\31\377\271[\34\377" + "\251P\32\377\26\17\11\216\0\0\0\0\0\0\0\0\13\10\6""9o=\30\377\270Z\33\377" + "\261V\32\377\27\20\12\255\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6qr;\27\377\220I\25\377~?\25\377\24" + "\16\11\216\0\0\0\0\0\0\0\0\13\11\6""9a3\24\377\230G\27\377\206E\25\377\24" + "\16\11\273\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7`a0\22\377\214G\25\377\212G\25" + "\377\24\17\11\216\0\0\0\0\0\0\0\0\10\6\3(4\34\11\377]2\14\377X-\13\377\16" + "\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\15\12\10R[0\20\377\204G\25\377?$\22\377\12\10\7\210\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\7\6\6>\37\25\14\364|B\27\377\206E\25\377\24\17\11\216" + "\0\0\0\0\0\0\0\0\10\6\3\34""6\35\11\377].\14\377P'\13\377\16\12\5\216\0\0" + "\0\0\0\0\0\0\0\0\0\0\10\6\3""9:\37\11\377]2\14\377X,\13\377\16\12\5t\0\0" + "\0\0\0\0\0\0\0\0\0\0\11\7\4\231\32\21\6\377J'\13\377X-\13\377X-\13\377X-" + "\13\377X-\13\377X,\13\377X,\13\377)\27\10\377\14\11\5\343\5\4\4\21\0\0\0" + "\0\0\0\0\0\10\6\3\"6\35\11\377\\+\13\377X,\13\377X-\13\377\\+\13\377\\/\13" + "\377\\/\13\377X-\13\377X,\13\377-\31\10\377\14\12\5\343\6\5\3\34\0\0\0\0" + "\0\0\0\0\0\0\0\0\15\12\6\252(\30\13\377a0\20\377q7\20\377s8\20\377t9\21\377" + "t9\21\377q7\20\377q7\20\377<!\15\377\22\16\11\343\10\6\5\34\0\0\0\0\0\0\0" + "\0\14\11\7""9M&\16\377v9\21\377t;\21\377v<\21\377m5\20\377b/\15\377\\/\13" + "\377X-\13\377X,\13\377)\27\10\377\14\11\5\343\6\5\3\34\0\0\0\0\0\0\0\0\0" + "\0\0\0\12\10\5\252\34\22\7\377L%\13\377Z-\13\377\\.\15\377^-\15\377^-\15" + "\377\\.\15\377\\.\15\377.\32\11\377\15\12\6\343\6\5\5\34\0\0\0\0\0\0\0\0" + "\7\6\4\10=\40\12\377d2\15\377\\.\15\377\\.\15\377\\.\15\377\\.\15\377\\." + "\15\377\\.\15\377^/\15\377b1\15\377^/\15\377\22\14\5]\0\0\0\0\0\0\0\0\10" + "\6\3*<\40\11\377`0\15\377X-\13\377\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\6\3""9:\37\11\377]2\14\377X,\13\377\14\12\5q\0\0\0\0\0\0\0\0\10\6\3\34""6" + "\35\11\377]2\14\377X,\13\377\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9" + ":\37\11\377]2\14\377X,\13\377\14\12\5q\0\0\0\0\0\0\0\0\10\6\3\34""6\35\11" + "\377]2\14\377X,\13\377\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\10\6\3""9:\37\11\377]2\14\377X,\13\377\14\12\5q\0\0\0\0\0\0\0\0\7\6\4" + "\34""6\35\11\377]2\14\377X-\13\377\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\7\3""9<\37\11\377`0\15\377\\.\15\377\16\12\5\177\0\0\0\0\0\0\0\0\12\10\5" + """9R*\17\377\207B\24\377y<\24\377\24\17\11\260\0\0\0\0\0\0\0\0\0\0\0\0\13" + "\11\6lk8\26\377\254T\31\377\236J\27\377\26\17\11\216\0\0\0\0\0\0\0\0\13\10" + "\6""6b3\23\377\216H\25\377\210F\25\377\212G\25\377y;\22\377d4\15\377Z.\13" + "\377X,\13\377X,\13\377X,\13\377X-\13\377\14\12\5q\0\0\0\0\0\0\0\0\10\6\3" + "\34""6\35\11\377\\/\13\377X,\13\377\\/\13\377\\/\13\377\22\14\5U\0\0\0\0" + "\0\0\0\0\7\6\4-6\36\11\377^/\15\377\37\24\10\377\11\7\4U\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""0A!\12\377r7\17" + "\377w:\22\377~?\25\377\200B\25\377\26\17\11\244\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\5\5\4\34\23\16\12\343\215H\32\377+\33\20\377\7\6\6U\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12" + "\7G`1\21\377\212G\25\377\202C\25\377\26\17\11\244\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7LM'\16\377v9\21\377m5\20" + "\377\26\17\11\231\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6" + "`g5\24\377\220I\25\377y<\24\377\30\20\11\231\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10\270" + "=$\24\377\215D\30\377\250R\31\377\253T\32\377\32\22\13\237\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4""9<\40\11\377`" + "0\15\377\\.\15\377\23\14\6\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\7L\201C\32\377\276a\35\377\264" + "X\33\377\32\21\13\241\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16" + "\12\7U\201C\32\377\276a\35\377\264X\33\377\31\21\12}\0\0\0\0\0\0\0\0\13\10" + "\6""9m<\30\377\257V\32\377\216I\27\377\24\16\11\273\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7]yA\30" + "\377\267Y\32\377\250R\31\377\25\17\12\262\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\12\10\5\252'\27\10\377N)\13\377\20\13\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3U\20\13\5\343G%\12\377" + "\\/\13\377\\/\13\377\22\14\5U\0\0\0\0\0\0\0\0\10\6\3\34""6\35\11\377].\14" + "\377X-\13\377\14\12\5q\0\0\0\0\0\0\0\0\0\0\0\0:\37\11\377]2\14\377X-\13\377" + "\31\21\6\377\10\6\3\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4" + "\4\3\31\12\10\5\255A!\12\377\\.\15\377\\.\15\377C\"\12\377\33\22\10\377\11" + "\7\4\234\3\3\2U\12\10\5\270E#\12\377\23\15\6\223\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4qp7\15\377" + "\215E\20\377\215K\20\377\22\15\5\252\0\0\0\0\10\6\3Un6\15\377\217L\20\377" + "\213D\20\377\23\15\6\252\0\0\0\0\10\6\3Un6\15\377\217L\20\377\215H\20\377" + "\27\17\6\252\0\0\0\0\0\0\0\0\0\0\0\0\12\11\5n#\25\10\377\201?\16\377\215" + "E\20\377\213D\20\3774\33\11\377\11\7\4\377\33\21\10\377\207B\20\377\232K" + "\21\377\233O\22\377[2\20\377\24\17\11\317\12\11\7\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\5\4\4\24\10\6\3\177\37\24\10\377\202B\17\377\217L\20\377\217" + "L\20\377C\"\12\377\12\10\5\327\12\10\5\252\15\12\6\216\7\5\4\27\0\0\0\0\0" + "\0\0\0\14\11\5Us;\16\377\225H\20\377\217L\20\377\22\14\5\353\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\7\6\4\34\16\12\5\343\\.\15\377\217I\20\377\217F\20\377" + "\22\15\5\252\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\2525\34\12\377r8\15\3778\35" + "\11\377\20\13\5\377\"\24\7\377p7\15\377W*\14\377\23\15\6\353\10\7\5(\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5Ur8\15\377\217F\20\377" + "\215H\20\377\27\17\6\252\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\34\16\12\5\343Z,\15" + "\377p9\15\377/\32\10\377\13\10\4""9\0\0\0\0\0\0\0\0\0\0\0\0\31\20\6\343`" + "0\15\377p9\15\377\32\20\7\377\10\6\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\15\12\6U\10\7\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6" + "\5\3\34\17\13\6U\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4i\12\10\5\252\12\10\5\202\6\5\3\27\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\10\6\3\210M'\14\377\217I\20\377\213J\20\377\22\14\5\252" + "\0\0\0\0\0\0\0\0\0\0\0\0\25\16\6\343p9\15\377\215E\20\377P(\13\377\20\13" + "\5\377\16\12\5\343\22\15\5\377H#\13\377\210E\17\377\202B\17\377.\32\11\377" + "\10\6\3i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5""9*\33\15\377\226O\25\377" + "\270^\25\377\303c\26\377\307j\30\377\32\22\13\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\12\10\7cS-\22\377\220J\21\377\217F\20\377^/\15\377" + "\22\15\5\377\20\13\5\255\16\12\5\3434\33\11\377\204C\17\377\213D\20\377K" + "'\14\377\12\7\5t\0\0\0\0\0\0\0\0\6\5\3""94\33\11\377\211I\20\377\217L\20" + "\377^/\15\377\22\15\5\377\20\13\5\255\16\12\5\3434\33\11\377\204C\17\377" + "\213J\20\377K'\14\377\12\10\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5U\26\17\7\377f3\15\377\211C\20\377\214G\17" + "\377\215K\20\377\24\15\5\252\0\0\0\0\0\0\0\0\11\6\4Ul7\15\377\215E\20\377" + "\213J\20\377J$\13\377\22\14\7\377\24\15\7\265\26\17\11\317\24\15\11\356\22" + "\15\11\374\27\20\12\377\37\25\14\332\16\13\7*\0\0\0\0\0\0\0\0\7\6\4""9(\26" + "\11\377\202B\17\377\215K\20\377T*\13\377\22\14\5\377\20\14\5\265\16\12\5" + "\361E#\12\377\214E\21\377\232N\21\377u<\22\377\21\15\10\216\0\0\0\0\0\0\0" + "\0\0\0\0\0\25\16\10\276\34\22\11\377\27\17\10\377\25\16\10\377\25\16\10\377" + "\27\17\10\377&\30\13\377b5\21\377\227J\22\377\226L\21\377\215K\20\377\25" + "\17\6\252\0\0\0\0\0\0\0\0\5\4\2\34!\24\10\377\202B\17\377\215H\20\377T*\13" + "\377\22\14\5\377\22\14\5\260\16\12\5\3539\35\12\377\214H\21\377\245U\24\377" + "yC\30\377\16\13\7\216\0\0\0\0\0\0\0\0\10\6\5""9H.\27\377\306q\35\377\310" + "f\27\377\203D\26\377!\25\14\377\21\15\10\377\25\16\10\377X/\23\377\300c\27" + "\377\313q\32\377\222W\35\377\15\13\10\244\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5" + "U\15\12\6\252\13\11\6\216\7\6\4\34\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10q\22\16" + "\11\252\20\15\11\223\12\10\7\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\12\10\7\34\24\17\13\343h>\25\377\270^\25\377u>\26\377\21\14\10\343" + "\7\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6" + "\252C#\20\377\244U\25\377s:\20\377\24\16\7\374\10\6\5U\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4RB%\15\377\221K\22\377\232N\21\377s" + ":\20\377\35\22\10\377\16\12\7\377\20\13\7\377A\"\14\377\226J\23\377\275a" + "\26\377\212O\33\377\16\14\11\216\0\0\0\0\0\0\0\0\7\6\6""97!\20\377\236Q\23" + "\377\242P\23\377f5\21\377\30\17\7\377\23\14\6\252\16\12\5\314.\32\11\377" + "\211C\20\377\213G\20\3771\33\12\377\7\6\4i\0\0\0\0\0\0\0\0\7\6\6>H.\27\377" + "\307s\40\377\315o\34\377\233T\32\377)\30\16\377\22\15\11\377\31\20\12\377" + "n=\31\377\307d\34\377\315p\36\377\222W\35\377\15\13\10\216\0\0\0\0\0\0\0" + "\0\12\10\7\223\264W\31\377\316o\33\377\313i\32\377\244U\33\377(\30\17\377" + "\24\16\11\377\32\21\13\377y@\32\377\311e\34\377\315p\36\377\222W\35\377\16" + "\13\7\216\0\0\0\0\0\0\0\0\10\6\5""9G,\26\377\300l\31\377\306e\27\377\226" + "N\31\377)\30\16\377\40\25\15\377J)\25\377\270i\33\377\312h\31\377\312v\33" + "\377\256f\37\377\21\16\12\216\0\0\0\0\0\0\0\0\13\11\6\210\266\\\31\377\316" + "p\35\377\315o\34\377\246O\33\377+\31\20\377\25\17\12\377\35\23\14\377tC\33" + "\377\312k\37\377\316q\37\377\222W\35\377\14\12\7\216\0\0\0\0\0\0\0\0\13\10" + "\6\220\271]\32\377\312g\27\377\235M\22\377S*\14\377\23\15\6\377\15\12\6\377" + "\24\15\7\377\33\21\10\377\34\22\11\343\12\10\5-\0\0\0\0\0\0\0\0\13\11\6\216" + "\213I\24\377\306`\25\377\307j\30\377\233N\32\377)\31\16\377\25\17\12\377" + "\34\22\13\377&\30\17\377(\30\17\343\16\12\7>\0\0\0\0\0\0\0\0\10\7\5""9A)" + "\24\377\305l\34\377\315o\34\377\252X\33\377+\33\20\377\23\16\12\377\35\23" + "\14\377{B\30\377\265T\24\377\252W\23\377r<\21\377\13\12\6\216\0\0\0\0\0\0" + "\0\0\13\11\6Uw<\17\377\232K\21\377\232N\21\377\22\15\7\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\15\12\10\252\277f\36\377\321v\36\377\317q\36\377\34\23\13\311" + "\0\0\0\0\0\0\0\0\15\12\10i\246W\27\377\306e\27\377\306a\27\377\32\22\13\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\15\12\10\252\275d\34\377\316o\33\377\314f\33\377\34\24\13\311\0" + "\0\0\0\0\0\0\0\14\12\7t\270]\33\377\316k\33\377\313q\32\377\27\21\12\377" + "\0\0\0\0\0\0\0\0\6\5\5\34\31\22\14\364\300i\33\377\316p\35\377\317u\36\377" + "\40\26\15\252\0\0\0\0\0\0\0\0\13\11\6Xp9\15\377\217F\20\377\215E\20\377\21" + "\14\6\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\16\13\11\252\270\\\31\377\316o\33\377\300o\37\3771!\22\377\12\10\7z\0\0" + "\0\0\0\0\0\0\0\0\0\0\7\7\6;\26\20\13\350\247d\34\377\315p\36\377\315t\36" + "\377\32\22\13\322\0\0\0\0\0\0\0\0\10\7\3Un6\15\377\215E\20\377\215K\20\377" + "\31\20\6\377\5\4\4(\0\0\0\0\0\0\0\0\12\10\5Up7\15\377\215K\20\377\215K\20" + "\377\24\15\5\252\0\0\0\0\0\0\0\0\5\4\2\34!\24\10\377\202B\17\377\215H\20" + "\377p7\15\377-\31\10\377\32\21\6\377!\24\10\377^/\15\377\215E\20\377\220" + "G\21\377P(\15\377\11\7\4}\0\0\0\0\0\0\0\0\12\10\5Up9\15\377\224O\21\377\215" + "K\20\377W*\14\377\23\15\6\377\16\12\5\327\17\12\6\377<\37\13\377\217G\22" + "\377\240R\23\377`6\21\377\14\11\7\216\0\0\0\0\0\0\0\0\10\6\5""9G,\26\377" + "\300d\31\377\307j\30\377\271]\32\377[2\26\377:!\21\377H)\23\377\236Q\31\377" + "\307j\30\377\307j\30\377\212O\33\377\15\13\10\216\0\0\0\0\0\0\0\0\12\10\7" + "\223\246W\27\377\313l\30\377\312l\31\377\231M\32\377&\26\15\377\17\13\6\377" + "\16\12\5\3774\34\11\377\204F\17\377\215K\20\377P)\15\377\12\10\5\213\0\0" + "\0\0\0\0\0\0\7\6\6""90\35\15\377\232O\23\377\240U\23\377l8\21\377\36\22\11" + "\377\20\13\7\377\30\17\11\377`3\21\377\247V\24\377\265X\24\377\214K\27\377" + "\22\16\11\220\0\0\0\0\0\0\0\0\0\0\0\0\26\16\7\301\26\15\7\377\24\15\7\377" + "N(\17\377\245Q\24\377\261Z\24\377\261Z\24\377s:\24\377\40\24\13\377\30\17" + "\11\377\36\23\11\343\13\10\6""6\0\0\0\0\0\0\0\0\13\11\6\216\213D\24\377\246" + "N\23\377\220G\21\377\23\14\6\327\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\210r8\15" + "\377\217F\20\377\213D\20\377\23\15\6\252\0\0\0\0\0\0\0\0\12\7\5Up7\15\377" + "\217F\20\377\213J\20\377\21\13\6\335\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\210r" + "8\15\377\217F\20\377\215K\20\377\24\15\5\252\0\0\0\0\0\0\0\0\11\6\4Un6\15" + "\377\215E\20\377\215H\20\377\21\13\6\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\11\7\4\210r8\15\377\217I\20\377\213J\20\377\23\15\6\252\0\0\0\0" + "\0\0\0\0\10\6\3Un6\15\377\217L\20\377\215E\20\377\22\14\5\374\0\0\0\0\0\0" + "\0\0\0\0\0\0\13\11\6\252\203E\22\377\252W\23\377\250V\23\377\34\23\11\252" + "\0\0\0\0\0\0\0\0\13\10\6U\221J\32\377\314f\33\377\313i\32\3774!\21\377\6" + "\5\5""9\0\0\0\0\0\0\0\0\21\16\12\343\276k\31\377\314q\31\377\256V\33\377" + "\22\15\11\252\0\0\0\0\0\0\0\0\0\0\0\0\34\22\13\306%\27\16\377\40\25\15\377" + "\25\17\12\377\24\16\11\377&\27\13\377W,\14\377\211F\20\377\215H\20\377\217" + "F\20\377\215H\20\377\22\14\5\252\0\0\0\0\0\0\0\0\11\6\4Un6\15\377\221J\20" + "\377\215E\20\377^/\15\377\33\21\10\343\14\10\5\34\0\0\0\0\0\0\0\0\16\12\7" + "Uy>\22\377\254W\23\377\213E\22\377\24\17\11\343\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\25\16\10\343u=\30\377\307" + "d\34\377\315j\32\377\314n\33\377\32\22\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\10\7\5\34\24\17\13\343\207I\26\377\300a\25\377\245S\26\377!\26\14\377" + "\12\11\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\13\11\6\252\270a\33\377\316p\35\377\314n\33\377\34\23\13\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\16\13\7\252\263]\30" + "\377\312g\27\377\306a\27\377\26\17\11\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\11\7\6\252}?\22\377\236M\21\377\222K\21\377\21\14\6\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\10\6\5LH.\27\377\305l\34\377\311k\30\377\244U\33\377%\26\16\343" + "\15\11\6""0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\14\11\7\252\212C\23\377\252O\23\377\250V\23\377\24\16\11\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\10" + "\7\5\24\25\17\12\270\32\21\13\377\32\21\13\327\14\11\7J\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\24\25\17\12\270\32\21\13\377\37\25" + "\14\317\22\15\11\34\0\0\0\0\0\0\0\0\13\11\10\234\270]\33\377\320i\35\377" + "\315o\34\377\34\23\13\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\16\13\7\252\270\\\31\377\313h\30\377\310" + "b\27\377\32\22\13\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\10\7\5""93\35\14\377\230K\23" + "\377\242V\23\377\23\15\10\366\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\6\5\3\34\23\15\6\371\\.\15\377{?\16\377N'\13\377\25" + "\17\6\343\11\10\4\34\0\0\0\0\0\0\0\0\11\10\4Un;\15\377\215E\20\377\215K\20" + "\377\25\16\6\252\0\0\0\0\0\0\0\0\0\0\0\0\20\13\5\2524\34\11\377s;\16\377" + "t<\17\377+\32\12\377\11\7\6}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\34\25" + "\21\12\343m;\22\377\240R\23\377y@\22\377>\"\15\377^5\21\377\225N\24\377f" + "6\23\377\40\26\13\377H'\17\377y>\22\377\30\21\11\273\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3\247\200" + "B\17\377\241U\21\377\237Q\22\377\30\17\7\262\0\0\0\0\6\5\3%0\34\13\377\255" + "\\\24\377\265`\24\377\25\17\10\335\0\0\0\0\6\5\3\34(\30\11\377\217J\22\377" + "\236P\21\377\25\17\6\265\0\0\0\0\0\0\0\0\12\10\5""6k3\16\377\235S\22\377" + "\244T\23\377\260Y\23\377\275\\\24\377\277b\26\377\276j\27\377\305n\32\377" + "\313l\30\377\313u\30\377\315w\32\377\317z\36\377\307v\40\377\40\27\15\252" + "\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U\26\17\7\350q6\16\377\222K\21\377\236P\21" + "\377\232N\21\377\236P\21\377\224L\21\377\213G\20\377\207B\20\377\207B\20" + "\377\25\16\6\210\0\0\0\0\0\0\0\0\12\10\5U\200B\17\377\241U\21\377\236P\21" + "\377\31\20\6\314\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\34\31\20\10\343f2\17\377\224" + "L\21\377\216I\21\377T-\15\377\12\10\5q\0\0\0\0\0\0\0\0\11\7\4Rk5\16\377\222" + "K\21\377T)\15\377\10\7\5\306\3\2\2\27\5\4\4\210&\27\11\377\210F\21\377\214" + "H\21\377\25\17\6\262\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6" + "\4""9-\32\12\377\217J\22\377\236P\21\377\32\21\6\252\0\0\0\0\0\0\0\0\0\0" + "\0\0\30\20\7\343s:\20\377\224L\21\377.\32\11\377\7\6\4\234\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\5\4\4G\23\15\6\377\213G\20\377\214H\21\377+\32\12\377" + "\11\10\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5Um4\16\377&\27\11\377\6" + "\5\3U\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\34\17\14\6\343s8\20\377\35\23\10\252" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\12\6" + "qz@\25\377\244U\25\377\212G\21\377\25\17\6\241\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15" + "\12\6\343\211C\20\377\232K\21\377T-\15\377\12\10\5t\0\0\0\0\0\0\0\0\11\7" + "\4Uo7\16\377\236W\21\377\236P\21\377\23\15\6\377\4\4\3\34\0\0\0\0\3\3\2q" + "\21\14\6\377\213G\20\377\241U\21\377\222K\21\377\24\16\7\322\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\15\11n\270i\33\377\321{\36\377\322|\37\377\320{\37" + "\377\317z\36\377\33\24\14\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\15\13\10\223\217K\24\377\241U\21\377\236P\21\377\33\22\10\343\5\4\2" + "\34\0\0\0\0\0\0\0\0\12\7\5\306\203A\20\377\241U\21\377\226L\21\377\25\16" + "\6\252\0\0\0\0\0\0\0\0\12\10\5U{=\20\377\243S\22\377\236P\21\377\33\22\10" + "\343\5\4\2\34\0\0\0\0\0\0\0\0\11\7\4\306\202B\17\377\243S\22\377\224L\21" + "\377\25\16\6\301\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\7\6\4U\26\17\7\377\203A\20\377\232N\21\377\232N\21\377\232N\21\377\232N" + "\21\377\25\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\243V\22\377\264" + "[\23\377\35\24\12\377\3\3\2]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5zy<\20\377\241U\21\377\237Q\22\377\30" + "\17\7\377\4\4\3\"\0\0\0\0\2\2\1\6\21\15\10\265\265]\26\377\313l\30\377\315" + "r\32\377\40\27\15\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\5\4\4\241\36\26\15\377\306t\35\377\316j\31\377\277`" + "\24\377\32\21\7\252\0\0\0\0\0\0\0\0\11\7\4Ut<\17\377\241U\21\377\236P\21" + "\377\25\16\6\377\5\4\2\34\0\0\0\0\2\2\1\3\14\11\7\327\276k\31\377\323|\36" + "\377\320\206%\377\40\26\15\262\0\0\0\0\0\0\0\0\15\13\10`\273p\40\377\321" + "{\36\377\277`\24\377\34\23\11\377\4\3\3J\0\0\0\0\3\2\2\34\15\12\10\343\304" + "x\37\377\323|\36\377\307j\30\377\33\23\12\252\0\0\0\0\0\0\0\0\15\12\6""9" + "r=\23\377\262[\25\377\266f\27\377\27\21\12\255\0\0\0\0\0\0\0\0\13\11\6[\222" + "U\31\377\306q\35\377\304x\37\377\33\24\14\317\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\5\5\4\34\25\21\14\343\276v!\377\321\203(\377\241d\"\377\21\16" + "\12\343\5\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\11\10\6\252[;\34\377\275^\30\377\242S\23\377'\31\14\377" + "\7\7\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\216\267g\30\377" + "\313p\30\377\313p\30\377*\32\15\371\5\4\4>\0\0\0\0\3\2\2\31\14\11\7\343\303" + "s\36\377\324\177#\377\323\204&\377\40\26\15\265\0\0\0\0\0\0\0\0\14\12\7U" + "|A\21\377\241U\21\377\237N\22\377\25\16\6\377\5\4\2\34\0\0\0\0\0\0\0\0\7" + "\6\4\340\205D\20\377\237Q\22\377\222H\21\377\26\16\7\252\0\0\0\0\0\0\0\0" + "\15\13\10[\271o\40\377\322}!\377\315r\32\377%\32\16\377\4\4\3U\0\0\0\0\4" + "\4\4\34\15\12\10\343\301i\32\377\316o\33\377\312v\33\377\40\26\15\252\0\0" + "\0\0\0\0\0\0\13\11\6\177\256[\27\377\312f\25\377\310i\25\377$\27\15\377\4" + "\4\3U\0\0\0\0\3\3\2\34\15\13\10\343\306v!\377\324\177#\377\320\200!\377\37" + "\26\14\265\0\0\0\0\0\0\0\0\15\13\10[\271r\36\377\323|\36\377\320z\35\377" + "\"\30\15\377\4\4\3U\0\0\0\0\7\6\6q\40\30\15\377\271_\26\377\312b\25\377\306" + "a\27\377!\26\14\252\0\0\0\0\0\0\0\0\12\10\7\234\276l\33\377\324~!\377\323" + "\177$\377(\32\17\377\4\4\3U\0\0\0\0\3\3\2\34\15\13\10\343\306v!\377\326\201" + "%\377\323\204&\377\40\27\15\255\0\0\0\0\0\0\0\0\12\10\7\220\247W\26\377\271" + "^\24\377\245W\22\377\31\21\10\377\3\3\2""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\303p\36\377\322}!\377\320u\35\377" + "'\32\16\377\4\4\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\14\12\7\226\270l\33\377\323|\36\377\323\177$\377(\33\17\377\4\4\3U\0\0" + "\0\0\3\3\2\34\21\15\10\262\212G\21\377\241U\21\377\233O\22\377\25\16\6\252" + "\0\0\0\0\0\0\0\0\12\10\5U|=\17\377\251Y\22\377\264[\23\377\31\22\12\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\304q\37\377\323|\36\377\315w\32\377\32" + "\22\13\314\0\0\0\0\0\0\0\0\13\11\6X\206F\23\377\255W\22\377\250V\23\377\24" + "\15\7\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\15\13\10\252\304q\37\377\322}!\377\317z\36\377\30\22\13" + "\324\0\0\0\0\0\0\0\0\13\11\6w\264]\27\377\313l\30\377\312g\27\377\24\17\11" + "\377\0\0\0\0\0\0\0\0\17\15\12\303e?\32\377\312u\31\377\316\200#\377\240j" + "#\377\17\15\12\216\0\0\0\0\0\0\0\0\12\10\5\223\213F\24\377\277`\24\377\310" + "i\25\377\31\22\12\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\15\12\10\252\275c\32\377\316s\33\377\315j\32\377\271j\34\377" + "O4\32\377\12\11\7z\0\0\0\0\7\6\6*$\33\21\364\254j#\377\317\200\"\377\323" + "~\"\377\323\177$\377\30\22\13\343\0\0\0\0\0\0\0\0\12\10\5U|@\17\377\237Q" + "\22\377\236P\21\377L(\15\377\13\10\6\322\0\0\0\0\0\0\0\0\14\11\5U\201@\20" + "\377\241U\21\377\236P\21\377\32\20\7\252\0\0\0\0\0\0\0\0\11\7\4Us8\20\377" + "\241U\21\377\237Q\22\3771\33\12\377\7\6\4\252\5\4\4U\6\5\3q\32\23\13\377" + "\271_\26\377\312f\25\377\305h\26\377\34\24\13\255\0\0\0\0\0\0\0\0\15\12\6" + "f\247W\26\377\310e\25\377\311f\26\377\40\25\13\377\4\3\3A\0\0\0\0\2\2\1\21" + "\14\12\7\335\276b\27\377\320t\33\377\314n\33\377\36\25\13\265\0\0\0\0\0\0" + "\0\0\15\13\10[\271r\36\377\323|\36\377\321{\36\377V7\31\377\11\10\6\273\6" + "\6\5U\7\6\6\202\40\30\17\377\310z\37\377\321{\36\377\316z\37\377\40\27\15" + "\255\0\0\0\0\0\0\0\0\12\10\7\220\277q\36\377\324\177#\377\322~#\377(\33\17" + "\377\4\4\3U\0\0\0\0\2\2\1\10\13\11\6\324\235Q\24\377\275\\\24\377\276a\25" + "\377\33\23\12\262\0\0\0\0\0\0\0\0\14\12\7`\267i\34\377\321{\36\377\315r\32" + "\377$\30\15\377\4\4\3U\0\0\0\0\4\4\4\34\22\16\11\273\303s\36\377\323|\36" + "\377\322\202#\377#\32\16\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\2" + "\2\34\14\12\7\343\303s\36\377\323|\36\377\321{\36\377&\31\17\377\4\4\3U\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\302s\37\377\321z\34\377" + "\304c\25\377\25\17\10\377\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6\252\231O\24\377" + "\273[\24\377\265`\24\377\36\24\11\262\0\0\0\0\0\0\0\0\15\12\6`\227O\24\377" + "\273[\24\377\265`\24\377\26\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7\252" + "\222L\23\377\247X\22\377\236M\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5" + "U\205B\20\377\247X\22\377\250V\23\377\26\20\11\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\14\11\7\252\233P\24\377\271^\24\377\265`\24\377\26\20" + "\11\335\0\0\0\0\0\0\0\0\6\6\5*3\35\14\377\226Q\23\377\245W\22\377*\32\13" + "\377\5\5\4l\0\0\0\0\5\5\4\34\22\17\13\377\303r\34\377\317{\40\377\236^\37" + "\377\21\15\12\216\0\0\0\0\0\0\0\0\6\5\5""92\"\23\377\277o\40\377\320u\35" + "\377qI\36\377\12\12\11\343\6\6\5}\7\7\6\306*\35\21\377\273`\26\377\246W\27" + "\377*\33\17\377\10\6\5n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\5\5\4\270\25\20\10\377j6\17\377\232N\21\377\227M\22\377\\" + "0\17\377\13\11\6w\0\0\0\0\0\0\0\0\12\10\5]\203E\22\377\275\\\24\377\310i" + "\25\377!\26\14\377\5\4\4""6\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6UL5\31\377\310" + "v\37\377\314r\33\377A+\26\377\6\6\5q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\3\3\21\16\13\11\343\303o\34\377\316s\33\377" + "\314i\31\377\30\21\13\377\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\15\12\6\343}B" + "\22\377\245T\22\377\241U\21\377\241U\21\377\233O\22\377\34\23\11\377\6\5" + "\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\10DV8\33" + "\377\314~!\377\322}!\377\36\25\15\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\15\13\10\252\303s\36\377\321{\36\377\317z\36" + "\377\33\23\14\377\3\3\2\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4" + "\270\203A\20\377\241U\21\377\232N\21\377\17\13\6\371\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\255" + "\246W\27\377\306h\25\377\304c\25\377#\27\14\377\3\3\2U\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\302s" + "\37\377\323|\36\377\317z\36\377\33\23\14\377\3\3\2\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\304q\37" + "\377\325\204$\377\323\177$\377\36\25\15\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\13\11\6\252\233P\24\377" + "\271^\24\377\264[\23\377\25\17\10\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\12\10\7\270" + "\267d\32\377\320t\33\377\314r\33\377\32\22\13\377\4\4\4\34\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177w<\17\377\240U\23\377" + "[0\20\377\12\10\5\343\4\4\3\34\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\241\203C\20" + "\377\237Q\22\377\237N\22\377\22\15\7\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\7\6\4\2529\"\16\377\260Z\25\377\303_\26\377\32\23\13\350\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\21\16\12c\263j\34\377\317z\36\377\264m!\377\31\24\14\377" + "\7\6\6\252\24\21\13\377\304r\33\377\320u\35\377\313|\36\377\254j#\3775$\24" + "\377\12\11\7l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\11\10\6\252\237R\24\377\312g\27\377\316o\33\377\26\21" + "\13\377\0\0\0\0\0\0\0\0\12\11\7\213sJ\36\377\325\2050\377'\34\20\377\0\0" + "\0\0\0\0\0\0\11\10\4qC'\16\377\265\\\24\377\30\22\11\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\34\23\11\343\213O\32\377\316u\37\377\324{%\377\326~)\377\254j#\377" + "5\"\22\377zN\37\377\323\177,\377\331\2102\377\330\2071\377\276z)\377A+\26" + "\377\16\13\7U\0\0\0\0\0\0\0\0\7\6\4\34\35\25\12\371\231O\24\377\256U\23\377" + "g5\20\377\21\14\6\364\23\15\6\252\25\16\6\252\33\21\6\252\25\16\6\324\25" + "\16\6\377\31\21\6\340\14\11\5-\0\0\0\0\0\0\0\0\0\0\0\0\30\20\7\231\26\17" + "\7\377\32\20\7\322\14\11\5(\0\0\0\0\0\0\0\0\10\7\5\34\21\15\10\343r=\23\377" + "\256U\23\377\232O\23\377<!\15\377\13\11\6\252\0\0\0\0\0\0\0\0\0\0\0\0\12" + "\10\5\252\222O\23\377\264W\23\377C'\16\377\10\6\5U\0\0\0\0\0\0\0\0\30\21" + "\11\377\217K\24\377\242P\23\377\26\17\7\327\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5n<!\15\377\246N\23\377\26\17\7\343\0\0\0" + "\0\0\0\0\0\7\6\4U[3\20\377\256X\23\377\251N\22\377\31\21\10\377\3\3\2\10" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6\262\217J\22\377\261Y\22" + "\377\212K\23\377\22\15\7\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\34\35" + "\23\10\350)\31\12\377\21\15\10\377\11\10\6t\0\0\0\0\7\6\4;\16\13\7\343\40" + "\25\11\377(\30\11\377\14\11\5i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\16\13\11\252\307|$\377\325w$\377\312f\25\377\24\16" + "\7\366\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\10\7\5\2165\37\14\377\242V\23\377y@\22\377\23\16\10" + "\374\6\5\3\34\0\0\0\0\0\0\0\0\12\10\5}\216J\23\377\264[\23\377\267Y\23\377" + "\23\16\10\377\0\0\0\0\5\5\4\6\17\15\12\301E*\22\377\253[\24\377\275X\24\377" + "\310e\25\377\37\25\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\34\36\25" + "\15\343\226\\#\377\320y%\377\323s\36\377\320u\35\377\34\25\15\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\12\10\7\34\26\17\7\306\32\21\7\377" + "\30\17\7\335\11\7\4""9\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\234\253Y\26\377\312" + "k\27\377\312g\27\377\27\22\12\371\0\0\0\0\0\0\0\0\0\0\0\0\32\22\11\306\35" + "\23\10\377\30\20\7\327\12\10\5""3\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5U\206F\23" + "\377\257X\22\377\255W\22\377\24\16\7\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\12\10\5U\32\23\11\377k:\22\377\232S\23\377\250O\23\377\251" + "N\22\377\255W\22\377\254P\23\377\32\21\7\252\0\0\0\0\0\0\0\0\13\12\10\210" + "\275c\32\377\322s\37\377\330\201-\377\217`(\377\17\15\12\343\14\14\13\252" + "\17\15\14\252\15\14\12\252\15\14\12\210\11\10\10U\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\13\11\6\252\251[\26\377\312g\27\377\313l\30\377\22\17\11\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\6\5\5\27\34\23\13\234\37\26\14\377\"\30\15\343\16\13" + "\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\11\10\10\216H6\37\377\327\223<\377\332\222=\377\256d#\377\16\13\7\216" + "\0\0\0\0\0\0\0\0\13\10\6f\216J\23\377\271V\24\377\303b\24\377\22\16\11\371" + "\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\252\312\203/\377\334\230?\377\334\227=\377" + "\26\23\15\374\0\0\0\0\0\0\0\0\13\11\10\247\313\207.\377\331\2130\377\322" + "x!\377\22\16\11\377\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\306u%\377\323s\36" + "\377\312f\25\377\"\26\13\260\0\0\0\0\0\0\0\0\15\13\10\252\312z%\377\332\220" + "1\377\331\2202\377\34\25\15\377\0\0\0\0\0\0\0\0\14\13\11\252\314z)\377\331" + "\207.\377\327\210*\377.!\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\34" + "\25\23\16\343\231h.\377\326\2257\377\236g'\377\20\16\13\335\7\6\6\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\22\15\216\37\32\22\252\31\25\20\252" + "\30\24\17\252\30\24\17\252\30\24\17\252\30\25\17\252\37\32\22\252\31\25\20" + "\252\16\14\11\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\247K3\32" + "\377\312u!\377\272x+\377)\40\24\377\14\13\11U\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\13\11\10\34\37\26\14\3271!\22\377)\33\20\343\14\12\7U\0\0\0\0\0\0\0" + "\0\0\0\0\0\16\14\11\252\314\2113\377\334\230?\377\334\227=\377\27\23\14\374" + "\0\0\0\0\0\0\0\0\13\12\6U\210F\21\377\257X\22\377\251N\22\377\17\13\6\377" + "\0\0\0\0\0\0\0\0\11\10\6U\32\23\11\377\231R\22\377\261Y\22\377\264T\23\377" + "\30\21\11\332\0\0\0\0\0\0\0\0\13\11\10\223\304s#\377\327}&\377\326}'\377" + "\24\20\13\377\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\237\245V\26\377\305c\24\377" + "\303Z\24\377\40\25\13\252\0\0\0\0\0\0\0\0\14\12\7U\221L\24\377\275\\\24\377" + "\277`\24\377\22\16\11\377\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\307~'\377\331" + "\2052\377\331\2202\377\27\22\14\374\0\0\0\0\0\0\0\0\13\12\10\216\277i\34" + "\377\316o\33\377\313h\30\377\23\17\12\377\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6" + """9\25\17\10\306\34\23\11\377\40\25\13\343\13\11\6L\0\0\0\0\0\0\0\0\13\11" + "\10\252\313}*\377\334\222;\377\333\222<\377\30\23\15\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\13\12\10\252\314\210/\377\334\222;\377\332\2237\377\31\23\14\350" + "\0\0\0\0\0\0\0\0\13\12\10w\241W\26\377\303b\24\377\312g\27\377\22\17\11\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\16\14\11" + "\252\310}%\377\326|%\377\315j\32\377\24\20\11\335\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\15\11\252\315\202*\377\333\220" + "8\377\333\222<\377\30\23\15\377\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\27\25\16\6" + "\252\32\20\7\377\32\21\7\340\16\12\5\37\0\0\0\0\0\0\0\0\13\11\6}\252Y\27" + "\377\323s\36\377\326~)\377\27\23\14\377\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10" + "\252\303p\36\377\316j\31\377\310i\25\377\35\24\12\252\0\0\0\0\0\0\0\0\13" + "\11\6U\206F\23\377\261U\22\377\254P\23\377\22\15\7\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\16\14\11\252" + "\303p\36\377\316o\33\377\312g\27\377\37\26\12\252\0\0\0\0\0\0\0\0\15\12\6" + "U\227O\24\377\275\\\24\377\267Y\23\377\21\15\10\377\0\0\0\0\10\7\5;9\"\20" + "\377\270a\33\377\306s!\377rM!\377\20\16\13\322\6\5\5\10\0\0\0\0\0\0\0\0\14" + "\12\7\252\303q\40\377\327{*\377\331\2052\377\40\30\17\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\14\13\7\252\257Z\26\377" + "\306h\25\377\275\\\24\377\300a\25\377\275a\26\377-\35\16\377\12\11\7\322" + "\26\21\13\377\267f\36\377\324y)\377\330\2071\377\331\2114\377\326}'\377\35" + "\25\14\314\0\0\0\0\0\0\0\0\13\11\6U\217K\24\377\301a\24\377\303b\24\377\264" + "]\27\377X6\27\377\13\12\10q\0\0\0\0\16\14\7U\252Y\27\377\312g\27\377\312" + "f\25\377\40\26\13\262\0\0\0\0\0\0\0\0\14\12\7q\260[\27\377\315i\30\377\321" + "u\34\377'\34\20\377\5\5\5\34\0\0\0\0\0\0\0\0\17\16\12\306\316\204-\377\331" + "\2052\377\327\205,\377\31\23\14\350\0\0\0\0\0\0\0\0\13\12\10}\306v'\377\332" + "\2213\377\332\2225\377\24\21\13\377\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\306" + "|%\377\330\206-\377\326\213)\377\26\22\13\377\0\0\0\0\0\0\0\0\13\12\10\210" + "\277i\34\377\316o\33\377\316j\31\377$\32\17\377\5\5\4\34\0\0\0\0\0\0\0\0" + "\17\15\12\306\300i\33\377\316j\31\377\314i\31\377\27\21\12\350\0\0\0\0\0" + "\0\0\0\14\12\7}\304w%\377\332\2153\377\332\2137\377\24\20\13\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\11\10\6\252\304n!\377\327~(\377\326}'\377\27\22\14\374\0" + "\0\0\0\0\0\0\0\13\11\10\247\311{(\377\331\2052\377\326\210+\377\24\20\13" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\6\5\5\27\35\25\14\231\40\26\15\377#\31\16\343" + "\17\14\10U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252\306" + "|%\377\327}&\377\325|&\377\27\22\14\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\16\14\11\252\314\204/\377\333\2208\377\323\177$\377\34\25" + "\15\377\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\252\306u%\377\327{*\377\326}'\377" + "\31\24\14\327\0\0\0\0\0\0\0\0\13\12\10\202\306w#\377\327~(\377\324{%\377" + "\36\26\15\377\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\252\304r!\377\316j\31\377" + "\310i\25\377\36\25\13\270\0\0\0\0\0\0\0\0\15\13\10c\270d\31\377\321u\34\377" + "\322s\37\377\34\25\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11" + "\252\306u%\377\327~(\377\326~)\377\31\23\14\377\0\0\0\0\0\0\0\0\0\0\0\0\12" + "\11\7}=*\26\377\276k!\377\231b&\377\35\27\20\377\15\14\12\377\21\17\12\377" + "lJ%\377\322\220;\377\231b&\377\20\16\13\340\6\6\5\21\0\0\0\0\0\0\0\0\0\0" + "\0\0\17\15\10\343sC\30\377\305d\26\377\226Q\31\377\40\30\15\377\17\15\10" + "\377\23\17\12\377U0\22\377\262_\25\377sA\24\377\17\14\10\377\5\5\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\12\11\7\306" + "E.\26\377\272g\35\377\303o\34\377\\:\31\377\17\14\10\306\0\0\0\0\0\0\0\0" + "\0\0\0\0\12\11\7\252\302p\37\377\327}&\377\332\2225\377\30\23\15\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\343\237g*\377\324\177+\377" + "\261v0\377\23\21\14\343\6\6\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\266b\27\377\312j\25\377\303b\24\377" + "\30\21\11\324\0\0\0\0\0\0\0\0\0\0\0\0\22\16\11\343f6\23\377\235S\22\377U" + ".\16\377\23\15\6\377/\33\12\377\226Q\23\377\203C\24\377'\32\16\377\14\13" + "\11U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252" + "vK!\377\327\2156\377,!\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10l\23" + "\21\14\252\33\27\20\252\27\25\20\252\27\25\20\252\30\24\17\252\24\22\15\252" + "\17\16\12\252\12\11\7q\7\6\6\34\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\275" + "c\32\377\321n\36\377\323v$\377\215X$\377\23\21\14\343\24\22\15\252\30\24" + "\17\252\25\23\16\252\20\16\13\252\12\11\7q\6\6\5\34\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\10\7\5A\13\12\10\216\20\16\13\252\30\25\17\252\31\26\20" + "\252\27\25\20\252\25\23\16\252\20\16\13\252\13\12\10q\7\7\6\34\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5>\12\11\5\210\14\12\7\252\16\13\7\252" + "\15\12\6\252\13\11\6\306\37\25\12\377\231R\22\377\261U\22\377\251N\22\377" + "\26\17\7\314\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5""9\13\12\6\216\23\21" + "\14\252\27\25\20\252\31\26\20\252\27\25\20\252\25\23\16\252\17\16\12\252" + "\12\12\11q\7\6\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\2317\40\16\377" + "\257]\24\377\271^\24\377\267Y\23\377P,\21\377\15\13\10\273\7\6\6\31\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5>\13\12\6\216\20\16\13\252\27\23\16\252" + "\31\26\20\252\27\25\20\252\23\21\14\252\17\16\12\252\21\17\12\252\23\21\14" + "\216\11\10\10\34\0\0\0\0\0\0\0\0\14\12\11\252\314\2111\377\334\222;\377\332" + "\2225\377\215[&\377\23\21\14\343\23\21\14\252\30\24\17\252\25\23\16\252\17" + "\16\12\252\12\12\11q\7\6\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7""9" + "\16\14\7f\16\13\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\14\12\7""9\15\13\10i\17\15\10U\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11" + "\252\314\210/\377\334\222;\377\332\231;\377\30\23\15\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\10\7\5R\13\12\6\234\13\11\6\252\12\11\7[\0\0\0\0\0\0\0\0\0\0\0\0" + "\12\10\5\177\220N\23\377\264W\23\377\256Q\23\377\30\17\7\322\0\0\0\0\0\0" + "\0\0\0\0\0\0\16\13\7D\14\12\7\252\14\12\7\252\21\17\12\252\30\24\17\252\23" + "\21\14\252\17\16\12\252\22\17\13\252\30\25\17\252\25\23\16\252\17\16\12\252" + "\13\12\10q\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12w\21\17\14\252" + "\17\15\12\252\20\16\13\252\23\21\14\252\25\22\14\252\22\17\13\252\17\15\10" + "\252\13\11\6\252\12\10\7X\6\5\5\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\12\11\7U\16\14\11\252\23\21\14\252\25\23\16\252\25\23\16\252\25\23\16" + "\252\23\21\14\252\17\16\12\252\13\12\10t\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\17\16\12w\22\17\13\252\17\16\12\252\22\17\13\252\25\23\16\252\31" + "\26\20\252\27\25\20\252\25\23\16\252\20\16\13\252\13\12\10q\7\7\6\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7U\16\14\11\252\23\21\14\252\24" + "\22\15\252\24\22\15\252\27\23\16\252\23\21\14\252\17\16\12\252\21\16\12\252" + "\23\21\14\216\12\11\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12q\22\17\13\252\17" + "\16\12\252\22\17\13\252\25\23\16\252\31\26\20\252\27\25\20\252\24\22\15\252" + "\20\16\13\252\13\12\10q\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\7\7\6R\13\12\6\216\20\15\11\252\23\21\14\252\25\23\16\252\30\25\17\252\31" + "\26\20\252\31\26\20\252\17\15\12\252\14\13\11""9\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\17\15\12\252aA\"\377\321\204*\377\326\210+\377\326\177+\377\237" + "g*\377\25\23\16\343\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13q\25\23\16" + "\252\22\17\13\231\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12}\25" + "\23\16\252\23\21\14\216\12\11\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12q\25\23" + "\16\252\22\20\13\231\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12" + "}\25\23\16\252\23\21\14\216\12\11\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12q" + "\25\23\16\252\22\20\13\231\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\17\16\12}\25\23\16\252\23\21\14\216\11\11\10\34\0\0\0\0\0" + "\0\0\0\0\0\0\0\21\16\12\202\33\30\20\252\25\23\16\216\12\11\7\34\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13q\34\30\21\252\30\25\17\241\14\13\11\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13q\25\23\16\252\22\17\13\231\13\12\10\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12}\25\23\16\252\23\21\14\216\11\10" + "\6\34\0\0\0\0\0\0\0\0\0\0\0\0\22\17\13\210\23\20\12\252\20\15\11\252\20\16" + "\11\252\17\15\10\252\15\13\10\252\14\13\11\252\15\14\10\252\17\16\12\252" + "\16\15\13\252\13\13\12q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10" + "\252\276b\27\377\314t\37\377J4\33\377\11\10\10q\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\15\13\10\252\300j\35\377\320p\33\377\320u\35\377\33\25\14\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\33\27\20\377\307y,\377\326\213)\377" + "\37\27\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\34\40\30\15\343$\32" + "\17\377\23\20\14\306\10\10\7""3\0\0\0\0\10\10\7""9\35\25\14\3320\40\21\377" + "-\36\20\377\24\20\13\332\12\11\7i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\252\314\2023\377" + "\340\231M\377\341\251X\377!\33\22\377\0\0\0\0\0\0\0\0\0\0\0\0\25\23\16\327" + "\331\243V\377=.\34\377\0\0\0\0\0\0\0\0\0\0\0\0\23\20\14\311\313y(\3773&\26" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\31\20\16\13\343\324\223G\377\340\240M" + "\377\337\241P\377\37\31\20\377\4\4\4f\12\12\11\327\316\2057\377\337\234F" + "\377\340\244U\3773'\30\377\5\5\4R\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10n\262b" + "\33\377\323s\36\377\323y\"\377$\32\17\377\3\3\2U\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\10\10\5\34\33\24\12\350}I\26\377\276a\25\377\264" + "\\\25\377a8\24\377\16\13\7\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\216" + "\245Y\26\377\306h\25\377T2\23\377\7\6\4\237\0\0\0\0\5\5\4R\40\27\13\377y" + "E\26\377a8\24\377\17\15\10\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\16\14\7\306\254\\\25\377\34\23\11\317\0\0\0\0\0\0" + "\0\0\13\12\6U\224N\25\377\306h\25\377\300a\25\377\25\17\10\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\12\11\5\252\247Z\26\377\312]\25\377" + "\312g\27\377\25\20\12\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\3\3\205" + "\24\20\11\377\227P\26\377K*\20\377\12\10\7\377\40\26\13\377\244V\27\377<" + "'\21\377\5\5\4\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\14\13\11\306\325\233P\377\340\246S\377\323y\"\377\24\20" + "\11\377\3\3\2\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\6\6\5""3\33\24\12\377\240T\27\377\306h\25\377C(\20\377\10" + "\7\5}\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252\303p\36\377\327}&\377\331\205" + "2\3771#\26\377\5\5\4\205\15\14\12\322\275w2\377\323\177,\377\324y)\377\332" + "\2075\377\334\224?\377\"\33\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\4\4\4\21\15\14\12\343\304q\37\377\324v#\377\326{+\377!\32\20\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\14\13\11\273\320\2067\377\337\222F\377" + "\335\230F\377\"\32\21\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\10\7\5\244\245V\26\377\312b\25\377\306`" + "\25\377\26\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\5U\40" + "\26\13\377\247W\26\377\240T\27\377]6\24\377xA\25\377\274`\25\377\304c\25" + "\377\310i\25\377\30\23\13\317\0\0\0\0\0\0\0\0\17\16\12n\320\230G\377\343" + "\256b\377\344\263g\377\341\260b\377\331\251^\377\325\246\\\377\327\247\\" + "\377\325\233P\377\314\2107\377\212Y%\377\31\26\20\343\11\11\10\34\0\0\0\0" + "\0\0\0\0\13\12\10\252\313\2012\377\337\225F\377\336\236K\377\37\31\20\377" + "\4\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\7""91(\32" + "\377\316\230S\377\340\251[\377\302\214G\377\37\33\24\377\11\10\10\34\0\0" + "\0\0\0\0\0\0\14\12\11\241\304n!\377\332\2023\377\336\236K\377\37\31\20\377" + "\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\325\240T\377\344\264i\377\343\257" + "d\377!\34\22\317\0\0\0\0\0\0\0\0\14\13\11\202\322\233M\377\344\251c\377\342" + "\254_\377\36\31\21\377\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\314\2011\377" + "\326\177+\377\325}(\377\27\23\14\350\0\0\0\0\0\0\0\0\16\15\11}\320\230G\377" + "\337\237L\377\332\231;\377!\32\20\322\0\0\0\0\0\0\0\0\15\14\12\177\306v'" + "\377\327\177*\377\325~*\377)\37\22\343\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\34\31" + "\25\20\343\314\226O\377\337\253b\377\257z<\377\22\17\13\332\5\4\4\21\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\22\15U\261e\"\377\314{%\377\307u" + "$\377\307u$\377\312z%\377\307u$\377\306r\37\377\306n\37\377\312v#\377.!\25" + "\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\231nN%\377\325" + "\242R\377\332\244W\377C3\36\377\11\10\10U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\5\34\25\23\16\377\331" + "\246\\\377\343\257d\377\340\251[\377\37\31\20\327\0\0\0\0\0\0\0\0\14\12\7" + "U\232P\25\377\305c\24\377\300a\25\377\34\24\11\377\4\3\3n\13\11\6\252u?\24" + "\377\270^\25\377\306h\25\377\313h\30\377\322z%\377\25\21\14\374\0\0\0\0\0" + "\0\0\0\12\11\7\241\313\2012\377\340\240M\377\341\251X\377\36\31\21\377\4" + "\4\4\34\0\0\0\0\0\0\0\0\10\7\5\276\245V\26\377\306h\25\377\304c\25\377\34" + "\23\11\252\0\0\0\0\0\0\0\0\15\13\10U\260[\27\377\320p\33\377\322y#\377\33" + "\26\16\377\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\323\225L\377\340\250W\377" + "\340\242Q\377\40\32\21\322\0\0\0\0\0\0\0\0\14\12\7q\260[\27\377\312k\27\377" + "\312_\27\377\24\20\11\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\17\15\12\252\325\240T\377\344\264i\377\343" + "\256b\377!\32\22\377\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\325\233P\377\342" + "\254_\377\340\247U\377\27\24\16\364\0\0\0\0\0\0\0\0\13\12\10\177\275h\34" + "\377\326\177+\377\335\224F\377\37\31\20\377\4\4\4\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\252\303q\40\377\321u\34\377" + "\312g\27\377\24\17\11\374\3\3\3\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\17\16\12\252\325\233P\377\342\254_\377\335\230F\377\34" + "\30\17\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\16\14\11\252\320\215=\377\341\242X\377\343\256b\377!\32" + "\22\377\4\4\4\34\0\0\0\0\0\0\0\0\12\10\7\306\266b\27\377\312g\27\377\306" + "h\25\377\34\23\11\252\0\0\0\0\0\0\0\0\13\12\6U\232P\25\377\312b\25\377\312" + "g\27\377\31\24\14\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\14\12\7\252\272d\27\377\312c\27\377\310i\25" + "\377\36\25\11\252\0\0\0\0\0\0\0\0\14\11\7U\232P\25\377\306h\25\377\304c\25" + "\377\34\24\11\377\4\4\3q\13\12\6\343\267d\32\377\324\177+\377\247u4\377\21" + "\17\14\327\5\5\5\16\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\225L\377\340" + "\246S\377\337\241P\377\"\32\21\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\12\11\7\252\247W\26\377\306\\\25\377\304c\25\377" + "\304_\25\377\306\\\25\377\303c\26\377\300j\35\377\316\177+\377\331\215<\377" + "\337\222F\377\340\245Q\377\334\224?\377\324|'\377\31\23\14\327\0\0\0\0\0" + "\0\0\0\14\13\11t\304t%\377\332\2153\377\332\2137\377\332\216=\377\327\217" + ":\377\30\23\15\324\0\0\0\0\12\11\7\234\313\2012\377\335\226B\377\334\224" + "?\377\31\25\16\343\0\0\0\0\0\0\0\0\12\12\7\237\314\206;\377\341\240T\377" + "\341\251X\377$\35\23\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\314\2023\377" + "\334\216;\377\332\2137\377\25\22\14\371\0\0\0\0\0\0\0\0\13\12\10\216\316" + "\221C\377\342\254_\377\343\256b\377\40\32\21\377\4\4\4\34\0\0\0\0\0\0\0\0" + "\13\12\10\306\306u%\377\327}&\377\323z$\377\34\25\15\327\0\0\0\0\0\0\0\0" + "\15\13\10`\256[\27\377\312k\27\377\312g\27\377\26\21\11\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\13\12\6\252\260[\27\377\312g\27\377\313l\30\377\25\17\12\356\0" + "\0\0\0\0\0\0\0\13\12\10\216\316\221C\377\342\252[\377\340\240U\377\36\30" + "\21\377\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\321\225F\377\340\240M\377\336" + "\236K\377\37\31\20\324\0\0\0\0\0\0\0\0\14\13\11\177\306t#\377\327}&\377\323" + "z$\377\34\25\15\377\4\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\10\252" + "\303p\36\377\321n\36\377\317i\36\377\31\24\14\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\17\16\12\252\325\236P\377\342\254_\377\340\244U" + "\377!\33\22\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\322\217A\377\340\250" + "W\377\340\245Q\377\31\25\16\350\0\0\0\0\0\0\0\0\12\12\11\231\320\223C\377" + "\340\246S\377\336\236K\377\"\32\21\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252" + "\323\225L\377\337\225F\377\333\222<\377\31\24\16\353\0\0\0\0\0\0\0\0\12\12" + "\11\226\314\206;\377\340\234S\377\340\245Q\377!\33\22\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\323\226F\377\342\252[\377\342\254_" + "\377!\32\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\226eJ&\377\306\221" + "M\377\316\235W\377\312\227O\377\305\215J\377\310\222K\377\264~9\377\25\23" + "\16\343\5\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5q+\34\16\377\273`" + "\26\377\265]\26\377b7\25\377D*\21\377M.\22\377\201H\26\377\256Y\25\377S/" + "\22\377\13\11\6\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\6\6\5\34\20\16\13\303lL#\377\322\215;\377\332\242Q\377\247v6\377\20\16" + "\13\335\5\5\5\16\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\225L\377\340\250" + "W\377\337\232P\377\37\31\20\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6" + "\6\5""9\"\33\21\377\313z$\377\320|)\377mL\"\377\15\14\12\216\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\260[\27" + "\377\312]\25\377\304c\25\377\34\23\11\252\0\0\0\0\0\0\0\0\13\11\6U\204G\25" + "\377\303c\26\377g;\24\377\13\12\6\252\3\3\2\31\6\6\5n7#\20\377\306q\35\377" + "\324\2063\377)\40\24\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\25\23\16\327\331\243V\3771&\30\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\13\12\10R6+\33\377\310\207;\377\322\211;\377\317\2032\377\315\177,\377" + "\307u$\377\303o\34\377\273e\30\377]6\26\377\23\17\12\343\7\6\6\34\0\0\0\0" + "\0\0\0\0\12\11\7\252\303m\40\377\332\2125\377\340\236Q\377\337\255_\377\333" + "\247^\377\331\251^\377\332\253a\377\331\246\\\377\320\210;\377nD\33\377\23" + "\17\12\343\6\6\5\34\0\0\0\0\0\0\0\0\0\0\0\0\14\13\7\252=*\24\377\274j!\377" + "\320\2067\377\327\243R\377\331\246\\\377\330\247X\377\330\247Y\377\323\226" + "F\377\222^'\377\32\25\17\345\11\10\6\34\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252" + "3\40\16\377\227P\26\377\251[\26\377\255V\26\377\251X\26\377\255V\26\377\264" + "\\\25\377\302b\25\377\304_\25\377\300a\25\377\37\25\12\252\0\0\0\0\0\0\0" + "\0\0\0\0\0\14\12\7\2529%\22\377\275k\"\377\324\225C\377\331\246\\\377\331" + "\246\\\377\332\253a\377\327\243R\377\315~0\377tH\35\377\24\20\13\343\6\6" + "\5\34\0\0\0\0\0\0\0\0\13\11\6D~D\25\377\277b\26\377\302b\25\377\300a\25\377" + "\300a\25\377\277b\26\377\261[\26\377\32\23\11\216\0\0\0\0\0\0\0\0\0\0\0\0" + "\14\12\7\252:%\21\377\271k\36\377\320\2067\377\330\247X\377\332\253a\377" + "\331\246\\\377\325\224H\377\314\2023\377\321\215<\377\323\237L\377\36\31" + "\21\252\0\0\0\0\0\0\0\0\12\12\7\247\322\233M\377\344\262c\377\340\245Q\377" + "\335\245V\377\331\246\\\377\332\251]\377\331\246\\\377\326\234Q\377\316\207" + "3\377tH\35\377\24\20\13\343\6\6\5\34\0\0\0\0\0\0\0\0\15\12\6""9s>\24\377" + "\251[\26\377\245V\26\377\30\22\11\247\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\14\12\7Xu?\24\377\272d\27\377\277k\40\377#\33\20\220\0\0\0\0" + "\0\0\0\0\12\12\7\252\322\233M\377\344\262c\377\335\230F\377\30\23\15\377" + "\0\0\0\0\0\0\0\0\14\12\7\252:$\17\377\235O\26\377\227P\26\377:#\17\377\13" + "\11\6""9\0\0\0\0\0\0\0\0\14\12\7U\235Q\24\377\305c\24\377\300a\25\377\34" + "\24\11\252\0\0\0\0\0\0\0\0\13\11\6""9s>\24\377\275^\30\377\306u%\377\325" + "\235L\377\332\253a\377\331\251^\377\326\241U\377\325\235L\377\324\225C\377" + "\320\2067\377\315~0\377\217`(\377\34\32\23\345\10\10\7\34\0\0\0\0\0\0\0\0" + "\15\14\10U\215J\30\377\276^\27\377\267_\30\377\267_\30\377\273]\30\377\275" + "a\26\377\265]\26\377\261[\26\377\251X\26\377Y4\24\377\25\22\14\343\11\11" + "\10\34\0\0\0\0\0\0\0\0\0\0\0\0\22\21\15\265gJ(\377\317\222J\377\326\234Q" + "\377\322\220C\377\320\2127\377\317\2014\377\315\2050\377\315~0\377\227e*" + "\377\34\32\23\350\11\10\10\34\0\0\0\0\0\0\0\0\15\14\12n\272\177?\377\326" + "\234Q\377\325\236P\377\325\233P\377\326\234Q\377\326\231K\377\325\224H\377" + "\325\224H\377\323\226F\377\237o6\377\34\31\23\361\11\10\10\37\0\0\0\0\0\0" + "\0\0\0\0\0\0\22\21\15\265gJ(\377\320\234Q\377\326\234Q\377\320\2127\377\321" + "\211<\377\325\236P\377\325\233P\377\325\240T\377\327\240X\377\325\243T\377" + "\36\30\21\262\0\0\0\0\0\0\0\0\14\13\11]\262y5\377\325\236P\377\322\217A\377" + "\323\222>\377\325\224H\377\327\243R\377\325\236P\377\324\225C\377\321\215" + "<\377\231j1\377\34\31\23\353\11\11\10\37\0\0\0\0\0\0\0\0\0\0\0\0\22\17\13" + "\255B+\25\377\273e\40\377\317\2044\377\322\220C\377\325\224H\377\326\234" + "Q\377\330\247X\377\326\234Q\377\260\200A\377.'\33\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\17\16\12U\265o*\377\327\2104\377\325}(\377\323z$\377\324{%\377\322{" + "'\377\312z%\377\37\30\16\252\0\0\0\0\0\0\0\0\14\13\11X\244Y\35\377\313z$" + "\377\307u$\377\36\27\17\324\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\177\273\205" + ">\377\325\224H\377\320\2127\377\37\30\20\252\0\0\0\0\0\0\0\0\15\14\12U\254" + "h%\377\321\2066\377\316\2073\377\40\31\21\324\0\0\0\0\0\0\0\0\0\0\0\0\17" + "\15\12\177\265t.\377\323\217>\377\322\231G\377\35\30\20\262\0\0\0\0\0\0\0" + "\0\15\14\12[\262y5\377\325\232F\377\320\2067\377\37\31\20\322\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12}\263n*\377\322\2077\377\320\213A\377" + "\32\25\17\270\0\0\0\0\0\0\0\0\16\15\11U\263u,\377\331\245R\377\325\243T\377" + "\33\27\20\335\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\210\256g'\377\316\177+\377" + "\307u$\377\37\30\16\252\0\0\0\0\0\0\0\0\14\13\11X\244Y\35\377\312v#\377\304" + "r!\377\35\26\16\322\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11}\251_\36\377\312w%\377" + "\307w'\377\30\23\15\276\0\0\0\0\0\0\0\0\16\14\11U\252_\35\377\306q\35\377" + "\307t\"\377\314\200/\377\316\2073\377\314\2011\377\314\2011\377\320\2067" + "\377\323\225L\377\300\214I\377_J'\377\21\17\14U\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\16\14\11\306\323\226F\377\316\230Q\377\37\32\24\377\7\7\6""0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\225L\377\342\252[\377\342\254" + "_\377#\34\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\14\332\253" + "x<\377\333\232F\377)\37\24\377\4\4\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\14\252\333\263t\377\350\301\211\377" + "\350\307\207\377(!\27\377\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11L>2\37\377\24\22" + "\15\247\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10L:.\35\377\24\22\15\247\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252\322\226G\377\337\223H\377\335\226B\377" + "\32\25\17\322\0\0\0\0\13\12\10w\323\237T\377\345\270r\377\346\272{\377\36" + "\32\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11]\211Z(\377\337\247^\377" + "\344\264o\377\247\205P\377\21\20\16\343\13\13\12\252\14\13\11\252\14\13\11" + "\252\14\13\11w\7\7\6""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\7\7\6>\25\22\14\343\235\\\34\377\313i\32\377\305j" + "\32\377R0\25\377\16\14\7\255\5\5\4\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\7\5\34\32\23\13\343gD\31\377\236`\35\3779)\26\377\15\14\12\361!\32\20\377" + "\222X\37\377B/\27\377\14\12\11\311\6\5\5\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5""9\36\26\13\377\17\14\10`\0\0\0" + "\0\0\0\0\0\12\12\7\202\276h\33\377\321v\36\377\323u\"\377\33\25\16\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\15\14\12\252\307z'\377\332" + "\2023\377\337\222F\377\36\30\21\377\0\0\0\0\0\0\0\0\0\0\0\0\27\26\22\213" + "\36\33\25\252\20\17\13\377Y;\32\377\313n\34\377\304q\37\377zQ!\377\272u+" + "\377\330\2013\377\270~9\377&\"\31\377\30\26\23\335!\36\30\252\17\17\14\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\30\26\23\216\40\37\31\252\25\24\20\306ZG-\377\337" + "\263n\377\342\254_\377\335\226B\377\217d,\377\26\25\21\343\34\33\25\252\35" + "\34\26\252\15\15\14*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\10\10\10\13\31\30\24\216'#\34\252\36\34\27\252\35\33" + "\26\252\35\33\26\252\35\33\26\252\35\33\26\252\35\33\24\252\27\25\20\252" + "\16\15\13\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\237\216V\37\377\320t" + "#\377\311w&\377\40\32\21\377\5\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252" + "\330\247a\377\347\270|\377\347\301\200\377\265\222\\\3774,!\377ZG-\377\311" + "\233X\377\337\255f\377\344\263s\377\346\267{\377\346\270w\377'\40\26\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\14\14\13\252\316\213=\377" + "\342\244[\377\344\256g\377'\40\26\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\6\6\5\34\11" + "\11\10\2168.\37\377\336\264q\377\346\273w\377\336\264q\377\27\25\20\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\17" + "\16\14\244O;\36\377\321\200*\377\323\177,\377\253u.\377\22\17\13\252\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10t!\34\20\377\241^\34\377\307k\32\377" + "A(\22\377\10\7\5\377\31\24\14\377\306q\35\377\322x!\377\331\2052\377\33\27" + "\20\377\0\0\0\0\0\0\0\0\7\7\6\27\"\34\23\306.$\31\377'\37\26\377)!\26\377" + ";.\34\3773(\32\377=/\34\377\264\205G\377\343\257d\377\342\257g\377\265\217" + "X\377\21\20\14\216\0\0\0\0\0\0\0\0\13\13\12\252\326\246a\377\345\263r\377" + "\344\271o\377\241yD\377\27\25\20\343\27\26\22\252\26\25\21\252\20\17\15\252" + "\13\13\10\223\10\10\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252\265\217X\377\344\271{\377\332" + "\250a\377F6#\377\11\11\10q\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10UxW-\377\337\267" + "x\377\347\276\204\377\247\207P\377\30\26\23\343\23\22\20\252\23\22\20\306" + "_P.\377\342\301\201\377\344\273\201\377\272\224W\377\17\16\14\252\0\0\0\0" + "\0\0\0\0\12\12\11U\233q@\377\345\304\204\377\350\277\205\377\263\216Z\377" + "\33\31\24\343\22\22\17\252\23\22\20\306ZG-\377\336\257e\377\343\256b\377" + "\344\271o\377\34\31\23\377\0\0\0\0\0\0\0\0\7\7\6\27\"\34\23\3061#\26\377" + "'\35\22\343\14\13\11U\0\0\0\0\0\0\0\0\10\7\7\34!\32\20\3064'\27\377/#\26" + "\343\15\14\10U\0\0\0\0\0\0\0\0\10\10\7\34!\36\30\343\311\235d\377\346\272" + "{\377\265\211J\377\20\17\13\317\6\6\5\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\13\12\10\34\33\25\14\301\32\23\13\377\27\22\12\377\27\22" + "\12\377\30\22\13\377\30\22\13\377\32\24\13\377#\33\20\377*\37\23\361\21\16" + "\12U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\220" + "[C$\377\331\232H\377\323\226F\377E7\"\377\17\16\14U\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\13\13\13\12\216\30\26\23\377\247" + "\207P\377\341\254h\377\340\246S\377\301~6\377\20\16\13\252\0\0\0\0\0\0\0" + "\0\15\14\10U\271a\32\377\317p\34\377\314n\33\377G.\26\377\10\10\7\377\34" + "\26\15\377\306k\33\377\301o\36\377~N\37\377\307\213>\377\342\270o\377\33" + "\30\22\377\0\0\0\0\0\0\0\0\13\12\10\252\326\246a\377\346\273w\377\344\263" + "g\377\217f0\377\21\20\14\343\14\14\11\252\15\14\12\306.!\21\377\307p\34\377" + "\316o\33\377\314n\33\377\40\27\15\260\0\0\0\0\0\0\0\0\14\13\11\210\314\206" + ";\377\342\254_\377\344\265k\377\242}I\377\30\26\23\343\23\22\20\252\23\22" + "\20\306_P.\377\340\263m\377\337\255_\377\255u2\377\17\15\12\234\0\0\0\0\0" + "\0\0\0\14\13\7c\271a\32\377\320p\33\377\314n\33\377\26\22\13\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" + "\20\17\15\252\333\263t\377\350\302\205\377\347\301\200\377(!\27\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\20\17\15\252\333\261p\377\346\273w\377\340\237S\377\30" + "\25\17\377\0\0\0\0\0\0\0\0\13\12\10\244\323\236R\377\345\270r\377\346\277" + "{\377\246\177M\377\26\25\21\343\26\25\21\252\24\23\15\252\16\15\13\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\303p\36\377\321j\36\377\316o\33" + "\377e?\32\377\20\16\13\343\27\25\20\252\35\33\26\252\15\15\14*\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\20\17\15\252\330\247a\377\340\236W\377\330}-\377\30" + "\24\15\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\21\20\14\252\333\261p\377\350\303\211\377\347\275\200" + "\377\242}I\377\26\25\21\343\16\16\13\252\15\14\12\3062#\23\377\307p\34\377" + "\316o\33\377\314n\33\377\40\30\15\252\0\0\0\0\0\0\0\0\15\14\10]\302m!\377" + "\333\2136\377\340\236Q\377'\40\26\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\13\12\10\252\276h\33\377\320" + "p\33\377\314n\33\377\40\30\15\252\0\0\0\0\0\0\0\0\15\14\10U\270`\31\377\317" + "p\34\377\314f\33\377\201N\34\377\37\32\20\377\177T\"\377\333\223F\377\255" + "z>\377\17\16\14\324\6\6\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\252" + "\325\233P\377\335\220D\377\331\2024\377\37\31\20\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\12\11\7\252\275c\32\377\320" + "p\33\377\314n\33\377\233W\32\377H.\25\377\263g$\377\337\234L\377\330\252" + "a\377\206`/\377\256\177G\377\335\247Z\377\337\223H\377\336\236K\377\27\23" + "\16\374\0\0\0\0\0\0\0\0\13\12\10\252\326\246a\377\347\273|\377\346\277{\377" + "\344\266u\377\336\257e\377@2!\377\7\7\6\345\32\27\23\377\334\257i\377\344" + "\267q\377\344\274u\377\31\25\20\377\0\0\0\0\0\0\0\0\13\12\10\252\331\260" + "p\377\350\305\211\377\350\307\207\377%\37\26\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\15\14\12\252\306u%\377\327\177*\377\331\2024\377\25\23\16\377\0\0\0\0\0" + "\0\0\0\13\12\10\247\327\254h\377\350\277\205\377\347\276\204\377\246\177" + "M\377\27\25\20\343\22\21\17\252\21\20\14\306J4\33\377\314u!\377\323o\36\377" + "\255]\34\377\17\14\10\244\0\0\0\0\0\0\0\0\15\14\10X\271a\32\377\320p\33\377" + "\314n\33\377\23\20\12\377\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\276h\33\377" + "\324v#\377\330\2103\377\25\23\16\374\0\0\0\0\0\0\0\0\13\12\10\247\327\254" + "h\377\350\302\177\377\347\301\200\377\246\201M\377\27\25\20\343\23\22\20" + "\252\23\22\16\306Q;\"\377\325\220>\377\327\214<\377\245l(\377\15\14\12\247" + "\0\0\0\0\0\0\0\0\10\10\7Ue?\32\377\316r!\377\324y!\377\233\\$\377\27\25\20" + "\343\26\25\21\252\34\32\25\252\25\24\22\252\15\15\14\244\12\12\11U\6\6\6" + "\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\302" + "p\37\377\324w%\377\330\206-\377#\34\22\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\20\17\15\252\331\253j\377\347\273|\377\344\265k\377'\40" + "\26\377\0\0\0\0\0\0\0\0\0\0\0\0\20\17\13\252\320\2067\377\337\234F\377\335" + "\224F\377\27\24\16\356\0\0\0\0\0\0\0\0\13\12\10\252\314\2107\377\337\234" + "F\377\336\236K\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252\331\253" + "j\377\350\275\177\377\346\272{\377\31\26\20\377\0\0\0\0\0\0\0\0\12\12\11" + "\247\322\233M\377\342\254_\377\340\245Q\377\37\32\22\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\17\15\14\252\331\255h\377\350\277\205\377\347\303" + "\204\377(!\27\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\11\205I:" + "$\377\341\270x\377\347\301\200\377\344\264o\377\223f0\377\17\15\12\343\10" + "\7\7\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\7\306d;\27" + "\377\251]\32\377\234[\33\377\256`\33\377\264c\33\377\250a\33\377i>\30\377" + "\22\17\11\377\7\6\6""0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7" + "\7\7\34\17\17\14\343\220rC\377\333\261p\377\337\260f\377\231q>\377\21\20" + "\14\343\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\252\325\233P\377" + "\337\222F\377\331\2012\377\33\26\16\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\14\12\11\303\241^\34\377\317r\40\377\301r$\377\27\24\20\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\14\13\11" + "\252\277i\34\377\317d\34\377\314n\33\377\32\24\13\314\0\0\0\0\0\0\0\0\6\5" + "\5\3\32\23\11\306\30\22\11\366\17\14\10\216\0\0\0\0\0\0\0\0\0\0\0\0\17\15" + "\12[\37\30\20\3643'\30\377\25\23\16[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11L=1\36\377\24\22\15\234\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\21\17\14\216\33\26\16\350\36\26\15\377\31\24\14\377" + "\26\22\13\356\25\20\12\377c:\26\377\313q\32\377\315o\34\377\203P\36\377\14" + "\13\11\216\0\0\0\0\0\0\0\0\13\12\10\252\324\240U\377\350\277\177\377\347" + "\303\204\377\304\233[\377Q;\"\377)\40\24\3776+\33\377\264\205G\377\330\220" + ";\377\320s!\377\201N\34\377\14\13\7\216\0\0\0\0\0\0\0\0\10\7\7""9H4\35\377" + "\327\233N\377\343\256b\377\317\236^\377U?\"\377$\35\23\3779+\32\377\275\202" + "B\377\333\225B\377\324y)\377\254i!\377\21\17\12\223\0\0\0\0\0\0\0\0\7\6\6" + """6:(\25\377\306q\35\377\316g\33\377\245W\30\377*\34\15\377\25\20\10\377" + "\33\24\12\377_<\26\377\312i\33\377\316d\35\377\314n\33\377#\30\14\252\0\0" + "\0\0\0\0\0\0\7\7\6""6F2\33\377\324\221A\377\343\256b\377\311\233X\377;,\34" + "\377\27\24\16\377\"\34\23\377\235h0\377\323~*\377\320s!\377\204R\35\377\15" + "\13\10\216\0\0\0\0\0\0\0\0\0\0\0\0\30\22\11\335l=\27\377\311p\32\377\317" + "p\34\377\314n\33\377\236[\31\377.\35\15\371\13\12\6""9\0\0\0\0\0\0\0\0\10" + "\10\7""9F2\33\377\324\216;\377\342\254_\377\317\236^\377U?\"\377)\40\24\377" + "9+\32\377\256|;\377\340\252]\377\345\270r\377\347\304\200\377\34\31\23\377" + "\0\0\0\0\0\0\0\0\12\12\11\247\327\251f\377\350\277\177\377\347\301\200\377" + "\304\232W\377M;\"\377)\37\24\3776+\33\377\250q1\377\324y)\377\316r!\377\204" + "R\35\377\14\13\11\202\0\0\0\0\0\0\0\0\14\13\7n\274b\31\377\316o\33\377\316" + "j\31\377\32\23\13\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\16" + "\14\11\252\307u$\377\335\224>\377\343\256b\377\34\32\23\377\0\0\0\0\0\0\0" + "\0\12\12\11\247\324\241Y\377\340\246S\377\331\2012\377\40\30\17\377\5\5\4" + "\37\7\7\6\210A,\26\377\300j\35\377\313l\30\377rB\27\377\21\15\10\335\0\0" + "\0\0\0\0\0\0\0\0\0\0\12\11\7\213\271a\32\377\320p\33\377\320u\35\377\40\30" + "\15\252\0\0\0\0\0\0\0\0\17\15\10[\275c\32\377\327{*\377\342\254_\377\306" + "\230W\377Q:\"\377\260\205G\377\340\250_\377\305\212>\377A/\32\377\205Q\36" + "\377\320y%\377\324s%\377\230b#\377\14\13\11\216\0\0\0\0\0\0\0\0\12\11\7\223" + "\276k\31\377\316o\33\377\316j\31\377\236[\31\377*\34\15\377\25\17\10\377" + "\32\23\11\377rB\27\377\314q\31\377\320s!\377\255z>\377\20\17\15\226\0\0\0" + "\0\0\0\0\0\10\10\7GnW3\377\336\264q\377\340\246S\377\321\211<\377\205T\40" + "\377M2\30\377Y;\32\377\265m\40\377\322y#\377\324y)\377\253t4\377\17\16\14" + "\216\0\0\0\0\0\0\0\0\16\15\13\252\333\261p\377\347\273|\377\344\264o\377" + "\315\236Z\377O:\40\377&\35\23\3771#\26\377\247r.\377\331\222>\377\333\232" + "F\377\251u8\377\17\15\14\234\0\0\0\0\0\0\0\0\10\10\7GhP-\377\340\267w\377" + "\350\277\177\377\322\246a\377Q<\40\377'\36\22\3774(\31\377\257\200B\377\341" + "\255b\377\344\264i\377\342\257_\377\35\31\22\377\0\0\0\0\0\0\0\0\14\14\13" + "\252\320\2127\377\336\221?\377\334\213;\377\301y2\377D2\35\377&\34\23\377" + "0#\27\377\257p,\377\331\2166\377\331\220B\377\277\211B\377\23\20\14\252\0" + "\0\0\0\0\0\0\0\11\10\10JoR(\377\330\233K\377\342\254_\377\310\227Q\3779)" + "\32\377\33\27\20\377#\34\22\377)\40\24\377'\36\24\377\31\26\20\343\17\16" + "\12\216\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\34!\30\16\343\207Q\34\377\316u\37" + "\377\322l!\377\320n\37\377\253\\\34\3771!\20\374\15\13\10D\0\0\0\0\0\0\0" + "\0\13\12\10\252\303l\36\377\324v#\377\331\2114\377*!\27\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\24\22\17\252\326\234Q\377\335\224>\377\326\177+\377\27\23\14\356" + "\0\0\0\0\0\0\0\0\12\12\7\237\304m\37\377\325w$\377\324{%\377\37\30\16\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\321\211<\377\344\254c\377\346\275w" + "\377\34\32\23\377\0\0\0\0\0\0\0\0\14\14\13\252\320\2067\377\332\2113\377" + "\326\177+\377#\33\20\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13" + "\252\307t\"\377\331\2040\377\340\246S\377\40\32\23\377\0\0\0\0\0\0\0\0\12" + "\12\7\"Q:\"\377\340\262i\377\342\254_\377\201\\(\377\11\11\10\252\6\6\6U" + "\6\6\5q#\33\20\377\314u!\377\320u\35\377nE\31\377\16\14\7l\0\0\0\0\0\0\0" + "\0\12\12\7\252\303p\36\377\323s\36\377\323s\36\377\36\27\15\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\16\14\11\252\304q\37\377\323x\40\377\326~)\377!\32\22\377" + "\0\0\0\0\0\0\0\0\11\10\6\34,!\23\324<*\27\377.#\25\377J5\37\377\234m5\377" + "\330\247a\377\344\263m\377\345\261n\377\343\270l\377\250{E\377\27\25\20\343" + "\11\10\10\34\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\206b3\377\337\246\\\377" + "\204d5\377\11\11\10\205\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15" + "\252\333\261p\377\350\277\205\377\347\303\204\377(!\27\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5-'\40\26\377\322\2011\377\254j#\377\24\21" + "\15\343\13\13\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\21\21\16\252\335\275\204\377\353\315\232\377\352\315\233\377*'\35\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\11\10\10\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\16\13" + "\252\320\215=\377\340\250W\377\344\256g\377\37\32\24\335\0\0\0\0\15\14\14" + "\202\332\271\177\377\352\312\223\377\350\306\213\377(!\31\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\260\214sG\377\346\312\223\377\350\312" + "\225\377\332\252e\377\310|+\377\306u%\377\306u%\377\304t%\377H4\33\377\14" + "\13\11\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10" + "\7U%\37\24\377\256n)\377\322{'\377\314x%\377\202W\37\377\17\15\12\276\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4q\34\32\23\377" + "\322\217A\377\334\243Q\377\331\246\\\377\336\255a\377\341\260b\377*%\31\377" + "\4\4\4J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252\320\215=\377" + "\342\254_\377\344\267o\377(\"\31\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\21\20\16\252\333\261p\377\350\302\205\377\351\312\224\377\33" + "\30\24\377\0\0\0\0\0\0\0\0\20\17\15U\307\241f\377\334\246Y\377\323\217>\377" + "\331\232H\377\337\241P\377\340\251[\377\341\271r\377\345\274|\377\347\276" + "\204\377\347\310\217\377\343\303\214\377\343\304\212\377\341\303\210\377" + ",%\33\252\0\0\0\0\0\0\0\0\21\20\16U\310\245m\377\343\306\216\377\341\277" + "\204\377\343\303\206\377\347\307\210\377\347\305\204\377\347\302|\377\345" + "\277\202\377\341\303\210\377\341\303\210\377\341\277\204\3771*\36\306\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\21" + "\15i\301\207B\377\335\257f\377\336\272{\377\337\276\204\377\340\300\207\377" + "\337\276\204\377\336\272{\377\335\262n\377\332\254i\377.'\33\303\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\6\6\6\34\33\32\24\377\330\252a\377\341\262h\377\260\210" + "S\377\20\17\15\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\252\335\274\202" + "\377\353\315\232\377\352\315\233\377\350\314\225\377\344\307\217\377\253" + "\220`\377@9)\377\232~Q\377\343\275z\377\346\270w\377\343\253b\377\"\36\25" + "\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\21\20\16\252\335\272" + "~\377\352\312\223\377\350\300\207\377,'\33\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\11\11\10\216" + "\31\30\24\377r_5\377\317\251f\377\343\273v\377\342\274{\377\262\224_\377" + "\23\22\20\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\30\26\23U\305\221T\377\343\273v\377\347\302|\377\317\255r\377=7&\377" + "\10\10\10\210\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11l-$\25\377\303t&\377\317z&" + "\377\213Z\40\377\15\14\10\252\0\0\0\0\12\12\11\306\320\214;\377\342\252[" + "\377\347\301\200\377(#\33\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\4\4\3\34\22\21\15\343\336\275\203\377\352\311" + "\217\377\345\277\202\377\"\36\27\314\0\0\0\0\0\0\0\0\13\13\12\252\323\236" + "R\377\342\252[\377\340\245Q\377\333\232F\377\320\2043\377\316\200-\377\314" + "z)\377\311x(\377\304t%\377oJ\36\377\24\22\15\343\10\10\7\34\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\6\34\34\32\25\377\336\272" + "{\377\345\304\204\377\265\220\\\377\20\17\15\324\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\6\6\6U\31\30\24\377\264\225e\377\347\315\232\377\350\314\225\377" + "\343\306\216\377\337\300\212\377\337\301\210\377\346\307\213\377\350\305" + "\215\377\323\260z\377@9)\377\10\10\7q\0\0\0\0\0\0\0\0\6\6\5\16!\37\30\343" + "\272\233k\377\350\314\225\377\351\315\230\377\343\305\214\377\335\275\204" + "\377\340\300\207\377\344\306\215\377\350\311\215\377\350\300\207\377\347" + "\305\204\377)#\32\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\21\20\16\213\323\262x\377\351\312\224\377\351\312\224\37780!\377\4\4" + "\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\13" + "\12\377\330\244Y\377\346\277{\377\343\303\206\377(#\33\343\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\343~iE\377\331\260p\377" + "\341\257h\377\337\237L\377\275|1\377+#\24\377\11\10\10""9\0\0\0\0\0\0\0\0" + "\12\12\11\205\302m!\377\327}&\377\324|'\377\220]!\377\35\30\20\377D5\35\377" + "\272{1\377\200_/\377\31\30\24\377\217wN\377\346\311\221\377!\36\30\377\0" + "\0\0\0\0\0\0\0\13\13\12\252\331\260p\377\344\266m\377\336\236K\377\324\206" + "3\377\314z)\377\306u%\377\310v%\377\320{'\377\324{%\377\326y'\377\331\205" + "2\377\30\25\17\364\0\0\0\0\0\0\0\0\13\13\12\252\332\271\177\377\353\313\224" + "\377\351\312\224\377\346\311\221\377\343\305\214\377\335\273\200\377\335" + "\270x\377\340\262i\377\340\244U\377\275\201:\377'\40\24\377\7\7\6U\0\0\0" + "\0\0\0\0\0\13\12\10}\302m!\377\327}&\377\325}(\377\35\30\20\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\21" + "\21\16\252\335\274\202\377\353\311\230\377\350\311\215\377*$\33\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\21\21\16\252\333\263t\377\347\273|\377\344\267o\377\30" + "\26\21\377\0\0\0\0\0\0\0\0\13\13\12\252\332\271\177\377\350\305\211\377\343" + "\263h\377\333\233H\377\320\2043\377\314z)\377\312x'\377&\37\23\252\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\304n!\377\327q&\377\325z*\377\327" + "\217:\377\331\246\\\377\336\272{\377\341\303\210\3774,!\306\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\21\20\16\252\323\226F\377\333\2148\377\325~*\377\31\25" + "\16\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\21\21\16\252\335\273\200\377\350\307\215\377\344\264o\377" + "\333\233H\377\317\200,\377\307w'\377\310v%\377\320{'\377\324{%\377\326}'" + "\377\324|'\377\"\32\17\265\0\0\0\0\0\0\0\0\13\12\12\241\327\254h\377\352" + "\311\217\377\352\316\227\377*'\35\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\14\13\11\252\304n!\377\327}" + "&\377\324|'\377$\34\21\252\0\0\0\0\0\0\0\0\17\16\12U\302m!\377\327}&\377" + "\324|'\377\322\200)\377\323\2076\377\341\260b\377\347\305\204\37780!\377" + "\4\4\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\316\2073\377" + "\331\2052\377\325z*\377\31\25\16\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\14\13\11\252\304n!\377\327}&\377\325z*\377C" + "3\34\377\6\6\5\377(\"\31\377\342\276\177\377\212nE\377\7\7\7\377\31\30\24" + "\377\335\263p\377\350\277\177\377\350\311\215\377\32\27\23\377\0\0\0\0\0" + "\0\0\0\13\13\12\252\326\250e\377\346\273w\377\344\274u\377\324\255i\377\226" + "vC\377fV/\377oZ2\377\271\221X\377\343\273v\377\347\303\204\377\350\311\215" + "\377\32\27\23\377\0\0\0\0\0\0\0\0\13\13\12\252\333\270\200\377\353\315\232" + "\377\352\316\227\377*$\33\377\0\0\0\0\0\0\0\0\0\0\0\0\17\17\14\252\325\236" + "P\377\344\266m\377\346\277{\377\33\27\22\377\0\0\0\0\0\0\0\0\13\13\12\252" + "\333\275\204\377\353\315\232\377\350\305\215\377\341\271r\377\327\233N\377" + "\316\2073\377\315~*\377\321\200*\377\324y)\377\265o$\377'\36\22\377\10\10" + "\7""9\0\0\0\0\0\0\0\0\12\12\11\210\302m!\377\327}&\377\324|'\377\30\24\15" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\14\252\322\222G\377\345\267n\377\347\305" + "\204\377\32\27\23\377\0\0\0\0\0\0\0\0\13\13\12\252\332\275\177\377\352\307" + "\217\377\347\305\204\377\341\260j\377\326\231K\377\320\2127\377\315\2050" + "\377\322\177-\377\326\2061\377\263w*\377%\36\22\377\7\7\6U\0\0\0\0\0\0\0" + "\0\0\0\0\0\27\24\16\343\241s2\377\336\247Y\377\343\272r\377\341\276\202\377" + "\337\306\210\377\343\306\216\377\340\304\215\377\335\277\206\377\241\202" + "V\377!\36\30\345\12\12\11*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\17\17\14\252\323\225L\377\344\266m\377\347\275\200\377,'\33\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\21\21\16\252\330\252a\377\342" + "\254_\377\340\245Q\377\37\32\22\377\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252" + "\311x(\377\331\2052\377\330}-\377\31\25\16\324\0\0\0\0\0\0\0\0\13\12\10\220" + "\313\2024\377\340\246S\377\344\256g\377(\"\31\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\21\20\16\252\335\273\200\377\352\311\217\377\346\277{\377\34\31\23\364\0" + "\0\0\0\0\0\0\0\12\12\11\244\313z2\377\334\224?\377\331\2154\377\27\24\16" + "\377\0\0\0\0\0\0\0\0\16\15\13l\12\12\11\34\0\0\0\0\15\15\14\252\335\275\206" + "\377\353\315\232\377\352\316\227\377*%\33\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\13\13\12\377\336\275\203\377\350\303\203\377\340\242" + "Q\377$\35\23\377\4\4\4""6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\7\7\6\34\23\21\14\350]B\36\377\267p$\377\321z&\377\324x'\377\237" + "f\"\377\26\23\15\377\7\7\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\6\6\5\34\21\20\16\343\225zT\377\343\303\214\377\343\277\206\377\263\216" + "Z\377\21\20\16\343\5\5\4\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16" + "\14\252\314\2011\377\332\2153\377\325~*\377\31\25\16\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\10\7\7[D0\31\377\315\177,\377\334\231K\377" + "cN,\377\10\10\7q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\14\13\11\252\304n!\377\327}&\377\324|'\377\30\24\15\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\11\11\10\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\2\1\27\11\10\6\377\307t\"\377\327" + "}&\377\324\200-\377\33\30\20\317\0\0\0\0\0\0\0\0\13\13\12\252\333\270\200" + "\377\353\315\232\377\352\315\233\377:1#\377\5\5\4U\0\0\0\0\4\4\3\34\20\17" + "\13\343\314z)\377\327~(\377\322{'\377\40\31\17\252\0\0\0\0\0\0\0\0\15\15" + "\14z\320\250c\377\352\307\217\377\352\314\227\377?6&\377\5\5\4U\0\0\0\0\4" + "\4\3\34\22\21\15\327\314\177-\377\326}'\377\324y)\377\"\33\17\252\0\0\0\0" + "\0\0\0\0\15\14\12U\271p\"\377\327}&\377\324{%\377#\34\20\377\4\4\3U\0\0\0" + "\0\3\3\2\34\14\12\11\340\306u%\377\327}&\377\324|'\377\"\33\17\262\0\0\0" + "\0\0\0\0\0\16\15\13q\316\242^\377\350\307\215\377\352\317\233\377?5$\377" + "\4\4\3q\0\0\0\0\3\3\3\34\12\12\11\377\310v%\377\327}&\377\322{'\377\33\26" + "\16\343\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\6\15\13\10\335\307t\"\377\327}&\377" + "\324|'\377#\33\20\377\5\4\4""9\0\0\0\0\0\0\0\0\0\0\0\0\17\16\14\223\316\232" + "W\377\350\303\211\377\352\314\227\377?6&\377\5\5\4U\0\0\0\0\4\4\3\34\22\20" + "\15\343\336\275\203\377\353\315\230\377\352\315\233\377\33\30\24\377\0\0" + "\0\0\0\0\0\0\13\13\12\252\333\270\202\377\353\315\230\377\352\315\233\377" + ":1#\377\5\5\4U\0\0\0\0\4\4\3\34\16\14\11\343\307u$\377\327q&\377\322{'\377" + "\40\31\17\252\0\0\0\0\0\0\0\0\14\14\11f\302m!\377\327}&\377\324|'\377\33" + "\26\16\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\22\20\15\252\331" + "\260n\377\352\304\217\377\352\314\227\377\33\30\24\377\0\0\0\0\0\0\0\0\13" + "\12\12\252\314\206;\377\333\2106\377\325z*\377H2\33\377\10\10\7\377\31\26" + "\16\377\303t&\377\320{'\377\216[\37\377\20\16\11\301\4\4\3\21\0\0\0\0\0\0" + "\0\0\0\0\0\0\13\13\10\252\306u%\377\333\2058\377\335\230F\377\33\27\20\335" + "\0\0\0\0\0\0\0\0\15\14\12c\301q\"\377\337\234F\377\347\301\200\377(\"\31" + "\377\4\3\3q\21\20\14\343\320\210;\377-$\25\377\4\3\3q\12\11\7\317\304n!\377" + "\327}&\377\322\200)\377\40\31\17\252\0\0\0\0\0\0\0\0\14\13\11l\302m!\377" + "\327}&\377\324|'\377#\33\20\377\4\4\3U\0\0\0\0\3\3\2\34\14\13\11\343\307" + "u$\377\335\226B\377\345\277~\377\40\35\27\322\0\0\0\0\0\0\0\0\15\15\14z\314" + "\226O\377\337\237L\377\331\2154\377T9\35\377\11\10\6\252\5\5\4U\6\6\5q\33" + "\26\16\377\317\200,\377\337\223H\377\343\273v\377\"\36\27\317\0\0\0\0\0\0" + "\0\0\14\13\13\252\332\264w\377\345\270r\377\340\247U\3772(\31\377\5\5\4U" + "\0\0\0\0\4\4\3\34\16\14\11\343\313}*\377\331\2000\377\325\200-\377#\33\20" + "\255\0\0\0\0\0\0\0\0\14\14\13\202\321\243b\377\353\313\224\377\351\312\224" + "\377?6$\377\5\5\4U\0\0\0\0\4\4\3\34\17\17\14\343\321\211<\377\335\227D\377" + "\333\223>\377\27\24\16\356\0\0\0\0\0\0\0\0\12\12\11\226\304y)\377\331\200" + "0\377\327\205,\377(\37\23\377\5\5\5U\0\0\0\0\4\4\3\34\20\16\13\317\311x(" + "\377\331\2052\377\335\241L\3779,\34\252\0\0\0\0\0\0\0\0\17\16\14i\323\245" + "b\377\350\305\211\377\350\307\215\377:1#\377\4\4\3q\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\21\14\13" + "\11\343\307t\"\377\327}&\377\324|'\377#\33\20\377\4\4\3>\0\0\0\0\0\0\0\0" + "\0\0\0\0\14\13\11\252\310x)\377\337\237L\377\346\277{\377,%\33\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\22\21\17\252\320\214;\377\331\2052\377\325}(\377\33\27" + "\16\303\0\0\0\0\0\0\0\0\14\13\11l\302m!\377\327}&\377\324|'\377\31\25\16" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\333\263t\377\353\311\230\377\352" + "\314\227\377\33\30\24\377\0\0\0\0\0\0\0\0\12\12\11\252\306z)\377\327\177" + "*\377\325}(\377\33\26\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13" + "\11\252\311x(\377\340\234S\377\347\276\204\377(!\31\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\12\12\11U4*\35\377\310\216;\377\267w,\377H4\33\377'\36\22\3771%\26" + "\377\226c!\377\304t%\377M2\30\377\12\11\7\220\0\0\0\0\0\0\0\0\0\0\0\0\12" + "\12\11\252\304s#\377\327}&\377\324|'\377\31\25\16\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\14\13\11\252\304n!\377\326\177+\377\336\236K\377)\"\30\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\5\5\4U\13\13\12\377\202e;\377\337" + "\260f\377\340\260e\377\261\211J\377\22\21\15\343\6\5\5\34\0\0\0\0\0\0\0\0" + "\0\0\0\0\24\23\17U\272x1\377\331\216>\377\331\2138\377\"\35\23\377\4\4\3" + "\21\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\252\335\274\202\377" + "\353\315\230\377\352\315\233\377*'\35\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\15\15\12\265\307w'\377\324y)\377\313y(\377#\35\21\252\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\22\17\252\336\272" + "{\377\352\311\217\377\350\305\207\377/(\34\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\16\15\13\252\325\240T\377\346\273w\377\347" + "\305\204\377#\36\26\306\0\0\0\0\16\15\13l\331\260p\377\350\301\211\377\347" + "\305\204\377!\34\26\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\14" + "\14\13q\37\35\26\322(#\33\377)\"\30\377\35\30\20\377\40\32\21\377\222\\#" + "\377\326\2061\377\324\200-\377{Q$\377\17\15\12\216\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\7\7\6U\34\32\23\374\302\214G\377\324\177+\377\312v#\377" + "aB\36\377\17\16\12\317\6\6\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\6\6\5\10\17\15\14\343oV2\377\321\250f\377\260\210S\377UC,\377\243" + "\201P\377\335\272~\377SE,\377\7\7\6\252\5\5\5\10\0\0\0\0\11\11\10l\24\22" + "\15\252\15\14\12""3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\20\17\15\252\331\260n\377\350\302\205\377\350\306\213" + "\377$!\31\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\17\17\14\252" + "\333\263t\377\350\301\211\377\350\307\207\377\37\32\24\377\0\0\0\0\0\0\0" + "\0\13\13\12\34""80!\343bL-\377hP-\377\303\232`\377\343\272r\377\342\275}" + "\377\317\255r\377\336\274{\377\347\276\204\377\331\274|\377\211mF\377cV6" + "\377N@+\377\25\24\20U\0\0\0\0\0\0\0\0\14\14\13\34""60#\343VH/\377J?+\377" + "\253\211T\377\345\277\202\377\346\277{\377\346\272{\377\312\244i\377aP2\377" + "K@,\377H='\377\26\25\21f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\14\13\13-7-\36\343ZG-\377N?)\377H='\377J?+\377H" + "='\377H='\377[J.\377N?)\377\26\24\21f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\14\13\260" + "\204j=\377\344\274}\377\322\254q\377*%\35\377\11\11\10>\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\21\20\16\252\335\272|\377\352\307\217\377\350\311\215\377" + "\350\311\215\377\335\275\206\3774.!\377\6\7\6\343\30\27\21\377\320\2043\377" + "\327\205,\377\324|'\377\30\24\15\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\21\20\14\252\333\261p\377\347\273|\377\344\266m\377(!\27\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" + "\11\11\10J\21\17\14\343C3\34\377\242k+\377\310\216C\377\314\235[\377\261" + "\214V\377J?+\377\23\21\20\306\11\11\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\16\13\37""8.\37\343\300\235g\377\345" + "\302\200\377\341\274|\377\222pC\377\13\12\10\244\0\0\0\0\0\0\0\0\7\7\6\34" + "\"\33\21\377\276k!\377\322y#\377\222_#\377\20\16\13\273\0\0\0\0\0\0\0\0\11" + "\11\10\252\326\244]\377\350\302\177\377\347\303\204\377(\"\31\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" + "\15\15\12\252\325\235T\377\340\246S\377\335\226B\377\27\24\16\366\0\0\0\0" + "\0\0\0\0\14\13\11q\302m!\377\324w%\377\322q#\377\250g!\3778*\27\377\33\27" + "\16\377&\37\23\377\225\\\36\377\317v\40\377\317q\36\377|K\33\377\15\13\10" + "\241\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\14\13\260" + "\202c;\377\345\277~\377\323\256t\377+%\34\377\11\11\10;\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\10\10\7UD:%\377\326\261w\377\347\304\210\377\317\253r\377" + "aP2\3776/#\377B;)\377\262\224_\377\344\275y\377\340\273{\377\222pC\377\14" + "\14\13\252\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11\34\20\17\15\223\35\34\26\335" + "0*\37\377F=)\377B9'\377F=)\377\253\214\\\377\340\252e\377\340\250W\377\340" + "\245Q\377'\40\26\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\16\15\13""9dR3\377\336\272{\377\342\254_\377qR&\377\11\10\10\177\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6f\13" + "\12\6\252\13\12\10\252\14\13\11\252\17\15\12\252\17\15\12\252\17\16\12\252" + "\22\17\13\252\22\17\13\234\14\13\11\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\6\6\5A(\"\31\377\340\267w\377\345\303\210\377\253" + "\214\\\377\25\24\22\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13" + "\12\10f\203\\.\377\325\2218\377\326w+\377\322\200)\377\227^\40\377\27\25" + "\16\377\12\12\11U\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\277j\36\377\323s\36" + "\377\320r\37\377\215W\36\377$\37\23\377yZ*\377\331\250\\\377\315\243f\377" + "\204f;\377\325\254l\377\347\301\200\377#\36\26\377\0\0\0\0\0\0\0\0\13\13" + "\12\244\313\2012\377\327\177*\377\323u\"\377\246a\35\3776(\25\377\35\27\16" + "\377&\37\23\377xN\35\377\316v!\377\326\177+\377\340\233Q\377\27\25\20\377" + "\0\0\0\0\0\0\0\0\13\12\12\252\331\267t\377\352\311\217\377\350\306\213\377" + "\312\246m\377aN2\3774.!\377:2!\377\226`'\377\320y%\377\303p\36\377S5\30\377" + "\11\10\6q\0\0\0\0\0\0\0\0\15\14\10`\275h\34\377\322x!\377\326\204-\377\"" + "\35\23\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\21\20\14\252\331\254f\377\344\264i\377\344\265k\377(!" + "\27\377\0\0\0\0\0\0\0\0\0\0\0\0\21\17\14\252\330\253e\377\350\277\177\377" + "\347\305\204\377\30\26\21\377\0\0\0\0\0\0\0\0\13\13\12\247\321\222H\377\335" + "\227D\377\325~*\377\254j#\3779)\26\377*\40\23\377+!\24\374\22\17\13U\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\327q&\377\334\220?" + "\377\305\221T\377[G,\377K>*\377K@,\377\26\25\21c\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\16\15\13\252\304n!\377\322s\37\377\322s\37\377\26\23\13\343\0\0" + "\0\0\0\0\0\0\20\15\11q\30\25\17\252\21\17\14\252\22\17\15\252\23\21\14\216" + "\11\10\10\34\0\0\0\0\0\0\0\0\16\15\13\252\322\222G\377\334\216;\377\325}" + "(\377\250g!\3776(\25\377\35\27\16\377&\37\23\377wN\36\377\314t\37\377\322" + "w\37\377\322s\37\377\32\24\15\322\0\0\0\0\0\0\0\0\13\13\12\252\331\263x\377" + "\352\312\223\377\350\311\215\377(#\31\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\13\12\10\252\301o\36\377" + "\323s\36\377\322s\37\377$\31\15\252\0\0\0\0\0\0\0\0\16\14\11U\276i\35\377" + "\322k\37\377\320r\37\377\273|*\377\217o8\377\322\253m\377\345\273\200\377" + "\203c6\377\10\10\7\234\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252" + "\302p\37\377\322k\37\377\322s\37\377\26\23\13\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\13\12\10\252\301o\36\377\327}&\377" + "\332\215;\377'!\26\377\5\5\5\34\14\14\13\252\234~S\377\33\30\24\343\5\5\5" + "\27\16\15\13\306\333\261p\377\350\277\177\377\346\277{\377\31\26\20\371\0" + "\0\0\0\0\0\0\0\13\12\10\231\310x)\377\326\177+\377\325~*\377]B\40\377\13" + "\13\12\377\"\37\27\377\316\230Q\377\342\263o\377\347\275\200\377\350\300" + "\207\377\350\311\215\377\31\26\22\377\0\0\0\0\0\0\0\0\13\12\12\252\327\253" + "f\377\344\256i\377\336\236K\377\33\30\20\377\0\0\0\0\0\0\0\0\0\0\0\0\17\17" + "\14\252\333\261p\377\350\301\211\377\350\311\215\377\31\26\22\377\0\0\0\0" + "\0\0\0\0\13\12\12\252\327\254h\377\344\266m\377\335\233F\377\261r.\3777*" + "\30\377#\34\22\377)\37\22\377#\34\21\377\33\26\16\377\21\20\14\273\11\11" + "\10O\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\277j\36\377\323s\36\377\322s\37" + "\377!\31\16\377\0\0\0\0\0\0\0\0\0\0\0\0\25\24\20\252\335\264t\377\350\301" + "\211\377\350\311\215\377\31\26\22\377\0\0\0\0\0\0\0\0\13\13\12\252\324\240" + "U\377\340\234S\377\332\215;\377\257s,\3777*\30\377\37\31\20\377&\36\23\377" + "\177R\36\377\314t\37\377\303p\36\377R7\31\377\13\12\10\226\0\0\0\0\0\0\0" + "\0\0\0\0\0\11\11\10\34\17\16\14\216\34\31\23\335.(\35\377G<&\377B9'\377F" + "=)\377\301\237j\377\343\270l\377\335\231H\377\233b$\377\15\14\12\252\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\17\14\252\333\264p\377\350" + "\305\211\377\350\311\215\377(#\31\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\16\15\13\252\306u%\377\325|&\377\322y#\377\27\23\14\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\323s\36\377\320r\37\377\27" + "\23\14\317\0\0\0\0\0\0\0\0\16\15\13U\265\204D\377\344\271u\377\347\301\200" + "\3776.\37\377\5\5\4\10\0\0\0\0\0\0\0\0\25\24\20\262\327\240X\377\337\223" + "H\377\316\2073\377\27\24\16\252\0\0\0\0\0\0\0\0\14\13\11f\300o\37\377\322" + "l!\377\320r\37\377\26\22\13\377\0\0\0\0\12\12\11qO=&\377\21\20\14\306\0\0" + "\0\0\20\17\15\252\333\263t\377\347\273|\377\340\251[\377!\34\24\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\10U'!\30\377\331\246\\\377\333\214" + "8\377\322y#\377B,\25\377\7\7\6\205\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5J\23\22\14\377\267f\36\377\317i\36\377\322" + "o\37\377I3\30\377\10\10\7t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\6\6\6\34\17\15\14\343\220p=\377\335\264t\377\340\262q\377\230tA\377\22" + "\21\15\335\10\10\7\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14" + "\12\11\252\301o\36\377\322k\37\377\322s\37\377\26\23\13\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\20\17\15\343\244z?\377\341\271" + "r\377\300\231a\377\25\23\20\350\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\323s\36\377\322s\37\377\27\23\14" + "\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\6\6\5""3\13\11\6U\14\12\7f\12\10\5\234\12\10\5\177\10\7\5\270" + "\33\26\14\377\306i\35\377\323z$\377\334\210=\377\31\26\20\377\0\0\0\0\0\0" + "\0\0\12\12\11\252\332\265{\377\352\312\223\377\350\305\215\377\36\33\25\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\277j\36\377\323s\36\377\322o\37\377" + "'\33\16\252\0\0\0\0\0\0\0\0\14\13\13\252\332\264w\377\352\304\217\377\350" + "\311\215\377\35\32\24\377\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6\34\33\26\16\234\31" + "\26\16\377\40\31\17\322\26\22\13\34\0\0\0\0\0\0\0\0\12\11\7\226\303p\36\377" + "\323s\36\377\322s\37\377\23\17\12\374\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\252" + "\277j\36\377\323o\36\377\320r\37\377\31\24\14\314\0\0\0\0\0\0\0\0\14\13\13" + "\252\332\264w\377\352\312\223\377\350\311\215\377\216o?\377\16\14\11\343" + "\12\11\7\177\10\7\5\265#\31\16\377\307p\34\377\321v\36\377\321u\34\377\36" + "\26\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\247\277j\36\377\323s\36" + "\377\322s\37\377\23\17\12\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\25\23\20\252" + "\334\262q\377\350\305\211\377\350\311\215\377\32\27\23\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\13\13\12\252\332\265{\377\352\311\217\377\347\305\204\377\30\26" + "\21\377\0\0\0\0\0\0\0\0\13\12\12\252\332\265{\377\352\311\217\377\347\305" + "\204\377\36\32\25\377\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\247\277j\36\377\323" + "s\36\377\322o\37\377'\33\16\252\0\0\0\0\0\0\0\0\15\14\10U\276i\35\377\325" + "w$\377\326\204-\377\40\32\21\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\21\20\16\252\335\272|\377\352\312\223\377\350\307\207\377\31\26" + "\22\374\0\0\0\0\0\0\0\0\13\12\10\177\300o\37\377\322k\37\377\320r\37\377" + "\241^\34\377A+\24\377\221U\32\377\317u\36\377zK\35\377\17\16\12\252\5\5\4" + "\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\304s#\377\337\222F\377\344" + "\267o\377\31\26\20\374\0\0\0\0\0\0\0\0\16\14\11U\276i\35\377\327}&\377\332" + "\215;\377\36\30\21\303\0\0\0\0\12\12\7\252\301o\36\377\24\21\13\374\0\0\0" + "\0\13\12\10U\274g\33\377\323s\36\377\321j\36\377'\33\16\252\0\0\0\0\0\0\0" + "\0\15\14\10U\276i\35\377\323s\36\377\322s\37\377\23\17\12\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\11\10\6\247\300o\37\377\332\2113\377\343\257d\377\33\30\22\377" + "\0\0\0\0\0\0\0\0\13\12\10\223\304j!\377\322l!\377\322s\37\377\36\27\15\377" + "\4\4\3\16\0\0\0\0\0\0\0\0\17\16\14\303\323\225L\377\345\270r\377\350\307" + "\207\377\34\31\23\377\0\0\0\0\0\0\0\0\13\12\10\247\313\2012\377\327\177*" + "\377\322y#\377\24\21\13\350\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\213\276i\35\377" + "\323o\36\377\321r\36\377\36\26\15\306\0\0\0\0\0\0\0\0\15\14\12\252\331\255" + "h\377\350\301\211\377\350\302\213\377\31\26\22\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\11\10\10\234\300o\37\377\322l!\377\322s\37\377\40\30\15\255\0\0\0\0\0" + "\0\0\0\15\14\10X\276i\35\377\323s\36\377\320r\37\377\23\17\12\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\7\7\6\34\33\26\16\306-$\25\3774+\35\364\16\15\13U\0\0\0" + "\0\0\0\0\0\15\15\14X\261\217Z\377\346\302\203\377\342\254_\377\211[$\377" + "\12\11\7\343\10\10\5\241\12\11\7\247\12\11\7\210\15\12\6U\7\6\6J\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\247\277j\36\377\323s\36" + "\377\322s\37\377\23\17\12\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252" + "\320\215=\377\346\273w\377\350\311\215\377(\"\31\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\16\14\11\252\304m\37\377\322k\37\377\322s\37\377$\31\15\252\0\0\0\0" + "\0\0\0\0\12\11\7U\233[\34\377\320r\37\377\321j\36\377\36\26\15\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\26\25\21\260\336\272{\377\352\307\217\377\342\303\207" + "\377#\35\26\262\0\0\0\0\0\0\0\0\14\13\11i\276i\35\377\323s\36\377\320r\37" + "\377\27\23\14\322\0\0\0\0\0\0\0\0\17\14\10;\7\6\4\3\0\0\0\0\11\11\10\237" + "\314\206;\377\346\266w\377\350\306\213\377'!\30\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\12\12\11\"\17\16\12\3064(\25\377\245`\34\377\306q\35\377\271f" + "\34\377P5\31\377\23\21\14\343\12\11\7L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13" + "\12\10\252\303p\36\377\323s\36\377\322s\37\377\24\20\13\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\12\11\7\252\300o\37\377\327}&\377\340\237S\377)!\30\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\7\7\6l\30\24\15\377\222X\37\377" + "\303\177&\377qM\"\377\17\16\14\322\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\14\14\13\34%\36\22\343\250c\37\377\316r!\3773\"\22\377\6\5\5G\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\335\272|\377\352\312\223\377" + "\350\311\215\377(#\31\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" + "\21\17\12\343\306i\35\377\302m!\377>,\27\377\20\16\13U\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\23\21\14\216\326\253a\377\344\267" + "q\377\343\272l\3772(\31\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\14\13\11\306\326\236U\377\345\267n\377\344\265k\377\25\23\16\371" + "\2\2\1\24\10\10\7\265\322\234O\377\342\251_\377\340\233Q\377!\32\22\377\4" + "\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\3\3\2\34\13\12\10\377\321\212>\377\337\232H\377\335\244R\377" + "\33\27\20\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6O.&\31\377\305\227T\377" + "\336\241Y\377\321\200*\377\215[\40\377\17\15\12\332\5\5\5\13\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\213\277\203<\377\334" + "\250]\377\250{E\377\16\15\13\343\5\5\5U\11\11\10\252iN(\377\242t=\377XB%" + "\377\27\25\20\377\13\13\12\377N:#\377\320\226K\377=.\34\265\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330" + "\252a\377\346\273w\377\344\262q\377\"\34\23\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\17\15\12\252\327\247\\\377\345\263r\377\344\265k\377" + "\40\33\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\6\31\5\5\4\3064*\33\377" + "\334\251a\377\275\216L\377#\37\26\377\206`3\377\341\260j\377\214j5\377\6" + "\6\5\377\6\6\6""3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\5\5\5\34\17\15\12\343\320\210;\377\332\2125\377\325z*\377+\37\22\377\5\5" + "\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\10""99/" + "\36\377\324\243]\377\340\235U\377|Z-\377\12\12\11\223\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330\252a\377\344\265k\377\340\245Q\377" + "\302\210=\377:.\35\377\14\14\13U\0\0\0\0\12\11\7\234\256[\27\377\312g\27" + "\377\312f\25\377\24\20\11\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\17\15\12\252\325\233P\377\343\257d\377\343\253b\377#\35\24\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\7\7\6U1!\22\377" + "\267l\"\377\321\200*\377\321\211<\377\272\206C\377_J'\377\26\24\17\345\10" + "\10\7i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\5\4\4\34\21\17\14\343\330\247Y\377\344\265k\377\337" + "\260f\377\"\34\23\270\0\0\0\0\0\0\0\0\14\13\11l\264j!\377\326}'\377\331\215" + "4\377*!\25\377\4\4\4U\0\0\0\0\0\0\0\0\13\12\10\306\323\225L\377\340\240M" + "\377\334\220?\377\"\33\21\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\14\12\7\252\275c\32\377\316f\31\377" + "\313d\30\377\36\25\13\260\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\312g\27\377" + "\312f\25\377\33\24\12\377\4\4\3D\0\0\0\0\4\4\4\34\14\12\7\327\260[\27\377" + "\313h\30\377\312i\33\377\34\25\15\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\11\10\10""99/\36\377\325\247^\377\344\270s\377~\\/\377\11\11" + "\10\223\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\247\307\203:\377" + "\334\224?\377\333\223>\3771&\30\377\6\6\6U\0\0\0\0\5\5\5\34\17\16\14\343" + "\331\251^\377\344\267o\377\341\256f\377\37\31\22\361\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\5\34\17\15\12\343" + "\314\177-\377\333\2058\377\335\226B\377#\34\22\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\12\11\11U-\"\25\377\311n\36\377" + "\300d\31\3779#\20\377\14\12\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\15\13\6O~D\25\377\277d\32\377\306u%\377\320\213A\377\325\233P\377" + "\326\241U\377\327\247\\\377\330\247Y\377\327\240X\3771&\30\252\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6L-$\30\371\317\244Z\377\344\267" + "o\377\217o8\377\15\14\12\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\15\14\10\216\266c\31\377\313l\30\377\312f\25\377pA\27\377\17" + "\15\10\343\6\6\5-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\252\253Y\26\377" + "\312_\27\377\312g\27\377g@\32\377\24\22\15\377O=$\377\336\255a\377\343\263" + "h\377\340\254a\377\342\253c\377\340\260]\377$\35\23\317\0\0\0\0\0\0\0\0\14" + "\12\7q\260[\27\377\312_\27\377\312f\25\377\33\24\12\377\4\4\3J\0\0\0\0\4" + "\4\4\34\13\11\6\327\273e\30\377\330\206-\377\342\254_\377\27\25\20\361\0" + "\0\0\0\0\0\0\0\12\12\11\241\324\240U\377\342\254_\377\336\236K\3773'\30\377" + "\6\6\6U\0\0\0\0\4\4\3\34\13\12\6\327\260[\27\377\312f\25\377\277f\26\377" + "\26\21\11\252\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\314i\31\377\331\2052\377" + "#\34\22\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\17\15\12\252\307t\"\377\324r#\377\332\2137\377!\33\22" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\325\240T\377\343\257d\377\340\245" + "Q\377\31\25\16\353\0\0\0\0\0\0\0\0\15\13\10l\270`\31\377\313`\30\377\312" + "_\27\377\33\24\12\377\4\4\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\12\11\7\252\273e\30\377\330\206-\377\340\247U\3776*\33\377\6" + "\6\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252" + "\253Y\26\377\312g\27\377\312f\25\377\35\25\12\252\0\0\0\0\13\11\6*\211M\30" + "\377\323\2108\377\327\247\\\377\330\246_\377\325\243T\377!\34\22\241\0\0" + "\0\0\0\0\0\0\13\12\10\202\270d\31\377\313d\30\377\312f\25\377\33\24\12\377" + "\4\4\3J\0\0\0\0\4\4\4\34\13\11\6\327\260[\27\377\312g\27\377\312_\27\377" + "\34\25\13\276\0\0\0\0\0\0\0\0\12\12\11\241\324\241Y\377\344\256i\377\337" + "\241P\377!\34\22\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\12\11\7\247\253Y\26\377\312g\27\377\312f\25" + "\377\35\25\12\252\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\312g\27\377\313l\30" + "\377D/\31\377\6\6\5\377\37\32\24\377\334\250]\377\334\261e\377nP)\377\14" + "\13\11\226\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\253Y\26\377\312g\27" + "\377\312f\25\377\24\20\11\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\12\11\7\252\301o\36\377\333\2106\377\340\245Q\377\33" + "\30\20\377\0\0\0\0\7\7\7\34\25\24\20\265\12\12\11U\0\0\0\0\14\13\11\252\314" + "\2023\377\332\2153\377\323z$\377\40\27\15\273\0\0\0\0\0\0\0\0\15\13\10U\247" + "W\26\377\313d\30\377\320i\35\377\27\23\14\377\4\4\3\34\13\12\10\265\323\236" + "R\377\345\267n\377\344\267o\377\344\267q\377\344\265k\377\33\27\20\345\0" + "\0\0\0\0\0\0\0\12\12\11\226\300o\37\377\320p\33\377\313l\30\377\25\21\12" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330\252a\377\345\267n\377\344\265" + "k\377\31\25\20\353\0\0\0\0\0\0\0\0\13\12\10\216\302t!\377\321j\36\377\313" + "l\30\377\33\24\12\377\4\4\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\252\253Y\26\377\312g\27\377\312f\25" + "\377*\34\15\377\6\5\5""0\0\0\0\0\6\6\6\34\25\23\16\377\335\257f\377\345\263" + "r\377\344\265k\377\30\24\17\366\0\0\0\0\0\0\0\0\14\13\11\177\276h\33\377" + "\316j\31\377\312g\27\377\33\24\12\377\4\4\3J\0\0\0\0\4\4\4\34\13\12\6\327" + "\260[\27\377\314i\31\377\317z&\377\34\26\17\356\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\5\34\17\15\12\343\303" + "o\34\377\314i\31\377\305d\26\377\26\21\11\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330\252a\377\345\270r\377\344\265k\377" + "\"\34\23\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\12\11\7\252" + "\256[\27\377\312g\27\377\312f\25\377\24\20\11\374\0\0\0\0\0\0\0\0\0\0\0\0" + "\12\11\7\252\253Y\26\377\312k\27\377\316o\33\377\26\21\13\374\0\0\0\0\0\0" + "\0\0\10\7\7-I;$\377\332\256i\377\344\262k\377YC$\377\7\7\6q\0\0\0\0\5\5\4" + "\34\24\22\15\377\307n\36\377\312i\33\377X6\27\377\12\11\7q\0\0\0\0\0\0\0" + "\0\15\13\6U\247W\26\377\312_\27\377\312Z\27\377\40\30\15\377\4\4\3\262\23" + "\20\14\356\324\243]\377B4\37\377\5\5\5\270\16\15\13\377\315\2050\377\324" + "r#\377\320u\35\377\35\26\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11" + "UeJ&\377\275y1\377\271h\40\377\264b\31\377\264]\27\377\232R\27\377K,\22\377" + "\13\11\6\220\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\12\11\7\252\235O\26\377\312f\25\377\312f\25\377\26\21\11\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\16\15\13\340\210b5\377\331" + "\245R\377\325\2218\377\226\\#\377\23\20\14\255\5\5\5\10\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\252\253Y\26\377\312g\27\377" + "\312f\25\377\24\20\11\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\7\7\6;+#\30\377\335\257f\377\337\262j\377\206b3\377\16\15\13\216" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\247\253Y\26\377" + "\312g\27\377\312f\25\377\24\20\11\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\14\12\7\252.\35\15\377\214J\25\377\245" + "V\26\377\247W\26\377\245V\26\377\247W\26\377\271_\26\377\306a\27\377\316" + "o\33\377\335\222B\377\27\23\16\371\0\0\0\0\0\0\0\0\12\12\11\231\324\241Y" + "\377\345\267n\377\340\245Q\377\34\27\17\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10" + "\7\234\253Y\26\377\312g\27\377\312f\25\377\37\25\12\252\0\0\0\0\0\0\0\0\12" + "\12\11\247\324\240U\377\344\261i\377\336\236K\377\33\27\20\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\12" + "\10\7\252\247W\26\377\312g\27\377\312f\25\377\24\20\11\356\0\0\0\0\0\0\0" + "\0\0\0\0\0\12\10\7\244\253Y\26\377\312g\27\377\313d\30\377\26\22\13\353\0" + "\0\0\0\0\0\0\0\12\12\11\247\326\244]\377\344\266m\377\337\232P\377\317x$" + "\377\275^\30\377\247W\26\377\247W\26\377\273`\26\377\306]\27\377\312]\25" + "\377\306`\25\377\32\23\11\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\247" + "\253Y\26\377\312g\27\377\312f\25\377\24\17\11\374\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\21\17\14\252\330\252a\377\345\267n\377\340\244U\377\35\30\20\377" + "\3\3\2\34\0\0\0\0\0\0\0\0\14\13\11\306\323\225L\377\335\227D\377\333\222" + "<\377\26\23\15\366\0\0\0\0\0\0\0\0\12\12\11\241\322\233M\377\337\223H\377" + "\325z*\377\27\22\14\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\247\253Y\26\377\312" + "g\27\377\312f\25\377\35\25\12\252\0\0\0\0\0\0\0\0\14\12\7U\246W\27\377\321" + "v\36\377\332\2137\377!\33\22\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\17\15\12\252\327\237\\\377\342\251_\377\332\215;\377\"\32\17\276" + "\0\0\0\0\0\0\0\0\15\12\6U\247W\26\377\312g\27\377\306`\25\377\305`\26\377" + "\275a\26\377\306`\25\377\306`\25\377\31\23\12\377\4\4\3\34\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\262\\\27\377\322k\37\377\327\200," + "\377!\30\16\301\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\312_\27\377\312g\27" + "\377\40\26\13\252\0\0\0\0\12\10\7\252\253Y\26\377\30\21\11\371\0\0\0\0\14" + "\12\7U\243R\26\377\312g\27\377\312f\25\377\35\25\12\252\0\0\0\0\0\0\0\0\14" + "\12\7U\246W\27\377\312g\27\377\312f\25\377\24\17\11\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\12\10\7\247\252Y\27\377\316j\31\377\320s!\377\34\25\15\317\0\0\0\0" + "\0\0\0\0\15\12\6U\247W\26\377\312_\27\377\312f\25\377\24\20\11\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\17\15\12\252\326\236U\377\345\267n\377\344\271o\377\30" + "\24\17\371\0\0\0\0\0\0\0\0\14\13\11l\260[\27\377\312_\27\377\312f\25\377" + "\22\17\11\377\2\2\1\10\0\0\0\0\0\0\0\0\10\7\5\270\253Y\26\377\312_\27\377" + "\312f\25\377\"\27\13\255\0\0\0\0\0\0\0\0\14\13\11\210\324\240U\377\344\264" + "i\377\341\245X\377\37\31\22\377\3\3\2\34\0\0\0\0\0\0\0\0\10\7\5\262\253Y" + "\26\377\312g\27\377\312f\25\377\36\25\13\252\0\0\0\0\0\0\0\0\14\12\7U\247" + "W\26\377\312g\27\377\312f\25\377\24\17\11\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\7\7\6\34\36\33\25\356" + "\247o2\377\316n!\377\307f\30\377\257Z\26\377\245V\26\377\247W\26\377\247" + "W\26\377\241W\26\377T0\23\377\22\17\11\343\10\7\5\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\12\10\7\247\253Y\26\377\312g\27\377\312f\25\377\24\17\11\374" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\237L\377\345\264n\377\344" + "\266m\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\253Y\26\377\312" + "g\27\377\312f\25\377\37\26\12\252\0\0\0\0\0\0\0\0\7\6\6\34""0\37\17\377\275" + "]\26\377\312f\25\377-\35\16\377\5\5\4q\0\0\0\0\5\5\4\34\26\24\17\377\334" + "\251a\377\342\262g\377\247v6\377\17\15\12\205\0\0\0\0\0\0\0\0\15\13\6U\247" + "W\26\377\312g\27\377\312f\25\377\23\17\10\327\0\0\0\0\13\11\6iyA\24\377\32" + "\22\11\276\0\0\0\0\11\11\10\247\320\226K\377\345\267n\377\344\265q\377%\35" + "\24\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\10\10\5\332\247W" + "\26\377\312]\25\377\306h\25\377\27\22\12\377\3\3\2""3\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\12\11\7\231\253Y\26\377\312_\27\377\312f\25\377\24\17" + "\11\377\2\2\1\21\0\0\0\0\0\0\0\0\10\7\5\265\270d\31\377\327w*\377\340\240" + "U\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6U\37\26" + "\14\377\246W\27\377\275a\26\377c<\26\377\17\15\10\252\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\3\3\27\15\13\10\343\266^\27\377\225" + "W\32\377\23\21\14\343\7\7\7\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252" + "\330\252a\377\345\263r\377\344\266m\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\11\10\6\202E*\22\377\303_\26\377#\30\14\377\5\5\4L\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\34\33" + "\30\20\270\40\33\23\377'\35\24\324\15\14\12U\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\15\13\10\252Q6\34\377\330\224C\377\337\241H\377\334" + "\223=\377uL\40\377\15\13\10\377,!\23\377\317{(\377\331\2102\377\332\2165" + "\377\234d'\377\22\17\13\343\12\10\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\15\10}" + "\23\16\12\252\16\13\7\252\12\10\7\252\13\11\6z\15\12\10U\10\7\5\231.!\25" + "\377\324\2123\377\335\227D\377\277\204>\377\23\21\14\260\0\0\0\0\0\0\0\0" + "\0\0\0\0\7\7\6L\32\26\17\361\275\201:\377\333\230H\377\331\232H\377\205W" + "&\377\17\15\12\335\6\6\5\34\0\0\0\0\0\0\0\0\17\14\10q\24\20\13\252\21\16" + "\12\216\7\6\6\34\0\0\0\0\0\0\0\0\23\20\14\252\310u#\377\324{%\377sJ\36\377" + "\11\10\6q\0\0\0\0\0\0\0\0\14\13\11\262hI%\377\316\223?\377\262y5\377:.\35" + "\377.$\31\377(\40\25\374\23\21\14U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\244\277\203<\377\337\241P\377" + "\335\227D\377.\"\25\377\4\4\3\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\23" + "\20\14\255\320\2067\377\337\234F\377\330\240Q\377\25\23\16\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\6\5\5\31\21\16\12\343C0\34\377^C#\377\24\21\15\343" + "\6\6\5q\14\13\11\306C3\36\377U>\40\377\31\24\16\377\11\10\6R\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\252\241W\26" + "\377\303Z\24\377\273[\24\377\23\16\10\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\17\14\10w\24\20\13\252\21\16\12\234\12\10\7\34\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10z\22\17\13" + "\252\21\16\12\220\12\10\7\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252" + "\235`$\377\323{&\377\307t\"\377\37\30\20\377\6\6\6\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\15\13\252\305n\40\377\321n\36\377\312g\27\377:$\17" + "\377\10\7\5q\0\0\0\0\0\0\0\0\12\10\5U\211D\22\377\271V\24\377\256X\23\377" + "\22\15\7\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\14\12\11\252" + "\314\2011\377\334\220?\377\331\2052\377\32\24\15\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\7\6\6L\27\23\14\364\271q$\377\317\201" + "4\377\255u2\377;.\34\377\22\17\15\306\11\11\10q\6\6\6\13\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10\205\26\21\13\252\21\16\12\216\10" + "\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\312\2001\377\334\224?\377\333" + "\2148\377\26\23\15\377\0\0\0\0\0\0\0\0\14\12\11\252\310}%\377\332\2153\377" + "\334\223=\377\212V#\377\15\12\10\343\13\11\6\252\15\13\10\306=)\26\377\312" + "o\37\377\314i\31\377\310i\25\377\26\21\11\335\0\0\0\0\0\0\0\0\0\0\0\0\13" + "\11\6l\16\13\7\252\13\11\6\213\6\5\3\21\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6\205" + "\220K\23\377\271V\24\377\262V\23\377\33\22\10\252\0\0\0\0\0\0\0\0\13\11\6" + "U\206F\23\377\265X\24\377\264W\23\377\30\17\7\262\0\0\0\0\0\0\0\0\0\0\0\0" + "\12\10\5c\245V\26\377\316o\33\377\325|&\377$\33\21\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\12\12\11\205\247p0\377\336\246M\377\337\235" + "H\3776'\27\377\5\5\4%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252" + "\265]\26\377\316o\33\377\326\177+\377\24\20\13\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\11\10\10\252\313\2012\377\336\221?\377\334\223=\377!\32\20\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\14\12\7q\17\14\10\252\15\12\10z\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\12\10\7\252\310x)\377\334\216;\377\333\222<\377\33\25\16\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\15\13\10q\22\17\13\252\21\16\12\216\10\7\5\34\0\0\0" + "\0\0\0\0\0\0\0\0\0\16\14\11q\24\17\13\252\21\16\12\231\12\10\7\34\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6U\35\25\12\377w>\24\377\231O\24\377(\31\13" + "\377\11\10\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\34\40\30\15" + "\332D/\31\377=+\30\377=.\34\377=/\34\377=/\34\377B2\35\377I7\40\377B0\35" + "\377\30\24\17U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6O\40\32\21\364" + "\307\2046\377\320\226K\377zW)\377\21\17\12\252\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\34\40\27\13\3435!\16\377\"" + "\27\13\377\14\12\7\276\6\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11" + "\7\4\252\222L\23\377\305c\24\377\314n\33\377;)\26\377\6\6\6\252\12\11\11" + "q\37\32\22\270\36\31\21\377\35\31\22\377\"\33\23\377%\34\22\335\15\13\10" + """9\0\0\0\0\0\0\0\0\15\12\6X\220K\23\377\271V\24\377\262Z\23\377\24\16\7" + "\324\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4}\235Q\24\377\324u!\377\334\224?\377\33" + "\25\16\332\0\0\0\0\0\0\0\0\14\12\11\177\300o\37\377\320p\33\377\312g\27\377" + "\26\20\11\314\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5]\211D\22\377\271^\24\377\264" + "[\23\377\36\24\11\252\0\0\0\0\0\0\0\0\13\11\6U\214C\23\377\312j\25\377\326" + "}'\377\31\24\16\377\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\34\15\13\10\213\24\20\13" + "\252\23\17\12\216\10\7\5\34\0\0\0\0\0\0\0\0\12\11\5\216\231O\24\377\303Z" + "\24\377\316o\33\377\30\24\15\377\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252\303" + "q\40\377\323s\36\377\313l\30\377\37\25\12\255\0\0\0\0\0\0\0\0\13\11\6U\214" + "F\23\377\271V\24\377\264W\23\377\30\17\7\265\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\256[\27\377\327{*\377\335" + "\226B\377\31\24\16\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\11\7\4\252\224M\23\377\265\\\24\377\264W\23\377\31\21\10\252" + "\0\0\0\0\0\0\0\0\"\30\15\252\241f&\377\333\232F\377\334\216;\377\325|&\377" + "\40\30\15\306\0\0\0\0\0\0\0\0\13\11\6U\214F\23\377\271V\24\377\262Z\23\377" + "\24\16\7\324\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\177\220N\23\377\271V\24\377\264" + "W\23\377\35\23\12\252\0\0\0\0\0\0\0\0\15\13\10t\302t!\377\321n\36\377\312" + "_\27\377\26\21\11\335\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5U\14\11\5\252\12\10" + "\5\202\6\5\3\10\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5n\220N\23\377\271V\24\377" + "\262V\23\377\33\22\10\252\0\0\0\0\0\0\0\0\13\10\6U\211D\22\377\271V\24\377" + "\310i\25\377\35\25\14\377\4\4\4\31\12\11\7\213\232d/\377\327\224F\377\306" + "\203-\377.\"\23\377\13\11\6X\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5w\220N\23\377" + "\271V\24\377\264W\23\377\25\17\10\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\307w'\377\334\220?\377\335\233" + "F\377\33\25\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\253" + "Y\26\377\303b\24\377\267Y\23\377\35\24\10\252\0\0\0\0\0\0\0\0\13\11\6U\213" + "F\24\377\312g\27\377\323v$\377\34\25\15\311\0\0\0\0\10\10\7""9vT'\377\327" + "\237V\377\333\225B\377\330\201-\377\323y\"\377\"\31\15\262\0\0\0\0\0\0\0" + "\0\13\12\6X\222L\23\377\271^\24\377\262Z\23\377\30\22\11\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\22\17\13\252\313z*\377\327~(\377\321j\36\377\40\26\15\270\0" + "\0\0\0\0\0\0\0\14\12\7U\217H\24\377\271^\24\377\262Z\23\377\24\16\7\322\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\11\7\4\252\224M\23\377\264W\23\377\262V\23\377\36\25\11\377\5\5\4" + "%\10\7\5\34\24\21\15\343\205Y&\377\327\2168\377\330\201-\377\321s\40\377" + "\32\23\13\322\0\0\0\0\0\0\0\0\13\11\6U\216J\23\377\271V\24\377\262Z\23\377" + "\24\16\7\322\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4z\217K\24\377\313l\30\377\330" + "\201-\377\36\27\17\377\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7n\20\15\11\252\15\12" + "\10z\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6i\216J\23\377\271V\24\377\264" + "W\23\377\27\20\10\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\17" + "\15\12\252\313z*\377\327~(\377\321v\36\377\30\21\13\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\11\10\4\252\224M\23\377\265\\\24\377\264W" + "\23\377\27\20\10\306\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6\213\237R\24\377\313d" + "\30\377\324y!\377\34\25\15\377\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11wQ;\"\377" + "\330\231G\377\255u2\377\25\22\16\377\12\12\11\364\13\12\10\377<#\17\377\255" + "U\24\377T1\21\377\15\12\6\252\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\202\222O\23" + "\377\301Y\24\377\313h\30\377xM\37\377\23\21\14\377uP$\377\333\232F\377\262" + "y5\377\24\21\15\377-!\22\377\270^\25\377\303Z\24\377\315j\32\377\36\26\15" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6R#\34\22\377\304r!\377\224P\31\377\40\26" + "\13\377\24\17\11\377\32\22\11\377X1\21\377\225N\24\377(\32\13\377\11\7\4" + "U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\177\214" + "F\23\377\265X\24\377\264W\23\377\22\15\7\353\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\12\11\7]hE#\377\311\2030\377\302m!\377A*\24\377\14\12" + "\7\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\11\7\4\252\222O\23\377\265X\24\377\264W\23\377\27\20\10\306\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\306\274" + "\205=\377\333\225B\377\302s%\377\21\17\12\364\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\12\10\5q\220N\23\377\271V\24\377\264W\23\377\22\15\7" + "\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\7\6" + "\4A5\37\14\377\242S\23\377\271^\24\377\202F\25\377\37\26\12\377\31\23\12" + "\306\26\21\11\366F(\17\377\251W\24\377\310i\25\377\324{%\377\34\25\15\335" + "\0\0\0\0\0\0\0\0\14\12\11\205\310\177)\377\322x!\377\312_\27\377\23\16\10" + "\356\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5n\220N\23\377\271V\24\377\262V\23\377" + "\34\23\11\252\0\0\0\0\0\0\0\0\14\12\11\205\302p\37\377\321n\36\377\312f\25" + "\377\25\17\10\353\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4""9\14\12\5X\12\10" + "\5U\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5}\222O\23\377\265X\24\377\264W\23\377" + "\31\21\10\303\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5w\220N\23\377\271^\24\377\310" + "i\25\377\27\22\12\335\0\0\0\0\0\0\0\0\13\11\10\231\310{)\377\324u!\377\312" + "g\27\377o?\24\377\33\24\12\377\24\20\11\366\26\21\11\371\34\24\11\306\36" + "\25\11\252\30\21\11\327\34\24\11\311\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\11\7\4\252\222O\23\377\265X\24\377\264W\23\377\22\15\7\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\13\12\10q\230h/\377\326\2061\377\314i\31\377b6\23" + "\377\22\15\11\343\15\12\10\252\16\14\11\306<)\25\377\307p\34\377\312f\25" + "\377\312g\27\377\32\23\13\314\0\0\0\0\0\0\0\0\14\13\11t\273e\30\377\312]" + "\25\377\273[\24\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\252\222O\23" + "\377\265X\24\377\262Z\23\377\33\21\10\252\0\0\0\0\0\0\0\0\13\11\6U\213F\24" + "\377\312g\27\377\324{%\377\40\30\17\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\15\14\12\252\304r!\377\316j\31\377\304c\25\377\34\23\11\252" + "\0\0\0\0\0\0\0\0\13\10\6U\211D\22\377\265X\24\377\262V\23\377\244U\25\377" + "\212I\25\377\257]\24\377\262V\23\377.\34\13\377\6\5\3l\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\11\7\4\252\222L\23\377\275X\24\377\275X\24\377\34" + "\23\11\252\0\0\0\0\0\0\0\0\13\11\6U\211D\22\377\271V\24\377\262Z\23\377\33" + "\21\10\252\0\0\0\0\11\7\4\247\222O\23\377\24\16\7\374\0\0\0\0\13\11\6U\211" + "D\22\377\271^\24\377\262Z\23\377\33\21\10\252\0\0\0\0\0\0\0\0\13\11\6U\211" + "D\22\377\271V\24\377\264W\23\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\11\7" + "\4\252\222O\23\377\271^\24\377\267U\23\377\33\23\10\252\0\0\0\0\0\0\0\0\13" + "\11\6U\214I\23\377\265X\24\377\262Z\23\377\24\17\7\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\20\16\13\252\320\217;\377\337\234F\377\330\2071\377\34\26\15\322\0" + "\0\0\0\0\0\0\0\13\11\6U\214F\23\377\271^\24\377\262Z\23\377H'\15\377\12\10" + "\5\332\10\6\3\252\11\7\4\301'\30\12\377\240R\23\377\271^\24\377\220J\27\377" + "\20\15\11\252\0\0\0\0\0\0\0\0\12\11\7U\221e0\377\332\225C\377\322s\37\377" + "c9\23\377\12\10\5\343\10\6\3\252\11\7\4\276\36\24\11\377\236Q\23\377\271" + "^\24\377\262Z\23\377\33\21\10\252\0\0\0\0\0\0\0\0\13\10\6U\211D\22\377\271" + "V\24\377\264W\23\377\22\15\7\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\11\11\10\34\15\14\10\216" + "\33\24\12\252\35\25\12\301\30\21\11\374\26\21\11\350\26\21\11\377W1\22\377" + "\265X\24\377\262Z\23\377d6\21\377\13\12\6\226\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\11\7\4\252\222O\23\377\265X\24\377\264W\23\377\22\15\7\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\320\2157\377\337\234F\377\331\2052\377" + "\27\23\14\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5z\220N\23\377\271V\24\377\264" + "W\23\377\36\24\11\260\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7U'\32\14\377\233P\24" + "\377c7\23\377\23\20\14\377\14\13\11\377\22\17\13\377wT&\377\321\211<\377" + "\212V#\377\22\17\13\262\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\202\220N\23\377\265" + "\\\24\377\262Z\23\377'\30\12\377\6\5\3\322\35\24\10\377\251W\24\377a5\22" + "\377\10\7\5\377\32\25\17\377\324\216;\377\335\227D\377\332\2165\377\"\31" + "\17\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4R\20\14\7\377\240R\23" + "\377\271V\24\377\271V\24\3774\35\13\377\7\6\4\252\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\7\5US.\20\377\265\\\24\377\262V\23\377W/\16\377\12\10" + "\5\340\10\6\3\252\11\7\4\276\35\24\10\377\303h\30\377\331\2102\377\335\233" + "F\377\36\27\17\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5U\32\22\11\377k" + ";\24\377\227P\26\377<\"\17\377\13\11\6\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\252\237R\24\377\312v#\377" + "B3\35\377\11\11\10`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\320\214" + ";\377\337\234F\377\327\205,\377\33\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\16\14\7\364\203C\24\377\260Y\23\377\21\14\6\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\21\16" + "\12U\253_\34\377\316{!\377\320{\37\377\317p\34\377\312k\27\377\277b\26\377" + "\252[\25\377\303k\26\377\321{\36\377\324\204%\377\326\206'\377\323\205(\377" + "\312y#\377\35\25\14\244\0\0\0\0\0\0\0\0\14\12\7R\250b\35\377\312y#\377\304" + "x\37\377\302s\37\377\276s\33\377\271e\32\377\270d\31\377\307k\32\377\320" + "{\37\377\250i%\377\31\25\16\343\11\10\10\34\0\0\0\0\0\0\0\0\10\10\7\34'\36" + "\22\371\267z*\377\323\205(\377\322\205+\377\241j)\377\17\15\12\335\5\4\4" + "\21\0\0\0\0\0\0\0\0\16\13\7q\224S\31\377\301l\30\377\264]\27\377\33\22\12" + "\231\0\0\0\0\0\0\0\0\14\11\7z\220N\23\377\264[\23\377S.\20\377\7\6\4\270" + "\0\0\0\0\0\0\0\0\4\4\3U\34\25\15\377\312y#\377\321\204*\377\203W$\377\12" + "\11\7\377\5\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7DV>\37\377\316\203+\377\326\202'\377L2" + "\31\377\7\6\6q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\25\21\14\377\312" + "y#\377\322\207%\377\235d&\377\22\17\13\226\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\22\17\11[\241X\30\377i@\34\377\13\12\10\252\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\7\7U(\34\21\377\256[\27\377*\33\15\255\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5t\205B\20\377\241U\21\377\241N\21\377" + "\31\20\10\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10w\252" + "c\35\377\313~$\377\307\177\"\377\33\24\14\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\15\13\10z\252c\35\377\314\177%\377\307w\"\377\33\24" + "\14\306\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\13\22\15\11\377\232O\23\377\256X\23" + "\377\\3\21\377\14\12\7\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\13\11\6\223\216J\23\377\253Z\22\377\237Q\22\377\21\14\6\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\10\7\5\216\205B\20\377\241U\21\377\241U\21\377\25\16\6\327" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\306\276k\31\377" + "\313h\30\377\304c\25\377\25\17\10\377\2\2\1\16\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\11\10\6%#\34\22\377\267p$\377\324\204%\377\262v)\377\33\27" + "\20\377\5\5\4\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\17\14\10i\216O\27\377\275a\26\377\240S\25\377\22\15\7\332\0\0\0" + "\0\0\0\0\0\0\0\0\0\12\10\7\306\304r!\377\326\201%\377\324\204%\377\33\25" + "\14\322\0\0\0\0\0\0\0\0\15\13\10t\300r\37\377\322}!\377\321{\36\377\313q" + "\32\377\261[\26\377\237R\24\377\240S\25\377\245U\24\377\250Y\23\377\243V" + "\22\377\241N\21\377\27\17\6\252\0\0\0\0\0\0\0\0\11\7\4""9c0\16\377\216I\21" + "\377\205B\20\377\23\15\6\276\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\244\207B\20\377" + "\241U\21\377\241U\21\377\31\20\6\252\0\0\0\0\0\0\0\0\12\10\5U\203A\20\377" + "\241U\21\377\241U\21\377\23\15\6\343\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\260" + "\276k\31\377\324\177#\377\326\206'\377\36\25\15\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\14\12\7\252\302m!\377\325\204$\377\320z\35\377" + "\34\24\13\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\11\7\4\223" + "\210F\21\377\312b\25\377\323~\"\377\33\24\14\377\3\3\2\34\0\0\0\0\0\0\0\0" + "\12\10\7\303\264]\27\377\312f\25\377\312f\25\377\31\21\12\335\0\0\0\0\0\0" + "\0\0\15\13\10A\201F\26\377\254X\25\377\220N\23\377\26\17\7\260\0\0\0\0\0" + "\0\0\0\0\0\0\0\12\10\7\306\306|%\377\327\210*\377\326\206'\377\33\25\14\324" + "\0\0\0\0\0\0\0\0\14\12\7O\227X\32\377\306t\35\377\300m\33\377\31\22\12\247" + "\0\0\0\0\0\0\0\0\14\11\7Rw>\24\377\256Y\25\377\232O\23\377\26\17\7\265\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4D\24\16\7\371\216I\21\377\217" + "J\22\377-\32\12\377\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6U'\36\22\377\304y)\377\325\207" + "*\377sH\36\377\12\11\7\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\21\6\5\5U\5\5\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\11\7\4\216\222O\23\377\314l\27\377" + "\324~!\377\36\26\15\377\3\3\3(\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5}\205B\20\377\241U\21\377\241U\21\377" + "\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177\210F\21\377\301a\24\377" + "\313l\30\377\36\25\13\301\0\0\0\0\0\0\0\0\15\12\6U\206F\23\377\253Z\22\377" + "\237Q\22\377\21\14\6\356\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\220\207B\20\377\241" + "U\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\7\5U\205B\20\377\271" + "^\24\377\321{\36\377\27\22\14\377\3\3\2\34\0\0\0\0\5\5\4\34\22\17\13\343" + "\206H\25\377\236Q\23\377\217J\22\377\26\17\7\216\0\0\0\0\0\0\0\0\12\10\5" + "U\203A\20\377\243O\22\377\262Z\23\377\26\20\11\377\3\2\2\24\0\0\0\0\0\0\0" + "\0\11\7\6\260\220N\23\377\257X\22\377\243O\22\377\32\20\7\252\0\0\0\0\0\0" + "\0\0\12\10\5U\201@\20\377\241U\21\377\241N\21\377\23\15\6\345\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\234\220N\23\377" + "\312f\25\377\316o\33\377\33\24\14\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\12\10\5\205\207B\20\377\241U\21\377\241U\21" + "\377\23\15\6\343\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\377\254U\25\377\275\\\24" + "\377\254W\23\377\30\20\7\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21" + "\377\241U\21\377\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177\207B\20" + "\377\241U\21\377\241U\21\377\32\20\7\252\0\0\0\0\0\0\0\0\13\11\6U\206F\23" + "\377\253Z\22\377\237N\22\377\27\17\6\252\0\0\0\0\0\0\0\0\11\7\4""9b1\15\377" + "\213G\20\377\205B\20\377\23\15\6\301\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\260\205" + "B\20\377\241U\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201" + "@\20\377\245W\22\377\264[\23\377\24\17\11\377\0\0\0\0\5\5\4\21\32\25\17\343" + "~K\31\377\262_\25\377\216J\23\377.\34\13\377\12\10\5""9\0\0\0\0\0\0\0\0\12" + "\10\5U\203A\20\377\241U\21\377\241U\21\377\21\14\6\374\2\1\1\10\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\307w\"\377\327" + "\210*\377\326\213)\377\34\24\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\10\7\5\252\207B\20\377\241U\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0" + "\0\0\12\10\5U\203C\20\377\312f\25\377\323\177$\377\26\21\13\371\0\0\0\0\0" + "\0\0\0\20\16\13\311eC\34\377\277b\26\377\271^\24\377\254W\23\377\32\21\7" + "\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241U\21\377\37\24\10" + "\377\5\5\4f\0\0\0\0\5\4\4\34\20\15\11\377\244U\25\377\264[\23\377\245W\22" + "\377\32\21\7\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241U\21" + "\377\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\205\207B\20\377\241U\21\377\241U\21\377" + "\32\21\7\377\3\3\2\210\11\7\4\343\203C\24\377\305h\26\377\306h\25\377\267" + "]\23\377\254W\23\377\32\21\7\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241" + "U\21\377\241U\21\377\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177\207" + "B\20\377\301a\24\377\321{\36\377\23\17\12\374\0\0\0\0\0\0\0\0\15\13\10A}" + "D\26\377\256V\25\377\222L\23\377\26\16\7\262\0\0\0\0\0\0\0\0\0\0\0\0\10\6" + "\5\220\207B\20\377\241U\21\377\241U\21\377\23\16\6\356\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\243W\24\377\264[\23\377\245W" + "\22\377\21\14\6\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\11\7" + "\4\213\207B\20\377\241U\21\377\241U\21\377\17\13\6\366\0\0\0\0\0\0\0\0\0" + "\0\0\0\11\7\6\270\264]\27\377\323s\36\377\325\205&\377\34\24\15\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\230[\37\377\274i\37\377sB\26\377" + "[2\20\377T.\17\377t;\21\377v>\21\377\17\13\6\335\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\12\10\5t\222O\23\377\312g\27\377\321\200\40\377\310\177)\377\247" + "j(\377\305z*\377\322\202#\377\272j\33\377X3\23\377f7\21\377\235S\22\377\275" + "\\\24\377\321{\36\377\35\25\14\340\0\0\0\0\0\0\0\0\7\6\6\34)\37\22\353\240" + "T\27\377\252W\23\377-\32\12\377\5\5\4\252\4\4\4\10\4\4\3c\17\14\6\377\214" + "H\21\377\212G\21\377-\32\12\377\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\7\5\216\205B\20\377\241U\21\377\241U\21\377\23\15\6\345" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\240V\25\377" + "\271Z\24\377[2\20\377\7\6\4\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\10\7\5\226\205B\20\377\241U\21\377" + "\241U\21\377\17\13\6\366\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\10\7nJ4\33\377\277g\30\377\260Y\23\377\"\26\11\377\6" + "\5\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\241\205B\20\377\241" + "U\21\377\241N\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5U{=\20\377\241U\21\377\241U\21\377\26\17" + "\7\377\2\2\1U\0\0\0\0\0\0\0\0\7\6\4\364\205B\20\377\247X\22\377\275\\\24" + "\377\33\23\12\303\0\0\0\0\0\0\0\0\14\12\7n\240S\25\377\261U\22\377\241N\21" + "\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\241\205B\20\377\241U\21\377" + "\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\13\11\6U\206F\23\377\253Z\22\377" + "\237N\22\377\17\13\6\371\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5Ub1\15\377\207H\20" + "\377\205B\20\377\23\15\6\213\0\0\0\0\0\0\0\0\12\10\5U\203A\20\377\241U\21" + "\377\241U\21\377\17\13\6\366\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\244\205B\20\377" + "\245W\22\377\262Z\23\377\30\21\11\324\0\0\0\0\0\0\0\0\15\13\10i\245V\26\377" + "\264[\23\377\237Q\22\377\23\16\6\377\2\2\1O\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205" + "B\20\377\241U\21\377\241U\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\7\6\6\34\30\23\15\343g;\24\377\235S\22\377\232N\21\377\226Q\23\377\232" + "O\23\377\236Q\23\377\242S\23\377\241U\21\377\237Q\22\377\243V\22\377\33\22" + "\10\252\0\0\0\0\0\0\0\0\13\11\6U\203C\20\377\245W\22\377\241U\21\377\17\13" + "\6\374\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205B\20\377\241U\21\377\241U\21" + "\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\203A\20\377\257X\22\377\277`\24" + "\377\31\22\12\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\13\11\6" + "\252\224M\23\377\251R\22\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10" + "\5U\201@\20\377\241U\21\377\241U\21\377W/\16\377\27\21\10\377A\"\14\377\226" + "L\21\377\204D\21\377)\31\12\377\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\10\7\5\226\205B\20\377\241U\21\377\241N\21\377\27\17\6\252\0\0\0\0\0\0\0" + "\0\12\10\5U\201@\20\377\241U\21\377\241U\21\377\27\17\6\252\0\0\0\0\10\7" + "\5\231\205B\20\377\23\15\6\356\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241" + "U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241" + "U\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205B\20\377\241U" + "\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241" + "U\21\377\241U\21\377\37\24\10\377\5\4\4U\0\0\0\0\5\4\4(\21\16\12\377\310" + "x#\377\317p\34\377\303b\24\377\35\24\10\252\0\0\0\0\0\0\0\0\12\10\5U\203" + "A\20\377\243V\22\377\237Q\22\377\226L\21\377\211F\20\377\207H\20\377\207" + "B\20\377\222K\21\377\237Q\22\377\203C\24\377*\37\21\377\12\11\7>\0\0\0\0" + "\0\0\0\0\5\5\4\10\32\25\17\343\211O\34\377\256X\23\377\236S\21\377\211F\20" + "\377\207H\20\377\207B\20\377\222K\21\377\237Q\22\377\241U\21\377\241U\21" + "\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\203C\20\377\243V\22\377\237Q\22" + "\377\21\14\6\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\2\1\1\10\7\6\4\371\211C\20\377\245P\22\377\232N\21\377\33\22\10" + "\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205B\20\377\241U\21\377\241" + "U\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\307|$\377" + "\323}\40\377\310i\25\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\244\205" + "B\20\377\241U\21\377\241N\21\377\23\15\6\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\10\7\5zD&\15\377\226S\27\377\256k#\377\265p&\377\276u'\377\301r$\377" + "\217T\32\377\17\14\10\324\4\4\3\6\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5l\207B\20" + "\377\241U\21\377\241U\21\377}A\20\377Z/\15\377y<\20\377\244T\23\377\275a" + "\26\377\261h\40\377\302{'\377\324\206)\377\322|\37\377\310i\25\377\27\21" + "\10\332\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\2478\37\13\377n7\17\377v" + ">\21\377s:\20\377s:\20\377x?\21\377_.\16\377\21\15\6\343\7\6\4\34\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\16\14\7\343W+\16\377\232N\21\377\230M\21\377\213" + "G\20\377\207H\20\377\207B\20\377\222K\21\377\310i\25\377\323\177$\377\326" + "\206'\377\27\22\14\377\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U\32\20\7\377\203C\20" + "\377\221K\22\377N+\17\377\7\6\4\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\12\10\5\210\235Q\24\377\322\201" + "!\377\213Y$\377\12\11\7\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252" + "\304q\37\377\316r\31\377\275\\\24\377\22\15\7\364\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\5\4\4X\33\23\10\377\215I\22\377\241U\21\377\25\16\6\332\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\14\11\7c\13\10\6\252\12\10\5[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\13\12\10\34\40\27\15\343l9\23\377\231R\22\377\232N\21\377\222K\21" + "\377a/\16\377$\30\13\377l@\31\377\313o\36\377\317v\40\377\317v\40\377\275" + "n\40\377?)\24\377\17\14\10L\0\0\0\0\0\0\0\0\11\10\6\34&\33\17\3323!\22\377" + "0\40\21\377\203J\30\377\266a\25\377\260Y\23\377\252W\23\377\206H\25\377%" + "\31\16\377\17\15\10\220\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\13\11\10\177\253" + "c\34\377\320{\37\377\313|\36\377h?\33\377\17\15\12\324\7\6\6\34\0\0\0\0\0" + "\0\0\0\0\0\0\0\16\13\7\252\216J\23\377\241U\21\377\237Q\22\377\33\22\10\270" + "\0\0\0\0\0\0\0\0\6\5\3\34\33\21\10\343\\.\15\377o7\16\377\37\24\10\377\10" + "\6\3\306\11\7\4\252\12\10\5\343\26\20\11\377='\22\377k@\32\377lB\31\377\40" + "\26\13\377\11\7\6\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\2348$\23\377\277r\40\377\257" + "b\36\377)\33\20\377\13\11\6""9\0\0\0\0\0\0\0\0\0\0\0\0\25\17\12\343d8\25" + "\377\240S\25\377P,\21\377\16\14\7\276\7\6\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\15\12\6\34\35\24\12\324\25\17\12\220\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\14\11\7U'\30\12\255\20\14\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\24\23\15\6\255\25\16\6\377\25\17\6\327" + "\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10\252\276" + "b\27\377\313l\30\377\312o\27\377\27\21\12\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\21\15\12\252\303p\36\377\323|\36\377\315j\32\377\37" + "\25\14\377\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\213,\31\11\377\207H\20\377h6\15" + "\377\17\13\6\371\7\6\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\7\6\4""9,\31\11\377\211I\20\377\217F\20\3771\31\10\377\10\6\3\270\10\6\3" + "U\10\6\3\216\27\20\6\377\202B\17\377\221M\20\377W,\14\377\12\10\5\216\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\10\2445\37\16\377\226J\23\377" + "\232N\21\377\224L\21\377A!\12\377\12\10\5\270\6\5\5\34\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\13\11\6\216\257f\36\377\317{\40\377\320r\37\377\304r!\377" + "Y8\32\377\21\15\12\377\13\10\6\252\11\7\6\252\13\10\6\252\17\13\10\252\22" + "\15\11\216\10\6\5\34\0\0\0\0\0\0\0\0\12\10\5]f5\21\377\237Q\22\377\232N\21" + "\377H%\13\377\13\10\6\343\11\7\6\252\13\10\6\306=$\24\377\304k\33\377\314" + "r\33\377\266f\37\377\23\16\12\252\0\0\0\0\0\0\0\0\6\6\5\24\32\23\13\306\34" + "\24\13\377\26\20\11\377\27\20\10\377\33\22\10\377\30\20\7\377\30\20\7\377" + "J'\13\377\213D\20\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0" + "\7\6\4JW,\14\377\233O\22\377\227I\20\377C\"\12\377\11\7\4\306\11\7\4`\10" + "\6\5\237\33\21\10\377\211C\20\377\236P\21\377p8\17\377\12\10\5\247\0\0\0" + "\0\0\0\0\0\7\5\4UJ$\13\377\226S\21\377\221M\20\3777\35\12\377\10\6\3\306" + "\10\6\3X\7\6\4\231'\30\14\377\307p\34\377\322s\37\377\270l!\377\21\16\12" + "\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6\252\213E\22" + "\377\250V\23\377\232N\21\377\21\14\6\353\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\7\6\4U@\40\13\377\242P\23\377\306`\25\377m?\32\377\17\13" + "\10\343\12\10\7\252\10\7\5\303\35\22\10\377\211C\20\377\232N\21\377r;\17" + "\377\13\12\6\244\0\0\0\0\0\0\0\0\11\7\6Ua2\20\377\237Q\22\377\230M\21\377" + "J$\13\377\12\10\5\306\7\6\4}\12\10\5\306=$\24\377\310i\35\377\321z\34\377" + "\264h\35\377\20\14\11\252\0\0\0\0\0\0\0\0\14\12\7\252\240S\25\377\267Y\23" + "\377\256X\23\377\34\23\11\273\0\0\0\0\0\0\0\0\16\12\7U\217K\24\377\303b\24" + "\377\275\\\24\377\25\17\10\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\7\6\4U\32\20\7\377o7\16\377\204C\17\377'\27\10\377\10\6\3q\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6U\40\26\15" + "\377\274p\37\377\301r\36\377^9\31\377\21\15\12\252\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4" + "\216\12\10\5\377\12\10\5\306\6\5\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\10\7\5UX0\23\377\314r\33\377\320v\37\377o>\32\377\13\10\6\343" + "\10\7\5\226\12\10\5t\12\10\5X\11\7\4U\6\5\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\12\10\5cr8\15\377\217F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0" + "\0\0\0\0\0\10\7\3\202v<\15\377\224L\21\377\226L\21\377\30\20\7\252\0\0\0" + "\0\0\0\0\0\11\7\4Ur8\15\377\221J\20\377\217F\20\3774\34\11\377\10\6\3\306" + "\10\6\3X\10\6\3\220\27\17\6\377\202B\17\377\227P\20\377o7\16\377\12\10\5" + "\220\0\0\0\0\0\0\0\0\6\5\3;;\40\12\377\235S\22\377\271Z\24\377a6\26\377\16" + "\12\7\343\15\12\6\252\15\12\6\377T)\15\377\224L\21\377\233R\22\377\207B\20" + "\377\16\12\5\237\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221M\20\377\221J\20\377" + "7\34\12\377\11\7\4\306\10\6\3]\10\6\3\223\31\20\6\377\202@\17\377\227P\20" + "\377o7\16\377\12\10\5\216\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221M\20\377\217" + "F\20\3774\34\11\377\10\6\3\306\10\6\3f\10\6\3\213\10\6\3\252\11\10\4q\0\0" + "\0\0\0\0\0\0\0\0\0\0\12\10\5[r8\15\377\226L\21\377\226L\21\377\21\14\6\374" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U@" + "!\13\377\221M\20\377\217F\20\3778\35\11\377\10\6\3\306\10\6\3U\6\5\3w\16" + "\13\5\377\200B\17\377\227I\20\377\217L\20\377\24\15\5\252\0\0\0\0\0\0\0\0" + "\11\7\4Ur8\15\377\217F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0\0\0\0" + "\0\0\10\7\3\202r8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0" + "\0\0\11\7\4Ur8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0" + "\7\6\4GW,\14\377\236W\21\377\241U\21\377g5\24\377\17\13\10\343\12\10\7\252" + "\12\10\7\303!\24\12\377\211C\20\377\227I\20\377o7\16\377\12\10\5\216\0\0" + "\0\0\0\0\0\0\11\7\4Ur8\15\377\217F\20\377\222K\21\377\22\15\7\377\0\0\0\0" + "\0\0\0\0\7\6\6J\30\20\7\377\204C\17\377\221M\20\377\207H\20\377\16\12\5\252" + "\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221M\20\377\217F\20\377:\37\13\377\13\10" + "\6\343\13\11\6\252\13\10\6\252\12\7\5\252\11\10\4q\0\0\0\0\0\0\0\0\0\0\0" + "\0\13\11\6\241\257\\\30\377\313l\30\377\306e\27\377\31\22\12\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3\223r8\15\377\217F\20\377\217F\20" + "\377\24\15\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\252W\23\377\307j\30\377" + "\30\21\13\377\0\0\0\0\0\0\0\0\6\6\5\34\17\14\6\377\200B\17\377\221J\20\377" + "\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0\6\5\3""99\37\12\377\221M\20\377" + "\217F\20\377Z,\15\377\23\15\6\377\12\10\5\377\15\12\6\377>!\13\377\207H\20" + "\377\227I\20\377l5\15\377\12\10\5\216\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\217" + "F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U@!\13\377\221M\20\377\217" + "F\20\377C\"\12\377\16\12\5\3771\33\11\377\214H\21\377\240U\23\377\240U\23" + "\377n7\17\377\37\24\10\377\11\7\4""9\0\0\0\0\0\0\0\0\11\10\4Ur8\15\377\217" + "F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210v<\15" + "\377\232K\21\377\254W\23\377\30\21\11\314\0\0\0\0\0\0\0\0\10\7\5U_1\20\377" + "\241U\21\377\230M\21\377G\"\12\377\11\7\4\306\10\6\3X\10\6\3\216\27\17\6" + "\377\202B\17\377\227P\20\377o7\16\377\16\12\5\252\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\244v8\17\377\221J\20\377\217F\20\377\20\14" + "\5\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4UU+\14\377\227" + "P\20\377\217F\20\3777\35\12\377\10\6\3\306\10\6\3]\10\6\5\255-\33\16\377" + "\307p\34\377\322|\37\377\307w\"\377\23\17\12\335\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\15\13\10\252.\34\13\377\203A\20\377\221J\20\377\211C\20" + "\377F#\13\377\14\12\5\340\7\6\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5" + "\"%\31\16\377\265d\34\377\316q\37\377\317{\40\377\307w\"\377kC\34\377\34" + "\24\13\377\34\23\11\377T)\15\377\215K\20\377\221J\20\377\237R\24\377X5\31" + "\377\15\13\10c\0\0\0\0\0\0\0\0\15\12\6Ur<\21\377\224L\21\377\217F\20\377" + "\25\16\6\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\252w=\16\377\221M\20\377\207" + "H\20\377\23\15\6\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7" + "\3\216r8\15\377\217F\20\377\217F\20\377\20\14\5\332\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6\252~>\17\377\227P\20\377p9\15\377\23\15" + "\6\377\10\6\3\220\10\6\3U\11\7\4q\10\6\3\247\10\6\3\252\10\6\3\252\11\10" + "\4q\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5[r8\15\377\221J\20\377\217F\20\377=\40" + "\12\377\11\10\4\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\14\12\7\317J$\13\377\213J\20\377O(\14\377\12\10\5\322\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\33\21\6\377\202B\17\377\217F\20\377\217" + "L\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\10\6\3UJ'\13\377\221M\20\377\217F\20\377)\27\10\377\7\6\4\255" + "\5\5\2U\6\5\3q\16\12\5\377\201A\16\377\221J\20\377\221J\20\377\30\20\7\252" + "\0\0\0\0\0\0\0\0\12\10\5Up9\15\377\221M\20\377\217F\20\3774\34\11\377\10" + "\6\3\306\10\6\3X\10\6\3\220\27\17\6\377\202B\17\377\227P\20\377o7\16\377" + "\12\10\5\220\0\0\0\0\0\0\0\0\6\5\3;?\"\12\377\221M\20\377\217F\20\3777\35" + "\12\377\10\6\3\306\10\6\3U\10\6\3\220\40\23\7\377\213J\20\377\233O\22\377" + "\207B\20\377\16\12\5\252\0\0\0\0\0\0\0\0\6\5\3""99\37\12\377\221M\20\377" + "\217F\20\3777\35\12\377\10\6\3\306\10\6\3X\10\6\3\220\25\17\6\377\202B\17" + "\377\217L\20\377\222K\21\377\30\17\7\270\0\0\0\0\0\0\0\0\7\6\4GB!\13\377" + "\224O\21\377\217F\20\377-\31\10\377\7\5\4\260\7\5\4U\10\6\3U\11\7\4U\10\6" + "\3R\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210r8" + "\15\377\217F\20\377\217F\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\7\6\4\34\12\10\5\202\23\15\6\252\35\23\10\255\30\20\7\324\33\22" + "\10\301\24\15\7\3667\35\12\377\213J\20\377\217F\20\377\217F\20\377\22\15" + "\5\252\0\0\0\0\0\0\0\0\11\7\4Us6\16\377\217F\20\377\217F\20\377\20\14\5\335" + "\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210r8\15\377\217F\20\377\217F\20\377\24\15" + "\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221J\20\377\221J\20\377\21\13\6\374" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\252w=\16\377\221" + "J\20\377\217F\20\377\22\15\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\217F\20" + "\377\217F\20\377!\24\10\377\5\4\4\303\10\6\5\306.\32\11\377~>\17\377\204" + "C\17\377#\26\10\377\11\7\4]\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5]r8\15\377\217" + "F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\217F\20" + "\377\217F\20\377\24\15\5\252\0\0\0\0\11\7\4}r8\15\377\25\15\6\322\0\0\0\0" + "\11\7\4Ur8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0\11" + "\7\4Ur8\15\377\217F\20\377\217F\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0" + "\0\10\7\3\210r8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0" + "\0\6\5\3""99\37\12\377\221M\20\377\217F\20\377Z,\15\377\21\14\6\377\14\11" + "\5\377\24\17\11\377a3\24\377\251W\24\377\241U\21\377p6\17\377\12\10\5\216" + "\0\0\0\0\0\0\0\0\11\7\4Uy<\20\377\256X\23\377\260Y\23\377p;\21\377%\27\12" + "\377\32\20\7\377\31\22\10\377\30\17\7\377\27\20\10\377\22\15\11\306\12\11" + "\7c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\"\14\12\7\247\24\16\7\322\25" + "\17\6\377\32\21\7\377\30\20\7\377\32\21\7\377F#\13\377\216I\21\377\224L\21" + "\377\230M\21\377\30\17\7\252\0\0\0\0\0\0\0\0\15\12\6`\201A\22\377\252W\23" + "\377\252W\23\377\30\20\11\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\5\4\2L\10\6\3U\10\6" + "\3U\10\6\3U\7\5\4U\6\5\3w\20\13\5\377\201A\16\377\227I\20\377v=\17\377\16" + "\12\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210r8\15\377\217F\20\377" + "\217F\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7qmC\32\377" + "\270Z\25\377\224L\21\3774\34\11\377\10\6\3\306\10\6\3X\10\6\3\220\25\17\6" + "\377\202B\17\377\217L\20\377\217L\20\377\20\14\5\343\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\11\10\6\252C*\24\377\312|\37\377\320\200!\377\315j\32" + "\377h:\25\377\16\13\7\332\6\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4" + "\34\33\21\10\345f3\15\377\213D\20\377\217I\20\377\221J\20\377G%\14\377\32" + "\22\11\377P2\27\377\314z!\377\320s!\377\312h\31\377\225N\24\3774\36\13\377" + "\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\252U+\14\377\211I\20\377M'\14\377" + "\16\12\5\343\12\10\5\252\12\10\5\306.\32\11\377\211I\20\377s;\16\377\31\20" + "\6\350\10\6\3\37\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\12\10\5w\23\15\6\252\35" + "\23\10\255\32\20\7\322\33\22\10\273\21\14\6\366:\36\13\377\227M\22\377\300" + "a\25\377\300a\25\377\30\20\11\317\0\0\0\0\0\0\0\0\4\4\3\3\31\20\6\353s;\16" + "\377\217I\20\377\221M\20\377l5\15\377\25\16\6\377\7\6\4\244\12\7\5U\10\7" + "\5\223\11\7\4\210\10\6\5L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5" + """9:!\15\377\274k\33\377\300o\37\377U3\30\377\22\15\11\273\6\5\5\24\0\0\0" + "\0\0\0\0\0\13\11\6\234\213E\22\377\236S\21\377\224L\21\377\27\17\6\252\0" + "\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\23\15\6\377f3\15\377\200B\17\377Q)\14\377" + "\14\11\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\15\12\10Us<\30\377\242K\27\377y<\24\377\27\17\10\216\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\6\12\10\5\252]0\14\377{A\16" + "\377{<\16\377\16\12\5\343\3\3\2U\14\12\7\252\243S\30\377\307c\32\377\301" + "`\30\377)\32\16\343\6\6\5-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\3\3\2\34\13\10\6\252j2\15\377\201?\16\377\201?\16\377\35\22\10\343\6\5" + "\5\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10\210\220I\25\377\266" + "Y\25\377c7\23\377\16\13\7\273\4\4\3\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11" + "\7\4q].\14\377\203B\16\377y>\16\377\20\13\5\252\0\0\0\0\0\0\0\0\0\0\0\0\7" + "\6\4\34\16\12\5\343d2\15\377n;\15\377g4\16\377y;\22\377\206E\25\377\40\25" + "\13\377\6\5\5\306\12\10\7\343.\34\15\377h3\17\377`.\15\377\16\12\5\213\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\12\10\7l?%\22\377\260X\27\377\240P\25\377\24\16\11\252\0\0" + "\0\0\0\0\0\0\10\6\5OU)\14\377\203A\20\377B\"\13\377\12\10\5\252\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\247" + "s8\20\377\245U\24\377pA\27\377\22\15\11\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\15\12\10\216\204D\25\377\242P\23\377\215F\22\377\21\14" + "\6\265\0\0\0\0\0\0\0\0\0\0\0\0\21\14\6\377g6\16\377\202B\17\377\37\24\10" + "\377\6\5\3q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\10\6\3\234#\26\10\377r:\15\377n;\15\377X-\13\377X*\13\377\\/\13\377h6" + "\15\377w:\16\377=\40\12\377\12\10\5\340\5\4\4\24\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\13\10\6Uq:\26\377\264Z\27\377\214E\21\377{?\16\377{<\16\377w8\16" + "\377x=\21\377\30\17\11\247\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\205\264" + "X\33\377\313k\36\377\307d\34\377\305h\34\377\277]\34\377\247N\30\377\204" + "D\25\377y>\22\377u<\22\377v9\21\377l2\17\377\21\14\6q\0\0\0\0\0\0\0\0\0\0" + "\0\0\16\12\5\343A!\12\377s;\16\377s;\16\377m4\16\377t9\21\377y;\22\377\213" + "D\24\377\232I\23\377s>\24\377!\27\14\377\11\10\6G\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\2\1\10\10\6\3\252]2\14" + "\377}@\16\377{<\16\377\16\12\5\237\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\340A!" + "\12\377s;\16\377s;\16\377m4\16\377w=\22\377\201B\24\377\224K\25\377\252T" + "\25\377\201C\26\377%\31\16\377\10\7\5""9\0\0\0\0\0\0\0\0\5\5\4\27\30\21\11" + "\377g6\22\377\204?\21\377x>\17\377b1\15\377Z-\13\377^-\15\377|<\21\377\254" + "Q\25\377\226N\31\377,\35\21\377\11\10\6[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\7\3f].\14\377}@\16\377y>\16\377\22\14\5\252\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\343@!\13\377\204B" + "\21\377\236O\25\377\227F\26\377\202C\25\377n5\17\377l5\15\377v<\15\377U+" + "\14\377\25\16\6\377\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\343A!\12\377" + "\203A\20\377\225H\24\377\205D\24\377o6\20\377n5\17\377\212H\23\377\243Q\24" + "\377p:\23\377\34\24\11\377\10\7\5""9\0\0\0\0\0\0\0\0\11\7\4[`0\15\377\204" + "F\17\377{<\16\377\16\12\5\241\0\0\0\0\0\0\0\0\15\12\6U\224I\27\377\312e\33" + "\377\201C\32\377\22\15\11\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\6\5\3""0\21\14\6\343l7\15\377p7\15\377#\26\10\377\11\7\4""9" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\40\26\15\377\211" + "D\26\377\232I\23\377-\32\12\377\10\6\5\220\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3DC\"\12" + "\377s8\20\377m4\16\377\20\13\5\223\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\5\4\4\13\26\21\13\343\201L\34\377\303_\34\377\272T\27\377y;\22" + "\377k3\16\377`.\15\377Z-\13\377X-\13\377)\30\10\377\14\12\5\260\0\0\0\0\0" + "\0\0\0\0\0\0\0\10\6\3LX,\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0" + "\0\0\0\0\0\0\11\7\4U\\/\13\377}@\16\377{<\16\377\20\13\5\226\0\0\0\0\0\0" + "\0\0\10\6\3>X-\13\377}@\16\377{<\16\377r:\15\377]2\14\377X,\13\377\\/\13" + "\377h6\15\377w:\16\377U+\14\377\25\17\6\377\7\6\4""3\0\0\0\0\0\0\0\0\0\0" + "\0\0\14\12\5\335=\40\12\377x>\17\377{=\20\377m4\16\377`.\15\377f3\15\377" + "s;\16\377{A\16\377U+\14\377\31\20\6\377\7\6\4""3\0\0\0\0\0\0\0\0\10\6\3J" + "X-\13\377}@\16\377{<\16\377r:\15\377]2\14\377X-\13\377\\/\13\377h4\15\377" + "v<\15\377U+\14\377\25\17\6\377\7\5\4(\0\0\0\0\0\0\0\0\10\6\3JX-\13\377}@" + "\16\377{<\16\377r:\15\377]2\14\377X-\13\377\\+\13\377]2\14\377]2\14\377\24" + "\15\5U\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}@\16\377y>\16\377\22\15\5\252\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12" + "\5\343;\37\12\377s>\16\377r:\15\377]2\14\377X,\13\377X,\13\377h6\15\377v" + "<\15\377{<\16\377{<\16\377\16\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}" + "B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}" + "B\16\377{A\16\377\16\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{" + "A\16\377\16\12\5\237\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\335F#\13\377\233J\24" + "\377\301Y\32\377\271[\34\377\254U\33\377\245P\30\377\233N\26\377\204B\21" + "\377Z,\15\377\25\17\6\377\7\5\4(\0\0\0\0\0\0\0\0\10\6\3JX-\13\377}@\16\377" + "y>\16\377\23\15\6\260\0\0\0\0\0\0\0\0\0\0\0\0\11\6\4\205]2\14\377\203B\16" + "\377{A\16\377\16\13\5\226\0\0\0\0\0\0\0\0\10\6\3>X-\13\377}@\16\377{<\16" + "\377v8\17\377x=\21\377\210C\25\377v9\21\377`0\15\377\\/\13\377\22\14\5U\0" + "\0\0\0\0\0\0\0\11\7\4Oh3\17\377\214B\21\377\207B\20\377\21\14\6\306\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{A\16\377\16" + "\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377\207B\20\377\210C\21\377\26\16" + "\7\306\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3wX-\13\377}@\16\377{<\16\377\16\12\5" + "\237\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\322;\37\12\377s>\16\377v<\15\377h6\15" + "\377d2\15\377d2\15\377r:\15\377w?\16\377U+\14\377\25\17\6\377\7\5\4(\0\0" + "\0\0\0\0\0\0\10\6\3JX-\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\14\12\5\343;\37\12\377s>\16\377r:\15\377d2\15\377r8\15\377\205B\20\377" + "\240P\25\377\260S\25\377-\33\14\377\6\5\3\252\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\6\3RX-\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\11\7" + "\4U\\/\13\377\203=\16\377~>\17\377\21\13\6\252\0\0\0\0\0\0\0\0\0\0\0\0\16" + "\12\5\343A!\12\377s;\16\377s>\16\377]2\14\377X,\13\377\\/\13\377h6\15\377" + "w:\16\377U+\14\377\25\17\6\377\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\23\15\6\377T*\13\377s>\16" + "\377n;\15\377]2\14\377T,\13\377j6\17\377\260T\27\377\307d\34\377\274e\37" + "\377Z6\31\377\15\12\10\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\10\6\3\244H%\13\377\203B\16\377n6\15\377\14\11\5\340\3\3\2\21\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6U\36\24\15\377\276`\33\377" + "\307b\30\377yE\26\377\15\12\6\276\4\3\3\34\5\4\2i\33\21\6\377r8\15\377}@" + "\16\377-\32\12\377\10\7\5\231\0\0\0\0\0\0\0\0\0\0\0\0\12\7\5U`0\15\377}@" + "\16\377{<\16\377\20\13\5\303\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3n\\/\13\377\203" + "B\16\377{A\16\377\22\15\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3c]2\14\377}B\16\377s;\16\377h6\15\377" + "X-\13\377X,\13\377\\+\13\377\\+\13\377\\+\13\377]2\14\377]2\14\377\24\15" + "\5U\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}@\16\377{<\16\377s>\16\377].\14\377" + "\20\13\5\177\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4" + "\4\34\14\12\5\366h6\15\377s;\16\377'\27\10\377\10\6\3R\0\0\0\0\0\0\0\0\0" + "\0\0\0:\37\11\377r:\15\377w?\16\377{<\16\377{A\16\377\22\14\5\252\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5" + "\343;\37\12\377s>\16\377n;\15\377X,\13\377P*\13\377X,\13\377h6\15\377s;\16" + "\377{<\16\377{<\16\377\20\13\5\226\0\0\0\0\0\0\0\0\10\6\3AX,\13\377}@\16" + "\377{<\16\377r:\15\377]2\14\377X,\13\377\\/\13\377h6\15\377w:\16\377U+\14" + "\377\25\17\6\377\7\6\4""3\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\340?\40\12\377" + "s>\16\377r8\15\377]2\14\377X,\13\377X-\13\377n;\15\377w=\16\377U+\14\377" + "\31\20\6\377\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\335;\37\12\377s>\16" + "\377r8\15\377]2\14\377X,\13\377\\/\13\377h6\15\377s;\16\377{<\16\377y>\16" + "\377\20\13\5\247\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\332;\37\12\377s>\16\377" + "n;\15\377X,\13\377P*\13\377X,\13\377X-\13\377X,\13\377\20\13\5i\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377" + "\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\306]2\14\377}B\16\377{<\16\377" + "\14\12\5\252\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{A\16\377\22\14\5\252" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{A\16\377\16\12\5\226" + "\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{<\16\377\22\15\5\252\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\13\11\7\4\343d2\15\377{<\16\377{<\16" + "\377\14\12\5\252\0\0\0\0\0\0\0\0\10\6\3>X-\13\377}B\16\377{<\16\377\16\12" + "\5\306\0\0\0\0\0\0\0\0\10\6\3\252#\26\10\377s;\16\377p7\15\377!\25\10\377" + "\10\6\3%\0\0\0\0\0\0\0\0\10\6\3JX-\13\377}B\16\377{A\16\377\16\12\5\226\0" + "\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{A\16\377\16\13\5\223\0\0\0\0\11" + "\7\4U\\/\13\377\24\15\5\252\0\0\0\0\10\6\3>X-\13\377}B\16\377{A\16\377\16" + "\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{<\16\377\22\14\5\252" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377\16\12\5\237" + "\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\322;\37\12\377s;\16\377v<\15\377h6\15\377" + "f3\15\377p5\15\377z?\17\377{:\16\377U+\14\377\25\17\6\377\7\5\4-\0\0\0\0" + "\0\0\0\0\10\6\3Uq7\20\377\304\\\27\377\303`\30\377\31\21\12\377\4\3\3O\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\2\2\34\12\10\5\343" + "\212G\25\377\261W\24\377\256V\25\377\30\20\11\252\0\0\0\0\0\0\0\0\15\12\10" + "U\216I\27\377\303`\30\377\302[\27\377\30\21\13\343\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11" + "\5\226#\26\10\377P*\13\377T,\13\377X,\13\377P*\13\377X,\13\377a2\14\377v" + "<\15\377U+\14\377\25\17\6\377\10\6\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11" + "\7\4U\\/\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\6\5\5\34\21\15\10\343D\"\13\377s;\16\377n;\15\377]2\14\377X,\13\377" + "\\/\13\377h6\15\377s;\16\377{<\16\377{A\16\377\22\14\5\252\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7\252\203E\30\377\277Z\26\377\210" + "G\23\377\17\13\6\343\4\3\3\21\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\7\6\4\37\20\13\5\343h4\15\377\203B\16\377b1\15\377\12\10\5\301\3\2\2" + "D\10\7\5\252yB\32\377\303`\30\377\234J\23\377\"\25\11\377\11\7\4U\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\6\3""3E#\12\377y>\16\377{<\16\377\20\13\5\343\4\3\3\34" + "\0\0\0\0\0\0\0\0\10\6\3\252\\/\13\377}@\16\377l7\15\377\16\12\5\244\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\7\5\4\306`0\15\377\206A\17\377\205B\20\377\17\13\6\252\0\0\0\0\0\0\0\0" + "\7\5\4UN'\13\377\202@\17\377\202@\17\377\206A\17\377\210C\21\377|>\21\377" + "r8\21\377q7\20\377v<\21\377k7\24\3770\35\17\377\14\12\7U\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252-\33\14\377\213F\24\377\203B\22\377k" + "5\16\377\23\15\6c\0\0\0\0\0\0\0\0\10\6\5U\\.\15\377\203=\16\377}@\16\377" + "\16\12\5\252\0\0\0\0\0\0\0\0\0\0\0\0:\37\11\377n;\15\377s;\16\3778\35\11" + "\377\12\10\5\343\5\4\4\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\34\34\22\13\3241\34\20\377#\25\14\361\15" + "\12\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16" + "\12\5\216\24\16\5\252\20\14\5\244\10\6\3\34\0\0\0\0\0\0\0\0\30\20\11\216" + "\25\17\10\374\27\17\10\270\13\10\6\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\16\5\252\20\13\5\252" + "\12\10\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\31\24\15" + "\7\223\26\17\7\252\12\10\5\216\5\4\4\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\7\5\4\34\16\12\5\234\16\12\5\345\30\17\11\377\40\24" + "\13\377\34\22\13\364\14\11\7l\0\0\0\0\0\0\0\0\12\10\5\216\23\15\10\353\30" + "\17\7\343\12\10\5;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5]\27\17\10\252\34\22\11" + "\255\17\13\6\34\0\0\0\0\0\0\0\0\0\0\0\0\22\14\5\216\25\16\6\252\11\7\4\205" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\10\6\5qY,\16\377d3\25\377\15\12\10\343\6\5\5\34\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\5\10\21\14\6\216\32\20\7\252\22\14\5" + "\252\11\7\4\34\0\0\0\0\0\0\0\0\6\5\3U6\34\13\377\210B\23\377y;\22\377\17" + "\12\6\361\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\6\3""9\14\11\5\252\22\15\5\262\16\12\5\361\16\12\5\377" + "\16\12\5\374\20\13\5\303\20\13\5\252\10\6\3q\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\10\6\5\34\30\20\11\314\30\21\11\377\21\14\6\322\16\12" + "\5\252\20\13\5\252\21\13\6\366\33\21\12\366\16\12\7U\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\10\6\5\34\25\16\12\303\26\17\13\377\22\15\11\377\22\15\11\377" + "\26\17\11\377\23\15\10\377\21\14\6\377\21\13\6\377\17\13\6\377\21\14\6\377" + "\23\15\6\314\14\11\5\34\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\31\10\6\3z\16\12\5" + "\252\22\15\5\260\16\12\5\353\17\13\6\377\17\13\6\377\23\14\6\314\23\15\6" + "\252\12\10\5\252\10\6\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252" + "\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\31\10\6\3}\16\12\5\252" + "\16\12\5\322\27\17\10\377\36\24\13\377\36\24\13\377\27\21\12\377\24\16\11" + "\364\20\14\11\252\11\10\6O\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6A\17\13" + "\10\252\21\14\10\350\25\16\10\377\32\20\11\377\27\17\10\377\25\16\10\377" + "\17\13\6\377\26\17\7\262\13\11\6\252\12\10\7""9\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\216\24\15\5\252\20\13\5\252" + "\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4" + "\34\10\6\3\205\17\13\6\301\24\17\11\377\34\22\13\377\36\24\13\377\32\20\11" + "\377\16\12\5\356\20\13\5\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\5\4\2\34\10\6\3\216\22\14\7\317\26\17\11\377\34\22\13\377\33\22" + "\12\377\22\15\7\377\17\13\6\343\25\15\6\252\12\7\5\244\7\6\4""9\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\14\5\252\11\7\4\34\0\0" + "\0\0\0\0\0\0\12\10\7w\225@\32\377\203?\32\377\16\13\7\343\6\5\5\34\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\34\16\12" + "\5\234\24\15\5\252\14\11\5\216\6\5\3\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\14\12\7\216\30\17\7\252\25\15\6\252\10\6\3L\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\11\7\6US+\20\377\260X\27\377\202>\25\377\20\13\7\252\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\34\15\12\10" + "\244\27\20\12\276\20\13\7\374\17\13\6\377\16\12\5\377\16\12\5\377\16\12\5" + "\377\20\13\5\350\16\12\5\252\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12" + "\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16" + "\12\5\210\20\14\5\252\20\13\5\252\22\14\5\252\20\13\5\322\16\12\5\377\16" + "\12\5\371\20\14\5\301\20\13\5\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\5\5\4\34\10\6\3}\16\12\5\252\22\14\5\260\16\12\5\356\16\12\5" + "\366\20\14\5\303\22\15\5\252\20\13\5\252\11\7\4\226\7\5\4""6\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\16\12\5\216\20\14\5\252\20\13\5\252\22\14\5\252\20\13" + "\5\322\16\12\5\377\16\12\5\371\20\14\5\301\20\13\5\252\11\7\4\231\7\6\4""9" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\20\14\5\252\20\13\5\252\22\14" + "\5\252\20\13\5\322\16\12\5\374\14\11\5\377\20\13\5\377\24\15\5\311\13\11" + "\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\213\24\15\5\252\20\13\5\252\11\7\4" + "\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\5\5\4\34\10\6\3}\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\20\13" + "\5\353\22\15\5\255\20\13\5\252\20\14\5\252\20\13\5\244\11\7\4\34\0\0\0\0" + "\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0" + "\0\0\0\0\0\0\0\0\0\6\5\3\34\10\7\5\213\23\15\10\301\25\17\12\377\37\25\14" + "\377\40\25\15\377\37\24\14\377\27\21\12\377\22\14\7\324\12\10\5\237\7\6\4" + """9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\13\5\252\11" + "\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\14\5\252" + "\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\210\20\14\5\252\20\13\5\252\22" + "\14\5\260\21\14\6\374\25\16\10\377\21\14\6\377\20\13\5\377\24\15\5\314\13" + "\11\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\16\6\252\22\14\5\252\11\10" + "\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5" + "\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252" + "\20\14\5\252\12\10\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\24\15" + "\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\10\6\3}\16" + "\12\5\252\22\14\5\252\24\16\5\255\20\14\5\301\24\15\5\262\24\15\5\252\20" + "\13\5\252\11\7\4\231\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216" + "\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\10\6\3}\16\12" + "\5\252\22\15\5\252\24\16\5\252\22\14\5\252\15\12\6\343H&\23\377\271V\40\377" + "\220@\35\377\24\17\13\350\10\7\7\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25" + "\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216" + "\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\31\10\6" + "\3z\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\16\12\5\371\20\14\5\301" + "\20\13\5\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\11\7\4\244" + "\16\12\5\252\22\15\5\255\16\12\5\345\16\12\5\377\21\14\6\377\26\17\11\377" + "\24\16\11\374\25\17\12\260\13\11\6\213\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\4z\22\14\5\252\16\12\5\226\7\5\4\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\7""9" + "\30\20\13\255\32\22\11\276\15\12\6\216\5\4\4\13\0\0\0\0\0\0\0\0\10\7\3D\16" + "\12\5\252\20\13\5\252\11\7\4J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16" + "\12\5\216\24\16\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\16\12\5\216\24\16\5\252\20\13\5\252\11\10\4\34\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7" + "\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216" + "\22\15\5\252\20\14\5\252\22\15\5\255\16\12\5\343\16\12\5\377\16\12\5\374" + "\14\11\5\377\14\11\5\377\20\13\5\377\24\15\5\311\13\11\4\34\0\0\0\0\0\0\0" + "\0\0\0\0\0\14\12\5\210\20\14\5\252\20\13\5\252\20\13\5\301\25\17\6\270\16" + "\12\5\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\10\6\3\2136\36\11\377k2\14\377N'\13\377\11\7\4\241\0\0\0\0\0\0\0\0\0\0\0" + "\0\24\15\5\216\22\14\5\322\20\13\5\252\20\13\5\252\20\13\5\252\11\7\4\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10""9\11\7" + "\6\237\10\6\5\237\12\10\7\202\12\10\7w\11\7\6\205\11\7\6\247\12\10\7\252" + "\13\11\10q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\34\10\6\3}\16\12\5\252\22\15\5\260\16\12" + "\5\356\16\12\5\377\20\13\5\353\22\15\5\255\20\13\5\252\20\14\5\252\20\13" + "\5\244\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\210\20\14\5\252\20\13\5" + "\252\22\14\5\252\20\13\5\322\16\12\5\377\16\12\5\371\20\14\5\301\20\13\5" + "\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\10\6\3" + "}\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\16\12\5\371\20\13\5\301" + "\20\13\5\252\11\7\4\226\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34" + "\10\6\3}\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\16\12\5\353\22\15" + "\5\255\20\13\5\252\20\14\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\5\5\4\34\10\6\3}\16\12\5\252\22\15\5\260\16\12\5\353\16\12\5\377\16" + "\12\5\377\20\13\5\377\24\15\5\317\14\11\5\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3U\7\5\4U\6" + "\5\3U\5\4\4U\5\4\4i\11\10\4\361H%\13\377n6\15\377C\"\12\377\10\6\3\220\0" + "\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\16\6\252\20\14\5\252\11\10\4\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\13\5\252\11\7\4\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0" + "\0\0\0\0\0\0\0\0\0\0\0\7\5\2%\10\6\3\216\10\6\3\343\31\17\6\377K$\12\377" + "c3\14\377B!\11\377\10\6\3\202\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\213\25\15\6" + "\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3O\16\12\5\252\22" + "\15\5\252\14\11\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6" + "\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252" + "\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\24\15\5U\13\10\4\34\0\0\0\0\0\0\0" + "\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0" + "\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\5\5\4\34\10\6\3}\16\12\5\252\22\14\5\252\24\16\5\255\20\14\5\301\24" + "\15\5\262\24\15\5\252\20\13\5\252\11\7\4\241\7\6\4""9\0\0\0\0\0\0\0\0\0\0" + "\0\0\10\6\3UT(\15\377\244I\27\377\270O\33\377\17\13\10\366\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\12\252\260" + "S%\377\304W!\377\300X\37\377\26\17\13\301\0\0\0\0\0\0\0\0\0\0\0\0\25\17\12" + "\237\32\21\13\377\30\21\13\335\12\10\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3;\14\11\5\252" + "\20\13\5\322\16\12\5\377\16\12\5\377\16\12\5\377\16\12\5\366\20\14\5\301" + "\20\13\5\252\11\7\4\231\6\5\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\10\6\3\177\16\12\5\252\22\15\5\260\16\12" + "\5\356\16\12\5\377\16\12\5\353\22\15\5\255\20\13\5\252\20\14\5\252\20\13" + "\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\16\13\7\216\35\23\10\252\21\13\6\237\10\6\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\34\16\12\5\226\24\15\5\252\14" + "\11\5\216\5\4\2\16\0\0\0\0\0\0\0\0\17\13\10\216\32\22\11\262\23\15\6\252" + "\10\6\3D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\14\5\216\20\13\5\356" + "\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\20\13" + "\5\327\22\15\5\273\13\11\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\6\5\4" + "\2R\5\4\2U\5\4\2U\5\4\2U\5\4\2c\11\7\4\361H%\13\377p5\15\377M'\14\377\12" + "\10\5\252\0\0\0\0\0\0\0\0\0\0\0\0\23\15\10\270\24\16\11\377\20\13\7\377\16" + "\13\7\377\21\14\10\377\26\17\11\377\33\21\12\377\36\23\13\377\34\22\13\377" + "\25\17\12\377\17\14\10\306\11\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\10\6\5[\17\13\6\252\16\13\5\356\23\15\6\306\14\11\5\34\0\0\0" + "\0\0\0\0\0\6\5\3U6\35\11\377d0\15\377m4\16\377\17\13\6\252\0\0\0\0\0\0\0" + "\0\0\0\0\0\23\15\6\220\16\12\5\377\20\13\5\262\10\6\3w\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7Xc,\24\377" + "\32\20\13\350\5\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9<" + "\34\13\377\236C\27\377X,\27\377\13\11\6\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11" + "\7n~3\31\377\31\21\14\350\5\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\5\34\23\16\12\3434\35\21\377" + "\36\24\15\377\11\10\6R\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252" + "\254Q1\377\325}^\377\271X:\377\27\20\16\237\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\34\20\13\5\364D" + "\"\11\377>!\11\377\11\10\4\213\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\12\10\7""0G!\22\377l/\27\377k0\26\377q3\30\377m2\30\377h-\25\377h" + "-\25\377q1\30\377s2\30\377\22\15\11\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\11\7\6\"\22\15\11\364B\37\17\377T%\21\377S$\20\377K\"\16\377" + "I#\16\377[)\20\377n/\23\377O(\20\377\30\20\11\377\10\6\5""9\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\26\16\5\364(\27\7\377*\27\7\377" + "6\34\11\377<\37\11\377$\26\7\377\14\11\5\364\6\5\3\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6UH\"\15\377~8\25\377\224" + "?\31\377\31\21\16\276\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\17\14\14\205\262V9\377\310Y7\377\302R/\377\36\24\21" + "\273\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4c\21\14" + "\6\377*\26\11\3771\31\11\3776\32\13\3774\32\13\377;\34\14\377R%\17\377o1" + "\22\377T'\21\377\31\21\12\377\10\7\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9&\26\7\377U'\14\377" + "|4\25\377\24\15\11\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\10\6\5\34\32\20\13\252\13\10\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\14\10\5w\24\16\11\252\14\11\7\216\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\11\7\6\34\33\21\14\252\13\11\10U\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\7\6\6\34\10\7\5U\10\6\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\31\21\20\241)\33\32\377(\32\27\353\16\14\13R\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\6\3%\11\7\4\216\11\7\4\210\6\5\3\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\27\17\12\231\23\15\12\377\20\13\11\377\20\13\11\377\20" + "\13\11\377\20\13\11\377\20\13\11\377\22\15\11\377\30\20\13\314\20\13\11\37" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\216\22\14" + "\11\317\22\15\11\377\20\13\11\377\17\13\10\377\17\13\10\374\22\15\11\303" + "\22\14\11\252\13\10\6\247\10\7\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4\216\16\12\5\252\15\12\6\252\15\11\6\252" + "\13\10\6\252\7\6\4\202\6\5\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\7\216\25\16\12\252\23\15\12" + "\252\16\13\11\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\7\10\16\31\21\20\216\33\22\20\301\32\22\17\252\17\13" + "\12\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\34\13" + "\10\6\252\16\12\7\350\17\12\10\377\17\12\10\377\17\12\10\377\17\12\10\374" + "\22\14\11\303\22\14\11\252\13\10\6\247\11\7\6""9\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\11\7\4[\20\13\7\252\24\15\11\252\15\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0", +}; + diff --git a/src/visualizations/Goom/goom2k4-0/tools/minicompress.c b/src/visualizations/Goom/goom2k4-0/tools/minicompress.c new file mode 100644 index 0000000000..4509fec005 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/tools/minicompress.c @@ -0,0 +1,65 @@ +#include <stdio.h> +#include <string.h> + +#define THE_FILE "gfont.c" +#define THE_FONT the_font +#define THE_FONTS "the_font" + +#include THE_FILE + +int main (int argc, char **argv) { + int i = 1; + int size = 0; + unsigned char pc = the_font.pixel_data[0]; + int nbz = 0; + unsigned char *rle; + rle = malloc (the_font.width*the_font.height*the_font.bytes_per_pixel); + + while (i < the_font.width *the_font.height*the_font.bytes_per_pixel) { + unsigned char c = the_font.pixel_data[i]; + if (pc==0) { + nbz ++; + if (c==0) { + if (nbz == 0xff) { + rle [size++] = 0; + rle [size++] = nbz; + nbz = 0; + } + } + else { + rle [size++] = 0; + rle [size++] = nbz; + nbz = 0; + } + } + else { + rle [size++] = pc; + } + pc = c; + i++; + } + + printf ("/* RGBA C-Source image dump (with zRLE compression) */\n" + "static const struct {\n" + " unsigned int width;\n" + " unsigned int height;\n" + " unsigned int bytes_per_pixel;\n" + " unsigned int rle_size;\n" + " unsigned char rle_pixel [%i];\n", size); + printf ("} " THE_FONTS " = {\n" + "%i, %i, %i, %i, {\n", + the_font.width,the_font.height,the_font.bytes_per_pixel,size); + + printf ("%i",rle[0]); + for (i=1;i<size;i++) { + if (i%20) + printf (",%i",rle[i]); + else + printf (",\n%i",rle[i]); + } + printf ("}};\n"); + printf (" /* Created by MiniCompress.. an iOS RLE compressor.\n" + " * Compress Rate : %2.2f %%\n" + " */\n", 100.0f * (float)size / (float)(the_font.width*the_font.height*the_font.bytes_per_pixel)); + return 0; +} diff --git a/src/visualizations/Goom/goom2k4-0/tools/xmms-goom.spec b/src/visualizations/Goom/goom2k4-0/tools/xmms-goom.spec new file mode 100644 index 0000000000..5e2e7ed887 --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/tools/xmms-goom.spec @@ -0,0 +1,41 @@ +%define _xmmsoutputdir %(xmms-config --visualization-plugin-dir) + +Summary: A neat visual plugin for XMMS. +Name: xmms-goom +Version: 1.9.0 +Release: fr1 +Copyright: GPL +Group: Applications/Multimedia +URL: http://goom.sourceforge.net/ +Source: http://prdownloads.sourceforge.net/goom/xmms-goom_%{version}.tgz +BuildRoot: %{_tmppath}/%{name}-root +Requires: xmms >= 0.9.5.1 +BuildPrereq: xmms-devel, gtk+-devel + +%description +A great visual plugins for XMMS. + +%prep +%setup -q -n %{name}_%{version} + +%build +%configure --libdir=%{_xmmsoutputdir} +make + +%install +rm -rf %{buildroot} +%makeinstall libdir=%{buildroot}/%{_xmmsoutputdir} +strip %{buildroot}/%{_xmmsoutputdir}/*.so + +%clean +rm -rf %{buildroot} + +%files +%defattr(-,root,root) +%doc AUTHORS COPYING ChangeLog NEWS README doc +%{_xmmsoutputdir}/libgoom.* + +%changelog +* Sun Jan 6 2002 Matthias Saou <matthias.saou@est.une.marmotte.net> +- Initial RPM release. + diff --git a/src/visualizations/Goom/goom2k4-0/xmms-goom/Makefile.am b/src/visualizations/Goom/goom2k4-0/xmms-goom/Makefile.am new file mode 100644 index 0000000000..8e396ccace --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/xmms-goom/Makefile.am @@ -0,0 +1,11 @@ +# the xmms plugin + +if HAVE_XMMS +xmms_lib_LTLIBRARIES = libxmmsgoom2.la +xmms_libdir = $(XMMS_VISUALIZATION_PLUGIN_DIR) +libxmmsgoom2_la_LIBADD = $(top_builddir)/src/libgoom2.la $(XMMS_LIBS) +libxmmsgoom2_la_SOURCES = xmms_goom.c +INCLUDES=-DDATADIR=\"@XMMS_DATA_DIR@\" @XMMS_CFLAGS@ -Wall -I../src/ +endif + +libxmmsgoom2_la_LDFLAGS = -module -avoid-version diff --git a/src/visualizations/Goom/goom2k4-0/xmms-goom/xmms_goom.c b/src/visualizations/Goom/goom2k4-0/xmms-goom/xmms_goom.c new file mode 100644 index 0000000000..b8bb763d7d --- /dev/null +++ b/src/visualizations/Goom/goom2k4-0/xmms-goom/xmms_goom.c @@ -0,0 +1,130 @@ +#include <glib.h> +#include "goom_config.h" + +#include <xmms/plugin.h> +#include <xmms/xmmsctrl.h> + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include <sys/time.h> +#include <sys/types.h> +#include <signal.h> +#include <string.h> + +static void plug_init (void); +static void plug_cleanup (void); +static void plug_render_pcm (gint16 data[2][512]); + +static int fd_in, fd_out; +static pid_t goom_pid = -1; + +static VisPlugin plug_vp = { + NULL, + NULL, + 0, + "What A GOOM!! " VERSION, + 2, + 0, + plug_init,/* init */ + plug_cleanup,/* cleanup */ + NULL,/* about */ + NULL,/* configure */ + NULL,/* disable_plugin */ + NULL,/* playback_start */ + NULL,/* playback_stop */ + plug_render_pcm, /* render_pcm */ + NULL /* render_freq */ +}; + +VisPlugin * +get_vplugin_info (void) +{ + return &plug_vp; +} + +static void +plug_init (void) +{ + int fd[2]; + pid_t pid; + + /* create a pipe */ + if (pipe(fd) < 0) { + fprintf (stderr, "System Error\n"); + /* TODO: en gtk? */ + return; + } + fd_in = fd[0]; + fd_out = fd[1]; + + /* load an executable */ + pid = fork(); + + /* todo look at the result */ + if (pid == 0) { + dup2(fd_in, 0); + + execlp ("goom2", "goom2", NULL, 0); + fprintf (stderr, "Unable to load goom...\n"); /* TODO: Message en gtk + check the PATH */ + exit (1); + } + if (pid == -1) { + /* erreur system : TODO -> dialog en gtk */ + } + if (goom_pid != -1) + kill (goom_pid, SIGQUIT); + goom_pid = pid; +} + +static void sendIntToGoom(int i) { + write (fd_out, &i, sizeof(int)); +} + +static void +plug_cleanup (void) +{ + sendIntToGoom(2); + kill (goom_pid, SIGQUIT); + goom_pid = -1; +} + +static void +plug_render_pcm (gint16 data[2][512]) +{ + fd_set rfds; + struct timeval tv; + int retval; + + tv.tv_sec = 0; + tv.tv_usec = 10000; + + FD_ZERO(&rfds); + FD_SET(fd_out, &rfds); + retval = select(fd_out+1, NULL, &rfds, NULL, &tv); + if (retval) { + /* send sound datas to goom */ + { + sendIntToGoom(0); + write (fd_out, &data[0][0], 512*sizeof(gint16)*2); + fsync(fd_out); + } + + /* send song title to goom */ + { + static int spos = -1; + int pos = xmms_remote_get_playlist_pos(plug_vp.xmms_session); + char title[2048]; + if (spos != pos) { + sendIntToGoom(1); + strcpy(title, xmms_remote_get_playlist_title(plug_vp.xmms_session, pos)); + write (fd_out, &title[0], 2048); + spos = pos; + } + } + } + else { + usleep(100); + } +} diff --git a/src/visualizations/Goom/goom_config.h b/src/visualizations/Goom/goom_config.h new file mode 100644 index 0000000000..6e7fef9220 --- /dev/null +++ b/src/visualizations/Goom/goom_config.h @@ -0,0 +1,12 @@ +#ifndef GOOM_CONFIG +#define GOOM_CONFIG + +#ifdef MID +#define GOOM_TEXTURE_WIDTH 256 +#define GOOM_TEXTURE_HEIGHT 256 +#else // MID +#define GOOM_TEXTURE_WIDTH 512 +#define GOOM_TEXTURE_HEIGHT 512 +#endif // MID + +#endif // GOOM_CONFIG diff --git a/src/visualizations/Goom/visualization.goom/addon.xml b/src/visualizations/Goom/visualization.goom/addon.xml new file mode 100644 index 0000000000..4e6d20a5d9 --- /dev/null +++ b/src/visualizations/Goom/visualization.goom/addon.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<addon + id="visualization.goom" + version="1.0.0" + name="Goom" + provider-name="Team XBMC"> + <extension + point="xbmc.player.musicviz" + library_linux="Goom.vis" /> + <extension point="xbmc.addon.metadata"> + <summary lang="en">Goom 2k4 Visualization</summary> + <description lang="en">The Goom 2k4 visualization supports effects like Tentacles, Flash, Stars, Fireworks, Waves, Blurs and Glows and includes a large number of trippy hypnotic effects that dance, swirl and pop with the music</description> + <platform>linux</platform> + </extension> +</addon> diff --git a/src/visualizations/Goom/visualization.goom/icon.png b/src/visualizations/Goom/visualization.goom/icon.png Binary files differnew file mode 100644 index 0000000000..5b958b37a1 --- /dev/null +++ b/src/visualizations/Goom/visualization.goom/icon.png |