From 133700160ab19a50d90b8a72fcf42f4092262915 Mon Sep 17 00:00:00 2001 From: dsc Date: Wed, 7 Oct 2020 12:36:04 +0200 Subject: [PATCH] Feather, a free Monero desktop wallet Co-Authored-By: tobtoht --- .dockerignore | 3 + .drone.yml | 160 + .gitignore | 15 + .gitmodules | 9 + BUILDING.md | 101 + CMakeLists.txt | 349 + Dockerfile | 307 + Dockerfile_appimage | 18 + Dockerfile_macos | 13 + Dockerfile_windows | 74 + HACKING.md | 104 + LICENSE | 28 + Makefile | 70 + README.md | 35 + SECURITY.md | 16 + cmake/32-bit-toolchain.cmake | 50 + cmake/64-bit-toolchain.cmake | 50 + cmake/CheckLinkerFlag.c | 14 + cmake/CheckLinkerFlag.cmake | 47 + cmake/CheckTrezor.cmake | 5 + cmake/Deploy.cmake | 28 + cmake/Doxyfile.in | 1803 ++++ cmake/Doxygen.extra.css.in | 14 + cmake/FindBacktrace.cmake | 98 + cmake/FindBerkeleyDB.cmake | 25 + cmake/FindCcache.cmake | 56 + cmake/FindGCrypt.cmake | 70 + cmake/FindHIDAPI.cmake | 0 cmake/FindLibunwind.cmake | 41 + cmake/FindMiniupnpc.cmake | 59 + cmake/FindQREncode.cmake | 7 + cmake/FindReadline.cmake | 91 + cmake/FindSodium.cmake | 291 + cmake/FindUnbound.cmake | 40 + cmake/FindZBar0.cmake | 22 + cmake/GenVersion.cmake | 65 + cmake/Version.cmake | 53 + cmake/VersionFeather.cmake | 39 + cmake/VersionMonero.cmake | 49 + cmake/config-feather.h.cmake | 10 + cmake/test-protobuf.cpp | 43 + cmake/test-protobuf.proto | 7 + cmake/test-static-assert.c | 34 + cmake/test-static-assert.cpp | 34 + contrib/Qt5.15_LinuxPatch.json | 2015 +++++ contrib/build-appimage.sh | 40 + contrib/build_tor.sh | 126 + contrib/tor | 1 + contrib/torsocks | 1 + contrib/torsocks_macos.patch | 53 + contrib/unbound_static.patch | 18 + monero | 1 + src/CMakeLists.txt | 216 + src/appcontext.cpp | 768 ++ src/appcontext.h | 172 + src/assets.qrc | 100 + src/assets/about.txt | 33 + src/assets/ack.txt | 10 + src/assets/contributors.txt | 5 + src/assets/feather.desktop | 14 + src/assets/images/appicons/128x128.png | Bin 0 -> 11725 bytes src/assets/images/appicons/256x256.png | Bin 0 -> 19715 bytes src/assets/images/appicons/32x32.png | Bin 0 -> 3276 bytes src/assets/images/appicons/48x48.png | Bin 0 -> 6529 bytes src/assets/images/appicons/64x64.png | Bin 0 -> 6951 bytes src/assets/images/appicons/64x64.png~ | Bin 0 -> 3436 bytes src/assets/images/appicons/96x96.png | Bin 0 -> 9415 bytes src/assets/images/appicons/appicon.icns | Bin 0 -> 64156 bytes src/assets/images/appicons/appicon.ico | Bin 0 -> 105517 bytes src/assets/images/appicons/monero.png | Bin 0 -> 6941 bytes src/assets/images/appicons/monero_grey.png | Bin 0 -> 4021 bytes src/assets/images/arrow.svg | 70 + src/assets/images/bitcoin.png | Bin 0 -> 8928 bytes src/assets/images/camera_dark.png | Bin 0 -> 687 bytes src/assets/images/camera_white.png | Bin 0 -> 1304 bytes src/assets/images/clock1.png | Bin 0 -> 7607 bytes src/assets/images/clock2.png | Bin 0 -> 8512 bytes src/assets/images/clock3.png | Bin 0 -> 7229 bytes src/assets/images/clock4.png | Bin 0 -> 7522 bytes src/assets/images/clock5.png | Bin 0 -> 10074 bytes src/assets/images/coins.png | Bin 0 -> 1217 bytes src/assets/images/coldcard.png | Bin 0 -> 528 bytes src/assets/images/coldcard_unpaired.png | Bin 0 -> 788 bytes src/assets/images/confirmed.png | Bin 0 -> 54212 bytes src/assets/images/confirmed.svg | 44 + src/assets/images/connect.svg | 71 + src/assets/images/copy.png | Bin 0 -> 2111 bytes src/assets/images/cutexmrfox.png | Bin 0 -> 44248 bytes src/assets/images/edit.png | Bin 0 -> 2364 bytes src/assets/images/exchange.png | Bin 0 -> 841 bytes src/assets/images/expired.png | Bin 0 -> 28522 bytes src/assets/images/eye1.png | Bin 0 -> 2910 bytes src/assets/images/feather.png | Bin 0 -> 75407 bytes src/assets/images/file.png | Bin 0 -> 4779 bytes src/assets/images/ghost.png | Bin 0 -> 130099 bytes src/assets/images/history.png | Bin 0 -> 25987 bytes src/assets/images/info.png | Bin 0 -> 1771 bytes src/assets/images/key.png | Bin 0 -> 5428 bytes src/assets/images/ledger.png | Bin 0 -> 2161 bytes src/assets/images/ledger_unpaired.png | Bin 0 -> 2140 bytes src/assets/images/lightning.png | Bin 0 -> 446 bytes src/assets/images/lock.png | Bin 0 -> 40380 bytes src/assets/images/lock.svg | 277 + src/assets/images/microphone.png | Bin 0 -> 199 bytes src/assets/images/network.png | Bin 0 -> 3031 bytes src/assets/images/offline_tx.png | Bin 0 -> 463 bytes src/assets/images/person.svg | 48 + src/assets/images/photos/1.png | Bin 0 -> 52988 bytes src/assets/images/preferences.png | Bin 0 -> 58005 bytes src/assets/images/preferences.svg | 686 ++ src/assets/images/qrcode.png | Bin 0 -> 314 bytes src/assets/images/qrcode_white.png | Bin 0 -> 380 bytes src/assets/images/revealer.png | Bin 0 -> 272 bytes src/assets/images/revealer_c.png | Bin 0 -> 1965 bytes src/assets/images/seal.png | Bin 0 -> 38276 bytes src/assets/images/seed.png | Bin 0 -> 10322 bytes src/assets/images/speaker.png | Bin 0 -> 392 bytes src/assets/images/status_connected.png | Bin 0 -> 71068 bytes src/assets/images/status_connected.svg | 173 + src/assets/images/status_connected_fork.png | Bin 0 -> 62949 bytes src/assets/images/status_connected_proxy.png | Bin 0 -> 69081 bytes src/assets/images/status_connected_proxy.svg | 173 + .../images/status_connected_proxy_fork.png | Bin 0 -> 60879 bytes src/assets/images/status_disconnected.png | Bin 0 -> 66105 bytes src/assets/images/status_disconnected.svg | 293 + src/assets/images/status_lagging.png | Bin 0 -> 74851 bytes src/assets/images/status_lagging.svg | 173 + src/assets/images/status_lagging_fork.png | Bin 0 -> 63949 bytes src/assets/images/status_waiting.png | Bin 0 -> 81206 bytes src/assets/images/status_waiting.svg | 398 + src/assets/images/tab_addresses.png | Bin 0 -> 886 bytes src/assets/images/tab_coins.png | Bin 0 -> 1592 bytes src/assets/images/tab_console.png | Bin 0 -> 824 bytes src/assets/images/tab_contacts.png | Bin 0 -> 1446 bytes src/assets/images/tab_history.png | Bin 0 -> 2182 bytes src/assets/images/tab_home.png | Bin 0 -> 8581 bytes src/assets/images/tab_party.png | Bin 0 -> 2386 bytes src/assets/images/tab_receive.png | Bin 0 -> 1873 bytes src/assets/images/tab_send.png | Bin 0 -> 1550 bytes src/assets/images/tab_settings.png | Bin 0 -> 20797 bytes src/assets/images/terminal.png | Bin 0 -> 15927 bytes src/assets/images/tor_logo.png | Bin 0 -> 2712 bytes src/assets/images/tor_logo_disabled.png | Bin 0 -> 16804 bytes src/assets/images/trezor.png | Bin 0 -> 2606 bytes src/assets/images/trezor_unpaired.png | Bin 0 -> 1950 bytes src/assets/images/unconfirmed.png | Bin 0 -> 3532 bytes src/assets/images/unlock.png | Bin 0 -> 45956 bytes src/assets/images/unlock.svg | 509 ++ src/assets/images/unpaid.png | Bin 0 -> 23805 bytes src/assets/images/update.png | Bin 0 -> 1580 bytes src/assets/images/warning.png | Bin 0 -> 4839 bytes src/assets/images/xmrto.png | Bin 0 -> 2060 bytes src/assets/images/xmrto_big.png | Bin 0 -> 24908 bytes src/assets/images/zoom.png | Bin 0 -> 11786 bytes src/assets/mnemonic_25_english.txt | 1626 ++++ src/assets/restore_heights_monero_mainnet.txt | 1457 ++++ .../restore_heights_monero_stagenet.txt | 444 + src/assets/user_agents.txt | 7477 +++++++++++++++++ src/assets_linux_tor.qrc | 5 + src/assets_macos_tor.qrc | 5 + src/assets_windows_tor.qrc | 5 + src/calcwidget.cpp | 145 + src/calcwidget.h | 40 + src/calcwidget.ui | 234 + src/calcwindow.cpp | 37 + src/calcwindow.h | 35 + src/calcwindow.ui | 49 + src/cli.cpp | 80 + src/cli.h | 42 + src/coinswidget.cpp | 231 + src/coinswidget.h | 76 + src/coinswidget.ui | 49 + src/components.cpp | 100 + src/components.h | 106 + src/contactswidget.cpp | 119 + src/contactswidget.h | 54 + src/contactswidget.ui | 53 + src/dialog/aboutdialog.cpp | 59 + src/dialog/aboutdialog.h | 28 + src/dialog/aboutdialog.ui | 111 + src/dialog/contactsdialog.cpp | 33 + src/dialog/contactsdialog.h | 31 + src/dialog/contactsdialog.ui | 88 + src/dialog/debuginfodialog.cpp | 96 + src/dialog/debuginfodialog.h | 30 + src/dialog/debuginfodialog.ui | 359 + src/dialog/keysdialog.cpp | 26 + src/dialog/keysdialog.h | 27 + src/dialog/keysdialog.ui | 178 + src/dialog/outputinfodialog.cpp | 45 + src/dialog/outputinfodialog.h | 28 + src/dialog/outputinfodialog.ui | 234 + src/dialog/outputsweepdialog.cpp | 41 + src/dialog/outputsweepdialog.h | 34 + src/dialog/outputsweepdialog.ui | 130 + src/dialog/passwordchangedialog.cpp | 38 + src/dialog/passwordchangedialog.h | 30 + src/dialog/passwordchangedialog.ui | 142 + src/dialog/qrcodedialog.cpp | 53 + src/dialog/qrcodedialog.h | 32 + src/dialog/qrcodedialog.ui | 93 + src/dialog/restoredialog.cpp | 38 + src/dialog/restoredialog.h | 39 + src/dialog/restoredialog.ui | 56 + src/dialog/seeddialog.cpp | 33 + src/dialog/seeddialog.h | 26 + src/dialog/seeddialog.ui | 117 + src/dialog/signverifydialog.cpp | 58 + src/dialog/signverifydialog.h | 33 + src/dialog/signverifydialog.ui | 89 + src/dialog/torinfodialog.cpp | 37 + src/dialog/torinfodialog.h | 32 + src/dialog/torinfodialog.ui | 84 + src/dialog/transactioninfodialog.cpp | 49 + src/dialog/transactioninfodialog.h | 31 + src/dialog/transactioninfodialog.ui | 169 + src/dialog/txconfdialog.cpp | 73 + src/dialog/txconfdialog.h | 33 + src/dialog/txconfdialog.ui | 175 + src/dialog/verifyproofdialog.cpp | 83 + src/dialog/verifyproofdialog.h | 34 + src/dialog/verifyproofdialog.ui | 373 + src/dialog/walletinfodialog.cpp | 39 + src/dialog/walletinfodialog.h | 30 + src/dialog/walletinfodialog.ui | 181 + src/dialog/xmrtoinfodialog.cpp | 37 + src/dialog/xmrtoinfodialog.h | 28 + src/dialog/xmrtoinfodialog.ui | 256 + src/historywidget.cpp | 116 + src/historywidget.h | 57 + src/historywidget.ui | 53 + src/libwalletqt/AddressBook.cpp | 137 + src/libwalletqt/AddressBook.h | 63 + src/libwalletqt/AddressBookInfo.cpp | 20 + src/libwalletqt/AddressBookInfo.h | 28 + src/libwalletqt/CMakeLists.txt | 2 + src/libwalletqt/Coins.cpp | 106 + src/libwalletqt/Coins.h | 52 + src/libwalletqt/CoinsInfo.cpp | 130 + src/libwalletqt/CoinsInfo.h | 91 + src/libwalletqt/PassphraseHelper.cpp | 45 + src/libwalletqt/PassphraseHelper.h | 49 + src/libwalletqt/PendingTransaction.cpp | 75 + src/libwalletqt/PendingTransaction.h | 65 + src/libwalletqt/Ring.h | 28 + src/libwalletqt/Subaddress.cpp | 80 + src/libwalletqt/Subaddress.h | 43 + src/libwalletqt/SubaddressAccount.cpp | 64 + src/libwalletqt/SubaddressAccount.h | 40 + src/libwalletqt/TransactionHistory.cpp | 211 + src/libwalletqt/TransactionHistory.h | 64 + src/libwalletqt/TransactionInfo.cpp | 175 + src/libwalletqt/TransactionInfo.h | 103 + src/libwalletqt/Transfer.h | 28 + src/libwalletqt/UnsignedTransaction.cpp | 95 + src/libwalletqt/UnsignedTransaction.h | 55 + src/libwalletqt/Wallet.cpp | 1074 +++ src/libwalletqt/Wallet.h | 459 + src/libwalletqt/WalletListenerImpl.cpp | 72 + src/libwalletqt/WalletListenerImpl.h | 43 + src/libwalletqt/WalletManager.cpp | 487 ++ src/libwalletqt/WalletManager.h | 204 + src/main.cpp | 161 + src/mainwindow.cpp | 1058 +++ src/mainwindow.h | 179 + src/mainwindow.ui | 571 ++ src/model/AddressBookModel.cpp | 176 + src/model/AddressBookModel.h | 50 + src/model/AddressBookProxyModel.cpp | 24 + src/model/AddressBookProxyModel.h | 28 + src/model/CCSModel.cpp | 100 + src/model/CCSModel.h | 42 + src/model/CMakeLists.txt | 4 + src/model/CoinsModel.cpp | 175 + src/model/CoinsModel.h | 54 + src/model/CoinsProxyModel.cpp | 18 + src/model/CoinsProxyModel.h | 26 + src/model/ModelUtils.cpp | 43 + src/model/ModelUtils.h | 18 + src/model/NodeModel.cpp | 103 + src/model/NodeModel.h | 40 + src/model/RedditModel.cpp | 104 + src/model/RedditModel.h | 41 + src/model/SubaddressAccountModel.cpp | 73 + src/model/SubaddressAccountModel.h | 39 + src/model/SubaddressModel.cpp | 168 + src/model/SubaddressModel.h | 54 + src/model/SubaddressProxyModel.cpp | 36 + src/model/SubaddressProxyModel.h | 38 + src/model/TransactionHistoryModel.cpp | 239 + src/model/TransactionHistoryModel.h | 65 + src/model/TransactionHistoryProxyModel.cpp | 43 + src/model/TransactionHistoryProxyModel.h | 31 + src/model/XmrToModel.cpp | 106 + src/model/XmrToModel.h | 38 + src/openpgp/CMakeLists.txt | 20 + src/openpgp/hash.h | 107 + src/openpgp/mpi.h | 78 + src/openpgp/openpgp.cpp | 382 + src/openpgp/openpgp.h | 127 + src/openpgp/packet_stream.h | 88 + src/openpgp/s_expression.h | 78 + src/openpgp/serialization.h | 172 + src/qrcode/CMakeLists.txt | 21 + src/qrcode/QrCode.cpp | 173 + src/qrcode/QrCode.h | 82 + src/qrcode/QrCode_p.h | 33 + src/receivewidget.cpp | 151 + src/receivewidget.h | 61 + src/receivewidget.ui | 107 + src/sendwidget.cpp | 183 + src/sendwidget.h | 56 + src/sendwidget.ui | 225 + src/settings.cpp | 122 + src/settings.h | 54 + src/settings.ui | 520 ++ src/tor/.gitkeep | 0 src/ui/BreezeStyleSheets/breeze.qrc | 89 + src/ui/BreezeStyleSheets/dark.qss | 1664 ++++ .../dark/branch_closed-on.svg | 3 + .../BreezeStyleSheets/dark/branch_closed.svg | 3 + .../BreezeStyleSheets/dark/branch_open-on.svg | 3 + src/ui/BreezeStyleSheets/dark/branch_open.svg | 3 + .../dark/checkbox_checked.svg | 5 + .../dark/checkbox_checked_disabled.svg | 5 + .../dark/checkbox_indeterminate.svg | 7 + .../dark/checkbox_indeterminate_disabled.svg | 7 + .../dark/checkbox_unchecked.svg | 4 + .../dark/checkbox_unchecked_disabled.svg | 4 + src/ui/BreezeStyleSheets/dark/close-hover.svg | 3 + .../BreezeStyleSheets/dark/close-pressed.svg | 3 + src/ui/BreezeStyleSheets/dark/close.svg | 3 + .../dark/down_arrow-hover.svg | 3 + src/ui/BreezeStyleSheets/dark/down_arrow.svg | 3 + .../dark/down_arrow_disabled.svg | 3 + .../BreezeStyleSheets/dark/hmovetoolbar.svg | 4 + .../BreezeStyleSheets/dark/hsepartoolbar.svg | 3 + src/ui/BreezeStyleSheets/dark/left_arrow.svg | 3 + .../dark/left_arrow_disabled.svg | 3 + .../BreezeStyleSheets/dark/radio_checked.svg | 5 + .../dark/radio_checked_disabled.svg | 5 + .../dark/radio_unchecked.svg | 4 + .../dark/radio_unchecked_disabled.svg | 4 + src/ui/BreezeStyleSheets/dark/right_arrow.svg | 3 + .../dark/right_arrow_disabled.svg | 3 + src/ui/BreezeStyleSheets/dark/sizegrip.svg | 3 + .../dark/spinup_disabled.svg | 3 + .../dark/stylesheet-branch-end-closed.svg | 4 + .../dark/stylesheet-branch-end-open.svg | 4 + .../dark/stylesheet-branch-end.svg | 4 + .../dark/stylesheet-branch-more.svg | 4 + .../dark/stylesheet-vline.svg | 3 + src/ui/BreezeStyleSheets/dark/transparent.svg | 1 + .../BreezeStyleSheets/dark/undock-hover.svg | 5 + src/ui/BreezeStyleSheets/dark/undock.svg | 3 + .../BreezeStyleSheets/dark/up_arrow-hover.svg | 3 + src/ui/BreezeStyleSheets/dark/up_arrow.svg | 3 + .../dark/up_arrow_disabled.svg | 3 + .../BreezeStyleSheets/dark/vmovetoolbar.svg | 8 + .../BreezeStyleSheets/dark/vsepartoolbars.svg | 7 + src/ui/BreezeStyleSheets/light.qss | 1685 ++++ .../light/branch_closed-on.svg | 3 + .../BreezeStyleSheets/light/branch_closed.svg | 3 + .../light/branch_open-on.svg | 3 + .../BreezeStyleSheets/light/branch_open.svg | 3 + .../light/checkbox_checked-hover.svg | 5 + .../light/checkbox_checked.svg | 5 + .../light/checkbox_checked_disabled.svg | 5 + .../light/checkbox_indeterminate-hover.svg | 7 + .../light/checkbox_indeterminate.svg | 7 + .../light/checkbox_indeterminate_disabled.svg | 7 + .../light/checkbox_unchecked-hover.svg | 4 + .../light/checkbox_unchecked_disabled.svg | 4 + .../BreezeStyleSheets/light/close-hover.svg | 3 + .../BreezeStyleSheets/light/close-pressed.svg | 3 + src/ui/BreezeStyleSheets/light/close.svg | 3 + .../light/down_arrow-hover.svg | 3 + src/ui/BreezeStyleSheets/light/down_arrow.svg | 3 + .../light/down_arrow_disabled.svg | 3 + .../BreezeStyleSheets/light/hmovetoolbar.svg | 5 + .../BreezeStyleSheets/light/hsepartoolbar.svg | 3 + src/ui/BreezeStyleSheets/light/left_arrow.svg | 3 + .../light/left_arrow_disabled.svg | 3 + .../light/radio_checked-hover.svg | 5 + .../BreezeStyleSheets/light/radio_checked.svg | 5 + .../light/radio_checked_disabled.svg | 5 + .../light/radio_unchecked-hover.svg | 4 + .../light/radio_unchecked_disabled.svg | 4 + .../BreezeStyleSheets/light/right_arrow.svg | 3 + .../light/right_arrow_disabled.svg | 3 + src/ui/BreezeStyleSheets/light/sizegrip.svg | 3 + .../light/spinup_disabled.svg | 3 + .../light/stylesheet-branch-end-closed.svg | 4 + .../light/stylesheet-branch-end-open.svg | 4 + .../light/stylesheet-branch-end.svg | 4 + .../light/stylesheet-branch-more.svg | 4 + .../light/stylesheet-vline.svg | 3 + .../BreezeStyleSheets/light/transparent.svg | 1 + .../BreezeStyleSheets/light/undock-hover.svg | 5 + src/ui/BreezeStyleSheets/light/undock.svg | 3 + .../light/up_arrow-hover.svg | 3 + src/ui/BreezeStyleSheets/light/up_arrow.svg | 3 + .../light/up_arrow_disabled.svg | 3 + .../BreezeStyleSheets/light/vmovetoolbar.svg | 8 + .../light/vsepartoolbars.svg | 7 + src/ui/qdarkstyle/rc/arrow_down.png | Bin 0 -> 525 bytes src/ui/qdarkstyle/rc/arrow_down@2x.png | Bin 0 -> 977 bytes src/ui/qdarkstyle/rc/arrow_down_disabled.png | Bin 0 -> 547 bytes .../qdarkstyle/rc/arrow_down_disabled@2x.png | Bin 0 -> 1040 bytes src/ui/qdarkstyle/rc/arrow_down_focus.png | Bin 0 -> 530 bytes src/ui/qdarkstyle/rc/arrow_down_focus@2x.png | Bin 0 -> 1025 bytes src/ui/qdarkstyle/rc/arrow_down_pressed.png | Bin 0 -> 518 bytes .../qdarkstyle/rc/arrow_down_pressed@2x.png | Bin 0 -> 1007 bytes src/ui/qdarkstyle/rc/arrow_left.png | Bin 0 -> 546 bytes src/ui/qdarkstyle/rc/arrow_left@2x.png | Bin 0 -> 1072 bytes src/ui/qdarkstyle/rc/arrow_left_disabled.png | Bin 0 -> 569 bytes .../qdarkstyle/rc/arrow_left_disabled@2x.png | Bin 0 -> 1126 bytes src/ui/qdarkstyle/rc/arrow_left_focus.png | Bin 0 -> 565 bytes src/ui/qdarkstyle/rc/arrow_left_focus@2x.png | Bin 0 -> 1143 bytes src/ui/qdarkstyle/rc/arrow_left_pressed.png | Bin 0 -> 541 bytes .../qdarkstyle/rc/arrow_left_pressed@2x.png | Bin 0 -> 1120 bytes src/ui/qdarkstyle/rc/arrow_right.png | Bin 0 -> 518 bytes src/ui/qdarkstyle/rc/arrow_right@2x.png | Bin 0 -> 1062 bytes src/ui/qdarkstyle/rc/arrow_right_disabled.png | Bin 0 -> 553 bytes .../qdarkstyle/rc/arrow_right_disabled@2x.png | Bin 0 -> 1143 bytes src/ui/qdarkstyle/rc/arrow_right_focus.png | Bin 0 -> 543 bytes src/ui/qdarkstyle/rc/arrow_right_focus@2x.png | Bin 0 -> 1139 bytes src/ui/qdarkstyle/rc/arrow_right_pressed.png | Bin 0 -> 544 bytes .../qdarkstyle/rc/arrow_right_pressed@2x.png | Bin 0 -> 1121 bytes src/ui/qdarkstyle/rc/arrow_up.png | Bin 0 -> 512 bytes src/ui/qdarkstyle/rc/arrow_up@2x.png | Bin 0 -> 969 bytes src/ui/qdarkstyle/rc/arrow_up_disabled.png | Bin 0 -> 538 bytes src/ui/qdarkstyle/rc/arrow_up_disabled@2x.png | Bin 0 -> 1046 bytes src/ui/qdarkstyle/rc/arrow_up_focus.png | Bin 0 -> 530 bytes src/ui/qdarkstyle/rc/arrow_up_focus@2x.png | Bin 0 -> 1017 bytes src/ui/qdarkstyle/rc/arrow_up_pressed.png | Bin 0 -> 518 bytes src/ui/qdarkstyle/rc/arrow_up_pressed@2x.png | Bin 0 -> 998 bytes src/ui/qdarkstyle/rc/base_icon.png | Bin 0 -> 1256 bytes src/ui/qdarkstyle/rc/base_icon@2x.png | Bin 0 -> 3286 bytes src/ui/qdarkstyle/rc/base_icon_disabled.png | Bin 0 -> 1256 bytes .../qdarkstyle/rc/base_icon_disabled@2x.png | Bin 0 -> 3286 bytes src/ui/qdarkstyle/rc/base_icon_focus.png | Bin 0 -> 1256 bytes src/ui/qdarkstyle/rc/base_icon_focus@2x.png | Bin 0 -> 3286 bytes src/ui/qdarkstyle/rc/base_icon_pressed.png | Bin 0 -> 1256 bytes src/ui/qdarkstyle/rc/base_icon_pressed@2x.png | Bin 0 -> 3286 bytes src/ui/qdarkstyle/rc/branch_closed.png | Bin 0 -> 350 bytes src/ui/qdarkstyle/rc/branch_closed@2x.png | Bin 0 -> 704 bytes .../qdarkstyle/rc/branch_closed_disabled.png | Bin 0 -> 373 bytes .../rc/branch_closed_disabled@2x.png | Bin 0 -> 729 bytes src/ui/qdarkstyle/rc/branch_closed_focus.png | Bin 0 -> 380 bytes .../qdarkstyle/rc/branch_closed_focus@2x.png | Bin 0 -> 717 bytes .../qdarkstyle/rc/branch_closed_pressed.png | Bin 0 -> 372 bytes .../rc/branch_closed_pressed@2x.png | Bin 0 -> 725 bytes src/ui/qdarkstyle/rc/branch_end.png | Bin 0 -> 142 bytes src/ui/qdarkstyle/rc/branch_end@2x.png | Bin 0 -> 220 bytes src/ui/qdarkstyle/rc/branch_end_disabled.png | Bin 0 -> 146 bytes .../qdarkstyle/rc/branch_end_disabled@2x.png | Bin 0 -> 225 bytes src/ui/qdarkstyle/rc/branch_end_focus.png | Bin 0 -> 146 bytes src/ui/qdarkstyle/rc/branch_end_focus@2x.png | Bin 0 -> 226 bytes src/ui/qdarkstyle/rc/branch_end_pressed.png | Bin 0 -> 146 bytes .../qdarkstyle/rc/branch_end_pressed@2x.png | Bin 0 -> 225 bytes src/ui/qdarkstyle/rc/branch_line.png | Bin 0 -> 130 bytes src/ui/qdarkstyle/rc/branch_line@2x.png | Bin 0 -> 242 bytes src/ui/qdarkstyle/rc/branch_line_disabled.png | Bin 0 -> 134 bytes .../qdarkstyle/rc/branch_line_disabled@2x.png | Bin 0 -> 248 bytes src/ui/qdarkstyle/rc/branch_line_focus.png | Bin 0 -> 134 bytes src/ui/qdarkstyle/rc/branch_line_focus@2x.png | Bin 0 -> 249 bytes src/ui/qdarkstyle/rc/branch_line_pressed.png | Bin 0 -> 134 bytes .../qdarkstyle/rc/branch_line_pressed@2x.png | Bin 0 -> 248 bytes src/ui/qdarkstyle/rc/branch_more.png | Bin 0 -> 155 bytes src/ui/qdarkstyle/rc/branch_more@2x.png | Bin 0 -> 257 bytes src/ui/qdarkstyle/rc/branch_more_disabled.png | Bin 0 -> 162 bytes .../qdarkstyle/rc/branch_more_disabled@2x.png | Bin 0 -> 265 bytes src/ui/qdarkstyle/rc/branch_more_focus.png | Bin 0 -> 162 bytes src/ui/qdarkstyle/rc/branch_more_focus@2x.png | Bin 0 -> 266 bytes src/ui/qdarkstyle/rc/branch_more_pressed.png | Bin 0 -> 162 bytes .../qdarkstyle/rc/branch_more_pressed@2x.png | Bin 0 -> 265 bytes src/ui/qdarkstyle/rc/branch_open.png | Bin 0 -> 354 bytes src/ui/qdarkstyle/rc/branch_open@2x.png | Bin 0 -> 657 bytes src/ui/qdarkstyle/rc/branch_open_disabled.png | Bin 0 -> 375 bytes .../qdarkstyle/rc/branch_open_disabled@2x.png | Bin 0 -> 682 bytes src/ui/qdarkstyle/rc/branch_open_focus.png | Bin 0 -> 367 bytes src/ui/qdarkstyle/rc/branch_open_focus@2x.png | Bin 0 -> 665 bytes src/ui/qdarkstyle/rc/branch_open_pressed.png | Bin 0 -> 369 bytes .../qdarkstyle/rc/branch_open_pressed@2x.png | Bin 0 -> 661 bytes src/ui/qdarkstyle/rc/checkbox_checked.png | Bin 0 -> 452 bytes src/ui/qdarkstyle/rc/checkbox_checked@2x.png | Bin 0 -> 825 bytes .../rc/checkbox_checked_disabled.png | Bin 0 -> 467 bytes .../rc/checkbox_checked_disabled@2x.png | Bin 0 -> 845 bytes .../qdarkstyle/rc/checkbox_checked_focus.png | Bin 0 -> 441 bytes .../rc/checkbox_checked_focus@2x.png | Bin 0 -> 823 bytes .../rc/checkbox_checked_pressed.png | Bin 0 -> 418 bytes .../rc/checkbox_checked_pressed@2x.png | Bin 0 -> 829 bytes .../qdarkstyle/rc/checkbox_indeterminate.png | Bin 0 -> 581 bytes .../rc/checkbox_indeterminate@2x.png | Bin 0 -> 1081 bytes .../rc/checkbox_indeterminate_disabled.png | Bin 0 -> 614 bytes .../rc/checkbox_indeterminate_disabled@2x.png | Bin 0 -> 1105 bytes .../rc/checkbox_indeterminate_focus.png | Bin 0 -> 576 bytes .../rc/checkbox_indeterminate_focus@2x.png | Bin 0 -> 1066 bytes .../rc/checkbox_indeterminate_pressed.png | Bin 0 -> 563 bytes .../rc/checkbox_indeterminate_pressed@2x.png | Bin 0 -> 1087 bytes src/ui/qdarkstyle/rc/checkbox_unchecked.png | Bin 0 -> 397 bytes .../qdarkstyle/rc/checkbox_unchecked@2x.png | Bin 0 -> 828 bytes .../rc/checkbox_unchecked_disabled.png | Bin 0 -> 386 bytes .../rc/checkbox_unchecked_disabled@2x.png | Bin 0 -> 875 bytes .../rc/checkbox_unchecked_focus.png | Bin 0 -> 394 bytes .../rc/checkbox_unchecked_focus@2x.png | Bin 0 -> 866 bytes .../rc/checkbox_unchecked_pressed.png | Bin 0 -> 403 bytes .../rc/checkbox_unchecked_pressed@2x.png | Bin 0 -> 861 bytes src/ui/qdarkstyle/rc/line_horizontal.png | Bin 0 -> 117 bytes src/ui/qdarkstyle/rc/line_horizontal@2x.png | Bin 0 -> 135 bytes .../rc/line_horizontal_disabled.png | Bin 0 -> 121 bytes .../rc/line_horizontal_disabled@2x.png | Bin 0 -> 139 bytes .../qdarkstyle/rc/line_horizontal_focus.png | Bin 0 -> 120 bytes .../rc/line_horizontal_focus@2x.png | Bin 0 -> 138 bytes .../qdarkstyle/rc/line_horizontal_pressed.png | Bin 0 -> 120 bytes .../rc/line_horizontal_pressed@2x.png | Bin 0 -> 138 bytes src/ui/qdarkstyle/rc/line_vertical.png | Bin 0 -> 130 bytes src/ui/qdarkstyle/rc/line_vertical@2x.png | Bin 0 -> 242 bytes .../qdarkstyle/rc/line_vertical_disabled.png | Bin 0 -> 134 bytes .../rc/line_vertical_disabled@2x.png | Bin 0 -> 248 bytes src/ui/qdarkstyle/rc/line_vertical_focus.png | Bin 0 -> 134 bytes .../qdarkstyle/rc/line_vertical_focus@2x.png | Bin 0 -> 249 bytes .../qdarkstyle/rc/line_vertical_pressed.png | Bin 0 -> 134 bytes .../rc/line_vertical_pressed@2x.png | Bin 0 -> 248 bytes src/ui/qdarkstyle/rc/radio_checked.png | Bin 0 -> 1224 bytes src/ui/qdarkstyle/rc/radio_checked@2x.png | Bin 0 -> 2714 bytes .../qdarkstyle/rc/radio_checked_disabled.png | Bin 0 -> 1325 bytes .../rc/radio_checked_disabled@2x.png | Bin 0 -> 2893 bytes src/ui/qdarkstyle/rc/radio_checked_focus.png | Bin 0 -> 1293 bytes .../qdarkstyle/rc/radio_checked_focus@2x.png | Bin 0 -> 2736 bytes .../qdarkstyle/rc/radio_checked_pressed.png | Bin 0 -> 1276 bytes .../rc/radio_checked_pressed@2x.png | Bin 0 -> 2765 bytes src/ui/qdarkstyle/rc/radio_unchecked.png | Bin 0 -> 963 bytes src/ui/qdarkstyle/rc/radio_unchecked@2x.png | Bin 0 -> 2195 bytes .../rc/radio_unchecked_disabled.png | Bin 0 -> 1040 bytes .../rc/radio_unchecked_disabled@2x.png | Bin 0 -> 2294 bytes .../qdarkstyle/rc/radio_unchecked_focus.png | Bin 0 -> 1032 bytes .../rc/radio_unchecked_focus@2x.png | Bin 0 -> 2186 bytes .../qdarkstyle/rc/radio_unchecked_pressed.png | Bin 0 -> 1022 bytes .../rc/radio_unchecked_pressed@2x.png | Bin 0 -> 2197 bytes .../qdarkstyle/rc/toolbar_move_horizontal.png | Bin 0 -> 150 bytes .../rc/toolbar_move_horizontal@2x.png | Bin 0 -> 304 bytes .../rc/toolbar_move_horizontal_disabled.png | Bin 0 -> 155 bytes .../toolbar_move_horizontal_disabled@2x.png | Bin 0 -> 308 bytes .../rc/toolbar_move_horizontal_focus.png | Bin 0 -> 154 bytes .../rc/toolbar_move_horizontal_focus@2x.png | Bin 0 -> 311 bytes .../rc/toolbar_move_horizontal_pressed.png | Bin 0 -> 154 bytes .../rc/toolbar_move_horizontal_pressed@2x.png | Bin 0 -> 307 bytes .../qdarkstyle/rc/toolbar_move_vertical.png | Bin 0 -> 137 bytes .../rc/toolbar_move_vertical@2x.png | Bin 0 -> 201 bytes .../rc/toolbar_move_vertical_disabled.png | Bin 0 -> 140 bytes .../rc/toolbar_move_vertical_disabled@2x.png | Bin 0 -> 212 bytes .../rc/toolbar_move_vertical_focus.png | Bin 0 -> 144 bytes .../rc/toolbar_move_vertical_focus@2x.png | Bin 0 -> 211 bytes .../rc/toolbar_move_vertical_pressed.png | Bin 0 -> 143 bytes .../rc/toolbar_move_vertical_pressed@2x.png | Bin 0 -> 204 bytes .../rc/toolbar_separator_horizontal.png | Bin 0 -> 145 bytes .../rc/toolbar_separator_horizontal@2x.png | Bin 0 -> 286 bytes .../toolbar_separator_horizontal_disabled.png | Bin 0 -> 151 bytes ...olbar_separator_horizontal_disabled@2x.png | Bin 0 -> 292 bytes .../rc/toolbar_separator_horizontal_focus.png | Bin 0 -> 149 bytes .../toolbar_separator_horizontal_focus@2x.png | Bin 0 -> 294 bytes .../toolbar_separator_horizontal_pressed.png | Bin 0 -> 149 bytes ...oolbar_separator_horizontal_pressed@2x.png | Bin 0 -> 289 bytes .../rc/toolbar_separator_vertical.png | Bin 0 -> 133 bytes .../rc/toolbar_separator_vertical@2x.png | Bin 0 -> 191 bytes .../toolbar_separator_vertical_disabled.png | Bin 0 -> 135 bytes ...toolbar_separator_vertical_disabled@2x.png | Bin 0 -> 199 bytes .../rc/toolbar_separator_vertical_focus.png | Bin 0 -> 139 bytes .../toolbar_separator_vertical_focus@2x.png | Bin 0 -> 196 bytes .../rc/toolbar_separator_vertical_pressed.png | Bin 0 -> 138 bytes .../toolbar_separator_vertical_pressed@2x.png | Bin 0 -> 193 bytes src/ui/qdarkstyle/rc/transparent.png | Bin 0 -> 104 bytes src/ui/qdarkstyle/rc/transparent@2x.png | Bin 0 -> 117 bytes src/ui/qdarkstyle/rc/transparent_disabled.png | Bin 0 -> 104 bytes .../qdarkstyle/rc/transparent_disabled@2x.png | Bin 0 -> 117 bytes src/ui/qdarkstyle/rc/transparent_focus.png | Bin 0 -> 104 bytes src/ui/qdarkstyle/rc/transparent_focus@2x.png | Bin 0 -> 117 bytes src/ui/qdarkstyle/rc/transparent_pressed.png | Bin 0 -> 104 bytes .../qdarkstyle/rc/transparent_pressed@2x.png | Bin 0 -> 117 bytes src/ui/qdarkstyle/rc/window_close.png | Bin 0 -> 766 bytes src/ui/qdarkstyle/rc/window_close@2x.png | Bin 0 -> 1690 bytes .../qdarkstyle/rc/window_close_disabled.png | Bin 0 -> 838 bytes .../rc/window_close_disabled@2x.png | Bin 0 -> 1724 bytes src/ui/qdarkstyle/rc/window_close_focus.png | Bin 0 -> 756 bytes .../qdarkstyle/rc/window_close_focus@2x.png | Bin 0 -> 1704 bytes src/ui/qdarkstyle/rc/window_close_pressed.png | Bin 0 -> 745 bytes .../qdarkstyle/rc/window_close_pressed@2x.png | Bin 0 -> 1679 bytes src/ui/qdarkstyle/rc/window_grip.png | Bin 0 -> 426 bytes src/ui/qdarkstyle/rc/window_grip@2x.png | Bin 0 -> 735 bytes src/ui/qdarkstyle/rc/window_grip_disabled.png | Bin 0 -> 447 bytes .../qdarkstyle/rc/window_grip_disabled@2x.png | Bin 0 -> 768 bytes src/ui/qdarkstyle/rc/window_grip_focus.png | Bin 0 -> 435 bytes src/ui/qdarkstyle/rc/window_grip_focus@2x.png | Bin 0 -> 738 bytes src/ui/qdarkstyle/rc/window_grip_pressed.png | Bin 0 -> 444 bytes .../qdarkstyle/rc/window_grip_pressed@2x.png | Bin 0 -> 729 bytes src/ui/qdarkstyle/rc/window_minimize.png | Bin 0 -> 193 bytes src/ui/qdarkstyle/rc/window_minimize@2x.png | Bin 0 -> 316 bytes .../rc/window_minimize_disabled.png | Bin 0 -> 206 bytes .../rc/window_minimize_disabled@2x.png | Bin 0 -> 332 bytes .../qdarkstyle/rc/window_minimize_focus.png | Bin 0 -> 208 bytes .../rc/window_minimize_focus@2x.png | Bin 0 -> 339 bytes .../qdarkstyle/rc/window_minimize_pressed.png | Bin 0 -> 202 bytes .../rc/window_minimize_pressed@2x.png | Bin 0 -> 336 bytes src/ui/qdarkstyle/rc/window_undock.png | Bin 0 -> 510 bytes src/ui/qdarkstyle/rc/window_undock@2x.png | Bin 0 -> 875 bytes .../qdarkstyle/rc/window_undock_disabled.png | Bin 0 -> 541 bytes .../rc/window_undock_disabled@2x.png | Bin 0 -> 910 bytes src/ui/qdarkstyle/rc/window_undock_focus.png | Bin 0 -> 519 bytes .../qdarkstyle/rc/window_undock_focus@2x.png | Bin 0 -> 877 bytes .../qdarkstyle/rc/window_undock_pressed.png | Bin 0 -> 523 bytes .../rc/window_undock_pressed@2x.png | Bin 0 -> 880 bytes src/ui/qdarkstyle/style.qrc | 216 + src/ui/qdarkstyle/style.qss | 2195 +++++ src/ui/qdarkstyle/svg/arrow_down.svg | 93 + src/ui/qdarkstyle/svg/arrow_left.svg | 93 + src/ui/qdarkstyle/svg/arrow_right.svg | 93 + src/ui/qdarkstyle/svg/arrow_up.svg | 93 + src/ui/qdarkstyle/svg/base_icon.svg | 195 + src/ui/qdarkstyle/svg/base_palette.svg | 443 + src/ui/qdarkstyle/svg/branch_closed.svg | 94 + src/ui/qdarkstyle/svg/branch_end.svg | 98 + src/ui/qdarkstyle/svg/branch_line.svg | 116 + src/ui/qdarkstyle/svg/branch_more.svg | 87 + src/ui/qdarkstyle/svg/branch_open.svg | 94 + src/ui/qdarkstyle/svg/checkbox_checked.svg | 98 + .../qdarkstyle/svg/checkbox_indeterminate.svg | 95 + src/ui/qdarkstyle/svg/checkbox_unchecked.svg | 87 + src/ui/qdarkstyle/svg/line_horizontal.svg | 82 + src/ui/qdarkstyle/svg/line_vertical.svg | 82 + src/ui/qdarkstyle/svg/radio_checked.svg | 90 + src/ui/qdarkstyle/svg/radio_unchecked.svg | 83 + .../svg/toolbar_move_horizontal.svg | 87 + .../qdarkstyle/svg/toolbar_move_vertical.svg | 87 + .../svg/toolbar_separator_horizontal.svg | 82 + .../svg/toolbar_separator_vertical.svg | 82 + src/ui/qdarkstyle/svg/transparent.svg | 81 + src/ui/qdarkstyle/svg/window_close.svg | 92 + src/ui/qdarkstyle/svg/window_grip.svg | 92 + src/ui/qdarkstyle/svg/window_minimize.svg | 82 + src/ui/qdarkstyle/svg/window_undock.svg | 92 + src/utils/CMakeLists.txt | 2 + src/utils/ScopeGuard.h | 205 + src/utils/childproc.cpp | 16 + src/utils/childproc.h | 25 + src/utils/config.cpp | 148 + src/utils/config.h | 75 + src/utils/keysfiles.cpp | 209 + src/utils/keysfiles.h | 71 + src/utils/networking.cpp | 81 + src/utils/networking.h | 44 + src/utils/networktype.h | 20 + src/utils/nodes.cpp | 379 + src/utils/nodes.h | 138 + src/utils/prices.cpp | 92 + src/utils/prices.h | 42 + src/utils/scheduler.cpp | 92 + src/utils/scheduler.h | 68 + src/utils/seeds.h | 170 + src/utils/tails.cpp | 84 + src/utils/tails.h | 26 + src/utils/textedit.cpp | 168 + src/utils/textedit.h | 89 + src/utils/tor.cpp | 256 + src/utils/tor.h | 65 + src/utils/txfiathistory.cpp | 116 + src/utils/txfiathistory.h | 31 + src/utils/utils.cpp | 552 ++ src/utils/utils.h | 110 + src/utils/whonix.cpp | 10 + src/utils/whonix.h | 13 + src/utils/wsclient.cpp | 90 + src/utils/wsclient.h | 40 + src/utils/xmrto.cpp | 111 + src/utils/xmrto.h | 63 + src/utils/xmrtoapi.cpp | 78 + src/utils/xmrtoapi.h | 87 + src/utils/xmrtoorder.cpp | 276 + src/utils/xmrtoorder.h | 106 + src/widgets/CCSEntry.h | 24 + src/widgets/RedditPost.h | 18 + src/widgets/ccswidget.cpp | 75 + src/widgets/ccswidget.h | 48 + src/widgets/cssprogressdelegate.cpp | 40 + src/widgets/cssprogressdelegate.h | 23 + src/widgets/csswidget.ui | 92 + src/widgets/nodewidget.cpp | 222 + src/widgets/nodewidget.h | 67 + src/widgets/nodewidget.ui | 109 + src/widgets/redditwidget.cpp | 63 + src/widgets/redditwidget.h | 38 + src/widgets/redditwidget.ui | 91 + src/widgets/restoreheightwidget.cpp | 60 + src/widgets/restoreheightwidget.h | 35 + src/widgets/restoreheightwidget.ui | 112 + src/widgets/tickerwidget.cpp | 101 + src/widgets/tickerwidget.h | 39 + src/widgets/tickerwidget.ui | 84 + src/wizard/createwallet.cpp | 98 + src/wizard/createwallet.h | 37 + src/wizard/createwallet.ui | 103 + src/wizard/createwalletseed.cpp | 70 + src/wizard/createwalletseed.h | 51 + src/wizard/createwalletseed.ui | 142 + src/wizard/menu.cpp | 41 + src/wizard/menu.h | 32 + src/wizard/menu.ui | 78 + src/wizard/network.cpp | 75 + src/wizard/network.h | 33 + src/wizard/network.ui | 237 + src/wizard/openwallet.cpp | 76 + src/wizard/openwallet.h | 40 + src/wizard/openwallet.ui | 62 + src/wizard/restorewallet.cpp | 166 + src/wizard/restorewallet.h | 45 + src/wizard/restorewallet.ui | 172 + src/wizard/walletwizard.cpp | 65 + src/wizard/walletwizard.h | 31 + src/xmrtowidget.cpp | 189 + src/xmrtowidget.h | 64 + src/xmrtowidget.ui | 327 + utils/Info.plist | 61 + utils/build_macos.sh | 26 + utils/images/feather-home.png | Bin 0 -> 59501 bytes utils/pubkeys/dsc.asc | 52 + utils/pubkeys/kitware.asc | 64 + utils/pubkeys/tobtoht.asc | 59 + 728 files changed, 55961 insertions(+) create mode 100644 .dockerignore create mode 100644 .drone.yml create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 BUILDING.md create mode 100644 CMakeLists.txt create mode 100644 Dockerfile create mode 100644 Dockerfile_appimage create mode 100644 Dockerfile_macos create mode 100644 Dockerfile_windows create mode 100644 HACKING.md create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 SECURITY.md create mode 100644 cmake/32-bit-toolchain.cmake create mode 100644 cmake/64-bit-toolchain.cmake create mode 100644 cmake/CheckLinkerFlag.c create mode 100644 cmake/CheckLinkerFlag.cmake create mode 100644 cmake/CheckTrezor.cmake create mode 100644 cmake/Deploy.cmake create mode 100644 cmake/Doxyfile.in create mode 100644 cmake/Doxygen.extra.css.in create mode 100644 cmake/FindBacktrace.cmake create mode 100644 cmake/FindBerkeleyDB.cmake create mode 100644 cmake/FindCcache.cmake create mode 100644 cmake/FindGCrypt.cmake create mode 100644 cmake/FindHIDAPI.cmake create mode 100644 cmake/FindLibunwind.cmake create mode 100644 cmake/FindMiniupnpc.cmake create mode 100644 cmake/FindQREncode.cmake create mode 100644 cmake/FindReadline.cmake create mode 100644 cmake/FindSodium.cmake create mode 100644 cmake/FindUnbound.cmake create mode 100644 cmake/FindZBar0.cmake create mode 100644 cmake/GenVersion.cmake create mode 100644 cmake/Version.cmake create mode 100644 cmake/VersionFeather.cmake create mode 100644 cmake/VersionMonero.cmake create mode 100644 cmake/config-feather.h.cmake create mode 100644 cmake/test-protobuf.cpp create mode 100644 cmake/test-protobuf.proto create mode 100644 cmake/test-static-assert.c create mode 100644 cmake/test-static-assert.cpp create mode 100644 contrib/Qt5.15_LinuxPatch.json create mode 100644 contrib/build-appimage.sh create mode 100755 contrib/build_tor.sh create mode 160000 contrib/tor create mode 160000 contrib/torsocks create mode 100644 contrib/torsocks_macos.patch create mode 100644 contrib/unbound_static.patch create mode 160000 monero create mode 100644 src/CMakeLists.txt create mode 100644 src/appcontext.cpp create mode 100644 src/appcontext.h create mode 100644 src/assets.qrc create mode 100644 src/assets/about.txt create mode 100644 src/assets/ack.txt create mode 100644 src/assets/contributors.txt create mode 100644 src/assets/feather.desktop create mode 100644 src/assets/images/appicons/128x128.png create mode 100644 src/assets/images/appicons/256x256.png create mode 100644 src/assets/images/appicons/32x32.png create mode 100644 src/assets/images/appicons/48x48.png create mode 100644 src/assets/images/appicons/64x64.png create mode 100755 src/assets/images/appicons/64x64.png~ create mode 100644 src/assets/images/appicons/96x96.png create mode 100755 src/assets/images/appicons/appicon.icns create mode 100644 src/assets/images/appicons/appicon.ico create mode 100755 src/assets/images/appicons/monero.png create mode 100755 src/assets/images/appicons/monero_grey.png create mode 100644 src/assets/images/arrow.svg create mode 100644 src/assets/images/bitcoin.png create mode 100644 src/assets/images/camera_dark.png create mode 100644 src/assets/images/camera_white.png create mode 100644 src/assets/images/clock1.png create mode 100644 src/assets/images/clock2.png create mode 100644 src/assets/images/clock3.png create mode 100644 src/assets/images/clock4.png create mode 100644 src/assets/images/clock5.png create mode 100644 src/assets/images/coins.png create mode 100644 src/assets/images/coldcard.png create mode 100644 src/assets/images/coldcard_unpaired.png create mode 100644 src/assets/images/confirmed.png create mode 100644 src/assets/images/confirmed.svg create mode 100644 src/assets/images/connect.svg create mode 100644 src/assets/images/copy.png create mode 100644 src/assets/images/cutexmrfox.png create mode 100644 src/assets/images/edit.png create mode 100644 src/assets/images/exchange.png create mode 100644 src/assets/images/expired.png create mode 100644 src/assets/images/eye1.png create mode 100644 src/assets/images/feather.png create mode 100644 src/assets/images/file.png create mode 100644 src/assets/images/ghost.png create mode 100644 src/assets/images/history.png create mode 100644 src/assets/images/info.png create mode 100644 src/assets/images/key.png create mode 100644 src/assets/images/ledger.png create mode 100644 src/assets/images/ledger_unpaired.png create mode 100644 src/assets/images/lightning.png create mode 100644 src/assets/images/lock.png create mode 100644 src/assets/images/lock.svg create mode 100644 src/assets/images/microphone.png create mode 100644 src/assets/images/network.png create mode 100644 src/assets/images/offline_tx.png create mode 100644 src/assets/images/person.svg create mode 100644 src/assets/images/photos/1.png create mode 100644 src/assets/images/preferences.png create mode 100644 src/assets/images/preferences.svg create mode 100644 src/assets/images/qrcode.png create mode 100644 src/assets/images/qrcode_white.png create mode 100644 src/assets/images/revealer.png create mode 100644 src/assets/images/revealer_c.png create mode 100644 src/assets/images/seal.png create mode 100644 src/assets/images/seed.png create mode 100644 src/assets/images/speaker.png create mode 100644 src/assets/images/status_connected.png create mode 100644 src/assets/images/status_connected.svg create mode 100644 src/assets/images/status_connected_fork.png create mode 100644 src/assets/images/status_connected_proxy.png create mode 100644 src/assets/images/status_connected_proxy.svg create mode 100644 src/assets/images/status_connected_proxy_fork.png create mode 100644 src/assets/images/status_disconnected.png create mode 100644 src/assets/images/status_disconnected.svg create mode 100644 src/assets/images/status_lagging.png create mode 100644 src/assets/images/status_lagging.svg create mode 100644 src/assets/images/status_lagging_fork.png create mode 100644 src/assets/images/status_waiting.png create mode 100644 src/assets/images/status_waiting.svg create mode 100644 src/assets/images/tab_addresses.png create mode 100644 src/assets/images/tab_coins.png create mode 100644 src/assets/images/tab_console.png create mode 100644 src/assets/images/tab_contacts.png create mode 100644 src/assets/images/tab_history.png create mode 100644 src/assets/images/tab_home.png create mode 100644 src/assets/images/tab_party.png create mode 100644 src/assets/images/tab_receive.png create mode 100644 src/assets/images/tab_send.png create mode 100644 src/assets/images/tab_settings.png create mode 100644 src/assets/images/terminal.png create mode 100644 src/assets/images/tor_logo.png create mode 100644 src/assets/images/tor_logo_disabled.png create mode 100644 src/assets/images/trezor.png create mode 100644 src/assets/images/trezor_unpaired.png create mode 100644 src/assets/images/unconfirmed.png create mode 100644 src/assets/images/unlock.png create mode 100644 src/assets/images/unlock.svg create mode 100644 src/assets/images/unpaid.png create mode 100644 src/assets/images/update.png create mode 100644 src/assets/images/warning.png create mode 100644 src/assets/images/xmrto.png create mode 100644 src/assets/images/xmrto_big.png create mode 100644 src/assets/images/zoom.png create mode 100644 src/assets/mnemonic_25_english.txt create mode 100644 src/assets/restore_heights_monero_mainnet.txt create mode 100644 src/assets/restore_heights_monero_stagenet.txt create mode 100644 src/assets/user_agents.txt create mode 100644 src/assets_linux_tor.qrc create mode 100644 src/assets_macos_tor.qrc create mode 100644 src/assets_windows_tor.qrc create mode 100644 src/calcwidget.cpp create mode 100644 src/calcwidget.h create mode 100644 src/calcwidget.ui create mode 100644 src/calcwindow.cpp create mode 100644 src/calcwindow.h create mode 100644 src/calcwindow.ui create mode 100644 src/cli.cpp create mode 100644 src/cli.h create mode 100644 src/coinswidget.cpp create mode 100644 src/coinswidget.h create mode 100644 src/coinswidget.ui create mode 100644 src/components.cpp create mode 100644 src/components.h create mode 100644 src/contactswidget.cpp create mode 100644 src/contactswidget.h create mode 100644 src/contactswidget.ui create mode 100644 src/dialog/aboutdialog.cpp create mode 100644 src/dialog/aboutdialog.h create mode 100644 src/dialog/aboutdialog.ui create mode 100644 src/dialog/contactsdialog.cpp create mode 100644 src/dialog/contactsdialog.h create mode 100644 src/dialog/contactsdialog.ui create mode 100644 src/dialog/debuginfodialog.cpp create mode 100644 src/dialog/debuginfodialog.h create mode 100644 src/dialog/debuginfodialog.ui create mode 100644 src/dialog/keysdialog.cpp create mode 100644 src/dialog/keysdialog.h create mode 100644 src/dialog/keysdialog.ui create mode 100644 src/dialog/outputinfodialog.cpp create mode 100644 src/dialog/outputinfodialog.h create mode 100644 src/dialog/outputinfodialog.ui create mode 100644 src/dialog/outputsweepdialog.cpp create mode 100644 src/dialog/outputsweepdialog.h create mode 100644 src/dialog/outputsweepdialog.ui create mode 100644 src/dialog/passwordchangedialog.cpp create mode 100644 src/dialog/passwordchangedialog.h create mode 100644 src/dialog/passwordchangedialog.ui create mode 100644 src/dialog/qrcodedialog.cpp create mode 100644 src/dialog/qrcodedialog.h create mode 100644 src/dialog/qrcodedialog.ui create mode 100644 src/dialog/restoredialog.cpp create mode 100644 src/dialog/restoredialog.h create mode 100644 src/dialog/restoredialog.ui create mode 100644 src/dialog/seeddialog.cpp create mode 100644 src/dialog/seeddialog.h create mode 100644 src/dialog/seeddialog.ui create mode 100644 src/dialog/signverifydialog.cpp create mode 100644 src/dialog/signverifydialog.h create mode 100644 src/dialog/signverifydialog.ui create mode 100644 src/dialog/torinfodialog.cpp create mode 100644 src/dialog/torinfodialog.h create mode 100644 src/dialog/torinfodialog.ui create mode 100644 src/dialog/transactioninfodialog.cpp create mode 100644 src/dialog/transactioninfodialog.h create mode 100644 src/dialog/transactioninfodialog.ui create mode 100644 src/dialog/txconfdialog.cpp create mode 100644 src/dialog/txconfdialog.h create mode 100644 src/dialog/txconfdialog.ui create mode 100644 src/dialog/verifyproofdialog.cpp create mode 100644 src/dialog/verifyproofdialog.h create mode 100644 src/dialog/verifyproofdialog.ui create mode 100644 src/dialog/walletinfodialog.cpp create mode 100644 src/dialog/walletinfodialog.h create mode 100644 src/dialog/walletinfodialog.ui create mode 100644 src/dialog/xmrtoinfodialog.cpp create mode 100644 src/dialog/xmrtoinfodialog.h create mode 100644 src/dialog/xmrtoinfodialog.ui create mode 100644 src/historywidget.cpp create mode 100644 src/historywidget.h create mode 100644 src/historywidget.ui create mode 100644 src/libwalletqt/AddressBook.cpp create mode 100644 src/libwalletqt/AddressBook.h create mode 100644 src/libwalletqt/AddressBookInfo.cpp create mode 100644 src/libwalletqt/AddressBookInfo.h create mode 100644 src/libwalletqt/CMakeLists.txt create mode 100644 src/libwalletqt/Coins.cpp create mode 100644 src/libwalletqt/Coins.h create mode 100644 src/libwalletqt/CoinsInfo.cpp create mode 100644 src/libwalletqt/CoinsInfo.h create mode 100644 src/libwalletqt/PassphraseHelper.cpp create mode 100644 src/libwalletqt/PassphraseHelper.h create mode 100644 src/libwalletqt/PendingTransaction.cpp create mode 100644 src/libwalletqt/PendingTransaction.h create mode 100644 src/libwalletqt/Ring.h create mode 100644 src/libwalletqt/Subaddress.cpp create mode 100644 src/libwalletqt/Subaddress.h create mode 100644 src/libwalletqt/SubaddressAccount.cpp create mode 100644 src/libwalletqt/SubaddressAccount.h create mode 100644 src/libwalletqt/TransactionHistory.cpp create mode 100644 src/libwalletqt/TransactionHistory.h create mode 100644 src/libwalletqt/TransactionInfo.cpp create mode 100644 src/libwalletqt/TransactionInfo.h create mode 100644 src/libwalletqt/Transfer.h create mode 100644 src/libwalletqt/UnsignedTransaction.cpp create mode 100644 src/libwalletqt/UnsignedTransaction.h create mode 100644 src/libwalletqt/Wallet.cpp create mode 100644 src/libwalletqt/Wallet.h create mode 100644 src/libwalletqt/WalletListenerImpl.cpp create mode 100644 src/libwalletqt/WalletListenerImpl.h create mode 100644 src/libwalletqt/WalletManager.cpp create mode 100644 src/libwalletqt/WalletManager.h create mode 100644 src/main.cpp create mode 100644 src/mainwindow.cpp create mode 100644 src/mainwindow.h create mode 100644 src/mainwindow.ui create mode 100644 src/model/AddressBookModel.cpp create mode 100644 src/model/AddressBookModel.h create mode 100644 src/model/AddressBookProxyModel.cpp create mode 100644 src/model/AddressBookProxyModel.h create mode 100644 src/model/CCSModel.cpp create mode 100644 src/model/CCSModel.h create mode 100644 src/model/CMakeLists.txt create mode 100644 src/model/CoinsModel.cpp create mode 100644 src/model/CoinsModel.h create mode 100644 src/model/CoinsProxyModel.cpp create mode 100644 src/model/CoinsProxyModel.h create mode 100644 src/model/ModelUtils.cpp create mode 100644 src/model/ModelUtils.h create mode 100644 src/model/NodeModel.cpp create mode 100644 src/model/NodeModel.h create mode 100644 src/model/RedditModel.cpp create mode 100644 src/model/RedditModel.h create mode 100644 src/model/SubaddressAccountModel.cpp create mode 100644 src/model/SubaddressAccountModel.h create mode 100644 src/model/SubaddressModel.cpp create mode 100644 src/model/SubaddressModel.h create mode 100644 src/model/SubaddressProxyModel.cpp create mode 100644 src/model/SubaddressProxyModel.h create mode 100644 src/model/TransactionHistoryModel.cpp create mode 100644 src/model/TransactionHistoryModel.h create mode 100644 src/model/TransactionHistoryProxyModel.cpp create mode 100644 src/model/TransactionHistoryProxyModel.h create mode 100644 src/model/XmrToModel.cpp create mode 100644 src/model/XmrToModel.h create mode 100644 src/openpgp/CMakeLists.txt create mode 100644 src/openpgp/hash.h create mode 100644 src/openpgp/mpi.h create mode 100644 src/openpgp/openpgp.cpp create mode 100644 src/openpgp/openpgp.h create mode 100644 src/openpgp/packet_stream.h create mode 100644 src/openpgp/s_expression.h create mode 100644 src/openpgp/serialization.h create mode 100644 src/qrcode/CMakeLists.txt create mode 100644 src/qrcode/QrCode.cpp create mode 100644 src/qrcode/QrCode.h create mode 100644 src/qrcode/QrCode_p.h create mode 100644 src/receivewidget.cpp create mode 100644 src/receivewidget.h create mode 100644 src/receivewidget.ui create mode 100644 src/sendwidget.cpp create mode 100644 src/sendwidget.h create mode 100644 src/sendwidget.ui create mode 100644 src/settings.cpp create mode 100644 src/settings.h create mode 100644 src/settings.ui create mode 100644 src/tor/.gitkeep create mode 100644 src/ui/BreezeStyleSheets/breeze.qrc create mode 100644 src/ui/BreezeStyleSheets/dark.qss create mode 100755 src/ui/BreezeStyleSheets/dark/branch_closed-on.svg create mode 100755 src/ui/BreezeStyleSheets/dark/branch_closed.svg create mode 100755 src/ui/BreezeStyleSheets/dark/branch_open-on.svg create mode 100755 src/ui/BreezeStyleSheets/dark/branch_open.svg create mode 100755 src/ui/BreezeStyleSheets/dark/checkbox_checked.svg create mode 100755 src/ui/BreezeStyleSheets/dark/checkbox_checked_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/dark/checkbox_indeterminate.svg create mode 100755 src/ui/BreezeStyleSheets/dark/checkbox_indeterminate_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/dark/checkbox_unchecked.svg create mode 100755 src/ui/BreezeStyleSheets/dark/checkbox_unchecked_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/dark/close-hover.svg create mode 100755 src/ui/BreezeStyleSheets/dark/close-pressed.svg create mode 100755 src/ui/BreezeStyleSheets/dark/close.svg create mode 100755 src/ui/BreezeStyleSheets/dark/down_arrow-hover.svg create mode 100755 src/ui/BreezeStyleSheets/dark/down_arrow.svg create mode 100755 src/ui/BreezeStyleSheets/dark/down_arrow_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/dark/hmovetoolbar.svg create mode 100755 src/ui/BreezeStyleSheets/dark/hsepartoolbar.svg create mode 100755 src/ui/BreezeStyleSheets/dark/left_arrow.svg create mode 100755 src/ui/BreezeStyleSheets/dark/left_arrow_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/dark/radio_checked.svg create mode 100755 src/ui/BreezeStyleSheets/dark/radio_checked_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/dark/radio_unchecked.svg create mode 100755 src/ui/BreezeStyleSheets/dark/radio_unchecked_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/dark/right_arrow.svg create mode 100755 src/ui/BreezeStyleSheets/dark/right_arrow_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/dark/sizegrip.svg create mode 100755 src/ui/BreezeStyleSheets/dark/spinup_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/dark/stylesheet-branch-end-closed.svg create mode 100755 src/ui/BreezeStyleSheets/dark/stylesheet-branch-end-open.svg create mode 100755 src/ui/BreezeStyleSheets/dark/stylesheet-branch-end.svg create mode 100755 src/ui/BreezeStyleSheets/dark/stylesheet-branch-more.svg create mode 100755 src/ui/BreezeStyleSheets/dark/stylesheet-vline.svg create mode 100755 src/ui/BreezeStyleSheets/dark/transparent.svg create mode 100755 src/ui/BreezeStyleSheets/dark/undock-hover.svg create mode 100755 src/ui/BreezeStyleSheets/dark/undock.svg create mode 100755 src/ui/BreezeStyleSheets/dark/up_arrow-hover.svg create mode 100755 src/ui/BreezeStyleSheets/dark/up_arrow.svg create mode 100755 src/ui/BreezeStyleSheets/dark/up_arrow_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/dark/vmovetoolbar.svg create mode 100755 src/ui/BreezeStyleSheets/dark/vsepartoolbars.svg create mode 100644 src/ui/BreezeStyleSheets/light.qss create mode 100755 src/ui/BreezeStyleSheets/light/branch_closed-on.svg create mode 100755 src/ui/BreezeStyleSheets/light/branch_closed.svg create mode 100755 src/ui/BreezeStyleSheets/light/branch_open-on.svg create mode 100755 src/ui/BreezeStyleSheets/light/branch_open.svg create mode 100755 src/ui/BreezeStyleSheets/light/checkbox_checked-hover.svg create mode 100755 src/ui/BreezeStyleSheets/light/checkbox_checked.svg create mode 100755 src/ui/BreezeStyleSheets/light/checkbox_checked_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/light/checkbox_indeterminate-hover.svg create mode 100755 src/ui/BreezeStyleSheets/light/checkbox_indeterminate.svg create mode 100755 src/ui/BreezeStyleSheets/light/checkbox_indeterminate_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/light/checkbox_unchecked-hover.svg create mode 100755 src/ui/BreezeStyleSheets/light/checkbox_unchecked_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/light/close-hover.svg create mode 100755 src/ui/BreezeStyleSheets/light/close-pressed.svg create mode 100755 src/ui/BreezeStyleSheets/light/close.svg create mode 100755 src/ui/BreezeStyleSheets/light/down_arrow-hover.svg create mode 100755 src/ui/BreezeStyleSheets/light/down_arrow.svg create mode 100755 src/ui/BreezeStyleSheets/light/down_arrow_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/light/hmovetoolbar.svg create mode 100755 src/ui/BreezeStyleSheets/light/hsepartoolbar.svg create mode 100755 src/ui/BreezeStyleSheets/light/left_arrow.svg create mode 100755 src/ui/BreezeStyleSheets/light/left_arrow_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/light/radio_checked-hover.svg create mode 100755 src/ui/BreezeStyleSheets/light/radio_checked.svg create mode 100755 src/ui/BreezeStyleSheets/light/radio_checked_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/light/radio_unchecked-hover.svg create mode 100755 src/ui/BreezeStyleSheets/light/radio_unchecked_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/light/right_arrow.svg create mode 100755 src/ui/BreezeStyleSheets/light/right_arrow_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/light/sizegrip.svg create mode 100755 src/ui/BreezeStyleSheets/light/spinup_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/light/stylesheet-branch-end-closed.svg create mode 100755 src/ui/BreezeStyleSheets/light/stylesheet-branch-end-open.svg create mode 100755 src/ui/BreezeStyleSheets/light/stylesheet-branch-end.svg create mode 100755 src/ui/BreezeStyleSheets/light/stylesheet-branch-more.svg create mode 100755 src/ui/BreezeStyleSheets/light/stylesheet-vline.svg create mode 100755 src/ui/BreezeStyleSheets/light/transparent.svg create mode 100755 src/ui/BreezeStyleSheets/light/undock-hover.svg create mode 100755 src/ui/BreezeStyleSheets/light/undock.svg create mode 100755 src/ui/BreezeStyleSheets/light/up_arrow-hover.svg create mode 100755 src/ui/BreezeStyleSheets/light/up_arrow.svg create mode 100755 src/ui/BreezeStyleSheets/light/up_arrow_disabled.svg create mode 100755 src/ui/BreezeStyleSheets/light/vmovetoolbar.svg create mode 100755 src/ui/BreezeStyleSheets/light/vsepartoolbars.svg create mode 100644 src/ui/qdarkstyle/rc/arrow_down.png create mode 100644 src/ui/qdarkstyle/rc/arrow_down@2x.png create mode 100644 src/ui/qdarkstyle/rc/arrow_down_disabled.png create mode 100644 src/ui/qdarkstyle/rc/arrow_down_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/arrow_down_focus.png create mode 100644 src/ui/qdarkstyle/rc/arrow_down_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/arrow_down_pressed.png create mode 100644 src/ui/qdarkstyle/rc/arrow_down_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/arrow_left.png create mode 100644 src/ui/qdarkstyle/rc/arrow_left@2x.png create mode 100644 src/ui/qdarkstyle/rc/arrow_left_disabled.png create mode 100644 src/ui/qdarkstyle/rc/arrow_left_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/arrow_left_focus.png create mode 100644 src/ui/qdarkstyle/rc/arrow_left_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/arrow_left_pressed.png create mode 100644 src/ui/qdarkstyle/rc/arrow_left_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/arrow_right.png create mode 100644 src/ui/qdarkstyle/rc/arrow_right@2x.png create mode 100644 src/ui/qdarkstyle/rc/arrow_right_disabled.png create mode 100644 src/ui/qdarkstyle/rc/arrow_right_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/arrow_right_focus.png create mode 100644 src/ui/qdarkstyle/rc/arrow_right_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/arrow_right_pressed.png create mode 100644 src/ui/qdarkstyle/rc/arrow_right_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/arrow_up.png create mode 100644 src/ui/qdarkstyle/rc/arrow_up@2x.png create mode 100644 src/ui/qdarkstyle/rc/arrow_up_disabled.png create mode 100644 src/ui/qdarkstyle/rc/arrow_up_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/arrow_up_focus.png create mode 100644 src/ui/qdarkstyle/rc/arrow_up_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/arrow_up_pressed.png create mode 100644 src/ui/qdarkstyle/rc/arrow_up_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/base_icon.png create mode 100644 src/ui/qdarkstyle/rc/base_icon@2x.png create mode 100644 src/ui/qdarkstyle/rc/base_icon_disabled.png create mode 100644 src/ui/qdarkstyle/rc/base_icon_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/base_icon_focus.png create mode 100644 src/ui/qdarkstyle/rc/base_icon_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/base_icon_pressed.png create mode 100644 src/ui/qdarkstyle/rc/base_icon_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_closed.png create mode 100644 src/ui/qdarkstyle/rc/branch_closed@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_closed_disabled.png create mode 100644 src/ui/qdarkstyle/rc/branch_closed_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_closed_focus.png create mode 100644 src/ui/qdarkstyle/rc/branch_closed_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_closed_pressed.png create mode 100644 src/ui/qdarkstyle/rc/branch_closed_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_end.png create mode 100644 src/ui/qdarkstyle/rc/branch_end@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_end_disabled.png create mode 100644 src/ui/qdarkstyle/rc/branch_end_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_end_focus.png create mode 100644 src/ui/qdarkstyle/rc/branch_end_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_end_pressed.png create mode 100644 src/ui/qdarkstyle/rc/branch_end_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_line.png create mode 100644 src/ui/qdarkstyle/rc/branch_line@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_line_disabled.png create mode 100644 src/ui/qdarkstyle/rc/branch_line_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_line_focus.png create mode 100644 src/ui/qdarkstyle/rc/branch_line_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_line_pressed.png create mode 100644 src/ui/qdarkstyle/rc/branch_line_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_more.png create mode 100644 src/ui/qdarkstyle/rc/branch_more@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_more_disabled.png create mode 100644 src/ui/qdarkstyle/rc/branch_more_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_more_focus.png create mode 100644 src/ui/qdarkstyle/rc/branch_more_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_more_pressed.png create mode 100644 src/ui/qdarkstyle/rc/branch_more_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_open.png create mode 100644 src/ui/qdarkstyle/rc/branch_open@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_open_disabled.png create mode 100644 src/ui/qdarkstyle/rc/branch_open_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_open_focus.png create mode 100644 src/ui/qdarkstyle/rc/branch_open_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/branch_open_pressed.png create mode 100644 src/ui/qdarkstyle/rc/branch_open_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_checked.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_checked@2x.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_checked_disabled.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_checked_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_checked_focus.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_checked_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_checked_pressed.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_checked_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_indeterminate.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_indeterminate@2x.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_indeterminate_disabled.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_indeterminate_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_indeterminate_focus.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_indeterminate_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_indeterminate_pressed.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_indeterminate_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_unchecked.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_unchecked@2x.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_unchecked_disabled.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_unchecked_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_unchecked_focus.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_unchecked_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_unchecked_pressed.png create mode 100644 src/ui/qdarkstyle/rc/checkbox_unchecked_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/line_horizontal.png create mode 100644 src/ui/qdarkstyle/rc/line_horizontal@2x.png create mode 100644 src/ui/qdarkstyle/rc/line_horizontal_disabled.png create mode 100644 src/ui/qdarkstyle/rc/line_horizontal_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/line_horizontal_focus.png create mode 100644 src/ui/qdarkstyle/rc/line_horizontal_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/line_horizontal_pressed.png create mode 100644 src/ui/qdarkstyle/rc/line_horizontal_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/line_vertical.png create mode 100644 src/ui/qdarkstyle/rc/line_vertical@2x.png create mode 100644 src/ui/qdarkstyle/rc/line_vertical_disabled.png create mode 100644 src/ui/qdarkstyle/rc/line_vertical_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/line_vertical_focus.png create mode 100644 src/ui/qdarkstyle/rc/line_vertical_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/line_vertical_pressed.png create mode 100644 src/ui/qdarkstyle/rc/line_vertical_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/radio_checked.png create mode 100644 src/ui/qdarkstyle/rc/radio_checked@2x.png create mode 100644 src/ui/qdarkstyle/rc/radio_checked_disabled.png create mode 100644 src/ui/qdarkstyle/rc/radio_checked_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/radio_checked_focus.png create mode 100644 src/ui/qdarkstyle/rc/radio_checked_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/radio_checked_pressed.png create mode 100644 src/ui/qdarkstyle/rc/radio_checked_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/radio_unchecked.png create mode 100644 src/ui/qdarkstyle/rc/radio_unchecked@2x.png create mode 100644 src/ui/qdarkstyle/rc/radio_unchecked_disabled.png create mode 100644 src/ui/qdarkstyle/rc/radio_unchecked_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/radio_unchecked_focus.png create mode 100644 src/ui/qdarkstyle/rc/radio_unchecked_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/radio_unchecked_pressed.png create mode 100644 src/ui/qdarkstyle/rc/radio_unchecked_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_move_horizontal.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_move_horizontal@2x.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_move_horizontal_disabled.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_move_horizontal_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_move_horizontal_focus.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_move_horizontal_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_move_horizontal_pressed.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_move_horizontal_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_move_vertical.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_move_vertical@2x.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_move_vertical_disabled.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_move_vertical_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_move_vertical_focus.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_move_vertical_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_move_vertical_pressed.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_move_vertical_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_separator_horizontal.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_separator_horizontal@2x.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_separator_horizontal_disabled.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_separator_horizontal_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_separator_horizontal_focus.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_separator_horizontal_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_separator_horizontal_pressed.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_separator_horizontal_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_separator_vertical.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_separator_vertical@2x.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_separator_vertical_disabled.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_separator_vertical_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_separator_vertical_focus.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_separator_vertical_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_separator_vertical_pressed.png create mode 100644 src/ui/qdarkstyle/rc/toolbar_separator_vertical_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/transparent.png create mode 100644 src/ui/qdarkstyle/rc/transparent@2x.png create mode 100644 src/ui/qdarkstyle/rc/transparent_disabled.png create mode 100644 src/ui/qdarkstyle/rc/transparent_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/transparent_focus.png create mode 100644 src/ui/qdarkstyle/rc/transparent_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/transparent_pressed.png create mode 100644 src/ui/qdarkstyle/rc/transparent_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/window_close.png create mode 100644 src/ui/qdarkstyle/rc/window_close@2x.png create mode 100644 src/ui/qdarkstyle/rc/window_close_disabled.png create mode 100644 src/ui/qdarkstyle/rc/window_close_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/window_close_focus.png create mode 100644 src/ui/qdarkstyle/rc/window_close_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/window_close_pressed.png create mode 100644 src/ui/qdarkstyle/rc/window_close_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/window_grip.png create mode 100644 src/ui/qdarkstyle/rc/window_grip@2x.png create mode 100644 src/ui/qdarkstyle/rc/window_grip_disabled.png create mode 100644 src/ui/qdarkstyle/rc/window_grip_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/window_grip_focus.png create mode 100644 src/ui/qdarkstyle/rc/window_grip_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/window_grip_pressed.png create mode 100644 src/ui/qdarkstyle/rc/window_grip_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/window_minimize.png create mode 100644 src/ui/qdarkstyle/rc/window_minimize@2x.png create mode 100644 src/ui/qdarkstyle/rc/window_minimize_disabled.png create mode 100644 src/ui/qdarkstyle/rc/window_minimize_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/window_minimize_focus.png create mode 100644 src/ui/qdarkstyle/rc/window_minimize_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/window_minimize_pressed.png create mode 100644 src/ui/qdarkstyle/rc/window_minimize_pressed@2x.png create mode 100644 src/ui/qdarkstyle/rc/window_undock.png create mode 100644 src/ui/qdarkstyle/rc/window_undock@2x.png create mode 100644 src/ui/qdarkstyle/rc/window_undock_disabled.png create mode 100644 src/ui/qdarkstyle/rc/window_undock_disabled@2x.png create mode 100644 src/ui/qdarkstyle/rc/window_undock_focus.png create mode 100644 src/ui/qdarkstyle/rc/window_undock_focus@2x.png create mode 100644 src/ui/qdarkstyle/rc/window_undock_pressed.png create mode 100644 src/ui/qdarkstyle/rc/window_undock_pressed@2x.png create mode 100644 src/ui/qdarkstyle/style.qrc create mode 100644 src/ui/qdarkstyle/style.qss create mode 100644 src/ui/qdarkstyle/svg/arrow_down.svg create mode 100644 src/ui/qdarkstyle/svg/arrow_left.svg create mode 100644 src/ui/qdarkstyle/svg/arrow_right.svg create mode 100644 src/ui/qdarkstyle/svg/arrow_up.svg create mode 100644 src/ui/qdarkstyle/svg/base_icon.svg create mode 100644 src/ui/qdarkstyle/svg/base_palette.svg create mode 100644 src/ui/qdarkstyle/svg/branch_closed.svg create mode 100644 src/ui/qdarkstyle/svg/branch_end.svg create mode 100644 src/ui/qdarkstyle/svg/branch_line.svg create mode 100644 src/ui/qdarkstyle/svg/branch_more.svg create mode 100644 src/ui/qdarkstyle/svg/branch_open.svg create mode 100644 src/ui/qdarkstyle/svg/checkbox_checked.svg create mode 100644 src/ui/qdarkstyle/svg/checkbox_indeterminate.svg create mode 100644 src/ui/qdarkstyle/svg/checkbox_unchecked.svg create mode 100644 src/ui/qdarkstyle/svg/line_horizontal.svg create mode 100644 src/ui/qdarkstyle/svg/line_vertical.svg create mode 100644 src/ui/qdarkstyle/svg/radio_checked.svg create mode 100644 src/ui/qdarkstyle/svg/radio_unchecked.svg create mode 100644 src/ui/qdarkstyle/svg/toolbar_move_horizontal.svg create mode 100644 src/ui/qdarkstyle/svg/toolbar_move_vertical.svg create mode 100644 src/ui/qdarkstyle/svg/toolbar_separator_horizontal.svg create mode 100644 src/ui/qdarkstyle/svg/toolbar_separator_vertical.svg create mode 100644 src/ui/qdarkstyle/svg/transparent.svg create mode 100644 src/ui/qdarkstyle/svg/window_close.svg create mode 100644 src/ui/qdarkstyle/svg/window_grip.svg create mode 100644 src/ui/qdarkstyle/svg/window_minimize.svg create mode 100644 src/ui/qdarkstyle/svg/window_undock.svg create mode 100644 src/utils/CMakeLists.txt create mode 100644 src/utils/ScopeGuard.h create mode 100644 src/utils/childproc.cpp create mode 100644 src/utils/childproc.h create mode 100644 src/utils/config.cpp create mode 100644 src/utils/config.h create mode 100644 src/utils/keysfiles.cpp create mode 100644 src/utils/keysfiles.h create mode 100644 src/utils/networking.cpp create mode 100644 src/utils/networking.h create mode 100644 src/utils/networktype.h create mode 100644 src/utils/nodes.cpp create mode 100644 src/utils/nodes.h create mode 100644 src/utils/prices.cpp create mode 100644 src/utils/prices.h create mode 100644 src/utils/scheduler.cpp create mode 100644 src/utils/scheduler.h create mode 100644 src/utils/seeds.h create mode 100644 src/utils/tails.cpp create mode 100644 src/utils/tails.h create mode 100644 src/utils/textedit.cpp create mode 100644 src/utils/textedit.h create mode 100644 src/utils/tor.cpp create mode 100644 src/utils/tor.h create mode 100644 src/utils/txfiathistory.cpp create mode 100644 src/utils/txfiathistory.h create mode 100644 src/utils/utils.cpp create mode 100644 src/utils/utils.h create mode 100644 src/utils/whonix.cpp create mode 100644 src/utils/whonix.h create mode 100644 src/utils/wsclient.cpp create mode 100644 src/utils/wsclient.h create mode 100644 src/utils/xmrto.cpp create mode 100644 src/utils/xmrto.h create mode 100644 src/utils/xmrtoapi.cpp create mode 100644 src/utils/xmrtoapi.h create mode 100644 src/utils/xmrtoorder.cpp create mode 100644 src/utils/xmrtoorder.h create mode 100644 src/widgets/CCSEntry.h create mode 100644 src/widgets/RedditPost.h create mode 100644 src/widgets/ccswidget.cpp create mode 100644 src/widgets/ccswidget.h create mode 100644 src/widgets/cssprogressdelegate.cpp create mode 100644 src/widgets/cssprogressdelegate.h create mode 100644 src/widgets/csswidget.ui create mode 100644 src/widgets/nodewidget.cpp create mode 100644 src/widgets/nodewidget.h create mode 100644 src/widgets/nodewidget.ui create mode 100644 src/widgets/redditwidget.cpp create mode 100644 src/widgets/redditwidget.h create mode 100644 src/widgets/redditwidget.ui create mode 100644 src/widgets/restoreheightwidget.cpp create mode 100644 src/widgets/restoreheightwidget.h create mode 100644 src/widgets/restoreheightwidget.ui create mode 100644 src/widgets/tickerwidget.cpp create mode 100644 src/widgets/tickerwidget.h create mode 100644 src/widgets/tickerwidget.ui create mode 100644 src/wizard/createwallet.cpp create mode 100644 src/wizard/createwallet.h create mode 100644 src/wizard/createwallet.ui create mode 100644 src/wizard/createwalletseed.cpp create mode 100644 src/wizard/createwalletseed.h create mode 100644 src/wizard/createwalletseed.ui create mode 100644 src/wizard/menu.cpp create mode 100644 src/wizard/menu.h create mode 100644 src/wizard/menu.ui create mode 100644 src/wizard/network.cpp create mode 100644 src/wizard/network.h create mode 100644 src/wizard/network.ui create mode 100644 src/wizard/openwallet.cpp create mode 100644 src/wizard/openwallet.h create mode 100644 src/wizard/openwallet.ui create mode 100644 src/wizard/restorewallet.cpp create mode 100644 src/wizard/restorewallet.h create mode 100644 src/wizard/restorewallet.ui create mode 100644 src/wizard/walletwizard.cpp create mode 100644 src/wizard/walletwizard.h create mode 100644 src/xmrtowidget.cpp create mode 100644 src/xmrtowidget.h create mode 100644 src/xmrtowidget.ui create mode 100644 utils/Info.plist create mode 100644 utils/build_macos.sh create mode 100644 utils/images/feather-home.png create mode 100644 utils/pubkeys/dsc.asc create mode 100644 utils/pubkeys/kitware.asc create mode 100644 utils/pubkeys/tobtoht.asc diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..01a8d7c --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +* +!contrib/Qt5.15_LinuxPatch.json +!utils/pubkeys/* \ No newline at end of file diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..41c83cc --- /dev/null +++ b/.drone.yml @@ -0,0 +1,160 @@ +--- +kind: pipeline +type: docker +name: linux-release + +steps: + - name: build + image: feather:linux + volumes: + - name: ccache_linux_release + path: /root/.ccache + - name: files_linux_release + path: /files + commands: + - git config --global url."http://gitea:3000/tor/".insteadOf https://git.torproject.org/ + - git config --global url."http://gitea:3000/".insteadOf https://github.com/ + - git submodule update --init --depth 50 contrib/tor + - git submodule update --init --depth 50 contrib/torsocks + - git submodule update --init --depth 120 monero + - git submodule update --init --depth 120 --recursive monero + - make -j8 release-static + environment: + OPENSSL_ROOT_DIR: /usr/local/openssl/ + CMAKEFLAGS_EXTRA: -DFETCH_DEPS=Off + - name: deploy + image: feather:linux + volumes: + - name: ccache_linux_release + path: /root/.ccache + - name: files_linux_release + path: /files + commands: + - export FN="feather-`git rev-parse --short HEAD`.zip" + - export TARGET_DIR="/files/$DRONE_SOURCE_BRANCH" + - mkdir -p "$TARGET_DIR" + - echo "writing to $TARGET_DIR/$FN" + - strip -s build/bin/feather + - zip -j "$TARGET_DIR/$FN" build/feather.log build/bin/feather + - echo "[*] written to https://build.featherwallet.org/files/linux-release/$DRONE_SOURCE_BRANCH/$FN" + +volumes: +- name: ccache_linux_release + host: + path: /var/drone/ccache_linux_release/ +- name: files_linux_release + host: + path: /mnt/storage1/feather_files/files/linux-release/ + +--- + +kind: pipeline +type: docker +name: linux-release-appimage + +steps: + - name: build + image: feather:appimage + commands: + - export FN="feather-`git rev-parse --short HEAD`.zip" + - export BRANCH="$DRONE_SOURCE_BRANCH" + - bash ./contrib/build-appimage.sh + - name: deploy + image: feather:appimage + volumes: + - name: files_linux_appimage + path: /files + commands: + - export FN="feather-`git rev-parse --short HEAD`.AppImage" + - export TARGET_DIR="/files/$DRONE_SOURCE_BRANCH" + - mkdir -p "$TARGET_DIR" + - echo "writing to $TARGET_DIR/$FN" + - mv "Feather-1.0-x86_64.AppImage" "$TARGET_DIR/$FN" + - echo "[*] written to https://build.featherwallet.org/files/linux-release-appimage/$DRONE_SOURCE_BRANCH/$FN" + +volumes: + - name: files_linux_appimage + host: + path: /mnt/storage1/feather_files/files/linux-release-appimage/ + +--- + +kind: pipeline +type: docker +name: windows-mxe-release + +steps: + - name: build + image: feather:win + volumes: + - name: ccache_win_release + path: /root/.ccache + - name: files_win_release + path: /files + commands: + - git config --global url."http://gitea:3000/tor/".insteadOf https://git.torproject.org/ + - git config --global url."http://gitea:3000/".insteadOf https://github.com/ + - git submodule update --init --depth 50 contrib/tor + - git submodule update --init --depth 50 contrib/torsocks + - git submodule update --init --depth 120 monero + - git submodule update --init --depth 120 --recursive monero + - PATH=/mxe/usr/bin/:$PATH make -j8 windows-mxe-release + environment: + CMAKEFLAGS_EXTRA: -DFETCH_DEPS=Off + - name: deploy + image: feather:win + volumes: + - name: ccache_win_release + path: /root/.ccache + - name: files_win_release + path: /files + commands: + - export FN="feather-`git rev-parse --short HEAD`.zip" + - export TARGET_DIR="/files/$DRONE_SOURCE_BRANCH" + - mkdir -p "$TARGET_DIR" + - echo "writing to $TARGET_DIR/$FN" + - zip -j "$TARGET_DIR/$FN" build/feather.log build/bin/feather.exe + - echo "[*] written to https://build.featherwallet.org/files/windows-mxe-release/$DRONE_SOURCE_BRANCH/$FN" + +volumes: +- name: ccache_win_release + host: + path: /var/drone/ccache_win_release/ +- name: files_win_release + host: + path: /mnt/storage1/feather_files/files/windows-mxe-release/ + +--- + +kind: pipeline +type: docker +name: mac-release + +steps: + - name: build + image: feather:mac + volumes: + - name: files_mac_release + path: /files + commands: + - mkdir -p build + - scp -P22 utils/build_macos.sh administrator@steve.jobs.xmr.pm:build_macos.sh + - ssh administrator@steve.jobs.xmr.pm "chmod +x build_macos.sh && PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin ~/build_macos.sh $DRONE_COMMIT_SHA" + - scp -P22 administrator@steve.jobs.xmr.pm:feather.zip build/feather.zip + - name: deploy + image: feather:mac + volumes: + - name: files_mac_release + path: /files + commands: + - export FN="feather-`git rev-parse --short HEAD`.zip" + - export TARGET_DIR="/files/$DRONE_SOURCE_BRANCH" + - mkdir -p "$TARGET_DIR" + - echo "writing to $TARGET_DIR/$FN" + - mv build/feather.zip "$TARGET_DIR/$FN" + - echo "[*] written to https://build.featherwallet.org/files/mac-release/$DRONE_SOURCE_BRANCH/$FN" + +volumes: +- name: files_mac_release + host: + path: /mnt/storage1/feather_files/files/mac-release/ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0a00d97 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +.DS_Store +lib/* +cmake-build-debug/* +.idea +*.user +*.stash +build/* +CMakeCache.txt +CMakeFiles +cmake_install.cmake +feather_autogen/ +feather.cbp +src/tor/* +!src/tor/.gitkeep +src/config-feather.h diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..4053728 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,9 @@ +[submodule "monero"] + path = monero + url = https://git.wownero.com/feather/monero.git +[submodule "contrib/torsocks"] + path = contrib/torsocks + url = https://git.torproject.org/torsocks.git +[submodule "contrib/tor"] + path = contrib/tor + url = https://git.torproject.org/tor.git diff --git a/BUILDING.md b/BUILDING.md new file mode 100644 index 0000000..35efd02 --- /dev/null +++ b/BUILDING.md @@ -0,0 +1,101 @@ +# Buildbot builds + +The docker build bins can be found here: https://build.featherwallet.org/files/ + +## Docker static builds + +Static builds via Docker are done in 3 steps: + +1. Cloning this repository (+submodules) +2. Creating a base Docker image +3. Using the base image to compile a build + +### Windows + +The docker image for Windows static compiles uses Ubuntu 18.04 and installs [mxe](https://mxe.cc) from [our git](https://git.wownero.com/feather/mxe/src/branch/feather-patch), +which comes with: OpenSSL 1.1.1g, Qt 5.15.0 (OpenGL via mesa). For more information, check the Dockerfile: `Dockerfile_windows`. + +#### 1. Clone + +```bash +git clone --recursive https://git.wownero.com/feather/feather.git +cd feather +``` + +#### 2. Base image + +Warning: Building the MXE base image takes up to a hour, so go watch a movie. + +```bash +docker build -f Dockerfile_windows --tag feather:win --build-arg THREADS=8 . +``` + +Note: You only need to build the base image once. + +#### 3. Build + +```bash +docker run --rm -it -v /tmp/ccache:/root/.ccache -v /root/feather:/feather -w /feather feather:win /bin/bash -c 'PATH=/mxe/usr/bin/:$PATH make windows-mxe-release -j8' +``` + +Replace `PATH_TO_FEATHER` with the absolute path to Feather locally. + +The resulting binary can be found in `build/bin/feather.exe`. + +### Linux + +The docker image for Linux static compiles uses Ubuntu 18.04 and compiles the required libraries statically so that +the resulting Feather binary is static. It comes with OpenSSL 1.1.1g, Qt 5.15.0 (OpenGL disabled). For more information, +check the Dockerfile: `Dockerfile`. + +#### 1. Clone + +```bash +git clone --recursive https://git.wownero.com/feather/feather.git +cd feather +``` + +#### 2. Base image + +Warning: Building the base image takes a while, go prepare some dinner. + +```bash +docker build --tag feather:linux --build-arg THREADS=8 . +``` + +Note: You only need to build the base image once. + +#### 3. Build + +```bash +docker run --env OPENSSL_ROOT_DIR=/usr/local/openssl/ --rm -it -v /tmp/ccache:/root/.ccache -v PATH_TO_FEATHER:/feather -w /feather feather:linux sh -c 'make release-static -j8' +``` + +Replace `PATH_TO_FEATHER` with the absolute path to Feather locally. + +The resulting binary can be found in `build/bin/feather`. + +## macOS + +For MacOS it's easiest to leverage [brew](https://brew.sh) to install the required dependencies. + +```bash +HOMEBREW_OPTFLAGS="-march=core2" HOMEBREW_OPTIMIZATION_LEVEL="O0" \ + brew install boost zmq openssl libpgm miniupnpc libsodium expat libunwind-headers protobuf libgcrypt qrencode ccache cmake pkgconfig git +``` + +Clone the repository. + +```bash +git clone --recursive https://git.wownero.com/feather/feather.git +``` + +Get the latest LTS from here: https://www.qt.io/offline-installers and install. + +Build Feather. + +```bash +CMAKE_PREFIX_PATH=~/Qt5.15.1/5.15.1/clang_64 make mac-release +``` + +The resulting Mac OS application can be found `build/bin/feather.app`. diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..9fe9733 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,349 @@ +cmake_minimum_required(VERSION 3.13) +project(feather) + +message(STATUS "Initiating compile using CMake ${CMAKE_VERSION}") + +set(THREADS_PREFER_PTHREAD_FLAG ON) +set(VERSION_MAJOR "0") +set(VERSION_MINOR "1") +set(VERSION_REVISION "0") +set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}") + +option(FETCH_DEPS "Download dependencies if they are not found" ON) +option(XMRTO "Include Xmr.To module" ON) +option(BUILD_TOR "Build Tor" OFF) +option(STATIC "Link libraries statically, requires static Qt") +option(USE_DEVICE_TREZOR "Trezor support compilation" OFF) +option(DONATE_BEG "Prompt donation window every once in a while" ON) +list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR}/cmake") +include(CheckCCompilerFlag) +include(CheckCXXCompilerFlag) +include(CheckLinkerFlag) +include(FetchContent) +include(FindCcache) +include(CheckIncludeFile) +include(CheckSymbolExists) + +if(DEBUG) + set(CMAKE_VERBOSE_MAKEFILE ON) +endif() + +set(MONERO_HEAD "a1404e92cb439ba0f120e7c4a579ed0b9a0372a4") +set(BUILD_GUI_DEPS ON) +set(ARCH "x86-64") +set(BUILD_64 ON) +set(INSTALL_VENDORED_LIBUNBOUND ${STATIC}) +set(USE_SINGLE_BUILDDIR ON) + +check_include_file(sys/prctl.h HAVE_SYS_PRCTL_H) +check_symbol_exists(prctl "sys/prctl.h" HAVE_PRCTL) + +if(STATIC) + message(STATUS "Initiating static build, turning on manual submodules") + set(MANUAL_SUBMODULES 1) + + # monero-project/unbound:monero has a fix for static builds, however, it's not merged in Monero yet, because + # it breaks their buildbot, since that still uses openssl 1.1.0 and we use openssl 1.1.1g. We need to + # manually set the unbound submodule the right commit that has the fix. + # This only works with -DMANUAL_SUBMODULES=1 + message(STATUS "applying unbound static build fix contrib/unbound_static.patch") + execute_process(COMMAND bash -c "git -C ${CMAKE_SOURCE_DIR}/monero/external/unbound apply ${CMAKE_SOURCE_DIR}/contrib/unbound_static.patch") + + set(Boost_USE_STATIC_LIBS ON) + set(Boost_USE_STATIC_RUNTIME ON) + add_definitions(-DMONERO_GUI_STATIC) +endif() + +function (add_c_flag_if_supported flag var) + string(REPLACE "-" "_" supported ${flag}_c) + check_c_compiler_flag(${flag} ${supported}) + if(${${supported}}) + set(${var} "${${var}} ${flag}" PARENT_SCOPE) + endif() +endfunction() + +function (add_cxx_flag_if_supported flag var) + string(REPLACE "-" "_" supported ${flag}_cxx) + check_cxx_compiler_flag(${flag} ${supported}) + if(${${supported}}) + set(${var} "${${var}} ${flag}" PARENT_SCOPE) + endif() +endfunction() + +function (add_linker_flag_if_supported flag var) + string(REPLACE "-" "_" supported ${flag}_ld) + string(REPLACE "," "_" supported ${flag}_ld) + check_linker_flag(${flag} ${supported}) + if(${${supported}}) + set(${var} "${${var}} ${flag}" PARENT_SCOPE) + endif() +endfunction() + +find_package(Git) +if(GIT_FOUND) + execute_process(COMMAND git rev-parse "HEAD" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/monero OUTPUT_VARIABLE _MONERO_HEAD OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT _MONERO_HEAD STREQUAL MONERO_HEAD) + message(FATAL_ERROR "[submodule] Monero HEAD was at ${_MONERO_HEAD} but should be at ${MONERO_HEAD}") + else() + message(STATUS "[submodule] Monero HEAD @ ${MONERO_HEAD}") + endif() +endif() + +add_subdirectory(monero) +set_property(TARGET wallet_merged PROPERTY FOLDER "monero") +get_directory_property(ARCH_WIDTH DIRECTORY "monero" DEFINITION ARCH_WIDTH) +get_directory_property(UNBOUND_LIBRARY DIRECTORY "monero" DEFINITION UNBOUND_LIBRARY) + +include(CMakePackageConfigHelpers) +include(VersionMonero) +include(VersionFeather) + +include_directories(${EASYLOGGING_INCLUDE}) +link_directories(${EASYLOGGING_LIBRARY_DIRS}) + +# OpenSSL +if(APPLE AND NOT OPENSSL_ROOT_DIR) + execute_process(COMMAND brew --prefix openssl OUTPUT_VARIABLE OPENSSL_ROOT_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) +endif() +find_package(OpenSSL REQUIRED) +message(STATUS "OpenSSL: Version ${OPENSSL_VERSION}") +message(STATUS "OpenSSL: include dir at ${OPENSSL_INCLUDE_DIR}") +message(STATUS "OpenSSL: libraries at ${OPENSSL_LIBRARIES} ${OPENSSL_SSL_LIBRARIES}") + +# Sodium +find_library(SODIUM_LIBRARY sodium) +message(STATUS "libsodium: libraries at ${SODIUM_LIBRARY}") + +# HIDApi +set(HIDAPI_FOUND OFF) + +# QrEncode +find_package(QREncode REQUIRED) + +# Tevador 14 word Monero seed +find_package(monero-seed CONFIG) +if(NOT monero-seed_FOUND) + if(FETCH_DEPS) + FetchContent_Declare(monero-seed + GIT_REPOSITORY https://git.wownero.com/feather/monero-seed.git) + FetchContent_GetProperties(monero-seed) + if(NOT monero-seed_POPULATED) + message(STATUS "Fetching monero-seed") + FetchContent_Populate(monero-seed) + add_subdirectory(${monero-seed_SOURCE_DIR} ${monero-seed_BINARY_DIR}) + endif() + add_library(monero-seed::monero-seed ALIAS monero-seed) + else() + message(FATAL_ERROR "monero-seed was not installed and fetching deps is disabled") + endif() +endif() + +# Boost +if(DEBUG) + set(Boost_DEBUG ON) +endif() +if(APPLE AND NOT BOOST_ROOT) + execute_process(COMMAND brew --prefix boost OUTPUT_VARIABLE BOOST_ROOT OUTPUT_STRIP_TRAILING_WHITESPACE) +endif() +find_package(Boost 1.58 REQUIRED COMPONENTS + system + filesystem + thread + date_time + chrono + regex + serialization + program_options + locale) + +if(UNIX AND NOT APPLE) + find_package(X11 REQUIRED) + message(STATUS "X11_FOUND = ${X11_FOUND}") + message(STATUS "X11_INCLUDE_DIR = ${X11_INCLUDE_DIR}") + message(STATUS "X11_LIBRARIES = ${X11_LIBRARIES}") + include_directories(${X11_INCLUDE_DIR}) + link_directories(${X11_LIBRARIES}) + if(STATIC) + find_library(XCB_LIBRARY xcb) + message(STATUS "Found xcb library: ${XCB_LIBRARY}") + endif() +endif() + +# Tor/torsocks +set(TOR_TAG "tor-0.4.3.5") +set(TOR_DIR "${CMAKE_SOURCE_DIR}/contrib/tor") +if(UNIX AND NOT APPLE) + set(TOR_LIB "libtorsocks.so") +elseif(APPLE) + set(TOR_LIB "libtorsocks.dylib") +endif() +if("$ENV{DRONE}" STREQUAL "true" AND STATIC AND BUILD_TOR) + message(STATUS "We are inside a static compile with Drone CI") + if(MINGW) + execute_process(COMMAND bash -c "cp /mxe/usr/x86_64-w64-mingw32.static/bin/tor.exe ${CMAKE_SOURCE_DIR}/src/tor/tor.exe") + elseif(UNIX AND NOT APPLE) + execute_process(COMMAND bash -c "cp /usr/local/tor/bin/tor ${CMAKE_SOURCE_DIR}/src/tor/tor") + execute_process(COMMAND bash -c "cp /usr/local/torsocks/lib/torsocks/* ${CMAKE_SOURCE_DIR}/src/tor/") + endif() +else() + if(BUILD_TOR) + if(UNIX OR APPLE) + execute_process(COMMAND bash -c "ls -al src/tor/${TOR_LIB} 2>/dev/null" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE TOR_FOUND OUTPUT_STRIP_TRAILING_WHITESPACE) + if(TOR_FOUND) + message(STATUS "${TOR_LIB} found, skipping Tor build") + else() + message(STATUS "${TOR_LIB} not found, building Tor") + execute_process(COMMAND bash -c "bash build_tor.sh ${TOR_TAG} ${CMAKE_SOURCE_DIR} 'ON'" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/contrib) + endif() + endif() + else() + message(STATUS "Skipping Tor build because -DBUILD_TOR=OFF") + endif() +endif() + +if(MINGW) + string(REGEX MATCH "^[^/]:/[^/]*" msys2_install_path "${CMAKE_C_COMPILER}") + message(STATUS "MSYS location: ${msys2_install_path}") + set(CMAKE_INCLUDE_PATH "${msys2_install_path}/mingw${ARCH_WIDTH}/include") + # This is necessary because otherwise CMake will make Boost libraries -lfoo + # rather than a full path. Unfortunately, this makes the shared libraries get + # linked due to a bug in CMake which misses putting -static flags around the + # -lfoo arguments. + set(DEFLIB ${msys2_install_path}/mingw${ARCH_WIDTH}/lib) + list(REMOVE_ITEM CMAKE_C_IMPLICIT_LINK_DIRECTORIES ${DEFLIB}) + list(REMOVE_ITEM CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES ${DEFLIB}) +endif() + +message(STATUS "Using Boost include dir at ${Boost_INCLUDE_DIRS}") +message(STATUS "Using Boost libraries at ${Boost_LIBRARIES}") + +include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) +if(MINGW) + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wa,-mbig-obj") + set(EXTRA_LIBRARIES mswsock;ws2_32;iphlpapi;crypt32;bcrypt) + if(DEPENDS) + set(ICU_LIBRARIES icuio icui18n icuuc icudata icutu iconv) + else() + set(ICU_LIBRARIES icuio icuin icuuc icudt icutu iconv) + endif() +elseif(APPLE) + set(EXTRA_LIBRARIES "-framework AppKit") +elseif(OPENBSD) + set(EXTRA_LIBRARIES "") +elseif(FREEBSD) + set(EXTRA_LIBRARIES execinfo) +elseif(DRAGONFLY) + find_library(COMPAT compat) + set(EXTRA_LIBRARIES execinfo ${COMPAT}) +elseif(CMAKE_SYSTEM_NAME MATCHES "(SunOS|Solaris)") + set(EXTRA_LIBRARIES socket nsl resolv) +elseif(NOT MSVC AND NOT DEPENDS) + find_library(RT rt) + set(EXTRA_LIBRARIES ${RT}) +endif() + +list(APPEND EXTRA_LIBRARIES ${CMAKE_DL_LIBS}) + +if(APPLE) + include_directories(SYSTEM /usr/include/malloc) + if(POLICY CMP0042) + cmake_policy(SET CMP0042 NEW) + endif() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=x86-64 -fvisibility=default -std=c++11") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=default -DGTEST_HAS_TR1_TUPLE=0") +endif() + +if (APPLE AND NOT IOS) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=x86-64 -fvisibility=default -std=c++11") +endif() + +if(APPLE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=default -DGTEST_HAS_TR1_TUPLE=0") +endif() + +# warnings +# @TODO: enable these 2 for migration to Qt 6 +#add_c_flag_if_supported(-Werror C_SECURITY_FLAGS) +#add_cxx_flag_if_supported(-Werror CXX_SECURITY_FLAGS) +add_c_flag_if_supported(-Wformat C_SECURITY_FLAGS) +add_cxx_flag_if_supported(-Wformat CXX_SECURITY_FLAGS) +add_c_flag_if_supported(-Wformat-security C_SECURITY_FLAGS) +add_cxx_flag_if_supported(-Wformat-security CXX_SECURITY_FLAGS) + +# -fstack-protector +if (NOT OPENBSD AND NOT (WIN32 AND (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_LESS 9.1))) + add_c_flag_if_supported(-fstack-protector C_SECURITY_FLAGS) + add_cxx_flag_if_supported(-fstack-protector CXX_SECURITY_FLAGS) + add_c_flag_if_supported(-fstack-protector-strong C_SECURITY_FLAGS) + add_cxx_flag_if_supported(-fstack-protector-strong CXX_SECURITY_FLAGS) +endif() + +# New in GCC 8.2 +if (NOT OPENBSD AND NOT (WIN32 AND (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_LESS 9.1))) + add_c_flag_if_supported(-fcf-protection=full C_SECURITY_FLAGS) + add_cxx_flag_if_supported(-fcf-protection=full CXX_SECURITY_FLAGS) +endif() +if (NOT WIN32 AND NOT OPENBSD) + add_c_flag_if_supported(-fstack-clash-protection C_SECURITY_FLAGS) + add_cxx_flag_if_supported(-fstack-clash-protection CXX_SECURITY_FLAGS) +endif() + +# Removed in GCC 9.1 (or before ?), but still accepted, so spams the output +if (NOT (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 9.1)) + add_c_flag_if_supported(-mmitigate-rop C_SECURITY_FLAGS) + add_cxx_flag_if_supported(-mmitigate-rop CXX_SECURITY_FLAGS) +endif() + +# linker +if (APPLE) + add_linker_flag_if_supported(-Wl,-bind_at_load LD_SECURITY_FLAGS) + add_linker_flag_if_supported(-Wl,-dead_strip LD_SECURITY_FLAGS) + add_linker_flag_if_supported(-Wl,-dead_strip_dylibs LD_SECURITY_FLAGS) +endif() +if (NOT APPLE AND NOT (WIN32 AND CMAKE_C_COMPILER_ID STREQUAL "GNU")) + # Windows binaries die on startup with PIE when compiled with GCC + add_linker_flag_if_supported(-pie LD_SECURITY_FLAGS) +endif() +add_linker_flag_if_supported(-Wl,-z,relro LD_SECURITY_FLAGS) +add_linker_flag_if_supported(-Wl,-z,now LD_SECURITY_FLAGS) +add_linker_flag_if_supported(-Wl,-z,noexecstack noexecstack_SUPPORTED) +if (noexecstack_SUPPORTED) + set(LD_SECURITY_FLAGS "${LD_SECURITY_FLAGS} -Wl,-z,noexecstack") +endif() +add_linker_flag_if_supported(-Wl,-z,noexecheap noexecheap_SUPPORTED) +if (noexecheap_SUPPORTED) + set(LD_SECURITY_FLAGS "${LD_SECURITY_FLAGS} -Wl,-z,noexecheap") +endif() + +# some windows linker bits +if (WIN32) + add_linker_flag_if_supported(-Wl,--dynamicbase LD_SECURITY_FLAGS) + add_linker_flag_if_supported(-Wl,--nxcompat LD_SECURITY_FLAGS) + add_linker_flag_if_supported(-Wl,--high-entropy-va LD_SECURITY_FLAGS) +endif() + +if(STATIC) + add_linker_flag_if_supported(-static-libgcc STATIC_FLAGS) + add_linker_flag_if_supported(-static-libstdc++ STATIC_FLAGS) + if(MINGW) + add_linker_flag_if_supported(-static STATIC_FLAGS) + endif() +endif() + +# With GCC 6.1.1 the compiled binary malfunctions due to aliasing. Until that +# is fixed in the code (Issue #847), force compiler to be conservative. +add_c_flag_if_supported(-fno-strict-aliasing C_SECURITY_FLAGS) +add_cxx_flag_if_supported(-fno-strict-aliasing CXX_SECURITY_FLAGS) + +add_c_flag_if_supported(-fPIC C_SECURITY_FLAGS) +add_cxx_flag_if_supported(-fPIC CXX_SECURITY_FLAGS) + +message(STATUS "Using C security hardening flags: ${C_SECURITY_FLAGS}") +message(STATUS "Using C++ security hardening flags: ${CXX_SECURITY_FLAGS}") +message(STATUS "Using linker security hardening flags: ${LD_SECURITY_FLAGS}") + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11 ${C_SECURITY_FLAGS}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ${CXX_SECURITY_FLAGS}") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LD_SECURITY_FLAGS} ${STATIC_FLAGS}") + +add_subdirectory(src) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..7e3728f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,307 @@ +FROM ubuntu:18.04 + +ARG THREADS=1 + +RUN apt clean && apt update +RUN apt install -y gnupg + +COPY utils/pubkeys/kitware.asc /kitware.asc +RUN cat /kitware.asc | gpg --dearmor - | tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null +RUN apt install -y automake git pkg-config python wget python3.6-distutils software-properties-common +RUN apt-add-repository 'deb https://apt.kitware.com/ubuntu/ bionic main' && apt update + +ARG DEBIAN_FRONTEND=noninteractive +ENV TZ=Europe/Amsterdam +RUN apt install -y build-essential nano vim aptitude ccache libusb-1.0-0-dev tzdata + +RUN apt install -y xutils-dev && \ + git clone -b xorgproto-2020.1 --depth 1 https://gitlab.freedesktop.org/xorg/proto/xorgproto && \ + cd xorgproto && \ + git reset --hard c62e8203402cafafa5ba0357b6d1c019156c9f36 && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone -b xcb-proto-1.13 --depth 1 https://gitlab.freedesktop.org/xorg/proto/xcbproto && \ + cd xcbproto && \ + git reset --hard 94228cde97d9aecfda04a8e699d462ba2b89e3a0 && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN apt install -y libtool-bin && \ + git clone -b libXau-1.0.9 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxau && \ + cd libxau && \ + git reset --hard d9443b2c57b512cfb250b35707378654d86c7dea && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN apt install -y libpthread-stubs0-dev && \ + git clone -b 1.13.1 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxcb && \ + cd libxcb && \ + git reset --hard 8287ebd7b752c33b0cabc4982606fe4831106f7e && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone -b 0.4.0 --depth 1 --recursive https://gitlab.freedesktop.org/xorg/lib/libxcb-util.git && \ + cd libxcb-util && \ + git reset --hard acf790d7752f36e450d476ad79807d4012ec863b && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone -b xtrans-1.3.5 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxtrans.git && \ + cd libxtrans && \ + git reset --hard 7cbad9fe2e61cd9d5caeaf361826a6f4bd320f03 && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone -b 0.4.0 --depth 1 --recursive https://gitlab.freedesktop.org/xorg/lib/libxcb-image.git && \ + cd libxcb-image && \ + git reset --hard d882052fb2ce439c6483fce944ba8f16f7294639 && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone -b 0.4.0 --depth 1 --recursive https://gitlab.freedesktop.org/xorg/lib/libxcb-keysyms.git && \ + cd libxcb-keysyms && \ + git reset --hard 0e51ee5570a6a80bdf98770b975dfe8a57f4eeb1 && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone -b 0.3.9 --depth 1 --recursive https://gitlab.freedesktop.org/xorg/lib/libxcb-render-util.git && \ + cd libxcb-render-util && \ + git reset --hard 0317caf63de532fd7a0493ed6afa871a67253747 && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone -b 0.4.1 --depth 1 --recursive https://gitlab.freedesktop.org/xorg/lib/libxcb-wm.git && \ + cd libxcb-wm && \ + git reset --hard 24eb17df2e1245885e72c9d4bbb0a0f69f0700f2 && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone -b libX11-1.6.9 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libx11 && \ + cd libx11 && \ + git reset --hard db7cca17ad7807e92a928da9d4c68a00f4836da2 && \ + ACLOCAL='aclocal -I /usr/local/share/aclocal/' CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone -b libXext-1.3.4 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxext && \ + cd libxext && \ + git reset --hard ebb167f34a3514783966775fb12573c4ed209625 && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN apt install -y libpthread-stubs0-dev && \ + git clone -b libXinerama-1.1.4 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxinerama.git && \ + cd libxinerama && \ + git reset --hard c3ab2361f13154921df2992f9eacc1ea1b3f946b && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone -b v1.2.11 --depth 1 https://github.com/madler/zlib && \ + cd zlib && \ + git reset --hard cacf7f1d4e3d44d871b605da3b647f07d718623f && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --static && \ + make -j$THREADS && \ + make -j$THREADS install && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --static --prefix=/usr/local/zlib && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone -b VER-2-10-2 --depth 1 https://git.sv.nongnu.org/r/freetype/freetype2.git && \ + cd freetype2 && \ + git reset --hard 132f19b779828b194b3fede187cee719785db4d8 && \ + ./autogen.sh && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static --with-zlib=no && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone -b R_2_2_9 --depth 1 https://github.com/libexpat/libexpat && \ + cd libexpat/expat && \ + git reset --hard a7bc26b69768f7fb24f0c7976fae24b157b85b13 && \ + ./buildconf.sh && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN apt install -y autopoint gettext gperf libpng-dev && \ + git clone -b 2.13.92 --depth 1 https://gitlab.freedesktop.org/fontconfig/fontconfig && \ + cd fontconfig && \ + git reset --hard b1df1101a643ae16cdfa1d83b939de2497b1bf27 && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static --sysconfdir=/etc --localstatedir=/var && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone -b release-64-2 --depth 1 https://github.com/unicode-org/icu && \ + cd icu/icu4c/source && \ + git reset --hard e2d85306162d3a0691b070b4f0a73e4012433444 && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static --disable-tests --disable-samples && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN apt install -y wget && \ + wget https://dl.bintray.com/boostorg/release/1.73.0/source/boost_1_73_0.tar.gz && \ + echo "9995e192e68528793755692917f9eb6422f3052a53c5e13ba278a228af6c7acf boost_1_73_0.tar.gz" > hashsum.txt && \ + sha256sum -c hashsum.txt && \ + tar -xvzf boost_1_73_0.tar.gz && \ + cd boost_1_73_0 && \ + ./bootstrap.sh && \ + ./b2 --with-atomic --with-system --with-filesystem --with-thread --with-date_time --with-chrono --with-regex --with-serialization --with-program_options --with-locale variant=release link=static runtime-link=static cflags='-fPIC' cxxflags='-fPIC' install -a --prefix=/usr + +RUN wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz && \ + echo "ddb04774f1e32f0c49751e21b67216ac87852ceb056b75209af2443400636d46 openssl-1.1.1g.tar.gz" > hashsum.txt && \ + sha256sum -c hashsum.txt && \ + tar -xzf openssl-1.1.1g.tar.gz && \ + cd openssl-1.1.1g && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./config no-asm no-shared no-zlib-dynamic --prefix=/usr/local/openssl && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN wget https://download.qt.io/archive/qt/5.15/5.15.0/single/qt-everywhere-src-5.15.0.tar.xz && \ + echo "22b63d7a7a45183865cc4141124f12b673e7a17b1fe2b91e433f6547c5d548c3 qt-everywhere-src-5.15.0.tar.xz" > hashsum.txt && \ + sha256sum -c hashsum.txt && \ + tar -xf qt-everywhere-src-5.15.0.tar.xz + +COPY contrib/Qt5.15_LinuxPatch.json /qt-everywhere-src-5.15.0/qtbase/src/gui/configure.json +RUN apt install -y libgl1-mesa-dev libglib2.0-dev libxkbcommon-dev libxkbcommon-x11-dev + +RUN cd /qt-everywhere-src-5.15.0 && \ + sed -ri s/\(Libs:.*\)/\\1\ -lexpat/ /usr/local/lib/pkgconfig/fontconfig.pc && \ + sed -ri s/\(Libs:.*\)/\\1\ -lz/ /usr/local/lib/pkgconfig/freetype2.pc && \ + sed -ri s/\(Libs:.*\)/\\1\ -lXau/ /usr/local/lib/pkgconfig/xcb.pc && \ + OPENSSL_LIBS="-lssl -lcrypto -lpthread -ldl" \ + ./configure --prefix=/usr -platform linux-g++-64 -opensource -confirm-license -release -static -no-avx \ + -no-opengl -qpa xcb -openssl-linked -I /usr/local/openssl/include -L /usr/local/openssl/lib -system-freetype -fontconfig -glib \ + -no-dbus -no-sql-sqlite -no-use-gold-linker -no-kms \ + -qt-harfbuzz -qt-libjpeg -qt-libpng -qt-pcre -qt-zlib \ + -skip qt3d -skip qtandroidextras -skip qtcanvas3d -skip qtcharts -skip qtconnectivity -skip qtdatavis3d \ + -skip qtdoc -skip qtquickcontrols -skip qtquickcontrols2 -skip qtspeech -skip qtgamepad \ + -skip qtlocation -skip qtmacextras -skip qtnetworkauth -skip qtpurchasing -optimize-size \ + -skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qttools \ + -skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebview \ + -skip qtwinextras -skip qtx11extras -skip gamepad -skip serialbus -skip location -skip webengine \ + -skip qtdeclarative -skip qtmultimedia \ + -no-feature-cups -no-feature-ftp -no-feature-pdf -no-feature-animation \ + -nomake examples -nomake tests -nomake tools + +RUN cd /qt-everywhere-src-5.15.0 && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN cd qt-everywhere-src-5.15.0/qttools/src/linguist/lrelease && \ + qmake && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN apt install -y libudev-dev && \ + git clone -b v1.0.23 --depth 1 https://github.com/libusb/libusb && \ + cd libusb && \ + git reset --hard e782eeb2514266f6738e242cdcb18e3ae1ed06fa && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone -b hidapi-0.9.0 --depth 1 https://github.com/libusb/hidapi && \ + cd hidapi && \ + git reset --hard 7da5cc91fc0d2dbe4df4f08cd31f6ca1a262418f && \ + ./bootstrap && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN apt install -y libsodium-dev && \ + git clone -b v4.3.2 --depth 1 https://github.com/zeromq/libzmq && \ + cd libzmq && \ + git reset --hard a84ffa12b2eb3569ced199660bac5ad128bff1f0 && \ + ./autogen.sh && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static --disable-libunwind --with-libsodium && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone -b libgpg-error-1.38 --depth 1 git://git.gnupg.org/libgpg-error.git && \ + cd libgpg-error && \ + git reset --hard 71d278824c5fe61865f7927a2ed1aa3115f9e439 && \ + ./autogen.sh && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static --disable-doc --disable-tests && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone -b libgcrypt-1.8.5 --depth 1 git://git.gnupg.org/libgcrypt.git && \ + cd libgcrypt && \ + git reset --hard 56606331bc2a80536db9fc11ad53695126007298 && \ + ./autogen.sh && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static --disable-doc && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone -b v3.10.0 --depth 1 https://github.com/protocolbuffers/protobuf && \ + cd protobuf && \ + git reset --hard 6d4e7fd7966c989e38024a8ea693db83758944f1 && \ + ./autogen.sh && \ + CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --enable-static --disable-shared && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN apt install -y zip cmake && git clone -b v4.0.2 --depth 1 https://github.com/fukuchi/libqrencode.git && \ + cd libqrencode && \ + git reset --hard 59ee597f913fcfda7a010a6e106fbee2595f68e4 && \ + cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=/usr . && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN apt install -y libmbedtls-dev && git clone -b release-2.1.12-stable --depth 1 https://github.com/libevent/libevent.git && \ + cd libevent && \ + mkdir build && cd build && \ + cmake -DEVENT_LIBRARY_STATIC=ON -DOPENSSL_ROOT_DIR=/usr/local/openssl -DCMAKE_INSTALL_PREFIX=/usr/local/libevent .. && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone -b tor-0.4.3.5 --depth 1 https://git.torproject.org/tor.git && \ + cd tor && \ + bash autogen.sh && \ + LDFLAGS="-L/usr/local/openssl/lib/" LIBS="-lssl -lcrypto -lpthread -ldl" CPPFLAGS="-I/usr/local/openssl/include/" ./configure \ + --enable-static-zlib \ + --enable-static-openssl \ + --enable-static-libevent \ + --disable-system-torrc \ + --with-libevent-dir=/usr/local/libevent \ + --with-openssl-dir=/usr/local/openssl/ \ + --with-zlib-dir=/usr/local/zlib \ + --disable-system-torrc \ + --disable-tool-name-check \ + --disable-systemd \ + --disable-lzma \ + --disable-unittests \ + --disable-zstd \ + --disable-seccomp \ + --disable-asciidoc \ + --disable-manpage \ + --disable-html-manual \ + --disable-system-torrc \ + --prefix=/usr/local/tor && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone https://git.torproject.org/torsocks.git && \ + cd torsocks && \ + bash autogen.sh && \ + ./configure --prefix=/usr/local/torsocks && \ + make -j$THREADS && \ + make -j$THREADS install + +RUN git clone https://git.wownero.com/feather/monero-seed.git && \ + cd monero-seed && \ + cmake -DCMAKE_BUILD_TYPE=Release -Bbuild && \ + make -Cbuild -j$THREADS && \ + make -Cbuild install diff --git a/Dockerfile_appimage b/Dockerfile_appimage new file mode 100644 index 0000000..da34c82 --- /dev/null +++ b/Dockerfile_appimage @@ -0,0 +1,18 @@ +FROM ubuntu:20.04 + +ARG DEBIAN_FRONTEND=noninteractive + +RUN apt clean && apt update +RUN apt install -y golang git build-essential wget curl ngrep unzip file squashfs-tools desktop-file-utils patchelf libxkbcommon-x11-dev + +RUN go get github.com/probonopd/go-appimage/src/appimagetool +RUN go build -trimpath -ldflags="-s -w" github.com/probonopd/go-appimage/src/appimagetool +RUN chmod +x appimagetool + +RUN cd /usr/bin && \ + wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh -O uploadtool && \ + chmod +x uploadtool + +RUN cd / && \ + wget -c https://github.com/AppImage/AppImageKit/releases/download/continuous/runtime-x86_64 && \ + chmod +x runtime-x86_64 \ No newline at end of file diff --git a/Dockerfile_macos b/Dockerfile_macos new file mode 100644 index 0000000..f94f367 --- /dev/null +++ b/Dockerfile_macos @@ -0,0 +1,13 @@ +# this image is used internally for the buildbot +FROM ubuntu:20.04 + +ARG DEBIAN_FRONTEND=noninteractive + +RUN apt clean && apt update +RUN apt install -y git build-essential wget curl ngrep unzip file ssh zip + +RUN cat /dev/zero | ssh-keygen -q -N "" + +RUN cat ~/.ssh/id_rsa.pub + +RUN printf "Host *\n StrictHostKeyChecking no" > ~/.ssh/config \ No newline at end of file diff --git a/Dockerfile_windows b/Dockerfile_windows new file mode 100644 index 0000000..759d88c --- /dev/null +++ b/Dockerfile_windows @@ -0,0 +1,74 @@ +FROM ubuntu:18.04 + +ARG THREADS=1 + +RUN apt clean && apt update +ARG DEBIAN_FRONTEND=noninteractive +ENV TZ=Europe/Amsterdam + +RUN apt install -y \ + autoconf \ + automake \ + autopoint \ + aptitude \ + bash \ + build-essential \ + bison \ + bzip2 \ + ccache \ + flex \ + g++ \ + g++-multilib \ + gettext \ + git \ + gperf \ + intltool \ + libc6-dev-i386 \ + libgdk-pixbuf2.0-dev \ + libltdl-dev \ + libssl-dev \ + libtool-bin \ + libxml-parser-perl \ + lzip \ + nano \ + make \ + openssl \ + p7zip-full \ + patch \ + perl \ + python \ + python-mako \ + ruby \ + sed \ + scons \ + software-properties-common \ + unzip \ + tzdata \ + vim \ + wget \ + xz-utils + +RUN git clone -b feather-patch --depth 1 https://git.wownero.com/feather/mxe.git && \ + cd mxe && \ + make -j$THREADS MXE_TARGETS='x86_64-w64-mingw32.static' gcc libqrencode pkgconf libgpg_error libgcrypt cmake libsodium lzma readline libzmq boost qtbase qtsvg qtwebsockets qtimageformats + +# plugins +RUN cd mxe && make -j$THREADS MXE_PLUGIN_DIRS='/mxe/plugins/apps/' MXE_TARGETS='x86_64-w64-mingw32.static' tor + +# fix env. +RUN echo "export PATH=\"/mxe/usr/bin/:\$PATH\"" >> "/root/.bashrc" +RUN ln -s /mxe/usr/bin/x86_64-w64-mingw32.static-cmake /usr/local/bin/cmake +RUN ln -s /mxe/usr/bin/x86_64-w64-mingw32.static-windres /usr/local/bin/windres +RUN ln -s /mxe/usr/x86_64-w64-mingw32.static/lib/libsicudt.a /mxe/usr/x86_64-w64-mingw32.static/lib/libicudt.a +RUN ln -s /mxe/usr/x86_64-w64-mingw32.static/lib/libsicuio.a /mxe/usr/x86_64-w64-mingw32.static/lib/libicuio.a +RUN ln -s /mxe/usr/x86_64-w64-mingw32.static/lib/libsicutu.a /mxe/usr/x86_64-w64-mingw32.static/lib/libicutu.a +RUN ln -s /mxe/usr/x86_64-w64-mingw32.static/lib/libsicuuc.a /mxe/usr/x86_64-w64-mingw32.static/lib/libicuuc.a +RUN ln -s /mxe/usr/x86_64-w64-mingw32.static/lib/libsicuin.a /mxe/usr/x86_64-w64-mingw32.static/lib/libicuin.a + +ENV PATH="/mxe/usr/bin/:$PATH" + +RUN git clone https://git.wownero.com/feather/monero-seed.git && \ + cd monero-seed && \ + cmake -DCMAKE_BUILD_TYPE=Release -Bbuild && \ + make -Cbuild -j$THREADS && \ + make -Cbuild install diff --git a/HACKING.md b/HACKING.md new file mode 100644 index 0000000..f644a4c --- /dev/null +++ b/HACKING.md @@ -0,0 +1,104 @@ +# Documentation for developers + +Feather is developed primarily on Linux. It uses Qt 5.15.* and chances are that your +distro's package manager has a lower version. It is therefore recommended that you install +Qt manually using the online installer, which can be found here: https://www.qt.io/download +(under open-source). + +## Jetbrains Clion + +Feather was developed using JetBrains Clion since it integrates nicely +with CMake and comes with a built-in debugger. To pass CMake flags to CLion, +go to `File->Settings->Build->CMake`, set Build Type to `Debug` and set your +preferred CMake options/definitions. + +## Requirements + +### Ubuntu/Debian + +```bash +apt install -y git cmake libqrencode-dev build-essential cmake libboost-all-dev \ +miniupnpc libunbound-dev graphviz doxygen libunwind8-dev pkg-config libssl-dev \ +libzmq3-dev libsodium-dev libhidapi-dev libnorm-dev libusb-1.0-0-dev libpgm-dev \ +libprotobuf-dev protobuf-compiler libgcrypt20-dev +``` + +## Mac OS + +```bash +brew install boost zmq openssl libpgm miniupnpc libsodium expat libunwind-headers \ +protobuf libgcrypt qrencode ccache cmake pkgconfig git +``` + +## CMake + +After installing Qt you might have a folder called `/home/$user/Qt/`. You need to pass this to CMake +via the `CMAKE_PREFIX_PATH` definition. For me this is: + +``` +-DCMAKE_PREFIX_PATH=/home/dsc/QtNew/5.15.0/gcc_64 +``` + +There are some Monero/Feather related options/definitions that you may pass: + +- `-DXMRTO=OFF` - disable Xmr.To feature +- `-DBUILD_TOR=OFF` - disable embedded Tor +- `-DDONATE_BEG=OFF` - disable the dreaded donate requests + +And: + +``` +-DMANUAL_SUBMODULES=1 +-DUSE_DEVICE_TREZOR=OFF +-DUSE_SINGLE_BUILDDIR=ON +-DDEV_MODE=ON +``` + +If you have OpenSSL installed in a custom location, try: + +``` +-DOPENSSL_INCLUDE_DIR=/usr/local/lib/openssl-1.1.1g/include +-DOPENSSL_SSL_LIBRARY=/usr/local/lib/openssl-1.1.1g/libssl.so.1.1 +-DOPENSSL_CRYPTO_LIBRARY=/usr/local/lib/openssl-1.1.1g/libcrypto.so.1.1 +``` + +I prefer also enabling verbose makefiles, which may be useful in some situations. + +``` +-DCMAKE_VERBOSE_MAKEFILE=ON +``` + +Enable debugging symbols: + +```bash +-DCMAKE_BUILD_TYPE=Debug +``` + +## Feather + +It's best to install Tor locally as a service and start Feather with `--use-local-tor`, this +prevents the child process from starting up and saves time. + +#### Ubuntu/Debian + +```bash +apt install -y tor +sudo service tor start +``` + +#### Mac OS + +```bash +brew install tor +brew services start tor +``` + +To skip the wizards and open a wallet directly use `--wallet-file`: + +```bash +./feather --use-local-tor --wallet-file /home/user/Monero/wallets/bla.keys +``` + +It is recommended that you use `--stagenet` for development. Testnet is also possible, +but you'll have to provide Feather a testnet node of your own. + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b99f64a --- /dev/null +++ b/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2020, The Monero Project + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors +may be used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..88d2800 --- /dev/null +++ b/Makefile @@ -0,0 +1,70 @@ +# Copyright (c) 2014-2021, The Monero Project +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, are +# permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of +# conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list +# of conditions and the following disclaimer in the documentation and/or other +# materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be +# used to endorse or promote products derived from this software without specific +# prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + +CMAKEFLAGS = \ + -DARCH=x86_64 \ + -DBUILD_64=On \ + -DBUILD_TESTS=Off \ + -DXMRTO=ON \ + -DCMAKE_CXX_STANDARD=11 \ + -DCMAKE_VERBOSE_MAKEFILE=On \ + -DINSTALL_VENDORED_LIBUNBOUND=Off \ + -DMANUAL_SUBMODULES=1 \ + -DSTATIC=On \ + -DUSE_DEVICE_TREZOR=Off \ + $(CMAKEFLAGS_EXTRA) + +release-static: CMAKEFLAGS += -DBUILD_TAG="linux-x64" +release-static: CMAKEFLAGS += -DBUILD_TOR=On +release-static: CMAKEFLAGS += -DCMAKE_BUILD_TYPE=Release +release-static: + cmake -Bbuild $(CMAKEFLAGS) + $(MAKE) -Cbuild + +windows-mxe-release: CMAKEFLAGS += -DBUILD_TAG="win-x64" +windows-mxe-release: CMAKEFLAGS += -DBUILD_TOR=On +windows-mxe-release: CMAKEFLAGS += -DCMAKE_BUILD_TYPE=Release +windows-mxe-release: + cmake -Bbuild $(CMAKEFLAGS) + $(MAKE) -Cbuild + +windows-mxe-debug: CMAKEFLAGS += -DBUILD_TAG="win-x64" +windows-mxe-debug: CMAKEFLAGS += -DBUILD_TOR=Off +windows-mxe-debug: CMAKEFLAGS += -DCMAKE_BUILD_TYPE=Debug +windows-mxe-debug: + cmake -Bbuild $(CMAKEFLAGS) + $(MAKE) -Cbuild + +mac-release: CMAKEFLAGS += -DSTATIC=Off +mac-release: CMAKEFLAGS += -DBUILD_TAG="mac-x64" +mac-release: CMAKEFLAGS += -DBUILD_TOR=Off +mac-release: CMAKEFLAGS += -DCMAKE_BUILD_TYPE=Release +mac-release: + cmake -Bbuild $(CMAKEFLAGS) + $(MAKE) -Cbuild + $(MAKE) -Cbuild deploy \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..3618247 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# Feather - a free Monero desktop wallet + +[![Build Status](https://build.featherwallet.org/api/badges/feather/feather/status.svg)](https://build.featherwallet.org/feather/feather) + +Feather is a free, open-source Monero client for Mac OS and Linux platforms written in C++ with the Qt framework. It is created and maintained by [dsc](dsc@xmr.pm) and [tobtoht](thotbot@protonmail.com). + +## Development resources +* Web: [featherwallet.org](https://featherwallet.org) +* Git: [git.wownero.com/feather/feather](https://git.wownero.com/feather/feather) +* IRC: `#feather` on OFTC +* Development builds: [build.featherwallet.org/files](https://build.featherwallet.org/files/) + +Copyright (c) 2020-2021 The Monero Project. + +## Compiling Feather from source + +Feather uses Monero, as such it requires the same dependencies as outlined in [Monero's README](https://github.com/monero-project/monero#compiling-monero-from-source). Additionally, Feather uses: + +- Qt 5.15.0 +- libqrencode +- openpgp + +See [BUILDING.md](https://git.wownero.com/feather/feather/src/branch/master/BUILDING.md) for information on how to compile a build. + +## Supporting the project + +Feather is a 100% community-sponsored endeavor. If you want to join our efforts, the easiest thing you can do is support the project financially. + +`47ntfT2Z5384zku39pTM6hGcnLnvpRYW2Azm87GiAAH2bcTidtq278TL6HmwyL8yjMeERqGEBs3cqC8vvHPJd1cWQrGC65f` + +## Developers + +See [HACKING.md](https://git.wownero.com/feather/feather/src/branch/master/HACKING.md) for useful development resources. + +It is HIGHLY recommended that you join the `#feather` IRC channel on OFTC if you are hacking on Feather. Due to the nature of this open source software project, joining this channel and idling is the best way to stay updated on best practices and new developments. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..250d74d --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,16 @@ +# Security Policy + +## Reporting a Vulnerability + +Please do not open an issue to report security issues. + +To report a vulnerability send an email to dev@featherwallet.org + +The following keys may be used to communicate sensitive information to developers: + +| Name | Fingerprint | +|------|-------------| +| dsc | 1BFD 40F9 B0E2 B40D C8C7 FD4A 521F 1E79 91AA 42DC | +| tobtoht | C5AB E5C0 E50F A2B3 F14A B92D 1CAD D27F 41F4 5C3C | + +Public keys can be found in `utils/pubkeys`. diff --git a/cmake/32-bit-toolchain.cmake b/cmake/32-bit-toolchain.cmake new file mode 100644 index 0000000..2d53adf --- /dev/null +++ b/cmake/32-bit-toolchain.cmake @@ -0,0 +1,50 @@ +# Copyright (c) 2014-2019, The Monero Project +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, are +# permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of +# conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list +# of conditions and the following disclaimer in the documentation and/or other +# materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be +# used to endorse or promote products derived from this software without specific +# prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +if (NOT CMAKE_HOST_WIN32) + set (CMAKE_SYSTEM_NAME Windows) +endif() + +set (GCC_PREFIX i686-w64-mingw32) +set (CMAKE_C_COMPILER ${GCC_PREFIX}-gcc) +set (CMAKE_CXX_COMPILER ${GCC_PREFIX}-g++) +set (CMAKE_AR ar CACHE FILEPATH "" FORCE) +set (CMAKE_NM nm CACHE FILEPATH "" FORCE) +set (CMAKE_LINKER ld CACHE FILEPATH "" FORCE) +#set (CMAKE_RANLIB ${GCC_PREFIX}-gcc-ranlib CACHE FILEPATH "" FORCE) +set (CMAKE_RC_COMPILER windres) + +set (CMAKE_FIND_ROOT_PATH "${MSYS2_FOLDER}/mingw32") + +# Ensure cmake doesn't find things in the wrong places +set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # Find programs on host +set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # Find libs in target +set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # Find includes in target + +set (MINGW_FLAG "-m32") +set (USE_LTO_DEFAULT false) diff --git a/cmake/64-bit-toolchain.cmake b/cmake/64-bit-toolchain.cmake new file mode 100644 index 0000000..7c56eef --- /dev/null +++ b/cmake/64-bit-toolchain.cmake @@ -0,0 +1,50 @@ +# Copyright (c) 2014-2019, The Monero Project +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, are +# permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of +# conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list +# of conditions and the following disclaimer in the documentation and/or other +# materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be +# used to endorse or promote products derived from this software without specific +# prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +if (NOT CMAKE_HOST_WIN32) + set (CMAKE_SYSTEM_NAME Windows) +endif() + +set (GCC_PREFIX x86_64-w64-mingw32) +set (CMAKE_C_COMPILER ${GCC_PREFIX}-gcc) +set (CMAKE_CXX_COMPILER ${GCC_PREFIX}-g++) +set (CMAKE_AR ar CACHE FILEPATH "" FORCE) +set (CMAKE_NM nm CACHE FILEPATH "" FORCE) +set (CMAKE_LINKER ld CACHE FILEPATH "" FORCE) +#set (CMAKE_RANLIB ${GCC_PREFIX}-gcc-ranlib CACHE FILEPATH "" FORCE) +set (CMAKE_RC_COMPILER windres) + +set (CMAKE_FIND_ROOT_PATH "${MSYS2_FOLDER}/mingw64") + +# Ensure cmake doesn't find things in the wrong places +set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # Find programs on host +set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # Find libs in target +set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # Find includes in target + +set (MINGW_FLAG "-m64") +set (USE_LTO_DEFAULT false) diff --git a/cmake/CheckLinkerFlag.c b/cmake/CheckLinkerFlag.c new file mode 100644 index 0000000..a0dcc16 --- /dev/null +++ b/cmake/CheckLinkerFlag.c @@ -0,0 +1,14 @@ +#ifdef __CLASSIC_C__ +int main() +{ + int ac; + char* av[]; +#else +int main(int ac, char* av[]) +{ +#endif + if (ac > 1000) { + return *av[0]; + } + return 0; +} diff --git a/cmake/CheckLinkerFlag.cmake b/cmake/CheckLinkerFlag.cmake new file mode 100644 index 0000000..2b507ab --- /dev/null +++ b/cmake/CheckLinkerFlag.cmake @@ -0,0 +1,47 @@ +include(CheckCCompilerFlag) + +macro(CHECK_LINKER_FLAG flag VARIABLE) + if(NOT DEFINED "${VARIABLE}") + if(NOT CMAKE_REQUIRED_QUIET) + message(STATUS "Looking for ${flag} linker flag") + endif() + + set(_cle_source ${CMAKE_SOURCE_DIR}/cmake/CheckLinkerFlag.c) + + set(saved_CMAKE_C_FLAGS ${CMAKE_C_FLAGS}) + set(CMAKE_C_FLAGS "${flag}") + try_compile(${VARIABLE} + ${CMAKE_BINARY_DIR} + ${_cle_source} + COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} ${flag} + CMAKE_FLAGS + OUTPUT_VARIABLE OUTPUT) + unset(_cle_source) + set(CMAKE_C_FLAGS ${saved_CMAKE_C_FLAGS}) + unset(saved_CMAKE_C_FLAGS) + + if ("${OUTPUT}" MATCHES "warning.*ignored") + set(${VARIABLE} 0) + endif() + + if(${VARIABLE}) + if(NOT CMAKE_REQUIRED_QUIET) + message(STATUS "Looking for ${flag} linker flag - found") + endif() + set(${VARIABLE} 1 CACHE INTERNAL "Have linker flag ${flag}") + file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log + "Determining if the ${flag} linker flag is supported " + "passed with the following output:\n" + "${OUTPUT}\n\n") + else() + if(NOT CMAKE_REQUIRED_QUIET) + message(STATUS "Looking for ${flag} linker flag - not found") + endif() + set(${VARIABLE} "" CACHE INTERNAL "Have linker flag ${flag}") + file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log + "Determining if the ${flag} linker flag is supported " + "failed with the following output:\n" + "${OUTPUT}\n\n") + endif() + endif() +endmacro() diff --git a/cmake/CheckTrezor.cmake b/cmake/CheckTrezor.cmake new file mode 100644 index 0000000..54f067d --- /dev/null +++ b/cmake/CheckTrezor.cmake @@ -0,0 +1,5 @@ +OPTION(USE_DEVICE_TREZOR "Trezor support compilation" OFF) +OPTION(USE_DEVICE_TREZOR_LIBUSB "Trezor LibUSB compilation" OFF) +OPTION(USE_DEVICE_TREZOR_UDP_RELEASE "Trezor UdpTransport in release mode" OFF) +OPTION(USE_DEVICE_TREZOR_DEBUG "Trezor Debugging enabled" OFF) +OPTION(TREZOR_DEBUG "Main trezor debugging switch" OFF) diff --git a/cmake/Deploy.cmake b/cmake/Deploy.cmake new file mode 100644 index 0000000..1a1e76b --- /dev/null +++ b/cmake/Deploy.cmake @@ -0,0 +1,28 @@ +if(APPLE OR (WIN32 AND NOT STATIC)) + add_custom_target(deploy) + get_target_property(_qmake_executable Qt5::qmake IMPORTED_LOCATION) + get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY) + + if(APPLE AND NOT IOS) + find_program(MACDEPLOYQT_EXECUTABLE macdeployqt HINTS "${_qt_bin_dir}") + add_custom_command(TARGET deploy + POST_BUILD + COMMAND "${MACDEPLOYQT_EXECUTABLE}" "$/../.." -always-overwrite + COMMENT "Running macdeployqt..." + ) + + # workaround for a Qt bug that requires manually adding libqsvg.dylib to bundle + find_file(_qt_svg_dylib "libqsvg.dylib" PATHS "${CMAKE_PREFIX_PATH}/plugins/imageformats" NO_DEFAULT_PATH) + if(_qt_svg_dylib) + add_custom_command(TARGET deploy + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${_qt_svg_dylib} $/../PlugIns/imageformats/ + COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtGui.framework/Versions/5/QtGui" "@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui" $/../PlugIns/imageformats/libqsvg.dylib + COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtWidgets.framework/Versions/5/QtWidgets" "@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui" $/../PlugIns/imageformats/libqsvg.dylib + COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtSvg.framework/Versions/5/QtSvg" "@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui" $/../PlugIns/imageformats/libqsvg.dylib + COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtCore.framework/Versions/5/QtCore" "@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui" $/../PlugIns/imageformats/libqsvg.dylib + COMMENT "Copying libqsvg.dylib, running install_name_tool" + ) + endif() + endif() +endif() \ No newline at end of file diff --git a/cmake/Doxyfile.in b/cmake/Doxyfile.in new file mode 100644 index 0000000..35a4911 --- /dev/null +++ b/cmake/Doxyfile.in @@ -0,0 +1,1803 @@ +# Doxyfile 1.8.1.2 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. + +PROJECT_NAME = Monero + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = @VERSION_STRING@ + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = @CPACK_PACKAGE_DESCRIPTION_SUMMARY@ + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./docs + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = YES + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = YES + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +SYMBOL_CACHE_SIZE = 0 + +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# scope will be included in the documentation. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ../README.md \ + ../contrib/ \ + ../external/ \ + ../include/ \ + ../tests/ \ + ../src/ + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = *.cpp \ + *.h \ + *.hpp + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = *.pb.* \ + tinythread.* \ + fast_mutex.* \ + anyoption.* \ + stacktrace.* \ + */simpleini/* \ + ExportWrapper.* \ + WinsockWrapper.* \ + otapicli.* \ + test*.* \ + irrXML.* \ + */chaiscript/* \ + */zmq/* + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = tinythread + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = YES + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C, C++ and Fortran comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# style sheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of +# entries shown in the various tree structured indices initially; the user +# can expand and collapse entries dynamically later on. Doxygen will expand +# the tree to such a level that at most the specified number of entries are +# visible (unless a fully collapsed tree already exceeds this amount). +# So setting the number of entries 1 will produce a full collapsed tree by +# default. 0 is a special value representing an infinite number of entries +# and will result in a full expanded tree by default. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. + +GENERATE_TREEVIEW = YES + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = YES + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load style sheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = OT_CRYPTO_USING_OPENSSL \ + OT_CASH_USING_LUCRE + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = NO + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# managable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 10 + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = YES + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/cmake/Doxygen.extra.css.in b/cmake/Doxygen.extra.css.in new file mode 100644 index 0000000..022974f --- /dev/null +++ b/cmake/Doxygen.extra.css.in @@ -0,0 +1,14 @@ +/* increase vertical space */ +#titlearea, #nav-path { + display: none; + height: 0px; +} + + +/* uncomment these lines for some extra vertical space */ + +/* +.tablist li { + line-height: 26px; +} +*/ diff --git a/cmake/FindBacktrace.cmake b/cmake/FindBacktrace.cmake new file mode 100644 index 0000000..8137125 --- /dev/null +++ b/cmake/FindBacktrace.cmake @@ -0,0 +1,98 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# FindBacktrace +# ------------- +# +# Find provider for backtrace(3). +# +# Checks if OS supports backtrace(3) via either libc or custom library. +# This module defines the following variables: +# +# ``Backtrace_HEADER`` +# The header file needed for backtrace(3). Cached. +# Could be forcibly set by user. +# ``Backtrace_INCLUDE_DIRS`` +# The include directories needed to use backtrace(3) header. +# ``Backtrace_LIBRARIES`` +# The libraries (linker flags) needed to use backtrace(3), if any. +# ``Backtrace_FOUND`` +# Is set if and only if backtrace(3) support detected. +# +# The following cache variables are also available to set or use: +# +# ``Backtrace_LIBRARY`` +# The external library providing backtrace, if any. +# ``Backtrace_INCLUDE_DIR`` +# The directory holding the backtrace(3) header. +# +# Typical usage is to generate of header file using configure_file() with the +# contents like the following:: +# +# #cmakedefine01 Backtrace_FOUND +# #if Backtrace_FOUND +# # include <${Backtrace_HEADER}> +# #endif +# +# And then reference that generated header file in actual source. + +include(CMakePushCheckState) +include(CheckSymbolExists) +include(FindPackageHandleStandardArgs) + +# List of variables to be provided to find_package_handle_standard_args() +set(_Backtrace_STD_ARGS Backtrace_INCLUDE_DIR) + +if(Backtrace_HEADER) + set(_Backtrace_HEADER_TRY "${Backtrace_HEADER}") +else(Backtrace_HEADER) + set(_Backtrace_HEADER_TRY "execinfo.h") +endif(Backtrace_HEADER) + +find_path(Backtrace_INCLUDE_DIR "${_Backtrace_HEADER_TRY}") +set(Backtrace_INCLUDE_DIRS ${Backtrace_INCLUDE_DIR}) + +if (NOT DEFINED Backtrace_LIBRARY) + # First, check if we already have backtrace(), e.g., in libc + cmake_push_check_state(RESET) + set(CMAKE_REQUIRED_INCLUDES ${Backtrace_INCLUDE_DIRS}) + set(CMAKE_REQUIRED_QUIET ${Backtrace_FIND_QUIETLY}) + check_symbol_exists("backtrace" "${_Backtrace_HEADER_TRY}" _Backtrace_SYM_FOUND) + cmake_pop_check_state() +endif() + +if(_Backtrace_SYM_FOUND) + # Avoid repeating the message() call below each time CMake is run. + if(NOT Backtrace_FIND_QUIETLY AND NOT DEFINED Backtrace_LIBRARY) + message(STATUS "backtrace facility detected in default set of libraries") + endif() + set(Backtrace_LIBRARY "" CACHE FILEPATH "Library providing backtrace(3), empty for default set of libraries") +else() + # Check for external library, for non-glibc systems + if(Backtrace_INCLUDE_DIR) + # OpenBSD has libbacktrace renamed to libexecinfo + find_library(Backtrace_LIBRARY "execinfo") + elseif() # respect user wishes + set(_Backtrace_HEADER_TRY "backtrace.h") + find_path(Backtrace_INCLUDE_DIR ${_Backtrace_HEADER_TRY}) + find_library(Backtrace_LIBRARY "backtrace") + endif() + + # Prepend list with library path as it's more common practice + set(_Backtrace_STD_ARGS Backtrace_LIBRARY ${_Backtrace_STD_ARGS}) +endif() + +message(STATUS "Backtrace_LIBRARY: ${Backtrace_LIBRARY}") +if(Backtrace_LIBRARY STREQUAL "NOTFOUND") + set(Backtrace_LIBRARY "") +endif() +if(Backtrace_LIBRARY STREQUAL "Backtrace_LIBRARY-NOTFOUND") + set(Backtrace_LIBRARY "") +endif() + +set(Backtrace_LIBRARIES ${Backtrace_LIBRARY}) +set(Backtrace_HEADER "${_Backtrace_HEADER_TRY}" CACHE STRING "Header providing backtrace(3) facility") + +find_package_handle_standard_args(Backtrace FOUND_VAR Backtrace_FOUND REQUIRED_VARS ${_Backtrace_STD_ARGS}) +mark_as_advanced(Backtrace_HEADER Backtrace_INCLUDE_DIR Backtrace_LIBRARY) diff --git a/cmake/FindBerkeleyDB.cmake b/cmake/FindBerkeleyDB.cmake new file mode 100644 index 0000000..916d8f9 --- /dev/null +++ b/cmake/FindBerkeleyDB.cmake @@ -0,0 +1,25 @@ +# - Try to find Berkeley DB +# Once done this will define +# +# BERKELEY_DB_FOUND - system has Berkeley DB +# BERKELEY_DB_INCLUDE_DIR - the Berkeley DB include directory +# BERKELEY_DB_LIBRARIES - Link these to use Berkeley DB +# BERKELEY_DB_DEFINITIONS - Compiler switches required for using Berkeley DB + +# Copyright (c) 2006, Alexander Dymo, +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +find_path(BERKELEY_DB_INCLUDE_DIR db_cxx.h + /usr/include/db4 + /usr/local/include/db4 +) + +find_library(BERKELEY_DB_LIBRARIES NAMES db_cxx ) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Berkeley "Could not find Berkeley DB >= 4.1" BERKELEY_DB_INCLUDE_DIR BERKELEY_DB_LIBRARIES) +# show the BERKELEY_DB_INCLUDE_DIR and BERKELEY_DB_LIBRARIES variables only in the advanced view +mark_as_advanced(BERKELEY_DB_INCLUDE_DIR BERKELEY_DB_LIBRARIES ) + diff --git a/cmake/FindCcache.cmake b/cmake/FindCcache.cmake new file mode 100644 index 0000000..29e2d24 --- /dev/null +++ b/cmake/FindCcache.cmake @@ -0,0 +1,56 @@ +# Copyright (c) 2014-2020, The Monero Project +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, are +# permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of +# conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list +# of conditions and the following disclaimer in the documentation and/or other +# materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be +# used to endorse or promote products derived from this software without specific +# prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# - Try to find readline include dirs and libraries +# +# Automatically finds ccache build accelerator, if it's found in PATH. +# +# Usage of this module as follows: +# +# project(monero) +# include(FindCcache) # Include AFTER the project() macro to be able to reach the CMAKE_CXX_COMPILER variable +# +# Properties modified by this module: +# +# GLOBAL PROPERTY RULE_LAUNCH_COMPILE set to ccache, when ccache found +# GLOBAL PROPERTY RULE_LAUNCH_LINK set to ccache, when ccache found + +find_program(CCACHE_FOUND ccache) +if (CCACHE_FOUND) + set(TEMP_CPP_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test-program.cpp") + file(WRITE "${TEMP_CPP_FILE}" "int main() { return 0; }") + execute_process(COMMAND "${CCACHE_FOUND}" "${CMAKE_CXX_COMPILER}" "${TEMP_CPP_FILE}" RESULT_VARIABLE RET) + if (${RET} EQUAL 0) + message("found usable ccache: ${CCACHE_FOUND}") + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_FOUND}") + set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CCACHE_FOUND}") + else() + message("found ccache ${CCACHE_FOUND}, but is UNUSABLE! Return code: ${RET}") + endif() +else() + message("ccache NOT found!") +endif() diff --git a/cmake/FindGCrypt.cmake b/cmake/FindGCrypt.cmake new file mode 100644 index 0000000..7ce9b9c --- /dev/null +++ b/cmake/FindGCrypt.cmake @@ -0,0 +1,70 @@ +# - Try to find GCrypt +# Once done this will define +# +# GCRYPT_FOUND - system has GCrypt +# GCRYPT_INCLUDE_DIRS - the GCrypt include directory +# GCRYPT_LIBRARIES - Link these to use GCrypt +# GCRYPT_DEFINITIONS - Compiler switches required for using GCrypt +# +#============================================================================= +# Copyright (c) 2009-2011 Andreas Schneider +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# + +if (GCRYPT_LIBRARIES AND GCRYPT_INCLUDE_DIRS) + # in cache already + # set(GCRYPT_FOUND TRUE) +else (GCRYPT_LIBRARIES AND GCRYPT_INCLUDE_DIRS) + + set(_GCRYPT_ROOT_PATHS + "$ENV{PROGRAMFILES}/libgcrypt" + ) + + find_path(GCRYPT_ROOT_DIR + NAMES + include/gcrypt.h + PATHS + ${_GCRYPT_ROOT_PATHS} + ) + mark_as_advanced(ZLIB_ROOT_DIR) + + find_path(GCRYPT_INCLUDE_DIR + NAMES + gcrypt.h + PATHS + /usr/local/include + /opt/local/include + /sw/include + /usr/lib/sfw/include + ${GCRYPT_ROOT_DIR}/include + ) + set(GCRYPT_INCLUDE_DIRS ${GCRYPT_INCLUDE_DIR}) + + find_library(GCRYPT_LIBRARY + NAMES + gcrypt + gcrypt11 + libgcrypt-11 + PATHS + /opt/local/lib + /sw/lib + /usr/sfw/lib/64 + /usr/sfw/lib + ${GCRYPT_ROOT_DIR}/lib + ) + set(GCRYPT_LIBRARIES ${GCRYPT_LIBRARY}) + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(GCrypt DEFAULT_MSG GCRYPT_LIBRARIES GCRYPT_INCLUDE_DIRS) + + # show the GCRYPT_INCLUDE_DIRS and GCRYPT_LIBRARIES variables only in the advanced view + mark_as_advanced(GCRYPT_INCLUDE_DIRS GCRYPT_LIBRARIES) + +endif (GCRYPT_LIBRARIES AND GCRYPT_INCLUDE_DIRS) \ No newline at end of file diff --git a/cmake/FindHIDAPI.cmake b/cmake/FindHIDAPI.cmake new file mode 100644 index 0000000..e69de29 diff --git a/cmake/FindLibunwind.cmake b/cmake/FindLibunwind.cmake new file mode 100644 index 0000000..af657ca --- /dev/null +++ b/cmake/FindLibunwind.cmake @@ -0,0 +1,41 @@ +# - Try to find libunwind +# Once done this will define +# +# LIBUNWIND_FOUND - system has libunwind +# LIBUNWIND_INCLUDE_DIR - the libunwind include directory +# LIBUNWIND_LIBRARIES - Link these to use libunwind +# LIBUNWIND_DEFINITIONS - Compiler switches required for using libunwind + +# Copyright (c) 2006, Alexander Dymo, +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +find_path(LIBUNWIND_INCLUDE_DIR libunwind.h + /usr/include + /usr/local/include +) + +find_library(LIBUNWIND_LIBRARIES NAMES unwind ) +if(NOT LIBUNWIND_LIBRARIES STREQUAL "LIBUNWIND_LIBRARIES-NOTFOUND") + if (CMAKE_COMPILER_IS_GNUCC) + set(LIBUNWIND_LIBRARIES "gcc_eh;${LIBUNWIND_LIBRARIES}") + endif() +endif() + +# some versions of libunwind need liblzma, and we don't use pkg-config +# so we just look whether liblzma is installed, and add it if it is. +# It might not be actually needed, but doesn't hurt if it is not. +# We don't need any headers, just the lib, as it's privately needed. +message(STATUS "looking for liblzma") +find_library(LIBLZMA_LIBRARIES lzma ) +if(NOT LIBLZMA_LIBRARIES STREQUAL "LIBLZMA_LIBRARIES-NOTFOUND") + message(STATUS "liblzma found") + set(LIBUNWIND_LIBRARIES "${LIBUNWIND_LIBRARIES};${LIBLZMA_LIBRARIES}") +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Libunwind "Could not find libunwind" LIBUNWIND_INCLUDE_DIR LIBUNWIND_LIBRARIES) +# show the LIBUNWIND_INCLUDE_DIR and LIBUNWIND_LIBRARIES variables only in the advanced view +mark_as_advanced(LIBUNWIND_INCLUDE_DIR LIBUNWIND_LIBRARIES ) + diff --git a/cmake/FindMiniupnpc.cmake b/cmake/FindMiniupnpc.cmake new file mode 100644 index 0000000..ad2004a --- /dev/null +++ b/cmake/FindMiniupnpc.cmake @@ -0,0 +1,59 @@ +# --------------------------------- FindMiniupnpc Start --------------------------------- +# Locate miniupnp library +# This module defines +# MINIUPNP_FOUND, if false, do not try to link to miniupnp +# MINIUPNP_LIBRARY, the miniupnp variant +# MINIUPNP_INCLUDE_DIR, where to find miniupnpc.h and family) +# MINIUPNPC_VERSION_1_7_OR_HIGHER, set if we detect the version of miniupnpc is 1.7 or higher +# +# Note that the expected include convention is +# #include "miniupnpc.h" +# and not +# #include +# This is because, the miniupnpc location is not standardized and may exist +# in locations other than miniupnpc/ + +if (MINIUPNP_INCLUDE_DIR AND MINIUPNP_LIBRARY) + # Already in cache, be silent + set(MINIUPNP_FIND_QUIETLY TRUE) +endif () + +find_path(MINIUPNP_INCLUDE_DIR miniupnpc.h + HINTS $ENV{MINIUPNP_INCLUDE_DIR} + PATH_SUFFIXES miniupnpc +) + +find_library(MINIUPNP_LIBRARY miniupnpc + HINTS $ENV{MINIUPNP_LIBRARY} +) + +find_library(MINIUPNP_STATIC_LIBRARY libminiupnpc.a + HINTS $ENV{MINIUPNP_STATIC_LIBRARY} +) + +set(MINIUPNP_INCLUDE_DIRS ${MINIUPNP_INCLUDE_DIR}) +set(MINIUPNP_LIBRARIES ${MINIUPNP_LIBRARY}) +set(MINIUPNP_STATIC_LIBRARIES ${MINIUPNP_STATIC_LIBRARY}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args( + MiniUPnPc DEFAULT_MSG + MINIUPNP_INCLUDE_DIR + MINIUPNP_LIBRARY +) + +IF(MINIUPNPC_FOUND) + file(STRINGS "${MINIUPNP_INCLUDE_DIR}/miniupnpc.h" MINIUPNPC_API_VERSION_STR REGEX "^#define[\t ]+MINIUPNPC_API_VERSION[\t ]+[0-9]+") + if(MINIUPNPC_API_VERSION_STR MATCHES "^#define[\t ]+MINIUPNPC_API_VERSION[\t ]+([0-9]+)") + set(MINIUPNPC_API_VERSION "${CMAKE_MATCH_1}") + if (${MINIUPNPC_API_VERSION} GREATER "10" OR ${MINIUPNPC_API_VERSION} EQUAL "10") + message(STATUS "Found miniupnpc API version " ${MINIUPNPC_API_VERSION}) + set(MINIUPNP_FOUND true) + set(MINIUPNPC_VERSION_1_7_OR_HIGHER true) + endif() + endif() + +ENDIF() + +mark_as_advanced(MINIUPNP_INCLUDE_DIR MINIUPNP_LIBRARY MINIUPNP_STATIC_LIBRARY) +# --------------------------------- FindMiniupnpc End --------------------------------- diff --git a/cmake/FindQREncode.cmake b/cmake/FindQREncode.cmake new file mode 100644 index 0000000..2f93c2b --- /dev/null +++ b/cmake/FindQREncode.cmake @@ -0,0 +1,7 @@ +find_path(QRENCODE_INCLUDE_DIR qrencode.h) +find_library(QRENCODE_LIBRARY qrencode) + +mark_as_advanced(QRENCODE_LIBRARY QRENCODE_INCLUDE_DIR) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(QREncode DEFAULT_MSG QRENCODE_LIBRARY QRENCODE_INCLUDE_DIR) diff --git a/cmake/FindReadline.cmake b/cmake/FindReadline.cmake new file mode 100644 index 0000000..f26911b --- /dev/null +++ b/cmake/FindReadline.cmake @@ -0,0 +1,91 @@ +# - Try to find readline include dirs and libraries +# +# Usage of this module as follows: +# +# find_package(Readline) +# +# Variables used by this module, they can change the default behaviour and need +# to be set before calling find_package: +# +# Readline_ROOT_DIR Set this variable to the root installation of +# readline if the module has problems finding the +# proper installation path. +# +# Variables defined by this module: +# +# READLINE_FOUND System has readline, include and lib dirs found +# GNU_READLINE_FOUND Version of readline found is GNU readline, not libedit! +# LIBEDIT_FOUND Version of readline found is libedit, not GNU readline! +# Readline_INCLUDE_DIR The readline include directories. +# Readline_LIBRARY The readline library. +# GNU_READLINE_LIBRARY The GNU readline library or empty string. +# LIBEDIT_LIBRARY The libedit library or empty string. + +find_path(Readline_ROOT_DIR + NAMES include/readline/readline.h + PATHS /usr/local/opt/readline/ /opt/local/ /usr/local/ /usr/ + NO_DEFAULT_PATH +) + +find_path(Readline_INCLUDE_DIR + NAMES readline/readline.h + PATHS ${Readline_ROOT_DIR}/include + NO_DEFAULT_PATH +) + +find_library(Readline_LIBRARY + NAMES readline + PATHS ${Readline_ROOT_DIR}/lib + NO_DEFAULT_PATH +) + +find_library(Termcap_LIBRARY + NAMES tinfo termcap ncursesw ncurses cursesw curses +) + +if(Readline_INCLUDE_DIR AND Readline_LIBRARY) + set(READLINE_FOUND TRUE) +else(Readline_INCLUDE_DIR AND Readline_LIBRARY) + FIND_LIBRARY(Readline_LIBRARY NAMES readline PATHS Readline_ROOT_DIR) + include(FindPackageHandleStandardArgs) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(Readline DEFAULT_MSG Readline_INCLUDE_DIR Readline_LIBRARY ) + MARK_AS_ADVANCED(Readline_INCLUDE_DIR Readline_LIBRARY) +endif(Readline_INCLUDE_DIR AND Readline_LIBRARY) + +mark_as_advanced( + Readline_ROOT_DIR + Readline_INCLUDE_DIR + Readline_LIBRARY +) + +set(CMAKE_REQUIRED_INCLUDES ${Readline_INCLUDE_DIR}) +set(CMAKE_REQUIRED_LIBRARIES ${Readline_LIBRARY}) + +include(CheckFunctionExists) +check_function_exists(rl_copy_text HAVE_COPY_TEXT) +check_function_exists(rl_filename_completion_function HAVE_COMPLETION_FUNCTION) + +if(NOT HAVE_COMPLETION_FUNCTION) + if (Readline_LIBRARY) + set(CMAKE_REQUIRED_LIBRARIES ${Readline_LIBRARY} ${Termcap_LIBRARY}) + endif(Readline_LIBRARY) + check_function_exists(rl_copy_text HAVE_COPY_TEXT_TC) + check_function_exists(rl_filename_completion_function HAVE_COMPLETION_FUNCTION_TC) + set(HAVE_COMPLETION_FUNCTION ${HAVE_COMPLETION_FUNCTION_TC}) + set(HAVE_COPY_TEXT ${HAVE_COPY_TEXT_TC}) + if(HAVE_COMPLETION_FUNCTION) + set(Readline_LIBRARY ${Readline_LIBRARY} ${Termcap_LIBRARY}) + endif(HAVE_COMPLETION_FUNCTION) +endif(NOT HAVE_COMPLETION_FUNCTION) + +set(LIBEDIT_LIBRARY "") +set(GNU_READLINE_LIBRARY "") + +if(HAVE_COMPLETION_FUNCTION AND HAVE_COPY_TEXT) + set(GNU_READLINE_FOUND TRUE) + set(GNU_READLINE_LIBRARY ${Readline_LIBRARY}) +elseif(READLINE_FOUND AND NOT HAVE_COPY_TEXT) + set(LIBEDIT_FOUND TRUE) + set(LIBEDIT_LIBRARY ${Readline_LIBRARY}) +endif(HAVE_COMPLETION_FUNCTION AND HAVE_COPY_TEXT) + diff --git a/cmake/FindSodium.cmake b/cmake/FindSodium.cmake new file mode 100644 index 0000000..3792815 --- /dev/null +++ b/cmake/FindSodium.cmake @@ -0,0 +1,291 @@ +# Written in 2016 by Henrik Steffen Gaßmann +# +# To the extent possible under law, the author(s) have dedicated all copyright +# and related and neighboring rights to this software to the public domain +# worldwide. This software is distributed without any warranty. +# +# You should have received a copy of the CC0 Public Domain Dedication along with +# this software. If not, see +# +# http://creativecommons.org/publicdomain/zero/1.0/ +# +# ############################################################################## +# Tries to find the local libsodium installation. +# +# On Windows the sodium_DIR environment variable is used as a default hint which +# can be overridden by setting the corresponding cmake variable. +# +# Once done the following variables will be defined: +# +# sodium_FOUND sodium_INCLUDE_DIR sodium_LIBRARY_DEBUG sodium_LIBRARY_RELEASE +# sodium_VERSION_STRING +# +# Furthermore an imported "sodium" target is created. +# + +if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang") + set(_GCC_COMPATIBLE 1) +endif() + +# static library option +if(NOT DEFINED sodium_USE_STATIC_LIBS) + option(sodium_USE_STATIC_LIBS "enable to statically link against sodium" OFF) +endif() +if(NOT (sodium_USE_STATIC_LIBS EQUAL sodium_USE_STATIC_LIBS_LAST)) + unset(sodium_LIBRARY CACHE) + unset(sodium_LIBRARY_DEBUG CACHE) + unset(sodium_LIBRARY_RELEASE CACHE) + unset(sodium_DLL_DEBUG CACHE) + unset(sodium_DLL_RELEASE CACHE) + set(sodium_USE_STATIC_LIBS_LAST + ${sodium_USE_STATIC_LIBS} + CACHE INTERNAL "internal change tracking variable") +endif() + +# ############################################################################## +# UNIX +if(UNIX) + # import pkg-config + find_package(PkgConfig QUIET) + if(PKG_CONFIG_FOUND) + pkg_check_modules(sodium_PKG QUIET libsodium) + endif() + + if(sodium_USE_STATIC_LIBS) + if(sodium_PKG_STATIC_LIBRARIES) + foreach(_libname ${sodium_PKG_STATIC_LIBRARIES}) + if(NOT _libname MATCHES "^lib.*\\.a$") # ignore strings already ending + # with .a + list(INSERT sodium_PKG_STATIC_LIBRARIES 0 "lib${_libname}.a") + endif() + endforeach() + list(REMOVE_DUPLICATES sodium_PKG_STATIC_LIBRARIES) + else() + # if pkgconfig for libsodium doesn't provide static lib info, then + # override PKG_STATIC here.. + set(sodium_PKG_STATIC_LIBRARIES libsodium.a) + endif() + + set(XPREFIX sodium_PKG_STATIC) + else() + if(sodium_PKG_LIBRARIES STREQUAL "") + set(sodium_PKG_LIBRARIES sodium) + endif() + + set(XPREFIX sodium_PKG) + endif() + + find_path(sodium_INCLUDE_DIR sodium.h HINTS ${${XPREFIX}_INCLUDE_DIRS}) + find_library(sodium_LIBRARY_DEBUG + NAMES ${${XPREFIX}_LIBRARIES} + HINTS ${${XPREFIX}_LIBRARY_DIRS}) + find_library(sodium_LIBRARY_RELEASE + NAMES ${${XPREFIX}_LIBRARIES} + HINTS ${${XPREFIX}_LIBRARY_DIRS}) + + # ############################################################################ + # Windows +elseif(WIN32) + set(sodium_DIR "$ENV{sodium_DIR}" CACHE FILEPATH "sodium install directory") + mark_as_advanced(sodium_DIR) + + find_path(sodium_INCLUDE_DIR sodium.h + HINTS ${sodium_DIR} + PATH_SUFFIXES include) + + if(MSVC) + # detect target architecture + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/arch.c" [=[ + #if defined _M_IX86 + #error ARCH_VALUE x86_32 + #elif defined _M_X64 + #error ARCH_VALUE x86_64 + #endif + #error ARCH_VALUE unknown + ]=]) + try_compile(_UNUSED_VAR "${CMAKE_CURRENT_BINARY_DIR}" + "${CMAKE_CURRENT_BINARY_DIR}/arch.c" + OUTPUT_VARIABLE _COMPILATION_LOG) + string(REGEX + REPLACE ".*ARCH_VALUE ([a-zA-Z0-9_]+).*" + "\\1" + _TARGET_ARCH + "${_COMPILATION_LOG}") + + # construct library path + if(_TARGET_ARCH STREQUAL "x86_32") + string(APPEND _PLATFORM_PATH "Win32") + elseif(_TARGET_ARCH STREQUAL "x86_64") + string(APPEND _PLATFORM_PATH "x64") + else() + message( + FATAL_ERROR + "the ${_TARGET_ARCH} architecture is not supported by Findsodium.cmake." + ) + endif() + string(APPEND _PLATFORM_PATH "/$$CONFIG$$") + + if(MSVC_VERSION LESS 1900) + math(EXPR _VS_VERSION "${MSVC_VERSION} / 10 - 60") + else() + math(EXPR _VS_VERSION "${MSVC_VERSION} / 10 - 50") + endif() + string(APPEND _PLATFORM_PATH "/v${_VS_VERSION}") + + if(sodium_USE_STATIC_LIBS) + string(APPEND _PLATFORM_PATH "/static") + else() + string(APPEND _PLATFORM_PATH "/dynamic") + endif() + + string(REPLACE "$$CONFIG$$" + "Debug" + _DEBUG_PATH_SUFFIX + "${_PLATFORM_PATH}") + string(REPLACE "$$CONFIG$$" + "Release" + _RELEASE_PATH_SUFFIX + "${_PLATFORM_PATH}") + + find_library(sodium_LIBRARY_DEBUG libsodium.lib + HINTS ${sodium_DIR} + PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX}) + find_library(sodium_LIBRARY_RELEASE libsodium.lib + HINTS ${sodium_DIR} + PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX}) + if(NOT sodium_USE_STATIC_LIBS) + set(CMAKE_FIND_LIBRARY_SUFFIXES_BCK ${CMAKE_FIND_LIBRARY_SUFFIXES}) + set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll") + find_library(sodium_DLL_DEBUG libsodium + HINTS ${sodium_DIR} + PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX}) + find_library(sodium_DLL_RELEASE libsodium + HINTS ${sodium_DIR} + PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX}) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_BCK}) + endif() + + elseif(_GCC_COMPATIBLE) + if(sodium_USE_STATIC_LIBS) + find_library(sodium_LIBRARY_DEBUG libsodium.a + HINTS ${sodium_DIR} + PATH_SUFFIXES lib) + find_library(sodium_LIBRARY_RELEASE libsodium.a + HINTS ${sodium_DIR} + PATH_SUFFIXES lib) + else() + find_library(sodium_LIBRARY_DEBUG libsodium.dll.a + HINTS ${sodium_DIR} + PATH_SUFFIXES lib) + find_library(sodium_LIBRARY_RELEASE libsodium.dll.a + HINTS ${sodium_DIR} + PATH_SUFFIXES lib) + + file(GLOB _DLL + LIST_DIRECTORIES false + RELATIVE "${sodium_DIR}/bin" + "${sodium_DIR}/bin/libsodium*.dll") + find_library(sodium_DLL_DEBUG ${_DLL} libsodium + HINTS ${sodium_DIR} + PATH_SUFFIXES bin) + find_library(sodium_DLL_RELEASE ${_DLL} libsodium + HINTS ${sodium_DIR} + PATH_SUFFIXES bin) + endif() + else() + message(FATAL_ERROR "this platform is not supported by FindSodium.cmake") + endif() + + # ############################################################################ + # unsupported +else() + message(FATAL_ERROR "this platform is not supported by FindSodium.cmake") +endif() + +# ############################################################################## +# common stuff + +# extract sodium version +if(sodium_INCLUDE_DIR) + set(_VERSION_HEADER "${sodium_INCLUDE_DIR}/sodium/version.h") + if(EXISTS "${_VERSION_HEADER}") + file(READ "${_VERSION_HEADER}" _VERSION_HEADER_CONTENT) + string(REGEX + REPLACE ".*define[ \t]+SODIUM_VERSION_STRING[^\"]+\"([^\"]+)\".*" + "\\1" + sodium_VERSION_STRING + "${_VERSION_HEADER_CONTENT}") + set(sodium_VERSION_STRING "${sodium_VERSION_STRING}") + endif() +endif() + +# communicate results +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(sodium + REQUIRED_VARS + sodium_LIBRARY_RELEASE + sodium_LIBRARY_DEBUG + sodium_INCLUDE_DIR + VERSION_VAR + sodium_VERSION_STRING) + +# mark file paths as advanced +mark_as_advanced(sodium_INCLUDE_DIR) +mark_as_advanced(sodium_LIBRARY_DEBUG) +mark_as_advanced(sodium_LIBRARY_RELEASE) +if(WIN32) + mark_as_advanced(sodium_DLL_DEBUG) + mark_as_advanced(sodium_DLL_RELEASE) +endif() + +# create imported target +if(sodium_USE_STATIC_LIBS) + set(_LIB_TYPE STATIC) +else() + set(_LIB_TYPE SHARED) +endif() +add_library(sodium ${_LIB_TYPE} IMPORTED) + +set_target_properties(sodium + PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${sodium_INCLUDE_DIR}" + IMPORTED_LINK_INTERFACE_LANGUAGES + "C") + +if(sodium_USE_STATIC_LIBS) + set_target_properties(sodium + PROPERTIES INTERFACE_COMPILE_DEFINITIONS + "SODIUM_STATIC" + IMPORTED_LOCATION + "${sodium_LIBRARY_RELEASE}" + IMPORTED_LOCATION_DEBUG + "${sodium_LIBRARY_DEBUG}") +else() + if(UNIX) + set_target_properties(sodium + PROPERTIES IMPORTED_LOCATION + "${sodium_LIBRARY_RELEASE}" + IMPORTED_LOCATION_DEBUG + "${sodium_LIBRARY_DEBUG}") + elseif(WIN32) + set_target_properties(sodium + PROPERTIES IMPORTED_IMPLIB + "${sodium_LIBRARY_RELEASE}" + IMPORTED_IMPLIB_DEBUG + "${sodium_LIBRARY_DEBUG}") + if(NOT (sodium_DLL_DEBUG MATCHES ".*-NOTFOUND")) + set_target_properties(sodium + PROPERTIES IMPORTED_LOCATION_DEBUG + "${sodium_DLL_DEBUG}") + endif() + if(NOT (sodium_DLL_RELEASE MATCHES ".*-NOTFOUND")) + set_target_properties(sodium + PROPERTIES IMPORTED_LOCATION_RELWITHDEBINFO + "${sodium_DLL_RELEASE}" + IMPORTED_LOCATION_MINSIZEREL + "${sodium_DLL_RELEASE}" + IMPORTED_LOCATION_RELEASE + "${sodium_DLL_RELEASE}") + endif() + endif() +endif() \ No newline at end of file diff --git a/cmake/FindUnbound.cmake b/cmake/FindUnbound.cmake new file mode 100644 index 0000000..e3eb3d6 --- /dev/null +++ b/cmake/FindUnbound.cmake @@ -0,0 +1,40 @@ +# Copyright (c) 2014-2019, The Monero Project +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, are +# permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of +# conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list +# of conditions and the following disclaimer in the documentation and/or other +# materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be +# used to endorse or promote products derived from this software without specific +# prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +MESSAGE(STATUS "Looking for libunbound") + +FIND_PATH(UNBOUND_INCLUDE_DIR + NAMES unbound.h + PATH_SUFFIXES include/ include/unbound/ + PATHS "${PROJECT_SOURCE_DIR}" + ${UNBOUND_ROOT} + $ENV{UNBOUND_ROOT} + /usr/local/ + /usr/ +) + +find_library(UNBOUND_LIBRARIES unbound) diff --git a/cmake/FindZBar0.cmake b/cmake/FindZBar0.cmake new file mode 100644 index 0000000..efb1009 --- /dev/null +++ b/cmake/FindZBar0.cmake @@ -0,0 +1,22 @@ +# from http://code.google.com/p/low-cost-vision-2012/source/browse/CMakeModules/FindZBar0.cmake?name=2-helium-1&r=d61f248bd5565b3c086bf4769a04bfd98f7079df +# - Try to find ZBar +# This will define +# +# ZBAR_FOUND - +# ZBAR_LIBRARY_DIR - +# ZBAR_INCLUDE_DIR - +# ZBAR_LIBRARIES - +# + +find_package(PkgConfig) +pkg_check_modules(PC_ZBAR QUIET zbar) +set(ZBAR_DEFINITIONS ${PC_ZBAR_CFLAGS_OTHER}) +find_library(ZBAR_LIBRARIES NAMES zbar + HINTS ${PC_ZBAR_LIBDIR} ${PC_ZBAR_LIBRARY_DIRS} ) +find_path(ZBAR_INCLUDE_DIR Decoder.h + HINTS ${PC_ZBAR_INCLUDEDIR} ${PC_ZBAR_INCLUDE_DIRS} + PATH_SUFFIXES zbar ) +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(ZBAR DEFAULT_MSG ZBAR_LIBRARIES ZBAR_INCLUDE_DIR) +message(STATUS "Found zbar libraries ${ZBAR_LIBRARIES}") + diff --git a/cmake/GenVersion.cmake b/cmake/GenVersion.cmake new file mode 100644 index 0000000..220a03a --- /dev/null +++ b/cmake/GenVersion.cmake @@ -0,0 +1,65 @@ +# Copyright (c) 2014-2019, The Monero Project +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, are +# permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of +# conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list +# of conditions and the following disclaimer in the documentation and/or other +# materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be +# used to endorse or promote products derived from this software without specific +# prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers +# Check what commit we're on +execute_process(COMMAND "${GIT}" rev-parse --short=9 HEAD RESULT_VARIABLE RET OUTPUT_VARIABLE COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE) +if(RET) + # Something went wrong, set the version tag to -unknown + + message(WARNING "Cannot determine current commit. Make sure that you are building either from a Git working tree or from a source archive.") + set(VERSIONTAG "unknown") + set(VERSION_IS_RELEASE "false") + configure_file("monero/src/version.cpp.in" "${TO}") +else() + string(SUBSTRING ${COMMIT} 0 9 COMMIT) + message(STATUS "You are currently on commit ${COMMIT}") + + # Get all the tags + execute_process(COMMAND "${GIT}" rev-list --tags --max-count=1 --abbrev-commit RESULT_VARIABLE RET OUTPUT_VARIABLE TAGGEDCOMMIT OUTPUT_STRIP_TRAILING_WHITESPACE) + + if(NOT TAGGEDCOMMIT) + message(WARNING "Cannot determine most recent tag. Make sure that you are building either from a Git working tree or from a source archive.") + set(VERSIONTAG "${COMMIT}") + set(VERSION_IS_RELEASE "false") + else() + message(STATUS "The most recent tag was at ${TAGGEDCOMMIT}") + + # Check if we're building that tagged commit or a different one + if(COMMIT STREQUAL TAGGEDCOMMIT) + message(STATUS "You are building a tagged release") + set(VERSIONTAG "release") + set(VERSION_IS_RELEASE "true") + else() + message(STATUS "You are ahead of or behind a tagged release") + set(VERSIONTAG "${COMMIT}") + set(VERSION_IS_RELEASE "false") + endif() + endif() + configure_file("monero/src/version.cpp.in" "${TO}") +endif() \ No newline at end of file diff --git a/cmake/Version.cmake b/cmake/Version.cmake new file mode 100644 index 0000000..81857ff --- /dev/null +++ b/cmake/Version.cmake @@ -0,0 +1,53 @@ +# Copyright (c) 2014-2017, The Monero Project +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, are +# permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of +# conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list +# of conditions and the following disclaimer in the documentation and/or other +# materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be +# used to endorse or promote products derived from this software without specific +# prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +function (write_static_version_header hash) + set(VERSIONTAG "${hash}") + configure_file("${CMAKE_SOURCE_DIR}/monero/src/version.cpp.in" "${CMAKE_BINARY_DIR}/version.cpp") +endfunction () + +find_package(Git QUIET) +if ("$Format:$" STREQUAL "") + # We're in a tarball; use hard-coded variables. + write_static_version_header("release") +elseif (GIT_FOUND OR Git_FOUND) + add_custom_command( + OUTPUT "${CMAKE_BINARY_DIR}/version.cpp" + COMMAND "${CMAKE_COMMAND}" + "-D" "GIT=${GIT_EXECUTABLE}" + "-D" "TO=${CMAKE_BINARY_DIR}/version.cpp" + "-P" "cmake/GenVersion.cmake" + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + +else() + message(STATUS "WARNING: Git was not found!") + write_static_version_header("unknown") +endif () +add_custom_target(genversion ALL + DEPENDS "${CMAKE_BINARY_DIR}/version.cpp") + diff --git a/cmake/VersionFeather.cmake b/cmake/VersionFeather.cmake new file mode 100644 index 0000000..fc12faf --- /dev/null +++ b/cmake/VersionFeather.cmake @@ -0,0 +1,39 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2020, The Monero Project. + +find_package(Git QUIET) + +# Check what commit we're on +execute_process(COMMAND "${GIT_EXECUTABLE}" rev-parse --short=9 HEAD RESULT_VARIABLE RET OUTPUT_VARIABLE COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE) + +if(RET) + # Something went wrong, set the version tag to -unknown + + message(WARNING "Cannot determine current commit. Make sure that you are building either from a Git working tree or from a source archive.") + set(FEATHER_BRANCH "unknown") + configure_file("cmake/config-feather.h.cmake" "${CMAKE_CURRENT_SOURCE_DIR}/src/config-feather.h") +else() + string(SUBSTRING ${COMMIT} 0 9 COMMIT) + message(STATUS "You are currently on commit ${COMMIT}") + + # Get all the tags + execute_process(COMMAND "${GIT}" rev-list --tags --max-count=1 --abbrev-commit RESULT_VARIABLE RET OUTPUT_VARIABLE TAGGEDCOMMIT OUTPUT_STRIP_TRAILING_WHITESPACE) + + if(NOT TAGGEDCOMMIT) + message(STATUS "Cannot determine most recent tag. Make sure that you are building either from a Git working tree or from a source archive.") + set(FEATHER_BRANCH "${COMMIT}") + else() + message(STATUS "The most recent tag was at ${TAGGEDCOMMIT}") + + # Check if we're building that tagged commit or a different one + if(COMMIT STREQUAL TAGGEDCOMMIT) + message(STATUS "You are building a tagged release") + set(FEATHER_BRANCH "release") + else() + message(STATUS "You are ahead of or behind a tagged release") + set(FEATHER_BRANCH "${COMMIT}") + endif() + endif() + + configure_file("cmake/config-feather.h.cmake" "${CMAKE_CURRENT_SOURCE_DIR}/src/config-feather.h") +endif() diff --git a/cmake/VersionMonero.cmake b/cmake/VersionMonero.cmake new file mode 100644 index 0000000..4600c7c --- /dev/null +++ b/cmake/VersionMonero.cmake @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2020, The Monero Project. + +find_package(Git QUIET) +# Check what commit we're on +execute_process(COMMAND "${GIT_EXECUTABLE}" rev-parse --short=9 HEAD RESULT_VARIABLE RET OUTPUT_VARIABLE COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/monero) + +if(RET) + # Something went wrong, set the version tag to -unknown + + message(WARNING "Cannot determine current commit. Make sure that you are building either from a Git working tree or from a source archive.") + set(MONERO_BRANCH "unknown") +else() + string(SUBSTRING ${COMMIT} 0 9 COMMIT) + message(STATUS "You are currently on commit ${COMMIT}") + + # Get all the tags + execute_process(COMMAND "${GIT}" rev-list --tags --max-count=1 --abbrev-commit RESULT_VARIABLE RET OUTPUT_VARIABLE TAGGEDCOMMIT OUTPUT_STRIP_TRAILING_WHITESPACE) + + if(NOT TAGGEDCOMMIT) + message(STATUS "Cannot determine most recent tag. Make sure that you are building either from a Git working tree or from a source archive.") + set(MONERO_BRANCH "${COMMIT}") + else() + message(STATUS "The most recent tag was at ${TAGGEDCOMMIT}") + + # Check if we're building that tagged commit or a different one + if(COMMIT STREQUAL TAGGEDCOMMIT) + message(STATUS "You are building a tagged release") + set(MONERO_BRANCH "release") + else() + message(STATUS "You are ahead of or behind a tagged release") + set(MONERO_BRANCH "${COMMIT}") + endif() + endif() +endif() + +# Check latest tagged release +execute_process(COMMAND "${GIT_EXECUTABLE}" describe --abbrev=0 RESULT_VARIABLE RET OUTPUT_VARIABLE TAG OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/monero) + +if(RET) + message(WARNING "Cannot determine most recent tag. Make sure that you are building either from a Git working tree or from a source archive.") + set(MONERO_VERSION "unknown") +else () + set(MONERO_VERSION "${TAG}") +endif() + +configure_file("cmake/config-feather.h.cmake" "${CMAKE_CURRENT_SOURCE_DIR}/src/config-feather.h") \ No newline at end of file diff --git a/cmake/config-feather.h.cmake b/cmake/config-feather.h.cmake new file mode 100644 index 0000000..f2aef1e --- /dev/null +++ b/cmake/config-feather.h.cmake @@ -0,0 +1,10 @@ +#ifndef FEATHER_VERSION_H +#define FEATHER_VERSION_H + +#define FEATHER_VERSION "@VERSION@" +#define FEATHER_BRANCH "@FEATHER_BRANCH@" + +#define MONERO_VERSION "@MONERO_VERSION@" +#define MONERO_BRANCH "@MONERO_BRANCH@" + +#endif //FEATHER_VERSION_H diff --git a/cmake/test-protobuf.cpp b/cmake/test-protobuf.cpp new file mode 100644 index 0000000..0a1ca82 --- /dev/null +++ b/cmake/test-protobuf.cpp @@ -0,0 +1,43 @@ +// Copyright (c) 2014-2019, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include +#include +#include +#include +#include "test-protobuf.pb.h" + +int main(int argc, char *argv[]) { + google::protobuf::UnknownFieldSet ufs; + ufs.ClearAndFreeMemory(); + + Success sc; + sc.set_message("test"); + sc.SerializeToOstream(&std::cerr); + return 0; +} diff --git a/cmake/test-protobuf.proto b/cmake/test-protobuf.proto new file mode 100644 index 0000000..5300aea --- /dev/null +++ b/cmake/test-protobuf.proto @@ -0,0 +1,7 @@ +syntax = "proto2"; + +import "google/protobuf/descriptor.proto"; + +message Success { + optional string message = 1; +} diff --git a/cmake/test-static-assert.c b/cmake/test-static-assert.c new file mode 100644 index 0000000..2e6c848 --- /dev/null +++ b/cmake/test-static-assert.c @@ -0,0 +1,34 @@ +// Copyright (c) 2014-2019, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include + +static_assert(1, "FAIL"); +int main(int argc, char *argv[]) { + return 0; +} diff --git a/cmake/test-static-assert.cpp b/cmake/test-static-assert.cpp new file mode 100644 index 0000000..2e6c848 --- /dev/null +++ b/cmake/test-static-assert.cpp @@ -0,0 +1,34 @@ +// Copyright (c) 2014-2019, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include + +static_assert(1, "FAIL"); +int main(int argc, char *argv[]) { + return 0; +} diff --git a/contrib/Qt5.15_LinuxPatch.json b/contrib/Qt5.15_LinuxPatch.json new file mode 100644 index 0000000..a19fc10 --- /dev/null +++ b/contrib/Qt5.15_LinuxPatch.json @@ -0,0 +1,2015 @@ +{ + "module": "gui", + "depends": [ + "core-private", + "network" + ], + "testDir": "../../config.tests", + + "commandline": { + "options": { + "accessibility": "boolean", + "angle": "boolean", + "combined-angle-lib": "boolean", + "direct2d": "boolean", + "directfb": "boolean", + "directwrite": "boolean", + "egl": "boolean", + "eglfs": "boolean", + "evdev": "boolean", + "fontconfig": "boolean", + "freetype": { "type": "enum", "values": [ "no", "qt", "system" ] }, + "gbm": "boolean", + "gif": "boolean", + "harfbuzz": { "type": "enum", "values": [ "no", "qt", "system" ] }, + "ico": "boolean", + "imf": { "type": "boolean", "name": "qqnx_imf" }, + "kms": "boolean", + "lgmon": "boolean", + "libinput": "boolean", + "libjpeg": { "type": "enum", "values": [ "no", "qt", "system" ] }, + "libmd4c": { "type": "enum", "values": [ "no", "qt", "system" ] }, + "libpng": { "type": "enum", "values": [ "no", "qt", "system" ] }, + "linuxfb": "boolean", + "mtdev": "boolean", + "opengl": { "type": "optionalString", "values": [ "no", "yes", "desktop", "es2", "dynamic" ] }, + "opengl-es-2": { "type": "void", "name": "opengl", "value": "es2" }, + "opengles3": "boolean", + "openvg": "boolean", + "qpa": { "type": "string", "name": "qpa_default_platform" }, + "qpa-platform-guard": "boolean", + "sm": { "type": "boolean", "name": "sessionmanager" }, + "tslib": "boolean", + "vulkan": "boolean", + "xcb": "boolean", + "bundled-xcb-xinput": "boolean", + "xcb-native-painting": "boolean", + "xcb-xlib": "boolean", + "xkbcommon": "boolean" + } + }, + + "libraries": { + "atspi": { + "label": "atspi", + "sources": [ + { "type": "pkgConfig", "args": "atspi-2" } + ] + }, + "bcm_host": { + "export": "", + "headers": ["bcm_host.h"], + "sources": [ + { "type": "pkgConfig", "args": "bcm_host" }, + { "type": "makeSpec", "spec": "BCM_HOST" } + ] + }, + "dxguid": { + "label": "DirectX GUID", + "sources": [ + "-ldxguid" + ] + }, + "dxgi": { + "label": "DirectX GI", + "headers": "dxgi.h", + "sources": [ + "-ldxgi" + ] + }, + "dxgi1_2": { + "label": "DirectX GI 1.2", + "test": { + "main": [ + "// fails with mingw-w64 5.4.0 - declaration is missing from header", + "IDXGISurface1 *surface;", + "(void) surface;" + ] + }, + "headers": "dxgi1_2.h", + "sources": [ + "-ldxgi" + ] + }, + "d3d9": { + "label": "Direct3D 9", + "headers": "d3d9.h", + "sources": [ + "-ld3d9" + ] + }, + "d3d11": { + "label": "Direct3D 11", + "headers": "d3d11.h", + "sources": [ + "-ld3d11" + ] + }, + "d3d11_1": { + "label": "Direct3D 11.1", + "headers": "d3d11_1.h", + "sources": [ + "-ld3d11" + ] + }, + "d3dcompiler": { + "label": "Direct3D Shader Compiler Library", + "headers": "d3dcompiler.h", + "sources": [ + "-ld3dcompiler" + ] + }, + "d2d1": { + "label": "Direct2D 1", + "headers": [ "d2d1.h", "d2d1helper.h" ], + "sources": [ + "-ld2d1" + ] + }, + "d2d1_1": { + "label": "Direct2D 1.1", + "test": { + "main": [ + "ID2D1Factory1 *d2dFactory;", + "D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &d2dFactory);" + ] + }, + "headers": [ "d2d1_1.h", "d2d1_1helper.h" ], + "sources": [ + "-ld2d1" + ] + }, + "directfb": { + "label": "DirectFB", + "test": { + "tail": [ + "#ifdef __typeof__", + "# error DirectFB headers are unclean and cannot compile", + "#endif" + ] + }, + "headers": "directfb.h", + "sources": [ + { "type": "pkgConfig", "args": "directfb" } + ] + }, + "dwrite": { + "label": "DirectWrite", + "test": { + "main": [ + "IDWriteFactory *factory = 0;", + "DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory),", + " (IUnknown **)(&factory));" + ] + }, + "headers": "dwrite.h", + "sources": [ + "-ldwrite" + ] + }, + "dwrite_1": { + "label": "DirectWrite 1", + "headers": "dwrite_1.h", + "sources": [ + "-ldwrite" + ] + }, + "dwrite_2": { + "label": "DirectWrite 2", + "test": { + "main": [ + "IUnknown *factory = 0;", + "(void)(size_t(DWRITE_E_NOCOLOR) + sizeof(IDWriteFontFace2));", + "DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory2),", + " &factory);" + ] + }, + "headers": "dwrite_2.h", + "sources": [ + "-ldwrite" + ] + }, + "drm": { + "label": "KMS", + "test": { + "head": [ + "#include ", + "#include ", + "extern \"C\" {" + ], + "tail": [ + "}" + ], + "main": "(void) drmModeGetCrtc(0, 0);" + }, + "headers": [ "xf86drmMode.h", "xf86drm.h" ], + "sources": [ + { "type": "pkgConfig", "args": "libdrm" }, + { "libs": "-ldrm", "condition": "!config.integrity" }, + { "libs": "-ldrm-nvdc -lposix -livfs -lnvll -lnvdc -lnvrm -lnvrm_graphics -lnvos -lnvtegrahv", "condition": "config.integrity" } + ] + }, + "egl": { + "label": "EGL", + "test": { + "main": [ + "EGLint x = 0; EGLDisplay dpy = 0; EGLContext ctx = 0;", + "eglDestroyContext(dpy, ctx);" + ] + }, + "headers": "EGL/egl.h", + "sources": [ + { "type": "pkgConfig", "args": "egl" }, + { "type": "makeSpec", "spec": "EGL" } + ] + }, + "freetype": { + "label": "FreeType", + "test": { + "tail": [ + "#include FT_FREETYPE_H", + "#if ((FREETYPE_MAJOR*10000 + FREETYPE_MINOR*100 + FREETYPE_PATCH) < 20200)", + "# error This version of freetype is too old.", + "#endif" + ], + "main": [ + "FT_Face face = 0;" + ] + }, + "headers": "ft2build.h", + "sources": [ + { "type": "pkgConfig", "args": "freetype2" }, + { "type": "freetype", "libs": "-lfreetype", "condition": "!config.wasm" }, + { "libs": "-s USE_FREETYPE=1", "condition": "config.wasm" }, + { "libs": "-lfreetype" } + ], + "use": [ + { "lib": "zlib", "condition": "features.system-zlib" } + ] + }, + "fontconfig": { + "label": "Fontconfig", + "test": { + "tail": [ + "#ifndef FC_RGBA_UNKNOWN", + "# error This version of fontconfig is too old, it is missing the FC_RGBA_UNKNOWN define", + "#endif" + ], + "main": [ + "FcPattern *pattern = 0;" + ] + }, + "headers": "fontconfig/fontconfig.h", + "sources": [ + { "type": "pkgConfig", "args": "fontconfig" }, + { "type": "freetype", "libs": "-lfontconfig" } + ], + "use": "freetype" + }, + "gbm": { + "label": "GBM", + "test": { + "head": [ + "#include ", + "#include ", + "extern \"C\" {" + ], + "tail": [ + "}" + ], + "main": "gbm_surface *surface = 0;" + }, + "headers": "gbm.h", + "sources": [ + { "type": "pkgConfig", "args": "gbm" } + ] + }, + "harfbuzz": { + "label": "HarfBuzz", + "test": { + "tail": [ + "#if !HB_VERSION_ATLEAST(1, 6, 0)", + "# error This version of harfbuzz is too old.", + "#endif" + ], + "main": [ + "hb_buffer_t *buffer = hb_buffer_create();", + "const uint16_t string[] = { 'A', 'b', 'c' };", + "hb_buffer_add_utf16(buffer, string, 3, 0, 3);", + "hb_buffer_guess_segment_properties(buffer);", + "hb_buffer_set_flags(buffer, hb_buffer_flags_t(HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES));", + "hb_buffer_destroy(buffer);" + ] + }, + "headers": "harfbuzz/hb.h", + "sources": [ + "-lharfbuzz" + ] + }, + "imf": { + "label": "IMF", + "export": "", + "test": { + "main": "imf_client_init();" + }, + "headers": "imf/imf_client.h", + "sources": [ + "-linput_client" + ] + }, + "lgmon": { + "label": "lgmon", + "test": { + "main": "lgmon_supported(getpid());" + }, + "headers": "lgmon.h", + "sources": [ + "-llgmon" + ] + }, + "libinput": { + "label": "libinput", + "test": { + "main": "libinput_udev_create_context(NULL, NULL, NULL);" + }, + "headers": "libinput.h", + "sources": [ + { "type": "pkgConfig", "args": "libinput" } + ] + }, + "integrityhid": { + "label": "integrityhid", + "test": { + "head": [ + "#include ", + "#include " + ], + "main": [ + "HIDDriver *driver;", + "uintptr_t devicecontext;", + "uint32_t device_id;", + "gh_hid_enum_devices(driver, &device_id, &devicecontext);" + ] + }, + "headers": "device/hiddriver.h", + "sources": [ + { "libs": "-lhiddev -lusbhid -lusb" } + ] + }, + "libjpeg": { + "label": "libjpeg", + "test": { + "head": [ + "#include ", + "#include ", + "extern \"C\" {" + ], + "tail": [ + "}", + "", + "j_compress_ptr cinfo;" + ], + "main": "jpeg_create_compress(cinfo);" + }, + "headers": "jpeglib.h", + "sources": [ + { "type": "pkgConfig", "args": "libjpeg" }, + { "libs": "-llibjpeg", "condition": "config.msvc" }, + "-ljpeg" + ] + }, + "libmd4c": { + "label": "libmd4c", + "test": { + "main": "md_parse(\"hello\", 5, nullptr, nullptr);" + }, + "headers": "md4c.h", + "sources": [ + { "type": "pkgConfig", "args": "md4c" }, + { "libs": "-lmd4c" } + ] + }, + "libpng": { + "label": "libpng", + "test": { + "main": "(void) png_create_read_struct(PNG_LIBPNG_VER_STRING,0,0,0);" + }, + "headers": "png.h", + "sources": [ + { "type": "pkgConfig", "args": "libpng" }, + { "libs": "-llibpng16", "condition": "config.msvc" }, + { "libs": "-llibpng", "condition": "config.msvc" }, + { "libs": "-lpng16", "condition": "!config.msvc" }, + { "libs": "-lpng", "condition": "!config.msvc" }, + { "libs": "-s USE_LIBPNG=1", "condition": "config.wasm" } + ], + "use": [ + { "lib": "zlib", "condition": "features.system-zlib" } + ] + }, + "mtdev": { + "label": "mtdev", + "test": { + "main": [ + "mtdev m;", + "mtdev_open(&m, 0);" + ] + }, + "headers": "mtdev.h", + "sources": [ + { "type": "pkgConfig", "args": "mtdev" } + ] + }, + "opengl": { + "label": "Desktop OpenGL", + "test": { + "head": [ + "#ifdef __APPLE__", + "# include ", + "#else", + "# define GL_GLEXT_PROTOTYPES", + "#endif" + ], + "main": [ + "glBegin(GL_TRIANGLES);", + " glVertex2f(20.0f, 10.0f);", + " glVertex2f(10.0f, 30.0f);", + " glVertex2f(20.0f, 50.0f);", + "glEnd();" + ] + }, + "headers": [ + { + "condition": "!config.darwin", + "headers": "GL/gl.h" + } + ], + "sources": [ + { "type": "pkgConfig", "args": "gl", "condition": "!config.darwin" }, + { "type": "makeSpec", "spec": "OPENGL" } + ] + }, + "opengl_es2": { + "label": "OpenGL ES 2.0", + "test": { + "head": [ + "#ifdef __APPLE__", + "# include ", + "#else", + "# define GL_GLEXT_PROTOTYPES", + "#endif" + ], + "main": [ + "glUniform1f(1, GLfloat(1.0));", + "glClear(GL_COLOR_BUFFER_BIT);" + ] + }, + "headers": [ + { + "condition": "!config.darwin", + "headers": "GLES2/gl2.h" + } + ], + "sources": [ + { "type": "pkgConfig", "args": "glesv2", "condition": "!config.darwin" }, + { "type": "makeSpec", "spec": "OPENGL_ES2" } + ] + }, + "openvg": { + "label": "OpenVG", + "test": { + "main": "VGint i = 2; vgFlush();" + }, + "headers": "VG/openvg.h", + "sources": [ + { "type": "pkgConfig", "args": "vg" }, + { "type": "makeSpec", "spec": "OPENVG" } + ] + }, + "tslib": { + "label": "tslib", + "test": { + "main": "ts_setup(nullptr, 0);" + }, + "headers": "tslib.h", + "sources": [ + "-lts" + ] + }, + "v4l2": { + "label": "V4L2", + "test": { + "head": [ + "#include ", + "extern \"C\" {" + ], + "tail": [ + "}" + ], + "main": [ + "v4l2_format fmt;", + "media_pad *pad = nullptr;", + "media_device *device = media_device_new(\"/dev/media\");", + "v4l2_subdev_set_format(nullptr, nullptr, 0, V4L2_SUBDEV_FORMAT_ACTIVE);" + ] + }, + "headers": [ "mediactl/mediactl.h", "mediactl/v4l2subdev.h" ], + "sources": [ + { "type": "pkgConfig", "args": "libv4l2 libmediactl" }, + "-lmediactl -lv4l2 -lv4l2subdev" + ] + }, + "vulkan": { + "label": "Vulkan", + "test": { + "comment": "Note: Qt does not rely on linking to a Vulkan library directly.", + "tail": [ + "// The pData parameter has changed from uint32_t* to void* at some point.", + "// Ensure the headers have the updated one to prevent compile errors later on.", + "PFN_vkCmdUpdateBuffer cmdUpdBuf;", + "void testUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData)", + "{", + " cmdUpdBuf(commandBuffer, dstBuffer, dstOffset, dataSize, pData);", + "}" + ], + "main": [ + "VkInstanceCreateInfo info;", + "testUpdateBuffer(0, 0, 0, 0, 0);" + ] + }, + "headers": "vulkan/vulkan.h", + "sources": [ + { "type": "pkgConfig", "args": "vulkan" }, + { "type": "makeSpec", "spec": "VULKAN" } + ] + }, + "wayland_server": { + "label": "Wayland Server", + "test": { + "main": "wl_display_create();" + }, + "headers": "wayland-server.h", + "sources": [ + { "type": "pkgConfig", "args": "wayland-server" } + ] + }, + "xlib": { + "label": "XLib", + "test": { + "main": [ + "Display *d = XOpenDisplay(NULL);", + "XCloseDisplay(d);" + ] + }, + "headers": "X11/Xlib.h", + "sources": [ + { "type": "makeSpec", "spec": "X11" } + ] + }, + "x11sm": { + "label": "X11 session management", + "sources": [ + { "type": "pkgConfig", "args": "sm ice" } + ] + }, + "xcb": { + "label": "XCB >= 1.11", + "test": { + "main": [ + "int primaryScreen = 0;", + "(void)xcb_connect(\"\", &primaryScreen);", + "/* XCB_PACKED define was added in libxcb 1.11 */", + "#ifdef XCB_PACKED", + " return 0;", + "#else", + " return -1;", + "#endif" + ] + }, + "headers": "xcb/xcb.h", + "sources": [ + { "type": "pkgConfig", "args": "xcb >= 1.11" }, + "-lxcb" + ] + }, + "xcb_icccm": { + "label": "XCB ICCCM >= 0.3.9", + "headers": "xcb/xcb_icccm.h", + "sources": [ + { "type": "pkgConfig", "args": "xcb-icccm >= 0.3.9" }, + "-lxcb-icccm" + ], + "use": "xcb" + }, + "xcb_util": { + "label": "XCB Util >= 0.3.9", + "headers": "xcb/xcb_util.h", + "sources": [ + { "type": "pkgConfig", "args": "xcb-util >= 0.3.9" }, + "-lxcb-util" + ], + "use": "xcb" + }, + "xcb_image": { + "label": "XCB Image >= 0.3.9", + "headers": "xcb/xcb_image.h", + "sources": [ + { "type": "pkgConfig", "args": "xcb-image >= 0.3.9" }, + "-lxcb-image" + ], + "use": "xcb_shm xcb_util xcb" + }, + "xcb_keysyms": { + "label": "XCB Keysyms >= 0.3.9", + "headers": "xcb/xcb_keysyms.h", + "sources": [ + { "type": "pkgConfig", "args": "xcb-keysyms >= 0.3.9" }, + "-lxcb-keysyms" + ], + "use": "xcb" + }, + "xcb_renderutil": { + "label": "XCB Renderutil >= 0.3.9", + "headers": "xcb/xcb_renderutil.h", + "sources": [ + { "type": "pkgConfig", "args": "xcb-renderutil >= 0.3.9" }, + "-lxcb-render-util" + ], + "use": "xcb xcb_render" + }, + "xcb_randr": { + "label": "XCB RandR", + "headers": "xcb/randr.h", + "sources": [ + { "type": "pkgConfig", "args": "xcb-randr" }, + "-lxcb-randr" + ], + "use": "xcb" + }, + "xcb_shape": { + "label": "XCB Shape", + "headers": "xcb/shape.h", + "sources": [ + { "type": "pkgConfig", "args": "xcb-shape" }, + "-lxcb-shape" + ], + "use": "xcb" + }, + "xcb_shm": { + "label": "XCB SHM", + "headers": "xcb/shm.h", + "sources": [ + { "type": "pkgConfig", "args": "xcb-shm" }, + "-lxcb-shm" + ], + "use": "xcb" + }, + "xcb_sync": { + "label": "XCB Sync", + "headers": "xcb/sync.h", + "sources": [ + { "type": "pkgConfig", "args": "xcb-sync" }, + "-lxcb-sync" + ], + "use": "xcb" + }, + "xcb_xfixes": { + "label": "XCB Xfixes", + "headers": "xcb/xfixes.h", + "sources": [ + { "type": "pkgConfig", "args": "xcb-xfixes" }, + "-lxcb-xfixes" + ], + "use": "xcb" + }, + "xcb_xinerama": { + "label": "XCB Xinerama", + "headers": "xcb/xinerama.h", + "sources": [ + { "type": "pkgConfig", "args": "xcb-xinerama" }, + "-lxcb-xinerama" + ], + "use": "xcb" + }, + "xcb_xlib": { + "label": "XCB Xlib", + "test": { + "main": "(void) XGetXCBConnection((Display *)0);" + }, + "headers": "X11/Xlib-xcb.h", + "sources": [ + { "type": "pkgConfig", "args": "x11-xcb" }, + "-lX11-xcb" + ], + "use": "xcb xlib" + }, + "xcb_xkb": { + "label": "XCB XKB", + "headers": "xcb/xkb.h", + "sources": [ + { "type": "pkgConfig", "args": "xcb-xkb" }, + "-lxcb-xkb" + ], + "use": "xcb" + }, + "xcb_render": { + "label": "XCB XRender", + "headers": "xcb/render.h", + "sources": [ + { "type": "pkgConfig", "args": "xcb-render" }, + "-lxcb-render" + ], + "use": "xcb" + }, + "xcb_glx": { + "label": "XCB GLX", + "test": { + "main": [ + "xcb_connection_t *connection = 0;", + "xcb_generic_error_t *error = 0;", + "xcb_glx_query_version_cookie_t xglx_query_cookie = xcb_glx_query_version(", + " connection, XCB_GLX_MAJOR_VERSION, XCB_GLX_MINOR_VERSION);", + "xcb_glx_query_version_reply(connection, xglx_query_cookie, &error);" + ] + }, + "headers": "xcb/glx.h", + "sources": [ + { "type": "pkgConfig", "args": "xcb-glx" }, + "-lxcb-glx" + ], + "use": "xcb" + }, + "xcb_xinput": { + "label": "XCB XInput", + "test": { + "main": [ + "xcb_connection_t *connection = 0;", + "xcb_generic_error_t *error = 0;", + "xcb_input_xi_query_version_cookie_t xinput_query_cookie = xcb_input_xi_query_version(", + " connection, XCB_INPUT_MAJOR_VERSION, XCB_INPUT_MINOR_VERSION);", + "xcb_input_xi_query_version_reply(connection, xinput_query_cookie, &error);" + ] + }, + "headers": "xcb/xinput.h", + "sources": [ + { "type": "pkgConfig", "args": "xcb-xinput >= 1.12" }, + "-lxcb-xinput" + ], + "use": "xcb" + }, + "xkbcommon": { + "label": "xkbcommon >= 0.5.0", + "test": { + "main": "xkb_context_new(XKB_CONTEXT_NO_FLAGS);" + }, + "headers": [ "xkbcommon/xkbcommon.h" ], + "sources": [ + { "type": "pkgConfig", "args": "xkbcommon >= 0.5.0" }, + "-lxkbcommon" + ] + }, + "xkbcommon_x11": { + "label": "xkbcommon-x11", + "test": { + "main": "xkb_x11_setup_xkb_extension_flags flag = XKB_X11_SETUP_XKB_EXTENSION_NO_FLAGS;" + }, + "headers": [ "xkbcommon/xkbcommon-x11.h" ], + "sources": [ + { "type": "pkgConfig", "args": "xkbcommon-x11" }, + "-lxkbcommon -lxkbcommon-x11" + ] + }, + "xrender": { + "label": "XRender for native painting", + "test": { + "tail": [ + "#if RENDER_MAJOR == 0 && RENDER_MINOR < 5", + "# error Required Xrender version 0.6 not found.", + "#endif" + ], + "main": "XRenderPictFormat *format = 0;" + }, + "headers": "X11/extensions/Xrender.h", + "sources": [ + "-lXrender" + ], + "use": "xlib" + } + }, + + "tests": { + "angle_d3d11_qdtd": { + "label": "D3D11_QUERY_DATA_TIMESTAMP_DISJOINT", + "type": "compile", + "test": { + "include": "d3d11.h", + "main": [ + "D3D11_QUERY_DATA_TIMESTAMP_DISJOINT qdtd;", + "(void) qdtd;" + ] + } + }, + "fxc": { + "label": "Direct3D Shader Compiler", + "type": "fxc", + "log": "value" + }, + "drm_atomic": { + "label": "DRM Atomic API", + "type": "compile", + "test": { + "head": [ + "#include ", + "#include ", + "extern \"C\" {" + ], + "include": [ + "xf86drmMode.h", + "xf86drm.h" + ], + "tail": [ + "}" + ], + "main": "drmModeAtomicReq *request;" + }, + "use": "drm" + }, + "egl-x11": { + "label": "EGL on X11", + "type": "compile", + "test": { + "head": [ + "// Check if EGL is compatible with X. Some EGL implementations, typically on", + "// embedded devices, are not intended to be used together with X. EGL support", + "// has to be disabled in plugins like xcb in this case since the native display,", + "// window and pixmap types will be different than what an X-based platform", + "// plugin would expect." + ], + "include": [ "EGL/egl.h", "X11/Xlib.h" ], + "main": [ + "Display *dpy = EGL_DEFAULT_DISPLAY;", + "EGLNativeDisplayType egldpy = XOpenDisplay(\"\");", + "dpy = egldpy;", + "EGLNativeWindowType w = XCreateWindow(dpy, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);", + "XDestroyWindow(dpy, w);", + "XCloseDisplay(dpy);" + ] + }, + "use": "egl xlib" + }, + "egl-brcm": { + "label": "Broadcom EGL (Raspberry Pi)", + "type": "compile", + "test": { + "include": [ "EGL/egl.h", "bcm_host.h" ], + "main": "vc_dispmanx_display_open(0);" + }, + "use": "egl bcm_host" + }, + "egl-egldevice": { + "label": "EGLDevice", + "type": "compile", + "test": { + "include": [ "EGL/egl.h", "EGL/eglext.h" ], + "main": [ + "EGLDeviceEXT device = 0;", + "EGLStreamKHR stream = 0;", + "EGLOutputLayerEXT layer = 0;", + "(void) EGL_DRM_CRTC_EXT;" + ] + }, + "use": "egl" + }, + "egl-mali": { + "label": "Mali EGL", + "type": "compile", + "test": { + "include": [ "EGL/fbdev_window.h", "EGL/egl.h", "GLES2/gl2.h" ], + "main": "fbdev_window *w = 0;" + }, + "use": "egl" + }, + "egl-mali-2": { + "label": "Mali 2 EGL", + "type": "compile", + "test": { + "include": [ "EGL/egl.h", "GLES2/gl2.h" ], + "main": "mali_native_window *w = 0;" + }, + "use": "egl" + }, + "egl-viv": { + "label": "i.Mx6 EGL", + "type": "compile", + "test": { + "include": [ "EGL/egl.h", "EGL/eglvivante.h" ], + "main": [ + "#ifdef __INTEGRITY", + "fbGetDisplay();", + "#else", + "// Do not rely on fbGetDisplay(), since the signature has changed over time.", + "// Stick to fbGetDisplayByIndex().", + "fbGetDisplayByIndex(0);", + "#endif" + ], + "qmake": [ + "DEFINES += EGL_API_FB=1", + "!integrity: DEFINES += LINUX=1" + ] + }, + "use": "egl" + }, + "egl-openwfd": { + "label": "OpenWFD EGL", + "type": "compile", + "test": { + "include": [ "wfd.h" ], + "main": [ + "wfdEnumerateDevices(nullptr, 0, nullptr);" + ] + }, + "use": "egl" + }, + "egl-rcar": { + "label": "RCAR EGL", + "type": "compile", + "test": { + "include": [ "EGL/egl.h" ], + "tail": [ + "extern \"C\" {", + "extern unsigned long PVRGrfxServerInit(void);", + "}" + ], + "main": [ + "PVRGrfxServerInit();" + ] + }, + "use": "egl opengl_es2" + }, + "evdev": { + "label": "evdev", + "type": "compile", + "test": { + "head": [ + "#if defined(__FreeBSD__)", + "# include ", + "#else", + "# include ", + "# include ", + "#endif", + "enum {", + " e1 = ABS_PRESSURE,", + " e2 = ABS_X,", + " e3 = REL_X,", + " e4 = SYN_REPORT,", + "};" + ], + "main": [ + "input_event buf[32];", + "(void) buf;" + ] + } + }, + "integrityfb": { + "label": "INTEGRITY framebuffer", + "type": "compile", + "test": { + "include": "device/fbdriver.h", + "main": "FBDriver *driver = 0;" + } + }, + "libinput_axis_api": { + "label": "axis API in libinput", + "type": "compile", + "test": { + "include": "libinput.h", + "main": "libinput_event_pointer_has_axis(nullptr, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);" + }, + "use": "libinput" + }, + "linuxfb": { + "label": "LinuxFB", + "type": "compile", + "test": { + "include": [ "linux/fb.h", "sys/kd.h", "sys/ioctl.h" ], + "main": [ + "fb_fix_screeninfo finfo;", + "fb_var_screeninfo vinfo;", + "int fd = 3;", + "ioctl(fd, FBIOGET_FSCREENINFO, &finfo);", + "ioctl(fd, FBIOGET_VSCREENINFO, &vinfo);" + ] + } + }, + "opengles3": { + "label": "OpenGL ES 3.0", + "type": "compile", + "test": { + "head": [ + "#ifdef __APPLE__", + "# include ", + "#else", + "# define GL_GLEXT_PROTOTYPES", + "# include ", + "#endif" + ], + "main": [ + "static GLfloat f[6];", + "glGetStringi(GL_EXTENSIONS, 0);", + "glReadBuffer(GL_COLOR_ATTACHMENT1);", + "glUniformMatrix2x3fv(0, 0, GL_FALSE, f);", + "glMapBufferRange(GL_ARRAY_BUFFER, 0, 0, GL_MAP_READ_BIT);" + ] + }, + "comment": [ + "The library is expected to be the same as in ES 2.0 (libGLESv2).", + "The difference is the header and the presence of the functions in", + "the library." + ], + "use": "opengl_es2" + }, + "opengles31": { + "label": "OpenGL ES 3.1", + "type": "compile", + "test": { + "include": "GLES3/gl31.h", + "main": [ + "glDispatchCompute(1, 1, 1);", + "glProgramUniform1i(0, 0, 0);" + ] + }, + "use": "opengl_es2" + }, + "opengles32": { + "label": "OpenGL ES 3.2", + "type": "compile", + "test": { + "include": "GLES3/gl32.h", + "main": "glFramebufferTexture(GL_TEXTURE_2D, GL_DEPTH_STENCIL_ATTACHMENT, 1, 0);" + }, + "use": "opengl_es2" + }, + "qpa_default_platform": { + "label": "default QPA platform", + "type": "qpaDefaultPlatform", + "log": "value" + }, + "xcb_syslibs": { + "label": "XCB (extensions)", + "type": "compile", + "test": { + "head": [ + "// xkb.h is using a variable called 'explicit', which is a reserved keyword in C++", + "#define explicit dont_use_cxx_explicit" + ], + "tail": "#undef explicit", + "include": [ + "xcb/xcb.h", + "xcb/xcb_util.h", + "xcb/xcb_image.h", + "xcb/xcb_keysyms.h", + "xcb/randr.h", + "xcb/render.h", + "xcb/shape.h", + "xcb/shm.h", + "xcb/sync.h", + "xcb/xfixes.h", + "xcb/xinerama.h", + "xcb/xcb_icccm.h", + "xcb/xcb_renderutil.h", + "xcb/xkb.h" + ], + "main": [ + "int primaryScreen = 0;", + "xcb_connection_t *c = xcb_connect(\"\", &primaryScreen);", + + "/* RENDER */", + "xcb_generic_error_t *error = nullptr;", + "xcb_render_query_pict_formats_cookie_t formatsCookie =", + " xcb_render_query_pict_formats(c);", + "xcb_render_query_pict_formats_reply_t *formatsReply =", + " xcb_render_query_pict_formats_reply(c, formatsCookie, &error);", + + "/* RENDERUTIL: xcb_renderutil.h include won't compile unless version >= 0.3.9 */", + "xcb_render_util_find_standard_format(nullptr, XCB_PICT_STANDARD_ARGB_32);", + + "/* XKB: This takes more arguments in xcb-xkb < 1.11 */", + "xcb_xkb_get_kbd_by_name_replies_key_names_value_list_sizeof(nullptr, 0, 0, 0, 0, 0, 0, 0, 0);" + ] + }, + "use": "xcb_icccm xcb_util xcb_image xcb_keysyms xcb_randr xcb_render xcb_renderutil xcb_shape xcb_shm xcb_sync xcb_xfixes xcb_xinerama xcb_xkb xcb" + }, + "x11prefix": { + "label": "X11 prefix", + "type": "getPkgConfigVariable", + "pkg-config-args": "x11", + "pkg-config-variable": "prefix", + "value": "/usr", + "log": "value" + } + }, + + "features": { + "accessibility-atspi-bridge": { + "label": "ATSPI Bridge", + "condition": "features.accessibility && features.xcb && features.dbus && libs.atspi", + "output": [ "privateFeature", "feature" ] + }, + "angle": { + "label": "ANGLE", + "autoDetect": "features.opengles2 || features.opengl-dynamic", + "condition": "!features.opengl-desktop && features.dxguid && tests.fxc && (features.direct3d9 || (config.winrt && features.direct3d11 && libs.d3dcompiler))", + "output": [ + "publicFeature", + { "type": "define", "name": "QT_OPENGL_ES_2_ANGLE" }, + { "type": "varAssign", "name": "QMAKE_FXC_LOCATION", "value": "tests.fxc.value" } + ] + }, + "angle_d3d11_qdtd": { + "label": "D3D11_QUERY_DATA_TIMESTAMP_DISJOINT", + "condition": "features.angle && tests.angle_d3d11_qdtd", + "output": [ "privateFeature" ] + }, + "combined-angle-lib": { + "label": "Combined ANGLE Library", + "autoDetect": false, + "condition": "features.angle", + "output": [ "publicFeature" ] + }, + "directfb": { + "label": "DirectFB", + "section": "Platform plugins", + "autoDetect": false, + "condition": "libs.directfb", + "output": [ "privateFeature" ] + }, + "directwrite": { + "label": "DirectWrite", + "emitIf": "config.win32", + "condition": "libs.dwrite", + "output": [ "privateFeature" ] + }, + "directwrite1": { + "label": "DirectWrite 1", + "emitIf": "config.win32", + "condition": "libs.dwrite_1", + "output": [ "privateFeature" ] + }, + "directwrite2": { + "label": "DirectWrite 2", + "emitIf": "config.win32", + "condition": "features.directwrite1 && libs.dwrite_2", + "output": [ "privateFeature" ] + }, + "dxguid": { + "label": "DirectX GUID", + "condition": "config.win32 && libs.dxguid", + "output": [ "privateFeature" ] + }, + "direct3d9": { + "label": "Direct 3D 9", + "condition": "config.win32 && !config.winrt && libs.d3d9", + "output": [ "privateFeature" ] + }, + "dxgi": { + "label": "DirectX GI", + "condition": "config.win32 && libs.dxgi", + "output": [ "privateFeature" ] + }, + "dxgi1_2": { + "label": "DirectX GI 1.2", + "condition": "features.dxgi && libs.dxgi1_2", + "output": [ "privateFeature" ] + }, + "direct3d11": { + "label": "Direct 3D 11", + "condition": "features.dxgi && libs.d3d11", + "output": [ "privateFeature" ] + }, + "direct3d11_1": { + "label": "Direct 3D 11.1", + "condition": "features.direct3d11 && features.dxgi1_2 && libs.d3d11_1", + "output": [ "privateFeature" ] + }, + "direct2d": { + "label": "Direct 2D", + "condition": "config.win32 && !config.winrt && features.direct3d11 && libs.d2d1", + "output": [ "privateFeature" ] + }, + "direct2d1_1": { + "label": "Direct 2D 1.1", + "condition": "features.direct2d && libs.d2d1_1", + "output": [ "privateFeature" ] + }, + "evdev": { + "label": "evdev", + "condition": "features.thread && tests.evdev", + "output": [ "privateFeature" ] + }, + "freetype": { + "label": "FreeType", + "purpose": "Supports the FreeType 2 font engine (and its supported font formats).", + "section": "Fonts", + "output": [ "privateFeature", "feature" ] + }, + "system-freetype": { + "label": " Using system FreeType", + "enable": "input.freetype == 'system'", + "disable": "input.freetype == 'qt'", + "autoDetect": "!config.msvc", + "condition": "features.freetype && libs.freetype", + "output": [ "privateFeature" ] + }, + "fontconfig": { + "label": "Fontconfig", + "autoDetect": "!config.darwin", + "condition": "!config.msvc && features.system-freetype && libs.fontconfig", + "output": [ "privateFeature", "feature" ] + }, + "gbm": { + "label": "GBM", + "condition": "libs.gbm", + "output": [ "publicQtConfig" ] + }, + "harfbuzz": { + "label": "HarfBuzz", + "output": [ "privateFeature", "feature" ] + }, + "system-harfbuzz": { + "label": " Using system HarfBuzz", + "enable": "input.harfbuzz == 'system'", + "disable": "input.harfbuzz == 'qt'", + "autoDetect": "!config.darwin && !config.win32", + "condition": "features.harfbuzz && libs.harfbuzz", + "output": [ "privateFeature" ] + }, + "qqnx_imf": { + "label": "IMF", + "emitIf": "config.qnx", + "condition": "libs.imf", + "output": [ "privateFeature" ] + }, + "integrityfb": { + "label": "INTEGRITY framebuffer", + "section": "Platform plugins", + "condition": "config.integrity && tests.integrityfb", + "output": [ "privateFeature" ] + }, + "kms": { + "label": "KMS", + "condition": "libs.drm", + "output": [ "publicQtConfig", "privateFeature" ] + }, + "drm_atomic": { + "label": "DRM Atomic API", + "condition": "libs.drm && tests.drm_atomic", + "output": [ "privateFeature" ] + }, + "libinput": { + "label": "libinput", + "condition": "features.libudev && libs.libinput", + "output": [ "privateFeature" ] + }, + "integrityhid": { + "label": "INTEGRITY HID", + "condition": "config.integrity && libs.integrityhid", + "output": [ "privateFeature" ] + }, + "libinput-axis-api": { + "label": "axis API in libinput", + "condition": "features.libinput && tests.libinput_axis_api", + "output": [ "privateFeature" ] + }, + "lgmon": { + "label": "lgmon", + "emitIf": "config.qnx", + "condition": "libs.lgmon", + "output": [ "privateConfig" ] + }, + "linuxfb": { + "label": "LinuxFB", + "section": "Platform plugins", + "condition": "tests.linuxfb && features.regularexpression", + "output": [ "privateFeature" ] + }, + "vsp2": { + "label": "VSP2", + "condition": "libs.v4l2", + "autoDetect": false, + "output": [ "privateFeature" ] + }, + "vnc": { + "label": "VNC", + "section": "Platform plugins", + "condition": [ + "config.unix && !config.android && !config.darwin && !config.wasm", + "features.regularexpression && features.network" + ], + "output": [ "privateFeature" ] + }, + "mtdev": { + "label": "mtdev", + "condition": "libs.mtdev", + "output": [ "privateFeature" ] + }, + "opengles2": { + "label": "OpenGL ES 2.0", + "enable": "input.opengl == 'es2' || input.angle == 'yes'", + "disable": "input.opengl == 'desktop' || input.opengl == 'dynamic' || input.opengl == 'no'", + "condition": "(config.win32 && !features.opengl-dynamic) || (!config.watchos && !features.opengl-desktop && libs.opengl_es2)", + "output": [ + "publicFeature", + "publicQtConfig", + { "type": "define", "name": "QT_OPENGL_ES" }, + { "type": "define", "name": "QT_OPENGL_ES_2" } + ] + }, + "opengles3": { + "label": "OpenGL ES 3.0", + "condition": "features.opengles2 && !features.angle && tests.opengles3", + "output": [ + "publicFeature", + { "type": "define", "name": "QT_OPENGL_ES_3" } + ] + }, + "opengles31": { + "label": "OpenGL ES 3.1", + "condition": "features.opengles3 && tests.opengles31", + "output": [ + "publicFeature", + { "type": "define", "name": "QT_OPENGL_ES_3_1" } + ] + }, + "opengles32": { + "label": "OpenGL ES 3.2", + "condition": "features.opengles31 && tests.opengles32", + "output": [ + "publicFeature", + { "type": "define", "name": "QT_OPENGL_ES_3_2" } + ] + }, + "opengl-desktop": { + "label": "Desktop OpenGL", + "autoDetect": "!config.win32", + "enable": "input.opengl == 'desktop'", + "disable": "input.opengl == 'es2' || input.opengl == 'dynamic' || input.opengl == 'no'", + "condition": "(config.win32 && !config.winrt && !features.opengles2 && (config.msvc || libs.opengl)) + || (!config.watchos && !config.win32 && !config.wasm && libs.opengl)" + }, + "opengl-dynamic": { + "label": "Dynamic OpenGL", + "disable": "input.angle == 'yes' || input.opengl == 'no' || input.opengl == 'desktop'", + "condition": "config.win32 && !config.winrt", + "output": [ + { "type": "publicFeature", "name": "dynamicgl" }, + { "type": "define", "name": "QT_OPENGL_DYNAMIC" } + ] + }, + "opengl": { + "label": "OpenGL", + "condition": "features.opengl-desktop || features.opengl-dynamic || features.opengles2", + "output": [ "publicFeature", "feature" ] + }, + "vkgen": { + "label": "vkgen", + "condition": "features.xmlstreamreader", + "output": [ "privateFeature" ] + }, + "vulkan": { + "label": "Vulkan", + "condition": "features.vkgen && libs.vulkan", + "output": [ "publicFeature" ] + }, + "openvg": { + "label": "OpenVG", + "condition": "libs.openvg", + "output": [ "publicFeature" ] + }, + "egl": { + "label": "EGL", + "condition": "(features.opengl || features.openvg) && (features.angle || libs.egl) && (features.dlopen || !config.unix || config.integrity)", + "output": [ "privateFeature", "feature" ] + }, + "egl_x11": { + "label": "EGL on X11", + "condition": "features.thread && features.egl && tests.egl-x11", + "output": [ "privateFeature" ] + }, + "eglfs": { + "label": "EGLFS", + "section": "Platform plugins", + "condition": "!config.android && !config.darwin && !config.win32 && !config.wasm && features.egl", + "output": [ "privateFeature" ] + }, + "eglfs_brcm": { + "label": "EGLFS Raspberry Pi", + "condition": "features.eglfs && tests.egl-brcm", + "output": [ "privateFeature" ] + }, + "eglfs_egldevice": { + "label": "EGLFS EGLDevice", + "condition": "features.eglfs && tests.egl-egldevice && features.kms", + "output": [ "privateFeature" ] + }, + "eglfs_gbm": { + "label": "EGLFS GBM", + "condition": "features.eglfs && features.gbm && features.kms", + "output": [ "privateFeature" ] + }, + "eglfs_vsp2": { + "label": "EGLFS VSP2", + "condition": "features.eglfs && features.gbm && features.kms && features.vsp2", + "output": [ "privateFeature" ] + }, + "eglfs_mali": { + "label": "EGLFS Mali", + "condition": "features.eglfs && (tests.egl-mali || tests.egl-mali-2)", + "output": [ "privateFeature" ] + }, + "eglfs_viv": { + "label": "EGLFS i.Mx6", + "condition": "features.eglfs && tests.egl-viv", + "output": [ "privateFeature" ] + }, + "eglfs_rcar": { + "label": "EGLFS RCAR", + "condition": "config.integrity && features.eglfs && tests.egl-rcar", + "output": [ "privateFeature" ] + }, + "eglfs_viv_wl": { + "label": "EGLFS i.Mx6 Wayland", + "condition": "features.eglfs_viv && libs.wayland_server", + "output": [ "privateFeature" ] + }, + "eglfs_openwfd": { + "label": "EGLFS OpenWFD", + "condition": "config.integrity && features.eglfs && tests.egl-openwfd", + "output": [ "privateFeature" ] + }, + "eglfs_x11": { + "label": "EGLFS X11", + "condition": "features.eglfs && features.xcb-xlib && features.egl_x11", + "output": [ "privateFeature" ] + }, + "gif": { + "label": "GIF", + "condition": "features.imageformatplugin", + "output": [ + "privateFeature", + { "type": "define", "negative": true, "name": "QT_NO_IMAGEFORMAT_GIF" } + ] + }, + "ico": { + "label": "ICO", + "condition": "features.imageformatplugin", + "output": [ "privateFeature", "feature" ] + }, + "jpeg": { + "label": "JPEG", + "disable": "input.libjpeg == 'no'", + "condition": "features.imageformatplugin", + "output": [ + "privateFeature", + { "type": "define", "negative": true, "name": "QT_NO_IMAGEFORMAT_JPEG" } + ] + }, + "system-jpeg": { + "label": " Using system libjpeg", + "disable": "input.libjpeg == 'qt'", + "enable": "input.libjpeg == 'system'", + "condition": "features.jpeg && libs.libjpeg", + "output": [ "privateFeature" ] + }, + "png": { + "label": "PNG", + "disable": "input.libpng == 'no'", + "output": [ + "privateFeature", + { "type": "define", "negative": true, "name": "QT_NO_IMAGEFORMAT_PNG" } + ] + }, + "system-png": { + "label": " Using system libpng", + "disable": "input.libpng == 'qt'", + "enable": "input.libpng == 'system'", + "autoDetect": "features.system-zlib", + "condition": "features.png && libs.libpng", + "output": [ "privateFeature" ] + }, + "qpa_default_platform": { + "label": "QPA default platform", + "condition": "features.gui", + "output": [ + { "type": "define", "name": "QT_QPA_DEFAULT_PLATFORM_NAME", "value": "tests.qpa_default_platform.name" }, + { "type": "varAssign", "public": true, "name": "QT_DEFAULT_QPA_PLUGIN", "value": "tests.qpa_default_platform.plugin", + "condition": "!features.shared" } + ] + }, + "sessionmanager": { + "label": "Session Management", + "purpose": "Provides an interface to the windowing system's session management.", + "section": "Kernel", + "output": [ "publicFeature", "feature" ] + }, + "tslib": { + "label": "tslib", + "condition": "libs.tslib", + "output": [ "privateFeature" ] + }, + "tuiotouch": { + "label": "TuioTouch", + "purpose": "Provides the TuioTouch input plugin.", + "condition": "features.network && features.udpsocket", + "output": [ "privateFeature" ] + }, + "xcb": { + "label": "XCB", + "section": "Platform plugins", + "autoDetect": "!config.darwin", + "condition": "features.thread && libs.xcb && tests.xcb_syslibs && features.xkbcommon-x11", + "output": [ "privateFeature" ] + }, + "x11-prefix": { + "label": "X11 prefix", + "emitIf": "features.xcb", + "output": [ { "type": "varAssign", "name": "QMAKE_X11_PREFIX", "value": "tests.x11prefix.value" } ] + }, + "xcb-glx-plugin": { + "label": "GLX Plugin", + "emitIf": "features.xcb", + "condition": "features.xcb-xlib && features.opengl && !features.opengles2", + "output": [ "privateFeature" ] + }, + "xcb-glx": { + "label": " XCB GLX", + "emitIf": "features.xcb && features.xcb-glx-plugin", + "condition": "libs.xcb_glx", + "output": [ "privateFeature" ] + }, + "xcb-egl-plugin": { + "label": "EGL-X11 Plugin", + "emitIf": "features.xcb", + "condition": "features.egl_x11 && features.opengl", + "output": [ "privateFeature" ] + }, + "xcb-native-painting": { + "label": "Native painting (experimental)", + "autoDetect": false, + "emitIf": "features.xcb", + "condition": "features.xcb-xlib && features.fontconfig && libs.xrender", + "output": [ "privateFeature" ] + }, + "xrender": { + "label": "XRender for native painting", + "emitIf": "features.xcb && features.xcb-native-painting", + "condition": "features.xcb-native-painting", + "output": [ "privateFeature" ] + }, + "xcb-xlib": { + "label": "XCB Xlib", + "condition": "features.xlib && libs.xcb_xlib", + "output": [ "privateFeature" ] + }, + "xcb-sm": { + "label": "xcb-sm", + "emitIf": "features.xcb", + "condition": "features.sessionmanager && libs.x11sm", + "output": [ "privateFeature" ] + }, + "system-xcb-xinput": { + "label": "Using system-provided xcb-xinput", + "emitIf": "features.xcb", + "disable": "input.bundled-xcb-xinput == 'yes'", + "enable": "input.bundled-xcb-xinput == 'no'", + "condition": "libs.xcb_xinput", + "output": [ "privateFeature" ] + }, + "xkbcommon": { + "label": "xkbcommon", + "condition": "libs.xkbcommon", + "output": [ "privateFeature" ] + }, + "xkbcommon-x11": { + "label": "xkbcommon-x11", + "condition": "features.xkbcommon && libs.xkbcommon_x11", + "output": [ "privateFeature" ] + }, + "xlib": { + "label": "XLib", + "autoDetect": "!config.darwin || features.xcb", + "condition": "libs.xlib", + "output": [ "privateFeature" ] + }, + "texthtmlparser": { + "label": "HtmlParser", + "purpose": "Provides a parser for HTML.", + "section": "Kernel", + "output": [ "publicFeature", "feature" ] + }, + "textmarkdownreader": { + "label": "MarkdownReader", + "disable": "input.libmd4c == 'no'", + "enable": "input.libmd4c == 'system' || input.libmd4c == 'qt' || input.libmd4c == 'yes'", + "purpose": "Provides a Markdown (CommonMark and GitHub) reader", + "section": "Kernel", + "output": [ "publicFeature" ] + }, + "system-textmarkdownreader": { + "label": " Using system libmd4c", + "disable": "input.libmd4c == 'qt'", + "enable": "input.libmd4c == 'system'", + "section": "Kernel", + "condition": "libs.libmd4c", + "output": [ "publicFeature" ] + }, + "textmarkdownwriter": { + "label": "MarkdownWriter", + "purpose": "Provides a Markdown (CommonMark) writer", + "section": "Kernel", + "output": [ "publicFeature" ] + }, + "textodfwriter": { + "label": "OdfWriter", + "purpose": "Provides an ODF writer.", + "section": "Kernel", + "condition": "features.xmlstreamwriter", + "output": [ "publicFeature", "feature" ] + }, + "cssparser": { + "label": "CssParser", + "purpose": "Provides a parser for Cascading Style Sheets.", + "section": "Kernel", + "output": [ "publicFeature", "feature" ] + }, + "draganddrop": { + "label": "Drag and Drop", + "purpose": "Supports the drag and drop mechansim.", + "section": "Kernel", + "condition": "features.imageformat_xpm", + "output": [ "publicFeature", "feature" ] + }, + "shortcut": { + "label": "QShortcut", + "purpose": "Provides keyboard accelerators and shortcuts.", + "section": "Kernel", + "output": [ "publicFeature", "feature" ] + }, + "action": { + "label": "QAction", + "purpose": "Provides widget actions.", + "section": "Kernel", + "output": [ "publicFeature", "feature" ] + }, + "cursor": { + "label": "QCursor", + "purpose": "Provides mouse cursors.", + "section": "Kernel", + "output": [ "publicFeature", "feature" ] + }, + "clipboard": { + "label": "QClipboard", + "purpose": "Provides cut and paste operations.", + "section": "Kernel", + "condition": "!config.integrity && !config.qnx && !config.rtems", + "output": [ "publicFeature", "feature" ] + }, + "wheelevent": { + "label": "QWheelEvent", + "purpose": "Supports wheel events.", + "section": "Kernel", + "output": [ "publicFeature", "feature" ] + }, + "tabletevent": { + "label": "QTabletEvent", + "purpose": "Supports tablet events.", + "section": "Kernel", + "output": [ "publicFeature", "feature" ] + }, + "im": { + "label": "QInputContext", + "purpose": "Provides complex input methods.", + "section": "Kernel", + "condition": "features.library", + "output": [ "publicFeature", "feature" ] + }, + "highdpiscaling": { + "label": "High DPI Scaling", + "purpose": "Provides automatic scaling of DPI-unaware applications on high-DPI displays.", + "section": "Kernel", + "output": [ "publicFeature", "feature" ] + }, + "validator": { + "label": "QValidator", + "purpose": "Supports validation of input text.", + "section": "Widgets", + "output": [ "publicFeature", "feature" ] + }, + "standarditemmodel": { + "label": "QStandardItemModel", + "purpose": "Provides a generic model for storing custom data.", + "section": "ItemViews", + "condition": "features.itemmodel", + "output": [ "publicFeature", "feature" ] + }, + "imageformatplugin": { + "label": "QImageIOPlugin", + "purpose": "Provides a base for writing a image format plugins.", + "section": "Images", + "output": [ "publicFeature", "feature" ] + }, + "movie": { + "label": "QMovie", + "purpose": "Supports animated images.", + "section": "Images", + "output": [ "publicFeature", "feature" ] + }, + "imageformat_bmp": { + "label": "BMP Image Format", + "purpose": "Supports Microsoft's Bitmap image file format.", + "section": "Images", + "output": [ "publicFeature", "feature" ] + }, + "imageformat_ppm": { + "label": "PPM Image Format", + "purpose": "Supports the Portable Pixmap image file format.", + "section": "Images", + "output": [ "publicFeature", "feature" ] + }, + "imageformat_xbm": { + "label": "XBM Image Format", + "purpose": "Supports the X11 Bitmap image file format.", + "section": "Images", + "output": [ "publicFeature", "feature" ] + }, + "imageformat_xpm": { + "label": "XPM Image Format", + "purpose": "Supports the X11 Pixmap image file format.", + "section": "Images", + "output": [ "publicFeature", "feature" ] + }, + "imageformat_png": { + "label": "PNG Image Format", + "purpose": "Supports the Portable Network Graphics image file format.", + "section": "Images", + "output": [ "publicFeature", "feature" ] + }, + "imageformat_jpeg": { + "label": "JPEG Image Format", + "purpose": "Supports the Joint Photographic Experts Group image file format.", + "section": "Images", + "output": [ "publicFeature", "feature" ] + }, + "image_heuristic_mask": { + "label": "QImage::createHeuristicMask()", + "purpose": "Supports creating a 1-bpp heuristic mask for images.", + "section": "Images", + "output": [ "publicFeature", "feature" ] + }, + "image_text": { + "label": "Image Text", + "purpose": "Supports image file text strings.", + "section": "Images", + "output": [ "publicFeature", "feature" ] + }, + "picture": { + "label": "QPicture", + "purpose": "Supports recording and replaying QPainter commands.", + "section": "Painting", + "output": [ "publicFeature", "feature" ] + }, + "colornames": { + "label": "Color Names", + "purpose": "Supports color names such as \"red\", used by QColor and by some HTML documents.", + "section": "Painting", + "output": [ "publicFeature", "feature" ] + }, + "pdf": { + "label": "QPdf", + "purpose": "Provides a PDF backend for QPainter.", + "section": "Painting", + "condition": "features.temporaryfile", + "output": [ "publicFeature", "feature" ] + }, + "desktopservices": { + "label": "QDesktopServices", + "purpose": "Provides methods for accessing common desktop services.", + "section": "Utilities", + "output": [ "publicFeature", "feature" ] + }, + "systemtrayicon": { + "label": "QSystemTrayIcon", + "purpose": "Provides an icon for an application in the system tray.", + "section": "Utilities", + "condition": "features.temporaryfile", + "output": [ "publicFeature", "feature" ] + }, + "accessibility": { + "label": "Accessibility", + "purpose": "Provides accessibility support.", + "section": "Utilities", + "condition": "features.properties", + "output": [ "publicFeature", "feature" ] + }, + "multiprocess": { + "label": "Multi process", + "purpose": "Provides support for detecting the desktop environment, launching external processes and opening URLs.", + "section": "Utilities", + "condition": "!config.integrity && !config.rtems", + "output": [ "privateFeature" ] + }, + "whatsthis": { + "label": "QWhatsThis", + "purpose": "Supports displaying \"What's this\" help.", + "section": "Widget Support", + "output": [ "publicFeature", "feature" ] + }, + "raster-64bit": { + "label": "QPainter - 64 bit raster", + "purpose": "Internal painting support for 64 bit (16 bpc) rasterization.", + "section": "Painting", + "output": [ "privateFeature" ] + } + }, + + "earlyReport": [ + { + "type": "error", + "condition": "input.xcb != '' && input.xcb != 'no' && input.xkbcommon == 'no'", + "message": "XCB plugin requires xkbcommon and xkbcommon-x11, but -no-xkbcommon was provided." + } + ], + + "report": [ + { + "type": "note", + "condition": "features.xcb && config.darwin", + "message": "XCB support on macOS is minimal and untested. Some features will +not work properly or at all (e.g. OpenGL, desktop services or accessibility), +or may depend on your system and XQuartz setup." + }, + { + "type": "note", + "condition": "features.accessibility && features.xcb && !features.accessibility-atspi-bridge", + "message": "Disabling X11 Accessibility Bridge: D-Bus or AT-SPI is missing." + }, + { + "type": "warning", + "condition": "input.qpa-platform-guard != ''", + "message": "The [-no]-qpa-platform-guard argument is deprecated and has no effect." + }, + { + "type": "warning", + "condition": "features.gui && config.linux && !config.android && !features.xcb && !features.eglfs && !features.directfb && !features.linuxfb", + "message": "No QPA platform plugin enabled! This will +produce a Qt that cannot run GUI applications. +See \"Platform backends\" in the output of --help." + }, + { + "type": "warning", + "condition": "config.win32 && (features.opengles2 || features.opengl-dynamic) && !features.angle", + "message": "Using OpenGL ES 2.0 on Windows without ANGLE. +The build will most likely fail. +Specify -opengl desktop to use regular OpenGL." + }, + { + "type": "warning", + "condition": "config.darwin && features.system-harfbuzz", + "message": "On OS X, AAT is supported only with -qt-harfbuzz." + }, + { + "type": "error", + "condition": "features.gui && !config.watchos && input.opengl != 'no' && !features.opengl-desktop && !features.opengles2 && !features.opengl-dynamic", + "message": "The OpenGL functionality tests failed! +You might need to modify the include and library search paths by editing QMAKE_INCDIR_OPENGL[_ES2], +QMAKE_LIBDIR_OPENGL[_ES2] and QMAKE_LIBS_OPENGL[_ES2] in the mkspec for your platform." + }, + { + "type": "warning", + "condition": "!features.accessibility", + "message": "Accessibility disabled. This configuration of Qt is unsupported." + } + ], + + "summary": [ + { + "section": "Qt Gui", + "entries": [ + "accessibility", + "freetype", + "system-freetype", + "harfbuzz", + "system-harfbuzz", + "fontconfig", + { + "section": "Image formats", + "entries": [ + "gif", "ico", "jpeg", "system-jpeg", "png", "system-png" + ] + }, + { + "section": "Text formats", + "entries": [ + "texthtmlparser", "cssparser", "textodfwriter", "textmarkdownreader", "system-textmarkdownreader", "textmarkdownwriter" + ] + }, + "egl", + "openvg", + { + "section": "OpenGL", + "entries": [ + { + "type": "feature", + "args": "angle", + "condition": "config.win32" + }, + { + "type": "feature", + "args": "combined-angle-lib", + "condition": "features.angle" + }, + "opengl-desktop", + { + "type": "feature", + "args": "opengl-dynamic", + "condition": "config.win32" + }, + "opengles2", + "opengles3", + "opengles31", + "opengles32" + ] + }, + "vulkan", + "sessionmanager" + ] + }, + { + "section": "Features used by QPA backends", + "entries": [ + "evdev", + "libinput", + "integrityhid", + "mtdev", + "tslib", + "xkbcommon", + { + "section": "X11 specific", + "entries": [ + "xlib", + "xcb-xlib", + "egl_x11", + "xkbcommon-x11" + ] + } + ] + }, + { + "section": "QPA backends", + "entries": [ + "directfb", "eglfs", + { + "section": "EGLFS details", + "condition": "features.eglfs", + "entries": [ + "eglfs_openwfd", "eglfs_viv", "eglfs_viv_wl", "eglfs_rcar", "eglfs_egldevice", "eglfs_gbm", "eglfs_vsp2", "eglfs_mali", "eglfs_brcm", "eglfs_x11" + ] + }, + "linuxfb", "vnc", + { + "type": "feature", + "condition": "config.integrity", + "args": "integrityfb" + }, + { + "section": "QNX", + "condition": "config.qnx", + "entries": [ + "lgmon", "qqnx_imf" + ] + }, + { + "section": "XCB", + "condition": "features.xcb", + "entries": [ + "system-xcb-xinput", "xcb-native-painting", + { + "section": "GL integrations", + "entries": [ + "xcb-glx-plugin", + "xcb-glx", + "xcb-egl-plugin" + ] + } + ] + }, + { + "section": "Windows", + "condition": "config.win32", + "entries": [ + "direct2d", "directwrite", "directwrite2" + ] + } + ] + } + ] +} diff --git a/contrib/build-appimage.sh b/contrib/build-appimage.sh new file mode 100644 index 0000000..a8d7cf7 --- /dev/null +++ b/contrib/build-appimage.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +set -e + +function verify_hash() { + local file=$1 expected_hash=$2 + actual_hash=$(sha256sum $file | awk '{print $1}') + if [ "$actual_hash" == "$expected_hash" ]; then + return 0 + else + echo "$file $actual_hash (unexpected hash)" >&2 + rm "$file" + exit 1 + fi +} + +function download_if_not_exist() { + local file_name=$1 url=$2 + if [ ! -e $file_name ] ; then + wget -q -O $file_name "$url" + fi +} + +APPDIR="$PWD/feather.AppDir" +mkdir -p "$APPDIR" +mkdir -p "$APPDIR/usr/share/applications/" +mkdir -p "$APPDIR/usr/bin" + +echo "Downloading dependencies" + +download_if_not_exist "feather.zip" "https://build.featherwallet.org/files/linux-release/$BRANCH/$FN" +unzip -q feather.zip + +cp "$PWD/src/assets/feather.desktop" "$APPDIR/usr/share/applications/feather.desktop" +cp "$PWD/src/assets/images/appicons/64x64.png" "$APPDIR/feather.png" +cp "$PWD/feather" "$APPDIR/usr/bin/feather" + +/appimagetool deploy "$APPDIR/usr/share/applications/feather.desktop" +VERSION=1.0 /appimagetool ./feather.AppDir + diff --git a/contrib/build_tor.sh b/contrib/build_tor.sh new file mode 100755 index 0000000..1af2d32 --- /dev/null +++ b/contrib/build_tor.sh @@ -0,0 +1,126 @@ +#!/usr/bin/env bash +# this file is used by feather's CMake +# arguments: ./build.tor $TAG $ROOT_FEATHER_DIR + +set -ex + +ERR_WIN="This script does not work on Windows" +if [[ "$OSTYPE" == "msys" ]]; then + echo "$ERR_WIN" + exit 1 +elif [[ "$OSTYPE" == "win32" ]]; then + echo "$ERR_WIN" + exit 1 +fi + +TOR_TAG="$1" +ROOT_DIR="$2" +STATIC="$3" +TOR_DIR="$ROOT_DIR/contrib/tor" +TORSOCKS_DIR="$ROOT_DIR/contrib/torsocks" +TARGET_DIR="$ROOT_DIR/src/tor" + +CPU_CORE_COUNT="$(nproc)" + +# +### tor +# + +pushd "$TOR_DIR" + +rm -rf "$TOR_DIR/build" +mkdir -p "$TOR_DIR/build" + +# configure +git -C "$TOR_DIR" fetch +git -C "$TOR_DIR" checkout tor-0.4.3.5 +bash "$TOR_DIR/autogen.sh" + +if [[ "$STATIC" = "ON" ]]; then + # static assumes that openssl has been compiled with: + # CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./config no-asm no-shared no-zlib-dynamic --prefix=/usr/local/openssl --openssldir=/usr/local/openssl + # and libevent with: + # cmake -DEVENT_LIBRARY_STATIC=ON -DOPENSSL_ROOT_DIR=/usr/local/openssl -DCMAKE_INSTALL_PREFIX=/usr/local/libevent + # and zlib with: + # CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --static --prefix=/usr/local/zlib + + LDFLAGS="-L/usr/local/openssl/lib/" LIBS="-lssl -lcrypto -lpthread -ldl" CPPFLAGS="-I/usr/local/openssl/include/" ./configure \ + --enable-static-zlib \ + --enable-static-openssl \ + --enable-static-libevent \ + --disable-system-torrc \ + --with-libevent-dir=/usr/local/libevent \ + --with-openssl-dir=/usr/local/openssl/ \ + --with-zlib-dir=/usr/local/zlib \ + --disable-system-torrc \ + --disable-tool-name-check \ + --disable-systemd \ + --disable-lzma \ + --disable-unittests \ + --disable-zstd \ + --disable-seccomp \ + --disable-asciidoc \ + --disable-manpage \ + --disable-html-manual \ + --disable-system-torrc \ + --prefix="$TOR_DIR/build" +else + bash "$TOR_DIR/configure" \ + --disable-tool-name-check \ + --disable-systemd \ + --disable-lzma \ + --disable-unittests \ + --disable-zstd \ + --disable-asciidoc \ + --disable-manpage \ + --disable-html-manual \ + --prefix="$TOR_DIR/build" +fi + +# build +make -j "$CPU_CORE_COUNT" +make install -j "$CPU_CORE_COUNT" + +# copy to lib/tor +cp "$TOR_DIR/build/bin/tor" "$TARGET_DIR" +cp "$TOR_DIR/build/etc/tor/torrc.sample"* "$TARGET_DIR" + +# +### torsocks +# + +pushd "$TORSOCKS_DIR" +mkdir -p "$TORSOCKS_DIR/build" + +# configure +bash "$TORSOCKS_DIR/autogen.sh" +bash "$TORSOCKS_DIR/configure" --prefix="$TORSOCKS_DIR/build" + +# build +make -j "$CPU_CORE_COUNT" +make install -j "$CPU_CORE_COUNT" + +# copy to lib/torsocks +cp "$TORSOCKS_DIR/build/lib/torsocks/"* "$TARGET_DIR" +cp "$TORSOCKS_DIR/build/bin/"* "$TARGET_DIR" +cp "$TORSOCKS_DIR/build/etc/tor/"* "$TARGET_DIR" + +# +### verify installation +# + +if [[ "$OSTYPE" == "linux-gnu"* ]]; then + for fn in "$TARGET_DIR/libtorsocks.so" "$TARGET_DIR/tor"; do + if [[ ! -f "$fn" ]]; then + echo "[*] Failed to install tor or torsocks: no such file $fn" + exit 1 + fi; done +elif [[ "$OSTYPE" == "darwin"* ]]; then + for fn in "$TARGET_DIR/libtorsocks.dylib" "$TARGET_DIR/tor"; do + if [[ ! -f "$fn" ]]; then + echo "[*] Failed to install tor or torsocks: no such file $fn" + exit 1 + fi; done +fi + +echo "[*] Compiled tor/torsocks into $TARGET_DIR" diff --git a/contrib/tor b/contrib/tor new file mode 160000 index 0000000..e687707 --- /dev/null +++ b/contrib/tor @@ -0,0 +1 @@ +Subproject commit e68770719ef4d3d3b83398715b1e10391ab6a1b4 diff --git a/contrib/torsocks b/contrib/torsocks new file mode 160000 index 0000000..4c00ec8 --- /dev/null +++ b/contrib/torsocks @@ -0,0 +1 @@ +Subproject commit 4c00ec8773fd63fa48ef49e1ccf2adac598427be diff --git a/contrib/torsocks_macos.patch b/contrib/torsocks_macos.patch new file mode 100644 index 0000000..648c65d --- /dev/null +++ b/contrib/torsocks_macos.patch @@ -0,0 +1,53 @@ +From fc5eafeb2886605d4de1546846f06a12a18c87ef Mon Sep 17 00:00:00 2001 +From: "J.W" +Date: Mon, 22 Apr 2019 05:19:32 +0100 +Subject: [PATCH 1/2] Fix macros for accept4(2) + +Both accept(2) and accept4(2) exist on linux but accept4(2) does not +exist on macos 10.11.6 (and maybe other distros). +--- + src/lib/torsocks.c | 9 ++++++++- + src/lib/torsocks.h | 4 +++- + 2 files changed, 11 insertions(+), 2 deletions(-) + +diff --git a/src/lib/torsocks.c b/src/lib/torsocks.c +index 16f2da0..9527513 100644 +--- a/src/lib/torsocks.c ++++ b/src/lib/torsocks.c +@@ -234,9 +234,16 @@ static void init_libc_symbols(void) + tsocks_libc_socket = dlsym(libc_ptr, LIBC_SOCKET_NAME_STR); + tsocks_libc_syscall = dlsym(libc_ptr, LIBC_SYSCALL_NAME_STR); + tsocks_libc_execve = dlsym(libc_ptr, LIBC_EXECVE_NAME_STR); ++ tsocks_libc_accept = dlsym(libc_ptr, LIBC_ACCEPT_NAME_STR); ++#if (defined(__linux__)) + tsocks_libc_accept4 = dlsym(libc_ptr, LIBC_ACCEPT4_NAME_STR); ++#endif ++ + if (!tsocks_libc_connect || !tsocks_libc_close || !tsocks_libc_socket || +- !tsocks_libc_syscall || !tsocks_libc_execve || ! tsocks_libc_accept4) { ++#if (defined(__linux__)) ++ !tsocks_libc_accept4 || ++#endif ++ !tsocks_libc_syscall || !tsocks_libc_execve || ! tsocks_libc_accept) { + ERR("Unable to lookup symbols in " LIBC_NAME "(%s)", dlerror()); + goto error; + } +diff --git a/src/lib/torsocks.h b/src/lib/torsocks.h +index 33da526..bf9109d 100644 +--- a/src/lib/torsocks.h ++++ b/src/lib/torsocks.h +@@ -30,8 +30,10 @@ + * libc call outside of torsocks can be used. These are declared for each + * symbol torsocks hijacked. + */ ++#define TSOCKS_LIBC_FUNC(name) \ ++ tsocks_libc_##name + #define TSOCKS_LIBC_DECL(name, type, sig) \ +- type (*tsocks_libc_##name)(sig); ++ type (*TSOCKS_LIBC_FUNC(name))(sig); + #define TSOCKS_DECL(name, type, sig) \ + extern type tsocks_##name(sig); + +-- +2.21.0 + diff --git a/contrib/unbound_static.patch b/contrib/unbound_static.patch new file mode 100644 index 0000000..a680fd5 --- /dev/null +++ b/contrib/unbound_static.patch @@ -0,0 +1,18 @@ +diff --git a/configure_checks.cmake b/configure_checks.cmake +index c31b3f33..50b3305d 100644 +--- a/configure_checks.cmake ++++ b/configure_checks.cmake +@@ -202,10 +202,10 @@ check_symbol_exists(NID_X9_62_prime256v1 "openssl/evp.h" HAVE_DECL_NID_X9_62_PRI + check_symbol_exists(sk_SSL_COMP_pop_free "openssl/ssl.h" HAVE_DECL_SK_SSL_COMP_POP_FREE) + check_symbol_exists(SSL_COMP_get_compression_methods "openssl/ssl.h" HAVE_DECL_SSL_COMP_GET_COMPRESSION_METHODS) + +-check_function_exists(EVP_MD_CTX_new HAVE_EVP_MD_CTX_NEW) ++set(HAVE_EVP_MD_CTX_NEW 1) + check_function_exists(EVP_sha1 HAVE_EVP_SHA1) +-check_function_exists(EVP_sha256 HAVE_EVP_SHA256) +-check_function_exists(EVP_sha512 HAVE_EVP_SHA512) ++set(HAVE_EVP_SHA256 1) ++set(HAVE_EVP_SHA512 1) + check_function_exists(FIPS_mode HAVE_FIPS_MODE) + check_function_exists(HMAC_Update HAVE_HMAC_UPDATE) + check_function_exists(OPENSSL_config HAVE_OPENSSL_CONFIG) diff --git a/monero b/monero new file mode 160000 index 0000000..a1404e9 --- /dev/null +++ b/monero @@ -0,0 +1 @@ +Subproject commit a1404e92cb439ba0f120e7c4a579ed0b9a0372a4 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..19021c3 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,216 @@ +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_AUTOUIC ON) + +# pthread +find_package(Threads REQUIRED) + +find_package(Qt5 REQUIRED COMPONENTS Core Widgets Gui Network Svg Xml WebSockets) + +add_subdirectory(libwalletqt) +add_subdirectory(model) +add_subdirectory(utils) +add_subdirectory(openpgp) + +qt5_add_resources(RESOURCES assets.qrc) + +# Compile source files (.h/.cpp) +file(GLOB SOURCE_FILES + "*.h" + "*.cpp" + "utils/*.h" + "utils/*.cpp" + "libwalletqt/*.h" + "libwalletqt/*.cpp" + "daemon/*.h" + "daemon/*.cpp" + "model/*.h" + "model/*.cpp" + "qt/*.h" + "qt/*.cpp" + "ui/qdarkstyle/style.qrc" + "ui/BreezeStyleSheets/breeze.qrc" + "widgets/*.h" + "widgets/*.cpp" + "wizard/*.h" + "wizard/*.cpp" + "wallet/*.h" + "wallet/*.cpp" + "qrcode/*.h" + "qrcode/*.cpp" + "dialog/*.h" + "dialog/*.cpp" + ) + +if(APPLE AND BUILD_TOR) + set(ASSETS_OS "assets_macos_tor.qrc") +elseif(UNIX AND NOT APPLE AND BUILD_TOR) + set(ASSETS_OS "assets_linux_tor.qrc") +elseif(MINGW AND BUILD_TOR) + set(ASSETS_OS "assets_windows_tor.qrc") +else() + message(STATUS "Building without embedded Tor") +endif() + +set(EXECUTABLE_FLAG) +if(MINGW) + set(EXECUTABLE_FLAG WIN32) + + set(ICON ${PROJECT_SOURCE_DIR}/src/assets/images/appicons/appicon.ico) + set(ICON_RC ${CMAKE_CURRENT_BINARY_DIR}/icon.rc) + set(ICON_RES ${CMAKE_CURRENT_BINARY_DIR}/icon.o) + file(WRITE ${ICON_RC} "IDI_ICON1 ICON DISCARDABLE \"${ICON}\"") + add_custom_command(OUTPUT ${ICON_RES} COMMAND windres ${ICON_RC} ${ICON_RES} MAIN_DEPENDENCY ${ICON_RC}) + list(APPEND RESOURCES ${ICON_RES}) +endif() + +# mac os bundle +if(APPLE) + set(ICON ${PROJECT_SOURCE_DIR}/src/assets/images/appicons/appicon.icns) + set_source_files_properties(${ICON} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") + list(APPEND RESOURCES ${ICON}) +endif() + +add_executable(feather ${EXECUTABLE_FLAG} main.cpp + ${SOURCE_FILES} + ${RESOURCES} + ${ASSETS_OS} + ) + +# mac os bundle +set_target_properties(feather PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" + MACOSX_BUNDLE TRUE + MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/utils/Info.plist" +) + +set_property(TARGET feather PROPERTY RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") + +target_include_directories(feather PUBLIC ${OPENGL_INCLUDE_DIR}) +target_include_directories(feather PUBLIC ${Qt5Gui_PRIVATE_INCLUDE_DIRS}) + +file(GLOB_RECURSE SRC_SOURCES *.cpp) +file(GLOB_RECURSE SRC_HEADERS *.h) + +target_include_directories(feather PUBLIC + ${CMAKE_BINARY_DIR}/src/feather_autogen/include + ${CMAKE_SOURCE_DIR}/monero/include + ${CMAKE_SOURCE_DIR}/monero/src + ${CMAKE_SOURCE_DIR}/monero/external/easylogging++ + ${CMAKE_SOURCE_DIR}/monero/contrib/epee/include + ${CMAKE_SOURCE_DIR}/src + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/daemon + ${CMAKE_CURRENT_SOURCE_DIR}/libwalletqt + ${CMAKE_CURRENT_SOURCE_DIR}/model + ${CMAKE_CURRENT_SOURCE_DIR}/utils + ${CMAKE_CURRENT_SOURCE_DIR}/tor + ${CMAKE_CURRENT_SOURCE_DIR}/qrcode + ${X11_INCLUDE_DIR} + ${Boost_INCLUDE_DIRS} + ${OPENSSL_INCLUDE_DIR} + ${Qt5Core_INCLUDE_DIRS} + ${Qt5Widgets_INCLUDE_DIRS} + ${Qt5Gui_INCLUDE_DIRS} + ${Qt5Network_INCLUDE_DIRS} + ${Qt5Svg_INCLUDE_DIRS} + ${Qt5Xml_INCLUDE_DIRS} + ${Qt5WebSockets_INCLUDE_DIRS} + ) + +if(DONATE_BEG) + target_compile_definitions(feather PRIVATE DONATE_BEG=1) +endif() + +if(BUILD_TOR) + target_compile_definitions(feather PRIVATE BUILD_TOR=1) +endif() + +if(XMRTO) + target_compile_definitions(feather PRIVATE XMRTO=1) +endif() + +if(HAVE_SYS_PRCTL_H) + target_compile_definitions(feather PRIVATE HAVE_SYS_PRCTL_H=1) +endif() + +if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug") + target_compile_definitions(feather PRIVATE QT_NO_DEBUG=1) +endif() + +target_compile_definitions(feather + PUBLIC + ${Qt5Core_DEFINITIONS} + ${Qt5Widgets_DEFINITIONS} + ${Qt5Gui_DEFINITIONS} + ${Qt5Network_DEFINITIONS} + ${Qt5Svg_DEFINITIONS} + ${Qt5Xml_DEFINITIONS} + ${Qt5WebSockets_DEFINITIONS} + ) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}") + +if(UNIX AND NOT APPLE) + # https://stackoverflow.com/questions/57766620/cmake-add-library-doesnt-initialize-static-global-variable + # so that contrib/monero-seed/src/gf_elem.cpp properly initializes. A better solution is welcome. + target_link_libraries(feather -Wl,--whole-archive monero-seed::monero-seed -Wl,--no-whole-archive) +else() + target_link_libraries(feather monero-seed::monero-seed) +endif() + +target_link_libraries(feather + wallet_merged + ${LMDB_LIBRARY} + epee + ${UNBOUND_LIBRARY} + ${SODIUM_LIBRARY} + easylogging + blockchain_db + randomx + hardforks + ${Boost_LIBRARIES} + ${OPENSSL_LIBRARIES} + ${CMAKE_DL_LIBS} + ${EXTRA_LIBRARIES} + Qt5::Core + Qt5::Widgets + Qt5::Gui + Qt5::Network + Qt5::Svg + Qt5::Xml + Qt5::WebSockets + ${ICU_LIBRARIES} + openpgp + Threads::Threads + ${QRENCODE_LIBRARY} + ) + +if(NOT APPLE) + target_link_libraries(feather + Qt5::QSvgIconPlugin + Qt5::QSvgPlugin + ) +endif() + +if(STATIC) + target_link_libraries(feather + Qt5::QSvgIconPlugin + Qt5::QSvgPlugin) + if(UNIX AND NOT APPLE) + target_link_libraries(feather + Qt5::QXcbIntegrationPlugin) + endif() +endif() + +if(X11_FOUND) + target_link_libraries(feather ${X11_LIBRARIES}) +endif() + +if(APPLE) + include(Deploy) +endif() + +install(TARGETS feather + DESTINATION ${CMAKE_INSTALL_PREFIX} + ) diff --git a/src/appcontext.cpp b/src/appcontext.cpp new file mode 100644 index 0000000..60b196a --- /dev/null +++ b/src/appcontext.cpp @@ -0,0 +1,768 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include +#include +#include +#include +#include +#include + +#include "appcontext.h" +#include "utils/tails.h" +#include "utils/whonix.h" +#include "utils/utils.h" +#include "utils/prices.h" +#include "utils/networktype.h" +#include "utils/wsclient.h" + +// libwalletqt +#include "libwalletqt/WalletManager.h" +#include "libwalletqt/Wallet.h" +#include "libwalletqt/TransactionHistory.h" +#include "libwalletqt/SubaddressAccount.h" +#include "libwalletqt/Subaddress.h" +#include "libwalletqt/Coins.h" +#include "model/TransactionHistoryModel.h" +#include "model/SubaddressAccountModel.h" +#include "model/SubaddressModel.h" +#include "utils/keysfiles.h" +#include "utils/networktype.h" +#include "utils/config.h" + + +Prices *AppContext::prices = nullptr; +WalletKeysFilesModel *AppContext::wallets = nullptr; +TxFiatHistory *AppContext::txFiatHistory = nullptr; +double AppContext::balance = 0; +QMap AppContext::txDescriptionCache; + +AppContext::AppContext(QCommandLineParser *cmdargs) { + this->network = new QNetworkAccessManager(); + this->networkClearnet = new QNetworkAccessManager(); + this->cmdargs = cmdargs; + +#if defined(Q_OS_MAC) + this->isTorSocks = qgetenv("DYLD_INSERT_LIBRARIES").indexOf("libtorsocks") >= 0; +#elif defined(Q_OS_LINUX) + this->isTorSocks = qgetenv("LD_PRELOAD").indexOf("libtorsocks") >= 0; +#elif defined(Q_OS_WIN) + this->isTorSocks = false; +#endif + + this->isTails = TailsOS::detect(); + this->isWhonix = WhonixOS::detect(); + + //Paths + this->configRoot = QDir::homePath(); + if (isTails) { // #if defined(PORTABLE) + QString portablePath = []{ + QString appImagePath = qgetenv("APPIMAGE"); + if (appImagePath.isEmpty()) { + qDebug() << "Not an appimage, using currentPath()"; + return QDir::currentPath() + "/.feather"; + } + + QFileInfo appImageDir(appImagePath); + return appImageDir.absoluteDir().path() + "/.feather"; + }(); + + + if (QDir().mkpath(portablePath)) { + this->configRoot = portablePath; + } else { + qCritical() << "Unable to create portable directory: " << portablePath; + } + } + + this->accountName = Utils::getUnixAccountName(); + this->homeDir = QDir::homePath(); + +#if defined(Q_OS_LINUX) or defined(Q_OS_MAC) + this->defaultWalletDir = QString("%1/Monero/wallets").arg(this->configRoot); + this->defaultWalletDirRoot = QString("%1/Monero").arg(this->configRoot); +#elif defined(Q_OS_WIN) + // @TODO +#endif + + // Create ~/Monero/wallets if it does not exist yet + if (!QDir().mkpath(defaultWalletDir)) + qCritical() << "Unable to create dir: " << defaultWalletDir; + + this->configDirectory = QString("%1/.config/feather/").arg(this->configRoot); +#if defined(Q_OS_UNIX) + if(!this->configDirectory.endsWith('/')) + this->configDirectory = QString("%1/").arg(this->configDirectory); +#endif + this->sorry(); + + // Config + createConfigDirectory(this->configDirectory); + + if(this->cmdargs->isSet("stagenet")) + this->networkType = NetworkType::STAGENET; + else if(this->cmdargs->isSet("testnet")) + this->networkType = NetworkType::TESTNET; + else + this->networkType = NetworkType::MAINNET; + +// auto nodeSourceUInt = config()->get(Config::nodeSource).toUInt(); +// AppContext::nodeSource = static_cast(nodeSourceUInt); + this->nodes = new Nodes(this, this->networkClearnet); + connect(this, &AppContext::nodeSourceChanged, this->nodes, &Nodes::onNodeSourceChanged); + connect(this, &AppContext::setCustomNodes, this->nodes, &Nodes::setCustomNodes); + connect(this, &AppContext::walletClosing, this->nodes, &Nodes::onWalletClosing); + + // Tor & socks proxy + this->ws = new WSClient(this, m_wsUrl); + connect(this->ws, &WSClient::WSMessage, this, &AppContext::onWSMessage); + + // timers + m_storeTimer->setSingleShot(true); + connect(this->m_storeTimer, &QTimer::timeout, [this](){ + if (!this->currentWallet) + return; + qDebug() << "Storing wallet"; + this->currentWallet->store(); + }); + + // restore height lookup + this->initRestoreHeights(); + + // price history lookup + auto genesis_timestamp = this->restoreHeights[NetworkType::Type::MAINNET]->data.firstKey(); + AppContext::txFiatHistory = new TxFiatHistory(genesis_timestamp, this->configDirectory); + connect(this->ws, &WSClient::connectionEstablished, AppContext::txFiatHistory, &TxFiatHistory::onUpdateDatabase); + connect(AppContext::txFiatHistory, &TxFiatHistory::requestYear, [=](unsigned int year){ + QByteArray data = QString(R"({"cmd": "txFiatHistory", "data": {"year": %1}})").arg(year).toUtf8(); + this->ws->sendMsg(data); + }); + connect(AppContext::txFiatHistory, &TxFiatHistory::requestYearMonth, [=](unsigned int year, unsigned int month) { + QByteArray data = QString(R"({"cmd": "txFiatHistory", "data": {"year": %1, "month": %2}})").arg(year).arg(month).toUtf8(); + this->ws->sendMsg(data); + }); + + // fiat/crypto lookup + AppContext::prices = new Prices(); + + // xmr.to +#if defined(XMRTO) + this->XMRTo = new XmrTo(this); +#endif + + this->walletManager = WalletManager::instance(); + QString logPath = QString("%1/daemon.log").arg(configDirectory); + Monero::Utils::onStartup(); + Monero::Wallet::init("", "feather", logPath.toStdString(), true); + + bool logLevelFromEnv; + int logLevel = qEnvironmentVariableIntValue("MONERO_LOG_LEVEL", &logLevelFromEnv); + if(this->cmdargs->isSet("quiet")) + this->walletManager->setLogLevel(-1); + else if (logLevelFromEnv && logLevel >= 0 && logLevel <= Monero::WalletManagerFactory::LogLevel_Max) + Monero::WalletManagerFactory::setLogLevel(logLevel); + + connect(this, &AppContext::createTransactionError, this, &AppContext::onCreateTransactionError); + + // libwallet connects + connect(this->walletManager, &WalletManager::walletOpened, this, &AppContext::onWalletOpened); +} + +void AppContext::initTor() { + this->tor = new Tor(this); + this->tor->start(); + + if (!(isTails || isWhonix)) { + auto networkProxy = new QNetworkProxy(QNetworkProxy::Socks5Proxy, Tor::torHost, Tor::torPort); + this->network->setProxy(*networkProxy); + if (m_wsUrl.host().endsWith(".onion")) + this->ws->webSocket.setProxy(*networkProxy); + } + +} + +void AppContext::initWS() { + this->ws->start(); +} + +void AppContext::onCancelTransaction(PendingTransaction *tx, const QString &address) { + // tx cancelled by user + double amount = tx->amount() / AppContext::cdiv; + emit createTransactionCancelled(address, amount); + this->currentWallet->disposeTransaction(tx); +} + +void AppContext::onSweepOutput(const QString &keyImage, QString address, bool churn, int outputs) const { + if(this->currentWallet == nullptr){ + qCritical() << "Cannot create transaction; no wallet loaded"; + return; + } + + if (churn) { + address = this->currentWallet->address(0, 0); // primary address + } + + qCritical() << "Creating transaction"; + this->currentWallet->createTransactionSingleAsync(keyImage, address, outputs, this->tx_priority); +} + +void AppContext::onCreateTransaction(XmrToOrder *order) { + // tx creation via xmr.to + const QString description = QString("XmrTo order %1").arg(order->uuid); + this->onCreateTransaction(order->receiving_subaddress, order->incoming_amount_total, description, false); +} + +void AppContext::onCreateTransaction(const QString &address, const double amount, const QString &description, bool all) { + // tx creation + this->tmpTxDescription = description; + + if(this->currentWallet == nullptr) { + emit createTransactionError("Cannot create transaction; no wallet loaded"); + return; + } + + if (!all && amount <= 0) { + emit createTransactionError("Cannot send nothing"); + return; + } + + auto balance = this->currentWallet->balance() / AppContext::cdiv; + auto unlocked_balance = this->currentWallet->unlockedBalance() / AppContext::cdiv; + if(!all && amount > unlocked_balance) { + emit createTransactionError("Not enough money to spend"); + return; + } else if(unlocked_balance == 0) { + emit createTransactionError("No money to spend"); + return; + } + + auto amount_num = static_cast(amount * AppContext::cdiv); + qDebug() << "creating tx"; + if(all || amount == balance) + this->currentWallet->createTransactionAllAsync(address, "", this->tx_mixin, this->tx_priority); + else + this->currentWallet->createTransactionAsync(address, "", amount_num, this->tx_mixin, this->tx_priority); + + emit initiateTransaction(); +} + +void AppContext::onCreateTransactionError(const QString &msg) { + this->tmpTxDescription = ""; + emit endTransaction(); +} + +void AppContext::walletClose(bool emitClosedSignal) { + this->nodes->stopTimer(); + if(this->currentWallet == nullptr) return; + emit walletClosing(); + //ctx->currentWallet->store(); @TODO: uncomment to store on wallet close + this->currentWallet->disconnect(); + this->walletManager->closeWallet(); + if(this->currentWallet != nullptr) + this->currentWallet = nullptr; + if(emitClosedSignal) + emit walletClosed(); +} + +void AppContext::onOpenWallet(const QString &path, const QString &password){ + if(this->currentWallet != nullptr){ + emit walletOpenedError("There is an active wallet opened."); + return; + } + + if(!Utils::fileExists(path)) { + emit walletOpenedError(QString("Wallet not found: %1").arg(path)); + return; + } + + config()->set(Config::firstRun, false); + + this->walletPath = path; + this->walletManager->openWalletAsync(path, password, this->networkType, 1); +} + +void AppContext::onPreferredFiatCurrencyChanged(const QString &symbol) { + if(this->currentWallet) { + auto *model = this->currentWallet->transactionHistoryModel(); + if(model != nullptr) { + model->preferredFiatSign = AppContext::prices->fiat[symbol]; + model->preferredFiatSymbol = symbol; + } + } +} + +void AppContext::onWalletOpened(Wallet *wallet) { + auto state = wallet->status(); + if (state != Wallet::Status_Ok) { + auto errMsg = wallet->errorString(); + if(errMsg == QString("basic_string::_M_replace_aux") || errMsg == QString("std::bad_alloc")) { + qCritical() << errMsg; + this->walletManager->clearWalletCache(this->walletPath); + errMsg = QString("%1\n\nAttempted to clean wallet cache. Please restart Feather.").arg(errMsg); + this->walletClose(false); + emit walletOpenedError(errMsg); + } else if(errMsg.contains("wallet cannot be opened as")) { + this->walletClose(false); + emit walletOpenedError(errMsg); + } else if(errMsg.contains("is opened by another wallet program")) { + this->walletClose(false); + emit walletOpenedError(errMsg); + } else { + this->walletClose(false); + emit walletOpenPasswordNeeded(this->walletPassword.isEmpty()); + } + return; + } + + this->currentWallet = wallet; + this->walletPath = this->currentWallet->path() + ".keys"; + config()->set(Config::walletPath, this->walletPath); + + connect(this->currentWallet, &Wallet::moneySpent, this, &AppContext::onMoneySpent); + connect(this->currentWallet, &Wallet::moneyReceived, this, &AppContext::onMoneyReceived); + connect(this->currentWallet, &Wallet::unconfirmedMoneyReceived, this, &AppContext::onUnconfirmedMoneyReceived); + connect(this->currentWallet, &Wallet::newBlock, this, &AppContext::onWalletNewBlock); + connect(this->currentWallet, &Wallet::updated, this, &AppContext::onWalletUpdate); + connect(this->currentWallet, &Wallet::refreshed, this, &AppContext::onWalletRefreshed); + connect(this->currentWallet, &Wallet::transactionCommitted, this, &AppContext::onTransactionCommitted); + connect(this->currentWallet, &Wallet::heightRefreshed, this, &AppContext::onHeightRefreshed); + connect(this->currentWallet, &Wallet::transactionCreated, this, &AppContext::onTransactionCreated); + connect(this->currentWallet, &Wallet::connectionStatusChanged, this, &AppContext::onConnectionStatusChanged); + + this->nodes->connectToNode(); + + emit walletOpened(); + this->updateBalance(); + +#ifdef DONATE_BEG + this->donateBeg(); +#endif + + // force trigger preferredFiat signal for history model + this->onPreferredFiatCurrencyChanged(config()->get(Config::preferredFiatCurrency).toString()); +} + +void AppContext::onWSMessage(const QJsonObject &msg) { + QString cmd = msg.value("cmd").toString(); + + if(cmd == "blockheights") { + auto heights = msg.value("data").toObject(); + auto mainnet = heights.value("mainnet").toInt(); + auto stagenet = heights.value("stagenet").toInt(); + auto changed = false; + + if(!this->heights.contains("mainnet")) { + this->heights["mainnet"] = (unsigned int) mainnet; + changed = true; + } + else { + if (mainnet > this->heights["mainnet"]) { + this->heights["mainnet"] = (unsigned int) mainnet; + changed = true; + } + } + if(!this->heights.contains("stagenet")) { + this->heights["stagenet"] = (unsigned int) stagenet; + changed = true; + } + else { + if (stagenet > this->heights["stagenet"]) { + this->heights["stagenet"] = (unsigned int) stagenet; + changed = true; + } + } + + if(changed) + emit blockHeightWSUpdated(this->heights); + } + + else if(cmd == "nodes") { + this->onWSNodes(msg.value("data").toArray()); + } + + else if(cmd == "crypto_rates") { + QJsonArray crypto_rates = msg.value("data").toArray(); + AppContext::prices->cryptoPricesReceived(crypto_rates); + } + + else if(cmd == "fiat_rates") { + QJsonObject fiat_rates = msg.value("data").toObject(); + AppContext::prices->fiatPricesReceived(fiat_rates); + } +#if defined(XMRTO) + else if(cmd == "xmrto_rates") { + auto xmr_rates = msg.value("data").toObject(); + this->XMRTo->onRatesReceived(xmr_rates); + } +#endif + else if(cmd == "reddit") { + QJsonArray reddit_data = msg.value("data").toArray(); + this->onWSReddit(reddit_data); + } + + else if(cmd == "ccs") { + auto ccs_data = msg.value("data").toArray(); + this->onWSCCS(ccs_data); + } + + else if(cmd == "txFiatHistory") { + auto txFiatHistory_data = msg.value("data").toObject(); + AppContext::txFiatHistory->onWSData(txFiatHistory_data); + } +} + +void AppContext::onWSNodes(const QJsonArray &nodes) { + QList> l; + for (auto &&entry: nodes) { + auto obj = entry.toObject(); + auto nettype = obj.value("nettype"); + auto type = obj.value("type"); + + // filter remote node network types + if(nettype == "mainnet" && this->networkType != NetworkType::MAINNET) + continue; + if(nettype == "stagenet" && this->networkType != NetworkType::STAGENET) + continue; + if(nettype == "testnet" && this->networkType != NetworkType::TESTNET) + continue; + + if(type == "clearnet" && (this->isTails || this->isWhonix || this->isTorSocks)) + continue; + if(type == "tor" && (!(this->isTails || this->isWhonix || this->isTorSocks))) + continue; + + auto node = new FeatherNode( + obj.value("address").toString(), + (unsigned int)obj.value("height").toInt(), + obj.value("online").toBool()); + QSharedPointer r = QSharedPointer(node); + l.append(r); + } + this->nodes->onWSNodesReceived(l); +} + +void AppContext::onWSReddit(const QJsonArray& reddit_data) { + QList> l; + + for (auto &&entry: reddit_data) { + auto obj = entry.toObject(); + auto redditPost = new RedditPost( + obj.value("title").toString(), + obj.value("author").toString(), + obj.value("url").toString(), + obj.value("comments").toInt()); + QSharedPointer r = QSharedPointer(redditPost); + l.append(r); + } + + emit redditUpdated(l); +} + +void AppContext::onWSCCS(const QJsonArray &ccs_data) { + QList> l; + + + QStringList fonts = {"state", "address", "author", "date", + "title", "target_amount", "raised_amount", + "percentage_funded", "contributions"}; + + for (auto &&entry: ccs_data) { + auto obj = entry.toObject(); + auto c = QSharedPointer(new CCSEntry()); + + if (obj.value("state").toString() != "FUNDING-REQUIRED") + continue; + + c->state = obj.value("state").toString(); + c->address = obj.value("address").toString(); + c->author = obj.value("author").toString(); + c->date = obj.value("date").toString(); + c->title = obj.value("title").toString(); + c->url = obj.value("url").toString(); + c->target_amount = obj.value("target_amount").toDouble(); + c->raised_amount = obj.value("raised_amount").toDouble(); + c->percentage_funded = obj.value("percentage_funded").toDouble(); + c->contributions = obj.value("contributions").toInt(); + l.append(c); + } + + if(l.count() == 0) + emit ccsEmpty(); + + emit ccsUpdated(l); +} + +void AppContext::createConfigDirectory(const QString &dir) { + if(!Utils::dirExists(dir)) { + qDebug() << QString("Creating directory: %1").arg(dir); + if(!QDir().mkpath(dir)) + throw std::runtime_error("Could not create directory " + dir.toStdString()); + } + + QString config_dir_tor = QString("%1%2").arg(dir).arg("tor"); + if(!Utils::dirExists(config_dir_tor)) { + qDebug() << QString("Creating directory: %1").arg(config_dir_tor); + if (!QDir().mkpath(config_dir_tor)) + throw std::runtime_error("Could not create directory " + config_dir_tor.toStdString()); + } + + QString config_dir_tordata = QString("%1%2").arg(dir).arg("tor/data"); + if(!Utils::dirExists(config_dir_tordata)) { + qDebug() << QString("Creating directory: %1").arg(config_dir_tordata); + if (!QDir().mkpath(config_dir_tordata)) + throw std::runtime_error("Could not create directory " + config_dir_tordata.toStdString()); + } + + QString config_dir_torsocks = QString("%1%2").arg(dir).arg("torsocks"); + if(!Utils::dirExists(config_dir_torsocks)) { + qDebug() << QString("Creating directory: %1").arg(config_dir_torsocks); + if (!QDir().mkpath(config_dir_torsocks)) + throw std::runtime_error("Could not create directory " + config_dir_torsocks.toStdString()); + } +} + +void AppContext::createWallet(FeatherSeed seed, const QString &path, const QString &password) { + if(Utils::fileExists(path)) { + auto err = QString("Failed to write wallet to path: \"%1\"; file already exists.").arg(path); + qCritical() << err; + emit walletCreatedError(err); + return; + } + + this->currentWallet = seed.writeWallet(this->walletManager, this->networkType, path, password, this->kdfRounds); + if(this->currentWallet == nullptr) { + emit walletCreatedError("Failed to write wallet"); + return; + } + + this->currentWallet->setPassword(password); + this->currentWallet->store(); + this->walletPassword = password; + emit walletCreated(this->currentWallet); +} + +void AppContext::initRestoreHeights() { + restoreHeights[NetworkType::TESTNET] = new RestoreHeightLookup(NetworkType::TESTNET); + restoreHeights[NetworkType::STAGENET] = RestoreHeightLookup::fromFile(":/assets/restore_heights_monero_stagenet.txt", NetworkType::STAGENET); + restoreHeights[NetworkType::MAINNET] = RestoreHeightLookup::fromFile(":/assets/restore_heights_monero_mainnet.txt", NetworkType::MAINNET); +} + +void AppContext::onSetRestoreHeight(unsigned int height){ + auto seed = this->currentWallet->getCacheAttribute("feather.seed"); + if(!seed.isEmpty()) { + const auto msg = "This wallet has a 14 word mnemonic seed which has the restore height embedded."; + emit setRestoreHeightError(msg); + return; + } + + this->currentWallet->setWalletCreationHeight(height); + this->currentWallet->setPassword(this->walletPassword); // trigger .keys write + + // nuke wallet cache + const auto fn = this->currentWallet->path(); + this->walletManager->clearWalletCache(fn); + + emit customRestoreHeightSet(height); +} + +void AppContext::onOpenAliasResolve(const QString &openAlias) { + // @TODO: calling this freezes for about 1-2 seconds :/ + const auto result = this->walletManager->resolveOpenAlias(openAlias); + const auto spl = result.split("|"); + auto msg = QString(""); + if(spl.count() != 2) { + msg = "Internal error"; + emit openAliasResolveError(msg); + return; + } + + const auto &status = spl.at(0); + const auto &address = spl.at(1); + const auto valid = this->walletManager->addressValid(address, this->networkType); + if(status == "false"){ + if(valid){ + msg = "Address found, but the DNSSEC signatures could not be verified, so this address may be spoofed"; + emit openAliasResolveError(msg); + return; + } else { + msg = "No valid address found at this OpenAlias address, but the DNSSEC signatures could not be verified, so this may be spoofed"; + emit openAliasResolveError(msg); + return; + } + } else if(status != "true") { + msg = "Internal error"; + emit openAliasResolveError(msg); + return; + } + + if(valid){ + emit openAliasResolved(address, openAlias); + return; + } + + msg = QString("Address validation error."); + if(!address.isEmpty()) + msg += QString(" Perhaps it is of the wrong network type." + "\n\nOpenAlias: %1\nAddress: %2").arg(openAlias).arg(address); + emit openAliasResolveError(msg); +} + +void AppContext::donateBeg() { + if(this->networkType != NetworkType::Type::MAINNET) + return; + + auto donationCounter = config()->get(Config::donateBeg).toInt(); + if(donationCounter == -1) + return; // previously donated + + donationCounter += 1; + if (donationCounter % m_donationBoundary == 0) + emit donationNag(); + config()->set(Config::donateBeg, donationCounter); +} + +void AppContext::sorry() { + auto msg = "Unable to start Feather, error code 0xd34db33f. If this problem " + "persists, please contact Technical Support."; + QStringList paths = {"C:\\ProgramData\\ryo", this->homeDir + "/.ryo"}; + for(const QString &ryo: paths) + if(Utils::dirExists(ryo)) + throw std::runtime_error(msg); +} + +AppContext::~AppContext() { + this->walletClose(false); +} + +// ############################################## LIBWALLET QT ######################################################### + +void AppContext::onMoneySpent(const QString &txId, quint64 amount) { + auto amount_num = amount / AppContext::cdiv; + qDebug() << Q_FUNC_INFO << txId << " " << QString::number(amount_num); +} + +void AppContext::onMoneyReceived(const QString &txId, quint64 amount) { + // Incoming tx included in a block. + auto amount_num = amount / AppContext::cdiv; + qDebug() << Q_FUNC_INFO << txId << " " << QString::number(amount_num); +} + +void AppContext::onUnconfirmedMoneyReceived(const QString &txId, quint64 amount) { + // Incoming transaction in pool + auto amount_num = amount / AppContext::cdiv; + qDebug() << Q_FUNC_INFO << txId << " " << QString::number(amount_num); + + if(this->currentWallet->synchronized()) { + auto notify = QString("%1 XMR (pending)").arg(amount_num); + Utils::desktopNotify("Payment received", notify, 5000); + } +} + +void AppContext::onWalletUpdate() { + if (this->currentWallet->synchronized()) { + this->refreshModels(); + } + + this->updateBalance(); + this->storeWallet(); +} + +void AppContext::onWalletRefreshed() { + if (!this->refreshed) { + refreshModels(); + this->refreshed = true; + this->storeWallet(); + } + + this->currentWallet->refreshHeightAsync(); +} + +void AppContext::onWalletNewBlock(quint64 blockheight, quint64 targetHeight) { + this->syncStatusUpdated(blockheight, targetHeight); + + if (this->currentWallet->synchronized()) { + this->currentWallet->coins()->refreshUnlocked(); + this->currentWallet->history()->refresh(this->currentWallet->currentSubaddressAccount()); + // Todo: only refresh tx confirmations + } +} + +void AppContext::onHeightRefreshed(quint64 walletHeight, quint64 daemonHeight, quint64 targetHeight) { + qDebug() << Q_FUNC_INFO << walletHeight << daemonHeight << targetHeight; + + if (!this->currentWallet->connected()) + return; + + if (daemonHeight < targetHeight) { + emit blockchainSync(daemonHeight, targetHeight); + } + else { + this->syncStatusUpdated(walletHeight, daemonHeight); + } +} + +void AppContext::onTransactionCreated(PendingTransaction *tx, const QString &address, const QString &paymentId, quint32 mixin) { + if(address == this->featherDonationAddress) + this->featherDonationSending = true; + + // tx created, but not sent yet. ask user to verify first. + emit createTransactionSuccess(tx, address, mixin); + emit endTransaction(); +} + +void AppContext::onTransactionCommitted(bool status, PendingTransaction *tx, const QStringList& txid){ + this->currentWallet->history()->refresh(this->currentWallet->currentSubaddressAccount()); + this->currentWallet->coins()->refresh(this->currentWallet->currentSubaddressAccount()); + this->storeWallet(); + emit transactionCommitted(status, tx, txid); + + // this tx was a donation to Feather, stop our nagging + if(this->featherDonationSending) { + this->featherDonationSending = false; + config()->set(Config::donateBeg, -1); + } +} + +void AppContext::onConnectionStatusChanged(int status) { + +} + +void AppContext::storeWallet() { + if (m_storeTimer->isActive()) + return; + + m_storeTimer->start(60000); +} + +void AppContext::updateBalance() { + if(!this->currentWallet) + throw std::runtime_error("this should not happen, ever"); + + AppContext::balance = this->currentWallet->balance() / AppContext::cdiv; + auto balance_str = QString::number(balance); + + double unlocked = this->currentWallet->unlockedBalance() / AppContext::cdiv; + auto unlocked_str = QString::number(unlocked); + + emit balanceUpdated(balance, unlocked, balance_str, unlocked_str); +} + +void AppContext::syncStatusUpdated(quint64 height, quint64 target) { + if (height < (target - 1)) { + emit refreshSync(height, target); + } + else { + this->updateBalance(); + emit synchronized(); + } +} + +void AppContext::refreshModels() { + if (!this->currentWallet) + return; + + this->currentWallet->history()->refresh(this->currentWallet->currentSubaddressAccount()); + this->currentWallet->subaddress()->refresh(this->currentWallet->currentSubaddressAccount()); + this->currentWallet->coins()->refresh(this->currentWallet->currentSubaddressAccount()); + // Todo: set timer for refreshes +} diff --git a/src/appcontext.h b/src/appcontext.h new file mode 100644 index 0000000..fe8ccf1 --- /dev/null +++ b/src/appcontext.h @@ -0,0 +1,172 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_APPCONTEXT_H +#define FEATHER_APPCONTEXT_H + +#include +#include +#include +#include + +#include "utils/tails.h" +#include "utils/prices.h" +#include "utils/networking.h" +#include "utils/tor.h" +#include "utils/xmrto.h" +#include "utils/wsclient.h" +#include "utils/txfiathistory.h" +#include "widgets/RedditPost.h" +#include "widgets/CCSEntry.h" +#include "utils/seeds.h" +#include "utils/nodes.h" + +#include "libwalletqt/WalletManager.h" +#include "utils/keysfiles.h" +#include "PendingTransaction.h" + +#define SUBADDRESS_LOOKAHEAD_MINOR 200 + + +class AppContext : public QObject +{ +Q_OBJECT + +public: + explicit AppContext(QCommandLineParser *cmdargs); + ~AppContext(); + bool isTails = false; + bool isWhonix = false; + bool isDebug = false; + const QString featherDonationAddress = "47ntfT2Z5384zku39pTM6hGcnLnvpRYW2Azm87GiAAH2bcTidtq278TL6HmwyL8yjMeERqGEBs3cqC8vvHPJd1cWQrGC65f"; + const int featherDonationAmount = 50; // euro + bool featherDonationSending = false; + + QCommandLineParser *cmdargs; + + QString coinName = "monero"; + bool isTorSocks = false; + QString homeDir; + QString accountName; + QString configRoot; + QString configDirectory; + QString defaultWalletDir; + QString defaultWalletDirRoot; + QString tmpTxDescription; + + QString walletPath; + QString walletPassword = ""; + NetworkType::Type networkType; + + QString applicationPath; + + static void createConfigDirectory(const QString &dir) ; + + QMap heights; + QMap restoreHeights; + const unsigned int kdfRounds = 1; + PendingTransaction::Priority tx_priority = PendingTransaction::Priority::Priority_Low; + quint32 tx_mixin = static_cast(10); + static constexpr const double cdiv = 1e12; + + QNetworkAccessManager *network; + QNetworkAccessManager *networkClearnet; + QNetworkProxy *networkProxy; + + Tor *tor; + WSClient *ws; + XmrTo *XMRTo; + Nodes *nodes; + static Prices *prices; + static WalletKeysFilesModel *wallets; + static double balance; + static QMap txDescriptionCache; + static TxFiatHistory *txFiatHistory; + + // libwalletqt + unsigned int blockHeight = 0; + bool refreshed = false; + WalletManager *walletManager; + Wallet *currentWallet = nullptr; + void createWallet(FeatherSeed seed, const QString &path, const QString &password); + void syncStatusUpdated(quint64 height, quint64 target); + void updateBalance(); + void initTor(); + void initRestoreHeights(); + void initWS(); + void donateBeg(); + void walletClose(bool emitClosedSignal = true); + void storeWallet(); + void refreshModels(); + +public slots: + void onOpenWallet(const QString& path, const QString &password); + void onCreateTransaction(const QString &address, const double amount, const QString &description, bool all); + void onCreateTransaction(XmrToOrder *order); + void onCancelTransaction(PendingTransaction *tx, const QString &address); + void onSweepOutput(const QString &keyImage, QString address, bool churn, int outputs) const; + void onCreateTransactionError(const QString &msg); + void onOpenAliasResolve(const QString &openAlias); + void onSetRestoreHeight(unsigned int height); + void onPreferredFiatCurrencyChanged(const QString &symbol); + +private slots: + void onWSNodes(const QJsonArray &nodes); + void onWSMessage(const QJsonObject& msg); + void onWSCCS(const QJsonArray &ccs_data); + void onWSReddit(const QJsonArray& reddit_data); + + void onMoneySpent(const QString &txId, quint64 amount); + void onMoneyReceived(const QString &txId, quint64 amount); + void onUnconfirmedMoneyReceived(const QString &txId, quint64 amount); + void onWalletUpdate(); + void onWalletRefreshed(); + void onWalletOpened(Wallet *wallet); + void onWalletNewBlock(quint64 blockheight, quint64 targetHeight); + void onHeightRefreshed(quint64 walletHeight, quint64 daemonHeight, quint64 targetHeight); + void onTransactionCreated(PendingTransaction *tx, const QString &address, const QString &paymentId, quint32 mixin); + void onTransactionCommitted(bool status, PendingTransaction *t, const QStringList& txid); + void onConnectionStatusChanged(int status); + +signals: + void balanceUpdated(double balance, double unlocked, QString balance_str, QString unlocked_str); + void blockchainSync(int height, int target); + void refreshSync(int height, int target); + void synchronized(); + void blockHeightWSUpdated(QMap heights); + void walletSynchronized(); + void walletOpened(); + void walletClosed(); + void walletCreatedError(const QString &msg); + void walletCreated(Wallet *wallet); + void walletOpenedError(QString msg); + void walletOpenPasswordNeeded(bool invalidPassword); + void transactionCommitted(bool status, PendingTransaction *tx, const QStringList& txid); + void createTransactionError(QString message); + void createTransactionCancelled(QString address, double amount); + void createTransactionSuccess(PendingTransaction *tx, const QString &address, const quint32 &mixin); + void redditUpdated(QList> &posts); + void nodesUpdated(QList> &nodes); + void ccsUpdated(QList> &entries); + void nodeSourceChanged(NodeSource nodeSource); + void setCustomNodes(QList nodes); + void ccsEmpty(); + void openAliasResolveError(const QString &msg); + void openAliasResolved(const QString &address, const QString &openAlias); + void setRestoreHeightError(const QString &msg); + void customRestoreHeightSet(unsigned int height); + void closeApplication(); + void donationNag(); + void initiateTransaction(); + void endTransaction(); + void walletClosing(); + +private: + void sorry(); + const unsigned int m_donationBoundary = 15; + UtilsNetworking *m_utilsNetworkingNodes; + QTimer *m_storeTimer = new QTimer(this); + QUrl m_wsUrl = QUrl(QStringLiteral("ws://6wku2m4zrv6j666crlo7lzofv6ud6enzllyhou3ijeigpukymi37caad.onion/ws")); +}; + +#endif //FEATHER_APPCONTEXT_H diff --git a/src/assets.qrc b/src/assets.qrc new file mode 100644 index 0000000..2fa1f64 --- /dev/null +++ b/src/assets.qrc @@ -0,0 +1,100 @@ + + + assets/about.txt + assets/ack.txt + assets/contributors.txt + assets/feather.desktop + assets/images/appicons/32x32.png + assets/images/appicons/48x48.png + assets/images/appicons/64x64.png + assets/images/appicons/96x96.png + assets/images/appicons/128x128.png + assets/images/appicons/256x256.png + assets/images/arrow.svg + assets/images/bitcoin.png + assets/images/camera_dark.png + assets/images/camera_white.png + assets/images/clock1.png + assets/images/clock2.png + assets/images/clock3.png + assets/images/clock4.png + assets/images/clock5.png + assets/images/coins.png + assets/images/coldcard.png + assets/images/coldcard_unpaired.png + assets/images/confirmed.png + assets/images/confirmed.svg + assets/images/connect.svg + assets/images/copy.png + assets/images/cutexmrfox.png + assets/images/edit.png + assets/images/exchange.png + assets/images/expired.png + assets/images/eye1.png + assets/images/feather.png + assets/images/file.png + assets/images/ghost.png + assets/images/history.png + assets/images/info.png + assets/images/key.png + assets/images/ledger.png + assets/images/ledger_unpaired.png + assets/images/lightning.png + assets/images/lock.png + assets/images/lock.svg + assets/images/microphone.png + assets/images/network.png + assets/images/offline_tx.png + assets/images/person.svg + assets/images/photos/1.png + assets/images/preferences.png + assets/images/preferences.svg + assets/images/qrcode.png + assets/images/qrcode_white.png + assets/images/revealer_c.png + assets/images/revealer.png + assets/images/seal.png + assets/images/seed.png + assets/images/speaker.png + assets/images/status_connected_fork.png + assets/images/status_connected.png + assets/images/status_connected_proxy_fork.png + assets/images/status_connected_proxy.png + assets/images/status_connected_proxy.svg + assets/images/status_connected.svg + assets/images/status_disconnected.png + assets/images/status_disconnected.svg + assets/images/status_lagging_fork.png + assets/images/status_lagging.png + assets/images/status_lagging.svg + assets/images/status_waiting.png + assets/images/status_waiting.svg + assets/images/tab_addresses.png + assets/images/tab_coins.png + assets/images/tab_console.png + assets/images/tab_contacts.png + assets/images/tab_history.png + assets/images/tab_home.png + assets/images/tab_party.png + assets/images/tab_receive.png + assets/images/tab_send.png + assets/images/terminal.png + assets/images/tor_logo_disabled.png + assets/images/tor_logo.png + assets/images/trezor.png + assets/images/trezor_unpaired.png + assets/images/unconfirmed.png + assets/images/unlock.png + assets/images/unlock.svg + assets/images/unpaid.png + assets/images/update.png + assets/images/warning.png + assets/images/xmrto_big.png + assets/images/xmrto.png + assets/images/zoom.png + assets/mnemonic_25_english.txt + assets/restore_heights_monero_mainnet.txt + assets/restore_heights_monero_stagenet.txt + assets/user_agents.txt + + diff --git a/src/assets/about.txt b/src/assets/about.txt new file mode 100644 index 0000000..ac20d39 --- /dev/null +++ b/src/assets/about.txt @@ -0,0 +1,33 @@ +Feather () + +https://featherwallet.org + +Created by dsc , tobtoht , and contributors. + +Copyright (c) 2020-, The Monero Project + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are +permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of + conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list + of conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be + used to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/assets/ack.txt b/src/assets/ack.txt new file mode 100644 index 0000000..bb21a5b --- /dev/null +++ b/src/assets/ack.txt @@ -0,0 +1,10 @@ +Feather uses monero-seed written by Tevador, for 14 word mnemonic seeds. + +Initial CMake support for the Monero GUI was coded by TheCharlatan/xiphon. + +The wallet UI is heavily inspired by Electrum. We would like to recognize Thomas Voegtlin for his pioneering work on Bitcoin. + +Huge thanks to nioc, fluffypony, wowario, thrmo for help during development. + +Some more shoutouts for people for hosting nodes and/or having good ideas: +dnale0r, dEBRUYNE, binaryFate, lza_menace, jwinterm, kico, wowario diff --git a/src/assets/contributors.txt b/src/assets/contributors.txt new file mode 100644 index 0000000..251d72c --- /dev/null +++ b/src/assets/contributors.txt @@ -0,0 +1,5 @@ +dsc +tobtoht +selsta +Diego Salazar +Matt Smith \ No newline at end of file diff --git a/src/assets/feather.desktop b/src/assets/feather.desktop new file mode 100644 index 0000000..56a851c --- /dev/null +++ b/src/assets/feather.desktop @@ -0,0 +1,14 @@ +[Desktop Entry] +Comment=Lightweight Monero Wallet +Exec=feather +GenericName[en_US]=Monero Wallet +GenericName=Monero Wallet +Icon=feather +Name[en_US]=Feather +Name=Feather +Categories=Finance;Network; +StartupNotify=false +StartupWMClass=feather +Terminal=false +Type=Application +MimeType=x-scheme-handler/monero; diff --git a/src/assets/images/appicons/128x128.png b/src/assets/images/appicons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..496896ce1e8ff1601439899d7bb540360d81096b GIT binary patch literal 11725 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 F{|B2wM@|3$ literal 0 HcmV?d00001 diff --git a/src/assets/images/appicons/256x256.png b/src/assets/images/appicons/256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..bbc3ddca08fffa41f95d0237354098a82c7478ed GIT binary patch literal 19715 zcmcdx1y>!<&)$o>UfdmuI}~?!io1Jpmy5d=in|wgio2EK1&T|NLUH#$zxPADdv;Iu zoY~|&nPij6WTI7-Wl)g_kpKWdm6MfJ2LRCfD+oYB<7a3BQ%d)5G=>zWj=hwg|MB|{K$F+bU zA|Iu$vT3|uJyTi!Mu7r_dv()G)A^mPBA?CPI%e7gf(+UIP9^gikKWWFm)<`J`oFBk z*Iik?ntn8X+a%dsvJB{XeCc(g!Y_C31{*emQw}~a8O|NNRZia@YwQ*zA)UF|J;yUV zyZl?L3%RRWet5X?dE^IAE!9CEota(V_|OLtcj6V2$$$epuT+dviNC#F9E>in&!4qS z|Ff!<{MJz?7mz*SHyRwqS?;B`*LD%K9pKj+x;X{rB@nQ1yXZ8;r@;D61cF~V4Ab}4HLra?EXT0!8#+Phm79oB= z*P$H7+UCm-Rkf{;g!WDo)(3{3>yCFqw}KZX5>NTQSpqL{oXq&87QbUY*)KXScP*?a z@ou^vJGO1Q9Nbk0Sl%2|hi_V*PB-E9G?vBfc^N!0+xxGrv?;*!%c)I`=}ZR4@mfMc z5+*XwC=Mzn8LR^(vx+1eabr^4LO7)1n!IQamym$u=&T0lO%(!e!S zPDpUNZgy0djzYmCv0-7)rZlCn#h`0zoge?cZA_#uH))fSes{p zK{b?-1SwK_dt%LUT2rP(@PO@G*$iL&P8p)VYiHTQ^pqoKzS%33sU=IiKegT}MScKkBShv65b-{-glXZb2ZCVJpL{8w;mH ze1Td&o6#2X=ka)PF4pR?S(@qWzvtqDmp!xc_}_^itXI_!v(CS~lerpY*`T)w6P6RD0H`E}~nZaysH z$b8QBp~T>ctE3t^g$nglrm0!uS#wj6EGIyOkF`^5OU8B{OE$fqf10fe!O))O4b@@% z^VPM+7HoNDhcVc8T%M-?!RwB{&6Mb4*|&&e+k{omdSsJHzn!euA2_ta-)|aZ3o8AQ z5;K3Ud=~UqsR=_^hUB08!Ed!MR+ltacfyI9D_LA8G>6MrWGDY>`$;95*4H7o4<8=- zEMGFO>nf=CsZ!;0z^dL2N_<%@FRe}fAx{t!jVS*LY~hbCAFXJ_pTV?QtRFV}Jf zaae6Cl+jtEDmp&-efa1339+UM2o9s?D^6ORZHXF*0jkdaP&3Q=d(`T&yueARYgb?< zg^+HB&t5q_YHyhjEu~7m9&Gw}^a=x7)MQJC6BS(faOjsGB?K)BW(sp@f4tzTZ}WT; zmiS$o>p1pV;%A$0%{;_mNjMp-z>N^Ww#SoIm3`ao%FuzmQ`FDss+mpjDTEp>X zwBM*0KYtTLcNO>r|J&IA2V?dT0cm{iQ^)-uu&fESha)uWwZl*Bot4BnAWd2Q(FDB;uqQ6zqRzTwL)_81=V4F z)6Zj5BnrzaH(CqYczCUbj6QgE1Mw5avYV*)C)Pa2Cpco5t&pPSS4a{J1s(FkOzLDA zlOFyN5Yd__Y2i?NoXzbHgab!?kxgww2hbRn`|uTpj5A@hY@m4*oUE;7Da~Nj4;D2; zI2bU0Ow>Wm7V(yw5A7cY)VKGAB8$JnAMV}7C@Bfc!VVGt-5F^nd;_>42z-LZ7^XSc zStt1DF#X?4vvPkEr*ufL*}KXM#G!klBWPt2T|j^7Bi` z0RDI$?ax~6WuQ+LZqAIrO{)GR-=XjuLVlSi^w$xU#liYa;BnY?fZ$a)>CW?s;DA%vByW>w+c4e=X!uzD6{h1R_#2{ zj=PI`e3%v`*cohgIbFeC5#)RX#S`2aYMDOmzh}@8EFX8H2}*h$BY=Mn^Cn_;W~E2# z?&$2x52A?3Q1Nx5LjC7U+nT|4^za@HEIST$*Xj$;z%qdWN)nwF=bV(GjeU|=MszF; zH!dQzSgknaHC0+-c|qR_8Qy8y{>WBsux6DKqo^vIhV+POayCEU9)~0G3l?p@%)N6& z!9e9V=%L5b$%WF2qqUjuFDkv{si_%;Fx;!0fu?jLpn9x#G7ct zYD|WJhEW8A0ZMF=21=-tw9TT=^!TaZO1z?Q894eUUc|$@4R|={{v@m@-ZCW<W7*saqN0VBB^Q6*Q~jgk@g6q67P5u!8b5%EQf>Q=V3X{)=z}*k_%a2Um;U* zazWD4L`j_tK-SE_%!cNNh)esjlxRvqvGYXUbFmVXKrJ6R^K+N*@QUkj#J4-2+{-1Q z@eq)CF*Ux9({=W4gr#@g}8prFipW)M) z0~a3Oz(Bi>+%P!r=?!5)Tu3-{reiz9Pao?bW6xmq5c z{bzmd>sJ4iy{ErVhtINsCPAui)s8nkvX&=<2Ykx3=3GqIp>dnLJm%xF}P|b zY{b4MIDXED*o^`t=)W8YM^y80zJc&f^yu*jGjr>WvEmv=4a^egng2v@6EIkXM3li0 zW>F*CL@R(q3o0yW59zYSS zrV(@_jFpCjXQM5SlQ8?J=64leL9Y@++vcEXrc%wFx&ph$6B z8MGcr(@Wf#K{5F^R^q684{{4<)DZJez_G2d_*@oca_a+cEh&cGQ* zIvfL5K8{T;6B$D%PS;9J;??#DAs6*#`rRALbt1}a72Sj#f%-T0u&~osMOYcVm;uc~ zN`qY8Xzfcx=4I~?ZbUh!OPVYXFFZknpkhTOGqfl(CW52M{f8qdMpZI+w7>XXgG;k5 z7!P0WQ_7bu8Y2dH=O()9W!T`qAG>3fAt}tY1Om}x;O)WhsIO$p%PYf*&~$8UU1=z2 zcorrJts{p;hUTZcHtU!KurV{5rgm~G&DGr*m@R%EXW-R~jHhI}zv>WMXqVLd^Og59 zfXdt%t=i^z!O{U!Mk1GmDB3Rwplws-`MDAzIZ z$DqUsmP;-UXN^ROJ7yt1-ur}~jy4D_H ztjz*ktzu}07n(y&#b}aAF1E3_1_K{lyxUhMy3fq--&XO6(x$4-7KKHPamI^J2qTDy z<>?t~G#JBzf*hN_ug%a%!Nr$RTa!$QD>?rC8U3dKGN*h37gHu*aWzUPsxv)Xj55?T z*9)e8mH&|eeF$G_gTef}*{nYAtC(>kUY0>s3~JkNshh9TKm)v#e2b19>2TRbB-;=* zg9gllRbq{3%j`sFSS2rxQr9`J+=|CM)6ESj=Ew@wX2%b`kRL-vHo?rkC#)S|B2Csk z+9f?zwZ%6YsUNN*LPfRgJW#6(wQfC9>JJl*8hl?Ut7#n~1`_e*xDRYpHa`9N00Y5i z6Kt?+u=|@Bku95ne;7EFV1wk8oYmNtTH--gOP(Ll;9$a3YNj{(UqBx!?)bLVsM=tn zJ{a5gL2nhR5hBL50jRP_*2k-TGW^uxO5rvG?GAP;t^3rfmf~N4FvV;m>!faxS_y?E zXf}jEEJ+guZ>*6Ur9I&+X_)Jj4x;JOqv}5V!-#4)i5Ra&wWo`adQ3T}oh{w`11T6w zI&5b+2`yCdvm{{-YL3nvOC-k8MNWpP|B z#zLi-1ou4(v226^N4|oc(;e6)#hIlVnl_0iLM(JqNn4PdtsjVXD1?JjgP8Jax)2px zcJ4z=&0!`=b(^$7y@8%YGE#ym(p0tVTKOn*WDvY1wI;v+fbPm5-} zWuBVw5pDQl(YiG&SclK(3qHcw%n{-~+$oyi(p%j`WP{ zT!-3+HMCK$slT*u+QL1tYof279dGn}(tZ;*DhwGF z5rnl8PbS=)@U_l&L2`Jq8y|5al5&;HQk=d9*TLbWE?Kt&vvWCM>};FHilik8qeQRo zAP0w%0@XcO*dEq#tlA~0Z=_XY;RQcoQWGjkIx(_w>o<1`B)0lW@5o!hUS)5<)gad< zI1tO)RUmtLhJ7V;5@WuQZd>WNSt~GjR(*TCuJ;B5iUevoElW+^**wob4K=k~pv+Y^haDiiEW@;**=Fvl8%*<@y7YDrq&PV8 z3PkV9rIHpR|9*{*``uBtS4Xk4-rw(;& ze@tY8WxbBy??!RPHhKm--$^J9?wG2-fAxrwqowkpqX}q&(?W@pnCdB@B$6o+rR;M! zjH077bYMY=siM$S(sZvEG*|w&-{>#b{|GUgWtQOcAPla@l7^({%|9Ar7T5+zOCs^2 z!K0q)f>f9@6>G+kfcS3~sfJ~?C<`WIwrs>5xQ1*)v9dE?n-flNOhnyfjwj&nbP~0a zL#fpZV}?@ka0rVKwb7N*Oo1ZAKUO%noA4iy6&Wrm-}?6_(d*33C}#XzLi-yTcLYR~ zeN_ufW1`mX$^@s97P@~cklL5t-iGtzEO1e``~ahdR6A5j+2dVy>aZIyU7gcpUc&{K z|0sl49wZ*pa~WET?kT!J6z3|pj{2IHwY((S7(>F}uFl+6C(o}_FrM^5jg;&QyIQcz zSP`p@=uApMs=^(77~gO|xyv9lL3cTMwcZrKM3|o_I5NR2J8}h(td%cs;FJjJ=))l98*g8$=ITdDl+P%p`6I2KXZ;eKmi7 zjCq`7TO%ZDDTTh)J7~2``E@i`lirpvh4JJ@RINB;+?k(EEr@e1N>y20Gbg+X?gisf zPUwvmAIPHbVBJu`jecDYqh3<`a(X(^w%bWub0CX@N+1)tC| z>C0CiPQ}luEhR{C7Bt$FMh z>6-i@c?ba%xflsKJ-f!MzBRP4(*&#|TzJ$FS`e)ZndNT?$mG5vV7CUvo!?yso()TTTI5Pzq$#?pGJxFv0y%R)dSzR{(V4?c&0eP2-cme=9ASWrN>AiB2 z>*a0m>*B80?X+9JrOHmOwvm}vaderQ0;1u}q!5PIe{Cj@WhVYX1%cujOO`GPY8j%0 z$eg4~z1oKyM(r-ndMeerS8LXi=6RNRmuN_28(WjsDwj8Xbq`v1Y|DAb%j9>P0>Ox3 z{D0j5Ab*3$k_9J4n+c!*C=oS|t=Vnj#+|xO?c^x@ARV?r4(3K{`txz}JkSU}hCe3A z24u>JUj_K)2lHlLG*~qoKH@eBLW$v*K-JrPtREKIk0MD(*$kcBRSD8^8(bh|;_pA3UA>2iDE_GW@{kl-krH*LMSRIuJa7*XEFY3CDVRrrF$tQ< zx+#FcXlGQ+Ub!Ka_c~0u%j=`=Wd;m|5Wd{#3#SSFKsPxt4v)PE5C5fKclj@8Q->u_ z{I&Jff#@jNo8e$%x{(LI7nJ>OhWjq!K=<4st%) zt*=UFWBqULK(ft3n?&vN-y%5E5~}2ibUVEaJG`d?5mWktp=+1RFciq7eMNuSaJHQ= zJ`Au36<~x>inQwV7@awC8sHNxBZZrg&7(IjNst%uu@<3(X&~@DET}E`Psr-s{IOcT zM1ZA`AO#pcqJ>RM5uH`^>3O?2UCoueb{$Js9mcHPM{&Z0!@$4Gwm0;y7Ok7@d)er4b=V zfW`x)#^AS?r%@7jMpjw;@Mt}`M|?r2+x6p_WeNy>FlzASA@^jG&tp60HUlBHmj$qe zn^2-*e}NcZLPN?CkJ@mm3FKwV_PKr7e-bb#7|L`zyg9T1pJ& zvd6>zT88-Lfk1}X5Nif*V1rErH6m=G3RD4jFW7nPb>}Uw{UkSI`4`yjdA@lc%1k1J zPkak*`(x?(+ztVkG-)q6RDBSwIoV*)(**1g5$5tvR#N{D1wQNxddfhXS(Hl!Yz#@@ z7LhF4$PMlhS3I&CvTV>-UV91Bf=6Q#JWQUr521XW@17q|wR*ST(00ywP{QF^`sfu@ z7AhSf#}VuhcF0&1Xxl(yTR%22wX1*}3S%%@Mk3hRxv~3=)ZmsyF+qdmKDv{b;?nA( z@eYmX1I8N^+G`FMtQZXWiXxaFK&j{?U2TAKO2}ns9~Ywdk>2CAJfqMj6l<*-%>^$8 zQ_vQjS||fjHI@d7T#jfJ(f-AKL8g~dwe;eum7#aWzxS@Hno2BoLyRb$vuwAH{L18nMKRv{u59g%UR#?YyUvHWiii%0{5@;jD2CtI zjtfN-{ri+6f_H<2KM_WdLjjb8`QOM0Npwh>JWc2_bq*>ggIDW$$+jql@3ii1!njbk zA-E8ta;Ql`&w_VtnbspJbM?&=>YQw5 z1yO7t(?obU>IuU=wd>5+ElkqNT}7ZI2rxrQA0T%0ud@O3mODw#5G06Y3gXB)>2@C^ zzJE(u@x&pDzh^`ZqUGj|b?Un!0fO58s8yloT)~C44S)eFJ~7#cWpAG)JCr5?KN95R z0i#&~%#-`?R033ZUoVbZ24?V>rP}O5e&|u86)Q7rjoqgCJ(@ZJ2RK)cB z0O{8$vMKaMa|17hvrU-u25U{NGGw|5_&DZ?V)3>?YN;SD9Hn$xDq?be$TaO}i5U!e zYmlYlsSbRsN8N5G3LVdPy3#E?IAH^wtb-wh%{(rIJx2Arx{p;Aidpe&*FpgKNz-mu zA+rk}#>?`j2&XiWzRzSCR(t%4ajcg`>DQP_YVyoF9#+XQgv1&|M7zHsDK#*CwyP(9^&N(GXVU4)* z^O9-krEkcLOz>+%;sWF`*%H4z$Ty1`Hk^VU@KS~r^}~fy3XA$+Oz}_OS(r677doX<5323U|`A38TYf+f+arkj%GZ5lo8G%HrJS~ zyZdWMV+1e#@YEiRp@x|3>wJ?r+?bNY)(itdp$B}nJ(UTfJ$^t{u?sG29B067Q>nnZ z!{HuX@S$kp?om`$(R|b-u_vvPT)t+sjJgwiN+mL5dXJ<&V9U+u6}RV}IV63!KSmU6z{LRZanCLDlk1i#5>{BD2> zTwg!dNdgPsD$CkEu%%bBHBhs*$o0O^!N{knCsu##Y&XctV#^SRfGq&^FOv1{jA+ME zxpeijm!?%!pEV*-DHTcg6%^*`&?(tIC3gh9_E(|`#g=p*PbSo)%}NU$EOc!wHh z^Da(Vm13-W%FMq3Pq;j@C0kLFF6-;VDC)u2?72T-Vp||pMo6szzg$SX#LChT6WQW7 zrs_+@Xeyrk7sFGpLN3-$I`j53dCjySSffi^{HxG>^703jFnJXwnU6PbH!t1lsA zm(gI@M!r5@wCBgrGL*_VwDBid(6U>X<3W2E`d6ZYk44Irm?Cf{GgW z6NOFad9atkr2K%ghN*fqdc;KS1Cex{|F_Uom&j7KtNEs@(i_C@48T$kI^c~o#th5$ zZhNmGWr7W-_J$2NRn~OBcQ$3tPCp+EOcW}sk^vRTpsSC98l?}2{0sn4kZA-}|5ewG zCD++yNl)=GCYR$mxys?pqR>T(^iOAF{%1~9s$`Bh)sk1Epbh6}*swJ)WYNh9em-|Q z&iB+t)LSGN=lp1c5z*_*0K5;j+R+b*@2pQmvG@@nbvxtJeoghG?Z>M~1t#)8d4T_c z5G2?S>EaX= zZX0&S8}63~dMaTOVi|-+)YMIm3#u^r^OClC$i-Ld`1*(a2)#t%PRLZ%JX|Z`Hd`AC zk#+M%#7?dKN|}r{TuPk3H$>!N4jIXfUTP|R$kt!gvYVADsB*RPbp%6czwGb=_tA09 zA0U+oMv>9}>9D;&!j?Ep2~*E4vYW};Je8%9?|6EO>|;o8AS1{C@SBq97$H;PTmeoI2O zg`S|FN`~~**k`LfMx$+w;aC~?wp`XFcPg_ecJLrK+1aYitex84mt9ZWQt?|M0MPMA z!NIs70%*~Okn2%kd*{R6C7p3?H^hO`|E;Lr`0fM143r!IQT%uZNo-1~nk1ti?Myh(8KGtj9xDQ=Q+;zStm%#9rUDV>q}s0xWv-+Pn^a>=XI{M7T; z|MhCUW|eG}BL34@BRl}yDMccN2Zg9Am6&0Lgq=$g_x=cZM|{Ax-KsgFwe!Hmg@p`N zZ1xTJTa8uDp#h@2%co*XU0Z#@aZMzORipCEsu97Ndhx8PBo9zj7?eizJvYQ(p20N} z?wJMoK^eOTe0%hAnIq;+%LdCD_N-Qmw)w0+YelbhjU1TT?R3uV^6ib6m%o^}YeU#gosq9C{w75pJbB|REL)7@82B-|F zW~u`i++OBwpSQXCHpsGNC0lL|5-U<^87zNH()_lEYQ5ZQ7@P!NtOEay@b9l6D?cP7L{?o+FMG5}$3Cp@0Ra|=8=g&*#> zaqnwF~2QdL%*n8ZYkDXBx_0_<6cX3m03#@4neC6tCYf8uDH7XWcJ;4r^awBKr0YJw6 z-H4M_0BVN5+l_dli$fpY4;QiB(qfAb z4M{%l%W|uCTX)gQ>IK8xv zS4Mq9(I`Ed)UP{7d~lR)SHz`Z0f1I;ae1ox0GfF07c$EyCBDty0ON$3t$Fwp6b}0_ z;=bgfNZ}LN@nMqsl~O6GO`bM|d6>A>JEOSR3zGe-0*moAOcTg@NDj%#92*_(!|c>4 zX}6=3&%)xXHW4jGZe{8>$DS_n2>7rUuCHA6kNzymePJ?QEo@g_NfH7m zqekr`(FwmYOowXQuS8bkE!VO8Q}r1=&PHDn%kjUYs!#jnYW?IPpupgu0RWTLM;faD zZ5HD$DTem@R*y@}*45SglP!Rk6j1uYE zzY=f;rTpOSlK@S6)bvMHxSGP9TND7F;iO9g48A;Cj0UVa()X9Imn@KhXC0NUM!ZXY zBisI;KP=Z;S-m(yI$a-V!GwI8eG(+Y_Z5r*pF9IK}gtN?(~_+VW9F#X+q*01rY%yyuWN#|>La)Oq@*ERyDqxDUAF`Wgqh+qAt zwja}bJ}K))$j_F}GtF}u9X;NL6?+f{@~q9=WpFU{8ZkCg~|lNx4vWr7MZSAXx!V+1{ziUNQ7UFBNoI z$(OuOZROg$clcd5nf-U=A&CI-?n>CaffBoPn*@>0vR<&X0BbQigVbq|AaTip3Ti2- zQjhUT}2^m($!z%dd8srG7FTAsDGVpbf#_AVpHym zheR_Km(`<)3CrSzEv@0hHM=uqhR`V+Jun-8o!_w64kef(Z$eB7H)pQO$9VQAfxi?( z&xoAH@I(LBFEaaOEDz&R@cj*zvK?}c3?t2}r!tnluA;4N@{p2ryIWWH3*JODLo>N(hAERa_5BqTEL&$*9<)sE|b2|b3(5C z?YGKKx!flRT;HhpNN|b25`3lGKj?p)i-@numKJ8YLXZU1Cp*5E4l2$2hDVK{MiBif zGi+~b!OCAr$XF`V&&|kg!>t9!LM-XqNiwq&XC#2zKd_6z4`!!mJ=L$2`k1l^N#cZF zpEsfQ8IuRGBYacJq1wmV(9)#Y_FLLQoCN21NI|XYEWqy*QX69MujIiF>FIojnD0?Q zNt|tq=op&NwB8#Ue@C1SSKzN;g{wu=>KL40-v2nYGC45ubxwjrqV>Os8qweQaV)&} z|4cPwCqM+LPeiyycBU16#hOJ7-7Di>@o8`JAm%w*R(6T_744>ufyRddn@-h~TRX_H z?XL5L6_wccNLlj`G~(E(+u#i_6zqJ~|5$iqX|lnioJ#Cg_kn>P`<7Kh7wghf=8Hz()0C0U7@NIT*n|+gSq>8-t zLpH<1r!Dj|4eW2D6m+<)2{Ki<~rX}xOL z5z-GHKZth=nU27GW@K@x9+ITef;no57HLZuE>qoptrO8`d1KH300>AuJ!C=Qd7VLK zWiyZdD-A#7waL?oLAUG%o3evJdzu}yW+nb$*38yj?pcRa=Hl@W2lhMCJ_<3tOB5r-GJP(9Y^!imdO z*`*!{&pY88_znyHwQJRJE5ZzgAsu=nG2@T=;_|@4&WQ;LR111N$D+KU#3aeO;!PSL zy(ax~YKE-RoH!WN(e3hVxrO3ImEiU{Y}Q=eqRjryd;onOBESt*Psj5Ju4c7d4OCk1 zk*`*A1;*L;gP8?%kFWZ=IIVZzgx=b{U`|TNr><+o(%ih_CRPB_W2S+5$KBasD^?J` z-a0Y~Olcn7;B#J{$Zsq+Y>;f0YLdvzWatNm_N9Vx=@u`NDR=JvC@SJMW&0G%GB^r)gQE`aH73d%}#WqufR=pP=r3lAfJIo7;>Rj}I z&E4f6a~)eqMtU#7?%Ij2kjlKObLU*UF#Q!Ao3ZWcZPWeBmGsiCePeMI4wOKCvx7EArBkU@BFNw)C`1~wRU z$a!;+_9RQ7f;~Ig?>pEQhE!kS=)RU2hKqmjsCQ1YiJMUp`3(rmEmDho#Up*Qq;RZj zuI-RvQga2KtS3YD^{M3g#q_;}*BnOLp6#8(2%>zL5e5QkVB32epd4GNuISSF%X11A zTvV@(H3-}u5_}pFDiK7DrA&TU)!bx;+CDmSJ$!@4d(blf+QdBqYYwo&2;QGeH7qZj zkaaMt*aKWB^6Tgl>*HQO8NqI;7zHZTnfgePrh(z9zF49gCY{@UJmP8*!Mp-8CNB1- zYky2g*;#&Wh8K6Q7IMr85y|)OPR-DYQK7*-O9`bWiU3!ZYmU98wNw7GY}Ql6>hhJU z^cJl8t%@+@OS&GO1O{l_>8UQPket<(4-S8}*Mrhx@csYjOz-_9==&y0aq944kjHVz zV|L$r#l`j2%3ISnT|rg8KbrwWpAQ8da(F-AQXM2t(G%M9oh`M}`jerdp}6D{R0h=6 z8~fEjM@L5if@ngMlM_Q`8GpX)3mPQZhe`&0@O5(Lj#wokmjWG^H-4yd{lff>!3qNp z&uN%`^t6xyu>1lUXl(BXW#pUG^w!iGv{)itLL?o%XjHk}MPrW`7&A6fPsU;Zr=G5+dQH%eW^3UZeG z*NXPBC3&*6<0i1*N015MOdz%YWmZLV|sTG{PTXVO_UM^H=9yilXX*_RU z<{~Eu!!Ve;qq$i#8bHAsd2`g4wSN`1H_EBNIpcOM-D3L`mwfPDnA0`VwvTJh{LfPm zd7SOWNxSK?G_je-DEDj-?Am?riTQ<^HM@7cw98s~=0G^P9#>;m0h8lmT?;C?FDQ#+ zkPQVBA|^S!+3LPJxe0YO7(v+@SD)NTLfbV(Dt*ee-8i`+ofpc(wPrWSO|zXuZltjG z4fVOKfjHs;d=~w~7Q-{u31`3-mgwT8$dO*Hfg%`nt1>}wt8tA0b3}zNPx!DWK;O zaPhhLIC;f8AkmNxhS@$l5q^gus0D}QCc;~A@`n_4_TndRUQV97q{FAm{>ec}0Im(e zeWf*TwE9duD*}NtUXGCNzIAIPC7y2~ruSxfC5rdl`|9xDB;8>X5SEg*KX@6LR#MgN zlxRmKDM<;0<`#AGx`#VF2~0lnCMWsGvdzuLoPDhxgzdp?-|>c~z{qpB+r|@k&oEPF zhtyrcao-g_{vA~VNtBk#M@MDtG$&$VLJE_y5$tN}toO;#Mm~jOZEI3YUVa`xrO9Uh z6=U4eG0SstJmR{x$%h+H;brW<4I=ous$7v#aRn&n3HKA#B08I z@G@b<|C?4J@mNr+sI1IH*qWBSF8Hzct+KYZj1+1HiQG4^l^PV8O6NRH+sZ96ptl6^ zG2c;6auc?dRWr|G!5MIPvs%+>M3kW(L*=p!?`;L|w&w1tZJs3B`(<`Jqt+|e)^Lnm zAEZa1lbyoUCq=Q)6*WcKU}BQA-o>UN4gbYQdWUYL3^;Z|zs*h>!(Hhk#xWi+!eQAi z*o-<&lC|PqJ;$F9U%=t_b*?KvI~>pp{t~3^loQ{#crWrE_dpo4Y?N8S=N4qpqKKFz zOS^$9fL^iiSL08gXrR~@@E^vsz)U*5D~rCkoFX9<9OCux@V_(uu6BXRbpZhU^xs*4 zkn9M@K0NFNRChP;vGW6gk=@(`Q{60sp=2qsl*T{FFV77aX4XBpHy8kF0rSxf)I3)j zLSNEPWCxqplNs2_$8rEZV&x`H@1(uUo4J;GEy0y4aHPAR=RC4Z{n=xQ&*Ajea_#kt z3ZJWwh)~&W6vFk;5*3UIz^qp1mzgOEM7Yb=vsZW=;x78bWe~lKA{gSEXo40YYDFve zUNNCTKsGva-HymDzHt9x^RKmLl0meQ6sTyvYQ1_gPvsf7diHDdqN%jb^NGL|pqlX` zUmgYZ;+t;|D6L`H)Xi5XTJOK14BKB58S)i7LkDWDCDlXd-%Hii=X;kI*{((PjLcc6 z)-P#sW`m6>!t9idAa`k!gjxoh#H$X3zTm!$C$EC{KaN}P_`~8OIuNnustRM0(?qa@ zrXO2%=~bvYd=|hPiSlfxPZ8Md0<-AuJ1@YI)C>=Z1V3^rrGwl@|8DzXsgP5{@bz6n zowP2Bye9Ql)Vq8C5P zT4GPdA#t#TJu_)va5`SaQcZttkj=h%|FdAkm_-qO1E&Ccn=`Z%{qGz$CIpW2At&_O zbvCGJp05Ri$`^zL?;6dhx=7 z|Ad}^DzH@q*&l`Ai7A06G{g>v&L?fXt7wx~6Sk2Tc}%8x$h>L)t}EsAZphL}$m(Cn z;QPKOoB`Z!ScvpTZ%;jp86wr0lL=qAa`Mr{K4{Fjy=%iJ61JG!QM-QjP_5b2*&4pFu*A+`xV&>gS zmY44wJ{Fnae;eJW`ukHQbBJ$lDTHBzr)xzW5=j)W>@<3dN7%OtLVmNS@86#C&oO8w ziuBgs)(oi6{qqIFru5~}1s$vdK z!l-+!q45{>z1Q%*7Rh`s3C=qPg*r!1!hYEHbD-kOQ+ye>ZEL(p8!)^N7`8IdTZr)= zMidIU>tI@IF2xtAAq&^mL%I{OODX{{fb<_YN7e#fQUv!K6Qbqwl^6mqZF`~^zysY*+ ztR1BOODF6fZ8&BNEF#J*HlysXxZsTbU_U_e->r8FE?~t2{JB~AlKkEJq_=-ETy3DE zsi{dr5TIZ$4}tK7okxA3Bl_O#2xe8JV z!3ybk`s;k=%bsgmvydyKm2HjaFG1PjaIcN?i4VszJ7)qD^`)!71S%^eWI1MQ5f|3U zWFn%v)TT?Uq55KWK@LHGOVcC#iEz=$VN=&MrU4_Ho~|7o*vCTKtR?!v^N2e{l)F=j z)2ten9Ni97V;1+V&7ZK|--biWV8Y#$^tOX(SxN10P0HGkjhUC@<-G(H9V1VA>)Il} z>jw)w7VA&`i#po&tA#PZV8)1AXA~6#OgF(y%k}yUHyY`dqz7E_L75T#60`SyBY$YL zc$JA-N!sGq;}~Q0)tsnrvpO@*9kP){Ry1R>k7Txg(W0+}%K7}RA^(+6EXtsE#t*Yr zypSCwpZPn+H{dFG#%dT^mfgpz+7dXsElA6Yl;qcMcF0emxPVmk z40adG-if4-o+E zqv9m#alhIgDYzp(kJr9CE66x#!fjLvQJjwR^Vx;h_3^r(q;+TvU;)}qWaNh6J!FlK zhA!Z!x|2AY{1Y_CFc0ZOO*`eunL8OcCXuReyfE?8eqPQ8RXd=X?nQPc-`O(u2o8kr zO8c?*%z$FOr5bxh{B9j$-aUCkUNRS8bK6%0@X2l-l~D@!cBKGUS|*)Y%*UxPebfw< zFgIvB7FTB@u_IQ4V8L*DGPMMau0a1^THZnWbYE*ek4F9!JA?`F)sMPx51_N-^)!pw zl+25k_*PZL7;R(d=;)Z=7-`kM)k}GF9$~_U4+SKSnoALV4 zH-`aRSfva6lh5KF9ygR$fh=I87NNT}H$;`-Od#@rIaMu$4|J@0h>GY!3ma8zJSg~hJ|Ndib4%or=IV4x_?6lZn}+xO*YxnboT z9{#YlHg}WpM>GeUw!2THe`t#cDZg3m$D>8=CjYONEB}Xb`{U0u!`P^oN`*66x01Fu1DALDl|}ToEtyw<0(D+rnzVc z*e0_wSvJP)&O2 zIBe#hr#3P!`+17FUVrd?!cuVD^>G>Xj6zyEdPc9?g!WK%s_o2)8gh44af8(0s_~NsMZVtSX}#x+68T$SbbR?uR!syRpOx6Gk+r%oex!E( zd{w~ts=G#_YIZdGmqpe=sLLNuGHd7Uh1_InB3U!H?sZ;l292d;)d6YU#KI+IhMT?1 zFXj8uxFwL)Zrn%ODA2{ow*%Fd1%kIG{58Mc*86&!et6ZdQGJ%T9O@RM%xraQ0fu%; z(06~KHhVFMzw(?sVS(S$a{yO_h=KHNajaMcRQ&t0peM_BONDxBgUtJHxSw~YTGhRI zzf~QxZscr2#5s#J&WV}7#0ot$&)GVjeq&t#((Ujn%*=5-t0l&SHi7nZlpy^D=e z^>%i?s>UmX!)WTG^nCVMZ%@zMK+D;V0&^yLVjecJToj}0QBk^hOy~J3wOj+Qc06Fy zahe|R=stGt4@HR--1<5xGL||0^DTpm;VK zI$6uLd1lt~(rK3i20P=}YQWH|%4uxB*WlI>u4c%U#v3e+lHe%iiz!a*#e#FAmfve$ z5@N*Tr77ohp=>ywVos#jayWrR;HbNM2DyTeX=od+8K75e0>s7M=*=IN@Q2~ymOFk49#!Tj6L@|JC;-VX&@xXC|LuMni zU*G!)*wGXCCC?|2{i&H&@D$n8b8u5D%N`xI=Xr|?FOafIA~p`?YQ!Kq!9dQql5ViT z8opdI9U5Sx&iNFV$zHRDHJ{YgVSH$dXA$H3;$!3~if$RjHc5~+{`Q`=r5IynA7y`* zR>aP|H0xdSVxM58BYt_sH$1%78dg#2ssdI*PW_0@i>4v>bpZvPIgs1#WND5zSTz^z zF{zz-wI`sXAcf2QGmX7rM+p%qu!EH|p9XECcxyn3bYs!wCSO9HUN#dC$mlF_qIV{w z%XHP^ND$hS-G&JzGOmGKP`HL#*_jvdK3idl%L+h1gdho%WsvIUyN9?oP&f5k?pv;O z`>E)a72T=1XR9XYsk=C0`hFW%*~JXpU)=eIZ;v+1V!5OrayaI|YPt&Z)s7~my}>L^&N1S7W6J{EE#r;F$8NW>*{hwH`C8=cZ-S>?>JvY zR}g3;7)6k#y|xEr$OzIhetz90KP_#ItlSakB#10QZr||maCQpex6hEzh*|DV89(0j z_V0PZY9DZFqkQr)1J62r;oQOIX*qnphQzIEu9&?zfcWhs<7h8;cXyV)QAAt|G0zz; zbNDz=)Rp8xp(*hO6Rd8Dl2yDFK}BZLXEe_m7E|&0i3@L@7*HAt*+IyTqNXWNC$iS# zOXw|fs(I|`)a~+*pQ}2x5Zh#eZD1^A?f`ZI)ITlMP8koc3Lnhe;RFLoO}5(;jsb#L zpy7aAIgu#R=Es>ba=$n?r^vRcq>MxOEvi$$>?tVkn-@o2aUQWPf-u0xiHr@qgPQF> zh?=zoJaY6;HX}5<9C3F)tI7=7$tbpGzW>tI#HUk)H%s-FV>Uxj*MAuUt1IK5$W%!z zrGbXk(N%^pR+agx2J!{zb!Eootp0ZD2kx2VoUAJ|yD%i52Y z%&wN6i72^WkAxl=$O|pVWmR=3*gcXoI@g#)anceDjpL$sHOsa5+bQRH;!W@a6p$B3eS{z`{$ete%MKJ69>P`CTsQ|yvj88LKs;$54aHW6{+Y6#g! zTWfO26O%w75Inwr;NM-yKUF;C+S=MC$s8@`>^n@bB_ryEPGd7a6zMRz;mNYs$&)E> zvb1l)CMm26Fs_hQ4hByj0P^z|zalwlDn*_w61X)O&Vo4C`Bq^jftQUN2Q`ED) z;)DK(^^G5j-Tm&wxFH<22kO~QSWQ2;f#!7l_;E=?#LU%~8(TW0u&Adesgk$9GZ#Y= zLdJzP3=sK_O$-2`Y=S5kf4jL0*h3UmKk2>sd)*3F(3yGz1uzQ3>wMCyITva>?4Ds~ zA@>;@MPvjSiC!LvPX3gjq$=GH3LaKeRJ7h8ZvxgQ+uVj7$PjRQ1ZL)UXqCKy3^+eaZq7&p36R8=D*18P^;cPDTU$HLVuu4tUQ%9OjsadPca4E2 z1QC5cSK!1n4;3EP+1MP~X`%g315WnR|E={4*U;B8-C();trNfBOF7uOz#JRjOaBA@ Cld(Yn literal 0 HcmV?d00001 diff --git a/src/assets/images/appicons/32x32.png b/src/assets/images/appicons/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..260435f0c7e381bb6e1ce7d2f5ca2b0cefd37ad7 GIT binary patch literal 3276 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/appicons/64x64.png b/src/assets/images/appicons/64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..d81babeeda287ad283db47893114f06f62f2d433 GIT binary patch literal 6951 zcmV+?8`$KDP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+Qph_lH|6Mg#Y6da|GcygM83@B0(qulW0i zc`$J->52eY>E%7r61`aZ~1dpZebD{o><>K_h!Uyyw;TM!`SF-TSv` z?{z(Xx19Iinf`vA#`D$Bf5$>FR^ooa8^41KmfuyQgy&z^F@D=nILU>?=NR%m@^~B>N)#a zU5}YaW%DlTV=4C&ClbyW?q!)*;a}o&xv$2nvcyTo7TFxUrg6=AB70nP%XN3$zVFjb zrWpP9gxh;ReYnRe;ctEhr6B6%jxV8wWkMxSldJ^}`_H+!J8rwnud z$Y8o*t}L+I z@!Vo0_YGU&<~eX)veCTd?8M5jXQc5|MR8vbmha7Xt zIhQPs>Lrv|Qpu&1T3YEf)L2u^wbWW$?aj9Ug{78TF|D@NdS}qitvgqD&ggyk5k?$o zf@Bm{nI>eY*{mcHC*_U3T4V_XE~WIPs*DPdW9p z(?7HJX7$Icxt}uk-?Qf4tSMvho>#tQjl-pU+`@@Yl5$4Id~{^IC<6f6D`&R47`-y5 zoZ03nisZ?fOG?gi$`~1p+xc|dXYRgb?!V^Er1)ET^Iv7oD0Tlv=8RJJX71O#{Xy1N zzlsuWf>ecysSO8W-o7>|DJcO-j94N^Uc!9*&QtY**}v z9=P}9Rw`|T>Q-h-$L!e<6mYWhX=992L&gr&Qv$bXCG8$+&%^IM3sqw0%#pP>KL(Rs z-uBig76T1ZT%5k9A>A}+=;6_g)(BHPTQ~;+oqDA8Qc~C)+4Oh2do;o z8W(jl7Tjw4v~EqEtT21diKp!_Lf|f(GU9G?lypAOIVA{*D%pW~kf}itlb_QXC|L%s zUU}v%Z0I;V3)~xGMyB$7=z6DcYozu9WJl(Z8zb?D zLsJ3#!e^J0RzwM@)SKo(k-*Q*vQ8?g9ATeW6{Vr|O8+zFoE)mNjFb-}lx9?hp&bgy z_Q8^%D+=*bW{g1jpHI<$|4kSSL>PKl8Aj}!T zi>a_Sw`i9)P2I=8P_{-Na);^rMA|5mbw-8f=K}c5l@QM}99Z8+#D-g<^{J9eB_H)# zftiYrrfOwEM}fj2w(;5-sx}{%fVLfs)j={ioyAVdjAf5CSTFSfoQcjvvQK&9pKty5 zgKm4fMuP)xI*)^$BSPL0r!HGbYy)KK_DZ>jA#OcpU7n%rQL)m&iR@xuVKC}K89R_6 zyy0Z-r?nDO0q738ho~K$9~kyCa0*H}c@H>ZG$BcK5#TH;I110|bL`i9y3WngO8%~`G9K}4({VJ1X)jGhZ?nsq%U!b4w_ z))M8zfobEc?{d?HX>DVM>p^UTjebO<$X93tjOGK4m`=>i7AuX>+p((gT}r^d&f%de zaIrcL94;QX09-V@^-u;Q6C?lc0kRDIZo^??g2b4$1tNjULKI-8tR5ycc96x8^Aa?2 zXt;%2y|XVoW>r${<_;?`zk z6BaP^x)J?@s}*xk;zG+XFN6d@6xfCVL(j__I|&9ph<1== zA?=YUCe$9u%~{?uW1O$3Andl^kM`r;{Cwc+chU>U$^$a*K0$WNtr;x^oZWIGcyGBi zkP|R?mH^?i=Ana|(3ji67o65w*x%hvDIOr)-Krr8s@BsvEaA3=+m;nj~MhFuNzxJ+9t{yiS zNOhfy>Y9jByTQnrb1|M7Tjdyu3czZ@sI2~@0={EHq>Eh4!qr%>Nf2>c3}Z@- z^gh*Mcn)GQqsopiRtGp#-x9;12kLDuH4*Zu0;g!Ir&NzD=$D@JH;TIOY@UBb!(5h))>IWK-z^Obrj?RyqB#T z9aCTH5C_-uWxIfvnPF+y)?wVB?l?oF&EmH7*C0>UuO>fnx)c@FpZ&A9Q0Q~*YEPOg z=0;q7aoM}0-Dl2LpA+f8zVO9SpAThTTczEaxTWM|@Xl=xYD`$aT$w9eKvy`@!hW9% zfteu9+~`B$KUlEhtb#Wzs?$%mQDq!MnBgEaSX^No3Y*~}Uki~@To~gA=U`VsV{~Fj z>uDaI4e;#T1FEK!O7-#_bZCetVlx3zk>kQlY|L9Lvc2z&G1s)7v76Jio2^pCU(?!f z_KvqOub&XYKK%sa-4M!TMn2Kzad&^WbIk8;6m3kur>kmOI1yl`Tl+IuzY+7h>T!_| zUM5DbXu4Dq)JtH{B@8T$$g4}YU%}kI%A^&W{39_Q!BcA{aj9O2_vVf6@0H9xXz85?6)5p4QB!24e@C0|H{5ksZz)2k8Xk2T^u ziGbX&UO2(08wdifv>*Nj+vm0w1hhOs0K1<-2y(|R>ycs?|vu;2o~=aXr|g-MQ$>PCJz8gr!D2WkXH{b~+eH3m9DGWs-Oa zGJgOq3&u`CEou#`ikapguMd6@i#nc-Rztba2Nhh)-OfmP!v-qpa>^4M9MZt9$Y8Z+ z`2ZD;V~S`K0)dF!UZkYt5CfLCDNbp09p$T_)6z;&|p3c}Y zd9#sWr)rL)vRLQ|n{fk9Il(Nb*o1%VjgK;k#~gCw;`fgk<=yEZ9R)LNnGhBoteg zS2-_5RjgNA4TVNiys2XHfG*HA2H`C)&qFS|eU+wEc*`acB1yxRm# zyiGbOk*CkSzGpq&jxfw;(*-`1GsHJTEZaZLa+D9zqm(4^81J=k_Ak=miVL`ZwSspe z$Z=|iqcR3MYF{Jail@cUL>lWwdxra`Xcg33ew5p|k=;`?^lR-2q}oiNRfzX#5KWYf z;08MMYeCPFa_kdthYqmY$?Kqcl zPQE>r5bpGtCXDjX)ey7{uL#afrhrf8?`K7*Qi26cA?9N3t(n^l5CnCKIewo)ABi=Xh$(K}N$ zC+Yb~x+6P1J}Dab=<$h~dw5qDwptArjhZ?2y+Y60-Ydp?MZH(hK%iLXhAb#RH)MB5 zQ6V$s?u7zIJ*tcVkegu^vk!mG#f8U-JKUX!=1A9YFxb9U zqU*cW$!-df5G@d_?P^eQ>0>%Q{nS$~T-j1`$1$qe&yC*s^G5Fq4gvyMBL__p=_9e-UsqZb`oZ z{|C>Z&A;*>`|sUI0ma7rAA&`N@1>Q2pa1{>24YJ`L;wH)0002_L%V+f000SaNLh0L z04^f{04^f|c%?sf000RpNklA z9pyzkikglHt?h_Zr!q`kIu+Y-YF!7XR$Hax5=2Wa7HeMV3{~2?bOxsw6%7gm1QJLH zvSfQN%e%k+krzlp-b;X1UNGO8%;enrJLlZBO1|&Ml_Hae>2U+KL^KQi~&O0puAd~~FS22r~6*I{@y#T-^Aeb6qN~D2Ly?HodA3JBdz2YWBHdoBz`qKiyPfGxp z(Q~mN@;O}ydpu_)3>_jy24bwNn8mDN58%vP$p#tKbJ5fYQzH#*^5)@)H%SB)7s#rL znPd%X0D>0xzflm~jES<#J2Ck(BE~p`l`qZ|8NM+4QPI zvLwsDbT|jWoPloUN2>`s9c=R@_k#SOm%3i;aVgVUck-zxi#98N zzy^XIo03d_Ph@;$dwI?o!x2D6B7@A18j3qxsP=#3n0qeMU}8=h#!+?|h`do#J}PaP z0T5p@qe(4W*=_mR@1D>nhn|=lz-1c8n2Q*zw#?0x;RGP5kvCS)v}hw${&7c^#nS9F zf^I8Ol{vP{_4qIXpdSxrSkm?hf>Pt3!svj9{D3>Dy=7TTYUdZ+Haq|*YgBbtQbUb$ zPRkBH@{A%qW9(pqM?^s6soMDkp_B)(V1q`%xfk>p1Je+){Vqzg{9KZ~pOD?eYwg9v zuoC427{-yfU?TEr?filZQ~o^Qg>wbNLJ~~*X(dK^Ux%cyYw2)>e5O;k^Hh6$6w{5L& zT3B*n$^rmTM}G-y8LZ-Tdppz3HY%dy=}0qzf_Z`MG^$NyYblz9m)$pG6p%;#9`}mFw-$R-4gi3vb01JGy#{Pq7Pf6;+cuVE zVHgHJqn(9;8b0ar^7ppV#JPbvU{^OArunumnN*Z=0M1yoKWZ4pcWv8__8zbdaPAQ> z+E^6$g16h#cxwO%h6tu13GxP+fyhQ(GU@V^i2=P;JHOy|M4lQ-V~w$No@gp&w!4|x zzU@b@yDby9Z6=HjexIjjwmm>+>;ZZ5Gv}0hK#wAwolmRkt3zol$2`m;?{@yxp2pu= z$K%ACPvHLai!lQH9NS!{OU}wm84m#1J-@&&A{&6oL$N;;OXHd55{k@DZVc3r>6IkM zX+m1J2lUCcP@ON!s@J6ifH;H_5qTdNH5B_+$IDACB{*WRD0?^QW+b6)!0#Q{Is7?~ zF=oP2xovsJDVqX4DqK;w1J!GQNK&FAn1(^7tDQTtYACfkxNl!E+oD;=|8m^^yD^P- zb@{@C%S$K}y0EOQZ0!FX0KnK4b^k_nt_U5bA=svY+cxpKEc|YpfY(L9W8-&Qcx(%w zt=y3L1q*@)dFVhMe?448mzqQGP#u7C5vkJU3#TLiz8FsY3zc!a6~?ZpTbt&#%l&S< z-RrV&TPC(?U>cHeKF#pg^H9z%K5qB$@V@cXb)*livsh=(e?dgu|Gl-*~DcIf*McebRw~es^yYk=ucWp$6vvDS)^q zY*uxq1FMgx-e|j-#W~x!A#jM_9U8^5+OgEPdk4zLdzbQRmt5An+yr=mPB`&zlP3kB z8^RaOU$#WANA;GWObOF4ux$&U+veg?2YI@rmT|5w7VgYvRYM*JI(r?qI-PxwCH?N+ z&)W`IC;R*-4FI5IAE-a20D8rRoo&&`6&{y8Kh5WD z^m*L4j|?_>&Xwzm@WcE)JTq=DDBQL)pI`6JV{>B^r+X%Jy0p{j7ZaL*lK4t+>Hz@c zy|@?Glb^qY>IC4oz;SJC^4t+_%G*oDv?ym5WwGpogWUO6J!`ifK5*l^oh7|Yi{b&e z@OT3838%s*DqS*Z8X`{smkoYq=7Wqe5X=VK)&1HXrFvhKKW}Y5P<5~~6Zi-4JaE6N z-X$WxQq`s5aCl8h0sv@OFpk`8{~Saf2B!2&PCG8iAKpbyZtiTh;pY>r)fJ5fBf~vB@3#J&=2Wfi^l0@DA{bI?hX1SMK?y zh`bK`Ar^}*Hcj(6;Cxj*Usc60jJZHLa0###Sf#3etg5Q2uB)p{Jpe~QJaemwA#)L# z4a9&gsBS{_eOb7?>8h))vQ5*x8~7QpG!~03GYsQt5t*Z^7lp&&UHx{3V??ApzB!r& zYzF?Ms;k@D+BOa387cb>zpSimHt-~1sOk@Z4@BfS-~v^>G#m~m{rz$%6e<*v8-Z)% zFlvC+s`?klaW<@7yH-;YKv`MYS->N}rND!Z<2+#)Mmq2s;8WGB!{P98eM|_2LIomn z9dJ#2nlz~DkHg{c>XZTy3WYL7qz+gK++SH)Ss#b8B>on^Us+k%dXjx)i^!F#x+xqE tf0S~r9}0zhjA%q78qtVGG@`FU{{>}b>)ziCqe1`x002ovPDHLkV1ld(T{Zv! literal 0 HcmV?d00001 diff --git a/src/assets/images/appicons/64x64.png~ b/src/assets/images/appicons/64x64.png~ new file mode 100755 index 0000000000000000000000000000000000000000..c504f89ebc5a9aec118f03e36577417c4a265e67 GIT binary patch literal 3436 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 O00003E|6 literal 0 HcmV?d00001 diff --git a/src/assets/images/appicons/96x96.png b/src/assets/images/appicons/96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..3b3bbbd560d796862963e025afaa1c9e525e3906 GIT binary patch literal 9415 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∓HpQ$_%w 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 + + + + + + + + + + image/svg+xml + + + + + + + + diff --git a/src/assets/images/bitcoin.png b/src/assets/images/bitcoin.png new file mode 100644 index 0000000000000000000000000000000000000000..a597e86135c8f391aabe333f96ed89603ff56a82 GIT binary patch literal 8928 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 BmLmWF literal 0 HcmV?d00001 diff --git a/src/assets/images/camera_dark.png b/src/assets/images/camera_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c2b73f70c729746bf776b40e33bfc000cbc4684e GIT binary patch literal 687 zcmV;g0#N;lP)s~<(Kd6qO|?Q_@-?mIXQZy)P3AiG>k%Mw^eXS~b(KASUylGK zM=u|;wAOFF3&cr|opZN5J9ob^)yV%lqw8o&RV#wu)EFj*TPuQBXo#yY*CKy+i|rx> zy!W`P4&+MfDn+nlVk?<3nw!P_p&;Ht=&5EJDg~*YeKq`DnR%6w=K>7n?_&)bS_|r;UFGP;+1*^6}{X=#C-bw}0 z{pmiiw3s&W*O)9oOV1f?Em6DB0(!TXLxP$AbdOR;&eRZc2}zhZ=T5g!`*(PBIXwIU ziHVuf^Fhaxq72iksPbbZBSi8KBI4nX$<1mE-JI2Xhjwg_hq?_0gTY`h7z~Ds@dHtE V$t<7t@g4vG002ovPDHLkV1k!{ISv2- literal 0 HcmV?d00001 diff --git a/src/assets/images/camera_white.png b/src/assets/images/camera_white.png new file mode 100644 index 0000000000000000000000000000000000000000..1a07a6f5095badd052778a700480d5c1ef017daa GIT binary patch literal 1304 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/clock2.png b/src/assets/images/clock2.png new file mode 100644 index 0000000000000000000000000000000000000000..ac47a29519e56650e4ca2a015de3bd4be1cce031 GIT binary patch literal 8512 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%0A`gR^!KDioPBW@d{0hudwK{rlMLF( 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/clock3.png b/src/assets/images/clock3.png new file mode 100644 index 0000000000000000000000000000000000000000..daa4a9f5d8a187c10003b0497b72f9a675c55181 GIT binary patch literal 7229 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/clock4.png b/src/assets/images/clock4.png new file mode 100644 index 0000000000000000000000000000000000000000..413935424b772fe2a0971d175b3a23e9b08d0a09 GIT binary patch literal 7522 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/coins.png b/src/assets/images/coins.png new file mode 100644 index 0000000000000000000000000000000000000000..1d6fb8fa2d245ad56af04536814b605d2d2175b2 GIT binary patch literal 1217 zcmV;y1U~zTP)EX>4Tx04R}tkv&MmKpe$iTcuK49PA+CkfAzR5EbdDRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRGekU+o0Onpui)9@T$_we!cF3z*O&;2x1kisICAVPqQIx48bLY!8O6cZWRPkQ)=9luB}nOqex zax9<*6_Voz|AXJ%n#HL}Hz}M1dS7h&V-yJP0jVfq16NwdUuy!1PtqG5 zEp`M9Yy%h99ZlW?E_Z;TCtWfmM+(sN7mL9A8GTb87`z2SYi@7teVjf3S?Vf%0~{Oz zVeSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00NmwL_t(Y$K_YgPZLoP{^pgEQi!a8R1OU_9OPnH4r2Uq z=yLJkf$qtpC8>$W(gfp8Zpx|kN=zz$!Qvl)m9@V_r|@~{W-WB@Q8G7us_0ssc;(gVJuMQ~7TN7sCXMfe+$SOQ5h@tXBKk=~(2RZ6!Qlo@!<;vYXrK zk6T{`z*qyY0ODtlC+;rTmSQcnED;w!0CbG`&;5O**Rx2kZ@}N@!_eTx>g6VJK~=71 z>Vd63gym8cbTs*1sf0Ig-y@sbJhb`yd^N`1m;w-P_8K1BSS*&1&27Tp=RBHVEs8JZtMmm33frDjD~GBK=Rxg3 z2Cvxv+29oj1nu;`p?85c|1t{D6cIWtSpx|OZ$edu^QZPQ(o(NND6 literal 0 HcmV?d00001 diff --git a/src/assets/images/coldcard.png b/src/assets/images/coldcard.png new file mode 100644 index 0000000000000000000000000000000000000000..74104d76ec3745dac1461c5ad439c5bf32e249b6 GIT binary patch literal 528 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 a!N*C?+s`FyTT1|F1iGzna+831g!>=FtMG*Y literal 0 HcmV?d00001 diff --git a/src/assets/images/confirmed.svg b/src/assets/images/confirmed.svg new file mode 100644 index 0000000..710b3f8 --- /dev/null +++ b/src/assets/images/confirmed.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/connect.svg b/src/assets/images/connect.svg new file mode 100644 index 0000000..fbf7be8 --- /dev/null +++ b/src/assets/images/connect.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/copy.png b/src/assets/images/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..b82da41bf7e365e18e56239eb249f94c26ff1fa4 GIT binary patch literal 2111 zcmV-F2*CG=P)?C)f_oWgjW+<%+gu+&a)B!EN99X@jJt=qGH8S7`< z|Kyp2=a==pxpTx@S&hKkOad^L0=u?4CR+A`J8zl3yZXMzz8^lh@XBi^Ir~;uY9($G z2>|ZyBw0R7`RecM#cPo@bMFQ<)-t1|gIEa3hp7hd_t(U`Tw;Q#B--ar(f z5Z=2tIsDyX5e@(cpIA8f>WP?z3kFdVDMISSRbG?KsCX1vg9sO1JrT3_Jh5;P0PK!O zPq%{T96g<>)^p(pYh{oGfa&+%q~5I4Cay$P}@mB5-8GSpvWp->WWwG8;6RT%nDV1 zZ^G|+XB!XQzKgegcnjy>WX`YXubXo%SQ1FUB>@6V21zhk4=y9GDZ< z#81Dm6N}4)aaDiaoNK`l5E9Z*?tvnK2f{#NX^>Z+0C4@mHvogT5<{98RE`ypIJ}iw zxpD`9v9@7z+niFlgVxTu7Ay!1AY}-GAk|j{<=I`g?PJS?d+MN>0gzLbu>yuF45PM!~;Bu-@kPa&Rxiw6B+`k z+ye+f4b7sWIXp-~RPVRh0HOpp14GU8tFi#C?u^wZaIq?cBJ?h?3N^i#Olici`DGq>@HM>omOSz1Y7&I+oJ#rFcdo$Hc-o_*44DSIoFvkS zyo|!?V<>{PeB@dX40z4hhhLgUH;9?7N#ppE78X1B)gMmds~_FftDi*VWqgqGO|ZfDVNmQ9n+_0@DbB z`3h=7DAc@>334hZ+KNnR#NM54{{Dek)amTQ#d9zWL&3=H9vmk)f=C(6Z;Tp3NF1_B zQBdAW55A%R2=0!;rdr&~>$O2t?-fGNOMxKLjD(ZWs+)UV9L)zBfC$3N9N6e86hV*b zHB`keD;E&KJbD^>q4GYdHiRfQ6LT;0y8q~@C4TnazhUu0=04=W5|qzOxA^ouS7OUV zt49aO)%&deDg=2%u>iLrm8PfywGk#EM0ih*=JfODj-%VnuxmPP)Lqj2xh@`iaSq@7 z|LT2)aK$=CM?ZmJ@WlWAaCdYchq$oZ4W>QC& zQiWE+l>}5D-ja}o2!*W1i7}APR{Z2fHdt5DnuCyWpwnP}x$O3E;TH8%=PYwWZ3KTN{@cd|iOa2p+nZeAQB%`5>8sL#du~88K z;gx3-uJRlN9Po3CT|e}vIheUuzv^0W9nZ}Cm%n=h6Kx-AOGJh=vaG}Wu8ab_ybZ0x zRbG|9b#sbu{rJzmv>d~{w-&GF*nrJriBCYr!LrbAuM%gh6O0=l=c(+xx!I8f)nqhZQGv0WyR7ah2C3 zGb$c&9L%zyojtGnjy>~<7glz!9Up)8@ZKH%zSS+M=vI1gmDeOQDjsc|0XR0#zn*&T z##x|m``v#1Gq3F4?z1f~!b$%pA!K>jbP1cA=i&M1ZyNkpgOav=?5TS#3H z@B25lVQ8iv9~+Q$i8G6a<&5_&Jb&|DO|mOAbHmeVmhpgq>(UgLTk-EUZ`Z$2lpjil pr7Xh{172*W{_u(4ern*t^gp1ELkYHEdl~=$002ovPDHLkV1j153{e08 literal 0 HcmV?d00001 diff --git a/src/assets/images/cutexmrfox.png b/src/assets/images/cutexmrfox.png new file mode 100644 index 0000000000000000000000000000000000000000..08d3d5039e4d381056f572e955a000a5b5f18978 GIT binary patch literal 44248 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 Rl`a4P002ovPDHLkV1h7=^B4dC literal 0 HcmV?d00001 diff --git a/src/assets/images/edit.png b/src/assets/images/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..71afe78543cea471f4c4ac65e670d9d60f017bda GIT binary patch literal 2364 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 OiP+QC&t;ucLK6TLWG5N` literal 0 HcmV?d00001 diff --git a/src/assets/images/expired.png b/src/assets/images/expired.png new file mode 100644 index 0000000000000000000000000000000000000000..6400b8ba62b7c51ab9a7639d4239ae49475607a4 GIT binary patch literal 28522 zcmW(+by!pH+dm6pbV;dn3P^+W26FgDbpBx5B50Dw|QTf-CpK!isSKuS!wJ$qU90sy?k zbu?5T1^wBvBEhU^d{yofLChR@*^}3{2>Wk5gd69Y776~R0iykWkiVWD_uBRYS>!F_ z0yH?FfGggp79ANcU~WuPbmAfGzSuFB*6Lfrlm3c-Cv*M=F4KH6te@6*)h_4pf`U0K zKWp)w?yWhG*R#*&WS+=EY^ioP_IT&?2d|ht2Qoa$_wW*xfitRutDA-@7flZIg=4Z} z_g_VF6vVZ(`OMNq!V8H0Suq}|ac{oU_zZ1C{5=LdZ!kLr+EiQe^DmZ0Eq=hzJzAPyWg<2Zq0&I1iXKdeP4DkS*d!G$*d71T9>wNX7-Pa)bx zQELxJe);)rNr>M78IP5p3y*NHy%i*M`&}YEoGKEt2npOHp*nZ5TXXMm4GU`95DI5& z^cs!Ts4c_xE@BzpT2-X!K;f{v)soHA7KOWz1^bII{nxJL(sD(s$7%_%2nc-!~{&Rh_L&l!m> z4G6w{jW?OwGwqT75pvcrk01WLYqT@vtZY2T`|8OL7=}MEQ+Ijf0*rfhIp=T(x6`th z`pU(xwefuxJ?8G4th~~gGcFn)Tqz6b0G+8YE2=NS#6`>X|#X;uo|EaN4GMP(1 zPIfF+t4j6$y%8DDp5#CpE_(6lFu%R4XoHXho^$SqA~5JZNzO zJ?0K`v?+p}c|uvN!ck1X3HIA_mXxZZ@5F%Iy}$kYAme-K$5B5%{b!6=ab&jq#-Pb0 z68YPyAnI>ve&nA4(ZEWBe_IWfx4f{&9&`6Kxq_-Ov)iv`oMBkQ{I4h0bN72ZG;`(u zTtR9KQDkP;b)x!z!UCD+UbwBlS0d3(=jTjTz_WUg!|eSSShps-r#~{;o$mMA?JQnX zRqS@KC)iiwj&bt_xvnle|JG`E-`LF79<=>sdz+L7&|GT$-Sx%9&AaN&0x8J+rkw_{ z`r!(@e})R3m`IUYrvlIm1mfbhP)w?fU6mDy{Xk|HsVkWqdnnE1+yy_gRfDiqNVE;_ z(N)Yi!7H7(U~^*$$D2j&j|fs+qz$y`*)c}pXNxDFm^c;$U;2pEPg#$2oV_s4m+1NL zkWxFIA=hmZor!~1o-Zlk`b7~$M-#h=&pn7k$BC{<8dErFD|ftozZ%Gpft%9fj)s2h zNX(tfPcXY)nH~S3mkD0FZ8yr+qV9Np_-{O@Wrb-D?^H@+{%N*rYr-a+Xj0`stn%B| zN$o*(3z|jj_UOFXkIYa|;|-jysj7-{lye3P13Eicc0GG`QUhd>7JN9jWZ_^$#O)pTcO{6qleCpoWJFp?X0_ zBCBY~k@&1cBP}1$)wuH7pD#4TA&?p(!i|F@?GX1AB!c1f6BY6syE2+w+s{r%x zt*VhqA}30r1EqT#`3$S4Bkh!1Aw<^Ig%$uW(s`KLeQ zK?xWQHL-io7nwG~f77`IF+W}m5fyGfwqUkuePCuKNbH{~gL}*qvFPy4JFAaa9SGdt zKP!OdkDK+IqqwVBozGQCx?VWtfgqM%EZawZ8j+|5i+LT)XH|%|Pg@xkmK(!nqgfL= zeU!kU&ja$c1$3K=d7)h2{~~T~XU=&;D%*{`Dvb;ao3!W8AEaS!ojsZgp5Y+H-p~JW zVKsN$XOZzEc{qNsQlywc!rd&sv-ei3eE}uM zvuQjOiRItBHfW-}HBaiWHWYS}BZhCX{~+b_{G;2nJ!t^6)v6|V$J`1R+#Ue3$(Cnl zQXZG)|CrCa$voSbxMPtk1xw(3I%?)SXki|_hN@luR-dn`uuW|`)FC{rV<*kIDBt?r zw`wYpj@n?+#g}j5Qpr#Mj*)5cbHiHmnoDGKjc9?$0?nQI*RyV~U!}U#gi*Th|4xBB z{y5BB`*TDrWisf%y_j~qdyOaj2==di8tR>RSJFCt8?EJYr|q{g_4z>hP&8bj+ak@W*YdbP-KcWONrz z5$sYf`1i5y6g_57uXxP+gz~4Dr4jbScQd1BO*9SPPPx`+{gO|hN4;({wpBLNgKufC zf&!U(7cAM-$uL?GRwubRVLS^5iKNDbZ+OANlE+=-xUP3ky3P?-Lb$a%NL3+r_9PzM z#rA)<_^k{G8>#aSG`LUwNl`HPgei2nTkML`D?WgS69+pqfT|2ky2Z&aMofp;ZHB(~ za||;b=N4eiGDb<0_nVb!(t&b(gb){&=Anbq<=wI3k!{3x;&^ZstwKY3-!cgMmEtj5ju!fIX;gT_z z@d4T9Kvwt1ikevI6NdtZpC_}0%*#3rs0uWb^xgQu{aaiorWnEDuh7M|YOTN(&$jxA0Ck4Y9AgNTaB#G0XwahVPS$ zHSw}@tlu=JvQC@V{W#i;LyZ@I4iv%g$G0_xRzF7QjcR@y&MWLw>t#@`96}AmipIeV zJkKwQnBY6bS!y@=FD*z+`4^LTyu&_?66ri4xWWx((*=vhgUeB=%VniwWR+<11I0l0 z|3XcV1dFC}rbE!S+tTA-{vfB~+uX7?!2Zf#s*9$2*vXOQR6y^zhooQ|zs}od` zWY?98?N8><4LxtYXvrEPk1UAYUr?>HTQgyA8~0H0m3yzE!a;iaW)pqDti zlIbz?D|8gWD>cqGVgngLo6!F0u(ICpNhrdIg@K!V-DU}L;B?F?-8Uv4C3`Ms$ z1nU7`EqcGt>K!yvSm&7jcZmn* zTjfRuYPeo5&-U`y@uEi2HxZtmclR*4@0`!6C(C^X!nx3&>DAaq#I> zS)Ggvn2!@nzBT`SaT~g#v~mDV@!F?BEzGZ%;5d8Qmf~NQfer^zZKX1-xc(}Y zn5^m!<(JR2={hs7Xm<@4>O5z1g!IC9j>+i&gHNZw6+J!c0`sWqj1&eX*OY^gZ&y5i z#aN~j~Sb+>Z({M!EK|4nx!xhdhf%k1w6!w)0opR%9UR2t;!WQHD-$x5KJf!JqW#<|4pewIcS zzM#!k%RoN`EwJ*agWrv&V9%9QL(jg_OzrM<2j-(tjd$9wQL;&G`h@M1Pp|gV6B}X( zQds-9EBSOQ=ORC_`&as0GyG}j&ATV9hS~QYtwm+MnIbJZ_j*I5G-EATnptqwN$uz{ zssCm9^#Ek?cZx0@a?afw;jWpxpoD9d#x5;(5M#qmHjZegjahTS5b{RfNkq|BRdMk^ zJ1)2?C;rM~HT_L0a9{tC4w+yc;p6q*y`r4oUs`Pr4!#=Dsh!Djk}nWsFhiU<4%ZIm z8x|+kUWq_EcoUGX%-A~z8rYI;-^@W8@OG4sgM=%TRichtsQM#|mCMLtp*I9mkLU!?aNq0ilTjABaxlx5VkD zgPp|AdpI748ddx+VV|qqEcqD=MjT6dws65J^`5kTWiS95mv-ZYWyMycFS;U)Lc3Us zRJS@N{=-$ImDW{13~noKHqC|T4vU5$-mJuv4#I%81}T?zH$9v_RKBf6 zx3=?Bx(kDK)Stjx*>_VUBVUYp5uiMK5afqXr~CDDdc4JhqL_k*sNv0Raz-O_P4zh-;U!Dl>AVPObq#(JBH~VsYU=_pwxv1{!c=ONn zHALckz0*7qz;s#9;m3mC-C8?ms9ZwXh>%Y)^!r0bwEZuh_9vrVl;+%0WzixA? zBQ~qLMaG&tk?DEL6Hb_7UIVyeSsz$^;+-WRXVn&QE$3@HTN4^X-GtHnXlyeOBimw* zqHgPDTq!1oBO7Z^yh!P64dMM{^^WW5dxUB}jb{+mqUdv92aapk~kp0vWVLrE`vF#_sso=Nto z?|+Hq;_vS6V}H$SS_IFmO^C>0!kw*ip_&I32MuRu?c7 zNZo5}Up8GYQY1hy97O$ih?pDl12JX-3Ra!wX+D9xyq zvr&4Gkm<5^HnTN+?k%lXSLJJ7q+sk{xTQEG=&grxSdQivBYz5F`Oa`n0X-0S{mw-w ziv`BaTYW29rBPGiD`4{|SXNdXk;FBwMPr&jsMtC&8A|pt<99Dx43lX4^gci~ zn;LvPQVcZyeAX&IIQ}7D@L^sZ%AW1o7lwQlJ__#dBEc8{i#6PD2$aB!!KbLKBh8MR z>_9_K6Dc>6hDA1Ab#-Ag@9!eA-9jp-5vAH{b9pgP+&hPdk!d*urQkoO^>VIkwk?ay zUvDWc7~xMQGVc#UgLbCdcI8;c&!n!2XZtSe(1t>cFiCWub_5Hlr*u#)?zPaEREX!n zUfr3qMvktK>QEkn^jf$4*A<`v0DseC<5|0ApB19&l11Zx3sBs}xSa|)%WyKX&AIT4 zc^e5Cie4WUCmcXR)#wvEqj+lXc@S;4e_`M|v!5wq(Kjus0imzSh6!BD9M!>m3K7N0i(3lJC8|w>L^{f5$LMRLK^H zvcWjUY*Y3BSAr7<{jiZUIMZp_A-1&kqs8AD`>E`t`A(*H0diC#P!QMA$+$Sv1)7Fq zr*8Xef*F0GbeAG)jSts$aLv!UyAoFZQs=KIzTr$qYOhFBLJ>J0b1cr^Opvv`Q^Ykt zTD0E|mR1e90m?6x!K1H@mw0UeUoul?Tth+kz~XhlzW}Ba1N-E_X_4+_&ZjWs%PS)t zi{#k2QEdKBbqm!!$rrUpXYs)0X!UeR?!iN69x4zii7iTkV@tZ13A+kzdKh?l$&@aG zs6MEvyB_mZ5eD0`{@T~VWbqh3_uanzmk+MG8ESr7!;AIrPLW4aZ`cZm|I{!*BW69& zijMc*|9l~s>(iam6L)Nnd?iVTfu)+7(i6xL#-kuosVv-aLH$O^BKcT~Vp{p7y41dl3uS0}WfI{e-l;+goUuhv33C8>dUPD}}TxDK!> ztf~u%W?TI*q}B0ed$Tp;F_OB4txEl8UZlcqPbkEGSQ#Q3zG)Uw1_yhyA$f2lS7T;Y z-9p-cRGk+OzUQ-=f8C(%`-Z$|SvFKr<)?A{wdvyEzx^ zE+|13CRzeguP{?MGI|I;wH{S-fnjfGa9X8;3XV5dcKEvCRZbPtE2W)m5RL#sr3QKm zn3jCw&2D=rpJ~-4w5be+_GqJ5OCYlg5-s7)-B8?aU@$_1IQ|j=RdE6S<3XnVB$i4{ zWq-Cde%5qGN_VoGJLT8TpOz<+3j+{{eD!e*G-l?a~*V(BwxeYEz`!p93T|bhs zp$wfIU6xItZrPb?|M7U27pEmUnWKsl9ev6a;u$LX(abs*$YciVFWh_sc5`5&eZ@~F@L|VBP@Vk@xR(c|;FhOG(-TYuTM0jNVffu) zwv2?)o12edltko5pVbjFTKRE~Gks+{_G13fF&6a}8b0-<*1{+)T_+U?Pij$5&*aY8 zFOlus9y4;%^BZ$-zt-&gG(_?^aGzngWQb&I5(owRViJ-q6=7wadC1n2n!ad`4T1kQ z|17yp6$jsH?z0(wa5qEI_61pH&jY~pN(aIri56CiayQo3bh2Ue&z~>0B2HF4inw0+&7HAXjbx{cOCv88UvGSKa-_^xtyzgD%b{TpG-i>R3!4Z!}ZcqTo@ zG=qdDZVimq#E^0vSUHdsG`2SCoBZv_ z?0#?gEL|28&Mh^rmAV|IWywB zRKZQ6Y)4MY0lua%Q!HSwMxm~bN(xl)acvaFvQM`#gDfHzli|A)F-SZ>wS46B5nb5U z;nOy>C7{0>a#7xXVuw?OPgj`iEoy}$UvmHx(4XSRY{%B75bN#~`<@J=LX%Yb)UJqk zGj(VQC#po{>j%Q^r(Ds#pZry;Rl%p|-M&Bni_H{)Qn8;i>bb~5jQ5PJjaEj4ED^64U7ppOW$+@B0!i46!2hNSJZHGUZR?=3+P}^K`&K z^*I;C&6SsnHOzpsT`mpdib_wX0S2#wOme%%QsjtVpk9)VGm1Q4xT)2A4Gy*b9{>$- zvU+s(llk+DVQy&v{OuQr`R)=Q;7Ig|Jo@LS95=@}jSEmzEm+}mBeotogWh}GJAlNZzkLTYhn?EgE=ycBvxS-~ zI%VZnz2mNq`K$8oDchQ4(1GHPLK+i>sY813AW8-N+CNs-q06Q5if-xq1UNKyI*h|1 zqh#$Z@*rjQsuCga?pOCuXmFq>4Y3*EbxxbvA!Txp&T2yO8h*}QdM^=;^ z96E!Qzy5YG8csi+O2k7p0Od^<9k*NsrW5CTl!xkzle1mtAvdI=VH1Og`pjPxKrrm; zWBv^~WCMQKvIS&m6Gq?~Jx6%h<$4y>ZA#vD$nPnt#n;_$wMK0P4_vHO2I>Ri^fVxZ zgI|UMX*YhUI8yQmJ30Y4UF&tQji24+yI$GD)npq3?L)F zDNj})RpFnI9&_g3?`S+Y+%V3Se|PuE+Mtui*X1rFwXm5lQZ=j8+5kztd^s;cRxxVG;luWq>q49T^gq|{zP=(3p5kW-3H#R|*Pz^T@fj?jt^wR5na1^^d9gW?TIwzHo( zJB29(hS%t$wolsj_=8272bB0x>kTLzcyt=kf5Xl}kEWL8LZ&?jGq7HdfkI`H)NB-f z@4GdzJ0CpyawGUmExB_ulBjm|c-HRwiJ4n)jT+r)$Q(=_O5=UK@mS{M68{15Mr6A6 z`t9h)Kx&uIbK}8J`9c>S4CZS=Z~2IcfRFlsXXM&!3t!8vN?P&ecM=8d8gey- zCn($%)98I%Z2eX=`+_AvfLvvx>L< zeiP03HzBvuJ@;9VC;3?ukQGYfs?1?xVL}%Cmo%M?b^qiKw*}iu%qGuWAX>0BgeTx ziWD$xa+%7HNgo@FHTM2Up)-efjK{Vg(Auydf|m_#h7KHjzUR;*t(O1R4PYGKl+J{R zNyw0O7rHXQPeIZB-Xkeqy7*Tw(_51L5o|AEIJyA{4J(ifK%Q%h@dIB4|II!KrJbM{ zk{^K*P^$7_zNItNu6M;iCZhk>Q-YX+AteTJj#*aVuTJ?o_}A4B!9h0T?A-rrmkV8v z2F+^>siZ{^k=yR}su0iw8-@uz)aW@qNtw?Z!2Uq6WNja^P@pv=4FqapX}8bfv__z1 zKJ4(qnMYE9^{T(@*Th4Hdx30tO{QA4Hc>rFbPYI41Ncvw4dVvp39Vu2M#S=+eu592LiAa2ERm)p>HBn=`a`UQ`c8YZOG{dv%fEBF9wC)m>ZQF>-V(8-t9 z%cMh(I?6ZDRO3jRl@Vd(y=RQPx|}2&plCxDMlE33I$STULX6+I9BLW9anHHZoc3E@ zpsBxdyB+t?uv|dFV-&TG9N&5FC`@}SVk(;6JIDbFgJ%QJ`^0)3BS}bZ4kvkP1Om?n ze{0E~c;P@d#(dN=GdI)e1{`3tJNz}6xqTwy<*(JHDQd4N9RAAaBV-{SZ$F>`Qa+be zD;RkHE4qL6J>K_c^dEQ0ppE|F+6c98AL|eQQ<&JM{`#Qz7F4DDDx*8=wYWH$Il+Is#fT6w7 z?sqdg$oZS#HH^zQgd2AG{l<|2^enk0MJ_2H-f;TM3EdoE6%_SdMpz@Xpj5tQ3f~ix zQ_t8i!qH?~H$C*V7$&AD-wy*$?0-RNlz|*6YDga`tU|G4Ol=t%a@}+*DwTZ*KS(!K_L7f3pB%$3NIg`1=!X1j+G`t-JTHt91LZ3~w1cVa+-ZN+vfqVH* zm~}ulsq*Y=EeYUOs%ih4ggEyd(E8ww#$ZE4uAbZubvw1a|%05=t> zMT?rd>I;)2bwc*;N(>_$^a9LLDeJ);#JJqeRz_^tu=5+=1YjD@VF#vAV1=jCBg(az|;29<_G&Js;r$C3;w;iSLi*38V=BiE_HcH?)+hgGPJle zV!18knLR_k6w!l8!yBTabrIY#U=(l_ zKOnIV?hrt|`4xoM8EIUJv@J1ZbVBX5HdNp_i^l12EK+0*^n3t6(!{)*F5<`ZHa!24 zttzuu>rx}DSLuVZ8C4RlvJFEDCsX5o$a+PFU1TBXQH~~uG+>3Brjg!hDB0sB4t<+z zu^e`5$&1ulB50xKirRLgvoiRtdDUN9^MK!_el~Ay0<^%VahF(r6(w7h zy-=Y3Pm(v74y4cU0*E0RcphPVy?kE)?>AXqU=Om%kT0kWq`ue=eDHX6&?zdaEMh~n z{tHfM@l-zXdI>Z?wcH?$p;Q>(4m@vPiiFlO1lG|_yf#HC-F}h3Z}_=A_;#Lu#PG)W znZ}gxz01*Y!aK1_aH6)=?wp;OF2*rXG_u zIKFhUSw8!`(p|&ytX)LKU%8B^p*o6jJjV~m$>G&scB~qQ|sCM=7C0 zwx5>*g@3vcwaB8jcIf{Q_xW$f2kKG6U`&hj>(hxCzv>!ipbLs+1p>izv;^kqyQ+I2 zh&F9093ksx>KVS%?x|qB7k%+1n=TJ2Dh+4?CGW}dng|-2`;_?NRP0q>&Gx3^X&+Bz z=(hjaei3&vxbRUX<=`sJ{NSx`TFvgj3ifW#y{>zpkv#RR7}WeGm!zTM+Z90)i{|;E zZ;z(*t4)~Y+d}4!xbsbhPW6A8P;+$=NX>sIh$bU8cFr4%?Oan*tRkNl{RpI!oM+S5 z)(Dfrx9+;+r^8WMYg#pi6mK2x>PmKhu{a3 zzKe*eY^gDfjE>vKk;Uzk4t8{T&rKb&Mz0I80b0x*Pt2BZH=%*bjR7>L6$u2IkRuc@ z*nrTiC>R14+dB=6Rb)I}$Y0R1$984x(gbjRu2)SjR_W0-`v6sEC_?YrOL9Ml5~nk9 zhLLoB*1>MD-5xU=^{b_%75U%d6&1xI!e$__=ylUx@$A&L+>jGg#qqi-Vi~3K=g<<6PWyk28T(igvs{9EtI%%fNA#?8n9)iw;_&DUi7XzUWyo-oa z)lg1T6cqzz9tR8a!TFEYR?P69DN7V(Y zso^YovZn6YdL;gJWuN~WE3o@sv<)h172xtm8`G=}JkbT867O|hXbY&{jd~vYok>cG8baoM9k#wikDSKh;BS?Kp;&Lc&Id_=7bkN*W(B zAVYx)7hw!etbif93rVTWI?^!D{<9CUD-61%fx%z@f}s6DBv4Q)OiV)(A_+Fe10PjW zrA+uLljF&x28vFvUL-!B7N5%45nstL`^}g-;8*KEZP$kg!$@k`g3ko$Fg|HOz9iS= zjT^6e+#RwjOOKgvov%&Tdv#Ganfl2v( ztJOi2QUJsfD2V2}Lg!nb1F=Qa@FcJ^pj;u(9%88JWW`}7_E&m`k@evt;(s)*fToQ~ zhuA~#FFN6?^|(%p4(la@X08XPHRQe9ZPR}j@9`!5+t7RTCRI@D4k*lb?W^>)All zkq^J^!#>DJ^84PeEXajm7L@;6N;-#4WZ!;9r zSphn2I*> zL>*K<&DX{Z6tsa|jZ{!U=i!`|G@$JilF!__|2Fd@0$|0wCFD1b5F4RLL9X{kiAZ~CR5bWU?qtLx4bkYY6yNrfe9^aS4LT~jfB zB=varOlf6jO5kvi;mG*JI&wv>tQm$OB>?h@8M4k$G2^jgDq{Jay&I%qe_+6T&Q38k zhJilPn-Zf1l+gZy>W><-j0X!Qytt#weEmjmpXyqWrQD>>K=D$$%(L(AZi930e^X(U zn%DV%C_;s30X?v8u`2e>!t&vmrOG2h`PL-ST#o;|cIr0ToR!^xd&t^EPXhxCkP}@{ zb8b@f>Mxjf)HjdEd$a7P{C=kGZ3BkxUhz2*gdr1EAYFqil?Umn!GLzWxKMFD-o0!; zTugerR~?!RX{|C*_U62W!vpv1SV&6w<^alk1pGdj3gelt_#`yG2cn@xKM7 zf=Ad$D`QL4ETa6x<~ynFuiwD(KXikD_qhstv|)de!Vacwbo}Ct0DK|= z{K)S02teEu%~72C6*P9dYwB0RtVd`eZ5m)J$=kGl9$A1E5Fh&ZQQK6oOoD%Tb)UEF z9yX9T4;aM*&Jky_8(I6-4(FDJ0VTqQTa|8SIF^ABfH2cvv$sut3*@Q;Z2gAX1_RGE zu(iyT)606Kz8;_(g)4RxFVbtLzVIR>0}rw_GGYbJfD%H-f-HQs9Fquq0hEV2GgVR4 zlcLzEWG$)+7Gv$D^8T zC7gerbq$Zqqb=*BLuen_2<9OZ0by~@_~+o(rA~sGBq?|fAIGl0)qPEkTmc>K>ti}! zCd82FT^Dz9{Smw`X()TlMtOQU5xi#357Xaz)wyMKfr*<2e~1K4-_$(wkxRU~pl!># zmC->D68-@R3`mWZSSc$!d*(JJ5BQM0d^Qa;*C^^@3n69M=J2?koOvTPWn`Kdh!_ge=cPxRIx2&70K1(GGF&cJ zoXmI)Wv^a(KglgtvF0XF;;MV?W3$yh4d#Gc1$N|={~KY4?L1RSB)P{YLew7ok(Gf( z{?c2(2*rAZBg|#kD!2mHStjI<*RB?Ca}NI#?G6JN*(o%jVrnJ?94pCZ0OXTkD{1uk zFi`}%xor%=2@@KEpbWdR{xCqD;NP!dG;8HX6+;7H6O=cj|AL$$ILKgZv_)Ij?~JA3 zG=t=_$Y11QU2epjPUSs9zxSGk7UP@xl82*jgfk8v{3FqJX$3u`KuvQ2(fQM|HLpjY z_uAHQTi=sj))6%k;+!<{KMkNzl^#Pkk^kF=()Pm=AVs0fYAg?mo6bXOgPWchAX^Fj zf}f;U^42J-winaVqhRYO>~qjw%i?JLhS*UhwfvCEX9{{@xh<7Wi(Aj`Ju`cc$R@?Q zD4L@K!*Sqrs#kX(38=`C_%DKSp`Y}qs&+V3w|3-(t^;`^G}OIFz%D0mJeW>B3rmVK zD^YX24xMX2_A^?-T{fkR_C!;dI=1}&2R2xUf-*?4I*QY}YumMiqVYu97*%0T0~-%+ zw37lBiH78l=zQERdB2sc%~;XfHZ340>=nu27jG@1DCrxbGi~2|+}oA{xp$=IIL7`2 z5pwc?Sk3`(eyXV)@#VuQAQciQNK6=%yqCnm?r;6LqVXFIIQ-m?>NuG6T!axRCspKd z2^$fr6P0~Z9sS2XrL$ku=GIL}a#n8w;LL+Fy0PV$h)u%=?JG(+O@A*DZy#XAoC#mLaXU8%kAzr5<&QN)9^!L}wq zCTX-~aTkoE2l|t#wQ4q}YTv16eEwso5aOX52ER1QCmBpF3R1EA2zfcFp+6BAvG}YR z?3$uN^;L^4_H!It^bfs(gP<@YTF~WfYQ}>Bo-AdDDp<%43whAfK-nJ)-2+j+!#S@` zcurheOn}_8xE#Q~3(9=ko;4y7tc^2cK#%cZD9b=)CV&h-$8``%F)>C)6}VPJ_AFd2 zZ?;M{sG!wOc|OSRT_yD_O7ix)*XI@z3!aQH_X8AqveZ$9s0KyFvxWHIn3?(PLiHN7SD1gUxLM z3xQ28Vek+V@6wpa8o`K_){&#biLWHRgz4735XU?r zJ$&y;%=ljeTu*vIgp4rO?)_dZ(R&DC!i0|d9lG0Xn_bs`~l#= zz|mlpPMB*o1u2tlw{L013Y*LddVNV4YZ=Qo^{15aDc!6z^P($`_%ruL^vh}3RXP8M z<8^M*)0O6SCIgS_hg?9e$@9h@CgW$hX362)pTH}&5F%E^k17CR7t?wX?DBHMlZ>KHjb~Mw|$SF*93D8AT3L=E)D_=_rwUHffSfqYkmxg?o}3i+s#aMfohfy{uTeYzmY*;nV_L9uTHY@ zmnzG(>cNZp5I7hufXTHO+$XftF?;WIp~z#ey;^$Q?5tPs4gy@34s*uXCd5LXWJ6M2 zfZ`x}j>;r5RKWXPf9Lq9_sAij0|x1kJZTr*8lrwh_FXztIQGZKhsNrdDK-SS@|Gym z)l8DBzt4!wJ z^FJQ;goBl4CGcQpvNu&`YLt-6!wvnalTSN(!VGf}V6);9opR!AB z#zR|f?4!%=L&ASzodIZ2FBHzjp=Qg9u4JLUt zCc78@e=U7=T+`q8|7!tkFkpnzJxWlJR%(QVqzIzYiqb7z0})Uf1W{^8gM=boqohNn za|qHg>E^rl=l9#+d%a%waqhY2-h0mT`8*GB!n6dMgWwDpUdxAIF=_wf13F3pfl#*F zMTzq3g#XIbjAmVx&1uQvmmW^{Qbp4D@r72jb*-;3U22i|#E3p5D7;>&0XJSTi+%5s z0Jw>nn_6m1grfAxIp4gd&do|mBLjus~Z1dLaIZ2`TmQVuWZ;oX-gTbw=Uo?`_#5^m;7;`#j^#e_1TTW zA4zw2PIT__zDuGS4}{a;BL3kk-^|MKO5>@q5|P%TOcq#FL{CyHE9+7v{3peST;x4k zVl_>ZAt2Iy?1Wk#GY<0akYoZ4w{a>%@O)^>v9VgXzC*nS=y7P{+?W;k_>#Ca=(W0L;i$=K?A&q1Q@xDTdk%2-L;?5a|p3DM-Vh=t*In=;C;NLnzW9$oL)Kf7Du(cIK{5iX^c$Am8)_5U+pRT%nUAGc8Q(~;*F?vI4 zDYkK#>3BzvTJGIOhfTYTs@z;`e}7<%}ffi8vOd#L5+)weD(SOLUDwri;di4$-*<% zzOy^^vGAT5bk+OG^je!(%~R8@=RvT$QiO@kl5azNCwvp^1IQ84)ErIXQVb68#v7YZ z9yH2~KANfwD3hzZg(FM|e0d^`5PC3R*5E9U$l=p>8R`6v4|Q;r-L|am@B3$`&pnqOO>4UBz!<-9EV)hO&V$ZLy#2i%wmW|DeAxf`TZj6; z*~H`qwaqTa)4A|`8NKGy8sQ%Ak;eun^LNBERvy8z95Nup2@Izln1^)?!0^8%4Q%rx zR&i5B;P~q^Y}3<}zdxQ0HaKenk^w^wt}VJqT;xED%^o1Ik~Kn%2MJk#05x!A07+GS z3JfdnPr|Vu=AH+6+N}RwTv9+`0#P8-*A10ZlLGg~=9@$+J!cbv!Y+%bv#L-)jRf?# z7soYqR|im31M4@k2I!(^9$seHgLAns=0S05d7{Lykfs6H5c8q}+hwcU;cMEnTg^7f z0PNU-geLk96tD9}{wpz((q)4xRESF9EtMgn*$r8W*-?L0~?y{rb!iP&&~0^W>X z>5t0Lcq?vas!fV+j1`TS6O)n^?6vS=s3w3v_g9X9<6mk5&+6@y0X|zK?gyDq;>_l; z@KNJ@%5#FcCh+|h&LhJm^>BRJ$&(HTU;PEI)pY}pwHjT#_}g{!=~Mh{O-h#YGHG0{ zAode*1EdedGUNc08{66<91lfihpkZ<&%ry?c?c3Omz<+z`4VCZ_v-0aey}a`xy$;{ z+QcnR;NT-1Kk}Onq)n{%Cj)+5B{_*VpOsh?HuVjz%J&1izV!YBJ}b_F@w@b`dFc2#^f|q~VRa=vywE#OG&LAe@+odh;R}#Rr?7 zI+*RiIC)B+7S<3bK}+xAs+jqGxl##Y*)IR!X*<1zH^q=PJt+Df68AvlM>)de`%Lo* z>(L}G2D}f)>md~|0(4ma`R7AL2c;XHLYbA8^eLoeZ&2vhecr3RX(EMlpEq6}IGE$~ zfL~C?a9gm9~mQmbqjt6YtV9BPu_DDued}c|EZUtxNF2}t=V&GG^~Z=PPHI zR7wybC}CYbr14f_a5oW0WD@&!=NyVJmwlNWs(s|xajqjztjrO#(RN^cUCam&eccoF zA?8=Co=^?X;j`OtcnH{6QPkVgVw?&zzK zh@-2WuHT}3XxczHmBo(nUmHbmDgq&y-!Tt(*=hwvt?s>d8Q&`s#G!b95*HmpV@J_v zG`Ojn*?5DZc7=@Qyum)1Si47T4?1bJ(?9WMINB{$&0vl`0id9f&Z87Dao2u(NS%Vi zgm|U-tZPQFy8r>R5ZVI1b=*Gf#7c0g-5KHpr56~D^BBEOp=fD|ayBpD-gemUIOu&* zE$kWyl3ai=KCA-%dCP{wq9b?ysICND>%VdQR}^1N01dl!5{fU?R*j~9kKG%ag|swX zBmmn#%UCq=zB2<`iD}g34QDL!Mzh7@`fAW_dQRFxIBk3oI2oF#VepKQ)$SP7u5*!G z9Gtaz5<&+u5j8Y@z@Hdjv;SwO9Aj@6J;bL0=v;C9fpLx&w=Q}G9M)ev1wc()7!gg3 z#Or)_DvL*77JREx(vxjonCog3Z$p6PH7O+2(I1* z99Rbblg9PrK{OK$=S|E#h+`)MP$oWn-!pk>DEkv|3pBwFCahep$dh76<(Cb-sV@(? z*Mnqfao)7ET|D1^hy!^a2kbWnjx2Ll%*yS-!)_`himqaoPeDF(uTdaInuEWdJHKK- ztT#Oe3#=<{^))YLHBQ;_R4@J>(RufW6@~fxwvQV=jKdzqmK z-fg4}wbltCWKHBUal)~miDg*R1_s%5sltQ$U2*8u?V|M)?@<|g@0P)fW&etw(?&I) zmbEy`g{p(;k4N24?)#M5%jmId>EL!K;`7n8H?a&Li{roo5kCo9oKw;IJuue022o@8 z(Ycw7rRkx_@A!?;y7W9tPIYXCUsFZq$(yBgs6 zj#*i{+4CQ>t3?|z8y9(tdR@!L8^0Q!eLIulR?x}Klyba{N0s&_%1hEy$3$Z$!T@iujjzsveqht!}7)0oE)?0;`e zWIa#8`m*uCz%C@au%1fkaacIC(kSNx6~?81sNt!M=1j zACYpSqoL)PMq)*ZNrkW4`s*AM1Q`#iH1O8*UoYK>fYa$`9M>Q8LX7O!olq*IFn$;e}&O zX2f`Un-WYUOY$^PW0PM^`)|6=J{@c^JiT9Qpzg_# zzYJ(sqlrsDaq-Heg&TmF%%}Rc0V6>83Xq18C{%ui^a1<9{bTQ6_*}jN*RcacC4>nFA-{r&z z*7A^kN^t0WGyBTB{QhDVt#&?8vUgP?RzfsyVjM8S)#|PvzYgpdP%`kc2;hylt_al{ zz{en!_lcAYvdXF4y?qMlM zidqf9-E`+HTzI4Ge=-f+py(H+0ySQ$v@+!0iaY%=`%?G|y=PIqX%hn_e3&iSIP0mL zA^QDSe&5^|z(Y1w1;&y#zLJzXZJ~G&Z=j z6arlS+;P9*+J`43oPgaE%6h039_eeX_SBozJokAeckYv=N;Gi(NI`%S9h5K5`aZxoyg*+bMedA^7@)LFo(Y^4X3A zzoSMa0djpXx3UuATL!D>^!Z!I;BpZ-nxtNg<=vKSIO8)IBzT9Wtq&)DnPOAc!~bRh zp^1mi%r0G2M{W7&;AD#%tZHi?wcc$05WJsG&B_<9Ol1IZ?Zr&@{Z>*byu6NaP!g&c zy(&nFlDc-|d3j*+YyO8|)5#mXvZ9V6Xn80RpZV5lnp6e!9pajdaGX}B#dA^lw{wL( zq&c4#`us^(PKt-rW+TH&uRrI*=oA0!drhgK!mmw3-x=nJiDUf=@diWPGN(`wR_E^J`@*iu^*5on+1FM#~; za&PC5Sbs^dYhRRycDv_th%&HiN)a5H!U-Q!ylXCApe%58>w~MS{a30v4#NY}#P|D< z)ap+F3b*;--!%)&`3_&JBZg4~^DxK>_9nN~sQeSOzb|;KExS?DMsdf}Y(z zu$a0c%2JaeFLuT!Iw^L1k)()&aHHEv9}pgTOH#j^VR&&d^;*VD0!T)5=w-YBO(g<| zIBM*ENdvi`hu<@f%e#b$72*{)9YCyY0t6(c6p)IhZ^V#^2!D2e9_-vVY; z$N_e+T@l;&4+x@Is7&aU^gZ+3n|0SUzzl!3L#yX(!`cVkrZk6S1Eq36Ela(~VxUkYuq@0tb^oQE9W?ch{k)jJa~P{Y)sEb7l~YFy6kLeGhy7ECsH?r{J3 zUEVwsKK}`(12*@xMT|3*o1T>^jD_A1gtCOS!{wRR}tcimL-JD;-8Z6Qf{4 z&g4oNa)y}Mf$*sai3!BQoYe?f!?8!>*TI}hwAl0q?oX(%d5H%NYgK&2gKm&v*Vg_z z9X_ZnUGm+`A=b%0$elN1IENw2p({Zrcf=TQTqJ1`7ml4rK<|8-Vttiaxv1fNmpdtn zp{t#gZxHEo^M{j{4|EkUK!wU%E``ty5j!N(wQ)TiqGjWb^Z;LoGGZ zM}^A(*PyI%-ce%cUy`Dy<=50;=l&5e;UoWc+D{lxvVt!!e9J8maO5idJg$1XFdo79xi3XW(_2{$ zc3`CVdI3@`*QEmN){RK8bk?m3QVg!O8mBKiO|K7LSo&NJw%DvULu**ZJ#bs2z|10M zW&U^0YqG}h-KOGiUG|{Np%fLs3xmQy%tEv5C}vdgpF%sYoCTMFcz#fNB;G|RrzQi? zh=<;4pY{FdJQI1W%mp+UDu4OFNLZ`n>P8ct6$-q4^$u9A zSM1nAZLy5jJtTAFBYRmF?T-R}Tl;eZ`G;x65B1VFCQgf~alFtf=e5Cj7rzoD05(d7n1a!5jneq0%tgaJ?YebP0E-!oUPWWu(4a)aU3;kkiOq$J`V< zn^|I0QTzEqkHQ&+{xb`Zq_g8x8rOFwmaNw0F;i(QDJJ1+4@5(ev5Jzk*r|QQDyIhS zg#AdTPLh$PA}~h~)^4yZn>5@;^}Tqg?}^ZT9yT6;76tmGu|HJ%^$9O6L}C9e{Y?Nw zZB6?A29c}~a=0&V2mNJ?T-}=8se5aAcfHxkrwS}>ZCj6z0~*&+P##B*kPUu_9s9&P z!3FS?tG~U99ofGJ_DCuk)l29mu7-Am{f&iY+t&;S4MofriEKAJOC#qaAz0-k*Kren zI>Vo(BxcO!n$zE%XoPT0vumwp z1ekws-}3B!_ik~{Fder94{qCo{?j`zd@hNQS5vkO?1jrtjBr@vQ3Il#YzW2M}MEAg>@g6YLQ%lsLQrL|l4UFNH`x_7kBm8}*O;Q?Z z?($+?zTlSc@1HPMkJhhe1F(6_!cPE|a7-70AepfbQ`(w*-3;n10JbsN03om`7%#Kw zk$xP!MWILw;G=;-a7s^a&U&ZkQZ`*zGVIo(oK?aApFul{{2i?}|8|VP_@=5IQ!+ePwxUs|HySZh zWaGv%k8YTA<{Wl_9ZxatoH($avlm!+5q>{ocTpx>-Eg?)`=9D0JP{}BcI1g4?pqVg z^D}qXz#86j$hkiSBmit4Iv6`Bw=#ZzJHKdT!JGb*Hl04a4e38kIQsKh`|-}La-LRa zV$PPNIe>4JUKBT=2S_plWj(+k}5U%ZuO$mSFCKFe!bD~sHmp=L3teB2Bk0bd8J^DP4H(yW!<#G+FdZG zZ#9SRk6CYYE@EXDt2?A)rL+q-WFlxnL{Co{X+)I^BO^g~C}R>i!Pm~;J>u+#JOtHP zjCxBTUE`YM8=2kroz8!#XoEVxRQ#>%*=fQWt6wjE5MG;ANfEHt#9$>qtwmaVQLYAR zOZR2p3AUBd3p+(kFqYkXgLscnSYxR$6(h)ywKp?xDKHHZC4uUHZN$~#Blw&tX^w`v z7S#7&k%wMI_+Di0C6=Lxkt*c5>k&`)^lbr9?`IJ7_=Y&y=4FuRStPW0Q?^i_Hi1C- zzN2G|S2`+Q$6N4sOkRC?@v-i$kUzo_$r~(ld*>Kq55$N-NS8NWususg?hT{qv&dL7 zs75P%=gy_9%kdz~8TH-snZ_U&zO4QlYF=nxL9f5uS&B!j{dEEYZS`B0Ipk?pj!7?u+!5AEZEX@TBVQtG`CyOJq4F%22p0{l6*)lC)v21YY6q=No*?6N`O%0K?) zsc~weFPj9#k3Y$MQEyTR34ZT)@u1=d^!Q^}%l0R-6HL|;1a_%BKG4ri)Tu=c?IO8u z-jTXplV;533RV4f*4IYAy7OGs^0OKc8;otM3i$>|CxqA$y`jAQQR@z*Ifo>*c{qE` z9t@&vTR|DNhp)qw^}gvdGWq-pYlm?vlMz;+6I}k+_M3$j?tIe=ouT4_cJK82p7k5ZfKj!G&g^Xs-8)W$ZVw!k0Xq5o|*kfF>=W6a`2n2~TZ%YG7z-T;(sqe<@TSQ?cTvxyg~= z|FsSbMs@djZwB^l9T-*3rxZ8xil61yn8PQF=KSI3`H9IZ=S@YZ-4S1nIJq+(*8S_D z^T@;IQ9M)7osx6Z(H}4E0@B0WgiP-LPA0zqfpmA*ZR!Gh$kMsTcM#P73XrBaC98Xh z4WnYRiu@TKfHdeyqqF?6O~V3 zP!>kr(S|{)jhgj<9emqw$C8y{n4K)EbbksDo_i#=kLXHR$%t&{0u}wy5<@--@G=Yg zr*2^O=*N$rYaEBj}eB1q}0nD)5_M5GxYtKNBDm<81jHCVO0eh zspkIQHa1heHg!jFZ4lzv)SHa`-6CKCbAF>=`A2&c$ug>9)2i zVOl}iH2WU3g^yZQV_LnmA-^?mxZ}*k*hEWShB!zO$-hH3FAP63RtappTE1zSz9320 zSO@*HvwQLxCEPMkWxPX~5Mm=V>E&FVi2`%Lp^kpi(}OAYb*Q)bk^d-$D|eVB#Nt*q z_t=A@L9@(kFYzn#3OfhBk1SpnoGs69JoK7BLmtofUmT6|t=SP5Of$!I@X$4)%I@D{ z7o2!;MOz>UdJeLpg+*j5U4j#=G?pQK0=Y2A8ycNVLu*<47P0Pb2{U(nw(!Au-tN&? z&pV~DR8LZv!D(Fp?xP;(E6xXzKIy(?##wtIpB#4j`aaCVMg0>!(vg|R4R<-a3^p(F zPwUqB2*}k0pgYKBJ)rc5vM*X!esinmhYkLNro1XuagvCINtU%FVPsC3VO!v-U*>;P zt^ui~sad3`!^{g?V$0msErXL!$ZW-X9>~bxG|}PI2?)mp(WU2<9o8tZuaO~DOK*|2 zcw@hyHFeSV2vwV~&&D1E6kic4dl_E12w4>x->2r=I^NxN(wl3xUn$YOW6VN;%#{qD zjRbwHRe^XiU(brnxuv$8;1QST9Tu}wc*?_ijHXgZ8Gh)&13oD^LrFw`xV{-s96xWu z^5QioAgBSADEd>tweq5y^&btW=ro@|T_N%8IxoSVL^wN=Mu|gDgl_fgMUDa5znn&>rAF~e6g{sLjKf83w5BXfk@Z|8Bgb@~3Ir}gXJtX0PyNY?UZ1AUFw z-P^$yG~bl|cQr4SCqTLdEjT$dMbk70G_lG_dGr)ETy`X?(EcYf-I16;5iyFt0Z>yR zfje+DXH@H}wkX=+>SDq7Bd}28hXC*1FrE2+|I;OLGUaE-AeZKJacW_aNGH$|(rB(C zjmoNGXjiV!t6-M4-96)p&tpbCjQRdCk!5zcPgHdG+WfKCg!7KPub>sQD?tFsvt@Pg z=uP7P7acuj%p#^~-k71nV72W-8Lw1{bX&`Kbt=-+ri9lwI1;))lQ~)%Xd=)z-omx( zAPGZ{tiNrlbeReiEr*INezo#ri^((vmy7>wSYmwpEj&}~MT)F%_?G9epqtMJz&bVd zXg$36PhWfnZ-(EqL>zHumAp z;j=%K4YABhP0Ogw33pWH;>1IbgIQ7btWPCe+Tro8=9ffk?OYN|NKxb$v#%aY`TWmX z^xMQHEOl=zv?)0Z=#rYu-9i00(}hYJ5R0z>YhL-pq2Zx`-Kp z1@Z#+m>QOKOo zsQ2b3BQGYm*0=IzLZ&BS=MfZFPOsh)JKS)RytP!sQ@nQ`uZ{{&h23D%*K>a7sNxJZ zG_5ec5!)WGP6MSeEa|NiYqY&VL&78|AQ-D;k;@qdq%--SLtIs##gYfu*6*#z(mCA4 z7CZ;Jx@pgcFvhId!zmjLlhk3K?)!X|$MR>7`Y1-@T1uT-B5wWHw1*f*D@xwzEgV{P zi*7xB_5ifP4_TW@!X%e4^_Vwv`voc?9DjT+)}oz}AiSZ!xI@Z)gfpZ2c^jA^WZ8VC zS|C&g+-PRSs5AxV3>tViC45myd%jUw%0>D|g4L-NxzI8(>J>$%5Hr<)tZ|?@kEy;O zt=Eux`kzOLa>&p$vbm>+8Je8G3>Eja?Y8F0|JL{?RiS7mAY_Jr_%-LS^uK}yT~t1`3;G&ysX||yp6>`c{)4){#2USMosEe z9+jD( zjopy~*T)q5q6~Al6~+$)&$Tdi@bJ&7B28l3<08%;J2x*fRLsrqbZaz>$^EBD_r*CLeIr|Kk^hXKN2JUn^$FO6bwPI_j1|L(!ewdfEC`;4YKQ`Mcr z;BH=CczpNQt7pBp))+)p?JLd)&8GU?AN{Gi;DH<2DXwZ>zMBr_AzTf=jq)xb_Sy=Q z8!F)B;g+fYee@?m!@!cPSrT%hYo?_?Dy-ZE#-vU_(y4pRV<~_IQ78ey^yuhvHzSG6 zt%0^?#|2^4lq;qS+=RZxkJdIoYgA+dMG|Nwze}$jS<#YO&hFghe_yA{ej&oO8a%$1 zw)XOW4Y#;u0PhvN8vI^ow3K563e@s`8|f<0!h)>DNkYu=gI z`is@tRLHhu7}k{a=kOZzVqP{-yy?~=G(IQVf#gk(7#>?-Rp;&e<%$2jZW$0g>KWti z0^R$Sd7ySX{;8&q}jv=Ee;Op%>+_ zL&=QhBDa6{MJ}*X_DTkv;#S74a4Y_qWnldJ>0M%*9CnSl6Ncm%R&R;G!wcBqitPVy zA7=?cq9VBPs`&YrX9{!=;(ML!wl`{Tf<(G`hZ%UfH!^|_-Fo=0sMqxJB)$sf&jZAt N<~?22GG)uq{{tA31VI1* literal 0 HcmV?d00001 diff --git a/src/assets/images/eye1.png b/src/assets/images/eye1.png new file mode 100644 index 0000000000000000000000000000000000000000..0bded339f0f49f4ebb530dde10d07c60302e4e8f GIT binary patch literal 2910 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

q?zw1`&9If(fW!OVAcpSlr_?-nE$e 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
  • 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/history.png b/src/assets/images/history.png new file mode 100644 index 0000000000000000000000000000000000000000..7cc306527a8cd9e7756de3befd8fe42e5c6dba2d GIT binary patch literal 25987 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

    C`+cj?aawr!Liq5z){ z`GvQo#ht7`2sq&GH!~cg)#&qqjYa>w$U1XyJ;mp7S-qnBbHFdz!wrO8CSFr8d&tI2 z4=mt2)UDTx&zXJ^tkj0nLHGBVXs9;!mpAyATXx*KUeDR&HFEd07NPgbh=e=7J35Ho zycKs#F3Xr{(~XSH?!BmHcKa;%K8=3%=Lm3G)AC}j+{;a9@VwcJ4bJuQPEb}m9-JMA zZI6w?raA;Z`#BzEHy^|y+6~94p56;B4QkhQ&v&^$6eqa7TqAGdSh7)kw4KLIlc5s7b{Ys0W71qT zcXX|(yd4GK4g8+Szb;2w8MKOP{Bqbp%0m|662QQ+pJdytevpRU{u$}k%^#^A)N*?{-L2aN zz=-=lZGCrGRLSx-Q4n0BFa{7L2uKo?oMvIjN>TwODY6no5N1FaB)O~P41y#HV?Z*3 zWDp60NDcy$Bo8^~@YV6|-o3x)`Tp$bbGrLfS65fP^%iWj9koi0J*M~iUV|pQZL*Vv z&-wuyH|CqZ#5(5De=tjg{kNHG+h1w*8yt*#ihPlm=RQ3RcFloR$wvFn0Gue(Xkc)u zl|_Ui=Q}a))P)i18^?CXGLII|iT-u6Vsol#`<2)9S=W9*1bDKSy!W;mOvUY;ckKaU z7Vfq>actxtF2L3mI3at(Zn@b?Ydus;`SBv%A97|H{MU2x;^`)_|Gh06^M-P-(Cm1! zOM6{_(-^zIWCRm}L3RHfGE6!ckEO`Cs!&E3jX zvK(12R5{q9Q=CL|c6Qy7VEQMq@dthI_L-~qODWw67DjT!^D zPFYQywj$X_eyJeymKwxzdx$ofkR<(urX&^qc^mOWb^Nva-t z@acEh{dzmui3G7&%P)5N6}?kio}l!V#^R$h`Ac%t{@@r0sgJadNKQp^zeRZwTbh_| z21pq>CgWgol7(IUC2WVsQZ<+>Le{v*!fI1`zY};X^&A#{F#Km2UK{&ua*Lh1 zLWY#z8JwEN*tv6_{Dwoa6KE2%9ydoxl!f)dw`#Wneg{C0meYr)EnEIP>h&clTP*Va z_Qe$Mxmm#%WT_6GR-@!S5t5y}#pWUlSpduUkKYqPM-J9`=+~ZSAZC1sr|Y-+_N?Ol z=9V-yt~g~{6t{QY92<@J4vL@Sw8h|-7qKSLoBlBWt@75EWt0ELs|p#I{gx7cFq4{W zxNw7MU}~pHYqM&(AQ23KxzMeEb(8Nh)c)&PAmx6z2&BP$o3v^;dhibMncW}Th>vn# zr%*HF;+i#QM6P|*X{^ADg3$89y(tXAy4KTV@mu}(m+kL@AhScVba~1^2)w7)6#>pT zo0iC`e?L?XA;9hy%UdU?}<=e+02;xx^Y04`*3bVY4`ES z7FUzcwc_ly7WuLmoYq+)S{Aggt5?!6CTR3fawHmo#@r&TJ|W1kl*JtJ8HM6yo4q`k zyWdKJJ#s_$Xx3_daPu@(nhzwbUf4~%9*SA#1`tg(vS6b)CkT9t$b{Ttxaj0KrjXmE@UMY+$_`P$#>5n71 zC&CNSf#S&Y9|+`Z&L)7^($d?iVR@0QF_i~(GZL9!*IV#kQ$2!9qgBA)X`nqfo38R; zV7O&EGsAf@4**Mpuz$Fm5!MSE1eo~4`Gx$o@xd$h{*{1z`w8Hji+mZY}7 zLYGZ%&i&ZkdL_3TsC(vGKgZG&e#xPaibfV#Wx4Xi%~=K_IskSg76N<#arGLP9zx>5 zBy)z5ab$aK$z7i?13>zO!#7^8eBHB2t2B(n(z_DuvdwYYG7A9od|p^L0GI|49s9X9 z`Hg*jso*zkGb8Tvf~ETdVHFau8a+sJnIh<-!^L8qJpdtkw(A8@a^L2uu$wsFs(Jj! z$WVZI*jQ_uG{ff43wflb8^*vV4N9IN&) z;9UQpqhRb{V}2QbOT(@>FqCRn`&D)6g3?xq(q1yV851Jk+{1E@u}u15<{007N78|~ z>hQV}?IA(F5iNx%2MP8UZ;$eG>m|s^=_pW@>pKbeU^hIuMh%f=cd6%vR`5&9K&F6#S!j!`-2t1PYy zjkUHM!?>#dj-;h7n<(aI(Ob#F*$A8E`>whXH7Ea*9S24%9Y5ESPyA>H`I`RE-qqKa zE-(>Ya)c?nFFjFOs()OX`-G67B1M#>+_Lz<(!uasxb9 zKh}<9NWVDE51Sx9ipYaP0yBc)zy!atY2XefpEQVVS2*jUejCgpKWTYs9ut76bzw^! zfk>{+ILipQ2>`@xuNm8Nevk!KLjPHpAGxjg|2|zcI*O znVtPJ1Aqs}-c)Q$k0oYl&b-l=D?jNIb8qRw&%j^8ygT;8u!Goo_EZ0w*iMv1-G?sg zbl2Izf+IONhL(^P9#pE3eC$zlUGY!vovy_Zy@fX&rY4E=d6eTUbfGB0Q`pq<_Xi63 zfMm`O^gRg?_Oc^3^{*LKl;#YKF!%UAxc495_}j}U!Rwc4HRs)|SSmR&vX5>l7WxxH zPUL)K()r1)5a8!T2&%~&W+@4X7T^2Xbl{35oyp@CJT+%m`ydo2wtJmG&T;n}Wy+de z69%6Rp>Ca20%n(Kqy>E|5d!gh8!tv4agxZ|*xf%54ng@5`iEagIdW&It|5^jsIUwJ z3Hytln>dVYIC+C9Nf~#l`#N`Mp@t|+CNbJq4CS+!!MmoJUIdEkjyPB6Ya!moc!=-#W(s9=F)~;0#6UHM*@d!Ul%m9 zmr0^KqxhyG-Qwc8g*$!8wsViRv$rjdzKE)0EHmXvUSEHuz=6n8J{lI<%9Tl+=;t`t zC3nJKv%v6t{7SATdtBt{)sKi;SXB#x1$k?ASg{hjvLJW3QGeuNcfY2Q7LDR5q&5g! zsC7{lFqp1*ATFbqe*d}y1zZu zN4=QW3aaF)Y^FL@FsgM=ghRS3L7QsEpF*Abl}lleHbJGv?BTab1Mraa>TEO!WnLK9T6Z0}r@ho`!0rJu5!kvt>6WvG;a&R+(Xwl~tcGCL^ z=f1)%OSNi~0bfPyLNZ_kB7-<5%I)1BA!XqTMka$S#N!-~G?dHXfr4h*PpdrA;w4#V zsjy^GxVo>SN21HZ5&O?~&U+HHL5NW>Av=3|-w#@PAl zatgQk36A18!OrVmWGUBW#ipDyAVTX4WxONMlQ{U>R#Bg#>EpWQ-@zWxq%p%f?Y>!P z*a?dH48Ctm)^(m6_+#jjT{mF70>lZB^=9QEmI^g`k;zom@h{!eEJR##53cNW7rdzD z_Kcd-2%P#zd37D&psAI6H(tbhmFvOK&N=V|$9)OFQ|S(C?IX7qOYRn00n~0>jL5q- zghcT@1dMb%9_9dOSBxSIGK@Dn>TxH(}%9x%+#|R+#Q6w|NMGH?L7? z2|l~I{zu4_+p3~!djYsq9WfrM1cwn^3IW!YTcmbIKp=un)$RKCiZ!K(s8ZeYlwXl( zdhN$T=EZ_Z~3zjDczV>@Y~^5MqN<{5|_}H$aZz!^EB*0hW%Vc$7FsDcw)<%1oTfr z-eekL>7vnTnM7dbI57+8@ynSfYwn+C->|&Bn3kX++Q%F?t;EG-aZUHG19Qp)gOZW^ z{d;L9s-i&ctoQuWm6K`rWM_TQz{L73UC!_aaNumS(h^kF39(mt`O~ND@M(O95QRNq z5(s}F@FcC^CQg_Syu{ZYRS8n(d!lxC=RQmiVQ3}{0fHbX-MaEw2xwj= zWj={+LI=zMbG~OuRics&Y{d0>xAYV7)oR(iJK?Zcu}!jxuT@gR+W6S_K-F=b*hm1> zD0*+_8ct%Uk2ahSLfSD1eKnQlYkDhHKv3pDXa2f;ENf@3n_Sb&0zN$d2W_}JEPdru z$KxokJ~*Yrb2HqX^=z0ckMWwg%h-FO=-$`3-S)Ezo0*2$5C(X>9EFH3C?A+XK7PqiHAAmtFgu86!kCM`zGw}#X3UDZ5l9AD+DNB~2B69*ce0h17n~hW?*--dcNE%~Ua>ToSilgO9svGIhkDN}~$#A3UbejRgVY~2|Rca zQw-3rBhKrTr*Qebz2yRwB!w*4v++1lv%nwXYF8ZhnP$lfW zSz4FTafB5LzH8@+^$g>mu0hBV{>=E|>}*EMThZruplh~~FGrw9Kw!3Br{ZOBp1g3+ zg*wd|B2A@zuY7>UT%~qNAt)V%`1eiqqY2#n>}^6? z8)^orbYu!WXp0)y6vGa)JyqGykq)-zDF&4hxRs|5J=7Rxj^ADhNh5F_*Gu6wRy zKgRKWsso1$|Hpdzi(kLrlx>Gokx*w%C}8;H*qFQXqnxmCE= z)0ICydAf~iVh~u6^Avb0S7*ipg*nbgQIg@^q@goboKPDXXFFnsUy#Y9g2)mGXzZnt?o~vw2KREbHOQIpSg`)nZjq=uzlK^;oxk`G^_`0A6Dmjhm&WH{ee!p9iVM~+3$!<}MTBy`KABqOreX^q$n>$!te>&g z1s~036@7JB6MzFLCH(sMM*Uf>2X9;59XRhIm?-k{=J6W#oh$mjp&IIOvUJLosrZ#F&m9CMU9rx-=ZokR z-7sN7p_`9eMR1mJDR=R-w{NS-;4v3?wrwExLVJ@cxj*i&_e*k3dTre^+I4&5qF@^r zc6{l;YfI?aQ=*V9Jr5ZkKRl)mZhcEyauO{@VVeB6WQdy=yY?4it~37uV$Wh0g4DZE57bxddDFDfUD*kK-onQ?Vg8|oDr{l zk?Y`N<+ct`pRG5V69fHqX>l(uHV3(IB`H^gdn!E(++b(S7yUrlK0taObXhSwx>Fi- z5P`zQWIQFCE$$1)3(m0jOK7D;Nk%9O=-wt%paSNIdR?lJcL2ajNQijvdjn}3>e&rB zmtQzJ{VR_4e0l+&b_;f}d7f^rjV(t)M8Hwrt?&N9yMrXa5${NJ>vlKyn6J(d=f!qPJZtGw zPS>WYsa8>X%yUQn%I>jit^fzOwY;9-YE@F$X>%_-UB=3oKq;%rSIFNI&~i5DskFQT zYs<|It#eg_|3e^-aVfZ2wo@vwPQK&|=6SKe{0qMktv{=llQZ+oGun*^!*^j5liI9v zRsyYCpdrH!u8Z6IrD)X5t!XXaZC>yA>Z#UwDh{)cmu_=Bw>t5>@M>aQ5RxuIau|-j ziYzTFtiC!K)Iv1gX=`d}qw#wgOJRw@)j|aYI+0FQKytR;xvreMJE@Khst#bu%MHTdbc3mpMH{3gsp0?@*36J@pYZ5h@Mtpr&3Pv8KxmSZ=Thb9M@7zoW$s z_-}m9eh>N1V!CWGrYLf7u~z2S`{VYTL<7%E1<_%!TQAh44#$!E?Xf4Zd&g~)ui76R3)OhB>ao3Ws6_a_>XrR_ zN)QfHromTg%<-@uUvy$*5y;v=8e=vA$ZAHo(lt=?y@5&QBp70(7{YcKiim0)<~>AO z1ypFM&pLC=k|ojoh3Acbb))PujVu|K7XfB~kz})!2a`EXWbee`A1m59woLDIDaAez zkI$TT0b`FMMqlctlw}Xyu*1xUJq`P0+5!^?byRJ)nVNxX2O&&d#Pw-QyZfnE1t((_ z*g9U*^D@muXH!vt7p-_^E9dzeBH-NaVKUUV)WH%y2RB0zO;E#U z(ea{}&tUC`V|FsJJw0Y7;6SlEpCrNvDwTz6v&}`P=7PK}g17w}>n`q(&2Cx#C91ab z+S^+5!fhvW)HF2?oIwVc;z)=ZWk~5X_m_{iBfA zxEt9l(?u1gml?o4XObq;;0!=8SCptVv$$L9WymTY%okC%Lp8t#Q2n{N6xmxWwp31! zJu!iR;X?a)8ABe;dS~6wh8?%QKDgNNJs`#b;^GV~AJI8Ud?y0(y8{PYQgruL$SDQlBFl@p8D7p{KaMMNuhA9j&CJ&Gmgah& ze61{tkufS;`qkIDHbE$dQc=?xB}*cR>}FK;!tGIH>G|!0mY;-C3-^VnbGD3#h;@9^ zwFyxZ&y+U4n_yj_VC2Kx%{KAoZvUx}6x}yPb|S5eGh9hzUt-aG*+JeH%su?xs*fG? zyU5k%on&TQvA5?)7FuoNBdffcvmyS8{({wfh$WU1cah7rxZ&<%*wn@HJJSYH@E}3D zm8&(?qmCiG+(%>~L9IsT`DfF_>w#-I8dQz0C#)9JI!bcVx=%g5^sC}*Po&3&v8mXIqUjpeAB06hrm%#Hs_lxQr}XF%Nvr3l9+&>h)*2}cMf|OrgYIr$q>rY~b_GeF?tdF@E?)V?p=WGuuU&JIR zz%#L2>}a8hgR!m?TM_=oBfER=j3(8us$yd*N|n#)w~fh{UiuEbtCRUjBFR|lJnGFCbE`U%6Q04yN%W^i>E{h)5# zH(8kOQoD;`2PtA7klNaH)60uwBtGc2Q&eYX&H&*LvC~jPOMyRs>MkDeoF12W z6GsAe5UB+wtJDiFha7YJ<%TE{T=2ggV-?{@2Q^N-A&M+34(ZUbzNJY;!Z2eM%tvL+ z_`ieyJPm{Y>Yy=Z{kNme-4>bkR|lO<(7%I|RpS0TIJHm!bU6L9oWlQh(3r;j`^H$s z`hPo4n7;U*jzrdR5%|v=Nx>_CgWq9cN2h?meCd3or&a!WBZ$PG`hQj>V+1q~kVTZ3 z`AI!zkY1h4FX@q)rL2kNxKNXj)XDUZJtO1&0~syK%&?ObemOm^O3rJo`k(Prp+p?g z#g_lSRzCFABO}g|jIn{*^!{ge=Ac#4M}oY`NQAm_hH0o1hiBXWPYe2>&ibD|q-FV^ z)~l!U!Z!G6+K9RL{n7Hh;a CnG8_? literal 0 HcmV?d00001 diff --git a/src/assets/images/info.png b/src/assets/images/info.png new file mode 100644 index 0000000000000000000000000000000000000000..f11f99694aae1c743899495533965d61c94a73f5 GIT binary patch literal 1771 zcmV;P)PuVoCRJ^rMeGA4;gSl{3nYP-%Mu8& zr`eMk%rF^RoC#M@|pZ|9piGv9yCnQy*xW`Jdau(Gk;Z=Py`G(#Y?NFmw) zu>yd1wm1&O5mp#h3YR2_6JP8P{@bd)%NFvhcX~H6@Pd%^9Gj|{NSIYFSJqqQbU199 z&@>4E$QmZ}tfAtGbS9BX*_f3iqRY(uJ|O>j_`tUBmtKfcVs}sflalB)X5Q-cxH8R+ z0Y_kk7d1W)#3Icqr7#(vMmQSBmFwerJejr=(P?J9et7@3&mn}m??Uz*>f1~Z|6s-= ztLkgHt+`Rw`aGpJGlys_fsrdW&Ff=PA}P)o%6Rdsmw$P-ls1YMva9=;=5RUR6iU3b z((g6f*F9*fayv`+dI1v26wVD@$&N?jk_CFIS6}_(2hTrm7ISY=LOKuj*E?+DQz5Wr z^Muv~cY_YqX zc5A#{gk(B{lY;1F;5+Zmg*8J~DP?z(O5Efo_103-yqx3_9ukE`Bp6CdyDKBg6{SIAg5 zWxOSb9tpO$+O;KqoeH5z!jAS9JCWGxbh_RsRA=5$KYr-MCdqPO+ruris;<1~WS79& z+L-$R6*%>p}{1@=8e zu*h%jO8#`%dp3#cE6Yx(96Kbvg4Se2zQUJ_oR-w*0yF@VaK3 zX{sH2dwM(b?Q?_>$?m3xfbzJ?U$G0t2P;BGmD`D?20s(zpYrXug*@?A|9X=-*xFoQ z<_j>x#R-L2=FW92Gc!-DpzXm1X(|rw?K!?KXS*HBOo`vrcwD-#%5BNgt((Ay=h@Q9 zp2Jt=hR@^DrxNL31Ly+so`_9|XPX)VmgXP237iiroDW+kB1coB->ymVZ0?!>;PIa0 zs|@DVb$*|IZR`_5tw{#xtuLov@kkUFNkx}h+SJt}{sPTG0Bv{(G1DKs7Lh$-3 zk0&c23NHVp5^53%xaP;Gp@_mz#F_~&gg}+cnT<`S)&uxV0{{hT^}1b-MeZ${ND>IR zfJX0J`)II`_BZ z=Y%FT5JU}dC;V0}PqzpH0L5z3Ff0!AOMqb-P)bFCSs@HWGP=Q)b*pqTS<_^t#(~_c z#cC*)NM;ti>wl1VEU7DqVIU_&hzrxHj7{PGM;fb8N+FR>+d+H*m=$8MIBqJIld+8!aIOW}!lWxXqb@MIh|A%_nCAv6KxWxs6jdslCUQ$;x$E0Plv3};5-C?Kk*thoB@jy_5lg0=On5hEyDj8MSLgx}^^IJMii(}!bfzk0O{@Z_B zktCp-h1aBb8O!eIttiGLF-hRx-Cb62cy{;nAF@mOeP?jvl5Ha_Mk<}b*L~mVS%d$4 zobk0$en zl{-{(5BB_}cZJZ=!Jv&AVS|DQAn%xyfC?Lo?+N^^vg35_qv-$S@gGKx0F)dbM&JMd N002ovPDHLkV1lvGV4na0 literal 0 HcmV?d00001 diff --git a/src/assets/images/key.png b/src/assets/images/key.png new file mode 100644 index 0000000000000000000000000000000000000000..4470abfe84fd7abd8d20072cd340ba1e434a5a17 GIT binary patch literal 5428 zcmV-470c?0P)22!uO8j!m-J&1TP;=lT7ylMvKeZ5z-&uh+h2 zGMi-Pb9|5InMd#m8F#LqibJU1olnm~V&o5EwE+TDBH163+LtPDZ ztJkr82lxZ5mXhCB)iUp2A>xP zfzVj~e0+JONMA0v?WCKQ@Wyjb^Xh`PX$zCEEGnyNnfq~w5JyV&ndMv?@8qttzVi(( zx}gflMP-_4-taWxUCZd$yAf%Co#V%_OteyD5*gCT4E}xtC>S=Lg5hQK8$1D--bwWf z4>51{t0Yrw5`w8f`$r)`91+WxiJF3<{IZ+oE~DRoailudvG?s?)3RkXrK9_kKTwia zA~8&j>nK!4qg;hn+4Fcr(-js(TQX>D29BLh@yL@=of~=P55MM(rOntjr&ZOm^bbeR3|!a8(25JOa|Tei^gia?zY5FZirF}Z_op*3tuW)xDJG{-pk0M>6{xJ*XpMFi+SO>KvgZo4t1twh0j2QgxJVqDwyZ^? z7<%Hlj2j(i#albSS}}y(wFg*##2s+O1o7^~Qzwm{arZkS*|C;&k6*+wQwB0%ln*!M zfI0|XIo)8h$}9Jv1Cm`XOBc7WduI$Mtr#*ihqCfQ3JZOt6PieeO|Wn{1CBk7rp@!Y z=T~oGnoI(!t7_3lgn*e9+*>-RjaH* zy)bYTmMM5;VKWP!Y$UHBaBs<=QOh+V6>C3G5pE0LaN@Y2IPbi{B9m4`qqzi&hEg(e zB6V-h<g5-M>qv&hv17p$&Hdj^GW91B^=D`X^OfIBkn1yy-v~tm|ItX5Q zG4EMFtG;5z8|^HZ*Va1iTi1;I+7IuJzV}{Necr$Rm=VU<3oaNUG8sjrBbUNq$J4K5 z0DrlEj^3~-wxp_-GvE7nvM&j!ss*KZ?vm@Sz{(lL_P`|Ky$DYlSwAH z@Y2(S)|^pU#uQJKzE6UcWl%Pl>9)!DueyH~vBs6`S^f}Xzghwr#{=wU2~b(UxUP59 zULwpoVCAwf4Gq2pzj$`@pBAs)@xFUKyQCU`)5n$?nPk@~pZRPq(z3AZ0MWK~@&=5= zFZNTvEmkpS4G$g`2UOL9*4%RbRWksST}y9gDvM>06akOln&){+WQAr1(+=Ht3iht3gx{K&m zUuEn6kfTftEARAKcQ5?V`?fXhpEP1*0ZRCgrVrD$v22Ho>qol@CQcecBFT(CC%{X7 z)5cBx9{@siFH$_rJQ(Xe$uCQUR)^*SrM(`&bHquL^N5DqPQT-l$;bZWOM~85xt{vf zWoWH^;ZWO66`voBG;Iu@AH(uvm_Blf3y6ioj2M}RWnxyAF{IB!Ad%p-6Dlfj(@~sc z8-YTZRkjf53AM=?}0M)NNmdzQ!*;if_oOP02 zf7k49iBEeuQabSbj`@4z80SlaY)ZX(0q>^m!j}@n_I;-+i9QzI^t*^Fzj* znUBt75I6`jXjg;R19Ue(-3^d-dv}1Km4T23>(|8j)5H5HC@EQFSuF7dg2`l8vZAfI z_40Er7_HAZ>u8bANDvY!eIO;S5_Co-PBcVuQ3s0_)Ujek{La}m+z4RyQ4ScSGJsJ^ zGE$E}&xdxh_7>U&4z2q_DYVwv+V9N+vf>&b4KxPIH8_5ppWi<;kmYZM&j~fB&rt|U z2ll6Y$^;C<5E<7*nifJBU>FE#ArK%_Xqk%;Eff}6D8-=eXEpoC0QtcnfFI=~Ff5S; zs?{OjyDNc4_2dA70AV781Ze;ULK|R6P$n7IaI3d;j;972NV{#lr4;z(12P9lUl;Vr3cs52E2s|eUABZd{qzR%Mtl2{b(gZ1yhL!!lN}%y!nn@&S(rJwlboO-_Y)mA9 zSUvvyK_sFXr0CA<-45{h7e2rT!UEw#2pgo`b1tM0Vb};GkUg4yr0GW*-qG}X*8&L3 zMp!n6=|>pZO5kV{WB{KLL+CV-h>MgQ=<_lt3^L7I-ywIuKAIsjW9iOj9!G8HW^1^1xt{b2BhI~;D8ITz0V2o z2YCJ6>bH<)Km7TF=xh~$nFWd2qqyz{Eq!QVBZQ5Xp7PS}QC*m}2R?9!^1|@QFzg;z z2=8P1a!4c`?A#($*EWJd*t*q0YnJqRD{M$!*-#ya_}?fQeKH-*7D8BPvVhSx^fYe)to^%PVE7S+=K#ab5@7_u z1D^fa29K0TdjdPB6f^z~h9y|JB1169BZp-+IA;wJ+fU6Ke|;HWAVps3F|;1Y^%S=~ z#eLa?C;iYJ@51)t-UDU?JkZ_Nx4rKIp7Omyq{jh%Ty4?O)=7T)(>9&2ZFp%A$ z(QSDnkZpDhKZY-triKu9{t$H20)lx4Z!C4uT5YSUWo_?u!9L3YRki4Jnm?X($;IfB zDr|Ef1;b8Y-;RD@SRnk_1StJk#Xa@A!DqpAhd>bd9!H4oJYWR8@W@^>tQcm&E#PGE`YER-ITrqT;FtcM27IgUqgrutza6Ug@b+RF)AbXN-RC@rr=?rwT|HAB(@X&?J@jM%EH$?@%A&mO@Ycf<(< z$OXFkbXmNz3;~p<6IB24_2uN2PA0zjBqWMN$qU?j`4svOHJEkhPuTq8lMJ6YnY_Gc zmIO?%C-AyMVR*;hN}FhLu;tB8f^5>M3{86v;G`Xfj+sDY>{K@^j2S52uyVM1W5Fr=vWBTCfSuF(%wR6I7(je00#FjCi?aT>ys{b3Ay$|6JrU?Wjix$EBzs3ppId^s~3;X=_cx4#~ILFPf z@PW6tVdWl8WKB7y|7gPE79PLhELz$+ICku3nf2haIMpLDObdaNT@NYx2A!e(2s+6v z`7EsstzZVw{t=kDgYg%X;>#^SN|Q`7hSSxG>e`O#SP9V$_;V$;4coQ}9(g!LxWm~a z1e52iIXL6{uwniO;(ky(&ca_jF$XK}GekF?2U;SB&f)196@;TPa&t_sy!Tbo)yE)Z z0HM>__XFl&I{V$t1J|C!_FZA_x?>Ibg@p*;K&0J*O8ZFdP0^J~AaoMbRG4N4R0=~T zFp4Zzu5eiVvcsM|85Ia{^}}m<=)JYRPYCGV?Qz+7)?awVR~cSDgRb3ol8LUTc+v{0 zt~rN}&Mp$2o!q!^JE_fQAdm=^K?{Wd#EG@cn>me0EJl8AhTzHVh;>D5*$}5AtQayF zii#wbZQ#0saEGF$S+lo6vu&GZ)21{&AMctbzkgygRlW03pA%433o|RkOCydc?f;b@ zK2JKbf_TG26rK1m3-7s!rUUzEYi(o3ZTFFz_&si7FH$%lyd|&+E13VwSu}^*h_r|K z$z!XKJHAX~i_KkkrSSV%luk3zaVYJ{*pj5rN4;sXN(gEK0iLR=CHip`|Bn$cvz#jp z^z`fJu196s>DW|Bp!7oOs$1Fg&daohTAA{tvnZQ-9I>_6Vj30*ZyD^UA5i_mJ8WIQ zhEPij=g#;kNB4h?)UMUse!C(VQQE2J&90zguc1Kd;_B^9sn;LMZh=#1l} z;{52bT||~oM93VpN})w|ou{t&0_~9)0o%u{KQ4l`gLrbD)GaM)>zp-*5B$e& zgsN&mNU^$n@^Stze*1p98t0Q}dXa&X7Vwu_zeQWPgO2tv-+yo!&W=mbZYuk#ODk{^ z*poK$^#6UGws4eKB*G6LU5DH!g+hGmh6fp- zZ>KA^li%Lu;`dYWL3?;U5h38k{p3`f>+gD@2CYq+YQBqIIEnU-(JcSl&j_`3F!H#u zoK<-xElVmeEPu~7m)-kZZvF0jic6q$0Q4`m@%z@1YP%QQ{uR zPbTU3(Otjc#4le*WA!CCiG7ree})GtD`;*FgVx;f;!awZjYmo_L>hxMN;_P8Z4Are zBw(iyoTfG9uFK>^f+_v_@!CVH-@ke36E&`wz^*55JVk4*b=#KT>79!|r?u0n=ggX@ ze|A=>zH$P(b^jjS^!g;-^zzZV`Q<^n?UiC3f4e|md#cnk%lXAeAo++4^CQIllf@;4 zBfkC1r6k&GXy5TL!zMq%!h3#1b5j$cmS!&d`QwO|-{K}iNZ}xb!t!Yzdo-@2QB_-2 z%g_EU(A;3&D5=Wla^43Nz*Ri#EGTE_CDLQ z^+hYin%WGjSEu8S!^9)0@W12$?}3j>#`){5Pt3!YH;g@RoR1k8idA$Gi*K1qTYH3} z;{JT+w)@%rLK%U8AHOfVE33KL<U-^~w~RH?|OJ&CuDYkrDy{E}mV(Ha?AGW`%hD&Wna? zt+kFcJg>JtKVGZ!e*NV2XX@L|JxW)ONAKELqxUZPU;Wx|hUxE|K%%mYvntCN`Dw#y zen8Uufq_2t`nhY#bnT^i{cQ{!e=~2*`y+d|?;zCN%(*jfqMuyOfddZUSc;bU>|6PDg8iowi4?M8(NnavwlVVfGNym~61FWoo7&Y; zd_HDZ)&ArC_@DG4dnG+9ou;PpXFs9;$Wz$AvJ$WZHJ{`x|B(prvh<@TO|7t|eDl||ZM%;|cr!^Ufy{OOS{~`T27@*fjra{K0&jbc*fUBJA1~ zVe8h8L-yMIR}dg2udI6M`BNZ==EfHO@A2nZJO5HPuRcKiwh)bt32d9ShQV`Mv!JS$ zx=%X+;yrEfxM0v+9|#06O+mx%C>X?iKAr?#uBzoZ{>z5=fVsd1rD!k=Ue%hvRMpb> e-eu_jrt$w>Q6Tz}5bm@90000Px-D@jB_RCodHoOx_iMHs-p?b7Yd5os&X3%WgMg_^b$3Z;TU0tE>K6^T-d2NM55 z1UVWIC_+gC7^4XUQAoikMiZj~MiCGwrvMIVZ*Pyr>@yS!MFt+@(S@Pwk4}ls9iBSqudBVo!V%dnBDV4Z;AVo`>-EVrsS_hwKp&*oP2bLx@^^Br}8&-bzf6;pyp! zj|+Mj8Bz>A5ED|d2h!E2pCMKDm?F@PJun@6;(1Ec^*{vYg>EN?Wq78Lv2jXbMa(E# z_YZsD9P~fVS6dd5mQh%Nw`Xb`)7Oj=<)9S=a2UtXIWNnK zyk@gtA#mnwDIEK~2+GRJq2bP5=A2{&r$AaB!lxO&w+IxzjPw{ADUt%JY9Pw3*~ zV_?ndcVWcvNJ$8g-9);G#7WUEyHE~`7B6=jc&6G&Km1#7FN2cOi>8vTiHj$I;nw67 z=DB{O7FOkMg65VMVYFNN+uGY9cg<#?(Ii2_2w)(u;+BF>JOZA+-P94NO%f!C0CFvc z7N04BOPBwYV5@JdlwZ1{yBKoTQb_>0QrgB1u&b+!yJGI5Af;{G0Nn+Kv+5}Ww2`z7&_;mV3#cD%SjBBJF+tMZ zBDWn^C~yOOc5;R*>e**)%0t-3pGF2K1GJHVjp}j_lmXgEz(#es2igdbdm6K5-4 zFV39>Nuv|E_1r;$8{pAnr?}gdIdL57cqTx32y=G_RzU{H^57210J)K|3Nk>J2X{yY z$c>CukO8thxI;2PZe*+i_dJkQcaKo?h$u)+NrF*Njf9BsVGx2(X!-g1=_=pW)&_U* ziL%_?!&^5Fv*O}{wV;JlEf?W%(`hJfDTk`gdU(*?q^s3HC7%COVUQj$ z8m0%0hm3$EP~e}n;?V##pn?7O4?{uYKDgFVYZVilIR)I6lG{!#xz6{?8k*XoaNle%y0Ul{S2QSy;LX)PIX)JFbxZgndIwD^; ztj+0q9Ke$;e?ZptCD5t;&s>|i;#CT7_%UibObSdfspnAuYdUYkgz7h-vFm}!#!8J0 z^74mb^%oH1Bc703K1)iq>SR5-V7yYd*6#4A8FVUGSf7U$G@@2<&jY3GiO|DEp`pPd z5;39+hoj+N~2psZh#@dgPm1ZlXm=jR+5E@|MV;j2;&^(*Dpfo%jX7|oIFaeD<6>nH$ZyR z+m+Iadl<$t0GFhkCA9n{6avV;pD#=`;ZGlzs(aJhM3PgY8XND4?8M>{l(WRx76EML zF;3qYSev^P0s{hg)a;hGrdE8x80+u6(~7Yz0w}JLh33*OSN^74mq4tjs1((1T9ETT zYiMkX0E%lQs-if8?g)16-0IW~9I8c0DSIbCaT5cc2D;61w2%$5B^3JP(+Ob&kDn&B zpYQqzwiT?${nzJU$djSq=y_sQ^$nnJHVB3GFjj z6`54Ok#HjVGf*mM&^{8co)4}%?`HCmZM*tt189GE9?&wpy@eK3_k^z#!9zQL>v3+g zw^3J=7o{2sUqx&NT86imP+8wZ=0mKHcr_YNe;aihpy;75_0sq7lI>;KmF3W;(!840 z(5w+px_Rm~7<=;p^P5T+@Ed|@x*mvgI}N(USh#JE2k_L+fqAC{rokEY9-#A z=-uXa(*JI}SA!=^pKvC}D5+j{304W9`%AY}g$j10TZ8XovhnKz+CW!hd67ELAuVW?}&K_}26gF6* z|0Z^8o=S4hKf5d&LghQ!nRrIr!V$??CtHnk}epgbb19y3J8#f*oczUSSVfTfzSU`T%$sQjz=s00000NkvXXu0mjf1pfvf literal 0 HcmV?d00001 diff --git a/src/assets/images/ledger_unpaired.png b/src/assets/images/ledger_unpaired.png new file mode 100644 index 0000000000000000000000000000000000000000..65db1ea875875d8390ff53a58aeb4d8152f9af0b GIT binary patch literal 2140 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 E0H3$V5&!@I literal 0 HcmV?d00001 diff --git a/src/assets/images/lock.png b/src/assets/images/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..a190964ed231c0e15c19aab402b176fbca07cba1 GIT binary patch literal 40380 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 F{{s`WK~w+$ literal 0 HcmV?d00001 diff --git a/src/assets/images/lock.svg b/src/assets/images/lock.svg new file mode 100644 index 0000000..9024d2a --- /dev/null +++ b/src/assets/images/lock.svg @@ -0,0 +1,277 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/microphone.png b/src/assets/images/microphone.png new file mode 100644 index 0000000000000000000000000000000000000000..f9a271c55810fd14f8915beaebd826b0e52a3ffa GIT binary patch literal 199 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 Z@qe8?M#M5n{0jg8002ovPDHLkV1kvE;jsV! literal 0 HcmV?d00001 diff --git a/src/assets/images/offline_tx.png b/src/assets/images/offline_tx.png new file mode 100644 index 0000000000000000000000000000000000000000..32fee54dd35cef4af942b07535f9cbbf5d4d32e8 GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E7uo-U3d z8I8#a60D08QkdOJ7=IsF`+sHPhl5}5Nu*t7GPrnHD2hoeMu_v_sual`2~Tr3$vX2% zd@?k6)!4{pqTT9}+8=aSf@ecokaXAV_8OiGYec;CGgQvIS{yjT`8DEbdp^&F-8Smt zJohCe)^@&Rar=D0q4}bX!G#19ejXEvv&_uAV4*+|?<-JF@jc_5qZ&&Y!qw;8N;q-+ zz=ZD%o}M1wug#nn{P$x6g0|Avwi4^^2OL~kc6N!G+w~P9YZlk+o_==WtvigKh5|x6 znjIrvFgI_wz}_}t!P_fE%&rY8{02sUoj1HR`tKw$!DPqkrKPhKO)9jRnVFRjuey4# zVzPkr^QxjdpWoOsJ71fZT5Kk?x^an3!P{9{&X2b;U7G7^Ga)G@VaA~Y2OPGrvn6Y) vICmw@3Qf79llh_Xpak>c1d$#lAqEB`MxVHUi+-j71E0au)z4*}Q$iB}+U2lr literal 0 HcmV?d00001 diff --git a/src/assets/images/person.svg b/src/assets/images/person.svg new file mode 100644 index 0000000..c078249 --- /dev/null +++ b/src/assets/images/person.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/photos/1.png b/src/assets/images/photos/1.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d5e197155b1a2d8445e4a753427287718555f8 GIT binary patch literal 52988 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 z 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 Z{vWxQV4voki7NmA002ovPDHLkV1lJ!dC&j= literal 0 HcmV?d00001 diff --git a/src/assets/images/preferences.png b/src/assets/images/preferences.png new file mode 100644 index 0000000000000000000000000000000000000000..b10ba6ea0144cadcc2128f88be1cd36168a56923 GIT binary patch literal 58005 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

    ??bF@v#25$oyu7)yuL9WEJ`I(i{k*_P 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 Cn{%upGLcvZt$|x8P?%NZvJisz3l<< zz*tl*dnF(#BAYl(I;1~f3==O3CNNkLD-i z1I~kk?CKFYRS0i9e}Z&PF~wpYbOoXhpe`A*C+#@~Y?t-SHAQY+9ZB%a9^y2c^oamW z@0;IMw|&rCo^$E8!nSXBU|pz#!_;$iz@%xap#SE^;89)Y?<2W1MKl|6mQth}_c~qz6`$*J%`zU#zl2vLAD5))rN%^lnLw%=cxyeey zr8##bM`Fv5<>;Gr&AJx}yW^3bcE3{T#K`@(As=A><_ux*gK)$}e-ayJjb${=FVh!jX9+DS z(}|H6fbiohy=zl-Vwg#ZpI@YCKK-n-2drLYw9j+!Ni$miUtf&hJN`S6F^C!UiRT0W z09QivZ9^Wu2=Rdi0Uic;27%myubcY%2M0p~fSbRH7>HZ{LwLG{fF5`-?uLK>cNCS> zlOb0HaLOb>th%Q{qG6Spk5(i zZb2YGSXh|6ZvZ&h!z~ab4-N80Y-n6%fCT>svh)q{2LYai2Zw+l*PjM~yg)&q01r^` TW~&t&0|PM9H`S}ub&dT$cua;W literal 0 HcmV?d00001 diff --git a/src/assets/images/preferences.svg b/src/assets/images/preferences.svg new file mode 100644 index 0000000..39f7bd1 --- /dev/null +++ b/src/assets/images/preferences.svg @@ -0,0 +1,686 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + System Preferences + + + Andreas Nilsson + + + + + category + system + preferences + settings + control center + + + + + Jakub Steiner +Ulisse Perusin + + + + + + + + + + + + + + image/svg+xml + + Preferences + + + Andreas Nilsson + + + + + Lapo Calamandrei, Ulisse Perusin, Jakub Steiner + + + + + + category + system + preferences + settings + control center + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/qrcode.png b/src/assets/images/qrcode.png new file mode 100644 index 0000000000000000000000000000000000000000..41a84aa1d424088bc50edb767a4037d3c30f8c29 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X?s&R5hE&{2`t$$4J+o?qAcsSVvOxCYldTLNrF3#6c5of} zsvzu8Av?wG`TE03ZHLmEX0a_cU+{6}hK_|FF7k35ICOk<8|$e=wnu9t4sobF>-Fc= z5h!ew4Y^u1c29tH+RPEQxd5R21GgAM(d9eHH#-|;M2 znfZf(e}RW%w~O;Z`3km2_8b>o6kMIWCMx+_Xs`E0 zu5P)0H~if`t0mffORtySmO5#9^7O08ThuK5HzvoClZ YR}ufayT`lJ9~e#yp00i_>zopr01(ccvH$=8 literal 0 HcmV?d00001 diff --git a/src/assets/images/revealer.png b/src/assets/images/revealer.png new file mode 100644 index 0000000000000000000000000000000000000000..9caef09dde2b418d8deb6c76544aade1d84dc2e0 GIT binary patch literal 272 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/seed.png b/src/assets/images/seed.png new file mode 100644 index 0000000000000000000000000000000000000000..54c38b6abb1b81f353b1bfcc4635fc4cf8cb165e GIT binary patch literal 10322 zcmY*G(TCGEosZ`os>VCTH>XuYUWgE zsAmcAT_rRUhk!^Z5wub0iOibUJ_pb>_o-*|&H5-TV1=U2)pNiULj})fW3Ycs^U{C* zj-xG(stmLWpuJW^Jc+=2hA^;>4%)_3{h=BFff2s^9(fW@)jNAZGWUY=nYys+EIbdt zMkx^XOQ=L(tYMcDl=p^r2}p!z?UPO{=}I+SayU@$m!uBy8z7{0eNddt=zY~UG{)gbV0xidjs~XoM#m3`AFx<;$hAetLcGbUVL{X?AmMgK6 z8-DcZ>~CDTyqMoH%kq0*Ue`|2~py^0e`aTihSdu2LIZmNwW^`%BLxh5h)K{-&3wru0PJ) z`@oMNd_csmo_`9p>JuU@Ktoj@zOcqz9#P=eDJUEr%$m%#$>N5{M46iHDqjhG z9B<-6+i!9Y2ts}T0pM+q)Lr`A7>mCzr&iHK4S~ z;vWc97>eRSzoqN-e^!B#h9ZWcxbyc5f^|X=883RybwAo>>@Fzn2L40f(-qhepccdmz*Fc_LR$&ArZ)$YKHZ;QLxXcY&<3nN3{l&2#J? zAIMhuM~Dc5h19ry#}UraOO)!z0uue;j}3*X6(95Le(R znS5AdDq!x8Tys9EMx}T0>s8cQ@SMz-0g@ay#E_qlWJ2yaqqD4X_X+dY4kG?O7rS+o zYqp{>qt_By$-jE;%KB6eob7|wAHi8Hv_4nfQkh_w{c0nz)_3MTt@U)*(*#Q?%hgvN2;Aovj#NWj2A~#

    ERd2S{ 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/status_connected.png b/src/assets/images/status_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..1fe3dace9d5564ef1ef65e69dd54e9f5753189c3 GIT binary patch literal 71068 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

    #RD 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%0D_!6n7Cii)q)gF#DJQT> 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

    S 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

      %34L?gRl?)6Q`w}^y*%Rnhr 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/status_connected_proxy.svg b/src/assets/images/status_connected_proxy.svg new file mode 100644 index 0000000..5e44b5e --- /dev/null +++ b/src/assets/images/status_connected_proxy.svg @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Lapo Calamandrei + + + + + + + + record + media + + + + + Jakub Steiner + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/status_connected_proxy_fork.png b/src/assets/images/status_connected_proxy_fork.png new file mode 100644 index 0000000000000000000000000000000000000000..f6b4541e1f3b8f2f90fe9798d360023bf045193e GIT binary patch literal 60879 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/status_disconnected.png b/src/assets/images/status_disconnected.png new file mode 100644 index 0000000000000000000000000000000000000000..cb5ac1b9fbe340057a36c3b4ec7e01818a3b5849 GIT binary patch literal 66105 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Lapo Calamandrei + + + + + Record + + + record + media + + + + + Jakub Steiner + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/status_lagging.png b/src/assets/images/status_lagging.png new file mode 100644 index 0000000000000000000000000000000000000000..b558791f5dd1e881a4e939d27c8323ee18ca9ed8 GIT binary patch literal 74851 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
        IGv0EsNgz7Y}`g=Jg7ATeE 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Lapo Calamandrei + + + + + + + + record + media + + + + + Jakub Steiner + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/status_lagging_fork.png b/src/assets/images/status_lagging_fork.png new file mode 100644 index 0000000000000000000000000000000000000000..82826721b9265333e14b39e4c1b14794ac9d5ca4 GIT binary patch literal 63949 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/status_waiting.png b/src/assets/images/status_waiting.png new file mode 100644 index 0000000000000000000000000000000000000000..d5513838f842d420051a006c2249f1630b4950f6 GIT binary patch literal 81206 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­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 literal 0 HcmV?d00001 diff --git a/src/assets/images/status_waiting.svg b/src/assets/images/status_waiting.svg new file mode 100644 index 0000000..069a4d3 --- /dev/null +++ b/src/assets/images/status_waiting.svg @@ -0,0 +1,398 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + View Refresh + + + reload + refresh + view + + + + + Ricardo 'Rick' González + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/tab_addresses.png b/src/assets/images/tab_addresses.png new file mode 100644 index 0000000000000000000000000000000000000000..449b23ba1f71249391b89b6aa2ae2a96103100fd GIT binary patch literal 886 zcmV-+1Bv{JP)MKM0+r)m_~|(q8AU+=F(oov|6yI;-MGo!GjmQir`fbo&;@=_9o)rrT7yO z6e_izYK0~RK?oHI5=>h)5gW7JBqKB1gw$;0RmPb$J9EhrUgpjF=KJ1zI~f8lAH?PH zg9bn|z~u;N3Amg9ItgkC+?X%TN|ZsF5YL?p1O8ifK9Aj9KS=;$l+qztYa$c#29@Qk z!B4X4A!jf4`xn`FL-&97kV@qt3tskGQ~|)^{9+RS;b-rlM11Ru1fWND@XVh|0Dw|* z{b}0x0fbyu5xjB$0O<0QblIzF_ZTqQP__F`000tcQ)T>Wa{!B61E3k8CE&aq zaPL(HKCKl|3%fLSh}&gWityldhCiP=8iiWQ(@R#+$4Y5}rZ;gPAQqxlq#xs{$eqL{KXiWMm6~>hl0W zv7x3>`qvm+p-zHMOoD%N9?*(!ETL}qJOIUAK}N!opvX>8P;97aGysZjh}3sSCqXAB zL6mp|8EFP+2H;M91QD)j8r=!%Dxl_~q%MOs1k_i71ykC+To&}(ta;U}z>yjNYsG4v z4HW2ON@4O}B|N)%rQa53_kul@auR?9w=Rels@@&3+3{T;+Zq5CoOL<6JV}7W0BDE; zc|^V5E3$)UYmv?XnY)Yer2)X8)Xp}V0qwlInAkJ}FetUNjq4fk3xH&TfJt74s{jB1 M07*qoM6N<$f-)G1>;M1& literal 0 HcmV?d00001 diff --git a/src/assets/images/tab_coins.png b/src/assets/images/tab_coins.png new file mode 100644 index 0000000000000000000000000000000000000000..a6c8265da495caadfb6713bdd488a507b2cc7235 GIT binary patch literal 1592 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 A6#xJL literal 0 HcmV?d00001 diff --git a/src/assets/images/tab_history.png b/src/assets/images/tab_history.png new file mode 100644 index 0000000000000000000000000000000000000000..ecdc46819b117f6ba08f8609ad70788cf077f008 GIT binary patch literal 2182 zcmV;12zmF3P)UBm_wy2@=4rfr1n)7DJ&fFbZ^*MY|4dXLh7ryVcs=NIUysJ8frLJF`>! zW$W&YGj(@%+sf{2(VcF!&ZzZe#g~CbE3FMSfK*VSB_MABLP&&=+<14+&EAlkLfQ$r}W49k12yX<`6u{l}Ztz><%`2>?x_`hfP&`#1oeT3d*OxcCQ} z!^pS=|GoS*A^;*DaGxY#G!0_RYQvy;gd?>iMFJF3DORYG7F2@wMFI}WiFTtAEnPP` z#;KJl%>TyGe$MsW^p(g~t05MOc!#m*06P0`p{b)C4vIo{N;=kM<|98f2TR2<9OEV& zlW6L0!^Im-Xz%ZWSSUn(RyHzH9^w_kq5>c*-qO_xveH`$E3qmiBPe68^>^aaua7gH zLA)V1J-GLR>3q=uu*N^0ngeagX1^7mZL-88_MY3%cmn}IK=9EP1psmT#%8Xu{;7`{2t_%od6C0{10VtK=tUip;}WrRQ}vuz-j^2fg!fN=jDc|zo?TZm@4&d= z09e;2#%Cv|&ujJBmq|?6eQF;sQkXLUvZ7smedsX_GV_U*#2{Op3Z*PApmF~`SI0#A zoxiB&#dx+8B84uK5mjYB3)t_dbsW7W6O&(vgd!v>l*~MR+nfN9PA{}H!#X*E7?A`^ zqa_%zjWK-&(j-Z8bj=26ORAXdj?YH6#~R%sl&sM}oybj=*qB4cBRkHp&5Q|$9SW%o zrJ6iQCDU8(oB$mCN(UE3Lt9$K?A@f1&ObO?i=NSbl;;;9S&`telXd?OUwjWs#S%X4 z2Z;r*9@yn41F}e`zG-BDzff4|i8nn61>? zYk~$ay_&lMM)E(N{0JQbKj7Ep8#n-z5(V%2X9xJhkq=;}?Wo9K>lyQ4!+AXRP*%Y0 zHjvkZ82~$8J@76^HbDcJO#*Km+zn;?;!0po{XWFS#v(1rT||*a<{3ptL0h!NPXafG zf5frYGe}KNM*LDKbANKmjvKdn;iRZNJ1c(o=8PvoB)Hh89QbVsHwf-MTg&9>ix~td znnJx%ch}gmT$+L`WhR6IA@hvYX@g;?1$N3F@SWaa(}|Z0p0At{0Ew`=mS)%{Czz;C zDmbzW+>dRr?{+`hhOf;UTxDV@CMi3pJJgKN1_glhKoX%&uS7^16NBs(i<<~p%>$@! zJA?7bF~r4i%V^e0*BuuqmkZ>t00KlsMFmWo$^8kt9TS$32I{+ScJY2Fx)7=G`ICRg z^-D))UHyA`fOi1IV~$+ZA%!W1UYU17M6`cQSBt*RRwUYoAaaaDCRf~xt;{=4rxUg@ zGb}FQb;|1a5AOij$V|#%K57E};1!td?(`cS=b@PBMM3G$?-_vEGzh)!9C{%=@v`>t z%t7#;M**1gKXMx6J`kyzvnNbZ4z!M3oi;wy0Fe25ABnwC^mNeWar;0QF83IaqLOph zAe217J5kYhw3Ebxk;MAU0>&$RizTwXl9QhcH}uS3&B{lxI_=@m2f%Kn?Z$3gGj=l| z*cRwmTqG1?l{yvK>NJRjQGoXk*d6B~8NQD7Pd&o{Gc`4Z(?{w70rzu<1eF5oo}8{5 z$V+St=$2+4*8b|Rn-?Sq&J;V`Ka5y0U>@~6M$Z40G8yDDnP06>dm}LS0Q%3M&dfqq zZUJYQZ!a03ztqgRws~tMmZ_AUYm>KaFf{65vzXDH`RrkB*(-|=U_ODB-3eg40!3mH zG)3zn6h(WwJXHGyMojKZwV-$no+#FM?hW^VIyTBAJjCS(Gb)gjzJ@a$4uDYkL?%`uk>ov+Rp<*= z{{0ur<&-6}prqU*ht6v)==#1DH&sP-!sL~H2b8qS`Du0WOYSd3LcP`1Y$R3PyMX{y zXiv{*W5@%j|5usZ>5Q(2K%fZ(05ttt#g4kYcU$C;25`1!V;N1;M#z3ACi>9_exxL~4Rn;_(kOjcHy-+BmHN|BDb}RHD~XT-;MRLgGX%8S*X4h_5`w4XK=DWa?e{5py|C8JL+B|*Fy?GUCqW%1i-eO{6Z{G^Z#n(V*O>bHn|T@ zed_?$?G23$F!kL6XjdMQLr4KQvu|UAR4y+qD&OQ6)ccGBICiMcb3H+&MAcURuYcKU z5Hz+|>^Mz;hE5{@6p5-*-y<>B^{wMJjxoLk5xL0%pn>-`XivLOg+ry?4S=`n``Y3w zg$E9Ruj~5)@Rh;?1>kP3?+d|O3Ly#L!?(-Jumq*?aZ6qjOT=k$@$TOROePB~V-rCs zc!hcyqN7D{IvucD%y2mAhTAr}AtYkJ-`*)_ik+Y=o#R9Q1F@GhY*&yBq5uE@07*qo IM6N<$g0h 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 LNkvXXu0mjfhxljJ literal 0 HcmV?d00001 diff --git a/src/assets/images/tab_party.png b/src/assets/images/tab_party.png new file mode 100644 index 0000000000000000000000000000000000000000..8746f1109705a6f8d8ca2a89c008dc0daf2cd1e5 GIT binary patch literal 2386 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 Eg53m!ApigX literal 0 HcmV?d00001 diff --git a/src/assets/images/tab_receive.png b/src/assets/images/tab_receive.png new file mode 100644 index 0000000000000000000000000000000000000000..ba486694c0e04f86e99fc1385040e13e3e7bb7d5 GIT binary patch literal 1873 zcmV-X2d?;uP)6vw}3mSumilr8-Q{%E)HNBf`_e5lbj3X+(BHD&(-X;Mv$CWR(y-%6jvmzgS@An7gp;?lQAGv+TfXxle>WckVf# z^Sx)zy+gRq2i@oKV-vup0`7AHn_HmN1aPXm*8|9>8E7TIE&OA!Ut;Qc@8t2mV*6WC z3V5gcGZA!eD)8)J85l^wa;&H0Sg=?iN(R8&-JjG+kOsAaPYc-B)p7jT{|>;rAAUMO zL`PGB?W}gg^I#2J4m-ZP=Ff;%hEo4Q$LpE@ERaY^D4@N&*KLO!NRQ!(M?DY_#K;D~ zjI-~bJl40>G*6Pa6Ol%nm38AsYagFL#}Mtzi>D5eSro0@SvEh)qiY|Jg0j ze`&alfTJL^W+l%*IX$~DF?HvlEX#L)(%b^D?Ct6}Hd+J$tj}SnfADGpvC<2`lgnvY zmif=|NeYC*nr6k!zF5TcEs)GQK?JXROis^W?C*b8+cWyQP9AU5{U9BNrUF>W{Hp4% z!!L~A{%7Q`shLN>7y~c_VqaIsYeRbG8nH1AK>y%%H*xePK+7-lw6U=_47`Zip zhiiA?!2W%zJ~K&sy^YTnWv^>NF%Q6{;Z7o)PG2|@i{a-RzhQjx_T7I!wf`|~0N_6F zi-(IU`D_qo0vIL2p7aH$rtje5@K4FC&j#lZjmMD-fSAkV-0E$tFWTW}T>$hCUiAjM)AM0N{+b z=}@PUpp4j-J^&)GxAD0FBS9IlH3@)t1;#Rtx7kkV-U5VrZ{wk&oc-0nm;yj7)c@V^ zK(g=G7;m-xFt-2-Af_oGp9)6C#u16fP_u0tcJ0`{ zDme`P#rxvny0vCF-+Xfc3|@DGqeBEbkk66y-wSY(mJJ38}vnpre0Lm>GqHGgC3S-u$1bOGRRT8@HA zTx5#-dn1j>5Wqfa{<`QNHH#5^&LWu1v`iR_3z62d%N;g2 zTuwMDD{?Q-I7=<(RKF&x0~l;|V}5ZIAl0rdU$Ct3?a0VEaKr1ZF3vljfDxZdABkdZ(t@aR_#+hZ+Y|uhw%mLIo8=Mlc?U-HgnJ z9+qW!)j{92wepI?<+56=mS^%sGarp3I5m?rtFGCBa;Gidl&s&m4|Z$2R`9|&4}i55 zLs8u$!EiJh3Lnb$T&TiTUG=BUVcSQNRI3)5$i7g47&~^?z*1J09{}?hhaD~^S=C)?pfqL3uG2U?t_JUQjNt**VtyHShAx05ebCv z#KO@hSy6P=gPOe$PJrkk^}x6fARjfKE9mP{egMnGur-&YSSTgFD7rV%f$3Jo(!$b> z$ZV)`J~pq~bde;@?c7~6Ns^TH`Itih^#Du0wVpWh0x%*cVOxkQz&w$NCq`nS$lXJi zv&t2;Ic?&|eXkcu?r-jdy?j8={?_Ar(E+3uEld?!F7uZn?u7VX9KidU00000 LNkvXXu0mjfCPAG{ literal 0 HcmV?d00001 diff --git a/src/assets/images/tab_send.png b/src/assets/images/tab_send.png new file mode 100644 index 0000000000000000000000000000000000000000..7ef90a422c949bae5084359f52435efe48d18cee GIT binary patch literal 1550 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�^R-e zrVaPQL1B<-Ej=uJAWPZIiw6*?0VG3q&<&o8S-R!Lx(B<_iz2zLPB0TY^ z!62{#J2o|xCM5Q*;xk$0f`UJKT z<3x)G1DKnB#QWoK8O&ir6)Fc7jt^UG1Un>XgR_=)L2g!n>b^hjakVs}>$e7PV&?ie zibx3rH^cl65xWqr*U%A)*-A_GGUw6*LI@O%PI?J@0B>Y%;=Fl^6#~t8r_g`}Hmt44O?EGyRsZ&ESijLzfiM%$ z*|#`3D|7agtMjp?C#Tvaeq4~LiAno&ca!3>nzeVGs(6>$rq1QP`SF(^Ivwpyiu?^5mt#gO82FtT)0?4O$m%mxv01aA!ekuBu}aFk#%c zFN6IatM7-|^pmPyoqHv^g%UV+z31DLHqG2ijptL+L4Vq@oBh-6(Q9WIOfsRwnxGh| z6q5pn2+jAfa_Rk5)jGd}P@jgC@w6NYP-$V8d8%Pk6U?_Q9_cq&Xqr|OY9cD~`oFS` z-+`OTUuqKZpLlQyAdNj~lSr%9{E{WK<{&r5K)>_dcvi6UD-s^?)?v%n1LHVijKc8|48azfTN)yHf@Op^*`f z+q)D0uVwZqKn`4(!DU7XdHRBS-aq|UD8GPL@lLsJ461%;d{u8g!sKn!<~QLDj^-b^ zPWKi9Zh%(K2NCE`7>Q4{#8e-QInL&FLQ8ChlCwFoK%2GXpViy{go73F`#i)OzO_4! zdvelXdJAO^m>lJxdHC3cZ`d|4!LA`xS|Mjgmq}buuR2g3afTdSus3xl2hSzm9*lVG zOe{}uUBBT6N_S_K-(fRG5Hq|NwmTX^n=yiV(G-dIzdDi@qyh|lX6MJ4qPWcuk5DSz z$5d{24vRugJ3@OwTK^@3-`Zx@$!|)|BPvEc4fId&=&5I!u5;6WL2jO5*dJ?V;V
        |J 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

        8K2Dws_YGPuXD)jzB_2(rO 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 N002ovPDHLkV1kx(OU(cP literal 0 HcmV?d00001 diff --git a/src/assets/images/xmrto.png b/src/assets/images/xmrto.png new file mode 100644 index 0000000000000000000000000000000000000000..b06c771944756e88069d79386942d2f73e03af42 GIT binary patch literal 2060 zcmV+n2=n)eP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 diff --git a/src/assets/mnemonic_25_english.txt b/src/assets/mnemonic_25_english.txt new file mode 100644 index 0000000..9b92e93 --- /dev/null +++ b/src/assets/mnemonic_25_english.txt @@ -0,0 +1,1626 @@ +abbey +abducts +ability +ablaze +abnormal +abort +abrasive +absorb +abyss +academy +aces +aching +acidic +acoustic +acquire +across +actress +acumen +adapt +addicted +adept +adhesive +adjust +adopt +adrenalin +adult +adventure +aerial +afar +affair +afield +afloat +afoot +afraid +after +against +agenda +aggravate +agile +aglow +agnostic +agony +agreed +ahead +aided +ailments +aimless +airport +aisle +ajar +akin +alarms +album +alchemy +alerts +algebra +alkaline +alley +almost +aloof +alpine +already +also +altitude +alumni +always +amaze +ambush +amended +amidst +ammo +amnesty +among +amply +amused +anchor +android +anecdote +angled +ankle +annoyed +answers +antics +anvil +anxiety +anybody +apart +apex +aphid +aplomb +apology +apply +apricot +aptitude +aquarium +arbitrary +archer +ardent +arena +argue +arises +army +around +arrow +arsenic +artistic +ascend +ashtray +aside +asked +asleep +aspire +assorted +asylum +athlete +atlas +atom +atrium +attire +auburn +auctions +audio +august +aunt +austere +autumn +avatar +avidly +avoid +awakened +awesome +awful +awkward +awning +awoken +axes +axis +axle +aztec +azure +baby +bacon +badge +baffles +bagpipe +bailed +bakery +balding +bamboo +banjo +baptism +basin +batch +bawled +bays +because +beer +befit +begun +behind +being +below +bemused +benches +berries +bested +betting +bevel +beware +beyond +bias +bicycle +bids +bifocals +biggest +bikini +bimonthly +binocular +biology +biplane +birth +biscuit +bite +biweekly +blender +blip +bluntly +boat +bobsled +bodies +bogeys +boil +boldly +bomb +border +boss +both +bounced +bovine +bowling +boxes +boyfriend +broken +brunt +bubble +buckets +budget +buffet +bugs +building +bulb +bumper +bunch +business +butter +buying +buzzer +bygones +byline +bypass +cabin +cactus +cadets +cafe +cage +cajun +cake +calamity +camp +candy +casket +catch +cause +cavernous +cease +cedar +ceiling +cell +cement +cent +certain +chlorine +chrome +cider +cigar +cinema +circle +cistern +citadel +civilian +claim +click +clue +coal +cobra +cocoa +code +coexist +coffee +cogs +cohesive +coils +colony +comb +cool +copy +corrode +costume +cottage +cousin +cowl +criminal +cube +cucumber +cuddled +cuffs +cuisine +cunning +cupcake +custom +cycling +cylinder +cynical +dabbing +dads +daft +dagger +daily +damp +dangerous +dapper +darted +dash +dating +dauntless +dawn +daytime +dazed +debut +decay +dedicated +deepest +deftly +degrees +dehydrate +deity +dejected +delayed +demonstrate +dented +deodorant +depth +desk +devoid +dewdrop +dexterity +dialect +dice +diet +different +digit +dilute +dime +dinner +diode +diplomat +directed +distance +ditch +divers +dizzy +doctor +dodge +does +dogs +doing +dolphin +domestic +donuts +doorway +dormant +dosage +dotted +double +dove +down +dozen +dreams +drinks +drowning +drunk +drying +dual +dubbed +duckling +dude +duets +duke +dullness +dummy +dunes +duplex +duration +dusted +duties +dwarf +dwelt +dwindling +dying +dynamite +dyslexic +each +eagle +earth +easy +eating +eavesdrop +eccentric +echo +eclipse +economics +ecstatic +eden +edgy +edited +educated +eels +efficient +eggs +egotistic +eight +either +eject +elapse +elbow +eldest +eleven +elite +elope +else +eluded +emails +ember +emerge +emit +emotion +empty +emulate +energy +enforce +enhanced +enigma +enjoy +enlist +enmity +enough +enraged +ensign +entrance +envy +epoxy +equip +erase +erected +erosion +error +eskimos +espionage +essential +estate +etched +eternal +ethics +etiquette +evaluate +evenings +evicted +evolved +examine +excess +exhale +exit +exotic +exquisite +extra +exult +fabrics +factual +fading +fainted +faked +fall +family +fancy +farming +fatal +faulty +fawns +faxed +fazed +feast +february +federal +feel +feline +females +fences +ferry +festival +fetches +fever +fewest +fiat +fibula +fictional +fidget +fierce +fifteen +fight +films +firm +fishing +fitting +five +fixate +fizzle +fleet +flippant +flying +foamy +focus +foes +foggy +foiled +folding +fonts +foolish +fossil +fountain +fowls +foxes +foyer +framed +friendly +frown +fruit +frying +fudge +fuel +fugitive +fully +fuming +fungal +furnished +fuselage +future +fuzzy +gables +gadget +gags +gained +galaxy +gambit +gang +gasp +gather +gauze +gave +gawk +gaze +gearbox +gecko +geek +gels +gemstone +general +geometry +germs +gesture +getting +geyser +ghetto +ghost +giant +giddy +gifts +gigantic +gills +gimmick +ginger +girth +giving +glass +gleeful +glide +gnaw +gnome +goat +goblet +godfather +goes +goggles +going +goldfish +gone +goodbye +gopher +gorilla +gossip +gotten +gourmet +governing +gown +greater +grunt +guarded +guest +guide +gulp +gumball +guru +gusts +gutter +guys +gymnast +gypsy +gyrate +habitat +hacksaw +haggled +hairy +hamburger +happens +hashing +hatchet +haunted +having +hawk +haystack +hazard +hectare +hedgehog +heels +hefty +height +hemlock +hence +heron +hesitate +hexagon +hickory +hiding +highway +hijack +hiker +hills +himself +hinder +hippo +hire +history +hitched +hive +hoax +hobby +hockey +hoisting +hold +honked +hookup +hope +hornet +hospital +hotel +hounded +hover +howls +hubcaps +huddle +huge +hull +humid +hunter +hurried +husband +huts +hybrid +hydrogen +hyper +iceberg +icing +icon +identity +idiom +idled +idols +igloo +ignore +iguana +illness +imagine +imbalance +imitate +impel +inactive +inbound +incur +industrial +inexact +inflamed +ingested +initiate +injury +inkling +inline +inmate +innocent +inorganic +input +inquest +inroads +insult +intended +inundate +invoke +inwardly +ionic +irate +iris +irony +irritate +island +isolated +issued +italics +itches +items +itinerary +itself +ivory +jabbed +jackets +jaded +jagged +jailed +jamming +january +jargon +jaunt +javelin +jaws +jazz +jeans +jeers +jellyfish +jeopardy +jerseys +jester +jetting +jewels +jigsaw +jingle +jittery +jive +jobs +jockey +jogger +joining +joking +jolted +jostle +journal +joyous +jubilee +judge +juggled +juicy +jukebox +july +jump +junk +jury +justice +juvenile +kangaroo +karate +keep +kennel +kept +kernels +kettle +keyboard +kickoff +kidneys +king +kiosk +kisses +kitchens +kiwi +knapsack +knee +knife +knowledge +knuckle +koala +laboratory +ladder +lagoon +lair +lakes +lamb +language +laptop +large +last +later +launching +lava +lawsuit +layout +lazy +lectures +ledge +leech +left +legion +leisure +lemon +lending +leopard +lesson +lettuce +lexicon +liar +library +licks +lids +lied +lifestyle +light +likewise +lilac +limits +linen +lion +lipstick +liquid +listen +lively +loaded +lobster +locker +lodge +lofty +logic +loincloth +long +looking +lopped +lordship +losing +lottery +loudly +love +lower +loyal +lucky +luggage +lukewarm +lullaby +lumber +lunar +lurk +lush +luxury +lymph +lynx +lyrics +macro +madness +magically +mailed +major +makeup +malady +mammal +maps +masterful +match +maul +maverick +maximum +mayor +maze +meant +mechanic +medicate +meeting +megabyte +melting +memoir +menu +merger +mesh +metro +mews +mice +midst +mighty +mime +mirror +misery +mittens +mixture +moat +mobile +mocked +mohawk +moisture +molten +moment +money +moon +mops +morsel +mostly +motherly +mouth +movement +mowing +much +muddy +muffin +mugged +mullet +mumble +mundane +muppet +mural +musical +muzzle +myriad +mystery +myth +nabbing +nagged +nail +names +nanny +napkin +narrate +nasty +natural +nautical +navy +nearby +necklace +needed +negative +neither +neon +nephew +nerves +nestle +network +neutral +never +newt +nexus +nibs +niche +niece +nifty +nightly +nimbly +nineteen +nirvana +nitrogen +nobody +nocturnal +nodes +noises +nomad +noodles +northern +nostril +noted +nouns +novelty +nowhere +nozzle +nuance +nucleus +nudged +nugget +nuisance +null +number +nuns +nurse +nutshell +nylon +oaks +oars +oasis +oatmeal +obedient +object +obliged +obnoxious +observant +obtains +obvious +occur +ocean +october +odds +odometer +offend +often +oilfield +ointment +okay +older +olive +olympics +omega +omission +omnibus +onboard +oncoming +oneself +ongoing +onion +online +onslaught +onto +onward +oozed +opacity +opened +opposite +optical +opus +orange +orbit +orchid +orders +organs +origin +ornament +orphans +oscar +ostrich +otherwise +otter +ouch +ought +ounce +ourselves +oust +outbreak +oval +oven +owed +owls +owner +oxidant +oxygen +oyster +ozone +pact +paddles +pager +pairing +palace +pamphlet +pancakes +paper +paradise +pastry +patio +pause +pavements +pawnshop +payment +peaches +pebbles +peculiar +pedantic +peeled +pegs +pelican +pencil +people +pepper +perfect +pests +petals +phase +pheasants +phone +phrases +physics +piano +picked +pierce +pigment +piloted +pimple +pinched +pioneer +pipeline +pirate +pistons +pitched +pivot +pixels +pizza +playful +pledge +pliers +plotting +plus +plywood +poaching +pockets +podcast +poetry +point +poker +polar +ponies +pool +popular +portents +possible +potato +pouch +poverty +powder +pram +present +pride +problems +pruned +prying +psychic +public +puck +puddle +puffin +pulp +pumpkins +punch +puppy +purged +push +putty +puzzled +pylons +pyramid +python +queen +quick +quote +rabbits +racetrack +radar +rafts +rage +railway +raking +rally +ramped +randomly +rapid +rarest +rash +rated +ravine +rays +razor +react +rebel +recipe +reduce +reef +refer +regular +reheat +reinvest +rejoices +rekindle +relic +remedy +renting +reorder +repent +request +reruns +rest +return +reunion +revamp +rewind +rhino +rhythm +ribbon +richly +ridges +rift +rigid +rims +ringing +riots +ripped +rising +ritual +river +roared +robot +rockets +rodent +rogue +roles +romance +roomy +roped +roster +rotate +rounded +rover +rowboat +royal +ruby +rudely +ruffled +rugged +ruined +ruling +rumble +runway +rural +rustled +ruthless +sabotage +sack +sadness +safety +saga +sailor +sake +salads +sample +sanity +sapling +sarcasm +sash +satin +saucepan +saved +sawmill +saxophone +sayings +scamper +scenic +school +science +scoop +scrub +scuba +seasons +second +sedan +seeded +segments +seismic +selfish +semifinal +sensible +september +sequence +serving +session +setup +seventh +sewage +shackles +shelter +shipped +shocking +shrugged +shuffled +shyness +siblings +sickness +sidekick +sieve +sifting +sighting +silk +simplest +sincerely +sipped +siren +situated +sixteen +sizes +skater +skew +skirting +skulls +skydive +slackens +sleepless +slid +slower +slug +smash +smelting +smidgen +smog +smuggled +snake +sneeze +sniff +snout +snug +soapy +sober +soccer +soda +software +soggy +soil +solved +somewhere +sonic +soothe +soprano +sorry +southern +sovereign +sowed +soya +space +speedy +sphere +spiders +splendid +spout +sprig +spud +spying +square +stacking +stellar +stick +stockpile +strained +stunning +stylishly +subtly +succeed +suddenly +suede +suffice +sugar +suitcase +sulking +summon +sunken +superior +surfer +sushi +suture +swagger +swept +swiftly +sword +swung +syllabus +symptoms +syndrome +syringe +system +taboo +tacit +tadpoles +tagged +tail +taken +talent +tamper +tanks +tapestry +tarnished +tasked +tattoo +taunts +tavern +tawny +taxi +teardrop +technical +tedious +teeming +tell +template +tender +tepid +tequila +terminal +testing +tether +textbook +thaw +theatrics +thirsty +thorn +threaten +thumbs +thwart +ticket +tidy +tiers +tiger +tilt +timber +tinted +tipsy +tirade +tissue +titans +toaster +tobacco +today +toenail +toffee +together +toilet +token +tolerant +tomorrow +tonic +toolbox +topic +torch +tossed +total +touchy +towel +toxic +toyed +trash +trendy +tribal +trolling +truth +trying +tsunami +tubes +tucks +tudor +tuesday +tufts +tugs +tuition +tulips +tumbling +tunnel +turnip +tusks +tutor +tuxedo +twang +tweezers +twice +twofold +tycoon +typist +tyrant +ugly +ulcers +ultimate +umbrella +umpire +unafraid +unbending +uncle +under +uneven +unfit +ungainly +unhappy +union +unjustly +unknown +unlikely +unmask +unnoticed +unopened +unplugs +unquoted +unrest +unsafe +until +unusual +unveil +unwind +unzip +upbeat +upcoming +update +upgrade +uphill +upkeep +upload +upon +upper +upright +upstairs +uptight +upwards +urban +urchins +urgent +usage +useful +usher +using +usual +utensils +utility +utmost +utopia +uttered +vacation +vague +vain +value +vampire +vane +vapidly +vary +vastness +vats +vaults +vector +veered +vegan +vehicle +vein +velvet +venomous +verification +vessel +veteran +vexed +vials +vibrate +victim +video +viewpoint +vigilant +viking +village +vinegar +violin +vipers +virtual +visited +vitals +vivid +vixen +vocal +vogue +voice +volcano +vortex +voted +voucher +vowels +voyage +vulture +wade +waffle +wagtail +waist +waking +wallets +wanted +warped +washing +water +waveform +waxing +wayside +weavers +website +wedge +weekday +weird +welders +went +wept +were +western +wetsuit +whale +when +whipped +whole +wickets +width +wield +wife +wiggle +wildly +winter +wipeout +wiring +wise +withdrawn +wives +wizard +wobbly +woes +woken +wolf +womanly +wonders +woozy +worry +wounded +woven +wrap +wrist +wrong +yacht +yahoo +yanks +yard +yawning +yearbook +yellow +yesterday +yeti +yields +yodel +yoga +younger +yoyo +zapped +zeal +zebra +zero +zesty +zigzags +zinger +zippers +zodiac +zombie +zones +zoom \ No newline at end of file diff --git a/src/assets/restore_heights_monero_mainnet.txt b/src/assets/restore_heights_monero_mainnet.txt new file mode 100644 index 0000000..60e7353 --- /dev/null +++ b/src/assets/restore_heights_monero_mainnet.txt @@ -0,0 +1,1457 @@ +1397818193:1 +1397900458:1500 +1397988986:3000 +1398072982:4500 +1398150254:6000 +1398239439:7500 +1398327464:9000 +1398414629:10500 +1398503595:12000 +1398589229:13500 +1398674475:15000 +1398759778:16500 +1398853330:18000 +1398940120:19500 +1399029142:21000 +1399108598:22500 +1399199476:24000 +1399276463:25500 +1399359258:27000 +1399430728:28500 +1399529049:30000 +1399617670:31500 +1399704054:33000 +1399788123:34500 +1399876759:36000 +1399966741:37500 +1400048830:39000 +1400137204:40500 +1400227960:42000 +1400306653:43500 +1400390723:45000 +1400481607:46500 +1400562797:48000 +1400642153:49500 +1400733770:51000 +1400824661:52500 +1400909443:54000 +1400995911:55500 +1401087629:57000 +1401174818:58500 +1401259431:60000 +1401346018:61500 +1401446104:63000 +1401533922:64500 +1401615882:66000 +1401711748:67500 +1401800119:69000 +1401890061:70500 +1401981961:72000 +1402068695:73500 +1402161441:75000 +1402251933:76500 +1402342853:78000 +1402430216:79500 +1402521608:81000 +1402607480:82500 +1402694197:84000 +1402782013:85500 +1402877831:87000 +1402961257:88500 +1403051337:90000 +1403142326:91500 +1403227928:93000 +1403317545:94500 +1403402406:96000 +1403489043:97500 +1403581110:99000 +1403672901:100500 +1403762913:102000 +1403853728:103500 +1403942246:105000 +1404030101:106500 +1404121204:108000 +1404209324:109500 +1404299477:111000 +1404389132:112500 +1404479896:114000 +1404568672:115500 +1404658453:117000 +1404748301:118500 +1404841666:120000 +1404931637:121500 +1405021251:123000 +1405111817:124500 +1405202249:126000 +1405292780:127500 +1405384068:129000 +1405474052:130500 +1405560833:132000 +1405648064:133500 +1405738612:135000 +1405826744:136500 +1405917415:138000 +1406009136:139500 +1406098048:141000 +1406187373:142500 +1406276248:144000 +1406366555:145500 +1406454661:147000 +1406545604:148500 +1406634825:150000 +1406725340:151500 +1406814693:153000 +1406904971:154500 +1406994787:156000 +1407085463:157500 +1407175390:159000 +1407267706:160500 +1407356299:162000 +1407449840:163500 +1407538256:165000 +1407626820:166500 +1407724474:168000 +1407809765:169500 +1407902144:171000 +1407993798:172500 +1408082457:174000 +1408172155:175500 +1408262956:177000 +1408354097:178500 +1408443936:180000 +1408532602:181500 +1408622703:183000 +1408710047:184500 +1408800621:186000 +1408889541:187500 +1408978632:189000 +1409069384:190500 +1409161090:192000 +1409252389:193500 +1409341518:195000 +1409431833:196500 +1409523265:198000 +1409615103:199500 +1409706694:201000 +1409798817:202500 +1409887837:204000 +1409975926:205500 +1410066995:207000 +1410157020:208500 +1410247699:210000 +1410338278:211500 +1410426858:213000 +1410517509:214500 +1410603548:216000 +1410697050:217500 +1410786623:219000 +1410879374:220500 +1410968790:222000 +1411061102:223500 +1411150344:225000 +1411240315:226500 +1411333451:228000 +1411426837:229500 +1411517510:231000 +1411609298:232500 +1411700275:234000 +1411786636:235500 +1411879257:237000 +1411969413:238500 +1412059180:240000 +1412146654:241500 +1412240371:243000 +1412327650:244500 +1412419484:246000 +1412505208:247500 +1412598099:249000 +1412689756:250500 +1412779061:252000 +1412871113:253500 +1412958247:255000 +1413046858:256500 +1413143444:258000 +1413233792:259500 +1413326427:261000 +1413418713:262500 +1413513170:264000 +1413600711:265500 +1413691038:267000 +1413782539:268500 +1413873271:270000 +1413963233:271500 +1414051910:273000 +1414141926:274500 +1414235227:276000 +1414324027:277500 +1414416650:279000 +1414508370:280500 +1414600491:282000 +1414690323:283500 +1414780188:285000 +1414869014:286500 +1414960781:288000 +1415056523:289500 +1415146466:291000 +1415242321:292500 +1415326686:294000 +1415416410:295500 +1415513982:297000 +1415605041:298500 +1415690591:300000 +1415782947:301500 +1415872606:303000 +1415962299:304500 +1416054283:306000 +1416140330:307500 +1416233580:309000 +1416322091:310500 +1416414135:312000 +1416506758:313500 +1416595374:315000 +1416689164:316500 +1416780263:318000 +1416874051:319500 +1416962889:321000 +1417055934:322500 +1417146000:324000 +1417236998:325500 +1417324179:327000 +1417416820:328500 +1417507901:330000 +1417597710:331500 +1417686355:333000 +1417777506:334500 +1417862659:336000 +1417955917:337500 +1418046843:339000 +1418136820:340500 +1418233090:342000 +1418324035:343500 +1418414267:345000 +1418505126:346500 +1418595764:348000 +1418688320:349500 +1418779374:351000 +1418872600:352500 +1418966538:354000 +1419055739:355500 +1419144085:357000 +1419238098:358500 +1419326271:360000 +1419418123:361500 +1419507535:363000 +1419597647:364500 +1419683774:366000 +1419774083:367500 +1419866259:369000 +1419955270:370500 +1420044008:372000 +1420140609:373500 +1420231494:375000 +1420324119:376500 +1420413916:378000 +1420507318:379500 +1420606276:381000 +1420694938:382500 +1420789183:384000 +1420876853:385500 +1420964886:387000 +1421056364:388500 +1421145579:390000 +1421237342:391500 +1421326931:393000 +1421416957:394500 +1421502911:396000 +1421596997:397500 +1421688678:399000 +1421778389:400500 +1421868252:402000 +1421962600:403500 +1422053511:405000 +1422143942:406500 +1422233701:408000 +1422325595:409500 +1422417764:411000 +1422505420:412500 +1422598104:414000 +1422687391:415500 +1422777785:417000 +1422868479:418500 +1422956207:420000 +1423049056:421500 +1423138582:423000 +1423229478:424500 +1423317219:426000 +1423406036:427500 +1423499905:429000 +1423588906:430500 +1423680298:432000 +1423772526:433500 +1423862745:435000 +1423952092:436500 +1424041391:438000 +1424139807:439500 +1424229026:441000 +1424318898:442500 +1424409301:444000 +1424499432:445500 +1424588330:447000 +1424678229:448500 +1424767351:450000 +1424856412:451500 +1424945924:453000 +1425037250:454500 +1425127838:456000 +1425218701:457500 +1425304420:459000 +1425398748:460500 +1425487631:462000 +1425582279:463500 +1425668647:465000 +1425759251:466500 +1425851153:468000 +1425944420:469500 +1426035355:471000 +1426125337:472500 +1426216244:474000 +1426305042:475500 +1426396945:477000 +1426488132:478500 +1426579077:480000 +1426668886:481500 +1426757427:483000 +1426847995:484500 +1426937217:486000 +1427027279:487500 +1427118292:489000 +1427209584:490500 +1427297515:492000 +1427390524:493500 +1427480882:495000 +1427570116:496500 +1427659258:498000 +1427749838:499500 +1427840543:501000 +1427932591:502500 +1428024040:504000 +1428113328:505500 +1428207103:507000 +1428294368:508500 +1428385900:510000 +1428475862:511500 +1428566459:513000 +1428656150:514500 +1428745154:516000 +1428836572:517500 +1428927559:519000 +1429016578:520500 +1429108184:522000 +1429198248:523500 +1429288171:525000 +1429377542:526500 +1429471467:528000 +1429558593:529500 +1429653677:531000 +1429746059:532500 +1429836351:534000 +1429925189:535500 +1430016095:537000 +1430107657:538500 +1430197340:540000 +1430289235:541500 +1430378857:543000 +1430469252:544500 +1430559860:546000 +1430649912:547500 +1430737924:549000 +1430831012:550500 +1430922367:552000 +1431010902:553500 +1431101587:555000 +1431192674:556500 +1431285757:558000 +1431375632:559500 +1431466492:561000 +1431558015:562500 +1431649156:564000 +1431737625:565500 +1431828881:567000 +1431918115:568500 +1432011390:570000 +1432100985:571500 +1432189708:573000 +1432280424:574500 +1432369030:576000 +1432457824:577500 +1432550488:579000 +1432641906:580500 +1432730503:582000 +1432821446:583500 +1432914085:585000 +1433004746:586500 +1433094395:588000 +1433187412:589500 +1433276104:591000 +1433367216:592500 +1433460433:594000 +1433551901:595500 +1433637685:597000 +1433733220:598500 +1433825715:600000 +1433916570:601500 +1434006501:603000 +1434096894:604500 +1434187100:606000 +1434273702:607500 +1434367676:609000 +1434455723:610500 +1434545055:612000 +1434635579:613500 +1434730428:615000 +1434817300:616500 +1434906793:618000 +1434998648:619500 +1435090833:621000 +1435182990:622500 +1435273589:624000 +1435366019:625500 +1435453713:627000 +1435548085:628500 +1435636924:630000 +1435729973:631500 +1435822621:633000 +1435908886:634500 +1436001545:636000 +1436088666:637500 +1436178148:639000 +1436269067:640500 +1436362647:642000 +1436450486:643500 +1436539955:645000 +1436630255:646500 +1436721546:648000 +1436812401:649500 +1436903919:651000 +1436994474:652500 +1437085546:654000 +1437182957:655500 +1437275193:657000 +1437366265:658500 +1437455928:660000 +1437546033:661500 +1437633837:663000 +1437722391:664500 +1437810260:666000 +1437902321:667500 +1437993029:669000 +1438084185:670500 +1438171580:672000 +1438264522:673500 +1438354565:675000 +1438443988:676500 +1438535479:678000 +1438623629:679500 +1438716455:681000 +1438811029:682500 +1438904689:684000 +1438995954:685500 +1439086366:687000 +1439177854:688500 +1439267688:690000 +1439359080:691500 +1439447799:693000 +1439536807:694500 +1439628635:696000 +1439719005:697500 +1439804776:699000 +1439896959:700500 +1439989036:702000 +1440080322:703500 +1440170251:705000 +1440259422:706500 +1440351566:708000 +1440442434:709500 +1440537570:711000 +1440625665:712500 +1440717538:714000 +1440811510:715500 +1440903517:717000 +1440993091:718500 +1441084930:720000 +1441176305:721500 +1441265615:723000 +1441355056:724500 +1441446393:726000 +1441536851:727500 +1441628898:729000 +1441718152:730500 +1441805254:732000 +1441897179:733500 +1441986435:735000 +1442080450:736500 +1442172155:738000 +1442263883:739500 +1442355067:741000 +1442449041:742500 +1442542209:744000 +1442635207:745500 +1442724460:747000 +1442812486:748500 +1442902966:750000 +1442994219:751500 +1443085698:753000 +1443178161:754500 +1443264135:756000 +1443355099:757500 +1443446477:759000 +1443535739:760500 +1443625352:762000 +1443720015:763500 +1443811700:765000 +1443902882:766500 +1443998004:768000 +1444089737:769500 +1444182793:771000 +1444270850:772500 +1444361771:774000 +1444454626:775500 +1444544876:777000 +1444634893:778500 +1444725863:780000 +1444814080:781500 +1444904547:783000 +1444996388:784500 +1445086690:786000 +1445175749:787500 +1445267687:789000 +1445360811:790500 +1445449074:792000 +1445543282:793500 +1445632023:795000 +1445722156:796500 +1445813732:798000 +1445908836:799500 +1445998334:801000 +1446091833:802500 +1446185727:804000 +1446275117:805500 +1446367555:807000 +1446458743:808500 +1446548650:810000 +1446636178:811500 +1446729285:813000 +1446818028:814500 +1446909549:816000 +1447003607:817500 +1447093001:819000 +1447184705:820500 +1447278621:822000 +1447372370:823500 +1447468038:825000 +1447558138:826500 +1447652390:828000 +1447742476:829500 +1447828166:831000 +1447923194:832500 +1448013216:834000 +1448102910:835500 +1448193723:837000 +1448283885:838500 +1448375042:840000 +1448465226:841500 +1448556419:843000 +1448649382:844500 +1448740265:846000 +1448829027:847500 +1448923137:849000 +1449020848:850500 +1449111876:852000 +1449206548:853500 +1449295175:855000 +1449383624:856500 +1449475534:858000 +1449567493:859500 +1449656259:861000 +1449747770:862500 +1449839439:864000 +1449928803:865500 +1450020705:867000 +1450116099:868500 +1450206082:870000 +1450295833:871500 +1450393905:873000 +1450484210:874500 +1450576191:876000 +1450674264:877500 +1450763812:879000 +1450854842:880500 +1450945997:882000 +1451036350:883500 +1451125224:885000 +1451213407:886500 +1451306539:888000 +1451395994:889500 +1451487825:891000 +1451578633:892500 +1451673162:894000 +1451762734:895500 +1451855376:897000 +1451950724:898500 +1452044620:900000 +1452138667:901500 +1452229272:903000 +1452321274:904500 +1452411380:906000 +1452503713:907500 +1452593651:909000 +1452685043:910500 +1452774742:912000 +1452871547:913500 +1452955528:915000 +1453045013:916500 +1453139828:918000 +1453235253:919500 +1453322581:921000 +1453418754:922500 +1453508866:924000 +1453599446:925500 +1453692429:927000 +1453785727:928500 +1453874045:930000 +1453967280:931500 +1454056395:933000 +1454149053:934500 +1454238746:936000 +1454332249:937500 +1454422039:939000 +1454517368:940500 +1454604302:942000 +1454697148:943500 +1454792369:945000 +1454883921:946500 +1454976152:948000 +1455069597:949500 +1455162171:951000 +1455253531:952500 +1455344835:954000 +1455435262:955500 +1455523159:957000 +1455614591:958500 +1455704830:960000 +1455795089:961500 +1455885662:963000 +1455979503:964500 +1456067893:966000 +1456159912:967500 +1456252158:969000 +1456343386:970500 +1456436372:972000 +1456531050:973500 +1456626469:975000 +1456722795:976500 +1456812422:978000 +1456904454:979500 +1456992650:981000 +1457081799:982500 +1457174326:984000 +1457265022:985500 +1457353587:987000 +1457446102:988500 +1457536684:990000 +1457626424:991500 +1457717341:993000 +1457807857:994500 +1457902501:996000 +1457995186:997500 +1458089638:999000 +1458180514:1000500 +1458274276:1002000 +1458364317:1003500 +1458455352:1005000 +1458549046:1006500 +1458636174:1008000 +1458729317:1009500 +1458894346:1011000 +1459063482:1012500 +1459243276:1014000 +1459425755:1015500 +1459605826:1017000 +1459782083:1018500 +1459961331:1020000 +1460143746:1021500 +1460331607:1023000 +1460520936:1024500 +1460701361:1026000 +1460884221:1027500 +1461061695:1029000 +1461237934:1030500 +1461414191:1032000 +1461593953:1033500 +1461777761:1035000 +1461952141:1036500 +1462132052:1038000 +1462317051:1039500 +1462495092:1041000 +1462677074:1042500 +1462861748:1044000 +1463044884:1045500 +1463224911:1047000 +1463398580:1048500 +1463578591:1050000 +1463757604:1051500 +1463936022:1053000 +1464117101:1054500 +1464297865:1056000 +1464483584:1057500 +1464671071:1059000 +1464849970:1060500 +1465024863:1062000 +1465205807:1063500 +1465386722:1065000 +1465564285:1066500 +1465738760:1068000 +1465918555:1069500 +1466100427:1071000 +1466276876:1072500 +1466454118:1074000 +1466639653:1075500 +1466820501:1077000 +1467005177:1078500 +1467185150:1080000 +1467362682:1081500 +1467540213:1083000 +1467716652:1084500 +1467893799:1086000 +1468069912:1087500 +1468248812:1089000 +1468427344:1090500 +1468603125:1092000 +1468787751:1093500 +1468965065:1095000 +1469145781:1096500 +1469337233:1098000 +1469521554:1099500 +1469699691:1101000 +1469874679:1102500 +1470053612:1104000 +1470236012:1105500 +1470414476:1107000 +1470595923:1108500 +1470777161:1110000 +1470955781:1111500 +1471138526:1113000 +1471319847:1114500 +1471500943:1116000 +1471682222:1117500 +1471860790:1119000 +1472035420:1120500 +1472217115:1122000 +1472395302:1123500 +1472570739:1125000 +1472751050:1126500 +1472928309:1128000 +1473098267:1129500 +1473276441:1131000 +1473457643:1132500 +1473642257:1134000 +1473826970:1135500 +1474002748:1137000 +1474188317:1138500 +1474374066:1140000 +1474550392:1141500 +1474729572:1143000 +1474911163:1144500 +1475092518:1146000 +1475268122:1147500 +1475442938:1149000 +1475629374:1150500 +1475819480:1152000 +1475997819:1153500 +1476179133:1155000 +1476354939:1156500 +1476536210:1158000 +1476716350:1159500 +1476895225:1161000 +1477073983:1162500 +1477249312:1164000 +1477433801:1165500 +1477614082:1167000 +1477804971:1168500 +1477990372:1170000 +1478169998:1171500 +1478348283:1173000 +1478528413:1174500 +1478705414:1176000 +1478886655:1177500 +1479062832:1179000 +1479243048:1180500 +1479418422:1182000 +1479595192:1183500 +1479778962:1185000 +1479964598:1186500 +1480140671:1188000 +1480324683:1189500 +1480500809:1191000 +1480682239:1192500 +1480856453:1194000 +1481038133:1195500 +1481217124:1197000 +1481392752:1198500 +1481575804:1200000 +1481756751:1201500 +1481934733:1203000 +1482116256:1204500 +1482301346:1206000 +1482479176:1207500 +1482654068:1209000 +1482834659:1210500 +1483004059:1212000 +1483188148:1213500 +1483362554:1215000 +1483539897:1216500 +1483721622:1218000 +1483903190:1219500 +1484088607:1221000 +1484263006:1222500 +1484446963:1224000 +1484626829:1225500 +1484809489:1227000 +1484983861:1228500 +1485170094:1230000 +1485349686:1231500 +1485530749:1233000 +1485709581:1234500 +1485884232:1236000 +1486067414:1237500 +1486245341:1239000 +1486425256:1240500 +1486608991:1242000 +1486786270:1243500 +1486973042:1245000 +1487146309:1246500 +1487325223:1248000 +1487503053:1249500 +1487685365:1251000 +1487863975:1252500 +1488050119:1254000 +1488223036:1255500 +1488410492:1257000 +1488589768:1258500 +1488775148:1260000 +1488949276:1261500 +1489133453:1263000 +1489308790:1264500 +1489485996:1266000 +1489664303:1267500 +1489848401:1269000 +1490027832:1270500 +1490206463:1272000 +1490390593:1273500 +1490567029:1275000 +1490746894:1276500 +1490933137:1278000 +1491106069:1279500 +1491289329:1281000 +1491468486:1282500 +1491643624:1284000 +1491814895:1285500 +1491995475:1287000 +1492178181:1288500 +1492371569:1290000 +1492552114:1291500 +1492729903:1293000 +1492910706:1294500 +1493094028:1296000 +1493277668:1297500 +1493451685:1299000 +1493634509:1300500 +1493814008:1302000 +1493991208:1303500 +1494166238:1305000 +1494350490:1306500 +1494526071:1308000 +1494707137:1309500 +1494887930:1311000 +1495071305:1312500 +1495251430:1314000 +1495429566:1315500 +1495614062:1317000 +1495788802:1318500 +1495965162:1320000 +1496146099:1321500 +1496328368:1323000 +1496504063:1324500 +1496681255:1326000 +1496866740:1327500 +1497043312:1329000 +1497226571:1330500 +1497400684:1332000 +1497583491:1333500 +1497766332:1335000 +1497942512:1336500 +1498119751:1338000 +1498305083:1339500 +1498481551:1341000 +1498659598:1342500 +1498837788:1344000 +1499017991:1345500 +1499192957:1347000 +1499368904:1348500 +1499552117:1350000 +1499732418:1351500 +1499915064:1353000 +1500092067:1354500 +1500266465:1356000 +1500451753:1357500 +1500628055:1359000 +1500809381:1360500 +1500985894:1362000 +1501163425:1363500 +1501344352:1365000 +1501524529:1366500 +1501706158:1368000 +1501887950:1369500 +1502070277:1371000 +1502246128:1372500 +1502426331:1374000 +1502609329:1375500 +1502785502:1377000 +1502965697:1378500 +1503149952:1380000 +1503326470:1381500 +1503502198:1383000 +1503682259:1384500 +1503846976:1386000 +1504025371:1387500 +1504210659:1389000 +1504388051:1390500 +1504571483:1392000 +1504750590:1393500 +1504923930:1395000 +1505104688:1396500 +1505283020:1398000 +1505464381:1399500 +1505644195:1401000 +1505826737:1402500 +1506005392:1404000 +1506184128:1405500 +1506368706:1407000 +1506547393:1408500 +1506725266:1410000 +1506907806:1411500 +1507085344:1413000 +1507267312:1414500 +1507445129:1416000 +1507628097:1417500 +1507803256:1419000 +1507986316:1420500 +1508167088:1422000 +1508347016:1423500 +1508530561:1425000 +1508710041:1426500 +1508886983:1428000 +1509066419:1429500 +1509253136:1431000 +1509429629:1432500 +1509611536:1434000 +1509797649:1435500 +1509973107:1437000 +1510153044:1438500 +1510332372:1440000 +1510509741:1441500 +1510696836:1443000 +1510871459:1444500 +1511052822:1446000 +1511231910:1447500 +1511407518:1449000 +1511587113:1450500 +1511770521:1452000 +1511949617:1453500 +1512129674:1455000 +1512307629:1456500 +1512482822:1458000 +1512653560:1459500 +1512835616:1461000 +1513017827:1462500 +1513197715:1464000 +1513372385:1465500 +1513547532:1467000 +1513728243:1468500 +1513909535:1470000 +1514083183:1471500 +1514266543:1473000 +1514444953:1474500 +1514621027:1476000 +1514798581:1477500 +1514978081:1479000 +1515155541:1480500 +1515339872:1482000 +1515518908:1483500 +1515699380:1485000 +1515875622:1486500 +1516053533:1488000 +1516243460:1489500 +1516414701:1491000 +1516599857:1492500 +1516781257:1494000 +1516964999:1495500 +1517142540:1497000 +1517315501:1498500 +1517489351:1500000 +1517666336:1501500 +1517855270:1503000 +1518027977:1504500 +1518203488:1506000 +1518384465:1507500 +1518558355:1509000 +1518751308:1510500 +1518924052:1512000 +1519106822:1513500 +1519281628:1515000 +1519466837:1516500 +1519648752:1518000 +1519829797:1519500 +1520014254:1521000 +1520184998:1522500 +1520370843:1524000 +1520544780:1525500 +1520728324:1527000 +1520910430:1528500 +1521088410:1530000 +1521268781:1531500 +1521445861:1533000 +1521631805:1534500 +1521805475:1536000 +1521987364:1537500 +1522168759:1539000 +1522349749:1540500 +1522531771:1542000 +1522713608:1543500 +1522889687:1545000 +1523199218:1546500 +1523341007:1548000 +1523527026:1549500 +1523709149:1551000 +1523888851:1552500 +1524065976:1554000 +1524246015:1555500 +1524423554:1557000 +1524602490:1558500 +1524783179:1560000 +1524964360:1561500 +1525151214:1563000 +1525329119:1564500 +1525513042:1566000 +1525692507:1567500 +1525871313:1569000 +1526053870:1570500 +1526230509:1572000 +1526410171:1573500 +1526592816:1575000 +1526773513:1576500 +1526955087:1578000 +1527133612:1579500 +1527316345:1581000 +1527498499:1582500 +1527676559:1584000 +1527855294:1585500 +1528040693:1587000 +1528219591:1588500 +1528395704:1590000 +1528579987:1591500 +1528763026:1593000 +1528943220:1594500 +1529121386:1596000 +1529302157:1597500 +1529479749:1599000 +1529664069:1600500 +1529840212:1602000 +1530015093:1603500 +1530198774:1605000 +1530375043:1606500 +1530556497:1608000 +1530734767:1609500 +1530917375:1611000 +1531096855:1612500 +1531279152:1614000 +1531454376:1615500 +1531642390:1617000 +1531816195:1618500 +1531995687:1620000 +1532180791:1621500 +1532356484:1623000 +1532537384:1624500 +1532719158:1626000 +1532898266:1627500 +1533078869:1629000 +1533257860:1630500 +1533441853:1632000 +1533620709:1633500 +1533798312:1635000 +1533982417:1636500 +1534160192:1638000 +1534343434:1639500 +1534524042:1641000 +1534702092:1642500 +1534879676:1644000 +1535063247:1645500 +1535244194:1647000 +1535420587:1648500 +1535600184:1650000 +1535779496:1651500 +1535956153:1653000 +1536134137:1654500 +1536311328:1656000 +1536494008:1657500 +1536670845:1659000 +1536851610:1660500 +1537033013:1662000 +1537210976:1663500 +1537392240:1665000 +1537574727:1666500 +1537753429:1668000 +1537928751:1669500 +1538111834:1671000 +1538291618:1672500 +1538476427:1674000 +1538652972:1675500 +1538836084:1677000 +1539013906:1678500 +1539198355:1680000 +1539374477:1681500 +1539552789:1683000 +1539736817:1684500 +1539951210:1686000 +1540117344:1687500 +1540296439:1689000 +1540473097:1690500 +1540653573:1692000 +1540834279:1693500 +1541014980:1695000 +1541190938:1696500 +1541369517:1698000 +1541548646:1699500 +1541734186:1701000 +1541913570:1702500 +1542092909:1704000 +1542275017:1705500 +1542449875:1707000 +1542635853:1708500 +1542815406:1710000 +1542997650:1711500 +1543178239:1713000 +1543359208:1714500 +1543540950:1716000 +1543727129:1717500 +1543901392:1719000 +1544084664:1720500 +1544267089:1722000 +1544446105:1723500 +1544624643:1725000 +1544803722:1726500 +1544987704:1728000 +1545170981:1729500 +1545350532:1731000 +1545532466:1732500 +1545710048:1734000 +1545887915:1735500 +1546069559:1737000 +1546245869:1738500 +1546431793:1740000 +1546606116:1741500 +1546786754:1743000 +1546968255:1744500 +1547139298:1746000 +1547319437:1747500 +1547496353:1749000 +1547672846:1750500 +1547850712:1752000 +1548034420:1753500 +1548214308:1755000 +1548391966:1756500 +1548573263:1758000 +1548752471:1759500 +1548928088:1761000 +1549106489:1762500 +1549283115:1764000 +1549456506:1765500 +1549634814:1767000 +1549817916:1768500 +1549998027:1770000 +1550181258:1771500 +1550361109:1773000 +1550539544:1774500 +1550715280:1776000 +1550894562:1777500 +1551079870:1779000 +1551254182:1780500 +1551434299:1782000 +1551619776:1783500 +1551794014:1785000 +1551973350:1786500 +1552162320:1788000 +1552440957:1789500 +1552624599:1791000 +1552807716:1792500 +1552980302:1794000 +1553162414:1795500 +1553342996:1797000 +1553519700:1798500 +1553698458:1800000 +1553881211:1801500 +1554066280:1803000 +1554243249:1804500 +1554425052:1806000 +1554603701:1807500 +1554782591:1809000 +1554964129:1810500 +1555144375:1812000 +1555323612:1813500 +1555506661:1815000 +1555682580:1816500 +1555865552:1818000 +1556045247:1819500 +1556225465:1821000 +1556407651:1822500 +1556582937:1824000 +1556772261:1825500 +1556942721:1827000 +1557123929:1828500 +1557301054:1830000 +1557481698:1831500 +1557663940:1833000 +1557840344:1834500 +1558023818:1836000 +1558203355:1837500 +1558391132:1839000 +1558575667:1840500 +1558746689:1842000 +1558925957:1843500 +1559106354:1845000 +1559287492:1846500 +1559467006:1848000 +1559645231:1849500 +1559825739:1851000 +1560005500:1852500 +1560188695:1854000 +1560369273:1855500 +1560549957:1857000 +1560728250:1858500 +1560908667:1860000 +1561089902:1861500 +1561266483:1863000 +1561452756:1864500 +1561630099:1866000 +1561809391:1867500 +1561988751:1869000 +1562166315:1870500 +1562348668:1872000 +1562528088:1873500 +1562705035:1875000 +1562894124:1876500 +1563072153:1878000 +1563253196:1879500 +1563429474:1881000 +1563612610:1882500 +1563790557:1884000 +1563972425:1885500 +1564152141:1887000 +1564332716:1888500 +1564511944:1890000 +1564693842:1891500 +1564873798:1893000 +1565051050:1894500 +1565230166:1896000 +1565410958:1897500 +1565587893:1899000 +1565768680:1900500 +1565949811:1902000 +1566131254:1903500 +1566309564:1905000 +1566490278:1906500 +1566668500:1908000 +1566847812:1909500 +1567031237:1911000 +1567210421:1912500 +1567391373:1914000 +1567573130:1915500 +1567750424:1917000 +1567930191:1918500 +1568109052:1920000 +1568292141:1921500 +1568475276:1923000 +1568651158:1924500 +1568834035:1926000 +1569016695:1927500 +1569197462:1929000 +1569377087:1930500 +1569552946:1932000 +1569734228:1933500 +1569917274:1935000 +1570098125:1936500 +1570275613:1938000 +1570457750:1939500 +1570639244:1941000 +1570819775:1942500 +1570996968:1944000 +1571176527:1945500 +1571356679:1947000 +1571534462:1948500 +1571718656:1950000 +1571897497:1951500 +1572079573:1953000 +1572257839:1954500 +1572433496:1956000 +1572617030:1957500 +1572800390:1959000 +1572981257:1960500 +1573162090:1962000 +1573343169:1963500 +1573522418:1965000 +1573702490:1966500 +1573880257:1968000 +1574062548:1969500 +1574251843:1971000 +1574424663:1972500 +1574601376:1974000 +1574786775:1975500 +1574964035:1977000 +1575146296:1978500 +1575292812:1980000 +1575466285:1981500 +1575651166:1983000 +1575830411:1984500 +1576005533:1986000 +1576186198:1987500 +1576360710:1989000 +1576541731:1990500 +1576716413:1992000 +1576902518:1993500 +1577081999:1995000 +1577264190:1996500 +1577443608:1998000 +1577623965:1999500 +1577797297:2001000 +1577979977:2002500 +1578159838:2004000 +1578336239:2005500 +1578515304:2007000 +1578699616:2008500 +1578876107:2010000 +1579060229:2011500 +1579242633:2013000 +1579414863:2014500 +1579597542:2016000 +1579772970:2017500 +1579952975:2019000 +1580137609:2020500 +1580317014:2022000 +1580496315:2023500 +1580675324:2025000 +1580849194:2026500 +1581032371:2028000 +1581214733:2029500 +1581397004:2031000 +1581572973:2032500 +1581751875:2034000 +1581931029:2035500 +1582114546:2037000 +1582295872:2038500 +1582472927:2040000 +1582657335:2041500 +1582835968:2043000 +1583012446:2044500 +1583196576:2046000 +1583373753:2047500 +1583560473:2049000 +1583738686:2050500 +1583922736:2052000 +1584105842:2053500 +1584285185:2055000 +1584463972:2056500 +1584642026:2058000 +1584821928:2059500 +1584995845:2061000 +1585184223:2062500 +1585363485:2064000 +1585540102:2065500 +1585721837:2067000 +1585899117:2068500 +1586084634:2070000 +1586262819:2071500 +1586442409:2073000 +1586623044:2074500 +1586801375:2076000 +1586980631:2077500 +1587165890:2079000 +1587341099:2080500 +1587523790:2082000 +1587702237:2083500 +1587883578:2085000 +1588063778:2086500 +1588245212:2088000 +1588424440:2089500 +1588603366:2091000 +1588781424:2092500 +1588964395:2094000 +1589142803:2095500 +1589321977:2097000 +1589506409:2098500 +1589683808:2100000 +1589865852:2101500 +1590042622:2103000 +1590222956:2104500 +1590404367:2106000 +1590581681:2107500 +1590762536:2109000 +1590943308:2110500 +1591125425:2112000 +1591304788:2113500 +1591483294:2115000 +1591666790:2116500 +1591846816:2118000 +1592023700:2119500 +1592207460:2121000 +1592386537:2122500 +1592569543:2124000 +1592747578:2125500 +1592925121:2127000 +1593103239:2128500 +1593277684:2130000 +1593464042:2131500 +1593643273:2133000 +1593824098:2134500 +1594000762:2136000 +1594187379:2137500 +1594369906:2139000 +1594552767:2140500 +1594721587:2142000 +1594908084:2143500 +1595088951:2145000 +1595269262:2146500 +1595454606:2148000 +1595633949:2149500 +1595806853:2151000 +1595988097:2152500 +1596168734:2154000 +1596347710:2155500 +1596523798:2157000 +1596694716:2158500 +1596887172:2160000 +1597077820:2161500 +1597256353:2163000 +1597436569:2164500 +1597622246:2166000 +1597800117:2167500 +1597984768:2169000 +1598161623:2170500 +1598338544:2172000 +1598523532:2173500 +1598704427:2175000 +1598881234:2176500 +1599067666:2178000 +1599247884:2179500 +1599426969:2181000 +1599604157:2182500 +1599786817:2184000 diff --git a/src/assets/restore_heights_monero_stagenet.txt b/src/assets/restore_heights_monero_stagenet.txt new file mode 100644 index 0000000..c28a4a4 --- /dev/null +++ b/src/assets/restore_heights_monero_stagenet.txt @@ -0,0 +1,444 @@ +1518932025:1 +1519057016:1500 +1519148374:3000 +1519251680:4500 +1519344568:6000 +1519443436:7500 +1519538388:9000 +1519630287:10500 +1519706564:12000 +1519797372:13500 +1519887275:15000 +1519977816:16500 +1520068127:18000 +1520163067:19500 +1520267595:21000 +1520378423:22500 +1520470528:24000 +1520547672:25500 +1520637599:27000 +1520727714:28500 +1520817129:30000 +1520907017:31500 +1521042482:33000 +1521203259:34500 +1521379791:36000 +1521565539:37500 +1521768004:39000 +1521952047:40500 +1522127660:42000 +1522284923:43500 +1522510139:45000 +1522676022:46500 +1522871613:48000 +1522969561:49500 +1523145200:51000 +1523316302:52500 +1523550884:54000 +1523758049:55500 +1523917524:57000 +1524106084:58500 +1524290437:60000 +1524464139:61500 +1524728732:63000 +1524905041:64500 +1525093135:66000 +1525239917:67500 +1525443579:69000 +1525663214:70500 +1525839621:72000 +1525989826:73500 +1526182919:75000 +1526437405:76500 +1526649137:78000 +1526812889:79500 +1526991726:81000 +1527184073:82500 +1527351889:84000 +1527567839:85500 +1527759754:87000 +1527916443:88500 +1528110008:90000 +1528285005:91500 +1528486806:93000 +1528666327:94500 +1528872096:96000 +1529015390:97500 +1529205809:99000 +1529384415:100500 +1529595764:102000 +1529770640:103500 +1529950955:105000 +1530115141:106500 +1530306273:108000 +1530491510:109500 +1530677550:111000 +1530823854:112500 +1531032372:114000 +1531175619:115500 +1531371373:117000 +1531541897:118500 +1531706629:120000 +1531888223:121500 +1532104373:123000 +1532314129:124500 +1532503060:126000 +1532663651:127500 +1532894128:129000 +1533095950:130500 +1533302631:132000 +1533464469:133500 +1533670723:135000 +1533833911:136500 +1534030841:138000 +1534203160:139500 +1534397055:141000 +1534577048:142500 +1534752236:144000 +1534931462:145500 +1535119263:147000 +1535300364:148500 +1535471540:150000 +1535640429:151500 +1535836082:153000 +1536059510:154500 +1536209710:156000 +1536366875:157500 +1536560444:159000 +1536749043:160500 +1536926345:162000 +1537105693:163500 +1537296613:165000 +1537501175:166500 +1537667740:168000 +1537844801:169500 +1538000228:171000 +1538199137:172500 +1538418406:174000 +1538612473:175500 +1538979696:177000 +1539147054:178500 +1539303989:180000 +1539488395:181500 +1539652212:183000 +1539819281:184500 +1539971301:186000 +1540146343:187500 +1540330288:189000 +1540505588:190500 +1540688044:192000 +1540869374:193500 +1541049379:195000 +1541223210:196500 +1541393586:198000 +1541577202:199500 +1541762094:201000 +1541909862:202500 +1542199063:204000 +1542399873:205500 +1542579333:207000 +1542763985:208500 +1542947442:210000 +1543124804:211500 +1543323933:213000 +1543489307:214500 +1543672244:216000 +1543837576:217500 +1544042420:219000 +1544222096:220500 +1544402628:222000 +1544546843:223500 +1544730464:225000 +1545134663:226500 +1545301874:228000 +1545488939:229500 +1545664263:231000 +1545834607:232500 +1546014630:234000 +1546192930:235500 +1546373750:237000 +1546556089:238500 +1546738764:240000 +1546917228:241500 +1547091360:243000 +1547272679:244500 +1547463907:246000 +1547636722:247500 +1547817060:249000 +1548001021:250500 +1548185375:252000 +1548380319:253500 +1548555267:255000 +1548741069:256500 +1548926544:258000 +1549140801:259500 +1549297081:261000 +1549478379:262500 +1549651888:264000 +1549860339:265500 +1550024455:267000 +1550217332:268500 +1551312389:270000 +1551527936:271500 +1551665288:273000 +1551836443:274500 +1552026339:276000 +1552218441:277500 +1552443760:279000 +1552680291:280500 +1552854334:282000 +1553030527:283500 +1553211359:285000 +1553385763:286500 +1553588198:288000 +1553760642:289500 +1553937158:291000 +1554121990:292500 +1554302691:294000 +1554479953:295500 +1554666762:297000 +1554850956:298500 +1555057081:300000 +1555228611:301500 +1555400592:303000 +1555615005:304500 +1555789135:306000 +1555995570:307500 +1556183867:309000 +1556362195:310500 +1556541232:312000 +1556728140:313500 +1556903453:315000 +1557065264:316500 +1557273415:318000 +1557443047:319500 +1557618850:321000 +1557798876:322500 +1557976530:324000 +1558172356:325500 +1558356032:327000 +1558534222:328500 +1558719934:330000 +1558892036:331500 +1559075695:333000 +1559253052:334500 +1559462339:336000 +1559647394:337500 +1559827424:339000 +1560002042:340500 +1560189126:342000 +1560343483:343500 +1560548477:345000 +1560709613:346500 +1560888640:348000 +1561072261:349500 +1561249189:351000 +1561433494:352500 +1561609875:354000 +1561789136:355500 +1561971530:357000 +1562146235:358500 +1562283612:360000 +1562536678:361500 +1562727970:363000 +1562896064:364500 +1563081360:366000 +1563222147:367500 +1563471753:369000 +1563648133:370500 +1563844968:372000 +1564019071:373500 +1564194349:375000 +1564378444:376500 +1564557884:378000 +1564733144:379500 +1564931656:381000 +1565088150:382500 +1565272766:384000 +1565457895:385500 +1565632566:387000 +1565824568:388500 +1565992971:390000 +1566155025:391500 +1566345274:393000 +1566534162:394500 +1566736618:396000 +1566937517:397500 +1567128136:399000 +1567296600:400500 +1567482630:402000 +1567671945:403500 +1567828904:405000 +1568061755:406500 +1568241437:408000 +1568413206:409500 +1568589427:411000 +1568777072:412500 +1568950797:414000 +1569140033:415500 +1569321139:417000 +1569497726:418500 +1569685524:420000 +1569858754:421500 +1570025222:423000 +1570195891:424500 +1570412169:426000 +1570568122:427500 +1570772965:429000 +1570968490:430500 +1571107236:432000 +1571359933:433500 +1571520970:435000 +1571737619:436500 +1571890574:438000 +1572104152:439500 +1572299391:441000 +1572483040:442500 +1572663772:444000 +1572839626:445500 +1573049256:447000 +1573229282:448500 +1573407580:450000 +1573589178:451500 +1573735333:453000 +1573840717:454500 +1574096272:456000 +1574280161:457500 +1574455892:459000 +1574604632:460500 +1574809987:462000 +1574975801:463500 +1575140569:465000 +1575422392:466500 +1575583824:468000 +1575763253:469500 +1575944350:471000 +1576125074:472500 +1576324269:474000 +1576508865:475500 +1576669612:477000 +1576891906:478500 +1577078563:480000 +1577265105:481500 +1577431370:483000 +1577744409:484500 +1577874268:486000 +1578038130:487500 +1578231375:489000 +1578439644:490500 +1578625982:492000 +1578808598:493500 +1578985283:495000 +1579175621:496500 +1579347774:498000 +1579517894:499500 +1579687667:501000 +1579868646:502500 +1580046838:504000 +1580240961:505500 +1580428207:507000 +1580572904:508500 +1580823996:510000 +1580994064:511500 +1581183924:513000 +1581351893:514500 +1581521085:516000 +1581702405:517500 +1581943619:519000 +1582098842:520500 +1582299537:522000 +1582480013:523500 +1582659742:525000 +1582839127:526500 +1583020057:528000 +1583266489:529500 +1583429819:531000 +1583615548:532500 +1583785190:534000 +1584011766:535500 +1584192961:537000 +1584342104:538500 +1584521327:540000 +1584706894:541500 +1584883565:543000 +1585062315:544500 +1585244138:546000 +1585427591:547500 +1585600165:549000 +1585784601:550500 +1585961031:552000 +1586147565:553500 +1586322716:555000 +1586513730:556500 +1586698639:558000 +1586878453:559500 +1587062131:561000 +1587234968:562500 +1587391529:564000 +1587591247:565500 +1587752262:567000 +1587969335:568500 +1588148503:570000 +1588405392:571500 +1588593609:573000 +1588778703:574500 +1588949467:576000 +1589172941:577500 +1589358899:579000 +1589536247:580500 +1589730950:582000 +1589882572:583500 +1590062931:585000 +1590237283:586500 +1590430792:588000 +1590599140:589500 +1590807968:591000 +1590987339:592500 +1591166304:594000 +1591348974:595500 +1591542069:597000 +1591723208:598500 +1591908870:600000 +1592060567:601500 +1592259549:603000 +1592465269:604500 +1592647205:606000 +1592828242:607500 +1593006687:609000 +1593201658:610500 +1593492855:612000 +1593636856:613500 +1593811224:615000 +1594004429:616500 +1594162422:618000 +1594348191:619500 +1594523256:621000 +1594685351:622500 +1594890677:624000 +1595073577:625500 +1595269373:627000 +1595477524:628500 +1595668392:630000 +1595867552:631500 +1596043173:633000 +1596209876:634500 +1596419711:636000 +1596600935:637500 +1596770710:639000 +1596979435:640500 +1597172685:642000 +1597347250:643500 +1597508807:645000 +1597698614:646500 +1597871525:648000 +1598058524:649500 +1598368966:651000 +1598552832:652500 +1598715002:654000 +1598902853:655500 +1599078705:657000 +1599253008:658500 +1599430407:660000 +1599636188:661500 +1599809533:663000 +1600001474:664500 diff --git a/src/assets/user_agents.txt b/src/assets/user_agents.txt new file mode 100644 index 0000000..33bc31e --- /dev/null +++ b/src/assets/user_agents.txt @@ -0,0 +1,7477 @@ +Mozilla/5.0 (Amiga; U; AmigaOS 1.3; en; rv:1.8.1.19) Gecko/20081204 SeaMonkey/1.1.14 +Mozilla/5.0 (AmigaOS; U; AmigaOS 1.3; en-US; rv:1.8.1.21) Gecko/20090303 SeaMonkey/1.1.15 +Mozilla/5.0 (AmigaOS; U; AmigaOS 1.3; en; rv:1.8.1.19) Gecko/20081204 SeaMonkey/1.1.14 +Mozilla/5.0 (Android 2.2; Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 +Mozilla/5.0 (BeOS; U; BeOS BeBox; fr; rv:1.9) Gecko/2008052906 BonEcho/2.0 +Mozilla/5.0 (BeOS; U; BeOS BePC; en-US; rv:1.8.1.1) Gecko/20061220 BonEcho/2.0.0.1 +Mozilla/5.0 (BeOS; U; BeOS BePC; en-US; rv:1.8.1.10) Gecko/20071128 BonEcho/2.0.0.10 +Mozilla/5.0 (BeOS; U; BeOS BePC; en-US; rv:1.8.1.17) Gecko/20080831 BonEcho/2.0.0.17 +Mozilla/5.0 (BeOS; U; BeOS BePC; en-US; rv:1.8.1.6) Gecko/20070731 BonEcho/2.0.0.6 +Mozilla/5.0 (BeOS; U; BeOS BePC; en-US; rv:1.8.1.7) Gecko/20070917 BonEcho/2.0.0.7 +Mozilla/5.0 (BeOS; U; BeOS BePC; en-US; rv:1.8.1b2) Gecko/20060901 Firefox/2.0b2 +Mozilla/5.0 (BeOS; U; BeOS BePC; en-US; rv:1.9a1) Gecko/20051002 Firefox/1.6a1 +Mozilla/5.0 (BeOS; U; BeOS BePC; en-US; rv:1.9a1) Gecko/20060702 SeaMonkey/1.5a +Mozilla/5.0 (BeOS; U; Haiku BePC; en-US; rv:1.8.1.10pre) Gecko/20080112 SeaMonkey/1.1.7pre +Mozilla/5.0 (BeOS; U; Haiku BePC; en-US; rv:1.8.1.14) Gecko/20080429 BonEcho/2.0.0.14 +Mozilla/5.0 (BeOS; U; Haiku BePC; en-US; rv:1.8.1.17) Gecko/20080831 BonEcho/2.0.0.17 +Mozilla/5.0 (BeOS; U; Haiku BePC; en-US; rv:1.8.1.18) Gecko/20081114 BonEcho/2.0.0.18 +Mozilla/5.0 (BeOS; U; Haiku BePC; en-US; rv:1.8.1.21pre) Gecko/20090218 BonEcho/2.0.0.21pre +Mozilla/5.0 (Darwin; FreeBSD 5.6; en-GB; rv:1.8.1.17pre) Gecko/20080716 K-Meleon/1.5.0 +Mozilla/5.0 (Darwin; FreeBSD 5.6; en-GB; rv:1.9.1b3pre)Gecko/20081211 K-Meleon/1.5.2 +Mozilla/5.0 (Future Star Technologies Corp.; Star-Blade OS; x86_64; U; en-US) iNet Browser 4.7 +Mozilla/5.0 (Linux 2.4.18-18.7.x i686; U) Opera 6.03 [en] +Mozilla/5.0 (Linux 2.4.18-ltsp-1 i686; U) Opera 6.1 [en] +Mozilla/5.0 (Linux 2.4.19-16mdk i686; U) Opera 6.11 [en] +Mozilla/5.0 (Linux 2.4.21-0.13mdk i686; U) Opera 7.11 [en] +Mozilla/5.0 (Linux X86; U; Debian SID; it; rv:1.9.0.1) Gecko/2008070208 Debian IceWeasel/3.0.1 +Mozilla/5.0 (Linux i686 ; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.70 +Mozilla/5.0 (Linux i686; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 +Mozilla/5.0 (Linux i686; U; en; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.51 +Mozilla/5.0 (Linux) Gecko Iceweasel (Debian) Mnenhy +Mozilla/5.0 (Linux; U) Opera 6.02 [en] +Mozilla/5.0 (Linux; U; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13 +Mozilla/5.0 (MSIE 7.0; Macintosh; U; SunOS; X11; gu; SV1; InfoPath.2; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648) +Mozilla/5.0 (Macintosh; ; Intel Mac OS X; fr; rv:1.8.1.1) Gecko/20061204 Opera +Mozilla/5.0 (Macintosh; I; Intel Mac OS X 11_7_9; de-LI; rv:1.9b4) Gecko/2012010317 Firefox/10.0a4 +Mozilla/5.0 (Macintosh; I; PPC Mac OS X Mach-O; en-US; rv:1.9a1) Gecko/20061204 Firefox/3.0a1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20110608 SeaMonkey/2.1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b11) Gecko/20110209 Firefox/ SeaMonkey/2.1b2 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b11pre) Gecko/20110126 Firefox/4.0b11pre +Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b8) Gecko/20100101 Firefox/4.0b8 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0) Gecko/20100101 Firefox/9.0 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0a2) Gecko/20111101 Firefox/9.0a2 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.31 (KHTML, like Gecko) Chrome/13.0.748.0 Safari/534.31 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.801.0 Safari/535.1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.803.0 Safari/535.1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6) AppleWebKit/531.4 (KHTML, like Gecko) Version/4.0.3 Safari/531.4 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_0) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1200.0 Iron/21.0.1200.0 Safari/537.1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_0) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_3) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.32 Safari/535.1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_3) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_4) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_4) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_4) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.65 Safari/535.11 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_6) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.12 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_6) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.698.0 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_6) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.56.357 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_6) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.2 Chrome/11.0.700.2 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.56.283 Chrome/11.0.696.65 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.56.292 Chrome/11.0.696.68 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.56.310 Chrome/11.0.696.68 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.56.357 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.209 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.423 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.471 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.478 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.494 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.790.0 Safari/535.1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.803.0 Safari/535.1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.813.0 Safari/535.1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.2 Chrome/11.0.700.2 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.494 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.11 (KHTML, like Gecko) Iron/17.0.1000.0 Chrome/17.0.1000.0 Safari/535.11 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.11 Safari/535.19 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.45 Safari/535.19 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.861.0 Safari/535.2 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.54 Safari/535.2 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1150.1 Iron/20.0.1150.1 Safari/536.11 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.0 Safari/534.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.794.0 Safari/535.1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.803.0 Safari/535.1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.65 Safari/535.11 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.861.0 Safari/535.2 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.65 Safari/535.11 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.45 Safari/535.19 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.7 (KHTML, like Gecko) Iron/16.0.950.0 Chrome/16.0.950.0 Safari/535.7 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.1 (KHTML, like Gecko) Iron/14.0.850.0 Chrome/14.0.850.0 Safari/535.1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.22 (KHTML, like Gecko) Chrome/19.0.1047.0 Safari/535.22 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.7 (KHTML, like Gecko) Iron/16.0.950.0 Chrome/16.0.950.0 Safari/535.7 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/535.19 (KHTML, like Gecko) Iron/18.0.1050.0 Chrome/18.0.1050.0 Safari/535.19 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Iron/19.0.1100.0 Chrome/19.0.1100.0 Safari/536.5 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8) AppleWebKit/536.15 (KHTML, like Gecko) iCab/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1150.1 Iron/20.0.1150.1 Safari/536.11 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1200.0 Iron/21.0.1200.0 Safari/537.1 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.6 Safari/537.11 +Mozilla/5.0 (Macintosh; Intel Mac OS X; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Opera 9.27 +Mozilla/5.0 (Macintosh; Intel Mac OS X; U; nb; rv:1.7.5) Gecko/20041110 +Mozilla/5.0 (Macintosh; PPC Mac OS X 10.4; rv:10.0.2) Gecko/20120217 Firefox/10.0.2 TenFourFox/G3 +Mozilla/5.0 (Macintosh; PPC Mac OS X 10.5; rv:10.0.2) Gecko/20120216 Firefox/10.0.2 TenFourFox/7450 +Mozilla/5.0 (Macintosh; PPC Mac OS X 10_5_8) AppleWebKit/534.50.2 (KHTML, like Gecko) iCab/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; PPC Mac OS X 10_5_8) AppleWebKit/536.15+ (KHTML, like Gecko) iCab/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; PPC Mac OS X 10_5_8) AppleWebKit/536.17+ (KHTML, like Gecko) iCab/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; PPC Mac OS X 10_5_8) AppleWebKit/536.25+ (KHTML, like Gecko) iCab/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; PPC Mac OS X 10_5_8) AppleWebKit/537.1+ (KHTML, like Gecko) iCab/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; PPC Mac OS X 10_5_8) AppleWebKit/537.3+ (KHTML, like Gecko) iCab/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; PPC Mac OS X 10_6_7) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.790.0 Safari/535.1 +Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.51 +Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 +Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 +Mozilla/5.0 (Macintosh; U; Intel 80486Mac OS X; en-US) AppleWebKit/528.16 (KHTML, like Gecko, Safari/528.16) OmniWeb/v622.8.0.112916 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.0.19) Gecko/2010062819 Firefox/3.0.19 Flock/2.6.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.0.4) Gecko/2008111323 Firefox/3.0.4 Flock/2.0.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.0.5) Gecko/2008121716 Firefox/3.0.5 Flock/2.0.3 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.0.9) Gecko/2009042318 Firefox/3.0.9 Wyzo/3.0.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.0.9) Gecko/2009042318 Firefox/3.0.9 Wyzo/3.0.3 GTB6 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.1b3pre) Gecko/20090223 SeaMonkey/2.0a3 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.1) Gecko/2008070206 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.10) Gecko/2009122115 Firefox/3.0.17 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.3) Gecko/2008100716 Firefox/3.0.3 Flock/2.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.3pre) Gecko/2008090704 GranParadiso/3.0.3pre +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.4) Gecko/2008111323 Firefox/3.0.4 Flock/2.0.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.6) Gecko/2009011912 Safari/525.27.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.9) Gecko/2009042318 Firefox/3.0.9 Wyzo/3.0.3 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1a2pre) Gecko/20080826052737 Minefield/3.1a2pre +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b1pre) Gecko/20080908170408 Minefield/3.1b1pre +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081202 SeaMonkey/2.0a2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20090204 Firefox/3.1b3pre +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 GTB5 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2a1) Gecko/20090806 Namoroka/3.6a1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2a1pre) Gecko/20090224 Minefield/3.2a1pre +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2a1pre) Gecko/20090225 Minefield/3.2a1pre +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2a1pre) Gecko/20090302 Minefield/3.2a1pre +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2a1pre) Gecko/20090315 Minefield/3.2a1pre +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9b4pre) Gecko/2008022104 Minefield/3.0b4pre +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-au; rv:1.9.0.1) Gecko/2008070206 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en; rv:1.9.0.10pre) Gecko/2009041800 Camino/2.0b3pre (like Firefox/3.0.10pre) +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en; rv:1.9.0.8pre) Gecko/2009022800 Camino/2.0b3pre +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; fr; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; it; rv:1.9.2.22) Gecko/20110902 Firefox/3.6.22 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; it; rv:1.9b4) Gecko/2008030317 Firefox/3.0b4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ko; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; pl; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 FBSMTWB +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6.0; en-US; rv:1.9.0.7) Gecko/2009030517 Minefield/3.0.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; de; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 GTB5 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.1.16) Gecko/20101123 SeaMonkey/2.0.11 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.1.18) Gecko/20110320 SeaMonkey/2.0.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2) Gecko/20091218 Firefox 3.6b5 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13; ) Gecko/20101203 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.24) Gecko/20111103 Firefox/3.6.24 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.3) Gecko/20100402 Prism/1.0b4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.3a1pre) Gecko/20091002 Minefield/3.7a1pre +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.3a1pre) Gecko/20100103 Minefield/3.7a1pre +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.3a3pre) Gecko/20100306 Minefield/3.7a3pre +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.3a4pre) Gecko/20100318 Minefield/3.7a4pre +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en; rv:1.9.0.18) Gecko/2010021619 Camino/2.0.2 (like Firefox/3.0.18) +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en; rv:1.9.0.19) Gecko/2010111021 Camino/2.0.6 (MultiLang) (like Firefox/3.0.19) +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en; rv:1.9.2.14pre) Gecko/20101212 Camino/2.1a1pre (like Firefox/3.6.14pre) +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; fr; rv:1.9.2.23) Gecko/20110920 Firefox/3.6.23 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; he; rv:1.9.1b4pre) Gecko/20100405 Firefox/3.6.3plugin1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; nl; rv:1.9.0.19) Gecko/2010051911 Camino/2.0.3 (MultiLang) (like Firefox/3.0.19) +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6;en-US; rv:1.9.2.9) Gecko/20100824 Firefox/3.6.9 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.7; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_4_11; en) AppleWebKit/525.13 (KHTML, like Gecko) Shiira Safari/125 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_4_11; en) AppleWebKit/525.18 (KHTML, like Gecko) Shiira Safari/125 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_4_11; en) AppleWebKit/525.18 (KHTML, like Gecko) Sunrise/1.7.4 like Safari/4525.22 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_4_11; en) AppleWebKit/528.16 (KHTML, like Gecko) Shiira Safari/125 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; en-au) AppleWebKit/525.8+ (KHTML, like Gecko) Version/3.1 Safari/525.6 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; en-gb) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Sunrise/1.7.1 like Safari/5525.18 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; en-us) AppleWebKit/525.7 (KHTML, like Gecko) Version/3.1 Safari/525.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; en-us) AppleWebKit/525.9 (KHTML, like Gecko) Version/3.1 Safari/525.9 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; en-us) AppleWebKit/526.1+ (KHTML, like Gecko) Version/3.1 Safari/525.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; es-es) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; fr-fr) AppleWebKit/525.9 (KHTML, like Gecko) Version/3.1 Safari/525.9 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; it-it) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; ja-jp) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.18 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; pt-br) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_3; en-ca) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_3; es-es) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_3; hu-hu) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_3; nb-no) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_3; nl-nl) AppleWebKit/527+ (KHTML, like Gecko) Version/3.1.1 Safari/525.20 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-gb) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/528.1 (KHTML, like Gecko) Version/4.0 Safari/528.1 Stainless/0.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; en-us) AppleWebKit/525.18 (KHTML, like Gecko) NetNewsWire/3.1.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; en-us) AppleWebKit/525.25 (KHTML, like Gecko) Version/3.2 Safari/525.25 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; en-us) AppleWebKit/525.27.1 (KHTML, like Gecko) Stainless/0.4 Safari/525.20.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; en-us) AppleWebKit/525.27.1 (KHTML, like Gecko) Stainless/0.4.5 Safari/525.20.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; en-us) AppleWebKit/528.1 (KHTML, like Gecko) Stainless/0.3.5 Safari/525.20.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; it-it) AppleWebKit/525.18 (KHTML, like Gecko) +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; ja-jp) AppleWebKit/525.18 (KHTML, like Gecko) Sunrise/1.7.5 like Safari/5525.20.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; ja-jp) AppleWebKit/525.26.2 (KHTML, like Gecko) Version/3.2 Safari/525.26.12 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; sv-se) AppleWebKit/525.26.2 (KHTML, like Gecko) Version/3.2 Safari/525.26.12 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; zh-tw) AppleWebKit/525.18 (KHTML, like Gecko) Stainless/0.3 Safari/525.20.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; zh-tw) AppleWebKit/525.27.1 (KHTML, like Gecko) Stainless/0.4 Safari/525.20.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; zh-tw) AppleWebKit/525.27.1 (KHTML, like Gecko) Stainless/0.4.5 Safari/525.20.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; de-de) AppleWebKit/525.27.1 (KHTML, like Gecko) NetNewsWire/3.1.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/528.16 (KHTML, like Gecko, Safari/528.16) OmniWeb/v622.8.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/ Safari/530.5 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/530.6 (KHTML, like Gecko) Chrome/ Safari/530.6 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/530.9 (KHTML, like Gecko) Chrome/ Safari/530.9 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-gb) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-gb) AppleWebKit/528.10+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.1 Safari/525.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/528.16 (KHTML, like Gecko) +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/528.16 (KHTML, like Gecko) Fluid/0.9.6 Safari/528.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/528.16 (KHTML, like Gecko) Stainless/0.5.3 Safari/525.20.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/528.4+ (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/528.7+ (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/530.6+ (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; es-es) AppleWebKit/525.27.1 (KHTML, like Gecko) Stainless/0.4.5 Safari/525.20.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; fr-fr) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; hr-hr) AppleWebKit/530.1+ (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; it-it) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; it-it) AppleWebKit/528.8+ (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; ko-kr) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; nb-no) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; ru-ru) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; zh-tw) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; de-de) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; de-de) AppleWebKit/525.28.3 (KHTML, like Gecko) NetNewsWire/3.1.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; de-de) AppleWebKit/525.28.3 (KHTML, like Gecko) Version/3.2.3 Safari/525.28.3 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-US) AppleWebKit/528.16 (KHTML, like Gecko, Safari/528.16) OmniWeb/v622.8.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-US) AppleWebKit/528.16+(KHTML, like Gecko, Safari/528.16) OmniWeb/v622.8.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-US) AppleWebKit/530.18+(KHTML, like Gecko, Safari/528.16) OmniWeb/v622.8.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-US) AppleWebKit/531.3 (KHTML, like Gecko) Chrome/3.0.192 Safari/531.3 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.196 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.212.1 Safari/532.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.1 Safari/530.18 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/4.0.1 Safari/530.18 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.197 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.0 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.207.0 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.208.0 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.210.0 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.2 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.8 Safari/532.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.2 Safari/532.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.5 Safari/532.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Chrome/4.0.302.2 Safari/532.8 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.343.0 Safari/533.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.422.0 Safari/534.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.13 (KHTML, like Gecko) RockMelt/0.9.48.59 Chrome/9.0.597.107 Safari/534.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.127 Safari/534.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.16 (KHTML, like Gecko) RockMelt/0.9.50.549 Chrome/10.0.648.205 Safari/534.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.2 (KHTML, like Gecko) Chrome/6.0.453.1 Safari/534.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.7 (KHTML, like Gecko) RockMelt/0.8.36.116 Chrome/7.0.517.44 Safari/534.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.3 Safari/531.21.10 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; fi-fi) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; it-it) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; ja-jp) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; nl-nl) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; zh-cn) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; zh-tw) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/528.10 (KHTML, like Gecko) Chrome/2.0.157.2 Safari/528.10 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.0 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.4 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.204.0 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.1 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.212.1 Safari/532.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.307.11 Safari/532.9 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.86 Safari/533.4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.207.0 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.209.0 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.2 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.212.0 Safari/532.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.8 Safari/532.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.4 Safari/532.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.86 Safari/533.4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; nl-nl) AppleWebKit/531.9 (KHTML, like Gecko) Fluid/0.9.6 Safari/531.9 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; nl-nl) AppleWebKit/532.3+ (KHTML, like Gecko) Fluid/0.9.6 Safari/532.3+ +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; nl-nl) AppleWebKit/532.3+ (KHTML, like Gecko) Version/4.0.3 Safari/531.9 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; de-at) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; de-de) AppleWebKit/531.21.8 (KHTML, like Gecko) NetNewsWire/3.2.3 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/530.6 (KHTML, like Gecko) Chrome/2.0.174.0 Safari/530.6 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/531.21.8+(KHTML, like Gecko, Safari/528.16) OmniWeb/v622.11.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Iron/4.0.275.2 Chrome/4.0.275.2 Safari/532.5 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.343.0 Safari/533.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.366.0 Safari/533.4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.70 Safari/533.4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) Shiira Safari/125 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; ja-jp) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; nb-no) AppleWebKit/533.16 (KHTML, like Gecko) Version/4.1 Safari/533.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; ru-ru) AppleWebKit/533.2+ (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; HTC-P715a; en-ca) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; ca-es) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; de-de) AppleWebKit/531.22.7 (KHTML, like Gecko) NetNewsWire/3.2.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; de-de) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; el-gr) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/531.9+(KHTML, like Gecko, Safari/528.16) OmniWeb/v622.10.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.363.0 Safari/533.3 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.366.0 Safari/533.4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.428.0 Safari/534.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/534.2 (KHTML, like Gecko) Chrome/6.0.453.1 Safari/534.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.456.0 Safari/534.3 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-au) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/531.21.11 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/533.4+ (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/534.1+ (KHTML, like Gecko) Version/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; es-es) AppleWebKit/531.22.7 (KHTML, like Gecko) +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; it-it) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; ja-jp) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; ko-kr) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; ru-ru) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; zh-cn) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.7 Safari/533.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.414.0 Safari/534.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.210 Safari/534.10 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.10 (KHTML, like Gecko) RockMelt/0.8.40.147 Chrome/8.0.552.231 Safari/534.10 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.13 (KHTML, like Gecko) RockMelt/0.9.46.126 Chrome/9.0.597.107 Safari/534.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.13 (KHTML, like Gecko) RockMelt/0.9.48.59 Chrome/9.0.597.107 Safari/534.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.0 Safari/534.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.127 Safari/534.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/11.0.655.0 Safari/534.17 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.2 (KHTML, like Gecko) Chrome/6.0.451.0 Safari/534.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.458.1 Safari/534.3 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.461.0 Safari/534.3 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.464.0 Safari/534.3 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.7 (KHTML, like Gecko) RockMelt/0.8.36.116 Chrome/7.0.517.44 Safari/534.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; fr-FR) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.126 Safari/533.4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; ha) AppleWebKit/534.13 (KHTML, like Gecko) RockMelt/0.445.436.1326 Chrome/12.0.632.107 Safari/534.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; th-th) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; ar) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; de-de) AppleWebKit/534.15+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.15 Safari/534.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.639.0 Safari/534.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Flock/3.5.0.4568 Chrome/7.0.517.440 Safari/534.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.7 (KHTML, like Gecko) RockMelt/0.8.36.116 Chrome/7.0.517.44 Safari/534.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.7 (KHTML, like Gecko) RockMelt/0.8.36.79 Safari/534.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; de-de) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.10 (KHTML, like Gecko) RockMelt/0.8.40.147 Chrome/8.0.552.231 Safari/534.10 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Iron/9.0.600.2 Chrome/9.0.600.2 Safari/534.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.13 (KHTML, like Gecko) RockMelt/0.9.48.51 Chrome/9.0.597.107 Safari/534.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.13 (KHTML, like Gecko) RockMelt/0.9.48.59 Chrome/9.0.597.107 Safari/534.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.134 Safari/534.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.16 (KHTML, like Gecko) RockMelt/0.9.50.459 Chrome/10.0.648.204 Safari/534.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.16 (KHTML, like Gecko) RockMelt/0.9.50.518 Chrome/10.0.648.205 Safari/534.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.16 (KHTML, like Gecko) RockMelt/0.9.50.549 Chrome/10.0.648.205 Safari/534.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.18 (KHTML, like Gecko) Chrome/11.0.660.0 Safari/534.18 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Flock/3.5.3.4628 Chrome/7.0.517.450 Safari/534.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.7 (KHTML, like Gecko) RockMelt/0.8.36.74 Chrome/7.0.517.44 Safari/534.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-gb) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-us) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; es-es) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-ch) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-fr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; it-it) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ko-kr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; sv-se) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; zh-cn) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; da-dk) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/531.21.8+(KHTML, like Gecko, Safari/528.16) Version/5.10.3 OmniWeb/622.14.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Iron/9.0.600.2 Chrome/9.0.600.2 Safari/534.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.13 (KHTML, like Gecko) RockMelt/0.9.48.59 Chrome/9.0.597.107 Safari/534.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) RockMelt/0.9.50.459 Chrome/10.0.648.204 Safari/534.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) RockMelt/0.9.50.549 Chrome/10.0.648.205 Safari/534.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Iron/7.0.520.1 Chrome/7.0.520.1 Safari/534.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/533.21.1 (KHTML, like Gecko) iCab/4.8 Safari/533.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/534.16+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; nn-no) AppleWebKit/533.21.1 (KHTML, like Gecko) iCab/4.8b Safari/533.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; de-at) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/533.21.1 (KHTML, like Gecko) iCab/4.8 Safari/533.16 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_7; en-us) AppleWebKit/533.4 (KHTML, like Gecko) Version/4.1 Safari/533.4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_7_0; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.7 Safari/533.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_7_0; en-US) AppleWebKit/534.21 (KHTML, like Gecko) Chrome/11.0.678.0 Safari/534.21 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_7_5; en-US) AppleWebKit/533.21.1+(KHTML, like Gecko, Safari/533.19.4) Version/5.11.2 OmniWeb/622.19.3.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_8; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X Mach-O; en-US; rv:1.8.1a2) Gecko/20060512 BonEcho/2.0a2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X Mach-O; en; rv:1.8.1.12) Gecko/20080206 Camino/1.5.5 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; de-AT; rv:1.9.1.8) Gecko/20100625 Firefox/3.6.6 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; de-de) AppleWebKit/522.11.1 (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit (KHTML, like Gecko) +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/418.9 (KHTML, like Gecko) NetNewsWire/3.0d7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/418.9 (KHTML, like Gecko) Shiira/1.2.2 Safari/125 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/418.9 (KHTML, like Gecko, Safari) Cheshire/1.0.UNOFFICIAL +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/418.9.1 (KHTML, like Gecko) Shiira/1.2.2 Safari/125 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/418.9.1 (KHTML, like Gecko) Sunrise/1.6.5 like Safari/419.3 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/419 (KHTML, like Gecko) NetNewsWire/2.1.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/419 (KHTML, like Gecko) Shiira Safari/125 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/419 (KHTML, like Gecko, Safari/125) Cheshire/1.0.ALPHA +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/419 (KHTML, like Gecko, Safari/419.3) Cheshire/1.0.ALPHA +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/521.32.1 (KHTML, like Gecko) Safari/521.32.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/522+ (KHTML, like Gecko) Version/3.0.2 Safari/522.12 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/522.11 (KHTML, like Gecko) Version/3.0.2 Safari/522.12 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/522.11.1 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/522.11.1 (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/523.2+ (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/523.5+ (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/523.9+ (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US) AppleWebKit/525.18 (KHTML, like Gecko, Safari/525.20) OmniWeb/v622.6.1.0.111015 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US) AppleWebKit/528.16 (KHTML, like Gecko, Safari/528.16) OmniWeb/v622.8.0.112941 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.86 Safari/533.4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.0.1) Gecko/20060203 Camino/1.0rc1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.0.1) Gecko/20060214 Camino/1.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.0.10) Gecko/20070228 Camino/1.0.4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.0.11) Gecko/20070321 Firefox/1.5.0.11 Flock/0.7.12 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.0.12) Gecko/20070530 Firefox/1.5.0.12 Flock/0.7.14 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.0.4) Gecko/20060613 Camino/1.0.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.0.7) Gecko/20060911 Camino/1.0.3 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.0.8) Gecko/20061109 Firefox/1.5.0.8 Flock/0.7.8 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.0.9) Gecko/20061211 SeaMonkey/1.0.7 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1) Gecko/20061018 Camino/1.1a1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1) Gecko/20061024 BonEcho/2.0 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.10pre) Gecko/20071127 Firefox/2.0.0.10 Navigator/9.0.0.4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.11) Gecko/20071127 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.11) Gecko/20071206 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.11pre) Gecko/20071206 Firefox/2.0.0.11 Navigator/9.0.0.5 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.12pre) Gecko/20080122 Firefox/2.0.0.12pre +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.13) Gecko/20080313 Firefox +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.13) Gecko/20080313 SeaMonkey/1.1.9 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.14) Gecko/20080530 Firefox/2.0.0.14 Flock/1.2.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.16) Gecko/20080703 SeaMonkey/1.1.11 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.2) Gecko/20070221 SeaMonkey/1.1.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.22) Gecko/20090605 SeaMonkey/1.1.17 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.23) Gecko/20090823 SeaMonkey/1.1.18 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.24) Gecko/20100301 SeaMonkey/1.1.19 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.3) Gecko/20070322 BonEcho/2.0.0.3 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6 Camino/1.5.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.8pre) Gecko/20071001 Firefox/2.0.0.7 Navigator/9.0RC1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.8pre) Gecko/20071019 Firefox/2.0.0.8 Navigator/9.0.0.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.9) Gecko/20071106 Firefox/2.0.0.9 Flock/1.0.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.9pre) Gecko/20071102 Firefox/2.0.0.9 Navigator/9.0.0.3 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1a3) Gecko/20060601 Camino/1.0+ +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1b1) Gecko/20060710 Firefox/2.0b1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8b5) Gecko/20051021 Camino/1.0+ +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.9a8pre) Gecko/2007083104 Minefield/3.0a8pre +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-au) AppleWebKit/523.10.3 (KHTML, like Gecko) Shiira Safari/125 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-us) AppleWebKit/419.2.1 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-us) AppleWebKit/522.11.1 (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-us) AppleWebKit/525.1+ (KHTML, like Gecko) Version/3.0.4 Safari/523.10 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.11) Gecko/20071128 Camino/1.5.4 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.1pre) Gecko/20061126 Camino/1.1a1+ +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.2pre) Gecko/20070108 Camino/1.1a2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.2pre) Gecko/20070223 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.2pre) Gecko/20070223 Camino/1.1b +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.4) Gecko/20070509 Camino/1.5 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.4) Gecko/20070607 Camino/1.5 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.4) Gecko/20070609 Camino/1.5 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.4pre) Gecko/20070417 Camino/1.1b+ +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.4pre) Gecko/20070521 Camino/1.6a1pre +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.4pre) Gecko/20070526 Camino/1.6a1pre +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.6) Gecko/20070809 Camino/1.5.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.6) Gecko/20070809 Firefox/2.0.0.6 Camino/1.5.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; es-ES; rv:1.8.1.18) Gecko/20081031 SeaMonkey/1.1.13 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; es-es) AppleWebKit/523.15.1 (KHTML, like Gecko) Version/3.0.4 Safari/523.15 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; fr) AppleWebKit/418.9.1 (KHTML, like Gecko) Shiira Safari/125 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; fr) AppleWebKit/523.12.2 (KHTML, like Gecko) Sunrise/1.6.0 like Safari/523.12.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; fr) AppleWebKit/523.12.2 (KHTML, like Gecko) Version/3.0.4 Safari/523.12.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; fr-fr) AppleWebKit/523.10.3 (KHTML, like Gecko) Version/3.0.4 Safari/523.10 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; fr-fr) AppleWebKit/525.1+ (KHTML, like Gecko) Version/3.0.4 Safari/523.10 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; it-IT) AppleWebKit/521.25 (KHTML, like Gecko) Safari/521.24 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; it-it) AppleWebKit/523.10.6 (KHTML, like Gecko) Version/3.0.4 Safari/523.10.6 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; it-it) AppleWebKit/523.12.2 (KHTML, like Gecko) Version/3.0.4 Safari/523.12.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; ja-jp) AppleWebKit/523.10.3 (KHTML, like Gecko) Version/3.0.4 Safari/523.10 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; ja-jp) AppleWebKit/523.12.2 (KHTML, like Gecko) Version/3.0.4 Safari/523.12.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; ko-kr) AppleWebKit/523.15.1 (KHTML, like Gecko) Version/3.0.4 Safari/523.15 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; nl-NL; rv:1.8.1.3) Gecko/20080722 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; ru-ru) AppleWebKit/522.11.1 (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; sv-se) AppleWebKit/523.10.3 (KHTML, like Gecko) Version/3.0.4 Safari/523.10 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; sv-se) AppleWebKit/523.10.6 (KHTML, like Gecko) Version/3.0.4 Safari/523.10.6 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; sv-se) AppleWebKit/523.12.2 (KHTML, like Gecko) Version/3.0.4 Safari/523.12.2 +Mozilla/5.0 (Macintosh; U; Intel Mac OS X; zh-tw) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13.3 +Mozilla/5.0 (Macintosh; U; Mac OS X 10_5_7; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/ Safari/530.5 +Mozilla/5.0 (Macintosh; U; Mac OS X 10_6_1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/ Safari/530.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en-GB; rv:1.9.2.19) Gecko/20110707 Firefox/3.6.19 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en-GB; rv:1.9b5) Gecko/2008032619 Firefox/3.0b5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en-US; rv:1.9.0.16) Gecko/2010010314 Firefox/3.0.16 Flock/2.5.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en-US; rv:1.9.0.4) Gecko/20081029 Firefox/2.0.0.18 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en-US; rv:1.9.1b2pre) Gecko/20081027 Minefield/3.1b2pre +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en-US; rv:1.9.1b3pre) Gecko/20090223 SeaMonkey/2.0a3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en-US; rv:1.9.2.22) Gecko/20110902 Firefox/3.6.22 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en; rv:1.9.0.19) Gecko/2010051911 Camino/2.0.3 (like Firefox/3.0.19) +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en; rv:1.9.2.24) Gecko/20111114 Camino/2.1 (like Firefox/3.6.24) +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.0.16) Gecko/2010010314 Firefox/3.0.16 Flock/2.5.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081212 Mozilla/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/526.9 (KHTML, like Gecko) Version/4.0dp1 Safari/526.8 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; it; rv:1.9.0.19) Gecko/2010111021 Camino/2.0.6 (MultiLang) (like Firefox/3.0.19) +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; da-dk) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; de) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; de-de) AppleWebKit/533.16 (KHTML, like Gecko) Version/4.1 Safari/533.16 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; en) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.18 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; en) AppleWebKit/525.3+ (KHTML, like Gecko) Version/3.0.4 Safari/523.12.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; en) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; es-es) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; fr) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.22 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; fr) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; fr-fr) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; hu-hu) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; it-it) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; ja-jp) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.18 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; ja-jp) AppleWebKit/533.16 (KHTML, like Gecko) Version/4.1 Safari/533.16 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; nl-nl) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; nl-nl) AppleWebKit/533.16 (KHTML, like Gecko) Version/4.1 Safari/533.16 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; pl-pl) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; sv-se) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.22 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; sv-se) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; tr) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_2; en) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.18 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_2; en-gb) AppleWebKit/526+ (KHTML, like Gecko) Version/3.1 Safari/525.9 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_2; en-gb) AppleWebKit/526+ (KHTML, like Gecko) Version/3.1 iPhone +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_3; en) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_3; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_3; sv-se) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.0.4 Safari/523.10 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1 Safari/525.13 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_4; fr-fr) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_5; en-us) AppleWebKit/525.26.2 (KHTML, like Gecko) Version/3.2 Safari/525.26.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_5; fi-fi) AppleWebKit/525.26.2 (KHTML, like Gecko) Version/3.2 Safari/525.26.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_5; fr-fr) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_6; en-us) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_6; en-us) AppleWebKit/528.16 (KHTML, like Gecko) +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_6; en-us) AppleWebKit/530.1+ (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_6; fr-fr) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_6; nl-nl) AppleWebKit/530.0+ (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_7; en-us) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; en-us) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; en-us) AppleWebKit/532.0+ (KHTML, like Gecko) Version/4.0.3 Safari/531.9 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; en-us) AppleWebKit/532.0+ (KHTML, like Gecko) Version/4.0.3 Safari/531.9.2009 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/3.2.3 Safari/525.28.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; zh-cn) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_6_1; en_GB, en_US) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_8_1; nn-no) AppleWebKit/533.21.1 (KHTML, like Gecko) iCab/4.8b Safari/533.16 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; de; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; de; rv:1.8.1.5pre) Gecko/20070605 Camino/1.6a1pre +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-GB; rv:1.8.1a2) Gecko/20060512 BonEcho/2.0a2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.0.1) Gecko/20021216 Chimera/0.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.0.1) Gecko/20021220 Chimera/0.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.0.1) Gecko/20030109 Chimera/0.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.0.1) Gecko/20030111 Chimera/0.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.0.1) Gecko/20030306 Camino/0.7 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.3a) Gecko/20030101 Phoenix/0.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.4a) Gecko/20030401 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.5) Gecko/20031026 Firebird/0.7 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.5.1) Gecko/20031120 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.6) Gecko/20040113 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7) Gecko/20040517 Camino/0.8b +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7) Gecko/20040614 Firefox/0.9 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.13) Gecko/20060410 Firefox/1.0.8 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.13) Gecko/20060414 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.2) Gecko/20040803 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.2) Gecko/20040825 Camino/0.8.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.6) Gecko/20050319 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.7) Gecko/20050503 Firefox/1.0.3 Madfox/0.3.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.8) Gecko/20050427 Camino/0.8.4 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.9) Gecko/20050711 Firefox/1.0.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8) Gecko/20051107 Camino/1.0b1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8) Gecko/20051228 Camino/1.0b1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8) Gecko/20051229 Camino/1.0b2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8) Gecko/20060320 Firefox/2.0a1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8) Gecko/20060322 Firefox/2.0a1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.1) Gecko/20060119 Camino/1.0b2+ +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.1) Gecko/20060214 Camino/1.0 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.1) Gecko/20060217 Flock/0.5.11 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.1) Gecko/20060307 Camino/1.0 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.1) Gecko/20060314 Flock/0.5.13.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.1) Gecko/20060331 Flock/0.7 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.10) Gecko/20070228 Camino/1.0.4 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.3) Gecko/20060427 Camino/1.0.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.3) Gecko/20060503 Camino/1.0.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.4) Gecko/20060612 Firefox/1.5.0.4 Flock/0.7.0.17.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.4) Gecko/20060613 Camino/1.0.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.4) Gecko/20060620 Firefox/1.5.0.4 Flock/0.7.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.5) Gecko/20060731 Firefox/1.5.0.5 Flock/0.7.4.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.7) Gecko/20060910 SeaMonkey/1.0.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.7) Gecko/20060911 Camino/1.0.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.7) Gecko/20060911 Camino/1.0.3 (MultiLang) +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1) Gecko/20061013 Camino/1.0+ +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1) Gecko/20061013 Camino/1.0+ (Firefox compatible) +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1) Gecko/20061025 BonEcho/2.0 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1) Gecko/20061026 BonEcho/2.0 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1.1) Gecko/20061204 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1.11pre) Gecko/20071206 Firefox/2.0.0.11 Navigator/9.0.0.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Navigator/9.0.0.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1.19) Gecko/20081204 SeaMonkey/1.1.14 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1.2) Gecko/20070221 SeaMonkey/1.1.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1.2) Gecko/20070223 BonEcho/2.0.0.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1.3) Gecko/20070329 BonEcho/2.0.0.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.4 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1.5pre) Gecko/20070710 Firefox/2.0.0.4 Navigator/9.0b2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1.7pre) Gecko/20070815 Firefox/2.0.0.6 Navigator/9.0b3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1.8) Gecko/20071101 Firefox/2.0.0.8 Flock/1.0 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1.8pre) Gecko/20071015 Firefox/2.0.0.7 Navigator/9.0 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1a2) Gecko/20060512 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1a2) Gecko/20060512 BonEcho/2.0a2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1a3) Gecko/20060528 Camino/1.0+ +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1b1) Gecko/20060707 Firefox/2.0b1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1b1) Gecko/20060710 Firefox/2.0b1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1b1) Gecko/20060721 Camino/1.0+ +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1b1) Gecko/20060807 Camino/1.0+ +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1b1) Gecko/20061110 Firefox/2.0b3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8b) Gecko/20050217 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8b2) Gecko Camino/0.9+ +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8b4) Gecko/20050908 Firefox/1.4 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8b4) Gecko/20050914 Camino/1.0a1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8b5) Gecko/20051006 Firefox/1.4.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8b5) Gecko/20051021 Flock/0.4 Firefox/1.0+ +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.9a1) Gecko/20060707 SeaMonkey/1.5a +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.9a1) Gecko/20061204 Firefox/3.0a1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.9a1) Gecko/20061204 GranParadiso/3.0a1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en; rv:1.7.12) Gecko/20050928 Firefox/1.0.7 Madfox/3.0 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en; rv:1.8.1.12) Gecko/20080206 Camino/1.5.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en; rv:1.8.1.21) Gecko/20090327 Camino/1.6.7 (like Firefox/2.0.0.21pre) +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en; rv:1.8.1.2pre) Gecko/20070227 Camino/1.1b +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en; rv:1.8.1.4) Gecko/20070509 Camino/1.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en; rv:1.8.1.4pre) Gecko/20070511 Camino/1.6pre +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en; rv:1.8.1.6) Gecko/20070809 Camino/1.5.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en; rv:1.9a4pre) Gecko/20070404 Camino/1.2+ +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; es-ES; rv:1.7.3) Gecko/20040910 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; es-ES; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; fr-FR; rv:1.7.11) Gecko/20050727 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; fr; rv:1.7.3) Gecko/20040910 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; it; rv:1.8.1.21) Gecko/20090327 Camino/1.6.7 (MultiLang) (like Firefox/2.0.0.21pre) +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; rv:1.7.2) Gecko/20040804 Netscape/7.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; rv:1.7.3) Gecko/20040913 Firefox/0.10 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; rv:1.8.1.16) Gecko/20080702 Firefox +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ca-es) AppleWebKit/522.11.1 (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; da-dk) AppleWebKit/522+ (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-CH) AppleWebKit/419.2 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-DE) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.46 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-ch) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-ch) AppleWebKit/85 (KHTML, like Gecko) Safari/85 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/124 (KHTML, like Gecko) Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/124 (KHTML, like Gecko) Safari/125.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.7 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/125.4 (KHTML, like Gecko) Safari/125.9 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.12_Adobe +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/125.5.6 (KHTML, like Gecko) Safari/125.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/125.5.6 (KHTML, like Gecko) Safari/125.12_Adobe +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/125.5.7 (KHTML, like Gecko) Safari/125.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312.3.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.1.1 (KHTML, like Gecko) Safari/312 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.5.2 (KHTML, like Gecko) Safari/312.3.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5_Adobe +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.8 (KHTML, like Gecko) Shiira/1.2.2 Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.8.1 (KHTML, like Gecko) Safari/312.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/412 (KHTML, like Gecko) Safari/412 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/412.6 (KHTML, like Gecko) +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/412.6 (KHTML, like Gecko) Safari/412.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/412.6 (KHTML, like Gecko) Safari/412.2_Adobe +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/412.6.2 (KHTML, like Gecko) Safari/412.2.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/412.7 (KHTML, like Gecko) Safari/412.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/412.7 (KHTML, like Gecko) Safari/412.5_Adobe +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13_Adobe +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/419.2 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/522.11 (KHTML, like Gecko) Version/3.0.2 Safari/522.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.7 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.8.2 (KHTML, like Gecko) Safari/85.8 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.8.5 (KHTML, like Gecko) Safari/85 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.8.5 (KHTML, like Gecko) Safari/85.8.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/124 (KHTML, like Gecko) +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/124 (KHTML, like Gecko) Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.7 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/85.8 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.4 (KHTML, like Gecko) Safari/100 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.4 (KHTML, like Gecko) Safari/125.9 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.5 (KHTML, like Gecko) Safari/125.9 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.11 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.5.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.5.6 (KHTML, like Gecko) Safari/125.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.5.7 (KHTML, like Gecko) Safari/125.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.1.1 (KHTML, like Gecko) Safari/312 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.5 (KHTML, like Gecko) Safari/312.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/125.9 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/312.3.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.5.2 (KHTML, like Gecko) Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.5.2 (KHTML, like Gecko) Safari/312.3.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.3.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.8.1 (KHTML, like Gecko) Safari/312.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412 (KHTML, like Gecko) Safari/412 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412.6 (KHTML, like Gecko) Safari/412.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412.6.2 (KHTML, like Gecko) +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412.6.2 (KHTML, like Gecko) Safari/412.2.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412.7 (KHTML, like Gecko) Safari/412.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412.7 (KHTML, like Gecko) Safari/412.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/416.11 (KHTML, like Gecko) +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/416.11 (KHTML, like Gecko) Safari/416.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/417.9 (KHTML, like Gecko) Hana/1.0 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/417.9 (KHTML, like Gecko) NetNewsWire/2.0.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/417.9 (KHTML, like Gecko, Safari) Shiira/1.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.8 (KHTML, like Gecko) NetNewsWire/2.1.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.8 (KHTML, like Gecko, Safari) Cheshire/1.0.UNOFFICIAL +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.9 (KHTML, like Gecko) AppleWebKit/418.9 Cheshire/1.0.ALPHA +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.9 (KHTML, like Gecko) Hana/1.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3 Cheshire/1.0.ALPHA +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.9 (KHTML, like Gecko) Shiira/1.2.2 Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.9 (KHTML, like Gecko, Safari) Safari/419.3 Cheshire/1.0.ALPHA +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.9 (KHTML, like Gecko, Safari/111) Cheshire/1.0.ALPHA +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.9 (KHTML, like Safari) Cheshire/1.0.ALPHA +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/419 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/419 (KHTML, like Gecko) Shiira Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/419 (KHTML, like Gecko) Shiira/1.2.2 Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/419 (KHTML, like Gecko) Shiira/1.2.3 Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/419 (KHTML, like Gecko, Safari/419.3) Cheshire/1.0.ALPHA +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/419.2.1 (KHTML, like Gecko) Shiira Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/419.3 (KHTML, like Gecko) Shiira Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/522+ (KHTML, like Gecko) OmniWeb +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/522.10.1 (KHTML, like Gecko) Shiira Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/522.10.1 (KHTML, like Gecko) Shiira/1.2.2 Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/522.11 (KHTML, like Gecko) Version/3.0.2 Safari/522.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/522.11.1 (KHTML, like Gecko) Shiira Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/522.11.1 (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/523.3+ (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/85.8.2 (KHTML, like Gecko) Safari/85.8.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/85.8.5 (KHTML, like Gecko) Safari/85.8.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.15 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.57 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.59 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.60 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.66 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari) OmniWeb/v595 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v601 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v602 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v603 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v605 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v496 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US; rv:1.0.1) Gecko/20021104 Chimera/0.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US; rv:1.0.1) Gecko/20021111 Chimera/0.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US; rv:1.1a) Gecko/20020610 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US; rv:1.2) Gecko/20021126 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US; rv:1.2b) Gecko/20021016 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-au) AppleWebKit/125.4 (KHTML, like Gecko) Safari/125.9 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-ca) AppleWebKit/416.11 (KHTML, like Gecko) Safari/416.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-gb) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-gb) AppleWebKit/85.8.5 (KHTML, like Gecko) Safari/85.8.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/124 (KHTML, like Gecko) Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.7 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/125.4 (KHTML, like Gecko) Safari/125.9 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.11 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/125.5.6 (KHTML, like Gecko) Safari/125.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/125.5.7 (KHTML, like Gecko) Safari/125.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/125.5.7 (KHTML, like Gecko) SunriseBrowser/0.833 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/125.5.7 (KHTML, like Gecko) SunriseBrowser/0.84 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/125.5.7 (KHTML, like Gecko) SunriseBrowser/0.853 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/125.5.7 (KHTML, like Gecko) SunriseBrowser/0.895 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.1 (KHTML, like Gecko) +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.5 (KHTML, like Gecko) Safari/312.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/312.3.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.8.1 (KHTML, like Gecko) Safari/312.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/412 (KHTML, like Gecko) Safari/412 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/412 (KHTML, like Gecko) Safari/412 Privoxy/3.0 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/412.6 (KHTML, like Gecko) Safari/412.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/412.7 (KHTML, like Gecko) Safari/412.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/416.11 (KHTML, like Gecko) Safari/416.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/417.9 (KHTML, like Gecko) NetNewsWire/2.0 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.9.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/419 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/419 (KHTML, like Gecko) Shiira Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/522+ (KHTML, like Gecko) Version/3.0.2 Safari/522.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/522.11 (KHTML, like Gecko) Version/3.0.2 Safari/522.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/523.10.3 (KHTML, like Gecko) Version/3.0.4 Safari/523.10 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/523.15.1 (KHTML, like Gecko) Shiira Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/523.6 (KHTML, like Gecko) Version/3.0.3 Safari/523.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/85.8.2 (KHTML, like Gecko) Safari/85.8 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/85.8.5 (KHTML, like Gecko) Safari/85.8.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en_CA) AppleWebKit/125.4 (KHTML, like Gecko) Safari/125.9 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en_CA) AppleWebKit/419 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en_CA) AppleWebKit/522+ (KHTML, like Gecko) Shiira/1.2.3 Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en_US) AppleWebKit/412 (KHTML, like Gecko) Safari/412 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; es) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/312.3.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; es) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; es) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; es) AppleWebKit/419 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; es-ES) AppleWebKit/412 (KHTML, like Gecko) Safari/412 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; es-es) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; es-es) AppleWebKit/312.5.2 (KHTML, like Gecko) Safari/312.3.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; es-es) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fi-fi) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fi-fi) AppleWebKit/420+ (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/312.5 (KHTML, like Gecko) Safari/312.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/312.3.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/312.5.2 (KHTML, like Gecko) Safari/312.3.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/412 (KHTML, like Gecko) Safari/412 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/412.6 (KHTML, like Gecko) Safari/412.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/412.7 (KHTML, like Gecko) Safari/412.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/416.11 (KHTML, like Gecko) Safari/416.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/416.12 (KHTML, like Gecko) Safari/412.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13_Adobe +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/417.9 (KHTML, like Gecko) +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/417.9 (KHTML, like Gecko) NetNewsWire/2.0.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/85.8.5 (KHTML, like Gecko) Safari/85.8.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-FR; rv:0.9.4.1) Gecko/20020315 Netscape6/6.2.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-FR; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-ca) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-ch) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.11 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-ch) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-ch) AppleWebKit/312.1.1 (KHTML, like Gecko) Safari/312 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/125.4 (KHTML, like Gecko) Safari/125.9 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/125.5 (KHTML, like Gecko) Safari/125.9 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.11 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/125.5.6 (KHTML, like Gecko) Safari/125.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.1 (KHTML, like Gecko) Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.1.1 (KHTML, like Gecko) Safari/312 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.5 (KHTML, like Gecko) Safari/312.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/312.3.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.5.2 (KHTML, like Gecko) Safari/312.3.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/412 (KHTML, like Gecko) Safari/412 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/412.7 (KHTML, like Gecko) Safari/412.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/416.11 (KHTML, like Gecko) Safari/416.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/523.10.3 (KHTML, like Gecko) Version/3.0.4 Safari/523.10 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/85.8.5 (KHTML, like Gecko) Safari/85.8.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-IT) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.15 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/124 (KHTML, like Gecko) Safari/125.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/312.3.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/412.6 (KHTML, like Gecko) Safari/412.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/412.7 (KHTML, like Gecko) Safari/412.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.9.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/419 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/125.4 (KHTML, like Gecko) Safari/125.9 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/312.3.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/412.7 (KHTML, like Gecko) Safari/412.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/419 (KHTML, like Gecko) Shiira/1.2.3 Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nb-no) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nb-no) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nb-no) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nl-nl) AppleWebKit/416.11 (KHTML, like Gecko) Safari/312 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nl-nl) AppleWebKit/416.11 (KHTML, like Gecko) Safari/416.12 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nl-nl) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nl-nl) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nl-nl) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.9.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nl-nl) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nl-nl) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; pl-PL; rv:1.0.1) Gecko/20021111 Chimera/0.6 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; pl-pl) AppleWebKit/312.8 (KHTML, like Gecko) Shiira/1.2.1 Safari/125 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; pl-pl) AppleWebKit/312.8 (KHTML, like Gecko, Safari) DeskBrowse/1.0 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; pt-pt) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/312.3.1 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/312.5.2 (KHTML, like Gecko) Safari/312.3.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8_Adobe +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/418.9 (KHTML, like Gecko) Safari/ +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/419 (KHTML, like Gecko) Safari/419.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/523.12.2 (KHTML, like Gecko) Version/3.0.4 Safari/523.12.2 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5 +Mozilla/5.0 (Macintosh; U; PPC Mac OS X; tr-tr) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS; en) iCab 3 +Mozilla/5.0 (Macintosh; U; PPC Mac OS; en-en) AppleWebKit/412 (KHTML, like Gecko) Safari/412 +Mozilla/5.0 (Macintosh; U; PPC Mac OS; pl-pl) AppleWebKit/412 (KHTML, like Gecko) Safari/412 +Mozilla/5.0 (Macintosh; U; PPC Max OS X Mach-O; it-IT; rv:1.8.0.7) Gecko/200609211 Camino/1.0.3 +Mozilla/5.0 (Macintosh; U; PPC; de-DE; rv:0.9.2) Gecko/20010726 Netscape6/6.1 +Mozilla/5.0 (Macintosh; U; PPC; de-DE; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (Macintosh; U; PPC; de-DE; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (Macintosh; U; PPC; en-US; mimic; rv:9.3.0) Clecko/20120101 Classilla/CFM +Mozilla/5.0 (Macintosh; U; PPC; en-US; mimic; rv:9.3.0) Gecko/20120117 Firefox/3.6.25 Classilla/CFM +Mozilla/5.0 (Macintosh; U; PPC; en-US; rv:0.9.2) Gecko/20010726 Netscape6/6.1 +Mozilla/5.0 (Macintosh; U; PPC; en-US; rv:0.9.3) Gecko/20010802 +Mozilla/5.0 (Macintosh; U; PPC; en-US; rv:0.9.4.1) Gecko/20020318 Netscape6/6.2.2 +Mozilla/5.0 (Macintosh; U; PPC; en-US; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (Macintosh; U; PPC; en-US; rv:1.0.2) Gecko/20021216 +Mozilla/5.0 (Macintosh; U; PPC; en-US; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (Macintosh; U; PPC; en-US; rv:1.0rc2) Gecko/20020512 Netscape/7.0b1 +Mozilla/5.0 (Macintosh; U; PPC; en-US; rv:1.2a) Gecko/20020910 +Mozilla/5.0 (Macintosh; U; PPC; en-US; rv:1.2b) Gecko/20021016 +Mozilla/5.0 (Macintosh; U; PPC; fr-FR; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (Macintosh; U; PPC; fr-FR; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (Macintosh; U; PPC; ja-JP; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (Macintosh; U; PowerPC Mac OS X 10_5_8; en-US) AppleWebKit/531.9+(KHTML, like Gecko, Safari/528.16) OmniWeb/v622.10.0 +Mozilla/5.0 (Macintosh; U; i386 Mac OS X; en) AppleWebKit/417.9 (KHTML, like Gecko) Hana/1.0 +Mozilla/5.0 (Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0_1 like Mac OS X; fr-fr) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5G77 Safari/525.20 +Mozilla/5.0 (OS/2; U; Warp 4.5; de-DE; rv:1.7.5) Gecko/20050523 +Mozilla/5.0 (OS/2; U; Warp 4.5; en-US; rv:1.8.0.6) Gecko/20060730 MultiZilla/1.8.2.0i SeaMonkey/1.0.4 +Mozilla/5.0 (OS/2; U; Warp 4.5; en-US; rv:1.8.0.7) Gecko/20060910 MultiZilla/1.8.2.0i SeaMonkey/1.0.5 +Mozilla/5.0 (OS/2; U; Warp 4.5; en-US; rv:1.8.1.3pre) Gecko/20070307 SeaMonkey/1.1.1+ +Mozilla/5.0 (OS/2; U; Warp 4.5; en-US; rv:1.9a1) Gecko/20051119 MultiZilla/1.8.1.0s SeaMonkey/1.5a +Mozilla/5.0 (Photon; U; QNX x86pc; en-US; rv:1.6) Gecko/20040429 +Mozilla/5.0 (SunOS 5.8 sun4u; U) Opera 5.0 [en] +Mozilla/5.0 (U; Windows NT 5.1; en-GB; rv:1.8.1.17) Gecko/20080808 Firefox/2.0.0.17 +Mozilla/5.0 (U; Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0 +Mozilla/5.0 (U;) AppleWebKit/532.0 (KHTML, like Gecko) Iron/3.0.197.0 Safari/532.0 +Mozilla/5.0 (Windows 2000; U) Opera 6.01 [de] +Mozilla/5.0 (Windows 2000; U) Opera 6.01 [en] +Mozilla/5.0 (Windows 2000; U) Opera 6.02 [en] +Mozilla/5.0 (Windows 2000; U) Opera 6.03 [en] +Mozilla/5.0 (Windows 2000; U) Opera 6.04 [en] +Mozilla/5.0 (Windows 2000; U) Opera 7.0 [en] +Mozilla/5.0 (Windows 8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30 +Mozilla/5.0 (Windows 98; U) Opera 5.12 [de] +Mozilla/5.0 (Windows 98; U; en) Opera 8.54 +Mozilla/5.0 (Windows 98; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 +Mozilla/5.0 (Windows ME; U) Opera 6.05 [de] +Mozilla/5.0 (Windows ME; U; en) Opera 8.51 +Mozilla/5.0 (Windows NT 4.0; U) Opera 6.05 [en] +Mozilla/5.0 (Windows NT 5.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1150.1 Iron/20.0.1150.1 Safari/536.11 +Mozilla/5.0 (Windows NT 5.0; U) Opera 7.01 [en] +Mozilla/5.0 (Windows NT 5.0; U) Opera 7.11 [en] +Mozilla/5.0 (Windows NT 5.0; U) Opera 7.21 [en] +Mozilla/5.0 (Windows NT 5.0; U) Opera 7.54 [en] +Mozilla/5.0 (Windows NT 5.0; U; de) Opera 8.50 +Mozilla/5.0 (Windows NT 5.0; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0 +Mozilla/5.0 (Windows NT 5.0; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0 +Mozilla/5.0 (Windows NT 5.0; rv:1.9.1.19) Gecko/20110420 Firefox/3.6 SeaMonkey/2.0.14 +Mozilla/5.0 (Windows NT 5.0; rv:2.0.1) Gecko/20110608 Firefox/4.0.1 SeaMonkey/2.1 +Mozilla/5.0 (Windows NT 5.0; rv:5.0) Gecko/20100101 Firefox/5.0 +Mozilla/5.0 (Windows NT 5.0; rv:5.0) Gecko/20110706 Firefox/5.0 SeaMonkey/2.2 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.43 Safari/534.24 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.700.3 Safari/534.24 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.1 Chrome/11.0.700.1 Safari/534.24 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.2 Chrome/11.0.700.2 Safari/534.24 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.3 Chrome/11.0.700.3 Safari/534.24 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.56.310 Chrome/11.0.696.68 Safari/534.24 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.56.357 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.484 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.494 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.25 (KHTML, like Gecko) Chrome/12.0.704.0 Safari/534.25 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.25 (KHTML, like Gecko) Chrome/12.0.706.0 Safari/534.25 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30 ChromePlus/1.6.3.1 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.30 (KHTML, like Gecko) Comodo_Dragon/12.1.0.0 Chrome/12.0.742.91 Safari/534.30 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.30 (KHTML, like Gecko) Iron/12.0.750.0 Chrome/12.0.750.0 Safari/534.30 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.20 Safari/535.1 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.792.0 Safari/535.1 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.809.0 Safari/535.1 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.810.0 Safari/535.1 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.813.0 Safari/535.1 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.815.0 Safari/535.1 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Iron/13.0.800.0 Chrome/13.0.800.0 Safari/535.1 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Iron/17.0.1000.0 Chrome/17.0.1000.0 Safari/535.11 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Iron/17.0.1000.1 Chrome/17.0.1000.1 Safari/535.11 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.860.0 Safari/535.2 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.864.0 Safari/535.2 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.872.0 Safari/535.2 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.6 (KHTML, like Gecko) Chrome/16.0.897.0 Safari/535.6 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1150.0 Iron/20.0.1150.0 Safari/536.11 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1150.1 Iron/20.0.1150.1 Safari/536.11 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1200.0 Iron/21.0.1200.0 Safari/537.1 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1200.1 Iron/21.0.1200.0 Safari/537.1 +Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1250.0 Iron/22.0.2150.0 Safari/537.4 +Mozilla/5.0 (Windows NT 5.1; U) Opera 7.03 [de] +Mozilla/5.0 (Windows NT 5.1; U) Opera 7.11 [en] +Mozilla/5.0 (Windows NT 5.1; U) Opera 7.54 [de] +Mozilla/5.0 (Windows NT 5.1; U; ; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.52 +Mozilla/5.0 (Windows NT 5.1; U; Firefox/3.5; en; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.53 +Mozilla/5.0 (Windows NT 5.1; U; Firefox/4.5; en; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.53 +Mozilla/5.0 (Windows NT 5.1; U; Firefox/5.0; en; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.53 +Mozilla/5.0 (Windows NT 5.1; U; de) Opera 8.50 +Mozilla/5.0 (Windows NT 5.1; U; de) Opera 8.52 +Mozilla/5.0 (Windows NT 5.1; U; de; rv:1.7.5) Gecko/20041110 +Mozilla/5.0 (Windows NT 5.1; U; de; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 +Mozilla/5.0 (Windows NT 5.1; U; de; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51 +Mozilla/5.0 (Windows NT 5.1; U; de; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.52 +Mozilla/5.0 (Windows NT 5.1; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.00 +Mozilla/5.0 (Windows NT 5.1; U; en) Opera 8.0 +Mozilla/5.0 (Windows NT 5.1; U; en) Opera 8.01 +Mozilla/5.0 (Windows NT 5.1; U; en) Opera 8.02 +Mozilla/5.0 (Windows NT 5.1; U; en) Opera 8.50 +Mozilla/5.0 (Windows NT 5.1; U; en) Opera 8.51 +Mozilla/5.0 (Windows NT 5.1; U; en) Opera 8.52 +Mozilla/5.0 (Windows NT 5.1; U; en) Opera 8.53 +Mozilla/5.0 (Windows NT 5.1; U; en-GB; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51 +Mozilla/5.0 (Windows NT 5.1; U; en-GB; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.61 +Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.7.5) Gecko/20041110 +Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 +Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Opera 9.22 +Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Opera 9.24 +Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Opera 9.26 +Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51 +Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11 +Mozilla/5.0 (Windows NT 5.1; U; es-es; rv:1.7.5) Gecko/20041110 +Mozilla/5.0 (Windows NT 5.1; U; es-la; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Opera 9.27 +Mozilla/5.0 (Windows NT 5.1; U; fr) Opera 8.51 +Mozilla/5.0 (Windows NT 5.1; U; pl) Opera 8.54 +Mozilla/5.0 (Windows NT 5.1; U; pl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.00 +Mozilla/5.0 (Windows NT 5.1; U; pt-br; rv:1.7.5) Gecko/20041110 +Mozilla/5.0 (Windows NT 5.1; U; ru) Opera 8.51 +Mozilla/5.0 (Windows NT 5.1; U; rv:5.0) Gecko/20100101 Firefox/5.0 +Mozilla/5.0 (Windows NT 5.1; U; tr; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 +Mozilla/5.0 (Windows NT 5.1; U; zh-cn; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50 +Mozilla/5.0 (Windows NT 5.1; U; zh-cn; rv:1.8.1) Gecko/20091102 Firefox/3.5.5 +Mozilla/5.0 (Windows NT 5.1; U; zh-cn; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.53 +Mozilla/5.0 (Windows NT 5.1; U; zh-cn; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.70 +Mozilla/5.0 (Windows NT 5.1; U; zh-tw) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.2 Chrome/11.0.700.2 Safari/534.24 +Mozilla/5.0 (Windows NT 5.1; rv:1.9.2.8) Gecko/20110608 Firefox/3.6.8 Seamonkey/2.1 +Mozilla/5.0 (Windows NT 5.1; rv:1.9a1) Gecko/20060217 Firefox/1.6a1 +Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 +Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20120403211507 Firefox/12.0 +Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20120605 Firefox/12.2 Palemoon/12.2 +Mozilla/5.0 (Windows NT 5.1; rv:12.2) Gecko/20120605 Firefox/12.2 PaleMoon/12.2 +Mozilla/5.0 (Windows NT 5.1; rv:12.2.1) Gecko/20120616 Firefox/12.2.1 PaleMoon/12.2.1 +Mozilla/5.0 (Windows NT 5.1; rv:12.2.1) Gecko/20120616 PaleMoon/12.2.1 +Mozilla/5.0 (Windows NT 5.1; rv:12.3) Gecko/20120714 Firefox/12.3 PaleMoon/12.3 +Mozilla/5.0 (Windows NT 5.1; rv:12.3) Gecko/20120717 Firefox/12.3 PaleMoon/12.3 +Mozilla/5.0 (Windows NT 5.1; rv:12.3) Gecko/20120728 Firefox/12.3r2 PaleMoon/12.3r2 +Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20120405 Firefox/14.0a1 +Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/13.0.1 +Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20120819 Firefox/15.0 PaleMoon/15.0 +Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20120911 Firefox/15.1 PaleMoon/15.1 +Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/5.0 +Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20110511 Firefox/4.0.1 SeaMonkey/2.1 +Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20110608 Firefox/4.0.1 SeaMonkey/2.1 +Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20110608 Firefox/4.0.1 SeaMonkey/2.1 Lightning/1.0b4pre +Mozilla/5.0 (Windows NT 5.1; rv:2.0b13pre) Gecko/20110223 Firefox/4.0b13pre +Mozilla/5.0 (Windows NT 5.1; rv:2.0b8pre) Gecko/20101127 Firefox/4.0b8pre +Mozilla/5.0 (Windows NT 5.1; rv:2.0b9pre) Gecko/20110105 Firefox/4.0b9pre +Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0 FirePHP/0.6 +Mozilla/5.0 (Windows NT 5.1; rv:7.0a1) Gecko/20110612 Firefox/7.0a1 SeaMonkey/2.4a1 +Mozilla/5.0 (Windows NT 5.1; rv:7.0a1) Gecko/20110619 Firefox/7.0a1 SeaMonkey/2.4a1 +Mozilla/5.0 (Windows NT 5.1; rv:8.0; en_us) Gecko/20100101 Firefox/8.0 +Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30 +Mozilla/5.0 (Windows NT 5.2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.792.0 Safari/535.1 +Mozilla/5.0 (Windows NT 5.2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.794.0 Safari/535.1 +Mozilla/5.0 (Windows NT 5.2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.813.0 Safari/535.1 +Mozilla/5.0 (Windows NT 5.2) AppleWebKit/535.11 (KHTML, like Gecko) Iron/17.0.1000.0 Chrome/17.0.1000.0 Safari/535.11 +Mozilla/5.0 (Windows NT 5.2) AppleWebKit/535.7 (KHTML, like Gecko) Iron/16.0.950.0 Chrome/16.0.950.0 Safari/535.7 +Mozilla/5.0 (Windows NT 5.2) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1150.1 Iron/20.0.1150.1 Safari/536.11 +Mozilla/5.0 (Windows NT 5.2) AppleWebKit/536.5 (KHTML, like Gecko) Iron/19.0.1100.0 Chrome/19.0.1100.0 Safari/536.5 +Mozilla/5.0 (Windows NT 5.2) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1200.0 Iron/21.0.1200.0 Safari/537.1 +Mozilla/5.0 (Windows NT 5.2; U; de; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 +Mozilla/5.0 (Windows NT 5.2; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Opera 9.27 +Mozilla/5.0 (Windows NT 5.2; U; ru; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.70 +Mozilla/5.0 (Windows NT 5.2; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 +Mozilla/5.0 (Windows NT 5.2; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7 +Mozilla/5.0 (Windows NT 5.2; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0 +Mozilla/5.0 (Windows NT 5.2; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1 +Mozilla/5.0 (Windows NT 5.2; rv:15.0) Gecko/20120909 Firefox/15.0.1 SeaMonkey/2.12.1 +Mozilla/5.0 (Windows NT 5.2; rv:2.0b13pre) Gecko/20110304 Firefox/4.0b13pre +Mozilla/5.0 (Windows NT 5.2; rv:2.0b13pre) Gecko/20110317 SeaMonkey/2.1b3pre +Mozilla/5.0 (Windows NT 5.2; rv:2.0b5pre) Gecko/20100830 SeaMonkey/2.1b1pre +Mozilla/5.0 (Windows NT 5.2; rv:2.0b7pre) Gecko/20100915 Firefox/4.0b7pre SeaMonkey/2.1b1pre +Mozilla/5.0 (Windows NT 5.2; rv:2.0b8pre) Gecko/20101014 SeaMonkey/2.1b2pre +Mozilla/5.0 (Windows NT 5.2; rv:2.0b8pre) Gecko/20101028 SeaMonkey/2.1b2pre +Mozilla/5.0 (Windows NT 5.2; rv:2.0b9pre) Gecko/20101231 SeaMonkey/2.1b2pre +Mozilla/5.0 (Windows NT 5.2; rv:2.0b9pre) Gecko/20110110 SeaMonkey/2.1b2pre +Mozilla/5.0 (Windows NT 5.2; rv:2.2a1pre) Gecko/20110327 SeaMonkey/2.2a1pre +Mozilla/5.0 (Windows NT 5.2; rv:6.0a1) Gecko/20110512 SeaMonkey/2.2a1pre +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110524 SeaMonkey/2.2a1pre +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110525 SeaMonkey/2.2a1pre +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110526 SeaMonkey/2.2a1pre +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110527 SeaMonkey/2.2a1pre +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110529 SeaMonkey/2.2a1pre +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110530 SeaMonkey/2.2a1pre +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110601 SeaMonkey/2.2a1pre +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110602 SeaMonkey/2.2a1pre +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110603 SeaMonkey/2.2a1pre +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110605 SeaMonkey/2.2a1pre +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110607 SeaMonkey/2.4a1 +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110610 SeaMonkey/2.4a1 +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110613 SeaMonkey/2.4a1 +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110614 SeaMonkey/2.4a1 +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110616 SeaMonkey/2.4a1 +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110618 SeaMonkey/2.4a1 +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110619 SeaMonkey/2.4a1 +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110621 SeaMonkey/2.4a1 +Mozilla/5.0 (Windows NT 5.2; rv:7.0a1) Gecko/20110622 SeaMonkey/2.4a1 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.3 Safari/534.24 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.1 Chrome/11.0.700.1 Safari/534.24 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.2 Chrome/11.0.700.2 Safari/534.24 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.3 Chrome/11.0.700.3 Safari/534.24 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/534.30 (KHTML, like Gecko) Iron/12.0.750.0 Chrome/12.0.750.0 Safari/534.30 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.1 Safari/535.1 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.20 Safari/535.1 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.792.0 Safari/535.1 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Iron/13.0.800.0 Chrome/13.0.800.0 Safari/535.1 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.11 (KHTML, like Gecko) Iron/17.0.1000.0 Chrome/17.0.1000.0 Safari/535.11 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.11 (KHTML, like Gecko) Iron/17.0.1000.1 Chrome/17.0.1000.1 Safari/535.11 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Iron/15.0.900.1 Chrome/15.0.900.1 Safari/535.2 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1150.1 Iron/20.0.1150.1 Safari/536.11 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5 +Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1200.0 Iron/21.0.1200.0 Safari/537.1 +Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51 +Mozilla/5.0 (Windows NT 6.0; U; hu; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 +Mozilla/5.0 (Windows NT 6.0; U; ja; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.00 +Mozilla/5.0 (Windows NT 6.0; U; sv; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 +Mozilla/5.0 (Windows NT 6.0; U; tr; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 +Mozilla/5.0 (Windows NT 6.0; U; tr; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 10.10 +Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24 +Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.699.0 Safari/534.24 +Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.2 Chrome/11.0.700.2 Safari/534.24 +Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1 +Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 +Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11 +Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 +Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.45 Safari/535.19 +Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7 +Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7 +Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Iron/16.0.950.0 Chrome/16.0.950.0 Safari/535.7 +Mozilla/5.0 (Windows NT 6.0; WOW64; rv:12.2) Gecko/20120605 Firefox/12.2 PaleMoon/12.2 +Mozilla/5.0 (Windows NT 6.0; rv:11.0) Gecko/20120319 Firefox/11.0 PaleMoon/11.0 +Mozilla/5.0 (Windows NT 6.0; rv:12.0) Gecko/20120424 Firefox/12.0 PaleMoon/12.0 +Mozilla/5.0 (Windows NT 6.0; rv:12.3) Gecko/20120717 Firefox/12.3 PaleMoon/12.3 +Mozilla/5.0 (Windows NT 6.0; rv:12.3) Gecko/20120728 Firefox/12.3r2 PaleMoon/12.3r2 +Mozilla/5.0 (Windows NT 6.0; rv:14.0) Gecko/20100101 Firefox/14.0.1 +Mozilla/5.0 (Windows NT 6.0; rv:15.0) Gecko/20120819 Firefox/15.0 PaleMoon/15.0 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.694.0 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.3 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.697.0 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.699.0 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/12.0.702.0 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.1 Chrome/11.0.700.1 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.2 Chrome/11.0.700.2 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.3 Chrome/11.0.700.3 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.3 Chrome/11.0.700.3 Safari/534.66 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.777.3 Chrome/11.0.777.3 Safari/534.66 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.56.310 Chrome/11.0.696.68 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.56.357 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.390 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.113 Safari/534.30 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30 ChromePlus/1.6.3.0alpha4 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Comodo_Dragon/12.1.0.0 Chrome/12.0.742.91 Safari/534.30 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Iron/12.0.750.0 Chrome/12.0.750.0 Safari/534.30 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Iron/12.0.750.0 Chrome/12.0.750.0 Safari/534.30 Lightning/1.0b4pre +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.801.0 Safari/535.1 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.812.0 Safari/535.1 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.815.10913 Safari/535.1 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Iron/13.0.800.0 Chrome/13.0.800.0 Safari/535.1 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Iron/13.0.800.1 Chrome/13.0.800.1 Safari/535.1 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Iron/16.0.950.0 Chrome/16.0.950.0 Safari/535.1 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.11 (KHTML, like Gecko) Iron/17.0.1000.0 Chrome/17.0.1000.0 Safari/535.11 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.11 (KHTML, like Gecko) Iron/17.0.1000.2 Chrome/17.0.1000.2 Safari/535.11 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.861.0 Safari/535.2 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/18.6.872.0 Safari/535.2 UNTRUSTED/1.0 3gpp-gba UNTRUSTED/1.0 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7ad-imcjapan-syosyaman-xkgi3lqg03!wgz +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.8 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.8 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1150.0 Iron/20.0.1150.0 Safari/536.11 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1150.1 Iron/20.0.1150.1 Safari/536.11 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1200.0 Iron/21.0.1200.0 Safari/537.1 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.13 (KHTML, like Gecko) Chrome/24.0.1284.0 Safari/537.13 +Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2 +Mozilla/5.0 (Windows NT 6.1.1; rv:5.0) Gecko/20100101 Firefox/5.0 +Mozilla/5.0 (Windows NT 6.1; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01 +Mozilla/5.0 (Windows NT 6.1; U; en-GB; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.51 +Mozilla/5.0 (Windows NT 6.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 +Mozilla/5.0 (Windows NT 6.1; U; nl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01 +Mozilla/5.0 (Windows NT 6.1; U; ru; rv:5.0.1.6) Gecko/20110501 Firefox/5.0.1 Firefox/5.0.1 +Mozilla/5.0 (Windows NT 6.1; U;WOW64; de;rv:11.0) Gecko Firefox/11.0 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.12 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/12.0.702.0 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.1 Chrome/11.0.700.1 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.2 Chrome/11.0.700.2 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.3 Chrome/11.0.700.3 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.56.283 Chrome/11.0.696.65 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.56.292 Chrome/11.0.696.68 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.56.310 Chrome/11.0.696.68 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.56.343 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.56.357 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.423 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.478 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.484 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.494 Chrome/11.0.696.71 Safari/534.24 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.53 Safari/534.30 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Comodo_Dragon/12.1.0.0 Chrome/12.0.742.91 Safari/534.30 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Iron/12.0.750.0 Chrome/12.0.750.0 Safari/534.30 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.34 (KHTML, like Gecko) Arora/0.11.0 Safari/534.34 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.810.0 Safari/535.1 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.811.0 Safari/535.1 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.813.0 Safari/535.1 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.814.0 Safari/535.1 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Iron/13.0.800.0 Chrome/13.0.800.0 Safari/535.1 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Iron/17.0.1000.0 Chrome/17.0.1000.0 Safari/535.11 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Iron/17.0.1000.1 Chrome/17.0.1000.1 Safari/535.11 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7xs5D9rRDFpg2g +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Iron/16.0.950.0 Chrome/16.0.950.0 Safari/535.7 [] +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.8 (KHTML, like Gecko) Chrome/17.0.940.0 Safari/535.8 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1150.0 Iron/20.0.1150.0 Safari/536.11 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1150.1 Iron/20.0.1150.1 Safari/536.11 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1200.0 Iron/21.0.1200.0 Safari/537.1 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1 +Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1250.0 Iron/22.0.2150.0 Safari/537.4 +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko Firefox/11.0 +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.2.1) Gecko/20120616 Firefox/12.2.1 PaleMoon/12.2.1 +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.2.1) Gecko/20120616 Firefox/13.0 PaleMoon/12.2.1 +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.2.1) Gecko/20120616 Firefox/13.0.1 PaleMoon/12.2.1 +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.3) Gecko/20120717 Firefox/12.3 PaleMoon/12.3 +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.3) Gecko/20120728 Firefox/12.3r2 PaleMoon/12.3r2 +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120427 Firefox/15.0a1 +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120819 Firefox/15.0 PaleMoon/15.0 +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120911 Firefox/15.1 PaleMoon/15.1 +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0.1) Gecko/20110608 Firefox/4.0.1 SeaMonkey/2.1 +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0.1) Gecko/20110608 SeaMonkey/2.1 +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b11pre) Gecko/20110128 Firefox/4.0b11pre +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b4pre) Gecko/20100815 Minefield/4.0b4pre +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b6pre) Gecko/20100903 Firefox/4.0b6pre +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b7) Gecko/20100101 Firefox/4.0b7 +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b7) Gecko/20101111 Firefox/4.0b7 +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b8pre) Gecko/20101114 Firefox/4.0b8pre +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/20110612 Firefox/6.0a2 +Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/20110613 Firefox/6.0a2 +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:12.2) Gecko/20120606 Firefox/12.2-x64 PaleMoon/12.2-x64 +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:12.2.1) Gecko/20120616 Firefox/12.2.1-x64 PaleMoon/12.2.1-x64 +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:12.3) Gecko/20120714 Firefox/12.3-x64 PaleMoon/12.3-x64 +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:14.0) Gecko/20120405 Firefox/14.0a1 +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:15.0) Gecko/20120819 Firefox/15.0-x64 PaleMoon/15.0-x64 +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:15.0) Gecko/20120912 Firefox/15.1-x64 PaleMoon/15.1-x64 +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:15.0) Gecko/20120919 Firefox/15.1.1-x64 PaleMoon/15.1.1-x64 +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b10pre) Gecko/20110118 Firefox/4.0b10pre +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b11pre) Gecko/20110128 Firefox/4.0b11pre +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b11pre) Gecko/20110129 Firefox/4.0b11pre +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b11pre) Gecko/20110131 Firefox/4.0b11pre +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b8pre) Gecko/20101114 Firefox/4.0b8pre +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b8pre) Gecko/20101128 Firefox/4.0b8pre +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b8pre) Gecko/20101213 Firefox/4.0b8pre +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b9pre) Gecko/20101228 Firefox/4.0b9pre +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.2a1pre) Gecko/20110208 Firefox/4.2a1pre +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.2a1pre) Gecko/20110323 Firefox/4.2a1pre +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.2a1pre) Gecko/20110324 Firefox/4.2a1pre +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:5.0) Gecko/20100101 Firefox/5.0 +Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:5.0) Gecko/20110619 Firefox/5.0 +Mozilla/5.0 (Windows NT 6.1; de;rv:12.0) Gecko/20120403211507 Firefox/12.0 +Mozilla/5.0 (Windows NT 6.1; en-US) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.750.0 Safari/534.30 +Mozilla/5.0 (Windows NT 6.1; rv:1.9) Gecko/20100101 Firefox/4.0 +Mozilla/5.0 (Windows NT 6.1; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1 +Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/ 20120405 Firefox/14.0.1 +Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507 Firefox/12.0 +Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507 Firefox/14.0.1 +Mozilla/5.0 (Windows NT 6.1; rv:12.2.1) Gecko/20120616 Firefox/12.2.1 PaleMoon/12.2.1 +Mozilla/5.0 (Windows NT 6.1; rv:12.3) Gecko/20120714 Firefox/12.3 PaleMoon/12.3 +Mozilla/5.0 (Windows NT 6.1; rv:12.3) Gecko/20120717 Firefox/12.3 PaleMoon/12.3 +Mozilla/5.0 (Windows NT 6.1; rv:12.3) Gecko/20120728 Firefox/12.3r2 PaleMoon/12.3r2 +Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20120405 Firefox/14.0a1 +Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120716 Firefox/15.0a2 +Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120819 Firefox/15.0 PaleMoon/15.0 +Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120911 Firefox/15.1 PaleMoon/15.1 +Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120919 Firefox/15.1.1 PaleMoon/15.1.1 +Mozilla/5.0 (Windows NT 6.1; rv:2.0) Gecko/20110319 Firefox/4.0 +Mozilla/5.0 (Windows NT 6.1; rv:2.0b10) Gecko/20110126 Firefox/4.0b10 +Mozilla/5.0 (Windows NT 6.1; rv:2.0b10pre) Gecko/20110113 Firefox/4.0b10pre +Mozilla/5.0 (Windows NT 6.1; rv:2.0b11pre) Gecko/20110126 Firefox/4.0b11pre +Mozilla/5.0 (Windows NT 6.1; rv:2.0b6pre) Gecko/20100903 Firefox/4.0b6pre Firefox/4.0b6pre +Mozilla/5.0 (Windows NT 6.1; rv:2.0b7pre) Gecko/20100921 Firefox/4.0b7pre +Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20110814 Firefox/6.0 +Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 +Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3 +Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3 +Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3 +Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6 +Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.65 Safari/535.11 +Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 +Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Iron/17.0.1000.0 Chrome/17.0.1000.0 Safari/535.11 +Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24 +Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Iron/19.0.1100.0 Chrome/19.0.1100.0 Safari/536.5 +Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1 +Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1200.0 Iron/21.0.1200.0 Safari/537.1 +Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.17 Safari/537.11 +Mozilla/5.0 (Windows NT 6.2; WOW64; rv:12.2) Gecko/20120605 Firefox/12.2 PaleMoon/12.2 +Mozilla/5.0 (Windows NT 6.2; WOW64; rv:15.0) Gecko/20120910144328 Firefox/15.0.2 +Mozilla/5.0 (Windows NT 6.2; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0 +Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:12.2.1) Gecko/20120616 Firefox/12.2.1-x64 PaleMoon/12.2.1-x64 +Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:15.0) Gecko/20120819 Firefox/15.0-x64 PaleMoon/15.0-x64 +Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:15.0) Gecko/20120919 Firefox/15.1.1-x64 PaleMoon/15.1.1-x64 +Mozilla/5.0 (Windows NT 6.2; rv:9.0.1) Gecko/20100101 Firefox/9.0.1 +Mozilla/5.0 (Windows NT 7.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30 +Mozilla/5.0 (Windows NT) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20 +Mozilla/5.0 (Windows U Windows NT 5.1 en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.583.0 Safari/534.12 +Mozilla/5.0 (Windows XP; U) Opera 6.05 [de] +Mozilla/5.0 (Windows XP; U) Opera 6.06 [en] +Mozilla/5.0 (Windows; ; Windows NT 5.1; rv:1.7.2) Gecko/20040804 +Mozilla/5.0 (Windows; N; Windows NT 5.1; en-US) AppleWebKit/529 (KHTML, like Gecko, Safari/529.0) Lunascape/4.9.9.94 +Mozilla/5.0 (Windows; N; Windows NT 5.1; hu-HU) AppleWebKit/529 (KHTML, like Gecko, Safari/529.0) Lunascape/4.9.9.94 +Mozilla/5.0 (Windows; N; Windows NT 5.1; id-ID) AppleWebKit/529 (KHTML, like Gecko, Safari/529.0) Lunascape/4.9.9.94 +Mozilla/5.0 (Windows; N; Windows NT 5.2; ru-RU) AppleWebKit/529 (KHTML, like Gecko, Safari/529.0) Lunascape/4.9.9.94 +Mozilla/5.0 (Windows; U; ; cs-CZ) AppleWebKit/528+ (KHTML, like Gecko, Safari/528.0) Lunascape/5.1.0.0 +Mozilla/5.0 (Windows; U; ; cs-CZ) AppleWebKit/528+ (KHTML, like Gecko, Safari/528.0) Lunascape/5.1.1.0 +Mozilla/5.0 (Windows; U; ; cs-CZ) AppleWebKit/528+ (KHTML, like Gecko, Safari/528.0) Lunascape/5.1.2.0 +Mozilla/5.0 (Windows; U; ; cs-CZ) AppleWebKit/532+ (KHTML, like Gecko, Safari/532.0) Lunascape/5.1.2.3 +Mozilla/5.0 (Windows; U; ; en-NZ) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.8.0 +Mozilla/5.0 (Windows; U; ; hu-HU) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.10.0 +Mozilla/5.0 (Windows; U; BeOS; en-US; rv:1.9.0.7) Gecko/2009021910 +Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) +Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 5.2) +Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; el-GR) +Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US) +Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US)) +Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US) +Mozilla/5.0 (Windows; U; Win 9x 4.90; SG; rv:1.9.2.4) Gecko/20101104 Netscape/9.1.0285 +Mozilla/5.0 (Windows; U; Win 9x 4.90; de-AT; rv:1.7.11) Gecko/20050728 +Mozilla/5.0 (Windows; U; Win 9x 4.90; de-AT; rv:1.7.2) Gecko/20040803 +Mozilla/5.0 (Windows; U; Win 9x 4.90; de-AT; rv:1.8.1.23) Gecko/20090825 SeaMonkey/1.1.18 +Mozilla/5.0 (Windows; U; Win 9x 4.90; de-DE; rv:0.9.2) Gecko/20010726 Netscape6/6.1 +Mozilla/5.0 (Windows; U; Win 9x 4.90; de-DE; rv:0.9.4) Gecko/20011019 Netscape6/6.2 +Mozilla/5.0 (Windows; U; Win 9x 4.90; de-DE; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1 +Mozilla/5.0 (Windows; U; Win 9x 4.90; de-DE; rv:0.9.4.1) Gecko/20020314 Netscape6/6.2.2 +Mozilla/5.0 (Windows; U; Win 9x 4.90; de-DE; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 +Mozilla/5.0 (Windows; U; Win 9x 4.90; de-DE; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (Windows; U; Win 9x 4.90; de-DE; rv:1.4) Gecko/20030619 Netscape/7.1 (ax) +Mozilla/5.0 (Windows; U; Win 9x 4.90; de-DE; rv:1.8.1.21) Gecko/20090331 K-Meleon/1.5.3 +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-GB; rv:0.9.4) Gecko/20011019 Netscape6/6.2 +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-GB; rv:1.8.1.6) Gecko/20070802 SeaMonkey/1.1.4 +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:0.9.4.1) Gecko/20020314 Netscape6/6.2.2 +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.0.1) Gecko/20020826 +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax) +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.6) Gecko/20040206 Firefox/0.8 +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.7.1) Gecko/20040707 +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax) +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.7.5) Gecko/20041220 K-Meleon/0.9 +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.7.5) Gecko/20050603 Netscape/8.0.2 +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.7.9) Gecko/20050711 Firefox/1.0.5 +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.8.0.1) Gecko/20060130 SeaMonkey/1.0 +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.8.1.16) Gecko/20080702 SeaMonkey/1.1.11 +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.8.1.19) Gecko/20081204 SeaMonkey/1.1.14 +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.8.1.22) Gecko/20090605 SeaMonkey/1.1.17 +Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.8.1.8pre) Gecko/20071015 Firefox/2.0.0.7 Navigator/9.0 +Mozilla/5.0 (Windows; U; Win 9x 4.90; es-ES; rv:1.8.1.10) Gecko/20071116 K-Meleon/1.1.3 +Mozilla/5.0 (Windows; U; Win 9x 4.90; fr-FR; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1 +Mozilla/5.0 (Windows; U; Win 9x 4.90; rv:1.7) Gecko/20040803 Firefox/0.9.3 +Mozilla/5.0 (Windows; U; Win95; de-AT; rv:1.7.11) Gecko/20050728 +Mozilla/5.0 (Windows; U; Win95; de-DE; rv:0.9.2) Gecko/20010726 Netscape6/6.1 +Mozilla/5.0 (Windows; U; Win95; de-DE; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (Windows; U; Win95; en-GB; rv:0.9.4) Gecko/20011019 Netscape6/6.2 +Mozilla/5.0 (Windows; U; Win95; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 +Mozilla/5.0 (Windows; U; Win95; en-US; rv:1.5) Gecko/20031007 Firebird/0.7 +Mozilla/5.0 (Windows; U; Win98; de-AT; rv:1.5) Gecko/20031007 +Mozilla/5.0 (Windows; U; Win98; de-AT; rv:1.7.3) Gecko/20040910 +Mozilla/5.0 (Windows; U; Win98; de-DE; rv:0.9.4) Gecko/20011019 Netscape6/6.2 +Mozilla/5.0 (Windows; U; Win98; de-DE; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1 +Mozilla/5.0 (Windows; U; Win98; de-DE; rv:0.9.4.1) Gecko/20020314 Netscape6/6.2.2 +Mozilla/5.0 (Windows; U; Win98; de-DE; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 +Mozilla/5.0 (Windows; U; Win98; de-DE; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (Windows; U; Win98; de-DE; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (Windows; U; Win98; de-DE; rv:1.4) Gecko/20030619 Netscape/7.1 (ax) +Mozilla/5.0 (Windows; U; Win98; de-DE; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6 +Mozilla/5.0 (Windows; U; Win98; de-DE; rv:1.5a) Gecko/20030728 Mozilla Firebird/0.6.1 +Mozilla/5.0 (Windows; U; Win98; de-DE; rv:1.7) Gecko/20040803 Firefox/0.9.3 +Mozilla/5.0 (Windows; U; Win98; de-DE; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 +Mozilla/5.0 (Windows; U; Win98; de-DE; rv:1.8.1.24) Gecko/20100228 K-Meleon/1.5.4 +Mozilla/5.0 (Windows; U; Win98; en-GB; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:0.9.1) Gecko/20010607 Netscape6/6.1b1 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:0.9.2) Gecko/20010726 Netscape6/6.1 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:0.9.4) Gecko/20011019 Netscape6/6.2 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:0.9.9) Gecko/20020311 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.0rc2) Gecko/20020510 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.1a) Gecko/20020611 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.2a) Gecko/20020910 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.3) Gecko/20030312 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.3.1) Gecko/20030425 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.3a) Gecko/20021207 Phoenix/0.5 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.3a) Gecko/20021212 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.3b) Gecko/20030210 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.4) Gecko Netscape/7.1 (ax) +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax) +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.4a) Gecko/20030401 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.5) Gecko/20031007 Firebird/0.7 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.5) Gecko/20031016 K-Meleon/0.8.2 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.6) Gecko/20040206 Firefox/0.8 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.13) Gecko/20060410 Firefox/1.0.8 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.1 (ax) +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax) +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.3) Gecko/20040910 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.5) Gecko/20041220 K-Meleon/0.9 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.5) Gecko/20050603 Netscape/8.0.2 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.5) Gecko/20060127 Netscape/8.1 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.6) Gecko/20050317 Firefox/1.0.2 (ax) +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.0.1) Gecko/20060130 SeaMonkey/1.0 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.0.2) Gecko/20060404 SeaMonkey/1.0.1 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.0.6) Gecko/20060729 SeaMonkey/1.0.4 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.0.7) Gecko/20060910 SeaMonkey/1.0.5 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.0.7) Gecko/20060917 K-Meleon/1.02 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.0.7) Gecko/20060917 K-Ninja/2.0.4 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.0.8) Gecko/20061030 SeaMonkey/1.0.6 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.0.9) Gecko/20061211 SeaMonkey/1.0.7 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1) Gecko/20061101 SeaMonkey/1.1b +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.12) Gecko/20080201 SeaMonkey/1.1.8 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.13) Gecko/20080313 SeaMonkey/1.1.9 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.17) Gecko/20080919 K-Meleon/1.5.1 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.17pre) Gecko/20080716 K-Meleon/1.1.6 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.19) Gecko/20081204 SeaMonkey/1.1.14 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.19) Gecko/20081217 K-Meleon/1.5.2 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.2) Gecko/20070222 SeaMonkey/1.1.1 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.21) Gecko/20090331 K-Meleon/1.5.3 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.23) Gecko/20090825 MultiZilla/1.8.3.4e SeaMonkey/1.1.18 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.24) Gecko/20100228 K-Meleon/1.5.4 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.24) Gecko/20100228 SeaMonkey/1.1.19 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.24pre) Gecko/20091010 K-Meleon/1.5.4 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.2pre) Gecko/20070111 SeaMonkey/1.1 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.4) Gecko/20070509 SeaMonkey/1.1.2 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.4pre) Gecko/20070404 K-Ninja/2.1.3 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.6) Gecko/20070802 SeaMonkey/1.1.4 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.8pre) Gecko/20070928 Firefox/2.0.0.7 Navigator/9.0RC1 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.8pre) Gecko/20071019 Firefox/2.0.0.8 Navigator/9.0.0.1 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.9) Gecko/20071030 SeaMonkey/1.1.6 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.9pre) Gecko/20071102 Firefox/2.0.0.9 Navigator/9.0.0.3 +Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8a6) Gecko/20050111 +Mozilla/5.0 (Windows; U; Win98; es-ES; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 +Mozilla/5.0 (Windows; U; Win98; fr-FR; rv:0.9.4) Gecko/20011019 Netscape6/6.2 +Mozilla/5.0 (Windows; U; Win98; fr-FR; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1 +Mozilla/5.0 (Windows; U; Win98; fr-FR; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 +Mozilla/5.0 (Windows; U; Win98; fr-FR; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (Windows; U; Win98; fr-FR; rv:1.7.6) Gecko/20050226 Firefox/1.0.1 +Mozilla/5.0 (Windows; U; Win98; fr-FR; rv:1.7.6) Gecko/20050318 Firefox/1.0.2 +Mozilla/5.0 (Windows; U; Win98; fr-FR; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 +Mozilla/5.0 (Windows; U; Win98; fr; rv:1.7.3) Gecko/20040910 +Mozilla/5.0 (Windows; U; Win98; ja-JP; rv:1.4) Gecko/20030624 Netscape/7.1 (ax) +Mozilla/5.0 (Windows; U; Win98; rv:1.7.3) Gecko/20040913 Firefox/0.10 +Mozilla/5.0 (Windows; U; Win98; rv:1.7.3) Gecko/20041001 Firefox/0.10.1 +Mozilla/5.0 (Windows; U; WinNT3.51; en-US; rv:1.8.1.8) Gecko/20071009 SeaMonkey/1.1.5 +Mozilla/5.0 (Windows; U; WinNT4.0; de-AT; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (Windows; U; WinNT4.0; de-AT; rv:1.1) Gecko/20020826 +Mozilla/5.0 (Windows; U; WinNT4.0; de-AT; rv:1.2) Gecko/20021126 +Mozilla/5.0 (Windows; U; WinNT4.0; de-AT; rv:1.3.1) Gecko/20030425 +Mozilla/5.0 (Windows; U; WinNT4.0; de-AT; rv:1.7.11) Gecko/20050728 +Mozilla/5.0 (Windows; U; WinNT4.0; de-DE; rv:0.9.2) Gecko/20010726 Netscape6/6.1 +Mozilla/5.0 (Windows; U; WinNT4.0; de-DE; rv:0.9.4) Gecko/20011019 Netscape6/6.2 +Mozilla/5.0 (Windows; U; WinNT4.0; de-DE; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1 +Mozilla/5.0 (Windows; U; WinNT4.0; de-DE; rv:0.9.4.1) Gecko/20020314 Netscape6/6.2.2 +Mozilla/5.0 (Windows; U; WinNT4.0; de-DE; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 +Mozilla/5.0 (Windows; U; WinNT4.0; de-DE; rv:1.0.1) Gecko/20020823 Netscape/7.0 +Mozilla/5.0 (Windows; U; WinNT4.0; de-DE; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (Windows; U; WinNT4.0; de-DE; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (Windows; U; WinNT4.0; de-DE; rv:1.7.5) Gecko/20041108 Firefox/1.0 +Mozilla/5.0 (Windows; U; WinNT4.0; de-DE; rv:1.7.6) Gecko/20050226 Firefox/1.0.1 +Mozilla/5.0 (Windows; U; WinNT4.0; en-CA; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1 +Mozilla/5.0 (Windows; U; WinNT4.0; en-GB; rv:1.0.1) Gecko/20020823 Netscape/7.0 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:0.9.4) Gecko/20011019 Netscape6/6.2 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:0.9.4.1) Gecko/20020314 Netscape6/6.2.2 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:0.9.5) Gecko/20011011 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.0.0) Gecko/20020530 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.0.1) Gecko/20020823 Netscape/7.0 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.0.1) Gecko/20020826 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.1) Gecko/20020826 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.1a) Gecko/20020611 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.2) Gecko/20021126 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.2b) Gecko/20021016 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.2b) Gecko/20021016 K-Meleon 0.7 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.2b) Gecko/20021029 Phoenix/0.4 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.3) Gecko/20030312 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.3a) Gecko/20021207 Phoenix/0.5 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.3a) Gecko/20021212 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.4) Gecko/20030624 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax) +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.4a) Gecko/20030401 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.4b) Gecko/20030507 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.4b) Gecko/20030610 Mozilla Firebird/0.6 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.5) Gecko/20031016 K-Meleon/0.8 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.7) Gecko/20040616 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.7.12) Gecko/20050915 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.7.9) Gecko/20050711 Firefox/1.0.5 +Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16 +Mozilla/5.0 (Windows; U; WinNT4.0; fr-FR; rv:0.9.2) Gecko/20010726 Netscape6/6.1 +Mozilla/5.0 (Windows; U; WinNT4.0; fr-FR; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1 +Mozilla/5.0 (Windows; U; WinNT4.0; fr-FR; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 +Mozilla/5.0 (Windows; U; WinNT4.0; fr-FR; rv:1.0.0) Gecko/20020530 +Mozilla/5.0 (Windows; U; WinNT4.0; fr-FR; rv:1.0.1) Gecko/20020823 Netscape/7.0 +Mozilla/5.0 (Windows; U; WinNT4.0; fr-FR; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (Windows; U; WinNT4.0; it-IT; rv:1.4b) Gecko/20030507 +Mozilla/5.0 (Windows; U; WinNT; en; Preview) Gecko/20020603 Beonex/0.8-stable +Mozilla/5.0 (Windows; U; WinNT; en; rv:1.0.2) Gecko/20030311 Beonex/0.8.2-stable +Mozilla/5.0 (Windows; U; Windows 98; en-US; rv:1.8.1.5pre) Gecko/20070710 Firefox/2.0.0.4 Navigator/9.0b2 +Mozilla/5.0 (Windows; U; Windows 98; en-US; rv:1.8.1.8pre) Gecko/20071019 Firefox/2.0.0.8 Navigator/9.0.0.1 +Mozilla/5.0 (Windows; U; Windows CE 6.0; en-US; rv:1.9.2a1pre) Gecko/20090219 Minefield/3.2a1pre +Mozilla/5.0 (Windows; U; Windows NT 4.0; SG; rv:1.7.5) Gecko/20050610 Netscape/8.0.2 +Mozilla/5.0 (Windows; U; Windows NT 4.0; en-US; rv:1.8.0.2) Gecko/20060418 Firefox/1.5.0.2; +Mozilla/5.0 (Windows; U; Windows NT 5.0; ; rv:1.8.0.1) Gecko/20060111 Firefox/1.9.0 +Mozilla/5.0 (Windows; U; Windows NT 5.0; ; rv:1.8.0.10) Gecko/20070216 Firefox/1.9.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; ; rv:1.8.0.7) Gecko/20060917 Firefox/1.9.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; cs-CZ; rv:1.7.5) Gecko/20041217 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:0.9.8) Gecko/20020204 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.0.0) Gecko/20020530 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.0.1) Gecko/20020826 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.0rc2) Gecko/20020510 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.1b) Gecko/20020721 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.2) Gecko/20021126 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.3.1) Gecko/20030425 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.3a) Gecko/20021212 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.3b) Gecko/20030210 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.5) Gecko/20031007 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.6) Gecko/20040113 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.7) Gecko/20040616 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.7.11) Gecko/20050728 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.7.13) Gecko/20060414 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.7.6) Gecko/20050319 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.7.7) Gecko/20050414 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.7.8) Gecko/20050511 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.7.8) Gecko/20050511 (No IDN) +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.7b) Gecko/20040421 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.8) Gecko/20051219 SeaMonkey/1.0b +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.8.0.8) Gecko/20061030 SeaMonkey/1.0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.8.1.16) Gecko/20080702 SeaMonkey/1.1.11 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.8.1.16) Gecko/20080702 SeaMonkey/1.1.11 Mnenhy/0.7.5.0 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.8.1.21) Gecko/20090303 SeaMonkey/1.1.15 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.8.1.21) Gecko/20090303 SeaMonkey/1.1.15 Mnenhy/0.7.6.0 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.8.1.22) Gecko/20090605 SeaMonkey/1.1.17 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.8.1.4) Gecko/20070509 SeaMonkey/1.1.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-AT; rv:1.8a4) Gecko/20040927 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:0.9.2) Gecko/20010726 Netscape6/6.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:0.9.4.1) Gecko/20020314 Netscape6/6.2.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.0rc2) Gecko/20020512 Netscape/7.0b1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.4) Gecko/20030619 Netscape/7.1 (ax) +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.4) Gecko/20030624 Netscape/7.1 (ax) +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.5a) Gecko/20030728 Mozilla Firebird/0.6.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.6) Gecko/20040206 Firefox/0.8 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.6) Gecko/20040206 Firefox/1.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.7) Gecko/20040626 Firefox/0.9.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.7) Gecko/20040803 Firefox/0.9.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax) +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.7.6) Gecko/20050223 Firefox/1.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.7.6) Gecko/20050226 Firefox/1.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.7.6) Gecko/20050321 Firefox/1.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.8.1.12) Gecko/20080203 K-Meleon/1.1.4 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.8.1.17) Gecko/20080919 K-Meleon/1.5.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.8.1.19) Gecko/20081217 K-Meleon/1.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.8.1.4) Gecko/20070511 K-Meleon/1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.8.1.8) Gecko/20071013 K-Meleon/1.5 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de; rv:1.9.1.10) Gecko/20100504 SeaMonkey/2.0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.0; de; rv:1.9.1.8) Gecko/20100205 SeaMonkey/2.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en) AppleWebKit/522.12.1 (KHTML, like Gecko) Version/3.0.1 Safari/522.12.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-EN; rv:1.8.1.8) Gecko/20071013 K-Meleon/1.5 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-GB; rv:0.9.2) Gecko/20010726 Netscape6/6.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-GB; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-GB; rv:1.0.1) Gecko/20020823 Netscape/7.0 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-GB; rv:1.7.6) Gecko/20050321 Firefox/1.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.55 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.27 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.6 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:0.9.2) Gecko/20010726 Netscape6/6.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:0.9.4) Gecko/20011019 Netscape6/6.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:0.9.4.1) Gecko/20020314 Netscape6/6.2.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:0.9.5) Gecko/20011011 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:0.9.7) Gecko/20011221 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.0.0) Gecko/20020530 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.0.1) Gecko/20020815 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.0.1) Gecko/20020823 Netscape/7.0 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.0.1) Gecko/20020823 Netscape6/6.2.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.0.1) Gecko/20020826 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.0rc1) Gecko/20020417 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.0rc2) Gecko/20020510 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.0rc2) Gecko/20020512 Netscape/7.0b1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.0rc3) Gecko/20020523 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1a) Gecko/20020611 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1b) Gecko/20020721 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.2) Gecko/20021126 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.2a) Gecko/20020910 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.2b) Gecko/20021001 Phoenix/0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.2b) Gecko/20021014 Phoenix/0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.2b) Gecko/20021016 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.2b) Gecko/20021016 K-Meleon 0.7 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.2b) Gecko/20021029 Phoenix/0.4 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.3) Gecko/20030312 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.3.1) Gecko/20030425 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.3a) Gecko/20021203 Phoenix/0.4 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.3a) Gecko/20021207 Phoenix/0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.3a) Gecko/20021212 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.3a) Gecko/20030105 Phoenix/0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.3b) Gecko/20030204 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.3b) Gecko/20030210 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030529 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030612 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax) +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4.1) Gecko/20031008 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4a) Gecko/20030401 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4a) Gecko/20030403 Phoenix/0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4b) Gecko/20030504 Mozilla Firebird/0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4b) Gecko/20030507 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4b) Gecko/20030514 Mozilla Firebird/0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5) Gecko/20030916 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5) Gecko/20031007 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5) Gecko/20031016 K-Meleon/0.8.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5a) Gecko/20030718 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5a) Gecko/20030728 Mozilla Firebird/0.6.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5b) Gecko/20030827 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.6) Gecko/20040113 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.6) Gecko/20040206 Firefox/0.8 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7) Gecko/20040616 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7) Gecko/20040707 Firefox/0.9.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7) Gecko/20040803 Firefox/0.9.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.1) Gecko/20040707 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.11) Gecko/20050728 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12) Gecko/20050610 K-Meleon/0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.2) Gecko/20040803 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax) +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.2) Gecko/20050208 Netscape/7.20 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.3) Gecko/20040910 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.5) Gecko/20041217 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.5) Gecko/20041220 K-Meleon/0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.5) Gecko/20050519 Netscape/8.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.5) Gecko/20050603 Netscape/8.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.5) Gecko/20050729 Netscape/8.0.3.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.5) Gecko/20051012 Netscape/8.0.4 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.5) Gecko/20060127 Netscape/8.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.5) Gecko/20060912 Netscape/8.1.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.6) Gecko/20050317 Firefox/1.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.7) Gecko/20050414 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.8) Gecko/20050511 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.9) Gecko/20050711 Firefox/1.0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.0.1) Gecko/20060130 SeaMonkey/1.0 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.0.6) Gecko/20060729 SeaMonkey/1.0.4 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.0.7) Gecko/20060917 K-Meleon/1.02 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.0.8) Gecko/20061030 SeaMonkey/1.0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.1) Gecko/20061204 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.11pre) Gecko/20071206 Firefox/2.0.0.11 Navigator/9.0.0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.14) Gecko/20080406 K-Meleon/1.1.5 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.14) Gecko/20080406 K-Meleon/1.5.0beta +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.17) Gecko/20080829 SeaMonkey/1.1.12 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.17) Gecko/20080919 K-Meleon/1.5.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.19) Gecko/20081217 K-Meleon/1.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.19) Gecko/20081217 KMLite/1.1.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.2) Gecko/20070222 SeaMonkey/1.1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.21) Gecko/20090303 SeaMonkey/1.1.15 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.21) Gecko/20090331 K-Meleon/1.5.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.21) Gecko/20090403 SeaMonkey/1.1.16 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.2pre) Gecko/20070111 SeaMonkey/1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.3pre) Gecko/20070301 BonEcho/2.0.0.3pre +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.4) Gecko/20070509 Firefox/2.0.0 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.4) Gecko/20070509 SeaMonkey/1.1.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.9) Gecko/20071030 SeaMonkey/1.1.6 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.9) Gecko/20071110 Sylera/3.0.20 SeaMonkey/1.1.6 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1b1) Gecko/20060710 Firefox/2.0b1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1b2) Gecko/20060831 BonEcho/2.0b2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8b2) Gecko/20050702 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8b4) Gecko/20050908 Firefox/1.4 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8b4) Gecko/20050910 SeaMonkey/1.0a +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.0.2) Gecko/2008092313 Firefox/3.1.6 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.11) Gecko/20100701 SeaMonkey/2.0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.17) Gecko/20110123 SeaMonkey/2.0.12 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.19) Gecko/20110420 SeaMonkey/2.0.14 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.3) Gecko/20090804 Firefox/3.5.3 Lunascape/5.1.5.19059 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1b4pre) Gecko/20090419 SeaMonkey/2.0b1pre +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2.30) Gecko/20120217 Firefox/3.6.30 (Palemoon/3.6.30) +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2a1pre) Gecko +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2a1pre) Gecko/20081228 SeaMonkey/2.0a3pre +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2a1pre) Gecko/20090117 Minefield/3.2a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9a1) Gecko/20060206 SeaMonkey/1.5a +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9a1) Gecko/20061204 GranParadiso/2.0 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9a1) Gecko/20061204 GranParadiso/3.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9a2pre) Gecko/20061225 Minefield/3.0a2pre +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9a3) Gecko/20070409 BonEcho/2.0.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9a3) Gecko/20070409 GranParadiso/2.0.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9a3) Gecko/20070409 IceWeasel/2.0.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9b2pre) Gecko/2007110913 Minefield/3.0b2pre +Mozilla/5.0 (Windows; U; Windows NT 5.0; es-AR; rv:1.7.5) Gecko/20060912 Netscape/8.1.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; es-ES; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 +Mozilla/5.0 (Windows; U; Windows NT 5.0; es-ES; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:0.9.2) Gecko/20010726 Netscape6/6.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:0.9.4) Gecko/20011019 Netscape6/6.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:0.9.4.1) Gecko/20020314 Netscape6/6.2.2 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:1.0.0) Gecko/20020530 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:1.0.1) Gecko/20020823 Netscape/7.0 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:1.0.2) Gecko/20030208 Netscape/7.02 (ax) +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:1.1) Gecko/20020826 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:1.4) Gecko/20030624 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:1.7.1) Gecko/20040707 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:1.7.3) Gecko/20040910 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:1.8.1.12) Gecko/20080201 SeaMonkey/1.1.8 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:1.8.1.17pre) Gecko/20080716 K-Meleon/1.5.0 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:1.8.1.2) Gecko/20070222 SeaMonkey/1.1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:1.8.1.2pre) Gecko/20070111 SeaMonkey/1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr; rv:1.7.8) Gecko/20050511 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr; rv:1.8.1.9pre) Gecko/20071102 Firefox/2.0.0.9 Navigator/9.0.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; fr; rv:1.9b4pre) Gecko/2008022502 SeaMonkey/2.0a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.0; it-IT; rv:0.9.2) Gecko/20010726 Netscape6/6.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; it-IT; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; it; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 +Mozilla/5.0 (Windows; U; Windows NT 5.0; ja-JP) AppleWebKit/529 (KHTML, like Gecko, Safari/529.0) Lunascape/4.9.9.96 +Mozilla/5.0 (Windows; U; Windows NT 5.0; ja-JP; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (Windows; U; Windows NT 5.0; ja; rv:1.9.1.10) Gecko/20100624 Firefox/3.5.10 Lunascape/6.1.7.21880 +Mozilla/5.0 (Windows; U; Windows NT 5.0; pl; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 +Mozilla/5.0 (Windows; U; Windows NT 5.0; pt-BR; rv:1.0.1) Gecko/20020823 Netscape/7.0 +Mozilla/5.0 (Windows; U; Windows NT 5.0; ru; rv:1.9.1.13) Gecko/20100914 Firefox/3.5.13 +Mozilla/5.0 (Windows; U; Windows NT 5.0; ru; rv:1.9.2.13) Gecko/20101203 IceWeasel/2.0.0.11 Mnenhy/0.8.3 +Mozilla/5.0 (Windows; U; Windows NT 5.0; rv:1.7.3) Gecko/20040913 Firefox/0.10 +Mozilla/5.0 (Windows; U; Windows NT 5.0; rv:1.7.3) Gecko/20040913 Firefox/0.10.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; rv:1.7.3) Gecko/20041001 Firefox/0.10.1 +Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-TW; rv:1.8.0.1) Gecko/20060111 Firefox/0.10 +Mozilla/5.0 (Windows; U; Windows NT 5.1 ; x64; en-US; rv:1.9.1b2pre) Gecko/20081026 Firefox/3.1b2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1) AppleWebKit/532.0 (KHTML, like Gecko) Iron/3.0.197.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ) Sundance/0.9x +Mozilla/5.0 (Windows; U; Windows NT 5.1; ; rv:1.9.0.14) Gecko/2009082707 Firefox/3.0.14 +Mozilla/5.0 (Windows; U; Windows NT 5.1; PL; rv:1.8.1.13) Gecko/20080313 SeaMonkey/1.1.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; PL; rv:1.8.1.15) Gecko/20080621 SeaMonkey/1.1.10 +Mozilla/5.0 (Windows; U; Windows NT 5.1; PL; rv:1.8.1.18) Gecko/20081031 SeaMonkey/1.1.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; PL; rv:1.8.1.2) Gecko/20070222 SeaMonkey/1.1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; bg-BG; rv:1.9.1b4pre) Gecko/20090307 Shiretoko/3.1b4pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; ca-es) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ca; rv:1.8.1b1) Gecko/20060710 Firefox/2.0b1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; cs) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; cs) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; cs-CZ) AppleWebKit/525.28.3 (KHTML, like Gecko) Version/3.2.3 Safari/525.29 +Mozilla/5.0 (Windows; U; Windows NT 5.1; cs-CZ) AppleWebKit/528+ (KHTML, like Gecko, Safari/528.0) Lunascape/5.1.1.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; cs-CZ) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; cs-CZ) AppleWebKit/533.3 (KHTML, like Gecko) Lunascape/6.1.0.20995 Safari/533.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; cs; rv:1.8.1.18) Gecko/20081029 Firefox/2.0.0.18 +Mozilla/5.0 (Windows; U; Windows NT 5.1; cs; rv:1.9) Gecko/2008052906 +Mozilla/5.0 (Windows; U; Windows NT 5.1; cs; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20 +Mozilla/5.0 (Windows; U; Windows NT 5.1; da) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; da-DK) AppleWebKit/523.11.1+ (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; da-DK) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; da-DK; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; da-dk) AppleWebKit/523.15.1 (KHTML, like Gecko) Version/3.0.4 Safari/523.15 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.0.0) Gecko/20020530 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.0.1) Gecko/20020826 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.1) Gecko/20020826 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.3) Gecko/20030312 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.3a) Gecko/20021212 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.3b) Gecko/20030210 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.4) Gecko/20030624 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.4a) Gecko/20030401 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.5) Gecko/20031007 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.6) Gecko/20040113 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.7) Gecko/20040616 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.7.1) Gecko/20040707 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.7.11) Gecko/20050728 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.7.11) Gecko/20050728 (No IDN) +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.7.3) Gecko/20040910 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.7.5) Gecko/20041217 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.7.6) Gecko/20050319 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.7.7) Gecko/20050414 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.7.8) Gecko/20050511 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.7b) Gecko/20040316 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.8) Gecko/20051219 SeaMonkey/1.0b +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.8.0.5) Gecko/20060706 K-Meleon/1.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.8.0.5) Gecko/20060730 K-Meleon/1.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.8.1.13) Gecko/20080313 SeaMonkey/1.1.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.8.1.15) Gecko/20080621 SeaMonkey/1.1.10 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.8.1.17) Gecko/20080829 SeaMonkey/1.1.12 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.8.1.18) Gecko/20081031 SeaMonkey/1.1.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.8.1.19) Gecko/20081204 SeaMonkey/1.1.14 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.8.1.2) Gecko/20070222 SeaMonkey/1.1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.8.1.4) Gecko/20070509 SeaMonkey/1.1.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.8.1.5) Gecko/20070716 SeaMonkey/1.1.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.8.1.6) Gecko/20070802 SeaMonkey/1.1.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.8a1) Gecko/20040520 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.8a5) Gecko/20041122 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.8b) Gecko/20050217 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-CH) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.4 (Change: ) +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE) AppleWebKit/532+ (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE) AppleWebKit/532.0 (KHTML, like Gecko) Iron/3.0.197.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475 Safari/534 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE) Chrome/4.0.223.3 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:0.9.4.1) Gecko/20020314 Netscape6/6.2.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.0.1) Gecko/20020823 Netscape/7.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.3a) Gecko/20021207 Phoenix/0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.4) Gecko/20030619 Netscape/7.1 (ax) +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.4) Gecko/20030624 Netscape/7.1 (ax) +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.5) Gecko/20031007 Firebird/0.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.5a) Gecko/20030728 Mozilla Firebird/0.6.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.6) Gecko/20040206 Firefox/0.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7) Gecko/20040626 Firefox/0.9.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7) Gecko/20040803 Firefox/0.9.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.5) Gecko/20060127 Netscape/8.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.6) Gecko/20050223 Firefox/1.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.6) Gecko/20050226 Firefox/1.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.6) Gecko/20050321 Firefox/1.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.8.0.1) Gecko/20060115 K-Meleon/1.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.8.1.14) Gecko/20080406 K-Meleon/1.1.5 (+http://www.kangaroo-personal.de) +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.8.1.17) Gecko/20080919 K-Meleon/1.5.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.8.1.17pre) Gecko/20080716 K-Meleon/1.5.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.8.1.19) Gecko/20081217 K-Meleon/1.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.8.1.21) Gecko/20090331 K-Meleon/1.5.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.8.1.23) Gecko/20090825 SeaMonkey/1.1.18 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.8.1.6) Gecko/20070727 K-Meleon/1.1.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.9.2.20) Gecko/20110803 Firefox +Mozilla/5.0 (Windows; U; Windows NT 5.1; de-LI; rv:1.9.0.16) Gecko/2009120208 Firefox/3.0.16 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8) Gecko/20051111 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.19) Gecko/20081201 Firefox/2.0.0.19 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.21 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.8) Gecko/20071008 SeaMonkey +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1b1) Gecko/20060710 Firefox/2.0b1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9) Gecko/2008052906 Firefox/3.0.1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.2pre) Gecko/2008082305 Firefox/3.0.2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.4) Firefox/3.0.8) +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.8) Gecko/2009032609 Firefox/3.07 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.11) Gecko/20100701 SeaMonkey/2.0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.17) Gecko/20110123 SeaMonkey/2.0.12 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.18) Gecko/20110320 SeaMonkey/2.0.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.19) Gecko/20110420 SeaMonkey/2.0.14 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.4) Gecko/20091007 Firefox/3.5.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.7) Gecko/20100104 Firefox/3.5.8 (SeaMonkey/2.0.2) +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.7) Gecko/20100104 SeaMonkey/2.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1b1pre) Gecko/20080925121544 SeaMonkey/2.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 ( .NET CLR 3.0.04506.30) +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 ( .NET CLR 3.0.04506.648) +Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9b3) Gecko/2008020514 Opera 9.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; el) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/522.12.1 (KHTML, like Gecko) Version/3.0.1 Safari/522.12.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/522.4.1+ (KHTML, like Gecko) Version/3.0.1 Safari/522.12.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/526.9 (KHTML, like Gecko) Version/4.0dp1 Safari/526.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-CA; rv:1.4) Gecko/20030624 Netscape/7.1 (ax) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-CA; rv:1.7.5) Gecko/20050610 Netscape/8.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB) AppleWebKit/523.15 (KHTML, like Gecko) QtWeb Internet Browser/1.2 http://www.QtWeb.net +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB) AppleWebKit/529 (KHTML, like Gecko, Safari/529.0) Lunascape/4.9.9.96 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:0.9.4) Gecko/20011019 Netscape6/6.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.7.6) Gecko/20050226 Firefox/1.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.7.6) Gecko/20050321 Firefox/1.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.1) Gecko/20061230 BonEcho/2.0.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.19) Gecko/20081217 K-Meleon/1.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1b2) Gecko/20060821 Firefox/2.0b2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.6) Gecko/2009011913 Firefox +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 GTB7.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 GTB7.1 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.18) Gecko/20110320 SeaMonkey/2.0.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4 ( .NET CLR 3.5.30729; .NET4.0E) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.2.14) Gecko/20110218 Firefox/3.6.14 GTB7.1 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.2.16) Gecko/20110319 AskTbUTR/3.11.3.15590 Firefox/3.6.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/523.15 (KHTML, like Gecko) QtWeb Internet Browser/1.2 http://www.QtWeb.net +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525+ (KHTML, like Gecko) Version/3.1.1 Safari/525.17 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/525.13. +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/7.0.0 Safari/700.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Fluid/0.9.4 Safari/525.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13(KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.17 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.151.0 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.152.0 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.153.0 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.153.1 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.3.155.0 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.4.154.18 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.39 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.43 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.48 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.50 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.53 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.55 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Iron/0.2.152.0 Safari/12079480.525 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Iron/0.2.152.0 Safari/12207312.525 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Iron/0.2.152.0 Safari/12272384.525 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Iron/0.2.152.0 Safari/12279816.525 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Iron/0.2.152.0 Safari/12282560.525 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Iron/0.2.152.0 Safari/12285712.525 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Iron/0.2.152.0 Safari/12475112.525 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Iron/0.2.152.0 Safari/12535056.525 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Iron/0.2.152.0 Safari/12542120.525 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Iron/0.2.152.0 Safari/12595016.525 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Iron/0.2.152.0 Safari/12733120.525 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Iron/0.2.152.0 Safari/13543896.525 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Iron/0.2.152.0 Safari/28768176.525 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.28 (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.28.3 (KHTML, like Gecko) Version/3.2.3 ChromePlus/4.0.222.3 Chrome/4.0.222.3 Safari/525.28.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/527+ (KHTML, like Gecko) QtWeb Internet Browser/1.2 http://www.QtWeb.net +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/527+ (KHTML, like Gecko) QtWeb Internet Browser/1.5 http://www.QtWeb.net +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/527+ (KHTML, like Gecko) QtWeb Internet Browser/1.7 http://www.QtWeb.net +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/527+ (KHTML, like Gecko) QtWeb Internet Browser/2.0 http://www.QtWeb.net +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/527+ (KHTML, like Gecko) QtWeb Internet Browser/3.0 http://www.QtWeb.net +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6 (Change: ) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528+ (KHTML, like Gecko, Safari/528.0) Lunascape/5.0.2.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528+ (KHTML, like Gecko, Safari/528.0) Lunascape/5.1.2.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.10 (KHTML, like Gecko) Chrome/2.0.157.0 Safari/528.10 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.10 (KHTML, like Gecko) Chrome/2.0.157.2 Safari/528.10 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.11 (KHTML, like Gecko) Chrome/2.0.157.0 Safari/528.11 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.4 (KHTML, like Gecko) Chrome/0.3.155.0 Safari/528.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.4 (KHTML, like Gecko) Iron/0.3.155.0 Safari/13506912.528 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.7 (KHTML, like Gecko) Iron/1.0.155.0 Safari/528.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.8 (KHTML, like Gecko) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.8 (KHTML, like Gecko) Chrome/2.0.156.0 Safari/528.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.8 (KHTML, like Gecko) Chrome/2.0.156.0 Version/3.2.1 Safari/528.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.8 (KHTML, like Gecko) Chrome/2.0.156.1 Safari/528.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.9 (KHTML, like Gecko) Chrome/2.0.157.0 Safari/528.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.1 (KHTML, like Gecko) Chrome/2.0.169.0 Safari/530.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.1 (KHTML, like Gecko) Chrome/2.0.170.0 Safari/530.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.1 (KHTML, like Gecko) Iron/2.0.168.0 Safari/530.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.0 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.2 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.39 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.40 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.42 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.43 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.8 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.173.0 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.173.1 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.174.0 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.6 (KHTML, like Gecko) Chrome/2.0.174.0 Safari/530.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.6 (KHTML, like Gecko) Chrome/2.0.175.0 Safari/530.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.7 (KHTML, like Gecko) Chrome/2.0.175.0 Safari/530.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.7 (KHTML, like Gecko) Chrome/2.0.176.0 Safari/530.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.7 (KHTML, like Gecko) Chrome/2.0.177.0 Safari/530.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.8 (KHTML, like Gecko) Chrome/2.0.177.0 Safari/530.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.8 (KHTML, like Gecko) Chrome/2.0.177.1 Safari/530.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.8 (KHTML, like Gecko) Chrome/2.0.178.0 Safari/530.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/531.0 (KHTML, like Gecko) Chrome/3.0.191.0 Safari/531.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/531.2 (KHTML, like Gecko) Chrome/3.0.191.3 Safari/531.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.1 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.10 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.17 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.20 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.21 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.24 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.27 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.6 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.196.2 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.197.11 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.201.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.201.1 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.2 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.204.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.1 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.207.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.208.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.209.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.2 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.4 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.7 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.212.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML,like Gecko) Chrome/3.0.195.27 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.0 Safari/532.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.1 Safari/532.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.0 Safari/532.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.3 Safari/532.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.4 Safari/532.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.5 Safari/532.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.6 Safari/532.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.6 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.0 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.12 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.3 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.4 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.5 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.7 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.1 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.2 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.3 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.4 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) ChromePlus/4.0.222.3 Chrome/4.0.222.3 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.3 (KHTML, like Gecko) Iron/4.0.227.0 Chrome/4.0.227.0 Safari/532.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Comodo_Dragon/4.1.1.11 Chrome/4.1.249.1042 Safari/532.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Chrome/4.0.288.1 Safari/532.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Iron/4.0.275.2 Chrome/4.0.275.2 Safari/532.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Iron/4.0.280.0 Chrome/4.0.280.0 Safari/532.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.2 Safari/533.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.353.0 Safari/533.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.355.0 Safari/533.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.356.0 Safari/533.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.357.0 Safari/533.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4 ChromePlus/1.4.1.0alpha1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.8 (KHTML, like Gecko) Chrome/6.0.397.0 Safari/533.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.548.0 Safari/534.10 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10 ChromePlus/1.5.1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10 ChromePlus/1.5.2.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) RockMelt/0.8.40.147 Chrome/8.0.552.231 Safari/534.10 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.15 Safari/534.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.98 Safari/534.13 ChromePlus/1.5.3.0alpha4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.599.0 Safari/534.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Iron/9.0.600.2 Chrome/9.0.600.2 Safari/534.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.602.0 Safari/534.14 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.600.0 Safari/534.14 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.634.0 Safari/534.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.134 Safari/534.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) RockMelt/0.9.50.549 Chrome/10.0.648.205 Safari/534.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.18 (KHTML, like Gecko) Chrome/11.0.661.0 Safari/534.18 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.19 (KHTML, like Gecko) Chrome/11.0.661.0 Safari/534.19 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.21 (KHTML, like Gecko) Chrome/11.0.678.0 Safari/534.21 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.21 (KHTML, like Gecko) Chrome/11.0.682.0 Safari/534.21 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.458.1 Safari/534.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.461.0 Safari/534.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.53 Safari/534.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475 Safari/534 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.724.100 Safari/534.30 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.6 (KHTML, like Gecko) Chrome/7.0.500.0 Safari/534.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.41 Safari/534.7 ChromePlus/1.5.0.0 ChromePlus/1.5.0.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.41 Safari/534.7 ChromePlus/1.5.0.0alpha1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Flock/3.5.2.4599 Chrome/7.0.517.442 Safari/534.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Iron/7.0.520.0 Chrome/7.0.520.0 Safari/534.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Iron/7.0.520.1 Chrome/7.0.520.1 Safari/534.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Iron/7.0.520.1 Safari/534.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) RockMelt/0.8.36.116 Chrome/7.0.517.44 Safari/534.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) RockMelt/0.8.36.128 Chrome/7.0.517.44 Safari/534.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.9 (KHTML, like Gecko) Chrome/7.0.531.0 Safari/534.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US)AppleWebKit/525.19 (KHTML, like Gecko) Iron/0.2.152.0 Safari/13657880.525 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.2) Gecko/20010726 Netscape6/6.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4) Gecko/20011019 Netscape6/6.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.0.0) Gecko/20020509 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.0.0) Gecko/20020530 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.0.1) Gecko/20020823 Netscape/7.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.0.1) Gecko/20020823 Netscape/7.0 (ax) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.0.1) Gecko/20020826 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.0.2) Gecko/20021216 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.0rc2) Gecko/20020512 Netscape/7.0b1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.0rc2) Gecko/20020618 Netscape/7.0b1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.1) Gecko/20020826 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.2) Gecko/20021126 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.2b) Gecko/20020923 Phoenix/0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.2b) Gecko/20021014 Phoenix/0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.2b) Gecko/20021016 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.2b) Gecko/20021029 Phoenix/0.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.3) Gecko/20030312 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.3.1) Gecko/20030425 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.3a) Gecko/20021207 Phoenix/0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.3a) Gecko/20021212 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.3b) Gecko/20030210 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4) Gecko/20030529 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4) Gecko/20030624 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4a) Gecko/20030401 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4a) Gecko/20030411 Phoenix/0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4b) Gecko/20030427 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4b) Gecko/20030503 Mozilla Firebird/0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4b) Gecko/20030507 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4b) Gecko/20030615 Mozilla Firebird/0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.5) Gecko/20030916 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.5) Gecko/20031007 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.5) Gecko/20031007 Firebird/0.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.5) Gecko/20031016 K-Meleon/0.8.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.5a) Gecko/20030630 Mozilla Firebird/0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.5a) Gecko/20030702 Mozilla Firebird/0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.5a) Gecko/20030718 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.5a) Gecko/20030728 Mozilla Firebird/0.6.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.5b) Gecko/20030819 Mozilla Firebird/0.6.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.5b) Gecko/20030827 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6) Gecko/20040113 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6) Gecko/20040206 Firefox/0.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6a) Gecko/20031002 Firebird/0.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6a) Gecko/20031030 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6b) Gecko/20031212 Firebird/0.7+ +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040514 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040614 Firefox/0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040616 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040707 Firefox/0.9.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040803 Firefox/0.9.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.1) Gecko/20040707 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.10) Gecko/20050716 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.11) Gecko/20050728 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050610 K-Meleon/0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.13) Gecko/20060410 Firefox/1.0.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.13) Gecko/20060414 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040803 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.3) Gecko/20040910 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041217 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041220 K-Meleon/0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20050519 Netscape/8.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20050519 Netscape/8.0.1 FirePHP/0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20050729 Netscape/8.0.3.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20050817 Netscape/8.0.3.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20051012 Netscape/8.0.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20060111 Netscape/8.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20060127 Netscape/8.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050223 Firefox/1.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050317 Firefox/1.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050317 Firefox/1.0.2 (ax) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050319 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.7) Gecko/20050414 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 (ax) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.8) Gecko/20050511 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.9) Gecko/20050711 Firefox/1.0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.9) Gecko/20050711 Firefox/1.0.5 (ax) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7b) Gecko/20040421 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20051119 Flock/0.4.11 Firefox/1.0+ +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20051219 SeaMonkey/1.0b +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20060102 SeaMonkey/1.0b +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20060319 Firefox/2.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060130 SeaMonkey/1.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.10) Gecko/20070228 Firefox/1.5.0.10 Flock/0.7.11 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.10) Gecko/20070306 SeaMonkey/1.0.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.10pre) Gecko/20070211 Firefox/1.5.0.10pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.11) Gecko/20070502 Firefox/1.5.0.11 Flock/0.7.13.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.11 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060309 Firefox/1.5.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060404 SeaMonkey/1.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060406 Firefox/1.5.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060419 Firefox/1.5.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060612 Firefox/1.5.0.4 Flock/0.7.0.17.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060620 Firefox/1.5.0.4 Flock/0.7.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.5) Gecko/20060706 K-Meleon/1.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.5) Gecko/20060706 K-Ninja/2.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.5) Gecko/20060719 KHTML/3.5.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.5) Gecko/20060731 Firefox/1.5.0.5 Flock/0.7.4.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060729 SeaMonkey/1.0.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060730 K-Meleon/1.01 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060731 K-Ninja/2.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060910 MultiZilla/1.7.9.0a SeaMonkey/1.0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060910 SeaMonkey/1.0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060915 Firefox/1.5.0.7 Flock/0.7.5.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060917 K-Meleon/1.02 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060917 K-Ninja/2.0.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060929 Firefox/1.5.0.7 Flock/0.7.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20061025 Firefox/1.5.0.8 Flock/0.7.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8 Flock/0.7.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.8) Gecko/20061030 MultiZilla/1.8.3.0a SeaMonkey/1.0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.8) Gecko/20061030 SeaMonkey/1.0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.9) Gecko/20061206 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.9) Gecko/20061211 SeaMonkey/1.0.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.9) Gecko/20061219 Flock/0.7.9.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.9pre) Gecko/20061219 Firefox/1.5.0.9 Flock/0.7.9.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060930 BonEcho/2.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061112 BonEcho/2.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061113 BonEcho/2.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061121 BonEcho/2.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061209 BonEcho/2.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061210 BonEcho/2.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061222 BonEcho/2.0.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.10) Gecko/20071116 K-Meleon/1.1.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071128 SeaMonkey/1.1.7 Mnenhy/0.7.5.666 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071213 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071231 Firefox/2.0.0.11 Flock/1.0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20080126 Firefox/2.0.0.11 Flock/1.0.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11pre) Gecko/20071206 Firefox/2.0.0.11 Navigator/9.0.0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11pre) Gecko/20071206 Firefox/2.0.0.11 Navigator/9.0.0.5 GTB5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080201 MultiZilla/1.8.3.4e SeaMonkey/1.1.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080201 SeaMonkey/1.1.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080201 SeaMonkey/1.1.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080203 K-Meleon/1.1.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080211 Firefox/2.0.0.12 Flock/1.0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Navigator/9.0.0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080304 Firefox/2.0.0.12 Flock/1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080326 Firefox/2.0.0.13 Flock/1.1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080414 Firefox/2.0.0.13 Pogo/2.0.0.13.6866 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080406 K-Meleon/1.1.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080406 K-Meleon/1.5.0b2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080514 Firefox/2.0.0.14 Flock/1.1.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080530 Firefox/2.0.0.14 Flock/1.2.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080608 Firefox/2.0.0.14 Flock/1.2.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/20080621 SeaMonkey/1.1.10 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/20080621 SeaMonkey/1.1.10 Mnenhy/0.7.5.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.16) Gecko/20080702 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.9.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.16) Gecko/20080702 MultiZilla/1.8.3.4e SeaMonkey/1.1.11 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.16) Gecko/20080702 SeaMonkey/1.1.11 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.16) Gecko/20080714 Firefox/2.0.0.16 Flock/1.2.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.17) Gecko/20080829 SeaMonkey/1.1.12 Mnenhy/0.7.5.666 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.17) Gecko/20080910 Firefox/2.0.0.17 Flock/1.2.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.17) Gecko/20080915 Firefox/2.0.0.17 Flock/1.2.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.17) Gecko/20080919 K-Meleon/1.5.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.17) Gecko/20090224 SeaMonkey/1.1.12 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.17pre) Gecko/20080715 Firefox/2.0.0.8pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.17pre) Gecko/20080716 K-Meleon/1.1.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.17pre) Gecko/20080716 K-Meleon/1.5.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.18) Gecko/20081029 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.18) Gecko/20081031 SeaMonkey/1.1.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.18) Gecko/20081107 Firefox/2.0.0.18 Flock/1.2.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.19) Gecko/20081204 MultiZilla/1.8.3.5c SeaMonkey/1.1.14 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.19) Gecko/20081204 SeaMonkey/1.1.14 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.19) Gecko/20081204 SeaMonkey/1.1.14 Mnenhy/0.7.5.666 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.19) Gecko/20081204 SeaMonkey/1.1.14 Mnenhy/0.7.6.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.19) Gecko/20081217 K-Meleon/1.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.19) Gecko/20081217 KMLite/1.1.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1pre) Gecko/20061122 BonEcho/2.0.0.1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1pre) Gecko/20061202 BonEcho/2.0.0.1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1pre) Gecko/20061203 BonEcho/2.0.0.1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070222 SeaMonkey/1.1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070224 lolifox/0.3.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070224 lolifox/0.3.2 MEGAUPLOAD 1.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070225 lolifox/0.32 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070227 BonEcho/2.0.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.21) Gecko/20090303 SeaMonkey/1.1.14 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.21) Gecko/20090303 SeaMonkey/1.1.15 Mnenhy/0.7.5.666 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.21) Gecko/20090303 SeaMonkey/1.1.15 Mnenhy/0.7.6.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.21) Gecko/20090331 K-Meleon/1.5.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.21) Gecko/20090403 Firefox/1.1.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.21) Gecko/20090403 K-Meleon/1.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.21) Gecko/20090403 MultiZilla/1.8.3.4e SeaMonkey/1.1.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.21) Gecko/20090403 SeaMonkey/1.1.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.21) Gecko/20090403 SeaMonkey/1.1.16 Mnenhy/0.7.5.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.21) Gecko/20090403 SeaMonkey/1.1.16 Mnenhy/0.7.5.666 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.22) Gecko/20090605 SeaMonkey/1.1.17 Firefox/3.0.10 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.22) Gecko/20090605 SeaMonkey/1.1.17 Mnenhy/0.7.6.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.22) Gecko/20090623 K-Meleon/1.5.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.22pre) Gecko/20090502 K-Meleon/1.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.24) Gecko/20100228 K-Meleon/1.5.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.24) Gecko/20100228 Sylera/3.0.20 SeaMonkey/1.1.19 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070111 SeaMonkey/1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070111 SeaMonkey/1.1 Mnenhy/0.7.4.10005 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070118 Firefox/2.0.0.2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070213 BonEcho/2.0.0.2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Mozilla/4.8 [en] (Windows NT 5.1; U) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070321 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3pre) Gecko/20070302 BonEcho/2.0.0.3pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4) Gecko/20070416 BonEcho/2.0.0.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4) Gecko/20070509 SeaMonkey/1.1.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4) Gecko/20070511 K-Meleon/1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4) Gecko/20070707 Firefox/2.0.0.4 Flock/0.9.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4pre) Gecko/20070404 K-Ninja/2.1.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4pre) Gecko/20070410 BonEcho/2.0.0.4pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4pre) Gecko/20070416 BonEcho/2.0.0.4pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.5) Gecko/20070716 SeaMonkey/1.1.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.5pre) Gecko/20070622 BonEcho/2.0.0.5pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070727 K-Meleon/1.1.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070801 Firefox/2.0 Wyzo/0.5.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070801 Firefox/2.0.0.6 Flock/0.9.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070802 Firefox/2.0.0.11 SeaMonkey/1.1.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070802 SeaMonkey/1.1.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070809 Sylera/3.0.18 SeaMonkey/1.1.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.7) Gecko/20071013 Firefox/2.0.0.7 Flock/0.9.1.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.7pre) Gecko/20070815 Firefox/2.0.0.6 Navigator/9.0b3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.7pre) Gecko/20070901 BonEcho/2.0.0.7pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.8) Gecko/20071013 K-Meleon/1.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.8) Gecko/20071018 Firefox/2.0.0.8 Flock/1.0RC3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.8pre) Gecko/20071012 BonEcho/2.0.0.8pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.8pre) Gecko/20071012 lolifox/0.3.6 Firefox/2.0.0.7 compatible +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.8pre) Gecko/20071015 Firefox/2.0.0.7 Navigator/9.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.8pre) Gecko/20071019 Firefox/2.0.0.8 Navigator/9.0.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071110 Sylera/3.0.20 SeaMonkey/1.1.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9pre) Gecko/20071102 Firefox/2.0.0.9 Navigator/9.0.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1a2) Gecko/20060512 BonEcho/2.0a2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1a3) Gecko/20060526 BonEcho/2.0a3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1b1) Gecko/20060707 Firefox/2.0b1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1b1) Gecko/20060710 Firefox/2.0b1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1b1) Gecko/20060713 lolifox/0.2.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1b2) Gecko/20060821 Firefox/2.0b2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1b2) Gecko/20060821 SeaMonkey/1.1a +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1b2) Gecko/20060826 BonEcho/2.0b2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8a1) Gecko/20040520 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8a3) Gecko/20040817 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8a4) Gecko/20040927 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8b) Gecko/20050217 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8b4) Gecko/20050729 Firefox/1.0+ +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8b4) Gecko/20050908 Firefox/1.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8b4) Gecko/20050910 SeaMonkey/1.0a +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8b5) Gecko/20051006 Firefox/1.4.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8b5) Gecko/20051021 Flock/0.4 Firefox/1.0+ +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8b5) Gecko/20051103 Flock/0.4 Firefox/1.0+ +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9) Gecko +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/2.0.0.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008071523 Firefox/3.0.1 Flock/2.0b2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042815 Firefox/3.0.10 Wyzo/3.0.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 3.5.30729) FBSMTWB +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.16) Gecko/2009120208 Firefox/3.0.16 FBSMTWB +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.16) Gecko/2010010414 Firefox/3.0.19 Flock/2.5.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.19) Gecko/2010061201 Firefox/3.0.19 Flock/2.6.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.2) Gecko/2008083108 Firefox/3.0.2 Flock/2.0b3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.2pre) Gecko/2008071405 GranParadiso/3.0.2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.2pre) Gecko/2008072405 GranParadiso/3.0.2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/2.0.0.17 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008100719 Firefox/3.0.3 Flock/2.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.4) Gecko/2008112016 Firefox/3.0.4 Flock/2.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.4pre) Gecko/2008101305 GranParadiso/3.0.4pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.4pre) Gecko/2008102405 GranParadiso/3.0.4pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.5) Gecko/2009011615 Firefox/3.0.5 CometBird/3.0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.6) Gecko/2009022300 Firefox/3.0.6 Orca/1.1 build 1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.6pre) Gecko/2008121605 Firefox/3.0.6pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.6pre) Gecko/2009011606 Firefox/3.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009030821 Firefox/3.0.7 Orca/1.1 build 2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.0 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.9) Gecko/2009042410 Firefox/3.0.9 Wyzo/3.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1) Gecko K-Meleon/1.6.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.1) Gecko/20090721 Firefox/3.5.1 Lunascape/5.1.3.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.10) Gecko/20100504 Firefox/3.5.11 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.10) Gecko/20100624 Firefox/3.5.10 Lunascape/6.2.0.22177 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.11) Gecko/20100701 SeaMonkey/2.0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.11) Gecko/20100722 SeaMonkey/2.0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.11) Gecko/20100821 Firefox/3.5.11 Lunascape/6.3.1.22729 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.11pre) Gecko/20100508 SeaMonkey/2.0.6pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.11pre) Gecko/20100515 SeaMonkey/2.0.6pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.13) Gecko/20100914 Mnenhy/0.8.3 SeaMonkey/2.0.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.14) Gecko/20100930 SeaMonkey/2.0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.16) Gecko/20101130 AskTbPLTV5/3.8.0.12304 Firefox/3.5.16 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 GTB7.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.16) Gecko/20120427 Firefox/15.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.17pre) Gecko/20101211 SeaMonkey/2.0.12pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.18) Gecko/20110320 Lightning/1.0b1 SeaMonkey/2.0.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.18) Gecko/20110320 SeaMonkey/2.0.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.19) Gecko/20110420 Firefox/3.5.19 SeaMonkey/2.0.14 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.2) Gecko/20090805 Shiretoko/3.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.2pre) Gecko/20090723 SeaMonkey/2.0b2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.5) Gecko/20091102 MRA 5.5 (build 02842) Firefox/3.5.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.5) Gecko/20091102 MRA 5.5 (build 02842) Firefox/3.5.5 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.5pre) Gecko/20091016 Shiretoko/3.5.5pre GTB6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729) FBSMTWB +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 GTB6 (.NET CLR 3.5.30729) FBSMTWB +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 MRA 5.5 (build 02842) Firefox/3.5.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 MRA 5.5 (build 02842) Firefox/3.5.6 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091206 Firefox/2.0.0.20 SeaMonkey/2.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20100121 Firefox/3.5.6 Wyzo/3.5.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 AppleWebKit/531.21.8 (KHTML, like Gecko) Firefox/3.5.7 Flock/2.5.6 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 AppleWebKit/531.21.8 KHTML/4.3.2 (like Gecko) Firefox/3.5.7 Flock/2.5.6 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 AppleWebKit/531.21.8 KHTML/4.3.5 (like Gecko) Firefox/3.5.7 Flock/2.5.6 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 Flock/2.5.6 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 Prism/1.0b2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 MRA 5.5 (build 02842) Firefox/3.5.7 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.8) Gecko/20100223 Firefox/3.5.8 Lunascape/6.1.0.20995 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1a1pre) Gecko/2008062005 Minefield/3.1a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1a1pre) Gecko/2008071003 Minefield/3.1a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1a1pre) Gecko/2008071603 Firefox Minefield/3.1a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b1pre) Gecko/20080904053130 Minefield/3.1b1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b1pre) Gecko/20080913185648 Minefield/3.1b1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b1pre) Gecko/20080920085411 Minefield/3.1b1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b1pre) Gecko/20080926033937 Minefield/3.1b1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b1pre) Gecko/20080927033433 Minefield/3.1b1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b1pre) Gecko/20080930093007 Minefield/3.1b1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b1pre) Gecko/20081001 Minefield/3.1b1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b2pre) Gecko/20081020 Minefield/3.1b2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b2pre) Gecko/20081026 Minefield/3.1b2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b2pre) Gecko/20081031 Minefield/3.1b2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b3pre) Gecko/20081201 Minefield/3.1b3pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b3pre) Gecko/20081208 SeaMonkey/2.0a3pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b3pre) Gecko/20081212 Shiretoko/3.1b3pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b3pre) Gecko/20081218 Shiretoko/3.1b3pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b3pre) Gecko/20081221 Shiretoko/3.1b3pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b3pre) Gecko/20081228 Shiretoko/3.1b3pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b3pre) Gecko/20090102 Shiretoko/3.1b3pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b3pre) Gecko/20090113 Shiretoko/3.1b3pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b3pre) Gecko/20090121 Shiretoko/3.1b3pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b3pre) Gecko/20090206 Minefield/3.1b2pre Firefox/3.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b3pre) Gecko/20090207 Shiretoko/3.1b3pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b3pre) Gecko/20090213 Firefox/3.0.1b3pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b4pre) Gecko/20090323 Shiretoko/3.5b4pre (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b4pre) Gecko/20090401 Firefox/3.5b4pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b4pre) Gecko/20090409 Firefox/3.5b4pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b4pre) Gecko/20090411 Shiretoko/3.5b4pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b4pre) Gecko/20090413 Shiretoko/3.5b4pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b5pre) Gecko/20090428 SeaMonkey/2.0b1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b5pre) Gecko/20090517 Firefox/3.5b4pre (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1pre) Gecko/20090629 Vonkeror/1.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100206 Palemoon/3.6.0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100206 Palemoon/3.6.0.5 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.11) Gecko/20101023 Firefox/3.6.11 (Palemoon/3.6.11) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.17) Gecko/20110531 Firefox/3.6.17 (Palemoon/3.6.17) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.19pre) Gecko/20110620 Namoroka/3.6.19pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.2) Gecko/20100324 Firefox/3.6.2 (Palemoon/3.6.2) (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.20) Gecko/20110803 AskTbFWV5/3.13.0.17701 Firefox/3.6.20 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.21pre) Gecko K-Meleon/1.7.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.28) Gecko/20120306 Firefox/3.6.28 ( .NET CLR 3.5.30729; .NET4.0C) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.28) Gecko/20120306 Firefox/5.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.2pre) Gecko/20100312 Namoroka/3.6.2pre (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.0.16 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Mozilla/5.0 (X11; U; Linux i686; it-IT; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.25 (jaunty) Firefox/3.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100403 Firefox/3.6.3 (Palemoon/3.6.3) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100403 Firefox/3.6.3 (Palemoon/3.6.3) (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.30) Gecko/20120217 Firefox/3.6.30 (Palemoon/3.6.30) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.32) Gecko/20120529 Firefox/3.6.32 (Palemoon/3.6.32) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.4) Gecko/20100624 Firefox/3.6.4 Lunascape/6.2.0.22177 GTB7.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.9pre) Gecko/20100812 Namoroka/3.6.9pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2a1) Gecko/20090806 Namoroka/3.6a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2a1) Gecko/20090806 Namoroka/3.6a1 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2a1pre) Gecko/20090113 Minefield/3.2a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2a1pre) Gecko/20090120 Minefield/3.2a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2a1pre) Gecko/20090219 Minefield/3.2a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2a1pre) Gecko/20090304 Minefield/3.2a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2a1pre) Gecko/20090306 Minefield/3.2a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2a1pre) Gecko/20090410 Minefield/3.6a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2a1pre) Gecko/20090413 Minefield/3.6a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2a1pre) Gecko/20090415 Minefield/3.6a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2a1pre) Gecko/20090418 Minefield/3.6a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2a1pre) Gecko/20090424 Minefield/3.6a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2a1pre) Gecko/20090425 Minefield/3.6a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2a1pre) Gecko/20090709 Minefield/3.6a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2a2pre) Gecko/20090816 Namoroka/3.6a2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2a2pre) Gecko/20090826 Namoroka/3.6a2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2b4) Gecko/20091124 Firefox/3.6b4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2pre) Gecko/20100115 Prism/1.0b3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.3a1pre) Gecko/20091130 Minefield/3.7a1pre GTB6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.3a1pre) Gecko/20091219 Minefield/3.7a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.3a3pre) Gecko/20100311 Minefield/3.7a3pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.3a5pre) Gecko/20100418 Minefield/3.7a5pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20051220 Firefox/1.6a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20060121 Firefox/1.6a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20060323 Firefox/1.6a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20060520 SeaMonkey/1.5a +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20060725 Minefield/3.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20060809 Minefield/3.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20060816 Minefield/3.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20060826 Minefield/3.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20060906 SeaMonkey/1.5a +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20060910 Minefield/3.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20061102 Minefield/3.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/2006112204 Minefield/3.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20061123 Minefield/3.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20061124 Minefield/3.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20061125 Minefield/3.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20061129 Minefield/3.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20061204 GranParadiso/3.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20061204 GranParadiso/3.0a1 MEGAUPLOAD 1.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20061217 Minefield/3.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a2) Gecko/20070206 GranParadiso/3.0a2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a2pre) Gecko/20061221 Minefield/3.0a2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a2pre) Gecko/20061230 Minefield/3.0a2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a2pre) Gecko/20061231 Minefield/3.0a2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a2pre) Gecko/20070105 Minefield/3.0a2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a2pre) Gecko/20070109 SeaMonkey/1.5a +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a2pre) Gecko/20070130 SeaMonkey/1.5a +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a2pre) Gecko/20070204 Minefield/3.0a2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a3) Gecko/20070322 GranParadiso/3.0a3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a3pre) Gecko/20070218 Minefield/3.0a3pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a3pre) Gecko/20070317 SeaMonkey/1.5a +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a4) Gecko/20070427 GranParadiso/3.0a4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a4) Gecko/2007042705 GranParadiso/3.0a4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a4pre) Gecko/20070404 SeaMonkey/1.5a +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a4pre) Gecko/20070407 Minefield/3.0a4pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a4pre) Gecko/20070416 Minefield/3.0a4pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a4pre) Gecko/20070427 Minefield/3.0a4pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a5pre) Gecko/20070517 Minefield/3.0a5pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a5pre) Gecko/20070527 SeaMonkey/1.5a +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a5pre) Gecko/20070529 Minefield/3.0a5pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a5pre) Gecko/20070529 SeaMonkey/2.0a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a6pre) Gecko/20070602 Minefield/3.0a6pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a6pre) Gecko/20070603 Minefield/3.0a6pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a6pre) Gecko/20070604 Minefield/3.0a6pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a6pre) Gecko/20070622 Minefield/3.0a6pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a6pre) Gecko/20070625 SeaMonkey/2.0a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a6pre) Gecko/20070626 Minefield/3.0a6pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a6pre) Gecko/20070630 Minefield/3.0a6pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a7) Gecko/2007080210 GranParadiso/3.0a7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a7pre) Gecko/2007073105 Minefield/3.0a7pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a8pre) Gecko/2007082705 Minefield/3.0a8pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a9pre) Gecko/2007102105 Minefield/3.0a9pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a9pre) Gecko/2007110705 Minefield/3.0a9pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b1) Gecko/2007110703 Firefox/3.0b1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b2pre) Gecko/2007110805 Minefield/3.0b2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b2pre) Gecko/2007111605 Minefield/3.0b2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b2pre) Gecko/2007120405 Minefield/3.0b2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b2pre) Gecko/2007120505 Minefield/3.0b2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b3) Gecko/2008020514 Firefox/3.0b3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b3pre) Gecko/2007122205 Minefield/3.0b3pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b4pre) Gecko/2008020708 Firefox/3.0b4pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b4pre) Gecko/2008021304 Minefield/3.0b4pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b5pre) Gecko/2008030706 Firefox/3.0b5pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b5pre) Gecko/2008030706 Minefield/3.0b5pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b5pre) Gecko/2008031004 Minefield/3.0b5pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b5pre) Gecko/2008032204 Minefield/3.0b5pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9pre) Gecko/2008032904 Minefield/3.0pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9pre) Gecko/2008040907 Minefield/3.0pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9pre) Gecko/2008041406 Minefield/3.0pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9pre) Gecko/2008041506 Minefield/3.0pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:2.0a1pre) Gecko/2008032902 Minefield/4.0a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:x.xx) Gecko/20030504 Mozilla Firebird/0.6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.7.10) Gecko/20050716 Firefox/1.0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.8.0.5) Gecko/20060721 SeaMonkey/1.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.8.0.7) Gecko/20060917 K-Meleon/1.02 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.8.1.11) Gecko/20071127 Mozilla +Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.1.13) Gecko/20100914 Firefox/3.6.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9a1) Gecko/20061128 BonEcho/0.7b1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-AR; rv:1.7.5) Gecko/20060912 Netscape/8.1.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-AR; rv:1.8.0.7) Gecko/20060917 K-Meleon/1.02 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-AR; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-AR; rv:1.8.1.4) Gecko/20070511 K-Meleon/1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-AR; rv:1.9.1.19) Gecko/20110420 SeaMonkey/2.0.14 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-AR; rv:1.9b2) Gecko/2007121120 Firefox/3.0b2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-CO) AppleWebKit/527+ (KHTML, like Gecko) QtWeb Internet Browser/1.7 http://www.QtWeb.net +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES) AppleWebKit/525.28 (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.7) Gecko/20040803 Firefox/0.9.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.7.3) Gecko/20040910 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.7.5) Gecko/20060127 Netscape/8.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8) Gecko/20060321 Firefox/2.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.1.16) Gecko/20080831 Firefox/2.0.0.16 Flock/1.2.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.1.17pre) Gecko/20080716 K-Meleon/1.5.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.1.18) Gecko/20081029 Firefox/2.0.0.18 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.1.18) Gecko/20081031 SeaMonkey/1.1.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.1.19) Gecko/20081204 SeaMonkey/1.1.14 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.1.19) Gecko/20081217 K-Meleon/1.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.1.21) Gecko/20090331 K-Meleon/1.5.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.1.5) Gecko/20070716 SeaMonkey/1.1.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.0.16) Gecko/2009120208 Firefox/3.0.16 FBSMTWB +Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; fa; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fi-FI) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fi; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-BE) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30) +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR) AppleWebKit/523.15 (KHTML, like Gecko) Version/3.0 Safari/523.15 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR) AppleWebKit/525.28 (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR) AppleWebKit/534.16 (KHTML, like Gecko) Iron/10.0.650.0 Chrome/10.0.650.0 Safari/534.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:0.9.2) Gecko/20010726 Netscape6/6.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.0.0) Gecko/20020530 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.0.1) Gecko/20020823 Netscape/7.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.0.2) Gecko/20030208 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.0rc2) Gecko/20020512 Netscape/7.0b1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.4) Gecko/20030624 Netscape/7.1 (ax) +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.6) Gecko/20040113 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.7.11) Gecko/20050728 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.7.3) Gecko/20040910 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.7.6) Gecko/20050226 Firefox/1.0.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.7.6) Gecko/20050318 Firefox/1.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.7.6) Gecko/20050319 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.7.7) Gecko/20050414 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.8.1.14) Gecko/20080406 K-Meleon/1.1.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.8.1.17) Gecko/20080919 K-Meleon/1.5.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.8.1.21) Gecko/20090331 K-Meleon/1.5.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.8.1.21) Gecko/20090403 SeaMonkey/1.1.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.8.1.23) Gecko/20090825 K-Meleon/1.5.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.8.1.2pre) Gecko/20070111 SeaMonkey/1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-be; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.3.1) Gecko/20030425 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.6) Gecko/20040206 Firefox/0.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.7) Gecko/20040707 Firefox/0.9.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.7) Gecko/20040803 Firefox/0.9.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.7.2) Gecko/20040803 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.7.3) Gecko/20040910 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.7.8) Gecko/20050511 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.10) Gecko/20070216 Firefox/1.5.0.10 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.7) Gecko/20060917 K-Meleon/1.02 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.12) Gecko/20080201 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 (.NET CLR 3.0.04506.30) +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.18) Gecko/20081029 Firefox/2.0.0.18 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.2) Gecko/20070222 SeaMonkey/1.1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.2pre) Gecko/20070111 SeaMonkey/1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.3C +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19 ( .NET CLR 3.5.30729; .NET4.0C) +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.1.14) Gecko/20100930 SeaMonkey/2.0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.13) Gecko/20101203 iPhone +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17 ( .NET CLR 3.5.30729; .NET4.0E) +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2b4) Gecko/20091124 Firefox/3.6b4 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2b5) Gecko/20091204 Firefox/3.6b5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9b5) Gecko/2008032620 Firefox/3.0b5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; hr) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; hu-HU) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; hu-HU; rv:1.8.1.21) Gecko/20090331 K-Meleon/1.5.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.6) Gecko/20040113 +Mozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 +Mozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.9.1.11) Gecko/20100701 Firefox/3.5.11 +Mozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; id) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; it) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT) AppleWebKit/525+ (KHTML, like Gecko) Version/3.1.2 Safari/525.21 +Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21 +Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT; rv:1.7.5) Gecko/20060127 Netscape/8.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT; rv:1.7.6) Gecko/20050318 Firefox/1.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT; rv:1.9.2.32) Gecko/20120529 Firefox/3.6.32 (Palemoon/3.6.32) +Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT; rv:1.9a1) Gecko/20100202 Firefox/3.0.18 +Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 +Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12 +Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.18) Gecko/20081029 Firefox/2.0.0.18 +Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8b5) Gecko/20051006 Firefox/1.4.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.0.16) Gecko/2009120208 Firefox/3.0.16 FBSMTWB +Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.1.12) Gecko/20100825 SeaMonkey/2.0.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17 ( .NET CLR 3.5.30729; .NET4.0E) +Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.2.28) Gecko/20120306 AskTbSTC-SRS/3.13.1.18132 Firefox/3.6.28 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 ( .NET CLR 3.5.30729; .NET4.0E) +Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9b2) Gecko/2007121120 Firefox/3.0b2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JA; rv:1.8.1.24pre) Gecko/20100228 K-Meleon/1.5.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP) AppleWebKit/529 (KHTML, like Gecko, Safari/529.0) Lunascape/4.9.9.99 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP) AppleWebKit/533.3 (KHTML, like Gecko) Lunascape/6.3.4.23051 Safari/533.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.9.2) Gecko/20100206 Palemoon/3.6.0.5 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.9.2.3) Gecko/20100403 Firefox/3.6.3 (Palemoon/3.6.3) (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.9.2.3) Gecko/20100403 Firefox/3.6.3 (Palemoon/3.6.3) GTB7.0 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.9.2.8) Gecko/20100817 Firefox/3.6.8 (Palemoon/3.6.8a) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-jp) AppleWebKit/534.7 (KHTML, like Gecko) Iron/7.0.520.1 Chrome/7.0.520.1 Safari/534.7 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.0.10) Gecko/20070216 Firefox/1.5.0.10 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.0.14) Gecko/2009082707 Firefox/3.0.14 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19 GTB7.0 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1) Gecko/20090701 Firefox/3.5 Lunascape/5.1.1.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.10) Gecko/20100624 Firefox/3.5.10 Lunascape/6.2.0.22177 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.10) Gecko/20100624 Firefox/3.5.10 Lunascape/6.2.0.22177 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.11) Gecko/20100723 Firefox/3.5.11 Lunascape/6.2.1.22445 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.13) Gecko/20100917 Firefox/3.5.13 Lunascape/6.3.3.22929 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.15) Gecko/20101029 Firefox/3.5.15 Lunascape/6.3.4.23051 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.15) Gecko/20101029 Firefox/3.5.15 Lunascape/6.3.4.23051 ( .NET CLR 3.5.30729; .NET4.0E) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.17) Gecko/20110123 SeaMonkey/2.0.12 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 GTB7.0 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.9) Gecko/20100331 Firefox/3.5.9 Lunascape/6.1.4.21478 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.9) Gecko/20100331 Firefox/3.5.9 Lunascape/6.1.4.21478 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.25) Gecko/20111212 Firefox/3.6.25 ( .NET CLR 3.5.30729; .NET4.0C) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.32) Gecko/20120529 Firefox/3.6.32 (Palemoon/3.6.32) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2a1pre) Gecko/20090402 Firefox/3.6a1pre (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9b5) Gecko/2008032620 Firefox/3.0b5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ko-KR) AppleWebKit/525.28 (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ko-KR; rv:1.8.0.7) Gecko/20060917 K-Meleon/1.02 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 ( .NET CLR 3.5.30729; .NET4.0E) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.9.2.16) Gecko/20110325 Firefox/3.6.16 Lunascape/6.4.5.23569 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.9.2.4) Gecko/20100523 Firefox/3.6.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; lt; rv:1.9b4) Gecko/2008030714 Firefox/3.0b4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; nb) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; nb-NO) AppleWebKit/525.28 (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; nb-NO) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; nb-NO; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; nl) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; nl) AppleWebKit/522.12.1 (KHTML, like Gecko) Version/3.0.1 Safari/522.12.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; nl) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; nl-NL) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; nl-NL; rv:1.7.6) Gecko/20050318 Firefox/1.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 +Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12 +Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.9.1.13) Gecko/20100914 Lightning/1.0b1 SeaMonkey/2.0.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.9b4) Gecko/2008030714 Firefox/3.0b4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL) AppleWebKit/523.12.9 (KHTML, like Gecko) Version/3.0 Safari/523.12.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL) AppleWebKit/523.15 (KHTML, like Gecko) Version/3.0 Safari/523.15 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.17 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL; rv:1.8.0.7) Gecko/20060910 SeaMonkey/1.0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL; rv:1.8.1.13) Gecko/20080313 SeaMonkey/1.1.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL; rv:1.8.1.16) Gecko/20080702 SeaMonkey/1.1.11 Mnenhy/0.7.5.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL; rv:1.8.1.19) Gecko/20081217 K-Meleon/1.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL; rv:1.8.1.22) Gecko/20090623 K-Meleon/1.5.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL; rv:1.8.1.24pre) Gecko/20100228 K-Meleon/1.5.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL; rv:1.8.1.9) Gecko/20071030 SeaMonkey/1.1.6 Mnenhy/0.7.5.666 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL; rv:1.9a1) Gecko/20060812 SeaMonkey/1.5a +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.0.5) Gecko/20060801 Firefox/1.5.0.5 Flock/0.7.4.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.1) Gecko/20061204 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.1) Gecko/20061204 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1) Gecko/20060918 Firefox/2.0b2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.0.6) Gecko/2009011913 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7.5) Gecko/20041221 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.1b3pre) Gecko/20090205 Shiretoko/3.1b3pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 GTB6 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.3) Gecko/20100401 Lightningquail/3.6.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR) AppleWebKit/523.15 (KHTML, like Gecko) Version/3.0 Safari/523.15 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR) AppleWebKit/525+ (KHTML, like Gecko) Version/3.0 Safari/523.15 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR) AppleWebKit/532.4 (KHTML, like Gecko) WeltweitimnetzBrowser/0.25 Safari/532.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR) AppleWebKit/533.3 (KHTML, like Gecko) QtWeb Internet Browser/3.7 http://www.QtWeb.net +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR) AppleWebKit/533.3 (KHTML, like Gecko) WeltweitimnetzBrowser/0.25 Safari/533.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR) AppleWebKit/534.12 (KHTML, like Gecko) Navscape/Pre-0.1 Safari/534.12 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR) AppleWebKit/534.12 (KHTML, like Gecko) NavscapeNavigator/Pre-0.1 Safari/534.12 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR) AppleWebKit/534.12 (KHTML, like Gecko) WeltweitimnetzBrowser/0.25 Safari/534.12 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR) AppleWebKit/534.8 (KHTML, like Gecko) Navscape/Pre-0.2 Safari/534.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.8.1.14) Gecko/20080406 K-Meleon/1.1.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.8.1.21) Gecko/20090303 K-Meleon/1.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.8.1.21) Gecko/20090403 K-Meleon/1.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.0.14) Gecko/2009082707 Firefox/3.0.14 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.0.14) Gecko/2009082707 Firefox/3.0.14 GTB6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.1.11) Gecko/20100701 Firefox/3.5.11 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-PT) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-PT; rv:1.8.1.21) Gecko/20090303 K-Meleon/1.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-PT; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.7 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; pt; rv:1.9.1.13) Gecko/20100917 Firefox/3.5.13 Lunascape/6.3.2.22803 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ro-RO; rv:1.7.6) Gecko/20050318 Firefox/1.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ro; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/525.26.2 (KHTML, like Gecko) Version/3.2 Safari/525.26.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/525.28 (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.6) Gecko/20050319 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.8.0.1) Gecko/20060130 SeaMonkey/1.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.8.1.12) Gecko/20080203 K-Meleon/1.1.4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.8.1.17) Gecko/20080919 K-Meleon/1.5.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.14) Gecko/20080603 Firefox/2.0.0.14 Flock/1.2.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.15) Gecko/20080706 Firefox/2.0.0.15 Flock/1.2.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.12) Gecko/20100824 MRA 5.7 (build 03755) Firefox/3.5.12 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.18pre) Gecko/20110610 Namoroka/3.6.18pre ( ) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.20pre) Gecko/20110718 Namoroka/3.6.20pre ( ) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.7 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9b3) Gecko/2008020514 Firefox/3.0b3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20040911 Firefox/0.10.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20040913 Firefox/0.10 +Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20040913 Firefox/0.10.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.8.1.4) Gecko/20070511 K-Meleon/1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.9.1b3pre) Gecko/20081202 SeaMonkey/2.0a2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.9b3pre) Gecko/2008010602 SeaMonkey/2.0a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; sl; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; sl; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; sv) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; sv) AppleWebKit/522.12.1 (KHTML, like Gecko) Version/3.0.1 Safari/522.12.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; sv) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.6) Gecko/20050318 Firefox/1.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.8.0.10) Gecko/20070216 Firefox/1.5.0.10 +Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12 +Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 +Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.9.2.32) Gecko/20120529 Firefox/3.6.32 (Palemoon/3.6.32) +Mozilla/5.0 (Windows; U; Windows NT 5.1; th) AppleWebKit/522.12.1 (KHTML, like Gecko) Version/3.0.1 Safari/522.12.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; tr-TR) AppleWebKit/523.15 (KHTML, like Gecko) Version/3.0 Safari/523.15 +Mozilla/5.0 (Windows; U; Windows NT 5.1; tr-TR) AppleWebKit/527+ (KHTML, like Gecko) QtWeb Internet Browser/1.5 http://www.QtWeb.net +Mozilla/5.0 (Windows; U; Windows NT 5.1; tr-TR; rv:1.7.6) Gecko/20050321 Firefox/1.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.8b5) Gecko/20051006 Firefox/1.4.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17 +Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 ( .NET CLR 3.5.30729; .NET4.0E) +Mozilla/5.0 (Windows; U; Windows NT 5.1; uk; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30) +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/533.16 (KHTML, like Gecko) Chrome/5.0.335.0 Safari/533.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.7.12) Gecko/20051001 Firefox/1.0.7 Madfox/0.3.2u3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.14) Gecko/20080406 K-Meleon/1.1.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.17 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.18) Gecko/20081029 Firefox/2.0.0.18 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.1) Gecko/20080722 Firefox/3.0.1 Kapiko/3.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.7pre) Gecko/2009012106 GranParadiso/3.0.7pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.18) Gecko/20110320 SeaMonkey/2.0.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.31) Gecko/20120408 Firefox/3.6.31 (Palemoon/3.6.31) +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.4) Gecko/20100503 Firefox/3.6.4 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9a1) Gecko/20061204 GranParadiso/3.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9a4pre) Gecko/20070427 Minefield/3.0a4pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9b2pre) Gecko/2007112619 Minefield/3.0b2pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9b3) Gecko/2008020514 Firefox/3.0b3 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9b3pre) Gecko/2007121805 Minefield/3.0b3pre +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9b4) Gecko/2008030714 Firefox/3.0b4 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW) AppleWebKit/523.15 (KHTML, like Gecko) Version/3.0 Safari/523.15 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.7.5) Gecko/20041119 Firefox/1.0 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.0.9) Gecko/2009040821 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 GTB6 +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.1b4pre) Gecko/20090308 Shiretoko/3.1b4pre (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.2.15pre) Gecko/20110127 Namoroka/3.6.15pre (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 GTB7.0 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9b4) Gecko/2008030714 Firefox/3.0b4 +Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; en-US; rv:1.9.0.7) Gecko/2009030713 Minefield/3.0.7 +Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; en-US; rv:1.9a1) Gecko/20060214 Firefox/1.6a1 +Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; en-US; rv:1.9a1) Gecko/20061007 Minefield/3.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.2; da; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.2; de-AT; rv:1.8.1.16) Gecko/20080702 SeaMonkey/1.1.11 +Mozilla/5.0 (Windows; U; Windows NT 5.2; de-AT; rv:1.8.1.21) Gecko/20090403 SeaMonkey/1.1.16 +Mozilla/5.0 (Windows; U; Windows NT 5.2; de-DE) AppleWebKit/528+ (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Windows; U; Windows NT 5.2; de-DE) AppleWebKit/528+ (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1 +Mozilla/5.0 (Windows; U; Windows NT 5.2; de-DE) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 +Mozilla/5.0 (Windows; U; Windows NT 5.2; de-DE) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.2 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.2; de-DE; rv:1.7.6) Gecko/20050321 Firefox/1.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.2; de-DE; rv:1.8.1.19) Gecko/20081217 K-Meleon/1.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.2; de; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.2; de; rv:1.9.1.15) Gecko/20101027 SeaMonkey/2.0.10 +Mozilla/5.0 (Windows; U; Windows NT 5.2; de; rv:1.9.1.16) Gecko/20101123 SeaMonkey/2.0.11 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-CA; rv:1.9.1.11pre) Gecko/20100605 SeaMonkey/2.0.6pre +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-CA; rv:1.9.1.11pre) Gecko/20100617 SeaMonkey/2.0.6pre +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-CA; rv:1.9.1.11pre) Gecko/20100622 SeaMonkey/2.0.6pre +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-CA; rv:1.9.1.11pre) Gecko/20100623 SeaMonkey/2.0.6pre +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-CA; rv:1.9.1.11pre) Gecko/20100625 SeaMonkey/2.0.6pre +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-CA; rv:1.9.1.11pre) Gecko/20100627 SeaMonkey/2.0.6pre +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-CA; rv:1.9.1.11pre) Gecko/20100629 SeaMonkey/2.0.6pre +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-CA; rv:1.9.1.11pre) Gecko/20100630 SeaMonkey/2.0.6pre +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-CA; rv:1.9.1.9pre) Gecko/20100305 SeaMonkey/2.0.4pre +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-CA; rv:1.9.2.4) Gecko/20100523 Firefox/3.6.4 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-CA; rv:1.9.3a3pre) Gecko/20100312 SeaMonkey/2.1a1pre +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-GB; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-GB; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-GB; rv:1.8.1.2pre) Gecko/20070226 BonEcho/2.0.0.2pre +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-GB; rv:1.8.1.3pre) Gecko/20070302 BonEcho/2.0.0.3pre +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-GB; rv:1.9.2.9) Gecko/20100824 Firefox/3.6.9 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.30 Safari/525.13 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.6 Safari/525.13 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.151.0 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.3.154.6 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.43 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.53 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.59 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.28 (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/530.4 (KHTML, like Gecko) Chrome/2.0.172.0 Safari/530.4 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.43 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/531.3 (KHTML, like Gecko) Chrome/3.0.193.2 Safari/531.3 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/0.0.0 Safari/532.0 Iron/3.0.197.0 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.21 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.27 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.33 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.6 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.2 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.1 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.210.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.212.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Iron/3.0.197.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.0 Safari/532.1 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.1 Safari/532.1 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.3 Safari/532.1 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.5 Safari/532.1 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.6 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.6 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.2 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Iron/4.0.275.2 Chrome/4.0.275.2 Safari/532.8 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.126 Safari/533.4 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.540.0 Safari/534.10 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10 ChromePlus/1.5.1.1 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.558.0 Safari/534.10 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Iron/10.0.650.0 Chrome/10.0.650.0 Safari/534.16 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Iron/10.0.650.1 Chrome/10.0.650.1 Safari/534.16 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/11.0.652.0 Safari/534.17 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.2 (KHTML, like Gecko) Chrome/6.0.454.0 Safari/534.2 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.458.0 Safari/534.3 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.460.0 Safari/534.3 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.462.0 Safari/534.3 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.463.0 Safari/534.3 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.33 Safari/534.3 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.4 (KHTML, like Gecko) Chrome/6.0.481.0 Safari/534.4 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.41 Safari/534.7 ChromePlus/1.5.0.0 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.41 Safari/534.7 ChromePlus/1.5.0.0alpha1 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) Chrome/0.0.0 Iron/3.0.197.0 AppleWebKit/532.0 (KHTML, like Gecko) Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.7.1) Gecko/20040707 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.7.2) Gecko/20040709 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.7.9) Gecko/20050711 Firefox/1.0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.0.7) Gecko/20060917 K-Meleon/1.02 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.17pre) Gecko/20080716 K-Meleon/1.1.6 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.17pre) Gecko/20080716 K-Meleon/1.5.0 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.19) Gecko/20081204 SeaMonkey/1.1.14 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.19) Gecko/20081217 K-Meleon/1.5.2 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.21) Gecko/20090331 K-Meleon/1.5.3 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.4pre) Gecko/20070510 BonEcho/2.0.0.4pre +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.5) Gecko/20070722 K-Meleon/1.11 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.6) Gecko/20070727 K-Meleon/1.1.2 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.7pre) Gecko/20070815 Firefox/2.0.0.6 Navigator/9.0b3 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1a2) Gecko/20060512 BonEcho/2.0a2 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8b5) Gecko/20051006 Firefox/1.4.1 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.0.9) Gecko/2009042410 Firefox/3.0.9 Wyzo/3.0.3 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.10) Gecko/20100504 Lightning/1.0b1 SeaMonkey/2.0.5 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.18) Gecko/20110320 SeaMonkey/2.0.13 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.4) Gecko/20091007 Firefox/3.5.4 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.6) Gecko/20091222 Shiretoko/3.5.6 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.7) Gecko/20100104 SeaMonkey/2.0.2 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1b2pre) Gecko/20081110 Minefield/3.1b2pre +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1b3pre) Gecko/20090104 Shiretoko/3.1b3pre +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1b3pre) Gecko/20090105 Firefox/3.1b3pre +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1b3pre) Gecko/20090105 Shiretoko/3.1b3pre +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20 ( .NET CLR 3.5.30729; .NET4.0E) +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9a1) Gecko/20060926 Minefield/3.0a1 +Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9a3pre) Gecko/20070320 Minefield/3.0a3pre +Mozilla/5.0 (Windows; U; Windows NT 5.2; es-ES; rv:1.9.1.10) Gecko/20100624 Firefox/3.5.10 Lunascape/6.1.7.21880 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.2; eu) AppleWebKit/530.4 (KHTML, like Gecko) Chrome/2.0.172.0 Safari/530.4 +Mozilla/5.0 (Windows; U; Windows NT 5.2; fr-FR; rv:1.8.1.21) Gecko/20090331 K-Meleon/1.5.3 +Mozilla/5.0 (Windows; U; Windows NT 5.2; fr; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.0.04506.648) +Mozilla/5.0 (Windows; U; Windows NT 5.2; fr; rv:1.9b5) Gecko/2008032620 Firefox/3.0b5 +Mozilla/5.0 (Windows; U; Windows NT 5.2; nl) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 +Mozilla/5.0 (Windows; U; Windows NT 5.2; nl; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 +Mozilla/5.0 (Windows; U; Windows NT 5.2; nl; rv:1.9b5) Gecko/2008032620 Firefox/3.0b5 +Mozilla/5.0 (Windows; U; Windows NT 5.2; pt) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 +Mozilla/5.0 (Windows; U; Windows NT 5.2; pt-BR) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21 +Mozilla/5.0 (Windows; U; Windows NT 5.2; pt-BR) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.4 (Change: ) +Mozilla/5.0 (Windows; U; Windows NT 5.2; ru-RU) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13.3 +Mozilla/5.0 (Windows; U; Windows NT 5.2; ru; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11 +Mozilla/5.0 (Windows; U; Windows NT 5.2; rv:1.7.3) Gecko/20041001 Firefox/0.10.1 +Mozilla/5.0 (Windows; U; Windows NT 5.2; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11 +Mozilla/5.0 (Windows; U; Windows NT 5.2; sk; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15 +Mozilla/5.0 (Windows; U; Windows NT 5.2; zh) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1 +Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.1.5) Gecko/Firefox/3.5.5 +Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-TW; rv:1.9.1.5) Gecko/20091106 Shiretoko/3.5.5 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-TW; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 +Mozilla/5.0 (Windows; U; Windows NT 6.0 (x86_64); de-DE) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.2 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0 ; x64; en-US; rv:1.9.1b2pre) Gecko/20081026 Firefox/3.1b2pre +Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9.0.3pre) Gecko/2008111500 Minefield/3.0.5pre +Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9.1b2pre) Gecko/20081026 Firefox/3.1b2pre +Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9.1b2pre) Gecko/20081026 Minefield/3.1b2pre +Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9a1) Gecko/20061007 Minefield/3.0a1 +Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9a8pre) Gecko/2007090213 Minefield/3.0a8pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; bg; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; cs) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; cs; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 +Mozilla/5.0 (Windows; U; Windows NT 6.0; cs; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 +Mozilla/5.0 (Windows; U; Windows NT 6.0; cs; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19 +Mozilla/5.0 (Windows; U; Windows NT 6.0; da-DK) AppleWebKit/523.12.9 (KHTML, like Gecko) Version/3.0 Safari/523.12.9 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de-AT; rv:1.8.0.5) Gecko/20060706 K-Meleon/1.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de-AT; rv:1.8.1.18) Gecko/20081031 SeaMonkey/1.1.13 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de-AT; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.4 (Change: ) +Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE; rv:1.8.1.12) Gecko/20080203 K-Meleon/1.1.4 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.8.1.5pre) Gecko/20070604 BonEcho/2.0.0.5pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 4.0.20506) +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.15) Gecko/2009101601 Firefox 2.1 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.16) Gecko/20101123 SeaMonkey/2.0.11 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.2) Gecko/20090729 Firefox/2.0.0.15 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.8) Gecko/20100205 SeaMonkey/2.0.3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 GTB7.0 (.NET CLR 3.0.30618) +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.2.13) Gecko/20101203 Firefox/3.5.9 (de) +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.19 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20 +Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9b5) Gecko/2008032620 Firefox/3.0b5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en) AppleWebKit/522.12.1 (KHTML, like Gecko) Version/3.0.1 Safari/522.12.2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en) AppleWebKit/525+ (KHTML, like Gecko) Version/3.0.4 Safari/523.11 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.19 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.0.13) Gecko/2009073022 EnigmaFox/3.0.13 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19 (.NET CLR 3.5.30729) FirePHP/0.3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.0.7) Gecko/2009021910 MEGAUPLOAD 1.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 GTB5 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 GTB5 (.NET CLR 4.0.20506) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.10) Gecko/20100504 Firefox/3.5.10 GTB7.0 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.2.15) Gecko/20110303 AskTbBT4/3.11.3.15590 Firefox/3.6.15 ( .NET CLR 3.5.30729; .NET4.0C) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.2.18) Gecko/20110614 Firefox/3.6.18 ( .NET CLR 3.5.30729; .NET4.0E) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.2.24) Gecko/20111103 Firefox/3.6.24 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.2.9) Gecko/20100824 Firefox/3.6.9 ( .NET CLR 3.5.30729; .NET CLR 4.0.20506) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-MY) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.10.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/523.15 (KHTML, like Gecko) Version/3.0 Safari/523.15 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.30 Safari/525.13 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.6 Safari/525.13 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.17 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.151.0 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.152.0 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.153.0 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.4.154.31 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.42 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.43 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.46 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.50 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.53 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.59 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Iron/0.2.152.0 Safari/14871328.525 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Iron/0.2.152.0 Safari/41562480.525 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/527+ (KHTML, like Gecko) QtWeb Internet Browser/1.7 http://www.QtWeb.net +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.4 (Change: ) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6 (Change: ) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/528+ (KHTML, like Gecko, Safari/528.0) Lunascape/5.1.2.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/528.10 (KHTML, like Gecko) Chrome/2.0.157.2 Safari/528.10 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/528.11 (KHTML, like Gecko) Chrome/2.0.157.0 Safari/528.11 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/528.4 (KHTML, like Gecko) Iron/0.3.155.0 Safari/18455624.528 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/528.4 (KHTML, like Gecko) Iron/0.3.155.0 Safari/19322656.528 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/528.5 (KHTML, like Gecko) Iron/0.4.155.0 Safari/528.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/528.7 (KHTML, like Gecko) Iron/1.0.155.0 Safari/528.7 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/528.8 (KHTML, like Gecko) Chrome/2.0.156.1 Safari/528.8 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/529 (KHTML, like Gecko, Safari/529.0) Lunascape/4.9.9.100 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.0 (KHTML, like Gecko) Chrome/2.0.160.0 Safari/530.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.0 (KHTML, like Gecko) Chrome/2.0.162.0 Safari/530.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.1 (KHTML, like Gecko) Chrome/2.0.164.0 Safari/530.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.1 (KHTML, like Gecko) Chrome/2.0.168.0 Safari/530.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.1 (KHTML, like Gecko) Iron/2.0.168.0 Safari/530.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.4 (KHTML, like Gecko) Chrome/2.0.171.0 Safari/530.4 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.2 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.23 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.39 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.40 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.43 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.6 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.173.1 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.6 (KHTML, like Gecko) Chrome/2.0.174.0 Safari/530.6 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.7 (KHTML, like Gecko) Chrome/2.0.176.0 Safari/530.7 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/531.3 (KHTML, like Gecko) Chrome/3.0.193.0 Safari/531.3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/531.3 (KHTML, like Gecko) Chrome/3.0.193.2 Safari/531.3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.1 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.10 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.17 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.20 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.21 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.27 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.3 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.6 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.196.2 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.197.11 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.201.1 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.2 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.1 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.207.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.208.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.2 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.4 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.7 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.1 Safari/532.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.220.1 Safari/532.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.6 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.12 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.0 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.3 (KHTML, like Gecko) Chrome/4.0.224.2 Safari/532.3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.3 (KHTML, like Gecko) Iron/4.0.227.0 Chrome/4.0.227.0 Safari/532.3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.4 (KHTML, like Gecko) Chrome/4.0.241.0 Safari/532.4 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Iron/4.0.275.2 Chrome/4.0.275.2 Safari/532.8 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Iron/4.0.280.0 Chrome/4.0.280.0 Safari/532.9 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.1 (KHTML, like Gecko) Maxthon/3.0.8.2 Safari/533.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.1 Safari/533.2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.5 Safari/533.2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/533.3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.127 Safari/533.4 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10 ChromePlus/1.5.1.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10 ChromePlus/1.5.2.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.10 (KHTML, like Gecko) RockMelt/0.8.40.147 Chrome/8.0.552.231 Safari/534.10 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Iron/9.0.600.2 Chrome/9.0.600.2 Safari/534.13 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.13 (KHTML, like Gecko) RockMelt/0.9.46.126 Chrome/9.0.597.107 Safari/534.13 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.13 (KHTML, like Gecko) RockMelt/0.9.48.58 Chrome/9.0.597.107 Safari/534.13 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Iron/10.0.650.0 Chrome/10.0.650.0 Safari/534.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.16 (KHTML, like Gecko) RockMelt/0.9.50.518 Chrome/10.0.648.205 Safari/534.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.16 (KHTML, like Gecko) RockMelt/0.9.50.549 Chrome/10.0.648.205 Safari/534.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.0 Chrome/11.0.700.0 Safari/534.24 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.458.1 Safari/534.3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475 Chrome/6.0.475.0 Safari/14183168.534 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475 Chrome/6.0.475.0 Safari/42721888.534 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475 Chrome/6.0.475.0 Safari/56984160.534 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475 Chrome/6.0.475.0 Safari/59178784.534 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475 Chrome/6.0.475.0 Safari/87693504.534 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Iron/7.0.520.0 Chrome/7.0.520.0 Safari/534.7 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.7 (KHTML, like Gecko) RockMelt/0.8.36.116 Chrome/7.0.517.44 Safari/534.7 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.7 (KHTML, like Gecko) RockMelt/0.8.36.128 Chrome/7.0.517.44 Safari/534.7 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.7 (KHTML, like Gecko) RockMelt/0.8.36.79 Chrome/7.0.517.44 Safari/534.7 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.8 (KHTML, like Gecko) Chrome/7.0.521.0 Safari/534.8 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/535.1 (KHTML, like Gecko) Iron/13.0.800.0 Chrome/13.0.800.0 Safari/535.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.7.12) Gecko/20050915 K-Meleon/0.9 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.7.13) Gecko/20060414 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.7.5) Gecko/20060912 Netscape/8.1.2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.7.5) Gecko/20070321 Netscape/8.1.3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.0.10pre) Gecko/20070207 Firefox/1.5.0.10pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.0.6) Gecko/20060730 K-Meleon/1.01 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.10) Gecko/20071116 K-Meleon/1.1.3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.11) Gecko/20071128 SeaMonkey/1.1.7 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.12) Gecko/20080203 K-Meleon/1.1.4 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Navigator/9.0.0.6 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.13) Gecko/20080326 Firefox/2.0.0.13 Flock/1.1.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.17 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.14) Gecko/20080406 K-Meleon/1.1.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.14) Gecko/20080414 Firefox/2.0.0.14 Flock/1.1.2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.17 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.17) Gecko/20080915 Firefox/2.0.0.17 Flock/1.2.6 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.17) Gecko/20080919 K-Meleon/1.5.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.17pre) Gecko/20080716 K-Meleon/1.5.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.18) Gecko/20081031 SeaMonkey/1.1.13 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.19) Gecko/20081204 SeaMonkey/1.1.14 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.19) Gecko/20081217 K-Meleon/1.5.2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.2) Gecko/20070222 K-Meleon/1.02 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.21) Gecko/20090303 SeaMonkey/1.1.15 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.21) Gecko/20090331 K-Meleon/1.5.3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.21) Gecko/20090403 K-Meleon/1.02 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.21) Gecko/20090403 SeaMonkey/1.1.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.2pre) Gecko/20070221 K-Meleon/0.9 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.6) Gecko/20070801 Firefox/2.0 Wyzo/0.5.3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.7) Gecko/20070925 Firefox/2.0.0.7 Flock/0.9.1.2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.8pre) Gecko/20070928 Firefox/2.0.0.7 Navigator/9.0RC1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.8pre) Gecko/20071019 Firefox/2.0.0.8 Navigator/9.0.0.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1b2) Gecko/20060821 Firefox/2.0b2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8b5) Gecko/20051019 Flock/0.4 Firefox/1.0+ +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9) Gecko/2008061302 Firefox/3.0 Flock/2.0b1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9) Gecko/2008071513 Minefield/3.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12 GTB5 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.5.12 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.14) Gecko/2009082707 Firefox/3.0.14 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.2) Gecko/2008092122 Firefox/3.0.2 Flock/2.0b3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.3) Gecko/2008100719 Firefox/3.0.3 Flock/2.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.4) Gecko/2008112016 Firefox/3.0.4 Flock/2.0.2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.5) Gecko/2008121620 Firefox/3.0.5 Flock/2.0.3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.5) Gecko/2009011615 Firefox/3.0.5 CometBird/3.0.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.7) Gecko/2009030821 Firefox/3.0.7 Orca/1.1 build 2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.9) Gecko/2009042410 Firefox/3.0.9 Wyzo/3.0.3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1) Gecko/20090701 Firefox/3.5 Lunascape/5.1.2.3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.1) Gecko/20090722 Firefox/3.5.1 Orca/1.2 build 2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.11) Gecko/20100701 SeaMonkey/2.0.6 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.15) Gecko/20101029 Firefox/3.5.15 Lunascape/6.3.4.23051 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.16) Gecko/20101123 SeaMonkey/2.0.11 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.16) Gecko/20101130 MRA 5.4 (build 02647) Firefox/3.5.16 ( .NET CLR 3.5.30729; .NET4.0C) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.19) Gecko/20110420 SeaMonkey/2.0.14 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.1pre) Gecko/20090717 SeaMonkey/2.0b1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 2.0.50727; .NET CLR 3.0.30618; .NET CLR 3.5.21022; .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.6) Gecko/20091201 MRA 5.4 (build 02647) Firefox/3.5.6 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 (.NET CLR 3.5.30729) FirePHP/0.4 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1a1pre) Gecko/2008071403 Minefield/3.1a1pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1a2pre) Gecko/2008072403 Minefield/3.1a2pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b2) Gecko/20081127 Firefox/3.1b1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b2pre) Gecko/20081011 Minefield/3.1b2pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b3) Gecko/20090305 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b3) Gecko/20090405 Firefox/3.1b3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b3pre) Gecko/20081204 Shiretoko/3.1b3pre (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b3pre) Gecko/20081207 Shiretoko/3.1b3pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 GTB5 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b4pre) Gecko/20090307 Shiretoko/3.1b4pre (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b4pre) Gecko/20090311 Shiretoko/3.1b4pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b4pre) Gecko/20090312 Firefox/3.1b4pre Lunascape/5.0.3.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b4pre) Gecko/20090312 Firefox/3.1b4pre Lunascape/5.0.5.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b5pre) Gecko/20090519 Shiretoko/3.5b5pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1pre) Gecko/20090516 Firefox/3.5pre Lunascape/5.1.0.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.10pre) Gecko/20100828 Namoroka/3.6.10pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 (.NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; .NET CLR 3.5.21022) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.3) Gecko/20100403 Firefox/3.6.3 (Palemoon/3.6.3) (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.3) Gecko/20100405 Namoroka/3.6.3 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.4) Gecko/20100523 Firefox/3.6.4 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.4) Gecko/20100527 Firefox/3.6.4 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.4) Gecko/20100527 Firefox/3.6.4 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2a1) Gecko/20090806 Namoroka/3.6a1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2a1) Gecko/20090806 Namoroka/3.6a1 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2a1pre) Gecko/20090207 Minefield/3.2a1pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2a1pre) Gecko/20090210 Minefield/3.2a1pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2a1pre) Gecko/20090226 Minefield/3.2a1pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2a1pre) Gecko/20090306 Minefield/3.2a1pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2a1pre) Gecko/20090324 Minefield/3.6a1pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2a1pre) Gecko/20090401 Minefield/3.6a1pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2a1pre) Gecko/20090407 Minefield/3.6a1pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2a1pre) Gecko/20090411 Minefield/3.6a1pre (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2a1pre) Gecko/20090420 Minefield/3.6a1pre (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2a1pre) Gecko/20090707 Minefield/3.6a1pre (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2a2pre) Gecko/20090826 Namoroka/3.6a2pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.3a1pre) Gecko/20090829 Minefield/3.7a1pre (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.3a1pre) Gecko/20091118 Minefield/3.7a1pre (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.3a3pre) Gecko/20100312 Minefield/3.7a3pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9a5pre) Gecko/20070428 Minefield/3.0a5pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9a6pre) Gecko/20070615 Minefield/3.0a6pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9a9pre) Gecko/2007092705 Minefield/3.0a9pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9b3) Gecko/2008020514 Firefox/3.0b3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:2.0a1pre) Gecko/2008032002 Minefield/4.0a1pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-gb) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en-us) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9 +Mozilla/5.0 (Windows; U; Windows NT 6.0; en; rv:1.9.1b4pre) Gecko/20090419 SeaMonkey/2.0b1pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; en_US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.7 +Mozilla/5.0 (Windows; U; Windows NT 6.0; es-AR; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; es-ES; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.13 +Mozilla/5.0 (Windows; U; Windows NT 6.0; es-ES; rv:1.8.1.14) Gecko/20080406 K-Meleon/1.1.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; es-ES; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; es-ES; rv:1.8.1.17pre) Gecko/20080716 K-Meleon/1.5.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; es-ES; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 GTB5 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; es-MX; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; es-es) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; fi) AppleWebKit/522.12.1 (KHTML, like Gecko) Version/3.0.1 Safari/522.12.2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; fi; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21 +Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR; rv:1.8.1.14) Gecko/20080406 K-Meleon/1.1.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-ch) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9 +Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 +Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.1.17) Gecko/20110123 SeaMonkey/2.0.12 +Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.1b1) Gecko/20081007 Firefox/3.1b1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.2.28) Gecko/20120306 Firefox/3.6.28 +Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.2.4) Gecko/20100523 Firefox/3.6.4 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9b3pre) Gecko/2008011205 Minefield/3.0b3pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9b5) Gecko/2008032620 Firefox/3.0b5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; he-IL) AppleWebKit/528+ (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; he-IL) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; hu-HU) AppleWebKit/525.26.2 (KHTML, like Gecko) Version/3.2 Safari/525.26.13 +Mozilla/5.0 (Windows; U; Windows NT 6.0; hu-HU) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; hu-HU) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 +Mozilla/5.0 (Windows; U; Windows NT 6.0; hu; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20 +Mozilla/5.0 (Windows; U; Windows NT 6.0; id; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; it-IT; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 +Mozilla/5.0 (Windows; U; Windows NT 6.0; it; rv:1.8.1.17) Gecko/20080922 Firefox/2.0.0.17 Flock/1.2.6 +Mozilla/5.0 (Windows; U; Windows NT 6.0; it; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 +Mozilla/5.0 (Windows; U; Windows NT 6.0; it; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 GTB7.1 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; it; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; it; rv:1.9.2.12) Gecko/20101114 IceCat/3.6.12 (like Firefox/3.6.12) +Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/528+ (KHTML, like Gecko, Safari/528.0) Lunascape/5.0.3.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/528+ (KHTML, like Gecko, Safari/528.0) Lunascape/5.1.1.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/528+ (KHTML, like Gecko, Safari/528.0) Lunascape/5.1.2.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.15) Gecko/20101029 Firefox/3.5.15 Lunascape/6.3.4.23051 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6 +Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.2.12) Gecko/20101029 Firefox/3.6.12 Lunascape/6.3.4.23051 ( .NET CLR 3.5.30729; .NET4.0C) +Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.3a5pre) Gecko/20100605 Minefield/3.7a5pre ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; ko; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; ko; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; nb-NO) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; nl) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 +Mozilla/5.0 (Windows; U; Windows NT 6.0; nl) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; nl; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; nl; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; nl; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 +Mozilla/5.0 (Windows; U; Windows NT 6.0; pl-PL) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21 +Mozilla/5.0 (Windows; U; Windows NT 6.0; pl-PL) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.8.1.14) Gecko/20080519 Firefox/2.0.0.14 Flock/1.2.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 +Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB7.1 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9b4) Gecko/2008030714 Firefox/3.0b4 +Mozilla/5.0 (Windows; U; Windows NT 6.0; pt-BR; rv:1.9.2.18) Gecko/20110614 Firefox/3.6.18 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; ru-RU) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 +Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12; MEGAUPLOAD 2.0 +Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 +Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1.5) Gecko/20091102 MRA 5.5 (build 02842) Firefox/3.5.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1b4pre) Gecko/20090419 SeaMonkey/2.0b1pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2) Gecko/20100115 Firefox/3.6 +Mozilla/5.0 (Windows; U; Windows NT 6.0; rv:1.9.1b4pre) Gecko/20090419 SeaMonkey/2.0b1pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; sr; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12 +Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE) AppleWebKit/523.13 (KHTML, like Gecko) Version/3.0 Safari/523.13 +Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15 +Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.9.0.18) Gecko/2010020220 Firefox/3.0.18 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 +Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 +Mozilla/5.0 (Windows; U; Windows NT 6.0; tr-TR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; tr; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 +Mozilla/5.0 (Windows; U; Windows NT 6.0; tr; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; x64; en-US; rv:1.9.1b2pre) Gecko/20081026 Firefox/3.1b2pre +Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.19 +Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 +Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 GTB7.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 +Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 +Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5 +Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; WOW64; cs; rv:1.9.2.6) Gecko/20100723 myibrow/4.0.0.0 (Firefox/3.6 compatible) +Mozilla/5.0 (Windows; U; Windows NT 6.1; WOW64; en-US; rv:2.0.4) Gecko/20120718 AskTbAVR-IDW/3.12.5.17700 Firefox/14.0.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; ar; rv:1.9.2) Gecko/20100115 Firefox/3.6 +Mozilla/5.0 (Windows; U; Windows NT 6.1; ar; rv:1.9.2.18) Gecko/20110614 Firefox/3.6.18 +Mozilla/5.0 (Windows; U; Windows NT 6.1; ca; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; cs-CZ) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Windows; U; Windows NT 6.1; cs; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; cs; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; cs; rv:1.9.2.6) Gecko/20100628 myibrow/4alpha2 +Mozilla/5.0 (Windows; U; Windows NT 6.1; cs; rv:1.9.2a2pre) Gecko/20090912 Namoroka/3.6a2pre (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; de-AT; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 +Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/525.28 (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 +Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.540.0 Safari/534.10 +Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10 +Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/10.0.649.0 Safari/534.17 +Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1) Gecko/20090624 Firefox/3.5 +Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 4.0.20506) +Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.11) Gecko/20100701 Firefox/3.5.11 ( .NET CLR 3.5.30729; .NET4.0C) +Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.16) Gecko/20101130 AskTbMYC/3.9.1.14019 Firefox/3.5.16 +Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.18) Gecko/20110320 SeaMonkey/2.0.13 +Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.19) Gecko/20110420 SeaMonkey/2.0.14 +Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.3) Gecko/20121221 Firefox/3.6.8 +Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.8) Gecko/20100722 Firefox 3.6.8 +Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.3a1pre) Gecko/20091013 Minefield/3.7a1pre +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-AU; rv:1.9.2.14) Gecko/20110218 Firefox/3.6.14 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-CA; rv:1.9.0.5) Gecko/2009012102 Firefox/3.0.5 Flock/2.0.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.428.0 Safari/534.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.0.16) Gecko/2010021003 Firefox/3.0.16 Flock/2.5.6 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.0.5) Gecko/2009012105 Firefox/3.0.5 Flock/2.0.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.17) Gecko/20110123 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070225 lolifox/0.32 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.17) Gecko/20110123 SeaMonkey/2.0.12 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 GTB5 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.3) Gecko/20100401 Firefox/3.6;MEGAUPLOAD 1.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 ( .NET CLR 3.5.30729; .NET4.0C) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.3.154.9 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.43 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.53 Safari/525.19 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/528.7 (KHTML, like Gecko) Iron/1.0.155.0 Safari/528.7 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/528.8 (KHTML, like Gecko) Chrome/1.0.156.0 Safari/528.8 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/528.8 (KHTML, like Gecko) Chrome/2.0.156.1 Safari/528.8 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/530.0 (KHTML, like Gecko) Chrome/2.0.182.0 Safari/531.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/530.4 (KHTML, like Gecko) Chrome/2.0.172.0 Safari/530.4 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.43 Safari/530.5 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/530.6 (KHTML, like Gecko) Chrome/2.0.174.0 Safari/530.6 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/530.9 (KHTML, like Gecko) Iron/2.0.178.0 Safari/530.9 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/531.0 (KHTML, like Gecko) Chrome/2.0.182.0 Safari/531.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/531.0 (KHTML, like Gecko) Chrome/2.0.182.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/531.0 (KHTML, like Gecko) Chrome/3.0.191.0 Safari/531.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/531.0 (KHTML, like Gecko) Iron/3.0.189.0 Safari/531.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/531.3 (KHTML, like Gecko) Chrome/3.0.193.2 Safari/531.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/531.4 (KHTML, like Gecko) Chrome/3.0.194.0 Safari/531.4 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532+ (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.1 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.10 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.21 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.27 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.3 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.4 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.6 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.196.2 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.197.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.197.11 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.201.1 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.2 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.204.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.1 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.208.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.4 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.212.0 Safari/532.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.1 Safari/532.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.12 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.3 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.1 Safari/532.2 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.3 (KHTML, like Gecko) Chrome/4.0.223.5 Safari/532.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.3 (KHTML, like Gecko) Chrome/4.0.227.0 Safari/532.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.3 (KHTML, like Gecko) Iron/4.0.227.0 Chrome/4.0.227.0 Safari/532.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.4 (KHTML, like Gecko) Maxthon/3.0.6.27 Safari/532.4 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.246.0 Safari/532.5 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.1.249.1025 Safari/532.5 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Chrome/4.0.275.2 Safari/532.8 Iron/4.0.275.2 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Chrome/4.0.280.0 Safari/532.8 Iron/4.0.280.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Iron/4.0.275.2 Chrome/4.0.275.2 Safari/532.8 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.307.1 Safari/532.9 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Iron/4.0.280.0 Chrome/4.0.275.0 Safari/532.9 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Iron/4.0.280.0 Chrome/4.0.280.0 Safari/532.9 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533+ (KHTML, like Gecko) Element Browser 5.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.1 (KHTML, like Gecko) Chrome/5.0.336.0 Safari/533.1 ChromePlus/1.3.8.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.1 (KHTML, like Gecko) Iron/5.0.326.0 Chrome/5.0.326.0 Safari/533.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0 Safari/533.16 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.3 Safari/533.2 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/6.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.354.0 Safari/533.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Lunascape/6.4.2.23236 Safari/533.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.370.0 Safari/533.4 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.999 Safari/533.4 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.9 (KHTML, like Gecko) Chrome/6.0.400.0 Safari/533.9 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.428.0 Safari/534.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.540.0 Safari/534.10 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10 ChromePlus/1.5.1.0alpha3 ChromePlus/1.5.1.0alpha3 ChromePlus/1.5.1.0alpha3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10 ChromePlus/1.5.1.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.216 Safari/534.10 ChromePlus/1.5.1.0alpha1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10 ChromePlus/1.5.2.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10 ChromePlus/1.5.2.0alpha1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) RockMelt/0.8.40.147 Chrome/8.0.552.231 Safari/534.10 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.596.0 Safari/534.13 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.19 Safari/534.13 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.98 Safari/534.13 ChromePlus/1.6.0.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) RockMelt/0.9.48.51 Chrome/9.0.597.107 Safari/534.13 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.638.0 Safari/534.16 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.11 Safari/534.16 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.134 Safari/534.16 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Iron/10.0.650.0 Chrome/10.0.650.0 Safari/534.16 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) RockMelt/0.9.50.459 Chrome/10.0.648.204 Safari/534.16 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) RockMelt/0.9.50.518 Chrome/10.0.648.205 Safari/534.16 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) RockMelt/0.9.50.549 Chrome/10.0.648.205 Safari/534.16 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/10.0.649.0 Safari/534.17 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/11.0.654.0 Safari/534.17 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/11.0.655.0 Safari/534.17 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.2 (KHTML, like Gecko) Chrome/6.0.454.0 Safari/534.2 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.669.0 Safari/534.20 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.458.1 Safari/534.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.459.0 Safari/534.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.460.0 Safari/534.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.461.0 Safari/534.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.464.0 Safari/534.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475 Chrome/6.0.475.0 Safari/112818688.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475 Chrome/6.0.475.0 Safari/42050816.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475 Chrome/6.0.475.0 Safari/53013696.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475 Chrome/6.0.475.0 Safari/66529120.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475 Chrome/6.0.475.0 Safari/92861792.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/58473792.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/61170080.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/61389024.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/6316928.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/65209600.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/65969728.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/67162016.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/6838624.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/69296032.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/73530880.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/76829344.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/83554272.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/89895776.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/94403424.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/95066112.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/9724672.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/97486176.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/98035072.534 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.6 (KHTML, like Gecko) Chrome/7.0.498.0 Safari/534.6 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.41 Safari/534.7 ChromePlus/1.4.3.0alpha3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Flock/3.5.2.4599 Chrome/7.0.517.442 Safari/534.7 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Iron/7.0.520.0 Chrome/7.0.520.0 Safari/534.7 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Iron/7.0.520.1 Chrome/7.0.520.1 Safari/534.7 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) RockMelt/0.8.36.116 Chrome/7.0.517.44 Safari/534.7 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) RockMelt/0.8.36.128 Chrome/7.0.517.44 Safari/534.7 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.5a) Gecko/20030728 Mozilla Firebird/0.6.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.0.7) Gecko/20060910 SeaMonkey/1.0.5 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.19) Gecko/20081217 K-Meleon/1.5.2 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 GTB5 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.21) Gecko/20090331 K-Meleon/1.5.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.24) Gecko/20100228 Sylera/3.0.20 SeaMonkey/1.1.19 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12 (.NET CLR 3.5.30729) FirePHP/0.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.0.14) Gecko/2009082707 Firefox/3.0.14 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.0.9) Gecko/2009042410 Firefox/3.0.9 Wyzo/3.0.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1) Gecko/20090612 Firefox/3.5 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1) Gecko/20090612 Firefox/3.5 (.NET CLR 4.0.20506) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.1b3;MEGAUPLOAD 1.0 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1) Gecko/20090701 Firefox/3.5 Lunascape/5.1.1.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.1) Gecko/20090718 Firefox/3.5.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.1) Gecko/20090722 Firefox/3.5.1 Orca/1.2 build 2 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.14) Gecko/20100930 SeaMonkey/2.0.9 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 FirePHP/0.4 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.18) Gecko/20110320 SeaMonkey/2.0.13 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4 (.NET CLR 3.5.30729) FBSMTWB +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 MRA 5.5 (build 02842) Firefox/3.5.5 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20100121 Firefox/3.5.6 Wyzo/3.5.6.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.7pre) Gecko K-Meleon/1.5.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.8) Gecko/20100223 Firefox/3.5.8 Lunascape/6.1.0.20940 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.9) Gecko/20100317 Lightning/1.0b1 SeaMonkey/2.0.4 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1b3pre) Gecko/20081208 SeaMonkey/2.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1b3pre) Gecko/20081208 SeaMonkey/2.0a3pre +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1b4pre) Gecko/20090420 Shiretoko/3.5b4pre (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.11) Gecko/20101023 Firefox/3.6.11 (Palemoon/3.6.11) ( .NET CLR 3.5.30729; .NET4.0E) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101211 Firefox/3.6.13 (Palemoon/3.6.13) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101211 Firefox/3.6.13 (Palemoon/3.6.13) GTB7.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101213 Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15 ( .NET CLR 3.5.30729; .NET4.0C) FirePHP/0.5 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.17) Gecko/20110420 Firefox/3.6 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.2) Gecko/20100316 AskTbSPC2/3.9.1.14019 Firefox/3.6.2 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.2) Gecko/20100324 Firefox/3.6.2 (Palemoon/3.6.2) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.28) Gecko/20120410 Firefox/3.6.28 Lunascape/6.7.1.25446 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.5.3;MEGAUPLOAD 1.0 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100403 Firefox/3.6.3 (Palemoon/3.6.3) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.30) Gecko/20120217 Firefox/3.6.30 (Palemoon/3.6.30) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.32) Gecko/20120529 Firefox/3.6.32 (Palemoon/3.6.32) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3pre) Gecko/20100403 Lorentz/3.6.3plugin2pre (.NET CLR 4.0.20506) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3pre) Gecko/20100405 Firefox/3.6.3plugin1 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100806 Firefox/3.6 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2a1) Gecko/20090806 Namoroka/3.6a1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2a1) Gecko/20090806 Namoroka/3.6a1 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2a1pre) Gecko/20090316 Minefield/3.2a1pre +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2a2pre) Gecko/20090917 Namoroka/3.6a2pre +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2a2pre) Gecko/20090918 Namoroka/3.6a2pre +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2b1) Gecko/20091014 Firefox/3.6b1 GTB5 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2b5) Gecko/20091204 Firefox/3.6b5 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.3a1pre) Gecko/20090829 Minefield/3.7a1pre +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.3a3pre) Gecko/20100305 Minefield/3.7a3pre +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.3a3pre) Gecko/20100306 Firefox3.6 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.3a3pre) Gecko/20100306 Minefield/3.7a3pre (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.3a3pre) Gecko/20100313 Minefield/3.7a3pre (.NET CLR 4.0.20506) +Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:2.0b10) Gecko/20110126 Firefox/4.0b10 +Mozilla/5.0 (Windows; U; Windows NT 6.1; en; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 +Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0 Safari/533.16 +Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15 +Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.0 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; et; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 +Mozilla/5.0 (Windows; U; Windows NT 6.1; fr-FR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 +Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 +Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 GTB7.0 +Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.6pre) Gecko/20100604 Namoroka/3.6.6pre +Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.8) Gecko/20100722 Firefox 3.6.8 GTB7.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; he; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 +Mozilla/5.0 (Windows; U; Windows NT 6.1; hu; rv:1.9.1.18) Gecko/20110320 SeaMonkey/2.0.13 +Mozilla/5.0 (Windows; U; Windows NT 6.1; hu; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; hu; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; hu; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.7 GTB7.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; it-IT) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.25 Safari/532.5 +Mozilla/5.0 (Windows; U; Windows NT 6.1; it; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 +Mozilla/5.0 (Windows; U; Windows NT 6.1; it; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; it; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; it; rv:1.9.2.8) Gecko/20100722 AskTbADAP/3.9.1.14019 Firefox/3.6.8 +Mozilla/5.0 (Windows; U; Windows NT 6.1; it; rv:2.0b4) Gecko/20100818 +Mozilla/5.0 (Windows; U; Windows NT 6.1; ja-JP) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 +Mozilla/5.0 (Windows; U; Windows NT 6.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 +Mozilla/5.0 (Windows; U; Windows NT 6.1; ja-JP; rv:1.9.2.3) Gecko/20100403 Firefox/3.6.3 (Palemoon/3.6.3) +Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.1.15) Gecko/20101029 Firefox/3.5.15 Lunascape/6.3.4.23051 ( .NET CLR 3.5.30729; .NET4.0C) +Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 GTB7.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; ko-KR) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 +Mozilla/5.0 (Windows; U; Windows NT 6.1; ko-KR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Windows; U; Windows NT 6.1; lt; rv:1.9.2) Gecko/20100115 Firefox/3.6 +Mozilla/5.0 (Windows; U; Windows NT 6.1; nl; rv:1.9.0.9) Gecko/2009040821 Firefox/3.0.9 FirePHP/0.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; nl; rv:1.9.1.18) Gecko/20110320 SeaMonkey/2.0.13 +Mozilla/5.0 (Windows; U; Windows NT 6.1; nl; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 GTB5 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; pt-BR; rv:1.9.1b3pre) Gecko/20090103 Shiretoko/3.1b3pre +Mozilla/5.0 (Windows; U; Windows NT 6.1; pt-BR; rv:1.9.2.18) Gecko/20110614 Firefox/3.6.18 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; pt-BR; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 GTB7.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; pt-PT; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 +Mozilla/5.0 (Windows; U; Windows NT 6.1; ro; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 +Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.11 Safari/534.16 +Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU; AppleWebKit/534.16; KHTML; like Gecko; Chrome/10.0.648.11;Safari/534.16) +Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU; rv:1.9.2) Gecko/20100105 MRA 5.6 (build 03278) Firefox/3.6 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.1.10) Gecko/20100504 Lightning/1.0b1 SeaMonkey/2.0.5 +Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 +Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2b5) Gecko/20091204 Firefox/3.6b5 +Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.3a4pre) Gecko/20100402 Minefield/3.7a4pre +Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:1.9.2.9) Gecko/20100913 Firefox/3.6.9 +Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:2.2) Gecko/20110201 +Mozilla/5.0 (Windows; U; Windows NT 6.1; sl; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 +Mozilla/5.0 (Windows; U; Windows NT 6.1; sv-SE) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 +Mozilla/5.0 (Windows; U; Windows NT 6.1; tr-TR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 +Mozilla/5.0 (Windows; U; Windows NT 6.1; tr; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 GTB7.1 +Mozilla/5.0 (Windows; U; Windows NT 6.1; uk; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 +Mozilla/5.0 (Windows; U; Windows NT 6.1; x64; fr; rv:1.9.1.1) Gecko/20090722 Firefox/3.5.1 Orca/1.2 build 2 +Mozilla/5.0 (Windows; U; Windows NT 6.1; x64; fr; rv:1.9.2.13) Gecko/20101203 Firebird/3.6.13 +Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN) AppleWebKit/533+ (KHTML, like Gecko) +Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 +Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729; .NET4.0E) +Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.13) Gecko/20101210 Namoroka/3.6.13 Firefox/3.6.12 +Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.14) Gecko/20110218 Firefox/3.6.14 +Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 +Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-HK) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 +Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-TW) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 +Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-TW; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 ( .NET CLR 3.5.30729) +Mozilla/5.0 (Windows; U; Windows NT 9.0; en-US; rv:1.9.1.11) Gecko/20100701 SeaMonkey/2.0.6 +Mozilla/5.0 (Windows; U; Windows NT5.1; en; rv:1.7.10) Gecko/20050716 Firefox/1.0.5 +Mozilla/5.0 (Windows; U; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.1.2 Safari/525.21 +Mozilla/5.0 (Windows; U;) AppleWebKit/532.0 (KHTML, like Gecko) Iron +Mozilla/5.0 (Windows; U;) AppleWebKit/532.0 (KHTML, like Gecko) Iron/3.0.197.0 Safari/532.0 +Mozilla/5.0 (Windows; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 +Mozilla/5.0 (Windows; Windows NT 5.1; en-US; rv:1.9.2a1pre) Gecko/20090402 Firefox/3.6a1pre +Mozilla/5.0 (Windows; Windows NT 5.1; es-ES; rv:1.9.2a1pre) Gecko/20090402 Firefox/3.6a1pre +Mozilla/5.0 (Windows; Windows NT 5.2; rv:2.0b3pre) Gecko/20100803 SeaMonkey/2.1a3pre +Mozilla/5.0 (Windows; Windows NT 6.1; rv:2.0b2pre) Gecko/20100720 SeaMonkey/2.1a3pre +Mozilla/5.0 (X11) KHTML/4.9.1 (like Gecko) Konqueror/4.9 +Mozilla/5.0 (X11; ; Linux i686; en-US; rv:1.8.1.3) Gecko +Mozilla/5.0 (X11; ; Linux i686; rv:1.9.2.20) Gecko/20110805 +Mozilla/5.0 (X11; ; Linux x86_64; rv:1.8.1.6) Gecko/20070802 Firefox +Mozilla/5.0 (X11; Arch Linux i686; rv:2.0) Gecko/20110321 Firefox/4.0 +Mozilla/5.0 (X11; CrOS i686 0.13.507) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/13.0.763.0 Safari/534.35 +Mozilla/5.0 (X11; CrOS i686 0.13.587) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.14 Safari/535.1 +Mozilla/5.0 (X11; CrOS i686 1193.158.0) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7 +Mozilla/5.0 (X11; CrOS i686 12.0.742.91) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.93 Safari/534.30 +Mozilla/5.0 (X11; CrOS i686 12.433.109) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.93 Safari/534.30 +Mozilla/5.0 (X11; CrOS i686 12.433.216) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.105 Safari/534.30 +Mozilla/5.0 (X11; CrOS i686 13.587.48) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.43 Safari/535.1 +Mozilla/5.0 (X11; CrOS i686 1660.57.0) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.46 Safari/535.19 +Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11 +Mozilla/5.0 (X11; FreeBSD amd64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.65 Safari/535.11 +Mozilla/5.0 (X11; FreeBSD amd64; rv:5.0) Gecko/20100101 Firefox/5.0 +Mozilla/5.0 (X11; FreeBSD amd64; rv:6.0) Gecko/20110818 Firefox/6.0 SeaMonkey/2.3 +Mozilla/5.0 (X11; FreeBSD i386) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2 +Mozilla/5.0 (X11; FreeBSD i686) Firefox/3.6 +Mozilla/5.0 (X11; FreeBSD x86_64; rv:2.0) Gecko/20100101 Firefox/3.6.12 +Mozilla/5.0 (X11; Gentoo Linux x86_64; rv:11.0a2) Gecko/20111230 Firefox/11.0a2 Iceweasel/11.0a2 +Mozilla/5.0 (X11; Linux 3.5.4-1-ARCH i686; es) KHTML/4.9.1 (like Gecko) Konqueror/4.9 +Mozilla/5.0 (X11; Linux AMD64) Gecko Firefox/5.0 +Mozilla/5.0 (X11; Linux Debian i686; rv:8.0) Gecko/20100101 Firefox/8.0 Iceweasel/8.0 +Mozilla/5.0 (X11; Linux amd64) AppleWebKit/534.36 (KHTML, like Gecko) Chrome/13.0.766.0 Safari/534.36 +Mozilla/5.0 (X11; Linux amd64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1 +Mozilla/5.0 (X11; Linux armv6l; rv:10.0.5) Gecko/20100101 Firefox/10.0.5 Iceweasel/10.0.5 +Mozilla/5.0 (X11; Linux armv6l; rv:10.0.6) Gecko/20100101 Firefox/10.0.6 Iceweasel/10.0.6 +Mozilla/5.0 (X11; Linux i386; U) Opera 7.60 [en-GB] +Mozilla/5.0 (X11; Linux i686 on x86_64; rv:10.0.6) Gecko/20100101 Firefox/10.0.6 Iceweasel/10.0.6 +Mozilla/5.0 (X11; Linux i686 on x86_64; rv:5.0) Gecko/20100101 Firefox/3.6.17 Firefox/3.6.17 +Mozilla/5.0 (X11; Linux i686 on x86_64; rv:5.0a2) Gecko/20110524 Firefox/5.0a2 +Mozilla/5.0 (X11; Linux i686 on x86_64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2 Iceweasel/6.0.2 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.23 (KHTML, like Gecko) Chrome/11.0.686.3 Safari/534.23 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.14 Safari/534.24 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.2 Chrome/11.0.700.2 Safari/534.24 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Ubuntu/10.10 Chromium/12.0.702.0 Chrome/12.0.702.0 Safari/534.24 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.91 Chromium/12.0.742.91 Safari/534.30 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Iron/12.0.750.0 Chrome/12.0.750.0 Safari/534.30 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Slackware/Chrome/12.0.742.100 Safari/534.30 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Ubuntu/10.04 Chromium/12.0.742.112 Chrome/12.0.742.112 Safari/534.30 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Ubuntu/10.10 Chromium/12.0.742.112 Chrome/12.0.742.112 Safari/534.30 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Ubuntu/11.04 Chromium/12.0.742.112 Chrome/12.0.742.112 Safari/534.30 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.33 (KHTML, like Gecko) Ubuntu/9.10 Chromium/13.0.752.0 Chrome/13.0.752.0 Safari/534.33 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.35 (KHTML, like Gecko) Ubuntu/10.10 Chromium/13.0.764.0 Chrome/13.0.764.0 Safari/534.35 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.803.0 Safari/535.1 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Iron/13.0.800.0 Chrome/13.0.800.0 Safari/535.1 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/10.04 Chromium/14.0.804.0 Chrome/14.0.804.0 Safari/535.1 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/10.04 Chromium/14.0.808.0 Chrome/14.0.808.0 Safari/535.1 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/10.04 Chromium/14.0.813.0 Chrome/14.0.813.0 Safari/535.1 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/11.04 Chromium/14.0.803.0 Chrome/14.0.803.0 Safari/535.1 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/11.04 Chromium/14.0.814.0 Chrome/14.0.814.0 Safari/535.1 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/11.04 Chromium/14.0.825.0 Chrome/14.0.825.0 Safari/535.1 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.65 Safari/535.11 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.11 (KHTML, like Gecko) Iron/17.0.1000.0 Chrome/17.0.1000.0 Safari/535.11 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.10 Chromium/17.0.963.65 Chrome/17.0.963.65 Safari/535.11 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (KHTML, like Gecko) Ubuntu/11.10 Chromium/15.0.874.120 Chrome/15.0.874.120 Safari/535.2 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1041.0 Safari/535.21 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1150.1 Iron/20.0.1150.1 Safari/536.11 +Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1200.0 Iron/21.0.1200.0 Safari/537.1 +Mozilla/5.0 (X11; Linux i686; Debian Testing; rv:7.0.1) Gecko/20100101 Firefox/7.0.1 Iceweasel/7.0.1 +Mozilla/5.0 (X11; Linux i686; U) Opera 7.54 [en] +Mozilla/5.0 (X11; Linux i686; U; en) Opera 8.52 +Mozilla/5.0 (X11; Linux i686; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 +Mozilla/5.0 (X11; Linux i686; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Opera 9.23 +Mozilla/5.0 (X11; Linux i686; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51 +Mozilla/5.0 (X11; Linux i686; U; pl; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 +Mozilla/5.0 (X11; Linux i686; U; rv:1.7) Gecko/0 Kazehakase/0.4.3 +Mozilla/5.0 (X11; Linux i686; U;) AppleWebKit/146.1 (KHTML, like Gecko) Kazehakase0.4.5 +Mozilla/5.0 (X11; Linux i686; U;) Gecko/0 Kazehakase/0.3.1 +Mozilla/5.0 (X11; Linux i686; U;) Gecko/0 Kazehakase/0.3.5 +Mozilla/5.0 (X11; Linux i686; U;) Gecko/0 Kazehakase/0.3.8 +Mozilla/5.0 (X11; Linux i686; U;) Gecko/0 Kazehakase/0.3.9 +Mozilla/5.0 (X11; Linux i686; U;) Gecko/0 Kazehakase/0.4.3 +Mozilla/5.0 (X11; Linux i686; U;) Gecko/0 Kazehakase/0.4.3 Debian/0.4.3-1ubuntu1 +Mozilla/5.0 (X11; Linux i686; U;) Gecko/20050923 Kazehakase/0.2.8 Debian/0.2.8-1ubuntu2 +Mozilla/5.0 (X11; Linux i686; U;) Gecko/20050923 Kazehakase/0.3.9 +Mozilla/5.0 (X11; Linux i686; U;) Gecko/20051128 Kazehakase/0.3.3 Debian/0.3.3-1 +Mozilla/5.0 (X11; Linux i686; U;) Gecko/20060216 Kazehakase/0.4.2 +Mozilla/5.0 (X11; Linux i686; U;) Gecko/20060717 Kazehakase/0.3.8 Debian/0.3.8-2 +Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070224 Kazehakase/0.3.9 +Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070304 Kazehakase/0.4.6 +Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5 +Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.7 +Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070610 Kazehakase/0.4.7 +Mozilla/5.0 (X11; Linux i686; rv: 5.0) Gecko/20100101 Firefox/5.0 Iceweasel/5.0 +Mozilla/5.0 (X11; Linux i686; rv:1.7.5) Gecko/20041108 Firefox/1.0 +Mozilla/5.0 (X11; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0 Iceweasel/10.0 +Mozilla/5.0 (X11; Linux i686; rv:10.0.6) Gecko/20100101 Firefox/10.0.6 Iceweasel/10.0.6 +Mozilla/5.0 (X11; Linux i686; rv:10.0.7) Gecko/20100101 Firefox/10.0.7 Iceweasel/10.0.7 +Mozilla/5.0 (X11; Linux i686; rv:10.0.7) Gecko/20100101 Iceweasel/10.0.7 +Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20100101 Firefox/13.0.1 Iceweasel/13.0.1 +Mozilla/5.0 (X11; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0 Iceweasel/14.0 +Mozilla/5.0 (X11; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1 Iceweasel/14.0.1 +Mozilla/5.0 (X11; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0 Iceweasel/15.0 +Mozilla/5.0 (X11; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1 Iceweasel/15.0.1 +Mozilla/5.0 (X11; Linux i686; rv:2.0) Gecko/20100101 Firefox/3.6 +Mozilla/5.0 (X11; Linux i686; rv:2.0) Gecko/20110322 Firefox/4.0 Iceweasel/4.0 +Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20110518 Firefox/4.0.1 +Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20110608 Firefox/4.0.1 SeaMonkey/2.1 +Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20110608 Firefox/4.0.1 SeaMonkey/2.1 Lightning/1.0b4pre +Mozilla/5.0 (X11; Linux i686; rv:2.0b10) Gecko/20100101 Firefox/4.0b10 +Mozilla/5.0 (X11; Linux i686; rv:2.0b12pre) Gecko/20100101 Firefox/4.0b12pre +Mozilla/5.0 (X11; Linux i686; rv:2.0b12pre) Gecko/20110204 Firefox/4.0b12pre +Mozilla/5.0 (X11; Linux i686; rv:2.0b12pre) Gecko/20110204 SeaMonkey/2.1b3pre +Mozilla/5.0 (X11; Linux i686; rv:2.0b13pre) Gecko/20110316 SeaMonkey/2.1b3pre +Mozilla/5.0 (X11; Linux i686; rv:2.0b13pre) Gecko/20110321 SeaMonkey/2.1b3pre +Mozilla/5.0 (X11; Linux i686; rv:2.0b3pre) Gecko/20100731 Firefox/4.0b3pre +Mozilla/5.0 (X11; Linux i686; rv:2.0b7pre) Gecko/20101008 Firefox/4.0b7pre SeaMonkey/2.1b1 +Mozilla/5.0 (X11; Linux i686; rv:2.0b8) Gecko/20101227 IceCat/4.0b8 +Mozilla/5.0 (X11; Linux i686; rv:2.0b9pre) Gecko/20101230 SeaMonkey/2.1b2pre +Mozilla/5.0 (X11; Linux i686; rv:2.0b9pre) Gecko/20101231 SeaMonkey/2.1b2pre +Mozilla/5.0 (X11; Linux i686; rv:2.0b9pre) Gecko/20110101 SeaMonkey/2.1b2pre +Mozilla/5.0 (X11; Linux i686; rv:2.2a1pre) Gecko/20110324 SeaMonkey/2.1b3pre +Mozilla/5.0 (X11; Linux i686; rv:2.2a1pre) Gecko/20110327 SeaMonkey/2.2a1pre +Mozilla/5.0 (X11; Linux i686; rv:2.2a1pre) Gecko/20110407 SeaMonkey/2.2a1pre +Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0 Iceweasel/5.0 +Mozilla/5.0 (X11; Linux i686; rv:6.0) Gecko/20100101 Firefox/6.0 +Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20111106 IceCat/7.0.1 +Mozilla/5.0 (X11; Linux i686; rv:7.0a1) Gecko/20110526 SeaMonkey/2.2a1pre +Mozilla/5.0 (X11; Linux i686; rv:7.0a1) Gecko/20110530 SeaMonkey/2.2a1pre +Mozilla/5.0 (X11; Linux i686; rv:7.0a1) Gecko/20110603 SeaMonkey/2.2a1pre +Mozilla/5.0 (X11; Linux i686; rv:7.0a1) Gecko/20110604 SeaMonkey/2.2a1pre +Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0 Iceweasel/8.0 +Mozilla/5.0 (X11; Linux i686; rv:9.0.1) Gecko/20100101 Firefox/9.0.1 Iceweasel/9.0.1 +Mozilla/5.0 (X11; Linux i686; rv:9.0a2) Gecko/20111104 Firefox/9.0a2 Iceweasel/9.0a2 +Mozilla/5.0 (X11; Linux ppc; rv:10.0.7) Gecko/20100101 Firefox/10.0.7 Iceweasel/10.0.7 +Mozilla/5.0 (X11; Linux ppc; rv:5.0) Gecko/20100101 Firefox/5.0 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.3 Safari/534.24 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Iron/11.0.700.2 Chrome/11.0.700.2 Safari/534.24 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Ubuntu/10.04 Chromium/11.0.696.0 Chrome/11.0.696.0 Safari/534.24 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Ubuntu/10.10 Chromium/12.0.703.0 Chrome/12.0.703.0 Safari/534.24 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Iron/12.0.750.0 Chrome/12.0.750.0 Safari/534.30 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Ubuntu/10.04 Chromium/12.0.742.112 Chrome/12.0.742.112 Safari/534.30 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Ubuntu/10.10 Chromium/12.0.742.112 Chrome/12.0.742.112 Safari/534.30 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Ubuntu/11.04 Chromium/12.0.742.112 Chrome/12.0.742.112 Safari/534.30 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) Arora/0.10.2 Safari/534.34 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.36 (KHTML, like Gecko) Chrome/13.0.766.0 Safari/534.36 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.20 Safari/535.1 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.803.0 Safari/535.1 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.824.0 Safari/535.1 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/10.10 Chromium/14.0.808.0 Chrome/14.0.808.0 Safari/535.1 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/11.04 Chromium/13.0.782.41 Chrome/13.0.782.41 Safari/535.1 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Iron/17.0.1000.0 Chrome/17.0.1000.0 Safari/535.11 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/10.10 Chromium/17.0.963.65 Chrome/17.0.963.65 Safari/535.11 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.04 Chromium/17.0.963.56 Chrome/17.0.963.56 Safari/535.11 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.04 Chromium/17.0.963.65 Chrome/17.0.963.65 Safari/535.11 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.10 Chromium/17.0.963.65 Chrome/17.0.963.65 Safari/535.11 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/11.10 Chromium/18.0.1025.142 Chrome/18.0.1025.142 Safari/535.19 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Ubuntu/11.04 Chromium/15.0.871.0 Chrome/15.0.871.0 Safari/535.2 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.7 (KHTML, like Gecko) Iron/16.0.950.0 Chrome/16.0.950.0 Safari/535.7 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1150.1 Iron/20.0.1150.1 Safari/536.11 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Iron/19.0.1100.0 Chrome/19.0.1100.0 Safari/536.5 +Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1200.0 Iron/21.0.1200.0 Safari/537.1 +Mozilla/5.0 (X11; Linux x86_64) Gecko Firefox/5.0 +Mozilla/5.0 (X11; Linux x86_64; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.62 +Mozilla/5.0 (X11; Linux x86_64; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 +Mozilla/5.0 (X11; Linux x86_64; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.60 +Mozilla/5.0 (X11; Linux x86_64; U;) Gecko/20070610 Kazehakase/0.4.7 +Mozilla/5.0 (X11; Linux x86_64; en-US; rv:2.0b2pre) Gecko/20100712 Minefield/4.0b2pre +Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0 Iceweasel/10.0 +Mozilla/5.0 (X11; Linux x86_64; rv:10.0.6) Gecko/20100101 Firefox/10.0.6 Iceweasel/10.0.6 +Mozilla/5.0 (X11; Linux x86_64; rv:10.0.7) Gecko/20100101 Firefox/10.0.7 Iceweasel/10.0.7 +Mozilla/5.0 (X11; Linux x86_64; rv:10.0a2) Gecko/20111118 Firefox/10.0a2 Iceweasel/10.0a2 +Mozilla/5.0 (X11; Linux x86_64; rv:11.0a2) Gecko/20111230 Firefox/11.0a2 Iceweasel/11.0a2 +Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Debian Iceweasel/14.0 +Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20120721 Debian Iceweasel/15.0 +Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0 Iceweasel/13.0 +Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0.1 Iceweasel/13.0.1 +Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0 Iceweasel/14.0 +Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1 Iceweasel/14.0.1 +Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0 Iceweasel/15.0 +Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1 Iceweasel/15.0.1 +Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120724 Debian Iceweasel/15.0 +Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20110506 Firefox/4.0.1 +Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20110609 Firefox/4.0.1 SeaMonkey/2.1 +Mozilla/5.0 (X11; Linux x86_64; rv:2.0b4) Gecko/20100818 Firefox/4.0b4 +Mozilla/5.0 (X11; Linux x86_64; rv:2.0b9pre) Gecko/20110111 Firefox/4.0b9pre +Mozilla/5.0 (X11; Linux x86_64; rv:2.2a1pre) Gecko/20100101 Firefox/4.2a1pre +Mozilla/5.0 (X11; Linux x86_64; rv:2.2a1pre) Gecko/20110324 Firefox/4.2a1pre +Mozilla/5.0 (X11; Linux x86_64; rv:5.0) Gecko/20100101 Firefox/5.0 FirePHP/0.5 +Mozilla/5.0 (X11; Linux x86_64; rv:5.0) Gecko/20100101 Firefox/5.0 Firefox/5.0 +Mozilla/5.0 (X11; Linux x86_64; rv:5.0) Gecko/20100101 Firefox/5.0 Iceweasel/5.0 +Mozilla/5.0 (X11; Linux x86_64; rv:6.0.1) Gecko/20110831 conkeror/0.9.3 +Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1 Iceweasel/7.0.1 Debian +Mozilla/5.0 (X11; Linux x86_64; rv:7.0a1) Gecko/20110602 Firefox/7.0a1 SeaMonkey/2.2a1pre Lightning/1.1a1pre +Mozilla/5.0 (X11; Linux x86_64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1 Iceweasel/9.0.1 +Mozilla/5.0 (X11; Linux) Gecko Firefox/5.0 +Mozilla/5.0 (X11; Linux) KHTML/4.9.1 (like Gecko) Konqueror/4.9 +Mozilla/5.0 (X11; Linux; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Midori/0.4 +Mozilla/5.0 (X11; U; AIX 0048013C4C00; en-US; rv:1.0.1) Gecko/20021009 Netscape/7.0 +Mozilla/5.0 (X11; U; AIX 005A471A4C00; en-US; rv:1.0rc2) Gecko/20020514 +Mozilla/5.0 (X11; U; AIX 5.3; en-US; rv:1.7.12) Gecko/20051025 +Mozilla/5.0 (X11; U; CrOS i686 0.9.128; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.339 +Mozilla/5.0 (X11; U; CrOS i686 0.9.128; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.339 Safari/534.10 +Mozilla/5.0 (X11; U; CrOS i686 0.9.128; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.341 Safari/534.10 +Mozilla/5.0 (X11; U; CrOS i686 0.9.128; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.343 Safari/534.10 +Mozilla/5.0 (X11; U; CrOS i686 0.9.130; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.344 Safari/534.10 +Mozilla/5.0 (X11; U; Darwin i386; en-US; rv:1.9.0.8) Gecko/2009040414 GranParadiso/3.0.8 +Mozilla/5.0 (X11; U; Darwin i386; en-US; rv:1.9.1.4) Gecko/20100311 Shiretoko/3.5.5 +Mozilla/5.0 (X11; U; DragonFly i386; de; rv:1.9.1) Gecko/20090720 Firefox/3.5.1 +Mozilla/5.0 (X11; U; DragonFly i386; de; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 +Mozilla/5.0 (X11; U; Fedora 12 i686; nb-NO; rv:1.9.1.8) Gecko/20100205 SeaMonkey/2.0.3 +Mozilla/5.0 (X11; U; Fedora i686; en-US; rv:1.9.1.19) Gecko/20110429 Fedora/2.0.14-1.fc14 SeaMonkey/2.0.14 +Mozilla/5.0 (X11; U; FreeBSD amd64; en-US; rv:1.8.0.8) Gecko/20061116 Firefox/1.5.0.8 +Mozilla/5.0 (X11; U; FreeBSD amd64; en-US; rv:1.8.1.21) Gecko/20090424 SeaMonkey/1.1.16 +Mozilla/5.0 (X11; U; FreeBSD amd64; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Safari/531.2+ Epiphany/2.30.0 +Mozilla/5.0 (X11; U; FreeBSD i386; de-CH; rv:1.9.2.8) Gecko/20100729 Firefox/3.6.8 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.207.0 Safari/532.0 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.1) Gecko/20021223 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.6) Gecko/20040406 Galeon/1.3.15 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.12) Gecko/20051105 Firefox/1.0.8 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.12) Gecko/20051105 Galeon/1.3.21 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.13) Gecko/20061230 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.5) Gecko/20041114 Firefox/1.0 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.7) Gecko/20050420 Firefox/1.0.3 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.7) Gecko/20060303 Firefox/1.0.3 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7b) Gecko/20040429 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.0.2) Gecko/20060414 Firefox/1.5.0.2 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.0.8) Gecko/20061210 Firefox/1.5.0.8 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.1) Gecko/20070322 Epiphany/2.18 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.1.16) Gecko/20080816 Firefox/2.0.0.16 Kazehakase/0.5.4 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.1.2) Gecko/20070303 SeaMonkey/1.1.1 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.1.20) Gecko/20090225 Firefox/2.0.0.20 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.1.20) Gecko/20090413 Firefox/2.0.0.20 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.10 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.9.0.10) Gecko/20090624 Firefox/3.5 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.9.1) Gecko/20090703 Firefox/3.5 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.9.1.16) Gecko/20110227 SeaMonkey/2.0.11 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.9.2.9) Gecko/20100913 Firefox/3.6.9 +Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.9a2) Gecko/20080530 Firefox/3.0a2 +Mozilla/5.0 (X11; U; FreeBSD i386; en; rv:1.8.1.12) Gecko/20080213 Epiphany/2.20 Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; FreeBSD i386; ja-JP; rv:1.7.2) Gecko/20050330 +Mozilla/5.0 (X11; U; FreeBSD i386; ja-JP; rv:1.9.1.8) Gecko/20100305 Firefox/3.5.8 +Mozilla/5.0 (X11; U; FreeBSD i386; pl; rv:1.8.1.12) Gecko/20080213 Epiphany/2.20 Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; FreeBSD i386; ru-RU; rv:1.9.1.3) Gecko/20090913 Firefox/3.5.3 +Mozilla/5.0 (X11; U; FreeBSD i386; rv:1.8.1.12) Gecko/0 Kazehakase/0.4.9 +Mozilla/5.0 (X11; U; FreeBSD x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16 +Mozilla/5.0 (X11; U; FreeBSD; i386; en-US; rv:1.7) Gecko +Mozilla/5.0 (X11; U; FreeBSD; i386; it-IT; rv:1.7) Gecko +Mozilla/5.0 (X11; U; Gentoo Linux x86_64; pl-PL) Gecko Firefox +Mozilla/5.0 (X11; U; Gentoo Linux x86_64; pl-PL; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 +Mozilla/5.0 (X11; U; HP-UX 9000/785; en-US; rv:1.0.0) Gecko/20020605 +Mozilla/5.0 (X11; U; HP-UX 9000/785; en-US; rv:1.2) Gecko/20021203 +Mozilla/5.0 (X11; U; HP-UX 9000/785; en-US; rv:1.3) Gecko/20030321 +Mozilla/5.0 (X11; U; HP-UX 9000/785; es-ES; rv:1.0.1) Gecko/20020827 Netscape/7.0 +Mozilla/5.0 (X11; U; IRIX64 IP35; en-US; rv:1.4.3) Gecko/20040909 +Mozilla/5.0 (X11; U; Linux 2.6.34.1-SquidSheep; en-US; rv:1.9.2.3) Gecko/20100402 Iceweasel/3.6.3 (like Firefox/3.6.3) +Mozilla/5.0 (X11; U; Linux AMD64; en-US; rv:1.9.2.3) Gecko/20100403 Ubuntu/10.10 (maverick) Firefox/3.6.3 +Mozilla/5.0 (X11; U; Linux Gentoo i686; pl; rv:1.8.0.8) Gecko/20061219 Firefox/1.5.0.8 +Mozilla/5.0 (X11; U; Linux Gentoo; pl-PL; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 +Mozilla/5.0 (X11; U; Linux MIPS32 1074Kf CPS QuadCore; en-US; rv:1.9.2.13) Gecko/20110103 Fedora/3.6.13-1.fc14 Firefox/3.6.13 +Mozilla/5.0 (X11; U; Linux amd64) Iron/20.0.1150.1 Chrome/20.0.1150.1 Safari/536.11 +Mozilla/5.0 (X11; U; Linux amd64) Iron/21.0.1200.0 Chrome/21.0.1200.0 Safari/537.1 +Mozilla/5.0 (X11; U; Linux amd64; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 +Mozilla/5.0 (X11; U; Linux amd64; en-US; rv:5.0) Gecko/20110619 Firefox/5.0 +Mozilla/5.0 (X11; U; Linux amd64; rv:5.0) Gecko/20100101 Firefox/5.0 (Debian) +Mozilla/5.0 (X11; U; Linux armv7l; en-GB; rv:1.9.2.3pre) Gecko/20100723 Firefox/3.6.11 +Mozilla/5.0 (X11; U; Linux armv7l; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16 +Mozilla/5.0 (X11; U; Linux armv7l; en-US; rv:1.9.0.1) Gecko/2009010915 Minefield/3.0.1 +Mozilla/5.0 (X11; U; Linux armv7l; en-US; rv:1.9.2.14) Gecko/20110224 Firefox/3.6.14 MB860/Version.0.43.3.MB860.AmericaMovil.en.MX +Mozilla/5.0 (X11; U; Linux i386; en-US; rv:1.1) Gecko/20020826 +Mozilla/5.0 (X11; U; Linux i386; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 +Mozilla/5.0 (X11; U; Linux i586; de-AT; rv:1.4) Gecko/20030908 Debian/1.4-4 +Mozilla/5.0 (X11; U; Linux i586; de; rv:5.0) Gecko/20100101 Firefox/5.0 +Mozilla/5.0 (X11; U; Linux i586; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.1 Safari/533.2 +Mozilla/5.0 (X11; U; Linux i586; en-US) Gecko/20030908 Epiphany/0.9.2 +Mozilla/5.0 (X11; U; Linux i586; en-US; rv:0.9.9) Gecko/20020513 +Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.0.0) Gecko/20020623 Debian/1.0.0-0.woody.1 +Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.0rc3) Gecko/20020523 +Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.1) Gecko/20020826 +Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.2) Gecko/20050223 +Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.2.1) Gecko/20021204 +Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.2b) Gecko/20021016 +Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.3) Gecko/20030312 +Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.6) Gecko/20040413 Epiphany/1.2.6 +Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.7.3) Gecko/20040924 Epiphany/1.4.4 +Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.7.3) Gecko/20040924 Epiphany/1.4.4 (Ubuntu) +Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.8.0.11) Gecko/20070217 Iceape/1.0.8 (Debian-1.0.8-4) +Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.8.1.2) Gecko/20070227 SeaMonkey/1.1.1 +Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.8.1.9pre) Gecko/20071102 Firefox/2.0.0.9 Navigator/9.0.0.3 +Mozilla/5.0 (X11; U; Linux i586; fr-FR; rv:1.0.1) Gecko/20020823 Netscape/7.0 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.0.6) Gecko/20060728 SUSE/1.5.0.6-1.3 Firefox/1.5.0.6 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.9.1) Gecko/20090624 Firefox/3.5 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-GB; rv:1.8.1.5) Gecko/20070718 Fedora/2.0.0.5-1.fc7 Firefox/2.0.0.5 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-GB; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-GB; rv:1.9.1.3) Gecko/20091010 Iceweasel/3.5.3 (Debian-3.5.3-2) +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-GB; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/530.7 (KHTML, like Gecko) Chrome/2.0.175.0 Safari/530.7 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.196.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.197.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198.1 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.2 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.8 Safari/532.2 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.3 (KHTML, like Gecko) Iron/4.0.227.0 Chrome/4.0.227.0 Safari/532.3 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.576.0 Safari/534.12 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.634.0 Safari/534.16 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.7.12) Gecko/20051007 Galeon/1.3.21 (Debian package 1.3.21-8) +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.7.13) Gecko/20060417 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.10) Gecko/20060911 SUSE/1.5.0.10-0.2 Firefox/1.5.0.10 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.12) Gecko/20080326 CentOS/1.5.0.12-14.el5.centos Firefox/1.5.0.12 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.5) Gecko/20060726 Red Hat/1.5.0.5-0.el4.1 Firefox/1.5.0.5 pango-text +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.6) Gecko/20060728 SUSE/1.5.0.6-1.2 Firefox/1.5.0.6 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.7) Gecko/20060928 (Debian-1.8.0.7-1) Epiphany/2.14 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.9) Gecko/20061219 Fedora/1.5.0.9-1.fc6 Firefox/1.5.0.9 pango-text +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.1) Gecko/20070131 BonEcho/2.0.0.1 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.10) Gecko/20071015 SUSE/2.0.0.10-0.1 Firefox/2.0.0.10 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.10) Gecko/20071015 SUSE/2.0.0.10-0.2 Firefox/2.0.0.10 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.10) Gecko/20071115 Firefox/2.0.0.10 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.11) Gecko/20080126 Firefox/2.0.0.11 Flock/1.0.8 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.12pre) Gecko/20080103 BonEcho/2.0.0.12pre +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.13) Gecko/20080313 SeaMonkey/1.1.9 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.14) Gecko/20080417 Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.16) Gecko/20080702 SeaMonkey/1.1.11 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.16) Gecko/20080716 Firefox/2.0.0.16 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.17) Gecko/20080829 SeaMonkey/1.1.12 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.17) Gecko/20080913 Firefox/2.0.0.17 Flock/1.2.6 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.2) Gecko/20070221 SeaMonkey/1.1.1 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.20) Gecko/20090206 Firefox/2.0.0.20 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.2pre) Gecko/20061023 SUSE/2.0.0.1-0.1 Firefox/2.0.0.2pre +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.5) Gecko/20070718 Fedora/2.0.0.5-1.fc7 Firefox/2.0.0.5 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9) Gecko/20070314 GranParadiso/3.0 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.0.16) Gecko/2009122206 Firefox/3.0.16 Flock/2.5.6 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.15) Gecko/20101027 SeaMonkey/2.0.10 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.16) Gecko/20101123 SeaMonkey/2.0.11 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.19) Gecko/20110420 SeaMonkey/2.0.14 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.9) Gecko/20100317 Firefox/3.5.9 Seamonkey/2.0.4 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9a1) Gecko/20060127 Firefox/1.6a1 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9a1) Gecko/20061204 GranParadiso/3.0a1 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9b2) Gecko/2007121016 Firefox/3.0b2 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en; rv:1.8.1) Gecko/20061024 Iceweasel/2.0 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); en; rv:1.8.1) Gecko/20061024 Iceweasel/2.0 (Debian-2.0+dfsg-1) +Mozilla/5.0 (X11; U; Linux i686 (x86_64); fr; rv:1.7.12) Gecko/20051010 Debian/1.7.12-0ubuntu2 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); fr; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); fr; rv:1.8.1.2) Gecko/20070221 SeaMonkey/1.1.1 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); fr; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); nl; rv:1.8.0.6) Gecko/20060728 SUSE/1.5.0.6-1.2 Firefox/1.5.0.6 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); ru; rv:1.8.0.3) Gecko/20060425 SUSE/1.5.0.3-7 Firefox/1.5.0.3 +Mozilla/5.0 (X11; U; Linux i686 (x86_64); zh-TW; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 +Mozilla/5.0 (X11; U; Linux i686 Gentoo; en-US; rv:1.8.1.13) Gecko/20080413 Firefox/2.0.0.13 (Gentoo Linux) +Mozilla/5.0 (X11; U; Linux i686) Gecko/20030327 Galeon/1.3.4 Debian/1.3.3.20030419-1 +Mozilla/5.0 (X11; U; Linux i686) Gecko/20030430 Galeon/1.3.4 Debian/1.3.4.20030509-1 +Mozilla/5.0 (X11; U; Linux i686; Ubuntu 7.04; de-CH; rv:1.8.1.5) Gecko/20070309 Firefox/2.0.0.5 +Mozilla/5.0 (X11; U; Linux i686; bg; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 +Mozilla/5.0 (X11; U; Linux i686; ca-AD; rv:1.9.0.3) Gecko/2008092816 Iceweasel/3.0.3 (Debian-3.0.3-3) +Mozilla/5.0 (X11; U; Linux i686; ca; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6 +Mozilla/5.0 (X11; U; Linux i686; cs-CZ; rv:1.7.12) Gecko/20050929 +Mozilla/5.0 (X11; U; Linux i686; cs-CZ; rv:1.7.6) Gecko/20050226 Firefox/1.0.1 +Mozilla/5.0 (X11; U; Linux i686; cs-CZ; rv:1.8.0.10) Gecko/20070313 Fedora/1.5.0.10-5.fc6 Firefox/1.5.0.10 +Mozilla/5.0 (X11; U; Linux i686; cs-CZ; rv:1.8.0.11) Gecko/20070327 Ubuntu/dapper-security Firefox/1.5.0.11 +Mozilla/5.0 (X11; U; Linux i686; cs-CZ; rv:1.9.0.16) Gecko/2009121601 Ubuntu/9.04 (jaunty) Firefox/3.0.16 +Mozilla/5.0 (X11; U; Linux i686; cs-CZ; rv:1.9.1.6) Gecko/20100107 Fedora/3.5.6-1.fc12 Firefox/3.5.6 +Mozilla/5.0 (X11; U; Linux i686; da-DK; rv:1.7.13) Gecko/20060411 Firefox/1.0.8 SUSE/1.0.8-0.2 +Mozilla/5.0 (X11; U; Linux i686; de) AppleWebKit/523 midori/0.1 +Mozilla/5.0 (X11; U; Linux i686; de) AppleWebKit/523+ (KHTML like Gecko) midori/0.1 +Mozilla/5.0 (X11; U; Linux i686; de) AppleWebKit/523+ midori/0.1 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:0.9.8) Gecko/20020204 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.0.0) Gecko/20020615 Debian/1.0.0-3 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.1) Gecko/20020826 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.1) Gecko/20020913 Debian/1.1-1 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.2) Gecko/20021203 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.2.1) Gecko/20021130 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.2.1) Gecko/20021204 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.2.1) Gecko/20021226 Debian/1.2.1-9 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.2a) Gecko/20020910 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.3) Gecko/20030312 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.3) Gecko/20030327 Debian/1.3-4 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.3) Gecko/20030430 Debian/1.3-5 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.3b) Gecko/20030210 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.4) Gecko/20030624 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.4) Gecko/20030812 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.4) Gecko/20030908 Debian/1.4-4 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.5) Gecko/20031007 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.6) Gecko/20040114 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.6) Gecko/20040114 Epiphany/1.0.7 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.6) Gecko/20040115 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.7.10) Gecko/20050722 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.7.10) Gecko/20050727 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.7.12) Gecko/20050923 Fedora/1.7.12-1.5.1 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.7.12) Gecko/20060205 Debian/1.7.12-1.1 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.7.2) Gecko/20040804 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.7.2) Gecko/20040810 Debian/1.7.2-2 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.7.2) Gecko/20040906 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.7.5) Gecko/20041128 Firefox/1.0 (Debian package 1.0-4) +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.7.6) Gecko/20050325 Firefox/1.0.2 (Debian package 1.0.2-1) +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.7.7) Gecko/20050415 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.8.0.10) Gecko/20070306 SeaMonkey/1.0.8 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.8.1.15) Gecko/20080620 Mozilla/4.0 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.8.1.19) Gecko/20081204 SeaMonkey/1.1.14 Mnenhy/0.7.6.0 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.8.1.5) Gecko/20070716 SeaMonkey/1.1.3 +Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.8.1.9) Gecko/20071030 SeaMonkey/1.1.6 +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:0.9.4) Gecko/20011126 Netscape6/6.2.1 +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.0.1) Gecko/20020823 Netscape/7.0 +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.6) Gecko/20040207 Firefox/0.8 +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.7.13) Gecko/20060411 Firefox/1.0.8 SUSE/1.0.8-0.2 +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.7.13) Gecko/20060418 Firefox/1.0.8 (Ubuntu package 1.0.8) +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.7.5) Gecko/20041108 Firefox/1.0 +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.7.6) Gecko/20050306 Firefox/1.0.1 (Debian package 1.0.1-2) +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.7.6) Gecko/20050322 Firefox/1.0.1 +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.8.1.1) Gecko/20061205 Iceweasel/2.0.0.1 (Debian-2.0.0.1+dfsg-1) +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.8.1.21) Gecko/20090322 SeaMonkey/1.1.15 +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.8.1.9) Gecko/20071103 Midori/0.0.10 +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.9.0.11) Gecko/2009061212 Iceweasel/3.0.9 (Debian-3.0.9-1) +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.9.0.8) Gecko/2009033017 GranParadiso/3.0.8 +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.9.1.16) Gecko/20101124 SUSE/2.0.11-2.2 SeaMonkey/2.0.11 +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.9.1.18) Gecko/20110324 Iceweasel/3.5.18 (like Firefox/3.5.18) +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.9.1.9) Gecko/20100501 Iceweasel/3.5.9 (like Firefox/3.5.9) +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.9.1a2pre) Gecko/20080826020557 Minefield/3.1a2pre +Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.9.2.8) Gecko/20100725 Gentoo Firefox/3.6.8 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.11) Gecko/20070327 Ubuntu/dapper-security Firefox/1.5.0.11 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.12) Gecko/20070719 CentOS/1.5.0.12-3.el5.centos Firefox/1.5.0.12 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.3) Gecko/20060425 SUSE/1.5.0.3-7 Firefox/1.5.0.3 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.5) Gecko/20060731 Ubuntu/dapper-security Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.6) Gecko/20060808 Fedora/1.5.0.6-2.fc5 Firefox/1.5.0.6 pango-text +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.8) Gecko/20060911 SUSE/1.5.0.8-0.2 Firefox/1.5.0.8 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.8) Gecko/20061115 Ubuntu/dapper-security Firefox/1.5.0.8 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.1) Gecko/20061205 Firefox/2.0.0.1 (Debian-2.0.0.1+dfsg-2) +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.1) Gecko/20061205 Iceweasel/2.0.0.1 (Debian-2.0.0.1+dfsg-2) +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.1) Gecko/20061220 Firefox/2.0.0.1 (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.10) Gecko/20071126 Ubuntu/7.10 (gutsy) Firefox/2.0.0.10 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.12) Gecko/20080207 Ubuntu/7.10 (gutsy) Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.13) Gecko/20080325 Ubuntu/7.10 (gutsy) Firefox/2.0.0.13 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.14) Gecko/20080410 SUSE/2.0.0.14-0.1 Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.14) Gecko/20080418 Ubuntu/7.10 (gutsy) Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.16) Gecko/20080718 Ubuntu/8.04 (hardy) Firefox/2.0.0.16 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.19) Gecko/20081213 SUSE/2.0.0.19-0.1 Firefox/2.0.0.19 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.22pre) Gecko/20090327 Ubuntu/7.10 (gutsy) Firefox/2.0.0.22pre +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.3) Gecko/20070310 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.3) Gecko/20070310 Iceweasel/2.0.0.3 (Debian-2.0.0.3-1) +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.5) Gecko/20060911 SUSE/2.0.0.5-1.2 Firefox/2.0.0.5 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.11) Gecko/2009061212 Iceweasel/3.0.12 (Debian-3.0.12-1) +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.11) Gecko/2009062218 Gentoo Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.12) Gecko/2009070811 Ubuntu/9.04 (jaunty) Firefox/3.0.12 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.12) Gecko/2009070812 Ubuntu/8.04 (hardy) Firefox/3.0.12 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.13) Gecko/2009080315 Ubuntu/9.04 (jaunty) Firefox/3.0.13 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.14) Gecko/2009082505 Red Hat/3.0.14-1.el5_4 Firefox/3.0.14 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.14) Gecko/2009090216 Ubuntu/9.04 (jaunty) Firefox/3.0.14 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.18) Gecko/2010020400 SUSE/3.0.18-0.1.1 Firefox/3.0.18 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.18) Gecko/2010021501 Firefox/3.0.18 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.9) Gecko/2009041500 SUSE/3.0.9-2.2 Firefox/3.0.9 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.9) Gecko/2009042113 Ubuntu/8.04 (hardy) Firefox/3.0.9 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.9) Gecko/2009042113 Ubuntu/8.10 (intrepid) Firefox/3.0.9 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.9) Gecko/2009042113 Ubuntu/9.04 (jaunty) Firefox/3.0.9 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1) Gecko/20090624 Firefox/3.5 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1) Gecko/20090624 Ubuntu/8.04 (hardy) Firefox/3.5 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.1) Gecko/20090714 SUSE/3.5.1-1.1 Firefox/3.5.1 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.1) Gecko/20090722 Gentoo Firefox/3.5.1 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.10) Gecko/20100504 Lightning/1.0b1 Mnenhy/0.8.2 SeaMonkey/2.0.5 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.18) Gecko/20110320 SeaMonkey/2.0.13 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.19) Gecko/20110420 SeaMonkey/2.0.14 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.19) Gecko/20110430 Iceweasel/3.5.19 (like Firefox/3.5.19) +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.5) Gecko/20091112 Iceweasel/3.5.5 (like Firefox/3.5.5; Debian-3.5.5-1) +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.6) Gecko/20091201 SUSE/3.5.6-1.1.1 Firefox/3.5.6 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6 GTB7.0 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.8 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.10) Gecko/20100914 SUSE/3.6.10-0.3.1 Firefox/3.6.10 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.10) Gecko/20100915 Ubuntu/10.04 (lucid) Firefox/3.6.10 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.10) Gecko/20100915 Ubuntu/9.10 (karmic) Firefox/3.6.10 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.12) Gecko/20101027 Fedora/3.6.12-1.fc13 Firefox/3.6.12 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.13) Gecko/20101209 CentOS/3.6-2.el5.centos Firefox/3.6.13 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.13) Gecko/20101221 IceCat/3.6.13 (like Firefox/3.6.13) (Zenwalk GNU Linux) +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.15) Gecko/20110330 CentOS/3.6-1.el5.centos Firefox/3.6.15 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.18) Gecko/20110615 Ubuntu/10.10 (maverick) Firefox/3.6.18 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.18) Gecko/20110628 Ubuntu/10.10 (maverick) Firefox/3.6.18 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.21) Gecko/20110830 Ubuntu/10.10 (maverick) Firefox/3.6.21 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9b5) Gecko/2008041514 Firefox/3.0b5 +Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5 +Mozilla/5.0 (X11; U; Linux i686; en-CA; rv:1.8.0.10) Gecko/20070223 Fedora/1.5.0.10-1.fc5 Firefox/1.5.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-CA; rv:1.9.0.3) Gecko/2008092921 IceCat/3.0.3-g1 +Mozilla/5.0 (X11; U; Linux i686; en-CA; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 +Mozilla/5.0 (X11; U; Linux i686; en-GB) AppleWebKit/533.3 (KHTML, like Gecko) rekonq Safari/533.3 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.6) Gecko/20040113 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.7.13) Gecko/20060418 Fedora/1.0.8-1.1.fc4 Firefox/1.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.7.6) Gecko/20050405 Firefox/1.0 (Ubuntu package 1.0.2) +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.0.12) Gecko/20070718 Fedora/1.5.0.12-4.fc6 Firefox/1.5.0.12 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.0.5) Gecko/20060731 Ubuntu/dapper-security Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.0.5) Gecko/20060805 CentOS/1.0.3-0.el4.1.centos4 SeaMonkey/1.0.3 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.0.6) Gecko/20060808 Fedora/1.5.0.6-2.fc5 Firefox/1.5.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1) Gecko/20061031 BonEcho/2.0 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.1) Gecko/20061208 Firefox/2.0.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.1) Gecko/20070110 BonEcho/2.0.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.10) Gecko/20071126 Ubuntu/7.10 (gutsy) Firefox/2.0.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.12) Gecko/20080203 SUSE/2.0.0.12-2.1 Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.16) Gecko/20080715 Ubuntu/7.10 (gutsy) Firefox/2.0.0.16 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.17) Gecko/20080827 Iceweasel/2.0.0.17 (Debian-2.0.0.17-0etch1) +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.17) Gecko/20080925 Fedora/1.1.12-1.fc9 SeaMonkey/1.1.12 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.2pre) Gecko/20061023 Firefox/2.0.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.3) Gecko/20070310 Iceweasel/2.0.0.3 (Debian-2.0.0.3-1) +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.3) Gecko/20070310 Iceweasel/2.0.0.3 (Debian-2.0.0.3-2) +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.6) Gecko/20070914 Firefox/2.0.0.7 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.8) Gecko/20071008 Ubuntu/7.10 (gutsy) Firefox/2.0.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy) Firefox/2.0.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.9) Gecko/20071105 Firefox/2.0.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1b1) Gecko/20060710 Firefox/2.0b1 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.10) Gecko/2009042513 Ubuntu/8.04 (hardy) Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.10) Gecko/2009042523 Ubuntu/8.10 (intrepid) Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.11) Gecko/2009060214 Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11 GTB5 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.11) Gecko/2009060309 Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.13) Gecko/2009080316 Ubuntu/8.04 (hardy) Firefox/3.0.13 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.18) Gecko/2010021501 Ubuntu/9.04 (jaunty) Firefox/3.0.18 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.19) Gecko/2010040118 Ubuntu/8.10 (intrepid) Firefox/3.0.19 GTB7.1 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.7) Gecko/2009030814 Iceweasel Firefox/3.0.7 (Debian-3.0.7-1) +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.7) Gecko/2009030814 Iceweasel/3.0.9 (Debian-3.0.9-1) +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.1.11) Gecko/20100819 Iceweasel/3.5.11 (like Firefox/3.5.11) +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.1.15) Gecko/20101027 Fedora/3.5.15-1.fc12 Firefox/3.5.15 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.1.17) Gecko/20110123 SeaMonkey/2.0.12 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 GTB5 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6 GTB6 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.11) Gecko/20101013 Ubuntu/10.10 (maverick) Firefox/3.6.10 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.10 (maverick) Firefox/3.6.12 GTB7.1 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.18) Gecko/20110628 Ubuntu/10.10 (maverick) Firefox/3.6.18 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9b5) Gecko/2008041514 Firefox/3.0b5 +Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:2.0) Gecko/20110404 Fedora/16-dev Firefox/4.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/531.4 (KHTML, like Gecko) Chrome/3.0.194.0 Safari/531.4 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.1 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.196.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.197.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.197.11 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198.1 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.2 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.2 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.204.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.205.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.1 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.207.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.209.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.2 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.212.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Iron/3.0.197.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.212.0 Safari/532.1 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.0 Safari/532.1 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.1 Safari/532.1 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.0 Safari/532.2 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.8 Safari/532.2 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.2 Safari/532.2 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.3 Safari/532.2 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.4 Safari/532.2 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.5 Safari/532.2 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.6 Safari/532.2 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.8 Safari/532.2 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.1 Safari/532.2 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.2 Safari/532.2 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.3 (KHTML, like Gecko) Iron/4.0.227.0 Chrome/4.0.227.0 Safari/532 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.3 (KHTML, like Gecko) Iron/4.0.227.0 Chrome/4.0.227.0 Safari/532.3 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.4 (KHTML, like Gecko) Chrome/4.0.237.0 Safari/532.4 Debian +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Chrome/4.0.277.0 Safari/532.8 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Iron/4.0.275.2 Chrome/4.0.275.2 Safari/532.8 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.358.0 Safari/533.3 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.366.2 Safari/533.4 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.416.0 Safari/534.1 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.1 SUSE/6.0.428.0 (KHTML, like Gecko) Chrome/6.0.428.0 Safari/534.1 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.551.0 Safari/534.10 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.579.0 Safari/534.12 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.44 Safari/534.13 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.84 Safari/534.13 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Ubuntu/9.10 Chromium/9.0.592.0 Chrome/9.0.592.0 Safari/534.13 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Chrome/10.0.612.1 Safari/534.15 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Ubuntu/10.04 Chromium/10.0.612.3 Chrome/10.0.612.3 Safari/534.15 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.611.0 Chrome/10.0.611.0 Safari/534.15 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.613.0 Chrome/10.0.613.0 Safari/534.15 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.134 Safari/534.16 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Iron/10.0.650.0 Chrome/10.0.650.0 Safari/534.16 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.0 Chrome/10.0.648.0 Safari/534.16 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.133 Chrome/10.0.648.133 Safari/534.16 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.2 (KHTML, like Gecko) Chrome/6.0.453.1 Safari/534.2 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.457.0 Safari/534.3 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.458.0 Safari/534.3 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.460.0 Safari/534.3 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.462.0 Safari/534.3 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Iron/6.0.475.1 Chrome/6.0.475.1 Safari/534.3 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.24 Safari/534.7 +Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Iron/7.0.520.0 Chrome/7.0.520.0 Safari/534.7 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.2) Gecko/20010726 Netscape6/6.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.2) Gecko/20010809 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.2.1) Gecko/20010901 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.3) Gecko/20010801 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.4) Gecko/20010923 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.4) Gecko/20011019 Netscape6/6.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.4) Gecko/20011022 Netscape6/6.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.4) Gecko/20011126 Netscape6/6.2.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.6) Gecko/20011202 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.8) Gecko/20020204 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.9) Gecko/20020313 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.9) Gecko/20020408 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.9) Gecko/20020423 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.9) Gecko/20020513 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.0) Gecko/20020529 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.0) Gecko/20020605 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.0) Gecko/20020612 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.0) Gecko/20020623 Debian/1.0.0-0.woody.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.0) Gecko/20021004 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20020826 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20020830 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20020903 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20020912 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20020918 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20020919 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20021003 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20021110 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20021122 Debian/1.0.1-2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20021203 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.2) Gecko/20021120 Netscape/7.01 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.2) Gecko/20030208 Netscape/7.02 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.2) Gecko/20030716 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0rc2) Gecko/20020510 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0rc2) Gecko/20020513 Netscape/7.0b1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0rc3) Gecko/20020529 Debian/1.0rc3-1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1) Gecko/20020826 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1) Gecko/20020828 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1) Gecko/20020829 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1) Gecko/20020913 Debian/1.1-1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1a) Gecko/20020610 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1b) Gecko/20020722 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2) Gecko/20021126 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2) Gecko/20021202 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021130 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021203 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021204 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021208 Debian/1.2.1-2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021213 Debian/1.2.1-2.bunk +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20030113 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20030225 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20030409 Debian/1.2.1-9woody2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20030427 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2a) Gecko/20020910 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2b) Gecko/20021014 Phoenix/0.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2b) Gecko/20021016 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2b) Gecko/20021029 Phoenix/0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3) Gecko/20030312 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3) Gecko/20030313 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3) Gecko/20030314 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3) Gecko/20030320 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3) Gecko/20030326 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3) Gecko/20030327 Debian/1.3-4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3) Gecko/20030401 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3) Gecko/20030413 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3) Gecko/20030523 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3.1) Gecko/20030425 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3.1) Gecko/20030428 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3a) Gecko/20021207 Phoenix/0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3b) Gecko/20021213 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3b) Gecko/20030125 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3b) Gecko/20030210 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030723 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030818 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030821 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030827 Debian/1.4-3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030828 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030908 Debian/1.4-4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030908 Epiphany/0.9.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20040406 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.2) Gecko/20040220 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4a) Gecko/20030401 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4a) Gecko/20030425 Mozilla Firebird/0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4b) Gecko/20030505 Mozilla Firebird/0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4b) Gecko/20030607 Mozilla Firebird/0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4b) Gecko/20030630 Mozilla Firebird/0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.5) Gecko/20031007 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.5a) Gecko/20030728 Mozilla Firebird/0.6.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040113 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040114 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040114 Epiphany/1.0.7 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040225 Firefox/0.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040413 Debian/1.6-5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 Galeon/1.3.16 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040614 Firefox/0.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7) Gecko/20040514 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7) Gecko/20040630 Firefox/0.9.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7) Gecko/20040802 Firefox/0.9.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7) Gecko/20040917 Firefox/0.9.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050715 Firefox/1.0.6 SUSE/1.0.6-16 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050716 Firefox/1.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050719 Red Hat/1.0.6-1.4.1 Firefox/1.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050720 Fedora/1.0.6-1.1.fc3 Firefox/1.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050720 Fedora/1.0.6-1.1.fc4.k12ltsp.4.4.0 Firefox/1.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050721 Firefox/1.0.6 (Ubuntu package 1.0.6) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050811 Fedora/1.7.10-1.2.1.legacy +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050811 Firefox/1.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050815 Firefox/1.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050911 Firefox/1.0.6 (Debian package 1.0.6-5) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050918 Firefox/1.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050920 Firefox/1.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050921 Firefox/1.5.0.2 Mandriva/1.0.6-15mdk (2006.0) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20051106 Firefox/1.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20051111 Firefox/1.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20060410 Firefox/1.0.8 Mandriva/1.0.6-16.5.20060mdk (2006.0) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20060927 Firefox/1.0.4 (Debian package 1.0.4-2sarge12) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20061113 Firefox/1.0.4 (Debian package 1.0.4-2sarge13) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20070116 Firefox/1.0.4 (Debian package 1.0.4-2sarge15) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20070530 Firefox/1.0.4 (Debian package 1.0.4-2sarge17) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.11) Gecko/20050729 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20050920 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20050921 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20050921 Red Hat/1.7.12-1.1.3.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20050923 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20050926 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20050929 Galeon/1.3.21 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20051007 Debian/1.7.12-1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20051007 Galeon/2.0.0 (Debian package 2.0.0-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20051010 Debian/1.7.12-0ubuntu2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20051010 Epiphany/1.8.2 (Ubuntu) (Ubuntu package 1.0.7) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20051010 Firefox/1.0.4 (Ubuntu package 1.0.7) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20051013 Debian/1.7.12-1ubuntu1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20051203 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20051215 Epiphany/1.8.4.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20060122 Galeon/2.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20060202 Fedora/1.7.12-1.5.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20060205 Debian/1.7.12-1.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20060208 Epiphany/1.8.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20060216 Debian/1.7.12-1.1ubuntu2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20060607 Debian/1.7.12-1.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.13) Gecko/20060411 Firefox/1.0.8 SUSE/1.0.8-0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.13) Gecko/20060413 Red Hat/1.0.8-1.4.1 Firefox/1.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.13) Gecko/20060417 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.13) Gecko/20060427 Debian/1.7.13-0ubuntu05.04 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.13) Gecko/20060501 Epiphany/2.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.13) Gecko/20060501 Galeon/2.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.13) Gecko/20060717 Debian/1.7.13-0.2ubuntu1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.2) Gecko/20040803 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.2) Gecko/20040804 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.2) Gecko/20040805 Netscape/7.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.2) Gecko/20040906 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.2) Gecko/20040906 Galeon/1.3.17 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040913 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040924 Epiphany/1.4.4 (Ubuntu) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20041007 Debian/1.7.3-5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20041007 Epiphany/1.4.7 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20041007 Galeon/1.3.18 (Debian package 1.3.18-1.1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041013 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041117 Firefox/1.0 (Debian package 1.0-2.0.0.45.linspire0.4) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041128 Firefox/1.0 (Debian package 1.0-4) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041204 Firefox/1.0 (Debian package 1.0.x.2-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041215 Firefox/1.0 Red Hat/1.0-12.EL4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041218 Firefox/1.0 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041221 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20050210 Firefox/1.0 (Debian package 1.0+dfsg.1-6) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20050221 Firefox/1.0 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20050814 Firefox/1.0 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20060127 Netscape/8.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20070321 Netscape/8.1.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20070321 Netscape/9.0 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.6) Gecko/20050310 Firefox/1.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.6) Gecko/20050311 Firefox/1.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.6) Gecko/20050317 Firefox/1.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.6) Gecko/20050317 Firefox/1.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.6) Gecko/20050319 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.6) Gecko/20050328 Fedora/1.7.6-1.2.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.6) Gecko/20050405 Firefox/1.0 (Ubuntu package 1.0.2) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.7) Gecko/20050414 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.7) Gecko/20050420 Debian/1.7.7-2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.7) Gecko/20050421 Firefox/1.0.3 (Debian package 1.0.3-2) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.7) Gecko/20050427 Red Hat/1.7.7-1.1.3.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050511 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4 SUSE/1.0.4-1.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050512 Firefox/1.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050512 Red Hat/1.7.8-1.1.3.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050513 Debian/1.7.8-1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050513 Epiphany/1.4.8 (Debian) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050513 Fedora/1.0.4-1.3.1 Firefox/1.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050513 Firefox/1.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050513 Galeon/1.3.20 (Debian package 1.3.20-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050517 Firefox/1.0.4 (Debian package 1.0.4-2) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050523 Firefox/1.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050524 Fedora/1.0.4-4 Firefox/1.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050610 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050610 Firefox/1.0.4 (Debian package 1.0.4-3) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050718 Galeon/1.3.20 (Debian package 1.3.20-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050831 Debian/1.7.8-1sarge2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050831 Epiphany/1.4.8 (Debian) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050921 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050927 Debian/1.7.8-1sarge3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050927 Epiphany/1.4.8 (Debian) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.9) Gecko/20050711 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.9) Gecko/20050711 Firefox/1.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8) Gecko/20051219 SeaMonkey/1.0b +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8) Gecko/20060102 Flock/0.4.11 Firefox/1.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8) Gecko/20060110 Debian/1.5.dfsg-4 Firefox/1.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8) Gecko/20060111 Firefox/1.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8) Gecko/20060118 Firefox/1.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8) Gecko/20060119 Debian/1.5.dfsg-4ubuntu3 Firefox/1.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8) Gecko/20060130 Ubuntu/1.5.dfsg-4ubuntu6 Firefox/1.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8) Gecko/20060301 SeaMonkey/1.1a Mnenhy/0.7.3.0 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8) Gecko/20060806 Firefox/1.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060027 (Debian-1.8.0.1-11) Galeon/2.0.1 (Debian package 2.0.1-3) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060126 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060217 Flock/0.5.11 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060313 Debian/1.5.dfsg+1.5.0.1-4 Firefox/1.5.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060313 Fedora/1.5.0.1-9 Firefox/1.5.0.1 pango-text +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060314 Flock/0.5.13.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060316 SUSE/1.0-27 SeaMonkey/1.0 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060324 Ubuntu/dapper Firefox/1.5.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060404 Firefox/1.5.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/Debian-1.8.0.1-5 Galeon/2.0.1 (Debian package 2.0.1-3) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20060911 SUSE/1.5.0.10-0.2 Firefox/1.5.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070216 Firefox/1.5.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070221 Red Hat/1.5.0.10-0.1.el4 Firefox/1.5.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070223 CentOS/1.5.0.10-0.1.el4.centos Firefox/1.5.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070223 Fedora/1.0.8-0.5.1.fc5 SeaMonkey/1.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070226 Fedora/1.5.0.10-1.fc6 Firefox/1.5.0.10 pango-text +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070226 Red Hat/1.5.0.10-0.1.el4 Firefox/1.5.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070301 SUSE/1.8_seamonkey_1.0.8-0.1 SeaMonkey/1.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070302 Ubuntu/dapper-security Firefox/1.5.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070306 SeaMonkey/1.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070409 CentOS/1.5.0.10-2.el5.centos Firefox/1.5.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070510 Fedora/1.5.0.10-6.fc6 Firefox/1.5.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.11) Gecko/20070217 Iceape/1.0.8 (Debian-1.0.8-4) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.11) Gecko/20070501 Firefox/1.5.0.11 Flock/0.7.13.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070510 Iceape/1.0.9 (Debian-1.0.9-0etch1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070529 Red Hat/1.5.0.12-0.1.el4 Firefox/1.5.0.12 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070530 Fedora/1.5.0.12-1.fc6 Firefox/1.5.0.12 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070719 CentOS/1.5.0.12-0.3.el4.centos Firefox/1.5.0.12 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20071126 Fedora/1.5.0.12-7.fc6 Firefox/1.5.0.12 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.13pre) Gecko/20070505 (Debian-1.8.0.14~pre071019b-0lenny1) Epiphany/2.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.13pre) Gecko/20070505 (Debian-1.8.0.15~pre080131b-0etch1) Epiphany/2.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.13pre) Gecko/20070505 Iceape/1.0.9 (Debian-1.0.10~pre070720-0etch3) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.13pre) Gecko/20070717 Red Hat/1.0.9-4.el4 SeaMonkey/1.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.13pre) Gecko/20080207 Galeon/2.0.1 (Ubuntu package 2.0.1-1ubuntu2) Firefox/1.5.0.13pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.13pre) Gecko/20080207 Ubuntu/dapper-security Firefox/1.5.0.13pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.14eol) Gecko/20070505 (Debian-1.8.0.15~pre080614d-0etch1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.14eol) Gecko/20090422 CentOS/1.0.9-0.37.el3.centos3 SeaMonkey/1.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.14eol) Gecko/20101004 Red Hat/1.0.9-64.el4 SeaMonkey/1.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.2) Gecko Firefox/1.5.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.2) Gecko/20060419 Fedora/1.5.0.2-1.2.fc5 Firefox/1.5.0.2 pango-text +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.2) Gecko/20060630 Red Hat/1.0.1-0.1.9.EL3 SeaMonkey/1.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.3) Gecko/20060326 Firefox/1.5.0.3 (Debian-1.5.dfsg+1.5.0.3-2) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.3) Gecko/20060425 SUSE/1.5.0.3-7 Firefox/1.5.0.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.3) Gecko/20060504 Fedora/1.5.0.3-1.1.fc5 Firefox/1.5.0.3 pango-text +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.3) Gecko/20060523 Ubuntu/dapper Epiphany/2.14 Firefox/1.5.0.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.3) Gecko/20060523 Ubuntu/dapper Firefox/1.5.0.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060406 Firefox/1.5.0.4 (Debian-1.5.dfsg+1.5.0.4-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060508 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060516 SeaMonkey/1.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060527 SUSE/1.5.0.4-1.3 Firefox/1.5.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Epiphany/2.14 Firefox/1.5.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060612 Firefox/1.5.0.4 Flock/0.7.0.17.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060613 Firefox/1.5.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060614 Fedora/1.5.0.4-1.2.fc5 Firefox/1.5.0.4 pango-text +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060619 SeaMonkey/1.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060627 Galeon/2.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060629 Firefox/1.5.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060704 Firefox/1.5.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060711 Firefox/1.5.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060716 Firefox/1.5.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060912 pango-text +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060719 Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060731 Firefox/1.5.0.5 Flock/0.7.4.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060731 Ubuntu/dapper-security Epiphany/2.14 Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060731 Ubuntu/dapper-security Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060801 Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060803 Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060806 Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060812 Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060813 Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060820 Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060831 Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 (Debian-1.5.dfsg+1.5.0.6-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 (Debian-1.5.dfsg+1.5.0.6-4) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060728 SUSE/1.5.0.6-0.1 Firefox/1.5.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060730 SeaMonkey/1.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060802 Firefox/1.5.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060803 Firefox/1.5.0.6 (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060803 SeaMonkey/1.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060807 Firefox/1.5.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060808 Fedora/1.5.0.6-2.fc5 Firefox/1.5.0.6 pango-text +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060905 Fedora/1.5.0.6-10 Firefox/1.5.0.6 pango-text +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060910 SeaMonkey/1.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060911 Red Hat/1.5.0.7-0.1.el4 Firefox/1.5.0.1 pango-text +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060914 SeaMonkey/1.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060924 Epiphany/2.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060928 (Debian-1.8.0.7-1) Epiphany/2.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20061014 Firefox/1.5.0.7 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20061022 Iceweasel/1.5.0.7-g2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.8) Gecko/20060802 Mandriva/1.5.0.8-1.1mdv2007.0 (2007.0) Firefox/1.5.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.8) Gecko/20060911 SUSE/1.5.0.8-0.2 Firefox/1.5.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.8) Gecko/20061105 Red Hat/1.0.6-0.1.el3 SeaMonkey/1.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.8) Gecko/20061107 Fedora/1.5.0.8-1.fc6 Firefox/1.5.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.8) Gecko/20061110 Firefox/1.5.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.8) Gecko/20061115 Ubuntu/dapper-security Firefox/1.5.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.8pre) Gecko/20061001 Firefox/1.5.0.8pre (Iceweasel) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20060911 SUSE/1.5.0.9-0.2 Firefox/1.5.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20060911 SUSE/1.5.0.9-3.2 Firefox/1.5.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20061205 (Debian-1.8.0.9-1) Epiphany/2.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20061211 SeaMonkey/1.0.7 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20061215 Red Hat/1.5.0.9-0.1.el4 Firefox/1.5.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20061219 Fedora/1.5.0.9-1.fc6 Firefox/1.5.0.9 pango-text +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20061219 Iceape/1.0.7 (Debian-1.0.7-3) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20061221 Fedora/1.5.0.9-1.fc5 Firefox/1.5.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20070102 Ubuntu/dapper-security Firefox/1.5.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20070104 Red Hat/1.0.7-0.6.fc5 SeaMonkey/1.0.7 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20070126 Ubuntu/dapper-security Firefox/1.5.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20070316 CentOS/1.5.0.9-10.el5.centos Firefox/1.5.0.9 pango-text +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20061001 Firefox/2.0b (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20061003 BonEcho/2.0 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20061024 Iceweasel/2.0 (Debian-2.0+dfsg-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20061026 BonEcho/2.0 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20061031 BonEcho/2.0 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20061127 lolifox/0.3.0 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20061129 BonEcho/2.0 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20060601 Firefox/2.0.0.1 (Ubuntu-edgy) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20061205 Firefox/2.0.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20061205 Firefox/2.0.0.1 (Debian-2.0.0.1+dfsg-2) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20061205 Iceweasel/2.0.0.1 (Debian-2.0.0.1+dfsg-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20061205 Iceweasel/2.0.0.1 (Debian-2.0.0.1+dfsg-2) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20061205 Mozilla/5.0 (Debian-2.0.0.1+dfsg-2) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20061208 Firefox/2.0.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20061220 Firefox/2.0.0.1 (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20070110 Firefox/2.0.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20070115 BonEcho/2.0.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20070215 BonEcho/2.0.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20070217 BonEcho/2.0.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20070220 BonEcho/2.0.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20070222 BonEcho/2.0.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20070224 Firefox/2.0.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/20060601 Firefox/2.0.0.10 (Ubuntu-edgy) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/20061201 Firefox/2.0.0.10 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/20071015 SUSE/2.0.0.10-0.2 Firefox/2.0.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/20071115 Firefox/2.0.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/20071115 Firefox/2.0.0.10 (Debian-2.0.0.10-0etch1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/20071126 Ubuntu/7.10 (gutsy) Firefox/2.0.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/20071128 Fedora/2.0.0.10-2.fc7 Firefox/2.0.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/20071203 Ubuntu/7.10 (gutsy) Firefox/2.0.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/20071213 Fedora/2.0.0.10-3.fc8 Firefox/2.0.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071201 (Debian-1.8.1.11-1) Epiphany/2.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071203 IceCat/2.0.0.11-g1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071204 BonEcho/2.0.0.11 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071204 Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071206 Firefox/2.0.0.11 Flock/1.0.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071217 Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20080201 Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11pre) Gecko/20071206 Firefox/2.0.0.11 Navigator/9.0.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080129 Firefox/2.0.0.12 (Debian-2.0.0.12-0etch1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12 Mnenhy/0.7.5.666 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080201 SeaMonkey/1.1.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080208 Fedora/2.0.0.12-1.fc8 Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080208 Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080208 Firefox/2.0b2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080208 SeaMonkey/1.1.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Navigator/9.0.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080304 Firefox/2.0.0.12 Flock/1.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.13) Gecko/20061201 Firefox/2.0.0.13 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0 Iceweasel/2.0.0.3 (Debian-2.0.0.13-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.3 Iceweasel/2.0.0.13 (Debian-2.0.0.13-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.13) Gecko/20080313 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.13) Gecko/20080313 SeaMonkey/1.1.9 (Ubuntu-1.1.9+nobinonly-0ubuntu1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.13) Gecko/20080316 SUSE/2.0.0.13-0.1 Firefox/2.0.0.13 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.13) Gecko/20080316 SUSE/2.0.0.13-1.1 Firefox/2.0.0.13 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.13) Gecko/20080325 Firefox/2.0.0.13 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.13) Gecko/20080330 Ubuntu/7.10 (gutsy) Firefox/2.0.0.13 (Linux Mint) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.13) Gecko/20080401 BonEcho/2.0.0.13 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20061201 Firefox/2.0.0.14 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080404 Iceweasel/2.0.0.14 (Debian-2.0.0.14-0etch1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080404 Iceweasel/2.0.0.14 (Debian-2.0.0.14-2) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080410 SUSE/2.0.0.14-0.4 Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080414 Firefox/2.0.0.14 Flock/1.1.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080416 Fedora/2.0.0.14-1.fc8 Firefox/2.0.0.14 pango-text +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080417 BonEcho/2.0.0.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080417 Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080419 Ubuntu/8.04 (hardy) Firefox/2.0.0.12 MEGAUPLOAD 1.0 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080423 Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080428 Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080508 Ubuntu/8.04 (hardy) Firefox/2.0.0.14 (Linux Mint) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080525 Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080530 Firefox/2.0.0.14 Flock/1.2.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.15) Gecko/20061201 Firefox/2.0.0.15 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.15) Gecko/20080612 Iceweasel/2.0.0.15 (Debian-2.0.0.15-0etch1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.15) Gecko/20080702 Ubuntu/8.04 (hardy) Firefox/2.0.0.15 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080715 Fedora/2.0.0.16-1.fc8 Firefox/2.0.0.16 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080715 Firefox/2.0.0.16 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080715 Ubuntu/7.10 (gutsy) Firefox/2.0.0.16 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080716 (Gentoo) Galeon/2.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080716 (Gentoo) Galeon/2.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080716 Fedora/1.1.11-1.fc8 SeaMonkey/1.1.11 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080716 Firefox/3.07 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080716 SeaMonkey/1.1.11 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080718 Ubuntu/8.04 (hardy) Firefox/2.0.0.16 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080722 Firefox/2.0.0.16 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.17) Gecko/20080703 Mandriva/2.0.0.17-1.1mdv2008.1 (2008.1) Firefox/2.0.0.17 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.17) Gecko/20080827 Firefox/2.0.0.10 (Debian-2.0.0.17-0etch1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.17) Gecko/20080829 SeaMonkey/1.1.12 (Ubuntu-1.1.12+nobinonly-0ubuntu1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.17) Gecko/20080921 SUSE/2.0.0.17-1.2 Firefox/2.0.0.17 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.17) Gecko/20080922 Ubuntu/7.10 (gutsy) Firefox/2.0.0.17 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.17) Gecko/20080924 Ubuntu/8.04 (hardy) Firefox/2.0.0.17 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.18) Gecko/20080921 SUSE/2.0.0.18-0.1 Firefox/2.0.0.18 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.18) Gecko/20081030 SeaMonkey/1.1.13 (Ubuntu-1.1.13+nobinonly-0ubuntu1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.18) Gecko/20081112 Fedora/2.0.0.18-1.fc8 Firefox/2.0.0.18 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.18) Gecko/20081113 Fedora/1.1.13-1.fc8 SeaMonkey/1.1.13 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.18) Gecko/20081113 SeaMonkey/1.1.13 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.18) Gecko/20081113 Ubuntu/8.04 (hardy) Firefox/2.0.0.18 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20081202 Firefox (Debian-2.0.0.19-0etch1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20081204 Iceape/1.1.14 (Debian-1.1.14-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20081204 SeaMonkey/1.1.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20081213 SUSE/2.0.0.19-0.1 Firefox/2.0.0.19 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20081216 Fedora/2.0.0.19-1.fc8 Firefox/2.0.0.19 pango-text +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20081216 Galeon/2.0.4 Firefox/2.0.0.19 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20081216 SeaMonkey/1.1.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20081218 SeaMonkey/1.1.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20081221 SeaMonkey/1.1.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20081230 Firefox/2.0.0.19 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20061201 Firefox/2.0.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20061201 Firefox/2.0.0.2 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070208 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070208 Iceweasel/2.0.0.2 (Debian-2.0.0.2+dfsg-3) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070220 Firefox/2.0.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070221 SUSE/2.0.0.2-6.1 Firefox/2.0.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070221 SeaMonkey/1.1.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070224 BonEcho/2.0.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070225 Firefox/2.0.0.2 (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070226 Firefox/2.0.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070302 BonEcho/2.0.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070307 Firefox/2.0.0.2 Flock/0.7.99 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070309 SeaMonkey/1.1.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070314 Firefox/2.0.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070317 Firefox/2.0.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.20) Gecko/20081217 Firefox(2.0.0.20) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.21) Gecko/20090322 SeaMonkey/1.1.15 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.21) Gecko/20090331 K-Meleon/1.5.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.22) Gecko/20090605 SeaMonkey/1.1.17 (Ubuntu-1.1.17+nobinonly-0ubuntu1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.22) Gecko/20090624 SeaMonkey/1.1.17 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.22) Gecko/20090708 SeaMonkey/1.1.17 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.22pre) Gecko/20090327 Ubuntu/7.10 (gutsy) Firefox/2.0.0.22pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.22pre) Gecko/20090327 Ubuntu/8.04 (hardy) Firefox/2.0.0.22pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.23) Gecko/20090907 SeaMonkey/1.1.18 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.23) Gecko/20090908 Fedora/1.1.18-1.fc10 SeaMonkey/1.1.18 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20061201 Firefox/2.0.0.1 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20061201 MEGAUPLOAD 1.0 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20070310 Iceweasel/2.0.0.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20070310 Iceweasel/2.0.0.3 (Debian-2.0.0.3-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20070310 Iceweasel/2.0.0.3 (Debian-2.0.0.3-2) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20070517 BonEcho/2.0.0.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3pre) Gecko/20070307 Firefox/2.0.0.3pre (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20061201 Mozilla/5.0 (Linux Mint) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20070508 (Debian-1.8.1.4-2ubuntu5) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20070508 (Debian-1.8.1.4-3) Galeon/2.0.2 (Debian package 2.0.2-4) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20070508 Iceweasel/2.0.0.4 (Debian-2.0.0.4-0etch1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20070508 Iceweasel/2.0.0.4 (Debian-2.0.0.4-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20070509 Iceape/1.1.2 (Debian-1.1.2-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4 (Kubuntu) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20070530 Fedora/2.0.0.4-1.fc7 Firefox/2.0.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20070531 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20070531 BonEcho/2.0.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20070531 Firefox/2.0.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20070531 Firefox/2.0.0.4 (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20070602 Firefox/2.0.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4pre) Gecko/20070414 BonEcho/2.0.0.4pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4pre) Gecko/20070509 Firefox/2.0.0.4pre (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.5) Gecko/20061201 Firefox/2.0.0.5 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.5) Gecko/20070718 Fedora/2.0.0.5-1.fc7 Firefox/2.0.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.5) Gecko/20070719 Firefox/2.0.0.5 (Debian-2.0.0.5-0etch1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.5) Gecko/20070725 Firefox/2.0.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.5) Gecko/20070728 Firefox/2.0.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20070723 Iceweasel/2.0.0.6 (Debian-2.0.0.6-0etch1+lenny1) (.NET CLR 3.5.30729) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20070802 SeaMonkey/1.1.4 Mnenhy/0.7.5.666 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20070804 Firefox/2.0.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20070807 Firefox/2.0.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20070831 Firefox/2.0.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20070914 Firefox/2.0.0.6 Flock/0.9.1.0 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.7) Gecko/20070921 Firefox/2.0.0.7 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.7) Gecko/20070923 Firefox/2.0.0.7 (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.7) Gecko/20071018 BonEcho/2.0.0.7 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.7pre) Gecko/20070815 Firefox/2.0.0.6 Navigator/9.0b3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20061201 Firefox/2.0.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20071004 Firefox/2.0.0.8 (Debian-2.0.0.8-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20071004 Iceweasel/2.0.0.8 (Debian-2.0.0.6+2.0.0.8-0etch1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20071008 FreeBSD/i386 Firefox/2.0.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20071008 Iceape/1.1.5 (Ubuntu-1.1.5-1ubuntu0.7.10) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20071019 Fedora/2.0.0.8-1.fc7 Firefox/2.0.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20071022 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20071022 Firefox/2.0.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20071201 Firefox/2.0.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8pre) Gecko/20071015 Firefox/2.0.0.7 Navigator/9.0 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/1.5.0.9 (Debian-2.0.0.9-2) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.9) Gecko/20071025 FreeBSD/i386 Firefox/2.0.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.9) Gecko/20071030 Iceape/1.1.6 (Debian-1.1.6-3) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.9) Gecko/20071103 Firefox/2.0.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.9) Gecko/20071103 Firefox/2.0.0.9 (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.9) Gecko/20071105 Fedora/2.0.0.9-1.fc7 Firefox/2.0.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.9) Gecko/20071105 Firefox/2.0.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.9) Gecko/20071113 BonEcho/2.0.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1b2) Gecko/20060821 BonEcho/2.0b2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8b5) Gecko/20051006 Firefox/1.4.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8b5) Gecko/20051008 Fedora/1.5-0.5.0.beta2 Firefox/1.4.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061920 IceCat/3.0-g1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008062113 Iceweasel/3.0 (Debian-3.0~rc2-2) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko Kazehakase/0.5.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071523 Firefox/3.0.1 Flock/2.0b2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071910 Minefield/3.0.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072716 IceCat/3.0.1-g1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072820 Ubuntu/8.04 (hardy) (Linux Mint) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko Galeon/2.0.6 (Ubuntu 2.0.6-2.1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko Kazehakase/0.5.4 Debian/0.5.4-2.1ubuntu3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042513 Linux Mint/5 (Elyssa) Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042523 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042523 Linux Mint/6 (Felicia) Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042523 Linux Mint/7 (Gloria) Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042523 Ubuntu/8.10 (intrepid) Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042708 Fedora/3.0.10-1.fc10 Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042812 Gentoo Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.11) Gecko/2009060308 Linux Mint/7 (Gloria) Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.11) Gecko/2009060310 Linux Mint/6 (Felicia) Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.11) Gecko/2009061212 Iceweasel/3.0.9 (Debian-3.0.9-1) GTB5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.12) Gecko/2009070610 Firefox/3.0.12 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.12) Gecko/2009070812 Linux Mint/5 (Elyssa) Firefox/3.0.12 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.12) Gecko/2009070818 Firefox/3.0.12 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.12) Gecko/2009070818 Ubuntu/8.10 (intrepid) Firefox/3.0.12 FirePHP/0.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.13) Gecko/2009080315 Ubuntu/9.04 (jaunty) Firefox/3.0.13 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.14) Gecko/2009090216 Ubuntu/9.04 (jaunty) Firefox/3.0.14 GTB5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.14) Gecko/2009090905 Fedora/3.0.14-1.fc10 Firefox/3.0.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.14) Gecko/2009091010 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.14) Gecko/2009091010 Firefox/3.0.14 (Debian-3.0.14-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.14) Gecko/20090916 Ubuntu/9.04 (jaunty) Firefox/3.0.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.17) Gecko/2010010604 Ubuntu/9.04 (jaunty) Firefox/3.0.17 FirePHP/0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.18) Gecko/2010021720 Iceweasel/3.0.9 (Debian-3.0.9-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.19) Gecko/2010072023 Firefox/3.0.6 (Debian-3.0.6-3) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.19) Gecko/2010091807 Firefox/3.0.6 (Debian-3.0.6-3) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1pre) Gecko/2008062222 Firefox/3.0.1pre (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko Fedora/1.9.0.2-1.fc9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008090211 Ubuntu/9.04 (jaunty) Iceweasel/3.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008091816 Red Hat/3.0.2-3.el5 Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008092000 Ubuntu/8.04 (hardy) Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008092313 Ubuntu/1.4.0 (hardy) Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.1.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008092318 Fedora/3.0.2-1.fc9 Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008092418 CentOS/3.0.2-3.el5.centos Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008092809 Gentoo Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008100722 IceCat/3.0.2-g1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008110715 ASPLinux/3.0.2-3.0.120asp Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008090713 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008092816 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008092816 Mobile Safari 1.1.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008092921 IceCat/3.0.3-g1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008100320 Firefox/2.0.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3pre) Gecko/2008090713 Firefox/3.0.3pre (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3pre) Gecko/2008091304 GranParadiso/3.0.3pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3pre) Gecko/2008092604 GranParadiso/3.0.3pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.4) Gecko/2008111318 Ubuntu/8.10 (intrepid) Firefox/3.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.4pre) Gecko/2008092704 GranParadiso/3.0.4pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.4pre) Gecko/2008101311 Firefox/3.0.4pre (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2008121622 Linux Mint/6 (Felicia) Firefox/3.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2008121718 Gentoo Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2008121914 Ubuntu/8.04 (hardy) Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2009011301 Gentoo Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009012700 SUSE/3.0.6-0.1 Firefox/3.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020409 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020410 Fedora/3.0.6-1.fc10 Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020410 Fedora/3.0.6-1.fc9 Firefox/3.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020518 Ubuntu/9.04 (jaunty) Firefox/3.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020616 Gentoo Firefox/3.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.04 (hardy) Firefox/3.0.6 FirePHP/0.2.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009022111 Gentoo Firefox/3.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009022714 Ubuntu/9.04 (jaunty) Firefox/3.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009030302 Minefield/3.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.7) Gecko Galeon/2.0.6 (Debian 2.0.6-2.1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.7) Gecko Kazehakase/0.5.4 Debian/0.5.4-2.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.7) Gecko Kazehakase/0.5.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.7) Gecko/2009030719 GranParadiso/3.0.7 FirePHP/0.2.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.7) Gecko/2009032018 Firefox/3.0.4 (Debian-3.0.6-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.7) Gecko/2009032803 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.7) Gecko/2009032803 Iceweasel/3.0.6 (Debian-3.0.6-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Galeon/2.0.6 (Ubuntu 2.0.6-2) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko/20090327 Galeon/2.0.7 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko/2009032811 Iceweasel/3.0.7 (Debian-3.0.7-1) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko/2009033017 GranParadiso/3.0.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.9) Gecko/2009040820 Firefox/3.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.9) Gecko/2009041408 Red Hat/3.0.9-1.el5 Firefox/3.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.9) Gecko/2009042113 Linux Mint/6 (Felicia) Firefox/3.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.9) Gecko/2009042113 Ubuntu/8.10 (intrepid) Firefox/3.0.9 GTB5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.9) Gecko/2009042210 GranParadiso/3.0.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1) Gecko/20090630 Ubuntu/9.04 (jaunty) Shiretoko/3.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1) Gecko/20090701 Linux Mint/7 (Gloria) Shiretoko/3.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1) Gecko/20090701 Ubuntu/9.04 (jaunty) Firefox/3.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1) Gecko/20090701 Ubuntu/9.10 (karmic) Shiretoko/3.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1) Gecko/20090704 Iceweasel/3.5 (Debian-3.5-0) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 GTB5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.11) Gecko/20100701 SeaMonkey/2.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.11) Gecko/20100722 SeaMonkey/2.0.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20101123 SeaMonkey/2.0.11 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20120421 Firefox/11.0 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20120421 Gecko Firefox/11.0 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.17) Gecko/20110123 SeaMonkey/2.0.12 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.17) Gecko/20110303 SeaMonkey/2.0.12 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.17) Gecko/20110309 Lightning/1.0b2pre SeaMonkey/2.0.12 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.18) Gecko/20110320 SeaMonkey/2.0.13 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.19) Gecko/20110429 Gentoo/2.0.14 SeaMonkey/2.0.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.19) Gecko/20110518 SeaMonkey/2.0.14 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.2) Gecko/20090729 Slackware/13.0 Firefox/3.5.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.2) Gecko/20090803 Ubuntu/9.04 (jaunty) Shiretoko/3.5.2 FirePHP/0.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.2pre) Gecko/20090729 Ubuntu/9.04 (jaunty) Firefox/3.5.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.3) Gecko/20090912 Gentoo Firefox/3.5.3 FirePHP/0.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.3) Gecko/20090919 Firefox/3.5.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.3pre) Gecko/20090730 Ubuntu/9.04 (jaunty) Shiretoko/3.5.2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.3pre) Gecko/20090803 Ubuntu/9.04 (jaunty) Shiretoko/3.5.3pre (.NET CLR 3.5.30729) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.4) Gecko/20091028 Ubuntu/9.10 (karmic) Firefox/3.5.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.4pre) Gecko/20090921 Ubuntu/8.10 (intrepid) Shiretoko/3.5.4pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.4pre) Gecko/20090921 Ubuntu/9.04 (jaunty) Shiretoko/3.5.4pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.5) Gecko/20100309 Ubuntu/9.04 (jaunty) Shiretoko/3.5.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.6) Gecko/20100118 Gentoo Firefox/3.5.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100315 Ubuntu/9.10 (karmic) Firefox/3.5.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100318 Mandriva/2.0.4-69.1mib2010.0 SeaMonkey/2.0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100401 Ubuntu/9.10 (karmic) Firefox/3.5.9 GTB7.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100501 Iceweasel/3.5.6 (like Firefox/3.5.6; Debian-3.5.6-2) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100501 Iceweasel/3.5.8 (like Firefox/3.5.8) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b1pre) Gecko/20080916020338 Minefield/3.1b1pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b1pre) Gecko/20080926001251 SeaMonkey/2.0a2pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b1pre) Gecko/20080930020755 Minefield/3.1b1pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b2) Gecko/20090128 Fedora/3.1-0.4.beta2.fc11 Minefield/3.1b2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b3) Gecko/20090407 Firefox/3.1b3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b3pre) Gecko/20081203 Shiretoko/3.1b3pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b3pre) Gecko/20090105 Shiretoko/3.1b3pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b3pre) Gecko/20090106 Shiretoko/3.1b3pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b3pre) Gecko/20090207 Ubuntu/9.04 (jaunty) IceWeasel/3.1b3pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b4pre) Gecko/20090311 Ubuntu/9.04 (jaunty) Shiretoko/3.1b4pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b4pre) Gecko/20090405 SeaMonkey/2.0b1pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b4pre) Gecko/20090405 Shiretoko/3.5b4pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 FirePHP/0.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100115 Ubuntu/10.04 (lucid) Firefox/3.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100128 Gentoo Firefox/3.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100206 Namoroka/3.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.1) Gecko/20100122 firefox/3.6.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.10) Gecko/20100915 Ubuntu/9.04 (jaunty) Firefox/3.6.10 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.10pre) Gecko/20100902 Ubuntu/9.10 (karmic) Firefox/3.6.1pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.12) Gecko/20101114 Gentoo Firefox/3.6.12 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.12pre) Gecko/20101010 Ubuntu/10.04 (lucid) Namoroka/3.6.12pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101206 Prism/1.0b3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.14pre) Gecko/20110105 Firefox/3.6.14pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.15) Gecko/20110303 Ubuntu/10.04 (lucid) Firefox/3.6.15 FirePHP/0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.16) Gecko/20110323 Ubuntu/9.10 (karmic) Firefox/3.6.16 FirePHP/0.5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.16pre) Gecko/20110304 Ubuntu/10.10 (maverick) Firefox/3.6.15pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17pre) Gecko/20110322 Ubuntu/10.10 (maverick) Namoroka/3.6.17pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17pre) Gecko/20110401 Ubuntu/10.04 (lucid) Namoroka/3.6.17Pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.18pre) Gecko/20110419 Ubuntu/10.04 (lucid) Namoroka/3.6.18pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.18pre) Gecko/20110419 Ubuntu/10.10 (maverick) Namoroka/3.6.18pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.18pre) Gecko/20110419 Ubuntu/9.10 (karmic) Namoroka/3.6.18pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.18pre) Gecko/20110509 Ubuntu/10.10 (maverick) Namoroka/3.6.18pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.2pre) Gecko/20100129 Ubuntu/9.10 (karmic) Namoroka/3.6.2pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.2pre) Gecko/20100310 Ubuntu/8.10 (intrepid) Namoroka/3.6.2pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.2pre) Gecko/20100312 Ubuntu/9.04 (jaunty) Firefox/3.6 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.2pre) Gecko/20100315 Ubuntu/9.10 (karmic) Namoroka/3.6.2pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100404 Ubuntu/10.04 (lucid) Firefox/3.6.3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3pre) Gecko/20100316 Ubuntu/9.10 (karmic) Namoroka/3.6.3pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.4) Gecko/20100625 Gentoo Firefox/3.6.4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.7) Gecko/20100726 CentOS/3.6-3.el5.centos Firefox/3.6.7 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.8) Gecko/20100727 Firefox/3.6.8 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.9) Gecko/20100827 Red Hat/3.6.9-2.el6 Firefox/3.6.9 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2a1) Gecko/20090806 Namoroka/3.6a1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2a1pre) Gecko/20090102 Ubuntu/9.04 (jaunty) Minefield/3.2a1pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2a1pre) Gecko/20090327 Minefield/3.6a1pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2a1pre) Gecko/20090403 Minefield/3.6a1pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2a2pre) Gecko/20090825 Namoroka/3.6a2pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2a2pre) Gecko/20090906 Ubuntu/9.04 (jaunty) Namoroka/3.6a2pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2a2pre) Gecko/20090921 Ubuntu/9.04 (jaunty) Namoroka/3.6a2pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.3a1pre) Gecko/20091022 Minefield/3.7a1pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.3a4pre) Gecko/20100404 SeaMonkey/2.1a1pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.3a5pre) Gecko/20100527 Minefield/3.7a5pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a1) Gecko/20051215 Firefox/1.6a1 (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a1) Gecko/20060117 Firefox/1.6a1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a1) Gecko/20060217 Firefox/1.6a1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a1) Gecko/20060609 Minefield/3.0a1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a1) Gecko/20060814 Firefox/3.0a1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a1) Gecko/20060819 Minefield/3.0a1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a1) Gecko/20061016 Minefield/3.0a1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a1) Gecko/20061111 Minefield/3.0a1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a1) Gecko/20061204 GranParadiso/3.0a1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a1) Gecko/20070308 Minefield/3.0a1 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a2) Gecko/20070221 Minefield/3.0a2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a3) Gecko/20070322 GranParadiso/3.0a3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a3) Gecko/20070328 Minefield/3.0a3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a3pre) Gecko/20070301 Minefield/3.0a3pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a3pre) Gecko/20070330 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a4) Gecko/20070427 GranParadiso/3.0a4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a5) Gecko/20070605 GranParadiso/3.0a5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a8pre) Gecko/2007092004 Minefield/3.0a8pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b2) Gecko/2007121016 Firefox/3.0b2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b2) Gecko/2008011913 Minefield/3.0b2 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b2pre) Gecko/2007112704 Minefield/3.0b2pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b3) Gecko/2008020513 Firefox/3.0b3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b3) Gecko/2008021322 Minefield/3.0b3 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b3pre) Gecko/2008010404 Minefield/3.0b3pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b3pre) Gecko/2008010415 Firefox/3.0b +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b3pre) Gecko/2008020507 Firefox/3.0b3pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b4) Gecko/2008031317 Firefox/3.0b4 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b4pre) Gecko/2008021712 Firefox/3.0b4pre (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b4pre) Gecko/2008021714 Firefox/3.0b4pre (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b4pre) Gecko/2008022304 Minefield/3.0b4pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b5) Gecko/2008042623 Iceweasel/3.0b5 (Debian-3.0~b5-3) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5 +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9pre) Gecko/2008032621 Fedora/3.0-0.49.cvs20080326.fc9 Minefield/3.0pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9pre) Gecko/2008040318 Firefox/3.0pre (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9pre) Gecko/2008051917 Firefox/3.0pre Flock/2.0a1pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9pre) Gecko/2008061501 SeaMonkey/2.0a1pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9pre) Gecko/2008061504 Minefield/3.0pre +Mozilla/5.0 (X11; U; Linux i686; en-US; rv:2.0a1pre) Gecko/2008060602 Minefield/4.0a1pre +Mozilla/5.0 (X11; U; Linux i686; en-ZW; rv:1.8.0.7) Gecko/20061018 Firefox/1.5.0.7 +Mozilla/5.0 (X11; U; Linux i686; en-gb) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) epiphany-webkit +Mozilla/5.0 (X11; U; Linux i686; en-us; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.04 (jaunty) Firefox/3.5 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.0.7) Gecko/20060928 Epiphany/2.14 (Ubuntu) +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.1) Gecko/20070117 Epiphany/2.16 BonEcho/2.0.0.1 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.10) Gecko/20071213 Epiphany/2.20 Firefox/2.0.0.10 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.11) Gecko/20071216 Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.12) Gecko/20080208 (Debian-1.8.1.12-2) Epiphany/2.20 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.12) Gecko/20080208 (Debian-1.8.1.12-5) Epiphany/2.20 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.14) Gecko/20080416 Fedora/2.18.3-9.fc7 Epiphany/2.18 Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.14) Gecko/20080418 Epiphany/2.20 Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.17) Gecko/20080927 Epiphany/2.20 Firefox/2.0.0.17 (Dropline GNOME) +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.19) Gecko/20081216 Epiphany/2.20 Firefox/2.0.0.19 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.2) Gecko/20070220 Firefox/2.0.0.2 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.3) Gecko/20061201 Epiphany/2.18 Firefox/2.0.0.3 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.3) Gecko/20070322 Epiphany/2.18 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.3) Gecko/20070403 Epiphany/2.16 Firefox/2.0.0.3 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.4) Gecko/20070508 (Debian-1.8.1.4-1) Epiphany/2.18 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.5) Gecko/20070712 (Debian-1.8.1.5-1) Epiphany/2.18 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9) Gecko/20080528 (Gentoo) Epiphany/2.22 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9) Gecko/2008062113 Iceweasel/3.0 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.12) Gecko/20080528 Epiphany/2.22 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.14) Gecko/20080528 Epiphany/2.22 (Debian/2.26.3-2) +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.15) Gecko/20080528 Epiphany/2.22 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.4) Gecko/20080528 Epiphany/2.22 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.5) Gecko/20080528 Fedora/2.24.1-3.fc10 Epiphany/2.22 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.6) Gecko/20080528 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.7) Gecko/20080528 Epiphany/2.22 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.8) Gecko/20080528 Epiphany/2.22 (Debian/2.24.3-2) +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.8) Gecko/20080528 Epiphany/2.22 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.9) Gecko/20080528 Epiphany/2.22 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9a4) Gecko/20070427 GranParadiso/3.0a4 +Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9b3) Gecko Epiphany/2.20 +Mozilla/5.0 (X11; U; Linux i686; en_GB; rv:1.9.0.1) Gecko/20080528 Epiphany/2.22 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux i686; en_US; rv:1.8.1b1) Gecko/20060813 Firefox/2.0b1 +Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.2.1) Gecko/20021130 +Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4 +Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7 +Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.8.1.12) Gecko/20080207 Ubuntu/7.10 (gutsy) Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.8.1.3) Gecko/20070310 Iceweasel/2.0.0.3 (Debian-2.0.0.3-1) +Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.8.1.4) Gecko/20070508 Iceweasel/2.0.0.4 (Debian-2.0.0.4-0etch1) +Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.8.1.6) Gecko/20070723 Iceweasel/2.0.0.6 (Debian-2.0.0.6-0etch1+lenny1) +Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.8.1.6) Gecko/20070803 Firefox/2.0.0.6 (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.8.1.6) Gecko/20070914 Firefox/2.0.0.7 +Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9.0.4) Gecko/2008111317 Linux Mint/5 (Elyssa) Firefox/3.0.4 +Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9.0.4) Gecko/2008111317 Ubuntu/8.04 (hardy) Firefox/3.0.4 +Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9.0.7) Gecko/2009032803 Iceweasel/3.0.6 (Debian-3.0.6-1) +Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9.0.9) Gecko/2009042113 Ubuntu/9.04 (jaunty) Firefox/3.0.9 +Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.8 +Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 +Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9b5) Gecko/2008041514 Firefox/3.0b5 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.7.12) Gecko/20050929 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.0.1) Gecko/20060124 Firefox/1.5.0.1 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.0.11) Gecko/20070327 Ubuntu/dapper-security Firefox/1.5.0.11 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.0.7) Gecko/20060830 Firefox/1.5.0.7 (Debian-1.5.dfsg+1.5.0.7-1~bpo.1) +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.12) Gecko/20080213 Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.13) Gecko/20080311 Iceweasel/2.0.0.13 (Debian-2.0.0.13-0etch1) +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.14) Gecko/20080404 Iceweasel/2.0.0.14 (Debian-2.0.0.14-0etch1) +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.14) Gecko/20080404 Iceweasel/2.0.0.14 (Debian-2.0.0.14-2) +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.14) Gecko/20080419 Ubuntu/8.04 (hardy) Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.18) Gecko/20081030 Iceweasel/2.0.0.18 (Debian-2.0.0.18-0etch1) +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.2) Gecko/20060601 Firefox/2.0.0.2 (Ubuntu-edgy) +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.2) Gecko/20070220 Firefox/2.0.0.2 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.2) Gecko/20070225 Firefox/2.0.0.2 (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.4) Gecko/20061201 Firefox/2.0.0.4 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.5) Gecko/20070718 Fedora/2.0.0.5-1.fc7 Firefox/2.0.0.5 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.9) Gecko/20071025 Iceweasel/2.0.0.9 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.9) Gecko/20071025 Iceweasel/2.0.0.9 (Debian-2.0.0.9-2) +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.0.10) Gecko/2009042513 Linux Mint/5 (Elyssa) Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.0.11) Gecko/2009060309 Linux Mint/5 (Elyssa) Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.0.11) Gecko/2009060310 Ubuntu/8.10 (intrepid) Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.0.11) Gecko/2009061118 Fedora/3.0.11-1.fc9 Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.0.11) Gecko/2009061212 Iceweasel/3.0.6 (Debian-3.0.6-1) +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.0.11) Gecko/2009061319 Iceweasel/3.0.11 (Debian-3.0.11-1) +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.0.14) Gecko/2009090216 Firefox/3.0.14 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.1.16) Gecko/20111108 Iceweasel/3.5.16 (like Firefox/3.5.16) +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.1.6) Gecko/20091201 SUSE/3.5.6-1.1.1 Firefox/3.5.6 GTB6 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.1.7) Gecko/20091222 SUSE/3.5.7-1.1.1 Firefox/3.5.7 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.1.9) Gecko/20100317 SUSE/3.5.9-0.1 Firefox/3.5.9 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.2.13) Gecko/20101206 Ubuntu/9.10 (karmic) Firefox/3.6.13 +Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.2.17pre) Gecko/20110404 Ubuntu/10.10 (Maverick) Namoroka/3.6.17pre +Mozilla/5.0 (X11; U; Linux i686; eu; rv:1.9.0.6) Gecko/2009012700 SUSE/3.0.6-0.1.2 Firefox/3.0.6 +Mozilla/5.0 (X11; U; Linux i686; fa; rv:1.8.1.4) Gecko/20100527 Firefox/3.6.4 +Mozilla/5.0 (X11; U; Linux i686; fi-FI; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux i686; fi-FI; rv:1.9.0.13) Gecko/2009080315 Linux Mint/6 (Felicia) Firefox/3.0.13 +Mozilla/5.0 (X11; U; Linux i686; fi-FI; rv:1.9.0.5) Gecko/2008121622 Ubuntu/8.10 (intrepid) Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux i686; fi-FI; rv:1.9.0.9) Gecko/2009042113 Ubuntu/9.04 (jaunty) Firefox/3.0.9 +Mozilla/5.0 (X11; U; Linux i686; fi-FI; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8 +Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:0.9.4) Gecko/20011126 Netscape6/6.2.1 +Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.0.0) Gecko/20020623 Debian/1.0.0-0.woody.1 +Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.0.1) Gecko/20020823 Netscape/7.0 +Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.5) Gecko/20031007 +Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.7.10) Gecko/20050716 Firefox/1.0.6 +Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.7.10) Gecko/20050925 Firefox/1.0.4 (Debian package 1.0.4-2sarge5) +Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.7.3) Gecko/20040913 +Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.7.8) Gecko/20050511 Firefox/1.0.4 +Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8) Gecko/20051111 Firefox/1.5 +Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.0.8) Gecko/20061029 SeaMonkey/1.0.6 +Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 +Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.1.6) Gecko/20080208 Ubuntu/7.10 (gutsy) Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.9.0.5) Gecko/2008123017 Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.9.0.7) Gecko/2009030719 GranParadiso/3.0.7 +Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.9.1) Gecko/20090624 Ubuntu/9.04 (jaunty) Firefox/3.5 +Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 +Mozilla/5.0 (X11; U; Linux i686; fr-be; rv:1.9.0.8) Gecko/2009073022 Ubuntu/9.04 (jaunty) Firefox/3.0.13 +Mozilla/5.0 (X11; U; Linux i686; fr-fr) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori/1.19 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.7.10) Gecko/20050721 Firefox/1.0.6 (Ubuntu package 1.0.6) +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.7.10) Gecko/20050925 Firefox/1.0.4 (Debian package 1.0.4-2sarge5) +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.7.12) Gecko/20050922 Fedora/1.0.7-1.1.fc4 Firefox/1.0.7 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.7.12) Gecko/20050922 Firefox/1.0.7 (Debian package 1.0.7-1) +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.7.12) Gecko/20051010 Firefox/1.0.7 (Ubuntu package 1.0.7) +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.7.2) Gecko/20040804 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.7.8) Gecko/20050524 Fedora/1.0.4-4 Firefox/1.0.4 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8) Gecko/20051111 Firefox/1.5 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8) Gecko/20060110 Debian/1.5.dfsg-4 Firefox/1.5 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.1) Gecko/20060124 Firefox/1.5.0.1 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.10) Gecko/20070223 Fedora/1.5.0.10-1.fc5 Firefox/1.5.0.10 pango-text +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.5) Gecko/20060731 Ubuntu/dapper-security Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.7) Gecko/20060921 Ubuntu/dapper-security Firefox/1.5.0.7 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.8) Gecko/20061213 Firefox/1.5.0.8 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1) Gecko/20060916 Firefox/2.0b2 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1) Gecko/20060918 Firefox/2.0b2 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.1) Gecko/20060601 Firefox/2.0.0.1 (Ubuntu-edgy) +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.12) Gecko/20080208 Fedora/2.0.0.12-1.fc8 Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.13) Gecko/20080311 Iceweasel/2.0.0.13 (Debian-2.0.0.13-1) +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.16) Gecko/20080702 Iceweasel/2.0.0.16 (Debian-2.0.0.16-0etch1) +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.19) Gecko/20081216 Ubuntu/7.10 (gutsy) Firefox/2.0.0.19 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.2) Gecko/20060601 Firefox/2.0.0.2 (Ubuntu-edgy) +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.3) Gecko/20070310 Firefox/2.0.0.3 (Debian-2.0.0.3-2) +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.3) Gecko/20070310 Iceweasel/2.0.0.3 (Debian-2.0.0.3-1) +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.3) Gecko/20070310 Iceweasel/2.0.0.3 (Debian-2.0.0.3-2) +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.6) Gecko/20071008 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy) Firefox/2.0.0.8 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.8) Gecko/20071030 Fedora/2.0.0.8-2.fc8 Firefox/2.0.0.8 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.1) Gecko/2008070206 Firefox/2.0.0.8 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.10) Gecko/2009042513 Ubuntu/8.04 (hardy) Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.10) Gecko/2009042708 Fedora/3.0.10-1.fc10 Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.13) Gecko/2009082121 Iceweasel/3.0.6 (Debian-3.0.6-1) +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.19) Gecko/2010102906 Iceweasel/3.0.6 (Debian-3.0.6-3) +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.19) Gecko/2011092908 Iceweasel/3.0.6 (Debian-3.0.6-3) +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.2) Gecko/2008092318 Fedora/3.0.2-1.fc9 Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.03 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.7) Gecko/2009030422 Ubuntu/8.10 (intrepid) Firefox/3.0.7 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.7) Gecko/2009031218 Gentoo Firefox/3.0.7 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.9) Gecko/2009042113 Ubuntu/8.04 (hardy) Firefox/3.0.9 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.9) Gecko/2009042113 Ubuntu/9.04 (jaunty) Firefox/3.0.9 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.1) Gecko/20090624 Firefox/3.5 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.1.16) Gecko/20120714 Iceweasel/3.5.16 (like Firefox/3.5.16) +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.1.3) Gecko/20090913 Firefox/3.5.3 +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.2.17pre) Gecko/20110322 Ubuntu/10.10 (maverick) Namoroka/3.6.17pre +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.2.17pre) Gecko/20110413 Ubuntu/10.04 (lucid) Namoroka/3.6.17pre +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.2.18pre) Gecko/20110419 Ubuntu/10.04 (lucid) Namoroka/3.6.18pre +Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 +Mozilla/5.0 (X11; U; Linux i686; hu-HU; rv:1.3.1) Gecko +Mozilla/5.0 (X11; U; Linux i686; hu-HU; rv:1.7.12) Gecko/20051010 Firefox/1.0.7 (Ubuntu package 1.0.7) +Mozilla/5.0 (X11; U; Linux i686; hu-HU; rv:1.9.0.10) Gecko/2009042718 CentOS/3.0.10-1.el5.centos Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux i686; hu-HU; rv:1.9.0.7) Gecko/2009030422 Ubuntu/8.10 (intrepid) Firefox/3.0.7 FirePHP/0.2.4 +Mozilla/5.0 (X11; U; Linux i686; hu-HU; rv:1.9.1.9) Gecko/20100330 Fedora/3.5.9-1.fc12 Firefox/3.5.9 +Mozilla/5.0 (X11; U; Linux i686; hu-hu) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori +Mozilla/5.0 (X11; U; Linux i686; hu; rv:1.7.3) Gecko/20050130 +Mozilla/5.0 (X11; U; Linux i686; hu; rv:1.7.3) Gecko/20050130 Galeon/1.3.19 +Mozilla/5.0 (X11; U; Linux i686; hu; rv:1.8.0.7) Gecko/20060911 SUSE/1.5.0.7-0.1 Firefox/1.5.0.7 +Mozilla/5.0 (X11; U; Linux i686; hu; rv:1.8.1.1) Gecko/20061208 Firefox/2.0.0.1 +Mozilla/5.0 (X11; U; Linux i686; hu; rv:1.8.1.2) Gecko/20070220 Firefox/2.0.0.2 +Mozilla/5.0 (X11; U; Linux i686; hu; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy) Firefox/2.0.0.8 +Mozilla/5.0 (X11; U; Linux i686; hu; rv:1.8b4) Gecko/20050827 Firefox/1.0+ +Mozilla/5.0 (X11; U; Linux i686; it-IT; rv:1.1) Gecko/20020826 +Mozilla/5.0 (X11; U; Linux i686; it-IT; rv:1.7.12) Gecko/20051010 Firefox/1.0.7 (Ubuntu package 1.0.7) +Mozilla/5.0 (X11; U; Linux i686; it-IT; rv:1.9.0.11) Gecko/2009060308 Linux Mint/7 (Gloria) Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux i686; it-IT; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.04 (jaunty) Firefox/3.5 +Mozilla/5.0 (X11; U; Linux i686; it-IT; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.25 (jaunty) Firefox/3.8 +Mozilla/5.0 (X11; U; Linux i686; it-it) AppleWebKit/531.2+ (KHTML, like Gecko) Safari/531.2+ Epiphany/2.30.2 +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.8) Gecko/20060113 Firefox/1.5 +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.8.0.1) Gecko/20060124 Firefox/1.5.0.1 +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.8.1.12) Gecko/20080129 Iceweasel/2.0.0.12 (Debian-2.0.0.12-0etch1) +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.8.1.12) Gecko/20080129 Iceweasel/2.0.0.12 (Debian-2.0.0.12-1) +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.8.1.14) Gecko/20080416 Fedora/2.0.0.14-1.fc7 Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.8.1.14) Gecko/20080420 Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.8.1.3) Gecko/20070406 Firefox/2.0.0.3 +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.8.1.3) Gecko/20070410 Firefox/2.0.0.3 +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.8.1.4) Gecko/20060601 Firefox/2.0.0.4 (Ubuntu-edgy) +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.8.1.4) Gecko/20070621 Firefox/2.0.0.4 +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9) Gecko/2008061015 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.0.1) Gecko/2008071618 Iceweasel/3.0.1 (Debian-3.0.1-1) +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.0.11) Gecko/2009061118 Fedora/3.0.11-1.fc10 Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.0.19) Gecko/2010120923 Iceweasel/3.0.6 (Debian-3.0.6-3) +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.0.4) Gecko/2008111217 Red Hat Firefox/3.0.4 +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.0.5) Gecko/2008121711 Ubuntu/9.04 (jaunty) Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.0.6) Gecko/2009020409 Iceweasel 3.0.6 (Debian 5.0 +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.1.16) Gecko/20120602 Iceweasel/3.5.16 (like Firefox/3.5.16) +Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.2.13) Gecko/20110109 Iceweasel/3.6.13 (like Firefox/3.6.13) +Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.9.1.8) Gecko/20100216 Fedora/3.5.8-1.fc12 Firefox/3.5.8 +Mozilla/5.0 (X11; U; Linux i686; ja-jp) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori +Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.0.10) Gecko/20070510 Fedora/1.5.0.10-6.fc6 Firefox/1.5.0.10 +Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.1.11) Gecko/20071128 Firefox/2.0.0.11 (Debian-2.0.0.11-1) +Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.1.11) Gecko/20071128 Iceweasel/2.0.0.11 (Debian-2.0.0.11-1) +Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3 +Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.9.0.5) Gecko/2008121622 Ubuntu/8.10 (intrepid) Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.9.0.7) Gecko/2009032803 Iceweasel/3.0.6 (Debian-3.0.6-1) +Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729) +Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.9.1.6) Gecko/20091216 Shiretoko/3.5.6 +Mozilla/5.0 (X11; U; Linux i686; ko-KR; rv:1.8.0.7) Gecko/20060913 Fedora/1.5.0.7-1.fc5 Firefox/1.5.0.7 pango-text +Mozilla/5.0 (X11; U; Linux i686; ko-KR; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux i686; ko-KR; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.10 (maverick) Firefox/3.6.12 +Mozilla/5.0 (X11; U; Linux i686; ko-KR; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3 +Mozilla/5.0 (X11; U; Linux i686; lt-LT; rv:1.6) Gecko/20051114 Firefox/1.5 +Mozilla/5.0 (X11; U; Linux i686; lt; rv:1.6) Gecko/20051114 Firefox/1.5 +Mozilla/5.0 (X11; U; Linux i686; nb-NO; rv:1.8.1.3) Gecko/20070310 Firefox/2.0.0.3 (Debian-2.0.0.3-1) +Mozilla/5.0 (X11; U; Linux i686; nb-NO; rv:1.8.1.3) Gecko/20070310 Iceweasel/2.0.0.3 (Debian-2.0.0.3-1) +Mozilla/5.0 (X11; U; Linux i686; nb-NO; rv:1.9.1.10) Gecko/20100623 Fedora/2.0.5-1.fc12 Fedora SeaMonkey/2.0.3 +Mozilla/5.0 (X11; U; Linux i686; nb-NO; rv:1.9.1.16) Gecko/20110420 SeaMonkey/2.0.14 +Mozilla/5.0 (X11; U; Linux i686; nl-NL; rv:1.8.1.9) Gecko/20071105 Firefox/2.0.0.9 +Mozilla/5.0 (X11; U; Linux i686; nl-NL; rv:1.9.0.19) Gecko/20090720 Firefox/3.5.1 +Mozilla/5.0 (X11; U; Linux i686; nl-NL; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 +Mozilla/5.0 (X11; U; Linux i686; nl-nl) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori +Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.0.12) Gecko/20070601 Ubuntu/dapper-security Firefox/1.5.0.12 +Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4 +Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 +Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.1.1) Gecko/20070311 Firefox/2.0.0.1 +Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.1.3) Gecko/20060601 Firefox/2.0.0.3 (Ubuntu-edgy) +Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.1b2) Gecko/20060821 BonEcho/2.0b2 (Debian-1.99+2.0b2+dfsg-1) +Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9) Gecko/2008061015 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.0.11) Gecko/2009060309 Ubuntu/8.04 (hardy) Firefox/3.0.4 +Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.0.11) Gecko/2009061212 Iceweasel/3.0.6 (Debian-3.0.6-1) +Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.0.4) Gecko/2008111317 Ubuntu/8.04 (hardy) Firefox/3.0.4 +Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 +Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.1.9) Gecko/20100401 Ubuntu/9.10 (karmic) Firefox/3.5.9 +Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.2.15) Gecko/20110303 Ubuntu/8.04 (hardy) Firefox/3.6.15 +Mozilla/5.0 (X11; U; Linux i686; pl-PL) AppleWebKit/533.3 (KHTML, like Gecko) rekonq Safari/533.3 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.7.10) Gecko/20050717 Firefox/1.0.6 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.7.10) Gecko/20050730 Firefox/1.0.6 (Debian package 1.0.6-2) +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.7.12) Gecko/20051010 Firefox/1.0.7 (Ubuntu package 1.0.7) +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.0.1) Gecko/20060130 SeaMonkey/1.0 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.0.1) Gecko/20060313 Fedora/1.5.0.1-9 Firefox/1.5.0.1 pango-text Mnenhy/0.7.3.0 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.0.5) Gecko/20060731 Ubuntu/dapper-security Firefox/1.5.0.5 Mnenhy/0.7.4.666 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.0.7) Gecko/20060914 Firefox/1.5.0.7 (Swiftfox) Mnenhy/0.7.4.666 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.1) Gecko/20061010 Firefox/2.0 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.1.1) Gecko/20061205 Iceweasel/2.0.0.1 (Debian-2.0.0.1+dfsg-1) +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.1.10) Gecko/20071126 Ubuntu/7.10 (gutsy) Firefox/2.0.0.10 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.1.10) Gecko/20071128 Fedora/2.0.0.10-2.fc7 Firefox/2.0.0.10 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.1.10) Gecko/20071213 Fedora/2.0.0.10-3.fc8 Firefox/2.0.0.10 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.1.14) Gecko/20080404 Iceweasel/2.0.0.14 (Debian-2.0.0.14-0etch1) +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.1.2) Gecko/20060601 Firefox/2.0.0.2 (Ubuntu-edgy) +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.1.3) Gecko/20061201 Firefox/2.0.0.3 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy) Firefox/2.0.0.8 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.1) Gecko/2008071222 Firefox/3.0.1 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.1) Gecko/2008071719 Firefox/3.0.1 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.10) Gecko/2009042513 Ubuntu/8.04 (hardy) Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.13) Gecko/2009080315 Ubuntu/9.04 (jaunty) Firefox/3.0.13 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.25 (jaunty) Firefox/3.8 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/20121223 Ubuntu/9.25 (jaunty) Firefox/3.8 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.3) Gecko/2008092700 SUSE/3.0.3-2.2 Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.4) Gecko/20081031100 SUSE/3.0.4-4.6 Firefox/3.0.4 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.5) Gecko/2008121300 SUSE/3.0.5-0.1 Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.5) Gecko/2008121622 Slackware/2.6.27-PiP Firefox/3.0 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.6) Gecko/2009020911 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.7) Gecko/2009030422 Kubuntu/8.10 (intrepid) Firefox/3.0.9 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.7) Gecko/2009030503 Fedora/3.0.7-1.fc10 Firefox/3.0.7 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.9) Gecko/2009042113 Ubuntu/8.10 (intrepid) Firefox/3.0.9 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.2.10) Gecko/20100915 Ubuntu/10.04 (lucid) Firefox/3.6.10 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.2a1pre) Gecko/20090128 Kubuntu/8.10 (intrepid) Minefield/3.2a1pre +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.2a1pre) Gecko/20090330 Kubuntu/8.10 (intrepid) Minefield/3.2a1pre +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9b4) Gecko/2008030800 SUSE/2.9.94-4.2 Firefox/3.0b4 +Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5 +Mozilla/5.0 (X11; U; Linux i686; pl-pl) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) epiphany-browser +Mozilla/5.0 (X11; U; Linux i686; pl-pl) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori +Mozilla/5.0 (X11; U; Linux i686; pl-pl) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) midori +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8) Gecko/20051111 Firefox/1.5 +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8) Gecko/20051111 Firefox/1.5 Ubuntu +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.1) Gecko/20060124 Firefox/1.5.0.1 +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.1) Gecko/20060124 Firefox/1.5.0.1 Ubuntu +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.1) Gecko/20060201 Firefox/1.5.0.1 (Swiftfox) Mnenhy/0.7.3.0 +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.1) Gecko/20060313 Fedora/1.5.0.1-9 Firefox/1.5.0.1 pango-text Mnenhy/0.7.3.0 +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.1) Gecko/20060314 Flock/0.5.13.2 +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.4) Gecko/20060527 SUSE/1.5.0.4-1.7 Firefox/1.5.0.4 Mnenhy/0.7.4.0 +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.4) Gecko/20060614 Fedora/1.5.0.4-1.2.fc5 Firefox/1.5.0.4 pango-text Mnenhy/0.7.4.0 +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.5) Gecko/20060801 Firefox/1.5.0.5 Flock/0.7.4.1 +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.7) Gecko/20060914 Firefox/1.5.0.7 (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1) Gecko/20061003 Firefox/2.0 Ubuntu +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0 +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0 Ubuntu +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1) Gecko/20061024 Firefox/2.0 (Swiftfox) +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1) Gecko/20061127 Firefox/2.0 +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1) Gecko/20061127 Firefox/2.0 (Gentoo Linux) +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1 (Ubuntu-edgy) +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1.2) Gecko/20070220 Firefox/2.0.0.2 +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6 +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1b1) Gecko/20060710 Firefox/2.0b1 +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.9.0.6) Gecko/2009011912 Firefox/3.0.6 +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.9.2.18) Gecko/20110614 Firefox/3.6.18 ( .NET CLR 3.5.30729; .NET4.0E) +Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.9.2a1) Gecko/20090806 Namoroka/3.6a1 (Debian GNU/Linux Sid) +Mozilla/5.0 (X11; U; Linux i686; pt-BR) AppleWebKit/533.3 (KHTML, like Gecko) Navscape/Pre-0.2 Safari/533.3 +Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.7.10) Gecko/20050717 Firefox/1.0.6 +Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.7.12) Gecko/20051010 Firefox/1.0.7 (Ubuntu package 1.0.7) +Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.8) Gecko/20051111 Firefox/1.5 +Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.8.0.3) Gecko/20060523 Ubuntu/dapper Firefox/1.5.0.3 +Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4 +Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 +Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.8.1.1) Gecko/20061208 Firefox/2.0.0.1 +Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.8.1.3) Gecko/20070310 Iceweasel/2.0.0.3 (Debian-2.0.0.3-1) +Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.8.1.4) Gecko/20070509 SeaMonkey/1.1.2 +Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.9.0.4) Gecko/2008111217 Fedora/3.0.4-1.fc10 Firefox/3.0.4 +Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.9.0.4) Gecko/2008111317 Ubuntu/8.04 (hardy) Firefox/3.0.4 +Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.9.2.13) Gecko/20101209 Fedora/3.6.13-1.fc13 Firefox/3.6.13 +Mozilla/5.0 (X11; U; Linux i686; pt-PT; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; Linux i686; pt-PT; rv:1.9.0.5) Gecko/2008121622 Ubuntu/8.10 (intrepid) Firefox/3.0.4 +Mozilla/5.0 (X11; U; Linux i686; pt-PT; rv:1.9.2.3) Gecko/20100402 Iceweasel/3.6 (like Firefox/3.6) GTB7.0 +Mozilla/5.0 (X11; U; Linux i686; pt-PT; rv:1.9.2.3) Gecko/20100402 Iceweasel/3.6.3 (like Firefox/3.6.3) GTB7.0 +Mozilla/5.0 (X11; U; Linux i686; pt-br; rv:1.8.1) Gecko/20061010 Firefox/2.0 Midori/0.2.0 +Mozilla/5.0 (X11; U; Linux i686; pt-pt) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori +Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.7.6) Gecko/20050318 Firefox/1.0.2 +Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.8.1.11) Gecko/20071201 Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.9.1.2) Gecko/20090804 Firefox/3.5.2 +Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.9.2a1pre) Gecko/20090405 Ubuntu/9.04 (jaunty) Firefox/3.6a1pre +Mozilla/5.0 (X11; U; Linux i686; ru-ru) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori +Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4 +Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.8.0.7) Gecko/20060921 Ubuntu/dapper-security Firefox/1.5.0.7 +Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.8.1.11) Gecko/20080131 Firefox/2.0.0.11 Flock/1.0.8 +Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.8.1.8) Gecko/20071004 Iceweasel/2.0.0.8 (Debian-2.0.0.6+2.0.0.8-0etch1) +Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy) Firefox/2.0.0.8 +Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9) Gecko/2008061812 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1 +Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.1) Gecko/2008071719 Firefox/3.0.1 +Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.5) Gecko/2008120121 Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.5) Gecko/2008121622 Ubuntu/8.10 (intrepid) Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.8) Gecko/2009032711 +Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.1.3) Gecko/20091020 Ubuntu/10.04 (lucid) Firefox/4.0.1 +Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.1.3) Gecko/20091020 Ubuntu/9.10 (karmic) Firefox/3.5.3 +Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13 +Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8 +Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.3a5pre) Gecko/20100526 Firefox/3.7a5pre +Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008032600 SUSE/2.9.95-25.1 Firefox/3.0b5 +Mozilla/5.0 (X11; U; Linux i686; rv:1.7.3) Gecko/20040913 Firefox/0.10 +Mozilla/5.0 (X11; U; Linux i686; rv:1.7.3) Gecko/20040914 Firefox/0.10 +Mozilla/5.0 (X11; U; Linux i686; rv:1.7.3) Gecko/20040914 Firefox/0.10.1 +Mozilla/5.0 (X11; U; Linux i686; rv:1.7.3) Gecko/20041001 Firefox/0.10.1 +Mozilla/5.0 (X11; U; Linux i686; rv:1.7.3) Gecko/20041020 Firefox/0.10.1 +Mozilla/5.0 (X11; U; Linux i686; rv:1.7.8) Gecko/20050831 Debian/1.7.8-1sarge2 +Mozilla/5.0 (X11; U; Linux i686; rv:1.7.8) Gecko/20050831 Epiphany/1.4.8 (Debian) +Mozilla/5.0 (X11; U; Linux i686; rv:1.7.8) Gecko/20050927 Debian/1.7.8-1sarge3 +Mozilla/5.0 (X11; U; Linux i686; rv:1.7.8) Gecko/20060628 Debian/1.7.8-1sarge7.1 +Mozilla/5.0 (X11; U; Linux i686; rv:1.7.8) Gecko/20060628 Epiphany/1.4.8 (Debian) +Mozilla/5.0 (X11; U; Linux i686; rv:1.7.8) Gecko/20060904 Debian/1.7.8-1sarge7.2.2 +Mozilla/5.0 (X11; U; Linux i686; rv:1.7.8) Gecko/20061113 Debian/1.7.8-1sarge8 +Mozilla/5.0 (X11; U; Linux i686; rv:1.8.0.1) Gecko/20060124 Firefox/1.5.0.1 +Mozilla/5.0 (X11; U; Linux i686; rv:1.9) Gecko/2008080808 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux i686; rv:1.9) Gecko/20080810020329 Firefox/3.0.1 +Mozilla/5.0 (X11; U; Linux i686; rv:1.9.1a2pre) Gecko/20080824052448 SeaMonkey/2.0a1pre +Mozilla/5.0 (X11; U; Linux i686; sk; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7 +Mozilla/5.0 (X11; U; Linux i686; sk; rv:1.9) Gecko/2008061015 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux i686; sk; rv:1.9.0.5) Gecko/2008121621 Ubuntu/8.04 (hardy) Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux i686; sk; rv:1.9.1) Gecko/20090630 Fedora/3.5-1.fc11 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux i686; sv-SE; rv:1.8.0.13pre) Gecko/20071126 Ubuntu/dapper-security Firefox/1.5.0.13pre +Mozilla/5.0 (X11; U; Linux i686; sv-SE; rv:1.8.0.5) Gecko/20060731 Ubuntu/dapper-security Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; Linux i686; sv-SE; rv:1.8.0.8) Gecko/20061108 Fedora/1.5.0.8-1.fc5 Firefox/1.5.0.8 +Mozilla/5.0 (X11; U; Linux i686; sv-SE; rv:1.8.1.2) Gecko/20061023 SUSE/2.0.0.2-1.1 Firefox/2.0.0.2 +Mozilla/5.0 (X11; U; Linux i686; sv-SE; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux i686; sv-SE; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 +Mozilla/5.0 (X11; U; Linux i686; sv-se) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori +Mozilla/5.0 (X11; U; Linux i686; sv-se) AppleWebKit/531.2+ (KHTML, like Gecko) Safari/531.2+ Epiphany/2.30.6 +Mozilla/5.0 (X11; U; Linux i686; tr-TR; rv:1.8.1) Gecko/20061023 SUSE/2.0-30 Firefox/2.0 +Mozilla/5.0 (X11; U; Linux i686; tr-TR; rv:1.9.0) Gecko/2008061600 SUSE/3.0-1.2 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux i686; tr-TR; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux i686; tr-TR; rv:1.9b5) Gecko/2008032600 SUSE/2.9.95-25.1 Firefox/3.0b5 +Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.2.1) Gecko/20030225 +Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.4.1) Gecko/20031114 +Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.1.6) Gecko/20091216 Fedora/3.5.6-1.fc11 Firefox/3.5.6 GTB6 +Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.1.8) Gecko/20100216 Fedora/3.5.8-1.fc12 Firefox/3.5.8 +Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.2.8) Gecko/20100722 Ubuntu/10.04 (lucid) Firefox/3.6.8 +Mozilla/5.0 (X11; U; Linux i686; zh-TW; rv:1.8.0.10) Gecko/20070508 Fedora/1.5.0.10-1.fc5 Firefox/1.5.0.10 +Mozilla/5.0 (X11; U; Linux i686; zh-TW; rv:1.8.1) Gecko/20061010 Firefox/2.0 +Mozilla/5.0 (X11; U; Linux i686; zh-TW; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3 +Mozilla/5.0 (X11; U; Linux i686; zh-TW; rv:1.9.0.13) Gecko/2009080315 Ubuntu/9.04 (jaunty) Firefox/3.0.13 +Mozilla/5.0 (X11; U; Linux i686; zh-TW; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux i686; zh-TW; rv:1.9.0.5) Gecko/2009012219 Firefox/3.0.5 Flock/2.0.3 +Mozilla/5.0 (X11; U; Linux i686; zh-TW; rv:1.9.0.7) Gecko/2009030422 Ubuntu/8.04 (hardy) Firefox/3.0.7 +Mozilla/5.0 (X11; U; Linux i686; zh-cn) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori +Mozilla/5.0 (X11; U; Linux i686; zh-tw) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori +Mozilla/5.0 (X11; U; Linux i686;en-US; rv:1.2.1) Gecko/20030225 +Mozilla/5.0 (X11; U; Linux ia64; de; rv:1.9.1.11) Gecko/20100820 Lightning/1.0b2pre SeaMonkey/2.0.6 +Mozilla/5.0 (X11; U; Linux ia64; de; rv:1.9.1.18) Gecko/20110331 Lightning/1.0b2pre SeaMonkey/2.0.13 +Mozilla/5.0 (X11; U; Linux ia64; de; rv:1.9.1.19) Gecko/20110429 Lightning/1.0b2pre SeaMonkey/2.0.14 +Mozilla/5.0 (X11; U; Linux ia64; en-US; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux ia64; pl; rv:1.8.0.5) Gecko/20060801 Firefox/1.5.0.5 Flock/0.7.4.1 +Mozilla/5.0 (X11; U; Linux mips; en-US; rv:1.8.1.1) Gecko/20070628 BonEcho/2.0.0.1 +Mozilla/5.0 (X11; U; Linux ppc64; en-US; rv:1.8.1.14) Gecko/20080418 Ubuntu/7.10 (gutsy) Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux ppc; da-DK; rv:1.7.12) Gecko/20051010 Firefox/1.0.7 (Ubuntu package 1.0.7) +Mozilla/5.0 (X11; U; Linux ppc; de; rv:1.8.1.15) Gecko/20080612 Iceweasel/2.0.0.15 (Debian-2.0.0.15-0etch1) +Mozilla/5.0 (X11; U; Linux ppc; en-GB; rv:1.9.0.12) Gecko/2009070818 Ubuntu/8.10 (intrepid) Firefox/3.0.12 +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.0.0) Gecko/20020622 Debian/1.0.0-0.woody.1 +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.1) Gecko/20020927 +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.4) Gecko/20030714 Debian/1.4-2 +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.7.12) Gecko/20051222 Firefox/1.0.7 +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.8.0.11) Gecko/20070217 Iceape/1.0.8 (Debian-1.0.8-4) +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.8.0.13pre) Gecko/20070505 Iceape/1.0.9 (Debian-1.0.10~pre070720-0etch1) +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.8.0.6) Gecko/20060815 SeaMonkey/1.0.4 +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.8.0.9) Gecko/20061219 Iceape/1.0.7 (Debian-1.0.7-2) +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.8.0.9) Gecko/20061219 Iceape/1.0.7 (Debian-1.0.7-3) +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.8.1.1) Gecko/20061219 BonEcho/2.0.0.1 +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.8.1.13) Gecko/20080313 Iceape/1.1.9 (Debian-1.1.9-5) +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.8.1.3) Gecko/20070310 Firefox/2.0.0.3 (Debian-2.0.0.3-1) +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.8.1.3) Gecko/20070310 Iceweasel/2.0.0.3 (Debian-2.0.0.3-1) +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.9) Gecko/2008062909 Iceweasel/3.0 (Debian-3.0~rc2-2) +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.9.0.1) Gecko/2008072112 Iceweasel/3.0.1 (Debian-3.0.1-1) +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.9.0.1) Gecko/2008072112 Iceweasel/3.0.3 (Debian-3.0.3-2) +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.9.0.4) Gecko/2008111317 Ubuntu/8.04 (hardy) Firefox/3.0.4 +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.9a8) Gecko/2007100620 GranParadiso/3.0a8 +Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.9a8) Gecko/2007100620 GranParadiso/3.1 +Mozilla/5.0 (X11; U; Linux ppc; en; rv:1.8.1.13) Gecko/20080325 Epiphany/2.20 Firefox/2.0.0.13 +Mozilla/5.0 (X11; U; Linux ppc; fr; rv:1.8.1.13) Gecko/20080313 Iceape/1.1.9 (Debian-1.1.9-5) +Mozilla/5.0 (X11; U; Linux ppc; fr; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.10 (maverick) Firefox/3.6.12 +Mozilla/5.0 (X11; U; Linux sparc64; en-GB; rv:1.8.1.11) Gecko/20071217 Galeon/2.0.3 Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; Linux sparc64; en-US; rv:1.8.0.14eol) Gecko/20070505 (Debian-1.8.0.15~pre080323b-0etch2) Epiphany/2.14 +Mozilla/5.0 (X11; U; Linux sparc64; en-US; rv:1.8.1.14) Gecko/20080404 Iceweasel/2.0.0.14 (Debian-2.0.0.14-0etch1) +Mozilla/5.0 (X11; U; Linux sparc64; en-US; rv:1.8.1.17) Gecko/20081108 Firefox/2.0.0.17 +Mozilla/5.0 (X11; U; Linux sparc64; es-PY; rv:5.0) Gecko/20100101 IceCat/5.0 (like Firefox/5.0; Debian-6.0.1) +Mozilla/5.0 (X11; U; Linux x64; en-US; rv:1.8.1.6) Gecko/20070723 Iceweasel/2.0.0.6 (Debian-2.0.0.6-1) +Mozilla/5.0 (X11; U; Linux x64; en-US; rv:1.8.1.7) Gecko/20070914 Iceweasel/2.0.0.7 (Debian-2.0.0.7-1) +Mozilla/5.0 (X11; U; Linux x64_64; es-AR; rv:1.9.0.3) Gecko/2008092515 Ubuntu/8.10 (intrepid) Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux x86-64; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0 +Mozilla/5.0 (X11; U; Linux x86; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Epiphany/2.30.6 Safari/534.7 +Mozilla/5.0 (X11; U; Linux x86; en-US; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux x86; es-ES; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux x86; rv:1.9.1.1) Gecko/20090716 Linux Firefox/3.5.1 +Mozilla/5.0 (X11; U; Linux x86; sv-SE; rv:1.8.1.12) Gecko/20080207 Ubuntu/8.04 (hardy) Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; Linux x86_64) Gecko/2008072820 Firefox/3.0.1 +Mozilla/5.0 (X11; U; Linux x86_64; ca-ad) AppleWebKit/531.2+ (KHTML, like Gecko) Safari/531.2+ Epiphany/2.30.6 +Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ) AppleWebKit/533.3 (KHTML, like Gecko) rekonq Safari/533.3 +Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ; rv:1.9.0.4) Gecko/2008111318 Ubuntu/8.04 (hardy) Firefox/3.0.4 +Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ; rv:1.9.1.16) Gecko/20120602 Iceweasel/3.5.16 (like Firefox/3.5.16) +Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ; rv:1.9.1.7) Gecko/20100106 Ubuntu/9.10 (karmic) Firefox/3.5.7 +Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ; rv:1.9.1.9) Gecko/20100317 SUSE/3.5.9-0.1.1 Firefox/3.5.9 +Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ; rv:1.9.2.10) Gecko/20100915 Ubuntu/10.04 (lucid) Firefox/3.6.10 +Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ; rv:1.9.2a2pre) Gecko/20090826 Namoroka/3.6a2pre +Mozilla/5.0 (X11; U; Linux x86_64; da-DK; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux x86_64; da-DK; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13 +Mozilla/5.0 (X11; U; Linux x86_64; de-AT; rv:1.7.8) Gecko/20050513 Debian/1.7.8-1 +Mozilla/5.0 (X11; U; Linux x86_64; de-AT; rv:1.8.0.2) Gecko/20060422 Firefox/1.5.0.2 +Mozilla/5.0 (X11; U; Linux x86_64; de-DE; rv:1.8.1.6) Gecko/20070802 Firefox/2.0.0.6 +Mozilla/5.0 (X11; U; Linux x86_64; de-at) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori +Mozilla/5.0 (X11; U; Linux x86_64; de-de) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.8.1.1) Gecko/20061205 Iceweasel/2.0.0.1 (Debian-2.0.0.1+dfsg-2) +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.8.1.1) Gecko/2006120502 Iceweasel/2.0.0.1 (Debian-2.0.0.1+dfsg-2) +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.8.1.12) Gecko/20080129 Iceweasel/2.0.0.12 (Debian-2.0.0.12-1) +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.8.1.12) Gecko/20080203 SUSE/2.0.0.12-6.1 Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.8.1.12) Gecko/20080208 Fedora/2.0.0.12-1.fc8 Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9) Gecko/2008061017 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.1) Gecko/2008070400 SUSE/3.0.1-0.1 Firefox/3.0.1 +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.11) Gecko/2009070611 Gentoo Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.16) Gecko/2009121609 Iceweasel/3.0.6 (Debian-3.0.6-3) +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.18) Gecko/2010021501 Ubuntu/9.04 (jaunty) Firefox/3.0.18 +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.19) Gecko/2012013123 Iceweasel/3.0.6 (Debian-3.0.6-3) +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.3) Gecko/2008090713 Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.03 [de] +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.7) Gecko/2009030620 Gentoo Firefox/3.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.7) Gecko/2009030810 Iceweasel/3.0.7 (Debian-3.0.7-1) +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.7) Gecko/2009031819 Iceweasel/3.0.6 (Debian-3.0.6-1) +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.8) Gecko/2009032917 Gentoo Iceweasel/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.9) Gecko/2009042114 Ubuntu/9.04 (jaunty) Firefox/3.0.9 +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.1.10) Gecko/20100506 SUSE/3.5.10-0.1.1 Firefox/3.5.10 +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.1.16) Gecko/20120131 Iceweasel/3.5.16 (like Firefox/3.5.16) +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.1.16) Gecko/20120714 Iceweasel/3.5.16 (like Firefox/3.5.16) +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.1.6) Gecko/20091210 SUSE/2.0.1-1.1.1 SeaMonkey/2.0.1 +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2) Gecko/20100308 Ubuntu/10.04 (lucid) Firefox/3.6 +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 GTB7.1 +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.17) Gecko/20110415 Ubuntu/10.10 (maverick) Namoroka/3.6.17 +Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.3) Gecko/20100401 SUSE/3.6.3-1.1 Firefox/3.6.3 +Mozilla/5.0 (X11; U; Linux x86_64; el-GR; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.8.1.12) Gecko/20080203 SUSE/2.0.0.12-0.1 Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.8.1.12) Gecko/20080207 Ubuntu/7.10 (gutsy) Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.8.1.3) Gecko/20070310 Iceweasel/2.0.0.3 (Debian-2.0.0.3-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.8.1b1) Gecko/20060601 BonEcho/2.0b1 (Ubuntu-edgy) +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1 FirePHP/0.1.1.2 +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10 +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.11) Gecko/2009061208 Iceweasel/3.0.6 (Debian-3.0.6-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.12) Gecko/2009070811 Ubuntu/9.04 (jaunty) Firefox/3.0.12 FirePHP/0.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.2) Gecko/2008092213 Ubuntu/8.04 (hardy) Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.5) Gecko/2008122010 Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.7) Gecko/2009030503 Fedora/3.0.7-1.fc9 Firefox/3.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.7) Gecko/2009030719 GranParadiso/3.0.7 FirePHP/0.2.4 +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.8) Gecko/2009032712 Ubuntu/8.10 (intrepid) Firefox/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.8) Gecko/2009032712 Ubuntu/8.10 (intrepid) Firefox/3.0.8 FirePHP/0.2.4 +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.9) Gecko/2009042113 Ubuntu/8.10 (intrepid) Firefox/3.0.9 +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.9) Gecko/2009050519 iceweasel/2.0 (Debian-3.0.6-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.2.13) Gecko/20101206 Red Hat/3.6-2.el5 Firefox/3.6.13 +Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.2.13) Gecko/20101206 Ubuntu/9.10 (karmic) Firefox/3.6.13 +Mozilla/5.0 (X11; U; Linux x86_64; en-NZ; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.24 Safari/532.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.2 Safari/532.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.204.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.207.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.208.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.209.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.2 Safari/532.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.212.0 Safari/532.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.0 Safari/532.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.1 Safari/532.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.3 Safari/532.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.3 Safari/532.2 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.7 Safari/532.2 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.1 Safari/532.2 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.4 Safari/532.2 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.5 Safari/532.2 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.6 Safari/532.2 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.2 Safari/532.2 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Comodo_Dragon/4.1.1.11 Chrome/4.1.249.1042 Safari/532.5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Iron/4.0.275.2 Chrome/4.0.275.2 Safari/532.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.308.0 Safari/532.9 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.309.0 Safari/532.9 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.1 (KHTML, like Gecko) Chrome/5.0.335.0 Safari/533.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.1 Safari/533.2 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.3 Safari/533.2 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Arora/0.11.0 Safari/533.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.353.0 Safari/533.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.354.0 Safari/533.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.358.0 Safari/533.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.368.0 Safari/533.4 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.417.0 Safari/534.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.427.0 Safari/534.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.544.0 Safari/534.10 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.200 Safari/534.10 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Ubuntu/10.10 Chromium/8.0.552.237 Chrome/8.0.552.237 Safari/534.10 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13 v1333515017.9196 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Ubuntu/10.04 Chromium/9.0.595.0 Chrome/9.0.595.0 Safari/534.13 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Ubuntu/10.10 Chromium/9.0.600.0 Chrome/9.0.600.0 Safari/534.14 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Chrome/10.0.613.0 Safari/534.15 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.11 Safari/534.16 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.127 Safari/534.16 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.82 Safari/534.16 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Iron/10.0.650.0 Chrome/10.0.650.0 Safari/534.16 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Iron/10.0.650.1 Chrome/10.0.650.1 Safari/534.16 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.642.0 Chrome/10.0.642.0 Safari/534.16 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.0 Chrome/10.0.648.0 Safari/534.16 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.127 Chrome/10.0.648.127 Safari/534.16 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.133 Chrome/10.0.648.133 Safari/534.16 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 SUSE/10.0.626.0 (KHTML, like Gecko) Chrome/10.0.626.0 Safari/534.16 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.458.1 Safari/534.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.470.0 Safari/534.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Epiphany/2.30.6 Safari/534.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Iron/7.0.520.0 Chrome/7.0.520.0 Safari/534.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.20 Safari/535.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/540.0 (KHTML, like Gecko) Ubuntu/10.10 Chrome/8.1.0.0 Safari/540.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/540.0 (KHTML, like Gecko) Ubuntu/10.10 Chrome/9.1.0.0 Safari/540.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/540.0 (KHTML,like Gecko) Chrome/9.1.0.0 Safari/540.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US) Gecko Firefox/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.10) Gecko/20050724 Firefox/1.0.6 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.12) Gecko/20050922 Fedora/1.0.7-1.1.fc4 Firefox/1.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.12) Gecko/20051010 Firefox/1.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.12) Gecko/20051010 Firefox/1.0.7 (Ubuntu package 1.0.7) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.12) Gecko/20051127 Firefox/1.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.12) Gecko/20051218 Firefox/1.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.12) Gecko/20060202 CentOS/1.0.7-1.4.3.centos4 Firefox/1.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.6) Gecko/20050405 Firefox/1.0 (Ubuntu package 1.0.2) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8) Gecko/20051201 Firefox/1.5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8) Gecko/20051212 Firefox/1.5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.1) Gecko/20060313 Fedora/1.5.0.1-9 Firefox/1.5.0.1 pango-text +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.10) Gecko/20070409 CentOS/1.5.0.10-2.el5.centos Firefox/1.5.0.10 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.12) Gecko/20070530 Fedora/1.5.0.12-1.fc6 Firefox/1.5.0.12 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.12) Gecko/20070718 Red Hat/1.5.0.12-3.el5 Firefox/1.5.0.12 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.12) Gecko/20080419 CentOS/1.5.0.12-0.15.el4.centos Firefox/1.5.0.12 pango-text +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.3) Gecko/20060522 Firefox/1.5.0.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.3) Gecko/20060523 Ubuntu/dapper Firefox/1.5.0.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.5) Gecko/20060731 Ubuntu/dapper-security Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.5) Gecko/20060911 Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.7) Gecko/20060911 Firefox/1.5.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.7) Gecko/20060919 Firefox/1.5.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.7) Gecko/20060921 Ubuntu/dapper-security Firefox/1.5.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.7) Gecko/20060924 Firefox/1.5.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.8) Gecko/20061109 SeaMonkey/1.0.6 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.9) Gecko/20070126 Ubuntu/dapper-security Firefox/1.5.0.9 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1) Gecko/20060601 Firefox/2.0 (Ubuntu-edgy) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1) Gecko/20061023 SUSE/2.0-37 Firefox/2.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1) Gecko/20061024 Iceweasel/2.0 (Debian-2.0+dfsg-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1) Gecko/20061122 Firefox/2.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1) Gecko/20061127 lolifox/0.3.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1) Gecko/20061128 Firefox/2.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1) Gecko/20061202 Firefox/2.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.1) Gecko/20060601 Firefox/2.0.0.1 (Ubuntu-edgy) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.1) Gecko/20061205 Iceweasel/2.0.0.1 (Debian-2.0.0.1+dfsg-2) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.1) Gecko/20061205 Iceweasel/2.0.0.1 (Debian-2.0.0.1+dfsg-4) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.10) Gecko/20061201 Firefox/2.0.0.10 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.11) Gecko/20070914 Mandriva/2.0.0.11-1.1mdv2008.0 (2008.0) Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.11) Gecko/20071128 Iceweasel/2.0.0.11 (Debian-2.0.0.11-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.11) Gecko/20071201 Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.12) Gecko/20080129 Firefox/2.0.0.8 (Debian-2.0.0.12-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.12) Gecko/20080203 SUSE/2.0.0.12-0.1 Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.12) Gecko/20080208 BonEcho/2.0.0.12 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.12) Gecko/20080209 SeaMonkey/1.1.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.12) Gecko/20080214 Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.13) Gecko/20080208 Mandriva/2.0.0.13-1mdv2008.1 (2008.1) Firefox/2.0.0.13 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.14) Gecko/20080404 Iceweasel/2.0.0.14 (Debian-2.0.0.14-2) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.15) Gecko/20080702 Ubuntu/8.04 (hardy) Firefox/2.0.0.15 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.16) Gecko/20080702 Iceweasel/2.0.0.16 (Debian-2.0.0.16-0etch1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.16) Gecko/20080718 Ubuntu/8.04 (hardy) Firefox/2.0.0.16 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.16) Gecko/20080719 Firefox/2.0.0.16 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.17) Gecko/20080829 SeaMonkey/1.1.12 (Ubuntu-1.1.12+nobinonly-0ubuntu1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.17) Gecko/20080922 SUSE/1.1.12-0.1 SeaMonkey/1.1.12 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.18) Gecko/20081110 SUSE/1.1.13-1.10 SeaMonkey/1.1.13 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.18) Gecko/20081112 Fedora/2.0.0.18-1.fc8 Firefox/2.0.0.18 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.18) Gecko/20081113 Ubuntu/8.04 (hardy) Firefox/2.0.0.18 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.19) Gecko/20081202 Iceweasel/2.0.0.19 (Debian-2.0.0.19-0etch1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.19) Gecko/20081204 Iceape/1.1.14 (Debian-1.1.14-1) Mnenhy/0.7.6.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.19) Gecko/20081213 SUSE/2.0.0.19-0.1 Firefox/2.0.0.19 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.2) Gecko/20070224 SeaMonkey/1.1.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.21) Gecko/20090328 Fedora/1.1.15-3.fc10 SeaMonkey/1.1.15 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.21) Gecko/20090413 SeaMonkey/1.1.16 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.3) Gecko/20061201 Firefox/2.0.0.3 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.3) Gecko/20070310 Iceweasel/2.0.0.3 (Debian-2.0.0.3-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.3) Gecko/20070322 Firefox/2.0.0.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.3) Gecko/20070324 Firefox/2.0.0.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.3) Gecko/20070415 Firefox/2.0.0.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.4) Gecko/20061201 Firefox/2.0.0.4 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.4) Gecko/20070529 SUSE/2.0.0.4-6.1 Firefox/2.0.0.4 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.4) Gecko/20070604 Firefox/2.0.0.4 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.4) Gecko/20070627 Firefox/2.0.0.4 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.5) Gecko/20061201 Firefox/2.0.0.5 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.6) Gecko/20070723 Iceweasel/2.0.0.6 (Debian-2.0.0.6-0etch1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.6) Gecko/20070812 BonEcho/2.0.0.6 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.7) Gecko/20070918 BonEcho/2.0.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.7) Gecko/20070918 Firefox/2.0.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.8) Gecko/20071015 SUSE/2.0.0.8-1.1 Firefox/2.0.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy) Firefox/2.0.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.9) Gecko/20071103 BonEcho/2.0.0.9 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9) Gecko/2008061317 (Gentoo) Firefox/3.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9) Gecko/2008062315 (Gentoo) Firefox/3.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9) Gecko/2008062908 Firefox/3.0 (Debian-3.0~rc2-2) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9) Gecko/2008062908 Iceweasel/3.0 (Debian-3.0~rc2-2) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0) Gecko/2008061600 SUSE/3.0-1.2 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.1) Gecko/2008071420 Iceweasel/3.0.1 (Debian-3.0.1-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.1) Gecko/2008071818 GranParadiso/3.0.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.1) Gecko/2008072610 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.1) Gecko/2008072610 Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.1) Gecko/2008072820 Kubuntu/8.04 (hardy) Firefox/3.0.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.1) Gecko/2008110312 Gentoo Firefox/3.0.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.11) Gecko/2009060309 Linux Mint/7 (Gloria) Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.11) Gecko/2009061118 Fedora/3.0.11-1.fc9 Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.11) Gecko/2009061417 Gentoo Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.11) Gecko/2009070612 Gentoo Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.12) Gecko/2009070811 Ubuntu/9.04 (jaunty) Firefox/3.0.12 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.12) Gecko/2009070818 Ubuntu/8.10 (intrepid) Firefox/3.0.12 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.12) Gecko/2009072220 Iceweasel/3.0.6 (Debian-3.0.6-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.13) Gecko/2009080315 Ubuntu/9.04 (jaunty) Firefox/3.0.13 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.14) Gecko/2009090217 Ubuntu/9.04 (jaunty) Firefox/3.0.13 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.14) Gecko/2009090217 Ubuntu/9.04 (jaunty) Firefox/3.0.14 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.16) Gecko/2009121609 Firefox/3.0.6 (Windows NT 5.1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.17) Gecko/2010010604 prism/0.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.17) Gecko/2010011010 Mandriva/1.9.0.17-0.1mdv2009.1 (2009.1) Firefox/3.0.17 GTB6 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.19) Gecko/2011050707 Iceweasel/3.0.6 (Debian-3.0.6-3) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.2) Gecko/2008092213 Ubuntu/8.04 (hardy) Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.2) Gecko/2008092318 Fedora/3.0.2-1.fc9 Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.2) Gecko/2008092418 CentOS/3.0.2-3.el5.centos Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 (Linux Mint) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.3) Gecko/2008092814 (Debian-3.0.1-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.4) Gecko/2008112012 Minefield/3.0.4 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.4) Gecko/2008120512 Gentoo Firefox/3.0.4 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.5) Gecko/2008121711 Ubuntu/9.04 (jaunty) Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.5) Gecko/2008121806 Gentoo Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.5) Gecko/2008121911 CentOS/3.0.5-1.el5.centos Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.5) Gecko/2008122010 Firefox/2.0.0.3 (Debian-3.0.5-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.5) Gecko/2008122014 CentOS/3.0.5-1.el4.centos Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.5) Gecko/2008122120 Gentoo Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.5) Gecko/2008122406 Gentoo Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.5) Gecko/2008122903 Gentoo Iceweasel/3.0.5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.6) Gecko/2009012700 SUSE/3.0.6-1.4 Firefox/3.0.6 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.6) Gecko/2009020407 Firefox/3.0.4 (Debian-3.0.6-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.6) Gecko/2009020407 Iceweasel/3.0.7 (Debian-3.0.7-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.6) Gecko/2009020519 Ubuntu/9.04 (jaunty) Firefox/3.0.6 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Minefield/3.0 MEGAUPLOAD 2.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.6) Gecko/2010012717 Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko Kazehakase/0.5.6 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009030423 Ubuntu/8.10 (intrepid) Firefox/3.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009030516 Ubuntu/9.04 (jaunty) Firefox/3.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009030516 Ubuntu/9.04 (jaunty) Firefox/3.0.7 GTB5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009030719 Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009030810 Firefox/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009031120 Mandriva Firefox/3.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009031120 Mandriva/1.9.0.7-0.1mdv2009.0 (2009.0) Firefox/3.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009031802 Gentoo Firefox/3.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009032319 Gentoo Firefox/3.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009032606 Red Hat/3.0.7-1.el5 Firefox/3.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009032813 Iceweasel/3.0.6 (Debian-3.0.6-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009032600 SUSE/3.0.8-1.1 Firefox/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009032600 SUSE/3.0.8-1.1.1 Firefox/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009032712 Firefox/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009032712 Ubuntu/8.04 (hardy) Firefox/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009032712 Ubuntu/8.10 (intrepid) Firefox/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009032713 Ubuntu/9.04 (jaunty) Firefox/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009032809 Iceweasel/3.0.7 (Debian-3.0.7-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009032908 Gentoo Firefox/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009033008 GranParadiso/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009033100 Ubuntu/9.04 (jaunty) Firefox/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009033109 Gentoo Iceweasel/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009040312 Gentoo Firefox/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1) Gecko/20090630 Firefox/3.5 GTB6 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.1) Gecko/20090714 SUSE/3.5.1-1.1 Firefox/3.5.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.1) Gecko/20090716 Firefox/3.5.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.1) Gecko/20090716 Linux Mint/7 (Gloria) Firefox/3.5.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.1) Gecko/20090716 Ubuntu/9.04 (jaunty) Shiretoko/3.5.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.10) Gecko/20100623 Fedora/2.0.5-1.fc12 SeaMonkey/2.0.5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.11) Gecko/20100714 SUSE/2.0.6-2.1 SeaMonkey/2.0.6 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.11) Gecko/20100720 Fedora/2.0.6-1.fc12 SeaMonkey/2.0.6 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.11) Gecko/20100721 Iceape/2.0.6 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.11) Gecko/20100721 SeaMonkey/2.0.6 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.13) Gecko/20100916 Iceape/2.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.14) Gecko/20101020 Conkeror/0.9.2 (Debian-0.9.2+git100804-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.15) Gecko/20101027 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.540.0 Safari/534.10 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.15) Gecko/20101028 Conkeror/0.9.2 (Debian-0.9.2+git100804-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20101206 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080514 Firefox/2.0.0.14 Flock/1.1.4 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20101209 Conkeror/0.9.2 (Debian-0.9.2+git100804-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20101227 Iceape/2.0.11 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20110107 Iceweasel/3.5.16 (Debian-3.0.5-1) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20110302 Iceape/2.0.11 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20111108 Iceweasel/3.5.16 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20120602 Iceweasel/3.5.16 (like Firefox/3.5.16) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20120714 Iceweasel/3.5.16 (like Firefox/3.5.16) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.17) Gecko/20110121 SUSE/2.0.12-0.2.1 SeaMonkey/2.0.12 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.17) Gecko/20110303 SeaMonkey/2.0.12 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.1pre) Gecko/20090701 Ubuntu/9.04 (jaunty) Shiretoko/3.5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.2) Gecko/20090803 Firefox/3.5.2 Slackware +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.2) Gecko/20090803 Slackware Firefox/3.5.2 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20090913 Firefox/3.5.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20090914 Slackware/13.0_stable Firefox/3.5.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20091010 Iceweasel/3.5.3 (Debian-3.5.3-2) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.5) Gecko/20091114 Gentoo Firefox/3.5.5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.6) Gecko/20100117 Gentoo Firefox/3.5.6 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100206 SUSE/2.0.3-0.1.1 SeaMonkey/2.0.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100318 Gentoo Firefox/3.5.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8pre) Gecko/20091227 Ubuntu/9.10 (karmic) Firefox/3.5.5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8pre) Gecko/20100110 Shiretoko/3.5.8pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8pre) Gecko/20100112 Shiretoko/3.5.8pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.9) Gecko/20100317 SUSE/2.0.4-3.2 Lightning/1.0b1 SeaMonkey/2.0.4 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.9) Gecko/20100502 Iceape/2.0.4 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.9pre) Gecko/20100212 SeaMonkey/2.0.4pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1a2pre) Gecko/2008080205 Minefield/3.1a2pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1b1pre) Gecko/20080929020931 Minefield/3.1b1pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1b2pre) Gecko/20081115 Minefield/3.1b2pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1b3) Gecko/20090312 Firefox/3.1b3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1b3) Gecko/20090327 Fedora/3.1-0.11.beta3.fc11 Firefox/3.1b3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1b3) Gecko/20090327 GNU/Linux/x86_64 Firefox/3.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1b3pre) Gecko/20081222 Shiretoko/3.1b3pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1b3pre) Gecko/20081223 Shiretoko/3.1b3pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1b3pre) Gecko/20090109 Shiretoko/3.1b3pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1b3pre) Gecko/20090302 SeaMonkey/2.0b1pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1b4pre) Gecko/20090401 Ubuntu/9.04 (jaunty) Shiretoko/3.5b4pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1b4pre) Gecko/20090404 Shiretoko/3.5b4pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1b5pre) Gecko/20090424 Shiretoko/3.5b5pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2) Gecko/20100130 Gentoo Firefox/3.6 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2) Gecko/20100222 Ubuntu/10.04 (lucid) Firefox/3.6 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2) Gecko/20100305 Gentoo Firefox/3.5.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 GTB7.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.10) Gecko/20100928 Namoroka/3.6.10 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.10pre) Gecko/20100826 Ubuntu/9.04 (jaunty) Namoroka/3.6.10pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.12) Gecko/20101102 Firefox/3.6.12 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.12) Gecko/20101102 Gentoo Firefox/3.6.12 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.12pre) Gecko/20101011 Ubuntu/10.04 (lucid) Namoroka/3.6.12pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101206 Firefox/3.6.13 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101206 Red Hat/3.6-3.el4 Firefox/3.6.13 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101214 IceCat/3.6.13 (like Firefox/3.6.13) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101219 Gentoo Firefox/3.6.13 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101223 Gentoo Firefox/3.6.13 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.14pre) Gecko/20110111 Ubuntu/8.04 (hardy) Namoroka/3.6.14pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.15pre) Gecko/20110130 Ubuntu/10.10 (maverick) Namoroka/3.6.15pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.18pre) Gecko/20110419 Ubuntu/10.10 (maverick) Namoroka/3.6.18pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.18pre) Gecko/20110515 Ubuntu/10.04 (lucid) Namoroka/3.6.18pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.18pre) Gecko/20110515 Ubuntu/9.10 (karmic) Namoroka/3.6.18pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.20) Gecko/20110804 Red Hat/3.6-2.el5 Firefox/3.6.20 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.2pre) Gecko/20100129 Ubuntu/9.10 (karmic) Namoroka/3.6.2pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.2pre) Gecko/20100306 Namoroka/3.6.2pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.2pre) Gecko/20100310 Ubuntu/9.10 (karmic) Namoroka/3.6.2pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.3) Gecko/20100402 Namoroka/3.6.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.3) Gecko/20100403 Firefox/3.6.3 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.3) Gecko/20100524 Firefox/3.5.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.3pre) Gecko/20100324 Ubuntu/9.04 (jaunty) Namoroka/3.6.3pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.4) Gecko/20100614 Ubuntu/10.04 (lucid) Firefox/3.6.4 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.5pre) Gecko/20100526 Namoroka/3.6.5pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.5pre) Gecko/20100526 Ubuntu/10.04 (lucid) Namoroka/3.6.5pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 (.NET CLR 3.5.30729) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 GTB7.0 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 GTB7.1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.7) Gecko/20100723 Fedora/3.6.7-1.fc13 Firefox/3.6.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.7) Gecko/20100809 Fedora/3.6.7-1.fc14 Firefox/3.6.7 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.8) Gecko/20100723 SUSE/3.6.8-0.1.1 Firefox/3.6.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.8) Gecko/20100804 Gentoo Firefox/3.6.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.8) Gecko/20100805 Namoroka/3.6.8 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.9) Gecko/20100915 Gentoo Firefox/3.6.9 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a1pre) Gecko/20081205 Minefield/3.2a1pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a1pre) Gecko/20090331 Minefield/3.6a1pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a1pre) Gecko/20090405 Firefox/3.6a1pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a1pre) Gecko/20090417 Minefield/3.6a1pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a1pre) Gecko/20090418 Minefield/3.6a1pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a1pre) Gecko/20090428 Firefox/3.6a1pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a1pre) Gecko/20090501 Minefield/3.6a1pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a1pre) Gecko/20090716 Minefield/3.6a1pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a2pre) Gecko/20090817 Ubuntu/9.04 (jaunty) Namoroka/3.6a2pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a2pre) Gecko/20090824 Ubuntu/9.10 (karmic) Namoroka/3.6a2pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a2pre) Gecko/20090901 Ubuntu/9.10 (karmic) Namoroka/3.6a2pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a2pre) Gecko/20090908 Ubuntu/9.04 (jaunty) Namoroka/3.6a2pre GTB5 (.NET CLR 3.5.30729) +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.3a4pre) Gecko/20100318 Minefield/3.7a4pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9a1) Gecko/20060112 Firefox/1.6a1 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9b2) Gecko/2007122607 Minefield/3.0b2 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9b3pre) Gecko/2008011321 Firefox/3.0b3pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9b3pre) Gecko/2008020509 Firefox/3.0b3pre +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9b4) Gecko/2008031318 Firefox/3.0b4 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9b4) Gecko/2008040813 Firefox/3.0b4 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9b5) Gecko/2008040514 Firefox/3.0b5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9b5) Gecko/2008041816 Fedora/3.0-0.55.beta5.fc9 Firefox/3.0b5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9pre) Gecko/2008042312 Firefox/3.0b5 +Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9pre) Gecko/2008042312 Minefield/3.0pre +Mozilla/5.0 (X11; U; Linux x86_64; en-ca) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/531.2+ +Mozilla/5.0 (X11; U; Linux x86_64; en-gb) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori +Mozilla/5.0 (X11; U; Linux x86_64; en-gb) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) midori +Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori +Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) midori +Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/531.2+ +Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/532+ (KHTML, like Gecko) Safari/419.3 Midori/0.1.8 +Mozilla/5.0 (X11; U; Linux x86_64; en; rv:1.8.1.13) Gecko/20080322 Epiphany/2.22 Firefox/2.0.0.4 +Mozilla/5.0 (X11; U; Linux x86_64; en; rv:1.8.1.13) Gecko/20080326 (Debian-1.8.1.13-1) Epiphany/2.20 +Mozilla/5.0 (X11; U; Linux x86_64; en; rv:1.8.1.14) Gecko/20080616 Fedora/2.20.3-4.fc8 Epiphany/2.20 Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux x86_64; en; rv:1.8.1.3) Gecko/20061201 Epiphany/2.18 Firefox/2.0.0.3 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux x86_64; en; rv:1.8.1.4) Gecko/20061201 Epiphany/2.18 Firefox/2.0.0.4 (Ubuntu-feisty) +Mozilla/5.0 (X11; U; Linux x86_64; en; rv:1.8.1.4) Gecko/20070628 Epiphany/2.16 Firefox/2.0.0.4 +Mozilla/5.0 (X11; U; Linux x86_64; en; rv:1.9) Gecko/20080528 Epiphany/2.22 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux x86_64; en; rv:1.9.0.1) Gecko/20080528 Epiphany/2.22 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux x86_64; en; rv:1.9.0.14) Gecko/20080528 Epiphany/2.22 (Debian/2.26.3-2) +Mozilla/5.0 (X11; U; Linux x86_64; en; rv:1.9.0.14) Gecko/20080528 Ubuntu/9.10 (karmic) Epiphany/2.22 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux x86_64; en; rv:1.9.0.7) Gecko/20080528 Epiphany/2.22 +Mozilla/5.0 (X11; U; Linux x86_64; en; rv:1.9.0.8) Gecko/20080528 Epiphany/2.22 (Debian/2.24.3-2) +Mozilla/5.0 (X11; U; Linux x86_64; en; rv:1.9.0.8) Gecko/20080528 Epiphany/2.22 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux x86_64; en; rv:1.9.0.8) Gecko/20080528 Fedora/2.24.3-4.fc10 Epiphany/2.22 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux x86_64; es-AR; rv:1.9) Gecko/2008061015 Ubuntu/8.04 (hardy) Firefox/3.0 +Mozilla/5.0 (X11; U; Linux x86_64; es-AR; rv:1.9) Gecko/2008061017 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux x86_64; es-AR; rv:1.9.0.2) Gecko/2008091920 Firefox/3.0.2 Flock/2.0b3 +Mozilla/5.0 (X11; U; Linux x86_64; es-AR; rv:1.9.0.3) Gecko/2008092515 Ubuntu/8.10 (intrepid) Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux x86_64; es-AR; rv:1.9.0.4) Gecko/2008110510 Red Hat/3.0.4-1.el5_2 Firefox/3.0.4 +Mozilla/5.0 (X11; U; Linux x86_64; es-CL; rv:1.9.1.9) Gecko/20100402 Ubuntu/9.10 (karmic) Firefox/3.5.9 +Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.8.1.11) Gecko/20071128 Iceweasel/2.0.0.11 (Debian-2.0.0.11-1) +Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.8.1.18) Gecko/20081112 Fedora/1.1.13-1.fc10 SeaMonkey/1.1.13 +Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1 +Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.0.12) Gecko/2009070811 Ubuntu/9.04 (jaunty) Firefox/3.0.12 +Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.0.12) Gecko/2009072711 CentOS/3.0.12-1.el5.centos Firefox/3.0.12 +Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.0.4) Gecko/2008111217 Fedora/3.0.4-1.fc10 Firefox/3.0.4 +Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.0.7) Gecko/2009022800 SUSE/3.0.7-1.4 Firefox/3.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.0.9) Gecko/2009042114 Ubuntu/9.04 (jaunty) Firefox/3.0.9 +Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.1.16) Gecko/20120315 Iceweasel/3.5.16 (like Firefox/3.5.16) +Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.1.16) Gecko/20120602 Iceweasel/3.5.16 (like Firefox/3.5.16) +Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.1.8) Gecko/20100216 Fedora/3.5.8-1.fc11 Firefox/3.5.8 +Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.2.12) Gecko/20101026 SUSE/3.6.12-0.7.1 Firefox/3.6.12 +Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.2.12) Gecko/20101027 Fedora/3.6.12-1.fc13 Firefox/3.6.12 +Mozilla/5.0 (X11; U; Linux x86_64; es-MX; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.04 (lucid) Firefox/3.6.12 +Mozilla/5.0 (X11; U; Linux x86_64; fi-FI; rv:1.8.1.1) Gecko/20060601 Firefox/2.0.0.1 (Ubuntu-edgy) +Mozilla/5.0 (X11; U; Linux x86_64; fi-FI; rv:1.9.0.14) Gecko/2009090217 Firefox/3.0.14 +Mozilla/5.0 (X11; U; Linux x86_64; fi-FI; rv:1.9.0.8) Gecko/2009032712 Ubuntu/8.10 (intrepid) Firefox/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; fr-FR) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7 +Mozilla/5.0 (X11; U; Linux x86_64; fr-FR) AppleWebKit/534.7 (KHTML, like Gecko) Epiphany/2.30.6 Safari/534.7 +Mozilla/5.0 (X11; U; Linux x86_64; fr-FR; rv:1.8.1.12) Gecko/20080209 SeaMonkey/1.1.8 +Mozilla/5.0 (X11; U; Linux x86_64; fr-FR; rv:1.8.1.13) Gecko/20080313 SeaMonkey/1.1.9 (Ubuntu-1.1.9+nobinonly-0ubuntu1) +Mozilla/5.0 (X11; U; Linux x86_64; fr-FR; rv:1.8.1.4) Gecko/20070528 SeaMonkey/1.1.2 +Mozilla/5.0 (X11; U; Linux x86_64; fr-FR; rv:1.8.1.6) Gecko/20070803 SeaMonkey/1.1.4 +Mozilla/5.0 (X11; U; Linux x86_64; fr-fr) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori +Mozilla/5.0 (X11; U; Linux x86_64; fr-fr) AppleWebKit/531.2+ (KHTML, like Gecko) Safari/531.2+ Epiphany/2.29.91 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.6) Gecko/20040115 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.7.12) Gecko/20050922 Fedora/1.0.7-1.1.fc4 Firefox/1.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.7.12) Gecko/20051010 Epiphany/1.8.2 (Ubuntu) (Ubuntu package 1.0.7) +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.8) Gecko/20051231 Firefox/1.5 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.8.1.1) Gecko/20060601 Firefox/2.0.0.1 (Ubuntu-edgy) +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.8.1.16) Gecko/20080715 Fedora/2.0.0.16-1.fc8 Firefox/2.0.0.16 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.8.1.3) Gecko/20070310 Iceweasel/2.0.0.3 (Debian-2.0.0.3-1) +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.8.1.3) Gecko/20070310 Iceweasel/2.0.0.3 (Debian-2.0.0.3-2) +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.8.1.3) Gecko/20070322 Firefox/2.0.0.3 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9) Gecko/2008061017 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.1) Gecko/2008070400 SUSE/3.0.1-1.1 Firefox/3.0.1 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.1) Gecko/2008071222 Firefox/3.0.1 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.11) Gecko/2009060309 Ubuntu/9.04 (jaunty) Firefox/3.0.11 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.11) Gecko/2009061208 Iceweasel/3.0.9 (Debian-3.0.9-1) +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.14) Gecko/2009090216 Ubuntu/8.04 (hardy) Firefox/3.0.14 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.19) Gecko/2010051407 CentOS/3.0.19-1.el5.centos Firefox/3.0.19 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.19) Gecko/2010072022 Iceweasel/3.0.6 (Debian-3.0.6-3) +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.2) Gecko/2008092213 Ubuntu/8.04 (hardy) Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.7) Gecko/2009030423 Ubuntu/8.10 (intrepid) Firefox/3.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.7) Gecko/2009030810 Iceweasel/3.0.7 (Debian-3.0.7-1) +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.7) Gecko/2009031819 Iceweasel/3.0.6 (Debian-3.0.6-1) +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.7) Gecko/2009032813 Iceweasel/3.0.6 Firefox/3.0.6 (Debian-3.0.6-1) +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.9) Gecko/2009042114 Ubuntu/9.04 (jaunty) Firefox/3.0.9 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.16) Gecko/20101206 Lightning/1.0b1 SeaMonkey/2.0.11 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.16) Gecko/20120511 Iceweasel/3.5.16 (like Firefox/3.5.16) +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.16) Gecko/20120714 Iceweasel/3.5.16 (like Firefox/3.5.16) +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.18) Gecko/20110412 Lightning/1.0b1 SeaMonkey/2.0.13 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.5) Gecko/20091109 Ubuntu/9.10 (karmic) Firefox/3.5.3pre +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.5) Gecko/20091109 Ubuntu/9.10 (karmic) Firefox/3.5.5 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.9) Gecko/20100317 SUSE/3.5.9-0.1.1 Firefox/3.5.9 GTB7.0 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.9) Gecko/20100428 Lightning/1.0b1 SeaMonkey/2.0.4 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.2.13) Gecko/20101203 IceCat/3.6.13-g1 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.2.13) Gecko/20101203 Iceweasel/3.6.7 (like Firefox/3.6.13) +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.2.13) Gecko/20110103 Fedora/3.6.13-1.fc14 Firefox/3.6.13 +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.2.14pre) Gecko/20101224 Ubuntu/10.04 (lucid) Namoroka/3.6.14pre +Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.2.3) Gecko/20100403 Fedora/3.6.3-4.fc13 Firefox/3.6.3 +Mozilla/5.0 (X11; U; Linux x86_64; hu-HU; rv:1.9.1.16) Gecko/20110107 Iceweasel/3.5.16 (like Firefox/3.5.16) +Mozilla/5.0 (X11; U; Linux x86_64; hu-HU; rv:1.9.2.18pre) Gecko/20110515 Ubuntu/10.10 (maverick) Namoroka/3.6.18pre +Mozilla/5.0 (X11; U; Linux x86_64; hu-hu) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori +Mozilla/5.0 (X11; U; Linux x86_64; hu; rv:1.8.1.14) Gecko/20080416 Fedora/2.0.0.14-1.fc7 Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; Linux x86_64; it-it) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori +Mozilla/5.0 (X11; U; Linux x86_64; it-it) AppleWebKit/534.26+ (KHTML, like Gecko) Ubuntu/11.04 Epiphany/2.30.6 +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.8.1.2) Gecko/20060601 Firefox/2.0.0.2 (Ubuntu-edgy) +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9) Gecko/2008061017 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.0.1) Gecko/2008071717 Firefox/3.0.1 +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.0.14) Gecko/2009090216 Ubuntu/8.04 (hardy) Firefox/3.0.14 +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.0.3) Gecko/2008092813 Gentoo Firefox/3.0.3 +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6 +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.0.8) Gecko/2009032712 Ubuntu/8.10 (intrepid) Firefox/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.0.8) Gecko/2009033100 Ubuntu/9.04 (jaunty) Firefox/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.1.15) Gecko/20101027 Fedora/3.5.15-1.fc12 Firefox/3.5.15 +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.1.16) Gecko/20111108 Iceweasel/3.5.16 (like Firefox/3.5.16) +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.1.16) Gecko/20120602 Iceweasel/3.5.16 (like Firefox/3.5.16) +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.1.16) Gecko/20120714 Iceweasel/3.5.16 (like Firefox/3.5.16) +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.1.16) Gecko/20120921 Iceweasel/3.5.16 (like Firefox/3.5.16) +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.1.9) Gecko/20100330 Fedora/3.5.9-2.fc12 Firefox/3.5.9 +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.1.9) Gecko/20100402 Ubuntu/9.10 (karmic) Firefox/3.5.9 (.NET CLR 3.5.30729) +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.04 (lucid) Firefox/3.6.13 (.NET CLR 3.5.30729) +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.2.20) Gecko/20110805 Ubuntu/10.04 (lucid) Firefox/3.6.20 +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.2.24) Gecko/20111101 SUSE/3.6.24-0.2.1 Firefox/3.6.24 +Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.2.9pre) Gecko/20100818 Ubuntu/10.04 (lucid) Namoroka/3.6.9pre +Mozilla/5.0 (X11; U; Linux x86_64; ja-JP; rv:1.9.2.16) Gecko/20110323 Ubuntu/10.10 (maverick) Firefox/3.6.16 +Mozilla/5.0 (X11; U; Linux x86_64; ja; rv:1.9.1.4) Gecko/20091016 SUSE/3.5.4-1.1.2 Firefox/3.5.4 +Mozilla/5.0 (X11; U; Linux x86_64; ja; rv:1.9.1.8) Gecko/20100324 Iceweasel/3.5.8 (like Firefox/3.5.8) +Mozilla/5.0 (X11; U; Linux x86_64; ko-KR; rv:1.9.0.1) Gecko/2008071717 Firefox/3.0.1 +Mozilla/5.0 (X11; U; Linux x86_64; nb-NO; rv:1.9.0.8) Gecko/2009032600 SUSE/3.0.8-1.2 Firefox/3.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; nb-NO; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.04 (lucid) Firefox/3.6.13 +Mozilla/5.0 (X11; U; Linux x86_64; nl-NL; rv:1.7.6) Gecko/20050318 Firefox/1.0.2 +Mozilla/5.0 (X11; U; Linux x86_64; nl-nl) AppleWebKit/531.2+ (KHTML, like Gecko) Safari/531.2+ Epiphany/2.29.91 +Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.8) Gecko/20051128 SUSE/1.5-0.1 Firefox/1.5.0.1 +Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.8.1.13) Gecko/20080325 Ubuntu/7.10 (gutsy) Firefox/2.0.0.13 +Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.8.1.2pre) Gecko/20061023 SUSE/2.0.0.1-0.1 Firefox/2.0.0.2pre +Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9) Gecko/2008060309 Firefox/3.0 +Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.0.1) Gecko/2008071222 Firefox/3.0.1 +Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.0.1) Gecko/2008071222 Ubuntu (hardy) Firefox/3.0.1 +Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.0.1) Gecko/2008071222 Ubuntu/hardy Firefox/3.0.1 +Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.0.2) Gecko/2008092213 Ubuntu/8.04 (hardy) Firefox/3.0.2 +Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.0.5) Gecko/2008121623 Ubuntu/8.10 (intrepid) Firefox/3.0.5 +Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 +Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.04 (lucid) Firefox/3.6.13 +Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:2.0) Gecko/20110307 Firefox/4.0 +Mozilla/5.0 (X11; U; Linux x86_64; pl; rv:1.8.1.4) Gecko/20070611 Firefox/2.0.0.4 +Mozilla/5.0 (X11; U; Linux x86_64; pl; rv:1.8.1.7) Gecko/20071009 Firefox/2.0.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; pl; rv:1.9.1.2) Gecko/20090911 Slackware Firefox/3.5.2 +Mozilla/5.0 (X11; U; Linux x86_64; pt-BR; rv:1.9.0.14) Gecko/2009090217 Ubuntu/9.04 (jaunty) Firefox/3.0.14 +Mozilla/5.0 (X11; U; Linux x86_64; pt-BR; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 +Mozilla/5.0 (X11; U; Linux x86_64; pt-BR; rv:1.9b5) Gecko/2008041515 Firefox/3.0b5 +Mozilla/5.0 (X11; U; Linux x86_64; ru-RU) AppleWebKit/533.3 (KHTML, like Gecko) Leechcraft/0.3.95-1-g84cc6b7 Safari/533.3 +Mozilla/5.0 (X11; U; Linux x86_64; ru-RU) AppleWebKit/533.3 (KHTML, like Gecko) Leechcraft/0.4.55-13-g2230d9f Safari/533.3 +Mozilla/5.0 (X11; U; Linux x86_64; ru-RU; rv:1.8.1.16) Gecko/20080716 Fedora/1.1.11-1.fc9 SeaMonkey/1.1.11 +Mozilla/5.0 (X11; U; Linux x86_64; ru-ru) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori +Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.8.1.14) Gecko/20080404 Iceweasel/2.0.0.14 (Debian-2.0.0.14-2) +Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy) Firefox/2.0.0.8 +Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.0.14) Gecko/2009090217 Ubuntu/9.04 (jaunty) Firefox/3.0.14 (.NET CLR 3.5.30729) +Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.1.8) Gecko/20100216 Fedora/3.5.8-1.fc12 Firefox/3.5.8 +Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.2.11) Gecko/20101028 CentOS/3.6-2.el5.centos Firefox/3.6.11 +Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.2.18) Gecko/20110628 Ubuntu/10.10 (maverick) Firefox/3.6.18 +Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.2.18pre) Gecko/20110419 Ubuntu/10.04 (lucid) Namoroka/3.6.18pre +Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.3a4pre) Gecko/20100319 Minefield/3.7a4pre +Mozilla/5.0 (X11; U; Linux x86_64; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1 +Mozilla/5.0 (X11; U; Linux x86_64; rv:1.9.1.1) Gecko/20090716 Linux Firefox/3.5.1 +Mozilla/5.0 (X11; U; Linux x86_64; sv-SE; rv:1.9.0.7) Gecko/2009030423 Ubuntu/8.10 (intrepid) Firefox/3.0.7 +Mozilla/5.0 (X11; U; Linux x86_64; sv-SE; rv:1.9.1.16) Gecko/20120714 Iceweasel/3.5.16 (like Firefox/3.5.16) +Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 +Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.9pre) Gecko/20100811 Ubuntu/10.04 (lucid) Namoroka/3.6.9pre GTB7.0 +Mozilla/5.0 (X11; U; Linux x86_64; zh-TW; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; Linux x86_64; zh-TW; rv:1.9.0.13) Gecko/2009080315 Ubuntu/9.04 (jaunty) Firefox/3.0.13 +Mozilla/5.0 (X11; U; Linux x86_64; zh-TW; rv:1.9.0.8) Gecko/2009032712 Ubuntu/8.04 (hardy) Firefox/3.0.8 GTB5 +Mozilla/5.0 (X11; U; Linux x86_64; zh-cn) AppleWebKit/531.2+ (KHTML, like Gecko) Safari/531.2+ Epiphany/2.28.0 SUSE/2.28.0-2.4 +Mozilla/5.0 (X11; U; Linux x86_64; zh-cn) AppleWebKit/531.2+ (KHTML, like Gecko) Safari/531.2+ Epiphany/2.28.2 SUSE/2.28.0-2.4 +Mozilla/5.0 (X11; U; Linux; cs-CZ) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.4 (Change: 333 41e3bc6) +Mozilla/5.0 (X11; U; Linux; de-DE) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.2 (Change: 0 ) +Mozilla/5.0 (X11; U; Linux; de-DE) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.4 +Mozilla/5.0 (X11; U; Linux; de-DE) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.8.0 +Mozilla/5.0 (X11; U; Linux; en-GB) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.4 +Mozilla/5.0 (X11; U; Linux; en-GB) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.4 (Change: 388 835b3b6) +Mozilla/5.0 (X11; U; Linux; en-GB) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 239 52c6958) +Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.2 (Change: 0 ) +Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.2 (Change: 189 35c14e0) +Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.4 +Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6 +Mozilla/5.0 (X11; U; Linux; en-US; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2 +Mozilla/5.0 (X11; U; Linux; en-US; rv:1.9.1.11) Gecko/20100720 Firefox/3.5.11 +Mozilla/5.0 (X11; U; Linux; en-us; rv:1.8.1) Gecko/20061010 Firefox/2.0 Midori/0.1.6 +Mozilla/5.0 (X11; U; Linux; es-CR) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.2 (Change: 0 ) +Mozilla/5.0 (X11; U; Linux; es-ES) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.4 (Change: 388 835b3b6) +Mozilla/5.0 (X11; U; Linux; fi-FI) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6 (Change: 754 46b659a) +Mozilla/5.0 (X11; U; Linux; fr-FR) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.4 +Mozilla/5.0 (X11; U; Linux; fr-fr) AppleWebKit/532+ (KHTML, like Gecko) Safari/419.3 Midori/0.1.7 +Mozilla/5.0 (X11; U; Linux; fr; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 +Mozilla/5.0 (X11; U; Linux; hu-HU) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.4 +Mozilla/5.0 (X11; U; Linux; hu-HU) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.4 (Change: 388 835b3b6) +Mozilla/5.0 (X11; U; Linux; i686; en-US; rv:1.6) Gecko Epiphany/1.2.5 +Mozilla/5.0 (X11; U; Linux; i686; en-US; rv:1.6) Gecko Galeon/1.3.14 +Mozilla/5.0 (X11; U; Linux; it-IT) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.4 +Mozilla/5.0 (X11; U; Linux; it-IT) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.4 (Change: 413 12f13f8) +Mozilla/5.0 (X11; U; Linux; it-IT; rv:1.9.1) Gecko/20080913 Firefox/2.0 Midori/0.1.6 +Mozilla/5.0 (X11; U; Linux; it-it) AppleWebKit/531+ (KHTML, like Gecko) Safari/531.2+ Midori/0.2 +Mozilla/5.0 (X11; U; Linux; nb-NO) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.2 (Change: 0 ) +Mozilla/5.0 (X11; U; Linux; nb-NO) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.4 +Mozilla/5.0 (X11; U; Linux; pl-PL) AppleWebKit/532.4 (KHTML, like Gecko) Arora/0.10.2 Safari/532.4 +Mozilla/5.0 (X11; U; Linux; pt-PT) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.4 +Mozilla/5.0 (X11; U; Linux; pt-br) AppleWebKit/531+ (KHTML, like Gecko) Safari/531.2+ Midori/0.3 +Mozilla/5.0 (X11; U; Linux; ru-RU) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6 (Change: 802 025a17d) +Mozilla/5.0 (X11; U; Linux; sk-SK) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.2 (Change: 0 ) +Mozilla/5.0 (X11; U; Mac OSX; it; rv:1.9.0.7) Gecko/2009030422 Firefox/3.0.7 +Mozilla/5.0 (X11; U; NetBSD alpha; en-US; rv:1.8.1.6) Gecko/20080115 Firefox/2.0.0.6 +Mozilla/5.0 (X11; U; NetBSD amd64; fr-FR; rv:1.8.0.7) Gecko/20061102 Firefox/1.5.0.7 +Mozilla/5.0 (X11; U; NetBSD i386; en-US; rv:1.8) Gecko/20060104 Firefox/1.5 +Mozilla/5.0 (X11; U; NetBSD i386; en-US; rv:1.8.0.5) Gecko/20060818 Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; NetBSD i386; en-US; rv:1.9.2.12) Gecko/20101030 Firefox/3.6.12 +Mozilla/5.0 (X11; U; NetBSD i386; en-US; rv:1.9.2.3) Gecko/20100403 Namoroka/3.6.3 +Mozilla/5.0 (X11; U; NetBSD sparc64; fr-FR; rv:1.8.1.6) Gecko/20070822 Firefox/2.0.0.6 +Mozilla/5.0 (X11; U; OSF1 alpha; en-US; rv:0.9.4.1) Gecko/20020517 Netscape6/6.2.3 +Mozilla/5.0 (X11; U; OpenBSD amd64; en-US; rv:1.8.0.9) Gecko/20070101 Firefox/1.5.0.9 +Mozilla/5.0 (X11; U; OpenBSD amd64; en-US; rv:1.8.1.6) Gecko/20070817 Firefox/2.0.0.6 +Mozilla/5.0 (X11; U; OpenBSD amd64; en-US; rv:1.9.0.1) Gecko/2008081402 Firefox/3.0.1 +Mozilla/5.0 (X11; U; OpenBSD amd64; en; rv:1.8.1.6) Gecko/20070817 Epiphany/2.18 Firefox/2.0.0.6 +Mozilla/5.0 (X11; U; OpenBSD arm; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Safari/531.2+ Epiphany/2.30.0 +Mozilla/5.0 (X11; U; OpenBSD i386; de-DE; rv:1.8.1.6) Gecko/20080429 Firefox/2.0.0.6 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.359.0 Safari/533.3 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.7.0.13) Gecko/20060901 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.7.10) Gecko/20050919 (No IDN) Firefox/1.0.6 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.7.13) Gecko/20060901 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.0.1) Gecko/20060213 Firefox/1.5.0.1 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.0.4) Gecko/20060628 Firefox/1.5.0.4 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.0.5) Gecko/20060819 Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.0.7) Gecko/20060920 Firefox/1.5.0.7 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.0.7) Gecko/20061017 Firefox/1.5.0.7 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.0.8) Gecko/20061110 Firefox/1.5.0.8 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.1.16) Gecko/20080812 Firefox/2.0.0.16 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.1.3) Gecko/20070505 Firefox/2.0.0.3 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.1.4) Gecko/20070704 Firefox/2.0.0.4 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.1.4) Gecko/20070704 Firefox/2.0.0.6 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.1.4) Gecko/20071127 Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.1.6) Gecko/20070819 Firefox/2.0.0.6 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.1.7) Gecko/20070930 Firefox/2.0.0.7 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20 +Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.9.2.8) Gecko/20101230 Firefox/3.6.8 +Mozilla/5.0 (X11; U; OpenBSD ppc; en-US; rv:1.8.0.10) Gecko/20070223 Firefox/1.5.0.10 +Mozilla/5.0 (X11; U; OpenBSD ppc; en-US; rv:1.8.1.4) Gecko/20070223 BonEcho/2.0.0.4 +Mozilla/5.0 (X11; U; OpenBSD ppc; en-US; rv:1.8.1.9) Gecko/20070223 BonEcho/2.0.0.9 +Mozilla/5.0 (X11; U; OpenBSD sparc64; en-AU; rv:1.8.1.6) Gecko/20071225 Firefox/2.0.0.6 +Mozilla/5.0 (X11; U; OpenBSD sparc64; en-CA; rv:1.8.0.2) Gecko/20060429 Firefox/1.5.0.2 +Mozilla/5.0 (X11; U; OpenBSD sparc64; en-US; rv:1.8.1.6) Gecko/20070816 Firefox/2.0.0.6 +Mozilla/5.0 (X11; U; OpenBSD sparc64; pl-PL; rv:1.8.0.2) Gecko/20060429 Firefox/1.5.0.2 +Mozilla/5.0 (X11; U; Slackware Linux i686; en-US; rv:1.9.0.10) Gecko/2009042315 Firefox/3.0.10 +Mozilla/5.0 (X11; U; Slackware Linux x86_64; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.30 Safari/532.5 +Mozilla/5.0 (X11; U; SunOS 5.11; en-US; rv:1.8.0.2) Gecko/20050405 Epiphany/1.7.1 +Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.7) Gecko/20041221 +Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.7) Gecko/20050502 +Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.7) Gecko/20051027 +Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.7) Gecko/20051122 +Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.7) Gecko/20060627 +Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.7.12) Gecko/20051121 Firefox/1.0.7 (Nexenta package 1.0.7) +Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.7.5) Gecko/20041109 Firefox/1.0 +Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.8.0.5) Gecko/20060728 Firefox/1.5.0.5 +Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.8.1) Gecko/20061024 Firefox/2.0 +Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.8.1) Gecko/20061211 Firefox/2.0 +Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.8.1.3) Gecko/20070423 Firefox/2.0.0.3 +Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.8.1.4) Gecko/20070622 Firefox/2.0.0.4 +Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.9.0.4) Gecko/2008111710 Firefox/3.0.4 +Mozilla/5.0 (X11; U; SunOS i86pc; en-ZW; rv:1.8.1.6) Gecko/20071125 Firefox/2.0.0.6 +Mozilla/5.0 (X11; U; SunOS i86pc; fr; rv:1.9.0.4) Gecko/2008111710 Firefox/3.0.4 +Mozilla/5.0 (X11; U; SunOS sun4u; de-DE; rv:0.9.4.1) Gecko/20020518 Netscape6/6.2.3 +Mozilla/5.0 (X11; U; SunOS sun4u; de-DE; rv:1.7) Gecko/20070606 +Mozilla/5.0 (X11; U; SunOS sun4u; de-DE; rv:1.8.1.6) Gecko/20070805 Firefox/2.0.0.6 +Mozilla/5.0 (X11; U; SunOS sun4u; de-DE; rv:1.9.1b4) Gecko/20090428 Firefox/2.0.0.0 +Mozilla/5.0 (X11; U; SunOS sun4u; en-GB; rv:1.8.0.1) Gecko/20060206 Firefox/1.5.0.1 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:0.9.2) Gecko/20011002 Netscape6/6.1 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:0.9.4) Gecko/20011206 Netscape6/6.2.1 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:0.9.4.1) Gecko/20020406 Netscape6/6.2.2 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:0.9.4.1) Gecko/20020518 Netscape6/6.2.3 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.0.0) Gecko/20020611 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.0.1) Gecko/20020719 Netscape/7.0 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.0.1) Gecko/20020920 Netscape/7.0 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.0.1) Gecko/20020921 Netscape/7.0 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.1) Gecko/20020827 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.1) Gecko/20020909 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.1) Gecko/20020925 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.2.1) Gecko/20021205 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.2.1) Gecko/20021212 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.2.1) Gecko/20021217 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.2.1) Gecko/20030711 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.3) Gecko/20030318 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.3.1) Gecko/20030509 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.4) Gecko/20041224 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.4a) Gecko/20030318 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.4b) Gecko/20030517 Mozilla Firebird/0.6 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.5a) Gecko/20030729 Mozilla Firebird/0.6.1 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7) Gecko/20060120 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7) Gecko/20060629 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7.11) Gecko/20050802 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7.12) Gecko/20050922 Firefox/1.0.7 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7.12) Gecko/20050927 Firefox/1.0.7 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7.13) Gecko/20060509 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7.5) Gecko/20041221 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7.5) Gecko/20050105 Epiphany/1.4.8 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7.7) Gecko/20050421 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7.8) Gecko/20050512 Firefox/1.0.4 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8) Gecko/20051130 Firefox/1.5 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.0.1) Gecko/20060206 Firefox/1.5.0.1 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.0.7) Gecko/20060915 Firefox/1.5.0.7 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1) Gecko/20061024 Firefox/2.0 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1) Gecko/20061228 Firefox/2.0 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.11) Gecko/20080118 Firefox/2.0.0.11 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.12) Gecko/20080210 Firefox/2.0.0.12 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.14) Gecko/20080418 Firefox/2.0.0.14 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.2) Gecko/20070226 Firefox/2.0.0.2 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.20) Gecko/20090108 Firefox/2.0.0.20 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.3) Gecko/20070321 Firefox/2.0.0.3 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.4) Gecko/20070531 Firefox/2.0.0.4 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.4) Gecko/20070622 Firefox/2.0.0.4 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.9) Gecko/20071102 Firefox/2.0.0.9 +Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.9b5) Gecko/2008032620 Firefox/3.0b5 +Mozilla/5.0 (X11; U; SunOS sun4u; fr-FR; rv:1.7) Gecko/20040621 +Mozilla/5.0 (X11; U; SunOS sun4u; it-IT; ) Gecko/20080000 Firefox/3.0 +Mozilla/5.0 (X11; U; SunOS sun4u; pl-PL; rv:1.8.1.6) Gecko/20071217 Firefox/2.0.0.6 +Mozilla/5.0 (X11; U; SunOS sun4v; en-US; rv:1.7) Gecko/20060120 +Mozilla/5.0 (X11; U; SunOS sun4v; en-US; rv:1.8.1.3) Gecko/20070321 Firefox/2.0.0.3 +Mozilla/5.0 (X11; U; SunOS sun4v; es-ES; rv:1.8.1.9) Gecko/20071127 Firefox/2.0.0.9 +Mozilla/5.0 (X11; U; SunOS5.10 sun4u; ja-JP; rv:1.5) Gecko/20031022 +Mozilla/5.0 (X11; U; Win95; en-US; rv:1.8.1) Gecko/20061125 BonEcho/2.0 +Mozilla/5.0 (X11; U; Windows NT 5.0; en-US; rv:1.9b4) Gecko/2008030318 Firefox/3.0b4 +Mozilla/5.0 (X11; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 +Mozilla/5.0 (X11; U; Windows NT 6; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.587.0 Safari/534.12 +Mozilla/5.0 (X11; U; Windows NT i686; fr; rv:1.9.0.1) Gecko/2008070206 Firefox/2.0.0.8 +Mozilla/5.0 (X11; U; x86_64 Linux; en_GB, en_US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.358.0 Safari/533.3 +Mozilla/5.0 (X11; U; x86_64 Linux; en_GB, en_US; rv:1.9.2) Gecko/20100115 Firefox/3.6 +Mozilla/5.0 (X11; U; x86_64 Linux; en_US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7 +Mozilla/5.0 (X11; U; x86_64 Linux; en_US; rv:1.8.16) Gecko/20071015 Firefox/2.0.0.8 +Mozilla/5.0 (X11; U; x86_64 Linux; en_US; rv:1.9.0.5) Gecko/2008120121 Firefox/3.0.5 +Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1 +Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1 +Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1 +Mozilla/5.0 (X11; debian; Linux x86_64; rv:15.0) Gecko/20100101 Iceweasel/15.0 +Mozilla/5.0 (X11;U; Linux i686; en-GB; rv:1.9.1) Gecko/20090624 Ubuntu/9.04 (jaunty) Firefox/3.5 +Mozilla/5.0 (X11;U;Linux i686;en-US;rv:1.8.1) Gecko/2006101022 Firefox/2.0 +Mozilla/5.0 (ZX-81; U; CP/M86; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1 +Mozilla/5.0 (compatible; ABrowse 0.4; Syllable) +Mozilla/5.0 (compatible; IBrowse 3.0; AmigaOS4.0) +Mozilla/5.0 (compatible; Konqueror/2.1.1; X11) +Mozilla/5.0 (compatible; Konqueror/2.1.2; X11) +Mozilla/5.0 (compatible; Konqueror/2.2-11; Linux) +Mozilla/5.0 (compatible; Konqueror/2.2-12; Linux) +Mozilla/5.0 (compatible; Konqueror/2.2.1; Linux) +Mozilla/5.0 (compatible; Konqueror/2.2.2) +Mozilla/5.0 (compatible; Konqueror/2.2.2-3; Linux) +Mozilla/5.0 (compatible; Konqueror/2.2.2; Linux 2.4.14-xfs; X11; i686) +Mozilla/5.0 (compatible; Konqueror/2.2.2; Linux) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20020217) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20020319) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20020515) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20020523) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20020703) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20020704) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20020705) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20020723) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20020726) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20020801) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20020807) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20020808) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20020906) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20020911) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20020917) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20021026) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20021103) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20021118) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20021206) +Mozilla/5.0 (compatible; Konqueror/3.0-rc1; i686 Linux; 20021208) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20020105) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20020106) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20020107) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20020108) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20020110) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20020213) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20020219) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20020226) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20020323) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20020424) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20020505) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20020602) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20020606) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20020702) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20020809) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20021008) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20021118) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20021127) +Mozilla/5.0 (compatible; Konqueror/3.0-rc2; i686 Linux; 20021221) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20020412) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20020426) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20020506) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20020517) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20020519) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20020605) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20020608) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20020624) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20020626) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20020703) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20020724) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20020812) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20020818) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20020910) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20020914) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20021013) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20021018) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20021025) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20021123) +Mozilla/5.0 (compatible; Konqueror/3.0-rc3; i686 Linux; 20021125) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20020420) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20020504) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20020517) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20020519) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20020609) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20020622) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20020628) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20020707) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20020721) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20020802) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20020818) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20020821) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20020915) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20020920) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20020923) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20020926) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20021004) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20021016) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20021028) +Mozilla/5.0 (compatible; Konqueror/3.0-rc4; i686 Linux; 20021117) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20020628) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20020703) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20020724) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20020821) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20020822) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20020901) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20020910) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20020913) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20020921) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20021015) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20021020) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20021026) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20021105) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20021109) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20021120) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20021121) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20021208) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20021210) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20021213) +Mozilla/5.0 (compatible; Konqueror/3.0-rc5; i686 Linux; 20021226) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20020312) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20020512) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20020520) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20020522) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20020613) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20020614) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20020624) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20020718) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20020723) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20020817) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20020827) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20020908) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20020912) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20020918) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20020923) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20021012) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20021027) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20021106) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20021115) +Mozilla/5.0 (compatible; Konqueror/3.0-rc6; i686 Linux; 20021127) +Mozilla/5.0 (compatible; Konqueror/3.0.0-10; Linux) +Mozilla/5.0 (compatible; Konqueror/3.0.0; Linux) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20020423) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20020502) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20020510) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20020511) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20020603) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20020608) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20020707) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20020716) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20020728) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20020809) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20020817) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20020823) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20020825) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20020914) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20020927) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20021006) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20021012) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20021107) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20021117) +Mozilla/5.0 (compatible; Konqueror/3.0; i686 Linux; 20021219) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20020510) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20020515) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20020520) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20020608) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20020618) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20020620) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20020703) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20020711) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20020718) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20020722) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20020723) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20020816) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20020823) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20020919) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20021008) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20021022) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20021113) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20021120) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20021221) +Mozilla/5.0 (compatible; Konqueror/3.1-rc1; i686 Linux; 20021226) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20020509) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20020513) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20020605) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20020612) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20020614) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20020619) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20020721) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20020808) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20020809) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20020818) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20020820) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20020905) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20020917) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20020925) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20021011) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20021014) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20021020) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20021119) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20021128) +Mozilla/5.0 (compatible; Konqueror/3.1-rc2; i686 Linux; 20021221) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20020421) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20020426) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20020510) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20020515) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20020520) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20020607) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20020709) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20020716) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20020725) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20020818) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20020912) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20020915) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20020926) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20021004) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20021025) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20021110) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20021125) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20021204) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20021210) +Mozilla/5.0 (compatible; Konqueror/3.1-rc3; i686 Linux; 20021223) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20020420) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20020511) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20020521) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20020602) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20020714) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20020718) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20020808) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20020811) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20020824) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20020827) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20020901) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20020912) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20020913) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20020928) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20021026) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20021114) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20021124) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20021204) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20021208) +Mozilla/5.0 (compatible; Konqueror/3.1-rc4; i686 Linux; 20021217) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20020524) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20020601) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20020606) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20020615) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20020621) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20020625) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20020712) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20020809) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20020819) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20020823) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20020906) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20020910) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20020913) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20020927) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20021001) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20021112) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20021127) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20021212) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20021219) +Mozilla/5.0 (compatible; Konqueror/3.1-rc5; i686 Linux; 20021224) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20020607) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20020614) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20020624) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20020626) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20020815) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20020822) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20020828) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20020905) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20020907) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20020915) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20021002) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20021006) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20021019) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20021105) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20021113) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20021119) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20021124) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20021203) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20021219) +Mozilla/5.0 (compatible; Konqueror/3.1-rc6; i686 Linux; 20021224) +Mozilla/5.0 (compatible; Konqueror/3.1; Linux) +Mozilla/5.0 (compatible; Konqueror/3.1; Linux; X11; i686) +Mozilla/5.0 (compatible; Konqueror/3.1; Linux; en) +Mozilla/5.0 (compatible; Konqueror/3.1; i686 Linux; 20020712) +Mozilla/5.0 (compatible; Konqueror/3.1; i686 Linux; 20020720) +Mozilla/5.0 (compatible; Konqueror/3.1; i686 Linux; 20020810) +Mozilla/5.0 (compatible; Konqueror/3.1; i686 Linux; 20020811) +Mozilla/5.0 (compatible; Konqueror/3.1; i686 Linux; 20020817) +Mozilla/5.0 (compatible; Konqueror/3.1; i686 Linux; 20020913) +Mozilla/5.0 (compatible; Konqueror/3.1; i686 Linux; 20020928) +Mozilla/5.0 (compatible; Konqueror/3.1; i686 Linux; 20021001) +Mozilla/5.0 (compatible; Konqueror/3.1; i686 Linux; 20021006) +Mozilla/5.0 (compatible; Konqueror/3.1; i686 Linux; 20021007) +Mozilla/5.0 (compatible; Konqueror/3.1; i686 Linux; 20021027) +Mozilla/5.0 (compatible; Konqueror/3.1; i686 Linux; 20021102) +Mozilla/5.0 (compatible; Konqueror/3.1; i686 Linux; 20021103) +Mozilla/5.0 (compatible; Konqueror/3.1; i686 Linux; 20021105) +Mozilla/5.0 (compatible; Konqueror/3.1; i686 Linux; 20021106) +Mozilla/5.0 (compatible; Konqueror/3.1; i686 Linux; 20021113) +Mozilla/5.0 (compatible; Konqueror/3.1; i686 Linux; 20021128) +Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.2; Linux 2.6.2) (KHTML, like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.2; Linux) (KHTML, like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.2; Linux; X11; en_US) (KHTML, like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.3) (KHTML, like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.3) KHTML/3.3.2 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.3; Linux 2.4.22-xfs; X11) KHTML/3.3.2 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.3; Linux 2.4.27; X11) (KHTML, like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.3; Linux 2.6.11) KHTML/3.3.2 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.3; Linux 2.6.11.12-whnetz-xenU; X11; i686; en_US) KHTML/3.3.2 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.3; Linux 2.6.11; X11) KHTML/3.3.2 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.3; Linux 2.6.11; X11; i686) KHTML/3.3.2 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.3; Linux 2.6.11; X11; i686; de) KHTML/3.3.2 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.3; Linux 2.6.9-1.667) (KHTML, like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.3; Linux) (KHTML, like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.3; Linux) KHTML/3.3.2 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.3; SunOS) (KHTML, like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.4) KHTML/3.4.0 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.4) KHTML/3.4.2 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.4; Linux 2.6.11; X11) +Mozilla/5.0 (compatible; Konqueror/3.4; Linux 2.6.11; X11) KHTML/3.4.0 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.4; Linux 2.6.12.6; X11; i686; en_US) KHTML/3.4.3 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.4; Linux 2.6.12; X11) KHTML/3.4.1 (like Gecko) (Debian package 4:3.4.1-1) +Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.0 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.1 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.2 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.2 (like Gecko) (Debian package 4:3.4.2-4) +Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.3 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.3 (like Gecko) (Debian package 4:3.4.3-2) +Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.3 (like Gecko) (Kubuntu package 4:3.4.3-0ubuntu1) +Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.3 (like Gecko) (Kubuntu package 4:3.4.3-0ubuntu2) +Mozilla/5.0 (compatible; Konqueror/3.4; Linux; de, en_US) KHTML/3.4.2 (like Gecko) (Debian package 4:3.4.2-4) +Mozilla/5.0 (compatible; Konqueror/3.4; SunOS) KHTML/3.4.1 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.6 (like Gecko) (Kubuntu) +Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.7 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.7 (like Gecko) (Debian) +Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.7 (like Gecko) (Kubuntu) +Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.7 (like Gecko) SUSE +Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.9 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.5; Linux; X11) KHTML/3.5.3 (like Gecko) Kubuntu 6.06 Dapper +Mozilla/5.0 (compatible; Konqueror/3.5; Linux; X11; i686; en_US) KHTML/3.5.6 (like Gecko) (Debian) +Mozilla/5.0 (compatible; Konqueror/3.5; Linux; de) KHTML/3.5.5 (like Gecko) (Debian) +Mozilla/5.0 (compatible; Konqueror/3.5; Linux; en_US) KHTML/3.5.6 (like Gecko) (Kubuntu) +Mozilla/5.0 (compatible; Konqueror/3.5; Linux; i686; U; it-IT) KHTML/3.5.5 (like Gecko) (Debian) +Mozilla/5.0 (compatible; Konqueror/3.5; Linux; x86_64) KHTML/3.5.5 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.5; Linux; x86_64) KHTML/3.5.5 (like Gecko) (Debian) +Mozilla/5.0 (compatible; Konqueror/3.5; Linux; x86_64; en_US) KHTML/3.5.10 (like Gecko) SUSE +Mozilla/5.0 (compatible; Konqueror/3.5; NetBSD 3.0; X11) KHTML/3.5.2 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.5; NetBSD 4.0_RC3; X11) KHTML/3.5.7 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.5; SunOS) +Mozilla/5.0 (compatible; Konqueror/3.5; SunOS) KHTML/3.5.0 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.5; SunOS) KHTML/3.5.1 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/3.5; Windows NT 6.0) KHTML/3.5.6 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/4.0; Linux) KHTML/4.0.82 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/4.0; Linux; x86_64) KHTML/4.0.2 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/4.0; Windows) KHTML/4.0.83 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/4.0; X11) KHTML/4.0.3 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/4.1; DragonFly) KHTML/4.1.4 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/4.1; Linux 2.6.27.7-134.fc10.x86_64; X11; x86_64) KHTML/4.1.3 (like Gecko) Fedora/4.1.3-4.fc10 +Mozilla/5.0 (compatible; Konqueror/4.1; Linux) KHTML/4.1.3 (like Gecko) Fedora/4.1.3-3.fc10 +Mozilla/5.0 (compatible; Konqueror/4.1; Linux) KHTML/4.1.4 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/4.1; OpenBSD) KHTML/4.1.4 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/4.2) KHTML/4.2.4 (like Gecko) Fedora/4.2.4-2.fc11 +Mozilla/5.0 (compatible; Konqueror/4.2; Linux) KHTML/4.2.1 (like Gecko) Fedora/4.2.1-4.fc11 +Mozilla/5.0 (compatible; Konqueror/4.2; Linux) KHTML/4.2.2 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/4.2; Linux) KHTML/4.2.4 (like Gecko) Fedora/4.2.4-2.fc11 +Mozilla/5.0 (compatible; Konqueror/4.2; Linux) KHTML/4.2.4 (like Gecko) Slackware/13.0 +Mozilla/5.0 (compatible; Konqueror/4.2; Linux) KHTML/4.2.96 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/4.2; Linux) KHTML/4.2.98 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/4.2; Linux; X11; x86_64) KHTML/4.2.4 (like Gecko) Fedora/4.2.4-2.fc11 +Mozilla/5.0 (compatible; Konqueror/4.3; Linux 2.6.31-16-generic; X11) KHTML/4.3.2 (like Gecko) +Mozilla/5.0 (compatible; Konqueror/4.3; Linux) KHTML/4.3.1 (like Gecko) Fedora/4.3.1-3.fc11 +Mozilla/5.0 (compatible; Konqueror/4.4; Linux 2.6.32-22-generic; X11; en_US) KHTML/4.4.3 (like Gecko) Kubuntu +Mozilla/5.0 (compatible; Konqueror/4.4; Linux) KHTML/4.4.1 (like Gecko) Fedora/4.4.1-1.fc12 +Mozilla/5.0 (compatible; Konqueror/4.5; FreeBSD) KHTML/4.5.4 (like Gecko) +Mozilla/5.0 (compatible; MSIE 10.0; Macintosh; Intel Mac OS X 10_7_3; Trident/6.0) +Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/4.0; InfoPath.2; SV1; .NET CLR 2.0.50727; WOW64) +Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0) +Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0) +Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0) +Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0 +Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1) +Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4325) +Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) +Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1; zh-cn) Opera 8.65 +Mozilla/5.0 (compatible; MSIE 7.0; Windows 98; SpamBlockerUtility 6.3.91; SpamBlockerUtility 6.2.91; .NET CLR 4.1.89;GB) +Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.0; Trident/4.0; FBSMTWB; .NET CLR 2.0.34861; .NET CLR 3.0.3746.3218; .NET CLR 3.5.33652; msn OptimizedIE8;ENUS) +Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.2; WOW64; .NET CLR 2.0.50727) +Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; c .NET CLR 3.0.04506; .NET CLR 3.5.30707; InfoPath.1; el-GR) +Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; c .NET CLR 3.0.04506; .NET CLR 3.5.30707; InfoPath.1; el-GR) +Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; en-US) +Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; fr-FR) +Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 3.0.04506.30) +Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; SLCC1; .NET CLR 1.1.4322) +Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727) +Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) +Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Maxthon; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 3.0.04320) +Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322) +Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320) +Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320; Maxthon 2.0) +Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; SV1; Crazy Browser 9.0.04) +Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; .NET CLR 2.7.58687; SLCC2; Media Center PC 5.0; Zune 3.4; Tablet PC 3.6; InfoPath.3) +Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.8.36217; WOW64; en-US) +Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322) +Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US) +Mozilla/5.0 (compatible; MSIE 9.0; AOL 9.0; Windows NT 6.0; Trident/5.0) +Mozilla/5.0 (compatible; MSIE 9.0; AOL 9.1; AOLBuild 4334.5012; Windows NT 6.0; WOW64; Trident/5.0) +Mozilla/5.0 (compatible; MSIE 9.0; AOL 9.7; AOLBuild 4343.19; Windows NT 6.1; WOW64; Trident/5.0; FunWebProducts) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/4.0; GTB7.4; InfoPath.3; SV1; .NET CLR 3.1.76908; WOW64; en-US) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/4.0; Maxthon; SV1; .NET CLR 1.1.4322; .NET CLR 2.4.84947; SLCC1; Media Center PC 4.0; Zune 3.5; Tablet PC 3.5; InfoPath.3) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; Sleipnir/2.9.7) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; TheWorld) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; chromeframe/11.0.696.57) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.1; SV1; .NET CLR 2.8.52393; WOW64; en-US) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/4.0; WOW64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0; Maxthon 2.0) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/4.0; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; InfoPath.3; MS-RTC LM 8; .NET4.0C; .NET4.0E; Maxthon 2.0) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) chromeframe/10.0.648.205 +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; FunWebProducts) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET CLR 1.1.4322; .NET4.0C; Tablet PC 2.0) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/11.0.696.57) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/13.0.782.215) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; yie8) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; Maxthon/3.0) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Lunascape 6.7.1.25446) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; InfoPath.3; MS-RTC LM 8; .NET4.0C; .NET4.0E) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7 +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; chromeframe/12.0.742.112) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0 +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; Tablet PC 2.0; InfoPath.3; .NET4.0C; .NET4.0E) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0) +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51 +Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0) +Mozilla/5.0 (compatible; Sundance/0.9x) +Mozilla/5.0 (compatible; U; ABrowse 0.6; Syllable) AppleWebKit/420+ (KHTML, like Gecko) +Mozilla/5.0 (compatible; Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070219 +Mozilla/5.0 (compatible; Windows; U; Windows NT 6.2; WOW64; en-US; rv:12.0) Gecko/20120403211507 Firefox/12.0 +Mozilla/5.0 (compatible; iCab 3.0.2; Macintosh; U; PPC Mac OS X) +Mozilla/5.0 (compatible; iCab 3.0.2; Macintosh; U; PPC Mac OS) +Mozilla/5.0 (compatible; iCab 3.0.3; Macintosh; U; PPC Mac OS X) +Mozilla/5.0 (compatible; iCab 3.0.3; Macintosh; U; PPC Mac OS) +Mozilla/5.0 (compatible; iCab 3.0.5; Macintosh; U; PPC Mac OS X) +Mozilla/5.0 (compatible; iCab 3.0.5; Macintosh; U; PPC Mac OS) +Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3 +Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25 +Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; es-es) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B360 Safari/531.21.10 +Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; es-es) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10 +Mozilla/5.0 (iPad; U; CPU OS 3_2_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B500 Safari/53 +Mozilla/5.0 (iPad;U;CPU OS 3_2_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B500 Safari/531.21.10 +Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7D11 Safari/531.21.10 +Mozilla/5.0 (iPhone; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10 +Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7 +Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B5097d Safari/6531.22.7 +Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; nb-no) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5 +Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; ru-ru) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5 +Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3 like Mac OS X; en-gb) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5 +Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3 like Mac OS X; fr-fr) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5 +Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3 like Mac OS X; pl-pl) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5 +Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_1 like Mac OS X; zh-tw) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8G4 Safari/6533.18.5 +Mozilla/5.0 (iPhone; U; Linux i686; pt-br) AppleWebKit/532+ (KHTML, like Gecko) Version/3.0 Mobile/1A538b Safari/419.3 Midori/0.2.0 +Mozilla/5.0 (iPhone; U; fr; CPU iPhone OS 4_2_1 like Mac OS X; fr) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5 +Mozilla/5.0 (iPhone; U; ru; CPU iPhone OS 4_2_1 like Mac OS X; fr) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5 +Mozilla/5.0 (iPhone; U; ru; CPU iPhone OS 4_2_1 like Mac OS X; ru) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5 +Mozilla/5.0 (iPod; U; CPU iPhone OS 4_2_1 like Mac OS X; he-il) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5 +Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8G4 Safari/6533.18.5 +Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5 +Mozilla/5.0 (ipad Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.6 (KHTML, like Gecko) Chrome/7.0.498.0 Safari/534.6 +Mozilla/5.0 ArchLinux (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 +Mozilla/5.0 ArchLinux (X11; U; Linux x86_64; en-US) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 +Mozilla/5.0 ArchLinux (X11; U; Linux x86_64; en-US) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30 +Mozilla/5.0 ArchLinux (X11; U; Linux x86_64; en-US) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.60 Safari/534.30 +Mozilla/5.0 Galeon/1.0.3 (X11; Linux i686; U;) Gecko/0 +Mozilla/5.0 Galeon/1.2.5 (X11; Linux i586; U;) Gecko/20020623 Debian/1.2.5-0.woody.1 +Mozilla/5.0 Galeon/1.2.5 (X11; Linux i686; U;) Gecko/0 +Mozilla/5.0 Galeon/1.2.5 (X11; Linux i686; U;) Gecko/20020610 Debian/1.2.5-1 +Mozilla/5.0 Galeon/1.2.5 (X11; Linux i686; U;) Gecko/20020623 Debian/1.2.5-0.woody.1 +Mozilla/5.0 Galeon/1.2.5 (X11; Linux i686; U;) Gecko/20020809 +Mozilla/5.0 Galeon/1.2.6 (X11; Linux i586; U;) Gecko/20020916 +Mozilla/5.0 Galeon/1.2.6 (X11; Linux i686; U;) Gecko/20020827 +Mozilla/5.0 Galeon/1.2.6 (X11; Linux i686; U;) Gecko/20020830 +Mozilla/5.0 Galeon/1.2.6 (X11; Linux i686; U;) Gecko/20020913 Debian/1.2.6-2 +Mozilla/5.0 Galeon/1.2.6 (X11; Linux i686; U;) Gecko/20020916 +Mozilla/5.0 Galeon/1.2.7 (X11; Linux i686; U;) Gecko/20021226 Debian/1.2.7-6 +Mozilla/5.0 Galeon/1.2.8 (X11; Linux i686; U;) Gecko/20030212 +Mozilla/5.0 Galeon/1.2.8 (X11; Linux i686; U;) Gecko/20030317 +Mozilla/5.0 Galeon/1.2.9 (X11; Linux i686; U;) Gecko/20021213 Debian/1.2.9-0.bunk +Mozilla/5.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.13) Firefox/3.6.13 +Mozilla/5.0 Slackware/13.37 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/11.0.696.50 +Mozilla/5.0 Slackware/13.37 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/12.0.742.91 +Mozilla/5.0 Slackware/13.37 (X11; U; Linux x86_64; en-US) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 +Mozilla/5.0(Compatible; Windows; U; en-US;) Sundance/0.9 +Mozilla/5.0(Compatible; Windows; U; en-US;) Sundance/0.9.0.33 +Mozilla/5.0(Windows; U; Windows NT 5.2; rv:1.9.2) Gecko/20100101 Firefox/3.6 +Mozilla/5.0(Windows; U; Windows NT 7.0; rv:1.9.2) Gecko/20100101 Firefox/3.6 +Mozilla/5.0(X11;U;Linux(x86_64);en;rv:1.9a8)Gecko/2007100619;GranParadiso/3.1 +Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/123 +Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10 +Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10gin_lib.cc +Mozilla/5.001 (Macintosh; N; PPC; ja) Gecko/25250101 +Mozilla/5.001 (X11; U; Linux i686; rv:1.8.1.6; de-ch) Gecko/25250101 (ubuntu-feisty) +Mozilla/6.0 (Future Star Technologies Corp. Star-Blade OS; U; en-US) iNet Browser 2.5 +Mozilla/6.0 (Macintosh; I; Intel Mac OS X 11_7_9; de-LI; rv:1.9b4) Gecko/2012010317 Firefox/10.0a4 +Mozilla/6.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:2.0.0.0) Gecko/20061028 Firefox/3.0 +Mozilla/6.0 (Windows; U; Windows NT 6.0; en-US) Gecko/2009032609 (KHTML, like Gecko) Chrome/2.0.172.6 Safari/530.7 +Mozilla/6.0 (Windows; U; Windows NT 6.0; en-US) Gecko/2009032609 Chrome/2.0.172.6 Safari/530.7 +Mozilla/6.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8 +Mozilla/6.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8 (.NET CLR 3.5.30729) +Mozilla/6.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.27 Safari/532.0 +Mozilla/6.0 (Windows; U; Windows NT 7.0; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.9 (.NET CLR 3.5.30729) +Mozilla/6.0 (X11; U; Linux x86_64; en-US; rv:2.9.0.3) Gecko/2009022510 FreeBSD/ Sunrise/4.0.1/like Safari +Opera 9.4 (Windows NT 5.3; U; en) +Opera 9.4 (Windows NT 6.1; U; en) +Opera 9.60 +Opera 9.7 (Windows NT 5.2; U; en) +Opera/10.50 (Windows NT 6.1; U; en-GB) Presto/2.2.2 +Opera/10.60 (Windows NT 5.1; U; en-US) Presto/2.6.30 Version/10.60 +Opera/10.60 (Windows NT 5.1; U; zh-cn) Presto/2.6.30 Version/10.60 +Opera/4.02 (Windows 98; U) [en] +Opera/5.0 (SunOS 5.8 sun4u; U) [en] +Opera/5.0 (Ubuntu; U; Windows NT 6.1; es; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 +Opera/5.02 (Macintosh; U; id) +Opera/5.02 (Windows 98; U) [en] +Opera/5.02 (Windows NT 5.0; U) [en] +Opera/5.11 (Windows 98; U) [en] +Opera/5.12 (Windows 98; U) [en] +Opera/5.12 (Windows NT 5.1; U) [de] +Opera/6.0 (Macintosh; PPC Mac OS X; U) +Opera/6.0 (Windows 2000; U) [de] +Opera/6.0 (Windows 2000; U) [fr] +Opera/6.0 (Windows ME; U) [de] +Opera/6.0 (Windows XP; U) [de] +Opera/6.01 (Windows 2000; U) [de] +Opera/6.01 (Windows 2000; U) [en] +Opera/6.01 (Windows 98; U) [de] +Opera/6.01 (Windows 98; U) [en] +Opera/6.01 (Windows XP; U) [de] +Opera/6.01 (X11; U; nn) +Opera/6.02 (Windows NT 4.0; U) [de] +Opera/6.03 (Linux 2.4.18-18.7.x i686; U) [en] +Opera/6.03 (Windows 2000; U) [en] +Opera/6.03 (Windows 98; U) [en] +Opera/6.03 (Windows NT 4.0; U) [en] +Opera/6.04 (Windows 2000; U) [de] +Opera/6.04 (Windows 2000; U) [en] +Opera/6.04 (Windows 98; U) [en-GB] +Opera/6.04 (Windows NT 4.0; U) [de] +Opera/6.04 (Windows NT 4.0; U) [en] +Opera/6.04 (Windows XP; U) [de] +Opera/6.04 (Windows XP; U) [en] +Opera/6.05 (Windows 2000; U) [de] +Opera/6.05 (Windows 2000; U) [en] +Opera/6.05 (Windows 2000; U) [fr] +Opera/6.05 (Windows 2000; U) [it] +Opera/6.05 (Windows 2000; U) [ja] +Opera/6.05 (Windows 2000; U) [oc] +Opera/6.05 (Windows 98; U) [de] +Opera/6.05 (Windows 98; U) [en] +Opera/6.05 (Windows 98; U) [fr] +Opera/6.05 (Windows ME; U) [de] +Opera/6.05 (Windows ME; U) [fr] +Opera/6.05 (Windows NT 4.0; U) [de] +Opera/6.05 (Windows NT 4.0; U) [fr] +Opera/6.05 (Windows NT 4.0; U) [ro] +Opera/6.05 (Windows XP; U) [de] +Opera/6.05 (Windows XP; U) [en] +Opera/6.11 (FreeBSD 4.7-RELEASE i386; U) [en] +Opera/6.11 (Linux 2.4.10-4GB i686; U) [en] +Opera/6.11 (Linux 2.4.18-4GB i686; U) [en] +Opera/6.11 (Linux 2.4.18-bf2.4 i686; U) [en] +Opera/6.12 (Linux 2.4.18-14cpq i686; U) [en] +Opera/6.12 (Linux 2.4.20-4GB i686; U) [en] +Opera/7.0 (Windows 2000; U) [de] +Opera/7.0 (Windows 2000; U) [en] +Opera/7.0 (Windows 98; U) [en] +Opera/7.0 (Windows NT 4.0; U) [de] +Opera/7.0 (Windows NT 4.0; U) [en] +Opera/7.0 (Windows NT 5.1; U) [en] +Opera/7.01 (Windows 98; U) [en] +Opera/7.01 (Windows 98; U) [fr] +Opera/7.01 (Windows NT 5.0; U) [en] +Opera/7.01 (Windows NT 5.1; U) [en] +Opera/7.02 (Windows 98; U) [en] +Opera/7.02 (Windows NT 5.1; U) [fr] +Opera/7.03 (Windows 98; U) [de] +Opera/7.03 (Windows 98; U) [en] +Opera/7.03 (Windows NT 4.0; U) [en] +Opera/7.03 (Windows NT 5.0; U) [de] +Opera/7.03 (Windows NT 5.0; U) [en] +Opera/7.03 (Windows NT 5.1; U) [de] +Opera/7.03 (Windows NT 5.1; U) [en] +Opera/7.10 (Linux Debian;en-US) +Opera/7.10 (Windows NT 4.0; U) [de] +Opera/7.10 (Windows NT 5.0; U) [en] +Opera/7.10 (Windows NT 5.1; U) [en] +Opera/7.11 (Linux 2.6.0-test4 i686; U) [en] +Opera/7.11 (Windows 98; U) [de] +Opera/7.11 (Windows 98; U) [en] +Opera/7.11 (Windows NT 5.0; U) [de] +Opera/7.11 (Windows NT 5.0; U) [en] +Opera/7.11 (Windows NT 5.1; U) [de] +Opera/7.11 (Windows NT 5.1; U) [en] +Opera/7.11 (Windows NT 5.1; U) [pl] +Opera/7.20 (Windows NT 5.1; U) [en] +Opera/7.21 (Windows NT 5.1; U) [en] +Opera/7.22 (Windows NT 5.1; U) [de] +Opera/7.23 (Windows 98; U) [en] +Opera/7.23 (Windows NT 5.0; U) [en] +Opera/7.23 (Windows NT 5.0; U) [fr] +Opera/7.23 (Windows NT 5.1; U; sv) +Opera/7.23 (Windows NT 6.0; U) [zh-cn] +Opera/7.50 (Windows NT 5.1; U) [en] +Opera/7.50 (Windows XP; U) +Opera/7.51 (Linux) [en] +Opera/7.51 (Windows NT 5.1; U) [en] +Opera/7.51 (X11; SunOS sun4u; U) [de] +Opera/7.52 (Windows NT 5.1; U) [en] +Opera/7.53 (Windows NT 5.1; U) [en] +Opera/7.53 (X11; Linux i686; U) [en_US] +Opera/7.54 (Windows 98; U) [de] +Opera/7.54 (Windows NT 5.0; U) [de] +Opera/7.54 (Windows NT 5.0; U) [en] +Opera/7.54 (Windows NT 5.1; U) [de] +Opera/7.54 (Windows NT 5.1; U) [en] +Opera/7.54 (Windows NT 5.1; U) [it] +Opera/7.54 (X11; Linux i686; U) [en] +Opera/8.0 (Windows NT 5.1; U; en) +Opera/8.0 (X11; Linux i686; U; cs) +Opera/8.00 (Windows NT 5.1; U; en) +Opera/8.01 (Macintosh; PPC Mac OS X; U; en) +Opera/8.01 (Macintosh; U; PPC Mac OS; en) +Opera/8.01 (Windows NT 5.0; U; de) +Opera/8.01 (Windows NT 5.1; U; de) +Opera/8.01 (Windows NT 5.1; U; en) +Opera/8.01 (Windows NT 5.1; U; fr) +Opera/8.01 (Windows NT 5.1; U; pl) +Opera/8.02 (Windows NT 5.1; U; de) +Opera/8.02 (Windows NT 5.1; U; en) +Opera/8.02 (Windows NT 5.1; U; ru) +Opera/8.10 (Windows NT 5.1; U; en) +Opera/8.50 (Windows 98; U; en) +Opera/8.50 (Windows 98; U; ru) +Opera/8.50 (Windows ME; U; en) +Opera/8.50 (Windows NT 4.0; U; zh-cn) +Opera/8.50 (Windows NT 5.0; U; de) +Opera/8.50 (Windows NT 5.0; U; en) +Opera/8.50 (Windows NT 5.0; U; fr) +Opera/8.50 (Windows NT 5.1; U; de) +Opera/8.50 (Windows NT 5.1; U; en) +Opera/8.50 (Windows NT 5.1; U; es-ES) +Opera/8.50 (Windows NT 5.1; U; fr) +Opera/8.50 (Windows NT 5.1; U; pl) +Opera/8.50 (Windows NT 5.1; U; ru) +Opera/8.51 (FreeBSD 5.1; U; en) +Opera/8.51 (Macintosh; PPC Mac OS X; U; de) +Opera/8.51 (Windows 98; U; en) +Opera/8.51 (Windows NT 5.0; U; en) +Opera/8.51 (Windows NT 5.1; U; de) +Opera/8.51 (Windows NT 5.1; U; en) +Opera/8.51 (Windows NT 5.1; U; fr) +Opera/8.51 (Windows NT 5.1; U; nb) +Opera/8.51 (Windows NT 5.1; U; pl) +Opera/8.51 (X11; Linux i686; U; en) +Opera/8.51 (X11; Linux x86_64; U; en) +Opera/8.51 (X11; U; Linux i686; en-US; rv:1.8) +Opera/8.52 (Windows ME; U; en) +Opera/8.52 (Windows NT 5.0; U; en) +Opera/8.52 (Windows NT 5.1; U; en) +Opera/8.52 (Windows NT 5.1; U; ru) +Opera/8.52 (X11; Linux i686; U; en) +Opera/8.52 (X11; Linux x86_64; U; en) +Opera/8.53 (Windows 98; U; en) +Opera/8.53 (Windows NT 5.0; U; en) +Opera/8.53 (Windows NT 5.1; U; de) +Opera/8.53 (Windows NT 5.1; U; en) +Opera/8.53 (Windows NT 5.1; U; pt) +Opera/8.53 (Windows NT 5.2; U; en) +Opera/8.54 (Windows 98; U; en) +Opera/8.54 (Windows NT 4.0; U; zh-cn) +Opera/8.54 (Windows NT 5.0; U; de) +Opera/8.54 (Windows NT 5.0; U; en) +Opera/8.54 (Windows NT 5.1; U; en) +Opera/8.54 (Windows NT 5.1; U; pl) +Opera/8.54 (Windows NT 5.1; U; ru) +Opera/8.54 (X11; Linux i686; U; de) +Opera/8.54 (X11; Linux i686; U; pl) +Opera/9.00 (Macintosh; PPC Mac OS X; U; es) +Opera/9.00 (Nintendo Wii; U; ; 1038-58; Wii Internet Channel/1.0; en) +Opera/9.00 (Windows NT 5.0; U; en) +Opera/9.00 (Windows NT 5.1; U; de) +Opera/9.00 (Windows NT 5.1; U; en) +Opera/9.00 (Windows NT 5.1; U; es-es) +Opera/9.00 (Windows NT 5.1; U; fi) +Opera/9.00 (Windows NT 5.1; U; fr) +Opera/9.00 (Windows NT 5.1; U; it) +Opera/9.00 (Windows NT 5.1; U; ja) +Opera/9.00 (Windows NT 5.1; U; nl) +Opera/9.00 (Windows NT 5.1; U; pl) +Opera/9.00 (Windows NT 5.1; U; ru) +Opera/9.00 (Windows NT 5.2; U; en) +Opera/9.00 (Windows NT 5.2; U; pl) +Opera/9.00 (Windows NT 5.2; U; ru) +Opera/9.00 (Windows; U) +Opera/9.00 (X11; Linux i686; U; de) +Opera/9.00 (X11; Linux i686; U; en) +Opera/9.00 (X11; Linux i686; U; pl) +Opera/9.01 (Macintosh; PPC Mac OS X; U; en) +Opera/9.01 (Macintosh; PPC Mac OS X; U; it) +Opera/9.01 (Windows NT 5.0; U; de) +Opera/9.01 (Windows NT 5.0; U; en) +Opera/9.01 (Windows NT 5.1) +Opera/9.01 (Windows NT 5.1; U; bg) +Opera/9.01 (Windows NT 5.1; U; cs) +Opera/9.01 (Windows NT 5.1; U; da) +Opera/9.01 (Windows NT 5.1; U; de) +Opera/9.01 (Windows NT 5.1; U; en) +Opera/9.01 (Windows NT 5.1; U; es-es) +Opera/9.01 (Windows NT 5.1; U; ja) +Opera/9.01 (Windows NT 5.1; U; pl) +Opera/9.01 (Windows NT 5.1; U; ru) +Opera/9.01 (Windows NT 5.2; U; en) +Opera/9.01 (Windows NT 5.2; U; ru) +Opera/9.01 (X11; FreeBSD 6 i386; U; en) +Opera/9.01 (X11; FreeBSD 6 i386; U;pl) +Opera/9.01 (X11; Linux i686; U; en) +Opera/9.01 (X11; OpenBSD i386; U; en) +Opera/9.02 (Windows NT 5.0; U; en) +Opera/9.02 (Windows NT 5.0; U; pl) +Opera/9.02 (Windows NT 5.0; U; sv) +Opera/9.02 (Windows NT 5.1; U; de) +Opera/9.02 (Windows NT 5.1; U; en) +Opera/9.02 (Windows NT 5.1; U; fi) +Opera/9.02 (Windows NT 5.1; U; ja) +Opera/9.02 (Windows NT 5.1; U; nb) +Opera/9.02 (Windows NT 5.1; U; pl) +Opera/9.02 (Windows NT 5.1; U; pt-br) +Opera/9.02 (Windows NT 5.1; U; ru) +Opera/9.02 (Windows NT 5.1; U; zh-cn) +Opera/9.02 (Windows NT 5.2; U; de) +Opera/9.02 (Windows NT 5.2; U; en) +Opera/9.02 (Windows XP; U; ru) +Opera/9.02 (Windows; U; nl) +Opera/9.02 (X11; Linux i686; U; de) +Opera/9.02 (X11; Linux i686; U; en) +Opera/9.02 (X11; Linux i686; U; hu) +Opera/9.02 (X11; Linux i686; U; pl) +Opera/9.10 (Windows NT 5.1; U; MEGAUPLOAD 1.0; pl) +Opera/9.10 (Windows NT 5.1; U; es-es) +Opera/9.10 (Windows NT 5.1; U; fi) +Opera/9.10 (Windows NT 5.1; U; hu) +Opera/9.10 (Windows NT 5.1; U; it) +Opera/9.10 (Windows NT 5.1; U; nl) +Opera/9.10 (Windows NT 5.1; U; pl) +Opera/9.10 (Windows NT 5.1; U; pt) +Opera/9.10 (Windows NT 5.1; U; sv) +Opera/9.10 (Windows NT 5.1; U; zh-tw) +Opera/9.10 (Windows NT 5.2; U; de) +Opera/9.10 (Windows NT 5.2; U; en) +Opera/9.10 (Windows NT 6.0; U; en) +Opera/9.10 (Windows NT 6.0; U; it-IT) +Opera/9.10 (X11; Linux i386; U; en) +Opera/9.10 (X11; Linux i686; U; en) +Opera/9.10 (X11; Linux i686; U; kubuntu;pl) +Opera/9.10 (X11; Linux i686; U; pl) +Opera/9.10 (X11; Linux x86_64; U; en) +Opera/9.10 (X11; Linux; U; en) +Opera/9.12 (Windows NT 5.0; U) +Opera/9.12 (Windows NT 5.0; U; ru) +Opera/9.12 (X11; Linux i686; U; en) (Ubuntu) +Opera/9.20 (Windows NT 5.1; U; MEGAUPLOAD=1.0; es-es) +Opera/9.20 (Windows NT 5.1; U; en) +Opera/9.20 (Windows NT 5.1; U; es-AR) +Opera/9.20 (Windows NT 5.1; U; es-es) +Opera/9.20 (Windows NT 5.1; U; it) +Opera/9.20 (Windows NT 5.1; U; nb) +Opera/9.20 (Windows NT 5.1; U; zh-tw) +Opera/9.20 (Windows NT 5.2; U; en) +Opera/9.20 (Windows NT 6.0; U; de) +Opera/9.20 (Windows NT 6.0; U; en) +Opera/9.20 (Windows NT 6.0; U; es-es) +Opera/9.20 (X11; Linux i586; U; en) +Opera/9.20 (X11; Linux i686; U; en) +Opera/9.20 (X11; Linux i686; U; es-es) +Opera/9.20 (X11; Linux i686; U; pl) +Opera/9.20 (X11; Linux i686; U; ru) +Opera/9.20 (X11; Linux i686; U; tr) +Opera/9.20 (X11; Linux ppc; U; en) +Opera/9.20 (X11; Linux x86_64; U; en) +Opera/9.20(Windows NT 5.1; U; en) +Opera/9.21 (Macintosh; Intel Mac OS X; U; en) +Opera/9.21 (Macintosh; PPC Mac OS X; U; en) +Opera/9.21 (Windows 98; U; en) +Opera/9.21 (Windows NT 5.0; U; de) +Opera/9.21 (Windows NT 5.1; U; MEGAUPLOAD 1.0; en) +Opera/9.21 (Windows NT 5.1; U; SV1; MEGAUPLOAD 1.0; ru) +Opera/9.21 (Windows NT 5.1; U; de) +Opera/9.21 (Windows NT 5.1; U; en) +Opera/9.21 (Windows NT 5.1; U; fr) +Opera/9.21 (Windows NT 5.1; U; nl) +Opera/9.21 (Windows NT 5.1; U; pl) +Opera/9.21 (Windows NT 5.1; U; pt-br) +Opera/9.21 (Windows NT 5.1; U; ru) +Opera/9.21 (Windows NT 5.2; U; en) +Opera/9.21 (Windows NT 6.0; U; en) +Opera/9.21 (Windows NT 6.0; U; nb) +Opera/9.21 (X11; Linux i686; U; de) +Opera/9.21 (X11; Linux i686; U; en) +Opera/9.21 (X11; Linux i686; U; es-es) +Opera/9.21 (X11; Linux x86_64; U; en) +Opera/9.22 (Windows NT 5.1; U; SV1; MEGAUPLOAD 1.0; ru) +Opera/9.22 (Windows NT 5.1; U; SV1; MEGAUPLOAD 2.0; ru) +Opera/9.22 (Windows NT 5.1; U; en) +Opera/9.22 (Windows NT 5.1; U; fr) +Opera/9.22 (Windows NT 5.1; U; pl) +Opera/9.22 (Windows NT 6.0; U; en) +Opera/9.22 (Windows NT 6.0; U; ru) +Opera/9.22 (X11; Linux i686; U; de) +Opera/9.22 (X11; Linux i686; U; en) +Opera/9.22 (X11; OpenBSD i386; U; en) +Opera/9.23 (Mac OS X; fr) +Opera/9.23 (Mac OS X; ru) +Opera/9.23 (Macintosh; Intel Mac OS X; U; ja) +Opera/9.23 (Nintendo Wii; U; ; 1038-58; Wii Internet Channel/1.0; en) +Opera/9.23 (Windows NT 5.0; U; de) +Opera/9.23 (Windows NT 5.0; U; en) +Opera/9.23 (Windows NT 5.1; U; SV1; MEGAUPLOAD 1.0; ru) +Opera/9.23 (Windows NT 5.1; U; da) +Opera/9.23 (Windows NT 5.1; U; de) +Opera/9.23 (Windows NT 5.1; U; en) +Opera/9.23 (Windows NT 5.1; U; fi) +Opera/9.23 (Windows NT 5.1; U; it) +Opera/9.23 (Windows NT 5.1; U; ja) +Opera/9.23 (Windows NT 5.1; U; pt) +Opera/9.23 (Windows NT 5.1; U; zh-cn) +Opera/9.23 (Windows NT 6.0; U; de) +Opera/9.23 (X11; Linux i686; U; en) +Opera/9.23 (X11; Linux i686; U; es-es) +Opera/9.23 (X11; Linux x86_64; U; en) +Opera/9.24 (Macintosh; PPC Mac OS X; U; en) +Opera/9.24 (Windows NT 5.0; U; ru) +Opera/9.24 (Windows NT 5.1; U; ru) +Opera/9.24 (Windows NT 5.1; U; tr) +Opera/9.24 (X11; Linux i686; U; de) +Opera/9.24 (X11; SunOS i86pc; U; en) +Opera/9.25 (Macintosh; Intel Mac OS X; U; en) +Opera/9.25 (Macintosh; PPC Mac OS X; U; en) +Opera/9.25 (OpenSolaris; U; en) +Opera/9.25 (Windows NT 4.0; U; en) +Opera/9.25 (Windows NT 5.0; U; cs) +Opera/9.25 (Windows NT 5.0; U; en) +Opera/9.25 (Windows NT 5.1; U; MEGAUPLOAD 1.0; pt-br) +Opera/9.25 (Windows NT 5.1; U; de) +Opera/9.25 (Windows NT 5.1; U; lt) +Opera/9.25 (Windows NT 5.1; U; ru) +Opera/9.25 (Windows NT 5.1; U; zh-cn) +Opera/9.25 (Windows NT 5.2; U; en) +Opera/9.25 (Windows NT 6.0; U; MEGAUPLOAD 1.0; ru) +Opera/9.25 (Windows NT 6.0; U; SV1; MEGAUPLOAD 2.0; ru) +Opera/9.25 (Windows NT 6.0; U; en-US) +Opera/9.25 (Windows NT 6.0; U; ru) +Opera/9.25 (Windows NT 6.0; U; sv) +Opera/9.25 (X11; Linux i686; U; en) +Opera/9.25 (X11; Linux i686; U; fr) +Opera/9.25 (X11; Linux i686; U; fr-ca) +Opera/9.26 (Macintosh; PPC Mac OS X; U; en) +Opera/9.26 (Windows NT 5.1; U; MEGAUPLOAD 2.0; en) +Opera/9.26 (Windows NT 5.1; U; de) +Opera/9.26 (Windows NT 5.1; U; nl) +Opera/9.26 (Windows NT 5.1; U; pl) +Opera/9.26 (Windows NT 5.1; U; zh-cn) +Opera/9.26 (Windows; U; pl) +Opera/9.27 (Macintosh; Intel Mac OS X; U; sv) +Opera/9.27 (Windows NT 5.1; U; ja) +Opera/9.27 (Windows NT 5.2; U; en) +Opera/9.27 (X11; Linux i686; U; en) +Opera/9.27 (X11; Linux i686; U; fr) +Opera/9.30 (Nintendo Wii; U; ; 2047-7; de) +Opera/9.30 (Nintendo Wii; U; ; 2047-7; fr) +Opera/9.30 (Nintendo Wii; U; ; 2047-7;en) +Opera/9.30 (Nintendo Wii; U; ; 2047-7;es) +Opera/9.30 (Nintendo Wii; U; ; 2047-7;pt-br) +Opera/9.30 (Nintendo Wii; U; ; 2071; Wii Shop Channel/1.0; en) +Opera/9.5 (Windows NT 5.1; U; fr) +Opera/9.5 (Windows NT 6.0; U; en) +Opera/9.50 (Macintosh; Intel Mac OS X; U; de) +Opera/9.50 (Macintosh; Intel Mac OS X; U; en) +Opera/9.50 (Windows NT 5.1; U; es-ES) +Opera/9.50 (Windows NT 5.1; U; it) +Opera/9.50 (Windows NT 5.1; U; nl) +Opera/9.50 (Windows NT 5.1; U; nn) +Opera/9.50 (Windows NT 5.1; U; ru) +Opera/9.50 (Windows NT 5.2; U; it) +Opera/9.50 (X11; Linux i686; U; es-ES) +Opera/9.50 (X11; Linux ppc; U; en) +Opera/9.50 (X11; Linux x86_64; U; nb) +Opera/9.50 (X11; Linux x86_64; U; pl) +Opera/9.51 (Macintosh; Intel Mac OS X; U; en) +Opera/9.51 (Windows NT 5.1; U; da) +Opera/9.51 (Windows NT 5.1; U; en) +Opera/9.51 (Windows NT 5.1; U; en-GB) +Opera/9.51 (Windows NT 5.1; U; es-AR) +Opera/9.51 (Windows NT 5.1; U; es-LA) +Opera/9.51 (Windows NT 5.1; U; fr) +Opera/9.51 (Windows NT 5.1; U; nn) +Opera/9.51 (Windows NT 5.2; U; en) +Opera/9.51 (Windows NT 6.0; U; en) +Opera/9.51 (Windows NT 6.0; U; es) +Opera/9.51 (Windows NT 6.0; U; sv) +Opera/9.51 (X11; Linux i686; U; Linux Mint; en) +Opera/9.51 (X11; Linux i686; U; de) +Opera/9.51 (X11; Linux i686; U; fr) +Opera/9.52 (Macintosh; Intel Mac OS X; U; pt) +Opera/9.52 (Macintosh; Intel Mac OS X; U; pt-BR) +Opera/9.52 (Macintosh; PPC Mac OS X; U; fr) +Opera/9.52 (Macintosh; PPC Mac OS X; U; ja) +Opera/9.52 (Windows NT 5.0; U; en) +Opera/9.52 (Windows NT 5.2; U; ru) +Opera/9.52 (Windows NT 6.0; U; Opera/9.52 (X11; Linux x86_64; U); en) +Opera/9.52 (Windows NT 6.0; U; de) +Opera/9.52 (Windows NT 6.0; U; en) +Opera/9.52 (Windows NT 6.0; U; fr) +Opera/9.52 (X11; Linux i686; U; cs) +Opera/9.52 (X11; Linux i686; U; en) +Opera/9.52 (X11; Linux i686; U; fr) +Opera/9.52 (X11; Linux ppc; U; de) +Opera/9.52 (X11; Linux x86_64; U) +Opera/9.52 (X11; Linux x86_64; U; en) +Opera/9.52 (X11; Linux x86_64; U; ru) +Opera/9.60 (Windows NT 5.0; U; en) Presto/2.1.1 +Opera/9.60 (Windows NT 5.1; U; en-GB) Presto/2.1.1 +Opera/9.60 (Windows NT 5.1; U; es-ES) Presto/2.1.1 +Opera/9.60 (Windows NT 5.1; U; sv) Presto/2.1.1 +Opera/9.60 (Windows NT 5.1; U; tr) Presto/2.1.1 +Opera/9.60 (Windows NT 6.0; U; bg) Presto/2.1.1 +Opera/9.60 (Windows NT 6.0; U; de) Presto/2.1.1 +Opera/9.60 (Windows NT 6.0; U; pl) Presto/2.1.1 +Opera/9.60 (Windows NT 6.0; U; ru) Presto/2.1.1 +Opera/9.60 (Windows NT 6.0; U; uk) Presto/2.1.1 +Opera/9.60 (X11; Linux i686; U; en-GB) Presto/2.1.1 +Opera/9.60 (X11; Linux i686; U; ru) Presto/2.1.1 +Opera/9.60 (X11; Linux x86_64; U) +Opera/9.61 (Macintosh; Intel Mac OS X; U; de) Presto/2.1.1 +Opera/9.61 (Windows NT 5.1; U; cs) Presto/2.1.1 +Opera/9.61 (Windows NT 5.1; U; de) Presto/2.1.1 +Opera/9.61 (Windows NT 5.1; U; en) Presto/2.1.1 +Opera/9.61 (Windows NT 5.1; U; en-GB) Presto/2.1.1 +Opera/9.61 (Windows NT 5.1; U; fr) Presto/2.1.1 +Opera/9.61 (Windows NT 5.1; U; ru) Presto/2.1.1 +Opera/9.61 (Windows NT 5.1; U; zh-cn) Presto/2.1.1 +Opera/9.61 (Windows NT 5.1; U; zh-tw) Presto/2.1.1 +Opera/9.61 (Windows NT 5.2; U; en) Presto/2.1.1 +Opera/9.61 (Windows NT 6.0; U; en) Presto/2.1.1 +Opera/9.61 (Windows NT 6.0; U; http://lucideer.com; en-GB) Presto/2.1.1 +Opera/9.61 (Windows NT 6.0; U; pt-BR) Presto/2.1.1 +Opera/9.61 (Windows NT 6.0; U; ru) Presto/2.1.1 +Opera/9.61 (X11; Linux i686; U; de) Presto/2.1.1 +Opera/9.61 (X11; Linux i686; U; en) Presto/2.1.1 +Opera/9.61 (X11; Linux i686; U; pl) Presto/2.1.1 +Opera/9.61 (X11; Linux i686; U; ru) Presto/2.1.1 +Opera/9.61 (X11; Linux x86_64; U; fr) Presto/2.1.1 +Opera/9.62 (Windows NT 5.1; U; pt-BR) Presto/2.1.1 +Opera/9.62 (Windows NT 5.1; U; ru) Presto/2.1.1 +Opera/9.62 (Windows NT 5.1; U; tr) Presto/2.1.1 +Opera/9.62 (Windows NT 5.1; U; zh-cn) Presto/2.1.1 +Opera/9.62 (Windows NT 5.1; U; zh-tw) Presto/2.1.1 +Opera/9.62 (Windows NT 5.2; U; en) Presto/2.1.1 +Opera/9.62 (Windows NT 6.0; U; de) Presto/2.1.1 +Opera/9.62 (Windows NT 6.0; U; en) Presto/2.1.1 +Opera/9.62 (Windows NT 6.0; U; en-GB) Presto/2.1.1 +Opera/9.62 (Windows NT 6.0; U; nb) Presto/2.1.1 +Opera/9.62 (Windows NT 6.0; U; pl) Presto/2.1.1 +Opera/9.62 (Windows NT 6.1; U; de) Presto/2.1.1 +Opera/9.62 (Windows NT 6.1; U; en) Presto/2.1.1 +Opera/9.62 (X11; Linux i686; U; Linux Mint; en) Presto/2.1.1 +Opera/9.62 (X11; Linux i686; U; en) Presto/2.1.1 +Opera/9.62 (X11; Linux i686; U; fi) Presto/2.1.1 +Opera/9.62 (X11; Linux i686; U; it) Presto/2.1.1 +Opera/9.62 (X11; Linux i686; U; pt-BR) Presto/2.1.1 +Opera/9.62 (X11; Linux x86_64; U; en_GB, en_US) Presto/2.1.1 +Opera/9.62 (X11; Linux x86_64; U; ru) Presto/2.1.1 +Opera/9.63 (Windows NT 5.1; U; pt-BR) Presto/2.1.1 +Opera/9.63 (Windows NT 5.2; U; de) Presto/2.1.1 +Opera/9.63 (Windows NT 5.2; U; en) Presto/2.1.1 +Opera/9.63 (Windows NT 6.0; U; cs) Presto/2.1.1 +Opera/9.63 (Windows NT 6.0; U; en) Presto/2.1.1 +Opera/9.63 (Windows NT 6.0; U; fr) Presto/2.1.1 +Opera/9.63 (Windows NT 6.0; U; nb) Presto/2.1.1 +Opera/9.63 (Windows NT 6.0; U; pl) Presto/2.1.1 +Opera/9.63 (Windows NT 6.1; U; de) Presto/2.1.1 +Opera/9.63 (Windows NT 6.1; U; en) Presto/2.1.1 +Opera/9.63 (Windows NT 6.1; U; hu) Presto/2.1.1 +Opera/9.63 (X11; FreeBSD 7.1-RELEASE i386; U; en) Presto/2.1.1 +Opera/9.63 (X11; Linux i686) +Opera/9.63 (X11; Linux i686; U; de) Presto/2.1.1 +Opera/9.63 (X11; Linux i686; U; en) +Opera/9.63 (X11; Linux i686; U; nb) Presto/2.1.1 +Opera/9.63 (X11; Linux i686; U; ru) +Opera/9.63 (X11; Linux i686; U; ru) Presto/2.1.1 +Opera/9.63 (X11; Linux x86_64; U; cs) Presto/2.1.1 +Opera/9.63 (X11; Linux x86_64; U; ru) Presto/2.1.1 +Opera/9.64 (Windows NT 6.0; U; pl) Presto/2.1.1 +Opera/9.64 (Windows NT 6.0; U; zh-cn) Presto/2.1.1 +Opera/9.64 (Windows NT 6.1; U; MRA 5.5 (build 02842); ru) Presto/2.1.1 +Opera/9.64 (Windows NT 6.1; U; de) Presto/2.1.1 +Opera/9.64 (X11; Linux i686; U; Linux Mint; it) Presto/2.1.1 +Opera/9.64 (X11; Linux i686; U; Linux Mint; nb) Presto/2.1.1 +Opera/9.64 (X11; Linux i686; U; da) Presto/2.1.1 +Opera/9.64 (X11; Linux i686; U; de) Presto/2.1.1 +Opera/9.64 (X11; Linux i686; U; en) Presto/2.1.1 +Opera/9.64 (X11; Linux i686; U; nb) Presto/2.1.1 +Opera/9.64 (X11; Linux i686; U; pl) Presto/2.1.1 +Opera/9.64 (X11; Linux i686; U; sv) Presto/2.1.1 +Opera/9.64 (X11; Linux i686; U; tr) Presto/2.1.1 +Opera/9.64 (X11; Linux x86_64; U; cs) Presto/2.1.1 +Opera/9.64 (X11; Linux x86_64; U; de) Presto/2.1.1 +Opera/9.64 (X11; Linux x86_64; U; en) Presto/2.1.1 +Opera/9.64 (X11; Linux x86_64; U; en-GB) Presto/2.1.1 +Opera/9.64 (X11; Linux x86_64; U; hr) Presto/2.1.1 +Opera/9.64 (X11; Linux x86_64; U; pl) Presto/2.1.1 +Opera/9.64(Windows NT 5.1; U; en) Presto/2.1.1 +Opera/9.70 (Linux i686 ; U; ; en) Presto/2.2.1 +Opera/9.70 (Linux i686 ; U; en) Presto/2.2.0 +Opera/9.70 (Linux i686 ; U; en) Presto/2.2.1 +Opera/9.70 (Linux i686 ; U; en-us) Presto/2.2.0 +Opera/9.70 (Linux i686 ; U; zh-cn) Presto/2.2.0 +Opera/9.70 (Linux ppc64 ; U; en) Presto/2.2.1 +Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/886; U; en) Presto/2.4.15 +Opera/9.80 (Linux i686; U; en) Presto/2.5.22 Version/10.51 +Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52 +Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52 +Opera/9.80 (Macintosh; Intel Mac OS X; U; nl) Presto/2.6.30 Version/10.61 +Opera/9.80 (S60; SymbOS; Opera Tablet/9174; U; en) Presto/2.7.81 Version/10.5 +Opera/9.80 (Windows 98; U; de) Presto/2.6.30 Version/10.61 +Opera/9.80 (Windows NT 5.1; U; MRA 5.5 (build 02842); ru) Presto/2.7.62 Version/11.00 +Opera/9.80 (Windows NT 5.1; U; MRA 5.6 (build 03278); ru) Presto/2.6.30 Version/10.63 +Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.2.15 Version/10.10 +Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.7.62 Version/11.01 +Opera/9.80 (Windows NT 5.1; U; de) Presto/2.2.15 Version/10.10 +Opera/9.80 (Windows NT 5.1; U; en) Presto/2.9.168 Version/11.51 +Opera/9.80 (Windows NT 5.1; U; it) Presto/2.7.62 Version/11.00 +Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.62 +Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.00 +Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.5.22 Version/10.50 +Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.7.39 Version/11.00 +Opera/9.80 (Windows NT 5.1; U; sk) Presto/2.5.22 Version/10.50 +Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.2.15 Version/10.00 +Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00 +Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10 +Opera/9.80 (Windows NT 5.1; U;) Presto/2.7.62 Version/11.01 +Opera/9.80 (Windows NT 5.2; U; en) Presto/2.2.15 Version/10.00 +Opera/9.80 (Windows NT 5.2; U; en) Presto/2.6.30 Version/10.63 +Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.5.22 Version/10.51 +Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.6.30 Version/10.61 +Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.7.62 Version/11.01 +Opera/9.80 (Windows NT 5.2; U; zh-cn) Presto/2.6.30 Version/10.63 +Opera/9.80 (Windows NT 6.0; U; Gecko/20100115; pl) Presto/2.2.15 Version/10.10 +Opera/9.80 (Windows NT 6.0; U; cs) Presto/2.5.22 Version/10.51 +Opera/9.80 (Windows NT 6.0; U; de) Presto/2.2.15 Version/10.00 +Opera/9.80 (Windows NT 6.0; U; en) Presto/2.2.15 Version/10.00 +Opera/9.80 (Windows NT 6.0; U; en) Presto/2.2.15 Version/10.10 +Opera/9.80 (Windows NT 6.0; U; en) Presto/2.7.39 Version/11.00 +Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10 +Opera/9.80 (Windows NT 6.0; U; it) Presto/2.6.30 Version/10.61 +Opera/9.80 (Windows NT 6.0; U; nl) Presto/2.6.30 Version/10.60 +Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62 +Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.7.62 Version/11.01 +Opera/9.80 (Windows NT 6.0; U; zh-cn) Presto/2.5.22 Version/10.50 +Opera/9.80 (Windows NT 6.1 x64; U; en) Presto/2.7.62 Version/11.00 +Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1 +Opera/9.80 (Windows NT 6.1; U; cs) Presto/2.2.15 Version/10.00 +Opera/9.80 (Windows NT 6.1; U; cs) Presto/2.7.62 Version/11.01 +Opera/9.80 (Windows NT 6.1; U; de) Presto/2.2.15 Version/10.00 +Opera/9.80 (Windows NT 6.1; U; de) Presto/2.2.15 Version/10.10 +Opera/9.80 (Windows NT 6.1; U; en) Presto/2.2.15 Version/10.00 +Opera/9.80 (Windows NT 6.1; U; en) Presto/2.5.22 Version/10.51 +Opera/9.80 (Windows NT 6.1; U; en) Presto/2.6.30 Version/10.61 +Opera/9.80 (Windows NT 6.1; U; en-GB) Presto/2.7.62 Version/11.00 +Opera/9.80 (Windows NT 6.1; U; en-US) Presto/2.7.62 Version/11.01 +Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00 +Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.2.15 Version/10.00 +Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.7.62 Version/11.00 +Opera/9.80 (Windows NT 6.1; U; fr) Presto/2.5.24 Version/10.52 +Opera/9.80 (Windows NT 6.1; U; ja) Presto/2.5.22 Version/10.50 +Opera/9.80 (Windows NT 6.1; U; ko) Presto/2.7.62 Version/11.00 +Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.6.31 Version/10.70 +Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.7.62 Version/11.00 +Opera/9.80 (Windows NT 6.1; U; sk) Presto/2.6.22 Version/10.50 +Opera/9.80 (Windows NT 6.1; U; sv) Presto/2.7.62 Version/11.01 +Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.2.15 Version/10.00 +Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.5.22 Version/10.50 +Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.6.30 Version/10.61 +Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.6.37 Version/11.00 +Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.7.62 Version/11.01 +Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.5.22 Version/10.50 +Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01 +Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62 +Opera/9.80 (X11; Linux i686; U; Debian; pl) Presto/2.2.15 Version/10.00 +Opera/9.80 (X11; Linux i686; U; de) Presto/2.2.15 Version/10.00 +Opera/9.80 (X11; Linux i686; U; en) Presto/2.2.15 Version/10.00 +Opera/9.80 (X11; Linux i686; U; en) Presto/2.5.27 Version/10.60 +Opera/9.80 (X11; Linux i686; U; en-GB) Presto/2.2.15 Version/10.00 +Opera/9.80 (X11; Linux i686; U; en-GB) Presto/2.5.24 Version/10.53 +Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.6.30 Version/10.61 +Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11 +Opera/9.80 (X11; Linux i686; U; fr) Presto/2.7.62 Version/11.01 +Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50 +Opera/9.80 (X11; Linux i686; U; it) Presto/2.5.24 Version/10.54 +Opera/9.80 (X11; Linux i686; U; it) Presto/2.7.62 Version/11.00 +Opera/9.80 (X11; Linux i686; U; ja) Presto/2.7.62 Version/11.01 +Opera/9.80 (X11; Linux i686; U; nb) Presto/2.2.15 Version/10.00 +Opera/9.80 (X11; Linux i686; U; pl) Presto/2.2.15 Version/10.00 +Opera/9.80 (X11; Linux i686; U; pl) Presto/2.6.30 Version/10.61 +Opera/9.80 (X11; Linux i686; U; pt-BR) Presto/2.2.15 Version/10.00 +Opera/9.80 (X11; Linux i686; U; ru) Presto/2.2.15 Version/10.00 +Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11 +Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01 +Opera/9.80 (X11; Linux x86_64; U; bg) Presto/2.8.131 Version/11.10 +Opera/9.80 (X11; Linux x86_64; U; de) Presto/2.2.15 Version/10.00 +Opera/9.80 (X11; Linux x86_64; U; en) Presto/2.2.15 Version/10.00 +Opera/9.80 (X11; Linux x86_64; U; en-GB) Presto/2.2.15 Version/10.01 +Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50 +Opera/9.80 (X11; Linux x86_64; U; it) Presto/2.2.15 Version/10.10 +Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00 +Opera/9.80 (X11; U; Linux i686; en-US; rv:1.9.2.3) Presto/2.2.15 Version/10.10 +Opera/9.99 (Windows NT 5.1; U; pl) Presto/9.9.9 \ No newline at end of file diff --git a/src/assets_linux_tor.qrc b/src/assets_linux_tor.qrc new file mode 100644 index 0000000..4539da6 --- /dev/null +++ b/src/assets_linux_tor.qrc @@ -0,0 +1,5 @@ + + + tor/tor + + diff --git a/src/assets_macos_tor.qrc b/src/assets_macos_tor.qrc new file mode 100644 index 0000000..4539da6 --- /dev/null +++ b/src/assets_macos_tor.qrc @@ -0,0 +1,5 @@ + + + tor/tor + + diff --git a/src/assets_windows_tor.qrc b/src/assets_windows_tor.qrc new file mode 100644 index 0000000..70e0369 --- /dev/null +++ b/src/assets_windows_tor.qrc @@ -0,0 +1,5 @@ + + + tor/tor.exe + + diff --git a/src/calcwidget.cpp b/src/calcwidget.cpp new file mode 100644 index 0000000..cde1d8c --- /dev/null +++ b/src/calcwidget.cpp @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include + +#include "calcwidget.h" +#include "ui_calcwidget.h" +#include "utils/config.h" +#include "mainwindow.h" + +CalcWidget::CalcWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::CalcWidget) +{ + ui->setupUi(this); + + ui->imageExchange->setBackgroundRole(QPalette::Base); + QPixmap pm(":/assets/images/exchange.png"); + ui->imageExchange->setPixmap(pm); + ui->imageExchange->setScaledContents(true); + ui->imageExchange->setFixedSize(26, 26); + + // validator/locale for input + QLocale lo(QLocale::C); + lo.setNumberOptions(QLocale::RejectGroupSeparator); + auto dv = new QDoubleValidator(0.0, 2147483647, 10, this); // [0, 32bit max], 10 decimals of precision + dv->setNotation(QDoubleValidator::StandardNotation); + dv->setLocale(lo); + ui->lineFrom->setValidator(dv); + ui->lineTo->setValidator(dv); + + connect(AppContext::prices, &Prices::fiatPricesUpdated, this, &CalcWidget::initFiat); + connect(AppContext::prices, &Prices::cryptoPricesUpdated, this, &CalcWidget::initCrypto); +} + +void CalcWidget::fromChanged(const QString &data) { + if(!this->m_comboBoxInit) return; + if(this->m_changing){ + this->m_changing = false; + return; + } + + QString symbolFrom = ui->comboCalcFrom->itemText(ui->comboCalcFrom->currentIndex()); + QString symbolTo = ui->comboCalcTo->itemText(ui->comboCalcTo->currentIndex()); + + if(symbolFrom == symbolTo){ + ui->lineTo->setText(data); + return; + } + + QString amount_str = ui->lineFrom->text(); + if(amount_str.startsWith('.')){ + ui->lineFrom->setText(ui->lineTo->text()); + return; + } + + double amount = amount_str.toDouble(); + double result = AppContext::prices->convert(symbolFrom, symbolTo, amount); + + this->m_changing = true; + + int precision = 10; + if(AppContext::prices->rates.contains(symbolTo)) + precision = 2; + + ui->lineTo->setText(QString::number(result, 'f', precision)); +} + +void CalcWidget::toChanged(const QString &data) { + if(!this->m_comboBoxInit) return; + if(this->m_changing){ + this->m_changing = false; + return; + } + + QString symbolFrom = ui->comboCalcFrom->itemText( + ui->comboCalcFrom->currentIndex()); + QString symbolTo = ui->comboCalcTo->itemText( + ui->comboCalcTo->currentIndex()); + + if(symbolFrom == symbolTo){ + ui->lineTo->setText(ui->lineFrom->text()); + return; + } + + QString amount_str = ui->lineTo->text(); + if(amount_str.startsWith('.')){ + ui->lineTo->setText(""); + return; + } + + double amount = amount_str.toDouble(); + double result = AppContext::prices->convert(symbolTo, symbolFrom, amount); + + this->m_changing = true; + + int precision = 10; + if(AppContext::prices->rates.contains(symbolFrom)) + precision = 2; + + ui->lineFrom->setText(QString::number(result, 'f', precision)); +} + +void CalcWidget::toComboChanged(const QString &data) { + this->fromChanged(data); +} + +void CalcWidget::initCrypto() { + if (this->m_ctx == nullptr) + this->m_ctx = MainWindow::getContext(); + + this->initComboBox(); +} + +void CalcWidget::initFiat() { + if(this->m_ctx == nullptr) + this->m_ctx = MainWindow::getContext(); + + this->initComboBox(); +} + +void CalcWidget::initComboBox() { + if(m_comboBoxInit || this->m_ctx == nullptr) return; + QList marketsKeys = AppContext::prices->markets.keys(); + QList ratesKeys = AppContext::prices->rates.keys(); + if(marketsKeys.count() <= 0 || ratesKeys.count() <= 0) return; + + ui->comboCalcFrom->addItems(marketsKeys); + ui->comboCalcFrom->insertSeparator(marketsKeys.count()); + ui->comboCalcFrom->addItems(ratesKeys); + ui->comboCalcFrom->setCurrentIndex(marketsKeys.indexOf("XMR")); + + ui->comboCalcTo->addItems(marketsKeys); + ui->comboCalcTo->insertSeparator(marketsKeys.count()); + ui->comboCalcTo->addItems(ratesKeys); + + auto preferredFiat = config()->get(Config::preferredFiatCurrency).toString(); + ui->comboCalcTo->setCurrentText(preferredFiat); + + this->m_comboBoxInit = true; +} + +CalcWidget::~CalcWidget() { + delete ui; +} diff --git a/src/calcwidget.h b/src/calcwidget.h new file mode 100644 index 0000000..8bd6c50 --- /dev/null +++ b/src/calcwidget.h @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef CALC_H +#define CALC_H + +#include +#include "appcontext.h" + +namespace Ui { + class CalcWidget; +} + +class CalcWidget : public QWidget +{ +Q_OBJECT + +public: + explicit CalcWidget(QWidget *parent = nullptr); + ~CalcWidget(); + +signals: + void closed(); + +public slots: + void fromChanged(const QString& data); + void toChanged(const QString& data); + void toComboChanged(const QString& data); + void initFiat(); + void initCrypto(); + +private: + Ui::CalcWidget *ui; + AppContext *m_ctx = nullptr; + bool m_comboBoxInit = false; + void initComboBox(); + bool m_changing = false; +}; + +#endif // CALC_H diff --git a/src/calcwidget.ui b/src/calcwidget.ui new file mode 100644 index 0000000..674516b --- /dev/null +++ b/src/calcwidget.ui @@ -0,0 +1,234 @@ + + + CalcWidget + + + + 0 + 0 + 737 + 153 + + + + MainWindow + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + 9 + + + + + Crypto/fiat and fiat/fiat calculator. + + + + + + + Qt::Horizontal + + + + + + + + + 18 + + + + + 0 + + + 0 + + + + + + 0 + 0 + + + + true + + + From... + + + + + + + + + + + + exchange image + + + + + + + 0 + + + + + + 0 + 0 + + + + false + + + To... + + + + + + + + + + + + + + + + Exchange rates are updated every 2 minutes. + + + + + + + Qt::Vertical + + + + 20 + 170 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + lineFrom + textChanged(QString) + CalcWidget + fromChanged(QString) + + + 119 + 77 + + + 427 + -1 + + + + + lineTo + textChanged(QString) + CalcWidget + toChanged(QString) + + + 463 + 86 + + + 640 + -4 + + + + + comboCalcFrom + currentIndexChanged(QString) + CalcWidget + fromChanged(QString) + + + 196 + 77 + + + 330 + -9 + + + + + comboCalcTo + currentIndexChanged(QString) + CalcWidget + toComboChanged(QString) + + + 574 + 82 + + + 265 + -5 + + + + + + fromChanged(QString) + toChanged(QString) + toComboChanged(QString) + + diff --git a/src/calcwindow.cpp b/src/calcwindow.cpp new file mode 100644 index 0000000..f422c03 --- /dev/null +++ b/src/calcwindow.cpp @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "calcwindow.h" +#include "mainwindow.h" + +#include "ui_calcwindow.h" + +CalcWindow::CalcWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::CalcWindow) +{ + Qt::WindowFlags flags = this->windowFlags(); + this->setWindowFlags(flags|Qt::WindowStaysOnTopHint); // on top + + ui->setupUi(this); + this->setWindowIcon(QIcon("://assets/images/coldcard.png")); + + connect(AppContext::prices, &Prices::fiatPricesUpdated, this, &CalcWindow::initFiat); + connect(AppContext::prices, &Prices::cryptoPricesUpdated, this, &CalcWindow::initCrypto); +} + +void CalcWindow::initFiat() { + this->ui->calcWidget->initFiat(); +} + +void CalcWindow::initCrypto() { + this->ui->calcWidget->initCrypto(); +} + +void CalcWindow::closeEvent(QCloseEvent *foo) { + emit closed(); +} + +CalcWindow::~CalcWindow() { + delete ui; +} diff --git a/src/calcwindow.h b/src/calcwindow.h new file mode 100644 index 0000000..2b5b9ac --- /dev/null +++ b/src/calcwindow.h @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef CalcWindow_H +#define CalcWindow_H + +#include + +namespace Ui { + class CalcWindow; +} + +class CalcWindow : public QMainWindow +{ +Q_OBJECT + +public: + explicit CalcWindow(QWidget *parent = nullptr); + ~CalcWindow() override; + +signals: + void closed(); + +public slots: + void initFiat(); + void initCrypto(); + +private: + void closeEvent(QCloseEvent *bar) override; + +private: + Ui::CalcWindow *ui; +}; + +#endif // CalcWindow_H diff --git a/src/calcwindow.ui b/src/calcwindow.ui new file mode 100644 index 0000000..1d490cf --- /dev/null +++ b/src/calcwindow.ui @@ -0,0 +1,49 @@ + + + CalcWindow + + + + 0 + 0 + 520 + 108 + + + + Calculator + + + + + 9 + + + 9 + + + 9 + + + 9 + + + + + + + + + + CalcWidget + QWidget +
        calcwidget.h
        + 1 +
        +
        + + + + stayOnTop(int) + +
        diff --git a/src/cli.cpp b/src/cli.cpp new file mode 100644 index 0000000..db2d4ba --- /dev/null +++ b/src/cli.cpp @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "cli.h" + +// libwalletqt +#include "Wallet.h" +#include "libwalletqt/TransactionHistory.h" +#include "libwalletqt/SubaddressAccount.h" +#include "libwalletqt/Subaddress.h" +#include "libwalletqt/AddressBook.h" +#include "libwalletqt/Coins.h" +#include "model/AddressBookModel.h" +#include "model/TransactionHistoryModel.h" +#include "model/SubaddressAccountModel.h" +#include "model/SubaddressModel.h" +#include "model/CoinsModel.h" + +CLI::CLI(AppContext *ctx, QObject *parent) : + QObject(parent), + ctx(ctx) { + connect(this->ctx, &AppContext::walletOpened, this, &CLI::onWalletOpened); + connect(this->ctx, &AppContext::walletOpenedError, this, &CLI::onWalletOpenedError); + connect(this->ctx, &AppContext::walletOpenPasswordNeeded, this, &CLI::onWalletOpenPasswordRequired); +} + +void CLI::run() { + if(mode == CLIMode::CLIModeExportContacts || + mode == CLIMode::CLIModeExportTxHistory) { + if(!ctx->cmdargs->isSet("wallet-file")) return this->finishedError("--wallet-file argument missing"); + if(!ctx->cmdargs->isSet("password")) return this->finishedError("--password argument missing"); + ctx->onOpenWallet(ctx->cmdargs->value("wallet-file"), ctx->cmdargs->value("password")); + } +} + +void CLI::onWalletOpened() { + if(mode == CLIMode::CLIModeExportContacts){ + auto *model = ctx->currentWallet->addressBookModel(); + auto fn = ctx->cmdargs->value("export-contacts"); + if(model->writeCSV(fn)) + this->finished(QString("Address book exported to %1").arg(fn)); + else + this->finishedError("Address book export failure"); + } else if(mode == CLIModeExportTxHistory) { + ctx->currentWallet->history()->refresh(ctx->currentWallet->currentSubaddressAccount()); + auto *model = ctx->currentWallet->history(); + auto fn = ctx->cmdargs->value("export-txhistory"); + if(model->writeCSV(fn)) + this->finished(QString("Transaction history exported to %1").arg(fn)); + else + this->finishedError("Transaction history export failure"); + } +} + +void CLI::onWalletOpenedError(const QString &err) { + if(mode == CLIMode::CLIModeExportContacts || + mode == CLIMode::CLIModeExportTxHistory) + return this->finishedError(err); +} + +void CLI::onWalletOpenPasswordRequired(bool invalidPassword) { + if(mode == CLIMode::CLIModeExportContacts || + mode == CLIMode::CLIModeExportTxHistory) + return this->finishedError("invalid password"); +} + +void CLI::finished(const QString &msg){ + qInfo() << msg; + emit closeApplication(); +} + +void CLI::finishedError(const QString &err) { + qCritical() << err; + emit closeApplication(); +} + +CLI::~CLI() { + ctx->disconnect(); + delete ctx; +} diff --git a/src/cli.h b/src/cli.h new file mode 100644 index 0000000..5398c31 --- /dev/null +++ b/src/cli.h @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_CLI_H +#define FEATHER_CLI_H + +#include +#include "appcontext.h" + +enum CLIMode { + CLIModeExportContacts, + CLIModeExportTxHistory +}; + +class CLI : public QObject +{ + Q_OBJECT +public: + CLIMode mode; + explicit CLI(AppContext *ctx, QObject *parent = nullptr); + ~CLI() override; + +public slots: + void run(); + + //libwalletqt + void onWalletOpened(); + void onWalletOpenedError(const QString& err); + void onWalletOpenPasswordRequired(bool invalidPassword); + +private: + AppContext *ctx; + +private slots: + void finished(const QString &msg); + void finishedError(const QString &err); + +signals: + void closeApplication(); +}; + +#endif //FEATHER_CLI_H diff --git a/src/coinswidget.cpp b/src/coinswidget.cpp new file mode 100644 index 0000000..60dfe72 --- /dev/null +++ b/src/coinswidget.cpp @@ -0,0 +1,231 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "coinswidget.h" +#include "ui_coinswidget.h" +#include "model/ModelUtils.h" +#include "utils/utils.h" +#include "dialog/outputinfodialog.h" +#include "dialog/outputsweepdialog.h" + +#include +#include +#include +#include +#include + +CoinsWidget::CoinsWidget(QWidget *parent) + : QWidget(parent) + , ui(new Ui::CoinsWidget) + , m_headerMenu(new QMenu(this)) + , m_copyMenu(new QMenu("Copy",this)) +{ + ui->setupUi(this); + + // header context menu + ui->coins->header()->setContextMenuPolicy(Qt::CustomContextMenu); + m_showSpentAction = m_headerMenu->addAction("Show spent outputs", this, &CoinsWidget::setShowSpent); + m_showSpentAction->setCheckable(true); + connect(ui->coins->header(), &QHeaderView::customContextMenuRequested, this, &CoinsWidget::showHeaderMenu); + + // copy menu + m_copyMenu->setIcon(QIcon(":/assets/images/copy.png")); + m_copyMenu->addAction("Public key", this, [this]{copy(copyField::PubKey);}); + m_copyMenu->addAction("Key Image", this, [this]{copy(copyField::KeyImage);}); + m_copyMenu->addAction("Transaction ID", this, [this]{copy(copyField::TxID);}); + m_copyMenu->addAction("Address", this, [this]{copy(copyField::Address);}); + m_copyMenu->addAction("Height", this, [this]{copy(copyField::Height);}); + m_copyMenu->addAction("Amount", this, [this]{copy(copyField::Amount);}); + + // context menu + ui->coins->setContextMenuPolicy(Qt::CustomContextMenu); + + m_thawOutputAction = new QAction("Thaw output"); + m_freezeOutputAction = new QAction("Freeze output"); + + m_freezeAllSelectedAction = new QAction("Freeze selected"); + m_thawAllSelectedAction = new QAction("Thaw selected"); + + m_viewOutputAction = new QAction(QIcon(":/assets/images/info.png"), "Details"); + m_sweepOutputAction = new QAction("Sweep output"); + connect(m_freezeOutputAction, &QAction::triggered, this, &CoinsWidget::freezeOutput); + connect(m_thawOutputAction, &QAction::triggered, this, &CoinsWidget::thawOutput); + connect(m_viewOutputAction, &QAction::triggered, this, &CoinsWidget::viewOutput); + connect(m_sweepOutputAction, &QAction::triggered, this, &CoinsWidget::onSweepOutput); + + connect(m_freezeAllSelectedAction, &QAction::triggered, this, &CoinsWidget::freezeAllSelected); + connect(m_thawAllSelectedAction, &QAction::triggered, this, &CoinsWidget::thawAllSelected); + + connect(ui->coins, &QTreeView::customContextMenuRequested, this, &CoinsWidget::showContextMenu); +} + +void CoinsWidget::setModel(CoinsModel * model, Coins * coins) { + m_coins = coins; + m_model = model; + m_proxyModel = new CoinsProxyModel; + m_proxyModel->setSourceModel(m_model); + ui->coins->setModel(m_proxyModel); + ui->coins->setColumnHidden(CoinsModel::Spent, true); + ui->coins->setColumnHidden(CoinsModel::SpentHeight, true); + ui->coins->setColumnHidden(CoinsModel::Frozen, true); + + ui->coins->header()->setSectionResizeMode(QHeaderView::ResizeToContents); + ui->coins->header()->setSectionResizeMode(CoinsModel::AddressLabel, QHeaderView::Stretch); + ui->coins->header()->setSortIndicator(CoinsModel::BlockHeight, Qt::DescendingOrder); + ui->coins->setSortingEnabled(true); +} + +void CoinsWidget::showContextMenu(const QPoint &point) { + QModelIndexList list = ui->coins->selectionModel()->selectedRows(); + + auto *menu = new QMenu(ui->coins); + if (list.size() > 1) { + menu->addAction(m_freezeAllSelectedAction); + menu->addAction(m_thawAllSelectedAction); + } + else { + QModelIndex index = ui->coins->indexAt(point); + if (!index.isValid()) { + return; + } + + int row = m_proxyModel->mapToSource(index).row(); + + bool isSpent, isFrozen, isUnlocked; + m_coins->coin(row, [&isSpent, &isFrozen, &isUnlocked](CoinsInfo &c) { + isSpent = c.spent(); + isFrozen = c.frozen(); + isUnlocked = c.unlocked(); + }); + + menu->addMenu(m_copyMenu); + + if (!isSpent) { + isFrozen ? menu->addAction(m_thawOutputAction) : menu->addAction(m_freezeOutputAction); + } + if (!isFrozen && isUnlocked) { + menu->addAction(m_sweepOutputAction); + } + menu->addAction(m_viewOutputAction); + } + + menu->popup(ui->coins->viewport()->mapToGlobal(point)); +} + +void CoinsWidget::showHeaderMenu(const QPoint& position) +{ + m_headerMenu->popup(QCursor::pos()); +} + +void CoinsWidget::setShowSpent(bool show) +{ + if(!m_proxyModel) return; + m_proxyModel->setShowSpent(show); +} + +void CoinsWidget::freezeOutput() { + QModelIndex index = ui->coins->currentIndex(); + emit freeze(m_proxyModel->mapToSource(index).row()); +} + +void CoinsWidget::freezeAllSelected() { + QModelIndexList list = ui->coins->selectionModel()->selectedRows(); + + QVector indexes; + for (QModelIndex index: list) { + indexes.push_back(m_proxyModel->mapToSource(index).row()); // todo: will segfault if index get invalidated + } + emit freezeMulti(indexes); +} + +void CoinsWidget::thawOutput() { + QModelIndex index = ui->coins->currentIndex(); + emit thaw(m_proxyModel->mapToSource(index).row()); +} + +void CoinsWidget::thawAllSelected() { + QModelIndexList list = ui->coins->selectionModel()->selectedRows(); + + QVector indexes; + for (QModelIndex index: list) { + indexes.push_back(m_proxyModel->mapToSource(index).row()); + } + emit thawMulti(indexes); +} + +void CoinsWidget::viewOutput() { + QModelIndex index = ui->coins->currentIndex(); + + int row = m_proxyModel->mapToSource(index).row(); + QPointer c; + m_coins->coin(row, [&c](CoinsInfo &cInfo) { + c = &cInfo; + }); + + if (c) { + auto * dialog = new OutputInfoDialog(c, this); + dialog->show(); + } +} + +void CoinsWidget::onSweepOutput() { + QModelIndex index = ui->coins->currentIndex(); + int row = m_proxyModel->mapToSource(index).row(); + + QString keyImage; + bool keyImageKnown; + m_coins->coin(row, [&keyImage, &keyImageKnown](CoinsInfo &c) { + keyImageKnown = c.keyImageKnown(); + keyImage = c.keyImage(); + }); + + qCritical() << "key image: " << keyImage; + + if (!keyImageKnown) { + Utils::showMessageBox("Unable to sweep output", "Unable to sweep output: key image unknown", true); + return; + } + + auto * dialog = new OutputSweepDialog(this); + int ret = dialog->exec(); + if (!ret) return; + + qCritical() << "key image: " << keyImage; + + emit sweepOutput(keyImage, dialog->address(), dialog->churn(), dialog->outputs()); +} + +void CoinsWidget::copy(copyField field) { + QModelIndex index = ui->coins->currentIndex(); + int row = m_proxyModel->mapToSource(index).row(); + + QString data; + m_coins->coin(row, [field, &data](CoinsInfo &c) { + switch (field) { + case PubKey: + data = c.pubKey(); + break; + case KeyImage: + data = c.keyImage(); + break; + case TxID: + data = c.hash(); + break; + case Address: + data = c.address(); + break; + case Height: + data = QString::number(c.blockHeight()); + break; + case Amount: + data = c.displayAmount(); + break; + } + }); + + Utils::copyToClipboard(data); +} + +CoinsWidget::~CoinsWidget() { + delete ui; +} diff --git a/src/coinswidget.h b/src/coinswidget.h new file mode 100644 index 0000000..0ff1d8e --- /dev/null +++ b/src/coinswidget.h @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_COINSWIDGET_H +#define FEATHER_COINSWIDGET_H + +#include "appcontext.h" +#include "model/CoinsModel.h" +#include "model/CoinsProxyModel.h" +#include "libwalletqt/Coins.h" + +#include +#include + +namespace Ui { + class CoinsWidget; +} + +class CoinsWidget : public QWidget +{ +Q_OBJECT + +public: + explicit CoinsWidget(QWidget *parent = nullptr); + void setModel(CoinsModel * model, Coins * coins); + ~CoinsWidget() override; + +private slots: + void showHeaderMenu(const QPoint& position); + void setShowSpent(bool show); + void freezeOutput(); + void freezeAllSelected(); + void thawOutput(); + void thawAllSelected(); + void viewOutput(); + void onSweepOutput(); + +signals: + void freeze(int index); + void freezeMulti(QVector); + void thaw(int index); + void thawMulti(QVector); + void sweepOutput(const QString &keyImage, const QString &address, bool isChurn, int outputs); + +private: + enum copyField { + PubKey = 0, + KeyImage, + TxID, + Address, + Height, + Amount + }; + + Ui::CoinsWidget *ui; + + QMenu *m_contextMenu; + QMenu *m_copyMenu; + QAction *m_showSpentAction; + QMenu *m_headerMenu; + QAction *m_freezeOutputAction; + QAction *m_freezeAllSelectedAction; + QAction *m_thawOutputAction; + QAction *m_thawAllSelectedAction; + QAction *m_viewOutputAction; + QAction *m_sweepOutputAction; + Coins *m_coins; + CoinsModel * m_model; + CoinsProxyModel * m_proxyModel; + + void showContextMenu(const QPoint & point); + void copy(copyField field); +}; + + +#endif //FEATHER_COINSWIDGET_H diff --git a/src/coinswidget.ui b/src/coinswidget.ui new file mode 100644 index 0000000..cddca31 --- /dev/null +++ b/src/coinswidget.ui @@ -0,0 +1,49 @@ + + + CoinsWidget + + + + 0 + 0 + 782 + 444 + + + + Form + + + + 7 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QAbstractItemView::ExtendedSelection + + + false + + + false + + + + + + + + diff --git a/src/components.cpp b/src/components.cpp new file mode 100644 index 0000000..0fc5e39 --- /dev/null +++ b/src/components.cpp @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "components.h" + +#include + +StatusBarButton::StatusBarButton(const QIcon &icon, const QString &tooltip, QWidget *parent) : QPushButton(parent) { + setIcon(icon); + setToolTip(tooltip); + setFlat(true); + setMaximumWidth(20); + setIconSize(QSize(20,20)); + setCursor(QCursor(Qt::PointingHandCursor)); +} + +WWLabel::WWLabel(const QString& text, QWidget *parent) : QLabel(text, parent){ + setWordWrap(true); + setTextInteractionFlags(Qt::TextSelectableByMouse); +} + +PasswordLineEdit::PasswordLineEdit(QWidget *parent) : QLineEdit(parent) { + setEchoMode(Password); +} + +Buttons::Buttons(QPushButton* arr[], int size, QWidget *parent) : QHBoxLayout(parent) { + addStretch(); + for (int n=0; n < size; n++) { + addWidget(arr[n]); + } +} + +OkButton::OkButton(QDialog *dialog, const QString& label = nullptr, QWidget *parent) : QPushButton(parent){ + setText(label == nullptr ? label : "OK"); + connect(this, &OkButton::clicked, dialog, &QDialog::accept); + setDefault(true); +} + +CloseButton::CloseButton(QDialog *dialog, QWidget *parent) : QPushButton(parent) { + setText("Close"); + connect(this, &CloseButton::clicked, dialog, &QDialog::close); + setDefault(true); +} + +ButtonsTextEdit::ButtonsTextEdit(const QString &text) : QPlainTextEdit(text) { + +} + +void ButtonsTextEdit::setText(const QString &text) { + this->setPlainText(text); +} + +QString ButtonsTextEdit::text(){ + return this->toPlainText(); +} + +void HelpLabel::setHelpText(const QString &text) +{ + this->help_text = text; +} + +HelpLabel::HelpLabel(QWidget *parent) : QLabel(parent) +{ + this->help_text = "help_text"; + this->font = QFont(); +} + +void HelpLabel::mouseReleaseEvent(QMouseEvent *event) +{ + Q_UNUSED(event) + QMessageBox msgBox(QApplication::activeWindow()); + msgBox.setText(this->help_text); + msgBox.exec(); +} + +void HelpLabel::enterEvent(QEvent *event) +{ + font.setUnderline(true); + setFont(font); + QApplication::setOverrideCursor(QCursor(Qt::PointingHandCursor)); + return QLabel::enterEvent(event); +} + +void HelpLabel::leaveEvent(QEvent *event) +{ + font.setUnderline(false); + setFont(font); + QApplication::setOverrideCursor(QCursor(Qt::ArrowCursor)); + return QLabel::leaveEvent(event); +} + +ClickableLabel::ClickableLabel(QWidget* parent, Qt::WindowFlags f) + : QLabel(parent) { +} + +ClickableLabel::~ClickableLabel() = default; + +void ClickableLabel::mousePressEvent(QMouseEvent* event) { + emit clicked(); +} \ No newline at end of file diff --git a/src/components.h b/src/components.h new file mode 100644 index 0000000..5a9772f --- /dev/null +++ b/src/components.h @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef COMP_H +#define COMP_H + +#include +#include +#include +#include +#include +#include + +class StatusBarButton : public QPushButton +{ + Q_OBJECT + +public: + explicit StatusBarButton(const QIcon &icon, const QString &tooltip, QWidget *parent = nullptr); +}; + +class WWLabel : public QLabel +{ + Q_OBJECT + +public: + explicit WWLabel(const QString& label="", QWidget *parent = nullptr); +}; + +class PasswordLineEdit : public QLineEdit +{ + Q_OBJECT + +public: + explicit PasswordLineEdit(QWidget *parent = nullptr); +}; + +class Buttons : public QHBoxLayout +{ + Q_OBJECT + +public: + explicit Buttons(QPushButton* arr[], int size, QWidget *parent = nullptr); +}; + + +class CloseButton : public QPushButton +{ +Q_OBJECT + +public: + explicit CloseButton(QDialog *dialog, QWidget *parent = nullptr); +}; + +class OkButton : public QPushButton +{ +Q_OBJECT + +public: + explicit OkButton(QDialog *dialog, const QString& label, QWidget *parent = nullptr); +}; + + +class ButtonsTextEdit : public QPlainTextEdit +{ + Q_OBJECT + +public: + void setText(const QString &text); + QString text(); + + explicit ButtonsTextEdit(const QString &text = ""); +}; + +class HelpLabel : public QLabel +{ + Q_OBJECT + +public: + QString help_text; + QFont font; + void setHelpText(const QString &text); + + explicit HelpLabel(QWidget * parent); + +protected: + void mouseReleaseEvent(QMouseEvent *event) override; + void enterEvent(QEvent *event) override; + void leaveEvent(QEvent *event) override; +}; + +class ClickableLabel : public QLabel { +Q_OBJECT + +public: + explicit ClickableLabel(QWidget* parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()); + ~ClickableLabel() override; + +signals: + void clicked(); + +protected: + void mousePressEvent(QMouseEvent* event) override; + +}; +#endif diff --git a/src/contactswidget.cpp b/src/contactswidget.cpp new file mode 100644 index 0000000..8093fc6 --- /dev/null +++ b/src/contactswidget.cpp @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "contactswidget.h" +#include "ui_contactswidget.h" +#include "dialog/contactsdialog.h" +#include "model/ModelUtils.h" +#include "utils/utils.h" + +#include +#include +#include + +ContactsWidget::ContactsWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::ContactsWidget) +{ + ui->setupUi(this); + + // header context menu + ui->contacts->header()->setContextMenuPolicy(Qt::CustomContextMenu); + m_headerMenu = new QMenu(this); + m_showFullAddressesAction = m_headerMenu->addAction("Show full addresses", this, &ContactsWidget::setShowFullAddresses); + m_showFullAddressesAction->setCheckable(true); + + connect(ui->contacts->header(), &QHeaderView::customContextMenuRequested, this, &ContactsWidget::showHeaderMenu); + + // context menu + ui->contacts->setContextMenuPolicy(Qt::CustomContextMenu); + m_contextMenu = new QMenu(ui->contacts); + m_contextMenu->addAction(QIcon(":/assets/images/person.svg"), "New contact", this, &ContactsWidget::newContact); + + + // row context menu + m_rowMenu = new QMenu(ui->contacts); + m_rowMenu->addAction(QIcon(":/assets/images/copy.png"), "Copy address", this, &ContactsWidget::copyAddress); + m_rowMenu->addAction(QIcon(":/assets/images/copy.png"), "Copy name", this, &ContactsWidget::copyName); + m_rowMenu->addAction(QIcon(":/assets/images/appicons/128x128.png"), "Pay to", this, &ContactsWidget::payTo); + m_deleteEntryAction = m_rowMenu->addAction("Delete", this, &ContactsWidget::deleteContact); + + connect(ui->contacts, &QTreeView::customContextMenuRequested, [=](const QPoint & point){ + QModelIndex index = ui->contacts->indexAt(point); + if (index.isValid()) { + m_rowMenu->exec(ui->contacts->viewport()->mapToGlobal(point)); + } + else { + m_contextMenu->exec(ui->contacts->viewport()->mapToGlobal(point)); + } + }); + + connect(ui->search, &QLineEdit::textChanged, this, &ContactsWidget::setSearchFilter); +} + +void ContactsWidget::copyAddress() { + QModelIndex index = ui->contacts->currentIndex(); + ModelUtils::copyColumn(&index, AddressBookModel::Address); +} + +void ContactsWidget::copyName() { + QModelIndex index = ui->contacts->currentIndex(); + ModelUtils::copyColumn(&index, AddressBookModel::Description); +} + +void ContactsWidget::payTo() { + QModelIndex index = ui->contacts->currentIndex(); + QString address = index.model()->data(index.siblingAtColumn(AddressBookModel::Address), Qt::UserRole).toString(); + emit fillAddress(address); +} + +void ContactsWidget::setModel(AddressBookModel *model) +{ + m_model = model; + m_proxyModel = new AddressBookProxyModel; + m_proxyModel->setSourceModel(m_model); + ui->contacts->setModel(m_proxyModel); + + ui->contacts->setSortingEnabled(true); + ui->contacts->header()->setSectionResizeMode(AddressBookModel::Address, QHeaderView::Stretch); + ui->contacts->header()->setSectionResizeMode(AddressBookModel::Description, QHeaderView::ResizeToContents); + ui->contacts->header()->setMinimumSectionSize(200); +} + +void ContactsWidget::setShowFullAddresses(bool show) { + m_model->setShowFullAddresses(show); +} + +void ContactsWidget::setSearchFilter(const QString &filter) { + if(!m_proxyModel) return; + m_proxyModel->setSearchFilter(filter); +} + +void ContactsWidget::showHeaderMenu(const QPoint& position) +{ + m_showFullAddressesAction->setChecked(m_model->isShowFullAddresses()); + m_headerMenu->exec(QCursor::pos()); +} + +void ContactsWidget::newContact() +{ + auto * dialog = new ContactsDialog(this); + int ret = dialog->exec(); + if (!ret) return; + + QString address = dialog->getAddress(); + QString name = dialog->getName(); + + emit addContact(address, name); +} + +void ContactsWidget::deleteContact() +{ + QModelIndex index = ui->contacts->currentIndex(); + m_model->deleteRow(m_proxyModel->mapToSource(index).row()); +} + +ContactsWidget::~ContactsWidget() +{ + delete ui; +} diff --git a/src/contactswidget.h b/src/contactswidget.h new file mode 100644 index 0000000..3859d15 --- /dev/null +++ b/src/contactswidget.h @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef CONTACTSWIDGET_H +#define CONTACTSWIDGET_H + +#include "model/AddressBookModel.h" +#include "model/AddressBookProxyModel.h" + +#include +#include + +namespace Ui { +class ContactsWidget; +} + +class ContactsWidget : public QWidget +{ + Q_OBJECT + +public: + explicit ContactsWidget(QWidget *parent = nullptr); + void setModel(AddressBookModel * model); + ~ContactsWidget(); + +public slots: + void copyAddress(); + void copyName(); + void payTo(); + void newContact(); + void deleteContact(); + void setShowFullAddresses(bool show); + void setSearchFilter(const QString &filter); + +signals: + void addContact(QString &address, QString &name); + void fillAddress(QString &address); + +private slots: + void showHeaderMenu(const QPoint& position); + +private: + Ui::ContactsWidget *ui; + + QAction *m_showFullAddressesAction; + QAction *m_deleteEntryAction; + QMenu *m_rowMenu; + QMenu *m_contextMenu; + QMenu *m_headerMenu; + AddressBookModel * m_model; + AddressBookProxyModel * m_proxyModel; +}; + +#endif // CONTACTSWIDGET_H diff --git a/src/contactswidget.ui b/src/contactswidget.ui new file mode 100644 index 0000000..69151e6 --- /dev/null +++ b/src/contactswidget.ui @@ -0,0 +1,53 @@ + + + ContactsWidget + + + + 0 + 0 + 589 + 416 + + + + Form + + + + 9 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Search contacts... + + + + + + + false + + + false + + + + + + + + diff --git a/src/dialog/aboutdialog.cpp b/src/dialog/aboutdialog.cpp new file mode 100644 index 0000000..5563425 --- /dev/null +++ b/src/dialog/aboutdialog.cpp @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "aboutdialog.h" +#include "ui_aboutdialog.h" +#include "utils/utils.h" +#include "config-feather.h" + +AboutDialog::AboutDialog(QWidget *parent) + : QDialog(parent) + , ui(new Ui::AboutDialog) +{ + ui->setupUi(this); + this->setWindowIcon(QIcon("://assets/images/appicons/64x64.png")); + // cute fox (c) Diego "rehrar" Salazar :-D + QPixmap p(":assets/images/cutexmrfox.png"); + ui->aboutImage->setPixmap(p.scaled(128, 128, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + auto about = Utils::fileOpenQRC(":assets/about.txt"); + auto about_text = Utils::barrayToString(about); + about_text = about_text.replace("", FEATHER_VERSION); + about_text = about_text.replace("", FEATHER_BRANCH); + about_text = about_text.replace("", QString::number(QDate::currentDate().year())); + ui->copyrightText->setPlainText(about_text); + + auto ack = Utils::fileOpenQRC(":assets/ack.txt"); + auto ack_text = Utils::barrayToString(ack); + ui->ackText->setText(ack_text); + + auto sm = QApplication::font(); + auto font = QApplication::font(); + sm.setPointSize(sm.pointSize() - 2); + this->m_model = new QStandardItemModel(this); + this->m_model->setHorizontalHeaderItem(0, Utils::qStandardItem("Name", sm)); + this->m_model->setHorizontalHeaderItem(1, Utils::qStandardItem("Email", sm)); + ui->authorView->setModel(this->m_model); + + int i = 0; + auto contributors = Utils::barrayToString(Utils::fileOpenQRC(":assets/contributors.txt")); + for(const auto &line: contributors.split("\n")){ + // too lazy for regex #sorry #notsorry + auto name = line.left(line.indexOf("<")).trimmed(); + auto nameItem = Utils::qStandardItem(name, font); + auto email = line.mid(line.indexOf("<")+1, line.length()).replace(">", "").trimmed(); + auto emailItem = Utils::qStandardItem(email, font); + + this->m_model->setItem(i, 0, nameItem); + this->m_model->setItem(i, 1, emailItem); + i++; + } + + ui->authorView->header()->setSectionResizeMode(QHeaderView::Stretch); + + this->adjustSize(); +} + +AboutDialog::~AboutDialog() { + delete ui; +} + diff --git a/src/dialog/aboutdialog.h b/src/dialog/aboutdialog.h new file mode 100644 index 0000000..6dbce29 --- /dev/null +++ b/src/dialog/aboutdialog.h @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef ABOUT_H +#define ABOUT_H + +#include +#include +#include + +namespace Ui { + class AboutDialog; +} + +class AboutDialog : public QDialog +{ +Q_OBJECT + +public: + explicit AboutDialog(QWidget *parent = nullptr); + ~AboutDialog() override; + +private: + QStandardItemModel *m_model; + Ui::AboutDialog *ui; +}; + +#endif // ABOUT_H diff --git a/src/dialog/aboutdialog.ui b/src/dialog/aboutdialog.ui new file mode 100644 index 0000000..e68c094 --- /dev/null +++ b/src/dialog/aboutdialog.ui @@ -0,0 +1,111 @@ + + + AboutDialog + + + + 0 + 0 + 750 + 623 + + + + + 750 + 0 + + + + About + + + + + + 0 + + + + Feather + + + + + + image + + + Qt::AlignCenter + + + + + + + a free, open-source Monero wallet + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 420 + + + + true + + + + + + + + Authors + + + + + + QAbstractItemView::NoEditTriggers + + + false + + + + + + + + Acknowledgements + + + + + + true + + + + + + + + + + + + diff --git a/src/dialog/contactsdialog.cpp b/src/dialog/contactsdialog.cpp new file mode 100644 index 0000000..bf0e207 --- /dev/null +++ b/src/dialog/contactsdialog.cpp @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "ui_contactsdialog.h" +#include "contactsdialog.h" + +ContactsDialog::ContactsDialog(QWidget *parent) + : QDialog(parent) + , ui(new Ui::ContactsDialog) +{ + ui->setupUi(this); + setMinimumWidth(400); + + connect(ui->buttonBox, &QDialogButtonBox::accepted, [&](){ + m_address = ui->lineEdit_address->text(); + m_name = ui->lineEdit_name->text(); + }); + + this->adjustSize(); +} + +ContactsDialog::~ContactsDialog() +{ + delete ui; +} + +QString ContactsDialog::getAddress() { + return m_address; +} + +QString ContactsDialog::getName() { + return m_name; +} \ No newline at end of file diff --git a/src/dialog/contactsdialog.h b/src/dialog/contactsdialog.h new file mode 100644 index 0000000..1bb231e --- /dev/null +++ b/src/dialog/contactsdialog.h @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_CONTACTSDIALOG_H +#define FEATHER_CONTACTSDIALOG_H + +#include + +namespace Ui { + class ContactsDialog; +} + +class ContactsDialog : public QDialog +{ + Q_OBJECT + +public: + explicit ContactsDialog(QWidget *parent = nullptr); + ~ContactsDialog() override; + + QString getAddress(); + QString getName(); + +private: + Ui::ContactsDialog *ui; + + QString m_address; + QString m_name; +}; + +#endif //FEATHER_CONTACTSDIALOG_H diff --git a/src/dialog/contactsdialog.ui b/src/dialog/contactsdialog.ui new file mode 100644 index 0000000..1ec06bb --- /dev/null +++ b/src/dialog/contactsdialog.ui @@ -0,0 +1,88 @@ + + + ContactsDialog + + + + 0 + 0 + 400 + 136 + + + + New Contact + + + + + + + + Address + + + + + + + Name + + + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + ContactsDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ContactsDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/dialog/debuginfodialog.cpp b/src/dialog/debuginfodialog.cpp new file mode 100644 index 0000000..aa3c1ae --- /dev/null +++ b/src/dialog/debuginfodialog.cpp @@ -0,0 +1,96 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "debuginfodialog.h" +#include "ui_debuginfodialog.h" +#include "config-feather.h" +#include "utils/utils.h" + +#include +#include + +DebugInfoDialog::DebugInfoDialog(AppContext *ctx, QWidget *parent) + : QDialog(parent) + , ui(new Ui::DebugInfoDialog) +{ + ui->setupUi(this); + + QString torStatus; + if(ctx->isTorSocks) + torStatus = "Torsocks"; + else if(ctx->tor->localTor) + torStatus = "Local (assumed to be running)"; + else if(ctx->tor->torConnected) + torStatus = "Running"; + else + torStatus = "Unknown"; + + ui->label_featherVersion->setText(QString("%1-%2").arg(FEATHER_VERSION, FEATHER_BRANCH)); + ui->label_moneroVersion->setText(QString("%1-%2").arg(MONERO_VERSION, MONERO_BRANCH)); + + ui->label_walletHeight->setText(QString::number(ctx->currentWallet->blockChainHeight())); + ui->label_daemonHeight->setText(QString::number(ctx->currentWallet->daemonBlockChainHeight())); + ui->label_restoreHeight->setText(QString::number(ctx->currentWallet->getWalletCreationHeight())); + ui->label_synchronized->setText(ctx->currentWallet->synchronized() ? "True" : "False"); + + auto node = ctx->nodes->connection(); + ui->label_remoteNode->setText(node.full); + ui->label_walletStatus->setText(this->statusToString(ctx->currentWallet->connected())); + ui->label_torStatus->setText(torStatus); + ui->label_websocketStatus->setText(Utils::QtEnumToString(ctx->ws->webSocket.state())); + + ui->label_netType->setText(Utils::QtEnumToString(ctx->currentWallet->nettype())); + ui->label_seedType->setText(ctx->currentWallet->getCacheAttribute("feather.seed").isEmpty() ? "25 word" : "14 word"); + ui->label_viewOnly->setText(ctx->currentWallet->viewOnly() ? "True" : "False"); + + ui->label_OS->setText(QSysInfo::prettyProductName()); + ui->label_timestamp->setText(QString::number(QDateTime::currentSecsSinceEpoch())); + + connect(ui->btn_Copy, &QPushButton::clicked, this, &DebugInfoDialog::copyToClipboad); + + this->adjustSize(); +} + +QString DebugInfoDialog::statusToString(Wallet::ConnectionStatus status) { + switch (status) { + case Wallet::ConnectionStatus_Disconnected: + return "Disconnected"; + case Wallet::ConnectionStatus_Connected: + return "Connected"; + case Wallet::ConnectionStatus_WrongVersion: + return "Daemon wrong version"; + case Wallet::ConnectionStatus_Connecting: + return "Connecting"; + default: + return "Unknown"; + } +} + +void DebugInfoDialog::copyToClipboad() { + QString text = ""; + text += QString("Feather version: %1\n").arg(ui->label_featherVersion->text()); + text += QString("Monero version: %1\n").arg(ui->label_moneroVersion->text()); + + text += QString("Wallet height: %1\n").arg(ui->label_walletHeight->text()); + text += QString("Daemon height: %1\n").arg(ui->label_daemonHeight->text()); + text += QString("Restore height: %1\n").arg(ui->label_restoreHeight->text()); + text += QString("Synchronized: %1\n").arg(ui->label_synchronized->text()); + + text += QString("Remote node: %1\n").arg(ui->label_remoteNode->text()); + text += QString("Wallet status: %1\n").arg(ui->label_walletStatus->text()); + text += QString("Tor status: %1\n").arg(ui->label_torStatus->text()); + text += QString("Websocket status: %1\n").arg(ui->label_websocketStatus->text()); + + text += QString("Network type: %1\n").arg(ui->label_netType->text()); + text += QString("Seed type: %1\n").arg(ui->label_seedType->text()); + text += QString("View only: %1\n").arg(ui->label_viewOnly->text()); + + text += QString("Operating system: %1\n").arg(ui->label_OS->text()); + text += QString("Timestamp: %1\n").arg(ui->label_timestamp->text()); + + Utils::copyToClipboard(text); +} + +DebugInfoDialog::~DebugInfoDialog() { + delete ui; +} diff --git a/src/dialog/debuginfodialog.h b/src/dialog/debuginfodialog.h new file mode 100644 index 0000000..2443df1 --- /dev/null +++ b/src/dialog/debuginfodialog.h @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_DEBUGINFODIALOG_H +#define FEATHER_DEBUGINFODIALOG_H + +#include +#include "appcontext.h" +#include "libwalletqt/Wallet.h" + +namespace Ui { + class DebugInfoDialog; +} + +class DebugInfoDialog : public QDialog +{ + Q_OBJECT + +public: + explicit DebugInfoDialog(AppContext *ctx, QWidget *parent = nullptr); + ~DebugInfoDialog() override; + +private: + QString statusToString(Wallet::ConnectionStatus status); + void copyToClipboad(); + + Ui::DebugInfoDialog *ui; +}; + +#endif //FEATHER_DEBUGINFODIALOG_H diff --git a/src/dialog/debuginfodialog.ui b/src/dialog/debuginfodialog.ui new file mode 100644 index 0000000..646dd4d --- /dev/null +++ b/src/dialog/debuginfodialog.ui @@ -0,0 +1,359 @@ + + + DebugInfoDialog + + + + 0 + 0 + 693 + 580 + + + + Debug Info + + + + + + + + Feather version: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Monero version: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Qt::Horizontal + + + + + + + Wallet height: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Daemon height: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Restore height: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Synchronized: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Qt::Horizontal + + + + + + + Remote node: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Wallet status: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Tor status: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Websocket status: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Qt::Horizontal + + + + + + + Network type: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Seed type: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + View only: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Timestamp: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Operating system: + + + + + + + TextLabel + + + + + + + Qt::Horizontal + + + + + + + + + + + Copy + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + DebugInfoDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + DebugInfoDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/dialog/keysdialog.cpp b/src/dialog/keysdialog.cpp new file mode 100644 index 0000000..11fffb5 --- /dev/null +++ b/src/dialog/keysdialog.cpp @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "keysdialog.h" +#include "ui_keysdialog.h" + +KeysDialog::KeysDialog(AppContext *ctx, QWidget *parent) + : QDialog(parent) + , ui(new Ui::KeysDialog) +{ + ui->setupUi(this); + + ui->label_restoreHeight->setText(QString::number(ctx->currentWallet->getWalletCreationHeight())); + ui->label_primaryAddress->setText(ctx->currentWallet->address(0, 0)); + ui->label_secretSpendKey->setText(ctx->currentWallet->getSecretSpendKey()); + ui->label_secretViewKey->setText(ctx->currentWallet->getSecretViewKey()); + ui->label_publicSpendKey->setText(ctx->currentWallet->getPublicSpendKey()); + ui->label_publicViewKey->setText(ctx->currentWallet->getPublicViewKey()); + + this->adjustSize(); +} + +KeysDialog::~KeysDialog() +{ + delete ui; +} diff --git a/src/dialog/keysdialog.h b/src/dialog/keysdialog.h new file mode 100644 index 0000000..8a89605 --- /dev/null +++ b/src/dialog/keysdialog.h @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_KEYSDIALOG_H +#define FEATHER_KEYSDIALOG_H + +#include +#include "appcontext.h" + +namespace Ui { + class KeysDialog; +} + +class KeysDialog : public QDialog +{ +Q_OBJECT + +public: + explicit KeysDialog(AppContext *ctx, QWidget *parent = nullptr); + ~KeysDialog() override; + +private: + Ui::KeysDialog *ui; +}; + + +#endif //FEATHER_KEYSDIALOG_H diff --git a/src/dialog/keysdialog.ui b/src/dialog/keysdialog.ui new file mode 100644 index 0000000..84a90b9 --- /dev/null +++ b/src/dialog/keysdialog.ui @@ -0,0 +1,178 @@ + + + KeysDialog + + + + 0 + 0 + 747 + 543 + + + + Keys + + + + + + Restore height + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + + Primary address + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + + Secret spend key + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + + Secret view key + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + + Public spend key + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + + Public view key + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + KeysDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + KeysDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/dialog/outputinfodialog.cpp b/src/dialog/outputinfodialog.cpp new file mode 100644 index 0000000..800b1c8 --- /dev/null +++ b/src/dialog/outputinfodialog.cpp @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "outputinfodialog.h" +#include "ui_outputinfodialog.h" +#include "model/ModelUtils.h" +#include "libwalletqt/CoinsInfo.h" +#include "utils/utils.h" + +#include + +OutputInfoDialog::OutputInfoDialog(CoinsInfo *cInfo, QWidget *parent) + : QDialog(parent) + , ui(new Ui::OutputInfoDialog) +{ + ui->setupUi(this); + + QFont font = ModelUtils::getMonospaceFont(); + ui->label_pubKey->setFont(font); + ui->label_keyImage->setFont(font); + ui->label_txid->setFont(font); + ui->label_address->setFont(font); + + ui->label_pubKey->setText(cInfo->pubKey()); + ui->label_keyImage->setText(cInfo->keyImage()); + ui->label_txid->setText(cInfo->hash()); + ui->label_address->setText(cInfo->address()); + + QString status = cInfo->spent() ? "spent" : (cInfo->frozen() ? "frozen" : "unspent"); + ui->label_status->setText(status); + ui->label_amount->setText(QString("%1 XMR").arg(cInfo->displayAmount())); + ui->label_creationHeight->setText(QString::number(cInfo->blockHeight())); + ui->label_globalIndex->setText(QString::number(cInfo->globalOutputIndex())); + ui->label_internalIndex->setText(QString::number(cInfo->internalOutputIndex())); + + QString spentHeight = QVariant(cInfo->spentHeight()).toString(); + if (spentHeight == "0") spentHeight = "n/a"; + ui->label_spentHeight->setText(spentHeight); + + this->adjustSize(); +} + +OutputInfoDialog::~OutputInfoDialog() { + delete ui; +} diff --git a/src/dialog/outputinfodialog.h b/src/dialog/outputinfodialog.h new file mode 100644 index 0000000..481e81b --- /dev/null +++ b/src/dialog/outputinfodialog.h @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_OUTPUTINFODIALOG_H +#define FEATHER_OUTPUTINFODIALOG_H + +#include +#include "libwalletqt/Coins.h" +#include "libwalletqt/CoinsInfo.h" + +namespace Ui { + class OutputInfoDialog; +} + +class OutputInfoDialog : public QDialog +{ +Q_OBJECT + +public: + explicit OutputInfoDialog(CoinsInfo *cInfo, QWidget *parent = nullptr); + ~OutputInfoDialog() override; + +private: + Ui::OutputInfoDialog *ui; +}; + + +#endif //FEATHER_OUTPUTINFODIALOG_H diff --git a/src/dialog/outputinfodialog.ui b/src/dialog/outputinfodialog.ui new file mode 100644 index 0000000..ed1086f --- /dev/null +++ b/src/dialog/outputinfodialog.ui @@ -0,0 +1,234 @@ + + + OutputInfoDialog + + + + 0 + 0 + 865 + 474 + + + + Output + + + + + + Public Key: + + + + + + pubkey + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + + Key Image: + + + + + + false + + + key image + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + + Created in tx: + + + + + + txid + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + + Address: + + + + + + address + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + + + + + + Status: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Global index: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Amount: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + Qt::Vertical + + + + + + + + + Spent height: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Creation height: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Tx index: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + + diff --git a/src/dialog/outputsweepdialog.cpp b/src/dialog/outputsweepdialog.cpp new file mode 100644 index 0000000..1b4bcaf --- /dev/null +++ b/src/dialog/outputsweepdialog.cpp @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "ui_outputsweepdialog.h" +#include "outputsweepdialog.h" + +OutputSweepDialog::OutputSweepDialog(QWidget *parent) + : QDialog(parent) + , ui(new Ui::OutputSweepDialog) +{ + ui->setupUi(this); + + connect(ui->checkBox_churn, &QCheckBox::toggled, [&](bool toggled){ + ui->lineEdit_address->setEnabled(!toggled); + }); + + connect(ui->buttonBox, &QDialogButtonBox::accepted, [&](){ + m_address = ui->lineEdit_address->text(); + m_churn = ui->checkBox_churn->isChecked(); + m_outputs = ui->spinBox_numOutputs->value(); + }); + + this->adjustSize(); +} + +OutputSweepDialog::~OutputSweepDialog() +{ + delete ui; +} + +QString OutputSweepDialog::address() { + return m_address; +} + +bool OutputSweepDialog::churn() const { + return m_churn; +} + +int OutputSweepDialog::outputs() const { + return m_outputs; +} \ No newline at end of file diff --git a/src/dialog/outputsweepdialog.h b/src/dialog/outputsweepdialog.h new file mode 100644 index 0000000..ecfbe8d --- /dev/null +++ b/src/dialog/outputsweepdialog.h @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_OUTPUTSWEEPDIALOG_H +#define FEATHER_OUTPUTSWEEPDIALOG_H + +#include + +namespace Ui { + class OutputSweepDialog; +} + +class OutputSweepDialog : public QDialog +{ +Q_OBJECT + +public: + explicit OutputSweepDialog(QWidget *parent = nullptr); + ~OutputSweepDialog() override; + + QString address(); + bool churn() const; + int outputs() const; + +private: + Ui::OutputSweepDialog *ui; + + QString m_address; + bool m_churn; + int m_outputs; +}; + + +#endif //FEATHER_OUTPUTSWEEPDIALOG_H diff --git a/src/dialog/outputsweepdialog.ui b/src/dialog/outputsweepdialog.ui new file mode 100644 index 0000000..e6abab4 --- /dev/null +++ b/src/dialog/outputsweepdialog.ui @@ -0,0 +1,130 @@ + + + OutputSweepDialog + + + + 0 + 0 + 623 + 231 + + + + Sweep output + + + + + + + + Address: + + + + + + + true + + + + 500 + 0 + + + + + + + + + + Send to self (churn) + + + + + + + Advanced options + + + true + + + false + + + + QFormLayout::ExpandingFieldsGrow + + + + + Number of outputs: + + + + + + + 1 + + + 16 + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + OutputSweepDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + OutputSweepDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/dialog/passwordchangedialog.cpp b/src/dialog/passwordchangedialog.cpp new file mode 100644 index 0000000..175d86e --- /dev/null +++ b/src/dialog/passwordchangedialog.cpp @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "passwordchangedialog.h" +#include "ui_passwordchangedialog.h" + +#include + +PasswordChangeDialog::PasswordChangeDialog(QWidget *parent) + : QDialog(parent) + , ui(new Ui::PasswordChangeDialog) +{ + ui->setupUi(this); + ui->icon->setPixmap(QPixmap(":/assets/images/lock.png").scaledToWidth(32, Qt::SmoothTransformation)); + + connect(ui->lineEdit_newPassword, &QLineEdit::textChanged, this, &PasswordChangeDialog::passwordsMatch); + connect(ui->lineEdit_confirmPassword, &QLineEdit::textChanged, this, &PasswordChangeDialog::passwordsMatch); + + this->adjustSize(); +} + +PasswordChangeDialog::~PasswordChangeDialog() +{ + delete ui; +} + +QString PasswordChangeDialog::getCurrentPassword() { + return ui->lineEdit_currentPassword->text(); +} + +QString PasswordChangeDialog::getNewPassword() { + return ui->lineEdit_newPassword->text(); +} + +void PasswordChangeDialog::passwordsMatch() { + bool match = ui->lineEdit_newPassword->text() == ui->lineEdit_confirmPassword->text(); + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(match); +} \ No newline at end of file diff --git a/src/dialog/passwordchangedialog.h b/src/dialog/passwordchangedialog.h new file mode 100644 index 0000000..64cc7ce --- /dev/null +++ b/src/dialog/passwordchangedialog.h @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_PASSWORDCHANGEDIALOG_H +#define FEATHER_PASSWORDCHANGEDIALOG_H + +#include + +namespace Ui { + class PasswordChangeDialog; +} + +class PasswordChangeDialog : public QDialog +{ +Q_OBJECT + +public: + explicit PasswordChangeDialog(QWidget *parent = nullptr); + ~PasswordChangeDialog() override; + + QString getCurrentPassword(); + QString getNewPassword(); + +private: + Ui::PasswordChangeDialog *ui; + + void passwordsMatch(); +}; + +#endif //FEATHER_PASSWORDCHANGEDIALOG_H diff --git a/src/dialog/passwordchangedialog.ui b/src/dialog/passwordchangedialog.ui new file mode 100644 index 0000000..88db6af --- /dev/null +++ b/src/dialog/passwordchangedialog.ui @@ -0,0 +1,142 @@ + + + PasswordChangeDialog + + + + 0 + 0 + 500 + 237 + + + + + 0 + 0 + + + + Change Password + + + + + + + + TextLabel + + + + + + + Your wallet is password protected and encrypted. Use this dialog to change your password. + + + true + + + + + + + + + + + New Password: + + + + + + + QLineEdit::Password + + + + + + + QLineEdit::Password + + + + + + + Current Password: + + + + + + + Confirm Password: + + + + + + + QLineEdit::Password + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + lineEdit_currentPassword + lineEdit_newPassword + lineEdit_confirmPassword + + + + + buttonBox + accepted() + PasswordChangeDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + PasswordChangeDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/dialog/qrcodedialog.cpp b/src/dialog/qrcodedialog.cpp new file mode 100644 index 0000000..02742be --- /dev/null +++ b/src/dialog/qrcodedialog.cpp @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "qrcodedialog.h" +#include "ui_qrcodedialog.h" +#include "qrcode/QrCode.h" + +#include +#include +#include + +QrCodeDialog::QrCodeDialog(QWidget *parent, const QString &text, const QString &title) + : QDialog(parent) + , ui(new Ui::QrCodeDialog) +{ + ui->setupUi(this); + this->setWindowTitle(title); + + m_qrc = new QrCode(text, QrCode::Version::AUTO, QrCode::ErrorCorrectionLevel::HIGH); + m_pixmap = m_qrc->toPixmap(1).scaled(500, 500, Qt::KeepAspectRatio); + ui->QrCode->setPixmap(m_pixmap); + + connect(ui->btn_CopyImage, &QPushButton::clicked, this, &QrCodeDialog::copyImage); + connect(ui->btn_Save, &QPushButton::clicked, this, &QrCodeDialog::saveImage); + connect(ui->btn_Close, &QPushButton::clicked, [this](){ + accept(); + }); + + this->adjustSize(); +} + +QrCodeDialog::~QrCodeDialog() +{ + delete ui; + delete m_qrc; +} + +void QrCodeDialog::copyImage() { + QApplication::clipboard()->setPixmap(m_pixmap); + QMessageBox::information(this, "Information", "QR code copied to clipboard"); +} + +void QrCodeDialog::saveImage() { + QString filename = QFileDialog::getSaveFileName(this, "Select where to save file", "qrcode.png"); + if (filename.isEmpty()) { + return; + } + + QFile file(filename); + file.open(QIODevice::WriteOnly); + m_pixmap.save(&file, "PNG"); + QMessageBox::information(this, "Information", "QR code saved to file"); +} \ No newline at end of file diff --git a/src/dialog/qrcodedialog.h b/src/dialog/qrcodedialog.h new file mode 100644 index 0000000..cb0d1a2 --- /dev/null +++ b/src/dialog/qrcodedialog.h @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_QRCODEDIALOG_H +#define FEATHER_QRCODEDIALOG_H +#include + +#include "qrcode/QrCode.h" + +namespace Ui { + class QrCodeDialog; +} + +class QrCodeDialog : public QDialog +{ +Q_OBJECT + +public: + explicit QrCodeDialog(QWidget *parent, const QString &text, const QString &title = "Qr Code"); + ~QrCodeDialog() override; + +private: + void copyImage(); + void saveImage(); + + Ui::QrCodeDialog *ui; + QrCode *m_qrc; + QPixmap m_pixmap; +}; + + +#endif //FEATHER_QRCODEDIALOG_H diff --git a/src/dialog/qrcodedialog.ui b/src/dialog/qrcodedialog.ui new file mode 100644 index 0000000..c160dc9 --- /dev/null +++ b/src/dialog/qrcodedialog.ui @@ -0,0 +1,93 @@ + + + QrCodeDialog + + + + 0 + 0 + 522 + 562 + + + + Dialog + + + + + + + 0 + 0 + + + + + 500 + 500 + + + + QrCode + + + + + + + QLayout::SetDefaultConstraint + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Copy Image + + + false + + + + + + + Save + + + false + + + + + + + Close + + + false + + + true + + + + + + + + + + diff --git a/src/dialog/restoredialog.cpp b/src/dialog/restoredialog.cpp new file mode 100644 index 0000000..e6363bb --- /dev/null +++ b/src/dialog/restoredialog.cpp @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "restoredialog.h" +#include "ui_restoredialog.h" +#include "utils/utils.h" +#include "appcontext.h" + +RestoreDialog::RestoreDialog(AppContext *ctx, QWidget *parent) + : QDialog(parent) + , ui(new Ui::RestoreDialog) + , m_ctx(ctx) +{ + ui->setupUi(this); + this->setWindowIcon(QIcon("://assets/images/appicons/64x64.png")); + connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &RestoreDialog::accepted); + connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &RestoreDialog::rejected); + + if(m_ctx->networkType == NetworkType::Type::TESTNET) { + ui->restoreHeightWidget->hideSlider(); + } else { + // load restoreHeight lookup db + ui->restoreHeightWidget->initRestoreHeights(m_ctx->restoreHeights[m_ctx->networkType]); + } +} + +unsigned int RestoreDialog::getHeight() { + return ui->restoreHeightWidget->getHeight(); +} + +void RestoreDialog::initRestoreHeights(RestoreHeightLookup *lookup) { + ui->restoreHeightWidget->initRestoreHeights(lookup); +} + +RestoreDialog::~RestoreDialog() { + delete ui; +} + diff --git a/src/dialog/restoredialog.h b/src/dialog/restoredialog.h new file mode 100644 index 0000000..d45ae05 --- /dev/null +++ b/src/dialog/restoredialog.h @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef RESTOREDIALOG_H +#define RESTOREDIALOG_H + +#include +#include +#include +#include +#include + +#include "utils/seeds.h" +#include "appcontext.h" + +namespace Ui { + class RestoreDialog; +} + +class RestoreDialog : public QDialog +{ +Q_OBJECT + +public: + explicit RestoreDialog(AppContext *ctx, QWidget *parent = nullptr); + void initRestoreHeights(RestoreHeightLookup *lookup); + unsigned int getHeight(); + ~RestoreDialog() override; + +signals: + void accepted(); + void rejected(); + +private: + AppContext *m_ctx; + Ui::RestoreDialog *ui; +}; + +#endif // RESTOREDIALOG_H diff --git a/src/dialog/restoredialog.ui b/src/dialog/restoredialog.ui new file mode 100644 index 0000000..5c914bb --- /dev/null +++ b/src/dialog/restoredialog.ui @@ -0,0 +1,56 @@ + + + RestoreDialog + + + + 0 + 0 + 584 + 99 + + + + specify restore height + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + RestoreHeightWidget + QWidget +
        widgets/restoreheightwidget.h
        + 1 +
        +
        + + +
        diff --git a/src/dialog/seeddialog.cpp b/src/dialog/seeddialog.cpp new file mode 100644 index 0000000..bd1a537 --- /dev/null +++ b/src/dialog/seeddialog.cpp @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "ui_seeddialog.h" +#include "seeddialog.h" + +SeedDialog::SeedDialog(const QString &seed, QWidget *parent) + : QDialog(parent) + , ui(new Ui::SeedDialog) +{ + ui->setupUi(this); + ui->label_seedIcon->setPixmap(QPixmap(":/assets/images/seed.png").scaledToWidth(64, Qt::SmoothTransformation)); + ui->seed->setPlainText(seed); + + int words = seed.split(" ").size(); + ui->label_warning->setText(QString("

        Please save these %1 words on paper (order is important). " + "This seed will allow you to recover your wallet in case " + "of computer failure." + "

        " + "WARNING:" + "
          " + "
        • Never disclose your seed.
        • " + "
        • Never type it on a website
        • " + "
        • Do not store it electronically
        • " + "
        ").arg(words)); + + this->adjustSize(); +} + +SeedDialog::~SeedDialog() +{ + delete ui; +} \ No newline at end of file diff --git a/src/dialog/seeddialog.h b/src/dialog/seeddialog.h new file mode 100644 index 0000000..a26fee4 --- /dev/null +++ b/src/dialog/seeddialog.h @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_SEEDDIALOG_H +#define FEATHER_SEEDDIALOG_H + +#include + +namespace Ui { + class SeedDialog; +} + +class SeedDialog : public QDialog +{ +Q_OBJECT + +public: + explicit SeedDialog(const QString& seed, QWidget *parent = nullptr); + ~SeedDialog() override; + +private: + Ui::SeedDialog *ui; +}; + + +#endif //FEATHER_SEEDDIALOG_H diff --git a/src/dialog/seeddialog.ui b/src/dialog/seeddialog.ui new file mode 100644 index 0000000..1288fac --- /dev/null +++ b/src/dialog/seeddialog.ui @@ -0,0 +1,117 @@ + + + SeedDialog + + + + 0 + 0 + 542 + 244 + + + + Seed + + + + + + Your wallet generation seed is: + + + + + + + + + seed + + + false + + + + + + + true + + + + 0 + 0 + + + + + 16777215 + 125 + + + + true + + + + + + + + + warning + + + true + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + SeedDialog + accept() + + + 270 + 211 + + + 157 + 274 + + + + + buttonBox + rejected() + SeedDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/dialog/signverifydialog.cpp b/src/dialog/signverifydialog.cpp new file mode 100644 index 0000000..2176b2e --- /dev/null +++ b/src/dialog/signverifydialog.cpp @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "signverifydialog.h" +#include "ui_signverifydialog.h" +#include "utils/utils.h" + +#include + +SignVerifyDialog::SignVerifyDialog(Wallet *wallet, QWidget *parent) + : QDialog(parent) + , m_wallet(wallet) + , ui(new Ui::SignVerifyDialog) +{ + ui->setupUi(this); + + connect(ui->btn_Sign, &QPushButton::clicked, this, &SignVerifyDialog::signMessage); + connect(ui->btn_Verify, &QPushButton::clicked, this, &SignVerifyDialog::verifyMessage); + connect(ui->btn_Copy, &QPushButton::clicked, this, &SignVerifyDialog::copyToClipboard); + + connect(ui->message, &QPlainTextEdit::textChanged, [this](){ui->btn_Copy->setVisible(false);}); + connect(ui->address, &QLineEdit::textEdited, [this](){ui->btn_Copy->setVisible(false);}); + connect(ui->signature, &QLineEdit::textEdited, [this](){ui->btn_Copy->setVisible(false);}); + + ui->address->setText(m_wallet->address(0, 0)); + ui->address->setCursorPosition(0); + + ui->btn_Copy->setVisible(false); +} + +void SignVerifyDialog::signMessage() { + QString signature = m_wallet->signMessage(ui->message->toPlainText(), false, ui->address->text()); + + if (signature.isEmpty()) { + QMessageBox::information(this, "Information", m_wallet->errorString()); + return; + } + + ui->signature->setText(signature); + ui->btn_Copy->setVisible(true); +} + +void SignVerifyDialog::verifyMessage() { + bool verified = m_wallet->verifySignedMessage(ui->message->toPlainText(), ui->address->text(), ui->signature->text()); + verified ? QMessageBox::information(this, "Information", "Signature is valid") + : QMessageBox::warning(this, "Warning", "Signature failed to verify"); +} + +void SignVerifyDialog::copyToClipboard() { + QStringList sig; + sig << ui->message->toPlainText() << ui->address->text() << ui->signature->text(); + Utils::copyToClipboard(sig.join("\n")); +} + +SignVerifyDialog::~SignVerifyDialog() +{ + delete ui; +} \ No newline at end of file diff --git a/src/dialog/signverifydialog.h b/src/dialog/signverifydialog.h new file mode 100644 index 0000000..e4c5700 --- /dev/null +++ b/src/dialog/signverifydialog.h @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_SIGNVERIFYDIALOG_H +#define FEATHER_SIGNVERIFYDIALOG_H + +#include +#include "libwalletqt/Wallet.h" + +namespace Ui { + class SignVerifyDialog; +} + +class SignVerifyDialog : public QDialog +{ +Q_OBJECT + +public: + explicit SignVerifyDialog(Wallet *wallet, QWidget *parent = nullptr); + ~SignVerifyDialog() override; + +private: + Ui::SignVerifyDialog *ui; + Wallet *m_wallet; + +private slots: + void signMessage(); + void verifyMessage(); + void copyToClipboard(); +}; + + +#endif //FEATHER_SIGNVERIFYDIALOG_H diff --git a/src/dialog/signverifydialog.ui b/src/dialog/signverifydialog.ui new file mode 100644 index 0000000..935cada --- /dev/null +++ b/src/dialog/signverifydialog.ui @@ -0,0 +1,89 @@ + + + SignVerifyDialog + + + + 0 + 0 + 1102 + 269 + + + + Sign / Verify + + + + + + Address + + + + + + + Signature + + + + + + + Message + + + + + + + + + + + + + + + Sign + + + + + + + Verify + + + + + + + Copy to clipboard + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + diff --git a/src/dialog/torinfodialog.cpp b/src/dialog/torinfodialog.cpp new file mode 100644 index 0000000..85e8474 --- /dev/null +++ b/src/dialog/torinfodialog.cpp @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "torinfodialog.h" +#include "ui_torinfodialog.h" + +#include + +TorInfoDialog::TorInfoDialog(AppContext *ctx, QWidget *parent) + : QDialog(parent) + , ui(new Ui::TorInfoDialog) + , m_ctx(ctx) +{ + ui->setupUi(this); + + if (!m_ctx->tor->torConnected && !m_ctx->tor->errorMsg.isEmpty()) { + ui->message->setText(m_ctx->tor->errorMsg); + } else { + ui->message->setText(QString("Currently using Tor instance: %1:%2").arg(Tor::torHost).arg(Tor::torPort)); + } + + if (m_ctx->tor->localTor) { + ui->logs->setHidden(true); + } else { + ui->logs->setPlainText(m_ctx->tor->torLogs); + } + + this->adjustSize(); +} + +void TorInfoDialog::onLogsUpdated() { + ui->logs->setPlainText(m_ctx->tor->torLogs); +} + +TorInfoDialog::~TorInfoDialog() { + delete ui; +} diff --git a/src/dialog/torinfodialog.h b/src/dialog/torinfodialog.h new file mode 100644 index 0000000..9c44db1 --- /dev/null +++ b/src/dialog/torinfodialog.h @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_TORINFODIALOG_H +#define FEATHER_TORINFODIALOG_H + +#include + +#include "appcontext.h" + +namespace Ui { + class TorInfoDialog; +} + +class TorInfoDialog : public QDialog +{ + Q_OBJECT + +public: + explicit TorInfoDialog(AppContext *ctx, QWidget *parent = nullptr); + ~TorInfoDialog() override; + +public slots: + void onLogsUpdated(); + +private: + Ui::TorInfoDialog *ui; + AppContext *m_ctx; +}; + + +#endif //FEATHER_TORINFODIALOG_H diff --git a/src/dialog/torinfodialog.ui b/src/dialog/torinfodialog.ui new file mode 100644 index 0000000..d31d1e7 --- /dev/null +++ b/src/dialog/torinfodialog.ui @@ -0,0 +1,84 @@ + + + TorInfoDialog + + + + 0 + 0 + 618 + 386 + + + + Tor information + + + + + + Message + + + + + + + + 600 + 0 + + + + true + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + TorInfoDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + TorInfoDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/dialog/transactioninfodialog.cpp b/src/dialog/transactioninfodialog.cpp new file mode 100644 index 0000000..d773c14 --- /dev/null +++ b/src/dialog/transactioninfodialog.cpp @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "transactioninfodialog.h" +#include "ui_transactioninfodialog.h" + +#include "libwalletqt/CoinsInfo.h" +#include "libwalletqt/WalletManager.h" +#include + +TransactionInfoDialog::TransactionInfoDialog(Coins *coins, TransactionInfo *txInfo, QWidget *parent) + : QDialog(parent) + , ui(new Ui::TransactionInfoDialog) + , m_coins(coins) + , m_txInfo(txInfo) +{ + ui->setupUi(this); + + ui->txid->setText(QString(txInfo->hash())); + ui->txid->setCursorPosition(0); + + ui->label_status->setText(QString("Status: %1 confirmations").arg(txInfo->confirmations())); + ui->label_date->setText(QString("Date: %1").arg(txInfo->timestamp().toString("yyyy-MM-dd HH:mm"))); + ui->label_blockHeight->setText(QString("Block height: %1").arg(txInfo->blockHeight())); + + QString direction = txInfo->direction() == TransactionInfo::Direction_In ? "received" : "sent"; + ui->label_amount->setText(QString("Amount %1: %2").arg(direction, txInfo->displayAmount())); + + QString fee = txInfo->fee().isEmpty() ? "n/a" : txInfo->fee(); + ui->label_fee->setText(QString("Fee: %1").arg(txInfo->isCoinbase() ? WalletManager::displayAmount(0) : fee)); + ui->label_unlockTime->setText(QString("Unlock time: %1 (height)").arg(txInfo->unlockTime())); + + qDebug() << m_coins->coins_from_txid(txInfo->hash()); + + QString destinations = txInfo->destinations_formatted(); + if (destinations.isEmpty()) { + ui->destinations->setHidden(true); + ui->label_destinations->setHidden(true); + ui->line_2->setHidden(true); + } else { + ui->destinations->setText(destinations); + } + + this->adjustSize(); +} + +TransactionInfoDialog::~TransactionInfoDialog() { + delete ui; +} diff --git a/src/dialog/transactioninfodialog.h b/src/dialog/transactioninfodialog.h new file mode 100644 index 0000000..26feaa7 --- /dev/null +++ b/src/dialog/transactioninfodialog.h @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_TRANSACTIONINFODIALOG_H +#define FEATHER_TRANSACTIONINFODIALOG_H + +#include +#include +#include "libwalletqt/Coins.h" +#include "libwalletqt/TransactionInfo.h" + +namespace Ui { + class TransactionInfoDialog; +} + +class TransactionInfoDialog : public QDialog +{ +Q_OBJECT + +public: + explicit TransactionInfoDialog(Coins *coins, TransactionInfo *txInfo, QWidget *parent = nullptr); + ~TransactionInfoDialog() override; + +private: + Ui::TransactionInfoDialog *ui; + + TransactionInfo *m_txInfo; + Coins *m_coins; +}; + +#endif //FEATHER_TRANSACTIONINFODIALOG_H diff --git a/src/dialog/transactioninfodialog.ui b/src/dialog/transactioninfodialog.ui new file mode 100644 index 0000000..8026b6e --- /dev/null +++ b/src/dialog/transactioninfodialog.ui @@ -0,0 +1,169 @@ + + + TransactionInfoDialog + + + + 0 + 0 + 547 + 332 + + + + Transaction + + + + + + Transaction ID: + + + + + + + + 0 + 0 + + + + + 525 + 0 + + + + txid + + + true + + + + + + + + + + + Status: + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Date: + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Block height: + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + Qt::Vertical + + + + + + + + + Amount received: + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Fee: + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Unlock time: + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + + + Qt::Horizontal + + + + + + + Destinations: + + + + + + + + 16777215 + 100 + + + + true + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + + diff --git a/src/dialog/txconfdialog.cpp b/src/dialog/txconfdialog.cpp new file mode 100644 index 0000000..b72c437 --- /dev/null +++ b/src/dialog/txconfdialog.cpp @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "txconfdialog.h" +#include "ui_txconfdialog.h" +#include "appcontext.h" +#include "utils/config.h" +#include "model/ModelUtils.h" + +#include + +TxConfDialog::TxConfDialog(PendingTransaction *tx, const QString &address, const QString &description, int mixin, QWidget *parent) + : QDialog(parent) + , ui(new Ui::TxConfDialog) + , m_tx(tx) + , m_address(address) + , m_description(description) + , m_mixin(mixin) +{ + ui->setupUi(this); + + ui->label_warning->setText("You are about to send a transaction.\nVerify the information below."); + + QString preferredCur = config()->get(Config::preferredFiatCurrency).toString(); + + auto convert = [preferredCur](double amount){ + return QString::number(AppContext::prices->convert("XMR", preferredCur, amount), 'f', 2); + }; + + QString amount = WalletManager::displayAmount(tx->amount()); + QString amount_fiat = convert(tx->amount() / AppContext::cdiv); + ui->label_amount->setText(QString("%1 (%2 %3)").arg(amount, amount_fiat, preferredCur)); + + QString fee = WalletManager::displayAmount(tx->fee()); + QString fee_fiat = convert(tx->fee() / AppContext::cdiv); + ui->label_fee->setText(QString("%1 (%2 %3)").arg(fee, fee_fiat, preferredCur)); + + QString total = WalletManager::displayAmount(tx->amount() + tx->fee()); + QString total_fiat = convert((tx->amount() + tx->fee()) / AppContext::cdiv); + ui->label_total->setText(QString("%1 (%2 %3)").arg(total, total_fiat, preferredCur)); + + ui->label_address->setText(ModelUtils::displayAddress(address, 2)); + ui->label_address->setFont(ModelUtils::getMonospaceFont()); + ui->label_address->setToolTip(address); + + connect(ui->btn_Advanced, &QPushButton::clicked, this, &TxConfDialog::showAdvanced); + + this->adjustSize(); +} + +void TxConfDialog::showAdvanced() { + const auto amount = m_tx->amount() / AppContext::cdiv; + const auto fee = m_tx->fee() / AppContext::cdiv; + + QString body = QString("Address: %2\n").arg(m_address.left(60)); + body += m_address.mid(60) + "\n"; + if(!m_description.isEmpty()) + body = QString("%1Description: %2\n").arg(body, m_description); + body = QString("%1Amount: %2 XMR\n").arg(body, QString::number(amount)); + body = QString("%1Fee: %2 XMR\n").arg(body, QString::number(fee)); + body = QString("%1Ringsize: %2").arg(body, QString::number(m_mixin + 1)); + + auto subaddrIndices = m_tx->subaddrIndices(); + for (int i = 0; i < subaddrIndices.count(); ++i){ + body = QString("%1\nSpending address index: %2").arg(body, QString::number(subaddrIndices.at(i).toInt())); + } + + QMessageBox::information(this, "Transaction information", body); +} + +TxConfDialog::~TxConfDialog() { + delete ui; +} diff --git a/src/dialog/txconfdialog.h b/src/dialog/txconfdialog.h new file mode 100644 index 0000000..7a2b02a --- /dev/null +++ b/src/dialog/txconfdialog.h @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_TXCONFDIALOG_H +#define FEATHER_TXCONFDIALOG_H + +#include +#include "libwalletqt/PendingTransaction.h" +#include "libwalletqt/WalletManager.h" + +namespace Ui { + class TxConfDialog; +} + +class TxConfDialog : public QDialog +{ +Q_OBJECT + +public: + explicit TxConfDialog(PendingTransaction *tx, const QString &address, const QString &description, int mixin, QWidget *parent = nullptr); + ~TxConfDialog() override; + +private: + void showAdvanced(); + + Ui::TxConfDialog *ui; + PendingTransaction *m_tx; + QString m_address; + QString m_description; + int m_mixin; +}; + +#endif //FEATHER_TXCONFDIALOG_H diff --git a/src/dialog/txconfdialog.ui b/src/dialog/txconfdialog.ui new file mode 100644 index 0000000..1269b12 --- /dev/null +++ b/src/dialog/txconfdialog.ui @@ -0,0 +1,175 @@ + + + TxConfDialog + + + + 0 + 0 + 655 + 232 + + + + Confirm transaction + + + + 15 + + + + + warning + + + + + + + + + 15 + + + 7 + + + + + Address: + + + + + + + address + + + + + + + Amount: + + + + + + + amount + + + + + + + Fee: + + + + + + + fee + + + + + + + Qt::Horizontal + + + + + + + Total: + + + + + + + total + + + + + + + + + + + + + Advanced + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + TxConfDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + TxConfDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/dialog/verifyproofdialog.cpp b/src/dialog/verifyproofdialog.cpp new file mode 100644 index 0000000..291b977 --- /dev/null +++ b/src/dialog/verifyproofdialog.cpp @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "verifyproofdialog.h" +#include "ui_verifyproofdialog.h" + +#include "utils/utils.h" +#include "libwalletqt/WalletManager.h" + +#include + +VerifyProofDialog::VerifyProofDialog(Wallet *wallet, QWidget *parent) + : QDialog(parent) + , m_wallet(wallet) + , ui(new Ui::VerifyProofDialog) +{ + ui->setupUi(this); + + connect(ui->btn_verifySpendProof, &QPushButton::clicked, this, &VerifyProofDialog::checkSpendProof); + connect(ui->btn_verifyOutProof, &QPushButton::clicked, this, &VerifyProofDialog::checkOutProof); + connect(ui->btn_verifyInProof, &QPushButton::clicked, this, &VerifyProofDialog::checkInProof); + + connect(ui->btn_spendClear, &QPushButton::clicked, [this](){ + ui->lineEdit_spendTxID->clear(); + ui->lineEdit_spendMessage->clear(); + ui->input_SpendProof->clear(); + }); + connect(ui->btn_outClear, &QPushButton::clicked, [this](){ + ui->lineEdit_outTxID->clear(); + ui->lineEdit_outAddress->clear(); + ui->lineEdit_outMessage->clear(); + ui->input_OutProof->clear(); + }); + connect(ui->btn_inClear, &QPushButton::clicked, [this](){ + ui->lineEdit_inTxID->clear(); + ui->lineEdit_inAddress->clear(); + ui->lineEdit_inMessage->clear(); + ui->input_InProof->clear(); + }); +} + +VerifyProofDialog::~VerifyProofDialog() +{ + delete ui; +} + +void VerifyProofDialog::checkSpendProof() { + auto r = m_wallet->checkSpendProof(ui->lineEdit_spendTxID->text(), ui->lineEdit_spendMessage->text(), ui->input_SpendProof->toPlainText()); + + if (!r.first) { + QMessageBox::information(this, "Information", m_wallet->errorString()); + return; + } + + r.second ? QMessageBox::information(this, "Information", "Proof is valid") + : QMessageBox::warning(this, "Warning", "Proof is invalid"); +} + +void VerifyProofDialog::checkOutProof() { + this->checkTxProof(ui->lineEdit_outTxID->text(), ui->lineEdit_outAddress->text(), ui->lineEdit_outMessage->text(), ui->input_OutProof->toPlainText()); +} + +void VerifyProofDialog::checkInProof() { + this->checkTxProof(ui->lineEdit_inTxID->text(), ui->lineEdit_inAddress->text(), ui->lineEdit_inMessage->text(), ui->input_InProof->toPlainText()); +} + +void VerifyProofDialog::checkTxProof(const QString &txId, const QString &address, const QString &message, + const QString &signature) { + TxProofResult r = m_wallet->checkTxProof(txId, address, message, signature); + + if (!r.success) { + QMessageBox::information(this, "Information", m_wallet->errorString()); + return; + } + + if (!r.good) { + QMessageBox::warning(this, "Warning", "Proof is invalid"); + return; + } + + QString msg = QString("This address received %1 monero, with %2 confirmation(s)").arg(WalletManager::displayAmount(r.received), QString::number(r.confirmations)); + QMessageBox::information(this, "Information", QString("Proof is valid.\n\n%1").arg(msg)); +} \ No newline at end of file diff --git a/src/dialog/verifyproofdialog.h b/src/dialog/verifyproofdialog.h new file mode 100644 index 0000000..28b22a7 --- /dev/null +++ b/src/dialog/verifyproofdialog.h @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_VERIFYPROOFDIALOG_H +#define FEATHER_VERIFYPROOFDIALOG_H + +#include +#include "libwalletqt/Wallet.h" + +namespace Ui { + class VerifyProofDialog; +} + +class VerifyProofDialog : public QDialog +{ +Q_OBJECT + +public: + explicit VerifyProofDialog(Wallet *wallet, QWidget *parent = nullptr); + ~VerifyProofDialog() override; + +private slots: + void checkSpendProof(); + void checkOutProof(); + void checkInProof(); + +private: + void checkTxProof(const QString &txId, const QString &address, const QString &message, const QString &signature); + + Ui::VerifyProofDialog *ui; + Wallet *m_wallet; +}; + +#endif //FEATHER_VERIFYPROOFDIALOG_H diff --git a/src/dialog/verifyproofdialog.ui b/src/dialog/verifyproofdialog.ui new file mode 100644 index 0000000..6ff55bf --- /dev/null +++ b/src/dialog/verifyproofdialog.ui @@ -0,0 +1,373 @@ + + + VerifyProofDialog + + + + 0 + 0 + 1123 + 413 + + + + Verify transaction proof + + + + + + Select proof to verify: + + + + + + + 2 + + + + SpendProof + + + + + + A SpendProof proves authorship of a transaction. + + + + + + + + + Transaction ID: + + + + + + + + + + Message: + + + + + + + SpendProof: + + + + + + + Optional message against which the signature is signed + + + + + + + false + + + SpendProof.. + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Clear + + + + + + + Verify + + + + + + + + + + OutProof + + + + + + An OutProof shows the prover sent an output to an address. + + + + + + + + + OutProof: + + + + + + + + + + Address: + + + + + + + + + + Address of recipient + + + + + + + Transaction ID: + + + + + + + Message: + + + + + + + Optional message against which the signature is signed + + + + + + + OutProof.. + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Clear + + + + + + + Verify + + + + + + + + + + InProof + + + + + + An InProof proves ownership of an output. + + + + + + + + + InProof: + + + + + + + Transaction ID: + + + + + + + Address: + + + + + + + Output owner's address + + + + + + + Transaction that created the output + + + + + + + Message: + + + + + + + Optional message against which the signature is signed + + + + + + + InProof.. + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Clear + + + + + + + Verify + + + + + + + + + + + + + + diff --git a/src/dialog/walletinfodialog.cpp b/src/dialog/walletinfodialog.cpp new file mode 100644 index 0000000..9996c9f --- /dev/null +++ b/src/dialog/walletinfodialog.cpp @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "walletinfodialog.h" +#include "ui_walletinfodialog.h" + +#include + +WalletInfoDialog::WalletInfoDialog(AppContext *ctx, QWidget *parent) + : QDialog(parent) + , ui(new Ui::WalletInfoDialog) + , m_ctx(ctx) +{ + ui->setupUi(this); + + QFileInfo keys(ctx->walletPath); + QFileInfo cache(ctx->currentWallet->path()); + + ui->label_walletName->setText(keys.fileName().replace(".keys", "")); + ui->label_netType->setText(Utils::QtEnumToString(ctx->currentWallet->nettype())); + ui->label_seedType->setText(ctx->currentWallet->getCacheAttribute("feather.seed").isEmpty() ? "25 word" : "14 word"); + ui->label_viewOnly->setText(ctx->currentWallet->viewOnly() ? "True" : "False"); + ui->label_path->setText(ctx->walletPath); + ui->label_cacheSize->setText(QString("%1 MB").arg(QString::number(cache.size() / 1e6, 'f', 2))); + + connect(ui->btn_openWalletDir, &QPushButton::clicked, this, &WalletInfoDialog::openWalletDir); + + this->adjustSize(); +} + +void WalletInfoDialog::openWalletDir() { + QFileInfo file(m_ctx->walletPath); + + QDesktopServices::openUrl(file.absolutePath()); +} + +WalletInfoDialog::~WalletInfoDialog() { + delete ui; +} diff --git a/src/dialog/walletinfodialog.h b/src/dialog/walletinfodialog.h new file mode 100644 index 0000000..b30b7c7 --- /dev/null +++ b/src/dialog/walletinfodialog.h @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_WALLETINFODIALOG_H +#define FEATHER_WALLETINFODIALOG_H + +#include + +#include "appcontext.h" + +namespace Ui { + class WalletInfoDialog; +} + +class WalletInfoDialog : public QDialog +{ +Q_OBJECT + +public: + explicit WalletInfoDialog(AppContext *ctx, QWidget *parent = nullptr); + ~WalletInfoDialog() override; + +private: + void openWalletDir(); + + Ui::WalletInfoDialog *ui; + AppContext *m_ctx; +}; + +#endif //FEATHER_WALLETINFODIALOG_H diff --git a/src/dialog/walletinfodialog.ui b/src/dialog/walletinfodialog.ui new file mode 100644 index 0000000..8b1f0d5 --- /dev/null +++ b/src/dialog/walletinfodialog.ui @@ -0,0 +1,181 @@ + + + WalletInfoDialog + + + + 0 + 0 + 701 + 252 + + + + Wallet Information + + + + + + + + Wallet name: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Network type: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Seed type: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + View only: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Path: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Cache size: + + + + + + + TextLabel + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + + + Open wallet directory + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + WalletInfoDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + WalletInfoDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/dialog/xmrtoinfodialog.cpp b/src/dialog/xmrtoinfodialog.cpp new file mode 100644 index 0000000..0400a96 --- /dev/null +++ b/src/dialog/xmrtoinfodialog.cpp @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "xmrtoinfodialog.h" +#include "ui_xmrtoinfodialog.h" + +#include + +XmrToInfoDialog::XmrToInfoDialog(XmrToOrder *oInfo, QWidget *parent) + : QDialog(parent) + , ui(new Ui::XmrToInfoDialog) + , m_oInfo(oInfo) +{ + ui->setupUi(this); + + ui->status->setText(XmrTo::stateMap[(OrderState) oInfo->state]); + ui->xmrto_id->setText(!oInfo->uuid.isEmpty() ? oInfo->uuid : ""); + + ui->error_code->setText(!oInfo->errorCode.isEmpty() ? oInfo->errorCode : ""); + ui->error_msg->setText(!oInfo->errorMsg.isEmpty() ? oInfo->errorMsg : ""); + + ui->xmr_amount->setText(QString::number(oInfo->incoming_amount_total)); + ui->btc_amount->setText(QString::number(oInfo->btc_amount)); + ui->rate->setText(oInfo->incoming_price_btc > 0 ? QString::number(oInfo->incoming_price_btc) : ""); + + ui->xmr_txid->setText(oInfo->xmr_txid); + ui->xmr_address->setText(oInfo->receiving_subaddress); + + ui->btc_txid->setText(oInfo->btc_txid); + ui->btc_address->setText(oInfo->btc_dest_address); + + this->adjustSize(); +} + +XmrToInfoDialog::~XmrToInfoDialog() { + delete ui; +} diff --git a/src/dialog/xmrtoinfodialog.h b/src/dialog/xmrtoinfodialog.h new file mode 100644 index 0000000..03fd3c5 --- /dev/null +++ b/src/dialog/xmrtoinfodialog.h @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_XMRTOINFODIALOG_H +#define FEATHER_XMRTOINFODIALOG_H + +#include +#include "utils/xmrto.h" + +namespace Ui { + class XmrToInfoDialog; +} + +class XmrToInfoDialog : public QDialog +{ +Q_OBJECT + +public: + explicit XmrToInfoDialog(XmrToOrder *oInfo, QWidget *parent = nullptr); + ~XmrToInfoDialog() override; + +private: + Ui::XmrToInfoDialog *ui; + + XmrToOrder *m_oInfo; +}; + +#endif //FEATHER_XMRTOINFODIALOG_H diff --git a/src/dialog/xmrtoinfodialog.ui b/src/dialog/xmrtoinfodialog.ui new file mode 100644 index 0000000..cb38077 --- /dev/null +++ b/src/dialog/xmrtoinfodialog.ui @@ -0,0 +1,256 @@ + + + XmrToInfoDialog + + + + 0 + 0 + 689 + 581 + + + + Xmr.to Order + + + + + + + + + + Status: + + + + + + + XMR.to ID: + + + + + + + Error code: + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + + + Qt::Vertical + + + + + + + + + XMR amount: + + + + + + + BTC amount: + + + + + + + Rate: + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + + + + + + + Message: + + + + + + + true + + + + + + + Qt::Horizontal + + + + + + + XMR.to address: + + + + + + + true + + + + + + + XMR txid: + + + + + + + true + + + + + + + Qt::Horizontal + + + + + + + BTC address: + + + + + + + true + + + + + + + BTC txid: + + + + + + + true + + + + + + + + + Qt::Horizontal + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Copy support template + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + diff --git a/src/historywidget.cpp b/src/historywidget.cpp new file mode 100644 index 0000000..48c5334 --- /dev/null +++ b/src/historywidget.cpp @@ -0,0 +1,116 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "historywidget.h" +#include "ui_historywidget.h" +#include "dialog/transactioninfodialog.h" +#include "libwalletqt/TransactionHistory.h" +#include "model/TransactionHistoryProxyModel.h" + +#include + +HistoryWidget::HistoryWidget(QWidget *parent) + : QWidget(parent) + , ui(new Ui::HistoryWidget) + , m_contextMenu(new QMenu(this)) + , m_copyMenu(new QMenu("Copy", this)) +{ + ui->setupUi(this); + m_contextMenu->addMenu(m_copyMenu); + m_contextMenu->addAction(QIcon(":/assets/images/info.png"), "Show details", this, &HistoryWidget::showTxDetails); + m_contextMenu->addAction(QIcon(":/assets/images/network.png"), "View on block explorer", this, &HistoryWidget::onViewOnBlockExplorer); + + // copy menu + m_copyMenu->setIcon(QIcon(":/assets/images/copy.png")); + m_copyMenu->addAction("Transaction ID", this, [this]{copy(copyField::TxID);}); + m_copyMenu->addAction("Date", this, [this]{copy(copyField::Date);}); + m_copyMenu->addAction("Amount", this, [this]{copy(copyField::Amount);}); + m_copyMenu->addAction("Spend proof", this, &HistoryWidget::getSpendProof); + + ui->history->setContextMenuPolicy(Qt::CustomContextMenu); + connect(ui->history, &QTreeView::customContextMenuRequested, [=](const QPoint & point){ + QModelIndex index = ui->history->indexAt(point); + if (index.isValid()) { + m_contextMenu->exec(ui->history->viewport()->mapToGlobal(point)); + } + }); + connect(ui->search, &QLineEdit::textChanged, this, &HistoryWidget::setSearchFilter); +} + +void HistoryWidget::setModel(Coins *coins, TransactionHistoryProxyModel *model, TransactionHistory *txHistory) +{ + m_coins = coins; + m_model = model; + m_txHistory = txHistory; + ui->history->setModel(m_model); + + ui->history->header()->setSectionResizeMode(QHeaderView::ResizeToContents); + ui->history->header()->setSectionResizeMode(TransactionHistoryModel::Description, QHeaderView::Stretch); + ui->history->hideColumn(TransactionHistoryModel::TxID); +} + +void HistoryWidget::showTxDetails() { + QModelIndex index = ui->history->currentIndex(); + + TransactionInfo *i = nullptr; + m_txHistory->transaction(m_model->mapToSource(index).row(), [&i](TransactionInfo &tInfo) { + i = &tInfo; + }); + + if (i != nullptr) { + auto * dialog = new TransactionInfoDialog(m_coins, i, this); + dialog->exec(); + } +} + +void HistoryWidget::onViewOnBlockExplorer() { + QModelIndex index = ui->history->currentIndex(); + + QString txid; + m_txHistory->transaction(m_model->mapToSource(index).row(), [&txid](TransactionInfo &tInfo) { + txid = tInfo.hash(); + }); + emit viewOnBlockExplorer(txid); +} + +void HistoryWidget::getSpendProof() { + QModelIndex index = ui->history->currentIndex(); + + m_txHistory->transaction(m_model->mapToSource(index).row(), [this](TransactionInfo &tInfo) { + emit spendProof(tInfo.hash()); + }); +} + +void HistoryWidget::setSearchText(const QString &text) { + ui->search->setText(text); +} + +void HistoryWidget::setSearchFilter(const QString &filter) { + if(!m_model) return; + m_model->setSearchFilter(filter); +} + +void HistoryWidget::copy(copyField field) { + QModelIndex index = ui->history->currentIndex(); + + QString data; + m_txHistory->transaction(m_model->mapToSource(index).row(), [field, &data](TransactionInfo &tInfo) { + switch(field) { + case copyField::TxID: + data = tInfo.hash(); + break; + case copyField::Date: + data = tInfo.timestamp().toString("yyyy-MM-dd HH:mm"); + break; + case copyField::Amount: + data = tInfo.displayAmount(); + break; + } + }); + + Utils::copyToClipboard(data); +} + +HistoryWidget::~HistoryWidget() { + delete ui; +} diff --git a/src/historywidget.h b/src/historywidget.h new file mode 100644 index 0000000..ffd1200 --- /dev/null +++ b/src/historywidget.h @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_HISTORYWIDGET_H +#define FEATHER_HISTORYWIDGET_H + +#include "model/TransactionHistoryModel.h" +#include "model/TransactionHistoryProxyModel.h" +#include "libwalletqt/Coins.h" + +#include +#include + +namespace Ui { + class HistoryWidget; +} + +class HistoryWidget : public QWidget +{ +Q_OBJECT + +public: + explicit HistoryWidget(QWidget *parent = nullptr); + void setModel(Coins * coins, TransactionHistoryProxyModel * model, TransactionHistory * txHistory); + ~HistoryWidget() override; + +public slots: + void setSearchText(const QString &text); + +signals: + void spendProof(QString txid); + void viewOnBlockExplorer(QString txid); + +private slots: + void showTxDetails(); + void onViewOnBlockExplorer(); + void getSpendProof(); + void setSearchFilter(const QString &filter); + +private: + enum copyField { + TxID = 0, + Date, + Amount + }; + + void copy(copyField field); + + Ui::HistoryWidget *ui; + QMenu *m_contextMenu; + QMenu *m_copyMenu; + TransactionHistory *m_txHistory; + TransactionHistoryProxyModel *m_model; + Coins *m_coins; +}; + +#endif //FEATHER_HISTORYWIDGET_H diff --git a/src/historywidget.ui b/src/historywidget.ui new file mode 100644 index 0000000..c333a69 --- /dev/null +++ b/src/historywidget.ui @@ -0,0 +1,53 @@ + + + HistoryWidget + + + + 0 + 0 + 959 + 507 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Search txid, description.. + + + + + + + false + + + true + + + false + + + + + + + + diff --git a/src/libwalletqt/AddressBook.cpp b/src/libwalletqt/AddressBook.cpp new file mode 100644 index 0000000..decfa3a --- /dev/null +++ b/src/libwalletqt/AddressBook.cpp @@ -0,0 +1,137 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#include "AddressBook.h" +#include "AddressBookInfo.h" +#include + +AddressBook::AddressBook(Monero::AddressBook *abImpl,QObject *parent) + : QObject(parent), m_addressBookImpl(abImpl) +{ + getAll(); +} + +QString AddressBook::errorString() const +{ + return QString::fromStdString(m_addressBookImpl->errorString()); +} + +int AddressBook::errorCode() const +{ + return m_addressBookImpl->errorCode(); +} + +void AddressBook::getAll() +{ + emit refreshStarted(); + + { + QWriteLocker locker(&m_lock); + + qDeleteAll(m_rows); + + m_addresses.clear(); + m_rows.clear(); + + for (auto &abr: m_addressBookImpl->getAll()) { + m_addresses.insert(QString::fromStdString(abr->getAddress()), m_rows.size()); + + m_rows.append(new AddressBookInfo(abr, this)); + } + } + + emit refreshFinished(); +} + +bool AddressBook::getRow(int index, std::function callback) const +{ + QReadLocker locker(&m_lock); + + if (index < 0 || index >= m_rows.size()) + { + return false; + } + + callback(*m_rows.value(index)); + return true; +} + +bool AddressBook::addRow(const QString &address, const QString &payment_id, const QString &description) +{ + // virtual bool addRow(const std::string &dst_addr , const std::string &payment_id, const std::string &description) = 0; + bool result; + + { + QWriteLocker locker(&m_lock); + + result = m_addressBookImpl->addRow(address.toStdString(), payment_id.toStdString(), description.toStdString()); + } + + if (result) + { + getAll(); + } + + return result; +} + +void AddressBook::setDescription(int index, const QString &description) { + bool result; + + { + QWriteLocker locker(&m_lock); + + result = m_addressBookImpl->setDescription(index, description.toStdString()); + } + + if (result) + { + getAll(); + emit descriptionChanged(); + } +} + +bool AddressBook::deleteRow(int rowId) +{ + bool result; + + { + QWriteLocker locker(&m_lock); + + result = m_addressBookImpl->deleteRow(rowId); + } + + // Fetch new data from wallet2. + if (result) + { + getAll(); + } + + return result; +} + +quint64 AddressBook::count() const +{ + QReadLocker locker(&m_lock); + + return m_rows.size(); +} + +int AddressBook::lookupPaymentID(const QString &payment_id) const +{ + QReadLocker locker(&m_lock); + + return m_addressBookImpl->lookupPaymentID(payment_id.toStdString()); +} + +QString AddressBook::getDescription(const QString &address) const +{ + QReadLocker locker(&m_lock); + + const QMap::const_iterator it = m_addresses.find(address); + if (it == m_addresses.end()) + { + return {}; + } + return m_rows.value(*it)->description(); +} diff --git a/src/libwalletqt/AddressBook.h b/src/libwalletqt/AddressBook.h new file mode 100644 index 0000000..6c8fefd --- /dev/null +++ b/src/libwalletqt/AddressBook.h @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef ADDRESSBOOK_H +#define ADDRESSBOOK_H + +#include +#include "AddressBookInfo.h" +#include +#include +#include +#include +#include + +namespace Monero { +struct AddressBook; +} +class AddressBookRow; + +class AddressBook : public QObject +{ + Q_OBJECT +public: + Q_INVOKABLE bool getRow(int index, std::function callback) const; + Q_INVOKABLE bool addRow(const QString &address, const QString &payment_id, const QString &description); + Q_INVOKABLE bool deleteRow(int rowId); + Q_INVOKABLE void setDescription(int index, const QString &label); + quint64 count() const; + Q_INVOKABLE QString errorString() const; + Q_INVOKABLE int errorCode() const; + Q_INVOKABLE int lookupPaymentID(const QString &payment_id) const; + Q_INVOKABLE QString getDescription(const QString &address) const; + + enum ErrorCode { + Status_Ok, + General_Error, + Invalid_Address, + Invalid_Payment_Id + }; + + Q_ENUM(ErrorCode); + +private: + void getAll(); + +signals: + void refreshStarted() const; + void refreshFinished() const; + void descriptionChanged() const; + + +public slots: + +private: + explicit AddressBook(Monero::AddressBook * abImpl, QObject *parent); + friend class Wallet; + Monero::AddressBook * m_addressBookImpl; + mutable QReadWriteLock m_lock; + QList m_rows; + QMap m_addresses; +}; + +#endif // ADDRESSBOOK_H diff --git a/src/libwalletqt/AddressBookInfo.cpp b/src/libwalletqt/AddressBookInfo.cpp new file mode 100644 index 0000000..c6e33ec --- /dev/null +++ b/src/libwalletqt/AddressBookInfo.cpp @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#include "AddressBookInfo.h" + +QString AddressBookInfo::address() const { + return m_address; +} + +QString AddressBookInfo::description() const { + return m_description; +} + +AddressBookInfo::AddressBookInfo(const Monero::AddressBookRow *pimpl, QObject *parent) + : QObject(parent) + , m_address(QString::fromStdString(pimpl->getAddress())) + , m_description(QString::fromStdString(pimpl->getDescription())) +{ + +} diff --git a/src/libwalletqt/AddressBookInfo.h b/src/libwalletqt/AddressBookInfo.h new file mode 100644 index 0000000..af9c609 --- /dev/null +++ b/src/libwalletqt/AddressBookInfo.h @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef FEATHER_ADDRESSBOOKINFO_H +#define FEATHER_ADDRESSBOOKINFO_H + +#include +#include + +class AddressBookInfo : public QObject { + Q_OBJECT + Q_PROPERTY(QString address READ address); + Q_PROPERTY(QString description READ description); + +public: + QString address() const; + QString description() const; + +private: + explicit AddressBookInfo(const Monero::AddressBookRow *pimpl, QObject *parent = nullptr); + + friend class AddressBook; + QString m_address; + QString m_description; +}; + + +#endif //FEATHER_ADDRESSBOOKINFO_H diff --git a/src/libwalletqt/CMakeLists.txt b/src/libwalletqt/CMakeLists.txt new file mode 100644 index 0000000..7d16b0f --- /dev/null +++ b/src/libwalletqt/CMakeLists.txt @@ -0,0 +1,2 @@ +file(GLOB_RECURSE SRC_SOURCES *.cpp) +file(GLOB_RECURSE SRC_HEADERS *.h) diff --git a/src/libwalletqt/Coins.cpp b/src/libwalletqt/Coins.cpp new file mode 100644 index 0000000..4c1a9e5 --- /dev/null +++ b/src/libwalletqt/Coins.cpp @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "Coins.h" + +#include + +#include "Coins.h" +#include "CoinsInfo.h" +#include + +#include +#include +#include +#include +#include + + +bool Coins::coin(int index, std::function callback) +{ + QReadLocker locker(&m_lock); + + if (index < 0 || index >= m_tinfo.size()) { + qCritical("%s: no transaction info for index %d", __FUNCTION__, index); + qCritical("%s: there's %d transactions in backend", __FUNCTION__, m_pimpl->count()); + return false; + } + + callback(*m_tinfo.value(index)); + return true; +} + +void Coins::refresh(quint32 accountIndex) +{ + emit refreshStarted(); + + { + QWriteLocker locker(&m_lock); + + qDeleteAll(m_tinfo); + m_tinfo.clear(); + + m_pimpl->refresh(); + for (const auto i : m_pimpl->getAll()) { + if (i->subaddrAccount() != accountIndex) { + continue; + } + + m_tinfo.append(new CoinsInfo(i, this)); + } + } + + emit refreshFinished(); +} + +void Coins::refreshUnlocked() +{ + QWriteLocker locker(&m_lock); + + for (CoinsInfo* c : m_tinfo) { + if (!c->unlocked()) { + bool unlocked = m_pimpl->isTransferUnlocked(c->unlockTime(), c->blockHeight()); + c->setUnlocked(unlocked); + } + } +} + +quint64 Coins::count() const +{ + QReadLocker locker(&m_lock); + + return m_tinfo.count(); +} + +void Coins::freeze(int index) const +{ + m_pimpl->setFrozen(index); + emit coinFrozen(); +} + +void Coins::thaw(int index) const +{ + m_pimpl->thaw(index); + emit coinThawed(); +} + +QStringList Coins::coins_from_txid(const QString &txid) +{ + QStringList keyimages; + + for (int i = 0; i < this->count(); i++) { + this->coin(i, [&keyimages, &txid](const CoinsInfo &x) { + if (x.hash() == txid) { + keyimages += x.keyImage(); + } + }); + } + return keyimages; +} + +Coins::Coins(Monero::Coins *pimpl, QObject *parent) + : QObject(parent) + , m_pimpl(pimpl) +{ + +} \ No newline at end of file diff --git a/src/libwalletqt/Coins.h b/src/libwalletqt/Coins.h new file mode 100644 index 0000000..66a0166 --- /dev/null +++ b/src/libwalletqt/Coins.h @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_COINS_H +#define FEATHER_COINS_H + +#include + +#include +#include +#include +#include +#include + +namespace Monero { + struct TransactionHistory; +} + +class CoinsInfo; + +class Coins : public QObject +{ +Q_OBJECT + Q_PROPERTY(int count READ count) + +public: + Q_INVOKABLE bool coin(int index, std::function callback); + Q_INVOKABLE void refresh(quint32 accountIndex); + Q_INVOKABLE void refreshUnlocked(); + Q_INVOKABLE void freeze(int index) const; + Q_INVOKABLE void thaw(int index) const; + Q_INVOKABLE QStringList coins_from_txid(const QString &txid); // Todo: return CoinsInfo vector + + quint64 count() const; + +signals: + void refreshStarted() const; + void refreshFinished() const; + void coinFrozen() const; + void coinThawed() const; + +private: + explicit Coins(Monero::Coins * pimpl, QObject *parent = nullptr); + +private: + friend class Wallet; + mutable QReadWriteLock m_lock; + Monero::Coins * m_pimpl; + mutable QList m_tinfo; +}; + +#endif //FEATHER_COINS_H diff --git a/src/libwalletqt/CoinsInfo.cpp b/src/libwalletqt/CoinsInfo.cpp new file mode 100644 index 0000000..01a0ae8 --- /dev/null +++ b/src/libwalletqt/CoinsInfo.cpp @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "CoinsInfo.h" +#include "libwalletqt/WalletManager.h" +#include "Transfer.h" +#include +#include + +quint64 CoinsInfo::blockHeight() const +{ + return m_blockHeight; +} + +QString CoinsInfo::hash() const +{ + return m_hash; +} + +quint64 CoinsInfo::internalOutputIndex() const +{ + return m_internalOutputIndex; +} + +quint64 CoinsInfo::globalOutputIndex() const +{ + return m_globalOutputIndex; +} + +bool CoinsInfo::spent() const +{ + return m_spent; +} + +bool CoinsInfo::frozen() const +{ + return m_frozen; +} + +quint64 CoinsInfo::spentHeight() const +{ + return m_spentHeight; +} + +quint64 CoinsInfo::amount() const { + return m_amount; +} + +QString CoinsInfo::displayAmount() const +{ + return WalletManager::displayAmount(m_amount); +} + +bool CoinsInfo::rct() const { + return m_rct; +} + +bool CoinsInfo::keyImageKnown() const { + return m_keyImageKnown; +} + +quint64 CoinsInfo::pkIndex() const { + return m_pkIndex; +} + +quint32 CoinsInfo::subaddrIndex() const { + return m_subaddrIndex; +} + +quint32 CoinsInfo::subaddrAccount() const { + return m_subaddrAccount; +} + +QString CoinsInfo::address() const { + return m_address; +} + +QString CoinsInfo::addressLabel() const { + return m_addressLabel; +} + +QString CoinsInfo::keyImage() const { + return m_keyImage; +} + +quint64 CoinsInfo::unlockTime() const { + return m_unlockTime; +} + +bool CoinsInfo::unlocked() const { + return m_unlocked; +} + +void CoinsInfo::setUnlocked(bool unlocked) { + m_unlocked = unlocked; +} + +QString CoinsInfo::pubKey() const { + return m_pubKey; +} + +bool CoinsInfo::coinbase() const { + return m_coinbase; +} + +CoinsInfo::CoinsInfo(const Monero::CoinsInfo *pimpl, QObject *parent) + : QObject(parent) + , m_blockHeight(pimpl->blockHeight()) + , m_hash(QString::fromStdString(pimpl->hash())) + , m_internalOutputIndex(pimpl->internalOutputIndex()) + , m_globalOutputIndex(pimpl->globalOutputIndex()) + , m_spent(pimpl->spent()) + , m_frozen(pimpl->frozen()) + , m_spentHeight(pimpl->spentHeight()) + , m_amount(pimpl->amount()) + , m_rct(pimpl->rct()) + , m_keyImageKnown(pimpl->keyImageKnown()) + , m_pkIndex(pimpl->pkIndex()) + , m_subaddrIndex(pimpl->subaddrIndex()) + , m_subaddrAccount(pimpl->subaddrAccount()) + , m_address(QString::fromStdString(pimpl->address())) + , m_addressLabel(QString::fromStdString(pimpl->addressLabel())) + , m_keyImage(QString::fromStdString(pimpl->keyImage())) + , m_unlockTime(pimpl->unlockTime()) + , m_unlocked(pimpl->unlocked()) + , m_pubKey(QString::fromStdString(pimpl->pubKey())) + , m_coinbase(pimpl->coinbase()) +{ + +} diff --git a/src/libwalletqt/CoinsInfo.h b/src/libwalletqt/CoinsInfo.h new file mode 100644 index 0000000..4739ea9 --- /dev/null +++ b/src/libwalletqt/CoinsInfo.h @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_COINSINFO_H +#define FEATHER_COINSINFO_H + +#include +#include +#include +#include + +class Coins; + +class CoinsInfo : public QObject +{ +Q_OBJECT + Q_PROPERTY(quint64 blockHeight READ blockHeight) + Q_PROPERTY(QString hash READ hash) + Q_PROPERTY(quint64 internalOutputIndex READ internalOutputIndex) + Q_PROPERTY(quint64 globalOutputIndex READ globalOutputIndex) + Q_PROPERTY(bool spent READ spent) + Q_PROPERTY(bool frozen READ frozen) + Q_PROPERTY(quint64 spentHeight READ spentHeight) + Q_PROPERTY(quint64 amount READ amount) + Q_PROPERTY(QString displayAmount READ displayAmount) + Q_PROPERTY(bool rct READ rct) + Q_PROPERTY(bool keyImageKnown READ keyImageKnown) + Q_PROPERTY(quint64 pkIndex READ pkIndex) + Q_PROPERTY(quint32 subaddrIndex READ subaddrIndex) + Q_PROPERTY(quint32 subaddrAccount READ subaddrAccount) + Q_PROPERTY(QString address READ address) + Q_PROPERTY(QString addressLabel READ addressLabel) + Q_PROPERTY(QString keyImage READ keyImage) + Q_PROPERTY(quint64 unlockTime READ unlockTime) + Q_PROPERTY(bool unlocked READ unlocked) + Q_PROPERTY(QString pubKey READ pubKey) + Q_PROPERTY(bool coinbase READ coinbase) + +public: + quint64 blockHeight() const; + QString hash() const; + quint64 internalOutputIndex() const; + quint64 globalOutputIndex() const; + bool spent() const; + bool frozen() const; + quint64 spentHeight() const; + quint64 amount() const; + QString displayAmount() const; + bool rct() const; + bool keyImageKnown() const; + quint64 pkIndex() const; + quint32 subaddrIndex() const; + quint32 subaddrAccount() const; + QString address() const; + QString addressLabel() const; + QString keyImage() const; + quint64 unlockTime() const; + bool unlocked() const; + QString pubKey() const; + bool coinbase() const; + + void setUnlocked(bool unlocked); + +private: + explicit CoinsInfo(const Monero::CoinsInfo *pimpl, QObject *parent = nullptr); +private: + friend class Coins; + + quint64 m_blockHeight; + QString m_hash; + quint64 m_internalOutputIndex; + quint64 m_globalOutputIndex; + bool m_spent; + bool m_frozen; + quint64 m_spentHeight; + quint64 m_amount; + bool m_rct; + bool m_keyImageKnown; + quint64 m_pkIndex; + quint32 m_subaddrIndex; + quint32 m_subaddrAccount; + QString m_address; + QString m_addressLabel; + QString m_keyImage; + quint64 m_unlockTime; + bool m_unlocked; + QString m_pubKey; + bool m_coinbase; +}; + +#endif //FEATHER_COINSINFO_H diff --git a/src/libwalletqt/PassphraseHelper.cpp b/src/libwalletqt/PassphraseHelper.cpp new file mode 100644 index 0000000..f4cea92 --- /dev/null +++ b/src/libwalletqt/PassphraseHelper.cpp @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#include "PassphraseHelper.h" +#include +#include + +Monero::optional PassphraseHelper::onDevicePassphraseRequest(bool & on_device) +{ + qDebug() << __FUNCTION__; + QMutexLocker locker(&m_mutex_pass); + m_passphrase_on_device = true; + m_passphrase_abort = false; + + if (m_prompter != nullptr){ + m_prompter->onWalletPassphraseNeeded(on_device); + } + + m_cond_pass.wait(&m_mutex_pass); + + if (m_passphrase_abort) + { + throw std::runtime_error("Passphrase entry abort"); + } + + on_device = m_passphrase_on_device; + if (!on_device) { + auto tmpPass = m_passphrase.toStdString(); + m_passphrase = QString(); + return Monero::optional(tmpPass); + } else { + return Monero::optional(); + } +} + +void PassphraseHelper::onPassphraseEntered(const QString &passphrase, bool enter_on_device, bool entry_abort) +{ + qDebug() << __FUNCTION__; + QMutexLocker locker(&m_mutex_pass); + m_passphrase = passphrase; + m_passphrase_abort = entry_abort; + m_passphrase_on_device = enter_on_device; + + m_cond_pass.wakeAll(); +} diff --git a/src/libwalletqt/PassphraseHelper.h b/src/libwalletqt/PassphraseHelper.h new file mode 100644 index 0000000..2cd1c8c --- /dev/null +++ b/src/libwalletqt/PassphraseHelper.h @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef MONERO_GUI_PASSPHRASEHELPER_H +#define MONERO_GUI_PASSPHRASEHELPER_H + +#include +#include +#include +#include +#include +#include + +/** + * Implements component responsible for showing entry prompt to the user, + * typically Wallet / Wallet manager. + */ +class PassprasePrompter { +public: + virtual void onWalletPassphraseNeeded(bool onDevice) = 0; +}; + +/** + * Implements receiver of the passphrase responsible for passing it back to the wallet, + * typically wallet listener. + */ +class PassphraseReceiver { +public: + virtual void onPassphraseEntered(const QString &passphrase, bool enter_on_device, bool entry_abort) = 0; +}; + +class PassphraseHelper { +public: + PassphraseHelper(PassprasePrompter * prompter=nullptr): m_prompter(prompter) {}; + PassphraseHelper(const PassphraseHelper & h): PassphraseHelper(h.m_prompter) {}; + Monero::optional onDevicePassphraseRequest(bool & on_device); + void onPassphraseEntered(const QString &passphrase, bool enter_on_device, bool entry_abort); + +private: + PassprasePrompter * m_prompter; + QWaitCondition m_cond_pass; + QMutex m_mutex_pass; + QString m_passphrase; + bool m_passphrase_abort; + bool m_passphrase_on_device; + +}; + +#endif //MONERO_GUI_PASSPHRASEHELPER_H diff --git a/src/libwalletqt/PendingTransaction.cpp b/src/libwalletqt/PendingTransaction.cpp new file mode 100644 index 0000000..7c9aeb5 --- /dev/null +++ b/src/libwalletqt/PendingTransaction.cpp @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#include "PendingTransaction.h" + + +PendingTransaction::Status PendingTransaction::status() const +{ + return static_cast(m_pimpl->status()); +} + +QString PendingTransaction::errorString() const +{ + return QString::fromStdString(m_pimpl->errorString()); +} + +bool PendingTransaction::commit() +{ + // Save transaction to file if fileName is set. + if(!m_fileName.isEmpty()) + return m_pimpl->commit(m_fileName.toStdString()); + return m_pimpl->commit(m_fileName.toStdString()); +} + +quint64 PendingTransaction::amount() const +{ + return m_pimpl->amount(); +} + +quint64 PendingTransaction::dust() const +{ + return m_pimpl->dust(); +} + +quint64 PendingTransaction::fee() const +{ + return m_pimpl->fee(); +} + + +QStringList PendingTransaction::txid() const +{ + QStringList list; + std::vector txid = m_pimpl->txid(); + for (const auto &t: txid) + list.append(QString::fromStdString(t)); + return list; +} + + +quint64 PendingTransaction::txCount() const +{ + return m_pimpl->txCount(); +} + +QList PendingTransaction::subaddrIndices() const +{ + std::vector> subaddrIndices = m_pimpl->subaddrIndices(); + QList result; + for (const auto& x : subaddrIndices) + for (uint32_t i : x) + result.push_back(i); + return result; +} + +void PendingTransaction::setFilename(const QString &fileName) +{ + m_fileName = fileName; +} + +PendingTransaction::PendingTransaction(Monero::PendingTransaction *pt, QObject *parent) + : QObject(parent), m_pimpl(pt) +{ + +} diff --git a/src/libwalletqt/PendingTransaction.h b/src/libwalletqt/PendingTransaction.h new file mode 100644 index 0000000..5b60bab --- /dev/null +++ b/src/libwalletqt/PendingTransaction.h @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef PENDINGTRANSACTION_H +#define PENDINGTRANSACTION_H + +#include +#include +#include + +#include + +//namespace Monero { +//class PendingTransaction; +//} + +class PendingTransaction : public QObject +{ + Q_OBJECT + Q_PROPERTY(Status status READ status) + Q_PROPERTY(QString errorString READ errorString) + Q_PROPERTY(quint64 amount READ amount) + Q_PROPERTY(quint64 dust READ dust) + Q_PROPERTY(quint64 fee READ fee) + Q_PROPERTY(QStringList txid READ txid) + Q_PROPERTY(quint64 txCount READ txCount) + Q_PROPERTY(QList subaddrIndices READ subaddrIndices) + +public: + enum Status { + Status_Ok = Monero::PendingTransaction::Status_Ok, + Status_Error = Monero::PendingTransaction::Status_Error, + Status_Critical = Monero::PendingTransaction::Status_Critical + }; + Q_ENUM(Status) + + enum Priority { + Priority_Low = Monero::PendingTransaction::Priority_Low, + Priority_Medium = Monero::PendingTransaction::Priority_Medium, + Priority_High = Monero::PendingTransaction::Priority_High + }; + Q_ENUM(Priority) + + + Status status() const; + QString errorString() const; + Q_INVOKABLE bool commit(); + quint64 amount() const; + quint64 dust() const; + quint64 fee() const; + QStringList txid() const; + quint64 txCount() const; + QList subaddrIndices() const; + Q_INVOKABLE void setFilename(const QString &fileName); + +private: + explicit PendingTransaction(Monero::PendingTransaction * pt, QObject *parent = 0); + +private: + friend class Wallet; + Monero::PendingTransaction * m_pimpl; + QString m_fileName; +}; + +#endif // PENDINGTRANSACTION_H diff --git a/src/libwalletqt/Ring.h b/src/libwalletqt/Ring.h new file mode 100644 index 0000000..95fc34e --- /dev/null +++ b/src/libwalletqt/Ring.h @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_RINGS_H +#define FEATHER_RINGS_H + +#include +#include +#include +#include + +class Ring : public QObject +{ +Q_OBJECT + Q_PROPERTY(QString keyImage READ keyImage) + Q_PROPERTY(std::vector ringMembers READ ringMembers) +private: + explicit Ring(QString _keyImage, std::vector _ringMembers, QObject *parent = nullptr): QObject(parent), m_keyImage(std::move(_keyImage)), m_ringMembers(std::move(_ringMembers)) {}; +private: + friend class TransactionInfo; + QString m_keyImage; + std::vector m_ringMembers; +public: + QString keyImage() const { return m_keyImage; } + std::vector ringMembers() const { return m_ringMembers; } +}; + +#endif //FEATHER_RINGS_H diff --git a/src/libwalletqt/Subaddress.cpp b/src/libwalletqt/Subaddress.cpp new file mode 100644 index 0000000..d046676 --- /dev/null +++ b/src/libwalletqt/Subaddress.cpp @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#include "Subaddress.h" +#include + +Subaddress::Subaddress(Monero::Subaddress *subaddressImpl, QObject *parent) + : QObject(parent), m_subaddressImpl(subaddressImpl), m_unusedLookahead(0) +{ + getAll(); +} + +void Subaddress::getAll() const +{ + emit refreshStarted(); + + { + QWriteLocker locker(&m_lock); + + m_unusedLookahead = 0; + + m_rows.clear(); + for (auto &row: m_subaddressImpl->getAll()) { + m_rows.append(row); + + if (row->isUsed()) + m_unusedLookahead = 0; + else + m_unusedLookahead += 1; + } + } + + emit refreshFinished(); +} + +bool Subaddress::getRow(int index, std::function callback) const +{ + QReadLocker locker(&m_lock); + + if (index < 0 || index >= m_rows.size()) + { + return false; + } + + callback(*m_rows.value(index)); + return true; +} + +void Subaddress::addRow(quint32 accountIndex, const QString &label) const +{ + m_subaddressImpl->addRow(accountIndex, label.toStdString()); + getAll(); +} + +void Subaddress::setLabel(quint32 accountIndex, quint32 addressIndex, const QString &label) const +{ + m_subaddressImpl->setLabel(accountIndex, addressIndex, label.toStdString()); + getAll(); + emit labelChanged(); +} + +void Subaddress::refresh(quint32 accountIndex) const +{ + m_subaddressImpl->refresh(accountIndex); + getAll(); +} + +quint64 Subaddress::unusedLookahead() const +{ + QReadLocker locker(&m_lock); + + return m_unusedLookahead; +} + +quint64 Subaddress::count() const +{ + QReadLocker locker(&m_lock); + + return m_rows.size(); +} diff --git a/src/libwalletqt/Subaddress.h b/src/libwalletqt/Subaddress.h new file mode 100644 index 0000000..ec86bc2 --- /dev/null +++ b/src/libwalletqt/Subaddress.h @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef SUBADDRESS_H +#define SUBADDRESS_H + +#include + +#include +#include +#include +#include +#include + +class Subaddress : public QObject +{ + Q_OBJECT +public: + Q_INVOKABLE void getAll() const; + Q_INVOKABLE bool getRow(int index, std::function callback) const; + Q_INVOKABLE void addRow(quint32 accountIndex, const QString &label) const; + Q_INVOKABLE void setLabel(quint32 accountIndex, quint32 addressIndex, const QString &label) const; + Q_INVOKABLE void refresh(quint32 accountIndex) const; + Q_INVOKABLE quint64 unusedLookahead() const; + quint64 count() const; + +signals: + void refreshStarted() const; + void refreshFinished() const; + void labelChanged() const; + +public slots: + +private: + explicit Subaddress(Monero::Subaddress * subaddressImpl, QObject *parent); + friend class Wallet; + mutable QReadWriteLock m_lock; + Monero::Subaddress * m_subaddressImpl; + mutable QList m_rows; + mutable quint64 m_unusedLookahead; +}; + +#endif // SUBADDRESS_H diff --git a/src/libwalletqt/SubaddressAccount.cpp b/src/libwalletqt/SubaddressAccount.cpp new file mode 100644 index 0000000..82e19d2 --- /dev/null +++ b/src/libwalletqt/SubaddressAccount.cpp @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#include "SubaddressAccount.h" +#include + +SubaddressAccount::SubaddressAccount(Monero::SubaddressAccount *subaddressAccountImpl, QObject *parent) + : QObject(parent), m_subaddressAccountImpl(subaddressAccountImpl) +{ + getAll(); +} + +void SubaddressAccount::getAll() const +{ + emit refreshStarted(); + + { + QWriteLocker locker(&m_lock); + m_rows.clear(); + for (auto &row: m_subaddressAccountImpl->getAll()) { + m_rows.append(row); + } + } + + emit refreshFinished(); +} + +bool SubaddressAccount::getRow(int index, std::function callback) const +{ + QReadLocker locker(&m_lock); + + if (index < 0 || index >= m_rows.size()) + { + return false; + } + + callback(*m_rows.value(index)); + return true; +} + +void SubaddressAccount::addRow(const QString &label) const +{ + m_subaddressAccountImpl->addRow(label.toStdString()); + getAll(); +} + +void SubaddressAccount::setLabel(quint32 accountIndex, const QString &label) const +{ + m_subaddressAccountImpl->setLabel(accountIndex, label.toStdString()); + getAll(); +} + +void SubaddressAccount::refresh() const +{ + m_subaddressAccountImpl->refresh(); + getAll(); +} + +quint64 SubaddressAccount::count() const +{ + QReadLocker locker(&m_lock); + + return m_rows.size(); +} diff --git a/src/libwalletqt/SubaddressAccount.h b/src/libwalletqt/SubaddressAccount.h new file mode 100644 index 0000000..ca04afc --- /dev/null +++ b/src/libwalletqt/SubaddressAccount.h @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef SUBADDRESSACCOUNT_H +#define SUBADDRESSACCOUNT_H + +#include + +#include +#include +#include +#include +#include + +class SubaddressAccount : public QObject +{ + Q_OBJECT +public: + Q_INVOKABLE void getAll() const; + Q_INVOKABLE bool getRow(int index, std::function callback) const; + Q_INVOKABLE void addRow(const QString &label) const; + Q_INVOKABLE void setLabel(quint32 accountIndex, const QString &label) const; + Q_INVOKABLE void refresh() const; + quint64 count() const; + +signals: + void refreshStarted() const; + void refreshFinished() const; + +public slots: + +private: + explicit SubaddressAccount(Monero::SubaddressAccount * subaddressAccountImpl, QObject *parent); + friend class Wallet; + mutable QReadWriteLock m_lock; + Monero::SubaddressAccount * m_subaddressAccountImpl; + mutable QList m_rows; +}; + +#endif // SUBADDRESSACCOUNT_H diff --git a/src/libwalletqt/TransactionHistory.cpp b/src/libwalletqt/TransactionHistory.cpp new file mode 100644 index 0000000..38c086c --- /dev/null +++ b/src/libwalletqt/TransactionHistory.cpp @@ -0,0 +1,211 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#include "TransactionHistory.h" +#include "TransactionInfo.h" +#include "utils/utils.h" +#include "appcontext.h" +#include + +#include +#include +#include +#include +#include + + +bool TransactionHistory::transaction(int index, std::function callback) +{ + QReadLocker locker(&m_lock); + + if (index < 0 || index >= m_tinfo.size()) { + qCritical("%s: no transaction info for index %d", __FUNCTION__, index); + qCritical("%s: there's %d transactions in backend", __FUNCTION__, m_pimpl->count()); + return false; + } + + callback(*m_tinfo.value(index)); + return true; +} + +TransactionInfo* TransactionHistory::transaction(const QString &id) +{ + QReadLocker locker(&m_lock); + + auto itr = std::find_if(m_tinfo.begin(), m_tinfo.end(), + [&](const TransactionInfo * ti) { + return ti->hash() == id; + }); + return itr != m_tinfo.end() ? *itr : nullptr; +} + +void TransactionHistory::refresh(quint32 accountIndex) +{ +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + QDateTime firstDateTime = QDate(2014, 4, 18).startOfDay(); +#else + QDateTime firstDateTime = QDateTime(QDate(2014, 4, 18)); // the genesis block +#endif + QDateTime lastDateTime = QDateTime::currentDateTime().addDays(1); // tomorrow (guard against jitter and timezones) + + emit refreshStarted(); + + { + QWriteLocker locker(&m_lock); + + qDeleteAll(m_tinfo); + m_tinfo.clear(); + + quint64 lastTxHeight = 0; + m_locked = false; + m_minutesToUnlock = 0; + + m_pimpl->refresh(); + for (const auto i : m_pimpl->getAll()) { + if (i->subaddrAccount() != accountIndex) { + continue; + } + + m_tinfo.append(new TransactionInfo(i, this)); + + const TransactionInfo *ti = m_tinfo.back(); + // looking for transactions timestamp scope + if (ti->timestamp() >= lastDateTime) { + lastDateTime = ti->timestamp(); + } + if (ti->timestamp() <= firstDateTime) { + firstDateTime = ti->timestamp(); + } + quint64 requiredConfirmations = (ti->blockHeight() < ti->unlockTime()) ? ti->unlockTime() - ti->blockHeight() : 10; + // store last tx height + if (ti->confirmations() < requiredConfirmations && ti->blockHeight() >= lastTxHeight) { + lastTxHeight = ti->blockHeight(); + // TODO: Fetch block time and confirmations needed from wallet2? + m_minutesToUnlock = (requiredConfirmations - ti->confirmations()) * 2; + m_locked = true; + } + } + } + + emit refreshFinished(); + + if (m_firstDateTime != firstDateTime) { + m_firstDateTime = firstDateTime; + emit firstDateTimeChanged(); + } + if (m_lastDateTime != lastDateTime) { + m_lastDateTime = lastDateTime; + emit lastDateTimeChanged(); + } +} + +void TransactionHistory::setTxNote(const QString &txid, const QString ¬e) +{ + m_pimpl->setTxNote(txid.toStdString(), note.toStdString()); + this->refresh(0); // todo: get actual account index + emit txNoteChanged(); +} + +quint64 TransactionHistory::count() const +{ + QReadLocker locker(&m_lock); + + return m_tinfo.count(); +} + +QDateTime TransactionHistory::firstDateTime() const +{ + return m_firstDateTime; +} + +QDateTime TransactionHistory::lastDateTime() const +{ + return m_lastDateTime; +} + +quint64 TransactionHistory::minutesToUnlock() const +{ + return m_minutesToUnlock; +} + +bool TransactionHistory::TransactionHistory::locked() const +{ + return m_locked; +} + + +TransactionHistory::TransactionHistory(Monero::TransactionHistory *pimpl, QObject *parent) + : QObject(parent), m_pimpl(pimpl), m_minutesToUnlock(0), m_locked(false) +{ +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + m_firstDateTime = QDate(2014, 4, 18).startOfDay(); +#else + m_firstDateTime = QDateTime(QDate(2014, 4, 18)); // the genesis block +#endif + m_lastDateTime = QDateTime::currentDateTime().addDays(1); // tomorrow (guard against jitter and timezones) +} + +bool TransactionHistory::writeCSV(const QString &path) { + auto data = QString(""); + QReadLocker locker(&m_lock); + for (const auto &tx : m_pimpl->getAll()) { + if (tx->subaddrAccount() != 0) { // only account 0 + continue; + } + + TransactionInfo info(tx, this); + + // collect column data + QDateTime timeStamp = info.timestamp(); + double amount = info.amount(); + + // calc historical fiat price + QString fiatAmount; + QString preferredFiatSymbol = config()->get(Config::preferredFiatCurrency).toString(); + const double usd_price = AppContext::txFiatHistory->get(timeStamp.toString("yyyyMMdd")); + double fiat_price = usd_price * amount; + + if(preferredFiatSymbol != "USD") + fiat_price = AppContext::prices->convert("USD", preferredFiatSymbol, fiat_price); + double fiat_rounded = ceil(Utils::roundSignificant(fiat_price, 3) * 100.0) / 100.0; + if(fiat_price != 0) + fiatAmount = QString("%1 %2").arg(QString::number(fiat_rounded)).arg(preferredFiatSymbol); + + // collect some more column data + quint64 atomicAmount = info.atomicAmount(); + quint32 subaddrAccount = info.subaddrAccount(); + QString fee = info.fee(); + QString direction = QString(""); + TransactionInfo::Direction _direction = info.direction(); + if(_direction == TransactionInfo::Direction_In) + direction = QString("in"); + else if(_direction == TransactionInfo::Direction_Out) + direction = QString("out"); + else + continue; // skip TransactionInfo::Direction_Both + + QString label = info.label(); + label.remove(QChar('"')); // reserved + quint64 blockHeight = info.blockHeight(); + QString date = info.date() + " " + info.time(); + uint epoch = timeStamp.toTime_t(); + QString displayAmount = info.displayAmount(); + QString paymentId = info.paymentId(); + if(paymentId == "0000000000000000") + paymentId = ""; + + // format and write + QString line = QString("%1,%2,%3,%4,%5,\"%6\",%7,%8,%9,\"%10\",%11,%12\n") + .arg(QString::number(blockHeight), QString::number(epoch), date) + .arg(direction, QString::number(amount), fiatAmount, QString::number(atomicAmount)) + .arg(info.fee(), info.hash(), label, QString::number(subaddrAccount)) + .arg(paymentId); + data += line; + } + + if(data.isEmpty()) + return false; + + data = QString("blockHeight,epoch,date,direction,amount,fiat,atomicAmount,fee,txid,label,subaddrAccount,paymentId\n%1").arg(data); + return Utils::fileWrite(path, data); +} diff --git a/src/libwalletqt/TransactionHistory.h b/src/libwalletqt/TransactionHistory.h new file mode 100644 index 0000000..e37cf2b --- /dev/null +++ b/src/libwalletqt/TransactionHistory.h @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef TRANSACTIONHISTORY_H +#define TRANSACTIONHISTORY_H + +#include + +#include +#include +#include +#include + +namespace Monero { +struct TransactionHistory; +} + +class TransactionInfo; + +class TransactionHistory : public QObject +{ + Q_OBJECT + Q_PROPERTY(int count READ count) + Q_PROPERTY(QDateTime firstDateTime READ firstDateTime NOTIFY firstDateTimeChanged) + Q_PROPERTY(QDateTime lastDateTime READ lastDateTime NOTIFY lastDateTimeChanged) + Q_PROPERTY(int minutesToUnlock READ minutesToUnlock) + Q_PROPERTY(bool locked READ locked) + +public: + Q_INVOKABLE bool transaction(int index, std::function callback); + Q_INVOKABLE TransactionInfo * transaction(const QString &id); + Q_INVOKABLE void refresh(quint32 accountIndex); + Q_INVOKABLE void setTxNote(const QString &txid, const QString ¬e); + Q_INVOKABLE bool writeCSV(const QString &path); + quint64 count() const; + QDateTime firstDateTime() const; + QDateTime lastDateTime() const; + quint64 minutesToUnlock() const; + bool locked() const; + +signals: + void refreshStarted() const; + void refreshFinished() const; + void firstDateTimeChanged() const; + void lastDateTimeChanged() const; + void txNoteChanged() const; + +private: + explicit TransactionHistory(Monero::TransactionHistory * pimpl, QObject *parent = nullptr); + +private: + friend class Wallet; + mutable QReadWriteLock m_lock; + Monero::TransactionHistory * m_pimpl; + mutable QList m_tinfo; + mutable QDateTime m_firstDateTime; + mutable QDateTime m_lastDateTime; + mutable int m_minutesToUnlock; + // history contains locked transfers + mutable bool m_locked; + +}; + +#endif // TRANSACTIONHISTORY_H diff --git a/src/libwalletqt/TransactionInfo.cpp b/src/libwalletqt/TransactionInfo.cpp new file mode 100644 index 0000000..3352198 --- /dev/null +++ b/src/libwalletqt/TransactionInfo.cpp @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#include "TransactionInfo.h" +#include "libwalletqt/WalletManager.h" +#include "Transfer.h" +#include "Ring.h" +#include +#include + +TransactionInfo::Direction TransactionInfo::direction() const +{ + return m_direction; +} + +bool TransactionInfo::isPending() const +{ + return m_pending; +} + +bool TransactionInfo::isFailed() const +{ + return m_failed; +} + +bool TransactionInfo::isCoinbase() const +{ + return m_coinbase; +} + +double TransactionInfo::amount() const +{ + // there's no unsigned uint64 for JS, so better use double + return displayAmount().toDouble(); +} + +quint64 TransactionInfo::atomicAmount() const +{ + return m_amount; +} + +QString TransactionInfo::displayAmount() const +{ + return WalletManager::displayAmount(m_amount); +} + +QString TransactionInfo::fee() const +{ + if(m_fee == 0) + return ""; + return WalletManager::displayAmount(m_fee); +} + +quint64 TransactionInfo::blockHeight() const +{ + return m_blockHeight; +} + +QString TransactionInfo::description() const +{ + return m_description; +} + +QSet TransactionInfo::subaddrIndex() const +{ + return m_subaddrIndex; +} + +quint32 TransactionInfo::subaddrAccount() const +{ + return m_subaddrAccount; +} + +QString TransactionInfo::label() const +{ + return m_label; +} + +quint64 TransactionInfo::confirmations() const +{ + return m_confirmations; +} + +quint64 TransactionInfo::confirmationsRequired() const +{ + return (m_blockHeight < m_unlockTime) ? m_unlockTime - m_blockHeight : 10; +} + +quint64 TransactionInfo::unlockTime() const +{ + return m_unlockTime; +} + +QString TransactionInfo::hash() const +{ + return m_hash; +} + +QDateTime TransactionInfo::timestamp() const +{ + return m_timestamp; +} + +QString TransactionInfo::date() const +{ + return timestamp().date().toString(Qt::ISODate); +} + +QString TransactionInfo::time() const +{ + return timestamp().time().toString(Qt::ISODate); +} + +QString TransactionInfo::paymentId() const +{ + return m_paymentId; +} + +QString TransactionInfo::destinations_formatted() const +{ + QString destinations; + for (auto const& t: m_transfers) { + if (!destinations.isEmpty()) + destinations += "
        "; + destinations += WalletManager::displayAmount(t->amount()) + ": " + t->address(); + } + return destinations; +} + +QString TransactionInfo::rings_formatted() const +{ + QString rings; + for (auto const& r: m_rings) { + rings += r->keyImage() + ": \n"; + for (uint64_t m : r->ringMembers()){ + rings += QString::number(m) + " "; + } + rings += "\n\n"; + } + return rings; +} + +TransactionInfo::TransactionInfo(const Monero::TransactionInfo *pimpl, QObject *parent) + : QObject(parent) + , m_amount(pimpl->amount()) + , m_blockHeight(pimpl->blockHeight()) + , m_description(QString::fromStdString(pimpl->description())) + , m_confirmations(pimpl->confirmations()) + , m_direction(static_cast(pimpl->direction())) + , m_failed(pimpl->isFailed()) + , m_fee(pimpl->fee()) + , m_hash(QString::fromStdString(pimpl->hash())) + , m_label(QString::fromStdString(pimpl->label())) + , m_paymentId(QString::fromStdString(pimpl->paymentId())) + , m_pending(pimpl->isPending()) + , m_subaddrAccount(pimpl->subaddrAccount()) + , m_timestamp(QDateTime::fromSecsSinceEpoch(pimpl->timestamp())) + , m_unlockTime(pimpl->unlockTime()) + , m_coinbase(pimpl->isCoinbase()) +{ + for (auto const &t: pimpl->transfers()) + { + Transfer *transfer = new Transfer(t.amount, QString::fromStdString(t.address), this); + m_transfers.append(transfer); + } + for (auto const &r: pimpl->rings()) + { + Ring *ring = new Ring(QString::fromStdString(r.first), r.second, this); + m_rings.append(ring); + } + for (uint32_t i : pimpl->subaddrIndex()) + { + m_subaddrIndex.insert(i); + } +} diff --git a/src/libwalletqt/TransactionInfo.h b/src/libwalletqt/TransactionInfo.h new file mode 100644 index 0000000..98dece9 --- /dev/null +++ b/src/libwalletqt/TransactionInfo.h @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef TRANSACTIONINFO_H +#define TRANSACTIONINFO_H + +#include +#include +#include +#include + +class Transfer; +class Ring; + +class TransactionInfo : public QObject +{ + Q_OBJECT + Q_PROPERTY(Direction direction READ direction) + Q_PROPERTY(bool isPending READ isPending) + Q_PROPERTY(bool isFailed READ isFailed) + Q_PROPERTY(bool isCoinbase READ isCoinbase) + Q_PROPERTY(double amount READ amount) + Q_PROPERTY(quint64 atomicAmount READ atomicAmount) + Q_PROPERTY(QString displayAmount READ displayAmount) + Q_PROPERTY(QString fee READ fee) + Q_PROPERTY(quint64 blockHeight READ blockHeight) + Q_PROPERTY(QString description READ description) + Q_PROPERTY(QSet subaddrIndex READ subaddrIndex) + Q_PROPERTY(quint32 subaddrAccount READ subaddrAccount) + Q_PROPERTY(QString label READ label) + Q_PROPERTY(quint64 confirmations READ confirmations) + Q_PROPERTY(quint64 confirmationsRequired READ confirmationsRequired) + Q_PROPERTY(quint64 unlockTime READ unlockTime) + Q_PROPERTY(QString hash READ hash) + Q_PROPERTY(QDateTime timestamp READ timestamp) + Q_PROPERTY(QString date READ date) + Q_PROPERTY(QString time READ time) + Q_PROPERTY(QString paymentId READ paymentId) + Q_PROPERTY(QString destinations_formatted READ destinations_formatted) + Q_PROPERTY(QString rings_formatted READ rings_formatted) + +public: + enum Direction { + Direction_In = Monero::TransactionInfo::Direction_In, + Direction_Out = Monero::TransactionInfo::Direction_Out, + Direction_Both // invalid direction value, used for filtering + }; + + Q_ENUM(Direction) + + Direction direction() const; + bool isPending() const; + bool isFailed() const; + bool isCoinbase() const; + double amount() const; + quint64 atomicAmount() const; + QString displayAmount() const; + QString fee() const; + quint64 blockHeight() const; + QString description() const; + QSet subaddrIndex() const; + quint32 subaddrAccount() const; + QString label() const; + quint64 confirmations() const; + quint64 confirmationsRequired() const; + quint64 unlockTime() const; + //! transaction_id + QString hash() const; + QDateTime timestamp() const; + QString date() const; + QString time() const; + QString paymentId() const; + //! only applicable for output transactions + //! used in tx details popup + QString destinations_formatted() const; + QString rings_formatted() const; + +private: + explicit TransactionInfo(const Monero::TransactionInfo *pimpl, QObject *parent = nullptr); +private: + friend class TransactionHistory; + mutable QList m_transfers; + mutable QList m_rings; + quint64 m_amount; + quint64 m_blockHeight; + QString m_description; + quint64 m_confirmations; + quint64 m_confirmationsRequired; + Direction m_direction; + bool m_failed; + quint64 m_fee; + QString m_hash; + QString m_label; + QString m_paymentId; + bool m_pending; + quint32 m_subaddrAccount; + QSet m_subaddrIndex; + QDateTime m_timestamp; + quint64 m_unlockTime; + bool m_coinbase; +}; + +#endif // TRANSACTIONINFO_H diff --git a/src/libwalletqt/Transfer.h b/src/libwalletqt/Transfer.h new file mode 100644 index 0000000..3f81d0c --- /dev/null +++ b/src/libwalletqt/Transfer.h @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef TRANSFER_H +#define TRANSFER_H + +#include +#include +#include + +class Transfer : public QObject +{ + Q_OBJECT + Q_PROPERTY(quint64 amount READ amount) + Q_PROPERTY(QString address READ address) +private: + explicit Transfer(uint64_t _amount, QString _address, QObject *parent = 0): QObject(parent), m_amount(_amount), m_address(std::move(_address)) {}; +private: + friend class TransactionInfo; + quint64 m_amount; + QString m_address; +public: + quint64 amount() const { return m_amount; } + QString address() const { return m_address; } + +}; + +#endif // TRANSACTIONINFO_H diff --git a/src/libwalletqt/UnsignedTransaction.cpp b/src/libwalletqt/UnsignedTransaction.cpp new file mode 100644 index 0000000..7cbe9b4 --- /dev/null +++ b/src/libwalletqt/UnsignedTransaction.cpp @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#include "UnsignedTransaction.h" +#include +#include + +UnsignedTransaction::Status UnsignedTransaction::status() const +{ + return static_cast(m_pimpl->status()); +} + +QString UnsignedTransaction::errorString() const +{ + return QString::fromStdString(m_pimpl->errorString()); +} + +quint64 UnsignedTransaction::amount(size_t index) const +{ + std::vector arr = m_pimpl->amount(); + if(index > arr.size() - 1) + return 0; + return arr[index]; +} + +quint64 UnsignedTransaction::fee(size_t index) const +{ + std::vector arr = m_pimpl->fee(); + if(index > arr.size() - 1) + return 0; + return arr[index]; +} + +quint64 UnsignedTransaction::mixin(size_t index) const +{ + std::vector arr = m_pimpl->mixin(); + if(index > arr.size() - 1) + return 0; + return arr[index]; +} + +quint64 UnsignedTransaction::txCount() const +{ + return m_pimpl->txCount(); +} + +quint64 UnsignedTransaction::minMixinCount() const +{ + return m_pimpl->minMixinCount(); +} + +QString UnsignedTransaction::confirmationMessage() const +{ + return QString::fromStdString(m_pimpl->confirmationMessage()); +} + +QStringList UnsignedTransaction::paymentId() const +{ + QList list; + for (const auto &t: m_pimpl->paymentId()) + list.append(QString::fromStdString(t)); + return list; +} + +QStringList UnsignedTransaction::recipientAddress() const +{ + QList list; + for (const auto &t: m_pimpl->recipientAddress()) + list.append(QString::fromStdString(t)); + return list; +} + +bool UnsignedTransaction::sign(const QString &fileName) const +{ + if(!m_pimpl->sign(fileName.toStdString())) + return false; + // export key images + return m_walletImpl->exportKeyImages(fileName.toStdString() + "_keyImages"); +} + +void UnsignedTransaction::setFilename(const QString &fileName) +{ + m_fileName = fileName; +} + +UnsignedTransaction::UnsignedTransaction(Monero::UnsignedTransaction *pt, Monero::Wallet *walletImpl, QObject *parent) + : QObject(parent), m_pimpl(pt), m_walletImpl(walletImpl) +{ + +} + +UnsignedTransaction::~UnsignedTransaction() +{ + delete m_pimpl; +} diff --git a/src/libwalletqt/UnsignedTransaction.h b/src/libwalletqt/UnsignedTransaction.h new file mode 100644 index 0000000..c0906bf --- /dev/null +++ b/src/libwalletqt/UnsignedTransaction.h @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef UNSIGNEDTRANSACTION_H +#define UNSIGNEDTRANSACTION_H + +#include + +#include + +class UnsignedTransaction : public QObject +{ + Q_OBJECT + Q_PROPERTY(Status status READ status) + Q_PROPERTY(QString errorString READ errorString) + // Q_PROPERTY(QList amount READ amount) + // Q_PROPERTY(QList fee READ fee) + Q_PROPERTY(quint64 txCount READ txCount) + Q_PROPERTY(QString confirmationMessage READ confirmationMessage) + Q_PROPERTY(QStringList recipientAddress READ recipientAddress) + Q_PROPERTY(QStringList paymentId READ paymentId) + Q_PROPERTY(quint64 minMixinCount READ minMixinCount) + +public: + enum Status { + Status_Ok = Monero::UnsignedTransaction::Status_Ok, + Status_Error = Monero::UnsignedTransaction::Status_Error, + Status_Critical = Monero::UnsignedTransaction::Status_Critical + }; + Q_ENUM(Status) + + Status status() const; + QString errorString() const; + Q_INVOKABLE quint64 amount(size_t index) const; + Q_INVOKABLE quint64 fee(size_t index) const; + Q_INVOKABLE quint64 mixin(size_t index) const; + QStringList recipientAddress() const; + QStringList paymentId() const; + quint64 txCount() const; + QString confirmationMessage() const; + quint64 minMixinCount() const; + Q_INVOKABLE bool sign(const QString &fileName) const; + Q_INVOKABLE void setFilename(const QString &fileName); + +private: + explicit UnsignedTransaction(Monero::UnsignedTransaction * pt, Monero::Wallet *walletImpl, QObject *parent = 0); + ~UnsignedTransaction(); +private: + friend class Wallet; + Monero::UnsignedTransaction * m_pimpl; + QString m_fileName; + Monero::Wallet * m_walletImpl; +}; + +#endif // UNSIGNEDTRANSACTION_H diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp new file mode 100644 index 0000000..51d4d58 --- /dev/null +++ b/src/libwalletqt/Wallet.cpp @@ -0,0 +1,1074 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#include "Wallet.h" +#include "PendingTransaction.h" +#include "UnsignedTransaction.h" +#include "TransactionHistory.h" +#include "AddressBook.h" +#include "Subaddress.h" +#include "SubaddressAccount.h" +#include "Coins.h" +#include "model/TransactionHistoryModel.h" +#include "model/TransactionHistoryProxyModel.h" +#include "model/AddressBookModel.h" +#include "model/SubaddressModel.h" +#include "model/SubaddressAccountModel.h" +#include "model/CoinsModel.h" +#include "wallet/api/wallet2_api.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + static const int DAEMON_BLOCKCHAIN_HEIGHT_CACHE_TTL_SECONDS = 5; + static const int DAEMON_BLOCKCHAIN_TARGET_HEIGHT_CACHE_TTL_SECONDS = 30; + static const int WALLET_CONNECTION_STATUS_CACHE_TTL_SECONDS = 5; + + static constexpr char ATTRIBUTE_SUBADDRESS_ACCOUNT[] ="gui.subaddress_account"; +} + +Wallet::Wallet(QObject * parent) + : Wallet(nullptr, parent) +{ +} + +QString Wallet::getSeed() const +{ + return QString::fromStdString(m_walletImpl->seed()); +} + +QString Wallet::getSeedLanguage() const +{ + return QString::fromStdString(m_walletImpl->getSeedLanguage()); +} + +void Wallet::setSeedLanguage(const QString &lang) +{ + m_walletImpl->setSeedLanguage(lang.toStdString()); +} + +Wallet::Status Wallet::status() const +{ + return static_cast(m_walletImpl->status()); +} + +NetworkType::Type Wallet::nettype() const +{ + return static_cast(m_walletImpl->nettype()); +} + + +void Wallet::updateConnectionStatusAsync() +{ + m_scheduler.run([this] { + if (m_connectionStatus == Wallet::ConnectionStatus_Disconnected) + { + setConnectionStatus(ConnectionStatus_Connecting); + } + ConnectionStatus newStatus = static_cast(m_walletImpl->connected()); + if (newStatus != m_connectionStatus || !m_initialized) { + m_initialized = true; + setConnectionStatus(newStatus); + } + // Release lock + m_connectionStatusRunning = false; + }); +} + +Wallet::ConnectionStatus Wallet::connected(bool forceCheck) +{ + // cache connection status + if (forceCheck || !m_initialized || (m_connectionStatusTime.elapsed() / 1000 > m_connectionStatusTtl && !m_connectionStatusRunning) || m_connectionStatusTime.elapsed() > 30000) { + m_connectionStatusRunning = true; + m_connectionStatusTime.restart(); + updateConnectionStatusAsync(); + } + + return m_connectionStatus; +} + +bool Wallet::disconnected() const +{ + return m_disconnected; +} + +void Wallet::setConnectionStatus(ConnectionStatus value) +{ + if (m_connectionStatus == value) + { + return; + } + + m_connectionStatus = value; + emit connectionStatusChanged(m_connectionStatus); + + bool disconnected = m_connectionStatus == Wallet::ConnectionStatus_Connecting || + m_connectionStatus == Wallet::ConnectionStatus_Disconnected; + + if (m_disconnected != disconnected) + { + m_disconnected = disconnected; + emit disconnectedChanged(); + } +} + +bool Wallet::synchronized() const +{ + return m_walletImpl->synchronized(); +} + +QString Wallet::errorString() const +{ + return QString::fromStdString(m_walletImpl->errorString()); +} + +bool Wallet::setPassword(const QString &password) +{ + return m_walletImpl->setPassword(password.toStdString()); +} + +QString Wallet::address(quint32 accountIndex, quint32 addressIndex) const +{ + return QString::fromStdString(m_walletImpl->address(accountIndex, addressIndex)); +} + +QString Wallet::path() const +{ + return QDir::toNativeSeparators(QString::fromStdString(m_walletImpl->path())); +} + + + +//void Wallet::storeAsync(const QVariant &callback, const QString &path /* = "" */) +//{ +// const auto future = m_scheduler.run( +// [this, path] { +// QMutexLocker locker(&m_storeMutex); + +// return QVariantList({m_walletImpl->store(path.toStdString())}); +// }, +// callback); +// if (!future.first) +// { +// QVariant(callback).call(QVariantList({false})); +// } +//} + +void Wallet::store(const QString &path) +{ + m_walletImpl->store(path.toStdString()); +} + +bool Wallet::init(const QString &daemonAddress, bool trustedDaemon, quint64 upperTransactionLimit, bool isRecovering, bool isRecoveringFromDevice, quint64 restoreHeight) +{ + qDebug() << "init non async"; + if (isRecovering){ + qDebug() << "RESTORING"; + m_walletImpl->setRecoveringFromSeed(true); + } + if (isRecoveringFromDevice){ + qDebug() << "RESTORING FROM DEVICE"; + m_walletImpl->setRecoveringFromDevice(true); + } + if (isRecovering || isRecoveringFromDevice) { + m_walletImpl->setRefreshFromBlockHeight(restoreHeight); + } + m_walletImpl->init(daemonAddress.toStdString(), upperTransactionLimit, m_daemonUsername.toStdString(), m_daemonPassword.toStdString()); + setTrustedDaemon(trustedDaemon); + return true; +} + +void Wallet::setDaemonLogin(const QString &daemonUsername, const QString &daemonPassword) +{ + // store daemon login + m_daemonUsername = daemonUsername; + m_daemonPassword = daemonPassword; +} + +void Wallet::initAsync(const QString &daemonAddress, bool trustedDaemon, quint64 upperTransactionLimit, bool isRecovering, bool isRecoveringFromDevice, quint64 restoreHeight) +{ + qDebug() << "initAsync: " + daemonAddress; + const auto future = m_scheduler.run([this, daemonAddress, trustedDaemon, upperTransactionLimit, isRecovering, isRecoveringFromDevice, restoreHeight] { + bool success = init(daemonAddress, trustedDaemon, upperTransactionLimit, isRecovering, isRecoveringFromDevice, restoreHeight); + if (success) + { + emit walletCreationHeightChanged(); + qDebug() << "init async finished - starting refresh"; + connected(true); + m_walletImpl->startRefresh(); + } + }); + if (future.first) + { + setConnectionStatus(Wallet::ConnectionStatus_Connecting); + } +} + +bool Wallet::isHwBacked() const +{ + return m_walletImpl->getDeviceType() != Monero::Wallet::Device_Software; +} + +bool Wallet::isLedger() const +{ + return m_walletImpl->getDeviceType() == Monero::Wallet::Device_Ledger; +} + +bool Wallet::isTrezor() const +{ + return m_walletImpl->getDeviceType() == Monero::Wallet::Device_Trezor; +} + +//! create a view only wallet +bool Wallet::createViewOnly(const QString &path, const QString &password) const +{ + // Create path + QDir d = QFileInfo(path).absoluteDir(); + d.mkpath(d.absolutePath()); + return m_walletImpl->createWatchOnly(path.toStdString(),password.toStdString(),m_walletImpl->getSeedLanguage()); +} + +bool Wallet::connectToDaemon() +{ + return m_walletImpl->connectToDaemon(); +} + +void Wallet::setTrustedDaemon(bool arg) +{ + m_walletImpl->setTrustedDaemon(arg); +} + +bool Wallet::viewOnly() const +{ + return m_walletImpl->watchOnly(); +} + +quint64 Wallet::balance() const +{ + return balance(m_currentSubaddressAccount); +} + +quint64 Wallet::balance(quint32 accountIndex) const +{ + return m_walletImpl->balance(accountIndex); +} + +quint64 Wallet::balanceAll() const +{ + return m_walletImpl->balanceAll(); +} + +quint64 Wallet::unlockedBalance() const +{ + return unlockedBalance(m_currentSubaddressAccount); +} + +quint64 Wallet::unlockedBalance(quint32 accountIndex) const +{ + return m_walletImpl->unlockedBalance(accountIndex); +} + +quint64 Wallet::unlockedBalanceAll() const +{ + return m_walletImpl->unlockedBalanceAll(); +} + +quint32 Wallet::currentSubaddressAccount() const +{ + return m_currentSubaddressAccount; +} +void Wallet::switchSubaddressAccount(quint32 accountIndex) +{ + if (accountIndex < numSubaddressAccounts()) + { + m_currentSubaddressAccount = accountIndex; + if (!setCacheAttribute(ATTRIBUTE_SUBADDRESS_ACCOUNT, QString::number(m_currentSubaddressAccount))) + { + qWarning() << "failed to set " << ATTRIBUTE_SUBADDRESS_ACCOUNT << " cache attribute"; + } + m_subaddress->refresh(m_currentSubaddressAccount); + m_history->refresh(m_currentSubaddressAccount); + emit currentSubaddressAccountChanged(); + } +} +void Wallet::addSubaddressAccount(const QString& label) +{ + m_walletImpl->addSubaddressAccount(label.toStdString()); + switchSubaddressAccount(numSubaddressAccounts() - 1); +} +quint32 Wallet::numSubaddressAccounts() const +{ + return m_walletImpl->numSubaddressAccounts(); +} +quint32 Wallet::numSubaddresses(quint32 accountIndex) const +{ + return m_walletImpl->numSubaddresses(accountIndex); +} +void Wallet::addSubaddress(const QString& label) +{ + m_walletImpl->addSubaddress(currentSubaddressAccount(), label.toStdString()); +} +QString Wallet::getSubaddressLabel(quint32 accountIndex, quint32 addressIndex) const +{ + return QString::fromStdString(m_walletImpl->getSubaddressLabel(accountIndex, addressIndex)); +} +void Wallet::setSubaddressLabel(quint32 accountIndex, quint32 addressIndex, const QString &label) +{ + m_walletImpl->setSubaddressLabel(accountIndex, addressIndex, label.toStdString()); + emit currentSubaddressAccountChanged(); +} +void Wallet::deviceShowAddressAsync(quint32 accountIndex, quint32 addressIndex, const QString &paymentId) +{ + m_scheduler.run([this, accountIndex, addressIndex, paymentId] { + m_walletImpl->deviceShowAddress(accountIndex, addressIndex, paymentId.toStdString()); + emit deviceShowAddressShowed(); + }); +} + +void Wallet::refreshHeightAsync() +{ + m_scheduler.run([this] { + quint64 daemonHeight; + QPair> daemonHeightFuture = m_scheduler.run([this, &daemonHeight] { + daemonHeight = daemonBlockChainHeight(); + }); + if (!daemonHeightFuture.first) + { + return; + } + + quint64 targetHeight; + QPair> targetHeightFuture = m_scheduler.run([this, &targetHeight] { + targetHeight = daemonBlockChainTargetHeight(); + }); + if (!targetHeightFuture.first) + { + return; + } + + quint64 walletHeight = blockChainHeight(); + daemonHeightFuture.second.waitForFinished(); + targetHeightFuture.second.waitForFinished(); + + emit heightRefreshed(walletHeight, daemonHeight, targetHeight); + }); +} + +quint64 Wallet::blockChainHeight() const +{ + return m_walletImpl->blockChainHeight(); +} + +quint64 Wallet::daemonBlockChainHeight() const +{ + // cache daemon blockchain height for some time (60 seconds by default) + + if (m_daemonBlockChainHeight == 0 + || m_daemonBlockChainHeightTime.elapsed() / 1000 > m_daemonBlockChainHeightTtl) { + m_daemonBlockChainHeight = m_walletImpl->daemonBlockChainHeight(); + m_daemonBlockChainHeightTime.restart(); + } + return m_daemonBlockChainHeight; +} + +quint64 Wallet::daemonBlockChainTargetHeight() const +{ + if (m_daemonBlockChainTargetHeight <= 1 + || m_daemonBlockChainTargetHeightTime.elapsed() / 1000 > m_daemonBlockChainTargetHeightTtl) { + m_daemonBlockChainTargetHeight = m_walletImpl->daemonBlockChainTargetHeight(); + + // Target height is set to 0 if daemon is synced. + // Use current height from daemon when target height < current height + if (m_daemonBlockChainTargetHeight < m_daemonBlockChainHeight){ + m_daemonBlockChainTargetHeight = m_daemonBlockChainHeight; + } + m_daemonBlockChainTargetHeightTime.restart(); + } + + return m_daemonBlockChainTargetHeight; +} + +bool Wallet::exportKeyImages(const QString& path) +{ + return m_walletImpl->exportKeyImages(path.toStdString()); +} + +bool Wallet::importKeyImages(const QString& path) +{ + return m_walletImpl->importKeyImages(path.toStdString()); +} + +bool Wallet::refresh() +{ + bool result = m_walletImpl->refresh(); + m_history->refresh(currentSubaddressAccount()); + m_subaddress->refresh(currentSubaddressAccount()); + m_coins->refresh(currentSubaddressAccount()); + m_subaddressAccount->getAll(); + if (result) + emit updated(); + return result; +} + +void Wallet::refreshAsync() +{ + qDebug() << "refresh async"; + m_walletImpl->refreshAsync(); +} + +void Wallet::setAutoRefreshInterval(int seconds) +{ + m_walletImpl->setAutoRefreshInterval(seconds); +} + +int Wallet::autoRefreshInterval() const +{ + return m_walletImpl->autoRefreshInterval(); +} + +void Wallet::startRefresh() const +{ + m_walletImpl->startRefresh(); +} + +void Wallet::pauseRefresh() const +{ + m_walletImpl->pauseRefresh(); +} + +PendingTransaction *Wallet::createTransaction(const QString &dst_addr, const QString &payment_id, + quint64 amount, quint32 mixin_count, + PendingTransaction::Priority priority) +{ + std::set subaddr_indices; + Monero::PendingTransaction * ptImpl = m_walletImpl->createTransaction( + dst_addr.toStdString(), payment_id.toStdString(), amount, mixin_count, + static_cast(priority), currentSubaddressAccount(), subaddr_indices); + PendingTransaction * result = new PendingTransaction(ptImpl,0); + return result; +} + +void Wallet::createTransactionAsync(const QString &dst_addr, const QString &payment_id, + quint64 amount, quint32 mixin_count, + PendingTransaction::Priority priority) +{ + m_scheduler.run([this, dst_addr, payment_id, amount, mixin_count, priority] { + PendingTransaction *tx = createTransaction(dst_addr, payment_id, amount, mixin_count, priority); + emit transactionCreated(tx, dst_addr, payment_id, mixin_count); + }); +} + +PendingTransaction *Wallet::createTransactionAll(const QString &dst_addr, const QString &payment_id, + quint32 mixin_count, PendingTransaction::Priority priority) +{ + std::set subaddr_indices; + Monero::PendingTransaction * ptImpl = m_walletImpl->createTransaction( + dst_addr.toStdString(), payment_id.toStdString(), Monero::optional(), mixin_count, + static_cast(priority), currentSubaddressAccount(), subaddr_indices); + PendingTransaction * result = new PendingTransaction(ptImpl, this); + return result; +} + +void Wallet::createTransactionAllAsync(const QString &dst_addr, const QString &payment_id, + quint32 mixin_count, + PendingTransaction::Priority priority) +{ + m_scheduler.run([this, dst_addr, payment_id, mixin_count, priority] { + PendingTransaction *tx = createTransactionAll(dst_addr, payment_id, mixin_count, priority); + emit transactionCreated(tx, dst_addr, payment_id, mixin_count); + }); +} + +PendingTransaction *Wallet::createTransactionSingle(const QString &key_image, const QString &dst_addr, const size_t outputs, + PendingTransaction::Priority priority) +{ + Monero::PendingTransaction * ptImpl = m_walletImpl->createTransactionSingle(key_image.toStdString(), dst_addr.toStdString(), + outputs, static_cast(priority)); + PendingTransaction * result = new PendingTransaction(ptImpl, this); + return result; +} + +void Wallet::createTransactionSingleAsync(const QString &key_image, const QString &dst_addr, const size_t outputs, + PendingTransaction::Priority priority) +{ + m_scheduler.run([this, key_image, dst_addr, outputs, priority] { + PendingTransaction *tx = createTransactionSingle(key_image, dst_addr, outputs, priority); + emit transactionCreated(tx, dst_addr, "", 0); // todo: return true mixincount + }); +} + +PendingTransaction *Wallet::createSweepUnmixableTransaction() +{ + Monero::PendingTransaction * ptImpl = m_walletImpl->createSweepUnmixableTransaction(); + PendingTransaction * result = new PendingTransaction(ptImpl, this); + return result; +} + +void Wallet::createSweepUnmixableTransactionAsync() +{ + m_scheduler.run([this] { + PendingTransaction *tx = createSweepUnmixableTransaction(); + emit transactionCreated(tx, "", "", 0); + }); +} + +UnsignedTransaction * Wallet::loadTxFile(const QString &fileName) +{ + qDebug() << "Trying to sign " << fileName; + Monero::UnsignedTransaction * ptImpl = m_walletImpl->loadUnsignedTx(fileName.toStdString()); + UnsignedTransaction * result = new UnsignedTransaction(ptImpl, m_walletImpl, this); + return result; +} + +bool Wallet::submitTxFile(const QString &fileName) const +{ + qDebug() << "Trying to submit " << fileName; + if (!m_walletImpl->submitTransaction(fileName.toStdString())) + return false; + // import key images + return m_walletImpl->importKeyImages(fileName.toStdString() + "_keyImages"); +} + +void Wallet::commitTransactionAsync(PendingTransaction *t) +{ + m_scheduler.run([this, t] { + auto txIdList = t->txid(); // retrieve before commit + emit transactionCommitted(t->commit(), t, txIdList); + }); +} + +void Wallet::disposeTransaction(PendingTransaction *t) +{ + m_walletImpl->disposeTransaction(t->m_pimpl); + delete t; +} + +void Wallet::disposeTransaction(UnsignedTransaction *t) +{ + delete t; +} + +// @ TODO: QJSValue could probably be QVARIANT +//void Wallet::estimateTransactionFeeAsync(const QString &destination, +// quint64 amount, +// PendingTransaction::Priority priority, +// const QJSValue &callback) +//{ +// m_scheduler.run([this, destination, amount, priority] { +// const uint64_t fee = m_walletImpl->estimateTransactionFee( +// {std::make_pair(destination.toStdString(), amount)}, +// static_cast(priority)); +// return QJSValueList({QString::fromStdString(Monero::Wallet::displayAmount(fee))}); +// }, callback); +//} + +TransactionHistory *Wallet::history() const +{ + return m_history; +} + +TransactionHistoryProxyModel *Wallet::historyModel() const +{ + if (!m_historyModel) { + Wallet * w = const_cast(this); + m_historyModel = new TransactionHistoryModel(w); + m_historyModel->setTransactionHistory(this->history()); + m_historySortFilterModel = new TransactionHistoryProxyModel(w); + m_historySortFilterModel->setSourceModel(m_historyModel); + m_historySortFilterModel->setSortRole(TransactionHistoryModel::Date); + m_historySortFilterModel->sort(0, Qt::DescendingOrder); + } + + return m_historySortFilterModel; +} + +TransactionHistoryModel *Wallet::transactionHistoryModel() const +{ + return m_historyModel; +} + +AddressBook *Wallet::addressBook() const +{ + return m_addressBook; +} + +AddressBookModel *Wallet::addressBookModel() const +{ + + if (!m_addressBookModel) { + Wallet * w = const_cast(this); + m_addressBookModel = new AddressBookModel(w,m_addressBook); + } + + return m_addressBookModel; +} + +Subaddress *Wallet::subaddress() +{ + return m_subaddress; +} + +SubaddressModel *Wallet::subaddressModel() +{ + if (!m_subaddressModel) { + m_subaddressModel = new SubaddressModel(this, m_subaddress); + } + return m_subaddressModel; +} + +SubaddressAccount *Wallet::subaddressAccount() const +{ + return m_subaddressAccount; +} + +SubaddressAccountModel *Wallet::subaddressAccountModel() const +{ + if (!m_subaddressAccountModel) { + Wallet * w = const_cast(this); + m_subaddressAccountModel = new SubaddressAccountModel(w,m_subaddressAccount); + } + return m_subaddressAccountModel; +} + +Coins *Wallet::coins() const +{ + return m_coins; +} + +CoinsModel *Wallet::coinsModel() const +{ + if (!m_coinsModel) { + Wallet * w = const_cast(this); + m_coinsModel = new CoinsModel(w, m_coins); + } + return m_coinsModel; +} + +QString Wallet::generatePaymentId() const +{ + return QString::fromStdString(Monero::Wallet::genPaymentId()); +} + +QString Wallet::integratedAddress(const QString &paymentId) const +{ + return QString::fromStdString(m_walletImpl->integratedAddress(paymentId.toStdString())); +} + +QString Wallet::paymentId() const +{ + return m_paymentId; +} + +void Wallet::setPaymentId(const QString &paymentId) +{ + m_paymentId = paymentId; +} + +QString Wallet::getCacheAttribute(const QString &key) const { + return QString::fromStdString(m_walletImpl->getCacheAttribute(key.toStdString())); +} + +bool Wallet::setCacheAttribute(const QString &key, const QString &val) +{ + return m_walletImpl->setCacheAttribute(key.toStdString(), val.toStdString()); +} + +bool Wallet::setUserNote(const QString &txid, const QString ¬e) +{ + return m_walletImpl->setUserNote(txid.toStdString(), note.toStdString()); +} + +QString Wallet::getUserNote(const QString &txid) const +{ + return QString::fromStdString(m_walletImpl->getUserNote(txid.toStdString())); +} + +QString Wallet::getTxKey(const QString &txid) const +{ + return QString::fromStdString(m_walletImpl->getTxKey(txid.toStdString())); +} + +//void Wallet::getTxKeyAsync(const QString &txid, const QJSValue &callback) +//{ +// m_scheduler.run([this, txid] { +// return QJSValueList({txid, getTxKey(txid)}); +// }, callback); +//} + +QString Wallet::checkTxKey(const QString &txid, const QString &tx_key, const QString &address) +{ + uint64_t received; + bool in_pool; + uint64_t confirmations; + bool success = m_walletImpl->checkTxKey(txid.toStdString(), tx_key.toStdString(), address.toStdString(), received, in_pool, confirmations); + std::string result = std::string(success ? "true" : "false") + "|" + QString::number(received).toStdString() + "|" + std::string(in_pool ? "true" : "false") + "|" + QString::number(confirmations).toStdString(); + return QString::fromStdString(result); +} + +QString Wallet::getTxProof(const QString &txid, const QString &address, const QString &message) const +{ + std::string result = m_walletImpl->getTxProof(txid.toStdString(), address.toStdString(), message.toStdString()); + if (result.empty()) + result = "error|" + m_walletImpl->errorString(); + return QString::fromStdString(result); +} + +//void Wallet::getTxProofAsync(const QString &txid, const QString &address, const QString &message, const QJSValue &callback) +//{ +// m_scheduler.run([this, txid, address, message] { +// return QJSValueList({txid, getTxProof(txid, address, message)}); +// }, callback); +//} + +TxProofResult Wallet::checkTxProof(const QString &txid, const QString &address, const QString &message, const QString &signature) +{ + bool good; + uint64_t received; + bool in_pool; + uint64_t confirmations; + bool success = m_walletImpl->checkTxProof(txid.toStdString(), address.toStdString(), message.toStdString(), signature.toStdString(), good, received, in_pool, confirmations); + return {success, good, received, in_pool, confirmations}; +} + +Q_INVOKABLE QString Wallet::getSpendProof(const QString &txid, const QString &message) const +{ + std::string result = m_walletImpl->getSpendProof(txid.toStdString(), message.toStdString()); + if (result.empty()) + result = "error|" + m_walletImpl->errorString(); + return QString::fromStdString(result); +} + +//void Wallet::getSpendProofAsync(const QString &txid, const QString &message, const QJSValue &callback) +//{ +// m_scheduler.run([this, txid, message] { +// return QJSValueList({txid, getSpendProof(txid, message)}); +// }, callback); +//} + +Q_INVOKABLE QPair Wallet::checkSpendProof(const QString &txid, const QString &message, + const QString &signature) const { + bool good; + bool success = m_walletImpl->checkSpendProof(txid.toStdString(), message.toStdString(), signature.toStdString(), good); + return {success, good}; +} + +QString Wallet::signMessage(const QString &message, bool filename, const QString &address) const +{ + if (filename) { + QFile file(message); + uchar *data = NULL; + + try { + if (!file.open(QIODevice::ReadOnly)) + return ""; + quint64 size = file.size(); + if (size == 0) { + file.close(); + return QString::fromStdString(m_walletImpl->signMessage(std::string())); + } + data = file.map(0, size); + if (!data) { + file.close(); + return ""; + } + std::string signature = m_walletImpl->signMessage(std::string(reinterpret_cast(data), size), address.toStdString()); + file.unmap(data); + file.close(); + return QString::fromStdString(signature); + } + catch (const std::exception &e) { + if (data) + file.unmap(data); + file.close(); + return ""; + } + } + else { + return QString::fromStdString(m_walletImpl->signMessage(message.toStdString(), address.toStdString())); + } +} + +bool Wallet::verifySignedMessage(const QString &message, const QString &address, const QString &signature, bool filename) const +{ + if (filename) { + QFile file(message); + uchar *data = NULL; + + try { + if (!file.open(QIODevice::ReadOnly)) + return false; + quint64 size = file.size(); + if (size == 0) { + file.close(); + return m_walletImpl->verifySignedMessage(std::string(), address.toStdString(), signature.toStdString()); + } + data = file.map(0, size); + if (!data) { + file.close(); + return false; + } + bool ret = m_walletImpl->verifySignedMessage(std::string(reinterpret_cast(data), size), address.toStdString(), signature.toStdString()); + file.unmap(data); + file.close(); + return ret; + } + catch (const std::exception &e) { + if (data) + file.unmap(data); + file.close(); + return false; + } + } + else { + return m_walletImpl->verifySignedMessage(message.toStdString(), address.toStdString(), signature.toStdString()); + } +} + +bool Wallet::parse_uri(const QString &uri, QString &address, QString &payment_id, uint64_t &amount, QString &tx_description, QString &recipient_name, QVector &unknown_parameters, QString &error) +{ + std::string s_address, s_payment_id, s_tx_description, s_recipient_name, s_error; + std::vector s_unknown_parameters; + bool res= m_walletImpl->parse_uri(uri.toStdString(), s_address, s_payment_id, amount, s_tx_description, s_recipient_name, s_unknown_parameters, s_error); + if(res) + { + address = QString::fromStdString(s_address); + payment_id = QString::fromStdString(s_payment_id); + tx_description = QString::fromStdString(s_tx_description); + recipient_name = QString::fromStdString(s_recipient_name); + for( const auto &p : s_unknown_parameters ) + unknown_parameters.append(QString::fromStdString(p)); + } + error = QString::fromStdString(s_error); + return res; +} + +bool Wallet::rescanSpent() +{ + return m_walletImpl->rescanSpent(); +} + +bool Wallet::useForkRules(quint8 required_version, quint64 earlyBlocks) const +{ + if(m_connectionStatus == Wallet::ConnectionStatus_Disconnected) + return false; + try { + return m_walletImpl->useForkRules(required_version,earlyBlocks); + } catch (const std::exception &e) { + qDebug() << e.what(); + return false; + } +} + +void Wallet::setWalletCreationHeight(quint64 height) +{ + m_walletImpl->setRefreshFromBlockHeight(height); + emit walletCreationHeightChanged(); +} + +QString Wallet::getDaemonLogPath() const +{ + return QString::fromStdString(m_walletImpl->getDefaultDataDir()) + "/bitmonero.log"; +} + +bool Wallet::blackballOutput(const QString &amount, const QString &offset) +{ + return m_walletImpl->blackballOutput(amount.toStdString(), offset.toStdString()); +} + +bool Wallet::blackballOutputs(const QList &pubkeys, bool add) +{ + std::vector std_pubkeys; + foreach (const QString &pubkey, pubkeys) { + std_pubkeys.push_back(pubkey.toStdString()); + } + return m_walletImpl->blackballOutputs(std_pubkeys, add); +} + +bool Wallet::blackballOutputs(const QString &filename, bool add) +{ + QFile file(filename); + + try { + if (!file.open(QIODevice::ReadOnly)) + return false; + QList outputs; + QTextStream in(&file); + while (!in.atEnd()) { + outputs.push_back(in.readLine()); + } + file.close(); + return blackballOutputs(outputs, add); + } + catch (const std::exception &e) { + file.close(); + return false; + } +} + +bool Wallet::unblackballOutput(const QString &amount, const QString &offset) +{ + return m_walletImpl->unblackballOutput(amount.toStdString(), offset.toStdString()); +} + +QString Wallet::getRing(const QString &key_image) +{ + std::vector cring; + if (!m_walletImpl->getRing(key_image.toStdString(), cring)) + return ""; + QString ring = ""; + for (uint64_t out: cring) + { + if (!ring.isEmpty()) + ring = ring + " "; + QString s; + s.setNum(out); + ring = ring + s; + } + return ring; +} + +QString Wallet::getRings(const QString &txid) +{ + std::vector>> crings; + if (!m_walletImpl->getRings(txid.toStdString(), crings)) + return ""; + QString ring = ""; + for (const auto &cring: crings) + { + if (!ring.isEmpty()) + ring = ring + "|"; + ring = ring + QString::fromStdString(cring.first) + " absolute"; + for (uint64_t out: cring.second) + { + ring = ring + " "; + QString s; + s.setNum(out); + ring = ring + s; + } + } + return ring; +} + +bool Wallet::setRing(const QString &key_image, const QString &ring, bool relative) +{ + std::vector cring; + QStringList strOuts = ring.split(" "); + foreach(QString str, strOuts) + { + uint64_t out; + bool ok; + out = str.toULong(&ok); + if (ok) + cring.push_back(out); + } + return m_walletImpl->setRing(key_image.toStdString(), cring, relative); +} + +void Wallet::segregatePreForkOutputs(bool segregate) +{ + m_walletImpl->segregatePreForkOutputs(segregate); +} + +void Wallet::segregationHeight(quint64 height) +{ + m_walletImpl->segregationHeight(height); +} + +void Wallet::keyReuseMitigation2(bool mitigation) +{ + m_walletImpl->keyReuseMitigation2(mitigation); +} + +void Wallet::onWalletPassphraseNeeded(bool on_device) +{ + emit this->walletPassphraseNeeded(on_device); +} + +void Wallet::onPassphraseEntered(const QString &passphrase, bool enter_on_device, bool entry_abort) +{ + if (m_walletListener != nullptr) + { + m_walletListener->onPassphraseEntered(passphrase, enter_on_device, entry_abort); + } +} + +Wallet::Wallet(Monero::Wallet *w, QObject *parent) + : QObject(parent) + , m_walletImpl(w) + , m_history(nullptr) + , m_historyModel(nullptr) + , m_addressBook(nullptr) + , m_addressBookModel(nullptr) + , m_daemonBlockChainHeight(0) + , m_daemonBlockChainHeightTtl(DAEMON_BLOCKCHAIN_HEIGHT_CACHE_TTL_SECONDS) + , m_daemonBlockChainTargetHeight(0) + , m_daemonBlockChainTargetHeightTtl(DAEMON_BLOCKCHAIN_TARGET_HEIGHT_CACHE_TTL_SECONDS) + , m_connectionStatus(Wallet::ConnectionStatus_Disconnected) + , m_connectionStatusTtl(WALLET_CONNECTION_STATUS_CACHE_TTL_SECONDS) + , m_disconnected(true) + , m_currentSubaddressAccount(0) + , m_subaddress(nullptr) + , m_subaddressModel(nullptr) + , m_subaddressAccount(nullptr) + , m_subaddressAccountModel(nullptr) + , m_coinsModel(nullptr) + , m_scheduler(this) +{ + m_history = new TransactionHistory(m_walletImpl->history(), this); + m_addressBook = new AddressBook(m_walletImpl->addressBook(), this); + m_subaddress = new Subaddress(m_walletImpl->subaddress(), this); + m_subaddressAccount = new SubaddressAccount(m_walletImpl->subaddressAccount(), this); + m_coins = new Coins(m_walletImpl->coins(), this); + m_walletListener = new WalletListenerImpl(this); + m_walletImpl->setListener(m_walletListener); + m_currentSubaddressAccount = getCacheAttribute(ATTRIBUTE_SUBADDRESS_ACCOUNT).toUInt(); + // start cache timers + m_connectionStatusTime.start(); + m_daemonBlockChainHeightTime.start(); + m_daemonBlockChainTargetHeightTime.start(); + m_initialized = false; + m_connectionStatusRunning = false; + m_daemonUsername = ""; + m_daemonPassword = ""; +} + +Wallet::~Wallet() +{ + qDebug() << "~Wallet: Closing wallet"; + + m_scheduler.shutdownWaitForFinished(); + + delete m_addressBook; + m_addressBook = NULL; + + delete m_history; + m_history = NULL; + delete m_addressBook; + m_addressBook = NULL; + delete m_subaddress; + m_subaddress = NULL; + delete m_subaddressAccount; + m_subaddressAccount = NULL; + delete m_coins; + m_coins = NULL; + //Monero::WalletManagerFactory::getWalletManager()->closeWallet(m_walletImpl); + if(status() == Status_Critical) + qDebug("Not storing wallet cache"); + else if( m_walletImpl->store("")) + qDebug("Wallet cache stored successfully"); + else + qDebug("Error storing wallet cache"); + delete m_walletImpl; + m_walletImpl = NULL; + delete m_walletListener; + m_walletListener = NULL; + qDebug("m_walletImpl deleted"); +} diff --git a/src/libwalletqt/Wallet.h b/src/libwalletqt/Wallet.h new file mode 100644 index 0000000..39ccee7 --- /dev/null +++ b/src/libwalletqt/Wallet.h @@ -0,0 +1,459 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef WALLET_H +#define WALLET_H + +#include +#include +#include +#include +//#include +#include + +#include "wallet/api/wallet2_api.h" // we need to have an access to the Monero::Wallet::Status enum here; +#include "utils/scheduler.h" +#include "PendingTransaction.h" // we need to have an access to the PendingTransaction::Priority enum here; +#include "UnsignedTransaction.h" +#include "utils/networktype.h" +#include "PassphraseHelper.h" +#include "WalletListenerImpl.h" + +namespace Monero { +struct Wallet; // forward declaration +} + + +class TransactionHistory; +class TransactionHistoryModel; +class TransactionHistoryProxyModel; +class TransactionHistorySortFilterModel; +class AddressBook; +class AddressBookModel; +class Subaddress; +class SubaddressModel; +class SubaddressAccount; +class SubaddressAccountModel; +class Coins; +class CoinsModel; + +struct TxProofResult { + TxProofResult(bool success, bool good, uint64_t received, bool in_pool, uint64_t confirmations) + : success(success), good(good), received(received), in_pool(in_pool), confirmations(confirmations){} + + bool success; + bool good; + uint64_t received; + bool in_pool; + uint64_t confirmations; +}; + +class Wallet : public QObject, public PassprasePrompter +{ + Q_OBJECT + Q_PROPERTY(bool disconnected READ disconnected NOTIFY disconnectedChanged) + Q_PROPERTY(QString seed READ getSeed) + Q_PROPERTY(QString seedLanguage READ getSeedLanguage) + Q_PROPERTY(Status status READ status) + Q_PROPERTY(NetworkType::Type nettype READ nettype) + Q_PROPERTY(ConnectionStatus connected READ connected) + Q_PROPERTY(quint32 currentSubaddressAccount READ currentSubaddressAccount NOTIFY currentSubaddressAccountChanged) + Q_PROPERTY(bool synchronized READ synchronized) + Q_PROPERTY(QString errorString READ errorString) + Q_PROPERTY(TransactionHistory * history READ history) + Q_PROPERTY(QString paymentId READ paymentId WRITE setPaymentId) + Q_PROPERTY(TransactionHistoryProxyModel * historyModel READ historyModel NOTIFY historyModelChanged) + Q_PROPERTY(QString path READ path) + Q_PROPERTY(AddressBookModel * addressBookModel READ addressBookModel) + Q_PROPERTY(AddressBook * addressBook READ addressBook NOTIFY addressBookChanged) + Q_PROPERTY(SubaddressModel * subaddressModel READ subaddressModel) + Q_PROPERTY(Subaddress * subaddress READ subaddress) + Q_PROPERTY(SubaddressAccountModel * subaddressAccountModel READ subaddressAccountModel) + Q_PROPERTY(SubaddressAccount * subaddressAccount READ subaddressAccount) + Q_PROPERTY(bool viewOnly READ viewOnly) + Q_PROPERTY(QString secretViewKey READ getSecretViewKey) + Q_PROPERTY(QString publicViewKey READ getPublicViewKey) + Q_PROPERTY(QString secretSpendKey READ getSecretSpendKey) + Q_PROPERTY(QString publicSpendKey READ getPublicSpendKey) + Q_PROPERTY(QString daemonLogPath READ getDaemonLogPath CONSTANT) + Q_PROPERTY(quint64 walletCreationHeight READ getWalletCreationHeight WRITE setWalletCreationHeight NOTIFY walletCreationHeightChanged) + +public: + + + enum Status { + Status_Ok = Monero::Wallet::Status_Ok, + Status_Error = Monero::Wallet::Status_Error, + Status_Critical = Monero::Wallet::Status_Critical + }; + + Q_ENUM(Status) + + enum ConnectionStatus { + ConnectionStatus_Disconnected = Monero::Wallet::ConnectionStatus_Disconnected, + ConnectionStatus_Connected = Monero::Wallet::ConnectionStatus_Connected, + ConnectionStatus_WrongVersion = Monero::Wallet::ConnectionStatus_WrongVersion, + ConnectionStatus_Connecting + }; + + Q_ENUM(ConnectionStatus) + + //! returns mnemonic seed + QString getSeed() const; + + //! returns seed language + QString getSeedLanguage() const; + + //! set seed language + Q_INVOKABLE void setSeedLanguage(const QString &lang); + + //! returns last operation's status + Status status() const; + + //! returns network type of the wallet. + NetworkType::Type nettype() const; + + //! returns whether the wallet is connected, and version status + Q_INVOKABLE ConnectionStatus connected(bool forceCheck = false); + void updateConnectionStatusAsync(); + + //! returns true if wallet was ever synchronized + bool synchronized() const; + + //! returns last operation's error message + QString errorString() const; + + //! changes the password using existing parameters (path, seed, seed lang) + Q_INVOKABLE bool setPassword(const QString &password); + + //! returns wallet's public address + Q_INVOKABLE QString address(quint32 accountIndex, quint32 addressIndex) const; + + //! returns wallet file's path + QString path() const; + + //! saves wallet to the file by given path + //! empty path stores in current location + Q_INVOKABLE void store(const QString &path = ""); + // Q_INVOKABLE void storeAsync(const QJSValue &callback, const QString &path = ""); + + //! initializes wallet asynchronously + Q_INVOKABLE void initAsync(const QString &daemonAddress, bool trustedDaemon = false, quint64 upperTransactionLimit = 0, bool isRecovering = false, bool isRecoveringFromDevice = false, quint64 restoreHeight = 0); + + // Set daemon rpc user/pass + Q_INVOKABLE void setDaemonLogin(const QString &daemonUsername = "", const QString &daemonPassword = ""); + + //! create a view only wallet + Q_INVOKABLE bool createViewOnly(const QString &path, const QString &password) const; + + //! connects to daemon + Q_INVOKABLE bool connectToDaemon(); + + //! indicates id daemon is trusted + Q_INVOKABLE void setTrustedDaemon(bool arg); + + //! returns balance + Q_INVOKABLE quint64 balance() const; + Q_INVOKABLE quint64 balance(quint32 accountIndex) const; + Q_INVOKABLE quint64 balanceAll() const; + + //! returns unlocked balance + Q_INVOKABLE quint64 unlockedBalance() const; + Q_INVOKABLE quint64 unlockedBalance(quint32 accountIndex) const; + Q_INVOKABLE quint64 unlockedBalanceAll() const; + + //! account/address management + quint32 currentSubaddressAccount() const; + Q_INVOKABLE void switchSubaddressAccount(quint32 accountIndex); + Q_INVOKABLE void addSubaddressAccount(const QString& label); + Q_INVOKABLE quint32 numSubaddressAccounts() const; + Q_INVOKABLE quint32 numSubaddresses(quint32 accountIndex) const; + Q_INVOKABLE void addSubaddress(const QString& label); + Q_INVOKABLE QString getSubaddressLabel(quint32 accountIndex, quint32 addressIndex) const; + Q_INVOKABLE void setSubaddressLabel(quint32 accountIndex, quint32 addressIndex, const QString &label); + Q_INVOKABLE void deviceShowAddressAsync(quint32 accountIndex, quint32 addressIndex, const QString &paymentId); + + //! hw-device backed wallets + Q_INVOKABLE bool isHwBacked() const; + Q_INVOKABLE bool isLedger() const; + Q_INVOKABLE bool isTrezor() const; + + //! returns if view only wallet + Q_INVOKABLE bool viewOnly() const; + + Q_INVOKABLE void refreshHeightAsync(); + + //! export/import key images + Q_INVOKABLE bool exportKeyImages(const QString& path); + Q_INVOKABLE bool importKeyImages(const QString& path); + + //! refreshes the wallet + Q_INVOKABLE bool refresh(); + + //! refreshes the wallet asynchronously + Q_INVOKABLE void refreshAsync(); + + //! setup auto-refresh interval in seconds + Q_INVOKABLE void setAutoRefreshInterval(int seconds); + + //! return auto-refresh interval in seconds + Q_INVOKABLE int autoRefreshInterval() const; + + // pause/resume refresh + Q_INVOKABLE void startRefresh() const; + Q_INVOKABLE void pauseRefresh() const; + + //! returns current wallet's block height + //! (can be less than daemon's blockchain height when wallet sync in progress) + Q_INVOKABLE quint64 blockChainHeight() const; + + //! returns daemon's blockchain height + Q_INVOKABLE quint64 daemonBlockChainHeight() const; + + //! returns daemon's blockchain target height + Q_INVOKABLE quint64 daemonBlockChainTargetHeight() const; + + //! creates transaction + Q_INVOKABLE PendingTransaction * createTransaction(const QString &dst_addr, const QString &payment_id, + quint64 amount, quint32 mixin_count, + PendingTransaction::Priority priority); + + //! creates async transaction + Q_INVOKABLE void createTransactionAsync(const QString &dst_addr, const QString &payment_id, + quint64 amount, quint32 mixin_count, + PendingTransaction::Priority priority); + + //! creates transaction with all outputs + Q_INVOKABLE PendingTransaction * createTransactionAll(const QString &dst_addr, const QString &payment_id, + quint32 mixin_count, PendingTransaction::Priority priority); + + //! creates async transaction with all outputs + Q_INVOKABLE void createTransactionAllAsync(const QString &dst_addr, const QString &payment_id, + quint32 mixin_count, PendingTransaction::Priority priority); + + //! creates transaction with single input + Q_INVOKABLE PendingTransaction * createTransactionSingle(const QString &key_image, const QString &dst_addr, + size_t outputs, PendingTransaction::Priority priority); + + //! creates async transaction with single input + Q_INVOKABLE void createTransactionSingleAsync(const QString &key_image, const QString &dst_addr, + size_t outputs, PendingTransaction::Priority priority); + + //! creates sweep unmixable transaction + Q_INVOKABLE PendingTransaction * createSweepUnmixableTransaction(); + + //! creates async sweep unmixable transaction + Q_INVOKABLE void createSweepUnmixableTransactionAsync(); + + //! Sign a transfer from file + Q_INVOKABLE UnsignedTransaction * loadTxFile(const QString &fileName); + + //! Submit a transfer from file + Q_INVOKABLE bool submitTxFile(const QString &fileName) const; + + //! asynchronous transaction commit + Q_INVOKABLE void commitTransactionAsync(PendingTransaction * t); + + //! deletes transaction and frees memory + Q_INVOKABLE void disposeTransaction(PendingTransaction * t); + + //! deletes unsigned transaction and frees memory + Q_INVOKABLE void disposeTransaction(UnsignedTransaction * t); + +// Q_INVOKABLE void estimateTransactionFeeAsync(const QString &destination, +// quint64 amount, +// PendingTransaction::Priority priority, +// const QJSValue &callback); + + //! returns transaction history + TransactionHistory * history() const; + + //! returns transaction history model + TransactionHistoryProxyModel *historyModel() const; + + //! returns transaction history model (the real one) + TransactionHistoryModel *transactionHistoryModel() const; + + //! returns Address book + AddressBook *addressBook() const; + + //! returns adress book model + AddressBookModel *addressBookModel() const; + + //! returns subaddress + Subaddress *subaddress(); + + //! returns subadress model + SubaddressModel *subaddressModel(); + + //! returns subaddress account + SubaddressAccount *subaddressAccount() const; + + //! returns subadress account model + SubaddressAccountModel *subaddressAccountModel() const; + + //! returns coins + Coins *coins() const; + + //! return coins model + CoinsModel *coinsModel() const; + + //! generate payment id + Q_INVOKABLE QString generatePaymentId() const; + + //! integrated address + Q_INVOKABLE QString integratedAddress(const QString &paymentId) const; + + //! signing a message + Q_INVOKABLE QString signMessage(const QString &message, bool filename = false, const QString &address = "") const; + + //! verify a signed message + Q_INVOKABLE bool verifySignedMessage(const QString &message, const QString &address, const QString &signature, bool filename = false) const; + + //! Parse URI + Q_INVOKABLE bool parse_uri(const QString &uri, QString &address, QString &payment_id, uint64_t &amount, QString &tx_description, QString &recipient_name, QVector &unknown_parameters, QString &error); + + //! saved payment id + QString paymentId() const; + + void setPaymentId(const QString &paymentId); + + //! Namespace your cacheAttribute keys to avoid collisions + Q_INVOKABLE bool setCacheAttribute(const QString &key, const QString &val); + Q_INVOKABLE QString getCacheAttribute(const QString &key) const; + + Q_INVOKABLE bool setUserNote(const QString &txid, const QString ¬e); + Q_INVOKABLE QString getUserNote(const QString &txid) const; + Q_INVOKABLE QString getTxKey(const QString &txid) const; + //Q_INVOKABLE void getTxKeyAsync(const QString &txid, const QJSValue &callback); + Q_INVOKABLE QString checkTxKey(const QString &txid, const QString &tx_key, const QString &address); + Q_INVOKABLE QString getTxProof(const QString &txid, const QString &address, const QString &message) const; + // Q_INVOKABLE void getTxProofAsync(const QString &txid, const QString &address, const QString &message, const QJSValue &callback); + //Q_INVOKABLE QString checkTxProof(const QString &txid, const QString &address, const QString &message, const QString &signature); + Q_INVOKABLE TxProofResult checkTxProof(const QString &txid, const QString &address, const QString &message, const QString &signature); + Q_INVOKABLE QString getSpendProof(const QString &txid, const QString &message) const; + // Q_INVOKABLE void getSpendProofAsync(const QString &txid, const QString &message, const QJSValue &callback); + Q_INVOKABLE QPair checkSpendProof(const QString &txid, const QString &message, const QString &signature) const; + // Rescan spent outputs + Q_INVOKABLE bool rescanSpent(); + + // check if fork rules should be used + Q_INVOKABLE bool useForkRules(quint8 version, quint64 earlyBlocks = 0) const; + + //! Get wallet keys + QString getSecretViewKey() const {return QString::fromStdString(m_walletImpl->secretViewKey());} + QString getPublicViewKey() const {return QString::fromStdString(m_walletImpl->publicViewKey());} + QString getSecretSpendKey() const {return QString::fromStdString(m_walletImpl->secretSpendKey());} + QString getPublicSpendKey() const {return QString::fromStdString(m_walletImpl->publicSpendKey());} + + quint64 getWalletCreationHeight() const {return m_walletImpl->getRefreshFromBlockHeight();} + void setWalletCreationHeight(quint64 height); + + QString getDaemonLogPath() const; + QString getWalletLogPath() const; + + // Blackalled outputs + Q_INVOKABLE bool blackballOutput(const QString &amount, const QString &offset); + Q_INVOKABLE bool blackballOutputs(const QList &outputs, bool add); + Q_INVOKABLE bool blackballOutputs(const QString &filename, bool add); + Q_INVOKABLE bool unblackballOutput(const QString &amount, const QString &offset); + + // Rings + Q_INVOKABLE QString getRing(const QString &key_image); + Q_INVOKABLE QString getRings(const QString &txid); + Q_INVOKABLE bool setRing(const QString &key_image, const QString &ring, bool relative); + + // key reuse mitigation options + Q_INVOKABLE void segregatePreForkOutputs(bool segregate); + Q_INVOKABLE void segregationHeight(quint64 height); + Q_INVOKABLE void keyReuseMitigation2(bool mitigation); + + // Passphrase entry for hardware wallets + Q_INVOKABLE void onPassphraseEntered(const QString &passphrase, bool enter_on_device, bool entry_abort=false); + virtual void onWalletPassphraseNeeded(bool on_device) override; + + // TODO: setListenter() when it implemented in API +signals: + // emitted on every event happened with wallet + // (money sent/received, new block) + void updated(); + + // emitted when refresh process finished (could take a long time) + // signalling only after we + void refreshed(); + + void moneySpent(const QString &txId, quint64 amount); + void moneyReceived(const QString &txId, quint64 amount); + void unconfirmedMoneyReceived(const QString &txId, quint64 amount); + void newBlock(quint64 height, quint64 targetHeight); + void addressBookChanged() const; + void historyModelChanged() const; + void walletCreationHeightChanged(); + void deviceButtonRequest(quint64 buttonCode); + void deviceButtonPressed(); + void walletPassphraseNeeded(bool onDevice); + void transactionCommitted(bool status, PendingTransaction *t, const QStringList& txid); + void heightRefreshed(quint64 walletHeight, quint64 daemonHeight, quint64 targetHeight) const; + void deviceShowAddressShowed(); + + // emitted when transaction is created async + void transactionCreated(PendingTransaction * transaction, QString address, QString paymentId, quint32 mixinCount); + + void connectionStatusChanged(int status) const; + void currentSubaddressAccountChanged() const; + void disconnectedChanged() const; + +private: + Wallet(QObject * parent = nullptr); + Wallet(Monero::Wallet *w, QObject * parent = 0); + ~Wallet(); + + //! initializes wallet + bool init(const QString &daemonAddress, bool trustedDaemon, quint64 upperTransactionLimit, bool isRecovering, bool isRecoveringFromDevice, quint64 restoreHeight); + + bool disconnected() const; + void setConnectionStatus(ConnectionStatus value); + +private: + friend class WalletManager; + friend class WalletListenerImpl; + //! libwallet's + Monero::Wallet * m_walletImpl; + // history lifetime managed by wallet; + TransactionHistory * m_history; + // Used for UI history view + mutable TransactionHistoryModel * m_historyModel; + mutable TransactionHistoryProxyModel * m_historySortFilterModel; + QString m_paymentId; + AddressBook * m_addressBook; + mutable AddressBookModel * m_addressBookModel; + mutable QElapsedTimer m_daemonBlockChainHeightTime; + mutable quint64 m_daemonBlockChainHeight; + int m_daemonBlockChainHeightTtl; + mutable QElapsedTimer m_daemonBlockChainTargetHeightTime; + mutable quint64 m_daemonBlockChainTargetHeight; + int m_daemonBlockChainTargetHeightTtl; + mutable ConnectionStatus m_connectionStatus; + int m_connectionStatusTtl; + mutable QElapsedTimer m_connectionStatusTime; + bool m_disconnected; + mutable bool m_initialized; + uint32_t m_currentSubaddressAccount; + Subaddress * m_subaddress; + mutable SubaddressModel * m_subaddressModel; + SubaddressAccount * m_subaddressAccount; + mutable SubaddressAccountModel * m_subaddressAccountModel; + Coins * m_coins; + mutable CoinsModel * m_coinsModel; + QMutex m_connectionStatusMutex; + bool m_connectionStatusRunning; + QString m_daemonUsername; + QString m_daemonPassword; + WalletListenerImpl *m_walletListener; + FutureScheduler m_scheduler; + QMutex m_storeMutex; +}; + + + +#endif // WALLET_H diff --git a/src/libwalletqt/WalletListenerImpl.cpp b/src/libwalletqt/WalletListenerImpl.cpp new file mode 100644 index 0000000..d857b9e --- /dev/null +++ b/src/libwalletqt/WalletListenerImpl.cpp @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#include "WalletListenerImpl.h" +#include "Wallet.h" + +WalletListenerImpl::WalletListenerImpl(Wallet * w) + : m_wallet(w) + , m_phelper(w) +{ + +} + +void WalletListenerImpl::moneySpent(const std::string &txId, uint64_t amount) +{ + qDebug() << __FUNCTION__; + emit m_wallet->moneySpent(QString::fromStdString(txId), amount); +} + +void WalletListenerImpl::moneyReceived(const std::string &txId, uint64_t amount) +{ + qDebug() << __FUNCTION__; + emit m_wallet->moneyReceived(QString::fromStdString(txId), amount); +} + +void WalletListenerImpl::unconfirmedMoneyReceived(const std::string &txId, uint64_t amount) +{ + qDebug() << __FUNCTION__; + emit m_wallet->unconfirmedMoneyReceived(QString::fromStdString(txId), amount); +} + +void WalletListenerImpl::newBlock(uint64_t height) +{ + // qDebug() << __FUNCTION__; + emit m_wallet->newBlock(height, m_wallet->daemonBlockChainTargetHeight()); +} + +void WalletListenerImpl::updated() +{ + emit m_wallet->updated(); +} + +// called when wallet refreshed by background thread or explicitly +void WalletListenerImpl::refreshed() +{ + qDebug() << __FUNCTION__; + emit m_wallet->refreshed(); +} + +void WalletListenerImpl::onDeviceButtonRequest(uint64_t code) +{ + qDebug() << __FUNCTION__; + emit m_wallet->deviceButtonRequest(code); +} + +void WalletListenerImpl::onDeviceButtonPressed() +{ + qDebug() << __FUNCTION__; + emit m_wallet->deviceButtonPressed(); +} + +void WalletListenerImpl::onPassphraseEntered(const QString &passphrase, bool enter_on_device, bool entry_abort) +{ + qDebug() << __FUNCTION__; + m_phelper.onPassphraseEntered(passphrase, enter_on_device, entry_abort); +} + +Monero::optional WalletListenerImpl::onDevicePassphraseRequest(bool & on_device) +{ + qDebug() << __FUNCTION__; + return m_phelper.onDevicePassphraseRequest(on_device); +} diff --git a/src/libwalletqt/WalletListenerImpl.h b/src/libwalletqt/WalletListenerImpl.h new file mode 100644 index 0000000..120ddf4 --- /dev/null +++ b/src/libwalletqt/WalletListenerImpl.h @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef MONERO_GUI_WALLETLISTENERIMPL_H +#define MONERO_GUI_WALLETLISTENERIMPL_H + +#include "wallet/api/wallet2_api.h" +#include "PassphraseHelper.h" + +class Wallet; + +class WalletListenerImpl : public Monero::WalletListener, public PassphraseReceiver +{ +public: + WalletListenerImpl(Wallet * w); + + virtual void moneySpent(const std::string &txId, uint64_t amount) override; + + virtual void moneyReceived(const std::string &txId, uint64_t amount) override; + + virtual void unconfirmedMoneyReceived(const std::string &txId, uint64_t amount) override; + + virtual void newBlock(uint64_t height) override; + + virtual void updated() override; + + // called when wallet refreshed by background thread or explicitly + virtual void refreshed() override; + + virtual void onDeviceButtonRequest(uint64_t code) override; + + virtual void onDeviceButtonPressed() override; + + virtual void onPassphraseEntered(const QString &passphrase, bool enter_on_device, bool entry_abort) override; + + virtual Monero::optional onDevicePassphraseRequest(bool & on_device) override; + +private: + Wallet * m_wallet; + PassphraseHelper m_phelper; +}; + +#endif //MONERO_GUI_WALLETLISTENERIMPL_H diff --git a/src/libwalletqt/WalletManager.cpp b/src/libwalletqt/WalletManager.cpp new file mode 100644 index 0000000..d0caa6e --- /dev/null +++ b/src/libwalletqt/WalletManager.cpp @@ -0,0 +1,487 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#include "libwalletqt/WalletManager.h" +#include "Wallet.h" +#include "wallet/api/wallet2_api.h" +#include +#include +#include +#include +#include +#include +#include +#include + +//#include "qt/updater.h" +#include "utils/ScopeGuard.h" + +class WalletPassphraseListenerImpl : public Monero::WalletListener, public PassphraseReceiver +{ +public: + WalletPassphraseListenerImpl(WalletManager * mgr): m_mgr(mgr), m_phelper(mgr) {} + + virtual void moneySpent(const std::string &txId, uint64_t amount) override { (void)txId; (void)amount; }; + virtual void moneyReceived(const std::string &txId, uint64_t amount) override { (void)txId; (void)amount; }; + virtual void unconfirmedMoneyReceived(const std::string &txId, uint64_t amount) override { (void)txId; (void)amount; }; + virtual void newBlock(uint64_t height) override { (void) height; }; + virtual void updated() override {}; + virtual void refreshed() override {}; + + virtual void onPassphraseEntered(const QString &passphrase, bool enter_on_device, bool entry_abort) override + { + qDebug() << __FUNCTION__; + m_phelper.onPassphraseEntered(passphrase, enter_on_device, entry_abort); + } + +// virtual Monero::optional onDevicePassphraseRequest(bool & on_device) override +// { +// qDebug() << __FUNCTION__; +// return m_phelper.onDevicePassphraseRequest(on_device); +// } +// +// virtual void onDeviceButtonRequest(uint64_t code) override +// { +// qDebug() << __FUNCTION__; +// emit m_mgr->deviceButtonRequest(code); +// } +// +// virtual void onDeviceButtonPressed() override +// { +// qDebug() << __FUNCTION__; +// emit m_mgr->deviceButtonPressed(); +// } + +private: + WalletManager * m_mgr; + PassphraseHelper m_phelper; +}; + +WalletManager * WalletManager::m_instance = nullptr; + +WalletManager *WalletManager::instance() +{ + if (!m_instance) { + m_instance = new WalletManager; + } + + return m_instance; +} + +Wallet *WalletManager::createWallet(const QString &path, const QString &password, + const QString &language, NetworkType::Type nettype, quint64 kdfRounds) +{ + QMutexLocker locker(&m_mutex); + if (m_currentWallet) { + qDebug() << "Closing open m_currentWallet" << m_currentWallet; + delete m_currentWallet; + } + Monero::Wallet * w = m_pimpl->createWallet(path.toStdString(), password.toStdString(), + language.toStdString(), static_cast(nettype), kdfRounds); + m_currentWallet = new Wallet(w); + return m_currentWallet; +} + +Wallet *WalletManager::openWallet(const QString &path, const QString &password, NetworkType::Type nettype, quint64 kdfRounds) +{ + QMutexLocker locker(&m_mutex); + WalletPassphraseListenerImpl tmpListener(this); + m_mutex_passphraseReceiver.lock(); + m_passphraseReceiver = &tmpListener; + m_mutex_passphraseReceiver.unlock(); + const auto cleanup = sg::make_scope_guard([this]() noexcept { + QMutexLocker passphrase_locker(&m_mutex_passphraseReceiver); + this->m_passphraseReceiver = nullptr; + }); + + if (m_currentWallet) { + qDebug() << "Closing open m_currentWallet" << m_currentWallet; + delete m_currentWallet; + } + qDebug() << QString("%1: opening wallet at %2, nettype = %3 ").arg(__PRETTY_FUNCTION__).arg(qPrintable(path)).arg(nettype); + + Monero::Wallet * w = m_pimpl->openWallet(path.toStdString(), password.toStdString(), static_cast(nettype), kdfRounds, &tmpListener); + w->setListener(nullptr); + + qDebug() << QString("%1: opened wallet: %2, status: %3").arg(__PRETTY_FUNCTION__).arg(w->address(0, 0).c_str()).arg(w->status()); + m_currentWallet = new Wallet(w); + + // move wallet to the GUI thread. Otherwise it wont be emitting signals + if (m_currentWallet->thread() != qApp->thread()) { + m_currentWallet->moveToThread(qApp->thread()); + } + + return m_currentWallet; +} + +void WalletManager::openWalletAsync(const QString &path, const QString &password, NetworkType::Type nettype, quint64 kdfRounds) +{ + m_scheduler.run([this, path, password, nettype, kdfRounds] { + emit walletOpened(openWallet(path, password, nettype, kdfRounds)); + }); +} + + +Wallet *WalletManager::recoveryWallet(const QString &path, const QString &password, const QString &seed, const QString &seed_offset, NetworkType::Type nettype, quint64 restoreHeight, quint64 kdfRounds) +{ + QMutexLocker locker(&m_mutex); + if (m_currentWallet) { + qDebug() << "Closing open m_currentWallet" << m_currentWallet; + delete m_currentWallet; + } + Monero::Wallet * w = m_pimpl->recoveryWallet(path.toStdString(), password.toStdString(), seed.toStdString(), static_cast(nettype), restoreHeight, kdfRounds, seed_offset.toStdString()); + m_currentWallet = new Wallet(w); + return m_currentWallet; +} + +Wallet *WalletManager::createWalletFromKeys(const QString &path, const QString &language, NetworkType::Type nettype, + const QString &address, const QString &viewkey, const QString &spendkey, + quint64 restoreHeight, quint64 kdfRounds) +{ + QMutexLocker locker(&m_mutex); + if (m_currentWallet) { + qDebug() << "Closing open m_currentWallet" << m_currentWallet; + delete m_currentWallet; + m_currentWallet = NULL; + } + Monero::Wallet * w = m_pimpl->createWalletFromKeys(path.toStdString(), "", language.toStdString(), static_cast(nettype), restoreHeight, + address.toStdString(), viewkey.toStdString(), spendkey.toStdString(), kdfRounds); + m_currentWallet = new Wallet(w); + return m_currentWallet; +} + +Wallet *WalletManager::createDeterministicWalletFromSpendKey(const QString &path, const QString &password, const QString &language, NetworkType::Type nettype, + const QString &spendkey, quint64 restoreHeight, quint64 kdfRounds) +{ + QMutexLocker locker(&m_mutex); + if (m_currentWallet) { + qDebug() << "Closing open m_currentWallet" << m_currentWallet; + delete m_currentWallet; + m_currentWallet = NULL; + } + Monero::Wallet * w = m_pimpl->createDeterministicWalletFromSpendKey(path.toStdString(), "", language.toStdString(), static_cast(nettype), restoreHeight, + spendkey.toStdString(), kdfRounds); + m_currentWallet = new Wallet(w); + return m_currentWallet; +} + +Wallet *WalletManager::createWalletFromDevice(const QString &path, const QString &password, NetworkType::Type nettype, + const QString &deviceName, quint64 restoreHeight, const QString &subaddressLookahead) +{ + QMutexLocker locker(&m_mutex); + WalletPassphraseListenerImpl tmpListener(this); + m_mutex_passphraseReceiver.lock(); + m_passphraseReceiver = &tmpListener; + m_mutex_passphraseReceiver.unlock(); + const auto cleanup = sg::make_scope_guard([this]() noexcept { + QMutexLocker passphrase_locker(&m_mutex_passphraseReceiver); + this->m_passphraseReceiver = nullptr; + }); + + if (m_currentWallet) { + qDebug() << "Closing open m_currentWallet" << m_currentWallet; + delete m_currentWallet; + m_currentWallet = NULL; + } + Monero::Wallet * w = m_pimpl->createWalletFromDevice(path.toStdString(), password.toStdString(), static_cast(nettype), + deviceName.toStdString(), restoreHeight, subaddressLookahead.toStdString(), 1, &tmpListener); + w->setListener(nullptr); + + m_currentWallet = new Wallet(w); + + // move wallet to the GUI thread. Otherwise it wont be emitting signals + if (m_currentWallet->thread() != qApp->thread()) { + m_currentWallet->moveToThread(qApp->thread()); + } + + return m_currentWallet; +} + + +void WalletManager::createWalletFromDeviceAsync(const QString &path, const QString &password, NetworkType::Type nettype, + const QString &deviceName, quint64 restoreHeight, const QString &subaddressLookahead) +{ + m_scheduler.run([this, path, password, nettype, deviceName, restoreHeight, subaddressLookahead] { + Wallet *wallet = createWalletFromDevice(path, password, nettype, deviceName, restoreHeight, subaddressLookahead); + emit walletCreated(wallet); + }); +} + +QString WalletManager::closeWallet() +{ + QMutexLocker locker(&m_mutex); + QString result; + if (m_currentWallet) { + result = m_currentWallet->address(0, 0); + delete m_currentWallet; + } else { + qCritical() << "Trying to close non existing wallet " << m_currentWallet; + result = "0"; + } + return result; +} + +// @TODO: fix +//void WalletManager::closeWalletAsync(const QJSValue& callback) +//{ +// m_scheduler.run([this] { +// return QJSValueList({closeWallet()}); +// }, callback); +//} + +bool WalletManager::walletExists(const QString &path) const +{ + return m_pimpl->walletExists(path.toStdString()); +} + +QStringList WalletManager::findWallets(const QString &path) +{ + std::vector found_wallets = m_pimpl->findWallets(path.toStdString()); + QStringList result; + for (const auto &w : found_wallets) { + result.append(QString::fromStdString(w)); + } + return result; +} + +QString WalletManager::errorString() const +{ + return tr("Unknown error"); +} + +quint64 WalletManager::maximumAllowedAmount() const +{ + return Monero::Wallet::maximumAllowedAmount(); +} + +QString WalletManager::maximumAllowedAmountAsString() const +{ + return WalletManager::displayAmount(WalletManager::maximumAllowedAmount()); +} + +QString WalletManager::displayAmount(quint64 amount) +{ + return QString::fromStdString(Monero::Wallet::displayAmount(amount)); +} + +quint64 WalletManager::amountFromString(const QString &amount) const +{ + return Monero::Wallet::amountFromString(amount.toStdString()); +} + +quint64 WalletManager::amountFromDouble(double amount) const +{ + return Monero::Wallet::amountFromDouble(amount); +} + +bool WalletManager::paymentIdValid(const QString &payment_id) const +{ + return Monero::Wallet::paymentIdValid(payment_id.toStdString()); +} + +bool WalletManager::addressValid(const QString &address, NetworkType::Type nettype) +{ + return Monero::Wallet::addressValid(address.toStdString(), static_cast(nettype)); +} + +bool WalletManager::keyValid(const QString &key, const QString &address, bool isViewKey, NetworkType::Type nettype) const +{ + std::string error; + if(!Monero::Wallet::keyValid(key.toStdString(), address.toStdString(), isViewKey, static_cast(nettype), error)){ + qDebug() << QString::fromStdString(error); + return false; + } + return true; +} + +QString WalletManager::paymentIdFromAddress(const QString &address, NetworkType::Type nettype) const +{ + return QString::fromStdString(Monero::Wallet::paymentIdFromAddress(address.toStdString(), static_cast(nettype))); +} + +void WalletManager::setDaemonAddressAsync(const QString &address) +{ + m_scheduler.run([this, address] { + m_pimpl->setDaemonAddress(address.toStdString()); + }); +} + +bool WalletManager::connected() const +{ + return m_pimpl->connected(); +} + +quint64 WalletManager::networkDifficulty() const +{ + return m_pimpl->networkDifficulty(); +} + +quint64 WalletManager::blockchainHeight() const +{ + return m_pimpl->blockchainHeight(); +} + +quint64 WalletManager::blockchainTargetHeight() const +{ + return m_pimpl->blockchainTargetHeight(); +} + +double WalletManager::miningHashRate() const +{ + return m_pimpl->miningHashRate(); +} + +bool WalletManager::isMining() const +{ + { + QMutexLocker locker(&m_mutex); + if (m_currentWallet == nullptr || !m_currentWallet->connected()) + { + return false; + } + } + + return m_pimpl->isMining(); +} + +void WalletManager::miningStatusAsync() +{ + m_scheduler.run([this] { + emit miningStatus(isMining()); + }); +} + +bool WalletManager::startMining(const QString &address, quint32 threads, bool backgroundMining, bool ignoreBattery) +{ + if(threads == 0) + threads = 1; + return m_pimpl->startMining(address.toStdString(), threads, backgroundMining, ignoreBattery); +} + +bool WalletManager::stopMining() +{ + return m_pimpl->stopMining(); +} + +bool WalletManager::localDaemonSynced() const +{ + return blockchainHeight() > 1 && blockchainHeight() >= blockchainTargetHeight(); +} + +bool WalletManager::isDaemonLocal(const QString &daemon_address) const +{ + return daemon_address.isEmpty() ? false : Monero::Utils::isAddressLocal(daemon_address.toStdString()); +} + +QString WalletManager::resolveOpenAlias(const QString &address) const +{ + bool dnssec_valid = false; + std::string res = m_pimpl->resolveOpenAlias(address.toStdString(), dnssec_valid); + res = std::string(dnssec_valid ? "true" : "false") + "|" + res; + return QString::fromStdString(res); +} +bool WalletManager::parse_uri(const QString &uri, QString &address, QString &payment_id, uint64_t &amount, QString &tx_description, QString &recipient_name, QVector &unknown_parameters, QString &error) const +{ + QMutexLocker locker(&m_mutex); + if (m_currentWallet) + return m_currentWallet->parse_uri(uri, address, payment_id, amount, tx_description, recipient_name, unknown_parameters, error); + return false; +} + +QVariantMap WalletManager::parse_uri_to_object(const QString &uri) const +{ + QString address; + QString payment_id; + uint64_t amount = 0; + QString tx_description; + QString recipient_name; + QVector unknown_parameters; + QString error; + + QVariantMap result; + if (this->parse_uri(uri, address, payment_id, amount, tx_description, recipient_name, unknown_parameters, error)) { + result.insert("address", address); + result.insert("payment_id", payment_id); + result.insert("amount", amount > 0 ? displayAmount(amount) : ""); + result.insert("tx_description", tx_description); + result.insert("recipient_name", recipient_name); + } else { + result.insert("error", error); + } + + return result; +} + +void WalletManager::setLogLevel(int logLevel) +{ + Monero::WalletManagerFactory::setLogLevel(logLevel); +} + +void WalletManager::setLogCategories(const QString &categories) +{ + Monero::WalletManagerFactory::setLogCategories(categories.toStdString()); +} + +QString WalletManager::urlToLocalPath(const QUrl &url) const +{ + return QDir::toNativeSeparators(url.toLocalFile()); +} + +QUrl WalletManager::localPathToUrl(const QString &path) const +{ + return QUrl::fromLocalFile(path); +} + +QString WalletManager::checkUpdates(const QString &software, const QString &subdir) const +{ + qDebug() << "Checking for updates"; + const std::tuple result = Monero::WalletManager::checkUpdates(software.toStdString(), subdir.toStdString()); + if (!std::get<0>(result)) + return QString(""); + return QString::fromStdString(std::get<1>(result) + "|" + std::get<2>(result) + "|" + std::get<3>(result) + "|" + std::get<4>(result)); +} + +bool WalletManager::clearWalletCache(const QString &wallet_path) const +{ + + QString fileName = wallet_path; + // Make sure wallet file is not .keys + fileName.replace(".keys",""); + QFile walletCache(fileName); + QString suffix = ".old_cache"; + QString newFileName = fileName + suffix; + + // create unique file name + for (int i = 1; QFile::exists(newFileName); i++) { + newFileName = QString("%1%2.%3").arg(fileName).arg(suffix).arg(i); + } + + return walletCache.rename(newFileName); +} + +WalletManager::WalletManager(QObject *parent) + : QObject(parent) + , m_passphraseReceiver(nullptr) + , m_scheduler(this) +{ + m_pimpl = Monero::WalletManagerFactory::getWalletManager(); +} + +WalletManager::~WalletManager() +{ + m_scheduler.shutdownWaitForFinished(); +} + +void WalletManager::onWalletPassphraseNeeded(bool on_device) +{ + emit this->walletPassphraseNeeded(on_device); +} + +void WalletManager::onPassphraseEntered(const QString &passphrase, bool enter_on_device, bool entry_abort) +{ + QMutexLocker locker(&m_mutex_passphraseReceiver); + if (m_passphraseReceiver != nullptr) + { + m_passphraseReceiver->onPassphraseEntered(passphrase, enter_on_device, entry_abort); + } +} diff --git a/src/libwalletqt/WalletManager.h b/src/libwalletqt/WalletManager.h new file mode 100644 index 0000000..28b84e3 --- /dev/null +++ b/src/libwalletqt/WalletManager.h @@ -0,0 +1,204 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef WALLETMANAGER_H +#define WALLETMANAGER_H + +#include +#include +#include +#include +#include +#include +#include +#include "utils/scheduler.h" +#include "utils/networktype.h" +#include "PassphraseHelper.h" + +class Wallet; +namespace Monero { +struct WalletManager; +} + +class WalletManager : public QObject, public PassprasePrompter +{ + Q_OBJECT + Q_PROPERTY(bool connected READ connected) + +public: + enum LogLevel { + LogLevel_Silent = Monero::WalletManagerFactory::LogLevel_Silent, + LogLevel_0 = Monero::WalletManagerFactory::LogLevel_0, + LogLevel_1 = Monero::WalletManagerFactory::LogLevel_1, + LogLevel_2 = Monero::WalletManagerFactory::LogLevel_2, + LogLevel_3 = Monero::WalletManagerFactory::LogLevel_3, + LogLevel_4 = Monero::WalletManagerFactory::LogLevel_4, + LogLevel_Min = Monero::WalletManagerFactory::LogLevel_Min, + LogLevel_Max = Monero::WalletManagerFactory::LogLevel_Max, + }; + + static WalletManager * instance(); + // wizard: createWallet path; + Q_INVOKABLE Wallet * createWallet(const QString &path, const QString &password, + const QString &language, NetworkType::Type nettype = NetworkType::MAINNET, quint64 kdfRounds = 1); + + /*! + * \brief openWallet - opens wallet by given path + * \param path - wallet filename + * \param password - wallet password. Empty string in wallet isn't password protected + * \param nettype - type of network the wallet is running on + * \return wallet object pointer + */ + Q_INVOKABLE Wallet * openWallet(const QString &path, const QString &password, NetworkType::Type nettype = NetworkType::MAINNET, quint64 kdfRounds = 1); + + /*! + * \brief openWalletAsync - asynchronous version of "openWallet". Returns immediately. "walletOpened" signal + * emitted when wallet opened; + */ + Q_INVOKABLE void openWalletAsync(const QString &path, const QString &password, NetworkType::Type nettype = NetworkType::MAINNET, quint64 kdfRounds = 1); + + // wizard: recoveryWallet path; hint: internally it recorvers wallet and set password = "" + Q_INVOKABLE Wallet * recoveryWallet(const QString &path, const QString &password, const QString &seed, const QString &seed_offset, + NetworkType::Type nettype = NetworkType::MAINNET, quint64 restoreHeight = 0, quint64 kdfRounds = 1); + + Q_INVOKABLE Wallet * createWalletFromKeys(const QString &path, + const QString &language, + NetworkType::Type nettype, + const QString &address, + const QString &viewkey, + const QString &spendkey = "", + quint64 restoreHeight = 0, + quint64 kdfRounds = 1); + + Q_INVOKABLE Wallet * createDeterministicWalletFromSpendKey(const QString &path, + const QString &password, + const QString &language, + NetworkType::Type nettype, + const QString &spendkey, + quint64 restoreHeight, + quint64 kdfRounds); + + Q_INVOKABLE Wallet * createWalletFromDevice(const QString &path, + const QString &password, + NetworkType::Type nettype, + const QString &deviceName, + quint64 restoreHeight = 0, + const QString &subaddressLookahead = ""); + + Q_INVOKABLE void createWalletFromDeviceAsync(const QString &path, + const QString &password, + NetworkType::Type nettype, + const QString &deviceName, + quint64 restoreHeight = 0, + const QString &subaddressLookahead = ""); + /*! + * \brief closeWallet - closes current open wallet and frees memory + * \return wallet address + */ + Q_INVOKABLE QString closeWallet(); + + /*! + * \brief closeWalletAsync - asynchronous version of "closeWallet" + */ + //Q_INVOKABLE void closeWalletAsync(const QJSValue& callback); + + //! checks is given filename is a wallet; + Q_INVOKABLE bool walletExists(const QString &path) const; + + //! returns list with wallet's filenames, if found by given path + Q_INVOKABLE QStringList findWallets(const QString &path); + + //! returns error description in human language + Q_INVOKABLE QString errorString() const; + + //! since we can't call static method from QML, move it to this class + Q_INVOKABLE static QString displayAmount(quint64 amount); + Q_INVOKABLE quint64 amountFromString(const QString &amount) const; + Q_INVOKABLE quint64 amountFromDouble(double amount) const; + Q_INVOKABLE quint64 maximumAllowedAmount() const; + + // QML JS engine doesn't support unsigned integers + Q_INVOKABLE QString maximumAllowedAmountAsString() const; + + Q_INVOKABLE bool paymentIdValid(const QString &payment_id) const; + Q_INVOKABLE static bool addressValid(const QString &address, NetworkType::Type nettype); + Q_INVOKABLE bool keyValid(const QString &key, const QString &address, bool isViewKey, NetworkType::Type nettype) const; + + Q_INVOKABLE QString paymentIdFromAddress(const QString &address, NetworkType::Type nettype) const; + + Q_INVOKABLE void setDaemonAddressAsync(const QString &address); + Q_INVOKABLE bool connected() const; + Q_INVOKABLE quint64 networkDifficulty() const; + Q_INVOKABLE quint64 blockchainHeight() const; + Q_INVOKABLE quint64 blockchainTargetHeight() const; + Q_INVOKABLE double miningHashRate() const; + Q_INVOKABLE bool localDaemonSynced() const; + Q_INVOKABLE bool isDaemonLocal(const QString &daemon_address) const; + + Q_INVOKABLE void miningStatusAsync(); + Q_INVOKABLE bool startMining(const QString &address, quint32 threads, bool backgroundMining, bool ignoreBattery); + Q_INVOKABLE bool stopMining(); + + // QML missing such functionality, implementing these helpers here + Q_INVOKABLE QString urlToLocalPath(const QUrl &url) const; + Q_INVOKABLE QUrl localPathToUrl(const QString &path) const; + + Q_INVOKABLE void setLogLevel(int logLevel); + Q_INVOKABLE void setLogCategories(const QString &categories); + + Q_INVOKABLE quint64 add(quint64 x, quint64 y) const { return x + y; } + Q_INVOKABLE quint64 sub(quint64 x, quint64 y) const { return x - y; } + Q_INVOKABLE qint64 addi(qint64 x, qint64 y) const { return x + y; } + Q_INVOKABLE qint64 subi(qint64 x, qint64 y) const { return x - y; } + + Q_INVOKABLE QString resolveOpenAlias(const QString &address) const; + Q_INVOKABLE bool parse_uri(const QString &uri, QString &address, QString &payment_id, uint64_t &amount, QString &tx_description, QString &recipient_name, QVector &unknown_parameters, QString &error) const; + Q_INVOKABLE QVariantMap parse_uri_to_object(const QString &uri) const; +// Q_INVOKABLE bool saveQrCode(const QString &, const QString &) const; +// Q_INVOKABLE void checkUpdatesAsync( +// const QString &software, +// const QString &subdir, +// const QString &buildTag, +// const QString &version); + Q_INVOKABLE QString checkUpdates(const QString &software, const QString &subdir) const; + + // clear/rename wallet cache + Q_INVOKABLE bool clearWalletCache(const QString &fileName) const; + + Q_INVOKABLE void onPassphraseEntered(const QString &passphrase, bool enter_on_device, bool entry_abort=false); + virtual void onWalletPassphraseNeeded(bool on_device) override; + +signals: + + void walletOpened(Wallet * wallet); + void walletCreated(Wallet * wallet); + void walletPassphraseNeeded(bool onDevice); + void deviceButtonRequest(quint64 buttonCode); + void deviceButtonPressed(); + void checkUpdatesComplete( + const QString &version, + const QString &downloadUrl, + const QString &hash, + const QString &firstSigner, + const QString &secondSigner) const; + void miningStatus(bool isMining) const; + +public slots: +private: + friend class WalletPassphraseListenerImpl; + + explicit WalletManager(QObject *parent = 0); + ~WalletManager(); + + bool isMining() const; + + static WalletManager * m_instance; + Monero::WalletManager * m_pimpl; + mutable QMutex m_mutex; + QPointer m_currentWallet; + PassphraseReceiver * m_passphraseReceiver; + QMutex m_mutex_passphraseReceiver; + FutureScheduler m_scheduler; +}; + +#endif // WALLETMANAGER_H diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..bcabcef --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include +#include +#include +#include + +#include "config-feather.h" +#include "mainwindow.h" +#include "cli.h" +#include "utils/utils.h" +#include "appcontext.h" + +#include + +#if defined(Q_OS_LINUX) +Q_IMPORT_PLUGIN(QXcbIntegrationPlugin) +#endif + +int main(int argc, char *argv[]) +{ + Q_INIT_RESOURCE(assets); + +#if defined(Q_OS_MAC) && defined(BUILD_TOR) + Q_INIT_RESOURCE(assets_macos_tor); +#elif defined(Q_OS_LINUX) && defined(BUILD_TOR) + Q_INIT_RESOURCE(assets_linux_tor); +#elif defined(Q_OS_WIN) && defined(BUILD_TOR) + Q_INIT_RESOURCE(assets_windows_tor); +#endif + + QStringList argv_; + for(int i = 0; i != argc; i++){ + argv_ << QString::fromStdString(argv[i]); + } + + QCommandLineParser parser; + parser.setApplicationDescription("feather"); + parser.addHelpOption(); + parser.addVersionOption(); + + QCommandLineOption useLocalTorOption(QStringList() << "use-local-tor", "Use system wide installed Tor instead of the bundled."); + parser.addOption(useLocalTorOption); + + QCommandLineOption torPortOption(QStringList() << "tor-port", "Port of running Tor instance.", "torPort"); + parser.addOption(torPortOption); + + QCommandLineOption debugModeOption(QStringList() << "debug", "Run program in debug mode."); + parser.addOption(debugModeOption); + + QCommandLineOption quietModeOption(QStringList() << "quiet", "Limit console output"); + parser.addOption(quietModeOption); + + QCommandLineOption stagenetOption(QStringList() << "stagenet", "Stagenet is for development purposes only."); + parser.addOption(stagenetOption); + + QCommandLineOption testnetOption(QStringList() << "testnet", "Testnet is for development purposes only."); + parser.addOption(testnetOption); + + QCommandLineOption walletPathOption(QStringList() << "wallet-file", "Path to wallet keys file.", "file"); + parser.addOption(walletPathOption); + + QCommandLineOption walletPasswordOption(QStringList() << "password", "Wallet password (escape/quote as needed)", "password"); + parser.addOption(walletPasswordOption); + + QCommandLineOption daemonAddressOption(QStringList() << "daemon-address", "Daemon address (IPv4:port)", "daemonAddress"); + parser.addOption(daemonAddressOption); + + QCommandLineOption exportContactsOption(QStringList() << "export-contacts", "Output wallet contacts as CSV to specified path.", "file"); + parser.addOption(exportContactsOption); + + QCommandLineOption exportTxHistoryOption(QStringList() << "export-txhistory", "Output wallet transaction history as CSV to specified path.", "file"); + parser.addOption(exportTxHistoryOption); + + auto parsed = parser.parse(argv_); + if(!parsed) { + qCritical() << parser.errorText(); + exit(1); + } + + const QStringList args = parser.positionalArguments(); + bool debugMode = parser.isSet(debugModeOption); + bool localTor = parser.isSet(useLocalTorOption); + bool stagenet = parser.isSet(stagenetOption); + bool testnet = parser.isSet(testnetOption); + bool quiet = parser.isSet(quietModeOption); + bool exportContacts = parser.isSet(exportContactsOption); + bool exportTxHistory = parser.isSet(exportTxHistoryOption); + bool cliMode = exportContacts || exportTxHistory; + + if(cliMode) { + QCoreApplication cli_app(argc, argv); + QCoreApplication::setApplicationName("feather"); + QCoreApplication::setOrganizationDomain("featherwallet.org"); + QCoreApplication::setOrganizationName("featherwallet.org"); + + auto *ctx = new AppContext(&parser); + ctx->applicationPath = QString(argv[0]); + ctx->isDebug = debugMode; + + auto *cli = new CLI(ctx, &cli_app); + QObject::connect(cli, &CLI::closeApplication, &cli_app, &QCoreApplication::quit); + + if(exportContacts) { + if(!quiet) + qInfo() << "CLI mode: Address book export"; + cli->mode = CLIMode::CLIModeExportContacts; + QTimer::singleShot(0, cli, &CLI::run); + } else if(exportTxHistory) { + if(!quiet) + qInfo() << "CLI mode: Transaction history export"; + cli->mode = CLIMode::CLIModeExportTxHistory; + QTimer::singleShot(0, cli, &CLI::run); + } + + return QCoreApplication::exec(); + } + + QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QApplication::setDesktopSettingsAware(true); // use system font + QApplication::setApplicationVersion(FEATHER_VERSION); + + QApplication app(argc, argv); + + QApplication::setApplicationName("feather"); + QApplication::setOrganizationDomain("featherwallet.org"); + QApplication::setOrganizationName("featherwallet.org"); + + parser.process(app); // Parse again for --help and --version + + if(!quiet) { + QMap info; + info["Qt"] = QT_VERSION_STR; + info["Feather"] = FEATHER_VERSION; + if (stagenet) info["Mode"] = "Stagenet"; + else if (testnet) info["Mode"] = "Testnet"; + else info["Mode"] = "Mainnet"; + info["SSL"] = QSslSocket::sslLibraryVersionString(); + info["SSL build"] = QSslSocket::sslLibraryBuildVersionString(); + for (const auto &k: info.keys()) + qWarning().nospace().noquote() << QString("%1: %2").arg(k).arg(info[k]); + } + + auto *ctx = new AppContext(&parser); + ctx->applicationPath = QString(argv[0]); + ctx->isDebug = debugMode; + +#if defined(Q_OS_MAC) + // For some odd reason, if we don't do this, QPushButton's + // need to be clicked *twice* in order to fire ?! + QFont fontDef = QApplication::font(); + fontDef.setPointSize(fontDef.pointSize() + 1); + QApplication::setFont(fontDef); +#endif + + qInstallMessageHandler(Utils::applicationLogHandler); + + auto *mainWindow = new MainWindow(ctx); + return QApplication::exec(); +} diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp new file mode 100644 index 0000000..e8b3efa --- /dev/null +++ b/src/mainwindow.cpp @@ -0,0 +1,1058 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include +#include +#include +#include +#include +#include +#include + +#include "mainwindow.h" +#include "widgets/ccswidget.h" +#include "widgets/redditwidget.h" +#include "dialog/txconfdialog.h" +#include "dialog/debuginfodialog.h" +#include "dialog/walletinfodialog.h" +#include "dialog/torinfodialog.h" +#include "utils/utils.h" +#include "utils/config.h" +#include "components.h" +#include "calcwindow.h" +#include "ui_mainwindow.h" + +// libwalletqt +#include "libwalletqt/WalletManager.h" +#include "Wallet.h" +#include "libwalletqt/TransactionHistory.h" +#include "libwalletqt/SubaddressAccount.h" +#include "libwalletqt/AddressBook.h" +#include "model/SubaddressAccountModel.h" +#include "model/SubaddressModel.h" +#include "utils/networktype.h" + +MainWindow * MainWindow::pMainWindow = nullptr; + +MainWindow::MainWindow(AppContext *ctx, QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow), + m_ctx(ctx), + m_aboutDialog(new AboutDialog(this)), + m_windowCalc(new CalcWindow(this)) +{ + pMainWindow = this; + ui->setupUi(this); + + m_windowSettings = new Settings(this); + + // light/dark theme + m_skins.insert("Native", ""); + this->loadSkins(); + QString skin = config()->get(Config::skin).toString(); + qApp->setStyleSheet(m_skins[skin]); + + this->screenDpiRef = 128; + this->screenGeo = QApplication::primaryScreen()->availableGeometry(); + this->screenRect = QGuiApplication::primaryScreen()->geometry(); + this->screenDpi = QGuiApplication::primaryScreen()->logicalDotsPerInch(); + this->screenDpiPhysical = QGuiApplication::primaryScreen()->physicalDotsPerInch(); + this->screenRatio = this->screenDpiPhysical / this->screenDpiRef; + qInfo() << QString("%1x%2 (%3 DPI)").arg(this->screenRect.width()).arg(this->screenRect.height()).arg(this->screenDpi); + + this->restoreGeo(); + + this->create_status_bar(); + + // Bootstrap Tor/websockets + m_ctx->initTor(); + m_ctx->initWS(); + + // update statusbar + connect(m_ctx->tor, &Tor::connectionStateChanged, [this](bool connected){ + connected ? m_statusBtnTor->setIcon(QIcon(":/assets/images/tor_logo.png")) + : m_statusBtnTor->setIcon(QIcon(":/assets/images/tor_logo_disabled.png"));}); + connect(m_ctx->nodes, &Nodes::updateStatus, [=](const QString &msg){ + m_statusLabelStatus->setText(msg); + }); + + // menu connects + connect(ui->actionQuit, &QAction::triggered, this, &MainWindow::menuQuitClicked); + connect(ui->actionSettings, &QAction::triggered, this, &MainWindow::menuSettingsClicked); + connect(ui->actionCalculator, &QAction::triggered, this, &MainWindow::showCalcWindow); + +#if defined(Q_OS_WIN) || defined(Q_OS_MACOS) + ui->actionCreateDesktopEntry->setDisabled(true); +#endif + connect(ui->actionCreateDesktopEntry, &QAction::triggered, [=]{ + auto msg = Utils::xdgDesktopEntryRegister() ? "Desktop entry created" : "Desktop entry not created due to an error."; + QMessageBox::information(this, "Desktop entry", msg); + }); + connect(ui->actionReport_bug, &QAction::triggered, [this](){ + QMessageBox::information(this, "Reporting Bugs", + "Please report any bugs as issues on our git repo:
        \n" + "
        https://git.wownero.com/feather/feather/issues

        " + "\n" + "Before reporting a bug, upgrade to the most recent version of Feather " + "(latest release or git HEAD), and include the version number in your report. " + "Try to explain not only what the bug is, but how it occurs."); + }); + connect(ui->actionShow_debug_info, &QAction::triggered, this, &MainWindow::showDebugInfo); + connect(ui->actionOfficialWebsite, &QAction::triggered, [=] { Utils::externalLinkWarning("https://featherwallet.org"); }); + connect(ui->actionAbout_Qt, &QAction::triggered, [=] { QApplication::aboutQt(); }); + + +#if defined(XMRTO) + // xmr.to connects/widget + connect(ui->xmrToWidget, &XMRToWidget::viewOrder, m_ctx->XMRTo, &XmrTo::onViewOrder); + connect(ui->xmrToWidget, &XMRToWidget::getRates, m_ctx->XMRTo, &XmrTo::onGetRates); + connect(ui->xmrToWidget, &XMRToWidget::createOrder, m_ctx->XMRTo, &XmrTo::createOrder); + connect(m_ctx->XMRTo, &XmrTo::ratesUpdated, ui->xmrToWidget, &XMRToWidget::onRatesUpdated); + connect(m_ctx->XMRTo, &XmrTo::connectionError, ui->xmrToWidget, &XMRToWidget::onConnectionError); + connect(m_ctx->XMRTo, &XmrTo::connectionSuccess, ui->xmrToWidget, &XMRToWidget::onConnectionSuccess); + connect(m_ctx, &AppContext::balanceUpdated, ui->xmrToWidget, &XMRToWidget::onBalanceUpdated); + connect(m_ctx->XMRTo, &XmrTo::openURL, this, [=](const QString &url){ Utils::externalLinkWarning(url); }); + ui->xmrToWidget->setHistoryModel(m_ctx->XMRTo->tableModel); +#else + ui->tabWidget->setTabVisible(5, false); +#endif + + +#if defined(Q_OS_LINUX) + // system tray + m_trayIcon = new QSystemTrayIcon(QIcon(":/assets/images/appicons/64x64.png")); + m_trayIcon->show(); + + m_trayActionCalc = new QAction("Calc", this); + m_trayActionCalc->setStatusTip("Calculator"); + + m_trayActionSend = new QAction("Send", this); + m_trayActionSend->setStatusTip("Send XMR payment"); + + m_trayActionHistory = new QAction("History", this); + m_trayActionHistory->setStatusTip("View incoming transfers"); + + m_trayActionExit = new QAction("Quit", this); + m_trayActionExit->setStatusTip("Exit application"); + + m_trayMenu.addAction(m_trayActionSend); + m_trayMenu.addAction(m_trayActionHistory); + m_trayMenu.addAction(m_trayActionCalc); + m_trayMenu.addAction(m_trayActionExit); + m_trayIcon->setContextMenu(&m_trayMenu); + + // @TODO: only init tray *after* boot + connect(m_trayActionCalc, &QAction::triggered, this, &MainWindow::showCalcWindow); + connect(m_trayActionSend, &QAction::triggered, this, &MainWindow::showSendTab); + connect(m_trayActionHistory, &QAction::triggered, this, &MainWindow::showHistoryTab); + connect(m_trayActionExit, &QAction::triggered, this, &QMainWindow::close); +#endif + + // ticker widgets + m_tickerWidgets.append(new TickerWidget(this, "XMR")); + m_tickerWidgets.append(new TickerWidget(this, "BTC")); + for(auto tickerWidget: m_tickerWidgets) { + ui->tickerLayout->addWidget(tickerWidget); + } + + m_balanceWidget = new TickerWidget(this, "XMR", "Balance", true); + ui->fiatTickerLayout->addWidget(m_balanceWidget); + + // Send widget + connect(ui->sendWidget, &SendWidget::createTransaction, m_ctx, QOverload::of(&AppContext::onCreateTransaction)); + + // Nodes + connect(m_ctx->nodes, &Nodes::nodeExhausted, this, &MainWindow::showNodeExhaustedMessage); + connect(m_ctx->nodes, &Nodes::WSNodeExhausted, this, &MainWindow::showWSNodeExhaustedMessage); + + // CCS/Reddit widget + m_ccsWidget = new CCSWidget(this); + m_redditWidget = new RedditWidget(this); + + m_ccsWidget->hide(); + m_redditWidget->hide(); + + ui->coolLayout->addWidget(m_ccsWidget); + ui->coolLayout->addWidget(m_redditWidget); + + connect(m_ctx, &AppContext::ccsEmpty, [=] { + if(m_ccsWidget->isVisible()) { + // display Reddit widget instead + m_ccsWidget->show(); + m_redditWidget->show(); + } + }); + connect(m_ctx, &AppContext::ccsUpdated, m_ccsWidget->model(), &CCSModel::updateEntries); + connect(m_ctx, &AppContext::redditUpdated, m_redditWidget->model(), &RedditModel::updatePosts); + connect(m_ccsWidget, &CCSWidget::selected, this, &MainWindow::showSendScreen); + + connect(m_ctx, &AppContext::donationNag, [=]{ + auto msg = "Feather is a 100% community-sponsored endeavor. Please consider supporting " + "the project financially. Get rid of this message by donating any amount."; + int ret = QMessageBox::information(this, "Donate to Feather", msg, QMessageBox::Yes, QMessageBox::No); + switch (ret) { + case QMessageBox::Yes: + this->donateButtonClicked(); + case QMessageBox::No: + break; + default: + return; + } + }); + + // libwalletqt + connect(this, &MainWindow::walletClosed, ui->xmrToWidget, &XMRToWidget::onWalletClosed); + connect(this, &MainWindow::walletClosed, ui->sendWidget, &SendWidget::onWalletClosed); + connect(m_ctx, &AppContext::balanceUpdated, this, &MainWindow::onBalanceUpdated); + connect(m_ctx, &AppContext::balanceUpdated, ui->xmrToWidget, &XMRToWidget::onBalanceUpdated); + connect(m_ctx, &AppContext::walletOpened, this, &MainWindow::onWalletOpened); + connect(m_ctx, &AppContext::walletClosed, this, QOverload<>::of(&MainWindow::onWalletClosed)); + connect(m_ctx, &AppContext::walletOpenedError, this, &MainWindow::onWalletOpenedError); + connect(m_ctx, &AppContext::walletCreatedError, this, &MainWindow::onWalletCreatedError); + connect(m_ctx, &AppContext::walletCreated, this, &MainWindow::onWalletCreated); + connect(m_ctx, &AppContext::synchronized, this, &MainWindow::onSynchronized); + connect(m_ctx, &AppContext::blockchainSync, this, &MainWindow::onBlockchainSync); + connect(m_ctx, &AppContext::refreshSync, this, &MainWindow::onRefreshSync); + connect(m_ctx, &AppContext::createTransactionError, this, &MainWindow::onCreateTransactionError); + connect(m_ctx, &AppContext::createTransactionSuccess, this, &MainWindow::onCreateTransactionSuccess); + connect(m_ctx, &AppContext::transactionCommitted, this, &MainWindow::onTransactionCommitted); + connect(m_ctx, &AppContext::walletOpenPasswordNeeded, this, &MainWindow::onWalletOpenPasswordRequired); + + // Send + connect(m_ctx, &AppContext::initiateTransaction, ui->sendWidget, &SendWidget::onInitiateTransaction); + connect(m_ctx, &AppContext::endTransaction, ui->sendWidget, &SendWidget::onEndTransaction); + + // XMR.to + connect(m_ctx, &AppContext::initiateTransaction, ui->xmrToWidget, &XMRToWidget::onInitiateTransaction); + connect(m_ctx, &AppContext::endTransaction, ui->xmrToWidget, &XMRToWidget::onEndTransaction); + + // testnet/stagenet warning + auto worthlessWarning = QString("Feather wallet is currently running in %1 mode. This is meant " + "for developers only. Your coins are WORTHLESS."); + if(m_ctx->networkType == NetworkType::STAGENET) { + if (config()->get(Config::warnOnStagenet).toBool()) { + Utils::showMessageBox("Warning", worthlessWarning.arg("stagenet"), true); + config()->set(Config::warnOnStagenet, false); + } + } + else if(m_ctx->networkType == NetworkType::TESTNET){ + if (config()->get(Config::warnOnTestnet).toBool()) { + Utils::showMessageBox("Warning", worthlessWarning.arg("testnet"), true); + config()->set(Config::warnOnTestnet, false); + } + } + + if(config()->get(Config::warnOnAlpha).toBool()) { + auto alphaWarning = "Feather wallet is currently in alpha. Bugs are to be expected and " + "can be reported on our Git repository or on IRC."; + Utils::showMessageBox("Warning", alphaWarning, true); + config()->set(Config::warnOnAlpha, false); + } + + // settings connects + // Update ticker widget(s) on home tab when settings preferred fiat currency is changed + for(auto tickerWidget: m_tickerWidgets) + connect(m_windowSettings, &Settings::preferredFiatCurrencyChanged, tickerWidget, &TickerWidget::init); + connect(m_windowSettings, &Settings::preferredFiatCurrencyChanged, m_balanceWidget, &TickerWidget::init); + connect(m_windowSettings, &Settings::preferredFiatCurrencyChanged, m_ctx, &AppContext::onPreferredFiatCurrencyChanged); + + // CCS/Reddit widget + connect(m_windowSettings, &Settings::homeWidgetChanged, this, &MainWindow::homeWidgetChanged); + + // Skin + connect(m_windowSettings, &Settings::skinChanged, this, &MainWindow::skinChanged); + + // Wizard + connect(this, &MainWindow::closed, [=]{ + if(m_wizard != nullptr) + m_wizard->close(); + }); + + // Receive + connect(ui->receiveWidget, &ReceiveWidget::generateSubaddress, [=]() { + m_ctx->currentWallet->subaddress()->addRow( m_ctx->currentWallet->currentSubaddressAccount(), ""); + m_ctx->storeWallet(); + }); + connect(ui->receiveWidget, &ReceiveWidget::showTransactions, [this](const QString &text) { + ui->historyWidget->setSearchText(text); + ui->tabWidget->setCurrentIndex(1); //history + }); + + // History + connect(ui->historyWidget, &HistoryWidget::spendProof, [&](const QString &txid){ + QString spendProof = m_ctx->currentWallet->getSpendProof(txid, ""); + Utils::copyToClipboard(spendProof); + }); + connect(ui->historyWidget, &HistoryWidget::viewOnBlockExplorer, this, &MainWindow::onViewOnBlockExplorer); + + // Contacts + connect(ui->contactWidget, &ContactsWidget::addContact, this, &MainWindow::onAddContact); + connect(ui->contactWidget, &ContactsWidget::fillAddress, ui->sendWidget, &SendWidget::fillAddress); + + // Open alias + connect(ui->sendWidget, &SendWidget::resolveOpenAlias, m_ctx, &AppContext::onOpenAliasResolve); + connect(m_ctx, &AppContext::openAliasResolveError, ui->sendWidget, &SendWidget::onOpenAliasResolveError); + connect(m_ctx, &AppContext::openAliasResolved, ui->sendWidget, &SendWidget::onOpenAliasResolved); + + // Coins + connect(ui->coinsWidget, &CoinsWidget::freeze, [=](int index) { + m_ctx->currentWallet->coins()->freeze(index); + m_ctx->currentWallet->coins()->refresh(m_ctx->currentWallet->currentSubaddressAccount()); + m_ctx->updateBalance(); + // subaddress account filtering should be done in Model maybe, so we can update data in coins() directly + }); + connect(ui->coinsWidget, &CoinsWidget::freezeMulti, [&](const QVector& indexes) { + for (int i : indexes) { + m_ctx->currentWallet->coins()->freeze(i); + m_ctx->currentWallet->coins()->refresh(m_ctx->currentWallet->currentSubaddressAccount()); + m_ctx->updateBalance(); + } + }); + connect(ui->coinsWidget, &CoinsWidget::thaw, [=](int index) { + m_ctx->currentWallet->coins()->thaw(index); + m_ctx->currentWallet->coins()->refresh(m_ctx->currentWallet->currentSubaddressAccount()); + m_ctx->updateBalance(); + }); + connect(ui->coinsWidget, &CoinsWidget::thawMulti, [&](const QVector& indexes) { + for (int i : indexes) { + m_ctx->currentWallet->coins()->thaw(i); + m_ctx->currentWallet->coins()->refresh(m_ctx->currentWallet->currentSubaddressAccount()); + m_ctx->updateBalance(); + } + }); + connect(ui->coinsWidget, &CoinsWidget::sweepOutput, m_ctx, &AppContext::onSweepOutput); + + connect(m_ctx, &AppContext::walletClosing, [=]{ + ui->tabWidget->setCurrentIndex(0); + }); + // setup some UI + this->initMain(); + this->initWidgets(); + this->initMenu(); +} + +void MainWindow::initMain() { + // show wizards or open wallet directly based on cmdargs + if(m_ctx->cmdargs->isSet("password")) + m_ctx->walletPassword = m_ctx->cmdargs->value("password"); + + QString openPath = ""; + QString autoPath = config()->get(Config::autoOpenWalletPath).toString(); + if(m_ctx->cmdargs->isSet("wallet-file")) + openPath = m_ctx->cmdargs->value("wallet-file"); + else if(!autoPath.isEmpty()) + if (autoPath.startsWith(QString::number(m_ctx->networkType))) + openPath = autoPath.remove(0, 1); + + if(!openPath.isEmpty() && Utils::fileExists(openPath)) { + this->show(); + this->setEnabled(true); + + m_ctx->onOpenWallet(openPath, m_ctx->walletPassword); + return; + } + + this->setEnabled(false); + this->show(); + m_wizard = this->createWizard(WalletWizard::Page_Menu); + m_wizard->show(); +} + +void MainWindow::initMenu() { + // hide/show tabs + m_tabShowHideSignalMapper = new QSignalMapper(this); + + connect(ui->actionShow_Coins, &QAction::triggered, m_tabShowHideSignalMapper, QOverload<>::of(&QSignalMapper::map)); + m_tabShowHideMapper["Coins"] = new ToggleTab(ui->tabCoins, "Coins", "Coins", ui->actionShow_Coins, Config::showTabCoins); + m_tabShowHideSignalMapper->setMapping(ui->actionShow_Coins, "Coins"); +#if defined(XMRTO) + connect(ui->actionShow_xmr_to, &QAction::triggered, m_tabShowHideSignalMapper, QOverload<>::of(&QSignalMapper::map)); + m_tabShowHideMapper["XMRto"] = new ToggleTab(ui->tabXmrTo, "XMRto", "xmr.to", ui->actionShow_xmr_to, Config::showTabXMRto); + m_tabShowHideSignalMapper->setMapping(ui->actionShow_xmr_to, "XMRto"); +#else + ui->actionShow_xmr_to->setVisible(false); +#endif + connect(ui->actionShow_calc, &QAction::triggered, m_tabShowHideSignalMapper, QOverload<>::of(&QSignalMapper::map)); + m_tabShowHideMapper["Calc"] = new ToggleTab(ui->tabCalc, "Calc", "Calc", ui->actionShow_calc, Config::showTabCalc); + m_tabShowHideSignalMapper->setMapping(ui->actionShow_calc, "Calc"); + + for (const auto &key: m_tabShowHideMapper.keys()) { + const auto toggleTab = m_tabShowHideMapper.value(key); + const bool show = config()->get(toggleTab->configKey).toBool(); + toggleTab->menuAction->setText((show ? QString("Hide ") : QString("Show ")) + toggleTab->name); + ui->tabWidget->setTabVisible(ui->tabWidget->indexOf(toggleTab->tab), show); + } + connect(m_tabShowHideSignalMapper, &QSignalMapper::mappedString, this, &MainWindow::menuToggleTabVisible); + + // Wallet + connect(ui->actionInformation, &QAction::triggered, this, &MainWindow::showWalletInfoDialog); + connect(ui->actionSeed, &QAction::triggered, this, &MainWindow::showSeedDialog); + connect(ui->actionPassword, &QAction::triggered, this, &MainWindow::showPasswordDialog); + connect(ui->actionKeys, &QAction::triggered, this, &MainWindow::showKeysDialog); + connect(ui->actionStore_wallet, &QAction::triggered, [&]{ + m_ctx->currentWallet->store(); + }); + connect(ui->actionRefresh_tabs, &QAction::triggered, [&]{ + m_ctx->refreshModels(); + }); + connect(ui->actionUpdate_balance, &QAction::triggered, [&]{ + m_ctx->updateBalance(); + }); + + // set restore height + connect(ui->actionChange_restore_height, &QAction::triggered, this, &MainWindow::showRestoreHeightDialog); + connect(m_ctx, &AppContext::customRestoreHeightSet, [=](unsigned int height){ + auto msg = QString("The restore height for this wallet has been set to %1. " + "Please re-open the wallet. Feather will now quit.").arg(height); + QMessageBox::information(this, "Cannot set custom restore height", msg); + this->menuQuitClicked(); + }); + + // CSV tx export + connect(ui->actionExport_CSV, &QAction::triggered, [=]{ + if(m_ctx->currentWallet == nullptr) return; + QString fn = QFileDialog::getSaveFileName(this, "Save CSV file", QDir::homePath(), "CSV (*.csv)"); + if(!fn.startsWith(".csv")) fn += ".csv"; + m_ctx->currentWallet->history()->writeCSV(fn); + Utils::showMessageBox("CSV export", QString("Transaction history exported to %1").arg(fn), false); + }); + + // Contact widget + connect(ui->actionExportContactsCSV, &QAction::triggered, [=]{ + if(m_ctx->currentWallet == nullptr) return; + auto *model = m_ctx->currentWallet->addressBookModel(); + if (model->rowCount() <= 0){ + Utils::showMessageBox("Error", "Addressbook empty", true); + return; + } + + const QString targetDir = QFileDialog::getExistingDirectory(this, "Select CSV output directory ", QDir::homePath(), QFileDialog::ShowDirsOnly); + if(targetDir.isEmpty()) return; + + qint64 now = QDateTime::currentDateTime().currentMSecsSinceEpoch(); + QString fn = QString("%1/monero-contacts_%2.csv").arg(targetDir, QString::number(now / 1000)); + if(model->writeCSV(fn)) + Utils::showMessageBox("Address book exported", QString("Address book exported to %1").arg(fn), false); + }); + + // Tools + connect(ui->actionSignVerify, &QAction::triggered, this, &MainWindow::menuSignVerifyClicked); + connect(ui->actionVerifyTxProof, &QAction::triggered, this, &MainWindow::menuVerifyTxProof); + + // About screen + connect(ui->actionAbout, &QAction::triggered, this, &MainWindow::menuAboutClicked); + connect(ui->actionDonate_to_Feather, &QAction::triggered, this, &MainWindow::donateButtonClicked); + + // Close / Open + connect(ui->actionClose, &QAction::triggered, this, &MainWindow::menuWalletCloseClicked); + connect(ui->actionOpen, &QAction::triggered, this, &MainWindow::menuWalletOpenClicked); +} + +void MainWindow::menuToggleTabVisible(const QString &key){ + const auto toggleTab = m_tabShowHideMapper[key]; + bool show = config()->get(toggleTab->configKey).toBool(); + show = !show; + config()->set(toggleTab->configKey, show); + ui->tabWidget->setTabVisible(ui->tabWidget->indexOf(toggleTab->tab), show); + toggleTab->menuAction->setText((show ? QString("Hide ") : QString("Show ")) + toggleTab->name); +} + +void MainWindow::initWidgets() { + auto homeWidget = config()->get(Config::homeWidget).toString(); + if(homeWidget == QString("ccs")) { + m_ccsWidget->show(); + } else if (homeWidget == "reddit") { + m_redditWidget->show(); + } else { + config()->set(Config::homeWidget, "ccs"); + m_ccsWidget->show(); + } +} + +WalletWizard *MainWindow::createWizard(WalletWizard::Page startPage){ + auto *wizard = new WalletWizard(m_ctx, startPage, this); + connect(wizard, &WalletWizard::openWallet, m_ctx, &AppContext::onOpenWallet); + return wizard; +} + +void MainWindow::showWizard(WalletWizard::Page startPage) { + this->setEnabled(false); + m_wizard = this->createWizard(startPage); + m_wizard->show(); +} + +void MainWindow::onWalletClosed() { + this->onWalletClosed(WalletWizard::Page_Menu); +} + +void MainWindow::onWalletClosed(WalletWizard::Page page) { + emit walletClosed(); + m_statusLabelBalance->clear(); + m_statusLabelStatus->clear(); + this->setWindowTitle("Feather"); + this->showWizard(page); +} + +void MainWindow::onWalletCreatedError(const QString &err) { + Utils::showMessageBox("Wallet creation error", err, true); + this->showWizard(WalletWizard::Page_CreateWallet); +} + +void MainWindow::onWalletOpenPasswordRequired(bool invalidPassword) { + QInputDialog passwordDialog(this); + passwordDialog.setInputMode(QInputDialog::TextInput); + passwordDialog.setTextEchoMode(QLineEdit::Password); + passwordDialog.setWindowTitle("Password required"); + passwordDialog.setLabelText("Please enter wallet password."); + passwordDialog.resize(300, 100); + if(!(bool)passwordDialog.exec()) + return this->showWizard(WalletWizard::Page_OpenWallet); + + const auto passwd = passwordDialog.textValue(); + m_ctx->walletPassword = passwd; + m_ctx->onOpenWallet(m_ctx->walletPath, m_ctx->walletPassword); +} + +void MainWindow::onWalletOpenedError(const QString &err) { + qDebug() << Q_FUNC_INFO << QString("Wallet open error: %1").arg(err); + QMessageBox::warning(this, "Wallet open error", err); + this->setWindowTitle("Feather"); + this->showWizard(WalletWizard::Page_OpenWallet); +} + +void MainWindow::onWalletCreated(Wallet *wallet) { + qDebug() << Q_FUNC_INFO; + // emit signal on behalf of walletManager + m_ctx->walletManager->walletOpened(wallet); +} + +void MainWindow::onWalletOpened() { + qDebug() << Q_FUNC_INFO; + if(m_wizard != nullptr) { + m_wizard->hide(); + m_wizard->disconnect(); + m_wizard->deleteLater(); + } + + this->raise(); + this->show(); + this->activateWindow(); + this->setEnabled(true); + if(!m_ctx->tor->torConnected) + m_statusLabelStatus->setText("Wallet opened - Starting Tor (may take a while)"); + else + m_statusLabelStatus->setText("Wallet opened - Searching for node"); + + // window title as wallet name + QFileInfo fileInfo(m_ctx->walletPath); + this->setWindowTitle(QString("Feather - [%1]").arg(fileInfo.fileName())); + + connect(m_ctx->currentWallet, &Wallet::connectionStatusChanged, this, &MainWindow::onConnectionStatusChanged); + + // receive page + m_ctx->currentWallet->subaddress()->refresh( m_ctx->currentWallet->currentSubaddressAccount()); + ui->receiveWidget->setModel( m_ctx->currentWallet->subaddressModel(), m_ctx->currentWallet->subaddress()); + if (m_ctx->currentWallet->subaddress()->count() == 1) { + for (int i = 0; i < 10; i++) { + m_ctx->currentWallet->subaddress()->addRow(m_ctx->currentWallet->currentSubaddressAccount(), ""); + } + } + connect(m_ctx->currentWallet->subaddress(), &Subaddress::labelChanged, [this]{ + m_ctx->storeWallet(); + }); + + // history page + m_ctx->currentWallet->history()->refresh(m_ctx->currentWallet->currentSubaddressAccount()); + ui->historyWidget->setModel(m_ctx->currentWallet->coins(), m_ctx->currentWallet->historyModel(), m_ctx->currentWallet->history()); + connect(m_ctx->currentWallet->history(), &TransactionHistory::txNoteChanged, [this]{ + m_ctx->storeWallet(); + }); + + // contacts widget + ui->contactWidget->setModel(m_ctx->currentWallet->addressBookModel()); + connect(m_ctx->currentWallet->addressBook(), &AddressBook::descriptionChanged, [this]{ + m_ctx->storeWallet(); + }); + + // coins page + m_ctx->currentWallet->coins()->refresh(m_ctx->currentWallet->currentSubaddressAccount()); + ui->coinsWidget->setModel(m_ctx->currentWallet->coinsModel(), m_ctx->currentWallet->coins()); + connect(m_ctx->currentWallet->coins(), &Coins::coinFrozen, [this]{ + m_ctx->storeWallet(); + }); + connect(m_ctx->currentWallet->coins(), &Coins::coinThawed, [this]{ + m_ctx->storeWallet(); + }); +} + +void MainWindow::onBalanceUpdated(double balance, double unlocked, const QString &balance_str, const QString &unlocked_str) { + qDebug() << Q_FUNC_INFO; + auto label_str = QString("Balance: %1 XMR").arg(unlocked_str); + if(balance > unlocked) + label_str += QString(" (+%1 XMR unconfirmed)").arg(balance - unlocked); + m_statusLabelBalance->setText(label_str); +} + +void MainWindow::onSynchronized() { + m_statusLabelStatus->setText("Synchronized"); + this->onConnectionStatusChanged(Wallet::ConnectionStatus_Connected); +} + +void MainWindow::onBlockchainSync(int height, int target) { + QString heightText = QString("Blockchain sync: %1/%2").arg(height).arg(target); + m_statusLabelStatus->setText(heightText); +} + +void MainWindow::onRefreshSync(int height, int target) { + QString heightText = QString("Wallet refresh: %1/%2").arg(height).arg(target); + m_statusLabelStatus->setText(heightText); +} + +void MainWindow::onConnectionStatusChanged(int status) +{ + qDebug() << "Wallet connection status changed " << status; + + // Update connection info in status bar. + + QString statusIcon; + QString statusMsg; + switch(status){ + case Wallet::ConnectionStatus_Disconnected: + statusIcon = ":/assets/images/status_disconnected.svg"; + m_statusLabelStatus->setText("Disconnected"); + break; + case Wallet::ConnectionStatus_Connected: + if (m_ctx->currentWallet->synchronized()) { + statusIcon = ":/assets/images/status_connected.svg"; + } else { + statusIcon = ":/assets/images/status_waiting.svg"; + } + break; + case Wallet::ConnectionStatus_Connecting: + statusIcon = ":/assets/images/status_lagging.svg"; + m_statusLabelStatus->setText("Connecting to daemon"); + break; + case Wallet::ConnectionStatus_WrongVersion: + statusIcon = ":/assets/images/status_disconnected.svg"; + m_statusLabelStatus->setText("Incompatible daemon"); + break; + default: + statusIcon = ":/assets/images/status_disconnected.svg"; + break; + } + + m_statusBtnConnectionStatusIndicator->setIcon(QIcon(statusIcon)); +} + +void MainWindow::onCreateTransactionSuccess(PendingTransaction *tx, const QString &address, const quint32 &mixin) { + auto tx_status = tx->status(); + auto err = QString("Can't create transaction: "); + + if(tx_status != PendingTransaction::Status_Ok){ + auto tx_err = tx->errorString(); + qCritical() << tx_err; + + if(m_ctx->currentWallet->connected() == Wallet::ConnectionStatus_WrongVersion) + err = QString("%1 Wrong daemon version: %2").arg(err).arg(tx_err); + else + err = QString("%1 %2").arg(err).arg(tx_err); + + qDebug() << Q_FUNC_INFO << err; + Utils::showMessageBox("Transaction error", err, true); + m_ctx->currentWallet->disposeTransaction(tx); + } else if (tx->txCount() == 0) { + err = QString("%1 %2").arg(err).arg("No unmixable outputs to sweep."); + qDebug() << Q_FUNC_INFO << err; + Utils::showMessageBox("Transaction error", err, true); + m_ctx->currentWallet->disposeTransaction(tx); + } else { + const auto &description = m_ctx->tmpTxDescription; + + auto *dialog = new TxConfDialog(tx, address, description, mixin, this); + switch (dialog->exec()) { + case QDialog::Rejected: + m_ctx->onCancelTransaction(tx, address); + break; + case QDialog::Accepted: + m_ctx->currentWallet->commitTransactionAsync(tx); + break; + } + } +} + +void MainWindow::onTransactionCommitted(bool status, PendingTransaction *tx, const QStringList& txid) { + if(status) { // success + QString body = QString("Successfully sent %1 transaction(s).").arg(txid.count()); + QMessageBox::information(this, "Transactions sent", body); + ui->sendWidget->clearFields(); + + for(const auto &entry: txid) { + m_ctx->currentWallet->setUserNote(entry, m_ctx->tmpTxDescription); + AppContext::txDescriptionCache[entry] = m_ctx->tmpTxDescription; + } + + m_ctx->tmpTxDescription = ""; + } else { + auto err = tx->errorString(); + QString body = QString("Error committing transaction: %1").arg(err); + QMessageBox::warning(this, "Transaction failed", body); + } +} + +void MainWindow::onCreateTransactionError(const QString &message) { + auto msg = QString("Error while creating transaction: %1").arg(message); + + if (msg.contains("failed to get random outs")) { + msg += "\n\nYour transaction has too many inputs. Try sending a lower amount."; + } + + QMessageBox::warning(this, "Transaction failed", msg); +} + +void MainWindow::create_status_bar() { + this->statusBar()->setFixedHeight(30); + + m_statusLabelStatus = new QLabel("Idle", this); + m_statusLabelStatus->setTextInteractionFlags(Qt::TextSelectableByMouse); + this->statusBar()->addWidget(m_statusLabelStatus); + + m_statusLabelBalance = new QLabel("Balance: 0.00 XMR", this); + m_statusLabelBalance->setTextInteractionFlags(Qt::TextSelectableByMouse); + this->statusBar()->addPermanentWidget(m_statusLabelBalance); + + m_statusBtnConnectionStatusIndicator = new StatusBarButton(QIcon(":/assets/images/status_disconnected.svg"), "Connection status"); + connect(m_statusBtnConnectionStatusIndicator, &StatusBarButton::clicked, this, &MainWindow::showConnectionStatusDialog); + this->statusBar()->addPermanentWidget(m_statusBtnConnectionStatusIndicator); + + m_statusBtnPassword = new StatusBarButton(QIcon(":/assets/images/lock.svg"), "Password"); + connect(m_statusBtnPassword, &StatusBarButton::clicked, this, &MainWindow::showPasswordDialog); + this->statusBar()->addPermanentWidget(m_statusBtnPassword); + + m_statusBtnPreferences = new StatusBarButton(QIcon(":/assets/images/preferences.svg"), "Settings"); + connect(m_statusBtnPreferences, &StatusBarButton::clicked, this, &MainWindow::menuSettingsClicked); + this->statusBar()->addPermanentWidget(m_statusBtnPreferences); + + m_statusBtnSeed = new StatusBarButton(QIcon(":/assets/images/seed.png"), "Seed"); + connect(m_statusBtnSeed, &StatusBarButton::clicked, this, &MainWindow::showSeedDialog); + this->statusBar()->addPermanentWidget(m_statusBtnSeed); + + m_statusBtnTor = new StatusBarButton(QIcon(":/assets/images/tor_logo_disabled.png"), "Tor"); + connect(m_statusBtnTor, &StatusBarButton::clicked, this, &MainWindow::menuTorClicked); + this->statusBar()->addPermanentWidget(m_statusBtnTor); +} + +void MainWindow::showWalletInfoDialog() { + auto *dialog = new WalletInfoDialog(m_ctx, this); + dialog->exec(); + dialog->deleteLater(); +} + +void MainWindow::showSeedDialog() { + QString seed = m_ctx->currentWallet->getCacheAttribute("feather.seed"); + if (seed.isEmpty()) { + seed = m_ctx->currentWallet->getSeed(); + } + + auto *dialog = new SeedDialog(seed, this); + dialog->exec(); + dialog->deleteLater(); +} + +void MainWindow::showConnectionStatusDialog() { + auto status = m_ctx->currentWallet->connected(true); + bool synchronized = m_ctx->currentWallet->synchronized(); + + QString statusMsg; + switch(status){ + case Wallet::ConnectionStatus_Disconnected: + statusMsg = "Wallet is disconnected from daemon."; + break; + case Wallet::ConnectionStatus_Connected: { + auto node = m_ctx->nodes->connection(); + statusMsg = QString("Wallet is connected to %1").arg(node.full); + if (synchronized) + statusMsg += " and synchronized"; + break; + } + case Wallet::ConnectionStatus_Connecting: { + auto node = m_ctx->nodes->connection(); + statusMsg = QString("Wallet is connecting to %1").arg(node.full); + break; + } + case Wallet::ConnectionStatus_WrongVersion: + statusMsg = "Wallet is connected to incompatible daemon."; + break; + default: + statusMsg = "Unknown connection status (this should never happen)."; + } + + QMessageBox::information(this, "Connection Status", statusMsg); +} + +void MainWindow::showPasswordDialog() { + auto *pdialog = new PasswordChangeDialog(this); + int ret = pdialog->exec(); + if (!ret) return; + + QApplication::setActiveWindow(this); + + QString currentPassword = pdialog->getCurrentPassword(); + QString newPassword = pdialog->getNewPassword(); + + if (currentPassword != m_ctx->walletPassword) { + QMessageBox::warning(this, "Error", "Incorrect password"); + return; + } + + if (m_ctx->currentWallet->setPassword(newPassword)) { + QMessageBox::information(this, "Information", "Password changed successfully"); + } + else { + QMessageBox::warning(this, "Error", QString("Error: %1").arg(m_ctx->currentWallet->errorString())); + } + + pdialog->deleteLater(); +} + +void MainWindow::showRestoreHeightDialog() { + // settings custom restore height is only available for 25 word seeds + auto seed = m_ctx->currentWallet->getCacheAttribute("feather.seed"); + if(!seed.isEmpty()) { + const auto msg = "This wallet has a 14 word mnemonic seed which has the restore height embedded."; + QMessageBox::warning(this, "Cannot set custom restore height", msg); + return; + } + + m_restoreDialog = new RestoreDialog(m_ctx, this); + m_restoreDialog->show(); + + connect(m_restoreDialog, &RestoreDialog::accepted, [=]{ + auto height = m_restoreDialog->getHeight(); + m_restoreDialog->disconnect(); + m_restoreDialog->deleteLater(); + m_ctx->onSetRestoreHeight(height); + }); + + connect(m_restoreDialog, &RestoreDialog::rejected, [=]{ + m_restoreDialog->disconnect(); + m_restoreDialog->deleteLater(); + }); +} + +void MainWindow::showKeysDialog() { + auto *dialog = new KeysDialog(m_ctx, this); + dialog->exec(); + dialog->deleteLater(); +} + +void MainWindow::menuTorClicked() { + + auto *dialog = new TorInfoDialog(m_ctx, this); + connect(m_ctx->tor, &Tor::logsUpdated, dialog, &TorInfoDialog::onLogsUpdated); + dialog->exec(); + disconnect(m_ctx->tor, &Tor::logsUpdated, dialog, &TorInfoDialog::onLogsUpdated); + dialog->deleteLater(); +} + +void MainWindow::menuNewRestoreClicked() { + // TODO: implement later +} + +void MainWindow::menuQuitClicked() { + QCoreApplication::quit(); +} + +void MainWindow::menuWalletCloseClicked() { + if(m_ctx->currentWallet == nullptr) return; + m_ctx->walletClose(true); +} + +void MainWindow::menuWalletOpenClicked() { + auto walletPath = config()->get(Config::walletPath).toString(); + if(walletPath.isEmpty()) + walletPath = m_ctx->defaultWalletDir; + QString path = QFileDialog::getOpenFileName(this, "Select your wallet file", walletPath, "Wallet file (*.keys)"); + if(path.isEmpty()) return; + + QFileInfo infoPath(path); + if(!infoPath.isReadable()) { + Utils::showMessageBox("Cannot read wallet file", "Permission error.", true); + return; + } + + if(path == m_ctx->walletPath) { + Utils::showMessageBox("Wallet already opened", "Please open another wallet.", true); + return; + } + + m_ctx->walletClose(false); + emit walletClosed(); + m_ctx->onOpenWallet(path, ""); +} + +void MainWindow::menuAboutClicked() { + m_aboutDialog->show(); +} + +void MainWindow::menuSettingsClicked() { + m_windowSettings->show(); +} + +void MainWindow::menuSignVerifyClicked() { + auto *dialog = new SignVerifyDialog(m_ctx->currentWallet, this); + dialog->exec(); + dialog->deleteLater(); +} + +void MainWindow::menuVerifyTxProof() { + auto *dialog = new VerifyProofDialog(m_ctx->currentWallet, this); + dialog->exec(); + dialog->deleteLater(); +} + +void MainWindow::skinChanged(const QString &skinName) { + if(!m_skins.contains(skinName)) { + qWarning() << QString("No such skin %1").arg(skinName); + return; + } + + config()->set(Config::skin, skinName); + qApp->setStyleSheet(m_skins[skinName]); + qDebug() << QString("Skin changed to %1").arg(skinName); +} + +void MainWindow::homeWidgetChanged(const QString &widgetName) { + if(widgetName == "ccs"){ + m_ccsWidget->show(); + m_redditWidget->hide(); + } else if(widgetName == "reddit") { + m_ccsWidget->hide(); + m_redditWidget->show(); + } +} + +void MainWindow::closeEvent(QCloseEvent *event) { + this->saveGeo(); + if(m_wizard != nullptr) + m_wizard->close(); + + QWidget::closeEvent(event); +} + +void MainWindow::donateButtonClicked() { + double donation = AppContext::prices->convert("EUR", "XMR", m_ctx->featherDonationAmount); + if(donation <= 0) + donation = 1.337; + + ui->sendWidget->fill(m_ctx->featherDonationAddress, "Donation to the Feather development team", donation); + ui->tabWidget->setCurrentIndex(2); +} + +void MainWindow::showHistoryTab() { + this->raise(); + ui->tabWidget->setCurrentIndex(1); +} + +void MainWindow::showSendTab() { + this->raise(); + ui->tabWidget->setCurrentIndex(2); +} + +void MainWindow::showCalcWindow() { + m_windowCalc->show(); +} + +void MainWindow::showSendScreen(const CCSEntry &entry) { + ui->sendWidget->fill(entry); + ui->tabWidget->setCurrentIndex(2); +} + +void MainWindow::onViewOnBlockExplorer(const QString &txid) { + QString blockExplorerLink = Utils::blockExplorerLink(config()->get(Config::blockExplorer).toString(), m_ctx->networkType, txid); + Utils::externalLinkWarning(blockExplorerLink); +} + +void MainWindow::onAddContact(const QString &address, const QString &name) { + bool addressValid = WalletManager::addressValid(address, m_ctx->currentWallet->nettype()); + if (!addressValid) + QMessageBox::warning(this, "Invalid address", "Invalid address"); + else { + m_ctx->currentWallet->addressBook()->addRow(address, "", name); + m_ctx->storeWallet(); + } +} + +MainWindow *MainWindow::getInstance() { + return pMainWindow; +} + +AppContext *MainWindow::getContext(){ + return pMainWindow->m_ctx; +} + +void MainWindow::loadSkins() { + QString qdarkstyle = this->loadStylesheet(":qdarkstyle/style.qss"); + if (!qdarkstyle.isEmpty()) + m_skins.insert("QDarkStyle", qdarkstyle); + + QString breeze_dark = this->loadStylesheet(":/dark.qss"); + if (!breeze_dark.isEmpty()) + m_skins.insert("Breeze/Dark", breeze_dark); + + QString breeze_light = this->loadStylesheet(":/light.qss"); + if (!breeze_light.isEmpty()) + m_skins.insert("Breeze/Light", breeze_light); +} + +QString MainWindow::loadStylesheet(const QString &resource) { + QFile f(resource); + if (!f.exists()) { + printf("Unable to set stylesheet, file not found\n"); + f.close(); + return ""; + } + + f.open(QFile::ReadOnly | QFile::Text); + QTextStream ts(&f); + QString data = ts.readAll(); + f.close(); + + return data; +} + +void MainWindow::saveGeo() { + config()->set(Config::geometry, QString(saveGeometry().toBase64())); + config()->set(Config::windowState, QString(saveState().toBase64())); +} + +void MainWindow::restoreGeo() { + bool geo = this->restoreGeometry(QByteArray::fromBase64(config()->get(Config::geometry).toByteArray())); + bool windowState = this->restoreState(QByteArray::fromBase64(config()->get(Config::windowState).toByteArray())); + qDebug() << "Restored window state: " << geo << " " << windowState; +} + +void MainWindow::showDebugInfo() { + auto *dialog = new DebugInfoDialog(m_ctx, this); + dialog->exec(); + dialog->deleteLater(); +} + +void MainWindow::showNodeExhaustedMessage() { + // Spawning dialogs inside a lambda can cause system freezes on linux so we have to do it this way ¯\_(ツ)_/¯ + + auto msg = "Feather is in 'custom node connection mode' but could not " + "find an eligible node to connect to. Please go to Settings->Node " + "and enter a node manually."; + QMessageBox::warning(this, "Could not connect to a node", msg); +} + +void MainWindow::showWSNodeExhaustedMessage() { + auto msg = "Feather is in 'automatic node connection mode' but the " + "websocket server returned none available nodes. Please go to Settings->Node " + "and enter a node manually."; + QMessageBox::warning(this, "Could not connect to a node", msg); +} + +MainWindow::~MainWindow() { + delete ui; +} diff --git a/src/mainwindow.h b/src/mainwindow.h new file mode 100644 index 0000000..2d7d791 --- /dev/null +++ b/src/mainwindow.h @@ -0,0 +1,179 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "components.h" +#include "calcwindow.h" +#include "widgets/ccswidget.h" +#include "widgets/redditwidget.h" +#include "widgets/tickerwidget.h" +#include "utils/networking.h" +#include "appcontext.h" +#include "utils/config.h" +#include "wizard/walletwizard.h" +#include "settings.h" +#include "dialog/aboutdialog.h" +#include "dialog/signverifydialog.h" +#include "dialog/verifyproofdialog.h" +#include "dialog/seeddialog.h" +#include "dialog/passwordchangedialog.h" +#include "dialog/keysdialog.h" +#include "dialog/aboutdialog.h" +#include "dialog/restoredialog.h" + +namespace Ui { + class MainWindow; +} + +struct ToggleTab { + ToggleTab(QWidget *tab, const QString &name, const QString &description, QAction *menuAction, Config::ConfigKey configKey) : + tab(tab), key(name), name(description), menuAction(menuAction), configKey(configKey){} + QWidget *tab; + QString key; + QString name; + QAction *menuAction; + Config::ConfigKey configKey; +}; + +class MainWindow : public QMainWindow +{ +Q_OBJECT + +public: + explicit MainWindow(AppContext *ctx, QWidget *parent = nullptr); + static MainWindow *getInstance(); + static AppContext *getContext(); + ~MainWindow() override; + + qreal screenDpiRef; + QRect screenGeo; + QRect screenRect; + qreal screenDpi; + qreal screenDpiPhysical; + qreal screenRatio; + +public slots: + void initWidgets(); + void initMenu(); + void showWizard(WalletWizard::Page startPage); + void menuNewRestoreClicked(); + void menuQuitClicked(); + void menuSettingsClicked(); + void menuAboutClicked(); + void menuSignVerifyClicked(); + void menuVerifyTxProof(); + void showWalletInfoDialog(); + void showSeedDialog(); + void showConnectionStatusDialog(); + void showPasswordDialog(); + void showKeysDialog(); + void donateButtonClicked(); + void showCalcWindow(); + void showSendTab(); + void showHistoryTab(); + void showSendScreen(const CCSEntry &entry); + void homeWidgetChanged(const QString &widgetName); + void skinChanged(const QString &skinName); + void menuTorClicked(); + void onBlockchainSync(int height, int target); + void onRefreshSync(int height, int target); + void onWalletOpenedError(const QString &err); + void onWalletCreatedError(const QString &err); + void onWalletCreated(Wallet *wallet); + void menuWalletCloseClicked(); + void menuWalletOpenClicked(); + void onWalletOpenPasswordRequired(bool invalidPassword); + void onViewOnBlockExplorer(const QString &txid); + void onAddContact(const QString &address, const QString &name); + void showRestoreHeightDialog(); + + // libwalletqt + void onBalanceUpdated(double balance, double unlocked, const QString &balance_str, const QString &unlocked_str); + void onSynchronized(); + void onWalletOpened(); + void onWalletClosed(); + void onWalletClosed(WalletWizard::Page page); + void onConnectionStatusChanged(int status); + void onCreateTransactionError(const QString &message); + void onCreateTransactionSuccess(PendingTransaction *tx, const QString &address, const quint32 &mixin); + void onTransactionCommitted(bool status, PendingTransaction *tx, const QStringList& txid); + +signals: + void walletClosed(); + void closed(); + +private: + AppContext *m_ctx; + + static MainWindow * pMainWindow; + void closeEvent(QCloseEvent *event) override; + void create_status_bar(); + void initMain(); + void loadSkins(); + QString loadStylesheet(const QString &resource); + void saveGeo(); + void restoreGeo(); + void showDebugInfo(); + void showNodeExhaustedMessage(); + void showWSNodeExhaustedMessage(); + + WalletWizard *createWizard(WalletWizard::Page startPage); + + Ui::MainWindow *ui; + Settings *m_windowSettings = nullptr; + CalcWindow *m_windowCalc = nullptr; + SignVerifyDialog *m_windowSignVerify = nullptr; + RestoreDialog *m_restoreDialog = nullptr; + AboutDialog *m_aboutDialog = nullptr; + + bool m_windowSpawned = false; + + CCSWidget *m_ccsWidget = nullptr; + RedditWidget *m_redditWidget = nullptr; + + QSystemTrayIcon *m_trayIcon; + QMenu m_trayMenu; + QAction *m_trayActionCalc; + QAction *m_trayActionExit; + QAction *m_trayActionSend; + QAction *m_trayActionHistory; + + QList m_tickerWidgets; + TickerWidget *m_balanceWidget; + + // lower status bar + QLabel *m_statusLabelBalance; + QLabel *m_statusLabelStatus; + StatusBarButton *m_statusBtnConnectionStatusIndicator; + StatusBarButton *m_statusBtnPassword; + StatusBarButton *m_statusBtnPreferences; + StatusBarButton *m_statusBtnSeed; + StatusBarButton *m_statusBtnTor; + + SubaddressProxyModel *subaddressProxyModel; + TransactionHistoryModel *txHistModel; + CoinsModel *coinsModel; + + QSignalMapper *m_tabShowHideSignalMapper; + QMap m_tabShowHideMapper; + WalletWizard *m_wizard = nullptr; + + QMap m_skins; + +private slots: + void menuToggleTabVisible(const QString &key); +}; + +#endif // MAINWINDOW_H diff --git a/src/mainwindow.ui b/src/mainwindow.ui new file mode 100644 index 0000000..3cc0d83 --- /dev/null +++ b/src/mainwindow.ui @@ -0,0 +1,571 @@ + + + MainWindow + + + + 0 + 0 + 894 + 496 + + + + + 0 + 0 + + + + Feather + + + + :/assets/images/appicons/64x64.png:/assets/images/appicons/64x64.png + + + + + 0 + + + 2 + + + 0 + + + 0 + + + 12 + + + + + 0 + + + + 16 + 16 + + + + + + :/assets/images/tab_home.png:/assets/images/tab_home.png + + + Home + + + + 5 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + Qt::Horizontal + + + + + + + 9 + + + + + Qt::Vertical + + + + 0 + 40 + + + + + + + + + + + + :/assets/images/history.png:/assets/images/history.png + + + History + + + + 9 + + + + + + + + + + 0 + 0 + + + + + :/assets/images/tab_send.png:/assets/images/tab_send.png + + + Send + + + + 11 + + + 11 + + + + + + 0 + 0 + + + + + 0 + 100 + + + + + 16777215 + 16777215 + + + + + + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + + + + + + + + + + :/assets/images/coins.png:/assets/images/coins.png + + + Receive + + + + + + + + + + + :/assets/images/tab_coins.png:/assets/images/tab_coins.png + + + Coins + + + + + + + + + + + :/assets/images/xmrto.png:/assets/images/xmrto.png + + + xmr.to + + + + 0 + + + 0 + + + 0 + + + 1 + + + + + + + + Qt::Vertical + + + QSizePolicy::Preferred + + + + 20 + 0 + + + + + + + + + + :/assets/images/coldcard.png:/assets/images/coldcard.png + + + Calc + + + + + + + + + + + + + + + + 0 + 0 + 894 + 30 + + + + + File + + + + + + + + + + Wallet + + + + History + + + + + + Contacts + + + + + + Advanced + + + + + + + + + + + + + + + + + + + Tools + + + + + + + + + + Help + + + + + + + + + + + + View + + + + + + + + + + + + + + Open wallet + + + + + Quit application + + + + + Network + + + + + Sign/verify message + + + + + About + + + + + Official website + + + + + Settings + + + + + Calculator + + + + + Information + + + + + Password + + + + + Seed + + + + + Report bug + + + + + Donate to Feather + + + + + Export CSV + + + + + Show Coins + + + + + Show Xmr.To + + + + + Show Calc + + + + + Close current wallet + + + + + Verify transaction proof + + + + + Save wallet + + + + + Update balance + + + + + Refresh models + + + + + Export CSV + + + + + Change restore height + + + + + Keys + + + + + About Qt + + + + + Create desktop entry + + + + + Debug info + + + + + + + SendWidget + QWidget +
        sendwidget.h
        + 1 +
        + + ContactsWidget + QWidget +
        contactswidget.h
        + 1 +
        + + ReceiveWidget + QWidget +
        receivewidget.h
        + 1 +
        + + CoinsWidget + QWidget +
        coinswidget.h
        + 1 +
        + + HistoryWidget + QWidget +
        historywidget.h
        +
        + + XMRToWidget + QWidget +
        xmrtowidget.h
        + 1 +
        + + CalcWidget + QWidget +
        calcwidget.h
        + 1 +
        +
        + + + + + + donateButtonClicked() + calcButtonClicked() + +
        diff --git a/src/model/AddressBookModel.cpp b/src/model/AddressBookModel.cpp new file mode 100644 index 0000000..a924fec --- /dev/null +++ b/src/model/AddressBookModel.cpp @@ -0,0 +1,176 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#include "AddressBookModel.h" +#include "AddressBook.h" +#include "ModelUtils.h" +#include "utils/utils.h" +#include + +#include +#include +#include +#include + +AddressBookModel::AddressBookModel(QObject *parent, AddressBook *addressBook) + : QAbstractTableModel(parent), + m_addressBook(addressBook), + m_showFullAddresses(false) +{ + connect(m_addressBook, &AddressBook::refreshStarted, this, &AddressBookModel::startReset); + connect(m_addressBook, &AddressBook::refreshFinished, this, &AddressBookModel::endReset); + m_contactIcon = QIcon(":/assets/images/person.svg"); +} + +void AddressBookModel::startReset(){ + beginResetModel(); +} + +void AddressBookModel::endReset(){ + endResetModel(); +} + +int AddressBookModel::rowCount(const QModelIndex &) const +{ + return m_addressBook->count(); +} + +int AddressBookModel::columnCount(const QModelIndex &parent) const +{ + if (parent.isValid()) { + return 0; + } + return COUNT; +} + +bool AddressBookModel::isShowFullAddresses() const { + return m_showFullAddresses; +} + +void AddressBookModel::setShowFullAddresses(bool show) +{ + m_showFullAddresses = show; + emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1)); +} + +bool AddressBookModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (index.isValid() && role == Qt::EditRole) { + const int row = index.row(); + + switch (index.column()) { + case Description: + m_addressBook->setDescription(row, value.toString()); + break; + default: + return false; + } + emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole}); + + return true; + } + return false; +} + +QVariant AddressBookModel::data(const QModelIndex &index, int role) const +{ + QVariant result; + + bool found = m_addressBook->getRow(index.row(), [this, &result, &role, &index](const AddressBookInfo &row) { + if (role == Qt::DisplayRole || role == Qt::EditRole || role == Qt::UserRole) { + switch (index.column()) { + case Address: + { + QString address = row.address(); + if (!m_showFullAddresses && role != Qt::UserRole) { + address = ModelUtils::displayAddress(address); + } + result = address; + break; + } + case Description: + result = row.description(); + break; + default: + qCritical() << "Invalid column" << index.column(); + } + } + else if (role == Qt::FontRole) { + switch (index.column()) { + case Address: + result = ModelUtils::getMonospaceFont(); + } + } + else if (role == Qt::DecorationRole) { + switch (index.column()) { + case Description: { + return QVariant(m_contactIcon); // @TODO: does not actually work + } + default: { + return QVariant(); + } + } + } + return QVariant(); + }); + if (!found) { + qCritical("%s: internal error: invalid index %d", __FUNCTION__, index.row()); + } + + return result; +} + +Qt::ItemFlags AddressBookModel::flags(const QModelIndex &index) const +{ + if (!index.isValid()) + return Qt::ItemIsEnabled; + + if (index.column() == Description) + return QAbstractTableModel::flags(index) | Qt::ItemIsEditable; + + return QAbstractTableModel::flags(index); +} + +QVariant AddressBookModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (role != Qt::DisplayRole) { + return QVariant(); + } + if (orientation == Qt::Horizontal) + { + switch(section) { + case Address: + return QString("Address"); + case Description: + return QString("Name"); + default: + return QVariant(); + } + } + return QVariant(); +} + +bool AddressBookModel::deleteRow(int row) +{ + return m_addressBook->deleteRow(row); +} + +int AddressBookModel::lookupPaymentID(const QString &payment_id) const +{ + return m_addressBook->lookupPaymentID(payment_id); +} + +bool AddressBookModel::writeCSV(const QString &path) { + QString csv = ""; + for(int i = 0; i < this->rowCount(); i++) { + QModelIndex index = this->index(i, 0); + const auto description = this->data(index.siblingAtColumn(AddressBookModel::Description), Qt::UserRole).toString().replace("\"", ""); + const auto address = this->data(index.siblingAtColumn(AddressBookModel::Address), Qt::UserRole).toString(); + if(address.isEmpty()) continue; + csv += QString("%1,\"%2\"\n").arg(address).arg(description); + } + if(csv.isEmpty()) + return false; + csv = QString("address,description\n%1").arg(csv); + return Utils::fileWrite(path, csv); +} diff --git a/src/model/AddressBookModel.h b/src/model/AddressBookModel.h new file mode 100644 index 0000000..109c897 --- /dev/null +++ b/src/model/AddressBookModel.h @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef ADDRESSBOOKMODEL_H +#define ADDRESSBOOKMODEL_H + +#include +#include + +class AddressBook; + +class AddressBookModel : public QAbstractTableModel +{ + Q_OBJECT + +public: + enum ModelColumn + { + Address = 0, + Description, + COUNT + }; + + AddressBookModel(QObject *parent, AddressBook * addressBook); + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; + Qt::ItemFlags flags(const QModelIndex &index) const override; + bool setData(const QModelIndex &index, const QVariant &value, int role) override; + + Q_INVOKABLE bool deleteRow(int row); + Q_INVOKABLE int lookupPaymentID(const QString &payment_id) const; + + bool isShowFullAddresses() const; + void setShowFullAddresses(bool show); + bool writeCSV(const QString &path); + +public slots: + void startReset(); + void endReset(); + +private: + AddressBook * m_addressBook; + QIcon m_contactIcon; + bool m_showFullAddresses; +}; + +#endif // ADDRESSBOOKMODEL_H diff --git a/src/model/AddressBookProxyModel.cpp b/src/model/AddressBookProxyModel.cpp new file mode 100644 index 0000000..a6c81fe --- /dev/null +++ b/src/model/AddressBookProxyModel.cpp @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "AddressBookProxyModel.h" +#include "AddressBookModel.h" + +AddressBookProxyModel::AddressBookProxyModel(QObject *parent) + : QSortFilterProxyModel(parent), + m_searchRegExp("") +{ + m_searchRegExp.setCaseSensitivity(Qt::CaseInsensitive); + m_searchRegExp.setPatternSyntax(QRegExp::RegExp); +} + +bool AddressBookProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const +{ + QModelIndex addressIndex = sourceModel()->index(sourceRow, AddressBookModel::Address, sourceParent); + QModelIndex descriptionIndex = sourceModel()->index(sourceRow, AddressBookModel::Description, sourceParent); + + QString addressData = sourceModel()->data(addressIndex, Qt::UserRole).toString(); + QString descriptionData = sourceModel()->data(descriptionIndex).toString(); + + return (addressData.contains(m_searchRegExp) || descriptionData.contains(m_searchRegExp)); +} \ No newline at end of file diff --git a/src/model/AddressBookProxyModel.h b/src/model/AddressBookProxyModel.h new file mode 100644 index 0000000..1ce2743 --- /dev/null +++ b/src/model/AddressBookProxyModel.h @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_ADDRESSBOOKPROXYMODEL_H +#define FEATHER_ADDRESSBOOKPROXYMODEL_H + +#include + +class AddressBookProxyModel : public QSortFilterProxyModel +{ + Q_OBJECT + +public: + explicit AddressBookProxyModel(QObject* parent = nullptr); + bool filterAcceptsRow(int sourceRow, + const QModelIndex &sourceParent) const override; + +public slots: + void setSearchFilter(const QString& searchString){ + m_searchRegExp.setPattern(searchString); + invalidateFilter(); + } + +private: + QRegExp m_searchRegExp; +}; + +#endif //FEATHER_ADDRESSBOOKPROXYMODEL_H diff --git a/src/model/CCSModel.cpp b/src/model/CCSModel.cpp new file mode 100644 index 0000000..3537294 --- /dev/null +++ b/src/model/CCSModel.cpp @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "CCSModel.h" + +CCSModel::CCSModel(QObject *parent) + : QAbstractTableModel(parent) +{ + +} + +void CCSModel::clear() { + beginResetModel(); + + m_entries.clear(); + + endResetModel(); +} + +void CCSModel::updateEntries(const QList>& entries) { + beginResetModel(); + + m_entries.clear(); + for (const auto& entry : entries) { + if (entry->raised_amount > entry->target_amount) + continue; + m_entries.push_back(entry); + } + + endResetModel(); +} + +int CCSModel::rowCount(const QModelIndex &parent) const{ + if (parent.isValid()) { + return 0; + } + return m_entries.count(); +} + +int CCSModel::columnCount(const QModelIndex &parent) const +{ + if (parent.isValid()) { + return 0; + } + return ModelColumn::COUNT; +} + +QVariant CCSModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() < 0 || index.row() >= m_entries.count()) + return QVariant(); + + QSharedPointer entry = m_entries.at(index.row()); + + if(role == Qt::DisplayRole) { + switch(index.column()) { + case Title: + return entry->title; + case Author: + return entry->author; +#ifdef Q_OS_MACOS + case Progress: + return QString("%1/%2 XMR").arg(entry->raised_amount).arg(entry->target_amount); +#endif + default: + return QVariant(); + } + } + return QVariant(); +} + +QVariant CCSModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (role != Qt::DisplayRole) { + return QVariant(); + } + if (orientation == Qt::Horizontal) + { + switch(section) { + case Title: + return QString("Community Crowdfunding Proposal"); + case Author: + return QString("Author"); + case Progress: + return QString("Progress"); + default: + return QVariant(); + } + } + return QVariant(); +} + +QSharedPointer CCSModel::entry(int row) { + if (row < 0 || row >= m_entries.size()) { + qCritical("%s: no reddit post for index %d", __FUNCTION__, row); + return QSharedPointer(); + } + + return m_entries.at(row); +} \ No newline at end of file diff --git a/src/model/CCSModel.h b/src/model/CCSModel.h new file mode 100644 index 0000000..c5421ac --- /dev/null +++ b/src/model/CCSModel.h @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_CCSMODEL_H +#define FEATHER_CCSMODEL_H + +#include +#include + +#include "widgets/CCSEntry.h" + +class CCSModel : public QAbstractTableModel +{ +Q_OBJECT + +public: + enum ModelColumn + { + Title = 0, + Author, + Progress, + COUNT + }; + + explicit CCSModel(QObject *parent); + + int rowCount(const QModelIndex &parent) const override; + int columnCount(const QModelIndex &parent) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; + + void clear(); + void updateEntries(const QList>& entries); + + QSharedPointer entry(int row); + +private: + QList> m_entries; +}; + + +#endif //FEATHER_CCSMODEL_H diff --git a/src/model/CMakeLists.txt b/src/model/CMakeLists.txt new file mode 100644 index 0000000..9ca31c6 --- /dev/null +++ b/src/model/CMakeLists.txt @@ -0,0 +1,4 @@ +file(GLOB_RECURSE SRC_SOURCES *.cpp) +file(GLOB_RECURSE SRC_HEADERS *.h) + + diff --git a/src/model/CoinsModel.cpp b/src/model/CoinsModel.cpp new file mode 100644 index 0000000..ca788fc --- /dev/null +++ b/src/model/CoinsModel.cpp @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "CoinsModel.h" +#include "CoinsInfo.h" +#include "Coins.h" +#include +#include "ModelUtils.h" + +#include +#include +#include +#include +#include + +CoinsModel::CoinsModel(QObject *parent, Coins *coins) + : QAbstractTableModel(parent), + m_coins(coins) +{ + connect(m_coins, &Coins::refreshStarted, this, &CoinsModel::startReset); + connect(m_coins, &Coins::refreshFinished, this, &CoinsModel::endReset); +} + +void CoinsModel::startReset(){ + beginResetModel(); +} + +void CoinsModel::endReset(){ + endResetModel(); +} + +Coins * CoinsModel::coins() const { + return m_coins; +} + +int CoinsModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) { + return 0; + } else { + return m_coins->count(); + } +} + +int CoinsModel::columnCount(const QModelIndex &parent) const +{ + if (parent.isValid()) { + return 0; + } + return ModelColumn::COUNT; +} + +QVariant CoinsModel::data(const QModelIndex &index, int role) const +{ + if (!m_coins) { + return QVariant(); + } + + if (!index.isValid() || index.row() < 0 || static_cast(index.row()) >= m_coins->count()) + return QVariant(); + + QVariant result; + + bool found = m_coins->coin(index.row(), [this, &index, &result, &role](const CoinsInfo &cInfo) { + if(role == Qt::DisplayRole || role == Qt::UserRole) { + result = parseTransactionInfo(cInfo, index.column(), role); + } + else if (role == Qt::BackgroundRole) { + if (cInfo.spent()) { + result = QBrush(QColor(255, 100, 100)); + } + else if (cInfo.frozen()) { + result = QBrush(QColor(173, 216, 230)); + } + else if (!cInfo.unlocked()) { + result = QBrush(QColor("#BFFF00")); + } + } + else if (role == Qt::TextAlignmentRole) { + switch (index.column()) { + case Amount: + result = Qt::AlignRight; + } + } + else if (role == Qt::FontRole) { + switch(index.column()) { + case PubKey: + case OutputPoint: + case Address: + result = ModelUtils::getMonospaceFont(); + } + } + else if (role == Qt::ToolTipRole) { + if (cInfo.frozen()) { + result = "Output is frozen."; + } + else if (!cInfo.unlocked()) { + result = "Output is locked (needs more confirmations)"; + } + } + }); + if (!found) { + qCritical("%s: internal error: no transaction info for index %d", __FUNCTION__, index.row()); + } + return result; +} + +QVariant CoinsModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (role != Qt::DisplayRole) { + return QVariant(); + } + if (orientation == Qt::Horizontal) + { + switch(section) { + case PubKey: + return QString("Pub Key"); + case OutputPoint: + return QString("Output point"); + case BlockHeight: + return QString("Height"); + case Address: + return QString("Address"); + case AddressLabel: + return QString("Label"); + case SpentHeight: + return QString("Spent Height"); + case Amount: + return QString("Amount"); + case Spent: + return QString("Spent"); + case Frozen: + return QString("Frozen"); + default: + return QVariant(); + } + } + return QVariant(); +} + +QVariant CoinsModel::parseTransactionInfo(const CoinsInfo &cInfo, int column, int role) const +{ + switch (column) + { + case PubKey: + return cInfo.pubKey().mid(0,8); + case OutputPoint: + return cInfo.hash().mid(0, 8) + ":" + QString::number(cInfo.internalOutputIndex()); + case BlockHeight: + return cInfo.blockHeight(); + case Address: + return ModelUtils::displayAddress(cInfo.address(), 1, ""); + case AddressLabel: + { + if (cInfo.subaddrIndex() == 0) { + return cInfo.coinbase() ? "Coinbase" : "Change"; + } + return cInfo.addressLabel(); + } + case Spent: + return cInfo.spent(); + case SpentHeight: + return cInfo.spentHeight(); + case Amount: + return QString::number(cInfo.amount() / 1e12, 'f', 12); + case Frozen: + return cInfo.frozen(); + + default: + { + qCritical() << "Unimplemented role"; + return QVariant(); + } + } +} \ No newline at end of file diff --git a/src/model/CoinsModel.h b/src/model/CoinsModel.h new file mode 100644 index 0000000..db4cb3d --- /dev/null +++ b/src/model/CoinsModel.h @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_COINSMODEL_H +#define FEATHER_COINSMODEL_H + +#include + +#include +#include +#include + +class Coins; +class CoinsInfo; + +class CoinsModel : public QAbstractTableModel +{ +Q_OBJECT + +public: + enum ModelColumn + { + PubKey = 0, + OutputPoint, + Address, + AddressLabel, + BlockHeight, + SpentHeight, + Amount, + Spent, + Frozen, + COUNT + }; + + explicit CoinsModel(QObject *parent, Coins *coins); + + Coins * coins() const; + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; + +public slots: + void startReset(); + void endReset(); + +private: + QVariant parseTransactionInfo(const CoinsInfo &cInfo, int column, int role) const; + + Coins *m_coins; +}; + +#endif //FEATHER_COINSMODEL_H diff --git a/src/model/CoinsProxyModel.cpp b/src/model/CoinsProxyModel.cpp new file mode 100644 index 0000000..b9ffd8f --- /dev/null +++ b/src/model/CoinsProxyModel.cpp @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "CoinsProxyModel.h" +#include "CoinsModel.h" + +CoinsProxyModel::CoinsProxyModel(QObject *parent) + : QSortFilterProxyModel(parent) +{ +} + +bool CoinsProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const +{ + QModelIndex spentIndex = sourceModel()->index(sourceRow, CoinsModel::Spent, sourceParent); + bool isSpent = sourceModel()->data(spentIndex).toBool(); + + return !(!m_showSpent && isSpent); +} \ No newline at end of file diff --git a/src/model/CoinsProxyModel.h b/src/model/CoinsProxyModel.h new file mode 100644 index 0000000..9a71a51 --- /dev/null +++ b/src/model/CoinsProxyModel.h @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_COINSPROXYMODEL_H +#define FEATHER_COINSPROXYMODEL_H + +#include + +class CoinsProxyModel : public QSortFilterProxyModel +{ +Q_OBJECT +public: + explicit CoinsProxyModel(QObject* parent = nullptr); + bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; + +public slots: + void setShowSpent(const bool showSpent){ + m_showSpent = showSpent; + invalidateFilter(); + } + +private: + bool m_showSpent = false; +}; + +#endif //FEATHER_COINSPROXYMODEL_H diff --git a/src/model/ModelUtils.cpp b/src/model/ModelUtils.cpp new file mode 100644 index 0000000..9ac173f --- /dev/null +++ b/src/model/ModelUtils.cpp @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "ModelUtils.h" + +#include +#include +#include +#include +#include +#include +#include + +QString ModelUtils::displayAddress(const QString& address, int sections, const QString& sep) { + QStringList list; + if (sections < 1) sections = 1; + for (int i = 0; i < sections; i += 1) { + list << address.mid(i*5, 5); + } + list << "..."; + for (int i = sections; i > 0; i -= 1) { + list << address.mid(address.length() - i * 5, 5); + } + return list.join(sep); +} + +void ModelUtils::copyColumn(QModelIndex *index, int column) { + QString string(index->model()->data(index->siblingAtColumn(column), Qt::UserRole).toString()); + QClipboard * clipboard = QApplication::clipboard(); + if (!clipboard) { + qWarning() << "Unable to access clipboard"; + return; + } + clipboard->setText(string); +} + +QFont ModelUtils::getMonospaceFont() +{ + if (QFontInfo(QApplication::font()).fixedPitch()) { + return QApplication::font(); + } + return QFontDatabase::systemFont(QFontDatabase::FixedFont); +} \ No newline at end of file diff --git a/src/model/ModelUtils.h b/src/model/ModelUtils.h new file mode 100644 index 0000000..b6b8566 --- /dev/null +++ b/src/model/ModelUtils.h @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_MODELUTILS_H +#define FEATHER_MODELUTILS_H + +#include +#include + +class ModelUtils { +public: + static QString displayAddress(const QString& address, int sections = 3, const QString & sep = " "); + static void copyColumn(QModelIndex * index, int column); + static QFont getMonospaceFont(); +}; + + +#endif //FEATHER_MODELUTILS_H diff --git a/src/model/NodeModel.cpp b/src/model/NodeModel.cpp new file mode 100644 index 0000000..3b34fc7 --- /dev/null +++ b/src/model/NodeModel.cpp @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "NodeModel.h" +#include +#include "appcontext.h" + +NodeModel::NodeModel(unsigned int nodeSource, QObject *parent) + : QAbstractTableModel(parent) + , m_nodeSource(nodeSource) + , m_offline(QIcon(":/assets/images/expired.png")) + , m_online(QIcon(":/assets/images/confirmed.png")) +{ +} + +void NodeModel::clear() { + beginResetModel(); + m_nodes.clear(); + endResetModel(); +} + +void NodeModel::updateNodes(const QList nodes) { + beginResetModel(); + m_nodes.clear(); + m_nodes = nodes; + endResetModel(); +} + +int NodeModel::rowCount(const QModelIndex &parent) const{ + if (parent.isValid()) + return 0; + return m_nodes.count(); +} + +int NodeModel::columnCount(const QModelIndex &parent) const { + if (parent.isValid()) + return 0; + return m_nodeSource == NodeSource::websocket ? 2 : 1; +} + +QVariant NodeModel::data(const QModelIndex &index, int role) const { + if (!index.isValid() || index.row() < 0 || index.row() >= m_nodes.count()) + return QVariant(); + + FeatherNode node = m_nodes.at(index.row()); + + if(role == Qt::DisplayRole) { + switch(index.column()) { + case NodeModel::URL: + return node.full; + case NodeModel::Height: + if(node.online) + return node.height == 0 ? QString("-") : QString::number(node.height); + return QString("-"); + default: + return QVariant(); + } + } + else if (role == Qt::DecorationRole) { + switch (index.column()) { + case NodeModel::URL: { + if(m_nodeSource == NodeSource::websocket) + return QVariant(node.online ? m_online : m_offline); + return QVariant(); + } + default: { + return QVariant(); + } + } + } + else if(role == Qt::BackgroundRole) { + if (node.isConnecting) + return QBrush(QColor(186, 247, 255)); + else if (node.isActive) + return QBrush(QColor(158, 250, 158)); + } + return QVariant(); +} + +QVariant NodeModel::headerData(int section, Qt::Orientation orientation, int role) const { + if (role != Qt::DisplayRole) { + return QVariant(); + } + if (orientation == Qt::Horizontal) { + switch(section) { + case NodeModel::URL: + return QString("Node"); + case NodeModel::Height: + return QString("Height"); + default: + return QVariant(); + } + } + return QVariant(); +} + +FeatherNode NodeModel::node(int row) { + if (row < 0 || row >= m_nodes.size()) { + qCritical("%s: no reddit post for index %d", __FUNCTION__, row); + return FeatherNode("", 0, false); + } + return m_nodes.at(row); +} diff --git a/src/model/NodeModel.h b/src/model/NodeModel.h new file mode 100644 index 0000000..ea4a42e --- /dev/null +++ b/src/model/NodeModel.h @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_NODEMODEL_H +#define FEATHER_NODEMODEL_H + +#include +#include + +class FeatherNode; + +class NodeModel : public QAbstractTableModel { + Q_OBJECT + +public: + enum ModelColumn { + URL, + Height, + COUNT + }; + + explicit NodeModel(unsigned int nodeSource, QObject *parent = nullptr); + + int rowCount(const QModelIndex &parent) const override; + int columnCount(const QModelIndex &parent) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; + FeatherNode node(int row); + + void clear(); + void updateNodes(QList nodes); + +private: + QList m_nodes; + QIcon m_offline; + QIcon m_online; + unsigned int m_nodeSource; +}; + +#endif //FEATHER_NODEMODEL_H diff --git a/src/model/RedditModel.cpp b/src/model/RedditModel.cpp new file mode 100644 index 0000000..2077d64 --- /dev/null +++ b/src/model/RedditModel.cpp @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "RedditModel.h" + +RedditModel::RedditModel(QObject *parent) + : QAbstractTableModel(parent) +{ + +} + +void RedditModel::clear() { + beginResetModel(); + + m_posts.clear(); + + endResetModel(); +} + +void RedditModel::updatePosts(const QList>& posts) { + beginResetModel(); + + m_posts.clear(); + for (const auto& post : posts) { + m_posts.push_back(post); + } + + endResetModel(); +} + +int RedditModel::rowCount(const QModelIndex &parent) const{ + if (parent.isValid()) { + return 0; + } + return m_posts.count(); +} + +int RedditModel::columnCount(const QModelIndex &parent) const +{ + if (parent.isValid()) { + return 0; + } + return ModelColumn::COUNT; +} + +QVariant RedditModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() < 0 || index.row() >= m_posts.count()) + return QVariant(); + + QSharedPointer post = m_posts.at(index.row()); + + if(role == Qt::DisplayRole) { + switch(index.column()) { + case Title: + return post->title; + case Author: + return post->author; + case Comments: + return QString::number(post->comments); + default: + return QVariant(); + } + } + else if (role == Qt::TextAlignmentRole) { + switch(index.column()) { + case Comments: + return Qt::AlignRight; + default: + return QVariant(); + } + } + return QVariant(); +} + +QVariant RedditModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (role != Qt::DisplayRole) { + return QVariant(); + } + if (orientation == Qt::Horizontal) + { + switch(section) { + case Title: + return QString("Reddit Post"); + case Author: + return QString("Author"); + case Comments: + return QString("Comments"); + default: + return QVariant(); + } + } + return QVariant(); +} + +QSharedPointer RedditModel::post(int row) { + if (row < 0 || row >= m_posts.size()) { + qCritical("%s: no reddit post for index %d", __FUNCTION__, row); + return QSharedPointer(); + } + + return m_posts.at(row); +} \ No newline at end of file diff --git a/src/model/RedditModel.h b/src/model/RedditModel.h new file mode 100644 index 0000000..e3eb392 --- /dev/null +++ b/src/model/RedditModel.h @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_REDDITMODEL_H +#define FEATHER_REDDITMODEL_H + +#include +#include + +#include "widgets/RedditPost.h" + +class RedditModel : public QAbstractTableModel +{ +Q_OBJECT + +public: + enum ModelColumn + { + Title = 0, + Author, + Comments, + COUNT + }; + + explicit RedditModel(QObject *parent); + + int rowCount(const QModelIndex &parent) const override; + int columnCount(const QModelIndex &parent) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; + + void clear(); + void updatePosts(const QList>& posts); + + QSharedPointer post(int row); + +private: + QList> m_posts; +}; + +#endif //FEATHER_REDDITMODEL_H diff --git a/src/model/SubaddressAccountModel.cpp b/src/model/SubaddressAccountModel.cpp new file mode 100644 index 0000000..605e119 --- /dev/null +++ b/src/model/SubaddressAccountModel.cpp @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#include "SubaddressAccountModel.h" +#include "SubaddressAccount.h" +#include + +#include +#include + +SubaddressAccountModel::SubaddressAccountModel(QObject *parent, SubaddressAccount *subaddressAccount) + : QAbstractListModel(parent), m_subaddressAccount(subaddressAccount) +{ + connect(m_subaddressAccount, &SubaddressAccount::refreshStarted, this, &SubaddressAccountModel::startReset); + connect(m_subaddressAccount, &SubaddressAccount::refreshFinished, this, &SubaddressAccountModel::endReset); +} + +void SubaddressAccountModel::startReset(){ + beginResetModel(); +} +void SubaddressAccountModel::endReset(){ + endResetModel(); +} + +int SubaddressAccountModel::rowCount(const QModelIndex &) const +{ + return m_subaddressAccount->count(); +} + +QVariant SubaddressAccountModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() < 0 || static_cast(index.row()) >= m_subaddressAccount->count()) + return {}; + + QVariant result; + + bool found = m_subaddressAccount->getRow(index.row(), [&result, &role](const Monero::SubaddressAccountRow &row) { + switch (role) { + case SubaddressAccountAddressRole: + result = QString::fromStdString(row.getAddress()); + break; + case SubaddressAccountLabelRole: + result = QString::fromStdString(row.getLabel()); + break; + case SubaddressAccountBalanceRole: + result = QString::fromStdString(row.getBalance()); + break; + case SubaddressAccountUnlockedBalanceRole: + result = QString::fromStdString(row.getUnlockedBalance()); + break; + default: + qCritical() << "Unimplemented role" << role; + } + }); + if (!found) { + qCritical("%s: internal error: invalid index %d", __FUNCTION__, index.row()); + } + + return result; +} + +QHash SubaddressAccountModel::roleNames() const +{ + static QHash roleNames; + if (roleNames.empty()) + { + roleNames.insert(SubaddressAccountAddressRole, "address"); + roleNames.insert(SubaddressAccountLabelRole, "label"); + roleNames.insert(SubaddressAccountBalanceRole, "balance"); + roleNames.insert(SubaddressAccountUnlockedBalanceRole, "unlockedBalance"); + } + return roleNames; +} diff --git a/src/model/SubaddressAccountModel.h b/src/model/SubaddressAccountModel.h new file mode 100644 index 0000000..04d8d58 --- /dev/null +++ b/src/model/SubaddressAccountModel.h @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef SUBADDRESSACCOUNTMODEL_H +#define SUBADDRESSACCOUNTMODEL_H + +#include + +class SubaddressAccount; + +class SubaddressAccountModel : public QAbstractListModel +{ + Q_OBJECT + +public: + enum SubaddressAccountRowRole { + SubaddressAccountRole = Qt::UserRole + 1, // for the SubaddressAccountRow object; + SubaddressAccountAddressRole, + SubaddressAccountLabelRole, + SubaddressAccountBalanceRole, + SubaddressAccountUnlockedBalanceRole, + }; + Q_ENUM(SubaddressAccountRowRole) + + SubaddressAccountModel(QObject *parent, SubaddressAccount *subaddressAccount); + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QHash roleNames() const override; + +public slots: + void startReset(); + void endReset(); + +private: + SubaddressAccount *m_subaddressAccount; +}; + +#endif // SUBADDRESSACCOUNTMODEL_H diff --git a/src/model/SubaddressModel.cpp b/src/model/SubaddressModel.cpp new file mode 100644 index 0000000..308f165 --- /dev/null +++ b/src/model/SubaddressModel.cpp @@ -0,0 +1,168 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#include "SubaddressModel.h" +#include "Subaddress.h" +#include "ModelUtils.h" +#include + +#include +#include +#include +#include +#include + +SubaddressModel::SubaddressModel(QObject *parent, Subaddress *subaddress) + : QAbstractTableModel(parent), + m_subaddress(subaddress), + m_showFullAddresses(false) +{ + connect(m_subaddress, &Subaddress::refreshStarted, this, &SubaddressModel::startReset); + connect(m_subaddress, &Subaddress::refreshFinished, this, &SubaddressModel::endReset); +} + +void SubaddressModel::startReset(){ + beginResetModel(); +} + +void SubaddressModel::endReset(){ + endResetModel(); +} + +int SubaddressModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) { + return 0; + } else { + return m_subaddress->count(); + } +} + +int SubaddressModel::columnCount(const QModelIndex &parent) const +{ + if (parent.isValid()) { + return 0; + } + return ModelColumn::COUNT; +} + +QVariant SubaddressModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() < 0 || static_cast(index.row()) >= m_subaddress->count()) + return QVariant(); + + QVariant result; + + bool found = m_subaddress->getRow(index.row(), [this, &index, &role, &result](const Monero::SubaddressRow &subaddress) { + if (role == Qt::DisplayRole || role == Qt::EditRole || role == Qt::UserRole){ + result = parseSubaddressRow(subaddress, index, role); + } + else if (role == Qt::BackgroundRole) { + if (subaddress.isUsed()) { + result = QBrush(QColor(255,100,100)); + } + } + else if (role == Qt::FontRole) { + switch(index.column()) { + case Address: + { + result = ModelUtils::getMonospaceFont(); + } + } + } + }); + + if (!found) + { + qCritical("%s: internal error: invalid index %d", __FUNCTION__, index.row()); + } + + return result; +} + +QVariant SubaddressModel::parseSubaddressRow(const Monero::SubaddressRow &subaddress, const QModelIndex &index, int role) const +{ + switch (index.column()) { + case Address: + { + QString address = QString::fromStdString(subaddress.getAddress()); + if (!m_showFullAddresses && role != Qt::UserRole) { + address = ModelUtils::displayAddress(address); + } + return address; + } + case Label: + return index.row() == 0 ? tr("Primary address") : QString::fromStdString(subaddress.getLabel()); + case isUsed: + return subaddress.isUsed(); + default: + qCritical() << "Invalid column" << index.column(); + return QVariant(); + } +} + + +QVariant SubaddressModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (role != Qt::DisplayRole) { + return QVariant(); + } + if (orientation == Qt::Horizontal) + { + switch(section) { + case Address: + return QString("Address"); + case Label: + return QString("Label"); + case isUsed: + return QString("Used"); + default: + return QVariant(); + } + } + return QVariant(); +} + +bool SubaddressModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (index.isValid() && role == Qt::EditRole) { + const int row = index.row(); + + switch (index.column()) { + case Label: + m_subaddress->setLabel(0, row, value.toString()); // Todo: get actual account index + break; + default: + return false; + } + emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole}); + + return true; + } + return false; +} + +void SubaddressModel::setShowFullAddresses(bool show) +{ + m_showFullAddresses = show; + emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1)); +} + +Qt::ItemFlags SubaddressModel::flags(const QModelIndex &index) const +{ + if (!index.isValid()) + return Qt::ItemIsEnabled; + + if (index.column() == Label && index.row() != 0) + return QAbstractTableModel::flags(index) | Qt::ItemIsEditable; + + return QAbstractTableModel::flags(index); +} + +bool SubaddressModel::isShowFullAddresses() const { + return m_showFullAddresses; +} + +int SubaddressModel::unusedLookahead() const { + return m_subaddress->unusedLookahead(); +} diff --git a/src/model/SubaddressModel.h b/src/model/SubaddressModel.h new file mode 100644 index 0000000..afe378f --- /dev/null +++ b/src/model/SubaddressModel.h @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef SUBADDRESSMODEL_H +#define SUBADDRESSMODEL_H + +#include + +#include +#include +#include + +class Subaddress; + +class SubaddressModel : public QAbstractTableModel +{ + Q_OBJECT + +public: + enum ModelColumn + { + Address = 0, + Label, + isUsed, + COUNT + }; + + explicit SubaddressModel(QObject *parent, Subaddress *subaddress); + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; + Qt::ItemFlags flags(const QModelIndex &index) const override; + + bool setData(const QModelIndex &index, const QVariant &value, int role) override; + + bool isShowFullAddresses() const; + void setShowFullAddresses(bool show); + + int unusedLookahead() const; + +public slots: + void startReset(); + void endReset(); + +private: + Subaddress *m_subaddress; + QVariant parseSubaddressRow(const Monero::SubaddressRow &subaddress, const QModelIndex &index, int role) const; + + bool m_showFullAddresses; +}; + +#endif // SUBADDRESSMODEL_H diff --git a/src/model/SubaddressProxyModel.cpp b/src/model/SubaddressProxyModel.cpp new file mode 100644 index 0000000..dc486e9 --- /dev/null +++ b/src/model/SubaddressProxyModel.cpp @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "SubaddressProxyModel.h" + +SubaddressProxyModel::SubaddressProxyModel(QObject *parent, Subaddress *subaddress, bool hidePrimary) + : QSortFilterProxyModel(parent), + m_searchRegExp(""), + m_searchCaseSensitiveRegExp(""), + m_subaddress(subaddress), + m_hidePrimary(hidePrimary) +{ + m_searchRegExp.setCaseSensitivity(Qt::CaseInsensitive); + m_searchRegExp.setPatternSyntax(QRegExp::FixedString); + m_searchCaseSensitiveRegExp.setPatternSyntax(QRegExp::FixedString); +} + +bool SubaddressProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const +{ + QString address, label; + bool isUsed; + m_subaddress->getRow(sourceRow, [&isUsed, &address, &label](const Monero::SubaddressRow &subaddress){ + isUsed = subaddress.isUsed(); + address = QString::fromStdString(subaddress.getAddress()); + label = QString::fromStdString(subaddress.getLabel()); + }); + + // Hide primary address + if (sourceRow == 0 && m_hidePrimary) + return false; + + if (!m_searchRegExp.isEmpty()) { + return address.contains(m_searchCaseSensitiveRegExp) || label.contains(m_searchRegExp); + } + return (m_showUsed || !isUsed); +} diff --git a/src/model/SubaddressProxyModel.h b/src/model/SubaddressProxyModel.h new file mode 100644 index 0000000..68f6165 --- /dev/null +++ b/src/model/SubaddressProxyModel.h @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_SUBADDRESSPROXYMODEL_H +#define FEATHER_SUBADDRESSPROXYMODEL_H + +#include "libwalletqt/Subaddress.h" + +#include + +class SubaddressProxyModel : public QSortFilterProxyModel +{ + Q_OBJECT +public: + explicit SubaddressProxyModel(QObject* parent, Subaddress *subaddress, bool hidePrimary = true); + bool filterAcceptsRow(int sourceRow, + const QModelIndex &sourceParent) const; + +public slots: + void setSearchFilter(const QString& searchString){ + m_searchRegExp.setPattern(searchString); + m_searchCaseSensitiveRegExp.setPattern(searchString); + invalidateFilter(); + } + void setShowUsed(const bool showUsed){ + m_showUsed = showUsed; + invalidateFilter(); + } +private: + Subaddress *m_subaddress; + + QRegExp m_searchRegExp; + QRegExp m_searchCaseSensitiveRegExp; + bool m_showUsed = false; + bool m_hidePrimary; +}; + +#endif //FEATHER_SUBADDRESSPROXYMODEL_H diff --git a/src/model/TransactionHistoryModel.cpp b/src/model/TransactionHistoryModel.cpp new file mode 100644 index 0000000..590386e --- /dev/null +++ b/src/model/TransactionHistoryModel.cpp @@ -0,0 +1,239 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#include "TransactionHistoryModel.h" +#include "TransactionHistory.h" +#include "TransactionInfo.h" + +#include +#include +#include + +TransactionHistoryModel::TransactionHistoryModel(QObject *parent) + : QAbstractTableModel(parent), + m_transactionHistory(nullptr) +{ + m_unconfirmedTx = QIcon(":/assets/images/unconfirmed.png"); + m_warning = QIcon(":/assets/images/warning.png"); + m_clock1 = QIcon(":/assets/images/clock1.png"); + m_clock2 = QIcon(":/assets/images/clock2.png"); + m_clock3 = QIcon(":/assets/images/clock3.png"); + m_clock4 = QIcon(":/assets/images/clock4.png"); + m_clock5 = QIcon(":/assets/images/clock5.png"); + m_confirmedTx = QIcon(":/assets/images/confirmed.png"); +} + +void TransactionHistoryModel::setTransactionHistory(TransactionHistory *th) { + beginResetModel(); + m_transactionHistory = th; + endResetModel(); + + connect(m_transactionHistory, &TransactionHistory::refreshStarted, + this, &TransactionHistoryModel::beginResetModel); + connect(m_transactionHistory, &TransactionHistory::refreshFinished, + this, &TransactionHistoryModel::endResetModel); + + emit transactionHistoryChanged(); +} + +TransactionHistory *TransactionHistoryModel::transactionHistory() const { + return m_transactionHistory; +} + +int TransactionHistoryModel::rowCount(const QModelIndex &parent) const { + if (parent.isValid()) { + return 0; + } else { + return m_transactionHistory ? m_transactionHistory->count() : 0; + } +} + +int TransactionHistoryModel::columnCount(const QModelIndex &parent) const { + if (parent.isValid()) { + return 0; + } + + return Column::COUNT; +} + +QVariant TransactionHistoryModel::data(const QModelIndex &index, int role) const { + if (!m_transactionHistory) { + return QVariant(); + } + + if (!index.isValid() || index.row() < 0 || static_cast(index.row()) >= m_transactionHistory->count()) + return QVariant(); + + QVariant result; + + bool found = m_transactionHistory->transaction(index.row(), [this, &index, &result, &role](const TransactionInfo &tInfo) { + if(role == Qt::DisplayRole || role == Qt::EditRole) { + result = parseTransactionInfo(tInfo, index.column()); + } + else if (role == Qt::TextAlignmentRole) { + switch (index.column()) { + case Column::Amount: + case Column::FiatAmount: + result = Qt::AlignRight; + } + } + else if (role == Qt::DecorationRole) { + switch (index.column()) { + case Column::Date: + { + if (tInfo.isFailed()) + result = QVariant(m_warning); + else if (tInfo.isPending()) + result = QVariant(m_unconfirmedTx); + else if (tInfo.confirmations() <= (1.0/5.0 * tInfo.confirmationsRequired())) + result = QVariant(m_clock1); + else if (tInfo.confirmations() <= (2.0/5.0 * tInfo.confirmationsRequired())) + result = QVariant(m_clock2); + else if (tInfo.confirmations() <= (3.0/5.0 * tInfo.confirmationsRequired())) + result = QVariant(m_clock3); + else if (tInfo.confirmations() <= (4.0/5.0 * tInfo.confirmationsRequired())) + result = QVariant(m_clock4); + else if (tInfo.confirmations() < tInfo.confirmationsRequired()) + result = QVariant(m_clock5); + else if (tInfo.confirmations()) + result = QVariant(m_confirmedTx); + } + } + } + else if (role == Qt::ToolTipRole) { + switch(index.column()) { + case Column::Date: + { + if (tInfo.confirmations() < tInfo.confirmationsRequired()) + result = QString("%1/%2 confirmations").arg(QString::number(tInfo.confirmations()), QString::number(tInfo.confirmationsRequired())); + else + result = QString("%1 confirmations").arg(QString::number(tInfo.confirmations())); + } + } + } + else if (role == Qt::ForegroundRole) { + switch(index.column()) { + case Column::FiatAmount: + case Column::Amount: + { + if (tInfo.direction() == TransactionInfo::Direction_Out && tInfo.amount() > 0) { + result = QVariant(QColor("#BC1E1E")); + } + } + } + } + }); + + if (!found) { + qCritical("%s: internal error: no transaction info for index %d", __FUNCTION__, index.row()); + } + return result; +} + +QVariant TransactionHistoryModel::parseTransactionInfo(const TransactionInfo &tInfo, int column) const +{ + switch (column) + { + case Column::Date: + return tInfo.timestamp().toString("yyyy-MM-dd HH:mm"); + case Column::Description: { + // if this tx is still in the pool, then we wont get the + // description. We've cached it inside `AppContext::txDescriptionCache` + // for the time being. + if(tInfo.isPending()) { + auto hash = tInfo.hash(); + if (AppContext::txDescriptionCache.contains(hash)) + return AppContext::txDescriptionCache[hash]; + } + return tInfo.description(); + } + case Column::Amount: + { + QString amount = QString::number(tInfo.atomicAmount() / 1e12, 'f', 4); + amount = (tInfo.direction() == TransactionInfo::Direction_Out && tInfo.amount() > 0) ? "-" + amount : "+" + amount; + return amount; + } + case Column::TxID: + return tInfo.hash(); + case Column::FiatAmount: + { + double usd_price = AppContext::txFiatHistory->get(tInfo.timestamp().toString("yyyyMMdd")); + if (usd_price == 0.0) + return QVariant("?"); + + double usd_amount = usd_price * tInfo.amount(); + if(this->preferredFiatSign != "$") + usd_amount = AppContext::prices->convert("USD", this->preferredFiatSymbol, usd_amount); + double fiat_rounded = ceil(Utils::roundSignificant(usd_amount, 3) * 100.0) / 100.0; + + return QString("%1%2").arg(this->preferredFiatSign).arg(QString::number(fiat_rounded)); + } + default: + { + qCritical() << "Unimplemented role"; + return QVariant(); + } + } +} + +QVariant TransactionHistoryModel::headerData(int section, Qt::Orientation orientation, int role) const { + Q_UNUSED(orientation) + if (role != Qt::DisplayRole) { + return QVariant(); + } + if (orientation == Qt::Horizontal) { + switch(section) { + case Column::Date: + return QString("Date"); + case Column::Description: + return QString("Description"); + case Column::Amount: + return QString("Amount"); + case Column::TxID: + return QString("Txid"); + case Column::FiatAmount: + return QString("Fiat"); + default: + return QVariant(); + } + } + return QVariant(); +} + +bool TransactionHistoryModel::setData(const QModelIndex &index, const QVariant &value, int role) { + if (index.isValid() && role == Qt::EditRole) { + QString hash; + + switch (index.column()) { + case Column::Description: + { + m_transactionHistory->transaction(index.row(), [this, &hash, &value](const TransactionInfo &tInfo){ + hash = tInfo.hash(); + }); + m_transactionHistory->setTxNote(hash, value.toString()); + break; + } + default: + return false; + } + + emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole}); + return true; + } + return false; +} + +Qt::ItemFlags TransactionHistoryModel::flags(const QModelIndex &index) const { + bool isPending; + m_transactionHistory->transaction(index.row(), [this, &isPending](const TransactionInfo &tInfo){ + isPending = tInfo.isPending(); + }); + + if (!index.isValid()) + return Qt::ItemIsEnabled; + + if (index.column() == Description && !isPending) + return QAbstractTableModel::flags(index) | Qt::ItemIsEditable; + + return QAbstractTableModel::flags(index); +} \ No newline at end of file diff --git a/src/model/TransactionHistoryModel.h b/src/model/TransactionHistoryModel.h new file mode 100644 index 0000000..82b140d --- /dev/null +++ b/src/model/TransactionHistoryModel.h @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef TRANSACTIONHISTORYMODEL_H +#define TRANSACTIONHISTORYMODEL_H + +#include +#include +#include "appcontext.h" + +class TransactionHistory; +class TransactionInfo; + +/** + * @brief The TransactionHistoryModel class - read-only table model for Transaction History + */ + +class TransactionHistoryModel : public QAbstractTableModel +{ + Q_OBJECT + Q_PROPERTY(TransactionHistory * transactionHistory READ transactionHistory WRITE setTransactionHistory NOTIFY transactionHistoryChanged) + +public: + enum Column + { + Date = 0, + Description, + Amount, + TxID, + FiatAmount, + COUNT + }; + + explicit TransactionHistoryModel(QObject * parent = nullptr); + void setTransactionHistory(TransactionHistory * th); + TransactionHistory * transactionHistory() const; + + QString preferredFiatSign = "$"; + QString preferredFiatSymbol = "USD"; + int rowCount(const QModelIndex & parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; + Qt::ItemFlags flags(const QModelIndex &index) const override; + + bool setData(const QModelIndex &index, const QVariant &value, int role) override; + +signals: + void transactionHistoryChanged(); + +private: + QVariant parseTransactionInfo(const TransactionInfo &tInfo, int column) const; + + TransactionHistory * m_transactionHistory; + QIcon m_unconfirmedTx; + QIcon m_warning; + QIcon m_clock1; + QIcon m_clock2; + QIcon m_clock3; + QIcon m_clock4; + QIcon m_clock5; + QIcon m_confirmedTx; +}; + +#endif // TRANSACTIONHISTORYMODEL_H diff --git a/src/model/TransactionHistoryProxyModel.cpp b/src/model/TransactionHistoryProxyModel.cpp new file mode 100644 index 0000000..479780e --- /dev/null +++ b/src/model/TransactionHistoryProxyModel.cpp @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "TransactionHistoryProxyModel.h" +#include "TransactionHistoryModel.h" + +#include "libwalletqt/TransactionInfo.h" +#include + +TransactionHistoryProxyModel::TransactionHistoryProxyModel(Wallet *wallet, QObject *parent) + : QSortFilterProxyModel(parent), + m_wallet(wallet), + m_searchRegExp("") +{ + m_searchRegExp.setCaseSensitivity(Qt::CaseInsensitive); + m_searchRegExp.setPatternSyntax(QRegExp::RegExp); +} + +bool TransactionHistoryProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const +{ + QModelIndex descriptionIndex = sourceModel()->index(sourceRow, TransactionHistoryModel::Description, sourceParent); + QModelIndex txidIndex = sourceModel()->index(sourceRow, TransactionHistoryModel::TxID, sourceParent); + + QString descriptionData = sourceModel()->data(descriptionIndex).toString(); + QString txidData = sourceModel()->data(txidIndex).toString(); + + quint32 subaddrAcount; + QSet subaddrIndex; + + m_wallet->history()->transaction(sourceRow, [&subaddrAcount, &subaddrIndex](TransactionInfo &tInfo){ + subaddrAcount = tInfo.subaddrAccount(); + subaddrIndex = tInfo.subaddrIndex(); + }); + + bool addressFound; + for (quint32 i : subaddrIndex) { + QString address = m_wallet->address(subaddrAcount, i); + addressFound = address.contains(m_searchRegExp); + if (addressFound) break; + } + + return (descriptionData.contains(m_searchRegExp) || txidData.contains(m_searchRegExp)) || addressFound; +} \ No newline at end of file diff --git a/src/model/TransactionHistoryProxyModel.h b/src/model/TransactionHistoryProxyModel.h new file mode 100644 index 0000000..559f1ff --- /dev/null +++ b/src/model/TransactionHistoryProxyModel.h @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_TRANSACTIONHISTORYPROXYMODEL_H +#define FEATHER_TRANSACTIONHISTORYPROXYMODEL_H + +#include "libwalletqt/TransactionHistory.h" +#include "libwalletqt/Wallet.h" + +#include + +class TransactionHistoryProxyModel : public QSortFilterProxyModel +{ +Q_OBJECT +public: + explicit TransactionHistoryProxyModel(Wallet *wallet, QObject* parent = nullptr); + bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; + +public slots: + void setSearchFilter(const QString& searchString){ + m_searchRegExp.setPattern(searchString); + invalidateFilter(); + } + +private: + Wallet * m_wallet; + + QRegExp m_searchRegExp; +}; + +#endif //FEATHER_TRANSACTIONHISTORYPROXYMODEL_H diff --git a/src/model/XmrToModel.cpp b/src/model/XmrToModel.cpp new file mode 100644 index 0000000..b14ac45 --- /dev/null +++ b/src/model/XmrToModel.cpp @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "XmrToModel.h" +#include "model/ModelUtils.h" +#include "utils/xmrto.h" + +XmrToModel::XmrToModel(QList *orders, QObject *parent) + : QAbstractTableModel(parent), + orders(orders) +{ +} + +void XmrToModel::update() { + beginResetModel(); + endResetModel(); +} + +int XmrToModel::rowCount(const QModelIndex &) const { + return this->orders->count(); +} + +int XmrToModel::columnCount(const QModelIndex &) const { + return COUNT; +} + +QVariant XmrToModel::data(const QModelIndex &index, int role) const { + const int _row = index.row(); + const int _col = index.column(); + const auto order = this->orders->at(_row); + + if (role == Qt::DisplayRole){ + switch(index.column()){ + case Status: + { + QString status = XmrTo::stateMap[(OrderState) order->state]; + + if (order->state == OrderState::Status_OrderUnpaid) + return QString("%1 (%2)").arg(status, QString::number(order->countdown)); + + return status; + } + case ID: + return !order->uuid.isEmpty() ? order->uuid.split("-")[1] : "-"; + case Destination: + return ModelUtils::displayAddress(order->btc_dest_address, 1); + case Conversion: + if(order->state <= OrderState::Status_OrderToBeCreated) + return ""; + + return QString("%1 XMR ⟶ %2 BTC").arg(QString::number(order->incoming_amount_total), QString::number(order->btc_amount)); + case Rate: + return order->incoming_price_btc ? QString::number(order->incoming_price_btc, 'f', 6) : ""; + case ErrorMsg: + if(order->errorMsg.isEmpty()) return ""; + return order->errorMsg; + default: return {}; + } + } + + else if(role == Qt::BackgroundRole) { + if (_col == 0) { + if (order->state == OrderState::Status_OrderPaid || order->state == OrderState::Status_OrderPaidUnconfirmed) + return QBrush(Qt::darkGreen); + else if (order->state == OrderState::Status_OrderCreating || order->state == OrderState::Status_OrderToBeCreated) + return QBrush(Qt::yellow); + else if (order->state == OrderState::Status_OrderUnpaid) + return QBrush(Qt::cyan); + else if (order->state == OrderState::Status_OrderBTCSent) + return QBrush(Qt::green); + else if (order->state == OrderState::Status_OrderFailed || order->state == OrderState::Status_OrderTimedOut) + return QBrush(QColor(191, 255, 0)); // lime + } + } + else if (role == Qt::FontRole) { + switch(index.column()) { + case ID: + case Destination: + return ModelUtils::getMonospaceFont(); + } + } + + return QVariant(); +} + +QVariant XmrToModel::headerData(int section, Qt::Orientation orientation, int role) const { + if (role == Qt::DisplayRole && orientation == Qt::Horizontal) { + switch (section) { + case Status: + return QString("Status"); + case ID: + return QString("ID"); + case Destination: + return QString("Address"); + case Conversion: + return QString("Conversion"); + case Rate: + return QString("Rate"); + case ErrorMsg: + return QString("Message"); + default: + return QVariant(); + } + } + return QVariant(); +} \ No newline at end of file diff --git a/src/model/XmrToModel.h b/src/model/XmrToModel.h new file mode 100644 index 0000000..f428f0e --- /dev/null +++ b/src/model/XmrToModel.h @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_XMRTOMODEL_H +#define FEATHER_XMRTOMODEL_H + +#include + +class XmrToOrder; +class XmrToModel : public QAbstractTableModel +{ + Q_OBJECT + +public: + enum ModelColumn + { + Status = 0, + ID, + Conversion, + Rate, + Destination, + ErrorMsg, + COUNT + }; + + XmrToModel(QList *orders, QObject *parent = nullptr); + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QList *orders; + +public slots: + void update(); +}; + + +#endif //FEATHER_XMRTOMODEL_H diff --git a/src/openpgp/CMakeLists.txt b/src/openpgp/CMakeLists.txt new file mode 100644 index 0000000..1c3f4ba --- /dev/null +++ b/src/openpgp/CMakeLists.txt @@ -0,0 +1,20 @@ +file(GLOB_RECURSE SOURCES *.cpp) +file(GLOB_RECURSE HEADERS *.h) + +find_library(GCRYPT_LIBRARY gcrypt) +find_library(GPG_ERROR_LIBRARY gpg-error) + +add_library(openpgp + ${SOURCES} + ${HEADERS}) + +find_package(GCrypt) +target_include_directories(openpgp PUBLIC + ${CMAKE_SOURCE_DIR}/monero/contrib/epee/include + ${GCRYPT_INCLUDE_DIRS} + ) + +target_link_libraries(openpgp + PUBLIC + ${GCRYPT_LIBRARY} + ${GPG_ERROR_LIBRARY}) diff --git a/src/openpgp/hash.h b/src/openpgp/hash.h new file mode 100644 index 0000000..4f69851 --- /dev/null +++ b/src/openpgp/hash.h @@ -0,0 +1,107 @@ +// Copyright (c) 2020, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#pragma once + +#include + +#include +#include + +namespace openpgp +{ + +class hash +{ +public: + enum algorithm : uint8_t + { + sha256 = 8, + }; + + hash(const hash &) = delete; + hash &operator=(const hash &) = delete; + + hash(uint8_t algorithm) + : algo(algorithm) + , consumed(0) + { + if (gcry_md_open(&md, algo, 0) != GPG_ERR_NO_ERROR) + { + throw std::runtime_error("failed to create message digest object"); + } + } + + ~hash() + { + gcry_md_close(md); + } + + hash &operator<<(uint8_t byte) + { + gcry_md_putc(md, byte); + ++consumed; + return *this; + } + + hash &operator<<(const epee::span &bytes) + { + gcry_md_write(md, &bytes[0], bytes.size()); + consumed += bytes.size(); + return *this; + } + + hash &operator<<(const std::vector &bytes) + { + return *this << epee::to_span(bytes); + } + + std::vector finish() const + { + std::vector result(gcry_md_get_algo_dlen(algo)); + const void *digest = gcry_md_read(md, algo); + if (digest == nullptr) + { + throw std::runtime_error("failed to read the digest"); + } + memcpy(&result[0], digest, result.size()); + return result; + } + + size_t consumed_bytes() const + { + return consumed; + } + +private: + const uint8_t algo; + gcry_md_hd_t md; + size_t consumed; +}; + +} diff --git a/src/openpgp/mpi.h b/src/openpgp/mpi.h new file mode 100644 index 0000000..800bcac --- /dev/null +++ b/src/openpgp/mpi.h @@ -0,0 +1,78 @@ +// Copyright (c) 2020, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#pragma once + +#include + +namespace openpgp +{ + +class mpi +{ +public: + mpi(const mpi &) = delete; + mpi &operator=(const mpi &) = delete; + + mpi(mpi &&other) + : data(other.data) + { + other.data = nullptr; + } + + template < + typename byte_container, + typename = typename std::enable_if<(sizeof(typename byte_container::value_type) == 1)>::type> + mpi(const byte_container &buffer, gcry_mpi_format format = GCRYMPI_FMT_USG) + : mpi(&buffer[0], buffer.size(), format) + { + } + + mpi(const void *buffer, size_t size, gcry_mpi_format format = GCRYMPI_FMT_USG) + { + if (gcry_mpi_scan(&data, format, buffer, size, nullptr) != GPG_ERR_NO_ERROR) + { + throw std::runtime_error("failed to read mpi from buffer"); + } + } + + ~mpi() + { + gcry_mpi_release(data); + } + + const gcry_mpi_t &get() const + { + return data; + } + +private: + gcry_mpi_t data; +}; + +} // namespace openpgp diff --git a/src/openpgp/openpgp.cpp b/src/openpgp/openpgp.cpp new file mode 100644 index 0000000..fa50301 --- /dev/null +++ b/src/openpgp/openpgp.cpp @@ -0,0 +1,382 @@ +// Copyright (c) 2020, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "openpgp.h" + +#include +#include +#include + +#include + +#include "hash.h" +#include "mpi.h" +#include "packet_stream.h" +#include "s_expression.h" +#include "serialization.h" + +namespace openpgp +{ +namespace +{ + +std::string::const_iterator find_next_line(std::string::const_iterator begin, const std::string::const_iterator &end) +{ + begin = std::find(begin, end, '\n'); + return begin != end ? ++begin : end; +} + +std::string::const_iterator find_line_starting_with( + std::string::const_iterator it, + const std::string::const_iterator &end, + const std::string &starts_with) +{ + for (std::string::const_iterator next_line; it != end; it = next_line) + { + next_line = find_next_line(it, end); + const size_t line_length = static_cast(std::distance(it, next_line)); + if (line_length >= starts_with.size() && std::equal(starts_with.begin(), starts_with.end(), it)) + { + return it; + } + } + return end; +} + +std::string::const_iterator find_empty_line(std::string::const_iterator it, const std::string::const_iterator &end) +{ + for (; it != end && *it != '\r' && *it != '\n'; it = find_next_line(it, end)) + { + } + return it; +} + +std::string get_armored_block_contents(const std::string &text, const std::string &block_name) +{ + static constexpr const char dashes[] = "-----"; + const std::string armor_header = dashes + block_name + dashes; + auto block_start = find_line_starting_with(text.begin(), text.end(), armor_header); + auto block_headers = find_next_line(block_start, text.end()); + auto block_end = find_line_starting_with(block_headers, text.end(), dashes); + auto contents_begin = find_next_line(find_empty_line(block_headers, block_end), block_end); + if (contents_begin == block_end) + { + throw std::runtime_error("armored block not found"); + } + return std::string(contents_begin, block_end); +} + +} // namespace + +public_key_rsa::public_key_rsa(s_expression expression, size_t bits) + : m_expression(std::move(expression)) + , m_bits(bits) +{ +} + +const gcry_sexp_t &public_key_rsa::get() const +{ + return m_expression.get(); +} + +size_t public_key_rsa::bits() const +{ + return m_bits; +} + +public_key_block::public_key_block(const std::string &armored) + : public_key_block(epee::to_byte_span(epee::to_span(epee::string_encoding::base64_decode( + strip_line_breaks(get_armored_block_contents(armored, "BEGIN PGP PUBLIC KEY BLOCK")))))) +{ +} + +// TODO: Public-Key expiration, User ID and Public-Key certification, Subkey binding checks +public_key_block::public_key_block(const epee::span buffer) +{ + packet_stream packets(buffer); + + const std::vector *data = packets.find_first(packet_tag::type::user_id); + if (data == nullptr) + { + throw std::runtime_error("user id is missing"); + } + m_user_id.assign(data->begin(), data->end()); + + const auto append_public_key = [this](const std::vector &data) { + deserializer> serialized(data); + + const auto version = serialized.read_big_endian(); + if (version != 4) + { + throw std::runtime_error("unsupported public key version"); + } + + /* const auto timestamp = */ serialized.read_big_endian(); + + const auto algorithm = serialized.read_big_endian(); + if (algorithm != openpgp::algorithm::rsa) + { + throw std::runtime_error("unsupported public key algorithm"); + } + + { + const mpi public_key_n = serialized.read_mpi(); + const mpi public_key_e = serialized.read_mpi(); + + emplace_back( + s_expression("(public-key (rsa (n %m) (e %m)))", public_key_n.get(), public_key_e.get()), + gcry_mpi_get_nbits(public_key_n.get())); + } + }; + + data = packets.find_first(packet_tag::type::public_key); + if (data == nullptr) + { + throw std::runtime_error("public key is missing"); + } + append_public_key(*data); + + packets.for_each(packet_tag::type::public_subkey, append_public_key); +} + +std::string public_key_block::user_id() const +{ + return m_user_id; +} + +// TODO: Signature expiration check +signature_rsa::signature_rsa( + uint8_t algorithm, + std::pair hash_leftmost_bytes, + uint8_t hash_algorithm, + const std::vector &hashed_data, + type type, + s_expression signature, + uint8_t version) + : m_hash_algorithm(hash_algorithm) + , m_hash_leftmost_bytes(hash_leftmost_bytes) + , m_hashed_appendix(format_hashed_appendix(algorithm, hash_algorithm, hashed_data, type, version)) + , m_signature(std::move(signature)) + , m_type(type) +{ +} + +signature_rsa signature_rsa::from_armored(const std::string &armored_signed_message) +{ + return from_base64(get_armored_block_contents(armored_signed_message, "BEGIN PGP SIGNATURE")); +} + +signature_rsa signature_rsa::from_base64(const std::string &base64) +{ + std::string decoded = epee::string_encoding::base64_decode(strip_line_breaks(base64)); + epee::span buffer(reinterpret_cast(&decoded[0]), decoded.size()); + return from_buffer(buffer); +} + +signature_rsa signature_rsa::from_buffer(const epee::span input) +{ + packet_stream packets(input); + + const std::vector *data = packets.find_first(packet_tag::type::signature); + if (data == nullptr) + { + throw std::runtime_error("signature is missing"); + } + + deserializer> buffer(*data); + + const auto version = buffer.read_big_endian(); + if (version != 4) + { + throw std::runtime_error("unsupported signature version"); + } + + const auto signature_type = static_cast(buffer.read_big_endian()); + + const auto algorithm = buffer.read_big_endian(); + if (algorithm != openpgp::algorithm::rsa) + { + throw std::runtime_error("unsupported signature algorithm"); + } + + const auto hash_algorithm = buffer.read_big_endian(); + + const auto hashed_data_length = buffer.read_big_endian(); + std::vector hashed_data = buffer.read(hashed_data_length); + + const auto unhashed_data_length = buffer.read_big_endian(); + buffer.read_span(unhashed_data_length); + + std::pair hash_leftmost_bytes{buffer.read_big_endian(), buffer.read_big_endian()}; + + const mpi signature = buffer.read_mpi(); + + return signature_rsa( + algorithm, + std::move(hash_leftmost_bytes), + hash_algorithm, + hashed_data, + signature_type, + s_expression("(sig-val (rsa (s %m)))", signature.get()), + version); +} + +bool signature_rsa::verify(const epee::span message, const public_key_rsa &public_key) const +{ + const s_expression signed_data = hash_message(message, public_key.bits()); + return gcry_pk_verify(m_signature.get(), signed_data.get(), public_key.get()) == 0; +} + +s_expression signature_rsa::hash_message(const epee::span message, size_t public_key_bits) const +{ + switch (m_type) + { + case type::binary_document: + return hash_bytes(message, public_key_bits); + case type::canonical_text_document: + { + std::vector crlf_formatted; + crlf_formatted.reserve(message.size()); + const size_t message_size = message.size(); + for (size_t offset = 0; offset < message_size; ++offset) + { + const auto &character = message[offset]; + if (character == '\r') + { + continue; + } + if (character == '\n') + { + const bool skip_last_crlf = offset + 1 == message_size; + if (skip_last_crlf) + { + break; + } + crlf_formatted.push_back('\r'); + } + crlf_formatted.push_back(character); + } + return hash_bytes(epee::to_span(crlf_formatted), public_key_bits); + } + default: + throw std::runtime_error("unsupported signature type"); + } +} + +std::vector signature_rsa::hash_asn_object_id() const +{ + size_t size; + if (gcry_md_algo_info(m_hash_algorithm, GCRYCTL_GET_ASNOID, nullptr, &size) != GPG_ERR_NO_ERROR) + { + throw std::runtime_error("failed to get ASN.1 Object Identifier (OID) size"); + } + + std::vector asn_object_id(size); + if (gcry_md_algo_info(m_hash_algorithm, GCRYCTL_GET_ASNOID, &asn_object_id[0], &size) != GPG_ERR_NO_ERROR) + { + throw std::runtime_error("failed to get ASN.1 Object Identifier (OID)"); + } + + return asn_object_id; +} + +s_expression signature_rsa::hash_bytes(const epee::span message, size_t public_key_bits) const +{ + const std::vector plain_hash = (hash(m_hash_algorithm) << message << m_hashed_appendix).finish(); + if (plain_hash.size() < 2) + { + throw std::runtime_error("insufficient message hash size"); + } + if (plain_hash[0] != m_hash_leftmost_bytes.first || plain_hash[1] != m_hash_leftmost_bytes.second) + { + throw std::runtime_error("signature checksum doesn't match the expected value"); + } + + std::vector asn_object_id = hash_asn_object_id(); + + const size_t public_key_bytes = bits_to_bytes(public_key_bits); + if (public_key_bytes < plain_hash.size() + asn_object_id.size() + 11) + { + throw std::runtime_error("insufficient public key bit length"); + } + + std::vector emsa_pkcs1_v1_5_encoded; + emsa_pkcs1_v1_5_encoded.reserve(public_key_bytes); + emsa_pkcs1_v1_5_encoded.push_back(0); + emsa_pkcs1_v1_5_encoded.push_back(1); + const size_t ps_size = public_key_bytes - plain_hash.size() - asn_object_id.size() - 3; + emsa_pkcs1_v1_5_encoded.insert(emsa_pkcs1_v1_5_encoded.end(), ps_size, 0xff); + emsa_pkcs1_v1_5_encoded.push_back(0); + emsa_pkcs1_v1_5_encoded.insert(emsa_pkcs1_v1_5_encoded.end(), asn_object_id.begin(), asn_object_id.end()); + emsa_pkcs1_v1_5_encoded.insert(emsa_pkcs1_v1_5_encoded.end(), plain_hash.begin(), plain_hash.end()); + + mpi value(emsa_pkcs1_v1_5_encoded); + return s_expression("(data (flags raw) (value %m))", value.get()); +} + +std::vector signature_rsa::format_hashed_appendix( + uint8_t algorithm, + uint8_t hash_algorithm, + const std::vector &hashed_data, + uint8_t type, + uint8_t version) +{ + const uint16_t hashed_data_size = static_cast(hashed_data.size()); + const uint32_t hashed_pefix_size = sizeof(version) + sizeof(type) + sizeof(algorithm) + sizeof(hash_algorithm) + + sizeof(hashed_data_size) + hashed_data.size(); + + std::vector appendix; + appendix.reserve(hashed_pefix_size + sizeof(version) + sizeof(uint8_t) + sizeof(hashed_pefix_size)); + appendix.push_back(version); + appendix.push_back(type); + appendix.push_back(algorithm); + appendix.push_back(hash_algorithm); + appendix.push_back(static_cast(hashed_data_size >> 8)); + appendix.push_back(static_cast(hashed_data_size)); + appendix.insert(appendix.end(), hashed_data.begin(), hashed_data.end()); + appendix.push_back(version); + appendix.push_back(0xff); + appendix.push_back(static_cast(hashed_pefix_size >> 24)); + appendix.push_back(static_cast(hashed_pefix_size >> 16)); + appendix.push_back(static_cast(hashed_pefix_size >> 8)); + appendix.push_back(static_cast(hashed_pefix_size)); + + return appendix; +} + +message_armored::message_armored(const std::string &message_armored) + : m_message(get_armored_block_contents(message_armored, "BEGIN PGP SIGNED MESSAGE")) +{ +} + +message_armored::operator epee::span() const +{ + return epee::to_byte_span(epee::to_span(m_message)); +} + +} // namespace openpgp diff --git a/src/openpgp/openpgp.h b/src/openpgp/openpgp.h new file mode 100644 index 0000000..e876ecc --- /dev/null +++ b/src/openpgp/openpgp.h @@ -0,0 +1,127 @@ +// Copyright (c) 2020, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#pragma once + +#include + +#include + +#include + +#include "s_expression.h" + +namespace openpgp +{ + +enum algorithm : uint8_t +{ + rsa = 1, +}; + +class public_key_rsa +{ +public: + public_key_rsa(s_expression expression, size_t bits); + + size_t bits() const; + const gcry_sexp_t &get() const; + +private: + s_expression m_expression; + size_t m_bits; +}; + +class public_key_block : public std::vector +{ +public: + public_key_block(const std::string &armored); + public_key_block(const epee::span buffer); + + std::string user_id() const; + +private: + std::string m_user_id; +}; + +class signature_rsa +{ +public: + enum type : uint8_t + { + binary_document = 0, + canonical_text_document = 1, + }; + + signature_rsa( + uint8_t algorithm, + std::pair hash_leftmost_bytes, + uint8_t hash_algorithm, + const std::vector &hashed_data, + type type, + s_expression signature, + uint8_t version); + + static signature_rsa from_armored(const std::string &armored_signed_message); + static signature_rsa from_base64(const std::string &base64); + static signature_rsa from_buffer(const epee::span input); + + bool verify(const epee::span message, const public_key_rsa &public_key) const; + +private: + s_expression hash_message(const epee::span message, size_t public_key_bits) const; + std::vector hash_asn_object_id() const; + s_expression hash_bytes(const epee::span message, size_t public_key_bits) const; + + static std::vector format_hashed_appendix( + uint8_t algorithm, + uint8_t hash_algorithm, + const std::vector &hashed_data, + uint8_t type, + uint8_t version); + +private: + uint8_t m_hash_algorithm; + std::pair m_hash_leftmost_bytes; + std::vector m_hashed_appendix; + s_expression m_signature; + type m_type; +}; + +class message_armored +{ +public: + message_armored(const std::string &message_armored); + + operator epee::span() const; + +private: + std::string m_message; +}; + +} // namespace openpgp diff --git a/src/openpgp/packet_stream.h b/src/openpgp/packet_stream.h new file mode 100644 index 0000000..6a993e9 --- /dev/null +++ b/src/openpgp/packet_stream.h @@ -0,0 +1,88 @@ +// Copyright (c) 2020, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#pragma once + +#include + +#include + +#include "serialization.h" + +namespace openpgp +{ + +class packet_stream +{ +public: + packet_stream(const epee::span buffer) + : packet_stream(deserializer>(buffer)) + { + } + + template < + typename byte_container, + typename = typename std::enable_if<(sizeof(typename byte_container::value_type) == 1)>::type> + packet_stream(deserializer buffer) + { + while (!buffer.empty()) + { + packet_tag tag = buffer.read_packet_tag(); + packets.push_back({std::move(tag), buffer.read(tag.length)}); + } + } + + const std::vector *find_first(packet_tag::type type) const + { + for (const auto &packet : packets) + { + if (packet.first.packet_type == type) + { + return &packet.second; + } + } + return nullptr; + } + + template + void for_each(packet_tag::type type, Callback &callback) const + { + for (const auto &packet : packets) + { + if (packet.first.packet_type == type) + { + callback(packet.second); + } + } + } + +private: + std::vector>> packets; +}; + +} // namespace openpgp diff --git a/src/openpgp/s_expression.h b/src/openpgp/s_expression.h new file mode 100644 index 0000000..b46bf21 --- /dev/null +++ b/src/openpgp/s_expression.h @@ -0,0 +1,78 @@ +// Copyright (c) 2020, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#pragma once + +#include +#include + +#include + +namespace openpgp +{ + +class s_expression +{ +public: + s_expression(const s_expression &) = delete; + s_expression &operator=(const s_expression &) = delete; + + template + s_expression(Args... args) + { + if (gcry_sexp_build(&data, nullptr, args...) != GPG_ERR_NO_ERROR) + { + throw std::runtime_error("failed to build S-expression"); + } + } + + s_expression(s_expression &&other) + { + std::swap(data, other.data); + } + + s_expression(gcry_sexp_t data) + : data(data) + { + } + + ~s_expression() + { + gcry_sexp_release(data); + } + + const gcry_sexp_t &get() const + { + return data; + } + +private: + gcry_sexp_t data = nullptr; +}; + +} // namespace openpgp diff --git a/src/openpgp/serialization.h b/src/openpgp/serialization.h new file mode 100644 index 0000000..fb42c1b --- /dev/null +++ b/src/openpgp/serialization.h @@ -0,0 +1,172 @@ +// Copyright (c) 2020, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#pragma once + +#include "mpi.h" + +namespace openpgp +{ + +size_t bits_to_bytes(size_t bits) +{ + constexpr const uint16_t bits_in_byte = 8; + return (bits + bits_in_byte - 1) / bits_in_byte; +} + +std::string strip_line_breaks(const std::string &string) +{ + std::string result; + result.reserve(string.size()); + for (const auto &character : string) + { + if (character != '\r' && character != '\n') + { + result.push_back(character); + } + } + return result; +} + +struct packet_tag +{ + enum type : uint8_t + { + signature = 2, + public_key = 6, + user_id = 13, + public_subkey = 14, + }; + + const type packet_type; + const size_t length; +}; + +template < + typename byte_container, + typename = typename std::enable_if<(sizeof(typename byte_container::value_type) == 1)>::type> +class deserializer +{ +public: + deserializer(byte_container buffer) + : buffer(std::move(buffer)) + , cursor(0) + { + } + + bool empty() const + { + return buffer.size() - cursor == 0; + } + + packet_tag read_packet_tag() + { + const auto tag = read_big_endian(); + + constexpr const uint8_t format_mask = 0b11000000; + constexpr const uint8_t format_old_tag = 0b10000000; + if ((tag & format_mask) != format_old_tag) + { + throw std::runtime_error("invalid packet tag"); + } + + const packet_tag::type packet_type = static_cast((tag & 0b00111100) >> 2); + const uint8_t length_type = tag & 0b00000011; + + size_t length; + switch (length_type) + { + case 0: + length = read_big_endian(); + break; + case 1: + length = read_big_endian(); + break; + case 2: + length = read_big_endian(); + break; + default: + throw std::runtime_error("unsupported packet length type"); + } + + return {packet_type, length}; + } + + mpi read_mpi() + { + const size_t bit_length = read_big_endian(); + return mpi(read_span(bits_to_bytes(bit_length))); + } + + std::vector read(size_t size) + { + if (buffer.size() - cursor < size) + { + throw std::runtime_error("insufficient buffer size"); + } + + const size_t offset = cursor; + cursor += size; + + return {&buffer[offset], &buffer[cursor]}; + } + + template ::value>::type> + T read_big_endian() + { + if (buffer.size() - cursor < sizeof(T)) + { + throw std::runtime_error("insufficient buffer size"); + } + T result = 0; + for (size_t read = 0; read < sizeof(T); ++read) + { + result = (result << 8) | static_cast(buffer[cursor++]); + } + return result; + } + + epee::span read_span(size_t size) + { + if (buffer.size() - cursor < size) + { + throw std::runtime_error("insufficient buffer size"); + } + + const size_t offset = cursor; + cursor += size; + + return {reinterpret_cast(&buffer[offset]), size}; + } + +private: + byte_container buffer; + size_t cursor; +}; + +} // namespace openpgp diff --git a/src/qrcode/CMakeLists.txt b/src/qrcode/CMakeLists.txt new file mode 100644 index 0000000..9ffcf58 --- /dev/null +++ b/src/qrcode/CMakeLists.txt @@ -0,0 +1,21 @@ +# Copyright (C) 2017 KeePassXC Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 or (at your option) +# version 3 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set(qrcode_SOURCES + QrCode.cpp +) + +add_library(qrcode STATIC ${qrcode_SOURCES}) +target_link_libraries(qrcode Qt5::Core Qt5::Widgets Qt5::Svg ${QRENCODE_LIBRARY}) diff --git a/src/qrcode/QrCode.cpp b/src/qrcode/QrCode.cpp new file mode 100644 index 0000000..7a51155 --- /dev/null +++ b/src/qrcode/QrCode.cpp @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Portions copyright (c) 2020, The Monero Project + */ + +#include "QrCode.h" +#include "QrCode_p.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +QrCodePrivate::QrCodePrivate() + : m_qrcode(nullptr) +{ +} + +QrCodePrivate::~QrCodePrivate() +{ + if (m_qrcode) { + QRcode_free(m_qrcode); + } +} + +QrCode::QrCode() + : d_ptr(new QrCodePrivate()) +{ +} + +QrCode::QrCode(const QString& data, const Version version, const ErrorCorrectionLevel ecl, const bool caseSensitive) + : d_ptr(new QrCodePrivate()) +{ + init(data, version, ecl, caseSensitive); +} + +QrCode::QrCode(const QByteArray& data, const Version version, const ErrorCorrectionLevel ecl) + : d_ptr(new QrCodePrivate()) +{ + init(data, version, ecl); +} + +QrCode::~QrCode() = default; + +void QrCode::init(const QString& data, const Version version, const ErrorCorrectionLevel ecl, bool caseSensitive) +{ + if (data.isEmpty()) { + return; + } + + d_ptr->m_qrcode = QRcode_encodeString(data.toLocal8Bit().data(), + static_cast(version), + static_cast(ecl), + QR_MODE_8, + caseSensitive ? 1 : 0); +} + +void QrCode::init(const QByteArray& data, const Version version, const ErrorCorrectionLevel ecl) +{ + if (data.isEmpty()) { + return; + } + + d_ptr->m_qrcode = QRcode_encodeData(data.size(), + reinterpret_cast(data.data()), + static_cast(version), + static_cast(ecl)); +} + +bool QrCode::isValid() const +{ + return d_ptr->m_qrcode != nullptr; +} + +void QrCode::writeSvg(QIODevice* outputDevice, const int dpi, const int margin) const +{ + if (margin < 0 || d_ptr->m_qrcode == nullptr || outputDevice == nullptr) { + return; + } + + const int width = d_ptr->m_qrcode->width + margin * 2; + + QSvgGenerator generator; + generator.setSize(QSize(width, width)); + generator.setViewBox(QRect(0, 0, width, width)); + generator.setResolution(dpi); + generator.setOutputDevice(outputDevice); + + QPainter painter; + painter.begin(&generator); + + // Background + painter.setClipRect(QRect(0, 0, width, width)); + painter.fillRect(QRect(0, 0, width, width), Qt::white); + + // Foreground + // "Dots" are stored in a quint8 x quint8 array using row-major order. + // A dot is black if the LSB of its corresponding quint8 is 1. + const QPen pen(Qt::black, 0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin); + const QBrush brush(Qt::black); + painter.setPen(pen); + painter.setBrush(brush); + + const int rowSize = d_ptr->m_qrcode->width; + unsigned char* dot = d_ptr->m_qrcode->data; + for (int y = 0; y < rowSize; ++y) { + for (int x = 0; x < rowSize; ++x) { + if (quint8(0x01) == (static_cast(*dot++) & quint8(0x01))) { + painter.drawRect(margin + x, margin + y, 1, 1); + } + } + } + + painter.end(); +} + +QPixmap QrCode::toPixmap(const int margin) const +{ + if (margin < 0 || d_ptr->m_qrcode == nullptr) { + return QPixmap(); + } + + const int width = d_ptr->m_qrcode->width + margin * 2; + + QPixmap pixmap(width, width); + pixmap.fill(Qt::white); + + QPainter painter; + painter.begin(&pixmap); + + // Foreground + // "Dots" are stored in a quint8 x quint8 array using row-major order. + // A dot is black if the LSB of its corresponding quint8 is 1. + const QPen pen(Qt::black, 1); + const QBrush brush(Qt::black); + painter.setPen(pen); + painter.setBrush(brush); + + const int rowSize = d_ptr->m_qrcode->width; + unsigned char* dot = d_ptr->m_qrcode->data; + for (int y = 0; y < rowSize; ++y) { + for (int x = 0; x < rowSize; ++x) { + if (quint8(0x01) == (static_cast(*dot++) & quint8(0x01))) { + painter.drawPoint(margin +x, margin + y); + } + } + } + painter.end(); + + return pixmap; +} \ No newline at end of file diff --git a/src/qrcode/QrCode.h b/src/qrcode/QrCode.h new file mode 100644 index 0000000..50173b4 --- /dev/null +++ b/src/qrcode/QrCode.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Portions copyright (c) 2020, The Monero Project + */ + +#ifndef KEEPASSX_QRCODE_H +#define KEEPASSX_QRCODE_H + +#include +#include +#include + +class QImage; +class QIODevice; +class QString; +class QByteArray; + +struct QrCodePrivate; + +class QrCode +{ + +public: + enum class ErrorCorrectionLevel : int + { + LOW = 0, + MEDIUM, + QUARTILE, + HIGH + }; + + // See: http://www.qrcode.com/en/about/version.html + // clang-format off + enum class Version : int + { + AUTO = 0, + V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, + V21, V22, V23, V24, V25, V26, V27, V28, V29, V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V40 + }; + // clang-format on + + // Uses QRcode_encodeString (can't contain NUL characters) + explicit QrCode(const QString& data, + const Version version = Version::AUTO, + const ErrorCorrectionLevel ecl = ErrorCorrectionLevel::HIGH, + const bool caseSensitive = true); + + // Uses QRcode_encodeData (can contain NUL characters) + explicit QrCode(const QByteArray& data, + const Version version = Version::AUTO, + const ErrorCorrectionLevel ecl = ErrorCorrectionLevel::HIGH); + + QrCode(); + ~QrCode(); + + bool isValid() const; + void writeSvg(QIODevice* outputDevice, const int dpi, const int margin = 4) const; + QPixmap toPixmap(const int margin = 4) const; + +private: + void init(const QString& data, const Version version, const ErrorCorrectionLevel ecl, const bool caseSensitive); + + void init(const QByteArray& data, const Version version, const ErrorCorrectionLevel ecl); + + QScopedPointer d_ptr; +}; + +#endif // KEEPASSX_QRCODE_H diff --git a/src/qrcode/QrCode_p.h b/src/qrcode/QrCode_p.h new file mode 100644 index 0000000..0161b79 --- /dev/null +++ b/src/qrcode/QrCode_p.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* This class exists to isolate from the rest of the code base. */ + +#ifndef KEEPASSX_QRCODEPRIVATE_H +#define KEEPASSX_QRCODEPRIVATE_H + +#include + +struct QrCodePrivate +{ + QRcode* m_qrcode; + + QrCodePrivate(); + ~QrCodePrivate(); +}; + +#endif // KEEPASSX_QRCODEPRIVATE_H diff --git a/src/receivewidget.cpp b/src/receivewidget.cpp new file mode 100644 index 0000000..813eb17 --- /dev/null +++ b/src/receivewidget.cpp @@ -0,0 +1,151 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "ui_receivewidget.h" +#include "receivewidget.h" +#include "qrcode/QrCode.h" +#include "model/ModelUtils.h" +#include "dialog/qrcodedialog.h" + +#include +#include + +ReceiveWidget::ReceiveWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::ReceiveWidget) +{ + ui->setupUi(this); + + // header context menu + ui->addresses->header()->setContextMenuPolicy(Qt::CustomContextMenu); + m_headerMenu = new QMenu(this); + m_showFullAddressesAction = m_headerMenu->addAction("Show full addresses", this, &ReceiveWidget::setShowFullAddresses); + m_showFullAddressesAction->setCheckable(true); + m_showUsedAddressesAction = m_headerMenu->addAction("Show used addresses", this, &ReceiveWidget::setShowUsedAddresses); + m_showUsedAddressesAction->setCheckable(true); + connect(ui->addresses->header(), &QHeaderView::customContextMenuRequested, this, &ReceiveWidget::showHeaderMenu); + + // context menu + ui->addresses->setContextMenuPolicy(Qt::CustomContextMenu); + m_showTransactionsAction = new QAction("Show transactions"); + connect(m_showTransactionsAction, &QAction::triggered, this, &ReceiveWidget::onShowTransactions); + connect(ui->addresses, &QTreeView::customContextMenuRequested, this, &ReceiveWidget::showContextMenu); + + connect(ui->btn_generateSubaddress, &QPushButton::clicked, [=]() { + emit generateSubaddress(); + }); + + connect(ui->qrCode, &ClickableLabel::clicked, this, &ReceiveWidget::showQrCodeDialog); + connect(ui->label_addressSearch, &QLineEdit::textChanged, this, &ReceiveWidget::setSearchFilter); +} + +void ReceiveWidget::setModel(SubaddressModel * model, Subaddress * subaddress) { + m_subaddress = subaddress; + m_model = model; + m_proxyModel = new SubaddressProxyModel(this, subaddress); + m_proxyModel->setSourceModel(m_model); + ui->addresses->setModel(m_proxyModel); + + ui->addresses->setColumnHidden(SubaddressModel::isUsed, true); + ui->addresses->header()->setSectionResizeMode(SubaddressModel::Address, QHeaderView::Stretch); + ui->addresses->header()->setSectionResizeMode(SubaddressModel::Label, QHeaderView::ResizeToContents); + ui->addresses->header()->setMinimumSectionSize(200); + + connect(ui->addresses->selectionModel(), &QItemSelectionModel::currentRowChanged, [=](QModelIndex current, QModelIndex prev){ + if (current.isValid()) + this->setQrCode(current.model()->data(current.siblingAtColumn(SubaddressModel::Address), Qt::UserRole).toString()); + else + ui->qrCode->clear(); + }); +// connect(m_model, &SubaddressModel::modelReset, [this](){ +// ui->btn_generateSubaddress->setEnabled(m_model->unusedLookahead() < SUBADDRESS_LOOKAHEAD_MINOR); +// }); +} + +void ReceiveWidget::copyAddress() { + QModelIndex index = ui->addresses->currentIndex(); + ModelUtils::copyColumn(&index, SubaddressModel::Address); +} + +void ReceiveWidget::copyLabel() { + QModelIndex index = ui->addresses->currentIndex(); + ModelUtils::copyColumn(&index, SubaddressModel::Label); +} + +void ReceiveWidget::editLabel() { + QModelIndex index = ui->addresses->currentIndex().siblingAtColumn(m_model->ModelColumn::Label); + ui->addresses->setCurrentIndex(index); + ui->addresses->edit(index); +} + +void ReceiveWidget::showContextMenu(const QPoint &point) { + QModelIndex index = ui->addresses->indexAt(point); + if (!index.isValid()) { + return; + } + + auto *menu = new QMenu(ui->addresses); + bool isUsed = index.model()->data(index.siblingAtColumn(SubaddressModel::isUsed), Qt::UserRole).toBool(); + + menu->addAction(QIcon(":/assets/images/copy.png"), "Copy address", this, &ReceiveWidget::copyAddress); + menu->addAction(QIcon(":/assets/images/copy.png"), "Copy label", this, &ReceiveWidget::copyLabel); + menu->addAction(QIcon(":/assets/images/edit.png"), "Edit label", this, &ReceiveWidget::editLabel); + + if (isUsed) { + menu->addAction(m_showTransactionsAction); + } + + menu->popup(ui->addresses->viewport()->mapToGlobal(point)); +} + +void ReceiveWidget::onShowTransactions() { + QModelIndex index = ui->addresses->currentIndex(); + if (!index.isValid()) { + return; + } + + QString address = index.model()->data(index.siblingAtColumn(SubaddressModel::Address), Qt::UserRole).toString(); + emit showTransactions(address); +} + +void ReceiveWidget::setShowFullAddresses(bool show) { + if (!m_model) return; + m_model->setShowFullAddresses(show); +} + +void ReceiveWidget::setShowUsedAddresses(bool show) { + if (!m_proxyModel) return; + m_proxyModel->setShowUsed(show); +} + +void ReceiveWidget::setSearchFilter(const QString &filter) { + if (!m_proxyModel) return; + m_proxyModel->setSearchFilter(filter); +} + +void ReceiveWidget::showHeaderMenu(const QPoint& position) +{ + m_showFullAddressesAction->setChecked(m_model->isShowFullAddresses()); + m_headerMenu->exec(QCursor::pos()); +} + +void ReceiveWidget::setQrCode(const QString &address){ + const QrCode qrc(address, QrCode::Version::AUTO, QrCode::ErrorCorrectionLevel::MEDIUM); + + int width = ui->qrCode->width() - 4; + if (qrc.isValid()) { + ui->qrCode->setPixmap(qrc.toPixmap(1).scaled(width, width, Qt::KeepAspectRatio)); + } +} + +void ReceiveWidget::showQrCodeDialog() { + QModelIndex index = ui->addresses->currentIndex(); + QString address = index.model()->data(index.siblingAtColumn(SubaddressModel::Address), Qt::UserRole).toString(); + auto *dialog = new QrCodeDialog(this, address, "Address"); + dialog->exec(); + dialog->deleteLater(); +} + +ReceiveWidget::~ReceiveWidget() { + delete ui; +} diff --git a/src/receivewidget.h b/src/receivewidget.h new file mode 100644 index 0000000..73c9f85 --- /dev/null +++ b/src/receivewidget.h @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_RECEIVEWIDGET_H +#define FEATHER_RECEIVEWIDGET_H + +#include "appcontext.h" +#include "qrcode/QrCode.h" +#include "libwalletqt/Subaddress.h" +#include "model/SubaddressProxyModel.h" +#include "model/SubaddressModel.h" + +#include +#include + +namespace Ui { + class ReceiveWidget; +} + +class ReceiveWidget : public QWidget +{ +Q_OBJECT + +public: + explicit ReceiveWidget(QWidget *parent = nullptr); + void setModel(SubaddressModel * model, Subaddress * subaddress); + ~ReceiveWidget() override; + + +public slots: + void copyAddress(); + void copyLabel(); + void editLabel(); + void showContextMenu(const QPoint& point); + void setShowFullAddresses(bool show); + void setShowUsedAddresses(bool show); + void setSearchFilter(const QString &filter); + void onShowTransactions(); + +signals: + void generateSubaddress(); + void showTransactions(const QString& address); + +private slots: + void showHeaderMenu(const QPoint& position); + +private: + Ui::ReceiveWidget *ui; + QMenu *m_headerMenu; + QAction *m_showFullAddressesAction; + QAction *m_showUsedAddressesAction; + QAction *m_showTransactionsAction; + Subaddress * m_subaddress; + SubaddressModel * m_model; + SubaddressProxyModel * m_proxyModel; + + void setQrCode(const QString &address); + void showQrCodeDialog(); +}; + +#endif //FEATHER_RECEIVEWIDGET_H diff --git a/src/receivewidget.ui b/src/receivewidget.ui new file mode 100644 index 0000000..4061f43 --- /dev/null +++ b/src/receivewidget.ui @@ -0,0 +1,107 @@ + + + ReceiveWidget + + + + 0 + 0 + 878 + 512 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + true + + + + + + Search... + + + + + + + + + Qt::ScrollBarAsNeeded + + + QAbstractScrollArea::AdjustIgnored + + + false + + + false + + + + + + + QLayout::SetMinimumSize + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Generate Subaddress + + + + + + + + + + + + ClickableLabel + QLabel +
        components.h
        +
        +
        + + +
        diff --git a/src/sendwidget.cpp b/src/sendwidget.cpp new file mode 100644 index 0000000..32f93f6 --- /dev/null +++ b/src/sendwidget.cpp @@ -0,0 +1,183 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + + +#include +#include "sendwidget.h" +#include "widgets/ccswidget.h" +#include "mainwindow.h" +#include "ui_sendwidget.h" + +SendWidget::SendWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::SendWidget) +{ + ui->setupUi(this); + + QString amount_rx = R"(^\d{0,8}[\.,]\d{0,12}|(all)$)"; + QRegExp rx; + rx.setPattern(amount_rx); + QValidator *validator = new QRegExpValidator(rx, this); + ui->lineAmount->setValidator(validator); + + connect(ui->btnSend, &QPushButton::clicked, this, &SendWidget::sendClicked); + connect(ui->btnClear, &QPushButton::clicked, this, &SendWidget::clearClicked); + connect(ui->btnMax, &QPushButton::clicked, this, &SendWidget::btnMaxClicked); + connect(ui->comboCurrencySelection, QOverload::of(&QComboBox::currentIndexChanged), this, &SendWidget::currencyComboChanged); + connect(ui->lineAmount, &QLineEdit::textEdited, this, &SendWidget::amountEdited); + connect(ui->lineAddress, &QLineEdit::textEdited, this, &SendWidget::addressEdited); + connect(ui->btn_openAlias, &QPushButton::clicked, this, &SendWidget::aliasClicked); + ui->label_xmrAmount->setText(""); + ui->label_xmrAmount->hide(); + ui->btn_openAlias->hide(); +} + +void SendWidget::currencyComboChanged(int index) { + QString amount = ui->lineAmount->text(); + if(amount.isEmpty()) return; + this->amountEdited(amount); +} + +void SendWidget::addressEdited(const QString &text) { + text.contains(".") ? ui->btn_openAlias->show() : ui->btn_openAlias->hide(); +} + +void SendWidget::amountEdited(const QString &text) { + this->updateConversionLabel(); +} + +void SendWidget::fill(const CCSEntry &entry) { + this->fill(entry.address, QString("CCS: %1").arg(entry.title), 0.0); +} + +void SendWidget::fill(double amount) { + ui->lineAmount->setText(QString::number(amount)); +} + +void SendWidget::fill(const QString &address, const QString& description){ + ui->lineDescription->setText(description); + ui->lineAddress->setText(address); + ui->lineAddress->setCursorPosition(0); +} + +void SendWidget::fill(const QString &address, const QString &description, double amount) { + ui->lineDescription->setText(description); + ui->lineAmount->setText(QString::number(amount)); + ui->lineAddress->setText(address); + ui->lineAddress->setCursorPosition(0); +} + +void SendWidget::fillAddress(const QString &address) { + ui->lineAddress->setText(address); + ui->lineAddress->setCursorPosition(0); +} + +void SendWidget::sendClicked() { + double amount = 0.0; + QString currency = ui->comboCurrencySelection->currentText(); + QString recipient = ui->lineAddress->text(); // @TODO: regex + QString description = ui->lineDescription->text(); + if(recipient.isEmpty()) { + QMessageBox::warning(this, "Malformed recipient", "The recipient address was not correct"); + return; + } + + if (currency != "XMR") { + amount = this->conversionAmount(); + if(amount <= 0.0) { + QMessageBox::warning(this, "Fiat conversion error", "Could not create transaction."); + return; + } + emit createTransaction(recipient, amount, description, false); + return; + } + + amount = this->amount(); + bool sendAll = amount == -1.0; + if(amount == 0.0){ + QMessageBox::warning(this, "Amount error", "Invalid amount specified."); + return; + } + + emit createTransaction(recipient, amount, description, sendAll); +} + +void SendWidget::aliasClicked() { + auto address = ui->lineAddress->text(); + emit resolveOpenAlias(address); +} + +void SendWidget::clearClicked() { + ui->lineAddress->clear(); + ui->lineAmount->clear(); + ui->lineDescription->clear(); +} + +void SendWidget::btnMaxClicked() { + ui->lineAmount->setText("all"); +} + +void SendWidget::updateConversionLabel() { + auto amount = this->amount(); + if(amount == -1) return; + ui->label_xmrAmount->setText(""); + if(amount <= 0) { + ui->label_xmrAmount->hide(); + return; + } + + QString currency = ui->comboCurrencySelection->currentText(); + if (currency != "XMR") { + QString xmr_str = QString("%1 XMR").arg(QString::number(this->conversionAmount())); + ui->label_xmrAmount->setText(xmr_str); + ui->label_xmrAmount->show(); + } +} + +double SendWidget::conversionAmount() { + QString currency = ui->comboCurrencySelection->currentText(); + return AppContext::prices->convert(currency, "XMR", this->amount()); +} + +double SendWidget::amount() { + // grab amount from "amount" text box + QString amount = ui->lineAmount->text(); + if(amount == "all") return -1.0; + amount.replace(',', '.'); + if(amount.isEmpty()) return 0.0; + auto amount_num = amount.toDouble(); + if(amount_num <= 0) return 0.0; + return amount_num; +} + +void SendWidget::onOpenAliasResolved(const QString &address, const QString &openAlias) { + this->fill(address, openAlias); + ui->btn_openAlias->hide(); +} + +void SendWidget::onOpenAliasResolveError(const QString &msg) { + QMessageBox::warning(this, "OpenAlias error", msg); +} + +void SendWidget::clearFields() { + ui->lineAddress->clear(); + ui->lineAmount->clear(); + ui->lineDescription->clear(); + ui->label_xmrAmount->clear(); +} + +void SendWidget::onWalletClosed() { + this->clearFields(); +} + +void SendWidget::onInitiateTransaction() { + ui->btnSend->setEnabled(false); +} + +void SendWidget::onEndTransaction() { + ui->btnSend->setEnabled(true); +} + +SendWidget::~SendWidget() { + delete ui; +} diff --git a/src/sendwidget.h b/src/sendwidget.h new file mode 100644 index 0000000..fd6338c --- /dev/null +++ b/src/sendwidget.h @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef SENDWIDGET_H +#define SENDWIDGET_H + +#include +#include "appcontext.h" +#include "widgets/ccswidget.h" + +namespace Ui { + class SendWidget; +} + +class SendWidget : public QWidget +{ +Q_OBJECT + +public: + explicit SendWidget(QWidget *parent = nullptr); + void fill(const CCSEntry &entry); + void fill(const QString &address, const QString& description); + void fill(const QString &address, const QString& description, double amount); + void fill(double amount); + void clearFields(); + ~SendWidget() override; + +public slots: + void sendClicked(); + void clearClicked(); + void aliasClicked(); + void btnMaxClicked(); + void amountEdited(const QString &text); + void addressEdited(const QString &text); + void currencyComboChanged(int index); + void fillAddress(const QString &address); + void updateConversionLabel(); + void onOpenAliasResolveError(const QString &err); + void onOpenAliasResolved(const QString &address, const QString &openAlias); + void onWalletClosed(); + + void onInitiateTransaction(); + void onEndTransaction(); + +signals: + void resolveOpenAlias(const QString &address); + void createTransaction(const QString &address, double amount, const QString &description, bool all); + +private: + Ui::SendWidget *ui; + AppContext *m_ctx; + double amount(); + double conversionAmount(); +}; + +#endif // SENDWIDGET_H diff --git a/src/sendwidget.ui b/src/sendwidget.ui new file mode 100644 index 0000000..fb0b265 --- /dev/null +++ b/src/sendwidget.ui @@ -0,0 +1,225 @@ + + + SendWidget + + + + 0 + 0 + 500 + 148 + + + + Form + + + + QLayout::SetMinimumSize + + + QFormLayout::ExpandingFieldsGrow + + + QFormLayout::DontWrapRows + + + 9 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Pay to + + + + + + + + + + + + + + Description + + + + + + + + + + Amount + + + + + + + 12 + + + QLayout::SetDefaultConstraint + + + + + 0 + + + + + + 0 + 0 + + + + + 100 + 0 + + + + + 200 + 16777215 + + + + + + + + + XMR + + + + + EUR + + + + + USD + + + + + GBP + + + + + JPY + + + + + RMB + + + + + + + + + + Max + + + + + + + true + + + xmrAmount + + + + + + + Qt::Horizontal + + + + 100 + 20 + + + + + + + + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Resolve OpenAlias + + + + + + + Clear + + + + + + + Send + + + + + + + + + + + sendClicked() + maxClicked() + clearClicked() + + diff --git a/src/settings.cpp b/src/settings.cpp new file mode 100644 index 0000000..5175eb9 --- /dev/null +++ b/src/settings.cpp @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "settings.h" +#include "ui_settings.h" +#include "appcontext.h" +#include "utils/config.h" +#include "mainwindow.h" + +Settings::Settings(QWidget *parent) : + QDialog(parent), + ui(new Ui::Settings) +{ + ui->setupUi(this); + this->setWindowIcon(QIcon("://assets/images/appicons/64x64.png")); + + if(m_ctx == nullptr) + m_ctx = MainWindow::getContext(); + + ui->tabWidget->setTabVisible(2, false); + ui->tabWidget->setTabVisible(4, false); + + connect(ui->btnCopyToClipboard, &QPushButton::clicked, this, &Settings::copyToClipboard); + connect(ui->checkBox_checkForAppUpdates, &QCheckBox::clicked, this, &Settings::checkboxExternalLinkWarn); + connect(ui->checkBox_externalLink, &QCheckBox::clicked, this, &Settings::checkboxExternalLinkWarn); + connect(ui->closeButton, &QDialogButtonBox::accepted, this, &Settings::close); + + // nodes + ui->nodeWidget->setupUI(m_ctx); + connect(ui->nodeWidget, &NodeWidget::nodeSourceChanged, m_ctx->nodes, &Nodes::onNodeSourceChanged); + connect(ui->nodeWidget, &NodeWidget::connectToNode, m_ctx->nodes, QOverload::of(&Nodes::connectToNode)); + + // setup checkboxes + ui->checkBox_externalLink->setChecked(config()->get(Config::warnOnExternalLink).toBool()); + ui->checkBox_checkForAppUpdates->setChecked(config()->get(Config::checkForAppUpdates).toBool()); + + // setup comboboxes + auto settingsHomeWidget = config()->get(Config::homeWidget).toString(); + if (m_homeWidgets.contains(settingsHomeWidget)) + ui->comboBox_homeWidget->setCurrentIndex(m_homeWidgets.indexOf(settingsHomeWidget)); + + this->setupSkinCombobox(); + auto settingsSkin = config()->get(Config::skin).toString(); + if (m_skins.contains(settingsSkin)) + ui->comboBox_skin->setCurrentIndex(m_skins.indexOf(settingsSkin)); + + connect(ui->comboBox_homeWidget, QOverload::of(&QComboBox::currentIndexChanged), this, &Settings::comboBox_homeWidgetChanged); + connect(ui->comboBox_skin, QOverload::of(&QComboBox::currentIndexChanged), this, &Settings::comboBox_skinChanged); + connect(ui->comboBox_blockExplorer, QOverload::of(&QComboBox::currentIndexChanged), this, &Settings::comboBox_blockExplorerChanged); + + // setup preferred fiat currency combobox + QStringList fiatCurrencies; + for (int index = 0; index < ui->comboBox_fiatCurrency->count(); index++) + fiatCurrencies << ui->comboBox_fiatCurrency->itemText(index); + + auto preferredFiatCurrency = config()->get(Config::preferredFiatCurrency).toString(); + if(!preferredFiatCurrency.isEmpty()) + if(fiatCurrencies.contains(preferredFiatCurrency)) + ui->comboBox_fiatCurrency->setCurrentText(preferredFiatCurrency); + + connect(ui->comboBox_fiatCurrency, QOverload::of(&QComboBox::currentIndexChanged), this, &Settings::fiatCurrencySelected); + + // setup path tab +#if defined(Q_OS_LINUX) + ui->textEditPaths->appendPlainText(m_ctx->applicationPath); +#endif + ui->textEditPaths->appendPlainText(m_ctx->configDirectory); + ui->textEditPaths->appendPlainText(m_ctx->defaultWalletDir); + + this->adjustSize(); +} + +void Settings::fiatCurrencySelected(int index) { + QString selection = ui->comboBox_fiatCurrency->itemText(index); + config()->set(Config::preferredFiatCurrency, selection); + emit preferredFiatCurrencyChanged(selection); +} + +void Settings::checkboxCheckForAppUpdates() { + bool state = ui->checkBox_checkForAppUpdates->isChecked(); + config()->set(Config::checkForAppUpdates, state); +} + +void Settings::comboBox_skinChanged(int pos) { + emit skinChanged(m_skins.at(pos)); +} + +void Settings::comboBox_homeWidgetChanged(int pos) { + config()->set(Config::homeWidget, m_homeWidgets.at(pos)); + + emit homeWidgetChanged(m_homeWidgets.at(pos)); +} + +void Settings::comboBox_blockExplorerChanged(int pos) { + QString blockExplorer = ui->comboBox_blockExplorer->currentText(); + config()->set(Config::blockExplorer, blockExplorer); + emit blockExplorerChanged(blockExplorer); +} + +void Settings::copyToClipboard() { + ui->textLogs->copy(); +} + +void Settings::checkboxExternalLinkWarn() { + bool state = ui->checkBox_externalLink->isChecked(); + config()->set(Config::warnOnExternalLink, state); +} + +void Settings::setupSkinCombobox() { +#if defined(Q_OS_WIN) + m_skins.removeOne("Breeze/Dark"); + m_skins.removeOne("Breeze/Light"); +#elif defined(Q_OS_MAC) + m_skins.removeOne("QDarkStyle"); +#endif + + ui->comboBox_skin->insertItems(0, m_skins); +} + +Settings::~Settings() { + delete ui; +} diff --git a/src/settings.h b/src/settings.h new file mode 100644 index 0000000..845c79b --- /dev/null +++ b/src/settings.h @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef SETTINGS_H +#define SETTINGS_H + +#include +#include +#include + +#include "appcontext.h" +#include "widgets/nodewidget.h" + +namespace Ui { + class Settings; +} + +class Settings : public QDialog +{ +Q_OBJECT + +public: + explicit Settings(QWidget *parent = nullptr); + ~Settings() override; + +signals: + void closed(); + void preferredFiatCurrencyChanged(QString currency); + void homeWidgetChanged(QString widgetName); + void skinChanged(QString skinName); + void showHomeCCS(bool); + void blockExplorerChanged(QString blockExplorer); + +public slots: + void copyToClipboard(); + void checkboxExternalLinkWarn(); + void checkboxCheckForAppUpdates(); + void fiatCurrencySelected(int index); + void comboBox_homeWidgetChanged(int pos); + void comboBox_skinChanged(int pos); + void comboBox_blockExplorerChanged(int post); + +private: + const QStringList m_homeWidgets{"ccs", "reddit"}; + QStringList m_skins{"Native", "QDarkStyle", "Breeze/Dark", "Breeze/Light"}; + +private: + void setupSkinCombobox(); + + AppContext *m_ctx = nullptr; + Ui::Settings *ui; +}; + +#endif // SETTINGS_H diff --git a/src/settings.ui b/src/settings.ui new file mode 100644 index 0000000..91d7870 --- /dev/null +++ b/src/settings.ui @@ -0,0 +1,520 @@ + + + Settings + + + + 0 + 0 + 754 + 278 + + + + Settings + + + + + + 0 + + + + General + + + + + + Preferred fiat currency: + + + + + + + + USD + + + + + EUR + + + + + RUB + + + + + GBP + + + + + CAD + + + + + CHF + + + + + CNY + + + + + CZK + + + + + JPY + + + + + KRW + + + + + MXN + + + + + SEK + + + + + THB + + + + + TRY + + + + + ZAR + + + + + + + + Home screen widget: + + + + + + + + CCS proposals + + + + + /r/monero + + + + + + + + Appearance: + + + + + + + + + + Block explorer: + + + + + + + + exploremonero.com + + + + + xmrchain.net + + + + + moneroblocks.info + + + + + + + + Warn on wallet update available + + + + + + + Warn before opening external link + + + + + + + + Node + + + + + + + + + + Network + + + + + + + + + 0 + 0 + + + + Websockets + + + + + + Disable websocket + + + + + + + Websocket server + + + + + + + + 300 + 16777215 + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + Paths + + + + 6 + + + + + This application uses the following paths: + + + + + + + true + + + + + + + + + .. + + + Console + + + + + + + 0 + 0 + + + + + 16777215 + 70 + + + + Log source + + + + + + Qt Application + + + + + + + RPC daemon + + + + + + + Tor daemon + + + + + + + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Raised + + + 1 + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Copy to clipboard + + + + + + + Open log directory + + + + + + + Clear + + + + + + + + + + + 0 + 0 + + + + + 16777215 + 70 + + + + Log level + + + + + + Critical + + + true + + + + + + + Warning + + + true + + + + + + + Info + + + false + + + + + + + Debug + + + + + + + + + + true + + + true + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + QDialogButtonBox::Ok + + + + + + + + + + NodeWidget + QWidget +
        widgets/nodewidget.h
        + 1 +
        +
        + + + + copyToClipboard() + checkboxExternalLinkWarn() + closeClicked(QAbstractButton*) + checkboxCheckForAppUpdates() + fiatCurrencySelected(QString) + homeWidgetChanged(int) + +
        diff --git a/src/tor/.gitkeep b/src/tor/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/ui/BreezeStyleSheets/breeze.qrc b/src/ui/BreezeStyleSheets/breeze.qrc new file mode 100644 index 0000000..88fb185 --- /dev/null +++ b/src/ui/BreezeStyleSheets/breeze.qrc @@ -0,0 +1,89 @@ + + + light/hmovetoolbar.svg + light/vmovetoolbar.svg + light/hsepartoolbar.svg + light/vsepartoolbars.svg + light/stylesheet-branch-end.svg + light/stylesheet-branch-end-closed.svg + light/stylesheet-branch-end-open.svg + light/stylesheet-vline.svg + light/stylesheet-branch-more.svg + light/branch_closed.svg + light/branch_closed-on.svg + light/branch_open.svg + light/branch_open-on.svg + light/down_arrow.svg + light/down_arrow_disabled.svg + light/down_arrow-hover.svg + light/left_arrow.svg + light/left_arrow_disabled.svg + light/right_arrow.svg + light/right_arrow_disabled.svg + light/up_arrow.svg + light/up_arrow_disabled.svg + light/up_arrow-hover.svg + light/sizegrip.svg + light/transparent.svg + light/close.svg + light/close-hover.svg + light/close-pressed.svg + light/undock.svg + light/undock-hover.svg + light/checkbox_checked-hover.svg + light/checkbox_checked.svg + light/checkbox_checked_disabled.svg + light/checkbox_indeterminate.svg + light/checkbox_indeterminate-hover.svg + light/checkbox_indeterminate_disabled.svg + light/checkbox_unchecked-hover.svg + light/checkbox_unchecked_disabled.svg + light/radio_checked-hover.svg + light/radio_checked.svg + light/radio_checked_disabled.svg + light/radio_unchecked-hover.svg + light/radio_unchecked_disabled.svg + dark/hmovetoolbar.svg + dark/vmovetoolbar.svg + dark/hsepartoolbar.svg + dark/vsepartoolbars.svg + dark/stylesheet-branch-end.svg + dark/stylesheet-branch-end-closed.svg + dark/stylesheet-branch-end-open.svg + dark/stylesheet-vline.svg + dark/stylesheet-branch-more.svg + dark/branch_closed.svg + dark/branch_closed-on.svg + dark/branch_open.svg + dark/branch_open-on.svg + dark/down_arrow.svg + dark/down_arrow_disabled.svg + dark/down_arrow-hover.svg + dark/left_arrow.svg + dark/left_arrow_disabled.svg + dark/right_arrow.svg + dark/right_arrow_disabled.svg + dark/up_arrow.svg + dark/up_arrow_disabled.svg + dark/up_arrow-hover.svg + dark/sizegrip.svg + dark/transparent.svg + dark/close.svg + dark/close-hover.svg + dark/close-pressed.svg + dark/undock.svg + dark/undock-hover.svg + dark/checkbox_checked.svg + dark/checkbox_checked_disabled.svg + dark/checkbox_indeterminate.svg + dark/checkbox_indeterminate_disabled.svg + dark/checkbox_unchecked.svg + dark/checkbox_unchecked_disabled.svg + dark/radio_checked.svg + dark/radio_checked_disabled.svg + dark/radio_unchecked.svg + dark/radio_unchecked_disabled.svg + light.qss + dark.qss + + diff --git a/src/ui/BreezeStyleSheets/dark.qss b/src/ui/BreezeStyleSheets/dark.qss new file mode 100644 index 0000000..83f6395 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark.qss @@ -0,0 +1,1664 @@ +/* + * BreezeDark stylesheet. + * + * :author: Colin Duquesnoy + * :editor: Alex Huszagh + * :license: MIT, see LICENSE.md + * + * This is originally a fork of QDarkStyleSheet, and is based on Breeze/ + * BreezeDark color scheme, but is in no way affiliated with KDE. + * + * --------------------------------------------------------------------- + * The MIT License (MIT) + * + * Copyright (c) <2013-2014> + * Copyright (c) <2015-2016> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * --------------------------------------------------------------------- + */ + +QToolTip +{ + border: 0.1ex solid #eff0f1; + background-color: #31363b; + alternate-background-color: #3b4045; + color: #eff0f1; + padding: 0.5ex; + opacity: 200; +} + +QWidget +{ + color: #eff0f1; + background-color: #31363b; + selection-background-color:#3daee9; + selection-color: #eff0f1; + background-clip: border; + border-image: none; + border: 0px transparent black; + outline: 0; +} + +QWidget:item:hover +{ + background-color: #3daee9; + color: #eff0f1; +} + +QWidget:item:selected +{ + background-color: #3daee9; +} + + +QCheckBox +{ + spacing: 0.5ex; + outline: none; + color: #eff0f1; + margin-bottom: 0.2ex; + opacity: 200; +} + +QCheckBox:disabled +{ + color: #76797c; +} + +QGroupBox::indicator +{ + margin-left: 0.2ex; +} + +QCheckBox::indicator:unchecked, +QCheckBox::indicator:unchecked:focus +{ + border-image: url(:/dark/checkbox_unchecked_disabled.svg); +} + +QCheckBox::indicator:unchecked:hover, +QCheckBox::indicator:unchecked:pressed, +QGroupBox::indicator:unchecked:hover, +QGroupBox::indicator:unchecked:focus, +QGroupBox::indicator:unchecked:pressed +{ + border: none; + border-image: url(:/dark/checkbox_unchecked.svg); +} + +QCheckBox::indicator:checked +{ + border-image: url(:/dark/checkbox_checked.svg); +} + +QCheckBox::indicator:checked:hover, +QCheckBox::indicator:checked:focus, +QCheckBox::indicator:checked:pressed, +QGroupBox::indicator:checked:hover, +QGroupBox::indicator:checked:focus, +QGroupBox::indicator:checked:pressed +{ + border: none; + border-image: url(:/dark/checkbox_checked.svg); +} + +QCheckBox::indicator:indeterminate +{ + border-image: url(:/dark/checkbox_indeterminate.svg); +} + +QCheckBox::indicator:indeterminate:focus, +QCheckBox::indicator:indeterminate:hover, +QCheckBox::indicator:indeterminate:pressed +{ + border-image: url(:/dark/checkbox_indeterminate.svg); +} + +QCheckBox::indicator:indeterminate:disabled +{ + border-image: url(:/dark/checkbox_indeterminate_disabled.svg); +} + +QCheckBox::indicator:checked:disabled, +QGroupBox::indicator:checked:disabled +{ + border-image: url(:/dark/checkbox_checked_disabled.svg); +} + +QCheckBox::indicator:unchecked:disabled, +QGroupBox::indicator:unchecked:disabled +{ + border-image: url(:/dark/checkbox_unchecked_disabled.svg); +} + +QRadioButton +{ + spacing: 0.5ex; + outline: none; + color: #eff0f1; + margin-bottom: 0.2ex; +} + +QRadioButton:disabled +{ + color: #76797c; +} + +QRadioButton::indicator:unchecked, +QRadioButton::indicator:unchecked:focus +{ + border-image: url(:/dark/radio_unchecked_disabled.svg); +} + + +QRadioButton::indicator:unchecked:hover, +QRadioButton::indicator:unchecked:pressed +{ + border: none; + outline: none; + border-image: url(:/dark/radio_unchecked.svg); +} + + +QRadioButton::indicator:checked +{ + border: none; + outline: none; + border-image: url(:/dark/radio_checked.svg); +} + +QRadioButton::indicator:checked:hover, +QRadioButton::indicator:checked:focus, +QRadioButton::indicator:checked:pressed +{ + border: none; + outline: none; + border-image: url(:/dark/radio_checked.svg); +} + +QRadioButton::indicator:checked:disabled +{ + outline: none; + border-image: url(:/dark/radio_checked_disabled.svg); +} + +QRadioButton::indicator:unchecked:disabled +{ + border-image: url(:/dark/radio_unchecked_disabled.svg); +} + +QMenuBar +{ + background-color: #31363b; + color: #eff0f1; +} + +QMenuBar::item +{ + background: transparent; +} + +QMenuBar::item:selected +{ + background: transparent; + border: 0.1ex solid #76797c; +} + +QMenuBar::item:pressed +{ + border: 0.1ex solid #76797c; + background-color: #3daee9; + color: #eff0f1; + margin-bottom: -0.1ex; + padding-bottom: 0.1ex; +} + +QMenu +{ + border: 0.1ex solid #76797c; + color: #eff0f1; + margin: 0.2ex; +} + +QMenu::icon +{ + margin: 0.5ex; +} + +QMenu::item +{ + padding: 0.5ex 3ex 0.5ex 3ex; + margin-left: 0.5ex; + border: 0.1ex solid transparent; /* reserve space for selection border */ +} + +QMenu::item:selected +{ + color: #eff0f1; +} + +QMenu::separator +{ + height: 0.2ex; + background: lightblue; + margin-left: 1ex; + margin-right: 0.5ex; +} + +/* non-exclusive indicator = check box style indicator + (see QActionGroup::setExclusive) */ +QMenu::indicator:non-exclusive:unchecked +{ + border-image: url(:/dark/checkbox_unchecked_disabled.svg); +} + +QMenu::indicator:non-exclusive:unchecked:selected +{ + border-image: url(:/dark/checkbox_unchecked_disabled.svg); +} + +QMenu::indicator:non-exclusive:checked +{ + border-image: url(:/dark/checkbox_checked.svg); +} + +QMenu::indicator:non-exclusive:checked:selected +{ + border-image: url(:/dark/checkbox_checked.svg); +} + +/* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */ +QMenu::indicator:exclusive:unchecked +{ + border-image: url(:/dark/radio_unchecked_disabled.svg); +} + +QMenu::indicator:exclusive:unchecked:selected +{ + border-image: url(:/dark/radio_unchecked_disabled.svg); +} + +QMenu::indicator:exclusive:checked +{ + border-image: url(:/dark/radio_checked.svg); +} + +QMenu::indicator:exclusive:checked:selected +{ + border-image: url(:/dark/radio_checked.svg); +} + +QMenu::right-arrow +{ + margin: 0.5ex; + border-image: url(:/light/right_arrow.svg); + width: 0.6ex; + height: 0.9ex; +} + + +QWidget:disabled +{ + color: #454545; + background-color: #31363b; +} + +QAbstractItemView +{ + alternate-background-color: #31363b; + color: #eff0f1; + border: 0.1ex solid 3A3939; + border-radius: 0.2ex; +} + +QWidget:focus, +QMenuBar:focus +{ + border: 0.1ex solid #3daee9; +} + +QTabWidget:focus, +QCheckBox:focus, +QRadioButton:focus, +QSlider:focus +{ + border: none; +} + +QLineEdit +{ + background-color: #232629; + padding: 0.5ex; + border-style: solid; + border: 0.1ex solid #76797c; + border-radius: 0.2ex; + color: #eff0f1; +} + +QGroupBox +{ + border: 0.1ex solid #76797c; + border-radius: 0.2ex; + padding-top: 1ex; + margin-top: 1ex; +} + +QGroupBox::title +{ + subcontrol-origin: margin; + subcontrol-position: top center; + padding-left: 0.1ex; + padding-right: 0.1ex; + margin-top: -0.7ex; +} + +QAbstractScrollArea +{ + border-radius: 0.2ex; + border: 0.1ex solid #76797c; + background-color: transparent; +} + +QScrollBar:horizontal +{ + height: 1.5ex; + margin: 0.3ex 1.5ex 0.3ex 1.5ex; + border: 0.1ex transparent #2A2929; + border-radius: 0.4ex; + background-color: #2A2929; +} + +QScrollBar::handle:horizontal +{ + background-color: #3daee9; + min-width: 0.5ex; + border-radius: 0.4ex; +} + +QScrollBar::add-line:horizontal +{ + margin: 0px 0.3ex 0px 0.3ex; + border-image: url(:/dark/right_arrow_disabled.svg); + width: 1ex; + height: 1ex; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal +{ + margin: 0ex 0.3ex 0ex 0.3ex; + border-image: url(:/dark/left_arrow_disabled.svg); + width: 1ex; + height: 1ex; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal:hover, +QScrollBar::add-line:horizontal:on +{ + border-image: url(:/dark/right_arrow.svg); + width: 1ex; + height: 1ex; + subcontrol-position: right; + subcontrol-origin: margin; +} + + +QScrollBar::sub-line:horizontal:hover, +QScrollBar::sub-line:horizontal:on +{ + border-image: url(:/dark/left_arrow.svg); + width: 1ex; + height: 1ex; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:horizontal, +QScrollBar::down-arrow:horizontal +{ + background: none; +} + + +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal +{ + background: none; +} + +QScrollBar:vertical +{ + background-color: #2A2929; + width: 1.5ex; + margin: 1.5ex 0.3ex 1.5ex 0.3ex; + border: 0.1ex transparent #2A2929; + border-radius: 0.4ex; +} + +QScrollBar::handle:vertical +{ + background-color: #3daee9; + min-height: 0.5ex; + border-radius: 0.4ex; +} + +QScrollBar::sub-line:vertical +{ + margin: 0.3ex 0ex 0.3ex 0ex; + border-image: url(:/dark/up_arrow_disabled.svg); + height: 1ex; + width: 1ex; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical +{ + margin: 0.3ex 0ex 0.3ex 0ex; + border-image: url(:/dark/down_arrow_disabled.svg); + height: 1ex; + width: 1ex; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical:hover, +QScrollBar::sub-line:vertical:on +{ + + border-image: url(:/dark/up_arrow.svg); + height: 1ex; + width: 1ex; + subcontrol-position: top; + subcontrol-origin: margin; +} + + +QScrollBar::add-line:vertical:hover, +QScrollBar::add-line:vertical:on +{ + border-image: url(:/dark/down_arrow.svg); + height: 1ex; + width: 1ex; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical +{ + background: none; +} + + +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical +{ + background: none; +} + +QTextEdit +{ + background-color: #232629; + color: #eff0f1; + border: 0.1ex solid #76797c; +} + +QPlainTextEdit +{ + background-color: #232629;; + color: #eff0f1; + border-radius: 0.2ex; + border: 0.1ex solid #76797c; +} + +QHeaderView::section +{ + background-color: #76797c; + color: #eff0f1; + padding: 0.5ex; + border: 0.1ex solid #76797c; +} + +QSizeGrip +{ + border-image: url(:/dark/sizegrip.svg); + width: 1.2ex; + height: 1.2ex; +} + +QMainWindow::separator +{ + background-color: #31363b; + color: white; + padding-left: 0.4ex; + spacing: 0.2ex; + border: 0.1ex dashed #76797c; +} + +QMainWindow::separator:hover +{ + + background-color: #787876; + color: white; + padding-left: 0.4ex; + border: 0.1ex solid #76797c; + spacing: 0.2ex; +} + +QMenu::separator +{ + height: 0.1ex; + background-color: #76797c; + color: white; + padding-left: 0.4ex; + margin-left: 1ex; + margin-right: 0.5ex; +} + +QFrame[frameShape="2"], /* QFrame::Panel == 0x0003 */ +QFrame[frameShape="3"], /* QFrame::WinPanel == 0x0003 */ +QFrame[frameShape="4"], /* QFrame::HLine == 0x0004 */ +QFrame[frameShape="5"], /* QFrame::VLine == 0x0005 */ +QFrame[frameShape="6"] /* QFrame::StyledPanel == 0x0006 */ +{ + border-width: 0.1ex; + padding: 0.1ex; + border-style: solid; + border-color: #31363b; + background-color: #76797c; + border-radius: 0.5ex; +} + +QStackedWidget +{ + border: 0.1ex transparent black; +} + +QToolBar +{ + border: 0.1ex transparent #393838; + background: 0.1ex solid #31363b; + font-weight: bold; +} + +QToolBar::handle:horizontal +{ + border-image: url(:/dark/hmovetoolbar.svg); + width = 1.6ex; + height = 6.4ex; +} + +QToolBar::handle:vertical +{ + border-image: url(:/dark/vmovetoolbar.svg); + width = 5.4ex; + height = 1ex; +} + +QToolBar::separator:horizontal +{ + border-image: url(:/dark/hsepartoolbar.svg); + width = 0.7ex; + height = 6.3ex; +} + +QToolBar::separator:vertical +{ + border-image: url(:/dark/vsepartoolbars.svg); + width = 6.3ex; + height = 0.7ex; +} + +QPushButton +{ + color: #eff0f1; + background-color: qlineargradient(x1: 0.5, y1: 0.5 x2: 0.5, y2: 1, stop: 0 #3b4045, stop: 0.5 #31363b); + border-width: 0.1ex; + border-color: #76797c; + border-style: solid; + padding: 0.5ex; + border-radius: 0.2ex; + outline: none; +} + +QPushButton:disabled +{ + background-color: #31363b; + border-width: 0.1ex; + border-color: #454545; + border-style: solid; + padding-top: 0.5ex; + padding-bottom: 0.5ex; + padding-left: 1ex; + padding-right: 1ex; + border-radius: 0.2ex; + color: #454545; +} + +QPushButton:focus +{ + color: white; +} + +QPushButton:pressed +{ + background-color: #31363b; + padding-top: -1.5ex; + padding-bottom: -1.7ex; +} + +QComboBox +{ + selection-background-color: #3daee9; + border-style: solid; + border: 0.1ex solid #76797c; + border-radius: 0.2ex; + padding: 0.5ex; + min-width: 7.5ex; +} + +QPushButton:checked +{ + background-color: #76797c; + border-color: #6A6969; +} + +QPushButton:hover +{ + background-color: qlineargradient(x1: 0.5, y1: 0.5 x2: 0.5, y2: 1, stop: 0 #454a4f, stop: 0.5 #3b4045); + border: 0.1ex solid #3daee9; + color: #eff0f1; +} + +QPushButton:checked:hover +{ + background-color: qlineargradient(x1: 0.5, y1: 0.5 x2: 0.5, y2: 1, stop: 0 #808386, stop: 0.5 #76797c); + border: 0.1ex solid #3daee9; + color: #eff0f1; +} + +QComboBox:hover, +QAbstractSpinBox:hover, +QLineEdit:hover, +QTextEdit:hover, +QPlainTextEdit:hover, +QAbstractView:hover, +QTreeView:hover +{ + border: 0.1ex solid #3daee9; + color: #eff0f1; +} + +QComboBox:hover:pressed, +QPushButton:hover:pressed, +QAbstractSpinBox:hover:pressed, +QLineEdit:hover:pressed, +QTextEdit:hover:pressed, +QPlainTextEdit:hover:pressed, +QAbstractView:hover:pressed, +QTreeView:hover:pressed +{ + background-color: #31363b; +} + +QComboBox:on +{ + padding-top: 0.3ex; + padding-left: 0.4ex; + selection-background-color: #4a4a4a; +} + +QComboBox QAbstractItemView +{ + background-color: #232629; + border-radius: 0.2ex; + border: 0.1ex solid #76797c; + selection-background-color: #3daee9; +} + +QComboBox::drop-down +{ + subcontrol-origin: padding; + subcontrol-position: top right; + width: 1.5ex; + + border-left-width: 0ex; + border-left-color: darkgray; + border-left-style: solid; + border-top-right-radius: 0.3ex; + border-bottom-right-radius: 0.3ex; +} + +QComboBox::down-arrow +{ + border-image: url(:/dark/down_arrow_disabled.svg); + width: 0.9ex; + height: 0.6ex; +} + +QComboBox::down-arrow:on, +QComboBox::down-arrow:hover, +QComboBox::down-arrow:focus +{ + border-image: url(:/dark/down_arrow.svg); + width: 0.9ex; + height: 0.6ex; +} + +QAbstractSpinBox +{ + padding: 0.5ex; + border: 0.1ex solid #76797c; + background-color: #232629; + color: #eff0f1; + border-radius: 0.2ex; + min-width: 7.5ex; +} + +QAbstractSpinBox:up-button +{ + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: center right; +} + +QAbstractSpinBox:down-button +{ + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: center left; +} + +QAbstractSpinBox::up-arrow, +QAbstractSpinBox::up-arrow:disabled, +QAbstractSpinBox::up-arrow:off +{ + border-image: url(:/dark/up_arrow_disabled.svg); + width: 0.9ex; + height: 0.6ex; +} + +QAbstractSpinBox::up-arrow:hover +{ + border-image: url(:/dark/up_arrow.svg); + width: 0.9ex; + height: 0.6ex; +} + +QAbstractSpinBox::down-arrow, +QAbstractSpinBox::down-arrow:disabled, +QAbstractSpinBox::down-arrow:off +{ + border-image: url(:/dark/down_arrow_disabled.svg); + width: 0.9ex; + height: 0.6ex; +} + +QAbstractSpinBox::down-arrow:hover +{ + border-image: url(:/dark/down_arrow.svg); + width: 0.9ex; + height: 0.6ex; +} + +QLabel +{ + border: 0ex solid black; +} + +/* BORDERS */ +QTabWidget::pane +{ + padding: 0.5ex; + margin: 0.1ex; +} + +QTabWidget::pane:top +{ + border: 0.1ex solid #76797c; + top: -0.1ex; +} + +QTabWidget::pane:bottom +{ + border: 0.1ex solid #76797c; + bottom: -0.1ex; +} + +QTabWidget::pane:left +{ + border: 0.1ex solid #76797c; + right: -0.1ex; +} + +QTabWidget::pane:right +{ + border: 0.1ex solid #76797c; + left: -0.1ex; +} + + +QTabBar +{ + qproperty-drawBase: 0; + left: 0.5ex; /* move to the right by 0.5ex */ + border-radius: 0.3ex; +} + +QTabBar:focus +{ + border: 0ex transparent black; +} + +QTabBar::close-button +{ + border-image: url(:/dark/close.svg); + background: transparent; +} + +QTabBar::close-button:hover +{ + border-image: url(:/dark/close-hover.svg); + width: 1.2ex; + height: 1.2ex; + background: transparent; +} + +QTabBar::close-button:pressed +{ + border-image: url(:/dark/close-pressed.svg); + width: 1.2ex; + height: 1.2ex; + background: transparent; +} + +/* TOP TABS */ +QTabBar::tab:top +{ + color: #eff0f1; + border: 0.1ex transparent black; + border-left: 0.1ex solid #76797c; + border-top: 0.1ex solid #76797c; + background-color: #31363b; + padding: 0.5ex; + min-width: 50px; + border-top-left-radius: 0.2ex; + border-top-right-radius: 0.2ex; +} + +QTabBar::tab:top:last, +QTabBar::tab:top:only-one +{ + color: #eff0f1; + border: 0.1ex transparent black; + border-left: 0.1ex solid #76797c; + border-right: 0.1ex solid #76797c; + border-top: 0.1ex solid #76797c; + background-color: #31363b; + padding: 0.5ex; + min-width: 50px; + border-top-left-radius: 0.2ex; + border-top-right-radius: 0.2ex; +} + +QTabBar::tab:top:!selected +{ + color: #eff0f1; + background-color: #54575B; + border: 0.1ex transparent black; + border-left: 0.1ex solid #76797c; + border-top-left-radius: 0.2ex; + border-top-right-radius: 0.2ex; +} + +QTabBar::tab:top:first:!selected +{ + color: #eff0f1; + background-color: #54575B; + border: 0.1ex transparent black; + border-top-left-radius: 0.2ex; + border-top-right-radius: 0.2ex; +} + +QTabBar::tab:top:!selected:hover +{ + background-color: rgba(61, 173, 232, 0.2); + border: 0.1ex rgba(61, 173, 232, 0.2); + border-left: 0.1ex solid #76797c; +} + +QTabBar::tab:top:!selected:first:hover +{ + background-color: rgba(61, 173, 232, 0.2); + border: 0.1ex rgba(61, 173, 232, 0.2); +} + +/* BOTTOM TABS */ + +QTabBar::tab:bottom +{ + color: #eff0f1; + border: 0.1ex transparent black; + border-left: 0.1ex solid #76797c; + border-bottom: 0.1ex solid #76797c; + background-color: #31363b; + padding: 0.5ex; + border-bottom-left-radius: 0.2ex; + border-bottom-right-radius: 0.2ex; + min-width: 50px; +} + +QTabBar::tab:bottom:last, +QTabBar::tab:bottom:only-one +{ + color: #eff0f1; + border: 0.1ex transparent black; + border-left: 0.1ex solid #76797c; + border-right: 0.1ex solid #76797c; + border-bottom: 0.1ex solid #76797c; + background-color: #31363b; + padding: 0.5ex; + border-bottom-left-radius: 0.2ex; + border-bottom-right-radius: 0.2ex; + min-width: 50px; +} + +QTabBar::tab:bottom:!selected +{ + color: #eff0f1; + background-color: #54575B; + border: 0.1ex transparent black; + border-left: 0.1ex solid #76797c; + border-bottom-left-radius: 0.2ex; + border-bottom-right-radius: 0.2ex; +} + +QTabBar::tab:bottom:first:!selected +{ + color: #eff0f1; + background-color: #54575B; + border: 0.1ex transparent black; + border-top-left-radius: 0.2ex; + border-top-right-radius: 0.2ex; +} + +QTabBar::tab:bottom:!selected:hover +{ + background-color: rgba(61, 173, 232, 0.2); + border: 0.1ex rgba(61, 173, 232, 0.2); + border-left: 0.1ex solid #76797c; +} + +QTabBar::tab:bottom:!selected:first:hover +{ + background-color: rgba(61, 173, 232, 0.2); + border: 0.1ex rgba(61, 173, 232, 0.2); +} + +/* LEFT TABS */ +QTabBar::tab:left +{ + color: #eff0f1; + border: 0.1ex transparent black; + border-top: 0.1ex solid #76797c; + border-right: 0.1ex solid #76797c; + background-color: #31363b; + padding: 0.5ex; + border-top-right-radius: 0.2ex; + border-bottom-right-radius: 0.2ex; + min-height: 50px; +} + +QTabBar::tab:left:last, +QTabBar::tab:left:only-one +{ + color: #eff0f1; + border: 0.1ex transparent black; + border-top: 0.1ex solid #76797c; + border-bottom: 0.1ex solid #76797c; + border-right: 0.1ex solid #76797c; + background-color: #31363b; + padding: 0.5ex; + border-top-right-radius: 0.2ex; + border-bottom-right-radius: 0.2ex; + min-height: 50px; +} + +QTabBar::tab:left:!selected +{ + color: #eff0f1; + background-color: #54575B; + border: 0.1ex transparent black; + border-top: 0.1ex solid #76797c; + border-top-right-radius: 0.2ex; + border-bottom-right-radius: 0.2ex; +} + +QTabBar::tab:left:!selected:hover +{ + background-color: rgba(61, 173, 232, 0.2); + border: 0.1ex rgba(61, 173, 232, 0.2); + border-top: 0.1ex solid #76797c; +} + +QTabBar::tab:left:!selected:first:hover +{ + background-color: rgba(61, 173, 232, 0.2); + border: 0.1ex rgba(61, 173, 232, 0.2); +} + +/* RIGHT TABS */ +QTabBar::tab:right +{ + color: #eff0f1; + border: 0.1ex transparent black; + border-top: 0.1ex solid #76797c; + border-left: 0.1ex solid #76797c; + background-color: #31363b; + padding: 0.5ex; + border-top-left-radius: 0.2ex; + border-bottom-left-radius: 0.2ex; + min-height: 50px; +} + +QTabBar::tab:right:last, +QTabBar::tab:right:only-one +{ + color: #eff0f1; + border: 0.1ex transparent black; + border-top: 0.1ex solid #76797c; + border-bottom: 0.1ex solid #76797c; + border-left: 0.1ex solid #76797c; + background-color: #31363b; + padding: 0.5ex; + border-top-left-radius: 0.2ex; + border-bottom-left-radius: 0.2ex; + min-height: 50px; +} + +QTabBar::tab:right:!selected +{ + color: #eff0f1; + background-color: #54575B; + border: 0.1ex transparent black; + border-top: 0.1ex solid #76797c; + border-top-left-radius: 0.2ex; + border-bottom-left-radius: 0.2ex; +} + +QTabBar::tab:right:!selected:hover +{ + background-color: rgba(61, 173, 232, 0.2); + border: 0.1ex rgba(61, 173, 232, 0.2); + border-top: 0.1ex solid #76797c; +} + +QTabBar::tab:right:!selected:first:hover +{ + background-color: rgba(61, 173, 232, 0.2); + border: 0.1ex rgba(61, 173, 232, 0.2); +} + +QTabBar QToolButton::right-arrow:enabled +{ + border-image: url(:/dark/right_arrow.svg); +} + +QTabBar QToolButton::left-arrow:enabled +{ + border-image: url(:/dark/left_arrow.svg); +} + +QTabBar QToolButton::right-arrow:disabled +{ + border-image: url(:/dark/right_arrow_disabled.svg); +} + +QTabBar QToolButton::left-arrow:disabled +{ + border-image: url(:/dark/left_arrow_disabled.svg); +} + +QDockWidget +{ + background: #31363b; + border: 0.1ex solid #403F3F; + titlebar-close-icon: url(:/dark/transparent.svg); + titlebar-normal-icon: url(:/dark/transparent.svg); +} + +QDockWidget::close-button, +QDockWidget::float-button +{ + border: 0.1ex solid transparent; + border-radius: 0.2ex; + background: transparent; +} + +QDockWidget::float-button +{ + border-image: url(:/dark/undock.svg); +} + +QDockWidget::float-button:hover +{ + border-image: url(:/dark/undock-hover.svg) ; +} + +QDockWidget::close-button +{ + border-image: url(:/dark/close.svg) ; +} + +QDockWidget::close-button:hover +{ + border-image: url(:/dark/close-hover.svg) ; +} + +QDockWidget::close-button:pressed +{ + border-image: url(:/dark/close-pressed.svg) ; +} + +QTreeView, +QListView +{ + border: 0.1ex solid #76797c; + background-color: #232629; +} + +QTreeView::branch:has-siblings:!adjoins-item +{ + border-image: url(:/dark/stylesheet-vline.svg) 0; +} + +QTreeView::branch:has-siblings:adjoins-item +{ + border-image: url(:/dark/stylesheet-branch-more.svg) 0; +} + +QTreeView::branch:!has-children:!has-siblings:adjoins-item +{ + border-image: url(:/dark/stylesheet-branch-end.svg) 0; +} + +QTreeView::branch:has-children:!has-siblings:closed, +QTreeView::branch:closed:has-children:has-siblings +{ + border-image: url(:/dark/stylesheet-branch-end-closed.svg) 0; + image: url(:/dark/branch_closed.svg); +} + +QTreeView::branch:open:has-children:!has-siblings, +QTreeView::branch:open:has-children:has-siblings +{ + border-image: url(:/dark/stylesheet-branch-end-open.svg) 0; + image: url(:/dark/branch_open.svg); +} + +/* +QTreeView::branch:has-siblings:!adjoins-item { + background: cyan; +} + +QTreeView::branch:has-siblings:adjoins-item { + background: red; +} + +QTreeView::branch:!has-children:!has-siblings:adjoins-item { + background: blue; +} + +QTreeView::branch:closed:has-children:has-siblings { + background: pink; +} + +QTreeView::branch:has-children:!has-siblings:closed { + background: gray; +} + +QTreeView::branch:open:has-children:has-siblings { + background: magenta; +} + +QTreeView::branch:open:has-children:!has-siblings { + background: green; +} +*/ + +QTableView::item, +QListView::item, +QTreeView::item +{ + padding: 0.3ex; +} + +QTableView::item:!selected:hover, +QListView::item:!selected:hover, +QTreeView::item:!selected:hover +{ + background-color: rgba(61, 173, 232, 0.2); + outline: 0; + color: #eff0f1; + padding: 0.3ex; +} + + +QSlider::groove:horizontal +{ + border: 0.1ex solid #31363b; + height: 0.4ex; + background: #565a5e; + margin: 0ex; + border-radius: 0.2ex; +} + +QSlider::handle:horizontal +{ + background: #232629; + border: 0.1ex solid #626568; + width: 1.6ex; + height: 1.6ex; + margin: -0.8ex 0; + border-radius: 0.9ex; +} + +QSlider::groove:vertical +{ + border: 0.1ex solid #31363b; + width: 0.4ex; + background: #565a5e; + margin: 0ex; + border-radius: 0.3ex; +} + +QSlider::handle:vertical +{ + background: #232629; + border: 0.1ex solid #626568; + width: 1.6ex; + height: 1.6ex; + margin: 0 -0.8ex; + border-radius: 0.9ex; +} + +QSlider::handle:horizontal:hover, +QSlider::handle:horizontal:focus, +QSlider::handle:vertical:hover, +QSlider::handle:vertical:focus +{ + border: 0.1ex solid #3daee9; +} + +QSlider::sub-page:horizontal, +QSlider::add-page:vertical +{ + background: #3daee9; + border-radius: 0.3ex; +} + +QSlider::add-page:horizontal, +QSlider::sub-page:vertical +{ + background: #626568; + border-radius: 0.3ex; +} + +QToolButton +{ + background-color: transparent; + border: 0.1ex solid #76797c; + border-radius: 0.2ex; + margin: 0.3ex; + padding: 0.5ex; +} + +QToolButton[popupMode="1"] /* only for MenuButtonPopup */ +{ + padding-right: 2ex; /* make way for the popup button */ +} + +QToolButton[popupMode="2"] /* only for InstantPopup */ +{ + padding-right: 1ex; /* make way for the popup button */ +} + +QToolButton::menu-indicator +{ + border-image: none; + image: url(:/dark/down_arrow.svg); + top: -0.7ex; + left: -0.2ex; +} + +QToolButton::menu-arrow +{ + border-image: none; + image: url(:/dark/down_arrow.svg); +} + +QToolButton:hover, +QToolButton::menu-button:hover +{ + background-color: transparent; + border: 0.1ex solid #3daee9; +} + +QToolButton:checked, +QToolButton:pressed, +QToolButton::menu-button:pressed +{ + background-color: #3daee9; + border: 0.1ex solid #3daee9; + padding: 0.5ex; +} + +QToolButton::menu-button +{ + border: 0.1ex solid #76797c; + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + /* 1ex width + 0.4ex for border + no text = 2ex allocated above */ + width: 1ex; + padding: 0.5ex; + outline: none; +} + +QToolButton::menu-arrow:open +{ + border: 0.1ex solid #76797c; +} + +QPushButton::menu-indicator +{ + subcontrol-origin: padding; + subcontrol-position: bottom right; + left: 0.8ex; +} + +QTableView +{ + border: 0.1ex solid #76797c; + gridline-color: #31363b; + background-color: #232629; +} + + +QTableView, +QHeaderView +{ + border-radius: 0px; +} + +QTableView::item:pressed, +QListView::item:pressed, +QTreeView::item:pressed +{ + background: #3daee9; + color: #eff0f1; +} + +QTableView::item:selected:active, +QTreeView::item:selected:active, +QListView::item:selected:active +{ + background: #3daee9; + color: #eff0f1; +} + +QListView::item:selected:hover, +QTreeView::item:selected:hover +{ + background-color: #47b8f3; + color: #eff0f1; +} + +QHeaderView +{ + background-color: #31363b; + border: 0.1ex transparent; + border-radius: 0px; + margin: 0px; + padding: 0px; + +} + +QHeaderView::section +{ + background-color: #31363b; + color: #eff0f1; + padding: 0.5ex; + border: 0.1ex solid #76797c; + border-radius: 0px; + text-align: center; +} + +QHeaderView::section::vertical::first, +QHeaderView::section::vertical::only-one +{ + border-top: 0.1ex solid #76797c; +} + +QHeaderView::section::vertical +{ + border-top: transparent; +} + +QHeaderView::section::horizontal::first, +QHeaderView::section::horizontal::only-one +{ + border-left: 0.1ex solid #76797c; +} + +QHeaderView::section::horizontal +{ + border-left: transparent; +} + + +QHeaderView::section:checked +{ + color: white; + background-color: #334e5e; +} + + /* style the sort indicator */ +QHeaderView::down-arrow +{ + image: url(:/dark/down_arrow.svg); +} + +QHeaderView::up-arrow +{ + image: url(:/dark/up_arrow.svg); +} + +QTableCornerButton::section +{ + background-color: #31363b; + border: 0.1ex transparent #76797c; + border-radius: 0px; +} + +QToolBox +{ + padding: 0.5ex; + border: 0.1ex transparent black; +} + +QToolBox:selected +{ + background-color: #31363b; + border-color: #3daee9; +} + +QToolBox:hover +{ + border-color: #3daee9; +} + +QStatusBar::item +{ + border: 0px transparent dark; +} + +QFrame[height="3"], +QFrame[width="3"] +{ + background-color: #76797c; +} + +QSplitter::handle +{ + border: 0.1ex dashed #76797c; +} + +QSplitter::handle:hover +{ + background-color: #787876; + border: 0.1ex solid #76797c; +} + +QSplitter::handle:horizontal +{ + width: 0.1ex; +} + +QSplitter::handle:vertical +{ + height: 0.1ex; +} + +QProgressBar:horizontal +{ + background-color: #626568; + border: 0.1ex solid #31363b; + border-radius: 0.3ex; + height: 0.5ex; + text-align: right; + margin-top: 0.5ex; + margin-bottom: 0.5ex; + margin-right: 5ex; + padding: 0px; +} + +QProgressBar::chunk:horizontal +{ + background-color: #3daee9; + border: 0.1ex transparent; + border-radius: 0.3ex; +} + +QSpinBox, +QDoubleSpinBox +{ + padding-right: 1.5ex; +} + +QSpinBox::up-button, +QDoubleSpinBox::up-button +{ + subcontrol-origin: content; + subcontrol-position: right top; + + width: 1.6ex; + border-width: 0.1ex; +} + +QSpinBox::up-arrow, +QDoubleSpinBox::up-arrow +{ + border-image: url(:/dark/up_arrow.svg); + width: 0.9ex; + height: 0.6ex; +} + +QSpinBox::up-arrow:hover, +QSpinBox::up-arrow:pressed, +QDoubleSpinBox::up-arrow:hover, +QDoubleSpinBox::up-arrow:pressed +{ + border-image: url(:/dark/up_arrow-hover.svg); + width: 0.9ex; + height: 0.6ex; +} + +QSpinBox::up-arrow:disabled, +QSpinBox::up-arrow:off, +QDoubleSpinBox::up-arrow:disabled, +QDoubleSpinBox::up-arrow:off +{ + border-image: url(:/dark/up_arrow_disabled.svg); +} + +QSpinBox::down-button, +QDoubleSpinBox::down-button +{ + subcontrol-origin: content; + subcontrol-position: right bottom; + + width: 1.6ex; + border-width: 0.1ex; +} + +QSpinBox::down-arrow, +QDoubleSpinBox::down-arrow +{ + border-image: url(:/dark/down_arrow.svg); + width: 0.9ex; + height: 0.6ex; +} + +QSpinBox::down-arrow:hover, +QSpinBox::down-arrow:pressed, +QDoubleSpinBox::down-arrow:hover, +QDoubleSpinBox::down-arrow:pressed +{ + border-image: url(:/dark/down_arrow-hover.svg); + width: 0.9ex; + height: 0.6ex; +} + +QSpinBox::down-arrow:disabled, +QSpinBox::down-arrow:off, +QDoubleSpinBox::down-arrow:disabled, +QDoubleSpinBox::down-arrow:off +{ + border-image: url(:/dark/down_arrow_disabled.svg); +} + +/* fixes */ + +QPushButton:flat { + background-color: transparent; + border: none; +} + +QLabel:disabled { + color: #787878; +} + +QTableView::item:!selected:hover +{ + background-color: transparent; +} \ No newline at end of file diff --git a/src/ui/BreezeStyleSheets/dark/branch_closed-on.svg b/src/ui/BreezeStyleSheets/dark/branch_closed-on.svg new file mode 100755 index 0000000..8bd398f --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/branch_closed-on.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/branch_closed.svg b/src/ui/BreezeStyleSheets/dark/branch_closed.svg new file mode 100755 index 0000000..f5a072f --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/branch_closed.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/branch_open-on.svg b/src/ui/BreezeStyleSheets/dark/branch_open-on.svg new file mode 100755 index 0000000..4dd0c06 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/branch_open-on.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/branch_open.svg b/src/ui/BreezeStyleSheets/dark/branch_open.svg new file mode 100755 index 0000000..0745890 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/branch_open.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/checkbox_checked.svg b/src/ui/BreezeStyleSheets/dark/checkbox_checked.svg new file mode 100755 index 0000000..6753d8b --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/checkbox_checked.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/ui/BreezeStyleSheets/dark/checkbox_checked_disabled.svg b/src/ui/BreezeStyleSheets/dark/checkbox_checked_disabled.svg new file mode 100755 index 0000000..ff7e63a --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/checkbox_checked_disabled.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/ui/BreezeStyleSheets/dark/checkbox_indeterminate.svg b/src/ui/BreezeStyleSheets/dark/checkbox_indeterminate.svg new file mode 100755 index 0000000..0f17124 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/checkbox_indeterminate.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/ui/BreezeStyleSheets/dark/checkbox_indeterminate_disabled.svg b/src/ui/BreezeStyleSheets/dark/checkbox_indeterminate_disabled.svg new file mode 100755 index 0000000..bc0f285 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/checkbox_indeterminate_disabled.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/ui/BreezeStyleSheets/dark/checkbox_unchecked.svg b/src/ui/BreezeStyleSheets/dark/checkbox_unchecked.svg new file mode 100755 index 0000000..6f3e569 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/checkbox_unchecked.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/BreezeStyleSheets/dark/checkbox_unchecked_disabled.svg b/src/ui/BreezeStyleSheets/dark/checkbox_unchecked_disabled.svg new file mode 100755 index 0000000..dd73f75 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/checkbox_unchecked_disabled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/BreezeStyleSheets/dark/close-hover.svg b/src/ui/BreezeStyleSheets/dark/close-hover.svg new file mode 100755 index 0000000..e2b0dd8 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/close-hover.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/close-pressed.svg b/src/ui/BreezeStyleSheets/dark/close-pressed.svg new file mode 100755 index 0000000..a0dc249 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/close-pressed.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/close.svg b/src/ui/BreezeStyleSheets/dark/close.svg new file mode 100755 index 0000000..07b50c9 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/close.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/down_arrow-hover.svg b/src/ui/BreezeStyleSheets/dark/down_arrow-hover.svg new file mode 100755 index 0000000..408397f --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/down_arrow-hover.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/down_arrow.svg b/src/ui/BreezeStyleSheets/dark/down_arrow.svg new file mode 100755 index 0000000..a50df00 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/down_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/down_arrow_disabled.svg b/src/ui/BreezeStyleSheets/dark/down_arrow_disabled.svg new file mode 100755 index 0000000..af74a30 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/down_arrow_disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/hmovetoolbar.svg b/src/ui/BreezeStyleSheets/dark/hmovetoolbar.svg new file mode 100755 index 0000000..e4904db --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/hmovetoolbar.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/BreezeStyleSheets/dark/hsepartoolbar.svg b/src/ui/BreezeStyleSheets/dark/hsepartoolbar.svg new file mode 100755 index 0000000..89beb22 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/hsepartoolbar.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/left_arrow.svg b/src/ui/BreezeStyleSheets/dark/left_arrow.svg new file mode 100755 index 0000000..9c787ce --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/left_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/left_arrow_disabled.svg b/src/ui/BreezeStyleSheets/dark/left_arrow_disabled.svg new file mode 100755 index 0000000..2d749e7 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/left_arrow_disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/radio_checked.svg b/src/ui/BreezeStyleSheets/dark/radio_checked.svg new file mode 100755 index 0000000..b8f7064 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/radio_checked.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/ui/BreezeStyleSheets/dark/radio_checked_disabled.svg b/src/ui/BreezeStyleSheets/dark/radio_checked_disabled.svg new file mode 100755 index 0000000..523ee00 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/radio_checked_disabled.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/ui/BreezeStyleSheets/dark/radio_unchecked.svg b/src/ui/BreezeStyleSheets/dark/radio_unchecked.svg new file mode 100755 index 0000000..1a556e3 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/radio_unchecked.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/BreezeStyleSheets/dark/radio_unchecked_disabled.svg b/src/ui/BreezeStyleSheets/dark/radio_unchecked_disabled.svg new file mode 100755 index 0000000..b3da8a2 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/radio_unchecked_disabled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/BreezeStyleSheets/dark/right_arrow.svg b/src/ui/BreezeStyleSheets/dark/right_arrow.svg new file mode 100755 index 0000000..b793513 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/right_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/right_arrow_disabled.svg b/src/ui/BreezeStyleSheets/dark/right_arrow_disabled.svg new file mode 100755 index 0000000..4940025 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/right_arrow_disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/sizegrip.svg b/src/ui/BreezeStyleSheets/dark/sizegrip.svg new file mode 100755 index 0000000..3388f07 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/sizegrip.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/spinup_disabled.svg b/src/ui/BreezeStyleSheets/dark/spinup_disabled.svg new file mode 100755 index 0000000..838436d --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/spinup_disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/stylesheet-branch-end-closed.svg b/src/ui/BreezeStyleSheets/dark/stylesheet-branch-end-closed.svg new file mode 100755 index 0000000..eb73b13 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/stylesheet-branch-end-closed.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/BreezeStyleSheets/dark/stylesheet-branch-end-open.svg b/src/ui/BreezeStyleSheets/dark/stylesheet-branch-end-open.svg new file mode 100755 index 0000000..eb73b13 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/stylesheet-branch-end-open.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/BreezeStyleSheets/dark/stylesheet-branch-end.svg b/src/ui/BreezeStyleSheets/dark/stylesheet-branch-end.svg new file mode 100755 index 0000000..334ca0c --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/stylesheet-branch-end.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/BreezeStyleSheets/dark/stylesheet-branch-more.svg b/src/ui/BreezeStyleSheets/dark/stylesheet-branch-more.svg new file mode 100755 index 0000000..f5250ba --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/stylesheet-branch-more.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/BreezeStyleSheets/dark/stylesheet-vline.svg b/src/ui/BreezeStyleSheets/dark/stylesheet-vline.svg new file mode 100755 index 0000000..4e7ff6a --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/stylesheet-vline.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/transparent.svg b/src/ui/BreezeStyleSheets/dark/transparent.svg new file mode 100755 index 0000000..3a8ca5c --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/transparent.svg @@ -0,0 +1 @@ + diff --git a/src/ui/BreezeStyleSheets/dark/undock-hover.svg b/src/ui/BreezeStyleSheets/dark/undock-hover.svg new file mode 100755 index 0000000..6bddbd7 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/undock-hover.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/ui/BreezeStyleSheets/dark/undock.svg b/src/ui/BreezeStyleSheets/dark/undock.svg new file mode 100755 index 0000000..9ab2197 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/undock.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/up_arrow-hover.svg b/src/ui/BreezeStyleSheets/dark/up_arrow-hover.svg new file mode 100755 index 0000000..dd1271a --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/up_arrow-hover.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/up_arrow.svg b/src/ui/BreezeStyleSheets/dark/up_arrow.svg new file mode 100755 index 0000000..9f42239 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/up_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/up_arrow_disabled.svg b/src/ui/BreezeStyleSheets/dark/up_arrow_disabled.svg new file mode 100755 index 0000000..742e1c5 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/up_arrow_disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/dark/vmovetoolbar.svg b/src/ui/BreezeStyleSheets/dark/vmovetoolbar.svg new file mode 100755 index 0000000..0a30d45 --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/vmovetoolbar.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/ui/BreezeStyleSheets/dark/vsepartoolbars.svg b/src/ui/BreezeStyleSheets/dark/vsepartoolbars.svg new file mode 100755 index 0000000..00e91ab --- /dev/null +++ b/src/ui/BreezeStyleSheets/dark/vsepartoolbars.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/ui/BreezeStyleSheets/light.qss b/src/ui/BreezeStyleSheets/light.qss new file mode 100644 index 0000000..27feca9 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light.qss @@ -0,0 +1,1685 @@ +/* + * Breeze stylesheet. + * + * :author: Colin Duquesnoy + * :editor: Alex Huszagh + * :license: MIT, see LICENSE.md + * + * This is originally a fork of QDarkStyleSheet, and is based on Breeze/ + * BreezeDark color scheme, but is in no way affiliated with KDE. + * + * --------------------------------------------------------------------- + * The MIT License (MIT) + * + * Copyright (c) <2013-2014> + * Copyright (c) <2015-2016> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * --------------------------------------------------------------------- + */ + +QToolTip +{ + background-color: black; + color: white; + padding: 0.5ex; +} + +QWidget +{ + color: #31363B; + background-color: #EFF0F1; + selection-background-color:#33A4DF; + selection-color: #31363B; + background-clip: border; + border-image: none; + border: 0px transparent black; + outline: 0; +} + +QWidget:item:hover +{ + background-color: #33A4DF; + color: #31363B; +} + +QWidget:item:selected +{ + background-color: #33A4DF; +} + + +QCheckBox +{ + spacing: 0.5ex; + outline: none; + color: #31363B; + margin-bottom: 0.2ex; + opacity: 200; +} + +QCheckBox:disabled +{ + color: #BAB9B8; +} + +QGroupBox::indicator +{ + margin-left: 0.2ex; + margin-left: 0.2ex; +} + +QCheckBox::indicator:unchecked, +QCheckBox::indicator:unchecked:focus +{ + border-image: url(:/light/checkbox_unchecked_disabled.svg); +} + +QCheckBox::indicator:unchecked:hover, +QCheckBox::indicator:unchecked:pressed, +QGroupBox::indicator:unchecked:hover, +QGroupBox::indicator:unchecked:focus, +QGroupBox::indicator:unchecked:pressed +{ + border: none; + border-image: url(:/light/checkbox_unchecked-hover.svg); +} + +QCheckBox::indicator:checked +{ + border-image: url(:/light/checkbox_checked.svg); +} + +QCheckBox::indicator:checked:focus, +QCheckBox::indicator:checked:pressed, +QGroupBox::indicator:checked:focus, +QGroupBox::indicator:checked:pressed +{ + border: none; + border-image: url(:/light/checkbox_checked.svg); +} + +QCheckBox::indicator:checked:hover, +QGroupBox::indicator:checked:hover +{ + border-image: url(:/light/checkbox_checked-hover.svg); +} + +QCheckBox::indicator:indeterminate +{ + border-image: url(:/light/checkbox_indeterminate.svg); +} + +QCheckBox::indicator:indeterminate:hover +{ + border-image: url(:/light/checkbox_indeterminate-hover.svg); +} + +QCheckBox::indicator:indeterminate:focus, +QCheckBox::indicator:indeterminate:pressed +{ +} + +QCheckBox::indicator:indeterminate:disabled +{ + border-image: url(:/light/checkbox_indeterminate_disabled.svg); +} + +QCheckBox::indicator:checked:disabled, +QGroupBox::indicator:checked:disabled +{ + border-image: url(:/light/checkbox_checked_disabled.svg); +} + +QCheckBox::indicator:unchecked:disabled, +QGroupBox::indicator:unchecked:disabled +{ + border-image: url(:/light/checkbox_unchecked_disabled.svg); +} + +QRadioButton +{ + spacing: 0.5ex; + outline: none; + color: #31363B; + margin-bottom: 0.2ex; +} + +QRadioButton:disabled +{ + color: #BAB9B8; +} + +QRadioButton::indicator:unchecked, +QRadioButton::indicator:unchecked:focus +{ + border-image: url(:/light/radio_unchecked_disabled.svg); +} + +QRadioButton::indicator:unchecked:hover, +QRadioButton::indicator:unchecked:pressed +{ + border: none; + outline: none; + border-image: url(:/light/radio_unchecked-hover.svg); +} + +QRadioButton::indicator:checked +{ + border: none; + outline: none; + border-image: url(:/light/radio_checked.svg); +} + +QRadioButton::indicator:checked:focus, +QRadioButton::indicator:checked:pressed +{ + border: none; + outline: none; + border-image: url(:/light/radio_checked.svg); +} + +QRadioButton::indicator:checked:hover +{ + border-image: url(:/light/radio_checked-hover.svg); +} + +QRadioButton::indicator:checked:disabled +{ + outline: none; + border-image: url(:/light/radio_checked_disabled.svg); +} + +QRadioButton::indicator:unchecked:disabled +{ + border-image: url(:/light/radio_unchecked_disabled.svg); +} + +QMenuBar +{ + background-color: #EFF0F1; + color: #31363B; +} + +QMenuBar::item +{ + background: transparent; +} + +QMenuBar::item:selected +{ + background: transparent; + border: 0.1ex solid #BAB9B8; +} + +QMenuBar::item:pressed +{ + border: 0.1ex solid #BAB9B8; + background-color: #33A4DF; + color: #31363B; + margin-bottom: -0.1ex; + padding-bottom: 0.1ex; +} + +QMenu +{ + border: 0.1ex solid #BAB9B8; + color: #31363B; + margin: 0.2ex; +} + +QMenu::icon +{ + margin: 0.5ex; +} + +QMenu::item +{ + padding: 0.5ex 3ex 0.5ex 3ex; + margin-left: 0.5ex; + border: 0.1ex solid transparent; /* reserve space for selection border */ +} + +QMenu::item:selected +{ + color: #31363B; +} + +QMenu::separator +{ + height: 0.2ex; + background: lightblue; + margin-left: 1ex; + margin-right: 0.5ex; +} + +/* non-exclusive indicator = check box style indicator + (see QActionGroup::setExclusive) */ +QMenu::indicator:non-exclusive:unchecked +{ + border-image: url(:/light/checkbox_unchecked_disabled.svg); +} + +QMenu::indicator:non-exclusive:unchecked:selected +{ + border-image: url(:/light/checkbox_unchecked_disabled.svg); +} + +QMenu::indicator:non-exclusive:checked +{ + border-image: url(:/light/checkbox_checked.svg); +} + +QMenu::indicator:non-exclusive:checked:selected +{ + border-image: url(:/light/checkbox_checked.svg); +} + +/* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */ +QMenu::indicator:exclusive:unchecked +{ + border-image: url(:/light/radio_unchecked_disabled.svg); +} + +QMenu::indicator:exclusive:unchecked:selected +{ + border-image: url(:/light/radio_unchecked_disabled.svg); +} + +QMenu::indicator:exclusive:checked +{ + border-image: url(:/light/radio_checked.svg); +} + +QMenu::indicator:exclusive:checked:selected +{ + border-image: url(:/light/radio_checked.svg); +} + +QMenu::right-arrow +{ + margin: 0.5ex; + border-image: url(:/light/right_arrow.svg); + width: 0.6ex; + height: 0.9ex; +} + + +QWidget:disabled +{ + color: #454545; + background-color: #EFF0F1; +} + +QAbstractItemView +{ + alternate-background-color: #EFF0F1; + color: #31363B; + border: 0.1ex solid 3A3939; + border-radius: 0.2ex; +} + +QWidget:focus, +QMenuBar:focus +{ + border: 0.1ex solid #33A4DF; +} + +QTabWidget:focus, +QCheckBox:focus, +QRadioButton:focus, +QSlider:focus +{ + border: none; +} + +QLineEdit +{ + background-color: #FCFCFC; + padding: 0.5ex; + border-style: solid; + border: 0.1ex solid #BAB9B8; + border-radius: 0.2ex; + color: #31363B; +} + +QGroupBox +{ + border: 0.1ex solid #BAB9B8; + border-radius: 0.2ex; + padding-top: 1ex; + margin-top: 1ex; +} + +QGroupBox::title +{ + subcontrol-origin: margin; + subcontrol-position: top center; + padding-left: 0.1ex; + padding-right: 0.1ex; + margin-top: -0.7ex; +} + +QAbstractScrollArea +{ + border-radius: 0.2ex; + border: 0.1ex solid #BAB9B8; + background-color: transparent; +} + +QScrollBar:horizontal +{ + height: 1.5ex; + margin: 0.3ex 1.5ex 0.3ex 1.5ex; + border: 0.1ex transparent #2A2929; + border-radius: 0.4ex; + background-color: #2A2929; +} + +QScrollBar::handle:horizontal +{ + background-color: #605F5F; + min-width: 0.5ex; + border-radius: 0.4ex; +} + +QScrollBar::add-line:horizontal +{ + margin: 0ex 0.3ex 0ex 0.3ex; + border-image: url(:/light/right_arrow_disabled.svg); + width: 1ex; + height: 1ex; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal +{ + margin: 0px 0.3ex 0px 0.3ex; + border-image: url(:/light/left_arrow_disabled.svg); + height: 1ex; + width: 1ex; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal:hover,QScrollBar::add-line:horizontal:on +{ + border-image: url(:/light/right_arrow.svg); + width: 1ex; + height: 1ex; + subcontrol-position: right; + subcontrol-origin: margin; +} + + +QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on +{ + border-image: url(:/light/left_arrow.svg); + width: 1ex; + height: 1ex; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal +{ + background: none; +} + + +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal +{ + background: none; +} + +QScrollBar:vertical +{ + background-color: #2A2929; + width: 1.5ex; + margin: 1.5ex 0.3ex 1.5ex 0.3ex; + border: 0.1ex transparent #2A2929; + border-radius: 0.4ex; +} + +QScrollBar::handle:vertical +{ + background-color: #605F5F; + min-height: 0.5ex; + border-radius: 0.4ex; +} + +QScrollBar::sub-line:vertical +{ + margin: 0.3ex 0ex 0.3ex 0ex; + border-image: url(:/light/up_arrow_disabled.svg); + height: 1ex; + width: 1ex; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical +{ + margin: 0.3ex 0ex 0.3ex 0ex; + border-image: url(:/light/down_arrow_disabled.svg); + height: 1ex; + width: 1ex; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical:hover, +QScrollBar::sub-line:vertical:on +{ + + border-image: url(:/light/up_arrow.svg); + height: 1ex; + width: 1ex; + subcontrol-position: top; + subcontrol-origin: margin; +} + + +QScrollBar::add-line:vertical:hover, +QScrollBar::add-line:vertical:on +{ + border-image: url(:/light/down_arrow.svg); + height: 1ex; + width: 1ex; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:vertical, +QScrollBar::down-arrow:vertical +{ + background: none; +} + + +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical +{ + background: none; +} + +QTextEdit +{ + background-color: #EFF0F1; + color: #31363B; + border: 0.1ex solid #BAB9B8; +} + +QPlainTextEdit +{ + background-color: #EFF0F1; + color: #31363B; + border-radius: 0.2ex; + border: 0.1ex solid #BAB9B8; +} + +QHeaderView::section +{ + background-color: #BAB9B8; + color: #31363B; + padding: 0.5ex; + border: 0.1ex solid #BAB9B8; +} + +QSizeGrip +{ + border-image: url(:/light/sizegrip.svg); + width: 1.2ex; + height: 1.2ex; +} + +QMainWindow::separator +{ + background-color: #EFF0F1; + color: white; + padding-left: 0.4ex; + spacing: 0.2ex; + border: 0.1ex dashed #BAB9B8; +} + +QMainWindow::separator:hover +{ + + background-color: #787876; + color: white; + padding-left: 0.4ex; + border: 0.1ex solid #BAB9B8; + spacing: 0.2x; +} + +QMenu::separator +{ + height: 0.1ex; + background-color: #BAB9B8; + color: white; + padding-left: 0.4ex; + margin-left: 1ex; + margin-right: 0.5ex; +} + +QFrame[frameShape="2"], /* QFrame::Panel == 0x0003 */ +QFrame[frameShape="3"], /* QFrame::WinPanel == 0x0003 */ +QFrame[frameShape="4"], /* QFrame::HLine == 0x0004 */ +QFrame[frameShape="5"], /* QFrame::VLine == 0x0005 */ +QFrame[frameShape="6"] /* QFrame::StyledPanel == 0x0006 */ +{ + border-width: 0.1ex; + padding: 0.1ex; + border-style: solid; + border-color: #EFF0F1; + background-color: #bcbfc2; + border-radius: 0.5ex; +} + +QStackedWidget +{ + border: 0.1ex transparent black; +} + +QToolBar +{ + border: 0.1ex transparent #393838; + background: 0.1ex solid #EFF0F1; + font-weight: bold; +} + +QToolBar::handle:horizontal +{ + border-image: url(:/light/hmovetoolbar.svg); + width = 1.6ex; + height = 6.4ex; +} + +QToolBar::handle:vertical +{ + border-image: url(:/light/vmovetoolbar.svg); + width = 5.4ex; + height = 1ex; +} + +QToolBar::separator:horizontal +{ + border-image: url(:/light/hsepartoolbar.svg); + width = 0.7ex; + height = 6.3ex; +} + +QToolBar::separator:vertical +{ + border-image: url(:/light/vsepartoolbars.svg); + width = 6.3ex; + height = 0.7ex; +} + +QPushButton +{ + color: #31363B; + background-color: qlineargradient(x1: 0.5, y1: 0.5 x2: 0.5, y2: 1, stop: 0 #EFF0F1, stop: 0.5 #eaebec); + border-width: 0.1ex; + border-color: #BAB9B8; + border-style: solid; + padding: 0.5ex; + border-radius: 0.2ex; + outline: none; +} + +QPushButton:disabled +{ + background-color: #e0e1e2; + border-width: 0.1ex; + border-color: #b4b4b4; + border-style: solid; + padding-top: 0.5ex; + padding-bottom: 0.5ex; + padding-left: 1ex; + padding-right: 1ex; + border-radius: 0.2ex; + color: #b4b4b4; +} + +QPushButton:focus +{ + color: black; +} + +QComboBox +{ + selection-background-color: #33A4DF; + border-style: solid; + border: 0.1ex solid #BAB9B8; + border-radius: 0.2ex; + padding: 0.5ex; + min-width: 7.5ex; +} + +QPushButton:checked +{ + background-color: #BAB9B8; + border-color: #6A6969; +} + +QComboBox:hover, +QAbstractSpinBox:hover, +QLineEdit:hover, +QTextEdit:hover, +QPlainTextEdit:hover, +QAbstractView:hover, +QTreeView:hover +{ + border: 0.1ex solid #33A4DF; + color: #31363B; +} + +QComboBox:hover:pressed, +QPushButton:hover:pressed, +QAbstractSpinBox:hover:pressed, +QLineEdit:hover:pressed, +QTextEdit:hover:pressed, +QPlainTextEdit:hover:pressed, +QAbstractView:hover:pressed, +QTreeView:hover:pressed +{ + background-color: #EFF0F1; +} + +QComboBox:on +{ + padding-top: 0.3ex; + padding-left: 0.4ex; + selection-background-color: #4a4a4a; +} + +QComboBox QAbstractItemView +{ + background-color: #FCFCFC; + border-radius: 0.2ex; + border: 0.1ex solid #BAB9B8; + selection-background-color: #33A4DF; +} + +QComboBox::drop-down +{ + subcontrol-origin: padding; + subcontrol-position: top right; + width: 1.5ex; + + border-left-width: 0ex; + border-left-color: darkgray; + border-left-style: solid; + border-top-right-radius: 0.3ex; + border-bottom-right-radius: 0.3ex; +} + +QComboBox::down-arrow +{ + border-image: url(:/light/down_arrow_disabled.svg); + width: 0.9ex; + height: 0.6ex; +} + +QComboBox::down-arrow:on, +QComboBox::down-arrow:hover, +QComboBox::down-arrow:focus +{ + border-image: url(:/light/down_arrow.svg); + width: 0.9ex; + height: 0.6ex; +} + +QAbstractSpinBox +{ + padding: 0.5ex; + border: 0.1ex solid #BAB9B8; + background-color: #D9D8D7; + color: #31363B; + border-radius: 0.2ex; + min-width: 7.5ex; +} + +QAbstractSpinBox:up-button +{ + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: center right; +} + +QAbstractSpinBox:down-button +{ + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: center left; +} + +QAbstractSpinBox::up-arrow, +QAbstractSpinBox::up-arrow:disabled, +QAbstractSpinBox::up-arrow:off +{ + border-image: url(:/light/up_arrow_disabled.svg); + width: 0.9ex; + height: 0.6ex; +} + +QAbstractSpinBox::up-arrow:hover +{ + border-image: url(:/light/up_arrow.svg); + width: 0.9ex; + height: 0.6ex; +} + +QAbstractSpinBox::down-arrow, +QAbstractSpinBox::down-arrow:disabled, +QAbstractSpinBox::down-arrow:off +{ + border-image: url(:/light/down_arrow_disabled.svg); + width: 0.9ex; + height: 0.6ex; +} + +QAbstractSpinBox::down-arrow:hover +{ + border-image: url(:/light/down_arrow.svg); + width: 0.9ex; + height: 0.6ex; +} + +QLabel +{ + border: 0ex solid black; +} + +QTabWidget{ + border: 0.1ex solid #BAB9B8; +} + +/* BORDERS */ +QTabWidget::pane +{ + padding: 0.5ex; + margin: 0.1ex; +} + +QTabWidget::pane:top +{ + border: 0.1ex solid #BAB9B8; + top: -0.1ex; +} + +QTabWidget::pane:bottom +{ + border: 0.1ex solid #BAB9B8; + bottom: -0.1ex; +} + +QTabWidget::pane:left +{ + border: 0.1ex solid #BAB9B8; + right: -0.1ex; +} + +QTabWidget::pane:right +{ + border: 0.1ex solid #BAB9B8; + left: -0.1ex; +} + +QTabBar +{ + qproperty-drawBase: 0; + left: 0.5ex; /* move to the right by 0.5ex */ + border-radius: 0.3ex; +} + +QTabBar:focus +{ + border: 0ex transparent black; +} + +QTabBar::close-button +{ + border-image: url(:/light/close.svg); + width: 1.2ex; + height: 1.2ex; + background: transparent; +} + +QTabBar::close-button:hover +{ + border-image: url(:/light/close-hover.svg); + width: 1.2ex; + height: 1.2ex; + background: transparent; +} + +QTabBar::close-button:pressed +{ + border-image: url(:/light/close-pressed.svg); + width: 1.2ex; + height: 1.2ex; + background: transparent; +} + +/* TOP TABS */ +QTabBar::tab:top +{ + color: #31363B; + border: 0.1ex transparent black; + border-left: 0.1ex solid #BAB9B8; + border-top: 0.1ex solid #BAB9B8; + background-color: #EFF0F1; + padding: 0.5ex; + min-width: 5ex; + border-top-left-radius: 0.2ex; + border-top-right-radius: 0.2ex; +} + +QTabBar::tab:top:last, +QTabBar::tab:top:only-one +{ + color: #31363B; + border: 0.1ex transparent black; + border-left: 0.1ex solid #BAB9B8; + border-right: 0.1ex solid #BAB9B8; + border-top: 0.1ex solid #BAB9B8; + background-color: #EFF0F1; + padding: 0.5ex; + min-width: 5ex; + border-top-left-radius: 0.2ex; + border-top-right-radius: 0.2ex; +} + +QTabBar::tab:top:!selected +{ + color: #31363B; + background-color: #D9D8D7; + border: 0.1ex transparent black; + border-left: 0.1ex solid #BAB9B8; + border-top-left-radius: 0.2ex; + border-top-right-radius: 0.2ex; +} + +QTabBar::tab:top:first:!selected +{ + color: #31363B; + background-color: #D9D8D7; + border: 0.1ex transparent black; + border-top-left-radius: 0.2ex; + border-top-right-radius: 0.2ex; +} + +QTabBar::tab:top:!selected:hover +{ + background-color: rgba(61, 173, 232, 0.1); + border: 0.1ex rgba(61, 173, 232, 0.1); + border-left: 0.1ex solid #BAB9B8; +} + +QTabBar::tab:top:!selected:first:hover +{ + background-color: rgba(61, 173, 232, 0.1); + border: 0.1ex rgba(61, 173, 232, 0.1); +} + +/* BOTTOM TABS */ +QTabBar::tab:bottom +{ + color: #31363B; + border: 0.1ex transparent black; + border-left: 0.1ex solid #BAB9B8; + border-bottom: 0.1ex solid #BAB9B8; + background-color: #EFF0F1; + padding: 0.5ex; + border-bottom-left-radius: 0.2ex; + border-bottom-right-radius: 0.2ex; + min-width: 5ex; +} + +QTabBar::tab:bottom:last, +QTabBar::tab:bottom:only-one +{ + color: #31363B; + border: 0.1ex transparent black; + border-left: 0.1ex solid #BAB9B8; + border-right: 0.1ex solid #BAB9B8; + border-bottom: 0.1ex solid #BAB9B8; + background-color: #EFF0F1; + padding: 0.5ex; + border-bottom-left-radius: 0.2ex; + border-bottom-right-radius: 0.2ex; + min-width: 5ex; +} + +QTabBar::tab:bottom:!selected +{ + color: #31363B; + background-color: #D9D8D7; + border: 0.1ex transparent black; + border-left: 0.1ex solid #BAB9B8; + border-bottom-left-radius: 0.2ex; + border-bottom-right-radius: 0.2ex; +} + +QTabBar::tab:bottom:first:!selected +{ + color: #31363B; + background-color: #D9D8D7; + border: 0.1ex transparent black; + border-bottom-left-radius: 0.2ex; + border-bottom-right-radius: 0.2ex; +} + +QTabBar::tab:bottom:!selected:hover +{ + background-color: rgba(61, 173, 232, 0.1); + border: 0.1ex rgba(61, 173, 232, 0.1); + border-left: 0.1ex solid #BAB9B8; +} + +QTabBar::tab:bottom:!selected:first:hover +{ + background-color: rgba(61, 173, 232, 0.1); + border: 0.1ex rgba(61, 173, 232, 0.1); +} + +/* LEFT TABS */ +QTabBar::tab:left +{ + color: #31363B; + border: 0.1ex transparent black; + border-top: 0.1ex solid #BAB9B8; + border-right: 0.1ex solid #BAB9B8; + background-color: #EFF0F1; + padding: 0.5ex; + border-top-right-radius: 0.2ex; + border-bottom-right-radius: 0.2ex; + min-height: 5ex; +} + +QTabBar::tab:left:last, +QTabBar::tab:left:only-one +{ + color: #31363B; + border: 0.1ex transparent black; + border-top: 0.1ex solid #BAB9B8; + border-bottom: 0.1ex solid #BAB9B8; + border-right: 0.1ex solid #BAB9B8; + background-color: #EFF0F1; + padding: 0.5ex; + border-top-right-radius: 0.2ex; + border-bottom-right-radius: 0.2ex; + min-height: 5ex; +} + +QTabBar::tab:left:!selected +{ + color: #31363B; + background-color: #D9D8D7; + border: 0.1ex transparent black; + border-top: 0.1ex solid #BAB9B8; + border-top-right-radius: 0.2ex; + border-bottom-right-radius: 0.2ex; +} + +QTabBar::tab:left:!selected:hover +{ + background-color: rgba(61, 173, 232, 0.1); + border: 0.1ex rgba(61, 173, 232, 0.1); + border-top: 0.1ex solid #BAB9B8; +} + +QTabBar::tab:left:!selected:first:hover +{ + background-color: rgba(61, 173, 232, 0.1); + border: 0.1ex rgba(61, 173, 232, 0.1); +} + +/* RIGHT TABS */ +QTabBar::tab:right +{ + color: #31363B; + border: 0.1ex transparent black; + border-top: 0.1ex solid #BAB9B8; + border-left: 0.1ex solid #BAB9B8; + background-color: #D9D8D7; + padding: 0.5ex; + border-top-left-radius: 0.2ex; + border-bottom-left-radius: 0.2ex; + min-height: 5ex; +} + +QTabBar::tab:right:last, +QTabBar::tab:right:only-one +{ + color: #31363B; + border: 0.1ex transparent black; + border-top: 0.1ex solid #BAB9B8; + border-bottom: 0.1ex solid #BAB9B8; + border-left: 0.1ex solid #BAB9B8; + background-color: #D9D8D7; + padding: 0.5ex; + border-top-left-radius: 0.2ex; + border-bottom-left-radius: 0.2ex; + min-height: 5ex; +} + +QTabBar::tab:right:!selected +{ + color: #31363B; + background-color: #54575B; + border: 0.1ex transparent black; + border-top: 0.1ex solid #BAB9B8; + border-top-left-radius: 0.2ex; + border-bottom-left-radius: 0.2ex; +} + +QTabBar::tab:right:!selected:hover +{ + background-color: rgba(61, 173, 232, 0.1); + border: 0.1ex rgba(61, 173, 232, 0.1); + border-top: 0.1ex solid #BAB9B8; +} + +QTabBar::tab:right:!selected:first:hover +{ + background-color: rgba(61, 173, 232, 0.1); + border: 0.1ex rgba(61, 173, 232, 0.1); +} + +QTabBar QToolButton::right-arrow:enabled +{ + border-image: url(:/light/right_arrow.svg); +} + +QTabBar QToolButton::left-arrow:enabled +{ + border-image: url(:/light/left_arrow.svg); +} + +QTabBar QToolButton::right-arrow:disabled +{ + border-image: url(:/light/right_arrow_disabled.svg); +} + +QTabBar QToolButton::left-arrow:disabled +{ + border-image: url(:/light/left_arrow_disabled.svg); +} + +QDockWidget +{ + background: #EFF0F1; + border: 0.1ex solid #403F3F; + titlebar-close-icon: url(:/light/transparent.svg); + titlebar-normal-icon: url(:/light/transparent.svg); +} + +QDockWidget::close-button, +QDockWidget::float-button +{ + border: 0.1ex solid transparent; + border-radius: 0.2ex; + background: transparent; +} + + +QDockWidget::float-button +{ + border-image: url(:/dark/undock.svg); +} + +QDockWidget::float-button:hover +{ + border-image: url(:/dark/undock-hover.svg) ; +} + +QDockWidget::close-button +{ + border-image: url(:/dark/close.svg) ; +} + +QDockWidget::close-button:hover +{ + border-image: url(:/dark/close-hover.svg) ; +} + +QDockWidget::close-button:pressed +{ + border-image: url(:/dark/close-pressed.svg) ; +} + +QTreeView, +QListView +{ + border: 0.1ex solid #BAB9B8; + background-color: #FCFCFC; +} + + +QTreeView::branch:has-siblings:!adjoins-item +{ + border-image: url(:/light/stylesheet-vline.svg) 0; +} + +QTreeView::branch:has-siblings:adjoins-item +{ + border-image: url(:/light/stylesheet-branch-more.svg) 0; +} + +QTreeView::branch:!has-children:!has-siblings:adjoins-item +{ + border-image: url(:/light/stylesheet-branch-end.svg) 0; +} + +QTreeView::branch:has-children:!has-siblings:closed, +QTreeView::branch:closed:has-children:has-siblings +{ + border-image: url(:/light/stylesheet-branch-end-closed.svg) 0; + image: url(:/light/branch_closed.svg); +} + +QTreeView::branch:open:has-children:!has-siblings, +QTreeView::branch:open:has-children:has-siblings +{ + border-image: url(:/light/stylesheet-branch-end-open.svg) 0; + image: url(:/light/branch_open.svg); +} + +QTableView::item, +QListView::item, +QTreeView::item +{ + padding: 0.3ex; +} + +QTableView::item:!selected:hover, +QListView::item:!selected:hover, +QTreeView::item:!selected:hover +{ + background-color: rgba(61, 173, 232, 0.1); + outline: 0; + color: #31363B; + padding: 0.3ex; +} + +QSlider::groove:horizontal +{ + border: 0.1ex solid #EFF0F1; + height: 0.4ex; + background: #9CA0A4; + margin: 0px; + border-radius: 0.2ex; +} + +QSlider::handle:horizontal +{ + background: #D9D8D7; + border: 0.1ex solid #BABEC2; + width: 1.6ex; + height: 1.6ex; + margin: -0.8ex 0; + border-radius: 0.9ex; +} + +QSlider::groove:vertical +{ + border: 0.1ex solid #EFF0F1; + width: 0.4ex; + background: #9CA0A4; + margin: 0ex; + border-radius: 0.3ex; +} + +QSlider::handle:vertical +{ + background: #D9D8D7; + border: 0.1ex solid #BABEC2; + width: 1.6ex; + height: 1.6ex; + margin: 0 -0.8ex; + border-radius: 0.9ex; +} + +QSlider::handle:horizontal:focus, +QSlider::handle:vertical:focus +{ + border: 0.1ex solid #33A4DF; +} + +QSlider::handle:horizontal:hover, +QSlider::handle:vertical:hover +{ + border: 0.1ex solid #51c2fc; +} + +QSlider::sub-page:horizontal, +QSlider::add-page:vertical +{ + background: #33A4DF; + border-radius: 0.3ex; +} + +QSlider::add-page:horizontal, +QSlider::sub-page:vertical +{ + background: #BABEC2; + border-radius: 0.3ex; +} + +QToolButton +{ + background-color: transparent; + border: 0.1ex solid #BAB9B8; + border-radius: 0.2ex; + margin: 0.3ex; + padding: 0.5ex; +} + +QToolButton[popupMode="1"] /* only for MenuButtonPopup */ +{ + padding-right: 2ex; /* make way for the popup button */ +} + +QToolButton[popupMode="2"] /* only for InstantPopup */ +{ + padding-right: 1ex; /* make way for the popup button */ +} + +QToolButton::menu-indicator +{ + border-image: url(:/light/down_arrow.svg); + top: -0.7ex; left: -0.2ex; /* shift it a bit */ + width = 0.9ex; + height = 0.6ex; +} + +QToolButton::menu-arrow +{ + border-image: url(:/light/down_arrow.svg); + width = 0.9ex; + height = 0.6ex; +} + +QToolButton:hover, +QToolButton::menu-button:hover +{ + background-color: transparent; + border: 0.1ex solid #33A4DF; +} + +QToolButton:checked, +QToolButton:pressed, +QToolButton::menu-button:pressed +{ + background-color: #47b8fc; + border: 0.1ex solid #47b8fc; + padding: 0.5ex; +} + +QToolButton::menu-button +{ + border: 0.1ex solid #BAB9B8; + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + /* 1ex width + 0.4ex for border + no text = 2ex allocated above */ + width: 1ex; + padding: 0.5ex; + outline: none; +} + +QToolButton::menu-arrow:open +{ + border: 0.1ex solid #BAB9B8; +} + +QPushButton::menu-indicator +{ + subcontrol-origin: padding; + subcontrol-position: bottom right; + left: 0.8ex; +} + +QTableView +{ + border: 0.1ex solid #BAB9B8; + gridline-color: #BAB9B8; + background-color: #FCFCFC; +} + + +QTableView, +QHeaderView +{ + border-radius: 0px; +} + +QTableView::item:pressed +{ + background: #33A4DF; + color: #31363B; +} + +QTableView::item:selected:active +{ + background: #33A4DF; + color: #31363B; +} + +QTableView::item:selected:hover +{ + background-color: #47b8f3; + color: #31363B; +} + +QListView::item:pressed, +QTreeView::item:pressed +{ + background: #3daee9; + color: #31363B; +} + +QTreeView::item:selected:active, +QListView::item:selected:active +{ + background: #3daee9; + color: #31363B; +} + +QListView::item:selected:hover, +QTreeView::item:selected:hover +{ + background-color: #51c2fc; + color: #31363B; +} + + +QHeaderView +{ + background-color: #EFF0F1; + border: 0.1ex transparent; + border-radius: 0px; + margin: 0px; + padding: 0px; + +} + +QHeaderView::section +{ + background-color: #EFF0F1; + color: #31363B; + padding: 0.5ex; + border: 0.1ex solid #BAB9B8; + border-radius: 0px; + text-align: center; +} + +QHeaderView::section::vertical::first, +QHeaderView::section::vertical::only-one +{ + border-top: 0.1ex solid #BAB9B8; +} + +QHeaderView::section::vertical +{ + border-top: transparent; +} + +QHeaderView::section::horizontal::first, QHeaderView::section::horizontal::only-one +{ + border-left: 0.1ex solid #BAB9B8; +} + +QHeaderView::section::horizontal +{ + border-left: transparent; +} + + +QHeaderView::section:checked + + { + color: black; + background-color: #b9dae7; + } + + /* style the sort indicator */ +QHeaderView::down-arrow +{ + image: url(:/light/down_arrow.svg); +} + +QHeaderView::up-arrow +{ + image: url(:/light/up_arrow.svg); +} + +QTableCornerButton::section +{ + background-color: #EFF0F1; + border: 0.1ex transparent #BAB9B8; + border-radius: 0px; +} + +QToolBox +{ + padding: 0.5ex; + border: 0.1ex transparent black; +} + +QToolBox:selected +{ + background-color: #EFF0F1; + border-color: #33A4DF; +} + +QToolBox:hover +{ + border-color: #33A4DF; +} + +QStatusBar::item +{ + border: 0px transparent dark; +} + +QSplitter::handle +{ + border: 0.1ex dashed #BAB9B8; +} + +QSplitter::handle:hover +{ + background-color: #787876; + border: 0.1ex solid #BAB9B8; +} + +QSplitter::handle:horizontal +{ + width: 0.1ex; +} + +QSplitter::handle:vertical +{ + height: 0.1ex; +} + +QProgressBar:horizontal +{ + background-color: #BABEC2; + border: 0.1ex solid #EFF0F1; + border-radius: 0.3ex; + height: 0.5ex; + text-align: right; + margin-top: 0.5ex; + margin-bottom: 0.5ex; + margin-right: 5ex; + padding: 0px; +} + +QProgressBar::chunk:horizontal +{ + background-color: #33A4DF; + border: 0.1ex transparent; + border-radius: 0.3ex; +} + +QAbstractSpinBox +{ + background-color: #EFF0F1; +} + +QSpinBox, +QDoubleSpinBox +{ + padding-right: 1.5ex; +} + +QSpinBox::up-button, +QDoubleSpinBox::up-button +{ + subcontrol-origin: content; + subcontrol-position: right top; + + width: 1.6ex; + border-width: 0.1ex; +} + +QSpinBox::up-arrow, +QDoubleSpinBox::up-arrow +{ + border-image: url(:/light/up_arrow.svg); + width: 0.9ex; + height: 0.6ex; +} + +QSpinBox::up-arrow:hover, +QSpinBox::up-arrow:pressed, +QDoubleSpinBox::up-arrow:hover, +QDoubleSpinBox::up-arrow:pressed +{ + border-image: url(:/light/up_arrow-hover.svg); + width: 0.9ex; + height: 0.6ex; +} + +QSpinBox::up-arrow:disabled, +QSpinBox::up-arrow:off, +QDoubleSpinBox::up-arrow:disabled, +QDoubleSpinBox::up-arrow:off +{ + border-image: url(:/light/up_arrow_disabled.svg); +} + +QSpinBox::down-button, +QDoubleSpinBox::down-button +{ + subcontrol-origin: content; + subcontrol-position: right bottom; + + width: 1.6ex; + border-width: 0.1ex; +} + +QSpinBox::down-arrow, +QDoubleSpinBox::down-arrow +{ + border-image: url(:/light/down_arrow.svg); + width: 0.9ex; + height: 0.6ex; +} + +QSpinBox::down-arrow:hover, +QSpinBox::down-arrow:pressed, +QDoubleSpinBox::down-arrow:hover, +QDoubleSpinBox::down-arrow:pressed +{ + border-image: url(:/light/down_arrow-hover.svg); + width: 0.9ex; + height: 0.6ex; +} + +QSpinBox::down-arrow:disabled, +QSpinBox::down-arrow:off, +QDoubleSpinBox::down-arrow:disabled, +QDoubleSpinBox::down-arrow:off +{ + border-image: url(:/light/down_arrow_disabled.svg); +} + +QPushButton:hover +{ + border: 0.1ex solid #3daef3; + color: #31363B; +} + +QPushButton:focus +{ + background-color: qlineargradient(x1: 0.5, y1: 0.5 x2: 0.5, y2: 1, stop: 0 #4cbdff, stop: 0.5 #33a4e8); + color: white; +} + +QPushButton:focus:hover +{ + background-color: qlineargradient(x1: 0.5, y1: 0.5 x2: 0.5, y2: 1, stop: 0 #bedfec, stop: 0.5 #b9dae7); + color: #31363B; +} + +QPushButton:focus:pressed, +QPushButton:pressed +{ + background-color: qlineargradient(x1: 0.5, y1: 0.5 x2: 0.5, y2: 1, stop: 0 #bedfec, stop: 0.5 #b9dae7); + color: #31363B; +} + +/* fixes */ + +QPushButton:flat { + background-color: transparent; + border: none; +} + +QScrollBar::handle:vertical +{ + background-color: #BAB9B8; +} + +QScrollBar:vertical +{ + background-color: #eff0f1; + border: 0.1ex transparent #eff0f1; +} + +QPlainTextEdit +{ + background-color: #fcfcfc; +} + +QTableView::item:!selected:hover +{ + background-color: transparent; +} + +QLabel:disabled { + color: #787878; +} \ No newline at end of file diff --git a/src/ui/BreezeStyleSheets/light/branch_closed-on.svg b/src/ui/BreezeStyleSheets/light/branch_closed-on.svg new file mode 100755 index 0000000..23c5421 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/branch_closed-on.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/branch_closed.svg b/src/ui/BreezeStyleSheets/light/branch_closed.svg new file mode 100755 index 0000000..286c1a9 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/branch_closed.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/branch_open-on.svg b/src/ui/BreezeStyleSheets/light/branch_open-on.svg new file mode 100755 index 0000000..9e75927 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/branch_open-on.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/branch_open.svg b/src/ui/BreezeStyleSheets/light/branch_open.svg new file mode 100755 index 0000000..514a312 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/branch_open.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/checkbox_checked-hover.svg b/src/ui/BreezeStyleSheets/light/checkbox_checked-hover.svg new file mode 100755 index 0000000..64d6667 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/checkbox_checked-hover.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/ui/BreezeStyleSheets/light/checkbox_checked.svg b/src/ui/BreezeStyleSheets/light/checkbox_checked.svg new file mode 100755 index 0000000..f3acb63 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/checkbox_checked.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/ui/BreezeStyleSheets/light/checkbox_checked_disabled.svg b/src/ui/BreezeStyleSheets/light/checkbox_checked_disabled.svg new file mode 100755 index 0000000..b7be04b --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/checkbox_checked_disabled.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/ui/BreezeStyleSheets/light/checkbox_indeterminate-hover.svg b/src/ui/BreezeStyleSheets/light/checkbox_indeterminate-hover.svg new file mode 100755 index 0000000..def9596 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/checkbox_indeterminate-hover.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/ui/BreezeStyleSheets/light/checkbox_indeterminate.svg b/src/ui/BreezeStyleSheets/light/checkbox_indeterminate.svg new file mode 100755 index 0000000..a619ab0 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/checkbox_indeterminate.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/ui/BreezeStyleSheets/light/checkbox_indeterminate_disabled.svg b/src/ui/BreezeStyleSheets/light/checkbox_indeterminate_disabled.svg new file mode 100755 index 0000000..74d7168 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/checkbox_indeterminate_disabled.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/ui/BreezeStyleSheets/light/checkbox_unchecked-hover.svg b/src/ui/BreezeStyleSheets/light/checkbox_unchecked-hover.svg new file mode 100755 index 0000000..8f0bb01 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/checkbox_unchecked-hover.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/BreezeStyleSheets/light/checkbox_unchecked_disabled.svg b/src/ui/BreezeStyleSheets/light/checkbox_unchecked_disabled.svg new file mode 100755 index 0000000..0ef4300 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/checkbox_unchecked_disabled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/BreezeStyleSheets/light/close-hover.svg b/src/ui/BreezeStyleSheets/light/close-hover.svg new file mode 100755 index 0000000..cb44c78 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/close-hover.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/close-pressed.svg b/src/ui/BreezeStyleSheets/light/close-pressed.svg new file mode 100755 index 0000000..a0dc249 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/close-pressed.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/close.svg b/src/ui/BreezeStyleSheets/light/close.svg new file mode 100755 index 0000000..07b50c9 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/close.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/down_arrow-hover.svg b/src/ui/BreezeStyleSheets/light/down_arrow-hover.svg new file mode 100755 index 0000000..408397f --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/down_arrow-hover.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/down_arrow.svg b/src/ui/BreezeStyleSheets/light/down_arrow.svg new file mode 100755 index 0000000..34c5d6a --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/down_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/down_arrow_disabled.svg b/src/ui/BreezeStyleSheets/light/down_arrow_disabled.svg new file mode 100755 index 0000000..af74a30 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/down_arrow_disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/hmovetoolbar.svg b/src/ui/BreezeStyleSheets/light/hmovetoolbar.svg new file mode 100755 index 0000000..57e54c9 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/hmovetoolbar.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/ui/BreezeStyleSheets/light/hsepartoolbar.svg b/src/ui/BreezeStyleSheets/light/hsepartoolbar.svg new file mode 100755 index 0000000..a446425 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/hsepartoolbar.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/left_arrow.svg b/src/ui/BreezeStyleSheets/light/left_arrow.svg new file mode 100755 index 0000000..f77acf4 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/left_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/left_arrow_disabled.svg b/src/ui/BreezeStyleSheets/light/left_arrow_disabled.svg new file mode 100755 index 0000000..2d749e7 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/left_arrow_disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/radio_checked-hover.svg b/src/ui/BreezeStyleSheets/light/radio_checked-hover.svg new file mode 100755 index 0000000..f3d5c98 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/radio_checked-hover.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/ui/BreezeStyleSheets/light/radio_checked.svg b/src/ui/BreezeStyleSheets/light/radio_checked.svg new file mode 100755 index 0000000..86ff6bf --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/radio_checked.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/ui/BreezeStyleSheets/light/radio_checked_disabled.svg b/src/ui/BreezeStyleSheets/light/radio_checked_disabled.svg new file mode 100755 index 0000000..269ae12 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/radio_checked_disabled.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/ui/BreezeStyleSheets/light/radio_unchecked-hover.svg b/src/ui/BreezeStyleSheets/light/radio_unchecked-hover.svg new file mode 100755 index 0000000..f5fc943 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/radio_unchecked-hover.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/BreezeStyleSheets/light/radio_unchecked_disabled.svg b/src/ui/BreezeStyleSheets/light/radio_unchecked_disabled.svg new file mode 100755 index 0000000..41f503d --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/radio_unchecked_disabled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/BreezeStyleSheets/light/right_arrow.svg b/src/ui/BreezeStyleSheets/light/right_arrow.svg new file mode 100755 index 0000000..a43ea2b --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/right_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/right_arrow_disabled.svg b/src/ui/BreezeStyleSheets/light/right_arrow_disabled.svg new file mode 100755 index 0000000..4940025 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/right_arrow_disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/sizegrip.svg b/src/ui/BreezeStyleSheets/light/sizegrip.svg new file mode 100755 index 0000000..3388f07 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/sizegrip.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/spinup_disabled.svg b/src/ui/BreezeStyleSheets/light/spinup_disabled.svg new file mode 100755 index 0000000..838436d --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/spinup_disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/stylesheet-branch-end-closed.svg b/src/ui/BreezeStyleSheets/light/stylesheet-branch-end-closed.svg new file mode 100755 index 0000000..a31f5c0 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/stylesheet-branch-end-closed.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/BreezeStyleSheets/light/stylesheet-branch-end-open.svg b/src/ui/BreezeStyleSheets/light/stylesheet-branch-end-open.svg new file mode 100755 index 0000000..a31f5c0 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/stylesheet-branch-end-open.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/BreezeStyleSheets/light/stylesheet-branch-end.svg b/src/ui/BreezeStyleSheets/light/stylesheet-branch-end.svg new file mode 100755 index 0000000..a1c0a42 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/stylesheet-branch-end.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/BreezeStyleSheets/light/stylesheet-branch-more.svg b/src/ui/BreezeStyleSheets/light/stylesheet-branch-more.svg new file mode 100755 index 0000000..ebef839 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/stylesheet-branch-more.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/BreezeStyleSheets/light/stylesheet-vline.svg b/src/ui/BreezeStyleSheets/light/stylesheet-vline.svg new file mode 100755 index 0000000..688177e --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/stylesheet-vline.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/transparent.svg b/src/ui/BreezeStyleSheets/light/transparent.svg new file mode 100755 index 0000000..3a8ca5c --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/transparent.svg @@ -0,0 +1 @@ + diff --git a/src/ui/BreezeStyleSheets/light/undock-hover.svg b/src/ui/BreezeStyleSheets/light/undock-hover.svg new file mode 100755 index 0000000..6bddbd7 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/undock-hover.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/ui/BreezeStyleSheets/light/undock.svg b/src/ui/BreezeStyleSheets/light/undock.svg new file mode 100755 index 0000000..9ab2197 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/undock.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/up_arrow-hover.svg b/src/ui/BreezeStyleSheets/light/up_arrow-hover.svg new file mode 100755 index 0000000..dd1271a --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/up_arrow-hover.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/up_arrow.svg b/src/ui/BreezeStyleSheets/light/up_arrow.svg new file mode 100755 index 0000000..b02bb26 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/up_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/up_arrow_disabled.svg b/src/ui/BreezeStyleSheets/light/up_arrow_disabled.svg new file mode 100755 index 0000000..742e1c5 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/up_arrow_disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/BreezeStyleSheets/light/vmovetoolbar.svg b/src/ui/BreezeStyleSheets/light/vmovetoolbar.svg new file mode 100755 index 0000000..0a30d45 --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/vmovetoolbar.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/ui/BreezeStyleSheets/light/vsepartoolbars.svg b/src/ui/BreezeStyleSheets/light/vsepartoolbars.svg new file mode 100755 index 0000000..00e91ab --- /dev/null +++ b/src/ui/BreezeStyleSheets/light/vsepartoolbars.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/ui/qdarkstyle/rc/arrow_down.png b/src/ui/qdarkstyle/rc/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..4fc454ec2e71c74b8664ddc2cfe996bd44b1b5c5 GIT binary patch literal 525 zcmV+o0`mQdP)2Y zFB~FoF6n8tTD=uT(Qdxx)a<0eU@)!M>o01x+Iiqws#D0Hbb*o{kH_P?{eC|=sA#T0 z5Cji_`{}&}Tmkb(#+V25=I;9fd4|K`+eV|YBWX1i)lngwb6(cvlI|H}x`)*t8USE4 z8hvOso1cMo{`ACwAyRVzQ|H{BFbtm@rN8jzwpy(<=iGDPbQ-|Ulw{$4NxE%}d9{e{ zQr+eI{&h(&fip89GV`C3){HS*i)t?2-tBh#sH0W z;0o{txRgHn0<45#I9^t(@FBCYv2oG!ysy9~YwgWmulKE}R!K=o$%*nC0efZw0)NMZ&S%`vY+%zRZlbP!x@4?Hw zJMm>Q^Ag+pTb?uLa{lMux%ZwKuvjb>i^XEGSS%Kc#bU8MTu9y!hT$i`$AAlDfF5^J z6(fKHq`;?2sc6voh#{aao?hUCg3GqH9R+xh1eU^7fU{cb|NF8ZqNnL>-afPk04yvl zOlMhk5qLa5h=^qMq*xga!@Aai*OgM&@(&ve01$@Z3&4-SkwN<*FM>(@8Ze`jx?u_^ zEC4_d1jil6xdI#;v>(zUn8g2@W!Y;kAtj8>f>bSs!(v zJSQ8c*${`AAl!wt};b1-R}MdPAa9YmrQYp z%6F?E2%hcr4@YyZk&93;^S|}(^*5`?vrpys`6Nkh_WFlAIoC-2LxK1^TI)vD;`>R} z!ra{4Q?Bb?He8rs`}^F^L`00&YOVDzj^oV4ar{>udDhm^EiW(s>HGdP&^EYDLQO~V zHQ)EA>knbb2)dv z0C~=Np7(YXMfdB@Z!E2ByWP&3&E};vO`iZ>-tAef_2<6te-K5{&^}QI<7{C8WPX1B zBN6$mz`vlBQjGCu%-BC>bi3W38;!;vB64QHtbzBHQeTWap9A@t)9rR|G#ZUZMdTUa zo`}4wlsbP9xmYX~i^XEGSS%Kc#bU8o9yb03nOZ1NxYy>({(Zd@U~gmV20(u| z9(gT~c;me`!~EvV+}y<2#`t64G6ER`1O3Zsg&D|&M$dcW8&{WWwY6;(09dZo*1Cm! z8T2TO=47@dWIA)qB6H(mw~)UQH{TWjV5L%7pDIjT7c3cIl9Q1-gfNSGEm)d5lE1N1 zsjUCGE=kymvkP|(Zik-((1`8uWe?5owd&P73~6O9N#0DSFycz5jNsZWNL!;%_9LI|Asndu{LHXFf%zv++M+p{yJMa(L| z0feyF)$&B)x=7cWjo{fRx~Yb%c(HWBWKV&ETS5qjAJm^X7MriCuSeBPJ>AnYrD{KfwBO_x^`2}>tr}J)8PNx6>002ovPDHLkV1iU?`kMd% literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/arrow_down_disabled@2x.png b/src/ui/qdarkstyle/rc/arrow_down_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5f3ab00dacfd65db0d5cabaee6b78340ef903674 GIT binary patch literal 1040 zcmV+r1n>KaP)pQmUd$h(julvh(!=P8Qet6OsgR_ zLlFu^7cNu;{{g8AMT!dQLJ`~+1VK=wSe$7>Lps+MS50QrO`FukV3ml*P1|UiX5Mj; zNt}6e(@tjIdr9g2EYErO-tW1;-Z>W>4u`|xa5x+ehr{7;I2`vE5;UaJ*>_a*ghE2W z7tqZR78VL3;0aVj<=rWhJ6Y@RXlPIk9zej0OK4QAuCPJ^(Gx)31l;ohwoAhVh{}81 zIC-4R-**;Gxls`kVoF*7X1?;724dB-C3u_I2FwRE|uUoC$tyodAGjW^@o3 z2YP}duvI5P)k7MBp9e;Yh5WRw$+{B&kjjh<_;?c_4+Td8*=m#E(HPIK9+ly#!uZUc z8m-GzVSFZ0=^O&C)O$p93tgaU5B^G`((%-tg2&Rx%3wO%qoQL#%HpmxCo?h<4Hnf) zf_He@OP<+2NEys60Zr9y79RjsvzdRS8jvrqb}XMqO-u2$*?TXy%i?|IMtIQiYBRy76* z{kBRT7~MyL31CmHePcVJaoY?0rWJ;Z7xI@w6H5g7eDOm5vWgA~%+}hgTe+F>Y{Acx zkfE@Hul5}cj}H$&*m1ja3`kns>(vjozfw_`{gKkevA@Do_dk(UbU&Xv_h)Cfp8@^e z;UzZ(U0Y@xuAJ%UBps+JLb>RhL%wm-KBCq7ipSe3ve~WQ>v&$$OOfJ^H$U68xOf7$1t;`$(2wSp*KW*4~dS07@4TWjJO8^X*1nBI@ zXA+!R!;1}t>AnE%aqpV z1A~>IEdS{4;Lx?vqxhRHQH|EOF6i%jHCm6S-krx<0)YsiaVnv%zQ9_Fr`}%p-8@^g zJ+=z9Mip@_ok?KmN~Goh+>9%w8%W#k9eA>0tv+vbH;a`9`5PhAl{MeGQo1)N=|CoH zjf=wffr$YjGV_k5%d3^r!$I0Z_qMRun8SVy>;oD6YX~V|3;2$7Hm;PGhtVDBausWD zP8yy72at@@5Iys@63?|3W}XkLIr8l;-fkXuNLGNu-AW`%Wj-qjr&|lr>rwQ^dT5Gw zn#YnPc_ugtVE7P1m~EA#_oHf!{n8a~y*k3go{vDC&W|(k)f1n_)ym1q$=OwY0?7`c Ur_iO;&Hw-a07*qoM6N<$f+cnF!~g&Q literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/arrow_down_focus@2x.png b/src/ui/qdarkstyle/rc/arrow_down_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cef37e872a89ef74131161425be50dc07ca89b3b GIT binary patch literal 1025 zcmV+c1pfPpP)5SJ6%k_ z=DnNDWahn@YVU7(&%NiI|GDqJ`vDe<#bU8oEEbE!VzF2(mIn)oHn_Fx5P{Z_ShRzto zpWDIuWIOS9U37pucO^$={Uq>$!A&rL?Q^rGc!nVRsy92<=)_6KYuTF}YYaDX2SoTG zZq*Fh$4^1c;srhNNOtFePQ_z#vK0%Jk+r22{}7_bV@AON=|d4jnz5qIdVJ~0-w*vc zHF{%P-nz;`RovR8InWt{H6*q5AOdQdw4+|Ba2VPC0j{SR%UA2~3CzU|Dj|~eCCV&b zVb(7fk9O^~x1_+WUVIbeD`Lwj$(y86d?+e!EzK0-%W*rNdl`J2$7&Z3hAQ6y*@!8L zqq9Ri&viv!_sfM7J^D`W&z=9Q{-OvcfrlcdUW#B6zpA3I_@&)vy7bvXqJQoDvEQC` zLgzb-t>YIJ3IHMb8q9W!c}p{ZPq;)PSgjokh;#X}z+HWn%)YhJ@Y zDDZ8oMQ+D8o$kKzR{Yl%DkE!Y=hwd*+!1x$+QG zpFmiB0@=nQiAmfomQA@9ilv2?+FRHtNXCBy!m7!fEi#FNnq(#`YcoF>xD02$?>qON zxeyW(67tSSV=q7A@uQQr@3W0&N^w-nz=u~us2D^A_=Cudl}&8>(G4_Qu~czV4Zl(PQ511Q zG&&b-QH@t}i~D{x15bA>Qr_6ROfHu6Klg7>PnL=&C4hs6xS`!Ve> zGjCeqev;X|@4e@q@0pwT&b{DpI2;a#!{Kl^91e%W;dr!=@Plk&b_!!Y0!;xH(7~tG zR|GI14XpjxtLCTg7t@j9M(&!YIq_jZQ%!FK3h)pa?2c#wtR6t+|Gw>`s3=wsgda!V z0RY)TZ49F)fycvPK+_0 zZ{Fk(1jK|_6y*4m>lb%<)#6g;p&pc}v+3-Ot4DxhR8$K|_Ym4NAEn~`IlP~*UvE4} zv@ZWOm27GL5a>HGVuI&~Hs*!H-qDHoyD5H8+cs02dsl=*(Wq(@=q6i-njosY=T~xv zdkNYT**r30Gj9dnx>e3qdJWt&PfgCfW|gmip^(&juMpqb{-fv{emQ@< zr`YtV005cE+RLJP0(dMSD2jA*eh@(88l2mz?Di|UGu>w!T%~VhinZsB=(h@)kkrji zh?p1ft>{kwX#RXJd4^*4mrQB?Il-O=Hieeb=4Y}4;8iW&FI`!4k*(H4Eb5b?|V zF4eWZ4Y(Xs+J3*o!{W?eZW!6tZ}X7QjnE&J($!Sji~<*fiV7^-I;W7xarR=mVPE)t zX5w0Zvuu)R`?}%HFP|{$|2+lrVo*`QGy*S1jqU5t*}v1TE*#stm{g95-U%)o+q*bY zX9voupdz#`UZwSmF|Q{_>bf&Y^LH~zo~g6xjW@286`AN{xGHo0=BFo_9;+vv+F)*l zr^o8IHeD$oe753P)ldD+zZM5!9tO1o{zGMBY5oI6KZ#Y95B+WG`-ZS17B=41TU#vzh4u`|xa5x+ehr{7; dI2?{gjXQmzEi=bH?(F~o002ovPDHLkV1jTe=kWjl literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/arrow_left.png b/src/ui/qdarkstyle/rc/arrow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..bd7d54f20fd162b458d8a9a2af9deb9ef41d4842 GIT binary patch literal 546 zcmV+-0^R+IP)zfNl)H7_+0Qw*W-M>3#_|0$_}} zs;c+)w~fpj17umYt*Vcp${f$Kw*ttr?3{=^17bj%X5I*3I2@i4kv-rrRn}fNz7@b= zFgWd;djT8`WnLR#G#Z_Xp_(CrLDUwS&*$%>C^`>(3kl&RGMmlbs_HiI0}xeh4dE?dt$nSkmw{5M zv8UBo*C+#P?VgBSKcLYVqHziHJb$99JHK_L?hqIX0Ki&%UqtQ#sA?mK)|V*H^V=fw z5WqR-4H2T1bhTRD1fGfrzMT=ImzT?BnWpJA;H7VDuorDInfzR@*O!1de+2+wu~>XB kisB;GYxy;#_P@J+0pK>C2{!7NY5)KL07*qoM6N<$f`iEK8~^|S literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/arrow_left@2x.png b/src/ui/qdarkstyle/rc/arrow_left@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3fcfec5726fc1c6594948ffc7295dec9c189c3 GIT binary patch literal 1072 zcmV-01kd}4P)k7RCt{2n@?yYMHGj>Hxp8diXiGm)RQRQgvFzv=&Fc|e?U(n zih>?Q197H0QF@!5WV(}p2NB)i#e<7_S^~Nny$FKfK@h})AmTw04^ae{ZPxDRA=#z3 zY|JiHbrEyQ+HzW}0cH|Ffj;1kP91+7x(2RYgQ5d7dBkaovHBi-gwF z($bwk3e1Vf5O~$swW9|x8jTLrb-l&8-RdpxIbRnFp(IIeQPmT`<&IVR8Y9{c7>~y{ zsOmOwb&IXO#)%R@k|fuN$To0&=&_;$FdB`n06qe4?qa;C0HkSp$zU)zuBrzd%UjF4 ziUvTMrgLRk9s}-jEXCtZ&s8h{q%6y$z{5^FXz>sU0BdalJne*4M1mF%5dg5(j)9k3 ztXehL(m$(S0VGNCERef#5vjV$p*H~5+DBFOtrn}3nLndm09b4929C9iUlZ_=*QU+^ zj7Fo|f#bluV|89UbbJ^}lH^w4gsNWVSiKYv9d^L-^74(Ux~-~LIaY7QLq`A>7Z+j@c<5jWjK||EMdV}Pre<7s-);3;JOu85g@uJnMPv)Otr_1dKKL&0d=v~o znx=EcnD>A?94ngQArOExO$TLJz6~65tl)>63sndJQkLZg@MJTnyW6{{iiZFIthGzP zf*X&i?VIunz*_qpFln(mJKS8TyaBM*=D?dRR+KY;Mm{^heW3vnY;^XMPXN)j`G3h9 z09AdFf6sRBZ=Cj%w*-r#_&`-(Xt9PO@qUE%IzvTKyrHV88&}n#&vAUpdy5uDaYRI3 zcjKxW<#Gs-l+Mr3zXZJ749f00hz>%Kgt9EFcXoE30zPysiLDcYC9}D?dD4+7sb<1s-9oqe^gajLV)vkH4QfnT7TB^;XS}F z&G=py^a`P~Hk?c*KMn?idx76ua_9|0r|WQab@f{jc>p-sl1DEPI=>N3r_(Q0^%3B7 zOD>&5=;cma6vZdN6SN)`pt0DvsZYGceZz*aNf#R)PB003E*{cVhS9QfR^ zf;yr;IU&RP}4e3U)Jy3IITsWq(#xbwBWZ7vn_-0AOQd z09aXB`AI|$ipWlj?QKa!3jkm`oqo5s9R6}FZ+S-z0AOux?JM9RJ@?m>7yn;on#%M1 qGvJ7-R_uO)Tj@EanP!^lBGEs1+BIzV?hVEO0000=G`P)q$gGR9J=Omc46}Q5431Pmb=;YE5JGcnNK^JwgP-vUxeH@yAgW!AfUKI3f2kv>! z?|j_Lh5y|YTk!JS+{wLeaSIo`_9i*;yYr=($T literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/arrow_left_disabled@2x.png b/src/ui/qdarkstyle/rc/arrow_left_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..56a1c0f52a69e5a09af346416f6bf969cbc50244 GIT binary patch literal 1126 zcmV-s1eyDZP)ko)jqQZ9G?Z#Xfa z9M+}DZxC`fpi-@0C&Cgin&cH?(R>#VIU7*kKYLAIwGEV#ydts5{{Bo* z%qvj2I(LP{(g7|^2_mtmI$1pAQ~}q{%v>VKhrp#tUWFKki-#O4U}AcDk8Y2?kLr~v zK~Yy_pM=#4*t_?RbG3iYGOFd2peT~>ad$dcGawAZ;-6!iZv&GlLDieZgDnFV7J}cT z^ae1WQ53P?-=7I=>;W=X29&Gy2N4eL zR;2HIyFU$#88A_;9TL^olAN;B<(Z0M1I7$c-St8PAQs#u)AaFG}sMU8h*eJIOI&c~zEv$z+v4g*i`Rw?HEu#x1&VBTIE0I+(j@wqCukeD0P;13qw8vw8t sH9rzKAkY`+2g>uVa~fiZA^scq3;bj?fgFFSZU6uP07*qoM6N<$f-|lDC;$Ke literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/arrow_left_focus.png b/src/ui/qdarkstyle/rc/arrow_left_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..e7fad8f5ef7f4c17a2160f48a6f90413c770f91d GIT binary patch literal 565 zcmV-50?Pe~P)_?X2v~B?lIQh$Mx%yCMmK3b((-3bFI;dy9fjH}K~F z|M_Qj-@^YMmKtz)xpQpD`wueIpPM-PyYCOABtOw?AM)Nm7aTEVt8vNLZ*_*evuA=c zF=c54v|6Rg;lX2xDKd7RPJm>UPoodPE+GN6^%puDtk8FU{2!$a)!L*#Ox(rix~dIW$hH#y{Rpt`hvR?q@UfUtPme~l;y zs*9aT!76Z&&~?~Ls6z4?oqhzMu$h&Kxr(p_;!c23a)a!%ZUg?S%FJp(0 z?pnP)_T711G{IP)^@RCt{2nq6pIMHI(>=k8i9X4Q5#Rq*?vR7!W#LhwVqHcZqne=Qq$}l zA2xlMyHOIDxp&n4Kb}9#IrE#@xo7TO=&7fk{?C%M3s|WN<1-c1yoex}XkW8je96VQ z{|W$w@%nbq&r$8vtC(iFlyNb3*2N$`RhXC=#F$C!#fn^w?`$9+%8%7ArxY~EF-~bf%f1g|YGy4&+DT#bR0l2Pm z{30?7hY$v1ma{D%S2zGFN3y3cX&nS^w&H>U&JMk}!T_Ku`CR^hDtFt4DC%$W5J(?T z7_aXK9*%_-)a&FSfE|z@tvv@?UdHl1c}N*RVYIeegb_Qc0PUn|NDaV-@#%XJ-s&>c zU6;2Kr2-&7TD!%l9PG-kVwO(*#FRLI{KR)Rif{;66SEBBuEkxc5(Th+tiD-HbQrkU zcEsSZ+4(0W2H>)>W7kHQDPVofGA=JSt5qTZE+3uVkfr@8aHZ{}xAN!Z9l*MgZ!c|& zd3a{j$%>13z1*x;egIT7 z>d)oh26kC-5k>v?_p6b60IE{R&5S8LXvKx#CJ!C}^iR~D2liOO&RG}Sb^hgMt>kf0#=E9TL`a~HH0?gRPK zHdMUkU8TGh@>_NA%wlHoPGCA_1p~o*5%YVt&5Ma{2Y!rMLI6!dBCF7NcFXS>)mwpI zZAYWDAtbg9Pm~9aw^eTgPT7t|XnGJ5{T-ev57dov2f`W4kn|uVeh|%-OJ7H7?g7qO zMyE$e96~B5@yX$>pNPla} zjgUV;EW};}K_xlXB$XGi2^MN+Wf{^2#6kFfA@XW(|l%OV=A-krJ$DgW|5owe0L(7%w7mChNSrb z%y%n|+QEjzY-p+jfUHsb`Uvbg2q62T0QF@39Oxf9l{MFw@~kCyl1A%82g?OK_b1?c*ip4fI}~cV1Zs|=`B(V7y*Wr zTk8tlpx=qNCB*=Uh!VSH;Svry@ur!roX{x*QL2Z%)%HV)`#-f53{iTB2A%d@;Biq1 zhhNFmAD+4mdOq%g1!?*`C|j*je>k;h#_P~jzh`x;^*uU_t{J@hI{?7v&BcRnI=U)j fUoiC4{&(XCWl)g;$Agj`00000NkvXXu0mjf^_=c@ literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/arrow_left_pressed@2x.png b/src/ui/qdarkstyle/rc/arrow_left_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..295558105563b6ff3cff91cbe17a87e9deb12356 GIT binary patch literal 1120 zcmV-m1fTnfP)CSO41K+=)W;!QuH zQ~(TAT91dy;U4)zTz2210P7kUX+0vUM}Zq+mhN~L*lxD~#A zq<&u@!3?l5W~J6VIGTVvc28}}lKmbSiWrh^^Wb0tHjIwl*6oDfB0LZ=R(5%*HV>93 z;O;#~Zq9@^P6H1|9XGqYwa6ZT>hbKQ3rk-Dk46nqSG&Bm$PR#NH5fc|s*bQT<|yJ% z^I!#lN^bW4PZTLc`+#<%uvd}K5{8<4qia$YiV~e4`s)qg zP%JDaUu&C^oq}q$upL}3B77Y+R8YLSG1~h@4(?iBCzoGD`6&_?1k{^Juv*AJ2X`%X zy7~+vCt}u>Nl0JTi&&g2F3NKF6!2%n5Cjj_f|FliZnF4qhTsWcwnzR{Avhbuv-SMR zt_Dv6=MyzZdJvqh!}E>&Z(%4;14|J@)0+h6H=>1!!q0&O&jZWJTGTm&RPMy*#`E6^ z@(MiWh@M$zExH>na z4gf^kcb$Aw&{j0==J4bJ0H9V2=Y}?yQKqAY3YKg10{}p6TW5V&UjqFx=2(T`4*=lQ zWbsn?-@2W^uQAKobHOVB01Jm+zL3cVJAgl23q5ROOTt?K01M61@2au`xEQmpk56U*<{O1yRODGS@`~-+|72#h=En;^fbK=< muKbNwK1{o&zWVCx+R*>gDKCq$x1GfR0000?^9wqP)M=`nxz!)>6#&9@ZwCxbSboJ zhvLQfBttPK!|A*zq|iBp4uO!(l$MSiGI#ILsnDgxLm^kwdl_OCktLQQ&O`D|65PA@ z8csjZ&)P6>uFv@<1u| z+$$hM0LTzWaU8e20&)%kup}at;w77Iga@PDG$+p(|OVK$>Zvjb)NB{sL@-j)1ahZ9_uE781Bs<2K z_a)~k1z@gjUu%6>ws~Pde%S%MOOj-8o8~~lGaw=XNsv4V!|*k(zWujK;VmHfDGb9G z!{N}~Jo@Goy#?pf>GY}A`fnA@ivT77XsvCfY5J$C=Jx@BOG|*7bWCSFrT_o{07*qo IM6N<$g0`;cy8r+H literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/arrow_right@2x.png b/src/ui/qdarkstyle/rc/arrow_right@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..efbc8de3c3cb297fa56a0785f70ce9e7ce14ddd6 GIT binary patch literal 1062 zcmV+>1ljwEP)d}b)>grtQo+}TzY;+2(dCV zGvnFP+zr+YAff`@>%zg2k&!RsI3BX4+b_1KK$i(bG~I5uKZU_V*n?nw4IrYTJROMW ztsn@bZS9?4-2i6Znhx6_B0q{E-?sjL;c6EE5#{C2m|2Bk__nJYbT~7hGYg8+Yyg1I zq9~enl}8z826SM}bP&w^RTzdZIL>8LyaG)|ci%7!V8!?SXI&>#g#m!xggrut?|k2X z%4H%|835=_c&yVr?Q@kxl?DL%HDPa_=j(HGbC0`7plSoQdWQ1Wu)oo0ti^HssBQhq z4d|ddG9SpYY&DMKM{Ek$#QyC2)G|5<_v&-r9-cw3_<0_9bE?aXAdmQ3A|AEQ@lK=n!07*qoM6N<$f)6C<+yDRo literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/arrow_right_disabled.png b/src/ui/qdarkstyle/rc/arrow_right_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..1e59a58c1221c50a25418cd853bd88c8f3bc70f4 GIT binary patch literal 553 zcmV+^0@nSBP)FbLS00h9JGxt4$51kEi|!< zytoLuI!ONlk>Ecd3eF-9LU1W*FfEdRL$^1$ICXFmgran)v^IGkhdYa7@+MpdeWn}k zp5KSN<2d-&OT$d6%+-FNOy$zx!e+bueUgA^xM_A8)2aRaV)OFC!iggQ_!8HP2c>tH zlH}OY09-9jZSTHLlB5tEV2~LY={IP)^@RCt{2n_q}jRUF5^-#fdjvFyGi`XFM2Xub$Lv+9Ge-dS>M z{-m*p_z(n@6!?^cU_`d0kOVyx^pAobq^Kvey}L5H&ea|&?2Z~lAU!M+qCv!J%WjNw ze?9CV>pgd=SB$djAjnVLN>EMcjYTH1L#53&b7_kKK(l$GvO7GC49*S=7uVa$qiqHN07TME zSnCNZTSi7!+eo3k1^|GFB>M&dHg?s!C$|?0{ifyHZvYnh2B_~7vh{hM_I-b)No^+# zXp&+Aciv|2mnNGhmka=a7@}0d?iu!ef}=-`w85bZa?ifOt%1RDh^QT;j8+I`Ik&G&ikc)Bs6oZU}tcAI~0u1Cs~LUX)bY zS^>g7ncW|T;ayX@tzz<`Wb%Ap>scA^3Bz#Sl;(1R9J=W)<1|7K@`XF?{5-R5dXj>9B3nABWyUav#^wF&Pv2a z(AGi@lG9F(VC8ucQLvW7LQd?0D3%s>LQF~vZ3JDT+#Q01%RGzS1nhP<%UI~EwwO1+ z&%B*t;9oCgSv1#q|3ijG&K=)wM&HW>xGalg90m^U^}aiQx3@nyU{VHWcIBS4I@t49 z02l~ctQ{C{u(??Y4*-ua(52d^lMgY=bcf0V2*YH_DC}Boz26QC0Kg37F+kj^ulJS% z0}=(2Pe1O@b^4b>1DH+%klEu}r@s^!FhO8I1+!=Mwcgpl004Z7*k?}N`r6=BXh4Dx z1{^f!U)JvpPJ{-4O%e0n``5KQ?~a58Ob~$J7?tXa@PI#SAv{3Ieg+>I?;g$4QY|sw zVF>u*oI4kOJJEF{3kv`Yy&CT53hm@EGHd1f1%kI#^A~7GqcXxF`vkU3Xe76^ h-Hd*g75={fegk)El~b(2fJOiS002ovPDHLkV1mN7@^b(H literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/arrow_right_focus@2x.png b/src/ui/qdarkstyle/rc/arrow_right_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e24c3baab9acf3c4ac88eeb9d579da883973ec51 GIT binary patch literal 1139 zcmV-(1dRKMP)jPNJ?V0o1n91li+%nIqgrEp~C^uGmO4v(HTwIZu0VG3MK!l^Y-QPYYZAU(U z8eBUf>$pQ{^=ahk|pzlv7+N06Q|o(rTh$l0Vs;iX4(~ump0jy@-qOS7J^wV0*t+#h2rzJWc&>PNUatD5QE;cCE<4f zH-)Sni=GESK#E5q{=k-kH(zH>2moi2tqk5=8R*_)OU2^=%)x`OBeFPnz{@2-0FmK~ zi6<)k;ZECX9?k$(;KaKH#z)cgBYi1l^1SgZ08&7*+~rRy?bTN>nD#++{`j;6%)t}B zT&S+TfK5GBhoWAfU_RF=#?_e(=lUPN?o!x?B|tC-|FdeNb(MV2CD-Cjo&iKD9)4}h z#B0vK8U8Neposwx0mes;i(2WmzxAy=E9IhD0i+H7swRGVs(;0Il1AhM;M8ef)tY*z z2D-nJwj&!r?fqa?%(N{U3=ar; zFp!!7rVe9wl<#W#GZ}#Z$f)ud_^^@>^DZtojp8-{O0Dldj;5p6d>B07HURTl3!Geh zIr}0;o}6{4+Yl}{!Q@~5l)i1zvu8){`@^AT!$@s{KV>wppL*kg%R+j$jKnc`E}m6u zDqFhF3urZr#Q=y>-T_8BLu)VQyMD2!V;6f%fQ>5eiiTPr^@TrJ({O;rf0?=ACoCdn z;^(4#*VoqicZ9_mfL$QO0Aet|9SwAUZmsVYEn2j2#9s~PGV2o(qKyCm002ovPDHLk FV1hVO1_uBD literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/arrow_right_pressed.png b/src/ui/qdarkstyle/rc/arrow_right_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..4f4fc8efb41497bd51eb03c09a0339ad716e5d63 GIT binary patch literal 544 zcmV+*0^j|KP)Ws^3hE%@uB(Hibg7fXF4hEl z862d4fk^Nl5CxYeZIgD87Pn9oM+awjhfabfDh*UL^zP?yNnP)9$D2W)?S*^Z-{+q9 zJvjK+%hEhFA8!3HWFtjahVAfskpM5vLk8!;%5zrgEv$6UItNTjaN~F`dQElr)Jy;X zhAjr=qb}85-#x$-g9&UoDF1u`N_B^d1IUC)^9v30E95&@#1l%(OGi~m>@_H zlAg_noqKKp6UG=}Xe(%RmRtiS2mwCQUM1YT=^6mZ6a<`>S+COAyzUy1AcPR-Bzsd? z-M;D?!1&7$un-fy3m&vDxCJDYTuS3IerbOefWIYOn+3p2vN<4*E~aTH6&!BB7Z3kd zf2006ZBzczN%)}`M~nUT%BQrg`2oViFyNP=+g~?UKW1sqcLYhW0TE`^{(Aj=)-7^O zKsFvd!s>(dT5p`$Sbo)$q1SjEOPy4Of^J&8&^8{p|;WF8oZSN%%|kCOjGmjDByw}auC8qH>$HykqF0fP_zZ~qQ^cSl8prw5o0h1n=R iUK(zPM@5DIFMvPFm6uy&so_rm0000 zBuX&SXCP$2>;cr}7Y5!Ci)|1&13=Sb5kTkt!r)rD_+}6^08#9B6M*mi_R?xW4RIt5 zV9hfhDsyphu78=Jjwq4_%*Ha6QNu6qIOSW=sv8>y0KhAg(ftd4d#TBi-kdRK04J8j zIw1;>&Evvaa6i-2uH8o)#F`v!m%dgo^CJh4s z5Q7pXJg11i%NB;#*vup)1E5_F3}gw>#TW9$<+jpD&wv`bny|zpZ}_F1LoeD$AZ-JH zTGtRiD6OhaMHd!-aAJ{ZaTg4jrEkEi>e$^19>yM2?1`rTIff9rNwxaH}qq{qKCJ?|O16Vis%k!HSY(sD7q$yQb3`kCU zqMxej-aDg*w@sK9PM6wSkH7if6yJY)ytng?Y58;wAkc%NH=RE`k2l;ZcKl@{g)|M& z4SqZ#Z2Yq)H)1P^ve}qVX+S*I-H3QoSls@LpoTbd22B45l8KqICG5*x6^m~OIRlsu08|B| n3h=(L6#O6-yFr5n4Gi%gkp(5TEJoOo00000NkvXXu0mjf&UX1l literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/arrow_up.png b/src/ui/qdarkstyle/rc/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..9f45d8e4cbe3e712854fc309a31bc9ce692880bc GIT binary patch literal 512 zcmV+b0{{JqP)|o3*lVbAQ0$RU%wt zWh-d4B(qzD>10c>vb3_W5=FRfVbTa&S&LU$ij|OsnP;(C&E4+l8a+kG4+5E&H}CuA zV+gdgw6y$Vr0K@dXtd?Me+~3P2wUUv_+yhfQIk!B!QiU*-T^&;D2j?K%dY$t1H<9) zdZ*KIz;>;?4Y)K-d#7r^7_$>Xm;jdm1$^}=a9Knq#+aQ`F<^|@Q`H0Dd?grapF>sK zRMmqtO>eC`x3f-Dnx=Pw=fK7a@de8KQlAx({Uk}=JLlg0wgF?z1K=t1v`!NLWH=PV8S*%=0{&&1R2P^?p@a zOZ=D-QPssAdlJX-Lu>6)dP@o9dA?DWGF05)suM!)G*91F2umgOOE;g5>6w6wJRw|oVEqMoFksH@rl0000`~c6R0fK@bE%5ClOG1VIo4;r)WPYGAGPDFEL9P(*Yi48tp1 zQAcGf2K9aa0)X!U>;|wCz{if`{ArANTy`y`8=$rJ0DO(??EAb{tNmw;`L)b?$~1sH z&-;pquC8;>amR6X7-N1et*9~v34&l-6h+?=(HA{-xmB%JFE*RaSA`aa5)24}V0#or zKM~PMOE~U)D@*KdwOT#fY&N3;%PZD^AP9CxQFM=pj#$F&)V1w#T#V!RWUJNsr-1SR z6lj3&`+J#r4!}p2a9TWw2+W)@fruUg_$&;=zX~X`7y~@d+ebw60QPscGcyxWoYO72 zM-frFu4k1><@nUp)bnB2I&=eE*FC6|ng{S%L>Pv@52MZm+v3wV zTI<6~sRtN9JOB_;%*>o>9%p9by6&Mt>+EJ|1~eLtV*nNb>`8?-B|ag?ggr{BC9U<* zKFiE76a#$UKOM*MeXMS4-_Q}TY4Hi2^&)M;P5^VAv&6s*yc6_&|2#AQ0AO2pdrtBF zkmTrI6Dk1CIF9qe81rP1i3CSt@f`m=C^(m_GUzR)oDYmK3&TjZA)S5ww?uT_5-wUiuv)Wi?Yg647Z(xD4?LRuh={&dSQl*_oM{mzzn{6Rzv-QcB$eV0#6XDLx_3gau|k)$948 zr`KS;ULUJeDvPj-Z=-zi0Ki0KJ5wA}N-fmu^|4-(Y&ZiZCnv|-?e;u?18YX_VP9V& z3Rx{r<2asZwOTLM>$t7~zV9Dk=6L|)-R&bLJ~>I+O!%W?!n54Ic>&jT4=JVQ0IZox zqb5Fu&4j-Jd^$Zn{V1UlBSB7*w;k$eTSLZx?Eet&4mNGJHQ-AOaD*LU rVytQt1VIo4K@bE%5ClOG-fLb1RDv!28%yT>00000NkvXXu0mjfe;m12 literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/arrow_up_disabled.png b/src/ui/qdarkstyle/rc/arrow_up_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..a77807c572c7649c21ee11962886844543103328 GIT binary patch literal 538 zcmV+#0_FXQP)^V*xB2qva_*B!ig9g7cPx(XsyLrnG_--l0v=xT5ML5Tr`)}#AZL$Ff;Fc zzw>xA0|f;I1^*e#8(6s-jg+LPKt%(kk=HL4Kjg{d@&r|{L}yD<3#b6tkM6P`TsyNb z2C6}$>PobLvH+#iWm&g1UXLn!YQUciC!ARfItj?2YtR*v!6`$rKN(K!i2*-oL?kQ$ zM?nITY|XHQv=~DqEY<2^_)iV^L3jtVd0-Gpq=H+?ObiMZ{2;pBPwvuA8*25&UCibH zhY+@{c!o%CmczJydUWj5YUkanyasH%9^MCg03ai=Up@CnBm)C8m>M2EXDgkz@$L-F z&N|;6d1!DCKv=)xsq@XlV7NSXVrAymbKkST91JXm&4v7O4zLgW(x zEKB(LT5k zI=)dUUt5k+Pm~7GR@o0pyt~J5jvX2u@2ixr{Suj|C^k__b*;1aGk~u*xa7+Lx%+0Z zSiBdiFhtM+N~!L3tM@yAuX$raIs^p%gNSe9z%%2AAH7g6mqRrn)DCz)ogVmS!#WQl zsR?g;zH1JHmwL9WSC*H5xD$pxAVdS=FQgx4mz4*Q(1g9k@1pC-Rk`P6t}Nwm1*h&m zLNOrmV(xL-#sVPYo{#`=_E~QEb@6I!J9cbk@xqPZR8}(wozR}jKFt^w1bEDST>#6H390{xCIEQ-m2X9gcyKV9~m9{>t?xhrJeL` z8DJ+fZ(nzvO0XeTot0DRvc3BLH9v|1AY zU}pHpSWo48>0+ySn?fnob%%YQ3UEe~&H*Iw;@!y3$@}hILVoeYV9#4~b942EEGGX^={|XANl-dqq!P3;ONog4{aQ9&I96m1PSOc~$Vste@mZDjPNbUkdyr7Mr-aS|z>%7OK)}`qoN&;+Kj2Rb+cT?$ zpRd+iRo8&H%1n^V0~qq|gf^zTFcHAgJSJ}gcEY2ar&2C0x&xYl0`JvH@}R?N zZ8i7|VAN0Z2+`H1y9b<;`}lv}D%G0Kby|nPU@#aA27|$1Fc=I5gQ3&>3n0o8p2LzV QasU7T07*qoM6N<$f}eNu0{{R3 literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/arrow_up_focus.png b/src/ui/qdarkstyle/rc/arrow_up_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..b3970bd22e2fc9a93f2e4e61975aba338193e2a4 GIT binary patch literal 530 zcmV+t0`2{YP)_e)ZW5To=?k*>NaRq3R3E@DR)QE+q+ z6>)HknS>-QSo{No3N8)`6|q~vZh|J4T_;8DP!t^6=KDG1&Yq^B=2~^RXZnu!``+L4 zz1$t-YdXcvh;CT4u$nM$MEhIFae-KaV4DV9L>^e z=m~`N&Ph4{5;*i*>60@z{rUFs)-e5snm|}@P09J?UbqS90$mINhrRrASZ_`J6@g$j znvt_5U_T&`|5+41mZ-?tQqYLb@2SApY;+mvDKOd#$ModKNU>m-a*;Y(zIq zS^x?I!?#Ez3c#bV8C}mVAX(6C*JQfidp5sAcuK-NfY5x5po%=hnkp800q?*og)VzF2(7K_DVu~;k?%l``*)WWVG%!ufRfTM73 zB|m;_5IP1Dfah0_Ae;f5J5TjUEk7~eZ!J#yF3IBh)dIrV=-P75Emhy?x1Rp(09Ely z)%Ov}-@T*wwb^G2h-g1#^(TO0CFADYvjVSm(p}->mDQCun44NpTUzP?>?vN|aVxj_ zDX_n_ML`{dD4g8|0Sur1ahJ39=XsE+=*m(@_4aR29g3Oa z0`=_vT48K8Esd!K@Yv}eM%LFd3&8U+%hnY7#fZFeV|MSgq_rjo>%jrvvlQ>|-EO21gzE);kqUCZo1NVgb12rI!VB zLBS0*HO+4qHG~pVa4}kO{iT<>SK3M<0l1~$fT(;0>pHhZ>#8hbRIEm6!}EZW}usK zRP`gT9JD!F-<|HNfU0=q-~;gjTAw(4% zsrT7>E2=|C#Kw0Iu(t2F{A8`&@U{UAmxED9brBc~jcnBTL7H#q03~{KRxTN%(>Dqe zzqT8`C2pxYCa?&MwvG}-HHjLZAmTvi5+(e?x=z;$6IZqzwN-<6DwxEu0P2OBdOh8x zhv1-LPf`PYwU!_MK5j_tLC7mFPhqrjPnidrcaG3UsUA@A{NTm7A(0*6m8-{qxoDF2 zIF0|TVr_Q(z0HrKJ3zH~-zyHTk42I)_mSM42 nEEbE!VzF2(7K_DV88rU_>&iA)V))lv00000NkvXXu0mjf(TwT} literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/arrow_up_pressed.png b/src/ui/qdarkstyle/rc/arrow_up_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..8f9dcf4900443a161231c1912e4724cc39f37f1a GIT binary patch literal 518 zcmV+h0{Q)kP);?q^q4HxG4pYt!acIaKGB8Y>6BJCEie?b2Nby1WKodV@@_jTx{q$Uw_iMZSc-sS!Ad_V8Q z%N>-Il$88utmwho-PW9?d_by`rE}Y>jc-NjI7JTm&1jxPpOESRGI!H&teq)RYwQmA zVRTlqb>QT0OFx_}UHrM)*czwaSRL?#XhB#z4;PT;L%^xbaoc_nE&LM!FKjId+dv%4 z1GB#63?ZN@Y{P5Bm!~RF3tBgk-U73EP&Tm1$a1k+jCWob-4R07*qo IM6N<$g8Ys3X#fBK literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/arrow_up_pressed@2x.png b/src/ui/qdarkstyle/rc/arrow_up_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..40c7f20c102d02167fb9ea9f75a38f7f9d3c24f7 GIT binary patch literal 998 zcmV+LWk%02oz1 zT%DUfu@ySDqyT;p2B@3`%=$%@pfUGqW!PGB!=BI!YR5%+pJ?%g=XV{Pymjl+;@88} zGsF&1@q^kals7lNPfj-~uN()_VW=8T0cPuY@7k4f0);fUt4MYA(S5IRa=e+fw9E^z ze>&Xx$9?h%%49sMwk^R#BLbh_-_&D2%@_X4QeUP8*z?jy51NtYBFcDoL;=%U`)tcl z&BfKo3br}fsFr@uN@HdPc%)DrZRX4p@MJ=`)gvuwQT{gHvd{e*7JnO@x_`-}01wa9 z_T?tXTgptTOX0A6|F3BfJ{k42`^wcmUS6obUH zT~(tKtLF+o3`A&~*y7UKoM@9Go*xeOS6u}aEm}yXeSP_8T zf?4u{+SI1RM(Dc$qviRMAQylgk&s<8-#1C)>=4yYM@wO`-@*Gj3;5;mEs!(B7t^FC zHwdKbyT}V82Pbd-d1>*R%?`N94p8xf`S(ChCB(8auZbNcoE|NO??QCzOvjxk&DQh& zwJT?VQbIH<^PLFE53bU5uGVjbX@!xJDUlVW!{3Od`U6yEN< zn9u<-%m2?jfV91JG0^`5?naV2;2jvqDQ>%A+uj@whr{7;I2;a#!{Kl^9QQQ00WQ!O U`vgegPXGV_07*qoM6N<$f**q7B>(^b literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/base_icon.png b/src/ui/qdarkstyle/rc/base_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bb00857a4e170543e97fc60ae991b409ca94fb6d GIT binary patch literal 1256 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 literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_closed@2x.png b/src/ui/qdarkstyle/rc/branch_closed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bc87d011240a18487ae14e6f049db1d5cf1190fa GIT binary patch literal 704 zcmV;x0zdtUP)8Pm_{ot z7AypXGfaXI0vC6)$<;)Xpu9{ z<#J~_oz54XxvOw={&ClJkNt7;08pCG=WklA)(M@ttI%3NsZ^S0Ts}9MOkR4PSJ0V# zSXvAC8)m*#E|(v}z#eoED+TPksg!D3%m-k%007ulN?o@(fawA_HPoz zb{dVwrtaW%DF6VH?+wJvf$q?CDj-YN$~aQ%R6uIyC!(jiL)WE%)Eq=~&-eYF@n8!a zBp!K0^vL)99aG`fFmvkW0lXfKMt70@;&kL}7C?#PG7!;+*=%-gFc@T=Bxzx*0LsYz zOhlJ^z1|O#gXB$y0efHj{?cD!=5Nfr5d^_k)AJZ#0m+*OFm)VfGYrE|re^`n7m)RW zbHn%j_lD-YOpo!N(_wSXv!ekP8+#&H~PwA=0PI&)W{_3Ujp9LCjZH4oqdfC)2S4a0D# mGgAm5gb+dqA%qa(Ain{*MXymegB2$L0000KP)R9J=W)GoZ0m$rjo+s(~U3jPRj z690pXZo0XMAt0#z1Fg{6MbJfDBpnn?K8K_#I3vS#XPNUsDvvL7@%ed_=P zR7e3-5P){tp44vORo9R!IL3r#}l zU>2QpC^!f@2qKO}94rnlF4{?#2x6PGkfFwIMK6jD4nh$`q#!5-+uFYSgDHx-;9MwE%x~ z)Z-7IfBuoPnu*-QFXx_p(wW;1N9(UIeCx#4k~<=|S?wPh>e8Cq2CW6GG!ZFZGLEjT zI8S`v_jG3OmfjVx4I-T3uI~FVum|nLN&y=#W^;ub7V`nvEdU^lWpl;zHb*dB04v`R zPxR%AIm2^ovatf<#Ah!iewsa5IAUQID+Mq>$rAPgmF|k zHaNJ~`@y)@ zPvx(eNKZil0IB-{02=pm#Sz`vsVHDW^0|SSa9ek1iVA3P$`iL(8UI#_3SedDC*Yy( z)KnC}E#@G?wP3b-M|XA_3UDZ~{t37j%vQ&ZgqsN29y?G^{>k10ombK7!AS#a1uzi- zlsx!XO)orGE|=9eNt#$HfQXor*&jV8Q+!*i{V+L+YcdR2e-tDr2mc)r^7GFp7fsJ& zd9oMk5cnOBC^?##v1?+L5zS$wX^E$W`1VN}Xd$;tS0=@f}vGreGZN_naer9G# zYi=8~zI*!;1aWuIA(tHI1PE&coPATD4s>P;A%qY@2qA3dckeNxI!uzUM+;{HxZt`*gkH_=hVWw)y zRHDW`j5-6Qp2^ng#7j{Dld1afG9Xc*IR5zhd<-eu0}2b=J?Y~tEL5WAwp)R3klGxK z>Pzkg1OT+D#zA?nG3!>~-9o8EV2nK*+HY1J3#1Z+0QOqh^YU(e)Uf~n!2%S35fkvl zy}(yy{zAY2B7j?)Xw0zy34nk)Mx1MJRBy5-bQNnZ10b>1%*VCxDo;w0Z)gC3;!3*~ zUgS;5H-U5mNZg6n!=t>-fvgi4?)zLm#OcG@)K-z^*#(xT6M(V6>;6*rB1rvy$>Z^O ae&!9eu~jR|G6!> z%vf=s*Et&ae*#o$kt-=g@1-Y-yS>jshynzKSP2`c>cg#9irv1)3A6@itOSAWwTe!6 zkIk<0IZ41pP?hL{AmpnecbJ+=`kEr>R{*FHUlk9gU+kLj^&cU00RXl7y6~I8iOhI$ z&_{SX6aY$eQ3M!I7v_3hN4G}-b;J}S0ZSd_*#CQlVl}mXfCwIJencE7tufRaQ zqRIuJib@%kLyKqjzH*vrj4{R-V~jDz7_)-!VCkn1iKF|Y00000NkvXXu0mjfbyiSD literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_closed_pressed.png b/src/ui/qdarkstyle/rc/branch_closed_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..17b7784c34b07c94f6fa3e60fbff37e517595ccf GIT binary patch literal 372 zcmV-)0gL{LP)K@>*MolO%^)T{`iVrgk%Z)ss`Cqlwz(askT zEAa_zL^ewTYG-NVJJ?v;2#O$^U@#zp*=vynf4a@UZsDA%1}@({b75w{;c)zSBwx82 zzuA64%wVS4U%5Zo|F9J>xvF<>JrVH*U4DI^ia~Q8z*b=XO}{s~?T4MCVg>#na4_5K zge3`RIn5Jwcas6(b6q{>k00j1WapPv( z6pIOf!f_HcS~eN^Ch$D@L?rFSeD{>=%v!iDU|=}YT;92atmZ7n z<@oUIXzwSdxiyGf{&*8jyVl)2K!c>BSNl62?{S%13#SF7)0C6f1dgT}m!C5*oN<}G zT}})58-){DZMYBWd=J`6kOBZiwf8`7{CcSTKY|qipfK3nKh_a)2G0eEf>vHqMw@e^ z$NkQ+Ccp}iIB_8Z@*K}4e4u4C(`fDOOQtB%Wmu1*RNP_5qim4~jA z>!bjpss*52EspfuaUUF-5+#p3MeY?xx`%wkr+tKMB1-&Y1j@^q`Nk{BqtV>}p{(3^ za^b&A{fy4?>`c`^Nv;GcKxJj=ue+jrj3}L)e$@5d=Oq3M5EYPQ?l&ZA{Zi~UcFw!Z zt%ci1;K7BGM$t{6jIxMwdbZH{*=eRR#u#IaF~%5U%octDC(xqlE`lUt00000NkvXX Hu0mjf{A^Ov literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_end.png b/src/ui/qdarkstyle/rc/branch_end.png new file mode 100644 index 0000000000000000000000000000000000000000..05cf7b6de7bd467fe08bacf7f158002215aa4f67 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCpqn z;usRq`u6HZUIqo8BL~`7*4vmhEA~t|c3pkbB^Ab7_qI)cb0g&kJ2Q{L0S0Cs3I2$b m8T%f!#6P&e;5o_U9pe&X4pDZKA0a@q7(8A5T-G@yGywo%Xe+h= literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_end@2x.png b/src/ui/qdarkstyle/rc/branch_end@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6df213e35bc14e65d3a8c90fcfb9b2c34cd9ed0f GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP_WO_ z#WAE}&fA+Cd7TVJSRCzlEoGkmAS#o|sKtfxH>>eX<@sUfY_vChudADP-ZJ>j4$BbU=CT9Gry3oybQXo<`^6i@)=RWYW2skh>vIuOD nE0~k`UDW#-YgAPp(1-~0i&5-ip=_&IfE)%-S3j3^P6db48^jOBK0g)j|IWt!$v&ID_n*H- zrEh#37E`6lbcH#K9DK6>jl}c&4^Q3S-(Yay&hFjzhZv53))E9d1_XYT=KH_pwBuhe Q;V+2m>FVdQ&MBb@0P%%R4*&oF literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_end_focus.png b/src/ui/qdarkstyle/rc/branch_end_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..3227c78c32367921c16c633185154da13e98f353 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCpwp z;usRq`u3_LFM|OG%fW0@1?j-64T=JVzCYglQIxjxXgl%hL{|Fo(zbeq1_mY$g@%T& o4Uc(tuaEeo|KSeMgbjHNMprqE|2jBs0P+|-UHx3vIVCg!0GgC6a{vGU literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_end_focus@2x.png b/src/ui/qdarkstyle/rc/branch_end_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..331af9c5fd1aee2fe7628afbf9725ace05c91a34 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP;iQ; zi(^Q|oVPbO@-i8UupZ3MTEO>9X?f4;J|h8J8A+!_4Ymh;o}KX5PLC6|%>VxP^PfGj zVH+QZ#8jy;U18252cPVJbLRW|f~W7}9V8zJ-upX^^+tN^a|J=5Ye3*fss4*N&W~4i RUH$;#db;|#taD0e0syV_PGvzCYglQIxjxXgl%hL{|Fo(zbeq1_mY$g@%T& o4Uc(tuaEeo|KSeMgbjHN(y!T7=Tw~F1o9X>UHx3vIVCg!0D%ZA&Hw-a literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_end_pressed@2x.png b/src/ui/qdarkstyle/rc/branch_end_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e5e4bce40cdd6763057f2d8671f007e9d59ce233 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP;j!R zi(^Q|oVPbO@-i8UupX?x;?T&V@}-3Ft74Ubq|>4X+k-yOPWWr5-%~5vcklZ1pF88X zB^_V6R literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_line.png b/src/ui/qdarkstyle/rc/branch_line.png new file mode 100644 index 0000000000000000000000000000000000000000..36c7ddf2ab33959b88daca7116263d90675de3c3 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C}`s8 z;usRq`u5yLK?VaJCd2q;Y1P#nL9ePU&WfnsRJmQVC+&|iP#qFzVD`Gk%6mxhu?a}f M)78&qol`;+06TymRR910 literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_line@2x.png b/src/ui/qdarkstyle/rc/branch_line@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..573c55152f05a9c0ae7a7e8171010076226c0591 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP;iN- zi(^Q|oVOP?3N|hYeEyt11Ko-hDlpb7aw)d28mKJ$}1Kp9!cK3H&gA$-MJ^ RKGP16n5V0s%Q~loCIEn*B|-oI literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_line_disabled@2x.png b/src/ui/qdarkstyle/rc/branch_line_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cf615a5c9385786501aa6b87a05649bcc97d0819 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fANY2y6 zF{EP7+Y5%G4F(KH0=kx1CAjGu^KA$Tlc{M-+5Pg9k=YTOb6@YCujPHXvHP-pAcO7# z%?7axA`aXcTnkuDST8WmV#;9jW!%!Rj3LS)m{!uySOY(@G#Eele+KAk22WQ%mvv4F FO#te?Oe+8Y literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_line_focus.png b/src/ui/qdarkstyle/rc/branch_line_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..b81bc5b0920ed1dab32babd37f14cec9fbe24716 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C}`p7 z;usRq`u3cmAcFx1i=&#zopr0HKQ^KL7v# literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_line_focus@2x.png b/src/ui/qdarkstyle/rc/branch_line_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c474ed9022d4b4f72ce4b2aed0173a025e1222fd GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP;j-U zi(^Q|oVOPYMH>tljs$eIy>gH>3TWrEnIg(QU-4$%u01`xhU=?qzZc6nSG;-j#b3mM zJA-Qhs|o7`rddoGjJ}Lp8kR9cIRrE4F3@ZcyFfGPO2$}2mIi@#lSe>jGkCiCxvX%J;m-0N^*nQbPkU@8W zW`o!T5eM!Jt_7?ntQVMOF=a6NGHz*D#t`KYOe^VUtl<+`8qWSvoCtI^gQu&X%Q~lo FCIF~2OCA6K literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_more.png b/src/ui/qdarkstyle/rc/branch_more.png new file mode 100644 index 0000000000000000000000000000000000000000..1b91df3e9c2d6b25f0dcd8d22f56be8263631fc4 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCq0y z;usRq`u6HUUZ85{Koh>Zf;XhfH>gzn*gJjC7pE3MPt}!kq;G4Mvj9~CfdsqG@;Cb) pb?}Q>$hsSSt~~jX6(Z44c!2eb6(`@-k|L0844$rjF6*2UngFojEB^oh literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_more@2x.png b/src/ui/qdarkstyle/rc/branch_more@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2e1bebe00497ed0113de56267af7facb52241a20 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP;j%S zi(^Q|oVT|QayA$UFdWnnn=5o_>pqr)Ol}3=r(f4S{a5d{!x_u-&#TvN~2BR literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_more_disabled.png b/src/ui/qdarkstyle/rc/branch_more_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..72ec42b22354a3e12feaf36b8e8dbf8db1929554 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C>Y}D z;usRq`u6HZUIqmo=7SA0I(UPO^-ZNW2)$`gZhdsu+G=O#%n9!vm&m*C44hiz0@MQp y4J8hNr(S8B{Z42UD@u<5#KMjk=W=8xt7)3)FsJIY%u6{1-oD!M<#{5?$ literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_more_focus.png b/src/ui/qdarkstyle/rc/branch_more_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..9ff3921ce883b0403ae635080e85dab01ec1edbd GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C>Y}D z;usRq`u3_LFM|S)^F_xA4SZJ=lV4qEY=77|sps(fy{EnPjfF4Ox_%cu)w^m+JPS}0 w5O}bQEM2oNX*0iAhJN20%XQOz;vo`185yesoJ!~1Jp4f-p00i_>zopr0HIYb;{X5v literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_more_focus@2x.png b/src/ui/qdarkstyle/rc/branch_more_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..95ac204e55fdaf433aa5f0cd2ad7c0d30e55a0bd GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP;if@ zi(^Q|oVT|Qa<(`KFdPi!dH86@3!cL-dJfC%x!#z-pnBu)?dv9I|D-K%{E_p!vR3|e zxscpuiC-#Q3s_B9FEGtw%3$>gV+TT2ks0U(u(3Y4c}c)Jo?&v p0Z_x{j7Iyv0*-jp<1y|t^TGKXja$xy-U9lA!PC{xWt~$(69C@4S&9Gv literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_more_pressed.png b/src/ui/qdarkstyle/rc/branch_more_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..a4f20e0e1195b2a456774de9fb9158def1b904ea GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C>Y}D z;usRq`u6HZUIqmo=7S9qjf|QS-A#-)72h-{w?4XSZMCy=<^;R#-*?9D44hiz0@MQp y4J8hNr(S8B{Z42UD}1u%a*N(U);c!!m{_hhPTX1)2?F7epMmGjK>Nir+MRcRlgwYx4y_ n4VyC>?f(im;!%&sxX;W!FE|=^@?ZQ9^ag{ctDnm{r-UW|IEz)a literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_open.png b/src/ui/qdarkstyle/rc/branch_open.png new file mode 100644 index 0000000000000000000000000000000000000000..eee8188b7b5d436f97db3d673ce34466542f9885 GIT binary patch literal 354 zcmV-o0iFJdP)&LUCO2bPp}mjGzwi?NB9Kv|=%Y`=yOc7f@#!B!1f4#;+1^Kk%dBWbg0E~^@tOeXubZx*hmz~_?l-PHC&p64BY zX%Dbb6<|Cb$8NWK8)Mv-bjb2=6F-Hn+U@r7a5#Lg@>lM_B1KW0O1c0t+mhz=t;T;wq_ybo(Pm|)U{Fo zfWctUi7`F{FSdJSSw61nS_iR4i9{liNc;)D08k8CPw`L?zyJUM07*qoM6N<$g8A!@ AZU6uP literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_open@2x.png b/src/ui/qdarkstyle/rc/branch_open@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bcfdc84d16ec6c3e41e6722777c14c80a0a13c24 GIT binary patch literal 657 zcmV;C0&e|@P)jq>!iu3WdU&s&1<4SrO?2=*N)jFlPXy0Qjm}@;q-n zO0mcduq^8rfD2LU%tBSQ*Xy0H)oOoct&xZ!N8~0hQ{)B&LGT2?D26Q4QW05?vim?x zyH_k0uZ%{cw*amkm_Q^@Rh_lAswPBaUrrJE31H1}oYt&$cWXs0up^((Uo;G(0pMQ9 zZ~$Q1CJ4e$=ob-LbsXo@v>C&kilYbswA<~ibUMA6OeU`axG^?7ZKEeG{-cOw9mn}L zQ^*jpH2?rQosOT)W*ffmCjs0Y8gRH~m%i_>0Jt^bu@A%H@P4II`M#)J%ecpj zWmz@=d+(R3`f4y3Jg!!&TZ;^{uoJLXv)O!~$z(1AxQXqzK_!(+J#$@mxQskYW83y= r+qP57&Ot;(L_|bHL_|bHbVB?Cq`0i=X1ozi00000NkvXXu0mjfW3(z7 literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_open_disabled.png b/src/ui/qdarkstyle/rc/branch_open_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..b6d2d47432369ef250850f672187b174e8bb6f7a GIT binary patch literal 375 zcmV--0f_#IP)^@R9J=WlCeqyK@>&L-K-H}E23oz8w0Rj=KgU4v8y>_dyOU8N06#$@8TZ=F|0!kQWGK2*54YoUR^B|8ecL0Ee zYJEuxnqX6(TQ8E<+ZT=Vysn`F0L-sM<*<<4fjt;O)QKBc!@5R6jL?L~@ zo_pqZ&cobiz!+nUF~%5Uj4{R-V~jEX3kh4GvAwffU=U?LLJCMlkSmvcAmym0MY!!x zjP`{o7J2|p?VVqNgJJ9JiK6mjsnYlTmA#g5B8U-sh{Y6o0D(#`upU8{f1@al_Juip zi0JfAwRIgWaWxKFpSh+G2xy4%4jDNWmR*AGR}=B4A?p4q9@?A9;rX)CwR6B^=9*+_ zU^f&Iz|HdPT;OO+6wUMd3nH;FJNvWZ__4wAb*TeRW-QA_Kf9wKlKpUA=z4JRbt3*T zOxCR;8vwxa%uIT*w`Zv8{ijkvS~HeK6%on(bJ*CDrFmsYD&=Z&eC%74ne+ArZ))$n z4h*n;$O;5G@@#Kjw7>3f#jRK@mX0(edA`CLFLZQ>Ix(PP>*oq88ADKTWP2VJm79KI zq(5I7^L~dnw{09O^fqy6IHeK zM+8m-fe3f}*5(@vcL&yrk*8=p&nxjfue{hfj4{R-V~jDz7-Nhv#+d)aFLe{HCa?(= QQUCw|07*qoM6N<$f*y`GA^-pY literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_open_focus.png b/src/ui/qdarkstyle/rc/branch_open_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..1f7bfdc0350cc9a63f6c042ca4583aea649b92bc GIT binary patch literal 367 zcmV-#0g(QQP)w^U`W^T8g;w@0)cFUgfzjB z0)huXArM#$hG*EKFc=)P7{EYxE@GFYA;A7966Q-r%;e6w=iC_x1OkD;e@8_H(P46H zXcc%DSQ$|>glNbZk9zS6lK-i;Q78sYWk#E2ngi%FmY6N7bwvep?sd)JV(Q2P>9@~j{Z=Gh&OpxM(QsSF3EAX~ zY#QWyWxd%ScjH~8Qvaor0f1?w=F-5=b{B9wM-cJc#P#I40c9}wcQTm)@zWdXrKwLWLTah>6>SL4syTeqfyKepbP+tKB^ z8Q^%spo)v=TALuCPLqfq5O*k_Jov87s5QJl1FDwB;)R~B=t*FvVNldzEzMTsZ?=X@ zUPZdfNBp{Z@UZ~^^P_u9`C{U%h~8{bYc=%*X`ClQrn9(w;>+maoadl5#R3vbXDgn?fX2^D#V(IzP^R9vl1>W}J2VBNI!%xd(ayP!XnbONnb-mlnt4 z|0?w?vOD#$d%a^AV~jDz7-Nhv#u#IaF&o4mJ71=UC|Epq00000NkvXXu0mjf-MBzWE z`~v-q%|=9mQlrsol^TtXT?tD_%)F}^W}ESLRwdq-yyoTP+;iT$;BYt`j{lC>1VPlk zQI!SYLqv5LQ&kZ}YoheJadRHTlxb^rGwLELKz*3u03zQx$8B2ACYYG=7ZpwmcMOn~ z95bN1Ofzl#)E;2W7U22nBz+5)&it3@NnnMtZxe)~&|&wK@?_*D)75Nvgp@yt0e zn_u;fVf8WDxTxwiQUHLtsME+Wx4@levhY4>U61PZ3smywcQ_ml$KT}>vd&n9NM!|a P00000NkvXXu0mjfHrScz literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/branch_open_pressed@2x.png b/src/ui/qdarkstyle/rc/branch_open_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bdf8b2d2038f3c62eeb2f1bd0ddfcb254120b5b6 GIT binary patch literal 661 zcmV;G0&4wTfp%j!T%6@$@c&@(G;*5K$Z@Pf-dRp%+2`Tq~tQq89;L;ckYz{)oJbTI5~npb@hcfHd=H4hLAst`cs z<(j)OezG+1eK-l6YgiT(L3X$jgqF<fEHB6w}` zG&QfP%j?yF>#R<>LFWwh5jHws98=X*V4z`J1+5=~;`}}P^+!eI+UIO)IjoGKKf_1o zil@+t`rNAdUn(-ao=ug)%ooW^%x&r>Wct1Hh_#>l8s@1Y0&yr4J@`Wa=KNN$08qUGG|4Il@&z^16)T0i{uQq;}&-r|$^ v(V4q_y^djwF~%5Uj4{R-V~jDz>=J(fSTn4(pLU~*00000NkvXXu0mjf&;vAy literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/checkbox_checked.png b/src/ui/qdarkstyle/rc/checkbox_checked.png new file mode 100644 index 0000000000000000000000000000000000000000..5acad089c0032c7ef3602f92e4ead43bf2bfcebe GIT binary patch literal 452 zcmV;#0XzPQP)Zn4u59cxbAs|-P77dQj5&9K4>zMUO&{9r u_6?R3@-D*Nj^+SviRjE2a~-JWAJIF(Ds=KIT)3P70000i0F@-9%R?MTh@)KK<4VX~VE%UG-5*{m1v$?S1CBW1FHI6T=2^S&gN0 z4j(=|pVRuB?Df+1Q-b=;_AbBP%ObGvIeWyk(rFu_vr>#^2Ipo)ukXCgIQydG_S<_s zg0y@~%9mcT-K(b8urR-(``ecJZ4%!n=C3bgTqAOAjeSCWeY~n-QTVH`zt;YnCwctT zdj?^Ktqi7W3|Wj>J`7iwuFPOq!MehbF@QTDnQ4L8f@3TWx(>aZ4N(nJL?}Fa<}c&s zfA#ZbO})=p$oS);F>Y)@_x+TAHDmJ>Hmw3oD2eAtN!NRY2CPfN7?ST zH@CfIzA@p4n`9HBsN%9KHi( tH%j*w9DjD``yb0?7G~)N5@ECV*ZzDbIXNVJDKIZEc)I$ztaD0e0sysye_8+l literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/checkbox_checked_disabled.png b/src/ui/qdarkstyle/rc/checkbox_checked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..bad9677cc4f4a9ba26e86e1bd35dedeabd704201 GIT binary patch literal 467 zcmV;^0WAKBP){y%|5A(0corT_4Ei=P>zuR57S>V5m zeg;{qDpp$24W7pI zv2KsO&|+NjHxvSd03kpK5CVh%A;83WVAB75T6uS%1GocZP-f{&F7B?VJqWHW3<943kb>A!xnU0z3&CB^ zfrm-Nn|*zGzFAyat}-J55_14%{PCqWm}`Rgpw%d!`_uEU=o8VUgC_z4p4I>W002ov JPDHLkV1f&9!|nh8 literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/checkbox_checked_disabled@2x.png b/src/ui/qdarkstyle/rc/checkbox_checked_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3c3ea0b45e6520062ec5dd12ce13cc39d62df0c0 GIT binary patch literal 845 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|V24 zPZ!6KiaBp*J9x3YuYR!xT*(urlZbjU3v;MWuE6!LE;MM<^ zeQAYY{=te1%c?f89{ln^(Y2a$QOlPAMFE4eY5V22q|WtOq&E9+lJWW6w0*qi_uagE zbAqJ9;)^^+kJMZ*W?Wg*G0~zyl|hg}nBm>mpf$`{41SDnm?LQ=$ZbtA0a!!wB+8dVw<|%;Yiesa+!^qrSly-!nf&edU)Z($6L3e z4i{h5^H33LJpAeBlFT3;m(vVxcOSPoo)6jX9LxZ6ri3#4CENd*Cpc8T7tP%C{nb6= z?4!=5%QrGTSh;$)z>-(OKM!V{U=Kgyai{hZ%b!i{ug^(~H_-!A&G*z*-@4D%T7CKUYORLGLvOw@1O57>)nj?h z?Q{2DeD~32`^R;Gv4Fc^G4lhl2X5>KbPx3MHAFW^%Q9?dFt=jJW6UdIxWjbk1;Y;3 z9T$mEShCk{!R`OgcS`=yb`W(qdlwi|Z?6e|H|6?13+TiLSMFNq%=fR-e5%g%T^QuV zeY+E9iF^(^<7a0?#Gn{ybV{4H{Wx13eeg=xAyv~1#e~IfpP9 LS3j3^P6(c1vXwO+0S`~=`bK$Qhk_w%ms z9*1k@et4QxQYJ_nK!z1x>zhdEBEd-&5E4*j<`g?|7;6Ow>Db-43b>lQ&l|Q$Fz2!p3egJ|87uU5%>8pM=3zm5uOKhnPm2JJsA*NI3eCLDaUCF z!cV}8T*Y!jkhbj&$e&x?l^*UOr5hvLO8I3HdH|qUk*jl2gNcjdJq8EnDaO jdj6Lh1JsWi&5XVQeF1vToxTwd00000NkvXXu0mjfH|DU^ literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/checkbox_checked_focus@2x.png b/src/ui/qdarkstyle/rc/checkbox_checked_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1c30bd1dbcc9181d26314fcd0b0139c7d1c0c522 GIT binary patch literal 823 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|V1b zPZ!6KiaBp*8+u0viX8v{{O1CZS&qVI6D|g7_455<_1fC~=)yt1ug)y1nkA(~x?0mb zme(axzKPl@S>vOMMY=MCGSgCOnF}W{pyT8-~DplI0qc+cM^g=c*Ilr! z6aKsLx+GgI$8lY&jt`$cen0)|{9XO~TR!hf0vXm=KIN0C@x9v*-d_4}Qu5jJde*$# ze63FYpGs0zFwRmuq}34jeG7Bd(%)7U%qQO6>{S1#{B+a*teaZ`{FZw)cDEmJ*f*m@ zY7bw+sZhIhS5`fK)qAm+zvH-2@u^4at7hD{n{t%d!E&xvq?s7O|5mrDMMF5q5JmmQ+uNz=>Z-Sez|y@uNF3m9i{ z25EW8Y)YGYsqxlh&IU*6cZPyt?4ORN9LQT}JV9Sga?c}>r%f0`vZwkQ)a~%v>(_i; zK8R!8*-P(aA0NLOl^XnZ@Aa}urc~XsZB~`L_c&jBb5{NSqq3jUzlz)cA8q7hNLc1m zs=0O9?9a7)J8I0g9rKy_VT)3uWW+i>yZoq0Pgg&ebxsLQ0OUe`cmMzZ literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/checkbox_checked_pressed.png b/src/ui/qdarkstyle/rc/checkbox_checked_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..4ca57646ab5cb5a2d36bb2154cbaec79c53308ac GIT binary patch literal 418 zcmV;T0bTxyP)Koo$#SD-ssSl}v>XuJT%BOr#xB`bqxsEG?% zLsH}nT)@NxuELLrx+|g2g&oo;KZ~|*?6;b{nauk-GfCfr|Bn0&)I0uJDBJ@Lpq5ge z1u(S~Z$50l?iHwZ{5yn)U1BK_0=?y+{rF3ub~`%PP+x#|Rqd|XOg@J0TN+s_oxw?o zLQ_QgK*drn%t;i@A`P_%h^ls1!<%s$i4D<*j2+h(fl+kDR{&OQT?1gvW|C&|I6)w0 z?^6?t3)Et^neh31y^4l)6D#gnyQS*-nk4CR&_4K}twWQ4K`xLBD{#7|%W-vwk=$;z#f6AkCP1f~Eb3eBtpY+KFVGZWihfu(q%a48~v$Mq!$WD=|4 z5>alA9NX5Wz!MN!if86_H6|X}J+BL=YOxhzB~KZ zz6Q6&nW-yQ1$KTd2v4hSaqws0Vd`Mq@o0GjuLwg5Lykd(ru^&ZgJ1SOa%GQ|IAHqu zuru=)z5}`ZD$UIsLX+xt&ae9Sb5CMhwRmvV%=V(< z_CC4KVRH_y|GSZ!PwCG7s_)eg&u{mSpZa%I($7u)w@~KHeCUW%PRMc6paG zDO*~$xiawkb+@eD``Y~djr^XzY6qZiSf)W zu7tz4G>rHwHAPiatt7WiHG7*Z!)Q=(@|N18nH@8Gs@^=a7BrSjU6z@B*3R5P(82E7 zcBTi*mtKic|yDe$XhR}J@tka|P{Eu)pJFo8D6SL1n{qR%c_{T**jclJC zs^6H%#4tnf{CVFqtA54YXRcd*EPbZncYkex83%)Z?o7|W!xpkVv+ISf#NT_ne)>$E zy)5gdnR!F~>UGkEx9{jRoIRa0`*McK+OzRxc8_!>1wHZr<_88(S3j3^P6T&6n^0%gls) z1Kf6TJP-uIBN5R6)&Z>4YKx^G1`AI}Bl~UW*+F=~W=XJPuyWIz#=WRIW_DS9&`8Z#Rr4b3a2Y^bcZDY() z9mct`7dg^e6TsVSi=P63D&(yLfVFm5r+HCIsl4{uC{~zXDbUVE#+Yx}@Zn7W3(=C3HHSyT0#7B%g`M{fc$J12|06R1XG&A2R{?zHb2Rh)6|m06-JKPNUKI3EF49g4+Xd23$9g^D+y9 zU^yF}-UM(A0G{V<%nQIdm)AbYW5upG5|Jm)xqYoQl~Th(4>yy7AXv`K-vDqVqml1e z;;x89nBUoO0QSN#e4Ph=yBQ@(@}=Ewf53Hz+(do1qf-DMNxlff@O@1+{}KHHS{a;V Ts6Y(Q00000NkvXXu0mjfKve?1 literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/checkbox_indeterminate@2x.png b/src/ui/qdarkstyle/rc/checkbox_indeterminate@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0d8feb94bff6c19c6bc39fcd6c154fc3abcc4394 GIT binary patch literal 1081 zcmV-91jhS`P)q$gGRCt{2o6Tz!Nf^eTYJ0lpYCv*O14~#(y?BU-hQ6tLS@AZT z!)C#Y$DnvfLkDbHu#=ey3z9#;54>b^6TP^5l8&bpc2|fDB8Vsw5AkZxN4*}>hMu0D zab~J!D%tc8=FnB|y#3TO)m=436_AmUv7ceR1i7xO*J`!P0A`5jG=ReZ%%LjlpAf(Y z#@OEgRt>{=dtdsl0rT_o7d1`01K@-Nk)vdTbAG*CF8|pr=s=e`X4|%-Y1%yi zhonjy4Tl(Gzgd=53xZ(1Q&2|(Y}n3a2#ixbN&#(g;?>1X_}{!FGel-<>+m{(|E?%R-@7Qb+0rY0DRxy)HH1t z+r9Q1C!@Bt&}IODnfL_}xy#GTpCoG>I==635|NuIo=L{F84!*0JLtOpM6$M#k;~;C zCyJ($F=;*EaQvcLt-g~fYLq0k6VZ`mOqu~LGrZmQw(o}&?QOHyGz0b(nE|Q=s3tQ& zwE)#*2B;RGn#=&z0#u{RN))Xd-XNkY0DeG^>y3Rt0Nygj?iz;idoSyKy&$Cr*tR_p zhT$_JDq;JtbROH&PMM!Pfa63|3d8W(!otE)8QO&na9vktjI9DVCqYlIoNG3le-w+w zZflx7A#6YxhSva`70ojMXD25ouZt#;@d#X%kVDzMWf<_IgdBr%Of-QE15^&B!XwST zp9f?Hs1~3a83vGq9LkVkz#9oU27)mrd~aa`i0Hm(jzQs^-xJLtY(PGrF9Y~jG*7<} z(Ld3>g%CEt^SoNK*(?HhDVnPfUUJTV@jS04nn=nhP^na2o2GdNz#@Q;GIDm{BY;KI zG|yBjmDe&7N?Q-`Jnstt2Y@p-H)oEGjY(Y(*xK5nm6erHW==q&0da;QbXa5)A=Ls@ zlNq2|fNC-WR0~i|W`Jq|s!21TWfCJ}?Ohcq+S?{*X$E|VUla<337MisNm4sw?0qt( z&46gX{SMLI+dWCWUcZzmdXbDt>jA5Y>syZFj7w8BA{@sVXN-A?;$+*}4KNJj5r9{* zqJy0ChkMC{*kCTrT%`H*c4(*Xx&}Uw*Ld^56I$9hd+BXK86^ zF|DHG5VyX*9$1zY0ysZ3S;L2j$SIXdrA`4|$M_%!g6Zk$=Zvu_?7eeC8=Ujma=HAV zTTtJ}<^W7ZyRLWLvAJlRe}O)Z&1Ga{>~FpTm~Kgr%6Yec00000NkvXXu0mjf_J;4l literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/checkbox_indeterminate_disabled.png b/src/ui/qdarkstyle/rc/checkbox_indeterminate_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..04d7da1d63db438fb27daf4af08c7b38adf3f358 GIT binary patch literal 614 zcmV-s0-61ZP)3zAtjc0@g(#MluA_;+t@=12|_=B zpx{9~vUhM@I- z8s@!u|KIM+?9RY(m;BywK9Rg^RWgWN1mYq2?4r75M00PS7he7mVDwt*zA6t}frTV1 z%G|b_f7AppI+4DjqA!3w6`dJyD*58t+Ltg~FHKFIE|nuGQCR?@27A?e6MbHiV&_0a zMQ7e^tgeJ%?5Xx3D?O!h|)B&Wy?Q3it)RoEBN<^6umd?*wSIs%B6%mZNd zD4#}w7%H=aB`UzZ!*YG6K;h;Qynm5JZu#Z-0tm#~1qd>>=ZnxEK-g=yxFTOW1`uVr zT>yjn{?vQ{PLxh&fJKFGL5*vjp0S7wm%L1h5O$17x?%#wMqSsx8@R22kAsD3v3rZUK~SxmsK8Yp<`q z3yf&aB56@s7)hkXF;4#H8Ll&pO->J$Z8;_AW562GoEK|#G0D-rwb67ji8Mw(eSH7w z?787}RpN+=0jI+8l^s+!jOgucclAj)HUAa;0Jhk&K=5S;`~Uy|07*qoM6N<$f{CgV A!T0R;w2oi7seM zJVg&%!HZ|bV-8ysq;wAp`xmUcc}xJJj$^v9U# zE`WVfrL~5A%ygxrJG7e3EIh0hRMmiEXZm9R?leVOYYBIBhl<(E!nE5(*H@r7eBqpB z(S)P=9f*D^m1ry!Y=0S#$4%){1&BtYzGu0WE?wt-Fy98S*M42o_y@Pwp~3*eF!a3U zf9!bY|8CQKgENzfoP6o>=?h1KYnFKrz*$>$I>3da&W=%Y-kc|Y#QyLMye+k@{kUBo z9sp)06S+3cHwfUJt@_CNNVb6r15h67zCc7nk0&NxOV-$QW+oFkCJZ^MFFWJh4Cu8N zN+lYTDXf*4B`xWw>T$-n8PI7jgo5oaWr}JgF534yW84hbFvHtwy?rCNXs?*Px*4#e z@C;BbKsBBLss*UVGeETf)p!P|7N8nkR-*E{;hviyz6wS+>RfMZ00xi&=(hlW_@$op zzIu@I3+OpJ(3OXO3gD6TztZg}PdjCP+5vnA@JJs1spF?F9+073*Z{*YbT%;x!YLVo z>Vj~}^qGG~qtRMxnsp&;zB%Wi_ zZ66lRAfpphIg|>IG&_DC;2EG=fNEqIz!GvOLxus*CFD@nwuE^A|1O$CpzXV&IfM-; ze&hccz`vq-8ij!Q^|pl&HXt33uUaNWL3kpXt8NHSOp`990M!Ci<7U8y*_Mp8cU8D(ub4@? z8Su(pc$Qn~k}0Z{xM*K?#<&?UYcJ?J_sbO3N_@IC;Ha8&#<&?Ux}n5;yDuCGO4QX7 z`ofVQF>X1kN1bsM1_Zc}0O6^vYVVq5-rG(l*fvYscZ{b4Tu3-$8`>_> zCS_P9x+o7w%@s-w5IXk+&}mKs1>xCV{<(y@4DWK$L5w%9_s2oHs|5tv9tLE XL!w5%9m2vM00000NkvXXu0mjf*z*Hw literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/checkbox_indeterminate_focus.png b/src/ui/qdarkstyle/rc/checkbox_indeterminate_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..f7f6d714ccb84189bc57aaf5ee57b127429226e7 GIT binary patch literal 576 zcmV-G0>Ax)@f11p^egEIi zzRAvm%Pu)TkzL$;V2!${&LB)C;-c&zvSzG!)#B8b3juDGz7;#sOEJ*QZVY<`? zF!}!LL&bas4iw3s7^xi2Pwge)I`Lui=BU-2pk-jfSo0{{iIFf!xmE-fMe@6a>6Ijm zLj^Cgk|}M7sC=?UUEnEzX+^2d0Gt@9Bx!zDe!~fJ>%DO96d)+Lq_(}2e!afC8w|7U z07KFhz|a9kq5^K0zo+*7-yZNx&>J!H9xAe&cCNcW@^>120o45ZJAt{F#-Y-J&eagQ@Y5CKx7SI)M{=}08Yvea?5%+*E$8pif4^J5wx5sZHV7+DrfF+eQA7Q zE90d6oTz*Rtg+&SYn>VskHOW(#f?d*R%_P0I%m(X_oyn!dZ*UxN`C>C6Q#_Cf9+NP O0000}b0K^TVLZ?hnRTg1KO3ME1CH{=W^8nDK zfd|c7))g?9{Gw}0Rn!^BQVhCQ8Ew^r2>aK+%Fq0Ke*a})eNb>?uXRuZ4|>8sm~mAH zKg%_~pFmgFoOHD!WV1E#&pR55puEE=VfOpNAjN>%>u(!$-Fd=5 zhxBeQW+wqR>J0Pf+->W`^o7J1(S+i!Kzc~mb*G`IE}kuV7I8SxzIo-Jb**d`&za@j7LK!yP-r&8e|cg?Q@A_G(l zP>l=&SV9hE$S~legdEDAEo=Y*k3@3_Jo}+&4q*fG1??t)QPDi*!>{L`Erj?hkZGPJ zXYM!ymT<0+Fkq46bRp9`E1FBnERet4I&Ktec!)PT2bS;yrGl-AgJx{{B}JER?%|K^u@Tz;Oq-qHW!!UO;?Q_8-S z=n1MTxemx**xkcSsmjT!3e3P2`(pF;QVqggngaI$Xp$?) k`wC#BoNIFt5fN*f-|6%;oEhcX%K!iX07*qoM6N<$g54zT6951J literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/checkbox_indeterminate_pressed.png b/src/ui/qdarkstyle/rc/checkbox_indeterminate_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..31220be5dcdad4f369e6bb2b48329d935bd80464 GIT binary patch literal 563 zcmV-30?hr1P)gz_*Cp=llS9AMIFl+gACGjBv#judRAWJP4Tcj^v+SO2m``2@w0 z!hfqSi=md#B1-ns01@t;_#%t|pocN)_hJJmPW!UyiiG~uLIKilx{Bx;a56&n38HIh zH(d=ghHk^p@1J}FmRMbV0S_atnN35jW}-Ml0nSyc8HiSN6#Wmo;0gik!LI}4xWe3p zR&F@#1_5jX%rI3L7eFedw)T#lJKqJ4;u+zQh}3iCru6&L@txsf$z5pWQYkG6d;pB2 zc=lRQW8yKswQ+G{V&!Yi=J1_fW2y`61hr<@`U%JamVQIIcQpV2002ovPDHLkV1nm$ B`w;*D literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/checkbox_indeterminate_pressed@2x.png b/src/ui/qdarkstyle/rc/checkbox_indeterminate_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8d112b16f5940cf2ea0a41fb4b0a74bb75298b45 GIT binary patch literal 1087 zcmV-F1i<@=P)B8ZQuQ7*=4j2w-R3x*qb z(5Q{Yn~!*-2OCTb>cRN9NGJjc7vN$HUeJWZc!c;$@SrBt(3nz-7!&1D`gx$@c6X~w zXW9YTU&3L&nf>-Z|L*P#lNrFp#bq@^j#`C=^s?w!J%LUD*bkr*z}kEY%YhjHQ2@gX z?oCu~d5o4r$$wq+PXjgtI*)3gy8w1e5Lq|~qbcUglVShUzctgcS21}5-9ZgBh?UlP z0ASQ;puw_pUCjVz{h>YCD!hShK?YyXkGjG^gv0ChzMlE{^3e<1db?oyu^%*rzcSNR zo#;vIThS-f;%fj(jnygeF}v5nYCvd6FONpvAoH<*reW^X zM7Sv?TX#OF2(bey z_6(Rp`z&p2uB$W_V&95B$rM#cY_wOI+t?Y9Im26SU;CwC)oz)+{$(PxI&ck8EkHG{ z0jdS4#x+2-0M)n#s1~3aU0SBlkX|+(xk7}q0Jg&EdZTj~z!)<+6IGjUJ6Z2@f|Mtq z^n7=E9-QVk5e70%@l2Hui~8`0l5E1FBnC=hS+zb{Vm0V1>l z_$(u57CsZ9wK&NK;%)x-G7?H#4;bt6PXh=72yVY{Z*B5>vDEbdz4$wSxPNg50OB(9 zO3by$Z=ovzcOs-(fNER=R0~jzYk+D2s&NfaEkHGP24qfRB&@wF!>ZjfL9;U;YApCl zrmJOYDkL`A$IWf*3>Y>RlFW57MHP}1%^x>~M$Bz21~9nSSSI3Y6@hl2WNmq;BGB$* zrWRw&+&93+fJEh%#{k|LLZvCJ=~+o87&c4)*)dKSP4_K>C2f}{;*iFkf#tkiK1K7# z)4zO<+vU@E1Kt0{fe8R$MljKFw$-jK>pUPHKHbWUVE$wk1ZHq^qT|esYz>?pnj*Rb zMvYu;dB)+Psa%fD?Zd*Z>*aWCZXCeKQjX2JxVWrtegQ6dG>^RSEz literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/checkbox_unchecked.png b/src/ui/qdarkstyle/rc/checkbox_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..4e68c78c7eaadd2e3c696d2a96602d307dd65663 GIT binary patch literal 397 zcmV;80doF{P)0#3jQH~}Z%R|`oypz{lv0kEw;PFu3f%)%&&dQBxC{~elH zb|D~X3ABCRUpFB!olb9#ZF#FK%T-nXGMFSu@&r5p2O#I8fvkf72!R&Y29t_7jt8FS rjgPH!_k90{Y|Shy%W`!-nmOJ9Bb0qej2bl$00000NkvXXu0mjfRwbrq literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/checkbox_unchecked@2x.png b/src/ui/qdarkstyle/rc/checkbox_unchecked@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c4ec9c5575c62fde28ab6a9ff5de0a89d9ef9d GIT binary patch literal 828 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|V1L zPZ!6KiaBp*AN0EtAky|f_?D=(mSDkqw&Us(whQ#A9LnoZThOgoZpGh_You)`cync^ z+JWc?!Uj8v&MxRoJ-*7fzdQ5et(OKJCFe};={`aKMjc$t#GjD$@|6}=izs~8Z9b31SM$LL6l(98x zv*#ok#vPN}b`{FpKVL7g_D^@;V;#re4-7w_UM0%Uu<}`WRK~e&Z;#f*&1ZZWI{l*O z_FC1Cwf~J9`oyI27^=S498)~@|4cmF;&A6l-=j zmpcA-)o#8j-rDPR6B)O2B{ytg$n0Uf#I(ea&4YWwF$o1-2PtX@cJXwyuLO$SMS!bUGaUODO z3VOx4VqWl_Eq{B|+EcQvXV0FUxh2_VvGnne18*L6ZaWY<^@X6+V?7=M_><1EW)mi1mE(!Z}F#5p# z+j0zLHTUZqoAy0-6jqjLd${ZMt`jo@m;;no9dg@|@chl29A@TO``Y<@HJ8p4oY?=0 z*SB=$&E4NFO!2dF-P94c|F2C|?DfYMX5~%yLbuBw|M)NT*fU^ieEZD2`~HLPE89IK Qf!Tq<)78&qol`;+0PC1@x&QzG literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/checkbox_unchecked_disabled.png b/src/ui/qdarkstyle/rc/checkbox_unchecked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..9fb0036caa99a6b2cdf74c0637c1ed6814416243 GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv(mfq~J) z)5S3)qV?_djeds$B-$Q+Hy3d`)pY$rtBc1gu8Sc`$D|)^bU3tt^T>@E8_F-V zEd74KNp_>k@rAl(TP4-qv}}Q z`Ta~)e`l{0D&>E}!qi%&zc_ZnGA8Z}jT!saPUFANaQEL=fr;u5QuAFNZ+)J7O2hwh z;hZvEBe4Uj20s3eR1TLk#)>{=$UcAjO>YKI4MX0pf2}F_)yk`I3 zQi~_v!h3m0JTt|K$ zeVb`C?Rw+Sg{HqR-AwqRVW22Cw>hOjM=?q0{hqonNt4v}&3Y)*e{Suc&+%#AHE%xu dx$5&=_{fHMm-9T)tAK&Z;OXk;vd$@?2>|bZq7VQ8 literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/checkbox_unchecked_disabled@2x.png b/src/ui/qdarkstyle/rc/checkbox_unchecked_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8d6c0edd4af7b755b73cad183dde103b8163b43e GIT binary patch literal 875 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|T?H zr;B4q#hkaZ4|+>GiX7W7el3PYf33vVd*0a&(=U0qwm5MGRt0&t-iltzn%ni-|qKkb?*P3aq@`) zzkvkLb;(^P7Nn?M&RqF}#kgOvfZai!K|3b%e-BeYQo{6(Yg0nwG@lfypH(w8Zg_L$ zgoyAxh8KHtQY`SQq z_Reb$^M^m@HM-9HkYeUredMaP*su5_Gm=6T99w=T@Kgj{zB84fL7XFkvr#+2z}Cw3 z0sp)U{!HhsqNU@T?1T(Y_@&P`$Y4Cs8#Tf4eA%{Z_P^L(H-g+7YPIii&H4WdODFl& zeO53zshGfT|0eac7Q>F0ZC}d7IeY(s^|#hmFcf^6&7M&8mh)?5 zYIcnLbK{1Y$6x8UEZY6%_N4sVuje~zT)Q`O#ZJa|mhaCw$X&euxxV?X6axdxoonnr zcn;j0Kj&7<;t4HVdDgbo*~+Il{LSdO6<990MXKg_-2}$#T*(bv7&3bpFEK4KWb@#j za7;o$*FlOJf=xUDUsZx{OE0;)pyp?T<xx>i496Dis$%yzcY>F(55nHT-i)i283ZhTWx_G!urh6TID zQZCd4aQiN9%FwX=Bv-YaVf9+h~(m>7{ggTYYW^0u_TV8Q#HfyX&6 ze|*?;JF_tF(9L#s35LQgV$8qg&M7=o{bM!jYxERDIEGyuax0tYuz2v-X!< zo-!R2y;Ii~s!5fvpYvULR&Mcco;QM@S9Ptv+P&qhBv0Gxv-vW?PyaN%<2D869tKZW KKbLh*2~7a&iiP1giJ-b)0#o?|5sBR^n|n+is9H1|eq@=;&_0hb z$w^i*^FQB|wk;19q^tL%U9WAi$%w_#KH5~g1f?iA=ydwlio z*Vmp0cJ7zpy2C7eL160npjWQv9by(V8vXgOPL8|b^v6BRJNGc;Ps^%*xix(0l;xSd z&-`?ZSo5+}_Wt#}vPo8pIU(59^1!9+^*UGWHuP>}`~8(?!|r0<)f)CL3=0>`Wn$Ri zz5Da~MJ^7XB_8-EF|Z}TPyt6r+2!n`f;kDX3>^XuJJw#jvvQU7-|eeC0$4JP*rYa| z*uvHF`OiJCSxWYVdVamZz1?jlp7eh44$rjF6*2UngIP8qz3>1 literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/checkbox_unchecked_focus@2x.png b/src/ui/qdarkstyle/rc/checkbox_unchecked_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ed63aaa3267497c11edcb5114bde7b45eedc80e3 GIT binary patch literal 866 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|T>& zr;B4q#hkaZef@<4McVEgYe+AWUN)_NFZa?7g_{4F3?_A0cd9*LpKw6`LWBde+Mys{ z6~=$8dN;QO-`TP3M#_x|8w7W(?{>1DE2$yWcKK9oSoyoXm-l^tSyNKTpRh4vopI4T z&zCvt&N{Sl@EmaD@6cl~7drQCy^K>pi=$&hDSM2r@7K52tzYIaF4=PasXNOjF^A`= zs(Y2nH0Io^z5JV3$tL&GOQvb&`Mavub_?{V3B6yXFzxT{`eO#a9w_8l{4-KJI`^}k zA}tpUDmH{#SStxe)HP?;pID*``15w>1Zf1yI!X9iF;~wT+Nm(Uw*BB z|5iof_oYJnKW~m)43t|?eJ3ok(p=mL!N_c?Lz|_x!45@B67W~W=4d& zzm?h{E7#9upb;|r4SVIfSxs#%BFx{y`%|@TRFxbWzB*V>o~6&DDrS&)=jNZq56%@9 zZV;O%Ecl>dHG@`lbLNhU=ZmkGY&^zMIqNRJ6W@|n^WqK zyk^PU(s%s8PQl>Yb6RfxOI*UO^I3y^2A{O?@`P6hv@WgKz4oroBy0Z98uwilgt&q{ z85@Gi%K!PA#4$Ww&rmPKy@3IS8e$J9&5ZlpJ4498pV4Io!@ldBclPYs>-S*MD{U)J zW`o)X8d1j|+X&=kKT%DtyeOFd;pXnim#;n6ePO!6NyUfl#C>-k&QN&`xtbX{OW!V# v%Dm$1_WaYo@A7HuUK|lj-|*jLb0zyT(;U5*w~hA$Lz%(T)z4*}Q$iB}(}}4> literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/checkbox_unchecked_pressed@2x.png b/src/ui/qdarkstyle/rc/checkbox_unchecked_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2a4b99a3e4e306d15d0c20555282a7dbbe6c5380 GIT binary patch literal 861 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|PU^ zr;B4q#hkaZ&-(>CiX7W-%<6S$Qg`dF^5(CcPjp$7J)b%2$!YgAr#X)CkBo!N0f!Bj{>{v0P;Kzzs9B+vwLiuqwyb(ZH>1zunKfM<_DnM>B<9*a zp3^wBdu|D%!aI>GHyc{dI<~i8JGe!nV^5spo|l*2tLEtb`xyOhL+?zPz27AdIGxrB zP2D8pC<+$;gCD!2crr)LS ze&^oSlrgZJc}H3)Dmh_`CHE5jvS**tN@gtI-KOU*! z;}G7@Xz_Jr(2_;-X3D#z+O1ez#deQh?(^?DZ#jlLYoAzh$lC-L+Q!T^dwh#$MQmxW zVb|8&`}23)ewoiBBE5fRXgTw%?=`s-e`@?m|7X^bZD}&oM7f5?VUJ-#fF(!d-X*5& zby@3vOJ3L`b-3*6U3TU6ZQ1wFH@LT&Iz%;?Tw};&ycEH_gw-RNcY>HgFEs?~*ka7t z*8IM&pxmBad{_TqP_n~=2!Taap4ogQY3qJVIH>ndRGY>0!_SuWVav*C&Xa?U7oBBb zlE2q8QR4KobfzG2i*q&awr($);~_u8Fqdsb*Ddx7Yk1Q>{F?lx?7nR4#+`Qy4c1mJ z^LnLq>25=jV(G~PUEgD+nqAd5Ti=#H-gxrln{%HSWSJ$h&oQm8(>0M5N-BC*9DgQH zkgcohXNTj{4WSb^wJ8<&2>Wg|@wsxNp#0MNKd#a0!N%MhlfER6N5#L z>J=7)6Yu5k7KEnm48B*46_;-xxqcU4 w;%%9^j25bw*k5TC6-?h|*?siWj-TB3x4rv$=2mndFuyQ(y85}Sb4q9e0Bt9Do&W#< literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/line_horizontal.png b/src/ui/qdarkstyle/rc/line_horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..a89a1ed1dd594c759f9eef2f3f2c54181e28d4f3 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D5&n~ z;usRq`u3b7BZC6Z;RB7YcCky|eSFTrh?!x^T$S~f1+xno5?cAUcQ9oi=gi#?)WYED L>gTe~DWM4f7*8Mr literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/line_horizontal@2x.png b/src/ui/qdarkstyle/rc/line_horizontal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3c6899f149812308978d4924c719a3a179c1059a GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP|(uT z#WAE}&f5!(oD2#A%p0$-+`ZRNk=0YpA`he$2paycRaq{3am#JST(&LD5HW@ad$|=J VGUfZu`YR6-@pScbS?83{1OOY{BDeqm literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/line_horizontal_disabled.png b/src/ui/qdarkstyle/rc/line_horizontal_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..b89b2c927890c87b738e4ee2f227048c5ff0bac9 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D5&k} z;usRq`u3b5BZC6Zkpp6$7B710Z519%zT;5|WpIdiZ)tA1VNxN(18#l}J;sAs(r=uA P+88`t{an^LB{Ts5Qt%%+ literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/line_horizontal_disabled@2x.png b/src/ui/qdarkstyle/rc/line_horizontal_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..027a03064f74c50c100789a78a3dd4ef00c3d041 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP|()X z#WAE}&f5!toD2#AtOqZ9n0>hYuX2ybCx z;usRq`u3b7BZC6Zkqx}OC+1o4H1<56D3P(6p<%YApr^6ygfs^$h!_LI Yz3kE=rpme$bt907r>mdKI;Vst0AyVvA^-pY literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/line_horizontal_pressed.png b/src/ui/qdarkstyle/rc/line_horizontal_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..c4587b843c4460ad11ee30a1339420264ba7b560 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D5&M> z;usRq`u3b7BZC6Zkqx}O9&-%lH1#~5D3P(6p<%9ULYjjWM2vyq ZUUumQCiyk{^nZXvJYD@<);T3K0RTsjBAx&M literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/line_vertical.png b/src/ui/qdarkstyle/rc/line_vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..36c7ddf2ab33959b88daca7116263d90675de3c3 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C}`s8 z;usRq`u5yLK?VaJCd2q;Y1P#nL9ePU&WfnsRJmQVC+&|iP#qFzVD`Gk%6mxhu?a}f M)78&qol`;+06TymRR910 literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/line_vertical@2x.png b/src/ui/qdarkstyle/rc/line_vertical@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..573c55152f05a9c0ae7a7e8171010076226c0591 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP;iN- zi(^Q|oVOP?3N|hYeEyt11Ko-hDlpb7aw)d28mKJ$}1Kp9!cK3H&gA$-MJ^ RKGP16n5V0s%Q~loCIEn*B|-oI literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/line_vertical_disabled@2x.png b/src/ui/qdarkstyle/rc/line_vertical_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cf615a5c9385786501aa6b87a05649bcc97d0819 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fANY2y6 zF{EP7+Y5%G4F(KH0=kx1CAjGu^KA$Tlc{M-+5Pg9k=YTOb6@YCujPHXvHP-pAcO7# z%?7axA`aXcTnkuDST8WmV#;9jW!%!Rj3LS)m{!uySOY(@G#Eele+KAk22WQ%mvv4F FO#te?Oe+8Y literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/line_vertical_focus.png b/src/ui/qdarkstyle/rc/line_vertical_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..b81bc5b0920ed1dab32babd37f14cec9fbe24716 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C}`p7 z;usRq`u3cmAcFx1i=&#zopr0HKQ^KL7v# literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/line_vertical_focus@2x.png b/src/ui/qdarkstyle/rc/line_vertical_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c474ed9022d4b4f72ce4b2aed0173a025e1222fd GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP;j-U zi(^Q|oVOPYMH>tljs$eIy>gH>3TWrEnIg(QU-4$%u01`xhU=?qzZc6nSG;-j#b3mM zJA-Qhs|o7`rddoGjJ}Lp8kR9cIRrE4F3@ZcyFfGPO2$}2mIi@#lSe>jGkCiCxvX%J;m-0N^*nQbPkU@8W zW`o!T5eM!Jt_7?ntQVMOF=a6NGHz*D#t`KYOe^VUtl<+`8qWSvoCtI^gQu&X%Q~lo FCIF~2OCA6K literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/radio_checked.png b/src/ui/qdarkstyle/rc/radio_checked.png new file mode 100644 index 0000000000000000000000000000000000000000..3521990bf5fa9df28896603370425b2ff2dc2f41 GIT binary patch literal 1224 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 URTF31YybcN07*qoM6N<$f{#ECzyJUM literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/radio_checked_disabled.png b/src/ui/qdarkstyle/rc/radio_checked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..6bf1e26640aa11e642e4eabc3339aae6723ec710 GIT binary patch literal 1325 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 literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/radio_checked_focus.png b/src/ui/qdarkstyle/rc/radio_checked_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..a74da487f7dfd56b182ee3966a00f05dd6eeb152 GIT binary patch literal 1293 zcmV+o1@iidP)E+CA+N|*%1kQfrKFmZtiD2W8Flt37Cg8Rk8!q8mD^Dt`G-0w&a-d(3ua?**2|OdUY8!f{*Wsx_*o z<9_!TlQsIELMviVR?Ey4Wf4dT0Ln2dOP1gMr2N*f1r&JwQ#4|ZAUq3npm>7ao!?P6 zD?I3sJZd@PeD8s521*gGTUZNkSGg}{EMTJ7S89x$0d)`#o2)S(cCDFucTnOKOlfQz zbtm+2kHB)^zKD4xQ1yJvkOJ}=+j6bY!(V|iMRs-GbFZaN%y7u#P?h{0{#p^;0<>eh zW(Gek>qrc7rS`Ex4|ao;fi$Nh&ueHcwp3T3%tx367~mShQ7qT~BmxobRIPU!{H35P zh=dQKItLL=I|Gilbp}Syq68w5(9}D%GyaY{J!<9W_}7c*7r^KN#(ZB?J`1dKf1OBz z$Di$tGZ%qrB2)&drXPzBIH|kQtx@5!DV5yGX+02|%7MrM#;WKpr@^-e)xN>ixkHM4 z9;Ki@(H9rs?7aLq@CMKoxF`FPW@cRLMuZOrAx?k-vbvzbw`}07Awpj0Z(8p=%=+ zfL>2*1w%cB017vIFSx$Zsr4s-r973C0**04C{|KmmzYujLE3w5eF8*J#hmj}l6*t- zx*aY;E;aiT4WedlEbGbs0>a_uD4|rc?_B)Yb**z>Mra&1y~vhZ)fIgwN>vmV0*JAi z`UwcGfAJ=864c4>&RUU}E0`0iK{Hrh3 zTmE+Hb39@DMYl_2wZeR064A^5nj$|+#Ow{OulPM>I>g!0x))&;a4J|;K6_9Bu{!WK zU>b@y*j-*dU_o-|Q1qNHSrSR>SC#yR)@p%mz)d3ImtspDN7|CC!0Vr)#+(821pR?A z_Oigo?(VcC1Ht3Zc5=;bl$8h%5P2=Qw)|Xb*nmZ;({SNw)H(t@1Kbc5PoO(^Ad{lB zAjkiX3Y$Tv0__-G6s)N@pDujRvV8o`mhpDj{#Jx{W2Sagn!y}5wq6b6>ae88*b%$X z#*`SWdB7rK?}rE{h*--4HSWI#;>hS@lDFOWvL)05uVxYtv=}3`T{Yz=h6)_k*Q{`7 z%j9s_T8v2aYX(Jt4YVuLj&d5&rp|TKuM8*eqm6$7&ZORc@EJ*n00000NkvXXu0mjf D{zF*^ literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/radio_checked_focus@2x.png b/src/ui/qdarkstyle/rc/radio_checked_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3282d3e7045e50e1b107a9ed7fcc473fbe3d2ed6 GIT binary patch literal 2736 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 Tag0vA00000NkvXXu0mjfm#8n< literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/radio_unchecked.png b/src/ui/qdarkstyle/rc/radio_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..342825717338cc38dd3ddd985ea36dab4b4feb29 GIT binary patch literal 963 zcmV;!13dhRP)h)CP`<=jGLa-;okGk@4J_G?>QH)cauSa=jZ1qTdmeH5jhA<0tLVT%RpU3F1A{& zg<7rl<4^&L#o~SuiAChGKJ#8S#spCmeZ3=qQmJ&4h`bFvmkl+5MG-kGB1@{;0GxAf zH?UVk4gu4^o-Fy3|(zXhBGR)L4&IKFaC0BdbN zNs@1Xdx1AR&wDitLpO+ccYfdZeINqr#+dz46g9d7%*HR0BsralFYZtrK;t-$f%kxd zbM7NHEc!nH#bWUR;5hKRsvh5=_&S8=d9MIhfdfGhJh3H!F{TWls;^fnl|P3d4nP=& zsff&HxnsI^VI5#@ZtgbVaS{0=m&?5~Eb)$&%jE^yyKrBrRJy+hz&UpW5LNv=48wHT z0D!9M82}M^ss{jgG>iIj1ma}EUuEur%>X6=j4?lr3IJFFP}Ra_0EKL_!H8^ib+rK? zBDa(Mh&}hf|7F(N9)M+ltgwv4^7(ux_e$rESqBi2UjU3TcZ>=^Ri`qy-WlsYh8HsT z@CX480f@-?9spHc%-knuW@c_2fxf8f(F|ar2cTN5t^ntOT@w=%FAiHh2!bQDi`)-U z6s`9L8&83s5n5|)epuqx+A&q_)R_R#O#$LKz6^W}+?piGht}F*98*ct^iA5Uzfh@E zKI@+B5m41m>6~sho3$N6NDu_Csp`wXigWIHx>gTcw`BW782&wo zvbA=s*=(K`k(YpfoO6#`e{m=&F0f0atgSUb}Kd= zMbUSg#c$h|TWfDllH^_BnQW*oB8$$sv%pfCrj2|)@6t5g?VQ^qB8O?W<(&)X+}hgO ziCV4p>sA_lJxqcicrfc^9_}X|xB~cb9G|;Z;6P6^-}m>5$T3wt2uzAdK~-;{y)$)H ly(l6J<#PGzAbGEE`xk5uU>P-3q3i$v002ovPDHLkV1gFhwaNeh literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/radio_unchecked@2x.png b/src/ui/qdarkstyle/rc/radio_unchecked@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b34782bfa60d4caa9e78e978743050c4babe43d8 GIT binary patch literal 2195 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 V00>-870Uns002ovPDHLkV1kw*8D#(f literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/radio_unchecked_disabled.png b/src/ui/qdarkstyle/rc/radio_unchecked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..1205d7fe6aa3390aaeb546ce2b8d1e67a0bd15df GIT binary patch literal 1040 zcmV+r1n>KaP)b-KVq)|OBMJrF9MG``Ls%)sxL{0>Xh$_JOJ7w}nI0gJ;Qnvoe*iiJ20>^y5(&a_-J>Ww0y~+9`uW|OQ-3fekeYe-&rRduNF_Oun zk;~`fs}s!nE0z}>=KvR~{kwz%Xk;|hts{eu0l3=Jvjn^WU`4xGbr&)M?)sJofJTKI ziG3v>sY;*5GGm!pt6>0CTJj}eQ_>8eFp?#p1+e!CXA1QgnUceZZvuIZ2NsSBK4}7(#C7oBpJ@Y#u zy8?m2qU#IifLDM8RedTN9=x(X&#}?P@!6km9C+yAuZ@~!px!CVon@7e+6JD4i4G!9O-*Z0pCQrqTbTSnURmZzms-s6ba_By{19 zsoN@;j>Dd3Dvfb;pfrJ2C{ixq5Qr(n1i6IL8wrP|cT)H6j(-828(x}aCljOq0000< KMNUMnLSTYJpx%f8 literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/radio_unchecked_disabled@2x.png b/src/ui/qdarkstyle/rc/radio_unchecked_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e050feeb047fe6cb6d615aaf4ad05e7400a331b4 GIT binary patch literal 2294 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 M07*qoM6N<$f=c}?+5i9m literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/radio_unchecked_pressed.png b/src/ui/qdarkstyle/rc/radio_unchecked_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..21711dc7fd865b552afd6f4bfb4e99aa8ca2646f GIT binary patch literal 1022 zcmVQ)RM;j+Gibfr{a1$B;FW>SKMDq@4jtd1k{Jb_1mcK>laDqG(X%v0lylX*?A=r`eE4s>jHyK)^RQZKG4tY4bSfB6L0>tr11i6c;{g0 z)qmF>7S$jyBP!1&20Jd_6QHtfxZISbzeU-os-L84e|eXl9$Sd{9jR1>qTM2V1jI1T zreuG6JU7EEe8rSy4xwxW##UwyAetKN=miFVTC5!goj2%t0KVX{XHabi5*c%|eP!l% zAd=V0-Uh}&w^Z*r`tqUx7<&LfL_fURzxUe8&0U>pomKRG0E_hIeudirzOLhs051X4 zi9a9cE1J2h)PR2k7#DbIT`=-=9soA80}w>Mn97VHCg`^J+c-yqE>CUl-pz zD^>fA3$rC3K&b<;YJOfV08fcbxR14Y0O|(4UK?kX^q}YOxxUxWO~kx?;D1y2gZTg= zOajcNsaY-0pEdViWb6wBn z188~-K#^DI>hl!eUPVQB0th;i2at?}ra;aCzA9U~r`Yzs&gc&Jkoz%l#DBXsn70a4 zY(iS_l-ll{T(@0Pw~Szh5Es&GoAU!cVe#egwXPg^4sX`7CljAI=yHI6#<7P}p#nQS$T z2xqvZ9f_lX-xu>(*2SbU7=6|l?FF7+PCjtiTDqqr{xkPVEa+-h^VU#9I?XObwz|i6 sE#Lq#MPsO3z|oOZe_*_je(!Jn2OJ?@GFZm_F8}}l07*qoM6N<$f@RRwn*aa+ literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/radio_unchecked_pressed@2x.png b/src/ui/qdarkstyle/rc/radio_unchecked_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1a1b9c2e3713ac8789eec43adb736e2685890bb1 GIT binary patch literal 2197 zcmV;G2x|9Kp2q7ui1Q=i>s0 z!_a4dIbOv~2USjjtnFy1+~Gx!7;*y2YPV0Y$a@xeD1*!beh+dGwT`RL_nskUCp}#B ziJBH#sD{7D6001TAu6{bdqBT%b)Kw?&Bv9tAR#@LL`NWf~TW4h(I{O5K!$xUa`BSQ_an)Er zqlJH6XJpCgtm6& z-rTb%|K`7RiEtPH>CH37i-ew6XtHwx+k^Fuv-`WY z-vk6k@eDB8Mzvv?_nwSacV}-kR}j4+KfXedKiJ3sma(1i0e_||GbW(4zWH`hU1p=y zLcbnstZ5sH-CW?^7rx!&$~=n z2tPgBRP+8&4dxmrqt)Fa>by~^kM=b;NSlDtP}4+|FWabuXyPgFY~~j2=L>eCykny# zmlb#4l}?*B0h(tl#x_Y(^wr+y>l(rCMW%}Gwo{f`Rq3SZ9|6?`jL4>kdlC_Bj#;(&Jup*t-IW#W72y^0ei14Dj9eA7Pl@X0m*>%1t4If{(Np*)hV}b z#G`j@z>V#$HzBu-D#(3#v}<0<+wjlmsZ&jShiW@3=MB3Vep?^saiN zTa%gqWtyXG$%udV_XSNjy$h7PHEG@gMxjeE?BDucp}^%`q0p^KlK^#!)XZv)Z6x7j zG}HqmZB&4YR{H>-W)O5Qk{JFG@y(wrq?-s`bd*$6y3MtMX`$#Sz`h=Eh24v;*fl8$ zu+X@(OmS}P zVcoo>Tb4cnmeoSOFm7h2XzFAxo`GhA9bBT)90Lu66lqwt3b$`f^fR2W$ zSH(FP27LI}df_pbC>eLT9_MFor>ME5FMWo60Z~OCcQ8U_ur`{qt~OFIss3j{5q-i% z{~*>_lQISV7#a5lW0C5Ei0pLf_mtIcpD+ZUxj{v1AYt|V0_Pc`zs8K7O_?t1cX!z5 zlgDtbu1+-xy!fe=o7{(^{;LQUbv+MqhmA_8N?m`4D*H{qnXQ#)E%a+Z&&Qmgx1H-Q z+6+1@XN~(qNnP_Jz{7SIdLg^f6G z=5w(~Xw^U>WOWCFbjY|IclUW9hHT5h_{(!J@9sK#ju<`s6Y868$|lxOFyY}HWx;V>zs1#f;B7O>0|RY54CbI@ zMXN7Z-1TD=cNa@2Z1MYz^=GzLp3OS$05D}$Ykv2|e|-yN4RC{_QhC|*^*nfP+wu$9 z#2oY>R$3daQP=|HxvDOKK5Jdh+mOwH#f%6a@CQ$y3L&}{=Xs@GsBVbG3s$pxk(q7i zA&ugtHPN{UFDjIzsXiyL4`iQt*|$IIWK^^UN{TPfMRkE7_kgCGh9?A8v`0b>gK7XC z9G4$o-8j|f^F62NeHmm4;E*5(MD*{N=DSIiPIL6AOTM_8QfL-xk6C0GMmaD;gGnL`A9`xGAwOwpK{`NgZV!|e;Agj z?D*=&sp2!{i7*R`nJSbE6anMt-MP5{#6|drr5p#2t7#qTY^pvsQjX(Z$8}uC|0ezo X>KDm@)a|J<00000NkvXXu0mjfW?(ph literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_move_horizontal.png b/src/ui/qdarkstyle/rc/toolbar_move_horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..5dbf8c27edc06ca6afdd84982afd4fb0b225a6b6 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCpto z;usRq`u6%kP6h=YmV*jnX_4V`CR}@?P<8P6yUz*+_gyB;Try?K`rm7B8t4@3OV3?A kpAo1J4ji5v-+Jbk%Knaz>%0*w(^im#r>mdKI;Vst0C#6A-v9sr literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_move_horizontal@2x.png b/src/ui/qdarkstyle/rc/toolbar_move_horizontal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e775854a376ac8ecd0e2d94b246f55cc0392eff1 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1Fqb zi(^Q|oVOP?3LY{LVY&EQw;d literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_move_horizontal_disabled.png b/src/ui/qdarkstyle/rc/toolbar_move_horizontal_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..0563329a672659d8b2e1e3912e1148ba26a7224b GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCq0y z;usRq`u6%pP6h=5mV?1LC-_XZr9O<_%>4C8fw@h^j4!H2t7~1}D(8IFVdQ&MBb@0By!EQ2+n{ literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_move_horizontal_disabled@2x.png b/src/ui/qdarkstyle/rc/toolbar_move_horizontal_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..42eed67f8f9fac4f8a0ca83c73ac3a509115cc89 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1F?j zi(^Q|oVOP?@*Xl^V7>UBXQJbchFN{0D`sd!UkKdH=)5F}JDA04#hWJ+cBm^#p7g5I zoA~AYsayIt-tr$`;&Xa`)xP`drqBBx&6{mk6S!%6K&sbzp3CLYd^pGZvJM+ zhWlv@RSahtzA(&Ue8FhKe1SQGZ2|iQ9tZvfk_~bW#tgO%)KQSz&Csv^JnsAKHF60a mmZ~!+pIKjg{r99Rk2v@0D_HPbUw;ksF@vY8pUXO@geCwxByiCH literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_move_horizontal_focus.png b/src/ui/qdarkstyle/rc/toolbar_move_horizontal_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..d870747e7748d9b2271c54b30fb1f286b0e7a6c7 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCpzq z;usRq`u6%kPM~VH#7?(@1#Bft4#>_~!K<_MarJTemiMbTM1#4*x$E!dpKVJN{l4X* m3DJeqrCX{PjMg`IA%pWZxaXyY%_bu-U5d^HkQK=J9O%eza;{{?>{H8~x8OcV7Rg zmd)}blWhU}1s(_f1(FSN4#o_&4QUKj3}+d>FwA0n!DzyKfjNUZ3a)V!{Qh+3b|qFEE*~Env;yap1l{9R-qt5B{aT+j{>p00i_>zopr0A?+1vH$=8 literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_move_vertical.png b/src/ui/qdarkstyle/rc/toolbar_move_vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..4450862aa205c1d5683a3f388696f8d6f72667fc GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C}{2J z;usRq`u6fdK?VgLmV?cw48BYe3KB8i(&m)ZyfgH@pRLCvyXC0V4{|#L1r_=UL1RBHO>FVdQ&MBb@05R7oq5uE@ literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_move_vertical@2x.png b/src/ui/qdarkstyle/rc/toolbar_move_vertical@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3f0618f72d86f2d3256830f359337eb198619860 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP_Ww5 z#WAE}&fDu7c@H@VupF@Ma=7Bk?K0(qXboqHldqWXj3bPDl21>v6<(*eV|R`)PzwXY zxy8p8Y%QDr{O8msyAIn$&sz2BVs-uhw&{hh793YUnY;7t`B#kTo2wi`Z70{1-AK*8 rTqMolAQbB$eu4FvgE-g-h6gkDd1|WhzmSb*1POS$`njxgN@xNA`WHr@ literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_move_vertical_disabled.png b/src/ui/qdarkstyle/rc/toolbar_move_vertical_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..1369e4446a190fe4c0e6602ca9ea0d2ddf8d38be GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C}`*D z;usRq`u6fdK?VgLmV^AV7a2K3zCN1a$$q89DM`3^^}V@OoD37r+*?t*%Tss7?*8?P jo~jxgH6NK67%s)`y2-^}-IrzsG>O5})z4*}Q$iB}eQ+rf literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_move_vertical_disabled@2x.png b/src/ui/qdarkstyle/rc/toolbar_move_vertical_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..58209624c315ad23928dde8351fcb66f248e091e GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP_WI@ z#WAE}&fDu71)Bl{ST6h(c^J_yD>3_Klc4Cuj^r$6kwXzJGps%YA8Gu4XfF3Rz1=K8 zT?`F>H7-9W*%veUlIr8cUMFs;SyQ6_@3G%^IL&VR$)}T_{5W^R_wXskZ%d0BHu|1= z{XJC7+(h&3Emekw{}07yoX;)#c|bYa zmp$9dC?}SQ;fH)(V_DYn)9Q7N_x~_~Ok!XtdBm)KL54qZO3_;o*VEO{Wt~$(696~B BOH=>= literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_move_vertical_pressed.png b/src/ui/qdarkstyle/rc/toolbar_move_vertical_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..2b413d30552e654fe120e4e1392dc443ee760834 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCp?v z;usRq`u6fd!2=2+EEij)G&m;P2~27AP@K7Np-7`s($BQ{R@+}WOcK#~8~Dq*v1;Y- mzl&`deg*|tePW%Y(i+XVfs4Ju_U{CsVGN$GelF{r5}E*CL@b>E literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_move_vertical_pressed@2x.png b/src/ui/qdarkstyle/rc/toolbar_move_vertical_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4e80a0bebf0082b5c49e424c5d91a6312c833e54 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP_WL^ z#WAE}&fDu7c@G8fuv{?KR#1GF#LU7gd{JQ|tFf!Wk>wuD_N5}4mFsPGZnzuE1k}TD zpe#iG&HD4fOW%3&albKMzVMRX{Nq2rO27NHa;n^XmE&gjzNLR^SUb~Z!P2{v_K4p| v&2#SE&d8v0k+p;|b^(70Bgha2hHEdmJr~LG@7Lb-9K`i>^>bP0l+XkKU6@6S literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_separator_horizontal.png b/src/ui/qdarkstyle/rc/toolbar_separator_horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e84c1d852b2e941235fcb4eea586301438c181 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCq3z z;usRq`u6%pUIqo8BL_GPC6fOF73w&N+PNRk`)=NvnRPJKNfv z|6F-{TlAzJ!*!=O-8tGfxx&Qr+j)P_W#t@=tS4T7p8wAIB!m4z#xD$OX^ef@Dr$D} oA7$z>)bqTi^13cORQ4UG!8MTp?k_WBfqrA~boFyt=akR{0L0a7O8@`> literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_separator_horizontal_disabled.png b/src/ui/qdarkstyle/rc/toolbar_separator_horizontal_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..bedbab447947681f0f6a28358e3ca00893cd6279 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCp_w z;usRq`u6%pUIqn$!w$_69lQ(DQdPo|J1!)CuZ;bj;8?rv@^h<`z0-QQds6rVE;BQ+ sa0nqd{(g zs0056t_AEFtQVNKFuh=mV*J9emZ7R4jKS7Hn_}sc4EOin*`375w|UR`Gr4Jb->p5% azB99^353Kx4qpiLA%mx@pUXO@geCxy>1;^= literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_separator_horizontal_focus.png b/src/ui/qdarkstyle/rc/toolbar_separator_horizontal_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..1632c597926a312e55089ca991dc5679fc4fc618 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCq9# z;usRq`u4gbFM|Tl(F?5#iA@3>Dw8T_D7j3Lep_q*eisMx(|4!tx|*q(=v2rz^Kl3$ qI5aRYGO>Ud483)3&pRKz)|>E_*dT+4w*GI+ZBxvXbP0l+XkKa%5=z literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_separator_horizontal_pressed.png b/src/ui/qdarkstyle/rc/toolbar_separator_horizontal_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..e03fb8096ec7e709ad718bdfb06897da03f15495 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DCq9# z;usRq`u4gbFM|Tl(F?5#iA@5=i5!YEOjG_ p4h;;9Oe`Pt&nP9=5WD4kXK0BAVfkAzft31q&jn2ap=`o^JJ3wLk`wH>jip`!PC{xWt~$(699`oT?7CC literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_separator_vertical.png b/src/ui/qdarkstyle/rc/toolbar_separator_vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..86688ee38c360327cdcaa21e34b74ce0046cc00d GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C}{5K z;usRq`u6NXK?Vh$0|ySINR++eknOS#b5`7F`Xn^QVbYTOTcrgzHU@r)ooUHfbunO) c%FCAw`Y%{nR-|og02;yI>FVdQ&MBb@0GO^P`~Uy| literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_separator_vertical@2x.png b/src/ui/qdarkstyle/rc/toolbar_separator_vertical@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e4efe8c7d388ed9e68d57e5e6f9830dcdef551f4 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP_WR` z#WAE}&f5zcc@H@VupF@Ma=7Bk?K0(qXboqHldqWXjZWqb$)|T$-8NS{gxXH7@q1CUCG#%G c86d!u#&~3{Fvo3+W!FJmPgg&ebxsLQ0JAwhoB#j- literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_separator_vertical_disabled.png b/src/ui/qdarkstyle/rc/toolbar_separator_vertical_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..244536844ffdeb3912ef97ec67ea6fb6894db8c3 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C}`>F z;usRq`u6NXQ3e49hKtF{(gG@^%G4Z>f_y$Fo7-n0bqy=K8Oz lb@J9|-o2&@(ag~BwU%LDH9yC;wY>j9LY}UEF6*2UngB=XPC*=SD literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/toolbar_separator_vertical_pressed@2x.png b/src/ui/qdarkstyle/rc/toolbar_separator_vertical_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..08d83e1e75409cadec4c3fa73cf526038aa3b0f6 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP_Wq3 z#WAE}&f5zcc@H@VupF?Ba&Wrh%FZFArR2DXJ8P4Vp#KAwH#asNIp4CHyG)-Es09eB z0zN0y*Ur-_^)I@y;QXvMuibm(pIgTe~DWM4fTi`($ literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/transparent.png b/src/ui/qdarkstyle/rc/transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..67753617fec23bbc57360e16d16bdd82ab984743 GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C@AIW t;usRq`t~3rBaqjm@PB=thXaWDo=rf3fzh3DK?jh-;OXk;vd$@?2>=W@7CHa` literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/transparent@2x.png b/src/ui/qdarkstyle/rc/transparent@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4012944b58252423bd3c84fbf6f5e698b1a39bf0 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP*B~| w#WAE}&f9~Gyg=Te1>gO1`OFspnaH4_oY}#FfwBM7$v}{>r>mdKI;Vst07yI;1ONa4 literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/transparent_disabled.png b/src/ui/qdarkstyle/rc/transparent_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..67753617fec23bbc57360e16d16bdd82ab984743 GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C@AIW t;usRq`t~3rBaqjm@PB=thXaWDo=rf3fzh3DK?jh-;OXk;vd$@?2>=W@7CHa` literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/transparent_disabled@2x.png b/src/ui/qdarkstyle/rc/transparent_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4012944b58252423bd3c84fbf6f5e698b1a39bf0 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP*B~| w#WAE}&f9~Gyg=Te1>gO1`OFspnaH4_oY}#FfwBM7$v}{>r>mdKI;Vst07yI;1ONa4 literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/transparent_focus.png b/src/ui/qdarkstyle/rc/transparent_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..67753617fec23bbc57360e16d16bdd82ab984743 GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C@AIW t;usRq`t~3rBaqjm@PB=thXaWDo=rf3fzh3DK?jh-;OXk;vd$@?2>=W@7CHa` literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/transparent_focus@2x.png b/src/ui/qdarkstyle/rc/transparent_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4012944b58252423bd3c84fbf6f5e698b1a39bf0 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP*B~| w#WAE}&f9~Gyg=Te1>gO1`OFspnaH4_oY}#FfwBM7$v}{>r>mdKI;Vst07yI;1ONa4 literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/transparent_pressed.png b/src/ui/qdarkstyle/rc/transparent_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..67753617fec23bbc57360e16d16bdd82ab984743 GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C@AIW t;usRq`t~3rBaqjm@PB=thXaWDo=rf3fzh3DK?jh-;OXk;vd$@?2>=W@7CHa` literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/transparent_pressed@2x.png b/src/ui/qdarkstyle/rc/transparent_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4012944b58252423bd3c84fbf6f5e698b1a39bf0 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP*B~| w#WAE}&f9~Gyg=Te1>gO1`OFspnaH4_oY}#FfwBM7$v}{>r>mdKI;Vst07yI;1ONa4 literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_close.png b/src/ui/qdarkstyle/rc/window_close.png new file mode 100644 index 0000000000000000000000000000000000000000..c7ac3e74075f5c04c74cf1c078c7543865de09c0 GIT binary patch literal 766 zcmVh7(gY#2QZoT z30juyT=+*61Tj9vbPp=vANZH(8>kyNE@-d4z3sida5u)Yn#@ek_syBfF-O(t3|TCh?|1!W&j1gRhqI=kTY+xm^Oegzx(wMWjc< z_x-nNn)a2j)?O2lwI=XN0f013Usp+pNUNVj4P5KswF0?>F=ii_Y$6ec;Z+fNRso-_ zgZC8xaL(0A7-ROFbGtbl7#dC?Y2UEc-Vl)$x=-{Wa6N1Hz(r&(j^ihTayJsFlMs<3 zRiz}>7!CurpcrYIzVdzlpmZ>W?nMj*A4;Ggv0swtz*TiVNs`8J=q_EO5RqRZq7_5x zdEU=q^9@yjFbvzkdd+tNw1Xhn&Hs*(3Pe%V0ycoLLU&$?;*Hrh#_Txf_L}5vv<2B? zq6aP_H&u1MAOgpW+Q_OkFa}m248tklc@;d4O7s<|g9EpcBw5Kj zoO5*&Eo01XKZ#m_0r1D=`Odj*W6YOfB`O7?D4GN|o5BkcTXhma5L9kQk3bYfli35Z zyyv(3!HW_>5PSu$lqA|!5?un;+6mxA6+DjPM}y!ek?06mYcGq)%hSS(62_QsRT94M zZ>4GaKJPdl@x0|S99TFBJdY$v9s&z=-xFiNa);ZYsTQB)3M^y^P8C%WB68Rx;CbF6 wZ~*)ek-1U8ixR3j3w&4APr%}+a{v4B2L`lzfwmJ`umAu607*qoM6N<$f?9f4&;S4c literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_close@2x.png b/src/ui/qdarkstyle/rc/window_close@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b11aa0818567dc9adcc05071e37e053391310329 GIT binary patch literal 1690 zcmV;L24(q)P)f zAPBw%ECNURE`2yLF>!Ksc6P0I(ex*1G#UYe<^hhV>OvTXla*Clv34*I@a)FMM%ceN z06q*(rhjb!fQUReVz0xhy5M=kpXW506Lw{9B{*7?>&c5#5}Op>2!Y9zc>J3et!NV zYwcOwA?(RGc%FAcL`JrKt~G1z)cpMXNBtLuo&)j?UNpum0*4(oxB>hiNs>P}#Ez{X z2wqUtB@ubpA^fJb_H34A*N0u)769x|2vwSg5ddI+L8#h140#6hE6cLqi^y4EZB#6q z^SGG5mMT>gMb86^uI5E#YLt0!=zy-mFq~A?1sprUT6-qTvJYJI@1!V-p10O60gpI@ z-^`Ef@4Mu71_0oB-nWf0*Vsh}Ma`?~t7)44);0gg5$IKxW!J5>Q@~A!@FOBJ);JV2 zf2*i@DA)mA<(;qqJTxj+RsSs_XOblOW05^dn4c$z z?7E0Jjf03htg1^v5WFxdwy1d#Dctt=)mHY#uEH>UNmZ{=K_`?k-)gm7KD=$Ku>k=1 zzW*H&xrze>;9tg=GjSaMsdq65g5x5xq^d_9a@MscPHN{O$Z{KelRee28)Ay>Zt5>xGfGr4D zfkOpvt=&BA0sz>8umFtu%Dt<*`SG?^^DxFyxQH5!#u~8U8ZROn`8~C(b^uWnJ!7q1 z#_ii%VDq)8s_iI>o~yAmpymg0rZ%E+#&pqF=l!v^Ii2oxZ{xbF>7tx z_x-0GVuz~K2>8DLl!&b0X8x`*=3E@d?IL^R#VUu;>e3B#!4zZP~XeX%ZsWeUh-hW{Lz{QIfzuxI|J^-F{ zNW3TJy9$Ef4DbuwApEn@Xq>ow`SL${7Y9bbTKg0J2h0QH58G+n#^H%hr}NYP#bLh| zf7v0~x~k6XrTMOsBw4c7p2q=#h@9$Q8}<%g1)$$VG&8)$}|AzbZW7yw|5nG=zZhupjlyqP4)K$88Ud?bfLP}NUFWUha` z(Z8^|x_W1Fa`LTavw4Wk*Wd=wHpcv@u76Qisnylhk58UFdBs}$q=-BMd=9*2jQL@! k)%tX=>pRea4z$1YC5@3j+@Cc*@&Et;07*qoM6N<$f(+9)*Z=?k literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_close_disabled.png b/src/ui/qdarkstyle/rc/window_close_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..d60edac2fe90e092985987ac51b826664ecf20da GIT binary patch literal 838 zcmV-M1G)T(P)pGbtr%@uv6I)wi}ShrlYb`dM)y>NP>h2 zk4W$VNPGh&9R;rl5)y(^;n2lt=pYG?B;WfCgU*vS!!bwb$SVajTip>^*1i z%+3z{?;&pE_^5dz1~*U+0arIG<<)+IjJ!DsTm!zxXk30)dGZt>=1zzyw@{7&M}QS0 zSDfw_d^l&$04w{sk2Z+iY;ryG4tm-#L>K!ZF`P4JL|ABH9c~j)^a{}Er-YF!P6xmn zB3yAh18$>kTYK@Lv?a&{zxRe9OeB)ow~k%i=@pLXVk;bFcC%7mY7+pc*R0n860u$- z_TdXH`G3JT%J;o<2WW|U&3ZkUO1~pWB9(sQ*j7ggBVU+8Sd0P>6aa8+>s6oxGTBMO z$QPzSTHzW74;64F63Og)gz+d6BctXikOu+qvtjU#0>31xp%Q~bnLVdw?YeMPdWPdk z+A)lrc?Mw~|Bn74!fAjYxQfnht*_ndmOGL_n1mt?P{c1584g{Rz#EQjy-XxC9}t=w zQ$WQ35>bW#E8k*sVnK6BVHpPo;P2wzU@}Z=@yIzf82jMLDm?Is8j9 zAjtA?zEFyiyK4oE(c%Q~FbMv9qdZ@?t1kwV85>~?ZzYgOmFOs7j20(QZG)qFVRK_` z-W_mkD@9fj-?6P1iDddCB0Wh23XJ56_)a%?Q=(RlEYTDg z$(yDitA7jkO2ku{&k`gtl-+h})v7zNPvUwjTw(4{;BIVH%C{Bf@ShV0MD@Dc`F#+H z?@F!;b6b`2?LUQgl2G{3CLqEk-~-^O=xjgWUI~=5z!!lU(zw*G-2Z<31pAGHLH={# QVgLXD07*qoM6N<$f<}LI6951J literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_close_disabled@2x.png b/src/ui/qdarkstyle/rc/window_close_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b571b12e89465d6493e81b05acf66f95d8e5970c GIT binary patch literal 1724 zcmV;t21EIYP)FnkDBWdRE&3pRX>ZdgI|l33Q2aDlW`mYni344qCE48shig*XkigY_I1wp>M$ zrRPfb+Gg;7dG5LAIsc!|xsqkUsZMpO|7Xdd;FX1i^Jo8a_WP=u$H+O9JG*W3llRwd z-aG0B$I+Gf{8!FI?3)O$V|5!SZgc*pf2{xP)85=Z09UUrJ-PKc`%6@#J(unay0~5| zy&G2JL1-qG|GKfZ0$k|1bocBzJO6IEyxAQzy#=w7c@--e4bq zjkUrDMq~kZ2*v&m zr3wK;HVwF92`=VFh^7A^l&f z`o_2re478%3X6Ws!x#X-KLp@fvsPU9bH-7a2Zx8?AT{gdcTl?kJa9;V3RvBLf;%ZT zpN<}dc^DG_>_Jc?iv$cIHlL2#h^gXe-e7(0e6Pk@fo?@px!1+&Z30+_am+VrWtTtR z4%OHb&{3;exMPLuxKBc5|2_RN#pct|cEmW3y{M!oH4gzyKu0sl>^F^a8~CC_`aebF z+PYV00?foSGa^zIc*f!0hoW+Qy=7SCSxV_po|M!isPd8IYQWbgrD zHnntRvTi?9AkTnUJbT#+HGG&~uNG_F!Du4?ZNZj+FF4fr7!yf0tG{@EoPN7CF#x~j z5u0mzWp8k;T-=HlIYI~%t-!u{=dmAV9-vV#)Qw6O$92HACtioKC!ovx^A71-isW0h zLe;HyE^b9jjQ+U}z(1s|$@R6;?_6s4YAgWLiTukEYz;T_+lu5|&3ANE5PYw|QJ9Cl zbr3@q*m6jJP9x&Y&1YWmdycOO*fXyl=nD?%W1H{RTq>JTOA*IOFiN6PFaF-OzB2&d z=9PS_UR-spKTNa9bP_cMLV)130?}0Z(s7vwXnJK2u{j*q!3wolJbT%t_DBHHRQi(G zNX^x}F}f6_`Hq@i*;6EsI|R=K!q62M$9$t&syO71t!N^b60`vQzxo`YkBpKWwho6* zKs1%Ugf-4%FCxofn+Iss3ROjNz_vsB^H%Vt6Zw}9OBgr-9rFSg9S+$Mk)?I7u;P## znEXyc8Mcae^R!kF+DP_tt*?m+ola z3Pe z003=|sIvnsH*3Y)jy;C1MzvINfgsT5tsj6g>{Z=C^*blYd`FFHsUjlF41r*gTfMP9 z0B0gk+yFitaQ~k9da19-NzuAjSUC)Wz&&=`H+tid-oRh){b}njK^_5B z5&2%T7S6w@gVf*d{rSU-FMYKrh8GoiTHs^gE#0->ZM|Lo=(zhk)u~Q(vh-iC4k=6A S>t~Aq0000v-oD7@#eXQmUqZQrYdo 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 b|9<@f<_Uyz{zSKl00000NkvXXu0mjfk|jfJ literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_close_pressed@2x.png b/src/ui/qdarkstyle/rc/window_close_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..749009c00a3e870536530f42c1d25b2756217f41 GIT binary patch literal 1679 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 R$EW}R002ovPDHLkV1f{ZMhgG{ literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_grip_disabled.png b/src/ui/qdarkstyle/rc/window_grip_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..3c0d86e823ca647c8ad984df051e1ba98c6e62e5 GIT binary patch literal 447 zcmV;w0YLtVP)dks(p z_ZGkwKOYW{n`!HwmHC=Kj{D$Y61w0@s~N^z7@?J~9~8h9H*f~LWJ+J3$J+4&WPi3J?MZX!yjtgHfAItZ}e70T*1avY89M zH$W8}Sf)z%%5bMi7y>Vwgr#@FAYZOkV%BxPCgDaCI^pYE?oPben8jff6^os4LkC!@ zs8QN*HjOEzFLlIi>b9NG`UK)Q(k7c)TqZD@lOSho%T2>^)U2w}1FCKJbkNDE=H p1K+5#nFkQZ5q6_lJlFm0^9>c)^|Bb>meT+L002ovPDHLkV1m<3yZZnD literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_grip_disabled@2x.png b/src/ui/qdarkstyle/rc/window_grip_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f57b353aac352b6b2059f2d0e868dbb0b75741ba GIT binary patch literal 768 zcmV+b1ONPqP)6!@u5F&c~#4N+Tc- zJd{L0UU(>hfJNZJa{-IOgU14Nz=Nj(bisp%0(8QIX99G?gGT~Pz=J0OOu>T(0!+e# z;{r^>gTn%Bz=NX#Y{7$r0(8R%+l@OSJO@Cjhr{mi=gHrl+7QtVUke*e5srWjU;~kt z@iEQ_Fae*?Hx(xYSb{$Vc^n^GxBzSLqV5lS(TDi>LKi`+@crY%q;m=r-~v1pB)}DT zC_sQq@L*YhYw%!EfQ#?|m8^f9C$``faxm<7-eu`Beg)WsAM~P3@L*Vg>+oPufDiCs zNPsW!U_gLR@Ss_MZ}6Z|fRFH?Nr12Lph18wcu~?Cb)$CHz8hQhyP%!{`u7B#hYuSq zP;E@?33>sqc*P9HTmsyO-`!7u*Rv<+2fVzF_i5P^^cp_p6?yL0Vb|el*fjk)X yqxY`#rRMt1&RP%ztFHEiVR%_*-!jWw;QR#u%+9O6n5j7c0000Plo@#q)sdxCQ+8^NYIzpe)j?( zs1^Uv32>swLB3y0fG=EVqdW&qIm^$yU%>{xC%yUQ(X5sLWw_S>Cb+i%rnr{?Hn{Tu zwz$&(Rd8nkO!4UEAzX;ufxf@>yD>NzM3(p%I7VpY`^}p1LxIO2<2*mBdOg{L~U!Ak>F#HS6_ z-ZtE75_-bTCZQ*M0(90V;YJ6n@Z~FaCms%yX!WnyISH+Cp$$xfro>f0O!-ml8egd^ z>d^8E1{y35DShiwcA=&woxkiANLQ;rtsWX`eFwg+i^3kj+ dPV4@9eFE=T^_JdW17iRH002ovPDHLkV1i9fx48fS literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_grip_focus@2x.png b/src/ui/qdarkstyle/rc/window_grip_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d92f09b0d0650b348cf31591fa0cd37344a8facf GIT binary patch literal 738 zcmV<80v-K{P)(u9ILUNrm^qNcTV2%{Q9SR9yyoO>0nvQ zTGk?$lsy5{RqqV$3cOJ8bG62!ACH4!{P}8G6SGl`sNVv5Kuv%@6W#!K;ytx8CT61= zQNM*qj~HVOZYKLGDIg0T_&ZTNP4-q!z%+Of+T$?zlI*Y4B6u16`IF#N);pCEkOv+r zA|Nk3R6sxxc<@|6QF!oJfDU-@RDdpc@KAtGc<@YsZg}uWfC+f;M1U!H@IZh`cyL^R zX?Sp0fDL$XRDdmba8Q75_~zl@o|^C)Kp}hMaPxEgxl;!sy5Sp9zoir>2u*~hpt{K( zX9Spl&&W%a69O#3PXyUd_LeTd7Ci9qJly=4>@Rf@v!H@u7;K6_ZpWs2W z0N>z2qW~Y_L6ZPq;X#7{dpkU}J381po;R-<4Yw8Q6&N@ZbRE8aINVjDj*XlN`T#FV zy=4YtuA8E+!#6sE9n$c6&IG-Hhj-~b4QGNr!xugibRIq$+(&qy%A4`mc_jf=g@-E$ zu(!!kJEL&xWd6MT@GwI_)#2e10nWpB`fZR8sk}LVMwtQ@1s-4}Ina!T+XzQ!f}fI? z8-8kD&IR=UFQ9w6*0{Jf25!Vg^WV(K&dUw2J&(jraN~P@1z3*_6}py^kymK4y7M3* z;OzOWU!o)geghYRY8APYlgd-lE;3o&c~k55%dhKnPuE<{+j#cvy3V|1Eo*`6AFs^5 Ue};D~CjbBd07*qoM6N<$g2j1AhX4Qo literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_grip_pressed.png b/src/ui/qdarkstyle/rc/window_grip_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..89d5908828634379a3fa053484ecc318275a74bf GIT binary patch literal 444 zcmV;t0YmB0^W@*BXXh#K-yf+HYhLtQi4N~X)a%>e z>;yp7iW7|x>1dtoX6v;C_{O0PyeL^5W$(Nn!5YrII~!b1YY9+>dktWMdkbKSdkJ8J zI}c!sI}K0;cNV}DZ(ZFsmy6^9;p4r3-UA1N$Pym{2WT4EdRQ~QFYu&7b)3Dcd<0wI zhtr$W*;WBu;ZWfStng(r0``FCJRB@LV2$e(4?@+;!>t1NzySi6c>2eqjBzmNfE6y$ z&;~CJPze_%L7=*MxYZ=|gqux5FZkCdxjG5gE}<2k)@{UdF6OU!pb9oM#oGuIrRTX9 z&g5cB?xvQwNnKHg(hkJ2S`s~$;h-fUx-Y|5>x%H70BI|BG>kX?$;8)!NJGQ87+5P)*S2~@vr-Ra;~GJ3#(eys+PH= z>;>4ajotXRMDko!zOO}-N8jFbz9jFjm9;PzRqw`4RE|+1LHRX_UIVw1JyA((vtIw; z6O0jhBi&a?0a@_C?+NlO-CH>Uv*1OwH9pumP4`!76TAri?6C7G>zT?3$O8`*5s()i zDj=W;JOnPFC_Dr#zyv%5D!>#x1Sr5HJOn1dG&}?(zy>@7BES|r1R%gBJa{g^HavJN zzy&;bD!>&ycqqU$d}BAhqav>WROI2fzwZR$Y500KZmP%$&;S~u+DrF%BftiH zM&49;A;1y*M1;rb-qHoQf=768)^C4I_m{c}x`ZF~+s9eYlqSFjcqmDLFYr);0H5H& zu>jxT!Jz;j;lYsrXYi``M~9sci)2|B;4?f}7T`NPSQHQfJXjJC3Ora45E48X77!Xd z7!(j9JQxxXDm)kv;0zwNM+fcUqIr$(;I1k!!NN??cleFHqit1&*q8~1059kfa~N|8 z@EyM19c*R5o0$oQ0FUx^D$m4BFl6|`GePg+cjJ4Ayqn6K^Xa^lfU3g7CH4S!lN{Z0 z4G(kP0H^T%&dI`g1>xZW0p7#!4O+nask{Y$MwtSZ1s*a4{Qd7d#1Q<9yxj0J^Kx#W z{|ngft=A{DF>pO`HUG(s?7ZCY#`8#h1vbyGUIA)}ONEZ5WaJfEtm!;R3HUnb{1kW! zoC7}uX%;z?GnFT_iY(T2-psoBbq1_P0nhw*nE3#83AZYXRiQH*ulu%V32Txe7C5iJ3cH$Jm|?^5P}*VWL` z;gNdQI68Z`J@?#Vae;W|9z*2~%!lVQH!%3z`^~)ItlTxGrwq0mmR_in5u3;#(XiPe ly~FUFX2|~*B_*Y+ce_`Mvz;@Nw*gwu;OXk;vd$@?2>_REK+FID literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_minimize@2x.png b/src/ui/qdarkstyle/rc/window_minimize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..83b82b6ee6192bdf92ed12ed674086f858516558 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1G3n zi(^Q|oVV8uy^cDFv_3ReZcIpAx>s62=T5WUfzlf(jE7A$nev6dO>5FSEE~c3$%=cX ziTO68#Su^K4E~4DoBimCNhb@?APC5D`tf>RkX2FUCb`p=xATw7vrDu+-12(Y+$GVT z$Fog~gH&v1-Mnk!oBwsAq{7k?qw}A;mlU@b&HH9}th-R={{Hrjb*rXK`uaaEZqm6k zIpOVR85CQx=i9Lt2D6`Kh`!9TLFe>m#V(7=Rn2J)``%Ap65eli4ybn_-)zRBbMlHU w+MeGh+1buoyT+r+VDsr;+zKC+ksNnayxYute)*9EIgo2TUHx3vIVCg!0F{DysQ>@~ literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_minimize_disabled.png b/src/ui/qdarkstyle/rc/window_minimize_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..d66d0703980b539279b536ea5d5588bb92f6cc61 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DA?fX z;usRq`u5UB-ev=lmWTgm$||My^L$`SXcx(p=xnl5R`BvaAT{xZV%^FG3PN)i?p$wu z`%-M8fS};c8E-f5HaF!iJ{Pa>kIiP!*QAeZ?@ZYnbX_XXRnB3!R29>+ug=opj)C;G zDSh+iB}z|d;`?!B{T9}W+|2swZ|WjIBku73Fq7uqw{?v&&@Bv}u6{1-oD!M%>7QrKVk4qRhWIFd($`{yTd< z10DTuPY*4bx_gSri#2n5qlz}0eGl*detG(j89W76a_>#I)=w(QxOncuvJW>eR+-lR zmHYK$<+H=#zv}h%J=uMK%sG;1)UfBA&#Ro{l`>11zxY@=TqxqUU8D0zL2|(jUh_%w zbZ<%A7O~sicQ~ctYt6rDzvl`s{}y&>x98TptCMzTe|}@}kICZ?2P4dt47DFw=Zl!~ T*UZ&71&MjO`njxgN@xNA0q%`D literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_minimize_focus.png b/src/ui/qdarkstyle/rc/window_minimize_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..f533977ed0828714b50bbd4763fbe23f675928e4 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5DA?rb z;usRq`u5UB-a`%|%@6NS7Znf+PHD|?a&$h+@-kAvH7jkw89tuIDQ6tyLLD@OV&6&C z&-M4;)Xi*cy!p_V$x1HPA+yc4o#oaHV=lYy-u#G7#!QxBagfY%?^T*7(PH_RN{CYUa47vg{7oyfQ%7FnGH9xvX=!;V%u7}d)VNu<{Ub-!(w1|~8CRsH zwurVK%1cxKe)-hi7tivN{_X!%6FkTAY!3_24hSe|`de9QKKH(^$g4|}{;p^|dVifg z-v-M)@%c5GPY(7!iOO6bBN$x1dz;1U{d3>hEkB;qu(kVm=xTL-wOrAa;a%A>TCexY zeUICBT(MT~j9PR3_fL~jZguqbU$T&P2xNEVI@{>ko;i*Gg5ggF$L+;00$aSzGpF$i ztbS@deO{M|)=5*o?y^b8ZZf?8`?i1Ax^HLR1}!^p^ft=0bi4M^H1)qs9)CC(VUA^p Z{m6P@l1t~5#Rr2yVxF#kF6*2UngGs{i(vo& literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_minimize_pressed.png b/src/ui/qdarkstyle/rc/window_minimize_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..ac050a040440ea02a91486f819777bc4aa537e03 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C|Kj^ z;usRq`u36`Uz3A~>&4&4bp?dV4*T^?Y>E{qOI*0In0MN{V<|DrHCh76PRD&d`+Z-& zbG?Lspy0_fb^hkNt|wkkisw)GXTBigo#_qc6=kvv7w`1Xzx|R^VBhmdKI;Vst01OjIKL7v# literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_minimize_pressed@2x.png b/src/ui/qdarkstyle/rc/window_minimize_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b701572b4685b184d2f9445f3d52c84eeeb42ee8 GIT binary patch literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|O(I zr;B4q#hka-6#bY3MOq(zX7kWk)YNcbBjY5lZw%ZkwEG&4Y-mUmyC7@A!DOMrxg)Pp zc7cZ%CljM@`Y*j{dn5~rJ!kx%{JhVi_)HHA&=v^T;`HNhj^p8zUH(&-`7HWm^RHyB zY{K&|X{&p>CwkU;O81t2HZ;E+yW#20*GE4VSFPdMV7cQ}+t*KqEN^#R`D}bT(pw!p7PVarqc6PUzGIH#8d`PcD~eqE))1JugPl&TPgkE;NDi@$?q<&F>?45 zBRlKm$)yw5M=pD0!>i4_Csuy1e%A*1CElL$dRJ$enqOY~Xw&pMMwPl2m@^p~w*6q5 Wdd?v{r{_OANYK;O&t;ucLK6V)+l9#h literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_undock.png b/src/ui/qdarkstyle/rc/window_undock.png new file mode 100644 index 0000000000000000000000000000000000000000..fab0e72e24850a8ad8d7af3fe9d6454926b0c39d GIT binary patch literal 510 zcmVKcZzGltOSS&dd6b#MU4 z3MA!iBc8MP zj;iQ=uBTE{N~vny{qZ1{43KQc3D7l7vlItFpX7!2 zMhtk`uaxoyzG$<6H-^^=9BMir@g=HBGw@YCHi*Boa9Q&k+E~YPI?p)Od1n za9#J+vaB1DNdTJwj1WOdvI`*BXf&=ue76!l0Z{FM^DegZn*aa+07*qoM6N<$g1!LT AQ~&?~ literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_undock@2x.png b/src/ui/qdarkstyle/rc/window_undock@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9574d4ab9a0ee9e390abd8c554379f41b3ea92e5 GIT binary patch literal 875 zcmV-x1C;!UP)HN$)24FIb`h)3me`G>C7 zen|`<2!iWT6fFZd+A`QvkeSC)dKw3CerIQA&iDP9TCMgjrCuUke*#iU#mq0zy7)mu zM5CVP)uohoP1cDGKuUQ7K+$C3eKG`K(f9pxrV4ZfAf-G7;IXNK8VnK9lTxWPY(hM4 z1Oxz#6w`%>M#C_?V?sMFfNLfSWq=W1aRL0RTiix`>1>Fc&fLWw`#0sJ{Gzq`A;xUjJBGpTdOR&xgTS|bqA=SrnAp0#e=9PlmcB3Z!9nl zT?Ysu?lbc<69xN)h*Y&&eQ8QR_MM@%wKXmj3eTI(<`#ep-TE13i0p(({RH zu~Ph{00Kw*p~F=TNMBR002ovPDHLkV1jYT Bc;o;8 literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_undock_disabled.png b/src/ui/qdarkstyle/rc/window_undock_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e164970dfdc13c33365a103d13aa6b6d32f2ba GIT binary patch literal 541 zcmV+&0^!j&bB!18yi3yF(0r%g z-MxF?&+qqp_wEP(yTt3^!|CZ*^!LCjFb9lv=~WeUlbDe&6^obm0^FD%0*Nk-ovKJo zCYun3Thz_Wdue+nhVCU2?fV~Be(lakqS#v@Kk}#!_=!aY`7YPhtsJ!gh*a7jq_Up0VaC^4e z*7an=zpKsyBY$!k3E(gg0FM7cdAI0VbWWM6ETD@vfQav}EA-E>56}k)9ia2B=Oxv3 zGnH{|-9WWD2xSEX-3$|;Ld?jA0ZL>|g|DBt-}#AcSpoUf z3v-|ztq<(^4YmOyjmR=k>(*VAS6}u&p7@Qo4-P-7$3I8o6Ytf~I4}wf2JlsZiYm+H fy{)$a-s_7iJ>Px-gj^~i00000NkvXXu0mjfS%vv( literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_undock_disabled@2x.png b/src/ui/qdarkstyle/rc/window_undock_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b6d5c6cb278b87e28b79493e1f26d328a01f2988 GIT binary patch literal 910 zcmV;919AL`P)FUT$nCF;VIeUCt z=X@^Tz571j^WE7w5AS&o;Ns%qWXP^SOQ5^18Y}%o=myXVpxVAITciQZFk>{0+Tk~e z(dA;3Z3S?kz4JKdXoP_VJ33MjkRpwHUrdZWDm2GqRooYh^n&RYfGt)vHh_9&>hbQ{ z^KoHrcG_ryr8A%{6g|PraR8bvdmBeq(>QE&CYTPOCD2`0Lo06q>?n)14T6Bw53b#t ze@!s`3sz&L9~E}+0Kh=Qn)kmj9l+Yvz9KR5ZskARS_Utw(0Q-2AX4-`pPY=@?k()# z4@S7i$2#woaupZD4M4R4)wltuHlP|e0M!Om|7NEZPk0JcgS$%lYB=3GxQ5r1apdnGzSU8h>` zFVGf>3=(h`3Jx9s7-$4(Pko_ipJW}w0Q`aIDP{~v7G5VFVjl7b!iS{_=mOXuIJpzV zH>3($z(b_nJQNPsONi?N(8zNUfJiZ`FwnUAlg>+M>jEI4Q=*Vv7$o9L7r;Nf#4X~> z{DKI3ngx6S$TWc{USxvELW}7Dl8JkE8l8gp16=^J64FI+d@Jk*pxS_H+yGP?P>maa zY6Gfq15j;1HEsZ^4XDNqK(ztYSlJ(-iruAFeAhubf52&Hz)b#tqXJ;YX#SXE0w5rj zM(uF^xKjeilE%G8`-YtmKo&&j3hfuJq`QD={%n?x72GWSKL+r7yL@Kz>d@=)@$bbZ z>z10!aIcl(eR49^RBlnDYrvOs7bz2q5~4m=#a~KD8}; z8pNf8bWmujL-7fmEc6Ln1Q8rfl+Kn81&xAQ9BP~6P}4uQNt3pk!G6Eqz2xLOD2S16;)Yz z&&>fK^f@#TGcPOwDrx^E5wDv=zfDxbp6l|QZN0RUsA$}3Zkr7JjrsshH865?KPC8i z1>lDJqj7D=au#C4XZX~|nam9~Hp(3Xh>1HHY#g=%BSO-88iFAh5OcFvILU14yTQCu zfa(^AiW&xUyp_3QF_vMJ&XG#_Tmt~u>)7}Q#P~yS(P?GJ#-_5u0;o&$8=^=w3hq^M{%t(&vv$eRo> zrM(1D1BGJL0|3r~aa{jL4Aiw>QPExj4EMwewDl}YXHH_P8DOT1UYG+YG2zl_a1B7f zE4vGQhWB4(qa%aQW^(*B5rRgVinId}ROt002ov JPDHLkV1l0u<%IwM literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_undock_focus@2x.png b/src/ui/qdarkstyle/rc/window_undock_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..62de7badaf550a6bb2085ccefe7b0baccc3c98df GIT binary patch literal 877 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|T?X zr;B4q#hkaZY%_ubMUMY}t`?wkRPou*Mp>P0&6Aex*!i2$YKP~+wXA`f9J#?>?&_=6 z#Fjdiym%2LE*Rx_SLV(VPXR~Q_6B)R=BQqg+0`;Ste@lJX5G1SZ`u2Q$7ati{`Y=< z^?U0(G6#}2vPcH;K3Gy5yGh5rqd?Aq$Dw_fj%pa=lNpBkR<64Ygnqv?k38AnVN~ta z@SLG!^^uDnaZPRBo&VCes&%9(Td#bxfx-Uhx7rGZ7h(@wpNFNbxYn{P%;8Dew=DvD zI9Qpt&*);A`!R}>R~lr=pXhz81shZ^ZR@jnE9AcFd`nxsW8^gDjQ#EG4ev_d{=c|^ z@%8fB=toQU&a{=uZWIgNv88=B$D`l#^wl1n+SF{Q26t}HWudT@;NHHOPfKFPcW zx(7_aOyLUVS7J^VXPUEb*jCocsm^gDyu8lnbDSeT^NHq4$Fh=p`mt|+FBHfQ{t=dY z@yaF3q*=)c{dtOVHB*j=dp%}eFZDBMuGfXomDlbt`Dq#RE<4^PC&y65a`|+IQFUax zkU#UBkg^GqldXjFCkY(bJn_n30~m7W}5y>jyGFb&%N?k!ZT4UHjXXldUTxbE~$M2ii*EVI2g6|>SSKj-`cl^ zS2{qVd!>k#X<^=T1`pYVwVXAYIS3CT`4x$I*{8lilkfWOk9S#CUuAZTX59Iz(LwS+ z&(BvI6(lE!&sB=Gz2TSMz$MBlrC0fdmpzd+q@!?S*!~ZG@r?gxEmhAl_kQofY;o#w}YI z%f=yO&hY2r#5Iu|5pEVW{_Z)`8SfuU_CB!f1@Dc9neAPR-R)m@yp3cR3IFxp;Dd+z zAveW@T^5EPT*7PKJH3!P`E=?(M}}mB?XvrXFDEDp&c8Hs$vgXX)xkR%PZkOFOjfY4 wI=W^u`vw8N&~^2aw%;TpS@E^0*-F#j-ky85}Sb4q9e0A90n^8f$< literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_undock_pressed.png b/src/ui/qdarkstyle/rc/window_undock_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..4ccf8a5400100d632d6bd41708ce37ec0352c514 GIT binary patch literal 523 zcmV+m0`&cfP){4i2J=xJbp+PAYu@7eNY+_7RFhL1RIOB5Lk&C@E>{Z4(>KVE^gn=H&d}J@?*2 zfd4LP^l~VA-eY!&T`qFgZWzT*P`<-vSt|04!$?N?pVU%&`?Va3dg&!&*B2qUk93o$YW4sC N002ovPDHLkV1oPC;6nfa literal 0 HcmV?d00001 diff --git a/src/ui/qdarkstyle/rc/window_undock_pressed@2x.png b/src/ui/qdarkstyle/rc/window_undock_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fba29fc99ad720a150aff2d7d88f9f90d4ba7f20 GIT binary patch literal 880 zcmV-$1CRWPP)5euiWVSpAdjcCj!(%x3{~0oW>UONu1`b4)ZPT3Sc4chCLw znk*GSD3LlYK;r-+GIbP^vB9x?GWx301W|8gE1rr8&`WIGiwA&+0L@s5bhOfhx>i6a zmOdc_W*`yZI#aU2C*4*;%>h{blkNQX_Xhxb8)9w!$k3LygXMcd&A*^sEDWIeE*=0P zE8hR3<^Wc9`=-Rrdp-AXR|CB0!r?twM-k8Gd@k7|-CM{IPNdo6V~6)<*~OJ%0?=(h zHzokx26STr&}~3Bz7L>kBNVmJZ%?R9^@ZiT9l}@ zCOo^gaBunyF~%9#q1uQG^EUWGJ{f&i%a^Kjf{sqL;w@msQ$t`p*L3j!&>=u?!@a3K zl_IVISc!+{nP^a@@EQq#X*iTf9abga2w-<#Y9AAisuHY&fB-!SU3|1nMR7*}%gb~F z3?*U`bcojCH5G;3Zh=!OgybP5zT5)XsBd|d_^SDZ2yx(m3M0UBClk$hNvlw;Ie_d~ zw@jl`5i33cproR-C%$imO#r$L=*9$~+kkFN0J;t6#sr|-fNo3xx((>Y1fbi1Zt6K7 zpo{(0-uSM8rSbv4t$?}m0bd2cL{sHsehMHXT3ScS2b*aRkfCIQV|kZz!+ux+B?5XY zofqEhE1>FO>CG6x>T&tt9~#b0T>j-X+3~8m0nb`he99$zIvZWoZ4bycTBH#$=$neV zZUMYjAtVa{Z&cKE1R(6vEdWIoV)a764+wEjMQuj_-^b(c!Pp3A16E(1ENAzK6n0UQHhsWh`f2EcSM$Tz> + + rc/arrow_down.png + rc/arrow_down@2x.png + rc/arrow_down_disabled.png + rc/arrow_down_disabled@2x.png + rc/arrow_down_focus.png + rc/arrow_down_focus@2x.png + rc/arrow_down_pressed.png + rc/arrow_down_pressed@2x.png + rc/arrow_left.png + rc/arrow_left@2x.png + rc/arrow_left_disabled.png + rc/arrow_left_disabled@2x.png + rc/arrow_left_focus.png + rc/arrow_left_focus@2x.png + rc/arrow_left_pressed.png + rc/arrow_left_pressed@2x.png + rc/arrow_right.png + rc/arrow_right@2x.png + rc/arrow_right_disabled.png + rc/arrow_right_disabled@2x.png + rc/arrow_right_focus.png + rc/arrow_right_focus@2x.png + rc/arrow_right_pressed.png + rc/arrow_right_pressed@2x.png + rc/arrow_up.png + rc/arrow_up@2x.png + rc/arrow_up_disabled.png + rc/arrow_up_disabled@2x.png + rc/arrow_up_focus.png + rc/arrow_up_focus@2x.png + rc/arrow_up_pressed.png + rc/arrow_up_pressed@2x.png + rc/base_icon.png + rc/base_icon@2x.png + rc/base_icon_disabled.png + rc/base_icon_disabled@2x.png + rc/base_icon_focus.png + rc/base_icon_focus@2x.png + rc/base_icon_pressed.png + rc/base_icon_pressed@2x.png + rc/branch_closed.png + rc/branch_closed@2x.png + rc/branch_closed_disabled.png + rc/branch_closed_disabled@2x.png + rc/branch_closed_focus.png + rc/branch_closed_focus@2x.png + rc/branch_closed_pressed.png + rc/branch_closed_pressed@2x.png + rc/branch_end.png + rc/branch_end@2x.png + rc/branch_end_disabled.png + rc/branch_end_disabled@2x.png + rc/branch_end_focus.png + rc/branch_end_focus@2x.png + rc/branch_end_pressed.png + rc/branch_end_pressed@2x.png + rc/branch_line.png + rc/branch_line@2x.png + rc/branch_line_disabled.png + rc/branch_line_disabled@2x.png + rc/branch_line_focus.png + rc/branch_line_focus@2x.png + rc/branch_line_pressed.png + rc/branch_line_pressed@2x.png + rc/branch_more.png + rc/branch_more@2x.png + rc/branch_more_disabled.png + rc/branch_more_disabled@2x.png + rc/branch_more_focus.png + rc/branch_more_focus@2x.png + rc/branch_more_pressed.png + rc/branch_more_pressed@2x.png + rc/branch_open.png + rc/branch_open@2x.png + rc/branch_open_disabled.png + rc/branch_open_disabled@2x.png + rc/branch_open_focus.png + rc/branch_open_focus@2x.png + rc/branch_open_pressed.png + rc/branch_open_pressed@2x.png + rc/checkbox_checked.png + rc/checkbox_checked@2x.png + rc/checkbox_checked_disabled.png + rc/checkbox_checked_disabled@2x.png + rc/checkbox_checked_focus.png + rc/checkbox_checked_focus@2x.png + rc/checkbox_checked_pressed.png + rc/checkbox_checked_pressed@2x.png + rc/checkbox_indeterminate.png + rc/checkbox_indeterminate@2x.png + rc/checkbox_indeterminate_disabled.png + rc/checkbox_indeterminate_disabled@2x.png + rc/checkbox_indeterminate_focus.png + rc/checkbox_indeterminate_focus@2x.png + rc/checkbox_indeterminate_pressed.png + rc/checkbox_indeterminate_pressed@2x.png + rc/checkbox_unchecked.png + rc/checkbox_unchecked@2x.png + rc/checkbox_unchecked_disabled.png + rc/checkbox_unchecked_disabled@2x.png + rc/checkbox_unchecked_focus.png + rc/checkbox_unchecked_focus@2x.png + rc/checkbox_unchecked_pressed.png + rc/checkbox_unchecked_pressed@2x.png + rc/line_horizontal.png + rc/line_horizontal@2x.png + rc/line_horizontal_disabled.png + rc/line_horizontal_disabled@2x.png + rc/line_horizontal_focus.png + rc/line_horizontal_focus@2x.png + rc/line_horizontal_pressed.png + rc/line_horizontal_pressed@2x.png + rc/line_vertical.png + rc/line_vertical@2x.png + rc/line_vertical_disabled.png + rc/line_vertical_disabled@2x.png + rc/line_vertical_focus.png + rc/line_vertical_focus@2x.png + rc/line_vertical_pressed.png + rc/line_vertical_pressed@2x.png + rc/radio_checked.png + rc/radio_checked@2x.png + rc/radio_checked_disabled.png + rc/radio_checked_disabled@2x.png + rc/radio_checked_focus.png + rc/radio_checked_focus@2x.png + rc/radio_checked_pressed.png + rc/radio_checked_pressed@2x.png + rc/radio_unchecked.png + rc/radio_unchecked@2x.png + rc/radio_unchecked_disabled.png + rc/radio_unchecked_disabled@2x.png + rc/radio_unchecked_focus.png + rc/radio_unchecked_focus@2x.png + rc/radio_unchecked_pressed.png + rc/radio_unchecked_pressed@2x.png + rc/toolbar_move_horizontal.png + rc/toolbar_move_horizontal@2x.png + rc/toolbar_move_horizontal_disabled.png + rc/toolbar_move_horizontal_disabled@2x.png + rc/toolbar_move_horizontal_focus.png + rc/toolbar_move_horizontal_focus@2x.png + rc/toolbar_move_horizontal_pressed.png + rc/toolbar_move_horizontal_pressed@2x.png + rc/toolbar_move_vertical.png + rc/toolbar_move_vertical@2x.png + rc/toolbar_move_vertical_disabled.png + rc/toolbar_move_vertical_disabled@2x.png + rc/toolbar_move_vertical_focus.png + rc/toolbar_move_vertical_focus@2x.png + rc/toolbar_move_vertical_pressed.png + rc/toolbar_move_vertical_pressed@2x.png + rc/toolbar_separator_horizontal.png + rc/toolbar_separator_horizontal@2x.png + rc/toolbar_separator_horizontal_disabled.png + rc/toolbar_separator_horizontal_disabled@2x.png + rc/toolbar_separator_horizontal_focus.png + rc/toolbar_separator_horizontal_focus@2x.png + rc/toolbar_separator_horizontal_pressed.png + rc/toolbar_separator_horizontal_pressed@2x.png + rc/toolbar_separator_vertical.png + rc/toolbar_separator_vertical@2x.png + rc/toolbar_separator_vertical_disabled.png + rc/toolbar_separator_vertical_disabled@2x.png + rc/toolbar_separator_vertical_focus.png + rc/toolbar_separator_vertical_focus@2x.png + rc/toolbar_separator_vertical_pressed.png + rc/toolbar_separator_vertical_pressed@2x.png + rc/transparent.png + rc/transparent@2x.png + rc/transparent_disabled.png + rc/transparent_disabled@2x.png + rc/transparent_focus.png + rc/transparent_focus@2x.png + rc/transparent_pressed.png + rc/transparent_pressed@2x.png + rc/window_close.png + rc/window_close@2x.png + rc/window_close_disabled.png + rc/window_close_disabled@2x.png + rc/window_close_focus.png + rc/window_close_focus@2x.png + rc/window_close_pressed.png + rc/window_close_pressed@2x.png + rc/window_grip.png + rc/window_grip@2x.png + rc/window_grip_disabled.png + rc/window_grip_disabled@2x.png + rc/window_grip_focus.png + rc/window_grip_focus@2x.png + rc/window_grip_pressed.png + rc/window_grip_pressed@2x.png + rc/window_minimize.png + rc/window_minimize@2x.png + rc/window_minimize_disabled.png + rc/window_minimize_disabled@2x.png + rc/window_minimize_focus.png + rc/window_minimize_focus@2x.png + rc/window_minimize_pressed.png + rc/window_minimize_pressed@2x.png + rc/window_undock.png + rc/window_undock@2x.png + rc/window_undock_disabled.png + rc/window_undock_disabled@2x.png + rc/window_undock_focus.png + rc/window_undock_focus@2x.png + rc/window_undock_pressed.png + rc/window_undock_pressed@2x.png + + + style.qss + + diff --git a/src/ui/qdarkstyle/style.qss b/src/ui/qdarkstyle/style.qss new file mode 100644 index 0000000..4605041 --- /dev/null +++ b/src/ui/qdarkstyle/style.qss @@ -0,0 +1,2195 @@ +/* QDarkStyleSheet ----------------------------------------------------------- + +This is the main style sheet, the palette has nine colors. + +It is based on three selecting colors, three greyish (background) colors +plus three whitish (foreground) colors. Each set of widgets of the same +type have a header like this: + + ------------------ + GroupName -------- + ------------------ + +And each widget is separated with a header like this: + + QWidgetName ------ + +This makes more easy to find and change some css field. The basic +configuration is described bellow. + + BACKGROUND ----------- + + Light (unpressed) + Normal (border, disabled, pressed, checked, toolbars, menus) + Dark (background) + + FOREGROUND ----------- + + Light (texts/labels) + Normal (not used yet) + Dark (disabled texts) + + SELECTION ------------ + + Light (selection/hover/active) + Normal (selected) + Dark (selected disabled) + +If a stranger configuration is required because of a bugfix or anything +else, keep the comment on the line above so nobody changes it, including the +issue number. + +*/ +/* + +See Qt documentation: + + - https://doc.qt.io/qt-5/stylesheet.html + - https://doc.qt.io/qt-5/stylesheet-reference.html + - https://doc.qt.io/qt-5/stylesheet-examples.html + +--------------------------------------------------------------------------- */ +/* QWidget ---------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QWidget { + background-color: #19232D; + border: 0px solid #32414B; + padding: 0px; + color: #F0F0F0; + selection-background-color: #1464A0; + selection-color: #F0F0F0; +} + +QWidget:disabled { + background-color: #19232D; + color: #787878; + selection-background-color: #14506E; + selection-color: #787878; +} + +QWidget::item:selected { + background-color: #1464A0; +} + +QWidget::item:hover { + background-color: #148CD2; + color: #32414B; +} + +/* QMainWindow ------------------------------------------------------------ + +This adjusts the splitter in the dock widget, not qsplitter +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmainwindow + +--------------------------------------------------------------------------- */ +QMainWindow::separator { + background-color: #32414B; + border: 0px solid #19232D; + spacing: 0px; + padding: 2px; +} + +QMainWindow::separator:hover { + background-color: #505F69; + border: 0px solid #148CD2; +} + +QMainWindow::separator:horizontal { + width: 5px; + margin-top: 2px; + margin-bottom: 2px; + image: url(":/qss_icons/rc/toolbar_separator_vertical.png"); +} + +QMainWindow::separator:vertical { + height: 5px; + margin-left: 2px; + margin-right: 2px; + image: url(":/qss_icons/rc/toolbar_separator_horizontal.png"); +} + +/* QToolTip --------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtooltip + +--------------------------------------------------------------------------- */ +QToolTip { + background-color: #148CD2; + border: 1px solid #19232D; + color: #19232D; + /* Remove padding, for fix combo box tooltip */ + padding: 0px; + /* Remove opacity, fix #174 - may need to use RGBA */ +} + +/* QStatusBar ------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qstatusbar + +--------------------------------------------------------------------------- */ +QStatusBar { + border: 1px solid #32414B; + /* Fixes Spyder #9120, #9121 */ + background: #32414B; + /* Fixes #205, white vertical borders separating items */ +} + +QStatusBar::item { + border: none; +} + +QStatusBar QToolTip { + background-color: #148CD2; + border: 1px solid #19232D; + color: #19232D; + /* Remove padding, for fix combo box tooltip */ + padding: 0px; + /* Reducing transparency to read better */ + opacity: 230; +} + +QStatusBar QLabel { + /* Fixes Spyder #9120, #9121 */ + background: transparent; +} + +/* QCheckBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcheckbox + +--------------------------------------------------------------------------- */ +QCheckBox { + background-color: #19232D; + color: #F0F0F0; + spacing: 4px; + outline: none; + padding-top: 4px; + padding-bottom: 4px; +} + +QCheckBox:focus { + border: none; +} + +QCheckBox QWidget:disabled { + background-color: #19232D; + color: #787878; +} + +QCheckBox::indicator { + margin-left: 4px; + height: 16px; + width: 16px; +} + +QCheckBox::indicator:unchecked { + image: url(":/qss_icons/rc/checkbox_unchecked.png"); +} + +QCheckBox::indicator:unchecked:hover, QCheckBox::indicator:unchecked:focus, QCheckBox::indicator:unchecked:pressed { + border: none; + image: url(":/qss_icons/rc/checkbox_unchecked_focus.png"); +} + +QCheckBox::indicator:unchecked:disabled { + image: url(":/qss_icons/rc/checkbox_unchecked_disabled.png"); +} + +QCheckBox::indicator:checked { + image: url(":/qss_icons/rc/checkbox_checked.png"); +} + +QCheckBox::indicator:checked:hover, QCheckBox::indicator:checked:focus, QCheckBox::indicator:checked:pressed { + border: none; + image: url(":/qss_icons/rc/checkbox_checked_focus.png"); +} + +QCheckBox::indicator:checked:disabled { + image: url(":/qss_icons/rc/checkbox_checked_disabled.png"); +} + +QCheckBox::indicator:indeterminate { + image: url(":/qss_icons/rc/checkbox_indeterminate.png"); +} + +QCheckBox::indicator:indeterminate:disabled { + image: url(":/qss_icons/rc/checkbox_indeterminate_disabled.png"); +} + +QCheckBox::indicator:indeterminate:focus, QCheckBox::indicator:indeterminate:hover, QCheckBox::indicator:indeterminate:pressed { + image: url(":/qss_icons/rc/checkbox_indeterminate_focus.png"); +} + +/* QGroupBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qgroupbox + +--------------------------------------------------------------------------- */ +QGroupBox { + font-weight: bold; + border: 1px solid #32414B; + border-radius: 4px; + padding: 4px; + margin-top: 16px; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + left: 3px; + padding-left: 3px; + padding-right: 5px; + padding-top: 8px; + padding-bottom: 16px; +} + +QGroupBox::indicator { + margin-left: 2px; + height: 12px; + width: 12px; +} + +QGroupBox::indicator:unchecked:hover, QGroupBox::indicator:unchecked:focus, QGroupBox::indicator:unchecked:pressed { + border: none; + image: url(":/qss_icons/rc/checkbox_unchecked_focus.png"); +} + +QGroupBox::indicator:unchecked:disabled { + image: url(":/qss_icons/rc/checkbox_unchecked_disabled.png"); +} + +QGroupBox::indicator:checked:hover, QGroupBox::indicator:checked:focus, QGroupBox::indicator:checked:pressed { + border: none; + image: url(":/qss_icons/rc/checkbox_checked_focus.png"); +} + +QGroupBox::indicator:checked:disabled { + image: url(":/qss_icons/rc/checkbox_checked_disabled.png"); +} + +/* QRadioButton ----------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qradiobutton + +--------------------------------------------------------------------------- */ +QRadioButton { + background-color: #19232D; + color: #F0F0F0; + spacing: 4px; + padding: 0px; + border: none; + outline: none; +} + +QRadioButton:focus { + border: none; +} + +QRadioButton:disabled { + background-color: #19232D; + color: #787878; + border: none; + outline: none; +} + +QRadioButton QWidget { + background-color: #19232D; + color: #F0F0F0; + spacing: 0px; + padding: 0px; + outline: none; + border: none; +} + +QRadioButton::indicator { + border: none; + outline: none; + margin-left: 4px; + height: 16px; + width: 16px; +} + +QRadioButton::indicator:unchecked { + image: url(":/qss_icons/rc/radio_unchecked.png"); +} + +QRadioButton::indicator:unchecked:hover, QRadioButton::indicator:unchecked:focus, QRadioButton::indicator:unchecked:pressed { + border: none; + outline: none; + image: url(":/qss_icons/rc/radio_unchecked_focus.png"); +} + +QRadioButton::indicator:unchecked:disabled { + image: url(":/qss_icons/rc/radio_unchecked_disabled.png"); +} + +QRadioButton::indicator:checked { + border: none; + outline: none; + image: url(":/qss_icons/rc/radio_checked.png"); +} + +QRadioButton::indicator:checked:hover, QRadioButton::indicator:checked:focus, QRadioButton::indicator:checked:pressed { + border: none; + outline: none; + image: url(":/qss_icons/rc/radio_checked_focus.png"); +} + +QRadioButton::indicator:checked:disabled { + outline: none; + image: url(":/qss_icons/rc/radio_checked_disabled.png"); +} + +/* QMenuBar --------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmenubar + +--------------------------------------------------------------------------- */ +QMenuBar { + background-color: #32414B; + padding: 2px; + border: 1px solid #19232D; + color: #F0F0F0; +} + +QMenuBar:focus { + border: 1px solid #148CD2; +} + +QMenuBar::item { + background: transparent; + padding: 4px; +} + +QMenuBar::item:selected { + padding: 4px; + background: transparent; + border: 0px solid #32414B; +} + +QMenuBar::item:pressed { + padding: 4px; + border: 0px solid #32414B; + background-color: #148CD2; + color: #F0F0F0; + margin-bottom: 0px; + padding-bottom: 0px; +} + +/* QMenu ------------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmenu + +--------------------------------------------------------------------------- */ +QMenu { + border: 0px solid #32414B; + color: #F0F0F0; + margin: 0px; +} + +QMenu::separator { + height: 1px; + background-color: #505F69; + color: #F0F0F0; +} + +QMenu::icon { + margin: 0px; + padding-left: 8px; +} + +QMenu::item { + background-color: #32414B; + padding: 4px 24px 4px 24px; + /* Reserve space for selection border */ + border: 1px transparent #32414B; +} + +QMenu::item:selected { + color: #F0F0F0; +} + +QMenu::indicator { + width: 12px; + height: 12px; + padding-left: 6px; + /* non-exclusive indicator = check box style indicator (see QActionGroup::setExclusive) */ + /* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */ +} + +QMenu::indicator:non-exclusive:unchecked { + image: url(":/qss_icons/rc/checkbox_unchecked.png"); +} + +QMenu::indicator:non-exclusive:unchecked:selected { + image: url(":/qss_icons/rc/checkbox_unchecked_disabled.png"); +} + +QMenu::indicator:non-exclusive:checked { + image: url(":/qss_icons/rc/checkbox_checked.png"); +} + +QMenu::indicator:non-exclusive:checked:selected { + image: url(":/qss_icons/rc/checkbox_checked_disabled.png"); +} + +QMenu::indicator:exclusive:unchecked { + image: url(":/qss_icons/rc/radio_unchecked.png"); +} + +QMenu::indicator:exclusive:unchecked:selected { + image: url(":/qss_icons/rc/radio_unchecked_disabled.png"); +} + +QMenu::indicator:exclusive:checked { + image: url(":/qss_icons/rc/radio_checked.png"); +} + +QMenu::indicator:exclusive:checked:selected { + image: url(":/qss_icons/rc/radio_checked_disabled.png"); +} + +QMenu::right-arrow { + margin: 5px; + image: url(":/qss_icons/rc/arrow_right.png"); + height: 12px; + width: 12px; +} + +/* QAbstractItemView ------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcombobox + +--------------------------------------------------------------------------- */ +QAbstractItemView { + alternate-background-color: #19232D; + color: #F0F0F0; + border: 1px solid #32414B; + border-radius: 4px; +} + +QAbstractItemView QLineEdit { + padding: 2px; +} + +/* QAbstractScrollArea ---------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qabstractscrollarea + +--------------------------------------------------------------------------- */ +QAbstractScrollArea { + background-color: #19232D; + border: 1px solid #32414B; + border-radius: 4px; + padding: 2px; + /* fix #159 */ + min-height: 1.25em; + /* fix #159 */ + color: #F0F0F0; +} + +QAbstractScrollArea:disabled { + color: #787878; +} + +/* QScrollArea ------------------------------------------------------------ + +--------------------------------------------------------------------------- */ +QScrollArea QWidget QWidget:disabled { + background-color: #19232D; +} + +/* QScrollBar ------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qscrollbar + +--------------------------------------------------------------------------- */ +QScrollBar:horizontal { + height: 16px; + margin: 2px 16px 2px 16px; + border: 1px solid #32414B; + border-radius: 4px; + background-color: #19232D; +} + +QScrollBar:vertical { + background-color: #19232D; + width: 16px; + margin: 16px 2px 16px 2px; + border: 1px solid #32414B; + border-radius: 4px; +} + +QScrollBar::handle:horizontal { + background-color: #787878; + border: 1px solid #32414B; + border-radius: 4px; + min-width: 8px; +} + +QScrollBar::handle:horizontal:hover { + background-color: #148CD2; + border: 1px solid #148CD2; + border-radius: 4px; + min-width: 8px; +} + +QScrollBar::handle:horizontal:focus { + border: 1px solid #1464A0; +} + +QScrollBar::handle:vertical { + background-color: #787878; + border: 1px solid #32414B; + min-height: 8px; + border-radius: 4px; +} + +QScrollBar::handle:vertical:hover { + background-color: #148CD2; + border: 1px solid #148CD2; + border-radius: 4px; + min-height: 8px; +} + +QScrollBar::handle:vertical:focus { + border: 1px solid #1464A0; +} + +QScrollBar::add-line:horizontal { + margin: 0px 0px 0px 0px; + border-image: url(":/qss_icons/rc/arrow_right_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal:hover, QScrollBar::add-line:horizontal:on { + border-image: url(":/qss_icons/rc/arrow_right.png"); + height: 12px; + width: 12px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical { + margin: 3px 0px 3px 0px; + border-image: url(":/qss_icons/rc/arrow_down_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on { + border-image: url(":/qss_icons/rc/arrow_down.png"); + height: 12px; + width: 12px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal { + margin: 0px 3px 0px 3px; + border-image: url(":/qss_icons/rc/arrow_left_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on { + border-image: url(":/qss_icons/rc/arrow_left.png"); + height: 12px; + width: 12px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical { + margin: 3px 0px 3px 0px; + border-image: url(":/qss_icons/rc/arrow_up_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical:hover, QScrollBar::sub-line:vertical:on { + border-image: url(":/qss_icons/rc/arrow_up.png"); + height: 12px; + width: 12px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal { + background: none; +} + +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { + background: none; +} + +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { + background: none; +} + +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { + background: none; +} + +/* QTextEdit -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-specific-widgets + +--------------------------------------------------------------------------- */ +QTextEdit { + background-color: #19232D; + color: #F0F0F0; + border-radius: 4px; + border: 1px solid #32414B; +} + +QTextEdit:hover { + border: 1px solid #148CD2; + color: #F0F0F0; +} + +QTextEdit:focus { + border: 1px solid #1464A0; +} + +QTextEdit:selected { + background: #1464A0; + color: #32414B; +} + +/* QPlainTextEdit --------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QPlainTextEdit { + background-color: #19232D; + color: #F0F0F0; + border-radius: 4px; + border: 1px solid #32414B; +} + +QPlainTextEdit:hover { + border: 1px solid #148CD2; + color: #F0F0F0; +} + +QPlainTextEdit:focus { + border: 1px solid #1464A0; +} + +QPlainTextEdit:selected { + background: #1464A0; + color: #32414B; +} + +/* QSizeGrip -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qsizegrip + +--------------------------------------------------------------------------- */ +QSizeGrip { + background: transparent; + width: 12px; + height: 12px; + image: url(":/qss_icons/rc/window_grip.png"); +} + +/* QStackedWidget --------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QStackedWidget { + padding: 2px; + border: 1px solid #32414B; + border: 1px solid #19232D; +} + +/* QToolBar --------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbar + +--------------------------------------------------------------------------- */ +QToolBar { + background-color: #32414B; + border-bottom: 1px solid #19232D; + padding: 2px; + font-weight: bold; + spacing: 2px; +} + +QToolBar QToolButton { + background-color: #32414B; + border: 1px solid #32414B; +} + +QToolBar QToolButton:hover { + border: 1px solid #148CD2; +} + +QToolBar QToolButton:checked { + border: 1px solid #19232D; + background-color: #19232D; +} + +QToolBar QToolButton:checked:hover { + border: 1px solid #148CD2; +} + +QToolBar::handle:horizontal { + width: 16px; + image: url(":/qss_icons/rc/toolbar_move_horizontal.png"); +} + +QToolBar::handle:vertical { + height: 16px; + image: url(":/qss_icons/rc/toolbar_move_vertical.png"); +} + +QToolBar::separator:horizontal { + width: 16px; + image: url(":/qss_icons/rc/toolbar_separator_horizontal.png"); +} + +QToolBar::separator:vertical { + height: 16px; + image: url(":/qss_icons/rc/toolbar_separator_vertical.png"); +} + +QToolButton#qt_toolbar_ext_button { + background: #32414B; + border: 0px; + color: #F0F0F0; + image: url(":/qss_icons/rc/arrow_right.png"); +} + +/* QAbstractSpinBox ------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QAbstractSpinBox { + background-color: #19232D; + border: 1px solid #32414B; + color: #F0F0F0; + /* This fixes 103, 111 */ + padding-top: 2px; + /* This fixes 103, 111 */ + padding-bottom: 2px; + padding-left: 4px; + padding-right: 4px; + border-radius: 4px; + /* min-width: 5px; removed to fix 109 */ +} + +QAbstractSpinBox:up-button { + background-color: transparent #19232D; + subcontrol-origin: border; + subcontrol-position: top right; + border-left: 1px solid #32414B; + border-bottom: 1px solid #32414B; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin: 1px; + width: 12px; + margin-bottom: -1px; +} + +QAbstractSpinBox::up-arrow, QAbstractSpinBox::up-arrow:disabled, QAbstractSpinBox::up-arrow:off { + image: url(":/qss_icons/rc/arrow_up_disabled.png"); + height: 8px; + width: 8px; +} + +QAbstractSpinBox::up-arrow:hover { + image: url(":/qss_icons/rc/arrow_up.png"); +} + +QAbstractSpinBox:down-button { + background-color: transparent #19232D; + subcontrol-origin: border; + subcontrol-position: bottom right; + border-left: 1px solid #32414B; + border-top: 1px solid #32414B; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin: 1px; + width: 12px; + margin-top: -1px; +} + +QAbstractSpinBox::down-arrow, QAbstractSpinBox::down-arrow:disabled, QAbstractSpinBox::down-arrow:off { + image: url(":/qss_icons/rc/arrow_down_disabled.png"); + height: 8px; + width: 8px; +} + +QAbstractSpinBox::down-arrow:hover { + image: url(":/qss_icons/rc/arrow_down.png"); +} + +QAbstractSpinBox:hover { + border: 1px solid #148CD2; + color: #F0F0F0; +} + +QAbstractSpinBox:focus { + border: 1px solid #1464A0; +} + +QAbstractSpinBox:selected { + background: #1464A0; + color: #32414B; +} + +/* ------------------------------------------------------------------------ */ +/* DISPLAYS --------------------------------------------------------------- */ +/* ------------------------------------------------------------------------ */ +/* QLabel ----------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qframe + +--------------------------------------------------------------------------- */ +QLabel { + background-color: #19232D; + border: 0px solid #32414B; + padding: 2px; + margin: 0px; + color: #F0F0F0; +} + +QLabel:disabled { + background-color: #19232D; + border: 0px solid #32414B; + color: #787878; +} + +/* QTextBrowser ----------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qabstractscrollarea + +--------------------------------------------------------------------------- */ +QTextBrowser { + background-color: #19232D; + border: 1px solid #32414B; + color: #F0F0F0; + border-radius: 4px; +} + +QTextBrowser:disabled { + background-color: #19232D; + border: 1px solid #32414B; + color: #787878; + border-radius: 4px; +} + +QTextBrowser:hover, QTextBrowser:!hover, QTextBrowser:selected, QTextBrowser:pressed { + border: 1px solid #32414B; +} + +/* QGraphicsView ---------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QGraphicsView { + background-color: #19232D; + border: 1px solid #32414B; + color: #F0F0F0; + border-radius: 4px; +} + +QGraphicsView:disabled { + background-color: #19232D; + border: 1px solid #32414B; + color: #787878; + border-radius: 4px; +} + +QGraphicsView:hover, QGraphicsView:!hover, QGraphicsView:selected, QGraphicsView:pressed { + border: 1px solid #32414B; +} + +/* QCalendarWidget -------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QCalendarWidget { + border: 1px solid #32414B; + border-radius: 4px; +} + +QCalendarWidget:disabled { + background-color: #19232D; + color: #787878; +} + +/* QLCDNumber ------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QLCDNumber { + background-color: #19232D; + color: #F0F0F0; +} + +QLCDNumber:disabled { + background-color: #19232D; + color: #787878; +} + +/* QProgressBar ----------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qprogressbar + +--------------------------------------------------------------------------- */ +QProgressBar { + background-color: #19232D; + border: 1px solid #32414B; + color: #F0F0F0; + border-radius: 4px; + text-align: center; +} + +QProgressBar:disabled { + background-color: #19232D; + border: 1px solid #32414B; + color: #787878; + border-radius: 4px; + text-align: center; +} + +QProgressBar::chunk { + background-color: #1464A0; + color: #19232D; + border-radius: 4px; +} + +QProgressBar::chunk:disabled { + background-color: #14506E; + color: #787878; + border-radius: 4px; +} + +/* ------------------------------------------------------------------------ */ +/* BUTTONS ---------------------------------------------------------------- */ +/* ------------------------------------------------------------------------ */ +/* QPushButton ------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qpushbutton + +--------------------------------------------------------------------------- */ +QPushButton { + background-color: #505F69; + border: 1px solid #32414B; + color: #F0F0F0; + border-radius: 4px; + padding: 3px; + outline: none; + /* Issue #194 - Special case of QPushButton inside dialogs, for better UI */ + min-width: 80px; +} + +QPushButton:disabled { + background-color: #32414B; + border: 1px solid #32414B; + color: #787878; + border-radius: 4px; + padding: 3px; +} + +QPushButton:checked { + background-color: #32414B; + border: 1px solid #32414B; + border-radius: 4px; + padding: 3px; + outline: none; +} + +QPushButton:checked:disabled { + background-color: #19232D; + border: 1px solid #32414B; + color: #787878; + border-radius: 4px; + padding: 3px; + outline: none; +} + +QPushButton:checked:selected { + background: #1464A0; + color: #32414B; +} + +QPushButton::menu-indicator { + subcontrol-origin: padding; + subcontrol-position: bottom right; + bottom: 4px; +} + +QPushButton:pressed { + background-color: #19232D; + border: 1px solid #19232D; +} + +QPushButton:pressed:hover { + border: 1px solid #148CD2; +} + +QPushButton:hover { + border: 1px solid #148CD2; + color: #F0F0F0; +} + +QPushButton:selected { + background: #1464A0; + color: #32414B; +} + +QPushButton:hover { + border: 1px solid #148CD2; + color: #F0F0F0; +} + +QPushButton:focus { + border: 1px solid #1464A0; +} + +/* QToolButton ------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbutton + +--------------------------------------------------------------------------- */ +QToolButton { + background-color: transparent; + border: 1px solid transparent; + border-radius: 4px; + margin: 0px; + padding: 2px; + /* The subcontrols below are used only in the DelayedPopup mode */ + /* The subcontrols below are used only in the MenuButtonPopup mode */ + /* The subcontrol below is used only in the InstantPopup or DelayedPopup mode */ +} + +QToolButton:checked { + background-color: transparent; + border: 1px solid #1464A0; +} + +QToolButton:checked:disabled { + border: 1px solid #14506E; +} + +QToolButton:pressed { + margin: 1px; + background-color: transparent; + border: 1px solid #1464A0; +} + +QToolButton:disabled { + border: none; +} + +QToolButton:hover { + border: 1px solid #148CD2; +} + +QToolButton[popupMode="0"] { + /* Only for DelayedPopup */ + padding-right: 2px; +} + +QToolButton[popupMode="1"] { + /* Only for MenuButtonPopup */ + padding-right: 20px; +} + +QToolButton[popupMode="1"]::menu-button { + border: none; +} + +QToolButton[popupMode="1"]::menu-button:hover { + border: none; + border-left: 1px solid #148CD2; + border-radius: 0; +} + +QToolButton[popupMode="2"] { + /* Only for InstantPopup */ + padding-right: 2px; +} + +QToolButton::menu-button { + padding: 2px; + border-radius: 4px; + border: 1px solid #32414B; + width: 12px; + outline: none; +} + +QToolButton::menu-button:hover { + border: 1px solid #148CD2; +} + +QToolButton::menu-button:checked:hover { + border: 1px solid #148CD2; +} + +QToolButton::menu-indicator { + image: url(":/qss_icons/rc/arrow_down.png"); + height: 8px; + width: 8px; + top: 0; + /* Exclude a shift for better image */ + left: -2px; + /* Shift it a bit */ +} + +QToolButton::menu-arrow { + image: url(":/qss_icons/rc/arrow_down.png"); + height: 8px; + width: 8px; +} + +QToolButton::menu-arrow:hover { + image: url(":/qss_icons/rc/arrow_down_focus.png"); +} + +/* QCommandLinkButton ----------------------------------------------------- + +--------------------------------------------------------------------------- */ +QCommandLinkButton { + background-color: transparent; + border: 1px solid #32414B; + color: #F0F0F0; + border-radius: 4px; + padding: 0px; + margin: 0px; +} + +QCommandLinkButton:disabled { + background-color: transparent; + color: #787878; +} + +/* ------------------------------------------------------------------------ */ +/* INPUTS - NO FIELDS ----------------------------------------------------- */ +/* ------------------------------------------------------------------------ */ +/* QComboBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcombobox + +--------------------------------------------------------------------------- */ +QComboBox { + border: 1px solid #32414B; + border-radius: 4px; + selection-background-color: #1464A0; + padding-left: 4px; + padding-right: 36px; + /* 4 + 16*2 See scrollbar size */ + /* Fixes #103, #111 */ + min-height: 1.5em; + /* padding-top: 2px; removed to fix #132 */ + /* padding-bottom: 2px; removed to fix #132 */ + /* min-width: 75px; removed to fix #109 */ + /* Needed to remove indicator - fix #132 */ +} + +QComboBox QAbstractItemView { + border: 1px solid #32414B; + border-radius: 0; + background-color: #19232D; + selection-background-color: #1464A0; +} + +QComboBox QAbstractItemView:hover { + background-color: #19232D; + color: #F0F0F0; +} + +QComboBox QAbstractItemView:selected { + background: #1464A0; + color: #32414B; +} + +QComboBox QAbstractItemView:alternate { + background: #19232D; +} + +QComboBox:disabled { + background-color: #19232D; + color: #787878; +} + +QComboBox:hover { + border: 1px solid #148CD2; +} + +QComboBox:focus { + border: 1px solid #1464A0; +} + +QComboBox:on { + selection-background-color: #1464A0; +} + +QComboBox::indicator { + border: none; + border-radius: 0; + background-color: transparent; + selection-background-color: transparent; + color: transparent; + selection-color: transparent; + /* Needed to remove indicator - fix #132 */ +} + +QComboBox::indicator:alternate { + background: #19232D; +} + +QComboBox::item:alternate { + background: #19232D; +} + +QComboBox::item:checked { + font-weight: bold; +} + +QComboBox::item:selected { + border: 0px solid transparent; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 12px; + border-left: 1px solid #32414B; +} + +QComboBox::down-arrow { + image: url(":/qss_icons/rc/arrow_down_disabled.png"); + height: 8px; + width: 8px; +} + +QComboBox::down-arrow:on, QComboBox::down-arrow:hover, QComboBox::down-arrow:focus { + image: url(":/qss_icons/rc/arrow_down.png"); +} + +/* QSlider ---------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qslider + +--------------------------------------------------------------------------- */ +QSlider:disabled { + background: #19232D; +} + +QSlider:focus { + border: none; +} + +QSlider::groove:horizontal { + background: #32414B; + border: 1px solid #32414B; + height: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::groove:vertical { + background: #32414B; + border: 1px solid #32414B; + width: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::add-page:vertical { + background: #1464A0; + border: 1px solid #32414B; + width: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::add-page:vertical :disabled { + background: #14506E; +} + +QSlider::sub-page:horizontal { + background: #1464A0; + border: 1px solid #32414B; + height: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::sub-page:horizontal:disabled { + background: #14506E; +} + +QSlider::handle:horizontal { + background: #787878; + border: 1px solid #32414B; + width: 8px; + height: 8px; + margin: -8px 0px; + border-radius: 4px; +} + +QSlider::handle:horizontal:hover { + background: #148CD2; + border: 1px solid #148CD2; +} + +QSlider::handle:horizontal:focus { + border: 1px solid #1464A0; +} + +QSlider::handle:vertical { + background: #787878; + border: 1px solid #32414B; + width: 8px; + height: 8px; + margin: 0 -8px; + border-radius: 4px; +} + +QSlider::handle:vertical:hover { + background: #148CD2; + border: 1px solid #148CD2; +} + +QSlider::handle:vertical:focus { + border: 1px solid #1464A0; +} + +/* QLineEdit -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qlineedit + +--------------------------------------------------------------------------- */ +QLineEdit { + background-color: #19232D; + padding-top: 2px; + /* This QLineEdit fix 103, 111 */ + padding-bottom: 2px; + /* This QLineEdit fix 103, 111 */ + padding-left: 4px; + padding-right: 4px; + border-style: solid; + border: 1px solid #32414B; + border-radius: 4px; + color: #F0F0F0; +} + +QLineEdit:disabled { + background-color: #19232D; + color: #787878; +} + +QLineEdit:hover { + border: 1px solid #148CD2; + color: #F0F0F0; +} + +QLineEdit:focus { + border: 1px solid #1464A0; +} + +QLineEdit:selected { + background-color: #1464A0; + color: #32414B; +} + +/* QTabWiget -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtabwidget-and-qtabbar + +--------------------------------------------------------------------------- */ +QTabWidget { + padding: 2px; + selection-background-color: #32414B; +} + +QTabWidget QWidget { + /* Fixes #189 */ + border-radius: 4px; +} + +QTabWidget::pane { + border: 1px solid #32414B; + border-radius: 4px; + margin: 0px; + /* Fixes double border inside pane with pyqt5 */ + padding: 0px; +} + +QTabWidget::pane:selected { + background-color: #32414B; + border: 1px solid #1464A0; +} + +/* QTabBar ---------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtabwidget-and-qtabbar + +--------------------------------------------------------------------------- */ +QTabBar { + qproperty-drawBase: 0; + border-radius: 4px; + margin: 0px; + padding: 2px; + border: 0; + /* left: 5px; move to the right by 5px - removed for fix */ +} + +QTabBar::close-button { + border: 0; + margin: 2px; + padding: 2px; + image: url(":/qss_icons/rc/window_close.png"); +} + +QTabBar::close-button:hover { + image: url(":/qss_icons/rc/window_close_focus.png"); +} + +QTabBar::close-button:pressed { + image: url(":/qss_icons/rc/window_close_pressed.png"); +} + +/* QTabBar::tab - selected ------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtabwidget-and-qtabbar + +--------------------------------------------------------------------------- */ +QTabBar::tab { + /* !selected and disabled ----------------------------------------- */ + /* selected ------------------------------------------------------- */ +} + +QTabBar::tab:top:selected:disabled { + border-bottom: 3px solid #14506E; + color: #787878; + background-color: #32414B; +} + +QTabBar::tab:bottom:selected:disabled { + border-top: 3px solid #14506E; + color: #787878; + background-color: #32414B; +} + +QTabBar::tab:left:selected:disabled { + border-right: 3px solid #14506E; + color: #787878; + background-color: #32414B; +} + +QTabBar::tab:right:selected:disabled { + border-left: 3px solid #14506E; + color: #787878; + background-color: #32414B; +} + +QTabBar::tab:top:!selected:disabled { + border-bottom: 3px solid #19232D; + color: #787878; + background-color: #19232D; +} + +QTabBar::tab:bottom:!selected:disabled { + border-top: 3px solid #19232D; + color: #787878; + background-color: #19232D; +} + +QTabBar::tab:left:!selected:disabled { + border-right: 3px solid #19232D; + color: #787878; + background-color: #19232D; +} + +QTabBar::tab:right:!selected:disabled { + border-left: 3px solid #19232D; + color: #787878; + background-color: #19232D; +} + +QTabBar::tab:top:!selected { + border-bottom: 2px solid #19232D; + margin-top: 2px; +} + +QTabBar::tab:bottom:!selected { + border-top: 2px solid #19232D; + margin-bottom: 3px; +} + +QTabBar::tab:left:!selected { + border-left: 2px solid #19232D; + margin-right: 2px; +} + +QTabBar::tab:right:!selected { + border-right: 2px solid #19232D; + margin-left: 2px; +} + +QTabBar::tab:top { + background-color: #32414B; + color: #F0F0F0; + margin-left: 2px; + padding-left: 4px; + padding-right: 4px; + padding-top: 2px; + padding-bottom: 2px; + min-width: 5px; + border-bottom: 3px solid #32414B; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} + +QTabBar::tab:top:selected { + background-color: #505F69; + color: #F0F0F0; + border-bottom: 3px solid #1464A0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} + +QTabBar::tab:top:!selected:hover { + border: 1px solid #148CD2; + border-bottom: 3px solid #148CD2; + /* Fixes spyder-ide/spyder#9766 */ + padding-left: 4px; + padding-right: 4px; +} + +QTabBar::tab:bottom { + color: #F0F0F0; + border-top: 3px solid #32414B; + background-color: #32414B; + margin-left: 2px; + padding-left: 4px; + padding-right: 4px; + padding-top: 2px; + padding-bottom: 2px; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + min-width: 5px; +} + +QTabBar::tab:bottom:selected { + color: #F0F0F0; + background-color: #505F69; + border-top: 3px solid #1464A0; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} + +QTabBar::tab:bottom:!selected:hover { + border: 1px solid #148CD2; + border-top: 3px solid #148CD2; + /* Fixes spyder-ide/spyder#9766 */ + padding-left: 4px; + padding-right: 4px; +} + +QTabBar::tab:left { + color: #F0F0F0; + background-color: #32414B; + margin-top: 2px; + padding-left: 2px; + padding-right: 2px; + padding-top: 4px; + padding-bottom: 4px; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + min-height: 5px; +} + +QTabBar::tab:left:selected { + color: #F0F0F0; + background-color: #505F69; + border-right: 3px solid #1464A0; +} + +QTabBar::tab:left:!selected:hover { + border: 1px solid #148CD2; + border-right: 3px solid #148CD2; + padding: 0px; +} + +QTabBar::tab:right { + color: #F0F0F0; + background-color: #32414B; + margin-top: 2px; + padding-left: 2px; + padding-right: 2px; + padding-top: 4px; + padding-bottom: 4px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + min-height: 5px; +} + +QTabBar::tab:right:selected { + color: #F0F0F0; + background-color: #505F69; + border-left: 3px solid #1464A0; +} + +QTabBar::tab:right:!selected:hover { + border: 1px solid #148CD2; + border-left: 3px solid #148CD2; + padding: 0px; +} + +QTabBar QToolButton { + /* Fixes #136 */ + background-color: #32414B; + height: 12px; + width: 12px; +} + +QTabBar QToolButton:pressed { + background-color: #32414B; +} + +QTabBar QToolButton:pressed:hover { + border: 1px solid #148CD2; +} + +QTabBar QToolButton::left-arrow:enabled { + image: url(":/qss_icons/rc/arrow_left.png"); +} + +QTabBar QToolButton::left-arrow:disabled { + image: url(":/qss_icons/rc/arrow_left_disabled.png"); +} + +QTabBar QToolButton::right-arrow:enabled { + image: url(":/qss_icons/rc/arrow_right.png"); +} + +QTabBar QToolButton::right-arrow:disabled { + image: url(":/qss_icons/rc/arrow_right_disabled.png"); +} + +/* QDockWiget ------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QDockWidget { + outline: 1px solid #32414B; + background-color: #19232D; + border: 1px solid #32414B; + border-radius: 4px; + titlebar-close-icon: url(":/qss_icons/rc/window_close.png"); + titlebar-normal-icon: url(":/qss_icons/rc/window_undock.png"); +} + +QDockWidget::title { + /* Better size for title bar */ + padding: 6px; + spacing: 4px; + border: none; + background-color: #32414B; +} + +QDockWidget::close-button { + background-color: #32414B; + border-radius: 4px; + border: none; +} + +QDockWidget::close-button:hover { + image: url(":/qss_icons/rc/window_close_focus.png"); +} + +QDockWidget::close-button:pressed { + image: url(":/qss_icons/rc/window_close_pressed.png"); +} + +QDockWidget::float-button { + background-color: #32414B; + border-radius: 4px; + border: none; +} + +QDockWidget::float-button:hover { + image: url(":/qss_icons/rc/window_undock_focus.png"); +} + +QDockWidget::float-button:pressed { + image: url(":/qss_icons/rc/window_undock_pressed.png"); +} + +/* QTreeView QListView QTableView ----------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtreeview +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qlistview +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtableview + +--------------------------------------------------------------------------- */ +QTreeView:branch:selected, QTreeView:branch:hover { + background: url(":/qss_icons/rc/transparent.png"); +} + +QTreeView:branch:has-siblings:!adjoins-item { + border-image: url(":/qss_icons/rc/branch_line.png") 0; +} + +QTreeView:branch:has-siblings:adjoins-item { + border-image: url(":/qss_icons/rc/branch_more.png") 0; +} + +QTreeView:branch:!has-children:!has-siblings:adjoins-item { + border-image: url(":/qss_icons/rc/branch_end.png") 0; +} + +QTreeView:branch:has-children:!has-siblings:closed, QTreeView:branch:closed:has-children:has-siblings { + border-image: none; + image: url(":/qss_icons/rc/branch_closed.png"); +} + +QTreeView:branch:open:has-children:!has-siblings, QTreeView:branch:open:has-children:has-siblings { + border-image: none; + image: url(":/qss_icons/rc/branch_open.png"); +} + +QTreeView:branch:has-children:!has-siblings:closed:hover, QTreeView:branch:closed:has-children:has-siblings:hover { + image: url(":/qss_icons/rc/branch_closed_focus.png"); +} + +QTreeView:branch:open:has-children:!has-siblings:hover, QTreeView:branch:open:has-children:has-siblings:hover { + image: url(":/qss_icons/rc/branch_open_focus.png"); +} + +QTreeView::indicator:checked, +QListView::indicator:checked { + image: url(":/qss_icons/rc/checkbox_checked.png"); +} + +QTreeView::indicator:checked:hover, QTreeView::indicator:checked:focus, QTreeView::indicator:checked:pressed, +QListView::indicator:checked:hover, +QListView::indicator:checked:focus, +QListView::indicator:checked:pressed { + image: url(":/qss_icons/rc/checkbox_checked_focus.png"); +} + +QTreeView::indicator:unchecked, +QListView::indicator:unchecked { + image: url(":/qss_icons/rc/checkbox_unchecked.png"); +} + +QTreeView::indicator:unchecked:hover, QTreeView::indicator:unchecked:focus, QTreeView::indicator:unchecked:pressed, +QListView::indicator:unchecked:hover, +QListView::indicator:unchecked:focus, +QListView::indicator:unchecked:pressed { + image: url(":/qss_icons/rc/checkbox_unchecked_focus.png"); +} + +QTreeView::indicator:indeterminate, +QListView::indicator:indeterminate { + image: url(":/qss_icons/rc/checkbox_indeterminate.png"); +} + +QTreeView::indicator:indeterminate:hover, QTreeView::indicator:indeterminate:focus, QTreeView::indicator:indeterminate:pressed, +QListView::indicator:indeterminate:hover, +QListView::indicator:indeterminate:focus, +QListView::indicator:indeterminate:pressed { + image: url(":/qss_icons/rc/checkbox_indeterminate_focus.png"); +} + +QTreeView, +QListView, +QTableView, +QColumnView { + background-color: #19232D; + border: 1px solid #32414B; + color: #F0F0F0; + gridline-color: #32414B; + border-radius: 4px; +} + +QTreeView:disabled, +QListView:disabled, +QTableView:disabled, +QColumnView:disabled { + background-color: #19232D; + color: #787878; +} + +QTreeView:selected, +QListView:selected, +QTableView:selected, +QColumnView:selected { + background-color: #1464A0; + color: #32414B; +} + +QTreeView:hover, +QListView:hover, +QTableView:hover, +QColumnView:hover { + background-color: #19232D; +} + +QTreeView::item:pressed, +QListView::item:pressed, +QTableView::item:pressed, +QColumnView::item:pressed { + color: #FFFFFF; + background-color: #1464A0; +} + +QTreeView::item:selected:hover, +QListView::item:selected:hover, +QTableView::item:selected:hover, +QColumnView::item:selected:hover { + background: #1464A0; + color: #FFFFFF; +} + +QTreeView::item:selected:active, +QListView::item:selected:active, +QTableView::item:selected:active, +QColumnView::item:selected:active { + color: #FFFFFF; + background-color: #1464A0; +} + +QTreeView::item:!selected:hover, +QListView::item:!selected:hover, +QTableView::item:!selected:hover, +QColumnView::item:!selected:hover { + outline: 0; + color: #FFFFFF; + background-color: #19232D; +} + +QTableCornerButton::section { + background-color: #19232D; + border: 1px transparent #32414B; + border-radius: 0px; +} + +/* QHeaderView ------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qheaderview + +--------------------------------------------------------------------------- */ +QHeaderView { + background-color: #32414B; + border: 0px transparent #32414B; + padding: 0px; + margin: 0px; + border-radius: 0px; +} + +QHeaderView:disabled { + background-color: #32414B; + border: 1px transparent #32414B; + padding: 2px; +} + +QHeaderView::section { + background-color: #32414B; + color: #F0F0F0; + padding: 2px; + border-radius: 0px; + text-align: left; +} + +QHeaderView::section:checked { + color: #F0F0F0; + background-color: #32414B; +} + +QHeaderView::section:checked:disabled { + color: #787878; + background-color: #14506E; +} + +QHeaderView::section::horizontal { + padding-left: 4px; + padding-right: 4px; + border-left: 1px solid #19232D; +} + +QHeaderView::section::horizontal::first, QHeaderView::section::horizontal::only-one { + border-left: 1px solid #32414B; +} + +QHeaderView::section::horizontal:disabled { + color: #787878; +} + +QHeaderView::section::vertical { + padding-left: 4px; + padding-right: 4px; + border-top: 1px solid #19232D; +} + +QHeaderView::section::vertical::first, QHeaderView::section::vertical::only-one { + border-top: 1px solid #32414B; +} + +QHeaderView::section::vertical:disabled { + color: #787878; +} + +QHeaderView::down-arrow { + /* Those settings (border/width/height/background-color) solve bug */ + /* transparent arrow background and size */ + background-color: #32414B; + border: none; + height: 12px; + width: 12px; + padding-left: 2px; + padding-right: 2px; + image: url(":/qss_icons/rc/arrow_down.png"); +} + +QHeaderView::up-arrow { + background-color: #32414B; + border: none; + height: 12px; + width: 12px; + padding-left: 2px; + padding-right: 2px; + image: url(":/qss_icons/rc/arrow_up.png"); +} + +/* QToolBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbox + +--------------------------------------------------------------------------- */ +QToolBox { + padding: 0px; + border: 0px; + border: 1px solid #32414B; +} + +QToolBox:selected { + padding: 0px; + border: 2px solid #1464A0; +} + +QToolBox::tab { + background-color: #19232D; + border: 1px solid #32414B; + color: #F0F0F0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +QToolBox::tab:disabled { + color: #787878; +} + +QToolBox::tab:selected { + background-color: #505F69; + border-bottom: 2px solid #1464A0; +} + +QToolBox::tab:selected:disabled { + background-color: #32414B; + border-bottom: 2px solid #14506E; +} + +QToolBox::tab:!selected { + background-color: #32414B; + border-bottom: 2px solid #32414B; +} + +QToolBox::tab:!selected:disabled { + background-color: #19232D; +} + +QToolBox::tab:hover { + border-color: #148CD2; + border-bottom: 2px solid #148CD2; +} + +QToolBox QScrollArea QWidget QWidget { + padding: 0px; + border: 0px; + background-color: #19232D; +} + +/* QFrame ----------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qframe +https://doc.qt.io/qt-5/qframe.html#-prop +https://doc.qt.io/qt-5/qframe.html#details +https://stackoverflow.com/questions/14581498/qt-stylesheet-for-hline-vline-color + +--------------------------------------------------------------------------- */ +/* (dot) .QFrame fix #141, #126, #123 */ +.QFrame { + border-radius: 4px; + border: 1px solid #32414B; + /* No frame */ + /* HLine */ + /* HLine */ +} + +.QFrame[frameShape="0"] { + border-radius: 4px; + border: 1px transparent #32414B; +} + +.QFrame[frameShape="4"] { + max-height: 2px; + border: none; + background-color: #32414B; +} + +.QFrame[frameShape="5"] { + max-width: 2px; + border: none; + background-color: #32414B; +} + +/* QSplitter -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qsplitter + +--------------------------------------------------------------------------- */ +QSplitter { + background-color: #32414B; + spacing: 0px; + padding: 0px; + margin: 0px; +} + +QSplitter::handle { + background-color: #32414B; + border: 0px solid #19232D; + spacing: 0px; + padding: 1px; + margin: 0px; +} + +QSplitter::handle:hover { + background-color: #787878; +} + +QSplitter::handle:horizontal { + width: 5px; + image: url(":/qss_icons/rc/line_vertical.png"); +} + +QSplitter::handle:vertical { + height: 5px; + image: url(":/qss_icons/rc/line_horizontal.png"); +} + +/* QDateEdit -------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QDateEdit { + selection-background-color: #1464A0; + border-style: solid; + border: 1px solid #32414B; + border-radius: 4px; + /* This fixes 103, 111 */ + padding-top: 2px; + /* This fixes 103, 111 */ + padding-bottom: 2px; + padding-left: 4px; + padding-right: 4px; + min-width: 10px; +} + +QDateEdit:on { + selection-background-color: #1464A0; +} + +QDateEdit::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 12px; + border-left: 1px solid #32414B; +} + +QDateEdit::down-arrow { + image: url(":/qss_icons/rc/arrow_down_disabled.png"); + height: 8px; + width: 8px; +} + +QDateEdit::down-arrow:on, QDateEdit::down-arrow:hover, QDateEdit::down-arrow:focus { + image: url(":/qss_icons/rc/arrow_down.png"); +} + +QDateEdit QAbstractItemView { + background-color: #19232D; + border-radius: 4px; + border: 1px solid #32414B; + selection-background-color: #1464A0; +} + +/* QAbstractView ---------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QAbstractView:hover { + border: 1px solid #148CD2; + color: #F0F0F0; +} + +QAbstractView:selected { + background: #1464A0; + color: #32414B; +} + +/* PlotWidget ------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +PlotWidget { + /* Fix cut labels in plots #134 */ + padding: 0px; +} + +/* fixes */ + +QComboBox::item:checked { + font-weight: bold; + max-height: 30px; +} + +QPushButton { + min-width: default; +} + +QPushButton:flat { + background-color: transparent; + border: none; +} + +/* GroupBox checkbox contrast */ + +QGroupBox::indicator:unchecked { + image: url(":/qss_icons/rc/checkbox_unchecked.png"); +} + +QGroupBox::indicator:checked { + image: url(":/qss_icons/rc/checkbox_checked.png"); +} + +QGroupBox::indicator:indeterminate { + image: url(":/qss_icons/rc/checkbox_indeterminate.png"); +} + +QGroupBox::indicator:indeterminate:disabled { + image: url(":/qss_icons/rc/checkbox_indeterminate_disabled.png"); +} + +QGroupBox::indicator:indeterminate:focus, QGroupBox::indicator:indeterminate:hover, QGroupBox::indicator:indeterminate:pressed { + image: url(":/qss_icons/rc/checkbox_indeterminate_focus.png"); +} diff --git a/src/ui/qdarkstyle/svg/arrow_down.svg b/src/ui/qdarkstyle/svg/arrow_down.svg new file mode 100644 index 0000000..301d663 --- /dev/null +++ b/src/ui/qdarkstyle/svg/arrow_down.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/arrow_left.svg b/src/ui/qdarkstyle/svg/arrow_left.svg new file mode 100644 index 0000000..1f7c290 --- /dev/null +++ b/src/ui/qdarkstyle/svg/arrow_left.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/arrow_right.svg b/src/ui/qdarkstyle/svg/arrow_right.svg new file mode 100644 index 0000000..03c6620 --- /dev/null +++ b/src/ui/qdarkstyle/svg/arrow_right.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/arrow_up.svg b/src/ui/qdarkstyle/svg/arrow_up.svg new file mode 100644 index 0000000..ccfa66b --- /dev/null +++ b/src/ui/qdarkstyle/svg/arrow_up.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/base_icon.svg b/src/ui/qdarkstyle/svg/base_icon.svg new file mode 100644 index 0000000..abf5d6b --- /dev/null +++ b/src/ui/qdarkstyle/svg/base_icon.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/base_palette.svg b/src/ui/qdarkstyle/svg/base_palette.svg new file mode 100644 index 0000000..317b2eb --- /dev/null +++ b/src/ui/qdarkstyle/svg/base_palette.svg @@ -0,0 +1,443 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/branch_closed.svg b/src/ui/qdarkstyle/svg/branch_closed.svg new file mode 100644 index 0000000..e7664f4 --- /dev/null +++ b/src/ui/qdarkstyle/svg/branch_closed.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/branch_end.svg b/src/ui/qdarkstyle/svg/branch_end.svg new file mode 100644 index 0000000..d35acd0 --- /dev/null +++ b/src/ui/qdarkstyle/svg/branch_end.svg @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/branch_line.svg b/src/ui/qdarkstyle/svg/branch_line.svg new file mode 100644 index 0000000..f327723 --- /dev/null +++ b/src/ui/qdarkstyle/svg/branch_line.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/branch_more.svg b/src/ui/qdarkstyle/svg/branch_more.svg new file mode 100644 index 0000000..f2bf317 --- /dev/null +++ b/src/ui/qdarkstyle/svg/branch_more.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/branch_open.svg b/src/ui/qdarkstyle/svg/branch_open.svg new file mode 100644 index 0000000..701cb60 --- /dev/null +++ b/src/ui/qdarkstyle/svg/branch_open.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/checkbox_checked.svg b/src/ui/qdarkstyle/svg/checkbox_checked.svg new file mode 100644 index 0000000..f8fb5dd --- /dev/null +++ b/src/ui/qdarkstyle/svg/checkbox_checked.svg @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/checkbox_indeterminate.svg b/src/ui/qdarkstyle/svg/checkbox_indeterminate.svg new file mode 100644 index 0000000..7c6bdf9 --- /dev/null +++ b/src/ui/qdarkstyle/svg/checkbox_indeterminate.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/checkbox_unchecked.svg b/src/ui/qdarkstyle/svg/checkbox_unchecked.svg new file mode 100644 index 0000000..cb17a25 --- /dev/null +++ b/src/ui/qdarkstyle/svg/checkbox_unchecked.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/line_horizontal.svg b/src/ui/qdarkstyle/svg/line_horizontal.svg new file mode 100644 index 0000000..f088e55 --- /dev/null +++ b/src/ui/qdarkstyle/svg/line_horizontal.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/line_vertical.svg b/src/ui/qdarkstyle/svg/line_vertical.svg new file mode 100644 index 0000000..7bed6cd --- /dev/null +++ b/src/ui/qdarkstyle/svg/line_vertical.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/radio_checked.svg b/src/ui/qdarkstyle/svg/radio_checked.svg new file mode 100644 index 0000000..0a0fd71 --- /dev/null +++ b/src/ui/qdarkstyle/svg/radio_checked.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/radio_unchecked.svg b/src/ui/qdarkstyle/svg/radio_unchecked.svg new file mode 100644 index 0000000..f1ce8a6 --- /dev/null +++ b/src/ui/qdarkstyle/svg/radio_unchecked.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/toolbar_move_horizontal.svg b/src/ui/qdarkstyle/svg/toolbar_move_horizontal.svg new file mode 100644 index 0000000..5ca9132 --- /dev/null +++ b/src/ui/qdarkstyle/svg/toolbar_move_horizontal.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/toolbar_move_vertical.svg b/src/ui/qdarkstyle/svg/toolbar_move_vertical.svg new file mode 100644 index 0000000..9db354d --- /dev/null +++ b/src/ui/qdarkstyle/svg/toolbar_move_vertical.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/toolbar_separator_horizontal.svg b/src/ui/qdarkstyle/svg/toolbar_separator_horizontal.svg new file mode 100644 index 0000000..49782cc --- /dev/null +++ b/src/ui/qdarkstyle/svg/toolbar_separator_horizontal.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/toolbar_separator_vertical.svg b/src/ui/qdarkstyle/svg/toolbar_separator_vertical.svg new file mode 100644 index 0000000..fa6c871 --- /dev/null +++ b/src/ui/qdarkstyle/svg/toolbar_separator_vertical.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/transparent.svg b/src/ui/qdarkstyle/svg/transparent.svg new file mode 100644 index 0000000..94adcfd --- /dev/null +++ b/src/ui/qdarkstyle/svg/transparent.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/window_close.svg b/src/ui/qdarkstyle/svg/window_close.svg new file mode 100644 index 0000000..bb73e25 --- /dev/null +++ b/src/ui/qdarkstyle/svg/window_close.svg @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/window_grip.svg b/src/ui/qdarkstyle/svg/window_grip.svg new file mode 100644 index 0000000..2a03260 --- /dev/null +++ b/src/ui/qdarkstyle/svg/window_grip.svg @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/window_minimize.svg b/src/ui/qdarkstyle/svg/window_minimize.svg new file mode 100644 index 0000000..c5a73b8 --- /dev/null +++ b/src/ui/qdarkstyle/svg/window_minimize.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/ui/qdarkstyle/svg/window_undock.svg b/src/ui/qdarkstyle/svg/window_undock.svg new file mode 100644 index 0000000..b6dda46 --- /dev/null +++ b/src/ui/qdarkstyle/svg/window_undock.svg @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/utils/CMakeLists.txt b/src/utils/CMakeLists.txt new file mode 100644 index 0000000..7d16b0f --- /dev/null +++ b/src/utils/CMakeLists.txt @@ -0,0 +1,2 @@ +file(GLOB_RECURSE SRC_SOURCES *.cpp) +file(GLOB_RECURSE SRC_HEADERS *.h) diff --git a/src/utils/ScopeGuard.h b/src/utils/ScopeGuard.h new file mode 100644 index 0000000..6d5df04 --- /dev/null +++ b/src/utils/ScopeGuard.h @@ -0,0 +1,205 @@ +// Author: ricab +// Source: https://github.com/ricab/scope_guard +// +// This is free and unencumbered software released into the public domain. +// +// Anyone is free to copy, modify, publish, use, compile, sell, or +// distribute this software, either in source code form or as a compiled +// binary, for any purpose, commercial or non-commercial, and by any +// means. +// +// In jurisdictions that recognize copyright laws, the author or authors +// of this software dedicate any and all copyright interest in the +// software to the public domain. We make this dedication for the benefit +// of the public at large and to the detriment of our heirs and +// successors. We intend this dedication to be an overt act of +// relinquishment in perpetuity of all present and future rights to this +// software under copyright law. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// For more information, please refer to + +#ifndef SCOPE_GUARD_HPP_ +#define SCOPE_GUARD_HPP_ + +#include +#include + +#if __cplusplus >= 201703L && defined(SG_REQUIRE_NOEXCEPT_IN_CPP17) +#define SG_REQUIRE_NOEXCEPT +#endif + +namespace sg +{ + namespace detail + { + /* --- Some custom type traits --- */ + + // Type trait determining whether a type is callable with no arguments + template + struct is_noarg_callable_t + : public std::false_type + {}; // in general, false + + template + struct is_noarg_callable_t()())> + : public std::true_type + {}; // only true when call expression valid + + // Type trait determining whether a no-argument callable returns void + template + struct returns_void_t + : public std::is_same()())> + {}; + + /* Type trait determining whether a no-arg callable is nothrow invocable if + required. This is where SG_REQUIRE_NOEXCEPT logic is encapsulated. */ + template + struct is_nothrow_invocable_if_required_t + : public +#ifdef SG_REQUIRE_NOEXCEPT + std::is_nothrow_invocable /* Note: _r variants not enough to + confirm void return: any return can be + discarded so all returns are + compatible with void */ +#else + std::true_type +#endif + {}; + + // logic AND of two or more type traits + template + struct and_t : public and_t> + {}; // for more than two arguments + + template + struct and_t : public std::conditional::type + {}; // for two arguments + + // Type trait determining whether a type is a proper scope_guard callback. + template + struct is_proper_sg_callback_t + : public and_t, + returns_void_t, + is_nothrow_invocable_if_required_t, + std::is_nothrow_destructible> + {}; + + + /* --- The actual scope_guard template --- */ + + template::value>::type> + class scope_guard; + + + /* --- Now the friend maker --- */ + + template + detail::scope_guard make_scope_guard(Callback&& callback) + noexcept(std::is_nothrow_constructible::value); /* + we need this in the inner namespace due to MSVC bugs preventing + sg::detail::scope_guard from befriending a sg::make_scope_guard + template instance in the parent namespace (see https://is.gd/xFfFhE). */ + + + /* --- The template specialization that actually defines the class --- */ + + template + class scope_guard final + { + public: + typedef Callback callback_type; + + scope_guard(scope_guard&& other) + noexcept(std::is_nothrow_constructible::value); + + ~scope_guard() noexcept; // highlight noexcept dtor + + void dismiss() noexcept; + + public: + scope_guard() = delete; + scope_guard(const scope_guard&) = delete; + scope_guard& operator=(const scope_guard&) = delete; + scope_guard& operator=(scope_guard&&) = delete; + + private: + explicit scope_guard(Callback&& callback) + noexcept(std::is_nothrow_constructible::value); /* + meant for friends only */ + + friend scope_guard make_scope_guard(Callback&&) + noexcept(std::is_nothrow_constructible::value); /* + only make_scope_guard can create scope_guards from scratch (i.e. non-move) + */ + + private: + Callback m_callback; + bool m_active; + + }; + +} // namespace detail + + +/* --- Now the single public maker function --- */ + +using detail::make_scope_guard; // see comment on declaration above + +} // namespace sg + +//////////////////////////////////////////////////////////////////////////////// +template +sg::detail::scope_guard::scope_guard(Callback&& callback) +noexcept(std::is_nothrow_constructible::value) + : m_callback(std::forward(callback)) /* use () instead of {} because + of DR 1467 (https://is.gd/WHmWuo), which still impacts older compilers + (e.g. GCC 4.x and clang <=3.6, see https://godbolt.org/g/TE9tPJ and + https://is.gd/Tsmh8G) */ + , m_active{true} +{} + +//////////////////////////////////////////////////////////////////////////////// +template +sg::detail::scope_guard::~scope_guard() noexcept +{ + if(m_active) + m_callback(); +} + +//////////////////////////////////////////////////////////////////////////////// +template +sg::detail::scope_guard::scope_guard(scope_guard&& other) +noexcept(std::is_nothrow_constructible::value) + : m_callback(std::forward(other.m_callback)) // idem + , m_active{std::move(other.m_active)} +{ + other.m_active = false; +} + +//////////////////////////////////////////////////////////////////////////////// +template +inline void sg::detail::scope_guard::dismiss() noexcept +{ + m_active = false; +} + +//////////////////////////////////////////////////////////////////////////////// +template +inline auto sg::detail::make_scope_guard(Callback&& callback) +noexcept(std::is_nothrow_constructible::value) +-> detail::scope_guard +{ + return detail::scope_guard{std::forward(callback)}; +} + +#endif /* SCOPE_GUARD_HPP_ */ diff --git a/src/utils/childproc.cpp b/src/utils/childproc.cpp new file mode 100644 index 0000000..383fe53 --- /dev/null +++ b/src/utils/childproc.cpp @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include +#include +#include "utils/childproc.h" + +ChildProcess::ChildProcess(QObject* parent) {} +ChildProcess::~ChildProcess() {} + +void ChildProcess::setupChildProcess() { +#if defined(HAVE_SYS_PRCTL_H) && defined(Q_OS_UNIX) + // https://smackerelofopinion.blogspot.com/2015/11/using-prsetpdeathsig-to-reap-child.html + ::prctl(PR_SET_PDEATHSIG, SIGKILL); +#endif +} \ No newline at end of file diff --git a/src/utils/childproc.h b/src/utils/childproc.h new file mode 100644 index 0000000..5f2bb43 --- /dev/null +++ b/src/utils/childproc.h @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_FPROCESS_H +#define FEATHER_FPROCESS_H + +#include +#include + +#if defined(HAVE_SYS_PRCTL_H) && defined(Q_OS_UNIX) +#include +#include +#endif + +class ChildProcess : public QProcess { + Q_OBJECT +public: + explicit ChildProcess(QObject* parent = nullptr); + ~ChildProcess(); +protected: + void setupChildProcess() override; +}; + + +#endif //FEATHER_FPROCESS_H diff --git a/src/utils/config.cpp b/src/utils/config.cpp new file mode 100644 index 0000000..362df96 --- /dev/null +++ b/src/utils/config.cpp @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (C) 2020 KeePassXC Team +// Copyright (C) 2011 Felix Geyer +// Copyright (C) 2020, The Monero Project. + +#include "config.h" +#include "utils/utils.h" +#include "utils/tails.h" + +#include +#include +#include + +#define QS QStringLiteral + +struct ConfigDirective +{ + QString name; + QVariant defaultValue; +}; + +static const QHash configStrings = { + // General + {Config::warnOnExternalLink,{QS("warnOnExternalLink"), true}}, + {Config::checkForAppUpdates,{QS("checkForAppUpdates"), true}}, + {Config::warnOnStagenet,{QS("warnOnStagenet"), true}}, + {Config::warnOnTestnet,{QS("warnOnTestnet"), true}}, + {Config::warnOnAlpha,{QS("warnOnAlpha"), true}}, + {Config::homeWidget,{QS("homeWidget"), "ccs"}}, + {Config::donateBeg,{QS("donateBeg"), 1}}, + {Config::skin,{QS("skin"), "light"}}, + {Config::preferredFiatCurrency,{QS("preferredFiatCurrency"), "USD"}}, + {Config::blockExplorer,{QS("blockExplorer"), "exploremonero.com"}}, + {Config::walletDirectory,{QS("walletDirectory"), ""}}, + {Config::autoOpenWalletPath,{QS("autoOpenWalletPath"), ""}}, + {Config::walletPath,{QS("walletPath"), ""}}, + {Config::nodes,{QS("nodes"), "{}"}}, + {Config::websocketEnabled,{QS("websocketEnabled"), true}}, + {Config::nodeSource,{QS("nodeSource"), 0}}, + {Config::useOnionNodes,{QS("useOnionNodes"), false}}, + {Config::showTabCoins,{QS("showTabCoins"), false}}, + {Config::showTabXMRto,{QS("showTabXMRto"), true}}, + {Config::showTabCalc,{QS("showTabCalc"), true}}, + {Config::geometry, {QS("geometry"), {}}}, + {Config::windowState, {QS("windowState"), {}}}, + {Config::firstRun,{QS("firstRun"), false}}, +}; + + +QPointer Config::m_instance(nullptr); + +QVariant Config::get(ConfigKey key) +{ + auto cfg = configStrings[key]; + auto defaultValue = configStrings[key].defaultValue; + + return m_settings->value(cfg.name, defaultValue); +} + +QString Config::getFileName() +{ + return m_settings->fileName(); +} + +void Config::set(ConfigKey key, const QVariant& value) +{ + if (get(key) == value) { + return; + } + + auto cfg = configStrings[key]; + m_settings->setValue(cfg.name, value); + + this->sync(); + emit changed(key); +} + +/** + * Sync configuration with persistent storage. + * + * Usually, you don't need to call this method manually, but if you are writing + * configurations after an emitted \link QCoreApplication::aboutToQuit() signal, + * use it to guarantee your config values are persisted. + */ +void Config::sync() +{ + m_settings->sync(); +} + +void Config::resetToDefaults() +{ + m_settings->clear(); +} + +Config::Config(const QString& fileName, QObject* parent) + : QObject(parent) +{ + init(fileName); +} + +Config::Config(QObject* parent) + : QObject(parent) +{ + QString configPath; + + bool isTails = TailsOS::detect(); + + configPath = QDir::homePath(); + if (isTails) { // #if defined(PORTABLE) + QString appImagePath = qgetenv("APPIMAGE"); + QFileInfo appImageDir(appImagePath); + + QDir portablePath(appImageDir.absoluteDir().path() + "/.feather"); + if (portablePath.mkpath(".")) { + configPath = portablePath.path(); + } + else { + qCritical() << "Unable to create portable directory: " << portablePath.path(); + } + } + + configPath += "/.config/feather/settings.json"; + + init(QDir::toNativeSeparators(configPath)); +} + + +Config::~Config() +{ +} + +void Config::init(const QString& configFileName) +{ + const QSettings::Format jsonFormat = QSettings::registerFormat("json", Utils::readJsonFile, Utils::writeJsonFile); + QSettings::setDefaultFormat(jsonFormat); + m_settings.reset(new QSettings(configFileName, jsonFormat)); + + connect(qApp, &QCoreApplication::aboutToQuit, this, &Config::sync); +} + +Config* Config::instance() +{ + if (!m_instance) { + m_instance = new Config(qApp); + } + + return m_instance; +} \ No newline at end of file diff --git a/src/utils/config.h b/src/utils/config.h new file mode 100644 index 0000000..2995062 --- /dev/null +++ b/src/utils/config.h @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (C) 2020 KeePassXC Team +// Copyright (C) 2011 Felix Geyer +// Copyright (C) 2020, The Monero Project. + +#ifndef FEATHER_SETTINGS_H +#define FEATHER_SETTINGS_H + +#include +#include +#include + +class Config : public QObject +{ + Q_OBJECT + +public: + Q_DISABLE_COPY(Config) + + enum ConfigKey + { + warnOnExternalLink, + checkForAppUpdates, + warnOnStagenet, + warnOnTestnet, + warnOnAlpha, + homeWidget, + donateBeg, + autoOpenWalletPath, + skin, + preferredFiatCurrency, + blockExplorer, + walletDirectory, + walletPath, + nodes, + websocketEnabled, + nodeSource, + useOnionNodes, + showTabCoins, + showTabXMRto, + showTabCalc, + geometry, + windowState, + firstRun + }; + + ~Config() override; + QVariant get(ConfigKey key); + QString getFileName(); + void set(ConfigKey key, const QVariant& value); + void sync(); + void resetToDefaults(); + + static Config* instance(); + +signals: + void changed(ConfigKey key); + +private: + Config(const QString& fileName, QObject* parent = nullptr); + explicit Config(QObject* parent); + void init(const QString& configFileName); + + static QPointer m_instance; + + QScopedPointer m_settings; + QHash m_defaults; +}; + +inline Config* config() +{ + return Config::instance(); +} + +#endif //FEATHER_SETTINGS_H diff --git a/src/utils/keysfiles.cpp b/src/utils/keysfiles.cpp new file mode 100644 index 0000000..39081bc --- /dev/null +++ b/src/utils/keysfiles.cpp @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "appcontext.h" +#include "utils/config.h" +#include "utils/networktype.h" +#include "utils/utils.h" +#include "keysfiles.h" + +using namespace std::chrono; + + +WalletKeysFiles::WalletKeysFiles(const QFileInfo &info, quint8 networkType, QString address) : + m_fileName(info.fileName()), + m_modified(info.lastModified().toSecsSinceEpoch()), + m_path(QDir::toNativeSeparators(info.absoluteFilePath())), + m_networkType(networkType), + m_address(std::move(address)) {} + +QString WalletKeysFiles::fileName() const { + return m_fileName; +} + +qint64 WalletKeysFiles::modified() const { + return m_modified; +} + +QString WalletKeysFiles::address() const { + return m_address; +} + +QString WalletKeysFiles::path() const { + return m_path; +} + +quint8 WalletKeysFiles::networkType() const { + return m_networkType; +} + +WalletKeysFilesModel::WalletKeysFilesModel(AppContext *ctx, QObject *parent) : + QAbstractTableModel(parent), + m_ctx(ctx) { + this->walletDirectories << m_ctx->defaultWalletDirRoot; + auto walletPath = config()->get(Config::walletPath).toString(); + if(!walletPath.isEmpty() && Utils::fileExists(walletPath)) { + QDir d = QFileInfo(walletPath).absoluteDir(); + this->walletDirectories << d.absolutePath(); + } + + this->walletDirectories << m_ctx->homeDir; + this->walletDirectories.removeDuplicates(); + + this->m_walletKeysFilesItemModel = qobject_cast(this); +} + +void WalletKeysFilesModel::clear() { + beginResetModel(); + m_walletKeyFiles.clear(); + endResetModel(); +} + +void WalletKeysFilesModel::refresh() { + this->clear(); + this->findWallets(); +} + +void WalletKeysFilesModel::findWallets() { + qDebug() << "wallet .keys search initiated"; + auto now = high_resolution_clock::now(); + + QRegExp rx("*.keys"); + rx.setPatternSyntax(QRegExp::Wildcard); + QStringList walletPaths; + + for(auto i = 0; i != this->walletDirectories.length(); i++) { + // Scan default wallet dir (~/Monero/) + walletPaths << Utils::fileFind(rx, this->walletDirectories[i], 0, i == 0 ? 2 : 0, 200); + } + + walletPaths.removeDuplicates(); + for(const auto &walletPath: walletPaths) { + QFile walletPathFile(walletPath); + if(walletPathFile.size() <= 0) + continue; + + QFileInfo fileInfo(walletPath); + const QString absPath = fileInfo.absoluteFilePath(); + const QString path = fileInfo.path(); + const QString baseName = fileInfo.baseName(); + const QString basePath = QString("%1/%2").arg(path).arg(baseName); + QString addr = QString(""); + quint8 networkType = NetworkType::MAINNET; + + if (Utils::fileExists(basePath + ".address.txt")) { + QFile file(basePath + ".address.txt"); + file.open(QFile::ReadOnly | QFile::Text); + const QString _address = QTextCodec::codecForMib(106)->toUnicode(file.readAll()); + + if (!_address.isEmpty()) { + addr = _address; + if (addr.startsWith("5") || addr.startsWith("7")) + networkType = NetworkType::STAGENET; + else if (addr.startsWith("9") || addr.startsWith("B")) + networkType = NetworkType::TESTNET; + } + file.close(); + } + + this->addWalletKeysFile(WalletKeysFiles(fileInfo, networkType, std::move(addr))); + } + + auto duration = duration_cast(high_resolution_clock::now() - now).count(); + qDebug() << QString("wallet .keys search completed in %1 ms").arg(duration); +} + +void WalletKeysFilesModel::addWalletKeysFile(const WalletKeysFiles &walletKeysFile) { + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + m_walletKeyFiles << walletKeysFile; + endInsertRows(); +} + +int WalletKeysFilesModel::rowCount(const QModelIndex & parent) const { + return parent.isValid() ? 0 : m_walletKeyFiles.count(); +} + +int WalletKeysFilesModel::columnCount(const QModelIndex &) const { + return 3; +} + +QVariant WalletKeysFilesModel::data(const QModelIndex &index, int role) const { + if (index.row() < 0 || index.row() >= m_walletKeyFiles.count()) + return QVariant(); + + const auto &walletKeyFile = m_walletKeyFiles[index.row()]; + + if (role == Qt::DisplayRole) { + switch(index.column()) { + case ModelColumns::NetworkType: { + auto c = static_cast(walletKeyFile.networkType()); + if (c == NetworkType::Type::STAGENET) + return QString("stage"); + else if (c == NetworkType::Type::TESTNET) + return QString("test"); + return QString("main"); + } + case ModelColumns::FileName: + return walletKeyFile.fileName(); + case ModelColumns::Path: { + auto fp = walletKeyFile.path(); +#if defined(Q_OS_MAC) || defined(Q_OS_LINUX) + if (fp.startsWith(m_ctx->homeDir)) + fp = QString("~/%1").arg(fp.remove(0, m_ctx->homeDir.length() + 1)); +#endif + return fp; + } + default: + break; + } + } else if(role == Qt::UserRole) { + switch(index.column()) { + case ModelColumns::NetworkType: + return static_cast(walletKeyFile.networkType()); + case ModelColumns::FileName: + return walletKeyFile.fileName(); + case ModelColumns::Modified: + return (int)walletKeyFile.modified(); + case ModelColumns::Path: + return walletKeyFile.path(); + default: + break; + } + } + + return QVariant(); +} + +QVariant WalletKeysFilesModel::headerData(int section, Qt::Orientation orientation, int role) const { + if (role != Qt::DisplayRole) + return QVariant(); + if (orientation == Qt::Horizontal) { + switch(section) { + case NetworkType: + return QString("Type"); + case FileName: + return QString("Name"); + case Path: + return QString("Path"); + default: + return QVariant(); + } + } + return QVariant(); +} + +WalletKeysFilesProxyModel::WalletKeysFilesProxyModel(QObject *parent) : + QSortFilterProxyModel(parent) {} + +bool WalletKeysFilesProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { + return true; +} \ No newline at end of file diff --git a/src/utils/keysfiles.h b/src/utils/keysfiles.h new file mode 100644 index 0000000..4ce9a30 --- /dev/null +++ b/src/utils/keysfiles.h @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef KEYSFILES_H +#define KEYSFILES_H + +#include "libwalletqt/WalletManager.h" +#include "utils/networktype.h" +#include "utils/utils.h" +#include + +class WalletKeysFiles +{ +public: + WalletKeysFiles(const QFileInfo &info, quint8 networkType, QString address); + + QString fileName() const; + qint64 modified() const; + QString path() const; + quint8 networkType() const; + QString address() const; + +private: + QString m_fileName; + qint64 m_modified; + QString m_path; + quint8 m_networkType; + QString m_address; +}; + +class WalletKeysFilesModel : public QAbstractTableModel +{ + Q_OBJECT +public: + enum ModelColumns { + NetworkType = 0, + FileName, + Path, + Modified + }; + + explicit WalletKeysFilesModel(AppContext *ctx, QObject *parent = nullptr); + + Q_INVOKABLE void refresh(); + Q_INVOKABLE void clear(); + + void findWallets(); + void addWalletKeysFile(const WalletKeysFiles &walletKeysFile); + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QStringList walletDirectories; + +private: + AppContext *m_ctx; + QList m_walletKeyFiles; + QAbstractItemModel *m_walletKeysFilesItemModel; + QSortFilterProxyModel m_walletKeysFilesModelProxy; +}; + +class WalletKeysFilesProxyModel : public QSortFilterProxyModel +{ +Q_OBJECT +public: + explicit WalletKeysFilesProxyModel(QObject *parent = nullptr); + bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; +}; + +#endif // KEYSFILES_H diff --git a/src/utils/networking.cpp b/src/utils/networking.cpp new file mode 100644 index 0000000..1a50331 --- /dev/null +++ b/src/utils/networking.cpp @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include +#include +#include +#include + +#include "utils/utils.h" +#include "utils/networking.h" + +UtilsNetworking::UtilsNetworking(QNetworkAccessManager *networkAccessManager, QObject *parent) : + QObject(parent), + m_networkAccessManager(networkAccessManager) {} + +void UtilsNetworking::setUserAgent(const QString &userAgent) { + this->m_userAgent = userAgent; +} + +void UtilsNetworking::get(const QString &url) { + QNetworkRequest request; + request.setUrl(QUrl(url)); + request.setRawHeader("User-Agent", m_userAgent.toUtf8()); + + QNetworkReply *reply; + reply = this->m_networkAccessManager->get(request); + connect(reply, &QNetworkReply::finished, std::bind(&UtilsNetworking::webResponse, this, reply)); +} + +QNetworkReply* UtilsNetworking::getJson(const QString &url) { + QNetworkRequest request; + request.setUrl(QUrl(url)); + request.setRawHeader("User-Agent", m_userAgent.toUtf8()); + request.setRawHeader("Content-Type", "application/json"); + + return this->m_networkAccessManager->get(request); +} + +QNetworkReply* UtilsNetworking::postJson(const QString &url, const QJsonObject &data) { + QNetworkRequest request; + request.setUrl(QUrl(url)); + request.setRawHeader("User-Agent", m_userAgent.toUtf8()); + request.setRawHeader("Content-Type", "application/json"); + + QJsonDocument doc(data); + QByteArray bytes = doc.toJson(); + return this->m_networkAccessManager->post(request, bytes); +} + +void UtilsNetworking::webResponse(QNetworkReply *reply) { + QByteArray data = reply->readAll(); + QString err; + if (reply->error()) { + err = reply->errorString(); + qCritical() << err; + qCritical() << data; + if (!data.isEmpty()) + err += QString("%1 %2").arg(err).arg(Utils::barrayToString(data)); + } + reply->deleteLater(); + + if(!err.isEmpty()) + emit webErrorReceived(err); + else + emit webReceived(data); +} + +QString UtilsNetworking::validateJSON(QNetworkReply *reply){ + QList headerList = reply->rawHeaderList(); + QByteArray headerJson = reply->rawHeader("Content-Type"); + if(headerJson.length() <= 15) + return "Bad Content-Type"; + QString headerJsonStr = QTextCodec::codecForMib(106)->toUnicode(headerJson); + int _contentType = headerList.indexOf("Content-Type"); + if (_contentType < 0 || !headerJsonStr.startsWith("application/json")) + return "Bad Content-Type"; + QByteArray data = reply->readAll(); + if(!Utils::validateJSON(data)) + return "Bad or empty JSON"; + return "OK"; +} diff --git a/src/utils/networking.h b/src/utils/networking.h new file mode 100644 index 0000000..d0be889 --- /dev/null +++ b/src/utils/networking.h @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_NETWORKING_H +#define FEATHER_NETWORKING_H + +#include +#include +#include +#include +#include +#include + +#include "utils/utils.h" + +static QStringList randomHTTPAgents; +class CCSEntry; + +class UtilsNetworking : public QObject +{ +Q_OBJECT + +public: + explicit UtilsNetworking(QNetworkAccessManager *networkAccessManager, QObject *parent = nullptr); + + void get(const QString &url); + QNetworkReply* getJson(const QString &url); + QNetworkReply* postJson(const QString &url, const QJsonObject &data); + void setUserAgent(const QString &userAgent); + static QString validateJSON(QNetworkReply *reply); + +private slots: + void webResponse(QNetworkReply *reply); + +signals: + void webErrorReceived(QString msg); + void webReceived(QByteArray data); + +private: + QString m_userAgent = "Mozilla/5.0 (Windows NT 10.0; rv:68.0) Gecko/20100101 Firefox/68.0"; + QNetworkAccessManager *m_networkAccessManager; +}; + +#endif //FEATHER_NETWORKING_H diff --git a/src/utils/networktype.h b/src/utils/networktype.h new file mode 100644 index 0000000..227b003 --- /dev/null +++ b/src/utils/networktype.h @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#pragma once + +#include +#include + +class NetworkType : public QObject +{ + Q_OBJECT + +public: + enum Type : uint8_t { + MAINNET = Monero::MAINNET, + TESTNET = Monero::TESTNET, + STAGENET = Monero::STAGENET + }; + Q_ENUM(Type) +}; diff --git a/src/utils/nodes.cpp b/src/utils/nodes.cpp new file mode 100644 index 0000000..edcdcea --- /dev/null +++ b/src/utils/nodes.cpp @@ -0,0 +1,379 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include +#include +#include +#include + +#include "nodes.h" +#include "utils/utils.h" +#include "utils/networking.h" +#include "appcontext.h" + +Nodes::Nodes(AppContext *ctx, QNetworkAccessManager *networkAccessManager, QObject *parent) : + QObject(parent), + m_ctx(ctx), + m_networkAccessManager(networkAccessManager), + m_connection(FeatherNode("", 0, false)), + modelWebsocket(new NodeModel(NodeSource::websocket, this)), + modelCustom(new NodeModel(NodeSource::custom, this)) { + this->loadConfig(); + + connect(m_connectionTimer, &QTimer::timeout, this, &Nodes::onConnectionTimer); +} + +void Nodes::loadConfig() { + QString msg; + auto configNodes = config()->get(Config::nodes).toByteArray(); + auto key = QString::number(m_ctx->networkType); + if (!Utils::validateJSON(configNodes)) { + m_configJson[key] = QJsonObject(); + qCritical() << "fixed malformed config key \"nodes\""; + } + + QJsonDocument doc = QJsonDocument::fromJson(configNodes); + m_configJson = doc.object(); + + if(!m_configJson.contains(key)) + m_configJson[key] = QJsonObject(); + + auto obj = m_configJson.value(key).toObject(); + if (!obj.contains("custom")) + obj["custom"] = QJsonArray(); + if (!obj.contains("ws")) + obj["ws"] = QJsonArray(); + + // load custom nodes + auto nodes = obj.value("custom").toArray(); + foreach (const QJsonValue &value, nodes) { + auto customNode = FeatherNode(value.toString(), 0, false); + customNode.custom = true; + + if(m_connection == customNode) { + if(m_connection.isActive) + customNode.isActive = true; + else if(m_connection.isConnecting) + customNode.isConnecting = true; + } + + m_customNodes.append(customNode); + } + + // load cached websocket nodes + auto ws = obj.value("ws").toArray(); + foreach (const QJsonValue &value, ws) { + auto wsNode = FeatherNode(value.toString(), 0, false); + wsNode.custom = false; + wsNode.online = true; // assume online + + if(m_connection == wsNode) { + if(m_connection.isActive) + wsNode.isActive = true; + else if(m_connection.isConnecting) + wsNode.isConnecting = true; + } + + m_websocketNodes.append(wsNode); + } + + if (!obj.contains("source")) + obj["source"] = NodeSource::websocket; + m_source = static_cast(obj.value("source").toInt()); + + if(m_websocketNodes.count() > 0){ + msg = QString("Loaded %1 cached websocket nodes from config").arg(m_websocketNodes.count()); + activityLog.append(msg); + } + + if(m_customNodes.count() > 0){ + msg = QString("Loaded %1 custom nodes from config").arg(m_customNodes.count()); + activityLog.append(msg); + } + + m_configJson[key] = obj; + this->writeConfig(); + this->updateModels(); +} + +void Nodes::writeConfig() { + QJsonDocument doc(m_configJson); + QString output(doc.toJson(QJsonDocument::Compact)); + config()->set(Config::nodes, output); + + auto msg = QString("Saved node config."); + activityLog.append(msg); +} + +void Nodes::connectToNode() { + // auto connect + m_connectionAttempts.clear(); + m_wsExhaustedWarningEmitted = false; + m_customExhaustedWarningEmitted = false; + m_connectionTimer->start(2000); + this->onConnectionTimer(); +} + +void Nodes::connectToNode(FeatherNode node) { + if(node.address.isEmpty()) + return; + + emit updateStatus(QString("Connecting to %1").arg(node.address)); + auto msg = QString("Attempting to connect to %1 (%2)") + .arg(node.address).arg(node.custom ? "custom" : "ws"); + qInfo() << msg; + activityLog.append(msg); + + if(!node.username.isEmpty() && !node.password.isEmpty()) + m_ctx->currentWallet->setDaemonLogin(node.username, node.password); + m_ctx->currentWallet->initAsync(node.address, true, 0, false, false, 0); + m_connectionAttemptTime = std::time(nullptr); + + m_connection = node; + m_connection.isActive = false; + m_connection.isConnecting = true; + + this->resetLocalState(); + this->updateModels(); + + m_connectionTimer->start(1000); +} + +void Nodes::onConnectionTimer() { + // this function is responsible for automatically connecting to a daemon. + if (m_ctx->currentWallet == nullptr) { + m_connectionTimer->stop(); + return; + } + + QString msg; + Wallet::ConnectionStatus status = m_ctx->currentWallet->connected(true); + NodeSource nodeSource = this->source(); + auto wsMode = nodeSource == NodeSource::websocket; + auto nodes = wsMode ? m_customNodes : m_websocketNodes; + + if(wsMode && !m_wsNodesReceived && m_websocketNodes.count() == 0) { + // this situation should rarely occur due to the usage of the websocket node cache on startup. + msg = QString("Feather is in websocket connection mode but was not able to receive any nodes (yet)."); + qInfo() << msg; + activityLog.append(msg); + return; + } + + if(status == Wallet::ConnectionStatus::ConnectionStatus_Disconnected) { + // try a connect + auto node = this->pickEligibleNode(); + this->connectToNode(node); + return; + } else if(status == Wallet::ConnectionStatus::ConnectionStatus_Connecting){ + if(!m_connection.isConnecting) { + // Weirdly enough, status == connecting directly after a wallet is opened. + auto node = this->pickEligibleNode(); + this->connectToNode(node); + return; + } + + // determine timeout + unsigned int nodeConnectionTimeout = 6; + if(m_connection.tor) + nodeConnectionTimeout = 25; + + auto connectionTimeout = static_cast(std::time(nullptr) - m_connectionAttemptTime); + if(connectionTimeout < nodeConnectionTimeout) + return; // timeout not reached yet + + msg = QString("Node connection attempt stale after %1 seconds, picking new node").arg(nodeConnectionTimeout); + activityLog.append(msg); + qInfo() << msg; + + auto newNode = this->pickEligibleNode(); + this->connectToNode(newNode); + return; + } else if(status == Wallet::ConnectionStatus::ConnectionStatus_Connected) { + // wallet is connected to daemon successfully, poll status every 3 seconds + if(!m_connection.isConnecting) + return; + + msg = QString("Node connected to %1").arg(m_connection.address); + qInfo() << msg; + activityLog.append(msg); + + // set current connection object + m_connection.isConnecting = false; + m_connection.isActive = true; + this->resetLocalState(); + this->updateModels(); + + // reset node exhaustion state + m_connectionAttempts.clear(); + m_wsExhaustedWarningEmitted = false; + m_customExhaustedWarningEmitted = false; + m_connectionTimer->setInterval(3000); + } +} + +FeatherNode Nodes::pickEligibleNode() { + // Pick a node at random to connect to + FeatherNode rtn("", 0, false); + NodeSource nodeSource = this->source(); + auto wsMode = nodeSource == NodeSource::websocket; + auto nodes = wsMode ? m_websocketNodes : m_customNodes; + + if(nodes.count() == 0) { + this->exhausted(); + return rtn; + } + + while(true) { + // keep track of nodes we have previously tried to connect to + if(m_connectionAttempts.count() == nodes.count()) { + this->exhausted(); + m_connectionTimer->stop(); + return rtn; + } + + int random = QRandomGenerator::global()->bounded(nodes.count()); + FeatherNode node = nodes.at(random); + if(m_connectionAttempts.contains(node.full)) + continue; + m_connectionAttempts.append(node.full); + + if(wsMode && !node.online) + continue; + return node; + } +} + +void Nodes::onWSNodesReceived(const QList> &nodes) { + m_websocketNodes.clear(); + m_wsNodesReceived = true; + + for(auto &node: nodes) { + if(m_connection == *node) { + if(m_connection.isActive) + node->isActive = true; + else if(m_connection.isConnecting) + node->isConnecting = true; + } + m_websocketNodes.push_back(*node); + } + + // cache into config + auto key = QString::number(m_ctx->networkType); + auto obj = m_configJson.value(key).toObject(); + auto ws = QJsonArray(); + for(auto const &node: m_websocketNodes) + ws.push_back(node.address); + + obj["ws"] = ws; + m_configJson[key] = obj; + this->writeConfig(); + this->resetLocalState(); + this->updateModels(); +} + +void Nodes::onNodeSourceChanged(NodeSource nodeSource) { + if(nodeSource == this->source()) return; + auto key = QString::number(m_ctx->networkType); + auto obj = m_configJson.value(key).toObject(); + obj["source"] = nodeSource; + + m_configJson[key] = obj; + this->writeConfig(); + this->resetLocalState(); + this->updateModels(); +} + +void Nodes::setCustomNodes(QList nodes) { + m_customNodes.clear(); + auto key = QString::number(m_ctx->networkType); + auto obj = m_configJson.value(key).toObject(); + + QStringList nodesList; + for(auto const &node: nodes) { + if(nodesList.contains(node.full)) continue; + nodesList.append(node.full); + m_customNodes.append(node); + } + + auto arr = QJsonArray::fromStringList(nodesList); + obj["custom"] = arr; + m_configJson[key] = obj; + this->writeConfig(); + this->resetLocalState(); + this->updateModels(); +} + +void Nodes::updateModels() { + this->modelCustom->updateNodes(m_customNodes); + this->modelWebsocket->updateNodes(m_websocketNodes); +} + +void Nodes::resetLocalState() { + QList*> models = {&m_customNodes, &m_websocketNodes}; + + for(QList *model: models) { + for (FeatherNode &_node: *model) { + _node.isConnecting = false; + _node.isActive = false; + + if (_node == m_connection) { + _node.isActive = m_connection.isActive; + _node.isConnecting = m_connection.isConnecting; + } + } + } +} + +void Nodes::exhausted() { + NodeSource nodeSource = this->source(); + auto wsMode = nodeSource == NodeSource::websocket; + if(wsMode) + this->WSNodeExhaustedWarning(); + else + this->nodeExhaustedWarning(); +} + +void Nodes::nodeExhaustedWarning(){ + if(m_customExhaustedWarningEmitted) return; + emit nodeExhausted(); + + auto msg = QString("Could not find an eligible custom node to connect to."); + qWarning() << msg; + activityLog.append(msg); + + m_customExhaustedWarningEmitted = true; + this->m_connectionTimer->stop(); +} + +void Nodes::WSNodeExhaustedWarning() { + if(m_wsExhaustedWarningEmitted) return; + emit WSNodeExhausted(); + + auto msg = QString("Could not find an eligible websocket node to connect to."); + qWarning() << msg; + activityLog.append(msg); + + m_wsExhaustedWarningEmitted = true; + this->m_connectionTimer->stop(); +} + +void Nodes::onWalletClosing() { + m_connectionTimer->stop(); +} + +QList Nodes::customNodes() { + return m_customNodes; +} + +FeatherNode Nodes::connection() { + return m_connection; +} + +void Nodes::stopTimer(){ + m_connectionTimer->stop(); +} + +NodeSource Nodes::source() { + return m_source; +} diff --git a/src/utils/nodes.h b/src/utils/nodes.h new file mode 100644 index 0000000..f15ba67 --- /dev/null +++ b/src/utils/nodes.h @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_NODES_H +#define FEATHER_NODES_H + +#include +#include +#include +#include +#include +#include +#include + +#include "model/NodeModel.h" +#include "utils/utils.h" +#include "utils/config.h" + +enum NodeSource { + websocket = 0, + custom +}; + +struct FeatherNode { + FeatherNode(QString _address, unsigned int height, bool online) : height(height), online(online){ + // wonky ipv4/host parsing, should be fine(tm)(c). + if(_address.isEmpty()) return; + _address = _address.replace("https://", ""); + _address = _address.replace("http://", ""); + if(_address.contains("@")){ // authentication, user/pass + const auto spl = _address.split("@"); + const auto &creds = spl.at(0); + if(creds.contains(":")) { + const auto _spl = creds.split(":"); + this->username = _spl.at(0).trimmed().replace(" ", ""); + this->password = _spl.at(1).trimmed().replace(" ", ""); + } + _address = spl.at(1); + } + if(!_address.contains(":")) + _address += ":18089"; + this->address = _address; + if(this->address.contains(".onion")) + tor = true; + this->full = this->generateFull(); + }; + + QString address; + QString full; + unsigned int height; + bool online = false; + QString username; + QString password; + bool cached = false; + bool custom = false; + bool tor = false; + bool isConnecting = false; + bool isActive = false; + + QString generateFull() { + QString auth; + if(!this->username.isEmpty() && !this->password.isEmpty()) + auth = QString("%1:%2@").arg(this->username).arg(this->password); + return QString("%1%2").arg(auth).arg(this->address); + } + + QString as_url() { + return QString("http://%1/get_info").arg(this->full); + } + + bool operator == (const FeatherNode &other) const { + return this->full == other.full; + } +}; + +class Nodes : public QObject { + Q_OBJECT + +public: + explicit Nodes(AppContext *ctx, QNetworkAccessManager *networkAccessManager, QObject *parent = nullptr); + void loadConfig(); + void writeConfig(); + void stopTimer(); + + NodeSource source(); + FeatherNode connection(); + QList customNodes(); + + NodeModel *modelWebsocket; + NodeModel *modelCustom; + + QStringList activityLog; + +public slots: + void onWalletClosing(); + void connectToNode(); + void connectToNode(FeatherNode node); + void onWSNodesReceived(const QList>& nodes); + void onNodeSourceChanged(NodeSource nodeSource); + void setCustomNodes(QList nodes); + +private slots: + void onConnectionTimer(); + +signals: + void WSNodeExhausted(); + void nodeExhausted(); + void updateStatus(const QString &msg); + +private: + AppContext *m_ctx = nullptr; + NodeSource m_source = NodeSource::websocket; + QNetworkAccessManager *m_networkAccessManager = nullptr; + QJsonObject m_configJson; + + QList m_customNodes; + QList m_websocketNodes; + + FeatherNode m_connection; // current active connection, if any + QTimer *m_connectionTimer = new QTimer(this); + time_t m_connectionAttemptTime = 0; + QStringList m_connectionAttempts; + + bool m_wsNodesReceived = false; + + bool m_wsExhaustedWarningEmitted = true; + bool m_customExhaustedWarningEmitted = true; + + FeatherNode pickEligibleNode(); + + void updateModels(); + void resetLocalState(); + void exhausted(); + void WSNodeExhaustedWarning(); + void nodeExhaustedWarning(); +}; + +#endif //FEATHER_NODES_H diff --git a/src/utils/prices.cpp b/src/utils/prices.cpp new file mode 100644 index 0000000..32d25eb --- /dev/null +++ b/src/utils/prices.cpp @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include +#include +#include +#include + +#include "utils/prices.h" + +Prices::Prices(QObject *parent) : QObject(parent) { + this->rates = QMap(); + this->markets = QMap(); + this->fiat = QMap(); + fiat["USD"] = "$"; + fiat["EUR"] = "€"; + fiat["JPY"] = "¥"; + fiat["KRW"] = "₩"; + fiat["MXN"] = "$"; + fiat["RUB"] = "\u20BD"; + fiat["CAD"] = "$"; + fiat["GBP"] = "£"; + fiat["SEK"] = "kr"; + fiat["ZAR"] = "R"; + fiat["THB"] = "฿"; + fiat["TRY"] = "₺"; + fiat["CHF"] = "Fr"; + fiat["CNY"] = "¥"; + fiat["CZK"] = "Kč"; +} + +void Prices::cryptoPricesReceived(const QJsonArray &data) { + QStringList filter = QStringList() << "XMR" << "ZEC" << "BTC" << "ETH" << "BCH" << "LTC"; + filter << "EOS" << "ADA" << "XLM" << "TRX" << "DASH" << "DCR" << "VET" << "DOGE" << "XRP" << "WOW"; + + QMap msMap; + for(auto &&entry: data) { + marketStruct ms; + QJsonObject obj = entry.toObject(); + ms.symbol = obj.value("symbol").toString(); + ms.image = obj.value("image").toString(); + ms.name = obj.value("name").toString(); + ms.price_usd = obj.value("current_price").toDouble(); + ms.price_usd_change_pct_24h = obj.value("price_change_percentage_24h").toDouble(); + + if(ms.price_usd <= 0) continue; + if(filter.contains(ms.symbol.toUpper())) + msMap.insert(ms.symbol.toUpper(), ms); + } + + if(msMap.count() > 0) + this->markets = msMap; + + emit cryptoPricesUpdated(); +} + +double Prices::convert(const QString &symbolFrom, const QString &symbolTo, double amount) { + if(symbolFrom == symbolTo) return amount; + if(amount <= 0.0) return 0.0; + + double usd_from; + QString from = symbolFrom.toUpper(); + QString to = symbolTo.toUpper(); + + if(this->markets.contains(from)) + usd_from = this->markets[from].price_usd * amount; + else if(this->rates.contains(from)) { + if(from == "USD") + usd_from = amount; + else + usd_from = amount / this->rates[from]; + } else + return 0.0; + + if(to == "USD") + return usd_from; + + if(this->markets.contains(to)) + return usd_from / this->markets[to].price_usd; + else if(this->rates.contains(to)) + return usd_from * this->rates[to]; + + return 0.0; +} + +void Prices::fiatPricesReceived(const QJsonObject &data) { + QJsonObject rates = data.value("rates").toObject(); + for(const auto ¤cy: fiat.keys()) + if(rates.contains(currency)) + this->rates.insert(currency, rates.value(currency).toDouble()); + emit fiatPricesUpdated(); +} diff --git a/src/utils/prices.h b/src/utils/prices.h new file mode 100644 index 0000000..c33382f --- /dev/null +++ b/src/utils/prices.h @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_PRICES_H +#define FEATHER_PRICES_H + +#include +#include +#include + +#include "utils/utils.h" + +struct marketStruct { + QString symbol; + QString name; + QString image; + double price_usd; + double price_usd_change_pct_24h; +}; + +class Prices : public QObject +{ +Q_OBJECT + +public: + explicit Prices(QObject *parent = nullptr); + QMap rates; + QMap markets; + QMap fiat; // symbol:sign + +public slots: + void cryptoPricesReceived(const QJsonArray &data); + void fiatPricesReceived(const QJsonObject &data); + + double convert(const QString &symbolFrom, const QString &symbolTo, double amount); + +signals: + void fiatPricesUpdated(); + void cryptoPricesUpdated(); +}; + +#endif //FEATHER_PRICES_H diff --git a/src/utils/scheduler.cpp b/src/utils/scheduler.cpp new file mode 100644 index 0000000..323fe58 --- /dev/null +++ b/src/utils/scheduler.cpp @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#include "scheduler.h" + +FutureScheduler::FutureScheduler(QObject *parent) + : QObject(parent), Alive(0), Stopping(false) +{ +} + +FutureScheduler::~FutureScheduler() +{ + shutdownWaitForFinished(); +} + +void FutureScheduler::shutdownWaitForFinished() noexcept +{ + QMutexLocker locker(&Mutex); + + Stopping = true; + while (Alive > 0) + { + Condition.wait(&Mutex); + } +} + +QPair> FutureScheduler::run(std::function function) noexcept +{ + return execute([this, function](QFutureWatcher *) { + return QtConcurrent::run([this, function] { + try + { + function(); + } + catch (const std::exception &exception) + { + qWarning() << "Exception thrown from async function: " << exception.what(); + } + done(); + }); + }); +} + +//QPair> FutureScheduler::run(std::function function, const QJSValue &callback) +//{ +// if (!callback.isCallable()) +// { +// throw std::runtime_error("js callback must be callable"); +// } + +// return execute([this, function, callback](QFutureWatcher *watcher) { +// connect(watcher, &QFutureWatcher::finished, [watcher, callback] { +// QJSValue(callback).call(watcher->future().result()); +// }); +// return QtConcurrent::run([this, function] { +// QJSValueList result; +// try +// { +// result = function(); +// } +// catch (const std::exception &exception) +// { +// qWarning() << "Exception thrown from async function: " << exception.what(); +// } +// done(); +// return result; +// }); +// }); +//} + +bool FutureScheduler::add() noexcept +{ + QMutexLocker locker(&Mutex); + + if (Stopping) + { + return false; + } + + ++Alive; + return true; +} + +void FutureScheduler::done() noexcept +{ + { + QMutexLocker locker(&Mutex); + --Alive; + } + + Condition.wakeAll(); +} diff --git a/src/utils/scheduler.h b/src/utils/scheduler.h new file mode 100644 index 0000000..e13c3f5 --- /dev/null +++ b/src/utils/scheduler.h @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2014-2020, The Monero Project. + +#ifndef FUTURE_SCHEDULER_H +#define FUTURE_SCHEDULER_H + +#include + +#include +#include +//#include +#include +#include +#include +#include + +class FutureScheduler : public QObject +{ + Q_OBJECT + +public: + FutureScheduler(QObject *parent); + ~FutureScheduler(); + + void shutdownWaitForFinished() noexcept; + + QPair> run(std::function function) noexcept; + // QPair> run(std::function function, const QJSValue &callback); + +private: + bool add() noexcept; + void done() noexcept; + + template + QPair> execute(std::function(QFutureWatcher *)> makeFuture) noexcept + { + if (add()) + { + try + { + auto *watcher = new QFutureWatcher(); + connect(watcher, &QFutureWatcher::finished, [watcher] { + watcher->deleteLater(); + }); + watcher->setFuture(makeFuture(watcher)); + return qMakePair(true, watcher->future()); + } + catch (const std::exception &exception) + { + qCritical() << "Failed to schedule async function: " << exception.what(); + done(); + } + } + + return qMakePair(false, QFuture()); + } + + QFutureWatcher schedule(std::function function); + //QFutureWatcher schedule(std::function function, const QJSValue &callback); + +private: + size_t Alive; + QWaitCondition Condition; + QMutex Mutex; + bool Stopping; +}; + +#endif // FUTURE_SCHEDULER_H diff --git a/src/utils/seeds.h b/src/utils/seeds.h new file mode 100644 index 0000000..c3805f1 --- /dev/null +++ b/src/utils/seeds.h @@ -0,0 +1,170 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_SEEDS_H +#define FEATHER_SEEDS_H + +#include +#include +#include +#include + +#include + +#include "networktype.h" +#include "libwalletqt/WalletManager.h" +#include "libwalletqt/Wallet.h" +#include "utils/utils.h" + + +struct RestoreHeightLookup { + NetworkType::Type type; + QMap data; + explicit RestoreHeightLookup(NetworkType::Type type) : type(type) {} + + unsigned int dateToRestoreHeight(unsigned int date) { + // restore height based on a given timestamp using a lookup + // table. If it cannot find the date in the lookup table, it + // will calculate the blockheight based off the last known + // date: ((now - lastKnownDate) / blockTime) - clearance + + if(this->type == NetworkType::TESTNET) return 1; + unsigned int blockTime = 120; + unsigned int blocksPerDay = 86400 / blockTime; + unsigned int blockCalcClearance = blocksPerDay * 5; + QList values = this->data.keys(); + if(date <= values.at(0)) + return this->data[values.at(0)]; + for(unsigned int i = 0; i != values.count(); i++) { + if(values[i] > date) { + return i - 1 < 0 ? this->data[values[i]] : this->data[values[i-1]] - blockCalcClearance; + } + } + + // lookup failed, calculate blockheight from last known checkpoint + unsigned int lastBlockHeightTime = values.at(values.count() - 1); + unsigned int lastBlockHeight = this->data[lastBlockHeightTime]; + unsigned int deltaTime = date - lastBlockHeightTime; + unsigned int deltaBlocks = deltaTime / blockTime; + unsigned int blockHeight = (lastBlockHeight + deltaBlocks) - blockCalcClearance; + qDebug() << "Calculated blockheight: " << blockHeight << " from epoch " << date; + return blockHeight; + } + + unsigned int restoreHeightToDate(unsigned int height) { + // @TODO: most likely inefficient, refactor + QMap::iterator i; + unsigned int timestamp = 0; + for (i = this->data.begin(); i != this->data.end(); ++i) { + unsigned int ts = i.key(); + if (i.value() > height) + return timestamp; + timestamp = ts; + } + return timestamp; + } + + static RestoreHeightLookup *fromFile(const QString &fn, NetworkType::Type type) { + // initialize this class using a lookup table, e.g `:/assets/restore_heights_monero_mainnet.txt`/ + auto rtn = new RestoreHeightLookup(type); + auto data = Utils::barrayToString(Utils::fileOpen(fn)); + QMap _data; + for(const auto &line: data.split('\n')) { + if(line.trimmed().isEmpty()) continue; + auto spl = line.trimmed().split(':'); + rtn->data[spl.at(0).toUInt()] = spl.at(1).toUInt(); + } + return rtn; + } +}; + +struct FeatherSeed { + QString mnemonicSeed; + QString spendKey; + time_t time = 0; + unsigned int restoreHeight = 0; + RestoreHeightLookup *lookup = nullptr; + QString language = "English"; + std::string coinName; + explicit FeatherSeed(RestoreHeightLookup *lookup, const std::string &coinName = "monero") : lookup(lookup), coinName(coinName) {} + + static FeatherSeed fromSeed(RestoreHeightLookup *lookup, + const std::string &coinName, + const std::string &mnemonicSeed) { + + auto rtn = FeatherSeed(lookup, coinName); + rtn.coinName = coinName; + rtn.lookup = lookup; + rtn.mnemonicSeed = QString::fromStdString(mnemonicSeed); + + if(QString::fromStdString(mnemonicSeed).split(" ").count() == 14) { + monero_seed seed(mnemonicSeed, coinName); + std::stringstream buffer; + buffer << seed.key(); + rtn.time = seed.date(); + rtn.setRestoreHeight(); + rtn.spendKey = QString::fromStdString(buffer.str()); + } + return rtn; + } + + static FeatherSeed generate(RestoreHeightLookup *lookup, const std::string &coinName) { + auto rtn = FeatherSeed(lookup, coinName); + time_t _time = std::time(nullptr); + monero_seed seed(_time, coinName); + + std::stringstream buffer; + buffer << seed; + rtn.mnemonicSeed = QString::fromStdString(buffer.str()); + buffer.str(std::string()); + buffer << seed.key(); + rtn.spendKey = QString::fromStdString(buffer.str()); + rtn.time = _time; + rtn.setRestoreHeight(); + return rtn; + } + + Wallet *writeWallet(WalletManager *manager, NetworkType::Type type, const QString &path, const QString &password, unsigned int kdfRounds) { + // writes both 14/25 word mnemonic seeds. + Wallet *wallet = nullptr; + if(this->lookup == nullptr) return wallet; + if(this->mnemonicSeed.split(" ").count() == 14) { + if(this->spendKey.isEmpty()) { + auto _seed = FeatherSeed::fromSeed(this->lookup, this->coinName, this->mnemonicSeed.toStdString()); + _seed.setRestoreHeight(); + this->time = _seed.time; + this->restoreHeight = _seed.restoreHeight; + this->spendKey = _seed.spendKey; + } + wallet = manager->createDeterministicWalletFromSpendKey(path, password, this->language, type, this->spendKey, this->restoreHeight, (quint64)kdfRounds); + wallet->setCacheAttribute("feather.seed", this->mnemonicSeed); + } else { + wallet = manager->recoveryWallet(path, password, this->mnemonicSeed, "", type, this->restoreHeight, (quint64) kdfRounds); + } + + wallet->setPassword(password); + return wallet; + } + + unsigned int setRestoreHeight() { + if(this->lookup == nullptr) return 1; + if(this->time == 0) return 1; + this->restoreHeight = this->lookup->dateToRestoreHeight((unsigned int)this->time); + return this->restoreHeight; + } + + unsigned int setRestoreHeight(unsigned int height) { + auto now = (unsigned int)std::time(nullptr); + auto nowClearance = 3600 * 24; + auto currentBlockHeight = this->lookup->dateToRestoreHeight(now - nowClearance); + if(height >= currentBlockHeight + nowClearance) { + qCritical() << "unrealistic restore height detected, setting to current blockheight instead: " << currentBlockHeight; + this->restoreHeight = currentBlockHeight; + } else + this->restoreHeight = height; + + return this->restoreHeight; + } +}; + +#endif //FEATHER_SEEDS_H diff --git a/src/utils/tails.cpp b/src/utils/tails.cpp new file mode 100644 index 0000000..8e90149 --- /dev/null +++ b/src/utils/tails.cpp @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include +#include +#include +#include +#include + +#include "tails.h" +#include "utils.h" + +const QString TailsOS::tailsPathData = QString("/live/persistence/TailsData_unlocked/"); + +bool TailsOS::detect() +{ + if (!Utils::fileExists("/etc/os-release")) + return false; + + QByteArray data = Utils::fileOpen("/etc/os-release"); + QRegularExpression re("TAILS_PRODUCT_NAME=\"Tails\""); + QRegularExpressionMatch os_match = re.match(data); + bool matched = os_match.hasMatch(); + + if (matched) + qDebug() << "Tails OS detected"; + + return matched; +} + +bool TailsOS::detectDataPersistence() +{ + return QDir(QDir::homePath() + "/Persistent").exists(); +} + +bool TailsOS::detectDotPersistence() +{ + return QDir(tailsPathData + "dotfiles").exists(); +} + +void TailsOS::showDataPersistenceDisabledWarning() +{ + QMessageBox msgBox; + msgBox.setText(QObject::tr("Warning: persistence disabled")); + msgBox.setWindowTitle(QObject::tr("Warning: persistence disabled")); + msgBox.setInformativeText( + QObject::tr("Feather has detected that Tails persistence is " + "currently disabled. Any configurations and wallets you make inside " + "Feather will not be permanently saved." + "\n\n" + "Make sure to not save your wallet on the " + "filesystem, as it will be lost at shutdown." + "\n\n" + "To enable Tails persistence, setup an encrypted volume " + "and restart Tails. To gain a startup menu item, " + "enable dotfiles persistence.")); + + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setDefaultButton(QMessageBox::Ok); + msgBox.setIconPixmap(QPixmap(":/images/tails-grey.png")); + msgBox.exec(); +} + +void TailsOS::persistXdgMime(const QString &filePath, const QString &data) +{ + QFileInfo file(filePath); + QString tailsPath = tailsPathData + "dotfiles/.local/share/applications/"; + + // write to persistent volume +#ifdef QT_DEBUG + qDebug() << "Writing xdg mime: " << tailsPath + file.fileName(); +#endif + + QDir().mkpath(tailsPath); // ensure directory exists + Utils::fileWrite(tailsPath + file.fileName(), data); + + // write to current session +#ifdef QT_DEBUG + qDebug() << "Writing xdg mime: " << file.filePath(); +#endif + + QDir().mkpath(file.path()); // ensure directory exists + Utils::fileWrite(file.filePath(), data); +} diff --git a/src/utils/tails.h b/src/utils/tails.h new file mode 100644 index 0000000..068c59a --- /dev/null +++ b/src/utils/tails.h @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef TAILSOS_H +#define TAILSOS_H + +#include + + +class TailsOS +{ +public: + static bool detect(); + static bool detectDataPersistence(); + static bool detectDotPersistence(); + + static void showDataPersistenceDisabledWarning(); + static void askPersistence(); + static void persistXdgMime(const QString& filePath, const QString& data); + + static bool usePersistence; + static bool rememberChoice; + static const QString tailsPathData; +}; + +#endif // TAILSOS_H diff --git a/src/utils/textedit.cpp b/src/utils/textedit.cpp new file mode 100644 index 0000000..3fd7de5 --- /dev/null +++ b/src/utils/textedit.cpp @@ -0,0 +1,168 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "textedit.h" +#include +#include +#include +#include +#include +#include +#include +#include + + +TextEdit::TextEdit(QWidget *parent) : QTextEdit(parent) { } + +TextEdit::~TextEdit() { } + +void TextEdit::setCompleter(QCompleter *completer) { + if (c) + c->disconnect(this); + + c = completer; + + if (!c) + return; + + c->setWidget(this); + c->setCompletionMode(QCompleter::PopupCompletion); + c->setCaseSensitivity(Qt::CaseInsensitive); + QObject::connect(c, QOverload::of(&QCompleter::activated), + this, &TextEdit::insertCompletion); +} + +QCompleter *TextEdit::completer() const { + return c; +} + +void TextEdit::insertCompletion(const QString &completion) { + if (c->widget() != this) + return; + QTextCursor tc = textCursor(); + int extra = completion.length() - c->completionPrefix().length(); + tc.movePosition(QTextCursor::Left); + tc.movePosition(QTextCursor::EndOfWord); + tc.insertText(completion.right(extra)); + setTextCursor(tc); +} + +QString TextEdit::textUnderCursor() const { + QTextCursor tc = textCursor(); + tc.select(QTextCursor::WordUnderCursor); + return tc.selectedText(); +} + +void TextEdit::focusInEvent(QFocusEvent *e) { + if (c) + c->setWidget(this); + QTextEdit::focusInEvent(e); +} + +void TextEdit::keyPressEvent(QKeyEvent *e) { + if (c && c->popup()->isVisible()) { + // The following keys are forwarded by the completer to the widget + switch (e->key()) { + case Qt::Key_Enter: + case Qt::Key_Return: + case Qt::Key_Escape: + case Qt::Key_Tab: + case Qt::Key_Backtab: + e->ignore(); + return; // let the completer do default behavior + default: + break; + } + } + + const bool isShortcut = (e->modifiers().testFlag(Qt::ControlModifier) && e->key() == Qt::Key_E); // CTRL+E + if (!c || !isShortcut) // do not process the shortcut when we have a completer + QTextEdit::keyPressEvent(e); + + const bool ctrlOrShift = e->modifiers().testFlag(Qt::ControlModifier) || + e->modifiers().testFlag(Qt::ShiftModifier); + if (!c || (ctrlOrShift && e->text().isEmpty())) + return; + + static QString eow("~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-="); // end of word + const bool hasModifier = (e->modifiers() != Qt::NoModifier) && !ctrlOrShift; + QString completionPrefix = textUnderCursor(); + + if (!isShortcut && (hasModifier || e->text().isEmpty()|| completionPrefix.length() < 3 + || eow.contains(e->text().right(1)))) { + c->popup()->hide(); + return; + } + + if (completionPrefix != c->completionPrefix()) { + c->setCompletionPrefix(completionPrefix); + c->popup()->setCurrentIndex(c->completionModel()->index(0, 0)); + } + QRect cr = cursorRect(); + cr.setWidth(c->popup()->sizeHintForColumn(0) + + c->popup()->verticalScrollBar()->sizeHint().width()); + c->complete(cr); // popup it up! +} + +QAbstractItemModel *TextEdit::modelFromFile(const QString& fileName, QCompleter *completer) { + QFile file(fileName); + if (!file.open(QFile::ReadOnly)) + return new QStringListModel(completer); + + QStringList words; + + while (!file.atEnd()) { + QByteArray line = file.readLine(); + if (!line.isEmpty()) + words << QString::fromUtf8(line.trimmed()); + } + + return new QStringListModel(words, completer); +} diff --git a/src/utils/textedit.h b/src/utils/textedit.h new file mode 100644 index 0000000..d4e067e --- /dev/null +++ b/src/utils/textedit.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef TEXTEDIT_H +#define TEXTEDIT_H + +#include +#include +#include + +QT_BEGIN_NAMESPACE +class QCompleter; +QT_END_NAMESPACE + + +class TextEdit : public QTextEdit { + Q_OBJECT + +public: + TextEdit(QWidget *parent = nullptr); + ~TextEdit(); + + void setCompleter(QCompleter *c); + QCompleter *completer() const; + static QAbstractItemModel *modelFromFile(const QString& fileName, QCompleter *completer); + +protected: + void keyPressEvent(QKeyEvent *e) override; + void focusInEvent(QFocusEvent *e) override; + +private slots: + void insertCompletion(const QString &completion); + +private: + QString textUnderCursor() const; + +private: + QCompleter *c = nullptr; +}; + +#endif // TEXTEDIT_H + diff --git a/src/utils/tor.cpp b/src/utils/tor.cpp new file mode 100644 index 0000000..280a989 --- /dev/null +++ b/src/utils/tor.cpp @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include +#include +#include +#include +#include +#include "utils/utils.h" +#include "utils/tor.h" +#include "appcontext.h" + +QString Tor::torHost = "127.0.0.1"; +quint16 Tor::torPort = 9050; + +Tor::Tor(AppContext *ctx, QObject *parent) + : QObject(parent) + , m_ctx(ctx) + , m_checkConnectionTimer(new QTimer(this)) +{ + connect(m_checkConnectionTimer, &QTimer::timeout, this, &Tor::checkConnection); + + this->torDir = QDir(m_ctx->configDirectory).filePath("tor"); + this->torDataPath = QDir(this->torDir).filePath("data"); + + if (m_ctx->cmdargs->isSet("tor-port")) { + Tor::torPort = m_ctx->cmdargs->value("tor-port").toUShort(); + this->localTor = true; + if (!Utils::portOpen(Tor::torHost, Tor::torPort)) { + this->errorMsg = QString("--tor-port was specified but no running Tor instance was found on port %1.").arg(QString::number(Tor::torPort)); + } + return; + } + + // Assume Tor is already running + this->localTor = m_ctx->cmdargs->isSet("use-local-tor"); + if (this->localTor && !Utils::portOpen(Tor::torHost, Tor::torPort)) { + this->errorMsg = "--use-local-tor was specified but no running Tor instance found."; + } + if (m_ctx->isTorSocks || m_ctx->isTails || m_ctx->isWhonix || Utils::portOpen(Tor::torHost, Tor::torPort)) + this->localTor = true; + if (this->localTor) { + return; + } + + bool unpacked = this->unpackBins(); + if (!unpacked) { + qCritical() << "Feather built without embedded Tor. Assuming --use-local-tor"; + this->localTor = true; + return; + } + + qDebug() << "Using embedded tor instance"; + m_process.setProcessChannelMode(QProcess::MergedChannels); + + connect(&m_process, &QProcess::readyReadStandardOutput, this, &Tor::handleProcessOutput); + connect(&m_process, &QProcess::errorOccurred, this, &Tor::handleProcessError); + connect(&m_process, &QProcess::stateChanged, this, &Tor::stateChanged); +} + +void Tor::start() { + if (this->localTor) { + this->checkConnection(); + m_checkConnectionTimer->start(5000); + return; + } + + // Don't spawn Tor on default port to avoid conflicts + Tor::torPort = 19450; + + auto state = m_process.state(); + if (state == QProcess::ProcessState::Running || state == QProcess::ProcessState::Starting) { + this->errorMsg = "Can't start Tor, already running or starting"; + return; + } + + if (Utils::portOpen(Tor::torHost, Tor::torPort)) { + this->errorMsg = QString("Unable to start Tor on %1:%2. Port already in use.").arg(Tor::torHost, Tor::torPort); + return; + } + + qDebug() << QString("Start process: %1").arg(this->torPath); + + m_restarts += 1; + if (m_restarts > 4) { + this->errorMsg = "Tor failed to start: maximum retries exceeded"; + return; + } + + QStringList arguments; + + arguments << "--ignore-missing-torrc"; + arguments << "--SocksPort" << QString("%1:%2").arg(Tor::torHost, QString::number(Tor::torPort)); + arguments << "--TruncateLogFile" << "1"; + arguments << "--DataDirectory" << this->torDataPath; + arguments << "--Log" << "notice"; + arguments << "--pidfile" << QDir(this->torDataPath).filePath("tor.pid"); + + qDebug() << QString("%1 %2").arg(this->torPath, arguments.join(" ")); + + m_process.start(this->torPath, arguments); +} + +void Tor::stop() { + m_process.terminate(); +} + +void Tor::checkConnection() { + // We might not be able to connect to localhost if torsocks is used to start feather + if (m_ctx->isTorSocks) + this->setConnectionState(true); + + else if (m_ctx->isWhonix) + this->setConnectionState(true); + + else if (m_ctx->isTails) { + QStringList args = QStringList() << "--quiet" << "is-active" << "tails-tor-has-bootstrapped.target"; + int code = QProcess::execute("/bin/systemctl", args); + + this->setConnectionState(code == 0); + } + + else if (Utils::portOpen(Tor::torHost, Tor::torPort)) + this->setConnectionState(true); + + else + this->setConnectionState(false); +} + +void Tor::setConnectionState(bool connected) { + this->torConnected = connected; + emit connectionStateChanged(connected); +} + +void Tor::stateChanged(QProcess::ProcessState state) { + if(state == QProcess::ProcessState::Running) + qWarning() << "Tor started, awaiting bootstrap"; + else if (state == QProcess::ProcessState::NotRunning) { + this->setConnectionState(false); + + if (m_stopRetries) + return; + + QTimer::singleShot(1000, [=] { + this->start(); + }); + } +} + +void Tor::handleProcessOutput() { + QByteArray output = m_process.readAllStandardOutput(); + this->torLogs.append(Utils::barrayToString(output)); + emit logsUpdated(); + if(output.contains(QByteArray("Bootstrapped 100%"))) { + qDebug() << "Tor OK"; + this->setConnectionState(true); + } + + qDebug() << output; +} + +void Tor::handleProcessError(QProcess::ProcessError error) { + if (error == QProcess::ProcessError::Crashed) + qWarning() << "Tor crashed or killed"; + else if (error == QProcess::ProcessError::FailedToStart) { + this->errorMsg = "Tor binary failed to start: " + this->torPath; + this->m_stopRetries = true; + } +} + +bool Tor::unpackBins() { + QString torFile; +#if defined(Q_OS_MAC) || defined(Q_OS_LINUX) + torFile = ":/tor/tor"; +#elif defined(Q_OS_WIN) + torFile = ":/tor/tor.exe"; +#endif + + if (!Utils::fileExists(torFile)) + return false; + QFile f(torFile); + QFileInfo fileInfo(f); + this->torPath = QDir(this->torDir).filePath(fileInfo.fileName()); + qDebug() << this->torPath; + f.copy(torPath); + f.close(); + +#if defined(Q_OS_UNIX) + QFile torBin(this->torPath); + torBin.setPermissions(QFile::ExeGroup | QFile::ExeOther | QFile::ExeOther | QFile::ExeUser); +#endif + + return true; +} + +networkPeer Tor::getPeerFromConfig(const QString &path) { + // parse Tor bind addr from given Tor config + QRegularExpression re("^SocksPort ([\\d|.|:]+)"); + + networkPeer peer; + peer.host = "127.0.0.1"; + peer.port = 9050; + + if(!Utils::fileExists(path)) { + peer.active = Utils::portOpen(peer.host, peer.port); + return peer; + } + + for(const auto &line: Utils::fileOpen(path).split('\n')) { + QRegularExpressionMatch match = re.match(line); + if(!match.hasMatch()) + continue; + + QString match_group = match.captured(1); + int host_idx = match_group.indexOf(':'); + if(host_idx >= 1){ + peer.host = match_group.mid(0, host_idx); + QString port = match_group.mid(host_idx + 1); + if(!Utils::isDigit(port)) + continue; + + peer.port = (quint16)port.toInt(); + qDebug() << "Parsed port from local Tor config"; + break; + } + + if(Utils::isDigit(match_group)) { + peer.port = (quint16)match_group.toInt(); + qDebug() << "Parsed port from local Tor config"; + break; + } + } + + peer.active = Utils::portOpen(peer.host, peer.port); + return peer; +} + +QString Tor::getVersion() { + QProcess process; + process.setProcessChannelMode(QProcess::MergedChannels); + process.start(this->torPath, QStringList() << "--version"); + process.waitForFinished(-1); + QString output = process.readAllStandardOutput(); + + if(output.isEmpty()) { + qWarning() << "Could not grab Tor version"; + return ""; + } + QString version = output.split('\n').at(0); + if(version.startsWith("Tor version")){ + return version; + } else { + qWarning() << "Could not parse Tor version"; + return ""; + } +} diff --git a/src/utils/tor.h b/src/utils/tor.h new file mode 100644 index 0000000..1b33aed --- /dev/null +++ b/src/utils/tor.h @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_TOR_H +#define FEATHER_TOR_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "utils/childproc.h" + +class Tor : public QObject +{ +Q_OBJECT + +public: + explicit Tor(AppContext *ctx, QObject *parent = nullptr); + + void start(); + void stop(); + bool unpackBins(); + QString getVersion(); + networkPeer getPeerFromConfig(const QString &path); + + bool torConnected = false; + bool localTor = false; + QString torDir; + QString torPath; + QString torDataPath; + + static QString torHost; + static quint16 torPort; + + QString torLogs; + QString errorMsg = ""; + +signals: + void connectionStateChanged(bool connected); + void startupFailure(QString reason); + void logsUpdated(); + +private slots: + void stateChanged(QProcess::ProcessState); + void handleProcessOutput(); + void handleProcessError(QProcess::ProcessError error); + void checkConnection(); + +private: + void setConnectionState(bool connected); + + ChildProcess m_process; + AppContext *m_ctx; + int m_restarts = 0; + bool m_stopRetries = false; + QTimer *m_checkConnectionTimer; +}; + +class AppContext; // forward declaration + +#endif //FEATHER_TOR_H \ No newline at end of file diff --git a/src/utils/txfiathistory.cpp b/src/utils/txfiathistory.cpp new file mode 100644 index 0000000..8d82271 --- /dev/null +++ b/src/utils/txfiathistory.cpp @@ -0,0 +1,116 @@ +#include +#include +#include +#include +#include + +#include "txfiathistory.h" +#include "utils/utils.h" + +TxFiatHistory::TxFiatHistory(unsigned int genesis_timestamp, const QString &configDirectory, QObject *parent) : + QObject(parent), + m_genesis_timestamp(genesis_timestamp), + m_configDirectory(configDirectory) { + m_databasePath = QString("%1fiatHistory.db").arg(configDirectory); + this->loadDatabase(); +} + +double TxFiatHistory::get(unsigned int timestamp) { + QDateTime ts; + ts.setTime_t(timestamp); + auto key = ts.toString("yyyyMMdd"); + return this->get(key); // USD +} + +double TxFiatHistory::get(const QString &date) { + if(m_database.contains(date)) + return m_database[date]; // USD + return 0.0; +} + +void TxFiatHistory::loadDatabase() { + if(!Utils::fileExists(m_databasePath)) + return; + + m_database.clear(); + QString contents = Utils::barrayToString(Utils::fileOpen(m_databasePath)); + for(auto &line: contents.split("\n")){ + line = line.trimmed(); + if(line.isEmpty()) continue; + auto spl = line.split(":"); + m_database[spl.at(0)] = spl.at(1).toDouble(); + } +} + +void TxFiatHistory::writeDatabase() { + QString data; + for(const auto &line: m_database.toStdMap()) + data += QString("%1:%2\n").arg(line.first).arg(QString::number(line.second)); + Utils::fileWrite(m_databasePath, data); +} + +void TxFiatHistory::onUpdateDatabase() { + // update local txFiatHistory database + if(m_initialized) return; + + QDateTime genesis; + genesis.setTime_t(m_genesis_timestamp); + auto genesis_date = genesis.date(); + + auto now = QDate::currentDate(); + auto nowKey = now.toString("yyyyMMdd"); + unsigned int year = genesis.toString("yyyy").toUInt(); + auto yearCurrent = now.year(); + + // if current year is genesis year we'll refresh regardless. + if(yearCurrent == genesis_date.year()) { + emit requestYear(year); + m_initialized = true; + return; + } + + // keep local fiatTxHistory database up to date, loop for missing dates + for(year; year != yearCurrent + 1; year += 1){ + for(unsigned int month = 1; month != 13; month++) { + if(year == yearCurrent && month == now.month() && now.day() == 1) break; + QDateTime _now; + _now.setDate(QDate(year, month, 1)); + if(_now.toSecsSinceEpoch() < m_genesis_timestamp) continue; + if(_now.toSecsSinceEpoch() > std::time(nullptr) - 86400) continue; + QString key = ""; + + // genesis year we'll only fetch once + if(year == genesis_date.year()){ + key = QString("%1%2%3").arg(year).arg(12).arg("31"); + if(!m_database.contains(key)) + emit requestYear(year); + break; + } + + auto _month = QString::number(month); + if(_month.length() == 1) + _month = QString("0%1").arg(_month); // how2fill + + key = QString("%1%2%3").arg(year).arg(_month).arg("01"); + if(!m_database.contains(key)){ + if(year != yearCurrent) { + emit requestYear(year); + break; + } else + emit requestYearMonth(year, month); + } else if (year == yearCurrent && month == now.month() && !m_database.contains(nowKey)) + emit requestYearMonth(year, month); + } + } + + m_initialized = true; +} + +void TxFiatHistory::onWSData(const QJsonObject &data) { + foreach(const QString &key, data.keys()) { + QJsonValue value = data.value(key); + m_database[key] = value.toDouble(); + } + + this->writeDatabase(); +} diff --git a/src/utils/txfiathistory.h b/src/utils/txfiathistory.h new file mode 100644 index 0000000..632c581 --- /dev/null +++ b/src/utils/txfiathistory.h @@ -0,0 +1,31 @@ +#ifndef FEATHER_TXFIATHISTORY_H +#define FEATHER_TXFIATHISTORY_H + + +class TxFiatHistory : public QObject { + Q_OBJECT + +public: + explicit TxFiatHistory(unsigned int genesis_timestamp, const QString &configDirectory, QObject *parent = nullptr); + double get(const QString &date); + double get(unsigned int timestamp); + +public slots: + void onUpdateDatabase(); + void onWSData(const QJsonObject &data); + +signals: + void requestYear(unsigned int year); + void requestYearMonth(unsigned int year, unsigned int month); + +private: + void loadDatabase(); + void writeDatabase(); + QString m_databasePath; + QString m_configDirectory; + bool m_initialized = false; + QMap m_database; + unsigned int m_genesis_timestamp; +}; + +#endif //FEATHER_TXFIATHISTORY_H diff --git a/src/utils/utils.cpp b/src/utils/utils.cpp new file mode 100644 index 0000000..0ee8f1e --- /dev/null +++ b/src/utils/utils.cpp @@ -0,0 +1,552 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "utils.h" +#include "utils/config.h" +#include "utils/tails.h" + +// Application log for current session +QVector applicationLog = QVector(); // todo: replace with ring buffer +QMutex logMutex; + +void Utils::openWindow(QWidget *w) { + auto first_screen = QApplication::screens()[0]; + w->setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, w->size(), first_screen->availableGeometry())); + w->show(); +} + +bool Utils::fileExists(const QString &path) { + QFileInfo check_file(path); + return check_file.exists() && check_file.isFile(); +} + +bool Utils::dirExists(const QString &path) { + QDir pathDir(path); + return pathDir.exists(); +} + +QByteArray Utils::fileOpen(const QString &path) { + QFile file(path); + if(!file.open(QFile::ReadOnly | QFile::Text)) { + return QByteArray(); + } + + QByteArray data = file.readAll(); + file.close(); + return data; +} + +QByteArray Utils::fileOpenQRC(const QString &path) { + QFile file(path); + if(!file.open(QIODevice::ReadOnly)) { + qDebug() << "error: " << file.errorString(); + } + + QByteArray data = file.readAll(); + file.close(); + return data; +} + +bool Utils::fileWrite(const QString &path, const QString &data) { + QFile file(path); + if(file.open(QIODevice::WriteOnly)){ + QTextStream out(&file); out << data << endl; + file.close(); + return true; + } + return false; +} + +QString Utils::systemAccountName(){ + QString accountName = qgetenv("USER"); // mac/linux + if (accountName.isEmpty()) + return qgetenv("USERNAME"); // Windows + if (accountName.isEmpty()) + qDebug() << "accountName was empty"; + + return ""; +} + +bool Utils::validateJSON(const QByteArray &blob) { + QJsonDocument doc = QJsonDocument::fromJson(blob); + QString jsonString = doc.toJson(QJsonDocument::Indented); + return !jsonString.isEmpty(); +} + +bool Utils::readJsonFile(QIODevice &device, QSettings::SettingsMap &map) { + QJsonDocument json = QJsonDocument::fromJson(device.readAll()); + map = json.object().toVariantMap(); + return true; +} + +bool Utils::writeJsonFile(QIODevice &device, const QSettings::SettingsMap &map) { + device.write(QJsonDocument(QJsonObject::fromVariantMap(map)).toJson()); + return true; +} + +QStringList Utils::readJsonStringToQStringList(const QString &input) { + QStringList data; + + QJsonDocument doc = QJsonDocument::fromJson(input.toUtf8()); + QJsonObject object = doc.object(); + QJsonArray array = doc.array(); + + for(auto &&entry: array) + data << entry.toString(); + return data; +} + +void Utils::applicationLogHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) { + const QString fn = context.function ? QString::fromUtf8(context.function) : ""; + const QString date = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"); + QString line; + + switch (type) { + case QtDebugMsg: + line = QString("[%1 D] %2(:%3) %4\n").arg(date).arg(fn).arg(context.line).arg(msg); + fprintf(stderr, "%s", line.toLatin1().data()); + break; + case QtInfoMsg: + line = QString("[%1 I] %2\n").arg(date).arg(msg); + fprintf(stdout, "%s", line.toLatin1().data()); + break; + case QtWarningMsg: + line = QString("[%1 W] %2(:%3) %4\n").arg(date).arg(fn).arg(context.line).arg(msg); + fprintf(stdout, "%s", line.toLatin1().data()); + break; + case QtCriticalMsg: + line = QString("[%1 C] %2(:%3) %4\n").arg(date).arg(fn).arg(context.line).arg(msg); + fprintf(stderr, "%s", line.toLatin1().data()); + break; + case QtFatalMsg: + line = QString("[%1 F] %2(:%3) %4\n").arg(date).arg(fn).arg(context.line).arg(msg); + fprintf(stderr, "%s", line.toLatin1().data()); + break; + } + + auto message = logMessage(type, line, fn); + + { + QMutexLocker locker(&logMutex); + applicationLog.append(message); + } + + + //emit applicationLogUpdated(message); +} + +QByteArray Utils::zipExtract(const QString &path, const QString& destination) { + Q_UNUSED(path) + Q_UNUSED(destination) + return QByteArray(); +} + +bool Utils::isDigit(const QString& inp) { + for (auto &&i : inp) { + if(!i.isDigit()) return false; + } + return true; +} + +void Utils::desktopNotify(const QString &title, const QString &message, int duration) { + QStringList notify_send = QStringList() << title << message << "-t" << QString::number(duration); + QStringList kdialog = QStringList() << title << message; + QStringList macos = QStringList() << "-e" << QString(R"(display notification "%1" with title "%2")").arg(message).arg(title); +#if defined(Q_OS_LINUX) + QProcess process; + if (Utils::fileExists("/usr/bin/kdialog")) + process.start("/usr/bin/kdialog", kdialog); + else if (Utils::fileExists("/usr/bin/notify-send")) + process.start("/usr/bin/notify-send", notify_send); + process.waitForFinished(-1); + QString stdout = process.readAllStandardOutput(); + QString stderr = process.readAllStandardError(); +#elif defined(Q_OS_MACOS) + QProcess process; + // @TODO: need to escape special chars with \ + process.start("osascript", macos); + process.waitForFinished(-1); + QString stdout = process.readAllStandardOutput(); + QString stderr = process.readAllStandardError(); +#endif +} + +bool Utils::portOpen(const QString &hostname, quint16 port){ + QTcpSocket socket; + socket.connectToHost(hostname, port); + return socket.waitForConnected(600); +} + +QString Utils::barrayToString(const QByteArray &data) { + return QString(QTextCodec::codecForMib(106)->toUnicode(data)); +} + +QByteArray Utils::readSocket(QTcpSocket &socket, int buffer_size) { + QByteArray data; + if(!socket.waitForReadyRead(6000)) + return data; + + while(buffer_size > 0 && socket.bytesAvailable() > 0){ + QByteArray _data = socket.read(buffer_size); + buffer_size -= _data.size(); + data += _data; + } + + return data; +} + +bool Utils::testSocks5(const QString &host, quint16 port){ + // synchronous socks5 tester + QByteArray data; + QTcpSocket socket; + socket.connectToHost(host, port); + if (!socket.waitForConnected(1000)) { + qDebug() << QString("could not connect to %1 %2") + .arg(host).arg(port); + socket.close(); + return false; + } + + // latest & greatest + socket.write(QByteArray("\x05\x02", 2)); + socket.flush(); + + // no auth pl0x + socket.write(QByteArray("\x00\x01", 2)); + socket.flush(); + + // cool story + if(Utils::readSocket(socket, 2).isEmpty()){ + qDebug() << "socks response timeout"; + socket.close(); + return false; + } + + // pls sir + socket.write(QByteArray("\x05\x01\x00\x03", 4)); + + // here we go!! + socket.write(QByteArray("\x16", 1)); // len + socket.write(QByteArray("kebjllr47c2ouoly.onion")); + socket.write(QByteArray("\x00\x50", 2)); // port + socket.flush(); + + // fingers crossed + auto result = Utils::readSocket(socket, 10); + qDebug() << result; + if(result.length() != 10 || result.at(1) != 0) { + qDebug() << "bad socks response"; + socket.close(); + return false; + } + + // can haz? + QByteArray http("GET /api/v1/ping HTTP/1.1\r\nHost: kebjllr47c2ouoly.onion\r\nConnection: close\r\n\r\n"); + socket.write(http); + + auto resp = Utils::readSocket(socket, 555); + QRegularExpression re(R"(^HTTP\/\d.\d 200 OK)"); + QRegularExpressionMatch match = re.match(resp); + if(match.hasMatch()){ + socket.close(); + return true; + } + + qDebug() << resp; + + socket.close(); + return false; +} + +void Utils::externalLinkWarning(const QString &url){ + if(!config()->get(Config::warnOnExternalLink).toBool()) { + QDesktopServices::openUrl(QUrl(url)); + return; + } + + QString body = "You are about to open the following link:\n\n"; + body += QString("%1\n\n").arg(url); + body += "You will NOT be using Tor."; + + switch (Utils::showMessageBox("External link warning", body, true)) { + case QMessageBox::Cancel: + break; + default: + QDesktopServices::openUrl(QUrl(url)); + break; + } +} + +QStringList Utils::fileFind(const QRegExp &pattern, const QString &baseDir, int level, int depth, const int maxPerDir) { + // like `find /foo -name -maxdepth 2 "*.jpg"` + QStringList rtn; + QDir dir(baseDir); + dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoSymLinks | QDir::NoDot | QDir::NoDotDot); + + int fileCount = 0; + for(const auto &fileInfo: dir.entryInfoList({"*"})) { + fileCount += 1; + if(fileCount > maxPerDir) return rtn; + if(!fileInfo.isReadable()) + continue; + + const auto fn = fileInfo.fileName(); + const auto path = fileInfo.filePath(); + + if (fileInfo.isDir()) { + if (level + 1 <= depth) + rtn << Utils::fileFind(pattern, path, level + 1, depth, maxPerDir); + } + else if (pattern.exactMatch(fn)) + rtn << path; + } + return rtn; +} + +bool Utils::walletExists(QString name, const QString &path) { + name = name.replace(".keys", ""); + auto walletPath = QDir(path).filePath(name + ".keys"); + return Utils::fileExists(walletPath); +} + +int Utils::showMessageBox(const QString &windowTitle, const QString &body, bool warning){ + QMessageBox msgBox(QApplication::activeWindow()); + msgBox.setWindowTitle(windowTitle); + msgBox.setText(body); + msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Ok); + + QPixmap iconWarning = QPixmap(":/assets/images/ghost.png") + .scaled(QSize(48,48), Qt::KeepAspectRatio, Qt::SmoothTransformation); + QPixmap iconInfo = QPixmap(":/assets/images/info.png") + .scaled(QSize(48,48), Qt::KeepAspectRatio, Qt::SmoothTransformation); + + if(warning) + msgBox.setIconPixmap(iconWarning); + else + msgBox.setIconPixmap(iconInfo); + + return msgBox.exec(); +} + +void Utils::copyToClipboard(const QString &string){ + QClipboard * clipboard = QApplication::clipboard(); + if (!clipboard) { + qWarning() << "Unable to access clipboard"; + return; + } + clipboard->setText(string, QClipboard::Clipboard); + if (clipboard->supportsSelection()) + clipboard->setText(string, QClipboard::Selection); + +#if defined(Q_OS_LINUX) + QThread::msleep(1); +#endif +} + +QString Utils::blockExplorerLink(const QString &blockExplorer, NetworkType::Type nettype, const QString &txid) { + if (blockExplorer == "exploremonero.com") { + if (nettype == NetworkType::MAINNET) { + return QString("https://exploremonero.com/transaction/%1").arg(txid); + } + } + else if (blockExplorer == "moneroblocks.info") { + if (nettype == NetworkType::MAINNET) { + return QString("https://moneroblocks.info/tx/%1").arg(txid); + } + } + + switch (nettype) { + case NetworkType::MAINNET: + return QString("https://xmrchain.net/tx/%1").arg(txid); + case NetworkType::STAGENET: + return QString("https://stagenet.xmrchain.net/tx/%1").arg(txid); + case NetworkType::TESTNET: + return QString("https://testnet.xmrchain.net/tx/%1").arg(txid); + } + + return QString(""); +} + +QList Utils::procList() { + // windows maybe: https://stackoverflow.com/a/13635377/2054778 + QList rtn; + QProcess process; +#if defined(Q_OS_MAC) || defined(Q_OS_LINUX) +#if defined(Q_OS_MAC) + process.start("ps", QStringList() << "-wwaxo" << "pid,command"); +#elif defined(Q_OS_LINUX) + process.start("ps", QStringList() << "-wwaxo" << "pid,command"); +#endif + process.waitForFinished(-1); + + QString stdout = process.readAllStandardOutput(); + QString stderr = process.readAllStandardError(); + + if(stdout.isEmpty()) + return rtn; + + QStringList spl = stdout.split("\n"); + if(spl.count() >= 1) + spl.removeAt(0); + + for (auto& line: spl) { + line = line.trimmed(); + if(line.isEmpty()) + continue; + + QStringList _spl = line.split(" "); + processStruct ps; + if(_spl.length() >= 2) { + ps.pid = _spl.at(0).toInt(); + ps.command = _spl.at(1); + rtn.append(ps); + } + } +#endif + return rtn; +} + +QStandardItem *Utils::qStandardItem(const QString& text) { + auto font = QApplication::font(); + return Utils::qStandardItem(text, font); +} + +QStandardItem *Utils::qStandardItem(const QString& text, QFont &font) { + // stupid Qt doesnt set font sizes correctly on OSX + // @TODO: memleak + auto item = new QStandardItem(text); + item->setFont(font); + return item; +} + +QString Utils::getUnixAccountName() { + QString accountName = qgetenv("USER"); // mac/linux + if (accountName.isEmpty()) + accountName = qgetenv("USERNAME"); // Windows + if (accountName.isEmpty()) + throw std::runtime_error("Could derive system account name from env vars: USER or USERNAME"); + return accountName; +} + +QString Utils::xdgDesktopEntry(){ + return QString( + "[Desktop Entry]\n" + "Name=Feather\n" + "GenericName=Feather\n" + "X-GNOME-FullName=Feather\n" + "Comment=a free Monero desktop wallet\n" + "Keywords=Monero;\n" + "Exec=\"%1\" %u\n" + "Terminal=false\n" + "Type=Application\n" + "Icon=monero\n" + "Categories=Network;GNOME;Qt;\n" + "StartupNotify=true\n" + "X-GNOME-Bugzilla-Bugzilla=GNOME\n" + "X-GNOME-UsesNotifications=true\n" + ).arg(QApplication::applicationFilePath()); +} + +bool Utils::xdgDesktopEntryWrite(const QString &path){ + QString mime = xdgDesktopEntry(); + QFileInfo file(path); + QDir().mkpath(file.path()); + qDebug() << "Writing xdg desktop entry: " << path; + return Utils::fileWrite(path, mime); +} + +void Utils::xdgRefreshApplications(){ + QStringList args = {QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation)}; + QProcess process; + process.start("update-desktop-database", args); + process.waitForFinished(2500); + process.close(); +} + +bool Utils::xdgDesktopEntryRegister() { +#if defined(Q_OS_MACOS) + return false; +#endif +#if defined(Q_OS_WIN) + // @TODO: implement + return false; +#endif + // no support for Tails here + if(TailsOS::detect()) return false; + + QString writeLocations = "Write locations:\n"; + writeLocations += QString("- %1\n").arg(xdgPaths.pathApp); + writeLocations += QString("- %1\n").arg(xdgPaths.pathIcon); + + QPixmap appIcon(":assets/images/feather.png"); + if (!Utils::fileExists(xdgPaths.pathIcon)) + Utils::pixmapWrite(xdgPaths.pathIcon, appIcon); + Utils::xdgDesktopEntryWrite(xdgPaths.pathApp); + Utils::xdgRefreshApplications(); + return true; +} + +bool Utils::pixmapWrite(const QString &path, const QPixmap &pixmap) { + qDebug() << "Writing xdg icon: " << path; + QFile file(path); + QFileInfo iconInfo(file); + QDir().mkpath(iconInfo.path()); + if(file.open(QIODevice::WriteOnly)){ + pixmap.save(&file, "PNG"); + file.close(); + return true; + } + return false; +} + +QFont Utils::relativeFont(int delta) { + auto font = QApplication::font(); + font.setPointSize(font.pointSize() + delta); + return font; +} + +double Utils::roundSignificant(double N, double n) +{ + int h; + double l, a, b, c, d, e, i, j, m, f, g; + b = N; + c = floor(N); + + for (i = 0; b >= 1; ++i) + b = b / 10; + + d = n - i; + b = N; + b = b * pow(10, d); + e = b + 0.5; + if ((float)e == (float)ceil(b)) { + f = (ceil(b)); + h = f - 2; + if (h % 2 != 0) { + e = e - 1; + } + } + j = floor(e); + m = pow(10, d); + j = j / m; + return j; +} \ No newline at end of file diff --git a/src/utils/utils.h b/src/utils/utils.h new file mode 100644 index 0000000..a91c539 --- /dev/null +++ b/src/utils/utils.h @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_UTILS_H +#define FEATHER_UTILS_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "networktype.h" + +struct logMessage +{ + logMessage(const QtMsgType &type, const QString &message, const QString &fn){ + logMessage::type = type; + logMessage::message = message; + logMessage::fn = fn; + } + QtMsgType type; + QString message; + QString fn; +}; + +struct networkPeer { + QString host; + quint16 port; + bool active = false; +}; + +struct processStruct { + int pid = 0; + QString command; + QFileInfo fileInfo; +}; + +struct xdgDesktopEntryPaths { + QString pathApp; + QString pathIcon; + QString PathMime; +}; + +const xdgDesktopEntryPaths xdgPaths = { + QString("%1/monero-gui.desktop").arg(QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation)), + QString("%1/.local/share/icons/monero.png").arg(QDir::homePath()), + QString("/") +}; + +class Utils +{ + +public: + static bool portOpen(const QString &hostname, quint16 port); + static bool isDigit(const QString &inp); + static bool fileExists(const QString &path); + static QByteArray fileOpen(const QString &path); + static QByteArray fileOpenQRC(const QString &path); + static void desktopNotify(const QString &title, const QString &message, int duration); + static bool fileWrite(const QString &path, const QString &data); + static QStringList fileFind(const QRegExp &pattern, const QString &baseDir, int level, int depth, int maxPerDir); + static QString systemAccountName(); + static QByteArray zipExtract(const QString &path, const QString& destination); + static bool validateJSON(const QByteArray &blob); + static bool readJsonFile(QIODevice &device, QSettings::SettingsMap &map); + static bool walletExists(QString name, const QString &path); + static bool writeJsonFile(QIODevice &device, const QSettings::SettingsMap &map); + static QStringList readJsonStringToQStringList(const QString &input); + static void applicationLogHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg); + static void openWindow(QWidget *w); + static void externalLinkWarning(const QString &url); + static int showMessageBox(const QString &windowTitle, const QString &body, bool warning); + static QList procList(); + static bool dirExists(const QString &path); + static QString barrayToString(const QByteArray &data); + static QByteArray readSocket(QTcpSocket &socket, int buffer_size); + static bool testSocks5(const QString &host, quint16 port); + static QStandardItem *qStandardItem(const QString &text); + static QStandardItem *qStandardItem(const QString &text, QFont &font); + static void copyToClipboard(const QString &string); + static QString blockExplorerLink(const QString &blockExplorer, NetworkType::Type nettype, const QString &txid); + static QString getUnixAccountName(); + static QString xdgDesktopEntry(); + static bool xdgDesktopEntryWrite(const QString &path); + static void xdgRefreshApplications(); + static bool xdgDesktopEntryRegister(); + static bool pixmapWrite(const QString &path, const QPixmap &pixmap); + static QFont relativeFont(int delta); + static double roundSignificant(double N, double n); + static QStringList randomHTTPAgents; + + template + static QString QtEnumToString (const QEnum value) + { + return QString::fromStdString(std::string(QMetaEnum::fromType().valueToKey(value))); + } +}; + +class AppContext; // forward declaration + + + +#endif //FEATHER_UTILS_H diff --git a/src/utils/whonix.cpp b/src/utils/whonix.cpp new file mode 100644 index 0000000..231073f --- /dev/null +++ b/src/utils/whonix.cpp @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "whonix.h" + +#include "utils/utils.h" + +bool WhonixOS::detect() { + return !QString::fromLocal8Bit(qgetenv("WHONIX")).isEmpty(); +} \ No newline at end of file diff --git a/src/utils/whonix.h b/src/utils/whonix.h new file mode 100644 index 0000000..3ad06a4 --- /dev/null +++ b/src/utils/whonix.h @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_WHONIX_H +#define FEATHER_WHONIX_H + + +struct WhonixOS { + static bool detect(); +}; + + +#endif //FEATHER_WHONIX_H diff --git a/src/utils/wsclient.cpp b/src/utils/wsclient.cpp new file mode 100644 index 0000000..fa3f690 --- /dev/null +++ b/src/utils/wsclient.cpp @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include +#include +#include +#include +#include +#include +#include "wsclient.h" +#include "appcontext.h" + + +WSClient::WSClient(AppContext *ctx, const QUrl &url, QObject *parent) : + QObject(parent), + url(url), + m_ctx(ctx) { + connect(&this->webSocket, &QWebSocket::binaryMessageReceived, this, &WSClient::onbinaryMessageReceived); + connect(&this->webSocket, &QWebSocket::connected, this, &WSClient::onConnected); + connect(&this->webSocket, &QWebSocket::disconnected, this, &WSClient::closed); + connect(&this->webSocket, QOverload::of(&QWebSocket::error), this, &WSClient::onError); + + m_tor = url.host().endsWith(".onion"); +} + +void WSClient::sendMsg(const QByteArray &data) { + auto state = this->webSocket.state(); + if(state == QAbstractSocket::ConnectedState) + this->webSocket.sendBinaryMessage(data); +} + +void WSClient::start() { + // connect & reconnect on errors/close +#ifdef QT_DEBUG + qDebug() << "WebSocket connect:" << url.url(); +#endif + if((m_tor && this->m_ctx->tor->torConnected) || !m_tor) + this->webSocket.open(QUrl(this->url)); + + if(!this->m_connectionTimer.isActive()) { + connect(&this->m_connectionTimer, &QTimer::timeout, this, &WSClient::checkConnection); + this->m_connectionTimer.start(2000); + } +} + +void WSClient::checkConnection() { + if(m_tor && !this->m_ctx->tor->torConnected) + return; + + auto state = this->webSocket.state(); + if(state == QAbstractSocket::UnconnectedState) { +#ifdef QT_DEBUG + qDebug() << "WebSocket reconnect"; +#endif + this->start(); + } +} + +void WSClient::onConnected() { +#ifdef QT_DEBUG + qDebug() << "WebSocket connected"; +#endif + emit connectionEstablished(); +} + +void WSClient::onError(QAbstractSocket::SocketError error) { + qCritical() << "WebSocket error: " << error; + auto state = this->webSocket.state(); + if(state == QAbstractSocket::ConnectedState || state == QAbstractSocket::ConnectingState) + this->webSocket.abort(); +} + +void WSClient::onbinaryMessageReceived(const QByteArray &message) { +#ifdef QT_DEBUG + qDebug() << "WebSocket received:" << message; +#endif + if (!Utils::validateJSON(message)) { + qCritical() << "Could not interpret WebSocket message as JSON"; + return; + } + + QJsonDocument doc = QJsonDocument::fromJson(message); + QJsonObject object = doc.object(); + if(!object.contains("cmd") || !object.contains("data")) { + qCritical() << "Invalid WebSocket message received"; + return; + } + + emit WSMessage(object); +} diff --git a/src/utils/wsclient.h b/src/utils/wsclient.h new file mode 100644 index 0000000..4e90298 --- /dev/null +++ b/src/utils/wsclient.h @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef ECHOCLIENT_H +#define ECHOCLIENT_H + +#include +#include +#include + +class AppContext; +class WSClient : public QObject +{ + Q_OBJECT + +public: + explicit WSClient(AppContext *ctx, const QUrl &url, QObject *parent = nullptr); + void start(); + void sendMsg(const QByteArray &data); + QWebSocket webSocket; + QUrl url; + +signals: + void closed(); + void connectionEstablished(); + void WSMessage(QJsonObject message); + +private slots: + void onConnected(); + void onbinaryMessageReceived(const QByteArray &message); + void checkConnection(); + void onError(QAbstractSocket::SocketError error); + +private: + QTimer m_connectionTimer; + AppContext *m_ctx; + bool m_tor = true; +}; + +#endif // ECHOCLIENT_H \ No newline at end of file diff --git a/src/utils/xmrto.cpp b/src/utils/xmrto.cpp new file mode 100644 index 0000000..11d467c --- /dev/null +++ b/src/utils/xmrto.cpp @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "xmrto.h" + +#include "utils/xmrtoorder.h" +#include "appcontext.h" + +QMap XmrTo::stateMap; + +XmrTo::XmrTo(AppContext *ctx, QObject *parent) : + QObject(parent), + m_ctx(ctx) { + + m_baseUrl = m_ctx->networkType == NetworkType::Type::MAINNET ? "https://xmr.to" : "https://test.xmr.to"; + + m_netTor = new UtilsNetworking(this->m_ctx->network); + m_netClear = new UtilsNetworking(this->m_ctx->networkClearnet); + + m_apiTor = new XmrToApi(this, m_netTor, m_baseUrl); + m_apiClear = new XmrToApi(this, m_netClear, m_baseUrl); + + connect(m_apiTor, &XmrToApi::ApiResponse, this, &XmrTo::onApiResponse); + connect(m_apiClear, &XmrToApi::ApiResponse, this, &XmrTo::onApiResponse); + + connect(this, &XmrTo::orderPaymentRequired, this->m_ctx, QOverload::of(&AppContext::onCreateTransaction)); + + XmrTo::stateMap[OrderState::Status_Idle] = "IDLE"; + XmrTo::stateMap[OrderState::Status_OrderCreating] = "CREATING"; + XmrTo::stateMap[OrderState::Status_OrderUnpaid] = "UNPAID"; + XmrTo::stateMap[OrderState::Status_OrderToBeCreated] = "TO_BE_CREATED"; + XmrTo::stateMap[OrderState::Status_OrderUnderPaid] = "UNDERPAID"; + XmrTo::stateMap[OrderState::Status_OrderPaidUnconfirmed] = "PAID_UNCONFIRMED"; + XmrTo::stateMap[OrderState::Status_OrderPaid] = "PAID"; + XmrTo::stateMap[OrderState::Status_OrderBTCSent] = "BTC_SENT"; + XmrTo::stateMap[OrderState::Status_OrderTimedOut] = "TIMED_OUT"; + XmrTo::stateMap[OrderState::Status_OrderFailed] = "FAILED"; + XmrTo::stateMap[OrderState::Status_OrderXMRSent] = "XMR_SENT"; + + this->tableModel = new XmrToModel(&this->orders, this); +} + +void XmrTo::createOrder(double amount, const QString ¤cy, const QString &btcAddress) { + // ^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$ + + XmrToOrder *order; + order = new XmrToOrder(this->m_ctx, m_netTor, m_baseUrl, false, &this->rates, this); + + connect(order, &XmrToOrder::orderFailed, this, &XmrTo::orderFailed); + connect(order, &XmrToOrder::orderPaid, this, &XmrTo::orderPaid); + connect(order, &XmrToOrder::orderPaidUnconfirmed, this, &XmrTo::orderPaidUnconfirmed); + connect(order, &XmrToOrder::orderPaymentRequired, this, &XmrTo::orderPaymentRequired); + connect(order, &XmrToOrder::orderChanged, this->tableModel, &XmrToModel::update); + + order->create(amount, currency, btcAddress); + this->orders.append(order); + tableModel->update(); +} + + +void XmrTo::onApiResponse(const XmrToResponse &resp) { + if (!resp.ok) { + this->onApiFailure(resp); + return; + } + + emit connectionSuccess(); + if (resp.endpoint == Endpoint::RATES) { + onRatesReceived(resp.obj); + } +} + +void XmrTo::onApiFailure(const XmrToResponse &resp) { + emit connectionError(resp.message); +} + +void XmrTo::onGetRates() { + m_apiTor->getRates(); +} + +void XmrTo::onRatesReceived(const QJsonObject &doc) { + this->rates.price = doc.value("price").toString().toDouble(); + this->rates.ln_lower_limit = doc.value("ln_lower_limit").toString().toDouble(); + this->rates.ln_upper_limit = doc.value("ln_upper_limit").toString().toDouble(); + this->rates.lower_limit = doc.value("lower_limit").toString().toDouble(); + this->rates.upper_limit = doc.value("upper_limit").toString().toDouble(); + this->rates.zero_conf_enabled = doc.value("zero_conf_enabled").toBool(); + this->rates.zero_conf_max_amount = doc.value("zero_conf_enabled").toString().toDouble(); + emit ratesUpdated(rates); +} + +void XmrTo::onNetworkChanged(bool clearnet) { + m_api = clearnet ? m_apiClear : m_apiTor; +} + +void XmrTo::onWalletClosed() { + // @TODO: cleanup + for(const auto &order: this->orders) + order->deleteLater(); + + this->tableModel->update(); +} + +void XmrTo::onWalletOpened() { + // @TODO: read past XMR.To orders, start pending ones +} + +void XmrTo::onViewOrder(const QString &orderId) { + QString url = QString("%1/nojs/status/%2").arg(this->m_baseUrl).arg(orderId); + emit openURL(url); +} diff --git a/src/utils/xmrto.h b/src/utils/xmrto.h new file mode 100644 index 0000000..dcd7389 --- /dev/null +++ b/src/utils/xmrto.h @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_XMRTOCONVERT_H +#define FEATHER_XMRTOCONVERT_H + +#include + +#include "model/XmrToModel.h" +#include "utils/xmrtoorder.h" +#include "utils/xmrtoapi.h" + +class AppContext; +class XmrTo: public QObject { + Q_OBJECT + +public: + explicit XmrTo(AppContext *ctx, QObject *parent = nullptr); + Q_ENUM(OrderState); + + XmrToModel *tableModel; + static QMap stateMap; + XmrToRates rates; + QList orders; + +public slots: + void createOrder(double amount, const QString ¤cy, const QString &btcAddress); + void onGetRates(); + void onRatesReceived(const QJsonObject &doc); + void onViewOrder(const QString &orderId); + void onNetworkChanged(bool clearnet); + void onWalletOpened(); + void onWalletClosed(); + +private slots: + void onApiResponse(const XmrToResponse &doc); + +signals: + void orderPaymentRequired(XmrToOrder *order); + void orderPaidUnconfirmed(XmrToOrder *order); + void orderPaid(XmrToOrder *order); + void orderFailed(XmrToOrder *order); + void ratesUpdated(XmrToRates rates); + void openURL(const QString &url); + void connectionError(const QString &err); + void connectionSuccess(); + +private: + void onApiFailure(const XmrToResponse &doc); + + QString m_baseUrl; + AppContext *m_ctx; + int m_orderTimeout = 900; // https://xmrto-api.readthedocs.io/en/latest/introduction.html#various-parameters + + UtilsNetworking *m_netTor; + UtilsNetworking *m_netClear; + + XmrToApi *m_api; + XmrToApi *m_apiTor; + XmrToApi *m_apiClear; +}; + +#endif //FEATHER_XMRTOCONVERT_H diff --git a/src/utils/xmrtoapi.cpp b/src/utils/xmrtoapi.cpp new file mode 100644 index 0000000..03bc6a3 --- /dev/null +++ b/src/utils/xmrtoapi.cpp @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "xmrtoapi.h" + +#include + +XmrToApi::XmrToApi(QObject *parent, UtilsNetworking *network, QString baseUrl) + : QObject(parent) + , m_network(network) + , m_baseUrl(std::move(baseUrl)) +{ +} + +void XmrToApi::getRates() { + QString url = QString("%1/api/v3/xmr2btc/order_parameter_query/").arg(this->m_baseUrl); + QNetworkReply *reply = m_network->getJson(url); + connect(reply, &QNetworkReply::finished, std::bind(&XmrToApi::onResponse, this, reply, Endpoint::RATES)); +} + +void XmrToApi::createOrder(double amount, const QString &amount_currency, const QString &dest_address) { + QJsonObject order; + order["amount"] = amount; + order["amount_currency"] = amount_currency; + order["btc_dest_address"] = dest_address; + + QString url = QString("%1/api/v3/xmr2btc/order_create/").arg(m_baseUrl); + QNetworkReply *reply = m_network->postJson(url, order); + connect(reply, &QNetworkReply::finished, std::bind(&XmrToApi::onResponse, this, reply, Endpoint::ORDER_CREATE)); +} + +void XmrToApi::getOrderStatus(const QString &uuid) { + QJsonObject order; + order["uuid"] = uuid; + + QString url = QString("%1/api/v3/xmr2btc/order_status_query/").arg(m_baseUrl); + QNetworkReply *reply = m_network->postJson(url, order); + connect(reply, &QNetworkReply::finished, std::bind(&XmrToApi::onResponse, this, reply, Endpoint::ORDER_STATUS)); +} + +void XmrToApi::onResponse(QNetworkReply *reply, Endpoint endpoint) { + const auto ok = reply->error() == QNetworkReply::NoError; + const auto err = reply->errorString(); + reply->deleteLater(); + + QByteArray data = reply->readAll(); + QJsonObject obj; + if (!data.isEmpty() && Utils::validateJSON(data)) { + auto doc = QJsonDocument::fromJson(data); + obj = doc.object(); + } + else if (!ok) { + emit ApiResponse(XmrToResponse(false, endpoint, err)); + return; + } + else { + emit ApiResponse(XmrToResponse(false, endpoint, "Invalid response from XMR.to")); + return; + } + + XmrToError xmrto_err = XmrToApi::getApiError(obj); + if (!xmrto_err.code.isEmpty()) { + emit ApiResponse(XmrToResponse(false, endpoint, m_errorMap.contains(xmrto_err.code) ? m_errorMap[xmrto_err.code] : "", xmrto_err)); + return; + } + + emit ApiResponse(XmrToResponse(true, endpoint, "", obj)); +} + +XmrToError XmrToApi::getApiError(const QJsonObject &obj) { + if (!obj.contains("error")) + return XmrToError(); + + QString code = obj.value("error").toString(); + QString msg = obj.value("error_msg").toString(); + + return XmrToError(code, msg); +} diff --git a/src/utils/xmrtoapi.h b/src/utils/xmrtoapi.h new file mode 100644 index 0000000..1fa983a --- /dev/null +++ b/src/utils/xmrtoapi.h @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_XMRTOAPI_H +#define FEATHER_XMRTOAPI_H + +#include +#include + +#include "utils/networking.h" + +enum Endpoint { + RATES = 0, + ORDER_CREATE, + ORDER_STATUS +}; + +struct XmrToError { + explicit XmrToError(QString code = "", QString msg = "") + : code(std::move(code)), msg(std::move(msg)) {}; + + QString code; + QString msg; +}; + +struct XmrToResponse { + explicit XmrToResponse(bool ok, Endpoint endpoint, QString message, XmrToError error = XmrToError(), QJsonObject obj = {}) + : ok(ok), endpoint(endpoint), message(std::move(message)), error(std::move(error)), obj(std::move(obj)) {}; + + explicit XmrToResponse(bool ok, Endpoint endpoint, QString message, QJsonObject obj) + : ok(ok), endpoint(endpoint), message(std::move(message)), obj(std::move(obj)) {}; + + bool ok; + Endpoint endpoint; + QString message; + XmrToError error = XmrToError(); + QJsonObject obj; +}; + +class XmrToApi : public QObject { + Q_OBJECT + +public: + explicit XmrToApi(QObject *parent, UtilsNetworking *network, QString baseUrl = "https://xmr.to"); + + void getRates(); + void createOrder(double amount, const QString &amount_currency, const QString &dest_address); + void getOrderStatus(const QString &uuid); + +signals: + void ApiResponse(XmrToResponse resp); + +private slots: + void onResponse(QNetworkReply *reply, Endpoint endpoint); + +private: + static XmrToError getApiError(const QJsonObject &obj); + + QString m_baseUrl; + UtilsNetworking *m_network; + + // https://xmrto-api.readthedocs.io/en/latest/introduction.html#list-of-all-error-codes + const QMap m_errorMap = { + {"XMRTO-ERROR-001", "internal services not available, try again later."}, + {"XMRTO-ERROR-002", "malformed bitcoin address, check address validity."}, + {"XMRTO-ERROR-003", "invalid bitcoin amount, check amount data type."}, + {"XMRTO-ERROR-004", "bitcoin amount out of bounds, check min and max amount."}, + {"XMRTO-ERROR-005", "unexpected validation error, contact support."}, + {"XMRTO-ERROR-006", "requested order not found, check order UUID."}, + {"XMRTO-ERROR-007", "third party service not available, try again later."}, + {"XMRTO-ERROR-008", "insufficient funds available, try again later."}, + {"XMRTO-ERROR-009", "invalid request, check request parameters."}, + {"XMRTO-ERROR-010", "payment protocol failed, invalid or outdated data served by URL."}, + {"XMRTO-ERROR-011", "malformed payment protocol url, URL is malformed or cannot be contacted."}, + {"XMRTO-ERROR-012", "too many requests, try less often."}, + {"XMRTO-ERROR-013", "access forbidden."}, + {"XMRTO-ERROR-014", "service is not available in your region."}, + {"XMRTO-ERROR-015", "invalid monero amount, check amount data type."}, + {"XMRTO-ERROR-016", "invalid currency, check available currency options."}, + {"XMRTO-ERROR-017", "malformed lightning network invoice, provide a correct invoice for the main network."}, + {"XMRTO-ERROR-018", "lightning payment unlikely to succeed, check first if xmr.to has routes available."}, + {"XMRTO-ERROR-019", "lightning invoice preimage already known, don’t use the same invoice more than once."} + }; +}; + + +#endif //FEATHER_XMRTOAPI_H diff --git a/src/utils/xmrtoorder.cpp b/src/utils/xmrtoorder.cpp new file mode 100644 index 0000000..b5556d6 --- /dev/null +++ b/src/utils/xmrtoorder.cpp @@ -0,0 +1,276 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "xmrtoorder.h" + +#include + +#include "libwalletqt/Wallet.h" +#include "appcontext.h" +#include "utils/xmrto.h" + +XmrToOrder::XmrToOrder(AppContext *ctx, UtilsNetworking *network, QString baseUrl, bool clearnet, XmrToRates *rates, QObject *parent) : + QObject(parent), + m_ctx(ctx), + m_network(network), + m_baseUrl(std::move(baseUrl)), + m_rates(rates), + m_clearnet(clearnet) { + this->state = OrderState::Status_Idle; + + m_baseUrl = m_ctx->networkType == NetworkType::Type::MAINNET ? "https://xmr.to" : "https://test.xmr.to"; + m_api = new XmrToApi(this, network, m_baseUrl); + + connect(m_api, &XmrToApi::ApiResponse, this, &XmrToOrder::onApiResponse); + connect(m_ctx, &AppContext::transactionCommitted, this, &XmrToOrder::onTransactionCommitted); + connect(m_ctx, &AppContext::createTransactionCancelled, this, &XmrToOrder::onTransactionCancelled); +} + +void XmrToOrder::onTransactionCancelled(const QString &address, double amount) { + // listener for all cancelled transactions - will try to match the exact amount to this order. + if(this->incoming_amount_total != amount || this->receiving_subaddress != address) return; + + this->errorMsg = "TX cancelled by user"; + this->changeState(OrderState::Status_OrderFailed); + this->stop(); +} + +void XmrToOrder::onTransactionCommitted(bool status, PendingTransaction *tx, const QStringList& txid) { + // listener for all outgoing transactions - will try to match the exact amount to this order. + if(this->state == OrderState::Status_OrderUnpaid){ + if(tx->amount() / AppContext::cdiv == this->incoming_amount_total) { + if(!status) { + this->errorMsg = "TX failed to commit"; + this->changeState(OrderState::Status_OrderFailed); + this->stop(); + return; + } + + this->xmr_txid = txid.at(0); + this->m_paymentSent = true; + this->changeState(OrderState::Status_OrderXMRSent); + } + } +} + +void XmrToOrder::onApiFailure(const XmrToResponse &resp) { + this->errorCode = resp.error.code; + this->errorMsg = resp.message; + + switch (resp.endpoint) { + case ORDER_CREATE: + this->onCreatedError(); + break; + case ORDER_STATUS: + this->onCheckedError(resp.error); + break; + default: + return; + } +} + +void XmrToOrder::onApiResponse(const XmrToResponse& resp) { + if (!resp.ok) { + this->onApiFailure(resp); + return; + } + + switch (resp.endpoint) { + case ORDER_CREATE: + this->onCreated(resp.obj); + break; + case ORDER_STATUS: + this->onChecked(resp.obj); + break; + default: + return; + } +} + +void XmrToOrder::create(double amount, const QString ¤cy, const QString &btcAddress) { + if(this->m_ctx->currentWallet == nullptr) { + this->errorMsg = "No wallet opened"; + this->changeState(OrderState::Status_OrderFailed); + return; + } + + m_api->createOrder(amount, currency, btcAddress); + this->changeState(OrderState::Status_OrderCreating); +} + +void XmrToOrder::onCreatedError() { + this->changeState(OrderState::Status_OrderFailed); +} + +void XmrToOrder::onCreated(const QJsonObject &object) { + if(!object.contains("state")) + this->errorMsg = "Could not parse 'state' from JSON response"; + if(object.value("state").toString() != "TO_BE_CREATED") + this->errorMsg = "unknown state from response, should be \"TO_BE_CREATED\""; + + if(!this->errorMsg.isEmpty()) { + this->changeState(OrderState::Status_OrderFailed); + return; + } + + if(m_created) return; + m_created = true; + this->btc_amount = object.value("btc_amount").toDouble(); + this->btc_dest_address = object.value("btc_dest_address").toString(); + this->uses_lightning = object.value("uses_lightning").toBool(); + this->uuid = object.value("uuid").toString(); + m_checkTimer.start(1000*5); + m_countdownTimer.start(1000); + connect(&m_checkTimer, &QTimer::timeout, this, &XmrToOrder::check); + connect(&m_countdownTimer, &QTimer::timeout, this, &XmrToOrder::onCountdown); + + this->changeState(OrderState::Status_OrderToBeCreated); + this->check(); +} + +void XmrToOrder::check() { + if(this->m_ctx->currentWallet == nullptr) + return; + + m_api->getOrderStatus(this->uuid); +} + +void XmrToOrder::onCheckedError(const XmrToError& err) { + if (!err.code.isEmpty()) + this->changeState(OrderState::Status_OrderFailed); + + m_checkFailures += 1; + if(m_checkFailures > 15){ + this->errorMsg = "Too many failed attempts"; + this->changeState(OrderState::Status_OrderFailed); + } +} + +void XmrToOrder::onChecked(const QJsonObject &object) { + if(object.contains("btc_amount")) + this->btc_amount = object.value("btc_amount").toString().toDouble(); + if(object.contains("btc_dest_address")) + this->btc_dest_address = object.value("btc_dest_address").toString(); + if(object.contains("seconds_till_timeout")) { + this->seconds_till_timeout = object.value("seconds_till_timeout").toInt(); + this->countdown = this->seconds_till_timeout; + } + if(object.contains("created_at")) + this->created_at = object.value("created_at").toString(); + if(object.contains("expires_at")) + this->expires_at = object.value("expires_at").toString(); + if(object.contains("incoming_amount_total")) + this->incoming_amount_total = object.value("incoming_amount_total").toString().toDouble(); + if(object.contains("remaining_amount_incoming")) + this->remaining_amount_incoming = object.value("remaining_amount_incoming").toString().toDouble(); + if(object.contains("incoming_price_btc")) + { + qDebug() << object.value("incoming_price_btc").toString(); + this->incoming_price_btc = object.value("incoming_price_btc").toString().toDouble(); + } + if(object.contains("receiving_subaddress")) + this->receiving_subaddress = object.value("receiving_subaddress").toString(); + + if(object.contains("payments")) { + // detect btc txid, xmr.to api can output several - we'll just grab the first #yolo + auto payments = object.value("payments").toArray(); + for(const auto &payment: payments){ + auto obj = payment.toObject(); + if(obj.contains("tx_id")) { + this->btc_txid = obj.value("tx_id").toString(); + break; + } + } + } + + this->changeState(object.value("state").toString()); +} + +void XmrToOrder::changeState(const QString &_state) { + for(const auto &key: XmrTo::stateMap.keys()) { + const auto &val = XmrTo::stateMap[key]; + if(_state == val){ + this->changeState(key); + return; + } + } +} + +void XmrToOrder::changeState(OrderState _state) { + if(this->m_ctx->currentWallet == nullptr) + return; + + if(_state == OrderState::Status_OrderUnderPaid && m_paymentSent) { + this->state = OrderState::Status_OrderXMRSent; + emit orderChanged(); + return; + } + + if(_state == this->state) return; + switch(_state){ + case OrderState::Status_Idle: + break; + case OrderState::Status_OrderCreating: + break; + case OrderState::Status_OrderToBeCreated: + break; + case OrderState::Status_OrderUnderPaid: + emit orderFailed(this); + this->stop(); + break; + case OrderState::Status_OrderUnpaid: + // need to send Monero + if(!m_paymentRequested) { + auto unlocked_balance = m_ctx->currentWallet->unlockedBalance() / AppContext::cdiv; + if (this->incoming_amount_total >= unlocked_balance) { + this->state = OrderState::Status_OrderFailed; + emit orderFailed(this); + this->stop(); + break; + } + m_paymentRequested = true; + emit orderPaymentRequired(this); + } + break; + case OrderState::Status_OrderFailed: + emit orderFailed(this); + this->stop(); + break; + case OrderState::Status_OrderPaidUnconfirmed: + emit orderPaidUnconfirmed(this); + break; + case OrderState::Status_OrderPaid: + emit orderPaid(this); + break; + case OrderState::Status_OrderTimedOut: + emit orderFailed(this); + this->stop(); + break; + case OrderState::Status_OrderBTCSent: + emit orderPaid(this); + this->stop(); + break; + default: + break; + } + + this->state = _state; + emit orderChanged(); +} + +void XmrToOrder::onCountdown() { + if(this->countdown <= 0) return; + this->countdown -= 1; + emit orderChanged(); +} + +void XmrToOrder::stop(){ + this->m_checkTimer.stop(); + this->m_countdownTimer.stop(); +} + +XmrToOrder::~XmrToOrder(){ + this->stop(); + this->disconnect(); + this->m_network->deleteLater(); +} \ No newline at end of file diff --git a/src/utils/xmrtoorder.h b/src/utils/xmrtoorder.h new file mode 100644 index 0000000..c05c71d --- /dev/null +++ b/src/utils/xmrtoorder.h @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_XMRTOORDER_H +#define FEATHER_XMRTOORDER_H + +#include + +#include "utils/networking.h" +#include "PendingTransaction.h" +#include "utils/xmrtoapi.h" + +enum OrderState { + Status_Idle, + Status_OrderCreating, + Status_OrderToBeCreated, + Status_OrderUnpaid, + Status_OrderXMRSent, + Status_OrderUnderPaid, + Status_OrderPaidUnconfirmed, + Status_OrderPaid, + Status_OrderBTCSent, + Status_OrderTimedOut, + Status_OrderFailed +}; + +struct XmrToRates { + double price; + double upper_limit; + double lower_limit; + double ln_upper_limit; + double ln_lower_limit; + double zero_conf_max_amount; + bool zero_conf_enabled; +}; + +class XmrToOrder : public QObject { + Q_OBJECT + +public: + explicit XmrToOrder(AppContext *ctx, UtilsNetworking *network, QString baseUrl, bool clearnet, XmrToRates *rates, QObject *parent = nullptr); + void create(double btcAmount, const QString ¤cy, const QString &btcAddress); + void changeState(OrderState state); + void changeState(const QString &state); + void stop(); + + int state; + int countdown = -1; // seconds remaining calculated from `seconds_till_timeout` + QString uuid; + QString errorMsg; + QString errorCode; + + double btc_amount = 0; + QString btc_dest_address; + QString btc_txid; + QString xmr_txid; + bool uses_lightning = false; + + QString receiving_subaddress; + QString created_at; + QString expires_at; + int seconds_till_timeout = -1; + double incoming_amount_total = 0; // amount_in_incoming_currency_for_this_order_as_string + double remaining_amount_incoming; // amount_in_incoming_currency_that_the_user_must_still_send_as_string + double incoming_price_btc = 0; // price_of_1_incoming_in_btc_currency_as_offered_by_service + +public slots: + void onCountdown(); + void onTransactionCancelled(const QString &address, double amount); + void onTransactionCommitted(bool status, PendingTransaction *tx, const QStringList& txid); + + void onCreatedError(); + void onChecked(const QJsonObject &object); + void onCheckedError(const XmrToError& err); + void check(); + +private: + bool m_created = false; + QString m_baseUrl; + QTimer m_checkTimer; + QTimer m_countdownTimer; + int m_checkFailures = 0; + bool m_clearnet; + bool m_paymentSent = false; + bool m_paymentRequested = false; + UtilsNetworking *m_network; + AppContext *m_ctx; + XmrToRates *m_rates; + XmrToApi *m_api; + + ~XmrToOrder(); + +signals: + void orderChanged(); + void orderPaymentRequired(XmrToOrder *order); + void orderPaid(XmrToOrder *order); + void orderPaidUnconfirmed(XmrToOrder *order); + void orderFailed(XmrToOrder *order); + +private slots: + void onCreated(const QJsonObject &object); + void onApiFailure(const XmrToResponse &resp); + void onApiResponse(const XmrToResponse &resp); +}; + +#endif //FEATHER_XMRTOORDER_H diff --git a/src/widgets/CCSEntry.h b/src/widgets/CCSEntry.h new file mode 100644 index 0000000..c2ec1f3 --- /dev/null +++ b/src/widgets/CCSEntry.h @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_CCSENTRY_H +#define FEATHER_CCSENTRY_H + +#include + +struct CCSEntry { + CCSEntry()= default;; + + QString title = ""; + QString date = ""; + QString address = ""; + QString author = ""; + QString state = ""; + QString url = ""; + double target_amount = 0; + double raised_amount = 0; + double percentage_funded = 0; + int contributions = 0; +}; + +#endif //FEATHER_CCSENTRY_H diff --git a/src/widgets/RedditPost.h b/src/widgets/RedditPost.h new file mode 100644 index 0000000..b7d3e48 --- /dev/null +++ b/src/widgets/RedditPost.h @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_REDDITPOST_H +#define FEATHER_REDDITPOST_H + +#include + +struct RedditPost { + RedditPost(const QString &title, const QString &author, const QString &url, int comments) : title(title), author(author), url(url), comments(comments){}; + + QString title; + QString author; + QString url; + int comments; +}; + +#endif //FEATHER_REDDITPOST_H diff --git a/src/widgets/ccswidget.cpp b/src/widgets/ccswidget.cpp new file mode 100644 index 0000000..b162539 --- /dev/null +++ b/src/widgets/ccswidget.cpp @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include +#include +#include +#include +#include + +#include "ccswidget.h" +#include "ui_csswidget.h" +#include "utils/utils.h" +#include "cssprogressdelegate.h" + +CCSWidget::CCSWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::CSSWidget), + m_model(new CCSModel(this)), + m_contextMenu(new QMenu(this)) +{ + ui->setupUi(this); + auto progressDelegate = new CCSProgressDelegate(m_model, this); + ui->tableView->setModel(m_model); +#ifndef Q_OS_MACOS + ui->tableView->setItemDelegateForColumn(2, progressDelegate); +#endif + this->setupTable(); + + m_contextMenu->addAction("View proposal", this, &CCSWidget::linkClicked); + m_contextMenu->addAction("Donate", this, &CCSWidget::donateClicked); + connect(ui->tableView, &QHeaderView::customContextMenuRequested, this, &CCSWidget::showContextMenu); + + connect(ui->tableView, &QTableView::doubleClicked, this, &CCSWidget::linkClicked); +} + +CCSModel* CCSWidget::model() { + return m_model; +} + +void CCSWidget::linkClicked() { + QModelIndex index = ui->tableView->currentIndex(); + auto entry = m_model->entry(index.row()); + + if (entry) + Utils::externalLinkWarning(entry->url); +} + +void CCSWidget::donateClicked() { + QModelIndex index = ui->tableView->currentIndex(); + auto entry = m_model->entry(index.row()); + + if (entry) + emit selected(*entry); +} + +void CCSWidget::setupTable() { + ui->tableView->verticalHeader()->setVisible(false); + ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); + + ui->tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); + ui->tableView->setColumnWidth(2, 160); +} + +void CCSWidget::showContextMenu(const QPoint &pos) { + QModelIndex index = ui->tableView->indexAt(pos); + if (!index.isValid()) { + return; + } + + m_contextMenu->exec(ui->tableView->viewport()->mapToGlobal(pos)); +} + +CCSWidget::~CCSWidget() { + delete ui; +} diff --git a/src/widgets/ccswidget.h b/src/widgets/ccswidget.h new file mode 100644 index 0000000..747195c --- /dev/null +++ b/src/widgets/ccswidget.h @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef CSSWIDGET_H +#define CSSWIDGET_H + +#include +#include +#include +#include +#include + +#include "widgets/CCSEntry.h" +#include "model/CCSModel.h" +#include "appcontext.h" + +namespace Ui { + class CSSWidget; +} + +class CCSWidget : public QWidget +{ +Q_OBJECT + +public: + explicit CCSWidget(QWidget *parent = nullptr); + ~CCSWidget(); + CCSModel *model(); + +signals: + void selected(CCSEntry entry); + +public slots: + void donateClicked(); + +private slots: + void linkClicked(); + +private: + void setupTable(); + void showContextMenu(const QPoint &pos); + + Ui::CSSWidget *ui; + CCSModel *m_model; + QMenu *m_contextMenu; +}; + +#endif // CSSWIDGET_H diff --git a/src/widgets/cssprogressdelegate.cpp b/src/widgets/cssprogressdelegate.cpp new file mode 100644 index 0000000..de7268a --- /dev/null +++ b/src/widgets/cssprogressdelegate.cpp @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "cssprogressdelegate.h" + +#include + +CCSProgressDelegate::CCSProgressDelegate(CCSModel *model, QWidget *parent) + : m_model(model) + , QStyledItemDelegate(parent) +{ + +} + +void CCSProgressDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, + const QModelIndex &index) const { + + if (index.column() != CCSModel::Progress) { + QStyledItemDelegate::paint(painter, option, index); + return; + } + + QStyleOptionProgressBar progressBarOption; + progressBarOption.state = QStyle::State_Enabled; + progressBarOption.direction = QApplication::layoutDirection(); + progressBarOption.rect = option.rect; + progressBarOption.fontMetrics = QApplication::fontMetrics(); + progressBarOption.minimum = 0; + progressBarOption.maximum = 100; + progressBarOption.textAlignment = Qt::AlignCenter; + progressBarOption.textVisible = true; + + QSharedPointer entry = m_model->entry(index.row()); + auto target = QString("%1/%2 XMR").arg(entry->raised_amount).arg(entry->target_amount); + auto progress = (int)entry->percentage_funded; + progressBarOption.progress = progress < 0 ? 0 : progress; + progressBarOption.text = target; + + QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter); // Draw the progress bar onto the view. +} \ No newline at end of file diff --git a/src/widgets/cssprogressdelegate.h b/src/widgets/cssprogressdelegate.h new file mode 100644 index 0000000..b0a7c0f --- /dev/null +++ b/src/widgets/cssprogressdelegate.h @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_CSSPROGRESSDELEGATE_H +#define FEATHER_CSSPROGRESSDELEGATE_H + +#include +#include "model/CCSModel.h" + +class CCSProgressDelegate : public QStyledItemDelegate +{ + Q_OBJECT + +public: + explicit CCSProgressDelegate(CCSModel *model, QWidget *parent = nullptr); + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; + +private: + CCSModel *m_model; +}; + + +#endif //FEATHER_CSSPROGRESSDELEGATE_H diff --git a/src/widgets/csswidget.ui b/src/widgets/csswidget.ui new file mode 100644 index 0000000..2292c34 --- /dev/null +++ b/src/widgets/csswidget.ui @@ -0,0 +1,92 @@ + + + CSSWidget + + + + 0 + 0 + 893 + 396 + + + + Form + + + + 4 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::CustomContextMenu + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::SingleSelection + + + false + + + false + + + + + + + 0 + + + + + false + + + Powered by css.getmonero.org + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + donateClicked() + linkClicked() + + diff --git a/src/widgets/nodewidget.cpp b/src/widgets/nodewidget.cpp new file mode 100644 index 0000000..c1adaab --- /dev/null +++ b/src/widgets/nodewidget.cpp @@ -0,0 +1,222 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "model/NodeModel.h" +#include "nodewidget.h" +#include "ui_nodewidget.h" +#include "utils/utils.h" +#include "utils/nodes.h" +#include "mainwindow.h" + +NodeWidget::NodeWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::NodeWidget), + m_contextMenu(new QMenu(this)) { + ui->setupUi(this); + + connect(ui->btn_add_custom, &QPushButton::clicked, this, &NodeWidget::onCustomAddClicked); + + connect(ui->nodeBtnGroup, QOverload::of(&QButtonGroup::buttonClicked), [=](QAbstractButton *button) { + auto name = button->objectName(); + if (name == "radioButton_websocket") { + emit nodeSourceChanged(NodeSource::websocket); + } else if (name == "radioButton_custom") { + emit nodeSourceChanged(NodeSource::custom); + } + }); + + ui->wsView->setContextMenuPolicy(Qt::CustomContextMenu); + ui->customView->setContextMenuPolicy(Qt::CustomContextMenu); + connect(ui->wsView, &QTreeView::customContextMenuRequested, this, &NodeWidget::onShowWSContextMenu); + connect(ui->customView, &QTreeView::customContextMenuRequested, this, &NodeWidget::onShowCustomContextMenu); +} + +void NodeWidget::onShowWSContextMenu(const QPoint &pos) { + QModelIndex index = ui->wsView->indexAt(pos); + if (!index.isValid()) return; + + FeatherNode node = m_wsModel->node(index.row()); + this->showContextMenu(pos, node); +} + +void NodeWidget::onShowCustomContextMenu(const QPoint &pos) { + QModelIndex index = ui->customView->indexAt(pos); + if (!index.isValid()) return; + + FeatherNode node = m_customModel->node(index.row()); + this->showContextMenu(pos, node); +} + + +void NodeWidget::showContextMenu(const QPoint &pos, const FeatherNode &node) { + bool custom = node.custom; + m_activeView = custom ? ui->customView : ui->wsView; + + m_contextActionRemove = new QAction("Remove"); + m_contextActionConnect = new QAction("Connect to node"); + m_contextActionConnect->setIcon(QIcon(":/assets/images/connect.svg")); + m_contextActionOpenStatusURL = new QAction("Visit status page"); + m_contextActionOpenStatusURL->setIcon(QIcon(":/assets/images/network.png")); + m_contextActionCopy = new QAction("Copy"); + m_contextActionCopy->setIcon(QIcon(":/assets/images/copy.png")); + + if(!node.isActive) { + connect(m_contextActionConnect, &QAction::triggered, this, &NodeWidget::onContextConnect); + m_contextMenu->addAction(m_contextActionConnect); + } + + m_contextMenu->addAction(m_contextActionOpenStatusURL); + m_contextMenu->addAction(m_contextActionCopy); + + if(custom) { + connect(m_contextActionRemove, &QAction::triggered, this, &NodeWidget::onContextCustomNodeRemove); + m_contextMenu->addAction(m_contextActionRemove); + + connect(m_contextActionOpenStatusURL, &QAction::triggered, this, &NodeWidget::onContextCustomStatusURL); + connect(m_contextActionCopy, &QAction::triggered, this, &NodeWidget::onContextCustomNodeCopy); + } else { + connect(m_contextActionOpenStatusURL, &QAction::triggered, this, &NodeWidget::onContextWSStatusURL); + connect(m_contextActionCopy, &QAction::triggered, this, &NodeWidget::onContextWSNodeCopy); + } + + m_contextMenu->exec(m_activeView->viewport()->mapToGlobal(pos)); + m_contextActionRemove->deleteLater(); + m_contextActionConnect->deleteLater(); + m_contextActionOpenStatusURL->deleteLater(); + m_contextActionCopy->deleteLater(); +} + +void NodeWidget::onContextConnect() { + QModelIndex index = m_activeView->currentIndex(); + if (!index.isValid()) return; + + if(m_activeView->objectName() == "wsView"){ + FeatherNode node = m_wsModel->node(index.row()); + emit connectToNode(node); + } else { + FeatherNode node = m_customModel->node(index.row()); + emit connectToNode(node); + } +} + +void NodeWidget::onContextWSStatusURL() { + QModelIndex index = ui->wsView->currentIndex(); + if (!index.isValid()) return; + FeatherNode node = m_wsModel->node(index.row()); + Utils::externalLinkWarning(node.as_url()); +} + +void NodeWidget::onContextCustomStatusURL() { + QModelIndex index = ui->customView->currentIndex(); + if (!index.isValid()) return; + FeatherNode node = m_customModel->node(index.row()); + Utils::externalLinkWarning(node.as_url()); +} + +void NodeWidget::onContextDisconnect() { + QModelIndex index = ui->customView->currentIndex(); + if (!index.isValid()) return; + FeatherNode node = m_customModel->node(index.row()); + + Utils::copyToClipboard(node.full); +} + +void NodeWidget::onContextWSNodeCopy() { + QModelIndex index = ui->wsView->currentIndex(); + if (!index.isValid()) return; + FeatherNode node = m_wsModel->node(index.row()); + + Utils::copyToClipboard(node.full); +} + +void NodeWidget::onContextCustomNodeCopy() { + +} + +void NodeWidget::onContextCustomNodeRemove() { + QModelIndex index = ui->customView->currentIndex(); + if (!index.isValid()) return; + FeatherNode node = m_customModel->node(index.row()); + + auto nodes = m_ctx->nodes->customNodes(); + QMutableListIterator i(nodes); + while (i.hasNext()) + if (i.next() == node) + i.remove(); + + m_ctx->nodes->setCustomNodes(nodes); +} + +void NodeWidget::onCustomAddClicked(){ + auto currentNodes = m_ctx->nodes->customNodes(); + auto currentNodesText = QString(""); + + for(auto &entry: currentNodes) + currentNodesText += QString("%1\n").arg(entry.full); + + bool ok; + QString text = QInputDialog::getMultiLineText(this, "Add custom node(s).", "E.g: user:password@127.0.0.1:18081", currentNodesText, &ok); + if (!ok || text.isEmpty()) + return; + + QList nodesList; + auto newNodesList = text.split("\n"); + for(auto &newNodeText: newNodesList) { + newNodeText = newNodeText.replace("\r", "").trimmed(); + if(newNodeText.isEmpty()) + continue; + + auto node = FeatherNode(newNodeText, 0, false); + node.custom = true; + nodesList.append(node); + } + + m_ctx->nodes->setCustomNodes(nodesList); +} + +void NodeWidget::setupUI(AppContext *ctx) { + m_ctx = ctx; + + auto nodeSource = m_ctx->nodes->source(); + qCritical() << nodeSource; + + if(nodeSource == NodeSource::websocket){ + ui->radioButton_websocket->setChecked(true); + } else if(nodeSource == NodeSource::custom) { + ui->radioButton_custom->setChecked(true); + } + + this->setWSModel(m_ctx->nodes->modelWebsocket); + this->setCustomModel(m_ctx->nodes->modelCustom); +} + +void NodeWidget::setWSModel(NodeModel *model) { + m_wsModel = model; + ui->wsView->setModel(m_wsModel); + ui->wsView->header()->setSectionResizeMode(NodeModel::URL, QHeaderView::Stretch); + ui->wsView->header()->setSectionResizeMode(NodeModel::Height, QHeaderView::ResizeToContents); +} + +void NodeWidget::setCustomModel(NodeModel *model) { + m_customModel = model; + ui->customView->setModel(m_customModel); + ui->customView->header()->setSectionResizeMode(NodeModel::URL, QHeaderView::Stretch); +} + +NodeModel* NodeWidget::model() { + return m_wsModel; +} + +NodeWidget::~NodeWidget() { + delete ui; +} diff --git a/src/widgets/nodewidget.h b/src/widgets/nodewidget.h new file mode 100644 index 0000000..2f81fbd --- /dev/null +++ b/src/widgets/nodewidget.h @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef NODEWIDGET_H +#define NODEWIDGET_H + +#include +#include +#include +#include "appcontext.h" +#include "model/NodeModel.h" +#include "utils/nodes.h" + +namespace Ui { + class NodeWidget; +} + +class NodeModel; +class NodeWidget : public QWidget +{ + Q_OBJECT + +public: + explicit NodeWidget(QWidget *parent = nullptr); + ~NodeWidget(); + void setWSModel(NodeModel *model); + void setCustomModel(NodeModel *model); + void setupUI(AppContext *ctx); + NodeModel* model(); + +public slots: + void onCustomAddClicked(); + void onShowWSContextMenu(const QPoint &pos); + void onShowCustomContextMenu(const QPoint &pos); + +private slots: + void onContextConnect(); + void onContextDisconnect(); + void onContextCustomNodeRemove(); + void onContextWSStatusURL(); + void onContextCustomStatusURL(); + void onContextWSNodeCopy(); + void onContextCustomNodeCopy(); + +signals: + void connectToNode(FeatherNode node); + void nodeSourceChanged(NodeSource nodeSource); + +private: + AppContext *m_ctx; + Ui::NodeWidget *ui; + NodeModel* m_customModel; + NodeModel* m_wsModel; + + QTreeView *m_activeView; + + QMenu *m_contextMenu; + QAction *m_contextActionConnect; + QAction *m_contextActionDisconnect; + QAction *m_contextActionRemove; + QAction *m_contextActionOpenStatusURL; + QAction *m_contextActionCopy; + + void showContextMenu(const QPoint &pos, const FeatherNode &node); +}; + +#endif // NODEWIDGET_H diff --git a/src/widgets/nodewidget.ui b/src/widgets/nodewidget.ui new file mode 100644 index 0000000..e107d32 --- /dev/null +++ b/src/widgets/nodewidget.ui @@ -0,0 +1,109 @@ + + + NodeWidget + + + + 0 + 0 + 604 + 271 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 6 + + + + + + + + + From websocket (recommended) + + + true + + + nodeBtnGroup + + + + + + + false + + + false + + + + + + + + + + + From custom list + + + nodeBtnGroup + + + + + + + false + + + + + + + Add custom node(s) + + + + + + + + + + + 0 + + + + + + + + + + + + + diff --git a/src/widgets/redditwidget.cpp b/src/widgets/redditwidget.cpp new file mode 100644 index 0000000..a8f046f --- /dev/null +++ b/src/widgets/redditwidget.cpp @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include +#include +#include +#include +#include + +#include "model/RedditModel.h" +#include "redditwidget.h" +#include "ui_redditwidget.h" +#include "utils/utils.h" + +RedditWidget::RedditWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::RedditWidget), + m_model(new RedditModel(this)), + m_contextMenu(new QMenu(this)) +{ + ui->setupUi(this); + ui->tableView->setModel(m_model); + this->setupTable(); + + m_contextMenu->addAction("View thread", this, &RedditWidget::linkClicked); + connect(ui->tableView, &QHeaderView::customContextMenuRequested, this, &RedditWidget::showContextMenu); + + connect(ui->tableView, &QTableView::doubleClicked, this, &RedditWidget::linkClicked); +} + +RedditModel* RedditWidget::model() { + return m_model; +} + +void RedditWidget::linkClicked() { + QModelIndex index = ui->tableView->currentIndex(); + auto post = m_model->post(index.row()); + + if (post) { + Utils::externalLinkWarning(post->url); + } +} + +void RedditWidget::setupTable() { + ui->tableView->verticalHeader()->setVisible(false); + ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); + + ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); + ui->tableView->horizontalHeader()->setSectionResizeMode( 0, QHeaderView::Stretch); +} + +void RedditWidget::showContextMenu(const QPoint &pos) { + QModelIndex index = ui->tableView->indexAt(pos); + if (!index.isValid()) { + return; + } + + m_contextMenu->exec(ui->tableView->viewport()->mapToGlobal(pos)); +} + +RedditWidget::~RedditWidget() { + delete ui; +} diff --git a/src/widgets/redditwidget.h b/src/widgets/redditwidget.h new file mode 100644 index 0000000..cb5b09f --- /dev/null +++ b/src/widgets/redditwidget.h @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef REDDITWIDGET_H +#define REDDITWIDGET_H + +#include +#include +#include + +#include "model/RedditModel.h" + +namespace Ui { + class RedditWidget; +} + +class RedditWidget : public QWidget +{ + Q_OBJECT + +public: + explicit RedditWidget(QWidget *parent = nullptr); + ~RedditWidget(); + RedditModel* model(); + +public slots: + void linkClicked(); + +private: + void setupTable(); + void showContextMenu(const QPoint &pos); + + Ui::RedditWidget *ui; + RedditModel* const m_model; + QMenu *m_contextMenu; +}; + +#endif // REDDITWIDGET_H diff --git a/src/widgets/redditwidget.ui b/src/widgets/redditwidget.ui new file mode 100644 index 0000000..4521378 --- /dev/null +++ b/src/widgets/redditwidget.ui @@ -0,0 +1,91 @@ + + + RedditWidget + + + + 0 + 0 + 492 + 409 + + + + Form + + + + 4 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::CustomContextMenu + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + false + + + false + + + + + + + + + false + + + Powered by Reddit + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + linkClicked() + + diff --git a/src/widgets/restoreheightwidget.cpp b/src/widgets/restoreheightwidget.cpp new file mode 100644 index 0000000..e9fa4a8 --- /dev/null +++ b/src/widgets/restoreheightwidget.cpp @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include +#include +#include +#include +#include + +#include "restoreheightwidget.h" +#include "ui_restoreheightwidget.h" +#include "utils/utils.h" + +RestoreHeightWidget::RestoreHeightWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::RestoreHeightWidget) +{ + ui->setupUi(this); + ui->lineEdit_restoreHeight->setValidator(new QIntValidator(0, 2147483647, this)); + connect(ui->lineEdit_restoreHeight, &QLineEdit::textEdited, [=](const QString &val){ + // update slider on lineEdit change + if(val.isEmpty()) return; + auto height = val.toUInt(); + if(height <= 1) return; + auto timestamp = m_restoreHeightLookup->restoreHeightToDate(height); + ui->restoreSlider->blockSignals(true); + ui->restoreSlider->setValue(timestamp); + ui->restoreSlider->blockSignals(false); + }); +} + +void RestoreHeightWidget::hideSlider(){ + ui->restoreGrid->hide(); +} + +void RestoreHeightWidget::initRestoreHeights(RestoreHeightLookup *lookup) { + // init slider + m_restoreHeightLookup = lookup; + auto now = (unsigned int)std::time(nullptr); + QList blockDates = m_restoreHeightLookup->data.keys(); + ui->restoreSlider->setMinimum(blockDates[0]); + ui->restoreSlider->setMaximum(now); + connect(ui->restoreSlider, &QSlider::valueChanged, this, &RestoreHeightWidget::onValueChanged); +} + +void RestoreHeightWidget::onValueChanged(int date) { + QDateTime timestamp; + timestamp.setTime_t((unsigned int) date); + ui->label_restoreHeightDate->setText(timestamp.toString("yyyy-MM-dd")); + auto blockHeight = m_restoreHeightLookup->dateToRestoreHeight((unsigned int) date); + ui->lineEdit_restoreHeight->setText(QString::number(blockHeight)); +} + +unsigned int RestoreHeightWidget::getHeight() { + return ui->lineEdit_restoreHeight->text().toUInt(); +} + +RestoreHeightWidget::~RestoreHeightWidget() { + delete ui; +} diff --git a/src/widgets/restoreheightwidget.h b/src/widgets/restoreheightwidget.h new file mode 100644 index 0000000..7235943 --- /dev/null +++ b/src/widgets/restoreheightwidget.h @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef RESTOREHEIGHTWIDGET_H +#define RESTOREHEIGHTWIDGET_H + +#include +#include + +#include "appcontext.h" + +namespace Ui { + class RestoreHeightWidget; +} + +class RestoreHeightWidget : public QWidget +{ + Q_OBJECT + +public: + explicit RestoreHeightWidget(QWidget *parent = nullptr); + void initRestoreHeights(RestoreHeightLookup *lookup); + unsigned int getHeight(); + void hideSlider(); + ~RestoreHeightWidget(); + +private slots: + void onValueChanged(int date); + +private: + RestoreHeightLookup *m_restoreHeightLookup = nullptr; + Ui::RestoreHeightWidget *ui; +}; + +#endif // RESTOREHEIGHTWIDGET_H diff --git a/src/widgets/restoreheightwidget.ui b/src/widgets/restoreheightwidget.ui new file mode 100644 index 0000000..00cb7d3 --- /dev/null +++ b/src/widgets/restoreheightwidget.ui @@ -0,0 +1,112 @@ + + + RestoreHeightWidget + + + + 0 + 0 + 360 + 89 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 2014-04-18 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Restore height + + + + + + + Qt::Horizontal + + + + + + + + + + + + + + 1 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + diff --git a/src/widgets/tickerwidget.cpp b/src/widgets/tickerwidget.cpp new file mode 100644 index 0000000..c601d1c --- /dev/null +++ b/src/widgets/tickerwidget.cpp @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "tickerwidget.h" +#include "ui_tickerwidget.h" + +#include "appcontext.h" +#include "utils/config.h" +#include "mainwindow.h" + +TickerWidget::TickerWidget(QWidget *parent, QString symbol, QString title, bool convertBalance) : + QWidget(parent), + ui(new Ui::TickerWidget), + m_symbol(std::move(symbol)), + m_convertBalance(convertBalance) +{ + ui->setupUi(this); + + // default values before API data + if (title == "") title = m_symbol; + this->ui->tickerBox->setTitle(title); + QString defaultPct = "0.0"; + QString defaultFiat = "..."; + + this->setFontSizes(); + this->setPctText(defaultPct, true); + this->setFiatText(defaultFiat, 0.0, true); + + connect(AppContext::prices, &Prices::fiatPricesUpdated, this, &TickerWidget::init); + connect(AppContext::prices, &Prices::cryptoPricesUpdated, this, &TickerWidget::init); + if (convertBalance) + connect(MainWindow::getContext(), &AppContext::balanceUpdated, this, &TickerWidget::init); +} + +void TickerWidget::init() { + if(!AppContext::prices->markets.count() || !AppContext::prices->rates.count()) + return; + + QString fiatCurrency = config()->get(Config::preferredFiatCurrency).toString(); + + if(!AppContext::prices->rates.contains(fiatCurrency)){ + config()->set(Config::preferredFiatCurrency, "USD"); + return; + } + + double amount = m_convertBalance ? AppContext::balance : 1.0; + double conversion = AppContext::prices->convert(m_symbol, fiatCurrency, amount); + if (conversion < 0) return; + setPercentHidden(conversion == 0); + + auto markets = AppContext::prices->markets; + if(!markets.contains(m_symbol)) return; + + auto pct24h = markets[m_symbol].price_usd_change_pct_24h; + auto pct24hText = QString::number(pct24h, 'f', 2); + + this->setPctText(pct24hText, pct24h >= 0.0); + this->setFiatText(fiatCurrency, conversion, true); +} + +void TickerWidget::setFiatText(QString &fiatCurrency, double amount, bool round) { + QString number; + if(round) + number = QString::number(amount, 'f', 2); + else + number = QString::number(amount); + + auto conversionText = QString("%1 %2")\ + .arg(number) + .arg(fiatCurrency); + ui->tickerFiat->setText(conversionText); +} + +void TickerWidget::setPctText(QString &text, bool positive) { + QString pctText = "

        "; + if(positive) { + pctText = pctText.replace("red", "green"); + pctText += QString("+%1%").arg(text); + } else + pctText += QString("%1%").arg(text); + + pctText += "

        "; + ui->tickerPct->setText(pctText); +} + +void TickerWidget::setFontSizes() { + ui->tickerPct->setFont(Utils::relativeFont(-2)); + ui->tickerFiat->setFont(Utils::relativeFont(0)); +} + +void TickerWidget::removePctContainer() { + ui->tickerPct->deleteLater(); +} + +void TickerWidget::setPercentHidden(bool hidden) { + ui->tickerPct->setVisible(!hidden); +} + +TickerWidget::~TickerWidget() { + delete ui; +} diff --git a/src/widgets/tickerwidget.h b/src/widgets/tickerwidget.h new file mode 100644 index 0000000..b0b8055 --- /dev/null +++ b/src/widgets/tickerwidget.h @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef TICKERWIDGET_H +#define TICKERWIDGET_H + +#include + +#include "appcontext.h" + +namespace Ui { + class TickerWidget; +} + +class TickerWidget : public QWidget +{ + Q_OBJECT + +public: + explicit TickerWidget(QWidget *parent, QString symbol, QString title = "", bool convertBalance = false); + void removePctContainer(); + void setFiatText(QString &fiatCurrency, double amount, bool round); + void setPctText(QString &text, bool positive); + void setFontSizes(); + ~TickerWidget() override; + + +public slots: + void init(); + +private: + void setPercentHidden(bool hidden); + + Ui::TickerWidget *ui; + QString m_symbol; + bool m_convertBalance; +}; + +#endif // TICKERWIDGET_H diff --git a/src/widgets/tickerwidget.ui b/src/widgets/tickerwidget.ui new file mode 100644 index 0000000..c37e49b --- /dev/null +++ b/src/widgets/tickerwidget.ui @@ -0,0 +1,84 @@ + + + TickerWidget + + + + 0 + 0 + 281 + 107 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 6 + + + 0 + + + + + - + + + + 6 + + + 6 + + + 6 + + + 4 + + + + + 6 + + + + + + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + <html><head/><body><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + + + + + + + diff --git a/src/wizard/createwallet.cpp b/src/wizard/createwallet.cpp new file mode 100644 index 0000000..b9e42fb --- /dev/null +++ b/src/wizard/createwallet.cpp @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "utils/utils.h" +#include "wizard/createwallet.h" +#include "wizard/walletwizard.h" +#include "ui_createwallet.h" +#include "appcontext.h" + +#include +#include +#include +#include + +#include "libwalletqt/WalletManager.h" + +CreateWalletPage::CreateWalletPage(AppContext *ctx, QWidget *parent) : + QWizardPage(parent), + ui(new Ui::CreateWalletPage), + m_ctx(ctx) { + ui->setupUi(this); + this->setTitle("Create wallet"); + this->setButtonText(QWizard::FinishButton, "Open wallet"); + + // hide ui element, we only need it for registerField + this->registerField("walletName*", ui->walletName); + this->registerField("walletDirectory", ui->directory); + this->registerField("walletPasswd", ui->password); + this->registerField("walletPath", ui->walletPath); + ui->walletPath->hide(); + + ui->directory->setText(m_ctx->defaultWalletDir); + m_walletDir = m_ctx->defaultWalletDir; + connect(ui->btnChange, &QPushButton::clicked, [=] { + QString walletDir = QFileDialog::getExistingDirectory(this, "Select wallet directory ", m_ctx->defaultWalletDir, QFileDialog::ShowDirsOnly); + if(walletDir.isEmpty()) return; + ui->directory->setText(walletDir); + }); + + connect(ui->directory, &QLineEdit::textChanged, [=](const QString &data) { + m_walletDir = data; + this->validateWidgets(); + }); + + connect(ui->walletName, &QLineEdit::textChanged, [=](QString data) { + this->validateWidgets(); + }); +} + +bool CreateWalletPage::validateWidgets(){ + ui->walletName->setStyleSheet(""); + ui->directory->setStyleSheet(""); + auto walletPass = ui->password->text(); + auto errStyle = "QLineEdit{border: 1px solid red;}"; + if(m_walletDir.isEmpty()){ + ui->walletName->setStyleSheet(errStyle); + ui->directory->setStyleSheet(errStyle); + return false; + } + + if(!Utils::dirExists(m_walletDir)) { + ui->walletName->setStyleSheet(errStyle); + ui->directory->setStyleSheet(errStyle); + return false; + } + + ui->directory->setStyleSheet(""); + auto walletName = ui->walletName->text().replace(".keys", ""); + if(walletName.isEmpty()) { + ui->walletName->setStyleSheet(errStyle); + return false; + } + + auto walletPath = QDir(m_walletDir).filePath(walletName + ".keys"); + if(Utils::fileExists(walletPath)) { + ui->walletName->setStyleSheet(errStyle); + return false; + } + + return true; +} + +int CreateWalletPage::nextId() const { + auto restoredSeed = this->field("mnemonicRestoredSeed").toString(); + return restoredSeed.isEmpty() ? WalletWizard::Page_CreateWalletSeed : -1; +} + +bool CreateWalletPage::validatePage() { + if(!this->validateWidgets()) return false; + auto walletName = ui->walletName->text().replace(".keys", ""); + auto walletPath = QDir(m_walletDir).filePath(walletName + ".keys"); + this->setField("walletPath", walletPath); + ui->walletName->setStyleSheet(""); + + auto restoredSeed = this->field("mnemonicRestoredSeed").toString(); + if(!restoredSeed.isEmpty()) emit createWallet(); + return true; +} diff --git a/src/wizard/createwallet.h b/src/wizard/createwallet.h new file mode 100644 index 0000000..730f0c9 --- /dev/null +++ b/src/wizard/createwallet.h @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_CREATEWALLET_H +#define FEATHER_CREATEWALLET_H + +#include +#include +#include + +#include "appcontext.h" + +namespace Ui { + class CreateWalletPage; +} + +class CreateWalletPage : public QWizardPage +{ + Q_OBJECT + +public: + explicit CreateWalletPage(AppContext *ctx, QWidget *parent = nullptr); + bool validatePage() override; + int nextId() const override; + +signals: + void createWallet(); + +private: + AppContext *m_ctx; + QLabel *topLabel; + Ui::CreateWalletPage *ui; + QString m_walletDir; + bool validateWidgets(); +}; + +#endif //FEATHER_CREATEWALLET_H diff --git a/src/wizard/createwallet.ui b/src/wizard/createwallet.ui new file mode 100644 index 0000000..783d517 --- /dev/null +++ b/src/wizard/createwallet.ui @@ -0,0 +1,103 @@ + + + CreateWalletPage + + + + 0 + 0 + 400 + 335 + + + + Create Wallet + + + + + + + + + Password (Optional) + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Name + + + + + + + + + + Directory + + + + + + + + 180 + 16777215 + + + + Change directory + + + + + + + + + + QLineEdit::Password + + + + + + + + label_3 + label_9 + password + btnChange + directory + label + verticalSpacer + walletName + walletPath + + + walletName + walletPath + password + directory + btnChange + + + + diff --git a/src/wizard/createwalletseed.cpp b/src/wizard/createwalletseed.cpp new file mode 100644 index 0000000..e1c02d7 --- /dev/null +++ b/src/wizard/createwalletseed.cpp @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "wizard/createwalletseed.h" +#include "wizard/walletwizard.h" +#include "ui_createwalletseed.h" +#include "appcontext.h" + +#include +#include +#include + +CreateWalletSeedPage::CreateWalletSeedPage(AppContext *ctx, QWidget *parent) : + QWizardPage(parent), + m_ctx(ctx), + ui(new Ui::CreateWalletSeedPage) { + ui->setupUi(this); + this->setFinalPage(true); + this->setTitle("Wallet seed"); + + // hide ui element, we only need it for registerField + this->registerField("mnemonicSeed", ui->hiddenMnemonicSeed); + ui->hiddenMnemonicSeed->hide(); + + auto fontApp = QApplication::font(); + auto fontFamily = fontApp.family(); + auto fontSize = fontApp.pointSize() + 2; + m_seedFontFamily = fontFamily; + m_seedFontSize = fontSize; + + connect(ui->btnRoulette, &QPushButton::clicked, [=]{ + this->seedRoulette(0); + }); + + this->setButtonText(QWizard::FinishButton, "Create/Open wallet"); + + // generate new seed + this->seedRoulette(m_rouletteSpin - 1); +} + +void CreateWalletSeedPage::seedRoulette(int count) { + count += 1; + if(count > m_rouletteSpin) return; + auto seed = FeatherSeed::generate(m_ctx->restoreHeights[m_ctx->networkType], m_ctx->coinName.toStdString()); + m_mnemonic = seed.mnemonicSeed; + m_restoreHeight = seed.restoreHeight; + + this->displaySeed(m_mnemonic); + QTimer::singleShot(10, [=] { + this->seedRoulette(count); + }); +} + +void CreateWalletSeedPage::displaySeed(const QString &seed){ + auto html = R"(

        %3

        )"; + ui->seed->setText(QString(html).arg(m_seedFontFamily).arg(m_seedFontSize).arg(seed)); +} + +int CreateWalletSeedPage::nextId() const { + return -1; +} + +bool CreateWalletSeedPage::validatePage() { + if(m_mnemonic.isEmpty()) return false; + if(!m_restoreHeight) return false; + this->setField("mnemonicSeed", m_mnemonic); + this->setField("restoreHeight", m_restoreHeight); + emit createWallet(); + return true; +} \ No newline at end of file diff --git a/src/wizard/createwalletseed.h b/src/wizard/createwalletseed.h new file mode 100644 index 0000000..7ac90d3 --- /dev/null +++ b/src/wizard/createwalletseed.h @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_CREATEWALLETSEED_H +#define FEATHER_CREATEWALLETSEED_H + +#include +#include +#include + +#include "utils/utils.h" +#include "appcontext.h" + +namespace Ui { + class CreateWalletSeedPage; +} + +class CreateWalletSeedPage : public QWizardPage +{ + Q_OBJECT + +public: + explicit CreateWalletSeedPage(AppContext *ctx, QWidget *parent = nullptr); + bool validatePage() override; + int nextId() const override; +// bool isFinalPage() const; + +public slots: + void displaySeed(const QString &seed); + +private: + void seedRoulette(int count); + +signals: + void createWallet(); + +private: + AppContext *m_ctx; + QLabel *topLabel; + Ui::CreateWalletSeedPage *ui; + + QString m_mnemonic; + unsigned int m_restoreHeight; + + int m_seedFontSize; + QString m_seedFontFamily; + bool m_roulette = false; + int m_rouletteSpin = 15; +}; + +#endif //FEATHER_CREATEWALLETSEED_H diff --git a/src/wizard/createwalletseed.ui b/src/wizard/createwalletseed.ui new file mode 100644 index 0000000..571cc0b --- /dev/null +++ b/src/wizard/createwalletseed.ui @@ -0,0 +1,142 @@ + + + CreateWalletSeedPage + + + + 0 + 0 + 439 + 425 + + + + WizardPage + + + + + + + 75 + true + + + + WARNING: + + + + + + + + 0 + 0 + + + + Please save these 14 words on paper (order is important). This seed will allow you to recover your wallet in case of computer failure. + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Generate + + + + + + + + + <html><head/><body><style>p{margin:0}</style><p>• Never disclose your seed.</p><p>• Never type it on a website.</p><p>• Store it safely (offline).</p><p>• <b>Do not lose your seed!</b></p></body></html> + + + true + + + + + + + Your wallet generation seed is: + + + + + + + + 0 + 0 + + + + + 16777215 + 80 + + + + QFrame::Box + + + QFrame::Plain + + + 1 + + + true + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'.AppleSystemUIFont'; font-size:13pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html> + + + + + + + + + + + diff --git a/src/wizard/menu.cpp b/src/wizard/menu.cpp new file mode 100644 index 0000000..c927ce3 --- /dev/null +++ b/src/wizard/menu.cpp @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "wizard/menu.h" +#include "wizard/walletwizard.h" +#include "ui_menu.h" + +#include +#include +#include + +#include "libwalletqt/WalletManager.h" + +MenuPage::MenuPage(AppContext *ctx, QWidget *parent) : + QWizardPage(parent), + ui(new Ui::MenuPage), + m_ctx(ctx) { + ui->setupUi(this); + this->setTitle("Welcome to feather"); + this->setButtonText(QWizard::FinishButton, "Open recent wallet"); + ui->radioCreate->setChecked(true); +} + +int MenuPage::nextId() const { + if (ui->radioOpen->isChecked()) + return WalletWizard::Page_OpenWallet; + if (ui->radioCreate->isChecked()) + return WalletWizard::Page_CreateWallet; + if(ui->radioSeed->isChecked()) + return WalletWizard::Page_Restore; + return 0; +} + +bool MenuPage::validatePage() { + // Check if file exists + // Check if wallet has password + // Check if wallet can be decrypted with entered password + + // TODO: Check if password is correct, otherwise show error message + return true; +} \ No newline at end of file diff --git a/src/wizard/menu.h b/src/wizard/menu.h new file mode 100644 index 0000000..3b1c7bb --- /dev/null +++ b/src/wizard/menu.h @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_WIZARDMENU_H +#define FEATHER_WIZARDMENU_H + +#include +#include +#include + +#include "appcontext.h" + +namespace Ui { + class MenuPage; +} + +class MenuPage : public QWizardPage +{ + Q_OBJECT + +public: + explicit MenuPage(AppContext *ctx, QWidget *parent = nullptr); + bool validatePage() override; + int nextId() const override; + +private: + AppContext *m_ctx; + QLabel *topLabel; + Ui::MenuPage *ui; +}; + +#endif //FEATHER_WIZARDMENU_H diff --git a/src/wizard/menu.ui b/src/wizard/menu.ui new file mode 100644 index 0000000..2c6180e --- /dev/null +++ b/src/wizard/menu.ui @@ -0,0 +1,78 @@ + + + MenuPage + + + + 0 + 0 + 424 + 245 + + + + WizardPage + + + + + + + 400 + 0 + + + + Select option: + + + + + + + Create new wallet + + + + + + + Open wallet file + + + + + + + Restore wallet from seed + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + false + + + by dsc & thotbot + + + + + + + + diff --git a/src/wizard/network.cpp b/src/wizard/network.cpp new file mode 100644 index 0000000..3ceaec0 --- /dev/null +++ b/src/wizard/network.cpp @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "wizard/network.h" +#include "wizard/walletwizard.h" +#include "ui_network.h" + +#include +#include +#include + +#include "libwalletqt/WalletManager.h" + +NetworkPage::NetworkPage(AppContext *ctx, QWidget *parent) : + QWizardPage(parent), + ui(new Ui::NetworkPage), + m_ctx(ctx) { + ui->setupUi(this); + this->setTitle("Welcome to Feather!"); + this->setButtonText(QWizard::FinishButton, "walletKeysFilesModel"); + + ui->customFrame->hide(); + + QPixmap p(":assets/images/feather.png"); + ui->featherImage->setText(""); + ui->featherImage->setPixmap(p.scaled(128, 128, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + ui->label_eg->setText("Examples:\n- http://127.0.0.1:18089\n- my.node.com\n- my.node.com:18089\n- user:pass@my.node.com:18089"); + + auto nodeSourceUInt = config()->get(Config::nodeSource).toUInt(); + auto nodeSource = static_cast(nodeSourceUInt); + if(nodeSource == NodeSource::websocket){ + ui->radioRemote->setChecked(true); + ui->customFrame->hide(); + ui->remoteFrame->show(); + } else if(nodeSource == NodeSource::custom) { + ui->radioCustom->setChecked(true); + ui->remoteFrame->hide(); + ui->customFrame->show(); + } + + connect(ui->networkBtnGroup, QOverload::of(&QButtonGroup::buttonClicked), [=](QAbstractButton *button) { + auto name = button->objectName(); + if(name == "radioRemote") { + ui->customFrame->hide(); + ui->remoteFrame->show(); + } else if(name == "radioCustom") { + ui->remoteFrame->hide(); + ui->customFrame->show(); + } + }); +} + +int NetworkPage::nextId() const { + return 0; +} + +bool NetworkPage::validatePage() { + auto cfg = config()->get(Config::nodeSource); + if(ui->radioRemote->isChecked()) { + if(cfg != NodeSource::websocket) + m_ctx->nodeSourceChanged(NodeSource::websocket); + } else if (ui->radioCustom->isChecked()) { + if(cfg != NodeSource::custom) + m_ctx->nodeSourceChanged(NodeSource::custom); + auto nodeText = ui->lineEdit_customNode->text().trimmed(); + if(!nodeText.isEmpty()) { + auto customNodes = m_ctx->nodes->customNodes(); + auto node = FeatherNode(nodeText, 0, false); + customNodes.append(node); + m_ctx->setCustomNodes(customNodes); + } + + } + return true; +} \ No newline at end of file diff --git a/src/wizard/network.h b/src/wizard/network.h new file mode 100644 index 0000000..9a28652 --- /dev/null +++ b/src/wizard/network.h @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_WIZARDNETWORK_H +#define FEATHER_WIZARDNETWORK_H + +#include +#include +#include + +#include "appcontext.h" +#include "utils/nodes.h" + +namespace Ui { + class NetworkPage; +} + +class NetworkPage : public QWizardPage +{ + Q_OBJECT + +public: + explicit NetworkPage(AppContext *ctx, QWidget *parent = nullptr); + bool validatePage() override; + int nextId() const override; + +private: + AppContext *m_ctx; + QLabel *topLabel; + Ui::NetworkPage *ui; +}; + +#endif //FEATHER_WIZARDNETWORK_H diff --git a/src/wizard/network.ui b/src/wizard/network.ui new file mode 100644 index 0000000..62a5460 --- /dev/null +++ b/src/wizard/network.ui @@ -0,0 +1,237 @@ + + + NetworkPage + + + + 0 + 0 + 521 + 639 + + + + WizardPage + + + + + + How would you like to connect to the Monero network? + + + true + + + + + + + + + + + + 128 + 128 + + + + + 128 + 128 + + + + logo + + + + + + + Qt::Vertical + + + + 0 + 0 + + + + + + + + + + + + + + + + + + + Remote node (Automatic) + + + true + + + networkBtnGroup + + + + + + + Manually connect + + + networkBtnGroup + + + + + + + Qt::Vertical + + + + 0 + 0 + + + + + + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + 127.0.0.1:18089 + + + + + + + Custom node + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + e.g: + + + true + + + + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Automatically connect to a remote node, hosted by the feather team and various trusted Monero community members. These nodes are provided as "best effort". + + + true + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + diff --git a/src/wizard/openwallet.cpp b/src/wizard/openwallet.cpp new file mode 100644 index 0000000..4d5436a --- /dev/null +++ b/src/wizard/openwallet.cpp @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "wizard/openwallet.h" +#include "ui_openwallet.h" +#include "appcontext.h" +#include "utils/config.h" + +#include +#include + +// @TODO: rescan wallet dir on wizard open + +OpenWalletPage::OpenWalletPage(AppContext *ctx, QWidget *parent) : + QWizardPage(parent), + ui(new Ui::OpenWalletPage), + m_ctx(ctx) { + ui->setupUi(this); + + connect(ui->btnBrowse, &QPushButton::clicked, [=]{ + // manually browsing for wallet + auto walletPath = config()->get(Config::walletPath).toString(); + if(walletPath.isEmpty()) + walletPath = m_ctx->defaultWalletDir; + QString path = QFileDialog::getOpenFileName(this, "Select your wallet file", walletPath, "Wallet file (*.keys)"); + if(path.isEmpty()) return; + + QFileInfo infoPath(path); + if(!infoPath.isReadable()) { + Utils::showMessageBox("Cannot read wallet file", "Permission error.", true); + return; + } + + setField("walletPath", path); + + if(ui->openOnStartup->isChecked()) + config()->set(Config::autoOpenWalletPath, QString("%1%2").arg(m_ctx->networkType).arg(path)); + + emit openWallet(path); + }); + + this->setTitle("Open wallet file"); + this->setButtonText(QWizard::FinishButton, "Open wallet"); + + ui->walletTable->setSelectionBehavior(QAbstractItemView::SelectRows); + ui->walletTable->setContextMenuPolicy(Qt::CustomContextMenu); + + this->walletKeysFilesModel = new WalletKeysFilesModel(m_ctx); + this->walletKeysFilesModel->refresh(); + + m_keysProxy = new WalletKeysFilesProxyModel(); + m_keysProxy->setSourceModel(this->walletKeysFilesModel); + m_keysProxy->setSortRole(Qt::UserRole); + + ui->walletTable->setModel(m_keysProxy); + ui->walletTable->header()->setSectionResizeMode(QHeaderView::ResizeToContents); + ui->walletTable->header()->setSectionResizeMode(WalletKeysFilesModel::Path, QHeaderView::Stretch); + ui->walletTable->setSortingEnabled(true); + ui->walletTable->sortByColumn(WalletKeysFilesModel::Modified, Qt::AscendingOrder); // @TODO: this does not work + ui->walletTable->show(); +} + +int OpenWalletPage::nextId() const { + return -1; +} + +bool OpenWalletPage::validatePage() { + QModelIndex index = ui->walletTable->currentIndex(); + QString walletPath = index.model()->data(index.siblingAtColumn(WalletKeysFilesModel::ModelColumns::Path), Qt::UserRole).toString(); + + auto autoWallet = ui->openOnStartup->isChecked() ? QString("%1%2").arg(m_ctx->networkType).arg(walletPath) : ""; + config()->set(Config::autoOpenWalletPath, autoWallet); + + emit openWallet(walletPath); + return true; +} diff --git a/src/wizard/openwallet.h b/src/wizard/openwallet.h new file mode 100644 index 0000000..b9f1929 --- /dev/null +++ b/src/wizard/openwallet.h @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_OPENWALLET_H +#define FEATHER_OPENWALLET_H + +#include +#include +#include + +#include "appcontext.h" +#include "utils/keysfiles.h" + +namespace Ui { + class OpenWalletPage; +} + +class OpenWalletPage : public QWizardPage +{ + Q_OBJECT + +public: + explicit OpenWalletPage(AppContext *ctx, QWidget *parent = nullptr); + bool validatePage() override; + int nextId() const override; + +signals: + void openWallet(QString path); + +private: + AppContext *m_ctx; + WalletKeysFilesModel *walletKeysFilesModel; + WalletKeysFilesProxyModel *m_keysProxy; + QSortFilterProxyModel *ll; + QLabel *topLabel; + Ui::OpenWalletPage *ui; + QStandardItemModel *m_model; +}; + +#endif //FEATHER_OPENWALLET_H diff --git a/src/wizard/openwallet.ui b/src/wizard/openwallet.ui new file mode 100644 index 0000000..1010470 --- /dev/null +++ b/src/wizard/openwallet.ui @@ -0,0 +1,62 @@ + + + OpenWalletPage + + + + 0 + 0 + 729 + 414 + + + + WizardPage + + + + + + false + + + false + + + + + + + + + Open on startup + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Browse + + + + + + + + + + diff --git a/src/wizard/restorewallet.cpp b/src/wizard/restorewallet.cpp new file mode 100644 index 0000000..0f37a05 --- /dev/null +++ b/src/wizard/restorewallet.cpp @@ -0,0 +1,166 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "wizard/restorewallet.h" +#include "wizard/walletwizard.h" +#include "ui_restorewallet.h" + +#include +#include +#include +#include +#include + +#include // tevador 14 word + +#include "libwalletqt/WalletManager.h" + +RestorePage::RestorePage(AppContext *ctx, QWidget *parent) : + QWizardPage(parent), + ui(new Ui::RestorePage), + m_ctx(ctx) { + ui->setupUi(this); + this->setTitle("Restore wallet"); + this->setButtonText(QWizard::FinishButton, "walletKeysFilesModel"); + ui->restoreFrame->hide(); + ui->label_errorString->hide(); + + QFont f("feather"); + f.setStyleHint(QFont::Monospace); + + auto data = Utils::fileOpen(":/assets/mnemonic_25_english.txt"); + for(const auto &seed_word: data.split('\n')) + m_words25 << seed_word; + for(unsigned int i = 0; i != 2048; i++) + m_words14 << QString::fromStdString(wordlist::english.get_word(i)); + + // + m_completer14Model = new QStringListModel(m_words14, m_completer14); + m_completer14 = new QCompleter(this); + m_completer14->setModel(m_completer14Model); + m_completer14->setModelSorting(QCompleter::CaseInsensitivelySortedModel); + m_completer14->setCaseSensitivity(Qt::CaseInsensitive); + m_completer14->setWrapAround(false); + // + m_completer25Model = new QStringListModel(m_words25, m_completer25); + m_completer25 = new QCompleter(this); + m_completer25->setModel(m_completer25Model); + m_completer25->setModelSorting(QCompleter::CaseInsensitivelySortedModel); + m_completer25->setCaseSensitivity(Qt::CaseInsensitive); + m_completer25->setWrapAround(false); + // + ui->seedEdit->setCompleter(m_completer14); + ui->seedEdit->setAcceptRichText(false); + ui->seedEdit->setMaximumHeight(80); + ui->seedEdit->setFrameShape(QFrame::Box); + ui->seedEdit->setFrameShadow(QFrame::Plain); + ui->seedEdit->setFont(f); + ui->seedEdit->setPlaceholderText("Insert your mnemonic 14 word seed..."); + // + + auto *dummyRestoredSeed = new QLineEdit(this); + dummyRestoredSeed->setVisible(false); + auto *restoreHeightEdit = new QLineEdit(this); + restoreHeightEdit->setVisible(false); + + this->registerField("mnemonicRestoredSeed", dummyRestoredSeed); + this->registerField("restoreHeight", restoreHeightEdit); + +#ifndef QT_NO_CURSOR + QGuiApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + QGuiApplication::restoreOverrideCursor(); +#endif + + connect(ui->seedBtnGroup, QOverload::of(&QButtonGroup::buttonClicked), [=](QAbstractButton *button){ + auto name = button->objectName(); + if(name == "radio25") { + m_mode = 25; + ui->label_errorString->hide(); + ui->seedEdit->setStyleSheet(""); + ui->seedEdit->setCompleter(m_completer25); + ui->restoreFrame->show(); + ui->seedEdit->setPlaceholderText("Insert your mnemonic 25 word seed..."); + } else if (name == "radio14") { + m_mode = 14; + ui->label_errorString->hide(); + ui->seedEdit->setStyleSheet(""); + ui->seedEdit->setCompleter(m_completer14); + ui->restoreFrame->hide(); + ui->seedEdit->setPlaceholderText("Insert your mnemonic 14 word seed..."); + } + + ui->seedEdit->setText(""); + }); + + if(m_ctx->networkType == NetworkType::Type::TESTNET) { + ui->restoreHeightWidget->hideSlider(); + } else { + // load restoreHeight lookup db + ui->restoreHeightWidget->initRestoreHeights(m_ctx->restoreHeights[m_ctx->networkType]); + } +} + +int RestorePage::nextId() const { + return WalletWizard::Page_CreateWallet; +} + +void RestorePage::cleanupPage() const {} + +bool RestorePage::validatePage() { + ui->label_errorString->hide(); + auto errStyle = "QTextEdit{border: 1px solid red;}"; + unsigned int restoreHeight = ui->restoreHeightWidget->getHeight(); + auto seed = ui->seedEdit->toPlainText().replace("\n", "").replace("\r", "").trimmed(); + auto seedSplit = seed.split(" "); + + if(m_mode == 14) { + if(seedSplit.length() != 14) { + ui->label_errorString->show(); + ui->label_errorString->setText("The mnemonic seed should be 14 words."); + ui->seedEdit->setStyleSheet(errStyle); + return false; + } + + for(const auto &word: seedSplit) { + if(!m_words14.contains(word)) { + ui->label_errorString->show(); + ui->label_errorString->setText(QString("Mnemonic seed contains an unknown word: %1").arg(word)); + ui->seedEdit->setStyleSheet(errStyle); + return false; + } + } + + auto _seed = FeatherSeed::fromSeed(m_ctx->restoreHeights[m_ctx->networkType], "monero", seed.toStdString()); + restoreHeight = _seed.restoreHeight; + + this->setField("restoreHeight", restoreHeight); + this->setField("mnemonicRestoredSeed", seed); + return true; + } else if(m_mode == 25) { + if(seedSplit.length() != 25) { + ui->label_errorString->show(); + ui->label_errorString->setText("The mnemonic seed should be 25 words."); + ui->seedEdit->setStyleSheet(errStyle); + return false; + } + + for(const auto &word: seedSplit) { + if(!m_words25.contains(word)) { + ui->label_errorString->show(); + ui->label_errorString->setText(QString("Mnemonic seed contains an unknown word: %1").arg(word)); + ui->seedEdit->setStyleSheet(errStyle); + return false; + } + } + + auto _seed = FeatherSeed::fromSeed(m_ctx->restoreHeights[m_ctx->networkType], "monero", seed.toStdString()); + _seed.setRestoreHeight(restoreHeight); + this->setField("restoreHeight", restoreHeight); + this->setField("mnemonicSeed", seed); + this->setField("mnemonicRestoredSeed", seed); + return true; + } + + ui->seedEdit->setStyleSheet(errStyle); + return false; +} diff --git a/src/wizard/restorewallet.h b/src/wizard/restorewallet.h new file mode 100644 index 0000000..3a3049d --- /dev/null +++ b/src/wizard/restorewallet.h @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_WIZARDRESTORE_H +#define FEATHER_WIZARDRESTORE_H + +#include +#include +#include +#include +#include +#include + +#include "utils/textedit.h" +#include "appcontext.h" + +namespace Ui { + class RestorePage; +} + +class RestorePage : public QWizardPage +{ + Q_OBJECT + +public: + explicit RestorePage(AppContext *ctx, QWidget *parent = nullptr); + bool validatePage() override; + int nextId() const override; + void cleanupPage() const; + +private: + AppContext *m_ctx; + QLabel *topLabel; + Ui::RestorePage *ui; + + unsigned int m_mode = 14; + QStringList m_words14; + QStringList m_words25; + QStringListModel *m_completer14Model = nullptr; + QStringListModel *m_completer25Model = nullptr; + QCompleter *m_completer14 = nullptr; + QCompleter *m_completer25 = nullptr; +}; + +#endif diff --git a/src/wizard/restorewallet.ui b/src/wizard/restorewallet.ui new file mode 100644 index 0000000..dbd9122 --- /dev/null +++ b/src/wizard/restorewallet.ui @@ -0,0 +1,172 @@ + + + RestorePage + + + + 0 + 0 + 502 + 506 + + + + RestorePage + + + + + + 14 word mnemonic seed + + + true + + + seedBtnGroup + + + + + + + 25 word mnemonic seed + + + seedBtnGroup + + + + + + + + 0 + 0 + + + + + 16777215 + 120 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + false + + + + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + You may specify the "restore height". This is the moment you first created your wallet, expressed through a blockheight (number). This speeds up wallet refreshes. If you don't know, leave it empty. + + + true + + + + + + + + + + errorString + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + RestoreHeightWidget + QWidget +
        widgets/restoreheightwidget.h
        + 1 +
        + + TextEdit + QTextEdit +
        utils/textedit.h
        +
        +
        + + + + + +
        diff --git a/src/wizard/walletwizard.cpp b/src/wizard/walletwizard.cpp new file mode 100644 index 0000000..112aad7 --- /dev/null +++ b/src/wizard/walletwizard.cpp @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "utils/utils.h" +#include "wizard/walletwizard.h" +#include "wizard/menu.h" +#include "wizard/openwallet.h" +#include "wizard/createwallet.h" +#include "wizard/network.h" +#include "wizard/createwalletseed.h" +#include "wizard/restorewallet.h" + +#include +#include +#include +#include +#include + +WalletWizard::WalletWizard(AppContext *ctx, WalletWizard::Page startPage, QWidget *parent) : QWizard(parent), + m_ctx(ctx) { + this->setWindowTitle("Welcome to feather"); + this->setWindowIcon(QIcon(":/assets/images/appicons/64x64.png")); + auto openWalletPage = new OpenWalletPage(m_ctx); + auto createWallet = new CreateWalletPage(m_ctx); + auto createWalletSeed = new CreateWalletSeedPage(m_ctx); + setPage(Page_Menu, new MenuPage(m_ctx)); + setPage(Page_CreateWallet, createWallet); + setPage(Page_OpenWallet, openWalletPage); + setPage(Page_CreateWalletSeed, createWalletSeed); + setPage(Page_Network, new NetworkPage(m_ctx)); + setPage(Page_Restore, new RestorePage(m_ctx)); + + if(config()->get(Config::firstRun).toUInt()) + setStartId(Page_Network); + else + setStartId(Page_Menu); + + setPixmap(QWizard::WatermarkPixmap, QPixmap(":/assets/images/photos/1.png")); + setWizardStyle(WizardStyle::ModernStyle); + setOption(QWizard::NoBackButtonOnStartPage); + + connect(this, &QWizard::rejected, [=]{ + return QApplication::exit(1); + }); + + connect(createWalletSeed, &CreateWalletSeedPage::createWallet, this, &WalletWizard::createWallet); + connect(createWallet, &CreateWalletPage::createWallet, this, &WalletWizard::createWallet); + + connect(openWalletPage, &OpenWalletPage::openWallet, [=](const QString &path){ + const auto walletPasswd = this->field("walletPasswd").toString(); + emit openWallet(path, walletPasswd); + }); +} + +void WalletWizard::createWallet() { + auto mnemonicSeed = this->field("mnemonicSeed").toString(); + const auto walletPath = this->field("walletPath").toString(); + const auto walletPasswd = this->field("walletPasswd").toString(); + auto restoreHeight = this->field("restoreHeight").toUInt(); + + auto seed = FeatherSeed::fromSeed(m_ctx->restoreHeights[m_ctx->networkType], m_ctx->coinName.toStdString(), mnemonicSeed.toStdString()); + if(restoreHeight > 0) + seed.setRestoreHeight(restoreHeight); + m_ctx->createWallet(seed, walletPath, walletPasswd); +} \ No newline at end of file diff --git a/src/wizard/walletwizard.h b/src/wizard/walletwizard.h new file mode 100644 index 0000000..1d54ffd --- /dev/null +++ b/src/wizard/walletwizard.h @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef WALLETWIZARD_H +#define WALLETWIZARD_H + +#include +#include +#include + +#include "appcontext.h" +#include "utils/seeds.h" +#include "utils/config.h" + +class WalletWizard : public QWizard +{ + Q_OBJECT + +public: + enum Page { Page_Menu, Page_CreateWallet, Page_CreateWalletSeed, Page_OpenWallet, Page_Network, Page_Restore }; + + explicit WalletWizard(AppContext *ctx, WalletWizard::Page startPage = WalletWizard::Page::Page_Menu, QWidget *parent = nullptr); +signals: + void openWallet(QString path, QString password); + +private: + AppContext *m_ctx; + void createWallet(); +}; + +#endif // WALLETWIZARD_H diff --git a/src/xmrtowidget.cpp b/src/xmrtowidget.cpp new file mode 100644 index 0000000..fb930a2 --- /dev/null +++ b/src/xmrtowidget.cpp @@ -0,0 +1,189 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "xmrtowidget.h" +#include "ui_xmrtowidget.h" +#include "dialog/xmrtoinfodialog.h" +#include "libwalletqt/WalletManager.h" +#include "mainwindow.h" + +#include +#include + +XMRToWidget::XMRToWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::XMRToWidget) +{ + ui->setupUi(this); + + QString amount_rx = R"(^\d*\.\d*$)"; + QRegExp rx; + rx.setPattern(amount_rx); + QValidator *validator = new QRegExpValidator(rx, this); + ui->lineAmount->setValidator(validator); + + // xmrto logo (c) binaryFate et. al. :-D + QPixmap p(":assets/images/xmrto_big.png"); + ui->logo->setPixmap(p.scaled(112, 32, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + + ui->ratesLayout->hide(); + + // context menu + m_contextMenu = new QMenu(); + m_showDetailsAction = m_contextMenu->addAction("Details"); + m_viewOnXmrToAction = m_contextMenu->addAction("View order on XMR.to"); + m_viewOnXmrToAction->setIcon(QIcon(":/assets/images/xmrto.png")); + connect(m_showDetailsAction, &QAction::triggered, [&](){ + QModelIndex index = ui->historyTable->currentIndex(); + XmrToOrder *order = this->tableModel->orders->at(index.row()); + auto * dialog = new XmrToInfoDialog(order, this); + dialog->exec(); + }); + connect(m_viewOnXmrToAction, &QAction::triggered, [&](){ + QModelIndex index = ui->historyTable->currentIndex(); + XmrToOrder *order = this->tableModel->orders->at(index.row()); + emit viewOrder(order->uuid); + }); + + // connects + connect(ui->btnGetRates, &QPushButton::pressed, this, &XMRToWidget::onGetRates); + connect(ui->lineAmount, &QLineEdit::textChanged, this, &XMRToWidget::updateConversionLabel); + connect(ui->comboBox_currency, &QComboBox::currentTextChanged, this, &XMRToWidget::updateConversionLabel); + connect(ui->torCheckBox, &QCheckBox::stateChanged, this, &XMRToWidget::onTorCheckBoxToggled); + connect(ui->btnCreate, &QPushButton::clicked, this, &XMRToWidget::onCreateOrder); + + ui->historyTable->header()->setStretchLastSection(true); + ui->historyTable->header()->setSectionResizeMode(QHeaderView::ResizeToContents); + ui->historyTable->setSelectionBehavior(QAbstractItemView::SelectRows); + ui->historyTable->setContextMenuPolicy(Qt::CustomContextMenu); + connect(ui->historyTable, &QTreeView::customContextMenuRequested, [&](const QPoint & point){ + QModelIndex index = ui->historyTable->indexAt(point); + if (index.isValid()) { + m_contextMenu->popup(ui->historyTable->viewport()->mapToGlobal(point)); + } + }); +} + +void XMRToWidget::setHistoryModel(XmrToModel *model) { + this->tableModel = model; + this->ui->historyTable->setModel(model); +} + +void XMRToWidget::onBalanceUpdated(double balance, double unlocked, const QString &balance_str, const QString &unlocked_str) { + this->m_unlockedBalance = unlocked; +} + +void XMRToWidget::onWalletClosed() { + ui->lineAddress->clear(); + ui->lineAmount->clear(); + ui->xmrLabelEstimate->setText("0.00 XMR"); +} + +void XMRToWidget::onCreateOrder() { + // @TODO: regex verify + if(m_ctx == nullptr) + this->m_ctx = MainWindow::getContext(); + + auto amount = ui->lineAmount->text(); + if(amount.isEmpty()) { + Utils::showMessageBox("Cannot create XMR.To order", "Invalid amount", false); + return; + } + + double amount_num = amount.toDouble(); + QString amount_cur = (ui->comboBox_currency->currentIndex() == curr::BTC) ? "BTC" : "XMR"; + double amount_xmr = amount_num; + if (ui->comboBox_currency->currentIndex() == curr::BTC) { + amount_xmr = AppContext::prices->convert("BTC", "XMR", amount_num); + } + + auto available = m_unlockedBalance; + if(amount_xmr > available){ + Utils::showMessageBox("Cannot create XMR.To order", "Not enough Monero to create order.", false); + return; + } + + ui->btnGetRates->setEnabled(false); + ui->btnCreate->setEnabled(false); + + auto btc_address = ui->lineAddress->text(); + emit createOrder(amount_num, amount_cur, btc_address); + + QTimer::singleShot(2000, [=] { + ui->lineAmount->clear(); + ui->lineAddress->clear(); + ui->btnGetRates->setEnabled(true); + }); +} + +void XMRToWidget::onTorCheckBoxToggled(int state) { + ui->btnGetRates->setEnabled(true); + ui->btnCreate->setEnabled(false); + emit networkChanged(!state); +} + +void XMRToWidget::updateConversionLabel() { + if(m_ctx == nullptr) + this->m_ctx = MainWindow::getContext(); + + QString amount = ui->lineAmount->text(); + + int curIndex = ui->comboBox_currency->currentIndex(); + QString symbolFrom = (curIndex == curr::XMR) ? "XMR" : "BTC"; + QString symbolTo = (curIndex == curr::XMR) ? "BTC" : "XMR"; + + if(amount.isEmpty()) { + ui->xmrLabelEstimate->setText(QString("0.00 %1").arg(symbolTo)); + return; + } + auto amount_num = amount.toDouble(); + auto amount_converted = AppContext::prices->convert(symbolFrom, symbolTo, amount_num); + auto amount_converted_str = QString::number(amount_converted, 'f', 2); + + auto fiat_cur = config()->get(Config::preferredFiatCurrency).toString(); + auto amount_fiat = AppContext::prices->convert(symbolFrom, fiat_cur, amount_num); + auto amount_fiat_str = QString::number(amount_fiat, 'f', 2); + + ui->xmrLabelEstimate->setText(QString("%1 %2, %3 %4").arg(amount_converted_str, symbolTo, amount_fiat_str, fiat_cur)); +} + +void XMRToWidget::onGetRates() { + ui->btnGetRates->setEnabled(false); + ui->btnCreate->setEnabled(false); + emit getRates(); +} + +void XMRToWidget::onConnectionError(QString msg) { + ui->btnGetRates->setEnabled(true); + ui->btnCreate->setEnabled(false); + msg = QString("%1\n\n%2").arg(msg).arg(m_regionBlockMessage); + QMessageBox::warning(this, "XMR.To Connection Error", msg); +} + +void XMRToWidget::onConnectionSuccess() { + ui->btnGetRates->setEnabled(true); + ui->btnCreate->setEnabled(true); +} + +void XMRToWidget::onRatesUpdated(XmrToRates rates) { + ui->label_rate->setText(QString("%1 BTC").arg(QString::number(rates.price))); + ui->label_minimum->setText(QString("%1 BTC").arg(QString::number(rates.lower_limit))); + ui->label_maximum->setText(QString("%1 BTC").arg(QString::number(rates.upper_limit))); + + if(!m_ratesDisplayed) { + ui->ratesLayout->setVisible(true); + m_ratesDisplayed = true; + } +} + +void XMRToWidget::onInitiateTransaction() { + ui->btnCreate->setEnabled(false); +} + +void XMRToWidget::onEndTransaction() { + ui->btnCreate->setEnabled(true); +} + +XMRToWidget::~XMRToWidget() { + delete ui; +} diff --git a/src/xmrtowidget.h b/src/xmrtowidget.h new file mode 100644 index 0000000..8d33d7a --- /dev/null +++ b/src/xmrtowidget.h @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef XMRTOWIDGET_H +#define XMRTOWIDGET_H + +#include +#include "widgets/tickerwidget.h" +#include "utils/xmrto.h" +#include "appcontext.h" + +namespace Ui { + class XMRToWidget; +} + +class XMRToWidget : public QWidget +{ +Q_OBJECT + +public: + explicit XMRToWidget(QWidget *parent = nullptr); + void setHistoryModel(XmrToModel *model); + ~XMRToWidget(); + +public slots: + void onWalletClosed(); + void onGetRates(); + void onConnectionError(QString msg); + void onConnectionSuccess(); + void onRatesUpdated(XmrToRates rates); + void onTorCheckBoxToggled(int state); + void onCreateOrder(); + void onBalanceUpdated(double balance, double unlocked, const QString &balance_str, const QString &unlocked_str); + void updateConversionLabel(); + + void onInitiateTransaction(); + void onEndTransaction(); + +signals: + void getRates(); + void networkChanged(bool clearnet); + void createOrder(double btnAmount, QString currency, QString btnAddress); + void viewOrder(const QString &orderId); + +private: + QMap m_tickerWidgets; + QMenu *m_contextMenu; + QAction *m_viewOnXmrToAction; + QAction *m_showDetailsAction; + + Ui::XMRToWidget *ui; + AppContext *m_ctx; + bool m_ratesDisplayed = false; + const QString m_regionBlockMessage = "Beware that XMR.To region blocks certain IPs, which can be problematic in combination with Tor. Use the clearnet option if this is a problem."; + double m_unlockedBalance = 0; + XmrToModel *tableModel; + + enum curr { + BTC = 0, + XMR + }; +}; + +#endif diff --git a/src/xmrtowidget.ui b/src/xmrtowidget.ui new file mode 100644 index 0000000..8726ea7 --- /dev/null +++ b/src/xmrtowidget.ui @@ -0,0 +1,327 @@ + + + XMRToWidget + + + + 0 + 0 + 896 + 472 + + + + Form + + + + + + + + + + Relay over Tor + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Get Rates + + + + + + + false + + + Create Order + + + + + + + + + Amount + + + + + + + + + 0 + + + + + + 0 + 0 + + + + + + + + + + + + + + + BTC + + + + + XMR + + + + + + + + + + 0.00 XMR + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + 0 + 0 + + + + + + + BTC address + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 169 + 48 + + + + - + + + + + + + + + Pay to + + + + + + + + + QFrame::Sunken + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 0 + + + 1 + + + 0 + + + 6 + + + + + Rate (1 XMR) + + + + 6 + + + 6 + + + 6 + + + 4 + + + + + Rate + + + + + + + + + + Minimum + + + + 6 + + + 6 + + + 6 + + + 4 + + + + + Minimum + + + + + + + + + + Maximum + + + + 6 + + + 6 + + + 6 + + + 4 + + + + + Maximum + + + + + + + + + + + + + false + + + + + + + + diff --git a/utils/Info.plist b/utils/Info.plist new file mode 100644 index 0000000..00d3929 --- /dev/null +++ b/utils/Info.plist @@ -0,0 +1,61 @@ + + + + + LSMinimumSystemVersion + 10.10.0 + + NSPrincipalClass + NSApplication + + CFBundleIconFile + appicon.icns + + CFBundlePackageType + APPL + + CFBundleSignature + ???? + + CFBundleExecutable + feather + + CFBundleName + Feather + + NSHumanReadableCopyright + Copyright © 2014-2021 The Monero Project + + CFBundleIdentifier + org.monero-project.feather + + CFBundleVersion + @VERSION_LONG@ + + CFBundleShortVersionString + @VERSION@ + + NSSupportsAutomaticGraphicsSwitching + + + CFBundleURLTypes + + + CFBundleURLName + monero Handler + CFBundleURLSchemes + + monero + + + + CFBundleURLName + moneroseed Handler + CFBundleURLSchemes + + moneroseed + + + + + diff --git a/utils/build_macos.sh b/utils/build_macos.sh new file mode 100644 index 0000000..11234aa --- /dev/null +++ b/utils/build_macos.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# Used for macos buildbot +HASH="$1" +echo "[+] hash: $HASH" + +echo "[+] Building" + +rm ~/feather.zip 2>&1 >/dev/null +cd ~/feather +git fetch +git reset --hard "$HASH" +git submodule update --init --depth 50 contrib/tor +git submodule update --init --depth 50 contrib/torsocks +git submodule update --init --depth 120 monero +git submodule update --init --depth 120 --recursive monero + +CMAKE_PREFIX_PATH=~/Qt/5.15.1/clang_64 make -j3 mac-release + +if [[ $? -eq 0 ]]; then + echo "[+] Feather built OK" + cd ~/feather/build/bin + zip -qr ~/feather.zip feather.app +else + echo "[+] Error!" + exit 1; +fi diff --git a/utils/images/feather-home.png b/utils/images/feather-home.png new file mode 100644 index 0000000000000000000000000000000000000000..85dcc67d65ed583859e60ce601074fb029ccb84c GIT binary patch literal 59501 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 literal 0 HcmV?d00001 diff --git a/utils/pubkeys/dsc.asc b/utils/pubkeys/dsc.asc new file mode 100644 index 0000000..17fdca2 --- /dev/null +++ b/utils/pubkeys/dsc.asc @@ -0,0 +1,52 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=YJQh +-----END PGP PUBLIC KEY BLOCK----- + diff --git a/utils/pubkeys/kitware.asc b/utils/pubkeys/kitware.asc new file mode 100644 index 0000000..2e6c3b0 --- /dev/null +++ b/utils/pubkeys/kitware.asc @@ -0,0 +1,64 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=0GnF +-----END PGP PUBLIC KEY BLOCK----- diff --git a/utils/pubkeys/tobtoht.asc b/utils/pubkeys/tobtoht.asc new file mode 100644 index 0000000..8fa20f4 --- /dev/null +++ b/utils/pubkeys/tobtoht.asc @@ -0,0 +1,59 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBF2zfmoBEACrlG7MvTd0QpmSelCDHjO/speQpS34Up+PlJmtRqKXaTKap4ex +RmG0rEfJtaybkckrxJvl+niphLZeQfuxukyUGiqhRsjQLpSD2y3CXqfHkAQYY8Kl +ZGPRhRWCjGG9kbz+yoXz27/anszObHZwlK/JoBdn2u+O9tw8el+zaS5uewYCwEOn +ixrUdRhPLCLqz9rpO8YAwdEOk83ENr6U4xAwKBo2rhWPNBlNtG2KJAz+mS/Yarpz +vr/KFV09sDIgypJkkD+h6YpZ6xIRHa4mlDk6UvK2sGupMh6LU/LRMywaDurNMqOt +F4ja1abmyR5zZclLtx8fNqgRM9/EdKFL4+N1fp5CbJqIbI5kEYeyHtrGZCNQYP1m +yz8AcFIqd0BF9R0Fr0SYmnePqJWdIszE9JC+G0VccGzssHc30JUbvV4YyqlRq2m/ +ypb24Wr52ttHWVi+I+/LvRsfrRKpIG4VjQKAQ3FZF/MoY9YbPuZusVgx2X9RwtuO +AxgsTCNnkqXg2FC/NkeYluHRwSFMSMX2lFQcMK0+qo7xQCZ6Wx+GXTPSk6NLmnqt +l0J6fDUXLdKEr/wdVmeiyMcxjZGYOHLJOJ39QwxBiq11Y4BboYz4WUKtFDZJCkLJ +YoMkFNgoiDqPher9TZ3xcPRdvfuoDcn9GCcAjs0RRFNGskjdx4ujfbxHgQARAQAB +tEx0aG90Ym90ICgvdS9UaG90Ym90IG9uIERyZWFkLCAvdS90b2J0b2h0IG9uIFJl +ZGRpdCkgPHRob3Rib3RAcHJvdG9ubWFpbC5jb20+iQJOBBMBCAA4FiEExavlwOUP +orPxSrktHK3Sf0H0XDwFAl2zfmoCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AA +CgkQHK3Sf0H0XDxtXQ//Uw7SAH2tlwTTE/ehJbg2fZG4Jfn91XKtpEE8yMtqIHQc +QiGAp7pe/c851TTJ2aug6y0/9/usp4qMPhx4l/vNOHwe5sk+a2jm/Wxh+lfJqv6Q ++En7JmKRE7ZFCaTirEY5u4Qxepg/tSqD29ZN2uHeAVx3RTHSO05R6RMe6PPjEvsB +4xTOK7pKXI1Oxy0RJwRZSum8wwBUvmfeE78colyBekbl1A2TuIfEmfzPY+UjaxQj +28DUYsZ6RqFGBRnf6cMWm2iZx9FaLEZhqZUFL746vxIGwADgJmanI+f25UMPQfTP +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 +RR9alvpX5jGtupg5+1E= +=hD7u +-----END PGP PUBLIC KEY BLOCK-----

        >MRgfV9eDwMF%eD3mXvo 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 X_dnAijvyjf00000NkvXXu0mjfW&b({ literal 0 HcmV?d00001 diff --git a/src/assets/images/trezor.png b/src/assets/images/trezor.png new file mode 100644 index 0000000000000000000000000000000000000000..3edee94f83747f3ecae17b5dd7be1b7d4b72fc67 GIT binary patch literal 2606 zcmV+}3eok6P)^#z-zZ4h-T3seLJ3AJj04=qY# zsY)NAK}w{4NK2(EO@bO#sd!W=V6{Q%3+k9wNt@UNXehMh6qfR6wV04snczyjbNpa@6+5ugWn z4>%8;0WJWyb;_F-rbECAU@cG&dH3<;O{^qa6fkeOM#yP-ArCMy%Ym}3#e;N*GLK@lW7l7h&_v%hdkGeOnF?R&@6*Z76D&D z=6qIAKp*f|;LpH0M7%-d<5nRnl!t)NB9m?_LTX4K{72x|CV6KRyOEbSYhns%;(r0Q z0+o7&jiCtm4Db>#fO*;J@?SxghIzqU;7?fV`;x#xWDRVG3gG)lQ#Y$a0iD1a-I8V? zYmk+O*-NE>-vM>{#h6kIJcIO^W_2ZiA29Jcdq$uE-$oYvW-s+V@J0P%Eb}2`bz^4j zDWC}`)h{M@occ0_z;djWcLEt5bD;xqN|=qX8n77YUR=S-3tOQWu?n*hGKPpZV3N-Y zr+{{|Oh5prHp?_woD$H7jCN)M_9G5aC%A!h2WI$yGP6vR#VG;jV9gUUjLiF-U5WsgNnpph3Egc!VZ}9SgKNRhfufpPww=34TkF!&ors2WJsx1`&7&}Yg1$a%5J(9C51&PdlMds4N%^5(K6;O=` zr@t1HD3R0vDU@DT{2m{ro)YGJtJqlaFgvR^7zqhtk>f4)ngpx!5H~#Y@wj2=j99ac(4f zvwvC*gwj@+7XqSVeNEwJj)YIrpNtwjk~^m&r+K;exKUGH0Qn`K$kraKYlNcg0l6$X`3r88bY z`z5b)8}H-&Bma<)j(N32pA+wz_x)4L{d(il(2?DeXD@Hu)uLmIGT#P+V^E+ zP+#6yU3WXI#%zNfUX^EnQ6EoU?s2%x$?y9Ahm63eKq(! zrp{2uF{;-M0SkdI1HS-%34E2@u4igP&e#FqFA!(wRO2rwM$dhEaD#j9KBFpuN34 z!%}xvZ{VS_)vor1b-o%N4{T+Dcie&Z{mA_`mir-q>&SuW0CGc`o&A)F(2%9tO5h8~ zm7wJ=+iuw=;+ii$)>e?c*RPcf(Z-yxjLXyK0WSYQi}mam~W^CPta zKh`wuI@lBN-^lGkZz1Mejf}KT3R#Ste_Mk@H&imxN;*3`S+{N-RaGDKefN3iGLVY% zulNSAbUh+r@{8fi7hDn>Wwzf8wE?qjVDKGPVlsex+qNx~N!#xbEgh@&I)cI<7EU<;$ zfz2%QEz}!08Z}LOZ|onPdQlH@G1w!(mymm|9FJ}S2nK^3K75$Pi!%cgqRALH61}|K zdz=?~j?$g5ccQkTJjCOHt*k6r%sn1|cC!V8$ONYZ97_NZvH_VuSKx3xMj`@q4@;E6 zk?_fk*cd(Pd^M~ZiH%uayod$f>TIh^qbnXb{9;*@BZEN$unyT(bF98#Fi2x#BlY$5 zyA}!Le6;MveAHrh@0yK;&I8o10jV7cOLi=GP$;L z#Z+3%My1rNN?*{ol~T_tr80tr@(~RgV74P??81m}gTOz4Cz0jdjErUcKeYB9R><%6 QssI2007*qoM6N<$g4@l%jQ{`u literal 0 HcmV?d00001 diff --git a/src/assets/images/trezor_unpaired.png b/src/assets/images/trezor_unpaired.png new file mode 100644 index 0000000000000000000000000000000000000000..c9854be1af12e16d0306db195681890494e135ae GIT binary patch literal 1950 zcmV;P2VwY$P)TPqrEMo|Q<7b-reh*7BVp%%0tUPB%f zeJCnkkOnVRG>BkD3to$xsNkikw$&m;?WPsCXlY}Uv^8zBpATO)&2DD)%a~37y)(x+kvgXCg4|KuT6es zp&SCv0a}42Knp73G@z!yI|3X6b^|{E>w!;zZR5|538n+L0Ph2PfDHQaUM&NR0^b2E zfzvn!I0twh_=nT}O;$>|Ua5*I)=$0!6 z+ykt@dl(%A{snf9+aTJRt^w-s=20i3?V%wY|$YOM)Vfv^H@DXsXeKtm> z15crKrm3vMz~dAiXGek<@BljCH+|G!!1eaoxaM?pbYt@N4DbOk%RU?b1og|*0q5f` zzx8PA=!ZYiNeNR68w2K})k`S2`CvCpN4>(-LLNZH+iytchOdAfrbNIz;6ziRVhKvX z2DG&^2{?>Shz7ymXmwzs0cbQODwd!GtjFC<$RV`f7X$~<8EX?YsEDBulz=hJ-Uml2 z_MmW^SI{G_34#*vn58P9PpSg?#LHwtp?bti9aD$5^iI^`uHFq5F9NQ_dC=d8uIZXM z0iAFdG$nLF9qxvMwdlIcJcs8Qv`_hm!}Gw{h8E^zrXgIm1rFLwWeVEm8FjF|=!{TN zc=15DU6n%keZN?aEAT9XkG7!b7po{$0ew;x&?i*^eNq+BCshG`;-wqo1-G*#VG=~Q z%Sadk?g!SQD`MrM0bLh9!<5i3VF)+^tOmX{B@B@!bd9DW1q5C99Wx~gk&=~NZA5%h z70@SPg>c!iEUPh*NMKnOt*xyzHs&tO_4W19+uKWTZ*R@!&6^u`>~OO}>W>uWX(K_G z8!vUpBUD5rAtK#lV`IbOoed&#n}~$Aiy^WC%D8YMGE`6^cZ4QnBn1?ab`ePz)}$y_ zi->WSy<+P?5lNuS3`=mc^I%{=4Imy@E6lyX0ugx@SQm@M+$`c3Br+Z-8nXQb{U@0e zX=@XS$3?*2;&DxrOcu;aM3zYaAsq<;#Ux%bDPmd9qB)smnS}H$VpIg|61&DCl@jUf zEbMV6i^nyORBB50qK(UZ)8AK!vI{6q4MwqE=VZ>_=&E6HqO1anQ|JaQo>|1AL%G}n zP7U2uN*e)_7{yv!n_W2PgmOiUg+;q87Wv(k-d^bGv3VmPdU~{sTowXWF_d6N3oF6{fdr-YzAVmO*a#IM;CT4vir3Rq8u7B&mzNNcS&B5(G?;FW}^HZ7HxXZvjvd9ym3Gqd~=ZU@oQhzAO&qR-S+nBP;~#-}Ouz(KB{YqYoGkLqO0? zJ+pxufR}-{f#v9(3SP_HNdB3)QhT9&c|QUpUO&bwG4v>`1*`(Pfk%N0aer2%k9+}} zn@cZXb94T`_Te!yQaDc_xU~#=V)GZ^Y2Y$kobnWrjrpT_>FhL51O#QBol}Yzkp&WwfhtP{Bo&&B1W;nc4n@*>F@8iSw~v4#@`x<$>MP>V=6_>O5cQjWSVfUvdf@1u&o6i z1YSaqUmXUdtE)?fhVs^uA}}NEm6_-bLN5Tn6ONFA?sCoX_Cz8fwq6+4#A*m@B9o~H zESLs_IE)`bgE1DuHt z;XX!ND5Ds~m}4ksDb^cHurt9e^ME_ii*a@nf=3!f6p7^C7_ZC*ZUkOOTkb%GOe7N0 z-Q8^;&UU0yDpWG*6ry&7wpY*#GtiFmi%ja41Yj9pu%n}6)4qNC22Dy7LEsIBU+RI2 z(VN$P#@$6_PQvX(uNhqmG)aZ*Pz{RgMP=ER`#;R03F^5i;1%E+Y_2;Ne?mrHxO`%0 z%e@@E(QSmO^<)MWZY%H%y5qq(`2Z7Qt`w1VVlU_h5m_Z7ODah;J7T~oz+LDtZV(l2 k6!;!^0{tH!BDo#;f1xe5&diqcjsO4v07*qoM6N<$f-MeZ9{>OV literal 0 HcmV?d00001 diff --git a/src/assets/images/unconfirmed.png b/src/assets/images/unconfirmed.png new file mode 100644 index 0000000000000000000000000000000000000000..6ebfe290ea58daa209650f6d5b18b619bdb1629f GIT binary patch literal 3532 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/unlock.png b/src/assets/images/unlock.png new file mode 100644 index 0000000000000000000000000000000000000000..869e4de326d3bfd59abc44db7a417fb562b99435 GIT binary patch literal 45956 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 + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/unpaid.png b/src/assets/images/unpaid.png new file mode 100644 index 0000000000000000000000000000000000000000..579ec4eb533866a6d97ee922e15257446649c66f GIT binary patch literal 23805 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

    0Lj3t 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 U&&DaRfQ + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Lapo Calamandrei + + + + + + + + record + media + + + + + Jakub Steiner + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/status_connected_fork.png b/src/assets/images/status_connected_fork.png new file mode 100644 index 0000000000000000000000000000000000000000..a65c2a883ca8542a4497e0b85f59dbf554f2f178 GIT binary patch literal 62949 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 HH2wTPVi>Pl literal 0 HcmV?d00001 diff --git a/src/assets/images/status_connected_proxy.png b/src/assets/images/status_connected_proxy.png new file mode 100644 index 0000000000000000000000000000000000000000..ff553d9f17ba8f07c708a976b02fe655a01bb3d5 GIT binary patch literal 69081 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