Bitcoin Forum
May 27, 2017, 04:45:17 AM *
News: Latest stable version of Bitcoin Core: 0.14.1  [Torrent]. (New!)
 
   Home   Help Search Donate Login Register  
Pages: « 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 »
  Print  
Author Topic: Pywallet 2.2: manage your wallet [Update required]  (Read 157497 times)
jackjack
Legendary
*
Offline Offline

Activity: 1036


May Bitcoin be touched by his Noodly Appendage


View Profile
April 09, 2013, 07:05:00 PM
 #161

Oh I see, Google was actually helpful then
Well, not many people uses pywallet on mac and I don't have one

It's a valid suggestion though, it's put on the list

Own address: 19QkqAza7BHFTuoz9N8UQkryP4E9jHo4N3 - Pywallet support: 1AQDfx22pKGgXnUZFL1e4UKos3QqvRzNh5 - Bitcointalk++ script support: 1Pxeccscj1ygseTdSV1qUqQCanp2B2NMM2
Pywallet: instructions. Encrypted wallet support, export/import keys/addresses, backup wallets, export/import CSV data from/into wallet, merge wallets, delete/import addresses and transactions, recover altcoins sent to bitcoin addresses, sign/verify messages and files with Bitcoin addresses, recover deleted wallets, etc.
1495860317
Hero Member
*
Offline Offline

Posts: 1495860317

View Profile Personal Message (Offline)

Ignore
1495860317
Reply with quote  #2

1495860317
Report to moderator
POLONIEX TRADING SIGNALS
+50% Profit and more via TELEGRAM
ALTCOINTRADER.CO
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction. Advertise here.
1495860317
Hero Member
*
Offline Offline

Posts: 1495860317

View Profile Personal Message (Offline)

Ignore
1495860317
Reply with quote  #2

1495860317
Report to moderator
1495860317
Hero Member
*
Offline Offline

Posts: 1495860317

View Profile Personal Message (Offline)

Ignore
1495860317
Reply with quote  #2

1495860317
Report to moderator
dserrano5
Legendary
*
Offline Offline

Activity: 1820



View Profile
April 10, 2013, 01:23:21 PM
 #162

I'm using "Delete a key from your wallet" in the web UI to delete a private key(*) and, although I get a message telling that the operation was successful and 1 key was deleted, it still appears in the output of --dumpwallet. I expected the key to be absent from the --dumpwallet output. Did I neglect any step?


(*) It's a throwaway one that I generated in bitaddress and imported just to test that bitcoind could import compressed private keys. I published it in the forum so I don't want to keep it in my wallet lest any funds end up there for any reason.

jackjack
Legendary
*
Offline Offline

Activity: 1036


May Bitcoin be touched by his Noodly Appendage


View Profile
April 10, 2013, 02:08:49 PM
 #163

Did you put the bitcoin address? (Not pub key nor priv key)
Are you sure you delete from, and dump the same wallet?

Own address: 19QkqAza7BHFTuoz9N8UQkryP4E9jHo4N3 - Pywallet support: 1AQDfx22pKGgXnUZFL1e4UKos3QqvRzNh5 - Bitcointalk++ script support: 1Pxeccscj1ygseTdSV1qUqQCanp2B2NMM2
Pywallet: instructions. Encrypted wallet support, export/import keys/addresses, backup wallets, export/import CSV data from/into wallet, merge wallets, delete/import addresses and transactions, recover altcoins sent to bitcoin addresses, sign/verify messages and files with Bitcoin addresses, recover deleted wallets, etc.
dserrano5
Legendary
*
Offline Offline

Activity: 1820



View Profile
April 10, 2013, 03:04:52 PM
 #164

Did you put the bitcoin address? (Not pub key nor priv key)

First I tried with the privkey but got a message "success, deleted 0 keys". It was when I tried the address that I got "success, deleted 1 key".


Are you sure you delete from, and dump the same wallet?

Yes. But let me do it for a third time and I'll report back (will take some hours though).

jackjack
Legendary
*
Offline Offline

Activity: 1036


May Bitcoin be touched by his Noodly Appendage


View Profile
April 10, 2013, 09:12:16 PM
 #165

I'm sorry but I can't reproduce your problem
Check that:
  • you have the last version of pywallet (should be 1.9.3 or 1.9.4)
  • pywallet returns "key:1Pc6N7aDoxxxxxxx has been successfully deleted from /home/xxx/.bitcoin/wallet.dat, resulting in 2 deleted items"
  • you're dumping the wallet that from which you deleted a key (already said I know)



Btw, it's slower than expected but the new version isn't forgotten, I'm working on it

Own address: 19QkqAza7BHFTuoz9N8UQkryP4E9jHo4N3 - Pywallet support: 1AQDfx22pKGgXnUZFL1e4UKos3QqvRzNh5 - Bitcointalk++ script support: 1Pxeccscj1ygseTdSV1qUqQCanp2B2NMM2
Pywallet: instructions. Encrypted wallet support, export/import keys/addresses, backup wallets, export/import CSV data from/into wallet, merge wallets, delete/import addresses and transactions, recover altcoins sent to bitcoin addresses, sign/verify messages and files with Bitcoin addresses, recover deleted wallets, etc.
dserrano5
Legendary
*
Offline Offline

Activity: 1820



View Profile
April 11, 2013, 09:29:44 AM
 #166

I'm sorry but I can't reproduce your problem
Check that:
  • you have the last version of pywallet (should be 1.9.3 or 1.9.4)
  • pywallet returns "key:1Pc6N7aDoxxxxxxx has been successfully deleted from /home/xxx/.bitcoin/wallet.dat, resulting in 2 deleted items"
  • you're dumping the wallet that from which you deleted a key (already said I know)

I wasn't using the latest version, but 2.0b9 from march (commit 278c6e0). However, this is getting interesting:

Code:
$ pgrep -lf bitco
$ grep ^pywver pywallet.py
pywversion="1.9.3"
$ cp /home/btc/.bitcoin/wallet.dat /some/backup
$ read -s P
$ ./pywallet.py --passphrase="$P" --dumpwallet &>wallet-dump1
$ xxd /home/btc/.bitcoin/wallet.dat >wallet-hex1
$ grep 1BLre3Uv7Xxh5XgYa8NXbS7ZYTXBuyCfiK wallet-dump1
            "addr": "1BLre3Uv7Xxh5XgYa8NXbS7ZYTXBuyCfiK",

That is the address I want to delete. Now I run "./pywallet.py --web" and submit the "Delete a key from your wallet" form with this data (copy-pasted here):

Code:
Wallet Directory: /home/btc/.bitcoin
Wallet Filename: wallet.dat
Key: 1BLre3Uv7Xxh5XgYa8NXbS7ZYTXBuyCfiK
Type: Bitcoin address

key:1BLre3Uv7Xxh5XgYa8NXbS7ZYTXBuyCfiK has been successfully deleted from /home/btc/.bitcoin/wallet.dat, resulting in 0 deleted item

Python isn't my native tongue but after managing to tweak the code a bit:

Code:
$ git diff
diff --git a/pywallet.py b/pywallet.py
index 45370e0..c6bbdb2 100755
--- a/pywallet.py
+++ b/pywallet.py
@@ -1781,16 +1781,19 @@ def delete_from_wallet(db_env, walletfile, typedel, keydel):
                elif typedel == "key":
                        if type == "key":
                                if keydel == public_key_to_bc_address(kds.read_bytes(kds.read_compact_size())):
+                                       print "ok deleting key %s of type key" % key
                                        db.delete(key)
                                        deleted_items+=1
                        elif type == "pool":
                                vds.read_int32()
                                vds.read_int64()
                                if keydel == public_key_to_bc_address(vds.read_bytes(vds.read_compact_size())):
+                                       print "ok deleting key %s of type pool" % key
                                        db.delete(key)
                                        deleted_items+=1
                        elif type == "name":
                                if keydel == kds.read_string():
+                                       print "ok deleting key %s of type name" % key
                                        db.delete(key)
                                        deleted_items+=1

I don't get any of those lines in stdout:

Code:
$ ./pywallet.py --web
'ecdsa' package is not installed, pywallet won't be able to sign/verify messages
2013-04-11 11:11:57+0200 [-] Log opened.
2013-04-11 11:11:57+0200 [-] Starting server: 2013-04-11 11:11:57.506397
2013-04-11 11:11:57+0200 [-] twisted.web.server.Site starting on 8989
2013-04-11 11:11:57+0200 [-] Starting factory <twisted.web.server.Site instance at 0x2c18a70>
2013-04-11 11:12:11+0200 [HTTPChannel,0,127.0.0.1] 127.0.0.1 - - [11/Apr/2013:09:12:10 +0000] "GET / HTTP/1.1" 200 29750 "http://localhost:8989/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0"
2013-04-11 11:12:18+0200 [HTTPChannel,0,127.0.0.1] 127.0.0.1 - - [11/Apr/2013:09:12:17 +0000] "GET /Delete?dir=/home/btc/.bitcoin&name=wallet.dat&keydel=1BLre3Uv7Xxh5XgYa8NXbS7ZYTXBuyCfiK&typedel=key HTTP/1.1" 200 132 "http://localhost:8989/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0"
^C2013-04-11 11:12:31+0200 [-] Received SIGINT, shutting down.
2013-04-11 11:12:31+0200 [twisted.web.server.Site] (Port 8989 Closed)
2013-04-11 11:12:31+0200 [twisted.web.server.Site] Stopping factory <twisted.web.server.Site instance at 0x2c18a70>
2013-04-11 11:12:31+0200 [-] Main loop terminated.

In fact:

Code:
$ ./pywallet.py --passphrase="$P" --dumpwallet &>wallet-dump2
$ xxd /home/btc/.bitcoin/wallet.dat >wallet-hex2
$ md5sum wallet-*
fdffc13c2ee830e46b6b33ea8629ea10  wallet-dump1
fdffc13c2ee830e46b6b33ea8629ea10  wallet-dump2
db862daf9579568a9fcdfba2cd6378b4  wallet-hex1
db862daf9579568a9fcdfba2cd6378b4  wallet-hex2

Something I didn't say yesterday because I didn't think it would have something to do, is the contents of the "reserve" field in the wallet:

Code:
$ less wallet-dump1    ## trimmed output
{
    "keys": [
            "addr": "1BLre3Uv7Xxh5XgYa8NXbS7ZYTXBuyCfiK",
            "compressed": true,
            "encrypted_privkey": "2d4a14267d220fce36d7c48df789561797743c29cf750ef5a5234faa7ab178ed8ef4e113771bdb9fe3aa4b0c2a94e9e
9",                                                                                                                                          "pubkey": "02e34a2cc7ee8694cd943d58b222a82e181741002151378820216f6e330cee4c31",
            "reserve": 1,
            "sec": "KxKs8MzyCZ7ufjGsvZNUJtEF9dxuV12geRfM5KCMRofmFXWhbuVr",
            "secret": "2100db5080ec709e0e015d669808111de6f5e9c0e8425f126dce4dc1cd8f520601"
        },

I could swear that "reserve" was 0 before I tried to delete the key for the first time, and maybe turned into one when I got the "success, 1 key deleted" message. Can this be the reason that today pywallet isn't able to show at least the "1 deleted" message?

I'd be happy to be able to --dumpwallet into a file, edit that file and then --importdump or something like that.

jackjack
Legendary
*
Offline Offline

Activity: 1036


May Bitcoin be touched by his Noodly Appendage


View Profile
April 11, 2013, 09:56:17 AM
 #167

Wow what the actual fuck?

Well, first things first
I'd be happy to be able to --dumpwallet into a file, edit that file and then --importdump or something like that.
You can: this then that

About your "reserve" finding: I think it was 1 before, then 0 after
If so, the 'delete' function deleted the address from the pool, hence the 1 key deleted

But I just found the problem!
Line 1782: change 'if type == "key":' to 'if type == "key" or type == "ckey":'
Must do the trick

Own address: 19QkqAza7BHFTuoz9N8UQkryP4E9jHo4N3 - Pywallet support: 1AQDfx22pKGgXnUZFL1e4UKos3QqvRzNh5 - Bitcointalk++ script support: 1Pxeccscj1ygseTdSV1qUqQCanp2B2NMM2
Pywallet: instructions. Encrypted wallet support, export/import keys/addresses, backup wallets, export/import CSV data from/into wallet, merge wallets, delete/import addresses and transactions, recover altcoins sent to bitcoin addresses, sign/verify messages and files with Bitcoin addresses, recover deleted wallets, etc.
dserrano5
Legendary
*
Offline Offline

Activity: 1820



View Profile
April 11, 2013, 10:27:11 AM
 #168

I'd be happy to be able to --dumpwallet into a file, edit that file and then --importdump or something like that.
You can: this then that

I had read about that but somehow I got the impression that I would lose the transactions stored in the wallet. I am totally and utterly wrong, no? Smiley


Line 1782: change 'if type == "key":' to 'if type == "key" or type == "ckey":'
Must do the trick

Yeah that did it, thank you! The second dump shows an unhandled exception without any additional info:

Code:
$ diff -U2 wallet-dump{1,2}
--- wallet-dump1 2013-04-11 12:13:22.029680350 +0200
+++ wallet-dump2 2013-04-11 12:14:42.028662746 +0200
@@ -22,13 +22,4 @@
         },
         {
-            "addr": "1BLre3Uv7Xxh5XgYa8NXbS7ZYTXBuyCfiK",
-            "compressed": true,
-            "encrypted_privkey": "2d4a14267d220fce36d7c48df789561797743c29cf750ef5a5234faa7ab178ed8ef4e113771bdb9fe3aa4b0c2a94e9e9",
-            "pubkey": "02e34a2cc7ee8694cd943d58b222a82e181741002151378820216f6e330cee4c31",
-            "reserve": 1,
-            "sec": "KxKs8MzyCZ7ufjGsvZNUJtEF9dxuV12geRfM5KCMRofmFXWhbuVr",
-            "secret": "2100db5080ec709e0e015d669808111de6f5e9c0e8425f126dce4dc1cd8f520601"
-        },
-        {
             "addr": "1L7aZRwhW3Kku66mMxi9NH5z6UUymEZ9im",
             "compressed": false,
@@ -35882,2 +35873,6 @@
     "version": 80000
 }
+Unhandled exception in thread started by
+Error in sys.excepthook:
+
+Original exception was:

jackjack
Legendary
*
Offline Offline

Activity: 1036


May Bitcoin be touched by his Noodly Appendage


View Profile
April 11, 2013, 12:42:05 PM
 #169

I had read about that but somehow I got the impression that I would lose the transactions stored in the wallet. I am totally and utterly wrong, no? Smiley
It's true that you'll lose the transactions but a rescan is rather quick, isn't it?

Yeah that did it, thank you! The second dump shows an unhandled exception without any additional info:
Yeah it happens sometimes. I didn't look at this matter closely as it doesn't seem serious.

Own address: 19QkqAza7BHFTuoz9N8UQkryP4E9jHo4N3 - Pywallet support: 1AQDfx22pKGgXnUZFL1e4UKos3QqvRzNh5 - Bitcointalk++ script support: 1Pxeccscj1ygseTdSV1qUqQCanp2B2NMM2
Pywallet: instructions. Encrypted wallet support, export/import keys/addresses, backup wallets, export/import CSV data from/into wallet, merge wallets, delete/import addresses and transactions, recover altcoins sent to bitcoin addresses, sign/verify messages and files with Bitcoin addresses, recover deleted wallets, etc.
Dabs
Staff
Legendary
*
Offline Offline

Activity: 1694



View Profile
April 11, 2013, 01:08:47 PM
 #170

What happened to the import public key? (with a bogus private key; this is for encrypted wallets only.)

Escrow Service (Services) - GPG ID: 32AD7565, OTC ID: Dabs
All messages concerning escrow or with bitcoin addresses are GPG signed. Please verify.
CompTIA A+, Microsoft Certified Professional, MCSA: Windows 10; Windows Server 2012, MCSE: Cloud Platform and Infrastructure; Productivity; Messaging
jackjack
Legendary
*
Offline Offline

Activity: 1036


May Bitcoin be touched by his Noodly Appendage


View Profile
April 11, 2013, 02:28:07 PM
 #171

Oh yeah I forgot to test that

I just looked at the code and... erm... before importing a private key in an encrypted wallet I don't check if it's the right one (-> todo list'd)
So it makes things easier to test:
  • create a dummy encrypted wallet
  • pywallet.py --importhex --importprivkey 0123456789012345678901234567890123456789012345678901234567890123 --passphrase anything_that_is_not_the_correct_passphrase
That should import the address corresponding to 01234... but with the bad encrypted private key
See what then happens (I can't test right now)

Own address: 19QkqAza7BHFTuoz9N8UQkryP4E9jHo4N3 - Pywallet support: 1AQDfx22pKGgXnUZFL1e4UKos3QqvRzNh5 - Bitcointalk++ script support: 1Pxeccscj1ygseTdSV1qUqQCanp2B2NMM2
Pywallet: instructions. Encrypted wallet support, export/import keys/addresses, backup wallets, export/import CSV data from/into wallet, merge wallets, delete/import addresses and transactions, recover altcoins sent to bitcoin addresses, sign/verify messages and files with Bitcoin addresses, recover deleted wallets, etc.
dserrano5
Legendary
*
Offline Offline

Activity: 1820



View Profile
April 11, 2013, 02:33:17 PM
 #172

It's true that you'll lose the transactions but a rescan is rather quick, isn't it?

Ah, I didn't know that a rescan repopulated the wallet with the transactions. I thought the client added each transaction at broadcast time and that was all.

jackjack
Legendary
*
Offline Offline

Activity: 1036


May Bitcoin be touched by his Noodly Appendage


View Profile
April 11, 2013, 02:58:17 PM
 #173

It's true that you'll lose the transactions but a rescan is rather quick, isn't it?

Ah, I didn't know that a rescan repopulated the wallet with the transactions. I thought the client added each transaction at broadcast time and that was all.
Nope, during a rescan the client reads all the blockchain and repopulate the wallet.
The "issue" is that you lose your unbroadcasted transactions. But it can be used when you made a transaction that won't never be include in a block for example.

Own address: 19QkqAza7BHFTuoz9N8UQkryP4E9jHo4N3 - Pywallet support: 1AQDfx22pKGgXnUZFL1e4UKos3QqvRzNh5 - Bitcointalk++ script support: 1Pxeccscj1ygseTdSV1qUqQCanp2B2NMM2
Pywallet: instructions. Encrypted wallet support, export/import keys/addresses, backup wallets, export/import CSV data from/into wallet, merge wallets, delete/import addresses and transactions, recover altcoins sent to bitcoin addresses, sign/verify messages and files with Bitcoin addresses, recover deleted wallets, etc.
dserrano5
Legendary
*
Offline Offline

Activity: 1820



View Profile
April 11, 2013, 07:23:33 PM
 #174

Thanks for all the insights, and for pywallet of course!

jackjack
Legendary
*
Offline Offline

Activity: 1036


May Bitcoin be touched by his Noodly Appendage


View Profile
April 12, 2013, 09:57:30 AM
 #175

Thanks!  Smiley


To everybody: I pushed the new version, can you check that pywallet tells you there's an update? and that auto-update works?

Own address: 19QkqAza7BHFTuoz9N8UQkryP4E9jHo4N3 - Pywallet support: 1AQDfx22pKGgXnUZFL1e4UKos3QqvRzNh5 - Bitcointalk++ script support: 1Pxeccscj1ygseTdSV1qUqQCanp2B2NMM2
Pywallet: instructions. Encrypted wallet support, export/import keys/addresses, backup wallets, export/import CSV data from/into wallet, merge wallets, delete/import addresses and transactions, recover altcoins sent to bitcoin addresses, sign/verify messages and files with Bitcoin addresses, recover deleted wallets, etc.
dserrano5
Legendary
*
Offline Offline

Activity: 1820



View Profile
April 12, 2013, 10:39:48 AM
 #176

I got the "out of date" message. Then clicked on it to upgrade and I got the standard Firefox error about being unable to connect. pywallet output is sane so I guess the Firefox message is normal:

Code:
2013-04-12 12:39:36+0200 [HTTPChannel,0,127.0.0.1] 127.0.0.1 - - [12/Apr/2013:10:39:35 +0000] "GET /?update=1 HTTP/1.1" 200 29750 "http://localhost:8989/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0"
2013-04-12 12:39:36+0200 [twisted.web.server.Site] (Port 8989 Closed)
2013-04-12 12:39:36+0200 [twisted.web.server.Site] Stopping factory <twisted.web.server.Site instance at 0x18d5950>
2013-04-12 12:39:36+0200 [-] Main loop terminated.

Did a ./pywallet.py again and now it reports being up to date.

jackjack
Legendary
*
Offline Offline

Activity: 1036


May Bitcoin be touched by his Noodly Appendage


View Profile
April 12, 2013, 11:09:28 AM
 #177

Great, so that works
It's true I should add a little message to say everything happened as expected

Own address: 19QkqAza7BHFTuoz9N8UQkryP4E9jHo4N3 - Pywallet support: 1AQDfx22pKGgXnUZFL1e4UKos3QqvRzNh5 - Bitcointalk++ script support: 1Pxeccscj1ygseTdSV1qUqQCanp2B2NMM2
Pywallet: instructions. Encrypted wallet support, export/import keys/addresses, backup wallets, export/import CSV data from/into wallet, merge wallets, delete/import addresses and transactions, recover altcoins sent to bitcoin addresses, sign/verify messages and files with Bitcoin addresses, recover deleted wallets, etc.
dserrano5
Legendary
*
Offline Offline

Activity: 1820



View Profile
April 12, 2013, 11:37:12 AM
 #178

ADSL routers and the like have a piece of javascript or HTML META tag to refresh the page some time after instructing the router to reboot itself. That mechanism would fit nicely here.

K1773R
Legendary
*
Offline Offline

Activity: 1540


/dev/null


View Profile
April 12, 2013, 11:44:16 AM
 #179

ADSL routers and the like have a piece of javascript or HTML META tag to refresh the page some time after instructing the router to reboot itself. That mechanism would fit nicely here.
Code:
<META HTTP-EQUIV="REFRESH" CONTENT="5;URL=http://127.0.0.1:8989/">

[GPG Public Key]  [Devcoin Builds]  [BBQCoin Builds]  [Multichain Blockexplorer]  [Multichain Blockexplorer - PoS Coins]  [Ufasoft Miner Linux Builds]
BTC/DVC/TRC/FRC: 1K1773RbXRZVRQSSXe9N6N2MUFERvrdu6y ANC/XPM AK1773RTmRKtvbKBCrUu95UQg5iegrqyeA NMC: NK1773Rzv8b4ugmCgX789PbjewA9fL9Dy1 LTC: LKi773RBuPepQH8E6Zb1ponoCvgbU7hHmd EMC: EK1773RxUes1HX1YAGMZ1xVYBBRUCqfDoF BQC: bK1773R1APJz4yTgRkmdKQhjhiMyQpJgfN
jackjack
Legendary
*
Offline Offline

Activity: 1036


May Bitcoin be touched by his Noodly Appendage


View Profile
April 12, 2013, 11:51:51 AM
 #180

Yup good idea I'll put that soon


Code:
<META HTTP-EQUIV="REFRESH" CONTENT="5;URL=http://127.0.0.1:8989/">
That would work too right?
Code:
<META HTTP-EQUIV="REFRESH" CONTENT="5">

Own address: 19QkqAza7BHFTuoz9N8UQkryP4E9jHo4N3 - Pywallet support: 1AQDfx22pKGgXnUZFL1e4UKos3QqvRzNh5 - Bitcointalk++ script support: 1Pxeccscj1ygseTdSV1qUqQCanp2B2NMM2
Pywallet: instructions. Encrypted wallet support, export/import keys/addresses, backup wallets, export/import CSV data from/into wallet, merge wallets, delete/import addresses and transactions, recover altcoins sent to bitcoin addresses, sign/verify messages and files with Bitcoin addresses, recover deleted wallets, etc.
Pages: « 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 »
  Print  
 
Jump to:  

Sponsored by , a Bitcoin-accepting VPN.
Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!