linthesia-0.4.2/0000755000175000017500000000000011457640415012502 5ustar cletocletolinthesia-0.4.2/src/0000755000175000017500000000000011457636707013302 5ustar cletocletolinthesia-0.4.2/src/FileSelector.cpp0000644000175000017500000000542211312674352016355 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include #include #include "LinthesiaError.h" #include "FileSelector.h" #include "UserSettings.h" #include "StringUtil.h" using namespace std; const static char PathDelimiter = '/'; namespace FileSelector { void RequestMidiFilename(string *returned_filename, string *returned_file_title) { // Grab the filename of the last song we played // and pre-load it into the open dialog string last_filename = UserSetting::Get("last_file", ""); Gtk::FileChooserDialog dialog("Linthesia: Choose a MIDI song to play"); dialog.add_button(Gtk::StockID("gtk-open"), Gtk::RESPONSE_ACCEPT); dialog.add_button(Gtk::StockID("gtk-cancel"), Gtk::RESPONSE_CANCEL); // Try to populate our "File Open" box with the last file selected if (!last_filename.empty()) dialog.set_filename(last_filename); // If there wasn't a last file, default to the built-in Music directory else { string default_dir = UserSetting::Get("default_music_directory", ""); dialog.set_current_folder(default_dir); } // Set file filters Gtk::FileFilter filter_midi; filter_midi.set_name("MIDI files (*.mid, *.midi)"); filter_midi.add_pattern("*.mid"); filter_midi.add_pattern("*.midi"); dialog.add_filter(filter_midi); Gtk::FileFilter filter_all; filter_all.set_name("All files (*.*)"); filter_all.add_pattern("*.*"); dialog.add_filter(filter_all); int response = dialog.run(); switch (response) { case Gtk::RESPONSE_ACCEPT: string filename = dialog.get_filename(); SetLastMidiFilename(filename); if (returned_file_title) *returned_file_title = filename.substr(filename.rfind(PathDelimiter)+1); if (returned_filename) *returned_filename = filename; return; } if (returned_file_title) *returned_file_title = ""; if (returned_filename) *returned_filename = ""; } void SetLastMidiFilename(const string &filename) { UserSetting::Set("last_file", filename); } string TrimFilename(const string &filename) { // lowercase string lower = StringLower(filename); // remove extension, if known set exts; exts.insert(".mid"); exts.insert(".midi"); for (set::const_iterator i = exts.begin(); i != exts.end(); i++) { int len = i->length(); if (lower.substr(lower.length() - len, len) == *i) lower = lower.substr(0, lower.length() - len); } // remove path string::size_type i = lower.find_last_of("/"); if (i != string::npos) lower = lower.substr(i+1, lower.length()); return lower; } }; // End namespace linthesia-0.4.2/src/UserSettings.h0000644000175000017500000000112011312674352016070 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __USER_SETTINGS_H #define __USER_SETTINGS_H #include namespace UserSetting { // This must be called exactly once before any of the following will work void Initialize(const std::string &app_name); std::string Get(const std::string &setting, const std::string &default_value); void Set(const std::string &setting, const std::string &value); }; #endif // __USER_SETTINGS_H linthesia-0.4.2/src/DeviceTile.cpp0000644000175000017500000000764311316475030016015 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include "DeviceTile.h" #include "TextWriter.h" #include "Renderer.h" #include "Tga.h" const static int GraphicWidth = 36; const static int GraphicHeight = 36; DeviceTile::DeviceTile(int x, int y, int device_id, DeviceTileType type, const MidiCommDescriptionList &device_list, Tga *button_graphics, Tga *frame_graphics) : m_x(x), m_y(y), m_preview_on(false), m_device_id(device_id), m_device_list(device_list), m_tile_type(type), m_button_graphics(button_graphics), m_frame_graphics(frame_graphics) { // Initialize the size and position of each button whole_tile = ButtonState(0, 0, DeviceTileWidth, DeviceTileHeight); button_mode_left = ButtonState( 6, 38, GraphicWidth, GraphicHeight); button_mode_right = ButtonState(428, 38, GraphicWidth, GraphicHeight); button_preview = ButtonState(469, 38, GraphicWidth, GraphicHeight); } void DeviceTile::Update(const MouseInfo &translated_mouse) { // Update the mouse state of each button whole_tile.Update(translated_mouse); button_preview.Update(translated_mouse); button_mode_left.Update(translated_mouse); button_mode_right.Update(translated_mouse); if (m_device_list.size() > 0) { const int last_device = static_cast(m_device_list.size() - 1); if (button_mode_left.hit) { if (m_device_id == -1) m_device_id = last_device; else --m_device_id; } if (button_mode_right.hit) { if (m_device_id == last_device) m_device_id = -1; else ++m_device_id; } } if (button_preview.hit) m_preview_on = !m_preview_on; } int DeviceTile::LookupGraphic(TrackTileGraphic graphic, bool button_hovering) const { // There are three sets of graphics // set 0: window lit, hovering // set 1: window lit, not-hovering // set 2: window unlit, (implied not-hovering) int graphic_set = 2; if (whole_tile.hovering) graphic_set--; if (button_hovering) graphic_set--; const int set_offset = GraphicWidth * Graphic_COUNT; const int graphic_offset = GraphicWidth * graphic; return (set_offset * graphic_set) + graphic_offset; } void DeviceTile::Draw(Renderer &renderer) const { renderer.SetOffset(m_x, m_y); const Color hover = Renderer::ToColor(0xFF,0xFF,0xFF); const Color no_hover = Renderer::ToColor(0xE0,0xE0,0xE0); renderer.SetColor(whole_tile.hovering ? hover : no_hover); renderer.DrawTga(m_frame_graphics, 0, 0); // Choose the last (gray) color in the TrackTile bitmap int color_offset = GraphicHeight * Track::UserSelectableColorCount; renderer.DrawTga(m_button_graphics, BUTTON_RECT(button_mode_left), LookupGraphic(GraphicLeftArrow, button_mode_left.hovering), color_offset); renderer.DrawTga(m_button_graphics, BUTTON_RECT(button_mode_right), LookupGraphic(GraphicRightArrow, button_mode_right.hovering), color_offset); TrackTileGraphic preview_graphic = GraphicPreviewTurnOn; if (m_preview_on) preview_graphic = GraphicPreviewTurnOff; renderer.DrawTga(m_button_graphics, BUTTON_RECT(button_preview), LookupGraphic(preview_graphic, button_preview.hovering), color_offset); // Draw mode text TextWriter mode(44, 49, renderer, false, 14); if (m_device_list.size() == 0) mode << "[No Devices Found]"; else { // A -1 for device_id means "disabled" if (m_device_id >= 0) mode << m_device_list[m_device_id].name; else { switch (m_tile_type) { case DeviceTileOutput: mode << "[Output Off: Display only with no audio]"; break; case DeviceTileInput: mode << "[Input Off: Play along with no scoring]"; break; } } } renderer.ResetOffset(); } linthesia-0.4.2/src/CompatibleSystem.cpp0000644000175000017500000000222211316475030017250 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include #include #include "MidiComm.h" #include "CompatibleSystem.h" #include "StringUtil.h" #include "Version.h" using namespace std; namespace Compatible { unsigned long GetMilliseconds() { timeval tv; gettimeofday(&tv, 0); return (tv.tv_sec * 1000) + (tv.tv_usec / 1000); } void ShowError(const string &err) { const static string friendly_app_name = STRING("Linthesia " << LinthesiaVersionString); const static string message_box_title = STRING(friendly_app_name << " Error"); Gtk::MessageDialog dialog(err, false, Gtk::MESSAGE_ERROR); dialog.run(); } void HideMouseCursor() { // TODO } void ShowMouseCursor() { // TODO } int GetDisplayWidth() { return Gdk::Screen::get_default()->get_width(); } int GetDisplayHeight() { return Gdk::Screen::get_default()->get_height(); } void GracefulShutdown() { midiStop(); Gtk::Main::instance()->quit(); } }; // End namespace linthesia-0.4.2/src/TextWriter.h0000644000175000017500000000723011326126710015555 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __TEXTWRITER_H #define __TEXTWRITER_H #ifndef __cdecl #define __cdecl #endif #include #include #include #include "StringUtil.h" #include "TrackProperties.h" // A nice ostream-like class for drawing OS-specific (or OpenGL) text to the // screen in varying colors, fonts, and sizes. class TextWriter { public: // Centering only works for single-write lines... in other words, centered // lines can only be 1 color. TextWriter(int in_x, int in_y, Renderer &in_renderer, bool in_centered = false, int in_size = 12, std::string fontname = ""); // Skips at least 1 line, or the height of the last write... whichever // is greater (so that you can skip down past a multiline write) TextWriter& next_line(); // Allow manipulators TextWriter& operator<<(TextWriter& (__cdecl *_Pfn)(TextWriter&)) { (*_Pfn)(*(TextWriter *)this); return (*this); } private: TextWriter operator=(const TextWriter&); TextWriter(const TextWriter&); int get_point_size(); int point_size; int x, y, size, original_x; int last_line_height; bool centered; Renderer renderer; friend class Text; }; // Some colors to choose from, for convenience const static Color Black = { 0x00,0x00,0x00, 0xFF }; const static Color Dk_Blue = { 0x76,0xA1,0xD0, 0xFF }; const static Color Dk_Green = { 0x8A,0xE2,0x34, 0xFF }; const static Color Dk_Cyan = { 0xFF,0x80,0x00, 0xFF }; const static Color Dk_Red = { 0x00,0x00,0xC4, 0xFF }; const static Color Dk_Purple = { 0x80,0x00,0x80, 0xFF }; const static Color Brown = { 0x00,0x40,0x80, 0xFF }; const static Color Gray = { 0xBB,0xBB,0xBB, 0xFF }; const static Color Dk_Gray = { 0x55,0x55,0x55, 0xFF }; const static Color Blue = { 0xFF,0x00,0x00, 0xFF }; const static Color Green = { 0x00,0xFF,0x00, 0xFF }; const static Color Cyan = { 0xFF,0xFF,0x00, 0xFF }; const static Color Red = { 0x00,0x00,0xFF, 0xFF }; const static Color Magenta = { 0xFF,0x00,0xFF, 0xFF }; const static Color Yellow = { 0x00,0xFF,0xFF, 0xFF }; const static Color White = { 0xFF,0xFF,0xFF, 0xFF }; const static Color Orange = { 0x20,0x80,0xFF, 0xFF }; const static Color Pink = { 0xA0,0x80,0xFF, 0xFF }; const static Color CheatYellow = { 0x00,0xCC,0xFF, 0xFF }; // A class to use TextWriter, and write to the screen class Text { public: Text(std::string t, Color color) : m_color(color), m_text(t) { } Text(int i, Color color) : m_color(color), m_text(STRING(i)) { } Text(double d, int prec, Color color) : m_color(color), m_text(STRING(std::setprecision(prec) << d)) { } TextWriter& operator<<(TextWriter& tw) const; private: // This will return where the text should be drawn on // the screen (determined in an OS dependent way) and // advance the TextWriter's position by the width and/or // height of the text. void calculate_position_and_advance_cursor(TextWriter &tw, int *out_x, int *out_y) const; Color m_color; std::string m_text; }; // newline manipulator TextWriter& newline(TextWriter& tw); TextWriter& operator<<(TextWriter& tw, const Text& t); TextWriter& operator<<(TextWriter& tw, const std::string& s); TextWriter& operator<<(TextWriter& tw, const int& i); TextWriter& operator<<(TextWriter& tw, const unsigned int& i); TextWriter& operator<<(TextWriter& tw, const long& l); TextWriter& operator<<(TextWriter& tw, const unsigned long& l); #endif // __TEXTWRITER_H linthesia-0.4.2/src/StatsState.cpp0000644000175000017500000001072711314377746016111 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include "StatsState.h" #include "TrackSelectionState.h" #include "PlayingState.h" #include "Renderer.h" #include "Textures.h" #include using namespace std; void StatsState::Init() { m_back_button = ButtonState( Layout::ScreenMarginX, GetStateHeight() - Layout::ScreenMarginY/2 - Layout::ButtonHeight/2, Layout::ButtonWidth, Layout::ButtonHeight); m_continue_button = ButtonState( GetStateWidth() - Layout::ScreenMarginX - Layout::ButtonWidth, GetStateHeight() - Layout::ScreenMarginY/2 - Layout::ButtonHeight/2, Layout::ButtonWidth, Layout::ButtonHeight); } void StatsState::Update() { MouseInfo mouse = Mouse(); m_continue_button.Update(mouse); m_back_button.Update(mouse); if (IsKeyPressed(KeyEscape) || m_back_button.hit) { ChangeState(new TrackSelectionState(m_state)); return; } if (IsKeyPressed(KeyEnter) || m_continue_button.hit) { ChangeState(new PlayingState(m_state)); return; } m_tooltip = ""; if (m_back_button.hovering) m_tooltip = "Return to the track selection screen."; if (m_continue_button.hovering) m_tooltip = "Try this song again with the same settings."; } void StatsState::Draw(Renderer &renderer) const { const bool ConstrainedHeight = (GetStateHeight() < 720); int left = GetStateWidth() / 2 + 40; const int InstructionsY = ConstrainedHeight ? 120 : 263; renderer.SetColor(White); renderer.DrawTga(GetTexture(StatsText), left - 270, InstructionsY - 113); if (!ConstrainedHeight) { Layout::DrawTitle(renderer, m_state.song_title); Layout::DrawHorizontalRule(renderer, GetStateWidth(), Layout::ScreenMarginY); } Layout::DrawHorizontalRule(renderer, GetStateWidth(), GetStateHeight() - Layout::ScreenMarginY); Layout::DrawButton(renderer, m_continue_button, GetTexture(ButtonRetrySong)); Layout::DrawButton(renderer, m_back_button, GetTexture(ButtonChooseTracks)); const SongStatistics &s = m_state.stats; double hit_percent = 0.0; if (s.notes_user_could_have_played > 0) { hit_percent = 100.0 * (s.notes_user_actually_played / (s.notes_user_could_have_played * 1.0)); } string grade = "F"; if (hit_percent >= 50) grade = "D-"; if (hit_percent >= 55) grade = "D"; if (hit_percent >= 63) grade = "D+"; if (hit_percent >= 70) grade = "C-"; if (hit_percent >= 73) grade = "C"; if (hit_percent >= 77) grade = "C+"; if (hit_percent >= 80) grade = "B-"; if (hit_percent >= 83) grade = "B"; if (hit_percent >= 87) grade = "B+"; if (hit_percent >= 90) grade = "A-"; if (hit_percent >= 93) grade = "A"; if (hit_percent >= 97) grade = "A+"; if (hit_percent >= 99) grade = "A++"; if (hit_percent >= 100) grade = "A+++"; int stray_percent = 0; if (s.total_notes_user_pressed > 0) stray_percent = static_cast((100.0 * s.stray_notes) / s.total_notes_user_pressed); int average_speed = 0; if (s.notes_user_could_have_played > 0) average_speed = s.speed_integral / s.notes_user_could_have_played; // Choose a dynamic color for the grade const double p = hit_percent / 100.0; const double r = max(0.0, 1 - (p*p*p*p)); const double g = max(0.0, 1 - (((p- 1)*4)*((p- 1)*4))); const double b = max(0.0, 1 - (((p-.75)*5)*((p-.75)*5))); const Color c = Renderer::ToColor(int(r*0xFF), int(g*0xFF), int(b*0xFF)); TextWriter grade_text(left - 5, InstructionsY - 15, renderer, false, 100); grade_text << Text(grade, c); TextWriter score(left, InstructionsY + 112, renderer, false, 28); score << STRING(static_cast(s.score)); TextWriter speed(left, InstructionsY + 147, renderer, false, 28); speed << STRING(average_speed << " %"); TextWriter good(left, InstructionsY + 218, renderer, false, 28); good << STRING(s.notes_user_actually_played << " / " << s.notes_user_could_have_played << " (" << static_cast(hit_percent) << " %" << ")"); TextWriter stray(left, InstructionsY + 255, renderer, false, 28); stray << STRING(s.stray_notes << " (" << stray_percent << " %" << ")"); TextWriter combo(left, InstructionsY + 323, renderer, false, 28); combo << STRING(s.longest_combo); TextWriter tooltip(GetStateWidth() / 2, GetStateHeight() - Layout::ScreenMarginY/2 - Layout::TitleFontSize/2, renderer, true, Layout::TitleFontSize); tooltip << m_tooltip; } linthesia-0.4.2/src/StringTile.cpp0000644000175000017500000000162711314377746016075 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include "StringTile.h" #include "TextWriter.h" #include "Renderer.h" StringTile::StringTile(int x, int y, Tga *graphics) : m_x(x), m_y(y), m_graphics(graphics) { whole_tile = ButtonState(0, 0, StringTileWidth, StringTileHeight); } void StringTile::Update(const MouseInfo &translated_mouse) { whole_tile.Update(translated_mouse); } void StringTile::Draw(Renderer &renderer) const { renderer.SetOffset(m_x, m_y); const Color hover = Renderer::ToColor(0xFF, 0xFF, 0xFF); const Color no_hover = Renderer::ToColor(0xE0, 0xE0, 0xE0); renderer.SetColor(whole_tile.hovering ? hover : no_hover); renderer.DrawTga(m_graphics, 0, 0); TextWriter text(20, 46, renderer, false, 14); text << m_string; renderer.ResetOffset(); } linthesia-0.4.2/src/Tga.cpp0000644000175000017500000001275011326126710014505 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include #include #include #include "Tga.h" #include "OSGraphics.h" #include "StringUtil.h" #include "LinthesiaError.h" #ifndef GRAPHDIR #define GRAPHDIR "../graphics" #endif using namespace std; Tga* Tga::Load(const string &resource_name) { // Append extension string full_name = resource_name + ".tga"; // FIXME this! full_name = string(GRAPHDIR) + "/" + full_name; ifstream file(full_name.c_str(), ios::in|ios::binary|ios::ate); if (!file.is_open()) throw LinthesiaError("Couldn't open TGA resource (" + full_name + ")."); int size = file.tellg(); unsigned char *bytes = new unsigned char[size]; file.seekg(0, ios::beg); file.read((char*)bytes, size); file.close(); Tga *ret = LoadFromData(bytes); delete[] bytes; ret->SetSmooth(false); return ret; } void Tga::Release(Tga *tga) { if (!tga) return; glDeleteTextures(1, &tga->m_texture_id); delete tga; } const static int TgaTypeHeaderLength = 12; const static unsigned char UncompressedTgaHeader[TgaTypeHeaderLength] = {0,0,2,0,0,0,0,0,0,0,0,0}; const static unsigned char CompressedTgaHeader[TgaTypeHeaderLength] = {0,0,10,0,0,0,0,0,0,0,0,0}; void Tga::SetSmooth(bool smooth) { GLint filter = GL_NEAREST; if (smooth) filter = GL_LINEAR; glBindTexture(GL_TEXTURE_2D, m_texture_id); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter); } enum TgaType { TgaUncompressed, TgaCompressed, TgaUnknown }; Tga *Tga::LoadFromData(const unsigned char *bytes) { if (!bytes) return 0; const unsigned char *pos = bytes; TgaType type = TgaUnknown; if (memcmp(UncompressedTgaHeader, pos, TgaTypeHeaderLength) == 0) type = TgaUncompressed; if (memcmp(CompressedTgaHeader, pos, TgaTypeHeaderLength) == 0) type = TgaCompressed; if (type == TgaUnknown) throw LinthesiaError("Unsupported TGA type."); // We're done with the type header pos += TgaTypeHeaderLength; unsigned int width = pos[1] * 256 + pos[0]; unsigned int height = pos[3] * 256 + pos[2]; unsigned int bpp = pos[4]; // We're done with the data header const static int TgaDataHeaderLength = 6; pos += TgaDataHeaderLength; if (width <= 0 || height <= 0) throw LinthesiaError("Invalid TGA dimensions."); if (bpp != 24 && bpp != 32) throw LinthesiaError("Unsupported TGA BPP."); const unsigned int data_size = width * height * bpp/8; unsigned char *image_data = new unsigned char[data_size]; Tga *t = 0; if (type == TgaCompressed) t = LoadCompressed(pos, image_data, width, height, bpp); if (type == TgaUncompressed) t = LoadUncompressed(pos, image_data, data_size, width, height, bpp); delete[] image_data; return t; } Tga *Tga::LoadUncompressed(const unsigned char *src, unsigned char *dest, unsigned int size, unsigned int width, unsigned int height, unsigned int bpp) { // We can use most of the data as-is with little modification memcpy(dest, src, size); for (unsigned int cswap = 0; cswap < size; cswap += bpp/8) { dest[cswap] ^= dest[cswap+2] ^= dest[cswap] ^= dest[cswap+2]; } return BuildFromParameters(dest, width, height, bpp); } Tga *Tga::LoadCompressed(const unsigned char *src, unsigned char *dest, unsigned int width, unsigned int height, unsigned int bpp) { const unsigned char *pos = src; const unsigned int BytesPerPixel = bpp / 8; const unsigned int PixelCount = height * width; const static unsigned int MaxBytesPerPixel = 4; unsigned char pixel_buffer[MaxBytesPerPixel]; unsigned int pixel = 0; unsigned int byte = 0; while (pixel < PixelCount) { unsigned char chunkheader = 0; memcpy(&chunkheader, pos, sizeof(unsigned char)); pos += sizeof(unsigned char); if (chunkheader < 128) { chunkheader++; for (short i = 0; i < chunkheader; i++) { memcpy(pixel_buffer, pos, BytesPerPixel); pos += BytesPerPixel; dest[byte + 0] = pixel_buffer[2]; dest[byte + 1] = pixel_buffer[1]; dest[byte + 2] = pixel_buffer[0]; if (BytesPerPixel == 4) dest[byte + 3] = pixel_buffer[3]; byte += BytesPerPixel; pixel++; if (pixel > PixelCount) throw LinthesiaError("Too many pixels in TGA."); } } else { chunkheader -= 127; memcpy(pixel_buffer, pos, BytesPerPixel); pos += BytesPerPixel; for (short i = 0; i < chunkheader; i++) { dest[byte + 0] = pixel_buffer[2]; dest[byte + 1] = pixel_buffer[1]; dest[byte + 2] = pixel_buffer[0]; if (BytesPerPixel == 4) dest[byte + 3] = pixel_buffer[3]; byte += BytesPerPixel; pixel++; if (pixel > PixelCount) throw LinthesiaError("Too many pixels in TGA."); } } } return BuildFromParameters(dest, width, height, bpp); } Tga *Tga::BuildFromParameters(const unsigned char *raw, unsigned int width, unsigned int height, unsigned int bpp) { unsigned int pixel_format = 0; if (bpp == 24) pixel_format = GL_RGB; if (bpp == 32) pixel_format = GL_RGBA; TextureId id; glGenTextures(1, &id); if (!id) return 0; glBindTexture(GL_TEXTURE_2D, id); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); glTexImage2D(GL_TEXTURE_2D, 0, bpp/8, width, height, 0, pixel_format, GL_UNSIGNED_BYTE, raw); Tga *t = new Tga(); t->m_width = width; t->m_height = height; t->m_texture_id = id; return t; } linthesia-0.4.2/src/SharedState.h0000644000175000017500000000216711314377746015665 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __SHARED_STATE_H #define __SHARED_STATE_H #include #include #include "TrackProperties.h" #include "MidiComm.h" #include "libmidi/Midi.h" struct SongStatistics { SongStatistics() : total_note_count(0), notes_user_could_have_played(0), speed_integral(0), notes_user_actually_played(0), stray_notes(0), total_notes_user_pressed(0), longest_combo(0), score(0) { } int total_note_count; int notes_user_could_have_played; long speed_integral; int notes_user_actually_played; int stray_notes; int total_notes_user_pressed; int longest_combo; double score; }; struct SharedState { SharedState() : midi(0), midi_out(0), midi_in(0), song_speed(100) { } Midi *midi; MidiCommOut *midi_out; MidiCommIn *midi_in; SongStatistics stats; int song_speed; std::vector track_properties; std::string song_title; }; #endif // __SHARED_STATE_H linthesia-0.4.2/src/TrackTile.cpp0000644000175000017500000001110011316475030015641 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include "libmidi/Midi.h" #include "TrackTile.h" #include "Renderer.h" #include "Tga.h" const static int GraphicWidth = 36; const static int GraphicHeight = 36; // Only used here const static char* ModeText[Track::ModeCount] = { "Played Automatically", "You Play", "Played But Hidden", "Not Played" }; TrackTile::TrackTile(int x, int y, size_t track_id, Track::TrackColor color, Track::Mode mode) : m_x(x), m_y(y), m_mode(mode), m_color(color), m_preview_on(false), m_track_id(track_id) { // Initialize the size and position of each button whole_tile = ButtonState(0, 0, TrackTileWidth, TrackTileHeight); button_mode_left = ButtonState( 2, 68, GraphicWidth, GraphicHeight); button_mode_right = ButtonState(192, 68, GraphicWidth, GraphicHeight); button_color = ButtonState(228, 68, GraphicWidth, GraphicHeight); button_preview = ButtonState(264, 68, GraphicWidth, GraphicHeight); } void TrackTile::Update(const MouseInfo &translated_mouse) { // Update the mouse state of each button whole_tile.Update(translated_mouse); button_preview.Update(translated_mouse); button_color.Update(translated_mouse); button_mode_left.Update(translated_mouse); button_mode_right.Update(translated_mouse); if (button_mode_left.hit) { int mode = static_cast(m_mode) - 1; if (mode < 0) mode = 3; m_mode = static_cast(mode); } if (button_mode_right.hit) { int mode = static_cast(m_mode) + 1; if (mode > 3) mode = 0; m_mode = static_cast(mode); } if (button_preview.hit) m_preview_on = !m_preview_on; if (button_color.hit && m_mode != Track::ModeNotPlayed && m_mode != Track::ModePlayedButHidden) { int color = static_cast(m_color) + 1; if (color >= Track::UserSelectableColorCount) color = 0; m_color = static_cast(color); } } int TrackTile::LookupGraphic(TrackTileGraphic graphic, bool button_hovering) const { // There are three sets of graphics // set 0: window lit, hovering // set 1: window lit, not-hovering // set 2: window unlit, (implied not-hovering) int graphic_set = 2; if (whole_tile.hovering) graphic_set--; if (button_hovering) graphic_set--; const int set_offset = GraphicWidth * Graphic_COUNT; const int graphic_offset = GraphicWidth * graphic; return (set_offset * graphic_set) + graphic_offset; } void TrackTile::Draw(Renderer &renderer, const Midi *midi, Tga *buttons, Tga *box) const { const MidiTrack &track = midi->Tracks()[m_track_id]; bool gray_out_buttons = false; Color light = Track::ColorNoteWhite[m_color]; Color medium = Track::ColorNoteBlack[m_color]; if (m_mode == Track::ModePlayedButHidden || m_mode == Track::ModeNotPlayed) { gray_out_buttons = true; light = Renderer::ToColor(0xB0,0xB0,0xB0); medium = Renderer::ToColor(0x70,0x70,0x70); } Color color_tile = medium; Color color_tile_hovered = light; renderer.SetOffset(m_x, m_y); renderer.SetColor(whole_tile.hovering ? color_tile_hovered : color_tile); renderer.DrawTga(box, -10, -6); renderer.SetColor(White); // Write song info to the tile TextWriter instrument(95, 14, renderer, false, 14); instrument << track.InstrumentName(); TextWriter note_count(95, 35, renderer, false, 14); note_count << static_cast(track.Notes().size()); int color_offset = GraphicHeight * static_cast(m_color); if (gray_out_buttons) color_offset = GraphicHeight * Track::UserSelectableColorCount; renderer.DrawTga(buttons, BUTTON_RECT(button_mode_left), LookupGraphic(GraphicLeftArrow, button_mode_left.hovering), color_offset); renderer.DrawTga(buttons, BUTTON_RECT(button_mode_right), LookupGraphic(GraphicRightArrow, button_mode_right.hovering), color_offset); renderer.DrawTga(buttons, BUTTON_RECT(button_color), LookupGraphic(GraphicColor, button_color.hovering), color_offset); TrackTileGraphic preview_graphic = GraphicPreviewTurnOn; if (m_preview_on) preview_graphic = GraphicPreviewTurnOff; renderer.DrawTga(buttons, BUTTON_RECT(button_preview), LookupGraphic(preview_graphic, button_preview.hovering), color_offset); // Draw mode text TextWriter mode(42, 81, renderer, false, 12); mode << ModeText[m_mode]; renderer.ResetOffset(); } linthesia-0.4.2/src/CompatibleSystem.h0000644000175000017500000000136311312674352016726 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __COMPATIBLE_SYSTEM_H #define __COMPATIBLE_SYSTEM_H #include namespace Compatible { // Some monotonically increasing value tied to the system // clock (but not necessarily based on app-start) unsigned long GetMilliseconds(); // Shows an error box with an OK button void ShowError(const std::string &err); int GetDisplayWidth(); int GetDisplayHeight(); void HideMouseCursor(); void ShowMouseCursor(); // Send a message to terminate the application loop gracefully void GracefulShutdown(); }; #endif // __COMPATIBLE_SYSTEM_H linthesia-0.4.2/src/PlayingState.h0000644000175000017500000000327311326126710016043 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __PLAYING_STATE_H #define __PLAYING_STATE_H #include #include #include #include "libmidi/Midi.h" #include "SharedState.h" #include "GameState.h" #include "KeyboardDisplay.h" #include "MidiComm.h" struct ActiveNote { bool operator()(const ActiveNote &lhs, const ActiveNote &rhs) { if (lhs.note_id < rhs.note_id) return true; if (lhs.note_id > rhs.note_id) return false; if (lhs.channel < rhs.channel) return true; if (lhs.channel > rhs.channel) return false; return false; } NoteId note_id; unsigned char channel; int velocity; }; typedef std::set ActiveNoteSet; class PlayingState : public GameState { public: PlayingState(const SharedState &state); ~PlayingState(); protected: virtual void Init(); virtual void Update(); virtual void Draw(Renderer &renderer) const; private: int CalcKeyboardHeight() const; void SetupNoteState(); void ResetSong(); void Play(microseconds_t delta_microseconds); void Listen(); double CalculateScoreMultiplier() const; bool m_paused; bool m_show_names; KeyboardDisplay *m_keyboard; microseconds_t m_show_duration; TranslatedNoteSet m_notes; bool m_any_you_play_tracks; size_t m_look_ahead_you_play_note_count; ActiveNoteSet m_active_notes; bool m_first_update; SharedState m_state; int m_current_combo; double m_title_alpha; double m_max_allowed_title_alpha; // For octave sliding int m_note_offset; }; #endif // __PLAYING_STATE_H linthesia-0.4.2/src/TitleState.cpp0000644000175000017500000003263411326126710016057 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include "TitleState.h" #include "TrackSelectionState.h" #include "Version.h" #include "CompatibleSystem.h" #include "MenuLayout.h" #include "UserSettings.h" #include "FileSelector.h" #include "Renderer.h" #include "Textures.h" #include "GameState.h" #include "libmidi/Midi.h" #include "libmidi/MidiUtil.h" #include "MidiComm.h" using namespace std; const static string OutputDeviceKey = "last_output_device"; const static string OutputKeySpecialDisabled = "[no output device]"; const static string InputDeviceKey = "last_input_device"; const static string InputKeySpecialDisabled = "[no input device]"; TitleState::~TitleState() { if (m_output_tile) delete m_output_tile; if (m_input_tile) delete m_input_tile; if (m_file_tile) delete m_file_tile; } void TitleState::Init() { m_back_button = ButtonState( Layout::ScreenMarginX, GetStateHeight() - Layout::ScreenMarginY/2 - Layout::ButtonHeight/2, Layout::ButtonWidth, Layout::ButtonHeight); m_continue_button = ButtonState( GetStateWidth() - Layout::ScreenMarginX - Layout::ButtonWidth, GetStateHeight() - Layout::ScreenMarginY/2 - Layout::ButtonHeight/2, Layout::ButtonWidth, Layout::ButtonHeight); string last_output_device = UserSetting::Get(OutputDeviceKey, ""); string last_input_device = UserSetting::Get(InputDeviceKey, ""); // midi_out could be in one of three states right now: // 1. We just started and were passed a null MidiCommOut pointer // Or, we're returning from track selection either with: // 2. a null MidiCommOut because the user didn't want any output, or // 3. a valid MidiCommOut we constructed previously. if (!m_state.midi_out) { // Try to find the previously used device MidiCommDescriptionList devices = MidiCommOut::GetDeviceList(); MidiCommDescriptionList::const_iterator it; for (it = devices.begin(); it != devices.end(); it++) { if (it->name == last_output_device) { m_state.midi_out = new MidiCommOut(it->id); break; } } // Next, if we couldn't find a previously used device, // use the first one if (last_output_device != OutputKeySpecialDisabled && !m_state.midi_out && devices.size() > 0) m_state.midi_out = new MidiCommOut(devices[0].id); } if (!m_state.midi_in) { // Try to find the previously used device MidiCommDescriptionList devices = MidiCommIn::GetDeviceList(); MidiCommDescriptionList::const_iterator it; for (it = devices.begin(); it != devices.end(); it++) { if (it->name == last_input_device) { try { m_state.midi_in = new MidiCommIn(it->id); break; } catch (MidiErrorCode) { m_state.midi_in = 0; } } } // If we couldn't find the previously used device, // disabling by default (i.e. leaving it null) is // completely acceptable. } int output_device_id = -1; if (m_state.midi_out) { output_device_id = m_state.midi_out->GetDeviceDescription().id; m_state.midi_out->Reset(); } int input_device_id = -1; if (m_state.midi_in) { input_device_id = m_state.midi_in->GetDeviceDescription().id; m_state.midi_in->Reset(); } const bool compress_height = (GetStateHeight() < 750); const int initial_y = (compress_height ? 230 : 360); const int each_y = (compress_height ? 94 : 100); m_file_tile = new StringTile((GetStateWidth() - StringTileWidth) / 2, initial_y + each_y*0, GetTexture(SongBox)); m_file_tile->SetString(m_state.song_title); const MidiCommDescriptionList output_devices = MidiCommOut::GetDeviceList(); const MidiCommDescriptionList input_devices = MidiCommIn::GetDeviceList(); m_output_tile = new DeviceTile((GetStateWidth() - DeviceTileWidth) / 2, initial_y + each_y*1, output_device_id, DeviceTileOutput, output_devices, GetTexture(InterfaceButtons), GetTexture(OutputBox)); m_input_tile = new DeviceTile((GetStateWidth() - DeviceTileWidth) / 2, initial_y + each_y*2, input_device_id, DeviceTileInput, input_devices, GetTexture(InterfaceButtons), GetTexture(InputBox)); } void TitleState::Update() { MouseInfo mouse = Mouse(); if (m_skip_next_mouse_up) { mouse.released.left = false; m_skip_next_mouse_up = false; } m_continue_button.Update(mouse); m_back_button.Update(mouse); MouseInfo output_mouse(mouse); output_mouse.x -= m_output_tile->GetX(); output_mouse.y -= m_output_tile->GetY(); m_output_tile->Update(output_mouse); MouseInfo input_mouse(mouse); input_mouse.x -= m_input_tile->GetX(); input_mouse.y -= m_input_tile->GetY(); m_input_tile->Update(input_mouse); MouseInfo file_mouse(mouse); file_mouse.x -= m_file_tile->GetX(); file_mouse.y -= m_file_tile->GetY(); m_file_tile->Update(file_mouse); // Check to see for clicks on the file box if (m_file_tile->Hit()) { m_skip_next_mouse_up = true; if (m_state.midi_out) { m_state.midi_out->Reset(); m_output_tile->TurnOffPreview(); } Midi *new_midi = 0; string filename; string file_title; FileSelector::RequestMidiFilename(&filename, &file_title); if (filename != "") { try { new_midi = new Midi(Midi::ReadFromFile(filename)); } catch (const MidiError &e) { string description = STRING("Problem while loading file: " << file_title << "\n") + e.GetErrorDescription(); Compatible::ShowError(description); new_midi = 0; } if (new_midi) { SharedState new_state; new_state.midi = new_midi; new_state.midi_in = m_state.midi_in; new_state.midi_out = m_state.midi_out; new_state.song_title = FileSelector::TrimFilename(filename); delete m_state.midi; m_state = new_state; m_file_tile->SetString(m_state.song_title); } } } // Check to see if we need to switch to a newly selected output device int output_id = m_output_tile->GetDeviceId(); if (!m_state.midi_out || output_id != static_cast(m_state.midi_out->GetDeviceDescription().id)) { if (m_state.midi_out) m_state.midi_out->Reset(); delete m_state.midi_out; m_state.midi_out = 0; // save to user preferences if (output_id >= 0) { m_state.midi_out = new MidiCommOut(output_id); m_state.midi->Reset(0,0); UserSetting::Set(OutputDeviceKey, m_state.midi_out->GetDeviceDescription().name); } else UserSetting::Set(OutputDeviceKey, OutputKeySpecialDisabled); } if (m_state.midi_out) { if (m_output_tile->HitPreviewButton()) { m_state.midi_out->Reset(); if (m_output_tile->IsPreviewOn()) { const microseconds_t PreviewLeadIn = 250000; const microseconds_t PreviewLeadOut = 250000; m_state.midi->Reset(PreviewLeadIn, PreviewLeadOut); PlayDevicePreview(0); } } else PlayDevicePreview(static_cast(GetDeltaMilliseconds()) * 1000); } int input_id = m_input_tile->GetDeviceId(); if (!m_state.midi_in || input_id != static_cast(m_state.midi_in->GetDeviceDescription().id)) { if (m_state.midi_in) m_state.midi_in->Reset(); m_last_input_note_name = ""; delete m_state.midi_in; m_state.midi_in = 0; if (input_id >= 0) { try { m_state.midi_in = new MidiCommIn(input_id); UserSetting::Set(InputDeviceKey, m_state.midi_in->GetDeviceDescription().name); } catch (MidiErrorCode) { m_state.midi_in = 0; } } else UserSetting::Set(InputDeviceKey, InputKeySpecialDisabled); } if (m_state.midi_in && m_input_tile->IsPreviewOn()) { // Read note events to display on screen while (m_state.midi_in->KeepReading()) { MidiEvent ev = m_state.midi_in->Read(); // send to output (for a possible audio preview) if (m_state.midi_out) m_state.midi_out->Write(ev); if (ev.Type() == MidiEventType_NoteOff || ev.Type() == MidiEventType_NoteOn) { string note = MidiEvent::NoteName(ev.NoteNumber()); if (ev.Type() == MidiEventType_NoteOn && ev.NoteVelocity() > 0) m_last_input_note_name = note; else if (note == m_last_input_note_name) m_last_input_note_name = ""; } } } else m_last_input_note_name = ""; if (IsKeyPressed(KeyEscape) || m_back_button.hit) { delete m_state.midi_out; m_state.midi_out = 0; delete m_state.midi_in; m_state.midi_in = 0; delete m_state.midi; m_state.midi = 0; Compatible::GracefulShutdown(); return; } if (IsKeyPressed(KeyEnter) || m_continue_button.hit) { if (m_state.midi_out) m_state.midi_out->Reset(); if (m_state.midi_in) m_state.midi_in->Reset(); ChangeState(new TrackSelectionState(m_state)); return; } m_tooltip = ""; if (m_back_button.hovering) m_tooltip = "Click to exit Linthesia."; if (m_continue_button.hovering) m_tooltip = "Click to continue on to the track selection screen."; if (m_file_tile->WholeTile().hovering) m_tooltip = "Click to choose a different MIDI file."; if (m_input_tile->ButtonLeft().hovering) m_tooltip = "Cycle through available input devices."; if (m_input_tile->ButtonRight().hovering) m_tooltip = "Cycle through available input devices."; if (m_input_tile->ButtonPreview().hovering) { if (m_input_tile->IsPreviewOn()) m_tooltip = "Turn off test MIDI input for this device."; else m_tooltip = "Click to test your MIDI input device by playing notes."; } if (m_output_tile->ButtonLeft().hovering) m_tooltip = "Cycle through available output devices."; if (m_output_tile->ButtonRight().hovering) m_tooltip = "Cycle through available output devices."; if (m_output_tile->ButtonPreview().hovering) { if (m_output_tile->IsPreviewOn()) m_tooltip = "Turn off output test for this device."; else m_tooltip = "Click to test MIDI output on this device."; } } void TitleState::PlayDevicePreview(microseconds_t delta_microseconds) { if (!m_output_tile->IsPreviewOn()) return; if (!m_state.midi_out) return; MidiEventListWithTrackId evs = m_state.midi->Update(delta_microseconds); for (MidiEventListWithTrackId::const_iterator i = evs.begin(); i != evs.end(); ++i) { m_state.midi_out->Write(i->second); } } void TitleState::Draw(Renderer &renderer) const { const bool compress_height = (GetStateHeight() < 750); const bool compress_width = (GetStateWidth() < 850); const static int TitleWidth = 507; const static int TitleY = (compress_height ? 20 : 100); int left = GetStateWidth() / 2 - TitleWidth / 2; renderer.SetColor(White); renderer.DrawTga(GetTexture(TitleLogo), left, TitleY); // Under logo text (head) TextWriter head(left+3, TitleY + (compress_height ? 120 : 150), renderer, false, Layout::TitleFontSize); head << "Linthesia's video game music samples are provided by" << Text(" Game Music", Dk_Green); head.next_line() << Text("Themes", Dk_Green) << ". Other MIDI files are from Mutopia Project. Visit"; head.next_line() << Text("http://www.mutopiaproject.org", Dk_Blue) << " for more songs!"; TextWriter version(Layout::ScreenMarginX, GetStateHeight() - Layout::ScreenMarginY - Layout::SmallFontSize * 2, renderer, false, Layout::SmallFontSize); version << Text("version " + LinthesiaVersionString, Gray); Layout::DrawHorizontalRule(renderer, GetStateWidth(), GetStateHeight() - Layout::ScreenMarginY); Layout::DrawButton(renderer, m_continue_button, GetTexture(ButtonChooseTracks)); Layout::DrawButton(renderer, m_back_button, GetTexture(ButtonExit)); m_output_tile->Draw(renderer); m_input_tile->Draw(renderer); m_file_tile->Draw(renderer); if (m_input_tile->IsPreviewOn()) { const static int PreviewWidth = 60; const static int PreviewHeight = 40; const int x = m_input_tile->GetX() + DeviceTileWidth + 12; const int y = m_input_tile->GetY() + 38; renderer.SetColor(0xFF, 0xFF, 0xFF); renderer.DrawQuad(x, y, PreviewWidth, PreviewHeight); renderer.SetColor(0, 0, 0); renderer.DrawQuad(x+1, y+1, PreviewWidth-2, PreviewHeight-2); TextWriter last_note(x + PreviewWidth/2 - 1, m_input_tile->GetY() + 44, renderer, true, Layout::TitleFontSize); Widen w; last_note << w(m_last_input_note_name); } const int tooltip_font_size = (compress_width ? Layout::ButtonFontSize : Layout::TitleFontSize); TextWriter tooltip(GetStateWidth() / 2, GetStateHeight() - Layout::ScreenMarginY/2 - tooltip_font_size/2, renderer, true, tooltip_font_size); tooltip << m_tooltip; } linthesia-0.4.2/src/Version.h0000644000175000017500000000064011446450510015060 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __LINTHESIA_VERSION_H__ #define __LINTHESIA_VERSION_H__ #include // See CHANGELOG for a list of what has changed between versions static const std::string LinthesiaVersionString = "0.4.2"; #endif // __LINTHESIA_VERSION_H__ linthesia-0.4.2/src/MenuLayout.cpp0000644000175000017500000000207211314377746016106 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include "MenuLayout.h" #include "TextWriter.h" #include "Renderer.h" using namespace std; namespace Layout { void DrawTitle(Renderer &renderer, const string &title) { TextWriter title_writer(ScreenMarginX, ScreenMarginY - TitleFontSize - 10, renderer, false, TitleFontSize); title_writer << title; } void DrawHorizontalRule(Renderer &renderer, int state_width, int y) { renderer.SetColor(0x50, 0x50, 0x50); renderer.DrawQuad(ScreenMarginX, y - 1, state_width - 2*ScreenMarginX, 3); } void DrawButton(Renderer &renderer, const ButtonState &button, const Tga *tga) { const static Color color = Renderer::ToColor(0xE0,0xE0,0xE0); const static Color color_hover = Renderer::ToColor(0xFF,0xFF, 0xFF); renderer.SetColor(button.hovering ? color_hover : color); renderer.DrawTga(tga, button.x, button.y); } } // End namespace Layout linthesia-0.4.2/src/StatsState.h0000644000175000017500000000123311314377746015546 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __STATS_STATE_H #define __STATS_STATE_H #include "SharedState.h" #include "GameState.h" #include "MenuLayout.h" class StatsState : public GameState { public: StatsState(const SharedState &state) : m_state(state) { } protected: virtual void Init(); virtual void Update(); virtual void Draw(Renderer &renderer) const; private: ButtonState m_continue_button; ButtonState m_back_button; std::string m_tooltip; SharedState m_state; }; #endif // __STATS_STATE_H linthesia-0.4.2/src/Renderer.cpp0000644000175000017500000000713311326126710015537 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include "Renderer.h" #include "Tga.h" #include "OSGraphics.h" #include using namespace std; // These are static because OpenGL is (essentially) static static unsigned int last_texture_id = numeric_limits::max(); void SelectTexture(unsigned int texture_id) { if (texture_id == last_texture_id) return; glBindTexture(GL_TEXTURE_2D, texture_id); last_texture_id = texture_id; } Renderer::Renderer(GLContext glcontext, PGContext pangocontext) : m_xoffset(0), m_yoffset(0), m_glcontext(glcontext), m_pangocontext(pangocontext) { } Color Renderer::ToColor(int r, int g, int b, int a) { Color c; c.r = r; c.g = g; c.b = b; c.a = a; return c; } void Renderer::SwapBuffers() { m_glcontext->get_gl_drawable()->swap_buffers(); } void Renderer::ForceTexture(unsigned int texture_id) { last_texture_id = numeric_limits::max(); SelectTexture(texture_id); } void Renderer::SetColor(Color c) { SetColor(c.r, c.g, c.b, c.a); } void Renderer::SetColor(int r, int g, int b, int a) { glColor4f(r / 255.0f, g / 255.0f, b / 255.0f, a / 255.0f); } void Renderer::DrawQuad(int x, int y, int w, int h) { SelectTexture(0); glBegin(GL_QUADS); glVertex3i( x + m_xoffset, y + m_yoffset, 0); glVertex3i( x+w + m_xoffset, y + m_yoffset, 0); glVertex3i( x+w + m_xoffset, y+h + m_yoffset, 0); glVertex3i( x + m_xoffset, y+h + m_yoffset, 0); glEnd(); } void Renderer::DrawTga(const Tga *tga, int x, int y) const { DrawTga(tga, x, y, (int)tga->GetWidth(), (int)tga->GetHeight(), 0, 0); } void Renderer::DrawTga(const Tga *tga, int in_x, int in_y, int width, int height, int src_x, int src_y) const { const int x = in_x + m_xoffset; const int y = in_y + m_yoffset; const double tx = static_cast(src_x) / static_cast(tga->GetWidth()); const double ty = -static_cast(src_y) / static_cast(tga->GetHeight()); const double tw = static_cast(width) / static_cast(tga->GetWidth()); const double th = -static_cast(height)/ static_cast(tga->GetHeight()); SelectTexture(tga->GetId()); glBegin(GL_QUADS); glTexCoord2d( tx, ty); glVertex3i( x, y, 0); glTexCoord2d( tx, ty+th); glVertex3i( x, y+height, 0); glTexCoord2d(tx+tw, ty+th); glVertex3i(x+width, y+height, 0); glTexCoord2d(tx+tw, ty); glVertex3i(x+width, y, 0); glEnd(); } void Renderer::DrawStretchedTga(const Tga *tga, int x, int y, int w, int h) const { DrawStretchedTga(tga, x, y, w, h, 0, 0, (int)tga->GetWidth(), (int)tga->GetHeight()); } void Renderer::DrawStretchedTga(const Tga *tga, int x, int y, int w, int h, int src_x, int src_y, int src_w, int src_h) const { const int sx = x + m_xoffset; const int sy = y + m_yoffset; const double tx = static_cast(src_x) / static_cast(tga->GetWidth()); const double ty = -static_cast(src_y) / static_cast(tga->GetHeight()); const double tw = static_cast(src_w) / static_cast(tga->GetWidth()); const double th = -static_cast(src_h) / static_cast(tga->GetHeight()); SelectTexture(tga->GetId()); glBegin(GL_QUADS); glTexCoord2d( tx, ty); glVertex3i( sx, sy, 0); glTexCoord2d( tx, ty+th); glVertex3i( sx, sy+h, 0); glTexCoord2d(tx+tw, ty+th); glVertex3i(sx+w, sy+h, 0); glTexCoord2d(tx+tw, ty); glVertex3i(sx+w, sy, 0); glEnd(); } linthesia-0.4.2/src/KeyboardDisplay.h0000644000175000017500000001033411326126710016521 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __KEYBOARDDISPLAY_H #define __KEYBOARDDISPLAY_H #include #include #include #include "TrackTile.h" #include "TrackProperties.h" #include "libmidi/Note.h" #include "libmidi/MidiTypes.h" enum KeyboardSize { KeyboardSize37, KeyboardSize49, KeyboardSize61, KeyboardSize76, KeyboardSize88 }; typedef std::map KeyNames; class KeyboardDisplay { public: const static microseconds_t NoteWindowLength = 330000; KeyboardDisplay(KeyboardSize size, int pixelWidth, int pixelHeight); void Draw(Renderer &renderer, const Tga *key_tex[3], const Tga *note_tex[4], int x, int y, const TranslatedNoteSet ¬es, microseconds_t show_duration, microseconds_t current_time, const std::vector &track_properties, bool show_names); void SetKeyActive(const std::string &key_name, bool active, Track::TrackColor color); void ResetActiveKeys() { m_active_keys.clear(); } private: struct NoteTexDimensions { int tex_width; int tex_height; int left; int right; int crown_start; int crown_end; int heel_start; int heel_end; }; const static NoteTexDimensions WhiteNoteDimensions; const static NoteTexDimensions BlackNoteDimensions; struct KeyTexDimensions { int tex_width; int tex_height; int left; int right; int top; int bottom; }; const static KeyTexDimensions BlackKeyDimensions; void DrawWhiteKeys(Renderer &renderer, bool active_only, int key_count, int key_width, int key_height, int key_space, int x_offset, int y_offset, bool show_names) const; void DrawBlackKeys(Renderer &renderer, const Tga *tex, bool active_only, int white_key_count, int white_width, int black_width, int black_height, int key_space, int x_offset, int y_offset, int black_offset, bool show_names) const; void DrawRail(Renderer &renderer, const Tga *tex, int x, int y, int width) const; void DrawShadow(Renderer &renderer, const Tga *tex, int x, int y, int width) const; void DrawHits(Renderer &renderer, const Tga *tex, int x, int y, int white_width, int black_width, const TranslatedNoteSet ¬es, microseconds_t show_duration, microseconds_t current_time, const std::vector &track_properties) const; void DrawGuides(Renderer &renderer, int key_count, int key_width, int key_space, int x_offset, int y, int y_offset) const; void DrawNotePass(Renderer &renderer, const Tga *tex_white, const Tga *tex_black, int white_width, int key_space, int black_width, int black_offset, int x_offset, int y, int y_offset, int y_roll_under, const TranslatedNoteSet ¬es, microseconds_t show_duration, microseconds_t current_time, const std::vector &track_properties) const; // This takes the rectangle where the actual note block should appear and transforms // it to the multi-quad (with relatively complicated texture coordinates) using the // passed-in texture descriptor, and then draws the result void DrawNote(Renderer &renderer, const Tga *tex, const NoteTexDimensions &tex_dimensions, int x, int y, int w, int h, int color_id) const; // This works very much like DrawNote void DrawBlackKey(Renderer &renderer, const Tga *tex, const KeyTexDimensions &tex_dimensions, int x, int y, int w, int h, Track::TrackColor color) const; // Retrieves which white-key a piano with the given key count // will start with on the far left side char GetStartingNote() const; // Retrieves which octave a piano with the given key count // will start with on the far left side int GetStartingOctave() const; // Retrieves the number of white keys a piano with the given // key count will contain int GetWhiteKeyCount() const; KeyboardSize m_size; KeyNames m_active_keys; int m_width; int m_height; }; #endif // __KEYBOARDDISPLAY_H linthesia-0.4.2/src/MenuLayout.h0000644000175000017500000000333311316475030015537 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __MENU_LAYOUT_H #define __MENU_LAYOUT_H #include "GameState.h" #include using namespace std; struct ButtonState { ButtonState() : hovering(false), depressed(false), x(0), y(0), w(0), h(0) { } ButtonState(int x, int y, int w, int h) : hovering(false), depressed(false), x(x), y(y), w(w), h(h) { } void Update(const MouseInfo &mouse) { hovering = mouse.x > x && mouse.x < x+w && mouse.y > y && mouse.y < y+h; depressed = hovering && mouse.held.left; hit = hovering && mouse.released.left; } // Simple mouse over bool hovering; // Mouse over while (left) button is held down bool depressed; // Mouse over just as the (left) button is released bool hit; int x, y; int w, h; }; // Macro to turn replace Renderer::DrawTga()'s 4 parameters with one #define BUTTON_RECT(button) ((button).x), ((button).y), ((button).w), ((button).h) namespace Layout { void DrawTitle(Renderer &renderer, const std::string &title); void DrawHorizontalRule(Renderer &renderer, int state_width, int y); void DrawButton(Renderer &renderer, const ButtonState &button, const Tga *tga); // Pixel margin forced at edges of screen const static int ScreenMarginX = 16; const static int ScreenMarginY = 86; const static int TitleFontSize = 16; const static int ScoreFontSize = 26; const static int ButtonFontSize = 14; const static int SmallFontSize = 12; const static int ButtonWidth = 176; const static int ButtonHeight = 46; }; #endif // __MENU_LAYOUT_H linthesia-0.4.2/src/StringTile.h0000644000175000017500000000175411314377746015543 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __STRING_TILE_H #define __STRING_TILE_H #include "GameState.h" #include "MenuLayout.h" #include const int StringTileWidth = 510; const int StringTileHeight = 80; class StringTile { public: StringTile(int x, int y, Tga *graphics); void Update(const MouseInfo &translated_mouse); void Draw(Renderer &renderer) const; int GetX() const { return m_x; } int GetY() const { return m_y; } bool Hit() const { return whole_tile.hit; } void SetString(const std::string &s) { m_string = s; } void SetTitle(const std::string &s) { m_title = s; } const ButtonState WholeTile() const { return whole_tile; } private: int m_x; int m_y; Tga *m_graphics; std::string m_string; std::string m_title; ButtonState whole_tile; }; #endif // __STRING_TILE_H linthesia-0.4.2/src/TextWriter.cpp0000644000175000017500000000730611457636423016130 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include "TextWriter.h" #include "Renderer.h" #include "LinthesiaError.h" #include "OSGraphics.h" #include "UserSettings.h" #include using namespace std; // TODO: This should be deleted at shutdown static map font_size_lookup; // TODO: This should be deleted at shutdown static map font_lookup; TextWriter::TextWriter(int in_x, int in_y, Renderer &in_renderer, bool in_centered, int in_size, string fontname) : x(in_x), y(in_y), size(in_size), original_x(0), last_line_height(0), centered(in_centered), renderer(in_renderer) { x += renderer.m_xoffset; original_x = x; y += renderer.m_yoffset; point_size = size; if (font_size_lookup[size] == 0) { // Get font from user settings if (fontname.empty()) { string key = "font_desc"; fontname = UserSetting::Get(key, ""); // Or set it if there is no default if (fontname.empty()) { fontname = "Serif"; UserSetting::Set(key, fontname); } } int list_start = glGenLists(128); fontname = STRING(fontname << " " << in_size); Pango::FontDescription* font_desc = new Pango::FontDescription(fontname); Glib::RefPtr ret = Gdk::GL::Font::use_pango_font(*font_desc, 0, 128, list_start); if (ret == 0) throw LinthesiaError("An error ocurred while trying to use use_pango_font() with " "font '" + fontname + "'"); font_size_lookup[size] = list_start; font_lookup[size] = font_desc; } } int TextWriter::get_point_size() { return point_size; } TextWriter& TextWriter::next_line() { y += max(last_line_height, get_point_size()); x = original_x; last_line_height = 0; return *this; } TextWriter& Text::operator<<(TextWriter& tw) const { int draw_x; int draw_y; calculate_position_and_advance_cursor(tw, &draw_x, &draw_y); string narrow(m_text.begin(), m_text.end()); glBindTexture(GL_TEXTURE_2D, 0); glPushMatrix(); tw.renderer.SetColor(m_color); glListBase(font_size_lookup[tw.size]); glRasterPos2i(draw_x, draw_y + tw.size); glCallLists(static_cast(narrow.length()), GL_UNSIGNED_BYTE, narrow.c_str()); glPopMatrix(); // TODO: Should probably delete these on shutdown. //glDeleteLists(1000, 128); return tw; } void Text::calculate_position_and_advance_cursor(TextWriter &tw, int *out_x, int *out_y) const { Glib::RefPtr layout = Pango::Layout::create(tw.renderer.m_pangocontext); layout->set_text(m_text); layout->set_font_description(*(font_lookup[tw.size])); Pango::Rectangle drawing_rect = layout->get_pixel_logical_extents(); tw.last_line_height = drawing_rect.get_height(); if (tw.centered) *out_x = tw.x - drawing_rect.get_width() / 2; else { *out_x = tw.x; // FIXME: this size offset is not updated correctly (it differs from GL text width) tw.x += drawing_rect.get_width(); } *out_y = tw.y; } TextWriter& operator<<(TextWriter& tw, const Text& t) { return t.operator<<(tw); } TextWriter& newline(TextWriter& tw) { return tw.next_line(); } TextWriter& operator<<(TextWriter& tw, const string& s) { return tw << Text(s, White); } TextWriter& operator<<(TextWriter& tw, const int& i) { return tw << Text(i, White); } TextWriter& operator<<(TextWriter& tw, const unsigned int& i) { return tw << Text(i, White); } TextWriter& operator<<(TextWriter& tw, const long& l) { return tw << Text(l, White); } TextWriter& operator<<(TextWriter& tw, const unsigned long& l) { return tw << Text(l, White); } linthesia-0.4.2/src/Tga.h0000644000175000017500000000253011314377746014163 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __TGA_H #define __TGA_H #include typedef unsigned int TextureId; class Tga { public: static Tga *Load(const std::string &resource_name); static void Release(Tga *tga); TextureId GetId() const { return m_texture_id; } unsigned int GetWidth() const { return m_width; } unsigned int GetHeight() const { return m_height; } void SetSmooth(bool smooth); private: TextureId m_texture_id; unsigned int m_width; unsigned int m_height; Tga() { } ~Tga() { } Tga(const Tga& rhs); Tga &operator=(const Tga& rhs); static Tga *LoadFromData(const unsigned char *bytes); static Tga *LoadCompressed(const unsigned char *src, unsigned char *dest, unsigned int width, unsigned int height, unsigned int bpp); static Tga *LoadUncompressed(const unsigned char *src, unsigned char *dest, unsigned int size, unsigned int width, unsigned int height, unsigned int bpp); static Tga *BuildFromParameters(const unsigned char *data, unsigned int width, unsigned int height, unsigned int bpp); }; #endif // __TGA_H linthesia-0.4.2/src/TitleState.h0000644000175000017500000000222211326126710015512 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __TITLE_STATE_H #define __TITLE_STATE_H #include "SharedState.h" #include "GameState.h" #include "MenuLayout.h" #include "libmidi/MidiTypes.h" #include "DeviceTile.h" #include "StringTile.h" class TitleState : public GameState { public: // You can pass 0 in for state.midi_out to have the title // screen pick a device for you. TitleState(const SharedState &state) : m_state(state), m_output_tile(0), m_input_tile(0), m_file_tile(0), m_skip_next_mouse_up(false) { } ~TitleState(); protected: virtual void Init(); virtual void Update(); virtual void Draw(Renderer &renderer) const; private: void PlayDevicePreview(microseconds_t delta_microseconds); ButtonState m_continue_button; ButtonState m_back_button; SharedState m_state; std::string m_last_input_note_name; std::string m_tooltip; DeviceTile *m_output_tile; DeviceTile *m_input_tile; StringTile *m_file_tile; bool m_skip_next_mouse_up; }; #endif // __TITLE_STATE_H linthesia-0.4.2/src/libmidi/0000755000175000017500000000000011457636707014713 5ustar cletocletolinthesia-0.4.2/src/libmidi/MidiUtil.h0000644000175000017500000000700211312674352016567 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __MIDI_UTILS_H #define __MIDI_UTILS_H #include #include // Handy string macros #ifndef STRING #include #define STRING(v) ((static_cast(std::ostringstream().flush() << v)).str()) #endif // Cross-platform Endian conversion functions // // MIDI is big endian. Some platforms aren't unsigned long BigToSystem32(unsigned long x); unsigned short BigToSystem16(unsigned short x); // MIDI contains these wacky variable length numbers where // the value is stored only in the first 7 bits of each // byte, and the last bit is a kind of "keep going" flag. unsigned long parse_variable_length(std::istream &in); const static int InstrumentCount = 130; const static int InstrumentIdVarious = InstrumentCount - 1; const static int InstrumentIdPercussion = InstrumentCount - 2; extern std::string const InstrumentNames[InstrumentCount]; enum MidiErrorCode { MidiError_BadFilename, MidiError_NoHeader, MidiError_UnknownHeaderType, MidiError_BadHeaderSize, MidiError_Type2MidiNotSupported, MidiError_BadType0Midi, MidiError_SMTPETimingNotImplemented, MidiError_TrackHeaderTooShort, MidiError_BadTrackHeaderType, MidiError_TrackTooShort, MidiError_BadTrackEnd, MidiError_EventTooShort, MidiError_UnknownEventType, MidiError_UnknownMetaEventType, // MMSYSTEM Errors for MIDI I/O MidiError_MM_NoDevice, MidiError_MM_NotEnabled, MidiError_MM_AlreadyAllocated, MidiError_MM_BadDeviceID, MidiError_MM_InvalidParameter, MidiError_MM_NoDriver, MidiError_MM_NoMemory, MidiError_MM_Unknown, MidiError_NoInputAvailable, MidiError_MetaEventOnInput, MidiError_InputError, MidiError_InvalidInputErrorBehavior, MidiError_RequestedTempoFromNonTempoEvent }; class MidiError : public std::exception { public: MidiError(MidiErrorCode error) : m_error(error) { } std::string GetErrorDescription() const; const MidiErrorCode m_error; private: MidiError operator =(const MidiError&); }; enum MidiEventType { MidiEventType_Meta, MidiEventType_SysEx, MidiEventType_Unknown, MidiEventType_NoteOff, MidiEventType_NoteOn, MidiEventType_Aftertouch, MidiEventType_Controller, MidiEventType_ProgramChange, MidiEventType_ChannelPressure, MidiEventType_PitchWheel }; std::string GetMidiEventTypeDescription(MidiEventType type); enum MidiMetaEventType { MidiMetaEvent_SequenceNumber = 0x00, MidiMetaEvent_Text = 0x01, MidiMetaEvent_Copyright = 0x02, MidiMetaEvent_TrackName = 0x03, MidiMetaEvent_Instrument = 0x04, MidiMetaEvent_Lyric = 0x05, MidiMetaEvent_Marker = 0x06, MidiMetaEvent_Cue = 0x07, MidiMetaEvent_PatchName = 0x08, MidiMetaEvent_DeviceName = 0x09, MidiMetaEvent_EndOfTrack = 0x2F, MidiMetaEvent_TempoChange = 0x51, MidiMetaEvent_SMPTEOffset = 0x54, MidiMetaEvent_TimeSignature = 0x58, MidiMetaEvent_KeySignature = 0x59, MidiMetaEvent_Proprietary = 0x7F, // Deprecated Meta Events MidiMetaEvent_ChannelPrefix = 0x20, MidiMetaEvent_MidiPort = 0x21, MidiMetaEvent_Unknown = 0xFF }; // Returns a human-readable description of this meta type // type type of the text ought to contain in // this event. (e.g. Copyright, Lyric, Track name, etc.) // (If this isn't a meta event, returns an empty string) std::string GetMidiMetaEventTypeDescription(MidiMetaEventType type); #endif linthesia-0.4.2/src/libmidi/Note.h0000644000175000017500000000325511312674352015762 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __MIDI_NOTE_H #define __MIDI_NOTE_H #include #include "MidiTypes.h" // Range of all 128 MIDI notes possible typedef unsigned int NoteId; // Arbitrary value outside the usual range const static NoteId InvalidNoteId = 2048; enum NoteState { AutoPlayed, UserPlayable, UserHit, UserMissed }; template struct GenericNote { bool operator()(const GenericNote &lhs, const GenericNote &rhs) const { if (lhs.start < rhs.start) return true; if (lhs.start > rhs.start) return false; if (lhs.end < rhs.end) return true; if (lhs.end > rhs.end) return false; if (lhs.note_id < rhs.note_id) return true; if (lhs.note_id > rhs.note_id) return false; if (lhs.track_id < rhs.track_id) return true; if (lhs.track_id > rhs.track_id) return false; return false; } T start; T end; NoteId note_id; size_t track_id; // We have to drag a little extra info around so we can // play the user's input correctly unsigned char channel; int velocity; NoteState state; }; // Note keeps the internal pulses found in the MIDI file which are // independent of tempo or playback speed. TranslatedNote contains // the exact (translated) microsecond that notes start and stop on // based on a given playback speed, after dereferencing tempo changes. typedef GenericNote Note; typedef GenericNote TranslatedNote; typedef std::set NoteSet; typedef std::set TranslatedNoteSet; #endif linthesia-0.4.2/src/libmidi/MidiTrack.h0000644000175000017500000000500111312674352016713 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __MIDI_TRACK_H #define __MIDI_TRACK_H #include #include #include "Note.h" #include "MidiEvent.h" #include "MidiUtil.h" class MidiEvent; typedef std::vector MidiEventList; typedef std::vector MidiEventPulsesList; typedef std::vector MidiEventMicrosecondList; class MidiTrack { public: static MidiTrack ReadFromStream(std::istream &stream); static MidiTrack CreateBlankTrack() { return MidiTrack(); } MidiEventList &Events() { return m_events; } MidiEventPulsesList &EventPulses() { return m_event_pulses; } MidiEventMicrosecondList &EventUsecs() { return m_event_usecs; } const MidiEventList &Events() const { return m_events; } const MidiEventPulsesList &EventPulses() const { return m_event_pulses; } const MidiEventMicrosecondList &EventUsecs() const { return m_event_usecs; } void SetEventUsecs(const MidiEventMicrosecondList &event_usecs) { m_event_usecs = event_usecs; } const std::string InstrumentName() const { return InstrumentNames[m_instrument_id]; } bool IsPercussion() const { return m_instrument_id == InstrumentIdPercussion; } const NoteSet &Notes() const { return m_note_set; } void SetTrackId(size_t track_id); // Reports whether this track contains any Note-On MIDI events // (vs. just being an information track with a title or copyright) bool hasNotes() const { return (m_note_set.size() > 0); } void Reset(); MidiEventList Update(microseconds_t delta_microseconds); unsigned int AggregateEventsRemain() const { return static_cast(m_events.size() - (m_last_event + 1)); } unsigned int AggregateEventCount() const { return static_cast(m_events.size()); } unsigned int AggregateNotesRemain() const { return m_notes_remaining; } unsigned int AggregateNoteCount() const { return static_cast(m_note_set.size()); } private: MidiTrack() : m_instrument_id(0) { Reset(); } void BuildNoteSet(); void DiscoverInstrument(); MidiEventList m_events; MidiEventPulsesList m_event_pulses; MidiEventMicrosecondList m_event_usecs; NoteSet m_note_set; int m_instrument_id; microseconds_t m_running_microseconds; long m_last_event; unsigned int m_notes_remaining; }; #endif linthesia-0.4.2/src/libmidi/MidiEvent.cpp0000644000175000017500000002026011312674352017267 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include "MidiEvent.h" #include "MidiUtil.h" #include "Note.h" using namespace std; MidiEvent MidiEvent::ReadFromStream(istream &stream, unsigned char last_status, bool contains_delta_pulses) { MidiEvent ev; if (contains_delta_pulses) ev.m_delta_pulses = parse_variable_length(stream); else ev.m_delta_pulses = 0; // MIDI uses a compression mechanism called "running status". // Anytime you read a status byte that doesn't have the highest- // order bit set, what you actually read is the 1st data byte // of a message with the status of the previous message. ev.m_status = static_cast(stream.peek()); if ((ev.m_status & 0x80) == 0) ev.m_status = last_status; else // It was a status byte after all, just read past it // in the stream stream.read(reinterpret_cast(&ev.m_status), sizeof(unsigned char)); switch (ev.Type()) { case MidiEventType_Meta: ev.ReadMeta(stream); break; case MidiEventType_SysEx: ev.ReadSysEx(stream); break; default: ev.ReadStandard(stream); break; } return ev; } MidiEvent MidiEvent::Build(const MidiEventSimple &simple) { MidiEvent ev; ev.m_delta_pulses = 0; ev.m_status = simple.status; ev.m_data1 = simple.byte1; ev.m_data2 = simple.byte2; if (ev.Type() == MidiEventType_Meta) throw MidiError(MidiError_MetaEventOnInput); return ev; } MidiEvent MidiEvent::NullEvent() { MidiEvent ev; ev.m_status = 0xFF; ev.m_meta_type = MidiMetaEvent_Proprietary; ev.m_delta_pulses = 0; return ev; } void MidiEvent::ReadMeta(istream &stream) { stream.read(reinterpret_cast(&m_meta_type), sizeof(unsigned char)); unsigned long meta_length = parse_variable_length(stream); char *buffer = new char[meta_length + 1]; buffer[meta_length] = 0; stream.read(buffer, meta_length); if (stream.fail()) { delete[] buffer; throw MidiError(MidiError_EventTooShort); } switch (m_meta_type) { case MidiMetaEvent_Text: case MidiMetaEvent_Copyright: case MidiMetaEvent_TrackName: case MidiMetaEvent_Instrument: case MidiMetaEvent_Lyric: case MidiMetaEvent_Marker: case MidiMetaEvent_Cue: case MidiMetaEvent_PatchName: case MidiMetaEvent_DeviceName: m_text = string(buffer, meta_length); break; case MidiMetaEvent_TempoChange: { if (meta_length < 3) throw MidiError(MidiError_EventTooShort); // We have to convert to unsigned char first for some reason or the // conversion gets all wacky and tries to look at more than just its // one byte at a time. unsigned int b0 = static_cast(buffer[0]); unsigned int b1 = static_cast(buffer[1]); unsigned int b2 = static_cast(buffer[2]); m_tempo_uspqn = (b0 << 16) + (b1 << 8) + b2; break; } case MidiMetaEvent_SequenceNumber: case MidiMetaEvent_EndOfTrack: case MidiMetaEvent_SMPTEOffset: case MidiMetaEvent_TimeSignature: case MidiMetaEvent_KeySignature: case MidiMetaEvent_Proprietary: case MidiMetaEvent_ChannelPrefix: case MidiMetaEvent_MidiPort: // NOTE: We would have to keep all of this around if we // wanted to reproduce 1:1 MIDIs between file Save/Load break; default: delete[] buffer; throw MidiError(MidiError_UnknownMetaEventType); } delete[] buffer; } void MidiEvent::ReadSysEx(istream &stream) { // NOTE: We would have to keep SysEx events around if we // wanted to reproduce 1:1 MIDIs between file Save/Load unsigned long sys_ex_length = parse_variable_length(stream); // Discard char *buffer = new char[sys_ex_length]; stream.read(buffer, sys_ex_length); delete[] buffer; } void MidiEvent::ReadStandard(istream &stream) { switch (Type()) { case MidiEventType_NoteOff: case MidiEventType_NoteOn: case MidiEventType_Aftertouch: case MidiEventType_Controller: case MidiEventType_PitchWheel: stream.read(reinterpret_cast(&m_data1), sizeof(unsigned char)); stream.read(reinterpret_cast(&m_data2), sizeof(unsigned char)); break; case MidiEventType_ProgramChange: case MidiEventType_ChannelPressure: stream.read(reinterpret_cast(&m_data1), sizeof(unsigned char)); m_data2 = 0; break; default: throw MidiError(MidiError_UnknownEventType); } } bool MidiEvent::GetSimpleEvent(MidiEventSimple *simple) const { MidiEventType t = Type(); if (t == MidiEventType_Meta || t == MidiEventType_SysEx || t == MidiEventType_Unknown) return false; simple->status = m_status; simple->byte1 = m_data1; simple->byte2 = m_data2; return true; } MidiEventType MidiEvent::Type() const { if (m_status > 0xEF && m_status < 0xFF) return MidiEventType_SysEx; if (m_status < 0x80) return MidiEventType_Unknown; if (m_status == 0xFF) return MidiEventType_Meta; // The 0x8_ through 0xE_ events contain channel numbers // in the lowest 4 bits unsigned char status_top = m_status >> 4; switch (status_top) { case 0x8: return MidiEventType_NoteOff; case 0x9: return MidiEventType_NoteOn; case 0xA: return MidiEventType_Aftertouch; case 0xB: return MidiEventType_Controller; case 0xC: return MidiEventType_ProgramChange; case 0xD: return MidiEventType_ChannelPressure; case 0xE: return MidiEventType_PitchWheel; default: return MidiEventType_Unknown; } } MidiMetaEventType MidiEvent::MetaType() const { if (Type() != MidiEventType_Meta) return MidiMetaEvent_Unknown; return static_cast(m_meta_type); } bool MidiEvent::IsEnd() const { return (Type() == MidiEventType_Meta && MetaType() == MidiMetaEvent_EndOfTrack); } unsigned char MidiEvent::Channel() const { // The channel is held in the lower nibble of the status code return (m_status & 0x0F); } void MidiEvent::SetChannel(unsigned char channel) { if (channel > 15) return; // Clear out the old channel m_status = m_status & 0xF0; // Set the new channel m_status = m_status | channel; } void MidiEvent::SetVelocity(int velocity) { if (Type() != MidiEventType_NoteOn) return; m_data2 = static_cast(velocity); } bool MidiEvent::HasText() const { if (Type() != MidiEventType_Meta) return false; switch (m_meta_type) { case MidiMetaEvent_Text: case MidiMetaEvent_Copyright: case MidiMetaEvent_TrackName: case MidiMetaEvent_Instrument: case MidiMetaEvent_Lyric: case MidiMetaEvent_Marker: case MidiMetaEvent_Cue: case MidiMetaEvent_PatchName: case MidiMetaEvent_DeviceName: return true; default: return false; } } NoteId MidiEvent::NoteNumber() const { if (Type() != MidiEventType_NoteOn && Type() != MidiEventType_NoteOff) return 0; return m_data1; } void MidiEvent::ShiftNote(int shift_amount) { if (Type() != MidiEventType_NoteOn && Type() != MidiEventType_NoteOff) return; m_data1 = m_data1 + static_cast(shift_amount); } int MidiEvent::ProgramNumber() const { if (Type() != MidiEventType_ProgramChange) return 0; return m_data1; } string MidiEvent::NoteName(unsigned int note_number) { // Music domain knowledge const static unsigned int NotesPerOctave = 12; const static string NoteBases[NotesPerOctave] = { STRING("C"), STRING("C#"), STRING("D"), STRING("D#"), STRING("E"), STRING("F"), STRING("F#"), STRING("G"), STRING("G#"), STRING("A"), STRING("A#"), STRING("B") }; unsigned int octave = (note_number / NotesPerOctave); const string note_base = NoteBases[note_number % NotesPerOctave]; return STRING(note_base << octave); } int MidiEvent::NoteVelocity() const { if (Type() == MidiEventType_NoteOff) return 0; if (Type() != MidiEventType_NoteOn) return -1; return static_cast(m_data2); } string MidiEvent::Text() const { if (!HasText()) return ""; return m_text; } unsigned long MidiEvent::GetTempoInUsPerQn() const { if (Type() != MidiEventType_Meta || MetaType() != MidiMetaEvent_TempoChange) throw MidiError(MidiError_RequestedTempoFromNonTempoEvent); return m_tempo_uspqn; } linthesia-0.4.2/src/libmidi/MidiUtil.cpp0000644000175000017500000001754111312674352017133 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include #include "MidiUtil.h" using namespace std; unsigned long BigToSystem32(unsigned long x) { return ntohl(x); } unsigned short BigToSystem16(unsigned short x) { return ntohs(x); } unsigned long parse_variable_length(istream &in) { register unsigned long value = in.get(); if (in.good() && (value & 0x80) ) { value &= 0x7F; register unsigned long c; do { c = in.get(); value = (value << 7) + (c & 0x7F); } while (in.good() && (c & 0x80) ); } return(value); } string MidiError::GetErrorDescription() const { switch (m_error) { case MidiError_UnknownHeaderType: return "Found an unknown header type.\n\nThis probably isn't a valid MIDI file."; case MidiError_BadFilename: return "Could not open file for input. Check that file exists."; case MidiError_NoHeader: return "No MIDI header could be read. File too short."; case MidiError_BadHeaderSize: return "Incorrect header size."; case MidiError_Type2MidiNotSupported: return "Type 2 MIDI is not supported."; case MidiError_BadType0Midi: return "Type 0 MIDI should only have 1 track."; case MidiError_SMTPETimingNotImplemented: return "MIDI using SMTP time division is not implemented."; case MidiError_BadTrackHeaderType: return "Found an unknown track header type."; case MidiError_TrackHeaderTooShort: return "File terminated before reading track header."; case MidiError_TrackTooShort: return "Data stream too short to read entire track."; case MidiError_BadTrackEnd: return "MIDI track did not end with End-Of-Track event."; case MidiError_EventTooShort: return "Data stream ended before reported end of MIDI event."; case MidiError_UnknownEventType: return "Found an unknown MIDI Event Type."; case MidiError_UnknownMetaEventType: return "Found an unknown MIDI Meta Event Type."; case MidiError_MM_NoDevice: return "Could not open the specified MIDI device."; case MidiError_MM_NotEnabled: return "MIDI device failed enable."; case MidiError_MM_AlreadyAllocated: return "The specified MIDI device is already in use."; case MidiError_MM_BadDeviceID: return "The MIDI device ID specified is out of range."; case MidiError_MM_InvalidParameter: return "An invalid parameter was used with the MIDI device."; case MidiError_MM_NoDriver: return "The specified MIDI driver is not installed."; case MidiError_MM_NoMemory: return "Cannot allocate or lock memory for MIDI device."; case MidiError_MM_Unknown: return "An unknown MIDI I/O error has occurred."; case MidiError_NoInputAvailable: return "Attempted to read MIDI event from an empty input buffer."; case MidiError_MetaEventOnInput: return "MIDI Input device sent a Meta Event."; case MidiError_InputError: return "MIDI input driver reported an error."; case MidiError_InvalidInputErrorBehavior: return "Invalid InputError value. Choices are 'report', 'ignore', and 'use'."; case MidiError_RequestedTempoFromNonTempoEvent: return "Tempo data was requested from a non-tempo MIDI event."; default: return STRING("Unknown MidiError Code (" << m_error << ")."); } } string GetMidiEventTypeDescription(MidiEventType type) { switch (type) { case MidiEventType_Meta: return "Meta"; case MidiEventType_SysEx: return "System Exclusive"; case MidiEventType_NoteOff: return "Note-Off"; case MidiEventType_NoteOn: return "Note-On"; case MidiEventType_Aftertouch: return "Aftertouch"; case MidiEventType_Controller: return "Controller"; case MidiEventType_ProgramChange: return "Program Change"; case MidiEventType_ChannelPressure: return "Channel Pressure"; case MidiEventType_PitchWheel: return "Pitch Wheel"; case MidiEventType_Unknown: return "Unknown"; default: return "BAD EVENT TYPE"; } } string GetMidiMetaEventTypeDescription(MidiMetaEventType type) { switch (type) { case MidiMetaEvent_SequenceNumber: return "Sequence Number"; case MidiMetaEvent_Text: return "Text"; case MidiMetaEvent_Copyright: return "Copyright"; case MidiMetaEvent_TrackName: return "Track Name"; case MidiMetaEvent_Instrument: return "Instrument"; case MidiMetaEvent_Lyric: return "Lyric"; case MidiMetaEvent_Marker: return "Marker"; case MidiMetaEvent_Cue: return "Cue Point"; case MidiMetaEvent_PatchName: return "Patch Name"; case MidiMetaEvent_DeviceName: return "Device Name"; case MidiMetaEvent_EndOfTrack: return "End Of Track"; case MidiMetaEvent_TempoChange: return "Tempo Change"; case MidiMetaEvent_SMPTEOffset: return "SMPTE Offset"; case MidiMetaEvent_TimeSignature: return "Time Signature"; case MidiMetaEvent_KeySignature: return "Key Signature"; case MidiMetaEvent_Proprietary: return "Proprietary"; case MidiMetaEvent_ChannelPrefix: return "(Deprecated) Channel Prefix"; case MidiMetaEvent_MidiPort: return "(Deprecated) MIDI Port"; case MidiMetaEvent_Unknown: return "Unknown Meta Event Type"; default: return "BAD META EVENT TYPE"; } } string const InstrumentNames[InstrumentCount] = { "Acoustic Grand Piano", "Bright Acoustic Piano", "Electric Grand Piano", "Honky-tonk Piano", "Electric Piano 1", "Electric Piano 2", "Harpsichord", "Clavi", "Celesta", "Glockenspiel", "Music Box", "Vibraphone", "Marimba", "Xylophone", "Tubular Bells", "Dulcimer", "Drawbar Organ", "Percussive Organ", "Rock Organ", "Church Organ", "Reed Organ", "Accordion", "Harmonica", "Tango Accordion", "Acoustic Guitar (nylon)", "Acoustic Guitar (steel)", "Electric Guitar (jazz)", "Electric Guitar (clean)", "Electric Guitar (muted)", "Overdriven Guitar", "Distortion Guitar", "Guitar harmonics", "Acoustic Bass", "Electric Bass (finger)", "Electric Bass (pick)", "Fretless Bass", "Slap Bass 1", "Slap Bass 2", "Synth Bass 1", "Synth Bass 2", "Violin", "Viola", "Cello", "Contrabass", "Tremolo Strings", "Pizzicato Strings", "Orchestral Harp", "Timpani", "String Ensemble 1", "String Ensemble 2", "SynthStrings 1", "SynthStrings 2", "Choir Aahs", "Voice Oohs", "Synth Voice", "Orchestra Hit", "Trumpet", "Trombone", "Tuba", "Muted Trumpet", "French Horn", "Brass Section", "SynthBrass 1", "SynthBrass 2", "Soprano Sax", "Alto Sax", "Tenor Sax", "Baritone Sax", "Oboe", "English Horn", "Bassoon", "Clarinet", "Piccolo", "Flute", "Recorder", "Pan Flute", "Blown Bottle", "Shakuhachi", "Whistle", "Ocarina", "Lead 1 (square)", "Lead 2 (sawtooth)", "Lead 3 (calliope)", "Lead 4 (chiff)", "Lead 5 (charang)", "Lead 6 (voice)", "Lead 7 (fifths)", "Lead 8 (bass + lead)", "Pad 1 (new age)", "Pad 2 (warm)", "Pad 3 (polysynth)", "Pad 4 (choir)", "Pad 5 (bowed)", "Pad 6 (metallic)", "Pad 7 (halo)", "Pad 8 (sweep)", "FX 1 (rain)", "FX 2 (soundtrack)", "FX 3 (crystal)", "FX 4 (atmosphere)", "FX 5 (brightness)", "FX 6 (goblins)", "FX 7 (echoes)", "FX 8 (sci-fi)", "Sitar", "Banjo", "Shamisen", "Koto", "Kalimba", "Bag pipe", "Fiddle", "Shanai", "Tinkle Bell", "Agogo", "Steel Drums", "Woodblock", "Taiko Drum", "Melodic Tom", "Synth Drum", "Reverse Cymbal", "Guitar Fret Noise", "Breath Noise", "Seashore", "Bird Tweet", "Telephone Ring", "Helicopter", "Applause", "Gunshot", // // NOTE: These aren't actually General MIDI instruments! // "Percussion", // for Tracks that use Channel 10 or 16 "Various" // for Tracks that use more than one }; linthesia-0.4.2/src/libmidi/MidiEvent.h0000644000175000017500000000651511312674352016743 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __MIDI_EVENT_H #define __MIDI_EVENT_H #include #include #include "Note.h" #include "MidiUtil.h" struct MidiEventSimple { MidiEventSimple() : status(0), byte1(0), byte2(0) { } MidiEventSimple(unsigned char s, unsigned char b1, unsigned char b2) : status(s), byte1(b1), byte2(b2) { } unsigned char status; unsigned char byte1; unsigned char byte2; }; class MidiEvent { public: static MidiEvent ReadFromStream(std::istream &stream, unsigned char last_status, bool contains_delta_pulses = true); static MidiEvent Build(const MidiEventSimple &simple); static MidiEvent NullEvent(); // NOTE: There is a VERY good chance you don't want to use this directly. // The only reason it's not private is because the standard containers // require a default constructor. MidiEvent() : m_status(0), m_data1(0), m_data2(0), m_tempo_uspqn(0) { } // Returns true if the event could be expressed in a simple event. (So, // this will return false for Meta and SysEx events.) bool GetSimpleEvent(MidiEventSimple *simple) const; MidiEventType Type() const; unsigned long GetDeltaPulses() const { return m_delta_pulses; } // This is generally for internal Midi library use only. void SetDeltaPulses(unsigned long delta_pulses) { m_delta_pulses = delta_pulses; } void ShiftNote(int shift_amount); NoteId NoteNumber() const; // Returns a friendly name for this particular Note-On or Note- // Off event. (e.g. "A#2") Returns empty string on other types // of events. static std::string NoteName(NoteId note_number); // Returns the "Program to change to" value if this is a Program // Change event, 0 otherwise. int ProgramNumber() const; // Returns the "velocity" of a Note-On (or 0 if this is a Note- // Off event). Returns -1 for other event types. int NoteVelocity() const; void SetVelocity(int velocity); // Returns which type of meta event this is (or // MetaEvent_Unknown if type() is not EventType_Meta). MidiMetaEventType MetaType() const; // Retrieve the tempo from a tempo meta event in microseconds // per quarter note. (Non-meta-tempo events will throw an error). unsigned long GetTempoInUsPerQn() const; // Convenience function: Is this the special End-Of-Track event bool IsEnd() const; // Returns which channel this event operates on. This is // only defined for standard MIDI events that require a // channel argument. unsigned char Channel() const; void SetChannel(unsigned char channel); // Does this event type allow arbitrary text bool HasText() const; // Returns the text content of the event (or empty-string if // this isn't a text event.) std::string Text() const; // Returns the status code of the MIDI event unsigned char StatusCode() const { return m_status; } private: void ReadMeta(std::istream &stream); void ReadSysEx(std::istream &stream); void ReadStandard(std::istream &stream); unsigned char m_status; unsigned char m_data1; unsigned char m_data2; unsigned long m_delta_pulses; unsigned char m_meta_type; unsigned long m_tempo_uspqn; std::string m_text; }; #endif // __MIDI_EVENT_H linthesia-0.4.2/src/libmidi/Midi.cpp0000644000175000017500000003572611312674352016302 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include "Midi.h" #include "MidiEvent.h" #include "MidiTrack.h" #include "MidiUtil.h" #include #include using namespace std; Midi Midi::ReadFromFile(const string &filename) { fstream file(filename.c_str(), ios::in | ios::binary); if (!file.good()) throw MidiError(MidiError_BadFilename); Midi m; try { m = ReadFromStream(file); } catch (const MidiError &e) { // Close our file resource before handing the error up file.close(); throw e; } return m; } Midi Midi::ReadFromStream(istream &stream) { Midi m; // header_id is always "MThd" by definition const static string MidiFileHeader = "MThd"; const static string RiffFileHeader = "RIFF"; // I could use (MidiFileHeader.length() + 1), but then this has to be // dynamically allocated. More hassle than it's worth. MIDI is well // defined and will always have a 4-byte header. We use 5 so we get // free null termination. char header_id[5] = { 0, 0, 0, 0, 0 }; unsigned long header_length; unsigned short format; unsigned short track_count; unsigned short time_division; stream.read(header_id, static_cast(MidiFileHeader.length())); string header(header_id); if (header != MidiFileHeader) { if (header != RiffFileHeader) throw MidiError(MidiError_UnknownHeaderType); else { // We know how to support RIFF files unsigned long throw_away; stream.read(reinterpret_cast(&throw_away), sizeof(unsigned long)); // RIFF length stream.read(reinterpret_cast(&throw_away), sizeof(unsigned long)); // "RMID" stream.read(reinterpret_cast(&throw_away), sizeof(unsigned long)); // "data" stream.read(reinterpret_cast(&throw_away), sizeof(unsigned long)); // data size // Call this recursively, without the RIFF header this time return ReadFromStream(stream); } } stream.read(reinterpret_cast(&header_length), sizeof(unsigned long)); stream.read(reinterpret_cast(&format), sizeof(unsigned short)); stream.read(reinterpret_cast(&track_count), sizeof(unsigned short)); stream.read(reinterpret_cast(&time_division), sizeof(unsigned short)); if (stream.fail()) throw MidiError(MidiError_NoHeader); // Chunk Size is always 6 by definition const static unsigned int MidiFileHeaderChunkLength = 6; header_length = BigToSystem32(header_length); if (header_length != MidiFileHeaderChunkLength) throw MidiError(MidiError_BadHeaderSize); enum MidiFormat { MidiFormat0 = 0, MidiFormat1, MidiFormat2 }; format = BigToSystem16(format); if (format == MidiFormat2) { // MIDI 0: All information in 1 track // MIDI 1: Multiple tracks intended to be played simultaneously // MIDI 2: Multiple tracks intended to be played separately // // We do not support MIDI 2 at this time throw MidiError(MidiError_Type2MidiNotSupported); } track_count = BigToSystem16(track_count); if (format == 0 && track_count != 1) // MIDI 0 has only 1 track by definition throw MidiError(MidiError_BadType0Midi); // Time division can be encoded two ways based on a bit-flag: // - pulses per quarter note (15-bits) // - SMTPE frames per second (7-bits for SMPTE frame count and 8-bits for clock ticks per frame) time_division = BigToSystem16(time_division); bool in_smpte = ((time_division & 0x8000) != 0); if (in_smpte) throw MidiError(MidiError_SMTPETimingNotImplemented); // We ignore the possibility of SMPTE timing, so we can // use the time division value directly as PPQN. unsigned short pulses_per_quarter_note = time_division; // Read in our tracks for (int i = 0; i < track_count; ++i) { m.m_tracks.push_back(MidiTrack::ReadFromStream(stream)); } m.BuildTempoTrack(); // Tell our tracks their IDs for (int i = 0; i < track_count; ++i) { m.m_tracks[i].SetTrackId(i); } // Translate each track's list of notes and list // of events into microseconds. for (MidiTrackList::iterator i = m.m_tracks.begin(); i != m.m_tracks.end(); ++i) { i->Reset(); m.TranslateNotes(i->Notes(), pulses_per_quarter_note); MidiEventMicrosecondList event_usecs; for (MidiEventPulsesList::const_iterator j = i->EventPulses().begin(); j != i->EventPulses().end(); ++j) { event_usecs.push_back(m.GetEventPulseInMicroseconds(*j, pulses_per_quarter_note)); } i->SetEventUsecs(event_usecs); } m.m_initialized = true; // Just grab the end of the last note to find out how long the song is m.m_microsecond_base_song_length = m.m_translated_notes.rbegin()->end; // Eat everything up until *just* before the first note event m.m_microsecond_dead_start_air = m.GetEventPulseInMicroseconds(m.FindFirstNotePulse(), pulses_per_quarter_note) - 1; return m; } // NOTE: This is required for much of the other functionality provided // by this class, however, this causes a destructive change in the way // the MIDI is represented internally which means we can never save the // file back out to disk exactly as we loaded it. // // This adds an extra track dedicated to tempo change events. Tempo events // are extracted from every other track and placed in the new one. // // This allows quick(er) calculation of wall-clock event times void Midi::BuildTempoTrack() { // This map will help us get rid of duplicate events if // the tempo is specified in every track (as is common). // // It also does sorting for us so we can just copy the // events right over to the new track. map tempo_events; // Run through each track looking for tempo events for (MidiTrackList::iterator t = m_tracks.begin(); t != m_tracks.end(); ++t) { for (size_t i = 0; i < t->Events().size(); ++i) { MidiEvent ev = t->Events()[i]; unsigned long ev_pulses = t->EventPulses()[i]; if (ev.Type() == MidiEventType_Meta && ev.MetaType() == MidiMetaEvent_TempoChange) { // Pull tempo event out of both lists // // Vector is kind of a hassle this way -- we have to // walk an iterator to that point in the list because // erase MUST take an iterator... but erasing from a // list invalidates iterators. bleah. MidiEventList::iterator event_to_erase = t->Events().begin(); MidiEventPulsesList::iterator event_pulse_to_erase = t->EventPulses().begin(); for (size_t j = 0; j < i; ++j) { ++event_to_erase; ++event_pulse_to_erase; } t->Events().erase(event_to_erase); t->EventPulses().erase(event_pulse_to_erase); // Adjust next event's delta time if (t->Events().size() > i) { // (We just erased the element at i, so // now i is pointing to the next element) unsigned long next_dt = t->Events()[i].GetDeltaPulses(); t->Events()[i].SetDeltaPulses(ev.GetDeltaPulses() + next_dt); } // We have to roll i back for the next loop around --i; // Insert our newly stolen event into the auto-sorting map tempo_events[ev_pulses] = ev; } } } // Create a new track (always the last track in the track list) m_tracks.push_back(MidiTrack::CreateBlankTrack()); MidiEventList &tempo_track_events = m_tracks[m_tracks.size()-1].Events(); MidiEventPulsesList &tempo_track_event_pulses = m_tracks[m_tracks.size()-1].EventPulses(); // Copy over all our tempo events unsigned long previous_absolute_pulses = 0; for (map::const_iterator i = tempo_events.begin(); i != tempo_events.end(); ++i) { unsigned long absolute_pulses = i->first; MidiEvent ev = i->second; // Reset each of their delta times while we go ev.SetDeltaPulses(absolute_pulses - previous_absolute_pulses); previous_absolute_pulses = absolute_pulses; // Add them to the track tempo_track_event_pulses.push_back(absolute_pulses); tempo_track_events.push_back(ev); } } unsigned long Midi::FindFirstNotePulse() { unsigned long first_note_pulse = 0; // Find the very last value it could ever possibly be, to start with for (MidiTrackList::const_iterator t = m_tracks.begin(); t != m_tracks.end(); ++t) { if (t->EventPulses().size() == 0) continue; unsigned long pulses = t->EventPulses().back(); if (pulses > first_note_pulse) first_note_pulse = pulses; } // Now run through each event in each track looking for the very // first note_on event for (MidiTrackList::const_iterator t = m_tracks.begin(); t != m_tracks.end(); ++t) { for (size_t ev_id = 0; ev_id < t->Events().size(); ++ev_id) { if (t->Events()[ev_id].Type() == MidiEventType_NoteOn) { unsigned long note_pulse = t->EventPulses()[ev_id]; if (note_pulse < first_note_pulse) first_note_pulse = note_pulse; // We found the first note event in this // track. No need to keep searching. break; } } } return first_note_pulse; } microseconds_t Midi::ConvertPulsesToMicroseconds(unsigned long pulses, microseconds_t tempo, unsigned short pulses_per_quarter_note) { // Here's what we have to work with: // pulses is given // tempo is given (units of microseconds/quarter_note) // (pulses/quarter_note) is given as a constant in this object file const double quarter_notes = static_cast(pulses) / static_cast(pulses_per_quarter_note); const double microseconds = quarter_notes * static_cast(tempo); return static_cast(microseconds); } microseconds_t Midi::GetEventPulseInMicroseconds(unsigned long event_pulses, unsigned short pulses_per_quarter_note) const { if (m_tracks.size() == 0) return 0; const MidiTrack &tempo_track = m_tracks.back(); microseconds_t running_result = 0; bool hit = false; unsigned long last_tempo_event_pulses = 0; microseconds_t running_tempo = DefaultUSTempo; for (size_t i = 0; i < tempo_track.Events().size(); ++i) { unsigned long tempo_event_pulses = tempo_track.EventPulses()[i]; // If the time we're asking to convert is still beyond // this tempo event, just add the last time slice (at // the previous tempo) to the running wall-clock time. unsigned long delta_pulses = 0; if (event_pulses > tempo_event_pulses) delta_pulses = tempo_event_pulses - last_tempo_event_pulses; else { hit = true; delta_pulses = event_pulses - last_tempo_event_pulses; } running_result += ConvertPulsesToMicroseconds(delta_pulses, running_tempo, pulses_per_quarter_note); // If the time we're calculating is before the tempo event we're // looking at, we're done. if (hit) break; running_tempo = tempo_track.Events()[i].GetTempoInUsPerQn(); last_tempo_event_pulses = tempo_event_pulses; } // The requested time may be after the very last tempo event if (!hit) { unsigned long remaining_pulses = event_pulses - last_tempo_event_pulses; running_result += ConvertPulsesToMicroseconds(remaining_pulses, running_tempo, pulses_per_quarter_note); } return running_result; } void Midi::Reset(microseconds_t lead_in_microseconds, microseconds_t lead_out_microseconds) { m_microsecond_lead_out = lead_out_microseconds; m_microsecond_song_position = m_microsecond_dead_start_air - lead_in_microseconds; m_first_update_after_reset = true; for (MidiTrackList::iterator i = m_tracks.begin(); i != m_tracks.end(); ++i) { i->Reset(); } } void Midi::TranslateNotes(const NoteSet ¬es, unsigned short pulses_per_quarter_note) { for (NoteSet::const_iterator i = notes.begin(); i != notes.end(); ++i) { TranslatedNote trans; trans.note_id = i->note_id; trans.track_id = i->track_id; trans.channel = i->channel; trans.velocity = i->velocity; trans.start = GetEventPulseInMicroseconds(i->start, pulses_per_quarter_note); trans.end = GetEventPulseInMicroseconds(i->end, pulses_per_quarter_note); m_translated_notes.insert(trans); } } MidiEventListWithTrackId Midi::Update(microseconds_t delta_microseconds) { MidiEventListWithTrackId aggregated_events; if (!m_initialized) return aggregated_events; m_microsecond_song_position += delta_microseconds; if (m_first_update_after_reset) { delta_microseconds += m_microsecond_song_position; m_first_update_after_reset = false; } if (delta_microseconds == 0) return aggregated_events; if (m_microsecond_song_position < 0) return aggregated_events; if (delta_microseconds > m_microsecond_song_position) delta_microseconds = m_microsecond_song_position; const size_t track_count = m_tracks.size(); for (size_t i = 0; i < track_count; ++i) { MidiEventList track_events = m_tracks[i].Update(delta_microseconds); const size_t event_count = track_events.size(); for (size_t j = 0; j < event_count; ++j) { aggregated_events.insert(aggregated_events.end(), make_pair(i, track_events[j])); } } return aggregated_events; } microseconds_t Midi::GetSongLengthInMicroseconds() const { if (!m_initialized) return 0; return m_microsecond_base_song_length - m_microsecond_dead_start_air; } unsigned int Midi::AggregateEventsRemain() const { if (!m_initialized) return 0; unsigned int aggregate = 0; for (MidiTrackList::const_iterator i = m_tracks.begin(); i != m_tracks.end(); ++i) aggregate += i->AggregateEventsRemain(); return aggregate; } unsigned int Midi::AggregateNotesRemain() const { if (!m_initialized) return 0; unsigned int aggregate = 0; for (MidiTrackList::const_iterator i = m_tracks.begin(); i != m_tracks.end(); ++i) aggregate += i->AggregateNotesRemain(); return aggregate; } unsigned int Midi::AggregateEventCount() const { if (!m_initialized) return 0; unsigned int aggregate = 0; for (MidiTrackList::const_iterator i = m_tracks.begin(); i != m_tracks.end(); ++i) aggregate += i->AggregateEventCount(); return aggregate; } unsigned int Midi::AggregateNoteCount() const { if (!m_initialized) return 0; unsigned int aggregate = 0; for (MidiTrackList::const_iterator i = m_tracks.begin(); i != m_tracks.end(); ++i) aggregate += i->AggregateNoteCount(); return aggregate; } double Midi::GetSongPercentageComplete() const { if (!m_initialized) return 0.0; const double pos = static_cast(m_microsecond_song_position - m_microsecond_dead_start_air); const double len = static_cast(GetSongLengthInMicroseconds()); if (pos < 0) return 0.0; if (len == 0) return 1.0; return min( (pos / len), 1.0 ); } bool Midi::IsSongOver() const { if (!m_initialized) return true; return (m_microsecond_song_position - m_microsecond_dead_start_air) >= GetSongLengthInMicroseconds() + m_microsecond_lead_out; } linthesia-0.4.2/src/libmidi/MidiTypes.h0000644000175000017500000000040711312674352016760 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __MIDI_TYPES_H #define __MIDI_TYPES_H typedef long long microseconds_t; #endif linthesia-0.4.2/src/libmidi/MidiTrack.cpp0000644000175000017500000001577711312674352017273 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include "MidiTrack.h" #include "MidiEvent.h" #include "MidiUtil.h" #include "Midi.h" #include #include #include using namespace std; MidiTrack MidiTrack::ReadFromStream(std::istream &stream) { // Verify the track header const static string MidiTrackHeader = "MTrk"; // I could use (MidiTrackHeader.length() + 1), but then this has to be // dynamically allocated. More hassle than it's worth. MIDI is well // defined and will always have a 4-byte header. We use 5 so we get // free null termination. char header_id[5] = { 0, 0, 0, 0, 0 }; unsigned long track_length; stream.read(header_id, static_cast(MidiTrackHeader.length())); stream.read(reinterpret_cast(&track_length), sizeof(unsigned long)); if (stream.fail()) throw MidiError(MidiError_TrackHeaderTooShort); string header(header_id); if (header != MidiTrackHeader) throw MidiError_BadTrackHeaderType; // Pull the full track out of the file all at once -- there is an // End-Of-Track event, but this allows us handle malformed MIDI a // little more gracefully. track_length = BigToSystem32(track_length); char *buffer = new char[track_length + 1]; buffer[track_length] = 0; stream.read(buffer, track_length); if (stream.fail()) { delete[] buffer; throw MidiError(MidiError_TrackTooShort); } // We have to jump through a couple hoops because istringstream // can't handle binary data unless constructed through an std::string. string buffer_string(buffer, track_length); istringstream event_stream(buffer_string, ios::binary); delete[] buffer; MidiTrack t; // Read events until we run out of track char last_status = 0; unsigned long current_pulse_count = 0; while (event_stream.peek() != char_traits::eof()) { MidiEvent ev = MidiEvent::ReadFromStream(event_stream, last_status); last_status = ev.StatusCode(); t.m_events.push_back(ev); current_pulse_count += ev.GetDeltaPulses(); t.m_event_pulses.push_back(current_pulse_count); } t.BuildNoteSet(); t.DiscoverInstrument(); return t; } struct NoteInfo { int velocity; unsigned char channel; unsigned long pulses; }; void MidiTrack::BuildNoteSet() { m_note_set.clear(); // Keep a list of all the notes currently "on" (and the pulse that // it was started). On a note_on event, we create an element. On // a note_off event we check that an element exists, make a "Note", // and remove the element from the list. If there is already an // element on a note_on we both cap off the previous "Note" and // begin a new one. // // A note_on with velocity 0 is a note_off map m_active_notes; for (size_t i = 0; i < m_events.size(); ++i) { const MidiEvent &ev = m_events[i]; if (ev.Type() != MidiEventType_NoteOn && ev.Type() != MidiEventType_NoteOff) continue; bool on = (ev.Type() == MidiEventType_NoteOn && ev.NoteVelocity() > 0); NoteId id = ev.NoteNumber(); // Check for an active note map::iterator find_ret = m_active_notes.find(id); bool active_event = (find_ret != m_active_notes.end()); // Close off the last event if there was one if (active_event) { Note n; n.start = find_ret->second.pulses; n.end = m_event_pulses[i]; n.note_id = id; n.channel = find_ret->second.channel; n.velocity = find_ret->second.velocity; // NOTE: This must be set at the next level up. The track // itself has no idea what its index is. n.track_id = 0; // Add a note and remove this NoteId from the active list m_note_set.insert(n); m_active_notes.erase(find_ret); } // We've handled any active events. If this was a note_off we're done. if (!on) continue; // Add a new active event NoteInfo info; info.channel = ev.Channel(); info.velocity = ev.NoteVelocity(); info.pulses = m_event_pulses[i]; m_active_notes[id] = info; } if (m_active_notes.size() > 0) { // LOGTODO! // This is mostly non-critical. // // Erroring out would be needlessly restrictive against // promiscuous MIDI files. As-is, a note just won't be // inserted if it isn't closed properly. } } void MidiTrack::DiscoverInstrument() { // Default to Program 0 per the MIDI Standard m_instrument_id = 0; bool instrument_found = false; // These are actually 10 and 16 in the MIDI standard. However, MIDI // channels are 1-based facing the user. They're stored 0-based. const static int PercussionChannel1 = 9; const static int PercussionChannel2 = 15; // Check to see if any/all of the notes // in this track use Channel 10. bool any_note_uses_percussion = false; bool any_note_does_not_use_percussion = false; for (size_t i = 0; i < m_events.size(); ++i) { const MidiEvent &ev = m_events[i]; if (ev.Type() != MidiEventType_NoteOn) continue; if (ev.Channel() == PercussionChannel1 || ev.Channel() == PercussionChannel2) any_note_uses_percussion = true; if (ev.Channel() != PercussionChannel1 && ev.Channel() != PercussionChannel2) any_note_does_not_use_percussion = true; } if (any_note_uses_percussion && !any_note_does_not_use_percussion) { m_instrument_id = InstrumentIdPercussion; return; } if (any_note_uses_percussion && any_note_does_not_use_percussion) { m_instrument_id = InstrumentIdVarious; return; } for (size_t i = 0; i < m_events.size(); ++i) { const MidiEvent &ev = m_events[i]; if (ev.Type() != MidiEventType_ProgramChange) continue; // If we've already hit a different instrument in this // same track, just tag it as "various" and exit early // // Also check that the same instrument isn't just set // multiple times in the same track if (instrument_found && m_instrument_id != ev.ProgramNumber()) { m_instrument_id = InstrumentIdVarious; return; } m_instrument_id = ev.ProgramNumber(); instrument_found = true; } } void MidiTrack::SetTrackId(size_t track_id) { NoteSet old = m_note_set; m_note_set.clear(); for (NoteSet::const_iterator i = old.begin(); i != old.end(); ++i) { Note n = *i; n.track_id = track_id; m_note_set.insert(n); } } void MidiTrack::Reset() { m_running_microseconds = 0; m_last_event = -1; m_notes_remaining = static_cast(m_note_set.size()); } MidiEventList MidiTrack::Update(microseconds_t delta_microseconds) { m_running_microseconds += delta_microseconds; MidiEventList evs; for (size_t i = m_last_event + 1; i < m_events.size(); ++i) { if (m_event_usecs[i] <= m_running_microseconds) { evs.push_back(m_events[i]); m_last_event = static_cast(i); if (m_events[i].Type() == MidiEventType_NoteOn && m_events[i].NoteVelocity() > 0) m_notes_remaining--; } else break; } return evs; } linthesia-0.4.2/src/libmidi/Makefile0000644000175000017500000000043711314405473016341 0ustar cletocleto# -*- mode: makefile-gmake; coding: utf-8 -*- CXX = g++ CXXFLAGS = -I . -I .. -ansi -Wall TARGET = libmidi.a all: $(TARGET) $(TARGET): Midi.o MidiUtil.o MidiTrack.o MidiEvent.o ar rcs $@ $^ .PHONY:clean clean: find . -name "*.o" -delete find . -name "*~" -delete $(RM) $(TARGET) linthesia-0.4.2/src/libmidi/Midi.h0000644000175000017500000000650011312674352015733 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __MIDI_H #define __MIDI_H #include #include #include "Note.h" #include "MidiTrack.h" #include "MidiTypes.h" class MidiError; class MidiEvent; typedef std::vector MidiTrackList; typedef std::vector MidiEventList; typedef std::vector > MidiEventListWithTrackId; // NOTE: This library's MIDI loading and handling is destructive. Perfect // 1:1 serialization routines will not be possible without quite a // bit of additional work. class Midi { public: static Midi ReadFromFile(const std::string &filename); static Midi ReadFromStream(std::istream &stream); const std::vector &Tracks() const { return m_tracks; } const TranslatedNoteSet &Notes() const { return m_translated_notes; } MidiEventListWithTrackId Update(microseconds_t delta_microseconds); void Reset(microseconds_t lead_in_microseconds, microseconds_t lead_out_microseconds); microseconds_t GetSongPositionInMicroseconds() const { return m_microsecond_song_position; } microseconds_t GetSongLengthInMicroseconds() const; microseconds_t GetDeadAirStartOffsetMicroseconds() const { return m_microsecond_dead_start_air; } // This doesn't include lead-in (so it's perfect for a progress bar). // (It is also clamped to [0.0, 1.0], so lead-in and lead-out won't give any // unexpected results.) double GetSongPercentageComplete() const; // This will report when the lead-out period is complete. bool IsSongOver() const; unsigned int AggregateEventsRemain() const; unsigned int AggregateEventCount() const; unsigned int AggregateNotesRemain() const; unsigned int AggregateNoteCount() const; private: const static unsigned long DefaultBPM = 120; const static microseconds_t OneMinuteInMicroseconds = 60000000; const static microseconds_t DefaultUSTempo = OneMinuteInMicroseconds / DefaultBPM; static microseconds_t ConvertPulsesToMicroseconds(unsigned long pulses, microseconds_t tempo, unsigned short pulses_per_quarter_note); Midi(): m_initialized(false), m_microsecond_dead_start_air(0) { Reset(0, 0); } // This is O(n) where n is the number of tempo changes (across all tracks) in // the song up to the specified time. Tempo changes are usually a small number. // (Almost always 0 or 1, going up to maybe 30-100 in rare cases.) microseconds_t GetEventPulseInMicroseconds(unsigned long event_pulses, unsigned short pulses_per_quarter_note) const; unsigned long FindFirstNotePulse(); void BuildTempoTrack(); void TranslateNotes(const NoteSet ¬es, unsigned short pulses_per_quarter_note); bool m_initialized; TranslatedNoteSet m_translated_notes; // Position can be negative (for lead-in). microseconds_t m_microsecond_song_position; microseconds_t m_microsecond_base_song_length; microseconds_t m_microsecond_lead_out; microseconds_t m_microsecond_dead_start_air; bool m_first_update_after_reset; double m_playback_speed; MidiTrackList m_tracks; }; #endif linthesia-0.4.2/src/GameState.h0000644000175000017500000001153511326126710015311 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __GAMESTATE_H #define __GAMESTATE_H #include #include #include #include "Textures.h" #include "CompatibleSystem.h" #include "FrameCounter.h" #include "Renderer.h" class GameStateError : public std::exception { public: GameStateError(const std::string &error) throw() : m_error(error) { } virtual const char *what() const throw() { return m_error.c_str(); } ~GameStateError() throw() { } private: const std::string m_error; GameStateError operator=(const GameStateError&); }; class GameStateManager; enum GameKey { KeySpace = 0x0001, KeyEscape = 0x0002, KeyUp = 0x0004, KeyDown = 0x0008, KeyLeft = 0x0010, KeyRight = 0x0020, KeyEnter = 0x0040, KeyF6 = 0x0080, KeyF7 = 0x0100, KeyGreater = 0x0200, KeyLess = 0x0400 }; enum MouseButton { MouseLeft, MouseRight }; struct MouseButtons { MouseButtons() : left(false), right(false) { } bool left; bool right; }; struct MouseInfo { MouseInfo() : x(0), y(0) { } int x; int y; MouseButtons held; MouseButtons newPress; MouseButtons released; }; class GameState { public: // Don't initialize anything that is dependent // on the protected functions (GetStateWidth, // GetStateMilliseconds, etc) here. Wait until // Init() to do that. GameState() : m_manager(0), m_state_milliseconds(0), m_last_delta_milliseconds(0) { } virtual ~GameState() { } protected: // This is called just after the state's manager // is set for the first time virtual void Init() = 0; // Called every frame virtual void Update() = 0; // Called each frame. Drawing bounds are [0, // GetStateWidth()) and [0, GetStateHeight()) virtual void Draw(Renderer &renderer) const = 0; // How long has this state been running unsigned long GetStateMilliseconds() const { return m_state_milliseconds; } // How much time elapsed since the last update unsigned long GetDeltaMilliseconds() const { return m_last_delta_milliseconds; } int GetStateWidth() const; int GetStateHeight() const; // Once finished executing, use this to change // state to something new. This can only be // called from inside Update(). After calling // this function, you're guaranteed that the only // function that will still be called (before // the destructor) is Draw(). You *must* be able // to continue supporting Draw() after you call // this function. // // new_state *must* be dynamically allocated and // by calling this function you hand off ownership // of the memory to the state handling subsystem. void ChangeState(GameState *new_state); Tga *GetTexture(Texture tex_name, bool smooth = false) const; // These are usable inside Update() bool IsKeyPressed(GameKey key) const; const MouseInfo &Mouse() const; private: void SetManager(GameStateManager *manager); GameStateManager *m_manager; void UpdateStateMicroseconds(unsigned long delta_ms) { m_state_milliseconds += delta_ms; m_last_delta_milliseconds = delta_ms; } unsigned long m_state_milliseconds; unsigned long m_last_delta_milliseconds; friend class GameStateManager; }; // Your app calls this from the top level class GameStateManager { public: GameStateManager(int screen_width, int screen_height) : m_next_state(0), m_current_state(0), m_last_milliseconds(Compatible::GetMilliseconds()), m_key_presses(0), m_last_key_presses(0), m_inside_update(false), m_fps(500.0), m_show_fps(false), m_screen_x(screen_width), m_screen_y(screen_height) { } ~GameStateManager(); // first_state must be dynamically allocated. // GameStateManager takes ownership of the memory // from this point forward. void SetInitialState(GameState *first_state); void KeyPress(GameKey key); bool IsKeyPressed(GameKey key) const; bool IsKeyReleased(GameKey key) const; void MousePress(MouseButton button); void MouseRelease(MouseButton button); void MouseMove(int x, int y); const MouseInfo &Mouse() const { return m_mouse; } void Update(bool skip_this_update); void Draw(Renderer &renderer); void ChangeState(GameState *new_state); Tga *GetTexture(Texture tex_name, bool smooth) const; int GetStateWidth() const { return m_screen_x; } int GetStateHeight() const { return m_screen_y; } private: GameState *m_next_state; GameState *m_current_state; unsigned long m_last_milliseconds; unsigned long m_key_presses; unsigned long m_last_key_presses; bool m_inside_update; MouseInfo m_mouse; FrameCounter m_fps; bool m_show_fps; int m_screen_x; int m_screen_y; mutable std::map m_textures; }; #endif // __GAMESTATE_H linthesia-0.4.2/src/TrackTile.h0000644000175000017500000000404211314377746015332 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __TRACK_TILE_H #define __TRACK_TILE_H #include "GameState.h" #include "TextWriter.h" #include "TrackProperties.h" #include "MenuLayout.h" #include "libmidi/Midi.h" #include const int TrackTileWidth = 300; const int TrackTileHeight = 110; enum TrackTileGraphic { GraphicLeftArrow = 0, GraphicRightArrow, GraphicColor, GraphicPreviewTurnOn, GraphicPreviewTurnOff, Graphic_COUNT }; class TrackTile { public: TrackTile(int x, int y, size_t track_id, Track::TrackColor color, Track::Mode mode); void Update(const MouseInfo &translated_mouse); void Draw(Renderer &renderer, const Midi *midi, Tga *buttons, Tga *box) const; int GetX() { return m_x; } int GetY() { return m_y; } Track::Mode GetMode() const { return m_mode; } Track::TrackColor GetColor() const { return m_color; } bool HitPreviewButton() const { return button_preview.hit; } bool IsPreviewOn() const { return m_preview_on; } void TurnOffPreview() { m_preview_on = false; } size_t GetTrackId() const { return m_track_id; } const ButtonState WholeTile() const { return whole_tile; } const ButtonState ButtonPreview() const { return button_preview; } const ButtonState ButtonColor() const { return button_color; } const ButtonState ButtonLeft() const { return button_mode_left; } const ButtonState ButtonRight() const { return button_mode_right; } private: int m_x; int m_y; Track::Mode m_mode; Track::TrackColor m_color; bool m_preview_on; ButtonState whole_tile; ButtonState button_preview; ButtonState button_color; ButtonState button_mode_left; ButtonState button_mode_right; int LookupGraphic(TrackTileGraphic graphic, bool button_hovering) const; // Link to the track index of the Midi object size_t m_track_id; }; #endif // __TRACK_TILE_H linthesia-0.4.2/src/PlayingState.cpp0000644000175000017500000004502211326126710016374 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include "PlayingState.h" #include "TrackSelectionState.h" #include "StatsState.h" #include "Renderer.h" #include "Textures.h" #include "CompatibleSystem.h" #include #include #include "StringUtil.h" #include "MenuLayout.h" #include "TextWriter.h" #include "libmidi/Midi.h" #include "libmidi/MidiTrack.h" #include "libmidi/MidiEvent.h" #include "libmidi/MidiUtil.h" #include "MidiComm.h" using namespace std; void PlayingState::SetupNoteState() { TranslatedNoteSet old = m_notes; m_notes.clear(); for (TranslatedNoteSet::const_iterator i = old.begin(); i != old.end(); ++i) { TranslatedNote n = *i; n.state = AutoPlayed; if (m_state.track_properties[n.track_id].mode == Track::ModeYouPlay) n.state = UserPlayable; m_notes.insert(n); } } void PlayingState::ResetSong() { if (m_state.midi_out) m_state.midi_out->Reset(); if (m_state.midi_in) m_state.midi_in->Reset(); // TODO: These should be moved to a configuration file // along with ALL other "const static something" variables. const static microseconds_t LeadIn = 5500000; const static microseconds_t LeadOut = 1000000; if (!m_state.midi) return; m_state.midi->Reset(LeadIn, LeadOut); m_notes = m_state.midi->Notes(); SetupNoteState(); m_state.stats = SongStatistics(); m_state.stats.total_note_count = static_cast(m_notes.size()); m_current_combo = 0; m_note_offset = 0; m_max_allowed_title_alpha = 1.0; } PlayingState::PlayingState(const SharedState &state) : m_paused(false), m_show_names(false), m_keyboard(0), m_any_you_play_tracks(false), m_first_update(true), m_state(state) { } void PlayingState::Init() { if (!m_state.midi) throw GameStateError("PlayingState: Init was passed a null MIDI!"); m_look_ahead_you_play_note_count = 0; for (size_t i = 0; i < m_state.track_properties.size(); ++i) { if (m_state.track_properties[i].mode == Track::ModeYouPlay) { m_look_ahead_you_play_note_count += m_state.midi->Tracks()[i].Notes().size(); m_any_you_play_tracks = true; } } // This many microseconds of the song will // be shown on the screen at once const static microseconds_t DefaultShowDurationMicroseconds = 3250000; m_show_duration = DefaultShowDurationMicroseconds; m_keyboard = new KeyboardDisplay(KeyboardSize88, GetStateWidth() - Layout::ScreenMarginX*2, CalcKeyboardHeight()); // Hide the mouse cursor while we're playing Compatible::HideMouseCursor(); ResetSong(); } PlayingState::~PlayingState() { Compatible::ShowMouseCursor(); } int PlayingState::CalcKeyboardHeight() const { // Start with the size of the screen int height = GetStateHeight(); // Allow a couple lines of text below the keys height -= Layout::ButtonFontSize * 8; return height; } void PlayingState::Play(microseconds_t delta_microseconds) { MidiEventListWithTrackId evs = m_state.midi->Update(delta_microseconds); const size_t length = evs.size(); for(size_t i = 0; i < length; ++i) { const size_t &track_id = evs[i].first; const MidiEvent &ev = evs[i].second; // Draw refers to the keys lighting up (automatically) -- not necessarily // the falling notes. The KeyboardDisplay object contains its own logic // to decide how to draw the falling notes bool draw = false; bool play = false; switch (m_state.track_properties[track_id].mode) { case Track::ModeNotPlayed: draw = false; play = false; break; case Track::ModePlayedButHidden: draw = false; play = true; break; case Track::ModeYouPlay: draw = false; play = false; break; case Track::ModePlayedAutomatically: draw = true; play = true; break; case Track::ModeCount: break; // make compiler happy ;) } // Even in "You Play" tracks, we have to play the non-note // events as per usual. if (m_state.track_properties[track_id].mode && ev.Type() != MidiEventType_NoteOn && ev.Type() != MidiEventType_NoteOff) play = true; if (draw && (ev.Type() == MidiEventType_NoteOn || ev.Type() == MidiEventType_NoteOff)) { int vel = ev.NoteVelocity(); const string name = MidiEvent::NoteName(ev.NoteNumber()); m_keyboard->SetKeyActive(name, (vel > 0), m_state.track_properties[track_id].color); } if (play && m_state.midi_out) m_state.midi_out->Write(ev); } } double PlayingState::CalculateScoreMultiplier() const { const static double MaxMultiplier = 5.0; double multiplier = 1.0; const double combo_addition = m_current_combo / 10.0; multiplier += combo_addition; return min(MaxMultiplier, multiplier); } void PlayingState::Listen() { if (!m_state.midi_in) return; while (m_state.midi_in->KeepReading()) { microseconds_t cur_time = m_state.midi->GetSongPositionInMicroseconds(); MidiEvent ev = m_state.midi_in->Read(); // Just eat input if we're paused if (m_paused) continue; // We're only interested in NoteOn and NoteOff if (ev.Type() != MidiEventType_NoteOn && ev.Type() != MidiEventType_NoteOff) continue; // Octave Sliding ev.ShiftNote(m_note_offset); string note_name = MidiEvent::NoteName(ev.NoteNumber()); // On key release we have to look for existing "active" notes and turn them off. if (ev.Type() == MidiEventType_NoteOff || ev.NoteVelocity() == 0) { // NOTE: This assumes mono-channel input. If they're piping an entire MIDI file // (or even the *same* MIDI file) through another source, we could get the // same NoteId on different channels -- and this code would start behaving // incorrectly. for (ActiveNoteSet::iterator i = m_active_notes.begin(); i != m_active_notes.end(); ++i) { if (ev.NoteNumber() != i->note_id) continue; // Play it on the correct channel to turn the note we started // previously, off. ev.SetChannel(i->channel); if (m_state.midi_out) m_state.midi_out->Write(ev); m_active_notes.erase(i); break; } m_keyboard->SetKeyActive(note_name, false, Track::FlatGray); continue; } bool any_found = false; TranslatedNoteSet::iterator closest_match = m_notes.end(); for (TranslatedNoteSet::iterator i = m_notes.begin(); i != m_notes.end(); ++i) { const microseconds_t window_start = i->start - (KeyboardDisplay::NoteWindowLength / 2); const microseconds_t window_end = i->start + (KeyboardDisplay::NoteWindowLength / 2); // As soon as we start processing notes that couldn't possibly // have been played yet, we're done. if (window_start > cur_time) break; if (i->state != UserPlayable) continue; if (window_end > cur_time && i->note_id == ev.NoteNumber()) { if (closest_match == m_notes.end()) { closest_match = i; continue; } microseconds_t this_distance = cur_time - i->start; if (i->start > cur_time) this_distance = i->start - cur_time; microseconds_t known_best = cur_time - closest_match->start; if (closest_match->start > cur_time) known_best = closest_match->start - cur_time; if (this_distance < known_best) closest_match = i; } } Track::TrackColor note_color = Track::FlatGray; if (closest_match != m_notes.end()) { any_found = true; note_color = m_state.track_properties[closest_match->track_id].color; // "Open" this note so we can catch the close later and turn off // the note. ActiveNote n; n.channel = closest_match->channel; n.note_id = closest_match->note_id; n.velocity = closest_match->velocity; m_active_notes.insert(n); // Play it ev.SetChannel(n.channel); ev.SetVelocity(n.velocity); if (m_state.midi_out) m_state.midi_out->Write(ev); // Adjust our statistics const static double NoteValue = 100.0; m_state.stats.score += NoteValue * CalculateScoreMultiplier() * (m_state.song_speed / 100.0); m_state.stats.notes_user_could_have_played++; m_state.stats.speed_integral += m_state.song_speed; m_state.stats.notes_user_actually_played++; m_current_combo++; m_state.stats.longest_combo = max(m_current_combo, m_state.stats.longest_combo); TranslatedNote replacement = *closest_match; replacement.state = UserHit; m_notes.erase(closest_match); m_notes.insert(replacement); } else m_state.stats.stray_notes++; m_state.stats.total_notes_user_pressed++; m_keyboard->SetKeyActive(note_name, true, note_color); } } void PlayingState::Update() { // Calculate how visible the title bar should be const static double fade_in_ms = 350.0; const static double stay_ms = 2500.0; const static double fade_ms = 500.0; m_title_alpha = 0.0; unsigned long ms = GetStateMilliseconds() * max(m_state.song_speed, 50) / 100; if (double(ms) <= stay_ms) m_title_alpha = min(1.0, ms / fade_in_ms); if (double(ms) >= stay_ms) m_title_alpha = min(max((fade_ms - (ms - stay_ms)) / fade_ms, 0.0), 1.0); // Lock down the alpha so that if you are slowing the song down as it // fades out, it doesn't cut back into a much higher alpha value m_title_alpha = min(m_title_alpha, m_max_allowed_title_alpha); if (double(ms) > stay_ms) m_max_allowed_title_alpha = m_title_alpha; microseconds_t delta_microseconds = static_cast(GetDeltaMilliseconds()) * 1000; // The 100 term is really paired with the playback speed, but this // formation is less likely to produce overflow errors. delta_microseconds = (delta_microseconds / 100) * m_state.song_speed; if (m_paused) delta_microseconds = 0; // Our delta milliseconds on the first frame after state start is extra // long because we just reset the MIDI. By skipping the "Play" that // update, we don't have an artificially fast-forwarded start. if (!m_first_update) { Play(delta_microseconds); Listen(); } m_first_update = false; microseconds_t cur_time = m_state.midi->GetSongPositionInMicroseconds(); // Delete notes that are finished playing (and are no longer available to hit) TranslatedNoteSet::iterator i = m_notes.begin(); while (i != m_notes.end()) { TranslatedNoteSet::iterator note = i++; const microseconds_t window_end = note->start + (KeyboardDisplay::NoteWindowLength / 2); if (m_state.midi_in && note->state == UserPlayable && window_end <= cur_time) { TranslatedNote note_copy = *note; note_copy.state = UserMissed; m_notes.erase(note); m_notes.insert(note_copy); // Re-connect the (now-invalid) iterator to the replacement note = m_notes.find(note_copy); } if (note->start > cur_time) break; if (note->end < cur_time && window_end < cur_time) { if (note->state == UserMissed) { // They missed a note, reset the combo counter m_current_combo = 0; m_state.stats.notes_user_could_have_played++; m_state.stats.speed_integral += m_state.song_speed; } m_notes.erase(note); } } if(IsKeyPressed(KeyGreater)) m_note_offset += 12; if(IsKeyPressed(KeyLess)) m_note_offset -= 12; if (IsKeyPressed(KeyUp)) { m_show_duration -= 250000; const static microseconds_t MinShowDuration = 250000; if (m_show_duration < MinShowDuration) m_show_duration = MinShowDuration; } if (IsKeyPressed(KeyDown)) { m_show_duration += 250000; const static microseconds_t MaxShowDuration = 10000000; if (m_show_duration > MaxShowDuration) m_show_duration = MaxShowDuration; } if (IsKeyPressed(KeyLeft)) { m_state.song_speed -= 10; if (m_state.song_speed < 0) m_state.song_speed = 0; } if (IsKeyPressed(KeyRight)) { m_state.song_speed += 10; if (m_state.song_speed > 400) m_state.song_speed = 400; } if (IsKeyPressed(KeySpace)) m_paused = !m_paused; if (IsKeyPressed(KeyF7)) m_show_names = !m_show_names; if (IsKeyPressed(KeyEscape)) { if (m_state.midi_out) m_state.midi_out->Reset(); if (m_state.midi_in) m_state.midi_in->Reset(); ChangeState(new TrackSelectionState(m_state)); return; } if (m_state.midi->IsSongOver()) { if (m_state.midi_out) m_state.midi_out->Reset(); if (m_state.midi_in) m_state.midi_in->Reset(); if (m_state.midi_in && m_any_you_play_tracks) ChangeState(new StatsState(m_state)); else ChangeState(new TrackSelectionState(m_state)); return; } } void PlayingState::Draw(Renderer &renderer) const { const Tga *key_tex[4] = { GetTexture(PlayKeyRail), GetTexture(PlayKeyShadow), GetTexture(PlayKeysBlack, true), GetTexture(PlayKeyHits) }; const Tga *note_tex[4] = { GetTexture(PlayNotesWhiteShadow, true), GetTexture(PlayNotesBlackShadow, true), GetTexture(PlayNotesWhiteColor, true), GetTexture(PlayNotesBlackColor, true) }; renderer.ForceTexture(0); m_keyboard->Draw(renderer, key_tex, note_tex, Layout::ScreenMarginX, 0, m_notes, m_show_duration, m_state.midi->GetSongPositionInMicroseconds(), m_state.track_properties, m_show_names); string title_text = m_state.song_title; double alpha = m_title_alpha; if (m_paused) { alpha = 1.0; title_text = "Game Paused"; } if (alpha > 0.001) { renderer.SetColor(0, 0, 0, int(alpha * 160)); renderer.DrawQuad(0, GetStateHeight() / 3, GetStateWidth(), 80); const Color c = Renderer::ToColor(255, 255, 255, int(alpha * 0xFF)); TextWriter title(GetStateWidth()/2, GetStateHeight()/3 + 25, renderer, true, 24); title << Text(title_text, c); // While we're at it, show the key legend renderer.SetColor(c); const Tga *keys = GetTexture(PlayKeys); renderer.DrawTga(keys, GetStateWidth() / 2 - 250, GetStateHeight() / 2); } int text_y = CalcKeyboardHeight() + 42; renderer.SetColor(White); renderer.DrawTga(GetTexture(PlayStatus), Layout::ScreenMarginX - 1, text_y); renderer.DrawTga(GetTexture(PlayStatus2), Layout::ScreenMarginX + 273, text_y); string multiplier_text = STRING(fixed << setprecision(1) << CalculateScoreMultiplier() << " Multiplier"); string speed_text = STRING(m_state.song_speed << "% Speed"); TextWriter score(Layout::ScreenMarginX + 92, text_y + 5, renderer, false, Layout::ScoreFontSize); score << static_cast(m_state.stats.score); // Draw song title TextWriter song_title(Layout::ScreenMarginX + 600, text_y + 13, renderer, false, Layout::TitleFontSize); song_title << ":: " << m_state.song_title; TextWriter multipliers(Layout::ScreenMarginX + 232, text_y + 12, renderer, false, Layout::TitleFontSize+2); multipliers << Text(multiplier_text, Renderer::ToColor(138, 226, 52)); int speed_x_offset = (m_state.song_speed >= 100 ? 0 : 11); TextWriter speed(Layout::ScreenMarginX + 412 + speed_x_offset, text_y + 12, renderer, false, Layout::TitleFontSize+2); speed << Text(speed_text, Renderer::ToColor(114, 159, 207)); double non_zero_playback_speed = ( (m_state.song_speed == 0) ? 0.1 : (m_state.song_speed/100.0) ); microseconds_t tot_seconds = static_cast((m_state.midi->GetSongLengthInMicroseconds() / 100000.0) / non_zero_playback_speed); microseconds_t cur_seconds = static_cast((m_state.midi->GetSongPositionInMicroseconds() / 100000.0) / non_zero_playback_speed); if (cur_seconds < 0) cur_seconds = 0; if (cur_seconds > tot_seconds) cur_seconds = tot_seconds; int completion = static_cast(m_state.midi->GetSongPercentageComplete() * 100.0); unsigned int tot_min = static_cast((tot_seconds/10) / 60); unsigned int tot_sec = static_cast((tot_seconds/10) % 60); unsigned int tot_ten = static_cast( tot_seconds%10); const string total_time = STRING(tot_min << ":" << setfill('0') << setw(2) << tot_sec << "." << tot_ten); unsigned int cur_min = static_cast((cur_seconds/10) / 60); unsigned int cur_sec = static_cast((cur_seconds/10) % 60); unsigned int cur_ten = static_cast( cur_seconds%10 ); const string current_time = STRING(cur_min << ":" << setfill('0') << setw(2) << cur_sec << "." << cur_ten); const string percent_complete = STRING(" (" << completion << "%)"); text_y += 30 + Layout::SmallFontSize; TextWriter time_text(Layout::ScreenMarginX + 39, text_y+2, renderer, false, Layout::SmallFontSize); time_text << STRING(current_time << " / " << total_time << percent_complete); // Draw a song progress bar along the top of the screen const int time_pb_width = static_cast(m_state.midi->GetSongPercentageComplete() * (GetStateWidth() - Layout::ScreenMarginX*2)); const int pb_x = Layout::ScreenMarginX; const int pb_y = CalcKeyboardHeight() + 25; renderer.SetColor(0x50, 0x50, 0x50); renderer.DrawQuad(pb_x, pb_y, time_pb_width, 16); if (m_look_ahead_you_play_note_count > 0) { const double note_count = 1.0 * m_look_ahead_you_play_note_count; const int note_miss_pb_width = static_cast(m_state.stats.notes_user_could_have_played / note_count * (GetStateWidth() - Layout::ScreenMarginX*2)); const int note_hit_pb_width = static_cast(m_state.stats.notes_user_actually_played / note_count * (GetStateWidth() - Layout::ScreenMarginX*2)); renderer.SetColor(0xCE,0x5C,0x00); renderer.DrawQuad(pb_x, pb_y - 20, note_miss_pb_width, 16); renderer.SetColor(0xFC,0xAF,0x3E); renderer.DrawQuad(pb_x, pb_y - 20, note_hit_pb_width, 16); } // Show the combo if (m_current_combo > 5) { int combo_font_size = 20; combo_font_size += (m_current_combo / 10); int combo_x = GetStateWidth() / 2; int combo_y = GetStateHeight() - CalcKeyboardHeight() + 30 - (combo_font_size/2); TextWriter combo_text(combo_x, combo_y, renderer, true, combo_font_size); combo_text << STRING(m_current_combo << " Combo!"); } } linthesia-0.4.2/src/TrackSelectionState.h0000644000175000017500000000205711314377746017367 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __TRACKSELECTION_STATE_H #define __TRACKSELECTION_STATE_H #include "SharedState.h" #include "GameState.h" #include "TrackTile.h" #include "libmidi/MidiTypes.h" #include "MidiComm.h" #include class TrackSelectionState : public GameState { public: TrackSelectionState(const SharedState &state); protected: virtual void Init(); virtual void Update(); virtual void Draw(Renderer &renderer) const; private: void PlayTrackPreview(microseconds_t additional_time); std::vector BuildTrackProperties() const; int m_page_count; int m_current_page; int m_tiles_per_page; bool m_preview_on; bool m_first_update_after_seek; size_t m_preview_track_id; ButtonState m_continue_button; ButtonState m_back_button; std::string m_tooltip; std::vector m_track_tiles; SharedState m_state; }; #endif // __TRACKSELECTION_STATE_H linthesia-0.4.2/src/DeviceTile.h0000644000175000017500000000357111314377746015473 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __DEVICE_TILE_H #define __DEVICE_TILE_H #include "GameState.h" #include "MenuLayout.h" #include "TrackTile.h" #include #include "libmidi/Midi.h" #include "MidiComm.h" const int DeviceTileWidth = 510; const int DeviceTileHeight = 80; enum TrackTileGraphic; enum DeviceTileType { DeviceTileOutput, DeviceTileInput }; class DeviceTile { public: DeviceTile(int x, int y, int device_id, DeviceTileType type, const MidiCommDescriptionList &device_list, Tga *button_graphics, Tga *frame_graphics); void Update(const MouseInfo &translated_mouse); void Draw(Renderer &renderer) const; int GetX() const { return m_x; } int GetY() const { return m_y; } bool HitPreviewButton() const { return button_preview.hit; } bool IsPreviewOn() const { return m_preview_on; } void TurnOffPreview() { m_preview_on = false; } int GetDeviceId() const { return m_device_id; } const ButtonState WholeTile() const { return whole_tile; } const ButtonState ButtonPreview() const { return button_preview; } const ButtonState ButtonLeft() const { return button_mode_left; } const ButtonState ButtonRight() const { return button_mode_right; } private: DeviceTile operator=(const DeviceTile &); int m_x; int m_y; bool m_preview_on; int m_device_id; const MidiCommDescriptionList m_device_list; DeviceTileType m_tile_type; Tga *m_button_graphics; Tga *m_frame_graphics; ButtonState whole_tile; ButtonState button_preview; ButtonState button_mode_left; ButtonState button_mode_right; int LookupGraphic(TrackTileGraphic graphic, bool button_hovering) const; }; #endif // __DEVICE_TILE_H linthesia-0.4.2/src/Renderer.h0000644000175000017500000000274411326126710015207 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __RENDERER_H #define __RENDERER_H #include "OSGraphics.h" #include "Tga.h" typedef Glib::RefPtr GLContext; typedef Glib::RefPtr PGContext; struct Color { int r, g, b, a; }; class Renderer { public: Renderer(GLContext glcontext, PGContext pangocontext); static Color ToColor(int r, int g, int b, int a = 0xFF); void SwapBuffers(); void SetOffset(int x, int y) { m_xoffset = x; m_yoffset = y; } void ResetOffset() { SetOffset(0,0); } void ForceTexture(unsigned int texture_id); void SetColor(Color c); void SetColor(int r, int g, int b, int a = 0xFF); void DrawQuad(int x, int y, int w, int h); void DrawTga(const Tga *tga, int x, int y) const; void DrawTga(const Tga *tga, int x, int y, int width, int height, int src_x, int src_y) const; void DrawStretchedTga(const Tga *tga, int x, int y, int w, int h) const; void DrawStretchedTga(const Tga *tga, int x, int y, int w, int h, int src_x, int src_y, int src_w, int src_h) const; private: // NOTE: These are used externally by the friend // class TextWriter (along with the context) int m_xoffset; int m_yoffset; GLContext m_glcontext; PGContext m_pangocontext; friend class Text; friend class TextWriter; }; #endif // __RENDERER_H linthesia-0.4.2/src/FrameCounter.h0000644000175000017500000000213611314377746016044 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __FRAME_COUNTER_H #define __FRAME_COUNTER_H class FrameCounter { public: // averaged_over_milliseconds is the length of time GetFramesPerSecond // should average the frame count over in order to smooth the rate. FrameCounter(double averaged_over_milliseconds) : m_average_over_ms(averaged_over_milliseconds), m_period_ms(0), m_frames(0), m_cached_fps(0) { if (m_average_over_ms <= 50.0) m_average_over_ms = 50.0; } void Frame(double delta_ms) { if (delta_ms < 0.0) return; m_period_ms += delta_ms; m_frames++; if (m_period_ms > m_average_over_ms) { m_cached_fps = static_cast(m_frames) / m_period_ms * 1000.0; m_frames = 0; m_period_ms = 0; } } double GetFramesPerSecond() const { return m_cached_fps; } private: double m_average_over_ms; double m_period_ms; int m_frames; double m_cached_fps; }; #endif // __FRAME_COUNTER_H linthesia-0.4.2/src/FileSelector.h0000644000175000017500000000145411312674352016023 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __FILE_SELECTOR_H #define __FILE_SELECTOR_H #include namespace FileSelector { // Presents a standard "File Open" dialog box. Returns empty string // in [filename] if user presses cancel. Also, remembers last filename void RequestMidiFilename(std::string *filename, std::string *file_title); // If a filename was passed in on the command line, we // can remember it for future file-open dialogs void SetLastMidiFilename(const std::string &filename); // Returns a filename with no path or .mid/.midi extension std::string TrimFilename(const std::string &filename); }; #endif // __FILE_SELECTOR_H linthesia-0.4.2/src/Textures.h0000644000175000017500000000124411326126710015256 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __TEXTURES_H #define __TEXTURES_H enum Texture { TitleLogo, InterfaceButtons, ButtonRetrySong, ButtonChooseTracks, ButtonExit, ButtonBackToTitle, ButtonPlaySong, InputBox, OutputBox, SongBox, TrackPanel, StatsText, PlayStatus, PlayStatus2, PlayKeys, PlayNotesBlackColor, PlayNotesBlackShadow, PlayNotesWhiteColor, PlayNotesWhiteShadow, PlayKeyRail, PlayKeyShadow, PlayKeysBlack, PlayKeyHits, _TextureEnumCount }; #endif // __TEXTURES_H linthesia-0.4.2/src/MidiComm.h0000644000175000017500000000403011316475030015126 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __MIDI_COMM_H #define __MIDI_COMM_H #include #include #include #include #include "libmidi/MidiEvent.h" struct MidiCommDescription { unsigned int id; std::string name; int client; int port; }; typedef std::vector MidiCommDescriptionList; // Start/Stop midi services (i.e. open/close sequencer) void midiInit(); void midiStop(); // Emulate MIDI keyboard using PC keyboard void sendNote(const unsigned char note, bool on); // Once you create a MidiCommIn object. Use the Read() function // to grab one event at a time from the buffer. class MidiCommIn { public: static MidiCommDescriptionList GetDeviceList(); // device_id is obtained from GetDeviceList() MidiCommIn(unsigned int device_id); ~MidiCommIn(); MidiCommDescription GetDeviceDescription() const { return m_description; } // Returns the next buffered input event. Use KeepReading() (usually in // a while loop) to see if you should call this function. If called when // KeepReading() is false, this will throw MidiError_NoInputAvailable. MidiEvent Read(); // Discard events from the input buffer void Reset(); // Returns whether the input device has more buffered events. bool KeepReading() const; private: MidiCommDescription m_description; }; class MidiCommOut { public: static MidiCommDescriptionList GetDeviceList(); // device_id is obtained from GetDeviceList() MidiCommOut(unsigned int device_id); ~MidiCommOut(); MidiCommDescription GetDeviceDescription() const { return m_description; } // Send a single event out to the device. void Write(const MidiEvent &out); // Turns all notes off and resets all controllers void Reset(); private: void Release(); MidiCommDescription m_description; std::vector > notes_on; }; #endif // __MIDI_COMM_H linthesia-0.4.2/src/MidiComm.cpp0000644000175000017500000002100111316475030015456 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include #include #include #include "libmidi/MidiEvent.h" #include "libmidi/MidiUtil.h" #include "MidiComm.h" #include "UserSettings.h" #include "CompatibleSystem.h" #include "StringUtil.h" using namespace std; // ALSA sequencer descriptor static bool midi_initiated = false; static bool emulate_kb = false; static snd_seq_t* alsa_seq; // ALSA ports static int local_out, local_in, keybd_out = -1; void midiInit() { if (midi_initiated) return; int err = snd_seq_open(&alsa_seq, "default", SND_SEQ_OPEN_DUPLEX, 0); midi_initiated = true; // Could not open sequencer, no out devices if (err < 0) { alsa_seq = NULL; Compatible::ShowError("Could not open MIDI sequencer. No MIDI available"); return; } snd_seq_set_client_name(alsa_seq, "Linthesia"); // meanings of READ and WRITE are permissions of the port from the viewpoint of other ports // READ: port allows to send events to other ports local_out = snd_seq_create_simple_port(alsa_seq, "Linthesia Output", SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_MIDI_GENERIC); keybd_out = snd_seq_create_simple_port(alsa_seq, "Linthesia Keyboard", SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_MIDI_GENERIC); // WRITE: port allows to receive events from other ports local_in = snd_seq_create_simple_port(alsa_seq, "Linthesia Input", SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE, SND_SEQ_PORT_TYPE_MIDI_GENERIC); } void midiStop() { snd_seq_close(alsa_seq); } void sendNote(const unsigned char note, bool on) { if (emulate_kb) { snd_seq_event_t ev; snd_seq_ev_clear(&ev); snd_seq_ev_set_source(&ev, keybd_out); snd_seq_ev_set_subs(&ev); snd_seq_ev_set_direct(&ev); if (on) // velocity ~ 60 for audio preview snd_seq_ev_set_noteon(&ev, 0, note, 60); else snd_seq_ev_set_noteoff(&ev, 0, note, 0); snd_seq_event_output(alsa_seq, &ev); snd_seq_drain_output(alsa_seq); } } // private use void doRetrieveDevices(unsigned int perms, MidiCommDescriptionList& devices) { midiInit(); if (alsa_seq == NULL) return; snd_seq_client_info_t* cinfo; snd_seq_port_info_t* pinfo; int count = 0, ownid = snd_seq_client_id(alsa_seq); snd_seq_client_info_alloca(&cinfo); snd_seq_port_info_alloca(&pinfo); snd_seq_client_info_set_client(cinfo, -1); while (snd_seq_query_next_client(alsa_seq, cinfo) >= 0) { // reset query info snd_seq_port_info_set_client(pinfo, snd_seq_client_info_get_client(cinfo)); snd_seq_port_info_set_port(pinfo, -1); while (snd_seq_query_next_port(alsa_seq, pinfo) >= 0) { if ((snd_seq_port_info_get_capability(pinfo) & perms) == perms) { int client = snd_seq_client_info_get_client(cinfo); int port = snd_seq_port_info_get_port(pinfo); // filter own ports if (client == ownid && (port == local_in || port == local_out)) continue; MidiCommDescription d; d.id = count++; d.name = snd_seq_port_info_get_name(pinfo); d.client = client; d.port = port; devices.push_back(d); } } } } // Midi IN Ports static bool built_input_list = false; static MidiCommDescriptionList in_list(MidiCommIn::GetDeviceList()); MidiCommIn::MidiCommIn(unsigned int device_id) { m_description = GetDeviceList()[device_id]; // Connect local in to selected port int res = snd_seq_connect_from(alsa_seq, local_in, m_description.client, m_description.port); if (res < 0) { string msg = snd_strerror(res); cout << "[WARNING] Input, cannont connect from '" << m_description.name << "': " << msg << endl; } // enable internal keyboard if (m_description.client == snd_seq_client_id(alsa_seq) and m_description.port == keybd_out) emulate_kb = true; } MidiCommIn::~MidiCommIn() { // Disconnect local in to selected port snd_seq_disconnect_from(alsa_seq, local_in, m_description.client, m_description.port); } MidiCommDescriptionList MidiCommIn::GetDeviceList() { if (built_input_list) return in_list; built_input_list = true; MidiCommDescriptionList devices; unsigned int perms = SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ; doRetrieveDevices(perms, devices); return devices; } MidiEvent MidiCommIn::Read() { if (snd_seq_event_input_pending(alsa_seq, 1) < 1) return MidiEvent::NullEvent(); MidiEventSimple simple; snd_seq_event_t* ev; snd_seq_event_input(alsa_seq, &ev); switch(ev->type) { case SND_SEQ_EVENT_NOTEON: simple.status = 0x90 | (ev->data.note.channel & 0x0F); // Type and Channel simple.byte1 = ev->data.note.note; // Note number simple.byte2 = ev->data.note.velocity; // Velocity break; case SND_SEQ_EVENT_NOTEOFF: simple.status = 0x80 | (ev->data.note.channel & 0x0F); // Type and Channel simple.byte1 = ev->data.note.note; // Note number simple.byte2 = 0; // Velocity break; case SND_SEQ_EVENT_PGMCHANGE: simple.status = 0xC0 | (ev->data.note.channel & 0x0F); // Type and Channel simple.byte1 = ev->data.control.value; // Program number break; // unknown type, do nothing default: return MidiEvent::NullEvent(); } return MidiEvent::Build(simple); } bool MidiCommIn::KeepReading() const { return snd_seq_event_input_pending(alsa_seq, 1); } void MidiCommIn::Reset() { snd_seq_drop_input(alsa_seq); } // Midi OUT Ports static bool built_output_list = false; static MidiCommDescriptionList out_list(MidiCommOut::GetDeviceList()); MidiCommOut::MidiCommOut(unsigned int device_id) { m_description = GetDeviceList()[device_id]; // Connect local out to selected port int res = snd_seq_connect_to(alsa_seq, local_out, m_description.client, m_description.port); if (res < 0) { string msg = snd_strerror(res); cout << "[WARNING] Output, cannont connect to '" << m_description.name << "': " << msg << endl; } } MidiCommOut::~MidiCommOut() { // Disconnect local out to selected port snd_seq_disconnect_to(alsa_seq, local_out, m_description.client, m_description.port); // This does not harm if done everytime... emulate_kb = false; } MidiCommDescriptionList MidiCommOut::GetDeviceList() { if (built_output_list) return out_list; built_output_list = true; MidiCommDescriptionList devices; unsigned int perms = SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE; doRetrieveDevices(perms, devices); return devices; } void MidiCommOut::Write(const MidiEvent &out) { snd_seq_event_t ev; snd_seq_ev_clear(&ev); // Set my source, to all subscribers, direct delivery snd_seq_ev_set_source(&ev, local_out); snd_seq_ev_set_subs(&ev); snd_seq_ev_set_direct(&ev); // set event type switch (out.Type()) { case MidiEventType_NoteOn: { int ch = out.Channel(); int note = out.NoteNumber(); snd_seq_ev_set_noteon(&ev, ch, note, out.NoteVelocity()); // save for reset notes_on.push_back(pair(ch, note)); break; } case MidiEventType_NoteOff: { int note = out.NoteNumber(); int ch = out.Channel(); snd_seq_ev_set_noteoff(&ev, ch, note, out.NoteVelocity()); // remove from reset pair p(ch, note); vector >::iterator i; for (i = notes_on.begin(); i != notes_on.end(); ++i) { if (*i == p) { notes_on.erase(i); break; } } break; } case MidiEventType_ProgramChange: snd_seq_ev_set_pgmchange(&ev, out.Channel(), out.ProgramNumber()); break; // Unknown type, do nothing default: return; } snd_seq_event_output(alsa_seq, &ev); snd_seq_drain_output(alsa_seq); } void MidiCommOut::Reset() { // Sent Note-Off to every open note snd_seq_event_t ev; snd_seq_ev_clear(&ev); snd_seq_ev_set_source(&ev, local_out); snd_seq_ev_set_subs(&ev); snd_seq_ev_set_direct(&ev); vector >::const_iterator i; for (i = notes_on.begin(); i != notes_on.end(); ++i) { snd_seq_ev_set_noteoff(&ev, i->first, i->second, 0); snd_seq_event_output(alsa_seq, &ev); snd_seq_drain_output(alsa_seq); } } linthesia-0.4.2/src/LinthesiaError.h0000644000175000017500000000171311312674352016373 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __LINTHESIA_ERROR_H__ #define __LINTHESIA_ERROR_H__ #include #include enum LinthesiaErrorCode { Error_StringSpecified, Error_BadPianoType, Error_BadGameState }; class LinthesiaError : public std::exception { public: // TODO: This would be a sweet place to add stack-trace information... LinthesiaError(LinthesiaErrorCode error) : m_error(error), m_optional_string("") { } LinthesiaError(const std::string error) : m_error(Error_StringSpecified), m_optional_string(error) { } std::string GetErrorDescription() const; ~LinthesiaError() throw() { } const LinthesiaErrorCode m_error; private: const std::string m_optional_string; LinthesiaError operator=(const LinthesiaError&); }; #endif // __LINTHESIA_ERROR_H__ linthesia-0.4.2/src/UserSettings.cpp0000644000175000017500000000205211312674352016430 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include #include "StringUtil.h" using namespace std; namespace UserSetting { static bool g_initialized(false); static string g_app_name(""); static Glib::RefPtr gconf; void Initialize(const string &app_name) { if (g_initialized) return; Gnome::Conf::init(); gconf = Gnome::Conf::Client::get_default_client(); g_app_name = "/apps/" + app_name; g_initialized = true; } string Get(const string &setting, const string &default_value) { if (!g_initialized) return default_value; string result = gconf->get_string(g_app_name + "/" + setting); if (result.empty()) return default_value; return result; } void Set(const string &setting, const string &value) { if (!g_initialized) return; gconf->set(g_app_name + "/" + setting, value); } }; // End namespace linthesia-0.4.2/src/StringUtil.h0000644000175000017500000000350611312674352015547 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __STRING_UTIL_H #define __STRING_UTIL_H // Handy string macros #ifndef STRING #include #define STRING(v) ((static_cast(std::ostringstream().\ flush() << v)).str()) #endif #include #include #include #include #include #include // string_type here can be things like std::string or std::wstring template const string_type StringLower(string_type s) { std::locale loc; std::transform(s.begin(), s.end(), s.begin(), std::bind1st( std::mem_fun( &std::ctype::tolower ), &std::use_facet< std::ctype >( loc ) ) ); return s; } // E here is usually wchar_t template, class A = std::allocator > class Widen : public std::unary_function< const std::string&, std::basic_string > { public: Widen(const std::locale& loc = std::locale()) : loc_(loc) { pCType_ = &std::use_facet >(loc); } std::basic_string operator() (const std::string& str) const { if (str.length() == 0) return std::basic_string(); typename std::basic_string::size_type srcLen = str.length(); const char* pSrcBeg = str.c_str(); std::vector tmp(srcLen); pCType_->widen(pSrcBeg, pSrcBeg + srcLen, &tmp[0]); return std::basic_string(&tmp[0], srcLen); } private: std::locale loc_; const std::ctype* pCType_; // No copy-constructor or no assignment operator Widen(const Widen&); Widen& operator= (const Widen&); }; #endif // __STRING_UTIL_H linthesia-0.4.2/src/KeyboardDisplay.cpp0000644000175000017500000005562611326126710017071 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include "KeyboardDisplay.h" #include "TrackProperties.h" #include "LinthesiaError.h" #include "StringUtil.h" #include "Renderer.h" #include "Textures.h" #include "Tga.h" using namespace std; const KeyboardDisplay::NoteTexDimensions KeyboardDisplay::WhiteNoteDimensions = { 32, 128, 4, 25, 22, 28, 93, 100 }; const KeyboardDisplay::NoteTexDimensions KeyboardDisplay::BlackNoteDimensions = { 32, 64, 8, 20, 3, 8, 49, 55 }; struct KeyTexDimensions { int tex_width; int tex_height; int left; int right; int top; int bottom; }; const KeyboardDisplay::KeyTexDimensions KeyboardDisplay::BlackKeyDimensions = { 32, 128, 8, 20, 15, 109 }; KeyboardDisplay::KeyboardDisplay(KeyboardSize size, int pixelWidth, int pixelHeight) : m_size(size), m_width(pixelWidth), m_height(pixelHeight) { } void KeyboardDisplay::Draw(Renderer &renderer, const Tga *key_tex[3], const Tga *note_tex[4], int x, int y, const TranslatedNoteSet ¬es, microseconds_t show_duration, microseconds_t current_time, const vector &track_properties, bool show_names) { // Source: Measured from Yamaha P-70 const static double WhiteWidthHeightRatio = 6.8181818; const static double BlackWidthHeightRatio = 7.9166666; const static double WhiteBlackWidthRatio = 0.5454545; const int white_key_count = GetWhiteKeyCount(); // Calculate the largest white key size we can, and then // leave room for a single pixel space between each key int white_width = (m_width / white_key_count) - 1; int white_space = 1; int white_height = static_cast(white_width * WhiteWidthHeightRatio); const int black_width = static_cast(white_width * WhiteBlackWidthRatio); const int black_height = static_cast(black_width * BlackWidthHeightRatio); const int black_offset = white_width - (black_width / 2); // The dimensions given to the keyboard object are bounds. Because of pixel // rounding, the keyboard will usually occupy less than the maximum in // either direction. // // So, we just try to center the keyboard inside the bounds. const int final_width = (white_width + white_space) * white_key_count; const int x_offset = (m_width - final_width) / 2; const int y_offset = (m_height - white_height); // Give the notes a little more room to work with so they can roll under // the keys without distortion const int y_roll_under = white_height*3/4; // Symbolic names for the arbitrary array passed in here enum { Rail, Shadow, BlackKey, Hits }; DrawGuides(renderer, white_key_count, white_width, white_space, x + x_offset, y, y_offset); // Do two passes on the notes, the first for note shadows and the second // for the note blocks themselves. This is to avoid shadows being drawn // on top of notes. renderer.SetColor(Renderer::ToColor(255, 255, 255)); DrawNotePass(renderer, note_tex[0], note_tex[1], white_width, white_space, black_width, black_offset, x + x_offset, y, y_offset, y_roll_under, notes, show_duration, current_time, track_properties); DrawNotePass(renderer, note_tex[2], note_tex[3], white_width, white_space, black_width, black_offset, x + x_offset, y, y_offset, y_roll_under, notes, show_duration, current_time, track_properties); const int ActualKeyboardWidth = white_width*white_key_count + white_space*(white_key_count-1); // Black out the background of where the keys are about to appear renderer.SetColor(Renderer::ToColor(0, 0, 0)); renderer.DrawQuad(x + x_offset, y+y_offset, ActualKeyboardWidth, white_height); DrawShadow(renderer, key_tex[Shadow], x+x_offset, y+y_offset+white_height - 10, ActualKeyboardWidth); DrawWhiteKeys(renderer, false, white_key_count, white_width, white_height, white_space, x+x_offset, y+y_offset, show_names); // red line (grand pianos dust protection) under black keys renderer.SetColor(Renderer::ToColor(0xff, 0, 0)); renderer.DrawQuad(x + x_offset, y+y_offset+10, ActualKeyboardWidth, 4); renderer.SetColor(Renderer::ToColor(0xff, 0xff, 0xff)); DrawBlackKeys(renderer, key_tex[BlackKey], false, white_key_count, white_width, black_width, black_height, white_space, x+x_offset, y+y_offset, black_offset, show_names); DrawShadow(renderer, key_tex[Shadow], x+x_offset, y+y_offset, ActualKeyboardWidth); DrawRail(renderer, key_tex[Rail], x+x_offset, y+y_offset, ActualKeyboardWidth); // Visual feedback of correct keys pressed DrawHits(renderer, key_tex[Hits], x+x_offset, y+y_offset, white_width, black_width, notes, show_duration, current_time, track_properties); // Top of the screen shadow and rail DrawShadow(renderer, key_tex[Shadow], x+x_offset, y, ActualKeyboardWidth+1); DrawRail(renderer, key_tex[Rail], x+x_offset, y, ActualKeyboardWidth+1); } int KeyboardDisplay::GetStartingOctave() const { // Source: Various "Specification" pages at Yamaha's website const static int StartingOctaveOn37 = 2; const static int StartingOctaveOn49 = 1; const static int StartingOctaveOn61 = 1; // TODO! const static int StartingOctaveOn76 = 0; // TODO! const static int StartingOctaveOn88 = 0; switch (m_size) { case KeyboardSize37: return StartingOctaveOn37; case KeyboardSize49: return StartingOctaveOn49; case KeyboardSize61: return StartingOctaveOn61; case KeyboardSize76: return StartingOctaveOn76; case KeyboardSize88: return StartingOctaveOn88; default: throw LinthesiaError(Error_BadPianoType); } } char KeyboardDisplay::GetStartingNote() const { // Source: Various "Specification" pages at Yamaha's website const static char StartingKeyOn37 = 'F'; // F3-F6 const static char StartingKeyOn49 = 'C'; // C3-C6 const static char StartingKeyOn61 = 'C'; // C1-C6 // TODO! const static char StartingKeyOn76 = 'E'; // E0-G6 // TODO! const static char StartingKeyOn88 = 'A'; // A0-C6 switch (m_size) { case KeyboardSize37: return StartingKeyOn37; case KeyboardSize49: return StartingKeyOn49; case KeyboardSize61: return StartingKeyOn61; case KeyboardSize76: return StartingKeyOn76; case KeyboardSize88: return StartingKeyOn88; default: throw LinthesiaError(Error_BadPianoType); } } int KeyboardDisplay::GetWhiteKeyCount() const { // Source: Google Image Search const static int WhiteKeysOn37 = 22; const static int WhiteKeysOn49 = 29; const static int WhiteKeysOn61 = 36; const static int WhiteKeysOn76 = 45; const static int WhiteKeysOn88 = 52; switch (m_size) { case KeyboardSize37: return WhiteKeysOn37; case KeyboardSize49: return WhiteKeysOn49; case KeyboardSize61: return WhiteKeysOn61; case KeyboardSize76: return WhiteKeysOn76; case KeyboardSize88: return WhiteKeysOn88; default: throw LinthesiaError(Error_BadPianoType); } } void KeyboardDisplay::DrawWhiteKeys(Renderer &renderer, bool active_only, int key_count, int key_width, int key_height, int key_space, int x_offset, int y_offset, bool show_names) const { Color white = Renderer::ToColor(255, 255, 255); char current_white = GetStartingNote(); int current_octave = GetStartingOctave() + 1; for (int i = 0; i < key_count; ++i) { // Check to see if this is one of the active notes const string note_name = STRING(current_white << current_octave); KeyNames::const_iterator find_result = m_active_keys.find(note_name); bool active = (find_result != m_active_keys.end()); Color c = white; if (active) c = Track::ColorNoteWhite[find_result->second]; if ((active_only && active) || !active_only) { renderer.SetColor(c); const int key_x = i * (key_width + key_space) + x_offset; renderer.DrawQuad(key_x, y_offset, key_width, key_height); // print key name // FIXME: adjust position if (show_names) { // FIXME: note name are not correct TextWriter note_text(key_x + key_width/2 - 3, y_offset + 3*(key_height/4), renderer, false, 10); note_text << Text(STRING(MidiEvent::NoteName(i)[0]), Black); } } current_white++; if (current_white == 'H') current_white = 'A'; if (current_white == 'C') current_octave++; } } void KeyboardDisplay::DrawBlackKey(Renderer &renderer, const Tga *tex, const KeyTexDimensions &tex_dimensions, int x, int y, int w, int h, Track::TrackColor color) const { const KeyTexDimensions &d = tex_dimensions; const int tex_w = d.right - d.left; const double width_scale = double(w) / double(tex_w); const double full_tex_width = d.tex_width * width_scale; const double left_offset = d.left * width_scale; const int src_x = (int(color) * d.tex_width); const int dest_x = int(x - left_offset) - 1; const int dest_w = int(full_tex_width); const int tex_h = d.bottom - d.top; const double height_scale = double(h) / double(tex_h); const double full_tex_height = d.tex_height * height_scale; const double top_offset = d.top * height_scale; const int dest_y = int(y - top_offset) - 1; const int dest_h = int(full_tex_height); renderer.DrawStretchedTga(tex, dest_x, dest_y, dest_w, dest_h, src_x, 0, d.tex_width, d.tex_height); } void KeyboardDisplay::DrawBlackKeys(Renderer &renderer, const Tga *tex, bool active_only, int white_key_count, int white_width, int black_width, int black_height, int key_space, int x_offset, int y_offset, int black_offset, bool show_names) const { char current_white = GetStartingNote(); int current_octave = GetStartingOctave() + 1; for (int i = 0; i < white_key_count; ++i) { // Don't allow a very last black key if (i == white_key_count - 1) break; switch (current_white) { case 'A': case 'C': case 'D': case 'F': case 'G': { // Check to see if this is one of the active notes const string note_name = STRING(current_white << '#' << current_octave); KeyNames::const_iterator find_result = m_active_keys.find(note_name); bool active = (find_result != m_active_keys.end()); // In this case, MissedNote isn't actually MissedNote. In the black key // texture we use this value (which doesn't make any sense in this context) // as the default "Black" color. Track::TrackColor c = Track::MissedNote; if (active) c = find_result->second; if (!active_only || (active_only && active)) { const int start_x = i * (white_width + key_space) + x_offset + black_offset; DrawBlackKey(renderer, tex, BlackKeyDimensions, start_x, y_offset, black_width, black_height, c); // print key name // FIXME: adjust position if (show_names) { // FIXME: this does not runs // TextWriter note_text(start_x + black_width/2 - 3, // y_offset + 3*(black_height/4), renderer, false, 10); // string n = MidiEvent::NoteName(i); // note_text << STRING(n[0] << n[1]); } } }} current_white++; if (current_white == 'H') current_white = 'A'; if (current_white == 'C') current_octave++; } } void DrawWidthStretched(Renderer &renderer, const Tga *tex, int x, int y, int width) { renderer.DrawStretchedTga(tex, x, y, width, tex->GetHeight(), 0, 0, tex->GetWidth(), tex->GetWidth()); } void KeyboardDisplay::DrawRail(Renderer &renderer, const Tga *tex, int x, int y, int width) const { const static int RailOffsetY = -4; DrawWidthStretched(renderer, tex, x, y + RailOffsetY, width); } void KeyboardDisplay::DrawHits(Renderer &renderer, const Tga *tex, int x, int y, int white_width, int black_width, const TranslatedNoteSet ¬es, microseconds_t show_duration, microseconds_t current_time, const std::vector &track_properties) const { const static int offset_y = -14; // Shiny music domain knowledge const static unsigned int NotesPerOctave = 12; const static unsigned int WhiteNotesPerOctave = 7; // The constants used in the switch below refer to the number // of white keys off 'C' that type of piano starts on int keyboard_type_offset = 0; // This array describes how to "stack" notes in a single place. const static int NoteToWhiteNoteOffset[12] = { 0, -1, -1, -2, -2, -2, -3, -3, -4, -4, -5, -5 }; const static bool IsBlackNote[12] = { false, true, false, true, false, false, true, false, true, false, true, false }; switch (m_size) { case KeyboardSize37: keyboard_type_offset = 4 - WhiteNotesPerOctave; break; case KeyboardSize49: keyboard_type_offset = 0 - WhiteNotesPerOctave; break; case KeyboardSize61: keyboard_type_offset = 7 - WhiteNotesPerOctave; break; // TODO! case KeyboardSize76: keyboard_type_offset = 5 - WhiteNotesPerOctave; break; // TODO! case KeyboardSize88: keyboard_type_offset = 2 - WhiteNotesPerOctave; break; default: throw LinthesiaError(Error_BadPianoType); } for (TranslatedNoteSet::const_iterator i = notes.begin(); i != notes.end(); ++i) { // This list is sorted by note start time. The moment we encounter // a note scrolled off the window, we're done drawing if (i->start > current_time + show_duration) break; // Only shine if you play if (track_properties[i->track_id].mode != Track::ModeYouPlay) continue; // User missed the key if (i->state != UserHit) continue; // Check to see if this is one of the active notes const string note_name = MidiEvent::NoteName(i->note_id); KeyNames::const_iterator find_result = m_active_keys.find(note_name); if (find_result == m_active_keys.end()) continue; // key pressed twice, invalid if (find_result->second == Track::FlatGray) continue; const int octave = (i->note_id / NotesPerOctave) - GetStartingOctave(); const int octave_base = i->note_id % NotesPerOctave; const int stack_offset = NoteToWhiteNoteOffset[octave_base]; const int octave_offset = (max(octave - 1, 0) * WhiteNotesPerOctave); const int inner_octave_offset = (octave_base + stack_offset); // FIXME: Argg, magic numbers!! const int offset_x = (octave_offset + inner_octave_offset + keyboard_type_offset) * (white_width+1) - (tex->GetWidth()-16)/2 +1 + (IsBlackNote[octave_base]?black_width:0); renderer.DrawTga(tex, x+offset_x, y+offset_y); } } void KeyboardDisplay::DrawShadow(Renderer &renderer, const Tga *tex, int x, int y, int width) const { const static int ShadowOffsetY = 10; DrawWidthStretched(renderer, tex, x, y + ShadowOffsetY, width); } void KeyboardDisplay::DrawGuides(Renderer &renderer, int key_count, int key_width, int key_space, int x_offset, int y, int y_offset) const { const static int PixelsOffKeyboard = 2; int keyboard_width = key_width*key_count + key_space*(key_count-1); // Fill the background of the note-falling area renderer.ForceTexture(0); renderer.SetColor(0x60, 0x60, 0x60); renderer.DrawQuad(x_offset, y, keyboard_width, y_offset - PixelsOffKeyboard); const Color thick(Renderer::ToColor(0x48,0x48,0x48)); const Color thin(Renderer::ToColor(0x50,0x50,0x50)); char current_white = GetStartingNote() - 1; int current_octave = GetStartingOctave() + 1; for (int i = 0; i < key_count + 1; ++i) { const int key_x = i * (key_width + key_space) + x_offset - 1; int guide_thickness = 1; Color guide_color = thin; bool draw_guide = true; switch (current_white) { case 'C': case 'D': guide_color = thin; break; case 'F': case 'G': case 'A': { guide_color = thick; guide_thickness = 2; break; } default: { draw_guide = false; break; } } if (draw_guide) { renderer.SetColor(guide_color); renderer.DrawQuad(key_x - guide_thickness/2, y, guide_thickness, y_offset - PixelsOffKeyboard); } current_white++; if (current_white == 'H') current_white = 'A'; if (current_white == 'C') current_octave++; } } void KeyboardDisplay::DrawNote(Renderer &renderer, const Tga *tex, const NoteTexDimensions &tex_dimensions, int x, int y, int w, int h, int color_id) const { const NoteTexDimensions &d = tex_dimensions; // Width is super-easy const int tex_note_w = d.right - d.left; const double width_scale = double(w) / double(tex_note_w); const double full_tex_width = d.tex_width * width_scale; const double left_offset = d.left * width_scale; const int src_x = (color_id * d.tex_width); const int dest_x = int(x - left_offset); const int dest_w = int(full_tex_width); // Now we draw the note in three sections: // - Crown (fixed (relative) height) // - Middle (variable height) // - Heel (fixed (relative) height) // Force the note to be at least as large as the crown + heel height const double crown_h = (d.crown_end - d.crown_start) * width_scale; const double heel_h = (d.heel_end - d.heel_start) * width_scale; const double min_height = crown_h + heel_h + 1.0; if (h < min_height) { const int diff = int(min_height - h); h += diff; y -= diff; } // We actually use the width scale in height calculations // to keep the proportions fixed. const double crown_start_offset = d.crown_start * width_scale; const double crown_end_offset = d.crown_end * width_scale; const double heel_height = double(d.heel_end - d.heel_start) * width_scale; const double bottom_height = double(d.tex_height - d.heel_end) * width_scale; const int dest_y1 = int(y - crown_start_offset); const int dest_y2 = int(dest_y1 + crown_end_offset); const int dest_y3 = int((y+h) - heel_height); const int dest_y4 = int(dest_y3 + bottom_height); renderer.DrawStretchedTga(tex, dest_x, dest_y1, dest_w, dest_y2 - dest_y1, src_x, 0, d.tex_width, d.crown_end); renderer.DrawStretchedTga(tex, dest_x, dest_y2, dest_w, dest_y3 - dest_y2, src_x, d.crown_end, d.tex_width, d.heel_start - d.crown_end); renderer.DrawStretchedTga(tex, dest_x, dest_y3, dest_w, dest_y4 - dest_y3, src_x, d.heel_start, d.tex_width, d.tex_height - d.heel_start); } void KeyboardDisplay::DrawNotePass(Renderer &renderer, const Tga *tex_white, const Tga *tex_black, int white_width, int key_space, int black_width, int black_offset, int x_offset, int y, int y_offset, int y_roll_under, const TranslatedNoteSet ¬es, microseconds_t show_duration, microseconds_t current_time, const vector &track_properties) const { // Shiny music domain knowledge const static unsigned int NotesPerOctave = 12; const static unsigned int WhiteNotesPerOctave = 7; const static bool IsBlackNote[12] = { false, true, false, true, false, false, true, false, true, false, true, false }; // The constants used in the switch below refer to the number // of white keys off 'C' that type of piano starts on int keyboard_type_offset = 0; switch (m_size) { case KeyboardSize37: keyboard_type_offset = 4 - WhiteNotesPerOctave; break; case KeyboardSize49: keyboard_type_offset = 0 - WhiteNotesPerOctave; break; case KeyboardSize61: keyboard_type_offset = 7 - WhiteNotesPerOctave; break; // TODO! case KeyboardSize76: keyboard_type_offset = 5 - WhiteNotesPerOctave; break; // TODO! case KeyboardSize88: keyboard_type_offset = 2 - WhiteNotesPerOctave; break; default: throw LinthesiaError(Error_BadPianoType); } // This array describes how to "stack" notes in a single place. The IsBlackNote array // then tells which one should be shifted slightly to the right const static int NoteToWhiteNoteOffset[12] = { 0, -1, -1, -2, -2, -2, -3, -3, -4, -4, -5, -5 }; const static int MinNoteHeight = 3; bool drawing_black = false; for (int toggle = 0; toggle < 2; ++toggle) { for (TranslatedNoteSet::const_iterator i = notes.begin(); i != notes.end(); ++i) { // This list is sorted by note start time. The moment we encounter // a note scrolled off the window, we're done drawing if (i->start > current_time + show_duration) break; const Track::Mode mode = track_properties[i->track_id].mode; if (mode == Track::ModeNotPlayed || mode == Track::ModePlayedButHidden) continue; const int octave = (i->note_id / NotesPerOctave) - GetStartingOctave(); const int octave_base = i->note_id % NotesPerOctave; const int stack_offset = NoteToWhiteNoteOffset[octave_base]; const bool is_black = IsBlackNote[octave_base]; if (drawing_black != is_black) continue; const int octave_offset = (max(octave - 1, 0) * WhiteNotesPerOctave); const int inner_octave_offset = (octave_base + stack_offset); const int generalized_black_offset = (is_black?black_offset:0); const double scaling_factor = static_cast(y_offset) / static_cast(show_duration); const long long roll_under = static_cast(y_roll_under / scaling_factor); const long long adjusted_start = max(i->start - current_time, -roll_under); const long long adjusted_end = max(i->end - current_time, 0LL); if (adjusted_end < adjusted_start) continue; // Convert our times to pixel coordinates const int y_end = y - static_cast(adjusted_start * scaling_factor) + y_offset; const int y_start = y - static_cast(adjusted_end * scaling_factor) + y_offset; const int start_x = (octave_offset + inner_octave_offset + keyboard_type_offset) * (white_width + key_space) + generalized_black_offset + x_offset; const int left = start_x - 1; const int top = y_start; const int width = (is_black ? black_width : white_width) + 2; int height = y_end - y_start; // Force a note to be a minimum height at all times // except when scrolling off underneath the keyboard and // coming in from the top of the screen. const bool hitting_bottom = (adjusted_start + current_time != i->start); const bool hitting_top = (adjusted_end + current_time != i->end); if (!hitting_bottom && !hitting_top) { while ( (height) < MinNoteHeight) height++; } const Track::TrackColor color = track_properties[i->track_id].color; const int &brush_id = (i->state == UserMissed ? Track::MissedNote : color); DrawNote(renderer, (drawing_black ? tex_black : tex_white), (drawing_black ? BlackNoteDimensions : WhiteNoteDimensions), left, top, width, height, brush_id); } drawing_black = !drawing_black; } } void KeyboardDisplay::SetKeyActive(const string &key_name, bool active, Track::TrackColor color) { if (active) m_active_keys[key_name] = color; else m_active_keys.erase(key_name); } linthesia-0.4.2/src/LinthesiaError.cpp0000644000175000017500000000117311312674352016726 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include "LinthesiaError.h" #include "StringUtil.h" using namespace std; string LinthesiaError::GetErrorDescription() const { switch (m_error) { case Error_StringSpecified: return m_optional_string; case Error_BadPianoType: return "Bad piano type specified."; case Error_BadGameState: return "Internal Error: Linthesia entered bad game state!"; default: return STRING("Unknown LinthesiaError Code (" << m_error << ")."); } } linthesia-0.4.2/src/Makefile0000644000175000017500000000162011315172317014722 0ustar cletocleto# -*- mode: makefile-gmake; coding: utf-8 -*- GRAPHDIR?=../graphics CXX = g++ CXXFLAGS = -I . -I libmidi -ggdb -Wall -ansi CXXFLAGS += `pkg-config --cflags gtkmm-2.4 gconfmm-2.6 gtkglextmm-1.2 alsa` -DGRAPHDIR="\"$(GRAPHDIR)\"" LDFLAGS = `pkg-config --libs gtkmm-2.4 gconfmm-2.6 gtkglextmm-1.2 alsa` TARGET = linthesia all: $(TARGET) $(TARGET): main.o LinthesiaError.o UserSettings.o \ CompatibleSystem.o FileSelector.o Renderer.o \ Tga.o GameState.o TitleState.o TextWriter.o \ MenuLayout.o DeviceTile.o StringTile.o MidiComm.o \ TrackSelectionState.o TrackTile.o PlayingState.o \ StatsState.o KeyboardDisplay.o libmidi/libmidi.a $(CXX) $(LDFLAGS) -o $@ $^ libmidi/libmidi.a: $(MAKE) -C libmidi install: all -mkdir -p $(DESTDIR)/usr/games install -m 755 $(TARGET) -g root -o root $(DESTDIR)/usr/games/ .PHONY:clean clean: find . -name "*.o" -delete find . -name "*~" -delete $(RM) $(TARGET) linthesia-0.4.2/src/OSGraphics.h0000644000175000017500000000060011314377746015446 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __OS_GRAPHICS_H #define __OS_GRAPHICS_H // only for 'Ms. pepis' debugging #include #include #include #include #include #endif // __OS_GRAPHICS_H linthesia-0.4.2/src/main.cpp0000644000175000017500000003103211326126710014710 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include #include "OSGraphics.h" #include "StringUtil.h" #include "FileSelector.h" #include "UserSettings.h" #include "Version.h" #include "CompatibleSystem.h" #include "LinthesiaError.h" #include "Tga.h" #include "Renderer.h" #include "SharedState.h" #include "GameState.h" #include "TitleState.h" #include "libmidi/Midi.h" #include "libmidi/MidiUtil.h" #ifndef GRAPHDIR #define GRAPHDIR "../graphics" #endif using namespace std; GameStateManager* state_manager; const static string application_name = "Linthesia"; const static string friendly_app_name = STRING("Linthesia " << LinthesiaVersionString); const static string error_header1 = "Linthesia detected a"; const static string error_header2 = " problem and must close:\n\n"; const static string error_footer = "\n\nIf you don't think this should have " "happened, please\ncontact Oscar (on Linthesia sourceforge site) and\n" "describe what you were doing when the problem\noccurred. Thanks."; class EdgeTracker { public: EdgeTracker() : active(true), just_active(true) { } void Activate() { just_active = true; active = true; } void Deactivate() { just_active = false; active = false; } bool IsActive() { return active; } bool JustActivated() { bool was_active = just_active; just_active = false; return was_active; } private: bool active; bool just_active; }; static EdgeTracker window_state; class DrawingArea : public Gtk::GL::DrawingArea { public: DrawingArea(const Glib::RefPtr& config) : Gtk::GL::DrawingArea(config) { set_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK); set_can_focus(); signal_motion_notify_event().connect(sigc::mem_fun(*this, &DrawingArea::on_motion_notify)); signal_button_press_event().connect(sigc::mem_fun(*this, &DrawingArea::on_button_press)); signal_button_release_event().connect(sigc::mem_fun(*this, &DrawingArea::on_button_press)); signal_key_press_event().connect(sigc::mem_fun(*this, &DrawingArea::on_key_press)); signal_key_release_event().connect(sigc::mem_fun(*this, &DrawingArea::on_key_release)); } bool GameLoop(); protected: virtual bool on_configure_event(GdkEventConfigure* event); virtual bool on_expose_event(GdkEventExpose* event); virtual bool on_motion_notify(GdkEventMotion* event); virtual bool on_button_press(GdkEventButton* event); virtual bool on_key_press(GdkEventKey* event); virtual bool on_key_release(GdkEventKey* event); }; bool DrawingArea::on_motion_notify(GdkEventMotion* event) { state_manager->MouseMove(event->x, event->y); return true; } bool DrawingArea::on_button_press(GdkEventButton* event) { MouseButton b; // left and right click allowed if (event->button == 1) b = MouseLeft; else if (event->button == 3) b = MouseRight; // ignore other buttons else return false; // press or release? if (event->type == GDK_BUTTON_PRESS) state_manager->MousePress(b); else if (event->type == GDK_BUTTON_RELEASE) state_manager->MouseRelease(b); else return false; return true; } // FIXME: use user settings to do this mapping int keyToNote(GdkEventKey* event) { const unsigned short oct = 4; switch(event->keyval) { /* no key for C :( */ case GDK_masculine: return 12*oct + 1; /* C# */ case GDK_Tab: return 12*oct + 2; /* D */ case GDK_1: return 12*oct + 3; /* D# */ case GDK_q: return 12*oct + 4; /* E */ case GDK_w: return 12*oct + 5; /* F */ case GDK_3: return 12*oct + 6; /* F# */ case GDK_e: return 12*oct + 7; /* G */ case GDK_4: return 12*oct + 8; /* G# */ case GDK_r: return 12*oct + 9; /* A */ case GDK_5: return 12*oct + 10; /* A# */ case GDK_t: return 12*oct + 11; /* B */ case GDK_y: return 12*(oct+1) + 0; /* C */ case GDK_7: return 12*(oct+1) + 1; /* C# */ case GDK_u: return 12*(oct+1) + 2; /* D */ case GDK_8: return 12*(oct+1) + 3; /* D# */ case GDK_i: return 12*(oct+1) + 4; /* E */ case GDK_o: return 12*(oct+1) + 5; /* F */ case GDK_0: return 12*(oct+1) + 6; /* F# */ case GDK_p: return 12*(oct+1) + 7; /* G */ case GDK_apostrophe: return 12*(oct+1) + 8; /* G# */ case GDK_dead_grave: return 12*(oct+1) + 9; /* A */ case GDK_exclamdown: return 12*(oct+1) + 10; /* A# */ case GDK_plus: return 12*(oct+1) + 11; /* B */ } return -1; } typedef map ConnectMap; ConnectMap pressed; bool __sendNoteOff(int note) { ConnectMap::iterator it = pressed.find(note); if (it == pressed.end()) return false; sendNote(note, false); pressed.erase(it); return true; } bool DrawingArea::on_key_press(GdkEventKey* event) { // if is a note... int note = keyToNote(event); if (note >= 0) { // if first press, send Note-On ConnectMap::iterator it = pressed.find(note); if (it == pressed.end()) sendNote(note, true); // otherwise, cancel emission of Note-off else it->second.disconnect(); return true; } switch (event->keyval) { case GDK_Up: state_manager->KeyPress(KeyUp); break; case GDK_Down: state_manager->KeyPress(KeyDown); break; case GDK_Left: state_manager->KeyPress(KeyLeft); break; case GDK_Right: state_manager->KeyPress(KeyRight); break; case GDK_space: state_manager->KeyPress(KeySpace); break; case GDK_Return: state_manager->KeyPress(KeyEnter); break; case GDK_Escape: state_manager->KeyPress(KeyEscape); break; // show FPS case GDK_F6: state_manager->KeyPress(KeyF6); break; // show key names case GDK_F7: state_manager->KeyPress(KeyF7); break; // increase/decrease octave case GDK_greater: state_manager->KeyPress(KeyGreater); break; case GDK_less: state_manager->KeyPress(KeyLess); break; default: return false; } return true; } bool DrawingArea::on_key_release(GdkEventKey* event) { // if is a note... int note = keyToNote(event); if (note >= 0) { // setup a timeout with Note-Off pressed[note] = Glib::signal_timeout().connect( sigc::bind(sigc::ptr_fun(&__sendNoteOff), note), 20); return true; } return false; } bool DrawingArea::on_configure_event(GdkEventConfigure* event) { Glib::RefPtr glwindow = get_gl_window(); if (!glwindow->gl_begin(get_gl_context())) return false; glDisable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glShadeModel(GL_SMOOTH); glViewport(0, 0, get_width(), get_height()); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, get_width(), 0, get_height()); state_manager->Update(window_state.JustActivated()); glwindow->gl_end(); return true; } bool DrawingArea::on_expose_event(GdkEventExpose* event) { Glib::RefPtr glwindow = get_gl_window(); if (!glwindow->gl_begin(get_gl_context())) return false; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glCallList(1); Renderer rend(get_gl_context(), get_pango_context()); state_manager->Draw(rend); // swap buffers. if (glwindow->is_double_buffered()) glwindow->swap_buffers(); else glFlush(); glwindow->gl_end(); return true; } bool DrawingArea::GameLoop() { if (window_state.IsActive()) { state_manager->Update(window_state.JustActivated()); Renderer rend(get_gl_context(), get_pango_context()); state_manager->Draw(rend); } return true; } int main(int argc, char *argv[]) { Gtk::Main main_loop(argc, argv); Gtk::GL::init(argc, argv); state_manager = new GameStateManager(Compatible::GetDisplayWidth(), Compatible::GetDisplayHeight()); try { string filename(""); UserSetting::Initialize(application_name); if (argc > 1) filename = string(argv[1]); // strip any leading or trailing quotes from the filename // argument (to match the format returned by the open-file // dialog later). if (filename.length() > 0 && filename[0] == '\"') filename = filename.substr(1, filename.length() - 1); if (filename.length() > 0 && filename[filename.length()-1] == '\"') filename = filename.substr(0, filename.length() - 1); Midi *midi = 0; // attempt to open the midi file given on the command line first if (filename != "") { try { midi = new Midi(Midi::ReadFromFile(filename)); } catch (const MidiError &e) { string wrapped_description = STRING("Problem while loading file: " << filename << "\n") + e.GetErrorDescription(); Compatible::ShowError(wrapped_description); filename = ""; midi = 0; } } // if midi couldn't be opened from command line filename or there // simply was no command line filename, use a "file open" dialog. if (filename == "") { while (!midi) { string file_title; FileSelector::RequestMidiFilename(&filename, &file_title); if (filename != "") { try { midi = new Midi(Midi::ReadFromFile(filename)); } catch (const MidiError &e) { string wrapped_description = \ STRING("Problem while loading file: " << file_title << "\n") + e.GetErrorDescription(); Compatible::ShowError(wrapped_description); midi = 0; } } else { // they pressed cancel, so they must not want to run // the app anymore. return 0; } } } Glib::RefPtr glconfig; // try double-buffered visual glconfig = Gdk::GL::Config::create(Gdk::GL::MODE_RGB | Gdk::GL::MODE_DEPTH | Gdk::GL::MODE_DOUBLE); if (!glconfig) { cerr << "*** Cannot find the double-buffered visual.\n" << "*** Trying single-buffered visual.\n"; // try single-buffered visual glconfig = Gdk::GL::Config::create(Gdk::GL::MODE_RGB | Gdk::GL::MODE_DEPTH); if (!glconfig) { string description = STRING(error_header1 << " OpenGL" << error_header2 << "Cannot find any OpenGL-capable visual." << error_footer); Compatible::ShowError(description); return 1; } } Gtk::Window window; DrawingArea da(glconfig); window.add(da); window.show_all(); // do this after gl context is created (ie. after da realized) SharedState state; state.song_title = FileSelector::TrimFilename(filename); state.midi = midi; state_manager->SetInitialState(new TitleState(state)); window.fullscreen(); window.set_title(friendly_app_name); window.set_icon_from_file(string(GRAPHDIR) + "/app_icon.ico"); // get refresh rate from user settings string key = "refresh_rate"; int rate = 65; string user_rate = UserSetting::Get(key, ""); if (user_rate.empty()) { user_rate = STRING(rate); UserSetting::Set(key, user_rate); } else { istringstream iss(user_rate); if (not (iss >> rate)) { Compatible::ShowError("Invalid setting for '"+ key +"' key.\n\nIt will be reset to default value."); UserSetting::Set(key, ""); } } Glib::signal_timeout().connect(sigc::mem_fun(da, &DrawingArea::GameLoop), 1000/rate); main_loop.run(window); window_state.Deactivate(); return 0; } catch (const LinthesiaError &e) { string wrapped_description = STRING(error_header1 << error_header2 << e.GetErrorDescription() << error_footer); Compatible::ShowError(wrapped_description); } catch (const MidiError &e) { string wrapped_description = STRING(error_header1 << " MIDI" << error_header2 << e.GetErrorDescription() << error_footer); Compatible::ShowError(wrapped_description); } catch (const exception &e) { string wrapped_description = STRING("Linthesia detected an unknown " "problem and must close! '" << e.what() << "'" << error_footer); Compatible::ShowError(wrapped_description); } catch (...) { string wrapped_description = STRING("Linthesia detected an unknown " "problem and must close!" << error_footer); Compatible::ShowError(wrapped_description); } return 1; } linthesia-0.4.2/src/TrackProperties.h0000644000175000017500000000367411314377746016603 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #ifndef __TRACK_PROPERTIES_H #define __TRACK_PROPERTIES_H #include "Renderer.h" namespace Track { enum Mode { ModePlayedAutomatically, ModeYouPlay, ModePlayedButHidden, ModeNotPlayed, ModeCount }; // Based on the Open Source icon theme "Tango" color scheme // with a few changes. (e.g. Chameleon NoteBlack is a little // darker to distinguish it from NoteWhite, ScarletRed is a // little brighter to make it easier on the eyes, etc.) const static int ColorCount = 8; const static int UserSelectableColorCount = ColorCount - 2; enum TrackColor { TangoSkyBlue = 0, TangoChameleon, TangoOrange, TangoButter, TangoPlum, TangoScarletRed, FlatGray, MissedNote }; const static Color ColorNoteWhite[ColorCount] = { { 114, 159, 207, 0xFF }, { 138, 226, 52, 0xFF }, { 252, 175, 62, 0xFF }, { 252, 235, 87, 0xFF }, { 173, 104, 180, 0xFF }, { 238, 94, 94, 0xFF }, { 90, 90, 90, 0xFF }, { 60, 60, 60, 0xFF } }; const static Color ColorNoteHit[ColorCount] = { { 192, 222, 255, 0xFF }, { 203, 255, 152, 0xFF }, { 255, 216, 152, 0xFF }, { 255, 247, 178, 0xFF }, { 255, 218, 251, 0xFF }, { 255, 178, 178, 0xFF }, { 180, 180, 180, 0xFF }, { 60, 60, 60, 0xFF } }; const static Color ColorNoteBlack[ColorCount] = { { 52, 101, 164, 0xFF }, { 86, 157, 17, 0xFF }, { 245, 121, 0, 0xFF }, { 218, 195, 0, 0xFF }, { 108, 76, 113, 0xFF }, { 233, 49, 49, 0xFF }, { 90, 90, 90, 0xFF }, { 60, 60, 60, 0xFF } }; struct Properties { Properties() : mode(ModeNotPlayed), color(TangoSkyBlue) { } Mode mode; TrackColor color; }; }; // end namespace #endif // __TRACK_PROPERTIES_H linthesia-0.4.2/src/GameState.cpp0000644000175000017500000001534711326126710015651 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include "GameState.h" #include "Renderer.h" #include "Textures.h" #include "CompatibleSystem.h" #include "Tga.h" #include "OSGraphics.h" // For FPS display #include "TextWriter.h" #include using namespace std; // only used on here const static char* TextureResourceNames[_TextureEnumCount] = { "title_Logo", "InterfaceButtons", "score_RetrySong", "title_ChooseTracks", "title_Exit", "tracks_BackToTitle", "tracks_PlaySong", "title_InputBox", "title_OutputBox", "title_SongBox", "trackbox", "stats_text", "play_Status", "play_Status2", "play_Keys", "play_NotesBlackColor", "play_NotesBlackShadow", "play_NotesWhiteColor", "play_NotesWhiteShadow", "play_KeyRail", "play_KeyShadow", "play_KeysBlack", "play_KeyHits" }; Tga *GameState::GetTexture(Texture tex_name, bool smooth) const { if (!m_manager) throw GameStateError("Cannot retrieve texture if manager not set!"); return m_manager->GetTexture(tex_name, smooth); } void GameState::ChangeState(GameState *new_state) { if (!m_manager) throw GameStateError("Cannot change state if manager not set!"); m_manager->ChangeState(new_state); } int GameState::GetStateWidth() const { if (!m_manager) throw GameStateError("Cannot retrieve state width if manager not set!"); return m_manager->GetStateWidth(); } int GameState::GetStateHeight() const { if (!m_manager) throw GameStateError("Cannot retrieve state height if manager not set!"); return m_manager->GetStateHeight(); } bool GameState::IsKeyPressed(GameKey key) const { if (!m_manager) throw GameStateError("Cannot determine key presses if manager not set!"); return m_manager->IsKeyPressed(key); } const MouseInfo &GameState::Mouse() const { if (!m_manager) throw GameStateError("Cannot determine mouse input if manager not set!"); return m_manager->Mouse(); } void GameState::SetManager(GameStateManager *manager) { if (m_manager) throw GameStateError("State already has a manager!"); m_manager = manager; Init(); } GameStateManager::~GameStateManager() { for (map::iterator i = m_textures.begin(); i != m_textures.end(); ++i) { if (i->second) Tga::Release(i->second); i->second = 0; } } Tga *GameStateManager::GetTexture(Texture tex_name, bool smooth) const { if (!m_textures[tex_name]) m_textures[tex_name] = Tga::Load(TextureResourceNames[tex_name]); m_textures[tex_name]->SetSmooth(smooth); return m_textures[tex_name]; } void GameStateManager::KeyPress(GameKey key) { m_key_presses |= static_cast(key); } bool GameStateManager::IsKeyPressed(GameKey key) const { return ( (m_key_presses & static_cast(key)) != 0); } bool GameStateManager::IsKeyReleased(GameKey key) const { return (!IsKeyPressed(key) && ((m_last_key_presses & static_cast(key)) != 0)); } void GameStateManager::MousePress(MouseButton button) { switch (button) { case MouseLeft: m_mouse.held.left = true; m_mouse.released.left = false; m_mouse.newPress.left = true; break; case MouseRight: m_mouse.held.right = true; m_mouse.released.right = false; m_mouse.newPress.right = true; break; } } void GameStateManager::MouseRelease(MouseButton button) { switch (button) { case MouseLeft: m_mouse.held.left = false; m_mouse.released.left = true; m_mouse.newPress.left = false; break; case MouseRight: m_mouse.held.right = false; m_mouse.released.right = true; m_mouse.newPress.right = false; break; } } void GameStateManager::MouseMove(int x, int y) { m_mouse.x = x; m_mouse.y = y; } void GameStateManager::SetInitialState(GameState *first_state) { if (m_current_state) throw GameStateError("Cannot set an initial state because GameStateManager" " already has a state!"); first_state->SetManager(this); m_current_state = first_state; } void GameStateManager::ChangeState(GameState *new_state) { if (!m_current_state) throw GameStateError("Cannot change state without a state! " "Use SetInitialState()!"); if (!new_state) throw GameStateError("Cannot change to a null state!"); if (!m_inside_update) throw GameStateError("ChangeState must be called from inside another " "state's Update() function! (This is so we can " "guarantee the ordering of the draw/update calls.)"); m_next_state = new_state; } void GameStateManager::Update(bool skip_this_update) { // Manager's timer grows constantly const unsigned long now = Compatible::GetMilliseconds(); const unsigned long delta = now - m_last_milliseconds; m_last_milliseconds = now; // Now that we've updated the time, we can return if // we've been told to skip this one. if (skip_this_update) return; m_fps.Frame(delta); if (IsKeyReleased(KeyF6)) m_show_fps = !m_show_fps; if (m_next_state && m_current_state) { delete m_current_state; m_current_state = 0; // We return here to insert a blank frame (that may or may // not last a long time) while the next state's Init() // and first Update() are being called. return; } if (m_next_state) { m_current_state = m_next_state; m_next_state = 0; m_current_state->SetManager(this); } if (!m_current_state) return; m_inside_update = true; m_current_state->m_last_delta_milliseconds = delta; m_current_state->m_state_milliseconds += delta; m_current_state->Update(); m_inside_update = false; // Reset our keypresses for the next frame m_last_key_presses = m_key_presses; m_key_presses = 0; // Reset our mouse clicks for the next frame m_mouse.newPress = MouseButtons(); m_mouse.released = MouseButtons(); } void GameStateManager::Draw(Renderer &renderer) { if (!m_current_state) return; // NOTE: Sweet transition effects are *very* possible here... rendering // the previous state *and* the current state during some transition // would be really easy. const static float gray = 64.0f / 255.0f; glClearColor(gray, gray, gray, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0., static_cast(GetStateHeight()), 0.); glScalef (1., -1., 1.); glTranslatef(0.375, 0.375, 0.); m_current_state->Draw(renderer); if (m_show_fps) { TextWriter fps_writer(0, 0, renderer); fps_writer << Text("FPS: ", Gray) << Text(STRING(setprecision(6) << m_fps.GetFramesPerSecond()), White); } glFlush (); renderer.SwapBuffers(); } linthesia-0.4.2/src/TrackSelectionState.cpp0000644000175000017500000002401511314377746017720 0ustar cletocleto// -*- mode: c++; coding: utf-8 -*- // Linthesia // Copyright (c) 2007 Nicholas Piegdon // Adaptation to GNU/Linux by Oscar Aceña // See COPYING for license information #include "TrackSelectionState.h" #include "TitleState.h" #include "PlayingState.h" #include "MenuLayout.h" #include "Renderer.h" #include "Textures.h" #include "libmidi/Midi.h" #include "libmidi/MidiUtil.h" #include "MidiComm.h" using namespace std; TrackSelectionState::TrackSelectionState(const SharedState &state) : m_page_count(0), m_current_page(0), m_tiles_per_page(0), m_preview_on(false), m_first_update_after_seek(false), m_preview_track_id(0), m_state(state) { } void TrackSelectionState::Init() { if (m_state.midi_out) m_state.midi_out->Reset(); Midi &m = *m_state.midi; // Prepare a very simple count of the playable tracks first int track_count = 0; for (size_t i = 0; i < m.Tracks().size(); ++i) { if (m.Tracks()[i].Notes().size()) track_count++; } m_back_button = ButtonState( Layout::ScreenMarginX, GetStateHeight() - Layout::ScreenMarginY/2 - Layout::ButtonHeight/2, Layout::ButtonWidth, Layout::ButtonHeight); m_continue_button = ButtonState( GetStateWidth() - Layout::ScreenMarginX - Layout::ButtonWidth, GetStateHeight() - Layout::ScreenMarginY/2 - Layout::ButtonHeight/2, Layout::ButtonWidth, Layout::ButtonHeight); // Determine how many track tiles we can fit // horizontally and vertically. Integer division // helps us round down here. int tiles_across = (GetStateWidth() + Layout::ScreenMarginX) / (TrackTileWidth + Layout::ScreenMarginX); tiles_across = max(tiles_across, 1); int tiles_down = (GetStateHeight() - Layout::ScreenMarginX - Layout::ScreenMarginY * 2) / (TrackTileHeight + Layout::ScreenMarginX); tiles_down = max(tiles_down, 1); // Calculate how many pages of tracks there will be m_tiles_per_page = tiles_across * tiles_down; m_page_count = track_count / m_tiles_per_page; const int remainder = track_count % m_tiles_per_page; if (remainder > 0) m_page_count++; // If we have fewer than one row of tracks, just // center the tracks we do have if (track_count < tiles_across) tiles_across = track_count; // Determine how wide that many track tiles will // actually be, so we can center the list int all_tile_widths = tiles_across * TrackTileWidth + (tiles_across-1) * Layout::ScreenMarginX; int global_x_offset = (GetStateWidth() - all_tile_widths) / 2; const static int starting_y = 100; int tiles_on_this_line = 0; int tiles_on_this_page = 0; int current_y = starting_y; for (size_t i = 0; i < m.Tracks().size(); ++i) { const MidiTrack &t = m.Tracks()[i]; if (t.Notes().size() == 0) continue; int x = global_x_offset + (TrackTileWidth + Layout::ScreenMarginX)*tiles_on_this_line; int y = current_y; Track::Mode mode = Track::ModePlayedAutomatically; if (t.IsPercussion()) mode = Track::ModePlayedButHidden; Track::TrackColor color = static_cast((m_track_tiles.size()) % Track::UserSelectableColorCount); // If we came back here from StatePlaying, reload all our preferences if (m_state.track_properties.size() > i) { color = m_state.track_properties[i].color; mode = m_state.track_properties[i].mode; } TrackTile tile(x, y, i, color, mode); m_track_tiles.push_back(tile); tiles_on_this_line++; tiles_on_this_line %= tiles_across; if (!tiles_on_this_line) current_y += TrackTileHeight + Layout::ScreenMarginX; tiles_on_this_page++; tiles_on_this_page %= m_tiles_per_page; if (!tiles_on_this_page) { current_y = starting_y; tiles_on_this_line = 0; } } } vector TrackSelectionState::BuildTrackProperties() const { vector props; for (size_t i = 0; i < m_state.midi->Tracks().size(); ++i) { props.push_back(Track::Properties()); } // Populate it with the tracks that have notes for (vector::const_iterator i = m_track_tiles.begin(); i != m_track_tiles.end(); ++i) { props[i->GetTrackId()].color = i->GetColor(); props[i->GetTrackId()].mode = i->GetMode(); } return props; } void TrackSelectionState::Update() { m_continue_button.Update(MouseInfo(Mouse())); m_back_button.Update(MouseInfo(Mouse())); if (IsKeyPressed(KeyEscape) || m_back_button.hit) { if (m_state.midi_out) m_state.midi_out->Reset(); m_state.track_properties = BuildTrackProperties(); ChangeState(new TitleState(m_state)); return; } if (IsKeyPressed(KeyEnter) || m_continue_button.hit) { if (m_state.midi_out) m_state.midi_out->Reset(); m_state.track_properties = BuildTrackProperties(); ChangeState(new PlayingState(m_state)); return; } if (IsKeyPressed(KeyDown) || IsKeyPressed(KeyRight)) { m_current_page++; if (m_current_page == m_page_count) m_current_page = 0; } if (IsKeyPressed(KeyUp) || IsKeyPressed(KeyLeft)) { m_current_page--; if (m_current_page < 0) m_current_page += m_page_count; } m_tooltip = ""; if (m_back_button.hovering) m_tooltip = "Click to return to the title screen."; if (m_continue_button.hovering) m_tooltip = "Click to begin playing with these settings."; // Our delta milliseconds on the first frame after we seek down to the // first note is extra long because the seek takes a while. By skipping // the "Play" that update, we don't have an artificially fast-forwarded // start. if (!m_first_update_after_seek) PlayTrackPreview(static_cast(GetDeltaMilliseconds()) * 1000); m_first_update_after_seek = false; // Do hit testing on each tile button on this page size_t start = m_current_page * m_tiles_per_page; size_t end = min( static_cast((m_current_page+1) * m_tiles_per_page), m_track_tiles.size() ); for (size_t i = start; i < end; ++i) { TrackTile &t = m_track_tiles[i]; MouseInfo mouse = MouseInfo(Mouse()); mouse.x -= t.GetX(); mouse.y -= t.GetY(); t.Update(mouse); if (t.ButtonLeft().hovering || t.ButtonRight().hovering) { switch (t.GetMode()) { case Track::ModeNotPlayed: m_tooltip = "Track won't be played or shown during the game."; break; case Track::ModePlayedAutomatically: m_tooltip = "Track will be played automatically by the game."; break; case Track::ModePlayedButHidden: m_tooltip = "Track will be played automatically by the game, but also hidden from view."; break; case Track::ModeYouPlay: m_tooltip = "'You Play' means you want to play this track yourself."; break; case Track::ModeCount: break; } } if (t.ButtonPreview().hovering) { if (t.IsPreviewOn()) m_tooltip = "Turn track preview off."; else m_tooltip = "Preview how this track sounds."; } if (t.ButtonColor().hovering) m_tooltip = "Pick a color for this track's notes."; if (t.HitPreviewButton()) { if (m_state.midi_out) m_state.midi_out->Reset(); if (t.IsPreviewOn()) { // Turn off any other preview modes for (size_t j = 0; j < m_track_tiles.size(); ++j) { if (i == j) continue; m_track_tiles[j].TurnOffPreview(); } const microseconds_t PreviewLeadIn = 25000; const microseconds_t PreviewLeadOut = 25000; m_preview_on = true; m_preview_track_id = t.GetTrackId(); m_state.midi->Reset(PreviewLeadIn, PreviewLeadOut); PlayTrackPreview(0); // Find the first note in this track so we can skip right to the good part. microseconds_t additional_time = -PreviewLeadIn; const MidiTrack &track = m_state.midi->Tracks()[m_preview_track_id]; for (size_t i = 0; i < track.Events().size(); ++i) { const MidiEvent &ev = track.Events()[i]; if (ev.Type() == MidiEventType_NoteOn && ev.NoteVelocity() > 0) { additional_time += track.EventUsecs()[i] - m_state.midi->GetDeadAirStartOffsetMicroseconds() - 1; break; } } PlayTrackPreview(additional_time); m_first_update_after_seek = true; } else m_preview_on = false; } } } void TrackSelectionState::PlayTrackPreview(microseconds_t delta_microseconds) { if (!m_preview_on) return; MidiEventListWithTrackId evs = m_state.midi->Update(delta_microseconds); for (MidiEventListWithTrackId::const_iterator i = evs.begin(); i != evs.end(); ++i) { const MidiEvent &ev = i->second; if (i->first != m_preview_track_id) continue; if (m_state.midi_out) m_state.midi_out->Write(ev); } } void TrackSelectionState::Draw(Renderer &renderer) const { Layout::DrawTitle(renderer, "Choose Tracks To Play"); Layout::DrawHorizontalRule(renderer, GetStateWidth(), Layout::ScreenMarginY); Layout::DrawHorizontalRule(renderer, GetStateWidth(), GetStateHeight() - Layout::ScreenMarginY); Layout::DrawButton(renderer, m_continue_button, GetTexture(ButtonPlaySong)); Layout::DrawButton(renderer, m_back_button, GetTexture(ButtonBackToTitle)); // Write our page count on the screen TextWriter pagination(GetStateWidth()/2, GetStateHeight() - Layout::SmallFontSize - 30, renderer, true, Layout::ButtonFontSize); pagination << Text(STRING("Page " << (m_current_page+1) << " of " << m_page_count << " (arrow keys change page)"), Gray); TextWriter tooltip(GetStateWidth()/2, GetStateHeight() - Layout::SmallFontSize - 54, renderer, true, Layout::ButtonFontSize); tooltip << m_tooltip; Tga *buttons = GetTexture(InterfaceButtons); Tga *box = GetTexture(TrackPanel); // Draw each track tile on the current page size_t start = m_current_page * m_tiles_per_page; size_t end = min(static_cast((m_current_page+1) * m_tiles_per_page), m_track_tiles.size()); for (size_t i = start; i < end; ++i) { m_track_tiles[i].Draw(renderer, m_state.midi, buttons, box); } } linthesia-0.4.2/graphics/0000755000175000017500000000000011326126636014301 5ustar cletocletolinthesia-0.4.2/graphics/InterfaceButtons.tga0000644000175000017500000070602111314377743020267 0ustar cletocleto  pppppppppPPPPPPpppppppppjkj7pppppppppPPPPPPpppnnndedm[^]WZY\_^nnnpppijj:X\ZX\Z]`^ghhPopopppjkj6Y\ZVYXcedpppppppmmmZ][SWUacbppplml#cedpmnmppplmmcedpmnmppppppPPPPPPppphihI\_]TWVSWUacbpppX\ZЃSWUUYW_b`lll&pppooo `baSWUSWUY\[kll*pppfhgWW[YSWU_a`pppVZXSWUY\[˂pppWZY܆SWUY\[ppppppPPPPPPppppppfhgTY\Z͂SWUejhSWUWZY܄pppklk,SWUUYW[`^SWUSWU]`^kkk/pppklk+W[YہSWUuzwW[YSWUTXVefedpppooo `cbSWU\a^SWU_a`pppSWU]b`VZXVZXpppTWV[`^X\ZVZXpppooopppooopppooo nnnpppooo ghhPooopppPPPPPPPPPPPPPPPPPP PQPPPPPPP QRRPPPPPPPpppopoeffaW[Y؁SWUX\Z~SWUSWUooopppghgSSWUimkqvsSWU\^]ijj:ppphiiEUXWSWU^b`nsqSWUacbppppppjkk3Z][SWUVZXSWU_a`pppSWUeigX]ZVZXpppTWVbfd[`^W[YpppopoijiA`baW[YTXVcedopppooo\_]TWVZ]\cedtkll(pppeffaUYWSWU^a`noopppjkj7X\ZSWUbdc|pppbdcy]`^dfeipppbdcy]`^cedopppPPPPPPQRQARTSSVTSWUQSRoPPPPPPRUSSWURUTQSRtPQQ(PPPQSRaSWUSWURTSPPPPPPQRQ7TXVSWUQSR|PPPQSRyRUSQSRiPPPQSRyRUSQSRoPPPpppooo dedmVZXSWU Y^\W[YSWUlll'pppbdcwSWUv{yu{xTXVSWUZ]\hihGppp dfefSWUSWUjolSWU]_^oooppp pppcedxTXVSWUdigSWU_a`pppSWUeigX]ZVZXpppTWVbfd[`^W[Ypppmmm_baUXVSWUTXVnnnpppegf]SWUW[Ydfekooopppmmm[]\SWUVZXhiiFppppppegfTXVSWUacbppphiiFSWUkkk.ppphiiFSWUjkj6pppPPPPQQRTSSWUSWUSWUPPPPPPQSR]SWUSVTQSRhPPPPPPPQQRUTSWUSVTQRQFPPPPPPVXWTXVSWURTSPPPQRQFSWUQQQ.PPPQRQFSWUQQQ6PPPpppnonbdczUYWSWU\`^difSWUhihJppp ^a`SWUy|UYWSWUY\ZghgSppppppppp`baSWU u{xTXVSWUZ][nnnpppmnm]`^āSWU}SWU_a`pppSWUeigX]ZVZXpppTWVbfd[`^W[Yppplll$^a_SWUSWU\a^y~|afdSWUhihIppp_a`SWUz}pusV[XSWUVYWcddvooo ppp kkk/VZXSWUVZXbfdSWUSWUdfekpppmmm^b`ρSWUaecSWUacbpppghhPSWUz}sxvSWUjkj8pppghhPSWUx}{sxvSWUiji@pppPPPPQQ$RTSSWUSWU\a^y~|afdSWUQRQIPPPRTSSWUz}pusV[XSWUSVUQSRsPPP PPP QQQ/SVTSWUVZXbfdSWUSWUQSRkPPPPQQX\ZρSWUaecSWURTSPPPQRRPSWUz}sxvSWUQRQ8PPPQRRPSWUx}{sxvSWUQRQ@PPPpppooo bdc~UXWSWU_camqoSWUfgf\ppp\_^SWU~VZXSWUX[YghgQpppooo \_]SWUX\ZSWUW[Ylll%pppghhMVZXSWU[_]SWU_a`pppSWUeigX]ZVZXpppTWVbfd[`^W[Ypppklk-]`^SWUSWUmrprwuSWUdeelppp[^\SWU`dbSWUUYWacbnnnpppgihKTXVSWUdhfz}SWU`bappppppghhTW[YSWU\`^SWUacbpppghhPSWUz}SWUjkj8pppghhPSWUz}SWUiji@pppPPPQQQ-RUSSWUSWUmrprwuSWUQSRlPPPRUTSWU`dbSWUSWUQSRPPPPPPQRQKSWUSWUdhfz}SWURTSPPPPPPRSRTVZXSWU\`^SWURTSPPPQRRPSWUz}SWUQRQ8PPPQRRPSWUz}SWUQRQ@PPPppppppegf]VZXSWU bfdpusSWUefeeppp[^]SWUX\ZSWUZ]\jkk2pppnonZ][SWUUYW^caSWUUYWkkk/pppooo`baSWUnsqSWU_a`pppSWUeigX]ZVZXpppTWVbfd[`^W[Ypppjkj6\_]SWUSWUqvtSWU`bappp WZXSWUcgeSWUTXV`bamnmpppcednSWUSWUnsqSWU\_]ooo pppooo adbSWUotrSWUacbpppghhPSWUz}SWUjkj8pppghhPSWUz}SWUiji@pppPPPQQQ6RUSSWUSWUqvtSWURTSPPP SVTSWUcgeSWUSWURTSPQPPPPQSRnSWUSWUnsqSWURUSPPP PPPPPP VXWSWUotrSWURTSPPPQRRPSWUz}SWUQRQ8PPPQRRPSWUz}SWUQRQ@PPPpppijjppp`baSWUTXV]`_iji?pppiji?W[YځSWUUYWfgf[pppfhgWW[YSWU_a`pppSWUSWUVZXpppTXVSWUVZXppppppPPPPPPppplll'deel`baghhMpppoooceduacbegf]nnnpppooocedtacbmnnpppmmmZ][SWUbdc{pppfggWZ]\hiiEpppghgQZ]\hiiEppppppPPPPPPpppppppppijj>==::7733//))## w11 4488664411--**&&"" "" ~// 11--!!88TTSSPPLLHHDD??::44..))""%% &&911""LƀƁ 1199RRVVZZ<<1188QQVVZZ>>11..Í##**(($$ 11 ##,,**''## `11110011AA>>9944..''!! --1111uĈ11""P??GGFF&&811""P>>GGFF%%@11##**(($$  ##,,**''## `11AA>>9944..''!!uP??GGFF8P>>GGFF@11..Ċ$$55FFJJKKJJIIGGCC??::44--%% ƀ11 ;;BB??==::6633//**&&!! ]1111,,""??aa__\\YYUUQQMMHHBB==7711**$$&& %%?11//  ''))((%%"" 11>>\\``dd@@11<<\\``ddBB1100m ##33;;::7733--&& 1111&&885522..**%%  %%@1100;;QQNNJJEE??9922++##!!,,11&&:x| Ĉ11""PKKTTQQ&&811""PIITTQQ%%@11m ##33;;::7733--&& &&885522..**%% @;;QQNNJJEE??9922++##!!:x| PKKTTQQ8PIITTQQ@11b 33IIRRUUWWUUSSOOJJDD>>77//&&ĉ11DDKKIIFFCC??<<7733..))$$  !! ''211**"##FFllkkiiffbb^^ZZUUPPKKEE??9922++$$&& $$D11.. ::997744//**$$11CCffkknnCC11AAffjjnnFF11""Mف66HHLL JJFFAA;;33++!! 11// **CCAA==995500++%%**%11// DDaa^^ZZUUPPJJCC<<55--%%""++11 **))$$Ĉ11""PVV``[[&&811""PUU``[[%%@11Mف66HHLL JJFFAA;;33++!! **CCAA==995500++%%% DDaa^^ZZUUPPJJCC<<55--%%"" **))$$PVV``[[8PUU``[[@11--//FFVV[[__bbccddccaa^^ZZUUOOHH@@88//%%11 LLTTRROOLLHHDD@@;;6611,,&&  ##{0011--$$NNxxwwuurroollggcc^^YYSSMMGG@@9933++$$&& &&811..))**2288>>BB(( JJHHEEBB==7700(( ""11GGppuuxxGG11EEppuuxxJJ11..22LLXXZZ[[ YYUUOOHH@@66,,!! ˆ11....OOLLIIEE@@;;55//))""  w11// NNppmmjjee``[[UUNNFF??77..&&""**"11 00>>::66//((Ĉ11""Pccmmee&&811""Paammee%%@1122LLXXZZ[[ YYUUOOHH@@66,,!!ˆ..OOLLIIEE@@;;55//))""  w NNppmmjjee``[[UUNNFF??77..&&""" 00>>::66//((Pccmmee8Paammee@11##K))??TT\\bbggllooppqqppnnjjee``YYRRII@@77--"" 11!!UU]][[XXUUQQMMHHDD>>9933--''!! ##  ++11!00 %%WW||yyuuqqllggaa[[UUOOHHAA::22++##'' --11..))77BBHHNNSS00 XXWWTTOOJJCC<<44++&&11LL{{KK11JJzzNN11))(,,HH\\bbggjjkkjjhhcc]]UULLBB66** ˈ11,,44ZZWWTTPPKKEE@@9922++$$  //11XX~~||yyuuqqllee__XXPPHH@@77..%%""// 11))66??FFLL==PPLLFF??66--%%Ĉ11""Pooyypp&&811""Pllyypp%%@11(,,HH\\bbggjjkkjjhhcc]]UULLBB66**ˈ44ZZWWTTPPKKEE@@9922++$$  XX~~||yyuuqqllee__XXPPHH@@77..%%"" ))66??FFLL==PPLLFF??66--%%Pooyypp8Pllyypp@11 $$F!!11KKXX``hhnnttxx||}}||zzvvppjjccZZRRHH>>44))""11##``ggddaa^^ZZVVQQLLFFAA;;55..((!!  ##..11ĉ""MM~~zzttooiicc]]VVOOHHAA9911**""&& 0011..))CCPPWW]]bb99 ggeeaa\\VVOOGG>>44))11QQNN11NNQQ11##K!!::XXcckkrrwwzz{{zzvvqqjjaaWWLL@@33&&Ԉ11**$99ffcc__ZZVVPPJJCC<<55--%%  ,,11k]]||wwppiibbZZRRII@@77--$$##11))HHRRYY__HHbb]]WWNNEE::++Ĉ11""Pzzzz&&811""Pwwzz%%@11K!!::XXcckkrrwwzz{{zzvvqqjjaaWWLL@@33&&Ԉ$99ffcc__ZZVVPPJJCC<<55--%% k]]||wwppiibbZZRRII@@77--$$##))HHRRYY__HHbb]]WWNNEE::++Pzzzz8Pwwzz@11 ''66OOYYbbkksszz{{ttllccZZPPEE:://%%11$$jjppmmjjffbb^^YYTTNNIIBB<<66//((!! ##j110077}}wwqqkkdd]]VVOOGG??8800((""##K11..))OO__ffmmrrAA vvssooiibbZZRRHH==,,11VVRR11SSUU11..%%AA[[ffqqzz~~vvmmbbVVII;;,,܈11)),??qqnnjjee``ZZTTMMEE>>66--%% 11EE{{sskkccZZRRHH??55++!!))+11**ZZddllrrSSssmmff\\RRFF11Ĉ11""P&&811""P%%@11%%AA[[ffqqzz~~vvmmaaVVII;;,,܈,??qqnnjjee``ZZTTMMEE>>66--%% EE{{sskkccZZRRHH??55++!!+**ZZddllrrSSssmmff\\RRFF11P8P@11 --MMccmmvv}}uukkaaWWKK@@44((11$$qqyyvvssookkffaa\\VVPPJJCC<<66..''  &&""L1100 ))yyrrkkdd]]UUNNFF>>55--%%$$&&711..))ZZmmuu||II ||vvnnee[[QQFF//11[[UU11WWYY11 11 33aatt wwkk^^QQBB33و11)))AA}}yyuuppjjdd]]VVNNFF>>55,,## $$ {11 //}}uullccYYPPFF<<22((""++11**kkvv__}}ttii]]PP77Ĉ11""P&&811""P%%@11 33aatt wwkk^^QQBB33و)AA}}yyuuppjjdd]]VVNNFF>>55,,## $$ { //}}uullccYYPPFF<<22((""**kkvv__}}ttii]]PP77P8P@11// Ł''IIuu}}rrhh\\QQEE99**11""uu||xxssnniicc]]WWQQJJCC<<55--&& ""11!''522zzrrkkcc[[TTKKCC;;22**!!$$ Ņ11..))ff{{QQ xxnnddXXMM1111``YY11\\]]11// ..gg ttffWWHH77 Έ11++@@{{uunngg__WWOOFF==44++!!""j11**%>>~~ttkkaaWWMMCC88--&&h11**||jjuuhhYY;;Ĉ11""P&&811""P%%@11 ..gg ttffWWHH77Έ@@{{uunngg__WWOOFF==44++!!""j%>>~~ttkkaaWWMMCC88--&&h**||jjuuhhYY;;P8P@11 //Î66nnyymmbbVVII==,,11 yy||wwqqkkee^^XXQQJJBB;;33++$$%% W11f99yyqqiiaaYYQQII@@77..(("" 1111..))qqYY wwkk__SS3311dd\\11````1111}HH{{ll\\MM:: È11--==wwpphh__WWNNEE;;11(($$%%A11""O??||rrhh^^TTII==--11++vvpp``>>Ĉ11""P&&811""P%%@11}HH{{ll\\MM::È==wwpphh__WWNNEE;;11(($$AO??||rrhh^^TTII==--++vvpp``>>P8P@11$$B !!II~~rrffYYMM@@--ņ11||yyrrllee^^WWPPHH@@9911))&& ,,1188wwoogg^^VVMMEE;;,,!!..11..)){{aa ~~rreeXX5511ii__11eecc11##J܁ ggpp``PP<<110088yyppgg^^UUKK==++++ 11d>>yyooddYYNN220011 !!vveeAAĈ11""P&&811""P%%@11J܁ ggpp``PP<<88yyppgg^^UUKK==++ d>>yyooddYYNN22 !!vveeAAP8P@11// ć''hhvvii\\OOBB--{11 }}yysslldd]]VVNNFF::,,  Z1177}}ttllccZZRRGG//  --11..""$$%%%%&& vvii[[6611nnaa11iiff1100v ,,ssccRR<<1122xxooeeWW88##H11\ ==ttii\\660011 ))zzhhBBĈ11""P&&811""P%%@11v ,,ssccRR<<22xxooeeWW88H\ ==ttii\\66 ))zzhhBBP8P@11++!22yykk^^QQCC--p11 ~~yyrrjjcc[[OO66$$}// 11ć55yypphh__SS11 ..11// eezzkk]]7711sscc11nnhh11--==ttccSS;;11,,ooHH## n0011!!T 55yyhh661111##K‘ž ȁ qq{{iiBBĈ11""P&&811""P%%@11==ttccSS;;,,ooHH## nT 55yyhh66Kȁ qq{{iiBBP8P@11%%= ́FFzzmm__RRDD,, d11 ~~xxppeeFF)),,11ƀ44}}ttkk\\22 // 11k77{{ll]]7711wwee11rrjj11((1 88~~ttccRR9911 %%RR$$ --11""L++pp22Í11 11u>>yyggAAĈ11""P&&811""P%%@111 88~~ttccRR99 %%RR$$ L++pp22 u>>yyggAAP8P@1111a JJzzmm__QQDD,, Y11}}xxPP-- ''511x,,xxbb// // 11((-vvzzkk]]6611||ff11vvll11!!Uہ 11ffqq``OO44Ë11 [[## ))+11%%?##rr++ q11 ((0bbbb>>Ĉ11""P&&811""P%%@11Uہ 11ffqq``OO44 [[## +?##rr++ q 0bbbb>>P8P@11// Ņ BByyll^^PPBB++ ""M11{{YY,, W11o ''}}cc,,0011// GGxxiiZZ5511ff11{{ll1100 Zԁ ,,LLSSLL.. s11 cc"" ''411 **'aadd%%""N11//  <<;;Ĉ11""P&&811""P%%@11Zԁ ,,LLSSLL.. scc"" 4 'aadd%%N  <<;;P8P@11++ ::kkwwii\\NN@@))$$B11 kk``,,r//11!!S$$ee^^((1111 ""M%%eeeeVV4411ff11kk1111!!R ́++))""M11>>// )),11 -- 66??((111!!TĈ11""P&&811""P%%@11Ŕ++))M>>// , 66??1TP8P@11++ 44UUccXXKK;;))))(11 xUUgg,,m//11&&8!!OOTT&& i11,, āEEQQ2211dd11jj11##I ł**&11v **&11//  ,,11,, ρĈ11""Pmmll]]&&811""Pkkll]]%%@11Ił&v & ρPmmll]]8Pkkll]]@11,,Î ++;;@@44$$0011 !!U 66WW''g0011 **"11yy88""##H11 11x**..11cc11hh11%%A Њ11**&Ċ++11cÌ// 1111ȄĈ11""P&&811""P%%@11AЊ&c P8P@11--Ĉ%%))11((1(()) a0011.. &&(()),11''311``11||ee1100%%?Í)))11!!Tu**'11,,''211&&7r11.. ʄ //11.. ʄ // 11?)Tu'27rʄʄ 11..Ƃ 11//  [001100,,11// 11&&((&&11&&((&&1111// ""O// 11 O 11// _ Ã%%>11Î%%?11%%?ځ [11 W1111111111**'l""M11//uŅ]..11//tń--11++ {11 W $$E11!!Q $$E1111111100%%dyNs{PuvJo:j:aj9am?etHmP{Ou{PuwJo6j:ah8^rDjp{Ou{PuyMrkewKp/{PuwKq+i:`ہf5\m>dqCjf6]f5\f6]sFkd{PuzOt oAhf5\lerEki{PuqCjym>eqDjo{Puf5\f5\f6[Ae4\f5\e5\f5\of5\f5\f5\f5[f5\f5\tf5\(f5\f5\af4\f5\g5]f5\f5\g5\7g6]f5\f5\|f5\f5\yf5]f5\if5\f5\yf5]f5\of5\{PuzOt rDjmh8_f5\ j:aZwlZ{Pu}Rxh8_f5\xLq'{PurDiwf5\~OyuVzbs}Oyg6]f5\kdzOt{Pu {PurCixf5\f5\rAjfpaf5\nAf{Puf5\qBjpdhkxi9ah8_{Puf7\o@hqdhjxl;ch8`{PuyMrn@gf6]f5\g6\yNt{PusFl]f5\i9`rDkkzOt{PuxMrldāf5\T~b{Pumaf5\nAf{Puf5\qBjtknr{i9ah8_{Puf7\o@htknr{l;ch8`{PuxLq$n?ff5\f5\ldf5\`qcb`^\Z}^ovUi8_f5\i9atHmQ{PuzOt m=df5\~Twspnkhea^Z}VzvJpg6]f5\i:`xLq%{PuuHnMh8_f5\k:bdY{Pumaf5\nAf{Puf5\qBjwruy}i9ah8_{Puf7\o@hwruy}l;ch8`{PuwKp-m?ef4\f5\wIqluhu{Luf5\rDjl{Pulgf5\g6^pChyNs{PuuHnKg6]f5\pAisoexS|f5\oAh{Ou{PuuGnTi8`f5\k;ci\f5\oBh{PutHmPf5\ZbfmS|f5\vKo8{PutHmPf5\WcfmS|f5\vIo@{Puf5\f5\-e6\f4\f5\wIqluhu{Luf5\f5\lf5\f5\f5\donxan>gf5\f5]f5\f5\f5\f5\Kf5\f5\pAisoexS|f5\f5]f5\f5\g5]Th7_f5\k;ci\f5\e5\f5\f5\Pf5\ZbfmS|f5\f5\8f5\f5\Pf5\WcfmS|f5\g5\@f5\{Pu{PusFl]h8_f5\ p@hczpec`]Y|~Tx{PupyKtf5\sEke{Puk>cf5\bsjigec`^[~]mwXj9`f5\kczOt {PuzOt pBif5\yJsbd\f5\oBh{PutHmPf5\ZkotS|f5\vKo8{PutHmPf5\WlntS|f5\vIo@{Puf5\f5\6f5\f5\f5\zLtnjU{{PugUf5\f6\f5\ f5\f5\md]Z}ardp@if5\f5\f6\f5\f5\ f5\nf4\f5\xIryld`^t]f5\e6[f5\ f5\f5\ i8`f5\yJsbd\f5\e5\f5\f5\Pf5\ZkotS|f5\f5\8f5\f5\Pf5\WlntS|f5\g5\@f5\{PuvJocf5\|Nwop]Wz}Rw{Pu^[f5\n@f{Pu g6^f5\redb`]aqgrCkf5\g6]pChzOt {Pu{Ouo@ff5\ S||tolhc_pfh6^f5\k:byNs{Pu wKp0kdf5\h8_Z{{zywusplhc]X{|Rvm~Pyf5\qCiw{Puk;af5\gzvutromjgd`]Z}Y~mt|Mwf5\g6]pCh~zOt {PuyNrj:`f5\kcxLq%{Pu{Ot m=bf5\h6^i}ytnicgsm=ef5\i9_xLr{Pug7_f5\ cplhe`Z}g\f5\oBh{PutHmPf5\ZS|f5\vKo8{PutHmPf5\WS|f5\vIo@{Puf5\f5\Me5\فf5\qBjj |xsmf_]cf5\f4\f5\f5\ f5\z}|ywtpmie`[~^r^j9af5\e6[f5\%f5\f5\ g5[f5\h6^i}ytnicgsm=ef5\f5[f5\f5\f5]f5\ cplhe`Z}g\f5\e5\f5\f5\Pf5\ZS|f5\f5\8f5\f5\Pf5\WS|f5\g5\@f5\{PuyNsl=df5\o?gg{vpibmXf5\oAg{Puh8`f5\o|xurnjfb]Y|~Tx|QvcxZi8_f5\f6\qCh{{Pu{PuyNsi9_f5\rEi{wsmhc^X|}Swlgf5\h8^yLq"{Puf5\WVW Wf5]f5\szwupkel\f5\oBh{PutHmPf5\ZS|f5\vKo8{PutHmPf5\WS|f5\vIo@{Puf5\f5\f5\f5\lgf5\f5[f5\"f5\f5\WVW Wf5]f5\szwupkel\f5\e5\f5\f5\Pf5\ZS|f5\f5\8f5\f5\Pf5\WS|f5\g5\@f5\{Pu uHnKg6]f5\g6][|{ungoZf5\n@f{Puh7^f5\r{wsokgb^Y|~Tx{Pu~SxjwzLuf5\k;ayMr{Pu{Puld{Puf5\f5\w}yupkgb\X{}Sw{Pu}Rxuvi9`f5\rEjj{Pu{Ouf5\ǴȶȶǵƴŲ¯{vpke_Z}~TxwLqf6\f5\uHnK{PuyNtf5\i9atf5\xIryzaf5\nAf{Puf5\qBjŲǴȶi9ah8_{Puf7\o@hŲǴȶl;ch8`{PuyNsf6\f5\rAjx®¯xnmf5\i9_܈{PuxKq,f5\k:bzunic]Vy{Pu|Pvnlg6]f5\k>c{Puh7^f5\[ȶɷȶǵƳð{tmf_imf5\wKq+{Puf5\g7]f5\z\f5\oBh{PutHmPf5\Zƴ­S|f5\vKo8{PutHmPf5\Wƴ­S|f5\vIo@{Puf5\f5\e5[f5\rAjx®¯xnmf5\f5\܈f5\f5\,f5\k:bzunic]Vy{Pu|Pvnlg6]f5\e6\f5\f4\f5\[ȶɷȶǵƳð{tmf_imf5\f5]+f5\f5\g7]f5\z\f5\e5\f5\f5\Pf5\Zƴ­S|f5\f5\8f5\f5\Pf5\Wƴ­S|f5\g5\@f5\{Pu n?ff5\i9`iðƴȶɷȶƳð{ss_f5\m>d{Puf6]f5\v~yupkf`\~Vz|Qv{Pud}Xf5\tHmL{Pu{Puh8_f5\^}ʺͽ̼˻ʹȶŲ¯ztnic]WztGlf5\f5\vJp7{PuyNtf5\i9azf5\yJr|af5\nAf{Puf5\qBjʹ̻ͽi9ah8_{Puf7\o@hʹ̻ͽl;ch8`{Pu {Pukdf5\R|~ðɷͽ ͽɸðwif5\j:aΈ{PuyMrf5\g6]ysmf_isqBjf5\e4\rEjj{PuxLq%g7]f5\Q{Ͽ̻ȶŲ}vnuif5\sEkh{Puf5\Ƴɸg7]f5\ȶð\f5\oBh{PutHmPf5\Zν̺S|f5\vKo8{PutHmPf5\W̺̺S|f5\vIo@{Puf5\f5\ f5\f5\R|~ðɷͽ ͽɸðwif5\f5\Έf5\f5\f5\g6]ysmf_isqBjf5\e4\f5\jf5\f5\%f5\f5\Q{Ͽ̻ȶŲ}vnuif5\f5\hf5\f5\Ƴɸg7]f5\ȶð\f5\e5\f5\f5\Pf5\Zν̺S|f5\f5\8f5\f5\Pf5\W̺̺S|f5\g5\@f5\{Pu zOtoAgf5\f5\n>fgȶ̼ͽɸıywXf5\oAg{Puh8_f5\pð®}xsnidnzZh7^f5\g7^tGlW{PusEkff5\ο˻ȶŲ{upj[}i9`f5\ld{Ou{Puf5\^bbc f6]f5\ȶ\f5\oBh{PutHmPf5\ZS|f5\vKo8{PutHmPf5\WS|f5\vIo@{Puf5\f5\Jf5[܁f5\sCln̼Ų{cf5\f5\f5\f5\f5\ͽ˺ȶŲ||`k:bf5\f5\f5] f5\f5\de5[f5\}Oxξɷð~df5]f5\f5\f5\f5\f5\^bbc f6]f5\ȶ\f5\e5\f5\f5\Pf5\ZS|f5\f5\8f5\f5\Pf5\WS|f5\g5\@f5\{PuzOt pBhg6]f5\R|y˺Ų}zR|f5\qCi{{Puj:af5\jëͼ˺ɷƴð|}ouFnf5\h8`tGlZ{PuoAhf5\̻ȶð{gi8_f5\j:ayMs{PuyNtf5\h8^ehjkkV~f5\yJs̻Ƴaf5\nAf{Puf5\qBji9ah8_{Puf7\o@hl;ch8`{Pu{OuqDjvg6]f5\{Mvz̶ǵ}_f5\m>d{Puf4\f5\ͽʹƴjp@if5\i9`uHnH{PutFl\f4\f5\{Mvͽǵ®af5\n?d{Pu{Puf6\f5\ m˻¯\f5\oBh{PutHmPf5\ZS|f5\vKo8{PutHmPf5\WS|f5\vIo@{Puf5\f5\f5\vf5\f5\{Mvz̶ǵ}_f5\f5\f5\f4\f5\ͽʹƴjp@if5\f5\f5\Hf5\f5\\f4\f5\{Mvͽǵ®af5\f6[f5\f5\e5[f5\ m˻¯\f5\e5\f5\f5\Pf5\ZS|f5\f5\8f5\f5\Pf5\WS|f5\g5\@f5\{PuxMr!m>df5\i9`]ͷͽǴ}{}Oxf5\rDjp{Puj;bf5\gĭͽʹȶűw~Pzf5\g6]qCi}{Ot {PupBhf5\Ͽ˺Ǵ®lh8_f5\j;bzOs{PuzNs f5\ qBjϿȶaf5\nAf{Puf5\qBjéi9ah8_{Puf7\o@hl;ch8`{PuyNrn?fe5[f5\g7]Vмȶ}\f5\m>e{Puf6]f5\yοʹƴsxIrf5\g6^rDkn{Pt{PutGlTf5\f5\yKtʹŲ]f5\nAf{Pu{PuuHnKpAgrCjn>eȁf5\ U~ͽð\f5\oBh{PutHmPf5\ZS|f5\vKo8{PutHmPf5\WS|f5\vIo@{Puf5\f5\e4\e5[f5\g7]Vмȶ}\f5\e4\f5\e5\f5\yοʹƴsxIrf5\f4\f5\nf5\f5\f5\Tf5\f5\yKtʹŲ]f5\f6\f5\f5\f5\Kg5\j9`i8_ȁf5\ U~ͽð\f5\e5\f5\f5\Pf5\ZS|f5\f5\8f5\f5\Pf5\WS|f5\g5\@f5\{PuvJo=j:áf5\o?ghϿȶ~{zLuf5\sEkd{PukexMr{PupChf5\ͽɸŲqh7^f5\ken@gn@gg7^f5\q@h}пɸaf5\nAf{Puf5\qBjŬi9ah8_{Puf7\o@hél;ch8`{PuwKq1kff5\j;bvJp5{PuqCixf5\˻Ǵ®og7]f5\lgsǰοɷ~yJsf5\e5[rDjq{Pu wKp0kgsǰοɷ~yJsf5\e5[f5\qf5\ f5\0i9`f5\h6^b\f5\e5\f5\f5\Pf5\ZS|f5\f5\8f5\f5\Pf5\WS|f5\g5\@f5\{PuzOt pBhg6]f5\wHplůξȶ}|uFnf5\uHmM{Pun?ef5\]ƮϿ˺Űan>ff5\i9_tGlW{PuqDjof5\f5\jͽȶðff5\m=d{Ou{PuzOtpAgf5\ xIraf5\nAf{Puf5\qBjʲi9ah8_{Puf6\o@hȯl;ch8`{Pu{PutGlZj:_ԁf5\ i8_V|}|Mwf5\rDis{PukexKq,{Pu yNsk;bf5\g7]^ildāf5\U~af5\nAf{Puf5\qBjηi9ah8_{Puf6\o@h˳l;ch8`{PuuHnIk;błf5\k:b}Oyh6^f5\xLr&{PuqDjvf5\qBjwIqg6^f5\e5\n?fxLr&{PuzOtm>ef5\tDm{Mvf5\j:ayNs{PuxMrm?fρf5\o?hf5\oBh{PutHmPf5\Z§S|f5\vKo8{PutHmPf5\WS|f5\vIo@{Puf5\f5\If5\łf5\k:b}Oyh6^f5\f5\&f5\f5\vf5\qBjwIqg6^f5\e5\f5\f5\&f5\f5\f5]f5\tDm{Mvf5\f5\f5\f5\f5\i:aρf5\o?hf5\e5\f5\f5\Pf5\Z§S|f5\f5\8f5\f5\Pf5\WS|f5\g5\@f5\{PuyMsoAgg6]f5\ rCkgywf5\e5[zOt{Pu tGmUf5\vFo|\k;cf5\i8^sEkgzOt{Pu yLq"i9af5\k=b˺sFjf5\f6]uHnH{Pu {PurCixf5\f5\rAjs}af5\nAf{Puf5\qBjͶi9ah8_{Puf6\o@hʳl;ch8`{PuvJnAn?ef6^f5\j:aЊ{PuxLr&f5\f5\i9`pBgxLr{PusFlcg7]f5\f4\oAhzOt {Pu{OurElf5]f5\oBh{PutHmPf5\i9an>fh8`f5\vKo8{PutHmPf5\i8`n>fh8`f5\vIo@{Puf5\f6[Ag5\e4\f5\f5\Њf5\f5\&f5\f5\f5\f6\f5\f5\f5\cf5\f5\f4\f5]f5\ f5\f5\h8`f5]f5\e5\f5\f5\Pf5\i9an>fh8`f5\f5\8f5\f5\Pf5\i8`n>fh8`f5\g5\@f5\{PuyNspBhg6]f5\o@h\xkf5\h8_{PuwKq1f5\m=dpS}j9af5\i:`sFka{Pt{PuzOskcqCjuxLq'{PuxMrn?em>dwJp2{PuwJp7i9`f5\rDjr{PuzNsj;bʄf7\ld{Pu{Ot g7]f5\}OxrBjf5\i9`sFl[{Pu{PuzOto@ff5\f5\pAfvKnf5\m=dyMs{PuzOt oAhf5\l{PuoBgf5\g6]n?evIo?{PuvIo?i9`ځf5\g6]sFl[{PusGlWi8_f5\nAf{Pue5\f5\h7_{Pug7]f5\h7_{Pu{Puf5\f5\{PuxLq'rEjloAguHmM{PuzOtqCjupBhsFl]yNt{PuzOtqDjtpBiyNs{PuyMrkjaQOpJ ͚8i\ZYWZhb-SΌ (nkda^Z[nFā1[OeD͘mjnqsmjnqs $͜ ,NI͙.C"v /=UkρΈP.Z[%8P+Z[%@x~$ ,NIx.C"sz x /=Ukx|ρxP.Z[%8xP+Z[%@x ~ CleXTQOk\ˬBjb`_][YZge2Q ˯8rpmjgd`][lT%M MVOeD͘pqtxupqtxv -̦Vkak$lʼHgfkEπKah`l.ΏT Q<ΈP9aej.8P5aej.@x-Vkak$lxHgfkE{xKah`l.xxT Q<xP9aej.8xP5aej.@x] Gokdb_\XSOh"eʵFligeca_\ZZeg62Itxvtpnjgc_[i_ /͙ \POeD͘sy|xsy|y 6˱#YcSOa3Ύ Wa\Z]hIΊ n kic_\k=˰  Υ!X_<ΈP9inr.8P5inr.@x6#YcSOa3x Wa\Z]hI|x n kic_\k=z xz !X_<xP9inr.8xP5inr.@x<ˁ Iqqpnljgc_[UQOg&nʾJqonkjgec`]ZXdi4̟Ww}zwtpmie`\fh4-?_SPOeD͘wzv{ #˭']i\VQOY;̝ _eca_\^hMπ ͔ .qrnkgc^hL 0?WO^<ΈP9rwy.8P5rwy.@x}#']i\VQOY;x _eca_\^hMz xx .qrnkgc^hL{x 0?WO^<xP9rwy.8xP5rwy.@x"˫:nvxy wtrokgb\WQe*wNuutrpnkifc_\XWeb%~  \{}zwrnkfb]cl9LπρZb^\YUQOeD͘z}y~ ΍,aojgd`[UOV?̦ cmkigd`]^hQ`̦>v|yvrnie`fWuVQO^<ΈP9z.8P5z.@x{,aojgd`[UOV?x cmkigd`]^hQ`xxy>v|yvrnie`fW{xxuVQO^<xP9z.8xP5z.@xΊ+gx}zwrnhc]Wd.πRz|zywtrokieb^ZVWhW] `|ytpkgc^bm? lkjhfc^ZUeD͘~} m!`uw trnic]VUC˯husqnkhea][gM@˯M|~zvqlgbc` :x|̼ 0c\XTO^<ΈP9.8P5.@xym!`uw trnic]VUCxxhusqnkhea][gM@xyM|~zvqlgbc` |x:x| 0c\XTO^<xP9.8xP5.@xb\w}ytoic\e2ΉV}zxtrnkgc_[WSYlI 2"c~zvqlgc^amD9# wvtrokgc]hD͘ MفTx {wrle^ZHʹ m}{yvsplhd_Z[g@˰% ʸQ}xsnhcbb  Jmkgd_Za<ΈP9.8P5.@xMفTx {wrle^ZHxy m}{yvsplhd_Z[g@~%xy Q}xsnhcbb }x Jmkgd_Za<xP9.8xP5.@x˲Nu{uohag6͒Z}{wtpmie`\WSO]k9{f{vrlgc]`n 8smruy|M ~|ytpjekD͘ ˲ Fw {tme_Lˆs~{wsokfa\V\f2w Uztnicbc"5 hywtojdf<ΈP9.8P5.@xz Fw {tme_Lˆx{s~{wsokfa\V\f2wxz Uztnicbc}"x5 hywtojdf<xP9.8xP5.@x K;p}{tnfh:͛^}yvrnie`\WSOQbf#ʼi{wqlgb\_o! sv|S }xrlmD͘  (8o |tkdPˈy~{vqlgb\WQ_`$̥̣X{tnhbad rtzpztnk<ΈP9.8P5.@x ~(8o |tkdPˈx|y~{vqlgb\WQ_`$yxX{tnhbadz xrtzpztnk<xP9.8xP5.@x F]vyrkj?̤c{wsnje`\WROWnGΉ`{vpkf`[amʽs}Y yrpD͘  K ]{ {riTԈ$|}xsnhb\VPRjDkT{tng``f ̢sx~wp<ΈP9.8P5.@x K ]{ {riTԈx~$|}xsnhb\VPRjD|xkT{tng``f xsx~wp<xP9.8xP5.@x ʿ ow~wokBˬf|xtoje`[VQOPkdjG{zupjd^Yg`Ks^ yrD͘  i~ wnX܈, ~ytnhb\UOfUʵ;zsle^cX+st<ΈP9.8P5.@x {i~ wnX܈x, ~ytnhb\UOfUx;zsle^cX+xst<xP9.8xP5.@x ͜Qu{rmA˩e}xtnie_ZUO]p7L$rysnhb]nH7sd tD͘  Dx |rVو)ysmg`ZSXk%vtxqjcl>sx<ΈP9.8P5.@x xDx |rVوx~)ysmg`ZSXk%vxtxqjcl>}xsx<xP9.8xP5.@x Ł-m~vo<̝`}xsnic^XVi`!5w}s)pMxf)} ·={wW yD͘ ͜5zy=̡g` nQ"wz?͘K͑ϞƁ 1<ΈP9.8P5.@x|5zy=xg` nyxQ"wz?xxKƁ 1<xP9.8xP5.@x=́O}s$dʺHo:̡π;zwT k̨ͲͳiyD͘ 1 8vx8͖ __&͔Kmv/΍ nq~<ΈP9.8P5.@x1 8vx8x __&{xKmv/x nq~<xP9.8xP5.@xaX}sY˯CtG 5x1uvJʹ -?yD͘ Uہ 6qv2΋ W^$ʶ+?aoq ,E}<ΈP9.8P5.@xUہ 6qv2x W^$+x?aoqx ,E}<xP9.8xP5.@x υV|rM̤>sDWo"nt:˯͙ |xD͘ Zԁ 4lt&sK\"˯4 'WeNϡ!u{<ΈP9 .8P5.@xxZԁ 4lt&sxK\"4x ~'WeNxy!u{<xP9 .8xP5.@x͚ S}{rB ͘8rA rSgp)Ώ M UwD͘ Ŕ1YssM̝;sN ̧, @zN 1P S<ΈP9.8P5.@xxŔ1YssMx;sN ,x {@zN 1xP S<xP9.8xP5.@x͔ Qyxs( x+p? m8 ]jiā0~vD͘ Ił )&v̞&̨$΁Έ P9.8P5.@xIł )~&xv~&xy$|x|΁x P9.8xP5.@xΎ Ns|}uf U{n< g "Px|`H xbtD͘ A̤Њ&ΊcΌ тΈP 8P @xAЊx~&}xcz xxxP 8xP @xΈ=hsT1 rs[.a+kp;,3CD͘ ?΍̣)T˰u'̠ˮ26rʴʹ xy?~)xTu~'x|2x6rxzyxzz xς˩ '[͖ ˳ Χ ͘ijihiji  O xxz Oz x _Ã>Ύ̤??ځ[W͘xx'lΐMuυ]tτ{WEQExx<xxxxyyyHHyyys7xyyHHyvlmdٷ`eۭwyr:aafܦpPyyr6b_lpyyvc\jဌyu#lpwyulpwyyHHypIdڰ\\k၅yaЃ\^hߓu&yx j\\bt*yoW_\hޘy_\b˂y`܆\byyHHyyoTb͂\ k"\`܄yt,\^*c\\gۨt/yu+`ہ\x"`\]ndyx iݧ\d\hޘy\e$__y]c$`_yxyxyx wyx pPxyHHHHHI JHI NPHHyyna`؁\_23-8\\xypS\o=*8,u\eٴr:yqE^\e,916s\jyys3c\_$$\hޘy\ k-#&6a_y] h/#&5c`yyqAiߍ`]loyyeڲ\cltt(yna^\hݚwys7`\k|ylygۨmiylygۨloyHIMASY[QoHIV²[WQtK(HPa[\UIHL7[\R|HRyVPiHRyVQoHyx lm_\ b7% y{>`\u'ykw\z1 ~.4y]\cqGy nf\\o9/  :\fܩxy ykx\\ j$,$\hޘy\ k,#(7a_y] h-#'6c`yuiߒ^\\wyo]\`mkxyvdؽ\_qFyyn]\jyqF\t.yqF\r6yHJT[\ZJHP]\YQhIHJWĽ\ZMFHHV]\SHMF\L.HMF\L6Hywkz]\c!6|y8 j\qJy hݚ\- +5}^\bpSyyyj\ y;-5&]\cvyveā\y'$\hޘy\ k1(-2;a_y] h1(-2:c`yu$gݜ\\d{* h\pIyhޙ\}$u^\_lvx y t/_\_!. h\\mkyvf\\h\jypP\}/./w\r8ypP\{/./w\r@yHK$T\\d{* h\MIHT\}$u^\ZQsI H L/Z\_!. h\\QkHJ]\\h\SHNP\}/./w\L8HNP\{/./w\M@Hyx j~^\f$7$}zy0q\n\ye۬\$-)6_\aoQyx eگ\=3,($2-a\`u%yqM_\c% y'$\hޘy\ k627<>a_y] h627<>c`yt-fܦ\\r.1 2v\mlydؼ\'*(6%g\^jvypK]\ j5*7}\iyypT`\c* \jypP\!*}\r8ypP\!*}\r@yHK-U\\r.1 2v\PlHWü\'*(6%g\\RIHNK[\ j5*7}\THHPT^\c* \SHNP\!*}\L8HNP\!*}\M@Hyyo]_\ h&9-|yy+u\meydٵ\&0&$!'7a\cs2ywc\^'=<961-(#-3f\^t/yxiޙ\s${y'$\hޘy\ k:=BFBa_y] h:=BFBc`yr6eڱ\\\u/#y \iy `\/-' i\]iߊwymn\\r7(0!\\dڰx yx jݥ\t \jypP\(.5}\r8ypP\)-5}\r@yHL6V±\\\u/#y \SH Y\/-' i\[SJHQn\\r7(0!\\U°I HI Y\t \SHNP\(.5}\L8HNP\)-5}\M@Hys<bˁ\e':50.+(# ~zy)w\mnyd׾\(6/-*($!$7^\\fܟvywc\`/AIFC?;61,& '8 l\^s4yt-b\]!|zy'$\hޘy\ k?GLPFa_y] h?GLPFc`yu#eۭ\\x1+ ~{y \hݝy ^\2 ,* l\]jx yyhߔ\ }<4.)#+)^\cvy s0c\^y \jypP\4:?}\r8ypP\5:?}\r@yHK#U\\x1+ ~{y \UH [\2 ,* l\[RI HHS\ }<4.)#+)^\YIH K0]\^y \SHNP\4:?}\L8HNP\5:?}\M@Hyu"f۫\_:=>=:73/)# z'z\kwyb\*;8641-*&" &5w\]j~x yva\b2FUSPLHD?:4.)"":o\^s9ypLjk]\ i, ~{y'$\hޘy\ kDRVZJa_y] hDQVZJc`ywiߍ]\]|34)$ }y"\fܦy ]\4,*'#++n\_n`yyxfܦ\\!@C>94.'!&/b\awyylu]\ j#|y \jypP\@GJ}\r8ypP\@GJ}\r@yHJS\\]|34)$ }y"\UH [\4,*'#++n\ZP`HHHU\\!@C>94.'!&/b\XJHHRu]\ j#|y \SHNP\@GJ}\L8HNP\@GJ}\M@Hywiߊ\\\z7AGJKJIGC?:4-% %}\jဃya\,BB?=:63/*&! -/ m\_o]yyv`\d4La_\YUQMHB=71*$!;p\]r?yx \\ k3*(%" ~'$\hޘy\ kI\`dMa_y] hH\`dOc`yxlm^\t3=<:73-& ~ $\eگyy\\7852.*% **g\ar@yxeگ\^)GQNJE?92+#!3d\avyr:kxk|gڼ\ ~%}y \jypP\MTU}\r8ypP\KTU}\r@yHHPm[\t3=<:73-& ~ $\U°HH\\7852.*% **g\WM@HHV\^)GQNJE?92+#!3d\YJHM:QxR|Zż\ ~%}y \SHNP\MTU}\L8HNP\KTU}\M@Hymb^\p1AKRUWUSOJD>7/&'\iቃy`\/IKIFC?<73.)$ |4'e\bs2yu"_\e5Rlkifb^ZUPKE?92+$:q\\rDyw\]u\r:974/*$+$\hޘy\ kNfknQa_y] hMfjnRc`yqM`ف\ k-BJL JFA;3+!&\dعyx \;CA=950+%."a\dڰu%yx cٸ\^,Pa^ZUPJC<5-% 3e\_uy_\ &.)$ \jypP\X`_}\r8ypP\W`_}\r@yHNMYف\ k-BJL JFA;3+!&\W¹HH \;CA=950+%."a\U°K%HH Vø\^,Pa^ZUPJC<5-% 3e\XJH\\ &.)$ \SHNP\X`_}\L8HNP\W`_}\M@Hyweڲ\g*@KV[_bcdca^ZUOH@8/%(\iߒy`\1QTROLHD@;61,&  |z7`\]k{yyv`\ h7Zxwurolgc^YSMG@93+$;t\\r8yw\`>.39?B+\rJHEB=70( /$\hޘy\ kRpuxTa_y] hQpuxVc`yweڲ\d&AOXZ[ YUOH@6,!)\cˆyv\?OLIE@;5/)" ~1]\\kwyx c\_-Ypmje`[UNF?7.&4g\_u"y\ ]\7>:6/(& \jypP\dmi}\r8ypP\cmi}\r@yHIV²\d&AOXZ[ YUOH@6,!)\WˆHI\?OLIE@;5/)" ~1]\\QwHI W\_-Ypmje`[UNF?7.&4g\YJ"H\ ]\7>:6/(& \SHNP\dmi}\L8HNP\cmi}\M@HypK]\^ 93-'! |y|"8v\buy!ydؼ\ h8a|yuqlga[UOHA:2+#;s\_wyw\`>:BHNS3\rXWTOJC<4+3$\hޘy\ kW{Xa_y] hUzZc`yt(`\_=N\bgjkjhc]ULB6* +\bˈyv\]EZWTPKE@92+$ {1u\gܥxyfݣ\`/a~|yuqlf_XPH@7.%4 h\`x y\=6?FL]\BPLF?6-. \jypP\pyt}\r8ypP\oyt}\r@yHK(Y\_=N\bgjkjhc]ULB6* +\XˈHJ\]EZWTPKE@92+$ {1u\VIHU\`/a~|yuqlf_XPH@7.%4 h\XI H\=6?FL]\BPLF?6-. \SHNP\pyt}\L8HNP\oyt}\M@Hy qF\\ j2@MX`hntx{}|zvpjcZRH>4),"\fۤy]\5cgda^ZVQLFA;5.(! |y6&`\awyi\`3[~ztoic]VOHA91*": h\dؽyyw\a>FPW]b;\rgea\VOG>46$\hޘy\ k\[a_y] hZ^c`ypK]\e2FXckrwz{zvqjaWL@3'-\`Ԉyu$\`Hfc_ZVPJC<5-% ~z}/$]\bvymk\]-g|wpibZRI@7-$6d\fܢy\=HRY_]\Mb]WNE:4 \jypP\{~}\r8ypP\y~}\r@yHNK[\e2FXckrwz{zvqjaWL@3'-\XԈHK$\`Hfc_ZVPJC<5-% ~z}/$]\XJHQk\]-g|wpibZRI@7-$6d\TH\=HRY_]\Mb]WNE:4 \SHNP\{~}\L8HNP\y~}\M@Hy cؿ\r<@OYbksz{tlcZPE:/.#\e۬y\\7mpmjfb^YTNIB<6/(! {y|06`\mjyy\&I}wqkd]VOG?80(*4]\pKyw\a>S_fmrC\rvsoibZRH=:$\hޘy\ ka_a_y] h_bc`yv\\ j8H[fqz~vmaVI;,/\`܈yt,\bMqnje`ZTME>6-% }yz(-]\dٵy_\ U{skcZRH?5+!"/\\u+y\>Zdlr]\Zsmf\RF: \jypP\}\r8ypP\}\r@yHIZ\ j8H[fqz~vmaVI;,/\Y܈HL,\bMqnje`ZTME>6-% }yz(-]\VµHZ\ U{skcZRH?5+!"/\\L+H\>Zdlr]\Zsmf\RF: \SHNP\}\L8HNP\}\M@Hy gݜ\`+@Rcmv}ukaWK@41#\fܩy]\7tyvsokfa\VPJC<6.'  ~zy;\pLyy_\u=yrkd]UNF>5-%6'\\s7yw\a>^mu|L\s|vne[QF<$\hޘy\ kfba_y] hcfc`y yb\]$Dct wk^QB4.\`وyt)\aP}yupjd]VNF>5,#|7v\k{yc\oB}ulcYPF<2(1!\]uy\>kv]\e}ti]P@ \jypP\}\r8ypP\}\r@yH HX\]$Dct wk^QB4.\YوHK)\aP}yupjd]VNF>5,#|7v\Q{HY\oB}ulcYPF<2(1!\\JH\>kv]\e}ti]P@ \SHNP\}\L8HNP\}\M@Hyx cŁ\|;Tu}rh\QE94 \hݝy^\4y|xsnic]WQJC<5-& -4 m\ky!s5\\ Fzrkc[TKC;2*!31^\jyw\a>j{S\sxndXM?$\hޘy\ kkfa_y] hhic`yx f۪\}Am tfWH8,\bΈyv\]P{ung_WOF=4+!#4 k\\mjyu%^\{P~tkaWMC8-2+]\nhy\?|]\puhYD \jypP\}\r8ypP\}\r@yHI U\}Am tfWH8,\XΈHK\]P{ung_WOF=4+!#4 k\\PjHK%[\{P~tkaWMC8-2+]\QhH\?|]\puhYD \SHNP\}\L8HNP\}\M@Hy xi\\e*HtymbVI=7\iߒy_\1}|wqke^XQJB;3+$(9^\^oWy nf\\%KyqiaYQI@7/54d\dعyyw\a>u\\swk_SA$\hޘy\ koia_y] hllc`yyk}\\d&V{l\M<)\cÈyw\Mwph_WNE;1/5^\]qAyqO\\{P|rh^TI=9*^\gݠy\?]\{p`G \jypP\}\r8ypP\}\r@yHHR}\\d&V{l\M<)\WÈHJ\Mwph_WNE;1/5^\ZMAHOO\\{P|rh^TI=9*^\UH\?]\{p`G \SHNP\}\L8HNP\}\M@HyrB`\p2Y~rfYM@9\iᆃy`\/yrle^WPH@910:(e\dعvyiߒ\\$Kwog^VME<:2b\avyw\a>c\s~reXB$\hޘy\ ktla_y] hppc`yqJ_܁\ m/tp`P?&\dٷyy\Iypg^UKA;$b\dٶv ynd[\yPyodYO@']\e۬yy\"()*+]\veJ \jypP\}\r8ypP\}\r@yHNJX܁\ m/tp`P?&\V÷HI\Iypg^UKA;$b\VöK HPd[\yPyodYO@']\UIH\"()*+]\veJ \SHNP\}\L8HNP\}\M@Hyx j\\\}9tvi\OB:}\k{ya\,ysld]VNF><1o\`nZyi\"I}tlcZRH>1b\awyw\^(./12\svi[C$\hޘy\ kyna_y] hurc`yylv]\v=scRA#\e۬y\\CxoeXE, i\aqHyn\\\wOti]D%\\fܢyy\\ 5zhK \jypP\}\r8ypP\}\r@yHIRv[\v=scRA#\UH\\CxoeXE, i\YNHHO\\\wOti]D%\\THHZ\ 5zhK \SHNP\}\L8HNP\}\M@Hyu!f۫\`!Fyk^QC;y\lpyc\*yrjc[QC7z\]k}x yj\!Iyph_TA/`\cwyw \ kpzk]D$\hޘy\ k~qa_y] hzuc`yvgݜ[\]NtcSA!\gܡy]\=pR4s\^mnxyoT\\tHyjF"\hޘyypKiޑkߞeȁ\ z{iK \jypP\}\r8ypP\}\r@yHJT[\]NtcSA!\UH[\=pR4s\[QnHHNT\\tHyjF"\THHNKSY[ȁ\ z{iK \SHNP\}\L8HNP\}\M@Hyr=b́\g*Xzm_RD;u\ndydٺ\'xpfP= `\\gܡvyjခ\H}tk^C-^\cx ymkgۨhܲhܳ^\ iE{l]D$\hޘy\ ksa_y] h~wc`yt1c\ aItcR?\hޖy_\5^4w\\\hߔwypL\\ m>rC~\iߍy ylu]\ jJygJ \jypP\}\r8ypP\}\r@yHL1W\ aItcR?\THZ\5^4w\\\SJHNL[\ m>rC~\SH HRu]\ jJygJ \SHNP\}\L8HNP\}\M@Hyyna_\q/[zm_QD;r\oYyeگ\$z[A&f\cs5ykx\@xeB(]\dعx yt-b\]%~zk]D$\hޘy\ ksa_y\ hxc`ypU`ہ\ _Coq`O=\iߋy `\/g3v\\dٶu+yr?^\g5w>t\[mqy s0c\^'gbG \jypP\}\r8ypP\}\r@yHOUYہ\ _Coq`O=\SH Y\/g3v\\VöL+HM?[\g5w>t\[QqH K0]\^'gbG \SHNP\}\L8HNP\}\M@Hyw j]\q.Syl^PB;o\qMyfۤ\"d@%f\`oWylo\\t;i@\eگyyxiޙ\ sSxiZB$\hޘy\ kta_y\ hxc`yynZ`ԁ\ _=VVL<x\ksyc\(o3t\\eگs4y u'`\b/mn7 j\]pNyx jݥ\tFD \jypP\}\r8ypP\}\r@yHHOZXԁ\ _=VVL<x\QsHW\(o3t\\VL4H K'Y\b/mn7 j\[NNHI Y\tFD \SHNP\}\L8HNP\}\M@Hyuhݚ]\ o-Lswi\N@< j\rBy hޘ\xlA#e\_lrxypS]\ k7rg<y\iyy qM_\c2heVA$\hޘy\ ksa_y\ hxc`yypRb́\_0>= k\qMyhݝ\ QB*s\[fۧt,y vc\]#HQ+d\_t1ypT`\c, \jypP\}\r8ypP\}\r@yHHORX́\_0>= k\NMHU\ QB*s\[UL,H IW\]#HQ+d\ZL1HPT^\c, \SHNP\}\L8HNP\}\M@Hyuhߔ]\ m+F^dXK=>_\t(y kx\{es?"d\_lmxyr8]\e2_`9p\\miyveā\MQ?$\hޘy\ kra_y\ hvc`ypIcł\bz^\u&ylv\ kr^\\gݞu&yxgۨ\ nw\avyvf\\h\jypP\zyk}\r8ypP\xyk}\r@yHMIWł\bz^\K&HRv\ kr^\\TK&HIV\ nw\XJHJ]\\h\SHNP\zyk}\L8HNP\xyk}\M@Hyvi\\ k*?GE:7\[yy pU\pJg=!c\_mgxy u"a\`+DJ4 h\^qHy ykx\\ j7=$\hޘy\ kpa_y\ htc`yqAfۤ^\aЊyu&\\`iߊuync^\\jx yyn]\jypP\af`\r8ypP\`f`\r@yHMAU[\XЊHK&\\YSJHPc[\\TI HHV]\SHNP\af`\L8HNP\`f`\M@Hywj]\ h!8>-\_yt1\d>1~a\`naxywc\z9<]\_t,ys3c\_$$\hޘy\ kma_y\ hqc`yxr?iߍfݣt)yoTdڰluu'yvgݠeۮs2ys7`\lrywcʃ]]dغxywcʃ]]c׿x yHHM?SUK)HNTU°QuK'HJUV®L2HL7[\QrHIYʃ\\WºIHIYʃ\\WÿI Hyvj]\]q l\fܩyx ^\x k\ao[yyxhޖ\\c i\eڳwyx iݧ\d\hޘy\ i9:9`_y\g9:9b`yyx qOx yHHI OOI Hyx n_cÃ\q>yi\]fۤr?yr?`ځ\]o[yoW_\hޘy\\_y]\_yyHHyu'mliސqMyxlujo]wyxltkwyvc\k{yoWcqEyoQcqEyyHHyyys<xyyHHyyyHH```r:r:```\7```r:r:`_ Xm SP T_`\:QQ TZP``\6QP Xp``^ RN W`^# Xp^`^ Xp^``r:r:`[I TNN W`QЃNO V]&`_ VNN R]*`ZWQN U`PN R˂`P܆N R``r:r:``ZT R͂N`6у2~NP܄`],NPAގ-x VNN T]/`]+QہN$o7҃ RNNYd`_ WNWN U`NX:Ն QP`N V:Ն SP`````_ _`_ ZP``r:s:r:s:r:t; u;r:t; @Ps:r:``YaQ؁N R,xMWRVNN``ZSNc]PXC kN S\:`[EONYD[USiN V``\3 SN Q9Ն:ՆN U`N_SJMPZ SP`N\TJMPY VQ``[A VQO Xo`` SN R Xt](`YaON U_`\7RN W|` Wy TYi` Wy T Xo`r:s:|?AEKMCor:s;HNICtx=(r:BaMNFt;r:{?7MND|r:CyGBir:CyGCor:`_ XmPN T2~VM=46^ RN]'` XwN%pU;:DSO%oON R[G` YfNNdWUD>I[0{N T_` ` XxON_DQ:ՆN U`N_SKOS[ SP`N\SKOS[ VQ`^ VONO_`Y]NQXk_`^ SNP[F``[ON V`[FN].`[FN\6`r:w<EMNMu;r:A]NKBhs;r:v<INL}?Fr:r: HONEr:}?FNy>.r:}?FNz>6r:`_ WzONW5тWI64Z^N[J` UN1}SCA?=AQQ(sPN RZS``` VN %oZTLIEAAX<؉ON R_`^ UāN+wD4N:ՆN U`N_WSW[^ SP`N\WSW[^ VQ`]$ UNNW(sBޏ\N[I` UN)t9Ն j QNP Xv_ ` ]/PN Q4ρG\NNXk`^ WρN[N V`ZPN)tKK"mN\8`ZPN'rKK"mN[@`r:x=$FNNW(sBޏ\N}@Ir:FN)t9Ն j QNLCst; r: y>/LN Q4ρG\NNBkr:v< PρN[NEr:@PN)tKK"mN{>8r:@PN'rKK"mN|?@r:`_ W~ONY9ՆXM>:64TgNZ\` TN8ԅSJHGDB?APS,w QNQZQ`_ TN1}]ZWSPLHDBUF SNQ]%`[M QN V@ގ<4N:ՆN U`N_Z[_c` SP`N\Z[_ca VQ`]- TNNgGUIU!lN Xl` SN=يPOW;ևZNO W_`[KON^PQIW)tN V``[T RNWC4πN V`ZPN1}INT)tN\8`ZPN/zJNS)tN[@`r:y>-GNNgGUIU!lNBlr:IN=يPOW;ևZNMDu;r:~@KMN^PQIW)tNEr:r:AT PNWC4πNEr:@PN1}INT)tN{>8r:@PN/zJNS)tN|?@r:``Y]PN \<؉ZULJGC?94Q jNYe` SN;׈WRPNKIGC@@NT/{ SN R\2`_ RNP>ڋ_ca^[WSOKGBROYNO]/`_ VNiH64N:ՆN U`N_^dhkc SP`N\^dhkd VQ`\6 TNN!kJK84I-xN V` PNHIC@DR>ڋ]NO V^` XnNNhXRKGDT5ЁN T_ `_ XNiBF4πN V`ZPN1}SX\)tN\8`ZPN/zTW\)tN[@`r:z>6HNN!kJK84I-xNEr: KNHIC@DR>ڋ]NMEv<r: CnNNhXRKGDT5ЁNHt; r:t; KNiBF4πNEr:@PN1}SX\)tN{>8r:@PN/zTW\)tN|?@r:`\< RˁNX=ڊ\\ZXVSOKGB;64P#nN Xn` SN>ی\YWUSPNKGD@?LU.zPNN U^`_ RN THblkifb^[WRMHCOUaNO\4`]- SNP6тG854N:ՆN U`N_blpsf SP`N\blpsg VQ`^# TN$oLRC<74@3N U` ONNMKIGCEQAݎ`NO W_ `` VN )t\\XTOKEQ@܍PN R_` ]0 TNQ5у>4F4πN V`ZPN1}]bd)tN\8`ZPN/z]bd)tN[@`r:w=#HN$oLRC<74@3NFr: MNNMKIGCEQAݎ`NMDt; r:r:FN )t\\XTOKEQ@܍PNJu;r: z>0 PNQ5у>4F4πNEr:@PN1}]bd)tN{>8r:@PN/z]bd)tN|?@r:`^" TN R2~Zadedb_\YTOJC=6N&qN Xw` RNBޏ``^][WUROKGC?=MQ"mNO W~_ `^QN UMgwvspmjfb]XTOJDKXdNO\9`[L W WON]JKFC?;74N:ՆN U`N_fux{i SP`N\etx{j VQ`_ VNNO'rPYSPLGB;4=6уN T` ONQWUSOLHDDQDcNPY```` TN5тahea]XSNGOH UNQ^``YuON^D74F4πN V`ZPN1}flm)tN\8`ZPN/zflm)tN[@`r:u;ENNO'rPYSPLGB;4=6уNGr: MNQWUSOLHDDQDcNLB`r:r:s:GN5тahea]XSNGOH UNJu<r:r:DuON^D74F4πNEr:@PN1}flm)tN{>8r:@PN/zflm)tN|?@r:`_ VNN'rUclnon lifb]WQKD=M)tN W`QNEehfdb^\YURNJE@<=RIaNPY]``^QNWOl}zwtqmhd_[UPKEJYeNO\?`_ ON _WUSQOKFA;N:ՆN U`N_j}l SP`N\i}n VQ`` XmONjO`bb_\WRKD<;9ՆN T``NNU`^[XUQMIDCPAݎ[NQ[@`` TNPAގhtrnjfa[VOJLOWNQ^`\: XxY| VN *vLC?:4F4πN V`ZPN1}pvu)tN\8`ZPN/zovu)tN[@`r:s:CmMNjO`bb_\WRKD<;9ՆNHr:r:NNU`^[XUQMICCPAގ[NJ|?@r:s:HNPAގhtrnjfa[VOJLOWNKv<r:{?:CxE| LN *vLC?:4F4πNEr:@PN1}pvu)tN{>8r:@PN/zovu)tN|?@r:`YbONeLcouwywvrnje_YRKCN,xN V`QNHlonkifc_\XTPKGB=8?V=ڊXN R\2`^"PNZRq~{wsojfa[VPKEJYgNO[D`_NP1}!kNhba_]YUPKDR:ՆN U`N_no SP`N\mp VQ`[MQفN_Fdmp nkgb\VNEA=يN S`_ NYigda^ZVQLGABR7҃ TN T]%`_ SNQDo~{wsnic^WQKJQYNP^`ON >يWTPLG@I4πN V`ZPN1}y~)tN\8`ZPN/zx~)tN[@`r:~@MKفN_Fdmp nkgb\VNEA=يNIr:s; NYigda^ZVQLGABR7҃ TNHx=%r:s; HNQDo~{wsnic^WQKJQYNKw<r:MN >يWTPLG@I4πNEr:@PN1}y~)tN{>8r:@PN/zx~)tN|?@r:`^ SN[Bޏanx|~{wrmf`YQIP/{N V`PNKrvurpmjfb^[WRMHC>84EV2~ RNN W{``_PN\Tw~zvqlfa\VPKDHZiNO\8`_N S^W\`ehC͇Nhnmjhd_ZSMU:ՆN U`N_rr SP`N\pt VQ`_ SNW<؉brz{| zwrmf^WNF@܍N Rˆ`_N_rpnjfb^YTOICW"mND{r:JNdazskc[SKV5ЁNNw<r:N^PN|~sc4πNEr:@PN1})tN{>8r:@PN/z)tN|?@r:`_ RŁN(sYr}tjaZ4πN U`ONO~ytnic^WRKE?8r:@PN/z)tN|?@r:` _ VNNZBޏgxnd\0|N V`PNL~ztnhb\VPJOX1}PNOZW`YfN;ևiztnf_YZPWN S``_N S^kҝNivb:ՆN U`N_ SP`N\ VQ`` W}NNW=يs}qc@ݎN RÈ`_Njyrjb[VU-yPNO[A`ZONN'rn~vnd]BޏPN U`N_PNi4πN V`ZPN1})tN\8`ZPN/z)tN[@`r:r:D}NNW=يs}qc@ݎNIÈr:u;Njyrjb[VU-yPNM|?Ar:~@ONN'rn~vnd]BޏPNGr:N_PNi4πNEr:@PN1})tN{>8r:@PN/z)tN|?@r:`[BPNfMuzqf],xN W`QNH~ysmfa[WZ>یXN S^` VN9Նi~xqjb]N VNQ_`_N S^qӡNizc:ՆN U`N_ SP`N\ VQ`[JP܁NaIsd<؉N S``Ne~wof\9Ն UN S^ `YdNN%plzqb>ڋON T``N7҃<ц=ц>ц>҇ONl4πN V`ZPN1})tN\8`ZPN/z)tN[@`r:~@JK܁NaIsd<؉NHr:s;Ne~wof\9Ն UNHw= r:BdNN%plzqb>ڋONGs:r:N7҃<ц=ц>ц>҇ONl4πNEr:@PN1})tN{>8r:@PN/z)tN|?@r:`_ VNN)tW}rh^)tN W{`QND~xrkc^KcNPZZ` VN7҃h{um`K TNQ_`_N Q?܌DڎFڏFڐGڐHې.wN i|e:ՆN U`N_ SP`N\ VQ`` XvON"mXue8ԅN T`NN^yfE]NQ[H`Z\NN"mk}e;ևN U``NN Jڒm4πN V`ZPN1})tN\8`ZPN/z)tN[@`r:s;CvMN"mXue8ԅNGr:NN^yfE]NK}@Hr:A\NN"mk}e;ևNGr:r:MN Jڒm4πNEr:@PN1})tN{>8r:@PN/z)tN|?@r:`^! TN S5тc~ti^%pN Xp` RNAݎ|sdT&qNO W}_ ` VN5ЁgvbI SN R_`_ N _~e:ՆN U`N_ SP`N\ VQ`^ UNNP.zive4ρN U`ONWqOiNO Xn``ZTNN jdf6тN U``[K VZ WȁN ,wm4πN V`ZPN1})tN\8`ZPN/z)tN[@`r:v<FNNP.zive4ρNGr:MNWqOiNMCns:r:ATNN jdf6тNFr:r:~@KE K NȁN ,wm4πNEr:@PN1})tN{>8r:@PN/z)tN|?@r:`\= ŔN[Bߐtuj^!lNYd` SN=يp[2~ RNN U^` WN3f~cF QN R_ `Xk T W WON]^~e:ՆN U`N_ SP`N\ VQ`]1 RN S1}dud1}N U` PNPzP#nNN V_`[LNNbZb*vN V` `YuON^ck4πN V`ZPN1})tN\8`ZPN/z)tN[@`r:z>1IN S1}dud1}NFr: LNPzP#nNNFu;r:~@LNNbZb*vNEr: r:DuON^ck4πNEr:@PN1})tN{>8r:@PN/z)tN|?@r:``YaPNfIvtj^gNZY` TN9Նx_<؉YN R\5` XxN+w`b>یPN S_ `]- SNP9҄~e:ՆN U`N_ SP`N\ VQ`ZUQہN R/{`ra,xN V` QNHN!lN S]+`\?ONZP\iNN Xq` ]0 TNQ<ӆi4πN V`ZPN1})tN\8`ZPN/z)tN[@`r:AUKہN R/{`ra,xNEr: KNHN!lNHy=+r:|??MNZP\iNNCqr: z>0 PNQ<ӆi4πNEr:@PN1})tN{>8r:@PN/z)tN|?@r:`_ WNNfHp~sh]dN[M` TN5т^:ևZNPZW` XoNN jZ`2~N T``_ VN in{d:ՆN U`N_ SP`O\ VQ``ZZQԁN R.yZuwp_#nN Xs` RN?܌M jNN T\4` ]'PN THT_NOZN`_ XNjdf4πN V`ZPN1})tN\8`ZPN/z)tN[@`r:r:AZKԁN R.yZuwp_#nNCsr:IN?܌M jNNHz>4r: x='KN THT_NM~@Nr:t; KNjdf4πNEr:@PN1})tN{>8r:@PN/z)tN|?@r:`^ UNN dFj}rf]_N[B` UN1}^8ӄXNP Xr_`ZSON`U[&qN V`` [M QN VJߔxc:ՆN U`N_ SP`O\ VQ``ZR ŔN Q+wJ^^`N[M` UN3m_BޏiNN T],` _ RNP7ӄgnCWNP]1`[T RNWE4πN V`ZPN1})tN\8`ZPN/z)tN[@`r:r:@RJ́N Q+wJ^^`N~@Mr:FN3m_BޏiNNGy=,r: u<INP7ӄgnCWNLz>1r:AT PNWE4πNEr:@PN1})tN{>8r:@PN/z)tN|?@r:`^ VON bDe{zoc^ RN](` XxN'r~]6уWNP Xm_`\8ONXMz|WeNNYi`^ UāN,wntb:ՆN U`N_ SP`O\ VQ`[I RłN U%pPN]&` XvN_gPNN U]&`_ TNc"mNQ^`^ WρN[N V`ZPN1})tN\8`ZPN/z)tN[@`r:}@IIłN U%pPNx=&r:CvN_gPNNFx=&r:s;GNc"mNJv<r:v< PρN[NEr:@PN1})tN{>8r:@PN/z)tN|?@r:`^ VON `Bޏ_hi`TNN`` ZUNdhZ4π UNPYg`` ^"QN RCdhO[NO[H` ` XxON_S_:ՆN U`N_ SP`O\ VQ`[A TONQЊ`]&NNQ V^`YcONN V_ ``[ON V`ZPN SY RN\8`ZPN SY RN[@`r:|?AGMNJЊr:x=&NNKEw<r:BcMNNEt; r:r: HONEr:@PN SY RN{>8r:@PN SY RN|?@r:`_ VON\4ρU^FNP`]1NW]^L)t SNQYa``_ RN'rX\3PNP],`\3 SN Q9Ն:ՆN U`N_ SP`O\ VQ``\? V T])`ZT T Xu]'`^ U T\2`\7 RN Xr`_ RʄN S_`_ RʄN S_ `r:s:|??EGx=)r:ATHCux='r:v<GHz>2r:{?7MNCrr:t;JʄNIs;r:t;JʄNIt; r:`_ WONOfaN T`_ ON%n^NQZ[``` UNNV]N S^`_ WNWN U`N^VXU SP`O[VXV UQ``_ ZO_ `r:r:t; ~@Ot; r:`_ Y_ RÃN\>` VNO T\?`\?QځNOZ[`ZWQN U`NNP`ONP``r:r:`]' Xl V[M`_ Xu WY]_`_ Xt W^`^ RN W{`ZW R[E`ZQ R[E``r:r:```\<_``r:r:```r:r:e4e4e4s@ s@ e4e4e3_07d4e4ݤe4s@ s@ e4c3Z,mR&N#ܑS&d2e4_/:O$ЌO$ёS'\.Pd4e4`06O$ΊM"Z+pe4e4b2Q$ÇJ W*e4a1#Z+pb2e4b2Z+pb2e4e4s@ s@ e4].IR&K J W*e4O$ЃJ L!V(a1&e4d3 W*I J P$ǟ`0*e4\.WM#J U(e4M!䆇J P#˂e4N"܆J P#e4e4s@ s@ e4e4\.TN$͂J Z/yMuIJ N#܄e4a1,J L"WpER'J K S'`0/e4`0+O"ہJ ftE_œgk@L"J N$͛\-Se4e4e4W*J h=̚m[wLuIrEoAsDɗj}RK J P%Ţc3e4b2S'āJ nB|Me4[|PJ U(e4J Y/a}SW[ƕkO$M"삤e4K W,b}SW[ĔiQ'M"훤e4a2$T(JJ R(j@WW,J ].Ie4T(J k@{Pc7M#J L"X+vd3 e4 `0/M!J L"wK\W,J J Z+ke4b2T)χJ J V+J V)e4 \.PJ lA^__f:J _08e4\.PJ j?__f:J _/@e4s@ vA $F!JJ R(j@WW,J yC Is@ E J k@{Pc7M#J I |D st@! s@ wB /IJ L"wK\W,J J |D ks@ uA M%χJ J V+J ~E s@ yC PJ lA^__f:J xB 8s@ yC PJ j?__f:J xC @s@ e4d3 X*~L!J T*|PʘlWn@j:g6e4ƒe`6J \-\e4S'J {O^vJuIsGrEpBn@tE]ƕhoDM#J N#כ]-Qe4d3 R&J sH͜p_W}SzPwLtHqDqCŒe\O$J O"۠a1%e4].MM"J Q&Sp@e4[|PJ U(e4J Y/e[_cǗnO$M"삤e4K W,Ñe[_cƗmQ'M"홤e4`1-S'J J a5]ƓeSƓfd:J Y,le4R&J S]\ǖh}QU+J L!W*c2e4].KK J X-Ñf]}PɗjlAJ U)e4e4]-TN$J Q'XwKJ V)e4\.PJ tHvJxNWlAJ _08e4\.PJ qFxLxNWlAJ _/@e4s@ wB -G J J a5]ƓeSƓfd:J {D ls@ H!J S]\ǖh}QU+J I }E tA s@ yC KJJ X-Ñf]}PɗjlAJ E sA s@ yD TM#J Q'XwKJ ~E s@ yC PJ tHvJxNWlAJ xB 8s@ yC PJ qFxLxNWlAJ xC @s@ e4e4[-]M!ぇJ W-Sʙm]yNvJsGpCm?i:f5e4Ž`c8J Z,ee4S&J ~R_|R{QyNwLuIsGqDoArDZȖirGO%J Q%`02e4c3P%ŇJ K!T˛pea^[W}SzOwKsGoC_ÐcT)J K!`0/e4d3U)J a7Vg7e4[|PJ U(e4J Y/ÓidhkȚpO$M"삤e4K W,ĔidhkǙpQ'M"헤e4`06R&J J J d9_Vl:e4TpDJ V)e4 M#އJ ^zMpCn@wIŽ_TX-J K V)b2e4Y+nJ J a6ƗjVwKsGrEĐcwLJ J R&d3 e4d3 W*J b8|OOwKJ V)e4\.PJ tH~TX_lAJ _08e4\.PJ qFVW_lAJ _/@e4s@ xC 6F J J J d9_Vl:e4TpDJ ~F s@ I އJ ^zMpCn@wIŽ_TX-J J ~EuA s@ {D nJ J a6ƗjVwKsGrEĐcwLJ J G tA s@ tA J#J b8|OOwKJ ~E s@ yC PJ tH~TX_lAJ xB 8s@ yC PJ qFVW_lAJ xC @s@ e4^0g6[i>J Y+we4P$LJJ Xga_][X~U|RzOwKsGpCm?n@Zœff;J K!X*~d3 e4c2O#ӇJ Q&bʝt˜wvspmjfb]X}TyOuJqDTʙn]3J K _/9e4]/LW*W*L!J W-\zNrFqCn?k;g7e4[|PJ U(e4J Y/Ǚqu˜xě{˞vO$M"삤e4K W,șpt˜xě{ʞvQ'M"퓤e4d3V)K J K k?ÐdcTzPwLtGoBj;e4qAxMJ S'e4 J!J ‘dW~U|SzOwLtHqDuH^Z]2J M"[,`e4e4d4S'J xMʙoiea]X|SxNtGX^O&J O$Ңb3e4e4Z,uJ J X-Ti8e4~OwKJ V)e4\.PJ tHglplAJ _08e4\.PJ qFhlplAJ _/@e4s@ tA F!J J K k?ÐdcTzPwLtGoBj;e4qAxMJ G s@ I J ‘dW~U|SzOwLtHqDuH^Z]2J I {D `sA s@ s@!G J xMʙoiea]X|SxNtGX^O&J H uA s@ t@ }F!uJ J X-Ti8e4~OwKJ ~E s@ yC PJ tHglplAJ xB 8s@ yC PJ qFhlplAJ xC @s@ e4c3V)K J j?Ȗjǘomoponmifb]X{QwKrEl>ZlAJ W*e4O$ЇJ [lifeb_]Y~U|RyNvJrFoAl=qBÏa_[1J M![-]e4e4b2N#هJ R(Ñd˟xƟŞĜ}Úz˜wtqmhd_[~UzPvKrER˚m_4J K ^/?e4d3 K!J Y/cV}S{QyOvKrFoAk;[|PJ U(e4J Y/ɜuĜ}ƞǡ̠yO$M"삤e4K W,ɜtĜ}ƞǡ̠zQ'M"푤e4d4Z,mK!J b8bÓjcb_\W{RwKqDki9uFȕhTS)J P#˞`02e4b1"M#߇J T*œf͢|ʦʥɤȢƠŝ~ě{˜wsojfa[~VzPvKrEQʚm`5J J!^/De4d3J L!tHd9J `6ba_]Y~UzPvKqD_|PJ U(e4J Y/ʟyȢʥ˧΢|O$M"삤e4K W,˟xȢɥ˧ͣ|Q'M"퐤e4].MN#فJ Y/[ǘoop nkgb\~VxNrEsDSJ Q%e4d3 J ȕligda^Z~V{QwLsGoAvFÐbzMO%J R&a1%e4d3 Q&J L"YˠzƟŝ~ě{˜wsnic^W{QvK~PÑdS)J N#ܠb2e4L!퇇J ~R[}TzPwLsGn@QwKJ V)e4\.PJ tHězƞȠlAJ _08e4\.PJ qFězƞȠlAJ _/@e4s@ yC MI فJ Y/[ǘoop nkgb\~VxNrEsDSJ G s@ tA J ȕligda^Z~V{QwLsGoAvFÐbzMO%J G vB %s@ tA F J L"YˠzƟŝ~ě{˜wsnic^W{QvK~PÑdS)J I uA s@ I 퇇J ~R[}TzPwLsGn@QwKJ ~E s@ yC PJ tHězƞȠlAJ xB 8s@ yC PJ qFězƞȠlAJ xC @s@ e4b3R&J V+X̜qėtÙxĜ|ƞǠǡȡǡǠƞě|˜xsmgaY{QuI[rGJ U(e4M"J aƚw˜wusqmjgc_[W|RxMuIpCm>i9f5}NȗjuIN#J K X*{e3e4c3M"J W,ǕiϦέά̩ͫ˨ʦɣǠŝ~Úzvqlfa\~VzPvKqD}O˛mb7J K!_08e4d3J N$ϟr[]afiwOJ `6nmjhd_Z}SxMŽb|PJ U(e4J Y/̢|˨ͫέϥO$M"삤e4K W,̡{˨ͫέΥQ'M"펤e4c3R&J R(}Rɚp˜uÚzě{ě| Úz˜wrmf^WxNvIVJ P%ˆe4c2J ɛprpnjfb^Y}TyOuIpCki9e4h8VȖjd9J O$Ơa2e4!e3R&J W,ɗkЩҴҳҲѱЯϮ̩ͫʦȣƟě|˜wrmgb[~VzOuJqC|M̜oc8J M!c3e4d3J O$ϟrdhmrv{VJ a6ÚzÙyvrnic]~VÐe|PJ U(e4J Y/ͤϯѱҳЧO$M"삤e4K W,ΤϮѱҳШQ'M"퍤e4a1(N#هJ L#sHɘmĘtĜ}ƠȣɥʥɥɣǠŝ~˜wph^~UyNYJ P#ˈe4b1J J!̞tě{Ùyvsojfa[~VzPuJqCl=g7~Obd9J T'd3e4T'J N$^ШбЯϮ̩ͫʦȢŞÚzsmf_X{QuJ{NŒfV+J O#ԣd3 e4J ͞q^fkpL"J hspkf^W^wKJ V)e4\.PJ tHͪϮϮlAJ _08e4\.PJ qF̩ϮϮlAJ _/@e4s@ vB (I هJ L#sHɘmĘtĜ}ƠȣɥʥɥɣǠŝ~˜wph^~UyNYJ Hˈs@ uA J J!̞tě{Ùyvsojfa[~VzPuJqCl=g7~Obd9J F s@ s@ FJ N$^ШбЯϮ̩ͫʦȢŞÚzsmf_X{QuJ{NŒfV+J I tA s@ J ͞q^fkpL"J hspkf^W^wKJ ~E s@ yC PJ tHͪϮϮlAJ xB 8s@ yC PJ qF̩ϮϮlAJ xC @s@ e4 ]/FJ!J Y.cʚpsÚzƟɤ˧ͫϭаѰаЯά̩ʥǡě|ume]~U]yMJ T(e4K!J œgʣɣȡǠƞě|Ùxtqlhc^Y}TyNuIpCl>h8e4sCɗjSN$J N#עc3e4V)J N#dѨֺչոԷӵҳбϮͫ˨ɤǠŝ~˜xrmga[~UyOtHoBQ˚nV+J Q%e3e4d3J O$ϟrmsÙyŝ~Ơ]J a6ȣȡƟĜ}˜xrle]Ēg|PJ U(e4J Y/ϨӵԷչѩO$M"삤e4K W,ϧӵԷչѪQ'M"팤e4].KK J S)bǚrÙzǠʥ̩άϮϯϮά̩ɥƟÙypf\|S\J O#Ԉe4a2$J N#͠wȢǠŞě{˜xsnic^W{QuJqCkJ K!W+}d3 e4W)J wLѤy̼ǵ¯ؽոҳϮ˨ɣŞØwʜr_N$J P$ɢc3e4c4 J Y.ղοǵپԷϮʥŝ~ɛr|PJ U(e4J Y/ۼٶO$M"삤e4K W,ۺٸQ'M"풤e4c2T(I J L"qEΣzʴɸٿӵͫǠvjwKJ T'e4K!J ŕk˻ƴ®ؽԷѱΫ̡|ca7J L!Y+nd4e4\.TJJ d8Ρwοȷ®׻ӴϮ˥͟vxLJ U(e4e4].KV)Y+T(ƁJ nB׵ŲֺϯɤțuwKJ V)e4\.PJ tHlAJ _08e4\.PJ qFlAJ _/@e4s@ uA F!I J L"qEΣzʴɸٿӵͫǠvjwKJ F s@ I J ŕk˻ƴ®ؽԷѱΫ̡|ca7J I {D ns@!s@ yC TJJ d8Ρwοȷ®׻ӴϮ˥͟vxLJ ~F t@ s@ yC K~F K$L$ƁJ nB׵ŲֺϯɤțuwKJ ~E s@ yC PJ tHlAJ xB 8s@ yC PJ qFlAJ xC @s@ e4_/=N$́J V,YլϿǶٿշЯ˧ƞujȗle:J Z-de4Q%J Sܾͽʹƴïٿ׻ԷѲϭ̩ɤʟy˜ouJN$J J T'c2e4W*J uJУxѾ˺ų׻ӵаͫʥƟ̞s\M#J Q%d3 e4Z+kS'V)V)L!J V+ĕnɶɸԷϯʦŝ~ɛr|PJ U(e4J Y/ݾٷO$M"삤e4K W,ܼڹQ'M"픤e4`01Q%J O$sG͟wܿȶٿӵͫǠujsGJ V(e4 M"J d̼ƴոЩdf;J J U)d2e4]/LK J \1əoʵ˻ŲؾԷЭ͞tmAJ V)e4 [,nK!J X-ętԷϮȣǚtwKJ V)e4\.PJ tHlAJ _08e4\.PJ qFlAJ _/@e4s@ wB 1H J O$sG͟wܿȶٿӵͫǠujsGJ ~F s@ I J d̼ƴոЩdf;J J ~F!tA s@ yC!LJ J \1əoʵ˻ŲؾԷЭ͞tmAJ F!s@ |F!nK!J X-ętԷϮȣǚtwKJ ~E s@ yC PJ tHlAJ xB 8s@ yC PJ qFlAJ xC @s@ e4e4[,aM"恇J `5_խ˵ȷշЯ˧ƞtjɘma6J \-Ye4R&J |PݿϿ˻ǵïپֺӵѯΦΟsST*J P%Ğ_05e4X+xJ nCΠtʴξȷðؽոҲέ˦͟sTL"J Q%d3 e4`1-P%ۇJ L!xMٷԷϮʥŝ~ɛr|PJ U(e4J Y/ڷO$M"삤e4J W,޿ںQ'M"햤e4\.UN"ہJ N#qFʜr԰Ѳ̩ƞrÓjoDJ V)e4 O"ۇJ ^ųկbd:J J R&`0+e4^/?L!J U+ÑeͽƴӲɚoa6J I Y+qe4 a1,Q&J L"{RͨƠƙrwKJ V)e4\.PJ tHlAJ _08e4\.PJ qFlAJ _/@e4s@ zD UIہJ N#qFʜr԰Ѳ̩ƞrÓjoDJ ~Es@ IۇJ ^ųկbd:J J G wA +s@ xB ?I J U+ÑeͽƴӲɚoa6J I |D qs@ vB!,L$J L"{RͨƠƙrwKJ ~E s@ yC PJ tHlAJ xB 8s@ yC PJ qFlAJ xC @s@ e4c4 W*K!J `5^өܿǵٿԷϮ˦ƞtiʙn^3J ].Me4T(J xMݿ˻ǵ¯׻ҫ͞s}QU*J M"[-We4Y+oJ J d8˚n˺ŲٿֺӴΪΟsuIJ R&d4e4d3U)J `5ʠ{Դέɤě{Țq|PJ U(e4J Y/ĪڸO$M"삤e4J W,¦ںQ'M"헤e4e3[-ZO#ԁJ M#pDȘm̢~Ŝ{pǗmf;J X+se4Q$ÇJ Uʴ̷شbd8J J R&_04e4 a1'N#܇J P&^׳ʺƵհƔhX-J K!].Ne4d3W+J b8ÖpŗowKJ V)e4\.PJ tHlAJ _08e4\.PJ qFlAJ _/@e4s@ t@ zD ZH ԁJ M#pDȘm̢~Ŝ{pǗmf;J |D ss@ HÇJ Uʴ̷شbd8J J G wB 4s@ vA 'I ܇J P&^׳ʺƵհƔhX-J J yC Ns@ s@ I$J b8ÖpŗowKJ ~E s@ yC PJ tHlAJ xB 8s@ yC PJ qFlAJ xC @s@ e4b2U'L J ^4\ѥ|ղӵέɤŝ}rg͝pY/J ^/Be4 U(J tI۹ϿƳֱΞr{OS)J M"Y+rd3e4\-SJ!J Z/ǖiٶ̼ƴ׻Ѭ͝ph=J U)e4e4 ].MM"J P%]ͨȡ˜xșp|PJ U(e4J Y/ǭڷO$M"삤e4J W,ĩڹQ'M"홤e4e4]-RN$́J L#nC_˛o͞qZ/J ].Me4U(J vJӧ͝tWa7J I S'a1,e4 c3P%ŇJ L"yNϢyѦ~WQ&J L"`01e4].PM$J Q'ZwKJ V)e4\.PJ tHlAJ _08e4\.PJ qFlAJ _/@e4s@ t@ yD RG ́J L#nC_˛o͞qZ/J yC Ms@ G J vJӧ͝tWa7J I F vB!,s@ uA H ŇJ L"yNϢyѦ~WQ&J H wB 1s@ yD!PL#J Q'ZwKJ ~E s@ yC PJ tHlAJ xB 8s@ yC PJ qFlAJ xC @s@ e4a2U)K!J \2ZϢwΦȣÚzpfϟrN$J a1(e4 X+xJ j?رض͝qyMR(J M!Z,md3e4_08L!J S(bխ̻ͽȶҫʘk^3J I Y,ie4b2S'āJ mBǛvtǘo|PJ U(e4J Y/ȯٶO$M"삤e4J W,ūڸQ'M"휤e4].IP%łJ P%h=L"J a1&e4X+vJ Y/a5K!J JT(a1&e4d3S'J \2e:J O$ϡb1e4c2U)·J J V+J V)e4\.PJ tHܼۺ׳lAJ _08e4\.PJ qFܺۺ׳lAJ _/@e4s@ yC IH łJ P%h=L"J vA &s@ |D vJ Y/a5K!J JF vA &s@ s@ G J \2e:J H uA s@ uA N&·J J V+J ~E s@ yC PJ tHܼۺ׳lAJ xB 8s@ yC PJ qFܺۺ׳lAJ xC @s@ e4b2V)K!J Z0XϟsʜtnfǖiJ J d4e4 \.UJ ^3ҥ{͹ײ˜owKQ'J M#ߙZ,ge4e4 b1"N#ׇJ N#YТvٻټУzÑdV+J K ].He4 e4Y,xK J Y.bȘm|PJ U(e4J Y/ǮٵO$M"삤e4J W,ŪٷQ'M"힤e4^/AT(K!J O$Њe4a1&J J N#ٔV)b2e4[,cL!J I W*d3 e4e4[-K J V)e4\.PJ O$T)N#J _08e4\.PJ N$T)N#J _/@e4s@ xC AG!H J H Њs@ vA &J J I ~EuA s@ zD cI J I ~F!tA s@ sA I#K J ~E s@ yC PJ O$T)N#J xB 8s@ yC PJ N$T)N#J xC @s@ e4c3V)L"J W,wLȗjϟr\J M"ᄤe4`01J S)ϟralAO%J O"ۙ[,ad4e4c3Q%J i>ʙl͜puJL"J M"a1,e4`03P%J L#{P|PJ U(e4J Y/ūشO$M"삤e4J W,§صQ'M"e4d4^/?V)T'a1)e4\.TR&Y+ua1'e4c2S'R&`02e4_06O$J Y+re4c3P%ĄL"R%d4e4c3P%ÄL"Q%d3 e4s@ s@!xB ?F!FwB )s@ yC TG |E uvA 's@ uA F F wC 2s@ wB 6K"J {D rs@ t@ H ĄK!Gt@ s@ t@ H ÄK!G tA s@ e4c2X)L!J K!`6[0J S'e4d3 L!J g=Y/J N#՚[-[e3e4e4V(J J Q'X-J R%b2e4d3 W*J Q'J U(e4J X.ȗkȘlȗlǗjN$M"삤e4J V+ȗkȘlȗlȗkQ&M"e4e4d3 ].Od3 e4s@ s@ tA zC OtA s@ e4d3 [-_Q$ÃJ ^/>e4V)J K!T(^/?e4^/?N#ځJ K![-[e4\.WM#J U(e4JJ M!イe4L!J M!e4e4s@ s@ e4a1'Y,lV)].Me4d3Y+uW*[-]d3e4d3Y+tW*b3e4b2Q$ÇJ X*{e4[-WQ%^/Ee4]-QQ%^/Ee4e4s@ s@ e4e4e3^0NNN   ~}{chf&# ]\]*''(WUS~IIF" vuwOOO =;<>bedux{1-, '$! 858DBE @=;WVV" $  PMNNNO (RSTQQSFCB&&~y}cbd,-+yyxbdf-.,&" =99[[[2ggi=<:WXX$# $ "  b__'&%jhgttu@B@%!)''^^^!hbf}}~ !,,-rrulkl/,+ #" EEE.,- ZYUUTV('%"!III0%$$ !C>@405_[^~{:99  # '%&A>BEBE~{~jkj996!$">>>QQQ: 8:1+,"  NMQ FDDHGG !" hefa\b 30.onlxyxKII6222--2//FGGXXX ! ((!10(.,$  gdeiik0//hg`  $! A=? XYVQNN966WUUXXZrtuKKK #$%$""*%/*$AAB$upo~|)(' )$   547A@=zywPON\Z[gfgWXZPPP3(((iik=>> 3,&& &#%001URT?CC  %%**#  c_a[Z\#$!srp|zyhdea]`SSU UUUCACB   2)% .&   LNO ?<: XXV    $" 0.%   =:<   \YW qol >>= QUU LLL                  2 RQO VWU   3.* .+%  ebd him  -+* mmm ,**   ,+%   ,)( 434  &'" &,' |   OOO                  &'&/-0B=A }z} bhe "$  /&% -%"   KEF 0  ## trr y{ >>B   $$   ! JKK  cee PPP                      B$%$b`d # $ ^]^ yzy 424  % .'$   745 124  ][[ WSU   !    VVU                        & XZ\  WPQ ??<   ("   & " }w| FDI  IFC fdd ))%  ($!  ?><  RRQ                          E ono  HAE IHF   $ #   c_a WWY  3/0 |y~ ttu 445 -*) )& ** 53/ OOO                          8  <89 VXU   ! &#   LHF mmp   lmm ~ ;:: )'" ZYT NKL nkn  SSS                          ,  *&' mhh #   ))$   0**  `\_ cd` 350 ``a ]\b LKP    SSS                           - %''  ~ }}~ 0.0    1,) ($   003  KFG ba^ `_a cac >;> cae  SSS                            346  fed GDE   0-& 1/'   e`a  JIK  975 tom zwt WRQ DA@  SSS                             KLRHFGZ\Y! -'$51-B=<tvy2.-c]]KNL PPP                           +  xy|200qnr.*.'#30*# *)( VWX PPP                                . ,++&!!wqq884+)%! &""\]^ QQQ                                   DBCa^`DCB $ *'( MMM                                 "VUYLLNVSV&! 732yvv  AAA                                  _`b979YX[;78855442AA=WUU  ///                             ccd.-.omn~VTW,++<<:QRPCDC\[\ ;;;                           ddd  IIK  ! b`_ UTV &&% 220 @@@ 566 223 [Y[  hhi!!"                           &&%                     !   '(% $')'! !&()($   #()(# '($  %9QV VWWWWWWW&&%WWW WWWWWWW WW WWWWWWWW W WWWWWWW WW WVUUE-!'*)*+++(&*)*++ +*)*'(*)*++* )*% (*)*+*)*)" 9qs=#)*)*++*)*( %*)*+++*)*(&Lyf: X #9Y{|R*(*)*+*)*)"-_c4 !cb/ ,dddeØ͎ϗτНФВIIK!b`_UTV&&%220@@@566223[Y[БММЛІМНЙЕИЛЈ МϛΚϗɌiijA Bեd>օDYօ, nք  k5 "Յi 0օU0oK%V>[u5 nք c|3f'  0|ccd.-.omn~VTW,++<<:QRPCDC\[\ 끂;;;L ',1Dg.+:W]>,,=b|M6( -=a }M6%zN (<\jD1 '3Iya?. !_4 %g#0Bh~N7%%^V? j_`b979YX[;78855442AA=WUU􆆆///1 &dԃ I &t{* 2T 5U aR [4W/ 1G%gH609S5 >W  6 P 'Ѫ"VUYLLNVSV&! 732yvv@@@P c [C81,*)*)*+.2:FVli27 O T& ?GC ;L %m4 ;;  _ _߁ X,X ;B@Ba^aDCB $ *'(LLLs(* m"   "?(vz/S (QO J7R T% P%9? $8 ),6Q #R56TY t>WL. M,++&!!wqq884+)%! &""\]^RRR~.u3 LEW^<6 r ) "eX 97r/. $l# 8x 6 SY 6w . +{k + Pxy|200qnr.*.'#30*# *)( VWXQQQ0X{ 5b HP o1'Vp{*z0c y$hn:'W A pSA !PKLRHFGZ\Y! -'$51-B=<tvy2.-c]]KNLQQQ0 Gf 2!?G f+ 4#"v ,[  R\@1.4D_O $# Qow%j`  !Q346fedGDE0-&1/'  e`aJIK975tomzwtWRQDA@ QQQ0;\ ??;݁Db' ~t ,X.S(  )X $9 P" |CZX . !Q%''~}}~0.0 1,)($ 003KFGba^`_acac>;>cae QQQ05W`] 9܁D`' }t +W [ a%  .xU $i e, {$3U- !Q*&'mhh# ))$0** `\_cd`350``a]\bLKPQQQ01U9܁D_' }t +W(Ap$8'0 {}0Q !Q<89VXU!&# LHFmmplmm~;::)'"ZYTNKLnknQQQ00UK89܁D_' }t +WH6 %4$ R2 {w0OG !Qono  HAEIHF  $#c_aWWY3/0|y~ttu445-*))& ** 53/PPP00UY9܁D_' }t +Wf7>^ J  @. {y0O) !QXZ\WPQ??< ("  & "}w|FDIIFCfdd))%($!?>< RRQ00UM{9܁D_' }t +W #G c H& {E,0OG !$%$Qb`d# $^]^yzy424%.'$ 745124][[WSU !TTS00U09܁D_' }t +W 6q5 *k{ {S 0O !&'&Q/-0B=A}z}bhe"$/&%-%"  KEF2##trry{>>B $$ ! JKKceeRRR00U aM9܁D_' }t +WE,K] !TC  {8%0O4 ! QQPNȗVWU  3.*.+%  ebdhim-+*mmm,** ,+% ,)(434&'"&,'|PPP00U,H9܁D_' }t +WRq  P { Nn0OG !QȘACB 2)%.& LNO?<:XXV $"0.%=:<\YWqol>>=QUUQQQ00U9܁D_' }t +W[7 $U5 { Oj0O5 !(((Qiik>>> 3,&& &#%001URT?CC  %%**# c_a[Z\#$!srp|zyhdea]`SSUQQQ00U9܁D_' }t +W ` '^G  { >}. 0O  !#$%Q$""*%/*$AAB$upo~|)(' )$  547A@=zywPON\Z[gfgWXZQQQ00U9܁D_' }t +Wcz "]H { )rS0O# ! Q((!10(.,$  gdeiik0//hg`  $! A=? XYVQNN966WUUXXZrtuQQQ00U9܁D_' }t +W cZ J7  {DG 0O  ! Q8:1*,!  ,HFJ GEEKKK !"  ifg`[a 2/-qpnxyxKII6222--300DDDQQQ00U9܁D_' }t +W`A%t`  {NU&0O2 !%$$Q !C>@405_[^~{:99  # '%&A>BEBE~{~jkj996!$">>>QQQ00U9܁D_' }t +W [00o. { Hm59O !Q!gbf}}~ !,,-rrulkl/,+ #" EEE.,- ZYUUTV('%"!QQQ00U9܁D_' }t +W S&&i. {:sxO !Q2ggi=<:WXX$# $ "  b__'&%jhgttu@B@%!)''QQQ00U9܁D_' }t ,V IF**+*s[' {*UO ! Q(RSTQQSFCB&&~y}cbd,-+yyxbdf-.,&" =99QQQ00U:܁D`' ~t .U :Ԗ3O  {  9mO !Q?;<>bedux{1-, '$! 858DBE @=;WVV" $ PMNRRS00U:݁D`' t 2S(iE  |$(""C{O !Q?)((tsqchf&#RPR''(WUSHIF! sqtSSS00U<݁Db' t 7Q sӍH  } :s,IOG !Q~JLJ ! kjkyyzmljppp540  $ 433ecf<<>PPP00U>D b't >M TS,)*)(8h% I! 5&1NG !Qnoq422--/ &# +((ZYZ 957Z[Y !  VTUA?C mmoQQQ00UBD e't IH6Gt "V'wW 7M !QTSWQUQjfh " '$   QKM0213ZWU~{|CBD  MKJcb`PUQQQQ00UGD h1.|ZAuh'P "c3( u ?JG !,,,QLJL/-/suwGJE'&~z}(&&uvtgdd0+,# FCC[Z[)()a_]hedqpn_cbz~~QQQ00U NDnjB? q8E9*._(}  LGG !Q##'[XZ{}{++*  +&# 979[[[GFEJKI)# " nll)(( FADsqr^_\DCAfggSVY|QQQ00UYDva_r= +|:Tl,(!{ cA !Q{z~ȗhfd $"##fdh<<<dbatrt756'$"!"uuu XUU{xwnmlB?A(%'cee[^`QQQ00UkD j"QF;y =|EtZ ](.|y 8G ! Q{yyYXY %"$"$$!"|xydae&&%!  NKNKJK534ifi|y|kilMJM712,%&0-.VXWRRR00U!D3 4 M,Y#T [N GCf;(GG,+* !'((Q:76$  0.0rpr555ROP wux,+-@?Arpt~z}c_c97;""*&#!ehcVVV00U KD c Fv`+ @L: *s4 u> -60/(!{, TnG !&&&QPNQZYY HEF>>: "  534uswMNNuvxrrtRPP/++(''AAB00U.ytD Ds*qzO74EtDs<\<1=bk &G 1S Bw% 8( R|s 5l 9<G !Q:9620.lllHHI$##WVUqoo+*&  YWZ\Y\'($c``zxzghh@A?   <;=STV*+-)))01UUD%c'f{ "*++*)=7)*+*&t 65'{k- Q`a:  ,`(.m D e!  Df& !QNLH][Ya^a97:,--hiiVXW $""{y|<7< :;6pqnwsw_Z^755   TTV314!!(*(00U"FD 'R 'O. Ԅc t +{Qc{P92AeXkW<13@Y( ,\ @\;2:Uz" !QA??[Z\;plo& %A?B|}~vxy;=<  =;8zy|UPQ{wwnlnLJM'$%   '&(fdg!C@>IIG/0/ 01U 1dD :q' 4;w t ]]@AV(  B|+uj!G ! !QhgjWWYMNNCCD^[^eeg%$% #$  ]\^VSY.-.kik{y{a_a968   LKM425 ?><][YPML??=.//01U "EC 'R'L1 CԄct 6zK K W  3w~Q:\' -[ >{ z:G !QȌTSU668rrs85:+)*BEA )#""#*(+LKJzy{uvyQSR#&  ywy~ XWUrqrNML984??<44400U /d8  8o  ?qs=V6()*)%t 0^P$ 1Yk? /Wg?" ^!  @{*JorJ(G !QȒefj959NNJyww! !  SPTZX`#% eiejjj=99  455LKN562jkgrrqfbc?8;.+*9:655400U'%  (!#'$ 7t  !&(&    #'((&!  #'(&!"( $&('% G !QȒxz}PLP+&) @A:ONK //1B@;|{y}TXY$%$ jjlOOOtswppqUXS9:7410)$#!#"00U(t  !QwxzȔjjk-,,%"$#   879&`\[rnq@=A  ))(\Z^""b_^ytzlhnIEI#! 00U#t  !QooqrqronmrpoGDE !:76DA@ ][['_^b ,+(nlj~`\],')    aab878 772iievqtaZ`953 JKLDDD00U ~t  !Q`_aRPQ644HFF_[]502312NLOihk EDE?>=vttrppECD 212srt" !HFGnnklliKIF%!"*)([[Z 00U &t  !QGGGEDD**)%&$EBB>::&&$998JIJEDHiil/002STRxxwcca321 YYXPOR((%VUSqmoa]`896  XXXTTT00U5t G !Q768><>787)*)&$#&"!!IIHnnozy|eegPQRegghfh"!!11/cfdtuvRPO&&" -..97:>?;ffbjjfQMM-(, +,,OOO00U I t G ! ! Q<:<<:;877655,++%$"732jijlmn?@A89:}~FEGIJD|{vqon@==  MMNfeh%&$TSNolha_]>=;   IJJQQR02Un!t  !QFEDDAA732410?>;MMKb`bzy|rrtJJLGGI-+(+!hgd``].)( $$%wwx>=? 674iielkgPMI/*)  wzvQQQ05X-$t ) !QFECLIH@=:0.+632VTW|}~~~UUY346ppokhn330JGI   @@ATUQwusc`a;:;  466PPP0=]  ^'t G !QBABGFHDCC;880+/2/4RVY~~~~[[^225\\_DBF  SUSonm*'# lloSQU'($mnhxvrPKJ&!" ijjQQQ0 If &( '.t "(& 8 !Q??AEDFB@?><<=;;0./$##FFG~npr?@B =6:A@C,0-nplLKL  323'%(AFBuzwkii;67  676 TTT0\t "bj' `8t 8|P# !! PFCDCAA:98:99><;A=<833$!#89;qrqfij332 `b]opl.*+  nmo!gei !ceauxtPPO!  {|{RPR0y% &,+~m Ht HlF PRNNQMM:::111977>;;B==867 "!)+*]]]~~}~qssFHG,+)(#"'#"# 89=001 BB@rqphee;78  KLLYVZ0(B lsjt 1M:  N>::LJJMMM?>=332644<99=<<756'%&''&JLHqsq||tqwrptkkkACB,++)%&*$%&! uvxonp++)^^[okkSMM*'%  .-/ ~.Y+-6 /t `F   <:77@==FDBMJHCA@111222887<:9977-.+(+&>@;=98800.,,)220<;:A?@FDFWUVqop{y{``aLNNCDB<=:TUT$-,-542gfcppnLKK)%&//.@>@ 532LKJHGG !T  &+1Bd lO=3,:C Bt  yF1.1mUQUUQV?<@<9;NKMOKM<7;84:>;@B?AB@?<;9433544=<;@>>@>=LJH`^_qpq}~vxyjknVVXiijsrv**+HKGrromijB?A"   aab}z}/./)()LLKihgZXW0// 5 BЋ f .6  9st a- 2A?C[W[WSWHEHIFFZVUZWWNLOKJMPOORQQSQQQOONKLNKKOMLPOMNNLZYX||}`aadddxyy~~}A@Aa^_iif?<<-)+0.1335:;;^__nln0.0DCChhgppo_^^=:; P!'**( ov (Vt 3P /624jTPRROPEDCJHG\[YZZYPQPRRQЁTRS$WUUYVVVRRSPPUUTWXW`__uuvЌЕЖИЅXWW.,+*))989783fgbЍfdc:;801.>:BY\]ХЁз^]^'('IIGssrpooXXW...C  (-  =vt Km'<++,Q&''V$$$V++*W***W''(W&''W'''W(((W)))W1(((W'''W**+W,,,W(((W###W$$%W'&&W''&W+++W,,,W**)W%$$WW'(&W552W"##WW##$W+++W+,+W'('W*+*W565W::9W,,+W!!!W W! W"!!W"""W!!!W W!!!W W!!!W###W"""WWW*+*V556U*++UH/! #di')Xa 9~P  !   &' &'"(%   TRUEVISION-XFILE.linthesia-0.4.2/graphics/title_InputBox.tga0000644000175000017500000005311711314377743017762 0ustar cletocleto                    5 M W X X X X J3  3bv^+ [%%%///222222222222+++  X  k222FFFHHHGGGGGGGGGGGGFFFEEE???(((`  o"""EEEJJJIIIIIIIIIIIIHHHGGGFFFEEE888_ _$$$KKKKKKKKKKKKKKKJJJIIIHHHGGGFFFEEE??? X  @JJJMMMMMMMMMMMMLLLKKKIIIHHHFFFEEE;;;+ g>>>څNNNOOOOOOOOOOOONNNMMMLLLJJJHHHGGGFFF)))_ *"""PPPOOOPPPPPPPPPPPPOOONNNMMMLLLJJJHHHGGGBBB  J666RRRQQQPPPPPPPPPPPPOOOMMMLLLJJJHHHGGG$$$7 gHHHTTTSSSQQQPPPPPPPPPPPPOOONNNMMMKKKIIIHHH111 P vQQQUUUTTTSSSQQQPPPPPPPPPPPPOOONNNLLLJJJIII777] XXXVVVUUUSSSQQQPPPPPPPPPPPPOOONNNMMMKKKIII:::b XXXWWWUUUSSSQQQPPPPPPPPPPPPOOONNNMMMKKKJJJ:::b YYYXXXUUUSSSRRRQQQPPPPPPPPPPPPOOONNNMMMLLLJJJ:::b YYYXXXUUUSSSRRRQQQPPPPPPPPPPPPOOONNNMMMLLLJJJ:::b YYYXXXVVVSSSRRRQQQPPPPPPPPPPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNMMMNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNMMMLLLKKKLLLMMMNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP OOONNNLLLIIIHHHIIIKKKMMMNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMKKKHHHGGGHHHJJJMMMOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOzzzaaaMMMOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMGGGJJJMMMOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNOOOMMMiiiGGGIIILLLNNNOOOPPPOOONNNOOONNNOOOPPPOOONNNOOOPPPOOONNNOOOPPPOOOPPPOOONNNOOONNNOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNMMMLLLMMMNNNMMMLLLiiiFFFHHHJJJMMMNNNOOONNNMMMNNNMMMNNNOOOPPPOOONNNMMMNNNOOOPPPOOONNNMMMLLLMMMNNNOOONNNMMMNNNOOONNNMMMNNNMMMLLLMMMNNNMMMLLLMMMNNNMMMNNNOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNMMMKKKJJJIIIJJJKKKLLLKKKLLLMMMLLLKKKhhhEEEGGGIIIKKKMMMNNNMMMKKKJJJKKKLLLKKKJJJLLLMMMNNNOOOPPPOOONNNMMMLLLJJJIIIJJJKKKLLLMMMNNNOOONNNMMMKKKJJJ KKKMMMNNNOOONNNMMMLLLKKKLLLMMMNNNMMMLLLJJJLLLMMMLLLKKKJJJKKKLLLMMMLLLJJJKKKLLLMMMLLLKKKLLLMMMOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP OOONNNLLLIIIGGGFFFGGGHHHIIIJJJIIIHHHIIIJJJKKKJJJHHHIIIgggDDDFFFHHHJJJKKKLLLMMMLLLJJJHHHGGGHHHGGGHHHIIIJJJHHHIIILLLMMMOOO PPPOOONNNLLLIIIGGGFFFGGGHHHJJJKKKJJJKKKMMMNNNMMMKKKHHHGGGHHHJJJLLLMMMNNNMMMLLLIIIHHHJJJLLLMMMNNNLLLJJJHHHIIIJJJKKKIIIHHHGGGHHHJJJKKK JJJIIIHHHGGGHHHIIIKKKLLLKKKJJJIIIKKKMMMNNNPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP OOOdddjjjIIIFFFDDD]]]gggIIIJJJHHHGGGHHHJJJIIIGGGHHHIIIgggMMMWWWHHHJJJKKKJJJHHHWWWfffGGGvvvVVVGGGHHH___VVVHHHIIILLLNNNOOO PPPOOONNNLLLHHHFFFEEEFFFHHHJJJLLLKKKJJJIIIHHHIIIJJJLLLKKKIIIOOOfffHHHKKKLLLMMM LLLRRRGGGHHHJJJMMMTTTjjj```GGGHHHIIIHHHFFF^^^fffXXXKKKJJJIIIGGG^^^fffWWWIIIKKKLLLKKKaaapppIIIKKKMMMNNNPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPaaa~~~JJJoooHHHgggYYYIIIHHHXXXHHHTTTNNNOOOPPPzzz QQQHHHGGGHHHIIIJJJIIIvvvTTTMMMKKKoooUUUGGGIIILLL\\\wwwHHH~~~cccJJJPPP jjjMMMcccyyyLLLMMMOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMM EEEHHHJJJKKKOOOIIIJJJKKKfffHHHggg___IIIKKKrrr___HHH ___PPPwwwWWWHHH^^^HHHqqqlllOOOPPPNNNLLL|||OOOIIIMMMNNNlll~~~FFFGGGHHHWWWWWWIIIyyyMMMLLLJJJFFFIIILLLMMMKKKFFFHHH~~~JJJMMMlllrrrJJJuuuHHHZZZTTTcccMMMNNNOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNiiiFFFIIIKKKGGGIIIJJJKKKfffHHHgggGGGIIILLLFFFfffHHHJJJKKKaaaGGGHHHgggGGGIIILLLOOOPPPOOOLLLeeeHHHKKKMMMOOOPPPOOONNNEEEFFFFFFGGGIIIKKKLLLJJJHHHOOOHHHKKKLLLJJJGGGHHHvvvIIIKKKMMMOOOMMMSSSUUUFFFHHHJJJLLLMMMrrrMMMNNNOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNjjjGGGIIIKKKFFFHHHIIIfffHHHgggFFFHHHJJJXXXfffFFFfffHHHJJJKKKJJJGGGHHHfffFFFHHHKKKNNNOOOPPPOOOLLLeeeHHHKKKNNNPPP OOOUUUuuuDDDEEE]]]EEEFFFGGGHHHIIIHHHnnn~~~HHHJJJIIIFFFHHHQQQHHHIIIKKKLLLMMMLLLiiiEEEFFFHHHIIIJJJKKKLLLMMMNNNOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNjjjGGGIIIKKKEEEGGGHHHfffHHHgggFFFHHHfffGGGfffnnnHHHJJJKKKJJJGGGHHHfffEEEHHHJJJMMMOOOPPPOOOLLLeeeHHHKKKNNNPPPNNNyyyDDDEEE^^^FFFGGGHHHGGGVVVOOOHHHIIIHHHFFFHHHRRRIIIJJJKKKiiiNNNFFFGGGHHHIIIJJJLLLMMMOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNLLLGGGIIIKKKEEEFFFGGGfffIIIgggFFFGGGHHH oooHHHgggHHHJJJKKKJJJHHHgggDDDGGGIIILLLNNNOOOPPPOOOLLLeeeHHHKKKNNNPPPOOOLLLlllEEEnnnWWWHHHWWWGGGHHHwwwIIIHHHGGGIIIKKKJJJIIIHHHIIIYYY~~~gggHHHIIIKKKMMMNNNPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP NNNLLLGGGIIIKKKLLLXXXHHHhhhJJJKKKpppGGGHHH___RRRKKKiiiJJJLLLSSSIII PPPEEEFFFHHHKKKMMMNNNOOOPPPOOOLLLeeeHHHKKKNNNPPPNNNLLLFFFgggpppIIIHHHIIIHHHIIIpppIII IIIKKKLLLLLLJJJIIIHHHIIIJJJJJJIIIXXXaaaJJJxxxIIIKKKMMMOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNKKKGGGIIIZZZ'qqqTTTMMMxxxiiiyyyMMMLLLMMMkkkLLLTTTiiiGGGHHHJJJLLLNNNOOOPPPOOOLLLeeeHHHKKKNNNPPPOOONNNKKKGGGJJJ[[[qqqSSS[[[qqqLLLccc[[[LLLMMMNNNrrrqqqqqqLLLTTTTTTLLLrrrLLLMMMOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNKKKFFFIIILLLdddTTTzzzNNN]]]zzzNNNOOOsssNNN^^^NNN]]]kkkOOOPPPOOOLLLeeeHHHKKKNNNPPPOOOMMMIIIHHHKKKMMMcccNNNzzzddd\\\cccNNNOOOzzzNNNVVVNNNdddkkkNNNOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMYYYEEEHHHLLLNNNOOOttt^^^OOOPPPOOO^^^OOOUUUMMMNNNOOOPPPNNNLLLdddGGGJJJMMMOOONNNMMMKKKHHH~~~JJJMMMOOONNN]]]TTTNNNOOOPPPOOOeeedddNNNOOOPPPOOOeeetttOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMhhhEEEHHHKKKNNNPPPVVVOOOPPPNNNLLLdddFFFIIILLLMMMKKKIIIfffXXXLLLNNNOOOPPPOOONNNMMMNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP OOONNNMMMhhhEEEHHHKKKNNNOOOPPPWWWPPPOOONNNKKKdddFFFHHHKKKLLLKKKIIIHHHLLLMMMOOOPPPOOONNNMMMLLLMMMOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP OOONNNLLLhhhFFFHHHKKKMMMOOOPPPOOONNNLLLfffGGGHHHJJJKKKJJJIIILLLMMMOOOPPPOOONNNMMMLLLMMMNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNMMMqqqIIIJJJLLLNNNOOOPPPOOOMMMwwwIIIJJJKKKZZZTTTNNNOOOPPPOOOlllMMMNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::a ZZZXXXVVVSSSRRRQQQPPPOOO{{{MMMOOOPPP{{{rrrzzzNNNOOOPPPlllzzzNNNOOOPPPPPPPPPPPPOOO MMMLLLJJJ:::a ZZZXXXVVVTTTRRRQQQPPPeeelllOOOPPPOOOlllzzzlll]]]NNNOOOPPPOOOPPPPPPPPPPPPOOO MMMLLLJJJ:::a ZZZXXXVVVTTTRRRQQQPPPOOOPPPPPPPPPPPPOOO MMMLLLJJJ:::a ZZZYYYWWWTTTRRRQQQPPPPPPPPPPPPOOO MMMLLLKKK:::` [[[ZZZXXXUUUSSSQQQPPPPPPPPPPPPOOO MMMLLLKKK:::`  {ZZZ[[[XXXUUUSSSQQQPPPPPPPPPPPPOOO NNNLLLKKK:::^ nSSS\\\ZZZWWWTTTRRRQQQPPPPPPPPPPPP OOONNNMMMLLL666 R TDDD^^^\\\YYYVVVSSSQQQPPPPPPPPPPPPOOONNNMMM ,,, ;   6///```^^^\\\XXXUUUSSSRRRQQQPPPPPPPPPPPPQQQPPP OOONNNMMM YYY```^^^\\\XXXVVVTTTSSSRRRQQQQQQQQQQQQRRRQQQ PPPOOO:::b T000cccbbb___\\\ZZZXXXUUUTTTSSSSSSSSSSSSTTTSSSQQQMMM 9 xCCCdddccc```^^^\\\ZZZXXXWWWWWWWWWWWWUUUSSS'''^ .FFFeeecccbbb```^^^]]]\\\[[[[[[[[[[[[ZZZYYYXXXTTT---s N333]]]eeecccbbbaaa```____________^^^\\\[[[KKK"""{1{555NNN]]]cccbbbbbbbbbbbbaaa```UUUCCC***fVq H =[vn Q3 TRUEVISION-XFILE.linthesia-0.4.2/graphics/app_icon.ico0000644000175000017500000010172611314377743016600 0ustar cletocleto(fh h  ^ 00 %@@ (BA( ppppppxppppxwpwp( @0+.967/..,))=:9Z[Z754gdf=::434LKK421IIGZVW978.++TSTy{}/-,654TSU=;:YYX+'(LLJwwzqomhefkij441$!  757a`]:89usr544ZWW[XZZXY863b`a&$"}}~ #! fca999200uqpJIJwtsCABRNKFDE" _]_41/qos~|| ,,,EEERRR___lllxxxʦ>]|$$HHll>](|2<FU$mHl*>?]T|i~$Hl>>]]||$Hl>*]?|Ti~ٓ$iiii1iiii1i=iiii1Ni)1Niii[1iz1iF*7iiii7im1oipC iiiii1ci$11hiiiii1XYi1[7ii7i*1Ni 1iii 1Uii G1$iiiI1Ki: 1=>iii?@1$i?C0112iii51C7i1ii)*1i -11"i?11$ii*1i1M)ii?X* 1ii (  @333o445;;;)))666;;;444334555555555222T>>>[YZ666VVV/-.nkh?>>999QQR:75999222 qps ___999MLMMKH)'&999>=<  999bbbtrs:::0/0 KJJKIJ>>=AAA[ZY )))455XVX665:::+(*ca`%##|}|'''"!!`_aXVU;;9HII'&&.,+]]]ppr632igg///! 755ONO'''~}}GFFRPQ! 011444###JKKPPPCCC&&&( @ &/0000000000000000000000/(335SPSA@@''%YYZuuu -658jjlNMM  8888O<::|MLIJKM666_999R?=A{z|<96+)*($$ZZY555b899RsttOKNwrr"/+'+(+YVVec`WUY666bAA@RmklYUYllj EBCrrr+((|z~ECB555b666Ryw|defccamjlYYZCBC/.)"777b-,,R}}~UTR ;:=POQssq@==OMO 666b111RMLG 765c__^]]gde0//CAAgddabc666b(('R712425omoKID,)+ijh]YX666b###Rfcd:9=roq20,pop1/0srtFEB555b444Rihi@CDiggEACSQR@@@oom"!1/.666b;;;RVSUKJKWYWtqs;:;QPPcc`ZYZ777bAAARVXYRQPFCA:88a_`LKH>==555b111RqnrZ]Z-*&.,-~~~=;=fed3/-%##$""NLLSUT555b--.Rc_`\[\b`cIGJcab VSUXWY-*,khj2./-.-999b--,R SPRQPRSQN544==>jhhmmj---b(('RGFFNLPUXX871!*&(XVVXUWpno%%%b001RqqtGFHUTSXWXecf/./eee631DCD&##IHE,,,b333RSSW(&%GEBDAB:::`a` VVV,+-FFFUTQ###b111Rgff 445301PMLMHJomo'&%ZWXA>>///b---RDCCA??%" ..-GGJxxx455XXU&$#565BAB321^\\KJK>>>b+++RDBB10.@>=CDE[YZ@?;XTTvvx+*+IFCOMJ444b++,ROML<97]^a|{~EFHEEHKJHC@>ddf'(&QOK$!!787777b-,-RROPA?@2/1STTABC 311LLJ`__MKK464HFD434b.-.OVTSLLK:88'&%BC@|}}*))999HED1,,++,VTU$#$_0ROP\YZRQRHEH:98@@=OMNroq||}PPPEGFtsuFEDVSS>;=#! ;;7;\X[d``a`a_]`YWWVTSTQQwww~}}\\Z\ZX444\^_FEEQPP%##+AAAbCCCiBBBiCBCiCBBiAAAiDDDiKJKiOOPi???i000i@@?iGFFi999i<<=iRRRi^^^iSSSiRRRiRRRiTTTiMMNi555iDDDe0 (0` %  *=655k...o111p111p111p111p222p999p**+pp'''p&&&p"""p###p!!!p***p222p121p111p111p111p111p111p111p222p//0p0/0p222p111p111p111p111p111p111p111o222lD+ """<?==wtu/./>>=?@@RRS...G )ȾTQSIFI1,-330IHG.C1.- -(&{yx,,,Y555Yrtw '(! )'$=9:gij???u444\BCG *&!XUUHJN--->>>x666]536(&'olp$ # yuu344ysrNKILML???x666]HDDOML (# 2.1VWUechEBG???x555]`Y\962 '$ EEDJJJ43-\[\zw{???x888]zqw"# ("3/4}}gbdDDC# #!"">>>x:::] 'TSUWX[20- WST@@@x!!"]D?Ckqo +$!~y{&',}][\ CGE???x)((]hjj +$  $! kli~QNK-/,>>>x-..]SSS.' '"%ROQBGG! CACsrprnn_Z][]^???x!!!]('3-&534oll610&$$,,.liiFEEabd}}~???x%$$]-/% f_dVTWWTV 975jkj.)).++:;>>x777] QVV710 ""5-1//0yy{ gde???x666]rpn c`c>;;YYX AAAx555]jik qtu  WVVAA@  WUW(&)>>>x;;;]RRU#'$NJL !! [Z\ ~}$#   UTT)()==;???x/00]XUYHDI431=8=888"jhh .,,ljhllkZ^^>>>x!!!]trv }FEDGEE !pppNJK:79OQRqvv>>>x...]soq  hdf,*, PNQ?>? olnFCF(!"AAAx$$$]-*.khkrrp%&%}}okm/+-<<?VXW (&+?A>QPQ  /1-HDE774222x,,,]NMQ JJDJFG WVZYY[ cb_343 VVWdce MLP~MNJ-)('('x+++]IGH&#"&#$d`d  '&'pmntnu522***x***]dbdGECdab*&(GEFWVY631KHJ201 .-+{|xZWW$  GGGx$$$]GFF*+)4323/.MMLHGKoprhegege|{z''$ vxvXTZVVSyvx?=? NMO???x$$$]><>A@A++*TQQOOP./0;;<~~zc`c $!%vtojif&$#  ???x&&&]NKJ;76873[[ZYY[778FDDA>> [\\>?;yzvFB@:<>>x%%%]HGIFDC@>?/,-756yz{suw778634375wwtRPSKKK  &*%ptqROO**+DDDx'&&\UQR==<;99D@?1--(**nnn^a`;:7C?> ~~NLJvus200 pqq.-.x&%%YNJJTTS987544@@?0./ TWRrotKML+))# 445KINnlj\WV  &&( uCGDEMJISPP89:112@==754!#CDBMKKONOFGH10/350"!9:5zwxA;=\Z\ZWZ 886)))[ *LGKTPTIEH^Z\JFJ?=CJIKJHG986==;GEFHFEfdedegsst"""llhupq.++,,-000--,olkB??.@UPUZVXRONdaa\\\WVX\[[\Z[[XXYVUXWV```{{}]\\^\\ghgUUTggb644:7;=>A;::[ZY{{zFEEM +C=<=l;;:o??>p<<==p<<>XYWKJKqqq+7|{POQ0.2($"A==#"1/,>  !(((Pdce  fbd-*("*$# #!!AAAr%&EDEiIJK ysttvu## (&!+() }~LLL+)DCDn&(+ifj2/(/,' LLL-*JJJn TVR#62.-*&1+*=98b]]LLL.*IIIo2-,B>A "85-%$MHIXWYEB@|wuuroOJIYWWLLL.*IIIoKDCȾ)'( #820mij;:>WRSUUSbad_]`:9>>oppr  4-(+$!746)&'DHI   /0'""A=@ollidfZW[`edLLL.*))(o# & 2-'"TSTiijIDC0//-)%mljfei11.rqpFEEomn[[]kklLLL.*''&o--$64- xuvLLPdbb}}w&" &# A>BOOMC@@:87fefNPRLLL.***)o8:00.2xuu___ $#'$%#$ nmi{|{:87722/**.--dddLLL.*)('o934KIM  &$ PMO '&&~{~ijk,,'$# LLL.*! oQKO454975 " +*# vvvmjnEB>RRV))"\YXLLL.*<;=ba_PUQLLL.*FFFo}jkn@C> )* fbf)''MII% `]],+-YXVebasrp`dcLLL.*##$o//3$$# ' )%!~~HGFyww120% +%" tosmmk<;9dfeSVYLLL.*323o||{  ,*$/-0WWXjhfedf! *'! %$%aaa=;=;xyx  "(&!"!#pmq10-ooouwx\]]-+( IGGUVZ778.*))(o_]XDAC635rps^]\WWX *'"NKOD>DIMEwtuvqvTRR  poq,-,.**)(oJGGE>Bz{{:=; (&"  ~b]]{zxihk?;> dae .+)LKJ/10.*667oihkAAB-*.yz|#"$.' !&%& .-/rpryvxZWY(%(  MLO1.2 USPZVUBCA232.*89:oqpr))+zz{MLKVZV 0*% NLMMIPKJI}}rsvFIF   hffkjk752CC?677.*:::oqru=:?yxt543'' bfagfe2.. $$%`_b;<8qrooon[UW)$$;<8887.*888oURV+&) SSL644 &%)""}zuRVW  UUW)(+SSTxw|kkkHKF0/-5//'('.*666o|||,,,)&'$    LIKZWYB?=xuy>:=  ife{v|e`f:67!"".*667oyxzXWVtrpZVX"!$!"YVU;::zxx214YWSece*%%:::ZWY772qqmtorWPU)&"  iklNNM.*111o_^_2/0%%$fbc=89"""@=?hglnmlJHG  zyz&&'MKLtqrhhe=>8 TTT.****oCBB??> !10/;76@@>YYYbad??Cmkm 585}}~qqp340 &'&$%#``\rpo]X\+)*  QOQJJJ.*++,o;9<;::999%$$.*)pppqqr9:=;1,/427chj||HHK+,/QNShkhROM%$||A>CIID{c_]2.. ())KKK.*++,oFEHFED><1/0&%&Z[\|{~Z]_../ >7:QNR%)&xyu./1 0/0  ^daz{zSOOZ[ZOOO.*0./nKHI<;:;::><822#!$KMNLONdfanok  ihjzx},-*uwskmj544   ""LKL.)/--nZUUDCC101:88>;;C??655:;:}}}||~~_a`4530,+%!   $;:>MLK}zyXUU% "  Z[\YVZ  .&+++kB>>SSSGFE554655;::>==856#"".1,gie}|olqmloWXX232,)*,'(*'$  WWX mmjqmnB<<414'''+ "PC?@=;:MIHKHH222243887=;:<;:+,()+'QPOUSTGEGigiSSU45510.<>8Z]ZmimKMF`Z])## PLQEFD000t&7QMPNJL2.1C?BTQU6480,/>;>=;>;::32/))'664B@A><=PNNvtvnmoabcUVUEEE```879omj>>>QNQ =;;ba_JII D (-*-seafUQV858LHH_ZZD@E<9@GDGHGGJIHDBC<;;DBBGDDDB?IHGkjkSSUBCC+).888spp3.1+*)ZY[*'+!! aa`ssrgcc- ..+-o^Y\[XYHFEUQQggdZZZTTT\[[YWX\Z[_\\YUUZXX\]\`__zzzHFE444POPDEAllhfec784644GBG@AEQST444LLK~}}utsXXW3  (7! S999p333r887t<<;t777t777t777t888t:99t988t766t889t===t@@@tAAAtDDEtFFFtEEEtDDDt776t10/t***t120tGGEt<<>>p***\:+  "'*++++++++++++++++++++++++++++++++++++++++++++*(#   ??linthesia-0.4.2/graphics/trackbox.tga0000644000175000017500000006334011314377743016625 0ustar cletocleto  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?????????@@@@@@@@@@@@@@@???????????????@@@@@@@@@@@@@@@???????????????????????????@@@@@@@@@@@@@@@????????????>>>>>>>>>>>>>>>????????????@@@@@@@@@@@@@@@????????????>>>>>>>>>>>> === === === >>> >>>>>>>>>????????????@@@@@@@@@@@@@@@????????????>>>>>>>>>>>> === === === === === === === === === >>> >>>>>>>>>????????????@@@@@@@@@@@@@@@????????????>>>>>>>>> === === === <<<<<<<<<<<<<<<<<<<<< === === === === >>> >>>>>>????????????@@@@@@@@@@@@@@@ ?????????>>>>>>>>>=== === === <<<<<<<<<;;;;;;;;;;;;;;; <<<<<<<<<<<<=== === === >>>>>>????????????@@@@@@@@@@@@@@@ ?????????>>>>>>>>> === === <<<<<<;;;;;;;;;;;;:::::::::::::::;;; ;;;;;;<<<<<<<<<=== === >>>>>>????????????@@@@@@@@@@@@@@@????????????>>>>>> === === <<<<<<;;;;;;::::::::::::999999999::: :::::::::;;;;;;<<<<<<=== === >>>>>>?????????@@@@@@@@@@@@@@@ ?????????>>>>>>=== === <<<;;;9995888M777W777X777X777X777J8883999999::::::;;;;;;<<<<<<=== === >>>>>>?????????@@@@@@@@@@@@@@@?????????>>>=== === :::3777b555555555555v666^999+999:::;;;;;;<<<<<<=== >>> >>>?????????@@@@@@@@@@@@@@@?????????>>>>>>===777[555888LLL[[[```______̝___UUUEEE555 777X999:::;;;;;;<<<=== === >>>>>>?????????@@@@@@@@@@@@@@@ ?????????>>><<<666k555;;;```~~~~~~}}}}}}}}}|||{{{zzzqqqOOO666555666`999 :::;;;<<<<<<=== >>> >>>?????????@@@@@@@@@@@@@@@??????>>>===666o555HHH|||󃃃~~~|||{{{zzzhhh<<<555666_::::::;;;<<<=== === >>>?????????@@@@@@@@@@@@ @@@?????????>>>777_555KKK~~~|||{{{rrr;;;555777X:::;;;<<<=== === >>>>>>??????@@@@@@@@@@@@@@@?????????:::@555AAA}}}{{{lll777555999+;;;;;;<<<=== >>>>>>??????@@@@@@@@@@@@@@@?????????777g555rrrڅ}}}|||RRR555777_:::;;;<<<=== >>> >>>?????????@@@@@@@@@@@@@@@??????<<<*555III~~~www777555:::;;;<<<=== >>> >>>?????????@@@@@@@@@@@@@@@??????999J555hhhÓ~~~JJJ5559997;;;<<<=== >>> >>>?????????@@@@@@@@@@@@ @@@??????777g555昘]]]555777P;;;<<<=== === >>>?????????@@@@@@@@@@@@ @@@??????666v555hhh555777];;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555kkk555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555mmm555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555 rrr555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555 Ⲳvvv555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555ppp555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555 }}}|||{{{zzzyyyxxxwwwvvvvvvvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||fff555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555jjj555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555ώlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555͎lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555/~~~Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555~~~}}}}}}|||~~~Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555~~~}}}}}} ~~~Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555 ~~~~~~~~~ Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555)~~~Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555.}}}Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555 ~~~|||"Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555}}}Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555юlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555⎎lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555뎎lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555뎎lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555쎎lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555쎎lll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555 ~~~Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555 ~~~}}}~~~ Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555}}}~~~.~~~Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555 ~~~~~~ ~~~}}}~~~}}}|||~~~}}}}}}~~~}}}}}}~~~Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555~~~}}} ~~~}}}~~~ }}}~~~~~~~~~}}}~~~~~~Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555~~~}}} ~~~~~~~~~~~~Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555  ~~~Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555CΎlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????5553Ύlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555ώlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555ӎlll555666b;;;<<<=== === >>>?????????@@@@@@@@@@@@@@@??????555 lll555666b;;;<<<=== >>> >>>?????????@@@@@@@@@@@@@@@??????555lll555666a;;;<<<=== >>> >>>?????????@@@@@@@@@@@@@@@??????555 lll555666a;;;<<<=== >>> >>>??????@@@@@@@@@@@@@@@??????555 lll555666a<<<<<<=== >>>>>>??????@@@@@@@@@@@@@@@???555 lll555666a<<<=== === >>>?????????@@@@@@@@@@@@@@@???555lll555777`<<<=== >>> >>>?????????@@@@@@@@@@@@@@@???555lll555777`=== === >>>>>>?????????@@@@@@@@@@@@ @@@???555{555 mmm555777^=== >>> >>>?????????@@@@@@@@@@@@@@@ 777n555 fff555888R=== >>>>>>?????????@@@@@@@@@@@@@@@ 999T555ҲWWW555:::;>>> >>>????????????@@@@@@@@@@@@ @@@;;;6555bbb >>>555<<<>>>>>>?????????@@@@@@@@@@@@ @@@>>>555999򹹹 lll555777b>>>>>>?????????@@@@@@@@@@@@ @@@999T555eee ???555:::9>>>?????????@@@@@@@@@@@@ >>>666x555RRR555888^????????????@@@@@@@@@@@@ @@@<<<.555888 [[[555666s>>>?????????@@@@@@@@@@@@@@@999N555jjj KKK555555{===??????@@@@@@@@@@@@<<<1555{555<<>>??????@@@@@@@@@@@@>>>999V555555555666q:::H???@@@@@@@@@@@@>>>:::=888[666v555555555777n999Q;;;3??? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TRUEVISION-XFILE.linthesia-0.4.2/graphics/play_KeyRail.tga0000644000175000017500000000104511314377743017367 0ustar cletocleto  *)****)**)))*)*)***))*****))**)*))*****)*).././..././......//////../././..//...///./../454455454544444554545454545544545:;;;;;:::;;;;:;;;;BBBBABBBBJIIIIIJIIIIIIIJIIIPPQPQQPPPPQQPPPQPPPPPPPQPPPVWWVWVVWWWWVWVVVWVWWWVVWVWWWWWVVWWWVVVVVWVWVW\]]\]\\\]\]]]]]]\\]]]\]]]\]\\]]]\\\\]\]]]]aabbaaaaaaba aaabaabbbabbaaaabbaabbbbaaaaab&&&&&&TRUEVISION-XFILE.linthesia-0.4.2/graphics/tracks_PlaySong.tga0000644000175000017500000002746411314377743020122 0ustar cletocleto @                     6 N W X Y Y K4  3bv_- [%%%///222̗222+++  Y  k222FFFHHHGGGGGGFFFEEE???(((a"  o"""EEEJJJIIIIIIHHHGGGFFFEEE 888` _$$$KKKKKKJJJKKKJJJKKKJJJIIIHHHGGGFFFEEE??? Y  ?JJJMMMLLLKKKLLLMMMLLLKKKJJJKKKLLLMMMLLLKKKIIIHHHFFFEEE;;;, g>>>څNNNOOONNNMMMLLLKKKLLLMMMNNNOOONNNMMMLLLKKKJJJKKKLLLMMMNNNOOONNNMMMLLLJJJHHHGGGFFF)))` ("""PPPOOOPPPOOONNNLLLKKKJJJKKKMMMNNNOOOPPPNNNMMMKKKIIIHHHIIIJJJKKKLLLMMMNNNOOOPPPOOONNNMMMLLLJJJHHHGGGBBB  I666RRRQQQPPPOOONNNLLLKKKIIIJJJLLLMMMOOOPPPOOONNNLLLIIIHHHGGGHHHIIIJJJKKKMMMNNNOOOPPPOOOMMMLLLJJJHHHGGG$$$8 gHHHTTTSSSQQQPPP{{{iiiJJJKKKMMMOOOPPPOOONNNTTTwwwHHHIIIKKKMMMOOOPPPOOONNNMMMKKKIIIHHH111 P vQQQUUUTTTSSSQQQPPPOOOPPPOOOdddJJJKKKMMMNNNOOOPPPOOOPPPOOOMMMfff~~~___HHHJJJMMMNNNPPPOOONNNLLLJJJIII777^ XXXVVVUUUSSSQQQPPPOOONNNOOOPPPOOONNNzzzJJJLLLMMMOOOPPPOOONNNOOOPPPOOONNNOOONNNMMMGGGFFFGGGnnnHHHJJJMMMNNNPPPOOONNNMMMKKKIII:::b XXXWWWUUUSSSQQQPPPOOONNNMMMLLLMMMNNNOOOPPPOOOMMMLLLMMMLLLMMMYYYIIIJJJLLLNNNOOOPPPOOONNNMMMLLLMMMNNNOOONNNMMMNNNOOONNNMMMLLLGGGEEEDDDEEEFFFgggKKKMMMOOOPPPOOONNNMMMKKKJJJ:::b YYYXXXUUUSSSRRRQQQPPP OOONNNMMMKKKIIIHHHIIIKKKMMMNNNOOOPPPOOONNNLLLJJJIIIJJJIIIKKKLLLyyyHHHIIIKKKMMMOOOPPPOOONNNLLLKKKJJJKKKLLLMMMLLLKKKLLLMMMLLLKKKJJJKKKLLLKKKJJJ YYYTTTcccdddeeexxxMMMNNNOOOPPPOOONNNMMMLLLJJJ:::b YYYXXXUUUSSSRRRQQQPPP NNNLLLIIIGGGFFFHHHJJJMMMNNNOOOPPPOOOMMMKKKHHHGGGHHHGGGFFF GGGHHHJJJKKKRRROOOGGGIIILLLNNNPPPNNNMMMKKKIIIHHHIIIJJJIIIJJJKKKJJJIIIHHHIIIJJJKKKIIIHHHIIIJJJIIIHHHGGGHHHXXXTTTNNNOOOPPPOOONNNMMMLLLJJJ:::b YYYXXXVVVSSSRRRQQQPPP]]]nnneeeiiiMMMOOOPPPOOOccciiigggeeefff___HHHwwwnnnEEEMMM]]]HHHJJJKKKJJJuuuFFFHHHKKKNNNOOOPPPOOONNNTTTaaaXXXhhhiiiIIIHHHGGGWWWooopppJJJIIIHHHOOOfff___JJJiiihhhfff___HHHnnngggKKKMMMNNNOOOPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP VVVyyy}}}XXXLLLNNNOOOPPPOOOzzz nnngggJJJQQQFFFHHHKKKMMMOOOPPPOOONNNkkk___FFFEEEMMMHHHXXXwwwJJJ fffGGGMMMEEEGGGHHHJJJMMMNNNOOOPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMuuuFFFHHHKKKMMMNNNOOONNNyyyFFFHHHpppHHHNNNMMMHHHIIIJJJwwwuuuHHHJJJMMMNNNOOOPPPOOOkkkTTTMMMNNNMMMLLLeeeDDD\\\___JJJLLLTTTFFFGGGOOOIIIKKKfffFFFGGGnnnHHHIIIKKKMMMOOOPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMeeeFFFHHHJJJLLLMMMNNNMMMTTTGGGIIIaaaJJJHHHEEEHHHIII ^^^HHHJJJLLLMMMNNNOOOPPPOOOzzzNNNMMMJJJHHHDDDHHHKKKMMMLLLnnnFFFGGGFFFHHHJJJfffGGGOOOGGGIIILLLNNNPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMeeeEEEGGGHHHJJJKKKMMM KKKGGGIIIKKKcccEEEGGGHHHGGGwwwJJJLLLMMMOOOPPPVVVNNNMMMKKKIIIHHHNNNEEEVVVHHHJJJLLLKKK___GGGFFFHHHIIIfffGGGWWWXXXIIIHHHFFFHHHKKKMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMeeeFFFGGGIIIHHHIIIKKKJJJGGGIIIKKKLLLIIIHHHFFFHHH ggg}}}HHHQQQJJJIIIKKKMMMNNNPPP OOONNNMMMLLLJJJHHHGGGEEE}}}HHHHHHJJJIIIgggHHHEEEGGGHHHfffHHHwwwXXXIIIHHHvvv]]]GGGJJJMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMQQQGGGHHHJJJHHHIIIKKKLLLJJJHHHfffHHH ___IIIJJJxxxIIIKKKMMMNNNOOOPPPOOOMMMKKKIIIGGGEEE}}}wwwKKKIIIHHHIIIFFFGGGHHHgggIIIxxxJJJIIIHHH~~~eeeGGGJJJMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP#OOOMMM}}}___```yyy~~~FFFGGGHHHIIIHHHJJJLLLJJJIIIIIIJJJRRRIIIJJJKKKbbbKKK MMMNNNOOOPPPOOONNNLLLIIIGGGMMMLLLMMMrrrjjjJJJIIIXXXaaaLLLKKK___HHHIIIHHHiiiKKKTTTrrrKKKJJJHHH___IIIKKKMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP OOOMMMfffHHHJJJMMMTTT}}}FFFHHHHHHJJJLLLjjjLLLTTT[[[MMMTTTNNNOOOPPPOOOMMMKKKOOOMMMNNN cccLLLrrrMMM\\\ TTTMMMNNNzzz\\\LLLMMMNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMfffHHHKKKMMMSSSEEEGGGHHH HHHJJJLLLNNNlllcccNNNlllzzzNNNzzz]]]OOOPPPOOOMMMRRRyyyMMMNNNOOOtttkkkNNNOOO VVVMMMkkkkkkNNNOOO{{{zzzNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOLLLeeeGGGJJJLLLIII^^^HHHGGGIIILLLNNNPPPOOOPPPOOOMMMfffIIILLLMMMNNNOOOPPPOOOPPPOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNLLLdddFFFIIIJJJHHHnnnHHHFFFIIILLLNNNPPP OOOMMMWWWHHHJJJLLLMMMLLLKKKLLLMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNKKKeeeFFFHHHIIIXXXQQQJJJIIIFFFIIILLLNNNPPPOOONNNIIIJJJKKKJJJ```XXXKKKMMMNNNPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNLLLfffGGGHHHIIILLLJJJGGGIIILLLOOOPPPOOOSSSJJJKKKJJJIIIhhhKKKMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP OOONNNMMMhhhIIIJJJRRRMMMcccIIIKKKMMMOOOPPPOOOeeeLLLiiiMMMNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPlllrrrNNNOOOtttLLLMMMNNNOOOPPPOOOeeekkkNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVTTTRRRQQQPPP^^^lll]]]NNNOOOPPPOOOVVVlllNNNOOOPPPOOOVVVlllNNNVVVOOOPPPOOO MMMLLLJJJ:::a ZZZXXXVVVTTTRRRQQQPPPVVVOOOPPPOOO MMMLLLJJJ:::a ZZZYYYWWWTTTRRRQQQPPPPPPOOO MMMLLLKKK:::a [[[ZZZXXXUUUSSSQQQPPPPPPOOO MMMLLLKKK:::` {ZZZ[[[XXXUUUSSSQQQPPPPPPOOO NNNLLLKKK:::^ nSSS\\\ZZZWWWTTTRRRQQQPPPPPP OOONNNMMMLLL666 R SDDD^^^\\\YYYVVVSSSQQQPPPPPPOOONNNMMM,,, ; 5///```^^^\\\XXXUUUSSSRRRQQQPPPPPPQQQPPP OOONNNMMM YYY```^^^\\\XXXVVVTTTSSSRRRQQQQQQRRRQQQPPPOOO:::bT000cccbbb___\\\ZZZXXXUUUTTTSSSSSSTTTSSSQQQMMM 9 xCCCdddccc```^^^\\\ZZZXXXWWWWWWUUUSSS'''] -FFFeeecccbbb```^^^]]]\\\[[[[[[ZZZYYYXXXTTT---r N333]]]eeecccbbbaaa```______^^^\\\[[[KKK"""{0{555NNN]]]cccbbbbbbaaa```UUUCCC***eVq G <[vn P2TRUEVISION-XFILE.linthesia-0.4.2/graphics/linthesia.xpm0000644000175000017500000002367111316475030017012 0ustar cletocleto/* XPM */ static char * linthesia_xpm[] = { "32 32 496 2", " c None", ". c #3B373B", "+ c #5B585C", "@ c #606064", "# c #616061", "$ c #605D5F", "% c #575759", "& c #535456", "* c #515154", "= c #777777", "- c #ADACAA", "; c #9C9999", "> c #888788", ", c #8C8C8C", "' c #7D7D7E", ") c #5A5C5C", "! c #585A5C", "~ c #343434", "{ c #5F5E5C", "] c #D9D8D8", "^ c #FFFFFF", "/ c #FDFDFD", "( c #F9F8F9", "_ c #A09E9F", ": c #454546", "< c #505051", "[ c #232325", "} c #504F52", "| c #5A595C", "1 c #525152", "2 c #484548", "3 c #38393A", "4 c #3D4040", "5 c #4E4D4F", "6 c #716F72", "7 c #7D7C7C", "8 c #505050", "9 c #464745", "0 c #E1E1E0", "a c #FAF9F9", "b c #757374", "c c #444546", "d c #535356", "e c #18171A", "f c #131313", "g c #858485", "h c #F8F7F7", "i c #FCFDFC", "j c #C2C0C1", "k c #3D3B3E", "l c #202123", "m c #4B4C4C", "n c #38383A", "o c #252627", "p c #404342", "q c #7D7D7C", "r c #8C8788", "s c #898787", "t c #29292A", "u c #121316", "v c #0E1113", "w c #151516", "x c #ACA9A9", "y c #9B9899", "z c #393939", "A c #444548", "B c #2C2C31", "C c #000000", "D c #2C2B2B", "E c #C9C9C8", "F c #F3F3F4", "G c #EAE9E9", "H c #555456", "I c #403F41", "J c #312F32", "K c #545453", "L c #8F8C8C", "M c #9C9799", "N c #908D8B", "O c #434241", "P c #1D1D20", "Q c #313133", "R c #4A4C4C", "S c #101113", "T c #5F5F60", "U c #F9F9F9", "V c #D2D1D1", "W c #4B4B4D", "X c #343634", "Y c #444648", "Z c #818180", "` c #F4F4F4", " . c #F3F3F3", ".. c #D6D6D6", "+. c #4C4D4F", "@. c #37393C", "#. c #615E5D", "$. c #9B9796", "%. c #969393", "&. c #7E7B7C", "*. c #484645", "=. c #9A9999", "-. c #EEEEEE", ";. c #CBC8C9", ">. c #484545", ",. c #484A4B", "'. c #3E4043", "). c #1E1D1E", "!. c #BFBEBE", "~. c #666464", "{. c #262827", "]. c #4B4F51", "^. c #212124", "/. c #373837", "(. c #D7D7D6", "_. c #F2F2F2", ":. c #424244", "<. c #2E3031", "[. c #3D3E40", "}. c #908D8E", "|. c #888685", "1. c #454443", "2. c #A5A4A4", "3. c #E5E3E4", "4. c #5A595B", "5. c #3B3F40", "6. c #545458", "7. c #787676", "8. c #9E9C9D", "9. c #2B2A2B", "0. c #434649", "a. c #4A4D4F", "b. c #939391", "c. c #434344", "d. c #3F3F41", "e. c #202225", "f. c #2D2E2E", "g. c #4A4747", "h. c #CAC9C9", "i. c #F8F8F7", "j. c #787878", "k. c #353534", "l. c #555858", "m. c #232426", "n. c #353635", "o. c #DBDBDA", "p. c #DAD7D9", "q. c #424142", "r. c #313233", "s. c #5C5C5E", "t. c #121617", "u. c #4B4A4B", "v. c #C5C5C4", "w. c #8D8C8D", "x. c #666667", "y. c #131215", "z. c #0D0E12", "A. c #0F1013", "B. c #353434", "C. c #C9C7C7", "D. c #FFFEFE", "E. c #F7F3F5", "F. c #A7A6A7", "G. c #313033", "H. c #4C4D50", "I. c #4A484D", "J. c #969696", "K. c #6F6D6F", "L. c #58575A", "M. c #3E3E41", "N. c #1E1F1E", "O. c #ACA8A7", "P. c #575353", "Q. c #050408", "R. c #252628", "S. c #424547", "T. c #979394", "U. c #F5F4F4", "V. c #F7F6F7", "W. c #FBFCFB", "X. c #D8D6D7", "Y. c #424144", "Z. c #3A3A3A", "`. c #606160", " + c #08090B", ".+ c #565656", "++ c #FCFCFC", "@+ c #A3A2A3", "#+ c #2D2B2C", "$+ c #464646", "%+ c #515455", "&+ c #161619", "*+ c #747171", "=+ c #A9A9A8", "-+ c #D7D9DA", ";+ c #484647", ">+ c #535455", ",+ c #101418", "'+ c #585758", ")+ c #F2F1F2", "!+ c #F8F6F7", "~+ c #FDFBFC", "{+ c #666365", "]+ c #2F2E2F", "^+ c #656565", "/+ c #313336", "(+ c #C7C5C5", "_+ c #444344", ":+ c #232326", "<+ c #454849", "[+ c #464647", "}+ c #CAC9CA", "|+ c #B2AFB3", "1+ c #504C4E", "2+ c #585855", "3+ c #313738", "4+ c #1E1F21", "5+ c #C5C2C4", "6+ c #FFFDFE", "7+ c #F9F8F8", "8+ c #969395", "9+ c #28262A", "0+ c #565658", "a+ c #575558", "b+ c #868484", "c+ c #6F6E70", "d+ c #191A1B", "e+ c #1C1C1C", "f+ c #0C0C0C", "g+ c #868487", "h+ c #D7D7D7", "i+ c #525053", "j+ c #525051", "k+ c #4E5153", "l+ c #8D8B8E", "m+ c #F7F7F6", "n+ c #CDCBCC", "o+ c #343435", "p+ c #3E3D3D", "q+ c #68686A", "r+ c #18191C", "s+ c #6A6D6D", "t+ c #A6A4A5", "u+ c #605F63", "v+ c #15191C", "w+ c #5C5B5C", "x+ c #636062", "y+ c #4A4749", "z+ c #626163", "A+ c #070D0E", "B+ c #555356", "C+ c #F9F7F8", "D+ c #F7F7F7", "E+ c #FCFBFB", "F+ c #F1F0F0", "G+ c #595758", "H+ c #2C2A2D", "I+ c #6A686B", "J+ c #2F2E32", "K+ c #2D2E2D", "L+ c #EAEAE9", "M+ c #726E71", "N+ c #5A5D5A", "O+ c #262A2D", "P+ c #2D2C2E", "Q+ c #D3D0D2", "R+ c #7E7E7E", "S+ c #3D3B3D", "T+ c #646566", "U+ c #2D2F33", "V+ c #CBCBCC", "W+ c #FEFEFD", "X+ c #FBFAFA", "Y+ c #838384", "Z+ c #222224", "`+ c #4C4C4E", " @ c #545553", ".@ c #B5B5B2", "+@ c #D3D3D3", "@@ c #D8D6D8", "#@ c #595856", "$@ c #505152", "%@ c #414346", "&@ c #050507", "*@ c #9E9EA0", "=@ c #605F61", "-@ c #484B4C", ";@ c #929193", ">@ c #F7F5F6", ",@ c #FAFAFA", "'@ c #C1C1C1", ")@ c #1D1C1E", "!@ c #3D3D3E", "~@ c #E6E5E4", "{@ c #F3F3F2", "]@ c #D5D6D6", "^@ c #EBEAEB", "/@ c #575957", "(@ c #000001", "_@ c #737174", ":@ c #CECDCD", "<@ c #3B3A3B", "[@ c #606363", "}@ c #010507", "|@ c #5A595A", "1@ c #F9F9FA", "2@ c #F7F6F6", "3@ c #FBFBFA", "4@ c #E9E9E9", "5@ c #D5D5D5", "6@ c #FDFCFD", "7@ c #696869", "8@ c #444340", "9@ c #676769", "0@ c #13191B", "a@ c #434145", "b@ c #EEEDEE", "c@ c #525153", "d@ c #404040", "e@ c #6D6F6F", "f@ c #1D2122", "g@ c #2E2F31", "h@ c #DEDFE0", "i@ c #F6F5F6", "j@ c #F6F6F6", "k@ c #ECECEC", "l@ c #646366", "m@ c #F6F5F5", "n@ c #828183", "o@ c #3D393A", "p@ c #2C3032", "q@ c #1D1E1F", "r@ c #C5C3C5", "s@ c #706F70", "t@ c #302F31", "u@ c #747273", "v@ c #424546", "w@ c #0F1113", "x@ c #E2E1E2", "y@ c #FEFEFE", "z@ c #F6F6F5", "A@ c #FAFAF9", "B@ c #EEEFEE", "C@ c #323137", "D@ c #A19FA0", "E@ c #353234", "F@ c #44494B", "G@ c #969496", "H@ c #9B979A", "I@ c #2B292C", "J@ c #686A69", "K@ c #58595D", "L@ c #141315", "M@ c #989796", "N@ c #F8F8F8", "O@ c #EEEDED", "P@ c #474C4D", "Q@ c #101218", "R@ c #B9B6B8", "S@ c #C5C4C4", "T@ c #353637", "U@ c #5F5F63", "V@ c #5D5D5E", "W@ c #656467", "X@ c #C4C3C3", "Y@ c #2F2F30", "Z@ c #414143", "`@ c #646467", " # c #636261", ".# c #EEEEEC", "+# c #FCFCFB", "@# c #F5F5F5", "## c #FDFDFC", "$# c #F2F1F1", "%# c #7E7D7D", "&# c #525455", "*# c #00010A", "=# c #939296", "-# c #DFDFDE", ";# c #3D3A3B", "># c #514F50", ",# c #717373", "'# c #111315", ")# c #3D3D40", "!# c #E8E8E8", "~# c #4F4D4F", "{# c #0C0E0F", "]# c #888986", "^# c #F9F8F7", "/# c #F4F4F3", "(# c #F0F0EF", "_# c #7C7779", ":# c #666564", "<# c #616363", "[# c #000107", "}# c #6C6A6D", "|# c #FCFAFA", "1# c #5A5959", "2# c #434243", "3# c #827F81", "4# c #292E2F", "5# c #1F1F22", "6# c #E5E6E6", "7# c #949392", "8# c #E7E6E7", "9# c #FCFCFD", "0# c #FAFAF8", "a# c #6C6B6D", "b# c #595559", "c# c #6A6C6C", "d# c #070C10", "e# c #434245", "f# c #F0F0F0", "g# c #727272", "h# c #28282B", "i# c #7E7A7C", "j# c #424345", "k# c #929293", "l# c #F2F0F1", "m# c #747473", "n# c #4E4B4F", "o# c #727277", "p# c #1C1E22", "q# c #272B2F", "r# c #D3D3D4", "s# c #919090", "t# c #2B282B", "u# c #565659", "v# c #606365", "w# c #595557", "x# c #D9D7D8", "y# c #EDEDED", "z# c #898687", "A# c #413D3F", "B# c #7C7A7B", "C# c #36393C", "D# c #101318", "E# c #AFB0B2", "F# c #BCBBBB", "G# c #2A292B", "H# c #242428", "I# c #595A5A", "J# c #EFEFEF", "K# c #F3F0F1", "L# c #F5F3F4", "M# c #EBEBEB", "N# c #D4D4D4", "O# c #F3F1F2", "P# c #A6A3A2", "Q# c #3A3A3C", "R# c #7F7C7F", "S# c #494C4D", "T# c #98989B", "U# c #E0DDDD", "V# c #4D4B4A", "W# c #D2D2D1", "X# c #FEFBFB", "Y# c #F7F8F7", "Z# c #F2F0F0", "`# c #E6E6E6", " $ c #CACBCB", ".$ c #EFEDEE", "+$ c #DCD9DA", "@$ c #E5E4E4", "#$ c #B3B2B2", "$$ c #383536", "%$ c #6C6A6A", "&$ c #4D4D4E", "*$ c #06070B", "=$ c #0A0C0F", "-$ c #C8C8C9", ";$ c #DFDDDE", ">$ c #E3E2E2", ",$ c #E5E5E5", "'$ c #E1E1E1", ")$ c #E2E2E2", "!$ c #DEDDDE", "~$ c #D6D5D4", "{$ c #CCCBCC", "]$ c #B7B7B7", "^$ c #BFBDBE", "/$ c #ABA9AA", "($ c #B3B3B3", "_$ c #A1A09F", ":$ c #353333", "<$ c #535053", "[$ c #404041", "}$ c #252727", "|$ c #AEADAF", "1$ c #B3B1B2", "2$ c #ADABAB", "3$ c #B2B2B2", "4$ c #B2B3B3", "5$ c #AEAEAE", "6$ c #A4A1A2", "7$ c #757575", " ", " ", " . + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ ^ / ^ ( _ : < [ ", " } | 1 2 3 4 5 6 7 8 9 0 ^ a b c d e f g ^ ^ h i ^ j k l ", " & m n o p q r s t u v w x ^ ^ y z A B C D E ^ ^ F ^ G H ", " } I J K L M N O P Q R S C T U ^ V W X Y C C Z ^ ^ ` ... ", " +.@.#.$.%.&.*.=.-.;.>.,.'.C ).!.^ ^ ~.{.].^.C /.(.^ _... ", " :.<.[.}.|.1.2.^ ^ ^ 3.4.5.6.C C 7.^ ^ 8.9.0.a.C C b. ... ", " c.d.e.f.g.h.^ / i.a ^ ^ j.k.l.m.C n.o.^ p.q.r.s.t.C u.v. ", " w.x.y.z.A.B.C.^ D.E.h ^ ^ F.G.H.I.C C J.^ ^ K.o L.M.C N. ", " O.P.Q.R.S.C C T.^ ^ U.V.W.^ X.Y.Z.`. +C .+++^ @+#+$+%+&+ ", " *+=+-+_ ;+>+,+C '+)+^ h !+U ^ ~+{+]+^+/+C ).(+^ 0 _+:+<+ ", " [+}+^ ^ |+1+2+3+C 4+5+^ 6+!+7+^ ^ 8+9+0+a+C C b+^ ^ c+d+ ", " e+f+g+^ ^ h+i+j+k+C C l+^ ^ m+7+D.^ n+o+p+q+r+C s+^ .t+ ", " u+v+C w+( ^ )+x+y+z+A+C B+_.^ C+D+E+^ F+G+H+I+J+K+L+ ... ", " M+N+O+C P+Q+^ ^ R+S+T+U+C [ V+^ W+h X+^ ^ Y+Z+`+ @.@ .+@ ", " @@#@$@%@C &@*@^ ^ 2.n =@-@C C ;@^ ^ >@,@D.^ '@)@!@~@{@]@ ", " ^ ^@B+u./@(@C _@^ ^ :@<@< [@}@C |@1@^ 2@X+3@^ ] !.^ 4@5@ ", " ^ ^ 6@7@8@9@0@C a@^@^ b@c@d@e@f@C g@h@^ i@X+a ^ ^ j@k@+@ ", " l@m@^ ^ n@o@6 p@C q@r@^ ^ s@t@u@v@C w@x@y@z@A@++h D+B@.. ", " e+C@] ^ ^ D@E@K.F@C C G@^ ^ H@I@J@K@L@M@^ W+m+N@/ ,@O@.. ", " P@f+Q@R@^ ^ S@T@U@V@C C W@^ ^ X@Y@Z@`@ #.#^ +#2@@###$#5@ ", " %#&#C *#=#^ ^ -#;#>#,#'#C )#b@^ !#~#{#]#W+++3@E+^#/#(#.. ", " _#:#<#[#C }#^ ^ |#1#2#3#4#C 5#6#^ ^ 7#8#9###a a X+N@4@+@ ", " 0#a#b#c#d#C e#f#^ ^ g#h#i#j#C k#^ ^ ^ ^ l#X+++D+N@N@-.+@ ", " ^ ^ m#n#o#p#C q#r#^ ^ s#t#u#v#w#x#^ 3@+#a $#!+++D+j@y#.. ", " ^ ^ ^ z#A#B#C#C D#E#^ ^ F#G#H#I#J#^ a a ,@U K#L#+#N@M#N# ", " O#^ y@^ P#Q#R#S#C C T#^ ^ U#V#W#X#++++7+N@Y#U K#Z#N@`# $ ", " .$+$@$`#`##$$$%$&$*$=$-$`#`#`#`#;$] >$,$'$'$'$)$!$~${$]$ ", " , ^$/$($($($_$:$<$[$}$1#|$($($($($1$2$#$($3$3$3$4$5$6$7$ ", " ", " "}; linthesia-0.4.2/graphics/play_NotesWhiteColor.tga0000644000175000017500000014436211314377743021131 0ustar cletocleto  000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000543 @<83?;73?:63>:53>953>943=833<73-000253 4A:33@932@831?730?73/?63.?63.=5-000245 5=C34?-000424 >8=3=6;3<6;3<5;3<5:3<4:3;4:3;3:3;393928-000 225 77B366A365@355@354@344@343@333@332@322@321>-000111 44433333332332232223221321131113111-000000 ///3//.3/..3...3..-3---3...-000000;97|m^zfs^q[nXlUkRiOgMfKdJ~bGv[BhQ;K@5x1100005<8MeNoHhEfAc=`:^7[3Y0X-W)T$~N qF'O:x0100005:=OrRLyIxFvBs?r;p8o5n2m/k*d#Y{)CUx0110006==X]WTQMJHEB@<70t{/QUx011000:7:t\qb~}\w|YtzVrySpwPnvMltKksHksGjpChg>a[7WE3Bx10100077=YY`_YWWUTRQNNKKHHEFDDA@>;932u10Qx001000444KJJMLKIHGGGEFDCDCBCA@A?>?>=>=;=;::995540//0//x0000002226553220/./...---,+,+*+****()((((''&&$##! (((x000000000433̿~yuqokigbvU{_DSE8000243flȗiǕfʔbʑ]ȍXljRƆNłIŀD~@|3(h)J`000245v|{xsojgb_[WQE61[`000433}̱{wrokheb\O~l?fL5I000224yŷ~~||yyutppkkhhcdaa]]ZWTJH:933\000222bbbhggfedhfefecda`a`^`][]ZYZYWYWUWUSTSRONNEDC766111000111CCCDDDDCB CBBBA@A?>?><=<;<;:::9:98876544.--$$$)((000000xlbfĨܽۻ۸ڶٲׯլԩӦ}ѤyѢwСuΞsk}YbF642000T|hf|ytoic]ߗXޓRސMݎH݌Dދ?ۈ8Ё-l"U/73000Vpf~{vqke`[VQMH@5(l058000\~f}xtokgc_WG7188000r`pfѢ̛ʗɓȏŋÆ}yuroldSnAj515000^^f~~yyuupqmmijffc][MK;;118000QQQf}}}xwvvutvtssrpqnlnljligifdfdbdb`b`^`^]]\[WVUHGG998111000???fQQQONNNMLMLKLKJJIHIGFGFDEDCDCABA@A@?@?>>==:99000&%%///000000~ȯ޽ܹڶٲׯլԩӦ}ѤyѢwСuРt͟rfrRH@8B000kztoic]ߗXޓRސMݎH݌Dދ@ފ<݉3|'c-L?>>>==777,++...B000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsjzWMC:K000tztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ5с)j-Q?K000w{vqke`[VQMIE?1/GWK000}xtokgc`]UC4SWK000իР̙ʔȏŋÆ}yuromkcPH8FK000~~yyuupqmmijfgddb[ZII66TK000ooo~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[VUUFFE555K000PPP\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==999/..///K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk|YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZJJ66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGF555K000QQQ\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʱ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000ʲ¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YND:K000uztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-R?K000x{vqke`[VQMIE?2/GXK000}xtokgc`]VE4TXK000֬Р̙ʔȏŋÆ}yuromkdRH8GK000~~yyuupqmmijfgddb\ZKK66UK000qqq~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR\\\SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000˳¥޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠsÖk}YOD;K000vztoic]ߗXޓRސMݎH݌Dދ@ފ<ߊ6ӂ*l-S@K000y{vqke`[VQMIE?2/HYK000}xtokgc`]VE5UYK000֮Ѡ̙ʔȏŋÆ}yuromkdRI9HK000~~yyuupqmmijfgddb\ZKK66UK000rrr~}|wvuvtssrpqnlnljligifdfdbdb`b`^`^]^]\]\[WVVGGG555K000RRR^^^SRRONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==9990/////K000000Ͷç޽ܹڶٲׯլԩӦ}ѤyѢwСuРtϠtėl\ND;E000u{toic]ߗXޓRސMݎH݌Dދ@ފ=ߊ6Ճ,o.R@E000x{vqke`[VQMIF@40HXE000}xtokgc`^VG5TXE000رѢ̙ʔȏŋÆ}yuromleUI9GE000~~yyuupqmmijfgdec][MM77UE000 qqqxwvvtssrpqnlnljligifdfdbdb`b`^`^]^]\WVVJJI666E000SSSbbbUUUONMMLKLKJJIHIGFGFDEDCDCABA@A@?@?>?>>>==:::100///E000000zqrҽȮ߿ܹڶٲׯլԩӦ}ѤyѢwСuРuСu˜pc?:6000evr~uoic]ߗXޓRސMݎH݌DދAފ?8܇/x0A8000g}r|vqke`[VQMJHB81?>>@??<<<544000000000 987 ĴҽȮݼܸڶسذ׭իժԩԪҥ{uY000697 ܼ{upjf`\WTRPE3g00068: }wrmid_\ZXO:00069: {wtponeH000878 ̲ݹժП͙ʕȐŋȄ~{{zsS}000779 ᵵ|}yyuwsustrljMM000666 ᠟~|}zxzxvxutusqsqoqomomknlkmlknmlfeeJJI000 333 nnnnmma`_XWVUTSSRQRPOPONNNMNMKLKJKJIJIHJIIEEE877000000OLI*̻ϸʱǭũ¥߾ݽݻݺݹڶ}f643 000EPJ*еҪ}zwsjHr163 000FMR*Ү}zqM157 000GQR*ҸZ277 000MHM*ë޾ڵ׮իӧѣРΝ͚̘˖ɔǎb525 000HHQ*һ]\227 000DDD*ҨZZZ222 000<<<*nmmutsnmljiihgffededbcbaba```_`_^_^]^]]YXXBBB111 000000 SOL0xogcypgfyoefxndfxmbfxlbfwlafwk`fwj_fvj^fj^UTFA=!000 GTM0^zkc^|kf\{jfZ{ifXzhfWzffVzffTzefSzefQzdfImZT8H?!000 HPV0`r~c_sf^rf\qfZpfYpfXofVofUnfTnfKbrT9CJ!000 JUV0d|~cd}fb}fa|f`|f^|f]|f\|f[|fZ|fPorT;IJ!000 QKP0tfqctfrftdpfscpfrbofranfq`mfq_mfp^mfp]lfdSaTD@3*3):<-000212 625351434033302-000005 //A3..@3.-@3-->-000111 333322232213111-000000 ///3...3...-000000 852gM9rO3lI.jF*gC'`="U6A2'x100000 084-cG#mFg@d<b:Z4P.?.x010000 06=&UYTQ N H?x7Sx/01000 0:;&s{{y w ozblHMx/11000 645RCOWBRQ=><;<;:876/..%$$))(000000 gTEf]}UzOvJrDo@j;b4Q*f@!41/000 :ePfBx;p5l0g+b%_ ZS{D a6-41000 6Zf4-("} t`K-28000 6qxf4-(" x-67000 XMVfqie~az\v|XrxSonLg[>UF0C202000 DD|f\[UTPNLJGDB?<:53*) //7000 PPPf{{zutsrqoomkkhfgebb`^ZXWIHG998111000 >>>fOOOLKKIIHHGFFDCDCBA@?<;:100&&%///000000 kWiY{PvJrDo@k'@3B000 BsD2("~ {nX$9OB000 BD2(" $FJB000 pan{nfaz\v|XryTpuPmhGbR7N817B000 VVhgYXQOLJGDB?=;970/%$,,MB000 eeeyxwsrpomkkhfgebca__]\TSRAAA444B000 IIIUUUNMMJJIHGFFDCDCBBA@??>877,,+...B000000 u_m[{PvJrDo@k:99//.///K000000 uan[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 van[{PvJrDo@k:9900////K000000 vao[{PvJrDo@k:9900////K000000 wbq[{PvJrDo@k:9900////K000000 vc˜w_|QvJrDo@kW;39E000 bbvu_^RPLJGDB?=;:831)(--TE000 mmm}|{tsqomkkhfgebca_a_^XWVJJI666E000 NNN[[[QPPJJIHGFFDCDCBBA@@?>;::110///E000000 ufYrɣlUwKrDo@l=k;e5Y.;40000 PtbrqęU@000 i_gr~jb{\v|XrzUqxTprMkcC^625000 YYrlkVTMKGDB?><<:53,,//B000 ```rvuspnlkhfgebdb`b`_[ZYOON333000 HHHrbbbWVVLLKHGFFDCDCBBA@AA@=<<554000000000 765 ɤn]~T{PyNxLqCxQ3000 475 ztĚXFw=p8m5j1j%bsG000 369 rjL90)&#^000 389 rjL90)&#000 656 ᫕rjf~d}c}}ZvYAU000 449 ᆆnm_]WTRPOMMKCA11000 555 ᖕ{zxusqqolomkmkjedcJJI000 333 ccccbbWWWQPOMKJKJIJIHIHGCBB887000000 KEA*ͫȠÙxtpg`G421 000 >JD*{ɢp–fa[P6|X042 000 =GQ*tvf[UPD.j/37 000 =MO*tvf[UPD./56 000 FCF*ҲzfSc312 000 AAP*ҐzxvtqohfGE117 000 CCC*Ҝ~|{XWW222 000 :::*aaaggfa`_\[Z[ZYXWVSSRA@@111 000000NHB0m_Tcm^Rfl]Pf`SHTB<7!000?MF0Nk[cLkZfIjXfA^OT4A:!000>IU0Jc}cHcfEa~f>WqT3>I!000>QS0JswcHtxfEsxf>gkT3EG!000IEH0bZ`cbY_f`V^fVMTT=:=!000CBT0TTzcSR|fQP|fHHnT77H!000EED0YXXcXXWfVVUfNMMT:::!000;;:0EEDcDDCfCCBf>>>T554!000000000000000000000TRUEVISION-XFILE.linthesia-0.4.2/graphics/title_SongBox.tga0000644000175000017500000004373311314377743017574 0ustar cletocleto                    5 M W X X X X J3  3bv^+ [%%%///222222222222+++  X  k222FFFHHHGGGGGGGGGGGGFFFEEE???(((`  o"""EEEJJJIIIIIIIIIIIIHHHGGGFFFEEE888_ _$$$KKKKKKKKKKKKKKKJJJIIIHHHGGGFFFEEE??? X  @JJJMMMMMMMMMMMMLLLKKKIIIHHHFFFEEE;;;+ g>>>څNNNOOOOOOOOOOOONNNMMMLLLJJJHHHGGGFFF)))_ *"""PPPOOOPPPPPPPPPPPPOOONNNMMMLLLJJJHHHGGGBBB  J666RRRQQQPPPPPPPPPPPPOOOMMMLLLJJJHHHGGG$$$7 gHHHTTTSSSQQQPPPPPPPPPPPPOOONNNMMMKKKIIIHHH111 P vQQQUUUTTTSSSQQQPPPPPPPPPPPPOOONNNLLLJJJIII777] XXXVVVUUUSSSQQQPPPPPPPPPPPPOOONNNMMMKKKIII:::b XXXWWWUUUSSSQQQPPPPPPPPPPPPOOONNNMMMKKKJJJ:::b YYYXXXUUUSSSRRRQQQPPPPPPPPPPPPOOONNNMMMLLLJJJ:::b YYYXXXUUUSSSRRRQQQPPPPPPPPPPPPOOONNNMMMLLLJJJ:::b YYYXXXVVVSSSRRRQQQPPPPPPPPPPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNMMMNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNMMMLLLKKKLLLMMMNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMKKKIIIHHHIIIJJJKKKLLLMMMNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNLLLIIIHHHGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNLLL```IIIJJJLLLMMMOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNyyyPPPHHHJJJMMMNNNPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNOOOPPPOOONNNMMMGGGHHH~~~HHHJJJLLLMMMNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNMMMLLLMMMNNNOOONNNMMMNNNMMMNNNMMMLLLGGGEEEFFFGGGgggIIIKKKLLLMMMNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNMMMKKKJJJKKKLLLMMMNNNMMMLLLKKKLLLMMMLLLKKKLLLMMMLLLKKKaaannnDDDEEEvvvwwwJJJKKKLLLMMMOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNMMMKKKIIIHHHIIIJJJKKKLLLKKKJJJIIIJJJKKKJJJIIIHHHIIIJJJKKKJJJHHHIIIPPPZZZKKKJJJIIIJJJMMMNNNPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNTTTaaaIII```hhhiiiZZZJJJIIIHHHGGGHHH___XXXIIIHHHIIIHHHGGGHHHJJJIIIGGGHHHwwwYYYLLLbbbwwwIIIJJJMMMNNNPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNkkkPPPGGGFFF MMMHHHGGG___~~~JJJvvvHHHuuuDDDEEEGGGHHHJJJLLLcccLLLMMMOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOkkk[[[MMMLLLUUUDDDLLLvvvJJJLLLcccFFFGGG WWWIIIJJJKKKfffFFFGGGfffnnnHHHIIIKKKcccMMMNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNMMMKKKHHHDDDHHHKKKMMMLLLfffFFFGGGGGGHHHJJJKKKfffGGGvvvOOOHHHIIIKKKcccMMMNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPVVVNNNMMMLLLJJJHHHFFFEEE^^^HHHJJJLLLKKKhhhFFFGGGEEEHHHIIIfffGGGOOOgggHHHFFFHHHIIIKKKLLLMMMNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOO MMMLLLJJJHHHGGGEEEmmmGGGGGGHHHJJJgggGGGEEEGGGHHHfffHHHwwwgggIIIHHH~~~UUUFFFHHHIIIJJJLLLMMMOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP OOONNNLLLIIIGGGFFFEEEeeewwwJJJIII~~~HHHMMMFFFGGGfffIIIxxxJJJIIIHHHvvveeeFFFGGGHHHIIIJJJMMMNNNPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNLLLIIIGGGEEEuuuTTTMMMiiiJJJIIIQQQpppKKKgggHHH hhhKKKTTTcccJJJIIIHHH___HHHoooIIIKKKMMMNNNPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMKKKHHHuuuMMMNNN TTTLLLZZZMMM\\\qqqTTTMMMNNNTTTKKKxxxxxxqqqLLLMMMOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMRRRTTTMMMNNNOOONNN OOOeee\\\zzzNNNOOO TTTzzzNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMM~~~IIILLLMMMNNNOOOPPPOOOPPPOOOeeelllNNNOOOeeetttOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP OOOMMMfffHHHJJJLLLMMMLLLKKKLLLMMMOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNHHHIIIJJJLLLKKKaaaYYYKKKMMMNNNPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOORRRJJJKKKJJJhhhKKKMMMOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOlllzzzLLLiiiiiiMMMNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::a ZZZXXXVVVSSSRRRQQQPPPOOOtttkkkNNNOOOPPPPPPPPPPPPOOO MMMLLLJJJ:::a ZZZXXXVVVTTTRRRQQQPPPOOOeeelll]]]VVVOOOPPPPPPPPPPPPOOO MMMLLLJJJ:::a ZZZXXXVVVTTTRRRQQQPPPPPPPPPPPPOOO MMMLLLJJJ:::a ZZZYYYWWWTTTRRRQQQPPPPPPPPPPPPOOO MMMLLLKKK:::` [[[ZZZXXXUUUSSSQQQPPPPPPPPPPPPOOO MMMLLLKKK:::`  {ZZZ[[[XXXUUUSSSQQQPPPPPPPPPPPPOOO NNNLLLKKK:::^ nSSS\\\ZZZWWWTTTRRRQQQPPPPPPPPPPPP OOONNNMMMLLL666 R TDDD^^^\\\YYYVVVSSSQQQPPPPPPPPPPPPOOONNNMMM ,,, ;   6///```^^^\\\XXXUUUSSSRRRQQQPPPPPPPPPPPPQQQPPP OOONNNMMM YYY```^^^\\\XXXVVVTTTSSSRRRQQQQQQQQQQQQRRRQQQ PPPOOO:::b T000cccbbb___\\\ZZZXXXUUUTTTSSSSSSSSSSSSTTTSSSQQQMMM 9 xCCCdddccc```^^^\\\ZZZXXXWWWWWWWWWWWWUUUSSS'''^ .FFFeeecccbbb```^^^]]]\\\[[[[[[[[[[[[ZZZYYYXXXTTT---s N333]]]eeecccbbbaaa```____________^^^\\\[[[KKK"""{1{555NNN]]]cccbbbbbbbbbbbbaaa```UUUCCC***fVq H =[vn Q3 TRUEVISION-XFILE.linthesia-0.4.2/graphics/play_KeyShadow.tga0000644000175000017500000000031411314377743017723 0ustar cletocleto  #'+/37:FTaTRUEVISION-XFILE.linthesia-0.4.2/graphics/tracks_BackToTitle.tga0000644000175000017500000003136011314377743020521 0ustar cletocleto @                     6 N W X Y Y K4  3bv_- [%%%///222̗222+++  Y  k222FFFHHHGGGGGGFFFEEE???(((a"  o"""EEEJJJIIIIIIHHHGGGFFFEEE 888` _$$$KKKKKKKKKJJJIIIHHHGGGFFFEEE??? Y  ?JJJMMMMMMLLLKKKIIIHHHFFFEEE;;;, g>>>څNNNOOOOOONNNMMMLLLJJJHHHGGGFFF)))` ("""PPPOOOPPPPPPOOONNNMMMLLLJJJHHHGGGBBB  I666RRRQQQPPPPPPOOOMMMLLLJJJHHHGGG$$$8 gHHHTTTSSSQQQPPPPPPOOONNNMMMKKKIIIHHH111 P vQQQUUUTTTSSSQQQPPPOOOPPPOOONNNLLLJJJIII777^ XXXVVVUUUSSSQQQPPPOOONNNOOONNNOOONNNOOONNNOOOPPPOOONNNOOONNNOOOPPPOOONNNOOOPPPOOONNNOOONNNOOONNNOOOPPPOOONNNMMMKKKIII:::b XXXWWWUUUSSSQQQPPPOOONNNMMMLLLMMMNNNMMMLLLMMMLLLMMMLLLMMMLLLMMMNNNOOOPPPOOONNNMMMNNNMMMNNNOOOPPPOOONNNMMMLLLKKKLLLMMMNNNOOONNNMMMNNNMMMLLLMMMLLLMMMNNNOOOPPPOOONNNMMMKKKJJJ:::b YYYXXXUUUSSSRRRQQQPPPOOONNNMMMKKKIIIJJJKKKLLLKKKJJJIIIJJJKKKJJJIIIJJJKKKJJJIIIJJJKKKJJJIIIJJJKKKMMMNNNOOOPPPNNNMMMKKKJJJKKKLLLMMMLLLKKKLLLMMMNNNOOOPPPOOONNNLLLJJJHHHIIIKKKMMMNNNOOONNNMMMKKKJJJKKKLLLKKKJJJKKKJJJIIIJJJKKKLLLKKKJJJIIIJJJKKKMMMNNNOOOPPPOOONNNMMMLLLJJJ:::b YYYXXXUUUSSSRRRQQQPPPOOONNNKKKIIIGGGFFFHHHIIIHHHIIIHHHGGGFFFGGGHHHIIIHHHGGGHHHIIIHHHGGGHHHGGGHHHIIILLLNNNOOOPPPOOOMMMLLLIIIHHHIIIJJJKKKJJJIIIHHHIIIJJJLLLNNNOOOPPPOOOMMMKKKHHHFFFGGGIIILLLNNNOOONNNLLLIIIHHHIIIJJJIIIHHHIIIHHHFFFGGGHHHIIIHHHGGGHHHJJJLLLMMMOOOPPPOOONNNMMMLLLJJJ:::b YYYXXXVVVSSSRRRQQQPPPOOOdddiiigggeeefffhhhiiiIIIHHHFFF___}}}VVVEEEmmmuuuNNNGGG NNNfffwwwRRRSSShhhgggfffeeeVVVFFF___fffgggaaaMMMNNNOOOPPPOOOMMMJJJfffuuuWWWIIIJJJHHHGGGOOOgggwwwYYYIIIJJJLLLNNNOOOPPP ^^^wwweeeddd~~~wwwMMMNNNOOO\\\iiigggfffgggXXXIII___uuuWWWIIIRRRiiigggfffeeefffOOOHHHGGG^^^}}}vvvXXXKKKMMMNNNOOOPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPsss ]]]DDDEEE^^^FFFdddDDD}}}qqqMMMOOOPPPOOOLLLiiiIIIGGG___GGGHHHKKKMMMOOOPPPlll~~~```MMMOOOPPPOOOccc___III~~~qqqOOOGGGTTTNNNOOOPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNSSSEEEHHHJJJLLL TTTEEEHHHGGGuuuEEEFFFuuuwwwJJJMMMUUUrrrKKKCCCSSSMMMOOOPPP NNNLLL]]]HHHRRRqqqQQQ~~~IIILLLNNNGGGJJJMMMOOOPPPOOOLLL}}}GGGJJJMMMOOOPPPOOOMMMiiiGGGIIIfffHHHSSSrrrLLLFFFGGGnnn}}}HHHJJJjjjkkkNNNOOOPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNLLL%EEEHHHKKKLLLKKKFFFaaaHHHfffFFFGGG~~~IIIKKKMMMOOONNNLLLBBBJJJJJJMMMNNNOOOPPPNNNLLLFFFHHHKKK GGGJJJLLLMMMYYYGGGIIIMMMOOOPPPOOOLLLeeeHHHKKKNNNPPPOOOMMMiiiHHHIIIFFFIIILLLMMMGGGHHHuuuFFFHHHIIIKKKLLLMMMNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNLLL EEEGGGIIIJJJIIIGGGQQQxxxGGGHHHPPPIIIJJJLLLMMMLLLJJJKKKHHHJJJMMMNNNOOOPPP NNNKKKEEEHHHJJJKKK~~~HHHIIIKKKIIIGGGJJJMMMOOOPPPOOOLLLeeeHHHKKKNNNPPP OOOMMMiiiGGGHHHIIIEEEHHHJJJMMMvvvHHH FFFEEEFFFGGGHHHJJJLLLMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOLLLEEEFFFHHH IIIJJJKKKJJJHHHvvvHHHIIIIIIJJJKKK IIIFFFHHHIIILLLMMMOOOPPPNNNKKKDDDGGGIIIJJJgggHHHIIIJJJHHHHHHKKKMMMOOOPPPOOOLLLeeeHHHKKKNNNPPPOOOMMMiiiGGGHHHEEEGGGIIILLLfffHHHnnnNNNFFFGGGHHHKKKMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOLLLDDDEEEFFFNNNoooJJJLLL JJJHHHfffIIIKKKKKKJJJIIIHHHIII HHHNNNGGGHHHIIIKKKMMMNNNOOOPPPNNNKKKDDDFFFHHHJJJhhhIIIgggJJJLLLNNNPPPOOOLLLeeeHHHKKKNNNPPPOOOMMMiiiHHHIIIDDDFFFHHHKKKiiifffHHHIII~~~```KKKMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOLLLDDDEEENNNIIILLLZZZIII~~~KKKMMMcccTTTKKKIIIHHHPPPIIIHHHFFF~~~oooIIIKKKMMMNNNOOOPPP NNNLLLEEEFFFHHHJJJ[[[JJJIIILLLNNNOOOPPPOOOLLLeeeHHHKKKMMMPPPOOONNNrrrIIIJJJEEEFFFHHHJJJKKKhhh~~~HHHJJJrrriiiJJJHHHMMMNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOLLL}}}GGGIIILLLdddzzzyyyjjjMMMNNNOOOlllyyyIIIGGGHHHjjjLLLMMMOOOPPPOOOkkkfffgggiii[[[MMMzzzLLLcccMMMNNNOOOPPP OOOLLLeeeGGGJJJMMMOOOPPPOOOzzzLLLjjjfffgggiii[[[LLLiiiHHHJJJLLLzzzrrrMMMNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOLLL}}}}}}EEEFFFIIILLLNNN^^^NNNOOOPPPOOOeeeyyyKKKGGGIIINNNOOOPPPOOO zzzNNNOOO^^^NNNOOOPPPOOONNNLLLeeeGGGJJJMMMOOONNN]]]MMMzzzLLLiiiHHHJJJMMMOOOtttUUUNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNKKKEEEGGGHHHFFFIIILLLOOOPPPOOOPPPOOOVVVOOONNNLLLGGGIIIKKKMMMOOOPPPOOOMMMNNNOOOPPPOOOPPPOOONNNMMMKKKdddFFFIIILLLMMM\\\MMMNNNzzzMMMNNNMMMiiiGGGJJJMMMOOOPPPOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP NNNKKKEEEGGGHHHXXXGGGJJJMMMOOOPPPOOOLLLFFFHHHKKKNNNPPPOOOOOOPPPOOONNNMMMLLL KKKIIIkkkEEEHHHJJJKKKLLLKKKLLLMMMNNNOOOlllOOOMMMiiiGGGJJJMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNKKKEEEFFFGGGXXXKKKMMMOOOPPPNNNLLLNNNHHHKKKNNNPPPOOOMMMLLLJJJHHHEEEGGGIIIJJJKKKLLLMMMNNNOOOPPPOOOMMMiiiGGGJJJMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNKKKFFFGGG___JJJMMMNNNOOOPPPNNNLLLfffIIILLLNNNPPPOOOzzzcccJJJIIIHHHFFFHHH III```wwwJJJKKKLLL[[[LLLMMMNNNOOOPPPOOOMMMiiiHHHKKKMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNkkkIIIRRRMMMNNNOOOPPPOOOTTThhhKKKMMMNNNPPPOOOsssrrrbbbKKK iiiIIIJJJKKKbbbLLL\\\NNNOOOPPPOOONNNJJJLLLNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPtttMMMNNNOOOPPPOOOjjjMMMNNNOOOPPPOOOMMMNNNUUUOOOPPPOOOLLLMMMNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVTTTRRRQQQPPP^^^OOOUUUllldddNNNOOOPPPOOOlllNNNOOOPPPlllOOONNNeeeOOOPPPOOO^^^NNNOOOPPPOOO MMMLLLJJJ:::a ZZZXXXVVVTTTRRRQQQPPPOOOPPPOOOeeeOOOPPPOOO MMMLLLJJJ:::a ZZZYYYWWWTTTRRRQQQPPPPPPOOO MMMLLLKKK:::a [[[ZZZXXXUUUSSSQQQPPPPPPOOO MMMLLLKKK:::` {ZZZ[[[XXXUUUSSSQQQPPPPPPOOO NNNLLLKKK:::^ nSSS\\\ZZZWWWTTTRRRQQQPPPPPP OOONNNMMMLLL666 R SDDD^^^\\\YYYVVVSSSQQQPPPPPPOOONNNMMM,,, ; 5///```^^^\\\XXXUUUSSSRRRQQQPPPPPPQQQPPP OOONNNMMM YYY```^^^\\\XXXVVVTTTSSSRRRQQQQQQRRRQQQPPPOOO:::bT000cccbbb___\\\ZZZXXXUUUTTTSSSSSSTTTSSSQQQMMM 9 xCCCdddccc```^^^\\\ZZZXXXWWWWWWUUUSSS'''] -FFFeeecccbbb```^^^]]]\\\[[[[[[ZZZYYYXXXTTT---r N333]]]eeecccbbbaaa```______^^^\\\[[[KKK"""{0{555NNN]]]cccbbbbbbaaa```UUUCCC***eVq G <[vn P2TRUEVISION-XFILE.linthesia-0.4.2/graphics/play_NotesBlackShadow.tga0000644000175000017500000011633011314377743021226 0ustar cletocleto @                                                          =ADB'$!  =ADB'$!  =ADB'$!  =ADB'$!  =ADB'$!  =ADB'$!  =ADB'$!  =ADB'$!  <############ """}/!  <############ """}/!  <############ """}/!  <############ """}/!  <############ """}/!  <############ """}/!  <############ """}/!  <############ """}/!  M###########################7  M###########################7  M###########################7  M###########################7  M###########################7  M###########################7  M###########################7  M###########################7   ##############################}    ##############################}    ##############################}    ##############################}    ##############################}    ##############################}    ##############################}    ##############################}  M##################‚############- M##################‚############- M##################‚############- M##################‚############- M##################‚############- M##################‚############- M##################‚############- M##################‚############- m##################‚############ K m##################‚############ K m##################‚############ K m##################‚############ K m##################‚############ K m##################‚############ K m##################‚############ K m##################‚############ K x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x#################################### Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ Q x##################‚############ P x##################‚############ P x##################‚############ P x##################‚############ P x##################‚############ P x##################‚############ P x##################‚############ P x##################‚############ P  x################################# O  x################################# O  x################################# O  x################################# O  x################################# O  x################################# O  x################################# O  x################################# O w############################## M w############################## M w############################## M w############################## M w############################## M w############################## M w############################## M w############################## M w################################# J w################################# J w################################# J w################################# J w################################# J w################################# J w################################# J w################################# J v################################# G v################################# G v################################# G v################################# G v################################# G v################################# G v################################# G v################################# G p################################# ? p################################# ? p################################# ? p################################# ? p################################# ? p################################# ? p################################# ? p################################# ? Q###########################! Q###########################! Q###########################! Q###########################! Q###########################! Q###########################! Q###########################! Q###########################!  ##################x ##################x ##################x ##################x ##################x ##################x ##################x ##################xU############-U############-U############-U############-U############-U############-U############-U############-K###q'K###q'K###q'K###q'K###q'K###q'K###q'K###q'# FI =# FI =# FI =# FI =# FI =# FI =# FI =# FI =TRUEVISION-XFILE.linthesia-0.4.2/graphics/play_NotesWhiteShadow.tga0000644000175000017500000017104111314377743021272 0ustar cletocleto                                                                     " !     " !     " !     " !     " !     " !     " !     " !    =AEFGH D'$!   =AEFGH D'$!   =AEFGH D'$!   =AEFGH D'$!   =AEFGH D'$!   =AEFGH D'$!   =AEFGH D'$!   =AEFGH D'$!  <############### """}/!  <############### """}/!  <############### """}/!  <############### """}/!  <############### """}/!  <############### """}/!  <############### """}/!  <############### """}/!  M###########################7  M###########################7  M###########################7  M###########################7  M###########################7  M###########################7  M###########################7  M###########################7   #####################ˆ#########}    #####################ˆ#########}    #####################ˆ#########}    #####################ˆ#########}    #####################ˆ#########}    #####################ˆ#########}    #####################ˆ#########}    #####################ˆ#########}  M#####################Æ### ############- M#####################Æ### ############- M#####################Æ### ############- M#####################Æ### ############- M#####################Æ### ############- M#####################Æ### ############- M#####################Æ### ############- M#####################Æ### ############- m#####################Æ### ############ K m#####################Æ### ############ K m#####################Æ### ############ K m#####################Æ### ############ K m#####################Æ### ############ K m#####################Æ### ############ K m#####################Æ### ############ K m#####################Æ### ############ K x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q  x#####################Ç### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ Q x#####################Æ### ############ P x#####################Æ### ############ P x#####################Æ### ############ P x#####################Æ### ############ P x#####################Æ### ############ P x#####################Æ### ############ P x#####################Æ### ############ P x#####################Æ### ############ P  x#####################ˆ############ O  x#####################ˆ############ O  x#####################ˆ############ O  x#####################ˆ############ O  x#####################ˆ############ O  x#####################ˆ############ O  x#####################ˆ############ O  x#####################ˆ############ O w############################## M w############################## M w############################## M w############################## M w############################## M w############################## M w############################## M w############################## M w###########################‚############ J w###########################‚############ J w###########################‚############ J w###########################‚############ J w###########################‚############ J w###########################‚############ J w###########################‚############ J w###########################‚############ J v######################## ############ G v######################## ############ G v######################## ############ G v######################## ############ G v######################## ############ G v######################## ############ G v######################## ############ G v######################## ############ G p#################################### ? p#################################### ? p#################################### ? p#################################### ? p#################################### ? p#################################### ? p#################################### ? p#################################### ? Q#################################! Q#################################! Q#################################! Q#################################! Q#################################! Q#################################! Q#################################! Q#################################!  ########################x ########################x ########################x ########################x ########################x ########################x ########################x ########################xU##################-U##################-U##################-U##################-U##################-U##################-U##################-U##################-K######q'K######q'K######q'K######q'K######q'K######q'K######q'K######q'# FIJ =# FIJ =# FIJ =# FIJ =# FIJ =# FIJ =# FIJ =# FIJ =TRUEVISION-XFILE.linthesia-0.4.2/graphics/play_Keys.tga0000644000175000017500000026247011326126636016751 0ustar cletocleto  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@؉???@@@@@@@@@@@@@@@،???@@@؂???@@@@@@@@@@@@ة???؃@@@؜???@@@؉???@@@@@@@@@@@@؃???؂???ْ>>>ك???َ???@@@؃???؂???ْ>>>ق???ك???ؿ@@@؍???@@@@@@@@@@@@؂??????ف>>>ف>>>ڒ===ځ>>>ځ>>>???ِ??????ف>>>ف>>>ڒ===ځ>>>>>>ف???ق???ؽ@@@ؐ???@@@@@@@@@@@@؂??????>>>>>>======ہ<<<ې<<<<<<ہ======>>>>>>ف???ٌ???؁???>>>>>>======ہ<<<ې<<<<<<ہ======>>>>>>???ف???ػ@@@؆???؄>>>ه???@@@@@@@@@@@@؁??????>>>======<<<;;;;;;ݒ:::;;;;;;<<<===>>>>>>ف???ً??????>>>======<<<;;;;;;ݒ:::;;;<<<<<<===>>>>>>???ف???ؑ@@@ح???؁>>>ل===ق>>>ى???؋@@@؇???؆@@@ؘ???؎@@@؅???@@@@@@؉@@@@@@??????>>>>>>===<<<:::݁999ށ888ߎ777߁888߁999:::<<<======>>>???ي??????>>>>>>===<<<:::݁999ށ888ߎ777߁888999:::;;;<<<===>>>???ف???؏@@@ح???؁>>>ف======ڂ<<<===ڂ===ف>>>ى???؆@@@???@@@@@@؇@@@@@@؁??????>>>===<<<999444333222222111 222666777888999:::<<<888777:::???ى??????>>>===<<<999444333222222111 222666777888999;;;<<<===>>>??????،@@@خ???؁>>>ف======<<<څ;;;<<<===ځ===ف>>>ي???؁@@@???@@@@@@؅@@@@@@؁???>>>===555000777FFEEEDDDDDDCDCCCCCCCBCBBBBB@@@222...555888999444333444:::ވ??????>>>===555000777FFEEEDDDDDDCDCCCCCCCBCBBBBB @@@222...555888:::;;;===>>>??????؋@@@؈???؅>>>ٌ???؊>>>ن???؂>>>ف===<<<;;;;;;:::ۂ999ہ:::;;;;;;<<<===ځ===ق>>>ّ???؁>>>ټ???@@@@@@؄@@@@@@??????>>>333=== ~zyxUUU333444777222@@@샂444777??????>>>333=== ~zyxUUU333444999;;;<<<>>>??????؁@@@؃???؄@@@؅???؄>>>ك===ٍ>>>ى===ه>>>ق======<<<;;;:::999ۄ888999999:::;;;;;;<<<===ڂ===ق>>>ي???ث>>>ى???؇>>>م???@@@@@@؃@@@@@@??????===666\\[...777111555999444===ۂ???ل??????===666 \\[...888:::<<<===>>>???و???@@@؄???؁>>>ك===ه===چ===ل===ڄ<<<ڇ===ڃ======ځ<<<;;;;;;:::999888777܂666777777܁888999:::ہ;;;ځ<<<===ڂ===ف>>>ن???؁>>>ك===ف===ڛ===ك===ڄ===ي>>>ن===ق>>>ل???@@@@@@؂@@@@@@??????333qqq888555333222ꋊ_^]444999???ك???>>>333qqq 888666:::<<<===>>>ه???ن???؁>>>======ځ<<<ڨ;;; ::::::jjj蓓󠠠ddd777555ށ666777888999999:::;;;ہ;;;ځ<<<ځ===ف>>>ك???؁>>>ف======ځ<<<ڃ;;;ڃ<<<ڂ===ڑ<<<چ;;;ڂ<<<===ڊ======څ<<<ځ===ف>>>ك???@@@@@@؂@@@@@@??????111𐐐JJJ111555222QQP444666???ك???>>>111JJJ111:::<<<===>>>>>>???ف>>>ف>>>>>>ف???ل???>>>ف===<<<ځ;;;;;;ۑ:::ۍ999ۇ:::999999܊񻻻nnnWWWbbb荍󥥥LLL444555666777777888999܁999:::;;;;;;<<<======ف>>>ف???؁>>>======<<<ځ;;;;;;ۄ:::;;;ۅ;;;ڃ;;;ۅ;;;څ;;;ۃ:::ۂ999ہ:::;;;ۆ;;;څ<<<ځ;;;ڂ;;;ہ;;;<<<======ف>>>ك???@@@@@@؁@@@@@@??????111򚚚¿¿OOO111999222555ľ;::444===ۃ???ف??????>>>111򙙙¿¿ OOO111:::<<<===>>>ځ>>>>>>ڂ===>>>>>>ف???ق???>>>======<<<;;;ځ:::ہ999ۆ999܄888999܄888܉777܆888܁999܂888@@@޺>>>555444ށ333www>>>444555555666777݁777888999999:::;;;<<<======ك>>>======<<<;;;:::ۂ999ۃ999܆999ۂ999܁999ۃ:::ۆ999ہ999܆888܁999ۆ:::;;;ۂ;;;;;;:::ہ999999܁999:::;;;<<<ځ===>>>ك???@@@@@@؁@@@@@@??????111򛛛¿¿OOO111999444333醃^\Z444999?????????>>>111򚚚¿¿OOO111:::<<<===>>>>>>>>>===ڂ======>>>ځ>>>ف???>>>ف===<<<;;;:::999܈888܂777܂777݁777܁777݃666݆555݅666݁777݂777܁777 AAA߻555444333333222EEE㻻qqq333߁444ށ555ށ666777777888999:::;;;<<<ځ===>>>ف======;;;;;;999999܋888܃777܂888܃999܆888܁777777݄666777777888܃999888܁999܃999999܁888܁777܁888999:::;;;<<<===>>>ك???@@@@@@؁@@@@@@??????111򛛛¿¿PPP111999777333QPO444666?????????>>>111򚚚¿¿ PPP111:::<<<===ځ>>>ځ===<<<<<<<<<======>>>>>>ف??? >>>===<<<;;;999999AAAWWW^^^XXXHHH888܁777777݆666555݂555666HHH???444ރ555ށ555݄666 555ݗ===444333222333uuuyyy333 444>>>QQQLLL888666777888999;;;;;;===ڂ=== ===;;;;;;999:::TTThhhiiiWWW:::݁777܁777݄666;;;KKKFFF777777܃888;;;???ބ777888JJJAAA555݄555555666777݆777܃888 777AAASSSMMM999777777888999;;;<<<ځ===>>>ك???@@@@@@@@@@@@??????111򛛛¿¿PPP111999;;;333555<;;555<<<܃?????????>>>111򚚚¿¿ PPP111:::<<<===ځ>>>======<<<;;;<<<<<<===>>>>>>???>>>======;;;:::[[[䛛888mmm鯯 bbb555ސ666TTT歭YYYxxx]]]譭nnn444އ񶶶DDD555<<<qqq~~~𖖖GGG222EEE㖖JJJ777999:::;;;<<<=========<<<;;;:::sss뭭zzz:::݁666݁555444CCCᐐ@@@߁888𹹹@@@666WWW䮮 ZZZyyy444555555666ppp뻻SSS666݁777IIIᗗ JJJ888999:::;;;======>>>ك???@@@@@@@@@@@@??????111򛛛¿¿PPP111999;;;555444{xa^[555999???>>>111򚚚¿¿ PPP111:::<<<===ځ>>>===UUU???;;;<<<======>>>???>>>===<<<:::{{{컻nnn@@@777777GGGߪ999888:::ݰ888ނ444 ppp컻zzz333444ߨsss<<>>SSS充񥥥777888999;;;ہ<<<,===<<<;;;>>>ܖFFF666777DDDߊ񻻻>>>555444333@@@᫫]]]KKK[[[把ggg777<<<ݺfffAAAIII999666ݩuuu>>>PPP䆆񯯯RRR333444ށ555555555666DDD୭NNN???TTT充񥥥777888999;;;<<<===>>>ك???@@@@@@@@@@@@??????111򛛛¿¿PPP111999;;;888444MLK555666???>>>111򚚚¿¿ PPP111:::<<<===ځ>>>sss󻻻>>>;;;<<<======>>>???>>>===;;;rrr껻BBB666 777888999܋𴴴999999888ܮ555ށ444333kkk뻻uuu333;;;ỻ333222ߐLLL222:::333[[[绻444999222111111111󻻻222333444BBB666888999:::;;;ځ<<<;;;;;;ۋ񻻻666 777777888܆𻻻555444333߈򻻻333444555666777777@@@߻555>>>߻666555ށ444LLL222߁333444JJJ㻻<<<444ށ555򻻻444ށ333߁444BBB666888999;;;<<<===>>>ك???@@@@@@@@@@@@??????111򛛛¿¿PPP111999;;;<<<444555<<;555<<<܄???>>>111򚚚¿¿ PPP111:::<<<===ځ>>>UUU;;;<<<======ځ>>>===<<>>ݰ^^^333555ߴFFF222333444555ށ666777@@@߻555ށ444 555777޲<<<555555444ސLLL222߁333333}}}ﻻddd鐐ooo444888޶===333 444555666777999:::;;;======>>>ق???@@@@@@@@@@@@??????111򛛛¿¿PPP111999<<<===666444yvra^Z555888???>>>111򚚚¿¿ PPP111:::<<<܁===>>>===ߩggg;;;<<<======ځ>>>===<<<ڂ666݁555666777999:::;;;ہ;;;:::999ۮ555444ށ333jjj뻻uuu333eee鸸CCC333333ߐLLL222333ߠ:::333[[[绻444555jjj곳񁨨RRR222HHH任222333߁444555777888999;;;ۂ;;;񻻻666555555666777888܁999 𻻻333HHH任111222333444555ނ666@@@߻444 555555fff鸸EEE555444ސMMM222߁333444߫999\\\礤444555KKK㻻444ރ333 444555666777888:::;;;======>>>ق???@@@@@@@@@@@@??????111򛛛¿¿PPP111999<<<===:::444KJH555666???>>>111򙙙¿¿ PPP111:::<<<܁===>>>======<<<܁;;;<<<===>>>ځ>>> ===<<<ڧsss666555555666777999:::ۂ;;;:::999ۮ555444ށ333jjj뻻uuu333߁444JJJㆆ񭭭hhhꗗMMM333;;;333ށ333[[[绻444555UUU庺666444;;;૫???222MMM廻SSSTTTUUUPPP666777888999;;;ۂ;;;ooo666555555666777888܁999 fff绻555MMM廻111222333444555ނ666???߻444 555555666KKK⇇𭭭iiiꘘMMM333333XXX滻444555ޫTTT555OOO㻻UUUTTTUUUPPP666777888:::;;;======>>>ق???@@@@@@@@@@@@??????111򛛛¿¿PPP111999<<<===>>>444555赬<;;555<<<܃???>>>111򙙙¿¿ PPP111:::<<<===ځ>>>======ۂ<<<<<<===>>>ځ>>>======ڹ___666݁555 666777999:::;;;;;;;;;:::999ܮ555333ށ333jjj뻻uuu444555555666777SSSvvvNNN444;;;߂444\\\绻555 666݆𻻻fff666555555ހﻻkkk333>>>ỻ666777888:::ۂ;;; ===ۺ___666555555666777888܁999VVVほEEE@@@ỻ333444555555݂666???߻444555666777݁777888SSSwwwNNN444򻻻YYY555{{{666@@@߻ 666777999:::;;;======>>>ق???@@@@@@@@@@@@??????111򛛛¿¿PPP111999<<<===>>>777444wsoc_\555888???>>>111򙙙¿¿ PPP111:::<<<===ځ>>>===^^^???<<<======>>>ځ>>>===BBBہYYY666777888999ۂ:::999888ܮ444333ށ333nnn컻uuu555555LLLjjjZZZ777666ݒOOO555݁666===555݁555aaa绻666 777݋򻻻___777777666xxxrrr555888ނ555KKK⻻777888999:::;;;ځ<<<AAA܁[[[666݁555666777݂888PPP⁻KKK333ޤGGG444555666iiittt:::777@@@߻555 666777MMMkkk[[[888777777ݒOOO555;;;ߴ777݁666GGGᴴ@@@ށ777:::ނ666 KKK⻻777888999;;;<<<===>>>ك???@@@@@@@@@@@@ ??????111򛛛 |zx443PPP111999<<<===>>>:::444HFE훔555666???>>>111򙙙edc JIH¿PPP111:::<<<===>>>>>>rrr򻻻???===>>>ځ>>>???>>>>>>ڸ___777݂666777888999܂999999888ܮHHH333333444ߖhhh666777~~~888FFF777TTT777܁777񻻻www777܁888mmm黻|||999܁888QQQ666ccc绻qqq777nnn껻{{{888999:::;;;ڂ<<<===ڹbbb777݂666777777܁888WWW䁻BBB444ccc黻666777777ܮaaa888AAA޻666777777999888ܡEEE777iii黻777܂888sss999888ddd绻rrr888܁777 nnn껻{{{888999:::;;;<<<===>>>ك???@@@@@@@@@@@@??????111򛛛GFD _][ PPP111:::<<<===ځ>>>444555讦>=<555<<<܂???>>>111򙙙ONM ZXW PPP111:::<<<===>>>===܂MMM>>>ڂ>>>???>>>===٥uuu888777݁666777777888܁999܁888777ܮ@@@777888KKKமaaaUUUyyy컻999^^^塡JJJ999999:::<<<ܚeeeGGGttt꺺YYY888{{{~~~YYYnnn鲲@@@:::;;;;;;<<<===ځ======ڧvvv777777݁666777݂777lll黻666555666zzzPPPKKKhhh瞞DDD999KKK߮aaaUUUyyy컻999===ccc栠RRR999UUU⍍񩩩hhh@@@:::|||츸~~~YYYnnn鲲@@@:::;;;;;;<<<===ف>>>ق???@@@@@@؁@@@@@@??????111򛛛ZZYUTS¿PPP111:::<<<===>>>???777555qmib^[555888???>>>111򙙙BA@$##jhfPPP111:::<<<===>>>???BBB㻻]]]>>>ق???ف???>>>===ـ컻999888777777݁777888===HHH888777777ݮ555\\\獍󠠠QQQ888999:::;;;DDDvvvꕕ󢢢GGGނ;;; SSS{{{얖@@@[[[㌌񢢢YYY:::;;;ۂ;;;===ooo蕕󢢢yyyVVVUUUAAA:::;;;YYY⌌𠠠~~~BBB܁;;;ځ<<<ڄ===888777܂777݂777򻻻666777777888UUU≉𠠠UUU;;;>>>mmm趶ddd ???:::;;;DDDwwwꕕ󢢢GGG;;;DDD݃ppp;;;vvvꂉIIIށ;;;YYY⌌𠠠~~~BBB܁;;;ځ<<<===ف>>>ك???@@@@@@؁@@@@@@ ??????111򛛛ba`..-¿PPP111:::<<<===>>>???;;;555GFD흕555666???؁???>>>111򙙙 PPP111:::<<<===>>>???ف???؂???م???>>>JJJܴYYY999܄888ppp곳888777777ݮ555݁666777888999;;;;;;ځ<<<ڂ===ڌ<<<;;;ڃ<<<===ڃ======ڎ<<<===ځ===ك>>>===NNN޸OOO999888܃777GGG෷RRR777888999999:::ہ;;;ڄ<<<;;;ډ;;;ځ<<<ڂ===ڋ<<<ڇ===څ<<<===ځ===ف>>>ك???@@@@@@؂@@@@@@??????111򛛛>=<&%%kjh+PPP111:::<<<===>>>??????555555誡>==555<<>>111򚚚XWU ONL PPP111:::<<<===>>>???ي???؁>>>kkk滻PPP999999܂888𳳳888777ܮ666݁777888999:::;;;<<<===ڗ===ل>>>ُ===ق>>>ق???>>>===www黻@@@999999܁888===ݛ888999999:::;;;ځ<<<چ===NNN~~~<<<ځ===ڟ===ق>>>ل???@@@@@@؂@@@@@@??????111򛛛rpo+**321wus+PPP111:::<<<===>>>??????777555ojfd`^555888??????>>>111򚚚ihf!! >=< PPP111:::<<<===>>>ف???؆@@@؃??? >>>===jjj洴___PPP[[[}}}999888ܮ888999:::;;;<<<ځ===ٗ>>>ك???ؐ>>>ن??? >>>===}}}뺺jjjHHHFFFfff楥:::ہ;;;<<<ځ===ه>>>ل===٠>>>ن???@@@@@@؃@@@@@@ ??????111򛛛`^\ PPP222;;;<<<===>>>ف???;;;555DCB요555666??????>>>111򚚚ba`--,vus¿ PPP222;;;<<<>>>??????؈@@@؃???>>>===III~~~죣qqq:::RRRbbb岲999:::;;;;;;<<<===ف>>>ٴ???>>>===YYYᕕ󶶶]]];;;ۂ;;;<<<ځ===ف>>>ن???؅>>>٦???@@@@@@؄@@@@@@؁??? 111򛛛¿ PPP222;;;===>>>???ق???555555觠@@?555<<<܁??? 111򚚚¿ PPP222;;;===>>>??????؈@@@؄???؁>>>ف======@@@===<<<ڂ;;;ddd四;;;<<<======ف>>>ٶ???؁>>>===???ځMMM>>>ۄ<<<ڂ===ف>>>ٲ???@@@@@@؆@@@@@@؁???111򜜜 QQQ333<<<===>>>ف???ف???777444jgdeb_555888??????111򛛛 QQQ333<<<===>>>??????؉@@@؅???؁>>>م===ق===BBBUUU<<<===ځ===ف>>>ٰ???؁@@@؅???؂>>>ه===ق>>>ٲ???@@@@@@؈@@@@@@???222𗗗 PPP444===>>>>>>???ق???;;;444CBA젙555666??????222𖖖 PPP444===>>>???ف???؊@@@؆???؆>>>ن===ف>>>م???؃@@@؃???ؒ@@@؅???؏@@@؅???؉>>>ٓ???؃@@@؅???@@@@@@؟@@@@@@???444|||¿¿@@@999===>>>ف???ك???555444袛A@@444;;;???444|||¿¿@@@999>>>>>>???ف???،@@@؉???؈>>>م???س@@@ؓ???@@@@@@ظ@@@@@@???>>>:::111>>>ځ>>>???ل???777444jgdifd444777???===::: 000>>>>>>???ف???؎@@@ؖ???ض@@@؏???@@@@@@غ@@@@@@???444NNN777777>>>ف???ك??????;;;444A@@졛444666???444NNN 777777>>>???ق???ؐ@@@ؓ???ع@@@؋???@@@@@@ؼ@@@@@@ ???444111QQQrrrttstsrssrsrrsrqrqprpoqpoppnponoononnnnnccbEEE000777>>>ځ>>>ف???ل??????555444蠚BBA444<<<܁???444111QQQrrrttstsrssrsrrsrqrqprpoqpoppnpon oononnnnnccbEEE000777>>>>>>???ف???ؔ@@@؎???؛@@@؍???ؔ@@@؅???@@@؜???@@@@@@@@@؁??????>>>888333222222333888<<<======>>>>>>ق??????؂??????777444:99444666???؁???>>>888333222222333888<<<======>>>>>>ق???ؽ@@@ؐ???@@@؃???؂???ْ>>>ق???ك???@@@؅???@@@@@@؁??????>>>>>>===<<<;;;܁:::ݐ:::ށ:::;;;<<<===ہ>>>ڇ???777444777???>>>>>>===<<<;;;܁:::ݐ::::::;;;;;;<<<===>>>>>>ف???ػ@@@؆???؄>>>ه???@@@؂??????ف>>>ف>>>ڒ===ځ>>>>>>ف???ق???@@@؉???@@@@@@??????>>>>>><<<;;;:::999888߂777777777888999:::;;;<<<===>>>>>>ن???===ځ???؁???>>>===<<<;;;:::999888߂777777777888999:::<<<===>>>???ف???ؑ@@@ح???؁>>>ل===ق>>>ى???؈@@@ؔ???؅@@@ؘ???ح@@@؂??????>>>>>>======ہ<<<ې<<<<<<ہ======>>>>>>???ف???ؿ@@@؍???@@@@@@ ??????>>><<<;;;999777666555444333333333 444555666777999;;;888666999>>>ه??? ??????>>>===<<<;;;999777666555444333333333 444555666888:::;;;===>>>??????؏@@@ح???؁>>>ف======ڂ<<<===ڂ===ف>>>ي???؂@@@غ???ة@@@؁??????>>>======<<<;;;;;;ݒ:::;;;<<<<<<===>>>>>>???ف???ؽ@@@؏???@@@@@@??????>>>>>>===<<<:::݁999ށ888ߎ777߁888߁999:::<<<======>>>???ي??????>>>>>>===<<<:::݁999ށ888ߎ777߁888999:::;;;<<<===>>>???ف???،@@@خ???؁>>>ف======<<<څ;;;<<<===ځ===ف>>>???ا@@@??????>>>>>>===<<<:::݁999ށ888ߎ777߁888999:::;;;<<<===>>>???ف???ػ@@@؆???؆>>>ٙ???؉@@@؍???؋@@@؂???؄@@@؞???@@@؉???؈@@@@@@؁??????>>>===<<<999444333222222111 222666777888999:::<<<888777:::???ى??????>>>===<<<999444333222222111 222666777888999;;;<<<===>>>??????؋@@@؈???؅>>>ٌ???؊>>>ن???؂>>>ف===<<<;;;;;;:::ۂ999ہ:::;;;;;;<<<===ځ===ق>>>َ???؄>>>ٲ???إ@@@؁??????>>>===<<<999444333222222111 222666777888999;;;<<<===>>>??????غ@@@؄???؂>>>م===ل>>>ف???ٖ???؂@@@ؔ???؄@@@ظ???؅@@@@@@؁???>>>===555000777FFEEEDDDDDDCDCCCCCCCBCBBBBB@@@222...555888999444333444:::ވ??????>>>===555000777FFEEEDDDDDDCDCCCCCCCBCBBBBB @@@222...555888:::;;;===>>>??????؊@@@؅???؄>>>ك===ٍ>>>ى===ه>>>ق======<<<;;;:::999ۄ888999999:::;;;;;;<<<===ڂ===ق>>>ه???؃>>>ك===ٮ>>>م???ؤ@@@؁???>>>===555000777FFEEEDDDDDDCDCCCCCCCBCBBBBB @@@222...555888:::;;;===>>>??????ع@@@؄???؁>>>ف======ځ<<<===ڂ===ف>>>???؃@@@@@@??????>>>333=== ~zyxUUU333444777222@@@샂444777??????>>>333=== ~zyxUUU333444999;;;<<<>>>??????؁@@@؃???؃@@@؄???؁>>>ك===ه===چ===ل===ڄ<<<ڇ===ڃ======ځ<<<;;;;;;:::999888777܂666777777܁888999:::ہ;;;ځ<<<===ڂ===ف>>>ل???؁>>>ف===م===ڭ===ف>>>ل???أ@@@??????>>>333=== ~zyxUUU333444999;;;<<<>>>??????د@@@؃???؄@@@؄???>>>ف===<<<ڄ;;;ځ<<<ځ===ى>>>???؂>>>و???؂@@@@@@??????===666\\[...777111555999444===ۂ???ل??????===666 \\[...888:::<<<===>>>???ه???@@@؄???؁>>>======ځ<<<ڨ;;; ::::::jjj蓓󠠠ddd777555ށ666777888999999:::;;;ہ;;;ځ<<<ځ===ق>>>???؁>>>ف===ف<<<چ;;;ڍ<<<===ڎ<<<ډ;;;ڃ<<<ځ===ف>>>ك???أ@@@??????===666 \\[...888:::<<<===>>>ف???ت@@@؈???؂@@@؃???؁>>>======ځ;;;:::ۂ999:::;;;;;;<<<===ڂ===>>>ل===ِ>>>ه???؏>>>و???ح>>>ق===ك>>>م???؁@@@@@@??????333qqq888555333222ꋊ_^]444999???ك???>>>333qqq 888666:::<<<===>>>ه??????@@@؃???>>>ف===<<<ځ;;;;;;ۑ:::ۍ999ۇ:::999999܊񻻻nnnWWWbbb荍󥥥LLL444555666777777888999܁999:::;;;;;;<<<======ك>>>ف===<<<;;;ځ:::ۂ999ۃ:::ۅ;;;ۂ:::ہ;;;ۅ;;;ڂ;;;:::ۅ;;;ۍ:::;;;;;;<<<======>>>ك???أ@@@??????333qqq 888666:::<<<===>>>ف???ت@@@؂???؅???ف@@@؃???؁>>>===<<<;;;:::999ۄ888999:::;;;ځ<<<======ن===ڎ===ق>>>ق???؂>>>َ===ق>>>ل???؂>>>٫===ل===ڂ===ف>>>ك???؁@@@@@@??????111𐐐JJJ111555222QQP444666???ك???>>>111JJJ111:::<<<===>>>>>>???ف>>>ف>>>>>>ف???ك???>>>======<<<;;;ځ:::ہ999ۆ999܄888999܄888܉777܆888܁999܂888@@@޺>>>555444ށ333www>>>444555555666777݁777888999999:::;;;<<<======ف>>>ف===<<<;;;:::999܅888܂999܁999ۆ999܇999ۉ999܉888܂999999:::;;;;;;======>>>ك???آ@@@??????111𐐐 JJJ111:::<<<===>>>ف???ة@@@؁???؁???ف>>>ف>>>>>>???@@@؃???؁>>>===<<<;;;:::999888777݂666777888999:::ی;;;ڂ<<<ڂ;;;څ<<<===ځ===ل>>>ف======ڍ<<<ځ===ق>>>???؂>>>ف======ڋ<<<ڃ;;;<<<ڍ;;;ڊ<<<څ;;;ځ<<<======ف>>>ك???@@@@@@??????111򚚚¿¿OOO111999222555ľ;::444===ۃ???ف??????>>>111򙙙¿¿ OOO111:::<<<===>>>ځ>>>>>>ڂ===>>>>>>???ق???>>>ف===<<<;;;:::999܈888܂777܂777݁777܁777݃666݆555݅666݁777݂777܁777 AAA߻555444333333222EEE㻻qqq333߁444ށ555ށ666777777888999:::;;;<<<ڃ======;;;:::999888777݁666݁777݁777܂888ܘ777܊777݂777888999999;;;<<<===>>>ك???آ@@@??????111򚚚¿¿ OOO111:::<<<===>>>ف???ة@@@؁??????>>>>>>ڂ===>>>>>>ك???؁>>>===<<<;;;:::999```攔NNN777888999܅:::ۃ999ی:::;;;ہ;;;<<<ځ===ق>>>======<<<ڈ;;;ڃ;;;ۂ;;;<<<ځ===ك>>>======<<<ڃ;;;څ;;;ۚ:::ہ;;;;;;ځ;;;ۂ:::ۂ999ہ:::;;;<<<======>>>ك???@@@@@@??????111򛛛¿¿OOO111999444333醃^\Z444999?????????>>>111򚚚¿¿OOO111:::<<<===>>>>>>>>>===ڂ======>>>>>>ق??? >>>===<<<;;;999999AAAWWW^^^XXXHHH888܁777777݆666555݂555666HHH???444ރ555ށ555݄666 555ݗ===444333222333uuuyyy333 444>>>QQQLLL888666777888999;;;;;;===ڂ===<<<;;;:::888777666݂555݁666݃777666<<>>ق???آ@@@??????111򛛛¿¿ OOO111:::<<<===>>>ف???ة@@@؁??????>>>===ڂ======>>>ڃ???>>>===<<<;;;:::999kkk黻xxxRRRKKKWWWDDD666777888܃999܈888܃999܂888܂999999:::;;;;;;<<<ڃ======<<<;;;ځ:::ہ999ۂ:::ۆ999ہ:::;;;<<<===ڃ======<<<;;;ځ:::ہ999ۆ999܋888܅999܁888܆999܃999999܅888999999;;;;;;======>>>ق???@@@@@@??????111򛛛¿¿PPP111999777333QPO444666?????????>>>111򚚚¿¿ PPP111:::<<<===ځ>>>ځ===<<<<<<<<<======>>>ځ???>>>======;;;:::[[[䛛888mmm鯯 bbb555ސ666TTT歭YYYxxx]]]譭nnn444އ񶶶DDD555<<<qqq~~~𖖖GGG222EEE㖖JJJ777999:::;;;<<<ځ===???ډ666@@@򶶶~~~999ށ555ށ444 ???򶶶~~~999555555^^^筭 nnn444ޡ444ށ𵵵III777888999;;;======>>>ق???آ@@@??????111򛛛¿¿ PPP111:::<<<===>>>ف???ة@@@ ??????>>>>>>===<<<<<<<<<======ڂ??? >>>======;;;:::999888ܦqqq555ނ444555555666777݃777777݅666777݄777܃777݁777܁888999;;;;;;===ځ======<<<;;;:::999܍888999:::;;;<<<===ځ======<<<;;;:::999ہ888܂777܆777݅666݂777݆777܁777݆777܂888܁777777݃666777777888999;;;<<<===>>>ك???@@@??????111򛛛¿¿PPP111999;;;333555<;;555<<<܃?????????>>>111򚚚¿¿ PPP111:::<<<===ځ>>>======<<<;;;<<<<<<===>>>ځ???>>>===<<<:::{{{컻nnn@@@777777GGGߪ999888:::ݰ888ނ444 ppp컻zzz333444ߨsss<<>>SSS充񥥥777888999;;;<<<===ځ=== 񻻻DDDBBBAAA@@@@@@@@@666>>>ߥUUU555eee麺666444333;;;দTTT333444ddd麺666ނ444@@@333333ނ𻻻ggg444 ZZZ绻555555666888999;;;<<<===>>>ق???آ@@@??????111򛛛¿¿ PPP111:::<<<===>>>ف???ة@@@ ??????>>>======<<<;;;<<<<<<===ہ???؁>>>===;;;:::999888KKKḸ]]]555ނ444ށ555ށ666777NNNQQQ999ޅ555555݅666݁555999>>>666777777999:::;;;<<<ځ===<<<;;;===AAA888܅777===QQQOOO999݂777777888999:::;;;<<<ځ===<<<;;;;;;999888777777݁666555݂555555݇555???QQQLLL888އ666555݇666777888NNNQQQ999ރ555555666777999:::;;;===>>>ك???@@@??????111򛛛¿¿PPP111999;;;555444{xa^[555999???>>>111򚚚¿¿ PPP111:::<<<===ځ>>>===UUU???;;;<<<======ځ???>>>===;;;rrr껻BBB666 777888999܋𴴴999999888ܮ555ށ444333kkk뻻uuu333;;;ỻ333222ߐLLL222:::333[[[绻444999222111111111󻻻222333444BBB666888999:::;;;===ځ===GGGܱggg777555555ށ444𪪪666𻻻ttt555ށ444555މ򻻻mmm333333߁񻻻rrr222333333444ވ򻻻mmm444333333ߠ:::333~~~ﻻaaa333 TTT滻444555666777999;;;<<<===>>>ق???آ@@@??????111򛛛¿¿ PPP111:::<<<===>>>ف???ة@@@??????>>>===UUU???;;;<<<===ہ???>>>===<<<;;;;;;pppꩩttt888555ރ444BBBᣣ{{{nnn뻻444QQQ䪪555444ރ𹹹AAA888999;;;<<<===ځ<<<ﹹ@@@߁666AAAߋ򶶶:::ށ666777888999:::;;;<<>>ك???@@@??????111򛛛¿¿PPP111999;;;888444MLK555666???>>>111򚚚¿¿ PPP111:::<<<===ځ>>>sss󻻻>>>;;;<<<======???>>>===<<>>ق???آ@@@??????111򛛛¿¿ PPP111:::<<<===>>>ف???ة@@@ ??????>>>sss󻻻>>>;;;<<<===ہ???>>>===;;;@@@ܙKKK666GGGዋ򻻻@@@555ށ444 333ކ񻻻ZZZSSSooo잞}}}444OOO444 888ߺeee@@@III:::888999;;;ڂ<<< ???ۺhhhBBBJJJ999555>>>ߥVVV555eee麺777ށ666777888:::;;;ځ<<< ???ۛ<<<777555888߲FFF222333[[[軻333߁222AAA⭭MMM>>>SSS充񤤤555@@@444aaa軻444ށ555񻻻[[[TTTooo잞}}}444555666888999;;;======>>>ق???@@@??????111򛛛¿¿PPP111999;;;<<<444555<<;555<<<܄???>>>111򚚚¿¿ PPP111:::<<<===ځ>>> UUU;;;<<<======???>>>===<<<ڂ666݁555666777999:::;;;ہ;;;:::999ۮ555444ށ333jjj뻻uuu333eee鸸CCC333333ߐLLL222333ߠ:::333[[[绻444555jjj곳񁨨RRR222HHH任222333߁444555777888:::;;;<<<ڂ===<<<ڕ󻻻777555݃555666JJJ⻻555݃555AAAỻ555HHH㻻222߁333߁444AAAỻ666444333ߠ:::333222333}}}𻻻aaa333 TTT滻444555666888999;;;===>>>ك???آ@@@??????111򛛛¿¿ PPP111:::<<<===>>>ف???ة@@@??????>>>٩ UUU;;;<<<===???>>>======;;;ۓ󻻻666555݁666777777܄ﻻ666444ށ333BBB333hhh껻xxx444III444333===ỻ333444555666777999;;;ۂ<<<DDDݻ777666݂555𻻻ttt555򻻻nnn555666777888999;;;;;;<<<;;;ڍ񋋋888666555ccc遻zzz111߁222UUU绻222111ߊ󻻻222߁333333AAA444:::333[[[绻444DDD444 hhh껻xxx444555666888999;;;======>>>ق???@@@??????111򛛛¿¿PPP111999<<<===666444yvra^Z555888???>>>111򚚚¿¿ PPP111:::<<<܁===>>>===ߩggg;;;<<<======???>>>===<<<ڧsss666555555666777999:::ۂ;;;:::999ۮ555444ށ333jjj뻻uuu333߁444JJJㆆ񭭭hhhꗗMMM333;;;333ށ333[[[绻444555UUU庺666444;;;૫???222MMM廻SSSTTTUUUPPP666777888:::;;;<<<ڂ======III޳aaa666݃555555QQQ㻻666݁555555<<<߁999OOO任333333ށ444555<<<߁:::߁444:::333~~~ﻻaaa333 TTT滻444555777888:::;;;===>>>ك???آ@@@??????111򛛛¿¿ PPP111:::<<<===>>>ف???ة@@@??????>>>===ߩggg;;; <<<===???>>>===<<>>ق???@@@??????111򛛛¿¿PPP111999<<<===:::444KJH555666???>>>111򙙙¿¿ PPP111:::<<<܁===>>>======<<<܁;;; <<<===>>>???>>>======ڹ___666݁555 666777999:::;;;;;;;;;:::999ܮ555333ށ333jjj뻻uuu444555555666777SSSvvvNNN444;;;߂444\\\绻555 666݆𻻻fff666555555ހﻻkkk333>>>ỻ666777999:::;;;<<<ڂ======<<>>߁555444555555BBB໻888݃666JJJ⻻666AAA໻666ށ555ށ555JJJ⻻666ށ555;;;߁444333~~~ﻻaaa333 333UUU廻555666777999;;;<<<===>>>ق???أ@@@??????111򛛛¿¿ PPP111:::<<<===>>>ف???ة@@@??????>>>======<<<܁;;; <<<===???>>>===<<<ږ666݁555666777888܁999444333222ߩ222߁333444hhh껻xxx444ށ555JJJ444333===ỻ333333444666777999;;;;;;ځ<<<DDDݻ666555݁555III⻻555AAA໻777666777888999;;;ځ<<<;;;ڍ񊊊777666AAAḸ>>>ⶶYYY111222UUU绻111HHH任222߄333:::333[[[绻444555ު555ނ444 iii껻xxx555666777888:::;;;===>>>ك???@@@??????111򛛛¿¿PPP111999<<<===>>>444555赬<;;555<<<܃???>>>111򙙙¿¿ PPP111:::<<<===ځ>>>======ۂ<<<<<<===>>>???>>>===BBBہYYY666777888999ۂ:::999888ܮ444333ށ333nnn컻uuu555555LLLjjjZZZ777666ݒOOO555݁666===555݁555aaa绻666 777݋򻻻___777777666xxxrrr555888ނ555KKK⻻777888999;;;<<<===ڂ======<<<;;;ۚ555ށ444555666ݤUUU777777kkk黻777666ݤTTT666݁777kkk黻777666ݠ<<<߂555𻻻bbb444 555ZZZ滻666777888:::;;;<<<===>>>ق???أ@@@??????111򛛛¿¿ PPP111:::<<<===>>>ف???ة@@@??????>>>======ۂ<<< <<<===???>>>======ڵjjj555݁555666777888܁999___偻===333222ߩ222333߁444iii껻xxx555JJJ444===໻333߁444666777999:::;;;ځ<<<DDDݻ666555݁555PPP任555݁555555<<<߁;;;777777999:::;;;ځ<<<;;;ڍ񊊊777555sss111߁222UUU绻111LLL廻TTTOOO333:::333[[[绻444ށ555555iii껻xxx666777999:::;;;===>>>ك???@@@??????111򛛛¿¿PPP111999<<<===>>>777444wsoc_\555888???>>>111򙙙¿¿ PPP111:::<<<===ځ>>>===^^^???<<<======>>>ځ???>>>>>>ڸ___777݂666777888999܂999999888ܮHHH333333444ߖhhh666777~~~888FFF777TTT777܁777񻻻www777܁888mmm黻|||999܁888QQQ666ccc绻qqq777nnn껻{{{888999:::;;;<<<ڃ======;;;;;;KKK൵\\\555ށ444555666eee軻888;;;ݤSSS888fff绻888;;;ݤSSS888 UUU777666:::ޥxxx777ށ666 𻻻}}}777888999;;;<<<===>>>ك???أ@@@??????111򛛛¿¿ PPP111:::<<<===>>>ف???ة@@@??????>>>>>>^^^???<<<======???>>>===JJJށXXX666݁555666777888܁999MMMၻRRR333222ߪ333߁444555jjj黻yyy666KKK555444>>>໻444555666777999;;;;;;ځ<<<DDDݻ777666݁555BBB໻888ރ666JJJ⻻777777888999;;;;;;ځ<<<;;;ڍ񊊊777555ޤOOO222YYY綶<<<333VVV滻111<<<⻻444;;;333333444[[[绻555555666ݪ666 jjj黻yyy777777888999;;;<<<===>>>ق???@@@@@@??????111򛛛¿PPP111999<<<===>>>:::444HFE훔555666???>>>111򙙙¿PPP111:::<<<===>>>>>>rrr򻻻???===>>>>>>ف???>>>===٥uuu888777݁666777777888܁999܁888777ܮ@@@777888KKKமaaaUUUyyy컻999^^^塡JJJ999999:::<<<ܚeeeGGGttt꺺 YYY888{{{~~~YYYnnn鲲@@@:::;;;;;;<<<ڄ======;;;:::999sss뻻;;;߁444 555666777}}}WWW[[[䚚lll999ۂ:::~~~XXX\\\㚚lll999___䡡򭭭OOO999:::;;;<<<======>>>ك???أ@@@??????111򛛛¿¿ PPP111:::<<<===>>>ف???ة@@@؁??????rrr򻻻???===>>>???>>>===OOO߁TTT666݁555666777܂888GGGXXX333444555ށ666jjj黻zzz777KKK666555>>>໻444555555666888999;;;;;;ځ<<<DDDݻ777܃666UUU777kkk黻888999:::;;;<<<===ځ<<<񊊊777OOO任222444߫mmm444VVV滻111222ߢ888߁555555KKK⻻555<<<߂555```軻666݁777777kkk黻zzz888999:::;;;<<<===>>>ق???@@@@@@??????111򛛛wutvts¿ PPP111:::<<<===ځ>>>444555讦>=<555<<<܂???>>>111򙙙(''''&¿ PPP111:::<<<===>>>===܂MMM>>>ځ>>>ف???>>>===ـ컻999888777777݁777888===HHH888777777ݮ555\\\獍󠠠QQQ888999:::;;;DDDvvvꕕ󢢢GGGނ;;; SSS{{{얖@@@[[[㌌񢢢YYY:::;;;ۂ;;;===ooo蕕󢢢yyyVVVUUUAAA:::;;;YYY⌌𠠠~~~BBB܁;;;ځ<<<ځ===ق>>>===<<<;;;:::999999ܞ555 555666777888XXX㋋񠠠OOO;;;ZZZ⌌𡡡PPP߂;;;<<>>ك???ؤ@@@??????111򛛛¿¿ PPP111:::<<<===>>>ف???ة@@@؁???===ۂMMM>>>>>>ف???===HHH܁[[[777݂666777777܁888NNN⁻OOO444666777888kkk黻zzz888LLL777666???߻555݁666777888:::;;;ڂ<<<EEEܻ888777777݁777fff绻999܁888;;;ݤSSS999:::;;;;;;<<<=========<<<ڍ񊊊777݃𻻻ttt333444|||555WWW滻222333aaa軻ppp666݁777nnn껻zzz777SSS666񻻻www777܁888999lll軻{{{999:::;;;<<<===ف>>>ق???@@@@@@??????111򛛛wutvts¿PPP111:::<<<===>>>???777555qmib^[555888??? >>>111򙙙BBA543A@?¿PPP111:::<<<===>>>???BBB㻻]]]>>>ق???ق???>>>JJJܴYYY999܄888ppp곳888777777ݮ555݁666777888999;;;;;;ځ<<<ڂ===ڌ<<<;;;ڃ<<<===ڃ======ڎ<<<===ځ===ل>>>mmm~~~;;;;;;999888MMM᷷WWW555666777888999:::ہ;;;ڄ<<<ځ===ڃ===ف===ڃ<<<ڃ===ڃ<<<ڈ;;;ځ<<<===ځ===>>>ل???ؤ@@@??????111򛛛zxv%$#$$#TSQ0/./.. PPP111:::<<<===>>>ف???ة@@@؂???BBB㻻]]]>>>ف???>>>===ڱooo777܂666777݂777ddd绻;;;```畕777888999ܐ򤤤{{{::: RRRᡡMMM888ggg蝝DDD999;;;ہ<<<===kkk柟 DDD999999}}}XXX\\\㚚lll:::ہ;;;<<<ڃ===<<<ڍ񊊊999ݯAAA333444555HHHẺNNNXXX廻333444yyy}}}XXXnnn鲲@@@^^^塡JJJ999999ccc斖:::򤤤{{{;;;ہ;;;<<<======>>>ك???@@@@@@??????111򛛛wutvts¿PPP111:::<<<===>>>???;;;555GFD흕555666???؁???>>>111򙙙wutvts¿ PPP111:::<<<===>>>???ف???؂???م???؁>>>kkk滻PPP999999܂888𳳳888777ܮ666݁777888999:::;;;<<<===ڗ===ل>>>ُ===ق>>>ف???؁>>><<<;;;:::999888xxx컻;;;777888999:::;;;<<<===څ===م>>>َ===ك===څ===ف>>>ل???إ@@@$??????111򛛛322¿=<;$$#HFEkhfGFEusqPPP111:::<<<===>>>ف???ت@@@؃???؂???ك???>>>===ُ񻻻888777܂777݂777𻻻666:::___把񞞞999ہ:::LLLwwwꝝooo;;;NNNxxx땕GGG999<<>>ف===<<<ڍ񊊊bbb绻444555555666777ܛYYY廻444555555777VVV㋋񠠠~~~BBB:::;;;RRR{{{얖???ZZZ㌌񢢢YYY:::;;;>>>bbb匌𠠠;;;MMMwwwꝝooo<<<ځ===>>>ك???؁@@@@@@??????111򛛛wutvts¿+PPP111:::<<<===>>>??????555555誡>==555<<>>111򚚚wutvts¿ PPP111:::<<<===>>>???ً??? >>>===jjj洴___PPP[[[}}}999888ܮ888999:::;;;<<<ځ===ٗ>>>ك???ؐ>>>م???>>>مpppeeedddeee籱999999:::;;;<<<ځ===ن>>>ك???ؙ>>>م???ئ@@@??????111򛛛322¿IHG<;:0/. PPP111:::<<<===>>>ف???ث@@@؊???>>>VVV຺III߁888܃777BBB߳___777܁888999:::;;;;;;ځ<<<ڃ===ڂ<<<ځ;;;ځ:::ہ999𠠠:::;;;;;;<<<===ځ===ف>>>===ي<<<ڃ;;;ځ<<<ڃ===ځ<<<ځ===ڂ===ك>>>===<<<ڍ񋋋𓓓󻻻eee666777888999kkk误\\\廻555666777888999:::ہ;;;ڇ<<<ڄ;;;ڃ<<<ځ======ك===چ===>>>ل???؁@@@@@@??????111򛛛wutvts¿+PPP111:::<<<===>>>??????777555ojfd`^555888??????>>>111򚚚wutvts¿ PPP111:::<<<===>>>ف???؇@@@؃???>>>===III~~~죣qqq:::RRRbbb岲999:::;;;;;;<<<===ف>>>ٳ???vvv鄡:::ہ;;;<<<ځ===ف>>>٨???ا@@@$??????111򛛛 322221211WVU¿ ywuHFEvtqPPP111:::<<<===>>>ف???ز@@@؃???>>>===ـ컻>>>999999܁888 :::ݕ888999999:::;;;;;;<<<===ڇ======ځ<<<ځ;;;ځ;;;LLL}}};;;ځ<<<ځ===ل>>>OOO===ق===ڊ===ق>>>ق???>>>ف===񓓓󸸸<<<777܁888999:::@@@ܳ777888999;;;;;;<<<===ڑ===ٌ>>>ل???؂@@@@@@??????111򛛛wutvts¿ PPP222;;;<<<===>>>ف???;;;555DCB요555666??????>>>111򚚚wutvts¿ PPP222;;;<<<>>>??????؈@@@؄???؁>>>ف======@@@===<<<ڂ;;;ddd四;;;<<<======ف>>>ٵ???>>>ف======ڂ<<<ڂ;;;ځ<<<======ف>>>٩???ب@@@%??????111򛛛&&&¿10/UTS=<:0/._][PPP222;;;<<<>>>??????ش@@@؃???؁>>> gggEEEDDDbbb栠<<<܁:::;;;;;;<<<===ځ===ه>>>===كiii<<<ځ;;;ڂ<<<===ځ===ق>>>ك???؂>>>ق===ً>>>م???EEEZZZ៟999999:::ۂ;;; 𯯯VVV@@@999:::;;;<<<===ځ===ٙ>>>ى???؂@@@@@@؁???111򛛛wutvts¿ PPP222;;;===>>>???ق???555555觠@@?555<<<܁???111򚚚wutvts¿ PPP222;;;===>>>??????؉@@@؅???؁>>>م===ق===BBBUUU<<<===ځ===ف>>>ٷ???؁>>>ى===ف>>>و???؂@@@؛???ث@@@؁???111򛛛322¿ PPP222;;;===>>>??????ص@@@؃???>>>===^^^♙ddd;;;ہ;;;<<<===ځ===ف>>>ن???؁>>>===ڂ===ق>>>و???؂>>>ّ???cccメ```;;;ہ;;;<<<ځ===ddd䂡```;;;<<<======ف>>>٢???؃@@@@@@؁???111򜜜554\[Z\[Y'&& QQQ333<<<===>>>ف???ف???777444jgdeb_555888??????111򛛛wutvts¿ QQQ333<<<===>>>??????؊@@@؆???؆>>>ن===ف>>>م???؃@@@؃???ؒ@@@؅???؍@@@؆???؉>>>ه???ؕ@@@؄???ز@@@؁???111򜜜 322221211210¿¿ QQQ333<<<===>>>??????ص@@@؄???؁>>>===@@@OOOPPP@@@ۄ<<<===ځ===ف>>>ي???]]]ᆆMMM݃===ق>>>١???؁>>>======ڃ<<<چ===ك<<<===ځ===ف>>>١???؅@@@@@@???222𗗗 PPP444===>>>>>>???ق???;;;444CBA젙555666??????222𖖖wutvts PPP444===>>>???ف???،@@@؉???؈>>>م???ر@@@ؔ???@@@???222𗗗 PPP444===>>>???ف???ض@@@؄???؂>>>و===ف>>>ٍ???؆>>>ٜ???؂@@@؄???؁>>>ل===ن>>>ل===ف>>>٠???؈@@@@@@???444|||kjikig¿¿@@@999===>>>???ل???666444袛A@@444;;;???444|||¿¿@@@999>>>>>>???ف???؍@@@ؖ???؝@@@؂???ؒ@@@ؒ???@@@???444|||¿¿@@@999>>>>>>???ف???ط@@@؅???؉>>>ه???؂@@@ؑ???؅@@@؅???؎@@@؅???؄>>>ن???؄>>>و???آ@@@@@@???>>>::: 111>>>>>>ف???ل???777444jgdifd444777???===::: 000>>>>>>???ف???ؐ@@@ؓ???؛@@@؉???ؑ@@@ؓ???@@@???>>>::: 000>>>>>>???ف???ع@@@ؓ???؇@@@؍???؝@@@ؚ???ئ@@@@@@???444NNN777777>>>???م???;;;444A@@졛444666???444NNN 777777>>>???ق???@@@@@@???444NNN 777777>>>>>>ق???٪???ؐ@@@؏???؊@@@؊???ؠ@@@ؘ???ا@@@@@@ ???444111QQQrrrttstsrssrsrrsrqrqprpoqpoppnpon oononnnnnccbEEE111777>>>>>>???ه???666444蠚BBA444<<<܁???444111QQQrrrttstsrssrsrrsrqrqprpoqpoppnponoononnnnnccbEEE111888>>>ف???ف???@@@@@@ ???444111QQQrrrttstsrssrsrrsrqrqprpoqpoppnponoononnnnnccbEEE111777===ځ>>>ڨ>>>ق???ك???ؐ@@@؋???؎@@@؆???إ@@@؇???؂@@@؇???ت@@@@@@؁???؁???999444333444999߁===>>>>>>???ه???888444;::444666???؂???999444333444999===ځ>>>>>>???ق???ؓ@@@؎???؛@@@؍???ؑ@@@ؓ???@@@؁???؁???999444333444999===۬===ځ>>>>>>ف???ق???ؑ@@@؇???@@@@@@؂??????>>>>>>======<<<ۑ<<<܁<<<======>>>ځ>>>???م??????777444777???؁???>>>>>>======<<<ۑ<<<܁<<<======>>>>>>???ف???ؽ@@@ؐ???ؖ@@@؍???@@@؂??????>>>>>>======<<<ۿ<<<<<<ہ======>>>>>>???ف???@@@ؕ@@@@@@؁??????>>>======<<<;;;;;;ݒ:::;;;;;;<<<======>>>ف???ن???>>>ڃ??????>>>======<<<;;;;;;ݒ:::;;;<<<<<<===>>>>>>???ف???غ@@@؆???؄>>>ه???ؔ@@@؅???؃>>>م???@@@؁??????>>>======<<<;;;;;;:::;;;<<<<<<===>>>>>>???ف???@@@ؔ@@@@@@??????>>>>>>===<<<:::݁999ށ888ߎ777߁888߁999:::<<<===999777:::???ى??????>>>======<<<:::݁999ށ888ߎ777߁888999:::;;;<<<===>>>???ف???ؑ@@@ح???؁>>>ل===ق>>>ى???؈@@@؊???؂>>>ف===ق>>>َ???؂@@@ؑ???ت@@@??????>>>>>>===<<<:::݁999ށ888߼777߁888999:::;;;<<<===>>>???ف???@@@ؔ@@@@@@؁??????>>>===<<<999444333222222111222666777888999:::444333444:::ވ???؁???>>>===<<<999444333222222111 222666777888999;;;<<<===>>>??????؏@@@ح???؁>>>ف======ڂ<<<===ڂ===ف>>>ي???؂@@@،???؁>>>ف===ف===ڂ===>>>٦???إ@@@؁??????>>>===<<<999444333222222111 222666777888999;;;<<<===>>>??????؎@@@؂???؉@@@؇???؁@@@ؒ???؂@@@؆???@@@@@@؁???>>>===555000777FFEEEDDDDDDCDCCCCCCCBCBBBBB @@@222...555888777222@@@샂444777??????>>>===555000777FFEEEDDDDDDCDCCCCCCCBCBBBBB @@@222...555888:::;;;===>>>??????؁@@@؃???؆@@@خ???؁>>>ف======<<<څ;;;<<<===ځ===ف>>>ٖ???؁>>>ف===ف<<<ڂ;;;<<<ځ===ف>>>٥???ؤ@@@؁???>>>===555000777FFFEEEEEDEDDDDDDDCDCCCCCCCBCBBBBB @@@222...555888:::;;;===>>>??????؋@@@ظ???@@@@@@??????>>>333===~zyxUUU333444888222555999444===ۂ???ل??????>>>333=== ~zyxUUU333444999;;;<<<>>>>>>ى???؂@@@؈???؅>>>ٌ???؊>>>ن???؂>>>ف===<<<;;;;;;:::ۂ999ہ:::;;;;;;<<<===ځ===ق>>>َ???؅>>>ف===<<<;;;;;;ۂ:::;;;<<<======ف>>>ٙ???؃>>>و???آ@@@??????>>>333=== ~yyxUUU333444999;;;<<<>>>??????؁@@@؃???؃@@@ؼ???@@@@@@??????===666\\[...888333222ꋊ`^\444999???ك??????===666 \\[...888:::<<<===>>>ه???ق???@@@؅???؄>>>ك===ٍ>>>ى===ه>>>ق======<<<;;;:::999ۄ888999999:::;;;;;;<<<===ڂ===ق>>>و???؃>>>ل======<<<;;;:::999ۂ999:::;;;;;;======ٚ>>>ك===ك>>>ل???آ@@@ ??????===666 \\\...888:::<<<===>>>???ن???؁@@@؞???؅>>>ٙ???@@@@@@??????333qqq888555555222SSQ𛘔444666???ق???>>>333ppp888666:::<<<===>>>>>>???ف>>>ف>>>>>>ف???ن???؁>>>ك===ه===چ===ل===ڄ<<<ڇ===ڃ======ځ<<<;;;;;;:::999888777܂666777777܁888999:::ہ;;;ځ<<<===ڂ===ف>>>ل???؁>>>ق===ل===ځ<<<;;;:::999888܂777888999;;;;;;<<<ژ===ق===ځ<<<ځ===ڂ===>>>ل???ء@@@??????333qqq 888666:::<<<===>>>ه???@@@؅???؅>>>ل???؏>>>ل===ٔ>>>م???@@@@@@??????111𐐐JJJ111999222666ľ;::444===ۃ???ف??????>>>111 JJJ111:::<<<===>>>ځ>>>>>>ڂ===>>>>>>ف???ل???؁>>>======ځ<<<ڨ;;; ::::::jjj蓓󠠠ddd777555ށ666777888999999:::;;;ہ;;;ځ<<<ځ===ق>>>???؂>>>======ځ<<<څ;;;rrr郣666777888999:::;;;څ<<<;;;ډ<<<ڂ;;;ڃ<<<ڇ;;;ځ<<<ځ===>>>ل???ؠ@@@ ??????111𐐐¿¿ JJJ111:::<<<===>>>>>>???ف>>>ف>>>>>>???ل???؁>>>ل===ن>>>ق===ك===څ===ه===ړ===ف>>>ل???@@@@@@??????111򚚚¿¿OOO111999444333鈅^\Z444999?????????>>>111򙙙¿¿OOO111:::<<<===>>>>>>>>>===ڂ======>>>>>>???ك???>>>ف===<<<ځ;;;;;;ۑ:::ۍ999ۇ:::999999܊񻻻nnnWWWbbb荍󥥥LLL444555666777777888999܁999:::;;;;;;<<<======ك>>>ف===ف<<<;;;;;;ۅ:::;;;MMM෷HHH888ށ555666777888999܁:::ۂ;;;ۃ:::;;;ۅ;;;;;;ۉ:::ۄ999ہ:::;;;<<<======>>>ك???ؠ@@@ ??????111򚚚¿ ÿ¿¿¾ OOO111:::<<<===>>>ځ>>>>>>ڂ===>>>>>>ك???؁>>>======ڂ<<<===ځ===ف>>>ق===ف<<<چ;;;ڂ<<<ڊ;;;ڐ<<<ځ===ف>>>ك???@@@@@@??????111򛛛¿¿OOO111999777333QPO444666?????????>>>111򚚚¿¿ OOO111:::<<<===ځ>>>ځ===<<<<<<<<<======>>>>>>ف??????>>>======<<<;;;ځ:::ہ999ۆ999܄888999܄888܉777܆888܁999܂888@@@޺>>>555444ށ333www>>>444555555666777݁777888999999:::;;;<<<======ف>>>ف======ځ;;;:::999ۅ999܁888555ނ444555666777777888܃999܂888999܁999ۂ:::ہ999ہ999888܄999܃888܂777܁888999:::;;;<<<===ف>>>ق???ؠ@@@ ??????111򛛛¿ ÿ¿¿¾ OOO111:::<<<===>>>>>>>>>===ڂ===ہ===ڂ???؁>>>===<<<ڄ;;;<<<===ڂ======<<<;;;;;;ہ:::ۂ999ۆ:::ۅ999ۉ:::ۂ;;;ۄ:::ہ;;;<<<======ف>>>ك???@@@@@@??????111򛛛¿¿PPP111999;;;333666<;;555<<<܃?????????>>>111򚚚¿¿ PPP111:::<<<===ځ>>> ======<<<;;;<<<<<<===>>>>>>???ف>>>ف===<<<;;;:::999܈888܂777܂777݁777܁777݃666݆555݅666݁777݂777܁777 AAA߻555444333333222EEE㻻qqq333߁444ށ555ށ666777777888999:::;;;<<<ڄ===<<<;;;:::999ہ888܅777777ݳ555444333ށ444555555666݇777777܅888܂777777݄777܁777݅666777777888:::;;;<<<===>>>ق???ؠ@@@ ??????111򛛛¿ ÿ¿¿¾PPP111:::<<<===ځ>>>ځ===<<<<<<<<<======ڂ???>>>===<<<;;;ځ:::ہ999:::ہ;;;ڂ<<<;;;;;;:::999ۓ888܄999܁888܄999܁888܁999999:::;;;<<<ځ===>>>ك???@@@@@@??????111򛛛¿¿PPP111999;;;555444}za^[555999???>>>111򚚚¿¿ PPP111:::<<<===ځ>>>===UUU???;;;<<<======ڃ>>> ===<<<;;;999999AAAWWW^^^XXXHHH888܁777777݆666555݂555666HHH???444ރ555ށ555݄666 555ݗ===444333222333uuuyyy333 444>>>QQQLLL888666777888999;;;;;;===ڂ=========PPP\\\^^^RRR:::݆666444;;;999333߁444ޅ555???QQQLLL888ށ666777݂777777@@@RRRLLL888ބ666777LLLNNN888ރ555ށ666777999;;;<<<===>>>ك???؟@@@ ??????111򛛛¿ ÿ¿¿¾PPP111:::<<<===ځ>>>======<<<;;;<<<<<<===ۂ???>>>===;;;:::999ۂ888999999;;;ۂ;;;;;;999888777777݅666݃777݆666777݅777܈777݁777888999:::;;;<<<===>>>ك???@@@@@@??????111򛛛¿¿PPP111999;;;888444NML555666???>>>111򚚚¿¿ PPP111:::<<<===ځ>>>sss󻻻>>>;;;<<<======ځ>>>=========;;;:::[[[䛛888mmm鯯 bbb555ސ666TTT歭YYYxxx]]]譭nnn444އ񶶶DDD555<<<qqq~~~𖖖GGG222EEE㖖JJJ777999:::;;;<<<ڂ===~~~촴BBB555{{{:::߂444333FFF㖖III666HHHᗗIII555^^^竫 {{{򻻻666777888:::;;;===>>>ك???؟@@@ ??????111򛛛¿ ÿ¿¿¾PPP111:::<<<===ځ>>>===UUU???;;;<<<===ہ???>>>===<<<;;;999888777܁777777888999ۂ:::;;;LLLBBB666555݁555ށ444ށ555555777MMMQQQ999ޅ555555666HHHSSSMMM999666555݄555 ???QQQLLL888666777888999;;;<<<ځ===>>>ك???@@@@@@??????111򛛛¿¿PPP111999;;;<<<444555<<;555<<<܄???>>>111򚚚¿¿ PPP111:::<<<===ځ>>>UUU;;;<<<======ځ>>>======<<<:::{{{컻nnn@@@777777GGGߪ999888:::ݰ888ނ444 ppp컻zzz333444ߨsss<<>>SSS充񥥥777888999;;;<<<===ځ=== 󶶶bbb<<<888999bbb误CCC444 555޳CCC333888lll붶<<<333AAA⭭MMM>>>SSS充񤤤555CCC᭭NNN>>>SSS億񤤤444SSS常WWWVVV{{{ﱱ^^^444555666888:::;;;===>>>ك???؟@@@ ??????111򛛛¿ ÿ¿¿¾PPP111:::<<<===ځ>>>sss󻻻>>>;;;<<<===ہ???>>>bbb㸸ZZZ666777888999999YYY㮮 ZZZyyy333444BBBᣣ{{{nnn뻻444===ర}}}555ނ444FFF▖ JJJ777999:::;;;======>>>ك???@@@@@@??????111򛛛¿¿PPP111999<<<===666444yvra^Z555888???>>>111򚚚¿¿ PPP111:::<<<܁===>>>===ߩggg;;;<<<======ځ>>><<<===;;;rrr껻BBB666 777888999܋𴴴999999888ܮ555ށ444333kkk뻻uuu333;;;ỻ333222ߐLLL222:::333[[[绻444999222111111111󻻻222333444BBB666888999:::;;;<<<======ڗ󥥥:::999777666555```軻444444ނ333ggg껻333222ߊ󻻻111222߁333AAA444򻻻333@@@333ߛ|||333 񻻻YYY444555666888999;;;===>>>ك???؟@@@ ??????111򛛛¿ ÿ¿¿¾PPP111:::<<<===ځ>>>UUU;;;<<<===ہ???>>>===<<<ژooo555݂555666777܁888 uuu>>>PPP䆆񯯯RRR222߁333򻻻[[[TTTooo잞}}}444@@@ỻ\\\555444RRR幹vvv333AAA⭭MMM>>>SSS充񥥥777888999;;;<<<===>>>ك???@@@@@@??????111򛛛¿¿PPP111999<<<===:::444KJH555666???>>>111򙙙¿¿ PPP111:::<<<܁===>>>======<<<܁;;;<<<===>>>ځ>>>ف<<<JJJ޶PPP555666777888999qqq鳳:::999999ܮ555444333333jjj뻻uuu333444߱999333LLL222:::333[[[绻444WWW榦cccPPP333߂111444൵;;;111߁222333444555666777999:::;;;<<<ځ=== 󘘘:::999777666555???ỻ333߂444444333ށ333444߫;;;555൵:::111 111222333333444777ߵ<<<333߁222߂333<<<Ẻ:::222߂333 񻻻YYY444555666888999;;;===>>>ك???؟@@@ ??????111򛛛¿ ÿ¿¿¾PPP111:::<<<܁===>>>===ߩggg;;;<<<===ہ???>>>===<<<ڑ򻻻fff555ނ444 555666777???޻666555444333ߐLLL222333ߤBBB333߁333hhh껻xxx444@@@ỻ???444333222ߊ󻻻222߁333444BBB666888999;;;<<<===>>>ك???@@@@@@??????111򛛛¿¿PPP111999<<<===>>>444555踯<;;555<<<܃???>>>111򙙙¿¿ PPP111:::<<<===ځ>>>======ۂ<<<<<<===>>>ځ>>>ف<<<666݁555666777999:::;;;ہ;;;:::999ۮ555444ށ333jjj뻻uuu333eee鸸CCC333333ߐLLL222333ߠ:::333[[[绻444555jjj곳񁨨RRR222HHH任222333߁444555777888:::;;;<<<ځ=== [[[XXX:::888777555444YYY绻333ށ444555޳444ށ333333ߏZZZIII任111222߁333444JJJ㻻333NNN廻222߂333 333ކ񻻻YYY444555666888999;;;===>>>ك???؟@@@ ??????111򛛛¿ ÿ¿¿¾PPP111:::<<<܁===>>>======<<<܁;;;<<<===ہ???>>>===<<<ڑ򻻻fff555444333߁444 555666777ݲ;;;555444333ߐLLL222333333444hhh껻xxx444666GGG444RRR常333555൵<<<222 333444555666777999:::;;;======>>>ق???@@@@@@??????111򛛛¿¿PPP111999<<<===>>>777444xsoc_\555888???>>>111򙙙¿¿ PPP111:::<<<===ځ>>>===^^^???<<<======>>>ځ>>>ف<<< sss666555555666777999:::ۂ;;;:::999ۮ555444ށ333jjj뻻uuu333߁444JJJㆆ񭭭hhhꗗMMM333;;;333ށ333[[[绻444555UUU庺666444;;;૫???222MMM廻SSSTTTUUUPPP666777888:::;;;<<<ځ=== <<<;;;999888666555WWW欬444ށ555555ݳ555ރ444򻻻fffMMM廻SSSTTTOOO444NNN任UUUTTTOOONNN任333߁444 񻻻YYY444555666777999;;;===>>>ك???؟@@@ ??????111򛛛¿ ÿ¿¿¾PPP111:::<<<===ځ>>>======ۂ<<<<<<===ځ???>>>===<<<ڑ򻻻fff444ނ333߁444ށ555fff鸸DDD444333ߐLLL222333ߪ444iii껻xxx444FFFⅅ񸸸xxx333III㻻333 444555666777888:::;;;======>>>ق???@@@@@@??????111򛛛¿¿PPP111999<<<===>>>:::444HFE훔555666???>>>111򙙙¿¿PPP111:::<<<===>>>>>>rrr򻻻???===>>>ڂ>>><<<===ڹ___666݁555 666777999:::;;;;;;;;;:::999ܮ555333ށ333jjj뻻uuu444555555666777SSSvvvNNN444;;;߂444\\\绻555 666݆𻻻fff666555555ހﻻkkk333>>>ỻ666777888:::;;;<<<ځ===<<<;;;999888bbb皚JJJ444555ށ666555݁555ށ444```???ỻ555@@@໻<<<຺444 񻻻YYY444555666777999;;;===>>>ك???؟@@@ ??????111򛛛¿ ÿ¿¿¾PPP111:::<<<===ځ>>>===^^^???<<<======ځ??? >>>===<<<ڑ򻻻tttrrrccc@@@333߃444JJJㆆ񭭭hhhꗗMMM333333ު444ށ555iii껻xxx555888ނ𸸸kkk444NNN任UUUTTTUUUPPP666777888:::;;;======>>>ق???@@@@@@??????111򛛛¿¿ PPP111:::<<<===ځ>>>444555讦>=<555<<<܂???>>>111򙙙¿¿ PPP111:::<<<===>>>===܂MMM>>>ڃ>>>===BBBہYYY666777888999ۂ:::999888ܮ444333ށ333nnn컻uuu555555LLLjjjZZZ777666ݒOOO555݁666===555݁555aaa绻666 777݋򻻻___777777666xxxrrr555888ނ555KKK⻻777888999;;;;;;<<<ځ===<<<;;;ggg稨BBB444555666݁777666555===ߴEEE555ޢ999ނ555KKK⻻666:::ނ666KKK⻻555ݙKKK555 555ކ񻻻YYY444555666777999;;;===>>>ق???ؠ@@@ ??????111򛛛332¿ ÿ¿¿¾PPP111:::<<<===>>>>>>rrr򻻻???===>>>ځ??? >>>===<<<ڑ򻻻򎎎󪪪:::333ރ444555RRRvvvNNN444555ު555ށ555666jjj黻yyy666𻻻nnn888ނ555@@@໻ 666777999:::;;;======>>>ق???@@@@@@??????111򛛛¿¿PPP111:::<<<===>>>???777555sokb^[555888???>>>111򙙙¿¿PPP111:::<<<===>>>???BBB㻻]]]>>>???>>>ف???>>>===>>>ڸ___777݂666777888999܂999999888ܮHHH333333444ߖhhh666777~~~888FFF777TTT777܁777񻻻www777܁888mmm黻|||999܁888QQQ666ccc绻qqq777 nnn껻{{{888999:::;;;<<<=========<<<چvvv@@@444555ށ666 777888ܳBBB777777999ݏ󻻻777ccc绻qqq777nnn껻zzz777888ddd绻rrr888܁777nnn껻zzz777TTT㹹999݁777 666݇񻻻YYY444555666888999;;;===>>>ق???ؠ@@@ ??????111򛛛332¿ ÿ¿¿¾ PPP111:::<<<===>>>===܂MMM>>>>>>ف???>>>===<<<ڑ򻻻fff555333444ttt555333JJJhhhXXX555OOO555݁666777777jjj黻zzz777JJJ777666DDDEEE666:::ނ666 KKK⻻777888999;;;<<<===>>>ك???@@@@@@??????111򛛛¿¿PPP111:::<<<===>>>???;;;555GFD흕555666???؁???>>>111򙙙¿¿ PPP111:::<<<===>>>???ف???؂???ك???؁>>>===٥uuu888777݁666777777888܁999܁888777ܮ@@@777888KKKமaaaUUUyyy컻999^^^塡JJJ999999:::<<<ܚeeeGGGttt꺺 YYY888{{{~~~YYYnnn鲲@@@:::;;;;;;<<<ڃ===YYY⁻;;;ރ555555666777nnn顡􌌌񫫫JJJ888܁999|||츸~~~YYYnnn鲲@@@݂999|||츸YYYnnn鲲@@@݁999ggg綶dddPPP___柟ZZZ555666888:::;;;===>>>ق???ؠ@@@ ??????111򛛛ssr~}332322221XWV 21011010/ %$#¾ PPP111:::<<<===>>>???BBB㻻]]]>>>???>>>ف???>>>===<<<ڑ򻻻fff555444ށ333fff444|||ﻻ666EEE777888lll軻zzz999888999ܣ999܁888񆆆888ddd绻rrr888 777nnn껻{{{888999:::;;;<<<===>>>ك???@@@@@@??????111򛛛¿¿+PPP111:::<<<===>>>??????555555誡>==555<<>>111򚚚¿¿ PPP111:::<<<===>>>???ى???>>>===ـ컻999888777777݁777888===HHH888777777ݮ555\\\獍󠠠QQQ888999:::;;;DDDvvvꕕ󢢢GGGނ;;; SSS{{{얖@@@[[[㌌񢢢YYY:::;;;ۂ;;;===ooo蕕󢢢yyyVVVUUUAAA:::;;;YYY⌌𠠠~~~BBB܁;;;ځ<<<ځ===ف>>>===uuu黻888777666݁555݁666 777888:::XXXぁ@@@www뜜FFFށ:::;;;ہ;;;YYY⌌𠠠BBB܄;;;YYY⌌𡡡BBB܂;;;;;;KKKށ힞[[[555666777888:::;;;===>>>ق???ؠ@@@+??????111򛛛 332eededcXWW221KIIomlJIHzxvJIHb`_ÿ¾ PPP111:::<<<===>>>???ف???؂???ك???>>>===<<<ڑ򻻻ggg555݁444 333sss컻444GGG⭭___SSSxxx컻999ccc斖:::򤤤{{{:::hhh绻RRRbbb婩999 :::|||츸YYYnnn鲲@@@:::;;;;;;<<<===ف>>>ق???@@@@@@??????111򛛛¿¿+PPP111:::<<<===>>>??????777555ojfd`^555888??????>>>111򚚚¿¿ PPP111:::<<<===>>>ف???؅@@@؂???؁>>>JJJܴYYY999܄888ppp곳888777777ݮ555݁666777888999;;;;;;ځ<<<ڂ===ڌ<<<;;;ڃ<<<===ڃ======ڎ<<<===ځ===ك>>>===qqq軻999888777܁666ooo888999:::;;;ۆ;;;ڄ<<<ځ===څ<<<څ===ڈ<<<ځ;;;:::ۉ𻻻\\\777888999;;;<<<===>>>ق???ؠ@@@+??????111򛛛332222&%%KKIpnm210¿100IHGb`^a`^ywu¾ PPP111:::<<<===>>>???و???>>>===<<<ڑ򻻻ggg666555ށ444kkk뻻555666???ttt디GGG:::;;;>>>bbb匌🟟;;;MMMwwwꝝooo;;;\\\㎎񡡡]]];;;YYY⌌𡡡BBB܁;;;ځ<<<===ف>>>ك???@@@@@@??????111򛛛655¿¿+PPP111:::<<<===>>>??????;;;555DCB요555666??????>>>111򚚚¿@?> PPP111:::<<<===>>>ف???؆@@@؂???؁>>>kkk滻PPP999999܂888𳳳888777ܮ666݁777888999:::;;;<<<===ڗ===ل>>>ُ===ق>>>ف???؁>>>LLLݸ???999ہ888;;;ݹppp999999:::;;;ځ<<<ځ===ڑ===ك>>>ى======<<<;;;ډ𻻻\\\888999:::;;;<<<===>>>ق???ؠ@@@+??????111򛛛srr@@@fee332~}}~}{?>>}{zKII{zxJIHb`_a`^=<;¾ PPP111:::<<<===>>>ف???؄@@@؂???>>>======ڑ򻻻ggg777666555555ﻻ666777888999:::;;;ۂ;;;ڃ<<<ڋ===ځ===ق===ڂ<<<څ===ڃ<<<===ځ===ف>>>ك???@@@@@@??????111򛛛(((PONONMONLNMLNLKMLJsqn PPP222;;;<<<>>>>>>ق???555555觠@@?555<<<܁???111򚚚yyxyxwxwvwvtwutvtsusqtsq332&&% PPP222;;;<<<>>>??????؇@@@؃??? >>>===jjj洴___PPP[[[}}}999888ܮ888999:::;;;<<<ځ===ٗ>>>ك???ؐ>>>م???؁>>> uuu黻^^^HHHSSSↆ𻻻ppp:::;;;;;;<<<===ڂ===ْ>>>ق???؉>>>ف===<<<ډ𻻻]]]999:::;;;<<<===>>>ك???ؠ@@@ ??????111򛛛srr332322edd&%%XWVKJI%%%ca`%$$b`^%$#¾ PPP222;;;<<<>>>??????؅@@@؂???؁>>>===ّ򻻻hhh888777777GGGᱱ\\\888999999:::;;;ځ<<<===ڊ===و>>>ن===ق>>>م===ق>>>ل???@@@@@@؁???111򛛛(((PONONMONLNMLNLKMLJsqn PPP222;;;===>>>???ق???888555jgdeb_555888??????111򚚚yyxyxwxwvwvtwutvtsusqtsq@?> PPP222;;;===>>>??????؈@@@؃???>>>===III~~~죣qqq:::RRRbbb岲999:::;;;;;;<<<===ف>>>ٳ???؁>>>___☘UUU;;;<<<======ق>>>ٟ???>>>IIIddd䘘___;;;;;;<<<======>>>ك???ؠ@@@؁???111򛛛''&  ¿¾ PPP222;;;===>>>??????؅@@@؃??? HHH[[[ᤤ^^^ggg炂ﲲ999999:::ہ;;;<<<ڂ===ِ>>>ف???ؐ>>>ن???@@@@@@؁???111򜜜(((¿¿ QQQ333<<<===>>>???ق???;;;555CBA젙555666??????111򛛛¿@?> QQQ333<<<===>>>??????؈@@@؄???؁>>>ف======@@@===<<<ڂ;;;ddd四;;;<<<======ف>>>ٵ???؁>>>ف===@@@===ڃ<<<===ځ===ف>>>٢???OOOݑ񱱱___<<<======>>>ك???ء@@@؁???111򜜜333333 ~}¿ ÿ¿¿¾ QQQ333<<<===>>>??????؅@@@؃???nnn惡|||QQQ:::;;;;;;ځ<<<ځ===ق>>>٩???@@@@@@???222𗗗 PPP444===>>>???ل???666555袛A@?555;;;???222𖖖 PPP444===>>>???ف???؉@@@؅???؁>>>م===ق===BBBUUU<<<===ځ===ف>>>ٰ???@@@؆???؁>>>ن===ف>>>٥???>>>???UUUDDDۃ===ف>>>ك???آ@@@ ???222𗗗 ¿PPP444===>>>???ف???؆@@@؃???؁>>>======ځ<<<ڂ;;;ځ<<<===ځ===ف>>>٪???@@@@@@???444|||¿¿@@@999>>>>>>???ل???888555jgdifd555888???444|||¿¿@@@999>>>>>>???ف???؊@@@؆???؆>>>ن===ف>>>م???؃@@@؃???ؒ@@@؅???؎@@@؆???؆>>>ى???ؘ@@@؅???؆>>>ل???أ@@@ ???444||| ¿¿¾ÿÿ¿¾¾@@@999>>>>>>???ف???؆@@@؄???؁>>>و===ق>>>٩???@@@@@@???>>>::: 000>>>>>>???ف???؂@@@???;;;555A@@졛555666???===::: 000>>>>>>???ف???؍@@@؉???؈>>>م???ز@@@ؑ???؟@@@؆???؁>>>ن???أ@@@ ???>>>:::000>>>>>>???ف???؈@@@؅???؈>>>ى???ؑ@@@؄???@@@@@@???444NNN 777777>>>???ق???؃@@@???666555蠚BBA555===???444NNN 777777>>>???ق???؎@@@ؖ???ص@@@؎???ء@@@؍???إ@@@???444NNN 777777>>>???ق???؉@@@ؒ???@@@@@@ ???444111QQQrrrttstsrssrsrrsrqrqprpoqpoppnponoononnnnnccbEEE222888???ك???؅@@@888555:::555666???444111QQQrrrttstsrssrsrrsrqrqprpoqpoppnponoononnnnnccbEEE222888???ك???ؑ@@@ؓ???ظ@@@؋???أ@@@؋???ا@@@???444111RRRsssuututttttttstsstsrsrrsrqrrprqprpprpoqpoqpnppnponoononnoonnnncccEEE222888???ك???؋@@@ؐ???@@@@@@؁???999555444555;;;ބ???؇@@@???777555777???؁@@@؁???999555444555;;;ބ???ؖ@@@؎???ؼ@@@؆???ة@@@؅???ث@@@؁???999555444555;;;ބ???؏@@@؋???@@@@@@ؔ???؍@@@>>>ډ@@@ؔ???@@@@@@???ؕ@@@؇???@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TRUEVISION-XFILE.linthesia-0.4.2/graphics/play_Status.tga0000644000175000017500000000703111314377743017313 0ustar cletocleto @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@yyy@@@yyy@@@yyy@@@yyy@@@aaa@@@YYY@@@@@@@@@@@@yyy@@@yyy@@@yyy@@@yyy@@@aaaPPPyyy@@@HHHaaa@@@qqq@@@@@@@@@yyy@@@yyy@@@yyy@@@yyy@@@aaayyy@@@@@@@@@yyy@@@yyy@@@yyy@@@yyy@@@aaayyyqqq@@@@@@@@@yyy@@@yyy@@@yyy@@@yyy@@@aaaiii@@@yyy@@@@@@@@@yyy@@@aaa@@@yyyyyyiiiiiiHHH@@@aaayyyPPP@@@@@@@@@@@@yyy@@@ aaayyyqqq@@@aaaYYYyyyaaaiii@@@HHHYYY@@@qqq@@@@@@@@@yyy@@@YYYyyy@@@@@@aaayyy@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@aaaHHH@@@YYYaaaPPP@@@PPPaaaHHH@@@HHHaaaYYY@@@PPPYYY@@@@@@@@@qqqqqq@@@HHHPPP@@@yyyiii@@@aaayyy@@@iiiaaa@@@qqq@@@@@@HHH@@@iiiyyy@@@@@@PPP@@@YYY@@@HHH@@@aaayyy@@@aaa@@@YYY@@@@@@aaayyy@@@HHH@@@@@@yyyaaayyy@@@PPPaaa@@@YYYqqq@@@YYY@@@qqqiii@@@aaayyy@@@yyyqqqHHH@@@HHHiiiHHH@@@PPP@@@@@@yyyYYY@@@HHH@@@@@@aaa@@@HHHPPP@@@yyy@@@YYY@@@YYY@@@YYY@@@aaayyy@@@PPPHHH@@@YYY@@@aaayyy@@@@@@@@@iiiiii@@@@@@qqqyyy@@@HHH@@@YYY@@@iii@@@aaayyy@@@iii@@@@@@YYY@@@@@@aaayyy@@@iiiyyy@@@@@@aaa@@@aaayyy@@@@@@@@@yyyHHH@@@@@@qqqyyy@@@yyyaaa@@@@@@@@@aaayyy@@@@@@@@@iii@@@@@@HHHYYY@@@yyyaaa@@@@@@@@@aaayyy@@@@@@@@@PPP@@@@@@YYY@@@yyyaaa@@@@@@@@@aaayyy@@@@@@@@@aaa@@@@@@PPPYYY@@@iiiyyy@@@@@@PPP@@@aaayyy@@@aaa@@@@@@yyyYYYHHH@@@@@@YYYYYY@@@HHH@@@YYY@@@qqqyyy@@@aaa@@@iii@@@@@@@@@PPPyyy@@@HHH@@@@@@qqqqqq@@@yyy@@@aaa@@@PPP@@@aaaaaa@@@PPP@@@qqq@@@HHHaaa@@@@@@@@@iiiaaa@@@@@@iiiaaa@@@PPPyyy@@@iiiHHH@@@HHH@@@HHH@@@aaaaaa@@@PPP@@@yyyPPP@@@qqqPPP@@@HHH@@@@@@yyyPPP@@@HHH@@@@@@yyy@@@YYY@@@HHHHHH@@@aaaaaa@@@qqq@@@aaa@@@@@@@@@PPP@@@PPPiii@@@HHHHHH@@@aaayyyYYY@@@yyyaaa@@@@@@@@@@@@aaayyy@@@HHHiiiyyyYYY@@@PPPqqqyyyqqqPPP@@@HHHaaaPPP@@@iiiyyyiii@@@HHHiiiyyyYYY@@@qqqyyyHHH@@@@@@@@@aaa@@@@@@@@@HHH@@@HHH@@@@@@@@@qqqaaayyy@@@@@@@@@HHHiii@@@@@@@@@yyyYYY@@@@@@@@@YYYaaaYYY@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TRUEVISION-XFILE.linthesia-0.4.2/graphics/score_RetrySong.tga0000644000175000017500000003042511314377743020135 0ustar cletocleto @                     6 N W X Y Y K4  3bv_- [%%%///222̗222+++  Y  k222FFFHHHGGGGGGFFFEEE???(((a"  o"""EEEJJJIIIIIIHHHGGGFFFEEE 888` _$$$KKKKKKJJJKKKJJJKKKJJJIIIHHHGGGFFFEEE??? Y  ?JJJMMMLLLKKKLLLMMMLLLKKKJJJKKKLLLMMMLLLKKKIIIHHHFFFEEE;;;, g>>>څNNNOOONNNMMMLLLKKKLLLMMMNNNOOONNNMMMLLLJJJKKKLLLMMMNNNOOONNNMMMLLLJJJHHHGGGFFF)))` ("""PPPOOOPPPOOOMMMLLLJJJKKKMMMNNNPPPOOONNNMMMJJJIIIHHHIIIJJJKKKLLLMMMNNNOOOPPPOOONNNMMMLLLJJJHHHGGGBBB  I666RRRQQQPPPOOONNNLLLJJJIIIJJJLLLNNNOOOPPPOOOMMMLLLIIIHHHGGGHHHIIIJJJLLLMMMNNNOOOPPPOOOMMMLLLJJJHHHGGG$$$8 gHHHTTTSSSQQQPPPOOOQQQJJJLLLMMMOOOPPPOOOMMMbbbhhhHHHIIIJJJLLLMMMOOOPPPOOONNNMMMKKKIIIHHH111 P vQQQUUUTTTSSSQQQPPPOOOPPPOOOPPPOOOzzzpppJJJKKKMMMNNNPPPOOOPPPOOOMMM~~~fffPPPHHHKKKMMMOOOPPPOOONNNLLLJJJIII777^ XXXVVVUUUSSSQQQPPPOOONNNOOOPPPOOONNNOOONNNOOONNNJJJLLLMMMOOOPPPOOONNNOOOPPPOOONNNOOONNNMMMGGGFFFGGGHHHKKKMMMOOOPPPOOONNNMMMKKKIII:::b XXXWWWUUUSSSQQQPPPOOONNNMMMLLLMMMNNNOOOPPPOOONNNMMMLLLMMMNNNMMMLLLMMMNNNOOO\\\JJJIIIKKKMMMNNNPPPOOONNNMMMLLLMMMNNNOOONNNMMMNNNMMMLLLpppGGGEEEDDDEEENNNQQQLLLMMMOOOPPPOOONNNMMMKKKJJJ:::b YYYXXXUUUSSSRRRQQQPPPOOONNNMMMKKKIIIHHHIIIKKKMMMOOONNNMMMKKKJJJIIIJJJIIIJJJKKKMMMLLLKKKJJJKKKLLLKKKJJJIIIJJJKKKLLLNNNOOOMMMwwwHHHIIIKKKMMMOOOPPPOOOMMMLLLKKKJJJKKKLLLMMMLLLKKKLLLMMMLLLKKKJJJKKKLLLKKKJJJ hhhuuu\\\cccdddeeeZZZMMMNNNOOOPPPOOONNNMMMLLLJJJ:::b YYYXXXUUUSSSRRRQQQPPPOOONNNLLLIIIGGGFFFHHHJJJMMMNNNLLLJJJHHHGGG HHHJJJLLLMMMLLLJJJHHHGGGHHHIIIJJJIIIHHHGGGIIIKKKMMMOOOMMMZZZFFFGGGIIIMMMOOOPPPOOONNNMMMJJJIIIHHHIIIJJJKKKJJJIIIHHHIIIJJJKKKJJJIIIHHHIIIJJJIIIHHHGGGHHHgggLLLNNNOOOPPPOOONNNMMMLLLJJJ:::b YYYXXXVVVSSSRRRQQQPPP]]]~~~fff}}}JJJMMMLLLJJJHHHOOOgggGGG]]]}}}vvvXXXKKKMMMLLLKKKQQQvvvfffPPPJJJYYYhhhgggfffgggSSSNNNOOOMMMRRReeeFFFHHHLLLNNNOOOPPP OOONNNTTTYYY```pppaaaIIIHHHGGG___wwwhhhJJJIIIHHHIIIHHHWWWfffXXXRRRiiihhhfffXXXHHHfffgggKKKMMMNNNOOOPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPUUUnnnJJJLLLJJJHHHfffIIIHHH TTTLLLJJJcccZZZNNNOOONNNLLLpppFFFHHHKKKMMMOOOPPPOOONNNzzzPPPFFFEEE]]]HHHggghhhRRR ___PPPuuuEEEFFFGGGHHHJJJMMMNNNOOOPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP OOOMMM}}}GGGIIIKKKJJJHHHuuu```KKK"hhhHHHJJJjjjkkkLLLaaaOOOIIIccc\\\ZZZFFFIIILLLNNNOOOMMMKKKfffHHHJJJMMMNNNOOOPPPOOONNNyyyMMMNNNMMMKKKMMMDDDtttPPPJJJLLLccc~~~GGGGGGIIIKKKFFFGGGvvvHHHIIIKKKMMMOOOPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP OOOMMMfffGGGHHHIIIHHHnnn gggLLLMMMLLLuuuFFFGGGIIIKKKhhhGGGJJJLLLMMMKKKFFFHHHKKKMMMNNNLLLJJJfffHHHJJJLLLMMMNNNPPPOOOdddNNNMMMLLLIIIffftttDDDfffHHHKKKMMMLLLNNNGGGGGGIIIJJJFFFGGGPPPwwwOOOGGGJJJLLLNNNPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMeeeFFFGGG NNN~~~JJJMMMNNNMMMEEEFFFGGGHHHIII gggGGGIIIKKKLLLJJJEEEGGGIIILLL JJJXXXGGGhhhIIIJJJLLLNNNOOOPPPOOONNNMMMLLLKKKIIIGGGeeeUUUGGGHHHJJJLLLJJJ~~~nnnGGGEEEHHHIIIFFFGGGoooPPPIIIHHHFFFHHHKKKNNNPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMeeeEEEFFF GGGKKKMMMOOONNNnnnVVVFFFGGGHHHfffEEEHHHJJJKKKIIIDDDFFFHHHIIIJJJIII~~~fffHHHhhhIIIJJJKKKMMMOOOPPPOOONNNMMMKKKIIIHHHFFFEEE~~~XXXHHHIIIJJJIIIHHHEEEGGGHHHGGGHHHIIIHHHEEEHHHKKKMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMeeeEEEUUUGGGJJJMMMNNN___HHHgggDDDGGGHHHIIIHHHDDDEEEGGGHHH HHHIIIJJJ```IIIKKKMMMOOOPPPOOOMMMKKKHHHFFFEEEMMMYYYKKKIIIHHHoooIIIEEEGGGHHHIIIJJJIIIHHHNNNHHHKKKMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMeeeNNNnnn"}}}FFFGGGIIILLLNNNOOOllliiiJJJHHHJJJgggEEEFFFHHHIIIXXXOOOGGGgggHHHIIIhhhIIIKKKKKKLLLMMMOOOPPPOOONNNLLLHHHFFFUUUyyyLLLMMMSSSJJJ IIIpppSSSLLLKKKPPPHHH JJJLLLkkkTTTKKKIIIPPPHHHIIILLLNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMOOOFFFHHHJJJMMMOOOzzzrrrLLL[[[fffgggiiiZZZ[[[MMMTTTMMMNNNOOOPPPOOOMMMJJJ___rrrMMMNNNUUU\\\TTTyyyrrrMMMcccMMM NNNTTTLLLrrrMMMNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMfffGGGJJJLLLjjjMMMGGGIIIMMMOOOPPPOOOtttUUUNNNdddMMMkkkTTTzzzlllNNNNNNOOOPPPOOOLLL```iiiMMMNNNOOO\\\NNNOOO ^^^MMMzzzdddNNNOOOlllNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMeeeGGGJJJLLLpppFFFIIIMMMOOOPPPOOOUUUMMMNNNOOOlllOOOVVVOOOPPPOOOLLLWWWJJJLLLMMMNNNOOOPPPOOOPPPOOOPPPOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNLLLeeeFFFHHHJJJPPPGGGJJJMMMOOOPPPVVVOOOPPPOOOTTTOOOHHHJJJLLLKKKLLLNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNLLLeeeFFFHHHIIIXXXIIILLLNNNOOOPPPOOOcccHHHIIIJJJKKKJJJpppIIILLLMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNLLLGGGHHHIII~~~KKKMMMOOOPPPNNNJJJIIIIIILLLMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMJJJKKKyyycccMMMOOOPPPOOOzzzkkkLLLSSSLLLMMMNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPeee\\\NNNOOOPPPOOOtttTTTNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVTTTRRRQQQPPPOOOUUUllldddNNNOOOPPPOOOVVVllleeeNNN^^^OOOPPPOOO MMMLLLJJJ:::a ZZZXXXVVVTTTRRRQQQPPPPPPOOO MMMLLLJJJ:::a ZZZYYYWWWTTTRRRQQQPPPPPPOOO MMMLLLKKK:::a [[[ZZZXXXUUUSSSQQQPPPPPPOOO MMMLLLKKK:::` {ZZZ[[[XXXUUUSSSQQQPPPPPPOOO NNNLLLKKK:::^ nSSS\\\ZZZWWWTTTRRRQQQPPPPPP OOONNNMMMLLL666 R SDDD^^^\\\YYYVVVSSSQQQPPPPPPOOONNNMMM,,, ; 5///```^^^\\\XXXUUUSSSRRRQQQPPPPPPQQQPPP OOONNNMMM YYY```^^^\\\XXXVVVTTTSSSRRRQQQQQQRRRQQQPPPOOO:::bT000cccbbb___\\\ZZZXXXUUUTTTSSSSSSTTTSSSQQQMMM 9 xCCCdddccc```^^^\\\ZZZXXXWWWWWWUUUSSS'''] -FFFeeecccbbb```^^^]]]\\\[[[[[[ZZZYYYXXXTTT---r N333]]]eeecccbbbaaa```______^^^\\\[[[KKK"""{0{555NNN]]]cccbbbbbbaaa```UUUCCC***eVq G <[vn P2TRUEVISION-XFILE.linthesia-0.4.2/graphics/play_KeysBlack.tga0000644000175000017500000014051511314377743017705 0ustar cletocleto                                   $/6:6/$  $/6:6/$  $/6:6/$  $/6:6/$  $/6:6/$  $/6:6/$  $/6:6/$  $/6:6/$ $<MY_YM<$$<MY_YM<$$<MY_YM<$$<MY_YM<$$<MY_YM<$$<MY_YM<$$<MY_YM<$$<MY_YM<$[/X-_7_8_7_8W.V,M/NKSTSTKJM/ni ohgM/ M/fEabB]iKeaB\`A\M/--++55++**M/???===FFF<<<;;;M/M/ c4f:nInGmFd>>Y6  Y6  g:zRj]}Y}Y}Y}Y}Y}Y}YvQ]3_:  Y6mSDu?q@r?q@r?q@r?q6jP_:   y)I93434343)n_:   )I93434343)_:  sQneynjkjkjkjd{gHc_:  77PPii\\WWXXWWXXWWXXWWOO00_:  KKKaaavvvkkkfffgggfffgggfffgggfff___CCC_:  ### ///_:  h;uM]kCd; e;d;e;d;c7Z._:  Z0hCu&_X YXYXUM_:   y!7| v w vw v uk_:   !7   _:  sQna{muVqoNk oOloNkoOloNkmLhdD__:  88JJZZAA88 9988998844++_:  LLL[[[iiiRRRJJJGGG>>>_:  ### ..._:  g:tKzUe:]0^0Y-_:  Y-g:nWOPL_:   x- wppj_:   - _:  rPm~^zgoOkhFdcC^_:  77HHRR77--..++_:  KKKYYYcccJJJAAA@@@===_:  ### ,,,-,,,,,_:  g:sJzUf;^1^0Y-_:  Y,g:oXPPL_:   x- xqpj_:   - _:  rPm~^ygpPliGehFdcC^_:  77HHSS88....++_:  KKKYYYcccJJJAAA@@@===_:  ### +++_:  g:sJ{Ug;_1^0Y-_:  Y,g:pYQPL_:   x- yrpj_:   - _:  rPm~^yhrQmkHfhFdcC^_:  77HHSS88....++_:  KKKYYYcccKKKBBB@@@===_:  ### )))_:  g:sJ|Vg<`2^0Y-_:  Y,g:qZRPL_:   x- zspj_:   - _:  rPm~^yhsQnlHghFdcC^_:  77HHTT99//..++_:  KKKYYYdddLLLCCC@@@===_:  ###!!!+** ++**+***+*+****+***++_:  g:sJ}Vhe4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777DDD'''_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777DDD'''_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777DDD'''_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777EEE(((_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777EEE(((_:  g:tKXl>e4^0Y-_:  Y-g;t^VPL_:   x- ypj_:   - _:  rPm~^zlxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777EEE(((_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:tKXl>e4^0Y-_:  Y-g;t^VPL_:   x- ypj_:   - _:  rPm~^zlxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:rIWl=e4^0Y-_:  Y+e:s]VPL_:   x, ypj_:   , _:  rPm}]xkwTrqLlhFdcC^_:  77GGUU::11..++_:  KKKXXXfffNNNFFF@@@===_:  &&&777FFF)))_:  g:uLZm>e4^0Y-_:  Y.h>v_VPL_:   x 0 ypj_:   0 _:  rPm_{nxUsqLlhFdcC^_:  77IIXX<<11..++_:  KKKZZZiiiOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-_:  Y,g;t^VPL_:   x- ypj_:   - _:  rPm~^ylxTsqLlhFdcC^_:  77HHUU;;11..++_:  KKKYYYgggOOOFFF@@@===_:  &&&777FFF)))_:  g:sJXl>e4^0Y-Y6  Y,g;t^VPLY6   x- ypjY6   - Y6  rPm~^ylxTsqLlhFdcC^Y6  77HHUU;;11..++Y6  KKKYYYgggOOOFFF@@@===Y6  &&&777FFF)))Y6 g:sJXl>e4^0Y-M/Y,g;t^VPLM/ x- ypjM/ - M/rPm~^ylxTsqLlhFdcC^M/77HHUU;;11..++M/KKKYYYgggOOOFFF@@@===M/&&&777FFF)))M/j>wO^qEj;a3[/<$]2kBy$d\SN<${%4 ~tn<$%4 <$tSpc|q}ZxvRqlIgfEa<$<>>څNNNOOOOOONNNMMMLLLJJJHHHGGGFFF)))` ("""PPPOOOPPPPPPOOONNNMMMLLLJJJHHHGGGBBB  I666RRRQQQPPPPPPOOOMMMLLLJJJHHHGGG$$$8 gHHHTTTSSSQQQPPPPPPOOONNNMMMKKKIIIHHH111 P vQQQUUUTTTSSSQQQPPPOOOPPPOOONNNLLLJJJIII777^ XXXVVVUUUSSSQQQPPPOOONNNOOONNNOOONNNOOOPPPOOONNNMMMKKKIII:::b XXXWWWUUUSSSQQQPPPOOONNNMMMLLLMMMLLLMMMNNNMMMNNNOOOPPPOOONNNMMMKKKJJJ:::b YYYXXXUUUSSSRRRQQQPPPOOONNNMMMKKKIIIHHHJJJKKKLLLKKKJJJKKKJJJKKKJJJKKKLLLKKKJJJKKKMMMNNNOOOPPPOOONNNMMMLLLJJJ:::b YYYXXXUUUSSSRRRQQQPPPNNNLLLIIIGGGFFFHHHIIIKKKJJJIIIHHHIIIHHHGGGHHHIIIJJJHHHIIIJJJHHHIIIKKKMMMNNNOOOPPPOOONNNMMMLLLJJJ:::b YYYXXXVVVSSSRRRQQQPPP]]]fffdddeeegggiiijjjiiipppIII```hhh___GGG^^^eeegggXXXYYYhhhgggfffgggQQQIIIfffuuuXXXIIILLLMMMOOOPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPVVVzzz JJJxxxwwwFFF aaabbbXXXHHHkkkNNNOOOPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMFFFIIILLLNNN zzzjjjLLLccc___FFFIIILLLpppGGGHHHVVVHHHSSSrrrOOOPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP OOOMMMGGGIIILLLMMMNNNMMMMMMyyyVVVNNNIIILLLiiiHHHIIIHHHFFFHHHKKKNNNPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMFFFHHHKKKLLLKKKSSSkkkMMMKKKwwwtttFFFIIIKKKhhhGGGHHHEEEHHHJJJMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMEEEGGGIIIKKKJJJIIIJJJLLLMMMJJJXXXDDDFFFHHHJJJhhhGGGHHHDDDFFFIIILLLNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMqqqEEEFFFHHHIII oooIIILLLMMMLLLJJJGGGHHHIIIhhhHHHIIIHHHDDDFFFHHHKKKMMMNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMiiiEEEGGGIIIKKKRRRJJJLLLMMMLLLaaaHHHwwwIIIJJJxxxJJJ IIIDDDFFFHHHKKKMMMNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMiiiLLLMMM cccqqqKKKTTTyyyLLLiiifffgggiii[[[NNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP OOOMMMiiiFFFIIILLLMMMUUUMMM zzzccczzzNNNdddMMMzzzNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMhhhFFFIIILLLNNNccczzzMMMNNNOOONNN\\\MMMNNNMMMNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMEEEHHHKKKMMMLLLKKKLLLMMMOOOPPPOOONNNMMMNNNOOOOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMFFFHHHJJJLLLKKKJJJKKKMMMNNNOOOPPPNNNMMMLLLMMMNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMGGGHHHJJJKKKJJJhhhKKKMMMNNNOOOPPPOOOTTT\\\MMMNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNJJJKKKLLLSSSLLLMMMOOOPPPOOO\\\NNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMNNNOOOPPPOOONNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVTTTRRRQQQPPPOOOdddllldddOOOPPPOOO MMMLLLJJJ:::a ZZZXXXVVVTTTRRRQQQPPPPPPOOO MMMLLLJJJ:::a ZZZYYYWWWTTTRRRQQQPPPPPPOOO MMMLLLKKK:::a [[[ZZZXXXUUUSSSQQQPPPPPPOOO MMMLLLKKK:::` {ZZZ[[[XXXUUUSSSQQQPPPPPPOOO NNNLLLKKK:::^ nSSS\\\ZZZWWWTTTRRRQQQPPPPPP OOONNNMMMLLL666 R SDDD^^^\\\YYYVVVSSSQQQPPPPPPOOONNNMMM,,, ; 5///```^^^\\\XXXUUUSSSRRRQQQPPPPPPQQQPPP OOONNNMMM YYY```^^^\\\XXXVVVTTTSSSRRRQQQQQQRRRQQQPPPOOO:::bT000cccbbb___\\\ZZZXXXUUUTTTSSSSSSTTTSSSQQQMMM 9 xCCCdddccc```^^^\\\ZZZXXXWWWWWWUUUSSS'''] -FFFeeecccbbb```^^^]]]\\\[[[[[[ZZZYYYXXXTTT---r N333]]]eeecccbbbaaa```______^^^\\\[[[KKK"""{0{555NNN]]]cccbbbbbbaaa```UUUCCC***eVq G <[vn P2TRUEVISION-XFILE.linthesia-0.4.2/graphics/play_KeyHits.tga0000644000175000017500000000517511326126636017413 0ustar cletocleto   #*06;<;:975310/-($   (Zfot{|xvsoc( #Xy [( 8g k< !BlnC 'DiŽiB#&Aba=# 7ZzyV3.NrsM+ %FhÇ nG# =fÌkB 7bÊ h<  *X|‡ ]0 GkÁ sL% 4Un|^:  #@Ym~xcG* -DYjy~p_J2   0BUer} }rfXD3!  .=N[hrz}vndYK=.!  *6BP[dkoqplf^SG=2'  #-7ALTXZXUMA8/&  #+3;A @:3+#   $'(&#    TRUEVISION-XFILE.linthesia-0.4.2/graphics/title_GameMusicThemes.tga0000644000175000017500000010602311314377743021225 0ustar cletocleto @ ϟrϟr(ϟrϟr(ϟrϟr(ϟr}ϟrϟrϟrtϟrϟrrϟrϟrϟrϟrϟrsϟrrsϟrϟr(ϟrϟr(ϟrϟr(ϟr:ϟrϟrϟrϟrϟrnϟrϟrϟrvϟrsϟrϟrϟrnvsϟrϟr(ϟrϟr(ϟrϟr(ϟrϟrϟr'ϟrϟr.ϟr!ϟrLϟrϟr.!Lϟrϟr(ϟrϟr(ϟreϟrϟrϟrϟrϟreϟrϟrϟrϟrϟrϟrbϟrϟrϟrϟrϟrϟr(ϟrϟrϟrϟrϟrϟrϟr!ϟrϟrQϟrϟrϟrϟr!ϟrϟrQϟrϟrϟrϟr!ϟrϟrQϟrϟrϟrϟrϟr(ϟrϟr(ϟr(ϟrϟrPϟrϟr؁ϟr*ϟrϟrϟrϟr9ϟrϟrϟr(ϟreϟrϟrϟrϟrϟrJϟrϟrϟrϟrϟrFϟrϟrbϟrϟrϟrϟrϟr ϟr(ϟr8ϟrϟrϟrϟr2ϟrnϟrϟrϟrϟrbϟrϟrϟrϟrϟrϟr(ϟrJϟrϟrϟrϟrϟrFϟrϟr(ϟrnϟrϟrϟrϟrϟrϟr\ϟrϟrϟrϟrϟrϟreϟrϟrϟrϟrϟrϟr(ϟrJϟrϟrϟrϟrϟrFϟrϟr(ϟrϟrϟrϟrϟrϟrMϟrϟr(JF(((P؂JF(n:JF( (M:(ϟrϟr(ϟrϟr(ϟrϟrϟrϟroϟr ϟrϟrϟrϟroϟr ϟrϟrϟrgϟrϟrϟrϟrϟr(ϟrϟrϟr4ϟrϟrϟr4ϟrbϟrϟrϟrϟrϟrϟrϟrϟrbϟrϟrϟrϟrϟrϟrϟrϟrbϟrϟrϟrϟrϟrϟrϟrϟrϟr(ϟrϟr(ϟr(ϟrϟrPϟrϟr؁ϟrϟrϟrϟrjϟrϟrϟrϟr( ϟrϟrϟrϟroϟr ϟrKϟrϟrϟrzϟr~ϟrϟrϟrGϟrϟrϟrgϟrϟrϟrϟr ϟr(ϟrϟrϟrϟrxϟrϟrϟrϟr}ϟrϟrϟrgϟrϟrϟrϟrϟr(ϟrKϟrϟrϟrzϟr~ϟrϟrϟrGϟrϟr(ϟreϟrϟrϟrmϟrϟrϟrϟrWϟrϟrϟrrϟrϟrϟrϟrϟrϟrϟrϟroϟr ϟr ϟr(ϟrKϟrϟrϟrzϟr~ϟrϟrϟrGϟrϟr(ϟryϟrϟrϟryϟrϟrϟr(Kz~G(((P؁Kz~G(emeŁKz~G((yyełdϟrϟr(ϟrϟr(ϟrϟr,ϟrϟr,ϟrϟr\ϟr0ϟrϟrϟrϟrϟrϟr`ϟrϟreϟr`ϟrϟre ϟrϟrϟrϟrϟr7ϟrϟrϟrϟrC ϟrϟrϟrϟrϟr7ϟrϟrϟrϟrC ϟrϟrϟrϟrϟr7ϟrϟrϟrϟrCϟr(ϟrϟrϟr(ϟr(ϟrϟrPϟrϟr؁ϟrϟrϟrEϟr9ϟrϟr(ϟrϟr,ϟrϟrϟriϟrjϟrϟrÁϟrϟr\ϟr0ϟrϟrϟrϟrϟr(ϟrϟrϟr/ϟrZϟrϟrϟrϟr\ϟr0ϟrϟrϟrϟrϟr(ϟrϟrϟriϟrjϟrϟrÁϟrϟr(ϟrϟrϟr>ϟrϟrHϟr-ϟrϟrϟr`ϟrϟrϟr*ϟrϟr,ϟr(ϟrϟrϟrϟriϟrjϟrϟrÁϟrϟr(ϟrϟrϟrgϟrqϟr(ijÁ(((P؁ijÁ(>H- 7A ijÁ((gq 7A ϟrϟr(ϟrϟr(ϟrϟr(ϟrϟr(ϟrϟr.ϟrϟrϟr ϟr.ϟrϟrϟr.ϟrϟr ϟrϟrϟrwϟrϟrϟrzϟrϟrMϟrϟr ϟrϟrϟrwϟrϟrϟrzϟrϟrMϟrϟr ϟrϟrϟrwϟrϟrϟrzϟrϟrMϟrϟrϟrϟr(ϟr(ϟrϟrPϟrϟr؁ϟrϟr)ϟrϟrϟr(ϟrϟr(ϟrϟrϟr0ϟr1ϟrϟrϟrϟr.ϟrϟrϟr ϟrϟr(ϟrϟrϟrϟrMϟreϟrϟrϟr.ϟrϟrϟr ϟrϟr(ϟrϟrϟr0ϟr1ϟrϟrϟrϟr(ϟrϟrϟrVϟrHϟrGϟrϟrϟr/ϟrϟr(ϟrϟrϟr0ϟr1ϟrϟrϟrϟr(ϟrϟrϟr/ϟr2ϟr(01(((P؁01(VHG201((/22(ϟrϟr,ϟrϟrϟr'ϟrϟr(ϟrϟr(ϟrϟr/ϟrϟrϟr!*ϟrϟrϟrϟrϟrϟrϟr'ϟrϟrϟr4ϟrϟraϟrϟrϟrϟrϟrϟr'ϟrϟrϟr4ϟrϟraϟrϟrϟrϟrϟrϟr'ϟrϟrϟr4ϟrϟraϟrϟrϟrϟrϟrɄϟrϟr+ϟr)ϟrϟrϟrQϟrϟrׁϟrϟr(ϟrϟr(ϟrϟr(ϟrϟrϟr/ϟr/ϟrϟrϟrϟr/ϟrϟrϟr!ϟrϟr(ϟr+ϟrʄϟrϟrϟr/ϟrϟrϟr!ϟrϟr.ϟrϟrϟr/ϟr/ϟrϟrϟrϟr(ϟrϟrϟrϟrϟrϟr.ϟrϟr(ϟrϟrϟr/ϟr/ϟrϟrϟrϟr.ϟrϟrϟr0ϟr1ϟr(//.+)Qׁ//.h//,'01h(ϟrϟr_ϟr!ϟrϟrϟrϟr(ϟrϟr(ϟrϟr_ϟr1ϟrϟrϟrϟr ϟr*ϟrϟrϟrϟrϟrϟrϟrhϟrϟrlϟrϟrϟrϟrϟrϟrϟrϟrϟrhϟrϟrlϟrϟrϟrϟrϟrϟrϟrϟrϟrhϟrϟrlϟrϟrϟrϟrϟrϟrϟrϟrϟrϟrZϟrDϟrϟr-ϟrlϟrϟŕϟrϟr(ϟrϟr(ϟrϟr(ϟrϟrϟrgϟreϟrϟrŁϟrϟr_ϟr1ϟrϟrϟrϟrϟr(ϟr"ϟr8ϟr*ϟrϟr@ϟrϟrϟrϟr_ϟr1ϟrϟrϟrϟrϟr`ϟrϟrϟrgϟreϟrϟrŁϟrϟr(ϟrϟrϟr<ϟrϟr*ϟrϟrɁϟrϟrϟr\ϟrϟrϟrϟrϟr(ϟrϟrϟrgϟreϟrϟrŁϟrϟr`ϟrϟrϟrhϟrpϟr(geŁ`ZD-ĺgeŁ`<*Ʌ`?"geŁ^ hp`?"(ϟrϟrϟrrϟrϟrϟrϟrϟrdϟrϟr|ϟrdϟrdϟrϟr|ϟrdϟrϟrϟrpϟrϟrϟrϟrϟr(*ϟrϟrϟr(ϟrϟrϟr(ϟrϟrϟr5ϟrϟrϟrϟrOϟrϟrϟrOϟrϟrϟr5ϟrϟrϟrϟrOϟrϟrϟrOϟrϟrϟr5ϟrϟrϟrϟrOϟrϟrϟrOϟr ϟrϟrpϟrϟrϟrϟrϟroϟrϟrϟrϟrϟr(ϟrϟr(ϟrdϟrϟr|ϟrdϟrGϟrϟrϟr}ϟryϟrϟrϟrOϟrϟrϟrpϟrϟrϟrϟrϟr(ϟr_ϟrϟrϟrjϟrϟrϟrϟrϟrϟrpϟrϟrϟrϟr ϟrϟrpϟr9ϟrGϟrϟrϟr}ϟryϟrϟrϟrOϟrϟr(ϟraϟrϟrϟrlϟrϟrϟraϟrQϟrϟrϟrqϟrϟrϟrȁϟrdϟrϟr|ϟrdϟrGϟrϟrϟr}ϟryϟrϟrϟrOϟr ϟrϟrpϟr9ϟrlϟrϟrϟrzϟr~ϟr߁ϟrd |dG}yOp9 poG}yO p9alahG}yO rlz~߁h(ϟrϟrKϟrϟrϟrϟr;ϟrϟrϟrϟrϟrNϟrϟrϟrϟrϟrϟr(*ϟrgϟrϟrYϟrgϟrϟrZϟrϟrϟrϟrjϟrϟrϟrϟrQϟrϟrϟrϟrϟrϟrjϟrϟrϟrϟrQϟrϟrϟrϟrϟrϟrjϟrϟrϟrϟrQϟrϟrϟrϟr ϟr1ϟrϟrϟrϟr0ϟrQϟrϟrϟrϟrϟrϟr(ϟrϟr(ϟrϟrGϟrϟrϟrϟrϟrPϟrϟrϟrNϟrϟrϟrϟrϟrϟr(ϟrpϟrϟrϟrϟrϟrϟrϟrϟrNϟrϟrϟrϟrϟrϟrϟrfϟrϟrϟrGϟrϟrϟrϟrϟrPϟrϟr(ϟreϟrϟrϟrϟrrϟrUϟrϟrϟrϟrϟrϟrϟrGϟrϟrϟrϟrϟrPϟrϟr ϟrfϟrϟrϟrϟr}ϟrϟrϟrϟr<ϟrGPf 10QGPfer#GP/;}<#(ϟrϟr(ϟrϟrϟr(ϟrϟrϟr(ϟr5ϟrϟrϟr5ϟrϟrϟrϟrϟr(ϟrϟrϟrϟr(ϟr)(ϟrϟr(ϟr`ϟrϟr(ϟr`ϟrϟr(ϟrϟrϟrϟrϟrϟrϟr`ϟrϟr(ϟrdϟrϟrdϟrϟr`ϟrϟr(h(ϟrϟr(ϟrϟrϟrϟrϟrϟr(ϟrϟr(K((}t((:(('44(44(44(4n4444⊃444(4(44P44؂4n4444⊃44:4⊾4444⊢4(o| e((n((^((~ ((((n:82n(n((JF((P؅(^ (*9(eJFb (82nb(JF(n\e(EL(:(e44(44(44(4e444m4⊮44⊆44(4(44P44؁4e444m4⊮44⊆4444⊇4e4⊄44Ł( voo ((em((܁((|du((((emeŅx}(em((Kz~G((P؅(܁ (j( o Kz~Gg (x}g(Kz~G(emWro ((eŁ(o 44(44(44(444>44H4-44(4(44P44؁ 444>44H4-4 474A4 44(q ,((>H-((3(((((( (>H- 7A /Z(>H-((ijÁ((P؅(3(E9(,ijÁ\0(/Z\0(ijÁ(>H-`*,(( 7A (,44(44(44(444V4H4G44(4(44P44؁444V4H4G424⊃4⊼444⊩_7(((VHG((\x(((A((((VHG2Me(VHG((01((P؅(\x()((01. (Me. (01(VHG/(jyo(2((44(44,444'44444+4)444Q44ׁ4444⊅444⊵4h40 (,'.(((( ((((h+ʄ.(.//+)Qׅ(((((///!(+ʄ/!.//(.(-&т(h((44(44_4!44444<44*44Ɂ44Z4D44-4l44́444<44*44Ɂ444`44?4".(_!<*Ɂ`5~4(((((((<*Ɂ`?""8*@`<*Ɇ(`geŁZD-lͅ5~4((((geŁ_1("8*@_1`geŁ(<*Ɂ\(-؁2(`?"((44(4 44r4⊽4444a444l4⊻44a4 44p44444o444⊔4a444l4⊻44a444⊩4h4⊜44⊒X4d|d ralap9|^*(((6(d|d((alah_j p9alad|d p9G}yO po|^*(((d|dG}yOp(_jp p9G}yO(alaQqȁd|d}(h(d|d44(44K4444;4e4444r44 41444404Q444⊻44e4444r4#4⊮4444⊌4xK;erf΁((((((er#pferfGP 10Q΁(((GPN(pNfGP(erU/((#(4d44|4d44( vo((((|d{()()(((RڃU(444(q`(([.((w (hd(h[.(`(dd`(~dd`(44((K((K((((rs((nvs((|.!L((B(((e((n: (82n:I ( L(nJFM82n((P؂n((P؁*9(:(\:82n((P؁b(n:82n(nb(JFI ( L(n L(Q44o44444⊾4o4 48444424n4444(4(44P44؂4n4444⊃444(4^44⊇44(4*44449444(4:4⊾4444⊢444(4\4444⊡4T(((o ((emeŁ (x}eņ(nǁ(emKz~Gyyx}((P؁em((P؁j(eŁ (WreŁx}((P؁g(emeŅx}(emg(Kz~G(nǁ(emnǁ(o44⊾444z4h4⊎4444444⊬4x4444}44(4(44P44؁4e444m4⊮44⊆44(4⊳44܁44(4444j4444(4444⊇4e4⊄44Ł4 4(4W444r4⊡444((((,( (>H- 7A (/Z 7A  E(X=(>H-ijÅgq/Z((P؁>H-((P؁E9( 7A (`* 7A /Z((P؁\0 (>H- 7A /Z(>H-\0(ijÁ E(X=(>H-X=(^1xg4v444 4 44(444/4Z4444(4(44P44؁444>44H4-44(44444344(444E4944(4 474A4 4444(444`4⊩44*(((((((VHG2(Me2YP(- (VHG01/2Me((P؁VHG((P؁)(2(/2Me((P؁. (VHG2Me(VHG. (01YP(- (VHG- (. ȅ444_4"4H44(444⊪4M4e444(4(44P44؁444V4H4G44(4\44x44⊉44(44)444(424⊃4⊼444⊩44(444/((,'(,'h(+ʄhQ (,(//01+ʄ+)Qׁ+)Qׁ((h(.h+ʄ+)Qׁ/!(h+ʄ./!.//Q (,(,(/!D)44404|44(4+4ʄ444+4)444Q44ׁ44444(4⊱444444(44(44(4⊅444⊵4h444(444.((^ (_!<*Ɂ`?"("8*@`?" ^(R3(<*ɁgeŅhp"8*@ZD-ĺ<*ɅZD-ĺ((`?"(\`?""8*@ZD-ĺ_1(<*Ɂ`?""8*@`<*Ʌ_1`g e ^(R3(<*ɁR3( _.Yu444.4 444"484*44@4444Z4D44-4l44́444<44*44Ʌ44544⊵4~44444(44(44(444`44?4"44(444\4⊓4⊠4((rd|d ralah(_j(hh[(gā(alaG}yOlz~߁_j poala po((h(Qqȅh_j pop(alah_j p9alapp9G}yOh[(gā(alagā(p $444X44_444j4⊱44⊸4 44p44444o444⊔4a444l4⊻44a44|44^4*44⊃44(44(44(444⊩4h4⊜44⊒44(4Q444q4⊢44ȋ((/;K;er#(p(#c(V(erGP}<p 10Qer 10Q((#(U#p 10QN(er#pferNfGPc(V(erV(TuK4y4444⊑44z4p4444⊨444 41444404Q444⊻44e4444r444444΁44(44(44(4#4⊮4444⊌444(4U4444⊡4((((((((( 44444y4l4⊲444V444⊱4⊂444((d`((d(d(d(d(((44n44444⊯4:44[4.44(4d4(((((((((((44(TRUEVISION-XFILE.linthesia-0.4.2/graphics/title_ChooseTracks.tga0000644000175000017500000003222211314377743020574 0ustar cletocleto @                     6 N W X Y Y K4  3bv_- [%%%///222̗222+++  Y  k222FFFHHHGGGGGGFFFEEE???(((a"  o"""EEEJJJIIIIIIHHHGGGFFFEEE 888` _$$$KKKKKKKKKJJJIIIHHHGGGFFFEEE??? Y  ?JJJMMMMMMLLLKKKIIIHHHFFFEEE;;;, g>>>څNNNOOOOOONNNMMMLLLJJJHHHGGGFFF)))` ("""PPPOOOPPPPPPOOONNNMMMLLLJJJHHHGGGBBB  I666RRRQQQPPPPPPOOOMMMLLLJJJHHHGGG$$$8 gHHHTTTSSSQQQPPPPPPOOONNNMMMKKKIIIHHH111 P vQQQUUUTTTSSSQQQPPPOOOPPPOOOPPPOOONNNLLLJJJIII777^ XXXVVVUUUSSSQQQPPPOOONNNOOONNNOOONNNOOONNNOOOPPPOOONNNOOONNNOOONNNOOOPPPOOONNNOOONNNOOONNNOOONNNOOONNNOOOPPPOOONNNMMMKKKIII:::b XXXWWWUUUSSSQQQPPPOOONNNMMMNNNMMMNNNMMMNNNOOONNNMMMNNNMMMNNNMMMLLLMMMNNNOOOPPPOOONNNMMMLLLMMMNNNMMMLLLMMMNNNMMMLLLMMMLLLMMMLLLMMMLLLMMMNNNOOOPPPOOONNNMMMKKKJJJ:::b YYYXXXUUUSSSRRRQQQPPPOOONNNMMMLLLKKKLLLKKKJJJKKKMMMLLLKKKJJJKKKLLLMMMLLLKKKLLLMMMNNNMMMLLLKKKLLLMMMLLLKKKJJJKKKLLLMMMLLLJJJIIIJJJLLLMMMNNNOOOPPPOOOMMMLLLJJJHHHIIIKKKMMMLLLKKKIIIJJJKKKMMMLLLKKKJJJIIIJJJKKKLLLKKKJJJIIIJJJKKKJJJKKKJJJIIIJJJKKKJJJKKKLLLMMMNNNOOOPPPOOONNNMMMLLLJJJ:::b YYYXXXUUUSSSRRRQQQPPPOOOMMMLLLJJJIIIJJJIIIJJJIIIHHHJJJKKKLLLJJJIIIHHHIIIJJJIIIHHHIIIJJJKKKLLLJJJIIIHHHIIIJJJKKKJJJIIIHHHIIIJJJIIIHHHGGGHHHIIIKKKMMMNNNOOOPPPOOOMMMKKKHHHFFFGGGJJJLLLMMMKKKHHHGGGHHHJJJKKKLLLKKKIIIGGGFFFGGGHHHIIIHHHGGGHHHIIIJJJIIIHHHGGGHHHGGGHHHIIIHHHIIIJJJMMMNNNPPPOOONNNMMMLLLJJJ:::b YYYXXXVVVSSSRRRQQQPPPOOOMMMKKKIIIHHHXXXiiiyyyjjjSSSJJJQQQgggfffQQQKKKqqqiiigggfff___HHHGGGgggpppYYYIIIHHHIIIHHHGGG___pppaaaJJJIIIHHHIIIRRRhhhfffGGGHHHFFFfffgggJJJLLLMMMNNNOOOPPP^^^wwweee~~~wwwMMMNNNccciiigggfffhhhLLLZZZ~~~VVVEEEeee|||MMMGGG FFFfff~~~wwwYYYKKKiiigggfffeeeVVVFFF^^^fff___IIIXXXhhhggg___GGGIIILLLNNNOOOPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNLLLIIIGGGuuubbbRRRXXXKKKbbbfffGGG}}}___GGGfffwwwHHHGGGHHHmmmFFFNNNyyyMMMNNNOOOPPPlll~~~aaaMMMNNNrrrLLLMMM!uuuFFFnnncccDDDlllVVVHHHKKKMMMOOOPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP OOOMMMJJJWWWZZZMMMNNNOOOlllKKKJJJGGGIIIKKKFFFIIIKKKLLL^^^EEEuuuPPPKKKLLLqqqvvvFFFOOO___HHHFFFNNNFFFfffHHHSSS\\\NNNOOOPPPOOOLLLuuuGGGJJJMMMOOOMMMHHHJJJMMM IIIHHHnnnEEEFFFfffIIILLLNNNzzzLLLcccBBBYYYLLLQQQGGGMMMHHHLLLNNNOOOPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNLLLHHHJJJMMMOOOPPPOOOtttMMMKKKGGGIIIKKK+fffGGGfffOOOIIILLLMMMKKKDDDEEE^^^IIILLLMMMLLLEEEWWWgggHHHGGGEEE___OOOMMMFFFHHHJJJKKKLLLMMMOOOPPPOOOLLLeeeHHHKKKMMMOOOMMMiiinnnGGGIIILLLMMMyyyIIIGGGEEEGGGHHHJJJMMMNNNLLLcccBBBQQQLLLMMMrrrSSSHHHFFF]]]IIILLLNNNPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMJJJHHHKKKNNNPPP{{{NNNLLLGGGHHHIIIfffGGGHHHIIIKKKLLLJJJEEEfffGGGIIIKKKLLLJJJeeeGGGVVVHHHgggEEEFFFHHHIIIJJJMMMNNNOOOPPPOOOLLLeeeHHHKKKMMMOOOMMMiiieeeFFFHHHJJJLLL$yyyFFFHHHgggIIIJJJLLLMMMLLLKKKcccOOOIIILLLMMMLLLJJJGGGuuuwwwKKKMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMYYYUUUHHHLLLOOOPPPOOOLLLFFFGGGHHHfffHHHwwwHHHIIIJJJHHH___gggHHHIIIJJJIII~~~HHHPPP___IIIiiifffFFFGGGHHHIIILLLNNNOOOPPPOOOLLLeeeHHHKKKMMMNNNMMMhhh|||DDDGGGHHHJJJKKKJJJIIIWWWGGGIIIIII JJJKKKJJJIIIMMMGGGIIIKKKLLLaaaQQQLLLMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMEEEIIILLLOOOPPPOOOMMMEEEFFFGGGPPPJJJiiiIIIPPPIIIJJJIIIHHHgggIIIwwwHHHIIIKKKSSSwwwRRRLLLNNNOOOPPPOOOLLLeeeHHHKKKMMMNNNMMMhhhDDDFFFHHHIIIJJJ IIIHHHGGGHHHJJJrrrKKKIIIHHH]]]GGGHHHIIIJJJLLLTTTWWWHHHJJJLLLMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMEEEIIILLLOOOPPPOOOLLLEEEFFFGGGPPPJJJLLLTTTKKKJJJIIILLLMMMSSSJJJIIIwwwKKKLLLRRRIIIJJJxxxLLLMMMJJJIIIPPPZZZMMMOOOPPPOOOLLLeeeHHHKKKMMMNNNMMMGGGOOO___IIIYYYIIIoooJJJMMMjjjKKKIIIHHHPPPHHHeeennn~~~III JJJLLLcccJJJIIIaaaiiiMMMNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMEEEHHHLLLNNNPPP OOONNNLLLMMMNNNlllTTT[[[TTTNNNUUU\\\TTTyyyjjjMMMNNNsss\\\TTTMMMNNNUUUjjjrrrMMMNNNOOOPPP OOOLLLeeeHHHKKKMMMOOOiiiTTTrrrMMMNNNOOOeeeyyyIIIfffHHHhhhqqqLLLMMMTTTjjjkkkMMMNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNEEEHHHJJJMMMOOOPPPOOO NNNMMMKKKNNNwww]]]NNNOOOVVVUUUNNNOOO]]]NNNOOOtttzzzNNNOOOVVVrrrNNNOOOPPPOOONNNLLLeeeHHHJJJMMMOOONNNccccccNNNUUUNNNOOO eeeKKKfffHHHNNNOOO]]]OOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOFFFGGGIIILLLNNNOOONNNMMMLLLKKKIIIFFFHHHKKKNNNOOOPPPOOOPPPOOOPPPOOOPPPOOOPPPOOONNNMMMNNNMMMKKKdddFFFIIILLLMMMTTTkkkNNN^^^OOOPPPOOO ^^^OOONNNLLLfffHHHJJJMMMOOOPPPOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOdddOOOGGGHHHJJJLLLMMM LLLKKKJJJIIIHHHFFFHHHLLLNNNPPPOOONNNMMMLLLKKKIIIcccEEEHHHJJJLLLKKKLLLMMMNNNOOOPPPOOOLLLfffHHHJJJMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOHHHIIIKKKLLLKKKJJJXXXHHHFFFHHHLLLNNNPPPOOOMMMLLLJJJHHHdddEEEHHHIIIJJJMMMNNNOOOPPPOOOLLLfffHHHKKKMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOVVVaaaJJJIIIHHHGGGIIILLLNNNPPPOOOzzz[[[JJJIIIHHH}}}FFFHHHIIIhhhwwwJJJLLLNNNOOOPPPOOOMMMfffHHHKKKMMMOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOO^^^yyyLLLKKK KKKRRRQQQKKKMMMOOOPPPOOOsssrrrbbbKKKiiiIIIJJJKKKbbbLLLMMMNNNOOOPPPOOOTTTJJJLLLNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOzzzcccjjjMMMNNNOOOPPPOOOMMMNNNOOOPPPOOOMMMNNNOOOPPPOOO MMMLLLJJJ:::b ZZZXXXVVVTTTRRRQQQPPPOOO^^^lllzzzssslllUUUNNNOOO]]]sssNNNOOOPPPtttOOONNNeeeOOOPPPOOO^^^NNNOOOPPPOOO MMMLLLJJJ:::a ZZZXXXVVVTTTRRRQQQPPPVVVOOOPPPOOOPPPOOO MMMLLLJJJ:::a ZZZYYYWWWTTTRRRQQQPPPPPPOOO MMMLLLKKK:::a [[[ZZZXXXUUUSSSQQQPPPPPPOOO MMMLLLKKK:::` {ZZZ[[[XXXUUUSSSQQQPPPPPPOOO NNNLLLKKK:::^ nSSS\\\ZZZWWWTTTRRRQQQPPPPPP OOONNNMMMLLL666 R SDDD^^^\\\YYYVVVSSSQQQPPPPPPOOONNNMMM,,, ; 5///```^^^\\\XXXUUUSSSRRRQQQPPPPPPQQQPPP OOONNNMMM YYY```^^^\\\XXXVVVTTTSSSRRRQQQQQQRRRQQQPPPOOO:::bT000cccbbb___\\\ZZZXXXUUUTTTSSSSSSTTTSSSQQQMMM 9 xCCCdddccc```^^^\\\ZZZXXXWWWWWWUUUSSS'''] -FFFeeecccbbb```^^^]]]\\\[[[[[[ZZZYYYXXXTTT---r N333]]]eeecccbbbaaa```______^^^\\\[[[KKK"""{0{555NNN]]]cccbbbbbbaaa```UUUCCC***eVq G <[vn P2TRUEVISION-XFILE.linthesia-0.4.2/graphics/title_OutputBox.tga0000644000175000017500000005477311314377743020174 0ustar cletocleto                    5 M W X X X X J3  3bv^+ [%%%///222222222222+++  X  k222FFFHHHGGGGGGGGGGGGFFFEEE???(((`  o"""EEEJJJIIIIIIIIIIIIHHHGGGFFFEEE888_ _$$$KKKKKKKKKKKKKKKJJJIIIHHHGGGFFFEEE??? X  @JJJMMMMMMMMMMMMLLLKKKIIIHHHFFFEEE;;;+ g>>>څNNNOOOOOOOOOOOONNNMMMLLLJJJHHHGGGFFF)))_ *"""PPPOOOPPPPPPPPPPPPOOONNNMMMLLLJJJHHHGGGBBB  J666RRRQQQPPPPPPPPPPPPOOOMMMLLLJJJHHHGGG$$$7 gHHHTTTSSSQQQPPPPPPPPPPPPOOONNNMMMKKKIIIHHH111 P vQQQUUUTTTSSSQQQPPPPPPPPPPPPOOONNNLLLJJJIII777] XXXVVVUUUSSSQQQPPPPPPPPPPPPOOONNNMMMKKKIII:::b XXXWWWUUUSSSQQQPPPPPPPPPPPPOOONNNMMMKKKJJJ:::b YYYXXXUUUSSSRRRQQQPPPPPPPPPPPPOOONNNMMMLLLJJJ:::b YYYXXXUUUSSSRRRQQQPPPPPPPPPPPPOOONNNMMMLLLJJJ:::b YYYXXXVVVSSSRRRQQQPPPPPPPPPPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOONNNMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNMMMNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNMMMLLLKKKLLLMMMNNNOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMLLLIIIHHHIIIKKKMMMOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMKKKHHHGGGHHHJJJMMMOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOaaaMMMOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOPPPOOOMMMHHHJJJMMMOOOPPPPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNOOOPPPOOONNNOOONNNMMMqqq}}}GGGIIILLLNNNOOOPPPOOONNNOOONNNOOOPPPOOONNNOOOPPPOOONNNOOOPPPOOOPPPOOONNNOOONNNOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNMMMLLLMMMNNNOOOPPPOOONNNMMMNNNMMMLLLiiifffFFFHHHKKKMMMNNNOOONNNMMMNNNMMMNNNOOOPPPOOONNNMMMNNNOOOPPPOOONNNMMMLLLMMMNNNOOONNNMMMNNNOOONNNMMMNNNMMMLLLMMMNNNMMMLLLMMMNNNMMMNNNOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNMMMLLLJJJIIIJJJKKKLLLMMMNNNOOOMMMLLLJJJKKKLLL KKKJJJKKKLLLKKKiiiuuuEEEGGGIIIKKKMMMNNNMMMKKKJJJKKKLLLKKKJJJKKKLLLMMMNNNOOOPPPOOONNNMMMLLLJJJIIIJJJKKKLLLMMMNNNOOONNNMMMKKKJJJ KKKMMMNNNOOONNNMMMLLLKKKLLLMMMNNNMMMLLLJJJLLLMMMLLLKKKJJJKKKLLLMMMLLLJJJKKKLLLMMMLLLKKKLLLMMMOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNMMMJJJIIIHHHGGGHHHIII JJJKKKLLLMMMNNNMMMLLLIIIHHHGGGHHHGGGHHHIIIJJJIIIHHH IIIJJJKKKhhhDDDFFFHHHJJJKKKLLLMMMLLLKKKHHHGGGHHHGGGHHHIIIJJJHHHJJJLLLNNNOOOPPPOOONNNLLLIIIGGGFFFGGGHHHJJJKKKJJJKKKMMMNNNMMMKKKHHHGGGHHHJJJLLLMMMNNNMMMLLLIIIJJJLLLMMMNNNLLLJJJHHHIIIJJJKKKIIIHHHGGGHHHJJJKKK JJJIIIHHHGGGHHHIIIKKKLLLKKKJJJIIIKKKMMMNNNPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPP OOONNNMMMJJJHHHGGGVVVnnniiiRRRJJJIIIJJJLLLMMMLLLJJJHHHfffWWWGGGfffnnnFFFHHHPPPfffGGGHHHKKKhhhMMMWWWHHHJJJKKKJJJIIIWWWfffGGG~~~UUUGGGHHH___VVVHHHJJJLLLNNNOOOPPPOOONNNKKKHHHEEEFFFHHHJJJLLLKKKJJJIIIHHHIIIJJJLLLKKKIIIOOOfffHHHKKKLLLMMM LLLRRRGGGHHHJJJMMMTTTjjj```GGGHHHIIIHHHFFF^^^fffXXXKKKIIIGGG^^^fffXXXIIIKKKLLLKKKaaapppIIIKKKMMMNNNPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMKKKHHHVVVRRRIIIJJJKKKJJJ```wwwvvvHHH___cccLLLiiiYYYIIIHHHXXXHHHMMMNNNOOOPPPzzz QQQHHHGGGHHHIIIJJJIIIvvvTTTMMMKKKoooUUUGGGIIILLL\\\wwwHHH}}}cccJJJPPP jjjMMMcccyyyLLLMMMOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNLLLHHHnnnZZZMMMNNNddd```HHHIII___```VVVXXXHHHHHHYYYMMMiii___IIIKKKqqq___HHH ___~~~QQQwwwWWWHHH^^^HHHqqqlllOOOPPPNNNTTT|||OOOIIIMMMNNNlll~~~FFFGGGHHHWWWWWWJJJyyyMMMLLLJJJFFFIIILLLMMMKKKGGGHHH~~~JJJMMMlllkkkKKKuuuHHHZZZTTTkkkMMMNNNOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMJJJnnn~~~JJJMMMOOOPPPOOO___GGGOOOIIIJJJKKKGGGHHHfffHHHKKKMMMiiiGGGIIIKKKLLLFFFfffHHHJJJKKKiiiGGGHHHgggGGGIIILLLOOOPPPOOOLLLeeeHHHKKKMMMOOOPPPOOONNNEEEFFFFFFHHHIIIKKKLLLJJJHHHOOOIIIKKKLLLJJJGGGHHHvvvIIIKKKMMMOOOMMMSSSUUUFFFHHHJJJLLLMMMrrrMMMNNNOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOMMMQQQIIILLLOOOPPPOOOMMMFFFFFFIIIKKKFFFHHHEEEGGGJJJLLLhhhFFFHHHJJJ___fffFFFfff}}}HHHJJJKKKJJJGGGHHHfffFFFHHHKKKNNNOOOPPPOOOLLLeeeHHHKKKNNNPPP OOOUUUmmmDDDEEEUUUEEEFFFGGGHHHIIIHHHvvv~~~HHHJJJIII FFFHHHXXXHHHIIIKKKLLLMMMLLLiiiEEEFFFHHHIIIJJJKKKLLLMMMNNNOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNLLLOOOJJJMMMOOOPPP NNNyyyuuuDDDEEEGGGIIIKKKGGGHHHTTTFFFIIIKKKgggFFFHHHnnnGGGfffnnnHHHJJJKKKJJJGGGHHHfffEEEHHHJJJMMMOOOPPPOOOLLLeeeHHHKKKNNNPPPNNNyyyDDDEEE^^^FFFGGGHHHGGGVVVOOOHHHIIIHHHFFFHHHRRRIIIJJJKKKiiiNNNFFFGGGHHHIIIJJJLLLMMMOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNLLL}}}HHHKKKNNNPPPMMMaaaDDDGGGIIIKKKfffHHH dddEEEHHHIIIJJJgggFFFGGGHHH nnnHHHgggHHHJJJKKKJJJHHHgggDDDGGGIIILLLNNNOOOPPPOOOLLLeeeHHHKKKNNNPPPNNNLLLlllEEEnnnWWWHHHWWWGGGHHHwwwIIIHHHGGGIIIKKKJJJIIIHHHIIIYYY~~~gggHHHIIIKKKMMMNNNPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPNNNLLLVVVHHHLLLNNNPPP OOOMMMJJJDDDEEEIIIKKKLLLhhhIIIeeeEEEGGGIIIpppGGGHHHgggRRRJJJiiiJJJLLLTTTIII ___DDDFFFHHHKKKMMMNNNOOOPPPOOOLLLeeeHHHKKKNNNPPPNNNLLLFFFoooiiiIIIHHHIIIHHHIIIpppIII IIIKKKLLLLLLJJJIIIHHHIIIJJJJJJHHHXXXaaaJJJxxxIIIKKKMMMOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOcccFFFHHHKKKNNNPPPNNNLLLXXXEEELLLMMM+jjjLLLbbbfffHHHIIIKKKxxxiiiyyyMMMLLLMMMkkkLLLTTTiiiGGGHHHJJJLLLNNNOOOPPPOOOLLLeeeHHHKKKNNNPPPOOONNNKKKGGGJJJ[[[qqqSSS[[[qqqLLLjjj[[[LLLMMMNNNrrrqqqqqqLLLTTT[[[LLLrrrLLLMMMOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOTTTGGGHHHJJJMMMOOOPPPOOOMMMJJJfff GGGXXX]]]NNNOOOzzzlllNNN \\\rrrNNNzzzNNN^^^NNN\\\kkkOOOPPPOOOLLLeeeHHHKKKNNNPPPOOOMMMIIIHHHKKKMMMcccNNNzzzddd\\\cccNNNOOOzzzNNNdddNNNdddkkkNNNOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOONNNHHHIIIKKKMMMNNN MMMKKKHHHHHHLLLNNN^^^OOOzzzkkkMMMNNNOOOttt^^^OOOPPPOOO^^^OOO]]]MMMNNNOOOPPPNNNLLLdddGGGJJJMMMOOONNNMMMKKKHHH~~~JJJMMMOOONNNdddTTTNNNOOOPPPOOOeeedddNNNOOOeeetttOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOXXXHHHJJJKKKLLLMMMLLLKKKHHHWWW~~~KKKMMMOOOPPPOOOlllOOOPPPVVVOOOPPPNNNLLLdddFFFIIILLLMMMKKKIIIfffXXXLLLNNNOOOPPPOOONNNMMMNNNOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOO]]]IIIJJJ KKKJJJIIIGGGRRRMMMNNNPPPWWWPPPWWWPPPOOONNNKKKdddFFFHHHKKKLLLKKKIIIHHHLLLMMMOOOPPPOOONNNMMMLLLMMMNNNOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOzzzJJJIIIHHHaaaMMMNNNOOOPPPOOONNNLLLfffGGGHHHJJJKKKJJJIIILLLMMMOOOPPPOOONNNMMMLLLMMMNNNOOOPPPPPPPPPOOOMMMLLLJJJ:::b ZZZXXXVVVSSSRRRQQQPPPOOOzzzSSSKKKJJJQQQyyyMMMNNNOOOPPPOOOMMMwwwIIIJJJKKKZZZTTTNNNOOOPPPOOOlllMMMNNNOOOPPPPPPPPPOOOMMMLLLJJJ:::a ZZZXXXVVVSSSRRRQQQPPPOOOeee\\\NNNOOOPPP{{{rrrzzzNNNOOOPPPlllzzzNNNOOOPPPPPPPPPOOO MMMLLLJJJ:::a ZZZXXXVVVTTTRRRQQQPPPOOO^^^zzzlllUUUNNNOOOPPPOOOlllzzzlll]]]NNNOOOPPPOOOPPPPPPPPPOOO MMMLLLJJJ:::a ZZZXXXVVVTTTRRRQQQPPPOOOPPPOOOPPPPPPPPPPPPOOO MMMLLLJJJ:::a ZZZYYYWWWTTTRRRQQQPPPPPPPPPPPPOOO MMMLLLKKK:::` [[[ZZZXXXUUUSSSQQQPPPPPPPPPPPPOOO MMMLLLKKK:::`  {ZZZ[[[XXXUUUSSSQQQPPPPPPPPPPPPOOO NNNLLLKKK:::^ nSSS\\\ZZZWWWTTTRRRQQQPPPPPPPPPPPP OOONNNMMMLLL666 R TDDD^^^\\\YYYVVVSSSQQQPPPPPPPPPPPPOOONNNMMM ,,, ;   6///```^^^\\\XXXUUUSSSRRRQQQPPPPPPPPPPPPQQQPPP OOONNNMMM YYY```^^^\\\XXXVVVTTTSSSRRRQQQQQQQQQQQQRRRQQQ PPPOOO:::b T000cccbbb___\\\ZZZXXXUUUTTTSSSSSSSSSSSSTTTSSSQQQMMM 9 xCCCdddccc```^^^\\\ZZZXXXWWWWWWWWWWWWUUUSSS'''^ .FFFeeecccbbb```^^^]]]\\\[[[[[[[[[[[[ZZZYYYXXXTTT---s N333]]]eeecccbbbaaa```____________^^^\\\[[[KKK"""{1{555NNN]]]cccbbbbbbbbbbbbaaa```UUUCCC***fVq H =[vn Q3 TRUEVISION-XFILE.linthesia-0.4.2/graphics/play_Status2.tga0000644000175000017500000000152211316475030017362 0ustar cletocleto @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@yyyiii@@@HHH@@@@@@HHH@@@yyyaaa@@@@@@HHH@@@YYYyyy@@@@@@iiiiii@@@@@@@@@YYY@@@@@@HHHyyy@@@@@@iii@@@@@@PPP@@@@@@aaa@@@@@@HHHYYYyyy@@@@@@HHH@@@yyyPPP@@@@@@aaaiii@@@@@@@@@HHH@@@PPPyyy@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TRUEVISION-XFILE.linthesia-0.4.2/COPYING0000644000175000017500000004310311312674352013533 0ustar cletocleto GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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. Copyright (C) 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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. , 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 Lesser General Public License instead of this License. linthesia-0.4.2/README0000644000175000017500000000072711312674352013365 0ustar cletocleto Linthesia is a fork of the Windows/Mac game called Synthesia. It is a game of playing music using a MIDI keyboard (or your PC keyboard), following a .mid file. Synthesia up to version 0.6.1a is Open Source. This project uses the latest source from sourceforge. Compile ------- To compile, you need a basic c++ toolchain, and satisfy all dependeces which are on BUILD-DEPENDS file. Then, just: $ make Visit https://sourceforge.net/projects/linthesia/ for more info. linthesia-0.4.2/extra/0000755000175000017500000000000011316475030013616 5ustar cletocletolinthesia-0.4.2/extra/linthesia.xpm0000644000175000017500000002367111316475030016335 0ustar cletocleto/* XPM */ static char * linthesia_xpm[] = { "32 32 496 2", " c None", ". c #3B373B", "+ c #5B585C", "@ c #606064", "# c #616061", "$ c #605D5F", "% c #575759", "& c #535456", "* c #515154", "= c #777777", "- c #ADACAA", "; c #9C9999", "> c #888788", ", c #8C8C8C", "' c #7D7D7E", ") c #5A5C5C", "! c #585A5C", "~ c #343434", "{ c #5F5E5C", "] c #D9D8D8", "^ c #FFFFFF", "/ c #FDFDFD", "( c #F9F8F9", "_ c #A09E9F", ": c #454546", "< c #505051", "[ c #232325", "} c #504F52", "| c #5A595C", "1 c #525152", "2 c #484548", "3 c #38393A", "4 c #3D4040", "5 c #4E4D4F", "6 c #716F72", "7 c #7D7C7C", "8 c #505050", "9 c #464745", "0 c #E1E1E0", "a c #FAF9F9", "b c #757374", "c c #444546", "d c #535356", "e c #18171A", "f c #131313", "g c #858485", "h c #F8F7F7", "i c #FCFDFC", "j c #C2C0C1", "k c #3D3B3E", "l c #202123", "m c #4B4C4C", "n c #38383A", "o c #252627", "p c #404342", "q c #7D7D7C", "r c #8C8788", "s c #898787", "t c #29292A", "u c #121316", "v c #0E1113", "w c #151516", "x c #ACA9A9", "y c #9B9899", "z c #393939", "A c #444548", "B c #2C2C31", "C c #000000", "D c #2C2B2B", "E c #C9C9C8", "F c #F3F3F4", "G c #EAE9E9", "H c #555456", "I c #403F41", "J c #312F32", "K c #545453", "L c #8F8C8C", "M c #9C9799", "N c #908D8B", "O c #434241", "P c #1D1D20", "Q c #313133", "R c #4A4C4C", "S c #101113", "T c #5F5F60", "U c #F9F9F9", "V c #D2D1D1", "W c #4B4B4D", "X c #343634", "Y c #444648", "Z c #818180", "` c #F4F4F4", " . c #F3F3F3", ".. c #D6D6D6", "+. c #4C4D4F", "@. c #37393C", "#. c #615E5D", "$. c #9B9796", "%. c #969393", "&. c #7E7B7C", "*. c #484645", "=. c #9A9999", "-. c #EEEEEE", ";. c #CBC8C9", ">. c #484545", ",. c #484A4B", "'. c #3E4043", "). c #1E1D1E", "!. c #BFBEBE", "~. c #666464", "{. c #262827", "]. c #4B4F51", "^. c #212124", "/. c #373837", "(. c #D7D7D6", "_. c #F2F2F2", ":. c #424244", "<. c #2E3031", "[. c #3D3E40", "}. c #908D8E", "|. c #888685", "1. c #454443", "2. c #A5A4A4", "3. c #E5E3E4", "4. c #5A595B", "5. c #3B3F40", "6. c #545458", "7. c #787676", "8. c #9E9C9D", "9. c #2B2A2B", "0. c #434649", "a. c #4A4D4F", "b. c #939391", "c. c #434344", "d. c #3F3F41", "e. c #202225", "f. c #2D2E2E", "g. c #4A4747", "h. c #CAC9C9", "i. c #F8F8F7", "j. c #787878", "k. c #353534", "l. c #555858", "m. c #232426", "n. c #353635", "o. c #DBDBDA", "p. c #DAD7D9", "q. c #424142", "r. c #313233", "s. c #5C5C5E", "t. c #121617", "u. c #4B4A4B", "v. c #C5C5C4", "w. c #8D8C8D", "x. c #666667", "y. c #131215", "z. c #0D0E12", "A. c #0F1013", "B. c #353434", "C. c #C9C7C7", "D. c #FFFEFE", "E. c #F7F3F5", "F. c #A7A6A7", "G. c #313033", "H. c #4C4D50", "I. c #4A484D", "J. c #969696", "K. c #6F6D6F", "L. c #58575A", "M. c #3E3E41", "N. c #1E1F1E", "O. c #ACA8A7", "P. c #575353", "Q. c #050408", "R. c #252628", "S. c #424547", "T. c #979394", "U. c #F5F4F4", "V. c #F7F6F7", "W. c #FBFCFB", "X. c #D8D6D7", "Y. c #424144", "Z. c #3A3A3A", "`. c #606160", " + c #08090B", ".+ c #565656", "++ c #FCFCFC", "@+ c #A3A2A3", "#+ c #2D2B2C", "$+ c #464646", "%+ c #515455", "&+ c #161619", "*+ c #747171", "=+ c #A9A9A8", "-+ c #D7D9DA", ";+ c #484647", ">+ c #535455", ",+ c #101418", "'+ c #585758", ")+ c #F2F1F2", "!+ c #F8F6F7", "~+ c #FDFBFC", "{+ c #666365", "]+ c #2F2E2F", "^+ c #656565", "/+ c #313336", "(+ c #C7C5C5", "_+ c #444344", ":+ c #232326", "<+ c #454849", "[+ c #464647", "}+ c #CAC9CA", "|+ c #B2AFB3", "1+ c #504C4E", "2+ c #585855", "3+ c #313738", "4+ c #1E1F21", "5+ c #C5C2C4", "6+ c #FFFDFE", "7+ c #F9F8F8", "8+ c #969395", "9+ c #28262A", "0+ c #565658", "a+ c #575558", "b+ c #868484", "c+ c #6F6E70", "d+ c #191A1B", "e+ c #1C1C1C", "f+ c #0C0C0C", "g+ c #868487", "h+ c #D7D7D7", "i+ c #525053", "j+ c #525051", "k+ c #4E5153", "l+ c #8D8B8E", "m+ c #F7F7F6", "n+ c #CDCBCC", "o+ c #343435", "p+ c #3E3D3D", "q+ c #68686A", "r+ c #18191C", "s+ c #6A6D6D", "t+ c #A6A4A5", "u+ c #605F63", "v+ c #15191C", "w+ c #5C5B5C", "x+ c #636062", "y+ c #4A4749", "z+ c #626163", "A+ c #070D0E", "B+ c #555356", "C+ c #F9F7F8", "D+ c #F7F7F7", "E+ c #FCFBFB", "F+ c #F1F0F0", "G+ c #595758", "H+ c #2C2A2D", "I+ c #6A686B", "J+ c #2F2E32", "K+ c #2D2E2D", "L+ c #EAEAE9", "M+ c #726E71", "N+ c #5A5D5A", "O+ c #262A2D", "P+ c #2D2C2E", "Q+ c #D3D0D2", "R+ c #7E7E7E", "S+ c #3D3B3D", "T+ c #646566", "U+ c #2D2F33", "V+ c #CBCBCC", "W+ c #FEFEFD", "X+ c #FBFAFA", "Y+ c #838384", "Z+ c #222224", "`+ c #4C4C4E", " @ c #545553", ".@ c #B5B5B2", "+@ c #D3D3D3", "@@ c #D8D6D8", "#@ c #595856", "$@ c #505152", "%@ c #414346", "&@ c #050507", "*@ c #9E9EA0", "=@ c #605F61", "-@ c #484B4C", ";@ c #929193", ">@ c #F7F5F6", ",@ c #FAFAFA", "'@ c #C1C1C1", ")@ c #1D1C1E", "!@ c #3D3D3E", "~@ c #E6E5E4", "{@ c #F3F3F2", "]@ c #D5D6D6", "^@ c #EBEAEB", "/@ c #575957", "(@ c #000001", "_@ c #737174", ":@ c #CECDCD", "<@ c #3B3A3B", "[@ c #606363", "}@ c #010507", "|@ c #5A595A", "1@ c #F9F9FA", "2@ c #F7F6F6", "3@ c #FBFBFA", "4@ c #E9E9E9", "5@ c #D5D5D5", "6@ c #FDFCFD", "7@ c #696869", "8@ c #444340", "9@ c #676769", "0@ c #13191B", "a@ c #434145", "b@ c #EEEDEE", "c@ c #525153", "d@ c #404040", "e@ c #6D6F6F", "f@ c #1D2122", "g@ c #2E2F31", "h@ c #DEDFE0", "i@ c #F6F5F6", "j@ c #F6F6F6", "k@ c #ECECEC", "l@ c #646366", "m@ c #F6F5F5", "n@ c #828183", "o@ c #3D393A", "p@ c #2C3032", "q@ c #1D1E1F", "r@ c #C5C3C5", "s@ c #706F70", "t@ c #302F31", "u@ c #747273", "v@ c #424546", "w@ c #0F1113", "x@ c #E2E1E2", "y@ c #FEFEFE", "z@ c #F6F6F5", "A@ c #FAFAF9", "B@ c #EEEFEE", "C@ c #323137", "D@ c #A19FA0", "E@ c #353234", "F@ c #44494B", "G@ c #969496", "H@ c #9B979A", "I@ c #2B292C", "J@ c #686A69", "K@ c #58595D", "L@ c #141315", "M@ c #989796", "N@ c #F8F8F8", "O@ c #EEEDED", "P@ c #474C4D", "Q@ c #101218", "R@ c #B9B6B8", "S@ c #C5C4C4", "T@ c #353637", "U@ c #5F5F63", "V@ c #5D5D5E", "W@ c #656467", "X@ c #C4C3C3", "Y@ c #2F2F30", "Z@ c #414143", "`@ c #646467", " # c #636261", ".# c #EEEEEC", "+# c #FCFCFB", "@# c #F5F5F5", "## c #FDFDFC", "$# c #F2F1F1", "%# c #7E7D7D", "&# c #525455", "*# c #00010A", "=# c #939296", "-# c #DFDFDE", ";# c #3D3A3B", "># c #514F50", ",# c #717373", "'# c #111315", ")# c #3D3D40", "!# c #E8E8E8", "~# c #4F4D4F", "{# c #0C0E0F", "]# c #888986", "^# c #F9F8F7", "/# c #F4F4F3", "(# c #F0F0EF", "_# c #7C7779", ":# c #666564", "<# c #616363", "[# c #000107", "}# c #6C6A6D", "|# c #FCFAFA", "1# c #5A5959", "2# c #434243", "3# c #827F81", "4# c #292E2F", "5# c #1F1F22", "6# c #E5E6E6", "7# c #949392", "8# c #E7E6E7", "9# c #FCFCFD", "0# c #FAFAF8", "a# c #6C6B6D", "b# c #595559", "c# c #6A6C6C", "d# c #070C10", "e# c #434245", "f# c #F0F0F0", "g# c #727272", "h# c #28282B", "i# c #7E7A7C", "j# c #424345", "k# c #929293", "l# c #F2F0F1", "m# c #747473", "n# c #4E4B4F", "o# c #727277", "p# c #1C1E22", "q# c #272B2F", "r# c #D3D3D4", "s# c #919090", "t# c #2B282B", "u# c #565659", "v# c #606365", "w# c #595557", "x# c #D9D7D8", "y# c #EDEDED", "z# c #898687", "A# c #413D3F", "B# c #7C7A7B", "C# c #36393C", "D# c #101318", "E# c #AFB0B2", "F# c #BCBBBB", "G# c #2A292B", "H# c #242428", "I# c #595A5A", "J# c #EFEFEF", "K# c #F3F0F1", "L# c #F5F3F4", "M# c #EBEBEB", "N# c #D4D4D4", "O# c #F3F1F2", "P# c #A6A3A2", "Q# c #3A3A3C", "R# c #7F7C7F", "S# c #494C4D", "T# c #98989B", "U# c #E0DDDD", "V# c #4D4B4A", "W# c #D2D2D1", "X# c #FEFBFB", "Y# c #F7F8F7", "Z# c #F2F0F0", "`# c #E6E6E6", " $ c #CACBCB", ".$ c #EFEDEE", "+$ c #DCD9DA", "@$ c #E5E4E4", "#$ c #B3B2B2", "$$ c #383536", "%$ c #6C6A6A", "&$ c #4D4D4E", "*$ c #06070B", "=$ c #0A0C0F", "-$ c #C8C8C9", ";$ c #DFDDDE", ">$ c #E3E2E2", ",$ c #E5E5E5", "'$ c #E1E1E1", ")$ c #E2E2E2", "!$ c #DEDDDE", "~$ c #D6D5D4", "{$ c #CCCBCC", "]$ c #B7B7B7", "^$ c #BFBDBE", "/$ c #ABA9AA", "($ c #B3B3B3", "_$ c #A1A09F", ":$ c #353333", "<$ c #535053", "[$ c #404041", "}$ c #252727", "|$ c #AEADAF", "1$ c #B3B1B2", "2$ c #ADABAB", "3$ c #B2B2B2", "4$ c #B2B3B3", "5$ c #AEAEAE", "6$ c #A4A1A2", "7$ c #757575", " ", " ", " . + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ ^ / ^ ( _ : < [ ", " } | 1 2 3 4 5 6 7 8 9 0 ^ a b c d e f g ^ ^ h i ^ j k l ", " & m n o p q r s t u v w x ^ ^ y z A B C D E ^ ^ F ^ G H ", " } I J K L M N O P Q R S C T U ^ V W X Y C C Z ^ ^ ` ... ", " +.@.#.$.%.&.*.=.-.;.>.,.'.C ).!.^ ^ ~.{.].^.C /.(.^ _... ", " :.<.[.}.|.1.2.^ ^ ^ 3.4.5.6.C C 7.^ ^ 8.9.0.a.C C b. ... ", " c.d.e.f.g.h.^ / i.a ^ ^ j.k.l.m.C n.o.^ p.q.r.s.t.C u.v. ", " w.x.y.z.A.B.C.^ D.E.h ^ ^ F.G.H.I.C C J.^ ^ K.o L.M.C N. ", " O.P.Q.R.S.C C T.^ ^ U.V.W.^ X.Y.Z.`. +C .+++^ @+#+$+%+&+ ", " *+=+-+_ ;+>+,+C '+)+^ h !+U ^ ~+{+]+^+/+C ).(+^ 0 _+:+<+ ", " [+}+^ ^ |+1+2+3+C 4+5+^ 6+!+7+^ ^ 8+9+0+a+C C b+^ ^ c+d+ ", " e+f+g+^ ^ h+i+j+k+C C l+^ ^ m+7+D.^ n+o+p+q+r+C s+^ .t+ ", " u+v+C w+( ^ )+x+y+z+A+C B+_.^ C+D+E+^ F+G+H+I+J+K+L+ ... ", " M+N+O+C P+Q+^ ^ R+S+T+U+C [ V+^ W+h X+^ ^ Y+Z+`+ @.@ .+@ ", " @@#@$@%@C &@*@^ ^ 2.n =@-@C C ;@^ ^ >@,@D.^ '@)@!@~@{@]@ ", " ^ ^@B+u./@(@C _@^ ^ :@<@< [@}@C |@1@^ 2@X+3@^ ] !.^ 4@5@ ", " ^ ^ 6@7@8@9@0@C a@^@^ b@c@d@e@f@C g@h@^ i@X+a ^ ^ j@k@+@ ", " l@m@^ ^ n@o@6 p@C q@r@^ ^ s@t@u@v@C w@x@y@z@A@++h D+B@.. ", " e+C@] ^ ^ D@E@K.F@C C G@^ ^ H@I@J@K@L@M@^ W+m+N@/ ,@O@.. ", " P@f+Q@R@^ ^ S@T@U@V@C C W@^ ^ X@Y@Z@`@ #.#^ +#2@@###$#5@ ", " %#&#C *#=#^ ^ -#;#>#,#'#C )#b@^ !#~#{#]#W+++3@E+^#/#(#.. ", " _#:#<#[#C }#^ ^ |#1#2#3#4#C 5#6#^ ^ 7#8#9###a a X+N@4@+@ ", " 0#a#b#c#d#C e#f#^ ^ g#h#i#j#C k#^ ^ ^ ^ l#X+++D+N@N@-.+@ ", " ^ ^ m#n#o#p#C q#r#^ ^ s#t#u#v#w#x#^ 3@+#a $#!+++D+j@y#.. ", " ^ ^ ^ z#A#B#C#C D#E#^ ^ F#G#H#I#J#^ a a ,@U K#L#+#N@M#N# ", " O#^ y@^ P#Q#R#S#C C T#^ ^ U#V#W#X#++++7+N@Y#U K#Z#N@`# $ ", " .$+$@$`#`##$$$%$&$*$=$-$`#`#`#`#;$] >$,$'$'$'$)$!$~${$]$ ", " , ^$/$($($($_$:$<$[$}$1#|$($($($($1$2$#$($3$3$3$4$5$6$7$ ", " ", " "}; linthesia-0.4.2/extra/linthesia.desktop0000644000175000017500000000022511315202073017162 0ustar cletocleto[Desktop Entry] Type=Application Version=0.3 Name=Linthesia GenericName=Piano game Icon=linthesia.xpm Exec=linthesia Categories=Game;Music;Education linthesia-0.4.2/docs/0000755000175000017500000000000011326126710013422 5ustar cletocletolinthesia-0.4.2/docs/web/0000755000175000017500000000000011326126722014202 5ustar cletocletolinthesia-0.4.2/docs/web/index.html0000644000175000017500000000263511326126722016205 0ustar cletocleto Linthesia

Linthesia is a game. A game of playing music! You only need a MIDI file
to play, and a MIDI keyboard (or your PC keyboard). It's a fork of
Synthesia, which only runs on Windows and OS X. Linthesia is for GNU/Linux.

Sorry, but currently we are working on this page (and in the game!). Thanks
for visiting and come later. Meanwhile, please try the game and leave feedback!

Many thanks :)

linthesia-0.4.2/docs/web/css/0000755000175000017500000000000011326126721014771 5ustar cletocletolinthesia-0.4.2/docs/web/css/theme.css0000644000175000017500000000175011326126721016610 0ustar cletocleto/* -*- mode: css; coding: utf-8 -*- */ /* Oscar Aceña, copyright (C) 2009 This is Free Software, under terms of GNU GPL v3 */ body { background-color: #00112b; margin: 0px 50px 15px 50px; text-align: center; font-size: 17px; font-family: "Trebuchet MS", "Helvetica", "Verdana", sans-serif; color: #fff; } a:link { color: #fff; text-decoration: none;} a:visited { color: #aaa; text-decoration: none;} a:hover { color: #fff; text-decoration: underline; } td#menu { padding: 0px 15px 0px 0px; } table#menu { margin-top: -10px; margin-left: auto; margin-right: auto; text-align: center; font-weight: bold; font-size: 20px; color: #fff; } div#body { padding: 20px; border: 1px solid #fff; } linthesia-0.4.2/docs/web/img/0000755000175000017500000000000011326126722014756 5ustar cletocletolinthesia-0.4.2/docs/web/img/icon.png0000644000175000017500000002364511326126722016426 0ustar cletocletoPNG  IHDR@@iqsRGBbKGD pHYs  tIME  !W#^ IDATxgt\yM m02 ")vZ-qlvc;&];8>YDZ-DzEQ DR$M6H6vMُ>{y.܋><ă/Hx7&%ɯrr``&u/} `Z@ Q@O"`t HJJJ rs˪ɪbw$$IFeY(i($I$'~/`8$Ӊ1l;>"`IT4Eu @;G'IwDUUhmm!"--]a^x0 I @`Kn>fBm_7Y߇ەJ/p0LLlTVtEBdY%??qnO*´ Wr⽓ RZ< jk8s ?>0Y ,#-|EK֡>XӿW_!%%SD8z"ѧijkϜAY^23A<r"!2N4nw qa(/+r<O?8__AIY9m-))i{l7:8zzHMK%add%KwMyEPUM!,a`Z&nwηMBz {:fo(jimIu؝ #N4h~UŦju4&VU#,[4_.3s̥CaQ .dٳMcp$;v dFCvx\'QUUUib:$Q5召ٳg7)HL'|]15TϟDBdePT۷$ xЩWIVz&a0~x&֢j*׮6sj3]=}Uq7~<$a x"cci#;#Ξ^ii >Ξ<rrPTH$MCeL$nXqϗGWIg\q/?(S\\5'b fCQd@0Mt=(MܹsǛ6r/6 5ۛ]Ma$1<4D(4̛̌#r i"+2/^t~4M̹SLqFkix239r(R4M#"2-^ČfN|L4;ήnxe֭\v dggc h4i4 aYI(&9t+W -= @7 AœөT`h$a&eǎo?2k_xcUbJy:ese^޲#cABTM%c&UU~t5:ˎLJׇe DV4Ξ9޽oGMM-6Ph @Ut=J,c޽ǯ^z|@zfVSL7DTWUQ^VձLÉIyĻϞ/Ӊ,)]O=E(cÚ q;]dysѣד_]sشiaܳ Iq:D7LikmWEӲ&RR\D8v P( @?'Jm@$\náC1-q$dI²,(O;'~@9TOH\݉p8]\ v¦j̚= M8Rov@FjUE좽p\\))NOo/{4+œ9sCQU4M$ǣڹ?Iu" EOO?O>bydddcHTVUqF._țo BY|?~,E޳25k.`pX, 7;;фxqrEV^SO=Ÿq㉄äzǙT[KQq1*6mDkK+;vn'&L(M" ?؋'=`0̞];A2t=Ʊw7-\'BHsu~ȼ9s0L,BdI0 iea Ann.m|V^ٺXܢa,ʊ By6Bl.^ =b٨J(&==֒Igr2!׋˝fcq(,, LocQd-` 4ȂiIKS{MLJIY)`"#)21=eZh RaX8)]TO\qI*'5-;]= '\x3zzI9k& 4rAڏ/'23q`Xdx0-wx_o(** LiD|[tv##`ul+8]ny\knfΝNl@QUbF$! 44Ia0k&gf /q-̣z\%\"(wLM%%%SNQZJ.e2o@_W7lAEEx3Himk~P0Vcɲ<'Yaw hKWbPP\@0;8{=te$P5 KqUQPU!,(BYy97l㋼s'f|l)6;ډL23_#ӸUQG*G_JG+C?yyyU5}r1o0edj&NI?{t=*˹|^9y])=u=PZTBUu`"!aqhRk6M!,2xt(Ͽ<==QWHvppnR=iɡC9w 'M"7//  3?wǏÑcG߹sz-YO|)έիWsQmi̟7ZZo**9yng=q8BddI4-*!Z[d΂yTd箝  K *= 7q{ks8a""Gcشi#wo{nb8^/Ã;;yΟ<NJ^^ޘ/'GdzsXz5K _=gHiYȊici&P5<β8Q'#na2 mi9 E8&ՓʊU+ar~p$x7[zJiA j&$s~ KXʒx3?^$ST\?KvH$`t6ܹ,iZB'PdOcVL{{#d|>_ ћdIˡ_Bp(* H,AL Տ`f tܦ ^4.lDQU,@QddE 0-4MC%bLB.k{KW.(-юƕgN&EB4!n1w{|sfi:}}Bee,ogxGpH](gٽ^xhZx4kC` LJ1{<22Ɗ+,cf֠IBe,@QT&ML&9:< fer:BFSl(BMc|\TdED"8pd{֯o N78D~~>Μf޽̨'/?I1M 6mk'?dCt꠻?nS~J$I´,T Ӳ:,j*K$6l@wO7/l~4).-#+'x,7XhMşKiIJTA$dȕ8wt7.r,2}\ vH~F`Z&BR\.֬YOFY`!E r6ov.ׯ]$3w%A),Kq$ EUAD)XfժU<\~ HIs "d)SHrdct>%M?)%#\on|Ey׸r瑒$%q<쳜#Q3aA[K H,s`^]SDDR8B̚5Yfs[=v^yzxnl4|6PYYӿl ?я_O ?"Ŧjs(G˔)Eeↁ"PB8o40:2SiEWo?T)n7{7K Y7P5-!,@%6lҥKܾۍd080|\BLX,F4H@eZ$-7,QY9A #t|Pl/&$',AII)Gaͪݷ_cO@f{^.elye -wN"2 /αw2MffΘΆ+).ȡYHTNG/ti=" !+*t:bDQTMf!8]#'lވƢcM0a't$ _#c6>GphDM֮]Ca7nӍ;-lK?fΝde:ur¨Y$QT\uy6 &((!fŹz˂RGضuaҸYAJz,iv H&w( ۷q(wyiaܞT7YXDFZ:?r2n_f3Ϟ; FXظ0!a͚yFujk lkchxlT{,kZf 4az ͦ%%W@U:3aώrM{^G@aI>O$f6P_ǖ^'1csfĈ|H$BNMq`~ӦN#˛4M˚fez +SYY?Kw_C8].LKpQ_WMlP<"+h,M{X'vZ vlNfj:S&ď#IƱd֭/S^YC qCAix28{};ƲJY^z^۱%J 9psesEa`C Mf(j"_dffbf(aGF;wnsW|99^/̳ϐɲeqF mN~ml}y+l%@0M$Y4 mۊj1aB5;ڑiSDh,'YVIlPQDUXr?@MNFfMeqe6.JTfcӿz/nb5wnvUV/4 m{~ϙkw/Jdyb%JIq8xW'h\Y3#!nla(&0gމ={6Y,Hs| r>yל=8NbQ=ER-7.\X ;eDd fC\,7T`M<_ٗ,[mhvSI,^[$i%)ao}•K|a> X MUiki'œNj"GyŋsdYJIUzmi6" bx(;E՛ص@d"s).gۖ-=qUQ?'w dY3Dd|:(jYBv4Y% a&ݎhRbja,/}KqGtbßK_?7o%b$kaY4e 37w>vލߗǂ9 qVU"PQAFF,[{2Tͮf MxuSb{|Kx1.J7H.qW (^ra\n7(Qݕ7;=8N}sϾ@A~&-;׮ݍn''+ήnOyY9e&TKQLJII|n  GT;YxoF:?ϸ|  EGYY .^$';Oz1]gddH$B(&D"aFB!,ehx8OagFWgaPb.WÑ#G~rĉsQ1>ܴiӷGI$Fcx?Ӛ~x,@ذqe[#=CwWŅ%]d<CdTLJj4ѣ?yq7p;Y(I9%%%ehL$ NFѓel6=tN%5M44u>JLAQXn;;8yHdI`iiiigp2xgΎ?Y=>st~ӣVrM[5< IENDB`linthesia-0.4.2/docs/web/img/logo.png0000644000175000017500000010707011326126722016431 0ustar cletocletoPNG  IHDR}W sRGBbKGD pHYs  tIME +5 IDATxw̜s] `ذk4$Rn~cFI&Ec{=ef]\ L`9wy"D!B"D!B"D!B"D!B"D!B"D!B"D!B"D!B"D!B"D!B"D!>CH=>WH"DPqn~mKC@ϼ| !B3?cЭ] i^)#k}l H3 hU6,+\WUL @eY>QejTDGHOUcxI} tUx")  (S2cJΘń!Dh|Es;R'fꔆ&D IJI)ڻIy)JK]^E<'?/EYz5VSb75K/q"L0|Myddf|a [n_eРA PMqQ) .bݺu84:]|y-.bFMNn.DT*mD","JOH|9s1rwv'3g>uRX\/7'w^KkKYme"b<]GU?WU#"̿y&i yJU"R*"yFN2!l3Uu诘5 T&g`Pw W,4> lۉfgga"-ttc"(-$I8` r3ONnmj*,Om]=¢ yWyG9KC$!F9n >7<ȣ,_F1z(JJJYx^_Do6]~9ON~md"AuqeJ<6bC oO~{oXpUPPn;v([NAAϾI "lvVmmyu 35,m 0c'!"+{ _F!j!GoPZhdQ-9Ŀ[V*YEEEbiok%Dp(dZŸc9lʊJNX,JCS=K-az.-mmxyHevp kg+/DX,F2$OPYՋ{~s E"]]qZ[qq9s9¶6mڴǍ5fH潯K-ˊ#r/MǁaQ6/|ѽycZ~;l˲,+eYF˲։H4 yh hBA~GAWEF8:;iooWHKKljD˦*J8/qqDHe[A}}#kVm`tu2axN:*KItF^qx=N>Tj*"CWWT_9w>L>x=y\RLT&g,4ϋCh7^'""xxTWL"M_H~ X<("r|w;"opB_' b[biضl9zTzx"I4˰Nu,\5br 1g(g}GuTV K*eq3>}:<,GFF+D򿿾o '}ˬY3xH5wÆBH&RddfS_~8C^^-tvu""b!EgW8 X򼍲klw"Ҷp.!""ax_U?PՙDU]ҏ<]DƨꑪZi*%v4ts¡SD~/>7E!4'sDA,˲pl%j X5!D,Nks tN4B*bႅ,X!CpWɰUW\ݷc߀< ]LJG|kgs{e$I:::HKOgAu@~Ozz: SSW_K,-`6͛o7ML* qHpv{.>@ =/0M@|_gYTu%𐈼H 2cVx ʶE4u 1(Qve*'JEhQհphlc;BWWbiQA5"i$H$0"daي:i]v yeᦛ`<.9B^}%ffhmiλsUW1uT233I&e1n8~pzO∣!(-.d,[6i4mj˿yO^^>mtvuNZ,ѽ9P^6[Y{ ,v煮4}PTXj-ͭ(66pM0Ï9s6$ikku]P L[>7DpUomBgg/]/D_$@}Mp}dC}+W8dgfQPO}C=5j?~<BYiDL, \W233v)׏3~FƌCFSPXsilDzf6!W#R|"` ҧꓝ!B^U,[7zd"IjzWa r=b4::ڙG̟7}CuM5t7g˗-qlzWP^^NZ4dG 7E,#v>C>xhq/Y2kҥ ]me/k(Ӏ"=xFD]aDd'Ev''HU8& XB2$LһOo^~x͵65#d c2z2cJQQ { /oXC<'-=3s]wq Әw|T@vFml[π!Lr%Eֻo]on5uDQca"|D"b[bY z$(]^ʋxo3I##.bYh"u|{eEDfcArM7rӍ7vŹ?3o|3| ƎI>)/.r22bO?f0¬;$WDUuLRfy_Dfy@ɤ? gF'?Y`? (HU*"U@6`~,"bIYg(zAއqU} h5-Dd֦)#`1wHDDnέ0Y^09%"T^D+"UϨcP.UHA`s1JGoV`iO "{ĶzH/`0ppUmRDBYC04*/{,c4e=zE$ V@%A UM39a&TՅrZU5?v65o"Jp9_Ӧ*DQ*{Wp3;9ȣ9a˯ʆ:2s(UZ~|;f%A^%ObG,IMFv_r! 9[o^~Ws8fYy,Xe˗ޙ +;M-r-̝;_~9_:K8i|ߧo} 6_|i5޽Mj5U@O}[U3EOM4\k$AclU-4 nTjP}]HDUEd$p,A LČQEh#^P'ڵ2:XDTՁƓƋ=?1 <.-F%"GU1,I_&"x[D6=ثƤ PhUk~2%G[2'gϫ;oĞ<Ff5Qz P MD"bgUd6&Gl (=srLV"R5guOmDd1E$MUcc_דVc*"o @up++8p}Ja?Pn<3]&0})7pM^A!x'>(W]iO#\mR6m[4\4xdJp@?ЉQ3l Yx j&yK,Yw{.JŤ ;xjjj73ϰjjOFF-͸a1B'OD*Q:8xj9卛F"T"2U}Pn] Er`33Bڪp IDAT"R>Qk)?(]ke x;UY,ҽt,jU.M&ᘳmn*:OU/NJȫ#:6MHDg1zED:~ucGMȢP݄Ҍ!dg-}i@9TU'j6fXUuc3xƌmLcHGWՙ" N H'/*MM͜(*,>XŐ!C~ӟG{'rqQYYkIS&rrsɋ1{Z̟ŗ\LU>X≋xmzD"8{$ "5qUd`u5wq7/>qر 9@ Yd!KW. aɪx-̛7+IS&zqݏcС{|,rHFkNrP{/wk35@TP Ϳٻym(U=PD&c* vkkk׭-&88bXJ8㵴{{n mZ{2 {kĉ7[czĶ7uɄ+ JjQT;er^&" S6Q hh(zUxWU;a@VվFX[1j 6ʽjNL)fB󁷁Edv.(WH9PUKYsgq04e9amanFɝcäaR"򆪾!"+Lh( 4 $5;4WfF1&#CHOkײvjf>,K-K/gm;#PT\ȹCYE wy'?"#Gb1V2Yr5YRmw˹ࢋ44*#w+پBxx݄B:I,sTydOj ه)Iw 0R|Fܓw,3p>Q%sFI&_l؅aƣl8U'"@|&%LUU=(jşz;|2KsIKOcڴis˭eS S׾ef>"}8s/;./NQQ"|rm,A=/s]"@YY)o2٧7v Cf̈d2l<_ywkhc AFf'x"U{ʫ0Xb^u#b󰶪곆fgh͜=Uc֪)& Gַ[j/9UU&h@k}ggnŶ-&LHiiz!657r)'S_ĻK{k3ٹ98(Wb\pх mYxrWH-}|OI%8QO}xƨ#: sYp>6"iidfdbry&r9YxGG[0h|fL$UR?h&Q}@1ݹ|JDkТ,9߮c3c$^`])a&WA`> HkUu$A.05H3HYdh&r8+W,ŗ_bSk E%%23pG|z<+WVV~}r/;^}ujIɣ/3o3jH}W<^~tW[w0fh+IH`jmVAChonaݺddD"Td2I+ bBּ6ӣ"2_U%(x-=""Pn,i@T/"P#HzWUMrܻ6\U+ETu.CDd%."S\hB@u3x_S~ױ = =`G`9o;UjhYbykB/i[wنfBa45m""0y$N:Tsro --{'?aY$I"NPy.\vvǭTTqwbĨt4!сzT"=''~ /~, ,h'Sd*X`믿 a@Ukq;=&w7Mx ڰ u],⨣?='}qJ9?n4Q[hoi%7^Yb9O~ڵke h۶]"X- : ݋kggSO;u"TEEU/,&3ouU Kgj_yyyu0pq=,&M9D~moDwP݆V`kkE2ֱص\} fOG+JYbvCz]v# ݱpS M:Y oauS6 4-nɫg+@SἻϏU57z6e{w}&0-,ezD+9/ڹg_5{y9'vzbvi׿5W~*^~5|Ƕz\u߽ww{p3`|ϥl+zʫ/qgq`-"qR$8NP."xG"GƌM7ď:::xX~ljmaa`N`Hz^({[yyVu3PFo(Cw/0MgԪwW2[*#"f~ęAU ؇E 075M[k* Ԙݧ-"Y=gtA]|<`VZ uw(]9d{q>ُ-[w`ѡ]VTtFZy$ 6sWyWQ3h _BKú456_RJVa3_|+[nM8 (I7I,cc=x|h$—;c=\655J+|o=pb d*ImmcIp0S)d*E^~\z w}cG晧䡿=HUYo&MBfV6D˲HKKqpJ+'+.!mJxJGa[ -Uլ}vr4v%i/ K,͙ŗ^J͠j, {_HňD\<<_Ix laȃkiiiaРAR)TvHR$I\EDmT45 gΨjiUz& u߆=ɽ>wx~4ݖ4=Ma[:h[237<[PIXUU53 w kw׃7Ϟ߃?WDn#5֔m^AQǤABaٶֻG 478LSg(//SO=R|}a8ǟ~%+VRP\L[{ Ͼ׭K. ;7q]B9\J˹[lXqS?Fr(.f7a'DKT2E< a*<|_qmSQYIyE)\ r"^ys>fS[ ٹ9ؑ?뮻Wr0pDR N5MoK6jǶ%nwf uo?ݭZkfif4G̔Ct^'MF͐Sz>e1r(~Ǟ| {TNކ n~F>=:*n-(JF {:_D~H@9gDjz4lZ!"$-hV/ ?PguצxsQ&"Dd AENEl#"4C;`\p 14|_-; G^GqI ӟۃS9Љk`ڵgePҫ7MuX~ W_u5M:͇~Tƛo駟aC1l(GO:bfϙæV226.g?)d+,-$x)7l{g[Rꇂ?Dѓ ]Lv+/6wX広>}j6f"l6K0PFxx$ nuؗ92bLH 5 "uU#dgR0yd"Hj"f?q7hN'S ~s4&=c[#q-͝??!K yrEo_v#88ĹL.e֓no\=eF~&Onj|-<쳌l{V["ԩ2jH}m]'<'2 Tw,>~&D6QƲ懍&U)p..Ñ*'lQ4q+ ["2RD HDNQ՝{"r=U x[D['4׺E8h7m| IDATN.0a*ko/s>zs&OO~S.bZ◿䕗rrYgԉts}+;~"zsx]=Y,#8z|o[&Oܚ<ϘΘETyGhiiA,"?t‰{A{kkV!QQń);wޗkhi^gC#Lr1k#owտ jN=T?kiZTO'O'3n;-KESDV;!ț"n䌵aW 1ƿVUSU&j80= p#`^[pmq/wxCSJ(l7֮Rwᅼ"IJGb3g沟<\y54wpsdzĉie-#9vr݉b1bX8]Fm;9XDb 6"L׽qsU<ϫRպ6 gYV.Q{D_DMLbg{,8Jf0O"?p|FD0]LзE?DdeYP ;5nX[.v&G~('GT9a„)H$-o}{}~G"Ϙw/z)k7Ƣ7Ԏ;rqG3k]P'GӚ5XλKޅůoZ[[#МKMM =\S{6m7{_N>4d {E"8`Ju΀?r3"2OH#(C`ys˲RLU/Ti"ғ$UmUu;I|(y`'U jkZ<gD/IyϓϷ^^yDxx8N^Ŕ>n%"7D$Q8?_m}MU]i-X~=r0{ܝly z;/.\D&Mmm vWVrƙgS 55|=j,\} =0M-k99d΁ԎӼȸq4\v} urض{d=gГNNq=dp]?fd2c4u]rz5>iibi'>Mgd_D"ݳ%"L `>~z8&tР i;@|T{(`xBRj)Qt>)?˟n?&o=\CO/|LcMb \K.1_\>ɳ;9?#?sACqo1hmŠ{;H$pl>Q%8TTTPLdXߎ:b1&KlX&*٤!:́vL3-཰B[?1إoؒ8HrK:pDZ0w@4 ?NƩЌޯ_;q, Y`Bafݎ2!V{7 _Y("e`{|R˪|`pFwVD\k=bEzL;e8mo;~OEqTUn˔^N%֒e-l- LЀ}?;wկ7㔓OSNb|ZV50Id ^r17X\6bG"l7}{nMsŕWӓ]vvdHVU{S3W JG5&mZ QU䬈,5AAa#griye/rD;0eQ/SfD 9j?FܻJUG#], }\RnPftBhop|v'jU}DdyK!=8%E6Mty8L.;6lw BX;:z8B'WF34( U!9X<4- 德/'>VH 0fmRd%FJxfnf+ '%pPU[ *0q'fCk1ǔ\NoHUCb䣁6J p܍/4 u#b k׬՚uub[6(>q3i5֯k怃pI'r˯YGM#Y|9W^u%#G5rqcd8=Q-x45tttRQ$Hb7kM>Q JlJw f5NK&lfżS._f'K^4l&׀Hn 7U=HD1Ӫ4"Ax%i6z<xרleޟ5O=0~ghsp_0zhA4rSNDU>ϰԋyyUu_9Dw35I B:u"Rkv-gZkiTOZZֲyo-@5pqV(. -Ff bL3w[wJQ>|dYiUGEnU]WX(/ƙ& _ZD^1AS02~JDS*O >&}Y7ˁLlASwEΌ B|K+SDk3̚D"dVZ׭SuA(n1  Dyԏ~u-w̱q)A,ƍⰮ 3~qGjjjIU#Y.y^]RUw'EvUgT/kK 4ω|H{ 3i4HT7饉^ZVUPUS,Q~KEq&?9$\v[p6>`IϬ2Z|c8QMUc 1T:) )">F`w`yb{IJ,<[<("5bg*ٜYs97@"g)B2Q~ZeTf"":p+tз{*wQ7bؖISnm jrEH&9s&̛--8ЃFm,}s?~,].=(|(N.I$yWGq3YwLbٶ`~yQ סC{R)R)iji~w-7ޱ[ ~D}@Nj\3'@q.jZao.GDjo}LZfvvy m 9kwU)aU`es#3* yC!Fdj#p,T'ȔWL*Z^<L] C<T7hIS?"5Υ\Um}{75 Dgϯ<4wTS7zk?\WV] jVUJ3}}M/`ELL4#D\EUkHDjYFxTg'i0{_ AUYD^ﯸYT՝U@i%H}_ODU!Udd1i|c{fJɤCs?7Ū:p3q&۪O7FD[gs[*`W_u̙NJSn;ɑJRYUp{ k<'y|f#yEԎcԨF:;:;z,G~;37 /ϖXxw \uֵkYںv<0-X`mfc& :EDf#xDzU}yHm+``J)9]U]FDȂO:Qaƪ E CU.q:LeB>!"7FGԩj<Բ\xZ&Tջ,35e6EvZaZr&NU}٬\{#ϩz""M:ADf3Tuk36fFMZ , IDAT,(UC̚nV *&CUg4!iZʲJ99 5&{cTu'xU5jf n=z]y\8~!dip`-[6NBx\U=l(mvuJƀ c\Ǎ:~7>"0mJ|dTw7֭ò,k2٬8.h@J_eVAA<|r/gWKכ Ț^0Fjt^Rlk6G 0xڟAʁQN֛ pD/T GY C\k1'STgH=Ed1 c3: 7 9&B1DXc`J<.pMvP-~ydq<+n1ưHz5:QU LɻW(ϭ`x6"RO$"owsG` *wq(8CBD5t7b8'1{k *𪪾'"/(T J`q*8=/"/9;{<'Kˆq(d؁4P>@n,S_f~:jj|GD"+FHz匑qrzxq0+:d D6@ӗ7hc‘q.L41T|E275r t) BRKNXT]ơ NmsҼ_&u¬|\4n4pR$h/#"f$O\,uKз rɚ!%^!i-+lu] 74bRl)_OhhbYVsCdKj#Ih3Mpļ?gch/c$ qJ-pDITB'GaR?N08^cl|e`hq t@F<0;`od@hLGUrQ@ :QsL#j`urtCsFTI.!o {1l̀W@̙xJ2}xwq2X4F2~vެFcƍ=[`g:fIHs}Cks^fyKn2c  EdRҭy!nshPy^p`uv\D Eq,KU5B}w@|Ӓ痆vۼ#"{&tɳ2~2@㔧4b{੪k"885^?X\PZ x0s:  af  y^F:9gyO|;!IK7,LsTHRY3j=< /kX t+Zv6=+"GuTjkm[,V0bB@"‹?m =ĉGeI&a]zƌaQGU8=8C468!\6K:YI]u5F#GF#v쫯o.9P(Ys+9Ӂa"O]z8>0F!/гƫc ;F y y ԁRNL(s@-ǜnՈkĽ ,u_~yd8ZL1xYϽs\Ck7gS6cf<_6YX21nmjX>E p͟}s5{<>&1"_31#k͚<:PH SrC=?vձC=f ضsE#q$EUyOnq1"ΛSQYM}_ Og3sP]Sk~ƘF"D߉\bcTR@QrQ y 4SԎPW?1ttvM%NeU°Xp;h0sue@ r1ph!( F"b!AY^k ^h.Jyict+eta^g+_ ch!n@hw$e5c CBPvm~;/ 6FМ;妬¼0Ӑ sVC37YSٯ5`n Vk"H]rtT:PZ,>̹ 9`;vl# # Ecq!Jk}CuulΗ1X$q\>Z}9Cv]Ko3hĦB=VZMs:m;Yf1~q [E4G"9fzzIEEzgPDf@i\owG4r=h,555RSSCUU|.HM!B?^ĸȏּW^6JpeBk7//h!o`.PC&`! ZQ !,;+6$)KU%:T)q20ʒ',E0eCH'0a~9A!C槃󢔶~ȡ Vh"6sY㙱9z^ri?юH1CTai5HI( Pi dɵW\IKp8QUU ;Cy6F#%YY bYDp-ʫ!2s'Ǯ;.m\LP[G;E[Zzk䠃۲FS)n g&A4j"CA^4|\8C;PS[>s"bP kk d>2r߮QyqMM|WL1,]Fќf9G{^@HE;ysQDLrj!Z R pBeBcI(AA(]&4gCOHy)qFu0W^5 Na^C A덨!XA-ȚrLg uNsRNS='z) vr\D"A]`oL#"/.n`'sdqcyy衇Yj5 czVZvSpE?㎥"A "D"6HN߻N,O 쨍:xg;=x 5u53DB˲mCxajfPTA9HnOndTCl O`B[_ڐ_0KTj|Рh~_ƗJsDʘ*| pЖ;"klG=ĺw >@_vC_NU?rA Z!c_tOE<˚0`S\hX";z ("-_*w}r| =<3tui=d&֬Zǥ\>M$b8H˲im]/~9W\y5wؙwٕt7ַ5k/h\.bYj`VEB%!C:s\HVU.LFJx%u0OݔЖy'7t(DBViF *!? %tL$ (r_yPg1@l^0/&Zy{K;^ "pހ#bW3z(k}܄bDp9)NC,(I _:/:|\:P[^{ q-[8bo5ApY,'o}n{d֬'b,Ƣy]6y)I 2YRXMZ"(dJ}m{SEZ @n|0H@EP5@ ›u [nQlT;~@,y߈wYByNL}=ʉkڇDAg`?`܂4J^ٝ쉄JF6#/<)|= zǵ?{0ZDB=JS4QW:e"E|;k{3=ɿK#QUE}Ct-ed]||_#@Uq]sht89@|uU[oϞf?b>+ҩ xdU%bYdYᣐY-AˇÊCמ醯M2l@m58%lۧE( BYeq75@ȞAْd@r k|!bVE{^߀]4pL!Go+?V!Ѿ뮽p[Oܖϟz:55/G#FxEUWMg9CspDԶ}KkOJ"sbם?+W,g,=]L4{ŤImmT+~!ɑI*IJ.<#VB:>BҲ\y?P?X@EΛŁWL/KXHDC4:PéB <0iv#I0¬hHCWo(|goü[j>+MR\к ^ql8 ^s=wq'3}'M O?UGD=զMT't\sc=,-9bÏ2q$9pvx {1R^xj+*9# ("`Y>k_=\2 L!Fzu|!Ё?4%ؔKj>G/PcH5NB 5.p$*Yl7.ldg/q/5>QHh (//v(40OBO9 )P}cRUYo,Z?2yIf7z׷ŅHD*9T7m1qVzIq発T? m?5W_Kήލ<*zYj>kZI+gtjjk{Xbl6C:&HV;X؄mu;0 ࣀp5- 8`^I*3Jc3YKA@`ؾ(gsK9@1yłW4$U웲 /D oA1;>VH}C YFjkkO9k߽YAYT%*h]ΎN}8~46 O,v4rЁ׬29xa?vGE˚ՌcӈF#eJ_zyZ3vd ^0޽V Wo]ӈȲ4h)C6y$\ ߿YF8|ob)1|mMY}tkUHu(G~:~΋ԃ- h`C"˲ktD]rl$\< #GꕸY9 U:b}/書`'|1m*+[7"#GdscV׾g|z ш$<]{ /qn^؏ʰA_TlSyuP#'[M pbк(g.#?@|и-x\Iu 7O@eU-F"ՓcҷhuhՀzXE6_;u7{?_#˼ioq(hkn}m {9_q{;-ӛojj=]{rG8W_~7^_ċ/?YDp]sW%,(g2Xԗ-R@D]5CG\GeRB9]JuCXy }*y=Bc_kl24RQ`p`)c`P`$m I 8Pa-:H2%ö=Xv0 %?qdR.z]<2444dՊw'lÄC2edd2% j46+**J!/uo.܀pAvGbo2Ty>/=wͥ\KʬE^JUčO#FH$纆3%HdHPz|`_zt1)\>R:H%Ӈ5hG)@s[BZex"I+ Q%ag~S\dMb p?&O x :.Y•LzzƌG޻痢cNҲtg'?x>予eC˯k"7xmwz\&MMko[ght r\x4F<d< u  YI_zs`69r3XG)+7+S(x^yj~~-syA!lb!O[EddƵP갑[PW_G{G'˗,׏U9t츱zfX>^~!~}u:e6fMB]Er9G/~[njٳvTq\od9*zF͇>[uxwޚ k/HRx#mUչ8!|`8E&}y`upGsutvjEB}_™$Dz,V7nf8L o&>>+WRY]C4cmK3nO|/jMp\m9vy'4g i HΤXDC]=~\EQq"hoA8xGeY3)^y_QՖ""4E͡%6J}I*-5F}eGlȼmߜV{Mϐ=XKx, d+놉aN FXD)Ţھ%|ǰmHnh [oqUWϻfɓ9CJ&W-l~*!}X rXFB~;+Pݰ0Dm]{,Sc +^g]SO=^bΜi{兯u#jɦӴ60q4gqg| vJ_$7yq?3n,Gu4 EJ橇k*ãzB `ShP&!\}P}Ca(ٌiC{ RԲ,#7?}/a 6ʁRQ{w*++}6zfW0e[r9$?xG^3Y;yCt9UI*h'ɮ;/{.'9k+qF#S)<`;Gy(>O6jGbAhupr9rXx۲pu<ipĨ:K.ضvuvD a vJ6gs"BpTTkV:6*xwѹ0IK8T3>zaMjr/5Pd? ;K #^u9 P;ASO7~>-r~i&˓O;aͺ6GQmm L0w.gu9`;D?˖Q|_׶6˂ /L*rҲZFs)piN줪8NN%8e%~N`HV3m4Q;bqTD#6MB8A.Q]^' ol)c873ka1(8S7f= `?_x7f4mcOu=FeAӚJTS/`v۪xm5MM\{xj,޽FQ[R`$"QHA=r4"BBS$ !b"S'.()DJ [C)]˖֝Sl7b[Ӿ9YѣFQsZ)=YNuu4|94+cw yN241 6 g:AOm \ KAwXř~gT]8ώ;'Gjvih6 #(GJWʔ^SuVl4CO*O^MqA3Nf{Su\=S.Y݃.uqטC©qLSݚd Ic-xۿ`Ͼ8N9Wۿ䏪2YH$L0dc#XbXϗa::lܰ7o. ~:UNrěǓ͛7hn 3鱨iibL,Bݸ5 ˴vs-T'Qvo'zٹs>A٤ݘadff`S__8xT HR2Fkw/KHU%U%v$-=s>~S;MiN=vp`ρޜ)@cc#>w7mHq͚JA4*An6}d(i`ucIÔF>o:dt;e0d UYDϺ:ʂu%jN;mO]ywM طk**~%l|y>>DũXH3u?DzwWe hkr* vb[K7 U/Uϭ"!f̘͚L4ӺeZu Yѯ6.c|6