From 3f94dfa25fc1b0e838d368a9b2683a634cd3a60c Mon Sep 17 00:00:00 2001 From: cjdelisle Date: Thu, 8 Sep 2011 12:50:54 -0400 Subject: [PATCH 01/18] Add some hardening to protect against unknown/future exploits. --- doc/build-unix.txt | 42 ++++++++++++++++++++++++++++++++++++++++++ src/makefile.unix | 30 +++++++++++++++++++++++++++++- 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/doc/build-unix.txt b/doc/build-unix.txt index 8f0c568ed..62abb7b99 100644 --- a/doc/build-unix.txt +++ b/doc/build-unix.txt @@ -107,3 +107,45 @@ If you need to build Boost yourself: sudo su ./bootstrap.sh ./bjam install + + +Security +-------- +To help make your bitcoin installation more secure by making certain attacks impossible to +exploit even if a vulnerability is found, you can take the following measures: + +* Position Independent Executable + Build position independent code to take advantage of Address Space Layout Randomization + offered by some kernels. An attacker who is able to cause execution of code at an arbitrary + memory location is thwarted if he doesn't know where anything useful is located. + The stack and heap are randomly located by default but this allows the code section to be + randomly located as well. + + On an Amd64 processor where a library was not compiled with -fPIC, this will cause an error + such as: "relocation R_X86_64_32 against `......' can not be used when making a shared object;" + + To build with PIE, use: + make -f makefile.unix ... -e PIE=1 + + To test that you have built PIE executable, install scanelf, part of paxutils, and use: + scanelf -e ./bitcoin + + The output should contain: + TYPE + ET_DYN + +* Non-executable Stack + If the stack is executable then trivial stack based buffer overflow exploits are possible if + vulnerable buffers are found. By default, bitcoin should be built with a non-executable stack + but if one of the libraries it uses asks for an executable stack or someone makes a mistake + and uses a compiler extension which requires an executable stack, it will silently build an + executable without the non-executable stack protection. + + To verify that the stack is non-executable after compiling use: + scanelf -e ./bitcoin + + the output should contain: + STK/REL/PTL + RW- R-- RW- + + The STK RW- means that the stack is readable and writeable but not executable. diff --git a/src/makefile.unix b/src/makefile.unix index 298d856ec..43c3ea7f5 100644 --- a/src/makefile.unix +++ b/src/makefile.unix @@ -36,8 +36,36 @@ LIBS+= \ -l pthread +# Hardening +# Make some classes of vulnerabilities unexploitable in case one is discovered. +# + # Stack Canaries + # Put numbers at the beginning of each stack frame and check that they are the same. + # If a stack buffer if overflowed, it writes over the canary number and then on return + # when that number is checked, it won't be the same and the program will exit with + # a "Stack smashing detected" error instead of being exploited. + HARDENING=-fstack-protector-all -Wstack-protector + + # Make some important things such as the global offset table read only as soon as + # the dynamic linker is finished building it. This will prevent overwriting of addresses + # which would later be jumped to. + HARDENING+=-Wl,-z,relro -Wl,-z,now + + # Build position independent code to take advantage of Address Space Layout Randomization + # offered by some kernels. + # see doc/build-unix.txt for more information. + ifdef PIE + HARDENING+=-fPIE -pie + endif + + # -D_FORTIFY_SOURCE=2 does some checking for potentially exploitable code patterns in + # the source such overflowing a statically defined buffer. + HARDENING+=-D_FORTIFY_SOURCE=2 +# + + DEBUGFLAGS=-g -D__WXDEBUG__ -CXXFLAGS=-O2 -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(DEFS) +CXXFLAGS=-O2 -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(DEFS) $(HARDENING) HEADERS = \ base58.h \ bignum.h \ From 0465c41c847ddee7eeb5caefb164149400ff8395 Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Sun, 18 Sep 2011 11:55:41 +0200 Subject: [PATCH 02/18] move current qt specific readme to doc/, restore original README.md --- README-original.md => README.md | 1 - README.rst => doc/readme-qt.rst | 10 +++++----- 2 files changed, 5 insertions(+), 6 deletions(-) rename README-original.md => README.md (99%) rename README.rst => doc/readme-qt.rst (98%) diff --git a/README-original.md b/README.md similarity index 99% rename from README-original.md rename to README.md index a41eb2d77..67fa93d37 100644 --- a/README-original.md +++ b/README.md @@ -27,4 +27,3 @@ help test the Bitcoin core, please contact QA@Bitcoin.org. Feature branches are created when there are major new features being worked on by several people. - diff --git a/README.rst b/doc/readme-qt.rst similarity index 98% rename from README.rst rename to doc/readme-qt.rst index c13134a39..b12aa3090 100644 --- a/README.rst +++ b/doc/readme-qt.rst @@ -19,7 +19,7 @@ Features - Asks for confirmation before sending coins, for your own safety - CSV export of transactions and address book (for Excel bookkeeping) - + - Shows alternative icon when connected to testnet, so you never accidentally send real coins during testing - Shows a progress bar on initial block download, so that you don't have to wonder how many blocks it needs to download to be up to date @@ -34,7 +34,7 @@ Features - Accepts "bitcoin:" URLs from browsers and other sources through drag and drop -Build instructions +Build instructions =================== Debian @@ -138,7 +138,7 @@ You can execute the following commands in a terminal to install it: Notification support for recent (k)ubuntu versions --------------------------------------------------- -To see desktop notifications on (k)ubuntu versions starting from 10.04, enable usage of the +To see desktop notifications on (k)ubuntu versions starting from 10.04, enable usage of the FreeDesktop notification interface through DBUS using the following qmake option: :: @@ -152,10 +152,10 @@ A warning for people using the *static binary* version of Bitcoin on a Linux/UNI The static binary version of Bitcoin is linked against libdb4.7 or libdb4.8 (see also `this Debian issue`_). -Now the nasty thing is that databases from 5.X are not compatible with 4.X. +Now the nasty thing is that databases from 5.X are not compatible with 4.X. If the globally installed development package of Berkely DB installed on your system is 5.X, any source you -build yourself will be linked against that. The first time you run with a 5.X version the database will be upgraded, +build yourself will be linked against that. The first time you run with a 5.X version the database will be upgraded, and 4.X cannot open the new format. This means that you cannot go back to the old statically linked version without significant hassle! From 54d02f158d79b078ed9afdca5e37241101b040cd Mon Sep 17 00:00:00 2001 From: Gavin Andresen Date: Thu, 15 Sep 2011 08:55:15 -0400 Subject: [PATCH 03/18] SetMockTime() for cleaner unit testing --- src/util.cpp | 9 +++++++++ src/util.h | 1 + 2 files changed, 10 insertions(+) diff --git a/src/util.cpp b/src/util.cpp index 76a270027..14ca87b62 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -815,11 +815,20 @@ void ShrinkDebugFile() // - Median of other nodes's clocks // - The user (asking the user to fix the system clock if the first two disagree) // +static int64 nMockTime = 0; // For unit testing + int64 GetTime() { + if (nMockTime) return nMockTime; + return time(NULL); } +void SetMockTime(int64 nMockTimeIn) +{ + nMockTime = nMockTimeIn; +} + static int64 nTimeOffset = 0; int64 GetAdjustedTime() diff --git a/src/util.h b/src/util.h index 3d7ef108b..658d10e1e 100644 --- a/src/util.h +++ b/src/util.h @@ -199,6 +199,7 @@ void ShrinkDebugFile(); int GetRandInt(int nMax); uint64 GetRand(uint64 nMax); int64 GetTime(); +void SetMockTime(int64 nMockTimeIn); int64 GetAdjustedTime(); void AddTimeData(unsigned int ip, int64 nTime); std::string FormatFullVersion(); From 15f3ad4dbdf0d245b936e68c51a7ecb9f472d2cd Mon Sep 17 00:00:00 2001 From: Gavin Andresen Date: Tue, 6 Sep 2011 16:09:04 -0400 Subject: [PATCH 04/18] Framework for banning mis-behaving peers --- src/init.cpp | 2 ++ src/net.cpp | 54 ++++++++++++++++++++++++++++++- src/net.h | 28 +++++++++++++++- src/test/DoS_tests.cpp | 68 +++++++++++++++++++++++++++++++++++++++ src/test/test_bitcoin.cpp | 2 +- 5 files changed, 151 insertions(+), 3 deletions(-) create mode 100644 src/test/DoS_tests.cpp diff --git a/src/init.cpp b/src/init.cpp index dbc2c4133..158418d7b 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -179,6 +179,8 @@ bool AppInit2(int argc, char* argv[]) " -addnode= \t " + _("Add a node to connect to\n") + " -connect= \t\t " + _("Connect only to the specified node\n") + " -nolisten \t " + _("Don't accept connections from outside\n") + + " -banscore= \t " + _("Threshold for disconnecting misbehaving peers (default: 100)\n") + + " -bantime= \t " + _("Number of seconds to keep misbehaving peers from reconnecting (default: 86400)\n") + #ifdef USE_UPNP #if USE_UPNP " -noupnp \t " + _("Don't attempt to use UPnP to map the listening port\n") + diff --git a/src/net.cpp b/src/net.cpp index 2e257a6ef..1792bf78a 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -726,6 +726,52 @@ void CNode::Cleanup() } +std::map CNode::setBanned; +CCriticalSection CNode::cs_setBanned; + +void CNode::ClearBanned() +{ + setBanned.clear(); +} + +bool CNode::IsBanned(unsigned int ip) +{ + bool fResult = false; + CRITICAL_BLOCK(cs_setBanned) + { + std::map::iterator i = setBanned.find(ip); + if (i != setBanned.end()) + { + int64 t = (*i).second; + if (GetTime() < t) + fResult = true; + } + } + return fResult; +} + +bool CNode::Misbehaving(int howmuch) +{ + if (addr.IsLocal()) + { + printf("Warning: local node %s misbehaving\n", addr.ToString().c_str()); + return false; + } + + nMisbehavior += howmuch; + if (nMisbehavior >= GetArg("-banscore", 100)) + { + int64 banTime = GetTime()+GetArg("-bantime", 60*60*24); // Default 24-hour ban + CRITICAL_BLOCK(cs_setBanned) + if (setBanned[addr.ip] < banTime) + setBanned[addr.ip] = banTime; + CloseSocketDisconnect(); + printf("Disconnected %s for misbehavior (score=%d)\n", addr.ToString().c_str(), nMisbehavior); + return true; + } + return false; +} + @@ -896,6 +942,11 @@ void ThreadSocketHandler2(void* parg) { closesocket(hSocket); } + else if (CNode::IsBanned(addr.ip)) + { + printf("connetion from %s dropped (banned)\n", addr.ToString().c_str()); + closesocket(hSocket); + } else { printf("accepted connection %s\n", addr.ToString().c_str()); @@ -1454,7 +1505,8 @@ bool OpenNetworkConnection(const CAddress& addrConnect) // if (fShutdown) return false; - if (addrConnect.ip == addrLocalHost.ip || !addrConnect.IsIPv4() || FindNode(addrConnect.ip)) + if (addrConnect.ip == addrLocalHost.ip || !addrConnect.IsIPv4() || + FindNode(addrConnect.ip) || CNode::IsBanned(addrConnect.ip)) return false; vnThreadsRunning[1]--; diff --git a/src/net.h b/src/net.h index 0026e402c..5b3568fca 100644 --- a/src/net.h +++ b/src/net.h @@ -124,6 +124,13 @@ public: bool fDisconnect; protected: int nRefCount; + + // Denial-of-service detection/prevention + // Key is ip address, value is banned-until-time + static std::map setBanned; + static CCriticalSection cs_setBanned; + int nMisbehavior; + public: int64 nReleaseTime; std::map mapRequests; @@ -148,7 +155,6 @@ public: // publish and subscription std::vector vfSubscribe; - CNode(SOCKET hSocketIn, CAddress addrIn, bool fInboundIn=false) { nServices = 0; @@ -185,6 +191,7 @@ public: nStartingHeight = -1; fGetAddr = false; vfSubscribe.assign(256, false); + nMisbehavior = 0; // Be shy and don't send version until we hear if (!fInbound) @@ -568,6 +575,25 @@ public: void CancelSubscribe(unsigned int nChannel); void CloseSocketDisconnect(); void Cleanup(); + + + // Denial-of-service detection/prevention + // The idea is to detect peers that are behaving + // badly and disconnect/ban them, but do it in a + // one-coding-mistake-won't-shatter-the-entire-network + // way. + // IMPORTANT: There should be nothing I can give a + // node that it will forward on that will make that + // node's peers drop it. If there is, an attacker + // can isolate a node and/or try to split the network. + // Dropping a node for sending stuff that is invalid + // now but might be valid in a later version is also + // dangerous, because it can cause a network split + // between nodes running old code and nodes running + // new code. + static void ClearBanned(); // needed for unit testing + static bool IsBanned(unsigned int ip); + bool Misbehaving(int howmuch); // 1 == a little, 100 == a lot }; diff --git a/src/test/DoS_tests.cpp b/src/test/DoS_tests.cpp new file mode 100644 index 000000000..e60bb742d --- /dev/null +++ b/src/test/DoS_tests.cpp @@ -0,0 +1,68 @@ +// +// Unit tests for denial-of-service detection/prevention code +// +#include +#include + +#include "../main.h" +#include "../net.h" +#include "../util.h" + +using namespace std; + +BOOST_AUTO_TEST_SUITE(DoS_tests) + +BOOST_AUTO_TEST_CASE(DoS_banning) +{ + CNode::ClearBanned(); + CAddress addr1(0xa0b0c001); + CNode dummyNode1(INVALID_SOCKET, addr1, true); + dummyNode1.Misbehaving(100); // Should get banned + BOOST_CHECK(CNode::IsBanned(addr1.ip)); + BOOST_CHECK(!CNode::IsBanned(addr1.ip|0x0000ff00)); // Different ip, not banned + + CAddress addr2(0xa0b0c002); + CNode dummyNode2(INVALID_SOCKET, addr2, true); + dummyNode2.Misbehaving(50); + BOOST_CHECK(!CNode::IsBanned(addr2.ip)); // 2 not banned yet... + BOOST_CHECK(CNode::IsBanned(addr1.ip)); // ... but 1 still should be + dummyNode2.Misbehaving(50); + BOOST_CHECK(CNode::IsBanned(addr2.ip)); +} + +BOOST_AUTO_TEST_CASE(DoS_banscore) +{ + CNode::ClearBanned(); + mapArgs["-banscore"] = "111"; // because 11 is my favorite number + CAddress addr1(0xa0b0c001); + CNode dummyNode1(INVALID_SOCKET, addr1, true); + dummyNode1.Misbehaving(100); + BOOST_CHECK(!CNode::IsBanned(addr1.ip)); + dummyNode1.Misbehaving(10); + BOOST_CHECK(!CNode::IsBanned(addr1.ip)); + dummyNode1.Misbehaving(1); + BOOST_CHECK(CNode::IsBanned(addr1.ip)); + mapArgs["-banscore"] = "100"; +} + +BOOST_AUTO_TEST_CASE(DoS_bantime) +{ + CNode::ClearBanned(); + int64 nStartTime = GetTime(); + SetMockTime(nStartTime); // Overrides future calls to GetTime() + + CAddress addr(0xa0b0c001); + CNode dummyNode(INVALID_SOCKET, addr, true); + + dummyNode.Misbehaving(100); + BOOST_CHECK(CNode::IsBanned(addr.ip)); + + SetMockTime(nStartTime+60*60); + BOOST_CHECK(CNode::IsBanned(addr.ip)); + + SetMockTime(nStartTime+60*60*24+1); + BOOST_CHECK(!CNode::IsBanned(addr.ip)); +} + + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/test_bitcoin.cpp b/src/test/test_bitcoin.cpp index 0230bb6ec..c6f6d94b1 100644 --- a/src/test/test_bitcoin.cpp +++ b/src/test/test_bitcoin.cpp @@ -8,7 +8,7 @@ #include "uint256_tests.cpp" #include "script_tests.cpp" #include "transaction_tests.cpp" - +#include "DoS_tests.cpp" CWallet* pwalletMain; From 3e52aaf2121d597ab1ed012b65e37f9cb5f2754e Mon Sep 17 00:00:00 2001 From: Gavin Andresen Date: Tue, 6 Sep 2011 16:59:38 -0400 Subject: [PATCH 05/18] Transaction/Block denial-of-service detection/response --- src/main.cpp | 62 ++++++++++++++++++++++++++++------------------------ src/main.h | 8 +++++++ 2 files changed, 41 insertions(+), 29 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 6a3bacc78..6c7fac59f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -296,24 +296,24 @@ bool CTransaction::CheckTransaction() const { // Basic checks that don't depend on any context if (vin.empty()) - return error("CTransaction::CheckTransaction() : vin empty"); + return DoS(10, error("CTransaction::CheckTransaction() : vin empty")); if (vout.empty()) - return error("CTransaction::CheckTransaction() : vout empty"); + return DoS(10, error("CTransaction::CheckTransaction() : vout empty")); // Size limits if (::GetSerializeSize(*this, SER_NETWORK) > MAX_BLOCK_SIZE) - return error("CTransaction::CheckTransaction() : size limits failed"); + return DoS(100, error("CTransaction::CheckTransaction() : size limits failed")); // Check for negative or overflow output values int64 nValueOut = 0; BOOST_FOREACH(const CTxOut& txout, vout) { if (txout.nValue < 0) - return error("CTransaction::CheckTransaction() : txout.nValue negative"); + return DoS(100, error("CTransaction::CheckTransaction() : txout.nValue negative")); if (txout.nValue > MAX_MONEY) - return error("CTransaction::CheckTransaction() : txout.nValue too high"); + return DoS(100, error("CTransaction::CheckTransaction() : txout.nValue too high")); nValueOut += txout.nValue; if (!MoneyRange(nValueOut)) - return error("CTransaction::CheckTransaction() : txout total out of range"); + return DoS(100, error("CTransaction::CheckTransaction() : txout total out of range")); } // Check for duplicate inputs @@ -328,13 +328,13 @@ bool CTransaction::CheckTransaction() const if (IsCoinBase()) { if (vin[0].scriptSig.size() < 2 || vin[0].scriptSig.size() > 100) - return error("CTransaction::CheckTransaction() : coinbase script size"); + return DoS(100, error("CTransaction::CheckTransaction() : coinbase script size")); } else { BOOST_FOREACH(const CTxIn& txin, vin) if (txin.prevout.IsNull()) - return error("CTransaction::CheckTransaction() : prevout is null"); + return DoS(10, error("CTransaction::CheckTransaction() : prevout is null")); } return true; @@ -350,7 +350,7 @@ bool CTransaction::AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs, bool* pfMi // Coinbase is only valid in a block, not as a loose transaction if (IsCoinBase()) - return error("AcceptToMemoryPool() : coinbase as individual tx"); + return DoS(100, error("AcceptToMemoryPool() : coinbase as individual tx")); // To help v0.1.5 clients who would see it as a negative number if ((int64)nLockTime > INT_MAX) @@ -363,7 +363,7 @@ bool CTransaction::AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs, bool* pfMi // 34 bytes because a TxOut is: // 20-byte address + 8 byte bitcoin amount + 5 bytes of ops + 1 byte script length if (GetSigOpCount() > nSize / 34 || nSize < 100) - return error("AcceptToMemoryPool() : nonstandard transaction"); + return DoS(10, error("AcceptToMemoryPool() : transaction with out-of-bounds SigOpCount")); // Rather not work on nonstandard transactions (unless -testnet) if (!fTestNet && !IsStandard()) @@ -848,26 +848,28 @@ bool CTransaction::ConnectInputs(CTxDB& txdb, map& mapTestPoo } if (prevout.n >= txPrev.vout.size() || prevout.n >= txindex.vSpent.size()) - return error("ConnectInputs() : %s prevout.n out of range %d %d %d prev tx %s\n%s", GetHash().ToString().substr(0,10).c_str(), prevout.n, txPrev.vout.size(), txindex.vSpent.size(), prevout.hash.ToString().substr(0,10).c_str(), txPrev.ToString().c_str()); + return DoS(100, error("ConnectInputs() : %s prevout.n out of range %d %d %d prev tx %s\n%s", GetHash().ToString().substr(0,10).c_str(), prevout.n, txPrev.vout.size(), txindex.vSpent.size(), prevout.hash.ToString().substr(0,10).c_str(), txPrev.ToString().c_str())); // If prev is coinbase, check that it's matured if (txPrev.IsCoinBase()) for (CBlockIndex* pindex = pindexBlock; pindex && pindexBlock->nHeight - pindex->nHeight < COINBASE_MATURITY; pindex = pindex->pprev) if (pindex->nBlockPos == txindex.pos.nBlockPos && pindex->nFile == txindex.pos.nFile) - return error("ConnectInputs() : tried to spend coinbase at depth %d", pindexBlock->nHeight - pindex->nHeight); + return DoS(10, error("ConnectInputs() : tried to spend coinbase at depth %d", pindexBlock->nHeight - pindex->nHeight)); // Verify signature if (!VerifySignature(txPrev, *this, i)) - return error("ConnectInputs() : %s VerifySignature failed", GetHash().ToString().substr(0,10).c_str()); + return DoS(100,error("ConnectInputs() : %s VerifySignature failed", GetHash().ToString().substr(0,10).c_str())); - // Check for conflicts + // Check for conflicts (double-spend) + // This doesn't trigger the DoS code on purpose; if it did, it would make it easier + // for an attacker to attempt to split the network. if (!txindex.vSpent[prevout.n].IsNull()) return fMiner ? false : error("ConnectInputs() : %s prev tx already used at %s", GetHash().ToString().substr(0,10).c_str(), txindex.vSpent[prevout.n].ToString().c_str()); // Check for negative or overflow input values nValueIn += txPrev.vout[prevout.n].nValue; if (!MoneyRange(txPrev.vout[prevout.n].nValue) || !MoneyRange(nValueIn)) - return error("ConnectInputs() : txin values out of range"); + return DoS(100, error("ConnectInputs() : txin values out of range")); // Mark outpoints as spent txindex.vSpent[prevout.n] = posThisTx; @@ -880,17 +882,17 @@ bool CTransaction::ConnectInputs(CTxDB& txdb, map& mapTestPoo } if (nValueIn < GetValueOut()) - return error("ConnectInputs() : %s value in < value out", GetHash().ToString().substr(0,10).c_str()); + return DoS(100, error("ConnectInputs() : %s value in < value out", GetHash().ToString().substr(0,10).c_str())); // Tally transaction fees int64 nTxFee = nValueIn - GetValueOut(); if (nTxFee < 0) - return error("ConnectInputs() : %s nTxFee < 0", GetHash().ToString().substr(0,10).c_str()); + return DoS(100, error("ConnectInputs() : %s nTxFee < 0", GetHash().ToString().substr(0,10).c_str())); if (nTxFee < nMinFee) return false; nFees += nTxFee; if (!MoneyRange(nFees)) - return error("ConnectInputs() : nFees out of range"); + return DoS(100, error("ConnectInputs() : nFees out of range")); } if (fBlock) @@ -1233,11 +1235,11 @@ bool CBlock::CheckBlock() const // Size limits if (vtx.empty() || vtx.size() > MAX_BLOCK_SIZE || ::GetSerializeSize(*this, SER_NETWORK) > MAX_BLOCK_SIZE) - return error("CheckBlock() : size limits failed"); + return DoS(100, error("CheckBlock() : size limits failed")); // Check proof of work matches claimed amount if (!CheckProofOfWork(GetHash(), nBits)) - return error("CheckBlock() : proof of work failed"); + return DoS(50, error("CheckBlock() : proof of work failed")); // Check timestamp if (GetBlockTime() > GetAdjustedTime() + 2 * 60 * 60) @@ -1245,23 +1247,23 @@ bool CBlock::CheckBlock() const // First transaction must be coinbase, the rest must not be if (vtx.empty() || !vtx[0].IsCoinBase()) - return error("CheckBlock() : first tx is not coinbase"); + return DoS(100, error("CheckBlock() : first tx is not coinbase")); for (int i = 1; i < vtx.size(); i++) if (vtx[i].IsCoinBase()) - return error("CheckBlock() : more than one coinbase"); + return DoS(100, error("CheckBlock() : more than one coinbase")); // Check transactions BOOST_FOREACH(const CTransaction& tx, vtx) if (!tx.CheckTransaction()) - return error("CheckBlock() : CheckTransaction failed"); + return DoS(tx.nDoS, error("CheckBlock() : CheckTransaction failed")); // Check that it's not full of nonstandard transactions if (GetSigOpCount() > MAX_BLOCK_SIGOPS) - return error("CheckBlock() : too many nonstandard transactions"); + return DoS(100, error("CheckBlock() : out-of-bounds SigOpCount")); // Check merkleroot if (hashMerkleRoot != BuildMerkleTree()) - return error("CheckBlock() : hashMerkleRoot mismatch"); + return DoS(100, error("CheckBlock() : hashMerkleRoot mismatch")); return true; } @@ -1276,13 +1278,13 @@ bool CBlock::AcceptBlock() // Get prev block index map::iterator mi = mapBlockIndex.find(hashPrevBlock); if (mi == mapBlockIndex.end()) - return error("AcceptBlock() : prev block not found"); + return DoS(10, error("AcceptBlock() : prev block not found")); CBlockIndex* pindexPrev = (*mi).second; int nHeight = pindexPrev->nHeight+1; // Check proof of work if (nBits != GetNextWorkRequired(pindexPrev)) - return error("AcceptBlock() : incorrect proof of work"); + return DoS(100, error("AcceptBlock() : incorrect proof of work")); // Check timestamp against prev if (GetBlockTime() <= pindexPrev->GetMedianTimePast()) @@ -1291,7 +1293,7 @@ bool CBlock::AcceptBlock() // Check that all transactions are finalized BOOST_FOREACH(const CTransaction& tx, vtx) if (!tx.IsFinal(nHeight, GetBlockTime())) - return error("AcceptBlock() : contains a non-final transaction"); + return DoS(10, error("AcceptBlock() : contains a non-final transaction")); // Check that the block chain matches the known block chain up to a checkpoint if (!fTestNet) @@ -1304,7 +1306,7 @@ bool CBlock::AcceptBlock() (nHeight == 118000 && hash != uint256("0x000000000000774a7f8a7a12dc906ddb9e17e75d684f15e00f8767f9e8f36553")) || (nHeight == 134444 && hash != uint256("0x00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe")) || (nHeight == 140700 && hash != uint256("0x000000000000033b512028abb90e1626d8b346fd0ed598ac0a3c371138dce2bd"))) - return error("AcceptBlock() : rejected by checkpoint lockin at %d", nHeight); + return DoS(100, error("AcceptBlock() : rejected by checkpoint lockin at %d", nHeight)); // Write block to history file if (!CheckDiskSpace(::GetSerializeSize(*this, SER_DISK))) @@ -2126,6 +2128,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) printf("storing orphan tx %s\n", inv.hash.ToString().substr(0,10).c_str()); AddOrphanTx(vMsg); } + if (tx.nDoS) pfrom->Misbehaving(tx.nDoS); } @@ -2142,6 +2145,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) if (ProcessBlock(pfrom, &block)) mapAlreadyAskedFor.erase(inv); + if (block.nDoS) pfrom->Misbehaving(block.nDoS); } diff --git a/src/main.h b/src/main.h index c400145d0..3e1371abb 100644 --- a/src/main.h +++ b/src/main.h @@ -399,6 +399,9 @@ public: std::vector vout; unsigned int nLockTime; + // Denial-of-service detection: + mutable int nDoS; + bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; } CTransaction() { @@ -420,6 +423,7 @@ public: vin.clear(); vout.clear(); nLockTime = 0; + nDoS = 0; // Denial-of-service prevention } bool IsNull() const @@ -786,6 +790,9 @@ public: // memory only mutable std::vector vMerkleTree; + // Denial-of-service detection: + mutable int nDoS; + bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; } CBlock() { @@ -819,6 +826,7 @@ public: nNonce = 0; vtx.clear(); vMerkleTree.clear(); + nDoS = 0; } bool IsNull() const From 806704c237890527ca2a7bab4c97550431eebea0 Mon Sep 17 00:00:00 2001 From: Gavin Andresen Date: Tue, 6 Sep 2011 17:41:51 -0400 Subject: [PATCH 06/18] More denial-of-service misbehavior detection: version/addr/inv/getdata messages --- src/main.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 6c7fac59f..ac912f9b5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1764,7 +1764,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) { // Each connection can only send one version message if (pfrom->nVersion != 0) + { + pfrom->Misbehaving(1); return false; + } int64 nTime; CAddress addrMe; @@ -1848,6 +1851,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) else if (pfrom->nVersion == 0) { // Must have a version message before anything else + pfrom->Misbehaving(1); return false; } @@ -1869,7 +1873,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) if (pfrom->nVersion < 31402 && mapAddresses.size() > 1000) return true; if (vAddr.size() > 1000) + { + pfrom->Misbehaving(20); return error("message addr size() = %d", vAddr.size()); + } // Store the new addresses CAddrDB addrDB; @@ -1927,7 +1934,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) vector vInv; vRecv >> vInv; if (vInv.size() > 50000) + { + pfrom->Misbehaving(20); return error("message inv size() = %d", vInv.size()); + } CTxDB txdb("r"); BOOST_FOREACH(const CInv& inv, vInv) @@ -1956,7 +1966,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) vector vInv; vRecv >> vInv; if (vInv.size() > 50000) + { + pfrom->Misbehaving(20); return error("message getdata size() = %d", vInv.size()); + } BOOST_FOREACH(const CInv& inv, vInv) { From a4f2c8419f5a8b47c4b48e962b4ff02885164c9b Mon Sep 17 00:00:00 2001 From: Gavin Andresen Date: Sat, 10 Sep 2011 19:07:43 -0400 Subject: [PATCH 07/18] Script to create OSX .dmg diskimage file. --- contrib/BitcoinTemplate.dmg | Bin 0 -> 292309 bytes contrib/create_osx_dmg.sh | 60 ++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 contrib/BitcoinTemplate.dmg create mode 100755 contrib/create_osx_dmg.sh diff --git a/contrib/BitcoinTemplate.dmg b/contrib/BitcoinTemplate.dmg new file mode 100644 index 0000000000000000000000000000000000000000..ca86308e0502647f94249e82f6e5e9bd4bdb9aae GIT binary patch literal 292309 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

QEraib1qnUP_R3%jstAg` zcT=7{r``7QKY~8S{smj``lOfeNNSI$)(A3#)4y~QdGAIvWKOAOq-`X^`%~k^2|c1l zh!gkKG}OF)hV1lH$>n+aa32RbP4Oj$_%TpKkz-x2+m)HR!|!-?!xn&Q2sCM>V5*uI|D|i0d>SLpq0=|mvwGy z&glI|C&$uEs|Io=_Z#zPl;)i-#E(Gz+hEGsANhLSX2}#)mFUAWw;tA6#6{W-d&U`2 zbBS#*7NzJe@K)Sx`)A5Pq}@p<-W6FWc9gJrWpT*%#SMW9m&>g#N?CGD`%5DJ-cqE% zr2?MNBcE-C8Y?En-Xu$prgkDRpiAYM6yGF+m;q3V|pG?U$9qZ3?3_&_v#f#=V2kBV6w}{*GDs@6>7=*q|N>+6hqXxv8!Y z^sl#p`LGqjft@NBHk(@6PhkH$9s{I-5g48H=967m(3Yk$>sU&rGNZU3_MiZE9Py|P zTW9`gKv&pH*-gH4uBGS{Hq&wvqcEvUtg|p~E-7J*>NG@d*my$&lbXsm*1Lux|ILf% zojZ-MHtZqqrBa+b(-hAZu4>>S%xjkdR$)Vlj(U%1WpzL$$F3R0+%5c#fc?f&_RW7H zarHLtGpCEpQn~DKIhzsub0q^_g*N-Ls^>3e!D>;NhhU}E8-LUhuREp0N~Vi)0_KY2 zmg@LX&wn$dokD7^J(Xsn%qM>fV@({kk5v$S!;2)Kvrw}0k`h#T^Q05!Nh11lRoSq{ zgYtSN54b`Yb2T$Z@aNj~u}(l|+uFM|?rl693A$_&(Zj=gL6Tt^SpS;rMUCZ+fAS9K) zEMWflvEBOKw*+3MzaL2m-WpyNJ$iWawqnukOK86#!YK$P+EdvT6(L#%b{eIYY^gWr zsl`^baV~Cano7C#Q?=uuL0R%t$%@@l*)CI$$9VDtH4APb(b!jAU?;COgw|%x_GSTnDB|5dTqEGsORm_<@y2G^SJmM2_UyakqP~ePKQc_c(bOz>*7D0&>xi05u<@I zCCYr%CTQImv>7wl(kDJ@#AU6_oUxC{7*I;)G&br7Eqkih=yAa=-@5x?Cy3_QDF(Yy zw~=evS`!IC4ciU7SJHLGMHCa9tfZ`9nuMD8smcw|{01V%G(}(fIuLUsh?q~+qTy;< z_>{~gU1FAMp3+dMvIn4>|mgl2C4jS{3d?Aat?= z2r5L++($Xx(~K7Fo|}B=Xa_WyNMJ~+kE^aj`;`)B9AzK_8SA7(Kl+2}^^#2mJXg%X zj7EX~HqD5D0XsHjiG{Pvi0k8;hyf|RFbEBb@*H|zMBzYsh*tW>03)E(ns1~Kz`w~? zS2Kl$Zl8Jh(g|EJA$?sP?^KH#H;*KnpV9^#W&D;P1=jboz0Cj^uW_?5MT5j)g4vX; zig(DxJtU4a_v{Ek2!TJxDVVUEB3+0~C=;M!vM5Q&K_A^06_f|A3k{pU9L1UDqMK6z zmZ!T=+X=mKBZEHG4{fy2z#mWAwwxHC{_l6TiS!ke!}1hJR3LEN+2)GXaheJ#=|j~& z*hw^JX97%aK%x(ME~4o>%8L+&OZDIO$>)s~QA~}BZ%0S992SPH-q(z0C@!tkrq&n1 z4~>cRLN2O4QXNclBLwgoiCn^ z%}}QwJmzt;7>DmpC?z~)rRjqF)-&NXg0l>l=l(|=>x@PaTzf2nb2V4oQAv+wA6R$9-)YZSC>PNU`cxS9kJAH!MR5iA)om}zqLf)*1 ztyy2oS?`#*KnnLWb#!sJ%aX5?4rV0{GM1Qnfg1xEfK4o%E=!dxAZ0 zltGaIRM`M5+Rc|CiF#2OUPDZZ*13HOvs&1fOnlUn-fLciEODRc@HPQtAKo!6@DLBI z1$&6U{zfKoUjRY53>yIcz5i8%0F8%d1MBiQg2oU5Nc0QV_l6n%-DWY!PZ1BjbuySq zq&4kAfnUWV^!jR=#Y}tbW{i}u_f*?E*K9hU9fj)TBKLhNY zahN;xuF_@o5ZdAyS}jLE6!CQtcFoN+5Ube~@kR!} z3``!2J&6KIp>mfJqdI&^y-2KAH&55KO9lH%K z>sueT&dHGUM0qf(<&+rc0xOOX9FJiA3zYm3(S|LzrY(J^KyYv*91L zmtG{Gy*t(F`(LH|k4%Dmq#Xi?$XCPv*zS$cJ9krL4QJON_D-SFjnwif5;Z;V%W1I>AUOzq9y5U({}WK05W}9b(Zb40_KMErU$!CNc^W1eh7aNfNP~<{&lJuJ@^+VtAFMn~A;Y#|stOTndh`h@&7vy>P|?nFp)K`;2bE z*`zbFZ0zDaxGut(FF_1}BwpSNa%{3vss?D~empiZL=|Jg%eChXqwI@=Rzv7#y5Jhv zs$@mn)K+wfBzD)ddWB8q${i!#{v9cWM@z7+-D1c_36sDSQIr^YZY2g_7p$Kkhr`_aEbao9>h6IYiQfJO=14=1eK7`B^)Df}!4ea402L5#_(U*Q$Y+ z0MAsxJzpNwSZ=6d(zy=^z7+^q)YnwOllyt_h3clkq3Z#Pgq0m%%?aEZv;h&FGi+Zu zfn2aCAM1 zr@V_Nng^`=_Is1cny^$6y}|?4tJq%nNx3j zr)fsYXIxqA{Aavpj(Iy{6-g>OL-fpi^_$&))4@JCMDRQ3e&QR^aO<<|5Z3|3c3~97 z3iVzEY)(>#D*sizsvz~$A$fW#t}iJ>8zIYvB~zf{$+n=Rq?UUw9>Z9|ly`Q-4i*i8(o zF&3X-dxfETBddA9zTr6$K>hk)m_}11JF6k;Hy@R-PAaQTheS7v^E1Sc%|(?T(Qtxdm*V zXXMBqPe1qo3cg`fob#4O55caJbg>H-RlsgST)F%Yf^dU6TBRO>j6s)k_K77fhcFmB zDDU`2_9;=<(W0l(yfnw7uIuYfA(qV{aayI3w!Ax<{ER%i7XKQVOp86BmGC=^%RMV- zFJ&*Q0)_gYd~6S7NfX8IL5sayYvypG%w>?;IA8fviy@EiS1v@RJd~w)S;mkQw8O@t zY=u3}68s8{RPSx?F&9&H_XYz{pJRW#Jqp{%11 znOl{5$jutViGSbs{UnRp8;Gl~4Es-eN6nM}O5Tuxs9y(3NJzHlAp16x6#!jk?mA>C zpM;9F_TqkY(-tl?=^yg9KVgzcB|MHnGAxl=(SxYkV3wYo6N0N)hlTn?<^{Z|x5Nlw zx&QT?OBa~6j($OZZrQj5p>GBvLy}^M+KO)}L^UOtN%v1o&KRhlYKlY;PN3l&ZEPay zXkaIDRK$9pF?SMuCHg5)@(Ha3b|p?YfGI9T8|*>UHwxa&_@ajcV9w$lxU}8*3G%1czZ3!6J#Qpm$mdv=Mb$yQx-PT+0bygU@y-B_di(MbWHV3K zQTwTA80s${kbC!tB#n8c?nk6e*2dg-{3-N$0?wt}uTaD4{Lc435MA?anYV(nSOhU( ze{kM9_swryzIP+m2=7ZsJW_Jp=H=XP++Kszcl+-H({$N=3dQ}Rf4o|rb@_f+L(A|H zqc4LkD|&39R&6!8=(#9NZZ;TcW#EVEbT>mN&B)At_!eCxOfe^w-~8^O@C9t4uu!7r z@|YxvxDw5=kIB%XrEMDYbRzWRy9xPrq+HAxQvPkShfYS-u(KJc->;m+_QNF5mqj2y zR~ciFjJShD@9Da!yei-;ZXO;|4jb+}4+01nRl+IHAHLHa@%YVd(Yw5Ul63KhrP=#t zER9yZcL96eldv@=Kf6H&8tzlt={|V`J!50|m2rusR9bz}XBzypap9y{g~j)6T&pGX|4(var53lyZ5}-#hz==+8rXSC-)5?J_3*eMZYg;m{(< zL)DICzdU!(Ne>XwvOIi`+NkKXj(AzxUsdFk|1bV*4ukCvVF?+gXt4rgo5Wi;8#D8? zELZ^X?1=n_BDL0kJQlVbpIYYQWB*Oc*qYc(XtHX$= zN}1F40qU+ZGygu36Eu4|0Fr^L<1EC70*p@Z%JCr{c9;{MOtjNm4@3{O=<}=S1dhs8 z82Ff#-*l(Jxx+hG+B8?Y!wCfGvBDrLWS0NYMFhmL+k<`y6SG~e8?rnBq#m37@f(3N zRE@5_xy2(fr9qnaIo)pzqN8R~qu1C8#&Xd>!cR+UgdB63^Aj~$=cooa>NvDvZ-zf5 zu=z*qLov~IAQwbJIE7gNjKjgc{nGuD1|w4s31k-IipmRS>7gLX+DS_~@SBgh*#6u# zj7QaS`Y9RuqL)^h0A5iH>0`|>eG_WDds0a7p7*k(0&~NUQl)GR9v#ZlKa7lTZQz`5oQn<_bZh5N?1hiz{R<{9!Uz~FI-I|OxB91vdG-q zSG{<^KjB)5GKgvm-VYJy%szbTErur5P%T~XJsI-3%BBIbMrDZ=e6?;Wh5#+_O2}56 zi$0;zqpZUk7xBE}ttt{WG4;H$oWZ-!O<8l1O%zeX2Ap%J+u`VZJuCIN7lP? zd@IW3imsjoWRgIHF1u82ap%W72FUVWf)Nup57+HrmrgAbwoUw+JQ#yl5HERFg+dAoeFC}gKSA^+HSaQ(JVL8bhkLmeN0Vb^EO-KklE(w8)6 zk1$Ju^T2-4vDm0aeK$bZJ?WHJo2?2i8*EG{r~zS~!os-R$Ny=MoO|*MCl(M+n80j| zNebN#IB1N&nbpl~N)7g>Np|rN=?z!}_(5LQR4H<@;}YAge2HVmr;|=2W6;Zw>ToR# z5j&cZlf7{*!%uXoW^thf?7iy+qfSjQK4)x|{@cAOdA5NqdzLkru`p^&>n z`098uU7u!pHTr~>fzz<{xXZ1u$$mz|kNg8{@xl0JqMpbe1TyuZ6~kK;PPbrbpbhB$ zv*cZGCp7u0-ouWErI1pc6<4J&Io5LYMlo!@$N(5zDBvuJ545@-^+!MeT)DQd1?Sqx z5DT(e{+nC`0{xvRLcB?iTbd`PSZV!@&6%vRVH3*gf_Xb3=F@!dpA0T|| zccGK?v7qu3bfRHhiT_ZWCZ}^Zt^M90$vA)zf}&R&)%};FA`%l<_*P;1%*wFR%lYLk zBY1Q>m;KcvGslzlnZpD;WbmWa!QQ!BB5Afd6(0;_(_RgPQn2AH>`|UAn7~TWrd%{-6uC1YbFNq2W!!!)6dH5@15r|m%ulmB#9JXr{doBe z*;lI$7<@iBI&b#`lnB$;8A!do6yAgfE$?6FH?VL*knr4J?pe6KoAxY4)wR4riV6E5*O@krY`)4>H|MHpT{vUl zpkk+z|5I&-(N~;g`a~Y2I2Y)K*KPGVY>U%}*Vz-#y0$C?lKELddSP6Kofnf>=!zPE zWSLGT99Tjg|M(NO-%OXznRrN=flU7|y%|m|_ZoHsSy)5Sw+QOoL-f=Rk{0oP#*xVy zzs0;p;GF#AB&g3uP|!_(W~^3yPS`|7O37&mrRInS@)>N~01W20>VJv`kN_|uMxQ6d zHvyT)iHHCnZva_zqY$XbBYn?y?)7%^heP%~s-0iDA-(Ne-WEiL_Lu_iChIOW+<)N|w!eB*x<})q*2qF6dUW!n=;qZMf#VpANpczFb zQE2zVGq`fwpi5=Z!R4#8N_U&Ut5*OcaA9noC`i)VDzQ@h8AwUU z-8Z+VEuE?JN6)|OsLae2p%6W>O6#|$CGGf}Er>)x^L#pX6)Xc%zeIn#Wc@_Pv(11V z)xLNk2;K5#80J~tV^24L4`s?%CL&nU-Q;rmngBnNPVELa^}`cWGgqkIS0IiKxnDCi zBke!d%RBQRo1`p(%Q@(#7sntT#kBPWUX^#IIEI}V0>uTsEPVF}#592|EIYrKs>b0U z$isIu8>M5#=6uY&%V~v$84ceR4^2m~^e_1rTA^FtExiPu^JyQ55Vexf42@&dk`A?j zd7O5Mu9%StiaYAHW848G9Q0#n<%sqkA1OTJVf3|mgK3Hhf|?P0Ko10|^in0u1~Q~G2duT*eie!VD9d^&6AE@*KiZk}_C^|%g=;LrK z70yOu$e<0jBCOSe^ch_Chy<5}ZGrFU;Ygmzft`)U(#MQeHAXv=Dbq{jEE!6+J90EjOJL8o4KQ&Bl$7i*QLFsbnPOcMmd2_iFWsw}y1#QmY0BaCy3#0*# zdv_pK6y~M1g-CVY(@J=g`i&Ls?H~gF1lBy@Kpa@8)l**5)ANCvXu_d)?iIG=Mztb@ zN@;c7j_KBXw!teuT#QY+spn=CSesV=*-NQuIiM4tH8WCW?A~(MDHuAlz5R^Vp;FI7 ziGw;0LWT?4rFH?WZjz8^aiIw9%Ls7HCF(EJ_h77cNMQQ{x051=#g#JMj-%PbCfu`7 zdkiLAJFvo6GY;sss>U19qKA?}9L2FR`4YOYn~Mb;I!TK}&Z8Ybx2|)JxcP!N^!)H{ zV-%th!zu(T%9J_N@YHv}h}4>dijr!O0S(~t7?47PsYV>MTPx;%2+oP1_?-|#SJ$u; z#@B*la;FC%boTHH-Jw}0`>OCFq5S4Mu;oszZpB9`>R5HI>Z7w<(y@dBG&-+9WG;F? z2PtsmohFlcYoAP`+E{-TNuvw6E-I@m7#UqddJ_PjGU1o^Qv1Ju(mR5Zrlv`8&U=+# zz!(o~w@{`6-AMcyWp~gblPtfdEzyMjhgoO?vDI!@0|zV=;AyD;yc+d6-mRdssUPrc zKEm_VA+nK8*?O%1OKYqm*uLNt?DM>i3ClYiTS5NVEWJWSx_<6q^K+et%6>$)*X;({ zi`Fu}LatZ#zbrjr@DWqtrWwpm3D$j8qC4CB^ z*sVb6p&AflKx+)4I3@k|!S^U%tJ8a|d6wE;0!&>ZGpv!mG#eQW?ZS>&o9kWIM6VmA zeFJ38wrb~QMK&{?Wk5Pc^VLjI7z6$Iz-=@=mg}vx)R6eKa>$+M&@1&@$Sb{4WR2#> z;)$aUWw$ekZzWS6Lr%n>ayuAD3nj2|%@&vIc&zza&yojwi3v^ZdY5o8#5N`CmWmg@ za=$rB#=>IiqF<{Ni`#}ycurR?S=_O;OT-xP|P>vq4^9d_yYpRqbHKpam=8aDB zIsfi+@t4d@1kds#Yytyj7jz33GHXt2UPG7iu_z`H`zYE) zQXXSZUAwGPy0x2_2y9ndnW?Rw6W>P-qI~eIdSC{dMmD$L)~~ZvRs+z~w*zQ;US2)e zMh4uF6zMUSX4+&R${uu`z7k{w+-^LoEJJ%z45~@L%harV7I)qi@vQ|>ZI|B@*SZ=f zDJVpj%9;Fk`RY#fI)ltNGz{eYH}(XY(67z7yWkZM9oQ}}o5+1rU3ofg*=^47uv+>{ z@1QHAvrv3W+(ZUF7vw4MjbI#l7%3~zK{Pfn6;vn>qt?!v7<9%3eGD!H1IkS=+MA(u zXBmz*PxB1TFMlZzB$2^rxXj=LUju9?IN;=;V6dy-^Hm8k9SziyefftBu++w<1j;$;WnDALzy$c_ft7OjkyD*l&7tFGXI-N7{J&>4@ z#rO`?{n|={qZWK`_6m4R-%0Fd%({aM@@-3c4uw^cz?#ozFX;$PBc|8W14TVRP0rCW zDaW;oeER4gu>zegWEbrF2g|p>CevZFS81qgV<_+}MVPg3_wGX26;UFf+u5vI@sXgO zPNgjzPpXURG~ggEeqzWXt^re`eVu@3%{W!U4$g))!|CM*l>x1V3e9tlu|F> zBz?HIf&c)paJU>vB{_gw-vIV6rX{2kD7uj03_nbg_?O~Xsy80!l)i7mHW}gmQ&@m{W$_d^6f zjm;bp$bo@?Oha#~RDwZL?I3sKm3XuiffA_mKIX3Vcm7Hsu703-_>w2EF!M*h_0q2#%79h0t;VxgDU{2F1 z6n8@|sY=u0`X+Jx@^X|QeLa%eu!186Lqj7F`&zM#hKHA4=ww6v+E)J>PjmTYi&EX& z*{`3etz~-0pP8;pmHh|t9aY{|HSE6RM7+H=3XWh~f|f=UrXTHDRAGqR6CMphz9oCi;L5BjH|DnUtUa#iSpiLPN&ZIA zdyb@(Rdjzt(NlTZ-u^B=Wl^38;FPMr3xp;+p8Ezu>UqCrfjP##7!P)gPhV0|3J#SP zo~<}OeKT>z@H2baS!314@K`o`j@KnB7wNwT^fuwL(F;6WVq4J_@8U5R4ex-emrtX$ zdjEQBln<}Krf;9jv*-P$3tw?XIq2bbuhbWZd!P%W%%CT1sNaO#l@okDiM`-Zt*%Zqq)dEPW9O=T@lLw=<-$F{a7C&E1>E>1yqBv2`ZlQ@f zKpuae_bpX>)RE%3!x+7t=Kv_5qu}-N0|Lca}dOZE5UDI|Nind5h`c2FRXB;AzFzlwo?;f;okT?9Pw z%tGcHK`~r{f~4AQ4wC2jcD-YP^OPl%6Fl&gW@1L$AQf|hbeRnS^cVrQjb*-*YQzID z0W_kr`Wz?X*_TAYf1bwq^y|^=5wpY9JNIyc#Z4 z<V46#67xTDo`x zZ?NA&6+Xa6$d^TH7;?q8x-VO?Ra0S?m z>_x@0@0y_s+w(4>tE;(O>gL9g`oa9{h`aeqlB-t0V+wdR^_$avX3sF`UX?ogsK>L| zC@gLoS*K#94OJH!52)laq8sAi;e=IM%mygcpWeVw#W2y)I99UJeC{I7lXzTVa*7IQ zt9LUi&X>&@a!iZC#?GetvI{5CC!Dtsyym;!VQi^qvI+IT3b9qn~zl0;tSx&CH{zd=Vl+OHD*8u zd}w+GL$9k*+ha>idGDh<{t^hfmdPCCtt$r*+|3Pyq5vD^_x9j$sKA_rUB^Ag9eghv zBR*$%S(@YCCAjJGWsLEsViw%i6Wlj;mqeRbbH+ zWP*bnx@XBjx}Wm_g7E&*PY^xhl73Z4=8883Q|R7IWpYO_cRTQ&m8u&bG6+Ptbg&nM zrpIRrmz(*GyxbnalO-CG#}T+Ds6q>HD5as;BMV4Ut8)DBQIKQF?l@&b7}|p{Uugv7 z*a>WKxucO$y$s$|j>y|8Rd5RGu_ttfm*jc5_c!G);KkwUZ)!Z78lt2zY=6(bN zA0&O#O)V9i;(jmQ^l$c?2IE=42R@6e8&z|Bo<9+fG*;Xfj1?Z-v|XONrm&42k2By< zjL*@pW*&8KqPhvca|J{&lF37|^aZ^@tiaiOAm;e)uPlqXr61Uy=e}-sqk5 z{ESN^+5xmNSsN-hrDMSz`bV6qdK2I- z0otsqEq-yTa87BeTqCeszr*&PJJvtvo6zXBb4?I9NTHFR&6`M<2@bOx)%lX-h`y%q-#6Zh5FK7kD-U zTm-Hd?aq_wCI5hStz2*zM+!ORv>S*DwJ=Zlg(i;sfcgJf3{Ix_LdV$7Bp_tY->`c{ z!tmV8{yeahX!H>wK3zzaLb(X;i-n9nwk76s{Jav-zNThp=UJ=w%9IAyizvRGoWx5c z@ElKZa0jzEKr-v~n$CIJcC-9jt@nXlOI+>`>lBbe(FsyBp1C$HBVZUL@w+xf9`WZs zv_ApmE3eWsSFiMCgICsKfEV@8?Pkm zs>YRRO0$y%{rA39g)S0j%{b1}>7550X;##LW1N6hcjZaEr=8jt4#Ab~UvC|u#`lr;^9cZ+55ql-gO)B7;z6%-OZ?DlSt|4V&vLkvpAuB@}7nkS0C{4z5^z^kIjA$GLaK_ z;R~d6>j7ji*@fd@5G6qTc!0n?f_q>&$Njgc$}Pngin~4RYh&M75t-)ieMLH&lD7Ex z2#)D2{?ZQPEAW?Fup4O=F=MdCx&R6-3*zcFDNcl z6VBZT=Mc#3&ypJsyZPL^)7qa27Js98o9i3#*j+^xDV`m1o7~rsjfUoiXbB9k=G=xV z2gRK&{Uurm_HzBpL<^wF+A4O?X}_}Ng6JBnP1p)8VY5drAd_CpT@rmh<@;9j-?(e4 z_gdc0pJ~M;Z&}&KWRa`Kgi1){2NI&(V}#!pA{DUQR}I zebKz#A8bwC)W$aPoxsnq^cm0@?lFCHsm1hzLT0@5#t(Q!RlRBV(Ef`VIDjValG!B* zOU}*4t=B}cGD>U^v@*TEB?hB5F{c-g-k}Sg@4W&W(48%6nOFi@nM=!WVCGjff@qd4 zMZbRNt9)?KQY5W5TTsem@a8xhC5q}$Hdl@^=dE!y-@CHNN1W^wqg?LCeEmIQn{SJ#8l#_Cr!M2C|Wd#E!;F2K#EZG*-^u1l&n_=L`X`G#JudPA_5K- z_qB?|h{l*yoBNYjZVTPXC?bgpn6KrJ56k3a&op5Gm4dPz#PHX@JGAy?wXQKXRFOp= ztnD{HjZkPcQ<#n>uuECS()zP)FQ1FzGA>RF*{5*M!4xOTByNIi@0d`GCH97byw4}6 zn1#$B#xcFWDJCzqjeHumB0bCR5mqo9gQ)_Q-tdFMmm`({=(+x*CK*iAu>!y1g;&NE z1*tiGH*>a)vQ>5ioyg^!nx6dqbof>Q`k{e}C`?TGl33%Jy68Dg3A9hp~(A-jU%Vyc^ONtmXLVuYX<|C6Usf!7PkoGI(_Nzv68HqQW zTLg@Ar)w*2HWjMCjSO=kH3Abn2vqvD_vF(gES(<7qde(Tf~a|3roD< zA!@_22M7DPlvXUq=n=OTBOVcVXBrIMmLMQMUf)n%LP=)VZ!`7K>J36BWjxoN}QsZO_r> z$)^w-xc0H~!eV_OwYwli5C7FWTz-Hexr=SA5va`W6h(bVsh3__*s$LKvlnNfJ`dV? zU29>WpVA_!ka}7P;;Y4DLwk0%m7I{s zG)t0;qukUz@M4I??z%T9G8rWwseehI*j^e@^V#h&8*EG=#0xJkKv3VD2ZFx1;8-qT ztQw7=Ik~@M7QgG?>2?g#i@8lv@30U)ap^M2)TaaR;#(4XVk5w!)XpFWjZS^1(CEvr zhP&Fu)CY>$k1_e^#-n*bn0>6C>V9#Gxuj$+AANkmkHC4iLwIcp$XzN4)Hc>B>LKE^ znBrz}5JD0+s)SX=+p@uIZGOiK^-&Fa^`aB|sPt?}We1#MXlC{Zsg{3oZE%lWR#(cb zH_ZVSp&tRuvHLviLC6tzsf4-e0!IS_Vxx~6g-9983a1?5RIa9CWrL0O|6=kV9&wco zU8qQ9Sepwcc&wZeY*QSLzY_?Aw`1^z1~(bsm=>EFdiq^LukFhd|16$8Fo>--eJ%TtbNM#3%t{quqXKxY2 z;sYsDevCZgOc$juv=0y7JJ%ECKz^O0;=KjOHfY%9;tI=YKrt@feJ3S2zuM zyhuBfjWN{^NaqbG-XTGGaGvA%zo}k7nuMX1X*Sq-Cz+O=bSJ?ytn^OvMZ&SjU#_~K z4~sAwv9u`k{frZX$`jZ1YQyW6e(E%`(c(ZR)F>C@W& zmSig(&Qi{k!ya`h8)j1?a40;>wV-}_gSucxwdj*-n~OyEXHbuOpPMYpEsj;1y=f!^ zZ)^@owRVw6nOJ9IC{~#-?8-IBCsQ+FxrDPG^lEXL_*wi zv9~S9Lz!elC^iz(Fl?ZFomcAbrPQ@wG56l}Q;NQlOj9>Y3GY+ZzkG|T7mUF57Nz3W z2&mL^Gq2H+TKy%f0gDGs{ zrfbrDE>o>|oyxmBZFXg&*x!xbscn7MZB2Bv!YDrMfrX`sq>16!5ozx&70#JH(E#g^ zDKDCLdcBKYgm=!q=D>CuH+0@#P;4SADZP?ljO0bG2Zoz>XMP1P)b}usA}lDCwz91K zlI8$^&0{#}HTTtVfewq1hw$9U@!T+4QseSWjxC|{MGd~P~S*fQ_rM=Az3$w zr@(Kezm~yBs+NY@KY8DF3M7yn3aBE7zxYn=jR?gUz#f8seD}xL5w+h4vk2DhHBb{@ zw%Db#{}0E`TB{+6hdy>8J&Ff$rKKD<)k>`_{>_3Sh-v6Kc!%NMgwk8_8bvef?B#+5 z-!Dth+F1#I*wHmEsD> zI0WW6E$oEL;$`2`G&J$%_G-T`O}1XHcSFt|TA*ki?v1KvrtER3X^uxmSNM~1T)<|A z*^m_NC#j%!UrXh?--*e@j=)XKA=-Y2$Mvv8X5yw!mg~6QR4@3N00KNq;`UyZvs>qJ zr@43Wb6Ctv7-9&CGK6uw*+Tg$m}GD`$*+Q}hpVC^C~h&^ZU65U^*gE;CQ)Rql6l%^ zU7-%hW5D%ispxJpn@t9n&nPS|ls8B4SLh{ME;0c*prw0Kk{1srWHx)axkpN}@Oka2 zC|f}>M3^0fDit|g9;y57=YYZV#MSDGaIs75SXdP3F@=}zhNM1EJwpQKQEPKfTgZs z=r7w`Jx!K72%1Kr?aZ6XbV1(!MJ;@^%+kv$jM=$XZ@6tvk2AyBE^TH1^-j)@eg)M; z1IIZl$4Z1~F=OT!YxF@~hS*Lw30@hvTq7UGWqd(oyc+S#N?n@tJQ}IO@H;XYj3bQ@D{Ia0#y z8X1Jx_yoi}+Wke@R89B(Rd3CL`V}3_pjJ1Rh4K#Zgf0Hy8wZS4>fI?Ep4%<(ygg40 zZfwx<@3qK^T~vLDWMI6O4w@mpO?!HJ!Ni2hV#O@C z#g!&uWfSIDHBakAC|e>o<BE+5yEUZ7I(sLR)9a>h~ZV`YTB}tSXWEzVH>CBKn5Q z{ispMJjL_J5`$|#qY{bmm6vCo@6n-x)vAu-yJ>bu=x!KxwHGeKc_~SDypSo_%D=_p zJ4Vt!!I&Mq@kgmjo|zzoeBvFLN74!uXO71dsD!!snLk}4yNrAS;-fd7IQ7n6i1mu! z&;SKW->6{E{nsj$)1KD&NWIu^emsmnNJi3-IXWq;_W4%aQ)1`fJbDX(rzE=JYcP_B z&@T7f9MAxJ% z583gu7}(OOp@);;LL;X= z$h?RYEflHonVqp%1OVJ~849GElbYWViYroP>Hs4SfotkCs}T^UKl@VPkr!i=vTCBF37i+0j(TJX2^`rnAC-A4 z5oL*8V*qHj)ggjh!pJ3k(MNr;fIZ~P7K(?xFTVuRu57W6w{yB?4d5Mmr?b!<3@WHA zpR|Q|V!hlv{TE(y7ox#ct?Q@`%KPA5PW}!YZwTQxY_H>2gg1=YO&xlM-6SC-o_*S?*ZtXiyM`T}o`XJgH6SxFfCjoDF$)OGz z`nFlFxA2wk!$MOT5m9oqThC<^OnT&G_nu2P9pmkpbk&k{U=-r(6;Frpfr zRJxElBM`Fbz3c9IiW|UaYNm%p0`4d_W)& zDUP`=pC)^&e;=qVJ(Wf~r+L?YGfbVD(HWpuIS`dz^jv>yN*?$P=F1o_V^7J~&~#rX1W5M^-b_Tx?s z%0ag8oN~FQpOzIM4pad|*jMhOcK4(;44RdZ1hIagYVg%cFd_cG@eKG$WFy=V*v)S@ z@%91nORN&7v#1dNIbK-!IRgi$YHEltah&@@G_uBuE9&C&ftB{~co31jOFp|#xc!S_ zwGamtnNG~NZ&9VaQu*FWDi(>~3Hs*$t5+w!-jcwv$5=F<2e#FxQiQ;cpF!tw9yRptOJ20u{kRpk z{?4Z6&t55HCLEvvdcWp}7Jc7OT~_54X!dhS_TzEtPMz%(#$w1e+qx!XZt&Za&MUcK zVphh0+z0nIOWgA$hFm?;3X%;=3gamC7*A=n{KwV53h|}c&EXZw7=}^Wx5*-V<$7(O zE2X6n&@?i9q7J&TKj{dgTRBd4OJL+~GZlr61$+d^VNDtHWVpOE4@}KrQM-0i^g9=?-LP zMZ2o&$Ma^5Zr(G$ml$gGH%oNO6TCbPo0QN7pg+J@0{~@^O;HTw4y`?l#X6FEs~iFj z`%Tz9deZ$1yS1>BJL0lDpKJUA_H9O({fX@P7K%`pV?{zQD{QxNJnS6fpHr{H1dg9D z-TU=jMH?Nw9ecRMQJLux$R~kU?^N8pPHxMPoak5?=*hASb&}Lak_9tgAcGPtpb0w3 z`{QB=d1`H9hb6x0GAV0o1M|9oIE$7ecONZ7MtinjP4sD-bVYe+w!>pU^dGDe3t|x4b0A6cH8j+cb*m1Ks0%-VtmLz3G4*9%ON|?2oZt?^{F3z4GjySsho{V{*X}5T8dC^CV?)^ADs+!SwffIu4bHk zvyK(+mnh^jNb}=<-7grj4j-0g>1!U11DN5`Gz%|kv4!k}lq*@IXgc;*l>%r?D_h{i zshx(3eB6oo;6>U2NIfX)U*tqMIgH}XJDCE-hS6{VLUiPZTlSl&OtEW;IY50SUe;;> z{tZYPR?u}=)71YY&LfuU6@6{jwpP+!5=|)vKsUzTU56A~`kq@JvTnbA*edO}nof_F zVLLbRKVFva5FWm~$R{amAu;$mJb@Y$zfwFX0qJ4&14pnqjOy54(Vo505cLbtP|!~S zRO*D)Zo`NB(_7V#_~ydMuaJx^VH};TTR6a#-=DVb4X~6yq*K*Mcv1v$YGzbPUh+GQ ziZTgyh>=c?*bQR=oLbycNV7D3o&nsyX@xu8c5INB6Q%lmDnQB%9K|sm7UOHBThDkS z@hC7zu8zbJVe@Wu@>;&Ejv5A@E85T-0B6MZN)J97c?FZwwJyw%mFarwaQ zmO1kh_^ZBjcpq?iqQrDmo>k>xPx>EJV`jU7u_=o-Y8*EVo${qc5ZjgIZJGW?6*gp$ zQuUoxaWg6i;NF%8&LPhc(_T%*>T%oS5a?CX8lrx{#r<`@>FxbS+fM93`@7-|7>a5X zJZ1L-F#62w&7zhPe6{Kh)5jVfQNy8ifR((cejUw$U^ucD-$SsD(z5~%(Fpt$+P*xh z!?3!Id(tl*%C|N4-m<<}4tBzDe{7uhs4+xV8`W&b@YyCvmkX1ee}A{3 z?~y=9?ajWlH}b83;0kqttbegBJ&ha&hmy0r(;Ms8?a$z&}`9Pfr>+I z!$^JJ8^03$BIB{Im}(_H8DZ4MO(1R~l;FBUlQ!t6N06+73?)$hn2k+6&s_S0xe3J! z+F9tnv~wLRJIn5DCpC4KCxgyk3HB;1$@Zz~L{+Hbqb{^sXZ}JCs{4yi(>bfnT8P0i zSJ)bEo4?7(Ql&n6j_TT@Y0O zI82PGz9Tvi`k<09Y#|wJjY~{;Qsm2n%9_bPBAt+~U<B~{xT z9)?S$;7h~}8k(qBHt*^%Eq%yTkfiZOb8wrEckauJ{LGqy)RLplcEbes zX`-(dZ_H$%Z5W==h$+KzFsVtp*K1xW9Y3|#`x;Y{Fw7JhHp&7}2gf__92NonDY<*e z-lc_PZxrg{yvJQ4mJv=G`rSheCuXA|_w4z=^0Jt%dp#q_d+T>1L%wF9FlIlF8M9QzOuda|Tx=e=g`xRnBcxgp=Q5El z`?n^2;rSKcB$f6rlF z6GR$i+dOgr!1vhdqKVaVe|{b*H-62r6K;#-MvW-fgWA474VIoROqXK?v{O`mVPtTY!5dk{wGv>4jpH`WA_=Gq{=5{NR;=gz9*ymO?KNCd+b(7(uTc?N&) zEJCj`?{o#M-fXkW0s(ta(4RMM69KyOQ}G3gt=5t| zWwvJ#le^L5y4<~4F>!k|F`bToA_s&L+Z$sPLgnjM2s(^&i)GP%zRwS`PJ_8sxYyWL zV_Je!w$2@`8hD)zHY_+(zk_k(ln4BSmm&{|Z@YO}y8`m^U{y9FgDQd6@17}(j>q7~ z^5*dWDo~yNWdEf5$ECq!DOnR*s&^gFC8#oh;zR-JUD9#rq#}RGf;7Nds`lxsO=DJV z+A;YaNuX+QLEOcOt_JhdCAd3Q5Mur?g4}sj)w&4-l@S!ya61QiV9%rW5`cl5PD!>R$`ncGL@7!=At<7rk9LR_V66t*vlE-n*gYFa}1nU zzDQ}HVpZ3}e5A>10@j);q&Ybr_BHr`cq^`AW+njZhf+PVhAL-Xcz2DCL9-=RPd`n$ zG6B^L?%0&rc}KA|P9wltWUv0E1Aw&52;F>q#*YVGOh2HHS9ahNs*=52M9cqYzV|er zC}{o(t)!i3Zts1@=n~#a(qE8bAllzh=i~~xC{=Z;XWsx~a)UqfN+ox(BS!DceTKct zp^*!z@kMN*Cb4&-8AIUGo$ueCv+2LylfcS%Xjl_+LXBfe4RX*298IcX^+aCu+O4=u zL9#@#kaDqjKi7tf<96$}(Wn}Fi60$tDa7bGH2l!aMCF^5_oqsEFUlaI1lOE^hF0#* zGP<5Y*fYFO87DKU?XC-TLA*L^pSWpBZ9amA>QC$s=*w6)T+h5|bqAq}bXwHM4wgoM zis~c&3#373zjALmIM45%Dli-kEAPh01`FrxM8%qrQ^!sR`Weik1 z)6|R%`n8Ur{WOB*0ug2t$Cq}BU~M(cFV`BUao3%CchXDHvBqa83_vJ71-}y%nWO)AsRIUIFk~xn8e9$`ZUlY0) z19fregKGGaS*Qsxw%IS;6tQMp@S%$8mM1)uZ88Dld~j~tX1rZf&213twYi|LPqC12P?XMXl*-zKNjEPl$V^HHLP0rL!RkW5WxPqVsjnvrG-3<*)=Zp@o>?OlqhQ_0%Mu_fY} zd~(?Ep>oqw&uOQUF;U)p9;Gg3Gw9>6C2&oMqn(>a3&*BvWmP)QsmXkN5oiQ?&c9bG zKa95aBH^EvO1#wNRk!@-3buHC82s#cedu;{L}DD`8Rq8zOIR1?b2tX@gu#3$V(BZ! ziYd}sT5vHtp$?R$*dD|8X`502(B{7arX#p{g& zUBL}v!6_>p66P#G^*f8_0kY}ciLl<7gMvdb@a&x?uUIW)-%;jU*gbTtpRX?}mf$-M zXz|@+lUJti(3^E8KgOtpd138;;|VmjNe5g_70Q!JO?Dv*-X zK(oi@VTSaf4^Rtdu}?RkS0iYvO1Y+_sDC`JjvG9;Wo^M$r8aye!3dh0l+*gV2CjnS zTo%Z)_8cnODgK|;!-;_Q^l2Da*;SC#(`#fUT;hHDa^RohFes3uhf@t;>_l5#@tok1 zP%$wa-vGClz8i`HLYask8HRL!#;VFWM592|l1Fmg;E-0f0}Cr%#n+P?6n5|TQMcPz z#rb2U`ffjbxQFg)4GN-f?|N{S6KnK|15EGBgNB=alQhFJZ1W@g$g(ryoE}}R{rN%{jL^=++f%@SSFhCZ^$yk7PeAj3VAA>hi1VISJ4Z&Br-2KR4Gfe5 z82%e7iUAQeq<_7b9!@O~y6JP7<#Di%{F<~US^OZu`w8pTqOfqd1*4~at|T(YMVC9z zXD$jRKS;&GJu^U+MZ>pvyC#g3@*P6{E}|a(D4zN-MUK8Jut(|=k=~@xA4WPPR4c@k zW}tue#LfQUOe0;8LdRN_mL1Za1f@|v`g(tk;X9+gt%-3&T+ty8$!3TzLdnkmR-<)~POr9PVhULu_7s{o zy&K8HES~U-2<`rwB&dfk=u$sSZFT-@w^#S*WP$B)HhZAw#3snn$cx}z>hxBM^{tLV&^>6%@Ajpq@obd* zbY-<=WY66)ooN0ltf+WKqkl*`SCCD+RE8cntJp4l{%#BmNc%0;eMuW}V9<|Br2(^F zoem1)3e;uNf~Xap;!oLRehoQ8Do^?~agS^r6yz?WwYnYkHkOo>7VH!uk=MVzeou(_ z+Ktx3p~j@)%%--Ye^Kk&ub0=GX!lNb3B>T8?p#{gx_-`K1^&SAS`47vcXuZXC1}~# zSj(p%vs2vTi4JYw?BEwVg=SRO=^rJWDXhei|0r;0^HZDC$I{2HTZPjp z-@alrTVT%A-ccEeMMMKj4~Jazoa?s#m*v-M50VhqPG|vT@T9 z%12P}Y6ccICDUqzadSy_LK{m|?h-tbs z@~)eBmTXAhQ_?^dFPt3Y=YFq|!tR=9^`jD9W8010XC?}};h(Y&DrZ3kmmu(8!oG-G z9Q*}?YI32?_D|Nhsk!EDWzMPu`vkEl#!hF}IO9^wD-0Ww|0u7-w9FV7O}Nyiw`xtE zAVj4T2p5UiEzGLfO7yZVJdF~ zJ-WwpL&PZ)Q3p_%wq>=5r=~u1C6A$zJPlia*^B)Ze!^d$6OuB7$xYoq=6X5Hyrk z+OIBthKw&PN6~NpIO^m&5#)P`IAGD4eZQcRLsboX()10#b^89o*rB@#sRlpWA1B&Z zS=P?o4%jLPE?rkJkSgi{q+3ApR~@2Fs&W+I7knXcj>-ah78!b#Qpe&F`gYlBhpTr}L)z38ghFtT}931CEQ9hK=Me zp5gmFxb&b^5ktau3R*n6y4YEg#{VNjV<68)4$7CB*S3et3zHfeap9!Z?NK>NBz5ks z&@3&6r{5Sv%AlB2yUXyrz@jDCK<05rIs}5L%i8E-cWh30ZtP3ra5u<6s}PJl?_HHJ zEt2N6p_?sQ%LLjzy>f;jDjMz9r`fU%oqPkV-j{o@zX&Jdkn6NS*dn2*bJ8_e@+>;m z`%)U!V8WL*a6-E{gw@|IJBTi)Z{rv{PzAgGkL}f{*`0&auQuzNjwjdZ9;z$7P4ZFe~Ik#eyg+)$h)$?kYa9j^hCu7jX%eS-wVk z%;4M-<;(^MEE`2QEm%~|UL~{B^SORy6gimiD3>;Wq=p8;cA3bU`9bSv01Y97QyUjT64z+ zkln`{^asr3wTe7Y+g$4JMTF)A5e*ZQ$%}f}ghC!=+fyZ5$yQ=(2@}o&msR`Er!Ai4 zS_#Q^=qo_Z4G<@ej(z!E*%&b>jGCr`2uETZob=fJ;@4(MBxgEkAZt~0mAM)WO*`df zl5u^x#Ymw|VP~?p+D_@Os|OE*Z2cm73Z6~sQ*!STVa>{XUN$a#qnJ>J#%U$c+8t6j zIVC-h7M6DGO~Jrh^a6YcyI9k1MrvkIBuSF>-TrCIm3ZN!>RVr8o^98T+h-!|=6sZa z9Ep%Th96uE2&_gJGG=kv#6?6$s-~a(zUP_KHRDwJ8vwW*7DPIY48U*ZM#B1!xs@SL#iKOc_`h1RlHT=3)2st9t&s^M)3hbZhbx9eB z7aV-}`#SBBN14&^h-OC!<@<4LiBl7YNsS8bcwUc3cv%>vTh5%H(o~^G#CN5EYBma5 zl)`!t;&awjB@`#7W9=*#f707G%1-g5v2dAk81j@xbbxN{_LaiMAz+s6!KiSX~l2aNIz~=pw zkIU)QOn)dnLXQ&bT6X(Mx)Klv7njC<VoqE1A74F*js2As$GHE%dX1+SJz**0ZN z2(@w_j|d8)y;uBD;XcEbr$T|A6w&IxU&yC&3;nC*u2}E8m^Ms_RtF5`%AiG5MvP(j zBZDNjwO-Ke+Tajc6?trjpDo77AxNZ|W(&Wt)~6cmNP2GebHmX*+dyXp7WE;KJWrfu zO0L+}06sW)QaSXGwZG&ntrjzv-Zxg~I=0g|Z@Q(zWj&&M`?8h1hS>3ycMP3EIKzHI zF_J+EXN|@LZmpbhyNfCS4_HqK26A(q7NSe}I;%pUJfPtx0Av9Sh#Iuzop|>D6ro{3 zR&)@fU3?2mul70%Zlh4ktr;py`bam65=Y>n#UU6f79|Sl|KJPkCPD%`2UxZ%xiI9k z!$5G_z7jq}wKP4h@-@o8&b@p7JBMhLoG`RMKa(N?6KCuUn--=_2c7IA8Z*dfPs-|U zr_3;7p-}k|oy)^!v*83?5&Q;5+3kTy!QWto@X*jjeV`(*@FNj_hXyaiyLuy3JC;mO zFXAUH1*73mRKi?Y>!7vSDoZx(+q5~ZrH!#%wesUam}$^9O$r*rVO+exijry4V^s8e z{s9RJ#& zHlvOry{3A={t{+&lM6`hMR$!HCBbfw8<2PkwrDpXquo54H*a~@e7?=IrXiP*zi?_H zAJZZ#S*)|!U%SH-uVG(LIj*;J=?(997fMApRGgzEMO+19KXfKA}F@~GD?LRAxa zBTJEC33S5Y9OdMepeDc>ZMI89f`^u&%5y^5EG{KFF{7v!U}*t?3u(kFy|!zV#*a(1 zWb^x+dLm_6ns<2APkr0O%@#ls_2V?1!{;#O1JeqR2!Oquva-!XcFelch4W-+GKHaZ!8~zDm?hWEeZD z(qEdpihJ5qeX+q%%eLnITu!HY*aei|Ns%GWL$D5+^pdPW4#>H=PAUnlJc^(Jgzvf- z?Hmf@neO}5;ep#0=9w#`^nS>E?OT%U#1>$lYA}eP9XZ|f3#H|2R#z`fE&+6>{+psi zAel}4X?~w-u!Ryx@%rvbc_D{)qqWbylIQDQ3VFu9(oW9Z6jgSr9<29!bAmupWA*^6 zL|~XY!3>GlCjCCc-}XKg;SfnPMe6Vj7DZ5_>68>zP&7aUN*^57YU!xzkKUC&QW<6hRB0 z)X!0XkT1Qg%Qzko7 zPyE5xcNmTv1p{+>Nw+9oCaPecGThyW|_W8tRf-z6K!Ir5d^LI38V6nPp(R zRPJEOVy@URfTp{e06lItiBZs6_ufLG+cRLwAQ`V-r5#+4?MH zS>|H1W@E6==q#T_{H%@NyN2C*wG--Vl*e z@(zEA?eMq?$BcYyY_AYrnPRWwOTxQP_)*AncX(oU0aYSIAtg79uH2?z!tMp@0p?cz8WnsiZvkcAxZv>{oXfu629sMC_Af2dg(#vgCD2IR8`r zy1IJwJ)lrL_$D4LSQ-s$(XprF_}?J<%YN$rCb$-ivx)CpM|?2qhzamZw6xk+3r5mi zQZ&kOTUg}mXvh4dqw;2Ah05bOY4{y8;cTeuy?oW&ZV9qbYv1|XeG6>Hd4LJyK*cY~ zQ^c(ZKcbanwC+VyWw+)S+fJiLtG{R8L|XTh98x@v{fJyM?~%e`9)=Sx=tg9W+CE~r zbXvhInI~`$OkE>UV(lFoIp3YP6k_oH(xF-`=-j6OmeUSVv_Anm}-EJ+Vl+AQeD-|M7Oj@DB5Yqx~_QD==ntr>h%q z!kJBXdO1F(bVF5@f%&@z<^Ky}uBeJ3^(C~&7(-W%O^adC!6@QgSG&2^Xnj~`0dfw# z&Al3CvN!HiF9HG$J@*8V&8DW7BSEIW1iYUBAOHl;B93sE&HR@DGI03{hS;7Z3(4@* zYd({24mg$M+IsAO%!%n|(1#mXvz-76cIdTlCqnh;me%6HiU-&%bODvIt0YsA@_;nc zmm#QZFdMo&_yUv?FReX^s89s*?9d=TVq6WeL{)h1iL3IOR?M;RljDudE#=u|J3xQ1 zQUGnpc{2FxLk0hWVSNwHZH-b$6CqBi1y*b?xiqMxEJPG#W9M2!q^O&a&F6I^Nk@>S zFE1rCg}xJMdLZ+OjC2BE&EpH%6rkXEa*@PH z<BD^CGs+M&9B9-#IOBA^nU$HX9}=QAmS_Epr-YzA6S0+V{rko+FIW0>Mp0ssx@5) zJ`y0|NPxu%!E~2a3!18R(LkPFDF+8$z=fi`R#Ik>M!4WME6i-NqpfU;LY!#5p1FED z$&_F5kJ3$QX=5FGAf3cF050z@=jX(vqz0Ex()m3nnjme518WwG%iA$G=Ay;CN1~!o%xkZ`X9i1g4EpHFqXddwc z6qyjAl>!Px5tKs(Ay)Oxofya8L|qzZ+-=_EvE%5D74)o6)cmyVB zfiS)cpu^gwVc^@1d@Il7@N`H6w2=Y3*@VXYUWd{z&8-DnwKY?E(bKE51+zE4ZG-Yi z2@RdYql&r3%LJZ*2^$!H=knW?-SMvhV^dwva2r%-cZ{os(N54;vJnt3rVhrip@}wX=nws&zsoJC41SR|1@^n3Bo~2sKTMU>01tcmO zDIpCJOw}Dqi6Zwfe@WFMEw8s!((GHircr~GP;(kftb(RvUMvWmDy6In|8Y!tQNXCj zJmI`Xiy~aPj+!ttq*>um|K0}Y5;mUXxDObzjEbio1NT?V*LYl|sqly#vN&X5Dv7&B zo#>&QNiy!0VSca26L_hzEgPXAgx^WS%*E7`3E5iX`eORnq%}5~l_b+W4+NV!u2-Yc zxXJvJ)I5EfM*4*r7hFC3BA=t}Z@(e};FPJ9^(xv8VIni1$I>(cCoS=6h3r%uPKjxe zo8=67Z90PtKQuqe!huhOO^&j+L#}4@Wtq@{ys~#lP?1%!P$825Eno+ zUZU67RK1-i-C5K!nd$%EgSu6&eAVN=()_{<>2cM!u*ib3);m}h>U*EFt~)Y=sd zSRfa*5fzOLi{GmqaGEVs`@f0L`HU^c{v?fYBY^A%>rj7QPEXJ+XCX3KP}8qLnzkXn z5;_DmYXz%xk_GTrU!K^1jrb$nG-|aEN2>Mk8*mp$^Qk$7m#qs_OIZUIfyUQU^cbLe zEdqQxb+k-=l9*dzuRH8?kG&{br;|Ggi`#lUZ&H*kdo$b(*c(+i7aiZoz*fN4E14XB zs#Ng&XQrU7VQedY_Z;_L1S_jQQiNkZg)EDrNe%Idhp{vQq8g<}D045iS)R9+xYlt5 z$DwCCb|HDov6?p&k|*L3-J!Q1H1&GyT%z64+{rzg-6vLX*+JduMrze|+@01#L9xH&q1dEA!k_E-RZ;c}YYJwFx* z_M;sLR?u6Ii*e2n`bYYJ`s?nY?=2VyhXL()WkA)+5Kw?D(|UUXI834Rlv7Ytp+*M` z5?@MCnys@}Fl@q8_&(2}B|Qg>QD)@wI}+|HnuB)5**V2&JFpd z=og!QXBU-Lf*HyMV9tzO4j06w--bhi3%5@qIewmf1+LX&#XWxW2YPmjZ%e@2;T*+z zpcD}ZmR07EKHX&q?X^5#X6lA=59qvP6;|_+kV}hrj}}1l#{XJ{PV!iH-3x}XuqR3f z3_I*g{z<`rSq?@W(U~_>1_4%tpi1E@PJpq2PD}Jt@)Y1l{N+T(RXd&eHZfZq(#iNz zYi>A8jlPAyp2!G%aL@KZs!8a{VeWJ(e!|pglIxw3$rhg7ShUxNQ6^B zhX&?>wO<>C!&M0V&|e$Ei0@?wkZn*ERfwa63S(tm?^m|=*r>O5U7cRX>on?{T36@_gZ@NnrpHS zI&c61vUOR}8e7_5Ut7Ewvc=V+DQ1|@mx29s5iThG zw#YKnBS0Wg%B2V!T-kgEKWtPsj3-R8Mi5yXqIj9dJ-`aaR!JcPSe{+h@`&hNpn)D? zHs{=0saI0_ZP@Pc0VmLYhe#&~>Z?L6hm$KMrS$;!F4~(p(swjXHH=KJyd*Z<* z8#N5k6ACOZm$?p|B;H{oe90uC6*N=`Q$$@OE$E|y6MNU*;%1A=_>TOj;@)kMp5Raj zS^WK+N{U?P^lVZ?LI{IJBXTFSl({%9!O>t8_-PZ9DT+TYFf)PMT$~rIR5}pt+`XHa zz!h?hc~)EB{az!Zqae6JYHuz9`%sf?BwrgkOJwJypC(?M3&H6`?v1PvKjZz6Mf<2E zY4YE{W#Y<#)-{;pZjL>@ScjBwWN40M12o(lAhQZsdo7fFzbY+g@q zDDzP+0R!vlua@+MyEeryq!e59Mp!_YXRb}hCM{S*TyF1GW3kg#s>ZQGEFNn` z*M#?SnJzO!xaH}gxIBBV^Q*3{98Io=G4-Bxhd%q<--J%oD#YXQ=-|$pA~nfE$Xt4k z(pIs*jg#=8YTf(j{V9~gTuvc+CO>wnI9wXJmVHOueMh>ionhj4kz`^}uA1{^h410$ z_g6A#>3f{DVKqA{F3YQ%OAZ*eEoeY+9No+Bqvf=SK8tGM-sy7<{on5@o+8~Bxo{wo zwuph%y-FU~^Ya_3xn+novl*P+OuI2N%Qt|!oPE4Lg|msvnZNDOg*plGar z-IW+<5YVkI5oCx3Fm>D*rSYKkD!N;~OeF73uQ-U}bu{gK+S~z+c@GcR%rZc2-Hz>` zbn$D*90|kIqe9CThdF)oH`?h8iQ4k8Naq1o0M5i(HK%0x-k-trbA)ai`?WUC0-7)R@BU#&ORe+Z-<&Hx7Bc0CE-FxS@V?}g{6K7+(MB=f~?gn3aKqR z-<8-A-6|czgWfDgrgaS^zu9jP$~eP^u_`iiyT<*Lvoa;6Q);NIf?JedtO?h^J zC1(6-=8uEK=cJ`(VauD9F=*YY)0FnL{&eR+jo|~()t+}3_i#kBO!vDAPN3HnYD;3v z?G&)n4+>91lw6*vSkTS3A7(N00eiGk8zS_k&=x|I=G0uUe4TGqv&;Jq*Y#!@U`ct) zSYW9fklSMy^84dUD6pSLS#;V(^QDX3W1U8hr{4h)8rgb}qg+gSPhHv*khV`4VEi$s+c23pxnt%5!h;3=L)qw+sg5K?p{mO7+i%-+iJW(HfzcMr z*7z!EGuwdk+#Nzhg#Z0nDiiWc2(nT~O$aR1J0o&+5#wBK+(m;Z=->%1)vUJvYZ^sc zTfDat#BUIS2wBzlGE^A*)c+uq=wn#gc!=MSb(rmY5M+jU{>PbC@=Y`Ya{f4dw-(SpR87}P&+2*taKr1YSIV;m~N(FkgQZ>)2 z{sd*hZ~KT&v6s!N#>*2YA7!XusPAjb4FFG&46V1JhZlhc}feUpV;N?E|2($P|9Yvg#NyZU-OjR;f=sc@+v z>;^CH+QeP(0+7ALqlus7mIk*RdtNnsDKeJdj6oGkyYnS@Q} zz~IQNjN?R}QB|=A^vuXkMCWLYp0C7G^&W8%3P{>VxFm}<&w;rt*v4mW06Fq&ig-S~ z&ZUQ#(dgd({n68Nc);URQ0idXvB7L9Uw1LKtLo`rvX?VEk{$%K;HD#TrV|0zVCHN4 ze@;ZR>(zKX%KjZ9!d-RT=|Ki|-}Fe%#c3u2XS+&7hDX*)%4HrJn6AHjFF6ALM@rke z2=GDx9%%Y{*p(?Tfq=cQuJ4}qo&jqA^CF&{lb$_{SI6QZFl%bEyFZL4Y<*@?|5S( z>aiwFk0*0ao}L5O<0G41*djID^;S$zXaf?gg%TOB<@tAP@Q2 z7x)*@adQS;H7J?mtYEkwdTIbYK*GPa1XgV{*O(Nj?qE<&y;Z}!(HUL11&{6_!n@h@ z5r{QDb1Q^rVp>$gQHBTHo#)(WOjM^A)MnJbAWQ&5qR z60L2-v(H0`D}#RQzQflS-8XriSCZ1*DKdmB;T`cHO*U7t0*$g6k-BvvSRZGIyO>C? zF*yKP5QW+`*{$YMRWP6xB>gUjG#wP=3Kqu(;kj`^_Kf+M>^=Bw55IWH)c#orV+~2f zx}MJ^PNOnhkGLxVG03&nOAdphsZ8(~7bk#c{}`h&`DyE>GrPAs5)lw6`k`Zpd=-KU8Rr^x+i1qh_T-3hG^kfSlGnXhr_1`<*4Fbptkaif3D`unu<(CH>=8@=8_DY@n z101s1RDH2C1B`@B?=C7J{=_VBX;`h@ym>5b|5b^K^Ett%K=l+?cIsjx1RFON-o&JdiqZoI{FAhLZZK;)CBNu6`4!`@FGvLp?I& z+FnL;%Yn@v-BjfO8184h0cy!?7~U?QzE7mF&!!*Aj^_vUMI6q)&FRYFsEYGPnj(b0 z8p4ww(#{f$wCE0231}F)38@(QQNQXP?;rIala?e#AH%|E*M!=dT3``M_eHQ6Q0&#F zZE(`lNO3=bSuq?r6UQ5aMhV%(e`wb~SL@ot5U~5d5a79yKTDA-s z7WC;*$@dX5IIyLVj)X8oEbruj|IJGL+^LgO`Rx=0F)@V%^M0)-aiBB@$~$n=_4oBj zaDun}{-O#moFR+nH^{MFYJ)=~$5*F9Lhr|5b5zZ&OSk1=7Y21JdR?c?61GL=q4naS znChdiwa2L=RX;A0cXfi|FYLPebcb}61f(_8D#V)(7)vc|6^JFLVN8jmdEbr#QM%FO zTvW_B;jb;P+Lpix+b21?4U*C2w_Lnq!K~cR5~U!;v7VM=#XtUUyxR!T&$Q()uCbw< zT|aOOd|PZ-Q6=t?zajCyxrlTAw_oE#GeCV9q`iV}b`UWLSpT|Vl_A7vJJ2&BPCI}B zQck_0L2;4xYeRAg{^GbQf+|aF>A{%KA5c}t==uxBV$JF3967N z?&T@for4ou=PT=ZUEOxt$Tr`oe^SX;bPx@{+CbR3G z*S)e-EFBypv&(Xu5ti#ZZ5OGWpTh)wVAiHpRe`0>D0IZa)V91Z5UUYuV0BeH=wuJ0 zK1NIPOOJqi3=CcT6~wj2ZYG($PL3-UFZxL0Tkb9yu~~L>=qM!>se!1t%6z#Bv;6og z`VeBTdUZc8#IPL`n#Yt!t6GLy@h%!_`SDLAMmA2eL9L-P&gpO63MA6jYL$EuP>e>f zh#sCKbyP++TTa@2x(hh)8I}m`v&tluF_s9;u1K6<_^vQr0TZZHn*WpONR%ceDlmVLf%;1D27+6t+tny;Pw+ zI?JULeua*6Z>w5KcpFXDzGAc8_Loxoq(TVk)0LcrljDhqbaGbUl?kTVfxlMaOYMEN zz?$Ms!Lv9?TZfiK`U^#9i0J)ly$H#Ne4_8CHa?d_W-#7grfI^8v(!*DjLK*f%oxSF zF?RTA|K5vHiITt|JBgJSY4v9j{~-kpX$0>FpFT-vkSA2DYEYI1;5mk#>NeKmp1* z{DeYIMqvR7SH;jGKLWj#ZqWT_D&el6j9A?K(MehI?RqfU_||TT#6w7s(E_Wm9sHWx ze#FmdW>_?W#%mb2j{+{Yr@2{P6Qv9=N1V{dLNe}sq2{aTmh;!be-8FFCjY_HH5S%R zj@N6J`5s$cXV0utc^ZDz&8QY_ZVNcOc>mi{E{O1GE(2TPU-L(X5#<2@=X0#StJ|Yi zg;Rx%eUM-($46>oKlO83y)-m@*6d%bXyg*%6ew6vd^3{Tpivxb9#3LEq+B(PKPJy& ziGKdZ@O+|E?Am8~iZrm%yjHsJ6zXAN7sTD5-=M5 zC)P^Ore;)Ay|aJmE)mC))3Z^1VbeoWF{Mq0*(GYJtktrkW=chB#i-h+7&k>@0B_o< zt(54VkL74JNfUnjPJFQ73Y zF9nS6EKis+U^fRFoq-SIrRUQiYD~>I5lZzdtqkdxK(wjuZPL0@sBBtOxJlRdlMY_y zl;6EF-3*SowKgWGvCFhHVqtObd@6H>G7UTZeC#Udv(M?QEa`nVHej zRMlCsBA}|i22}>K;r5{8Zvo66rAVB+bKm6{9>QEjG92V=9wvQe4|(FxGo#D4_BT8< zdF`ckAZe@$t#E1S@8-)@+Uid3b(o-YQ9lNLYO_`#3X$0b!L`GMZ%OF4D&(6{x1}lN zW@S%cL|eo3Lp>Kc8SVuil-Sqn$1vf_5?5@`sy>xYLR%Qp6};%<4@92Xkr(ZA z_4i}`aoXPkj#V&4)+1h3$udv5W&lL9!!TEn8eigoH#39oEdb8)G@G?8iTTlh!6{q0 zM^g$~`QvcnR2J9GC2ebyVa=9knjdEHZ7wi=01;x*h~-9kG*hRZok@#1lz_gwq1;y2 z{S0w7ZWau_)&cseQy}e3yZ|Ke&moR`C0dggszg6MJ! zQ}Sic_c8i+5#oby8pJTHjq?+i-W<|-o}S}DyL>Rw`&B-jO3gv;`Jt z>Md*!ZB?F>vrz`Oky7@8)=UfU!xy{RovGKG`AlyIw}kmfUd5TQj6k6(-D1?Kh5*~r zd*^iVfjZ;mTfKB#E-47R`Ph4{vyO5zlL8U(@fH?D=QX6W17dB|`)atSKT9jbcvM_V zKtfpWG^&r6j)g<<=Liar5xc$SdJPJ+)Bs(##KXO)LeAdMw&&x-I=H%jYInyT%!9-T)IcnUj7hepx&hN6-rh$^0IdKlOnQ{urq%$GoE58TmqNZE+X zkCex37d>*bZEwzEBIh9cRX2NAOtTrM;HP^eUzGE?gx@xWY3q+d_Jb^WPDhGvXzY&| zL*%XsPPWOC5cHrJbeRKH6)m@-4@GE5!NBz3KR;q%elebhr(<5iav_nye|Ft}MQb&o zR=Qs-?P|5%=@boJ6%$|?6EnWSHbR#sakQj(i^qQ%%saMW3XVCaLpRSSh<=m_D?}jXYa1yiNX^)WFqhLL8Hd-j6ZO;T!=4GIBg4&ZEdN#%=XUVu^0;@kb_^A_Qo%4D~GQM0}&ln|7NL_GeP_ zct?xqWn3j%=Xo zTxizJqtbtqAR>C!fFnqe6;HW<3`Ud1)*klb{Xx2vQiR#GmEB*t#ss^Cz%g%K67 zZ1U`b37obNYT(Qr{_9p$33;tz=iC~AYwsb>YO|}ZAFOCouP-+3-Au&}m(hW$O$?C_ zM4~`-q7>zv0IPP9mwoHgkNQ+)km#%h1({fGSl&Yfw0J0MjnSJEvrzvbVS?0V`M{=1XnOOvV=gb>BG}2l-TqY*P=h5J8 z73q*-7gCWnP5X0L43?Q>FqF)A^|N~+nGtyq-##P(m;3gJN?~54LBtNG3bQ8uNzbs8 zbo+%9x-?Fmt(-^SmHA?EX}DYckU)s5!DplBQTp^@Y?J+S+^#~~t_V5g%N29TUUzUx&NY0zLZsru>-~hE=>)Hjh(Sy5WO~-1B`gXmlAn8X}pH zBRhf=`kibps1WO3u)Fhjm9y}Hsw5rYtYUU8jQm_vUUhQYqOTa8Q|2kmi)UAhxrW~A zEt$l8%`bSWx7`mvvVPC}LQ4Bx?H~C1Y#L~@yGd1RfGa5aAIgg2ce8yv6Kb`ak%%!U z_7yP@&O-2}k95fQmAQ7TmqImn@l(c|fv=&~l$?z`C>x4;Ug_dnAoH3+iz6O=<1@c| zk%@<#X0~Cc@~VEis25~4Gn`}x{5nbPpFWQqLubE;6o?A3sLE7`)WHNu(d$jPe1Q3J zyVb^~N}PX3yW83ujB8|GO$skGe{W_FpI)!|)VgdkiYWT+pbXLW)9X4H1T9u*8;J$k z@81iHQ`SYDjWon2AUPB-J%h;U=&2bDAAEV%uk3bTd_$B&bFxU0Qs50TM{K|*Fj{e0 zne<H z^dl>iZI_+whK(*?eYU(cseD_U&G3XsY-*+ZA}`s@0GX4Zh{wPwUIJ7N-Tf~m z7(1PVZhZjrU0m}50L&-{mbyrjXi$F+p~tW%e9OS#Q<5d(BNyY!*c327-d)GMRazW- zEkT0K3Wi`G0lFq8np%N^ayQLQl^{%aEPHZSScIX@O z1`(uMSW^P!U%m)9C4fCLga6KO6n=FUq55@X0#A^aEn0bmz;2OTG7Pzr#d1bMf40fC zfUOf*U~aT(+9{P^seUk2zuvdf>U)3E;t|YSkoU?jA&?C(^!0)GM@JqFYT+v7(JQXvA}V9q8b+F6A5R=k62sIe2` z7Wn7o=*rE=T)%2?8ecc8yuN-@Mq}j`$;*<>634h6qPcXwYm=JxExtRBhd{b)&@u?F zZr+l^(U#j~FdVwjGp`AQ?9%&wii7*jz_J}WQ|jPMNj4f8uiu721lGT*WgM!uLrmVk z=-2kfG%CsW=->Jy$kE`t2QdZ(q0LoIPq)J%_}6!E`3H&9qKck|Wxg|2f!0_ye`=ez zjWKJi?ni(2SRQI^DMiXT?)JocBc7EklzErMYX59;DL1{v^j3aRID=-?4DbDw$cu?wJJ|y<4^%otfLhChf@J=zCKnJLiDa^L7RBc#shWU zJUv>BlD}5r`L%=gX2&m| z8l4;o)iIc+yWg{cJDaL4Sgc%U$qzZF3YOZF9_pew&E^%>aAZ8eG=qQE!%lyV|LVN` ztsB|(deO`DqEM^N{snqikR_B?YB>?sk0nXbC8yZ7HZ2Y6uaLY4o|RxSVmk$qe6SlQ zBQPi>06L_!vac75*!UPb_3&|Y#fUpOvSf^btixj3blgju#o?=HyLla)$Sh_>^(6Bd z>_;>2%e)k?~)8tF4j` zgZ{orP9&__NysnpOV)(%%Y%-;D`@%GVY%F#_MH9%vgutoTfv5O5j6_^rH;YE>!&C2 z<3}UsrPdjEnZMwojQ*(ae&Kv4yOJe90nE;9IATrN;C?rl`Qz8E4A7z|pgya#N!<>a z?V9x_v^6d>OxR>Rn~GEI?D;=k${f^TWO#J`qzgXzH1;3r#`)&^kUsp%2!2zW;8Sjd zHU*PI3PZH}l|o9x!%f6!d7`CQ^!@!-7FT`!2T!}h*f59Wn69m>^)YhJMMu=WG0$)V z{yaO{zdL3f`5{*ck}83-q|Xh_5P2~6)D_YKS4EXBqySNt7b`FQ9CfhE(Hj(J7F-jf zRUX4_ZxYm}ReVvN;tRFqB^aKHF9p&Xsy|*361laR23A>lH5f0bqb7Y@I?Xm8Cmnm( zG*W>jC?l1Yd7jrFy|xH$&=pQ+n6xt_4^O-4|pKAh?GYo|+|W zLdtN3)~s0*Qut)?Xc8ZtVK_%okkzUf(J%pxe>&WfvRN!Co2BXE^Niq4D(bd@2gh-8p1s`za4{ z1e8m(cuamNHo`db;^sep3Tt~K7n)HyYqKC2-Px9*_8m_I5&4LxhdwD`R7C+H$Y=wU zTJ17u#u;33+d~7Urb8p)qphwQ%fa*~#`F$&&@^4cv;{iLMqBStCA_(lU-9~!Xcn!j zR9U&Yx_boySI&+Em?)UW)L^(k(+p6VgeUwX&=D)qCi)I1 zr-p{)5Lpwsz0mu<7)y;rhA(3y$TUaqUecn+wTkw-l@Ey`6yCAer+q$T!cO?KKWlbC zI$5F%{sJOYEd_b`0VU#Y9{pJcg?hcnv6geN3-W-V-q~(}5&$+b4WkK|BoZu7^0%+m z#<=-7jnx%ltrJ}fRdNGF2(r39>=|Yya?`vS|Ge>CS1*GUMdity5Ev?n1=7H&-^q!1 z1ldLK$8$$ObETVWqj%2!V^Z0PmO39FelGFTVdMmT3JKJ8np)oVK^;*S8#7wpOtYfu z$T02^dmT{6S(In)YAj1#GuRRa5)&-3$PLE-na!N--&SlRkPL{D`>B_UeKZ73GA5F4 za({Q69M1LuNPSKShk#2hyH2Qyza``nrb@2U7)T?Ptl=n2(O^-|)zK@qCMB^f?9j}g zG~39iYXPPt$nM4WDp4GaELo$%^$THr6}gD>$js$?ZWJQpr3ssD)_KrzUj|4efLU!1 zM%yAg3_0?E3Tmv}IY#;mG-Llo`Hd{dC%WM_yaP`))ZUY-wEom`W{Q3i;!Tq={ed4p zAQ6{;2Tc1=8K#xPRR;fnSPWY1`xY6UZbr);8E%&w^qJbhB(tSRVh+^IuuOOuMEF&Q|xZ!6E(gEw&w(e2Ooste(#Kx7>P zLHUN-6s~ukkWzz(4&T{XpG%hP4rZ1-&~m|Jmk#FGv>53-MPu>1tmIkK0|2kZe|^=g zNH;OtxLF`k2bP_7___5st$YIPpPV9Q*P``8sA9)kYKrDxlk?scLH8l!{*dfxbw|)z zqt!|-&M>>3`nR(#I|un4eqyDw{98TumJ52%7PWcGH~iomugP@78z>$#rtIz zQ|obH8NC33h$%*Tb{6(FN&ig)w0JXS_3P?6UrcAL)M8q@wPZ_Z1rfT3cln`f}aByH)5`XbiDWs^|(wq3AxG+MYmxlxz1q^ zrV_+0l}X8duWBH%=#AG`jo6H|=B5kcU>Rn(0Ka|!OvJT&*mf&i8aU)j-Pmn=5hgmT zKU8As5~THWx6|bLsY2Leb6W{;66a>;{!QH6b;>T52)ZrD>>fdQYv)pgM3RFf@j))v z(R4M^%C#6~GcjyLvrBtFPZZJ~mkP;m+n6j6vC4F>5%{T%ys1Jc`m(To_X4e% z(^@i4B#*Y^zUTJ@N1ow7frQ1uJEIb-!VHb@M8u1}CNFj+2k8YkRC9A~j~JRJyD9+n zw7X53HXpWv!0PG6yvTKh#qwUI187D+M>2{&I~f*4$2F!^8hD?_Ag!f_yqAGH0wjIV7JOZa^Sf3&IElO(cqGn4tat04ees`Ph*N2yQsTTY@53~nLhp+&-2Rxx z)Hq!0o6tcoyy>gspCSH<5DIOEcYB8kZP!BsHBrrtR3* zQ5v&WOIsftcIm6Eo%o=na7XIJHcN- zlL(%rzP*RZVvn(;p-1b0XERSNR6c%Fb%-d6pmR!sJS&@w^XlAz1Eo;#w4$jkoxg68 z$dr{zQ3@s~zJP}BEC6{bFxZ^PBFF@xRkaP%uXtQ#DtTX?hdwxhx#cLa5=^UV<~K9y ztu&+hhb16}<=$de2xDuCq;NiyEFp0xgL5BHUL;5%z5O!C@|3wT6_ksfZL}SZ@y)%_Y(hRdKSgSCduO z&>v=(j_Uh}f1;8x zg~Ws_MSZW5#4OQqRLn)wTlW`3wfj;@d$rHd0|(+P91Gwz94V)okwPyHSeOZA!lE~~ zT)CiF!bIy9lzeojzlu<83-!^MeAVJE?vcnUmP% zH2vt=oB$yM{HF+*z2ALzfmstx3m>yoyIHejhUeyz)^->nr~V*Y>x=%>(Z-YZUF|j+ zmzBP1C$o42@qm=c(sBS?^Uko6nBEqZvfH`gg=M-K=6?LDwYUGJUyolgf(9I{GvdD|3T_5{ z9f1JJQLge2o4r3(?}O?(79Mkk+sn+QKs?Xf+FZAc-oG^@32zLdE{H zq*yl8Og5S&^QI=r@)9`L%e5By>DV-<@nhkby1`VY9(IForM2r|4aD63yi&?kVPA@v zOkl+wb7FX_^^8asKwY_Luh<40U@ks_-b(x(s=E)dG?hl?(s(rh9w28)Ka$T2@tBBMcr3%9h4kl7^^!5$)>oVu%7!DhX@HS$i{iO#xU-xO<@$>#zJ`Ou}Ko{y+P0-1z z~G6KlTGE&ry8CX z16hzR@rA`{n)Zie9gU#j*az;uWLu^fkz>}02i2kvSX&!a-OmaigWQTrKfu!VZDDgv zEMZ5f%7cN9_q*7Gne3~D5P{>jQcJV77P@XRY76bsjD2E2dtHRAAEsOxeFcd&cT&&T z!sh~x;Twu$F3n%&UPpOl?Hb&H94r!=&&5voB$w1`9tdV%!qZrbd2C3P8n2@UHIAaH zJ&D{ca^cITL0oNW>ONvZh3q_h_S~2|!dl$G>(9=7yeB|^9DknHQrF>$3J=|OjhAoe zu^%j1vVd);^G%HuhmkeA0II>4D+CfrYGI`Oc{-D>AMPD*Ax2_s+XeK9sJ7O7F_D#i!d!-p#*M`Qe zwi~nG6HI!y0le&`Qw{qgiX$Y{pnv3bfprho5_17zMK$(<#EFBX0=3bFk~ljHMmS`*#n2>qmsNQOHgG!b}Pwq3P2T-$-j+bCA7me;4{NQ1TLz*9=3o2f%2$)WZl=c zm|b!MvHJ|q@6dc}GbZ6L@PI|k5Yelb@wzdNWi}|ac$A1dAHsi|4t3?c-2#}LIZtZK zO2i6fsN0#8zP>%n&VqTlTk_V`2WY{@8O4Se=Bnmr!~3x7qc9U$SzwVCdQPK)CO z@=h82lyU6SSp<-oSexMz(2P_cNVeK98|4&JPq0M6$3JEg?qXp%m?jBnAYq@V#CS^D9%>Uelq5^ z?JQ-7WU{JAJBJb%IS#F#jkl~iviPYkXU*c-tl3(!>G5X1KvF#0yC4zuOP)m21VN8! zxINJ}>UwjFN7yl3{TwAl45~Z}e8qbY(GxMxmYl&C>c?F|#BEIAsiPk#AkDY0N2$1i zDB&I~r-O3q&enKqH#@HX6C3!;Qx>@?vhgTPt-ypSZ*5Fx+4Bc#Rnb%%)u!E~YG~Cr z=gt=9A_FTj-RQwHg;}UZLjQ#qG;U#^JqUSs6uxp7J@+0Rl@paysi<4@K?sME_SqXY zs5eK0sy~JfoM9>%GsimsdF+L{JG~OsYG#Kxl0r(T81k3{j_yBk=9{g??=OEzlt_|$ zCJ)qsSLO|8L0q?xXFw5k8pTtE!i7Rt1W7cq?Z?zS%pxb=92`muWsjay03~TAiiP@l z6#@E}A_eef&Afg^l0gl|&d&P8Mn3Po18S36<20J~BA)qAJp7t}(iU&@3Li)6hTq)? zc;8|Ql9sM~XQAqEmZz(+^+yGPq-)Rk?AUS~DZ#*L`__Axks9{Ld0R;)k`dDglH9s5 z9&Z0k+p`g&QUv?PTqZExOr%a-c#j8aInK&IGlWfH0x!FGqL_*&OTh|QnS zC4s^gEZMIOWw%O33P^mkL`n@AfLOhmVUP%MoBIq`;Z1fvFu((SJ_qFFvVU)nya3Ro zd|t{nmQY1KCxqQM7V=ZscaX(Z1-Lzv@b+;h-AECK#0KP@6o`87S?UZECyH4kq1dbv7TRVyVOB#QPt`wReBrJ^fA1F7$?~i*|TTM z?3r*M-A>W`mh$>}Tl|=47)Thw*SG@T<^Za1ve}Yak!(%}^BA#MGR11W8O_^sz@|UO zt+^oBH4geF*XKX>8cr>wmpTEFc^DYP>S{YWD#% zMp)U;uZo^$Uz<5h?>L9iD#l1%bj+DMMCUdYpI3*>Yc>IGsK1am{#SJV0WHJMywT7d zU%LMBMzf{XgYnZd;~Jf*Cc>E%H)RSQD8V(qTa*J{y7aUpN2 zBZ3XgG+ctoXMYHlu?+A998fl}gQiQ(tF<7ftJtDE>79smW;HPzvDkSP_E&{%^|ar}@(Nx+fA3hLfb&6Y zuQ3f4A?v`R=QZ_(Qx+6KB7+%j21tC^`2^u)mknHa>1Ag9>Nx3PJ!4F18KpWzOpOc1X zMr=L!TQZ|iJ8NnT?1qXNWoUW@@sGxa@A`8FoB6(I%`2=>;2BvPpNL2N`~E{gROlOy zUW6|r_kiQX?|ty`=`@W7Ul=g7Z=lL(tMDldlC{38ib4RX;=hr7Wqg!1s8jM{g&dF< zk$^=GW_o_)q!{TL7n2W20Sl=9nJw!{n&f1$Ypc;|!vy!~v)7@1^N$h`WL}&gm z6rZjq^}z`|fybh&xmUtlfb3fycT;A}RD~#uW3kkxN((PL+mPT{ z|7xh!5?c0OTV3(#T;>%o%G^CST5`Ku3-?=IIz>*2s9s6g9+=2^>;)MZA?Eb|HKmVv zdfE!F##{L3=eg9t5%Uiwf%wxrHj<%Eq%E}3akTatoX*hd^p5!4i3 zp$F8}cmSqNUwH;{9}KAJPl>{+-0e71S-J+**j^x>!4@W z6^Oa-90z*Q_*gKLcdYBula8wFpMRffOr-X23Cw66QbbWTq?E~=#mi3)dc0pegk-^^ z^#<@t(-j3jrz-1am$@VL&?ODW3oyYp zioH8^C;2Qpj`+dMqZs%3T{uUd-j3I`v)?(Jql@Qtsj&PB0EqTriTFj(v7&hP!M_U! zHUcFUG{iSwTBxTQCNvO}O0^xJMV$6)^D`L>d>flLE^R0;_yv@jpSJRp@Nylu^jiL)J zx3Qki_SHinB(Jm%xC1-$Z1$FwJA|i022pr+(l~13Lm+G8F4Td-IYrZr77~Mq#fcTz zP!p6vpsgI&so9Surim74k#V3j4GpCi)sGc@3=0S;(VQK*+FxPnVp@tx@v=z0l+s2luIfpUz{&7JV=?u4okBBAY+ zEi&a!{U^dikINra4I><;lFFyQ=!u*9?8(>i^rzo2t@a(D$yU`3so05&Y>gsYpL@%G z=DsF!^%e5<&e*eNcpn1qwS9K01Dp&)T^Am;pr68Gb(1wpbcknZP_3_m`U&Cg0RItd!WrAf2<*+0Qog`_de-ct#C z;ZJV5qEYxN-FF|ynmZy*?oL;%J>m%5A;naE0(pKiVEl%)U3=@}Ro&ZETm@xI3BCHmr z=?3WrRGQB!#A%o(+JLB%JS_~98#5=y)?)GDfCdk~)GS=_@9~ib=6_K1tN!-HPxJYP z&!ehc?1o=jkS7o(0Nu2Gd#`feNs=|hkgR!QGH8`c-g3Dam?3moBz}N%ET*7) zOLEC%NCy3CZ#5Ps)72Pd6@V?5Wz$L_Rj5l(K^G0;BJTwfAxf>huTS^d5c0DMGD845 z`nD7nepA8)%=MQ-yX(&IUJ!yACl04^02Aqa!UyN0>(Q~V{VvUP<2kD z);sf)*2T{SR-=h=uP^xmEN7ccA6T;M)v@hKRFWHGVR_WX_`586+FjSaZ8qrX2rkz$ z0tA^NJCH;CoC>=0x(R~niiV;SB#suQRxXmQ%|H(Rzh~t++O?|pAT0~Dg4;8fNQ%pL zuE&4K5i&7)U%T3K*%hmBUwJTm;@VbUxytOg;NIxcTJuTG(4Ls!Sw6~15V%QM2&o|Z z7IoAw@2M0J-@^mKSh53YbN6m*R$B5Zh;(mBV-~q)!8=P*CyA=YunSAkFXBpA*^MUea)q;C;KLtzkvJXW#c1YL#vC} zDjdPxtORWzG2+*s3qaTt2^n|%KN)avMyZVG%+|$(U&hI%YcPU+v7>-HDlx(E_A(8i z3aenSV{UA@)@M0XQ0eb-W2KV3*HsiA612`2+ARGarv=aUv0B0hSQxj!p)si<{3RjE z3Lp4G+dwV^n-|oF#Ho8burae=Sie^Lg+KFBN7!Dp8cb}YLrRY;*kVGAEaH+-R*+|nQ z`YwRn*5kJ7CFPDxGWdT+7T}FBh;q+)nyA&vvx+Up_9&!)t~k_RpHbJ(%U@(HX_dv) zkXHhBAPvFfC%7rs@wk%NX(H_3Acd#dy;V>T2D@vDYul}O+?7xmyq^1Nu<9-?RHBP> zy7`q;;m0)8kg(Uq4>vDy;E5H5$r|-xiToF$+>$zV=`X045V{B1o6f%Paw>Z+Jx<69 zR5$1oQGVw{-Nx97c85mm0lX>Sit+mrBr(Q~;s&RzP942PTPe_d8A%)xvGjA#?C ztc$~$UIp0h1g_#;CcSzi{*8|keZX@|!;Z3I`ES09!o|O{23a4Iot)gM`6XSgJyNjg zEa&&2r&R`6CHkYK1r$N?1Bh6@5ByBS1LzsuaM z+)~1k5D1&MRhqukh}K?F-jW&qV=psiZa|L1j88Bv3<>$bo>#Q$sQvZSkB|C8Rpy>r ze`rV#qA;O#LXMpME3ZPtd4nwvuadiB2F;`-m89AiczAp=o_aX@3sYI8CeoXziNQOv zdo~Av8Tha3?q+Foa(mEc@qCbT!P`?DdL9|VvVf3ab`uIh?AM2rhhZt#pnF*5)Czo9 z$<~v2obA$^FR;et0LXoG1$SDan%OHVeRYSbz!3!=YEnq@vqqg(!eFYi5a)Z?$b_1Al9s&2y7K=xDMqvfrrDFS=l0Hf1^WW$as=|yRJ2Q7B$LN;tWx^l!x<*P;4`th)3r4hQYub zCN`7pWkMbNk!##aAq)AG5P$A)%(#7utWjwP|2wkAPg0!-_}GMA@u`j>7MGNU2QZmT z3kfVpBL#+D*V|?2kWfvQ-^!K_o7U!^#~*3`ACZPEJu&(=<$%s(wFKDj&wTqB&P>dy zKZtgWzf zd%3yXfH-OekB@V;^`V>LEtZo1RDt5e+o(b552!uF4WlV482033hPNHyYV8^<1=AqD z$o5z~d}Nx!&)QkdJKdoxNIiDz!C80_9dS?snYTb;0i^r!Qx-i`nAAO;^~F<&>s`|Z zKO=?x7EjAU8Y$SKhPSfx2YUyU?Sf zT20!i3P5&7WOiekjy;bJ@J*4M7>824)p?Mz!7d8UBS9(O$z(!%!f=`V?k~7>HKV?i zN8L1a)uV_n0qb)2k%iro%YqM#nd zF~}kKkK`n42JxQ43&#Gqy%z1N#1y)B{-ZpZm(jUq$={^;`T{34y4TDWU{&n8{+_aZ z#~J~?0#NAx02-$u1A~;*MSu9v8(!6dDf>F}&>T~~@6ilG@S0H1i&HEEY(m{s?FQC@ zo(cfaiIgt!o)B|?2x`F%j+CYlz}%eJjuXj3hPgeQDfQ1F=4HPJf?LR}y_bzRI;uT~ z#R5F9+71V_h7V^IkG4@~zUc6q!|G$};Ea?wNuXRp^}1GW;K|5MU?pn^FmXgsY6 zE{s3jWY_)m_nRR^%Gsp`jyYAMj_Uya8Hf(Hh=c`|G3Tlf_Vd|>47GqYLBGD9o^(u< zjka^bp=I9oIXGJxqD<#i$n*SoKU_H3unumB^zALX+@DDg3;?KBh4TD9D5#NegHR#iYjL?f@KacL9YD-|D^@VB)UKrJO#+Rz=K>9}gdcnmuyS-{A( zSTVLKls1|CYCub`QUmYmA<{vD^jraSIkbl5h9eiu!WnLgdzg4#pBB)2;mj^Foav0R zNrg%CN;j(ib38!p@5SyB7}#KRk!p01ne5t&vdt^F&^rJ*9c4uV#phwS6At?z6O}YR z(mX4w%2(3`vT}Lgeb?yEI5WA@C{7Az!IJjG=ugD%>m>tApJ>r5 zayl-i4plxnh%1f5WhDm&MKelESML1ztPcE^Y%>Iw`tr~DdIn}%fbuSLE_J(rVg}W4 zg}+W--K#v0C@QHu$?u-MYt1~s%!`Ea&zzT9mc!?{;Kj7;jdLj5u&#ai_?@|(9~Gg* z$%cWo?Qh6l8Clb@fi4A$LX>xwpIe=ymH59=y+%5q5Aw+J@f1VS`CY2v*cLNUzxlXo z2~AfuDtoP3xOmi78+4c79lJg-W^~a%2UZhY-y52MNK9E4moc}+dRDY|>N6hG)-GfE zxOG|$FWjH8!3T#+B-MM&On4#p1ydm8LhUqP>EiPEPm0lHUgtmnzDtYaiO+%jYZqK0 z46Hlydabbv+*0SubX2feE3BJ`3GsJ!6;YCf&M=%6k85qf8kyQpfPLys z#hk+)eMLVns(F_@TW+~@#jt{+x?cKTe`7F+SW|x{ghmZS!kUWs&pk^<9&wGMKqttu z^4*jQg2C;ad!K|H+{82b1!Z7)3;S~kM}`IlCia8F*##+$>&71C{8q{bAN;XHU=YK! zi9D&xc)_^77Gl#v7%Ta`#%=pi9LHGVlcys`Nb=-7kH|(g>TAqZyRy z8Me7p{D(Ndp=B;csSii^VH42AUxsUip~AdpI_j@DltYb00Z(S7(cS$*SBr;Hk}3rd zQEVScJN_13hmV0$H7zLoMuUUBLL4+qG>tQZe>i(Ii)rW-D%V;i^ehkx!poe7vGv4d z6;~HUK`^HwydEW=Dnx=bD!(U`0((DIetqs^TTc+{*5bP>1xp<&b>`8c_~}xF;&Pcv z@Ore}i40|o9)Tg3xNzzasx9(!S^iyOW9X?x^o`y3*zka&7NqK_vH~M(I%SYe()b-? zBtC+Jmu7NrO0Dp7AYR)KZq4A4V*J%L-;#YSt}VV2^k*JX{6Scr)Jc2=MbRAlPWB3_ zhTV4dTgkF&%A}}nIELoJuLOBs{o0)1gf$)$LaBlDUIbLP0n&Hdf#AHt_>iDY+22#N z@Fon%>Mt?>l~#A}p+y{IkDXC&tZj7^+|zK6 zlvLFP%~~ofaAF zxtaE8j3XEma*<0N36eb7=51vxCe9YKTS$E6Qp4~w_E=5ku=TpAQpPpe^K0RSW>Xn( z2lLDcHtV&aI-@raS2Yu>S8LXpKn@zuYu9)wX0nE8tlKl+6`CO@G?Mg4!2}eteL?R4 zAx0w}SkBv7ua8oNJ6=$3u322K{;6xMa?Hl+ld-c{9x|6z05w3$zt!ojUhD+M+-G6x zaG^_~r>2h!*F>+K#LDlMVI(3EjvWav8Ec{Z>;2)^pa6M3UOsA3&@ahV6;93Xt@M^J zZT+I?cp*Bw{3(F`Gc#mn{WJgrJT#`dCwF!8*_PF~6{T!@6biuaX8%JV*rl=TbJm{} zx!$dH@jUXzl?iotDu-&%2?7>?_lxra7D%6sEDr!tq_S426?hB7s8=Y>oeW@x6CIEkRWEqs&@Q;x>pn(& z)c#~DZH{QlxXlWECHQcdkt-f!_RTRQwU~TqLNaUQ-acmPf@#?^N$rIQXya*jX5{d6 zVjDZ(cnwyWAO6Jvh*bJGJ5ZZnvUH-P%U8zV%T(POK4`{mRWmx*O~#i4EC&dDua?y< za(YPwHHY`2(BBZ2OzsOT`*@I^BrO0;lt)raGd zx$sm-L1ShLgO7SY&d~A{?9mZ_G5+f{1%z zpH`?+#Ez9mh_*HGZVWIO*ZOv+zzwde31&*EZ>X{A>7B71oCaQZJp@$(D_6IMfsrCc z;=F5N4^O>ix|WXa`^@@xCDQ{1s_oNmQ6U#x2dApGoPw7M^>905iDT04{## z7!k3ZT}B|!i{zM!mxm|19Q162k&BffuRj-HuWf@g5eLOvC4ElzSu~NpMG|toqj7_y zhwF#alX=|WW(wENV1V`UYe{pPKS@TtB(RP93Ud8VP`HQ16@D8QCCmORA*{k<8{-f% z5YhA@EKikt%MI7t+BgO5A9n%%hxN-nTNc}!lFZwQ6+w$Uq9AR02$WaoDuxKVt!6LV z!X*IbYF=nl>YFp|(d$j}G+D3yFlA(ZFyF*7^EM7$ir>gY%?@Yw6r?sQ9hs~^j8Ju# z{Ys1BhoQ4FtzsRyD0-dK3nsUa)HHlJ#@dCdFE#MtIdo?5nJ*hO3>h+1kw}me*BY=^ zTc?;N35NmqwS9O=I37Et&xg4EfeggAS}Hq&|4-D=@0CjkpZk!A9Pp63kJ~CR|xm zs@YM*zavPYF|udi%xuX`o9CBOT~!Y7woiD0lp%%2liUmghRftv$`{ek1j+MK=~$^! zCuH~GxV2(i@(Cq*l$BXH;zy_8Z+-s@>7Z~kLME{8kKF{jp*lfyv*wHpITVN8`(iS= zh^> z`8W~Xe4j^rA#bWF>8-MfOWz_|u$U7`2j=PGGJvsZ5@a3}cz*4C2IyCGb<=FUZpO@GYH@OHpiVq8c}8b6_r#&@)Q}iU>;k@@8@+(DC2KrKABM`a@QII;C8cC6t|P@8mA}d z4e`^CPN1T3QS$l$G=?f;11p0bNkK}P!6Fmlt^Vo_HI z;jgCttZLza_I)UU*|IHSinV%H)X6EBtDEtFqF^TPONd{Seu;5}cAD+D-H5;OK2%f+ z!5T%cEBQtBQtfSHu3=?usLha7XT~s)k+I-N-;umQ|85oje-6l(wjfDtX6}chY{3;$ zHNuk)t>E)O%UO>Z-y(MOlCTF5q?eZmw$d!Bm?7(>4*{k)q2-uByU=@>48#&G1{ZgF zSQAa6A}uS8&4YOE2dXNlGo5?IqBAEWp&W-lNY;Xe2QG8yl^&DUf3B0Oc#;T>jWTIL znqkvEoRuyZxs@yBIKd@{RGP&sJ-p(-2bhn zDeAb%sW)nt=7zH`(HVpO-qXpB!F8(XJreU52xMboUnTFK2&-Q)CJYE)IIb=%jbGFl zdL92AA$u<9yka#o!Veq+=73Ci2~-**6xGo&>?)ivJo6L&Lc6~gBHMA86R1{71*Me< z?7gTGAo%!{LpbZ6!S0jRFHy35!yv=h#=QF;yQ6hOfNtkwPc76hoqQ?3RF+axVhE#B zu55*JVi77o=I;P5($Yl8;HQf#@&z>_5w|k0uT^5WTZ~_b9{Z1sQE)3jNA2z0^$7yv znr+Sj54o%0HnWlKFuqaadzjKf{V}CoJe37&g1%p6r2mu(?iA6%S_v&CFtCz(P3|k` zAs=1+>CDo&fVHVl0Zh1gecrePp%2Eib_FV5ezWdZXnQxD-8ZEI@jueUjPb`q(Va!U zj1dMU=5rpU`?Zm#ACvzVSZZ8PO$mM0T3hH5pPzIFd0wuNcPJ~iD=Ov#Pl;wo&Gmz% zb7Ut9R|SX>g9)t5KMz8bs4qm1H-jt}th$R*xHquFryMZ!Jl<2i*^dv#66SO*q5-37 zl3Bd>VvqzUD-8c`NTig|{3kSR z`u36Ys&zxa%d@YZ`l!#Zoi>$iz3^Mwz?hCJLF)Ib=%>LqBkt+Svd30~j#{r1u)Iza z-Mns5vYwKXS^3sCq-ID_&%FzOK&^b(bq6C^3=)%1PiFQ~3zs)=?K-YSXniO~t2?4q z`VD7DuWF8{9ZmdQJiT=R?+chm#+!86j-|;~yB`746fuUzP}J1{lY<7M=zvi9`_W z+LpzEACxYC+Lw{mPV^AO3MC`SnO?{15xa%n-HE&QD;N?0ri2}z6a?BeyJNk=L}+<*S0C^VVa!>&8J$DKx!Bt&y5q(HMZW%8(BDp?uV7U{ zKE3&tva?ZxO&eO2WwF40EjT#rNZ&%Zj2@(u%LlppWvMz4aF=(a&-ZLg3%%rm;ytQ> zDcrEpE7e)W_pnAHAAXhy%ZI*rNmI(=TtZUW`NqQXZIy@{zu-)^ad*wrMFSODxq(=M zb_624^GobGQN0+UA0n##b^CH!rsH(}!%@vAjjv%joBwFH1bv^lubhf@Q!;yajcd7| z!EWt!H;5R4Si{AT4aCt5t<-KGIEshWwbgJUSf@B~ng;81`lx}ef1s%EoQ7TJx@~DV zZe-Z8h1)O7vEnbg;*7w4a`|vwgbS9g_7?M}_HuB=qh)F+A|joP!p9tP=6R_q04m{i zZtG;bVQ(VpG%xPQR(f*anuR@X%mFZ9@Hu35z>AGLu>A|>c8G)zOP90cujJ%nmK(-c z!Xxn`mw>)-jkFpWUNN+p>5A$|W@DEjRA)HcS=qL25}styZIV~4Bf4u*-&^>Fq+E6e zQ!q`9j5rgJn8<6rV-D^WDsk{u-G?)Dx@az7ynUeWxi|5V%s8F-S=(Nz0I(KC6sMSlhbAlGYTa$$t<{*8Qi5YL%82*1vf zOE~bnn?MLEEDc&hTh0cT>B?(ta<-v=l{Jb7jS+1GZMbpb&YW$u(2ez!qp4en;y;W; zgVlv8neH$93I7d{Xuwe#r3nlHAXJ%iaQ|;%ncYk5Un_uWG7LfAMi>-k32f`u!}%qX z(W0lU(eat|eQ> zo*D(?ED$^AEYCx;x-?w6jpQwIxbp4w6S7(-R4$Al52mA-#^o04u0xcm^uLhv%UR}@ z614#R>BEfB{jVWEe|B(7k)i>MFoI(MwoVDG=@iI7+=#fw`GLd^bsATCE@F}l{4D|Ozu-fegc@&Gc+c%W z)!N-v`v%_l7*RGUz0dWR!IuD$rK(Q2@-@c+=cLjt) zW-hm}Xc^o|H@QM_HPLpxwo}Ds2ChBONlnrLz7h3x_mE@tdg3*IO(4%bEnb$9P$?U}`-1l=ZU3R?n4190i=SaW zN4?YA0EK12FSBGZf{R;C-sNu-XLHn^dS>h-HJS9O`lkKL1c$w44I}d-dU|-lwf(-Df~R@tm$ycpzY% z^qd?2GBRcwOEFK@=y1r6{~>hi*cr}b4701{2o&8bfj_{e4E7qigaJBEmn4^8Ln_)$ zqM*yP?P&kzT{aTAiD#T|lK^cGDXqScd}|y&&Rb5<;6D|{A!{40(P1ycQ<*^b_eU>H z72tdTz)kzS-NvR#KLczs-ctwPV0a}PAkWD1c%QTEe0H_?^{21}LZ6RFe84;erH3eq z?gLQ96!c-w?tYQ)G8SOYEZ}hRqK6ViJVCU(*f)kJD7!~B2R&Z(!`KtmFvPR<{{uClKoD1aBI>A=bcpB%CA4 zy>FKI1b27|SiCP~VT!dDe=!+4cbu2lS$A$Zd>-(fqxKF*$5sa<{a%los*{rhjX4jD z7BRw8N$)Sn%2dyVd=cgUS5#6s1ZfO3(r|a`?{9&mrm+>fTT8$D&2tv5N(dHm955?? z1`yorLg>-DZCt-l8)RtZO_BbUTWGvzgONwskeW*$KWVhLA6Z;Sq=2tuja_%$5Otjp z<<-1zwsZmFbXvEGGl{A1RjMriPmPw`K1c>jGhJREl5;qHoM*Sxda$lfVi1|>AgO+2 zq0@%E7Gx^YT^T%@`a8dfW0#Y0+xn%J>Wd7YLWm6mltfS(JkOOnkf@?ht_G)67qbb5 z(Av5{e1-BBXo#d5g@$#ZW40nXJPU|5XC?t5uEwfF3;97yM^N>Tij0V{o>mDc`lN19 zU)G@dRbF^p>@4<4mYDKT=K*M**#2?EGzGIbuij;)>c!z)ZQ%c zg>Rz(n?^V7yACFiLdX>MD|0(26XKD({Q=Uv9v>2`ydX$f{hIK6G)bh6m)Qp5m$*HG z$4*@bDi521?UbQk#(lJ#8ka+DC>K7g{R?Le?Brwv_HVv}KyhsB($RGeu+l|9kI0 zU9PP};+{1%meSy0_FLg@Q_Gv-aqbVlKD%c~N0SnOL%`g)v;wUR_$+ez7y|0l$*}GK z;V2@Y9+OMJfm)kl1JFHaT7`|dCf*Eq$GihOa){s9WAq#^KF-V#9;pHnWLQ^h!eknT z3^$hHwkJ-8dxTVf)MtCL^bQGqJ85~PtCwFTpuH%#q&Ib9dk16o@~f%?hs;8t{(XsN zdNcc2SCN%#7nY_TW=D>HF5^N+ozc{!og9Evkie~onwp-oYX}ehbirf=e2lIpYN7nRbSB5c?1-lBsq?;t zTVo6&Ep&!-L>-spaCo;<+=q8h>0v`V@+*=uZgAN9(c}|=Y3SFjjnVj(CA0H&k?2xd zUmXVRb8L5V=I<+%r-6Ur&(<@uvtfrWu|gCVb-YIuU3L`ZG)#BSkKVzK3boGG5!stg zUN+0VVrOyr@j6&~XHToSFeXcg#kC+TA1&GW>keuI(%rS@6;i`ZGMx_f*qQ=e zCy?nkd*g41h0A*0-Cy?_v&`Rgm!!aKWWKx~LIo+(sw^`{+ex6^#{&A`#D0kWco0;zLP`Nt>Oy=&-gJ2ZpffDQX1ww_1nu&0XNJY| zOmpM_$psk(W;AZ^mPcS34ag0~r2RjN&PiRzhmw|eA|M-PlT_(XjKS9A#wUT++Ccm4 zW6hj%BCen#)H!%7QBTkaHe#q`d;~RFd4{vGc2&4v!3g5xWcfvN5$=dS6^2x5$BR5#w@-4iUBnmGg(S7($rBA*KHGxk2DHh!ZQcyB1m(Xvi|IDNVy9Jfq3o_`K9XUy%~qwfzXvNfUD_63rZ;U4>9!cruymy*u*#{73i9b?x$d$VFVc5Zjem+pit-$w-AFDxgtF{Sjo zMltX_fx7>{3QzHK3cW88$ML}5UG*&mG&|8bSXx9#71

9`*WccQ}j0uzPy|#zaKq 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≶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 literal 0 HcmV?d00001 diff --git a/contrib/create_osx_dmg.sh b/contrib/create_osx_dmg.sh new file mode 100755 index 000000000..af164e56c --- /dev/null +++ b/contrib/create_osx_dmg.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +# +# Creates a Bitcoin.dmg OSX file from the contrib/BitcoinTemplate.dmg file +# +# Recipe from: http://digital-sushi.org/entry/how-to-create-a-disk-image-installer-for-apple-mac-os-x/ +# +# To make a prettier BitcoinTemplate.dmg: +# + open (mount) BitcoinTemplate.dmg +# + change the file properties, icon positions, background image, etc +# + eject, then commit the changed BitcoinTemplate.dmg +# + +CWD=$(pwd) + +if [ $# -lt 1 ]; then + if [ $(basename $CWD) == "contrib" ] + then + TOP=$(dirname $CWD) + else + echo "Usage: $0 /path/to/bitcoin/tree" + exit 1 + fi +else + TOP=$1 +fi + +CONTRIB=$TOP/contrib +BUILD_DIR=/tmp/bitcoin_osx_build + +# First, compile bitcoin and bitcoind +cd "$TOP/src" +if [ ! -e bitcoin ]; then make -f makefile.osx bitcoin; fi +if [ ! -e bitcoind ]; then make -f makefile.osx bitcoind; fi +strip bitcoin bitcoind + +mkdir -p "$BUILD_DIR" +cd "$BUILD_DIR" + +rm -f Bitcoin.sparseimage +hdiutil convert "$CONTRIB/BitcoinTemplate.dmg" -format UDSP -o Bitcoin +hdiutil mount Bitcoin.sparseimage + +# Copy over placeholders in /Volumes/Bitcoin +cp "$TOP/src/bitcoind" /Volumes/Bitcoin/ +cp "$TOP/src/bitcoin" /Volumes/Bitcoin/Bitcoin.app/Contents/MacOS/ + +# Create source code .zip +cd "$TOP" +git archive -o /Volumes/Bitcoin/bitcoin.zip $(git branch 2>/dev/null|grep -e ^* | cut -d ' ' -f 2) + +# Fix permissions +chmod -Rf go-w /Volumes/Bitcoin + +cd "$BUILD_DIR" +hdiutil eject /Volumes/Bitcoin +rm -f "$CWD/Bitcoin.dmg" +hdiutil convert Bitcoin.sparseimage -format UDBZ -o "$CWD/Bitcoin.dmg" + +cd "$CWD" +rm -rf "$BUILD_DIR" From 3fc4c3a9f187a2f15d98d6d24e812bdfa81e9927 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Fri, 23 Sep 2011 00:51:00 -0400 Subject: [PATCH 08/18] Add win32 gitian download config. --- ...-download-config => linux-download-config} | 0 .../gitian-downloader/win32-download-config | 30 +++++++++++++++++++ 2 files changed, 30 insertions(+) rename contrib/gitian-downloader/{bitcoin-download-config => linux-download-config} (100%) create mode 100644 contrib/gitian-downloader/win32-download-config diff --git a/contrib/gitian-downloader/bitcoin-download-config b/contrib/gitian-downloader/linux-download-config similarity index 100% rename from contrib/gitian-downloader/bitcoin-download-config rename to contrib/gitian-downloader/linux-download-config diff --git a/contrib/gitian-downloader/win32-download-config b/contrib/gitian-downloader/win32-download-config new file mode 100644 index 000000000..c0de21c48 --- /dev/null +++ b/contrib/gitian-downloader/win32-download-config @@ -0,0 +1,30 @@ +--- +name: bitcoin +urls: +- http://bitcoin.org/bitcoin-latest-win32-gitian.zip +rss: +- url: http://sourceforge.net/api/file/index/project-id/244765/mtime/desc/limit/100/rss + xpath: //item/link/text() + pattern: bitcoin-\d+.\d+.\d+-win32-gitian.zip +signers: + 0A82509767C7D4A5D14DA2301AE1D35043E08E54: + weight: 40 + name: BlueMatt + key: bluematt + BF6273FAEF7CC0BA1F562E50989F6B3048A116B5: + weight: 40 + name: Devrandom + key: devrandom + D762373D24904A3E42F33B08B9A408E71DAAC974: + weight: 40 + name: Sipa + key: sipa + 77E72E69DA7EE0A148C06B21B34821D4944DE5F7: + weight: 40 + name: tcatm + key: tcatm + 01CDF4627A3B88AAE4A571C87588242FBE38D3A8: + weight: 40 + name: "Gavin Andresen" + key: gavinandresen +minimum_weight: 120 From c1ffdc58018332353ad1e3da0eeacadcd0e1d7a4 Mon Sep 17 00:00:00 2001 From: Gavin Andresen Date: Fri, 23 Sep 2011 11:18:22 -0400 Subject: [PATCH 09/18] Update release process for repackaging gitian builds, and osx dmg --- doc/release-process.txt | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/doc/release-process.txt b/doc/release-process.txt index bcda64dbe..2e8b93e11 100644 --- a/doc/release-process.txt +++ b/doc/release-process.txt @@ -33,6 +33,27 @@ 2. windows 32-bit binary + source 3. windows installer +* repackage gitian builds: + + * Windows .zip and setup.exe: + $ mkdir bitcoin-$VERSION-win32 + $ cd bitcoin-$VERSION-win32 + $ unzip bitcoin-$VERSION-win32-gitian.zip + $ mv bitcoin-$VERSION-win32-setup.exe .. + $ cd ..; zip bitcoin-$VERSION-win32.zip bitcoin-$VERSION-win32 + + * Linux .tar.gz: + $ mkdir bitcoin-$VERSION-linux + $ cd bitcoin-$VERSION-linux + $ unzip bitcoin-$VERSION-linux-gitian.zip + $ cd ..; tar czvf bitcoin-$VERSION-linux.tar.gz bitcoin-$VERSION-linux + +* perform Mac build + * From the bitcoin source dir + $ cd contrib + $ ./create_osx_dmg.sh + $ mv Bitcoin.dmg bitcoin-$VERSION-macosx.dmg + * upload source and builds to SF * create SHA1SUMS for builds, and PGP-sign it From 6b8a5ab622e5c9386c872036646bf94da983b190 Mon Sep 17 00:00:00 2001 From: Gavin Andresen Date: Fri, 23 Sep 2011 14:37:21 -0400 Subject: [PATCH 10/18] Bump version to 0.4.1 --- contrib/Bitcoin.app/Contents/Info.plist | 2 +- doc/README | 2 +- doc/README_windows.txt | 2 +- share/setup.nsi | 6 +++--- src/serialize.h | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/contrib/Bitcoin.app/Contents/Info.plist b/contrib/Bitcoin.app/Contents/Info.plist index a5c7da1c8..d5a278a57 100644 --- a/contrib/Bitcoin.app/Contents/Info.plist +++ b/contrib/Bitcoin.app/Contents/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.4.00 + 0.4.1 CFBundleSignature ???? CFBundleVersion diff --git a/doc/README b/doc/README index 772fd7f31..789cc9fb8 100644 --- a/doc/README +++ b/doc/README @@ -1,4 +1,4 @@ -Bitcoin 0.4.0rc1 BETA +Bitcoin 0.4.1 BETA Copyright (c) 2009-2011 Bitcoin Developers Distributed under the MIT/X11 software license, see the accompanying diff --git a/doc/README_windows.txt b/doc/README_windows.txt index 8378ae50d..7ff883492 100644 --- a/doc/README_windows.txt +++ b/doc/README_windows.txt @@ -1,4 +1,4 @@ -Bitcoin 0.4.00rc1 BETA +Bitcoin 0.4.1 BETA Copyright (c) 2009-2011 Bitcoin Developers Distributed under the MIT/X11 software license, see the accompanying diff --git a/share/setup.nsi b/share/setup.nsi index 6cf477747..4c837c974 100644 --- a/share/setup.nsi +++ b/share/setup.nsi @@ -5,7 +5,7 @@ SetCompressor /SOLID lzma # General Symbol Definitions !define REGKEY "SOFTWARE\$(^Name)" -!define VERSION 0.4.00 +!define VERSION 0.4.1 !define COMPANY "Bitcoin project" !define URL http://www.bitcoin.org/ @@ -45,13 +45,13 @@ Var StartMenuGroup !insertmacro MUI_LANGUAGE English # Installer attributes -OutFile bitcoin-0.4.00-win32-setup.exe +OutFile bitcoin-0.4.1-win32-setup.exe InstallDir $PROGRAMFILES\Bitcoin CRCCheck on XPStyle on BrandingText " " ShowInstDetails show -VIProductVersion 0.4.00.0 +VIProductVersion 0.4.1.0 VIAddVersionKey ProductName Bitcoin VIAddVersionKey ProductVersion "${VERSION}" VIAddVersionKey CompanyName "${COMPANY}" diff --git a/src/serialize.h b/src/serialize.h index 64f67fd68..6b35773ac 100644 --- a/src/serialize.h +++ b/src/serialize.h @@ -60,7 +60,7 @@ class CDataStream; class CAutoFile; static const unsigned int MAX_SIZE = 0x02000000; -static const int VERSION = 40000; +static const int VERSION = 40100; static const char* pszSubVer = ""; static const bool VERSION_IS_BETA = true; From b14bd4df58171454c2aa580ffad94982943483f5 Mon Sep 17 00:00:00 2001 From: Gavin Andresen Date: Fri, 2 Sep 2011 16:59:47 -0400 Subject: [PATCH 11/18] Skip verifying transaction signatures during initial block-chain download --- src/main.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 434c8e848..be6fc9c53 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -810,6 +810,9 @@ bool CTransaction::ConnectInputs(CTxDB& txdb, map& mapTestPoo CBlockIndex* pindexBlock, int64& nFees, bool fBlock, bool fMiner, int64 nMinFee) { // Take over previous transactions' spent pointers + // fBlock is true when this is called from AcceptBlock when a new best-block is added to the blockchain + // fMiner is true when called from the internal bitcoin miner + // ... both are false when called from CTransaction::AcceptToMemoryPool if (!IsCoinBase()) { int64 nValueIn = 0; @@ -863,9 +866,13 @@ bool CTransaction::ConnectInputs(CTxDB& txdb, map& mapTestPoo if (pindex->nBlockPos == txindex.pos.nBlockPos && pindex->nFile == txindex.pos.nFile) return DoS(10, error("ConnectInputs() : tried to spend coinbase at depth %d", pindexBlock->nHeight - pindex->nHeight)); - // Verify signature - if (!VerifySignature(txPrev, *this, i)) - return DoS(100,error("ConnectInputs() : %s VerifySignature failed", GetHash().ToString().substr(0,10).c_str())); + // Skip ECDSA signature verification when connecting blocks (fBlock=true) during initial download + // (before the last blockchain checkpoint). This is safe because block merkle hashes are + // still computed and checked, and any change will be caught at the next checkpoint. + if (!(fBlock && IsInitialBlockDownload())) + // Verify signature + if (!VerifySignature(txPrev, *this, i)) + return DoS(100,error("ConnectInputs() : %s VerifySignature failed", GetHash().ToString().substr(0,10).c_str())); // Check for conflicts (double-spend) // This doesn't trigger the DoS code on purpose; if it did, it would make it easier From 565c4771b6eba0eeb82f8602735100bbcf4b053e Mon Sep 17 00:00:00 2001 From: Gavin Andresen Date: Mon, 26 Sep 2011 10:04:04 -0400 Subject: [PATCH 12/18] Remove wxWidgets Makefiles now build bitcoind only. qmake/make in top-level directory is used to build Bitcoin QT Deleted almost all #ifdef GUI from the code (left one possibly controversial one) Deleted xpm/ files. --- share/uiproject.fbp | 6388 ------------------------------------ src/bitcoinrpc.cpp | 10 - src/db.cpp | 2 +- src/headers.h | 28 - src/init.cpp | 68 +- src/makefile.linux-mingw | 30 +- src/makefile.mingw | 33 +- src/makefile.osx | 22 +- src/makefile.unix | 22 +- src/makefile.vc | 18 +- src/ui.cpp | 3221 ------------------ src/ui.h | 355 -- src/uibase.cpp | 1018 ------ src/uibase.h | 425 --- src/util.cpp | 42 - src/util.h | 2 +- src/xpm/about.xpm | 665 ---- src/xpm/addressbook16.xpm | 278 -- src/xpm/addressbook20.xpm | 282 -- src/xpm/bitcoin16.xpm | 219 -- src/xpm/bitcoin20.xpm | 160 - src/xpm/bitcoin32.xpm | 232 -- src/xpm/bitcoin48.xpm | 277 -- src/xpm/bitcoin80.xpm | 292 -- src/xpm/check.xpm | 41 - src/xpm/send16.xpm | 278 -- src/xpm/send16noshadow.xpm | 278 -- src/xpm/send20.xpm | 282 -- 28 files changed, 26 insertions(+), 14942 deletions(-) delete mode 100644 share/uiproject.fbp delete mode 100644 src/ui.cpp delete mode 100644 src/ui.h delete mode 100644 src/uibase.cpp delete mode 100644 src/uibase.h delete mode 100644 src/xpm/about.xpm delete mode 100644 src/xpm/addressbook16.xpm delete mode 100644 src/xpm/addressbook20.xpm delete mode 100644 src/xpm/bitcoin16.xpm delete mode 100644 src/xpm/bitcoin20.xpm delete mode 100644 src/xpm/bitcoin32.xpm delete mode 100644 src/xpm/bitcoin48.xpm delete mode 100644 src/xpm/bitcoin80.xpm delete mode 100644 src/xpm/check.xpm delete mode 100644 src/xpm/send16.xpm delete mode 100644 src/xpm/send16noshadow.xpm delete mode 100644 src/xpm/send20.xpm diff --git a/share/uiproject.fbp b/share/uiproject.fbp deleted file mode 100644 index 7d2c25841..000000000 --- a/share/uiproject.fbp +++ /dev/null @@ -1,6388 +0,0 @@ - - - - - - C++ - 1 - UTF-8 - connect - impl_virtual - uibase - 1000 - none - 1 - - - . - - 1 - 0 - 0 - - wxSYS_COLOUR_BTNFACE - - - 1 - - - - 0 - wxID_MAINFRAME - - - CMainFrameBase - - 723,484 - wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER - - Bitcoin - - - wxFILTER_NONE - wxDefaultValidator - - - - wxTAB_TRAVERSAL - 1 - - - - OnClose - - - - OnIconize - OnIdle - - - - - - - - - - - - OnMouseEvents - - OnPaint - - - - - - - - - - 1 - - - 0 - wxID_ANY - MyMenuBar - - - m_menubar - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - &File - m_menuFile - protected - - - 0 - 1 - - wxID_EXIT - wxITEM_NORMAL - E&xit - m_menuFileExit - none - - - OnMenuFileExit - - - - - &Settings - m_menuOptions - public - - - 0 - 1 - - wxID_ANY - wxITEM_NORMAL - &Your Receiving Addresses... - m_menuOptionsChangeYourAddress - none - - - OnMenuOptionsChangeYourAddress - - - - - 0 - 1 - - wxID_ANY - wxITEM_NORMAL - &Encrypt Wallet... - m_menuOptionsEncryptWallet - public - - - OnMenuOptionsEncryptWallet - - - - - 0 - 1 - - wxID_ANY - wxITEM_NORMAL - &Change Wallet Encryption Passphrase... - m_menuOptionsChangeWalletPassphrase - public - - - OnMenuOptionsChangeWalletPassphrase - - - - - 0 - 1 - - wxID_PREFERENCES - wxITEM_NORMAL - &Options... - m_menuOptionsOptions - none - - - OnMenuOptionsOptions - - - - - &Help - m_menuHelp - protected - - - 0 - 1 - - wxID_ABOUT - wxITEM_NORMAL - &About... - m_menuHelpAbout - none - - - OnMenuHelpAbout - - - - - - - 20,20 - - 1 - - ,90,90,-1,70,0 - 0 - wxID_ANY - - - - m_toolBar - 1 - protected - - 1 - -1,-1 - wxTB_FLAT|wxTB_HORZ_TEXT - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - xpm/send20.xpm; Load From File - wxID_BUTTONSEND - wxITEM_NORMAL - Send Coins - m_tool1 - - - - OnButtonSend - - - - - - xpm/addressbook20.xpm; Load From File - wxID_BUTTONRECEIVE - wxITEM_NORMAL - Address Book - m_tool2 - - - - OnButtonAddressBook - - - - - - - - - 1 - - 1 - - 0 - wxID_ANY - - - m_statusBar - public - - - wxST_SIZEGRIP - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer2 - wxVERTICAL - none - - 5 - wxEXPAND - 0 - - 2 - protected - 0 - - - - 5 - wxEXPAND|wxRIGHT|wxLEFT - 0 - - - bSizer85 - wxHORIZONTAL - none - - 5 - wxALIGN_CENTER_VERTICAL|wxLEFT - 0 - - - - 1 - - - 0 - wxID_ANY - Your Bitcoin Address: - - - m_staticText32 - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT - 0 - - - - 1 - - - 0 - wxID_TEXTCTRLADDRESS - -1,-1 - 0 - -1,-1 - m_textCtrlAddress - public - - 340,-1 - wxTE_READONLY - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - OnKeyDown - - - - - - - - - - - OnMouseEventsAddress - - - - - - OnSetFocusAddress - - - - - - - - - - 5 - wxRIGHT|wxALIGN_CENTER_VERTICAL - 0 - - - - 0 - 1 - - - 0 - wxID_BUTTONNEW - &New... - - - m_buttonNew - protected - - -1,-1 - wxBU_EXACTFIT - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonNew - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxRIGHT - 0 - - - - 0 - 1 - - - 0 - wxID_BUTTONCOPY - &Copy to Clipboard - - - m_buttonCopy - protected - - - wxBU_EXACTFIT - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonCopy - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 0 - - 0 - protected - 0 - - - - - - 5 - wxEXPAND - 0 - - - bSizer3 - wxHORIZONTAL - none - - 5 - wxEXPAND|wxALL - 1 - - - bSizer66 - wxHORIZONTAL - none - - 5 - wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT - 0 - - - - 1 - - - 0 - wxID_ANY - Balance: - - - m_staticText41 - protected - - -1,15 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 255,255,255 - - 1 - - ,90,90,8,70,0 - 0 - wxID_ANY - - - - m_staticTextBalance - protected - - 120,15 - wxALIGN_RIGHT|wxST_NO_AUTORESIZE - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 0 - - 0 - protected - 0 - - - - 5 - wxALIGN_BOTTOM|wxTOP|wxRIGHT|wxLEFT - 0 - - - " All" " Sent" " Received" " In Progress" - - 1 - - - 1 - wxID_ANY - - - m_choiceFilter - protected - - 0 - 110,-1 - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 1 - - - - - 1 - - - 0 - wxID_ANY - - - m_notebook - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - OnNotebookPageChanged - - - - - - - - - - - All Transactions - 1 - - - - 1 - - - 0 - wxID_ANY - - - m_panel9 - protected - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - wxTAB_TRAVERSAL - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer11 - wxVERTICAL - none - - 5 - wxEXPAND - 1 - - - - 1 - - - 0 - wxID_ANY - - - m_listCtrlAll - public - - - wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_DESCENDING - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - OnListColBeginDrag - - - - - - - - - OnListItemActivated - - - - - - - - - - - - - OnPaintListCtrl - - - - - - - - - - - - - - Sent/Received - 0 - - - - 1 - - - 0 - wxID_ANY - - - m_panel91 - protected - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - wxTAB_TRAVERSAL - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer111 - wxVERTICAL - none - - 5 - wxEXPAND - 1 - - - - 1 - - - 0 - wxID_ANY - - - m_listCtrlSentReceived - public - - - wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_DESCENDING - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - OnListColBeginDrag - - - - - - - - - OnListItemActivated - - - - - - - - - - - - - OnPaintListCtrl - - - - - - - - - - - - - - Sent - 0 - - - - 1 - - - 0 - wxID_ANY - - - m_panel92 - protected - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - wxTAB_TRAVERSAL - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer112 - wxVERTICAL - none - - 5 - wxEXPAND - 1 - - - - 1 - - - 0 - wxID_ANY - - - m_listCtrlSent - public - - - wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_DESCENDING - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - OnListColBeginDrag - - - - - - - - - OnListItemActivated - - - - - - - - - - - - - OnPaintListCtrl - - - - - - - - - - - - - - Received - 0 - - - - 1 - - - 0 - wxID_ANY - - - m_panel93 - protected - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - wxTAB_TRAVERSAL - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer113 - wxVERTICAL - none - - 5 - wxEXPAND - 1 - - - - 1 - - - 0 - wxID_ANY - - - m_listCtrlReceived - public - - - wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_DESCENDING - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - OnListColBeginDrag - - - - - - - - - OnListItemActivated - - - - - - - - - - - - - OnPaintListCtrl - - - - - - - - - - - - - - - - - - - - 1 - - - - 0 - wxID_ANY - - - CTxDetailsDialogBase - - 620,450 - wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER - - Transaction Details - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer64 - wxVERTICAL - none - - 5 - wxEXPAND - 1 - - - bSizer66 - wxVERTICAL - none - - 5 - wxALL|wxEXPAND - 1 - - - - 1 - - - 0 - wxID_ANY - - - m_htmlWin - protected - - - wxHW_SCROLLBAR_AUTO - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALIGN_RIGHT - 0 - - - bSizer65 - wxHORIZONTAL - none - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_OK - OK - - - m_buttonOK - protected - - -1,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonOK - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - 0 - wxID_ANY - - - COptionsDialogBase - - 540,360 - wxDEFAULT_DIALOG_STYLE - - Options - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer55 - wxVERTICAL - none - - 9 - wxEXPAND|wxALL - 1 - - - bSizer66 - wxHORIZONTAL - none - - 5 - wxEXPAND|wxRIGHT - 0 - - - - - 1 - - - 0 - wxID_ANY - - - m_listBox - protected - - 110,-1 - wxLB_NEEDED_SB|wxLB_SINGLE - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - OnListBox - - - - - - - - - - - - - - - - - - 5 - wxEXPAND|wxLEFT - 1 - - - - 1 - - - 0 - wxID_ANY - - - m_scrolledWindow - protected - - 5 - 5 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer63 - wxVERTICAL - none - - 5 - wxEXPAND - 0 - - - - 1 - - - 0 - wxID_ANY - - - m_panelMain - protected - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - wxTAB_TRAVERSAL - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer69 - wxVERTICAL - none - - 5 - wxEXPAND - 0 - - 16 - protected - 0 - - - - 5 - wxALL - 0 - - - 0 - - 1 - - - 0 - wxID_ANY - &Start Bitcoin on system startup - - - m_checkBoxStartOnSystemStartup - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL - 0 - - - 0 - - 1 - - - 0 - wxID_ANY - &Minimize to the tray instead of the taskbar - - - m_checkBoxMinimizeToTray - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - OnCheckBoxMinimizeToTray - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL - 0 - - - 0 - - 1 - - - 0 - wxID_ANY - Map port using &UPnP - - - m_checkBoxUseUPnP - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL - 0 - - - 0 - - 1 - - - 0 - wxID_ANY - M&inimize to the tray on close - - - m_checkBoxMinimizeOnClose - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 1 - - - bSizer102 - wxHORIZONTAL - none - - 5 - wxALL|wxALIGN_CENTER_VERTICAL - 0 - - - 0 - - 1 - - - 0 - wxID_ANY - &Connect through socks4 proxy (requires restart to apply): - - - m_checkBoxUseProxy - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - OnCheckBoxUseProxy - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 1 - - - bSizer103 - wxHORIZONTAL - none - - 5 - - 0 - - 0 - protected - 18 - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL - 0 - - - - 1 - - - 0 - wxID_ANY - Proxy &IP: - - - m_staticTextProxyIP - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL - 0 - - - - 1 - - - 0 - wxID_PROXYIP - - 15 - - m_textCtrlProxyIP - protected - - 140,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - OnKillFocusProxy - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL - 0 - - - - 1 - - - 0 - wxID_ANY - &Port: - - - m_staticTextProxyPort - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL - 0 - - - - 1 - - - 0 - wxID_PROXYPORT - - 5 - - m_textCtrlProxyPort - protected - - 55,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - OnKillFocusProxy - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - - 0 - - 1 - protected - 0 - - - - 5 - wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT|wxLEFT - 0 - - - - 1 - - - 0 - wxID_ANY - Optional transaction fee per KB that helps make sure your transactions are processed quickly. Most transactions are 1KB. Fee 0.01 recommended. - - - m_staticText32 - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - 365 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 0 - - - bSizer56 - wxHORIZONTAL - none - - 5 - wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT - 0 - - - - 1 - - - 0 - wxID_ANY - Pay transaction fee: - - - m_staticText31 - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - - 1 - - - 0 - wxID_TRANSACTIONFEE - - 0 - - m_textCtrlTransactionFee - protected - - 70,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - OnKillFocusTransactionFee - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 0 - - - - 1 - - - 0 - wxID_ANY - - - m_panelTest2 - protected - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - wxTAB_TRAVERSAL - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer64 - wxVERTICAL - none - - 5 - wxEXPAND - 0 - - 16 - protected - 0 - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - - 1 - - - 0 - wxID_ANY - // [don't translate] Test panel 2 for future expansion - - - m_staticText321 - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL - 0 - - - - 1 - - - 0 - wxID_ANY - // [don't translate] Let's not start multiple pages until the first page is filled up - - - m_staticText69 - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALIGN_RIGHT - 0 - - - bSizer58 - wxHORIZONTAL - none - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_OK - OK - - - m_buttonOK - protected - - -1,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonOK - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_CANCEL - Cancel - - -1,-1 - m_buttonCancel - protected - - -1,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonCancel - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_APPLY - &Apply - - -1,-1 - m_buttonApply - protected - - -1,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonApply - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - 0 - wxID_ANY - - - CAboutDialogBase - - 532,333 - wxDEFAULT_DIALOG_STYLE - - About Bitcoin - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer63 - wxHORIZONTAL - none - - 5 - - 0 - - - xpm/about.xpm; Load From File - - 1 - - - 0 - wxID_ANY - - - m_bitmap - protected - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND|wxLEFT - 1 - - - bSizer60 - wxVERTICAL - none - - 5 - wxEXPAND - 1 - - - bSizer62 - wxHORIZONTAL - none - - 5 - wxEXPAND - 1 - - - bSizer631 - wxVERTICAL - none - - 5 - wxEXPAND - 0 - - 65 - protected - 0 - - - - 5 - wxEXPAND - 0 - - - bSizer64 - wxHORIZONTAL - none - - 5 - wxALIGN_BOTTOM|wxTOP|wxBOTTOM|wxLEFT - 0 - - - - 1 - - Tahoma,90,92,10,74,0 - 0 - wxID_ANY - Bitcoin - - - m_staticText40 - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALIGN_BOTTOM|wxTOP|wxBOTTOM|wxRIGHT - 0 - - - - 1 - - Tahoma,90,90,10,74,0 - 0 - wxID_ANY - version - - - m_staticTextVersion - public - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 0 - - 4 - protected - 0 - - - - 5 - wxALL - 0 - - - - 1 - - - 0 - wxID_ANY - Copyright (c) 2009-2011 Bitcoin Developers This is experimental software. Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. - - - m_staticTextMain - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 0 - - 0 - protected - 0 - - - - - - - - 2 - wxALIGN_RIGHT|wxEXPAND|wxRIGHT - 0 - - - bSizer61 - wxHORIZONTAL - none - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 6 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_OK - OK - - - m_buttonOK - protected - - -1,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonOK - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - 0 - wxID_ANY - - - CSendDialogBase - - 498,157 - wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER - - Send Coins - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer21 - wxVERTICAL - none - - 5 - wxEXPAND - 0 - - 5 - protected - 0 - - - - 5 - wxEXPAND|wxLEFT - 0 - - 2 - wxBOTH - 1 - - 0 - - fgSizer1 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxEXPAND - 0 - - 0 - protected - 0 - - - - 5 - wxTOP|wxRIGHT|wxLEFT - 0 - - - - 1 - - - 0 - wxID_ANY - Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L) - - - m_staticTextInstructions - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND|wxLEFT - 1 - - 70,-1 - bSizer47 - wxHORIZONTAL - none - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL - 0 - - - xpm/check.xpm; Load From File - - 1 - - - 0 - wxID_ANY - - - m_bitmapCheckMark - protected - - 16,16 - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT - 0 - - - - 1 - - - 0 - wxID_ANY - Pay &To: - - - m_staticText36 - protected - - -1,-1 - wxALIGN_RIGHT - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND|wxRIGHT - 1 - - - bSizer19 - wxHORIZONTAL - none - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 1 - - - - 1 - - - 0 - wxID_TEXTCTRLPAYTO - - 0 - - m_textCtrlAddress - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - OnKeyDown - - - - - - - - - - - - - - - - - - - OnTextAddress - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL - 0 - - - bSizer66 - wxHORIZONTAL - none - - 5 - wxALIGN_CENTER_VERTICAL|wxRIGHT|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_BUTTONPASTE - &Paste - - - m_buttonPaste - protected - - -1,-1 - wxBU_EXACTFIT - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonPaste - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxRIGHT|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_BUTTONADDRESSBOOK - Address &Book... - - - m_buttonAddress - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonAddressBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT|wxALIGN_RIGHT - 0 - - - - 1 - - - 0 - wxID_ANY - &Amount: - - - m_staticText19 - protected - - -1,-1 - wxALIGN_RIGHT - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - - 1 - - ,90,90,-1,70,0 - 0 - wxID_TEXTCTRLAMOUNT - - 20 - - m_textCtrlAmount - protected - - 145,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - OnKeyDown - - OnKillFocusAmount - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT - 0 - - - - 1 - - - 1 - wxID_ANY - T&ransfer: - - - m_staticText20 - protected - - -1,-1 - wxALIGN_RIGHT - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - - " Standard" - - 1 - - - 1 - wxID_CHOICETRANSFERTYPE - - - m_choiceTransferType - protected - - 0 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 0 - - 3 - protected - 0 - - - - 5 - wxEXPAND - 0 - - 0 - protected - 0 - - - - - - 5 - wxEXPAND - 0 - - - bSizer672 - wxHORIZONTAL - none - - - - 5 - wxEXPAND - 0 - - - bSizer23 - wxHORIZONTAL - none - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - ,90,90,-1,70,0 - 0 - wxID_BUTTONSEND - &Send - - -1,-1 - m_buttonSend - protected - - -1,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonSend - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_CANCEL - Cancel - - -1,-1 - m_buttonCancel - protected - - -1,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonCancel - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - 0 - wxID_ANY - - - CSendingDialogBase - - 442,151 - wxDEFAULT_DIALOG_STYLE - - Sending... - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - OnClose - - - - - - - - - - - - - - - - - - - - OnPaint - - - - - - - - - bSizer68 - wxVERTICAL - none - - 8 - wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT - 0 - - - - 1 - - - 0 - wxID_ANY - - - - m_staticTextSending - protected - - -1,14 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 10 - wxEXPAND|wxRIGHT|wxLEFT - 1 - - wxSYS_COLOUR_BTNFACE - - 1 - - - 0 - wxID_ANY - - 0 - - m_textCtrlStatus - protected - - - wxTE_CENTRE|wxTE_MULTILINE|wxTE_NO_VSCROLL|wxTE_READONLY - - - - wxFILTER_NONE - wxDefaultValidator - - Connecting... - - - wxNO_BORDER - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 0 - - - bSizer69 - wxHORIZONTAL - none - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 0 - - - 0 - wxID_ANY - OK - - -1,-1 - m_buttonOK - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonOK - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_CANCEL - Cancel - - -1,-1 - m_buttonCancel - protected - - -1,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonCancel - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - 0 - wxID_ANY - - - CYourAddressDialogBase - - 610,390 - wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER - - Your Bitcoin Addresses - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - OnClose - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer68 - wxVERTICAL - none - - 5 - wxEXPAND - 0 - - 5 - protected - 0 - - - - 5 - wxALL - 0 - - - - 1 - - - 0 - wxID_ANY - These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. The highlighted address is displayed in the main window. - - - m_staticText45 - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - 590 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxEXPAND - 1 - - - - 1 - - - 0 - wxID_LISTCTRL - - - m_listCtrl - protected - - - wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_ASCENDING - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - OnListEndLabelEdit - - OnListItemActivated - - - - - OnListItemSelected - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 0 - - - bSizer69 - wxHORIZONTAL - none - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_BUTTONRENAME - &Edit... - - -1,-1 - m_buttonRename - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonRename - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_BUTTONNEW - &New Address... - - -1,-1 - m_buttonNew - protected - - -1,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonNew - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_BUTTONCOPY - &Copy to Clipboard - - -1,-1 - m_buttonCopy - protected - - -1,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonCopy - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_OK - OK - - -1,-1 - m_buttonOK - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonOK - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 1 - wxID_CANCEL - Cancel - - -1,-1 - m_buttonCancel - protected - - -1,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonCancel - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - 0 - wxID_ANY - - - CAddressBookDialogBase - - 610,390 - wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER - - Address Book - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - OnClose - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer58 - wxVERTICAL - none - - 5 - wxEXPAND|wxTOP|wxRIGHT|wxLEFT - 1 - - - - - 1 - - - 0 - wxID_ANY - - - m_notebook - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - OnNotebookPageChanged - - - - - - - - - - - Sending - 0 - - - - 1 - - - 0 - wxID_PANELSENDING - - - m_panelSending - protected - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - wxTAB_TRAVERSAL - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer68 - wxVERTICAL - none - - 5 - wxEXPAND - 0 - - 0 - protected - 0 - - - - 5 - wxTOP|wxRIGHT|wxLEFT - 0 - - - - 1 - - - 1 - wxID_ANY - Bitcoin Address - - - m_staticText55 - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxEXPAND - 1 - - - - 1 - - - 0 - wxID_LISTCTRLSENDING - - - m_listCtrlSending - protected - - - wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_ASCENDING - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - OnListEndLabelEdit - - OnListItemActivated - - - - - OnListItemSelected - - - - - - - - - - - - - - - - - - - - - - Receiving - 1 - - - - 1 - - - 0 - wxID_PANELRECEIVING - - - m_panelReceiving - protected - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - wxTAB_TRAVERSAL - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer681 - wxVERTICAL - none - - 5 - wxEXPAND - 0 - - 0 - protected - 0 - - - - 6 - wxTOP|wxRIGHT|wxLEFT - 0 - - - - 1 - - - 0 - wxID_ANY - These are your Bitcoin addresses for receiving payments. You can give a different one to each sender to keep track of who is paying you. The highlighted address will be displayed in the main window. - - - m_staticText45 - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - 570 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 0 - - 2 - protected - 0 - - - - 5 - wxALL|wxEXPAND - 1 - - - - 1 - - - 0 - wxID_LISTCTRLRECEIVING - - - m_listCtrlReceiving - protected - - - wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_ASCENDING - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - OnListEndLabelEdit - - OnListItemActivated - - - - - OnListItemSelected - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 0 - - - bSizer69 - wxHORIZONTAL - none - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_BUTTONDELETE - &Delete - - -1,-1 - m_buttonDelete - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonDelete - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_BUTTONCOPY - &Copy to Clipboard - - -1,-1 - m_buttonCopy - protected - - -1,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonCopy - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_BUTTONEDIT - &Edit... - - -1,-1 - m_buttonEdit - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonEdit - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_BUTTONNEW - &New Address... - - -1,-1 - m_buttonNew - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonNew - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_OK - OK - - -1,-1 - m_buttonOK - protected - - -1,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonOK - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_CANCEL - Cancel - - -1,-1 - m_buttonCancel - public - - -1,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonCancel - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - 0 - wxID_ANY - - - CGetTextFromUserDialogBase - - 440,138 - wxDEFAULT_DIALOG_STYLE - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - OnClose - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer79 - wxVERTICAL - none - - 10 - wxEXPAND|wxALL - 1 - - - bSizer81 - wxVERTICAL - none - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 5 - wxTOP|wxRIGHT|wxLEFT - 0 - - - - 1 - - - 0 - wxID_ANY - - - - m_staticTextMessage1 - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL - 0 - - - - 1 - - - 0 - wxID_TEXTCTRL - - 0 - - m_textCtrl1 - protected - - - wxTE_PROCESS_ENTER - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - OnKeyDown - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxTOP|wxRIGHT|wxLEFT - 0 - - - - 1 - - - 1 - wxID_ANY - - - - m_staticTextMessage2 - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL - 0 - - - - 1 - - - 1 - wxID_TEXTCTRL - - 0 - - m_textCtrl2 - protected - - - wxTE_PROCESS_ENTER - - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - OnKeyDown - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - - - 5 - wxEXPAND - 0 - - - bSizer80 - wxHORIZONTAL - none - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_OK - OK - - -1,-1 - m_buttonOK - protected - - -1,-1 - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonOK - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - - 0 - 1 - - - 0 - wxID_CANCEL - Cancel - - -1,-1 - m_buttonCancel - protected - - - - - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnButtonCancel - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp index f111ad2e1..5a1fab694 100644 --- a/src/bitcoinrpc.cpp +++ b/src/bitcoinrpc.cpp @@ -64,11 +64,7 @@ void PrintConsole(const std::string &format, ...) buffer[limit-1] = 0; } printf("%s", buffer); -#if defined(__WXMSW__) && defined(GUI) - MyMessageBox(buffer, "Bitcoin", wxOK | wxICON_EXCLAMATION); -#else fprintf(stdout, "%s", buffer); -#endif } @@ -2357,13 +2353,7 @@ int CommandLineRPC(int argc, char *argv[]) if (strPrint != "") { -#if defined(__WXMSW__) && defined(GUI) - // Windows GUI apps can't print to command line, - // so settle for a message box yuck - MyMessageBox(strPrint, "Bitcoin", wxOK); -#else fprintf((nRet == 0 ? stdout : stderr), "%s\n", strPrint.c_str()); -#endif } return nRet; } diff --git a/src/db.cpp b/src/db.cpp index a22b17e34..f2363647a 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -822,7 +822,7 @@ int CWalletDB::LoadWallet(CWallet* pwallet) ssKey >> strKey; // Options -#ifndef GUI +#ifndef QT_GUI if (strKey == "fGenerateBitcoins") ssValue >> fGenerateBitcoins; #endif if (strKey == "nTransactionFee") ssValue >> nTransactionFee; diff --git a/src/headers.h b/src/headers.h index 5e39eccb0..17e9b3bc5 100644 --- a/src/headers.h +++ b/src/headers.h @@ -27,14 +27,6 @@ #define BSD 1 #endif #endif -#ifdef GUI -#include -#include -#include -#include -#include -#include -#endif #include #include #include @@ -95,28 +87,8 @@ #include "bignum.h" #include "base58.h" #include "main.h" -#ifdef GUI -#include "uibase.h" -#include "ui.h" -#else #ifdef QT_GUI #include "qtui.h" #else #include "noui.h" #endif -#endif - -#ifdef GUI -#include "xpm/addressbook16.xpm" -#include "xpm/addressbook20.xpm" -#include "xpm/bitcoin16.xpm" -#include "xpm/bitcoin20.xpm" -#include "xpm/bitcoin32.xpm" -#include "xpm/bitcoin48.xpm" -#include "xpm/bitcoin80.xpm" -#include "xpm/check.xpm" -#include "xpm/send16.xpm" -#include "xpm/send16noshadow.xpm" -#include "xpm/send20.xpm" -#include "xpm/about.xpm" -#endif diff --git a/src/init.cpp b/src/init.cpp index a1835c903..f09e1d019 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -80,7 +80,7 @@ void HandleSIGTERM(int) // // Start // -#if !defined(QT_GUI) && !defined(GUI) +#if !defined(QT_GUI) int main(int argc, char* argv[]) { bool fRet = false; @@ -216,14 +216,9 @@ bool AppInit2(int argc, char* argv[]) strUsage += string() + " -? \t\t " + _("This help message\n"); -#if defined(__WXMSW__) && defined(GUI) - // Tabs make the columns line up in the message box - wxMessageBox(strUsage, "Bitcoin", wxOK); -#else // Remove tabs strUsage.erase(std::remove(strUsage.begin(), strUsage.end(), '\t'), strUsage.end()); fprintf(stderr, "%s", strUsage.c_str()); -#endif return false; } @@ -242,7 +237,7 @@ bool AppInit2(int argc, char* argv[]) fServer = GetBoolArg("-server"); /* force fServer when running without GUI */ -#if !defined(QT_GUI) && !defined(GUI) +#if !defined(QT_GUI) fServer = true; #endif fPrintToConsole = GetBoolArg("-printtoconsole"); @@ -291,11 +286,6 @@ bool AppInit2(int argc, char* argv[]) ShrinkDebugFile(); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); printf("Bitcoin version %s\n", FormatFullVersion().c_str()); -#ifdef GUI - printf("OS version %s\n", ((string)wxGetOsDescription()).c_str()); - printf("System default language is %d %s\n", g_locale.GetSystemLanguage(), ((string)g_locale.GetSysName()).c_str()); - printf("Language file %s (%s)\n", (string("locale/") + (string)g_locale.GetCanonicalName() + "/LC_MESSAGES/bitcoin.mo").c_str(), ((string)g_locale.GetLocale()).c_str()); -#endif printf("Default data directory %s\n", GetDefaultDataDir().c_str()); if (GetBoolArg("-loadblockindextest")) @@ -306,46 +296,6 @@ bool AppInit2(int argc, char* argv[]) return false; } - // - // Limit to single instance per user - // Required to protect the database files if we're going to keep deleting log.* - // -#if defined(__WXMSW__) && defined(GUI) - // wxSingleInstanceChecker doesn't work on Linux - wxString strMutexName = wxString("bitcoin_running.") + getenv("HOMEPATH"); - for (int i = 0; i < strMutexName.size(); i++) - if (!isalnum(strMutexName[i])) - strMutexName[i] = '.'; - wxSingleInstanceChecker* psingleinstancechecker = new wxSingleInstanceChecker(strMutexName); - if (psingleinstancechecker->IsAnotherRunning()) - { - printf("Existing instance found\n"); - unsigned int nStart = GetTime(); - loop - { - // Show the previous instance and exit - HWND hwndPrev = FindWindowA("wxWindowClassNR", "Bitcoin"); - if (hwndPrev) - { - if (IsIconic(hwndPrev)) - ShowWindow(hwndPrev, SW_RESTORE); - SetForegroundWindow(hwndPrev); - return false; - } - - if (GetTime() > nStart + 60) - return false; - - // Resume this instance if the other exits - delete psingleinstancechecker; - Sleep(1000); - psingleinstancechecker = new wxSingleInstanceChecker(strMutexName); - if (!psingleinstancechecker->IsAnotherRunning()) - break; - } - } -#endif - // Make sure only a single bitcoin process is using the data directory. string strLockFile = GetDataDir() + "/.lock"; FILE* file = fopen(strLockFile.c_str(), "a"); // empty lock file; created if it doesn't exist. @@ -538,13 +488,8 @@ bool AppInit2(int argc, char* argv[]) } // - // Create the main window and start the node + // Start the node // -#ifdef GUI - if (!fDaemon) - CreateMainWindow(); -#endif - if (!CheckDiskSpace()) return false; @@ -556,12 +501,7 @@ bool AppInit2(int argc, char* argv[]) if (fServer) CreateThread(ThreadRPCServer, NULL); -#if defined(__WXMSW__) && defined(GUI) - if (fFirstRun) - SetStartOnSystemStartup(true); -#endif - -#if !defined(QT_GUI) && !defined(GUI) +#if !defined(QT_GUI) while (1) Sleep(5000); #endif diff --git a/src/makefile.linux-mingw b/src/makefile.linux-mingw index cae82f8cf..9c3c23558 100644 --- a/src/makefile.linux-mingw +++ b/src/makefile.linux-mingw @@ -10,18 +10,12 @@ INCLUDEPATHS= \ -I"$(DEPSDIR)/boost_1_47_0" \ -I"$(DEPSDIR)/db-4.8.30.NC/build_unix" \ -I"$(DEPSDIR)/openssl-1.0.0d/include" \ - -I"$(DEPSDIR)/wxWidgets-2.9.2/lib/gcc_lib/mswud" \ - -I"$(DEPSDIR)/wxWidgets-2.9.2/include" \ - -I"$(DEPSDIR)/wxWidgets-2.9.2/lib/wx/include/i586-mingw32msvc-msw-unicode-static-2.9/" \ -I"$(DEPSDIR)" LIBPATHS= \ -L"$(DEPSDIR)/boost_1_47_0/stage/lib" \ -L"$(DEPSDIR)/db-4.8.30.NC/build_unix" \ - -L"$(DEPSDIR)/openssl-1.0.0d" \ - -L"$(DEPSDIR)/wxWidgets-2.9.2/lib" - -WXLIBS= -l wx_mswu-2.9-i586-mingw32msvc + -L"$(DEPSDIR)/openssl-1.0.0d" LIBS= \ -l boost_system-mt-s \ @@ -32,8 +26,8 @@ LIBS= \ -l ssl \ -l crypto -DEFS=-D_MT -DWIN32 -D__WXMSW__ -D_WINDOWS -DNOPCH -DUSE_SSL -DBOOST_THREAD_USE_LIB -DEBUGFLAGS=-g -D__WXDEBUG__ +DEFS=-D_MT -DWIN32 -D_WINDOWS -DNOPCH -DUSE_SSL -DBOOST_THREAD_USE_LIB +DEBUGFLAGS=-g CFLAGS=-O2 -w -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(DEFS) $(INCLUDEPATHS) HEADERS = \ base58.h \ @@ -53,8 +47,6 @@ HEADERS = \ script.h \ serialize.h \ strlcpy.h \ - ui.h \ - uibase.h \ uint256.h \ util.h \ wallet.h @@ -84,20 +76,7 @@ OBJS= \ cryptopp/obj/cpu.o -all: bitcoin.exe - - -obj/%.o: %.cpp $(HEADERS) - i586-mingw32msvc-g++ -c $(CFLAGS) -DGUI -o $@ $< - -cryptopp/obj/%.o: cryptopp/%.cpp - i586-mingw32msvc-g++ -c $(CFLAGS) -O3 -DCRYPTOPP_DISABLE_ASM -o $@ $< - -obj/ui_res.o: ../share/ui.rc ../share/pixmaps/bitcoin.ico ../share/pixmaps/check.ico ../share/pixmaps/send16.bmp ../share/pixmaps/send16mask.bmp ../share/pixmaps/send16masknoshadow.bmp ../share/pixmaps/send20.bmp ../share/pixmaps/send20mask.bmp ../share/pixmaps/addressbook16.bmp ../share/pixmaps/addressbook16mask.bmp ../share/pixmaps/addressbook20.bmp ../share/pixmaps/addressbook20mask.bmp - i586-mingw32msvc-windres $(DEFS) $(INCLUDEPATHS) -o $@ -i $< - -bitcoin.exe: $(OBJS) obj/ui.o obj/uibase.o obj/ui_res.o - i586-mingw32msvc-g++ $(CFLAGS) -mwindows -Wl,--subsystem,windows -o $@ $(LIBPATHS) $^ $(WXLIBS) $(LIBS) +all: bitcoind.exe obj/nogui/%.o: %.cpp $(HEADERS) @@ -121,6 +100,5 @@ clean: -rm -f cryptopp/obj/*.o -rm -f test/*.o -rm -f headers.h.gch - -rm -f bitcoin.exe -rm -f bitcoind.exe -rm -f test_bitcoin.exe diff --git a/src/makefile.mingw b/src/makefile.mingw index 5aa5ebab4..87225761b 100644 --- a/src/makefile.mingw +++ b/src/makefile.mingw @@ -7,18 +7,12 @@ USE_UPNP:=0 INCLUDEPATHS= \ -I"C:\boost-1.47.0-mgw" \ -I"C:\db-4.8.30.NC-mgw\build_unix" \ - -I"C:\openssl-1.0.0d-mgw\include" \ - -I"C:\wxWidgets-2.9.2-mgw\lib\gcc_lib\mswud" \ - -I"C:\wxWidgets-2.9.2-mgw\include" + -I"C:\openssl-1.0.0d-mgw\include" LIBPATHS= \ -L"C:\boost-1.47.0-mgw\stage\lib" \ -L"C:\db-4.8.30.NC-mgw\build_unix" \ - -L"C:\openssl-1.0.0d-mgw" \ - -L"C:\wxWidgets-2.9.2-mgw\lib\gcc_lib" - -WXLIBS= \ - -l wxmsw29ud_html -l wxmsw29ud_core -l wxmsw29ud_adv -l wxbase29ud -l wxtiffd -l wxjpegd -l wxpngd -l wxzlibd + -L"C:\openssl-1.0.0d-mgw" LIBS= \ -l boost_system-mgw45-mt-s-1_47 \ @@ -29,8 +23,8 @@ LIBS= \ -l ssl \ -l crypto -DEFS=-DWIN32 -D__WXMSW__ -D_WINDOWS -DNOPCH -DUSE_SSL -DBOOST_THREAD_USE_LIB -DEBUGFLAGS=-g -D__WXDEBUG__ +DEFS=-DWIN32 -D_WINDOWS -DNOPCH -DUSE_SSL -DBOOST_THREAD_USE_LIB +DEBUGFLAGS=-g CFLAGS=-mthreads -O2 -w -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(DEFS) $(INCLUDEPATHS) HEADERS = \ base58.h \ @@ -50,8 +44,6 @@ HEADERS = \ script.h \ serialize.h \ strlcpy.h \ - ui.h \ - uibase.h \ uint256.h \ util.h \ wallet.h @@ -82,20 +74,7 @@ OBJS= \ cryptopp/obj/cpu.o -all: bitcoin.exe - - -obj/%.o: %.cpp $(HEADERS) - g++ -c $(CFLAGS) -DGUI -o $@ $< - -cryptopp/obj/%.o: cryptopp/%.cpp - g++ -c $(CFLAGS) -O3 -DCRYPTOPP_X86_ASM_AVAILABLE -o $@ $< - -obj/ui_res.o: ../share/ui.rc ../share/pixmaps/bitcoin.ico ../share/pixmaps/check.ico ../share/pixmaps/send16.bmp ../share/pixmaps/send16mask.bmp ../share/pixmaps/send16masknoshadow.bmp ../share/pixmaps/send20.bmp ../share/pixmaps/send20mask.bmp ../share/pixmaps/addressbook16.bmp ../share/pixmaps/addressbook16mask.bmp ../share/pixmaps/addressbook20.bmp ../share/pixmaps/addressbook20mask.bmp - windres $(DEFS) $(INCLUDEPATHS) -o $@ -i $< - -bitcoin.exe: $(OBJS) obj/ui.o obj/uibase.o obj/ui_res.o - g++ $(CFLAGS) -mwindows -Wl,--subsystem,windows -o $@ $(LIBPATHS) $^ $(WXLIBS) $(LIBS) +all: bitcoind.exe obj/nogui/%.o: %.cpp $(HEADERS) @@ -111,7 +90,7 @@ test_bitcoin.exe: obj/test/test_bitcoin.o $(filter-out obj/nogui/init.o,$(OBJS:o g++ $(CFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS) clean: - -del /Q bitcoin bitcoind test_bitcoin + -del /Q bitcoind test_bitcoin -del /Q obj\* -del /Q obj\nogui\* -del /Q obj\test\* diff --git a/src/makefile.osx b/src/makefile.osx index 9dce3f3af..aff1e5f31 100644 --- a/src/makefile.osx +++ b/src/makefile.osx @@ -14,8 +14,6 @@ INCLUDEPATHS= \ LIBPATHS= \ -L"$(DEPSDIR)/lib" -WXLIBS=$(shell $(DEPSDIR)/bin/wx-config --libs --static) - USE_UPNP:=0 LIBS= -dead_strip \ @@ -27,9 +25,9 @@ LIBS= -dead_strip \ $(DEPSDIR)/lib/libssl.a \ $(DEPSDIR)/lib/libcrypto.a -DEFS=$(shell $(DEPSDIR)/bin/wx-config --cxxflags) -D__WXMAC_OSX__ -DNOPCH -DMSG_NOSIGNAL=0 -DUSE_SSL +DEFS=-D__WXMAC_OSX__ -DNOPCH -DMSG_NOSIGNAL=0 -DUSE_SSL -DEBUGFLAGS=-g -DwxDEBUG_LEVEL=0 +DEBUGFLAGS=-g # ppc doesn't work because we don't support big-endian CFLAGS=-mmacosx-version-min=10.5 -arch i386 -arch x86_64 -O3 -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(DEFS) $(INCLUDEPATHS) HEADERS = \ @@ -50,8 +48,6 @@ HEADERS = \ script.h \ serialize.h \ strlcpy.h \ - ui.h \ - uibase.h \ uint256.h \ util.h \ wallet.h @@ -78,17 +74,7 @@ ifdef USE_UPNP endif -all: bitcoin - - -obj/%.o: %.cpp $(HEADERS) - $(CXX) -c $(CFLAGS) -DGUI -o $@ $< - -cryptopp/obj/%.o: cryptopp/%.cpp - $(CXX) -c $(CFLAGS) -O3 -DCRYPTOPP_DISABLE_ASM -o $@ $< - -bitcoin: $(OBJS) obj/ui.o obj/uibase.o - $(CXX) $(CFLAGS) -o $@ $(LIBPATHS) $^ $(WXLIBS) $(LIBS) +all: bitcoind obj/nogui/%.o: %.cpp $(HEADERS) @@ -104,7 +90,7 @@ test_bitcoin: obj/test/test_bitcoin.o $(filter-out obj/nogui/init.o,$(OBJS:obj/% $(CXX) $(CFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS) -lboost_unit_test_framework clean: - -rm -f bitcoin bitcoind test_bitcoin + -rm -f bitcoind test_bitcoin -rm -f obj/*.o -rm -f obj/nogui/*.o -rm -f obj/test/*.o diff --git a/src/makefile.unix b/src/makefile.unix index b893853fd..88ca8895f 100644 --- a/src/makefile.unix +++ b/src/makefile.unix @@ -4,10 +4,6 @@ CXX=g++ -WXINCLUDEPATHS=$(shell wx-config --cxxflags) - -WXLIBS=$(shell wx-config --libs) - USE_UPNP:=0 DEFS=-DNOPCH -DUSE_SSL @@ -64,7 +60,7 @@ LIBS+= \ # -DEBUGFLAGS=-g -D__WXDEBUG__ +DEBUGFLAGS=-g CXXFLAGS=-O2 -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(DEFS) $(HARDENING) HEADERS = \ base58.h \ @@ -84,8 +80,6 @@ HEADERS = \ script.h \ serialize.h \ strlcpy.h \ - ui.h \ - uibase.h \ uint256.h \ util.h \ wallet.h @@ -107,17 +101,7 @@ OBJS= \ cryptopp/obj/cpu.o -all: bitcoin - - -obj/%.o: %.cpp $(HEADERS) - $(CXX) -c $(CXXFLAGS) $(WXINCLUDEPATHS) -DGUI -o $@ $< - -cryptopp/obj/%.o: cryptopp/%.cpp - $(CXX) -c $(CXXFLAGS) -O3 -o $@ $< - -bitcoin: $(OBJS) obj/ui.o obj/uibase.o - $(CXX) $(CXXFLAGS) -o $@ $^ $(WXLIBS) $(LIBS) +all: bitcoind obj/nogui/%.o: %.cpp $(HEADERS) @@ -133,7 +117,7 @@ test_bitcoin: obj/test/test_bitcoin.o $(filter-out obj/nogui/init.o,$(OBJS:obj/% $(CXX) $(CXXFLAGS) -o $@ $(LIBPATHS) $^ -Wl,-Bstatic -lboost_unit_test_framework $(LIBS) clean: - -rm -f bitcoin bitcoind test_bitcoin + -rm -f bitcoind test_bitcoin -rm -f obj/*.o -rm -f obj/nogui/*.o -rm -f obj/test/*.o diff --git a/src/makefile.vc b/src/makefile.vc index 5d283793c..accc762b5 100644 --- a/src/makefile.vc +++ b/src/makefile.vc @@ -7,25 +7,20 @@ INCLUDEPATHS= \ /I"/boost" \ /I"/db/build_windows" \ /I"/openssl/include" \ - /I"/wxwidgets/lib/vc_lib/mswu" \ - /I"/wxwidgets/include" / /I"/miniupnpc" LIBPATHS= \ /LIBPATH:"/boost/stage/lib" \ /LIBPATH:"/db/build_windows/Release" \ /LIBPATH:"/openssl/lib" \ - /LIBPATH:"/wxwidgets/lib/vc_lib" \ /LIBPATH:"/miniupnpc/msvc/Release" \ /NODEFAULTLIB:libc.lib /NODEFAULTLIB:libcmt.lib \ /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:libcmtd.lib \ /NODEFAULTLIB:msvcrtd.lib -WXLIBS=wxmsw29u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib - USE_UPNP=0 -DEFS=/DWIN32 /D__WXMSW__ /D_WINDOWS /DNOPCH /DNOMINMAX +DEFS=/DWIN32 /D_WINDOWS /DNOPCH /DNOMINMAX LIBS= \ libboost_system-vc100-mt.lib \ @@ -92,7 +87,7 @@ CRYPTOPP_OBJS= \ RC=../share -all: bitcoin.exe +all: bitcoind.exe .cpp{obj}.obj: @@ -130,13 +125,6 @@ cryptopp\obj\sha.obj: cryptopp\sha.cpp cryptopp\obj\cpu.obj: cryptopp\cpu.cpp cl $(CFLAGS) /O2 /DCRYPTOPP_DISABLE_ASM /Fo$@ %s -obj\ui.res: $(RC)/ui.rc $(RC)/pixmaps/bitcoin.ico $(RC)/pixmaps/check.ico $(RC)/pixmaps/send16.bmp $(RC)/pixmaps/send16mask.bmp $(RC)/pixmaps/send16masknoshadow.bmp $(RC)/pixmaps/send20.bmp $(RC)/pixmaps/send20mask.bmp $(RC)/pixmaps/addressbook16.bmp $(RC)/pixmaps/addressbook16mask.bmp $(RC)/pixmaps/addressbook20.bmp $(RC)/pixmaps/addressbook20mask.bmp - rc $(INCLUDEPATHS) $(DEFS) /Fo$@ %s - -bitcoin.exe: $(OBJS) $(CRYPTOPP_OBJS) obj\ui.obj obj\uibase.obj obj\ui.res - link /nologo /SUBSYSTEM:WINDOWS /OUT:$@ $(LIBPATHS) $** $(WXLIBS) $(LIBS) - - .cpp{obj\nogui}.obj: cl $(CFLAGS) /Fo$@ %s @@ -163,10 +151,10 @@ obj\nogui\init.obj: $(HEADERS) bitcoind.exe: $(OBJS:obj\=obj\nogui\) $(CRYPTOPP_OBJS) obj\ui.res link /nologo /OUT:$@ $(LIBPATHS) $** $(LIBS) - clean: -del /Q obj\* -del /Q obj\nogui\* -del /Q cryptopp\obj\* -del /Q *.ilk -del /Q *.pdb + -del /Q bitcoind.exe diff --git a/src/ui.cpp b/src/ui.cpp deleted file mode 100644 index 6b7ecdbc8..000000000 --- a/src/ui.cpp +++ /dev/null @@ -1,3221 +0,0 @@ -// Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying -// file license.txt or http://www.opensource.org/licenses/mit-license.php. - -#include "headers.h" -#include "db.h" -#include "init.h" -#include "strlcpy.h" -#include -#include -#ifdef _MSC_VER -#include -#endif - -using namespace std; -using namespace boost; - - -DEFINE_EVENT_TYPE(wxEVT_UITHREADCALL) - -CMainFrame* pframeMain = NULL; -CMyTaskBarIcon* ptaskbaricon = NULL; -bool fClosedToTray = false; -wxLocale g_locale; - -#ifdef __WXMSW__ -double nScaleX = 1.0; -double nScaleY = 1.0; -#else -static const double nScaleX = 1.0; -static const double nScaleY = 1.0; -#endif - - - - - - - - -////////////////////////////////////////////////////////////////////////////// -// -// Util -// - -void HandleCtrlA(wxKeyEvent& event) -{ - // Ctrl-a select all - event.Skip(); - wxTextCtrl* textCtrl = (wxTextCtrl*)event.GetEventObject(); - if (event.GetModifiers() == wxMOD_CONTROL && event.GetKeyCode() == 'A') - textCtrl->SetSelection(-1, -1); -} - -bool Is24HourTime() -{ - //char pszHourFormat[256]; - //pszHourFormat[0] = '\0'; - //GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ITIME, pszHourFormat, 256); - //return (pszHourFormat[0] != '0'); - return true; -} - -string DateStr(int64 nTime) -{ - // Can only be used safely here in the UI - return (string)wxDateTime((time_t)nTime).FormatDate(); -} - -string DateTimeStr(int64 nTime) -{ - // Can only be used safely here in the UI - wxDateTime datetime((time_t)nTime); - if (Is24HourTime()) - return (string)datetime.Format("%x %H:%M"); - else - return (string)datetime.Format("%x ") + itostr((datetime.GetHour() + 11) % 12 + 1) + (string)datetime.Format(":%M %p"); -} - -wxString GetItemText(wxListCtrl* listCtrl, int nIndex, int nColumn) -{ - // Helper to simplify access to listctrl - wxListItem item; - item.m_itemId = nIndex; - item.m_col = nColumn; - item.m_mask = wxLIST_MASK_TEXT; - if (!listCtrl->GetItem(item)) - return ""; - return item.GetText(); -} - -int InsertLine(wxListCtrl* listCtrl, const wxString& str0, const wxString& str1) -{ - int nIndex = listCtrl->InsertItem(listCtrl->GetItemCount(), str0); - listCtrl->SetItem(nIndex, 1, str1); - return nIndex; -} - -int InsertLine(wxListCtrl* listCtrl, const wxString& str0, const wxString& str1, const wxString& str2, const wxString& str3, const wxString& str4) -{ - int nIndex = listCtrl->InsertItem(listCtrl->GetItemCount(), str0); - listCtrl->SetItem(nIndex, 1, str1); - listCtrl->SetItem(nIndex, 2, str2); - listCtrl->SetItem(nIndex, 3, str3); - listCtrl->SetItem(nIndex, 4, str4); - return nIndex; -} - -int InsertLine(wxListCtrl* listCtrl, void* pdata, const wxString& str0, const wxString& str1, const wxString& str2, const wxString& str3, const wxString& str4) -{ - int nIndex = listCtrl->InsertItem(listCtrl->GetItemCount(), str0); - listCtrl->SetItemPtrData(nIndex, (wxUIntPtr)pdata); - listCtrl->SetItem(nIndex, 1, str1); - listCtrl->SetItem(nIndex, 2, str2); - listCtrl->SetItem(nIndex, 3, str3); - listCtrl->SetItem(nIndex, 4, str4); - return nIndex; -} - -void SetItemTextColour(wxListCtrl* listCtrl, int nIndex, const wxColour& colour) -{ - // Repaint on Windows is more flickery if the colour has ever been set, - // so don't want to set it unless it's different. Default colour has - // alpha 0 transparent, so our colours don't match using operator==. - wxColour c1 = listCtrl->GetItemTextColour(nIndex); - if (!c1.IsOk()) - c1 = wxColour(0,0,0); - if (colour.Red() != c1.Red() || colour.Green() != c1.Green() || colour.Blue() != c1.Blue()) - listCtrl->SetItemTextColour(nIndex, colour); -} - -void SetSelection(wxListCtrl* listCtrl, int nIndex) -{ - int nSize = listCtrl->GetItemCount(); - long nState = (wxLIST_STATE_SELECTED|wxLIST_STATE_FOCUSED); - for (int i = 0; i < nSize; i++) - listCtrl->SetItemState(i, (i == nIndex ? nState : 0), nState); -} - -int GetSelection(wxListCtrl* listCtrl) -{ - int nSize = listCtrl->GetItemCount(); - for (int i = 0; i < nSize; i++) - if (listCtrl->GetItemState(i, wxLIST_STATE_FOCUSED)) - return i; - return -1; -} - -string HtmlEscape(const char* psz, bool fMultiLine=false) -{ - int len = 0; - for (const char* p = psz; *p; p++) - { - if (*p == '<') len += 4; - else if (*p == '>') len += 4; - else if (*p == '&') len += 5; - else if (*p == '"') len += 6; - else if (*p == ' ' && p > psz && p[-1] == ' ' && p[1] == ' ') len += 6; - else if (*p == '\n' && fMultiLine) len += 5; - else - len++; - } - string str; - str.reserve(len); - for (const char* p = psz; *p; p++) - { - if (*p == '<') str += "<"; - else if (*p == '>') str += ">"; - else if (*p == '&') str += "&"; - else if (*p == '"') str += """; - else if (*p == ' ' && p > psz && p[-1] == ' ' && p[1] == ' ') str += " "; - else if (*p == '\n' && fMultiLine) str += "
\n"; - else - str += *p; - } - return str; -} - -string HtmlEscape(const string& str, bool fMultiLine=false) -{ - return HtmlEscape(str.c_str(), fMultiLine); -} - -void CalledMessageBox(const string& message, const string& caption, int style, wxWindow* parent, int x, int y, int* pnRet, bool* pfDone) -{ - *pnRet = wxMessageBox(message, caption, style, parent, x, y); - *pfDone = true; -} - -int ThreadSafeMessageBox(const string& message, const string& caption, int style, wxWindow* parent, int x, int y) -{ -#ifdef __WXMSW__ - return wxMessageBox(message, caption, style, parent, x, y); -#else - if (wxThread::IsMain() || fDaemon) - { - return wxMessageBox(message, caption, style, parent, x, y); - } - else - { - int nRet = 0; - bool fDone = false; - UIThreadCall(bind(CalledMessageBox, message, caption, style, parent, x, y, &nRet, &fDone)); - while (!fDone) - Sleep(100); - return nRet; - } -#endif -} - -bool ThreadSafeAskFee(int64 nFeeRequired, const string& strCaption, wxWindow* parent) -{ - if (nFeeRequired < MIN_TX_FEE || nFeeRequired <= nTransactionFee || fDaemon) - return true; - string strMessage = strprintf( - _("This transaction is over the size limit. You can still send it for a fee of %s, " - "which goes to the nodes that process your transaction and helps to support the network. " - "Do you want to pay the fee?"), - FormatMoney(nFeeRequired).c_str()); - return (ThreadSafeMessageBox(strMessage, strCaption, wxYES_NO, parent) == wxYES); -} - -void CalledSetStatusBar(const string& strText, int nField) -{ - if (nField == 0 && GetWarnings("statusbar") != "") - return; - if (pframeMain && pframeMain->m_statusBar) - pframeMain->m_statusBar->SetStatusText(strText, nField); -} - -void SetDefaultReceivingAddress(const string& strAddress) -{ - // Update main window address and database - if (pframeMain == NULL) - return; - if (strAddress != pframeMain->m_textCtrlAddress->GetValue()) - { - CBitcoinAddress address(strAddress); - if (!address.IsValid()) - return; - vector vchPubKey; - if (!pwalletMain->GetPubKey(address, vchPubKey)) - return; - pwalletMain->SetDefaultKey(vchPubKey); - pframeMain->m_textCtrlAddress->SetValue(strAddress); - } -} - -bool GetWalletPassphrase() -{ - if (pwalletMain->IsLocked()) - { - string strWalletPass; - strWalletPass.reserve(100); - mlock(&strWalletPass[0], strWalletPass.capacity()); - - // obtain current wallet encrypt/decrypt key, from passphrase - // Note that the passphrase is not mlock()d during this entry and could potentially - // be obtained from disk long after bitcoin has run. - strWalletPass = wxGetPasswordFromUser(_("Enter the current passphrase to the wallet."), - _("Passphrase")).ToStdString(); - - if (!strWalletPass.size()) - { - fill(strWalletPass.begin(), strWalletPass.end(), '\0'); - munlock(&strWalletPass[0], strWalletPass.capacity()); - wxMessageBox(_("Please supply the current wallet decryption passphrase."), "Bitcoin"); - return false; - } - - if (!pwalletMain->Unlock(strWalletPass)) - { - fill(strWalletPass.begin(), strWalletPass.end(), '\0'); - munlock(&strWalletPass[0], strWalletPass.capacity()); - wxMessageBox(_("The passphrase entered for the wallet decryption was incorrect."), "Bitcoin"); - return false; - } - fill(strWalletPass.begin(), strWalletPass.end(), '\0'); - munlock(&strWalletPass[0], strWalletPass.capacity()); - } - return true; -} - - - - - - - - - - -////////////////////////////////////////////////////////////////////////////// -// -// CMainFrame -// - -CMainFrame::CMainFrame(wxWindow* parent) : CMainFrameBase(parent) -{ - Connect(wxEVT_UITHREADCALL, wxCommandEventHandler(CMainFrame::OnUIThreadCall), NULL, this); - - // Set initially selected page - wxNotebookEvent event; - event.SetSelection(0); - OnNotebookPageChanged(event); - m_notebook->ChangeSelection(0); - - // Init - fRefreshListCtrl = false; - fRefreshListCtrlRunning = false; - fOnSetFocusAddress = false; - fRefresh = false; - m_choiceFilter->SetSelection(0); - double dResize = nScaleX; -#ifdef __WXMSW__ - SetIcon(wxICON(bitcoin)); - SetSize(dResize * GetSize().GetWidth(), nScaleY * GetSize().GetHeight()); -#else - SetIcon(bitcoin80_xpm); - SetBackgroundColour(m_toolBar->GetBackgroundColour()); - wxFont fontTmp = m_staticText41->GetFont(); - fontTmp.SetFamily(wxFONTFAMILY_TELETYPE); - m_staticTextBalance->SetFont(fontTmp); - m_staticTextBalance->SetSize(140, 17); - // resize to fit ubuntu's huge default font - dResize = 1.22; - SetSize(dResize * GetSize().GetWidth(), 1.15 * GetSize().GetHeight()); -#endif - m_staticTextBalance->SetLabel(FormatMoney(pwalletMain->GetBalance()) + " "); - m_listCtrl->SetFocus(); - ptaskbaricon = new CMyTaskBarIcon(); -#ifdef __WXMAC_OSX__ - // Mac automatically moves wxID_EXIT, wxID_PREFERENCES and wxID_ABOUT - // to their standard places, leaving these menus empty. - GetMenuBar()->Remove(2); // remove Help menu - GetMenuBar()->Remove(0); // remove File menu -#endif - - // Init column headers - int nDateWidth = DateTimeStr(1229413914).size() * 6 + 8; - if (!strstr(DateTimeStr(1229413914).c_str(), "2008")) - nDateWidth += 12; -#ifdef __WXMAC_OSX__ - nDateWidth += 5; - dResize -= 0.01; -#endif - wxListCtrl* pplistCtrl[] = {m_listCtrlAll, m_listCtrlSentReceived, m_listCtrlSent, m_listCtrlReceived}; - BOOST_FOREACH(wxListCtrl* p, pplistCtrl) - { - p->InsertColumn(0, "", wxLIST_FORMAT_LEFT, dResize * 0); - p->InsertColumn(1, "", wxLIST_FORMAT_LEFT, dResize * 0); - p->InsertColumn(2, _("Status"), wxLIST_FORMAT_LEFT, dResize * 112); - p->InsertColumn(3, _("Date"), wxLIST_FORMAT_LEFT, dResize * nDateWidth); - p->InsertColumn(4, _("Description"), wxLIST_FORMAT_LEFT, dResize * 409 - nDateWidth); - p->InsertColumn(5, _("Debit"), wxLIST_FORMAT_RIGHT, dResize * 79); - p->InsertColumn(6, _("Credit"), wxLIST_FORMAT_RIGHT, dResize * 79); - } - - // Init status bar - int pnWidths[3] = { -100, 88, 300 }; -#ifndef __WXMSW__ - pnWidths[1] = pnWidths[1] * 1.1 * dResize; - pnWidths[2] = pnWidths[2] * 1.1 * dResize; -#endif - m_statusBar->SetFieldsCount(3, pnWidths); - - // Fill your address text box - vector vchPubKey; - if (CWalletDB(pwalletMain->strWalletFile,"r").ReadDefaultKey(vchPubKey)) - m_textCtrlAddress->SetValue(CBitcoinAddress(vchPubKey).ToString()); - - if (pwalletMain->IsCrypted()) - m_menuOptions->Remove(m_menuOptionsEncryptWallet); - else - m_menuOptions->Remove(m_menuOptionsChangeWalletPassphrase); - - // Fill listctrl with wallet transactions - RefreshListCtrl(); -} - -CMainFrame::~CMainFrame() -{ - pframeMain = NULL; - delete ptaskbaricon; - ptaskbaricon = NULL; -} - -void CMainFrame::OnNotebookPageChanged(wxNotebookEvent& event) -{ - event.Skip(); - nPage = event.GetSelection(); - if (nPage == ALL) - { - m_listCtrl = m_listCtrlAll; - fShowGenerated = true; - fShowSent = true; - fShowReceived = true; - } - else if (nPage == SENTRECEIVED) - { - m_listCtrl = m_listCtrlSentReceived; - fShowGenerated = false; - fShowSent = true; - fShowReceived = true; - } - else if (nPage == SENT) - { - m_listCtrl = m_listCtrlSent; - fShowGenerated = false; - fShowSent = true; - fShowReceived = false; - } - else if (nPage == RECEIVED) - { - m_listCtrl = m_listCtrlReceived; - fShowGenerated = false; - fShowSent = false; - fShowReceived = true; - } - RefreshListCtrl(); - m_listCtrl->SetFocus(); -} - -void CMainFrame::OnClose(wxCloseEvent& event) -{ - if (fMinimizeOnClose && event.CanVeto() && !IsIconized()) - { - // Divert close to minimize - event.Veto(); - fClosedToTray = true; - Iconize(true); - } - else - { - Destroy(); - CreateThread(Shutdown, NULL); - } -} - -void CMainFrame::OnIconize(wxIconizeEvent& event) -{ - event.Skip(); - // Hide the task bar button when minimized. - // Event is sent when the frame is minimized or restored. - // wxWidgets 2.8.9 doesn't have IsIconized() so there's no way - // to get rid of the deprecated warning. Just ignore it. - if (!event.Iconized()) - fClosedToTray = false; -#if defined(__WXGTK__) || defined(__WXMAC_OSX__) - if (GetBoolArg("-minimizetotray")) { -#endif - // The tray icon sometimes disappears on ubuntu karmic - // Hiding the taskbar button doesn't work cleanly on ubuntu lucid - // Reports of CPU peg on 64-bit linux - if (fMinimizeToTray && event.Iconized()) - fClosedToTray = true; - Show(!fClosedToTray); - ptaskbaricon->Show(fMinimizeToTray || fClosedToTray); -#if defined(__WXGTK__) || defined(__WXMAC_OSX__) - } -#endif -} - -void CMainFrame::OnMouseEvents(wxMouseEvent& event) -{ - event.Skip(); - RandAddSeed(); - RAND_add(&event.m_x, sizeof(event.m_x), 0.25); - RAND_add(&event.m_y, sizeof(event.m_y), 0.25); -} - -void CMainFrame::OnListColBeginDrag(wxListEvent& event) -{ - // Hidden columns not resizeable - if (event.GetColumn() <= 1 && !fDebug) - event.Veto(); - else - event.Skip(); -} - -int CMainFrame::GetSortIndex(const string& strSort) -{ -#ifdef __WXMSW__ - return 0; -#else - // The wx generic listctrl implementation used on GTK doesn't sort, - // so we have to do it ourselves. Remember, we sort in reverse order. - // In the wx generic implementation, they store the list of items - // in a vector, so indexed lookups are fast, but inserts are slower - // the closer they are to the top. - int low = 0; - int high = m_listCtrl->GetItemCount(); - while (low < high) - { - int mid = low + ((high - low) / 2); - if (strSort.compare(m_listCtrl->GetItemText(mid).c_str()) >= 0) - high = mid; - else - low = mid + 1; - } - return low; -#endif -} - -void CMainFrame::InsertLine(bool fNew, int nIndex, uint256 hashKey, string strSort, const wxColour& colour, const wxString& str2, const wxString& str3, const wxString& str4, const wxString& str5, const wxString& str6) -{ - strSort = " " + strSort; // leading space to workaround wx2.9.0 ubuntu 9.10 bug - long nData = *(long*)&hashKey; // where first char of hidden column is displayed - - // Find item - if (!fNew && nIndex == -1) - { - string strHash = " " + hashKey.ToString(); - while ((nIndex = m_listCtrl->FindItem(nIndex, nData)) != -1) - if (GetItemText(m_listCtrl, nIndex, 1) == strHash) - break; - } - - // fNew is for blind insert, only use if you're sure it's new - if (fNew || nIndex == -1) - { - nIndex = m_listCtrl->InsertItem(GetSortIndex(strSort), strSort); - } - else - { - // If sort key changed, must delete and reinsert to make it relocate - if (GetItemText(m_listCtrl, nIndex, 0) != strSort) - { - m_listCtrl->DeleteItem(nIndex); - nIndex = m_listCtrl->InsertItem(GetSortIndex(strSort), strSort); - } - } - - m_listCtrl->SetItem(nIndex, 1, " " + hashKey.ToString()); - m_listCtrl->SetItem(nIndex, 2, str2); - m_listCtrl->SetItem(nIndex, 3, str3); - m_listCtrl->SetItem(nIndex, 4, str4); - m_listCtrl->SetItem(nIndex, 5, str5); - m_listCtrl->SetItem(nIndex, 6, str6); - m_listCtrl->SetItemData(nIndex, nData); - SetItemTextColour(m_listCtrl, nIndex, colour); -} - -bool CMainFrame::DeleteLine(uint256 hashKey) -{ - long nData = *(long*)&hashKey; - - // Find item - int nIndex = -1; - string strHash = " " + hashKey.ToString(); - while ((nIndex = m_listCtrl->FindItem(nIndex, nData)) != -1) - if (GetItemText(m_listCtrl, nIndex, 1) == strHash) - break; - - if (nIndex != -1) - m_listCtrl->DeleteItem(nIndex); - - return nIndex != -1; -} - -string FormatTxStatus(const CWalletTx& wtx) -{ - // Status - if (!wtx.IsFinal()) - { - if (wtx.nLockTime < LOCKTIME_THRESHOLD) - return strprintf(_("Open for %d blocks"), nBestHeight - wtx.nLockTime); - else - return strprintf(_("Open until %s"), DateTimeStr(wtx.nLockTime).c_str()); - } - else - { - int nDepth = wtx.GetDepthInMainChain(); - if (GetAdjustedTime() - wtx.nTimeReceived > 2 * 60 && wtx.GetRequestCount() == 0) - return strprintf(_("%d/offline?"), nDepth); - else if (nDepth < 6) - return strprintf(_("%d/unconfirmed"), nDepth); - else - return strprintf(_("%d confirmations"), nDepth); - } -} - -string SingleLine(const string& strIn) -{ - string strOut; - bool fOneSpace = false; - BOOST_FOREACH(unsigned char c, strIn) - { - if (isspace(c)) - { - fOneSpace = true; - } - else if (c > ' ') - { - if (fOneSpace && !strOut.empty()) - strOut += ' '; - strOut += c; - fOneSpace = false; - } - } - return strOut; -} - -bool CMainFrame::InsertTransaction(const CWalletTx& wtx, bool fNew, int nIndex) -{ - int64 nTime = wtx.nTimeDisplayed = wtx.GetTxTime(); - int64 nCredit = wtx.GetCredit(true); - int64 nDebit = wtx.GetDebit(); - int64 nNet = nCredit - nDebit; - uint256 hash = wtx.GetHash(); - string strStatus = FormatTxStatus(wtx); - bool fConfirmed = wtx.fConfirmedDisplayed = wtx.IsConfirmed(); - wxColour colour = (fConfirmed ? wxColour(0,0,0) : wxColour(128,128,128)); - map mapValue = wtx.mapValue; - wtx.nLinesDisplayed = 1; - nListViewUpdated++; - - // Filter - if (wtx.IsCoinBase()) - { - // Don't show generated coin until confirmed by at least one block after it - // so we don't get the user's hopes up until it looks like it's probably accepted. - // - // It is not an error when generated blocks are not accepted. By design, - // some percentage of blocks, like 10% or more, will end up not accepted. - // This is the normal mechanism by which the network copes with latency. - // - // We display regular transactions right away before any confirmation - // because they can always get into some block eventually. Generated coins - // are special because if their block is not accepted, they are not valid. - // - if (wtx.GetDepthInMainChain() < 2) - { - wtx.nLinesDisplayed = 0; - return false; - } - - if (!fShowGenerated) - return false; - } - - // Find the block the tx is in - CBlockIndex* pindex = NULL; - map::iterator mi = mapBlockIndex.find(wtx.hashBlock); - if (mi != mapBlockIndex.end()) - pindex = (*mi).second; - - // Sort order, unrecorded transactions sort to the top - string strSort = strprintf("%010d-%01d-%010u", - (pindex ? pindex->nHeight : INT_MAX), - (wtx.IsCoinBase() ? 1 : 0), - wtx.nTimeReceived); - - // Insert line - if (nNet > 0 || wtx.IsCoinBase()) - { - // - // Credit - // - string strDescription; - if (wtx.IsCoinBase()) - { - // Generated - strDescription = _("Generated"); - if (nCredit == 0) - { - int64 nUnmatured = 0; - BOOST_FOREACH(const CTxOut& txout, wtx.vout) - nUnmatured += pwalletMain->GetCredit(txout); - if (wtx.IsInMainChain()) - { - strDescription = strprintf(_("Generated (%s matures in %d more blocks)"), FormatMoney(nUnmatured).c_str(), wtx.GetBlocksToMaturity()); - - // Check if the block was requested by anyone - if (GetAdjustedTime() - wtx.nTimeReceived > 2 * 60 && wtx.GetRequestCount() == 0) - strDescription = _("Generated - Warning: This block was not received by any other nodes and will probably not be accepted!"); - } - else - { - strDescription = _("Generated (not accepted)"); - } - } - } - else if (!mapValue["from"].empty() || !mapValue["message"].empty()) - { - // Received by IP connection - if (!fShowReceived) - return false; - if (!mapValue["from"].empty()) - strDescription += _("From: ") + mapValue["from"]; - if (!mapValue["message"].empty()) - { - if (!strDescription.empty()) - strDescription += " - "; - strDescription += mapValue["message"]; - } - } - else - { - // Received by Bitcoin Address - if (!fShowReceived) - return false; - BOOST_FOREACH(const CTxOut& txout, wtx.vout) - { - if (pwalletMain->IsMine(txout)) - { - CBitcoinAddress address; - if (ExtractAddress(txout.scriptPubKey, pwalletMain, address)) - { - CRITICAL_BLOCK(pwalletMain->cs_wallet) - { - //strDescription += _("Received payment to "); - //strDescription += _("Received with address "); - strDescription += _("Received with: "); - map::iterator mi = pwalletMain->mapAddressBook.find(address); - if (mi != pwalletMain->mapAddressBook.end() && !(*mi).second.empty()) - { - string strLabel = (*mi).second; - strDescription += address.ToString().substr(0,12) + "... "; - strDescription += "(" + strLabel + ")"; - } - else - strDescription += address.ToString(); - } - } - break; - } - } - } - - string strCredit = FormatMoney(nNet, true); - if (!fConfirmed) - strCredit = "[" + strCredit + "]"; - - InsertLine(fNew, nIndex, hash, strSort, colour, - strStatus, - nTime ? DateTimeStr(nTime) : "", - SingleLine(strDescription), - "", - strCredit); - } - else - { - bool fAllFromMe = true; - BOOST_FOREACH(const CTxIn& txin, wtx.vin) - fAllFromMe = fAllFromMe && pwalletMain->IsMine(txin); - - bool fAllToMe = true; - BOOST_FOREACH(const CTxOut& txout, wtx.vout) - fAllToMe = fAllToMe && pwalletMain->IsMine(txout); - - if (fAllFromMe && fAllToMe) - { - // Payment to self - int64 nChange = wtx.GetChange(); - InsertLine(fNew, nIndex, hash, strSort, colour, - strStatus, - nTime ? DateTimeStr(nTime) : "", - _("Payment to yourself"), - FormatMoney(-(nDebit - nChange), true), - FormatMoney(nCredit - nChange, true)); - } - else if (fAllFromMe) - { - // - // Debit - // - if (!fShowSent) - return false; - - int64 nTxFee = nDebit - wtx.GetValueOut(); - wtx.nLinesDisplayed = 0; - for (int nOut = 0; nOut < wtx.vout.size(); nOut++) - { - const CTxOut& txout = wtx.vout[nOut]; - if (pwalletMain->IsMine(txout)) - continue; - - CBitcoinAddress address; - string strAddress; - if (!mapValue["to"].empty()) - { - // Sent to IP - strAddress = mapValue["to"]; - } - else - { - // Sent to Bitcoin Address - if (ExtractAddress(txout.scriptPubKey, NULL, address)) - strAddress = address.ToString(); - } - - string strDescription = _("To: "); - CRITICAL_BLOCK(pwalletMain->cs_wallet) - if (pwalletMain->mapAddressBook.count(address) && !pwalletMain->mapAddressBook[address].empty()) - strDescription += pwalletMain->mapAddressBook[address] + " "; - strDescription += strAddress; - if (!mapValue["message"].empty()) - { - if (!strDescription.empty()) - strDescription += " - "; - strDescription += mapValue["message"]; - } - else if (!mapValue["comment"].empty()) - { - if (!strDescription.empty()) - strDescription += " - "; - strDescription += mapValue["comment"]; - } - - int64 nValue = txout.nValue; - if (nTxFee > 0) - { - nValue += nTxFee; - nTxFee = 0; - } - - InsertLine(fNew, nIndex, hash, strprintf("%s-%d", strSort.c_str(), nOut), colour, - strStatus, - nTime ? DateTimeStr(nTime) : "", - SingleLine(strDescription), - FormatMoney(-nValue, true), - ""); - nIndex = -1; - wtx.nLinesDisplayed++; - } - } - else - { - // - // Mixed debit transaction, can't break down payees - // - bool fAllMine = true; - BOOST_FOREACH(const CTxOut& txout, wtx.vout) - fAllMine = fAllMine && pwalletMain->IsMine(txout); - BOOST_FOREACH(const CTxIn& txin, wtx.vin) - fAllMine = fAllMine && pwalletMain->IsMine(txin); - - InsertLine(fNew, nIndex, hash, strSort, colour, - strStatus, - nTime ? DateTimeStr(nTime) : "", - "", - FormatMoney(nNet, true), - ""); - } - } - - return true; -} - -void CMainFrame::RefreshListCtrl() -{ - fRefreshListCtrl = true; - ::wxWakeUpIdle(); -} - -void CMainFrame::OnIdle(wxIdleEvent& event) -{ - if (fRefreshListCtrl) - { - // Collect list of wallet transactions and sort newest first - bool fEntered = false; - vector > vSorted; - TRY_CRITICAL_BLOCK(pwalletMain->cs_wallet) - { - printf("RefreshListCtrl starting\n"); - fEntered = true; - fRefreshListCtrl = false; - pwalletMain->vWalletUpdated.clear(); - - // Do the newest transactions first - vSorted.reserve(pwalletMain->mapWallet.size()); - for (map::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) - { - const CWalletTx& wtx = (*it).second; - unsigned int nTime = UINT_MAX - wtx.GetTxTime(); - vSorted.push_back(make_pair(nTime, (*it).first)); - } - m_listCtrl->DeleteAllItems(); - } - if (!fEntered) - return; - - sort(vSorted.begin(), vSorted.end()); - - // Fill list control - for (int i = 0; i < vSorted.size();) - { - if (fShutdown) - return; - bool fEntered = false; - TRY_CRITICAL_BLOCK(pwalletMain->cs_wallet) - { - fEntered = true; - uint256& hash = vSorted[i++].second; - map::iterator mi = pwalletMain->mapWallet.find(hash); - if (mi != pwalletMain->mapWallet.end()) - InsertTransaction((*mi).second, true); - } - if (!fEntered || i == 100 || i % 500 == 0) - wxYield(); - } - - printf("RefreshListCtrl done\n"); - - // Update transaction total display - MainFrameRepaint(); - } - else - { - // Check for time updates - static int64 nLastTime; - if (GetTime() > nLastTime + 30) - { - TRY_CRITICAL_BLOCK(pwalletMain->cs_wallet) - { - nLastTime = GetTime(); - for (map::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) - { - CWalletTx& wtx = (*it).second; - if (wtx.nTimeDisplayed && wtx.nTimeDisplayed != wtx.GetTxTime()) - InsertTransaction(wtx, false); - } - } - } - } -} - -void CMainFrame::RefreshStatusColumn() -{ - static int nLastTop; - static CBlockIndex* pindexLastBest; - static unsigned int nLastRefreshed; - - int nTop = max((int)m_listCtrl->GetTopItem(), 0); - if (nTop == nLastTop && pindexLastBest == pindexBest) - return; - - TRY_CRITICAL_BLOCK(pwalletMain->cs_wallet) - { - int nStart = nTop; - int nEnd = min(nStart + 100, m_listCtrl->GetItemCount()); - - if (pindexLastBest == pindexBest && nLastRefreshed == nListViewUpdated) - { - // If no updates, only need to do the part that moved onto the screen - if (nStart >= nLastTop && nStart < nLastTop + 100) - nStart = nLastTop + 100; - if (nEnd >= nLastTop && nEnd < nLastTop + 100) - nEnd = nLastTop; - } - nLastTop = nTop; - pindexLastBest = pindexBest; - nLastRefreshed = nListViewUpdated; - - for (int nIndex = nStart; nIndex < min(nEnd, m_listCtrl->GetItemCount()); nIndex++) - { - uint256 hash((string)GetItemText(m_listCtrl, nIndex, 1)); - map::iterator mi = pwalletMain->mapWallet.find(hash); - if (mi == pwalletMain->mapWallet.end()) - { - printf("CMainFrame::RefreshStatusColumn() : tx not found in mapWallet\n"); - continue; - } - CWalletTx& wtx = (*mi).second; - if (wtx.IsCoinBase() || - wtx.GetTxTime() != wtx.nTimeDisplayed || - wtx.IsConfirmed() != wtx.fConfirmedDisplayed) - { - if (!InsertTransaction(wtx, false, nIndex)) - m_listCtrl->DeleteItem(nIndex--); - } - else - { - m_listCtrl->SetItem(nIndex, 2, FormatTxStatus(wtx)); - } - } - } -} - -void CMainFrame::OnPaint(wxPaintEvent& event) -{ - event.Skip(); - if (fRefresh) - { - fRefresh = false; - Refresh(); - } -} - - -unsigned int nNeedRepaint = 0; -unsigned int nLastRepaint = 0; -int64 nLastRepaintTime = 0; -int64 nRepaintInterval = 500; - -void ThreadDelayedRepaint(void* parg) -{ - while (!fShutdown) - { - if (nLastRepaint != nNeedRepaint && GetTimeMillis() - nLastRepaintTime >= nRepaintInterval) - { - nLastRepaint = nNeedRepaint; - if (pframeMain) - { - printf("DelayedRepaint\n"); - wxPaintEvent event; - pframeMain->fRefresh = true; - pframeMain->GetEventHandler()->AddPendingEvent(event); - } - } - Sleep(nRepaintInterval); - } -} - -void MainFrameRepaint() -{ - // This is called by network code that shouldn't access pframeMain - // directly because it could still be running after the UI is closed. - if (pframeMain) - { - // Don't repaint too often - static int64 nLastRepaintRequest; - if (GetTimeMillis() - nLastRepaintRequest < 100) - { - nNeedRepaint++; - return; - } - nLastRepaintRequest = GetTimeMillis(); - - printf("MainFrameRepaint\n"); - wxPaintEvent event; - pframeMain->fRefresh = true; - pframeMain->GetEventHandler()->AddPendingEvent(event); - } -} - -void CMainFrame::OnPaintListCtrl(wxPaintEvent& event) -{ - // Skip lets the listctrl do the paint, we're just hooking the message - event.Skip(); - - if (ptaskbaricon) - ptaskbaricon->UpdateTooltip(); - - // - // Slower stuff - // - static int nTransactionCount; - bool fPaintedBalance = false; - if (GetTimeMillis() - nLastRepaintTime >= nRepaintInterval) - { - nLastRepaint = nNeedRepaint; - nLastRepaintTime = GetTimeMillis(); - - // Update listctrl contents - if (!pwalletMain->vWalletUpdated.empty()) - { - TRY_CRITICAL_BLOCK(pwalletMain->cs_wallet) - { - string strTop; - if (m_listCtrl->GetItemCount()) - strTop = (string)m_listCtrl->GetItemText(0); - BOOST_FOREACH(uint256 hash, pwalletMain->vWalletUpdated) - { - map::iterator mi = pwalletMain->mapWallet.find(hash); - if (mi != pwalletMain->mapWallet.end()) - InsertTransaction((*mi).second, false); - } - pwalletMain->vWalletUpdated.clear(); - if (m_listCtrl->GetItemCount() && strTop != (string)m_listCtrl->GetItemText(0)) - m_listCtrl->ScrollList(0, INT_MIN/2); - } - } - - // Balance total - TRY_CRITICAL_BLOCK(pwalletMain->cs_wallet) - { - fPaintedBalance = true; - m_staticTextBalance->SetLabel(FormatMoney(pwalletMain->GetBalance()) + " "); - - // Count hidden and multi-line transactions - nTransactionCount = 0; - for (map::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) - { - CWalletTx& wtx = (*it).second; - nTransactionCount += wtx.nLinesDisplayed; - } - } - } - if (!pwalletMain->vWalletUpdated.empty() || !fPaintedBalance) - nNeedRepaint++; - - // Update status column of visible items only - RefreshStatusColumn(); - - // Update status bar - static string strPrevWarning; - string strWarning = GetWarnings("statusbar"); - if (strWarning != "") - m_statusBar->SetStatusText(string(" ") + _(strWarning), 0); - else if (strPrevWarning != "") - m_statusBar->SetStatusText("", 0); - strPrevWarning = strWarning; - - string strGen = ""; - if (fGenerateBitcoins) - strGen = _(" Generating"); - if (fGenerateBitcoins && vNodes.empty()) - strGen = _("(not connected)"); - m_statusBar->SetStatusText(strGen, 1); - - string strStatus = strprintf(_(" %d connections %d blocks %d transactions"), vNodes.size(), nBestHeight, nTransactionCount); - m_statusBar->SetStatusText(strStatus, 2); - - // Update receiving address - string strDefaultAddress = CBitcoinAddress(pwalletMain->vchDefaultKey).ToString(); - if (m_textCtrlAddress->GetValue() != strDefaultAddress) - m_textCtrlAddress->SetValue(strDefaultAddress); -} - - -void UIThreadCall(boost::function0 fn) -{ - // Call this with a function object created with bind. - // bind needs all parameters to match the function's expected types - // and all default parameters specified. Some examples: - // UIThreadCall(bind(wxBell)); - // UIThreadCall(bind(wxMessageBox, wxT("Message"), wxT("Title"), wxOK, (wxWindow*)NULL, -1, -1)); - // UIThreadCall(bind(&CMainFrame::OnMenuHelpAbout, pframeMain, event)); - if (pframeMain) - { - wxCommandEvent event(wxEVT_UITHREADCALL); - event.SetClientData((void*)new boost::function0(fn)); - pframeMain->GetEventHandler()->AddPendingEvent(event); - } -} - -void CMainFrame::OnUIThreadCall(wxCommandEvent& event) -{ - boost::function0* pfn = (boost::function0*)event.GetClientData(); - (*pfn)(); - delete pfn; -} - -void CMainFrame::OnMenuFileExit(wxCommandEvent& event) -{ - // File->Exit - Close(true); -} - -void CMainFrame::OnUpdateUIOptionsGenerate(wxUpdateUIEvent& event) -{ - event.Check(fGenerateBitcoins); -} - -void CMainFrame::OnMenuOptionsChangeYourAddress(wxCommandEvent& event) -{ - // Options->Your Receiving Addresses - CAddressBookDialog dialog(this, "", CAddressBookDialog::RECEIVING, false); - if (!dialog.ShowModal()) - return; -} - -void CMainFrame::OnMenuOptionsEncryptWallet(wxCommandEvent& event) -{ - // Options->Encrypt Wallet - if (pwalletMain->IsCrypted()) - { - wxMessageBox(_("Wallet already encrypted."), "Bitcoin", wxOK | wxICON_ERROR); - return; - } - - string strWalletPass; - strWalletPass.reserve(100); - mlock(&strWalletPass[0], strWalletPass.capacity()); - - // obtain current wallet encrypt/decrypt key, from passphrase - // Note that the passphrase is not mlock()d during this entry and could potentially - // be obtained from disk long after bitcoin has run. - strWalletPass = wxGetPasswordFromUser(_("Enter the new passphrase to the wallet.\nPlease use a passphrase of 10 or more random characters, or eight or more words."), - _("Passphrase")).ToStdString(); - - if (!strWalletPass.size()) - { - fill(strWalletPass.begin(), strWalletPass.end(), '\0'); - munlock(&strWalletPass[0], strWalletPass.capacity()); - wxMessageBox(_("Error: The supplied passphrase was too short."), "Bitcoin", wxOK | wxICON_ERROR); - return; - } - - if(wxMessageBox(_("WARNING: If you encrypt your wallet and lose your passphrase, you will LOSE ALL OF YOUR BITCOINS!\nAre you sure you wish to encrypt your wallet?"), "Bitcoin", wxYES_NO) != wxYES) - return; - - string strWalletPassTest; - strWalletPassTest.reserve(100); - mlock(&strWalletPassTest[0], strWalletPassTest.capacity()); - strWalletPassTest = wxGetPasswordFromUser(_("Please re-enter your new wallet passphrase."), - _("Passphrase")).ToStdString(); - - if (strWalletPassTest != strWalletPass) - { - fill(strWalletPass.begin(), strWalletPass.end(), '\0'); - fill(strWalletPassTest.begin(), strWalletPassTest.end(), '\0'); - munlock(&strWalletPass[0], strWalletPass.capacity()); - munlock(&strWalletPassTest[0], strWalletPassTest.capacity()); - wxMessageBox(_("Error: the supplied passphrases didn't match."), "Bitcoin", wxOK | wxICON_ERROR); - return; - } - - if (!pwalletMain->EncryptWallet(strWalletPass)) - { - fill(strWalletPass.begin(), strWalletPass.end(), '\0'); - fill(strWalletPassTest.begin(), strWalletPassTest.end(), '\0'); - munlock(&strWalletPass[0], strWalletPass.capacity()); - munlock(&strWalletPassTest[0], strWalletPassTest.capacity()); - wxMessageBox(_("Wallet encryption failed."), "Bitcoin", wxOK | wxICON_ERROR); - return; - } - fill(strWalletPass.begin(), strWalletPass.end(), '\0'); - fill(strWalletPassTest.begin(), strWalletPassTest.end(), '\0'); - munlock(&strWalletPass[0], strWalletPass.capacity()); - munlock(&strWalletPassTest[0], strWalletPassTest.capacity()); - wxMessageBox(_("Wallet Encrypted.\nRemember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer."), "Bitcoin"); - - m_menuOptions->Remove(m_menuOptionsEncryptWallet); - m_menuOptions->Insert(m_menuOptions->GetMenuItemCount() - 1, m_menuOptionsChangeWalletPassphrase); -} - -void CMainFrame::OnMenuOptionsChangeWalletPassphrase(wxCommandEvent& event) -{ - // Options->Change Wallet Encryption Passphrase - if (!pwalletMain->IsCrypted()) - { - wxMessageBox(_("Wallet is unencrypted, please encrypt it first."), "Bitcoin", wxOK | wxICON_ERROR); - return; - } - - string strOldWalletPass; - strOldWalletPass.reserve(100); - mlock(&strOldWalletPass[0], strOldWalletPass.capacity()); - - // obtain current wallet encrypt/decrypt key, from passphrase - // Note that the passphrase is not mlock()d during this entry and could potentially - // be obtained from disk long after bitcoin has run. - strOldWalletPass = wxGetPasswordFromUser(_("Enter the current passphrase to the wallet."), - _("Passphrase")).ToStdString(); - - bool fWasLocked = pwalletMain->IsLocked(); - pwalletMain->Lock(); - - if (!strOldWalletPass.size() || !pwalletMain->Unlock(strOldWalletPass)) - { - fill(strOldWalletPass.begin(), strOldWalletPass.end(), '\0'); - munlock(&strOldWalletPass[0], strOldWalletPass.capacity()); - wxMessageBox(_("The passphrase entered for the wallet decryption was incorrect."), "Bitcoin", wxOK | wxICON_ERROR); - return; - } - - if (fWasLocked) - pwalletMain->Lock(); - - string strNewWalletPass; - strNewWalletPass.reserve(100); - mlock(&strNewWalletPass[0], strNewWalletPass.capacity()); - - // obtain new wallet encrypt/decrypt key, from passphrase - // Note that the passphrase is not mlock()d during this entry and could potentially - // be obtained from disk long after bitcoin has run. - strNewWalletPass = wxGetPasswordFromUser(_("Enter the new passphrase for the wallet."), - _("Passphrase")).ToStdString(); - - if (!strNewWalletPass.size()) - { - fill(strOldWalletPass.begin(), strOldWalletPass.end(), '\0'); - fill(strNewWalletPass.begin(), strNewWalletPass.end(), '\0'); - munlock(&strOldWalletPass[0], strOldWalletPass.capacity()); - munlock(&strNewWalletPass[0], strNewWalletPass.capacity()); - wxMessageBox(_("Error: The supplied passphrase was too short."), "Bitcoin", wxOK | wxICON_ERROR); - return; - } - - string strNewWalletPassTest; - strNewWalletPassTest.reserve(100); - mlock(&strNewWalletPassTest[0], strNewWalletPassTest.capacity()); - - // obtain new wallet encrypt/decrypt key, from passphrase - // Note that the passphrase is not mlock()d during this entry and could potentially - // be obtained from disk long after bitcoin has run. - strNewWalletPassTest = wxGetPasswordFromUser(_("Re-enter the new passphrase for the wallet."), - _("Passphrase")).ToStdString(); - - if (strNewWalletPassTest != strNewWalletPass) - { - fill(strOldWalletPass.begin(), strOldWalletPass.end(), '\0'); - fill(strNewWalletPass.begin(), strNewWalletPass.end(), '\0'); - fill(strNewWalletPassTest.begin(), strNewWalletPassTest.end(), '\0'); - munlock(&strOldWalletPass[0], strOldWalletPass.capacity()); - munlock(&strNewWalletPass[0], strNewWalletPass.capacity()); - munlock(&strNewWalletPassTest[0], strNewWalletPassTest.capacity()); - wxMessageBox(_("Error: the supplied passphrases didn't match."), "Bitcoin", wxOK | wxICON_ERROR); - return; - } - - if (!pwalletMain->ChangeWalletPassphrase(strOldWalletPass, strNewWalletPass)) - { - fill(strOldWalletPass.begin(), strOldWalletPass.end(), '\0'); - fill(strNewWalletPass.begin(), strNewWalletPass.end(), '\0'); - fill(strNewWalletPassTest.begin(), strNewWalletPassTest.end(), '\0'); - munlock(&strOldWalletPass[0], strOldWalletPass.capacity()); - munlock(&strNewWalletPass[0], strNewWalletPass.capacity()); - munlock(&strNewWalletPassTest[0], strNewWalletPassTest.capacity()); - wxMessageBox(_("The passphrase entered for the wallet decryption was incorrect."), "Bitcoin", wxOK | wxICON_ERROR); - return; - } - fill(strOldWalletPass.begin(), strOldWalletPass.end(), '\0'); - fill(strNewWalletPass.begin(), strNewWalletPass.end(), '\0'); - fill(strNewWalletPassTest.begin(), strNewWalletPassTest.end(), '\0'); - munlock(&strOldWalletPass[0], strOldWalletPass.capacity()); - munlock(&strNewWalletPass[0], strNewWalletPass.capacity()); - munlock(&strNewWalletPassTest[0], strNewWalletPassTest.capacity()); - wxMessageBox(_("Wallet Passphrase Changed."), "Bitcoin"); -} - -void CMainFrame::OnMenuOptionsOptions(wxCommandEvent& event) -{ - // Options->Options - COptionsDialog dialog(this); - dialog.ShowModal(); -} - -void CMainFrame::OnMenuHelpAbout(wxCommandEvent& event) -{ - // Help->About - CAboutDialog dialog(this); - dialog.ShowModal(); -} - -void CMainFrame::OnButtonSend(wxCommandEvent& event) -{ - // Toolbar: Send - CSendDialog dialog(this); - dialog.ShowModal(); -} - -void CMainFrame::OnButtonAddressBook(wxCommandEvent& event) -{ - // Toolbar: Address Book - CAddressBookDialog dialogAddr(this, "", CAddressBookDialog::SENDING, false); - if (dialogAddr.ShowModal() == 2) - { - // Send - CSendDialog dialogSend(this, dialogAddr.GetSelectedAddress()); - dialogSend.ShowModal(); - } -} - -void CMainFrame::OnSetFocusAddress(wxFocusEvent& event) -{ - // Automatically select-all when entering window - event.Skip(); - m_textCtrlAddress->SetSelection(-1, -1); - fOnSetFocusAddress = true; -} - -void CMainFrame::OnMouseEventsAddress(wxMouseEvent& event) -{ - event.Skip(); - if (fOnSetFocusAddress) - m_textCtrlAddress->SetSelection(-1, -1); - fOnSetFocusAddress = false; -} - -void CMainFrame::OnButtonNew(wxCommandEvent& event) -{ - // Ask name - CGetTextFromUserDialog dialog(this, - _("New Receiving Address"), - _("You should use a new address for each payment you receive.\n\nLabel"), - ""); - if (!dialog.ShowModal()) - return; - string strName = dialog.GetValue(); - - string strAddress; - - bool fWasLocked = pwalletMain->IsLocked(); - if (!GetWalletPassphrase()) - return; - - // Generate new key - std::vector newKey; - pwalletMain->GetKeyFromPool(newKey, true); - strAddress = CBitcoinAddress(newKey).ToString(); - - if (fWasLocked) - pwalletMain->Lock(); - - // Save - CRITICAL_BLOCK(pwalletMain->cs_wallet) - pwalletMain->SetAddressBookName(strAddress, strName); - SetDefaultReceivingAddress(strAddress); -} - -void CMainFrame::OnButtonCopy(wxCommandEvent& event) -{ - // Copy address box to clipboard - if (wxTheClipboard->Open()) - { - wxTheClipboard->SetData(new wxTextDataObject(m_textCtrlAddress->GetValue())); - wxTheClipboard->Close(); - } -} - -void CMainFrame::OnListItemActivated(wxListEvent& event) -{ - uint256 hash((string)GetItemText(m_listCtrl, event.GetIndex(), 1)); - CWalletTx wtx; - CRITICAL_BLOCK(pwalletMain->cs_wallet) - { - map::iterator mi = pwalletMain->mapWallet.find(hash); - if (mi == pwalletMain->mapWallet.end()) - { - printf("CMainFrame::OnListItemActivated() : tx not found in mapWallet\n"); - return; - } - wtx = (*mi).second; - } - CTxDetailsDialog dialog(this, wtx); - dialog.ShowModal(); - //CTxDetailsDialog* pdialog = new CTxDetailsDialog(this, wtx); - //pdialog->Show(); -} - - - - - - -////////////////////////////////////////////////////////////////////////////// -// -// CTxDetailsDialog -// - -CTxDetailsDialog::CTxDetailsDialog(wxWindow* parent, CWalletTx wtx) : CTxDetailsDialogBase(parent) -{ -#ifdef __WXMSW__ - SetSize(nScaleX * GetSize().GetWidth(), nScaleY * GetSize().GetHeight()); -#endif - CRITICAL_BLOCK(pwalletMain->cs_wallet) - { - string strHTML; - strHTML.reserve(4000); - strHTML += ""; - - int64 nTime = wtx.GetTxTime(); - int64 nCredit = wtx.GetCredit(); - int64 nDebit = wtx.GetDebit(); - int64 nNet = nCredit - nDebit; - - - - strHTML += _("Status: ") + FormatTxStatus(wtx); - int nRequests = wtx.GetRequestCount(); - if (nRequests != -1) - { - if (nRequests == 0) - strHTML += _(", has not been successfully broadcast yet"); - else if (nRequests == 1) - strHTML += strprintf(_(", broadcast through %d node"), nRequests); - else - strHTML += strprintf(_(", broadcast through %d nodes"), nRequests); - } - strHTML += "
"; - - strHTML += _("Date: ") + (nTime ? DateTimeStr(nTime) : "") + "
"; - - - // - // From - // - if (wtx.IsCoinBase()) - { - strHTML += _("Source: Generated
"); - } - else if (!wtx.mapValue["from"].empty()) - { - // Online transaction - if (!wtx.mapValue["from"].empty()) - strHTML += _("From: ") + HtmlEscape(wtx.mapValue["from"]) + "
"; - } - else - { - // Offline transaction - if (nNet > 0) - { - // Credit - BOOST_FOREACH(const CTxOut& txout, wtx.vout) - { - if (pwalletMain->IsMine(txout)) - { - CBitcoinAddress address; - if (ExtractAddress(txout.scriptPubKey, pwalletMain, address)) - { - if (pwalletMain->mapAddressBook.count(address)) - { - strHTML += string() + _("From: ") + _("unknown") + "
"; - strHTML += _("To: "); - strHTML += HtmlEscape(address.ToString()); - if (!pwalletMain->mapAddressBook[address].empty()) - strHTML += _(" (yours, label: ") + pwalletMain->mapAddressBook[address] + ")"; - else - strHTML += _(" (yours)"); - strHTML += "
"; - } - } - break; - } - } - } - } - - - // - // To - // - string strAddress; - if (!wtx.mapValue["to"].empty()) - { - // Online transaction - strAddress = wtx.mapValue["to"]; - strHTML += _("To: "); - if (pwalletMain->mapAddressBook.count(strAddress) && !pwalletMain->mapAddressBook[strAddress].empty()) - strHTML += pwalletMain->mapAddressBook[strAddress] + " "; - strHTML += HtmlEscape(strAddress) + "
"; - } - - - // - // Amount - // - if (wtx.IsCoinBase() && nCredit == 0) - { - // - // Coinbase - // - int64 nUnmatured = 0; - BOOST_FOREACH(const CTxOut& txout, wtx.vout) - nUnmatured += pwalletMain->GetCredit(txout); - strHTML += _("Credit: "); - if (wtx.IsInMainChain()) - strHTML += strprintf(_("(%s matures in %d more blocks)"), FormatMoney(nUnmatured).c_str(), wtx.GetBlocksToMaturity()); - else - strHTML += _("(not accepted)"); - strHTML += "
"; - } - else if (nNet > 0) - { - // - // Credit - // - strHTML += _("Credit: ") + FormatMoney(nNet) + "
"; - } - else - { - bool fAllFromMe = true; - BOOST_FOREACH(const CTxIn& txin, wtx.vin) - fAllFromMe = fAllFromMe && pwalletMain->IsMine(txin); - - bool fAllToMe = true; - BOOST_FOREACH(const CTxOut& txout, wtx.vout) - fAllToMe = fAllToMe && pwalletMain->IsMine(txout); - - if (fAllFromMe) - { - // - // Debit - // - BOOST_FOREACH(const CTxOut& txout, wtx.vout) - { - if (pwalletMain->IsMine(txout)) - continue; - - if (wtx.mapValue["to"].empty()) - { - // Offline transaction - CBitcoinAddress address; - if (ExtractAddress(txout.scriptPubKey, pwalletMain, address)) - { - string strAddress = address.ToString(); - strHTML += _("To: "); - if (pwalletMain->mapAddressBook.count(address) && !pwalletMain->mapAddressBook[address].empty()) - strHTML += pwalletMain->mapAddressBook[address] + " "; - strHTML += strAddress; - strHTML += "
"; - } - } - - strHTML += _("Debit: ") + FormatMoney(-txout.nValue) + "
"; - } - - if (fAllToMe) - { - // Payment to self - int64 nChange = wtx.GetChange(); - int64 nValue = nCredit - nChange; - strHTML += _("Debit: ") + FormatMoney(-nValue) + "
"; - strHTML += _("Credit: ") + FormatMoney(nValue) + "
"; - } - - int64 nTxFee = nDebit - wtx.GetValueOut(); - if (nTxFee > 0) - strHTML += _("Transaction fee: ") + FormatMoney(-nTxFee) + "
"; - } - else - { - // - // Mixed debit transaction - // - BOOST_FOREACH(const CTxIn& txin, wtx.vin) - if (pwalletMain->IsMine(txin)) - strHTML += _("Debit: ") + FormatMoney(-pwalletMain->GetDebit(txin)) + "
"; - BOOST_FOREACH(const CTxOut& txout, wtx.vout) - if (pwalletMain->IsMine(txout)) - strHTML += _("Credit: ") + FormatMoney(pwalletMain->GetCredit(txout)) + "
"; - } - } - - strHTML += _("Net amount: ") + FormatMoney(nNet, true) + "
"; - - - // - // Message - // - if (!wtx.mapValue["message"].empty()) - strHTML += string() + "
" + _("Message:") + "
" + HtmlEscape(wtx.mapValue["message"], true) + "
"; - if (!wtx.mapValue["comment"].empty()) - strHTML += string() + "
" + _("Comment:") + "
" + HtmlEscape(wtx.mapValue["comment"], true) + "
"; - - if (wtx.IsCoinBase()) - strHTML += string() + "
" + _("Generated coins must wait 120 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, it will change to \"not accepted\" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.") + "
"; - - - // - // Debug view - // - if (fDebug) - { - strHTML += "

debug print

"; - BOOST_FOREACH(const CTxIn& txin, wtx.vin) - if (pwalletMain->IsMine(txin)) - strHTML += "Debit: " + FormatMoney(-pwalletMain->GetDebit(txin)) + "
"; - BOOST_FOREACH(const CTxOut& txout, wtx.vout) - if (pwalletMain->IsMine(txout)) - strHTML += "Credit: " + FormatMoney(pwalletMain->GetCredit(txout)) + "
"; - - strHTML += "
Transaction:
"; - strHTML += HtmlEscape(wtx.ToString(), true); - - strHTML += "
Inputs:
"; - CRITICAL_BLOCK(pwalletMain->cs_wallet) - { - BOOST_FOREACH(const CTxIn& txin, wtx.vin) - { - COutPoint prevout = txin.prevout; - map::iterator mi = pwalletMain->mapWallet.find(prevout.hash); - if (mi != pwalletMain->mapWallet.end()) - { - const CWalletTx& prev = (*mi).second; - if (prevout.n < prev.vout.size()) - { - strHTML += HtmlEscape(prev.ToString(), true); - strHTML += "    " + FormatTxStatus(prev) + ", "; - strHTML = strHTML + "IsMine=" + (pwalletMain->IsMine(prev.vout[prevout.n]) ? "true" : "false") + "
"; - } - } - } - } - } - - - - strHTML += "
"; - string(strHTML.begin(), strHTML.end()).swap(strHTML); - m_htmlWin->SetPage(strHTML); - m_buttonOK->SetFocus(); - } -} - -void CTxDetailsDialog::OnButtonOK(wxCommandEvent& event) -{ - EndModal(false); -} - - - - - - -////////////////////////////////////////////////////////////////////////////// -// -// Startup folder -// - -#ifdef __WXMSW__ -string StartupShortcutPath() -{ - return MyGetSpecialFolderPath(CSIDL_STARTUP, true) + "\\Bitcoin.lnk"; -} - -bool GetStartOnSystemStartup() -{ - return filesystem::exists(StartupShortcutPath().c_str()); -} - -void SetStartOnSystemStartup(bool fAutoStart) -{ - // If the shortcut exists already, remove it for updating - remove(StartupShortcutPath().c_str()); - - if (fAutoStart) - { - CoInitialize(NULL); - - // Get a pointer to the IShellLink interface. - IShellLink* psl = NULL; - HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL, - CLSCTX_INPROC_SERVER, IID_IShellLink, - reinterpret_cast(&psl)); - - if (SUCCEEDED(hres)) - { - // Get the current executable path - TCHAR pszExePath[MAX_PATH]; - GetModuleFileName(NULL, pszExePath, sizeof(pszExePath)); - - // Set the path to the shortcut target - psl->SetPath(pszExePath); - PathRemoveFileSpec(pszExePath); - psl->SetWorkingDirectory(pszExePath); - psl->SetShowCmd(SW_SHOWMINNOACTIVE); - - // Query IShellLink for the IPersistFile interface for - // saving the shortcut in persistent storage. - IPersistFile* ppf = NULL; - hres = psl->QueryInterface(IID_IPersistFile, - reinterpret_cast(&ppf)); - if (SUCCEEDED(hres)) - { - WCHAR pwsz[MAX_PATH]; - // Ensure that the string is ANSI. - MultiByteToWideChar(CP_ACP, 0, StartupShortcutPath().c_str(), -1, pwsz, MAX_PATH); - // Save the link by calling IPersistFile::Save. - hres = ppf->Save(pwsz, TRUE); - ppf->Release(); - } - psl->Release(); - } - CoUninitialize(); - } -} - -#elif defined(__WXGTK__) - -// Follow the Desktop Application Autostart Spec: -// http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html - -boost::filesystem::path GetAutostartDir() -{ - namespace fs = boost::filesystem; - - char* pszConfigHome = getenv("XDG_CONFIG_HOME"); - if (pszConfigHome) return fs::path(pszConfigHome) / fs::path("autostart"); - char* pszHome = getenv("HOME"); - if (pszHome) return fs::path(pszHome) / fs::path(".config/autostart"); - return fs::path(); -} - -boost::filesystem::path GetAutostartFilePath() -{ - return GetAutostartDir() / boost::filesystem::path("bitcoin.desktop"); -} - -bool GetStartOnSystemStartup() -{ - boost::filesystem::ifstream optionFile(GetAutostartFilePath()); - if (!optionFile.good()) - return false; - // Scan through file for "Hidden=true": - string line; - while (!optionFile.eof()) - { - getline(optionFile, line); - if (line.find("Hidden") != string::npos && - line.find("true") != string::npos) - return false; - } - optionFile.close(); - - return true; -} - -void SetStartOnSystemStartup(bool fAutoStart) -{ - if (!fAutoStart) - { -#if defined(BOOST_FILESYSTEM_VERSION) && BOOST_FILESYSTEM_VERSION >= 3 - unlink(GetAutostartFilePath().string().c_str()); -#else - unlink(GetAutostartFilePath().native_file_string().c_str()); -#endif - } - else - { - char pszExePath[MAX_PATH+1]; - memset(pszExePath, 0, sizeof(pszExePath)); - if (readlink("/proc/self/exe", pszExePath, sizeof(pszExePath)-1) == -1) - return; - - boost::filesystem::create_directories(GetAutostartDir()); - - boost::filesystem::ofstream optionFile(GetAutostartFilePath(), ios_base::out|ios_base::trunc); - if (!optionFile.good()) - { - wxMessageBox(_("Cannot write autostart/bitcoin.desktop file"), "Bitcoin"); - return; - } - // Write a bitcoin.desktop file to the autostart directory: - optionFile << "[Desktop Entry]\n"; - optionFile << "Type=Application\n"; - optionFile << "Name=Bitcoin\n"; - optionFile << "Exec=" << pszExePath << "\n"; - optionFile << "Terminal=false\n"; - optionFile << "Hidden=false\n"; - optionFile.close(); - } -} -#else - -// TODO: OSX startup stuff; see: -// http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPSystemStartup/Articles/CustomLogin.html - -bool GetStartOnSystemStartup() { return false; } -void SetStartOnSystemStartup(bool fAutoStart) { } - -#endif - - - - - - -////////////////////////////////////////////////////////////////////////////// -// -// COptionsDialog -// - -COptionsDialog::COptionsDialog(wxWindow* parent) : COptionsDialogBase(parent) -{ - // Set up list box of page choices - m_listBox->Append(_("Main")); - //m_listBox->Append(_("Test 2")); - m_listBox->SetSelection(0); - SelectPage(0); -#ifndef __WXMSW__ - SetSize(1.0 * GetSize().GetWidth(), 1.2 * GetSize().GetHeight()); -#else - SetSize(nScaleX * GetSize().GetWidth(), nScaleY * GetSize().GetHeight()); -#endif -#if defined(__WXGTK__) || defined(__WXMAC_OSX__) - m_checkBoxStartOnSystemStartup->SetLabel(_("&Start Bitcoin on window system startup")); - if (!GetBoolArg("-minimizetotray")) - { - // Minimize to tray is just too buggy on Linux - fMinimizeToTray = false; - m_checkBoxMinimizeToTray->SetValue(false); - m_checkBoxMinimizeToTray->Enable(false); - m_checkBoxMinimizeOnClose->SetLabel(_("&Minimize on close")); - } -#endif -#ifdef __WXMAC_OSX__ - m_checkBoxStartOnSystemStartup->Enable(false); // not implemented yet -#endif - - // Init values - m_textCtrlTransactionFee->SetValue(FormatMoney(nTransactionFee)); - m_checkBoxStartOnSystemStartup->SetValue(fTmpStartOnSystemStartup = GetStartOnSystemStartup()); - m_checkBoxMinimizeToTray->SetValue(fMinimizeToTray); - m_checkBoxMinimizeOnClose->SetValue(fMinimizeOnClose); - if (fHaveUPnP) - m_checkBoxUseUPnP->SetValue(fUseUPnP); - else - m_checkBoxUseUPnP->Enable(false); - m_checkBoxUseProxy->SetValue(fUseProxy); - m_textCtrlProxyIP->Enable(fUseProxy); - m_textCtrlProxyPort->Enable(fUseProxy); - m_staticTextProxyIP->Enable(fUseProxy); - m_staticTextProxyPort->Enable(fUseProxy); - m_textCtrlProxyIP->SetValue(addrProxy.ToStringIP()); - m_textCtrlProxyPort->SetValue(addrProxy.ToStringPort()); - - m_buttonOK->SetFocus(); -} - -void COptionsDialog::SelectPage(int nPage) -{ - m_panelMain->Show(nPage == 0); - m_panelTest2->Show(nPage == 1); - - m_scrolledWindow->Layout(); - m_scrolledWindow->SetScrollbars(0, 0, 0, 0, 0, 0); -} - -void COptionsDialog::OnListBox(wxCommandEvent& event) -{ - SelectPage(event.GetSelection()); -} - -void COptionsDialog::OnKillFocusTransactionFee(wxFocusEvent& event) -{ - event.Skip(); - int64 nTmp = nTransactionFee; - ParseMoney(m_textCtrlTransactionFee->GetValue(), nTmp); - m_textCtrlTransactionFee->SetValue(FormatMoney(nTmp)); -} - -void COptionsDialog::OnCheckBoxUseProxy(wxCommandEvent& event) -{ - m_textCtrlProxyIP->Enable(event.IsChecked()); - m_textCtrlProxyPort->Enable(event.IsChecked()); - m_staticTextProxyIP->Enable(event.IsChecked()); - m_staticTextProxyPort->Enable(event.IsChecked()); -} - -CAddress COptionsDialog::GetProxyAddr() -{ - // Be careful about byte order, addr.ip and addr.port are big endian - CAddress addr(m_textCtrlProxyIP->GetValue() + ":" + m_textCtrlProxyPort->GetValue()); - if (addr.ip == INADDR_NONE) - addr.ip = addrProxy.ip; - int nPort = atoi(m_textCtrlProxyPort->GetValue()); - addr.port = htons(nPort); - if (nPort <= 0 || nPort > USHRT_MAX) - addr.port = addrProxy.port; - return addr; -} - -void COptionsDialog::OnKillFocusProxy(wxFocusEvent& event) -{ - event.Skip(); - m_textCtrlProxyIP->SetValue(GetProxyAddr().ToStringIP()); - m_textCtrlProxyPort->SetValue(GetProxyAddr().ToStringPort()); -} - - -void COptionsDialog::OnButtonOK(wxCommandEvent& event) -{ - OnButtonApply(event); - EndModal(false); -} - -void COptionsDialog::OnButtonCancel(wxCommandEvent& event) -{ - EndModal(false); -} - -void COptionsDialog::OnButtonApply(wxCommandEvent& event) -{ - CWalletDB walletdb(pwalletMain->strWalletFile); - - int64 nPrevTransactionFee = nTransactionFee; - if (ParseMoney(m_textCtrlTransactionFee->GetValue(), nTransactionFee) && nTransactionFee != nPrevTransactionFee) - walletdb.WriteSetting("nTransactionFee", nTransactionFee); - - if (fTmpStartOnSystemStartup != m_checkBoxStartOnSystemStartup->GetValue()) - { - fTmpStartOnSystemStartup = m_checkBoxStartOnSystemStartup->GetValue(); - SetStartOnSystemStartup(fTmpStartOnSystemStartup); - } - - if (fMinimizeToTray != m_checkBoxMinimizeToTray->GetValue()) - { - fMinimizeToTray = m_checkBoxMinimizeToTray->GetValue(); - walletdb.WriteSetting("fMinimizeToTray", fMinimizeToTray); - ptaskbaricon->Show(fMinimizeToTray || fClosedToTray); - } - - if (fMinimizeOnClose != m_checkBoxMinimizeOnClose->GetValue()) - { - fMinimizeOnClose = m_checkBoxMinimizeOnClose->GetValue(); - walletdb.WriteSetting("fMinimizeOnClose", fMinimizeOnClose); - } - - if (fHaveUPnP && fUseUPnP != m_checkBoxUseUPnP->GetValue()) - { - fUseUPnP = m_checkBoxUseUPnP->GetValue(); - walletdb.WriteSetting("fUseUPnP", fUseUPnP); - MapPort(fUseUPnP); - } - - fUseProxy = m_checkBoxUseProxy->GetValue(); - walletdb.WriteSetting("fUseProxy", fUseProxy); - - addrProxy = GetProxyAddr(); - walletdb.WriteSetting("addrProxy", addrProxy); -} - - - - - - -////////////////////////////////////////////////////////////////////////////// -// -// CAboutDialog -// - -CAboutDialog::CAboutDialog(wxWindow* parent) : CAboutDialogBase(parent) -{ - m_staticTextVersion->SetLabel(strprintf(_("version %s"), FormatFullVersion().c_str())); - - // Change (c) into UTF-8 or ANSI copyright symbol - wxString str = m_staticTextMain->GetLabel(); -#if wxUSE_UNICODE - str.Replace("(c)", wxString::FromUTF8("\xC2\xA9")); -#else - str.Replace("(c)", "\xA9"); -#endif - m_staticTextMain->SetLabel(str); -#ifndef __WXMSW__ - // Resize on Linux to make the window fit the text. - // The text was wrapped manually rather than using the Wrap setting because - // the wrap would be too small on Linux and it can't be changed at this point. - wxFont fontTmp = m_staticTextMain->GetFont(); - if (fontTmp.GetPointSize() > 8); - fontTmp.SetPointSize(8); - m_staticTextMain->SetFont(fontTmp); - SetSize(GetSize().GetWidth() + 44, GetSize().GetHeight() + 10); -#else - SetSize(nScaleX * GetSize().GetWidth(), nScaleY * GetSize().GetHeight()); -#endif -} - -void CAboutDialog::OnButtonOK(wxCommandEvent& event) -{ - EndModal(false); -} - - - - - - -////////////////////////////////////////////////////////////////////////////// -// -// CSendDialog -// - -CSendDialog::CSendDialog(wxWindow* parent, const wxString& strAddress) : CSendDialogBase(parent) -{ - // Init - m_textCtrlAddress->SetValue(strAddress); - m_choiceTransferType->SetSelection(0); - m_bitmapCheckMark->Show(false); - fEnabledPrev = true; - m_textCtrlAddress->SetFocus(); - - //// todo: should add a display of your balance for convenience -#ifndef __WXMSW__ - wxFont fontTmp = m_staticTextInstructions->GetFont(); - if (fontTmp.GetPointSize() > 9); - fontTmp.SetPointSize(9); - m_staticTextInstructions->SetFont(fontTmp); - SetSize(725, 180); -#else - SetSize(nScaleX * GetSize().GetWidth(), nScaleY * GetSize().GetHeight()); -#endif - - // Set Icon - if (nScaleX == 1.0 && nScaleY == 1.0) // We don't have icons of the proper size otherwise - { - wxIcon iconSend; - iconSend.CopyFromBitmap(wxBitmap(send16noshadow_xpm)); - SetIcon(iconSend); - } -#ifdef __WXMSW__ - else - SetIcon(wxICON(bitcoin)); -#endif - - // Fixup the tab order - m_buttonPaste->MoveAfterInTabOrder(m_buttonCancel); - m_buttonAddress->MoveAfterInTabOrder(m_buttonPaste); - this->Layout(); -} - -void CSendDialog::OnKillFocusAmount(wxFocusEvent& event) -{ - // Reformat the amount - event.Skip(); - if (m_textCtrlAmount->GetValue().Trim().empty()) - return; - int64 nTmp; - if (ParseMoney(m_textCtrlAmount->GetValue(), nTmp)) - m_textCtrlAmount->SetValue(FormatMoney(nTmp)); -} - -void CSendDialog::OnButtonAddressBook(wxCommandEvent& event) -{ - // Open address book - CAddressBookDialog dialog(this, m_textCtrlAddress->GetValue(), CAddressBookDialog::SENDING, true); - if (dialog.ShowModal()) - m_textCtrlAddress->SetValue(dialog.GetSelectedAddress()); -} - -void CSendDialog::OnButtonPaste(wxCommandEvent& event) -{ - // Copy clipboard to address box - if (wxTheClipboard->Open()) - { - if (wxTheClipboard->IsSupported(wxDF_TEXT)) - { - wxTextDataObject data; - wxTheClipboard->GetData(data); - m_textCtrlAddress->SetValue(data.GetText()); - } - wxTheClipboard->Close(); - } -} - -void CSendDialog::OnButtonSend(wxCommandEvent& event) -{ - static CCriticalSection cs_sendlock; - TRY_CRITICAL_BLOCK(cs_sendlock) - { - CWalletTx wtx; - string strAddress = (string)m_textCtrlAddress->GetValue(); - - // Parse amount - int64 nValue = 0; - if (!ParseMoney(m_textCtrlAmount->GetValue(), nValue) || nValue <= 0) - { - wxMessageBox(_("Error in amount "), _("Send Coins")); - return; - } - if (nValue > pwalletMain->GetBalance()) - { - wxMessageBox(_("Amount exceeds your balance "), _("Send Coins")); - return; - } - if (nValue + nTransactionFee > pwalletMain->GetBalance()) - { - wxMessageBox(string(_("Total exceeds your balance when the ")) + FormatMoney(nTransactionFee) + _(" transaction fee is included "), _("Send Coins")); - return; - } - - // Parse bitcoin address - CBitcoinAddress address(strAddress); - bool fBitcoinAddress = address.IsValid(); - - if (fBitcoinAddress) - { - bool fWasLocked = pwalletMain->IsLocked(); - if (!GetWalletPassphrase()) - return; - - string strError; - CRITICAL_BLOCK(cs_main) - CRITICAL_BLOCK(pwalletMain->cs_wallet) - { - // Send to bitcoin address - CScript scriptPubKey; - scriptPubKey.SetBitcoinAddress(address); - - strError = pwalletMain->SendMoney(scriptPubKey, nValue, wtx, true); - } - if (strError == "") - { - pframeMain->RefreshListCtrl(); - wxMessageBox(_("Payment sent "), _("Sending...")); - } - else if (strError == "ABORTED") - { - if (fWasLocked) - pwalletMain->Lock(); - return; // leave send dialog open - } - else - { - wxMessageBox(strError + " ", _("Sending...")); - EndModal(false); - if (fWasLocked) - pwalletMain->Lock(); - return; - } - - if (fWasLocked) - pwalletMain->Lock(); - } - else - { - // Parse IP address - CAddress addr(strAddress); - if (!addr.IsValid()) - { - wxMessageBox(_("Invalid address "), _("Send Coins")); - return; - } - - // Message - wtx.mapValue["to"] = strAddress; - - // Send to IP address - CSendingDialog* pdialog = new CSendingDialog(this, addr, nValue, wtx); - if (!pdialog->ShowModal()) - return; - } - - CRITICAL_BLOCK(pwalletMain->cs_wallet) - if (!pwalletMain->mapAddressBook.count(address)) - pwalletMain->SetAddressBookName(strAddress, ""); - - EndModal(true); - } -} - -void CSendDialog::OnButtonCancel(wxCommandEvent& event) -{ - // Cancel - EndModal(false); -} - - - - - - -////////////////////////////////////////////////////////////////////////////// -// -// CSendingDialog -// - -CSendingDialog::CSendingDialog(wxWindow* parent, const CAddress& addrIn, int64 nPriceIn, const CWalletTx& wtxIn) : CSendingDialogBase(NULL) // we have to give null so parent can't destroy us -{ - addr = addrIn; - nPrice = nPriceIn; - wtx = wtxIn; - start = wxDateTime::UNow(); - memset(pszStatus, 0, sizeof(pszStatus)); - fCanCancel = true; - fAbort = false; - fSuccess = false; - fUIDone = false; - fWorkDone = false; -#ifndef __WXMSW__ - SetSize(1.2 * GetSize().GetWidth(), 1.08 * GetSize().GetHeight()); -#else - SetSize(nScaleX * GetSize().GetWidth(), nScaleY * GetSize().GetHeight()); -#endif - - SetTitle(strprintf(_("Sending %s to %s"), FormatMoney(nPrice).c_str(), wtx.mapValue["to"].c_str())); - m_textCtrlStatus->SetValue(""); - - CreateThread(SendingDialogStartTransfer, this); -} - -CSendingDialog::~CSendingDialog() -{ - printf("~CSendingDialog()\n"); -} - -void CSendingDialog::Close() -{ - // Last one out turn out the lights. - // fWorkDone signals that work side is done and UI thread should call destroy. - // fUIDone signals that UI window has closed and work thread should call destroy. - // This allows the window to disappear and end modality when cancelled - // without making the user wait for ConnectNode to return. The dialog object - // hangs around in the background until the work thread exits. - if (IsModal()) - EndModal(fSuccess); - else - Show(false); - if (fWorkDone) - Destroy(); - else - fUIDone = true; -} - -void CSendingDialog::OnClose(wxCloseEvent& event) -{ - if (!event.CanVeto() || fWorkDone || fAbort || !fCanCancel) - { - Close(); - } - else - { - event.Veto(); - wxCommandEvent cmdevent; - OnButtonCancel(cmdevent); - } -} - -void CSendingDialog::OnButtonOK(wxCommandEvent& event) -{ - if (fWorkDone) - Close(); -} - -void CSendingDialog::OnButtonCancel(wxCommandEvent& event) -{ - if (fCanCancel) - fAbort = true; -} - -void CSendingDialog::OnPaint(wxPaintEvent& event) -{ - event.Skip(); - if (strlen(pszStatus) > 130) - m_textCtrlStatus->SetValue(string("\n") + pszStatus); - else - m_textCtrlStatus->SetValue(string("\n\n") + pszStatus); - m_staticTextSending->SetFocus(); - if (!fCanCancel) - m_buttonCancel->Enable(false); - if (fWorkDone) - { - m_buttonOK->Enable(true); - m_buttonOK->SetFocus(); - m_buttonCancel->Enable(false); - } - if (fAbort && fCanCancel && IsShown()) - { - strcpy(pszStatus, _("CANCELLED")); - m_buttonOK->Enable(true); - m_buttonOK->SetFocus(); - m_buttonCancel->Enable(false); - m_buttonCancel->SetLabel(_("Cancelled")); - Close(); - wxMessageBox(_("Transfer cancelled "), _("Sending..."), wxOK, this); - } -} - - -// -// Everything from here on is not in the UI thread and must only communicate -// with the rest of the dialog through variables and calling repaint. -// - -void CSendingDialog::Repaint() -{ - Refresh(); - wxPaintEvent event; - GetEventHandler()->AddPendingEvent(event); -} - -bool CSendingDialog::Status() -{ - if (fUIDone) - { - Destroy(); - return false; - } - if (fAbort && fCanCancel) - { - memset(pszStatus, 0, 10); - strcpy(pszStatus, _("CANCELLED")); - Repaint(); - fWorkDone = true; - return false; - } - return true; -} - -bool CSendingDialog::Status(const string& str) -{ - if (!Status()) - return false; - - // This can be read by the UI thread at any time, - // so copy in a way that can be read cleanly at all times. - memset(pszStatus, 0, min(str.size()+1, sizeof(pszStatus))); - strlcpy(pszStatus, str.c_str(), sizeof(pszStatus)); - - Repaint(); - return true; -} - -bool CSendingDialog::Error(const string& str) -{ - fCanCancel = false; - fWorkDone = true; - Status(string(_("Error: ")) + str); - return false; -} - -void SendingDialogStartTransfer(void* parg) -{ - ((CSendingDialog*)parg)->StartTransfer(); -} - -void CSendingDialog::StartTransfer() -{ - // Make sure we have enough money - if (nPrice + nTransactionFee > pwalletMain->GetBalance()) - { - Error(_("Insufficient funds")); - return; - } - - // We may have connected already for product details - if (!Status(_("Connecting..."))) - return; - CNode* pnode = ConnectNode(addr, 15 * 60); - if (!pnode) - { - Error(_("Unable to connect")); - return; - } - - // Send order to seller, with response going to OnReply2 via event handler - if (!Status(_("Requesting public key..."))) - return; - pnode->PushRequest("checkorder", wtx, SendingDialogOnReply2, this); -} - -void SendingDialogOnReply2(void* parg, CDataStream& vRecv) -{ - ((CSendingDialog*)parg)->OnReply2(vRecv); -} - -void CSendingDialog::OnReply2(CDataStream& vRecv) -{ - if (!Status(_("Received public key..."))) - return; - - CScript scriptPubKey; - int nRet; - try - { - vRecv >> nRet; - if (nRet > 0) - { - string strMessage; - if (!vRecv.empty()) - vRecv >> strMessage; - if (nRet == 2) - Error(_("Recipient is not accepting transactions sent by IP address")); - else - Error(_("Transfer was not accepted")); - //// todo: enlarge the window and enable a hidden white box to put seller's message - return; - } - vRecv >> scriptPubKey; - } - catch (...) - { - //// what do we want to do about this? - Error(_("Invalid response received")); - return; - } - - // Pause to give the user a chance to cancel - while (wxDateTime::UNow() < start + wxTimeSpan(0, 0, 0, 2 * 1000)) - { - Sleep(200); - if (!Status()) - return; - } - - // Pay - if (!Status(_("Creating transaction..."))) - return; - if (nPrice + nTransactionFee > pwalletMain->GetBalance()) - { - Error(_("Insufficient funds")); - return; - } - - CReserveKey reservekey(pwalletMain); - int64 nFeeRequired; - bool fWasLocked = pwalletMain->IsLocked(); - if (!GetWalletPassphrase()) - return; - - bool fTxCreated = false; - CRITICAL_BLOCK(cs_main) - CRITICAL_BLOCK(pwalletMain->cs_wallet) - { - fTxCreated = pwalletMain->CreateTransaction(scriptPubKey, nPrice, wtx, reservekey, nFeeRequired); - } - if (!fTxCreated) - { - if (nPrice + nFeeRequired > pwalletMain->GetBalance()) - Error(strprintf(_("This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds"), FormatMoney(nFeeRequired).c_str())); - else - Error(_("Transaction creation failed")); - return; - } - - if (fWasLocked) - pwalletMain->Lock(); - - // Transaction fee - if (!ThreadSafeAskFee(nFeeRequired, _("Sending..."), this)) - { - Error(_("Transaction aborted")); - return; - } - - // Make sure we're still connected - CNode* pnode = ConnectNode(addr, 2 * 60 * 60); - if (!pnode) - { - Error(_("Lost connection, transaction cancelled")); - return; - } - - // Last chance to cancel - Sleep(50); - if (!Status()) - return; - fCanCancel = false; - if (fAbort) - { - fCanCancel = true; - if (!Status()) - return; - fCanCancel = false; - } - if (!Status(_("Sending payment..."))) - return; - - // Commit - bool fTxCommitted = false; - CRITICAL_BLOCK(cs_main) - CRITICAL_BLOCK(pwalletMain->cs_wallet) - { - fTxCommitted = pwalletMain->CommitTransaction(wtx, reservekey); - } - if (!fTxCommitted) - { - Error(_("The transaction was rejected. This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.")); - return; - } - - // Send payment tx to seller, with response going to OnReply3 via event handler - CWalletTx wtxSend = wtx; - wtxSend.fFromMe = false; - pnode->PushRequest("submitorder", wtxSend, SendingDialogOnReply3, this); - - Status(_("Waiting for confirmation...")); - MainFrameRepaint(); -} - -void SendingDialogOnReply3(void* parg, CDataStream& vRecv) -{ - ((CSendingDialog*)parg)->OnReply3(vRecv); -} - -void CSendingDialog::OnReply3(CDataStream& vRecv) -{ - int nRet; - try - { - vRecv >> nRet; - if (nRet > 0) - { - Error(_("The payment was sent, but the recipient was unable to verify it.\n" - "The transaction is recorded and will credit to the recipient,\n" - "but the comment information will be blank.")); - return; - } - } - catch (...) - { - //// what do we want to do about this? - Error(_("Payment was sent, but an invalid response was received")); - return; - } - - fSuccess = true; - fWorkDone = true; - Status(_("Payment completed")); -} - - - - - - -////////////////////////////////////////////////////////////////////////////// -// -// CAddressBookDialog -// - -CAddressBookDialog::CAddressBookDialog(wxWindow* parent, const wxString& strInitSelected, int nPageIn, bool fDuringSendIn) : CAddressBookDialogBase(parent) -{ -#ifdef __WXMSW__ - SetSize(nScaleX * GetSize().GetWidth(), nScaleY * GetSize().GetHeight()); -#endif - - // Set initially selected page - wxNotebookEvent event; - event.SetSelection(nPageIn); - OnNotebookPageChanged(event); - m_notebook->ChangeSelection(nPageIn); - - fDuringSend = fDuringSendIn; - if (!fDuringSend) - m_buttonCancel->Show(false); - - // Set Icon - if (nScaleX == 1.0 && nScaleY == 1.0) // We don't have icons of the proper size otherwise - { - wxIcon iconAddressBook; - iconAddressBook.CopyFromBitmap(wxBitmap(addressbook16_xpm)); - SetIcon(iconAddressBook); - } -#ifdef __WXMSW__ - else - SetIcon(wxICON(bitcoin)); -#endif - - // Init column headers - m_listCtrlSending->InsertColumn(0, _("Name"), wxLIST_FORMAT_LEFT, 200); - m_listCtrlSending->InsertColumn(1, _("Address"), wxLIST_FORMAT_LEFT, 350); - m_listCtrlSending->SetFocus(); - m_listCtrlReceiving->InsertColumn(0, _("Label"), wxLIST_FORMAT_LEFT, 200); - m_listCtrlReceiving->InsertColumn(1, _("Bitcoin Address"), wxLIST_FORMAT_LEFT, 350); - m_listCtrlReceiving->SetFocus(); - - // Fill listctrl with address book data - CRITICAL_BLOCK(pwalletMain->cs_wallet) - { - string strDefaultReceiving = (string)pframeMain->m_textCtrlAddress->GetValue(); - BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, string)& item, pwalletMain->mapAddressBook) - { - const CBitcoinAddress& address = item.first; - string strName = item.second; - bool fMine = pwalletMain->HaveKey(address); - wxListCtrl* plistCtrl = fMine ? m_listCtrlReceiving : m_listCtrlSending; - int nIndex = InsertLine(plistCtrl, strName, address.ToString()); - if (address.ToString() == (fMine ? strDefaultReceiving : string(strInitSelected))) - plistCtrl->SetItemState(nIndex, wxLIST_STATE_SELECTED|wxLIST_STATE_FOCUSED, wxLIST_STATE_SELECTED|wxLIST_STATE_FOCUSED); - } - } -} - -wxString CAddressBookDialog::GetSelectedAddress() -{ - int nIndex = GetSelection(m_listCtrl); - if (nIndex == -1) - return ""; - return GetItemText(m_listCtrl, nIndex, 1); -} - -wxString CAddressBookDialog::GetSelectedSendingAddress() -{ - int nIndex = GetSelection(m_listCtrlSending); - if (nIndex == -1) - return ""; - return GetItemText(m_listCtrlSending, nIndex, 1); -} - -wxString CAddressBookDialog::GetSelectedReceivingAddress() -{ - int nIndex = GetSelection(m_listCtrlReceiving); - if (nIndex == -1) - return ""; - return GetItemText(m_listCtrlReceiving, nIndex, 1); -} - -void CAddressBookDialog::OnNotebookPageChanged(wxNotebookEvent& event) -{ - event.Skip(); - nPage = event.GetSelection(); - if (nPage == SENDING) - m_listCtrl = m_listCtrlSending; - else if (nPage == RECEIVING) - m_listCtrl = m_listCtrlReceiving; - m_buttonDelete->Show(nPage == SENDING); - m_buttonCopy->Show(nPage == RECEIVING); - this->Layout(); - m_listCtrl->SetFocus(); -} - -void CAddressBookDialog::OnListEndLabelEdit(wxListEvent& event) -{ - // Update address book with edited name - event.Skip(); - if (event.IsEditCancelled()) - return; - string strAddress = (string)GetItemText(m_listCtrl, event.GetIndex(), 1); - CRITICAL_BLOCK(pwalletMain->cs_wallet) - pwalletMain->SetAddressBookName(strAddress, string(event.GetText())); - pframeMain->RefreshListCtrl(); -} - -void CAddressBookDialog::OnListItemSelected(wxListEvent& event) -{ - event.Skip(); - if (nPage == RECEIVING) - SetDefaultReceivingAddress((string)GetSelectedReceivingAddress()); -} - -void CAddressBookDialog::OnListItemActivated(wxListEvent& event) -{ - event.Skip(); - if (fDuringSend) - { - // Doubleclick returns selection - EndModal(GetSelectedAddress() != "" ? 2 : 0); - return; - } - - // Doubleclick edits item - wxCommandEvent event2; - OnButtonEdit(event2); -} - -void CAddressBookDialog::OnButtonDelete(wxCommandEvent& event) -{ - if (nPage != SENDING) - return; - for (int nIndex = m_listCtrl->GetItemCount()-1; nIndex >= 0; nIndex--) - { - if (m_listCtrl->GetItemState(nIndex, wxLIST_STATE_SELECTED)) - { - string strAddress = (string)GetItemText(m_listCtrl, nIndex, 1); - CRITICAL_BLOCK(pwalletMain->cs_wallet) - pwalletMain->DelAddressBookName(strAddress); - m_listCtrl->DeleteItem(nIndex); - } - } - pframeMain->RefreshListCtrl(); -} - -void CAddressBookDialog::OnButtonCopy(wxCommandEvent& event) -{ - // Copy address box to clipboard - if (wxTheClipboard->Open()) - { - wxTheClipboard->SetData(new wxTextDataObject(GetSelectedAddress())); - wxTheClipboard->Close(); - } -} - -bool CAddressBookDialog::CheckIfMine(const string& strAddress, const string& strTitle) -{ - CBitcoinAddress address(strAddress); - bool fMine = address.IsValid() && pwalletMain->HaveKey(address); - if (fMine) - wxMessageBox(_("This is one of your own addresses for receiving payments and cannot be entered in the address book. "), strTitle); - return fMine; -} - -void CAddressBookDialog::OnButtonEdit(wxCommandEvent& event) -{ - int nIndex = GetSelection(m_listCtrl); - if (nIndex == -1) - return; - string strName = (string)m_listCtrl->GetItemText(nIndex); - string strAddress = (string)GetItemText(m_listCtrl, nIndex, 1); - string strAddressOrg = strAddress; - - if (nPage == SENDING) - { - // Ask name and address - do - { - CGetTextFromUserDialog dialog(this, _("Edit Address"), _("Name"), strName, _("Address"), strAddress); - if (!dialog.ShowModal()) - return; - strName = dialog.GetValue1(); - strAddress = dialog.GetValue2(); - } - while (CheckIfMine(strAddress, _("Edit Address"))); - - } - else if (nPage == RECEIVING) - { - // Ask name - CGetTextFromUserDialog dialog(this, _("Edit Address Label"), _("Label"), strName); - if (!dialog.ShowModal()) - return; - strName = dialog.GetValue(); - } - - // Write back - CRITICAL_BLOCK(pwalletMain->cs_wallet) - { - if (strAddress != strAddressOrg) - pwalletMain->DelAddressBookName(strAddressOrg); - pwalletMain->SetAddressBookName(strAddress, strName); - } - m_listCtrl->SetItem(nIndex, 1, strAddress); - m_listCtrl->SetItemText(nIndex, strName); - pframeMain->RefreshListCtrl(); -} - -void CAddressBookDialog::OnButtonNew(wxCommandEvent& event) -{ - string strName; - string strAddress; - - if (nPage == SENDING) - { - // Ask name and address - do - { - CGetTextFromUserDialog dialog(this, _("Add Address"), _("Name"), strName, _("Address"), strAddress); - if (!dialog.ShowModal()) - return; - strName = dialog.GetValue1(); - strAddress = dialog.GetValue2(); - } - while (CheckIfMine(strAddress, _("Add Address"))); - } - else if (nPage == RECEIVING) - { - // Ask name - CGetTextFromUserDialog dialog(this, - _("New Receiving Address"), - _("You should use a new address for each payment you receive.\n\nLabel"), - ""); - if (!dialog.ShowModal()) - return; - strName = dialog.GetValue(); - - bool fWasLocked = pwalletMain->IsLocked(); - if (!GetWalletPassphrase()) - return; - - // Generate new key - std::vector newKey; - pwalletMain->GetKeyFromPool(newKey, true); - strAddress = CBitcoinAddress(newKey).ToString(); - - if (fWasLocked) - pwalletMain->Lock(); - } - - // Add to list and select it - CRITICAL_BLOCK(pwalletMain->cs_wallet) - pwalletMain->SetAddressBookName(strAddress, strName); - int nIndex = InsertLine(m_listCtrl, strName, strAddress); - SetSelection(m_listCtrl, nIndex); - m_listCtrl->SetFocus(); - if (nPage == SENDING) - pframeMain->RefreshListCtrl(); -} - -void CAddressBookDialog::OnButtonOK(wxCommandEvent& event) -{ - // OK - EndModal(GetSelectedAddress() != "" ? 1 : 0); -} - -void CAddressBookDialog::OnButtonCancel(wxCommandEvent& event) -{ - // Cancel - EndModal(0); -} - -void CAddressBookDialog::OnClose(wxCloseEvent& event) -{ - // Close - EndModal(0); -} - - - - - - -////////////////////////////////////////////////////////////////////////////// -// -// CMyTaskBarIcon -// - -enum -{ - ID_TASKBAR_RESTORE = 10001, - ID_TASKBAR_SEND, - ID_TASKBAR_OPTIONS, - ID_TASKBAR_GENERATE, - ID_TASKBAR_EXIT, -}; - -BEGIN_EVENT_TABLE(CMyTaskBarIcon, wxTaskBarIcon) - EVT_TASKBAR_LEFT_DCLICK(CMyTaskBarIcon::OnLeftButtonDClick) - EVT_MENU(ID_TASKBAR_RESTORE, CMyTaskBarIcon::OnMenuRestore) - EVT_MENU(ID_TASKBAR_SEND, CMyTaskBarIcon::OnMenuSend) - EVT_MENU(ID_TASKBAR_OPTIONS, CMyTaskBarIcon::OnMenuOptions) - EVT_UPDATE_UI(ID_TASKBAR_GENERATE, CMyTaskBarIcon::OnUpdateUIGenerate) - EVT_MENU(ID_TASKBAR_EXIT, CMyTaskBarIcon::OnMenuExit) -END_EVENT_TABLE() - -void CMyTaskBarIcon::Show(bool fShow) -{ - static char pszPrevTip[200]; - if (fShow) - { - string strTooltip = _("Bitcoin"); - if (fGenerateBitcoins) - strTooltip = _("Bitcoin - Generating"); - if (fGenerateBitcoins && vNodes.empty()) - strTooltip = _("Bitcoin - (not connected)"); - - // Optimization, only update when changed, using char array to be reentrant - if (strncmp(pszPrevTip, strTooltip.c_str(), sizeof(pszPrevTip)-1) != 0) - { - strlcpy(pszPrevTip, strTooltip.c_str(), sizeof(pszPrevTip)); -#ifdef __WXMSW__ - // somehow it'll choose the wrong size and scale it down if - // we use the main icon, so we hand it one with only 16x16 - SetIcon(wxICON(favicon), strTooltip); -#else - SetIcon(bitcoin80_xpm, strTooltip); -#endif - } - } - else - { - strlcpy(pszPrevTip, "", sizeof(pszPrevTip)); - RemoveIcon(); - } -} - -void CMyTaskBarIcon::Hide() -{ - Show(false); -} - -void CMyTaskBarIcon::OnLeftButtonDClick(wxTaskBarIconEvent& event) -{ - Restore(); -} - -void CMyTaskBarIcon::OnMenuRestore(wxCommandEvent& event) -{ - Restore(); -} - -void CMyTaskBarIcon::OnMenuSend(wxCommandEvent& event) -{ - // Taskbar: Send - CSendDialog dialog(pframeMain); - dialog.ShowModal(); -} - -void CMyTaskBarIcon::OnMenuOptions(wxCommandEvent& event) -{ - // Since it's modal, get the main window to do it - wxCommandEvent event2(wxEVT_COMMAND_MENU_SELECTED, wxID_PREFERENCES); - pframeMain->GetEventHandler()->AddPendingEvent(event2); -} - -void CMyTaskBarIcon::Restore() -{ - pframeMain->Show(); - wxIconizeEvent event(0, false); - pframeMain->GetEventHandler()->AddPendingEvent(event); - pframeMain->Iconize(false); - pframeMain->Raise(); -} - -void CMyTaskBarIcon::OnUpdateUIGenerate(wxUpdateUIEvent& event) -{ - event.Check(fGenerateBitcoins); -} - -void CMyTaskBarIcon::OnMenuExit(wxCommandEvent& event) -{ - pframeMain->Close(true); -} - -void CMyTaskBarIcon::UpdateTooltip() -{ - if (IsIconInstalled()) - Show(true); -} - -wxMenu* CMyTaskBarIcon::CreatePopupMenu() -{ - wxMenu* pmenu = new wxMenu; - pmenu->Append(ID_TASKBAR_RESTORE, _("&Open Bitcoin")); - pmenu->Append(ID_TASKBAR_SEND, _("&Send Bitcoins")); - pmenu->Append(ID_TASKBAR_OPTIONS, _("O&ptions...")); -#ifndef __WXMAC_OSX__ // Mac has built-in quit menu - pmenu->AppendSeparator(); - pmenu->Append(ID_TASKBAR_EXIT, _("E&xit")); -#endif - return pmenu; -} - - - - - - -////////////////////////////////////////////////////////////////////////////// -// -// CMyApp -// - -void CreateMainWindow() -{ - pframeMain = new CMainFrame(NULL); - if (GetBoolArg("-min")) - pframeMain->Iconize(true); -#if defined(__WXGTK__) || defined(__WXMAC_OSX__) - if (!GetBoolArg("-minimizetotray")) - fMinimizeToTray = false; -#endif - pframeMain->Show(true); // have to show first to get taskbar button to hide - if (fMinimizeToTray && pframeMain->IsIconized()) - fClosedToTray = true; - pframeMain->Show(!fClosedToTray); - ptaskbaricon->Show(fMinimizeToTray || fClosedToTray); - CreateThread(ThreadDelayedRepaint, NULL); -} - - -// Define a new application -class CMyApp : public wxApp -{ -public: - CMyApp(){}; - ~CMyApp(){}; - bool OnInit(); - bool OnInit2(); - int OnExit(); - - // Hook Initialize so we can start without GUI - virtual bool Initialize(int& argc, wxChar** argv); - - // 2nd-level exception handling: we get all the exceptions occurring in any - // event handler here - virtual bool OnExceptionInMainLoop(); - - // 3rd, and final, level exception handling: whenever an unhandled - // exception is caught, this function is called - virtual void OnUnhandledException(); - - // and now for something different: this function is called in case of a - // crash (e.g. dereferencing null pointer, division by 0, ...) - virtual void OnFatalException(); -}; - -IMPLEMENT_APP(CMyApp) - -bool CMyApp::Initialize(int& argc, wxChar** argv) -{ - for (int i = 1; i < argc; i++) - if (!IsSwitchChar(argv[i][0])) - fCommandLine = true; - - if (!fCommandLine) - { - // wxApp::Initialize will remove environment-specific parameters, - // so it's too early to call ParseParameters yet - for (int i = 1; i < argc; i++) - { - wxString str = argv[i]; - #ifdef __WXMSW__ - if (str.size() >= 1 && str[0] == '/') - str[0] = '-'; - char pszLower[MAX_PATH]; - strlcpy(pszLower, str.c_str(), sizeof(pszLower)); - strlwr(pszLower); - str = pszLower; - #endif - if (str == "-daemon") - fDaemon = true; - } - } - -#ifdef __WXGTK__ - if (fDaemon || fCommandLine) - { - // Call the original Initialize while suppressing error messages - // and ignoring failure. If unable to initialize GTK, it fails - // near the end so hopefully the last few things don't matter. - { - wxLogNull logNo; - wxApp::Initialize(argc, argv); - } - - if (fDaemon) - { - // Daemonize - pid_t pid = fork(); - if (pid < 0) - { - fprintf(stderr, "Error: fork() returned %d errno %d\n", pid, errno); - return false; - } - if (pid > 0) - pthread_exit((void*)0); - - pid_t sid = setsid(); - if (sid < 0) - fprintf(stderr, "Error: setsid() returned %d errno %d\n", sid, errno); - } - - return true; - } -#endif - - return wxApp::Initialize(argc, argv); -} - -bool CMyApp::OnInit() -{ -#if defined(__WXMSW__) && defined(__WXDEBUG__) && defined(GUI) - // Disable malfunctioning wxWidgets debug assertion - extern int g_isPainting; - g_isPainting = 10000; -#endif -#if defined(__WXMSW__ ) || defined(__WXMAC_OSX__) - SetAppName("Bitcoin"); -#else - SetAppName("bitcoin"); -#endif -#ifdef __WXMSW__ -#if wxUSE_UNICODE - // Hack to set wxConvLibc codepage to UTF-8 on Windows, - // may break if wxMBConv_win32 implementation in strconv.cpp changes. - class wxMBConv_win32 : public wxMBConv - { - public: - long m_CodePage; - size_t m_minMBCharWidth; - }; - if (((wxMBConv_win32*)&wxConvLibc)->m_CodePage == CP_ACP) - ((wxMBConv_win32*)&wxConvLibc)->m_CodePage = CP_UTF8; -#endif -#endif - - // Load locale//LC_MESSAGES/bitcoin.mo language file - g_locale.Init(wxLANGUAGE_DEFAULT, 0); - g_locale.AddCatalogLookupPathPrefix("locale"); -#ifndef __WXMSW__ - g_locale.AddCatalogLookupPathPrefix("/usr/share/locale"); - g_locale.AddCatalogLookupPathPrefix("/usr/local/share/locale"); -#endif - g_locale.AddCatalog("wxstd"); // wxWidgets standard translations, if any - g_locale.AddCatalog("bitcoin"); - -#ifdef __WXMSW__ - HDC hdc = GetDC(NULL); - if (hdc) - { - nScaleX = GetDeviceCaps(hdc, LOGPIXELSX) / 96.0; - nScaleY = GetDeviceCaps(hdc, LOGPIXELSY) / 96.0; - ReleaseDC(NULL, hdc); - } -#endif - - return AppInit(argc, argv); -} - -int CMyApp::OnExit() -{ - Shutdown(NULL); - return wxApp::OnExit(); -} - -bool CMyApp::OnExceptionInMainLoop() -{ - try - { - throw; - } - catch (std::exception& e) - { - PrintException(&e, "CMyApp::OnExceptionInMainLoop()"); - wxLogWarning("Exception %s %s", typeid(e).name(), e.what()); - Sleep(1000); - throw; - } - catch (...) - { - PrintException(NULL, "CMyApp::OnExceptionInMainLoop()"); - wxLogWarning("Unknown exception"); - Sleep(1000); - throw; - } - return true; -} - -void CMyApp::OnUnhandledException() -{ - // this shows how we may let some exception propagate uncaught - try - { - throw; - } - catch (std::exception& e) - { - PrintException(&e, "CMyApp::OnUnhandledException()"); - wxLogWarning("Exception %s %s", typeid(e).name(), e.what()); - Sleep(1000); - throw; - } - catch (...) - { - PrintException(NULL, "CMyApp::OnUnhandledException()"); - wxLogWarning("Unknown exception"); - Sleep(1000); - throw; - } -} - -void CMyApp::OnFatalException() -{ - wxMessageBox(_("Program has crashed and will terminate. "), "Bitcoin", wxOK | wxICON_ERROR); -} diff --git a/src/ui.h b/src/ui.h deleted file mode 100644 index 1784af77b..000000000 --- a/src/ui.h +++ /dev/null @@ -1,355 +0,0 @@ -// Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying -// file license.txt or http://www.opensource.org/licenses/mit-license.php. -#ifndef BITCOIN_UI_H -#define BITCOIN_UI_H - -#include -#include "wallet.h" - -DECLARE_EVENT_TYPE(wxEVT_UITHREADCALL, -1) - - - -extern wxLocale g_locale; - - - -void HandleCtrlA(wxKeyEvent& event); -void UIThreadCall(boost::function0); -int ThreadSafeMessageBox(const std::string& message, const std::string& caption="Message", int style=wxOK, wxWindow* parent=NULL, int x=-1, int y=-1); -bool ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCaption, wxWindow* parent); -void CalledSetStatusBar(const std::string& strText, int nField); -void MainFrameRepaint(); -void CreateMainWindow(); -void SetStartOnSystemStartup(bool fAutoStart); -inline void InitMessage(const std::string &message) -{ -} - - - -inline int MyMessageBox(const wxString& message, const wxString& caption="Message", int style=wxOK, wxWindow* parent=NULL, int x=-1, int y=-1) -{ -#ifdef GUI - if (!fDaemon) - return wxMessageBox(message, caption, style, parent, x, y); -#endif - printf("wxMessageBox %s: %s\n", std::string(caption).c_str(), std::string(message).c_str()); - fprintf(stderr, "%s: %s\n", std::string(caption).c_str(), std::string(message).c_str()); - return wxOK; -} -#define wxMessageBox MyMessageBox - - - - - - -class CMainFrame : public CMainFrameBase -{ -protected: - // Event handlers - void OnNotebookPageChanged(wxNotebookEvent& event); - void OnClose(wxCloseEvent& event); - void OnIconize(wxIconizeEvent& event); - void OnMouseEvents(wxMouseEvent& event); - void OnKeyDown(wxKeyEvent& event) { HandleCtrlA(event); } - void OnIdle(wxIdleEvent& event); - void OnPaint(wxPaintEvent& event); - void OnPaintListCtrl(wxPaintEvent& event); - void OnMenuFileExit(wxCommandEvent& event); - void OnUpdateUIOptionsGenerate(wxUpdateUIEvent& event); - void OnMenuOptionsChangeYourAddress(wxCommandEvent& event); - void OnMenuOptionsEncryptWallet(wxCommandEvent& event); - void OnMenuOptionsChangeWalletPassphrase(wxCommandEvent& event); - void OnMenuOptionsOptions(wxCommandEvent& event); - void OnMenuHelpAbout(wxCommandEvent& event); - void OnButtonSend(wxCommandEvent& event); - void OnButtonAddressBook(wxCommandEvent& event); - void OnSetFocusAddress(wxFocusEvent& event); - void OnMouseEventsAddress(wxMouseEvent& event); - void OnButtonNew(wxCommandEvent& event); - void OnButtonCopy(wxCommandEvent& event); - void OnListColBeginDrag(wxListEvent& event); - void OnListItemActivated(wxListEvent& event); - void OnListItemActivatedProductsSent(wxListEvent& event); - void OnListItemActivatedOrdersSent(wxListEvent& event); - void OnListItemActivatedOrdersReceived(wxListEvent& event); - -public: - /** Constructor */ - CMainFrame(wxWindow* parent); - ~CMainFrame(); - - // Custom - enum - { - ALL = 0, - SENTRECEIVED = 1, - SENT = 2, - RECEIVED = 3, - }; - int nPage; - wxListCtrl* m_listCtrl; - bool fShowGenerated; - bool fShowSent; - bool fShowReceived; - bool fRefreshListCtrl; - bool fRefreshListCtrlRunning; - bool fOnSetFocusAddress; - unsigned int nListViewUpdated; - bool fRefresh; - - void OnUIThreadCall(wxCommandEvent& event); - int GetSortIndex(const std::string& strSort); - void InsertLine(bool fNew, int nIndex, uint256 hashKey, std::string strSort, const wxColour& colour, const wxString& str1, const wxString& str2, const wxString& str3, const wxString& str4, const wxString& str5); - bool DeleteLine(uint256 hashKey); - bool InsertTransaction(const CWalletTx& wtx, bool fNew, int nIndex=-1); - void RefreshListCtrl(); - void RefreshStatusColumn(); -}; - - - - -class CTxDetailsDialog : public CTxDetailsDialogBase -{ -protected: - // Event handlers - void OnButtonOK(wxCommandEvent& event); - -public: - /** Constructor */ - CTxDetailsDialog(wxWindow* parent, CWalletTx wtx); - - // State - CWalletTx wtx; -}; - - - -class COptionsDialog : public COptionsDialogBase -{ -protected: - // Event handlers - void OnListBox(wxCommandEvent& event); - void OnKillFocusTransactionFee(wxFocusEvent& event); - void OnCheckBoxUseProxy(wxCommandEvent& event); - void OnKillFocusProxy(wxFocusEvent& event); - - void OnButtonOK(wxCommandEvent& event); - void OnButtonCancel(wxCommandEvent& event); - void OnButtonApply(wxCommandEvent& event); - -public: - /** Constructor */ - COptionsDialog(wxWindow* parent); - - // Custom - bool fTmpStartOnSystemStartup; - bool fTmpMinimizeOnClose; - void SelectPage(int nPage); - CAddress GetProxyAddr(); -}; - - - -class CAboutDialog : public CAboutDialogBase -{ -protected: - // Event handlers - void OnButtonOK(wxCommandEvent& event); - -public: - /** Constructor */ - CAboutDialog(wxWindow* parent); -}; - - - -class CSendDialog : public CSendDialogBase -{ -protected: - // Event handlers - void OnKeyDown(wxKeyEvent& event) { HandleCtrlA(event); } - void OnKillFocusAmount(wxFocusEvent& event); - void OnButtonAddressBook(wxCommandEvent& event); - void OnButtonPaste(wxCommandEvent& event); - void OnButtonSend(wxCommandEvent& event); - void OnButtonCancel(wxCommandEvent& event); - -public: - /** Constructor */ - CSendDialog(wxWindow* parent, const wxString& strAddress=""); - - // Custom - bool fEnabledPrev; - std::string strFromSave; - std::string strMessageSave; -}; - - - -class CSendingDialog : public CSendingDialogBase -{ -public: - // Event handlers - void OnClose(wxCloseEvent& event); - void OnButtonOK(wxCommandEvent& event); - void OnButtonCancel(wxCommandEvent& event); - void OnPaint(wxPaintEvent& event); - -public: - /** Constructor */ - CSendingDialog(wxWindow* parent, const CAddress& addrIn, int64 nPriceIn, const CWalletTx& wtxIn); - ~CSendingDialog(); - - // State - CAddress addr; - int64 nPrice; - CWalletTx wtx; - wxDateTime start; - char pszStatus[10000]; - bool fCanCancel; - bool fAbort; - bool fSuccess; - bool fUIDone; - bool fWorkDone; - - void Close(); - void Repaint(); - bool Status(); - bool Status(const std::string& str); - bool Error(const std::string& str); - void StartTransfer(); - void OnReply2(CDataStream& vRecv); - void OnReply3(CDataStream& vRecv); -}; - -void SendingDialogStartTransfer(void* parg); -void SendingDialogOnReply2(void* parg, CDataStream& vRecv); -void SendingDialogOnReply3(void* parg, CDataStream& vRecv); - - - -class CAddressBookDialog : public CAddressBookDialogBase -{ -protected: - // Event handlers - void OnNotebookPageChanged(wxNotebookEvent& event); - void OnListEndLabelEdit(wxListEvent& event); - void OnListItemSelected(wxListEvent& event); - void OnListItemActivated(wxListEvent& event); - void OnButtonDelete(wxCommandEvent& event); - void OnButtonCopy(wxCommandEvent& event); - void OnButtonEdit(wxCommandEvent& event); - void OnButtonNew(wxCommandEvent& event); - void OnButtonOK(wxCommandEvent& event); - void OnButtonCancel(wxCommandEvent& event); - void OnClose(wxCloseEvent& event); - -public: - /** Constructor */ - CAddressBookDialog(wxWindow* parent, const wxString& strInitSelected, int nPageIn, bool fDuringSendIn); - - // Custom - enum - { - SENDING = 0, - RECEIVING = 1, - }; - int nPage; - wxListCtrl* m_listCtrl; - bool fDuringSend; - wxString GetAddress(); - wxString GetSelectedAddress(); - wxString GetSelectedSendingAddress(); - wxString GetSelectedReceivingAddress(); - bool CheckIfMine(const std::string& strAddress, const std::string& strTitle); -}; - - - -class CGetTextFromUserDialog : public CGetTextFromUserDialogBase -{ -protected: - // Event handlers - void OnButtonOK(wxCommandEvent& event) { EndModal(true); } - void OnButtonCancel(wxCommandEvent& event) { EndModal(false); } - void OnClose(wxCloseEvent& event) { EndModal(false); } - - void OnKeyDown(wxKeyEvent& event) - { - if (event.GetKeyCode() == '\r' || event.GetKeyCode() == WXK_NUMPAD_ENTER) - EndModal(true); - else - HandleCtrlA(event); - } - -public: - /** Constructor */ - CGetTextFromUserDialog(wxWindow* parent, - const std::string& strCaption, - const std::string& strMessage1, - const std::string& strValue1="", - const std::string& strMessage2="", - const std::string& strValue2="") : CGetTextFromUserDialogBase(parent, wxID_ANY, strCaption) - { - int x = GetSize().GetWidth(); - int y = GetSize().GetHeight(); - m_staticTextMessage1->SetLabel(strMessage1); - m_textCtrl1->SetValue(strValue1); - y += wxString(strMessage1).Freq('\n') * 14; - if (!strMessage2.empty()) - { - m_staticTextMessage2->Show(true); - m_staticTextMessage2->SetLabel(strMessage2); - m_textCtrl2->Show(true); - m_textCtrl2->SetValue(strValue2); - y += 46 + wxString(strMessage2).Freq('\n') * 14; - } -#ifndef __WXMSW__ - x = x * 114 / 100; - y = y * 114 / 100; -#endif - SetSize(x, y); - } - - // Custom - std::string GetValue() { return (std::string)m_textCtrl1->GetValue(); } - std::string GetValue1() { return (std::string)m_textCtrl1->GetValue(); } - std::string GetValue2() { return (std::string)m_textCtrl2->GetValue(); } -}; - - - -class CMyTaskBarIcon : public wxTaskBarIcon -{ -protected: - // Event handlers - void OnLeftButtonDClick(wxTaskBarIconEvent& event); - void OnMenuRestore(wxCommandEvent& event); - void OnMenuSend(wxCommandEvent& event); - void OnMenuOptions(wxCommandEvent& event); - void OnUpdateUIGenerate(wxUpdateUIEvent& event); - void OnMenuGenerate(wxCommandEvent& event); - void OnMenuExit(wxCommandEvent& event); - -public: - CMyTaskBarIcon() : wxTaskBarIcon() - { - Show(true); - } - - void Show(bool fShow=true); - void Hide(); - void Restore(); - void UpdateTooltip(); - virtual wxMenu* CreatePopupMenu(); - -DECLARE_EVENT_TABLE() -}; - -#endif diff --git a/src/uibase.cpp b/src/uibase.cpp deleted file mode 100644 index 6d219ad66..000000000 --- a/src/uibase.cpp +++ /dev/null @@ -1,1018 +0,0 @@ -/////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Dec 21 2009) -// http://www.wxformbuilder.org/ -// -// PLEASE DO "NOT" EDIT THIS FILE! -/////////////////////////////////////////////////////////////////////////// - -#include "uibase.h" - -#include "xpm/about.xpm" -#include "xpm/addressbook20.xpm" -#include "xpm/check.xpm" -#include "xpm/send20.xpm" - -/////////////////////////////////////////////////////////////////////////// - -CMainFrameBase::CMainFrameBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - m_menubar = new wxMenuBar( 0 ); - m_menuFile = new wxMenu(); - wxMenuItem* m_menuFileExit; - m_menuFileExit = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("E&xit") ) , wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuFileExit ); - - m_menubar->Append( m_menuFile, _("&File") ); - - m_menuOptions = new wxMenu(); - wxMenuItem* m_menuOptionsChangeYourAddress; - m_menuOptionsChangeYourAddress = new wxMenuItem( m_menuOptions, wxID_ANY, wxString( _("&Your Receiving Addresses...") ) , wxEmptyString, wxITEM_NORMAL ); - m_menuOptions->Append( m_menuOptionsChangeYourAddress ); - - m_menuOptionsEncryptWallet = new wxMenuItem( m_menuOptions, wxID_ANY, wxString( _("&Encrypt Wallet...") ) , wxEmptyString, wxITEM_NORMAL ); - m_menuOptions->Append( m_menuOptionsEncryptWallet ); - - m_menuOptionsChangeWalletPassphrase = new wxMenuItem( m_menuOptions, wxID_ANY, wxString( _("&Change Wallet Encryption Passphrase...") ) , wxEmptyString, wxITEM_NORMAL ); - m_menuOptions->Append( m_menuOptionsChangeWalletPassphrase ); - - wxMenuItem* m_menuOptionsOptions; - m_menuOptionsOptions = new wxMenuItem( m_menuOptions, wxID_PREFERENCES, wxString( _("&Options...") ) , wxEmptyString, wxITEM_NORMAL ); - m_menuOptions->Append( m_menuOptionsOptions ); - - m_menubar->Append( m_menuOptions, _("&Settings") ); - - m_menuHelp = new wxMenu(); - wxMenuItem* m_menuHelpAbout; - m_menuHelpAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About...") ) , wxEmptyString, wxITEM_NORMAL ); - m_menuHelp->Append( m_menuHelpAbout ); - - m_menubar->Append( m_menuHelp, _("&Help") ); - - this->SetMenuBar( m_menubar ); - - m_toolBar = this->CreateToolBar( wxTB_FLAT|wxTB_HORZ_TEXT, wxID_ANY ); - m_toolBar->SetToolBitmapSize( wxSize( 20,20 ) ); - m_toolBar->SetToolSeparation( 1 ); - m_toolBar->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxEmptyString ) ); - - m_toolBar->AddTool( wxID_BUTTONSEND, _("Send Coins"), wxBitmap( send20_xpm ), wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString ); - m_toolBar->AddTool( wxID_BUTTONRECEIVE, _("Address Book"), wxBitmap( addressbook20_xpm ), wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString ); - m_toolBar->Realize(); - - m_statusBar = this->CreateStatusBar( 1, wxST_SIZEGRIP, wxID_ANY ); - wxBoxSizer* bSizer2; - bSizer2 = new wxBoxSizer( wxVERTICAL ); - - - bSizer2->Add( 0, 2, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer85; - bSizer85 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText32 = new wxStaticText( this, wxID_ANY, _("Your Bitcoin Address:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText32->Wrap( -1 ); - bSizer85->Add( m_staticText32, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - m_textCtrlAddress = new wxTextCtrl( this, wxID_TEXTCTRLADDRESS, wxEmptyString, wxDefaultPosition, wxSize( 340,-1 ), wxTE_READONLY ); - bSizer85->Add( m_textCtrlAddress, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - m_buttonNew = new wxButton( this, wxID_BUTTONNEW, _(" &New... "), wxDefaultPosition, wxSize( -1,-1 ), wxBU_EXACTFIT ); - bSizer85->Add( m_buttonNew, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonCopy = new wxButton( this, wxID_BUTTONCOPY, _(" &Copy to Clipboard "), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT ); - bSizer85->Add( m_buttonCopy, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - - bSizer85->Add( 0, 0, 0, wxEXPAND, 5 ); - - bSizer2->Add( bSizer85, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); - - wxBoxSizer* bSizer3; - bSizer3 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer66; - bSizer66 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText41 = new wxStaticText( this, wxID_ANY, _("Balance:"), wxDefaultPosition, wxSize( -1,15 ), 0 ); - m_staticText41->Wrap( -1 ); - bSizer66->Add( m_staticText41, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_staticTextBalance = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 120,15 ), wxALIGN_RIGHT|wxST_NO_AUTORESIZE ); - m_staticTextBalance->Wrap( -1 ); - m_staticTextBalance->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); - m_staticTextBalance->SetBackgroundColour( wxColour( 255, 255, 255 ) ); - - bSizer66->Add( m_staticTextBalance, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - bSizer3->Add( bSizer66, 1, wxEXPAND|wxALL, 5 ); - - - bSizer3->Add( 0, 0, 0, wxEXPAND, 5 ); - - wxString m_choiceFilterChoices[] = { _(" All"), _(" Sent"), _(" Received"), _(" In Progress") }; - int m_choiceFilterNChoices = sizeof( m_choiceFilterChoices ) / sizeof( wxString ); - m_choiceFilter = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxSize( 110,-1 ), m_choiceFilterNChoices, m_choiceFilterChoices, 0 ); - m_choiceFilter->SetSelection( 0 ); - m_choiceFilter->Hide(); - - bSizer3->Add( m_choiceFilter, 0, wxALIGN_BOTTOM|wxTOP|wxRIGHT|wxLEFT, 5 ); - - bSizer2->Add( bSizer3, 0, wxEXPAND, 5 ); - - m_notebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panel9 = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer11; - bSizer11 = new wxBoxSizer( wxVERTICAL ); - - m_listCtrlAll = new wxListCtrl( m_panel9, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_DESCENDING ); - bSizer11->Add( m_listCtrlAll, 1, wxEXPAND, 5 ); - - m_panel9->SetSizer( bSizer11 ); - m_panel9->Layout(); - bSizer11->Fit( m_panel9 ); - m_notebook->AddPage( m_panel9, _("All Transactions"), true ); - m_panel91 = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer111; - bSizer111 = new wxBoxSizer( wxVERTICAL ); - - m_listCtrlSentReceived = new wxListCtrl( m_panel91, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_DESCENDING ); - bSizer111->Add( m_listCtrlSentReceived, 1, wxEXPAND, 5 ); - - m_panel91->SetSizer( bSizer111 ); - m_panel91->Layout(); - bSizer111->Fit( m_panel91 ); - m_notebook->AddPage( m_panel91, _("Sent/Received"), false ); - m_panel92 = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer112; - bSizer112 = new wxBoxSizer( wxVERTICAL ); - - m_listCtrlSent = new wxListCtrl( m_panel92, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_DESCENDING ); - bSizer112->Add( m_listCtrlSent, 1, wxEXPAND, 5 ); - - m_panel92->SetSizer( bSizer112 ); - m_panel92->Layout(); - bSizer112->Fit( m_panel92 ); - m_notebook->AddPage( m_panel92, _("Sent"), false ); - m_panel93 = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer113; - bSizer113 = new wxBoxSizer( wxVERTICAL ); - - m_listCtrlReceived = new wxListCtrl( m_panel93, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_DESCENDING ); - bSizer113->Add( m_listCtrlReceived, 1, wxEXPAND, 5 ); - - m_panel93->SetSizer( bSizer113 ); - m_panel93->Layout(); - bSizer113->Fit( m_panel93 ); - m_notebook->AddPage( m_panel93, _("Received"), false ); - - bSizer2->Add( m_notebook, 1, wxEXPAND, 5 ); - - this->SetSizer( bSizer2 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CMainFrameBase::OnClose ) ); - this->Connect( wxEVT_ICONIZE, wxIconizeEventHandler( CMainFrameBase::OnIconize ) ); - this->Connect( wxEVT_IDLE, wxIdleEventHandler( CMainFrameBase::OnIdle ) ); - this->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Connect( wxEVT_MIDDLE_DOWN, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Connect( wxEVT_MIDDLE_UP, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Connect( wxEVT_RIGHT_UP, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Connect( wxEVT_MOTION, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Connect( wxEVT_MIDDLE_DCLICK, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Connect( wxEVT_RIGHT_DCLICK, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Connect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Connect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Connect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Connect( wxEVT_PAINT, wxPaintEventHandler( CMainFrameBase::OnPaint ) ); - this->Connect( m_menuFileExit->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( CMainFrameBase::OnMenuFileExit ) ); - this->Connect( m_menuOptionsChangeYourAddress->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( CMainFrameBase::OnMenuOptionsChangeYourAddress ) ); - this->Connect( m_menuOptionsEncryptWallet->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( CMainFrameBase::OnMenuOptionsEncryptWallet ) ); - this->Connect( m_menuOptionsChangeWalletPassphrase->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( CMainFrameBase::OnMenuOptionsChangeWalletPassphrase ) ); - this->Connect( m_menuOptionsOptions->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( CMainFrameBase::OnMenuOptionsOptions ) ); - this->Connect( m_menuHelpAbout->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( CMainFrameBase::OnMenuHelpAbout ) ); - this->Connect( wxID_BUTTONSEND, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler( CMainFrameBase::OnButtonSend ) ); - this->Connect( wxID_BUTTONRECEIVE, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler( CMainFrameBase::OnButtonAddressBook ) ); - m_textCtrlAddress->Connect( wxEVT_KEY_DOWN, wxKeyEventHandler( CMainFrameBase::OnKeyDown ), NULL, this ); - m_textCtrlAddress->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Connect( wxEVT_MIDDLE_DOWN, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Connect( wxEVT_MIDDLE_UP, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Connect( wxEVT_RIGHT_UP, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Connect( wxEVT_MOTION, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Connect( wxEVT_MIDDLE_DCLICK, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Connect( wxEVT_RIGHT_DCLICK, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Connect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Connect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Connect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Connect( wxEVT_SET_FOCUS, wxFocusEventHandler( CMainFrameBase::OnSetFocusAddress ), NULL, this ); - m_buttonNew->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CMainFrameBase::OnButtonNew ), NULL, this ); - m_buttonCopy->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CMainFrameBase::OnButtonCopy ), NULL, this ); - m_notebook->Connect( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, wxNotebookEventHandler( CMainFrameBase::OnNotebookPageChanged ), NULL, this ); - m_listCtrlAll->Connect( wxEVT_COMMAND_LIST_COL_BEGIN_DRAG, wxListEventHandler( CMainFrameBase::OnListColBeginDrag ), NULL, this ); - m_listCtrlAll->Connect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( CMainFrameBase::OnListItemActivated ), NULL, this ); - m_listCtrlAll->Connect( wxEVT_PAINT, wxPaintEventHandler( CMainFrameBase::OnPaintListCtrl ), NULL, this ); - m_listCtrlSentReceived->Connect( wxEVT_COMMAND_LIST_COL_BEGIN_DRAG, wxListEventHandler( CMainFrameBase::OnListColBeginDrag ), NULL, this ); - m_listCtrlSentReceived->Connect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( CMainFrameBase::OnListItemActivated ), NULL, this ); - m_listCtrlSentReceived->Connect( wxEVT_PAINT, wxPaintEventHandler( CMainFrameBase::OnPaintListCtrl ), NULL, this ); - m_listCtrlSent->Connect( wxEVT_COMMAND_LIST_COL_BEGIN_DRAG, wxListEventHandler( CMainFrameBase::OnListColBeginDrag ), NULL, this ); - m_listCtrlSent->Connect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( CMainFrameBase::OnListItemActivated ), NULL, this ); - m_listCtrlSent->Connect( wxEVT_PAINT, wxPaintEventHandler( CMainFrameBase::OnPaintListCtrl ), NULL, this ); - m_listCtrlReceived->Connect( wxEVT_COMMAND_LIST_COL_BEGIN_DRAG, wxListEventHandler( CMainFrameBase::OnListColBeginDrag ), NULL, this ); - m_listCtrlReceived->Connect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( CMainFrameBase::OnListItemActivated ), NULL, this ); - m_listCtrlReceived->Connect( wxEVT_PAINT, wxPaintEventHandler( CMainFrameBase::OnPaintListCtrl ), NULL, this ); -} - -CMainFrameBase::~CMainFrameBase() -{ - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CMainFrameBase::OnClose ) ); - this->Disconnect( wxEVT_ICONIZE, wxIconizeEventHandler( CMainFrameBase::OnIconize ) ); - this->Disconnect( wxEVT_IDLE, wxIdleEventHandler( CMainFrameBase::OnIdle ) ); - this->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Disconnect( wxEVT_MIDDLE_DOWN, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Disconnect( wxEVT_MIDDLE_UP, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Disconnect( wxEVT_RIGHT_UP, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Disconnect( wxEVT_MOTION, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Disconnect( wxEVT_MIDDLE_DCLICK, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Disconnect( wxEVT_RIGHT_DCLICK, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Disconnect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Disconnect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Disconnect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( CMainFrameBase::OnMouseEvents ) ); - this->Disconnect( wxEVT_PAINT, wxPaintEventHandler( CMainFrameBase::OnPaint ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( CMainFrameBase::OnMenuFileExit ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( CMainFrameBase::OnMenuOptionsChangeYourAddress ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( CMainFrameBase::OnMenuOptionsEncryptWallet ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( CMainFrameBase::OnMenuOptionsChangeWalletPassphrase ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( CMainFrameBase::OnMenuOptionsOptions ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( CMainFrameBase::OnMenuHelpAbout ) ); - this->Disconnect( wxID_BUTTONSEND, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler( CMainFrameBase::OnButtonSend ) ); - this->Disconnect( wxID_BUTTONRECEIVE, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler( CMainFrameBase::OnButtonAddressBook ) ); - m_textCtrlAddress->Disconnect( wxEVT_KEY_DOWN, wxKeyEventHandler( CMainFrameBase::OnKeyDown ), NULL, this ); - m_textCtrlAddress->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Disconnect( wxEVT_MIDDLE_DOWN, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Disconnect( wxEVT_MIDDLE_UP, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Disconnect( wxEVT_RIGHT_UP, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Disconnect( wxEVT_MOTION, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Disconnect( wxEVT_MIDDLE_DCLICK, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Disconnect( wxEVT_RIGHT_DCLICK, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Disconnect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Disconnect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Disconnect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( CMainFrameBase::OnMouseEventsAddress ), NULL, this ); - m_textCtrlAddress->Disconnect( wxEVT_SET_FOCUS, wxFocusEventHandler( CMainFrameBase::OnSetFocusAddress ), NULL, this ); - m_buttonNew->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CMainFrameBase::OnButtonNew ), NULL, this ); - m_buttonCopy->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CMainFrameBase::OnButtonCopy ), NULL, this ); - m_notebook->Disconnect( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, wxNotebookEventHandler( CMainFrameBase::OnNotebookPageChanged ), NULL, this ); - m_listCtrlAll->Disconnect( wxEVT_COMMAND_LIST_COL_BEGIN_DRAG, wxListEventHandler( CMainFrameBase::OnListColBeginDrag ), NULL, this ); - m_listCtrlAll->Disconnect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( CMainFrameBase::OnListItemActivated ), NULL, this ); - m_listCtrlAll->Disconnect( wxEVT_PAINT, wxPaintEventHandler( CMainFrameBase::OnPaintListCtrl ), NULL, this ); - m_listCtrlSentReceived->Disconnect( wxEVT_COMMAND_LIST_COL_BEGIN_DRAG, wxListEventHandler( CMainFrameBase::OnListColBeginDrag ), NULL, this ); - m_listCtrlSentReceived->Disconnect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( CMainFrameBase::OnListItemActivated ), NULL, this ); - m_listCtrlSentReceived->Disconnect( wxEVT_PAINT, wxPaintEventHandler( CMainFrameBase::OnPaintListCtrl ), NULL, this ); - m_listCtrlSent->Disconnect( wxEVT_COMMAND_LIST_COL_BEGIN_DRAG, wxListEventHandler( CMainFrameBase::OnListColBeginDrag ), NULL, this ); - m_listCtrlSent->Disconnect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( CMainFrameBase::OnListItemActivated ), NULL, this ); - m_listCtrlSent->Disconnect( wxEVT_PAINT, wxPaintEventHandler( CMainFrameBase::OnPaintListCtrl ), NULL, this ); - m_listCtrlReceived->Disconnect( wxEVT_COMMAND_LIST_COL_BEGIN_DRAG, wxListEventHandler( CMainFrameBase::OnListColBeginDrag ), NULL, this ); - m_listCtrlReceived->Disconnect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( CMainFrameBase::OnListItemActivated ), NULL, this ); - m_listCtrlReceived->Disconnect( wxEVT_PAINT, wxPaintEventHandler( CMainFrameBase::OnPaintListCtrl ), NULL, this ); -} - -CTxDetailsDialogBase::CTxDetailsDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer64; - bSizer64 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer66; - bSizer66 = new wxBoxSizer( wxVERTICAL ); - - m_htmlWin = new wxHtmlWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO ); - bSizer66->Add( m_htmlWin, 1, wxALL|wxEXPAND, 5 ); - - bSizer64->Add( bSizer66, 1, wxEXPAND, 5 ); - - wxBoxSizer* bSizer65; - bSizer65 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonOK = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer65->Add( m_buttonOK, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - bSizer64->Add( bSizer65, 0, wxALIGN_RIGHT, 5 ); - - this->SetSizer( bSizer64 ); - this->Layout(); - - // Connect Events - m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CTxDetailsDialogBase::OnButtonOK ), NULL, this ); -} - -CTxDetailsDialogBase::~CTxDetailsDialogBase() -{ - // Disconnect Events - m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CTxDetailsDialogBase::OnButtonOK ), NULL, this ); -} - -COptionsDialogBase::COptionsDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer55; - bSizer55 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer66; - bSizer66 = new wxBoxSizer( wxHORIZONTAL ); - - m_listBox = new wxListBox( this, wxID_ANY, wxDefaultPosition, wxSize( 110,-1 ), 0, NULL, wxLB_NEEDED_SB|wxLB_SINGLE ); - bSizer66->Add( m_listBox, 0, wxEXPAND|wxRIGHT, 5 ); - - m_scrolledWindow = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_scrolledWindow->SetScrollRate( 5, 5 ); - wxBoxSizer* bSizer63; - bSizer63 = new wxBoxSizer( wxVERTICAL ); - - m_panelMain = new wxPanel( m_scrolledWindow, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer69; - bSizer69 = new wxBoxSizer( wxVERTICAL ); - - - bSizer69->Add( 0, 16, 0, wxEXPAND, 5 ); - - m_checkBoxStartOnSystemStartup = new wxCheckBox( m_panelMain, wxID_ANY, _("&Start Bitcoin on system startup"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer69->Add( m_checkBoxStartOnSystemStartup, 0, wxALL, 5 ); - - m_checkBoxMinimizeToTray = new wxCheckBox( m_panelMain, wxID_ANY, _("&Minimize to the tray instead of the taskbar"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer69->Add( m_checkBoxMinimizeToTray, 0, wxALL, 5 ); - - m_checkBoxUseUPnP = new wxCheckBox( m_panelMain, wxID_ANY, _("Map port using &UPnP"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer69->Add( m_checkBoxUseUPnP, 0, wxALL, 5 ); - - m_checkBoxMinimizeOnClose = new wxCheckBox( m_panelMain, wxID_ANY, _("M&inimize to the tray on close"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer69->Add( m_checkBoxMinimizeOnClose, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer102; - bSizer102 = new wxBoxSizer( wxHORIZONTAL ); - - m_checkBoxUseProxy = new wxCheckBox( m_panelMain, wxID_ANY, _("&Connect through socks4 proxy (requires restart to apply): "), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer102->Add( m_checkBoxUseProxy, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer69->Add( bSizer102, 1, wxEXPAND, 5 ); - - wxBoxSizer* bSizer103; - bSizer103 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer103->Add( 18, 0, 0, 0, 5 ); - - m_staticTextProxyIP = new wxStaticText( m_panelMain, wxID_ANY, _("Proxy &IP:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextProxyIP->Wrap( -1 ); - bSizer103->Add( m_staticTextProxyIP, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlProxyIP = new wxTextCtrl( m_panelMain, wxID_PROXYIP, wxEmptyString, wxDefaultPosition, wxSize( 140,-1 ), 0 ); - m_textCtrlProxyIP->SetMaxLength( 15 ); - bSizer103->Add( m_textCtrlProxyIP, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextProxyPort = new wxStaticText( m_panelMain, wxID_ANY, _(" &Port:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextProxyPort->Wrap( -1 ); - bSizer103->Add( m_staticTextProxyPort, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlProxyPort = new wxTextCtrl( m_panelMain, wxID_PROXYPORT, wxEmptyString, wxDefaultPosition, wxSize( 55,-1 ), 0 ); - m_textCtrlProxyPort->SetMaxLength( 5 ); - bSizer103->Add( m_textCtrlProxyPort, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer69->Add( bSizer103, 1, wxEXPAND, 5 ); - - - bSizer69->Add( 0, 1, 0, 0, 5 ); - - m_staticText32 = new wxStaticText( m_panelMain, wxID_ANY, _("Optional transaction fee per KB that helps make sure your transactions are processed quickly. Most transactions are 1KB. Fee 0.01 recommended."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText32->Wrap( 365 ); - bSizer69->Add( m_staticText32, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT|wxLEFT, 5 ); - - wxBoxSizer* bSizer56; - bSizer56 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText31 = new wxStaticText( m_panelMain, wxID_ANY, _("Pay transaction fee:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText31->Wrap( -1 ); - bSizer56->Add( m_staticText31, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_textCtrlTransactionFee = new wxTextCtrl( m_panelMain, wxID_TRANSACTIONFEE, wxEmptyString, wxDefaultPosition, wxSize( 70,-1 ), 0 ); - bSizer56->Add( m_textCtrlTransactionFee, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - bSizer69->Add( bSizer56, 0, wxEXPAND, 5 ); - - m_panelMain->SetSizer( bSizer69 ); - m_panelMain->Layout(); - bSizer69->Fit( m_panelMain ); - bSizer63->Add( m_panelMain, 0, wxEXPAND, 5 ); - - m_panelTest2 = new wxPanel( m_scrolledWindow, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer64; - bSizer64 = new wxBoxSizer( wxVERTICAL ); - - - bSizer64->Add( 0, 16, 0, wxEXPAND, 5 ); - - m_staticText321 = new wxStaticText( m_panelTest2, wxID_ANY, _("// [don't translate] Test panel 2 for future expansion"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText321->Wrap( -1 ); - bSizer64->Add( m_staticText321, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_staticText69 = new wxStaticText( m_panelTest2, wxID_ANY, _("// [don't translate] Let's not start multiple pages until the first page is filled up"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText69->Wrap( -1 ); - bSizer64->Add( m_staticText69, 0, wxALL, 5 ); - - m_panelTest2->SetSizer( bSizer64 ); - m_panelTest2->Layout(); - bSizer64->Fit( m_panelTest2 ); - bSizer63->Add( m_panelTest2, 0, wxEXPAND, 5 ); - - m_scrolledWindow->SetSizer( bSizer63 ); - m_scrolledWindow->Layout(); - bSizer63->Fit( m_scrolledWindow ); - bSizer66->Add( m_scrolledWindow, 1, wxEXPAND|wxLEFT, 5 ); - - bSizer55->Add( bSizer66, 1, wxEXPAND|wxALL, 9 ); - - wxBoxSizer* bSizer58; - bSizer58 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonOK = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer58->Add( m_buttonOK, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer58->Add( m_buttonCancel, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_buttonApply = new wxButton( this, wxID_APPLY, _("&Apply"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer58->Add( m_buttonApply, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - bSizer55->Add( bSizer58, 0, wxALIGN_RIGHT, 5 ); - - this->SetSizer( bSizer55 ); - this->Layout(); - - // Connect Events - m_listBox->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( COptionsDialogBase::OnListBox ), NULL, this ); - m_checkBoxMinimizeToTray->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( COptionsDialogBase::OnCheckBoxMinimizeToTray ), NULL, this ); - m_checkBoxUseProxy->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( COptionsDialogBase::OnCheckBoxUseProxy ), NULL, this ); - m_textCtrlProxyIP->Connect( wxEVT_KILL_FOCUS, wxFocusEventHandler( COptionsDialogBase::OnKillFocusProxy ), NULL, this ); - m_textCtrlProxyPort->Connect( wxEVT_KILL_FOCUS, wxFocusEventHandler( COptionsDialogBase::OnKillFocusProxy ), NULL, this ); - m_textCtrlTransactionFee->Connect( wxEVT_KILL_FOCUS, wxFocusEventHandler( COptionsDialogBase::OnKillFocusTransactionFee ), NULL, this ); - m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( COptionsDialogBase::OnButtonOK ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( COptionsDialogBase::OnButtonCancel ), NULL, this ); - m_buttonApply->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( COptionsDialogBase::OnButtonApply ), NULL, this ); -} - -COptionsDialogBase::~COptionsDialogBase() -{ - // Disconnect Events - m_listBox->Disconnect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( COptionsDialogBase::OnListBox ), NULL, this ); - m_checkBoxMinimizeToTray->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( COptionsDialogBase::OnCheckBoxMinimizeToTray ), NULL, this ); - m_checkBoxUseProxy->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( COptionsDialogBase::OnCheckBoxUseProxy ), NULL, this ); - m_textCtrlProxyIP->Disconnect( wxEVT_KILL_FOCUS, wxFocusEventHandler( COptionsDialogBase::OnKillFocusProxy ), NULL, this ); - m_textCtrlProxyPort->Disconnect( wxEVT_KILL_FOCUS, wxFocusEventHandler( COptionsDialogBase::OnKillFocusProxy ), NULL, this ); - m_textCtrlTransactionFee->Disconnect( wxEVT_KILL_FOCUS, wxFocusEventHandler( COptionsDialogBase::OnKillFocusTransactionFee ), NULL, this ); - m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( COptionsDialogBase::OnButtonOK ), NULL, this ); - m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( COptionsDialogBase::OnButtonCancel ), NULL, this ); - m_buttonApply->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( COptionsDialogBase::OnButtonApply ), NULL, this ); -} - -CAboutDialogBase::CAboutDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer63; - bSizer63 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap = new wxStaticBitmap( this, wxID_ANY, wxBitmap( about_xpm ), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer63->Add( m_bitmap, 0, 0, 5 ); - - wxBoxSizer* bSizer60; - bSizer60 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer62; - bSizer62 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer631; - bSizer631 = new wxBoxSizer( wxVERTICAL ); - - - bSizer631->Add( 0, 65, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer64; - bSizer64 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText40 = new wxStaticText( this, wxID_ANY, _("Bitcoin "), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText40->Wrap( -1 ); - m_staticText40->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer64->Add( m_staticText40, 0, wxALIGN_BOTTOM|wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_staticTextVersion = new wxStaticText( this, wxID_ANY, _("version"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextVersion->Wrap( -1 ); - m_staticTextVersion->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer64->Add( m_staticTextVersion, 0, wxALIGN_BOTTOM|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - - bSizer631->Add( bSizer64, 0, wxEXPAND, 5 ); - - - bSizer631->Add( 0, 4, 0, wxEXPAND, 5 ); - - m_staticTextMain = new wxStaticText( this, wxID_ANY, _("Copyright (c) 2009-2011 Bitcoin Developers\n\nThis is experimental software.\n\nDistributed under the MIT/X11 software license, see the accompanying file \nlicense.txt or http://www.opensource.org/licenses/mit-license.php.\n\nThis product includes software developed by the OpenSSL Project for use in the \nOpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by \nEric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextMain->Wrap( -1 ); - bSizer631->Add( m_staticTextMain, 0, wxALL, 5 ); - - - bSizer631->Add( 0, 0, 0, wxEXPAND, 5 ); - - bSizer62->Add( bSizer631, 1, wxEXPAND, 5 ); - - bSizer60->Add( bSizer62, 1, wxEXPAND, 5 ); - - wxBoxSizer* bSizer61; - bSizer61 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer61->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_buttonOK = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer61->Add( m_buttonOK, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 6 ); - - bSizer60->Add( bSizer61, 0, wxALIGN_RIGHT|wxEXPAND|wxRIGHT, 2 ); - - bSizer63->Add( bSizer60, 1, wxEXPAND|wxLEFT, 5 ); - - this->SetSizer( bSizer63 ); - this->Layout(); - - // Connect Events - m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CAboutDialogBase::OnButtonOK ), NULL, this ); -} - -CAboutDialogBase::~CAboutDialogBase() -{ - // Disconnect Events - m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CAboutDialogBase::OnButtonOK ), NULL, this ); -} - -CSendDialogBase::CSendDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer21; - bSizer21 = new wxBoxSizer( wxVERTICAL ); - - - bSizer21->Add( 0, 5, 0, wxEXPAND, 5 ); - - wxFlexGridSizer* fgSizer1; - fgSizer1 = new wxFlexGridSizer( 0, 2, 0, 0 ); - fgSizer1->AddGrowableCol( 1 ); - fgSizer1->SetFlexibleDirection( wxBOTH ); - fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - - fgSizer1->Add( 0, 0, 0, wxEXPAND, 5 ); - - m_staticTextInstructions = new wxStaticText( this, wxID_ANY, _("Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextInstructions->Wrap( -1 ); - fgSizer1->Add( m_staticTextInstructions, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - wxBoxSizer* bSizer47; - bSizer47 = new wxBoxSizer( wxHORIZONTAL ); - - bSizer47->SetMinSize( wxSize( 70,-1 ) ); - - bSizer47->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bitmapCheckMark = new wxStaticBitmap( this, wxID_ANY, wxBitmap( check_xpm ), wxDefaultPosition, wxSize( 16,16 ), 0 ); - bSizer47->Add( m_bitmapCheckMark, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText36 = new wxStaticText( this, wxID_ANY, _("Pay &To:"), wxDefaultPosition, wxSize( -1,-1 ), wxALIGN_RIGHT ); - m_staticText36->Wrap( -1 ); - bSizer47->Add( m_staticText36, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - - fgSizer1->Add( bSizer47, 1, wxEXPAND|wxLEFT, 5 ); - - wxBoxSizer* bSizer19; - bSizer19 = new wxBoxSizer( wxHORIZONTAL ); - - m_textCtrlAddress = new wxTextCtrl( this, wxID_TEXTCTRLPAYTO, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer19->Add( m_textCtrlAddress, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - wxBoxSizer* bSizer66; - bSizer66 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonPaste = new wxButton( this, wxID_BUTTONPASTE, _("&Paste"), wxDefaultPosition, wxSize( -1,-1 ), wxBU_EXACTFIT ); - bSizer66->Add( m_buttonPaste, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxEXPAND, 5 ); - - m_buttonAddress = new wxButton( this, wxID_BUTTONADDRESSBOOK, _(" Address &Book..."), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer66->Add( m_buttonAddress, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxEXPAND, 5 ); - - bSizer19->Add( bSizer66, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - fgSizer1->Add( bSizer19, 1, wxEXPAND|wxRIGHT, 5 ); - - m_staticText19 = new wxStaticText( this, wxID_ANY, _("&Amount:"), wxDefaultPosition, wxSize( -1,-1 ), wxALIGN_RIGHT ); - m_staticText19->Wrap( -1 ); - fgSizer1->Add( m_staticText19, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT|wxALIGN_RIGHT, 5 ); - - m_textCtrlAmount = new wxTextCtrl( this, wxID_TEXTCTRLAMOUNT, wxEmptyString, wxDefaultPosition, wxSize( 145,-1 ), 0 ); - m_textCtrlAmount->SetMaxLength( 20 ); - m_textCtrlAmount->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxEmptyString ) ); - - fgSizer1->Add( m_textCtrlAmount, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_staticText20 = new wxStaticText( this, wxID_ANY, _("T&ransfer:"), wxDefaultPosition, wxSize( -1,-1 ), wxALIGN_RIGHT ); - m_staticText20->Wrap( -1 ); - m_staticText20->Hide(); - - fgSizer1->Add( m_staticText20, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT, 5 ); - - wxString m_choiceTransferTypeChoices[] = { _(" Standard") }; - int m_choiceTransferTypeNChoices = sizeof( m_choiceTransferTypeChoices ) / sizeof( wxString ); - m_choiceTransferType = new wxChoice( this, wxID_CHOICETRANSFERTYPE, wxDefaultPosition, wxDefaultSize, m_choiceTransferTypeNChoices, m_choiceTransferTypeChoices, 0 ); - m_choiceTransferType->SetSelection( 0 ); - m_choiceTransferType->Hide(); - - fgSizer1->Add( m_choiceTransferType, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - fgSizer1->Add( 0, 3, 0, wxEXPAND, 5 ); - - - fgSizer1->Add( 0, 0, 0, wxEXPAND, 5 ); - - bSizer21->Add( fgSizer1, 0, wxEXPAND|wxLEFT, 5 ); - - wxBoxSizer* bSizer672; - bSizer672 = new wxBoxSizer( wxHORIZONTAL ); - - bSizer21->Add( bSizer672, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer23; - bSizer23 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer23->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_buttonSend = new wxButton( this, wxID_BUTTONSEND, _("&Send"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonSend->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxEmptyString ) ); - - bSizer23->Add( m_buttonSend, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer23->Add( m_buttonCancel, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - bSizer21->Add( bSizer23, 0, wxEXPAND, 5 ); - - this->SetSizer( bSizer21 ); - this->Layout(); - - // Connect Events - m_textCtrlAddress->Connect( wxEVT_KEY_DOWN, wxKeyEventHandler( CSendDialogBase::OnKeyDown ), NULL, this ); - m_textCtrlAddress->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( CSendDialogBase::OnTextAddress ), NULL, this ); - m_buttonPaste->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CSendDialogBase::OnButtonPaste ), NULL, this ); - m_buttonAddress->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CSendDialogBase::OnButtonAddressBook ), NULL, this ); - m_textCtrlAmount->Connect( wxEVT_KEY_DOWN, wxKeyEventHandler( CSendDialogBase::OnKeyDown ), NULL, this ); - m_textCtrlAmount->Connect( wxEVT_KILL_FOCUS, wxFocusEventHandler( CSendDialogBase::OnKillFocusAmount ), NULL, this ); - m_buttonSend->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CSendDialogBase::OnButtonSend ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CSendDialogBase::OnButtonCancel ), NULL, this ); -} - -CSendDialogBase::~CSendDialogBase() -{ - // Disconnect Events - m_textCtrlAddress->Disconnect( wxEVT_KEY_DOWN, wxKeyEventHandler( CSendDialogBase::OnKeyDown ), NULL, this ); - m_textCtrlAddress->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( CSendDialogBase::OnTextAddress ), NULL, this ); - m_buttonPaste->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CSendDialogBase::OnButtonPaste ), NULL, this ); - m_buttonAddress->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CSendDialogBase::OnButtonAddressBook ), NULL, this ); - m_textCtrlAmount->Disconnect( wxEVT_KEY_DOWN, wxKeyEventHandler( CSendDialogBase::OnKeyDown ), NULL, this ); - m_textCtrlAmount->Disconnect( wxEVT_KILL_FOCUS, wxFocusEventHandler( CSendDialogBase::OnKillFocusAmount ), NULL, this ); - m_buttonSend->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CSendDialogBase::OnButtonSend ), NULL, this ); - m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CSendDialogBase::OnButtonCancel ), NULL, this ); -} - -CSendingDialogBase::CSendingDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer68; - bSizer68 = new wxBoxSizer( wxVERTICAL ); - - m_staticTextSending = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,14 ), 0 ); - m_staticTextSending->Wrap( -1 ); - bSizer68->Add( m_staticTextSending, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 8 ); - - m_textCtrlStatus = new wxTextCtrl( this, wxID_ANY, _("\n\nConnecting..."), wxDefaultPosition, wxDefaultSize, wxTE_CENTRE|wxTE_MULTILINE|wxTE_NO_VSCROLL|wxTE_READONLY|wxNO_BORDER ); - m_textCtrlStatus->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - bSizer68->Add( m_textCtrlStatus, 1, wxEXPAND|wxRIGHT|wxLEFT, 10 ); - - wxBoxSizer* bSizer69; - bSizer69 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer69->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_buttonOK = new wxButton( this, wxID_ANY, _("OK"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonOK->Enable( false ); - - bSizer69->Add( m_buttonOK, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer69->Add( m_buttonCancel, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - bSizer68->Add( bSizer69, 0, wxEXPAND, 5 ); - - this->SetSizer( bSizer68 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CSendingDialogBase::OnClose ) ); - this->Connect( wxEVT_PAINT, wxPaintEventHandler( CSendingDialogBase::OnPaint ) ); - m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CSendingDialogBase::OnButtonOK ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CSendingDialogBase::OnButtonCancel ), NULL, this ); -} - -CSendingDialogBase::~CSendingDialogBase() -{ - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CSendingDialogBase::OnClose ) ); - this->Disconnect( wxEVT_PAINT, wxPaintEventHandler( CSendingDialogBase::OnPaint ) ); - m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CSendingDialogBase::OnButtonOK ), NULL, this ); - m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CSendingDialogBase::OnButtonCancel ), NULL, this ); -} - -CYourAddressDialogBase::CYourAddressDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer68; - bSizer68 = new wxBoxSizer( wxVERTICAL ); - - - bSizer68->Add( 0, 5, 0, wxEXPAND, 5 ); - - m_staticText45 = new wxStaticText( this, wxID_ANY, _("These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. The highlighted address is displayed in the main window."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText45->Wrap( 590 ); - bSizer68->Add( m_staticText45, 0, wxALL, 5 ); - - m_listCtrl = new wxListCtrl( this, wxID_LISTCTRL, wxDefaultPosition, wxDefaultSize, wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_ASCENDING ); - bSizer68->Add( m_listCtrl, 1, wxALL|wxEXPAND, 5 ); - - wxBoxSizer* bSizer69; - bSizer69 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer69->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_buttonRename = new wxButton( this, wxID_BUTTONRENAME, _("&Edit..."), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer69->Add( m_buttonRename, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_buttonNew = new wxButton( this, wxID_BUTTONNEW, _(" &New Address... "), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer69->Add( m_buttonNew, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_buttonCopy = new wxButton( this, wxID_BUTTONCOPY, _(" &Copy to Clipboard "), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer69->Add( m_buttonCopy, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_buttonOK = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer69->Add( m_buttonOK, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonCancel->Hide(); - - bSizer69->Add( m_buttonCancel, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - bSizer68->Add( bSizer69, 0, wxEXPAND, 5 ); - - this->SetSizer( bSizer68 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CYourAddressDialogBase::OnClose ) ); - m_listCtrl->Connect( wxEVT_COMMAND_LIST_END_LABEL_EDIT, wxListEventHandler( CYourAddressDialogBase::OnListEndLabelEdit ), NULL, this ); - m_listCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( CYourAddressDialogBase::OnListItemActivated ), NULL, this ); - m_listCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( CYourAddressDialogBase::OnListItemSelected ), NULL, this ); - m_buttonRename->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CYourAddressDialogBase::OnButtonRename ), NULL, this ); - m_buttonNew->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CYourAddressDialogBase::OnButtonNew ), NULL, this ); - m_buttonCopy->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CYourAddressDialogBase::OnButtonCopy ), NULL, this ); - m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CYourAddressDialogBase::OnButtonOK ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CYourAddressDialogBase::OnButtonCancel ), NULL, this ); -} - -CYourAddressDialogBase::~CYourAddressDialogBase() -{ - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CYourAddressDialogBase::OnClose ) ); - m_listCtrl->Disconnect( wxEVT_COMMAND_LIST_END_LABEL_EDIT, wxListEventHandler( CYourAddressDialogBase::OnListEndLabelEdit ), NULL, this ); - m_listCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( CYourAddressDialogBase::OnListItemActivated ), NULL, this ); - m_listCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( CYourAddressDialogBase::OnListItemSelected ), NULL, this ); - m_buttonRename->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CYourAddressDialogBase::OnButtonRename ), NULL, this ); - m_buttonNew->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CYourAddressDialogBase::OnButtonNew ), NULL, this ); - m_buttonCopy->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CYourAddressDialogBase::OnButtonCopy ), NULL, this ); - m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CYourAddressDialogBase::OnButtonOK ), NULL, this ); - m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CYourAddressDialogBase::OnButtonCancel ), NULL, this ); -} - -CAddressBookDialogBase::CAddressBookDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer58; - bSizer58 = new wxBoxSizer( wxVERTICAL ); - - m_notebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelSending = new wxPanel( m_notebook, wxID_PANELSENDING, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer68; - bSizer68 = new wxBoxSizer( wxVERTICAL ); - - - bSizer68->Add( 0, 0, 0, wxEXPAND, 5 ); - - m_staticText55 = new wxStaticText( m_panelSending, wxID_ANY, _("Bitcoin Address"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText55->Wrap( -1 ); - m_staticText55->Hide(); - - bSizer68->Add( m_staticText55, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_listCtrlSending = new wxListCtrl( m_panelSending, wxID_LISTCTRLSENDING, wxDefaultPosition, wxDefaultSize, wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_ASCENDING ); - bSizer68->Add( m_listCtrlSending, 1, wxALL|wxEXPAND, 5 ); - - m_panelSending->SetSizer( bSizer68 ); - m_panelSending->Layout(); - bSizer68->Fit( m_panelSending ); - m_notebook->AddPage( m_panelSending, _("Sending"), false ); - m_panelReceiving = new wxPanel( m_notebook, wxID_PANELRECEIVING, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer681; - bSizer681 = new wxBoxSizer( wxVERTICAL ); - - - bSizer681->Add( 0, 0, 0, wxEXPAND, 5 ); - - m_staticText45 = new wxStaticText( m_panelReceiving, wxID_ANY, _("These are your Bitcoin addresses for receiving payments. You can give a different one to each sender to keep track of who is paying you. The highlighted address will be displayed in the main window."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText45->Wrap( 570 ); - bSizer681->Add( m_staticText45, 0, wxTOP|wxRIGHT|wxLEFT, 6 ); - - - bSizer681->Add( 0, 2, 0, wxEXPAND, 5 ); - - m_listCtrlReceiving = new wxListCtrl( m_panelReceiving, wxID_LISTCTRLRECEIVING, wxDefaultPosition, wxDefaultSize, wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_ASCENDING ); - bSizer681->Add( m_listCtrlReceiving, 1, wxALL|wxEXPAND, 5 ); - - m_panelReceiving->SetSizer( bSizer681 ); - m_panelReceiving->Layout(); - bSizer681->Fit( m_panelReceiving ); - m_notebook->AddPage( m_panelReceiving, _("Receiving"), true ); - - bSizer58->Add( m_notebook, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); - - wxBoxSizer* bSizer69; - bSizer69 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer69->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_buttonDelete = new wxButton( this, wxID_BUTTONDELETE, _("&Delete"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer69->Add( m_buttonDelete, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_buttonCopy = new wxButton( this, wxID_BUTTONCOPY, _(" &Copy to Clipboard "), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer69->Add( m_buttonCopy, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_buttonEdit = new wxButton( this, wxID_BUTTONEDIT, _("&Edit..."), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer69->Add( m_buttonEdit, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_buttonNew = new wxButton( this, wxID_BUTTONNEW, _(" &New Address... "), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer69->Add( m_buttonNew, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_buttonOK = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer69->Add( m_buttonOK, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer69->Add( m_buttonCancel, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - bSizer58->Add( bSizer69, 0, wxEXPAND, 5 ); - - this->SetSizer( bSizer58 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CAddressBookDialogBase::OnClose ) ); - m_notebook->Connect( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, wxNotebookEventHandler( CAddressBookDialogBase::OnNotebookPageChanged ), NULL, this ); - m_listCtrlSending->Connect( wxEVT_COMMAND_LIST_END_LABEL_EDIT, wxListEventHandler( CAddressBookDialogBase::OnListEndLabelEdit ), NULL, this ); - m_listCtrlSending->Connect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( CAddressBookDialogBase::OnListItemActivated ), NULL, this ); - m_listCtrlSending->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( CAddressBookDialogBase::OnListItemSelected ), NULL, this ); - m_listCtrlReceiving->Connect( wxEVT_COMMAND_LIST_END_LABEL_EDIT, wxListEventHandler( CAddressBookDialogBase::OnListEndLabelEdit ), NULL, this ); - m_listCtrlReceiving->Connect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( CAddressBookDialogBase::OnListItemActivated ), NULL, this ); - m_listCtrlReceiving->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( CAddressBookDialogBase::OnListItemSelected ), NULL, this ); - m_buttonDelete->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CAddressBookDialogBase::OnButtonDelete ), NULL, this ); - m_buttonCopy->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CAddressBookDialogBase::OnButtonCopy ), NULL, this ); - m_buttonEdit->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CAddressBookDialogBase::OnButtonEdit ), NULL, this ); - m_buttonNew->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CAddressBookDialogBase::OnButtonNew ), NULL, this ); - m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CAddressBookDialogBase::OnButtonOK ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CAddressBookDialogBase::OnButtonCancel ), NULL, this ); -} - -CAddressBookDialogBase::~CAddressBookDialogBase() -{ - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CAddressBookDialogBase::OnClose ) ); - m_notebook->Disconnect( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, wxNotebookEventHandler( CAddressBookDialogBase::OnNotebookPageChanged ), NULL, this ); - m_listCtrlSending->Disconnect( wxEVT_COMMAND_LIST_END_LABEL_EDIT, wxListEventHandler( CAddressBookDialogBase::OnListEndLabelEdit ), NULL, this ); - m_listCtrlSending->Disconnect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( CAddressBookDialogBase::OnListItemActivated ), NULL, this ); - m_listCtrlSending->Disconnect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( CAddressBookDialogBase::OnListItemSelected ), NULL, this ); - m_listCtrlReceiving->Disconnect( wxEVT_COMMAND_LIST_END_LABEL_EDIT, wxListEventHandler( CAddressBookDialogBase::OnListEndLabelEdit ), NULL, this ); - m_listCtrlReceiving->Disconnect( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler( CAddressBookDialogBase::OnListItemActivated ), NULL, this ); - m_listCtrlReceiving->Disconnect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( CAddressBookDialogBase::OnListItemSelected ), NULL, this ); - m_buttonDelete->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CAddressBookDialogBase::OnButtonDelete ), NULL, this ); - m_buttonCopy->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CAddressBookDialogBase::OnButtonCopy ), NULL, this ); - m_buttonEdit->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CAddressBookDialogBase::OnButtonEdit ), NULL, this ); - m_buttonNew->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CAddressBookDialogBase::OnButtonNew ), NULL, this ); - m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CAddressBookDialogBase::OnButtonOK ), NULL, this ); - m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CAddressBookDialogBase::OnButtonCancel ), NULL, this ); -} - -CGetTextFromUserDialogBase::CGetTextFromUserDialogBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer79; - bSizer79 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer81; - bSizer81 = new wxBoxSizer( wxVERTICAL ); - - - bSizer81->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticTextMessage1 = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextMessage1->Wrap( -1 ); - bSizer81->Add( m_staticTextMessage1, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_textCtrl1 = new wxTextCtrl( this, wxID_TEXTCTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER ); - bSizer81->Add( m_textCtrl1, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_staticTextMessage2 = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextMessage2->Wrap( -1 ); - m_staticTextMessage2->Hide(); - - bSizer81->Add( m_staticTextMessage2, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_textCtrl2 = new wxTextCtrl( this, wxID_TEXTCTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER ); - m_textCtrl2->Hide(); - - bSizer81->Add( m_textCtrl2, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer81->Add( 0, 0, 1, wxEXPAND, 5 ); - - bSizer79->Add( bSizer81, 1, wxEXPAND|wxALL, 10 ); - - wxBoxSizer* bSizer80; - bSizer80 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer80->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_buttonOK = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer80->Add( m_buttonOK, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer80->Add( m_buttonCancel, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - bSizer79->Add( bSizer80, 0, wxEXPAND, 5 ); - - this->SetSizer( bSizer79 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CGetTextFromUserDialogBase::OnClose ) ); - m_textCtrl1->Connect( wxEVT_KEY_DOWN, wxKeyEventHandler( CGetTextFromUserDialogBase::OnKeyDown ), NULL, this ); - m_textCtrl2->Connect( wxEVT_KEY_DOWN, wxKeyEventHandler( CGetTextFromUserDialogBase::OnKeyDown ), NULL, this ); - m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CGetTextFromUserDialogBase::OnButtonOK ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CGetTextFromUserDialogBase::OnButtonCancel ), NULL, this ); -} - -CGetTextFromUserDialogBase::~CGetTextFromUserDialogBase() -{ - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CGetTextFromUserDialogBase::OnClose ) ); - m_textCtrl1->Disconnect( wxEVT_KEY_DOWN, wxKeyEventHandler( CGetTextFromUserDialogBase::OnKeyDown ), NULL, this ); - m_textCtrl2->Disconnect( wxEVT_KEY_DOWN, wxKeyEventHandler( CGetTextFromUserDialogBase::OnKeyDown ), NULL, this ); - m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CGetTextFromUserDialogBase::OnButtonOK ), NULL, this ); - m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CGetTextFromUserDialogBase::OnButtonCancel ), NULL, this ); -} diff --git a/src/uibase.h b/src/uibase.h deleted file mode 100644 index ca0730b20..000000000 --- a/src/uibase.h +++ /dev/null @@ -1,425 +0,0 @@ -/////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Dec 21 2009) -// http://www.wxformbuilder.org/ -// -// PLEASE DO "NOT" EDIT THIS FILE! -/////////////////////////////////////////////////////////////////////////// - -#ifndef __uibase__ -#define __uibase__ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/////////////////////////////////////////////////////////////////////////// - -#define wxID_MAINFRAME 1000 -#define wxID_BUTTONSEND 1001 -#define wxID_BUTTONRECEIVE 1002 -#define wxID_TEXTCTRLADDRESS 1003 -#define wxID_BUTTONNEW 1004 -#define wxID_BUTTONCOPY 1005 -#define wxID_PROXYIP 1006 -#define wxID_PROXYPORT 1007 -#define wxID_TRANSACTIONFEE 1008 -#define wxID_TEXTCTRLPAYTO 1009 -#define wxID_BUTTONPASTE 1010 -#define wxID_BUTTONADDRESSBOOK 1011 -#define wxID_TEXTCTRLAMOUNT 1012 -#define wxID_CHOICETRANSFERTYPE 1013 -#define wxID_LISTCTRL 1014 -#define wxID_BUTTONRENAME 1015 -#define wxID_PANELSENDING 1016 -#define wxID_LISTCTRLSENDING 1017 -#define wxID_PANELRECEIVING 1018 -#define wxID_LISTCTRLRECEIVING 1019 -#define wxID_BUTTONDELETE 1020 -#define wxID_BUTTONEDIT 1021 -#define wxID_TEXTCTRL 1022 - -/////////////////////////////////////////////////////////////////////////////// -/// Class CMainFrameBase -/////////////////////////////////////////////////////////////////////////////// -class CMainFrameBase : public wxFrame -{ - private: - - protected: - wxMenuBar* m_menubar; - wxMenu* m_menuFile; - wxMenu* m_menuHelp; - wxToolBar* m_toolBar; - - wxStaticText* m_staticText32; - wxButton* m_buttonNew; - wxButton* m_buttonCopy; - - wxStaticText* m_staticText41; - wxStaticText* m_staticTextBalance; - - wxChoice* m_choiceFilter; - wxNotebook* m_notebook; - wxPanel* m_panel9; - wxPanel* m_panel91; - wxPanel* m_panel92; - wxPanel* m_panel93; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnIconize( wxIconizeEvent& event ) { event.Skip(); } - virtual void OnIdle( wxIdleEvent& event ) { event.Skip(); } - virtual void OnMouseEvents( wxMouseEvent& event ) { event.Skip(); } - virtual void OnPaint( wxPaintEvent& event ) { event.Skip(); } - virtual void OnMenuFileExit( wxCommandEvent& event ) { event.Skip(); } - virtual void OnMenuOptionsChangeYourAddress( wxCommandEvent& event ) { event.Skip(); } - virtual void OnMenuOptionsEncryptWallet( wxCommandEvent& event ) { event.Skip(); } - virtual void OnMenuOptionsChangeWalletPassphrase( wxCommandEvent& event ) { event.Skip(); } - virtual void OnMenuOptionsOptions( wxCommandEvent& event ) { event.Skip(); } - virtual void OnMenuHelpAbout( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonSend( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonAddressBook( wxCommandEvent& event ) { event.Skip(); } - virtual void OnKeyDown( wxKeyEvent& event ) { event.Skip(); } - virtual void OnMouseEventsAddress( wxMouseEvent& event ) { event.Skip(); } - virtual void OnSetFocusAddress( wxFocusEvent& event ) { event.Skip(); } - virtual void OnButtonNew( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonCopy( wxCommandEvent& event ) { event.Skip(); } - virtual void OnNotebookPageChanged( wxNotebookEvent& event ) { event.Skip(); } - virtual void OnListColBeginDrag( wxListEvent& event ) { event.Skip(); } - virtual void OnListItemActivated( wxListEvent& event ) { event.Skip(); } - virtual void OnPaintListCtrl( wxPaintEvent& event ) { event.Skip(); } - - - public: - wxMenu* m_menuOptions; - wxMenuItem* m_menuOptionsEncryptWallet; - wxMenuItem* m_menuOptionsChangeWalletPassphrase; - wxStatusBar* m_statusBar; - wxTextCtrl* m_textCtrlAddress; - wxListCtrl* m_listCtrlAll; - wxListCtrl* m_listCtrlSentReceived; - wxListCtrl* m_listCtrlSent; - wxListCtrl* m_listCtrlReceived; - - CMainFrameBase( wxWindow* parent, wxWindowID id = wxID_MAINFRAME, const wxString& title = _("Bitcoin"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 723,484 ), long style = wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER|wxTAB_TRAVERSAL ); - ~CMainFrameBase(); - -}; - -/////////////////////////////////////////////////////////////////////////////// -/// Class CTxDetailsDialogBase -/////////////////////////////////////////////////////////////////////////////// -class CTxDetailsDialogBase : public wxDialog -{ - private: - - protected: - wxHtmlWindow* m_htmlWin; - wxButton* m_buttonOK; - - // Virtual event handlers, overide them in your derived class - virtual void OnButtonOK( wxCommandEvent& event ) { event.Skip(); } - - - public: - - CTxDetailsDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Transaction Details"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 620,450 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~CTxDetailsDialogBase(); - -}; - -/////////////////////////////////////////////////////////////////////////////// -/// Class COptionsDialogBase -/////////////////////////////////////////////////////////////////////////////// -class COptionsDialogBase : public wxDialog -{ - private: - - protected: - wxListBox* m_listBox; - wxScrolledWindow* m_scrolledWindow; - wxPanel* m_panelMain; - - wxCheckBox* m_checkBoxStartOnSystemStartup; - wxCheckBox* m_checkBoxMinimizeToTray; - wxCheckBox* m_checkBoxUseUPnP; - wxCheckBox* m_checkBoxMinimizeOnClose; - wxCheckBox* m_checkBoxUseProxy; - - wxStaticText* m_staticTextProxyIP; - wxTextCtrl* m_textCtrlProxyIP; - wxStaticText* m_staticTextProxyPort; - wxTextCtrl* m_textCtrlProxyPort; - - wxStaticText* m_staticText32; - wxStaticText* m_staticText31; - wxTextCtrl* m_textCtrlTransactionFee; - wxPanel* m_panelTest2; - - wxStaticText* m_staticText321; - wxStaticText* m_staticText69; - wxButton* m_buttonOK; - wxButton* m_buttonCancel; - wxButton* m_buttonApply; - - // Virtual event handlers, overide them in your derived class - virtual void OnListBox( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCheckBoxMinimizeToTray( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCheckBoxUseProxy( wxCommandEvent& event ) { event.Skip(); } - virtual void OnKillFocusProxy( wxFocusEvent& event ) { event.Skip(); } - virtual void OnKillFocusTransactionFee( wxFocusEvent& event ) { event.Skip(); } - virtual void OnButtonOK( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonCancel( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonApply( wxCommandEvent& event ) { event.Skip(); } - - - public: - - COptionsDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Options"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 540,360 ), long style = wxDEFAULT_DIALOG_STYLE ); - ~COptionsDialogBase(); - -}; - -/////////////////////////////////////////////////////////////////////////////// -/// Class CAboutDialogBase -/////////////////////////////////////////////////////////////////////////////// -class CAboutDialogBase : public wxDialog -{ - private: - - protected: - wxStaticBitmap* m_bitmap; - - wxStaticText* m_staticText40; - - wxStaticText* m_staticTextMain; - - - wxButton* m_buttonOK; - - // Virtual event handlers, overide them in your derived class - virtual void OnButtonOK( wxCommandEvent& event ) { event.Skip(); } - - - public: - wxStaticText* m_staticTextVersion; - - CAboutDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About Bitcoin"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 532,333 ), long style = wxDEFAULT_DIALOG_STYLE ); - ~CAboutDialogBase(); - -}; - -/////////////////////////////////////////////////////////////////////////////// -/// Class CSendDialogBase -/////////////////////////////////////////////////////////////////////////////// -class CSendDialogBase : public wxDialog -{ - private: - - protected: - - - wxStaticText* m_staticTextInstructions; - - wxStaticBitmap* m_bitmapCheckMark; - wxStaticText* m_staticText36; - wxTextCtrl* m_textCtrlAddress; - wxButton* m_buttonPaste; - wxButton* m_buttonAddress; - wxStaticText* m_staticText19; - wxTextCtrl* m_textCtrlAmount; - wxStaticText* m_staticText20; - wxChoice* m_choiceTransferType; - - - - wxButton* m_buttonSend; - wxButton* m_buttonCancel; - - // Virtual event handlers, overide them in your derived class - virtual void OnKeyDown( wxKeyEvent& event ) { event.Skip(); } - virtual void OnTextAddress( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonPaste( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonAddressBook( wxCommandEvent& event ) { event.Skip(); } - virtual void OnKillFocusAmount( wxFocusEvent& event ) { event.Skip(); } - virtual void OnButtonSend( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonCancel( wxCommandEvent& event ) { event.Skip(); } - - - public: - - CSendDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Send Coins"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 498,157 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~CSendDialogBase(); - -}; - -/////////////////////////////////////////////////////////////////////////////// -/// Class CSendingDialogBase -/////////////////////////////////////////////////////////////////////////////// -class CSendingDialogBase : public wxDialog -{ - private: - - protected: - wxStaticText* m_staticTextSending; - wxTextCtrl* m_textCtrlStatus; - - wxButton* m_buttonOK; - wxButton* m_buttonCancel; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnPaint( wxPaintEvent& event ) { event.Skip(); } - virtual void OnButtonOK( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonCancel( wxCommandEvent& event ) { event.Skip(); } - - - public: - - CSendingDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Sending..."), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 442,151 ), long style = wxDEFAULT_DIALOG_STYLE ); - ~CSendingDialogBase(); - -}; - -/////////////////////////////////////////////////////////////////////////////// -/// Class CYourAddressDialogBase -/////////////////////////////////////////////////////////////////////////////// -class CYourAddressDialogBase : public wxDialog -{ - private: - - protected: - - wxStaticText* m_staticText45; - wxListCtrl* m_listCtrl; - - wxButton* m_buttonRename; - wxButton* m_buttonNew; - wxButton* m_buttonCopy; - wxButton* m_buttonOK; - wxButton* m_buttonCancel; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnListEndLabelEdit( wxListEvent& event ) { event.Skip(); } - virtual void OnListItemActivated( wxListEvent& event ) { event.Skip(); } - virtual void OnListItemSelected( wxListEvent& event ) { event.Skip(); } - virtual void OnButtonRename( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonNew( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonCopy( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonOK( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonCancel( wxCommandEvent& event ) { event.Skip(); } - - - public: - - CYourAddressDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Your Bitcoin Addresses"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 610,390 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~CYourAddressDialogBase(); - -}; - -/////////////////////////////////////////////////////////////////////////////// -/// Class CAddressBookDialogBase -/////////////////////////////////////////////////////////////////////////////// -class CAddressBookDialogBase : public wxDialog -{ - private: - - protected: - wxNotebook* m_notebook; - wxPanel* m_panelSending; - - wxStaticText* m_staticText55; - wxListCtrl* m_listCtrlSending; - wxPanel* m_panelReceiving; - - wxStaticText* m_staticText45; - - wxListCtrl* m_listCtrlReceiving; - - wxButton* m_buttonDelete; - wxButton* m_buttonCopy; - wxButton* m_buttonEdit; - wxButton* m_buttonNew; - wxButton* m_buttonOK; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnNotebookPageChanged( wxNotebookEvent& event ) { event.Skip(); } - virtual void OnListEndLabelEdit( wxListEvent& event ) { event.Skip(); } - virtual void OnListItemActivated( wxListEvent& event ) { event.Skip(); } - virtual void OnListItemSelected( wxListEvent& event ) { event.Skip(); } - virtual void OnButtonDelete( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonCopy( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonEdit( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonNew( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonOK( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonCancel( wxCommandEvent& event ) { event.Skip(); } - - - public: - wxButton* m_buttonCancel; - - CAddressBookDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Address Book"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 610,390 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~CAddressBookDialogBase(); - -}; - -/////////////////////////////////////////////////////////////////////////////// -/// Class CGetTextFromUserDialogBase -/////////////////////////////////////////////////////////////////////////////// -class CGetTextFromUserDialogBase : public wxDialog -{ - private: - - protected: - - wxStaticText* m_staticTextMessage1; - wxTextCtrl* m_textCtrl1; - wxStaticText* m_staticTextMessage2; - wxTextCtrl* m_textCtrl2; - - - wxButton* m_buttonOK; - wxButton* m_buttonCancel; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnKeyDown( wxKeyEvent& event ) { event.Skip(); } - virtual void OnButtonOK( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButtonCancel( wxCommandEvent& event ) { event.Skip(); } - - - public: - - CGetTextFromUserDialogBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 440,138 ), long style = wxDEFAULT_DIALOG_STYLE ); - ~CGetTextFromUserDialogBase(); - -}; - -#endif //__uibase__ diff --git a/src/util.cpp b/src/util.cpp index 80095fe77..a5e3d3099 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -471,40 +471,6 @@ void ParseParameters(int argc, char* argv[]) } -const char* wxGetTranslation(const char* pszEnglish) -{ -#ifdef GUI - // Wrapper of wxGetTranslation returning the same const char* type as was passed in - static CCriticalSection cs; - CRITICAL_BLOCK(cs) - { - // Look in cache - static map mapCache; - map::iterator mi = mapCache.find(pszEnglish); - if (mi != mapCache.end()) - return (*mi).second; - - // wxWidgets translation - wxString strTranslated = wxGetTranslation(wxString(pszEnglish, wxConvUTF8)); - - // We don't cache unknown strings because caller might be passing in a - // dynamic string and we would keep allocating memory for each variation. - if (strcmp(pszEnglish, strTranslated.utf8_str()) == 0) - return pszEnglish; - - // Add to cache, memory doesn't need to be freed. We only cache because - // we must pass back a pointer to permanently allocated memory. - char* pszCached = new char[strlen(strTranslated.utf8_str())+1]; - strcpy(pszCached, strTranslated.utf8_str()); - mapCache[pszEnglish] = pszCached; - return pszCached; - } - return NULL; -#else - return pszEnglish; -#endif -} - bool WildcardMatch(const char* psz, const char* mask) { @@ -573,10 +539,6 @@ void PrintException(std::exception* pex, const char* pszThread) printf("\n\n************************\n%s\n", pszMessage); fprintf(stderr, "\n\n************************\n%s\n", pszMessage); strMiscWarning = pszMessage; -#ifdef GUI - if (wxTheApp && !fDaemon) - MyMessageBox(pszMessage, "Bitcoin", wxOK | wxICON_ERROR); -#endif throw; } @@ -598,10 +560,6 @@ void PrintExceptionContinue(std::exception* pex, const char* pszThread) printf("\n\n************************\n%s\n", pszMessage); fprintf(stderr, "\n\n************************\n%s\n", pszMessage); strMiscWarning = pszMessage; -#ifdef GUI - if (wxTheApp && !fDaemon) - boost::thread(boost::bind(ThreadOneMessageBox, string(pszMessage))); -#endif } diff --git a/src/util.h b/src/util.h index dd5c41135..33013a2f8 100644 --- a/src/util.h +++ b/src/util.h @@ -132,7 +132,7 @@ inline int myclosesocket(SOCKET& hSocket) return ret; } #define closesocket(s) myclosesocket(s) -#if !defined(QT_GUI) && !defined(GUI) +#if !defined(QT_GUI) inline const char* _(const char* psz) { return psz; diff --git a/src/xpm/about.xpm b/src/xpm/about.xpm deleted file mode 100644 index 3fa868ca7..000000000 --- a/src/xpm/about.xpm +++ /dev/null @@ -1,665 +0,0 @@ -// Copyright (c) 2009-2010 Satoshi Nakamoto -// Distributed under the MIT/X11 software license, see the accompanying -// file license.txt or http://www.opensource.org/licenses/mit-license.php. -/* XPM */ -static const char * about_xpm[] = { -/* columns rows colors chars-per-pixel */ -"96 564 92 1", -" c #001269", -". c #000C72", -"X c #00057F", -"o c #001175", -"O c #000B6A", -"+ c #000E84", -"@ c #000489", -"# c #001583", -"$ c #001B89", -"% c #001B99", -"& c #000B92", -"* c #00208B", -"= c #002B97", -"- c #0004A6", -"; c #001DA7", -": c #0014BC", -"> c #0019BB", -", c #0017B4", -"< c #0023A3", -"1 c #002CAA", -"2 c #0030A4", -"3 c #003BA3", -"4 c #0033AB", -"5 c #003FA8", -"6 c #0027B8", -"7 c #0035BB", -"8 c #003CBA", -"9 c #004ABD", -"0 c #001DC4", -"q c #0017CC", -"w c #000CD0", -"e c #0026C7", -"r c #0035C4", -"t c #003DC5", -"y c #0032CB", -"u c #003BCC", -"i c #002BD3", -"p c #0021DC", -"a c #0025D5", -"s c #0034D5", -"d c #003ADB", -"f c #0016F6", -"g c #0008F9", -"h c #0027E3", -"j c #003CE9", -"k c #002BF5", -"l c #0024F9", -"z c #0033F4", -"x c #0035F8", -"c c #0048CA", -"v c #0055C5", -"b c #0059C3", -"n c #0053CB", -"m c #005ACC", -"M c #004FD4", -"N c #004CDC", -"B c #0047D0", -"V c #005BD6", -"C c #0049E5", -"Z c #0042EA", -"A c #0052E4", -"S c #005CE4", -"D c #0054EC", -"F c #005EEB", -"G c #004AF5", -"H c #0051F2", -"J c #005CFA", -"K c #0058F9", -"L c #0066E4", -"P c #006BE3", -"I c #0064EC", -"U c #006DEF", -"Y c #0074EB", -"T c #0078EC", -"R c #0073E7", -"E c #0065F4", -"W c #006BF5", -"Q c #006BFB", -"! c #0066FD", -"~ c #0073F5", -"^ c #007CF3", -"/ c #0075FB", -"( c #007DFC", -") c #0084FF", -"_ c #008AFF", -"` c #0092FF", -"' c #339CFF", -"] c #33A3FF", -"[ c #33AAFF", -"{ c #66B5FF", -"} c #66BBFF", -"| c #66C0FF", -/* pixels */ -"kkkkkkkkkkkk<<<<<<<<<<<>>>>>>>>>>>rrrrrrrrrrrrVVVVVVVVVVVVLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"hhhhhhhhhhhh>>>>>>>>>>>>rrrrrrrrrrrrVVVVVVVVVVVVLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"hhhhhhhhhhhh>>>>>>>>>>>>rrrrrrrrrrrrVVVVVVVVVVVVLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"hhhhhhhhhhhh>>>>>>>>>>>>rrrrrrrrrrrrVVVVVVVVVVVVLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"hhhhhhhhhhhh>>>>>>>>>>>>rrrrrrrrrrrrVVVVVVVVVVVVLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"hhhhhhhhhhhh>>>>>>>>>>>>rrrrrrrrrrrrVVVVVVVVVVVVLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"hhhhhhhhhhhh>>>>>>>>>>>>rrrrrrrrrrrrVVVVVVVVVVVVLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"hhhhhhhhhhhh>>>>>>>>>>>>rrrrrrrrrrrrVVVVVVVVVVVVLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"hhhhhhhhhhhh>>>>>>>>>>>>rrrrrrrrrrrrVVVVVVVVVVVVLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"hhhhhhhhhhhh>>>>>>>>>>>>rrrrrrrrrrrrVVVVVVVVVVVVLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"hhhhhhhhhhhh>>>>>>>>>>>>rrrrrrrrrrrrVVVVVVVVVVVVLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"hhhhhhhhhhhh>>>>>>>>>>>>rrrrrrrrrrrrVVVVVVVVVVVVLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"::::::::::::;;;;;;;;;;;;HHHHHHHHHHHHccccccccccccQQQQQQQQQQQQ))))))))))))''''''''''''}}}}}}}}}}}}", -"::::::::::::;;;;;;;;;;;;HHHHHHHHHHHHccccccccccccQQQQQQQQQQQQ))))))))))))''''''''''''}}}}}}}}}}}}", -"::::::::::::;;;;;;;;;;;;HHHHHHHHHHHHccccccccccccQQQQQQQQQQQQ))))))))))))''''''''''''}}}}}}}}}}}}", -"::::::::::::;;;;;;;;;;;;HHHHHHHHHHHHccccccccccccQQQQQQQQQQQQ))))))))))))''''''''''''}}}}}}}}}}}}", -"::::::::::::;;;;;;;;;;;;HHHHHHHHHHHHccccccccccccQQQQQQQQQQQQ))))))))))))''''''''''''}}}}}}}}}}}}", -"::::::::::::;;;;;;;;;;;;HHHHHHHHHHHHccccccccccccQQQQQQQQQQQQ))))))))))))''''''''''''}}}}}}}}}}}}", -"::::::::::::;;;;;;;;;;;;HHHHHHHHHHHHccccccccccccQQQQQQQQQQQQ))))))))))))''''''''''''}}}}}}}}}}}}", -"::::::::::::;;;;;;;;;;;;HHHHHHHHHHHHccccccccccccQQQQQQQQQQQQ))))))))))))''''''''''''}}}}}}}}}}}}", -"::::::::::::;;;;;;;;;;;;HHHHHHHHHHHHccccccccccccQQQQQQQQQQQQ))))))))))))''''''''''''}}}}}}}}}}}}", -"::::::::::::;;;;;;;;;;;;HHHHHHHHHHHHccccccccccccQQQQQQQQQQQQ))))))))))))''''''''''''}}}}}}}}}}}}", -"::::::::::::;;;;;;;;;;;;HHHHHHHHHHHHccccccccccccQQQQQQQQQQQQ))))))))))))''''''''''''}}}}}}}}}}}}", -"::::::::::::;;;;;;;;;;;;HHHHHHHHHHHHccccccccccccQQQQQQQQQQQQ))))))))))))''''''''''''}}}}}}}}}}}}", -"qqqqqqqqqqqqkkkkkkkkkkkk333333333333AAAAAAAAAAAARRRRRRRRRRRR))))))))))))''''''''''''{{{{{{{{{{{{", -"qqqqqqqqqqqqkkkkkkkkkkkk333333333333AAAAAAAAAAAARRRRRRRRRRRR))))))))))))''''''''''''{{{{{{{{{{{{", -"qqqqqqqqqqqqkkkkkkkkkkkk333333333333AAAAAAAAAAAARRRRRRRRRRRR))))))))))))''''''''''''{{{{{{{{{{{{", -"qqqqqqqqqqqqkkkkkkkkkkkk333333333333AAAAAAAAAAAARRRRRRRRRRRR))))))))))))''''''''''''{{{{{{{{{{{{", -"qqqqqqqqqqqqkkkkkkkkkkkk333333333333AAAAAAAAAAAARRRRRRRRRRRR))))))))))))''''''''''''{{{{{{{{{{{{", -"qqqqqqqqqqqqkkkkkkkkkkkk333333333333AAAAAAAAAAAARRRRRRRRRRRR))))))))))))''''''''''''{{{{{{{{{{{{", -"qqqqqqqqqqqqkkkkkkkkkkkk333333333333AAAAAAAAAAAARRRRRRRRRRRR))))))))))))''''''''''''{{{{{{{{{{{{", -"qqqqqqqqqqqqkkkkkkkkkkkk333333333333AAAAAAAAAAAARRRRRRRRRRRR))))))))))))''''''''''''{{{{{{{{{{{{", -"qqqqqqqqqqqqkkkkkkkkkkkk333333333333AAAAAAAAAAAARRRRRRRRRRRR))))))))))))''''''''''''{{{{{{{{{{{{", -"qqqqqqqqqqqqkkkkkkkkkkkk333333333333AAAAAAAAAAAARRRRRRRRRRRR))))))))))))''''''''''''{{{{{{{{{{{{", -"qqqqqqqqqqqqkkkkkkkkkkkk333333333333AAAAAAAAAAAARRRRRRRRRRRR))))))))))))''''''''''''{{{{{{{{{{{{", -"qqqqqqqqqqqqkkkkkkkkkkkk333333333333AAAAAAAAAAAARRRRRRRRRRRR))))))))))))''''''''''''{{{{{{{{{{{{", -"############ppppppppppppssssssssssssIIIIIIIIIIII^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"############ppppppppppppssssssssssssIIIIIIIIIIII^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"############ppppppppppppssssssssssssIIIIIIIIIIII^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"############ppppppppppppssssssssssssIIIIIIIIIIII^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"############ppppppppppppssssssssssssIIIIIIIIIIII^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"############ppppppppppppssssssssssssIIIIIIIIIIII^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"############ppppppppppppssssssssssssIIIIIIIIIIII^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"############ppppppppppppssssssssssssIIIIIIIIIIII^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"############ppppppppppppssssssssssssIIIIIIIIIIII^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"############ppppppppppppssssssssssssIIIIIIIIIIII^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"############ppppppppppppssssssssssssIIIIIIIIIIII^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"############ppppppppppppssssssssssssIIIIIIIIIIII^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"++++++++++++rrrrrrrrrrrr777777777777MMMMMMMMMMMMIIIIIIIIIIII````````````''''''''''''{{{{{{{{{{{{", -"++++++++++++rrrrrrrrrrrr777777777777MMMMMMMMMMMMIIIIIIIIIIII````````````''''''''''''{{{{{{{{{{{{", -"++++++++++++rrrrrrrrrrrr777777777777MMMMMMMMMMMMIIIIIIIIIIII````````````''''''''''''{{{{{{{{{{{{", -"++++++++++++rrrrrrrrrrrr777777777777MMMMMMMMMMMMIIIIIIIIIIII````````````''''''''''''{{{{{{{{{{{{", -"++++++++++++rrrrrrrrrrrr777777777777MMMMMMMMMMMMIIIIIIIIIIII````````````''''''''''''{{{{{{{{{{{{", -"++++++++++++rrrrrrrrrrrr777777777777MMMMMMMMMMMMIIIIIIIIIIII````````````''''''''''''{{{{{{{{{{{{", -"++++++++++++rrrrrrrrrrrr777777777777MMMMMMMMMMMMIIIIIIIIIIII````````````''''''''''''{{{{{{{{{{{{", -"++++++++++++rrrrrrrrrrrr777777777777MMMMMMMMMMMMIIIIIIIIIIII````````````''''''''''''{{{{{{{{{{{{", -"++++++++++++rrrrrrrrrrrr777777777777MMMMMMMMMMMMIIIIIIIIIIII````````````''''''''''''{{{{{{{{{{{{", -"++++++++++++rrrrrrrrrrrr777777777777MMMMMMMMMMMMIIIIIIIIIIII````````````''''''''''''{{{{{{{{{{{{", -"++++++++++++rrrrrrrrrrrr777777777777MMMMMMMMMMMMIIIIIIIIIIII````````````''''''''''''{{{{{{{{{{{{", -"++++++++++++rrrrrrrrrrrr777777777777MMMMMMMMMMMMIIIIIIIIIIII````````````''''''''''''{{{{{{{{{{{{", -"------------$$$$$$$$$$$$999999999999JJJJJJJJJJJJTTTTTTTTTTTT____________]]]]]]]]]]]]{{{{{{{{{{{{", -"------------$$$$$$$$$$$$999999999999JJJJJJJJJJJJTTTTTTTTTTTT____________]]]]]]]]]]]]{{{{{{{{{{{{", -"------------$$$$$$$$$$$$999999999999JJJJJJJJJJJJTTTTTTTTTTTT____________]]]]]]]]]]]]{{{{{{{{{{{{", -"------------$$$$$$$$$$$$999999999999JJJJJJJJJJJJTTTTTTTTTTTT____________]]]]]]]]]]]]{{{{{{{{{{{{", -"------------$$$$$$$$$$$$999999999999JJJJJJJJJJJJTTTTTTTTTTTT____________]]]]]]]]]]]]{{{{{{{{{{{{", -"------------$$$$$$$$$$$$999999999999JJJJJJJJJJJJTTTTTTTTTTTT____________]]]]]]]]]]]]{{{{{{{{{{{{", -"------------$$$$$$$$$$$$999999999999JJJJJJJJJJJJTTTTTTTTTTTT____________]]]]]]]]]]]]{{{{{{{{{{{{", -"------------$$$$$$$$$$$$999999999999JJJJJJJJJJJJTTTTTTTTTTTT____________]]]]]]]]]]]]{{{{{{{{{{{{", -"------------$$$$$$$$$$$$999999999999JJJJJJJJJJJJTTTTTTTTTTTT____________]]]]]]]]]]]]{{{{{{{{{{{{", -"------------$$$$$$$$$$$$999999999999JJJJJJJJJJJJTTTTTTTTTTTT____________]]]]]]]]]]]]{{{{{{{{{{{{", -"------------$$$$$$$$$$$$999999999999JJJJJJJJJJJJTTTTTTTTTTTT____________]]]]]]]]]]]]{{{{{{{{{{{{", -"------------$$$$$$$$$$$$999999999999JJJJJJJJJJJJTTTTTTTTTTTT____________]]]]]]]]]]]]{{{{{{{{{{{{", -"@@@@@@@@@@@@666666666666ttttttttttttWWWWWWWWWWWWPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@666666666666ttttttttttttWWWWWWWWWWWWPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@666666666666ttttttttttttWWWWWWWWWWWWPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@666666666666ttttttttttttWWWWWWWWWWWWPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@666666666666ttttttttttttWWWWWWWWWWWWPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@666666666666ttttttttttttWWWWWWWWWWWWPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@666666666666ttttttttttttWWWWWWWWWWWWPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@666666666666ttttttttttttWWWWWWWWWWWWPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@666666666666ttttttttttttWWWWWWWWWWWWPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@666666666666ttttttttttttWWWWWWWWWWWWPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@666666666666ttttttttttttWWWWWWWWWWWWPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@666666666666ttttttttttttWWWWWWWWWWWWPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaazzzzzzzzzzzzBBBBBBBBBBBBbbbbbbbbbbbbPPPPPPPPPPPP____________''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaazzzzzzzzzzzzBBBBBBBBBBBBbbbbbbbbbbbbPPPPPPPPPPPP____________''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaazzzzzzzzzzzzBBBBBBBBBBBBbbbbbbbbbbbbPPPPPPPPPPPP____________''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaazzzzzzzzzzzzBBBBBBBBBBBBbbbbbbbbbbbbPPPPPPPPPPPP____________''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaazzzzzzzzzzzzBBBBBBBBBBBBbbbbbbbbbbbbPPPPPPPPPPPP____________''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaazzzzzzzzzzzzBBBBBBBBBBBBbbbbbbbbbbbbPPPPPPPPPPPP____________''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaazzzzzzzzzzzzBBBBBBBBBBBBbbbbbbbbbbbbPPPPPPPPPPPP____________''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaazzzzzzzzzzzzBBBBBBBBBBBBbbbbbbbbbbbbPPPPPPPPPPPP____________''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaazzzzzzzzzzzzBBBBBBBBBBBBbbbbbbbbbbbbPPPPPPPPPPPP____________''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaazzzzzzzzzzzzBBBBBBBBBBBBbbbbbbbbbbbbPPPPPPPPPPPP____________''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaazzzzzzzzzzzzBBBBBBBBBBBBbbbbbbbbbbbbPPPPPPPPPPPP____________''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaazzzzzzzzzzzzBBBBBBBBBBBBbbbbbbbbbbbbPPPPPPPPPPPP____________''''''''''''{{{{{{{{{{{{", -"------------%%%%%%%%%%%%ttttttttttttNNNNNNNNNNNN^^^^^^^^^^^^))))))))))))''''''''''''}}}}}}}}}}}}", -"------------%%%%%%%%%%%%ttttttttttttNNNNNNNNNNNN^^^^^^^^^^^^))))))))))))''''''''''''}}}}}}}}}}}}", -"------------%%%%%%%%%%%%ttttttttttttNNNNNNNNNNNN^^^^^^^^^^^^))))))))))))''''''''''''}}}}}}}}}}}}", -"------------%%%%%%%%%%%%ttttttttttttNNNNNNNNNNNN^^^^^^^^^^^^))))))))))))''''''''''''}}}}}}}}}}}}", -"------------%%%%%%%%%%%%ttttttttttttNNNNNNNNNNNN^^^^^^^^^^^^))))))))))))''''''''''''}}}}}}}}}}}}", -"------------%%%%%%%%%%%%ttttttttttttNNNNNNNNNNNN^^^^^^^^^^^^))))))))))))''''''''''''}}}}}}}}}}}}", -"------------%%%%%%%%%%%%ttttttttttttNNNNNNNNNNNN^^^^^^^^^^^^))))))))))))''''''''''''}}}}}}}}}}}}", -"------------%%%%%%%%%%%%ttttttttttttNNNNNNNNNNNN^^^^^^^^^^^^))))))))))))''''''''''''}}}}}}}}}}}}", -"------------%%%%%%%%%%%%ttttttttttttNNNNNNNNNNNN^^^^^^^^^^^^))))))))))))''''''''''''}}}}}}}}}}}}", -"------------%%%%%%%%%%%%ttttttttttttNNNNNNNNNNNN^^^^^^^^^^^^))))))))))))''''''''''''}}}}}}}}}}}}", -"------------%%%%%%%%%%%%ttttttttttttNNNNNNNNNNNN^^^^^^^^^^^^))))))))))))''''''''''''}}}}}}}}}}}}", -"------------%%%%%%%%%%%%ttttttttttttNNNNNNNNNNNN^^^^^^^^^^^^))))))))))))''''''''''''}}}}}}}}}}}}", -" 000000000000888888888888FFFFFFFFFFFF~~~~~~~~~~~~))))))))))))''''''''''''}}}}}}}}}}}}", -" 000000000000888888888888FFFFFFFFFFFF~~~~~~~~~~~~))))))))))))''''''''''''}}}}}}}}}}}}", -" 000000000000888888888888FFFFFFFFFFFF~~~~~~~~~~~~))))))))))))''''''''''''}}}}}}}}}}}}", -" 000000000000888888888888FFFFFFFFFFFF~~~~~~~~~~~~))))))))))))''''''''''''}}}}}}}}}}}}", -" 000000000000888888888888FFFFFFFFFFFF~~~~~~~~~~~~))))))))))))''''''''''''}}}}}}}}}}}}", -" 000000000000888888888888FFFFFFFFFFFF~~~~~~~~~~~~))))))))))))''''''''''''}}}}}}}}}}}}", -" 000000000000888888888888FFFFFFFFFFFF~~~~~~~~~~~~))))))))))))''''''''''''}}}}}}}}}}}}", -" 000000000000888888888888FFFFFFFFFFFF~~~~~~~~~~~~))))))))))))''''''''''''}}}}}}}}}}}}", -" 000000000000888888888888FFFFFFFFFFFF~~~~~~~~~~~~))))))))))))''''''''''''}}}}}}}}}}}}", -" 000000000000888888888888FFFFFFFFFFFF~~~~~~~~~~~~))))))))))))''''''''''''}}}}}}}}}}}}", -" 000000000000888888888888FFFFFFFFFFFF~~~~~~~~~~~~))))))))))))''''''''''''}}}}}}}}}}}}", -" 000000000000888888888888FFFFFFFFFFFF~~~~~~~~~~~~))))))))))))''''''''''''}}}}}}}}}}}}", -"++++++++++++222222222222xxxxxxxxxxxxNNNNNNNNNNNNEEEEEEEEEEEE))))))))))))''''''''''''}}}}}}}}}}}}", -"++++++++++++222222222222xxxxxxxxxxxxNNNNNNNNNNNNEEEEEEEEEEEE))))))))))))''''''''''''}}}}}}}}}}}}", -"++++++++++++222222222222xxxxxxxxxxxxNNNNNNNNNNNNEEEEEEEEEEEE))))))))))))''''''''''''}}}}}}}}}}}}", -"++++++++++++222222222222xxxxxxxxxxxxNNNNNNNNNNNNEEEEEEEEEEEE))))))))))))''''''''''''}}}}}}}}}}}}", -"++++++++++++222222222222xxxxxxxxxxxxNNNNNNNNNNNNEEEEEEEEEEEE))))))))))))''''''''''''}}}}}}}}}}}}", -"++++++++++++222222222222xxxxxxxxxxxxNNNNNNNNNNNNEEEEEEEEEEEE))))))))))))''''''''''''}}}}}}}}}}}}", -"++++++++++++222222222222xxxxxxxxxxxxNNNNNNNNNNNNEEEEEEEEEEEE))))))))))))''''''''''''}}}}}}}}}}}}", -"++++++++++++222222222222xxxxxxxxxxxxNNNNNNNNNNNNEEEEEEEEEEEE))))))))))))''''''''''''}}}}}}}}}}}}", -"++++++++++++222222222222xxxxxxxxxxxxNNNNNNNNNNNNEEEEEEEEEEEE))))))))))))''''''''''''}}}}}}}}}}}}", -"++++++++++++222222222222xxxxxxxxxxxxNNNNNNNNNNNNEEEEEEEEEEEE))))))))))))''''''''''''}}}}}}}}}}}}", -"++++++++++++222222222222xxxxxxxxxxxxNNNNNNNNNNNNEEEEEEEEEEEE))))))))))))''''''''''''}}}}}}}}}}}}", -"++++++++++++222222222222xxxxxxxxxxxxNNNNNNNNNNNNEEEEEEEEEEEE))))))))))))''''''''''''}}}}}}}}}}}}", -"$$$$$$$$$$$$000000000000GGGGGGGGGGGGnnnnnnnnnnnnLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"$$$$$$$$$$$$000000000000GGGGGGGGGGGGnnnnnnnnnnnnLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"$$$$$$$$$$$$000000000000GGGGGGGGGGGGnnnnnnnnnnnnLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"$$$$$$$$$$$$000000000000GGGGGGGGGGGGnnnnnnnnnnnnLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"$$$$$$$$$$$$000000000000GGGGGGGGGGGGnnnnnnnnnnnnLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"$$$$$$$$$$$$000000000000GGGGGGGGGGGGnnnnnnnnnnnnLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"$$$$$$$$$$$$000000000000GGGGGGGGGGGGnnnnnnnnnnnnLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"$$$$$$$$$$$$000000000000GGGGGGGGGGGGnnnnnnnnnnnnLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"$$$$$$$$$$$$000000000000GGGGGGGGGGGGnnnnnnnnnnnnLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"$$$$$$$$$$$$000000000000GGGGGGGGGGGGnnnnnnnnnnnnLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"$$$$$$$$$$$$000000000000GGGGGGGGGGGGnnnnnnnnnnnnLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"$$$$$$$$$$$$000000000000GGGGGGGGGGGGnnnnnnnnnnnnLLLLLLLLLLLL))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"ooooooooooooffffffffffffccccccccccccbbbbbbbbbbbbRRRRRRRRRRRR____________''''''''''''{{{{{{{{{{{{", -"ooooooooooooffffffffffffccccccccccccbbbbbbbbbbbbRRRRRRRRRRRR____________''''''''''''{{{{{{{{{{{{", -"ooooooooooooffffffffffffccccccccccccbbbbbbbbbbbbRRRRRRRRRRRR____________''''''''''''{{{{{{{{{{{{", -"ooooooooooooffffffffffffccccccccccccbbbbbbbbbbbbRRRRRRRRRRRR____________''''''''''''{{{{{{{{{{{{", -"ooooooooooooffffffffffffccccccccccccbbbbbbbbbbbbRRRRRRRRRRRR____________''''''''''''{{{{{{{{{{{{", -"ooooooooooooffffffffffffccccccccccccbbbbbbbbbbbbRRRRRRRRRRRR____________''''''''''''{{{{{{{{{{{{", -"ooooooooooooffffffffffffccccccccccccbbbbbbbbbbbbRRRRRRRRRRRR____________''''''''''''{{{{{{{{{{{{", -"ooooooooooooffffffffffffccccccccccccbbbbbbbbbbbbRRRRRRRRRRRR____________''''''''''''{{{{{{{{{{{{", -"ooooooooooooffffffffffffccccccccccccbbbbbbbbbbbbRRRRRRRRRRRR____________''''''''''''{{{{{{{{{{{{", -"ooooooooooooffffffffffffccccccccccccbbbbbbbbbbbbRRRRRRRRRRRR____________''''''''''''{{{{{{{{{{{{", -"ooooooooooooffffffffffffccccccccccccbbbbbbbbbbbbRRRRRRRRRRRR____________''''''''''''{{{{{{{{{{{{", -"ooooooooooooffffffffffffccccccccccccbbbbbbbbbbbbRRRRRRRRRRRR____________''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@111111111111777777777777JJJJJJJJJJJJPPPPPPPPPPPP((((((((((((''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@111111111111777777777777JJJJJJJJJJJJPPPPPPPPPPPP((((((((((((''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@111111111111777777777777JJJJJJJJJJJJPPPPPPPPPPPP((((((((((((''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@111111111111777777777777JJJJJJJJJJJJPPPPPPPPPPPP((((((((((((''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@111111111111777777777777JJJJJJJJJJJJPPPPPPPPPPPP((((((((((((''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@111111111111777777777777JJJJJJJJJJJJPPPPPPPPPPPP((((((((((((''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@111111111111777777777777JJJJJJJJJJJJPPPPPPPPPPPP((((((((((((''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@111111111111777777777777JJJJJJJJJJJJPPPPPPPPPPPP((((((((((((''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@111111111111777777777777JJJJJJJJJJJJPPPPPPPPPPPP((((((((((((''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@111111111111777777777777JJJJJJJJJJJJPPPPPPPPPPPP((((((((((((''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@111111111111777777777777JJJJJJJJJJJJPPPPPPPPPPPP((((((((((((''''''''''''{{{{{{{{{{{{", -"@@@@@@@@@@@@111111111111777777777777JJJJJJJJJJJJPPPPPPPPPPPP((((((((((((''''''''''''{{{{{{{{{{{{", -" iiiiiiiiiiiiGGGGGGGGGGGGVVVVVVVVVVVV~~~~~~~~~~~~____________''''''''''''}}}}}}}}}}}}", -" iiiiiiiiiiiiGGGGGGGGGGGGVVVVVVVVVVVV~~~~~~~~~~~~____________''''''''''''}}}}}}}}}}}}", -" iiiiiiiiiiiiGGGGGGGGGGGGVVVVVVVVVVVV~~~~~~~~~~~~____________''''''''''''}}}}}}}}}}}}", -" iiiiiiiiiiiiGGGGGGGGGGGGVVVVVVVVVVVV~~~~~~~~~~~~____________''''''''''''}}}}}}}}}}}}", -" iiiiiiiiiiiiGGGGGGGGGGGGVVVVVVVVVVVV~~~~~~~~~~~~____________''''''''''''}}}}}}}}}}}}", -" iiiiiiiiiiiiGGGGGGGGGGGGVVVVVVVVVVVV~~~~~~~~~~~~____________''''''''''''}}}}}}}}}}}}", -" iiiiiiiiiiiiGGGGGGGGGGGGVVVVVVVVVVVV~~~~~~~~~~~~____________''''''''''''}}}}}}}}}}}}", -" iiiiiiiiiiiiGGGGGGGGGGGGVVVVVVVVVVVV~~~~~~~~~~~~____________''''''''''''}}}}}}}}}}}}", -" iiiiiiiiiiiiGGGGGGGGGGGGVVVVVVVVVVVV~~~~~~~~~~~~____________''''''''''''}}}}}}}}}}}}", -" iiiiiiiiiiiiGGGGGGGGGGGGVVVVVVVVVVVV~~~~~~~~~~~~____________''''''''''''}}}}}}}}}}}}", -" iiiiiiiiiiiiGGGGGGGGGGGGVVVVVVVVVVVV~~~~~~~~~~~~____________''''''''''''}}}}}}}}}}}}", -" iiiiiiiiiiiiGGGGGGGGGGGGVVVVVVVVVVVV~~~~~~~~~~~~____________''''''''''''}}}}}}}}}}}}", -"------------222222222222KKKKKKKKKKKKIIIIIIIIIIIIQQQQQQQQQQQQ____________''''''''''''{{{{{{{{{{{{", -"------------222222222222KKKKKKKKKKKKIIIIIIIIIIIIQQQQQQQQQQQQ____________''''''''''''{{{{{{{{{{{{", -"------------222222222222KKKKKKKKKKKKIIIIIIIIIIIIQQQQQQQQQQQQ____________''''''''''''{{{{{{{{{{{{", -"------------222222222222KKKKKKKKKKKKIIIIIIIIIIIIQQQQQQQQQQQQ____________''''''''''''{{{{{{{{{{{{", -"------------222222222222KKKKKKKKKKKKIIIIIIIIIIIIQQQQQQQQQQQQ____________''''''''''''{{{{{{{{{{{{", -"------------222222222222KKKKKKKKKKKKIIIIIIIIIIIIQQQQQQQQQQQQ____________''''''''''''{{{{{{{{{{{{", -"------------222222222222KKKKKKKKKKKKIIIIIIIIIIIIQQQQQQQQQQQQ____________''''''''''''{{{{{{{{{{{{", -"------------222222222222KKKKKKKKKKKKIIIIIIIIIIIIQQQQQQQQQQQQ____________''''''''''''{{{{{{{{{{{{", -"------------222222222222KKKKKKKKKKKKIIIIIIIIIIIIQQQQQQQQQQQQ____________''''''''''''{{{{{{{{{{{{", -"------------222222222222KKKKKKKKKKKKIIIIIIIIIIIIQQQQQQQQQQQQ____________''''''''''''{{{{{{{{{{{{", -"------------222222222222KKKKKKKKKKKKIIIIIIIIIIIIQQQQQQQQQQQQ____________''''''''''''{{{{{{{{{{{{", -"------------222222222222KKKKKKKKKKKKIIIIIIIIIIIIQQQQQQQQQQQQ____________''''''''''''{{{{{{{{{{{{", -"&&&&&&&&&&&&222222222222333333333333WWWWWWWWWWWW~~~~~~~~~~~~____________''''''''''''{{{{{{{{{{{{", -"&&&&&&&&&&&&222222222222333333333333WWWWWWWWWWWW~~~~~~~~~~~~____________''''''''''''{{{{{{{{{{{{", -"&&&&&&&&&&&&222222222222333333333333WWWWWWWWWWWW~~~~~~~~~~~~____________''''''''''''{{{{{{{{{{{{", -"&&&&&&&&&&&&222222222222333333333333WWWWWWWWWWWW~~~~~~~~~~~~____________''''''''''''{{{{{{{{{{{{", -"&&&&&&&&&&&&222222222222333333333333WWWWWWWWWWWW~~~~~~~~~~~~____________''''''''''''{{{{{{{{{{{{", -"&&&&&&&&&&&&222222222222333333333333WWWWWWWWWWWW~~~~~~~~~~~~____________''''''''''''{{{{{{{{{{{{", -"&&&&&&&&&&&&222222222222333333333333WWWWWWWWWWWW~~~~~~~~~~~~____________''''''''''''{{{{{{{{{{{{", -"&&&&&&&&&&&&222222222222333333333333WWWWWWWWWWWW~~~~~~~~~~~~____________''''''''''''{{{{{{{{{{{{", -"&&&&&&&&&&&&222222222222333333333333WWWWWWWWWWWW~~~~~~~~~~~~____________''''''''''''{{{{{{{{{{{{", -"&&&&&&&&&&&&222222222222333333333333WWWWWWWWWWWW~~~~~~~~~~~~____________''''''''''''{{{{{{{{{{{{", -"&&&&&&&&&&&&222222222222333333333333WWWWWWWWWWWW~~~~~~~~~~~~____________''''''''''''{{{{{{{{{{{{", -"&&&&&&&&&&&&222222222222333333333333WWWWWWWWWWWW~~~~~~~~~~~~____________''''''''''''{{{{{{{{{{{{", -"wwwwwwwwwwww============555555555555EEEEEEEEEEEEEEEEEEEEEEEE____________''''''''''''||||||||||||", -"wwwwwwwwwwww============555555555555EEEEEEEEEEEEEEEEEEEEEEEE____________''''''''''''||||||||||||", -"wwwwwwwwwwww============555555555555EEEEEEEEEEEEEEEEEEEEEEEE____________''''''''''''||||||||||||", -"wwwwwwwwwwww============555555555555EEEEEEEEEEEEEEEEEEEEEEEE____________''''''''''''||||||||||||", -"wwwwwwwwwwww============555555555555EEEEEEEEEEEEEEEEEEEEEEEE____________''''''''''''||||||||||||", -"wwwwwwwwwwww============555555555555EEEEEEEEEEEEEEEEEEEEEEEE____________''''''''''''||||||||||||", -"wwwwwwwwwwww============555555555555EEEEEEEEEEEEEEEEEEEEEEEE____________''''''''''''||||||||||||", -"wwwwwwwwwwww============555555555555EEEEEEEEEEEEEEEEEEEEEEEE____________''''''''''''||||||||||||", -"wwwwwwwwwwww============555555555555EEEEEEEEEEEEEEEEEEEEEEEE____________''''''''''''||||||||||||", -"wwwwwwwwwwww============555555555555EEEEEEEEEEEEEEEEEEEEEEEE____________''''''''''''||||||||||||", -"wwwwwwwwwwww============555555555555EEEEEEEEEEEEEEEEEEEEEEEE____________''''''''''''||||||||||||", -"wwwwwwwwwwww============555555555555EEEEEEEEEEEEEEEEEEEEEEEE____________''''''''''''||||||||||||", -"ffffffffffff>>>>>>>>>>>>rrrrrrrrrrrrnnnnnnnnnnnn~~~~~~~~~~~~____________]]]]]]]]]]]]{{{{{{{{{{{{", -"ffffffffffff>>>>>>>>>>>>rrrrrrrrrrrrnnnnnnnnnnnn~~~~~~~~~~~~____________]]]]]]]]]]]]{{{{{{{{{{{{", -"ffffffffffff>>>>>>>>>>>>rrrrrrrrrrrrnnnnnnnnnnnn~~~~~~~~~~~~____________]]]]]]]]]]]]{{{{{{{{{{{{", -"ffffffffffff>>>>>>>>>>>>rrrrrrrrrrrrnnnnnnnnnnnn~~~~~~~~~~~~____________]]]]]]]]]]]]{{{{{{{{{{{{", -"ffffffffffff>>>>>>>>>>>>rrrrrrrrrrrrnnnnnnnnnnnn~~~~~~~~~~~~____________]]]]]]]]]]]]{{{{{{{{{{{{", -"ffffffffffff>>>>>>>>>>>>rrrrrrrrrrrrnnnnnnnnnnnn~~~~~~~~~~~~____________]]]]]]]]]]]]{{{{{{{{{{{{", -"ffffffffffff>>>>>>>>>>>>rrrrrrrrrrrrnnnnnnnnnnnn~~~~~~~~~~~~____________]]]]]]]]]]]]{{{{{{{{{{{{", -"ffffffffffff>>>>>>>>>>>>rrrrrrrrrrrrnnnnnnnnnnnn~~~~~~~~~~~~____________]]]]]]]]]]]]{{{{{{{{{{{{", -"ffffffffffff>>>>>>>>>>>>rrrrrrrrrrrrnnnnnnnnnnnn~~~~~~~~~~~~____________]]]]]]]]]]]]{{{{{{{{{{{{", -"ffffffffffff>>>>>>>>>>>>rrrrrrrrrrrrnnnnnnnnnnnn~~~~~~~~~~~~____________]]]]]]]]]]]]{{{{{{{{{{{{", -"ffffffffffff>>>>>>>>>>>>rrrrrrrrrrrrnnnnnnnnnnnn~~~~~~~~~~~~____________]]]]]]]]]]]]{{{{{{{{{{{{", -"ffffffffffff>>>>>>>>>>>>rrrrrrrrrrrrnnnnnnnnnnnn~~~~~~~~~~~~____________]]]]]]]]]]]]{{{{{{{{{{{{", -"############$$$$$$$$$$$$CCCCCCCCCCCCEEEEEEEEEEEE(((((((((((())))))))))))''''''''''''}}}}}}}}}}}}", -"############$$$$$$$$$$$$CCCCCCCCCCCCEEEEEEEEEEEE(((((((((((())))))))))))''''''''''''}}}}}}}}}}}}", -"############$$$$$$$$$$$$CCCCCCCCCCCCEEEEEEEEEEEE(((((((((((())))))))))))''''''''''''}}}}}}}}}}}}", -"############$$$$$$$$$$$$CCCCCCCCCCCCEEEEEEEEEEEE(((((((((((())))))))))))''''''''''''}}}}}}}}}}}}", -"############$$$$$$$$$$$$CCCCCCCCCCCCEEEEEEEEEEEE(((((((((((())))))))))))''''''''''''}}}}}}}}}}}}", -"############$$$$$$$$$$$$CCCCCCCCCCCCEEEEEEEEEEEE(((((((((((())))))))))))''''''''''''}}}}}}}}}}}}", -"############$$$$$$$$$$$$CCCCCCCCCCCCEEEEEEEEEEEE(((((((((((())))))))))))''''''''''''}}}}}}}}}}}}", -"############$$$$$$$$$$$$CCCCCCCCCCCCEEEEEEEEEEEE(((((((((((())))))))))))''''''''''''}}}}}}}}}}}}", -"############$$$$$$$$$$$$CCCCCCCCCCCCEEEEEEEEEEEE(((((((((((())))))))))))''''''''''''}}}}}}}}}}}}", -"############$$$$$$$$$$$$CCCCCCCCCCCCEEEEEEEEEEEE(((((((((((())))))))))))''''''''''''}}}}}}}}}}}}", -"############$$$$$$$$$$$$CCCCCCCCCCCCEEEEEEEEEEEE(((((((((((())))))))))))''''''''''''}}}}}}}}}}}}", -"############$$$$$$$$$$$$CCCCCCCCCCCCEEEEEEEEEEEE(((((((((((())))))))))))''''''''''''}}}}}}}}}}}}", -",,,,,,,,,,,,666666666666ddddddddddddHHHHHHHHHHHHEEEEEEEEEEEE____________]]]]]]]]]]]]{{{{{{{{{{{{", -",,,,,,,,,,,,666666666666ddddddddddddHHHHHHHHHHHHEEEEEEEEEEEE____________]]]]]]]]]]]]{{{{{{{{{{{{", -",,,,,,,,,,,,666666666666ddddddddddddHHHHHHHHHHHHEEEEEEEEEEEE____________]]]]]]]]]]]]{{{{{{{{{{{{", -",,,,,,,,,,,,666666666666ddddddddddddHHHHHHHHHHHHEEEEEEEEEEEE____________]]]]]]]]]]]]{{{{{{{{{{{{", -",,,,,,,,,,,,666666666666ddddddddddddHHHHHHHHHHHHEEEEEEEEEEEE____________]]]]]]]]]]]]{{{{{{{{{{{{", -",,,,,,,,,,,,666666666666ddddddddddddHHHHHHHHHHHHEEEEEEEEEEEE____________]]]]]]]]]]]]{{{{{{{{{{{{", -",,,,,,,,,,,,666666666666ddddddddddddHHHHHHHHHHHHEEEEEEEEEEEE____________]]]]]]]]]]]]{{{{{{{{{{{{", -",,,,,,,,,,,,666666666666ddddddddddddHHHHHHHHHHHHEEEEEEEEEEEE____________]]]]]]]]]]]]{{{{{{{{{{{{", -",,,,,,,,,,,,666666666666ddddddddddddHHHHHHHHHHHHEEEEEEEEEEEE____________]]]]]]]]]]]]{{{{{{{{{{{{", -",,,,,,,,,,,,666666666666ddddddddddddHHHHHHHHHHHHEEEEEEEEEEEE____________]]]]]]]]]]]]{{{{{{{{{{{{", -",,,,,,,,,,,,666666666666ddddddddddddHHHHHHHHHHHHEEEEEEEEEEEE____________]]]]]]]]]]]]{{{{{{{{{{{{", -",,,,,,,,,,,,666666666666ddddddddddddHHHHHHHHHHHHEEEEEEEEEEEE____________]]]]]]]]]]]]{{{{{{{{{{{{", -"xxxxxxxxxxxxjjjjjjjjjjjjccccccccccccSSSSSSSSSSSSPPPPPPPPPPPP))))))))))))]]]]]]]]]]]]}}}}}}}}}}}}", -"xxxxxxxxxxxxjjjjjjjjjjjjccccccccccccSSSSSSSSSSSSPPPPPPPPPPPP))))))))))))]]]]]]]]]]]]}}}}}}}}}}}}", -"xxxxxxxxxxxxjjjjjjjjjjjjccccccccccccSSSSSSSSSSSSPPPPPPPPPPPP))))))))))))]]]]]]]]]]]]}}}}}}}}}}}}", -"xxxxxxxxxxxxjjjjjjjjjjjjccccccccccccSSSSSSSSSSSSPPPPPPPPPPPP))))))))))))]]]]]]]]]]]]}}}}}}}}}}}}", -"xxxxxxxxxxxxjjjjjjjjjjjjccccccccccccSSSSSSSSSSSSPPPPPPPPPPPP))))))))))))]]]]]]]]]]]]}}}}}}}}}}}}", -"xxxxxxxxxxxxjjjjjjjjjjjjccccccccccccSSSSSSSSSSSSPPPPPPPPPPPP))))))))))))]]]]]]]]]]]]}}}}}}}}}}}}", -"xxxxxxxxxxxxjjjjjjjjjjjjccccccccccccSSSSSSSSSSSSPPPPPPPPPPPP))))))))))))]]]]]]]]]]]]}}}}}}}}}}}}", -"xxxxxxxxxxxxjjjjjjjjjjjjccccccccccccSSSSSSSSSSSSPPPPPPPPPPPP))))))))))))]]]]]]]]]]]]}}}}}}}}}}}}", -"xxxxxxxxxxxxjjjjjjjjjjjjccccccccccccSSSSSSSSSSSSPPPPPPPPPPPP))))))))))))]]]]]]]]]]]]}}}}}}}}}}}}", -"xxxxxxxxxxxxjjjjjjjjjjjjccccccccccccSSSSSSSSSSSSPPPPPPPPPPPP))))))))))))]]]]]]]]]]]]}}}}}}}}}}}}", -"xxxxxxxxxxxxjjjjjjjjjjjjccccccccccccSSSSSSSSSSSSPPPPPPPPPPPP))))))))))))]]]]]]]]]]]]}}}}}}}}}}}}", -"xxxxxxxxxxxxjjjjjjjjjjjjccccccccccccSSSSSSSSSSSSPPPPPPPPPPPP))))))))))))]]]]]]]]]]]]}}}}}}}}}}}}", -"000000000000%%%%%%%%%%%%ttttttttttttmmmmmmmmmmmm////////////````````````''''''''''''{{{{{{{{{{{{", -"000000000000%%%%%%%%%%%%ttttttttttttmmmmmmmmmmmm////////////````````````''''''''''''{{{{{{{{{{{{", -"000000000000%%%%%%%%%%%%ttttttttttttmmmmmmmmmmmm////////////````````````''''''''''''{{{{{{{{{{{{", -"000000000000%%%%%%%%%%%%ttttttttttttmmmmmmmmmmmm////////////````````````''''''''''''{{{{{{{{{{{{", -"000000000000%%%%%%%%%%%%ttttttttttttmmmmmmmmmmmm////////////````````````''''''''''''{{{{{{{{{{{{", -"000000000000%%%%%%%%%%%%ttttttttttttmmmmmmmmmmmm////////////````````````''''''''''''{{{{{{{{{{{{", -"000000000000%%%%%%%%%%%%ttttttttttttmmmmmmmmmmmm////////////````````````''''''''''''{{{{{{{{{{{{", -"000000000000%%%%%%%%%%%%ttttttttttttmmmmmmmmmmmm////////////````````````''''''''''''{{{{{{{{{{{{", -"000000000000%%%%%%%%%%%%ttttttttttttmmmmmmmmmmmm////////////````````````''''''''''''{{{{{{{{{{{{", -"000000000000%%%%%%%%%%%%ttttttttttttmmmmmmmmmmmm////////////````````````''''''''''''{{{{{{{{{{{{", -"000000000000%%%%%%%%%%%%ttttttttttttmmmmmmmmmmmm////////////````````````''''''''''''{{{{{{{{{{{{", -"000000000000%%%%%%%%%%%%ttttttttttttmmmmmmmmmmmm////////////````````````''''''''''''{{{{{{{{{{{{", -">>>>>>>>>>>>uuuuuuuuuuuuZZZZZZZZZZZZmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''{{{{{{{{{{{{", -">>>>>>>>>>>>uuuuuuuuuuuuZZZZZZZZZZZZmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''{{{{{{{{{{{{", -">>>>>>>>>>>>uuuuuuuuuuuuZZZZZZZZZZZZmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''{{{{{{{{{{{{", -">>>>>>>>>>>>uuuuuuuuuuuuZZZZZZZZZZZZmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''{{{{{{{{{{{{", -">>>>>>>>>>>>uuuuuuuuuuuuZZZZZZZZZZZZmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''{{{{{{{{{{{{", -">>>>>>>>>>>>uuuuuuuuuuuuZZZZZZZZZZZZmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''{{{{{{{{{{{{", -">>>>>>>>>>>>uuuuuuuuuuuuZZZZZZZZZZZZmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''{{{{{{{{{{{{", -">>>>>>>>>>>>uuuuuuuuuuuuZZZZZZZZZZZZmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''{{{{{{{{{{{{", -">>>>>>>>>>>>uuuuuuuuuuuuZZZZZZZZZZZZmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''{{{{{{{{{{{{", -">>>>>>>>>>>>uuuuuuuuuuuuZZZZZZZZZZZZmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''{{{{{{{{{{{{", -">>>>>>>>>>>>uuuuuuuuuuuuZZZZZZZZZZZZmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''{{{{{{{{{{{{", -">>>>>>>>>>>>uuuuuuuuuuuuZZZZZZZZZZZZmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''{{{{{{{{{{{{", -"OOOOOOOOOOOO444444444444888888888888KKKKKKKKKKKKTTTTTTTTTTTT))))))))))))''''''''''''{{{{{{{{{{{{", -"OOOOOOOOOOOO444444444444888888888888KKKKKKKKKKKKTTTTTTTTTTTT))))))))))))''''''''''''{{{{{{{{{{{{", -"OOOOOOOOOOOO444444444444888888888888KKKKKKKKKKKKTTTTTTTTTTTT))))))))))))''''''''''''{{{{{{{{{{{{", -"OOOOOOOOOOOO444444444444888888888888KKKKKKKKKKKKTTTTTTTTTTTT))))))))))))''''''''''''{{{{{{{{{{{{", -"OOOOOOOOOOOO444444444444888888888888KKKKKKKKKKKKTTTTTTTTTTTT))))))))))))''''''''''''{{{{{{{{{{{{", -"OOOOOOOOOOOO444444444444888888888888KKKKKKKKKKKKTTTTTTTTTTTT))))))))))))''''''''''''{{{{{{{{{{{{", -"OOOOOOOOOOOO444444444444888888888888KKKKKKKKKKKKTTTTTTTTTTTT))))))))))))''''''''''''{{{{{{{{{{{{", -"OOOOOOOOOOOO444444444444888888888888KKKKKKKKKKKKTTTTTTTTTTTT))))))))))))''''''''''''{{{{{{{{{{{{", -"OOOOOOOOOOOO444444444444888888888888KKKKKKKKKKKKTTTTTTTTTTTT))))))))))))''''''''''''{{{{{{{{{{{{", -"OOOOOOOOOOOO444444444444888888888888KKKKKKKKKKKKTTTTTTTTTTTT))))))))))))''''''''''''{{{{{{{{{{{{", -"OOOOOOOOOOOO444444444444888888888888KKKKKKKKKKKKTTTTTTTTTTTT))))))))))))''''''''''''{{{{{{{{{{{{", -"OOOOOOOOOOOO444444444444888888888888KKKKKKKKKKKKTTTTTTTTTTTT))))))))))))''''''''''''{{{{{{{{{{{{", -"++++++++++++666666666666CCCCCCCCCCCCQQQQQQQQQQQQYYYYYYYYYYYY____________''''''''''''}}}}}}}}}}}}", -"++++++++++++666666666666CCCCCCCCCCCCQQQQQQQQQQQQYYYYYYYYYYYY____________''''''''''''}}}}}}}}}}}}", -"++++++++++++666666666666CCCCCCCCCCCCQQQQQQQQQQQQYYYYYYYYYYYY____________''''''''''''}}}}}}}}}}}}", -"++++++++++++666666666666CCCCCCCCCCCCQQQQQQQQQQQQYYYYYYYYYYYY____________''''''''''''}}}}}}}}}}}}", -"++++++++++++666666666666CCCCCCCCCCCCQQQQQQQQQQQQYYYYYYYYYYYY____________''''''''''''}}}}}}}}}}}}", -"++++++++++++666666666666CCCCCCCCCCCCQQQQQQQQQQQQYYYYYYYYYYYY____________''''''''''''}}}}}}}}}}}}", -"++++++++++++666666666666CCCCCCCCCCCCQQQQQQQQQQQQYYYYYYYYYYYY____________''''''''''''}}}}}}}}}}}}", -"++++++++++++666666666666CCCCCCCCCCCCQQQQQQQQQQQQYYYYYYYYYYYY____________''''''''''''}}}}}}}}}}}}", -"++++++++++++666666666666CCCCCCCCCCCCQQQQQQQQQQQQYYYYYYYYYYYY____________''''''''''''}}}}}}}}}}}}", -"++++++++++++666666666666CCCCCCCCCCCCQQQQQQQQQQQQYYYYYYYYYYYY____________''''''''''''}}}}}}}}}}}}", -"++++++++++++666666666666CCCCCCCCCCCCQQQQQQQQQQQQYYYYYYYYYYYY____________''''''''''''}}}}}}}}}}}}", -"++++++++++++666666666666CCCCCCCCCCCCQQQQQQQQQQQQYYYYYYYYYYYY____________''''''''''''}}}}}}}}}}}}", -"oooooooooooo,,,,,,,,,,,,DDDDDDDDDDDDmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''}}}}}}}}}}}}", -"oooooooooooo,,,,,,,,,,,,DDDDDDDDDDDDmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''}}}}}}}}}}}}", -"oooooooooooo,,,,,,,,,,,,DDDDDDDDDDDDmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''}}}}}}}}}}}}", -"oooooooooooo,,,,,,,,,,,,DDDDDDDDDDDDmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''}}}}}}}}}}}}", -"oooooooooooo,,,,,,,,,,,,DDDDDDDDDDDDmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''}}}}}}}}}}}}", -"oooooooooooo,,,,,,,,,,,,DDDDDDDDDDDDmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''}}}}}}}}}}}}", -"oooooooooooo,,,,,,,,,,,,DDDDDDDDDDDDmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''}}}}}}}}}}}}", -"oooooooooooo,,,,,,,,,,,,DDDDDDDDDDDDmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''}}}}}}}}}}}}", -"oooooooooooo,,,,,,,,,,,,DDDDDDDDDDDDmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''}}}}}}}}}}}}", -"oooooooooooo,,,,,,,,,,,,DDDDDDDDDDDDmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''}}}}}}}}}}}}", -"oooooooooooo,,,,,,,,,,,,DDDDDDDDDDDDmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''}}}}}}}}}}}}", -"oooooooooooo,,,,,,,,,,,,DDDDDDDDDDDDmmmmmmmmmmmmLLLLLLLLLLLL))))))))))))''''''''''''}}}}}}}}}}}}", -"::::::::::::eeeeeeeeeeee444444444444mmmmmmmmmmmm^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"::::::::::::eeeeeeeeeeee444444444444mmmmmmmmmmmm^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"::::::::::::eeeeeeeeeeee444444444444mmmmmmmmmmmm^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"::::::::::::eeeeeeeeeeee444444444444mmmmmmmmmmmm^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"::::::::::::eeeeeeeeeeee444444444444mmmmmmmmmmmm^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"::::::::::::eeeeeeeeeeee444444444444mmmmmmmmmmmm^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"::::::::::::eeeeeeeeeeee444444444444mmmmmmmmmmmm^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"::::::::::::eeeeeeeeeeee444444444444mmmmmmmmmmmm^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"::::::::::::eeeeeeeeeeee444444444444mmmmmmmmmmmm^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"::::::::::::eeeeeeeeeeee444444444444mmmmmmmmmmmm^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"::::::::::::eeeeeeeeeeee444444444444mmmmmmmmmmmm^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"::::::::::::eeeeeeeeeeee444444444444mmmmmmmmmmmm^^^^^^^^^^^^____________''''''''''''{{{{{{{{{{{{", -"............666666666666ZZZZZZZZZZZZbbbbbbbbbbbbPPPPPPPPPPPP````````````''''''''''''{{{{{{{{{{{{", -"............666666666666ZZZZZZZZZZZZbbbbbbbbbbbbPPPPPPPPPPPP````````````''''''''''''{{{{{{{{{{{{", -"............666666666666ZZZZZZZZZZZZbbbbbbbbbbbbPPPPPPPPPPPP````````````''''''''''''{{{{{{{{{{{{", -"............666666666666ZZZZZZZZZZZZbbbbbbbbbbbbPPPPPPPPPPPP````````````''''''''''''{{{{{{{{{{{{", -"............666666666666ZZZZZZZZZZZZbbbbbbbbbbbbPPPPPPPPPPPP````````````''''''''''''{{{{{{{{{{{{", -"............666666666666ZZZZZZZZZZZZbbbbbbbbbbbbPPPPPPPPPPPP````````````''''''''''''{{{{{{{{{{{{", -"............666666666666ZZZZZZZZZZZZbbbbbbbbbbbbPPPPPPPPPPPP````````````''''''''''''{{{{{{{{{{{{", -"............666666666666ZZZZZZZZZZZZbbbbbbbbbbbbPPPPPPPPPPPP````````````''''''''''''{{{{{{{{{{{{", -"............666666666666ZZZZZZZZZZZZbbbbbbbbbbbbPPPPPPPPPPPP````````````''''''''''''{{{{{{{{{{{{", -"............666666666666ZZZZZZZZZZZZbbbbbbbbbbbbPPPPPPPPPPPP````````````''''''''''''{{{{{{{{{{{{", -"............666666666666ZZZZZZZZZZZZbbbbbbbbbbbbPPPPPPPPPPPP````````````''''''''''''{{{{{{{{{{{{", -"............666666666666ZZZZZZZZZZZZbbbbbbbbbbbbPPPPPPPPPPPP````````````''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaaiiiiiiiiiiiizzzzzzzzzzzzJJJJJJJJJJJJPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaaiiiiiiiiiiiizzzzzzzzzzzzJJJJJJJJJJJJPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaaiiiiiiiiiiiizzzzzzzzzzzzJJJJJJJJJJJJPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaaiiiiiiiiiiiizzzzzzzzzzzzJJJJJJJJJJJJPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaaiiiiiiiiiiiizzzzzzzzzzzzJJJJJJJJJJJJPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaaiiiiiiiiiiiizzzzzzzzzzzzJJJJJJJJJJJJPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaaiiiiiiiiiiiizzzzzzzzzzzzJJJJJJJJJJJJPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaaiiiiiiiiiiiizzzzzzzzzzzzJJJJJJJJJJJJPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaaiiiiiiiiiiiizzzzzzzzzzzzJJJJJJJJJJJJPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaaiiiiiiiiiiiizzzzzzzzzzzzJJJJJJJJJJJJPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaaiiiiiiiiiiiizzzzzzzzzzzzJJJJJJJJJJJJPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"aaaaaaaaaaaaiiiiiiiiiiiizzzzzzzzzzzzJJJJJJJJJJJJPPPPPPPPPPPP))))))))))))''''''''''''{{{{{{{{{{{{", -"............eeeeeeeeeeee444444444444IIIIIIIIIIIIWWWWWWWWWWWW))))))))))))''''''''''''}}}}}}}}}}}}", -"............eeeeeeeeeeee444444444444IIIIIIIIIIIIWWWWWWWWWWWW))))))))))))''''''''''''}}}}}}}}}}}}", -"............eeeeeeeeeeee444444444444IIIIIIIIIIIIWWWWWWWWWWWW))))))))))))''''''''''''}}}}}}}}}}}}", -"............eeeeeeeeeeee444444444444IIIIIIIIIIIIWWWWWWWWWWWW))))))))))))''''''''''''}}}}}}}}}}}}", -"............eeeeeeeeeeee444444444444IIIIIIIIIIIIWWWWWWWWWWWW))))))))))))''''''''''''}}}}}}}}}}}}", -"............eeeeeeeeeeee444444444444IIIIIIIIIIIIWWWWWWWWWWWW))))))))))))''''''''''''}}}}}}}}}}}}", -"............eeeeeeeeeeee444444444444IIIIIIIIIIIIWWWWWWWWWWWW))))))))))))''''''''''''}}}}}}}}}}}}", -"............eeeeeeeeeeee444444444444IIIIIIIIIIIIWWWWWWWWWWWW))))))))))))''''''''''''}}}}}}}}}}}}", -"............eeeeeeeeeeee444444444444IIIIIIIIIIIIWWWWWWWWWWWW))))))))))))''''''''''''}}}}}}}}}}}}", -"............eeeeeeeeeeee444444444444IIIIIIIIIIIIWWWWWWWWWWWW))))))))))))''''''''''''}}}}}}}}}}}}", -"............eeeeeeeeeeee444444444444IIIIIIIIIIIIWWWWWWWWWWWW))))))))))))''''''''''''}}}}}}}}}}}}", -"............eeeeeeeeeeee444444444444IIIIIIIIIIIIWWWWWWWWWWWW))))))))))))''''''''''''}}}}}}}}}}}}", -"llllllllllll444444444444HHHHHHHHHHHHvvvvvvvvvvvv((((((((((((____________]]]]]]]]]]]]}}}}}}}}}}}}", -"llllllllllll444444444444HHHHHHHHHHHHvvvvvvvvvvvv((((((((((((____________]]]]]]]]]]]]}}}}}}}}}}}}", -"llllllllllll444444444444HHHHHHHHHHHHvvvvvvvvvvvv((((((((((((____________]]]]]]]]]]]]}}}}}}}}}}}}", -"llllllllllll444444444444HHHHHHHHHHHHvvvvvvvvvvvv((((((((((((____________]]]]]]]]]]]]}}}}}}}}}}}}", -"llllllllllll444444444444HHHHHHHHHHHHvvvvvvvvvvvv((((((((((((____________]]]]]]]]]]]]}}}}}}}}}}}}", -"llllllllllll444444444444HHHHHHHHHHHHvvvvvvvvvvvv((((((((((((____________]]]]]]]]]]]]}}}}}}}}}}}}", -"llllllllllll444444444444HHHHHHHHHHHHvvvvvvvvvvvv((((((((((((____________]]]]]]]]]]]]}}}}}}}}}}}}", -"llllllllllll444444444444HHHHHHHHHHHHvvvvvvvvvvvv((((((((((((____________]]]]]]]]]]]]}}}}}}}}}}}}", -"llllllllllll444444444444HHHHHHHHHHHHvvvvvvvvvvvv((((((((((((____________]]]]]]]]]]]]}}}}}}}}}}}}", -"llllllllllll444444444444HHHHHHHHHHHHvvvvvvvvvvvv((((((((((((____________]]]]]]]]]]]]}}}}}}}}}}}}", -"llllllllllll444444444444HHHHHHHHHHHHvvvvvvvvvvvv((((((((((((____________]]]]]]]]]]]]}}}}}}}}}}}}", -"llllllllllll444444444444HHHHHHHHHHHHvvvvvvvvvvvv((((((((((((____________]]]]]]]]]]]]}}}}}}}}}}}}", -"qqqqqqqqqqqq111111111111ssssssssssssGGGGGGGGGGGGQQQQQQQQQQQQ____________[[[[[[[[[[[[{{{{{{{{{{{{", -"qqqqqqqqqqqq111111111111ssssssssssssGGGGGGGGGGGGQQQQQQQQQQQQ____________[[[[[[[[[[[[{{{{{{{{{{{{", -"qqqqqqqqqqqq111111111111ssssssssssssGGGGGGGGGGGGQQQQQQQQQQQQ____________[[[[[[[[[[[[{{{{{{{{{{{{", -"qqqqqqqqqqqq111111111111ssssssssssssGGGGGGGGGGGGQQQQQQQQQQQQ____________[[[[[[[[[[[[{{{{{{{{{{{{", -"qqqqqqqqqqqq111111111111ssssssssssssGGGGGGGGGGGGQQQQQQQQQQQQ____________[[[[[[[[[[[[{{{{{{{{{{{{", -"qqqqqqqqqqqq111111111111ssssssssssssGGGGGGGGGGGGQQQQQQQQQQQQ____________[[[[[[[[[[[[{{{{{{{{{{{{", -"qqqqqqqqqqqq111111111111ssssssssssssGGGGGGGGGGGGQQQQQQQQQQQQ____________[[[[[[[[[[[[{{{{{{{{{{{{", -"qqqqqqqqqqqq111111111111ssssssssssssGGGGGGGGGGGGQQQQQQQQQQQQ____________[[[[[[[[[[[[{{{{{{{{{{{{", -"qqqqqqqqqqqq111111111111ssssssssssssGGGGGGGGGGGGQQQQQQQQQQQQ____________[[[[[[[[[[[[{{{{{{{{{{{{", -"qqqqqqqqqqqq111111111111ssssssssssssGGGGGGGGGGGGQQQQQQQQQQQQ____________[[[[[[[[[[[[{{{{{{{{{{{{", -"qqqqqqqqqqqq111111111111ssssssssssssGGGGGGGGGGGGQQQQQQQQQQQQ____________[[[[[[[[[[[[{{{{{{{{{{{{", -"qqqqqqqqqqqq111111111111ssssssssssssGGGGGGGGGGGGQQQQQQQQQQQQ____________[[[[[[[[[[[[{{{{{{{{{{{{", -"ppppppppppppkkkkkkkkkkkkttttttttttttSSSSSSSSSSSS!!!!!!!!!!!!))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"ppppppppppppkkkkkkkkkkkkttttttttttttSSSSSSSSSSSS!!!!!!!!!!!!))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"ppppppppppppkkkkkkkkkkkkttttttttttttSSSSSSSSSSSS!!!!!!!!!!!!))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"ppppppppppppkkkkkkkkkkkkttttttttttttSSSSSSSSSSSS!!!!!!!!!!!!))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"ppppppppppppkkkkkkkkkkkkttttttttttttSSSSSSSSSSSS!!!!!!!!!!!!))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"ppppppppppppkkkkkkkkkkkkttttttttttttSSSSSSSSSSSS!!!!!!!!!!!!))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"ppppppppppppkkkkkkkkkkkkttttttttttttSSSSSSSSSSSS!!!!!!!!!!!!))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"ppppppppppppkkkkkkkkkkkkttttttttttttSSSSSSSSSSSS!!!!!!!!!!!!))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"ppppppppppppkkkkkkkkkkkkttttttttttttSSSSSSSSSSSS!!!!!!!!!!!!))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"ppppppppppppkkkkkkkkkkkkttttttttttttSSSSSSSSSSSS!!!!!!!!!!!!))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"ppppppppppppkkkkkkkkkkkkttttttttttttSSSSSSSSSSSS!!!!!!!!!!!!))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"ppppppppppppkkkkkkkkkkkkttttttttttttSSSSSSSSSSSS!!!!!!!!!!!!))))))))))))]]]]]]]]]]]]{{{{{{{{{{{{", -"ppppppppppppzzzzzzzzzzzzddddddddddddFFFFFFFFFFFFLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"ppppppppppppzzzzzzzzzzzzddddddddddddFFFFFFFFFFFFLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"ppppppppppppzzzzzzzzzzzzddddddddddddFFFFFFFFFFFFLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"ppppppppppppzzzzzzzzzzzzddddddddddddFFFFFFFFFFFFLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"ppppppppppppzzzzzzzzzzzzddddddddddddFFFFFFFFFFFFLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"ppppppppppppzzzzzzzzzzzzddddddddddddFFFFFFFFFFFFLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"ppppppppppppzzzzzzzzzzzzddddddddddddFFFFFFFFFFFFLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"ppppppppppppzzzzzzzzzzzzddddddddddddFFFFFFFFFFFFLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"ppppppppppppzzzzzzzzzzzzddddddddddddFFFFFFFFFFFFLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"ppppppppppppzzzzzzzzzzzzddddddddddddFFFFFFFFFFFFLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"ppppppppppppzzzzzzzzzzzzddddddddddddFFFFFFFFFFFFLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"ppppppppppppzzzzzzzzzzzzddddddddddddFFFFFFFFFFFFLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"666666666666************777777777777MMMMMMMMMMMMLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"666666666666************777777777777MMMMMMMMMMMMLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"666666666666************777777777777MMMMMMMMMMMMLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"666666666666************777777777777MMMMMMMMMMMMLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"666666666666************777777777777MMMMMMMMMMMMLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"666666666666************777777777777MMMMMMMMMMMMLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"666666666666************777777777777MMMMMMMMMMMMLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"666666666666************777777777777MMMMMMMMMMMMLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"666666666666************777777777777MMMMMMMMMMMMLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"666666666666************777777777777MMMMMMMMMMMMLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"666666666666************777777777777MMMMMMMMMMMMLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{", -"666666666666************777777777777MMMMMMMMMMMMLLLLLLLLLLLL````````````''''''''''''{{{{{{{{{{{{" -}; diff --git a/src/xpm/addressbook16.xpm b/src/xpm/addressbook16.xpm deleted file mode 100644 index e00944ef7..000000000 --- a/src/xpm/addressbook16.xpm +++ /dev/null @@ -1,278 +0,0 @@ -/* XPM */ -static const char * addressbook16_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 16 256 2", -" c #FFFFFF", -". c #F7FFFF", -"X c #F7F7FF", -"o c #EFF7FF", -"O c #E6EFF7", -"+ c #E6E6F7", -"@ c #CEE6F7", -"# c #DEDEEF", -"$ c #D6DEEF", -"% c #D6DEE6", -"& c #CEDEF7", -"* c #CEDEEF", -"= c #EFF708", -"- c #C5DEF7", -"; c #CED6EF", -": c None", -"> c #C5D6E6", -", c #BDD6F7", -"< c #BDD6EF", -"1 c #D6CECE", -"2 c #BDCEE6", -"3 c #BDC5E6", -"4 c #B5C5DE", -"5 c #BDD631", -"6 c #ADBDDE", -"7 c #B5B5BD", -"8 c #A5B5D6", -"9 c #00FFFF", -"0 c #9CB5CE", -"q c #9CADD6", -"w c #94A5D6", -"e c #8CA5D6", -"r c #8CA5CE", -"t c #8CA5C5", -"y c #849CC5", -"u c #7B9CD6", -"i c #7B9CCE", -"p c #31BDCE", -"a c #6B9CD6", -"s c #00F708", -"d c #8494AD", -"f c #7B94B5", -"g c #6B94D6", -"h c #6B9C84", -"j c #7B8CAD", -"k c #738CAD", -"l c #638CC5", -"z c #10CE42", -"x c #638CBD", -"c c #7B849C", -"v c #73849C", -"b c #6B84A5", -"n c #7B7BA5", -"m c #6B849C", -"M c #7B8C42", -"N c #5A84C5", -"B c #29AD6B", -"V c #F74A4A", -"C c #6384A5", -"Z c #5284C5", -"A c #637BA5", -"S c #637B9C", -"D c #9C637B", -"F c #6B7B5A", -"G c #637394", -"H c #52739C", -"J c #5A7384", -"K c #526B94", -"L c #426B94", -"P c #52638C", -"I c #426B7B", -"U c #5A5A8C", -"Y c #524A7B", -"T c #425273", -"R c #21636B", -"E c #106394", -"W c #106B52", -"Q c #3A4273", -"! c #31426B", -"~ c #523163", -"^ c #29426B", -"/ c #293A63", -"( c #213A63", -") c #193A63", -"_ c #193163", -"` c #19315A", -"' c #212963", -"] c #10315A", -"[ c #082952", -"{ c #FFCC33", -"} c #33FF33", -"| c #66FF33", -" . c #99FF33", -".. c #CCFF33", -"X. c #FFFF33", -"o. c #000066", -"O. c #330066", -"+. c #660066", -"@. c #990066", -"#. c #CC0066", -"$. c #FF0066", -"%. c #003366", -"&. c #333366", -"*. c #663366", -"=. c #993366", -"-. c #CC3366", -";. c #FF3366", -":. c #006666", -">. c #336666", -",. c #666666", -"<. c #996666", -"1. c #CC6666", -"2. c #009966", -"3. c #339966", -"4. c #669966", -"5. c #999966", -"6. c #CC9966", -"7. c #FF9966", -"8. c #00CC66", -"9. c #33CC66", -"0. c #99CC66", -"q. c #CCCC66", -"w. c #FFCC66", -"e. c #00FF66", -"r. c #33FF66", -"t. c #99FF66", -"y. c #CCFF66", -"u. c #FF00CC", -"i. c #CC00FF", -"p. c #009999", -"a. c #993399", -"s. c #990099", -"d. c #CC0099", -"f. c #000099", -"g. c #333399", -"h. c #660099", -"j. c #CC3399", -"k. c #FF0099", -"l. c #006699", -"z. c #336699", -"x. c #663399", -"c. c #996699", -"v. c #CC6699", -"b. c #FF3399", -"n. c #339999", -"m. c #669999", -"M. c #999999", -"N. c #CC9999", -"B. c #FF9999", -"V. c #00CC99", -"C. c #33CC99", -"Z. c #66CC66", -"A. c #99CC99", -"S. c #CCCC99", -"D. c #FFCC99", -"F. c #00FF99", -"G. c #33FF99", -"H. c #66CC99", -"J. c #99FF99", -"K. c #CCFF99", -"L. c #FFFF99", -"P. c #0000CC", -"I. c #330099", -"U. c #6600CC", -"Y. c #9900CC", -"T. c #CC00CC", -"R. c #003399", -"E. c #3333CC", -"W. c #6633CC", -"Q. c #9933CC", -"!. c #CC33CC", -"~. c #FF33CC", -"^. c #0066CC", -"/. c #3366CC", -"(. c #666699", -"). c #9966CC", -"_. c #CC66CC", -"`. c #FF6699", -"'. c #0099CC", -"]. c #3399CC", -"[. c #6699CC", -"{. c #9999CC", -"}. c #CC99CC", -"|. c #FF99CC", -" X c #00CCCC", -".X c #33CCCC", -"XX c #66CCCC", -"oX c #99CCCC", -"OX c #CCCCCC", -"+X c #FFCCCC", -"@X c #00FFCC", -"#X c #33FFCC", -"$X c #66FF99", -"%X c #99FFCC", -"&X c #CCFFCC", -"*X c #FFFFCC", -"=X c #3300CC", -"-X c #6600FF", -";X c #9900FF", -":X c #0033CC", -">X c #3333FF", -",X c #6633FF", -" g , S z R : ", -"n * c * r r y g , 6 r q S s W : ", -"n * c X 4 N u + m B I : ", -"n * c X ; a - S 5 F : ", -"n * c * r r r g - S = M : ", -"n * c X 4 N - m h J : ", -"n * c X ; a - A 9 E : ", -"n * ( ] ` ^ P l y T / / ( p L : ", -"n O > 0 f ) ! t 8 % n : ", -"U U U U U U U ' Q U U U U U U : ", -": : : : : : : : : : : : : : : : " -}; diff --git a/src/xpm/addressbook20.xpm b/src/xpm/addressbook20.xpm deleted file mode 100644 index 7ebd73fb2..000000000 --- a/src/xpm/addressbook20.xpm +++ /dev/null @@ -1,282 +0,0 @@ -/* XPM */ -static const char * addressbook20_xpm[] = { -/* columns rows colors chars-per-pixel */ -"20 20 256 2", -" c #FFFFFF", -". c #F7FFFF", -"X c #F7F7FF", -"o c #EFF7FF", -"O c #EFF7F7", -"+ c #E6EFFF", -"@ c #E6EFF7", -"# c #DEEFFF", -"$ c #DEE6F7", -"% c #DEE6EF", -"& c #D6E6F7", -"* c #FFFF00", -"= c #DEDEE6", -"- c #D6DEE6", -"; c #D6D6DE", -": c #CED6E6", -"> c None", -", c #C5D6E6", -"< c #C5CEE6", -"1 c #B5CEEF", -"2 c #C5C5C5", -"3 c #C5DE31", -"4 c #B5C5DE", -"5 c #BDC5C5", -"6 c #ADC5EF", -"7 c #B5C5CE", -"8 c #BDBDBD", -"9 c #B5BDCE", -"0 c #ADBDDE", -"q c #ADBDD6", -"w c #B5CE52", -"e c #ADB5C5", -"r c #00FFFF", -"t c #A5B5C5", -"y c #9CB5CE", -"u c #94B5DE", -"i c #9CADD6", -"p c #A5ADB5", -"a c #94ADDE", -"s c #94ADD6", -"d c #9CADBD", -"f c #8CADDE", -"g c #BD9CA5", -"h c #9CA5BD", -"j c #9CA5B5", -"k c #29D6E6", -"l c #8CA5CE", -"z c #849CCE", -"x c #6BA5C5", -"c c #739CDE", -"v c #00FF00", -"b c #739CD6", -"n c #7B94CE", -"m c #8494AD", -"M c #7394CE", -"N c #7B94B5", -"B c #4AB584", -"V c #848CB5", -"C c #6B94CE", -"Z c #6394D6", -"A c #6394CE", -"S c #7B8CAD", -"D c #6B8CC5", -"F c #738CAD", -"G c #5294B5", -"H c #6B84C5", -"J c #7384A5", -"K c #73849C", -"L c #738494", -"P c #FF4A4A", -"I c #FF4A42", -"U c #737B8C", -"Y c #637BAD", -"T c #527BBD", -"R c #637394", -"E c #637352", -"W c #5A6B8C", -"Q c #526B9C", -"! c #63638C", -"~ c #5A734A", -"^ c #4A6B9C", -"/ c #526B63", -"( c #0884A5", -") c #526384", -"_ c #52637B", -"` c #4A6B5A", -"' c #52636B", -"] c #525A8C", -"[ c #525A7B", -"{ c #426363", -"} c #4A5A7B", -"| c #425A8C", -" . c #196B94", -".. c #3A5A8C", -"X. c #3A5A84", -"o. c #087B4A", -"O. c #21636B", -"+. c #634263", -"@. c #3A527B", -"#. c #424A84", -"$. c #315284", -"%. c #295284", -"&. c #3A4A6B", -"*. c #42427B", -"=. c #424273", -"-. c #294A84", -";. c #3A3A73", -":. c #194284", -">. c #104A63", -",. c #213A6B", -"<. c #31316B", -"1. c #21315A", -"2. c #212163", -"3. c #08295A", -"4. c #082152", -"5. c #101952", -"6. c #CC9966", -"7. c #FF9966", -"8. c #00CC66", -"9. c #33CC66", -"0. c #99CC66", -"q. c #CCCC66", -"w. c #FFCC66", -"e. c #00FF66", -"r. c #33FF66", -"t. c #99FF66", -"y. c #CCFF66", -"u. c #FF00CC", -"i. c #CC00FF", -"p. c #009999", -"a. c #993399", -"s. c #990099", -"d. c #CC0099", -"f. c #000099", -"g. c #333399", -"h. c #660099", -"j. c #CC3399", -"k. c #FF0099", -"l. c #006699", -"z. c #336699", -"x. c #663399", -"c. c #996699", -"v. c #CC6699", -"b. c #FF3399", -"n. c #339999", -"m. c #669999", -"M. c #999999", -"N. c #CC9999", -"B. c #FF9999", -"V. c #00CC99", -"C. c #33CC99", -"Z. c #66CC66", -"A. c #99CC99", -"S. c #CCCC99", -"D. c #FFCC99", -"F. c #00FF99", -"G. c #33FF99", -"H. c #66CC99", -"J. c #99FF99", -"K. c #CCFF99", -"L. c #FFFF99", -"P. c #0000CC", -"I. c #330099", -"U. c #6600CC", -"Y. c #9900CC", -"T. c #CC00CC", -"R. c #003399", -"E. c #3333CC", -"W. c #6633CC", -"Q. c #9933CC", -"!. c #CC33CC", -"~. c #FF33CC", -"^. c #0066CC", -"/. c #3366CC", -"(. c #666699", -"). c #9966CC", -"_. c #CC66CC", -"`. c #FF6699", -"'. c #0099CC", -"]. c #3399CC", -"[. c #6699CC", -"{. c #9999CC", -"}. c #CC99CC", -"|. c #FF99CC", -" X c #00CCCC", -".X c #33CCCC", -"XX c #66CCCC", -"oX c #99CCCC", -"OX c #CCCCCC", -"+X c #FFCCCC", -"@X c #00FFCC", -"#X c #33FFCC", -"$X c #66FF99", -"%X c #99FFCC", -"&X c #CCFFCC", -"*X c #FFFFCC", -"=X c #3300CC", -"-X c #6600FF", -";X c #9900FF", -":X c #0033CC", -">X c #3333FF", -",X c #6633FF", -" > > > > > > > > > > > > > > > > > > > ", -"> > > > > > > > > > > > > > > > > > > > ", -"> > U $.| | ^ S 2 > p W | | @.L > > > > ", -"8 5 R - < Y j S O - ) g e > > ", -"! V K - % a Q # - +.P <.> > ", -"! & K - 0 z n D C b f n n z q +.P <.> > ", -"! & K - % M A 1 - %.G #.> > ", -"! & K - % u b # - o.v >.> > ", -"! & K - 0 z n H M b 6 z n z q o.v >.> > ", -"! & K - X - M A a - O.B @.> > ", -"! & K - X % u b # - ` 3 / > > ", -"! & K - 0 l i 4 u b # - ~ * E > > ", -"! & K - X o $ s T b # - { w ' > > ", -"! & K - % f b # - .k -.> > ", -"! & K m d t 7 , u b # ; 9 9 h ( r :.> > ", -"! & h _ _ [ &.4.$.A ,.1.} _ _ F x ] > > ", -"! @ , y N _ 3._ N y , @ ! > > ", -"*.*.*.*.*.*.*.*.;.5.*.*.*.*.*.*.*.2.> > ", -"> > > > > > > > > > > > > > > > > > > > ", -"> > > > > > > > > > > > > > > > > > > > " -}; diff --git a/src/xpm/bitcoin16.xpm b/src/xpm/bitcoin16.xpm deleted file mode 100644 index f70fef026..000000000 --- a/src/xpm/bitcoin16.xpm +++ /dev/null @@ -1,219 +0,0 @@ -/* XPM */ -static const char * bitcoin16_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 16 197 2", -" c #755507", -". c #775606", -"X c #795707", -"o c #7D5A07", -"O c #765608", -"+ c #74550A", -"@ c #75550A", -"# c #75560A", -"$ c #785708", -"% c #78580B", -"& c #7D5C0B", -"* c #78590E", -"= c #7E5F14", -"- c #8A6711", -"; c #8D6B15", -": c #8A691A", -"> c #93711C", -", c #9D7A23", -"< c #9F7B22", -"1 c #9C7B2A", -"2 c #9E7C28", -"3 c #A37F26", -"4 c #B4831B", -"5 c #A68126", -"6 c #A5852E", -"7 c #A9872E", -"8 c #AC862D", -"9 c #AC872F", -"0 c #AF8B30", -"q c #AC8932", -"w c #AF8A34", -"e c #B08E36", -"r c #B98F33", -"t c #B18E3A", -"y c #B39036", -"u c #B69237", -"i c #B3913B", -"p c #B6923C", -"a c #BD9338", -"s c #B9993F", -"d c #BA993F", -"f c #C2932D", -"g c #C09437", -"h c #C59832", -"j c #C39836", -"k c #C89835", -"l c #C59C3D", -"z c #CF9E3E", -"x c #CFA23F", -"c c #D0A13A", -"v c #D3A23A", -"b c #D4A338", -"n c #D6A33F", -"m c #B19345", -"M c #BF9940", -"N c #BF9D43", -"B c #B3954B", -"V c #BD9A48", -"C c #BC9C4B", -"Z c #BD9F51", -"A c #CAA244", -"S c #C2A14B", -"D c #C4A44B", -"F c #C1A24C", -"G c #C7A64C", -"H c #C5A64E", -"J c #C9A94F", -"K c #D1A343", -"L c #D7A644", -"P c #D5A547", -"I c #D6A547", -"U c #DCAD42", -"Y c #DDAB45", -"T c #C3A151", -"R c #C9A551", -"E c #CAAA50", -"W c #CBAD53", -"Q c #CDAC52", -"! c #CEA855", -"~ c #CEB15A", -"^ c #DEB154", -"/ c #D1B35A", -"( c #D7B35A", -") c #D8B45D", -"_ c #E3B34A", -"` c #E2B34E", -"' c #E6B54F", -"] c #E2B350", -"[ c #E3B352", -"{ c #E4B451", -"} c #E2B355", -"| c #E7B853", -" . c #E9BC51", -".. c #ECBC53", -"X. c #E7BE5A", -"o. c #E2BA5C", -"O. c #E2BC5C", -"+. c #E9BB59", -"@. c #EBBE59", -"#. c #EABD5B", -"$. c #E8BF5C", -"%. c #E9BE5E", -"&. c #C8AC63", -"*. c #D0B162", -"=. c #D5B567", -"-. c #DABC62", -";. c #D2B66B", -":. c #D0B56D", -">. c #DCBC6E", -",. c #D2B972", -"<. c #D7BE78", -"1. c #E9BE62", -"2. c #EEC05A", -"3. c #F0C25F", -"4. c #DEC26B", -"5. c #DDC27A", -"6. c #E0C167", -"7. c #E5C067", -"8. c #EBC463", -"9. c #EEC460", -"0. c #ECC364", -"q. c #E4C16B", -"w. c #E7C46B", -"e. c #E9C56C", -"r. c #E0C172", -"t. c #E5C575", -"y. c #E4C870", -"u. c #E6CA72", -"i. c #E6CA74", -"p. c #E8CB73", -"a. c #E9CE76", -"s. c #EBD07B", -"d. c #EED179", -"f. c #F5D478", -"g. c #F5D57C", -"h. c #F4D67C", -"j. c #F4D77E", -"k. c #DEC781", -"l. c #E0C883", -"z. c #E3CA89", -"x. c #E4CB8B", -"c. c #E3CD8A", -"v. c #E5CE8B", -"b. c #E3CC8E", -"n. c #E8D18D", -"m. c #F6D980", -"M. c #F7DB83", -"N. c #F3DA86", -"B. c #F7DA84", -"V. c #F6DB84", -"C. c #F7DB84", -"Z. c #F7DA86", -"A. c #F6DC85", -"S. c #F7DC85", -"D. c #F8DB85", -"F. c #FADD85", -"G. c #FBDE86", -"H. c #F5DE8B", -"J. c #FADD88", -"K. c #F9DF8B", -"L. c #E4CF93", -"P. c #E6CF92", -"I. c #E6D094", -"U. c #EAD597", -"Y. c #EBD698", -"T. c #EFDA99", -"R. c #F0DC9C", -"E. c #FCE089", -"W. c #FCE28B", -"Q. c #FDE28B", -"!. c #FCE38C", -"~. c #FCE28D", -"^. c #FCE38D", -"/. c #FDE38D", -"(. c #FEE38D", -"). c #FDE38E", -"_. c #FEE48D", -"`. c #FEE58F", -"'. c #FCE490", -"]. c #FDE490", -"[. c #FFE590", -"{. c #FFE690", -"}. c #FFE691", -"|. c #FEE791", -" X c #FFE692", -".X c #FFE792", -"XX c #FEE693", -"oX c #FFE693", -"OX c #FFE793", -"+X c #FEE897", -"@X c #F6E2A2", -"#X c #F7E3A2", -"$X c #FAE6A8", -"%X c #FBE7A9", -"&X c #FCE9AB", -"*X c #FDEAAC", -"=X c None", -/* pixels */ -"=X=X=X=X=X0 S G D i =X=X=X=X=X=X", -"=X=X=X9 6.).).).).).d.e =X=X=X=X", -"=X=Xu C.J.O.( h ( o.D.).J & =X=X", -"=X0 S.j.f 4 b.e P.K @.j.'.d % =X", -"=X4.).k a T Y.&.Y.R 2.2.F.S.- =X", -"e '.e.z ! v.&X,.k.*X:. .%.`.d # ", -"H +X^ I P =.*X9 j T.k.U ' F.-.% ", -"W '.` { } >.*X<.n.*XC b Y g.u.X ", -"W |.` { 3.t.&Xm C c.%Xa n m.u.. ", -"N '.9...@.r.&Xi A 5.*XM L W.~ . ", -"5 m.f._ *.#X&XR.#X%X:.v 0.'.7 # ", -"=XQ `.@.l t P.B I.u v { G.a.o =X", -"=X3 u.W.0.A z.V b.+.1.J.E., # =X", -"=X=X3 u.oXF.e.7.q.C.+XH.6 # =X=X", -"=X=X=X=XS s.'.'.'.C.~ ; * =X=X=X", -"=X=X=X=X=X=X1 1 > : = =X=X=X=X=X" -}; diff --git a/src/xpm/bitcoin20.xpm b/src/xpm/bitcoin20.xpm deleted file mode 100644 index 3cc29ac14..000000000 --- a/src/xpm/bitcoin20.xpm +++ /dev/null @@ -1,160 +0,0 @@ -/* XPM */ -static const char * bitcoin20_xpm[] = { -/* columns rows colors chars-per-pixel */ -"20 20 134 2", -" c #735305", -". c #785706", -"X c #7E5C07", -"o c #755509", -"O c #76580D", -"+ c #7F6015", -"@ c #85620D", -"# c #89650D", -"$ c #836215", -"% c #886510", -"& c #8E6B11", -"* c #81641F", -"= c #906D19", -"- c #977116", -"; c #96741E", -": c #9B761E", -"> c #947424", -", c #9B7722", -"< c #9D7824", -"1 c #A47F23", -"2 c #A17D2A", -"3 c #A58125", -"4 c #AA8327", -"5 c #A4832F", -"6 c #AD862B", -"7 c #B28B2E", -"8 c #A58433", -"9 c #A88637", -"0 c #AD8932", -"q c #A78639", -"w c #A8893C", -"e c #B28C34", -"r c #B88E33", -"t c #B28E3A", -"y c #B79136", -"u c #BB9235", -"i c #BB9639", -"p c #C19836", -"a c #C29539", -"s c #C59C3C", -"d c #A88B41", -"f c #AF9045", -"g c #B49342", -"h c #BE9641", -"j c #BD9B44", -"k c #B29448", -"l c #B7994B", -"z c #B8994C", -"x c #C09946", -"c c #CB9E46", -"v c #C59D4C", -"b c #CFA246", -"n c #CBAB47", -"m c #CEA74A", -"M c #D4A749", -"N c #D6A94D", -"B c #C7A754", -"V c #CEA453", -"C c #C6AA56", -"Z c #CDA955", -"A c #CBAB5B", -"S c #D2AB54", -"D c #D2AE5E", -"F c #D9AE5A", -"G c #D7B356", -"H c #DDB35F", -"J c #DFB95A", -"K c #E1B554", -"L c #E4BA56", -"P c #E6BC5A", -"I c #E9BE5E", -"U c #C7AC64", -"Y c #CBAF64", -"T c #CDB166", -"R c #D4B364", -"E c #DBB463", -"W c #DFB867", -"Q c #D5B76B", -"! c #DFBA6F", -"~ c #D5BB76", -"^ c #D7BE79", -"/ c #E3BC64", -"( c #E8BF64", -") c #E0BB68", -"_ c #DECA7A", -"` c #EBC265", -"' c #EBC36B", -"] c #EFC96B", -"[ c #F1C564", -"{ c #F3CB6A", -"} c #F9CD6C", -"| c #FAD16C", -" . c #E5C770", -".. c #EEC774", -"X. c #E6CE7E", -"o. c #EFCE7A", -"O. c #F1CB73", -"+. c #F4CE7A", -"@. c #F3D273", -"#. c #FCD574", -"$. c #FEDA76", -"%. c #F5D47D", -"&. c #FAD47B", -"*. c #F2D97D", -"=. c #FCDA7A", -"-. c #DDC784", -";. c #E1CA86", -":. c #E4CE8B", -">. c #ECD985", -",. c #E7D18E", -"<. c #F4DC84", -"1. c #FCDC81", -"2. c #F4DB8B", -"3. c #FBDF8B", -"4. c #EBD592", -"5. c #EFDA99", -"6. c #F1DD9C", -"7. c #F6E081", -"8. c #FDE484", -"9. c #FFEA87", -"0. c #F9E488", -"q. c #FEE88D", -"w. c #F9E394", -"e. c #FFEB93", -"r. c #FEE698", -"t. c #FEEA9B", -"y. c #FFF49A", -"u. c #F7E4A4", -"i. c #F9E5A5", -"p. c #FCE9AA", -"a. c #F7F0AA", -"s. c #FEF1AE", -"d. c #FEF6B3", -"f. c None", -/* pixels */ -"f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.", -"f.f.f.f.f.f.f.0 y i i 0 , f.f.f.f.f.f.f.", -"f.f.f.f.3 p P | $.| } { I p ; f.f.f.f.f.", -"f.f.f.4 L | $.{ L K L ` =.#.` 3 $ f.f.f.", -"f.f.6 [ $.{ M a Q 0 Q S ' %.q.*.6 o f.f.", -"f.3 ' $.P i u r ,.< :.S +.%.0.y.*.& f.f.", -"f.C e.%.c x T Y 6.U 5.T R @.#.0.9.n . f.", -"f.>.t.W F A ^ p.u.~ -.p.i.C { { =.@.# f.", -"e e.3.E H / j p.6.0 V ~ p.Y ( ` #.$.3 o ", -"j p.2.( ( ! Z p.6.l R 6.6.t I I { #.y o ", -"j e.1.( ! +.H i.i.-.:.i.u.R N K ` #.u ", -"i 9.&.( ..1.) p.6.8 j w p.p.h N ' #.7 ", -"4 =.7.` ....Z p.6.g D T p.i.t M [ } - o ", -"f.J =.{ ` E i.p.p.i.p.p.6.k u M } K @ o ", -"f.7 @.@./ S z f 4.d ,.q 2 r a ( { 6 f.", -"f.f.m @.O.( / V 4.q :.v V V O.&.G X O f.", -"f.f.: G 1.0.+.W R D R ! 4.d.d._ # f.f.", -"f.f.f.2 C a.i.r.w.w.i.s.d.p.Y @ f.f.f.", -"f.f.f.f.f.5 Z .<.3.2.X.A > . f.f.f.f.", -"f.f.f.f.f.f.f.> > = # $ + f.f.f.f.f.f.f." -}; diff --git a/src/xpm/bitcoin32.xpm b/src/xpm/bitcoin32.xpm deleted file mode 100644 index f538a44d2..000000000 --- a/src/xpm/bitcoin32.xpm +++ /dev/null @@ -1,232 +0,0 @@ -/* XPM */ -static const char * bitcoin32_xpm[] = { -/* columns rows colors chars-per-pixel */ -"32 32 194 2", -" c #745305", -". c #785704", -"X c #7C5903", -"o c #75560B", -"O c #77590F", -"+ c #7C5C0B", -"@ c #795B12", -"# c #7F631D", -"$ c #825E07", -"% c #825F0B", -"& c #85610A", -"* c #8C660C", -"= c #8E680E", -"- c #916B0F", -"; c #856515", -": c #8B6714", -"> c #8F6A16", -", c #816218", -"< c #88691C", -"1 c #926D12", -"2 c #936F1C", -"3 c #997417", -"4 c #94721E", -"5 c #9B761C", -"6 c #9F781C", -"7 c #A17B1E", -"8 c #826622", -"9 c #916E20", -"0 c #967425", -"q c #9D7420", -"w c #9C7923", -"e c #997728", -"r c #99792C", -"t c #A37D23", -"y c #A37F2C", -"u c #A68125", -"i c #AB8225", -"p c #A5832B", -"a c #AA852C", -"s c #B28A2C", -"d c #A58233", -"f c #AC8734", -"g c #AE8C33", -"h c #AC8C3C", -"j c #B28C33", -"k c #B98E34", -"l c #B28D3D", -"z c #B59136", -"x c #BC9335", -"c c #B3913E", -"v c #BC933A", -"b c #BF9A3D", -"n c #C19235", -"m c #C2953C", -"M c #C39B3C", -"N c #CA9C3D", -"B c #B59343", -"V c #BE9642", -"C c #B69A44", -"Z c #BD9A45", -"A c #B49649", -"S c #BB9A49", -"D c #BB9F52", -"F c #BFA256", -"G c #C49C43", -"H c #CA9D41", -"J c #C59D4A", -"K c #C99E4D", -"L c #C3A144", -"P c #CDA244", -"I c #CFAA47", -"U c #C3A14D", -"Y c #CDA24A", -"T c #CCAB49", -"R c #D2A644", -"E c #D2A54B", -"W c #D6AA4C", -"Q c #DAAE4E", -"! c #DAB04F", -"~ c #C7A656", -"^ c #CDA452", -"/ c #CFAC52", -"( c #C0A65E", -") c #CEA75A", -"_ c #CCAC59", -"` c #D2AB53", -"' c #DCAF52", -"] c #D6AD5A", -"[ c #D9AE5B", -"{ c #DCB556", -"} c #DFB855", -"| c #D6B25F", -" . c #DCB35C", -".. c #DEBE5E", -"X. c #E2B656", -"o. c #E1B55A", -"O. c #E6BC5D", -"+. c #E9BD5E", -"@. c #C3AA63", -"#. c #CCAD62", -"$. c #D4AF62", -"%. c #CDB565", -"&. c #CEB46D", -"*. c #D7B164", -"=. c #DBB362", -"-. c #D6BD64", -";. c #DDBA64", -":. c #D3B66C", -">. c #DFB86B", -",. c #CEB772", -"<. c #D0B771", -"1. c #D4BA73", -"2. c #D9BE77", -"3. c #D6BE79", -"4. c #D8BF7A", -"5. c #E4BB62", -"6. c #E9BF64", -"7. c #E4BC69", -"8. c #E9BF69", -"9. c #E0BB71", -"0. c #E9C05E", -"q. c #D2C279", -"w. c #DBC27C", -"e. c #E2C667", -"r. c #EDC364", -"t. c #E3C16E", -"y. c #ECC46C", -"u. c #EDCC6C", -"i. c #F1C764", -"p. c #F5CA66", -"a. c #F9CD67", -"s. c #F5CC6A", -"d. c #F9CD6B", -"f. c #FBD36F", -"g. c #EDC572", -"h. c #E5CF77", -"j. c #ECCA74", -"k. c #E0C67E", -"l. c #EFCE78", -"z. c #F6CE72", -"x. c #FBCF71", -"c. c #F4CE79", -"v. c #F4D273", -"b. c #FCD473", -"n. c #F4DC75", -"m. c #FEDA74", -"M. c #F6D77C", -"N. c #FBD47A", -"B. c #F1DA7B", -"V. c #FDDA7C", -"C. c #FEE27D", -"Z. c #DDC683", -"A. c #DFC884", -"S. c #E4CA84", -"D. c #E3CC89", -"F. c #E7D183", -"G. c #EFD280", -"H. c #EFDC82", -"J. c #ECD48D", -"K. c #EFDA8C", -"L. c #F9D783", -"P. c #F2DF83", -"I. c #FCDB83", -"U. c #F5DC8F", -"Y. c #FADD8B", -"T. c #EBD593", -"R. c #EFDA99", -"E. c #F3DD93", -"W. c #F3DF9F", -"Q. c #FFE385", -"!. c #FEE986", -"~. c #FDE48C", -"^. c #FEEC8E", -"/. c #ECE199", -"(. c #F6E591", -"). c #FEE494", -"_. c #FEEB93", -"`. c #FEE69A", -"'. c #FFEB9B", -"]. c #FFF197", -"[. c #FFF39B", -"{. c #FEF99B", -"}. c #F6E2A2", -"|. c #F9E5A5", -" X c #F7E9A5", -".X c #FEECA4", -"XX c #FBE7A8", -"oX c #FDEAAB", -"OX c #F7F2AA", -"+X c #FEF2AC", -"@X c #FDF4B4", -"#X c #FFFABA", -"$X c #FFFEC2", -"%X c None", -/* pixels */ -"%X%X%X%X%X%X%X%X%X%X%X%Xp t 6 5 w t w %X%X%X%X%X%X%X%X%X%X%X%X%X", -"%X%X%X%X%X%X%X%X%Xu u x I X.0.s.u.0.W x 7 4 %X%X%X%X%X%X%X%X%X%X", -"%X%X%X%X%X%X%Xy i I i.a.f.m.m.b.f.s.a.s.i.W 7 > %X%X%X%X%X%X%X%X", -"%X%X%X%X%X%Xt M 0.a.m.m.m.m.f.d.p.p.p.f.d.f.i.b 1 < %X%X%X%X%X%X", -"%X%X%X%X%X7 ! d.f.f.m.f.+.W P R I Q 5.v.V.V.z.f.{ 5 + %X%X%X%X%X", -"%X%X%X%Xu X.f.m.m.f.' H s ~ V y _ Z J o.g.L.L.Q.!.e.5 X %X%X%X%X", -"%X%X%Xu X.b.C.m.+.N m n t }.3.> }.w.V 5.y.y.Y.[.^.^.-.1 + %X%X%X", -"%X%Xt P m.N.m.X.v v v k 6 }.1.: /.4.c 7.N.N.v.!.{.{.^.L & %X%X%X", -"%X%Xg Y.Y.V.+.m k a t t : }.1.% }.1.r | l.B.M.b.!.{.^.n.7 X %X%X", -"%Xp -._.'.Y.' Y n D.}.}.|.oXXX|.oX XT.w.F _ j.v.v._.^.C.T & @ %X", -"%Xa (.'.'.9.[ [ K S.}.oXoXoXoXXXoXoXoXoX XD / s.d.v.!.C.v.3 o %X", -"%XU '.'.Y.[ [ [ [ J f <.oXoX( 2 f S J.oXoXT.j r.s.i.C.C.C.z X %X", -"p e.'.'.F. .=.=.=.=.) 1.oXoX@.f . .F oXoX}.a +.i.i.b.C.m.I X O ", -"u w.'.[.j.5.8.7.7.7.] 2.oXoX@.y W c &.oXoXZ.k r.s.i.s.V.m.} = o ", -"u H.[.{.y.8.y.g.8.g.7.2.oXoXA.@.&.D.oXoXT.e G +.O.O.5.V.m.0.- o ", -"u !.].[.r.8.y.g.g.g.7.4.oXoXoXoXoXoXoXoXoX<.y W X.o.o.m.m.0.- o ", -"u B._._.5.5.8.y.g.c.g.w.oXoX,.h A F <..XoXoX1.k ' ' ' V.N.r.- ", -"u u.Q.~.r.6.z.N.V.I.v.k.oXoX@.B | _ c 1.oXoX}.a ' ' O.I.b.O.= o ", -"u ..Q.Q.v.i.s.c.N.L.l.Z.oXoX@.B t.=.S &.oXoXXXy Y R +.N.b.Q % o ", -"t T C.I.I.6.u.z.z.5.S 1.oXoX@.e B h D |.oXoXS.f Y Y 6.d.d.n X O ", -"%Xs m.V.Q.r.r.z.5.<.}.oXoXoXXXW.}.oXoXoXoXW.h G H R a.p.s.7 %X", -"%X7 O.V.V.v.+.r.` 4.oXoXoXoXoXoXoXoXXXR.<.h v N N o.a.p.Q = %X", -"%Xw x v.v.v.r.+. .Z l d e }.Z.r }.3.d l V G n n R a.s.a.s X O %X", -"%X%X6 { v.l.v.+.O.5.=.^ d }.4.9 }.1.f J G m m G d.d.x.Q = %X%X", -"%X%X%Xs u.v.v.v.r.6.o. .l }.4.9 W.4.l ^ ^ J ) c.N.N.y.7 X O %X%X", -"%X%X%X5 z v.v.M.I.g.;. .J 1.#.B 1.#.) 7.$.S..X'.W.Y.j $ %X%X%X", -"%X%X%X%X5 b N.Y.~.).Y.j.5.$.=.=.$.*.2.J.@X$X#X#XoXC $ %X%X%X%X", -"%X%X%X%X%X3 z U.@X+X`.`.`.(.E.E.E.|.@X@X#X#X#X/.j % %X%X%X%X%X", -"%X%X%X%X%X%Xw a q.OX|.).`._.'.'.XX.X.X+X+X X%.w X o %X%X%X%X%X%X", -"%X%X%X%X%X%X%X%Xw a _ j.~.~.).).`.`.`.F._ t & . # %X%X%X%X%X%X%X", -"%X%X%X%X%X%X%X%X%X%X4 3 t z L U Z z t 1 $ . 8 %X%X%X%X%X%X%X%X%X", -"%X%X%X%X%X%X%X%X%X%X%X%X%X< ; & + + , 8 %X%X%X%X%X%X%X%X%X%X%X%X" -}; diff --git a/src/xpm/bitcoin48.xpm b/src/xpm/bitcoin48.xpm deleted file mode 100644 index 85a771194..000000000 --- a/src/xpm/bitcoin48.xpm +++ /dev/null @@ -1,277 +0,0 @@ -/* XPM */ -static const char * bitcoin48_xpm[] = { -/* columns rows colors chars-per-pixel */ -"48 48 223 2", -" c #765404", -". c #795704", -"X c #7C5904", -"o c #7C5A0A", -"O c #825E05", -"+ c #815F0E", -"@ c #815F11", -"# c #866107", -"$ c #866208", -"% c #8A650A", -"& c #8E680D", -"* c #916B0E", -"= c #866414", -"- c #8C6715", -"; c #8F6A10", -": c #8A691B", -"> c #956E12", -", c #906D1D", -"< c #967013", -"1 c #997215", -"2 c #94711F", -"3 c #9C751A", -"4 c #9E781C", -"5 c #A27B1D", -"6 c #947324", -"7 c #997625", -"8 c #9D7926", -"9 c #97792B", -"0 c #9D7B28", -"q c #9C7F34", -"w c #A47E22", -"e c #A87F21", -"r c #A37E2A", -"t c #A8801F", -"y c #A58025", -"u c #AB8425", -"i c #A5812C", -"p c #AB842A", -"a c #AB892D", -"s c #B0862C", -"d c #B48C2D", -"f c #B88F2F", -"g c #B9912E", -"h c #A68432", -"j c #AB8531", -"k c #AD8A33", -"l c #A68638", -"z c #AD8B3B", -"x c #B38C32", -"c c #BA8E35", -"v c #B28D3B", -"b c #B59234", -"n c #BD9235", -"m c #B5903E", -"M c #BC943B", -"N c #BA9A3B", -"B c #C29536", -"V c #C59937", -"C c #C2953B", -"Z c #C49C3C", -"A c #CA9E3D", -"S c #AC8E43", -"D c #AD9045", -"F c #AE9248", -"G c #B49444", -"H c #B99542", -"J c #B49842", -"K c #BD9C44", -"L c #B3954A", -"P c #B7994D", -"I c #BD9A4A", -"U c #B69A52", -"Y c #BB9E54", -"T c #BEA04A", -"R c #BFA354", -"E c #BEA35A", -"W c #C19742", -"Q c #C49B43", -"! c #CA9D41", -"~ c #C39C4B", -"^ c #C99E4A", -"/ c #C7A444", -"( c #CDA244", -") c #CAA945", -"_ c #C5A44C", -"` c #CCA44B", -"' c #C6A94C", -"] c #CFAC4D", -"[ c #D2A647", -"{ c #D2A54B", -"} c #D4AA4C", -"| c #D9AC4D", -" . c #D4B04E", -".. c #DCB14D", -"X. c #C4A151", -"o. c #CAA454", -"O. c #C6AB56", -"+. c #CCA955", -"@. c #C1A45A", -"#. c #C6AA5A", -"$. c #CDAB5D", -"%. c #D1A652", -"&. c #D4AB53", -"*. c #DDAF52", -"=. c #D3AC5B", -"-. c #D9AF5C", -";. c #D5B154", -":. c #DDB253", -">. c #D5B25B", -",. c #DCB45D", -"<. c #DDBB5E", -"1. c #E1B354", -"2. c #E4B955", -"3. c #E3B65B", -"4. c #E5BA5C", -"5. c #EABE5E", -"6. c #C6AB63", -"7. c #CCAD63", -"8. c #C6AE68", -"9. c #C9AF69", -"0. c #D4AC60", -"q. c #CDB067", -"w. c #CDB36C", -"e. c #D6B162", -"r. c #DDB463", -"t. c #D7B964", -"y. c #DBB965", -"u. c #D1B66F", -"i. c #DDB66A", -"p. c #D0BC6C", -"a. c #DFBE6B", -"s. c #CEB772", -"d. c #D1B771", -"f. c #D4BC74", -"g. c #DBBD75", -"h. c #DABF78", -"j. c #E2B764", -"k. c #E4BA64", -"l. c #E9BD62", -"z. c #E2BB6A", -"x. c #E8BF69", -"c. c #EBC15F", -"v. c #F1C25E", -"b. c #DFC266", -"n. c #DBC26C", -"m. c #DCC676", -"M. c #DEC973", -"N. c #D7C07A", -"B. c #D9C27E", -"V. c #E4C162", -"C. c #EDC363", -"Z. c #E3C36F", -"A. c #EBC26C", -"S. c #E5CA6B", -"D. c #EECA6D", -"F. c #F1C565", -"G. c #F5CB66", -"H. c #F9CA66", -"J. c #F2C76A", -"K. c #F5CC6A", -"L. c #F9CD6C", -"P. c #EDD26C", -"I. c #FBD26E", -"U. c #E5C374", -"Y. c #EDC573", -"T. c #E6CB74", -"R. c #EECC73", -"E. c #EBCA78", -"W. c #F5CD74", -"Q. c #F9CE72", -"!. c #EED77F", -"~. c #F4D274", -"^. c #FDD473", -"/. c #F2D870", -"(. c #FED975", -"). c #F5D37C", -"_. c #FCD57A", -"`. c #F7D87A", -"'. c #FEDC7C", -"]. c #FFE37D", -"[. c #DCC682", -"{. c #E1C984", -"}. c #E4CD8A", -"|. c #EFD182", -" X c #E5D48D", -".X c #EAD28D", -"XX c #E8DB8D", -"oX c #F1D581", -"OX c #FDD581", -"+X c #F5DB84", -"@X c #FDDC84", -"#X c #FEDE89", -"$X c #EAD594", -"%X c #E1D894", -"&X c #ECDA94", -"*X c #EFDA99", -"=X c #F2DD9C", -"-X c #F6E284", -";X c #FEE385", -":X c #FFE883", -">X c #FEE38C", -",X c #FEEA8C", -"X@X_.`._.'.'./ 4 O aXaXaXaXaXaXaX", -"aXaXaXaXaXaXt g C.I.(.(.^.(.^.1.( ! C d p u s d d d x M &.3.3.A.).+XOX>X;X;X;X) 3 O aXaXaXaXaXaX", -"aXaXaXaXaX5 d G.I.'.].(.^.l.( C A C s H =X=XI 7 N.*X$Xk o.j.z.J.l.W.1X7X6X,X,X,XK 1 X aXaXaXaXaX", -"aXaXaXaX3 p C.(.(.'.'.^.*.C C C C B r G eXeXL - [.eX3Xr ~ r.W._.W.J.D.6X8X6X6X6X-Xd & X aXaXaXaX", -"aXaXaXaXu ;.'.'.(.^.^.| C c B B B c w z eXeXF = [.eX*X8 K r.@X#X;X`.~.D.7X8X8X6X,XS.y O aXaXaXaX", -"aXaXaXw N #X#X'.'.^.*.C c c s r e r 2 r eXeXD $ B.eX=X: z z.oX>X,X,X;X~.D.8X8X6X,X:X) < X aXaXaX", -"aXaX3 a T.1X1X>X#XA.! C B s $.6.6.@.@.w.eXeXd.U $XeX9XF z G O.n.!.-X;X'.D./.8X6X,X:X/.u # aXaXaX", -"aXaXy K 5X5X5X2X>X-.} ^ C r 0XeXeXeXeXeXeXeXeXeXeXeXeXeXeX9XN.L O.T.`.]./.F.-X6X:X].].) < . aXaX", -"aXaXa M.7X5X5X5XU.&.-.&.^ j 0XeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeX9XL X.~.'.'.K.c.6X:X].].P.t O aXaX", -"aX5 k 2X5X5X5XX`.C.L.^._._.OX@X#X#Xt.f.eXeXeXeX6 z #.o.I z 6 w.eXeXeXeX*Xr ! { %.%.,.OX_.(.^.n % ", -"4 u /.;X;X;X@XF.Q.Q._._._.@X#X#Xa.f.eXeXeXeX9 I a.Z.y.+.k F eXeXeXeX0Xr Q { { { 4.'.(.^.^.u O ", -"aXu V.;X;X;X>XF.K.Q.Q._._.OX#X@Xt.f.eXeXeXeX9 I Z.U.z.=.z 8.eXeXeXeX=X7 Q { { ( A._.^.^.F.5 O ", -"aXu ] '.'.;X>XK.J.Q.Q.^._._.~.Z.R w.eXeXeXeX6 S =.>.+.G S 9XeXeXeXeXh.r ! ( ( [ L.L.L.L.:.1 . aX", -"aX5 b '.'.'.@X`.F.K.Q.Q.~.A.e.$.P }.eXeXeXeXF L E #.9.[.eXeXeXeXeXeXS k ! ( ! *.H.K.H.L.Z % aX", -"aX1 u J.(.'.'.;XC.F.W.Q.K.&.h.eXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeX@.2 c ! ! ! F.H.L.H.F.w O aX", -"aXaXw ( (.(.`.`.`.C.F.K.A.~ [.eXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeX*XF 7 r C B A | H.H.H.H.| 1 X aXaX", -"aXaX3 u D.~.~.~.`.D.C.J.V.` .X=X=X3X9X9XeXeX9X=XeXeXeX$X{.9.S 2 r r B B B V 5.H.H.H.H.s + . aXaX", -"aXaXaXt / ~.W.~.`.`.5.V.C.>.M i 6 - = q eXeXS o B.eX*Xo 7 r r r B C B r B 1.H.H.L.L.*.5 X . aXaX", -"aXaXaX1 u 4.~.~.~.~.~.c.V.l.4.,.~ H i S eXeXF : [.eX=X, r W ^ W W C C W *.Q.Q.Q.Q.J.e % aXaXaX", -"aXaXaXaX5 b K.~.~.R.~.`.l.C.J.A.,.=.H P eXeXU , [.eX=X7 v ^ %.^ W ^ ^ -.^.^.W._.W.Z > . aXaXaX", -"aXaXaXaX1 5 / ~.~.~.~.~.`.F.F.<.r.,.~ R eXeXY 7 [.eX=Xq ~ 0.r.0.%.o.g.#XOXOXOXOX,.4 O aXaXaXaX", -"aXaXaXaXaX1 y } ~.`.`.`.'.#XR.,.r.,.+.X.9.7.I G 9.7.7.X.0.i.i.j.i.9XeX0X=X4X1XT.r # aXaXaXaXaX", -"aXaXaXaXaXaX1 u :.'.'.OX#X#X1X+XA.3.r.-.=.=.>.e.i.$.0.0.i.j.g.0XpXpXpXyXuXyXXXk % aXaXaXaXaXaX", -"aXaXaXaXaXaXaX1 p >.>X#X>X1X1X1X1X1X|.U.z.3.j.z.y.i.i.U..XqXpXiXpXpXpXiXiX Xh % . . aXaXaXaXaXaX", -"aXaXaXaXaXaXaXaX< y _ 3XtXuXtXwX=X4X4X4X5XX=X3X0XeXtXyXuXiXiXiXiXiXuXp.y # . . aXaXaXaXaXaXaX", -"aXaXaXaXaXaXaXaXaX* y J %XpXiXwX4X4X4X5X4X5X5XwXwXwXeXtXeXtXtXyXyXyX&XJ 3 # aXaXaXaXaXaXaXaXaX", -"aXaXaXaXaXaXaXaXaXaX* 3 k R XwX4X1X1X1X1X5X4X5X5XwX5XwXwXtXtXtX&X@.y & X aXaXaXaXaXaXaXaXaXaX", -"aXaXaXaXaXaXaXaXaXaXaXaX& 3 a J t.|.>X,X>X>X2X1X1X1X5X4X0X O o aXaXaXaXaXaXaXaXaXaXaX", -"aXaXaXaXaXaXaXaXaXaXaXaXaXaX% > w p b _ >.b.S.T.T.U.t.O.N p 4 & O . o aXaXaXaXaXaXaXaXaXaXaXaXaX", -"aXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaX$ $ ; 1 4 5 5 w w 5 3 > % O . . o aXaXaXaXaXaXaXaXaXaXaXaXaXaXaX", -"aXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXO X X X o X X X o aXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaX" -}; diff --git a/src/xpm/bitcoin80.xpm b/src/xpm/bitcoin80.xpm deleted file mode 100644 index c3c816e92..000000000 --- a/src/xpm/bitcoin80.xpm +++ /dev/null @@ -1,292 +0,0 @@ -/* XPM */ -static const char * bitcoin80_xpm[] = { -/* columns rows colors chars-per-pixel */ -"80 80 206 2", -" c #725203", -". c #785706", -"X c #7B5907", -"o c #7C5A09", -"O c #7F5F10", -"+ c #815E0B", -"@ c #85620C", -"# c #89650F", -"$ c #856313", -"% c #896614", -"& c #8D6913", -"* c #886718", -"= c #8D6B1B", -"- c #926D14", -"; c #926E1B", -": c #967116", -"> c #997317", -", c #95711E", -"< c #9B7419", -"1 c #9F781B", -"2 c #A27B1D", -"3 c #8F6F22", -"4 c #926F21", -"5 c #947323", -"6 c #9A7623", -"7 c #9D7925", -"8 c #957628", -"9 c #9A7729", -"0 c #9D7B2B", -"q c #9D7F33", -"w c #A47D23", -"e c #A97F27", -"r c #A37E2B", -"t c #9F8030", -"y c #A78021", -"u c #AC8425", -"i c #A5802D", -"p c #AC842B", -"a c #AF8829", -"s c #B2872C", -"d c #B28B2D", -"f c #A68333", -"g c #AA8633", -"h c #AD8A36", -"j c #A4863A", -"k c #A88638", -"l c #A7893B", -"z c #AC8B3B", -"x c #B28732", -"c c #B48C32", -"v c #B98E34", -"b c #B28D3B", -"n c #B88F3C", -"m c #B69033", -"M c #BD9235", -"N c #B4913D", -"B c #BC943A", -"V c #BE993C", -"C c #C19336", -"Z c #C1953B", -"A c #C49A3C", -"S c #C99C3D", -"D c #CDA13F", -"F c #D0A33F", -"G c #A88B40", -"H c #B08F40", -"J c #AE9142", -"K c #AE944C", -"L c #B49443", -"P c #BB9542", -"I c #B49946", -"U c #BD9846", -"Y c #B3964C", -"T c #BB974A", -"R c #B6994A", -"E c #BF9C4A", -"W c #B69B53", -"Q c #B99D53", -"! c #BCA055", -"~ c #BDA25A", -"^ c #C49742", -"/ c #C49C43", -"( c #CB9E42", -") c #C49D4B", -"_ c #C99E4C", -"` c #C29F52", -"' c #C5A244", -"] c #CDA245", -"[ c #C5A34C", -"{ c #CCA34B", -"} c #CCA94D", -"| c #D2A445", -" . c #D1A54B", -".. c #D5AA4E", -"X. c #DBAF4F", -"o. c #C6A352", -"O. c #CBA554", -"+. c #C5AA57", -"@. c #CEAC54", -"#. c #C4A65A", -"$. c #CDA458", -"%. c #C2A85F", -"&. c #CEAA5B", -"*. c #D0A550", -"=. c #D4AB53", -"-. c #DBAE53", -";. c #D0A75B", -":. c #D4AC5A", -">. c #D9AE5C", -",. c #CEB25E", -"<. c #D4B156", -"1. c #DDB156", -"2. c #D4B25C", -"3. c #DCB35D", -"4. c #D7B85C", -"5. c #DCBA5E", -"6. c #E2B355", -"7. c #E2B65B", -"8. c #E4BA5D", -"9. c #EABD5E", -"0. c #C5AA62", -"q. c #CCAE63", -"w. c #C6AE69", -"e. c #D5AF62", -"r. c #CEB167", -"t. c #CCB36C", -"y. c #D5B162", -"u. c #DCB462", -"i. c #D7B964", -"p. c #DCBC64", -"a. c #D2B66B", -"s. c #DCB669", -"d. c #D7BE69", -"f. c #DFB86A", -"g. c #D0B771", -"h. c #D2BA74", -"j. c #D5BE78", -"k. c #E1B766", -"l. c #E4BB63", -"z. c #E9BE63", -"x. c #E3BB6A", -"c. c #E9BF6A", -"v. c #E1BE72", -"b. c #DDC16B", -"n. c #DAC27E", -"m. c #E4C164", -"M. c #ECC264", -"N. c #E4C36B", -"B. c #EBC36C", -"V. c #E7C96F", -"C. c #EECA6E", -"Z. c #F1C564", -"A. c #F1C76A", -"S. c #F5CB6C", -"D. c #FACE6D", -"F. c #F4D06F", -"G. c #FCD06E", -"H. c #E5C371", -"J. c #EDC573", -"K. c #E4CA73", -"L. c #ECCC74", -"P. c #E7CF7A", -"I. c #EBCD7A", -"U. c #F3CD73", -"Y. c #F8CE71", -"T. c #F3CD7A", -"R. c #EDD076", -"E. c #EDD17B", -"W. c #F4D274", -"Q. c #FBD274", -"!. c #FED977", -"~. c #F3D47B", -"^. c #FDD47A", -"/. c #F5DA7C", -"(. c #FDDA7C", -"). c #FFE07F", -"_. c #DBC481", -"`. c #DFC885", -"'. c #E1CA86", -"]. c #EACC80", -"[. c #E4CD8A", -"{. c #EED383", -"}. c #E7D18F", -"|. c #EAD38C", -" X c #F4D680", -".X c #FDD780", -"XX c #F5DA83", -"oX c #FCDC84", -"OX c #F5DB8A", -"+X c #FADE89", -"@X c #EAD492", -"#X c #EED896", -"$X c #EFDA9A", -"%X c #F1DD9D", -"&X c #FDE283", -"*X c #F6E18D", -"=X c #FEE48D", -"-X c #FFE692", -";X c #FFE894", -":X c #FBE799", -">X c #FFEA98", -",X c #F6E2A3", -".J..X.X.X.X(.W.Z.C.&X;X;X;X;X-X-X-X<.u u < 3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3Xu u c oX=X=X=X=X=X=X=Xl.Z C M M C C v v v s w = '.2X2X2X5 $ = 2X2X2X}.5 g ) u./.+X+X=X=X=X&XW.Z.F.=X;X;X;X;X-X-X*XV u y @ X 3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3Xu u u N.-X-X-X-X=X=X=XB.Z M C v v s e e e e w > % `.2X2X2X= + % 2X2X2X}.= r L 4.E.OX+X-X=X=X&X).W.M.R.;X;X;X-X-X-X;XR.u u y 3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3Xu u U -X-X-X-X-X-X=XW.^ C C C x e e r 6 5 4 ; = $ `.2X2X2X= O = 2X2X2X}.O = t Q ,.b.P./.*X=X&X&X).F.M.W.;X;X;X;X&X-X&X} u u O 3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3Xu u u R.-X-X-X-X-X-X=X=.{ ^ Z C x n 2X2X.>.>.=.=._ n b 2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X:XI N +.V./.).).F.F.9.W.;X=X;X-X-X-XR.u u > 3X3X3X3X3X3X3X3X", -"3X3X3X3X3Xu u d =X;X-X-X-X-X-Xx.>.>.>.>.>...^ P 2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X,Xl N 4.R.!.!.!.G.Z.M.&X;X=X=X-X-X-XB a u 3X3X3X3X3X3X3X", -"3X3X3X3X3Xu u @.;X;X-X;X;X;XXX>.:.>.>.>.>.>._ P ` Y Y W _.2X2X2X2X2X2X@XW W ~ 0.t.'..>.>.>.>.>.>.=._ P z r 4 8 2X2X2X2X2X2X_.. $ , 6 1 3 t ~ 1X2X2X2X2X2X2X2Xt B 5.G.!.!.G.G.M.9.&X;X=X-X-X=X/.u u > 3X3X3X3X3X3X3X", -"3X3X3X3Xu u d =X;X;X=X;X;X=X3.>.>.>.e.>.3.3.>.:.*._ P r 9 2X2X2X2X2X1Xn.@ , c B N m h 8 ~ 2X2X2X2X2X2X2XI h <.F.!.G.G.F.M.9.W.;X=X-X-X=X=Xm u y . 3X3X3X3X3X3X", -"3X3X3X3Xu u ' -X-X>X-X-X-X X>.>.>.>.>.>.>.u.u.u.u.3.$.P f 2X2X2X2X2X2X_.$ i / -.<.8.} h 8 1X2X2X2X2X2X2X! i <.S.G.G.G.G.Z.9.Z.=X-X=X-X&X-X} u u X 3X3X3X3X3X3X", -"3X3X3X3Xu u 4.-X-X-X-X-X-XJ.3.>.>.k.k.k.k.k.u.k.u.u.:.U k 2X2X2X2X2X1X_.% f } 8.Z.F.8.U 8 ,X2X2X2X2X2X2XI g } Z.D.G.D.G.D.Z.9.&X-X=X=X=X-Xm.u u @ 3X3X3X3X3X3X", -"3X3X3X3Xu u K.;X-X;X-X>X-Xk.3.k.k.k.k.k.k.k.k.k.k.u.e.U k 2X2X2X2X2X2X_.% f [ 8.F.M.<.b i 2X2X2X2X2X2X2Xt a X.Z.D.D.D.G.G.Z.9./.=X-X=X=X=XR.u u & 3X3X3X3X3X3X", -"3X3X3X3Xu u E.;X-X;X-X-X=Xl.l.x.c.k.x.k.k.x.x.v.x.x.u.) z 2X2X2X2X2X2X_.$ 7 L <.<.} N 6 h.2X2X2X2X2X2X_.: V 1.S.D.D.G.D.S.M.6.W.-X=X-X=X=X&Xu u > X 3X3X3X3X3X", -"3X3X3Xu a u =X;X;X;X;X;XoX7.z.c.c.c.c.c.c.c.c.c.x.k.u.) z 2X2X2X2X2X2Xn.o = i N h i l n.2X2X2X2X2X2X.o.L r [.2X2X2X9 = 8 2X2X2X}.4 r ^ _ *.*._ ) ) ^ ^ ^ O.oX=X-X-X-X-X-X-X<.u u : . 3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3Xy u u i.=X=X=X=X=X-X*X=XW.9.M.A.B.3.5.5.;.U f [.2X2X2Xq 4 8 2X2X2X}.r q _ _ ;.;.*._ _ ` _ e.+X-X-X-X-X-X-X-XR.a u 2 3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3Xu u u K.=X=X=X-X=X=X=X=XXXz.M.8.5.8.u.:.) h }.2X2X2Xj r f 2X2X2X@Xq T _ e.e.u.e.;.$.$.b.-X-X-X=X;X=X;X-X&Xa a u + 3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3Xu u d ~.=X=X=X=X=X-X=X-X+XC.3.5.7.7.2.@.) q.r.q.q.H H L g.r.w.q.T ` e.k.v.k.k.s.s.{.-X-X;X-X;X;X;X;X*XV u u & . 3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3X2 u u c XX-X=X=X=X=X-X=X-X-X Xl.7.7.u.2.$.o.[ [ o.O.$.&.&.` ` ` q.s.k.v.k.k.x.{.%X>X>X>X;X>X;X>X>X*XV u u > 3X3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3X3X2 u u m ~.=X-X-X-X=X-X-X-X-X-X Xc.7.5.u.3.e.y.u.s.f.k.s.e.e.s.s.k.k.k.v. X:X>X>X>X>X>X>X;X>X>X*XV u u < 3X3X3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3X3X3X2 u u d R.-X=X-X=X-X-X-X-X-X-X-X+XI.v.u.s.l.k.k.x.x.x.s.s.s.s.j.].+X>X>X>X>X>X:X>X>X>X>X>XOXV u u 1 3X3X3X3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3X3X3X3X2 u u a p.-X-X-X;X;X;X-X-X-X:X-X-X-X-XOX XL.J.J.J.L.I.].OX:X>X-X>X>X-X>X>X>X>X>X>X>X>XK.a a u < 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X2 u u u @.=X;X;X>X;X-X-X>X-X-X-X-X;X-X-X-X-X-X>X>X-X>X-X>X>X>X>X;X>X>X>X-X>X-X-X:X<.u u u > 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X1 u u u m n.>X;X>X>X-X-X-X-X>X-X-X-X;X;X;X-X-X-X-X-X>X-X-X>X-X>X>X-X>X>X>X>XK.B u u u & 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3Xw u u u / {.>X>X-X-X-X-X-X-X-X-X-X-X;X-X-X;X:X-X-X>X-X:X>X;X;X>X;X;X{.[ u u u w + 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X2 u u u u ) K.-X-X-X-X:X-X-X-X-X-X-X-X-X-X-X-X-X>X-X-X-X-X-X-XE.[ u u u u - . 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X1 u u u u m 2.E.-X+X:X-X-X-X-X-X-X-X-X-X:X-X-X-X;X-XOXi.B u u u u 1 o 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X> u u u u u v [ l.I.OX-X-X-X-X-X-X-X-X+XI.f.@.m u u u u u 1 + o 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X& 2 u u u u u u u d B V V V V B d u u u u u u u y - . o 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X+ - 1 u u u u u u u a u u u u u u u u 2 - o o 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3Xo . X # - > 1 2 2 2 1 2 > - # o . o 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3Xo o . o 3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X", -"3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X" -}; diff --git a/src/xpm/check.xpm b/src/xpm/check.xpm deleted file mode 100644 index e62b65696..000000000 --- a/src/xpm/check.xpm +++ /dev/null @@ -1,41 +0,0 @@ -/* XPM */ -static const char * check_xpm[] = { -/* columns rows colors chars-per-pixel */ -"32 32 3 1", -" c #008000", -". c #00FF00", -"X c None", -/* pixels */ -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXX XXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXX . XXXXXXXXXXX", -"XXXXXXXXXXXXXXXX .. XXXXXXXXXXXX", -"XXXXXXXXXXXXXXXX . XXXXXXXXXXXX", -"XXXXXXXXXXXXXXX .. XXXXXXXXXXXXX", -"XXXXXXXXXXX XX . XXXXXXXXXXXXX", -"XXXXXXXXXXX . .. XXXXXXXXXXXXXX", -"XXXXXXXXXXX .. . XXXXXXXXXXXXXX", -"XXXXXXXXXXXX ... XXXXXXXXXXXXXXX", -"XXXXXXXXXXXXX . XXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXX XXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" -}; diff --git a/src/xpm/send16.xpm b/src/xpm/send16.xpm deleted file mode 100644 index 7da44d9c5..000000000 --- a/src/xpm/send16.xpm +++ /dev/null @@ -1,278 +0,0 @@ -/* XPM */ -static const char * send16_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 16 256 2", -" c #ADF7AD", -". c #9CFF9C", -"X c None", -"o c #ADEFAD", -"O c #94FF94", -"+ c #D6CECE", -"@ c #8CFF8C", -"# c #CECECE", -"$ c #CECEC5", -"% c #84FF84", -"& c #CEC5C5", -"* c #73FF73", -"= c #C5C5C5", -"- c #6BFF6B", -"; c #73F773", -": c #C5BDBD", -"> c #6BF76B", -", c #BDBDBD", -"< c #63F763", -"1 c #B5B5B5", -"2 c #52F752", -"3 c #42FF42", -"4 c #3AFF3A", -"5 c #ADADAD", -"6 c #ADADA5", -"7 c #4AEF4A", -"8 c #29FF29", -"9 c #A5A5A5", -"0 c #42E642", -"q c #9CA59C", -"w c #3AE63A", -"e c #10FF10", -"r c #08FF08", -"t c #949C94", -"y c #00FF00", -"u c #00F700", -"i c #8C948C", -"p c #00EF00", -"a c #08E608", -"s c #10DE10", -"d c #00E600", -"f c #00DE00", -"g c #19C519", -"h c #00CE00", -"j c #00C500", -"k c #008C00", -"l c #008400", -"z c #669900", -"x c #999900", -"c c #CC9900", -"v c #FF9900", -"b c #00CC00", -"n c #33CC00", -"m c #66CC00", -"M c #99CC00", -"N c #CCCC00", -"B c #FFCC00", -"V c #66FF00", -"C c #99FF00", -"Z c #CCFF00", -"A c #000033", -"S c #330033", -"D c #660033", -"F c #990033", -"G c #CC0033", -"H c #FF0033", -"J c #003333", -"K c #333333", -"L c #663333", -"P c #993333", -"I c #CC3333", -"U c #FF3333", -"Y c #006633", -"T c #336633", -"R c #666633", -"E c #996633", -"W c #CC6633", -"Q c #FF6633", -"! c #009933", -"~ c #339933", -"^ c #669933", -"/ c #999933", -"( c #CC9933", -") c #FF9933", -"_ c #00CC33", -"` c #33CC33", -"' c #66CC33", -"] c #99CC33", -"[ c #CCCC33", -"{ c #FFCC33", -"} c #33FF33", -"| c #66FF33", -" . c #99FF33", -".. c #CCFF33", -"X. c #FFFF33", -"o. c #000066", -"O. c #330066", -"+. c #660066", -"@. c #990066", -"#. c #CC0066", -"$. c #FF0066", -"%. c #003366", -"&. c #333366", -"*. c #663366", -"=. c #993366", -"-. c #CC3366", -";. c #FF3366", -":. c #006666", -">. c #336666", -",. c #666666", -"<. c #996666", -"1. c #CC6666", -"2. c #009966", -"3. c #339966", -"4. c #669966", -"5. c #999966", -"6. c #CC9966", -"7. c #FF9966", -"8. c #00CC66", -"9. c #33CC66", -"0. c #99CC66", -"q. c #CCCC66", -"w. c #FFCC66", -"e. c #00FF66", -"r. c #33FF66", -"t. c #99FF66", -"y. c #CCFF66", -"u. c #FF00CC", -"i. c #CC00FF", -"p. c #009999", -"a. c #993399", -"s. c #990099", -"d. c #CC0099", -"f. c #000099", -"g. c #333399", -"h. c #660099", -"j. c #CC3399", -"k. c #FF0099", -"l. c #006699", -"z. c #336699", -"x. c #663399", -"c. c #996699", -"v. c #CC6699", -"b. c #FF3399", -"n. c #339999", -"m. c #669999", -"M. c #999999", -"N. c #CC9999", -"B. c #FF9999", -"V. c #00CC99", -"C. c #33CC99", -"Z. c #66CC66", -"A. c #99CC99", -"S. c #CCCC99", -"D. c #FFCC99", -"F. c #00FF99", -"G. c #33FF99", -"H. c #66CC99", -"J. c #99FF99", -"K. c #CCFF99", -"L. c #FFFF99", -"P. c #0000CC", -"I. c #330099", -"U. c #6600CC", -"Y. c #9900CC", -"T. c #CC00CC", -"R. c #003399", -"E. c #3333CC", -"W. c #6633CC", -"Q. c #9933CC", -"!. c #CC33CC", -"~. c #FF33CC", -"^. c #0066CC", -"/. c #3366CC", -"(. c #666699", -"). c #9966CC", -"_. c #CC66CC", -"`. c #FF6699", -"'. c #0099CC", -"]. c #3399CC", -"[. c #6699CC", -"{. c #9999CC", -"}. c #CC99CC", -"|. c #FF99CC", -" X c #00CCCC", -".X c #33CCCC", -"XX c #66CCCC", -"oX c #99CCCC", -"OX c #CCCCCC", -"+X c #FFCCCC", -"@X c #00FFCC", -"#X c #33FFCC", -"$X c #66FF99", -"%X c #99FFCC", -"&X c #CCFFCC", -"*X c #FFFFCC", -"=X c #3300CC", -"-X c #6600FF", -";X c #9900FF", -":X c #0033CC", -">X c #3333FF", -",X c #6633FF", -" c #6BF76B", -", c #BDBDBD", -"< c #63F763", -"1 c #B5B5B5", -"2 c #52F752", -"3 c #42FF42", -"4 c #3AFF3A", -"5 c #ADADAD", -"6 c #ADADA5", -"7 c #4AEF4A", -"8 c #29FF29", -"9 c #A5A5A5", -"0 c #42E642", -"q c #9CA59C", -"w c #3AE63A", -"e c #10FF10", -"r c #08FF08", -"t c #949C94", -"y c #00FF00", -"u c #00F700", -"i c #8C948C", -"p c #00EF00", -"a c #08E608", -"s c #10DE10", -"d c #00E600", -"f c #00DE00", -"g c #19C519", -"h c #00CE00", -"j c #00C500", -"k c #008C00", -"l c #008400", -"z c #669900", -"x c #999900", -"c c #CC9900", -"v c #FF9900", -"b c #00CC00", -"n c #33CC00", -"m c #66CC00", -"M c #99CC00", -"N c #CCCC00", -"B c #FFCC00", -"V c #66FF00", -"C c #99FF00", -"Z c #CCFF00", -"A c #000033", -"S c #330033", -"D c #660033", -"F c #990033", -"G c #CC0033", -"H c #FF0033", -"J c #003333", -"K c #333333", -"L c #663333", -"P c #993333", -"I c #CC3333", -"U c #FF3333", -"Y c #006633", -"T c #336633", -"R c #666633", -"E c #996633", -"W c #CC6633", -"Q c #FF6633", -"! c #009933", -"~ c #339933", -"^ c #669933", -"/ c #999933", -"( c #CC9933", -") c #FF9933", -"_ c #00CC33", -"` c #33CC33", -"' c #66CC33", -"] c #99CC33", -"[ c #CCCC33", -"{ c #FFCC33", -"} c #33FF33", -"| c #66FF33", -" . c #99FF33", -".. c #CCFF33", -"X. c #FFFF33", -"o. c #000066", -"O. c #330066", -"+. c #660066", -"@. c #990066", -"#. c #CC0066", -"$. c #FF0066", -"%. c #003366", -"&. c #333366", -"*. c #663366", -"=. c #993366", -"-. c #CC3366", -";. c #FF3366", -":. c #006666", -">. c #336666", -",. c #666666", -"<. c #996666", -"1. c #CC6666", -"2. c #009966", -"3. c #339966", -"4. c #669966", -"5. c #999966", -"6. c #CC9966", -"7. c #FF9966", -"8. c #00CC66", -"9. c #33CC66", -"0. c #99CC66", -"q. c #CCCC66", -"w. c #FFCC66", -"e. c #00FF66", -"r. c #33FF66", -"t. c #99FF66", -"y. c #CCFF66", -"u. c #FF00CC", -"i. c #CC00FF", -"p. c #009999", -"a. c #993399", -"s. c #990099", -"d. c #CC0099", -"f. c #000099", -"g. c #333399", -"h. c #660099", -"j. c #CC3399", -"k. c #FF0099", -"l. c #006699", -"z. c #336699", -"x. c #663399", -"c. c #996699", -"v. c #CC6699", -"b. c #FF3399", -"n. c #339999", -"m. c #669999", -"M. c #999999", -"N. c #CC9999", -"B. c #FF9999", -"V. c #00CC99", -"C. c #33CC99", -"Z. c #66CC66", -"A. c #99CC99", -"S. c #CCCC99", -"D. c #FFCC99", -"F. c #00FF99", -"G. c #33FF99", -"H. c #66CC99", -"J. c #99FF99", -"K. c #CCFF99", -"L. c #FFFF99", -"P. c #0000CC", -"I. c #330099", -"U. c #6600CC", -"Y. c #9900CC", -"T. c #CC00CC", -"R. c #003399", -"E. c #3333CC", -"W. c #6633CC", -"Q. c #9933CC", -"!. c #CC33CC", -"~. c #FF33CC", -"^. c #0066CC", -"/. c #3366CC", -"(. c #666699", -"). c #9966CC", -"_. c #CC66CC", -"`. c #FF6699", -"'. c #0099CC", -"]. c #3399CC", -"[. c #6699CC", -"{. c #9999CC", -"}. c #CC99CC", -"|. c #FF99CC", -" X c #00CCCC", -".X c #33CCCC", -"XX c #66CCCC", -"oX c #99CCCC", -"OX c #CCCCCC", -"+X c #FFCCCC", -"@X c #00FFCC", -"#X c #33FFCC", -"$X c #66FF99", -"%X c #99FFCC", -"&X c #CCFFCC", -"*X c #FFFFCC", -"=X c #3300CC", -"-X c #6600FF", -";X c #9900FF", -":X c #0033CC", -">X c #3333FF", -",X c #6633FF", -" c #73FF73", -", c #C5C5C5", -"< c #C5C5BD", -"1 c #6BFF6B", -"2 c #BDC5B5", -"3 c #63FF63", -"4 c #6BF76B", -"5 c #BDBDBD", -"6 c #BDBDB5", -"7 c #5AFF5A", -"8 c #63F763", -"9 c #B5BDB5", -"0 c #B5BDAD", -"q c #52FF52", -"w c #BDB5B5", -"e c #5AF75A", -"r c #B5B5B5", -"t c #B5B5AD", -"y c #52F752", -"u c #42FF42", -"i c #52EF52", -"p c #ADADAD", -"a c #ADADA5", -"s c #4AEF4A", -"d c #31FF31", -"f c #29FF29", -"g c #A5A5A5", -"h c #21FF21", -"j c #5AD65A", -"k c #42E642", -"l c #94AD94", -"z c #4ADE4A", -"x c #3AE63A", -"c c #5ACE5A", -"v c #10FF10", -"b c #9C9C9C", -"n c #31E631", -"m c #08FF08", -"M c #949C94", -"N c #84A584", -"B c #00FF00", -"V c #3AD63A", -"C c #52C552", -"Z c #00F700", -"A c #8C948C", -"S c #849484", -"D c #00EF00", -"F c #739C73", -"G c #08E608", -"H c #4AB54A", -"J c #31C531", -"K c #00E600", -"L c #739473", -"P c #00DE00", -"I c #63945A", -"U c #6B8C6B", -"Y c #00D600", -"T c #42A542", -"R c #638C63", -"E c #00CE00", -"W c #21B521", -"Q c #5A8C5A", -"! c #00C500", -"~ c #528C52", -"^ c #3A9C3A", -"/ c #4A8C4A", -"( c #00BD00", -") c #319431", -"_ c #219C21", -"` c #318C31", -"' c #3A843A", -"] c #219421", -"[ c #298C29", -"{ c #318431", -"} c #218C21", -"| c #218C19", -" . c #198C19", -".. c #218421", -"X. c #297B29", -"o. c #198419", -"O. c #217B21", -"+. c #108410", -"@. c #197B19", -"#. c #CC0066", -"$. c #FF0066", -"%. c #003366", -"&. c #333366", -"*. c #663366", -"=. c #993366", -"-. c #CC3366", -";. c #FF3366", -":. c #006666", -">. c #336666", -",. c #666666", -"<. c #996666", -"1. c #CC6666", -"2. c #009966", -"3. c #339966", -"4. c #669966", -"5. c #999966", -"6. c #CC9966", -"7. c #FF9966", -"8. c #00CC66", -"9. c #33CC66", -"0. c #99CC66", -"q. c #CCCC66", -"w. c #FFCC66", -"e. c #00FF66", -"r. c #33FF66", -"t. c #99FF66", -"y. c #CCFF66", -"u. c #FF00CC", -"i. c #CC00FF", -"p. c #009999", -"a. c #993399", -"s. c #990099", -"d. c #CC0099", -"f. c #000099", -"g. c #333399", -"h. c #660099", -"j. c #CC3399", -"k. c #FF0099", -"l. c #006699", -"z. c #336699", -"x. c #663399", -"c. c #996699", -"v. c #CC6699", -"b. c #FF3399", -"n. c #339999", -"m. c #669999", -"M. c #999999", -"N. c #CC9999", -"B. c #FF9999", -"V. c #00CC99", -"C. c #33CC99", -"Z. c #66CC66", -"A. c #99CC99", -"S. c #CCCC99", -"D. c #FFCC99", -"F. c #00FF99", -"G. c #33FF99", -"H. c #66CC99", -"J. c #99FF99", -"K. c #CCFF99", -"L. c #FFFF99", -"P. c #0000CC", -"I. c #330099", -"U. c #6600CC", -"Y. c #9900CC", -"T. c #CC00CC", -"R. c #003399", -"E. c #3333CC", -"W. c #6633CC", -"Q. c #9933CC", -"!. c #CC33CC", -"~. c #FF33CC", -"^. c #0066CC", -"/. c #3366CC", -"(. c #666699", -"). c #9966CC", -"_. c #CC66CC", -"`. c #FF6699", -"'. c #0099CC", -"]. c #3399CC", -"[. c #6699CC", -"{. c #9999CC", -"}. c #CC99CC", -"|. c #FF99CC", -" X c #00CCCC", -".X c #33CCCC", -"XX c #66CCCC", -"oX c #99CCCC", -"OX c #CCCCCC", -"+X c #FFCCCC", -"@X c #00FFCC", -"#X c #33FFCC", -"$X c #66FF99", -"%X c #99FFCC", -"&X c #CCFFCC", -"*X c #FFFFCC", -"=X c #3300CC", -"-X c #6600FF", -";X c #9900FF", -":X c #0033CC", -">X c #3333FF", -",X c #6633FF", -" Date: Mon, 26 Sep 2011 11:15:01 -0400 Subject: [PATCH 13/18] Fix build: put back rules to build cryptopp files --- src/makefile.linux-mingw | 2 ++ src/makefile.mingw | 2 ++ src/makefile.osx | 2 ++ src/makefile.unix | 3 +++ 4 files changed, 9 insertions(+) diff --git a/src/makefile.linux-mingw b/src/makefile.linux-mingw index 9c3c23558..8b3df66d9 100644 --- a/src/makefile.linux-mingw +++ b/src/makefile.linux-mingw @@ -78,6 +78,8 @@ OBJS= \ all: bitcoind.exe +cryptopp/obj/%.o: cryptopp/%.cpp + i586-mingw32msvc-g++ -c $(CFLAGS) -O3 -DCRYPTOPP_DISABLE_ASM -o $@ $< obj/nogui/%.o: %.cpp $(HEADERS) i586-mingw32msvc-g++ -c $(CFLAGS) -o $@ $< diff --git a/src/makefile.mingw b/src/makefile.mingw index 87225761b..d1c6ba8be 100644 --- a/src/makefile.mingw +++ b/src/makefile.mingw @@ -76,6 +76,8 @@ OBJS= \ all: bitcoind.exe +cryptopp/obj/%.o: cryptopp/%.cpp + g++ -c $(CFLAGS) -O3 -DCRYPTOPP_DISABLE_ASM -o $@ $< obj/nogui/%.o: %.cpp $(HEADERS) g++ -c $(CFLAGS) -o $@ $< diff --git a/src/makefile.osx b/src/makefile.osx index aff1e5f31..1d1d6b7b7 100644 --- a/src/makefile.osx +++ b/src/makefile.osx @@ -76,6 +76,8 @@ endif all: bitcoind +cryptopp/obj/%.o: cryptopp/%.cpp + $(CXX) -c $(CFLAGS) -O3 -DCRYPTOPP_DISABLE_ASM -o $@ $< obj/nogui/%.o: %.cpp $(HEADERS) $(CXX) -c $(CFLAGS) -o $@ $< diff --git a/src/makefile.unix b/src/makefile.unix index 88ca8895f..689c54d9d 100644 --- a/src/makefile.unix +++ b/src/makefile.unix @@ -104,6 +104,9 @@ OBJS= \ all: bitcoind +cryptopp/obj/%.o: cryptopp/%.cpp + $(CXX) -c $(CFLAGS) -O3 -o $@ $< + obj/nogui/%.o: %.cpp $(HEADERS) $(CXX) -c $(CXXFLAGS) -o $@ $< From adea540e38d1039f26faa28f9eda3364e57b202e Mon Sep 17 00:00:00 2001 From: Gavin Andresen Date: Mon, 26 Sep 2011 11:40:43 -0400 Subject: [PATCH 14/18] Update build instructions for the new, no-wxwidgets world --- INSTALL | 9 ++++ doc/build-msw.txt | 21 ++-------- doc/build-osx.txt | 102 +++------------------------------------------ doc/build-unix.txt | 35 ++-------------- 4 files changed, 23 insertions(+), 144 deletions(-) create mode 100644 INSTALL diff --git a/INSTALL b/INSTALL new file mode 100644 index 000000000..6989d8902 --- /dev/null +++ b/INSTALL @@ -0,0 +1,9 @@ +Building Bitcoin + +See doc/readme-qt.rst for instructions on building Bitcoin QT, +the intended-for-end-users, nice-graphical-interface, reference +implementation of Bitcoin. + +See doc/build-*.txt for instructions on building bitcoind, +the intended-for-services, no-graphical-interface, reference +implementation of Bitcoin. diff --git a/doc/build-msw.txt b/doc/build-msw.txt index d08e3a23b..f3150e086 100644 --- a/doc/build-msw.txt +++ b/doc/build-msw.txt @@ -7,6 +7,9 @@ cryptographic software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. +See readme-qt.rst for instructions on building Bitcoin QT, the +graphical user interface. + WINDOWS BUILD NOTES =================== @@ -27,39 +30,24 @@ Dependencies Libraries you need to download separately and build: default path download -wxWidgets \wxwidgets-2.9.2-mgw http://www.wxwidgets.org/downloads/ OpenSSL \openssl-1.0.0d-mgw http://www.openssl.org/source/ Berkeley DB \db-4.8.30.NC-mgw http://www.oracle.com/technology/software/products/berkeley-db/index.html Boost \boost-1.47.0-mgw http://www.boost.org/users/download/ miniupnpc \miniupnpc-1.6-mgw http://miniupnp.tuxfamily.org/files/ Their licenses: -wxWidgets LGPL 2.1 with very liberal exceptions OpenSSL Old BSD license with the problematic advertising requirement Berkeley DB New BSD license with additional requirement that linked software must be free open source Boost MIT-like license miniupnpc New (3-clause) BSD license Versions used in this release: -wxWidgets 2.9.2 OpenSSL 1.0.0d Berkeley DB 4.8.30.NC Boost 1.47.0 miniupnpc 1.6 -Notes ------ -The UI layout is edited with wxFormBuilder. The project file is -uiproject.fbp. It generates uibase.cpp and uibase.h, which define base -classes that do the rote work of constructing all the UI elements. - -wxWidgets ---------- -DOS shell: -cd \wxWidgets-2.9.2-mgw\build\msw -mingw32-make -f makefile.gcc - OpenSSL ------- MSYS shell: @@ -98,6 +86,5 @@ Bitcoin ------- DOS prompt: cd \bitcoin\src -mingw32-make bitcoin.exe bitcoind.exe -f makefile.mingw -strip bitcoin.exe +mingw32-make bitcoind.exe -f makefile.mingw strip bitcoind.exe diff --git a/doc/build-osx.txt b/doc/build-osx.txt index 52d876d82..ac67080c3 100644 --- a/doc/build-osx.txt +++ b/doc/build-osx.txt @@ -8,11 +8,14 @@ software written by Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard. -Mac OS X build instructions +Mac OS X bitcoind build instructions Laszlo Hanyecz Douglas Huff +See readme-qt.rst for instructions on building Bitcoin QT, the +graphical user interface. + Tested on 10.5 and 10.6 intel. PPC is not supported because it's big-endian. All of the commands should be executed in Terminal.app.. it's in @@ -32,7 +35,6 @@ structure I use looks like this: ~/bitcoin/bitcoin # Upstream source tree ~/bitcoin/src # source code (symlink to ~/bitcoin/bitcoin/src) ~/bitcoin/deps # dependencies.. like libraries and headers needed to compile -~/bitcoin/Bitcoin.app # the application bundle where you can run the app Just execute: mkdir ~/bitcoin This will create the top dir for you.. @@ -180,99 +182,7 @@ cd db-4.8.30/build_unix ../dist/configure --prefix=/Users/macosuser/bitcoin/deps --enable-cxx && make && make install -wxWidgets ---------- - -(The wxWidgets-devel MacPorts package will work but will throw annoying assertion dialogs.) - -This is the big one.. - -Check it out from svn - -cd ~/bitcoin/deps -svn checkout http://svn.wxwidgets.org/svn/wx/wxWidgets/trunk wxWidgets-trunk - -This will make a wxWidgets-trunk directory in deps. - -Use this script snippet, change your prefix to whatever your dir is: - -PREFIX=~/bitcoin/deps -SRCDIR="$PREFIX/wxWidgets-trunk" -BUILDDIR="$SRCDIR/macbuild" - -cd "$PREFIX" && -#svn checkout http://svn.wxwidgets.org/svn/wx/wxWidgets/trunk wxWidgets-trunk && -cd "$SRCDIR" && - -[ -f include/wx/hashmap.h.orig ] || cp include/wx/hashmap.h include/wx/hashmap.h.orig && -sed 's/if wxUSE_STL/if 0 \&\& wxUSE_STL/g' < include/wx/hashmap.h.orig > include/wx/hashmap.h && - -[ -f include/wx/hashset.h.orig ] || cp include/wx/hashset.h include/wx/hashset.h.orig && -sed 's/if wxUSE_STL/if 0 \&\& wxUSE_STL/g' < include/wx/hashset.h.orig > include/wx/hashset.h && - - - -rm -vrf "$BUILDDIR" && -mkdir "$BUILDDIR" && -cd "$BUILDDIR" && - -../configure --prefix="$PREFIX" \ ---with-osx_cocoa \ ---disable-shared \ ---disable-debug_flag \ ---with-macosx-version-min=10.5 \ ---enable-stl \ ---enable-utf8 \ ---enable-universal_binary \ ---with-libjpeg=builtin \ ---with-libpng=builtin \ ---with-regex=builtin \ ---with-libtiff=builtin \ ---with-zlib=builtin \ ---with-expat=builtin \ ---with-macosx-sdk=/Developer/SDKs/MacOSX10.5.sdk && - - -find . -name Makefile | -while read i; do - echo $i; - sed 's/-arch i386/-arch i386 -arch x86_64/g' < "$i" > "$i".new && - mv "$i" "$i".old && - mv "$i".new "$i"; -done - - - -make && -make install - - - -Now you should be able to build bitcoin +Now you should be able to build bitcoind: cd ~/bitcoin/src -make -f makefile.osx bitcoin - -Before you can run it, you need to create an application bundle for Mac OS. - -A bundle is provided in contrib/Bitcoin.app. - -Copy the bitcoin binary in to it like this: - cp -pR ~/bitcoin/bitcoin/contrib/Bitcoin.app ~/bitcoin/ - cp ~/bitcoin/src/bitcoin ~/bitcoin/Bitcoin.app/Contents/MacOS/ - -To run it you can just click the Bitcoin.app in Finder, or just do: -open ~/bitcoin/Bitcoin.app - -If you want to run it with arguments you can just run it without backgrounding -by specifying the full name in terminal: - -~/bitcoin/Bitcoin.app/Contents/MacOS/bitcoin -addnode=192.75.207.66 - -You can also run it with arguments in the background with output going to the -normal places for apps (Console) like this: - -open ~/bitcoin/Bitcoin.app --args -connect=192.75.207.66 - -It is advisable to relocate Bitcoin.app to /Applications or $HOME/Applications. - +make -f makefile.osx bitcoind diff --git a/doc/build-unix.txt b/doc/build-unix.txt index e608c25f0..b7aa7112b 100644 --- a/doc/build-unix.txt +++ b/doc/build-unix.txt @@ -1,4 +1,5 @@ Copyright (c) 2009-2010 Satoshi Nakamoto +Copyright (c) 2011 Bitcoin Developers Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php. This product includes software developed by the OpenSSL Project for use in @@ -14,16 +15,14 @@ To Build -------- cd src/ +make -f makefile.unix # Headless bitcoin -make -f makefile.unix # Bitcoin with wxWidgets GUI - or -make -f makefile.unix bitcoind # Headless bitcoin - +See readme-qt.rst for instructions on building Bitcoin QT, +the graphical bitcoin. Dependencies ------------ sudo apt-get install build-essential -sudo apt-get install libgtk2.0-dev sudo apt-get install libssl-dev sudo apt-get install libdb4.8-dev sudo apt-get install libdb4.8++-dev @@ -32,12 +31,6 @@ or Boost 1.37: sudo apt-get install libboost1.37-dev If using Boost 1.37, append -mt to the boost libraries in the makefile. -Requires wxWidgets 2.9.1 or newer. - -You need to download wxWidgets from http://www.wxwidgets.org/downloads/ -and build it yourself. See the build instructions and configure parameters -below. - Requires miniupnpc for UPnP port mapping. It can be downloaded from http://miniupnp.tuxfamily.org/files/. UPnP support is compiled in and turned off by default. Set USE_UPNP to a different value to control this: @@ -46,7 +39,6 @@ USE_UPNP=0 (the default) UPnP support turned off by default at runtime; USE_UPNP=1 UPnP support turned on by default at runtime. Licenses of statically linked libraries: -wxWidgets LGPL 2.1 with very liberal exceptions Berkeley DB New BSD license with additional requirement that linked software must be free open source Boost MIT-like license miniupnpc New (3-clause) BSD license @@ -54,7 +46,6 @@ miniupnpc New (3-clause) BSD license Versions used in this release: GCC 4.3.3 OpenSSL 0.9.8g -wxWidgets 2.9.2 Berkeley DB 4.8.30.NC Boost 1.37 miniupnpc 1.6 @@ -62,28 +53,10 @@ miniupnpc 1.6 Notes ----- -The UI layout is edited with wxFormBuilder. The project file is -uiproject.fbp. It generates uibase.cpp and uibase.h, which define base -classes that do the rote work of constructing all the UI elements. - The release is built with GCC and then "strip bitcoin" to strip the debug symbols, which reduces the executable size by about 90%. -wxWidgets ---------- -cd /usr/local -tar -xzvf wxWidgets-2.9.2.tar.gz -cd wxWidgets-2.9.2 -mkdir buildgtk -cd buildgtk -../configure --with-gtk --enable-debug --disable-shared --enable-monolithic --without-libpng --disable-svg -make -sudo su -make install -ldconfig - - miniupnpc --------- tar -xzvf miniupnpc-1.6.tar.gz From 36eccc5174fab77783a242b5da68c3045c65d811 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Mon, 26 Sep 2011 13:14:34 -0400 Subject: [PATCH 15/18] Output build temp files in build/ instead of current directory. --- .gitignore | 3 --- bitcoin-qt.pro | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index a5f96ba44..66f93867d 100644 --- a/.gitignore +++ b/.gitignore @@ -10,10 +10,7 @@ src/bitcoind *.patch .bitcoin #compilation and Qt preprocessor part -*.o -ui_*.h *.qm -moc_* Makefile bitcoin-qt #resources cpp diff --git a/bitcoin-qt.pro b/bitcoin-qt.pro index 19d7814d3..b9fecb848 100644 --- a/bitcoin-qt.pro +++ b/bitcoin-qt.pro @@ -5,6 +5,10 @@ DEFINES += QT_GUI # DEFINES += SSL CONFIG += no_include_pwd +OBJECTS_DIR = build +MOC_DIR = build +UI_DIR = build + # for boost 1.37, add -mt to the boost libraries LIBS += -lssl -lcrypto -ldb_cxx unix:!macx:LIBS += -lboost_system -lboost_filesystem -lboost_program_options -lboost_thread From 13945b2a61328069592adcec4ec4990d63394d55 Mon Sep 17 00:00:00 2001 From: Alex Waters Date: Mon, 26 Sep 2011 22:22:19 -0400 Subject: [PATCH 16/18] Updated readme file with timers. --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 99710bc86..0c475ea6c 100644 --- a/README.md +++ b/README.md @@ -27,3 +27,16 @@ help test the Bitcoin core, please contact QA@BitcoinTesting.org. Feature branches are created when there are major new features being worked on by several people. + +From time to time a pull request will become outdated. If this occurs, and +the pull is no longer automatically mergeable; a comment on the pull will +be used to issue a warning of closure. The pull will be closed 15 days +after the warning if action is not taken by the author. Pull requests closed +in this manner will have their corresponding issue labeled 'stagnant'. + +Issues with no commits will be given a similar warning, and closed after +15 days from their last activity. Issues closed in this manner will be +labeled 'stale'. + +Requests to reopen closed pull requests and/or issues can be submitted to +QA@BitcoinTesting.org. \ No newline at end of file From a8c108bca1a2e67bd7c335119d9b04c87552c159 Mon Sep 17 00:00:00 2001 From: Gavin Andresen Date: Tue, 27 Sep 2011 11:19:57 -0400 Subject: [PATCH 17/18] Remove DoS penalty for SigOpCount or immature transactions --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index be6fc9c53..f129d7c7b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -364,7 +364,7 @@ bool CTransaction::AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs, bool* pfMi // 34 bytes because a TxOut is: // 20-byte address + 8 byte bitcoin amount + 5 bytes of ops + 1 byte script length if (GetSigOpCount() > nSize / 34 || nSize < 100) - return DoS(10, error("AcceptToMemoryPool() : transaction with out-of-bounds SigOpCount")); + return error("AcceptToMemoryPool() : transaction with out-of-bounds SigOpCount"); // Rather not work on nonstandard transactions (unless -testnet) if (!fTestNet && !IsStandard()) @@ -864,7 +864,7 @@ bool CTransaction::ConnectInputs(CTxDB& txdb, map& mapTestPoo if (txPrev.IsCoinBase()) for (CBlockIndex* pindex = pindexBlock; pindex && pindexBlock->nHeight - pindex->nHeight < COINBASE_MATURITY; pindex = pindex->pprev) if (pindex->nBlockPos == txindex.pos.nBlockPos && pindex->nFile == txindex.pos.nFile) - return DoS(10, error("ConnectInputs() : tried to spend coinbase at depth %d", pindexBlock->nHeight - pindex->nHeight)); + return error("ConnectInputs() : tried to spend coinbase at depth %d", pindexBlock->nHeight - pindex->nHeight); // Skip ECDSA signature verification when connecting blocks (fBlock=true) during initial download // (before the last blockchain checkpoint). This is safe because block merkle hashes are From 45723584c5da2fa1070001fbcdf2301013338a6e Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Wed, 28 Sep 2011 11:19:09 -0400 Subject: [PATCH 18/18] Update release-process.txt with gitian release instructions. --- doc/release-process.txt | 55 +++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 8 deletions(-) diff --git a/doc/release-process.txt b/doc/release-process.txt index 2e8b93e11..ff00b121f 100644 --- a/doc/release-process.txt +++ b/doc/release-process.txt @@ -23,17 +23,26 @@ * perform gitian builds - * From the bitcoin source dir - $ cd ../gitian-builder - $ ./bin/gbuild --commit bitcoin=v0.3.23 ../bitcoin/contrib/gitian.yml - $ ./bin/gbuild --commit bitcoin=v0.3.23 ../bitcoin/contrib/gitian-win32.yml + * From a directory containing the bitcoin source, gitian-builder and bitcoin-gitian-sigs + $ export VERSION=0.3.23 + $ cd ./gitian-builder + $ ./bin/gbuild --commit bitcoin=v$VERSION ../bitcoin/contrib/gitian-descriptors/gitian.yml + $ ./bin/gsign --signer (your gitian key, ie bluematt, sipa, etc) --release $VERSION --destination ../bitcoin-gitian-sigs/ ../bitcoin/contrib/gitian-descriptors/gitian.yml + $ cd build/out + $ zip bitcoin-$VERSION-linux-gitian.zip * + $ mv bitcoin-$VERSION-linux-gitian.zip ../../ + $ ./bin/gbuild --commit bitcoin=v$VERSION ../bitcoin/contrib/gitian-descriptors/gitian-win32.yml + $ ./bin/gsign --signer (your gitian key, ie bluematt, sipa, etc) --release $VERSION-win32 --destination ../bitcoin-gitian-sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-win32.yml + $ cd build/out + $ zip bitcoin-$VERSION-win32-gitian.zip * + $ mv bitcoin-$VERSION-win32-gitian.zip ../../ Build output expected: - 1. linux 32-bit and 64-bit binaries + source - 2. windows 32-bit binary + source - 3. windows installer + 1. linux 32-bit and 64-bit binaries + source (bitcoin-$VERSION-linux-gitian.zip) + 2. windows 32-bit binary, installer + source (bitcoin-$VERSION-win32-gitian.zip) + 3. Gitian signatures (in bitcoin-gitian-sigs/$VERSION[-win32]/(your gitian key)/ -* repackage gitian builds: +* repackage gitian builds for release as stand-alone zip/tar/installer exe * Windows .zip and setup.exe: $ mkdir bitcoin-$VERSION-win32 @@ -66,4 +75,34 @@ * update wiki download links +* release gitian-signed gitian archives + + * Collect enough gitian signatures to meet minimum_weight (see contrib/gitian-downloader/*-download-config) + + * From a directory containing bitcoin source, bitcoin-gitian-sigs and gitian zips + $ export VERSION=0.3.23 + $ mkdir bitcoin-$VERSION-win32-gitian; cd bitcoin-$VERSION-win32-gitian + $ unzip ../bitcoin-$VERSION-win32-gitian.zip + $ mkdir gitian + $ cp ../bitcoin/contrib/gitian-downloader/*.pgp ./gitian/ + $ for file in `ls ../bitcoin-gitian-sigs/$VERSION-win32/`; do + $ cp ../bitcoin-gitian-sigs/$VERSION-win32/$file/bitcoin-build.assert ./gitian/$file-build.assert + $ cp ../bitcoin-gitian-sigs/$VERSION-win32/$file/bitcoin-build.assert.sig ./gitian/$file-build.assert.sig + $ done + $ zip bitcoin-$VERSION-win32-gitian.zip * + $ cp bitcoin-$VERSION-win32-gitian.zip ../ + $ cd .. + $ mkdir bitcoin-$VERSION-linux-gitian; cd bitcoin-$VERSION-linux-gitian + $ unzip ../bitcoin-$VERSION-linux-gitian.zip + $ mkdir gitian + $ cp ../bitcoin/contrib/gitian-downloader/*.pgp ./gitian/ + $ for file in `ls ../bitcoin-gitian-sigs/$VERSION/`; do + $ cp ../bitcoin-gitian-sigs/$VERSION/$file/bitcoin-build.assert ./gitian/$file-build.assert + $ cp ../bitcoin-gitian-sigs/$VERSION/$file/bitcoin-build.assert.sig ./gitian/$file-build.assert.sig + $ done + $ zip bitcoin-$VERSION-linux-gitian.zip * + $ cp bitcoin-$VERSION-linux-gitian.zip ../ + + * Upload gitian zips to SF +