diff --git a/src/common/bspf.hxx b/src/common/bspf.hxx index e7cc60024..06333b13c 100644 --- a/src/common/bspf.hxx +++ b/src/common/bspf.hxx @@ -84,6 +84,7 @@ using ByteArray = std::vector; using ShortArray = std::vector; using StringList = std::vector; using ByteBuffer = std::unique_ptr; // NOLINT +using WordBuffer = std::unique_ptr; // NOLINT // We use KB a lot; let's make a literal for it constexpr uInt32 operator "" _KB(unsigned long long size) diff --git a/src/debugger/gui/CartE0Widget.cxx b/src/debugger/gui/CartE0Widget.cxx index 9413ce5c0..de845b197 100644 --- a/src/debugger/gui/CartE0Widget.cxx +++ b/src/debugger/gui/CartE0Widget.cxx @@ -98,9 +98,9 @@ CartridgeE0Widget::CartridgeE0Widget( // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void CartridgeE0Widget::loadConfig() { - mySlice0->setSelectedIndex(myCart.myCurrentSlice[0]); - mySlice1->setSelectedIndex(myCart.myCurrentSlice[1]); - mySlice2->setSelectedIndex(myCart.myCurrentSlice[2]); + mySlice0->setSelectedIndex(myCart.myCurrentBank[0]); + mySlice1->setSelectedIndex(myCart.myCurrentBank[1]); + mySlice2->setSelectedIndex(myCart.myCurrentBank[2]); CartDebugWidget::loadConfig(); } @@ -114,13 +114,13 @@ void CartridgeE0Widget::handleCommand(CommandSender* sender, switch(cmd) { case kSlice0Changed: - myCart.segmentZero(mySlice0->getSelected()); + myCart.bank(mySlice0->getSelected(), 0); break; case kSlice1Changed: - myCart.segmentOne(mySlice1->getSelected()); + myCart.bank(mySlice1->getSelected(), 1); break; case kSlice2Changed: - myCart.segmentTwo(mySlice2->getSelected()); + myCart.bank(mySlice2->getSelected(), 2); break; default: break; @@ -136,9 +136,9 @@ string CartridgeE0Widget::bankState() ostringstream& buf = buffer(); buf << "Slices: " << std::dec - << seg0[myCart.myCurrentSlice[0]] << " / " - << seg1[myCart.myCurrentSlice[1]] << " / " - << seg2[myCart.myCurrentSlice[2]]; + << seg0[myCart.myCurrentBank[0]] << " / " + << seg1[myCart.myCurrentBank[1]] << " / " + << seg2[myCart.myCurrentBank[2]]; return buf.str(); } diff --git a/src/emucore/CartE0.cxx b/src/emucore/CartE0.cxx index ff3a9b52c..3788a95bc 100644 --- a/src/emucore/CartE0.cxx +++ b/src/emucore/CartE0.cxx @@ -34,17 +34,17 @@ void CartridgeE0::reset() // Setup segments to some default slices if(randomStartBank()) { - segmentZero(mySystem->randGenerator().next() % 8); - segmentOne(mySystem->randGenerator().next() % 8); - segmentTwo(mySystem->randGenerator().next() % 8); + bank(mySystem->randGenerator().next() % 8, 0); + bank(mySystem->randGenerator().next() % 8, 1); + bank(mySystem->randGenerator().next() % 8, 2); } else { - segmentZero(4); - segmentOne(5); - segmentTwo(6); + bank(4, 0); + bank(5, 1); + bank(6, 2); } - myCurrentSlice[3] = 7; // fixed + myCurrentBank[3] = bankCount() - 1; // fixed myBankChanged = true; } @@ -69,7 +69,7 @@ void CartridgeE0::install(System& system) // Set the page accessing methods for the hot spots in the last segment access.directPeekBase = nullptr; - access.romAccessBase = &myRomAccessBase[0x1FC0]; // TJ: is this the correct address (or 0x1FE0)? + access.romAccessBase = &myRomAccessBase[0x1FC0]; access.romPeekCounter = &myRomAccessCounter[0x1FC0]; access.romPokeCounter = &myRomAccessCounter[0x1FC0 + myAccessSize]; access.type = System::PageAccessType::READ; @@ -81,7 +81,7 @@ void CartridgeE0::install(System& system) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - uInt16 CartridgeE0::getBank(uInt16 address) const { - return myCurrentSlice[(address & 0xFFF) >> 10]; // 1K slices + return myCurrentBank[(address & 0xFFF) >> 10]; // 1K slices } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -98,18 +98,18 @@ uInt8 CartridgeE0::peek(uInt16 address) // Switch banks if necessary if((address >= 0x0FE0) && (address <= 0x0FE7)) { - segmentZero(address & 0x0007); + bank(address & 0x0007, 0); } else if((address >= 0x0FE8) && (address <= 0x0FEF)) { - segmentOne(address & 0x0007); + bank(address & 0x0007, 1); } else if((address >= 0x0FF0) && (address <= 0x0FF7)) { - segmentTwo(address & 0x0007); + bank(address & 0x0007, 2); } - return myImage[(myCurrentSlice[address >> 10] << 10) + (address & 0x03FF)]; + return myImage[(myCurrentBank[address >> 10] << 10) + (address & 0x03FF)]; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -120,83 +120,38 @@ bool CartridgeE0::poke(uInt16 address, uInt8) // Switch banks if necessary if((address >= 0x0FE0) && (address <= 0x0FE7)) { - segmentZero(address & 0x0007); + bank(address & 0x0007, 0); } else if((address >= 0x0FE8) && (address <= 0x0FEF)) { - segmentOne(address & 0x0007); + bank(address & 0x0007, 1); } else if((address >= 0x0FF0) && (address <= 0x0FF7)) { - segmentTwo(address & 0x0007); + bank(address & 0x0007, 2); } return false; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeE0::segmentZero(uInt16 slice) +void CartridgeE0::bank(uInt16 bank, uInt16 slice) { if(bankLocked()) return; // Remember the new slice - myCurrentSlice[0] = slice; - uInt16 offset = slice << 10; + myCurrentBank[slice] = bank; + uInt16 sliceOffset = slice * (1 << 10); + uInt16 bankOffset = bank << 10; // Setup the page access methods for the current bank System::PageAccess access(this, System::PageAccessType::READ); - for(uInt16 addr = 0x1000; addr < 0x1400; addr += System::PAGE_SIZE) + for(uInt16 addr = 0x1000 + sliceOffset; addr < 0x1000 + sliceOffset + 0x400; addr += System::PAGE_SIZE) { - access.directPeekBase = &myImage[offset + (addr & 0x03FF)]; - access.romAccessBase = &myRomAccessBase[offset + (addr & 0x03FF)]; - access.romPeekCounter = &myRomAccessCounter[offset + (addr & 0x03FF)]; - access.romPokeCounter = &myRomAccessCounter[offset + (addr & 0x03FF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeE0::segmentOne(uInt16 slice) -{ - if(bankLocked()) return; - - // Remember the new slice - myCurrentSlice[1] = slice; - uInt16 offset = slice << 10; - - // Setup the page access methods for the current bank - System::PageAccess access(this, System::PageAccessType::READ); - - for(uInt16 addr = 0x1400; addr < 0x1800; addr += System::PAGE_SIZE) - { - access.directPeekBase = &myImage[offset + (addr & 0x03FF)]; - access.romAccessBase = &myRomAccessBase[offset + (addr & 0x03FF)]; - access.romPeekCounter = &myRomAccessCounter[offset + (addr & 0x03FF)]; - access.romPokeCounter = &myRomAccessCounter[offset + (addr & 0x03FF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeE0::segmentTwo(uInt16 slice) -{ - if(bankLocked()) return; - - // Remember the new slice - myCurrentSlice[2] = slice; - uInt16 offset = slice << 10; - - // Setup the page access methods for the current bank - System::PageAccess access(this, System::PageAccessType::READ); - - for(uInt16 addr = 0x1800; addr < 0x1C00; addr += System::PAGE_SIZE) - { - access.directPeekBase = &myImage[offset + (addr & 0x03FF)]; - access.romAccessBase = &myRomAccessBase[offset + (addr & 0x03FF)]; - access.romPeekCounter = &myRomAccessCounter[offset + (addr & 0x03FF)]; - access.romPokeCounter = &myRomAccessCounter[offset + (addr & 0x03FF) + myAccessSize]; + access.directPeekBase = &myImage[bankOffset + (addr & 0x03FF)]; + access.romAccessBase = &myRomAccessBase[bankOffset + (addr & 0x03FF)]; + access.romPeekCounter = &myRomAccessCounter[bankOffset + (addr & 0x03FF)]; + access.romPokeCounter = &myRomAccessCounter[bankOffset + (addr & 0x03FF) + myAccessSize]; mySystem->setPageAccess(addr, access); } myBankChanged = true; @@ -206,7 +161,7 @@ void CartridgeE0::segmentTwo(uInt16 slice) bool CartridgeE0::patch(uInt16 address, uInt8 value) { address &= 0x0FFF; - myImage[(myCurrentSlice[address >> 10] << 10) + (address & 0x03FF)] = value; + myImage[(myCurrentBank[address >> 10] << 10) + (address & 0x03FF)] = value; return true; } @@ -222,7 +177,7 @@ bool CartridgeE0::save(Serializer& out) const { try { - out.putShortArray(myCurrentSlice.data(), myCurrentSlice.size()); + out.putShortArray(myCurrentBank.data(), myCurrentBank.size()); } catch(...) { @@ -238,7 +193,7 @@ bool CartridgeE0::load(Serializer& in) { try { - in.getShortArray(myCurrentSlice.data(), myCurrentSlice.size()); + in.getShortArray(myCurrentBank.data(), myCurrentBank.size()); } catch(...) { diff --git a/src/emucore/CartE0.hxx b/src/emucore/CartE0.hxx index 0a9453ab2..35513be85 100644 --- a/src/emucore/CartE0.hxx +++ b/src/emucore/CartE0.hxx @@ -156,32 +156,18 @@ class CartridgeE0 : public Cartridge private: /** - Install the specified slice for segment zero + Install the specified slice for segment (bank) 0..2 @param slice The slice to map into the segment */ - void segmentZero(uInt16 slice); - - /** - Install the specified slice for segment one - - @param slice The slice to map into the segment - */ - void segmentOne(uInt16 slice); - - /** - Install the specified slice for segment two - - @param slice The slice to map into the segment - */ - void segmentTwo(uInt16 slice); + void bank(uInt16 bank, uInt16 slice); private: // The 8K ROM image of the cartridge std::array myImage; // Indicates the slice mapped into each of the four segments - std::array myCurrentSlice; + std::array myCurrentBank; private: // Following constructors and assignment operators not supported diff --git a/src/emucore/CartEnhanced.cxx b/src/emucore/CartEnhanced.cxx new file mode 100644 index 000000000..ff4113ad4 --- /dev/null +++ b/src/emucore/CartEnhanced.cxx @@ -0,0 +1,259 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2020 by Bradford W. Mott, Stephen Anthony +// and the Stella Team +// +// See the file "License.txt" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +//============================================================================ + +#include "System.hxx" +#include "CartEnhanced.hxx" + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +CartridgeEnhanced::CartridgeEnhanced(const ByteBuffer& image, size_t size, + const string& md5, const Settings& settings) + : Cartridge(settings, md5), + mySize(size) +{ + // Allocate array for the ROM image + myImage = make_unique(mySize); + + // Copy the ROM image into my buffer + std::copy_n(image.get(), mySize, myImage.get()); + + // Copy the ROM image into my buffer + createRomAccessArrays(mySize); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void CartridgeEnhanced::install(System& system) +{ + // Allocate array for the current bank segments slices + myCurrentBankOffset = make_unique(BANK_SEGS); + std::fill_n(myCurrentBankOffset.get(), BANK_SEGS, 0); + + // Allocate array for the RAM area + myRAM = make_unique(myRamSize); + + // Setup page access + mySystem = &system; + + System::PageAccess access(this, System::PageAccessType::READ); + + // Set the page accessing method for the RAM writing pages + // Map access to this class, since we need to inspect all accesses to + // check if RWP happens + access.type = System::PageAccessType::WRITE; + for(uInt16 addr = 0x1000; addr < 0x1000 + myRamSize; addr += System::PAGE_SIZE) + { + uInt16 offset = addr & myRamMask; + access.romAccessBase = &myRomAccessBase[offset]; + access.romPeekCounter = &myRomAccessCounter[offset]; + access.romPokeCounter = &myRomAccessCounter[offset + myAccessSize]; + mySystem->setPageAccess(addr, access); + } + + // Set the page accessing method for the RAM reading pages + access.type = System::PageAccessType::READ; + for(uInt16 addr = 0x1000 + myRamSize; addr < 0x1000 + myRamSize * 2; addr += System::PAGE_SIZE) + { + uInt16 offset = addr & myRamMask; + access.directPeekBase = &myRAM[offset]; + access.romAccessBase = &myRomAccessBase[myRamSize + offset]; + access.romPeekCounter = &myRomAccessCounter[myRamSize + offset]; + access.romPokeCounter = &myRomAccessCounter[myRamSize + offset + myAccessSize]; + mySystem->setPageAccess(addr, access); + } + + // Install pages for the startup bank + bank(startBank()); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void CartridgeEnhanced::reset() +{ + initializeRAM(myRAM.get(), myRamSize); + + initializeStartBank(getStartBank()); + + // Upon reset we switch to the reset bank + bank(startBank()); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +uInt8 CartridgeEnhanced::peek(uInt16 address) +{ + uInt16 peekAddress = address; + address &= myBankMask; + + checkSwitchBank(address); + + if(address < myRamSize) // Write port is at 0xF000 - 0xF07F (128 bytes) + return peekRAM(myRAM[address], peekAddress); + else + return myImage[myBankOffset + address]; + return myImage[myCurrentBankOffset[address >> BANK_SHIFT] + (address & BANK_MASK)]; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool CartridgeEnhanced::poke(uInt16 address, uInt8 value) +{ + address &= myBankMask; + + // Switch banks if necessary + if (checkSwitchBank(address & myBankMask)) + return false; + + if(myRamSize) + { + if(!(address & myRamSize)) + { + pokeRAM(myRAM[address & myRamMask], address, value); + return true; + } + else + { + // Writing to the read port should be ignored, but trigger a break if option enabled + uInt8 dummy; + + pokeRAM(dummy, address, value); + myRamWriteAccess = address; + } + } + return false; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool CartridgeEnhanced::bank(uInt16 bank, uInt16 slice) +{ + if(bankLocked()) return false; + + // Remember what bank we're in + myBankOffset = bank << myBankShift; + + uInt16 romHotspot = this->romHotspot(); + uInt16 fromAddr = 0x1000 + myRamSize * 2; + uInt16 toAddr; + + if(romHotspot) + { + System::PageAccess access(this, System::PageAccessType::READ); + + // Set the page accessing methods for the hot spots + for(uInt16 addr = (romHotspot & ~System::PAGE_MASK); addr < 0x1000 + myBankSize; + addr += System::PAGE_SIZE) + { + uInt16 offset = myBankOffset + (addr & myBankMask); + access.romAccessBase = &myRomAccessBase[offset]; + access.romPeekCounter = &myRomAccessCounter[offset]; + access.romPokeCounter = &myRomAccessCounter[offset + myAccessSize]; + mySystem->setPageAccess(addr, access); + } + toAddr = romHotspot; + } + else + toAddr = 0x1000 + myBankSize; + + System::PageAccess access(this, System::PageAccessType::READ); + + // Setup the page access methods for the current bank + for(uInt16 addr = (fromAddr & ~System::PAGE_MASK); addr < (toAddr & ~System::PAGE_MASK); + addr += System::PAGE_SIZE) + { + uInt16 offset = myBankOffset + (addr & myBankMask); + if(myDirectPeek) + access.directPeekBase = &myImage[offset]; + access.romAccessBase = &myRomAccessBase[offset]; + access.romPeekCounter = &myRomAccessCounter[offset]; + access.romPokeCounter = &myRomAccessCounter[offset + myAccessSize]; + mySystem->setPageAccess(addr, access); + } + + return myBankChanged = true; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +uInt16 CartridgeEnhanced::getBank(uInt16) const +{ + return myBankOffset >> myBankShift; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +uInt16 CartridgeEnhanced::bankCount() const +{ + return uInt16(mySize >> myBankShift); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool CartridgeEnhanced::patch(uInt16 address, uInt8 value) +{ + address &= myBankMask; + + if(address < myRamSize * 2) + { + // Normally, a write to the read port won't do anything + // However, the patch command is special in that ignores such + // cart restrictions + myRAM[address & myRamMask] = value; + } + else + myImage[myBankOffset + address] = value; + + return myBankChanged = true; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +const uInt8* CartridgeEnhanced::getImage(size_t& size) const +{ + size = mySize; + return myImage.get(); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool CartridgeEnhanced::save(Serializer& out) const +{ + try + { + out.putShort(myBankOffset); + if(myRamSize) + out.putByteArray(myRAM.get(), myRamSize); + + } + catch(...) + { + cerr << "ERROR: << " << name() << "::save" << endl; + return false; + } + + return true; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool CartridgeEnhanced::load(Serializer& in) +{ + try + { + myBankOffset = in.getShort(); + if(myRamSize) + in.getByteArray(myRAM.get(), myRamSize); + } + catch(...) + { + cerr << "ERROR: " << name() << "::load" << endl; + return false; + } + + // Remember what bank we were in + bank(myBankOffset >> myBankShift); + + return true; +} diff --git a/src/emucore/CartEnhanced.hxx b/src/emucore/CartEnhanced.hxx new file mode 100644 index 000000000..22d253b6a --- /dev/null +++ b/src/emucore/CartEnhanced.hxx @@ -0,0 +1,204 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2020 by Bradford W. Mott, Stephen Anthony +// and the Stella Team +// +// See the file "License.txt" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +//============================================================================ + +#ifndef CARTRIDGEENHANCED_HXX +#define CARTRIDGEENHANCED_HXX + +class System; + +#include "bspf.hxx" +#include "Cart.hxx" + +/** + Enhanced cartridge base class used for multiple cart types. + + @author Thomas Jentzsch +*/ +class CartridgeEnhanced : public Cartridge +{ + public: + /** + Create a new cartridge using the specified image + + @param image Pointer to the ROM image + @param size The size of the ROM image + @param md5 The md5sum of the ROM image + @param settings A reference to the various settings (read-only) + */ + CartridgeEnhanced(const ByteBuffer& image, size_t size, const string& md5, + const Settings& settings); + virtual ~CartridgeEnhanced() = default; + + public: + /** + Install cartridge in the specified system. Invoked by the system + when the cartridge is attached to it. + + @param system The system the device should install itself in + */ + void install(System& system) override; + + /** + Reset device to its power-on state + */ + void reset() override; + + + /** + Install pages for the specified bank in the system. + + @param bank The bank that should be installed in the system + */ + bool bank(uInt16 bank, uInt16 slice); + + /** + Install pages for the specified bank in the system. + + @param bank The bank that should be installed in the system + */ + bool bank(uInt16 bank) override { return this->bank(bank, 0); } + + /** + Get the current bank. + + @param address The address to use when querying the bank + */ + uInt16 getBank(uInt16 address = 0) const override; + + /** + Query the number of banks supported by the cartridge. + */ + uInt16 bankCount() const override; + + /** + Patch the cartridge ROM. + + @param address The ROM address to patch + @param value The value to place into the address + @return Success or failure of the patch operation + */ + bool patch(uInt16 address, uInt8 value) override; + + /** + Access the internal ROM image for this cartridge. + + @param size Set to the size of the internal ROM image data + @return A pointer to the internal ROM image data + */ + const uInt8* getImage(size_t& size) const override; + + /** + Save the current state of this cart to the given Serializer. + + @param out The Serializer object to use + @return False on any errors, else true + */ + bool save(Serializer& out) const override; + + /** + Load the current state of this cart from the given Serializer. + + @param in The Serializer object to use + @return False on any errors, else true + */ + bool load(Serializer& in) override; + + public: + /** + Get the byte at the specified address. + + @return The byte at the specified address + */ + uInt8 peek(uInt16 address) override; + + /** + Change the byte at the specified address to the given value + + @param address The address where the value should be stored + @param value The value to be stored at the address + @return True if the poke changed the device address space, else false + */ + bool poke(uInt16 address, uInt8 value) override; + + protected: + // Pointer to a dynamically allocated ROM image of the cartridge + ByteBuffer myImage{nullptr}; + + // Pointer to a dynamically allocated RAM area of the cartridge + ByteBuffer myRAM{nullptr}; + + uInt16 myBankShift{BANK_SHIFT}; + + uInt16 myBankSize{BANK_SIZE}; + + uInt16 myBankMask{BANK_MASK}; + + uInt16 myRamSize{RAM_SIZE}; + + uInt16 myRamMask{RAM_MASK}; + + bool myDirectPeek{true}; + + // Indicates the offset into the ROM image (aligns to current bank) + uInt16 myBankOffset{0}; + + // Indicates the slice mapped into each of the bank segments + WordBuffer myCurrentBankOffset{nullptr}; + + private: + // log(ROM bank size) / log(2) + static constexpr uInt16 BANK_SHIFT = 12; + + // bank size + static constexpr uInt16 BANK_SIZE = 1 << BANK_SHIFT; // 2 ^ 12 = 4K + + // bank mask + static constexpr uInt16 BANK_MASK = BANK_SIZE - 1; + + // bank segments + static constexpr uInt16 BANK_SEGS = 1; + + // RAM size + static constexpr uInt16 RAM_SIZE = 0; + + // RAM mask + static constexpr uInt16 RAM_MASK = 0; + + // Size of the ROM image + size_t mySize{0}; + + protected: + /** + Check hotspots and switch bank if triggered. + */ + virtual bool checkSwitchBank(uInt16 address, uInt8 value = 0) = 0; + + private: + virtual uInt16 getStartBank() const { return 0; } + + virtual uInt16 romHotspot() const { return 0; } + + private: + // Following constructors and assignment operators not supported + CartridgeEnhanced() = delete; + CartridgeEnhanced(const CartridgeEnhanced&) = delete; + CartridgeEnhanced(CartridgeEnhanced&&) = delete; + CartridgeEnhanced& operator=(const CartridgeEnhanced&) = delete; + CartridgeEnhanced& operator=(CartridgeEnhanced&&) = delete; +}; + +#endif diff --git a/src/emucore/CartF0.cxx b/src/emucore/CartF0.cxx index a69c3c8ed..9f021a685 100644 --- a/src/emucore/CartF0.cxx +++ b/src/emucore/CartF0.cxx @@ -15,159 +15,25 @@ // this file, and for a DISCLAIMER OF ALL WARRANTIES. //============================================================================ -#include "System.hxx" #include "CartF0.hxx" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CartridgeF0::CartridgeF0(const ByteBuffer& image, size_t size, const string& md5, const Settings& settings) - : Cartridge(settings, md5) + : CartridgeEnhanced(image, size, md5, settings) { - // Copy the ROM image into my buffer - std::copy_n(image.get(), std::min(myImage.size(), size), myImage.begin()); - createRomAccessArrays(myImage.size()); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeF0::reset() +bool CartridgeF0::checkSwitchBank(uInt16 address, uInt8) { - // Upon reset we switch to the startup bank - initializeStartBank(15); - bank(startBank()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeF0::install(System& system) -{ - mySystem = &system; - - // Install pages for the startup bank - bank(startBank()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt8 CartridgeF0::peek(uInt16 address) -{ - address &= 0x0FFF; - - // Switch to next bank + // Switch banks if necessary if(address == 0x0FF0) - incbank(); - - return myImage[myBankOffset + address]; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF0::poke(uInt16 address, uInt8) -{ - address &= 0x0FFF; - - // Switch to next bank - if(address == 0x0FF0) - incbank(); - + { + // Switch to next bank + uInt8 nextBank = ((getBank()) + 1) & 0x0F; + bank(nextBank); + return true; + } return false; } - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeF0::incbank() -{ - // Determine current bank, and increment to the next one - uInt8 nextBank = ((myBankOffset >> 12) + 1) & 0x0F; - bank(nextBank); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF0::bank(uInt16 bank) -{ - if(bankLocked()) return false; - - // Remember what bank we're in - myBankOffset = bank << 12; - - System::PageAccess access(this, System::PageAccessType::READ); - - // Set the page accessing methods for the hot spots - for(uInt16 addr = (0x1FF0 & ~System::PAGE_MASK); addr < 0x2000; - addr += System::PAGE_SIZE) - { - access.romAccessBase = &myRomAccessBase[myBankOffset + (addr & 0x0FFF)]; - access.romPeekCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF)]; - access.romPokeCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - - // Setup the page access methods for the current bank - for(uInt16 addr = 0x1000; addr < static_cast(0x1FF0U & ~System::PAGE_MASK); - addr += System::PAGE_SIZE) - { - access.directPeekBase = &myImage[myBankOffset + (addr & 0x0FFF)]; - access.romAccessBase = &myRomAccessBase[myBankOffset + (addr & 0x0FFF)]; - access.romPeekCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF)]; - access.romPokeCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeF0::getBank(uInt16) const -{ - return myBankOffset >> 12; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeF0::bankCount() const -{ - return 16; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF0::patch(uInt16 address, uInt8 value) -{ - myImage[myBankOffset + (address & 0x0FFF)] = value; - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const uInt8* CartridgeF0::getImage(size_t& size) const -{ - size = myImage.size(); - return myImage.data(); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF0::save(Serializer& out) const -{ - try - { - out.putShort(myBankOffset); - } - catch(...) - { - cerr << "ERROR: CartridgeF0::save" << endl; - return false; - } - - return true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF0::load(Serializer& in) -{ - try - { - myBankOffset = in.getShort(); - } - catch(...) - { - cerr << "ERROR: CartridgeF0::load" << endl; - return false; - } - - // Remember what bank we were in - bank(myBankOffset >> 12); - - return true; -} diff --git a/src/emucore/CartF0.hxx b/src/emucore/CartF0.hxx index d4733a784..07123bf34 100644 --- a/src/emucore/CartF0.hxx +++ b/src/emucore/CartF0.hxx @@ -18,10 +18,7 @@ #ifndef CARTRIDGEF0_HXX #define CARTRIDGEF0_HXX -class System; - -#include "bspf.hxx" -#include "Cart.hxx" +#include "CartEnhanced.hxx" #ifdef DEBUGGER_SUPPORT #include "CartF0Widget.hxx" #endif @@ -31,9 +28,9 @@ class System; There are 16 4K banks. Accessing $1FF0 switches to next bank. - @author Eckhard Stolberg + @author Eckhard Stolberg, Thomas Jentzsch */ -class CartridgeF0 : public Cartridge +class CartridgeF0 : public CartridgeEnhanced { friend class CartridgeF0Widget; @@ -51,71 +48,6 @@ class CartridgeF0 : public Cartridge virtual ~CartridgeF0() = default; public: - /** - Reset device to its power-on state - */ - void reset() override; - - /** - Install cartridge in the specified system. Invoked by the system - when the cartridge is attached to it. - - @param system The system the device should install itself in - */ - void install(System& system) override; - - /** - Install pages for the specified bank in the system. - - @param bank The bank that should be installed in the system - */ - bool bank(uInt16 bank) override; - - /** - Get the current bank. - - @param address The address to use when querying the bank - */ - uInt16 getBank(uInt16 address = 0) const override; - - /** - Query the number of banks supported by the cartridge. - */ - uInt16 bankCount() const override; - - /** - Patch the cartridge ROM. - - @param address The ROM address to patch - @param value The value to place into the address - @return Success or failure of the patch operation - */ - bool patch(uInt16 address, uInt8 value) override; - - /** - Access the internal ROM image for this cartridge. - - @param size Set to the size of the internal ROM image data - @return A pointer to the internal ROM image data - */ - const uInt8* getImage(size_t& size) const override; - - /** - Save the current state of this cart to the given Serializer. - - @param out The Serializer object to use - @return False on any errors, else true - */ - bool save(Serializer& out) const override; - - /** - Load the current state of this cart from the given Serializer. - - @param in The Serializer object to use - @return False on any errors, else true - */ - bool load(Serializer& in) override; - /** Get a descriptor for the device name (used in error checking). @@ -135,35 +67,13 @@ class CartridgeF0 : public Cartridge } #endif - public: - /** - Get the byte at the specified address. + protected: + bool checkSwitchBank(uInt16 address, uInt8 value = 0); - @return The byte at the specified address - */ - uInt8 peek(uInt16 address) override; - - /** - Change the byte at the specified address to the given value - - @param address The address where the value should be stored - @param value The value to be stored at the address - @return True if the poke changed the device address space, else false - */ - bool poke(uInt16 address, uInt8 value) override; + uInt16 romHotspot() const override { return 0x1FF0; } private: - /** - Install pages for the next bank in the system - */ - void incbank(); - - private: - // The 64K ROM image of the cartridge - std::array myImage; - - // Indicates the offset into the ROM image (aligns to current bank) - uInt16 myBankOffset{0}; + uInt16 getStartBank() const override { return 15; } private: // Following constructors and assignment operators not supported diff --git a/src/emucore/CartF4.cxx b/src/emucore/CartF4.cxx index 8111bb1a0..0cb689228 100644 --- a/src/emucore/CartF4.cxx +++ b/src/emucore/CartF4.cxx @@ -15,155 +15,24 @@ // this file, and for a DISCLAIMER OF ALL WARRANTIES. //============================================================================ -#include "Random.hxx" -#include "System.hxx" #include "CartF4.hxx" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CartridgeF4::CartridgeF4(const ByteBuffer& image, size_t size, const string& md5, const Settings& settings) - : Cartridge(settings, md5) + : CartridgeEnhanced(image, size, md5, settings) { - // Copy the ROM image into my buffer - std::copy_n(image.get(), std::min(myImage.size(), size), myImage.begin()); - createRomAccessArrays(myImage.size()); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeF4::reset() +bool CartridgeF4::checkSwitchBank(uInt16 address, uInt8) { - // Upon reset we switch to the startup bank - initializeStartBank(0); - bank(startBank()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeF4::install(System& system) -{ - mySystem = &system; - - // Install pages for the startup bank - bank(startBank()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt8 CartridgeF4::peek(uInt16 address) -{ - address &= 0x0FFF; - // Switch banks if necessary + // Note: addresses could be calculated from hotspot and bank count if((address >= 0x0FF4) && (address <= 0x0FFB)) { bank(address - 0x0FF4); + return true; } - - return myImage[myBankOffset + address]; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF4::poke(uInt16 address, uInt8) -{ - address &= 0x0FFF; - - // Switch banks if necessary - if((address >= 0x0FF4) && (address <= 0x0FFB)) - { - bank(address - 0x0FF4); - } - return false; } - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF4::bank(uInt16 bank) -{ - if(bankLocked()) return false; - - // Remember what bank we're in - myBankOffset = bank << 12; - - System::PageAccess access(this, System::PageAccessType::READ); - - // Set the page accessing methods for the hot spots - for(uInt16 addr = (0x1FF4 & ~System::PAGE_MASK); addr < 0x2000; - addr += System::PAGE_SIZE) - { - access.romAccessBase = &myRomAccessBase[myBankOffset + (addr & 0x0FFF)]; - access.romPeekCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF)]; - access.romPokeCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - - // Setup the page access methods for the current bank - for(uInt16 addr = 0x1000; addr < static_cast(0x1FF4U & ~System::PAGE_MASK); - addr += System::PAGE_SIZE) - { - access.directPeekBase = &myImage[myBankOffset + (addr & 0x0FFF)]; - access.romAccessBase = &myRomAccessBase[myBankOffset + (addr & 0x0FFF)]; - access.romPeekCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF)]; - access.romPokeCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeF4::getBank(uInt16) const -{ - return myBankOffset >> 12; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeF4::bankCount() const -{ - return 8; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF4::patch(uInt16 address, uInt8 value) -{ - myImage[myBankOffset + (address & 0x0FFF)] = value; - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const uInt8* CartridgeF4::getImage(size_t& size) const -{ - size = myImage.size(); - return myImage.data(); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF4::save(Serializer& out) const -{ - try - { - out.putShort(myBankOffset); - } - catch(...) - { - cerr << "ERROR: CartridgeF4::save" << endl; - return false; - } - - return true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF4::load(Serializer& in) -{ - try - { - myBankOffset = in.getShort(); - } - catch(...) - { - cerr << "ERROR: CartridgeF4::load" << endl; - return false; - } - - // Remember what bank we were in - bank(myBankOffset >> 12); - - return true; -} diff --git a/src/emucore/CartF4.hxx b/src/emucore/CartF4.hxx index d9c8fd346..3b4f0f141 100644 --- a/src/emucore/CartF4.hxx +++ b/src/emucore/CartF4.hxx @@ -18,10 +18,7 @@ #ifndef CARTRIDGEF4_HXX #define CARTRIDGEF4_HXX -class System; - -#include "bspf.hxx" -#include "Cart.hxx" +#include "CartEnhanced.hxx" #ifdef DEBUGGER_SUPPORT #include "CartF4Widget.hxx" #endif @@ -30,9 +27,9 @@ class System; Cartridge class used for Atari's 32K bankswitched games. There are eight 4K banks, accessible by read/write to $1FF4 - $1FFB. - @author Bradford W. Mott + @author Bradford W. Mott, Thomas Jentzsch */ -class CartridgeF4 : public Cartridge +class CartridgeF4 : public CartridgeEnhanced { friend class CartridgeF4Widget; @@ -50,71 +47,6 @@ class CartridgeF4 : public Cartridge virtual ~CartridgeF4() = default; public: - /** - Reset device to its power-on state - */ - void reset() override; - - /** - Install cartridge in the specified system. Invoked by the system - when the cartridge is attached to it. - - @param system The system the device should install itself in - */ - void install(System& system) override; - - /** - Install pages for the specified bank in the system. - - @param bank The bank that should be installed in the system - */ - bool bank(uInt16 bank) override; - - /** - Get the current bank. - - @param address The address to use when querying the bank - */ - uInt16 getBank(uInt16 address = 0) const override; - - /** - Query the number of banks supported by the cartridge. - */ - uInt16 bankCount() const override; - - /** - Patch the cartridge ROM. - - @param address The ROM address to patch - @param value The value to place into the address - @return Success or failure of the patch operation - */ - bool patch(uInt16 address, uInt8 value) override; - - /** - Access the internal ROM image for this cartridge. - - @param size Set to the size of the internal ROM image data - @return A pointer to the internal ROM image data - */ - const uInt8* getImage(size_t& size) const override; - - /** - Save the current state of this cart to the given Serializer. - - @param out The Serializer object to use - @return False on any errors, else true - */ - bool save(Serializer& out) const override; - - /** - Load the current state of this cart from the given Serializer. - - @param in The Serializer object to use - @return False on any errors, else true - */ - bool load(Serializer& in) override; - /** Get a descriptor for the device name (used in error checking). @@ -134,31 +66,12 @@ class CartridgeF4 : public Cartridge } #endif - public: - /** - Get the byte at the specified address. + protected: + bool checkSwitchBank(uInt16 address, uInt8 value = 0); - @return The byte at the specified address - */ - uInt8 peek(uInt16 address) override; + uInt16 romHotspot() const override { return 0x1FF4; } - /** - Change the byte at the specified address to the given value - - @param address The address where the value should be stored - @param value The value to be stored at the address - @return True if the poke changed the device address space, else false - */ - bool poke(uInt16 address, uInt8 value) override; - - private: - // The 32K ROM image of the cartridge - std::array myImage; - - // Indicates the offset into the ROM image (aligns to current bank) - uInt16 myBankOffset{0}; - - private: +private: // Following constructors and assignment operators not supported CartridgeF4() = delete; CartridgeF4(const CartridgeF4&) = delete; diff --git a/src/emucore/CartF4SC.cxx b/src/emucore/CartF4SC.cxx index 24496b161..5364f2eb4 100644 --- a/src/emucore/CartF4SC.cxx +++ b/src/emucore/CartF4SC.cxx @@ -15,211 +15,13 @@ // this file, and for a DISCLAIMER OF ALL WARRANTIES. //============================================================================ -#include "System.hxx" #include "CartF4SC.hxx" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CartridgeF4SC::CartridgeF4SC(const ByteBuffer& image, size_t size, const string& md5, const Settings& settings) - : Cartridge(settings, md5) + : CartridgeF4(image, size, md5, settings) { - // Copy the ROM image into my buffer - std::copy_n(image.get(), std::min(myImage.size(), size), myImage.begin()); - createRomAccessArrays(myImage.size()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeF4SC::reset() -{ - initializeRAM(myRAM.data(), myRAM.size()); - initializeStartBank(0); - - // Upon reset we switch to the startup bank - bank(startBank()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeF4SC::install(System& system) -{ - mySystem = &system; - - System::PageAccess access(this, System::PageAccessType::READ); - - // Set the page accessing method for the RAM writing pages - // Map access to this class, since we need to inspect all accesses to - // check if RWP happens - access.type = System::PageAccessType::WRITE; - for(uInt16 addr = 0x1000; addr < 0x1080; addr += System::PAGE_SIZE) - { - access.romAccessBase = &myRomAccessBase[addr & 0x007F]; - access.romPeekCounter = &myRomAccessCounter[addr & 0x007F]; - access.romPokeCounter = &myRomAccessCounter[(addr & 0x07F) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - - // Set the page accessing method for the RAM reading pages - access.type = System::PageAccessType::READ; - for(uInt16 addr = 0x1080; addr < 0x1100; addr += System::PAGE_SIZE) - { - access.directPeekBase = &myRAM[addr & 0x007F]; - access.romAccessBase = &myRomAccessBase[0x80 + (addr & 0x007F)]; - access.romPeekCounter = &myRomAccessCounter[0x80 + (addr & 0x007F)]; - access.romPokeCounter = &myRomAccessCounter[0x80 + (addr & 0x007F) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - - // Install pages for the startup bank - bank(startBank()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt8 CartridgeF4SC::peek(uInt16 address) -{ - uInt16 peekAddress = address; - address &= 0x0FFF; - - // Switch banks if necessary - if((address >= 0x0FF4) && (address <= 0x0FFB)) - bank(address - 0x0FF4); - - if(address < 0x0080) // Write port is at 0xF000 - 0xF07F (128 bytes) - return peekRAM(myRAM[address], peekAddress); - else - return myImage[myBankOffset + address]; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF4SC::poke(uInt16 address, uInt8 value) -{ - uInt16 pokeAddress = address; - address &= 0x0FFF; - - // Switch banks if necessary - if((address >= 0x0FF4) && (address <= 0x0FFB)) - { - bank(address - 0x0FF4); - return false; - } - - if(!(address & 0x080)) - { - pokeRAM(myRAM[address & 0x007F], pokeAddress, value); - return true; - } - else - { - // Writing to the read port should be ignored, but trigger a break if option enabled - uInt8 dummy; - - pokeRAM(dummy, pokeAddress, value); - myRamWriteAccess = pokeAddress; - return false; - } -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF4SC::bank(uInt16 bank) -{ - if(bankLocked()) return false; - - // Remember what bank we're in - myBankOffset = bank << 12; - - System::PageAccess access(this, System::PageAccessType::READ); - - // Set the page accessing methods for the hot spots - for(uInt16 addr = (0x1FF4 & ~System::PAGE_MASK); addr < 0x2000; - addr += System::PAGE_SIZE) - { - access.romAccessBase = &myRomAccessBase[myBankOffset + (addr & 0x0FFF)]; - access.romPeekCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF)]; - access.romPokeCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - - // Setup the page access methods for the current bank - for(uInt16 addr = 0x1100; addr < static_cast(0x1FF4U & ~System::PAGE_MASK); - addr += System::PAGE_SIZE) - { - access.directPeekBase = &myImage[myBankOffset + (addr & 0x0FFF)]; - access.romAccessBase = &myRomAccessBase[myBankOffset + (addr & 0x0FFF)]; - access.romPeekCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF)]; - access.romPokeCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeF4SC::getBank(uInt16) const -{ - return myBankOffset >> 12; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeF4SC::bankCount() const -{ - return 8; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF4SC::patch(uInt16 address, uInt8 value) -{ - address &= 0x0FFF; - - if(address < 0x0100) - { - // Normally, a write to the read port won't do anything - // However, the patch command is special in that ignores such - // cart restrictions - myRAM[address & 0x007F] = value; - } - else - myImage[myBankOffset + address] = value; - - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const uInt8* CartridgeF4SC::getImage(size_t& size) const -{ - size = myImage.size(); - return myImage.data(); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF4SC::save(Serializer& out) const -{ - try - { - out.putShort(myBankOffset); - out.putByteArray(myRAM.data(), myRAM.size()); - } - catch(...) - { - cerr << "ERROR: CartridgeF4SC::save" << endl; - return false; - } - - return true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF4SC::load(Serializer& in) -{ - try - { - myBankOffset = in.getShort(); - in.getByteArray(myRAM.data(), myRAM.size()); - } - catch(...) - { - cerr << "ERROR: CartridgeF4SC::load" << endl; - return false; - } - - // Remember what bank we were in - bank(myBankOffset >> 12); - - return true; + myRamSize = RAM_SIZE; + myRamMask = RAM_MASK; } diff --git a/src/emucore/CartF4SC.hxx b/src/emucore/CartF4SC.hxx index 20c003970..5f49a33a6 100644 --- a/src/emucore/CartF4SC.hxx +++ b/src/emucore/CartF4SC.hxx @@ -18,10 +18,7 @@ #ifndef CARTRIDGEF4SC_HXX #define CARTRIDGEF4SC_HXX -class System; - -#include "bspf.hxx" -#include "Cart.hxx" +#include "CartF4.hxx" #ifdef DEBUGGER_SUPPORT #include "CartF4SCWidget.hxx" #endif @@ -31,9 +28,9 @@ class System; RAM. There are eight 4K banks, accessible by read/write to $1FF4 - $1FFB. RAM read port is $1080 - $10FF, write port is $1000 - $107F. - @author Bradford W. Mott + @author Bradford W. Mott, Thomas Jentzsch */ -class CartridgeF4SC : public Cartridge +class CartridgeF4SC : public CartridgeF4 { friend class CartridgeF4SCWidget; @@ -51,71 +48,6 @@ class CartridgeF4SC : public Cartridge virtual ~CartridgeF4SC() = default; public: - /** - Reset device to its power-on state - */ - void reset() override; - - /** - Install cartridge in the specified system. Invoked by the system - when the cartridge is attached to it. - - @param system The system the device should install itself in - */ - void install(System& system) override; - - /** - Install pages for the specified bank in the system. - - @param bank The bank that should be installed in the system - */ - bool bank(uInt16 bank) override; - - /** - Get the current bank. - - @param address The address to use when querying the bank - */ - uInt16 getBank(uInt16 address = 0) const override; - - /** - Query the number of banks supported by the cartridge. - */ - uInt16 bankCount() const override; - - /** - Patch the cartridge ROM. - - @param address The ROM address to patch - @param value The value to place into the address - @return Success or failure of the patch operation - */ - bool patch(uInt16 address, uInt8 value) override; - - /** - Access the internal ROM image for this cartridge. - - @param size Set to the size of the internal ROM image data - @return A pointer to the internal ROM image data - */ - const uInt8* getImage(size_t& size) const override; - - /** - Save the current state of this cart to the given Serializer. - - @param out The Serializer object to use - @return False on any errors, else true - */ - bool save(Serializer& out) const override; - - /** - Load the current state of this cart from the given Serializer. - - @param in The Serializer object to use - @return False on any errors, else true - */ - bool load(Serializer& in) override; - /** Get a descriptor for the device name (used in error checking). @@ -135,32 +67,12 @@ class CartridgeF4SC : public Cartridge } #endif - public: - /** - Get the byte at the specified address. - - @return The byte at the specified address - */ - uInt8 peek(uInt16 address) override; - - /** - Change the byte at the specified address to the given value - - @param address The address where the value should be stored - @param value The value to be stored at the address - @return True if the poke changed the device address space, else false - */ - bool poke(uInt16 address, uInt8 value) override; - private: - // The 32K ROM image of the cartridge - std::array myImage; + // RAM size + static constexpr uInt16 RAM_SIZE = 0x80; - // The 128 bytes of RAM - std::array myRAM; - - // Indicates the offset into the ROM image (aligns to current bank) - uInt16 myBankOffset{0}; + // RAM mask + static constexpr uInt16 RAM_MASK = RAM_SIZE - 1; private: // Following constructors and assignment operators not supported diff --git a/src/emucore/CartF6.cxx b/src/emucore/CartF6.cxx index a7a8dec2b..567424d7a 100644 --- a/src/emucore/CartF6.cxx +++ b/src/emucore/CartF6.cxx @@ -15,195 +15,25 @@ // this file, and for a DISCLAIMER OF ALL WARRANTIES. //============================================================================ -#include "System.hxx" #include "CartF6.hxx" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CartridgeF6::CartridgeF6(const ByteBuffer& image, size_t size, const string& md5, const Settings& settings) - : Cartridge(settings, md5) + : CartridgeEnhanced(image, size, md5, settings) { - // Copy the ROM image into my buffer - std::copy_n(image.get(), std::min(myImage.size(), size), myImage.begin()); - createRomAccessArrays(myImage.size()); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeF6::reset() +bool CartridgeF6::checkSwitchBank(uInt16 address, uInt8) { - // Upon reset we switch to the startup bank - initializeStartBank(0); - bank(startBank()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeF6::install(System& system) -{ - mySystem = &system; - - // Upon install we'll setup the startup bank - bank(startBank()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt8 CartridgeF6::peek(uInt16 address) -{ - address &= 0x0FFF; - // Switch banks if necessary - switch(address) + // Note: addresses could be calculated from hotspot and bank count + if((address >= 0x0FF6) && (address <= 0x0FF9)) { - case 0x0FF6: - // Set the current bank to the first 4k bank - bank(0); - break; - - case 0x0FF7: - // Set the current bank to the second 4k bank - bank(1); - break; - - case 0x0FF8: - // Set the current bank to the third 4k bank - bank(2); - break; - - case 0x0FF9: - // Set the current bank to the forth 4k bank - bank(3); - break; - - default: - break; - } - - return myImage[myBankOffset + address]; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF6::poke(uInt16 address, uInt8) -{ - address &= 0x0FFF; - - // Switch banks if necessary - switch(address) - { - case 0x0FF6: - // Set the current bank to the first 4k bank - bank(0); - break; - - case 0x0FF7: - // Set the current bank to the second 4k bank - bank(1); - break; - - case 0x0FF8: - // Set the current bank to the third 4k bank - bank(2); - break; - - case 0x0FF9: - // Set the current bank to the forth 4k bank - bank(3); - break; - - default: - break; + bank(address - 0x0FF6); + return true; } return false; } -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF6::bank(uInt16 bank) -{ - if(bankLocked()) return false; - - // Remember what bank we're in - myBankOffset = bank << 12; - - System::PageAccess access(this, System::PageAccessType::READ); - - // Set the page accessing methods for the hot spots - for(uInt16 addr = (0x1FF6 & ~System::PAGE_MASK); addr < 0x2000; - addr += System::PAGE_SIZE) - { - access.romAccessBase = &myRomAccessBase[myBankOffset + (addr & 0x0FFF)]; - access.romPeekCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF)]; - access.romPokeCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - - // Setup the page access methods for the current bank - for(uInt16 addr = 0x1000; addr < static_cast(0x1FF6U & ~System::PAGE_MASK); - addr += System::PAGE_SIZE) - { - access.directPeekBase = &myImage[myBankOffset + (addr & 0x0FFF)]; - access.romAccessBase = &myRomAccessBase[myBankOffset + (addr & 0x0FFF)]; - access.romPeekCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF)]; - access.romPokeCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeF6::getBank(uInt16) const -{ - return myBankOffset >> 12; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeF6::bankCount() const -{ - return 4; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF6::patch(uInt16 address, uInt8 value) -{ - myImage[myBankOffset + (address & 0x0FFF)] = value; - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const uInt8* CartridgeF6::getImage(size_t& size) const -{ - size = myImage.size(); - return myImage.data(); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF6::save(Serializer& out) const -{ - try - { - out.putShort(myBankOffset); - } - catch(...) - { - cerr << "ERROR: CartridgeF6::save" << endl; - return false; - } - - return true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF6::load(Serializer& in) -{ - try - { - myBankOffset = in.getShort(); - } - catch(...) - { - cerr << "ERROR: CartridgeF6::load" << endl; - return false; - } - - // Remember what bank we were in - bank(myBankOffset >> 12); - - return true; -} diff --git a/src/emucore/CartF6.hxx b/src/emucore/CartF6.hxx index 4dc2c62b5..275727786 100644 --- a/src/emucore/CartF6.hxx +++ b/src/emucore/CartF6.hxx @@ -18,10 +18,7 @@ #ifndef CARTRIDGEF6_HXX #define CARTRIDGEF6_HXX -class System; - -#include "bspf.hxx" -#include "Cart.hxx" +#include "CartEnhanced.hxx" #ifdef DEBUGGER_SUPPORT #include "CartF6Widget.hxx" #endif @@ -30,9 +27,9 @@ class System; Cartridge class used for Atari's 16K bankswitched games. There are four 4K banks, accessible by read/write to $1FF6 - $1FF9. - @author Bradford W. Mott + @author Bradford W. Mott, Thomas Jentzsch */ -class CartridgeF6 : public Cartridge +class CartridgeF6 : public CartridgeEnhanced { friend class CartridgeF6Widget; @@ -50,71 +47,6 @@ class CartridgeF6 : public Cartridge virtual ~CartridgeF6() = default; public: - /** - Reset device to its power-on state - */ - void reset() override; - - /** - Install cartridge in the specified system. Invoked by the system - when the cartridge is attached to it. - - @param system The system the device should install itself in - */ - void install(System& system) override; - - /** - Install pages for the specified bank in the system. - - @param bank The bank that should be installed in the system - */ - bool bank(uInt16 bank) override; - - /** - Get the current bank. - - @param address The address to use when querying the bank - */ - uInt16 getBank(uInt16 address = 0) const override; - - /** - Query the number of banks supported by the cartridge. - */ - uInt16 bankCount() const override; - - /** - Patch the cartridge ROM. - - @param address The ROM address to patch - @param value The value to place into the address - @return Success or failure of the patch operation - */ - bool patch(uInt16 address, uInt8 value) override; - - /** - Access the internal ROM image for this cartridge. - - @param size Set to the size of the internal ROM image data - @return A pointer to the internal ROM image data - */ - const uInt8* getImage(size_t& size) const override; - - /** - Save the current state of this cart to the given Serializer. - - @param out The Serializer object to use - @return False on any errors, else true - */ - bool save(Serializer& out) const override; - - /** - Load the current state of this cart from the given Serializer. - - @param in The Serializer object to use - @return False on any errors, else true - */ - bool load(Serializer& in) override; - /** Get a descriptor for the device name (used in error checking). @@ -134,29 +66,10 @@ class CartridgeF6 : public Cartridge } #endif - public: - /** - Get the byte at the specified address. + protected: + bool checkSwitchBank(uInt16 address, uInt8 value = 0) override; - @return The byte at the specified address - */ - uInt8 peek(uInt16 address) override; - - /** - Change the byte at the specified address to the given value - - @param address The address where the value should be stored - @param value The value to be stored at the address - @return True if the poke changed the device address space, else false - */ - bool poke(uInt16 address, uInt8 value) override; - - private: - // The 16K ROM image of the cartridge - std::array myImage; - - // Indicates the offset into the ROM image (aligns to current bank) - uInt16 myBankOffset{0}; + uInt16 romHotspot() const override { return 0x1FF6; } private: // Following constructors and assignment operators not supported diff --git a/src/emucore/CartF6SC.cxx b/src/emucore/CartF6SC.cxx index 60b998182..034f02bce 100644 --- a/src/emucore/CartF6SC.cxx +++ b/src/emucore/CartF6SC.cxx @@ -15,251 +15,13 @@ // this file, and for a DISCLAIMER OF ALL WARRANTIES. //============================================================================ -#include "System.hxx" #include "CartF6SC.hxx" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CartridgeF6SC::CartridgeF6SC(const ByteBuffer& image, size_t size, const string& md5, const Settings& settings) - : Cartridge(settings, md5) + : CartridgeF6(image, size, md5, settings) { - // Copy the ROM image into my buffer - std::copy_n(image.get(), std::min(myImage.size(), size), myImage.begin()); - createRomAccessArrays(myImage.size()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeF6SC::reset() -{ - initializeRAM(myRAM.data(), myRAM.size()); - initializeStartBank(0); - - // Upon reset we switch to the startup bank - bank(startBank()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeF6SC::install(System& system) -{ - mySystem = &system; - - System::PageAccess access(this, System::PageAccessType::READ); - - // Set the page accessing method for the RAM writing pages - // Map access to this class, since we need to inspect all accesses to - // check if RWP happens - access.type = System::PageAccessType::WRITE; - for(uInt16 addr = 0x1000; addr < 0x1080; addr += System::PAGE_SIZE) - { - access.romAccessBase = &myRomAccessBase[addr & 0x007F]; - access.romPeekCounter = &myRomAccessCounter[addr & 0x007F]; - access.romPokeCounter = &myRomAccessCounter[(addr & 0x07F) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - - // Set the page accessing method for the RAM reading pages - access.type = System::PageAccessType::READ; - for(uInt16 addr = 0x1080; addr < 0x1100; addr += System::PAGE_SIZE) - { - access.directPeekBase = &myRAM[addr & 0x007F]; - access.romAccessBase = &myRomAccessBase[0x80 + (addr & 0x007F)]; - access.romPeekCounter = &myRomAccessCounter[0x80 + (addr & 0x007F)]; - access.romPokeCounter = &myRomAccessCounter[0x80 + (addr & 0x007F) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - - // Install pages for the startup bank - bank(startBank()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt8 CartridgeF6SC::peek(uInt16 address) -{ - uInt16 peekAddress = address; - address &= 0x0FFF; - - // Switch banks if necessary - switch(address) - { - case 0x0FF6: - // Set the current bank to the first 4k bank - bank(0); - break; - - case 0x0FF7: - // Set the current bank to the second 4k bank - bank(1); - break; - - case 0x0FF8: - // Set the current bank to the third 4k bank - bank(2); - break; - - case 0x0FF9: - // Set the current bank to the forth 4k bank - bank(3); - break; - - default: - break; - } - - if(address < 0x0080) // Write port is at 0xF000 - 0xF07F (128 bytes) - return peekRAM(myRAM[address], peekAddress); - else - return myImage[myBankOffset + address]; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF6SC::poke(uInt16 address, uInt8 value) -{ - // Switch banks if necessary - switch(address & 0x0FFF) - { - case 0x0FF6: - // Set the current bank to the first 4k bank - bank(0); - return false; - - case 0x0FF7: - // Set the current bank to the second 4k bank - bank(1); - return false; - - case 0x0FF8: - // Set the current bank to the third 4k bank - bank(2); - return false; - - case 0x0FF9: - // Set the current bank to the forth 4k bank - bank(3); - return false; - - default: - break; - } - - if(!(address & 0x080)) - { - pokeRAM(myRAM[address & 0x007F], address, value); - return true; - } - else - { - // Writing to the read port should be ignored, but trigger a break if option enabled - uInt8 dummy; - - pokeRAM(dummy, address, value); - myRamWriteAccess = address; - return false; - } -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF6SC::bank(uInt16 bank) -{ - if(bankLocked()) return false; - - // Remember what bank we're in - myBankOffset = bank << 12; - - System::PageAccess access(this, System::PageAccessType::READ); - - // Set the page accessing methods for the hot spots - for(uInt16 addr = (0x1FF6 & ~System::PAGE_MASK); addr < 0x2000; - addr += System::PAGE_SIZE) - { - access.romAccessBase = &myRomAccessBase[myBankOffset + (addr & 0x0FFF)]; - access.romPeekCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF)]; - access.romPokeCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - - // Setup the page access methods for the current bank - for(uInt16 addr = 0x1100; addr < static_cast(0x1FF6U & ~System::PAGE_MASK); - addr += System::PAGE_SIZE) - { - access.directPeekBase = &myImage[myBankOffset + (addr & 0x0FFF)]; - access.romAccessBase = &myRomAccessBase[myBankOffset + (addr & 0x0FFF)]; - access.romPeekCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF)]; - access.romPokeCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeF6SC::getBank(uInt16) const -{ - return myBankOffset >> 12; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeF6SC::bankCount() const -{ - return 4; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF6SC::patch(uInt16 address, uInt8 value) -{ - address &= 0x0FFF; - - if(address < 0x0100) - { - // Normally, a write to the read port won't do anything - // However, the patch command is special in that ignores such - // cart restrictions - myRAM[address & 0x007F] = value; - } - else - myImage[myBankOffset + address] = value; - - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const uInt8* CartridgeF6SC::getImage(size_t& size) const -{ - size = myImage.size(); - return myImage.data(); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF6SC::save(Serializer& out) const -{ - try - { - out.putShort(myBankOffset); - out.putByteArray(myRAM.data(), myRAM.size()); - } - catch(...) - { - cerr << "ERROR: CartridgeF6SC::save" << endl; - return false; - } - - return true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF6SC::load(Serializer& in) -{ - try - { - myBankOffset = in.getShort(); - in.getByteArray(myRAM.data(), myRAM.size()); - } - catch(...) - { - cerr << "ERROR: CartridgeF6SC::load" << endl; - return false; - } - - // Remember what bank we were in - bank(myBankOffset >> 12); - - return true; + myRamSize = RAM_SIZE; + myRamMask = RAM_MASK; } diff --git a/src/emucore/CartF6SC.hxx b/src/emucore/CartF6SC.hxx index 45a7c5ac3..a791a538d 100644 --- a/src/emucore/CartF6SC.hxx +++ b/src/emucore/CartF6SC.hxx @@ -18,10 +18,7 @@ #ifndef CARTRIDGEF6SC_HXX #define CARTRIDGEF6SC_HXX -class System; - -#include "bspf.hxx" -#include "Cart.hxx" +#include "CartF6.hxx" #ifdef DEBUGGER_SUPPORT #include "CartF6SCWidget.hxx" #endif @@ -31,9 +28,9 @@ class System; RAM. There are four 4K banks, accessible by read/write to $1FF6 - $1FF9. RAM read port is $1080 - $10FF, write port is $1000 - $107F. - @author Bradford W. Mott + @author Bradford W. Mott, Thomas Jentzsch */ -class CartridgeF6SC : public Cartridge +class CartridgeF6SC : public CartridgeF6 { friend class CartridgeF6SCWidget; @@ -51,71 +48,6 @@ class CartridgeF6SC : public Cartridge virtual ~CartridgeF6SC() = default; public: - /** - Reset device to its power-on state - */ - void reset() override; - - /** - Install cartridge in the specified system. Invoked by the system - when the cartridge is attached to it. - - @param system The system the device should install itself in - */ - void install(System& system) override; - - /** - Install pages for the specified bank in the system. - - @param bank The bank that should be installed in the system - */ - bool bank(uInt16 bank) override; - - /** - Get the current bank. - - @param address The address to use when querying the bank - */ - uInt16 getBank(uInt16 address = 0) const override; - - /** - Query the number of banks supported by the cartridge. - */ - uInt16 bankCount() const override; - - /** - Patch the cartridge ROM. - - @param address The ROM address to patch - @param value The value to place into the address - @return Success or failure of the patch operation - */ - bool patch(uInt16 address, uInt8 value) override; - - /** - Access the internal ROM image for this cartridge. - - @param size Set to the size of the internal ROM image data - @return A pointer to the internal ROM image data - */ - const uInt8* getImage(size_t& size) const override; - - /** - Save the current state of this cart to the given Serializer. - - @param out The Serializer object to use - @return False on any errors, else true - */ - bool save(Serializer& out) const override; - - /** - Load the current state of this cart from the given Serializer. - - @param in The Serializer object to use - @return False on any errors, else true - */ - bool load(Serializer& in) override; - /** Get a descriptor for the device name (used in error checking). @@ -135,32 +67,12 @@ class CartridgeF6SC : public Cartridge } #endif - public: - /** - Get the byte at the specified address. - - @return The byte at the specified address - */ - uInt8 peek(uInt16 address) override; - - /** - Change the byte at the specified address to the given value - - @param address The address where the value should be stored - @param value The value to be stored at the address - @return True if the poke changed the device address space, else false - */ - bool poke(uInt16 address, uInt8 value) override; - private: - // The 16K ROM image of the cartridge - std::array myImage; + // RAM size + static constexpr uInt16 RAM_SIZE = 0x80; - // The 128 bytes of RAM - std::array myRAM; - - // Indicates the offset into the ROM image (aligns to current bank) - uInt16 myBankOffset{0}; + // RAM mask + static constexpr uInt16 RAM_MASK = RAM_SIZE - 1; private: // Following constructors and assignment operators not supported diff --git a/src/emucore/CartF8.cxx b/src/emucore/CartF8.cxx index b23ed802e..79b4708c4 100644 --- a/src/emucore/CartF8.cxx +++ b/src/emucore/CartF8.cxx @@ -15,176 +15,33 @@ // this file, and for a DISCLAIMER OF ALL WARRANTIES. //============================================================================ -#include "System.hxx" #include "CartF8.hxx" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CartridgeF8::CartridgeF8(const ByteBuffer& image, size_t size, const string& md5, const Settings& settings) - : Cartridge(settings, md5) + : CartridgeEnhanced(image, size, md5, settings) { - // Copy the ROM image into my buffer - std::copy_n(image.get(), std::min(myImage.size(), size), myImage.begin()); - createRomAccessArrays(myImage.size()); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeF8::reset() +bool CartridgeF8::checkSwitchBank(uInt16 address, uInt8) { - initializeStartBank(1); - - // Upon reset we switch to the reset bank - bank(startBank()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeF8::install(System& system) -{ - mySystem = &system; - - // Install pages for the startup bank - bank(startBank()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt8 CartridgeF8::peek(uInt16 address) -{ - address &= 0x0FFF; - // Switch banks if necessary switch(address) { case 0x0FF8: // Set the current bank to the lower 4k bank bank(0); - break; + return true; case 0x0FF9: // Set the current bank to the upper 4k bank bank(1); - break; - - default: - break; - } - - return myImage[myBankOffset + address]; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF8::poke(uInt16 address, uInt8) -{ - address &= 0x0FFF; - - // Switch banks if necessary - switch(address) - { - case 0x0FF8: - // Set the current bank to the lower 4k bank - bank(0); - break; - - case 0x0FF9: - // Set the current bank to the upper 4k bank - bank(1); - break; + return true; default: break; } return false; } - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF8::bank(uInt16 bank) -{ - if(bankLocked()) return false; - - // Remember what bank we're in - myBankOffset = bank << 12; - - System::PageAccess access(this, System::PageAccessType::READ); - - // Set the page accessing methods for the hot spots - for(uInt16 addr = (0x1FF8 & ~System::PAGE_MASK); addr < 0x2000; - addr += System::PAGE_SIZE) - { - access.romAccessBase = &myRomAccessBase[myBankOffset + (addr & 0x0FFF)]; - access.romPeekCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF)]; - access.romPokeCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - - // Setup the page access methods for the current bank - for(uInt16 addr = 0x1000; addr < static_cast(0x1FF8U & ~System::PAGE_MASK); - addr += System::PAGE_SIZE) - { - access.directPeekBase = &myImage[myBankOffset + (addr & 0x0FFF)]; - access.romAccessBase = &myRomAccessBase[myBankOffset + (addr & 0x0FFF)]; - access.romPeekCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF)]; - access.romPokeCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeF8::getBank(uInt16) const -{ - return myBankOffset >> 12; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeF8::bankCount() const -{ - return 2; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF8::patch(uInt16 address, uInt8 value) -{ - myImage[myBankOffset + (address & 0x0FFF)] = value; - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const uInt8* CartridgeF8::getImage(size_t& size) const -{ - size = myImage.size(); - return myImage.data(); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF8::save(Serializer& out) const -{ - try - { - out.putShort(myBankOffset); - } - catch(...) - { - cerr << "ERROR: CartridgeF8::save" << endl; - return false; - } - - return true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF8::load(Serializer& in) -{ - try - { - myBankOffset = in.getShort(); - } - catch(...) - { - cerr << "ERROR: CartridgeF8::load" << endl; - return false; - } - - // Remember what bank we were in - bank(myBankOffset >> 12); - - return true; -} diff --git a/src/emucore/CartF8.hxx b/src/emucore/CartF8.hxx index b586d70ff..71e4d6e72 100644 --- a/src/emucore/CartF8.hxx +++ b/src/emucore/CartF8.hxx @@ -18,10 +18,7 @@ #ifndef CARTRIDGEF8_HXX #define CARTRIDGEF8_HXX -class System; - -#include "bspf.hxx" -#include "Cart.hxx" +#include "CartEnhanced.hxx" #ifdef DEBUGGER_SUPPORT #include "CartF8Widget.hxx" #endif @@ -30,9 +27,9 @@ class System; Cartridge class used for Atari's 8K bankswitched games. There are two 4K banks, accessible by read/write to $1FF8 - $1FF9. - @author Bradford W. Mott + @author Bradford W. Mott, Thomas Jentzsch */ -class CartridgeF8 : public Cartridge +class CartridgeF8 : public CartridgeEnhanced { friend class CartridgeF8Widget; @@ -50,71 +47,6 @@ class CartridgeF8 : public Cartridge virtual ~CartridgeF8() = default; public: - /** - Reset device to its power-on state - */ - void reset() override; - - /** - Install cartridge in the specified system. Invoked by the system - when the cartridge is attached to it. - - @param system The system the device should install itself in - */ - void install(System& system) override; - - /** - Install pages for the specified bank in the system. - - @param bank The bank that should be installed in the system - */ - bool bank(uInt16 bank) override; - - /** - Get the current bank. - - @param address The address to use when querying the bank - */ - uInt16 getBank(uInt16 address = 0) const override; - - /** - Query the number of banks supported by the cartridge. - */ - uInt16 bankCount() const override; - - /** - Patch the cartridge ROM. - - @param address The ROM address to patch - @param value The value to place into the address - @return Success or failure of the patch operation - */ - bool patch(uInt16 address, uInt8 value) override; - - /** - Access the internal ROM image for this cartridge. - - @param size Set to the size of the internal ROM image data - @return A pointer to the internal ROM image data - */ - const uInt8* getImage(size_t& size) const override; - - /** - Save the current state of this cart to the given Serializer. - - @param out The Serializer object to use - @return False on any errors, else true - */ - bool save(Serializer& out) const override; - - /** - Load the current state of this cart from the given Serializer. - - @param in The Serializer object to use - @return False on any errors, else true - */ - bool load(Serializer& in) override; - /** Get a descriptor for the device name (used in error checking). @@ -134,29 +66,13 @@ class CartridgeF8 : public Cartridge } #endif - public: - /** - Get the byte at the specified address. + protected: + bool checkSwitchBank(uInt16 address, uInt8 value = 0) override; - @return The byte at the specified address - */ - uInt8 peek(uInt16 address) override; - - /** - Change the byte at the specified address to the given value - - @param address The address where the value should be stored - @param value The value to be stored at the address - @return True if the poke changed the device address space, else false - */ - bool poke(uInt16 address, uInt8 value) override; + uInt16 romHotspot() const override { return 0x1FF8; } private: - // The 8K ROM image of the cartridge - std::array myImage; - - // Indicates the offset into the ROM image (aligns to current bank) - uInt16 myBankOffset{0}; + uInt16 getStartBank() const override { return 1; } private: // Following constructors and assignment operators not supported diff --git a/src/emucore/CartF8SC.cxx b/src/emucore/CartF8SC.cxx index c885a9c83..e9dd5bd5c 100644 --- a/src/emucore/CartF8SC.cxx +++ b/src/emucore/CartF8SC.cxx @@ -15,231 +15,13 @@ // this file, and for a DISCLAIMER OF ALL WARRANTIES. //============================================================================ -#include "System.hxx" #include "CartF8SC.hxx" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CartridgeF8SC::CartridgeF8SC(const ByteBuffer& image, size_t size, const string& md5, const Settings& settings) - : Cartridge(settings, md5) + : CartridgeF8(image, size, md5, settings) { - // Copy the ROM image into my buffer - std::copy_n(image.get(), std::min(myImage.size(), size), myImage.begin()); - createRomAccessArrays(myImage.size()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeF8SC::reset() -{ - initializeRAM(myRAM.data(), myRAM.size()); - initializeStartBank(1); - - // Upon reset we switch to the startup bank - bank(startBank()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeF8SC::install(System& system) -{ - mySystem = &system; - - System::PageAccess access(this, System::PageAccessType::READ); - - // Set the page accessing method for the RAM writing pages - // Map access to this class, since we need to inspect all accesses to - // check if RWP happens - access.type = System::PageAccessType::WRITE; - for(uInt16 addr = 0x1000; addr < 0x1080; addr += System::PAGE_SIZE) - { - access.romAccessBase = &myRomAccessBase[addr & 0x007F]; - access.romPeekCounter = &myRomAccessCounter[addr & 0x007F]; - access.romPokeCounter = &myRomAccessCounter[(addr & 0x07F) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - - // Set the page accessing method for the RAM reading pages - access.type = System::PageAccessType::READ; - for(uInt16 addr = 0x1080; addr < 0x1100; addr += System::PAGE_SIZE) - { - access.directPeekBase = &myRAM[addr & 0x007F]; - access.romAccessBase = &myRomAccessBase[0x80 + (addr & 0x007F)]; - access.romPeekCounter = &myRomAccessCounter[0x80 + (addr & 0x007F)]; - access.romPokeCounter = &myRomAccessCounter[0x80 + (addr & 0x007F) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - - // Install pages for the startup bank - bank(startBank()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt8 CartridgeF8SC::peek(uInt16 address) -{ - uInt16 peekAddress = address; - address &= 0x0FFF; - - // Switch banks if necessary - switch(address) - { - case 0x0FF8: - // Set the current bank to the lower 4k bank - bank(0); - break; - - case 0x0FF9: - // Set the current bank to the upper 4k bank - bank(1); - break; - - default: - break; - } - - if(address < 0x0080) // Write port is at 0xF000 - 0xF07F (128 bytes) - return peekRAM(myRAM[address], peekAddress); - else - return myImage[myBankOffset + address]; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF8SC::poke(uInt16 address, uInt8 value) -{ - // Switch banks if necessary - switch(address & 0x0FFF) - { - case 0x0FF8: - // Set the current bank to the lower 4k bank - bank(0); - return false; - - case 0x0FF9: - // Set the current bank to the upper 4k bank - bank(1); - return false; - - default: - break; - } - - if (!(address & 0x080)) - { - pokeRAM(myRAM[address & 0x007F], address, value); - return true; - } - else - { - // Writing to the read port should be ignored, but trigger a break if option enabled - uInt8 dummy; - - pokeRAM(dummy, address, value); - myRamWriteAccess = address; - return false; - } -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF8SC::bank(uInt16 bank) -{ - if(bankLocked()) return false; - - // Remember what bank we're in - myBankOffset = bank << 12; - - System::PageAccess access(this, System::PageAccessType::READ); - - // Set the page accessing methods for the hot spots - for(uInt16 addr = (0x1FF8 & ~System::PAGE_MASK); addr < 0x2000; - addr += System::PAGE_SIZE) - { - access.romAccessBase = &myRomAccessBase[myBankOffset + (addr & 0x0FFF)]; - access.romPeekCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF)]; - access.romPokeCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - - // Setup the page access methods for the current bank - for(uInt16 addr = 0x1100; addr < static_cast(0x1FF8U & ~System::PAGE_MASK); - addr += System::PAGE_SIZE) - { - access.directPeekBase = &myImage[myBankOffset + (addr & 0x0FFF)]; - access.romAccessBase = &myRomAccessBase[myBankOffset + (addr & 0x0FFF)]; - access.romPeekCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF)]; - access.romPokeCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeF8SC::getBank(uInt16) const -{ - return myBankOffset >> 12; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeF8SC::bankCount() const -{ - return 2; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF8SC::patch(uInt16 address, uInt8 value) -{ - address &= 0x0FFF; - - if(address < 0x0100) - { - // Normally, a write to the read port won't do anything - // However, the patch command is special in that ignores such - // cart restrictions - myRAM[address & 0x007F] = value; - } - else - myImage[myBankOffset + address] = value; - - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const uInt8* CartridgeF8SC::getImage(size_t& size) const -{ - size = myImage.size(); - return myImage.data(); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF8SC::save(Serializer& out) const -{ - try - { - out.putShort(myBankOffset); - out.putByteArray(myRAM.data(), myRAM.size()); - } - catch(...) - { - cerr << "ERROR: CartridgeF8SC::save" << endl; - return false; - } - - return true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeF8SC::load(Serializer& in) -{ - try - { - myBankOffset = in.getShort(); - in.getByteArray(myRAM.data(), myRAM.size()); - } - catch(...) - { - cerr << "ERROR: CartridgeF8SC::load" << endl; - return false; - } - - // Remember what bank we were in - bank(myBankOffset >> 12); - - return true; + myRamSize = RAM_SIZE; + myRamMask = RAM_MASK; } diff --git a/src/emucore/CartF8SC.hxx b/src/emucore/CartF8SC.hxx index 592637d3d..9ec8209c4 100644 --- a/src/emucore/CartF8SC.hxx +++ b/src/emucore/CartF8SC.hxx @@ -18,10 +18,7 @@ #ifndef CARTRIDGEF8SC_HXX #define CARTRIDGEF8SC_HXX -class System; - -#include "bspf.hxx" -#include "Cart.hxx" +#include "CartF8.hxx" #ifdef DEBUGGER_SUPPORT #include "CartF8SCWidget.hxx" #endif @@ -31,9 +28,9 @@ class System; RAM. There are two 4K banks, accessible by read/write to $1FF8 - $1FF9. RAM read port is $1080 - $10FF, write port is $1000 - $107F. - @author Bradford W. Mott + @author Bradford W. Mott, Thomas Jentzsch */ -class CartridgeF8SC : public Cartridge +class CartridgeF8SC : public CartridgeF8 { friend class CartridgeF8SCWidget; @@ -51,71 +48,6 @@ class CartridgeF8SC : public Cartridge virtual ~CartridgeF8SC() = default; public: - /** - Reset device to its power-on state - */ - void reset() override; - - /** - Install cartridge in the specified system. Invoked by the system - when the cartridge is attached to it. - - @param system The system the device should install itself in - */ - void install(System& system) override; - - /** - Install pages for the specified bank in the system. - - @param bank The bank that should be installed in the system - */ - bool bank(uInt16 bank) override; - - /** - Get the current bank. - - @param address The address to use when querying the bank - */ - uInt16 getBank(uInt16 address = 0) const override; - - /** - Query the number of banks supported by the cartridge. - */ - uInt16 bankCount() const override; - - /** - Patch the cartridge ROM. - - @param address The ROM address to patch - @param value The value to place into the address - @return Success or failure of the patch operation - */ - bool patch(uInt16 address, uInt8 value) override; - - /** - Access the internal ROM image for this cartridge. - - @param size Set to the size of the internal ROM image data - @return A pointer to the internal ROM image data - */ - const uInt8* getImage(size_t& size) const override; - - /** - Save the current state of this cart to the given Serializer. - - @param out The Serializer object to use - @return False on any errors, else true - */ - bool save(Serializer& out) const override; - - /** - Load the current state of this cart from the given Serializer. - - @param in The Serializer object to use - @return False on any errors, else true - */ - bool load(Serializer& in) override; - /** Get a descriptor for the device name (used in error checking). @@ -135,32 +67,12 @@ class CartridgeF8SC : public Cartridge } #endif - public: - /** - Get the byte at the specified address. - - @return The byte at the specified address - */ - uInt8 peek(uInt16 address) override; - - /** - Change the byte at the specified address to the given value - - @param address The address where the value should be stored - @param value The value to be stored at the address - @return True if the poke changed the device address space, else false - */ - bool poke(uInt16 address, uInt8 value) override; - private: - // The 8K ROM image of the cartridge - std::array myImage; + // RAM size + static constexpr uInt16 RAM_SIZE = 0x80; - // The 128 bytes of RAM - std::array myRAM; - - // Indicates the offset into the ROM image (aligns to current bank) - uInt16 myBankOffset{0}; + // RAM mask + static constexpr uInt16 RAM_MASK = RAM_SIZE - 1; private: // Following constructors and assignment operators not supported diff --git a/src/emucore/CartFC.cxx b/src/emucore/CartFC.cxx index 565e577cf..741935c06 100644 --- a/src/emucore/CartFC.cxx +++ b/src/emucore/CartFC.cxx @@ -21,52 +21,35 @@ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CartridgeFC::CartridgeFC(const ByteBuffer& image, size_t size, const string& md5, const Settings& settings) - : Cartridge(settings, md5), - mySize(size) + : CartridgeEnhanced(image, size, md5, settings) { - // Copy the ROM image into my buffer - std::copy_n(image.get(), std::min(myImage.size(), size), myImage.begin()); - createRomAccessArrays(myImage.size()); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void CartridgeFC::reset() { - initializeStartBank(0); + CartridgeEnhanced::reset(); + myTargetBank = 0; - - // Upon reset we switch to the reset bank - bank(startBank()); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeFC::install(System& system) +bool CartridgeFC::checkSwitchBank(uInt16 address, uInt8) { - mySystem = &system; - - // Install pages for the startup bank - bank(startBank()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt8 CartridgeFC::peek(uInt16 address) -{ - address &= 0x0FFF; - // Switch banks if necessary if(address == 0x0FFC) { // Trigger the bank switch bank(myTargetBank); + return true; } - - return myImage[myBankOffset + address]; + return false; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool CartridgeFC::poke(uInt16 address, uInt8 value) { - address &= 0x0FFF; + address &= myBankMask; // Switch banks if necessary switch (address) @@ -88,108 +71,8 @@ bool CartridgeFC::poke(uInt16 address, uInt8 value) myTargetBank = value % bankCount(); break; - case 0x0FFC: - // Trigger the bank switch - bank(myTargetBank); - break; - default: - break; + checkSwitchBank(address); } return false; } - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeFC::bank(uInt16 bank) -{ - if (bankLocked()) return false; - - // Remember what bank we're in - myBankOffset = bank << 12; - - System::PageAccess access(this, System::PageAccessType::READ); - - // Set the page accessing methods for the hot spots - for (uInt16 addr = (0x1FF8 & ~System::PAGE_MASK); addr < 0x2000; - addr += System::PAGE_SIZE) - { - access.romAccessBase = &myRomAccessBase[myBankOffset + (addr & 0x0FFF)]; - access.romPeekCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF)]; - access.romPokeCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - - // Setup the page access methods for the current bank - for (uInt16 addr = 0x1000; addr < static_cast(0x1FF8U & ~System::PAGE_MASK); - addr += System::PAGE_SIZE) - { - access.directPeekBase = &myImage[myBankOffset + (addr & 0x0FFF)]; - access.romAccessBase = &myRomAccessBase[myBankOffset + (addr & 0x0FFF)]; - access.romPeekCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF)]; - access.romPokeCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - myCurrentBank = myTargetBank; - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeFC::getBank(uInt16) const -{ - return myBankOffset >> 12; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeFC::bankCount() const -{ - return uInt16(mySize >> 12); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeFC::patch(uInt16 address, uInt8 value) -{ - myImage[myBankOffset + (address & 0x0FFF)] = value; - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const uInt8* CartridgeFC::getImage(size_t& size) const -{ - size = mySize; - return myImage.data(); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeFC::save(Serializer& out) const -{ - try - { - out.putShort(myBankOffset); - } - catch (...) - { - cerr << "ERROR: CartridgeFC::save" << endl; - return false; - } - - return true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeFC::load(Serializer& in) -{ - try - { - myBankOffset = in.getShort(); - } - catch (...) - { - cerr << "ERROR: CartridgeFC::load" << endl; - return false; - } - - // Remember what bank we were in - bank(myBankOffset >> 12); - - return true; -} diff --git a/src/emucore/CartFC.hxx b/src/emucore/CartFC.hxx index cc96d0131..c1987a189 100644 --- a/src/emucore/CartFC.hxx +++ b/src/emucore/CartFC.hxx @@ -21,7 +21,7 @@ class System; #include "bspf.hxx" -#include "Cart.hxx" +#include "CartEnhanced.hxx" #ifdef DEBUGGER_SUPPORT #include "CartFCWidget.hxx" @@ -30,12 +30,12 @@ class System; /** Cartridge class used for Amiga's 32K Power Play Arcade Video Game Album. There are eight 4K banks, writing to $1FF8 definies the two lowest bits - of the wanted bank, writeing to $1FF9 defines the high bits. Reading from + of the wanted bank, writeing to $1FF9 defines the high bits. Accessing $1FFC triggers the bank switching @author Thomas Jentzsch */ -class CartridgeFC : public Cartridge +class CartridgeFC : public CartridgeEnhanced { friend class CartridgeFCWidget; @@ -58,66 +58,6 @@ class CartridgeFC : public Cartridge */ void reset() override; - /** - Install cartridge in the specified system. Invoked by the system - when the cartridge is attached to it. - - @param system The system the device should install itself in - */ - void install(System& system) override; - - /** - Install pages for the specified bank in the system. - - @param bank The bank that should be installed in the system - */ - bool bank(uInt16 bank) override; - - /** - Get the current bank. - - @param address The address to use when querying the bank - */ - uInt16 getBank(uInt16 address = 0) const override; - - /** - Query the number of banks supported by the cartridge. - */ - uInt16 bankCount() const override; - - /** - Patch the cartridge ROM. - - @param address The ROM address to patch - @param value The value to place into the address - @return Success or failure of the patch operation - */ - bool patch(uInt16 address, uInt8 value) override; - - /** - Access the internal ROM image for this cartridge. - - @param size Set to the size of the internal ROM image data - @return A pointer to the internal ROM image data - */ - const uInt8* getImage(size_t& size) const override; - - /** - Save the current state of this cart to the given Serializer. - - @param out The Serializer object to use - @return False on any errors, else true - */ - bool save(Serializer& out) const override; - - /** - Load the current state of this cart from the given Serializer. - - @param in The Serializer object to use - @return False on any errors, else true - */ - bool load(Serializer& in) override; - /** Get a descriptor for the device name (used in error checking). @@ -138,13 +78,6 @@ class CartridgeFC : public Cartridge #endif public: - /** - Get the byte at the specified address. - - @return The byte at the specified address - */ - uInt8 peek(uInt16 address) override; - /** Change the byte at the specified address to the given value @@ -154,19 +87,12 @@ class CartridgeFC : public Cartridge */ bool poke(uInt16 address, uInt8 value) override; + protected: + bool checkSwitchBank(uInt16 address, uInt8 value = 0) override; + + uInt16 romHotspot() const override { return 0x1FF8; } + private: - // The 32K ROM image of the cartridge - std::array myImage; - - // Size of the ROM image - size_t mySize{0}; - - // Indicates the offset into the ROM image (aligns to current bank) - uInt16 myBankOffset{0}; - - // Indicates which bank is currently active for the first segment - uInt16 myCurrentBank{0}; - // Target bank defined by writing to $1FF8/9 uInt16 myTargetBank{0}; diff --git a/src/emucore/CartFE.cxx b/src/emucore/CartFE.cxx index 36cfa7c84..1837c7b88 100644 --- a/src/emucore/CartFE.cxx +++ b/src/emucore/CartFE.cxx @@ -22,20 +22,15 @@ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CartridgeFE::CartridgeFE(const ByteBuffer& image, size_t size, const string& md5, const Settings& settings) - : Cartridge(settings, md5) + : CartridgeEnhanced(image, size, md5, settings) { - // Copy the ROM image into my buffer - std::copy_n(image.get(), std::min(myImage.size(), size), myImage.begin()); - createRomAccessArrays(myImage.size()); + myDirectPeek = false; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void CartridgeFE::reset() { - // Decathlon requires this, since there is no startup vector in bank 1 - initializeStartBank(0); - - bank(startBank()); + CartridgeEnhanced::reset(); myLastAccessWasFE = false; } @@ -51,14 +46,27 @@ void CartridgeFE::install(System& system) mySystem->setPageAccess(addr, access); } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool CartridgeFE::checkSwitchBank(uInt16 address, uInt8 value) +{ + if(myLastAccessWasFE) + { + bank((value & 0x20) ? 0 : 1); + myLastAccessWasFE = false; // was: address == 0x01FE; + return true; + } + myLastAccessWasFE = address == 0x01FE; + return false; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - uInt8 CartridgeFE::peek(uInt16 address) { uInt8 value = (address < 0x200) ? mySystem->m6532().peek(address) : - myImage[myBankOffset + (address & 0x0FFF)]; + myImage[myBankOffset + (address & myBankMask)]; // Check if we hit hotspot - checkBankSwitch(address, value); + checkSwitchBank(address, value); return value; } @@ -70,83 +78,17 @@ bool CartridgeFE::poke(uInt16 address, uInt8 value) mySystem->m6532().poke(address, value); // Check if we hit hotspot - checkBankSwitch(address, value); + checkSwitchBank(address, value); return false; } -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeFE::checkBankSwitch(uInt16 address, uInt8 value) -{ - if(bankLocked()) - return; - - // Did we detect $01FE on the last address bus access? - // If so, we bankswitch according to the upper 3 bits of the data bus - // NOTE: see the header file for the significance of 'value & 0x20' - if(myLastAccessWasFE) - bank((value & 0x20) ? 0 : 1); - - // On the next cycle, we use the (then) current data bus value to decode - // the bank to use - myLastAccessWasFE = address == 0x01FE; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeFE::bank(uInt16 bank) -{ - if(bankLocked()) - return false; - - myBankOffset = bank << 12; - - System::PageAccess access(this, System::PageAccessType::READ); - - // Setup the page access methods for the current bank - // Map all of the cart accesses to call peek and poke - for(uInt16 addr = 0x1000; addr < 0x2000; addr += System::PAGE_SIZE) - { - access.romAccessBase = &myRomAccessBase[myBankOffset + (addr & 0x0FFF)]; - access.romPeekCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF)]; - access.romPokeCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeFE::getBank(uInt16) const -{ - return myBankOffset >> 12; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeFE::bankCount() const -{ - return 2; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeFE::patch(uInt16 address, uInt8 value) -{ - myImage[myBankOffset + (address & 0x0FFF)] = value; - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const uInt8* CartridgeFE::getImage(size_t& size) const -{ - size = myImage.size(); - return myImage.data(); -} - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool CartridgeFE::save(Serializer& out) const { + CartridgeEnhanced::save(out); try { - out.putShort(myBankOffset); out.putBool(myLastAccessWasFE); } catch(...) @@ -161,9 +103,9 @@ bool CartridgeFE::save(Serializer& out) const // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool CartridgeFE::load(Serializer& in) { + CartridgeEnhanced::load(in); try { - myBankOffset = in.getShort(); myLastAccessWasFE = in.getBool(); } catch(...) diff --git a/src/emucore/CartFE.hxx b/src/emucore/CartFE.hxx index dabfafdf4..18361faf0 100644 --- a/src/emucore/CartFE.hxx +++ b/src/emucore/CartFE.hxx @@ -21,7 +21,7 @@ class System; #include "bspf.hxx" -#include "Cart.hxx" +#include "CartEnhanced.hxx" #ifdef DEBUGGER_SUPPORT #include "CartFEWidget.hxx" #endif @@ -75,7 +75,7 @@ class System; @author Stephen Anthony; with ideas/research from Christian Speckner and alex_79 and TomSon (of AtariAge) */ -class CartridgeFE : public Cartridge +class CartridgeFE : public CartridgeEnhanced { friend class CartridgeFEWidget; @@ -106,42 +106,6 @@ class CartridgeFE : public Cartridge */ void install(System& system) override; - /** - Install pages for the specified bank in the system. - - @param bank The bank that should be installed in the system - */ - bool bank(uInt16 bank) override; - - /** - Get the current bank. - - @param address The address to use when querying the bank - */ - uInt16 getBank(uInt16 address = 0) const override; - - /** - Query the number of banks supported by the cartridge. - */ - uInt16 bankCount() const override; - - /** - Patch the cartridge ROM. - - @param address The ROM address to patch - @param value The value to place into the address - @return Success or failure of the patch operation - */ - bool patch(uInt16 address, uInt8 value) override; - - /** - Access the internal ROM image for this cartridge. - - @param size Set to the size of the internal ROM image data - @return A pointer to the internal ROM image data - */ - const uInt8* getImage(size_t& size) const override; - /** Save the current state of this cart to the given Serializer. @@ -194,20 +158,14 @@ class CartridgeFE : public Cartridge */ bool poke(uInt16 address, uInt8 value) override; - private: + protected: /** Perform bankswitch when necessary, by monitoring for $01FE on the address bus and getting the bank number from the data bus. */ - void checkBankSwitch(uInt16 address, uInt8 value); + bool checkSwitchBank(uInt16 address, uInt8 value) override; private: - // The 8K ROM image of the cartridge - std::array myImage; - - // Indicates the offset into the ROM image (aligns to current bank) - uInt16 myBankOffset{0}; - // Whether previous address by peek/poke equals $01FE (hotspot) bool myLastAccessWasFE{false}; diff --git a/src/emucore/CartMNetwork.hxx b/src/emucore/CartMNetwork.hxx index ad0decad9..ef06aae57 100644 --- a/src/emucore/CartMNetwork.hxx +++ b/src/emucore/CartMNetwork.hxx @@ -106,7 +106,7 @@ class CartridgeMNetwork : public Cartridge uInt16 getBank(uInt16 address = 0) const override; /** - Query the number of banks supported by the cartridge. + Query the number of banks supported by the cartridge. */ uInt16 bankCount() const override; diff --git a/src/emucore/CartUA.cxx b/src/emucore/CartUA.cxx index bfa1321bb..4fd5a5410 100644 --- a/src/emucore/CartUA.cxx +++ b/src/emucore/CartUA.cxx @@ -22,20 +22,9 @@ CartridgeUA::CartridgeUA(const ByteBuffer& image, size_t size, const string& md5, const Settings& settings, bool swapHotspots) - : Cartridge(settings, md5), + : CartridgeEnhanced(image, size, md5, settings), mySwappedHotspots(swapHotspots) { - // Copy the ROM image into my buffer - std::copy_n(image.get(), std::min(myImage.size(), size), myImage.begin()); - createRomAccessArrays(myImage.size()); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeUA::reset() -{ - // Upon reset we switch to the startup bank - initializeStartBank(0); - bank(startBank()); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -60,26 +49,33 @@ void CartridgeUA::install(System& system) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt8 CartridgeUA::peek(uInt16 address) +bool CartridgeUA::checkSwitchBank(uInt16 address, uInt8) { - address &= 0x1FFF; - // Switch banks if necessary switch(address & 0x1260) { case 0x0220: // Set the current bank to the lower 4k bank bank(mySwappedHotspots ? 1 : 0); - break; + return true; case 0x0240: // Set the current bank to the upper 4k bank bank(mySwappedHotspots ? 0 : 1); - break; + return true; default: break; } + return false; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +uInt8 CartridgeUA::peek(uInt16 address) +{ + address &= myBankMask; + + checkSwitchBank(address); // Because of the way accessing is set up, we will only get here // when doing a TIA read @@ -90,24 +86,9 @@ uInt8 CartridgeUA::peek(uInt16 address) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool CartridgeUA::poke(uInt16 address, uInt8 value) { - address &= 0x1FFF; + address &= myBankMask; - // Switch banks if necessary - switch(address & 0x1260) - { - case 0x0220: - // Set the current bank to the lower 4k bank - bank(mySwappedHotspots ? 1 : 0); - break; - - case 0x0240: - // Set the current bank to the upper 4k bank - bank(mySwappedHotspots ? 0 : 1); - break; - - default: - break; - } + checkSwitchBank(address); // Because of the way accessing is set up, we will may get here by // doing a write to TIA or cart; we ignore the cart write @@ -119,87 +100,3 @@ bool CartridgeUA::poke(uInt16 address, uInt8 value) return false; } - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeUA::bank(uInt16 bank) -{ - if(bankLocked()) return false; - - // Remember what bank we're in - myBankOffset = bank << 12; - - // Setup the page access methods for the current bank - System::PageAccess access(this, System::PageAccessType::READ); - - // Map ROM image into the system - for(uInt16 addr = 0x1000; addr < 0x2000; addr += System::PAGE_SIZE) - { - access.directPeekBase = &myImage[myBankOffset + (addr & 0x0FFF)]; - access.romAccessBase = &myRomAccessBase[myBankOffset + (addr & 0x0FFF)]; - access.romPeekCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF)]; - access.romPokeCounter = &myRomAccessCounter[myBankOffset + (addr & 0x0FFF) + myAccessSize]; - mySystem->setPageAccess(addr, access); - } - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeUA::getBank(uInt16) const -{ - return myBankOffset >> 12; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt16 CartridgeUA::bankCount() const -{ - return 2; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeUA::patch(uInt16 address, uInt8 value) -{ - myImage[myBankOffset + (address & 0x0FFF)] = value; - return myBankChanged = true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const uInt8* CartridgeUA::getImage(size_t& size) const -{ - size = myImage.size(); - return myImage.data(); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeUA::save(Serializer& out) const -{ - try - { - out.putShort(myBankOffset); - } - catch(...) - { - cerr << "ERROR: " << name() << "::save" << endl; - return false; - } - - return true; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CartridgeUA::load(Serializer& in) -{ - try - { - myBankOffset = in.getShort(); - } - catch(...) - { - cerr << "ERROR: " << name() << "::load" << endl; - return false; - } - - // Remember what bank we were in - bank(myBankOffset >> 12); - - return true; -} diff --git a/src/emucore/CartUA.hxx b/src/emucore/CartUA.hxx index 38588e4a9..66fe82ec8 100644 --- a/src/emucore/CartUA.hxx +++ b/src/emucore/CartUA.hxx @@ -19,7 +19,7 @@ #define CARTRIDGEUA_HXX #include "bspf.hxx" -#include "Cart.hxx" +#include "CartEnhanced.hxx" #include "System.hxx" #ifdef DEBUGGER_SUPPORT #include "CartUAWidget.hxx" @@ -30,9 +30,9 @@ are two 4K banks, which are switched by accessing $0220 (bank 0) and $0240 (bank 1). - @author Bradford W. Mott + @author Bradford W. Mott, Thomas Jentzsch */ -class CartridgeUA : public Cartridge +class CartridgeUA : public CartridgeEnhanced { friend class CartridgeUAWidget; @@ -51,11 +51,6 @@ class CartridgeUA : public Cartridge virtual ~CartridgeUA() = default; public: - /** - Reset device to its power-on state - */ - void reset() override; - /** Install cartridge in the specified system. Invoked by the system when the cartridge is attached to it. @@ -64,57 +59,6 @@ class CartridgeUA : public Cartridge */ void install(System& system) override; - /** - Install pages for the specified bank in the system. - - @param bank The bank that should be installed in the system - */ - bool bank(uInt16 bank) override; - - /** - Get the current bank. - - @param address The address to use when querying the bank - */ - uInt16 getBank(uInt16 address = 0) const override; - - /** - Query the number of banks supported by the cartridge. - */ - uInt16 bankCount() const override; - - /** - Patch the cartridge ROM. - - @param address The ROM address to patch - @param value The value to place into the address - @return Success or failure of the patch operation - */ - bool patch(uInt16 address, uInt8 value) override; - - /** - Access the internal ROM image for this cartridge. - - @param size Set to the size of the internal ROM image data - @return A pointer to the internal ROM image data - */ - const uInt8* getImage(size_t& size) const override; - - /** - Save the current state of this cart to the given Serializer. - - @param out The Serializer object to use - @return False on any errors, else true - */ - bool save(Serializer& out) const override; - - /** - Load the current state of this cart from the given Serializer. - - @param in The Serializer object to use - @return False on any errors, else true - */ - bool load(Serializer& in) override; /** Get a descriptor for the device name (used in error checking). @@ -152,16 +96,14 @@ class CartridgeUA : public Cartridge */ bool poke(uInt16 address, uInt8 value) override; - private: - // The 8K ROM image of the cartridge - std::array myImage; + protected: + bool checkSwitchBank(uInt16 address, uInt8 value = 0) override; + + private: // Previous Device's page access std::array myHotSpotPageAccess; - // Indicates the offset into the ROM image (aligns to current bank) - uInt16 myBankOffset{0}; - // Indicates if banks are swapped ("Mickey" cart) bool mySwappedHotspots{false}; diff --git a/src/windows/Stella.vcxproj b/src/windows/Stella.vcxproj index 9aa49cb84..fcd2b85fb 100644 --- a/src/windows/Stella.vcxproj +++ b/src/windows/Stella.vcxproj @@ -717,6 +717,7 @@ + @@ -1739,6 +1740,7 @@ + diff --git a/src/windows/Stella.vcxproj.filters b/src/windows/Stella.vcxproj.filters index 4a2fe6691..ef41cf662 100644 --- a/src/windows/Stella.vcxproj.filters +++ b/src/windows/Stella.vcxproj.filters @@ -1005,6 +1005,9 @@ Source Files\gui + + Source Files\emucore + @@ -2063,6 +2066,9 @@ Header Files\gui + + Header Files\emucore + diff --git a/test/roms/bankswitching/0840/Untitled.bin b/test/roms/bankswitching/0840/Untitled.bin new file mode 100644 index 000000000..4c4751700 Binary files /dev/null and b/test/roms/bankswitching/0840/Untitled.bin differ diff --git a/test/roms/bankswitching/2K/2-in-1 - Freeway and Tennis [p1].a26 b/test/roms/bankswitching/2K/2-in-1 - Freeway and Tennis [p1].a26 new file mode 100644 index 000000000..5d02224be Binary files /dev/null and b/test/roms/bankswitching/2K/2-in-1 - Freeway and Tennis [p1].a26 differ diff --git a/test/roms/bankswitching/2K/Air-Sea Battle (1977) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/2K/Air-Sea Battle (1977) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..874df52d7 Binary files /dev/null and b/test/roms/bankswitching/2K/Air-Sea Battle (1977) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/2K/Air-Sea Battle (1977) (Atari) (PAL) [p1][!].a26 b/test/roms/bankswitching/2K/Air-Sea Battle (1977) (Atari) (PAL) [p1][!].a26 new file mode 100644 index 000000000..20278eb6c Binary files /dev/null and b/test/roms/bankswitching/2K/Air-Sea Battle (1977) (Atari) (PAL) [p1][!].a26 differ diff --git a/test/roms/bankswitching/2K/Air-Sea Battle (1977) (Atari) [!].a26 b/test/roms/bankswitching/2K/Air-Sea Battle (1977) (Atari) [!].a26 new file mode 100644 index 000000000..96465e288 Binary files /dev/null and b/test/roms/bankswitching/2K/Air-Sea Battle (1977) (Atari) [!].a26 differ diff --git a/test/roms/bankswitching/2K/Air-Sea Battle (1977) (Atari) [o1].a26 b/test/roms/bankswitching/2K/Air-Sea Battle (1977) (Atari) [o1].a26 new file mode 100644 index 000000000..f0323e474 Binary files /dev/null and b/test/roms/bankswitching/2K/Air-Sea Battle (1977) (Atari) [o1].a26 differ diff --git a/test/roms/bankswitching/2K/Air-Sea Battle (1977) (Atari) [o1][h1].a26 b/test/roms/bankswitching/2K/Air-Sea Battle (1977) (Atari) [o1][h1].a26 new file mode 100644 index 000000000..309430160 Binary files /dev/null and b/test/roms/bankswitching/2K/Air-Sea Battle (1977) (Atari) [o1][h1].a26 differ diff --git a/test/roms/bankswitching/2K/Air-Sea Battle (32-in-1) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/2K/Air-Sea Battle (32-in-1) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..1d7018021 Binary files /dev/null and b/test/roms/bankswitching/2K/Air-Sea Battle (32-in-1) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/2K/Combat (1977) (Atari) [!].a26 b/test/roms/bankswitching/2K/Combat (1977) (Atari) [!].a26 new file mode 100644 index 000000000..5c52aef01 Binary files /dev/null and b/test/roms/bankswitching/2K/Combat (1977) (Atari) [!].a26 differ diff --git a/test/roms/bankswitching/2K/Combat (32-in-1) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/2K/Combat (32-in-1) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..a71ae9a42 Binary files /dev/null and b/test/roms/bankswitching/2K/Combat (32-in-1) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/2K/Combat (Atari) (PAL) [!].a26 b/test/roms/bankswitching/2K/Combat (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..18646de33 Binary files /dev/null and b/test/roms/bankswitching/2K/Combat (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/2K/Combat - Tank AI (19-04-2003) (Zach Matley).a26 b/test/roms/bankswitching/2K/Combat - Tank AI (19-04-2003) (Zach Matley).a26 new file mode 100644 index 000000000..c53da0041 Binary files /dev/null and b/test/roms/bankswitching/2K/Combat - Tank AI (19-04-2003) (Zach Matley).a26 differ diff --git a/test/roms/bankswitching/2K/Combat AI (16-02-2003) (Zach Matley).a26 b/test/roms/bankswitching/2K/Combat AI (16-02-2003) (Zach Matley).a26 new file mode 100644 index 000000000..4a6741bae Binary files /dev/null and b/test/roms/bankswitching/2K/Combat AI (16-02-2003) (Zach Matley).a26 differ diff --git a/test/roms/bankswitching/2K/Combat Rock (PD) [a1].a26 b/test/roms/bankswitching/2K/Combat Rock (PD) [a1].a26 new file mode 100644 index 000000000..b81122971 Binary files /dev/null and b/test/roms/bankswitching/2K/Combat Rock (PD) [a1].a26 differ diff --git a/test/roms/bankswitching/2K/Combat Rock (PD).a26 b/test/roms/bankswitching/2K/Combat Rock (PD).a26 new file mode 100644 index 000000000..847d99835 Binary files /dev/null and b/test/roms/bankswitching/2K/Combat Rock (PD).a26 differ diff --git a/test/roms/bankswitching/2K/Combat TC (v0.1).a26 b/test/roms/bankswitching/2K/Combat TC (v0.1).a26 new file mode 100644 index 000000000..cc76498b6 Binary files /dev/null and b/test/roms/bankswitching/2K/Combat TC (v0.1).a26 differ diff --git a/test/roms/bankswitching/2K/Freeway (1981) (Activision) (PAL) [!].a26 b/test/roms/bankswitching/2K/Freeway (1981) (Activision) (PAL) [!].a26 new file mode 100644 index 000000000..dbafe87b5 Binary files /dev/null and b/test/roms/bankswitching/2K/Freeway (1981) (Activision) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/2K/Freeway (1981) (Activision) [!].a26 b/test/roms/bankswitching/2K/Freeway (1981) (Activision) [!].a26 new file mode 100644 index 000000000..895e05760 Binary files /dev/null and b/test/roms/bankswitching/2K/Freeway (1981) (Activision) [!].a26 differ diff --git a/test/roms/bankswitching/2K/Freeway (1981) (Activision) [o1].a26 b/test/roms/bankswitching/2K/Freeway (1981) (Activision) [o1].a26 new file mode 100644 index 000000000..51f0febc3 Binary files /dev/null and b/test/roms/bankswitching/2K/Freeway (1981) (Activision) [o1].a26 differ diff --git a/test/roms/bankswitching/2K/Freeway (1981) (Activision) [o2].a26 b/test/roms/bankswitching/2K/Freeway (1981) (Activision) [o2].a26 new file mode 100644 index 000000000..10e525cac Binary files /dev/null and b/test/roms/bankswitching/2K/Freeway (1981) (Activision) [o2].a26 differ diff --git a/test/roms/bankswitching/2K/Freeway (32-in-1) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/2K/Freeway (32-in-1) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..bda078131 Binary files /dev/null and b/test/roms/bankswitching/2K/Freeway (32-in-1) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/2K/Freeway (AKA Rabbits) (PAL) [p1][!].a26 b/test/roms/bankswitching/2K/Freeway (AKA Rabbits) (PAL) [p1][!].a26 new file mode 100644 index 000000000..3ee95e9d9 Binary files /dev/null and b/test/roms/bankswitching/2K/Freeway (AKA Rabbits) (PAL) [p1][!].a26 differ diff --git a/test/roms/bankswitching/2K/Freeway (CCE).a26 b/test/roms/bankswitching/2K/Freeway (CCE).a26 new file mode 100644 index 000000000..738083931 Binary files /dev/null and b/test/roms/bankswitching/2K/Freeway (CCE).a26 differ diff --git a/test/roms/bankswitching/2K/Freeway (Dactar) (PAL) [p1][!].a26 b/test/roms/bankswitching/2K/Freeway (Dactar) (PAL) [p1][!].a26 new file mode 100644 index 000000000..4fd295f81 Binary files /dev/null and b/test/roms/bankswitching/2K/Freeway (Dactar) (PAL) [p1][!].a26 differ diff --git a/test/roms/bankswitching/2K/Kaboom! (1981) (Activision) (PAL) [!].a26 b/test/roms/bankswitching/2K/Kaboom! (1981) (Activision) (PAL) [!].a26 new file mode 100644 index 000000000..44fe84378 Binary files /dev/null and b/test/roms/bankswitching/2K/Kaboom! (1981) (Activision) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/2K/Kaboom! (1981) (Activision) [o1].a26 b/test/roms/bankswitching/2K/Kaboom! (1981) (Activision) [o1].a26 new file mode 100644 index 000000000..45ef3ba2b Binary files /dev/null and b/test/roms/bankswitching/2K/Kaboom! (1981) (Activision) [o1].a26 differ diff --git a/test/roms/bankswitching/2K/Kaboom! (1981) (Activision) [o2].a26 b/test/roms/bankswitching/2K/Kaboom! (1981) (Activision) [o2].a26 new file mode 100644 index 000000000..a6d0612f8 Binary files /dev/null and b/test/roms/bankswitching/2K/Kaboom! (1981) (Activision) [o2].a26 differ diff --git a/test/roms/bankswitching/2K/Kaboom! (CCE).a26 b/test/roms/bankswitching/2K/Kaboom! (CCE).a26 new file mode 100644 index 000000000..4f18cb0bb Binary files /dev/null and b/test/roms/bankswitching/2K/Kaboom! (CCE).a26 differ diff --git a/test/roms/bankswitching/2K/Kabul! by Jess Ragan (Kaboom! Hack).a26 b/test/roms/bankswitching/2K/Kabul! by Jess Ragan (Kaboom! Hack).a26 new file mode 100644 index 000000000..72dcc7e52 Binary files /dev/null and b/test/roms/bankswitching/2K/Kabul! by Jess Ragan (Kaboom! Hack).a26 differ diff --git a/test/roms/bankswitching/2K/Okie Dokie (4K) (PD).a26 b/test/roms/bankswitching/2K/Okie Dokie (4K) (PD).a26 new file mode 100644 index 000000000..bb746eacb Binary files /dev/null and b/test/roms/bankswitching/2K/Okie Dokie (4K) (PD).a26 differ diff --git a/test/roms/bankswitching/2K/Okie Dokie (Older) (PD).a26 b/test/roms/bankswitching/2K/Okie Dokie (Older) (PD).a26 new file mode 100644 index 000000000..fc754ff18 Binary files /dev/null and b/test/roms/bankswitching/2K/Okie Dokie (Older) (PD).a26 differ diff --git a/test/roms/bankswitching/2K/Okie Dokie (PD).a26 b/test/roms/bankswitching/2K/Okie Dokie (PD).a26 new file mode 100644 index 000000000..c2bc1c036 Binary files /dev/null and b/test/roms/bankswitching/2K/Okie Dokie (PD).a26 differ diff --git a/test/roms/bankswitching/2K/Stampede (1981) (Activision) (PAL) [!].a26 b/test/roms/bankswitching/2K/Stampede (1981) (Activision) (PAL) [!].a26 new file mode 100644 index 000000000..8fb0c970f Binary files /dev/null and b/test/roms/bankswitching/2K/Stampede (1981) (Activision) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/2K/Stampede (1981) (Activision) (PAL) [p1][!].a26 b/test/roms/bankswitching/2K/Stampede (1981) (Activision) (PAL) [p1][!].a26 new file mode 100644 index 000000000..41b7523df Binary files /dev/null and b/test/roms/bankswitching/2K/Stampede (1981) (Activision) (PAL) [p1][!].a26 differ diff --git a/test/roms/bankswitching/2K/Stampede (1981) (Activision) (PAL) [p1][o1][!].a26 b/test/roms/bankswitching/2K/Stampede (1981) (Activision) (PAL) [p1][o1][!].a26 new file mode 100644 index 000000000..9e0d5f555 Binary files /dev/null and b/test/roms/bankswitching/2K/Stampede (1981) (Activision) (PAL) [p1][o1][!].a26 differ diff --git a/test/roms/bankswitching/2K/Stampede (1981) (Activision) [!].a26 b/test/roms/bankswitching/2K/Stampede (1981) (Activision) [!].a26 new file mode 100644 index 000000000..263b5922b Binary files /dev/null and b/test/roms/bankswitching/2K/Stampede (1981) (Activision) [!].a26 differ diff --git a/test/roms/bankswitching/2K/Stampede (1981) (Activision) [o1].a26 b/test/roms/bankswitching/2K/Stampede (1981) (Activision) [o1].a26 new file mode 100644 index 000000000..e79c73e08 Binary files /dev/null and b/test/roms/bankswitching/2K/Stampede (1981) (Activision) [o1].a26 differ diff --git a/test/roms/bankswitching/2K/Stampede (1981) (Activision) [o2].a26 b/test/roms/bankswitching/2K/Stampede (1981) (Activision) [o2].a26 new file mode 100644 index 000000000..521feb6b0 Binary files /dev/null and b/test/roms/bankswitching/2K/Stampede (1981) (Activision) [o2].a26 differ diff --git a/test/roms/bankswitching/2K/Stampede (32-in-1) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/2K/Stampede (32-in-1) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..c18e2c47f Binary files /dev/null and b/test/roms/bankswitching/2K/Stampede (32-in-1) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/2K/Tank Plus (1977) (Sears) [a1].a26 b/test/roms/bankswitching/2K/Tank Plus (1977) (Sears) [a1].a26 new file mode 100644 index 000000000..86ffe6027 Binary files /dev/null and b/test/roms/bankswitching/2K/Tank Plus (1977) (Sears) [a1].a26 differ diff --git a/test/roms/bankswitching/2K/Tank Plus (1977) (Sears).a26 b/test/roms/bankswitching/2K/Tank Plus (1977) (Sears).a26 new file mode 100644 index 000000000..a2bde7013 Binary files /dev/null and b/test/roms/bankswitching/2K/Tank Plus (1977) (Sears).a26 differ diff --git a/test/roms/bankswitching/2K/Tennis (1981) (Activision) (PAL) [!].a26 b/test/roms/bankswitching/2K/Tennis (1981) (Activision) (PAL) [!].a26 new file mode 100644 index 000000000..8826ee2ee Binary files /dev/null and b/test/roms/bankswitching/2K/Tennis (1981) (Activision) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/2K/Tennis (1981) (Activision) (PAL) [p1][o1].a26 b/test/roms/bankswitching/2K/Tennis (1981) (Activision) (PAL) [p1][o1].a26 new file mode 100644 index 000000000..89bdbff4b Binary files /dev/null and b/test/roms/bankswitching/2K/Tennis (1981) (Activision) (PAL) [p1][o1].a26 differ diff --git a/test/roms/bankswitching/2K/Tennis (1981) (Activision) [!].a26 b/test/roms/bankswitching/2K/Tennis (1981) (Activision) [!].a26 new file mode 100644 index 000000000..faef0f0d9 Binary files /dev/null and b/test/roms/bankswitching/2K/Tennis (1981) (Activision) [!].a26 differ diff --git a/test/roms/bankswitching/2K/Tennis (1981) (Activision) [o1].a26 b/test/roms/bankswitching/2K/Tennis (1981) (Activision) [o1].a26 new file mode 100644 index 000000000..fab280258 Binary files /dev/null and b/test/roms/bankswitching/2K/Tennis (1981) (Activision) [o1].a26 differ diff --git a/test/roms/bankswitching/2K/Tennis (1981) (Activision) [o2].a26 b/test/roms/bankswitching/2K/Tennis (1981) (Activision) [o2].a26 new file mode 100644 index 000000000..f9c3c08b5 Binary files /dev/null and b/test/roms/bankswitching/2K/Tennis (1981) (Activision) [o2].a26 differ diff --git a/test/roms/bankswitching/2K/Tennis (32-in-1) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/2K/Tennis (32-in-1) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..e5d5764bf Binary files /dev/null and b/test/roms/bankswitching/2K/Tennis (32-in-1) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/2K/Tennis (Dactar) (PAL) [p1][!].a26 b/test/roms/bankswitching/2K/Tennis (Dactar) (PAL) [p1][!].a26 new file mode 100644 index 000000000..a0ace2700 Binary files /dev/null and b/test/roms/bankswitching/2K/Tennis (Dactar) (PAL) [p1][!].a26 differ diff --git a/test/roms/bankswitching/2K/Tennis (Pet Boat) (PAL) [p1][!].a26 b/test/roms/bankswitching/2K/Tennis (Pet Boat) (PAL) [p1][!].a26 new file mode 100644 index 000000000..d6edac37d Binary files /dev/null and b/test/roms/bankswitching/2K/Tennis (Pet Boat) (PAL) [p1][!].a26 differ diff --git a/test/roms/bankswitching/2K/Tennis (Starsoft) (PAL) [!].a26 b/test/roms/bankswitching/2K/Tennis (Starsoft) (PAL) [!].a26 new file mode 100644 index 000000000..1c0eb0afd Binary files /dev/null and b/test/roms/bankswitching/2K/Tennis (Starsoft) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/2K/Video Olympics (1978) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/2K/Video Olympics (1978) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..2e62ed980 Binary files /dev/null and b/test/roms/bankswitching/2K/Video Olympics (1978) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/2K/Video Olympics (1978) (Atari) [o1].a26 b/test/roms/bankswitching/2K/Video Olympics (1978) (Atari) [o1].a26 new file mode 100644 index 000000000..caa20dfcb Binary files /dev/null and b/test/roms/bankswitching/2K/Video Olympics (1978) (Atari) [o1].a26 differ diff --git a/test/roms/bankswitching/2K/Video Olympics (1978) (Atari).a26 b/test/roms/bankswitching/2K/Video Olympics (1978) (Atari).a26 new file mode 100644 index 000000000..14a5bdfc7 Binary files /dev/null and b/test/roms/bankswitching/2K/Video Olympics (1978) (Atari).a26 differ diff --git a/test/roms/bankswitching/2K/Xaxyrax Road by Charles Morgan (Freeway Hack).a26 b/test/roms/bankswitching/2K/Xaxyrax Road by Charles Morgan (Freeway Hack).a26 new file mode 100644 index 000000000..448ab3054 Binary files /dev/null and b/test/roms/bankswitching/2K/Xaxyrax Road by Charles Morgan (Freeway Hack).a26 differ diff --git a/test/roms/bankswitching/3E+/3E+ram.bin b/test/roms/bankswitching/3E+/3E+ram.bin new file mode 100644 index 000000000..2c8b5ef2a Binary files /dev/null and b/test/roms/bankswitching/3E+/3E+ram.bin differ diff --git a/test/roms/bankswitching/3E+/3E+ram_I.bin b/test/roms/bankswitching/3E+/3E+ram_I.bin new file mode 100644 index 000000000..23c0e2a9e Binary files /dev/null and b/test/roms/bankswitching/3E+/3E+ram_I.bin differ diff --git a/test/roms/bankswitching/3E+/3E+ram_NI.bin b/test/roms/bankswitching/3E+/3E+ram_NI.bin new file mode 100644 index 000000000..ece5dea86 Binary files /dev/null and b/test/roms/bankswitching/3E+/3E+ram_NI.bin differ diff --git a/test/roms/bankswitching/3E+/3E+rom.bin b/test/roms/bankswitching/3E+/3E+rom.bin new file mode 100644 index 000000000..da9b96d27 Binary files /dev/null and b/test/roms/bankswitching/3E+/3E+rom.bin differ diff --git a/test/roms/bankswitching/3E/3E Bankswitch Test (TIA @ $00).bin b/test/roms/bankswitching/3E/3E Bankswitch Test (TIA @ $00).bin new file mode 100644 index 000000000..fa79f1d00 Binary files /dev/null and b/test/roms/bankswitching/3E/3E Bankswitch Test (TIA @ $00).bin differ diff --git a/test/roms/bankswitching/3E/Andrew Davies early notBoulderDash demo (NTSC).bin b/test/roms/bankswitching/3E/Andrew Davies early notBoulderDash demo (NTSC).bin new file mode 100644 index 000000000..b55d6a896 Binary files /dev/null and b/test/roms/bankswitching/3E/Andrew Davies early notBoulderDash demo (NTSC).bin differ diff --git a/test/roms/bankswitching/3E/Andrew Davies early notBoulderDash demo (PAL).bin b/test/roms/bankswitching/3E/Andrew Davies early notBoulderDash demo (PAL).bin new file mode 100644 index 000000000..3330b3c33 Binary files /dev/null and b/test/roms/bankswitching/3E/Andrew Davies early notBoulderDash demo (PAL).bin differ diff --git a/test/roms/bankswitching/3E/Boulder Dash (Demo 2).bin b/test/roms/bankswitching/3E/Boulder Dash (Demo 2).bin new file mode 100644 index 000000000..c0530c8bb Binary files /dev/null and b/test/roms/bankswitching/3E/Boulder Dash (Demo 2).bin differ diff --git a/test/roms/bankswitching/3F/Espial (1984) (Tigervision) (PAL).a26 b/test/roms/bankswitching/3F/Espial (1984) (Tigervision) (PAL).a26 new file mode 100644 index 000000000..5484ff61b Binary files /dev/null and b/test/roms/bankswitching/3F/Espial (1984) (Tigervision) (PAL).a26 differ diff --git a/test/roms/bankswitching/3F/Espial (1984) (Tigervision).a26 b/test/roms/bankswitching/3F/Espial (1984) (Tigervision).a26 new file mode 100644 index 000000000..e5aa8380f Binary files /dev/null and b/test/roms/bankswitching/3F/Espial (1984) (Tigervision).a26 differ diff --git a/test/roms/bankswitching/3F/Miner 2049er (1982) (Tigervision).a26 b/test/roms/bankswitching/3F/Miner 2049er (1982) (Tigervision).a26 new file mode 100644 index 000000000..40812263d Binary files /dev/null and b/test/roms/bankswitching/3F/Miner 2049er (1982) (Tigervision).a26 differ diff --git a/test/roms/bankswitching/3F/Miner 2049er Volume II (1983) (Tigervision) (PAL).a26 b/test/roms/bankswitching/3F/Miner 2049er Volume II (1983) (Tigervision) (PAL).a26 new file mode 100644 index 000000000..758070c83 Binary files /dev/null and b/test/roms/bankswitching/3F/Miner 2049er Volume II (1983) (Tigervision) (PAL).a26 differ diff --git a/test/roms/bankswitching/3F/Polaris (1983) (Thomas Jentzsch).a26 b/test/roms/bankswitching/3F/Polaris (1983) (Thomas Jentzsch).a26 new file mode 100644 index 000000000..73c5bc521 Binary files /dev/null and b/test/roms/bankswitching/3F/Polaris (1983) (Thomas Jentzsch).a26 differ diff --git a/test/roms/bankswitching/3F/Polaris (1983) (Tigervision) (PAL).a26 b/test/roms/bankswitching/3F/Polaris (1983) (Tigervision) (PAL).a26 new file mode 100644 index 000000000..053d3ec52 Binary files /dev/null and b/test/roms/bankswitching/3F/Polaris (1983) (Tigervision) (PAL).a26 differ diff --git a/test/roms/bankswitching/3F/Polaris (1983) (Tigervision).a26 b/test/roms/bankswitching/3F/Polaris (1983) (Tigervision).a26 new file mode 100644 index 000000000..053d3ec52 Binary files /dev/null and b/test/roms/bankswitching/3F/Polaris (1983) (Tigervision).a26 differ diff --git a/test/roms/bankswitching/3F/River Patrol (1984) (Tigervision).a26 b/test/roms/bankswitching/3F/River Patrol (1984) (Tigervision).a26 new file mode 100644 index 000000000..aeec4821b Binary files /dev/null and b/test/roms/bankswitching/3F/River Patrol (1984) (Tigervision).a26 differ diff --git a/test/roms/bankswitching/3F/Springer (1982) (Tigervision).a26 b/test/roms/bankswitching/3F/Springer (1982) (Tigervision).a26 new file mode 100644 index 000000000..aabd6a45f Binary files /dev/null and b/test/roms/bankswitching/3F/Springer (1982) (Tigervision).a26 differ diff --git a/test/roms/bankswitching/3F/Untitled.a26 b/test/roms/bankswitching/3F/Untitled.a26 new file mode 100644 index 000000000..47ec041bc Binary files /dev/null and b/test/roms/bankswitching/3F/Untitled.a26 differ diff --git a/test/roms/bankswitching/4A50/Ruby Runner 4A50.bin b/test/roms/bankswitching/4A50/Ruby Runner 4A50.bin new file mode 100644 index 000000000..0c2b88297 Binary files /dev/null and b/test/roms/bankswitching/4A50/Ruby Runner 4A50.bin differ diff --git a/test/roms/bankswitching/4A50/rr3.bin b/test/roms/bankswitching/4A50/rr3.bin new file mode 100644 index 000000000..511cd62c2 --- /dev/null +++ b/test/roms/bankswitching/4A50/rr3.bin @@ -0,0 +1,7 @@ +êÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿ ÿâÒÂòÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂÒâòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL²·¹ê…*ê…L%°†ˆì©U…©ª……* ©U¹…©Œ…©*… ©€… …¹…¹…¹…ˆŽ…+©\……*©Ú ¹…¹…©€†"† †!†#…¹…¹…¹…L±¹!°L€±L°¹ê…*ê…L%±†ˆì©U…©ª……* ©U¹…©Œ…©*… ©€… …¹…¹…¹…ˆŽ…+©\……*©Ú ¹…¹…©€†"† †!†#…¹…¹…¹…L²¹!±L€²L±¹ê…*ê…L%²†ˆì©U…©ª……* ©U¹…©Œ…©*… ©€… …¹…¹…¹…ˆŽ…+©\……*©Ú ¹…¹…©€†"† †!†#…¹…¹…¹…L³¹!²L€³L²¹ê…*ê…L%³†ˆì©U…©ª……* ©U¹…©Œ…©*… ©€… …¹…¹…¹…ˆŽ…+©\……*©Ú ¹…¹…©€†"† †!†#…¹…¹…¹…L´¹!³L€´L³¹ê…*ê…L%´†ˆì©U…©ª……* ©U¹…©Œ…©*… ©€… …¹…¹…¹…ˆŽ…+©\……*©Ú ¹…¹…©€†"† †!†#…¹…¹…¹…Lµ¹!´L€µL´¹ê…*ê…L%µ†ˆì©U…©ª……* ©U¹…©Œ…©*… ©€… …¹…¹…¹…ˆŽ…+©\……*©Ú ¹…¹…©€†"† †!†#…¹…¹…¹…L¶¹!µL€¶Lµ¹ê…*ê…L%¶†ˆì©U…©ª……* ©U¹…©Œ…©*… ©€… …¹…¹…¹…ˆŽ…+©\……*©Ú ¹…¹…©€†"† †!†#…¹…¹…¹…L·¹!¶L€·L¶¹ê…*ê…L%·†ˆì©U…©ª……* ©U¹…©Œ…©*… ©€… …¹…¹…¹…ˆŽ…+©\……*©Ú ¹…¹…©€†"† †!†#…¹…¹…¹…L­·¹!·L”·……û L€°­°…­°…­!°…¢‚…L°L·†ˆø… oLï¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL±×…*¹¹L(Іˆê ©U…*…©ª…©ª…©U…©Œ…©*… ©€ …¹…¹…¹…ˆŽê†"† †!†#…*©\…©Ú ¹…¹…©…+…¹…¹…¹…Lѹ#й'ÐL‚ÑLÐ…*¹¹L(цˆê ©U…*…©ª…©ª…©U…©Œ…©*… ©€ …¹…¹…¹…ˆŽê†"† †!†#…*©\…©Ú ¹…¹…©…+…¹…¹…¹…LÒ¹#ѹ'ÑL‚ÒLÑ…*¹¹L(Ò†ˆê ©U…*…©ª…©ª…©U…©Œ…©*… ©€ …¹…¹…¹…ˆŽê†"† †!†#…*©\…©Ú ¹…¹…©…+…¹…¹…¹…LÓ¹#Ò¹'ÒL‚ÓLÒ…*¹¹L(Ó†ˆê ©U…*…©ª…©ª…©U…©Œ…©*… ©€ …¹…¹…¹…ˆŽê†"† †!†#…*©\…©Ú ¹…¹…©…+…¹…¹…¹…LÔ¹#Ó¹'ÓL‚ÔLÓ…*¹¹L(Ô†ˆê ©U…*…©ª…©ª…©U…©Œ…©*… ©€ …¹…¹…¹…ˆŽê†"† †!†#…*©\…©Ú ¹…¹…©…+…¹…¹…¹…LÕ¹#Ô¹'ÔL‚ÕLÔ…*¹¹L(Õ†ˆê ©U…*…©ª…©ª…©U…©Œ…©*… ©€ …¹…¹…¹…ˆŽê†"† †!†#…*©\…©Ú ¹…¹…©…+…¹…¹…¹…LÖ¹#Õ¹'ÕL‚ÖLÕ…*¹¹L(Ö†ˆê ©U…*…©ª…©ª…©U…©Œ…©*… ©€ …¹…¹…¹…ˆŽê†"† †!†#…*©\…©Ú ¹…¹…©…+…¹…¹…¹…L×¹#Ö¹'ÖL‚×LÖ…*¹¹L(׆ˆê ©U…*…©ª…©ª…©U…©Œ…©*… ©€ …¹…¹…¹…ˆŽê†"† †!†#…*©\…©Ú ¹…¹…©…+…¹…¹…¹…L¬×¹#×¹'×Lš×…û L‚ЭÐ…­Т‚…L ÐL׆ˆø… oLï¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ*EQ*ŠQTŠ¢T¢¨E¨*EQ*ŠQTŠ¢T¢¨E¨ÿ““×ÇÇ}EEƒïÇÇïÿÿǃ99}}mm}}99ƒÇÿÿïÇ«£ )AM££ÇïÿÿDDDÿÿHHHÿ"""ÿïÇ«£ )AM££ÇïÿÇ«£ )AM££ÇïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿßWGSƒ›+#GGßÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿ÷ãÕÑ„” ¦ŠˆÑÑã÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿǃ99}}mm}}99ƒÇÿƒ99}}mm}}99ƒÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿssûûÛÛûûssÿÿÿÿþþþþþþþþþþÿÿÿÿãÁœœ¾¾¶¶¾¾œœÁãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ''¯û‹‹ßßÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÉÉëãã¾¢¢€Á÷ãã÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ““×ÇÇ}EEƒïÇÇïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“×ÇÇ}EEƒïÇÇïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“ÿÿÇ»»}}mmmm««ÇÿÿÿÿÇ»»}}aa}}»»ÇÿÿÿÿÇ««mmmm}}»»ÇÿÿÿÿÇ»»}} }}»»ÇÿÿÿÿÇ»»}}mmmm««ÇÿÿÿÿÇ»»}}aa}}»»ÇÿÿÿÿÇ««mmmm}}»»ÇÿÿÿÿÇ»»}} }}»»ÇÿÿÿÿÇ»»}}mmmm««ÇÿÿÿÿÇ»»}}aa}}»»ÇÿÿÿÿÇ««mmmm}}»»ÇÿÿÿÿÇ»»}} }}»»ÇÿÿÿÿÿÿÇ»»}}mmmm««ÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÝݾ¾°°¾¾ÝÝãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ««mmmm}}»»Çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿwwûûûûwwÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ*EQ*ŠQTŠ¢T¢¨E¨*EQ*ŠQTŠ¢T¢¨E¨ÿ““×ÇÇ}EEƒïÇÇïÿÿǃ9}mmUUmm}9ƒÇÿÿïÇ«£ )AM££ÇïÿÿDDDÿÿHHHÿ"""ÿïÇ«£ )AM££Çïÿ)AM££ÇïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÇ«£ ÿ?_OOo¯?ÿÿÿþýýøùúúøøýýþÿÿÿýøõôáåèéââôôøýÿÿÿÿ???¿¿?ÿÿÿÿǃ9}mmUUmm}9ƒÇÿmUUmm}9ƒÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿǃ9}mÿ?Ïïoo¯¯ooïÏ?ÿÿþüùûûûúúûûûùüþÿÿøðçïííêêííïçðøÿÿÿ?¿¿¿¿¿¿¿¿?ÿÿÿŸŸ¿??ï//??ÿÿüüþþþûúúøüÿþþÿÿÿòòúøøïèèàðýøøýÿÿÿÿÿ¿¿¿?ÿÿÿÿÿÿÿÿÿÿÿÿ““×ÇÇ}EEƒïÇÇïÿÿÿÿÿÿÿÿÿÿÿ}EEƒïÇÇïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ““×ÇÇÿÿÇ»»}}mmmu³³ÇÿÿÿÿÇ»»yqem}}»»ÇÿÿÿÿÇ››]mmm}}»»ÇÿÿÿÿÇ»»}}mM=»»ÇÿÿÿÿÇ»»}}mmm]››ÇÿÿÿÿÇ»»}}meqy»»Çÿÿÿÿdz³ummm}}»»ÇÿÿÿÿÇ»»=Mm}}»»ÇÿÿÿÿÇ»»}}mmmm««ÇÿÿÿÿÇ»»}}aa}}»»ÇÿÿÿÿÇ««mmmm}}»»ÇÿÿÿÿÇ»»}} }}»»ÇÿÿÿÿÿÿÿÿÿÿÇ»»}}mmmm««Çÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷÷ïïììïï÷÷øÿÿÿÿÿ¿¿??¿¿ÿÿÿmmm}}»»ÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ««mÿÿ?ßßïïooïïßß?ÿÿÿÿþýýûûøøûûýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ*EQ*ŠQTŠ¢T¢¨E¨*EQ*ŠQTŠ¢T¢¨E¨ÿ““×ÇÇ}EEƒïÇÇïÿÿǃ)mUU99UUm)ƒÇÿÿïÇ«£ )AM££ÇïÿÿDDDÿÿHHHÿ"""ÿïÇ«£ )AM££Çïÿ££ÇïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÇ«£ )AMÿÿÿ???¿¿?ÿÿÿÿýøõôáåèéââôôøýÿÿÿþýýøùúúøøýýþÿÿÿ?_OOo¯?ÿÿǃ)mUU99UUm)ƒÇÿUm)ƒÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿǃ)mUU99Uÿÿ?¿¿¿??¿¿¿?ÿÿÿøðåíêêççêêíåðøÿÿþüùûúúùùúúûùüþÿÿ?Oo¯¯Ïϯ¯oO?ÿÿÿÿÿ¿¿¿?ÿÿÿÿÿÿòòúøøïèèàðýøøýÿÿüüþþþûúúøüÿþþÿÿÿŸŸ¿??ï//??ÿÿÿÿÿÿÿÿÿÿÿÿ““×ÇÇ}EEƒïÇÇïÿÿÿÿÿÿÿƒïÇÇïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ““×ÇÇ}EEÿÿÇ»»}}mmuu»»ÇÿÿÿÿÇ»»uumm}}»»ÇÿÿÿÿÇ»»]]mm}}»»ÇÿÿÿÿÇ»»}}mm]]»»ÇÿÿÿÿÇ»»}}mm]]»»ÇÿÿÿÿÇ»»}}mmuu»»ÇÿÿÿÿÇ»»uumm}}»»ÇÿÿÿÿÇ»»]]mm}}»»ÇÿÿÿÿÇ»»}}mmmm««ÇÿÿÿÿÇ»»}}aa}}»»ÇÿÿÿÿÇ««mmmm}}»»ÇÿÿÿÿÇ»»}} }}»»ÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ»»}}mmmm««Çÿÿÿÿÿÿÿÿÿÿþýýûûûûûûýýþÿÿÿÿ?ßßïïïïßß?ÿÿ}»»ÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ««mmmm}ÿÿÿ¿¿¿¿¿¿ÿÿÿÿÿø÷÷ïïááïï÷÷øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ*EQ*ŠQTŠ¢T¢¨E¨*EQ*ŠQTŠ¢T¢¨E¨ÿ““×ÇÇ}EEƒïÇÇïÿÿǃU99}}99UƒÇÿÿïÇ«£ )AM££ÇïÿÿDDDÿÿHHHÿ"""ÿïÇ«£ )AM££ÇïÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÇ«£ )AM££Çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ãÕÑ„” ¦ŠˆÑÑã÷ÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿßWGSƒ›+#GGßÿÿǃU99}}99UƒÇÿÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿǃU99}}99UƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÁˆªœœ¾¾œœªˆÁãÿÿÿÿþþþþþþþþþþÿÿÿÿ#«ssûûss«#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÉëãã¾¢¢€Á÷ãã÷ÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿ''¯û‹‹ßßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ““×ÇÇ}EEƒïÇÇïÿÿÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ““×ÇÇ}EEƒïÇÇÿÿÇ»»}}meqy»»Çÿÿÿÿdz³ummm}}»»ÇÿÿÿÿÇ»»=Mm}}»»ÇÿÿÿÿÇ»»}}mmm]››ÇÿÿÿÿÇ»»}}mM=»»ÇÿÿÿÿÇ»»}}mmmu³³ÇÿÿÿÿÇ»»yqem}}»»ÇÿÿÿÿÇ››]mmm}}»»ÇÿÿÿÿÇ»»}}mmmm««ÇÿÿÿÿÇ»»}}aa}}»»ÇÿÿÿÿÇ««mmmm}}»»ÇÿÿÿÿÇ»»}} }}»»ÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ»»}}mmmm««ÇÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿwwûûÃÃûûwwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ««mmmm}}»»ÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÝݾ¾††¾¾ÝÝãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxØ¢Š¨ÊšHÐû¢óš©…€©ø…©`…‚ An¢ l½ÊÐ÷ l½ÊÐ÷ l½ÊÐ÷ l½ÊÐ÷ l½ÊÐ÷ l½ÊÐ÷ l½ÊÐ÷ l½ÊÐ÷ En¢ 8l½ÊÐ÷ 9l½ÊÐ÷ :l½ÊÐ÷ ;l½ÊÐ÷ l½ÊÐ÷ ?l½ÊÐ÷ Dn¢ 0l½ÊÐ÷ 1l½ÊÐ÷ 2l½ÊÐ÷ 3l½ÊÐ÷ 4l½ÊÐ÷ 5l½ÊÐ÷ 6l½ÊÐ÷ 7l½ÊÐ÷ Fn¢ l½ÊÐ÷ !l½ÊÐ÷ "l½ÊÐ÷ #l½ÊÐ÷ $l½ÊÐ÷ %l½ÊÐ÷ &l½ÊÐ÷ 'l½ÊÐ÷©…Œ……Ž…©……©…©€…ˆLÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©•…øLÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ +  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ +  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡£¥§‘“‘“BRbr‘“¼½¾¿ÀÁRÃÄÅrÇÈÉÊËÌÍÎÏÐÑbÓÔÕB×ØÙÚÛÜÝÞßàárãäåRçèéêëìíîïðñBóôõb÷øùúûüýþÿ©–…ø©…˜©@…–©€…’©À…”©…“…•…— Fn ,„0 ÿ Fn³’½‘’ȳ’½‘’ȳ’½‘’ȳ’½‘’ÈÀ<É¥’i¿…’°Æ“8¥”i¿…”°Æ•8¥–i¿…–°ƗƘУ©…˜©@…’©€…”©…–©…“…•…— Fn  ÀlLþ¥’¥“ ÿ Àl FnLþLÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’L$þL$þL$þ)}ÉÐÖ±”Ð ±’ ¸‘”I‘’Lþ±”)ð4ˆ±’”Ðȱ’ ¸I‘’ˆI‘’ÈLþÈȱ’”Ј±’ ¼I‘’ÈI‘’ˆLþˆ±’)‘’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’L$þL$þL$þ±–Ð ©´‘–©°‘’Lþˆ±’ðȩ‘’LþÈ©Æ‘’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’L$þL$þL$þȱ’Ð ©µ‘’ˆ©±‘’Lþˆ±–ð©Ò‘’Lþ©Ö‘’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’L$þL$þL$þ±”Ð ©¶‘”©²‘’Lþȱ’ðˆ©â‘’Lþˆ©æ‘’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’L$þL$þL$þˆ±’Ð ©·‘’È©³‘’Lþȱ”ð©ò‘’Lþ©ö‘’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’L$þL$þL$þ¥’i@…’æ“¥”i@…”æ•¥–i@…–无ƘдL¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©š…ø¥ˆ0 ÿL)…ˆ¥Œ…Ž¥…©"…,€0 ¥ŒÉ?°挩¢…,€p +¥ŒðÆŒ© …© ,€Ð ¥É°橦…©,€Ð +¥ðÆ©¤…¦Œ¤ ÿ½É©"…¥Ž…Œ¥…L‡¥i¦Ž¤ ÿ¥­‚)Ðlüÿ ÿ¦Š¤‹ ÿ Bn ½™½™½™½™½™ ½™(½™0½™8½™@½ ™HŠËÀæÿˆº O¾½ò™½ò™½ò™ˆè ÿ¥Œ8é°©ÅŠ°ÆŠ¥Œ8é É5©5ÅŠ报8é°©Å‹°Æ‹¥8é É5©Å‹æ‹ Bn©(…ý© …ÿ¢ sæýæÿÊö ÿ âLÿÿ½JJJJJJ ½(JJ03½JJHJJ@JJ8ý½JJJJJJ ½(JJ03½JJHJJ@JJ8` Bn©(…ý© …ÿ¢½Yýƒ) „ÿZ½ýa) bÿ‚½^ý ‰)  Šÿ_½&ýf) gÿ'½ oý:) ;ÿp½(9ýq) rÿ:½0tý?) @ÿu½8>ýv) wÿ?½@yýD) Eÿz½HCý{) |ÿDæýæÿÊ0Lï`ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ0 €p`P@’¢²Â‘¡±ÁÑáÀÐAQàaqÒ#Câ3S °!1R"b2rB‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ……†ƒ„„©……©}Í„÷©…F†°懩……JÐù©Ã–憩…¦ƒ¤„¥…L€ An…©……©… +©6…………¥‰) û¥ˆ©JJJJJ…‰©$‡ÐL¬¸…© …$©0… …#©…"©P…!…………………*……©*… ©Œ…  DnL‰·…©6…………©0…!…#©P… ……………"©À…$êêêêê………*……©*… ©Œ…  EnL‘×…©…©……………………©Ã–…©,‚Ð ©…‡,‚P懩,‚0©P +eˆ…ˆ©… …©ÿ……¦ƒ¤„¥…L€©…‘˜Jf‘Jf‘i0…ÿŠe‘ªL€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ oLx…ø oL¸ oL oL oL oLF¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/test/roms/bankswitching/4A50/rr4.bin b/test/roms/bankswitching/4A50/rr4.bin new file mode 100644 index 000000000..ebbb4bf9d --- /dev/null +++ b/test/roms/bankswitching/4A50/rr4.bin @@ -0,0 +1,5 @@ +êÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿ ÿâÒÂòÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÂÒâòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL²·¹ê…*ê…L%°†ˆì©U…©ª……* ©U¹…©Œ…©*… ©€… …¹…¹…¹…ˆŽ…+©\……*©Ú ¹…¹…©€†"† †!†#…¹…¹…¹…L±¹!°L€±L°¹ê…*ê…L%±†ˆì©U…©ª……* ©U¹…©Œ…©*… ©€… …¹…¹…¹…ˆŽ…+©\……*©Ú ¹…¹…©€†"† †!†#…¹…¹…¹…L²¹!±L€²L±¹ê…*ê…L%²†ˆì©U…©ª……* ©U¹…©Œ…©*… ©€… …¹…¹…¹…ˆŽ…+©\……*©Ú ¹…¹…©€†"† †!†#…¹…¹…¹…L³¹!²L€³L²¹ê…*ê…L%³†ˆì©U…©ª……* ©U¹…©Œ…©*… ©€… …¹…¹…¹…ˆŽ…+©\……*©Ú ¹…¹…©€†"† †!†#…¹…¹…¹…L´¹!³L€´L³¹ê…*ê…L%´†ˆì©U…©ª……* ©U¹…©Œ…©*… ©€… …¹…¹…¹…ˆŽ…+©\……*©Ú ¹…¹…©€†"† †!†#…¹…¹…¹…Lµ¹!´L€µL´¹ê…*ê…L%µ†ˆì©U…©ª……* ©U¹…©Œ…©*… ©€… …¹…¹…¹…ˆŽ…+©\……*©Ú ¹…¹…©€†"† †!†#…¹…¹…¹…L¶¹!µL€¶Lµ¹ê…*ê…L%¶†ˆì©U…©ª……* ©U¹…©Œ…©*… ©€… …¹…¹…¹…ˆŽ…+©\……*©Ú ¹…¹…©€†"† †!†#…¹…¹…¹…L·¹!¶L€·L¶¹ê…*ê…L%·†ˆì©U…©ª……* ©U¹…©Œ…©*… ©€… …¹…¹…¹…ˆŽ…+©\……*©Ú ¹…¹…©€†"† †!†#…¹…¹…¹…L­·¹!·L”·……û L€°­°…­°…­!°…¢‚…L°L·†ˆø… oLï¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL±×…*¹¹L(Іˆê ©U…*…©ª…©ª…©U…©Œ…©*… ©€ …¹…¹…¹…ˆŽê†"† †!†#…*©\…©Ú ¹…¹…©…+…¹…¹…¹…Lѹ#й'ÐL‚ÑLÐ…*¹¹L(цˆê ©U…*…©ª…©ª…©U…©Œ…©*… ©€ …¹…¹…¹…ˆŽê†"† †!†#…*©\…©Ú ¹…¹…©…+…¹…¹…¹…LÒ¹#ѹ'ÑL‚ÒLÑ…*¹¹L(Ò†ˆê ©U…*…©ª…©ª…©U…©Œ…©*… ©€ …¹…¹…¹…ˆŽê†"† †!†#…*©\…©Ú ¹…¹…©…+…¹…¹…¹…LÓ¹#Ò¹'ÒL‚ÓLÒ…*¹¹L(Ó†ˆê ©U…*…©ª…©ª…©U…©Œ…©*… ©€ …¹…¹…¹…ˆŽê†"† †!†#…*©\…©Ú ¹…¹…©…+…¹…¹…¹…LÔ¹#Ó¹'ÓL‚ÔLÓ…*¹¹L(Ô†ˆê ©U…*…©ª…©ª…©U…©Œ…©*… ©€ …¹…¹…¹…ˆŽê†"† †!†#…*©\…©Ú ¹…¹…©…+…¹…¹…¹…LÕ¹#Ô¹'ÔL‚ÕLÔ…*¹¹L(Õ†ˆê ©U…*…©ª…©ª…©U…©Œ…©*… ©€ …¹…¹…¹…ˆŽê†"† †!†#…*©\…©Ú ¹…¹…©…+…¹…¹…¹…LÖ¹#Õ¹'ÕL‚ÖLÕ…*¹¹L(Ö†ˆê ©U…*…©ª…©ª…©U…©Œ…©*… ©€ …¹…¹…¹…ˆŽê†"† †!†#…*©\…©Ú ¹…¹…©…+…¹…¹…¹…L×¹#Ö¹'ÖL‚×LÖ…*¹¹L(׆ˆê ©U…*…©ª…©ª…©U…©Œ…©*… ©€ …¹…¹…¹…ˆŽê†"† †!†#…*©\…©Ú ¹…¹…©…+…¹…¹…¹…L¬×¹#×¹'×Lš×…û L‚ЭÐ…­Т‚…L ÐL׆ˆø… oLï¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ*EQ*ŠQTŠ¢T¢¨E¨*EQ*ŠQTŠ¢T¢¨E¨ÿ““×ÇÇ}EEƒïÇÇïÿÿǃ99}}mm}}99ƒÇÿÿïÇ«£ )AM££ÇïÿÿDDDÿÿHHHÿ"""ÿïÇ«£ )AM££ÇïÿÇ«£ )AM££ÇïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿßWGSƒ›+#GGßÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿ÷ãÕÑ„” ¦ŠˆÑÑã÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿǃ99}}mm}}99ƒÇÿƒ99}}mm}}99ƒÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿssûûÛÛûûssÿÿÿÿþþþþþþþþþþÿÿÿÿãÁœœ¾¾¶¶¾¾œœÁãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ''¯û‹‹ßßÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÉÉëãã¾¢¢€Á÷ãã÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ““×ÇÇ}EEƒïÇÇïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“×ÇÇ}EEƒïÇÇïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“ÿÿÇ»»}}mmmm««ÇÿÿÿÿÇ»»}}aa}}»»ÇÿÿÿÿÇ««mmmm}}»»ÇÿÿÿÿÇ»»}} }}»»ÇÿÿÿÿÇ»»}}mmmm««ÇÿÿÿÿÇ»»}}aa}}»»ÇÿÿÿÿÇ««mmmm}}»»ÇÿÿÿÿÇ»»}} }}»»ÇÿÿÿÿÇ»»}}mmmm««ÇÿÿÿÿÇ»»}}aa}}»»ÇÿÿÿÿÇ««mmmm}}»»ÇÿÿÿÿÇ»»}} }}»»ÇÿÿÿÿÿÿÇ»»}}mmmm««ÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÝݾ¾°°¾¾ÝÝãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ««mmmm}}»»Çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿwwûûûûwwÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ*EQ*ŠQTŠ¢T¢¨E¨*EQ*ŠQTŠ¢T¢¨E¨ÿ““×ÇÇ}EEƒïÇÇïÿÿǃ9}mmUUmm}9ƒÇÿÿïÇ«£ )AM££ÇïÿÿDDDÿÿHHHÿ"""ÿïÇ«£ )AM££Çïÿ)AM££ÇïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÇ«£ ÿ?_OOo¯?ÿÿÿþýýøùúúøøýýþÿÿÿýøõôáåèéââôôøýÿÿÿÿ???¿¿?ÿÿÿÿǃ9}mmUUmm}9ƒÇÿmUUmm}9ƒÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿǃ9}mÿ?Ïïoo¯¯ooïÏ?ÿÿþüùûûûúúûûûùüþÿÿøðçïííêêííïçðøÿÿÿ?¿¿¿¿¿¿¿¿?ÿÿÿŸŸ¿??ï//??ÿÿüüþþþûúúøüÿþþÿÿÿòòúøøïèèàðýøøýÿÿÿÿÿ¿¿¿?ÿÿÿÿÿÿÿÿÿÿÿÿ““×ÇÇ}EEƒïÇÇïÿÿÿÿÿÿÿÿÿÿÿ}EEƒïÇÇïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ““×ÇÇÿÿÇ»»}}mmmu³³ÇÿÿÿÿÇ»»yqem}}»»ÇÿÿÿÿÇ››]mmm}}»»ÇÿÿÿÿÇ»»}}mM=»»ÇÿÿÿÿÇ»»}}mmm]››ÇÿÿÿÿÇ»»}}meqy»»Çÿÿÿÿdz³ummm}}»»ÇÿÿÿÿÇ»»=Mm}}»»ÇÿÿÿÿÇ»»}}mmmm««ÇÿÿÿÿÇ»»}}aa}}»»ÇÿÿÿÿÇ««mmmm}}»»ÇÿÿÿÿÇ»»}} }}»»ÇÿÿÿÿÿÿÿÿÿÿÇ»»}}mmmm««Çÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷÷ïïììïï÷÷øÿÿÿÿÿ¿¿??¿¿ÿÿÿmmm}}»»ÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ««mÿÿ?ßßïïooïïßß?ÿÿÿÿþýýûûøøûûýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ*EQ*ŠQTŠ¢T¢¨E¨*EQ*ŠQTŠ¢T¢¨E¨ÿ““×ÇÇ}EEƒïÇÇïÿÿǃ)mUU99UUm)ƒÇÿÿïÇ«£ )AM££ÇïÿÿDDDÿÿHHHÿ"""ÿïÇ«£ )AM££Çïÿ££ÇïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÇ«£ )AMÿÿÿ???¿¿?ÿÿÿÿýøõôáåèéââôôøýÿÿÿþýýøùúúøøýýþÿÿÿ?_OOo¯?ÿÿǃ)mUU99UUm)ƒÇÿUm)ƒÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿǃ)mUU99Uÿÿ?¿¿¿??¿¿¿?ÿÿÿøðåíêêççêêíåðøÿÿþüùûúúùùúúûùüþÿÿ?Oo¯¯Ïϯ¯oO?ÿÿÿÿÿ¿¿¿?ÿÿÿÿÿÿòòúøøïèèàðýøøýÿÿüüþþþûúúøüÿþþÿÿÿŸŸ¿??ï//??ÿÿÿÿÿÿÿÿÿÿÿÿ““×ÇÇ}EEƒïÇÇïÿÿÿÿÿÿÿƒïÇÇïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ““×ÇÇ}EEÿÿÇ»»}}mmuu»»ÇÿÿÿÿÇ»»uumm}}»»ÇÿÿÿÿÇ»»]]mm}}»»ÇÿÿÿÿÇ»»}}mm]]»»ÇÿÿÿÿÇ»»}}mm]]»»ÇÿÿÿÿÇ»»}}mmuu»»ÇÿÿÿÿÇ»»uumm}}»»ÇÿÿÿÿÇ»»]]mm}}»»ÇÿÿÿÿÇ»»}}mmmm««ÇÿÿÿÿÇ»»}}aa}}»»ÇÿÿÿÿÇ««mmmm}}»»ÇÿÿÿÿÇ»»}} }}»»ÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ»»}}mmmm««Çÿÿÿÿÿÿÿÿÿÿþýýûûûûûûýýþÿÿÿÿ?ßßïïïïßß?ÿÿ}»»ÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ««mmmm}ÿÿÿ¿¿¿¿¿¿ÿÿÿÿÿø÷÷ïïááïï÷÷øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ*EQ*ŠQTŠ¢T¢¨E¨*EQ*ŠQTŠ¢T¢¨E¨ÿ““×ÇÇ}EEƒïÇÇïÿÿǃU99}}99UƒÇÿÿïÇ«£ )AM££ÇïÿÿDDDÿÿHHHÿ"""ÿïÇ«£ )AM££ÇïÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÇ«£ )AM££Çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ãÕÑ„” ¦ŠˆÑÑã÷ÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿßWGSƒ›+#GGßÿÿǃU99}}99UƒÇÿÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿǃU99}}99UƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÁˆªœœ¾¾œœªˆÁãÿÿÿÿþþþþþþþþþþÿÿÿÿ#«ssûûss«#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÉëãã¾¢¢€Á÷ãã÷ÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿ''¯û‹‹ßßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ““×ÇÇ}EEƒïÇÇïÿÿÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ““×ÇÇ}EEƒïÇÇÿÿÇ»»}}meqy»»Çÿÿÿÿdz³ummm}}»»ÇÿÿÿÿÇ»»=Mm}}»»ÇÿÿÿÿÇ»»}}mmm]››ÇÿÿÿÿÇ»»}}mM=»»ÇÿÿÿÿÇ»»}}mmmu³³ÇÿÿÿÿÇ»»yqem}}»»ÇÿÿÿÿÇ››]mmm}}»»ÇÿÿÿÿÇ»»}}mmmm««ÇÿÿÿÿÇ»»}}aa}}»»ÇÿÿÿÿÇ««mmmm}}»»ÇÿÿÿÿÇ»»}} }}»»ÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ»»}}mmmm««ÇÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿwwûûÃÃûûwwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ««mmmm}}»»ÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÝݾ¾††¾¾ÝÝãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxØ¢Š¨ÊšHÐû¢óš©…€©ø…©`…‚ An¢ l½ÊÐ÷ l½ÊÐ÷ l½ÊÐ÷ l½ÊÐ÷ l½ÊÐ÷ l½ÊÐ÷ l½ÊÐ÷ l½ÊÐ÷ En¢ 8l½ÊÐ÷ 9l½ÊÐ÷ :l½ÊÐ÷ ;l½ÊÐ÷ l½ÊÐ÷ ?l½ÊÐ÷ Dn¢ 0l½ÊÐ÷ 1l½ÊÐ÷ 2l½ÊÐ÷ 3l½ÊÐ÷ 4l½ÊÐ÷ 5l½ÊÐ÷ 6l½ÊÐ÷ 7l½ÊÐ÷ Fn¢ l½ÊÐ÷ !l½ÊÐ÷ "l½ÊÐ÷ #l½ÊÐ÷ $l½ÊÐ÷ %l½ÊÐ÷ &l½ÊÐ÷ 'l½ÊÐ÷©…Œ……Ž…©……©…©€…ˆLÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©•…øLÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ +  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ""""‘“‘“BRbr‘“¼½¾¿ÀÁRÃÄÅrÇÈÉÊËÌÍÎÏÐÑbÓÔÕB×ØÙÚÛÜÝÞßàárãäåRçèéêëìíîïðñBóôõb÷øùúûüýþÿ©–…ø©…˜©@…–©€…’©À…”©…“…•…— Fn ,„0 ÿ Fn³’½‘’ȳ’½‘’ȳ’½‘’ȳ’½‘’ÈÀ<É¥’i¿…’°Æ“8¥”i¿…”°Æ•8¥–i¿…–°ƗƘУ©…˜©€…’©À…”©@…–©…“…•…— Fn  ÀlLþ¥’¥“ ÿ Àl FnLþLÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’L$þL$þL$þ)}ÉÐÖ±”Ð ±’ ¸‘”I‘’Lþ³”½)ð4ˆ±’”Ðȱ’ ¸I‘’ˆI‘’ÈLþÈȱ’”Ј±’ ¼I‘’ÈI‘’ˆLþˆ±’)‘’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’L$þL$þL$þ±–Ð ©´‘–©°‘’Lþˆ±’ðȩ‘’LþÈ©Æ‘’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’L$þL$þL$þȱ’Ð ©µ‘’ˆ©±‘’Lþˆ±–ð©Ò‘’Lþ©Ö‘’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’L$þL$þL$þ±”Ð ©¶‘”©²‘’Lþȱ’ðˆ©â‘’Lþˆ©æ‘’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’L$þL$þL$þˆ±’Ð ©·‘’È©³‘’Lþȱ”ð©ò‘’Lþ©ö‘’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’ȳ’ȳ’ȳ’Lþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥’¥“,„0LŸȳ’L$þL$þL$þ8¥’i¿…’°Æ“8¥”i¿…”°Æ•8¥–i¿…–°Æ— Æ˜ÐµL¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©š…ø¥ˆ0 ÿL)…ˆ¥Œ…Ž¥…©"…,€0.¥ŒÉ?°(挩¢…¦Œ¤ &ÿ½)ÉÐh½Ðc©­©¬L¸,€p-¥Œð)ÆŒ© …¦Œ¤ &ÿ½)ÉÐ7ʽÐ1©©©¨L¸© ,€Ð ¥É°橦…©,€Ð +¥ðÆ©¤…¦Œ¤ &ÿ¼¹)Щ"…¥Ž…Œ¥…LÏ¥i¦Ž¤ &ÿ¥­‚)ÐlüÿL ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©›…ø ÿ¦Š¤‹ &ÿ Bn ½™½™½™½™½™ ½™(½™0½™8½™@½ ™HŠËÀæÿˆº O¾½Y™½Y™½Y™ˆè ÿ¥Œ8é°©ÅŠ°ÆŠ¥Œ8é É5©5ÅŠ报8é°©Å‹°Æ‹¥8é É5©Å‹æ‹ Bn©(…ý© …ÿ¢ ÚæýæÿÊö ÿ ILÿÿ½JJJJJJ ½(JJ03½JJHJJ@JJ8ý½JJJJJJ ½(JJ03½JJHJJ@JJ8` Bn©(…ý© …ÿ¢½Yýƒ) „ÿZ½ýa) bÿ‚½^ý ‰)  Šÿ_½&ýf) gÿ'½ oý:) ;ÿp½(9ýq) rÿ:½0tý?) @ÿu½8>ýv) wÿ?½@yýD) Eÿz½HCý{) |ÿDæýæÿÊ0LV`ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ0 €p`P@’¢²Â‘¡±ÁÑáÀÐAQàaqÒ#Câ3S °!1R"b2rB‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ……†ƒ„„©……©}Í„÷©…F†°懩……JÐù©Ã–憩…¦ƒ¤„¥…L€ An…©……©… +©6…………¥‰) û¥ˆ©JJJJJ…‰©$‡ÐL¬¸…© …$©0… …#©…"©P…!…………………*……©*… ©Œ…  DnL‰·…©6…………©0…!…#©P… ……………"©À…$êêêêê………*……©*… ©Œ…  EnL‘×…©…©……………………©Ã–…©,‚Ð ©…‡,‚P懩,‚0©P +eˆ…ˆ©… …©ÿ……¦ƒ¤„¥…L€©…‘˜Jf‘Jf‘i0…ÿŠe‘ªL€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ oLx…ø oL¸ oL oL oL oL oLF¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/test/roms/bankswitching/4A50/spin4a50.bin b/test/roms/bankswitching/4A50/spin4a50.bin new file mode 100644 index 000000000..2abd7550f Binary files /dev/null and b/test/roms/bankswitching/4A50/spin4a50.bin differ diff --git a/test/roms/bankswitching/4A50/test4a50fix.bin b/test/roms/bankswitching/4A50/test4a50fix.bin new file mode 100644 index 000000000..1592006db Binary files /dev/null and b/test/roms/bankswitching/4A50/test4a50fix.bin differ diff --git a/test/roms/bankswitching/4A50/test_includes_file.bas.bin b/test/roms/bankswitching/4A50/test_includes_file.bas.bin new file mode 100644 index 000000000..5c530eec6 Binary files /dev/null and b/test/roms/bankswitching/4A50/test_includes_file.bas.bin differ diff --git a/test/roms/bankswitching/4KSC/4KSC_test.bin b/test/roms/bankswitching/4KSC/4KSC_test.bin new file mode 100644 index 000000000..3e2949441 Binary files /dev/null and b/test/roms/bankswitching/4KSC/4KSC_test.bin differ diff --git a/test/roms/bankswitching/BF/BF_256k_test.bin b/test/roms/bankswitching/BF/BF_256k_test.bin new file mode 100644 index 000000000..314f8c268 Binary files /dev/null and b/test/roms/bankswitching/BF/BF_256k_test.bin differ diff --git a/test/roms/bankswitching/BFSC/BFSC_256k_ramtest.bin b/test/roms/bankswitching/BFSC/BFSC_256k_ramtest.bin new file mode 100644 index 000000000..3b0636ac0 Binary files /dev/null and b/test/roms/bankswitching/BFSC/BFSC_256k_ramtest.bin differ diff --git a/test/roms/bankswitching/BFSC/penult-demo-9-NTSC.bin b/test/roms/bankswitching/BFSC/penult-demo-9-NTSC.bin new file mode 100644 index 000000000..164bb0838 Binary files /dev/null and b/test/roms/bankswitching/BFSC/penult-demo-9-NTSC.bin differ diff --git a/test/roms/bankswitching/BUS/128bus_20170120.bin b/test/roms/bankswitching/BUS/128bus_20170120.bin new file mode 100644 index 000000000..dee840a35 Binary files /dev/null and b/test/roms/bankswitching/BUS/128bus_20170120.bin differ diff --git a/test/roms/bankswitching/BUS/128chronocolour_20170101.bin b/test/roms/bankswitching/BUS/128chronocolour_20170101.bin new file mode 100644 index 000000000..c930ad492 Binary files /dev/null and b/test/roms/bankswitching/BUS/128chronocolour_20170101.bin differ diff --git a/test/roms/bankswitching/BUS/draconian_20161102.bin b/test/roms/bankswitching/BUS/draconian_20161102.bin new file mode 100644 index 000000000..b21509761 Binary files /dev/null and b/test/roms/bankswitching/BUS/draconian_20161102.bin differ diff --git a/test/roms/bankswitching/BUS/parrot_20161231_NTSC.bin b/test/roms/bankswitching/BUS/parrot_20161231_NTSC.bin new file mode 100644 index 000000000..10f54bd1a Binary files /dev/null and b/test/roms/bankswitching/BUS/parrot_20161231_NTSC.bin differ diff --git a/test/roms/bankswitching/BUS/rpg_20161019.bin b/test/roms/bankswitching/BUS/rpg_20161019.bin new file mode 100644 index 000000000..de2076c7a Binary files /dev/null and b/test/roms/bankswitching/BUS/rpg_20161019.bin differ diff --git a/test/roms/bankswitching/BUS/rpg_20161231_NTSC.bin b/test/roms/bankswitching/BUS/rpg_20161231_NTSC.bin new file mode 100644 index 000000000..187f4edef Binary files /dev/null and b/test/roms/bankswitching/BUS/rpg_20161231_NTSC.bin differ diff --git a/test/roms/bankswitching/BUS/test0_stuff.bin b/test/roms/bankswitching/BUS/test0_stuff.bin new file mode 100644 index 000000000..6765ba78d Binary files /dev/null and b/test/roms/bankswitching/BUS/test0_stuff.bin differ diff --git a/test/roms/bankswitching/BUS/test1_music.bin b/test/roms/bankswitching/BUS/test1_music.bin new file mode 100644 index 000000000..1b0ff8ff4 Binary files /dev/null and b/test/roms/bankswitching/BUS/test1_music.bin differ diff --git a/test/roms/bankswitching/BUS/test2_speech.bin b/test/roms/bankswitching/BUS/test2_speech.bin new file mode 100644 index 000000000..42d1266b8 Binary files /dev/null and b/test/roms/bankswitching/BUS/test2_speech.bin differ diff --git a/test/roms/bankswitching/BUS/test3_bigscroll.bin b/test/roms/bankswitching/BUS/test3_bigscroll.bin new file mode 100644 index 000000000..c40b7c9e5 Binary files /dev/null and b/test/roms/bankswitching/BUS/test3_bigscroll.bin differ diff --git a/test/roms/bankswitching/BUS/test4_xevious.bin b/test/roms/bankswitching/BUS/test4_xevious.bin new file mode 100644 index 000000000..464e38747 Binary files /dev/null and b/test/roms/bankswitching/BUS/test4_xevious.bin differ diff --git a/test/roms/bankswitching/BUS/test_20161231.bin b/test/roms/bankswitching/BUS/test_20161231.bin new file mode 100644 index 000000000..718695adf Binary files /dev/null and b/test/roms/bankswitching/BUS/test_20161231.bin differ diff --git a/test/roms/bankswitching/CDF/cdf0_fast.bin b/test/roms/bankswitching/CDF/cdf0_fast.bin new file mode 100644 index 000000000..2c14cbba1 Binary files /dev/null and b/test/roms/bankswitching/CDF/cdf0_fast.bin differ diff --git a/test/roms/bankswitching/CDF/cdf1_music.bin b/test/roms/bankswitching/CDF/cdf1_music.bin new file mode 100644 index 000000000..7ebbd03a4 Binary files /dev/null and b/test/roms/bankswitching/CDF/cdf1_music.bin differ diff --git a/test/roms/bankswitching/CDF/cdf2_speech.bin b/test/roms/bankswitching/CDF/cdf2_speech.bin new file mode 100644 index 000000000..e18dd3f0b Binary files /dev/null and b/test/roms/bankswitching/CDF/cdf2_speech.bin differ diff --git a/test/roms/bankswitching/CDF/cdf3_fastjump.bin b/test/roms/bankswitching/CDF/cdf3_fastjump.bin new file mode 100644 index 000000000..9c37d5862 Binary files /dev/null and b/test/roms/bankswitching/CDF/cdf3_fastjump.bin differ diff --git a/test/roms/bankswitching/CDF/draconian_20170309.bin b/test/roms/bankswitching/CDF/draconian_20170309.bin new file mode 100644 index 000000000..11bc211d3 Binary files /dev/null and b/test/roms/bankswitching/CDF/draconian_20170309.bin differ diff --git a/test/roms/bankswitching/CDF/draconian_20170314.bin b/test/roms/bankswitching/CDF/draconian_20170314.bin new file mode 100644 index 000000000..ffda5825a Binary files /dev/null and b/test/roms/bankswitching/CDF/draconian_20170314.bin differ diff --git a/test/roms/bankswitching/CDF/draconian_20170318.bin b/test/roms/bankswitching/CDF/draconian_20170318.bin new file mode 100644 index 000000000..21b667dbf Binary files /dev/null and b/test/roms/bankswitching/CDF/draconian_20170318.bin differ diff --git a/test/roms/bankswitching/CTY/chetiry_NTSC_STELLA.bin b/test/roms/bankswitching/CTY/chetiry_NTSC_STELLA.bin new file mode 100644 index 000000000..9760390cf Binary files /dev/null and b/test/roms/bankswitching/CTY/chetiry_NTSC_STELLA.bin differ diff --git a/test/roms/bankswitching/CV/Magicard (CommaVid).a26 b/test/roms/bankswitching/CV/Magicard (CommaVid).a26 new file mode 100644 index 000000000..d4c7f5b21 Binary files /dev/null and b/test/roms/bankswitching/CV/Magicard (CommaVid).a26 differ diff --git a/test/roms/bankswitching/CV/Video Life (CommaVid) [h1].a26 b/test/roms/bankswitching/CV/Video Life (CommaVid) [h1].a26 new file mode 100644 index 000000000..a38a8e7b1 Binary files /dev/null and b/test/roms/bankswitching/CV/Video Life (CommaVid) [h1].a26 differ diff --git a/test/roms/bankswitching/CV/Video Life (CommaVid).a26 b/test/roms/bankswitching/CV/Video Life (CommaVid).a26 new file mode 100644 index 000000000..4e880920f Binary files /dev/null and b/test/roms/bankswitching/CV/Video Life (CommaVid).a26 differ diff --git a/test/roms/bankswitching/DF/DF_128k_test.bin b/test/roms/bankswitching/DF/DF_128k_test.bin new file mode 100644 index 000000000..8678c2029 Binary files /dev/null and b/test/roms/bankswitching/DF/DF_128k_test.bin differ diff --git a/test/roms/bankswitching/DFSC/DFSC_128k_ramtest.bin b/test/roms/bankswitching/DFSC/DFSC_128k_ramtest.bin new file mode 100644 index 000000000..d94f6536b Binary files /dev/null and b/test/roms/bankswitching/DFSC/DFSC_128k_ramtest.bin differ diff --git a/test/roms/bankswitching/E0/Frogger II (1984) (Parker Bros) (PAL).a26 b/test/roms/bankswitching/E0/Frogger II (1984) (Parker Bros) (PAL).a26 new file mode 100644 index 000000000..0b88a15f1 Binary files /dev/null and b/test/roms/bankswitching/E0/Frogger II (1984) (Parker Bros) (PAL).a26 differ diff --git a/test/roms/bankswitching/E0/Frogger II (1984) (Parker Bros).a26 b/test/roms/bankswitching/E0/Frogger II (1984) (Parker Bros).a26 new file mode 100644 index 000000000..9789bbe69 Binary files /dev/null and b/test/roms/bankswitching/E0/Frogger II (1984) (Parker Bros).a26 differ diff --git a/test/roms/bankswitching/E0/Gyruss (1984) (Parker Bros).a26 b/test/roms/bankswitching/E0/Gyruss (1984) (Parker Bros).a26 new file mode 100644 index 000000000..653a6c7e5 Binary files /dev/null and b/test/roms/bankswitching/E0/Gyruss (1984) (Parker Bros).a26 differ diff --git a/test/roms/bankswitching/E0/James Bond 007 (1983) (Parker Bros) [b1].a26 b/test/roms/bankswitching/E0/James Bond 007 (1983) (Parker Bros) [b1].a26 new file mode 100644 index 000000000..e6a845bb7 Binary files /dev/null and b/test/roms/bankswitching/E0/James Bond 007 (1983) (Parker Bros) [b1].a26 differ diff --git a/test/roms/bankswitching/E0/James Bond 007 (1983) (Parker Bros).a26 b/test/roms/bankswitching/E0/James Bond 007 (1983) (Parker Bros).a26 new file mode 100644 index 000000000..a9aa5fc39 Binary files /dev/null and b/test/roms/bankswitching/E0/James Bond 007 (1983) (Parker Bros).a26 differ diff --git a/test/roms/bankswitching/E0/Lord of the Rings (1983) (Parker Bros) (Prototype).a26 b/test/roms/bankswitching/E0/Lord of the Rings (1983) (Parker Bros) (Prototype).a26 new file mode 100644 index 000000000..5b0b9e4f8 Binary files /dev/null and b/test/roms/bankswitching/E0/Lord of the Rings (1983) (Parker Bros) (Prototype).a26 differ diff --git a/test/roms/bankswitching/E0/Montezuma's Revenge (1984) (Parker Bros).a26 b/test/roms/bankswitching/E0/Montezuma's Revenge (1984) (Parker Bros).a26 new file mode 100644 index 000000000..858309a4e Binary files /dev/null and b/test/roms/bankswitching/E0/Montezuma's Revenge (1984) (Parker Bros).a26 differ diff --git a/test/roms/bankswitching/E0/Montezuma's Revenge (Thomas Jentzsch) (PAL60).a26 b/test/roms/bankswitching/E0/Montezuma's Revenge (Thomas Jentzsch) (PAL60).a26 new file mode 100644 index 000000000..bc2b7397c Binary files /dev/null and b/test/roms/bankswitching/E0/Montezuma's Revenge (Thomas Jentzsch) (PAL60).a26 differ diff --git a/test/roms/bankswitching/E0/Mr. Do!'s Castle (1984) (Parker Bros).a26 b/test/roms/bankswitching/E0/Mr. Do!'s Castle (1984) (Parker Bros).a26 new file mode 100644 index 000000000..d6e316ca6 Binary files /dev/null and b/test/roms/bankswitching/E0/Mr. Do!'s Castle (1984) (Parker Bros).a26 differ diff --git a/test/roms/bankswitching/E0/Popeye (1983) (Parker Bros) (PAL).a26 b/test/roms/bankswitching/E0/Popeye (1983) (Parker Bros) (PAL).a26 new file mode 100644 index 000000000..3b44e7e41 Binary files /dev/null and b/test/roms/bankswitching/E0/Popeye (1983) (Parker Bros) (PAL).a26 differ diff --git a/test/roms/bankswitching/E0/Popeye (1983) (Parker Bros).a26 b/test/roms/bankswitching/E0/Popeye (1983) (Parker Bros).a26 new file mode 100644 index 000000000..cedefbdce Binary files /dev/null and b/test/roms/bankswitching/E0/Popeye (1983) (Parker Bros).a26 differ diff --git a/test/roms/bankswitching/E0/Q-bert's Qubes (1983) (Parker Bros).a26 b/test/roms/bankswitching/E0/Q-bert's Qubes (1983) (Parker Bros).a26 new file mode 100644 index 000000000..de43788f1 Binary files /dev/null and b/test/roms/bankswitching/E0/Q-bert's Qubes (1983) (Parker Bros).a26 differ diff --git a/test/roms/bankswitching/E0/Q-bert's Qubes (1984) (Parker Bros).a26 b/test/roms/bankswitching/E0/Q-bert's Qubes (1984) (Parker Bros).a26 new file mode 100644 index 000000000..6d991eb05 Binary files /dev/null and b/test/roms/bankswitching/E0/Q-bert's Qubes (1984) (Parker Bros).a26 differ diff --git a/test/roms/bankswitching/E0/Star Wars - Death Star Battle (1983) (Parker Bros) (PAL).a26 b/test/roms/bankswitching/E0/Star Wars - Death Star Battle (1983) (Parker Bros) (PAL).a26 new file mode 100644 index 000000000..9a0369738 Binary files /dev/null and b/test/roms/bankswitching/E0/Star Wars - Death Star Battle (1983) (Parker Bros) (PAL).a26 differ diff --git a/test/roms/bankswitching/E0/Star Wars - Death Star Battle (1983) (Parker Bros).a26 b/test/roms/bankswitching/E0/Star Wars - Death Star Battle (1983) (Parker Bros).a26 new file mode 100644 index 000000000..d651e3b0a Binary files /dev/null and b/test/roms/bankswitching/E0/Star Wars - Death Star Battle (1983) (Parker Bros).a26 differ diff --git a/test/roms/bankswitching/E0/Star Wars - Ewok Adventure (1983) (Parker Bros) (Prototype) (PAL).a26 b/test/roms/bankswitching/E0/Star Wars - Ewok Adventure (1983) (Parker Bros) (Prototype) (PAL).a26 new file mode 100644 index 000000000..249824a24 Binary files /dev/null and b/test/roms/bankswitching/E0/Star Wars - Ewok Adventure (1983) (Parker Bros) (Prototype) (PAL).a26 differ diff --git a/test/roms/bankswitching/E0/Star Wars - Ewok Adventure (Thomas Jentzsch) (Prototype).a26 b/test/roms/bankswitching/E0/Star Wars - Ewok Adventure (Thomas Jentzsch) (Prototype).a26 new file mode 100644 index 000000000..c4c659f8f Binary files /dev/null and b/test/roms/bankswitching/E0/Star Wars - Ewok Adventure (Thomas Jentzsch) (Prototype).a26 differ diff --git a/test/roms/bankswitching/E0/Star Wars - The Arcade Game (01-03-1984) (Parker Bros) (Prototype).a26 b/test/roms/bankswitching/E0/Star Wars - The Arcade Game (01-03-1984) (Parker Bros) (Prototype).a26 new file mode 100644 index 000000000..4dcc1f846 Binary files /dev/null and b/test/roms/bankswitching/E0/Star Wars - The Arcade Game (01-03-1984) (Parker Bros) (Prototype).a26 differ diff --git a/test/roms/bankswitching/E0/Star Wars - The Arcade Game (04-05-1984) (Parker Bros) (Prototype) (8K).a26 b/test/roms/bankswitching/E0/Star Wars - The Arcade Game (04-05-1984) (Parker Bros) (Prototype) (8K).a26 new file mode 100644 index 000000000..9c9249836 Binary files /dev/null and b/test/roms/bankswitching/E0/Star Wars - The Arcade Game (04-05-1984) (Parker Bros) (Prototype) (8K).a26 differ diff --git a/test/roms/bankswitching/E0/Star Wars - The Arcade Game (12-05-1983) (Parker Bros) (Prototype).a26 b/test/roms/bankswitching/E0/Star Wars - The Arcade Game (12-05-1983) (Parker Bros) (Prototype).a26 new file mode 100644 index 000000000..807f50d70 Binary files /dev/null and b/test/roms/bankswitching/E0/Star Wars - The Arcade Game (12-05-1983) (Parker Bros) (Prototype).a26 differ diff --git a/test/roms/bankswitching/E0/Star Wars - The Arcade Game (12-15-1983) (Parker Bros) (Prototype).a26 b/test/roms/bankswitching/E0/Star Wars - The Arcade Game (12-15-1983) (Parker Bros) (Prototype).a26 new file mode 100644 index 000000000..5ac517497 Binary files /dev/null and b/test/roms/bankswitching/E0/Star Wars - The Arcade Game (12-15-1983) (Parker Bros) (Prototype).a26 differ diff --git a/test/roms/bankswitching/E0/Star Wars - The Arcade Game (12-23-1983) (Parker Bros) (Prototype).a26 b/test/roms/bankswitching/E0/Star Wars - The Arcade Game (12-23-1983) (Parker Bros) (Prototype).a26 new file mode 100644 index 000000000..3c266fdc3 Binary files /dev/null and b/test/roms/bankswitching/E0/Star Wars - The Arcade Game (12-23-1983) (Parker Bros) (Prototype).a26 differ diff --git a/test/roms/bankswitching/E0/Star Wars - The Arcade Game (1984) (Parker Bros) (PAL).a26 b/test/roms/bankswitching/E0/Star Wars - The Arcade Game (1984) (Parker Bros) (PAL).a26 new file mode 100644 index 000000000..679a98c9c Binary files /dev/null and b/test/roms/bankswitching/E0/Star Wars - The Arcade Game (1984) (Parker Bros) (PAL).a26 differ diff --git a/test/roms/bankswitching/E0/Star Wars - The Arcade Game (1984) (Parker Bros).a26 b/test/roms/bankswitching/E0/Star Wars - The Arcade Game (1984) (Parker Bros).a26 new file mode 100644 index 000000000..c03bda5bf Binary files /dev/null and b/test/roms/bankswitching/E0/Star Wars - The Arcade Game (1984) (Parker Bros).a26 differ diff --git a/test/roms/bankswitching/E0/Star Wars - The Arcade Game (Parker Bros) (Prototype 122283).a26 b/test/roms/bankswitching/E0/Star Wars - The Arcade Game (Parker Bros) (Prototype 122283).a26 new file mode 100644 index 000000000..4d6f16f19 Binary files /dev/null and b/test/roms/bankswitching/E0/Star Wars - The Arcade Game (Parker Bros) (Prototype 122283).a26 differ diff --git a/test/roms/bankswitching/E0/Super Cobra (1982) (Parker Bros) (PAL).a26 b/test/roms/bankswitching/E0/Super Cobra (1982) (Parker Bros) (PAL).a26 new file mode 100644 index 000000000..5ea207651 Binary files /dev/null and b/test/roms/bankswitching/E0/Super Cobra (1982) (Parker Bros) (PAL).a26 differ diff --git a/test/roms/bankswitching/E0/Super Cobra (1982) (Parker Bros) [b1].a26 b/test/roms/bankswitching/E0/Super Cobra (1982) (Parker Bros) [b1].a26 new file mode 100644 index 000000000..30b57793c Binary files /dev/null and b/test/roms/bankswitching/E0/Super Cobra (1982) (Parker Bros) [b1].a26 differ diff --git a/test/roms/bankswitching/E0/Super Cobra (1982) (Parker Bros).a26 b/test/roms/bankswitching/E0/Super Cobra (1982) (Parker Bros).a26 new file mode 100644 index 000000000..96132d050 Binary files /dev/null and b/test/roms/bankswitching/E0/Super Cobra (1982) (Parker Bros).a26 differ diff --git a/test/roms/bankswitching/E0/Tooth Protectors (1983) (DSD-Camelot).a26 b/test/roms/bankswitching/E0/Tooth Protectors (1983) (DSD-Camelot).a26 new file mode 100644 index 000000000..d38ecf7e2 Binary files /dev/null and b/test/roms/bankswitching/E0/Tooth Protectors (1983) (DSD-Camelot).a26 differ diff --git a/test/roms/bankswitching/E0/Tutankham (1983) (Parker Bros) (PAL).a26 b/test/roms/bankswitching/E0/Tutankham (1983) (Parker Bros) (PAL).a26 new file mode 100644 index 000000000..5ab6e6fbe Binary files /dev/null and b/test/roms/bankswitching/E0/Tutankham (1983) (Parker Bros) (PAL).a26 differ diff --git a/test/roms/bankswitching/E0/Tutankham (1983) (Parker Bros).a26 b/test/roms/bankswitching/E0/Tutankham (1983) (Parker Bros).a26 new file mode 100644 index 000000000..cbe3f285f Binary files /dev/null and b/test/roms/bankswitching/E0/Tutankham (1983) (Parker Bros).a26 differ diff --git a/test/roms/bankswitching/E7/Breaking News (2002) (Ric Pryor) (Bump 'n' Jump Hack).a26 b/test/roms/bankswitching/E7/Breaking News (2002) (Ric Pryor) (Bump 'n' Jump Hack).a26 new file mode 100644 index 000000000..77dccc9cd --- /dev/null +++ b/test/roms/bankswitching/E7/Breaking News (2002) (Ric Pryor) (Bump 'n' Jump Hack).a26 @@ -0,0 +1,65 @@ +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿff~ff$|ff|ff| ±Ûª±Ñ……*…±Ó…±×…ıՅ„ñ٤Ą…††¤ÃˆÖ……*©…………©`…Ñ…Ó…Õ…×…Ù…Û©ý…Ò…Ô…Ö…Ø…Ú…Ü……*`¢……*¹Œð•ÑÈèèàÐô……*¹Œð•ÑÈèèà Ðô……*©ðLñ`…*¢þêê……*Lò…°……*†Â©Äΰð±Ê…¦¦Ñ©•€ˆÄÏ°±Ì…©¦¦Ó•€¦Â…,……*©Äΰ±Ê…ˆÄÏ°±Ì…©Äΰ±Ê„¨¥ã…+ð-%É……*„¨¥ê…±Å…±Ç…©¤ÂˆÄÏ°±Ì…ÀðOÆã©Lò¥ä%é……*„¨¥ë…±å…±ç…©¤ÂˆÄÏ°±Ì…Àð ©Æä……*Äΰ±Êð…ˆÄÏ°±Ì…ðnLVñ¦áÐ`L +óL%ó…µ³ªµ‡…Îðò†Ñµ™…ʈÄÏ𠩈Р±Ì…ˆ±Ì…Ä……*©…µ€)Éz¥Ä…µ“…µ€… )é8éÐü………*µ«…©……Ä…,L•ñµ³ªµ‡…Ïð‰†Ó©Äΰ±Êˆ……*…µ€)ÉCµ™…Ì¥µ“…µ€…!)ééÐü………*µ«…Äΰ±Ê…ˆ…,Lžñéü…¥Ä…µ“…µ€… L|ò8éÐü…µ™…̵“…µ€…!LÉò……*©Äΰ±Ê…ˆÄÏ°±Ì…ÊÐæ`ˆÐL$òÄÏ°±Ì…Ð…ÏLVñ……*ÊÐù`……*¥Ãê¥ê…êêê êˆÐü……©…%…&©À… ©Ð…!©……*………… … ©€…… ©………+……*¢ :ó  ñ……* ¾ð¥ñ¢Ù Öô……*©,……¢ :ó ¾ð©…Ê…Ë…Ì¥ñÐ ©…Ê……*Lúóø¥ËeñæÊ……*eñæÊeñæÊeñæÊeñæÊ…ËØ……*¢ :ó  ñ……*©€…… ¾ð……*¥Ê¢Ñ Öô……*¥Ë¢Õ Öô……*¥Ì¢Ù Öô……*¢`©ÅÑІÑÅÓІÓÅÕІՅ…*©,…… ¾ð  ñ……*¢ + :ó©€…… ¾ð¥ði…ÃJJJJª¥Ã)É +0¥Ãi…Ãø¥Ã}ñôآم…* Öô……*©,……¢ :ó ¾ð¥ð)ª¼¶ð½ºð…… ñ¢ :ó……* ¾ð¢ :ó`……*…ÃJJJJ¨¹i÷•¥Ã)¨¹i÷•`$06BHT`frx… „ „©À… ©Ð…!ê êˆÐü……©…%…&¢©……*…………… … ©Š ©………+……*©… …±Ûª±Ñ……*…±Ó…±×…ıՅ„ñ٤Ą…††¤ÃˆÖ……*©…%…&……©D…… ¢……*¹Mý……¥âj°8íh÷ûê¥â††ˆàLÅõ8íh÷û¥âê¥â††ˆË……*©……¥î)ª½i÷…Ñ¥íJJJJª½i÷…Ó¥í)ª½i÷…Õ……*©… …©… ©…!©……ê……©…©…©¶…… ……*©… …©ý…Ø…Ú¢`¥ó¢R†×¢`¥î)ð¥¿)ð¢Y†Ù©…!……*±Ñ…±Ó…±×ª­h÷ê±Õ…©,…†±Ù……+©¶…ˆÖ……*©…………Ä¢þµ³ªµ³…×¥ÎÉÿЩ)…Ù +…ÕI¨……*µ™™Ê–јJ¨µ‡™Îµ“™µ«™µ€™Â¦×˜¤ÕÅÙÐÕ……*¥Â)¨¥Â¥Â… ˆÐý………*¥Ã)¨¥Ã¥Ã…!ˆÐý…„ ……*¤ãȘ%ɨ±Å…±Ç…©…%…,©…&©¡åᨅ+……*©… …¥òÉðð É0ÉÐLBó……*©… ¥ê…¥áÉðÄÏ°±Ì…¥áÉð +Éð LòL–ñL‡ñLVñLÜñ`#*18?ððð`ýFýýýý`ý¥øÆø……¢ ½y÷•ÑÊø`©Š……©ý…Ò…Ô…Ö…Ø…Ú…Ü¥Ý¢Ñ Úô¥Þ¢Õ Úô¥ß¢ÙLÚôCopyright 1983 Mattel Dave Akers Jeff Ratcliff Pat Dulong €€€BBBG€€€JNEEEŠ +€€€BBBG€€Š + + +JNNRT€‚„„@@OO€€€BBBC€‚„„@@OO„„BBBC€‚€€ + + + +–BBG€€@@SRER € + + +Š–VNSEEERTE€„„€@@SRER€€@@SE € €€Š + + + + + + + +VASEŽ„ŠŠŠVAGCIIICBBGCHCCIICC@€ + + + +–NNSEER€ ŠVASRERRTRŠ +Š–NNSRR €@@GCIIIIC€€€BBS€„€BBGCHCCIICC@€@@SE€€@@SE€€@@SREEETEŠ + + +Š + +–NNC€@@G€€„„@@SRERRTRUR@BG€€@@S€ €BBS€€‚‚‚BBG‚@@G€Š + + +€–VNSEEEETEUE€€€BBG€ € € €BBGÀ@G€‚‚‚‚B@SEE€€ + + +€€@@SEEERTRR€BBGHHCC IIICQC€„„„––D@SRERRTRUREERRTR€ €€B@SEER€ü@üü@üü@üJüJü„ü@üËünüÿ„¾ü@üJüEüÿ„Jünüÿ„Jü|ü„¿ü4üü0üü0üü0ü¶ü4ü¿ü¿ü„Jü|üÿ„JüXüÿ„ËüJü„ËüEüÿ„Ëü|üÿ„ËüXüÿ„¿ü üLtôLêô¥òÉðÐ#­‚)Щ…ò…Ý…Þ…ß…ï…ñ©…à©…âL¯ôLŽþÉL×ô¥«)ðÉððmÉ°ð É€ðºÉPð¹¥€Ð+ ¥ì + +e‡8é¥ȹêɄТL#ô¢ —þ©ð…«©@…¹L^ô¥ ¥ 0­î𢠗þ©€…«©x…¹¥8é…L^ô¥«É ÐLêô©@…“`¥¹ðHƹ©íîLŽþ¥¹Ð%¥i…©P…«©…¹ø­í8é í­îéîØLbôƹ©……«©…ŸLbô…“LbôÆâ¥â©ð…ò©…‡©…â…ê…ë…óLŽþLøô©î© í©P…©"…‡©…«©@…“LŽþ¥¹Ð…«LbôƹLbô¥ð)ª½µö…ý½ö…Ĥïðˆ±Ã0ˆÐù„ï±Ã)…ó + + +¨¢¹ó•ÅÈèàÐõ¹ó¦ðÐJi²LFõ¥ð)yóª½Åö…ê©-…ì…ã…ä ©¢™«–‡™ŸˆÐõLÍô¥ò0LÉÐLö¥«Éðð? ¥îР¥íÉP¥¿)Ð+¥íÉu0ÈLžõÉð¥íÉ20È„Â¥á8åÂ0…áL´õi…áL¿õ¥ì…ã©0…äLðþæì ¹«)É_ ¹‡8陇ÈÀÐé¥ìÉ0ðL´õ©…ã…ì¥ê…ëæï¥ïÉ`Ð;©…ï…óæð¥ðÉcЩ…ð©ÿ…ò©…ô…ö©…÷…õL´õ©…ò¢øµÝuÊ•ÝÊ÷Ø©…ñ¥ð)ª½µö…ѽ½ö…Ò¤ï±Ñ)…ó + + +i…Ó©ió…Ô ¹Å™å±Ó™Åˆò ±ÓÉ„Ð…êLŠö¦ðÐJi²Lˆö¥ð)qÓª½Åö…êø©eß…ß©eÞ…Þ©eÝ…ÝÅà0¥ài…à¥âÉðæâØL´õ`À €à@ ðððñññòòDà*ุ4©…Ä¢þµ³ªµ³¨Éÿð+¹‡ð&µ‡Éð 8ù‡É °µ8ù…ÃIÿiÉ0˜ªLÖö¥Äð¢L—þ`µ«0í¹«0è©`Õ«ðÙ«ð©PÕ«ðÙ«ðLR÷©°™«L÷©À™«L÷©°•«L÷©À•«L÷µ«àðÉ ð¹«ÀðÉ ðLÄ÷©…Ä© •«™«„µ¥)¨¹ô÷•¹¤Â†Â¹¥)ª½ô÷™¹¦Â©ú™Ÿ©•Ÿ¥Ã0µ¥) P•¥¹¥)  Lé÷µ¥)  •¥¹¥) PLé÷¥Ã0µ¥) (•¥¹¥) ØLé÷µ¥) Ø•¥¹¥) (™¥˜ªµ³¨L÷-¥òÉððÉТ††`Æõð ¥òÐLcòÆ÷ð,`¦ô¥òð0½òLFð½IòLFð­‚)Щ…Lcò½"ñ _ðLð¦ö¥ò0½1òL[ð½Vò Æð`ÉÿÐ(¢¥òð†††ò†ô†öÉÿÐæò©<…õ…÷`†ô©…õhhL#ð…Ã)ª½ñ¨)…˜0©Ð© …¥ÃJJJJÉ¢ð +¤òð¢ Т†ª½ñ…õæô`ÉÿТ††`…Ã)ª½ñ¨)…˜0©Ð© …¥ÃJJJJɢ𢠆ª½ñ…÷æö` :8b †‡ˆ‹Œ›4ðD9ðI5ðEx4ðD9ðI5ðE|4ðD9ðI5ðEDH7ðGBGDGbðBvHCwDFxEGt9ðID7ðGEH6ðFGCA@‚ðR#xS&dðT(w+)$'X'v*%(&4ðD8ðH7ðGyHEDHDEy4ðð$9ð ð)HDu4ðð$9ð ð)DEy4ðð$9ð ð)(&s4ðð$9ð ð)HDu4ðð$9ð ð)+)u4ðð$9ð ð)$'v3ðð#7ðð'##bðBCHGCFDHFGEDGDyrFH3ðCGDvHE7ðGDIÿ4à”à”à444ਤ¨4à”à”à´àð¤ÿ7à—à—à777ধ¦7à—à—à·àð§ÿÇ7¦§¨Ç¤¨¦§¨×ÿÄ4¨¤¥Ä©¥¨¤¥Ôÿ¥öЩ…À©…©…¦î½{ò…`Æ÷Ðæö¦ö½°òÉÿЩ……ö`½vó…÷¦ö½°ò…½ó¨)…˜JJJJ…` +  + + + ÿÿÿ ÿÿÿÿO@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@ÿ‰ŠŠ‰…ƒÿ…‰‰…ÿÅÅÅEEEEÅÿMÿ‡‰ŠŒ‹Š‰ˆ‡†…ƒ‚ÿ…‡‰ŠŒ‹Š‰ˆ‡†…„ƒ‚ÿ + + +ÿÿÿÿÿ +ÿ +ÿ¥ó)…ó)@ð¥¿)Ð¥ÀÉ𢠗þ¥ó €…ó¢¥êÉ„ð¥ëɄТÿ†Ó¥³Ð`¢þ µ³™×ȪÀÐõ¥ðð nö „¹תµ¥)…ÄàÐLõ¥òLˆõµ«ð +Éð7LæõL6öµ‡ÉÐL"õµ¹Ð"¥îЩ•¥L€ô¥ÄÉРµ‡8几û”Ÿ©ÿ•¹Ö¹µ€Ð (µÉT°ÉG°L›ôÉ` Ø”¥¥Ó¥Â)ðLˆõ©p•«Lõµ«Éð—¥ïÉ^Lˆõ¤ÂÀ0 ¹Õ¨¹‡8õ‡É°¹ŸÉìð©ú•Ÿ©•¹Lõ¤ÂÀ%¹Ù¨µ‡8ù‡É°¥îЩР¹ŸÉð©•Ÿ©•¹µ¥Ä•¥¤ÂÈÀðL)ô`Še¿)ÐQ¤×¹‡É–°H¥êÉ„ðB©àð µEÁ)i…Ĩ¹£ö•“¥îÐ àð#©•‡©Lkõ©­•‡©P•©ð•Ÿ©ÿ•¹ Ø¥¿0 (”¥Lõ©•¥•Ÿµ¹Ð©•‡©•¥•Ÿ©•«LõÖ¹©•¥•Ÿµ‡0ãÉ0ßLõàðµ€ÐQ©ÿ…ø©øeÞ…Þ©eÝ…Ý¥ñÉ™ði…ñ؆â —þ¦Ã©ð•«©@•¹LõÉðð”Épð­É ðºÉ°ðÜÉÀðºÉ`ð5ÉðLõµ¹ðÖ¹Lõ (¹¥0 Ø˜•¥L’õµ¹ð Ö¹©•¥•ŸLõ©•«LõL›õ¥¾ðƾLõ©ô…˜¤Ü©`™«¥Œ8陇¥’™©™¥©™“…°©…Œ©ü…¤Lõ¥°Éð.¥ŒÉ‚Ð(¤Ü¹‡ÉЩ™«©#™¹©…°©…˜©…¾©…¤¢L—þ`ü²š€ô!ñáÑÁ±¡‘rbRB2"òâÒ²¢’scSC3#óãÓó£“tdTD4$ôäÔÄ´¤”ueUE5%õåÕŵ¥•vfVF6&öæÖƶ¦–wgWG7'÷ç×Ç·§—xhXH8(øèØȸ¨˜yiYI9) ùšššššššš ¹«)pÉ_° ¹‡8åᙇÈÀðL1÷©ú…Ë…Í ¹«Éðй¹JJJª½µþ™“¢¹¹É轺÷L‰÷¹¥) +ª¥¿9´÷Ðè½¼÷8ù‡™™ˆÀ­«É…Э¹ÉZÉ0¥‡i…‡©¬8凅™`ÀÔèü8L`t$$$ˆˆÔÔ „±¢ÿ–³¢þˆµ³†Âª¹‡Õ‡ô–³¦Â”³¢þˆé ¢þȵ³ªÐú„Î`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ<~BfZZZfB~~<<~BfZZZfB~~<ff<~~ÿ¥îÐ¥íÉ!ø¥í8é…í¥îé…îØ`¥Ái)…Á¢ à0µŸ +8j8j8j +LeÿJJ)þLeÿµŸIÿieÁJJJJJIÿiL„ÿeÁJJJJJu‡ÝÅÿà àð©L§ÿ½ÅÿL§ÿݹÿÐi•‡Êž¢´¹—ö•€Êö` T®®®®® !"#gýgýgý \ No newline at end of file diff --git a/test/roms/bankswitching/E7/Bump 'N' Jump (1983) (Mattel) [b1].a26 b/test/roms/bankswitching/E7/Bump 'N' Jump (1983) (Mattel) [b1].a26 new file mode 100644 index 000000000..1dc3344de --- /dev/null +++ b/test/roms/bankswitching/E7/Bump 'N' Jump (1983) (Mattel) [b1].a26 @@ -0,0 +1,63 @@ +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿff~fff~~ff|ff~~f```f~|fffff|~``~``~```|``~~ffn`f~~~~``````BZZ~ffBbfn~vfF~fffff~``~fff~ff|fff~~f~`f~~ ±Ûª±Ñ……*…±Ó…±×…ıՅ„ñ٤Ą…††¤ÃˆÖ……*©…………©`…Ñ…Ó…Õ…×…Ù…Û©ý…Ò…Ô…Ö…Ø…Ú…Ü……*`¢……*¹Œð•ÑÈèèàÐô……*¹Œð•ÑÈèèà Ðô……*©ðLñ`…*¢þêê……*Lò…°……*†Â©Äΰð±Ê…¦¦Ñ©•€ˆÄÏ°±Ì…©¦¦Ó•€¦Â…,……*©Äΰ±Ê…ˆÄÏ°±Ì…©Äΰ±Ê„¨¥ã…+ð-%É……*„¨¥ê…±Å…±Ç…©¤ÂˆÄÏ°±Ì…ÀðOÆã©Lò¥ä%é……*„¨¥ë…±å…±ç…©¤ÂˆÄÏ°±Ì…Àð ©Æä……*Äΰ±Êð…ˆÄÏ°±Ì…ðnLVñ¦áÐ`L +óL%ó…µ³ªµ‡…Îðò†Ñµ™…ʈÄÏ𠩈Р±Ì…ˆ±Ì…Ä……*©…µ€)Éz¥Ä…µ“…µ€… )é8éÐü………*µ«…©……Ä…,L•ñµ³ªµ‡…Ïð‰†Ó©Äΰ±Êˆ……*…µ€)ÉCµ™…Ì¥µ“…µ€…!)ééÐü………*µ«…Äΰ±Ê…ˆ…,Lžñéü…¥Ä…µ“…µ€… L|ò8éÐü…µ™…̵“…µ€…!LÉò……*©Äΰ±Ê…ˆÄÏ°±Ì…ÊÐæ`ˆÐL$òÄÏ°±Ì…Ð…ÏLVñ……*ÊÐù`……*¥Ãê¥ê…êêê êˆÐü……©…%…&©À… ©Ð…!©……*………… … ©€…… ©………+……*¢ :ó  ñ……* ¾ð¥ñ¢Ù Öô……*©,……¢ :ó ¾ð©…Ê…Ë…Ì¥ñÐ ©…Ê……*Lúóø¥ËeñæÊ……*eñæÊeñæÊeñæÊeñæÊ…ËØ……*¢ :ó  ñ……*©€…… ¾ð……*¥Ê¢Ñ Öô……*¥Ë¢Õ Öô……*¥Ì¢Ù Öô……*¢`©ÅÑІÑÅÓІÓÅÕІՅ…*©,…… ¾ð  ñ……*¢ + :ó©€…… ¾ð¥ði…ÃJJJJª¥Ã)É +0¥Ãi…Ãø¥Ã}ñôآم…* Öô……*©,……¢ :ó ¾ð¥ð)ª¼¶ð½ºð…… ñ¢ :ó……* ¾ð¢ :ó`……*…ÃJJJJ¨¹i÷•¥Ã)¨¹i÷•`$06BHT`frx… „ „©À… ©Ð…!ê êˆÐü……©…%…&¢©……*…………… … ©Š ©………+……*©… …±Ûª±Ñ……*…±Ó…±×…ıՅ„ñ٤Ą…††¤ÃˆÖ……*©…%…&……©D…… ¢……*¹Mý……¥âj°8íh÷ûê¥â††ˆàLÅõ8íh÷û¥âê¥â††ˆË……*©……¥î)ª½i÷…Ñ¥íJJJJª½i÷…Ó¥í)ª½i÷…Õ……*©… …©… ©…!©……ê……©…©…©¶…… ……*©… …©ý…Ø…Ú¢`¥ó¢R†×¢`¥î)ð¥¿)ð¢Y†Ù©…!……*±Ñ…±Ó…±×ª­h÷ê±Õ…©,…†±Ù……+©¶…ˆÖ……*©…………Ä¢þµ³ªµ³…×¥ÎÉÿЩ)…Ù +…ÕI¨……*µ™™Ê–јJ¨µ‡™Îµ“™µ«™µ€™Â¦×˜¤ÕÅÙÐÕ……*¥Â)¨¥Â¥Â… ˆÐý………*¥Ã)¨¥Ã¥Ã…!ˆÐý…„ ……*¤ãȘ%ɨ±Å…±Ç…©…%…,©…&©¡åᨅ+……*©… …¥òÉðð É0ÉÐLBó……*©… ¥ê…¥áÉðÄÏ°±Ì…¥áÉð +Éð LòL–ñL‡ñLVñLÜñ`#*18?ððð`ýFýýýý`ý¥øÆø……¢ ½y÷•ÑÊø`©Š……©ý…Ò…Ô…Ö…Ø…Ú…Ü¥Ý¢Ñ Úô¥Þ¢Õ Úô¥ß¢ÙLÚôCopyright 1983 Mattel Dave Akers Jeff Ratcliff Pat Dulong €€€BBBG€€€JNEEEŠ +€€€BBBG€€Š + + +JNNRT€‚„„@@OO€€€BBBC€‚„„@@OO„„BBBC€‚€€ + + + +–BBG€€@@SRER € + + +Š–VNSEEERTE€„„€@@SRER€€@@SE € €€Š + + + + + + + +VASEŽ„ŠŠŠVAGCIIICBBGCHCCIICC@€ + + + +–NNSEER€ ŠVASRERRTRŠ +Š–NNSRR €@@GCIIIIC€€€BBS€„€BBGCHCCIICC@€@@SE€€@@SE€€@@SREEETEŠ + + +Š + +–NNC€@@G€€„„@@SRERRTRUR@BG€€@@S€ €BBS€€‚‚‚BBG‚@@G€Š + + +€–VNSEEEETEUE€€€BBG€ € € €BBGÀ@G€‚‚‚‚B@SEE€€ + + +€€@@SEEERTRR€BBGHHCC IIICQC€„„„––D@SRERRTRUREERRTR€ €€B@SEER€ü@üü@üü@üJüJü„ü@üËünüÿ„¾ü@üJüEüÿ„Jünüÿ„Jü|ü„¿ü4üü0üü0üü0ü¶ü4ü¿ü¿ü„Jü|üÿ„JüXüÿ„ËüJü„ËüEüÿ„Ëü|üÿ„ËüXüÿ„¿ü üLtôLêô¥òÉðÐ#­‚)Щ…ò…Ý…Þ…ß…ï…ñ©…à©…âL¯ôLŽþÉL×ô¥«)ðÉððmÉ°ð É€ðºÉPð¹¥€Ð+ ¥ì + +e‡8é¥ȹêɄТL#ô¢ —þ©ð…«©@…¹L^ô¥ ¥ 0­î𢠗þ©€…«©x…¹¥8é…L^ô¥«É ÐLêô©@…“`¥¹ðHƹ©íîLŽþ¥¹Ð%¥i…©P…«©…¹ø­í8é í­îéîØLbôƹ©……«©…ŸLbô…“LbôÆâ¥â©ð…ò©…‡©…â…ê…ë…óLŽþLøô©î© í©P…©"…‡©…«©@…“LŽþ¥¹Ð…«LbôƹLbô¥ð)ª½µö…ý½ö…Ĥïðˆ±Ã0ˆÐù„ï±Ã)…ó + + +¨¢¹ó•ÅÈèàÐõ¹ó¦ðÐJi²LFõ¥ð)yóª½Åö…ê©-…ì…ã…ä ©¢™«–‡™ŸˆÐõLÍô¥ò0LÉÐLö¥«Éðð? ¥îР¥íÉP¥¿)Ð+¥íÉu0ÈLžõÉð¥íÉ20È„Â¥á8åÂ0…áL´õi…áL¿õ¥ì…ã©0…äLðþæì ¹«)É_ ¹‡8陇ÈÀÐé¥ìÉ0ðL´õ©…ã…ì¥ê…ëæï¥ïÉ`Ð;©…ï…óæð¥ðÉcЩ…ð©ÿ…ò©…ô…ö©…÷…õL´õ©…ò¢øµÝuÊ•ÝÊ÷Ø©…ñ¥ð)ª½µö…ѽ½ö…Ò¤ï±Ñ)…ó + + +i…Ó©ió…Ô ¹Å™å±Ó™Åˆò ±ÓÉ„Ð…êLŠö¦ðÐJi²Lˆö¥ð)qÓª½Åö…êø©eß…ß©eÞ…Þ©eÝ…ÝÅà0¥ài…à¥âÉðæâØL´õ`À €à@ ðððñññòòDà*ุ4©…Ä¢þµ³ªµ³¨Éÿð+¹‡ð&µ‡Éð 8ù‡É °µ8ù…ÃIÿiÉ0˜ªLÖö¥Äð¢L—þ`µ«0í¹«0è©`Õ«ðÙ«ð©PÕ«ðÙ«ðLR÷©°™«L÷©À™«L÷©°•«L÷©À•«L÷µ«àðÉ ð¹«ÀðÉ ðLÄ÷©…Ä© •«™«„µ¥)¨¹ô÷•¹¤Â†Â¹¥)ª½ô÷™¹¦Â©ú™Ÿ©•Ÿ¥Ã0µ¥) P•¥¹¥)  Lé÷µ¥)  •¥¹¥) PLé÷¥Ã0µ¥) (•¥¹¥) ØLé÷µ¥) Ø•¥¹¥) (™¥˜ªµ³¨L÷-¥òÉððÉТ††`Æõð ¥òÐLcòÆ÷ð,`¦ô¥òð0½òLFð½IòLFð­‚)Щ…Lcò½"ñ _ðLð¦ö¥ò0½1òL[ð½Vò Æð`ÉÿÐ(¢¥òð†††ò†ô†öÉÿÐæò©<…õ…÷`†ô©…õhhL#ð…Ã)ª½ñ¨)…˜0©Ð© …¥ÃJJJJÉ¢ð +¤òð¢ Т†ª½ñ…õæô`ÉÿТ††`…Ã)ª½ñ¨)…˜0©Ð© …¥ÃJJJJɢ𢠆ª½ñ…÷æö` :8b †‡ˆ‹Œ›4ðD9ðI5ðEx4ðD9ðI5ðE|4ðD9ðI5ðEDH7ðGBGDGbðBvHCwDFxEGt9ðID7ðGEH6ðFGCA@‚ðR#xS&dðT(w+)$'X'v*%(&4ðD8ðH7ðGyHEDHDEy4ðð$9ð ð)HDu4ðð$9ð ð)DEy4ðð$9ð ð)(&s4ðð$9ð ð)HDu4ðð$9ð ð)+)u4ðð$9ð ð)$'v3ðð#7ðð'##bðBCHGCFDHFGEDGDyrFH3ðCGDvHE7ðGDIÿ4à”à”à444ਤ¨4à”à”à´àð¤ÿ7à—à—à777ধ¦7à—à—à·àð§ÿÇ7¦§¨Ç¤¨¦§¨×ÿÄ4¨¤¥Ä©¥¨¤¥Ôÿ¥öЩ…À©…©…¦î½{ò…`Æ÷Ðæö¦ö½°òÉÿЩ……ö`½vó…÷¦ö½°ò…½ó¨)…˜JJJJ…` +  + + + ÿÿÿ ÿÿÿÿO@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@ÿ‰ŠŠ‰…ƒÿ…‰‰…ÿÅÅÅEEEEÅÿMÿ‡‰ŠŒ‹Š‰ˆ‡†…ƒ‚ÿ…‡‰ŠŒ‹Š‰ˆ‡†…„ƒ‚ÿ + + +ÿÿÿÿÿ +ÿ +ÿ¥ó)…ó)@ð¥¿)Ð¥ÀÉ𢠗þ¥ó €…ó¢¥êÉ„ð¥ëɄТÿ†Ó¥³Ð`¢þ µ³™×ȪÀÐõ¥ðð nö „¹תµ¥)…ÄàÐLõ¥òLˆõµ«ð +Éð7LæõL6öµ‡ÉÐL"õµ¹Ð"¥îЩ•¥L€ô¥ÄÉРµ‡8几û”Ÿ©ÿ•¹Ö¹µ€Ð (µÉT°ÉG°L›ôÉ` Ø”¥¥Ó¥Â)ðLˆõ©p•«Lõµ«Éð—¥ïÉ^Lˆõ¤ÂÀ0 ¹Õ¨¹‡8õ‡É°¹ŸÉìð©ú•Ÿ©•¹Lõ¤ÂÀ%¹Ù¨µ‡8ù‡É°¥îЩР¹ŸÉð©•Ÿ©•¹µ¥Ä•¥¤ÂÈÀðL)ô`Še¿)ÐQ¤×¹‡É–°H¥êÉ„ðB©àð µEÁ)i…Ĩ¹£ö•“¥îÐ àð#©•‡©Lkõ©­•‡©P•©ð•Ÿ©ÿ•¹ Ø¥¿0 (”¥Lõ©•¥•Ÿµ¹Ð©•‡©•¥•Ÿ©•«LõÖ¹©•¥•Ÿµ‡0ãÉ0ßLõàðµ€ÐQ©ÿ…ø©øeÞ…Þ©eÝ…Ý¥ñÉ™ði…ñ؆â —þ¦Ã©ð•«©@•¹LõÉðð”Épð­É ðºÉ°ðÜÉÀðºÉ`ð5ÉðLõµ¹ðÖ¹Lõ (¹¥0 Ø˜•¥L’õµ¹ð Ö¹©•¥•ŸLõ©•«LõL›õ¥¾ðƾLõ©ô…˜¤Ü©`™«¥Œ8陇¥’™©™¥©™“…°©…Œ©ü…¤Lõ¥°Éð.¥ŒÉ‚Ð(¤Ü¹‡ÉЩ™«©#™¹©…°©…˜©…¾©…¤¢L—þ`ü²š€ô!ñáÑÁ±¡‘rbRB2"òâÒ²¢’scSC3#óãÓó£“tdTD4$ôäÔÄ´¤”ueUE5%õåÕŵ¥•vfVF6&öæÖƶ¦–wgWG7'÷ç×Ç·§—xhXH8(øèØȸ¨˜yiYI9) ùšššššššš ¹«)pÉ_° ¹‡8åᙇÈÀðL1÷©ú…Ë…Í ¹«Éðй¹JJJª½µþ™“¢¹¹É轺÷L‰÷¹¥) +ª¥¿9´÷Ðè½¼÷8ù‡™™ˆÀ­«É…Э¹ÉZÉ0¥‡i…‡©¬8凅™`ÀÔèü8L`t$$$ˆˆÔÔ „±¢ÿ–³¢þˆµ³†Âª¹‡Õ‡ô–³¦Â”³¢þˆé ¢þȵ³ªÐú„Î`ÿÿý`Ÿím©Êœ{@ÞÞäÿèvÖô®ò8×hûHkéÞØÝê'ºù@’@ß²¿Ýn@üêûí½2Î_®ÿ}]·Ñ}¯Iüw¿ôÿ2âþIùSÿó÷Y¿ýÿ€dŽ¿ÏÞyÙÕçùÿß~|í{îøˆ:ßÂÿ9o€«¯ûÅÿ³î}Þ>þv¿_ÿ€OüzÿϽýÿý¯õ÷(e#¿oÿÚïÍ[ó€ýÿ|裏€€ÆÿÝ·òöÿ¿5ߢ#òôÿoû"ýÿ?ÿê÷„cÿIÿŸo5·VÏý¿ÙºÏÝûß&ÿäÞ—ëùÿÆÞ÷Ùš¿[‹Ùá€vopïŸý7_¼²¿ú@?²Ü¹öüüwwJå·ÿ½çkCç\&ÿÎä×ïÿîùT^ÔþŸ®~þþþr‘úÙ÷„¯™¾Þþüýç÷®‰ßüõÿ¹üû¾½¾ÏÿTÿžÿ@vÿ&ý]ŸÐûþÿuï í¾®z™ÿÑïí÷7û €÷ûaÝïûPYïç¾ÿÿþëoþÿÝûÿïõý@yûZýŸîßßþ÷·ÿ€ÿ¹´ÿÿ­Ñ¿\Nè> íÿ³Î÷÷aÿø¿ˆgùFáÓÿ§nSs~7ý»½ûÉÿ¨_–Oýâï«ÿžß»ÿ[òý¯×æÿj½•ý~ÿ;ûnì¿T»ï.ÏŸñëxjÿ÷÷W¿yŸe}@˵ýÿoÿ {gÿûï@•÷ûûÿïÿvæwõ€}ÿÙ8ìÿæß–ïûææÏ}sŸÿ"úûõÿôÿûÕ·Ýgoßtüôÿïþ÷þÿþÿ¯véÿA÷ ÿàÿ€ÕÿÖßÃÿvsaîØî¶ÿÿ]sÿýþwìý æyÿMw€óÿÿÿûÿÿÿS½@é÷]¼÷ˆ‡ß0äuñÛï²÷¿ÿ +2·½þ¯Þz•ï½×íÿ@î®–æ½_Çüï>¿·¿:š™Ï¶þ ûý›û«~ûÿò÷Úý<¿ú ÿû^wÞ;÷¹Ÿöïÿÿ|ßdäçö@vÿ|¦ÿ¤SùÛÿo»ËÿüËŠ¿ {þ÷ÿGÙE6m÷ï[·ûwè§ïÿÜù¾ÿYÞ½ÿÛ½ç—ß¿ÿy·ýNýÍ¿îû?þµþŸÇúÛþïŸý¿õúvÿ—ÿ}ÍÞ¿Ÿÿ ~o­ÿïˆc-Ìöûgý†vóýâÏtcsÉ5¾ô¿jÊ7ÞËïN¯©àñÓÛ€ZËûôwÝ>ÿÎõÎÿ@×ÇÇËÂû5ϠʼnÍDÈû½¶ôõ –½ÿê® {lŸ®Ç_ÿ?ïŸíso×s®}__÷ï»÷½þýÿ¦ÿÂÚäü ïîyoÓßìYÿúÏß(«lU]>ÿ@Ïßßʆÿ²­Ú÷å1iå|ÿÆ>׿þû·w/_Ùü_ÿ‹5úï®ï¿·«î@»ÿþ×>ÿRï·Ë|ÿ|Rtó£þûñ ÷þÿÿÝüßÞ}­Ó ª&…›þ Où,·¿}øߟ»ÿ¼ßÈËýdû—º÷ÞöþOy=ûæ÷û­+û XþËÿö–€Öw}ÇûþëÉò×êÜ÷³õ¯¨ý)ÿÞ /÷ûï}ç½û,ßÎÞw·íÿýþfþRý-ÝÿØïý÷eoíßé{ ®»ÛI¾ÿÿNÿýÝwýã×ùÛA[÷o}¯Rûöÿ}hrŸÏ­½ë€ëyÏýÿ ßûív«ïP‚®=]¿ú¬ÿ÷ÿ@óëÿÿKÿÛãºÿ·ÿþ}û8ÿ0YßÝ8ÿ¨úËÿ€wÿ½–£ÿAšY?hïÑû>÷ÉÆÛ˜@Kw{ýÅê¨ÿïÿûÿ.·½÷êÿ¯ÿÌ~Ýõ„Ã~Ì]¿ä$ŒówwÚïëŸ½Û³ß }ÿúÿwÿ·ï™×ùýPØ»ÿ¿ß`Ë÷Óÿ4õöÿ÷Ýý^ûߟïK»ûWk¾ÿºîÿ$ý÷øüþ: ¹ùÿî|û¢ÿÇrÿu¿_ÿ¦ÿþïoÚ³ù÷{€?ï»ÿ„ÿ@OßÐÿ¾Þ÷ÿ÷ëŸ(ÿ÷ÿßÚ½¿;ÿŽþC´ÿî¿ýüÛõÌ÷4î +ÏtÛ}¯Ž¾C¸-÷Éýïýÿw7ßD>»ó€€µ7¿¾ñÿÆ=ÙVùÿ—ÿûÿÿ¾€ìïÉíßÚü?Mëóf@ÿ°Ïëëïíÿ®ü-ÿî¿Ò÷V/òç÷þ {í÷þûúúŸßÿÿÿ ÷ÿKÿðþµÎÈÿýâˆÿ®ùýÿ€Ý¾ÎÍË»…ÿí÷W¾ÿ o÷úº¾æ ˧®ÿzæ½ÿmÿÝýÙîîþýߟÿãz²ÿò{öw§ÿùù‡Þxþ­íßÿ^ïŒü›ÿ]3îFï »[ßïGo \ No newline at end of file diff --git a/test/roms/bankswitching/E7/Bump 'N' Jump (1983) (Mattel).a26 b/test/roms/bankswitching/E7/Bump 'N' Jump (1983) (Mattel).a26 new file mode 100644 index 000000000..865cfba29 --- /dev/null +++ b/test/roms/bankswitching/E7/Bump 'N' Jump (1983) (Mattel).a26 @@ -0,0 +1,65 @@ +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿff~fff~~ff|ff~~f```f~|fffff|~``~``~```|``~~ffn`f~~~~``````BZZ~ffBbfn~vfF~fffff~``~fff~ff|fff~~f~`f~~ ±Ûª±Ñ……*…±Ó…±×…ıՅ„ñ٤Ą…††¤ÃˆÖ……*©…………©`…Ñ…Ó…Õ…×…Ù…Û©ý…Ò…Ô…Ö…Ø…Ú…Ü……*`¢……*¹Œð•ÑÈèèàÐô……*¹Œð•ÑÈèèà Ðô……*©ðLñ`…*¢þêê……*Lò…°……*†Â©Äΰð±Ê…¦¦Ñ©•€ˆÄÏ°±Ì…©¦¦Ó•€¦Â…,……*©Äΰ±Ê…ˆÄÏ°±Ì…©Äΰ±Ê„¨¥ã…+ð-%É……*„¨¥ê…±Å…±Ç…©¤ÂˆÄÏ°±Ì…ÀðOÆã©Lò¥ä%é……*„¨¥ë…±å…±ç…©¤ÂˆÄÏ°±Ì…Àð ©Æä……*Äΰ±Êð…ˆÄÏ°±Ì…ðnLVñ¦áÐ`L +óL%ó…µ³ªµ‡…Îðò†Ñµ™…ʈÄÏ𠩈Р±Ì…ˆ±Ì…Ä……*©…µ€)Éz¥Ä…µ“…µ€… )é8éÐü………*µ«…©……Ä…,L•ñµ³ªµ‡…Ïð‰†Ó©Äΰ±Êˆ……*…µ€)ÉCµ™…Ì¥µ“…µ€…!)ééÐü………*µ«…Äΰ±Ê…ˆ…,Lžñéü…¥Ä…µ“…µ€… L|ò8éÐü…µ™…̵“…µ€…!LÉò……*©Äΰ±Ê…ˆÄÏ°±Ì…ÊÐæ`ˆÐL$òÄÏ°±Ì…Ð…ÏLVñ……*ÊÐù`……*¥Ãê¥ê…êêê êˆÐü……©…%…&©À… ©Ð…!©……*………… … ©€…… ©………+……*¢ :ó  ñ……* ¾ð¥ñ¢Ù Öô……*©,……¢ :ó ¾ð©…Ê…Ë…Ì¥ñÐ ©…Ê……*Lúóø¥ËeñæÊ……*eñæÊeñæÊeñæÊeñæÊ…ËØ……*¢ :ó  ñ……*©€…… ¾ð……*¥Ê¢Ñ Öô……*¥Ë¢Õ Öô……*¥Ì¢Ù Öô……*¢`©ÅÑІÑÅÓІÓÅÕІՅ…*©,…… ¾ð  ñ……*¢ + :ó©€…… ¾ð¥ði…ÃJJJJª¥Ã)É +0¥Ãi…Ãø¥Ã}ñôآم…* Öô……*©,……¢ :ó ¾ð¥ð)ª¼¶ð½ºð…… ñ¢ :ó……* ¾ð¢ :ó`……*…ÃJJJJ¨¹i÷•¥Ã)¨¹i÷•`$06BHT`frx… „ „©À… ©Ð…!ê êˆÐü……©…%…&¢©……*…………… … ©Š ©………+……*©… …±Ûª±Ñ……*…±Ó…±×…ıՅ„ñ٤Ą…††¤ÃˆÖ……*©…%…&……©D…… ¢……*¹Mý……¥âj°8íh÷ûê¥â††ˆàLÅõ8íh÷û¥âê¥â††ˆË……*©……¥î)ª½i÷…Ñ¥íJJJJª½i÷…Ó¥í)ª½i÷…Õ……*©… …©… ©…!©……ê……©…©…©¶…… ……*©… …©ý…Ø…Ú¢`¥ó¢R†×¢`¥î)ð¥¿)ð¢Y†Ù©…!……*±Ñ…±Ó…±×ª­h÷ê±Õ…©,…†±Ù……+©¶…ˆÖ……*©…………Ä¢þµ³ªµ³…×¥ÎÉÿЩ)…Ù +…ÕI¨……*µ™™Ê–јJ¨µ‡™Îµ“™µ«™µ€™Â¦×˜¤ÕÅÙÐÕ……*¥Â)¨¥Â¥Â… ˆÐý………*¥Ã)¨¥Ã¥Ã…!ˆÐý…„ ……*¤ãȘ%ɨ±Å…±Ç…©…%…,©…&©¡åᨅ+……*©… …¥òÉðð É0ÉÐLBó……*©… ¥ê…¥áÉðÄÏ°±Ì…¥áÉð +Éð LòL–ñL‡ñLVñLÜñ`#*18?ððð`ýFýýýý`ý¥øÆø……¢ ½y÷•ÑÊø`©Š……©ý…Ò…Ô…Ö…Ø…Ú…Ü¥Ý¢Ñ Úô¥Þ¢Õ Úô¥ß¢ÙLÚôCopyright 1983 Mattel Dave Akers Jeff Ratcliff Pat Dulong €€€BBBG€€€JNEEEŠ +€€€BBBG€€Š + + +JNNRT€‚„„@@OO€€€BBBC€‚„„@@OO„„BBBC€‚€€ + + + +–BBG€€@@SRER € + + +Š–VNSEEERTE€„„€@@SRER€€@@SE € €€Š + + + + + + + +VASEŽ„ŠŠŠVAGCIIICBBGCHCCIICC@€ + + + +–NNSEER€ ŠVASRERRTRŠ +Š–NNSRR €@@GCIIIIC€€€BBS€„€BBGCHCCIICC@€@@SE€€@@SE€€@@SREEETEŠ + + +Š + +–NNC€@@G€€„„@@SRERRTRUR@BG€€@@S€ €BBS€€‚‚‚BBG‚@@G€Š + + +€–VNSEEEETEUE€€€BBG€ € € €BBGÀ@G€‚‚‚‚B@SEE€€ + + +€€@@SEEERTRR€BBGHHCC IIICQC€„„„––D@SRERRTRUREERRTR€ €€B@SEER€ü@üü@üü@üJüJü„ü@üËünüÿ„¾ü@üJüEüÿ„Jünüÿ„Jü|ü„¿ü4üü0üü0üü0ü¶ü4ü¿ü¿ü„Jü|üÿ„JüXüÿ„ËüJü„ËüEüÿ„Ëü|üÿ„ËüXüÿ„¿ü üLtôLêô¥òÉðÐ#­‚)Щ…ò…Ý…Þ…ß…ï…ñ©…à©…âL¯ôLŽþÉL×ô¥«)ðÉððmÉ°ð É€ðºÉPð¹¥€Ð+ ¥ì + +e‡8é¥ȹêɄТL#ô¢ —þ©ð…«©@…¹L^ô¥ ¥ 0­î𢠗þ©€…«©x…¹¥8é…L^ô¥«É ÐLêô©@…“`¥¹ðHƹ©íîLŽþ¥¹Ð%¥i…©P…«©…¹ø­í8é í­îéîØLbôƹ©……«©…ŸLbô…“LbôÆâ¥â©ð…ò©…‡©…â…ê…ë…óLŽþLøô©î© í©P…©"…‡©…«©@…“LŽþ¥¹Ð…«LbôƹLbô¥ð)ª½µö…ý½ö…Ĥïðˆ±Ã0ˆÐù„ï±Ã)…ó + + +¨¢¹ó•ÅÈèàÐõ¹ó¦ðÐJi²LFõ¥ð)yóª½Åö…ê©-…ì…ã…ä ©¢™«–‡™ŸˆÐõLÍô¥ò0LÉÐLö¥«Éðð? ¥îР¥íÉP¥¿)Ð+¥íÉu0ÈLžõÉð¥íÉ20È„Â¥á8åÂ0…áL´õi…áL¿õ¥ì…ã©0…äLðþæì ¹«)É_ ¹‡8陇ÈÀÐé¥ìÉ0ðL´õ©…ã…ì¥ê…ëæï¥ïÉ`Ð;©…ï…óæð¥ðÉcЩ…ð©ÿ…ò©…ô…ö©…÷…õL´õ©…ò¢øµÝuÊ•ÝÊ÷Ø©…ñ¥ð)ª½µö…ѽ½ö…Ò¤ï±Ñ)…ó + + +i…Ó©ió…Ô ¹Å™å±Ó™Åˆò ±ÓÉ„Ð…êLŠö¦ðÐJi²Lˆö¥ð)qÓª½Åö…êø©eß…ß©eÞ…Þ©eÝ…ÝÅà0¥ài…à¥âÉðæâØL´õ`À €à@ ðððñññòòDà*ุ4©…Ä¢þµ³ªµ³¨Éÿð+¹‡ð&µ‡Éð 8ù‡É °µ8ù…ÃIÿiÉ0˜ªLÖö¥Äð¢L—þ`µ«0í¹«0è©`Õ«ðÙ«ð©PÕ«ðÙ«ðLR÷©°™«L÷©À™«L÷©°•«L÷©À•«L÷µ«àðÉ ð¹«ÀðÉ ðLÄ÷©…Ä© •«™«„µ¥)¨¹ô÷•¹¤Â†Â¹¥)ª½ô÷™¹¦Â©ú™Ÿ©•Ÿ¥Ã0µ¥) P•¥¹¥)  Lé÷µ¥)  •¥¹¥) PLé÷¥Ã0µ¥) (•¥¹¥) ØLé÷µ¥) Ø•¥¹¥) (™¥˜ªµ³¨L÷-¥òÉððÉТ††`Æõð ¥òÐLcòÆ÷ð,`¦ô¥òð0½òLFð½IòLFð­‚)Щ…Lcò½"ñ _ðLð¦ö¥ò0½1òL[ð½Vò Æð`ÉÿÐ(¢¥òð†††ò†ô†öÉÿÐæò©<…õ…÷`†ô©…õhhL#ð…Ã)ª½ñ¨)…˜0©Ð© …¥ÃJJJJÉ¢ð +¤òð¢ Т†ª½ñ…õæô`ÉÿТ††`…Ã)ª½ñ¨)…˜0©Ð© …¥ÃJJJJɢ𢠆ª½ñ…÷æö` :8b †‡ˆ‹Œ›4ðD9ðI5ðEx4ðD9ðI5ðE|4ðD9ðI5ðEDH7ðGBGDGbðBvHCwDFxEGt9ðID7ðGEH6ðFGCA@‚ðR#xS&dðT(w+)$'X'v*%(&4ðD8ðH7ðGyHEDHDEy4ðð$9ð ð)HDu4ðð$9ð ð)DEy4ðð$9ð ð)(&s4ðð$9ð ð)HDu4ðð$9ð ð)+)u4ðð$9ð ð)$'v3ðð#7ðð'##bðBCHGCFDHFGEDGDyrFH3ðCGDvHE7ðGDIÿ4à”à”à444ਤ¨4à”à”à´àð¤ÿ7à—à—à777ধ¦7à—à—à·àð§ÿÇ7¦§¨Ç¤¨¦§¨×ÿÄ4¨¤¥Ä©¥¨¤¥Ôÿ¥öЩ…À©…©…¦î½{ò…`Æ÷Ðæö¦ö½°òÉÿЩ……ö`½vó…÷¦ö½°ò…½ó¨)…˜JJJJ…` +  + + + ÿÿÿ ÿÿÿÿO@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@ÿ‰ŠŠ‰…ƒÿ…‰‰…ÿÅÅÅEEEEÅÿMÿ‡‰ŠŒ‹Š‰ˆ‡†…ƒ‚ÿ…‡‰ŠŒ‹Š‰ˆ‡†…„ƒ‚ÿ + + +ÿÿÿÿÿ +ÿ +ÿ¥ó)…ó)@ð¥¿)Ð¥ÀÉ𢠗þ¥ó €…ó¢¥êÉ„ð¥ëɄТÿ†Ó¥³Ð`¢þ µ³™×ȪÀÐõ¥ðð nö „¹תµ¥)…ÄàÐLõ¥òLˆõµ«ð +Éð7LæõL6öµ‡ÉÐL"õµ¹Ð"¥îЩ•¥L€ô¥ÄÉРµ‡8几û”Ÿ©ÿ•¹Ö¹µ€Ð (µÉT°ÉG°L›ôÉ` Ø”¥¥Ó¥Â)ðLˆõ©p•«Lõµ«Éð—¥ïÉ^Lˆõ¤ÂÀ0 ¹Õ¨¹‡8õ‡É°¹ŸÉìð©ú•Ÿ©•¹Lõ¤ÂÀ%¹Ù¨µ‡8ù‡É°¥îЩР¹ŸÉð©•Ÿ©•¹µ¥Ä•¥¤ÂÈÀðL)ô`Še¿)ÐQ¤×¹‡É–°H¥êÉ„ðB©àð µEÁ)i…Ĩ¹£ö•“¥îÐ àð#©•‡©Lkõ©­•‡©P•©ð•Ÿ©ÿ•¹ Ø¥¿0 (”¥Lõ©•¥•Ÿµ¹Ð©•‡©•¥•Ÿ©•«LõÖ¹©•¥•Ÿµ‡0ãÉ0ßLõàðµ€ÐQ©ÿ…ø©øeÞ…Þ©eÝ…Ý¥ñÉ™ði…ñ؆â —þ¦Ã©ð•«©@•¹LõÉðð”Épð­É ðºÉ°ðÜÉÀðºÉ`ð5ÉðLõµ¹ðÖ¹Lõ (¹¥0 Ø˜•¥L’õµ¹ð Ö¹©•¥•ŸLõ©•«LõL›õ¥¾ðƾLõ©ô…˜¤Ü©`™«¥Œ8陇¥’™©™¥©™“…°©…Œ©ü…¤Lõ¥°Éð.¥ŒÉ‚Ð(¤Ü¹‡ÉЩ™«©#™¹©…°©…˜©…¾©…¤¢L—þ`ü²š€ô!ñáÑÁ±¡‘rbRB2"òâÒ²¢’scSC3#óãÓó£“tdTD4$ôäÔÄ´¤”ueUE5%õåÕŵ¥•vfVF6&öæÖƶ¦–wgWG7'÷ç×Ç·§—xhXH8(øèØȸ¨˜yiYI9) ùšššššššš ¹«)pÉ_° ¹‡8åᙇÈÀðL1÷©ú…Ë…Í ¹«Éðй¹JJJª½µþ™“¢¹¹É轺÷L‰÷¹¥) +ª¥¿9´÷Ðè½¼÷8ù‡™™ˆÀ­«É…Э¹ÉZÉ0¥‡i…‡©¬8凅™`ÀÔèü8L`t$$$ˆˆÔÔ „±¢ÿ–³¢þˆµ³†Âª¹‡Õ‡ô–³¦Â”³¢þˆé ¢þȵ³ªÐú„Î`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºîª:¨ºþº¸ºîª¸*ºþº:ACg=æÚ¦<~Z~<‚Âæ¼g[e<~Z~<Û<ÿ$ç4ÿ$ç~B~ÿ<ç$÷<ç$~B~~ÃÃÃÃÃ~½ÿ¥’’¾¾þþ¦¦¦¦$$<ÿ¥îÐ¥íÉ!ø¥í8é…í¥îé…îØ`¥Ái)…Á¢ à0µŸ +8j8j8j +LeÿJJ)þLeÿµŸIÿieÁJJJJJIÿiL„ÿeÁJJJJJu‡ÝÅÿà àð©L§ÿ½ÅÿL§ÿݹÿÐi•‡Êž¢´¹—ö•€Êö` T®®®®® !"#gýgýgý \ No newline at end of file diff --git a/test/roms/bankswitching/E7/Burgertime (1982) (Mattel).a26 b/test/roms/bankswitching/E7/Burgertime (1982) (Mattel).a26 new file mode 100644 index 000000000..65cd1acb2 Binary files /dev/null and b/test/roms/bankswitching/E7/Burgertime (1982) (Mattel).a26 differ diff --git a/test/roms/bankswitching/E7/Masters of the Universe - The Power of He-Man (1983) (Mattel).a26 b/test/roms/bankswitching/E7/Masters of the Universe - The Power of He-Man (1983) (Mattel).a26 new file mode 100644 index 000000000..74a946621 Binary files /dev/null and b/test/roms/bankswitching/E7/Masters of the Universe - The Power of He-Man (1983) (Mattel).a26 differ diff --git a/test/roms/bankswitching/E7/fruitcake29Oct09.bin b/test/roms/bankswitching/E7/fruitcake29Oct09.bin new file mode 100644 index 000000000..6516164fa Binary files /dev/null and b/test/roms/bankswitching/E7/fruitcake29Oct09.bin differ diff --git a/test/roms/bankswitching/E7/fruitcake_22Oct09.bin b/test/roms/bankswitching/E7/fruitcake_22Oct09.bin new file mode 100644 index 000000000..456c2a6e2 Binary files /dev/null and b/test/roms/bankswitching/E7/fruitcake_22Oct09.bin differ diff --git a/test/roms/bankswitching/EF/64kbb.EFEF_tagged.bin b/test/roms/bankswitching/EF/64kbb.EFEF_tagged.bin new file mode 100644 index 000000000..1c574f8f9 Binary files /dev/null and b/test/roms/bankswitching/EF/64kbb.EFEF_tagged.bin differ diff --git a/test/roms/bankswitching/EF/EF.bin b/test/roms/bankswitching/EF/EF.bin new file mode 100644 index 000000000..8038b3c55 Binary files /dev/null and b/test/roms/bankswitching/EF/EF.bin differ diff --git a/test/roms/bankswitching/EF/RobotZed_07.bas.bin b/test/roms/bankswitching/EF/RobotZed_07.bas.bin new file mode 100644 index 000000000..5ea0d9953 Binary files /dev/null and b/test/roms/bankswitching/EF/RobotZed_07.bas.bin differ diff --git a/test/roms/bankswitching/EF/megaboyEF.bin b/test/roms/bankswitching/EF/megaboyEF.bin new file mode 100644 index 000000000..cb8cde22a Binary files /dev/null and b/test/roms/bankswitching/EF/megaboyEF.bin differ diff --git a/test/roms/bankswitching/EFSC/64kSC.EFSC_tagged.bin b/test/roms/bankswitching/EFSC/64kSC.EFSC_tagged.bin new file mode 100644 index 000000000..89fb09f12 Binary files /dev/null and b/test/roms/bankswitching/EFSC/64kSC.EFSC_tagged.bin differ diff --git a/test/roms/bankswitching/EFSC/Distopia0.95_NTSC.bas.bin b/test/roms/bankswitching/EFSC/Distopia0.95_NTSC.bas.bin new file mode 100644 index 000000000..ff4edd986 Binary files /dev/null and b/test/roms/bankswitching/EFSC/Distopia0.95_NTSC.bas.bin differ diff --git a/test/roms/bankswitching/EFSC/EFSC.bin b/test/roms/bankswitching/EFSC/EFSC.bin new file mode 100644 index 000000000..8025a8145 Binary files /dev/null and b/test/roms/bankswitching/EFSC/EFSC.bin differ diff --git a/test/roms/bankswitching/F4/AVGN KO Boxing 2009-09-06 NTSC.bin b/test/roms/bankswitching/F4/AVGN KO Boxing 2009-09-06 NTSC.bin new file mode 100644 index 000000000..64ac6011b Binary files /dev/null and b/test/roms/bankswitching/F4/AVGN KO Boxing 2009-09-06 NTSC.bin differ diff --git a/test/roms/bankswitching/F4/Asteroids Attack (2020) (Demo, Game Select).bin b/test/roms/bankswitching/F4/Asteroids Attack (2020) (Demo, Game Select).bin new file mode 100644 index 000000000..af58232bb Binary files /dev/null and b/test/roms/bankswitching/F4/Asteroids Attack (2020) (Demo, Game Select).bin differ diff --git a/test/roms/bankswitching/F4SC/Fatal Run (NTSC prototype).bin b/test/roms/bankswitching/F4SC/Fatal Run (NTSC prototype).bin new file mode 100644 index 000000000..d936473e6 Binary files /dev/null and b/test/roms/bankswitching/F4SC/Fatal Run (NTSC prototype).bin differ diff --git a/test/roms/bankswitching/F6/Acid Drop (1992) (Salu) (PAL) [!].a26 b/test/roms/bankswitching/F6/Acid Drop (1992) (Salu) (PAL) [!].a26 new file mode 100644 index 000000000..2f0d2767d Binary files /dev/null and b/test/roms/bankswitching/F6/Acid Drop (1992) (Salu) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F6/Acid Drop (1992) (Salu) (PAL) [b1].a26 b/test/roms/bankswitching/F6/Acid Drop (1992) (Salu) (PAL) [b1].a26 new file mode 100644 index 000000000..c9ffe790e Binary files /dev/null and b/test/roms/bankswitching/F6/Acid Drop (1992) (Salu) (PAL) [b1].a26 differ diff --git a/test/roms/bankswitching/F6/Acid Drop (NTSC Conversion) (TJ).a26 b/test/roms/bankswitching/F6/Acid Drop (NTSC Conversion) (TJ).a26 new file mode 100644 index 000000000..1c27745bc Binary files /dev/null and b/test/roms/bankswitching/F6/Acid Drop (NTSC Conversion) (TJ).a26 differ diff --git a/test/roms/bankswitching/F6/Battlezone TC by Thomas Jentzsch (2 joystick Hack).a26 b/test/roms/bankswitching/F6/Battlezone TC by Thomas Jentzsch (2 joystick Hack).a26 new file mode 100644 index 000000000..8f97a3a0e Binary files /dev/null and b/test/roms/bankswitching/F6/Battlezone TC by Thomas Jentzsch (2 joystick Hack).a26 differ diff --git a/test/roms/bankswitching/F6/California Games (1988) (Epyx) (PAL) [!].a26 b/test/roms/bankswitching/F6/California Games (1988) (Epyx) (PAL) [!].a26 new file mode 100644 index 000000000..cf76cd7b1 Binary files /dev/null and b/test/roms/bankswitching/F6/California Games (1988) (Epyx) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F6/California Games (1988) (Epyx) [!].a26 b/test/roms/bankswitching/F6/California Games (1988) (Epyx) [!].a26 new file mode 100644 index 000000000..1024f14a0 Binary files /dev/null and b/test/roms/bankswitching/F6/California Games (1988) (Epyx) [!].a26 differ diff --git a/test/roms/bankswitching/F6/Double Dragon (1989) (Activision) (PAL) [!].a26 b/test/roms/bankswitching/F6/Double Dragon (1989) (Activision) (PAL) [!].a26 new file mode 100644 index 000000000..1d0afb0c4 Binary files /dev/null and b/test/roms/bankswitching/F6/Double Dragon (1989) (Activision) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F6/Double Dragon (1989) (Activision).a26 b/test/roms/bankswitching/F6/Double Dragon (1989) (Activision).a26 new file mode 100644 index 000000000..4f75f5a00 Binary files /dev/null and b/test/roms/bankswitching/F6/Double Dragon (1989) (Activision).a26 differ diff --git a/test/roms/bankswitching/F6/Garfield (Prototype).a26 b/test/roms/bankswitching/F6/Garfield (Prototype).a26 new file mode 100644 index 000000000..3b0e268d7 --- /dev/null +++ b/test/roms/bankswitching/F6/Garfield (Prototype).a26 @@ -0,0 +1,23 @@ +­ùÿ¥¼°Ž©€…ƒ…Ñ©……©ƒ…§©¦…©ð…‚Ì🩀……›…œ……Ž…©¤…‰¢À…‚ÊÐû©½…©ð…‚Ì🥪©ÿЈ©………©…ª©Ú…©ð…‚Ì🀀€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€­ö쀭÷¿ì€­øßì€ùÿ쀀€€€€ð€ð€ð­ùÿ¥¼°Ž©€…ƒ…Ñ©……©ƒ…§©¦…©ð…‚Ìð¿©€……›…œ……Ž…©„…‰¢À…‚ÊÐû©½…©ð…‚Ì𿥪©ÿЈ©€……©…ª©Ú…©ð…‚Ìð¿€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€­ö쀭÷¿ì€­øßì€ùÿ쀀€€€€ð€ð€ð­ùÿ©…………©…¥Õ… ©… + }Ó¢  ãÒ¢ Ô¥Õ… ©… ¸Ò ªÓ _Ò ÚÒ ÔLðß©………¥Õ… ©… +¢ ½ÇÓ•´Êø©'…… ¶Ô…¢ …¹Û…¹¡Ú…¹²Ú…ÈÊÐë¢ Ô t yÔ¢ Ô¢ …¹Û…¹öÚ…¹Û…ÈÊÐë ÔLðß©………© +…… ¶Ô¢W Ô  yÔ¢V Ô ÔLðß©…¥Õ… }Ó¢d ÓÓ¦œ ïÓ©¯…Š¥ÑÐ¥†)@ЩLþЩ… ©%…Ù¢ Ô¢  !Ô¥Ó… OÓ……, ªÓ _Ò ÚÒ ÔLðß©…¥Õ… ¢ Ô¥†) Щ?LDÑ©[…Š…¥†)@Щ…ÙL]Ñ©…Ù©0…Š¥Ó…¢l ÓÓ¦œ ïÓ OÓ©…… ¢  OÔ¥ÙÉð +¥7©…¢…Ú¢Q ÓÓ¢Q ïÓ¥Ó…©ÿ… ©…Ø©……©$…¥†)hЩL¸Ñ© +…¢$ ©…À Þ…©… òÝ ûÝ¢ ( .Þ àÝ éÝ žÒ ÚÒ ÔLðß©…¥Õ… ¸Ò ªÓ¢  òÝ ûÝ¥†)@ЩLÒ©… .Þ àÝ é݆¥‹…‰¥Œ…Š ¸Ò ªÓ¢  òÝ ûÝ¥†)PЩLAÒ©… .Þ àÝ é݆¢ Ô žÒ ÚÒ ÔLðߥɅÁ¢ ƒ ZÞ¢…¥É…©ÿ……ˆÊÐð Ô¢ + ZÞ¢…¥É…©ÿ……ˆÊÐð Ô¢ ZÞ¢ …¹Û…¹öÚ…¹Û…ÈÊÐë`¥Ó…¦ ÓÓ¦œ ïÓ ÍÒ OÓ`¥Ð¥×ð©… ` ùÒ¢ Ô`…¹9Û…¹)Û…¹1Û…ÈÊÐë`…¤§¹ê×Éÿð…¢< ïÓ©…¥§É°©…—©'…¢ …¤ˆ±«…ðƈ¥—Щ…ÊÐé©ÿ…—…©…¥˜…… ¶Ô  yÔ`©'…¢$©äÙ°¤Š±­ðÆŠäš……±¯…¤‰°±«…ðƉÊÐÙ`©…Á© …À¦À½AÛ…“½MÛ…”½YÛ…•½eÛ…–¦À¼qÛ¢ ZÞÆÀÐÜ`©…“©…”©…•©…–`êÙùÙÚÚ&Ú5Ú2Õ§Õ×u×ÙuÙ8¥Žé…Ž½=ß)¨½=ß…ˆý……!…`½=ß)¨½=ß…ˆý…… ……*`…©………ˆ`…ÊÐû`©½…©ð…‚`©… +…©… ……êêêêêêêê¹åÚ…¹¡Ú…¹²Ú…ÈÊÐÛ©… +`©… +…¹åÚ…¹¡Ú…¹²Ú…êêêêêê¹ÃÚ…¹ÔÚ…ÈÊÐÛ`„À¤À±´……±¶…±¸…±º…Á±¼ª±¾¨¥Á…†„„ÆÀØ©……………%…&……`…© „ ………%…&„„„„„!ê……©ð… ……*`"MQQM"?;3766<|næÆÏÏÆÀÀæ~~6LBBNRRRL Ëì÷ûüþþokI{Ž ///?ogW\MWW_;o_?>>>? ;++=>/75 mýÍÍí}= Íûs `cs:¼„6vn^>H¶ËµµJ66ÆÎ\=!lnvz|mÓ­­RllHvöèüœlìÜØpP0ppðpppp0<ÜÞ.~rlnv6xpþ’’’’’’’’’þ’’’’’’’’’þllllllllllllllllll`—”d’’aðøøìÞ^oo·÷{;]oç÷ûøüýÿÿÿÿÿÿÿüãÏ¿?ÿÿÿÿÿÿñäÎΰ¹;ÇïOÿÿÿÿÿÿÿø÷OŸø÷¯_ß¾¼€¿¿¿¿¿ßßO ¼¯Õêer9Ïφ†††Ïö¶6‰‰É‰‰‰†?}~~||¼Øæÿÿ£¼?ÿÿÿÿÿÿÿÿ?¿ßÏîåó÷ûûýþ?ŸÏïòùÿÿÿÿÿÿÿÿÿü{§ß/pßßÞ\ïïïÏÏßß–„yïoõzý^ÏÇÁ<=››99ÀÀؘÿÿlÈÈlþþþlŒˆ‹Ž6/?2hØØ88||TªTªT(GG((((2222ÖÖÖØÖØÖØÖ$$$'$$$û ÐØÔ´tÌøà€€À@€ÀÀààààððððððààøüüþþ~¾Ž¼¼xøðððà Àððøðx¼ÜÌüü\ ØØXÐØØÐØ0`ÀÀÀà` ` `ààóûÛƒƒûû‹›ó㥥¥¹¥¥¥9;wffffv~> @@@ „Ì´„„„„AAB|BB|„„„ü„H0BBB~B$(D‚‚‚‚þ@ þ~@@~@@~~@@|@@~xDBBBDxff<?ÿ€Ààðøüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ56789:;<%&'()*+,ÿ?ÿÿÿÿÿÿÿÿÿþüøðàÀ€ÒÓÔÕÖ×ØÙÂÃÄÅÆÇÈÉ +ƒÇïÿ?ÿ..,*(&$‰†‰†‰†‰†‰††üxè4ô”èxüÿ~JUUUJ~ÿïï÷÷ßßûûlŒˆ‹Ž6/?2hØØïï÷÷ßßûû61ÑqlôüL ªªªªþþªªªªªªªªªªªþþªªª(€ÿÿÿÿÿÿ~ÿÿÿÿÿÿÿ~PXÈ°úú~|6/:55:-% xxxüü  +Xx xXØ8 8Ø22222222GG((((22222222GG((((DDDDDDDDDDD&&&""×&&&222222×××××ש…­©Ü…®`©ð…¯©Ü…°`©…­©Ø…®`©0…¯©Ø…°`…¥À… ¹zÖ…¹žÖ…êêêêêêêêêêê¥Ø… ÈÊÐÝ…©… `…±­…±¯…¥“……꥔……꥕……꥖……ˆÊÐ׆ `©… …±­…¥Á…꥓……꥔……꥕……꥖……ˆÊÐÖ`3#óãÓ󣓃dTD4$ôäÔÄ´¤”„eUE5%õåÕŵ¥•…fVF6&öæÖƶ¦–†gWG7'÷ç×Ç·§—‡hXH8(øèØȸ¨˜ˆiYI9) ùéÙɹ©™‰jZJ:* +úêÚʺªšŠk[K;+ ûëÛË»«›‹l\L<, üìÜ̼¬œŒm]M=- ýíÝͽ­­öŸl­÷¿l­øßl­ùÿlððð­ùÿØx¢ÿš¢ÿ©•ÊÐû©…ƒ………  ù Zø©…„©…‡…ª©……………¢†©,–­‚)ð+­‚)ÐB¥‡ÉÐ +¥ I… ©?…‡¥ Ð ZøLið iø©……Lwð ~ø©……©…ƒ…§…Ä…Æ……©…„…ªL’𩅇Ƈ¥…)ª½³ù…½ºù…‚LÆÿ­„Ðû¥…)ª½Áù…½Èù…‚LÆÿ…©…©#–¥…)ª½Ïù…½Öù…‚LÆÿ­„ÐûæÏÐæÐæ†æªL)ð¥ƒÐ ù­‚)ÐL‘ò­‚)ÐL‘ò¥¤ðF¥¤É~Щ…Â¥¤ÉP©…Ó¥Âð+8¥œé…œ©…ÂLNñ¥¤ÉOЩ…©…Ó¥Â𠥜i…œ©…ÂL‘ò¦Ì¥œÝ•öÐ /õ¢¥Ë=ËöÐ:¢¥Ë=ËöÐ% ø0 ¢¥ËËö…Ë¥Öð ¥ÌÉð ÆÌL”ñ¥ÌÉ ðæ̦̥œÝ•öÐ Fõ Yõ©…Ù¥œÉÐ ñô¥ÍÉ +ðæÍ ñôLÂñ©…Í¥¨iÔ…¨°L‘ò¦Ì¥œÝ•öð¥¨iÔ…¨¥ÒÐ¥ÖðÆœæ™Lóñæœæ™©…È¥×ðE¦ÈµÉЦͼñö¦ÈµöˆÐû¦ÈµÉ$¦È©Œ•¥†E¦È•‘¦È¥=Óö…¥ØðU¥×I…×L‰òL‚ò¦ÈµÉЦͼñö¦ÈµÖˆÐû¦ÈµÉ°$¦È©•¥†E¦È•‘¦È¥=Óö…¥Øð¥×I…×L‰ò©…ØLò©…ØƜ札€ ø)ð.­€ ø) ð$­€ ø)@ð ­€ ø)€ðLÉòæ¥Ð©…LÓò¥†©……†¦È¥=ËöÐ;¥¢¦ÈݯöÐ2¦È¥Ëö…¦ÈµŠÝÁöð ¦Í½ö¼-ö ªø Ý÷¦È¥¡Ëö…¡¦Í½#÷¦È•¦È¥=ËöÐ'¦Í½æö)ЦͽFö¦È•Š…ŒLó¦È½·ö•Š…Œ©…Ló¦ÈµŠÝÁöð*¦È֦ȵð¦Í½_ö¦È•Š…ŒLó¦È¥¡=Óö…¡©¦È•L…ó©…£©…¤ ê÷©¦È•Š…Œ¥£ÐLÀóƤ¥¤Ð&¥§ðƧ¥§Ð©…Ÿ ñô 3ø© …Š©ÿ…©…©…£…˦ÆÐ ó÷½÷…½<÷…¦ÆðÆÆ¥ÃÉЦÄÐ ø½t÷…© …ÆÄ¥ÖЩLúó©-…‰…‹…ˆ¥šÉ¦Í½æö)€ð¥ŠÉ›Ð ¥ÖЩEL ô©]…‰¥§Ð. 3ø¥¤Ð'©…‰…‹…ˆ¥©Ð©…ª…†©…©¥ª)ÿЩ……©…ª ˆø¥Ÿð¥„Ð Cø¥ƒð©…„¥Ÿð „ÀLvô „À¥ÑÐ0¥ÍÉÐ*¥œÉ\Ð$©…υЩ…Ñ…Ò þ÷ø¥³e³…³¥²e²…²¥±e±…±Ø¥Ñð)春Ð)ð!©…Ò…Ñ ñô©'…˜¢¥Ë=Óö…ËæÍ©…ɤÀL×ô Ýø©…¢¦Í¥§ð½Ûö……½©ö…ÉL¦ð©…œ©…š©…Ì…©…×…©…`­€ ø)@Ð¥œÉÆœ­€ ø)€Ð¥œÉ„°æœ`­€)@Щ…Ö­€)€Ð©…Ö`© +…™ ø ¢¥Ë=Óö…Ë`¢¥Ë=ËöÐ2¢¥Ë=ËöÐ *øÐ$¢¥ËËö…Ë¥™ðÆ™L”õ *øð ¢¥Ë=Óö…Ë© +…™¦™½xö…š` ˆøL¦ð¥7©…¢……,LÚð¥ª)ÿЦͽÛö……©… ©…ª¢ ½èù•´ÊøLÚð¥ª)ÿÐ%©……… ø ó÷ Mø©…œ©…š©…ª¢ ½èù•´ÊøLÚð……,¥Úð©Ø…Š©…ÚLÚðPPPPPPPPPPPPPPPPPPPPP›››››››››››››››››››››››››####  "$$" "2DTdt„2ÿääääääääääØØØØØØØØØØ€@ ¿ßï÷ûýþ€€€€‡‡C!ÿ‡C!ÿ‡C! !"#$%&'()*+,*)('&%$#!  + ()*+,()*+,()*+,()*+,()*+,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüûúùø÷öõôóòñðïîíìëêéèçæåäãâáàßÞÝÜÛÚÙØ×¥¨iÔ…¨`¥£Ð©…Æ© …`©9…Æ©…`©…………Æ`©…é*…Ä©ÿ…`©…………Ã`¥Ÿð¥=`¥<`¦Ÿð8****`­€ ø) `¥Ÿð© …˜LBø©'…˜`©’©…ž©…©……’…‘©…`©…¶…³©…²…±… `©…¶…³©…±…²…´…µ©… `¢©•±Êù`­‚)ð¥<0©…ƒ…„…Ñ©…… ~ø©…§ ù`¦±øe³…³˜e²…²¥±i…±Øä±ð榦ͥ¦Ý +÷Щ…¦¥§Éðæ§ þ÷`© +…À¹±)ª½Ýù¦À•´ÆÀÆÀ¹±JJJJª½Ýù¦À•´ÆÀˆÆÀÙ¢µ´ÉDÐ +©”•´èèà +ð` Cø©…Â…Ú…Ö…Ó…Ò©…Í©…Ñ…Ì…Ë…Ï…Ð…†…©………Ä…Æ………¢…£…¤…¦…¥…Ÿ…×…Ù ø ó÷©…Ô©…É©…Õ©…œ© +…™©…š©'…˜©…©ÿ…—©…‰©…ˆ©…«©Ö…¬©…­©Ü…®©ð…¯©Ü…°¢ ½èù•´Êø©…ƒ`œììììõððð°ðBÔ* êÐÐÐѰѱ¢¢DD¢õõõö°õDLT\dlt|„Œ””ÚœÚÚžÚŸÚ Ú¥‚)ðÉðð"¥‚)ÐÉÐð¥‚)°É°ð­öŸl­÷¿l­øßl­ùÿlððð \ No newline at end of file diff --git a/test/roms/bankswitching/F6/Midnight Magic (1984) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F6/Midnight Magic (1984) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..2b2a74845 Binary files /dev/null and b/test/roms/bankswitching/F6/Midnight Magic (1984) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F6/Midnight Magic (1984) (Atari).a26 b/test/roms/bankswitching/F6/Midnight Magic (1984) (Atari).a26 new file mode 100644 index 000000000..e20291c04 Binary files /dev/null and b/test/roms/bankswitching/F6/Midnight Magic (1984) (Atari).a26 differ diff --git a/test/roms/bankswitching/F6/Pete Rose Baseball (1988) (Absolute).a26 b/test/roms/bankswitching/F6/Pete Rose Baseball (1988) (Absolute).a26 new file mode 100644 index 000000000..b3fcc7982 Binary files /dev/null and b/test/roms/bankswitching/F6/Pete Rose Baseball (1988) (Absolute).a26 differ diff --git a/test/roms/bankswitching/F6/Rampage! (1989) (Activision) (PAL) [!].a26 b/test/roms/bankswitching/F6/Rampage! (1989) (Activision) (PAL) [!].a26 new file mode 100644 index 000000000..34c279f4a Binary files /dev/null and b/test/roms/bankswitching/F6/Rampage! (1989) (Activision) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F6/Rampage! (1989) (Activision) [!].a26 b/test/roms/bankswitching/F6/Rampage! (1989) (Activision) [!].a26 new file mode 100644 index 000000000..927dde5ed Binary files /dev/null and b/test/roms/bankswitching/F6/Rampage! (1989) (Activision) [!].a26 differ diff --git a/test/roms/bankswitching/F6/Rampage! (1989) (Activision) [b1].a26 b/test/roms/bankswitching/F6/Rampage! (1989) (Activision) [b1].a26 new file mode 100644 index 000000000..c9effb11b Binary files /dev/null and b/test/roms/bankswitching/F6/Rampage! (1989) (Activision) [b1].a26 differ diff --git a/test/roms/bankswitching/F6/RealSports Boxing (1987) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F6/RealSports Boxing (1987) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..f25030fce Binary files /dev/null and b/test/roms/bankswitching/F6/RealSports Boxing (1987) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F6/RealSports Boxing (1987) (Atari).a26 b/test/roms/bankswitching/F6/RealSports Boxing (1987) (Atari).a26 new file mode 100644 index 000000000..d51abf023 Binary files /dev/null and b/test/roms/bankswitching/F6/RealSports Boxing (1987) (Atari).a26 differ diff --git a/test/roms/bankswitching/F6/Sentinel (1990) (Atari).a26 b/test/roms/bankswitching/F6/Sentinel (1990) (Atari).a26 new file mode 100644 index 000000000..b0647c5b5 Binary files /dev/null and b/test/roms/bankswitching/F6/Sentinel (1990) (Atari).a26 differ diff --git a/test/roms/bankswitching/F6/Solaris (1986) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F6/Solaris (1986) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..57d3132d9 Binary files /dev/null and b/test/roms/bankswitching/F6/Solaris (1986) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F6/Solaris (1986) (Atari).a26 b/test/roms/bankswitching/F6/Solaris (1986) (Atari).a26 new file mode 100644 index 000000000..0ed3d8d3d Binary files /dev/null and b/test/roms/bankswitching/F6/Solaris (1986) (Atari).a26 differ diff --git a/test/roms/bankswitching/F6/Summer Games (1987) (Epyx) (PAL) [!].a26 b/test/roms/bankswitching/F6/Summer Games (1987) (Epyx) (PAL) [!].a26 new file mode 100644 index 000000000..d1c1ed725 Binary files /dev/null and b/test/roms/bankswitching/F6/Summer Games (1987) (Epyx) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F6/Summer Games (1987) (Epyx).a26 b/test/roms/bankswitching/F6/Summer Games (1987) (Epyx).a26 new file mode 100644 index 000000000..3e0946eda Binary files /dev/null and b/test/roms/bankswitching/F6/Summer Games (1987) (Epyx).a26 differ diff --git a/test/roms/bankswitching/F6/Super Box (CCE).a26 b/test/roms/bankswitching/F6/Super Box (CCE).a26 new file mode 100644 index 000000000..d3269e859 Binary files /dev/null and b/test/roms/bankswitching/F6/Super Box (CCE).a26 differ diff --git a/test/roms/bankswitching/F6/Tomcat - The F-14 Flight Simulator (1988) (Absolute) [!].a26 b/test/roms/bankswitching/F6/Tomcat - The F-14 Flight Simulator (1988) (Absolute) [!].a26 new file mode 100644 index 000000000..a02dc8763 Binary files /dev/null and b/test/roms/bankswitching/F6/Tomcat - The F-14 Flight Simulator (1988) (Absolute) [!].a26 differ diff --git a/test/roms/bankswitching/F6/Tomcat - The F-14 Flight Simulator (1988) (Absolute) [a1].a26 b/test/roms/bankswitching/F6/Tomcat - The F-14 Flight Simulator (1988) (Absolute) [a1].a26 new file mode 100644 index 000000000..a81368dd3 Binary files /dev/null and b/test/roms/bankswitching/F6/Tomcat - The F-14 Flight Simulator (1988) (Absolute) [a1].a26 differ diff --git a/test/roms/bankswitching/F6/Tomcat - The F-14 Flight Simulator (2002) (Skyworks) [!].a26 b/test/roms/bankswitching/F6/Tomcat - The F-14 Flight Simulator (2002) (Skyworks) [!].a26 new file mode 100644 index 000000000..93b762782 Binary files /dev/null and b/test/roms/bankswitching/F6/Tomcat - The F-14 Flight Simulator (2002) (Skyworks) [!].a26 differ diff --git a/test/roms/bankswitching/F6SC/Crystal Castles (1984) (Atari) (NTSC) (Prototype) [!].a26 b/test/roms/bankswitching/F6SC/Crystal Castles (1984) (Atari) (NTSC) (Prototype) [!].a26 new file mode 100644 index 000000000..060b2151e Binary files /dev/null and b/test/roms/bankswitching/F6SC/Crystal Castles (1984) (Atari) (NTSC) (Prototype) [!].a26 differ diff --git a/test/roms/bankswitching/F6SC/Crystal Castles (1984) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F6SC/Crystal Castles (1984) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..ecba7c2c2 Binary files /dev/null and b/test/roms/bankswitching/F6SC/Crystal Castles (1984) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F6SC/Crystal Castles (1984) (Atari) [p1].a26 b/test/roms/bankswitching/F6SC/Crystal Castles (1984) (Atari) [p1].a26 new file mode 100644 index 000000000..9259262e6 Binary files /dev/null and b/test/roms/bankswitching/F6SC/Crystal Castles (1984) (Atari) [p1].a26 differ diff --git a/test/roms/bankswitching/F6SC/Crystal Castles (1984) (Atari).a26 b/test/roms/bankswitching/F6SC/Crystal Castles (1984) (Atari).a26 new file mode 100644 index 000000000..83ca22ee5 Binary files /dev/null and b/test/roms/bankswitching/F6SC/Crystal Castles (1984) (Atari).a26 differ diff --git a/test/roms/bankswitching/F6SC/Dark Chambers (1988) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F6SC/Dark Chambers (1988) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..e07cf7f29 Binary files /dev/null and b/test/roms/bankswitching/F6SC/Dark Chambers (1988) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F6SC/Dark Chambers (1988) (Atari).a26 b/test/roms/bankswitching/F6SC/Dark Chambers (1988) (Atari).a26 new file mode 100644 index 000000000..f7277e85c Binary files /dev/null and b/test/roms/bankswitching/F6SC/Dark Chambers (1988) (Atari).a26 differ diff --git a/test/roms/bankswitching/F6SC/Dig Dug (1983) (Atari).a26 b/test/roms/bankswitching/F6SC/Dig Dug (1983) (Atari).a26 new file mode 100644 index 000000000..ad8e9e639 Binary files /dev/null and b/test/roms/bankswitching/F6SC/Dig Dug (1983) (Atari).a26 differ diff --git a/test/roms/bankswitching/F6SC/Dig Dug (V1) (1983) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F6SC/Dig Dug (V1) (1983) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..326a101f6 Binary files /dev/null and b/test/roms/bankswitching/F6SC/Dig Dug (V1) (1983) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F6SC/Dig Dug (V2) (1983) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F6SC/Dig Dug (V2) (1983) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..3ba7706ac Binary files /dev/null and b/test/roms/bankswitching/F6SC/Dig Dug (V2) (1983) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F6SC/Jr. Pac-Man (1984) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F6SC/Jr. Pac-Man (1984) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..59046f136 Binary files /dev/null and b/test/roms/bankswitching/F6SC/Jr. Pac-Man (1984) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F6SC/Jr. Pac-Man (1984) (Atari) [!].a26 b/test/roms/bankswitching/F6SC/Jr. Pac-Man (1984) (Atari) [!].a26 new file mode 100644 index 000000000..79e4f382f Binary files /dev/null and b/test/roms/bankswitching/F6SC/Jr. Pac-Man (1984) (Atari) [!].a26 differ diff --git a/test/roms/bankswitching/F6SC/Jr. Pac-Man (1986) (Atari) [!].a26 b/test/roms/bankswitching/F6SC/Jr. Pac-Man (1986) (Atari) [!].a26 new file mode 100644 index 000000000..48508e163 Binary files /dev/null and b/test/roms/bankswitching/F6SC/Jr. Pac-Man (1986) (Atari) [!].a26 differ diff --git a/test/roms/bankswitching/F6SC/Millipede (1984) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F6SC/Millipede (1984) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..927edf935 Binary files /dev/null and b/test/roms/bankswitching/F6SC/Millipede (1984) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F6SC/Millipede (1984) (Atari).a26 b/test/roms/bankswitching/F6SC/Millipede (1984) (Atari).a26 new file mode 100644 index 000000000..f2acc1e47 Binary files /dev/null and b/test/roms/bankswitching/F6SC/Millipede (1984) (Atari).a26 differ diff --git a/test/roms/bankswitching/F6SC/Radar Lock (1989) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F6SC/Radar Lock (1989) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..f1840a3e2 Binary files /dev/null and b/test/roms/bankswitching/F6SC/Radar Lock (1989) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F6SC/Radar Lock (1989) (Atari).a26 b/test/roms/bankswitching/F6SC/Radar Lock (1989) (Atari).a26 new file mode 100644 index 000000000..7aafe653a Binary files /dev/null and b/test/roms/bankswitching/F6SC/Radar Lock (1989) (Atari).a26 differ diff --git a/test/roms/bankswitching/F6SC/Secret Quest (1989) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F6SC/Secret Quest (1989) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..f190e4f04 Binary files /dev/null and b/test/roms/bankswitching/F6SC/Secret Quest (1989) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F6SC/Secret Quest (1989) (Atari).a26 b/test/roms/bankswitching/F6SC/Secret Quest (1989) (Atari).a26 new file mode 100644 index 000000000..f25c7fa43 Binary files /dev/null and b/test/roms/bankswitching/F6SC/Secret Quest (1989) (Atari).a26 differ diff --git a/test/roms/bankswitching/F6SC/Sprint Master (1988) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F6SC/Sprint Master (1988) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..22556c382 Binary files /dev/null and b/test/roms/bankswitching/F6SC/Sprint Master (1988) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F6SC/Sprint Master (1988) (Atari).a26 b/test/roms/bankswitching/F6SC/Sprint Master (1988) (Atari).a26 new file mode 100644 index 000000000..648d319d7 Binary files /dev/null and b/test/roms/bankswitching/F6SC/Sprint Master (1988) (Atari).a26 differ diff --git a/test/roms/bankswitching/F6SC/Super Football (1988) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F6SC/Super Football (1988) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..67d59ca6d Binary files /dev/null and b/test/roms/bankswitching/F6SC/Super Football (1988) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F6SC/Super Football (1988) (Atari).a26 b/test/roms/bankswitching/F6SC/Super Football (1988) (Atari).a26 new file mode 100644 index 000000000..62eaae4a4 Binary files /dev/null and b/test/roms/bankswitching/F6SC/Super Football (1988) (Atari).a26 differ diff --git a/test/roms/bankswitching/F8/Aquaventure (1983) (Atari) (Prototype).a26 b/test/roms/bankswitching/F8/Aquaventure (1983) (Atari) (Prototype).a26 new file mode 100644 index 000000000..387de9a39 Binary files /dev/null and b/test/roms/bankswitching/F8/Aquaventure (1983) (Atari) (Prototype).a26 differ diff --git a/test/roms/bankswitching/F8/Aquaventure (CCE).a26 b/test/roms/bankswitching/F8/Aquaventure (CCE).a26 new file mode 100644 index 000000000..81bac0a71 Binary files /dev/null and b/test/roms/bankswitching/F8/Aquaventure (CCE).a26 differ diff --git a/test/roms/bankswitching/F8/Asteroids (1979) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F8/Asteroids (1979) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..0ed4431aa Binary files /dev/null and b/test/roms/bankswitching/F8/Asteroids (1979) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Asteroids (1979) (Atari) (PAL) [a1][!].a26 b/test/roms/bankswitching/F8/Asteroids (1979) (Atari) (PAL) [a1][!].a26 new file mode 100644 index 000000000..0e8d5acf9 Binary files /dev/null and b/test/roms/bankswitching/F8/Asteroids (1979) (Atari) (PAL) [a1][!].a26 differ diff --git a/test/roms/bankswitching/F8/Asteroids (1979) (Atari) (PAL) [a2][!].a26 b/test/roms/bankswitching/F8/Asteroids (1979) (Atari) (PAL) [a2][!].a26 new file mode 100644 index 000000000..f10c499a2 Binary files /dev/null and b/test/roms/bankswitching/F8/Asteroids (1979) (Atari) (PAL) [a2][!].a26 differ diff --git a/test/roms/bankswitching/F8/Asteroids (1979) (Atari) [!].a26 b/test/roms/bankswitching/F8/Asteroids (1979) (Atari) [!].a26 new file mode 100644 index 000000000..73599c405 Binary files /dev/null and b/test/roms/bankswitching/F8/Asteroids (1979) (Atari) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Asteroids (1979) (Atari) [a1][!].a26 b/test/roms/bankswitching/F8/Asteroids (1979) (Atari) [a1][!].a26 new file mode 100644 index 000000000..ccfe4ccbd Binary files /dev/null and b/test/roms/bankswitching/F8/Asteroids (1979) (Atari) [a1][!].a26 differ diff --git a/test/roms/bankswitching/F8/Asteroids 2 (Asteroids Hack).a26 b/test/roms/bankswitching/F8/Asteroids 2 (Asteroids Hack).a26 new file mode 100644 index 000000000..5854105c4 Binary files /dev/null and b/test/roms/bankswitching/F8/Asteroids 2 (Asteroids Hack).a26 differ diff --git a/test/roms/bankswitching/F8/Asteroids DC+ by Thomas Jentzsch (Asteroids Hack).a26 b/test/roms/bankswitching/F8/Asteroids DC+ by Thomas Jentzsch (Asteroids Hack).a26 new file mode 100644 index 000000000..478d1d408 Binary files /dev/null and b/test/roms/bankswitching/F8/Asteroids DC+ by Thomas Jentzsch (Asteroids Hack).a26 differ diff --git a/test/roms/bankswitching/F8/Asteroids SS (Asteroids Hack).a26 b/test/roms/bankswitching/F8/Asteroids SS (Asteroids Hack).a26 new file mode 100644 index 000000000..58e75c075 Binary files /dev/null and b/test/roms/bankswitching/F8/Asteroids SS (Asteroids Hack).a26 differ diff --git a/test/roms/bankswitching/F8/Asteroids [p1].a26 b/test/roms/bankswitching/F8/Asteroids [p1].a26 new file mode 100644 index 000000000..f53843df3 Binary files /dev/null and b/test/roms/bankswitching/F8/Asteroids [p1].a26 differ diff --git a/test/roms/bankswitching/F8/Battlezone (1983) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F8/Battlezone (1983) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..c26c2b17b Binary files /dev/null and b/test/roms/bankswitching/F8/Battlezone (1983) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Battlezone (1983) (Atari) (PAL) [a1][!].a26 b/test/roms/bankswitching/F8/Battlezone (1983) (Atari) (PAL) [a1][!].a26 new file mode 100644 index 000000000..9b942d84f Binary files /dev/null and b/test/roms/bankswitching/F8/Battlezone (1983) (Atari) (PAL) [a1][!].a26 differ diff --git a/test/roms/bankswitching/F8/Battlezone (1983) (Atari) [!].a26 b/test/roms/bankswitching/F8/Battlezone (1983) (Atari) [!].a26 new file mode 100644 index 000000000..8dee5f262 Binary files /dev/null and b/test/roms/bankswitching/F8/Battlezone (1983) (Atari) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Berenstain Bears (1982) (Coleco).a26 b/test/roms/bankswitching/F8/Berenstain Bears (1982) (Coleco).a26 new file mode 100644 index 000000000..ccf863c54 Binary files /dev/null and b/test/roms/bankswitching/F8/Berenstain Bears (1982) (Coleco).a26 differ diff --git a/test/roms/bankswitching/F8/Centipede (1982) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F8/Centipede (1982) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..ed1ce5fcb Binary files /dev/null and b/test/roms/bankswitching/F8/Centipede (1982) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Centipede (1982) (Atari) (Prototype) (PAL) [!].a26 b/test/roms/bankswitching/F8/Centipede (1982) (Atari) (Prototype) (PAL) [!].a26 new file mode 100644 index 000000000..4232271ef Binary files /dev/null and b/test/roms/bankswitching/F8/Centipede (1982) (Atari) (Prototype) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Centipede (1982) (Atari) [!].a26 b/test/roms/bankswitching/F8/Centipede (1982) (Atari) [!].a26 new file mode 100644 index 000000000..6befff16b Binary files /dev/null and b/test/roms/bankswitching/F8/Centipede (1982) (Atari) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Centipede 2k (2000) (PD).a26 b/test/roms/bankswitching/F8/Centipede 2k (2000) (PD).a26 new file mode 100644 index 000000000..210d5195f Binary files /dev/null and b/test/roms/bankswitching/F8/Centipede 2k (2000) (PD).a26 differ diff --git a/test/roms/bankswitching/F8/Cyber Goth Galaxian by Manuel Polik (Galaxian Hack).a26 b/test/roms/bankswitching/F8/Cyber Goth Galaxian by Manuel Polik (Galaxian Hack).a26 new file mode 100644 index 000000000..aea07c07c Binary files /dev/null and b/test/roms/bankswitching/F8/Cyber Goth Galaxian by Manuel Polik (Galaxian Hack).a26 differ diff --git a/test/roms/bankswitching/F8/Elk Attack (1987) (Atari).a26 b/test/roms/bankswitching/F8/Elk Attack (1987) (Atari).a26 new file mode 100644 index 000000000..0b6f9b8cc Binary files /dev/null and b/test/roms/bankswitching/F8/Elk Attack (1987) (Atari).a26 differ diff --git a/test/roms/bankswitching/F8/Galaxian (1983) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F8/Galaxian (1983) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..caa8cf4e5 Binary files /dev/null and b/test/roms/bankswitching/F8/Galaxian (1983) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Galaxian (1983) (Atari) (PAL) [a1][!].a26 b/test/roms/bankswitching/F8/Galaxian (1983) (Atari) (PAL) [a1][!].a26 new file mode 100644 index 000000000..1180a78b8 Binary files /dev/null and b/test/roms/bankswitching/F8/Galaxian (1983) (Atari) (PAL) [a1][!].a26 differ diff --git a/test/roms/bankswitching/F8/Galaxian (1983) (Atari) [!].a26 b/test/roms/bankswitching/F8/Galaxian (1983) (Atari) [!].a26 new file mode 100644 index 000000000..44078febb Binary files /dev/null and b/test/roms/bankswitching/F8/Galaxian (1983) (Atari) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Galaxian (1983) (CCE).a26 b/test/roms/bankswitching/F8/Galaxian (1983) (CCE).a26 new file mode 100644 index 000000000..77472a313 Binary files /dev/null and b/test/roms/bankswitching/F8/Galaxian (1983) (CCE).a26 differ diff --git a/test/roms/bankswitching/F8/Galaxian by Jess Ragan (Enhanced Graphics).a26 b/test/roms/bankswitching/F8/Galaxian by Jess Ragan (Enhanced Graphics).a26 new file mode 100644 index 000000000..f07a72755 Binary files /dev/null and b/test/roms/bankswitching/F8/Galaxian by Jess Ragan (Enhanced Graphics).a26 differ diff --git a/test/roms/bankswitching/F8/Gravitar (1988) (Atari) [!].a26 b/test/roms/bankswitching/F8/Gravitar (1988) (Atari) [!].a26 new file mode 100644 index 000000000..9dbd14cdf Binary files /dev/null and b/test/roms/bankswitching/F8/Gravitar (1988) (Atari) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Gravitar (1988) (Atari) [a1][!].a26 b/test/roms/bankswitching/F8/Gravitar (1988) (Atari) [a1][!].a26 new file mode 100644 index 000000000..bee28da54 Binary files /dev/null and b/test/roms/bankswitching/F8/Gravitar (1988) (Atari) [a1][!].a26 differ diff --git a/test/roms/bankswitching/F8/Gravitar (1988) (CCE).a26 b/test/roms/bankswitching/F8/Gravitar (1988) (CCE).a26 new file mode 100644 index 000000000..5c5725fa9 Binary files /dev/null and b/test/roms/bankswitching/F8/Gravitar (1988) (CCE).a26 differ diff --git a/test/roms/bankswitching/F8/H.E.R.O. (1984) (Activision) (PAL) [!].a26 b/test/roms/bankswitching/F8/H.E.R.O. (1984) (Activision) (PAL) [!].a26 new file mode 100644 index 000000000..322c3146a Binary files /dev/null and b/test/roms/bankswitching/F8/H.E.R.O. (1984) (Activision) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F8/H.E.R.O. (1984) (Activision) (PAL) [a1][!].a26 b/test/roms/bankswitching/F8/H.E.R.O. (1984) (Activision) (PAL) [a1][!].a26 new file mode 100644 index 000000000..ac7a8837a Binary files /dev/null and b/test/roms/bankswitching/F8/H.E.R.O. (1984) (Activision) (PAL) [a1][!].a26 differ diff --git a/test/roms/bankswitching/F8/H.E.R.O. (1984) (Activision) (PAL) [a2][!].a26 b/test/roms/bankswitching/F8/H.E.R.O. (1984) (Activision) (PAL) [a2][!].a26 new file mode 100644 index 000000000..93e44d84e Binary files /dev/null and b/test/roms/bankswitching/F8/H.E.R.O. (1984) (Activision) (PAL) [a2][!].a26 differ diff --git a/test/roms/bankswitching/F8/H.E.R.O. (1984) (Activision) [!].a26 b/test/roms/bankswitching/F8/H.E.R.O. (1984) (Activision) [!].a26 new file mode 100644 index 000000000..4242bd9ad Binary files /dev/null and b/test/roms/bankswitching/F8/H.E.R.O. (1984) (Activision) [!].a26 differ diff --git a/test/roms/bankswitching/F8/H.E.R.O. (1984) (Activision) [a1].a26 b/test/roms/bankswitching/F8/H.E.R.O. (1984) (Activision) [a1].a26 new file mode 100644 index 000000000..323d938e3 Binary files /dev/null and b/test/roms/bankswitching/F8/H.E.R.O. (1984) (Activision) [a1].a26 differ diff --git a/test/roms/bankswitching/F8/H.E.R.O. (1984) (Activision) [o1].a26 b/test/roms/bankswitching/F8/H.E.R.O. (1984) (Activision) [o1].a26 new file mode 100644 index 000000000..1e6c425f7 Binary files /dev/null and b/test/roms/bankswitching/F8/H.E.R.O. (1984) (Activision) [o1].a26 differ diff --git a/test/roms/bankswitching/F8/H.E.R.O. (1984) (CCE).a26 b/test/roms/bankswitching/F8/H.E.R.O. (1984) (CCE).a26 new file mode 100644 index 000000000..af262b9bb Binary files /dev/null and b/test/roms/bankswitching/F8/H.E.R.O. (1984) (CCE).a26 differ diff --git a/test/roms/bankswitching/F8/Joust (1982) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F8/Joust (1982) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..70caa6125 Binary files /dev/null and b/test/roms/bankswitching/F8/Joust (1982) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Joust (1982) (Atari) (PAL) [a1][!].a26 b/test/roms/bankswitching/F8/Joust (1982) (Atari) (PAL) [a1][!].a26 new file mode 100644 index 000000000..68a8c9c78 Binary files /dev/null and b/test/roms/bankswitching/F8/Joust (1982) (Atari) (PAL) [a1][!].a26 differ diff --git a/test/roms/bankswitching/F8/Joust (1982) (Atari).a26 b/test/roms/bankswitching/F8/Joust (1982) (Atari).a26 new file mode 100644 index 000000000..9b0972aa8 Binary files /dev/null and b/test/roms/bankswitching/F8/Joust (1982) (Atari).a26 differ diff --git a/test/roms/bankswitching/F8/Jungle Hunt (1982) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F8/Jungle Hunt (1982) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..19df8e2bb Binary files /dev/null and b/test/roms/bankswitching/F8/Jungle Hunt (1982) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Jungle Hunt (1982) (Atari) (PAL) [a1][!].a26 b/test/roms/bankswitching/F8/Jungle Hunt (1982) (Atari) (PAL) [a1][!].a26 new file mode 100644 index 000000000..990f7faf7 Binary files /dev/null and b/test/roms/bankswitching/F8/Jungle Hunt (1982) (Atari) (PAL) [a1][!].a26 differ diff --git a/test/roms/bankswitching/F8/Jungle Hunt (1982) (Atari) [!].a26 b/test/roms/bankswitching/F8/Jungle Hunt (1982) (Atari) [!].a26 new file mode 100644 index 000000000..eef2cb0be Binary files /dev/null and b/test/roms/bankswitching/F8/Jungle Hunt (1982) (Atari) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Jungle Hunt (1982) (CCE).a26 b/test/roms/bankswitching/F8/Jungle Hunt (1982) (CCE).a26 new file mode 100644 index 000000000..94b8a2288 Binary files /dev/null and b/test/roms/bankswitching/F8/Jungle Hunt (1982) (CCE).a26 differ diff --git a/test/roms/bankswitching/F8/Kung Fu Master (1984) (Activision) (PAL) [!].a26 b/test/roms/bankswitching/F8/Kung Fu Master (1984) (Activision) (PAL) [!].a26 new file mode 100644 index 000000000..73ee2ff89 Binary files /dev/null and b/test/roms/bankswitching/F8/Kung Fu Master (1984) (Activision) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Kung Fu Master (1984) (Activision) (PAL) [a1][!].a26 b/test/roms/bankswitching/F8/Kung Fu Master (1984) (Activision) (PAL) [a1][!].a26 new file mode 100644 index 000000000..62b89096d Binary files /dev/null and b/test/roms/bankswitching/F8/Kung Fu Master (1984) (Activision) (PAL) [a1][!].a26 differ diff --git a/test/roms/bankswitching/F8/Kung Fu Master (1984) (Activision).a26 b/test/roms/bankswitching/F8/Kung Fu Master (1984) (Activision).a26 new file mode 100644 index 000000000..387582156 Binary files /dev/null and b/test/roms/bankswitching/F8/Kung Fu Master (1984) (Activision).a26 differ diff --git a/test/roms/bankswitching/F8/Kung Fu Master (CCE).a26 b/test/roms/bankswitching/F8/Kung Fu Master (CCE).a26 new file mode 100644 index 000000000..74378e62a Binary files /dev/null and b/test/roms/bankswitching/F8/Kung Fu Master (CCE).a26 differ diff --git a/test/roms/bankswitching/F8/Mr. Roboto by Paul Slocum (Berzerk Hack).a26 b/test/roms/bankswitching/F8/Mr. Roboto by Paul Slocum (Berzerk Hack).a26 new file mode 100644 index 000000000..2fe4629e1 Binary files /dev/null and b/test/roms/bankswitching/F8/Mr. Roboto by Paul Slocum (Berzerk Hack).a26 differ diff --git a/test/roms/bankswitching/F8/Ms. Pac-Man (1982) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F8/Ms. Pac-Man (1982) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..2f2ab11ed Binary files /dev/null and b/test/roms/bankswitching/F8/Ms. Pac-Man (1982) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Ms. Pac-Man (1982) (Atari) (PAL) [a1][!].a26 b/test/roms/bankswitching/F8/Ms. Pac-Man (1982) (Atari) (PAL) [a1][!].a26 new file mode 100644 index 000000000..18cd7b190 Binary files /dev/null and b/test/roms/bankswitching/F8/Ms. Pac-Man (1982) (Atari) (PAL) [a1][!].a26 differ diff --git a/test/roms/bankswitching/F8/Ms. Pac-Man (1982) (Atari) [h1].a26 b/test/roms/bankswitching/F8/Ms. Pac-Man (1982) (Atari) [h1].a26 new file mode 100644 index 000000000..11084fadf Binary files /dev/null and b/test/roms/bankswitching/F8/Ms. Pac-Man (1982) (Atari) [h1].a26 differ diff --git a/test/roms/bankswitching/F8/Ms. Pac-Man (1982) (Atari).a26 b/test/roms/bankswitching/F8/Ms. Pac-Man (1982) (Atari).a26 new file mode 100644 index 000000000..4b10657b8 Binary files /dev/null and b/test/roms/bankswitching/F8/Ms. Pac-Man (1982) (Atari).a26 differ diff --git a/test/roms/bankswitching/F8/Ms. Pac-Man (1982) (CCE).a26 b/test/roms/bankswitching/F8/Ms. Pac-Man (1982) (CCE).a26 new file mode 100644 index 000000000..35d1ed351 Binary files /dev/null and b/test/roms/bankswitching/F8/Ms. Pac-Man (1982) (CCE).a26 differ diff --git a/test/roms/bankswitching/F8/Pengo (1984) (Atari).a26 b/test/roms/bankswitching/F8/Pengo (1984) (Atari).a26 new file mode 100644 index 000000000..f65d859df Binary files /dev/null and b/test/roms/bankswitching/F8/Pengo (1984) (Atari).a26 differ diff --git a/test/roms/bankswitching/F8/Pengo - 1 Player Only (1984) (Atari).a26 b/test/roms/bankswitching/F8/Pengo - 1 Player Only (1984) (Atari).a26 new file mode 100644 index 000000000..c0a3639c8 Binary files /dev/null and b/test/roms/bankswitching/F8/Pengo - 1 Player Only (1984) (Atari).a26 differ diff --git a/test/roms/bankswitching/F8/Phoenix (1982) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F8/Phoenix (1982) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..5417c5ab1 Binary files /dev/null and b/test/roms/bankswitching/F8/Phoenix (1982) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Phoenix (1982) (Atari) (PAL) [a1][!].a26 b/test/roms/bankswitching/F8/Phoenix (1982) (Atari) (PAL) [a1][!].a26 new file mode 100644 index 000000000..805ebe572 Binary files /dev/null and b/test/roms/bankswitching/F8/Phoenix (1982) (Atari) (PAL) [a1][!].a26 differ diff --git a/test/roms/bankswitching/F8/Phoenix (1982) (Atari).a26 b/test/roms/bankswitching/F8/Phoenix (1982) (Atari).a26 new file mode 100644 index 000000000..b4bb21f3d Binary files /dev/null and b/test/roms/bankswitching/F8/Phoenix (1982) (Atari).a26 differ diff --git a/test/roms/bankswitching/F8/Phoenix (1982) (CCE).a26 b/test/roms/bankswitching/F8/Phoenix (1982) (CCE).a26 new file mode 100644 index 000000000..40347e597 Binary files /dev/null and b/test/roms/bankswitching/F8/Phoenix (1982) (CCE).a26 differ diff --git a/test/roms/bankswitching/F8/Raiders of the Lost Ark (1982) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F8/Raiders of the Lost Ark (1982) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..1bc00d280 Binary files /dev/null and b/test/roms/bankswitching/F8/Raiders of the Lost Ark (1982) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Raiders of the Lost Ark (1982) (Atari).a26 b/test/roms/bankswitching/F8/Raiders of the Lost Ark (1982) (Atari).a26 new file mode 100644 index 000000000..5274c722f Binary files /dev/null and b/test/roms/bankswitching/F8/Raiders of the Lost Ark (1982) (Atari).a26 differ diff --git a/test/roms/bankswitching/F8/Spy Hunter (1983) (Sega) [!].a26 b/test/roms/bankswitching/F8/Spy Hunter (1983) (Sega) [!].a26 new file mode 100644 index 000000000..dc189113c Binary files /dev/null and b/test/roms/bankswitching/F8/Spy Hunter (1983) (Sega) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Vanguard (1982) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F8/Vanguard (1982) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..c6317774c Binary files /dev/null and b/test/roms/bankswitching/F8/Vanguard (1982) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F8/Vanguard (1982) (Atari) (PAL) [a1][!].a26 b/test/roms/bankswitching/F8/Vanguard (1982) (Atari) (PAL) [a1][!].a26 new file mode 100644 index 000000000..e3d215427 Binary files /dev/null and b/test/roms/bankswitching/F8/Vanguard (1982) (Atari) (PAL) [a1][!].a26 differ diff --git a/test/roms/bankswitching/F8/Vanguard (1982) (Atari).a26 b/test/roms/bankswitching/F8/Vanguard (1982) (Atari).a26 new file mode 100644 index 000000000..943973765 Binary files /dev/null and b/test/roms/bankswitching/F8/Vanguard (1982) (Atari).a26 differ diff --git a/test/roms/bankswitching/F8/Vanguard (CCE).a26 b/test/roms/bankswitching/F8/Vanguard (CCE).a26 new file mode 100644 index 000000000..f5d6e905a Binary files /dev/null and b/test/roms/bankswitching/F8/Vanguard (CCE).a26 differ diff --git a/test/roms/bankswitching/F8/cfg/a2600.cfg b/test/roms/bankswitching/F8/cfg/a2600.cfg new file mode 100644 index 000000000..90dde01f6 --- /dev/null +++ b/test/roms/bankswitching/F8/cfg/a2600.cfg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/test/roms/bankswitching/F8/cfg/default.cfg b/test/roms/bankswitching/F8/cfg/default.cfg new file mode 100644 index 000000000..02f098671 --- /dev/null +++ b/test/roms/bankswitching/F8/cfg/default.cfg @@ -0,0 +1,5 @@ + + + + + diff --git a/test/roms/bankswitching/F8SC/Defender II (1984) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F8SC/Defender II (1984) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..2bc9c59a4 Binary files /dev/null and b/test/roms/bankswitching/F8SC/Defender II (1984) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F8SC/Defender II (1984) (Atari) [b1].a26 b/test/roms/bankswitching/F8SC/Defender II (1984) (Atari) [b1].a26 new file mode 100644 index 000000000..8f9b713c6 Binary files /dev/null and b/test/roms/bankswitching/F8SC/Defender II (1984) (Atari) [b1].a26 differ diff --git a/test/roms/bankswitching/F8SC/Defender II (1984) (Atari).a26 b/test/roms/bankswitching/F8SC/Defender II (1984) (Atari).a26 new file mode 100644 index 000000000..06b4d24a2 Binary files /dev/null and b/test/roms/bankswitching/F8SC/Defender II (1984) (Atari).a26 differ diff --git a/test/roms/bankswitching/F8SC/Elevator Action (Atari) (Prototype).a26 b/test/roms/bankswitching/F8SC/Elevator Action (Atari) (Prototype).a26 new file mode 100644 index 000000000..4a44ee2d3 Binary files /dev/null and b/test/roms/bankswitching/F8SC/Elevator Action (Atari) (Prototype).a26 differ diff --git a/test/roms/bankswitching/F8SC/Stargate (1984) (Atari) (PAL) [!].a26 b/test/roms/bankswitching/F8SC/Stargate (1984) (Atari) (PAL) [!].a26 new file mode 100644 index 000000000..0d2322855 Binary files /dev/null and b/test/roms/bankswitching/F8SC/Stargate (1984) (Atari) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/F8SC/Stargate (1984) (Atari) [o1].a26 b/test/roms/bankswitching/F8SC/Stargate (1984) (Atari) [o1].a26 new file mode 100644 index 000000000..2d2b1d836 Binary files /dev/null and b/test/roms/bankswitching/F8SC/Stargate (1984) (Atari) [o1].a26 differ diff --git a/test/roms/bankswitching/F8SC/Stargate (1984) (Atari).a26 b/test/roms/bankswitching/F8SC/Stargate (1984) (Atari).a26 new file mode 100644 index 000000000..9ad3f1cd6 Binary files /dev/null and b/test/roms/bankswitching/F8SC/Stargate (1984) (Atari).a26 differ diff --git a/test/roms/bankswitching/FA/Mountain King (1983) (CBS Electronics).bin b/test/roms/bankswitching/FA/Mountain King (1983) (CBS Electronics).bin new file mode 100644 index 000000000..56b870d6a Binary files /dev/null and b/test/roms/bankswitching/FA/Mountain King (1983) (CBS Electronics).bin differ diff --git a/test/roms/bankswitching/FA2/Star Castle Arcade (165, Harmony).cu.bin b/test/roms/bankswitching/FA2/Star Castle Arcade (165, Harmony).cu.bin new file mode 100644 index 000000000..3a94dbbf3 Binary files /dev/null and b/test/roms/bankswitching/FA2/Star Castle Arcade (165, Harmony).cu.bin differ diff --git a/test/roms/bankswitching/FA2/fa2plus_test.bin b/test/roms/bankswitching/FA2/fa2plus_test.bin new file mode 100644 index 000000000..ccb94b4fe Binary files /dev/null and b/test/roms/bankswitching/FA2/fa2plus_test.bin differ diff --git a/test/roms/bankswitching/FE/Decathlon (1983) (Activision) (PAL) [!].a26 b/test/roms/bankswitching/FE/Decathlon (1983) (Activision) (PAL) [!].a26 new file mode 100644 index 000000000..dcfabf850 Binary files /dev/null and b/test/roms/bankswitching/FE/Decathlon (1983) (Activision) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/FE/Decathlon (1983) (Activision) (PAL) [b1].a26 b/test/roms/bankswitching/FE/Decathlon (1983) (Activision) (PAL) [b1].a26 new file mode 100644 index 000000000..c15334bc3 Binary files /dev/null and b/test/roms/bankswitching/FE/Decathlon (1983) (Activision) (PAL) [b1].a26 differ diff --git a/test/roms/bankswitching/FE/Decathlon (1983) (Activision) [!].a26 b/test/roms/bankswitching/FE/Decathlon (1983) (Activision) [!].a26 new file mode 100644 index 000000000..4be7efb82 Binary files /dev/null and b/test/roms/bankswitching/FE/Decathlon (1983) (Activision) [!].a26 differ diff --git a/test/roms/bankswitching/FE/Robot Tank (1983) (Activision) (PAL) [!].a26 b/test/roms/bankswitching/FE/Robot Tank (1983) (Activision) (PAL) [!].a26 new file mode 100644 index 000000000..6caf4cc36 Binary files /dev/null and b/test/roms/bankswitching/FE/Robot Tank (1983) (Activision) (PAL) [!].a26 differ diff --git a/test/roms/bankswitching/FE/Robot Tank (1983) (Activision) (PAL) [b1].a26 b/test/roms/bankswitching/FE/Robot Tank (1983) (Activision) (PAL) [b1].a26 new file mode 100644 index 000000000..643dd64d1 Binary files /dev/null and b/test/roms/bankswitching/FE/Robot Tank (1983) (Activision) (PAL) [b1].a26 differ diff --git a/test/roms/bankswitching/FE/Robot Tank (1983) (Activision) [!].a26 b/test/roms/bankswitching/FE/Robot Tank (1983) (Activision) [!].a26 new file mode 100644 index 000000000..4471fa1e8 Binary files /dev/null and b/test/roms/bankswitching/FE/Robot Tank (1983) (Activision) [!].a26 differ diff --git a/test/roms/bankswitching/FE/Robot Tank TV by Thomas Jentzsch (2 Joystick Hack).a26 b/test/roms/bankswitching/FE/Robot Tank TV by Thomas Jentzsch (2 Joystick Hack).a26 new file mode 100644 index 000000000..7e81acb2f Binary files /dev/null and b/test/roms/bankswitching/FE/Robot Tank TV by Thomas Jentzsch (2 Joystick Hack).a26 differ diff --git a/test/roms/bankswitching/FE/Space Shuttle (1983) (Activision) [FE].bin b/test/roms/bankswitching/FE/Space Shuttle (1983) (Activision) [FE].bin new file mode 100644 index 000000000..030c77fd2 Binary files /dev/null and b/test/roms/bankswitching/FE/Space Shuttle (1983) (Activision) [FE].bin differ diff --git a/test/roms/bankswitching/FE/Thwocker (Activision) (Prototype) [!].a26 b/test/roms/bankswitching/FE/Thwocker (Activision) (Prototype) [!].a26 new file mode 100644 index 000000000..844c840f8 Binary files /dev/null and b/test/roms/bankswitching/FE/Thwocker (Activision) (Prototype) [!].a26 differ diff --git a/test/roms/bankswitching/MDM/MDM-test.bin b/test/roms/bankswitching/MDM/MDM-test.bin new file mode 100644 index 000000000..2a172f1ed Binary files /dev/null and b/test/roms/bankswitching/MDM/MDM-test.bin differ diff --git a/test/roms/bankswitching/SB/menu_multicart128k.bin b/test/roms/bankswitching/SB/menu_multicart128k.bin new file mode 100644 index 000000000..ba51838f0 Binary files /dev/null and b/test/roms/bankswitching/SB/menu_multicart128k.bin differ diff --git a/test/roms/bankswitching/SB/t128.bin b/test/roms/bankswitching/SB/t128.bin new file mode 100644 index 000000000..03441590d Binary files /dev/null and b/test/roms/bankswitching/SB/t128.bin differ diff --git a/test/roms/bankswitching/SB/t256.bin b/test/roms/bankswitching/SB/t256.bin new file mode 100644 index 000000000..72da79783 Binary files /dev/null and b/test/roms/bankswitching/SB/t256.bin differ diff --git a/test/roms/bankswitching/Sub2K/2k.bin b/test/roms/bankswitching/Sub2K/2k.bin new file mode 100644 index 000000000..bcaafe540 Binary files /dev/null and b/test/roms/bankswitching/Sub2K/2k.bin differ diff --git a/test/roms/bankswitching/Sub2K/4k.bin b/test/roms/bankswitching/Sub2K/4k.bin new file mode 100644 index 000000000..2eae2f8b7 Binary files /dev/null and b/test/roms/bankswitching/Sub2K/4k.bin differ diff --git a/test/roms/bankswitching/Sub2K/Pong256B.bin b/test/roms/bankswitching/Sub2K/Pong256B.bin new file mode 100644 index 000000000..4947e18fa Binary files /dev/null and b/test/roms/bankswitching/Sub2K/Pong256B.bin differ diff --git a/test/roms/bankswitching/Sub2K/Pong512B.bin b/test/roms/bankswitching/Sub2K/Pong512B.bin new file mode 100644 index 000000000..fcb23fee8 Binary files /dev/null and b/test/roms/bankswitching/Sub2K/Pong512B.bin differ diff --git a/test/roms/bankswitching/Sub2K/Vong_1K.bin b/test/roms/bankswitching/Sub2K/Vong_1K.bin new file mode 100644 index 000000000..f1933d80f Binary files /dev/null and b/test/roms/bankswitching/Sub2K/Vong_1K.bin differ diff --git a/test/roms/bankswitching/UA/Fathon (Digivision).bin b/test/roms/bankswitching/UA/Fathon (Digivision).bin new file mode 100644 index 000000000..12a8e787b Binary files /dev/null and b/test/roms/bankswitching/UA/Fathon (Digivision).bin differ diff --git a/test/roms/bankswitching/UA/FunkyFish.bin b/test/roms/bankswitching/UA/FunkyFish.bin new file mode 100644 index 000000000..f10a64de3 Binary files /dev/null and b/test/roms/bankswitching/UA/FunkyFish.bin differ diff --git a/test/roms/bankswitching/UA/Mickey (Digivision).bin b/test/roms/bankswitching/UA/Mickey (Digivision).bin new file mode 100644 index 000000000..3e8293ff4 Binary files /dev/null and b/test/roms/bankswitching/UA/Mickey (Digivision).bin differ diff --git a/test/roms/bankswitching/UA/Pleiades.bin b/test/roms/bankswitching/UA/Pleiades.bin new file mode 100644 index 000000000..0878ebb72 Binary files /dev/null and b/test/roms/bankswitching/UA/Pleiades.bin differ diff --git a/test/roms/bankswitching/UA/Time Pilot (Rentacom).bin b/test/roms/bankswitching/UA/Time Pilot (Rentacom).bin new file mode 100644 index 000000000..90f86e7f7 Binary files /dev/null and b/test/roms/bankswitching/UA/Time Pilot (Rentacom).bin differ diff --git a/test/roms/bankswitching/UA/UA_Limited.bin b/test/roms/bankswitching/UA/UA_Limited.bin new file mode 100644 index 000000000..5cb088b29 Binary files /dev/null and b/test/roms/bankswitching/UA/UA_Limited.bin differ diff --git a/test/roms/bankswitching/UA/Vanguard (Rentacom).bin b/test/roms/bankswitching/UA/Vanguard (Rentacom).bin new file mode 100644 index 000000000..6b9429868 Binary files /dev/null and b/test/roms/bankswitching/UA/Vanguard (Rentacom).bin differ diff --git a/test/roms/bankswitching/UA/ginger.zip b/test/roms/bankswitching/UA/ginger.zip new file mode 100644 index 000000000..4246d4f50 Binary files /dev/null and b/test/roms/bankswitching/UA/ginger.zip differ diff --git a/test/roms/bankswitching/UA/gingerUA.bin b/test/roms/bankswitching/UA/gingerUA.bin new file mode 100644 index 000000000..2f6a6f932 Binary files /dev/null and b/test/roms/bankswitching/UA/gingerUA.bin differ diff --git a/test/roms/bankswitching/WD/Pursuit of the Pink Panther (Probe) (Prototype) [bad dump].bin b/test/roms/bankswitching/WD/Pursuit of the Pink Panther (Probe) (Prototype) [bad dump].bin new file mode 100644 index 000000000..3970d0602 Binary files /dev/null and b/test/roms/bankswitching/WD/Pursuit of the Pink Panther (Probe) (Prototype) [bad dump].bin differ diff --git a/test/roms/bankswitching/WD/Pursuit of the Pink Panther (Probe) (Prototype) [fixed].bin b/test/roms/bankswitching/WD/Pursuit of the Pink Panther (Probe) (Prototype) [fixed].bin new file mode 100644 index 000000000..187d81d57 Binary files /dev/null and b/test/roms/bankswitching/WD/Pursuit of the Pink Panther (Probe) (Prototype) [fixed].bin differ diff --git a/test/roms/bankswitching/_code/0840_EconoBanking.asm b/test/roms/bankswitching/_code/0840_EconoBanking.asm new file mode 100644 index 000000000..b655664cc --- /dev/null +++ b/test/roms/bankswitching/_code/0840_EconoBanking.asm @@ -0,0 +1,102 @@ +;;A bankswitching demo for the 0840 EconoBanking technique. 2 4K banks (8K) +;;By: Rick Skrbina 3/29/09 + + processor 6502 + include "vcs.h" + include "macro.h" + + + seg.u vars + org $80 +BG_Color ds 1 + + seg Bank0 + org $E000 + rorg $F000 +Start0 + nop + nop + nop + + CLEAN_START + +Start_Frame + lda #2 + sta VBLANK + sta VSYNC + sta WSYNC + sta WSYNC + sta WSYNC + lsr + sta VSYNC + ldy #37 +VerticalBlank + sta WSYNC + dey + bne VerticalBlank + + sta VBLANK + + ldy #192 +Picture + sta WSYNC + dey + bne Picture + + lda #2 + sta VBLANK + + ldy #30 +OverScan + sta WSYNC + dey + bne OverScan + + jsr SwchTo1 + + lda BG_Color + sta COLUBK + + jmp Start_Frame + + org $EFE0 + rorg $FFE0 +SwchTo1 + lda $0FFF + nop + nop + nop + nop + nop + nop + rts + + org $EFFC + rorg $FFFC + .word Start0 + .byte "B0" + + seg Bank1 + org $F000 + rorg $F000 +Start1 + lda $0800 + +Bank1Sub + + inc BG_Color + rts + + org $FFE0 + rorg $FFE0 + + nop + nop + nop + jsr Bank1Sub + lda $0800 + + org $FFFC + rorg $FFFC + .word Start1 + .byte "B1" diff --git a/test/roms/bankswitching/_code/0840_EconoBanking.bin b/test/roms/bankswitching/_code/0840_EconoBanking.bin new file mode 100644 index 000000000..45dbbb187 Binary files /dev/null and b/test/roms/bankswitching/_code/0840_EconoBanking.bin differ diff --git a/test/roms/bankswitching/_code/3F.asm b/test/roms/bankswitching/_code/3F.asm new file mode 100644 index 000000000..c0f2ac9d7 --- /dev/null +++ b/test/roms/bankswitching/_code/3F.asm @@ -0,0 +1,118 @@ +;;A Bankswitcing demo for TigerVision's 3F scheme. 4 2K slices +;;By Rick Skrbina 5/4/09 + +TIA_BASE_ADDRESS = $40 ;Use $40-$7F for TIA access so there is no undesired Bankswitch + + processor 6502 + include "vcs.h" + include "macro.h" + + + seg.u vars + org $80 + + + seg slice0 + org $0000 + rorg $F000 +Slice0 + lda #$1F + sta COLUBK + rts + + seg slice1 + org $0800 + rorg $F000 +Slice1 + lda #$2F + sta COLUBK + rts + + seg slice2 + org $1000 + rorg $F000 +Slice2 + lda #$3F + sta COLUBK + rts + + seg slice3 + org $1800 + rorg $F800 +Slice3 + CLEAN_START + +Start_Frame + lda #2 + sta VBLANK + sta VSYNC + sta WSYNC + sta WSYNC + sta WSYNC + lsr + sta VSYNC + + ldy #37 +VerticalBlank + sta WSYNC + dey + bne VerticalBlank + + lda #0 + sta VBLANK + + lda #$0F + sta COLUBK + + ldy #48 +Picture0 + sta WSYNC + dey + bne Picture0 + + lda #0 + sta $3F + jsr Slice0 + + ldy #48 +Picture1 + sta WSYNC + dey + bne Picture1 + + lda #1 + sta $3F + jsr Slice1 + + ldy #48 +Picture2 + sta WSYNC + dey + bne Picture2 + + lda #2 + sta $3F + jsr Slice2 + + ldy #48 +Picture3 + sta WSYNC + dey + bne Picture3 + + lda #2 + sta VBLANK + + ldy #30 +OverScan + sta WSYNC + dey + bne OverScan + + jmp Start_Frame + + + org $1FFC + rorg $FFFC + .word Slice3 + .byte "RS" diff --git a/test/roms/bankswitching/_code/3F.bin b/test/roms/bankswitching/_code/3F.bin new file mode 100644 index 000000000..028691848 Binary files /dev/null and b/test/roms/bankswitching/_code/3F.bin differ diff --git a/test/roms/bankswitching/_code/E0.asm b/test/roms/bankswitching/_code/E0.asm new file mode 100644 index 000000000..58fed489d --- /dev/null +++ b/test/roms/bankswitching/_code/E0.asm @@ -0,0 +1,178 @@ +;;A bankswtiching demo for Parker Bros. E0 scheme. 8 1K slices. +;;By Rick Skrbina 5/3/09 + + processor 6502 + include "vcs.h" + include "macro.h" + + seg.u vars + org $80 + + seg slice0 + org $0000 + rorg $F000 +Slice0 + lda #$1F + sta COLUBK + rts + + seg slice1 + org $0400 + rorg $F000 +Slice1 + lda #$2F + sta COLUBK + rts + + seg slice2 + org $0800 + rorg $F000 +Slice2 + lda #$3F + sta COLUBK + rts + + seg slice3 + org $0C00 + rorg $F000 +Slice3 + lda #$4F + sta COLUBK + rts + + seg slice4 + org $1000 + rorg $F000 +Slice4 + lda #$5F + sta COLUBK + rts + + seg slice5 + org $1400 + rorg $F000 +Slice5 + lda #$6F + sta COLUBK + rts + + seg slice6 + org $1800 + rorg $F000 +Slice6 + lda #$7F + sta COLUBK + rts + + seg slice7 + org $1C00 + rorg $FC00 +Slice7 + CLEAN_START + +Start_Frame + lda #2 + sta VBLANK + sta VSYNC + sta WSYNC + sta WSYNC + sta WSYNC + lda #0 + sta VSYNC + + ldy #37 +VerticalBlank + sta WSYNC + dey + bne VerticalBlank + + lda #0 + sta VBLANK + + lda #$0F + sta COLUBK + + ldy #24 +Picture0 + sta WSYNC + dey + bne Picture0 + + lda $1FE0 + jsr Slice0 + + ldy #24 +Picture1 + sta WSYNC + dey + bne Picture1 + + lda $1FE1 + jsr Slice1 + + ldy #24 +Picture2 + sta WSYNC + dey + bne Picture2 + + lda $1FE2 + jsr Slice2 + + ldy #24 +Picture3 + sta WSYNC + dey + bne Picture3 + + lda $1FE3 + jsr Slice3 + + ldy #24 +Picture4 + sta WSYNC + dey + bne Picture4 + + lda $1FE4 + jsr Slice4 + + ldy #24 +Picture5 + sta WSYNC + dey + bne Picture5 + + lda $1FE5 + jsr Slice5 + + ldy #24 +Picture6 + sta WSYNC + dey + bne Picture6 + + lda $1FE6 + jsr Slice6 + + ldy #24 +Picture7 + sta WSYNC + dey + bne Picture7 + + lda #2 + sta VBLANK + + ldy #30 +OverScan + sta WSYNC + dey + bne OverScan + + jmp Start_Frame + + org $1FFC + rorg $FFFC + .word Slice7 + .byte "RS" diff --git a/test/roms/bankswitching/_code/E0.bin b/test/roms/bankswitching/_code/E0.bin new file mode 100644 index 000000000..bd4a31b8b Binary files /dev/null and b/test/roms/bankswitching/_code/E0.bin differ diff --git a/test/roms/bankswitching/_code/E7.asm b/test/roms/bankswitching/_code/E7.asm new file mode 100644 index 000000000..3ae1a340d --- /dev/null +++ b/test/roms/bankswitching/_code/E7.asm @@ -0,0 +1,250 @@ +;;A bankswtiching Demo using M-Network's E7 Scheme. 8 2K Banks + 2K RAM +;;By: Rick Skrbina 4/9/09 +;; +;;ROM Banks accesed via $1FE0-$1FE6 and mapped from $F000-$F7FF +;;First 1K RAM block accessed via $1FE7 and loaded from $F000-$F7FF +;;Second 1K block is split up into 256b parts, selected by $FFF8-$FFFB +;;The 256b chuncks are loaded from $F800-$F9FF + + processor 6502 + include "vcs.h" + include "macro.h" + +Bank0_Color_Read equ Bank0_Color_Write+1024 + + + seg.u RIOT_RAM + org $80 + + + seg.u E7_RAM_0 ;1K Block + org $F000 + +Bank0_Color_Write ds 1 + + seg.u E7_RAM_1 ;256b Blocks + org $F800 + + + seg.u E7_RAM_2 + org $F800 + + + seg.u E7_RAM_3 + org $F800 + + seg.u E7_RAM_4 + org $F800 + + seg bank0 + org $0000 + rorg $F000 +Start0 + + lda #$10 + sta COLUBK + + rts + + + + + seg bank1 + org $0800 + rorg $F000 +Start1 + lda #$20 + sta COLUBK + + rts + + + + + seg bank2 + org $1000 + rorg $F000 +Start2 + lda #$30 + sta COLUBK + + rts + + + + + seg bank3 + org $1800 + rorg $F000 +Start3 + lda #$40 + sta COLUBK + + rts + + + + + seg bank4 + org $2000 + rorg $F000 +Start4 + lda #$50 + sta COLUBK + + rts + + + + + seg bank5 + org $2800 + rorg $F000 +Start5 + lda #$60 + sta COLUBK + + rts + + + + + seg bank6 + org $3000 + rorg $F000 +Start6 + lda #$70 + sta COLUBK + + rts + + + + + seg bank7 + org $3800 + rorg $F800 + + repeat 512 + .byte $00 + repend +Start7 + + CLEAN_START + + +Start_Frame + lda #2 + sta VBLANK + sta VSYNC + sta WSYNC + sta WSYNC + sta WSYNC + lsr + sta VSYNC + + ldy #37 +VerticalBlank + sta WSYNC + dey + bne VerticalBlank + + lda #0 + sta VBLANK + + lda $1FE7 + + clc + lda Bank0_Color_Read + adc #1 + sta Bank0_Color_Write + lda Bank0_Color_Read + sta COLUBK + + ldy #24 +Picture0 + sta WSYNC + dey + bne Picture0 + + lda $1FE0 + jsr Start0 + + + ldy #24 +Picture1 + sta WSYNC + dey + bne Picture1 + + lda $1FE1 + jsr Start1 + + ldy #24 +Picture2 + sta WSYNC + dey + bne Picture2 + + lda $1FE2 + jsr Start2 + + ldy #24 +Picture3 + sta WSYNC + dey + bne Picture3 + + lda $1FE3 + jsr Start3 + + ldy #24 +Picture4 + sta WSYNC + dey + bne Picture4 + + lda $1FE4 + jsr Start4 + + ldy #24 +Picture5 + sta WSYNC + dey + bne Picture5 + + lda $1FE5 + jsr Start5 + + ldy #24 +Picture6 + sta WSYNC + dey + bne Picture6 + + lda $1FE6 + jsr Start6 + + ldy #24 +Picture7 + sta WSYNC + dey + bne Picture7 + + + lda #2 + sta VBLANK + + ldy #30 +OverScan + sta WSYNC + dey + bne OverScan + + jmp Start_Frame + + org $3FFC + rorg $FFFC + .word Start7 + .byte "07" + diff --git a/test/roms/bankswitching/_code/E7.bin b/test/roms/bankswitching/_code/E7.bin new file mode 100644 index 000000000..993ce9fe9 --- /dev/null +++ b/test/roms/bankswitching/_code/E7.bin @@ -0,0 +1 @@ +©… `ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ© … `ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©0… `ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©@… `ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©P… `ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©`… `ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©p… `ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxØ¢Š¨ÊšHÐû©……………J… %…ˆÐû©…­ç­ôið­ô…  …ˆÐû­à ð …ˆÐû­á ð …ˆÐû­â ð …ˆÐû­ã ð …ˆÐû­ä ð …ˆÐû­å ð …ˆÐû­æ ð …ˆÐû©… …ˆÐûL úÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú07 \ No newline at end of file diff --git a/test/roms/bankswitching/_code/EF.asm b/test/roms/bankswitching/_code/EF.asm new file mode 100644 index 000000000..76eb41e65 --- /dev/null +++ b/test/roms/bankswitching/_code/EF.asm @@ -0,0 +1,674 @@ +;;A bankswitching demo for the EF scheme. 16 4K banks accessed by $FFE0-$FFEF +;;By: Rick Skrbina 4/4/09 + + processor 6502 + include "vcs.h" + include "macro.h" + + seg.u vars + org $80 + + + seg bank0 + org $0000 + rorg $F000 +Start0 + nop + nop + nop + CLEAN_START + +Start_Frame + lda #2 + sta VSYNC + sta VBLANK + sta WSYNC + sta WSYNC + sta WSYNC + lsr + sta VSYNC + + ldy #37 +VerticalBlank + sta WSYNC + dey + bne VerticalBlank + + lda #0 + sta VBLANK + + lda #$0F + sta COLUBK + + ldy #12 +Picture0 + sta WSYNC + dey + bne Picture0 + + jsr Swch1 + + ldy #12 +Picture1 + sta WSYNC + dey + bne Picture1 + + jsr Swch2 + + ldy #12 +Picture2 + sta WSYNC + dey + bne Picture2 + + jsr Swch3 + + ldy #12 +Picture3 + sta WSYNC + dey + bne Picture3 + + jsr Swch4 + + ldy #12 +Picture4 + sta WSYNC + dey + bne Picture4 + + jsr Swch5 + + ldy #12 +Picture5 + sta WSYNC + dey + bne Picture5 + + jsr Swch6 + + ldy #12 +Picture6 + sta WSYNC + dey + bne Picture6 + + jsr Swch7 + + ldy #12 +Picture7 + sta WSYNC + dey + bne Picture7 + + jsr Swch8 + + ldy #12 +Picture8 + sta WSYNC + dey + bne Picture8 + + jsr Swch9 + + ldy #12 +Picture9 + sta WSYNC + dey + bne Picture9 + + jsr SwchA + + ldy #12 +PictureA + sta WSYNC + dey + bne PictureA + + jsr SwchB + + ldy #12 +PictureB + sta WSYNC + dey + bne PictureB + + jsr SwchC + + ldy #12 +PictureC + sta WSYNC + dey + bne PictureC + + jsr SwchD + + ldy #12 +PictureD + sta WSYNC + dey + bne PictureD + + jsr SwchE + + ldy #12 +PictureE + sta WSYNC + dey + bne PictureE + + jsr SwchF + + ldy #12 +PictureF + sta WSYNC + dey + bne PictureF + + lda #2 + sta VBLANK + + ldy #30 +OverScan + sta WSYNC + dey + bne OverScan + + jmp Start_Frame + + org $0400 + rorg $F400 +Swch1 + lda $FFE1 +Swch2 + lda $FFE2 +Swch3 + lda $FFE3 + rts + rts + rts + rts + rts + rts + rts + rts + + org $0415 + rorg $F415 +Swch4 + lda $FFE4 +Swch5 + lda $FFE5 +Swch6 + lda $FFE6 + rts + rts + rts + rts + rts + rts + rts + rts + + org $0430 + rorg $F430 +Swch7 + lda $FFE7 +Swch8 + lda $FFE8 +Swch9 + lda $FFE9 + rts + rts + rts + rts + rts + rts + rts + rts + + org $0445 + rorg $F445 +SwchA + lda $FFEA +SwchB + lda $FFEB +SwchC + lda $FFEC + rts + rts + rts + rts + rts + rts + rts + rts + + org $0460 + rorg $F460 +SwchD + lda $FFED +SwchE + lda $FFEE +SwchF + lda $FFEF + rts + rts + rts + rts + rts + rts + rts + rts + + org $0FFC + .word Start0 + .byte "00" + + seg bank1 + org $1000 + rorg $F000 +Start1 + lda $FFE0 + +Sub1 + lda #$1F + sta COLUBK + rts + + org $1400 + rorg $F400 + nop + nop + nop + jsr Sub1 + lda $FFE0 + + org $1FFC + rorg $FFFC + .word Start1 + .byte "01" + + seg bank2 + org $2000 + rorg $F000 +Start2 + lda $FFE0 + +Sub2 + lda #$2F + sta COLUBK + rts + + org $2400 + rorg $F400 + nop + nop + nop + nop + nop + nop + jsr Sub2 + lda $FFE0 + + org $2FFC + rorg $FFFC + .word Start2 + .byte "02" + + seg bank3 + org $3000 + rorg $F000 +Start3 + lda $FFE0 + +Sub3 + lda #$3F + sta COLUBK + rts + + org $3400 + rorg $F400 + nop + nop + nop + nop + nop + nop + nop + nop + nop + jsr Sub3 + lda $FFE0 + + org $3FFC + rorg $FFFC + .word Start3 + .byte "03" + + seg bank4 + org $4000 + rorg $F000 +Start4 + lda $FFE0 + +Sub4 + lda #$4F + sta COLUBK + rts + + org $4415 + rorg $F415 + nop + nop + nop + jsr Sub4 + lda $FFE0 + + org $4FFC + rorg $FFFC + .word Start4 + .byte "04" + + seg bank5 + org $5000 + rorg $F000 +Start5 + lda $FFE0 + +Sub5 + lda #$5F + sta COLUBK + rts + + org $5415 + rorg $F415 + nop + nop + nop + nop + nop + nop + jsr Sub5 + lda $FFE0 + + org $5FFC + rorg $FFFC + .word Start5 + .byte "05" + + seg bank6 + org $6000 + rorg $F000 +Start6 + lda $FFE0 + +Sub6 + lda #$66 + sta COLUBK + rts + + org $6415 + rorg $F415 + nop + nop + nop + nop + nop + nop + nop + nop + nop + jsr Sub6 + lda $FFE0 + + org $6FFC + rorg $FFFC + .word Start6 + .byte "06" + + seg bank7 + org $7000 + rorg $F000 +Start7 + + lda $FFE0 + +Sub7 + lda #$7F + sta COLUBK + rts + + org $7430 + rorg $F430 + nop + nop + nop + jsr Sub7 + lda $FFE0 + + org $7FFC + rorg $FFFC + .word Start7 + .byte "07" + + seg bank8 + org $8000 + rorg $F000 +Start8 + lda $FFE0 + +Sub8 + lda #$8F + sta COLUBK + rts + + org $8430 + rorg $F430 + nop + nop + nop + nop + nop + nop + jsr Sub8 + lda $FFE0 + + org $8FFC + rorg $FFFC + .word Start8 + .byte "08" + + seg bank9 + org $9000 + rorg $F000 +Start9 + lda $FFE0 + +Sub9 + lda #$9F + sta COLUBK + rts + + org $9430 + rorg $F430 + nop + nop + nop + nop + nop + nop + nop + nop + nop + jsr Sub9 + lda $FFE0 + + org $9FFC + rorg $FFFC + .word Start9 + .byte "09" + + seg bankA + org $A000 + rorg $F000 +StartA + lda $FFE0 + +SubA + lda #$AF + sta COLUBK + rts + + org $A445 + rorg $F445 + nop + nop + nop + jsr SubA + lda $FFE0 + + org $AFFC + rorg $FFFC + .word StartA + .byte "0A" + + seg bankB + org $B000 + rorg $F000 +StartB + lda $FFE0 + +SubB + lda #$BF + sta COLUBK + rts + + org $B445 + rorg $F445 + nop + nop + nop + nop + nop + nop + jsr SubB + lda $FFE0 + + org $BFFC + rorg $FFFC + .word StartB + .byte "0B" + + seg bankC + org $C000 + rorg $F000 +StartC + lda $FFE0 + +SubC + lda #$CF + sta COLUBK + rts + + org $C445 + rorg $F445 + nop + nop + nop + nop + nop + nop + nop + nop + nop + jsr SubC + lda $FFE0 + + + org $CFFC + rorg $FFFC + .word StartC + .byte "0C" + + seg bankD + org $D000 + rorg $F000 +StartD + lda $FFE0 + +SubD + lda #$DF + sta COLUBK + rts + + org $D460 + rorg $F460 + nop + nop + nop + jsr SubD + lda $FFE0 + + org $DFFC + rorg $FFFC + .word StartD + .byte "0D" + + seg bankE + org $E000 + rorg $F000 +StartE + lda $FFE0 + +SubE + lda #$EF + sta COLUBK + rts + + org $E460 + rorg $F460 + nop + nop + nop + nop + nop + nop + jsr SubE + lda $FFE0 + + org $EFFC + rorg $FFFC + .word StartE + .byte "0E" + + seg bankF + org $F000 + rorg $F000 +StartF + lda $FFE0 + +SubF + lda #$FF + sta COLUBK + rts + + org $F460 + rorg $F460 + nop + nop + nop + nop + nop + nop + nop + nop + nop + jsr SubF + lda $FFE0 + + org $FFFC + rorg $FFFC + .word StartF + .byte "0F" diff --git a/test/roms/bankswitching/_code/EF.bin b/test/roms/bankswitching/_code/EF.bin new file mode 100644 index 000000000..8038b3c55 Binary files /dev/null and b/test/roms/bankswitching/_code/EF.bin differ diff --git a/test/roms/bankswitching/_code/EFSC.asm b/test/roms/bankswitching/_code/EFSC.asm new file mode 100644 index 000000000..30c8674c0 --- /dev/null +++ b/test/roms/bankswitching/_code/EFSC.asm @@ -0,0 +1,762 @@ +;;A bankswitching demo for the EFSC scheme. 16 4K banks accessed by $FFE0-$FFEF +;;Also includes 128b RAM mapped at $1000 for writes and $1100 for reads +;;By: Rick Skrbina 4/4/09 + + processor 6502 + include "vcs.h" + include "macro.h" + +Bank0_Color_Read equ Bank0_Color_Write+128 + + seg.u SC_RAM + org $1000 + +Bank0_Color_Write ds 1 + + seg.u vars + org $80 + + + seg bank0 + org $0000 + rorg $F000 + + repeat 256 + .byte $00 + repend +Start0 + nop + nop + nop + CLEAN_START + +Start_Frame + lda #2 + sta VSYNC + sta VBLANK + sta WSYNC + sta WSYNC + sta WSYNC + lsr + sta VSYNC + + ldy #37 +VerticalBlank + sta WSYNC + dey + bne VerticalBlank + + lda #0 + sta VBLANK + + clc + lda Bank0_Color_Read + adc #1 + sta Bank0_Color_Write + lda Bank0_Color_Read + sta COLUBK + + ldy #12 +Picture0 + sta WSYNC + dey + bne Picture0 + + jsr Swch1 + + ldy #12 +Picture1 + sta WSYNC + dey + bne Picture1 + + jsr Swch2 + + ldy #12 +Picture2 + sta WSYNC + dey + bne Picture2 + + jsr Swch3 + + ldy #12 +Picture3 + sta WSYNC + dey + bne Picture3 + + jsr Swch4 + + ldy #12 +Picture4 + sta WSYNC + dey + bne Picture4 + + jsr Swch5 + + ldy #12 +Picture5 + sta WSYNC + dey + bne Picture5 + + jsr Swch6 + + ldy #12 +Picture6 + sta WSYNC + dey + bne Picture6 + + jsr Swch7 + + ldy #12 +Picture7 + sta WSYNC + dey + bne Picture7 + + jsr Swch8 + + ldy #12 +Picture8 + sta WSYNC + dey + bne Picture8 + + jsr Swch9 + + ldy #12 +Picture9 + sta WSYNC + dey + bne Picture9 + + jsr SwchA + + ldy #12 +PictureA + sta WSYNC + dey + bne PictureA + + jsr SwchB + + ldy #12 +PictureB + sta WSYNC + dey + bne PictureB + + jsr SwchC + + ldy #12 +PictureC + sta WSYNC + dey + bne PictureC + + jsr SwchD + + ldy #12 +PictureD + sta WSYNC + dey + bne PictureD + + jsr SwchE + + ldy #12 +PictureE + sta WSYNC + dey + bne PictureE + + jsr SwchF + + ldy #12 +PictureF + sta WSYNC + dey + bne PictureF + + lda #2 + sta VBLANK + + ldy #30 +OverScan + sta WSYNC + dey + bne OverScan + + jmp Start_Frame + + org $0400 + rorg $F400 +Swch1 + lda $FFE1 +Swch2 + lda $FFE2 +Swch3 + lda $FFE3 + rts + rts + rts + rts + rts + rts + rts + rts + + org $0415 + rorg $F415 +Swch4 + lda $FFE4 +Swch5 + lda $FFE5 +Swch6 + lda $FFE6 + rts + rts + rts + rts + rts + rts + rts + rts + + org $0430 + rorg $F430 +Swch7 + lda $FFE7 +Swch8 + lda $FFE8 +Swch9 + lda $FFE9 + rts + rts + rts + rts + rts + rts + rts + rts + + org $0445 + rorg $F445 +SwchA + lda $FFEA +SwchB + lda $FFEB +SwchC + lda $FFEC + rts + rts + rts + rts + rts + rts + rts + rts + + org $0460 + rorg $F460 +SwchD + lda $FFED +SwchE + lda $FFEE +SwchF + lda $FFEF + rts + rts + rts + rts + rts + rts + rts + rts + + org $0FFC + .word Start0 + .byte "00" + + seg bank1 + org $1000 + rorg $F000 + repeat 256 + .byte $00 + repend +Start1 + lda $FFE0 + +Sub1 + lda #$1F + sta COLUBK + rts + + org $1400 + rorg $F400 + nop + nop + nop + jsr Sub1 + lda $FFE0 + + org $1FFC + rorg $FFFC + .word Start1 + .byte "01" + + seg bank2 + org $2000 + rorg $F000 + + repeat 256 + .byte $00 + repend +Start2 + lda $FFE0 + +Sub2 + lda #$2F + sta COLUBK + rts + + org $2400 + rorg $F400 + nop + nop + nop + nop + nop + nop + jsr Sub2 + lda $FFE0 + + org $2FFC + rorg $FFFC + .word Start2 + .byte "02" + + seg bank3 + org $3000 + rorg $F000 + + repeat 256 + .byte $00 + repend + +Start3 + lda $FFE0 + +Sub3 + lda #$3F + sta COLUBK + rts + + org $3400 + rorg $F400 + nop + nop + nop + nop + nop + nop + nop + nop + nop + jsr Sub3 + lda $FFE0 + + org $3FFC + rorg $FFFC + .word Start3 + .byte "03" + + seg bank4 + org $4000 + rorg $F000 + + repeat 256 + .byte $00 + repend + +Start4 + lda $FFE0 + +Sub4 + lda #$4F + sta COLUBK + rts + + org $4415 + rorg $F415 + nop + nop + nop + jsr Sub4 + lda $FFE0 + + org $4FFC + rorg $FFFC + .word Start4 + .byte "04" + + seg bank5 + org $5000 + rorg $F000 + + repeat 256 + .byte $00 + repend + +Start5 + lda $FFE0 + +Sub5 + lda #$5F + sta COLUBK + rts + + org $5415 + rorg $F415 + nop + nop + nop + nop + nop + nop + jsr Sub5 + lda $FFE0 + + org $5FFC + rorg $FFFC + .word Start5 + .byte "05" + + seg bank6 + org $6000 + rorg $F000 + + repeat 256 + .byte $00 + repend + +Start6 + lda $FFE0 + +Sub6 + lda #$66 + sta COLUBK + rts + + org $6415 + rorg $F415 + nop + nop + nop + nop + nop + nop + nop + nop + nop + jsr Sub6 + lda $FFE0 + + org $6FFC + rorg $FFFC + .word Start6 + .byte "06" + + seg bank7 + org $7000 + rorg $F000 + + repeat 256 + .byte $00 + repend + +Start7 + + lda $FFE0 + +Sub7 + lda #$7F + sta COLUBK + rts + + org $7430 + rorg $F430 + nop + nop + nop + jsr Sub7 + lda $FFE0 + + org $7FFC + rorg $FFFC + .word Start7 + .byte "07" + + seg bank8 + org $8000 + rorg $F000 + + repeat 256 + .byte $00 + repend + +Start8 + lda $FFE0 + +Sub8 + lda #$8F + sta COLUBK + rts + + org $8430 + rorg $F430 + nop + nop + nop + nop + nop + nop + jsr Sub8 + lda $FFE0 + + org $8FFC + rorg $FFFC + .word Start8 + .byte "08" + + seg bank9 + org $9000 + rorg $F000 + + repeat 256 + .byte $00 + repend + +Start9 + lda $FFE0 + +Sub9 + lda #$9F + sta COLUBK + rts + + org $9430 + rorg $F430 + nop + nop + nop + nop + nop + nop + nop + nop + nop + jsr Sub9 + lda $FFE0 + + org $9FFC + rorg $FFFC + .word Start9 + .byte "09" + + seg bankA + org $A000 + rorg $F000 + + repeat 256 + .byte $00 + repend + +StartA + lda $FFE0 + +SubA + lda #$AF + sta COLUBK + rts + + org $A445 + rorg $F445 + nop + nop + nop + jsr SubA + lda $FFE0 + + org $AFFC + rorg $FFFC + .word StartA + .byte "0A" + + seg bankB + org $B000 + rorg $F000 + + repeat 256 + .byte $00 + repend + +StartB + lda $FFE0 + +SubB + lda #$BF + sta COLUBK + rts + + org $B445 + rorg $F445 + nop + nop + nop + nop + nop + nop + jsr SubB + lda $FFE0 + + org $BFFC + rorg $FFFC + .word StartB + .byte "0B" + + seg bankC + org $C000 + rorg $F000 + + repeat 256 + .byte $00 + repend + +StartC + lda $FFE0 + +SubC + lda #$CF + sta COLUBK + rts + + org $C445 + rorg $F445 + nop + nop + nop + nop + nop + nop + nop + nop + nop + jsr SubC + lda $FFE0 + + + org $CFFC + rorg $FFFC + .word StartC + .byte "0C" + + seg bankD + org $D000 + rorg $F000 + + repeat 256 + .byte $00 + repend + +StartD + lda $FFE0 + +SubD + lda #$DF + sta COLUBK + rts + + org $D460 + rorg $F460 + nop + nop + nop + jsr SubD + lda $FFE0 + + org $DFFC + rorg $FFFC + .word StartD + .byte "0D" + + seg bankE + org $E000 + rorg $F000 + + repeat 256 + .byte $00 + repend + +StartE + lda $FFE0 + +SubE + lda #$EF + sta COLUBK + rts + + org $E460 + rorg $F460 + nop + nop + nop + nop + nop + nop + jsr SubE + lda $FFE0 + + org $EFFC + rorg $FFFC + .word StartE + .byte "0E" + + seg bankF + org $F000 + rorg $F000 + + repeat 256 + .byte $00 + repend + +StartF + lda $FFE0 + +SubF + lda #$FF + sta COLUBK + rts + + org $F460 + rorg $F460 + nop + nop + nop + nop + nop + nop + nop + nop + nop + jsr SubF + lda $FFE0 + + org $FFFC + rorg $FFFC + .word StartF + .byte "0F" diff --git a/test/roms/bankswitching/_code/EFSC.bin b/test/roms/bankswitching/_code/EFSC.bin new file mode 100644 index 000000000..8025a8145 Binary files /dev/null and b/test/roms/bankswitching/_code/EFSC.bin differ diff --git a/test/roms/bankswitching/_code/F0_MegaBoy.asm b/test/roms/bankswitching/_code/F0_MegaBoy.asm new file mode 100644 index 000000000..e21b8d5ff --- /dev/null +++ b/test/roms/bankswitching/_code/F0_MegaBoy.asm @@ -0,0 +1,761 @@ +;;A bankswitching demo for the F0 (Dynacom MegaBoy) BS technique. 16 4K banks (64K total) +;;3/26/09 By: Rick Skrbina + + processor 6502 + include "vcs.h" + include "macro.h" + + seg.u vars + org $80 + + seg bank0 + org $0000 + rorg $F000 +Start0 + CLEAN_START + + + lda #$0F + sta COLUBK + +Start_Frame + lda #2 + sta VBLANK + sta VSYNC + sta WSYNC + sta WSYNC + sta WSYNC + lsr + sta VSYNC + + ldy #37 +VerticalBlank + sta WSYNC + dey + bne VerticalBlank + + sta VBLANK + + lda #$0F + sta COLUBK + + ldy #9 +Picture0 + sta WSYNC + dey + bne Picture0 + + lda #1 + jsr Switch_Banks + + ldy #9 +Picture1 + sta WSYNC + dey + bne Picture1 + + lda #2 + jsr Switch_Banks + + ldy #9 +Picture2 + sta WSYNC + dey + bne Picture2 + + lda #3 + jsr Switch_Banks + + ldy #9 +Picture3 + sta WSYNC + dey + bne Picture3 + + lda #4 + jsr Switch_Banks + + ldy #9 +Picture4 + sta WSYNC + dey + bne Picture4 + + lda #5 + jsr Switch_Banks + + ldy #9 +Picture5 + sta WSYNC + dey + bne Picture5 + + lda #6 + jsr Switch_Banks + + ldy #9 +Picture6 + sta WSYNC + dey + bne Picture6 + + lda #7 + jsr Switch_Banks + + ldy #9 +Picture7 + sta WSYNC + dey + bne Picture7 + + lda #8 + jsr Switch_Banks + + ldy #9 +Picture8 + sta WSYNC + dey + bne Picture8 + + lda #9 + jsr Switch_Banks + + ldy #9 +Picture9 + sta WSYNC + dey + bne Picture9 + + lda #10 + jsr Switch_Banks + + ldy #9 +Picture10 + sta WSYNC + dey + bne Picture10 + + lda #11 + jsr Switch_Banks + + ldy #9 +Picture11 + sta WSYNC + dey + bne Picture11 + + lda #9 + jsr Switch_Banks + + ldy #9 +Picture12 + sta WSYNC + dey + bne Picture12 + + lda #13 + jsr Switch_Banks + + ldy #9 +Picture13 + sta WSYNC + dey + bne Picture13 + + lda #14 + jsr Switch_Banks + + ldy #9 +Picture14 + sta WSYNC + dey + bne Picture14 + + lda #15 + jsr Switch_Banks + + ldy #9 +Picture15 + sta WSYNC + dey + bne Picture15 + + lda #2 + sta VBLANK + + ldy #30 +OverScan + sta WSYNC + dey + bne OverScan + + jmp Start_Frame + + org $0E00 + rorg $FE00 + +Switch_Banks + cmp Identity0 + beq Stayin0 + sta $1FF0 + jmp Switch_Banks +Stayin0 + rts + + +Identity0 + .byte $00 + + org $0FFC + rorg $FFFC + .word Start0 + .byte "B0" + + seg Bank1 + org $1000 + rorg $F000 +Start1 + CLEAN_START + lda #$F0 + sta $FE + lda #0 + jmp B1_swch + +B1_Color + lda #$1F + sta COLUBK + + lda #0 + jmp B1_swch + + org $1E00 + rorg $FE00 +B1_swch + cmp Identity1 + beq Stayin1 + sta $1FF0 + jmp B1_swch +Stayin1 + jmp B1_Color + + +Identity1 + .byte $01 + + org $1FFC + .word Start1 + .byte "B1" + + seg Bank2 + org $2000 + rorg $F000 +Start2 + CLEAN_START + lda #$F0 + sta $FE + lda #0 + jmp B2_swch + +B2_Color + + lda #$2F + sta COLUBK + + lda #0 + jmp B2_swch + + org $2E00 + rorg $FE00 +B2_swch + cmp Identity2 + beq Stayin2 + sta $1FF0 + jmp B2_swch +Stayin2 + jmp B2_Color + +Identity2 + .byte $02 + + org $2FFC + rorg $FFFC + .word Start2 + .byte "B2" + + seg Bank3 + org $3000 +Start3 + CLEAN_START + lda #$F0 + sta $FE + lda #0 + jmp B3_swch + +B3_Color + lda #$3F + sta COLUBK + lda #0 + jmp B3_swch + + org $3E00 + rorg $FE00 +B3_swch + cmp Identity3 + beq Stayin2 + sta $1FF0 + jmp B3_swch +Stayin3 + jmp B3_Color + +Identity3 + .byte $03 + + org $3FFC + rorg $FFFC + .word Start3 + .byte "B3" + + seg Bank4 + org $4000 + rorg $F000 +Start4 + CLEAN_START + lda #$F0 + sta $FE + lda #0 + jmp B4_swch + +B4_Color + + lda #$4F + sta COLUBK + + lda #0 + jmp B4_swch + + org $4E00 + rorg $FE00 + +B4_swch + cmp Identity4 + beq Stayin4 + sta $1FF0 + jmp B4_swch +Stayin4 + jmp B4_Color + +Identity4 + .byte $04 + + org $4FFC + rorg $FFFC + .word Start4 + .byte "B4" + + seg Bank5 + org $5000 + rorg $F000 +Start5 + CLEAN_START + lda #$F0 + sta $FE + lda #0 + jmp B5_swch + +B5_Color + + lda #$5F + sta COLUBK + + lda #0 + jmp B5_swch + + org $5E00 + rorg $FE00 + +B5_swch + cmp Identity5 + beq Stayin5 + sta $1FF0 + jmp B5_swch +Stayin5 + jmp B5_Color + +Identity5 + .byte $05 + + org $5FFC + rorg $FFFC + .word Start5 + .byte "B5" + + seg Bank6 + org $6000 + rorg $F000 +Start6 + CLEAN_START + lda #$F0 + sta $FE + lda #0 + jmp B6_swch + +B6_Color + + lda #$6F + sta COLUBK + + lda #0 + jmp B6_swch + + org $6E00 + rorg $FE00 + +B6_swch + cmp Identity6 + beq Stayin6 + sta $1FF0 + jmp B6_swch +Stayin6 + jmp B6_Color + +Identity6 + .byte $06 + + org $6FFC + rorg $FFFC + .word Start6 + .byte "B6" + + seg Bank7 + org $7000 + rorg $F000 +Start7 + CLEAN_START + lda #$F0 + sta $FE + lda #0 + jmp B7_swch + +B7_Color + + lda #$7F + sta COLUBK + + lda #0 + jmp B7_swch + + org $7E00 + rorg $FE00 + +B7_swch + cmp Identity7 + beq Stayin7 + sta $1FF0 + jmp B7_swch +Stayin7 + jmp B7_Color + +Identity7 + .byte $07 + + org $7FFC + rorg $FFFC + .word Start7 + .byte "B7" + + seg Bank8 + org $8000 + rorg $F000 +Start8 + CLEAN_START + lda #$F0 + sta $FE + lda #0 + jmp B8_swch + +B8_Color + + lda #$8F + sta COLUBK + + lda #0 + jmp B8_swch + + org $8E00 + rorg $FE00 + +B8_swch + cmp Identity8 + beq Stayin8 + sta $1FF0 + jmp B8_swch +Stayin8 + jmp B8_Color + +Identity8 + .byte $08 + + org $8FFC + rorg $FFFC + .word Start8 + .byte "B8" + + seg Bank9 + org $9000 + rorg $F000 +Start9 + CLEAN_START + lda #$F0 + sta $FE + lda #0 + jmp B9_swch + +B9_Color + + lda #$9F + sta COLUBK + + lda #0 + jmp B9_swch + + org $9E00 + rorg $FE00 + +B9_swch + cmp Identity9 + beq Stayin9 + sta $1FF0 + jmp B9_swch +Stayin9 + jmp B9_Color + +Identity9 + .byte $09 + + org $9FFC + rorg $FFFC + .word Start9 + .byte "B9" + + seg BankA + org $A000 + rorg $F000 +StartA + CLEAN_START + lda #$F0 + sta $FE + lda #0 + jmp BA_swch + +BA_Color + + lda #$AF + sta COLUBK + + lda #0 + jmp BA_swch + + org $AE00 + rorg $FE00 + +BA_swch + cmp IdentityA + beq StayinA + sta $1FF0 + jmp BA_swch +StayinA + jmp BA_Color + +IdentityA + .byte $0A + + org $AFFC + rorg $FFFC + .word StartA + .byte "BA" + + seg BankB + org $B000 + rorg $F000 +StartB + CLEAN_START + lda #$F0 + sta $FE + lda #0 + jmp BB_swch + +BB_Color + + lda #$BF + sta COLUBK + lda #0 + jmp BB_swch + + org $BE00 + rorg $FE00 + +BB_swch + cmp IdentityB + beq StayinB + sta $1FF0 + jmp BB_swch +StayinB + jmp BB_Color + +IdentityB + .byte $0B + + org $BFFC + rorg $FFFC + .word StartB + .byte "BB" + + seg BankC + org $C000 + rorg $F000 +StartC + CLEAN_START + lda #$F0 + sta $FE + lda #0 + jmp BC_swch + +BC_Color + + lda #$CF + sta COLUBK + + lda #0 + jmp BC_swch + + org $CE00 + rorg $FE00 + +BC_swch + cmp IdentityC + beq StayinC + sta $1FF0 + jmp BC_swch +StayinC + jmp BC_Color + +IdentityC + .byte $0C + + org $CFFC + rorg $FFFC + .word StartC + .byte "BC" + + seg BankD + org $D000 + rorg $F000 +StartD + CLEAN_START + lda #$F0 + sta $FE + lda #0 + jmp BD_swch + +BD_Color + + lda #$DF + sta COLUBK + + lda #0 + jmp BD_swch + + org $DE00 + rorg $FE00 + +BD_swch + cmp IdentityD + beq StayinD + sta $1FF0 + jmp BD_swch +StayinD + jmp BD_Color + +IdentityD + .byte $0D + + org $DFFC + rorg $FFFC + .word StartD + .byte "BD" + + seg BankE + org $E000 + rorg $F000 +StartE + CLEAN_START + lda #$F0 + sta $FE + lda #0 + jmp BE_swch + +BE_Color + + lda #$EF + sta COLUBK + + lda #0 + jmp BE_swch + + org $EE00 + rorg $FE00 + +BE_swch + cmp IdentityE + beq StayinE + sta $1FF0 + jmp BE_swch +StayinE + jmp BE_Color + +IdentityE + + .byte $0E + + org $EFFC + rorg $FFFC + .word StartE + .byte "BE" + + seg BankF + org $F000 + rorg $F000 +StartF + CLEAN_START + lda #$F0 + sta $FE + lda #0 + jmp BF_swch + +BF_Color + + lda #$FF + sta COLUBK + + lda #0 + jmp BF_swch + + org $FE00 + rorg $FE00 + +BF_swch + cmp IdentityF + beq StayinF + sta $1FF0 + jmp BF_swch +StayinF + jmp BF_Color + +IdentityF + .byte $0F + + org $FFFC + rorg $FFFC + .word StartF + .byte "BF" + diff --git a/test/roms/bankswitching/_code/F0_MegaBoy.bin b/test/roms/bankswitching/_code/F0_MegaBoy.bin new file mode 100644 index 000000000..d4ec07408 Binary files /dev/null and b/test/roms/bankswitching/_code/F0_MegaBoy.bin differ diff --git a/test/roms/bankswitching/_code/F4.asm b/test/roms/bankswitching/_code/F4.asm new file mode 100644 index 000000000..987f33930 --- /dev/null +++ b/test/roms/bankswitching/_code/F4.asm @@ -0,0 +1,381 @@ +;;A demo for the F4 banking scheme. 8 4K banks (32K total) +;;By: Rick Skrbina 3/31/09 + + processor 6502 + include "vcs.h" + include "macro.h" + + seg.u vars + org $80 + + + seg bank0 + org $8000 + rorg $F000 + +Start0 + nop + nop + nop + + CLEAN_START + +Start_Frame + lda #2 + sta VBLANK + sta VSYNC + sta WSYNC + sta WSYNC + sta WSYNC + lsr + sta VSYNC + + lda #$0F + sta COLUBK + + ldy #37 +VerticalBlank + sta WSYNC + dey + bne VerticalBlank + + lda #0 + sta VBLANK + + sta WSYNC + + ldy #23 +Picture0 + sta WSYNC + dey + bne Picture0 + + jsr Swch1 + + ldy #23 +Picture1 + sta WSYNC + dey + bne Picture1 + + jsr Swch2 + + ldy #23 +Picture2 + sta WSYNC + dey + bne Picture2 + + jsr Swch3 + + ldy #23 +Picture3 + sta WSYNC + dey + bne Picture3 + + jsr Swch4 + + ldy #23 +Picture4 + sta WSYNC + dey + bne Picture4 + + jsr Swch5 + + ldy #23 +Picture5 + sta WSYNC + dey + bne Picture5 + + jsr Swch6 + + ldy #23 +Picture6 + sta WSYNC + dey + bne Picture6 + + jsr Swch7 + + ldy #23 +Picture7 + sta WSYNC + dey + bne Picture7 + + lda #2 + sta VBLANK + + ldy #30 +OverScan + sta WSYNC + dey + bne OverScan + + jmp Start_Frame + + org $8FC0 + rorg $FFC0 + +Swch7 + lda $FFFB + nop + nop + nop + nop + nop + nop + rts + + + org $8FD0 + rorg $FFD0 +Swch1 + lda $FFF5 +Swch2 + lda $FFF6 +Swch3 + lda $FFF7 + + rts + rts + rts + rts + rts + rts + rts + + org $8FE0 + rorg $FFE0 +Swch4 + lda $FFF8 +Swch5 + lda $FFF9 +Swch6 + lda $FFFA + + rts + rts + rts + rts + rts + rts + rts + + + org $8FFC + rorg $FFFC + .word Start0 + .byte "B0" + + seg bank1 + org $9000 + rorg $F000 + +Start1 + lda $FFF4 + +Bank1Sub + lda #$1F + sta WSYNC + sta COLUBK + rts + + org $9FD0 + rorg $FFD0 + + nop + nop + nop + jsr Bank1Sub + sta $FFF4 + + org $9FFC + rorg $FFFC + .word Start1 + .byte "B1" + + seg bank2 + org $A000 + rorg $F000 +Start2 + lda $FFF4 + +Bank2Sub + lda #$2F + sta WSYNC + sta COLUBK + rts + + org $AFD0 + rorg $FFD0 + + nop + nop + nop + nop + nop + nop + jsr Bank2Sub + sta $FFF4 + + org $AFFC + rorg $FFFC + .word Start2 + .byte "B2" + + seg bank3 + org $B000 + rorg $F000 +Start3 + lda $FFF4 + +Bank3Sub + lda #$3F + sta WSYNC + sta COLUBK + rts + + org $BFD0 + rorg $FFD0 + + nop + nop + nop + nop + nop + nop + nop + nop + nop + jsr Bank3Sub + sta $FFF4 + + org $BFFC + rorg $FFFC + .word Start3 + .byte "B3" + + seg bank4 + org $C000 + rorg $F000 + +Start4 + lda $FFF4 + +Bank4Sub + lda #$4F + sta WSYNC + sta COLUBK + rts + + org $CFE0 + rorg $FFE0 + + nop + nop + nop + jsr Bank4Sub + sta $FFF4 + + org $CFFC + rorg $FFFC + .word Start4 + .byte "B4" + + seg bank5 + org $D000 + rorg $F000 + +Start5 + lda $FFF4 + +Bank5Sub + lda #$5F + sta WSYNC + sta COLUBK + rts + + org $DFE0 + rorg $FFE0 + + nop + nop + nop + nop + nop + nop + jsr Bank5Sub + sta $FFF4 + + org $DFFC + rorg $FFFC + .word Start5 + .byte "B5" + + seg bank6 + org $E000 + rorg $F000 + +Start6 + lda $FFF4 + +Bank6Sub + + lda #$6F + sta WSYNC + sta COLUBK + rts + + org $EFE0 + rorg $FFE0 + + nop + nop + nop + nop + nop + nop + nop + nop + nop + jsr Bank6Sub + sta $FFF4 + + org $EFFC + rorg $FFFC + .word Start6 + .byte "B6" + + seg bank7 + org $F000 + rorg $F000 + +Start7 + lda $FFF4 + +Bank7Sub + + lda #$8F + sta WSYNC + sta COLUBK + rts + + org $FFC0 + rorg $FFC0 + + nop + nop + nop + jsr Bank7Sub + sta $FFF4 + + org $FFFC + rorg $FFFC + .word Start7 + .byte "B7" + + diff --git a/test/roms/bankswitching/_code/F4.bin b/test/roms/bankswitching/_code/F4.bin new file mode 100644 index 000000000..1a2470daa Binary files /dev/null and b/test/roms/bankswitching/_code/F4.bin differ diff --git a/test/roms/bankswitching/_code/F4SC.asm b/test/roms/bankswitching/_code/F4SC.asm new file mode 100644 index 000000000..b5f1aed37 --- /dev/null +++ b/test/roms/bankswitching/_code/F4SC.asm @@ -0,0 +1,427 @@ +;;A demo for the F4 banking scheme. 8 4K banks (32K total) +;;By: Rick Skrbina 4/30/09 + + processor 6502 + include "vcs.h" + include "macro.h" + +Bank0_Read equ Bank0_Write+128 + + seg.u vars + org $80 + + seg.u SC_RAM + org $1000 +Bank0_Write ds 1 + + seg bank0 + org $8000 + rorg $F000 + + repeat 256 + .byte $FF + repend + +Start0 + nop + nop + nop + + CLEAN_START + +Start_Frame + lda #2 + sta VBLANK + sta VSYNC + sta WSYNC + sta WSYNC + sta WSYNC + lsr + sta VSYNC + +; lda #$0F +; sta COLUBK + + ldy #37 +VerticalBlank + sta WSYNC + dey + bne VerticalBlank + + lda #0 + sta VBLANK + + clc + lda Bank0_Read + adc #1 + sta Bank0_Write + lda Bank0_Read + sta COLUBK + + sta WSYNC + + ldy #23 +Picture0 + sta WSYNC + dey + bne Picture0 + + jsr Swch1 + + ldy #23 +Picture1 + sta WSYNC + dey + bne Picture1 + + jsr Swch2 + + ldy #23 +Picture2 + sta WSYNC + dey + bne Picture2 + + jsr Swch3 + + ldy #23 +Picture3 + sta WSYNC + dey + bne Picture3 + + jsr Swch4 + + ldy #23 +Picture4 + sta WSYNC + dey + bne Picture4 + + jsr Swch5 + + ldy #23 +Picture5 + sta WSYNC + dey + bne Picture5 + + jsr Swch6 + + ldy #23 +Picture6 + sta WSYNC + dey + bne Picture6 + + jsr Swch7 + + ldy #23 +Picture7 + sta WSYNC + dey + bne Picture7 + + lda #2 + sta VBLANK + + ldy #30 +OverScan + sta WSYNC + dey + bne OverScan + + jmp Start_Frame + + org $8FC0 + rorg $FFC0 + +Swch7 + lda $FFFB + nop + nop + nop + nop + nop + nop + rts + + + org $8FD0 + rorg $FFD0 +Swch1 + lda $FFF5 +Swch2 + lda $FFF6 +Swch3 + lda $FFF7 + + rts + rts + rts + rts + rts + rts + rts + + org $8FE0 + rorg $FFE0 +Swch4 + lda $FFF8 +Swch5 + lda $FFF9 +Swch6 + lda $FFFA + + rts + rts + rts + rts + rts + rts + rts + + + org $8FFC + rorg $FFFC + .word Start0 + .byte "B0" + + seg bank1 + org $9000 + rorg $F000 + + repeat 256 + .byte $FF + repend + +Start1 + lda $FFF4 + +Bank1Sub + lda #$1F + sta WSYNC + sta COLUBK + rts + + org $9FD0 + rorg $FFD0 + + nop + nop + nop + jsr Bank1Sub + sta $FFF4 + + org $9FFC + rorg $FFFC + .word Start1 + .byte "B1" + + seg bank2 + org $A000 + rorg $F000 + + repeat 256 + .byte $FF + repend + +Start2 + lda $FFF4 + +Bank2Sub + lda #$2F + sta WSYNC + sta COLUBK + rts + + org $AFD0 + rorg $FFD0 + + nop + nop + nop + nop + nop + nop + jsr Bank2Sub + sta $FFF4 + + org $AFFC + rorg $FFFC + .word Start2 + .byte "B2" + + seg bank3 + org $B000 + rorg $F000 + + repeat 256 + .byte $FF + repend + +Start3 + lda $FFF4 + +Bank3Sub + lda #$3F + sta WSYNC + sta COLUBK + rts + + org $BFD0 + rorg $FFD0 + + nop + nop + nop + nop + nop + nop + nop + nop + nop + jsr Bank3Sub + sta $FFF4 + + org $BFFC + rorg $FFFC + .word Start3 + .byte "B3" + + seg bank4 + org $C000 + rorg $F000 + + repeat 256 + .byte $FF + repend + +Start4 + lda $FFF4 + +Bank4Sub + lda #$4F + sta WSYNC + sta COLUBK + rts + + org $CFE0 + rorg $FFE0 + + nop + nop + nop + jsr Bank4Sub + sta $FFF4 + + org $CFFC + rorg $FFFC + .word Start4 + .byte "B4" + + seg bank5 + org $D000 + rorg $F000 + + repeat 256 + .byte $FF + repend + +Start5 + lda $FFF4 + +Bank5Sub + lda #$5F + sta WSYNC + sta COLUBK + rts + + org $DFE0 + rorg $FFE0 + + nop + nop + nop + nop + nop + nop + jsr Bank5Sub + sta $FFF4 + + org $DFFC + rorg $FFFC + .word Start5 + .byte "B5" + + seg bank6 + org $E000 + rorg $F000 + + repeat 256 + .byte $FF + repend + +Start6 + lda $FFF4 + +Bank6Sub + + lda #$6F + sta WSYNC + sta COLUBK + rts + + org $EFE0 + rorg $FFE0 + + nop + nop + nop + nop + nop + nop + nop + nop + nop + jsr Bank6Sub + sta $FFF4 + + org $EFFC + rorg $FFFC + .word Start6 + .byte "B6" + + seg bank7 + org $F000 + rorg $F000 + + repeat 256 + .byte $FF + repend + +Start7 + lda $FFF4 + +Bank7Sub + + lda #$8F + sta WSYNC + sta COLUBK + rts + + org $FFC0 + rorg $FFC0 + + nop + nop + nop + jsr Bank7Sub + sta $FFF4 + + org $FFFC + rorg $FFFC + .word Start7 + .byte "B7" + + diff --git a/test/roms/bankswitching/_code/F4SC.bin b/test/roms/bankswitching/_code/F4SC.bin new file mode 100644 index 000000000..a8cdd0b6a Binary files /dev/null and b/test/roms/bankswitching/_code/F4SC.bin differ diff --git a/test/roms/bankswitching/_code/F6.asm b/test/roms/bankswitching/_code/F6.asm new file mode 100644 index 000000000..02da38f30 --- /dev/null +++ b/test/roms/bankswitching/_code/F6.asm @@ -0,0 +1,189 @@ +;;A bankswitching demo fhr the F6 BS technique. 4 4K banks (16K total) +;;By: Rick Skrbina 3/28/09 + + processor 6502 + include "vcs.h" + include "macro.h" + + seg.u vars + org $80 + + + seg bank0 + org $C000 + rorg $F000 + + nop + nop + nop +Start + CLEAN_START + +Start_Frame + lda #2 + sta VBLANK + sta VSYNC + sta WSYNC + sta WSYNC + sta WSYNC + lsr + sta VSYNC + + ldy #37 +VerticalBlank + sta WSYNC + dey + bne VerticalBlank + + lda #0 + sta VBLANK + + lda #$0F + sta COLUBK + + ldy #48 +Picture1 + sta WSYNC + dey + bne Picture1 + + jsr Swch1 + + ldy #48 +Picture2 + sta WSYNC + dey + bne Picture2 + + jsr Swch2 + + ldy #48 +Picture3 + sta WSYNC + dey + bne Picture3 + + jsr Swch3 + + ldy #48 +Picture4 + sta WSYNC + dey + bne Picture4 + + lda #2 + sta VBLANK + + ldy #30 +OverScan + sta WSYNC + dey + bne OverScan + + jmp Start_Frame + + org $CFE0 + rorg $FFE0 +Swch1 + lda $FFF7 +Swch2 + lda $FFF8 +Swch3 + lda $FFF9 + + rts + rts + rts + rts + rts + rts + rts + + org $CFFC + rorg $FFFC + .word Start + .byte "B0" + + seg bank1 + org $D000 + rorg $F000 +Start1 + lda $1FF6 + +Bank1Sub + lda #$1F + sta COLUBK + rts + + org $DFE0 + rorg $FFE0 + + nop + nop + nop + jsr Bank1Sub + lda $FFF6 + + org $DFFC + rorg $FFFC + .word Start + .byte "B1" + + seg bank2 + org $E000 + rorg $F000 +Start2 + lda $1FF6 + +Bank2Sub + lda #$4F + sta COLUBK + rts + + org $EFE0 + rorg $FFE0 + + nop + nop + nop + nop + nop + nop + jsr Bank2Sub + lda $FFF6 + + org $EFFC + rorg $FFFC + .word Start2 + .byte "B2" + + seg bank3 + org $F000 + rorg $F000 +Start3 + lda $1FF6 + +Bank3Sub + lda #$8F + sta COLUBK + rts + + org $FFE0 + rorg $FFE0 + + nop + nop + nop + nop + nop + nop + nop + nop + nop + jsr Bank3Sub + lda $FFF6 + + org $FFFC + rorg $FFFC + .word Start3 + .byte "B3" diff --git a/test/roms/bankswitching/_code/F6.bin b/test/roms/bankswitching/_code/F6.bin new file mode 100644 index 000000000..853a3e97d Binary files /dev/null and b/test/roms/bankswitching/_code/F6.bin differ diff --git a/test/roms/bankswitching/_code/F6SC.asm b/test/roms/bankswitching/_code/F6SC.asm new file mode 100644 index 000000000..ee5f5ea90 --- /dev/null +++ b/test/roms/bankswitching/_code/F6SC.asm @@ -0,0 +1,247 @@ +;;A bankswitching demo fhr the F6SC BS technique. 4 4K banks + 128b RAM (16K total) +;;By: Rick Skrbina 3/31/09 + + processor 6502 + include "vcs.h" + include "macro.h" + +Color0_Read equ Color0_Write+128 +Color1_Read equ Color1_Write+128 +Color2_Read equ Color2_Write+128 +Color3_Read equ Color3_Write+128 + + seg.u vars + org $80 + + + seg.u SuperChip_RAM + org $1000 +Color0_Write ds 1 +Color1_Write ds 1 +Color2_Write ds 1 +Color3_Write ds 1 + + seg bank0 + org $C000 + rorg $F000 + + repeat 256 + .byte $00 + repend + +Start + nop + nop + nop + + CLEAN_START + + lda #$0F + sta Color0_Write + lda #$1F + sta Color1_Write + lda #$4F + sta Color2_Write + lda #$8F + sta Color3_Write + +Start_Frame + lda #2 + sta VBLANK + sta VSYNC + sta WSYNC + sta WSYNC + sta WSYNC + lsr + sta VSYNC + + clc + lda Color0_Read + adc #1 + sta Color0_Write + sta COLUBK + + ldy #37 +VerticalBlank + sta WSYNC + dey + bne VerticalBlank + + + + lda #0 + sta VBLANK + + ldy #48 +Picture1 + sta WSYNC + dey + bne Picture1 + + jsr Swch1 + + ldy #47 +Picture2 + sta WSYNC + dey + bne Picture2 + + jsr Swch2 + + ldy #47 +Picture3 + sta WSYNC + dey + bne Picture3 + + jsr Swch3 + + ldy #47 +Picture4 + sta WSYNC + dey + bne Picture4 + + lda #2 + sta VBLANK + + ldy #30 +OverScan + sta WSYNC + dey + bne OverScan + + jmp Start_Frame + + org $CFE0 + rorg $FFE0 +Swch1 + lda $FFF7 +Swch2 + lda $FFF8 +Swch3 + lda $FFF9 + + rts + rts + rts + rts + rts + rts + rts + + org $CFFC + rorg $FFFC + .word Start + .byte "B0" + + seg bank1 + org $D000 + rorg $F000 + + repeat 256 + .byte $00 + repend +Start1 + lda $1FF6 + +Bank1Sub + clc + lda Color1_Read + adc #1 + sta Color1_Write + sta WSYNC + sta COLUBK + rts + + org $DFE0 + rorg $FFE0 + + nop + nop + nop + jsr Bank1Sub + lda $FFF6 + + org $DFFC + rorg $FFFC + .word Start + .byte "B1" + + seg bank2 + org $E000 + rorg $F000 + + repeat 256 + .byte $00 + repend + +Start2 + lda $1FF6 + +Bank2Sub + clc + lda Color2_Read + adc #1 + sta Color2_Write + sta WSYNC + sta COLUBK + rts + + org $EFE0 + rorg $FFE0 + + nop + nop + nop + nop + nop + nop + jsr Bank2Sub + lda $FFF6 + + org $EFFC + rorg $FFFC + .word Start2 + .byte "B2" + + seg bank3 + org $F000 + rorg $F000 + + repeat 256 + .byte $00 + repend + +Start3 + lda $1FF6 + +Bank3Sub + clc + lda Color3_Read + adc #1 + sta Color3_Write + lda Color3_Read + sta WSYNC + sta COLUBK + rts + + org $FFE0 + rorg $FFE0 + + nop + nop + nop + nop + nop + nop + nop + nop + nop + jsr Bank3Sub + lda $FFF6 + + org $FFFC + rorg $FFFC + .word Start3 + .byte "B3" diff --git a/test/roms/bankswitching/_code/F6SC.bin b/test/roms/bankswitching/_code/F6SC.bin new file mode 100644 index 000000000..a1938ca42 Binary files /dev/null and b/test/roms/bankswitching/_code/F6SC.bin differ diff --git a/test/roms/bankswitching/_code/F8.asm b/test/roms/bankswitching/_code/F8.asm new file mode 100644 index 000000000..0405af8e4 --- /dev/null +++ b/test/roms/bankswitching/_code/F8.asm @@ -0,0 +1,116 @@ +;;A bankswitching demo for the F8 BS technique. 2 4K banks (8K total) +;;By: Rick Skrbina + processor 6502 + include "vcs.h" + include "macro.h" + + seg.u vars + org $80 + +PF_Color ds 1 + + seg Bank_0 + + org $E000 + rorg $F000 + + nop + nop + nop +Start_0 + CLEAN_START +; jsr Call_1 + lda #$FF + sta PF1 +StartFrame + lda #2 + sta VBLANK + sta VSYNC + + sta WSYNC + sta WSYNC + sta WSYNC + + lda #0 + sta VSYNC + + ldy #37 +Vert + sta WSYNC + dey + bne Vert + + lda #0 + sta VBLANK + + ldy #192 +Pic + sta WSYNC + dey + bne Pic + + lda #2 + sta VBLANK + + ldy #30 +Over + sta WSYNC + dey + bne Over + + jsr Call_1 + + lda PF_Color + sta COLUPF + + + jmp StartFrame + + + + + org $EFE0 + rorg $FFE0 +Call_1 + stx $FFF9 + + nop + nop + nop + nop + nop + nop + + rts + + org $EFF8 + rorg $FFF8 + .word $FFFF + .word Start_0 + .word Start_0 + .word Start_0 + + seg Bank_1 + + org $F000 + rorg $F000 + +Init_1 + sta $FFF8 +Bank1_Sub +; lda #$0F +; sta COLUPF + inc PF_Color + rts + + org $FFE3 + rorg $FFE3 + jsr Bank1_Sub + stx $FFF8 + + org $FFF8 + .word $FFFF + .word Init_1 + .word Init_1 + .word Init_1 + diff --git a/test/roms/bankswitching/_code/F8.bin b/test/roms/bankswitching/_code/F8.bin new file mode 100644 index 000000000..d6d5928d2 Binary files /dev/null and b/test/roms/bankswitching/_code/F8.bin differ diff --git a/test/roms/bankswitching/_code/F8SC.asm b/test/roms/bankswitching/_code/F8SC.asm new file mode 100644 index 000000000..26aa08552 --- /dev/null +++ b/test/roms/bankswitching/_code/F8SC.asm @@ -0,0 +1,135 @@ +;;A bankswitching demo for the F8SC scheme. 2 4K banks of ROM + 128 bytes of RAM +;;By: Rick Skrbina 3/29/09 + + processor 6502 + include "vcs.h" + include "macro.h" + +PF_Color_Read equ PF_Color_Write+128 + seg.u vars + org $80 + + + + seg.u SC_RAM_vars + org $1000 +PF_Color_Write ds 1 + + seg Bank_0 + + org $E000 + rorg $F000 + + repeat 256 + .byte $00 + repend + +Start_0 + nop + nop + nop + + CLEAN_START +; jsr Call_1 + lda #$FF + sta PF1 +StartFrame + lda #2 + sta VBLANK + sta VSYNC + + sta WSYNC + sta WSYNC + sta WSYNC + + lda #0 + sta VSYNC + + ldy #37 +Vert + sta WSYNC + dey + bne Vert + + lda #0 + sta VBLANK + + ldy #192 +Pic + sta WSYNC + dey + bne Pic + + lda #2 + sta VBLANK + + ldy #30 +Over + sta WSYNC + dey + bne Over + + jsr Call_1 + + lda PF_Color_Read + sta COLUPF + + + jmp StartFrame + + + + + org $EFE0 + rorg $FFE0 +Call_1 + stx $FFF9 + + nop + nop + nop + nop + nop + nop + + rts + + org $EFF8 + rorg $FFF8 + .word $FFFF + .word Start_0 + .word Start_0 + .word Start_0 + + seg Bank_1 + + org $F000 + rorg $F000 + + repeat 256 + .byte $00 + repend + +Init_1 + sta $FFF8 +Bank1_Sub +; lda #$0F +; sta COLUPF +; inc PF_Color + clc + lda PF_Color_Read + adc #1 + sta PF_Color_Write + rts + + org $FFE3 + rorg $FFE3 + jsr Bank1_Sub + stx $FFF8 + + org $FFF8 + .word $FFFF + .word Init_1 + .word Init_1 + .word Init_1 + diff --git a/test/roms/bankswitching/_code/F8SC.bin b/test/roms/bankswitching/_code/F8SC.bin new file mode 100644 index 000000000..7c3cfba1e Binary files /dev/null and b/test/roms/bankswitching/_code/F8SC.bin differ diff --git a/test/roms/bankswitching/_code/FA_CBS+RAM.asm b/test/roms/bankswitching/_code/FA_CBS+RAM.asm new file mode 100644 index 000000000..a38d240ea --- /dev/null +++ b/test/roms/bankswitching/_code/FA_CBS+RAM.asm @@ -0,0 +1,192 @@ +;;A demo using CBS Electronic's FA (12K) + RAM (256 bytes) bankswitching scheme +;;3/20/09 By: Rick Skrbina + + processor 6502 + include "vcs.h" + include "macro.h" + +;BG_Color_Read equ BG_Color_Write+256 +;PF_Color_Read equ PF_Color_Write+256 +;BG_Write equ $1000 +BG_Read equ BG_Write+256 +PF_Read equ PF_Write+256 + + seg.u RIOT_vars + org $80 + + + seg.u FA_RAM_vars + org $1000 +BG_Write ds 1 +PF_Write ds 1 + + seg bank_0 + org $D000 + rorg $F000 + + repeat 512 + .byte $D0 + repend +Bank0 + + nop + nop + nop + + CLEAN_START + + lda #$FF + sta PF_Write + sta PF1 + + lda #$0F + sta COLUBK + +Start_Frame + + lda #2 + sta VBLANK + sta VSYNC + + sta WSYNC + sta WSYNC + sta WSYNC + + lda #0 + sta VSYNC + + ldy #37 +VerticalBlank + sta WSYNC + dey + bne VerticalBlank + + lda #0 + sta VBLANK + + ldy #192 +Picture + sta WSYNC + dey + bne Picture + + lda #2 + sta VBLANK + + ldy #30 +Overscan + sta WSYNC + dey + bne Overscan + + jsr Switch_To_1 + jsr Switch_To_2 + + lda BG_Read + sta COLUBK + + lda PF_Read + sta COLUPF + + jmp Start_Frame + + org $D300 + rorg $F300 + +Switch_To_1 ;$F300 + + lda $FFF9 + + nop + nop + nop + + nop + nop + nop + + rts + +Switch_To_2 ;$ + + lda $FFFA + + nop + nop + nop + + nop + nop + nop + + rts + + + org $DFFC + rorg $FFFC + .word Bank0 + .byte "B0" + + seg bank_1 + org $E000 + rorg $F000 + + repeat 512 + .byte $00 + repend + +Bank1 + lda $FFF8 + +Change_BG_Color + + clc + lda BG_Read + adc #1 + sta BG_Write + + rts + + org $E303 + rorg $F303 + + + jsr Change_BG_Color + lda $FFF8 + + org $EFFC + rorg $FFFC + .word Bank1 + .byte "B1" + + seg bank_2 + org $F000 + rorg $F000 + + repeat 512 + .byte $00 + repend + +Bank2 + + lda $FFF8 + +Change_PF_Color + + sei + lda PF_Read + sbc #1 + sta PF_Write + + rts + + org $F30D + rorg $F30D + + jsr Change_PF_Color + lda $FFF8 + + org $FFFC + rorg $FFFC + .word Bank2 + .byte "B2" diff --git a/test/roms/bankswitching/_code/FA_CBS+RAM.bin b/test/roms/bankswitching/_code/FA_CBS+RAM.bin new file mode 100644 index 000000000..a20cab291 Binary files /dev/null and b/test/roms/bankswitching/_code/FA_CBS+RAM.bin differ diff --git a/test/roms/bankswitching/_code/SB_128K.asm b/test/roms/bankswitching/_code/SB_128K.asm new file mode 100644 index 000000000..39b6d113d --- /dev/null +++ b/test/roms/bankswitching/_code/SB_128K.asm @@ -0,0 +1,1135 @@ +;;A bankswitching demo for the 128K SuperBanking scheme. 32 4K banks +;;By: Rick Skrbina 4/4/09 + + processor 6502 + include "vcs.h" + include "macro.h" + + seg.u vars + org $80 + + + seg bank0 + org $0000 + rorg $F000 +Start0 + nop + nop + nop + CLEAN_START + +; lda #$1F +; sta COLUBK + +Start_Frame + lda #2 + sta VSYNC + sta VBLANK + sta WSYNC + sta WSYNC + sta WSYNC + lsr + sta VSYNC + + ldy #37 +Vertical_Blank + sta WSYNC + dey + bne Vertical_Blank + + lda #0 + sta VBLANK + + lda #$10 + sta COLUBK + + ldy #6 +Picture0 + sta WSYNC + dey + bne Picture0 + + ldx #1 + jsr Swch1 + + ldy #6 +Picture1 + sta WSYNC + dey + bne Picture1 + + inx + jsr Swch1 + + ldy #6 +Picture2 + sta WSYNC + dey + bne Picture2 + + inx + jsr Swch1 + + ldy #6 +Picture3 + sta WSYNC + dey + bne Picture3 + + inx + jsr Swch1 + + ldy #6 +Picture4 + sta WSYNC + dey + bne Picture4 + + inx + jsr Swch1 + + ldy #6 +Picture5 + sta WSYNC + dey + bne Picture5 + + inx + jsr Swch1 + + ldy #6 +Picture6 + sta WSYNC + dey + bne Picture6 + + inx + jsr Swch1 + + ldy #6 +Picture7 + sta WSYNC + dey + bne Picture7 + + inx + jsr Swch1 + + ldy #6 +Picture8 + sta WSYNC + dey + bne Picture8 + + inx + jsr Swch1 + + ldy #6 +Picture9 + sta WSYNC + dey + bne Picture9 + + inx + jsr Swch1 + + ldy #6 +PictureA + sta WSYNC + dey + bne PictureA + + inx + jsr Swch1 + + ldy #6 +PictureB + sta WSYNC + dey + bne PictureB + + inx + jsr Swch1 + + ldy #6 +PictureC + sta WSYNC + dey + bne PictureC + + inx + jsr Swch1 + + ldy #6 +PictureD + sta WSYNC + dey + bne PictureD + + inx + jsr Swch1 + + ldy #6 +PictureE + sta WSYNC + dey + bne PictureE + + inx + jsr Swch1 + + ldy #6 +PictureF + sta WSYNC + dey + bne PictureF + + inx + jsr Swch1 + + ldy #6 +Picture10 + sta WSYNC + dey + bne Picture10 + + inx + jsr Swch1 + + ldy #6 +Picture11 + sta WSYNC + dey + bne Picture11 + + inx + jsr Swch1 + + ldy #6 +Picture12 + sta WSYNC + dey + bne Picture12 + + inx + jsr Swch1 + + ldy #6 +Picture13 + sta WSYNC + dey + bne Picture13 + + inx + jsr Swch1 + + ldy #6 +Picture14 + sta WSYNC + dey + bne Picture14 + + inx + jsr Swch1 + + ldy #6 +Picture15 + sta WSYNC + dey + bne Picture15 + + inx + jsr Swch1 + + ldy #6 +Picture16 + sta WSYNC + dey + bne Picture16 + + inx + jsr Swch1 + + ldy #6 +Picture17 + sta WSYNC + dey + bne Picture17 + + inx + jsr Swch1 + + ldy #6 +Picture18 + sta WSYNC + dey + bne Picture18 + + inx + jsr Swch1 + + ldy #6 +Picture19 + sta WSYNC + dey + bne Picture19 + + inx + jsr Swch1 + + ldy #6 +Picture1A + sta WSYNC + dey + bne Picture1A + + inx + jsr Swch1 + + ldy #6 +Picture1B + sta WSYNC + dey + bne Picture1B + + inx + jsr Swch1 + + ldy #6 +Picture1C + sta WSYNC + dey + bne Picture1C + + inx + jsr Swch1 + + ldy #6 +Picture1D + sta WSYNC + dey + bne Picture1D + + inx + jsr Swch1 + + ldy #6 +Picture1E + sta WSYNC + dey + bne Picture1E + + inx + jsr Swch1 + + ldy #6 +Picture1F + sta WSYNC + dey + bne Picture1F + + inx + jsr Swch1 + + lda #2 + sta VBLANK + + ldy #30 +OverScan + sta WSYNC + dey + bne OverScan + + jmp Start_Frame + + + org $0200 + rorg $F200 + +Swch1 + lda $0800,x + nop + nop + nop + nop + nop + nop + rts + + + org $0FFC + rorg $FFFC + .word Start0 + .byte "00" + + seg bank1 + org $1000 + rorg $F000 +Start1 + lda $0800 +Sub1 + lda #$12 + sta COLUBK + rts + + org $1200 + rorg $F200 + + nop + nop + nop + jsr Sub1 + lda $0800 + + org $1FFC + rorg $FFFC + .word Start1 + .byte "01" + + seg bank2 + org $2000 + rorg $F000 +Start2 + lda $0800 + +Sub2 + lda #$14 + sta COLUBK + rts + + org $2200 + rorg $F1200 + + nop + nop + nop + jsr Sub2 + lda $0800 + + org $2FFC + rorg $FFFC + .word Start2 + .byte "02" + + seg bank3 + org $3000 + rorg $F000 +Start3 + lda $0800 + +Sub3 + lda #$16 + sta COLUBK + rts + + org $3200 + rorg $F200 + + nop + nop + nop + jsr Sub3 + lda $0800 + + org $3FFC + rorg $FFFC + .word Start3 + .byte "03" + + seg bank4 + org $4000 + rorg $F000 +Start4 + lda $0800 + +Sub4 + lda #$18 + sta COLUBK + rts + + org $4200 + rorg $F200 + + nop + nop + nop + jsr Sub4 + lda $0800 + + org $4FFC + rorg $FFFC + .word Start4 + .byte "04" + + seg bank5 + org $5000 + rorg $F000 +Start5 + lda $0800 + +Sub5 + lda #$1A + sta COLUBK + rts + + org $5200 + rorg $F200 + + nop + nop + nop + jsr Sub5 + lda $0800 + + org $5FFC + rorg $FFFC + .word Start5 + .byte "05" + + seg bank6 + org $6000 + rorg $F000 +Start6 + lda $0800 + +Sub6 + lda #$1C + sta COLUBK + rts + + org $6200 + rorg $F200 + + nop + nop + nop + jsr Sub6 + lda $0800 + + org $6FFC + rorg $FFFC + .word Start6 + .byte "06" + + seg bank7 + org $7000 + rorg $F000 +Start7 + lda $0800 + +Sub7 + lda #$1D + sta COLUBK + rts + + org $7200 + rorg $F200 + + nop + nop + nop + jsr Sub7 + lda $0800 + + org $7FFC + rorg $FFFC + .word Start7 + .byte "07" + + seg bank8 + org $8000 + rorg $F000 +Start8 + lda $0800 +Sub8 + lda #$1F + sta COLUBK + rts + + org $8200 + rorg $F200 + + nop + nop + nop + jsr Sub8 + lda $0800 + + org $8FFC + rorg $FFFC + .word Start8 + .byte "08" + + seg bank9 + org $9000 + rorg $F000 +Start9 + lda $0800 + +Sub9 + lda #$20 + sta COLUBK + rts + + org $9200 + rorg $F200 + + nop + nop + nop + jsr Sub9 + lda $0800 + + org $9FFC + rorg $FFFC + .word Start9 + .byte "09" + + seg bankA + org $A000 + rorg $F000 +StartA + lda $0800 + +SubA + lda #$22 + sta COLUBK + rts + + org $A200 + rorg $F200 + + nop + nop + nop + jsr SubA + lda $0800 + + org $AFFC + rorg $FFFC + .word StartA + .byte "0A" + + seg bankB + org $B000 + rorg $F000 +StartB + lda $0800 + +SubB + lda #$24 + sta COLUBK + rts + + org $B200 + rorg $F200 + + nop + nop + nop + jsr SubB + lda $0800 + + org $BFFC + rorg $FFFC + .word StartB + .byte "0B" + + seg bankC + org $C000 + rorg $F000 +StartC + lda $0800 + +SubC + lda #$26 + sta COLUBK + rts + + org $C200 + rorg $F200 + + nop + nop + nop + jsr SubC + lda $0800 + + org $CFFC + rorg $FFFC + .word StartC + .byte "0C" + + seg bankD + org $D000 + rorg $F000 +StartD + lda $0800 + +SubD + lda #$28 + sta COLUBK + rts + + org $D200 + rorg $F200 + + nop + nop + nop + jsr SubD + lda $0800 + + org $DFFC + rorg $FFFC + .word StartD + .byte "0D" + + seg bankE + org $E000 + rorg $F000 +StartE + lda $0800 + +SubE + lda #$2A + sta COLUBK + rts + + org $E200 + rorg $F200 + + nop + nop + nop + jsr SubE + lda $0800 + + org $EFFC + rorg $FFFC + .word StartE + .byte "0E" + + seg bankF + org $F000 + rorg $F000 +StartF + lda $0800 + +SubF + lda #$2C + sta COLUBK + rts + + org $F200 + rorg $F200 + + nop + nop + nop + jsr SubF + lda $0800 + + org $FFFC + rorg $FFFC + .word StartF + .byte "0F" + + seg bank10 + org $10000 + rorg $F000 +Start10 + lda $0800 + +Sub10 + lda #$2E + sta COLUBK + rts + + org $10200 + rorg $F200 + + nop + nop + nop + jsr Sub10 + lda $0800 + + org $10FFC + rorg $FFFC + .word Start10 + .byte "10" + + seg bank11 + org $11000 + rorg $F000 +Start11 + lda $0800 + +Sub11 + lda #$30 + sta COLUBK + rts + + org $11200 + rorg $F200 + + nop + nop + nop + jsr Sub11 + lda $0800 + + org $11FFC + rorg $FFFC + .word Start11 + .byte "11" + + seg bank12 + org $12000 + rorg $F000 +Start12 + lda $0800 + +Sub12 + lda #$32 + sta COLUBK + rts + + org $12200 + rorg $F200 + + nop + nop + nop + jsr Sub12 + lda $0800 + + org $12FFC + rorg $FFFC + .word Start12 + .byte "12" + + seg bank13 + org $13000 + rorg $F000 +Start13 + lda $0800 + +Sub13 + lda #$34 + sta COLUBK + rts + + org $13200 + rorg $F200 + + nop + nop + nop + jsr Sub13 + lda $0800 + + org $13FFC + rorg $FFFC + .word Start13 + .byte "13" + + seg bank14 + org $14000 + rorg $F000 +Start14 + lda $0800 + +Sub14 + lda #$36 + sta COLUBK + rts + + org $14200 + rorg $F200 + + nop + nop + nop + jsr Sub14 + lda $0800 + + org $14FFC + rorg $FFFC + .word Start14 + .byte "14" + + seg bank15 + org $15000 + rorg $F000 +Start15 + lda $0800 + +Sub15 lda #$38 + sta COLUBK + rts + + org $15200 + rorg $F200 + + nop + nop + nop + jsr Sub15 + lda $0800 + + org $15FFC + rorg $FFFC + .word Start15 + .byte "15" + + seg bank16 + org $16000 + rorg $F000 +Start16 + lda $0800 + +Sub16 + lda #$3A + sta COLUBK + rts + + org $16200 + rorg $F200 + + nop + nop + nop + jsr Sub16 + lda $0800 + + org $16FFC + rorg $FFFC + .word Start16 + .byte "16" + + seg bank17 + org $17000 + rorg $F000 +Start17 + lda $0800 + +Sub17 + lda #$3C + sta COLUBK + rts + + org $17200 + rorg $F200 + + nop + nop + nop + jsr Sub17 + lda $0800 + + org $17FFC + rorg $FFFC + .word Start17 + .byte "17" + + seg bank18 + org $18000 + rorg $F000 +Start18 + lda $0800 + +Sub18 + lda #$3E + sta COLUBK + rts + + org $18200 + rorg $F200 + + nop + nop + nop + jsr Sub18 + lda $0800 + + org $18FFC + rorg $FFFC + .word Start18 + .byte "18" + + seg bank19 + org $19000 + rorg $F000 +Start19 + lda $0800 + +Sub19 + lda #$40 + sta COLUBK + rts + + org $19200 + rorg $F200 + + nop + nop + nop + jsr Sub19 + lda $0800 + + org $19FFC + rorg $FFFC + .word Start19 + .byte "19" + + seg bank1A + org $1A000 + rorg $F000 +Start1A + lda $0800 + +Sub1A + lda #$42 + sta COLUBK + rts + + org $1A200 + rorg $F200 + + nop + nop + nop + jsr Sub1A + lda $0800 + + org $1AFFC + rorg $FFFC + .word Start1A + .byte "1A" + + seg bank1B + org $1B000 + rorg $F000 +Start1B + lda $0800 + +Sub1B + lda #$44 + sta COLUBK + rts + + org $1B200 + rorg $F200 + + nop + nop + nop + jsr Sub1B + lda $0800 + + org $1BFFC + rorg $FFFC + .word Start1B + .byte "1B" + + seg bank1C + org $1C000 + rorg $F000 +Start1C + lda $0800 + +Sub1C + lda #$46 + sta COLUBK + rts + + org $1C200 + rorg $F200 + + nop + nop + nop + jsr Sub1C + lda $0800 + + org $1CFFC + rorg $FFFC + .word Start1C + .byte "1C" + + seg bank1D + org $1D000 + rorg $F000 +Start1D + lda $0800 + +Sub1D + lda #$48 + sta COLUBK + rts + + org $1D200 + rorg $F200 + + nop + nop + nop + jsr Sub1D + lda $0800 + + org $1DFFC + rorg $FFFC + .word Start1D + .byte "1D" + + seg bank1E + org $1E000 + rorg $F000 +Start1E + lda $0800 + +Sub1E + lda #$4A + sta COLUBK + rts + + org $1E200 + rorg $F200 + + nop + nop + nop + jsr Sub1E + lda $0800 + + org $1EFFC + rorg $FFFC + .word Start1E + .byte "1E" + + seg bank1F + org $1F000 + rorg $F000 +Start1F + lda $0800 + +Sub1F + lda #$4C + sta COLUBK + rts + + org $1F200 + rorg $F200 + + nop + nop + nop + jsr Sub1F + lda $0800 + + org $1FFFC + rorg $FFFC + .word Start1F + .byte "1F" diff --git a/test/roms/bankswitching/_code/SB_128K.bin b/test/roms/bankswitching/_code/SB_128K.bin new file mode 100644 index 000000000..f6cb60f66 Binary files /dev/null and b/test/roms/bankswitching/_code/SB_128K.bin differ diff --git a/test/roms/bankswitching/_code/SB_256K.asm b/test/roms/bankswitching/_code/SB_256K.asm new file mode 100644 index 000000000..31cf528cc --- /dev/null +++ b/test/roms/bankswitching/_code/SB_256K.asm @@ -0,0 +1,1658 @@ +;;A bankswitching demo for the 256K SuperBanking scheme. 64 4K banks +;;By: Rick Skrbina 5/4/09 + + processor 6502 + include "vcs.h" + include "macro.h" + + seg.u vars + org $80 + + + seg bank0 + org $0000 + rorg $F000 +Start0 + nop + nop + nop + CLEAN_START + + +Start_Frame + lda #2 + sta VSYNC + sta VBLANK + sta WSYNC + sta WSYNC + sta WSYNC + lsr + sta VSYNC + + ldy #37 +Vertical_Blank + sta WSYNC + dey + bne Vertical_Blank + + lda #0 + sta VBLANK + + lda #$10 + sta COLUBK + + ldx #1 + ldy #3 + +Picture_Loop + sta WSYNC + dey + bne Picture_Loop + ldy #3 + jsr Swch1 + inx + cpx #$40 + bne Picture_Loop + + lda #2 + sta VBLANK + + ldy #30 +OverScan + sta WSYNC + dey + bne OverScan + + jmp Start_Frame + + + org $0200 + rorg $F200 + +Swch1 + lda $0800,x + nop + nop + nop + nop + nop + nop + rts + + + org $0FFC + rorg $FFFC + .word Start0 + .byte "00" + + seg bank1 + org $1000 + rorg $F000 +Start1 + lda $0800 +Sub1 + lda #$12 + sta COLUBK + rts + + org $1200 + rorg $F200 + + nop + nop + nop + jsr Sub1 + lda $0800 + + org $1FFC + rorg $FFFC + .word Start1 + .byte "01" + + seg bank2 + org $2000 + rorg $F000 +Start2 + lda $0800 + +Sub2 + lda #$14 + sta COLUBK + rts + + org $2200 + rorg $F1200 + + nop + nop + nop + jsr Sub2 + lda $0800 + + org $2FFC + rorg $FFFC + .word Start2 + .byte "02" + + seg bank3 + org $3000 + rorg $F000 +Start3 + lda $0800 + +Sub3 + lda #$16 + sta COLUBK + rts + + org $3200 + rorg $F200 + + nop + nop + nop + jsr Sub3 + lda $0800 + + org $3FFC + rorg $FFFC + .word Start3 + .byte "03" + + seg bank4 + org $4000 + rorg $F000 +Start4 + lda $0800 + +Sub4 + lda #$18 + sta COLUBK + rts + + org $4200 + rorg $F200 + + nop + nop + nop + jsr Sub4 + lda $0800 + + org $4FFC + rorg $FFFC + .word Start4 + .byte "04" + + seg bank5 + org $5000 + rorg $F000 +Start5 + lda $0800 + +Sub5 + lda #$1A + sta COLUBK + rts + + org $5200 + rorg $F200 + + nop + nop + nop + jsr Sub5 + lda $0800 + + org $5FFC + rorg $FFFC + .word Start5 + .byte "05" + + seg bank6 + org $6000 + rorg $F000 +Start6 + lda $0800 + +Sub6 + lda #$1C + sta COLUBK + rts + + org $6200 + rorg $F200 + + nop + nop + nop + jsr Sub6 + lda $0800 + + org $6FFC + rorg $FFFC + .word Start6 + .byte "06" + + seg bank7 + org $7000 + rorg $F000 +Start7 + lda $0800 + +Sub7 + lda #$1D + sta COLUBK + rts + + org $7200 + rorg $F200 + + nop + nop + nop + jsr Sub7 + lda $0800 + + org $7FFC + rorg $FFFC + .word Start7 + .byte "07" + + seg bank8 + org $8000 + rorg $F000 +Start8 + lda $0800 +Sub8 + lda #$1F + sta COLUBK + rts + + org $8200 + rorg $F200 + + nop + nop + nop + jsr Sub8 + lda $0800 + + org $8FFC + rorg $FFFC + .word Start8 + .byte "08" + + seg bank9 + org $9000 + rorg $F000 +Start9 + lda $0800 + +Sub9 + lda #$20 + sta COLUBK + rts + + org $9200 + rorg $F200 + + nop + nop + nop + jsr Sub9 + lda $0800 + + org $9FFC + rorg $FFFC + .word Start9 + .byte "09" + + seg bankA + org $A000 + rorg $F000 +StartA + lda $0800 + +SubA + lda #$22 + sta COLUBK + rts + + org $A200 + rorg $F200 + + nop + nop + nop + jsr SubA + lda $0800 + + org $AFFC + rorg $FFFC + .word StartA + .byte "0A" + + seg bankB + org $B000 + rorg $F000 +StartB + lda $0800 + +SubB + lda #$24 + sta COLUBK + rts + + org $B200 + rorg $F200 + + nop + nop + nop + jsr SubB + lda $0800 + + org $BFFC + rorg $FFFC + .word StartB + .byte "0B" + + seg bankC + org $C000 + rorg $F000 +StartC + lda $0800 + +SubC + lda #$26 + sta COLUBK + rts + + org $C200 + rorg $F200 + + nop + nop + nop + jsr SubC + lda $0800 + + org $CFFC + rorg $FFFC + .word StartC + .byte "0C" + + seg bankD + org $D000 + rorg $F000 +StartD + lda $0800 + +SubD + lda #$28 + sta COLUBK + rts + + org $D200 + rorg $F200 + + nop + nop + nop + jsr SubD + lda $0800 + + org $DFFC + rorg $FFFC + .word StartD + .byte "0D" + + seg bankE + org $E000 + rorg $F000 +StartE + lda $0800 + +SubE + lda #$2A + sta COLUBK + rts + + org $E200 + rorg $F200 + + nop + nop + nop + jsr SubE + lda $0800 + + org $EFFC + rorg $FFFC + .word StartE + .byte "0E" + + seg bankF + org $F000 + rorg $F000 +StartF + lda $0800 + +SubF + lda #$2C + sta COLUBK + rts + + org $F200 + rorg $F200 + + nop + nop + nop + jsr SubF + lda $0800 + + org $FFFC + rorg $FFFC + .word StartF + .byte "0F" + + seg bank10 + org $10000 + rorg $F000 +Start10 + lda $0800 + +Sub10 + lda #$2E + sta COLUBK + rts + + org $10200 + rorg $F200 + + nop + nop + nop + jsr Sub10 + lda $0800 + + org $10FFC + rorg $FFFC + .word Start10 + .byte "10" + + seg bank11 + org $11000 + rorg $F000 +Start11 + lda $0800 + +Sub11 + lda #$30 + sta COLUBK + rts + + org $11200 + rorg $F200 + + nop + nop + nop + jsr Sub11 + lda $0800 + + org $11FFC + rorg $FFFC + .word Start11 + .byte "11" + + seg bank12 + org $12000 + rorg $F000 +Start12 + lda $0800 + +Sub12 + lda #$32 + sta COLUBK + rts + + org $12200 + rorg $F200 + + nop + nop + nop + jsr Sub12 + lda $0800 + + org $12FFC + rorg $FFFC + .word Start12 + .byte "12" + + seg bank13 + org $13000 + rorg $F000 +Start13 + lda $0800 + +Sub13 + lda #$34 + sta COLUBK + rts + + org $13200 + rorg $F200 + + nop + nop + nop + jsr Sub13 + lda $0800 + + org $13FFC + rorg $FFFC + .word Start13 + .byte "13" + + seg bank14 + org $14000 + rorg $F000 +Start14 + lda $0800 + +Sub14 + lda #$36 + sta COLUBK + rts + + org $14200 + rorg $F200 + + nop + nop + nop + jsr Sub14 + lda $0800 + + org $14FFC + rorg $FFFC + .word Start14 + .byte "14" + + seg bank15 + org $15000 + rorg $F000 +Start15 + lda $0800 + +Sub15 lda #$38 + sta COLUBK + rts + + org $15200 + rorg $F200 + + nop + nop + nop + jsr Sub15 + lda $0800 + + org $15FFC + rorg $FFFC + .word Start15 + .byte "15" + + seg bank16 + org $16000 + rorg $F000 +Start16 + lda $0800 + +Sub16 + lda #$3A + sta COLUBK + rts + + org $16200 + rorg $F200 + + nop + nop + nop + jsr Sub16 + lda $0800 + + org $16FFC + rorg $FFFC + .word Start16 + .byte "16" + + seg bank17 + org $17000 + rorg $F000 +Start17 + lda $0800 + +Sub17 + lda #$3C + sta COLUBK + rts + + org $17200 + rorg $F200 + + nop + nop + nop + jsr Sub17 + lda $0800 + + org $17FFC + rorg $FFFC + .word Start17 + .byte "17" + + seg bank18 + org $18000 + rorg $F000 +Start18 + lda $0800 + +Sub18 + lda #$3E + sta COLUBK + rts + + org $18200 + rorg $F200 + + nop + nop + nop + jsr Sub18 + lda $0800 + + org $18FFC + rorg $FFFC + .word Start18 + .byte "18" + + seg bank19 + org $19000 + rorg $F000 +Start19 + lda $0800 + +Sub19 + lda #$40 + sta COLUBK + rts + + org $19200 + rorg $F200 + + nop + nop + nop + jsr Sub19 + lda $0800 + + org $19FFC + rorg $FFFC + .word Start19 + .byte "19" + + seg bank1A + org $1A000 + rorg $F000 +Start1A + lda $0800 + +Sub1A + lda #$42 + sta COLUBK + rts + + org $1A200 + rorg $F200 + + nop + nop + nop + jsr Sub1A + lda $0800 + + org $1AFFC + rorg $FFFC + .word Start1A + .byte "1A" + + seg bank1B + org $1B000 + rorg $F000 +Start1B + lda $0800 + +Sub1B + lda #$44 + sta COLUBK + rts + + org $1B200 + rorg $F200 + + nop + nop + nop + jsr Sub1B + lda $0800 + + org $1BFFC + rorg $FFFC + .word Start1B + .byte "1B" + + seg bank1C + org $1C000 + rorg $F000 +Start1C + lda $0800 + +Sub1C + lda #$46 + sta COLUBK + rts + + org $1C200 + rorg $F200 + + nop + nop + nop + jsr Sub1C + lda $0800 + + org $1CFFC + rorg $FFFC + .word Start1C + .byte "1C" + + seg bank1D + org $1D000 + rorg $F000 +Start1D + lda $0800 + +Sub1D + lda #$48 + sta COLUBK + rts + + org $1D200 + rorg $F200 + + nop + nop + nop + jsr Sub1D + lda $0800 + + org $1DFFC + rorg $FFFC + .word Start1D + .byte "1D" + + seg bank1E + org $1E000 + rorg $F000 +Start1E + lda $0800 + +Sub1E + lda #$4A + sta COLUBK + rts + + org $1E200 + rorg $F200 + + nop + nop + nop + jsr Sub1E + lda $0800 + + org $1EFFC + rorg $FFFC + .word Start1E + .byte "1E" + + seg bank1F + org $1F000 + rorg $F000 +Start1F + lda $0800 + +Sub1F + lda #$4C + sta COLUBK + rts + + org $1F200 + rorg $F200 + + nop + nop + nop + jsr Sub1F + lda $0800 + + org $1FFFC + rorg $FFFC + .word Start1F + .byte "1F" + + seg bank20 + org $20000 + rorg $F000 +Start20 + lda $0800 + +Sub20 + lda #$4E + sta COLUBK + rts + + org $20200 + rorg $F200 + + nop + nop + nop + jsr Sub20 + lda $0800 + + org $20FFC + rorg $FFFC + .word Start20 + .byte "20" + + seg bank21 + org $21000 + rorg $F000 +Start21 + lda $0800 + +Sub21 + lda #$50 + sta COLUBK + rts + + org $21200 + rorg $F200 + + nop + nop + nop + jsr Sub21 + lda $0800 + + org $21FFC + rorg $FFFC + .word Start21 + .byte "21" + + seg bank22 + org $22000 + rorg $F000 +Start22 + lda $0800 + +Sub22 + lda #$52 + sta COLUBK + rts + + org $22200 + rorg $F200 + + nop + nop + nop + jsr Sub22 + lda $0800 + + org $22FFC + rorg $FFFC + .word Start22 + .byte "22" + + seg bank23 + org $23000 + rorg $F000 +Start23 + lda $0800 + +Sub23 + lda #$54 + sta COLUBK + rts + + org $23200 + rorg $F200 + + nop + nop + nop + jsr Sub23 + lda $0800 + + org $23FFC + rorg $FFFC + .word Start23 + .byte "23" + + seg bank24 + org $24000 + rorg $F000 +Start24 + lda $0800 + +Sub24 + lda #$56 + sta COLUBK + rts + + org $24200 + rorg $F200 + + nop + nop + nop + jsr Sub24 + lda $0800 + + org $24FFC + rorg $FFFC + .word Start24 + .byte "24" + + seg bank25 + org $25000 + rorg $F000 +Start25 + lda $0800 + +Sub25 + lda #$58 + sta COLUBK + rts + + org $25200 + rorg $F200 + + nop + nop + nop + jsr Sub25 + lda $0800 + + org $25FFC + rorg $FFFC + .word Start25 + .byte "25" + + seg bank26 + org $26000 + rorg $F000 +Start26 + lda $0800 + +Sub26 + lda #$5A + sta COLUBK + rts + + org $26200 + rorg $F200 + + nop + nop + nop + jsr Sub26 + lda $0800 + + org $26FFC + rorg $FFFC + .word Start26 + .byte "26" + + seg bank27 + org $27000 + rorg $F000 +Start27 + lda $0800 + +Sub27 + lda #$5C + sta COLUBK + rts + + org $27200 + rorg $F200 + + nop + nop + nop + jsr Sub27 + lda $0800 + + org $27FFC + rorg $FFFC + .word Start27 + .byte "27" + + seg bank28 + org $28000 + rorg $F000 +Start28 + lda $0800 + +Sub28 + lda #$5E + sta COLUBK + rts + + org $28200 + rorg $F200 + + nop + nop + nop + jsr Sub28 + lda $0800 + + org $28FFC + rorg $FFFC + .word Start28 + .byte "28" + + seg bank29 + org $29000 + rorg $F000 +Start29 + lda $0800 + +Sub29 + lda #$60 + sta COLUBK + rts + + org $29200 + rorg $F200 + + nop + nop + nop + jsr Sub29 + lda $0800 + + org $29FFC + rorg $FFFC + .word Start29 + .byte "29" + + seg bank2A + org $2A000 + rorg $F000 +Start2A + lda $0800 + +Sub2A + lda #$62 + sta COLUBK + rts + + org $2A200 + rorg $F200 + + nop + nop + nop + jsr Sub2A + lda $0800 + + org $2AFFC + rorg $FFFC + .word Start2A + .byte "2A" + + seg bank2B + org $2B000 + rorg $F000 +Start2B + lda $0800 + +Sub2B + lda #$64 + sta COLUBK + rts + + org $2B200 + rorg $F200 + + nop + nop + nop + jsr Sub2B + lda $0800 + + org $2BFFC + rorg $FFFC + .word Start2B + .byte "2B" + + seg bank2C + org $2C000 + rorg $F000 +Start2C + lda $0800 + +Sub2C + lda #$66 + sta COLUBK + rts + + org $2C200 + rorg $F200 + + nop + nop + nop + jsr Sub2C + lda $0800 + + org $2CFFC + rorg $FFFC + .word Start2C + .byte "2C" + + seg bank2D + org $2D000 + rorg $F000 +Start2D + lda $0800 + +Sub2D + lda #$68 + sta COLUBK + rts + + org $2D200 + rorg $F200 + + nop + nop + nop + jsr Sub2D + lda $0800 + + org $2DFFC + rorg $FFFC + .word Start2D + .byte "2D" + + seg bank2E + org $2E000 + rorg $F000 +Start2E + lda $0800 + +Sub2E + lda #$6A + sta COLUBK + rts + + org $2E200 + rorg $F200 + + nop + nop + nop + jsr Sub2E + lda $0800 + + org $2EFFC + rorg $FFFC + .word Start2E + .byte "2E" + + seg bank2F + org $2F000 + rorg $F000 +Start2F + lda $0800 + +Sub2F + lda #$6C + sta COLUBK + rts + + org $2F200 + rorg $F200 + + nop + nop + nop + jsr Sub2F + lda $0800 + + org $2FFFC + rorg $FFFC + .word Start2F + .byte "2F" + + seg bank30 + org $30000 + rorg $F000 +Start30 + lda $0800 + +Sub30 + lda #$6E + sta COLUBK + rts + + org $30200 + rorg $F200 + + nop + nop + nop + jsr Sub30 + lda $0800 + + org $30FFC + rorg $FFFC + .word Start30 + .byte "30" + + seg bank31 + org $31000 + rorg $F000 +Start31 + lda $0800 + +Sub31 + lda #$70 + sta COLUBK + rts + + org $31200 + rorg $F200 + + nop + nop + nop + jsr Sub31 + lda $0800 + + org $31FFC + rorg $FFFC + .word Start31 + .byte "31" + + seg bank32 + org $32000 + rorg $F000 +Start32 + lda $0800 + +Sub32 + lda #$72 + sta COLUBK + rts + + org $32200 + rorg $F200 + + nop + nop + nop + jsr Sub32 + lda $0800 + + org $32FFC + rorg $FFFC + .word Start32 + .byte "32" + + seg bank33 + org $33000 + rorg $F000 +Start33 + lda $0800 + +Sub33 + lda #$74 + sta COLUBK + rts + + org $33200 + rorg $F200 + + nop + nop + nop + jsr Sub33 + lda $0800 + + org $33FFC + rorg $FFFC + .word Start33 + .byte "33" + + seg bank34 + org $34000 + rorg $F000 +Start34 + lda $0800 + +Sub34 + lda #$76 + sta COLUBK + rts + + org $34200 + rorg $F200 + + nop + nop + nop + jsr Sub34 + lda $0800 + + org $34FFC + rorg $FFFC + .word Start34 + .byte "34" + + seg bank35 + org $35000 + rorg $F000 +Start35 + lda $0800 + +Sub35 + lda #$78 + sta COLUBK + rts + + org $35200 + rorg $F200 + + nop + nop + nop + jsr Sub35 + lda $0800 + + org $35FFC + rorg $FFFC + .word Start35 + .byte "35" + + seg bank36 + org $36000 + rorg $F000 +Start36 + lda $0800 + +Sub36 + lda #$7A + sta COLUBK + rts + + org $36200 + rorg $F200 + + nop + nop + nop + jsr Sub36 + lda $0800 + + org $36FFC + rorg $FFFC + .word Start36 + .byte "36" + + seg bank37 + org $37000 + rorg $F000 +Start37 + lda $0800 + +Sub37 + lda #$7C + sta COLUBK + rts + + org $37200 + rorg $F200 + + nop + nop + nop + jsr Sub37 + lda $0800 + + org $37FFC + rorg $FFFC + .word Start37 + .byte "37" + + seg bank38 + org $38000 + rorg $F000 +Start38 + lda $0800 + +Sub38 + lda #$7E + sta COLUBK + rts + + org $38200 + rorg $F200 + + nop + nop + nop + jsr Sub38 + lda $0800 + + org $38FFC + rorg $FFFC + .word Start38 + .byte "38" + + seg bank39 + org $39000 + rorg $F000 +Start39 + lda $0800 + +Sub39 + lda #$80 + sta COLUBK + rts + + org $39200 + rorg $F200 + + nop + nop + nop + jsr Sub39 + lda $0800 + + org $39FFC + rorg $FFFC + .word Start39 + .byte "39" + + seg bank3A + org $3A000 + rorg $F000 +Start3A + lda $0800 + +Sub3A + lda #$82 + sta COLUBK + rts + + org $3A200 + rorg $F200 + + nop + nop + nop + jsr Sub3A + lda $0800 + + org $3AFFC + rorg $FFFC + .word Start3A + .byte "3A" + + seg bank3B + org $3B000 + rorg $F000 +Start3B + lda $0800 + +Sub3B + lda #$84 + sta COLUBK + rts + + org $3B200 + rorg $F200 + + nop + nop + nop + jsr Sub3B + lda $0800 + + org $3BFFC + rorg $FFFC + .word Start3B + .byte "3B" + + seg bank3C + org $3C000 + rorg $F000 +Start3C + lda $0800 + +Sub3C + lda #$86 + sta COLUBK + rts + + org $3C200 + rorg $F200 + + nop + nop + nop + jsr Sub3C + lda $0800 + + org $3CFFC + rorg $FFFC + .word Start3C + .byte "3C" + + seg bank3D + org $3D000 + rorg $F000 +Start3D + lda $0800 + +Sub3D + lda #$88 + sta COLUBK + rts + + org $3D200 + rorg $F200 + + nop + nop + nop + jsr Sub3D + lda $0800 + + org $3DFFC + rorg $FFFC + .word Start3D + .byte "3D" + + seg bank3E + org $3E000 + rorg $F000 +Start3E + lda $0800 + +Sub3E + lda #$8A + sta COLUBK + rts + + org $3E200 + rorg $F200 + + nop + nop + nop + jsr Sub3E + lda $0800 + + org $3EFFC + rorg $FFFC + .word Start3E + .byte "3E" + + seg bank3F + org $3F000 + rorg $F000 +Start3F + lda $0800 + +Sub3F + lda #$8C + sta COLUBK + rts + + org $3F200 + rorg $F200 + + nop + nop + nop + jsr Sub3F + lda $0800 + + org $3FFFC + rorg $FFFC + .word Start3F + .byte "3F" diff --git a/test/roms/bankswitching/_code/SB_256K.bin b/test/roms/bankswitching/_code/SB_256K.bin new file mode 100644 index 000000000..f8c818282 Binary files /dev/null and b/test/roms/bankswitching/_code/SB_256K.bin differ diff --git a/test/roms/bankswitching/_code/UA_Limited.asm b/test/roms/bankswitching/_code/UA_Limited.asm new file mode 100644 index 000000000..a79347e53 --- /dev/null +++ b/test/roms/bankswitching/_code/UA_Limited.asm @@ -0,0 +1,102 @@ +;;A bankswitching demo for the UA limited technique. 2 4K banks (8K) +;;By: Rick Skrbina 3/29/09 + + processor 6502 + include "vcs.h" + include "macro.h" + + + seg.u vars + org $80 +BG_Color ds 1 + + seg Bank0 + org $E000 + rorg $F000 +Start0 + nop + nop + nop + + CLEAN_START + +Start_Frame + lda #2 + sta VBLANK + sta VSYNC + sta WSYNC + sta WSYNC + sta WSYNC + lsr + sta VSYNC + ldy #37 +VerticalBlank + sta WSYNC + dey + bne VerticalBlank + + sta VBLANK + + ldy #192 +Picture + sta WSYNC + dey + bne Picture + + lda #2 + sta VBLANK + + ldy #30 +OverScan + sta WSYNC + dey + bne OverScan + + jsr SwchTo1 + + lda BG_Color + sta COLUBK + + jmp Start_Frame + + org $EFE0 + rorg $FFE0 +SwchTo1 + lda $0240 + nop + nop + nop + nop + nop + nop + rts + + org $EFFC + rorg $FFFC + .word Start0 + .byte "B0" + + seg Bank1 + org $F000 + rorg $F000 +Start1 + lda $0220 + +Bank1Sub + + inc BG_Color + rts + + org $FFE0 + rorg $FFE0 + + nop + nop + nop + jsr Bank1Sub + lda $0220 + + org $FFFC + rorg $FFFC + .word Start1 + .byte "B1" diff --git a/test/roms/bankswitching/_code/UA_Limited.bin b/test/roms/bankswitching/_code/UA_Limited.bin new file mode 100644 index 000000000..5cb088b29 Binary files /dev/null and b/test/roms/bankswitching/_code/UA_Limited.bin differ diff --git a/test/roms/bankswitching/_code/macro.h b/test/roms/bankswitching/_code/macro.h new file mode 100644 index 000000000..ce7b9a15c --- /dev/null +++ b/test/roms/bankswitching/_code/macro.h @@ -0,0 +1,165 @@ +; MACRO.H +; Version 1.06, 3/SEPTEMBER/2004 + +VERSION_MACRO = 106 + +; +; THIS FILE IS EXPLICITLY SUPPORTED AS A DASM-PREFERRED COMPANION FILE +; PLEASE DO *NOT* REDISTRIBUTE MODIFIED VERSIONS OF THIS FILE! +; +; This file defines DASM macros useful for development for the Atari 2600. +; It is distributed as a companion machine-specific support package +; for the DASM compiler. Updates to this file, DASM, and associated tools are +; available at at http://www.atari2600.org/dasm +; +; Many thanks to the people who have contributed. If you take issue with the +; contents, or would like to add something, please write to me +; (atari2600@taswegian.com) with your contribution. +; +; Latest Revisions... +; +; 1.06 03/SEP/2004 - nice revision of VERTICAL_BLANK (Edwin Blink) +; 1.05 14/NOV/2003 - Added VERSION_MACRO equate (which will reflect 100x version #) +; This will allow conditional code to verify MACRO.H being +; used for code assembly. +; 1.04 13/NOV/2003 - SET_POINTER macro added (16-bit address load) +; +; 1.03 23/JUN/2003 - CLEAN_START macro added - clears TIA, RAM, registers +; +; 1.02 14/JUN/2003 - VERTICAL_SYNC macro added +; (standardised macro for vertical synch code) +; 1.01 22/MAR/2003 - SLEEP macro added. +; - NO_ILLEGAL_OPCODES switch implemented +; 1.0 22/MAR/2003 Initial release + +; Note: These macros use illegal opcodes. To disable illegal opcode usage, +; define the symbol NO_ILLEGAL_OPCODES (-DNO_ILLEGAL_OPCODES=1 on command-line). +; If you do not allow illegal opcode usage, you must include this file +; *after* including VCS.H (as the non-illegal opcodes access hardware +; registers and require them to be defined first). + +; Available macros... +; SLEEP n - sleep for n cycles +; VERTICAL_SYNC - correct 3 scanline vertical synch code +; CLEAN_START - set machine to known state on startup +; SET_POINTER - load a 16-bit absolute to a 16-bit variable + +;------------------------------------------------------------------------------- +; SLEEP duration +; Original author: Thomas Jentzsch +; Inserts code which takes the specified number of cycles to execute. This is +; useful for code where precise timing is required. +; ILLEGAL-OPCODE VERSION DOES NOT AFFECT FLAGS OR REGISTERS. +; LEGAL OPCODE VERSION MAY AFFECT FLAGS +; Uses illegal opcode (DASM 2.20.01 onwards). + + MAC SLEEP ;usage: SLEEP n (n>1) +.CYCLES SET {1} + + IF .CYCLES < 2 + ECHO "MACRO ERROR: 'SLEEP': Duration must be > 1" + ERR + ENDIF + + IF .CYCLES & 1 + IFNCONST NO_ILLEGAL_OPCODES + nop 0 + ELSE + bit VSYNC + ENDIF +.CYCLES SET .CYCLES - 3 + ENDIF + + REPEAT .CYCLES / 2 + nop + REPEND + ENDM + +;------------------------------------------------------------------------------- +; VERTICAL_SYNC +; revised version by Edwin Blink -- saves bytes! +; Inserts the code required for a proper 3 scanline vertical sync sequence +; Note: Alters the accumulator + +; OUT: A = 0 + + MAC VERTICAL_SYNC + lda #%1110 ; each '1' bits generate a VSYNC ON line (bits 1..3) +.VSLP1 sta WSYNC ; 1st '0' bit resets Vsync, 2nd '0' bit exit loop + sta VSYNC + lsr + bne .VSLP1 ; branch until VYSNC has been reset + ENDM + +;------------------------------------------------------------------------------- +; CLEAN_START +; Original author: Andrew Davie +; Standardised start-up code, clears stack, all TIA registers and RAM to 0 +; Sets stack pointer to $FF, and all registers to 0 +; Sets decimal mode off, sets interrupt flag (kind of un-necessary) +; Use as very first section of code on boot (ie: at reset) +; Code written to minimise total ROM usage - uses weird 6502 knowledge :) + + MAC CLEAN_START + sei + cld + + ldx #0 + txa + tay +.CLEAR_STACK dex + txs + pha + bne .CLEAR_STACK ; SP=$FF, X = A = Y = 0 + + ENDM + +;------------------------------------------------------- +; SET_POINTER +; Original author: Manuel Rotschkar +; +; Sets a 2 byte RAM pointer to an absolute address. +; +; Usage: SET_POINTER pointer, address +; Example: SET_POINTER SpritePTR, SpriteData +; +; Note: Alters the accumulator, NZ flags +; IN 1: 2 byte RAM location reserved for pointer +; IN 2: absolute address + + MAC SET_POINTER +.POINTER SET {1} +.ADDRESS SET {2} + + LDA #<.ADDRESS ; Get Lowbyte of Address + STA .POINTER ; Store in pointer + LDA #>.ADDRESS ; Get Hibyte of Address + STA .POINTER+1 ; Store in pointer+1 + + ENDM + +;------------------------------------------------------- +; BOUNDARY byte# +; Original author: Denis Debro (borrowed from Bob Smith / Thomas) +; +; Push data to a certain position inside a page and keep count of how +; many free bytes the programmer will have. +; +; eg: BOUNDARY 5 ; position at byte #5 in page + +__DASM__TOTAL_FREE_MEMORY SET 0 +.FREE_BYTES SET 0 + MAC BOUNDARY + REPEAT 256 + IF <. % {1} = 0 + MEXIT + ELSE +.FREE_BYTES SET .FREE_BYTES + 1 + .byte $00 + ENDIF + REPEND +__DASM__TOTAL_FREE_MEMORY SET __DASM__TOTAL_FREE_MEMORY + .FREE_BYTES + ENDM + + +; EOF diff --git a/test/roms/bankswitching/_code/test.bin b/test/roms/bankswitching/_code/test.bin new file mode 100644 index 000000000..7c3cfba1e Binary files /dev/null and b/test/roms/bankswitching/_code/test.bin differ diff --git a/test/roms/bankswitching/_code/test.lst b/test/roms/bankswitching/_code/test.lst new file mode 100644 index 000000000..ccc974d97 --- /dev/null +++ b/test/roms/bankswitching/_code/test.lst @@ -0,0 +1,1493 @@ +------- FILE F8SC.asm LEVEL 1 PASS 2 + 1 10000 ???? ;;A bankswitching demo for the F8SC scheme. 2 4K banks of ROM + 128 bytes of RAM + 2 10000 ???? ;;By: Rick Skrbina 3/29/09 + 3 10000 ???? + 4 10000 ???? processor 6502 +------- FILE vcs.h LEVEL 2 PASS 2 + 0 10000 ???? include "vcs.h" + 1 10000 ???? ; + 2 10000 ???? ; VCS system equates + 3 10000 ???? ; + 4 10000 ???? ; Vertical blank registers + 5 10000 ???? ; + 6 10000 ???? 00 00 VSYNC = $00 + 7 10000 ???? 00 02 VS_Enable = 2 + 8 10000 ???? ; + 9 10000 ???? 00 01 VBLANK = $01 + 10 10000 ???? 00 02 VB_Enable = 2 + 11 10000 ???? 00 00 VB_Disable = 0 + 12 10000 ???? 00 40 VB_LatchEnable = 64 + 13 10000 ???? 00 00 VB_LatchDisable = 0 + 14 10000 ???? 00 80 VB_DumpPots = 128 + 15 10000 ???? ; I don't know a good name to un-dump the pots, + 16 10000 ???? ; at least that makes sense. + 17 10000 ???? + 18 10000 ???? 00 02 WSYNC = $02 + 19 10000 ???? 00 03 RSYNC = $03 ;for sadists + 20 10000 ???? ; + 21 10000 ???? ; Size registers for players and missiles + 22 10000 ???? ; + 23 10000 ???? 00 04 NUSIZ0 = $04 + 24 10000 ???? 00 05 NUSIZ1 = $05 + 25 10000 ???? 00 00 P_Single = 0 + 26 10000 ???? 00 01 P_TwoClose = 1 + 27 10000 ???? 00 02 P_TwoMedium = 2 + 28 10000 ???? 00 03 P_ThreeClose = 3 + 29 10000 ???? 00 04 P_TwoFar = 4 + 30 10000 ???? 00 05 P_Double = 5 + 31 10000 ???? 00 06 P_ThreeMedium = 6 + 32 10000 ???? 00 07 P_Quad = 7 + 33 10000 ???? + 34 10000 ???? 00 00 M_Single = $00 + 35 10000 ???? 00 10 M_Double = $10 + 36 10000 ???? 00 20 M_Quad = $20 + 37 10000 ???? 00 40 M_Oct = $40 + 38 10000 ???? + 39 10000 ???? ; + 40 10000 ???? ; Color registers + 41 10000 ???? ; + 42 10000 ???? 00 06 COLUP0 = $06 + 43 10000 ???? 00 07 COLUP1 = $07 + 44 10000 ???? 00 08 COLUPF = $08 + 45 10000 ???? 00 09 COLUBK = $09 + 46 10000 ???? + 47 10000 ???? ; + 48 10000 ???? ; Playfield Control + 49 10000 ???? ; + 50 10000 ???? 00 0a CTRLPF = $0A + 51 10000 ???? 00 01 PF_Reflect = $01 + 52 10000 ???? 00 02 PF_Score = $02 + 53 10000 ???? 00 04 PF_Priority = $04 + 54 10000 ???? ; Use missile equates to set ball width. + 55 10000 ???? + 56 10000 ???? 00 0b REFP0 = $0B + 57 10000 ???? 00 0c REFP1 = $0C + 58 10000 ???? 00 08 P_Reflect = $08 + 59 10000 ???? + 60 10000 ???? 00 0d PF0 = $0D + 61 10000 ???? 00 0e PF1 = $0E + 62 10000 ???? 00 0f PF2 = $0F + 63 10000 ???? 00 10 RESP0 = $10 + 64 10000 ???? 00 11 RESP1 = $11 + 65 10000 ???? 00 12 RESM0 = $12 + 66 10000 ???? 00 13 RESM1 = $13 + 67 10000 ???? 00 14 RESBL = $14 + 68 10000 ???? 00 15 AUDC0 = $15 + 69 10000 ???? 00 16 AUDC1 = $16 + 70 10000 ???? 00 17 AUDF0 = $17 + 71 10000 ???? 00 18 AUDF1 = $18 + 72 10000 ???? 00 19 AUDV0 = $19 + 73 10000 ???? 00 1a AUDV1 = $1A ;duh + 74 10000 ???? + 75 10000 ???? ; + 76 10000 ???? ; Players + 77 10000 ???? ; + 78 10000 ???? 00 1b GRP0 = $1B + 79 10000 ???? 00 1c GRP1 = $1C + 80 10000 ???? + 81 10000 ???? ; + 82 10000 ???? ; Single-bit objects + 83 10000 ???? ; + 84 10000 ???? 00 1d ENAM0 = $1D + 85 10000 ???? 00 1e ENAM1 = $1E + 86 10000 ???? 00 1f ENABL = $1F + 87 10000 ???? 00 02 M_Enable = 2 + 88 10000 ???? + 89 10000 ???? 00 20 HMP0 = $20 + 90 10000 ???? 00 21 HMP1 = $21 + 91 10000 ???? 00 22 HMM0 = $22 + 92 10000 ???? 00 23 HMM1 = $23 + 93 10000 ???? 00 24 HMBL = $24 + 94 10000 ???? + 95 10000 ???? ; Miscellaneous + 96 10000 ???? 00 25 VDELP0 = $25 + 97 10000 ???? 00 26 VDEL01 = $26 + 98 10000 ???? 00 26 VDELP1 = $26 + 99 10000 ???? 00 27 VDELBL = $27 + 100 10000 ???? 00 28 RESMP0 = $28 + 101 10000 ???? 00 29 RESMP1 = $29 + 102 10000 ???? 00 2a HMOVE = $2A + 103 10000 ???? 00 2b HMCLR = $2B + 104 10000 ???? 00 2c CXCLR = $2C + 105 10000 ???? 00 30 CXM0P = $30 + 106 10000 ???? 00 31 CXM1P = $31 + 107 10000 ???? 00 32 CXP0FB = $32 + 108 10000 ???? 00 33 CXP1FB = $33 + 109 10000 ???? 00 34 CXM0FB = $34 + 110 10000 ???? 00 35 CXM1FB = $35 + 111 10000 ???? 00 36 CXBLPF = $36 + 112 10000 ???? 00 37 CXPPMM = $37 + 113 10000 ???? 00 38 INPT0 = $38 + 114 10000 ???? 00 39 INPT1 = $39 + 115 10000 ???? 00 3a INPT2 = $3A + 116 10000 ???? 00 3b INPT3 = $3B + 117 10000 ???? 00 3c INPT4 = $3C + 118 10000 ???? 00 3d INPT5 = $3D + 119 10000 ???? + 120 10000 ???? ; + 121 10000 ???? ; Switch A equates. + 122 10000 ???? ; + 123 10000 ???? ; There are more elegant ways than using all eight of these. :-) + 124 10000 ???? ; + 125 10000 ???? 02 80 SWCHA = $0280 + 126 10000 ???? 00 80 J0_Right = $80 + 127 10000 ???? 00 40 J0_Left = $40 + 128 10000 ???? 00 20 J0_Down = $20 + 129 10000 ???? 00 10 J0_Up = $10 + 130 10000 ???? 00 08 J1_Right = $08 + 131 10000 ???? 00 04 J1_Left = $04 + 132 10000 ???? 00 02 J1_Down = $02 + 133 10000 ???? 00 01 J1_up = $01 + 134 10000 ???? ; + 135 10000 ???? ; Switch B equates + 136 10000 ???? ; + 137 10000 ???? 02 82 SWCHB = $0282 + 138 10000 ???? 00 80 P0_Diff = $80 + 139 10000 ???? 00 40 P1_Diff = $40 + 140 10000 ???? 00 08 Con_Color = $08 + 141 10000 ???? 00 02 Con_Select = $02 + 142 10000 ???? 00 01 Con_Start = $01 + 143 10000 ???? + 144 10000 ???? ; + 145 10000 ???? ; Timer + 146 10000 ???? ; + 147 10000 ???? 02 80 SWCHA = $0280 + 148 10000 ???? 02 81 SWACNT = $0281 + 149 10000 ???? 02 82 SWCHB = $0282 + 150 10000 ???? 02 83 SWBCNT = $0283 + 151 10000 ???? 02 84 INTIM = $0284 + 152 10000 ???? 02 94 TIM1T = $0294 + 153 10000 ???? 02 95 TIM8T = $0295 + 154 10000 ???? 02 96 TIM64T = $0296 + 155 10000 ???? 02 97 TIM1024T = $0297 + 156 10000 ???? + 157 10000 ???? +------- FILE F8SC.asm +------- FILE macro.h LEVEL 2 PASS 2 + 0 10000 ???? include "macro.h" + 1 10000 ???? ; MACRO.H + 2 10000 ???? ; Version 1.06, 3/SEPTEMBER/2004 + 3 10000 ???? + 4 10000 ???? 00 6a VERSION_MACRO = 106 + 5 10000 ???? + 6 10000 ???? ; + 7 10000 ???? ; THIS FILE IS EXPLICITLY SUPPORTED AS A DASM-PREFERRED COMPANION FILE + 8 10000 ???? ; PLEASE DO *NOT* REDISTRIBUTE MODIFIED VERSIONS OF THIS FILE! + 9 10000 ???? ; + 10 10000 ???? ; This file defines DASM macros useful for development for the Atari 2600. + 11 10000 ???? ; It is distributed as a companion machine-specific support package + 12 10000 ???? ; for the DASM compiler. Updates to this file, DASM, and associated tools are + 13 10000 ???? ; available at at http://www.atari2600.org/dasm + 14 10000 ???? ; + 15 10000 ???? ; Many thanks to the people who have contributed. If you take issue with the + 16 10000 ???? ; contents, or would like to add something, please write to me + 17 10000 ???? ; (atari2600@taswegian.com) with your contribution. + 18 10000 ???? ; + 19 10000 ???? ; Latest Revisions... + 20 10000 ???? ; + 21 10000 ???? ; 1.06 03/SEP/2004 - nice revision of VERTICAL_BLANK (Edwin Blink) + 22 10000 ???? ; 1.05 14/NOV/2003 - Added VERSION_MACRO equate (which will reflect 100x version #) + 23 10000 ???? ; This will allow conditional code to verify MACRO.H being + 24 10000 ???? ; used for code assembly. + 25 10000 ???? ; 1.04 13/NOV/2003 - SET_POINTER macro added (16-bit address load) + 26 10000 ???? ; + 27 10000 ???? ; 1.03 23/JUN/2003 - CLEAN_START macro added - clears TIA, RAM, registers + 28 10000 ???? ; + 29 10000 ???? ; 1.02 14/JUN/2003 - VERTICAL_SYNC macro added + 30 10000 ???? ; (standardised macro for vertical synch code) + 31 10000 ???? ; 1.01 22/MAR/2003 - SLEEP macro added. + 32 10000 ???? ; - NO_ILLEGAL_OPCODES switch implemented + 33 10000 ???? ; 1.0 22/MAR/2003 Initial release + 34 10000 ???? + 35 10000 ???? ; Note: These macros use illegal opcodes. To disable illegal opcode usage, + 36 10000 ???? ; define the symbol NO_ILLEGAL_OPCODES (-DNO_ILLEGAL_OPCODES=1 on command-line). + 37 10000 ???? ; If you do not allow illegal opcode usage, you must include this file + 38 10000 ???? ; *after* including VCS.H (as the non-illegal opcodes access hardware + 39 10000 ???? ; registers and require them to be defined first). + 40 10000 ???? + 41 10000 ???? ; Available macros... + 42 10000 ???? ; SLEEP n - sleep for n cycles + 43 10000 ???? ; VERTICAL_SYNC - correct 3 scanline vertical synch code + 44 10000 ???? ; CLEAN_START - set machine to known state on startup + 45 10000 ???? ; SET_POINTER - load a 16-bit absolute to a 16-bit variable + 46 10000 ???? + 47 10000 ???? ;------------------------------------------------------------------------------- + 48 10000 ???? ; SLEEP duration + 49 10000 ???? ; Original author: Thomas Jentzsch + 50 10000 ???? ; Inserts code which takes the specified number of cycles to execute. This is + 51 10000 ???? ; useful for code where precise timing is required. + 52 10000 ???? ; ILLEGAL-OPCODE VERSION DOES NOT AFFECT FLAGS OR REGISTERS. + 53 10000 ???? ; LEGAL OPCODE VERSION MAY AFFECT FLAGS + 54 10000 ???? ; Uses illegal opcode (DASM 2.20.01 onwards). + 55 10000 ???? + 56 10000 ???? MAC sleep + 57 10000 ???? .CYCLES SET {1} + 58 10000 ???? + 59 10000 ???? IF .CYCLES < 2 + 60 10000 ???? ECHO "MACRO ERROR: 'SLEEP': Duration must be > 1" + 61 10000 ???? ERR + 62 10000 ???? ENDIF + 63 10000 ???? + 64 10000 ???? IF .CYCLES & 1 + 65 10000 ???? IFNCONST NO_ILLEGAL_OPCODES + 66 10000 ???? nop 0 + 67 10000 ???? ELSE + 68 10000 ???? bit VSYNC + 69 10000 ???? ENDIF + 70 10000 ???? .CYCLES SET .CYCLES - 3 + 71 10000 ???? ENDIF + 72 10000 ???? + 73 10000 ???? REPEAT .CYCLES / 2 + 74 10000 ???? nop + 75 10000 ???? REPEND + 76 10000 ???? ENDM ;usage: SLEEP n (n>1) + 77 10000 ???? + 78 10000 ???? ;------------------------------------------------------------------------------- + 79 10000 ???? ; VERTICAL_SYNC + 80 10000 ???? ; revised version by Edwin Blink -- saves bytes! + 81 10000 ???? ; Inserts the code required for a proper 3 scanline vertical sync sequence + 82 10000 ???? ; Note: Alters the accumulator + 83 10000 ???? + 84 10000 ???? ; OUT: A = 0 + 85 10000 ???? + 86 10000 ???? MAC vertical_sync + 87 10000 ???? lda #%1110 ; each '1' bits generate a VSYNC ON line (bits 1..3) + 88 10000 ???? .VSLP1 sta WSYNC ; 1st '0' bit resets Vsync, 2nd '0' bit exit loop + 89 10000 ???? sta VSYNC + 90 10000 ???? lsr + 91 10000 ???? bne .VSLP1 ; branch until VYSNC has been reset + 92 10000 ???? ENDM + 93 10000 ???? + 94 10000 ???? ;------------------------------------------------------------------------------- + 95 10000 ???? ; CLEAN_START + 96 10000 ???? ; Original author: Andrew Davie + 97 10000 ???? ; Standardised start-up code, clears stack, all TIA registers and RAM to 0 + 98 10000 ???? ; Sets stack pointer to $FF, and all registers to 0 + 99 10000 ???? ; Sets decimal mode off, sets interrupt flag (kind of un-necessary) + 100 10000 ???? ; Use as very first section of code on boot (ie: at reset) + 101 10000 ???? ; Code written to minimise total ROM usage - uses weird 6502 knowledge :) + 102 10000 ???? + 103 10000 ???? MAC clean_start + 104 10000 ???? sei + 105 10000 ???? cld + 106 10000 ???? + 107 10000 ???? ldx #0 + 108 10000 ???? txa + 109 10000 ???? tay + 110 10000 ???? .CLEAR_STACK dex + 111 10000 ???? txs + 112 10000 ???? pha + 113 10000 ???? bne .CLEAR_STACK ; SP=$FF, X = A = Y = 0 + 114 10000 ???? + 115 10000 ???? ENDM + 116 10000 ???? + 117 10000 ???? ;------------------------------------------------------- + 118 10000 ???? ; SET_POINTER + 119 10000 ???? ; Original author: Manuel Rotschkar + 120 10000 ???? ; + 121 10000 ???? ; Sets a 2 byte RAM pointer to an absolute address. + 122 10000 ???? ; + 123 10000 ???? ; Usage: SET_POINTER pointer, address + 124 10000 ???? ; Example: SET_POINTER SpritePTR, SpriteData + 125 10000 ???? ; + 126 10000 ???? ; Note: Alters the accumulator, NZ flags + 127 10000 ???? ; IN 1: 2 byte RAM location reserved for pointer + 128 10000 ???? ; IN 2: absolute address + 129 10000 ???? + 130 10000 ???? MAC set_pointer + 131 10000 ???? .POINTER SET {1} + 132 10000 ???? .ADDRESS SET {2} + 133 10000 ???? + 134 10000 ???? LDA #<.ADDRESS ; Get Lowbyte of Address + 135 10000 ???? STA .POINTER ; Store in pointer + 136 10000 ???? LDA #>.ADDRESS ; Get Hibyte of Address + 137 10000 ???? STA .POINTER+1 ; Store in pointer+1 + 138 10000 ???? + 139 10000 ???? ENDM + 140 10000 ???? + 141 10000 ???? ;------------------------------------------------------- + 142 10000 ???? ; BOUNDARY byte# + 143 10000 ???? ; Original author: Denis Debro (borrowed from Bob Smith / Thomas) + 144 10000 ???? ; + 145 10000 ???? ; Push data to a certain position inside a page and keep count of how + 146 10000 ???? ; many free bytes the programmer will have. + 147 10000 ???? ; + 148 10000 ???? ; eg: BOUNDARY 5 ; position at byte #5 in page + 149 10000 ???? + 150 10000 ???? __DASM__TOTAL_FREE_MEMORY SET 0 + 151 10000 ???? .FREE_BYTES SET 0 + 152 10000 ???? MAC boundary + 153 10000 ???? REPEAT 256 + 154 10000 ???? IF <. % {1} = 0 + 155 10000 ???? MEXIT + 156 10000 ???? ELSE + 157 10000 ???? .FREE_BYTES SET .FREE_BYTES + 1 + 158 10000 ???? .byte $00 + 159 10000 ???? ENDIF + 160 10000 ???? REPEND + 161 10000 ???? __DASM__TOTAL_FREE_MEMORY SET __DASM__TOTAL_FREE_MEMORY + .FREE_BYTES + 162 10000 ???? ENDM + 163 10000 ???? + 164 10000 ???? + 165 10000 ???? ; EOF +------- FILE F8SC.asm + 7 10000 ???? + 8 10000 ???? 10 80 PF_Color_Read equ PF_Color_Write+128 + 9 U0080 ???? seg.u vars + 10 U0080 org $80 + 11 U0080 + 12 U0080 + 13 U0080 + 14 U1001 ???? seg.u SC_RAM_vars + 15 U1000 org $1000 + 16 U1000 00 PF_Color_Write ds 1 + 17 U1001 + 18 f000 ???? seg Bank_0 + 19 f000 ???? + 20 e000 org $E000 + 21 e000 rorg $F000 + 22 e000 + 23 e000 repeat 256 + 24 e000 00 .byte.b $00 + 23 e000 repend + 24 e001 00 .byte.b $00 + 23 e001 repend + 24 e002 00 .byte.b $00 + 23 e002 repend + 24 e003 00 .byte.b $00 + 23 e003 repend + 24 e004 00 .byte.b $00 + 23 e004 repend + 24 e005 00 .byte.b $00 + 23 e005 repend + 24 e006 00 .byte.b $00 + 23 e006 repend + 24 e007 00 .byte.b $00 + 23 e007 repend + 24 e008 00 .byte.b $00 + 23 e008 repend + 24 e009 00 .byte.b $00 + 23 e009 repend + 24 e00a 00 .byte.b $00 + 23 e00a repend + 24 e00b 00 .byte.b $00 + 23 e00b repend + 24 e00c 00 .byte.b $00 + 23 e00c repend + 24 e00d 00 .byte.b $00 + 23 e00d repend + 24 e00e 00 .byte.b $00 + 23 e00e repend + 24 e00f 00 .byte.b $00 + 23 e00f repend + 24 e010 00 .byte.b $00 + 23 e010 repend + 24 e011 00 .byte.b $00 + 23 e011 repend + 24 e012 00 .byte.b $00 + 23 e012 repend + 24 e013 00 .byte.b $00 + 23 e013 repend + 24 e014 00 .byte.b $00 + 23 e014 repend + 24 e015 00 .byte.b $00 + 23 e015 repend + 24 e016 00 .byte.b $00 + 23 e016 repend + 24 e017 00 .byte.b $00 + 23 e017 repend + 24 e018 00 .byte.b $00 + 23 e018 repend + 24 e019 00 .byte.b $00 + 23 e019 repend + 24 e01a 00 .byte.b $00 + 23 e01a repend + 24 e01b 00 .byte.b $00 + 23 e01b repend + 24 e01c 00 .byte.b $00 + 23 e01c repend + 24 e01d 00 .byte.b $00 + 23 e01d repend + 24 e01e 00 .byte.b $00 + 23 e01e repend + 24 e01f 00 .byte.b $00 + 23 e01f repend + 24 e020 00 .byte.b $00 + 23 e020 repend + 24 e021 00 .byte.b $00 + 23 e021 repend + 24 e022 00 .byte.b $00 + 23 e022 repend + 24 e023 00 .byte.b $00 + 23 e023 repend + 24 e024 00 .byte.b $00 + 23 e024 repend + 24 e025 00 .byte.b $00 + 23 e025 repend + 24 e026 00 .byte.b $00 + 23 e026 repend + 24 e027 00 .byte.b $00 + 23 e027 repend + 24 e028 00 .byte.b $00 + 23 e028 repend + 24 e029 00 .byte.b $00 + 23 e029 repend + 24 e02a 00 .byte.b $00 + 23 e02a repend + 24 e02b 00 .byte.b $00 + 23 e02b repend + 24 e02c 00 .byte.b $00 + 23 e02c repend + 24 e02d 00 .byte.b $00 + 23 e02d repend + 24 e02e 00 .byte.b $00 + 23 e02e repend + 24 e02f 00 .byte.b $00 + 23 e02f repend + 24 e030 00 .byte.b $00 + 23 e030 repend + 24 e031 00 .byte.b $00 + 23 e031 repend + 24 e032 00 .byte.b $00 + 23 e032 repend + 24 e033 00 .byte.b $00 + 23 e033 repend + 24 e034 00 .byte.b $00 + 23 e034 repend + 24 e035 00 .byte.b $00 + 23 e035 repend + 24 e036 00 .byte.b $00 + 23 e036 repend + 24 e037 00 .byte.b $00 + 23 e037 repend + 24 e038 00 .byte.b $00 + 23 e038 repend + 24 e039 00 .byte.b $00 + 23 e039 repend + 24 e03a 00 .byte.b $00 + 23 e03a repend + 24 e03b 00 .byte.b $00 + 23 e03b repend + 24 e03c 00 .byte.b $00 + 23 e03c repend + 24 e03d 00 .byte.b $00 + 23 e03d repend + 24 e03e 00 .byte.b $00 + 23 e03e repend + 24 e03f 00 .byte.b $00 + 23 e03f repend + 24 e040 00 .byte.b $00 + 23 e040 repend + 24 e041 00 .byte.b $00 + 23 e041 repend + 24 e042 00 .byte.b $00 + 23 e042 repend + 24 e043 00 .byte.b $00 + 23 e043 repend + 24 e044 00 .byte.b $00 + 23 e044 repend + 24 e045 00 .byte.b $00 + 23 e045 repend + 24 e046 00 .byte.b $00 + 23 e046 repend + 24 e047 00 .byte.b $00 + 23 e047 repend + 24 e048 00 .byte.b $00 + 23 e048 repend + 24 e049 00 .byte.b $00 + 23 e049 repend + 24 e04a 00 .byte.b $00 + 23 e04a repend + 24 e04b 00 .byte.b $00 + 23 e04b repend + 24 e04c 00 .byte.b $00 + 23 e04c repend + 24 e04d 00 .byte.b $00 + 23 e04d repend + 24 e04e 00 .byte.b $00 + 23 e04e repend + 24 e04f 00 .byte.b $00 + 23 e04f repend + 24 e050 00 .byte.b $00 + 23 e050 repend + 24 e051 00 .byte.b $00 + 23 e051 repend + 24 e052 00 .byte.b $00 + 23 e052 repend + 24 e053 00 .byte.b $00 + 23 e053 repend + 24 e054 00 .byte.b $00 + 23 e054 repend + 24 e055 00 .byte.b $00 + 23 e055 repend + 24 e056 00 .byte.b $00 + 23 e056 repend + 24 e057 00 .byte.b $00 + 23 e057 repend + 24 e058 00 .byte.b $00 + 23 e058 repend + 24 e059 00 .byte.b $00 + 23 e059 repend + 24 e05a 00 .byte.b $00 + 23 e05a repend + 24 e05b 00 .byte.b $00 + 23 e05b repend + 24 e05c 00 .byte.b $00 + 23 e05c repend + 24 e05d 00 .byte.b $00 + 23 e05d repend + 24 e05e 00 .byte.b $00 + 23 e05e repend + 24 e05f 00 .byte.b $00 + 23 e05f repend + 24 e060 00 .byte.b $00 + 23 e060 repend + 24 e061 00 .byte.b $00 + 23 e061 repend + 24 e062 00 .byte.b $00 + 23 e062 repend + 24 e063 00 .byte.b $00 + 23 e063 repend + 24 e064 00 .byte.b $00 + 23 e064 repend + 24 e065 00 .byte.b $00 + 23 e065 repend + 24 e066 00 .byte.b $00 + 23 e066 repend + 24 e067 00 .byte.b $00 + 23 e067 repend + 24 e068 00 .byte.b $00 + 23 e068 repend + 24 e069 00 .byte.b $00 + 23 e069 repend + 24 e06a 00 .byte.b $00 + 23 e06a repend + 24 e06b 00 .byte.b $00 + 23 e06b repend + 24 e06c 00 .byte.b $00 + 23 e06c repend + 24 e06d 00 .byte.b $00 + 23 e06d repend + 24 e06e 00 .byte.b $00 + 23 e06e repend + 24 e06f 00 .byte.b $00 + 23 e06f repend + 24 e070 00 .byte.b $00 + 23 e070 repend + 24 e071 00 .byte.b $00 + 23 e071 repend + 24 e072 00 .byte.b $00 + 23 e072 repend + 24 e073 00 .byte.b $00 + 23 e073 repend + 24 e074 00 .byte.b $00 + 23 e074 repend + 24 e075 00 .byte.b $00 + 23 e075 repend + 24 e076 00 .byte.b $00 + 23 e076 repend + 24 e077 00 .byte.b $00 + 23 e077 repend + 24 e078 00 .byte.b $00 + 23 e078 repend + 24 e079 00 .byte.b $00 + 23 e079 repend + 24 e07a 00 .byte.b $00 + 23 e07a repend + 24 e07b 00 .byte.b $00 + 23 e07b repend + 24 e07c 00 .byte.b $00 + 23 e07c repend + 24 e07d 00 .byte.b $00 + 23 e07d repend + 24 e07e 00 .byte.b $00 + 23 e07e repend + 24 e07f 00 .byte.b $00 + 23 e07f repend + 24 e080 00 .byte.b $00 + 23 e080 repend + 24 e081 00 .byte.b $00 + 23 e081 repend + 24 e082 00 .byte.b $00 + 23 e082 repend + 24 e083 00 .byte.b $00 + 23 e083 repend + 24 e084 00 .byte.b $00 + 23 e084 repend + 24 e085 00 .byte.b $00 + 23 e085 repend + 24 e086 00 .byte.b $00 + 23 e086 repend + 24 e087 00 .byte.b $00 + 23 e087 repend + 24 e088 00 .byte.b $00 + 23 e088 repend + 24 e089 00 .byte.b $00 + 23 e089 repend + 24 e08a 00 .byte.b $00 + 23 e08a repend + 24 e08b 00 .byte.b $00 + 23 e08b repend + 24 e08c 00 .byte.b $00 + 23 e08c repend + 24 e08d 00 .byte.b $00 + 23 e08d repend + 24 e08e 00 .byte.b $00 + 23 e08e repend + 24 e08f 00 .byte.b $00 + 23 e08f repend + 24 e090 00 .byte.b $00 + 23 e090 repend + 24 e091 00 .byte.b $00 + 23 e091 repend + 24 e092 00 .byte.b $00 + 23 e092 repend + 24 e093 00 .byte.b $00 + 23 e093 repend + 24 e094 00 .byte.b $00 + 23 e094 repend + 24 e095 00 .byte.b $00 + 23 e095 repend + 24 e096 00 .byte.b $00 + 23 e096 repend + 24 e097 00 .byte.b $00 + 23 e097 repend + 24 e098 00 .byte.b $00 + 23 e098 repend + 24 e099 00 .byte.b $00 + 23 e099 repend + 24 e09a 00 .byte.b $00 + 23 e09a repend + 24 e09b 00 .byte.b $00 + 23 e09b repend + 24 e09c 00 .byte.b $00 + 23 e09c repend + 24 e09d 00 .byte.b $00 + 23 e09d repend + 24 e09e 00 .byte.b $00 + 23 e09e repend + 24 e09f 00 .byte.b $00 + 23 e09f repend + 24 e0a0 00 .byte.b $00 + 23 e0a0 repend + 24 e0a1 00 .byte.b $00 + 23 e0a1 repend + 24 e0a2 00 .byte.b $00 + 23 e0a2 repend + 24 e0a3 00 .byte.b $00 + 23 e0a3 repend + 24 e0a4 00 .byte.b $00 + 23 e0a4 repend + 24 e0a5 00 .byte.b $00 + 23 e0a5 repend + 24 e0a6 00 .byte.b $00 + 23 e0a6 repend + 24 e0a7 00 .byte.b $00 + 23 e0a7 repend + 24 e0a8 00 .byte.b $00 + 23 e0a8 repend + 24 e0a9 00 .byte.b $00 + 23 e0a9 repend + 24 e0aa 00 .byte.b $00 + 23 e0aa repend + 24 e0ab 00 .byte.b $00 + 23 e0ab repend + 24 e0ac 00 .byte.b $00 + 23 e0ac repend + 24 e0ad 00 .byte.b $00 + 23 e0ad repend + 24 e0ae 00 .byte.b $00 + 23 e0ae repend + 24 e0af 00 .byte.b $00 + 23 e0af repend + 24 e0b0 00 .byte.b $00 + 23 e0b0 repend + 24 e0b1 00 .byte.b $00 + 23 e0b1 repend + 24 e0b2 00 .byte.b $00 + 23 e0b2 repend + 24 e0b3 00 .byte.b $00 + 23 e0b3 repend + 24 e0b4 00 .byte.b $00 + 23 e0b4 repend + 24 e0b5 00 .byte.b $00 + 23 e0b5 repend + 24 e0b6 00 .byte.b $00 + 23 e0b6 repend + 24 e0b7 00 .byte.b $00 + 23 e0b7 repend + 24 e0b8 00 .byte.b $00 + 23 e0b8 repend + 24 e0b9 00 .byte.b $00 + 23 e0b9 repend + 24 e0ba 00 .byte.b $00 + 23 e0ba repend + 24 e0bb 00 .byte.b $00 + 23 e0bb repend + 24 e0bc 00 .byte.b $00 + 23 e0bc repend + 24 e0bd 00 .byte.b $00 + 23 e0bd repend + 24 e0be 00 .byte.b $00 + 23 e0be repend + 24 e0bf 00 .byte.b $00 + 23 e0bf repend + 24 e0c0 00 .byte.b $00 + 23 e0c0 repend + 24 e0c1 00 .byte.b $00 + 23 e0c1 repend + 24 e0c2 00 .byte.b $00 + 23 e0c2 repend + 24 e0c3 00 .byte.b $00 + 23 e0c3 repend + 24 e0c4 00 .byte.b $00 + 23 e0c4 repend + 24 e0c5 00 .byte.b $00 + 23 e0c5 repend + 24 e0c6 00 .byte.b $00 + 23 e0c6 repend + 24 e0c7 00 .byte.b $00 + 23 e0c7 repend + 24 e0c8 00 .byte.b $00 + 23 e0c8 repend + 24 e0c9 00 .byte.b $00 + 23 e0c9 repend + 24 e0ca 00 .byte.b $00 + 23 e0ca repend + 24 e0cb 00 .byte.b $00 + 23 e0cb repend + 24 e0cc 00 .byte.b $00 + 23 e0cc repend + 24 e0cd 00 .byte.b $00 + 23 e0cd repend + 24 e0ce 00 .byte.b $00 + 23 e0ce repend + 24 e0cf 00 .byte.b $00 + 23 e0cf repend + 24 e0d0 00 .byte.b $00 + 23 e0d0 repend + 24 e0d1 00 .byte.b $00 + 23 e0d1 repend + 24 e0d2 00 .byte.b $00 + 23 e0d2 repend + 24 e0d3 00 .byte.b $00 + 23 e0d3 repend + 24 e0d4 00 .byte.b $00 + 23 e0d4 repend + 24 e0d5 00 .byte.b $00 + 23 e0d5 repend + 24 e0d6 00 .byte.b $00 + 23 e0d6 repend + 24 e0d7 00 .byte.b $00 + 23 e0d7 repend + 24 e0d8 00 .byte.b $00 + 23 e0d8 repend + 24 e0d9 00 .byte.b $00 + 23 e0d9 repend + 24 e0da 00 .byte.b $00 + 23 e0da repend + 24 e0db 00 .byte.b $00 + 23 e0db repend + 24 e0dc 00 .byte.b $00 + 23 e0dc repend + 24 e0dd 00 .byte.b $00 + 23 e0dd repend + 24 e0de 00 .byte.b $00 + 23 e0de repend + 24 e0df 00 .byte.b $00 + 23 e0df repend + 24 e0e0 00 .byte.b $00 + 23 e0e0 repend + 24 e0e1 00 .byte.b $00 + 23 e0e1 repend + 24 e0e2 00 .byte.b $00 + 23 e0e2 repend + 24 e0e3 00 .byte.b $00 + 23 e0e3 repend + 24 e0e4 00 .byte.b $00 + 23 e0e4 repend + 24 e0e5 00 .byte.b $00 + 23 e0e5 repend + 24 e0e6 00 .byte.b $00 + 23 e0e6 repend + 24 e0e7 00 .byte.b $00 + 23 e0e7 repend + 24 e0e8 00 .byte.b $00 + 23 e0e8 repend + 24 e0e9 00 .byte.b $00 + 23 e0e9 repend + 24 e0ea 00 .byte.b $00 + 23 e0ea repend + 24 e0eb 00 .byte.b $00 + 23 e0eb repend + 24 e0ec 00 .byte.b $00 + 23 e0ec repend + 24 e0ed 00 .byte.b $00 + 23 e0ed repend + 24 e0ee 00 .byte.b $00 + 23 e0ee repend + 24 e0ef 00 .byte.b $00 + 23 e0ef repend + 24 e0f0 00 .byte.b $00 + 23 e0f0 repend + 24 e0f1 00 .byte.b $00 + 23 e0f1 repend + 24 e0f2 00 .byte.b $00 + 23 e0f2 repend + 24 e0f3 00 .byte.b $00 + 23 e0f3 repend + 24 e0f4 00 .byte.b $00 + 23 e0f4 repend + 24 e0f5 00 .byte.b $00 + 23 e0f5 repend + 24 e0f6 00 .byte.b $00 + 23 e0f6 repend + 24 e0f7 00 .byte.b $00 + 23 e0f7 repend + 24 e0f8 00 .byte.b $00 + 23 e0f8 repend + 24 e0f9 00 .byte.b $00 + 23 e0f9 repend + 24 e0fa 00 .byte.b $00 + 23 e0fa repend + 24 e0fb 00 .byte.b $00 + 23 e0fb repend + 24 e0fc 00 .byte.b $00 + 23 e0fc repend + 24 e0fd 00 .byte.b $00 + 23 e0fd repend + 24 e0fe 00 .byte.b $00 + 23 e0fe repend + 24 e0ff 00 .byte.b $00 + 25 e100 repend + 26 e100 + 27 e100 Start_0 + 28 e100 ea nop + 29 e101 ea nop + 30 e102 ea nop + 31 e103 + 0 e103 CLEAN_START + 1 e103 78 sei + 2 e104 d8 cld + 3 e105 + 4 e105 a2 00 ldx #0 + 5 e107 8a txa + 6 e108 a8 tay + 7 e109 ca .CLEAR_STACK dex + 8 e10a 9a txs + 9 e10b 48 pha + 10 e10c d0 fb bne .CLEAR_STACK + 11 e10e + 33 e10e ; jsr Call_1 + 34 e10e a9 ff lda #$FF + 35 e110 85 0e sta PF1 + 36 e112 StartFrame + 37 e112 a9 02 lda #2 + 38 e114 85 01 sta VBLANK + 39 e116 85 00 sta VSYNC + 40 e118 + 41 e118 85 02 sta WSYNC + 42 e11a 85 02 sta WSYNC + 43 e11c 85 02 sta WSYNC + 44 e11e + 45 e11e a9 00 lda #0 + 46 e120 85 00 sta VSYNC + 47 e122 + 48 e122 a0 25 ldy #37 + 49 e124 Vert + 50 e124 85 02 sta WSYNC + 51 e126 88 dey + 52 e127 d0 fb bne Vert + 53 e129 + 54 e129 a9 00 lda #0 + 55 e12b 85 01 sta VBLANK + 56 e12d + 57 e12d a0 c0 ldy #192 + 58 e12f Pic + 59 e12f 85 02 sta WSYNC + 60 e131 88 dey + 61 e132 d0 fb bne Pic + 62 e134 + 63 e134 a9 02 lda #2 + 64 e136 85 01 sta VBLANK + 65 e138 + 66 e138 a0 1e ldy #30 + 67 e13a Over + 68 e13a 85 02 sta WSYNC + 69 e13c 88 dey + 70 e13d d0 fb bne Over + 71 e13f + 72 e13f 20 e0 ff jsr Call_1 + 73 e142 + 74 e142 ad 80 10 lda PF_Color_Read + 75 e145 85 08 sta COLUPF + 76 e147 + 77 e147 + 78 e147 4c 12 f1 jmp StartFrame + 79 e14a + 80 e14a + 81 e14a + 82 e14a + 83 efe0 org $EFE0 + 84 efe0 rorg $FFE0 + 85 efe0 Call_1 + 86 efe0 8e f9 ff stx $FFF9 + 87 efe3 + 88 efe3 ea nop + 89 efe4 ea nop + 90 efe5 ea nop + 91 efe6 ea nop + 92 efe7 ea nop + 93 efe8 ea nop + 94 efe9 + 95 efe9 60 rts + 96 efea + 97 eff8 org $EFF8 + 98 eff8 rorg $FFF8 + 99 eff8 ff ff .word.w $FFFF + 100 effa 00 f1 .word.w Start_0 + 101 effc 00 f1 .word.w Start_0 + 102 effe 00 f1 .word.w Start_0 + 103 f000 + 104 10000 ???? seg Bank_1 + 105 10000 ???? + 106 f000 org $F000 + 107 f000 rorg $F000 + 108 f000 + 109 f000 repeat 256 + 110 f000 00 .byte.b $00 + 109 f000 repend + 110 f001 00 .byte.b $00 + 109 f001 repend + 110 f002 00 .byte.b $00 + 109 f002 repend + 110 f003 00 .byte.b $00 + 109 f003 repend + 110 f004 00 .byte.b $00 + 109 f004 repend + 110 f005 00 .byte.b $00 + 109 f005 repend + 110 f006 00 .byte.b $00 + 109 f006 repend + 110 f007 00 .byte.b $00 + 109 f007 repend + 110 f008 00 .byte.b $00 + 109 f008 repend + 110 f009 00 .byte.b $00 + 109 f009 repend + 110 f00a 00 .byte.b $00 + 109 f00a repend + 110 f00b 00 .byte.b $00 + 109 f00b repend + 110 f00c 00 .byte.b $00 + 109 f00c repend + 110 f00d 00 .byte.b $00 + 109 f00d repend + 110 f00e 00 .byte.b $00 + 109 f00e repend + 110 f00f 00 .byte.b $00 + 109 f00f repend + 110 f010 00 .byte.b $00 + 109 f010 repend + 110 f011 00 .byte.b $00 + 109 f011 repend + 110 f012 00 .byte.b $00 + 109 f012 repend + 110 f013 00 .byte.b $00 + 109 f013 repend + 110 f014 00 .byte.b $00 + 109 f014 repend + 110 f015 00 .byte.b $00 + 109 f015 repend + 110 f016 00 .byte.b $00 + 109 f016 repend + 110 f017 00 .byte.b $00 + 109 f017 repend + 110 f018 00 .byte.b $00 + 109 f018 repend + 110 f019 00 .byte.b $00 + 109 f019 repend + 110 f01a 00 .byte.b $00 + 109 f01a repend + 110 f01b 00 .byte.b $00 + 109 f01b repend + 110 f01c 00 .byte.b $00 + 109 f01c repend + 110 f01d 00 .byte.b $00 + 109 f01d repend + 110 f01e 00 .byte.b $00 + 109 f01e repend + 110 f01f 00 .byte.b $00 + 109 f01f repend + 110 f020 00 .byte.b $00 + 109 f020 repend + 110 f021 00 .byte.b $00 + 109 f021 repend + 110 f022 00 .byte.b $00 + 109 f022 repend + 110 f023 00 .byte.b $00 + 109 f023 repend + 110 f024 00 .byte.b $00 + 109 f024 repend + 110 f025 00 .byte.b $00 + 109 f025 repend + 110 f026 00 .byte.b $00 + 109 f026 repend + 110 f027 00 .byte.b $00 + 109 f027 repend + 110 f028 00 .byte.b $00 + 109 f028 repend + 110 f029 00 .byte.b $00 + 109 f029 repend + 110 f02a 00 .byte.b $00 + 109 f02a repend + 110 f02b 00 .byte.b $00 + 109 f02b repend + 110 f02c 00 .byte.b $00 + 109 f02c repend + 110 f02d 00 .byte.b $00 + 109 f02d repend + 110 f02e 00 .byte.b $00 + 109 f02e repend + 110 f02f 00 .byte.b $00 + 109 f02f repend + 110 f030 00 .byte.b $00 + 109 f030 repend + 110 f031 00 .byte.b $00 + 109 f031 repend + 110 f032 00 .byte.b $00 + 109 f032 repend + 110 f033 00 .byte.b $00 + 109 f033 repend + 110 f034 00 .byte.b $00 + 109 f034 repend + 110 f035 00 .byte.b $00 + 109 f035 repend + 110 f036 00 .byte.b $00 + 109 f036 repend + 110 f037 00 .byte.b $00 + 109 f037 repend + 110 f038 00 .byte.b $00 + 109 f038 repend + 110 f039 00 .byte.b $00 + 109 f039 repend + 110 f03a 00 .byte.b $00 + 109 f03a repend + 110 f03b 00 .byte.b $00 + 109 f03b repend + 110 f03c 00 .byte.b $00 + 109 f03c repend + 110 f03d 00 .byte.b $00 + 109 f03d repend + 110 f03e 00 .byte.b $00 + 109 f03e repend + 110 f03f 00 .byte.b $00 + 109 f03f repend + 110 f040 00 .byte.b $00 + 109 f040 repend + 110 f041 00 .byte.b $00 + 109 f041 repend + 110 f042 00 .byte.b $00 + 109 f042 repend + 110 f043 00 .byte.b $00 + 109 f043 repend + 110 f044 00 .byte.b $00 + 109 f044 repend + 110 f045 00 .byte.b $00 + 109 f045 repend + 110 f046 00 .byte.b $00 + 109 f046 repend + 110 f047 00 .byte.b $00 + 109 f047 repend + 110 f048 00 .byte.b $00 + 109 f048 repend + 110 f049 00 .byte.b $00 + 109 f049 repend + 110 f04a 00 .byte.b $00 + 109 f04a repend + 110 f04b 00 .byte.b $00 + 109 f04b repend + 110 f04c 00 .byte.b $00 + 109 f04c repend + 110 f04d 00 .byte.b $00 + 109 f04d repend + 110 f04e 00 .byte.b $00 + 109 f04e repend + 110 f04f 00 .byte.b $00 + 109 f04f repend + 110 f050 00 .byte.b $00 + 109 f050 repend + 110 f051 00 .byte.b $00 + 109 f051 repend + 110 f052 00 .byte.b $00 + 109 f052 repend + 110 f053 00 .byte.b $00 + 109 f053 repend + 110 f054 00 .byte.b $00 + 109 f054 repend + 110 f055 00 .byte.b $00 + 109 f055 repend + 110 f056 00 .byte.b $00 + 109 f056 repend + 110 f057 00 .byte.b $00 + 109 f057 repend + 110 f058 00 .byte.b $00 + 109 f058 repend + 110 f059 00 .byte.b $00 + 109 f059 repend + 110 f05a 00 .byte.b $00 + 109 f05a repend + 110 f05b 00 .byte.b $00 + 109 f05b repend + 110 f05c 00 .byte.b $00 + 109 f05c repend + 110 f05d 00 .byte.b $00 + 109 f05d repend + 110 f05e 00 .byte.b $00 + 109 f05e repend + 110 f05f 00 .byte.b $00 + 109 f05f repend + 110 f060 00 .byte.b $00 + 109 f060 repend + 110 f061 00 .byte.b $00 + 109 f061 repend + 110 f062 00 .byte.b $00 + 109 f062 repend + 110 f063 00 .byte.b $00 + 109 f063 repend + 110 f064 00 .byte.b $00 + 109 f064 repend + 110 f065 00 .byte.b $00 + 109 f065 repend + 110 f066 00 .byte.b $00 + 109 f066 repend + 110 f067 00 .byte.b $00 + 109 f067 repend + 110 f068 00 .byte.b $00 + 109 f068 repend + 110 f069 00 .byte.b $00 + 109 f069 repend + 110 f06a 00 .byte.b $00 + 109 f06a repend + 110 f06b 00 .byte.b $00 + 109 f06b repend + 110 f06c 00 .byte.b $00 + 109 f06c repend + 110 f06d 00 .byte.b $00 + 109 f06d repend + 110 f06e 00 .byte.b $00 + 109 f06e repend + 110 f06f 00 .byte.b $00 + 109 f06f repend + 110 f070 00 .byte.b $00 + 109 f070 repend + 110 f071 00 .byte.b $00 + 109 f071 repend + 110 f072 00 .byte.b $00 + 109 f072 repend + 110 f073 00 .byte.b $00 + 109 f073 repend + 110 f074 00 .byte.b $00 + 109 f074 repend + 110 f075 00 .byte.b $00 + 109 f075 repend + 110 f076 00 .byte.b $00 + 109 f076 repend + 110 f077 00 .byte.b $00 + 109 f077 repend + 110 f078 00 .byte.b $00 + 109 f078 repend + 110 f079 00 .byte.b $00 + 109 f079 repend + 110 f07a 00 .byte.b $00 + 109 f07a repend + 110 f07b 00 .byte.b $00 + 109 f07b repend + 110 f07c 00 .byte.b $00 + 109 f07c repend + 110 f07d 00 .byte.b $00 + 109 f07d repend + 110 f07e 00 .byte.b $00 + 109 f07e repend + 110 f07f 00 .byte.b $00 + 109 f07f repend + 110 f080 00 .byte.b $00 + 109 f080 repend + 110 f081 00 .byte.b $00 + 109 f081 repend + 110 f082 00 .byte.b $00 + 109 f082 repend + 110 f083 00 .byte.b $00 + 109 f083 repend + 110 f084 00 .byte.b $00 + 109 f084 repend + 110 f085 00 .byte.b $00 + 109 f085 repend + 110 f086 00 .byte.b $00 + 109 f086 repend + 110 f087 00 .byte.b $00 + 109 f087 repend + 110 f088 00 .byte.b $00 + 109 f088 repend + 110 f089 00 .byte.b $00 + 109 f089 repend + 110 f08a 00 .byte.b $00 + 109 f08a repend + 110 f08b 00 .byte.b $00 + 109 f08b repend + 110 f08c 00 .byte.b $00 + 109 f08c repend + 110 f08d 00 .byte.b $00 + 109 f08d repend + 110 f08e 00 .byte.b $00 + 109 f08e repend + 110 f08f 00 .byte.b $00 + 109 f08f repend + 110 f090 00 .byte.b $00 + 109 f090 repend + 110 f091 00 .byte.b $00 + 109 f091 repend + 110 f092 00 .byte.b $00 + 109 f092 repend + 110 f093 00 .byte.b $00 + 109 f093 repend + 110 f094 00 .byte.b $00 + 109 f094 repend + 110 f095 00 .byte.b $00 + 109 f095 repend + 110 f096 00 .byte.b $00 + 109 f096 repend + 110 f097 00 .byte.b $00 + 109 f097 repend + 110 f098 00 .byte.b $00 + 109 f098 repend + 110 f099 00 .byte.b $00 + 109 f099 repend + 110 f09a 00 .byte.b $00 + 109 f09a repend + 110 f09b 00 .byte.b $00 + 109 f09b repend + 110 f09c 00 .byte.b $00 + 109 f09c repend + 110 f09d 00 .byte.b $00 + 109 f09d repend + 110 f09e 00 .byte.b $00 + 109 f09e repend + 110 f09f 00 .byte.b $00 + 109 f09f repend + 110 f0a0 00 .byte.b $00 + 109 f0a0 repend + 110 f0a1 00 .byte.b $00 + 109 f0a1 repend + 110 f0a2 00 .byte.b $00 + 109 f0a2 repend + 110 f0a3 00 .byte.b $00 + 109 f0a3 repend + 110 f0a4 00 .byte.b $00 + 109 f0a4 repend + 110 f0a5 00 .byte.b $00 + 109 f0a5 repend + 110 f0a6 00 .byte.b $00 + 109 f0a6 repend + 110 f0a7 00 .byte.b $00 + 109 f0a7 repend + 110 f0a8 00 .byte.b $00 + 109 f0a8 repend + 110 f0a9 00 .byte.b $00 + 109 f0a9 repend + 110 f0aa 00 .byte.b $00 + 109 f0aa repend + 110 f0ab 00 .byte.b $00 + 109 f0ab repend + 110 f0ac 00 .byte.b $00 + 109 f0ac repend + 110 f0ad 00 .byte.b $00 + 109 f0ad repend + 110 f0ae 00 .byte.b $00 + 109 f0ae repend + 110 f0af 00 .byte.b $00 + 109 f0af repend + 110 f0b0 00 .byte.b $00 + 109 f0b0 repend + 110 f0b1 00 .byte.b $00 + 109 f0b1 repend + 110 f0b2 00 .byte.b $00 + 109 f0b2 repend + 110 f0b3 00 .byte.b $00 + 109 f0b3 repend + 110 f0b4 00 .byte.b $00 + 109 f0b4 repend + 110 f0b5 00 .byte.b $00 + 109 f0b5 repend + 110 f0b6 00 .byte.b $00 + 109 f0b6 repend + 110 f0b7 00 .byte.b $00 + 109 f0b7 repend + 110 f0b8 00 .byte.b $00 + 109 f0b8 repend + 110 f0b9 00 .byte.b $00 + 109 f0b9 repend + 110 f0ba 00 .byte.b $00 + 109 f0ba repend + 110 f0bb 00 .byte.b $00 + 109 f0bb repend + 110 f0bc 00 .byte.b $00 + 109 f0bc repend + 110 f0bd 00 .byte.b $00 + 109 f0bd repend + 110 f0be 00 .byte.b $00 + 109 f0be repend + 110 f0bf 00 .byte.b $00 + 109 f0bf repend + 110 f0c0 00 .byte.b $00 + 109 f0c0 repend + 110 f0c1 00 .byte.b $00 + 109 f0c1 repend + 110 f0c2 00 .byte.b $00 + 109 f0c2 repend + 110 f0c3 00 .byte.b $00 + 109 f0c3 repend + 110 f0c4 00 .byte.b $00 + 109 f0c4 repend + 110 f0c5 00 .byte.b $00 + 109 f0c5 repend + 110 f0c6 00 .byte.b $00 + 109 f0c6 repend + 110 f0c7 00 .byte.b $00 + 109 f0c7 repend + 110 f0c8 00 .byte.b $00 + 109 f0c8 repend + 110 f0c9 00 .byte.b $00 + 109 f0c9 repend + 110 f0ca 00 .byte.b $00 + 109 f0ca repend + 110 f0cb 00 .byte.b $00 + 109 f0cb repend + 110 f0cc 00 .byte.b $00 + 109 f0cc repend + 110 f0cd 00 .byte.b $00 + 109 f0cd repend + 110 f0ce 00 .byte.b $00 + 109 f0ce repend + 110 f0cf 00 .byte.b $00 + 109 f0cf repend + 110 f0d0 00 .byte.b $00 + 109 f0d0 repend + 110 f0d1 00 .byte.b $00 + 109 f0d1 repend + 110 f0d2 00 .byte.b $00 + 109 f0d2 repend + 110 f0d3 00 .byte.b $00 + 109 f0d3 repend + 110 f0d4 00 .byte.b $00 + 109 f0d4 repend + 110 f0d5 00 .byte.b $00 + 109 f0d5 repend + 110 f0d6 00 .byte.b $00 + 109 f0d6 repend + 110 f0d7 00 .byte.b $00 + 109 f0d7 repend + 110 f0d8 00 .byte.b $00 + 109 f0d8 repend + 110 f0d9 00 .byte.b $00 + 109 f0d9 repend + 110 f0da 00 .byte.b $00 + 109 f0da repend + 110 f0db 00 .byte.b $00 + 109 f0db repend + 110 f0dc 00 .byte.b $00 + 109 f0dc repend + 110 f0dd 00 .byte.b $00 + 109 f0dd repend + 110 f0de 00 .byte.b $00 + 109 f0de repend + 110 f0df 00 .byte.b $00 + 109 f0df repend + 110 f0e0 00 .byte.b $00 + 109 f0e0 repend + 110 f0e1 00 .byte.b $00 + 109 f0e1 repend + 110 f0e2 00 .byte.b $00 + 109 f0e2 repend + 110 f0e3 00 .byte.b $00 + 109 f0e3 repend + 110 f0e4 00 .byte.b $00 + 109 f0e4 repend + 110 f0e5 00 .byte.b $00 + 109 f0e5 repend + 110 f0e6 00 .byte.b $00 + 109 f0e6 repend + 110 f0e7 00 .byte.b $00 + 109 f0e7 repend + 110 f0e8 00 .byte.b $00 + 109 f0e8 repend + 110 f0e9 00 .byte.b $00 + 109 f0e9 repend + 110 f0ea 00 .byte.b $00 + 109 f0ea repend + 110 f0eb 00 .byte.b $00 + 109 f0eb repend + 110 f0ec 00 .byte.b $00 + 109 f0ec repend + 110 f0ed 00 .byte.b $00 + 109 f0ed repend + 110 f0ee 00 .byte.b $00 + 109 f0ee repend + 110 f0ef 00 .byte.b $00 + 109 f0ef repend + 110 f0f0 00 .byte.b $00 + 109 f0f0 repend + 110 f0f1 00 .byte.b $00 + 109 f0f1 repend + 110 f0f2 00 .byte.b $00 + 109 f0f2 repend + 110 f0f3 00 .byte.b $00 + 109 f0f3 repend + 110 f0f4 00 .byte.b $00 + 109 f0f4 repend + 110 f0f5 00 .byte.b $00 + 109 f0f5 repend + 110 f0f6 00 .byte.b $00 + 109 f0f6 repend + 110 f0f7 00 .byte.b $00 + 109 f0f7 repend + 110 f0f8 00 .byte.b $00 + 109 f0f8 repend + 110 f0f9 00 .byte.b $00 + 109 f0f9 repend + 110 f0fa 00 .byte.b $00 + 109 f0fa repend + 110 f0fb 00 .byte.b $00 + 109 f0fb repend + 110 f0fc 00 .byte.b $00 + 109 f0fc repend + 110 f0fd 00 .byte.b $00 + 109 f0fd repend + 110 f0fe 00 .byte.b $00 + 109 f0fe repend + 110 f0ff 00 .byte.b $00 + 111 f100 repend + 112 f100 + 113 f100 Init_1 + 114 f100 8d f8 ff sta $FFF8 + 115 f103 Bank1_Sub + 116 f103 ; lda #$0F + 117 f103 ; sta COLUPF + 118 f103 ; inc PF_Color + 119 f103 18 clc + 120 f104 ad 80 10 lda PF_Color_Read + 121 f107 69 01 adc #1 + 122 f109 8d 00 10 sta PF_Color_Write + 123 f10c 60 rts + 124 f10d + 125 ffe3 org $FFE3 + 126 ffe3 rorg $FFE3 + 127 ffe3 20 03 f1 jsr Bank1_Sub + 128 ffe6 8e f8 ff stx $FFF8 + 129 ffe9 + 130 fff8 org $FFF8 + 131 fff8 ff ff .word.w $FFFF + 132 fffa 00 f1 .word.w Init_1 + 133 fffc 00 f1 .word.w Init_1 + 134 fffe 00 f1 .word.w Init_1 + 135 10000 diff --git a/test/roms/bankswitching/_code/test.sym b/test/roms/bankswitching/_code/test.sym new file mode 100644 index 000000000..262823b9c --- /dev/null +++ b/test/roms/bankswitching/_code/test.sym @@ -0,0 +1,121 @@ +--- Symbol List (sorted by symbol) +0.FREE_BYTES 0000 +1.CLEAR_STACK f109 (R ) +__DASM__TOTAL_FREE_MEMORY 0000 +AUDC0 0015 +AUDC1 0016 +AUDF0 0017 +AUDF1 0018 +AUDV0 0019 +AUDV1 001a +Bank1_Sub f103 (R ) +Call_1 ffe0 (R ) +COLUBK 0009 +COLUP0 0006 +COLUP1 0007 +COLUPF 0008 (R ) +Con_Color 0008 +Con_Select 0002 +Con_Start 0001 +CTRLPF 000a +CXBLPF 0036 +CXCLR 002c +CXM0FB 0034 +CXM0P 0030 +CXM1FB 0035 +CXM1P 0031 +CXP0FB 0032 +CXP1FB 0033 +CXPPMM 0037 +ENABL 001f +ENAM0 001d +ENAM1 001e +GRP0 001b +GRP1 001c +HMBL 0024 +HMCLR 002b +HMM0 0022 +HMM1 0023 +HMOVE 002a +HMP0 0020 +HMP1 0021 +Init_1 f100 (R ) +INPT0 0038 +INPT1 0039 +INPT2 003a +INPT3 003b +INPT4 003c +INPT5 003d +INTIM 0284 +J0_Down 0020 +J0_Left 0040 +J0_Right 0080 +J0_Up 0010 +J1_Down 0002 +J1_Left 0004 +J1_Right 0008 +J1_up 0001 +M_Double 0010 +M_Enable 0002 +M_Oct 0040 +M_Quad 0020 +M_Single 0000 +NUSIZ0 0004 +NUSIZ1 0005 +Over f13a (R ) +P0_Diff 0080 +P1_Diff 0040 +P_Double 0005 +P_Quad 0007 +P_Reflect 0008 +P_Single 0000 +P_ThreeClose 0003 +P_ThreeMedium 0006 +P_TwoClose 0001 +P_TwoFar 0004 +P_TwoMedium 0002 +PF0 000d +PF1 000e (R ) +PF2 000f +PF_Color_Read 1080 (R ) +PF_Color_Write 1000 (R ) +PF_Priority 0004 +PF_Reflect 0001 +PF_Score 0002 +Pic f12f (R ) +REFP0 000b +REFP1 000c +RESBL 0014 +RESM0 0012 +RESM1 0013 +RESMP0 0028 +RESMP1 0029 +RESP0 0010 +RESP1 0011 +RSYNC 0003 +Start_0 f100 (R ) +StartFrame f112 (R ) +SWACNT 0281 +SWBCNT 0283 +SWCHA 0280 +SWCHB 0282 +TIM1024T 0297 +TIM1T 0294 +TIM64T 0296 +TIM8T 0295 +VB_Disable 0000 +VB_DumpPots 0080 +VB_Enable 0002 +VB_LatchDisable 0000 +VB_LatchEnable 0040 +VBLANK 0001 (R ) +VDEL01 0026 +VDELBL 0027 +VDELP0 0025 +VDELP1 0026 +VERSION_MACRO 006a +Vert f124 (R ) +VS_Enable 0002 +VSYNC 0000 (R ) +WSYNC 0002 (R ) +--- End of Symbol List. diff --git a/test/roms/bankswitching/_code/vcs.h b/test/roms/bankswitching/_code/vcs.h new file mode 100644 index 000000000..c26d887bb --- /dev/null +++ b/test/roms/bankswitching/_code/vcs.h @@ -0,0 +1,157 @@ +; +; VCS system equates +; +; Vertical blank registers +; +VSYNC = $00 +VS_Enable = 2 +; +VBLANK = $01 +VB_Enable = 2 +VB_Disable = 0 +VB_LatchEnable = 64 +VB_LatchDisable = 0 +VB_DumpPots = 128 +; I don't know a good name to un-dump the pots, +; at least that makes sense. + +WSYNC = $02 +RSYNC = $03 ;for sadists +; +; Size registers for players and missiles +; +NUSIZ0 = $04 +NUSIZ1 = $05 +P_Single = 0 +P_TwoClose = 1 +P_TwoMedium = 2 +P_ThreeClose = 3 +P_TwoFar = 4 +P_Double = 5 +P_ThreeMedium = 6 +P_Quad = 7 + +M_Single = $00 +M_Double = $10 +M_Quad = $20 +M_Oct = $40 + +; +; Color registers +; +COLUP0 = $06 +COLUP1 = $07 +COLUPF = $08 +COLUBK = $09 + +; +; Playfield Control +; +CTRLPF = $0A +PF_Reflect = $01 +PF_Score = $02 +PF_Priority = $04 +; Use missile equates to set ball width. + +REFP0 = $0B +REFP1 = $0C +P_Reflect = $08 + +PF0 = $0D +PF1 = $0E +PF2 = $0F +RESP0 = $10 +RESP1 = $11 +RESM0 = $12 +RESM1 = $13 +RESBL = $14 +AUDC0 = $15 +AUDC1 = $16 +AUDF0 = $17 +AUDF1 = $18 +AUDV0 = $19 +AUDV1 = $1A ;duh + +; +; Players +; +GRP0 = $1B +GRP1 = $1C + +; +; Single-bit objects +; +ENAM0 = $1D +ENAM1 = $1E +ENABL = $1F +M_Enable = 2 + +HMP0 = $20 +HMP1 = $21 +HMM0 = $22 +HMM1 = $23 +HMBL = $24 + +; Miscellaneous +VDELP0 = $25 +VDEL01 = $26 +VDELP1 = $26 +VDELBL = $27 +RESMP0 = $28 +RESMP1 = $29 +HMOVE = $2A +HMCLR = $2B +CXCLR = $2C +CXM0P = $30 +CXM1P = $31 +CXP0FB = $32 +CXP1FB = $33 +CXM0FB = $34 +CXM1FB = $35 +CXBLPF = $36 +CXPPMM = $37 +INPT0 = $38 +INPT1 = $39 +INPT2 = $3A +INPT3 = $3B +INPT4 = $3C +INPT5 = $3D + +; +; Switch A equates. +; +; There are more elegant ways than using all eight of these. :-) +; +SWCHA = $0280 +J0_Right = $80 +J0_Left = $40 +J0_Down = $20 +J0_Up = $10 +J1_Right = $08 +J1_Left = $04 +J1_Down = $02 +J1_up = $01 +; +; Switch B equates +; +SWCHB = $0282 +P0_Diff = $80 +P1_Diff = $40 +Con_Color = $08 +Con_Select = $02 +Con_Start = $01 + +; +; Timer +; +SWCHA = $0280 +SWACNT = $0281 +SWCHB = $0282 +SWBCNT = $0283 +INTIM = $0284 +TIM1T = $0294 +TIM8T = $0295 +TIM64T = $0296 +TIM1024T = $0297 + + diff --git a/test/roms/bankswitching/_code/x07.asm b/test/roms/bankswitching/_code/x07.asm new file mode 100644 index 000000000..0be8bdb36 --- /dev/null +++ b/test/roms/bankswitching/_code/x07.asm @@ -0,0 +1,754 @@ +;;A Bankswitching demo for the x07 scheme. 16 4K banks (64K total) +;;By: Rick Skrbina 6/11/09 + + + processor 6502 + include "vcs.h" + include "macro.h" + + seg.u vars + org $80 + + + seg bank0 + org $0000 + rorg $F000 + +Bank0 + nop + nop + nop + + CLEAN_START + + +Start_Frame + + lda #2 + sta VBLANK + sta VSYNC + sta WSYNC + sta WSYNC + sta WSYNC + lsr + sta VSYNC + + ldy #37 +VerticalBlank + sta WSYNC + dey + bne VerticalBlank + + sty VBLANK + + lda #$0F + sta COLUBK + + ldy #12 +Picture0 + sta WSYNC + dey + bne Picture0 + + jsr Swch1 + + ldy #12 +Picture1 + sta WSYNC + dey + bne Picture1 + + jsr Swch2 + + ldy #12 +Picture2 + sta WSYNC + dey + bne Picture2 + + jsr Swch3 + + ldy #12 +Picture3 + sta WSYNC + dey + bne Picture3 + + jsr Swch4 + + ldy #12 +Picture4 + sta WSYNC + dey + bne Picture4 + + jsr Swch5 + + ldy #12 +Picture5 + sta WSYNC + dey + bne Picture5 + + jsr Swch6 + + ldy #12 +Picture6 + sta WSYNC + dey + bne Picture6 + + jsr Swch7 + + ldy #12 +Picture7 + sta WSYNC + dey + bne Picture7 + + jsr Swch8 + + ldy #12 +Picture8 + sta WSYNC + dey + bne Picture8 + + jsr Swch9 + + ldy #12 +Picture9 + sta WSYNC + dey + bne Picture9 + + jsr SwchA + + ldy #12 +PictureA + sta WSYNC + dey + bne PictureA + + jsr SwchB + + ldy #12 +PictureB + sta WSYNC + dey + bne PictureB + + jsr SwchC + + ldy #12 +PictureC + sta WSYNC + dey + bne PictureC + + jsr SwchD + + ldy #12 +PictureD + sta WSYNC + dey + bne PictureD + + jsr SwchE + +; ldy #12 +;PictureE +; sta WSYNC +; dey +; bne PictureE + +; ldy #12 +;PictureF +; sta WSYNC +; dey +; bne PictureF + + lda #2 + sta VBLANK + + ldy #30 +OverScan + sta WSYNC + dey + bne OverScan + + jmp Start_Frame + + org $0500 + rorg $F500 + +Swch1 + lda $081D + nop + nop + nop + nop + nop + nop + rts + + ;$F50A + +Swch2 + lda $082D + nop + nop + nop + nop + nop + nop + rts + + ;$F514 + +Swch3 + lda $083D + nop + nop + nop + nop + nop + nop + rts + + ;$F51E + +Swch4 + lda $084D + nop + nop + nop + nop + nop + nop + rts + + ;$F528 + +Swch5 + lda $085D + nop + nop + nop + nop + nop + nop + rts + + ;$F532 + +Swch6 + lda $086D + nop + nop + nop + nop + nop + nop + rts + + ;$F53C + +Swch7 + lda $087D + nop + nop + nop + nop + nop + nop + rts + + ;$F543 + +Swch8 + lda $088D + nop + nop + nop + nop + nop + nop + rts + + ;$F550 + +Swch9 + lda $089D + nop + nop + nop + nop + nop + nop + rts + + ;$F55A + +SwchA + lda $08AD + nop + nop + nop + nop + nop + nop + rts + + ;$F564 + +SwchB + lda $08BD + nop + nop + nop + nop + nop + nop + rts + + ;$F56E + +SwchC + lda $08CD + nop + nop + nop + nop + nop + nop + rts + + ;$F578 + +SwchD + lda $08DD + nop + nop + nop + nop + nop + nop + rts + + ;$F582 + +SwchE + lda $08ED + nop + nop + nop + nop + nop + nop + rts + + + org $0FFC + rorg $FFFC + .word Bank0 + .byte "00" + + seg bank1 + org $1000 + rorg $F000 + +Bank1 + nop $080D +Sub1 + lda #$1F + sta COLUBK +; jmp Sub1 + rts + + org $1500 + rorg $F500 + nop + nop + nop + jsr Sub1 + nop $080D + + org $1FFC + rorg $FFFC + .word Bank1 + .byte "01" + + seg bank2 + org $2000 + rorg $F000 + +Bank2 + nop $080D +Sub2 + lda #$2F + sta COLUBK + rts + + org $250A + rorg $F50A + nop + nop + nop + jsr Sub2 + lda $080D + + org $2FFC + rorg $FFFC + .word Bank2 + .byte "02" + + seg bank3 + org $3000 + rorg $F000 + +Bank3 + nop $080D + +Sub3 + lda #$3F + sta COLUBK + rts + + org $3514 + rorg $F514 + nop + nop + nop + jsr Sub3 + lda $080D + + org $3FFC + rorg $FFFC + .word Bank3 + .byte "03" + + seg bank4 + org $4000 + rorg $F000 + +Bank4 + nop $080D + +Sub4 + lda #$4F + sta COLUBK + rts + + org $451E + rorg $F51E + nop + nop + nop + jsr Sub4 + lda $080D + + org $4FFC + rorg $FFFC + .word Bank4 + .byte "04" + + seg bank5 + org $5000 + rorg $F000 + +Bank5 + nop $080D + +Sub5 + lda #$5F + sta COLUBK + rts + + org $5528 + rorg $F528 + nop + nop + nop + jsr Sub5 + lda $080D + + org $5FFC + rorg $FFFC + .word Bank5 + .byte "05" + + seg bank6 + org $6000 + rorg $F000 + +Bank6 + nop $080D + +Sub6 + lda #$6F + sta COLUBK + rts + + org $6532 + rorg $F532 + nop + nop + nop + jsr Sub6 + lda $080D + + org $6FFC + rorg $FFFC + .word Bank6 + .byte "06" + + seg bank7 + org $7000 + rorg $F000 + +Bank7 + nop $080D + +Sub7 + lda #$7F + sta COLUBK + rts + + org $753C + rorg $F53C + nop + nop + nop + jsr Sub7 + lda $080D + + org $7FFC + rorg $FFFC + .word Bank7 + .byte "07" + + seg bank8 + org $8000 + rorg $F000 + +Bank8 + nop $080D + +Sub8 + lda #$8F + sta COLUBK + rts + + org $8546 + rorg $F546 + nop + nop + nop + jsr Sub8 + lda $080D + + org $8FFC + rorg $FFFC + .word Bank8 + .byte "08" + + seg bank9 + org $9000 + rorg $F000 + +Bank9 + nop $080D + +Sub9 + lda #$9F + sta COLUBK + rts + + org $9550 + rorg $F550 + nop + nop + nop + jsr Sub9 + lda $080D + + org $9FFC + rorg $FFFC + .word Bank9 + .byte "09" + + seg bankA + org $A000 + rorg $F000 + +BankA + nop $080D + +SubA + lda #$AF + sta COLUBK + rts + + org $A55A + rorg $F55A + nop + nop + nop + jsr SubA + lda $080D + + org $AFFC + rorg $FFFC + .word BankA + .byte "0A" + + seg bankB + org $B000 + rorg $F000 + +BankB + nop $080D + +SubB + lda #$BF + sta COLUBK + rts + + org $B564 + rorg $F564 + nop + nop + nop + jsr SubB + lda $080D + + org $BFFC + rorg $FFFC + .word BankB + .byte "0B" + + seg bankC + org $C000 + rorg $F000 + +BankC + nop $080D + +SubC + lda #$CF + sta COLUBK + rts + + org $C56E + rorg $F56E + nop + nop + nop + jsr SubC + lda $080D + + org $CFFC + rorg $FFFC + .word BankC + .byte "0C" + + seg bankD + org $D000 + rorg $F000 + +BankD + nop $080D + +SubD + lda #$DF + sta COLUBK + rts + + org $D578 + rorg $F578 + nop + nop + nop + jsr SubD + lda $080D + + org $DFFC + rorg $FFFC + .word BankD + .byte "0D" + + seg bankE + org $E000 + rorg $F000 + +BankE + nop $080D + +SubE + + lda #$EF + sta COLUBK+$40 ;Switch to bank F + + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + + ldy #12 +PictureF + sta WSYNC + dey + bne PictureF + + rts ;go back to bank 0 + + + org $E582 + rorg $F582 + nop + nop + nop + jsr SubE + lda $080D + + + org $EFFC + rorg $FFFC + .word BankE + .byte "0E" + + seg bankF + org $F000 + rorg $F000 + +BankF + nop $080D + +SubF + nop + nop + nop + nop + + ldy #12 +PictureE + sta WSYNC+$40 ;+$40 so no undesired BS + dey + bne PictureE + + lda #$FF + sta COLUBK ;switch to bank E + + + org $FFFC + rorg $FFFC + .word BankF + .byte "0F" diff --git a/test/roms/bankswitching/_code/x07.bin b/test/roms/bankswitching/_code/x07.bin new file mode 100644 index 000000000..2bccd1618 Binary files /dev/null and b/test/roms/bankswitching/_code/x07.bin differ diff --git a/test/roms/bankswitching/_code/xaa b/test/roms/bankswitching/_code/xaa new file mode 100644 index 000000000..8a1e161c3 Binary files /dev/null and b/test/roms/bankswitching/_code/xaa differ diff --git a/test/roms/bankswitching/_code/xab b/test/roms/bankswitching/_code/xab new file mode 100644 index 000000000..c759b2af0 Binary files /dev/null and b/test/roms/bankswitching/_code/xab differ diff --git a/test/roms/controller/genesis/Asteroids (Genesis).bin b/test/roms/controller/genesis/Asteroids (Genesis).bin new file mode 100644 index 000000000..733b10a7f Binary files /dev/null and b/test/roms/controller/genesis/Asteroids (Genesis).bin differ diff --git a/test/roms/controller/genesis/Defender (Genesis).bin b/test/roms/controller/genesis/Defender (Genesis).bin new file mode 100644 index 000000000..aeede0986 Binary files /dev/null and b/test/roms/controller/genesis/Defender (Genesis).bin differ diff --git a/test/roms/controller/genesis/Defender 2 (Genesis).bin b/test/roms/controller/genesis/Defender 2 (Genesis).bin new file mode 100644 index 000000000..850eb6070 Binary files /dev/null and b/test/roms/controller/genesis/Defender 2 (Genesis).bin differ diff --git a/test/roms/controller/genesis/Defender Arcade (Genesis).bin b/test/roms/controller/genesis/Defender Arcade (Genesis).bin new file mode 100644 index 000000000..28206ce62 Binary files /dev/null and b/test/roms/controller/genesis/Defender Arcade (Genesis).bin differ diff --git a/test/roms/controller/genesis/Defender MegaDrive (PAL) (Genesis).bin b/test/roms/controller/genesis/Defender MegaDrive (PAL) (Genesis).bin new file mode 100644 index 000000000..3d801a7b7 Binary files /dev/null and b/test/roms/controller/genesis/Defender MegaDrive (PAL) (Genesis).bin differ diff --git a/test/roms/controller/genesis/Double Dragon (PAL) (Genesis).zip b/test/roms/controller/genesis/Double Dragon (PAL) (Genesis).zip new file mode 100644 index 000000000..a1a84179d Binary files /dev/null and b/test/roms/controller/genesis/Double Dragon (PAL) (Genesis).zip differ diff --git a/test/roms/controller/genesis/Enduro (Genesis).zip b/test/roms/controller/genesis/Enduro (Genesis).zip new file mode 100644 index 000000000..a9d16238a Binary files /dev/null and b/test/roms/controller/genesis/Enduro (Genesis).zip differ diff --git a/test/roms/controller/genesis/Gingerbread Man (Fred Quimby) (Genesis).zip b/test/roms/controller/genesis/Gingerbread Man (Fred Quimby) (Genesis).zip new file mode 100644 index 000000000..4246d4f50 Binary files /dev/null and b/test/roms/controller/genesis/Gingerbread Man (Fred Quimby) (Genesis).zip differ diff --git a/test/roms/controller/genesis/H.E.R.O. (Genesis).bin b/test/roms/controller/genesis/H.E.R.O. (Genesis).bin new file mode 100644 index 000000000..af39f64d1 Binary files /dev/null and b/test/roms/controller/genesis/H.E.R.O. (Genesis).bin differ diff --git a/test/roms/controller/genesis/Kangaroo (Genesis).zip b/test/roms/controller/genesis/Kangaroo (Genesis).zip new file mode 100644 index 000000000..fe2be5050 Binary files /dev/null and b/test/roms/controller/genesis/Kangaroo (Genesis).zip differ diff --git a/test/roms/controller/genesis/Kung Fu Master (Genesis).zip b/test/roms/controller/genesis/Kung Fu Master (Genesis).zip new file mode 100644 index 000000000..8b81d1ddb Binary files /dev/null and b/test/roms/controller/genesis/Kung Fu Master (Genesis).zip differ diff --git a/test/roms/controller/genesis/Mission Survive (PAL) (Genesis).zip b/test/roms/controller/genesis/Mission Survive (PAL) (Genesis).zip new file mode 100644 index 000000000..655b99880 Binary files /dev/null and b/test/roms/controller/genesis/Mission Survive (PAL) (Genesis).zip differ diff --git a/test/roms/controller/genesis/Montezuma's Revenge (PAL) (Genesis).zip b/test/roms/controller/genesis/Montezuma's Revenge (PAL) (Genesis).zip new file mode 100644 index 000000000..e06228a72 Binary files /dev/null and b/test/roms/controller/genesis/Montezuma's Revenge (PAL) (Genesis).zip differ diff --git a/test/roms/controller/genesis/Moon Patrol (Genesis).bin b/test/roms/controller/genesis/Moon Patrol (Genesis).bin new file mode 100644 index 000000000..5fa4ce30d Binary files /dev/null and b/test/roms/controller/genesis/Moon Patrol (Genesis).bin differ diff --git a/test/roms/controller/genesis/Moon Patrol Arcade (Genesis).bin b/test/roms/controller/genesis/Moon Patrol Arcade (Genesis).bin new file mode 100644 index 000000000..43400e646 Binary files /dev/null and b/test/roms/controller/genesis/Moon Patrol Arcade (Genesis).bin differ diff --git a/test/roms/controller/genesis/Mouse Trap (Genesis).bin b/test/roms/controller/genesis/Mouse Trap (Genesis).bin new file mode 100644 index 000000000..6865fc938 Binary files /dev/null and b/test/roms/controller/genesis/Mouse Trap (Genesis).bin differ diff --git a/test/roms/controller/genesis/Omega Race (Genesis).zip b/test/roms/controller/genesis/Omega Race (Genesis).zip new file mode 100644 index 000000000..40a64f1d3 Binary files /dev/null and b/test/roms/controller/genesis/Omega Race (Genesis).zip differ diff --git a/test/roms/controller/genesis/Sea Hawk (Genesis).bin b/test/roms/controller/genesis/Sea Hawk (Genesis).bin new file mode 100644 index 000000000..186d753fe Binary files /dev/null and b/test/roms/controller/genesis/Sea Hawk (Genesis).bin differ diff --git a/test/roms/controller/genesis/Solaris (Genesis).bin b/test/roms/controller/genesis/Solaris (Genesis).bin new file mode 100644 index 000000000..e6a3318e3 Binary files /dev/null and b/test/roms/controller/genesis/Solaris (Genesis).bin differ diff --git a/test/roms/controller/genesis/Spy Hunter (Genesis).bin b/test/roms/controller/genesis/Spy Hunter (Genesis).bin new file mode 100644 index 000000000..f0390dcba Binary files /dev/null and b/test/roms/controller/genesis/Spy Hunter (Genesis).bin differ diff --git a/test/roms/controller/genesis/Star Trek (Genesis).zip b/test/roms/controller/genesis/Star Trek (Genesis).zip new file mode 100644 index 000000000..5e837a445 Binary files /dev/null and b/test/roms/controller/genesis/Star Trek (Genesis).zip differ diff --git a/test/roms/controller/genesis/Star Voyager (Genesis).bin b/test/roms/controller/genesis/Star Voyager (Genesis).bin new file mode 100644 index 000000000..743b0c69c Binary files /dev/null and b/test/roms/controller/genesis/Star Voyager (Genesis).bin differ diff --git a/test/roms/controller/genesis/Starmaster (Genesis).zip b/test/roms/controller/genesis/Starmaster (Genesis).zip new file mode 100644 index 000000000..2fd11673d Binary files /dev/null and b/test/roms/controller/genesis/Starmaster (Genesis).zip differ diff --git a/test/roms/controller/genesis/Super Cobra (Genesis).zip b/test/roms/controller/genesis/Super Cobra (Genesis).zip new file mode 100644 index 000000000..d79e75d9d Binary files /dev/null and b/test/roms/controller/genesis/Super Cobra (Genesis).zip differ diff --git a/test/roms/controller/genesis/Yars' Revenge (Genesis).bin b/test/roms/controller/genesis/Yars' Revenge (Genesis).bin new file mode 100644 index 000000000..8c72f32c4 Binary files /dev/null and b/test/roms/controller/genesis/Yars' Revenge (Genesis).bin differ diff --git a/profile/128.bin b/test/roms/profile/128.bin similarity index 100% rename from profile/128.bin rename to test/roms/profile/128.bin diff --git a/profile/README.md b/test/roms/profile/README.md similarity index 100% rename from profile/README.md rename to test/roms/profile/README.md diff --git a/profile/catharsis_theory.bin b/test/roms/profile/catharsis_theory.bin similarity index 100% rename from profile/catharsis_theory.bin rename to test/roms/profile/catharsis_theory.bin