You can subscribe to this list here.
2003 |
Jan
|
Feb
(20) |
Mar
(122) |
Apr
(16) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <sir...@us...> - 2003-03-02 16:39:41
|
Update of /cvsroot/btplusplus/BT++/src/TabHistory In directory sc8-pr-cvs1:/tmp/cvs-serv18792/src/TabHistory Added Files: TabHistory.py __init__.py Log Message: Started adding TabHistory, nothing there yet. --- NEW FILE: TabHistory.py --- from wxPython.wx import * from TabTrans.Grid import Grid from TabTrans.GridTable import GridTable ########################################################################################################### ########################################################################################################### class TabHistory(wxPanel): ########################################################################################################### def __init__(self, parent): wxPanel.__init__(self, parent, -1, wxPoint(0,65), wxSize(786,347)) #self.Grid = Grid( self ) sizer = wxBoxSizer(wxHORIZONTAL) #sizer.Add( self.Grid, 1, wxEXPAND | wxALL, 3) self.SetSizer(sizer) ########################################################################################################### def Destroy(self, evt = wxCloseEvent()): #self.Grid.Destroy() wxPanel.Destroy(self) --- NEW FILE: __init__.py --- |
From: <sir...@us...> - 2003-03-02 16:38:58
|
Update of /cvsroot/btplusplus/BT++/src/TabHistory In directory sc8-pr-cvs1:/tmp/cvs-serv18506/src/TabHistory Log Message: Directory /cvsroot/btplusplus/BT++/src/TabHistory added to the repository |
From: <sir...@us...> - 2003-03-02 16:36:32
|
Update of /cvsroot/btplusplus/BT++/src In directory sc8-pr-cvs1:/tmp/cvs-serv16972/src Modified Files: Images.py Log Message: - Added a set of new images for the toolbar(not yet all) - Reimplemented grid right click menu(no move yet). - Added a few images to the grid right click menu. - Changes to reflect the move of Loader + Manager. Index: Images.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/Images.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** Images.py 28 Feb 2003 21:31:53 -0000 1.5 --- Images.py 2 Mar 2003 16:36:28 -0000 1.6 *************** *** 44,261 **** \x94/\x00\x00\x00\x00IEND\xaeB`\x82\xdfY\xfcF" , ! 'ToolBar_History': ! 'x\xda\x01\xa8\x06W\xf9\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x005\x00\ ! \x00\x00(\x08\x06\x00\x00\x00^\xae\xb25\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\ ! \x08d\x88\x00\x00\x06_IDATx\x9c\xed\x99ml[\xd5\x19\xc7\x7f\xc7\xefv\x1c\xdb\ ! \tqh\x92\xc6u^\x9a\x96\x16\x13&\xa2\xd0\x99\x89\xa4\x1b\x14u|\x88\x18P\xf1R\ ! \x95\x8a|dM?!\xd0\xb4\xb5\xab\xaa!\x814iChc/H\xd3\xbaub\x82\xd2ll\x19/U\xd3\ ! \xb5\x8d\xe2\xb6\x08\x95\x0c\x12J^\x86\xb3\x844!\x8e\x13\xfczm\xdf\xb3\x0fn\ ! \x0ci\xda.\xbev\x86\xa8x\xa4\xab{}\xcf\xe3\xe7\xdc\x9f\xff\xe7<\xe79\xbe\xc2\ ! \xe5rq\xbd\x99\xee\xcb~\x80\xd5\xb0\xaf\xa1\xbe*v]B\x19V3\xf8\x86\xdd{\xe5\ ! \xd5\xda>\xfc\xdd\xcf\xc5j\xf5+V#\xfb-\xfc\xa8K\x02\xa8\x91V\x84\xcb\x03&\ ! \xf3\xe7\x8dJ\x12\x19\x0e\xa2\xb3\x9f\x01\xc0q\xf0\xf9\xa2\xc3\x15}\xf8m\xd8\ ! \xbdW\xaa\x91V\xa4\xedQ\xf4\xeb|\xe8\x9cN^y\xa4\x9f\'wuc\xf0\x1d\x00\x93\x99\ ! g\x9e\xfa\x08\xa1Zh\xbd\x10\xbb\xa6\x9aZ\xad\xa8Jm\xd8\xbdW\x9e\xab1sp\x8f\ ! \x95}o\xbe\x07\x89\xe7rm\x92\xa7!\xb6\x8f\x83\x0f\x1d\x01`\xff\xb9\xb3\xc8\ ! \x98\x1ey\xfe&Z&\x92E\x1d\x8eESj\x11\xa8\xef\x89=\x1c\xf8\xd7I\x84\xe3YD\xa5\ ! D\xd8$?\xb8\xf7h\xce/\x91\xb1s\xa0\xf7\xef\xe8"3\x18b\xe3X\xca\xfeB\xa0\xbc\ ! \xaa\xa8\x8a\x155Q\xf4=\xb1\x87;?x\x8c\x8a`\x17\xd3\x9e\x14\xd2\x94A`\xe1\ ! \xd9\xc1\x1et\xb6\x17\x91\x08\x9a\xd3&\xa8(\x85O?CZ\x8c\xc4\x93>\xb6L\x0cs\ ! \xa6\xc9\x86\x7f\x93*o\xafL\xe4\xe2\xbd\xd4k\xd3\xa4^Q\x94\xda\xb0{\xafLz\ ! \x9b>\x07\xda\xe8\x05[\naP\x91\xe5\t\xd4\xc8\x8b\x00\xfc\xe4\xde\xd3\x9c7(\ ! \xd9/U\x94\x02 JS\x046\xedB\x8dVs\xba\xa3\x93\xbeQ=}\xa3z\x00:\xdbc\x9a\xd4+\ ! \n\xd4\xb9\x1a3\xef\xb7\xfc\x8d\x8a`\x17\x17\x1b\xeb\x01x\xb5\xd6\xb9\xcc\ ! \xef\x87\xc7\xfd$\x98#=ZF&T\x02\x80\xd11\x840\xfc\x06\xe4Z\xf8\xc5I\x8c&\x1d\ ! \xb7\xd5\x99ip+\xf8\xd7+\x9a\xc0\n\x1e~\xdf\xb9\xdb\'_\x8d\xafC\x84>b\xba|\ ! \x13BI\x81A\xe5\xfe\xf1\xf9\x9c\xcf\xa9V+\xbd\xf2\x18\x8d\xe9y\x1e\x19\xec\ ! \x87\x8f[\xc8\xcc\xde\x8f\xaa\xbe\x80(Ma5\x9f%\xaa\xbb\x15\x00\xd5\xa4\xa7u]\ ! \x98-k\xb6\x01\xd0Go\xde\xcfT\x10\xd4\xce6\xe4\xa8\xa1\x1cD\x02\x19\xfa1\xc2\ ! \x01D\x8cHSf\x89_\xaf<\xc6\xbe\xc1\xdf\x03\x90\xfe\xa0\x12\xdc\x8fB<\x81\xd4\ ! }\x1f\x19\x05\xcb\xf8\x83T|\xf2\x0c\x9b\xfd7\xf3\x90\xfb\x1c\xb7Tu\x80\x8c\ ! \x03\xb0q\x8dBg;2\x9f\xf9\xa5y\xf8=\xb0\xd5!\xbbnoev\xe0\x1f\x08\xfd\x10\xed\ ! o?Mzp\x0e" B\x96%\xc7,\x17\x00\xc8L:\xe1\xa2\x075~)\x19D\xc3\xc8OO\x11\xfa\ ! \xa3\x89\x8a\x89\x05:\xd7v\xb3\xb1j\x07\x001a\x05\xa0\xcd\xb3-\xefg\xd3\xb4N\ ! \xed\xbf/,\xb76up(\xd0\xc3\xa9a\xc1\x99P\x1d\x9e{R\xa4m\x06&*\x7f\x8a0Y\xc1h\ ! \xcf:\x97d\xe3\x0b\xf5\x05Z\xdf3\x13X\xff 2:\x03\xba\x8b\x88\xdf\xfe\x12\x80\ ! \xed\xfe\x1a~\xe6\x8b\x83\xa5\x8ap2\xab\x90\x89$\x00\x87\x02=ygA\xbd\xc5b\ ! \xc9\x1b\xe8\x8e\xa6\x1d\x1c\x0e\xbcNR\xda\x98\x9cK3\x91\xae\xc5_\xd5\xc8\ ! \xac\x9c\xc2\xae\xbc\xcd\x82\xb5\tRQHG!6\r\xb1id\xdc\xcb\x7fJ\xdd\x90\xfa\ ! \x18\x9d}\x08\xd4)x\xe7\xdfl\xf7\xd7\xd0\xb9\xb6\x9b\x1b\xcb\xbe\x05@"\x93\ ! \x06 \x83\x81\xc3\x81\xd75\xa5\xf5\xbc\x94\xda\x7f_X\xb6o~\x9c\x97N\x1ea\xd7\ ! \x96\xe5\xc3b\xf1\xd7\xcd\xc7\xfaF\xbb\xb9\xeb\xa6\xc7h\xf0\xf8\x18\t\x0e\ ! \x00\x10N\xc6y9pT\xf3:\x95W\xa28\xf0\x9aK\x8c\x84\x8e\xc8\xae\xb6\x8e\xabxXW\ ! \x1c+\x96\x0cs(\xd0\x03\x98h\xa9\x8f#\xab\xbd\x10\x1c\xc8\x01\x15by%\x8a\x9d\ ! m\xc8\xae\xb6\x0e\x1a\xeao+\xa8\xd3E\xa0j\x97\x82Q\xa6\xf8\xf5\x99~F\xfb\xff\ ! \n\xc0\xcb\x81\xa3$\xa5\xad\xa0\xf8+Vjg\x1b\xf2\xf9\xef\xed!\xec\xbf\x03]\ ! \xe3=T\x0c\xbf\x81c&\x82\x98\x9e\xcc\xf9\x88\xf9\x99\xdc\xf5\xf0l\xf0\x8aq\ ! \xb2J\xf4\xb0\xb6L\xc1S\x01csN\x9cr\n\x80_\xfd\xf3O\x05\x03A\x1esjg\x1b\xb9\ ! \x95\xdd\xce\xfc\xb2\xf6\x940\xae\xb8\xd3\xa6\x1b\x15\xacfH*\xa0J\xb8p\xd1\ ! \x04\x90\x03\xaa+\x0b3\x196\xad\xfe\x9c\xfa\xc3\tr\x1dt\xb6\x1b\xa5\x7f\xbdr\ ! \x99\xc7\xe5\x9f\xafm\xd1/\xe4\x94/\xaaSW\x16\xce+\xce\x95LSEa\x94)\xbe\xe1\ ! \xdcJZ\xb7T\x1d\x83\x9a\xca]\xbf5~\x1c\x80\xbbk\xb7\x02\xf0\xee\xfc\xf1%\xbe\ ! %\x976\xc3\xf1$\xf8\xd6\x84\x19\x98r\xd1P\x1eF-\xc2\x06D\x13T\x04\'\x0bz\xc7\ ! \xf2\x06\xbd\x95\x91P7=\xc3\x1e.\x8cg\x0b\xd6\xb3\xd3#lY\x13\xe4\xce\xda\xe5\ ! K@\xff\xd4\x9b\xb9\xeb\x86\xf2\xc2\x15Z\xb4\x82\xaa\xf4\x98,Yv\xafg\xd8\x03@\ ! S\xed\r|wc\x14\xe0\x8a@\xabi\x9a\x94J\xe8\xb2*YM\x16\x94T\xb6\x02\xb8|\xe1\ ! \xf5\x95\x07\xd9\xde\xb0-[\xc3]*N\xff_\xa6Y)\x053\xcd\xee\x1a\x00\xd2\xd2@L\ ! \x96\xa0`\xa6\xde\x96M\xe5\x03!\x0f\xcf\x9d\x1d\xe2\xd8\x87\xdd\xc4\x84\xf5\ ! \x8a\xc7\xd5ll\xae\xb0\xffM\n\x1a~\xd2\x90\x9d\xed\x06\x91\xc6 \xd2\xa4\xa5\ ! \x81\xbbn\xde\xc1\xb7\xbd\xe3\xf8\xca\xb3p\x83\xf3\x1eN\x0cw\xaf8\xe6\xd8\ ! \x9c\x0b\xb3\x88iN\xe7P\xc0~\xcah\xb4C\x89#{^\xbc\x07\x88\xd4,^\xf7\xc3x\xdd\ ! \xe0\xb0\x1e\xe6\xf4\x84g\xc51GB\x85\x03\x81F\xa8\xcd\xae \xcd\xee\x1a\xd4\ ! \xcaj\x9a\xe7g8?3\x91k;1\xdc\x8d\xaaB\xa9\x05\xa6\x17\xa0\xde\x16\xc4\xed\ ! \x10(\x98\xafY\xf0\x16\x0b\x084B\xa9\x12d\x89\x93\x05\xb7\x1d\xe7\xa4\x93f\ ! \xb2eQT\xd5\xf3\xcd\xc6\x1d\xbc?\xf1g\xe2I\xa8t@\x8b\xa7\x03\x85\xec0]<_n\ ! \x03S\xc5\x03\x02\x8dP:\x01\xb2\xda\x8b\xcd\xdb\x8e\x9c\x89\xc0\xd8\x10\x8d7\ ! x\xb2`F;\xb7z\x1f\xa7D\x97!\xaa\xeaQR\x91k\xc6*6\x10h\x84\x1a\t\xb9\x10cC\ ! \xc4\xdcv\x9c\xd3\x93\x88t2\xa7\xd4"LT\xd5\x93\xfa\x1f@\xb3\x9fQt \xd0\xb8\ ! \x9d_,n\xeb\xca\xc2K\xd2\xaf\x96B\xb7\xd8@\xb0Jo=\xbel\xbb._\xba}\r\xf5U\xb1\ ! \xff\x02\xd8Y\x86\x91\xa0\xd2<\xcb\x00\x00\x00\x00IEND\xaeB`\x82\xb2\x90>Y' , 'ToolBar_Preferences': ! 'x\xda\x01\xb9\x07F\xf8\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x005\x00\ \x00\x00(\x08\x06\x00\x00\x00^\xae\xb25\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\ ! \x08d\x88\x00\x00\x07pIDATx\x9c\xed\x99\x7flS\xd7\x15\xc7?\xf7=;v\xe2\x90\ ! \xf7\xea\xc4\x81$d.\x0cBH\xd8hCQY(\xb4@\xa1\xdb\xd8T6\x86\xa2J\xdd\x1f\xdb\ ! \xb4!!MbU\xff\xd8$\xd4\x8a\xae\xd2*e\xda&M\xab\x8a\xf6G\xa5i\xffL\x13\x8cj]\ ! \xd7\x15*\xd8\xbaMT-0\n\r\x81\x04\x82\x93&%N0\xef\x81\x938\xf6{\xef\xee\x8f\ ! \xeb\x1fI4hm\x9cUE\xfdJ\x96\xee{\xbe\xbe>\x1f\x9fs\xcf9\xefZ\x98\xa6\xc9\xdd\ ! &\xed\x936`>\xf4\x19\xd4\xa7Ew%\x94\xaf\xdc\x0b\xbe\xb0\xcb\x92\x8e[\xb8\xde\ ! w\xc8\x14\xb9\xf13\x8f[27~\xee\x95\xc2\xfdr\xab,P\xdd]\x96t=5\xde\xb8\xaa\ ! \x8a\x15k\x9e e\xc7x\xf9\xe0\xd1\xfc\x9c\xfd;,\xb9\xbc\x11V/\r\xd07\x92\xe6\ ! \'\xdb\x15\xe0\xcf\xfeR~\xb8;\x86\xea\xee\xb2dk\xb3\xc6\x9a\x07\xb6\x13\xacm\ ! AN[8\x93c\xf8\xe5$\xdf\xd9\xf9(\xaewT>{\xd8\x14\xae\x845-5H)hm\x0e\xb2\xa2\ ! \xd9\xa5\'\x96\xe4\xe9\xc7\x14\xdc\xcf\xffV>\xb8\xb2x\xaa\xa3c+\x81\xeaz\xe4\ ! \xb4\x05\x8e\x8dL_\xc7G\x06]\xda\xec\xfe\xd6\x06\\\xf9\x96\xdcv\x7f5a\xc3\ ! \x0f\xb8$l\x0f\xa4N{\xd4\xa0uq\x8a\x97\x8fL\x97\xc3\x8c\xbc\xca\x92(>\xe8?\ ! \x0e\x8e\r\x8e\x8d\x93N\x03\xe0\xa1#\xdc\x14~w\x8c\xb5\xcb5VD\xeb\x80\n\x00\ ! \xc2\x86F\xad)\x90\xb8\xd8\x13:\xc9\xf22\x95\x07\xea\xd8\xd9\x82U2}\x1d\r\ ! \x17\r\x17\x84@\xe0\xa7\xf3\x0b-\xd9w\x03@%\xa0\x03\x101a*\x9d&\x97=\xf6n\ ! \xb5\xe4\xde\xad\x85dR\xaaJ\n\xbf\xee.\xf5\xc5\xae\x07\x89$L\xa5al\xe0\x08\ ! \xf74=\x8c+\x02 \x15\xa4\xae\x81pS\x0844-\x88\xe7\xa5f|\xa5\x82\xb1&\x1c\x00\ ! \x9e\xdaf\xc9\x07\x96Acm\x00\xd7\xb3\xe4\xaf\xdf,}\x8f\x15\r\xd5\xdde\xc9o\ ! \x7f}\x03\xfe\xba\xfbH\x8d\x9fc\xa0\xff\x1d\x06\xe3I\x16D:\xd04\r\x9f\xbf\n\ ! \'C\x1e,\x91\xb8\x98\xffl8\xd2\x8e\xc8\x8c\xccX-M{\xd4`:m\xb3zi\x80\n\x9f\ ! \xe2xbc\x15\xaeg\xcb\x17\x8f\x19%\x81\x89b\x1b\xda\xee.K~\xef\xa7\xc7\xc0\ ! \xea\x85\xa98\x00\xf2\xe6 87\x91\x9e\x83\xf4<<\xcf\xe3\xcc\xe9\xd7\xf8g\x8f\ ! \x93\xff\\&;li\x84/\xb5\x19\xd4\x9a5\x80\x03\xa4\x01\x17P5\xc1\xb2\xd5\x9e\ ! \x1c\xb35~\x7f|\x8aR\xc0\x8a\xf2Tw\x97%\x1fl\xad\x9euO\xde\x1c\x04\xe9\x80\ ! \xe6Gd\r{\xe5\xb5\xc3|p\r\x967@\xc4\xd0\xf3s{\x87\\\x06\xe20\x10\xb7ik\xb6\ ! \xd9\xb2\xa6\x01\x95<\xd2\xa8}\x96\xc14*\xb0\xec4\x11\xc3cg\xa7\x8e\'-\xf9\ ! \xd2\xf1\xe2B\xb1\xe8\xf0[\xb5\xbd\x1b\xa6\xc6\xf2^B\x14\x8cF\x83So\xffa\x16\ ! P\xb8Z\xa0i\n\xb6s\xa5\x8fDR2f\xbb\xf4\x0c\x01|8\x07L)\x07\xd6\x10\xf6!)x{^\ ! \xa0\\\x0fd\xa2\x07\x11n\x9b\x01\xe2\xcbE\x0e\x00g\x07\x9cY@3\x95H\xaa\xc4\ ! \xa6\xbc\xe7r\xe2\x02\x14\xc0@%c\xb5\x98#}\x0c\xc6\xa7\x8a\xa3\xc9\xeacC\xbd\ ! \xb0\xcb\x92\x8f\xde\xa71p\xf27D\x1b\x9bH\x07\xda\xa8\\\xd4\x91\xf5\x943\xcb\ ! c}\x1fB\xcf\x90j\x00s{\xc9\xf1\xa0)\x0c\x8b\xee\x81\xaa\xa0z\xdd\x1b\x81\x13\ ! \x17`\xf3\xba%\x88\xcc\x00\xca[\x1e\xe3\x96\xc7\xe9\xbe$\xbd\xc3%1\x95\x96\ ! \xd2O\xf6\x8e01=\xc4\xc6\xd5=\xe8\xd1\'\x81j\xe4\xb4\r\xae\x02\xb9U\xb3\xbag\ ! \x93-/\x8dJZ\x1b\xc1\x08A\x85\x1fR\x19H\x8c\xbd\x9fM\x1cp!6\xcd`<\xc9\xa9K\ ! \xa5\x01A\x91\xc5\xf7\xf5\x93\x1e\xb1\xb1B\xac\x1d\xfc\xfb\x10\xd7\xde\xfb\ ! \xa5\xba\x10:\xe8\x01\x1a\xc2\x85:6W/\x1e3\xc4K\xc7Mq~\x04\xec\x89\xb9\xef\ ! \xea\x80\x8f\x15\xd1\x00[\xd7\xd6\xb0\xfb+Av\xad\x0f\xb0n9\xec~\xa4\xb8\x82\ ! \xfc\xb1\xa1~\xfcGS\xec;d\x8a\xf3\x83\xf0n_\xe1\xd9\xc24"PY\x8f\xa8\xa8\x06\ ! \xa1\xf3\xc8\x86\xaf~\xe4Z\x07\xb2`\xe9\x0c\xf9nB\x08\x7f\x16\xac\n\xf0c\x1a\ ! \x15\x84k\x04\x0f\xb5\x07\x8b\xe1\x01Jh\x93\xf6\x1dRp\xe7\xae@\xc0\x0f\xfa\ ! \xfa\xdf\x81/\x04\xfe\x10\xa2\xa2\x9a@\xed\n\xa2\x0b\xe1\xf9o~\xf4\xaf\x9b\ ! \xc8z+\x1ciG\x13\xfe\xec\xdd\xdc\xdeT`\xa5\xa8\xa4\xdeo\xff\x0eKv,\xd3x\xfc\ ! \xc9\xfd\x10\x8a\xaa\x9b\xbe\x10\x00\xc2\x17d\xcb\xd7~D\xcbb\xd5\xfa\xdc\xae\ ! \x97\x1b\xb5a\xd3*\xd0d\nO\x0b"|a\x84/L\xae\xf1-\x15\xac\xe8D\xb1\x7f\x87%\ ! \xb7\xaf\xd5\x8866\x81\xa6#\xaa\x96 \x8d\xe5`\xf7Ae=L\xc5\xf3`\x0fu\xf6\xf3\ ! \xea\x1b\x7f\xe6\x87[,\xe9z\x02WJ\x04\x85\x90[\x1d\x85\xcd\xeb:\x11d\x90\xd2\ ! E\xf32x\x9a\x1f\xe1S)^:\t`\x1a\xb81\x7fP9 \x80\xd8\xc80Q\x0e\xa0W5\xc1\xa2\ ! \x87\x15\x94/\x04z\x10\xdc\x14x\x0e\x01\xa3\x99\x9d;\x7f\xc0\x8e\xeb\xe7H\ ! \x8c\xbd?k\xadp\xa4\x1d\x11\xacG\xd3U\xb8\x89\x89Az\x06.R\x97\xed@\xea\xc3M\ ! \xa0U\xe1z\x89\xa2\x80\x8a\x86\x9a+\x05\xf6\x0c:\xcfA0B\xea\xdco\xb9|\xe1\ ! \x1f\xb4=\xbc\x17QY\x87\x9c\x1a\x07\rts%\x11s%x)\xf02 ]<\xd7\x9d\xb5\x96\x17\ ! l\x02\xce\xf3\xfa;6F\x08jB6\xa1\x80\xce\x9f\xdev90\xdfm\xd2\xc5a\x8f\x96\xa6\ ! \xc2V\x8c\x8d\x0cSm\xede\xdcv\x19\x8c\'\xb9|\x15Z\x97\xbe\x8a\xb6r\x0f\x02\ ! \xc0Mek\xd84\x08_\xbei\xd0t\x90R\xaaR ]\xb4`-K\x96\xade\xd4:\xc6\xf9A\x95\ ! \xf2\x8d\x90{+3n\xab\xa2\x12\xc5\xb3\x87M\xf1\xbf\xaa\xfc\x95\xabI\x06\xe3I\ ! \xde\xedW\xadT\xef\xe5~\xa80\xa1\xaa\x01\xf4 "`@E\x8d\x82\xf2\x1b\x10\xa8\ ! \x83\xe0BD\xe5\xa2\xfc\x18\xa1S\xb9\xe4\xcb\xb4G\rV~\x0e\xce\x8f\xc0\x89>\ ! \x8a\xf6R\xd1P\xa0\xba\x85\x83\xff.\x14\xe0\xf1\x1b\x82\xa3\xffq9u\t~\xf1\ ! \x86)\xecIp\xdc\x0cTF\xd4\x84\xaa\x06U\xc7t?"`"|\x95\x90\x1aE\xc4\xdf\x02=\ ! \x80\xa8\x89\xaa\x97\xf9y\x00\xcc\xc8\x17i\x8f\x1a@i@P\xe2\x9eR\xc7Z\x96lk\ ! \x863\x03\xb3O\x82\xb4\xdch\xf4_\xb0p=8S\x90\x8c\xc1\x82%\x90\xb9\x01\x93q.\ ! \xbc\xf7W*|)\x16\\\x8fQw\xef6D\xcbwaj\x149|\x94\xfe\xfe\xd3\x0c\\M\x96b\xd6\ ! \x9dA\xe5\xc0\x9e~\xcc\x92s\x8f\xb6<\t\xa9\xb4\xc3\xb5\x93\xcf\x13Z\xb8\x99\ ! \xe0\xe2N\xa8\xed\x981\xe3,WF\'ii\xd2\xb89\x91\xc4>{\x98\xa57\xfa\xe9\xbd\ ! \xdc\xcf\xe4t\x8aq\xdbA\xbf\xc3\x93\x93\xa2\x9f|o\xa7\xa7\xb6Y2\\\r\xdb\xee\ ! \xf7\xe5\x9f\xa1\x00\x8cP\x05\xa6\x11\xe1\xcd\x93C\x1c?\xa7\xea\xd47\x1e\xd4\ ! \xa9\xabQ\x15+6\xe61]x\x9c\xc2\x9a\x803\xb1\xffs\xf8\xddNu5\xcc\x02\x02\xb0\ ! \'\xd2\xd8\x13\xc3\x0c\x8d) e\xac%g\x82\xe5t\xf9*\x0c%J\x07\x822CyR\x1d{\xdd\ ! J\x97F\x0b\xc6\xe6\xc0\xbe\xbfU#\x14\xd0\x19\xbd\xeer&\xa6\xe6\xdd\t\x10\x94\ ! \x19\xeaWGL\xe1z\x96t=\xf5\xeb\xb74H\x9a\xeb!\x14P]\xc2\xdc&0\x076\xfb\xfa\ ! \xceU\xd6=5W{6\xd9\xd2\x93\xca\xe6B\xd8\xcd\xbf\xe6\x15\xea\x93\xd2]\xf9\xa7\ ! \xdbgP\x9f\x16\xfd\x17,z\xfc8<5H\xfe\x00\x00\x00\x00IEND\xaeB`\x82\xbe\x08\ ! \xb3x' , 'ToolBar_Transfer': ! 'x\xda\x01\x9c\x06c\xf9\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x005\x00\ \x00\x00(\x08\x06\x00\x00\x00^\xae\xb25\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\ ! \x08d\x88\x00\x00\x06SIDATx\x9c\xed\x99[l\\G\x19\xc7\x7fs\xcez\xef\xbb^_\xd8\ ! \x8d\xe5\xacsq\\7q\x93\x88\x92\x92&\x18Gy(\xd4JD\r\x8a\x9b\x06\x0b\x08\xd0\ ! \xa2\x14\xf1\xd0\x82\xfa\x94JXB\x91\xe8\x03\xa8\x94JA\xc2\x08\x0b\xc9Xm@\x84\ ! H\xa1H%\x08\xac\x05\x1c@M\xed\xda\xb4`[\xf5-ub\xe2\xeb\xae\xbd\xde\xe3svx8\ ! \xdec\xafc\xa7=\xbb\x1b\xa0U\xff\xd2\xe8\xec~3\xdf\xcc\xfc\xe7\xbb\xcc\x999"\ ! \x14\n\xf1A\x83\xf2\xbf\x9e\xc0\xdd\xc0\x87\xa4\xde/p\x14\xa2\x93Ts\xab4\xde\ ! \xec\xc7\xdbwAl\xd6\xe6)\xf7\xac\xf4k\x02\x8fn6\xf1\x18\xe6\xb3T\x98\xebz\ ! \xda\xe1\xdbT\xd7.\xf2&\x95jn\x95\xdfh\xfa*/:_f\x11\xe4F\xc4\x9er\xcf\xca\ ! \x8f,*x\x0c\x81W\x11\xb8\xa5\xa0\xa6\xa6\x01\x80R\xa9qu\xa8\x9bv}ABa\xc8\x89\ ! |\xb2_\xaa\xb9U>\xf9\x99\xd3\x1c(I\xd3\xb3\xe0\xe6\x85K\x9d\x18=\xddY\x16;\ ! \xe9\x9b\x95ku*\x0c\xf0k\x82\xad\xcb*Gv\x1e\xca\xea\xef\xeaP7\x90?\xb1\x9cc*\ ! C\xe8{\xc7\x8b-\xd9#\r\x0f\xa3\xee\x7f\x90\xc5\xfb\x9a-"/-\x84\xc4\xda\xf2\ ! \xfcRH$\x9c\x92)\x91\xb6Hx\x85\x81W\x18\x1c\xdd\xf5@>\\,\xe4Dj=\xa1S\x9f(\ ! \x01`0\xb1D\xedG\x8f\xdcFl=&TH:$\xd32\x8dW\x188\xa3.\x96\x0fz\x08|\xed45\xbb\ ! \x1a,W\xcc\x15\xb6c*\xd5\xdc*\x01\xce_j\xe7\xfc%8\xd7r\x86\xa7\x8f\xb8\x00\ ! \x98ZZ\xe2z\xe7\xf3V\xdb\xc5\xfb\x9ae}];\xa9\xf9us\xec2\x1f\xcb+N\xa6\x07\ ! \x8a(\xdd\x7f\x02\x19\xf0\x129\x08\x03\x83\xb9PY\x85mR\xae\x0b\xad\x96\xbf\ ! \xa7\x9a[\xe5\xd0\xec\x02\x9d\x7fZd2\xa113;\x07\xc0\xa7\x1el\xe3\xde\x076_\ ! \xec\xf8\n\xa9\xa2uM\xf4\xaa2\xeb\xf7\x81\x96\xa4\xfc\xf7\xe02\x00#W\x83\xb6\ ! b,\xef}\xeag=\xd7\x88\xe3\xe4z"i\xc9J\xaa@[\x06\xc3\xd8\xb8\x00$\x9cw\xf6\ ! \xb0\xe2-\x1a\xfb\x8eI\xa2{%\xdb\x0e\xae7\xf5\x9d\x91\x17\xa9C\xca3\xe8\xe3}\ ! \xb4\x0f\xdcdB\xd3\xd1S\xa6\xa5\x8ceH\xa5`1\tFz\xb5,>c\x96\xcd\xe0lx8\xeb\ ! \x7fI\xa9$Xa\x7f^y\xedS\xa9y\t~x\xfd\xef\x7f@\xb8\xdc\xc8\xd4\x12\xea\xbd\ ! \xb5\xfc\xe2W\x8fg\xb5;\xf1\xd96\x02!s\xb1k\x92\x82\x86m\x0f\x99\x15\x15\x80\ ! L\x90\n\x18\xf8\xd6\xf5\xfd\x85\xe7V\xa7\xf6\x9dO\xa7m\xcd+o\xf7;\xb1\xf7i\ ! \xd0\xe2\x18\x13\x03\xe8\x13\x03h\xe3c\xe8.\xb7U\xdft\xac\r\x97W\xa2i\xa0=\ ! \x0b\x03\x1eI\xd7\xc8\xab\xd4\xca\x04\xbbw\x83\xb2\xc7o\xb5]\x94\xd3\x94\xfd\ ! \xe8w<\x12\xd7\xa8o17\xe7\xb63:z\xc2^2\xcck\xf3\xadkL\xc8\x92Jc\xc3:W1\x04\ ! \xcb%\xfa\xf2\xed1\xee}NR\x93\x14<Qu\x08e\x8f\x1f_\xfd\t\x00\x96\xeb\xa2\xe8\ ! \x9f\xfc8\xc9\'\x1f%\xd6\xd1E\xdb\x19\x9d\x92*\xe8\xbd,l%\x0b[\xee\xb7>`\x13\ ! \xd3\x90\x98\xbe},\x7f\xa9\x82:\xa303.\xf1\x06\xf4\xdb\xeagN\t\xe8\x94\xfcx\ ! \xf4/<\xc1!\xa8_\xad\xcb\x10:\xff\x15(\xab0\xe3\xd3.\xde\xb3\xa5\xea\x1a\x13\ ! \xf2\x9e\x06\x9d\xe3M\xdb\x08G\x0e\x93\xf1\xdc\xc9\x9b1\x00\x86o\x8c\xd3\xd7\ ! m0\xf2z\x11S\xc3\x1b[/\x03\x7f\xa9BI\xa5Ae\xe7\xaa\xc5\xfc\xdf\xfa:3\xb1\x9f\ ! \x12\xeb\xe8\xe2\xc5/)\x14o\xd1\xac\xf6\x83\xb1\xbbh\xa9\xe3M\xdb\xb8?r\x8e\ ! \x00\xbb\xf1\xb0\xdd\x14F\xcc\x87\x11\x89\xa3\xed\x9fb\x81\xb7\x99\x99\xff\'\ ! )\xd7,\x9ak\x9c\xc9\x9b\x7f\xb6\xf4{\xae\x8d\x12\xfb\xb5\x83\xa9a\x03O\xa9\ ! \x93\xeb\xa74\xcbb\xa7c\x1eb\x1d]\xbc\xd0\x02%k\x08\xe5\x02[\xa4\xfa\xdf\x1a\ ! \xe3@\xc4L\x02I\x86-\xb9\x82s\xa53?\xe5\x1c\xa5<x\xd4\xaa3"q4\xa6H\xf2\x0e\ ! \xd5\x87{\xf1\x87\xbfM\xc7Y\x98\xb9\xa1S\\\xee\xe0\xfa)\x1d:%\xed\x17~\xcfoZ\ ! \x1cx\x03:r\x838\xb4\x03[\x89\xa2\xae1!\xbf\xdbq\x92\xad4f\xc9\x15\xdc+\xd4\ ! \x82\xa8x6\xd5O1\xcd\xd4|/\xe7\x7fy\x96\xee\x97\x15\x1c~\x81/\xa4\xe2t\x0b\ ! \xd2z\x1a\xc5a\xba\xb4\xaa\xa6)r\xae\xc6\xe2\xd8\x1bw\xd1\xfd\x00^\xfd\xed\ ! \xcf\xf9\xdc\xe1=v\xd5\xb2\xf0\xf8c\xcf\x12\x8e\x9c\xe3\xd2\x0fa.\xb16\x91\ ! \x18\x94mW\x01\x054G\x161;\xb0\x9d\xd2\xeb\x1a\x13\xf2\x9b\xdf\xafdk\xe8\xd1\ ! \x9c\x06t\xa5V\xc7K\xb9f\x01\xac\xd8\xbbxa\x94\xde\xcb\x82\xb2\xed*\x8aC\xc1\ ! \xed1c\xeb\xae[\n\xe0\x8fWFh\xfe\xfc;\xb9\xa8\x92\x16\x1a\x9e\xa50\x00\xd5\ ! \xae\xc7p`n\xbes\x91~\xaa\xbf\xf8&?(:\xcbk\x17\xa1l;,%\x9d\x161;\xb0M\xaa\ ! \xff\x15\xbf\x80\x84\xdc\xb9\xbf\x93hy\xd4\xf6\x80\x00\xe1\xc8aT\xbd\x84\x7f\ ! \xe9?\xc9\xae\xf0\x9a\x19\xf6\xb5\x8bc\x96hYs\x00w\xde"\xd6#\xe7w\xbf\x9eX\ ! \x9ahSn\xbak\xd3\xfcfH\xcdK\\\xc14\xe6~\xf8_ \xd5\xff\x8a_,iqY\xb5s\x94}\xfb\ ! \xaa\x18\xbb5\xf6\xeeJ\xef\x11\xd1\xf2(\xfb\x8eIz/\xa7q\x05U\xd2\xba\xbd\x97\ ! Y\xc8\xf3-}\xa0\x0f\x82\xe1q\xa0`\xb7[\x0c\xdf\x18\xa7f\xaf\xa0\xf7r\xee}\ ! \xe4Lj\xe8J@@\\V\xd7\xa6\tU*\x18F\xe1\x88\xf9B\x00\x92\xb9[i\x8a\xcb\xed\x1f\ ! $\xf2>z\xfc\xe3\x1a\x18\x86@U\xf3\xba+\xc9\x82a\x08\xa2{\xa5\xed#G\x06y\xb9_\ ! \xc6Z;\xee\xd1\tW;\nJ\xecc\x0f\xc1\xd8\x1b\xb9\xe9\x16\xe4.\xfd\xad\xbf\t\ ! \xe27\xece\xa8wC0lNm\xee\x96\xfdD\x917\xa9\xa1+\x011\xf1\xb6B\xff_\x05#\xfd\ ! \x06\xf3\x93\xe9\x82\xc5\xd7\xae\xfa\xdc\\\xb0 \x1f\x082n8\xd2\xaf\xaeH\xb2\ ! \'R\xb1#M\xe5nI\xc0\x0f\xbe\x90\xc0W\xa6Zuwr\xd9\xca\x1d\x92\xc1\x98\xfd\x05\ ! *\x08)\xc8\x10\xdb\x18\xe1/\xc7\xe5h\x1fL\x8ef$\xd9\x16\xd8R\xab\x12\xde\xa5\ ! \x13\x89H|!\x81\xea\x14\xb8\x03\n\xb7n\x9a]\xda\xbd\xf7\xcb\xeb\x8e\xa2P\xb8\ ! \xff\xe4\x82\xdc\xec\xb4l\x97\x10\xfc\x9f\x90*4>\x90_\x12?$\xf5~\xc1\x7f\x00\ ! \xd4Dzp\xc6E\xdf\x9a\x00\x00\x00\x00IEND\xaeB`\x82c*@D' , 'ToolBar_Log': --- 44,534 ---- \x94/\x00\x00\x00\x00IEND\xaeB`\x82\xdfY\xfcF" , ! 'ToolBar_Help': ! 'x\xda\x01\x14\x06\xeb\xf9\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x005\ ! \x00\x00\x00(\x08\x06\x00\x00\x00^\xae\xb25\x00\x00\x00\x04sBIT\x08\x08\x08\ ! \x08|\x08d\x88\x00\x00\x05\xcbIDATx\x9c\xed\x99]h[\xe7\x19\xc7\x7f\xef\xb1\ ! \xac\xef\xda\xb2\xad\xf8\xab\x92\x938\xb1c;\xeeRg\xcb\x9a\xa4MBF\x887\x18Y\ ! \xba\x8b\xb1\x8d\x96Q\xb3\xd1\x04\x9a\x12\xd8.\xba\x91\x8c\xc2\xa0Wc\xecf[`\ ! \x94n\x14\xb6\xb12\x9ae\xb0um\x02\xa1\xc9\xba\xb6I\xdd\xa4\xc4\xb5\x1d;\xaad\ ! I\xfe\x94-\x1d\xe9XG\xe7\xe8|\xec\xc2\xc5]H\x07\x03\x9d\x93\x92\x92\xff\xed\ ! \x8b\xf4\xfc\x7fz\xce\xfb\xd7\xfb\xbcGD"\x11>o\x92>k\x03n\xe8>\xd4\xbd\xa2\ ! \xfbP\xf7\x8a<w\xa3\xc8\x9f\xfe\xf8\x07;\xbf\xb2\xc4L*\x89,\xcb\xd4{\xeb\xe9\ ! \x8ao\xa2\xa99\xca\xc8\xf7\x7f \x9c\xae\'\xdc\x8c\xf4\x13\xcf<m\xdf\x9a\xfa\ ! \x10\x8f\xa5\xd2\xd1\x12\xa0\xf9\x01/\x92\x00\xcb\x06\xa5b\x90\xcdi4F\x1fdh\ ! \xd7>\x9e}\xf6\xa4cp\xae@\x9dx\xe6\xb8=1v\x95\xed[\x9a8\xb03\xc6\x83M~B\xbe:\ ! \xea\x0c\x13\x0c\x13!\x04\x16\x90W\xab\x8c\xcd\xc8\xfckl\x85U+\xc4+\x7f\xf9\ ! \x9b#`\x8eC\x1d\xfd\xc6\xb0\x1dk\xf7\xf2\xd8\xcev\x06\xba\x9ah\xf1{\xf0\xe8:\ ! \xc2\xb4\x11J\x19\xa9XF\xe8U\xa8\xe8P\xefA\xf5z\x99\x90+\x9c\x1f_\xe1ZF\xe3\ ! \x1fo\\\xaa\x19\xccQ\xa8\xa3G\x87\xed\xfe\xde\x06\xbez`\x0b\xbd\x9d\x11\xeaT\ ! \x15\xb1,#\xcd, \x16\x96\x11\x8a\n\xa6\t6`Y \x04H\x12\xf8\xbc\x8c\xadVyu\x01\ ! V\x9b\xb6q\xe6\xb7/\xd6\x04\xe6XP\x9c8q\xdc\xc6\xce\xf2\xb5\xe1~\x066m\x80\ ! \xa5<"\xbd\x88\x98H"Vd\xd0\r\xb0\xedO\xff\xb0\xa6\xd3\xef\xf3R\x88X\xfc\xfc\ ! \xca\xe5\x9a\xbd8\x16\xe9\x93\x93W\xd9\xbf/N_o\'BQ\x91n\xdcBz\x7f\x121\xbf\ ! \x0cZu\x1d\xa8bX\x18\xa6u\xa7\x11Mg\xa3\xa1a.fj\xf6\xe2\x08\xd4\xc9\x93\xc7\ ! \xed\x81\xfeF\x06\x07;\xf1X&\xe2\xa3,b:\r\x85\xd2:LQ3\x98.Tx++\xf3\xd1\xa2\ ! \x82f\xdc\t\xe61M6\xb6F\xf9\xf5/\x7f\xf1?Z\xfa\xff\xc9\x91\xc7/\x99\x9c\xe4\ ! \xc9\xef\xc6h\x8e\xf8a6\x8f\x18\xbb\x05\xb2\xb2\xbe\x9e)U8\x97*\xf1N\xc9\xc3\ ! Tb\x86\x91x\x03\x87\xc2A\xe2a\x89\xba\xff\xda=~\x8fD\xec\x01\x1f!\xbf\xaf&?\ ! \x8et*\x95\x9c\xa0\xab+\x80\xd7\xae"\xa6R\xb0T\xb8\xadC\xe7R%r\xdd\x8f00\xfc\ ! 8\x1d\xf1\x18m\x9d\xcdx:\xa2\xd8\xde\xfa\xdb\xbeG7-re\x1dK\xd4f\xabf\xa8\xb3\ ! g_\xb1{\xb6\xb6\x12\x0e\x03\xe52$2\xa0\xe9\xeb\xeb\x8b\xaa\xc1\x98\xddHk\xdf\ ! \x0e\xd4\xfc\x12\x0f\xb5y\xd9\xb8\xad\x9d@<\x8a\x08\xf8\xd6\xd2\xefcU\x0c\ ! \x8b\\\x15\x02\xa1pM\x9ej~\xfc\x8a\xc5"\x96e\xa0\x14\x8a\xe0\x0bBiu\xbdK\x8a\ ! n\x92X5\x91\xa5\x107\xae\xbd\xcb\x06k\x9e\xaf?\xb6\x99x<J \x18@\xca\xcc\xaeE\ ! ;`X63\x8a\xce\xb2\x0e\xdf~\xe2\xc9\xcf6\xd2\xc3\xe1&|\x81M\\\xbc8K\xb0\xc7CC\ ! \xc5\xa0\xa2VQt\x83\xd9\x8a\xcd\xc5t\x81ly\x95\x8e\xa8\xc5\x91\x83[\xe8\x8b\ ! \xb7 Y6\xf5\xd9\x1c\xa2\xf2IGs\xaa\xce5Eb\xfb\xae=\\\x9aH\xd6\xe4\xc9\x91?\ ! \xdf3g\xce\xd8\xa3\xff~\x8d\r\xa5\x14\xcd%\x95T\xa9\xca\xfb\xa99Z\xfbw2\x95\ ! \xc9\xd2\xbd\xb9\x81\x91\xc7w\xf2\xa5\xfeN<\xa6E]r\x0ei<\xb9\xd6U\xd6\xf6\ ! \xddk\xe9"\x17\xf4f\xfe\xfc\xe6\x95\x9aO\x14\x8e\x04\xc5\xb1c\xc7\xc4\xee\ ! \x03G\x98\x0f\xf4\x92\xed\xdeK\xf7\xd1\xa7\xb84W\x16\x07\xbf\xf9-\xfa\x1e\ ! \xda\xcc\xf7\x9e\xd8\xc7\xaeG\x07\xa8\x0f\x05\xa9[\x96\x91\xa63\xeb@\x15\xc3\ ! \xe2\xcdl\x91+R\x1b\x0f\x1f>\xe2\x84\x1d\xe7N\x14###w\xfc\xc2\x99L\x82={c\ ! \x0c\xed\xee\xc1+I\x88\xa94\xe2\xfa4\xac\xc8\xc0\xda>\x1a],q\xdd\xd3\xc6\xd6\ ! =\x87y\xee\xd4iG\x0e\xb4\xae\x0e\x89\xef\xbd\xf76\x83\x83aB!\rin\x01\xf1\xc1\ ! M\xc8\xe5\x01\xb0l\x9b\xb7g\x0b\xfc\xbd\xe0C\xed\xe8\xe5\xb9\xd3\xcf;6z\xb8\ ! \n\x95L\x8c\x11i,\xe2\xa9.\xc3x\x02\x96\xe5\xf5\xb5\xe9\xbc\xca\xb9\x9c\x84\ ! \xb5\xe5a~\xf5\xe2\xef\x1c\x1d\x14]\x9d|[\xa2\x16A\xbf\x02e\x19\xd2sP5\x80\ ! \xb5\xa8\xff@6\xa8l\xd8\xcc\xcb/\xbd\xec\xf8\xe4\xebj\xa7\x1a\x1a\xfc\x94K\n\ ! \x94\x14P?\x89o\xc3\xb6\x99\xd5`h\xf7^W\xea\xba\xda)Ei\xe1\xfc\x85E\xc2\xdb\ ! \x03D\x0c\x93\x8afP1,\x92\xb2JR\x15\xec\x8f\xb6\xb9R\xd7U(\x9f\xbf\x9d\xcb\ ! \x97\xe60\x12\xb7\xe8\xcci\xa4\x0b\x1a\xe3K%n\x16\rZ\x07\xbfLKG\xa7+u]\xbbxy\ ! \xe1\x85\x9f\xd9\x99\x99w\xd8\xd1\x1ba\xe2\xfa4\xea\xbcL<\x12\xa2YXL\xe6T\ ! \x92"\xcaY\x07F\xf7O\x93k\x9d\x1a\x1f\x1f\xe5\xd0\xc1\x08_yt\x88}\xdbc\x88\ ! \xa94\x81\xd4,>\xa5LZ2x5\xb3\x84=|\xc8\xfe\xeb?\xcf\xdf;AQ,.\xd2\xb7\xad\x9e\ ! PX\xa7\xbdR\xa6}~\x91Fe\x15\xbfm\xd1\xd3\xe0\xe3pk\x1dsS\xe3\xae\xd4v\r*\x12\ ! i&\x91HS-f\x107\x13\xb0R\xbc\xed\x8e\xc2/l\xf2\xf9\x15Wj\xbb\x06\xd5\xd3\xf3\ ! E.\xbf\xa5\xf2\xe1\x8d$\xd6Ja}\xc4\x00(WM&J\x06_\xd8\xf5\x88+\xb5]\x83:u\xea\ ! y\xa1U\xbbx\xfdB\x89\xabS9\xf4\x8f/[\x14\xdddt\xa1\xc8\xbb\x95 C{\x0f\xb8R\ ! \xdb\xd5kg\x80\xa7\x9f\xfa\x8e\x1dL\x8d\xb3?\xac\xd1\x19\xf6q-WfT\x0b"u\xef\ ! \xe07/\xfd\xde\x95\xf4s\x1d\n\xe0\'?\xfa\xa1=}\xfd*Z\xb9L4\x16c\xeb\xe0\x10?\ ! >\xfdSW\x80\xe0.A\xddm}.\xdfO\xdd\x87\xbaW\xf4\x1f\xdb\xdbx\x0e\xadh@\xaf\ ! \x00\x00\x00\x00IEND\xaeB`\x82\xbe\xa4\x02\x1e' , 'ToolBar_Preferences': ! 'x\xda\x01\xe9\t\x16\xf6\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x005\x00\ \x00\x00(\x08\x06\x00\x00\x00^\xae\xb25\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\ ! \x08d\x88\x00\x00\t\xa0IDATx\x9c\xed\x99{TUU\x1e\xc7?\xe7\xbe\xc1\xcbS@PTDS|\ ! \x0e\xa1HSj\xf8H\x1d\x96\xceH\xa5\xa1\xae\xca\x9aap\xb1f\xd40ZZ.\xca\xc9\xb2\ ! )\xb0\xc6LS\xa6q5\xe6[S\x91\xd1e\xf9\n\x9c\xd24\x1f\x05\x832(I\xf2R@\xe0\xe2\ ! \xe5r\xef\xb9\xe7\xcc\x1f\xfb\xc2\xd5\x1e\xb3\xbc\x17\xad5\xad\xd9k\xedu\xce\ ! \xd9\xe7\x9c}~\xdf\xfd\xfb\xfd\xbe\xfb\xbb\xf7\x91\x02\x03\x03\xf9\xb9\x15\ ! \xcdOm\xc0\xdd(\xff\x07\xf5\xbfRtw\xab\xe3\x0f?\xfcP-++\xa3\xf4|\x11\x8d\xd5\ ! \xa5\xb4\xd6\x95#k|\x19:\xfa\x11\xb2\xb3\xb3\xa5\xf6\xe7\xb6o\xdf\xae\xfa\ ! \xf8\xf80e\xca\x14\xe9\xbf\xf5\xe7I\x91\xee\x06Q\xbc\xff\xfe\xfb\xea\x8e\xf5\ ! o\x12\xd1r\x94\xdf\x8f\x82\xbe\x83\x13 \xfc>\xb8v\x9a\x99o|\xc5\xe0\xa4\x85\ ! \xe4\xe4\xe4H\xabW\xafVwoX\x89\xce\x1c\xceo\x1e\x9dIZZ\xda\x1d\x01vW@\xcd\ ! \x9f?_\x1dpy)3\x9f\xf8-\x98BD\xa3\xa5\x02\x9a/\xd1Vy\x82\xd9[\x82\xb9wJ\x06E\ ! \'\x8f\xb2yr!\xb5\x8dm\xa4\xed\xbb\x87I3\x9f\xe1\xf9\xe7\x9f\xef4\xb0\xbb\ ! \x12~z\xbd\x1e\xbd\xc1\x00\xf5E\xa0\xc8\xa0\xd1\x81\xce\x17t\xbe\x18\x87>\ ! \xc5\x1a\xdbz~\xf1\xe7?\xb1g\xae\x16F,\xa1\x9b\xa4a\xab\xcf\x0b\xfcz\xed"\ ! \x16/~A]\xbe|y\xa7\x80u\x9a(\xf6\xef\xdf\xaf\xee\xd8\xb1C\xbd\xb9M\xa7\xd3\ ! \xa1\xa8@[#4\x95A\x97\xee\x10\x12\x0b\x91\xe3 h\x10\xa1\xc1\x01\xbc8\xc9N\ ! \xfc\xa8\x89`\xad\x81\xeac\x18{$p`n\x1b\xa5\xfb^!==]\xfd\x81\xcf\xddV\xe9\ ! \x14\xa8\x9d;w\xaa\xaf\xbe\xfc"\xef\xbd>\x9f\xcc\xcc\xcc\x0eC\x8a\x8b\x8bq\ ! \xca2H\xae\xee\x03\xfb\x83)\x18\x9c6Q\xc3F\x906\xd6\x0fluP\xfb94\xfcKx2z\x1a\ ! \x7f}:\x08\xe7\xe9\x9cN\x01\xebTN\xdd\x7f_\xbc\xban\xd4\xc7\xf4\x18\xf4 \x8b\ ! \xde;Ky\x97IHr+}m\x87H\x8a\xb1\x12\x1b\t]\xcc\x010\xf0i0\x06\xbaC\xb1\xa9\ ! \x0c\xbe\xce\x17\xd7(\x10\x1a\x07]"\xc1\xde,\xee\xd7\x9d\xe5\x8f\x1b-\x0cN~\ ! \x85\xc5\x8b\x17{\x1c\x8a^\xe7\xd4\xf4\xe9\xd3\xd5\x87\x94\\z\x8c\xcd\x04S0\ ! \xaf=\xde\xc8\xdb;\xb7\x11\xd9\x15\x92\xe3\x8c\x94T\xc2G%0\xae\x7f\x13\x01(\ ! \xee\x17UE\x84c\xbf\x19`\xf9\x1ad+\xf8G\x0b\x80\x92F\x1c\r\xfe\xf8h\xebimm\ ! \xf5\xca6\xad\xc9d\xf2\xf8\xa5\xac\xac,\xf5\xfa\xc9\xb5<7\'\x11|\xc2\xa0\xa1\ ! \x18T\x99\x84\xb8\xc1\x0c\xec\xda\x8a\xc3z\x9d\x1a\x0b\xf8\x19\xa1\xcf\x80\ ! \xa1\x108\xc0\x1d\x8a\xa8 iA\xef\x03\xc6`\xf0\t\x05U\x05\xc5\x01\x92\x04\x0e\ ! \x0b\x1b\xf3Op\xd8:\x81\x0f>\xf8\xc0+\xc2\xf08\xa7\xf2\xf2\xf2\xd4#\xfb\xb6\ ! \xf2\xda\xa4\x06\x91\x07ug\xa1\xb1TPw\xd0 \xe8\x91\x88\xde\xe4GL7\x18>\xfaW\ ! \x82\x1cT\x05T\xf9\xa6^\x14\xd1&i\xdcU\xa3\x03ICk\xf9!\xb2\x0fK\xd4U\x141g\ ! \xce\x1c\xaf\xf2\xcacP\xb5\xb5\xb5\x04\xa9U\x04\xf8 r\xa3\xbe\x08\xcc\xbdD\ ! \x089Z\x84q\x91\xe30\xf6O\x16^tX]\xa0\\!(\xfd\xc0\'%\r\xd8\x9b)\xbb\x06\x0b\ ! \x12\x15\xb2FUPU\xf0\x16\xe3\xc7\x8e\xf6\x18\x98\xc7\xa0RSS\xa5nq)<\xbd\xc5\ ! \x97\xd6\xeas\xe0\x1b\x06!\xc3n}Hk\x10\xf5\x96/\x19\xc0\xe0\x0fz3\xe8\xfdE\ ! \x9b\xfa\xad\\\xd3\x9a\x18\xda7\x94\xee\x01`\xd0A\xc68\x08\xaa\xddK\xe6\xb3\ ! \x0b=\x02\xe6\x15\xa5\xe7\xe6\xe6J\xdd\x1f|\x86y{\xfcE\xc8\xe9\xcd\xae\xdet\ ! \xc2x\x9d/hM\xaes\x93\x00\xae\xcap\xe6u\xda\n2\xe1\x9b\x8f\\\xf7un`\xaa"\xae\ ! \xfd\xa3\x89\x8d\x84\x91\xbd!\xe1\x1e?\x9eH\x80\xd2\xafNxd\x9f\xd7\xec\x17\ ! \x17\x17\xc7\x86C>py\x9f\x00\xe5\x1b\xe6\xce\x13E\xe7\x06\xa97\xc3\xa9e\xbc\ ! \xf4\xb1?5\xbe\xa3\xb9nU\x08\xd9W\xc8;\xb3J\x05\x03J:Pm\x82\xf5\x9cv\xd0\x9b\ ! \t\xedso\xc7wb{\x9cA\xfb\xcd\x8d\x1f\x07\xd4\x91#GH\x8ei\x00\x19(\xdb\x06\ ! \x11\xa3 4\x16d\x9b\xf0\x10\x80\xd6@\xe1\xb6\xe5\xe4VLd\xf2\xc3O21*\x8a\xa6\ ! \xa6&VgW\xb1\xf9\xe8\xe7\xcc\xd4\xee\x86\xdeI\xeeN\x15\xd9\xe51\x83\xa0z\xa7\ ! \r\x93\x1e\x8cz\xcf\x02\xea\xb6A\xe5\xe5\xe5\xa9\xc7\x8e\x1d\xe3\xf8\xf1\xe3\ ! 4\xd7\x94\xe1,\xf9;O$;\xc0\x18J\x9b\xe5\x1aF\x10\xa3\xaesM\x11z3\x9c\xc8\xe2\ ! \x9d\xcbI\xa4\xa6g\xd0>\xc9[\xadV\xb4\xb6j\x0c:\xf8\xe2\xab\x8b\x0c\x0f(\x05\ ! \xbf(\xa14TYT\xc5\xee\x9a\x98AQ\xc1\xa9|\xafI\x9d\x07u\xee\xdc9j\x8f,c\xcf\ ! \xa3\x12\x04\xc6\x80\xfe^\x11^\xf5_b4\x1a\xddd!\xe9\x04I\xd4\x17\x91\xba;\ ! \x8c\xc7\xe6\xfe\x8e\x9bUKYY\x19~\xf2\x15"\x03\xa1\xee\x06B\x1f\x9a\x15\x01\ ! \xa2\xbd\xa2\x11}(\x1a.\xd5\x81\xc5\xe6\x19\xaa\xdb\xf6k\xe9\x85\x12\xd2\x12\ ! \xac0"\x0b\x82\x07\t&Sd\xf0\r\x87\xe0!\xae\xdcP:\xc2\xa7\xe9\xdcF\x8c\xd1\ ! \x93\xe9\xd9\xb3gG\x1f\x16\x8b\x85O\x8f\xfc\x831}U\xecN\xd0\xb4O\xad\x8a\xdd\ ! \xe5!Wmk\x80\xc6R\xbe\xb9X\xcc\xbb\xc7M\x98C\xa2<\x02u\xdb\x9e\xf2\xd5\xab\ ! \x0c\xec\xae\x17D\xd0zU\xa8k\x83?\x04\xc5\x889\x8a[Gs\x7f\x89\x96!\xf1#\x90$\ ! a\xb9\xddng\xf7\xee\xddD\xb6\x1622\n*\x1a \xdc\x1f\xe1\x11\xd9*HB\xa3\x03[\ ! \x1dK\xb7WRp\xad\x1f\xe6\xb0~\xc4\xde\x1f\xcb\xb4\xc4D\xb6\xef\xdcu\xe7Ai5\ ! \x12N\xd9\x81\xb6\xa5B4t\x1d&&W\x10\xdeq\xda\xdd\xea\x00\xa8\xb2\x18\xf0\xd3\ ! jq8\x1c\x94\x97\x97\xb3/\x7f\x0f\xca\xbf\xb7\xb1 \x11l\x0e\xb0: 6\x12\xa1D\ ! \x1cV\xe1-IG}u9\x9f\xd9&p\xfa\xfc)\x89\xf3U\x14\x14\x14\xb0r\xe5\xca\xdb\x06\ ! \xe4\x11\xa8\x96V\x99\xb3W`x\xe4\x97b\xc9`\x0c\x16#\xdc.qp\x03BU\x88\x8fl%{\ ! \xd7fN\x1e;\xc8\xd5\xd2B\x12\xc2\xaayx2\xd8d\xb8r\x1d\xa2\x82A\xdf=A<\xefh\ ! \x11Gk\r\xebO\x9a\x18\x938\x96\x13\'Oy\x04\xc4+P\xe6\xc0\x10\x8e\x95\xc2\xf0\ ! a5bT\x9d6\x01J\xa3\x13\xf3R\x078\xc0V\xc7\xe8\xb1\x93\xb0\xcb\x07h\xb0\xc2\ ! \x90\t\x10b\x86\xab\x16Q\x03}!aX\x1f\xe1%[\x83\x9b\xedT\x99\xc8@\x95\x03\x17\ ! \x8a\xc9\xcf\xcfW\xbd\xdd\x8c\xb9m\xa2HLL\xe4\x93\xa6x\xb6\x1e\xbep\xeb\r\ ! \xc5E\xc1\xb2\xd5Um\x82\xd1\x82b\x18?i*\xd3\xe3\xb4\x00\\\xaa\x83f\x1b\x0c\ ! \x89\x80\x07\x86\x0f\x14\xe4\xe2hq/\x1c\x1d-\x80\x86\x94\xd1\xe1\x0c\xb7ma\ ! \xd5\xaaU\xec\xda\xb5\xcb+A{\xdb\x9e\x9a1c\x86\xb4q\xe3F\xf5\xcd\xd7\x97\x11\ ! \xdd\xf53\xe2\x07\xd9\xb9V[Ih\x80Q\xcc3!\xc3\x04\x03\xb6\xe7\x95\xd3&\x16\ ! \x86=\x12\x19\xe8wI\x00\xf5\t\x13\xcaC\xef\x0f\xf6F1\x00\x8a]\xe4\xa3\xd3&\ ! \xae%\r\x7f\x18\xdf\x85\x0b[vp\xfat\xbc7\x98<S\x14\xb3g\xcf\x966m\xda\xa4f\ ! \xaf\xfb\x0bE\x1b\x0e\x90>\x06\x92\x06\xb7\x11r\xe3\x02~\xe6H\xa1\xf9\xe0V%n\ ! \xf0\x17^q\x11\x01N\x9b\xa0lE\x16\xe7\xedG\xd9\xe51\x8d\x8ek\xd7-4J\xbd\x88\ ! \x88\x88\xf0\n\x94\xc7\x82v\xd6\xacYRx\xaf\x01\x0c\x8c\xd0\x904\x18\xc2\xfc@\ ! \xa7\x05\xae\x9f\x17\xe1\xe7hqW{\xb3\xc8\x19{\xb3\xb8\xd7v\xd3y{\x1e\xd9\x9b\ ! \xdd\x9eR\x15\xb05\xf0\xd6Q\x89\xaeC\xa6\x91\x9e\x9e\xfe\xe3,\x12\xd7\xad[\ ! \xa7^\xfa"\x9f\x9cd\x85>\xe1~\x98t`\xd0"\xe4\x91\xa3\xe5\xa6\xdc\xb2v\xe8\ ! \xb7\x0e\xb0\xedG\x97x-))a\xd1\xe6\x1a.\\\xaa\xecP\xec\x9bO:9\xc3C<\x96\x92\ ! \xe2\r\x1e\xc0\x0bAk0\x18\xd0\x18\xfc\xa8j\x82\xde\x91f\xb4\xb2U\xe4\x8e\xc6\ ! \xe0\xa6f\xbdY\x8c\xbabw\x1d]B\xb5}\xc5\xdb\xd6\xc8\x96O\x9b\xc8\xbd\x10\xcb\ ! \x80a\xbf$\xe3\xf0\x11\x9e\x1bq\x1e\xbb\x13\xfeV:\x94\x8c%\x0bHJJ\xf2z\xef\ ! \xcf\xab\xdd\xa4\x9c\x9c\x1cu\xd3\xda\xe5,\x1dU\xc6\x03C\xba\x89\xb5\x11\x88\ ! \\\xd2\x9a\xe0F\x95\x00\xe8\x13\xe6&\x8ev\te\x0c\xe4\xc4\x99\x12\x16\x9d\x1c\ ! \xc3\x8b/-%99YZ\xb3f\x8d\xbaa}.\x8e\xb6\x16\x9eJ[\xe0u\xd8u\n\x14\xc0\x8a\ ! \x15+\xd4\xf5\xab^&g|9\xf1C\xfb\x08\x10\x92\x0e\xf4\xbe\xbc\xbc\xe5"\xbd\x82\ ! \xe1\xc9\x04\xb8n\x85\xa0\xc0\x00\xd7|&\x83\xde\xcc\'g+\xd9\xafIg\xed\xfaM\ ! \xb7\x18\xbfw\xef^u\xea\xd4\xa9\x9d\xdev\xf6z33##CJ]\xb0\x94g\x0f\xf7\xa5\ ! \xf0L\xb9\xcbK\x06\nO_d\xd5?}\xa8l\xd6\xd2&C\x83\x95\xef\xe4\x99M\x06\x93V\ ! \xfeN\x9fw\x02\x10tr\x87v\xde\xbcyRz\xe6+d\x17\xdd\xcf\x1by\xb5\x1c:u\x99e\ ! \x9fF\x93\xb5\xec\r\x8a\xa5\x07Yq\xd8\xf5\xa0\xe2\x00\xd9\xb5\x87\xa7*\\\xb5\ ! @\x83\xc5\xdeI\xd3\x7f\xb8tz/\xbd_\xbf~\xa4/\xcc\xa2\xa6\xcf\x02r+&2\xe1\x91\ ! \xb9,Y\xb2D\x9a\x9d\xba\x90\x03\r#\xc9\xfb\x12Jj\xe0\xcc\x15X[\xe0\xe0\xf1\ ! \xdc&\xb6]\x1eF\xec\xc8\xd1w\xc2\xfe\xef-w\xecW\xce\xc1\x83\x07\xd5\x96\x96\ ! \x16\xa6M\x9b\xd6\x11B[\xb7nU\xdf};\x87\xfa\xea\xaf\xe9\x19\x15Mx\xaf\xfe\ ! \xf4\x8f\x19L\xef\xde\xbdIII\xb9c?\xd9\xbe]\xee\xca\xff\xa9\x9f\xba\xfc,\xff\ ! \xf9\xfe\x07\xec\xee\xfa\xbfQ5\xe4\x94\x00\x00\x00\x00IEND\xaeB`\x82\xc6\xae\ ! \xd78' , ! ! 'ToolBar_History': ! 'x\xda\x01\x97\th\xf6\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x005\x00\ ! \x00\x00(\x08\x06\x00\x00\x00^\xae\xb25\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\ ! \x08d\x88\x00\x00\tNIDATx\x9c\xed\x99}lU\xf5\x19\xc7?\xbf\xdf=\xf7\xdc\x97\ ! \xde[\xfa\x82m\xa1\xa5\xbc\x97B[Z\xd1R|iY\xe2\x92Mt\xb29\x17\x04\xa4\xceE\ ! \x97\x19\x13\x17]\x06\xac\x0b\nCm\xa9\xf2\x87[H\xa6\xd9\xdc\xd6l\x18#\xd9\ ! \x12H0:\xe3\x14t\x1a\xb5R\xe8\x14\n\x94\xd2b\xdf\xe9\xeb}9\xe7\xdc{\xce\xf9\ ! \xed\x8fb\x87\xe2\x84\x96\x17\xa3\xf1\x9b\xdc\x7fnN\x9e\xdf\xf39\xcf\xef\xf7\ ! \xfc\x9e\xe79"--\x8d\xaf\x9b\xe4\x97\xed\xc0\xe5\xd07P_\x15}\x03\xf5U\x91v\ ! \xb9\x0c\xef\xda\xb5K\xf5\xf4\xf4p\xaa\xa3\x83\x93m\xc7\xe8\xeb:A\xeb\xf1\ ! \xe3\xdcy\xf7\x03\xd4\xd7\xd7\x8b\xcf>\xbfw\xef^\xb5b\xc5\x8as\xfe\x9f\x8c\ ! \xc4\xa5J\xe9{\xf7\xeeU---\x1c9r\x84\x9e\xae\x8f\xf1\x12#\xe0\x892kz\x98y\ ! \xf9\x19\x94\x14d\xd1\xda\xde\xc7\x1f\xf7\x0e\xf0\xe0C\xeb9\x1b`\xdd\xbau\ ! \xead\xdbq\xee\xfb\xe9\xfdTWW_4\xd8EE\xea\x99g\x9eQ\x8d\x8d\x8d4\x1f<\xc8\ ! \xd3Oma\xc1\x8c)\x14\xe7\x07\xa9\x9a\x1f$\x1c\x08qU\xc6l\xc0ed4\xc2\xc7]\x1f\ ! \x93\xe2\xd7\xe8\xef:\xcc\xe0\xe0\xe0\xb8\x8dU\xabV\xa9\xbc`/\xab\xee^\xc2\ ! \xa6\xed\xb5444\xa8\x8b\x05\x9bp\xa4jkk\xd5+/\xbf\xc4\xe9\x9evJ\x0bs\xa8(\ ! \xc9e\xc1\xac4\x1c\xdb\xc4u-\xfc\xba\x86\xed8$\x926\x8e\xe3\x02\xa0y$\x1e\ ! \x8f$5\xec\xe3\xb9\x17? \xb3`%\xcb\x96-c\xd7\xae]\xfc\xed\xaf\x7f\xe1\xe5?\ ! \xff\x82\x8a\xe5%\xbc\xf5\xfa!6\xfd\xf6U~\xb9a\x13k\xd6\xac\x994\xd8\x84\xa1\ ! n\xf9\xee\xb7\xd5\x8fW\xe4Q03\x85\xbe\xfe\xd3\x18\xa6\x89R\x9f~F\n\x81\xa6It\ ! \xdd\x83r\x15=\xa7G\xe9\xec\x1e\xa2\xb3w\x98\x03-\xc3\x1c\xeb\x82\xcc\xa9Y\ ! \x14\x15\x15\xd1r\xac\x8d{V\xcc\xe4\xee\x1fUB\xd0\xcf\xbe}\x87x\xf4\xe9\xd7\ ! \xd8P\xf3\x08\xabW\xaf\x9e\x14\xd8\x84\xb7\xdf\xd4\xec\\\x06\x87\xa3t\xc8A\ ! \x1c\x17\x84\xf8\xdf\xba\xba\xd7C\xc0\xef\xc50\x93\x1ci\xed\xa5\xb9\xa5\x8b#\ ! \'\xfaPZ:\xc1\xb4\x19\x843\xca\xf8\xd6m\x8b\xd9\xb8t\t\xc5\xc5\xc5\xa4\xa6\ ! \xa6\xb2\xf97\x8f\xe3\xbamc\x06"q\xaa\x96/\xe6\t\x04\xbfz|\xf3\xa4\xb7\xe2\ ! \x84\xa1JKKys\xff\x0b\xac]1\x0b\xc70\x00\x10\x02\x94\x82\xf7\xfe\xd3\xc5\xcb\ ! \xfb\x8e\xd2\xd2\xd6\xcf\x8cY\x85\x14\x95^\xcf\x1d\xf7^\xc7\xec\xd9\xb3\x99\ ! \x95\x9fG~\xfe\x0c\xa4\x148\x8e\x83eY\x00\x18q\x03\xfcg\x8c\x0b\x01\xa3q\xae\ ! \xab*\xa1N\x08j&y\xc6&\x0c\xf5\xf0\xc3\x0f\x8b\xd2E\xb3\xd5\x03\xab\xca\xe8\ ! \x8e\xc7\x11B \x84`4b\xb2\xfb\xf5\x93,\xa9\\K\xfd\xef\xef"\x1c\x0e\x91\x1a\ ! \x0e\x11\x0e\x87p]\x17\xd34\x19\x1e\x1e\xc20\x0cFFF0\x0c\x83\x85\x0b\x17~*\ ! \xd2\xe3`Q\x83e\x95El\x056m\xafe\xe7\xce\x9dj"glR\xd9/+w\x1e\xdd\x03\x06R\n\ ! \xa4\xf4\x00.\x89D\x9c\xcc\xccL~x\xfb\x0fXX8\x9fX,F<\x1eghh\x10\xc300M\x13\ ! \xd34q]\x17\x9f\xcfG \x10@\x08\x81\xe3:\x9f\xbfH\xd4\xe4\x86\xcab6+\x97Gk\ ! \xb7N\x08\xec\xbcP{\xf6\xecQ\xcd\xcd\xcd\x0c\x0c\x0c\x8cG\xa5\xb1\xb1\x91\ ! \xd7\xde9\xc9\xad7\xa63<\xd2\x87\x11\x8f\xd2~\xb2\x8bX\xc4\x07\n\x86\x86\x86\ ! hmm\x05\xc6\xce\x9c\xa6iH)\t\x04\x02\xb8\xae;\xbe\xfd\x92\xc9$\xae\xeb\x9e\ ! \x89\x96\x00>\x93q\xce\x9c\xb1:)\xa9\xdd\xb1\x9d\xba\xba:\xb5q\xe3\xc6\xf3\ ! \x82\x9d\x17\xaa\xb3\xb3\x93\x1d\xbf\xdb\xceCw\x95\xd2z\xfc R\n\x16eh\xe4\ ! \x84Rh9|\x8ac\xc7:\xb0\xac$\xfd\xa7cD\xe3s\x00\xf0x<\xa4\xa6\xa6bY\x16\x96e\ ! \x11\x89D\xf0z\xbd\xf8\xfd~|>\x1f\xb6m\xa3\x94B)\x05\x08:\xbbN\x91\xb4L\xbc\ ! \xba\x8fO\xa5R! jR\xb1t\x01\xa3O\xfd\x9d\xb6\xb6\xb6\xf3\xb9\x0b\\@\xed7s\ ! \xe6L\xd6\xde\xf5\x13^\x7f\xaf\x8bU\xdf\xab\xa4\xa28\x8d\xab\x17\x04\xc9JwqU\ ! \x02\xcbr\x18\x1c\x88cY\x0e\xaerQ\xca%\x12\x89\xd0\xd3\xd3\x83a\x18\xe8\xbaN\ ! vv6~\xbf\x1f\xd34\xe9\xeb\xebcdd\x04\xdb\xb6q\x1c\x07)%\xad\xadG9\xd4|\x00;\ ! \x99\x00y\x96K^\x8d\x84\xedp\xe7\xfd;\xf8\xcem\xebX\xb9r\xe5\xa5\x81\xba\xf9\ ! \xe6\x9bE\xfd\x93O\x8a\xa2\x8a\x95l}\xb6\x99i\xb9\x8bP\n\x92IE \xe0cQQ\x1e\ ! \x19\x99!\x92\x0e\xa0\xc0\xb6m\x02\x81\x00\xd9\xd9\xd9\xe8\xba\x8ei\x9a\xe3\ ! \x80\x9a\xa6\x91\x99\x99I8\x1cF)\x85m\xdb\x08\xa0\xa7\xab\x9b7\xdfx\x8d\x83\ ! \xcdM8vr\x0c\xcc\xe7%\x9eHr\xef\xc6\x06\xae\xad\xba\x9d\xba\xba:q\xa1\xb5\ ! \xe1\x05W\xe9\xdb\xb6m\x13\xd7.\xbf\x83\xba\xe7>$\x7fV\tR\x82\xeb*\x02\x01\ ! \x9d\xe2\xa2<\xd2\xd2\xfdXI\x07\xa5\x14\x86a0::\x8a\xe38x<\x1eRRR\x00H&\x93D\ ! \xa3QL\xd3\x1c\xb7\xeb*\x85\xab\xe0T\xc7)\xfe\xf5\xea+4\x1d\xfc\x00\xd7N22\ ! \x12\xe7\x9e\x9f\xff\x81\xbc\x82\xeb\xa8\xaa\xaab\xf7\xee\xdd\xea\xff\xf9\ ! \xf6YM(\xfbm\xdb\xb6M\xac_\xbf^=\xfe\xec\x0b\xd4\xdcWF\xeb\xf1&\\W\xe0\x0f\ ! \xea\\]\x9a\xc7 \x01Lk\x0c,\x91H\xe08\x0e\xba\xae\xa3i\x1a~\xbf\x9fd2\x89\ ! \xe38\x98\xa6\x89\xd7\xeb\xc5q\x1c\\\xd7\xc5\xb5\x1dl\x1b\xdaZ\xdbP\xfc\x13\ ! \xaf\xd7\xcb\xdbM]\xf4\xf4v\x11\x0c\xbd\xcb\x9fv418\x12\xe5\x9ak\xaeV\x8d\ ! \x8d\x07\xce\x1b\xad\t\xf7S\xf5\xf5\xf5b\xd9Mw\xf2t\xc3\xfb,*,C\x08\x81m;\ ! \xa4\xa7\xa5p[e\ni\xfa\x00\n\x8dp8LZZ\x1aRJ\x0c\xc3`hh\x08\xcb\xb2\x90R#=c*\ ! \xfe@\x08\xdbN\xa2\t\x97\x94\xa0\x9f\xbc\xfc|n\\\xbe\x9c\xf2\x8a\n"\xd1\x08\ ! \x85s\xd3\xd8\xf2\xe0-\x94/\xcc\xa6\xbf\xaf\x8f\xf7\x0f\xb53m\xda\xf4\x0b\ ! \xf2q\xd2\xad\xc7\x8c\xb4\x98zhu\t\xc5e%tt\x1c\xc6\xb2,\x04\x0e\x81\xd04r\ ! \xca~F\xd2\x93\x8bk\x1bxu\x1f^\xdd\x8f\xc7\xabc\x1a\x06Vl\x0036\x80t\xe3\x84\ ! <\xc3$F\xdb\xc9H\xf5 \x00\xcbJ \x81\xd6\xf6\xd34\xbc\xd4\x8e\xd23\xb8\xb6|)\ ! \xe5\xe5\xe5\xac[\xb7\xee\x82/\xdfIC-\x9e\xe3U+\x97j\x84S\xa7s\xe3\xf2\xeb9z\ ! \xf4\x03L\xd3@\xb9\t\xb4\xc0U\xcc\xb8\xe6\x01H)\xc4\x88\x0e\x92\x8c\xf7b\xc7\ ! {\xf1\xd8\x83x\xd5(\x01\xcdbJ@\xe1(A4\x1a\'\x1e7\x88Ebt\xf7t\xd3\xdd\xd5\xc9\ ! \xc9\x1e\x83\x01\xdf\r\xec\xdf\xbf\xff\xca\x14\xb4\x9f\xc8\xe7\xd3)X8\x87\ ! \x8f>:\xc1\xfe7\xfeMvN\x1a\x91\xd1\x01\xa4G\x92\x18l\xa7\xa7\xfb1\xe6-\xbe\ ! \x95\x9c\xcc \xca\x89\xe0\xf1\x1a(a \xa4\xc6h$\xc6\x91\x8e~\x86\x87\x86\x89\ ! \xc5\xa3\x0c\x0f\r!\xa4"\x18\xf4\x91\x9f\x9f\x8e\xa3\x07\x18\xe8\x9d\xacg\ ! \x17\x01\xe5\xba\n\x9f\xdf\xc7\xdc\xf9\xb3\xe9\xee\xea\xa1\xbd}\xe8\xcce:v\ ! \xa1N\x99\xa2\xd1\xf5\xd1\x1eN$,\x0c\xc3A\x08\x0f\x08\x81\x14\x12\xa5\\l\'\t\ ! (RRtr\xf3\xa6\xe0\xf3y\x10B\xe0\xd5\x04\xfa@\x82s\xaa\x8b+\x01%\xa5D)\x89\ ! \xae\xfb\xc8\xcd\x9dNdt\x08\xc7\xb1\x91\xd2C 4\x85\x9c\xac|N\xb6\x1d#=\x04r$\ ! I<n#\xa5D\xd3\\\xfc~\x0f>\x9f\x8e\xd7+\xc7+\xfcO\xa4\x14\xe7\xf4gW\x0c\xcaq\ ! \x1c\xfc>\r+\xa1\xf0\xfa\x02\xa4\xa6{H\x981|\x810~\x7f\xcax?"\xa5 =\xddG(\ ! \xa4#\x04x\xbd\xf2\x8c\xf3\xea\x92\x00|\x9e&="3E\x0e\xef\x1c\xea\'%\xa8#\x84\ ! @\xf7\xfa\t\xa5N\xc5\xe7\x0b\x02 \x10\xe3\x1bH)\xf0z\x05\x9a&p]\x85\xeb\xaa\ ! \xcb\x02\xf3\x89&\r\xf5\xebG\x1ec\xf7\xdb6\x07\x0e\x0f\x12\x0c\xe8\x08!\x11B\ ! 2Vm\xcb\xb1H\x9d\xa5\xcb\x15\x95\xcf\xd3\xa4\xa1\xd6\xae]+6\xd4l\xe1\x1foY4\ ! \x1d\x1e %\xa0\x9fiM\xce\xc0\x89/oNzQ+WWW\x8b\r5\x9by\xf1\x8d\x18\x8d\x87O\ ! \x13\n\xfa\xc72\x9c\x94\x08&~\xc5\x08\x01^M\xe2\xd7%\xae\xebN\xda\xaf\x8b~\ ! \x9d\xd5\xd5\xd5\xe2\x91-\xb5\xbc\xb8/\xc6\xfb\x1f\xf6\x11\n\xfa\xc6\x9b\xc9\ ! \xf3I\x88\xb1\x9fG\nt\xaf\xc4u\x15\xcd\xc7Gy\xf5\xdd\x01B\xa1\xf0\xa4}\xba$c\ ! \xe7\xd5\xabW\x8b\x9d;w\xaa\'\xb6n\xc2\xe3\xe9\xa3\xbcd:\xae{.\x94G\n\xa4\ ! \x14\x08\x01\x89\xa4\x8b\x95T\x0c\x8f&9\xda\x1e\xe3h\xa7C\xff\xa8\xce\xa2\ ! \x92r\xbe_]EMM\xcd\x95\x9b\xfb}\x91\x1a\x1a\x1a\xd4\xb6\xda\xcd\xac\xb9)\x93\ ! \x1b\x96\xcc\xa1\xa9\xe9=RS\xc1#%R@\xdfP\x82\xc1\x91\x04\xbd\x83\t:\x075\xfa\ ! "A<\xfe,\xca\xca\xca\xa8\xac\xac\x9cP}\xf7E\xba\xa4P0\x06V\xf7\xf8f\xee\xb9%\ ! \x97\xa9\xfe~\xdaz\x86i\xef6i\xef6\xb0d\x0e)\xe9\xb3\x987\x7f!\x05\x05\x05\ ! \x14\x16\x16r\xa9>\n\x9c\xadK\x0e\x05\xf0\xfc\xf3\xcf\xab\xba\'\xb6\x10\x1dh\ ! #\x7f^)%\xa5\x15\xcc\x99;\x97\xac\xac\xac\x8b\x1a\'_\xa8.\x0b\xd4\x97\xad\ ! \xaf\xe5G\xb7\xaf%\xd4\x7f\x01-\xd1\r\xa8@\'{\x82\x00\x00\x00\x00IEND\xaeB`\ ! \x82\xbd\xcd\xb0<' , 'ToolBar_Transfer': ! 'x\xda\x01\x05\n\xfa\xf5\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x005\x00\ \x00\x00(\x08\x06\x00\x00\x00^\xae\xb25\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\ ! \x08d\x88\x00\x00\t\xbcIDATx\x9c\xed\x99y\x8c]U\x1d\xc7?w{\xcb\xbce\xdet:3-\ ! \x9di\xe9\xd0\xa1\xb6\xa5 E\x96\xd6\xb2XA\xc1\x08\x1a\x01\xb7\xa8\x88"\xc6\ ! \x18MT\x02b\xb4\x98\xc6@(!\xb2\t\x92J$\x15\xacB(\xb5\xb8E!.Q\x14L[(e\xdaN;\ ! \xa53\x9dN\xe7\xbd7o\xb9\xfb~\x8f\x7fL)6\x1a\xe3\xcc\xa3\xd5\x10\x7f\x7f\xde\ ! \xfc\xce=\xbf\xcf\xfd\xfe\xee\xef\xfc\xce9R\xa9T\xe2\xadf\xf2\x7f;\x80\x13a\ ! \xff\x87\x9a\xa9\xad\xfc\xf4\xb7\xc5\xc9\x98\xe7uSO\xf4\x04W\xdft\xb7x\xfb%\ ! \xef\xa3\xe9\xfab\xf7O\xef\x90N\xf4|p\x82\x95zx\xd3V\xf1\xf1+V\xa3\xe6;8hJ<\ ! \xbci\xebIQ\xec\x84*\xf5\x97=c\xac\xbdx\x15CC\x11\xea9\x1f\xe4\xe6G\x1e\xfd\ ! \x97~?\xb9\xefN!!!\x10|\xf4\xcb\xb7\xb4\xac\xe6\tS\xea\xb3\xb7}O\xdc\xf8\xa1\ ! w\x13#cG\x02\xb5\xbd\x9b\xb0\xd8\xc7\xf5k\x1f8N\xad{o\xb8V\xf4\xcf\xefG\x9b8\ ! \xcc\xfe\xfb\xef\xe2\xab\xcb\xba[V\xf3M\x83z\xe8\xa1\x07\xc5\xbau\xeb\x8e\ ! \x054^\xb7\xb0\xb4\x12\xa3f\xc2p3\x01@{\xc7\x07\xd9\xf8\x9b\xbf\x1d7NQ\x14\ ! \x16\x0e,eU\xfb\x02.\xf7\n\xb8\x96\xd1r,oZ\xfa\xd5+\x13\\\x7f\xfd\r\x0c\x0c,\ ! \x12\x1b~\xbb\x8b%g\x9e\xcd\x0b\x1311\x82gGC\x00$5Ev\xe19|`\xcd9\xe2\xf1\xdb\ ! \xbf,\x01$Q\x80\x08\x02\x84>\x05\xf3fT\x92\x96\xa1n\xff\xe1\x93\xe2\xe5\x1d;\ ! \x19:8\xc6K\xbb\x06Y\xb2t9}\x83\r\xb6o\xdb\xc6\xf0\x96\x9f\xb3\xec\xa37\x11%\ ! \x92\x98\xf2\xe3\xdf\xe0\x823\x17#I]\xc7\xc6\xc7AHb;\x88f\xf3\xe8\x93\xd6\ ! \xb1ZJ\xbf\xaf\xad\x7fP\xb4\xf7.\xe4K_\xf8\x0c\xef\xbc\xe6:&|\x89\xc1\xd1\t\ ! \x96\x0f\xcc\xe5\x96\x8f\xac&\x9dN\xd38\x1all\xd5\xe9\xec\xe8\xe0\xceO\xae\ ! \xe6\xd2\x81\xc2\xb1w\xc4QHb\xdb\x88\xe6\x94R\x89HZ\t\thQ\xa9\xc3\x07\xf61\ ! \xb0\xea\x12&\xfd\x90\xb9}\xf3\xc8h*\x9d\xd94\x8b\xc3\x00\xc7q\x11@Jy\xe3\ ! \xcb\xab\xaa\xc2Yg\x9d\xc9\xe2\xc5\x8b\xd9\xbcy\xb3\xe8\xef\xef\xe7\xb9\xf5\ ! \xb7N\xa5\x9f\xe7N\xf9(JK@\xd0\xa2R\xb2\xaa\xb1\xa7\xa2\xb3\xb7\xdc`\xc7X\ ! \x8d\xbf\x8e\x94\xd916I\xd5\x8b(u\x14\x91d\x19\'|\xe3\xcbGQ\xcc\xab\xbb\x87p\ ! ]\x97\x8b.\xba\x88\xbe\xbe>@\x80$\xf1F\xdaI\xd4\xeb\xf5\xe3\x8a\xcet\xad%\ ! \xa5\x04\xb0\xdf\x8c0\xbc\x18\xc7\xf3\t\x92\x84Z\xc9\xc7\xf4\x03\xfc0\xc2\ ! \x0bB\x1a\xcd\x10rS\xfe\x9a\xa62X6\xf0<\x1f\x11\x05l\x7f\xfaqD" \x8a!\x8e\ ! \x8f\xbd\xf7\xd9\x87\xeff\xc5Y\xe7\xb2v\xedZ\xb1n\xdd\xbai\xffd\xadA%1\xaf\ ! \x91EG\xc24m\\\xd3\xc2\xf0B\xdc F\x08\xb0\xdc\x808\x16\xc7M\x92\xcb\xa69th\ ! \x94\xdd?\xbe\x9f\xf3\x96\xbe\x83U\xab\xaeD90B\xb0w\x1f]J\x96OG\xdd\xbcp\xef\ ! \xfd\x18+W0R\\0\xa3\xb8ZJ?\x11\'L$\x19F\xa4\x02\xd5D\xa3\xee:\x1c\xd4]\xf6\ ! \xd7,\x86&M\x9c :\xce?\x16\x82RG\x07\x07\x8c\x98\xecEW\xf3\xd4\xa6\x87\x90\ ! \xff\xf0<\xe1\xe6\xad\x08\xcf\x03\xa0$\xa7y\xde\x19\xe7\x9d_\xfa\x16\xde\xd1\ ! g\xd3\xb5\x96\x94\x92$\x00\t+\xc9\xd0\x91\xe9\xa0\xbb\xd0$A`\x85\x01c\xbaC\ ! \x94$\xc4\x07v\x1c\xf3O\xc5\t\xa2\xad\xc0\x9a\xf7\xac\xc16,*\xcb\xce\xe5\xa9\ ! \xdf?\xc3\xd5\xa9\xbec>\xcfD\xe3,\xb9\xf2\x938AH\x14E\xff<\xe9\x7f`\xad\x15\ ! \x8aDAj\xc8\xe4y\x89\xd0{\x8cP\nP\n\xdd\xc8j\x810T\xb9\xfc\xe3\x97\xb18_giAg\ ! q\xbe\xc1\xe5\xd7^\xc1\x96]\xa3<\xbb\xff\x08u!s\xf1\xda\xfb\xd8\x15\xe9X\xc9\ ! \xd4\xe2l%!\xafDM\xae\xbe\xed.\xa20$\x08\x82\x19\xc5\xd5\x92Rn\xee =\xce\xd7\ ! \xe9\x94\x8e\xa0\xf5}\x1ey\xee\x15\xd8\xb1L\x12\xc6\xec\xf5\x7fK\xe2?\xcf\ ! \xac M\x17KP2\xbd\x8c\xdb6\xae\xa5\x93\xae\x1a\x0cU-N\xef\xd4\x99s\xd5ul\xfe\ ! \xf5\x16>%\xf7\xb1%\x9e\xe0\xb4kn\xa0f\xda\x84a\x80\xef\xfb\'\x17\xea\xb6G\ ! \xbf%FO\xe9\xe7\x02W![(\xd26\xef 5s#zVa_m\x94\xc3\xe6\x10\xea\x98F]\xa4\x18\ ! \xd5\x0f3\xa0\x9eK~\xd6\x12\x02\xc7\xc1\x89bFt\x07+\x8c\xe9\xbb\xf8:\xd4\xdf\ ! \xff\x82C\x9e\xc5H[\x8a\x05\xef\xff\x02\x15\xcb\'\x89\xc2\x93\x0b\xf5\xd8\ ! \x96\x9f\x89\x17J\xfd\x9c\x7f\xba\x8d\x08=\xf4\xcasL\x0e?K\xec\x8e\x11+E\xe4\ ! F\x8c\xec\x160\xe9DI@d\x14&\x0fmeY\xa5NW\xffJD:F\x91$\x84$(\xdb>\xe9/>\xc0\ ! \x03\xdf|\x1f\xc1\xd7~\xc5\x91\xb1\x1a\xa5\xb9Y\xba\xe3\x840\x0cO\x0e\xd4\ ! \x13\xcf\xfcBl\xcb\xcccyo\x8dle=\xe9\xf8e:Ss\x90\xd2\x11\x86.\x91\x16!\x1dr\ ! \x8a\x0e5\xa4\x11[HB\x86$\x8b\x98\x9dc\xe8\xe5_R\xaf\xc8\x14\xe6/bV)K\xbe-\ ! \x8d\x94\x86(7\x0b\xe3\xee?a\x87\t\xa6\xe9Qm\x87YqL\xfc\x0fk\xd7\t\x85\xfa\ ! \xb3<\x87\xb7-[@\xdb\xd8w\x11\xea\'\x18\xde\xd7\x86\x9a\xda\x8c\x92\xff\x18\ ! \x8b\xe6\x1ddOu\x9cl\xacQ\x94\x05\xaa\x1c\x12I1\x12\tBI\x91YT$\xdc\xf1<cGjT:\ ! \xe7Q\x9c]\xa2\xad\x98\xa5\x90\xcf\x92kK\xa1fR\x14S2a,\x88\xe3\x99\xf7\x80\ ! \xd3\x82\xba\xff\x89-\xe2Po?\xfd\xa9\xa7\xc9w\xfe\x18\xc37\x99\xbd\xfa{\x8c\ ! \xbev.Rz+\xf5`\x14)Q\x91\xe5\x04Y\x02\xf9\xf5\xeeG\x02\x91\x08\xb4\\\x86\x85\ ! \x9d\xe3\xec\xdc\x19\xa0\xfb\x01\xf5j\x9eBG\'\xd9\\\x96t>K*\x9b"\x95o\xa3\ ! \x99\xca\x92\xa4\x12\xc4\x0c\x9b\xdbiA\x8d\x91\xa7\xa74\xc8\xe1Ck\xf1\xea\ ! \x0e\xa5\xec\xd3\xcc/\xea\x9cz\xda\x00\xa3\xe5\x80\xeaa\x07\xbb\xb9\x08\xc7\ ! \x8fp\xc2&S\x05\xf9h\x97#"\xb0]\x0e7\xdaY\xd8\xdb\xc5\xbbV\xf42b\xc1\xf6q\ ! \x93JE\xc7\x1f\x97(\x14\x0b\xa8\xd9,\xe3\xea,\xe8\x97f\xbc\t\x99\x16\xd4(9r\ ! \xe1\xa3T\xc7\\:\xd3=\x08\xdf\xa1\xb1\xff9,\xe7\x8f\x8c\x1e\xb9\x96\xa8\xcdC\ ! n?\x95\x9cv\x01m\xc3\x93tz\x15&\x19F\n\xd3h\xb5\x0ci\xcd$..$\xa9\xec\xa3=^\ ! \xc05g\rp\xfd\x9an\xc6,xq\xb8\xca\x1f\x06\x0f3Zn2V\x88\x10\xfds^_\xddO,T\xd0\ ! \xa612\xfc\n\xa90\x8b,\x81\x13\xa5\x11\x80\xe3\xf9h\xb3O#V\xe739\xb1\x81\x89\ ! \xfa\x01f-\xfd>]\xa5~^\xfa\xd3=\xd4\xcc\xd7\xc8\x14V\x91)\xff\x94\x94\xa8q\ ! \xa0\xa6R\xab\xd5\x18\x1a\xd6\x98c\xb9\xf4\x9d2\x873.\xe8\xe5\x13+\x17\xf0\ ! \xca\xb8\xcd\xab\xbb\xf7\xe0\xfb\x013\xdd0N\x0b*\xa4H\xb3v)^e#\xe1\\\x99L\n\ ! \x84\x80Pd\xb0\xec\x9f\xe1K\x97a\x1a\xef\xa5\xb3\xff:\xa4\xee~|\x17\xe6\x9c\ ! \xfa!\xf4\xfa\x06\xa2\xa4\x8d\xaa\xbc\x1aML\xd0\x933pC\xb0L\x93\x9a\xa6!+\n\ ! \x93\r\x9dl&CW\xe4rF)\x99q\xe5\x83i\xb6I\xf5\xc9:\x1d\xcb\xbe\xc2\x9c\xe5OR\ ! \x0f\x173\xe1B\xc5O1\xe1e\xa8\x86>G\xe4m\xe8\xb3\x8aH=g\x13\x86\xe0:\x02\x92\ ! v\xf2\xf9\xf3\xb0|\x99\x92\x1a\xd0\x17\x8f\x90\xd8&\x89\x10\x04A\x80m\xdb\ ! \x18\x86\x81\xaa\xaa\xe8\x86\x81\xed\x854L\x1bY\x9ey\x077\xad\x91]^\x9dJ\x02\ ! r\xcf"\x9c\xdc\nFl\xc1\x98\xab1\xe6\xab\x0c\xfb\x1a\x83\xaf\x9aH\xf2{\x89T\r\ ! \xdf\x01\xcf\xf6\xf0l\x8bX\x9d\x8f\x12\xf8\x8c\xd7d\x8c\x8aN\x1c+(\xf2\xd4\ ! \xe2\xeay\x1e\xd9l\x16\xc7q\x90e\x99$I\x10\xa2\xb5S\xb2iA\xbdM\xb18T\x8b\x99\ ! \x8c\xc1\xcc\xacdgPd\x87\xaf\xf1r\x90awE\xa1\xeb\xd4[\xe8Yr\t\x9e\r\x8e\x19\ ! \xe0Z\x06\xa6e`\x1bu$K\xc7r\x12\xf6\x98\xb39%\x97\x10\x07!\xae\xe7\xa1i\x1a\ ! \xb6=\xa5\x8ct\xb40$Ik\xe7\x14\xd3\x82\xba\xe3s\x1f\x96\x82\xd7F\xa9\x05\xe0\ ! \xb7\r\xd0\x94{\x99\xf4\n\x18A;QXD\xd2:\xb0\x0c\xb0\x9a.\xb6\xd1\xc4\xd4u\ ! \x1a\xbaN`6\xc1\xd2Q,\x9d\xf9L \x87.\xe5J\x15I\x92\x08\x82\x00q4\x15\xe38F\ ! \xd34\x84\x10\xc8\xb2<c\xc5\xa6\x9d\xb8\xef2\x07)\x8f@\x14dQ\xcd\x14r\x98Cv3\ ! \xe4\x9c\x1e,Gg\xf8\xd0\xaf\xb0\xea5\xf4F\x83Z\xb3\x8e\xab\xd7\x90\x8c\x06X:\ ! ic\x9c\xee\xa8\x8e\xe3\'\xeczu\x17/\xbe\xf8"\xe5r\x19\xcb\xb2H\x92\x04Y\x96\ ! \x89\xe3\x18UU\x8f\x81\xcd\xc4\xa4\x99\xdc$~\xe0+w\x88\x9dg|\x98\x86\xf1\x1c\ ! \x13\xf5\xa7\xc1\x0e\xe9\xeb\xfe\x1c\xa2P\xa0Y\xd9\x8b\x96]\x81e\xd4\t\xcd&\ ! \x18M\xa8\x1fA\x19\xd9\xcd99\x93\xf3\x97\x9d\xc6\x86\x1f<r\xacV\xaf^\xbdZ(\ ! \x8aB>_@\xd3\x14\xba\xbb{\xa8V\xab\x18\x86\xc1\xf2\xe5\xcb\xb9\xe7\x9e{\xa6]\ ! \xd7g\x04\x05p\xd5\x8d\xb7\x8a\xdfu\xad\xc1\x8a\xf6 I2J\xfb\x12\x02\xdf#t]b\ ! \xc7\x00\xdbD2uD\xbdB\xae\xbc\x87k\x96\xf7\xf0\xc4\xa6\xc7\xfem\x80\xeb\xd7\ ! \xaf\x17\xdb\xb7o\xa7\\.s\xe1\x85\x172\x93C\x97\x96\xa0\x00n\xbe\xed;b\xebn\ ! \x93A\xed\x14\x82L\x06\x91\x04\xe0yH\x8e\x01f\x03\xa9:\xc2\x92\xac\xc3\xf9\ ! \xa7\xcfc\xd3c\x1bO\xca\xdd\x14\xb4\x08\x05\xf0\xa3\x8d\x1b\xc5\xce\xdd{\xd9\ ! \xb6w\x14\xdf\xf7I\xe2\x18)\x89Hk*\x8bz\xbb\xd9\xf0\xf0C\'\r\xe6uk\x19\xea\ ! \x7f\xd1\xde\x92\x17\xd9\x7f\x07\xe0,\xdf|M\\\x8e}\x00\x00\x00\x00IEND\xaeB`\ ! \x82O\xea\xe8l' , ! ! 'ToolBar_AddTor': ! 'x\xda\x01\xea\x08\x15\xf7\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x005\ ! \x00\x00\x00(\x08\x06\x00\x00\x00^\xae\xb25\x00\x00\x00\x04sBIT\x08\x08\x08\ ! \x08|\x08d\x88\x00\x00\x08\xa1IDATx\x9c\xed\x99{\x8c\\U\x1d\xc7?\xe7\xdc;\ ! \xaf\xdd\x9d\xdd\x9d}\xefv\xfb\x86RK\xa9\x02%$`@I4\xb6%\xd2\x84bE\x1b\x0c\ ! \x8fH\xec\x1f\xf4\x0fc\x0cF\xd0\x18\r!F\x13y(\x12\x1f\x80<l\x0b&\x12i\x14!1\ ! \x80\x08V\xa4\xb5\x8a\xd0\xed\x96\xee\xb6\xdb\xeev_\xdd\xddy\xdd{\xcf\xf9\ ! \x1d\xff\xb8\xb3cclq\x1f\xb4\xd5\xf8\x9b\x9cLf\xce\xe4\xce\xf9\xcc\xf7\xf7\ ! \xfb\x9e\xdf=\xa3\x1a\x1b\x1b\xf9_\x0b}\xb6\x17\xf0~\xc4\xff\xa1\xfe[\xc2\ ! \x9f\xaf\x0b\xed\xfc\xd5s\xee\x9d\x13S\x1c"I\xe3\xe8 \x97/^\xc0\r\x1b\xafS\ ! \xf3u\xfd\x99\x84\x9a\xabQ\xfc\xe0\xa9\xed\xae\xb7\x14\x91l\xc8q\xe9\xb2e\ ! \x14\xc3\x90\x1d\xc7\'H\x8d\r\x91\xcbOrE[\x037\xdf\xb0\xe9\x8c\xc2\xcd\nj\ ! \xe7/\x9fuo\x0f\x8f1^\xdb\xc0\xe2\xae\x05\xacno\xa1)\xe9c\xa3\x88\xa2\xb1<;p\ ! \x9c\xe5\x8b:9:Y\xe4\xcfG\x86\xc8\x0c\x1efcs-[6\x7f\xea\x8c\xc0\xcd\x08\xea\ ! \xe1\'\x9et\xbd:C\xaa\xa6\x96U\x8b\x17q~\xb6\x86\x8c\xaf\x88\x9c#\x12\xb0\ ! \xd6\xe0;xep\x94\xb1d\x82l\xd2\xe7\x9d\xc1Q,\x1e=o\xee\xe3\xd6\x15m\xe4\x8bE\ ! &#\xc3\x9a\xcev\xae\xdd\xb0\xfe}\x81\x9c\x11\xd4\x97~\xfd\xb2[\xb7\xa8\x83\ ! \x96\x9a4Z)\xd0\n\xa7\x14\xce9\xac\x08\x88C\xace _\xe2\xe9w\x8f!"t\xa7\x92\ ! \xd4\'=\xde>Q`a]\x9a\xd5\xad\xcd\xec\x99*\xb1\xb7\xf7\x00\x9f\xcc8\xb6n\xf9\ ! \xcc\xbc\x83\xcd\xc8(\x82\x91!Tw\x07\x028\x05\x9e\xd6h\xc0)EB+\x0eN\x14xch\ ! \x8c\xa4\x82K\x9a\xb2\xe4RI\xea\x93\t\xea\x92>\xd7,\xe9\xc4S\x8a\x14\x8a|\ ! \x10P\xba`\x05/\x8d\x8cr\xc7\xc3\x8f\xbaO,lc\xfd\xbau\xf3\x067#K_\x1e\x16\ ! \xd83\x9e\'Qy\xad\x00\xdf\xd3\xf8\x9eG\xd2\xf7)\x1a\xc1\xb3\xc25\x1d-|da;k\ ! \xbbZX\xd1\x96\xa3\xb3\xa1\x8et*\x85(M\x19\xc8\xa6\x92\xd4)a\xe3\xc5+\xc9_\ ! \xb0\x9a\x07\x0e\x0e\xf1\x93\'\x9frg\x05\xea\xfc\x8eVzz{(\xa3\xd1J\xa1\x94Bk\ ! M\xc2\xf7pJ\xd1^\x9bF)\x85\xf24\xce\xf3\x10\xadqJ\x81R\xf8\x9e\xa6&\xe1\x93\ ! \xf44\x0bk\xd3\x04\xe5\x88=\xfdC4\x14\x0b,]y!;\x0e\x0c\xce\x17\xd3\xcc\xa0\ ! \xd6\xaf_\xaf\xea\xc3\x02=\x13\x05|\x05\xce\xc5?n\xbcnEc*\x81hE!2xZ\xa1\x14x\ ! Z\x91\xf4}F\xca!\xaf\x0e\x8d\xf1\xda\xf08\xfb&\xf2d\x15\x90/\xd1\xeei\xce\ ! \xd7B!\xd7\xce\xb6\xfb~\xe8\x1e|\xe4\xb19+6\xe3\x8e\xe2CM\xf5\xec\xed\xebG\ ! \x04\x1c\xb1A\x88s\x88sd|\x8fL\xc2g"\x08\xf1\x94B)\x8d\xe7yd\x92>\x87\xa6\ ! \x8a\x8c\xe6\x0b\xe4<M\xbd\xef\xb1*\x97\xe5\xd2\x8e&\x16\xe7\xeai\xab\xcdp\ ! \xeb\xdaU\\y\xd5\xd5\xbc\xde\xba\x94\xaf\xfel\xc7\x9c\xc0f\x0c\xf5\xe9M\xd7\ ! \xab\xa9#\x878\x1e9\xb4\x03k\x05c\x04+\x82V\x8a\xfaT\x92\xb1r\x88&\xae9\xad\ ! \x14Z)|\xad\xe8\xae\xc9pQk\x8e5\xed9V\xb75sa[\x13\x17\xb57\xb1\xaa\xb5\x91\ ! \xd5-\r,Lh\x16\xa4|\xf67wq\xf7\xe3\xb3\x07\x9bU\xef\xb7\xbc&\xc5\x9ec\xc3(\ ! \x89\x952\xd6bl\x0c\xd6\x94Np"\x8c\x90\x93\x14\xac$)\xe2\xc0*\x85(\x8dh\x15\ ! \x0f\xa5\x10\xe2\x11\x01\xbe\xd6l8\xaf\x8bCm\xdd|\xed\x89\xd9\x81\xcd\n\xea\ ! \x82\xf6\x16\x0e\x1c\xe8\xa1( \xe2\x10+\x88\x08\x91\x15r\xa9\x04E#\x04\xc6\ ! \x02\xf1\x9c\x15\x89\xebOU\x94\xd3\x1a\xdf\xd3\xf1\x96\xa05Z\xc7\xa6\xe3)M`-\ ! \x07\xc7\'hK%xQ\xd7\xf3\xad\xc7\xb7\xcf\x18lVP\xeb\xd7\xadS\xf5\xf91z\xf3%TE\ ! )k\x85\xd0\x18j=\x0f\xeb`*\x08\xc1\x81\x11\xc1\x18\x8b\x88\x00\xb1\xa1\xa8\ ! \xca\x1e\xe7{\xd3.ZY\x8c\xa7X\xdb\x98\xa5\xa1\x10\xd0\x1d\x196\xb46\xf0\xc2`\ ! ~\xc6\xeb\x9b\xf5\xad\xc7\x9a\x8eV\xde\xec?\x82H\xac\x84\x15\xc1\x88#\xa9\ ! \x14)O1^\nq"\xd5yq\x0e\xc5Iu6\xad\x92\x02E\x0cf\x9dcAM\x9a\xcb\x9a\x1b\xb8\ ! \xb8\xa9\x8eU\xd9\x0c\x91\x913\x07u\xe3\xa6\xeb\xd5d\xdfAF\x0c \x0ec,\xd6Z\ ! \x10\xa1&\xe13V\x0e\xb0\xe2\x88l\xfc\xbe\x880\x9dG\xce\xc5\xce\x19?\xa8>+ \ ! \x14\xa1|\xd2\x98M\x9b1\xa7\x9b\xc4\xa5\xbe\xe3\xaf\xc7\xc7P\xce\xc5Fa\xe3\ ! \xba\xaaO&\x18\x0f"\xac\x89\xd3\xd2X\x87\x15W\x01\x8a\xcd\xc3V>/\xe2bH\x078U\ ! \xc5Tq\t\xce*\xe6\x04\xb5\xaa\xbb\x8b\x03\x87\xfb)\x8b\xab\xa6Y$B\xd6\xf7\ ! \xc8\x1bC\x10EUw\x9c\xae)q\x0e\'\xff\x84r.NQ\xe7*z\xc52\xc6h.\xee1\xcf(\xd4\ ! \xfau\xebT\xfd\xc4\x08}\xa5\x08%\x15\xa5\x8cP\xab\xc1\x88\xa3\x10F8\xebNR\ ! \xa4\xa2\xd2\xbf\xd4\xa1\xb8x.\x9e\x07\x99V\x0e`\x16\xa6>\xe73\x8a\x0b\x9b\ ! \xb2\xec;r\x14\xd0\x18c1\xc6\x90D\xe1+\xc5x9D\xac\xc5V\xdc\xcfU\xd2\xceT\x1d\ ! \xd3V\x81\xe3y\xa9\x82;\\\xb5\r;\xe3P[6oVS\xc7\x0e3!\xc4\x86!\x16\x9c\x90\ ! \xd1\x8a\x13a\x84\x13\xc1\x9cT;\xb6\x92z\xc6\xba\xb8\xd6\xa6k\xcb\xb9\xaa\ ! \x9a\xce9\x82r\xc0\xe8\xf0\x18\xa90\xe2\xe9g~1#\xbay9xY\x96P\xec\x1f?\xc1\ ! \x07\xeb2D\xce\xa1\x94\xd0\x96J2\x1c\x9ax\xd1\xcaaDpN\xc7\x9b\xf1I\xcd\xb0\ ! \xab\xd6\xa3E\xc41xt\x90\xbd\xef\x1e\xe5\xa0\xd5\x1c\xca\x17(;xp\xff\x18\xb7\ ! \xdd\xfb\x90[\xd3\x98\xe4\x8e\xdboy\xcf*\x9b\x97#\xb2/\xde|\x93\xea\xed?\x84\ ! \xf6}R\n\x86#\xe1O\xe3\x05z\'\xf2\x04\xc6\xc4V\xef\xa4\xe2z6N\xc9\xe9!\xf1pV\ ! \xe8\xef\xebg\xfb\xdf\xfby\xf4D\x9e\x97\xac\xa5/\x93\xa6\xcf\xf3\xd9-\x8e\ ! \xc7\xf3\x86\x87\x8e\x05|\xf3\xc1\x9f\xbe\xa7j\xf3v\xee\x97\xcdO\xf0\x87\xc0\ ! \xf1X\xef w\xfd\xe6u^\xfe\xed\x8bL\x0c\r\x81\xf6P\xd3\x8e6m\x12\x95Z\x9a\x1e\ ! \xc6\n\x87\x8f\x0c\xb0\xfd\xed\x01\xdeH\xf8\xb4,]LKg+\xe7y\x86\xbbW\xb6\xd3d\ ! J\xa4jk\xe8\xb1\xc2\xfd\x87\xc7\xf9\xeeC?>-\xd8\xbcA\xad\xedj\xe5\xad\xe7w1\ ! \xf0\xf2\xef\xb8\xa5>d\xef\xfd\xdfP\x0b\xa4\x88\xf5\x12\xa4*\xdf2\xed|\x91uD\ ! \xc6\x12\x19Kh,\x91\x15v\xef\xef\xe3M%\xb4uw\xd2\xb5\xa4\x83\xf6\xa5\x9d\xac\ ! \xedn\xe5\xf6+.\xa3\xc5s8\xa5H\'\x13\x8c8\xcd\xae\xe1\x88\x9fo?u\xb3;o\x87\ ! \x99\x9b6n\xac\xe6\xfa\x0b\x95\xe7z\r/\x8cL26<J\xcf\xf8$\x9bWt\xc7\x1d\xbd\ ! \x8b[%E\xec\xd8\xf9\x89I\xfe\x16)\xbcl\x16\x92>^\xb6\x06/\x93\xc2\x1e\x1b`\ ! \xaa\x1cP0\x96\xc0\x031\x16\xe7\xf9\xbc6>\xc9\x95\xfd\xe5S\xaee\xde\xa0\xfe]\ ! \\\xb2\xa8\x8bg\xff\xf8\n\x93\x83C,ni!\xbdfyL!\x12\x9fB\x11;b~\xaa\xc4\x90\ ! \xb5\x980b\xd9\xc4\x18K\x06!\x04V\xd6\xd5\xe2\xa7\x93\\\xde\xd1\xc2\x12\xe7\ ! \xa1\xad\xc7\xbbc\x93\xf4\x84\t\x86\x8b\xc1\xd9\x81\xbav\xc3\x86\xaaz\xdfy\ ! \xf8G.\x9dN\x93p\x96jg[\xd1J\xa3\x08\xac`\n\x05\xbe\xb0v9\x97-Y\x84\x11\xc1K\ ! \xa5\xc0\xf7\xb9w\xe3\xc7p\xc6\xe0{\x9a]\xfb\xde\xe1\xa6\xe7v\x13\x9d\xa6\ ! \xcf}_\xa1N\x8e\xc0X\x0e\x16C\xf2Q\t\x8b\xaa\xf6u\x0e\x98\x8c\x02\x1a\x94\ ! \xc7\xa08\xbe\xfe\xfa[4\xff\xa5\x97|\x18\xf1\xe1\x8e\x1c\xdb\xae\xbe\x9cm;wq\ ! \xb0dI\x01\xc7\xa6J$q4$N\xbd\xf43\x06\xf5\x95\xad\xb7\xab\x8f\xdfy\x8f\xeb\ ! \x934)\xe5\xe2\xc3P\xa8n\xb6\x89($\xaa\xabg\xaf$q\xf9"\xf90\xa45\xe1\x81X\ ! \xf6\r\x8d\xb3\'H\xa0\x8d!\x0c">\x90Q,k\xcb\x9d}(\x80\xe7\xef\xb9\xf3\x94\ ! \x1b\xe7\xbd\xdf\xfb\xbe{`(\xe2\x98\x11\x92\x9e\x07\xe5\x80\xba\x84\x87\x9fN\ ! \xe39\x87\nC\x10!%!\xd7u\xb4\xb1\xf5\xf3\xb7\x9e\xf2Z\xe7\xcc\xffS_\xde\xb6U\ ! }\xae9A\xceFL\xe4\x0bD\xa1e\xcf\xe1!\x9eyu7\x03\x93%J\xe5\x10\x822\x9b\xbar|\ ! ty\xfbi\xaf5\xe7\xbfr\xe6;\xee\xfa\xf6}\xee\xf7\xa5\x04{\xa6J\x1c\x1d\x19\ ! \xc6F\x01\xb5\xb5YV\xb6\xb4qU:\xe2\xaae\xedl\xf9\xec\x8d\xa7m\x95\xce9(\x80\ ! \xed;v\xba\xbe\xd1\x02\x03\xc5\x80R\x10\xb2\xb0\xb9\x89\xce\xa4\xe5\xb6\x9bo\ ! \xfa\x8f\xee\xae\xceI\xa8\xb9\xc69SS\xf3\x19\xff\x00[\x1b\xf2\x1e\x1d\xb3\ ! \xbaw\x00\x00\x00\x00IEND\xaeB`\x82\\\x11jO' , ! ! 'Menu_Cancel': ! 'x\xda\x01l\x01\x93\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x0e\ ! \x00\x00\x00\x10\x08\x06\x00\x00\x00&\x94N:\x00\x00\x00\x04sBIT\x08\x08\x08\ ! \x08|\x08d\x88\x00\x00\x01#IDATx\x9c\x9d\x921N\xc3@\x10E\x9f\xa3\x14\x90"\ ! \xda&V\x04mn\xe03\x84>\x97\xb0\x8f\xc0\x19r\x04\xbb\x87\x0b@\x9b\x02z\x97)\ ! \xa0\x80"-Hn\xa0\xca\xccP\xac\xd7\xd9%i\x92\x91\xac\xb5\xd6\xf3<\xf3\xffL\ ! \xe6\x9c\xa3\xeb\xd6\xc6\x19\xe1\xdc}6\xee\xba\xb5\xed\xf7%f\xa0\xcap\xaa\ ! \x82\x08\xa8\xf5\xa7\xf4\xf7\x027\xb7\xd8\x18|\xb2\x99O\xb2\xfe\xa3F?\x88!Q_\ ! u\x04\x87\xcb\xeb\xab\x86\xc9\xa4\xe1\xe1\xb1=T\x11\xc8\xf3\x86\xf9\xbc\xe1\ ! \xe9\xb9E\xc5\x83\xbe\xa2\xfa\n!\xaa\xaa\x05`\xb5*\xc8\xf3&\xd1\x17*fP\xdb\ ! \xcfo\xe9a\x85\xe94M\x0cQ\xd7\x05\xcbe\x81*,\x16\x8do\xd5\xfa\xdeE\xe0\xfb\ ! \xab<\r\xdd\x15H\xa4q<h\x8c\x9eS\x11\x0c\xb2\xd8\x1c\x89\xa0Y~\xdcjU\xb5l6\ ! \xad\x1f\xcd\x7fWEa6;@u]\xf0\xf1Y&\xf0\xebK\x8bY\x0c\xf6\xb6\x1f\x19!\xf0\ ! \xf6\x9ej\xd6Xchu\xb7+\x93A\x87\xf7\xed\xd6\xbb.J:\xc7a34]\xaf\x00\x07(l\x17\ ! @v\xe9\x92g\xce\xb9s\x98!F\x17Q\xc0\x1f,\x80\xdc"X;\xbd\x9a\x00\x00\x00\x00I\ ! END\xaeB`\x82\x82\xf0\x9f+' , ! ! 'Menu_Resume': ! 'x\xda\x01N\x01\xb1\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x0e\ ! \x00\x00\x00\x10\x08\x06\x00\x00\x00&\x94N:\x00\x00\x00\x04sBIT\x08\x08\x08\ ! \x08|\x08d\x88\x00\x00\x01\x05IDATx\x9c\x9d\x92\xbd\x91\xc2@\x0c\x85?{\x1c\ ! \x11-\t\x81]\x86\x1b8\xeezq\x0bW\x03%\xe0J|EP\x04\x19\t\x83\xc9\x91t\xc1\xca\ ! \xbb\x0b\xe3\x046\x91g\xa5\xf7\xb3\xcf\xaaB\x08\xcc\xf3\xc1x\xe3\x84\xf0[5\ ! \xf3|\xb0\xc7c\xc0\x0cTIU\x15D@\xcd\xab\xf8\xbd@\xdba\r\xc4a\xb38d\xde\xd4\ ! \x82\xa0\x04\x89F\xd5\x06\\\xc9\xd56\x9b\x11\x80\xdbmx\x06X\xfe\x06\xa8\xc1U\ ! ,\xb2\xdd\xef\x03\x00\xdb\xed\x88h\xbc+U\x17\xc5\x1a2\xdbBp\xbdF\xf0n7\xa6a\ ! \x15\x7fk\t4\xf7.\x02\xfa\x88\xcd\xcb%\x82\xdbvLVE^\x14\x9f\x02p\x02\x91\x1c\ ! \xff\xf4wJ}\x93"\x9c\xf4\x0e\xcd\xca]\x17C:\x1e{\x12\xb9e\xab)\xd5du\x05\xf4\ ! \xb5\xef\xd3?5+\x81\x85\xcd5PZ\x0cy\x01\x96\x91\x9f\xcf\x03\xd3t\x02`\xbf(-\ ! \x89{]U\x14\x81\x9f\xef>\xaf\x9c\x0f\x8b\xe6\xed\x02\xa8>]\xf2*\x84\xf0\x0e&\ ! \x9d\xfa#\x14\xf0\x0f|\x9f\x04\x10z\xb7\x94;\x00\x00\x00\x00IEND\xaeB`\x82\t\ ! 1\x84\x82' , 'ToolBar_Log': *************** *** 285,310 **** \xe5\xa9i\xf7FA\xc7\x00\x00\x00\x00IEND\xaeB`\x82\t\x9b%v' , ! 'ToolBar_AddTor': ! 'x\xda\x01\x1b\x02\xe4\xfd\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x005\ ! \x00\x00\x00(\x08\x06\x00\x00\x00^\xae\xb25\x00\x00\x00\x04sBIT\x08\x08\x08\ ! \x08|\x08d\x88\x00\x00\x01\xd2IDATx\x9c\xed\x98\xbf/\x03a\x1c\x87\x9f\xaa\ ! \xc5V"5\xd4\xa2\x832\x11ISK\x07\x9bA0\x92 41\xf8\x0b$\x06\x06\x89\xa4\x7f\ ! \x81\xad\x8c\x9d\x1b\t\x89AB"T\x0cRI\x11a(EI+H,\xa4\x86\xf3\xa6\xb9kqw\xee"w\ ! \xdegy\x93\xef\xfdx\xef\xbd\'\xdf7\x9f;\x8f\xcf\xe7\xc3m\xd4\xfd\xf5\x03\xd8\ ! \x81\\\x94S\x90\x8br\n\xf5vO0\xd2\xf5X6s]\xf2\xc8\xe71;\xa74e\x04ahr`PU/\x17\ ! _\x00\xc8?\xa7U\xf5\xcd\xcc\x8bes\xbb\xd2\x94\xc7\xeaDa\xb6\x87:\x9b:\x00\ ! \xc8\x16O\x00\xd9SU\xd8\xd6SK\xf1\x04\x00o\xa7\x07\xdf\x9e7\x9fX\xb6|ni\xca\ ! \x08?\x19\xb2\x13i\xca\x0c\x17\x85k\xbb\xa7\xa8B\x9a2\xc2_\x18\x12\xb8\xd2\ ! \x94\xeeD\xb1>\xd3S3)\xa4O\xf2\x00\x1c\xe7n\x00\xe8\xef}7\xf4\x00\xda\xcc\'\ ! \x92\x85`a\xeb\xd6p\xb2p\xa5)\xdd=\x15\x1a\x1a\x03\xa012\x05@i\x7f\x05\x80\ ! \xf3\xeeF\x00\xfaw\xc6\x01\x88\x86\x95\xb1>\x14V\xceokP\xdf\xc8?\xa2\x8c\x85\ ! \xa42.N\xab\x0eG\xc3}\xaa\xeb\xb3\xc5X\x19\x8ceAW\x9a\xb2\xac\xa7Z\x03W@\xc5\ ! \x94@\xec\x82\xfb\xbbg\xaa\xbaH\xe3\xe2{+21\n@\xe9\xf2\x15\x80\xb9\xd9\x18`.\ ! \xad\xbb\xd2\x94\xee\x9e\x12F\x04\x87O\xca\x9b\xde\xcd\x85\x00\x88\x07\x94\ ! \xba0\x13\xf4+\x85\xf6\xe80\x00\x91\tMoi\xb8\xdf\xd8\x06*\xa9]~Oi\xd0mJ\x98\ ! \xf9\x8a\x8d=/\x00\xdeL\n\xa8\xf4J\xf0\xf3x\te7\x13\xe9]\x18]]K\xa9\xee\xf3\ ! \x1bC\x02W\x9a\xd2\xbd\xfb5\xfb[j\xee~\x0f\x85\xbb\x9aoV\xef\xbf\n+\xcch\xf9\ ! \xdf\xa6\x9c\x84+M\xc9E9\x05\xb9(\xa7 \x17\xe5\x14>\x00H\x8b\x84\x9eP#Xj\x00\ ! \x00\x00\x00IEND\xaeB`\x82\xe0\xd1\xe7`' , 'AboutIcon': --- 558,575 ---- \xe5\xa9i\xf7FA\xc7\x00\x00\x00\x00IEND\xaeB`\x82\t\x9b%v' , ! 'Menu_Pause': ! 'x\xda\x01@\x01\xbf\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x0e\ ! \x00\x00\x00\x10\x08\x06\x00\x00\x00&\x94N:\x00\x00\x00\x04sBIT\x08\x08\x08\ ! \x08|\x08d\x88\x00\x00\x00\xf7IDATx\x9c\x9d\x921n\xc30\x0cE\x9f\x03OA\x0b\ ! \x08\x08\x90\xa1=F\xb6vk\xef\xe2+\xf4\x0c\xb9\x82\x8f\x90\xb5\x1d2g\xf7\x9c9\ ! 7\xf0\x01B\xb2\x83d\x89V<$\xe1"\x88\xe2\xe3\xff\xb4\xd9\x84\x10\x18\xc7\xbd\ ! \xf1@\x84\xf0\xd3\xb4\xe3\xb8\xb7\xeb\xb5\xc3\x0cT\xc9\xa7*\x88\x80Z:%\xe5\ ! \x05\xde\xde\xb1\x16b\xb1Y,\xb2\xf4\xa8\xae\x81\x87D\xa3\xea\nJ\xd2\x14\xd6\ ! \xeb\x9e\x97\xd7>\xabl6=\xdbm\x8fh\x84T\x1ch\x9a,i\x99\xe3p\x18f\xf7\xbf\xdf\ ! !\xdaO\xb9\x16@\x92Es\x85\x93\x13\x1f"%\x17g\x94\x08O6r\xe1\x12h\x0e\xcc\x1f\ ! \xa1V\xac\x1a\xa9s\xd5N\x9d\x97@\xa9A\xab\xacNC/\x15\xde(\xce\xac\xca\x9dV\ ! \xa5\x02\xc5\xfd\xe8\xcb\xa5\xe3x\x1c\xb2\xc2\xf9\xdcq:\x95\xfblF\xaf(\x02\ ! \xdf_\xbb\xb2r\n\x9f\x1f;D\xcbv\x014\xcf.y\x13Bx\x84\xc9\xb1z\x8a\x02\xfe\ ! \x01P\x89\xd1\xaf\xc7\x17\xe8\x9d\x00\x00\x00\x00IEND\xaeB`\x82/\x83\x86c' , 'AboutIcon': |
From: <sir...@us...> - 2003-03-02 16:36:31
|
Update of /cvsroot/btplusplus/BT++/src/DlgMain In directory sc8-pr-cvs1:/tmp/cvs-serv16972/src/DlgMain Modified Files: ToolBar.py DlgMain.py Log Message: - Added a set of new images for the toolbar(not yet all) - Reimplemented grid right click menu(no move yet). - Added a few images to the grid right click menu. - Changes to reflect the move of Loader + Manager. Index: ToolBar.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/DlgMain/ToolBar.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** ToolBar.py 22 Feb 2003 13:37:16 -0000 1.2 --- ToolBar.py 2 Mar 2003 16:36:28 -0000 1.3 *************** *** 15,19 **** def __init__(self, parent): ! wxToolBar.__init__(self, parent, -1, style = wxTB_FLAT | wxTB_TEXT) self.Parent = parent --- 15,19 ---- def __init__(self, parent): ! wxToolBar.__init__(self, parent, -1, style = wxTB_FLAT | wxTB_TEXT | wxTB_NODIVIDER) self.Parent = parent *************** *** 26,30 **** self.AddSeparator() ! self.AddLabelTool( 5, 'Help', GetBitmap('ToolBar_About'), shortHelp = "Click me and then click other objects to find out what they do." ) self.AddLabelTool( 6, 'Add Torrent', GetBitmap('ToolBar_AddTor'), shortHelp = "Opens a window, that lets you add torrents." ) self.AddLabelTool( 7, 'Preferences', GetBitmap('ToolBar_Preferences'), shortHelp = "Click here to edit your BT++ preferences." ) --- 26,30 ---- self.AddSeparator() ! self.AddLabelTool( 5, 'Help', GetBitmap('ToolBar_Help'), shortHelp = "Click me and then click other objects to find out what they do." ) self.AddLabelTool( 6, 'Add Torrent', GetBitmap('ToolBar_AddTor'), shortHelp = "Opens a window, that lets you add torrents." ) self.AddLabelTool( 7, 'Preferences', GetBitmap('ToolBar_Preferences'), shortHelp = "Click here to edit your BT++ preferences." ) *************** *** 78,79 **** --- 78,81 ---- elif i == 2: p.SwitchTab('Log') + elif i == 3: + p.SwitchTab('History') Index: DlgMain.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/DlgMain/DlgMain.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** DlgMain.py 22 Feb 2003 18:02:12 -0000 1.4 --- DlgMain.py 2 Mar 2003 16:36:28 -0000 1.5 *************** *** 7,12 **** from MaxSizer import MaxSizer ! from TabTrans.TabTrans import TabTrans ! from TabLog.TabLog import TabLog if wxPlatform == '__WXMSW__': --- 7,13 ---- from MaxSizer import MaxSizer ! from TabTrans.TabTrans import TabTrans ! from TabLog.TabLog import TabLog ! from TabHistory.TabHistory import TabHistory if wxPlatform == '__WXMSW__': *************** *** 83,87 **** self.Tabs = { 'Transfer': TabTrans( self ), ! 'Log': TabLog( self ) } --- 84,89 ---- self.Tabs = { 'Transfer': TabTrans( self ), ! 'Log': TabLog( self ), ! 'History': TabHistory( self ) } |
From: <sir...@us...> - 2003-03-02 16:36:31
|
Update of /cvsroot/btplusplus/BT++/src/TabTrans In directory sc8-pr-cvs1:/tmp/cvs-serv16972/src/TabTrans Modified Files: TabTrans.py GridTable.py Grid.py Log Message: - Added a set of new images for the toolbar(not yet all) - Reimplemented grid right click menu(no move yet). - Added a few images to the grid right click menu. - Changes to reflect the move of Loader + Manager. Index: TabTrans.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/TabTrans/TabTrans.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** TabTrans.py 22 Feb 2003 13:37:16 -0000 1.2 --- TabTrans.py 2 Mar 2003 16:36:28 -0000 1.3 *************** *** 1,5 **** from wxPython.wx import * from Grid import Grid - from MaxSizer import MaxSizer ########################################################################################################### --- 1,4 ---- Index: GridTable.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/TabTrans/GridTable.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** GridTable.py 28 Feb 2003 21:31:52 -0000 1.4 --- GridTable.py 2 Mar 2003 16:36:28 -0000 1.5 *************** *** 1,7 **** ! from wxPython.wx import * ! from wxPython.grid import * ! from LoaderManager import LoaderManager from TabLog.LogWindow import Log import Renderer --- 1,7 ---- ! from wxPython.wx import * ! from wxPython.grid import * from TabLog.LogWindow import Log + from LoaderManager import LoaderManager import Renderer Index: Grid.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/TabTrans/Grid.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** Grid.py 28 Feb 2003 21:31:52 -0000 1.8 --- Grid.py 2 Mar 2003 16:36:28 -0000 1.9 *************** *** 48,51 **** --- 48,55 ---- self.itemDown = wxMenuItem( self.Menu, 5, 'Move Down' ) + self.itemCancel.SetBitmap( GetBitmap('Menu_Cancel') ) + self.itemResume.SetBitmap( GetBitmap('Menu_Resume') ) + self.itemPause .SetBitmaps( GetBitmap('Menu_Pause') ) + self.Menu.AppendItem( self.itemCancel ) self.Menu.AppendSeparator() |
From: <sir...@us...> - 2003-03-02 16:36:30
|
Update of /cvsroot/btplusplus/BT++/src/WebServer In directory sc8-pr-cvs1:/tmp/cvs-serv16972/src/WebServer Modified Files: BTWebServer.py Log Message: - Added a set of new images for the toolbar(not yet all) - Reimplemented grid right click menu(no move yet). - Added a few images to the grid right click menu. - Changes to reflect the move of Loader + Manager. Index: BTWebServer.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/WebServer/BTWebServer.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** BTWebServer.py 2 Mar 2003 02:52:39 -0000 1.4 --- BTWebServer.py 2 Mar 2003 16:36:27 -0000 1.5 *************** *** 4,8 **** from threading import Event from os import listdir, path, chdir, mkdir, remove ! from TabTrans.LoaderManager import LoaderManager from urlparse import urlparse from urllib import unquote --- 4,8 ---- from threading import Event from os import listdir, path, chdir, mkdir, remove ! from LoaderManager import LoaderManager from urlparse import urlparse from urllib import unquote *************** *** 10,14 **** from time import sleep, localtime, strftime from BTConstants import * ! from htmltmpl import TemplateManager, TemplateProcessor import socket --- 10,14 ---- from time import sleep, localtime, strftime from BTConstants import * ! from htmltmpl import TemplateManager, TemplateProcessor import socket |
Update of /cvsroot/btplusplus/BT++/src/Images In directory sc8-pr-cvs1:/tmp/cvs-serv16972/src/Images Added Files: ToolBar_Transfer.png ToolBar_Preferences.png ToolBar_History.png ToolBar_Help.png ToolBar_AddTor.png Menu_Resume.png Menu_Pause.png Menu_Cancel.png Log Message: - Added a set of new images for the toolbar(not yet all) - Reimplemented grid right click menu(no move yet). - Added a few images to the grid right click menu. - Changes to reflect the move of Loader + Manager. --- NEW FILE: ToolBar_Transfer.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: ToolBar_Preferences.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: ToolBar_History.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: ToolBar_Help.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: ToolBar_AddTor.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: Menu_Resume.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: Menu_Pause.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: Menu_Cancel.png --- (This appears to be a binary file; contents omitted.) |
Update of /cvsroot/btplusplus/BT++/src/Images/PSD In directory sc8-pr-cvs1:/tmp/cvs-serv16972/src/Images/PSD Added Files: ToolBar_Transfer.psd ToolBar_Preferences.psd ToolBar_History.psd ToolBar_Help.psd ToolBar_AddTor.psd Menu_Icons.psd Log Message: - Added a set of new images for the toolbar(not yet all) - Reimplemented grid right click menu(no move yet). - Added a few images to the grid right click menu. - Changes to reflect the move of Loader + Manager. --- NEW FILE: ToolBar_Transfer.psd --- (This appears to be a binary file; contents omitted.) --- NEW FILE: ToolBar_Preferences.psd --- (This appears to be a binary file; contents omitted.) --- NEW FILE: ToolBar_History.psd --- (This appears to be a binary file; contents omitted.) --- NEW FILE: ToolBar_Help.psd --- (This appears to be a binary file; contents omitted.) --- NEW FILE: ToolBar_AddTor.psd --- (This appears to be a binary file; contents omitted.) --- NEW FILE: Menu_Icons.psd --- (This appears to be a binary file; contents omitted.) |
From: <sir...@us...> - 2003-03-02 16:33:27
|
Update of /cvsroot/btplusplus/BT++/src/Images/PSD In directory sc8-pr-cvs1:/tmp/cvs-serv16128/src/Images/PSD Log Message: Directory /cvsroot/btplusplus/BT++/src/Images/PSD added to the repository |
From: <sir...@us...> - 2003-03-02 16:32:19
|
Update of /cvsroot/btplusplus/BT++/src/TabTrans In directory sc8-pr-cvs1:/tmp/cvs-serv15671/src/TabTrans Removed Files: LoaderManager.py Loader.py Log Message: Moved the Loader + Manager, they are not specific to TabTrans. --- LoaderManager.py DELETED --- --- Loader.py DELETED --- |
From: <sir...@us...> - 2003-03-02 16:32:19
|
Update of /cvsroot/btplusplus/BT++/src In directory sc8-pr-cvs1:/tmp/cvs-serv15671/src Added Files: LoaderManager.py Loader.py Log Message: Moved the Loader + Manager, they are not specific to TabTrans. --- NEW FILE: LoaderManager.py --- from os import listdir, path from ConfigFile import ConfigFile, Config from Loader import Loader from core.CurrentRateMeasure import GlobalMeasure from BTConstants import * class LoaderManager: Loaders = [] def __init__(self, refresh = None, log = None): self.Log = log self.Refresh = refresh self.UpMeasure = GlobalMeasure( 20.0, # MAX RATE PERIOD, 5.0 ) # UPLOAD RATE FUDGE def CreateNewLoader(self, torrent): try: loader = Loader(torrent, self.UpMeasure, self.Refresh, self.Log) self.Loaders.append( loader ) try: self.Log( 'Added torrent "' + torrent + '"...', loglevel = LOG_INFO ) except: pass except: try: self.Log( 'Error adding torrent "' + torrent + '"...', loglevel = LOG_ERROR ) except: pass ########################################################################################################### ########################################################################################################### def GetNumLoading(self): cnt = 0 for loader in self.Loaders: if loader.IsRunning(): cnt = cnt + 1 return cnt def GetNumHashing(self): cnt = 0 for loader in self.Loaders: if loader.IsHashing(): cnt = cnt + 1 return cnt def GetUpSpeed(self): speed = 0 for loader in self.Loaders: speed += loader.Info['SpeedUp'] return speed def GetDownSpeed(self): speed = 0 for loader in self.Loaders: speed += loader.Info['SpeedDown'] return speed def GetNumLoaders(self): return len(self.Loaders) def GetNumConnections(self): con = 0 for loader in self.Loaders: con = con + loader.GetNumConnections() return con def GetDownloader(self, num): return self.Loaders[num] ########################################################################################################### ########################################################################################################### def Move(self, frm, to): if to < 0 or to > len(self.Loaders) - 1: return self.Loaders[to:to] = [self.Loaders[frm]] if frm > to: del self.Loaders[frm+1] else: del self.Loaders[frm] FilesConf = ConfigFile() FilesConf.Read('files.ini') FilesConf.DelSection('ActiveOrder') for num in range(len(self.Loaders)): FilesConf.Set('ActiveOrder', '%03d' % num, self.Loaders[num].Config['Tor']) FilesConf.Save() ########################################################################################################### ########################################################################################################### def GetInfo(self, num, name): try: return self.Loaders[num].Info[name] except: pass ########################################################################################################### ########################################################################################################### def Update(self): self.UpdateList() self.UpdateDownloads() self.UpdateHashing() ########################################################################################################### ########################################################################################################### def UpdateList(self): # UPDATE TORRENT LIST tors = listdir( Config.Get('Paths', 'Torrent') ) if len(tors) == 0: return FilesConf = ConfigFile() FilesConf.Read('files.ini') order = FilesConf.GetOptions('ActiveOrder') order.sort() new = [] for key in order: value = FilesConf.Get('ActiveOrder',key) con = false if value == '' or not path.exists( path.join(Config.Get('Paths', 'Torrent'), value) ): FilesConf.DelOption('ActiveOrder', key) for l in self.Loaders: if l.Config['Tor'] == value: l.PauseDownload() self.Loaders.remove(l) con = true for loader in self.Loaders: if loader.Config['Tor'] == value: con = true if con == true: continue new.append(key) for tor in tors: con = false for loader in self.Loaders: if loader.Config['Tor'] == tor: con = true for key in new: value = FilesConf.Get('ActiveOrder',key) if value == tor: con = true if con == true: continue if order == []: nid = 0 else: nid = int(order[len(order)-1]) + 1 FilesConf.Set('ActiveOrder', '%03d' % nid, tor) order.append('%03d' % nid) for num in new: tor = FilesConf.Get('ActiveOrder',num) self.CreateNewLoader(tor) FilesConf.Save() ########################################################################################################### ########################################################################################################### def UpdateDownloads(self): # START NEW DOWNLOADS dwcnt = self.GetNumLoading() dwsta = Config.Get('Download', 'AutoStart') dwmax = Config.Get('Download', 'MaxSimDown') if dwsta == 1 and dwcnt < dwmax: dwcnt = dwmax - dwcnt for loader in self.Loaders: if dwcnt <= 0: break if not loader.IsRunning() and not loader.IsFinished(): dwcnt = dwcnt - 1 loader.StartDownload() # PAUSE DOWNLOADS dwcnt = self.GetNumLoading() dwpau = Config.Get('Download', 'AutoPause') if dwpau == 1 and dwcnt > dwmax: dwcnt = dwcnt - dwmax tmp = self.self.Loaders tmp.reverse() for loader in tmp: if dwcnt <= 0: break if loader.IsRunning(): dwcnt = dwcnt - 1 loader.PauseDownload() ########################################################################################################### ########################################################################################################### def UpdateHashing(self): # START HASHING hscnt = self.GetNumHashing() hssta = Config.Get('Hash', 'Background') hsmax = Config.Get('Hash', 'NumSimHash') if hssta == 1 and hscnt < hsmax: hscnt = hsmax - hscnt for loader in self.Loaders: if hscnt <= 0: break if not loader.IsHashing() and not loader.HasHashed(): hscnt = hscnt - 1 loader.StartHashing() ########################################################################################################### ########################################################################################################### def Destroy(self): for loader in self.Loaders: loader.Destroy() --- NEW FILE: Loader.py --- from ConfigFile import Config, ConfigFile from BTConstants import * from os import remove, rename, path, getpid, path, makedirs from threading import Event, Thread from time import time, sleep from random import seed from sha import sha from socket import error as socketerror from core.Choker import Choker from core.Storage import Storage from core.StorageWrapper import StorageWrapper from core.Uploader import Upload from core.Downloader import Downloader from core.Connecter import Connecter from core.Encrypter import Encrypter from core.RawServer import RawServer from core.Rerequester import Rerequester from core.DownloaderFeedback import DownloaderFeedback from core.RateMeasure import RateMeasure from core.CurrentRateMeasure import Measure, GlobalMeasure from core.EndgameDownloader import EndgameDownloader from core.PiecePicker import PiecePicker from core.bencode import bencode, bdecode ########################################################################################################### ########################################################################################################### class Loader: def __init__(self, torrent, globup, refresh = None, log = None): self.Refresh = refresh self.Log = log self.FlagEnd = Event() self.FlagHash = Event() self.Hashed = false self.Paused = true self.Finished = false self.FlagEnd.clear() self.FlagHash.clear() self.Info = {} self.Config = {} self.Obj = {} self.Obj['GlobalUpMeasure'] = globup if self.Init(torrent) == false: raise self.ThrHashing = Thread( target = self.ProcessFiles ) self.ThrHashing.setDaemon(false) ########################################################################################################### ########################################################################################################### def Init(self, tor): self.UpdateStatus( fractionDone = -1, timeEst = -1, downRate = 0, upRate = 0, activity = 'Paused' ) self.Config['Tor'] = tor self.Config['TorFull'] = path.join(Config.Get('Paths', 'Torrent'), tor) try: h = open(self.Config['TorFull'], 'rb') torrent = h.read() torrent = bdecode(torrent) torinfo = torrent['info'] h.close() except: return false self.Config['Tracker'] = torrent['announce'] self.Config['File'] = torinfo['name'] self.Config['Filename'] = path.join(Config.Get('Paths', 'Temp'), torinfo['name']) self.Config['Pieces'] = torinfo['pieces'] self.Config['PiecesLen'] = torinfo['piece length'] self.Config['InfoHash'] = sha(bencode(torinfo)).digest() self.Config['MyId'] = sha(repr(time()) + ' ' + str(getpid())).digest() seed(self.Config['MyId']) if torinfo.has_key('length'): self.Config['NumFiles'] = 1 self.Config['Size'] = torinfo['length'] else: self.Config['Files'] = [] self.Config['Size'] = 0 self.Config['NumFiles'] = 0 for item in torinfo['files']: self.Config['NumFiles'] += 1 self.Config['Size'] += item['length'] file = path.join(Config.Get('Paths', 'Temp'), self.Config['File']) for p in item['path']: file = path.join(file, p) self.Config['Files'].append( { 'File': item['path'][len(item['path'])-1], 'Filename': file, 'Size': item['length'] } ) self.Info['Size'] = self.Config['Size'] self.Info['File'] = self.Config['File'] return true ########################################################################################################### ########################################################################################################### def StartHashing(self): self.ThrHashing.start() self.OnTrivialInfo('Hashing started') def StartDownload( self ): if self.Hashed == false: self.StartHashing() self.FlagEnd.clear() self.Paused = false self.ThrDownload = Thread( target = self.Download ) self.ThrDownload.setDaemon(false) self.ThrDownload.start() self.OnTrivialInfo('Download started') def PauseDownload( self ): if self.ThrHashing.isAlive(): self.FlagHash.clear() self.Hashed = false self.FlagEnd.set() self.Paused = true self.UpdateStatus( timeEst = -1, downRate = 0, upRate = 0, activity = 'Paused' ) self.OnTrivialInfo('Download Paused') ########################################################################################################### ########################################################################################################### def Destroy(self): self.FlagEnd.set() ########################################################################################################### ########################################################################################################### def IsRunning(self): return not self.Paused def IsFinished(self): return self.Finished def IsHashing(self): return self.ThrHashing.isAlive() def HasHashed(self): return self.Hashed ########################################################################################################### ########################################################################################################### def GetNumConnections(self): try: return self.Obj['Connecter'].how_many_connections() except: return 0 ########################################################################################################### ########################################################################################################### def UpdateStatus(self, fractionDone = None, timeEst = None, downRate = None, upRate = None, activity = None): if fractionDone != None: if fractionDone == -1: self.Info['FractionDone'] = -1 self.Info['FractionRemain'] = -1 else: self.Info['FractionDone'] = fractionDone self.Info['FractionRemain'] = 1 - fractionDone if timeEst != None: self.Info['TimeEst'] = timeEst self.Info['ETA'] = self.ETA(timeEst) if activity != None: self.Info['Status'] = activity if downRate != None: self.Info['SpeedDown'] = float(downRate) / (1 << 10) if upRate != None: self.Info['SpeedUp'] = float(upRate) / (1 << 10) try: self.Refresh() except: pass ########################################################################################################### ########################################################################################################### def ETA( self, n ): if n == -1: return '?' if n == 0: return '' n = int(n) d, r = divmod(n, 60 * 60 * 24) h, r = divmod(r, 60 * 60) m, s = divmod(r, 60) if h > 1000000: return '?' if d > 0: return '%d d %02d h %02d min' % (d, h, m) if h > 0: return '%02d h %02d min' % (h, m) else: return '%d min %02d sec' % (m, s) ########################################################################################################### ########################################################################################################### def OnFinish(self, finfunc = None, finflag = None, ann = None, storage = None, errorfunc = None): self.PauseDownload() self.Finished = true self.Hashed = true self.UpdateStatus( fractionDone = 1, timeEst = 0, downRate = 0, upRate = 0, activity = 'Done' ) try: self.Obj['Storage'].close() rename( self.Config['Filename'], path.join(Config.Get('Paths','Incoming'), self.Config['File']) ) except: self.OnError('Could not move downloaded file.') try: rename( self.Config['TorFull'], path.join(Config.Get('Paths','History'), self.Config['Tor']) ) self.OnInfo( 'Download complete' ) except: self.OnError('Could not move torrent.') def OnFail(self, reason, errorfunc = None, doneflag = None): try: self.Log( 'Failed [' + self.Config['File'] + ']: ' + reason, loglevel = LOG_CRITICAL) except: pass def OnError(self, ErrorMsg): try: self.Log( 'Error [' + self.Config['File'] + ']: ' + ErrorMsg, loglevel = LOG_ERROR) except: pass def OnInfo(self, Info): try: self.Log( '[' + self.Config['File'] + ']: ' + Info, loglevel = LOG_INFO) except: pass def OnTrivialInfo(self, Info): try: self.Log( '[' + self.Config['File'] + ']: ' + Info, loglevel = LOG_TRIVIAL) except: pass ########################################################################################################### ########################################################################################################### def ProcessFiles(self): try: def make(f, forcedir = false): if not forcedir: f = path.split(f)[0] if f != '' and not path.exists(f): makedirs(f) if self.Config['NumFiles'] == 1: file = self.Config['Filename'] size = self.Config['Size'] make(file) files = [(file, size)] else: size = self.Config['Size'] file = self.Config['Filename'] if not path.exists(file): make(file, true) files = [] for f in self.Config['Files']: files.append((f['Filename'], f['Size'])) make( f['Filename'] ) except: self.OnError("Couldn't allocate.") return self.Config['Pieces'] = [self.Config['Pieces'][x:x+20] for x in xrange(0, len(self.Config['Pieces']), 20)] try: self.Obj['Storage'] = \ Storage( files, open, path.exists, path.getsize, self.UpdateStatus, 0.0 ) except: self.OnError("Trouble creating Storage.") return # Not sure why it won't work without that sleep(2.0) if self.FlagEnd.isSet(): return try: self.Obj['StorageWrapper'] = \ StorageWrapper( self.Obj['Storage'], (2 ** 14), # DOWNLOAD SLICE SIZE self.Config['Pieces'], self.Config['PiecesLen'], self.OnFinish, self.OnFail, self.UpdateStatus, self.FlagEnd, 1 ) # HASHING except: self.OnError('Trouble creating StorageWrapper.') return if not self.FlagEnd.isSet(): done = 1.0 - float(self.Obj['StorageWrapper'].get_amount_left()) / float(self.Config['Size']) self.UpdateStatus( fractionDone = done, activity = 'Paused' ) self.FlagHash.set() self.Hashed = true self.OnTrivialInfo('Hashing complete') ########################################################################################################### ########################################################################################################### def Download(self): while 1: self.FlagHash.wait(2.0) if not self.ThrHashing.isAlive(): break if self.FlagEnd.isSet() or self.Hashed == false or self.Finished == true: return self.Obj['RawServer'] = \ RawServer( self.FlagEnd, 60.0, # TIMEOUT CHECK INTERVAL 300.0 ) # TIMEOUT minport = Config.Get('Bind', 'PortMin') maxport = Config.Get('Bind', 'PortMax') for listen_port in xrange(minport, maxport + 1): try: self.Obj['RawServer'].bind(listen_port, Config.Get('Bind','Ip')) break except socketerror, e: pass else: self.FlagEnd.set() self.Paused = true self.OnError("Couldn't bind to - " + str(e)) return self.Obj['Choker'] = \ Choker( 4, # MAX UPLOADS, self.Obj['RawServer'].add_task ) self.Obj['UpMeasure'] = \ Measure( 20.0, # MAX RATE PERIOD, 5.0 ) # UPLOAD RATE FUDGE self.Obj['DownMeasure'] = \ Measure( 20.0 ) # MAX RATE PERIOD def make_upload( connection, choker = self.Obj['Choker'], storagewrapper = self.Obj['StorageWrapper'], max_slice_length = (2 ** 17), # MAX SLICE LENGTH max_rate_period = 20.0, # MAX RATE PERIOD fudge = 5.0 ): # UPLOAD RATE FUDGE return Upload( connection, choker, storagewrapper, max_slice_length, max_rate_period, fudge ) self.Obj['RateMeasure'] = \ RateMeasure( self.Obj['StorageWrapper'].get_amount_left() ) self.Obj['Downloader'] = \ Downloader( self.Obj['StorageWrapper'], PiecePicker( len(self.Config['Pieces']) ), 5, # REQUEST BACKLOG, 20.0, # MAX RATE PERIOD len(self.Config['Pieces']), self.Obj['DownMeasure'], 60.0, # SNUB TIME self.Obj['RateMeasure'].data_came_in ) self.Obj['Connecter'] = \ Connecter( make_upload, self.Obj['Downloader'], self.Obj['Choker'], len(self.Config['Pieces']), self.Obj['StorageWrapper'].is_everything_pending, EndgameDownloader, self.Obj['GlobalUpMeasure'], self.Obj['UpMeasure'], (Config.Get('Download','MaxSpeedUp') * 1024), # MAX UPLOAD RATE self.Obj['RawServer'].add_task ) self.Obj['Encrypter'] = \ Encrypter( self.Obj['Connecter'], self.Obj['RawServer'], self.Config['MyId'], (2 ** 23), # MAX MESSAGE LENGTH self.Obj['RawServer'].add_task, 120.0, # KEEPALIVE INTERVAL self.Config['InfoHash'], 40 ) # MAX INITIATE self.Obj['Rerequester'] = \ Rerequester( self.Config['Tracker'], (5 * 60), # REREQUEST INTERVAL self.Obj['RawServer'].add_task, self.Obj['Connecter'].how_many_connections, 20, # MIN PEERS self.Obj['Encrypter'].start_connection, self.Obj['RawServer'].external_add_task, self.Obj['StorageWrapper'].get_amount_left, self.Obj['UpMeasure'].get_total, self.Obj['DownMeasure'].get_total, listen_port, '', # IP self.Config['MyId'], self.Config['InfoHash'], 60, # HTTP TIMEOUT, self.OnError ) self.Obj['DownloaderFeedback'] = \ DownloaderFeedback( self.Obj['Choker'], self.Obj['RawServer'].add_task, self.UpdateStatus, self.Obj['UpMeasure'].get_rate, self.Obj['DownMeasure'].get_rate, self.Obj['RateMeasure'].get_time_left, self.Obj['RateMeasure'].get_size_left, self.Config['Size'], self.FlagEnd, 2.0 ) # DISPLAY INTERVAL self.UpdateStatus(activity = 'Downloading') self.Obj['Rerequester'].d(0) self.Obj['RawServer'].listen_forever( self.Obj['Encrypter'] ) self.Obj['Rerequester'].announce(2) |
From: <bel...@us...> - 2003-03-02 03:00:56
|
Update of /cvsroot/btplusplus/BT++/src/WebTemplates In directory sc8-pr-cvs1:/tmp/cvs-serv1946 Modified Files: log.tmpl Log Message: Table width statement missing Index: log.tmpl =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/WebTemplates/log.tmpl,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** log.tmpl 27 Feb 2003 00:44:40 -0000 1.1 --- log.tmpl 2 Mar 2003 03:00:52 -0000 1.2 *************** *** 5,9 **** <body bgcolor=#AA6666> <h1>WebTorrent++ Log</h1> ! <table border=1 cellpadding=4> <TMPL_LOOP Logs> <TMPL_IF LogLevelTrivial> --- 5,9 ---- <body bgcolor=#AA6666> <h1>WebTorrent++ Log</h1> ! <table border=1 cellpadding=4 width=100%> <TMPL_LOOP Logs> <TMPL_IF LogLevelTrivial> |
From: <bel...@us...> - 2003-03-02 02:55:44
|
Update of /cvsroot/btplusplus/BT++/src/WebTemplates In directory sc8-pr-cvs1:/tmp/cvs-serv819 Added Files: config.tmpl dl_fail.tmpl exit.tmpl menu.tmpl root.tmpl Log Message: Bug in logging fixed & additional templates II --- NEW FILE: config.tmpl --- <html> <head> <title>WebTorrent++ Configuration</title> </head> <body bgcolor=#6666AA> <form method=post action="torrents"> <table width=100% border=1 bgcolor=#CCCCFF cellpadding=2> <tr> <th colspan=2 align=left>Directories</th> </tr> <tr> <td>Torrent</td> <td width=80%><input type=text style="width:100%" name=Paths_Torrent value="<TMPL_VAR paths_torrent>"></td> </tr> <tr> <td>History</td> <td width=80%><input type=text style="width:100%" name=Paths_History value="<TMPL_VAR paths_history>"></td> </tr> <tr> <td>Incoming</td> <td width=80%><input type=text style="width:100%" name=Paths_Incoming value="<TMPL_VAR paths_incoming>"></td> </tr> <tr> <td>Temp</td> <td width=80%><input type=text style="width:100%" name=Paths_Temp value="<TMPL_VAR paths_temp>"></td> </tr> </table> <p> <table width=100%% border=1 bgcolor=#CCCCFF cellpadding=2> <tr> <th align=left>Basic</th> </tr> <tr> <td><table border=1 width=100%> <tr> <td>Automatically start new downloads</td> <td width=5% align=center><input type=checkbox name=Download_AutoStart <TMPL_IF download_autostart>CHECKED</TMPL_IF> value="1"></td> </tr> <tr> <td>Automatically pause downloads (if current>max)</td> <td width=5% align=center><input type=checkbox name=Download_AutoPause <TMPL_IF download_autopause>CHECKED</TMPL_IF> value="1"></td> </tr> <tr> <td>Maximal simultanous downloads (1-10)</td> <td width=5%><input type=text style="width:100%" name=Download_MaxSimDown value="<TMPL_VAR download_maxsimdown>"></td> </tr> </table></td> </tr> <tr> <td><table border=1 width=100%> <tr> <td>Maximal download speed (0=unlimited)</td> <td width=5%><input type=text style="width:100%" name=Download_MaxSpeedDown value="<TMPL_VAR download_maxspeeddown>"></td> </tr> <tr> <td>Maximal upload speed (0=unlimited)</td> <td width=5%><input type=text style="width:100%" name=Download_MaxSpeedUp value="<TMPL_VAR download_maxspeedup>"></td> </tr> </table></td> </tr> <tr> <td><table border=1 width=100%> <tr> <td>Use background hashing</td> <td width=5% align=center><input type=checkbox name=Hash_Background <TMPL_IF hash_background>CHECKED</TMPL_IF> value="1"></td> </tr> <tr> <td>Maximal simultanous files hashed (1-5)</td> <td width=5%><input type=text style="width:100%" name=Hash_NumSimHash value="<TMPL_VAR hash_numsimhash>"></td> </tr> </table></td> </tr> </table> <p> <table width=100% border=1 bgcolor=#CCCCFF cellpadding=2> <tr> <th align=left>Net Config</th> </tr> <tr> <td><table border=1 width=100%> <tr> <td>Bind to IP for BitTorrent (*)</td> <td width=10%><input type=text style="width:100%" name=Bind_Ip value="<TMPL_VAR bind_ip>"></td> </tr> <tr> <td>First Port for BitTorrent (*)</td> <td width=5%><input type=text style="width:100%" name=Bind_PortMin value="<TMPL_VAR bind_portmin>"></td> </tr> <tr> <td>Last Port for BitTorrent (*)</td> <td width=5%><input type=text style="width:100%" name=Bind_PortMax value="<TMPL_VAR bind_portmax>"></td> </tr> </table></td> </tr> <tr> <td><table border=1 width=100%> <tr> <td>Bind to IP for webserver (*)</td> <td width=10%><input type=text style="width:100%" name=Host_IP value="<TMPL_VAR host_ip>"></td> </tr> <tr> <td>Webserver port (*)</td> <td width=5%><input type=text style="width:100%" name=Host_Port value="<TMPL_VAR host_port>"></td> </tr> <tr> <td>Allow access from localhost</td> <td width=5% align=center><input type=checkbox name=Access_AllowLocal <TMPL_IF access_allowlocal>CHECKED</TMPL_IF> value="1"></td> </tr> <tr> <td>Allow access from external IPs (separated by space)</td> <td width=30%><input type=text style="width:100%" name=Access_ValidIPs value="<TMPL_VAR access_validips>"></td> </tr> </table></td> </tr> <tr> <td><table border=1 width=100%> <tr> <td>Refresh torrent page every (seconds)</td> <td width=5%><input type=text style="width:100%" name=Display_Refresh value="<TMPL_VAR display_refresh>"></td> </tr> <tr> <td> Log Level (default = 1)<br> <table style="font-size:x-small"> <tr><td width=1%></td><td align=right>0</td><td width=100%>Trivial</td></tr> <tr><td width=1%></td><td align=right>1</td><td width=100%>Info</td></tr> <tr><td width=1%></td><td align=right>2</td><td width=100%>Errors</td></tr> <tr><td width=1%></td><td align=right>3</td><td width=100%>Critical Errors</td></tr> </table> </td> <td width=5%><input type=text style="width:100%" name=Display_LogLevel value="<TMPL_VAR display_loglevel>"></td> </tr> <tr> <td>Number of kept Log entries (default = 200)</td> <td width=5%><input type=text style="width:100%" name=Display_LogCount value="<TMPL_VAR display_logcount>"></td> </tr> </table></td> </tr> </table> (*) changes require restart. <p> <center> <input type=hidden name=command value=Config> <button type=submit>Submit Changes</button> </center> </form> </body> </html> --- NEW FILE: dl_fail.tmpl --- <html> <head> <title>Download Error</title> </head> <body> <h1>Error downloading Torrent <TMPL_VAR torrent></h1> </body> </html> --- NEW FILE: exit.tmpl --- <html> <head> <title>Exit</title> </head> <body> <h1>Server Killed.</h1> </body> </html> --- NEW FILE: menu.tmpl --- <html> <head> <title>WebTorrent++ Menu</title> </head> <body bgcolor=#FFFFCC> <table width=100%> <tr> <td><form method=get action="torrents" target="body"> <button type=submit>Torrents</button> </form></td> <td nowrap><form method=get action="log" target="body"> <button type=submit>View Log</button> </form></td> <td><form method=get action="config" target="body"> <button type=submit>Config</button> </form></td> <td width=80%><form method=post action="torrents" target="body"> <table width=100% border=1 bgcolor=#FFCCCC> <tr> <td width=100%><input type=text style="width:100%" name=torr title="Paste Torrent URLs here"></td> <td><input type=hidden name=command value=Add><button type=submit>Add</button></td> </tr> </table> </form></td> <td nowrap><form method=get action="exit" target="body"> <button type=submit>Kill server</button> </form></td> </tr> </table> </body> </html> --- NEW FILE: root.tmpl --- <html> <head> <title>WebTorrent++</title> </head> <frameset rows="50,*"> <frame name="top" src="menu"> <frame name="body" src="torrents"> </frameset> </html> |
From: <bel...@us...> - 2003-03-02 02:52:42
|
Update of /cvsroot/btplusplus/BT++/src/WebServer In directory sc8-pr-cvs1:/tmp/cvs-serv32506/WebServer Modified Files: BTWebServer.py HTTPConfigFile.py Log Message: Bug in logging fixed & additional templates I Index: BTWebServer.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/WebServer/BTWebServer.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** BTWebServer.py 27 Feb 2003 00:44:40 -0000 1.3 --- BTWebServer.py 2 Mar 2003 02:52:39 -0000 1.4 *************** *** 17,80 **** __version__ = "0.1" - Checked = {0: '', 1:'CHECKED', '0': '', '1':'CHECKED'} - - HTTP_ROOT = """\ - <html> - <head> - <title>WebTorrent++</title> - </head> - <frameset rows="50,*"> - <frame name="top" src="menu"> - <frame name="body" src="torrents"> - </frameset> - </html> - """ - - HTTP_MENU = """\ - <head> - <title>Success</title> - </head> - <body bgcolor=#%s> - <table width=100%%><tr> - <td><form method=get action="torrents" target="body"><button type=submit>Torrents</button></form></td> - <td nowrap><form method=get action="log" target="body"><button type=submit>View Log</button></form></td> - <td><form method=get action="config" target="body"><button type=submit>Config</button></form></td> - <td width=80%%><form method=post action="torrents" target="body"> - <table width=100%% border=1 bgcolor=#%s><tr> - <td width=100%%><input type=text style="width:100%%" name=torr title="Paste Torrent URLs here"></td> - <td><input type=hidden name=command value=Add><button type=submit>Add</button></td> - </tr></table> - </form></td> - <td nowrap><form method=get action="exit" target="body"><button type=submit>Kill server</button></form></td> - </tr></table> - </body> - """ - - HTTP_EXIT = """\ - <head> - <title>Exit</title> - </head> - <body> - <h1>Server Killed.</h1> - </body> - """ - - HTTP_DL_ERROR = """\ - <head> - <title>Download Error</title> - </head> - <body> - <h1>Error downloading Torrent %s</h1> - </body> - """ - - LOG_LEVEL_DESC = """\ - <table style="font-size:x-small"> - <tr><td width=1%%></td><td align=right>0</td><td width=100%%>Trivial</td></tr> - <tr><td width=1%%></td><td align=right>1</td><td width=100%%>Info</td></tr> - <tr><td width=1%%></td><td align=right>2</td><td width=100%%>Errors</td></tr> - <tr><td width=1%%></td><td align=right>3</td><td width=100%%>Critical Errors</td></tr> - </table> - """ ########################################################################################################### --- 17,20 ---- *************** *** 84,98 **** BTWait = Event() ! try: ! remove("WebTemplates/torrent.tmplc") ! except: ! pass templateTorrent = TemplateManager().prepare("WebTemplates/torrent.tmpl") ! try: ! remove("WebTemplates/log.tmplc") ! except: ! pass templateLog = TemplateManager().prepare("WebTemplates/log.tmpl") ########################################################################################################### ########################################################################################################### --- 24,71 ---- BTWait = Event() ! ! chdir( ! path.abspath( ! path.dirname(sys.argv[0]) ! ) ! ) ! ! try: mkdir(Config.Get('Paths', 'Incoming')) ! except: pass ! try: mkdir(Config.Get('Paths', 'Torrent')) ! except: pass ! try: mkdir(Config.Get('Paths', 'History')) ! except: pass ! try: mkdir(Config.Get('Paths', 'Temp')) ! except: pass ! ! try: remove("WebTemplates/root.tmplc") ! except: pass ! templateRoot = TemplateManager().prepare("WebTemplates/root.tmpl") ! ! try: remove("WebTemplates/menu.tmplc") ! except: pass ! templateMenu = TemplateManager().prepare("WebTemplates/menu.tmpl") ! ! try: remove("WebTemplates/exit.tmplc") ! except: pass ! templateExit = TemplateManager().prepare("WebTemplates/exit.tmpl") ! ! try: remove("WebTemplates/dl_fail.tmplc") ! except: pass ! templateDLFail = TemplateManager().prepare("WebTemplates/dl_fail.tmpl") ! ! try: remove("WebTemplates/torrent.tmplc") ! except: pass templateTorrent = TemplateManager().prepare("WebTemplates/torrent.tmpl") ! ! try: remove("WebTemplates/log.tmplc") ! except: pass templateLog = TemplateManager().prepare("WebTemplates/log.tmpl") + try: remove("WebTemplates/config.tmplc") + except: pass + templateConfig = TemplateManager().prepare("WebTemplates/config.tmpl") + ########################################################################################################### ########################################################################################################### *************** *** 121,141 **** WebLog.append( log ) if len(WebLog) > int(HTTPConfig.Get('Display', 'LogCount')): ! WebLog.pop() - chdir( - path.abspath( - path.dirname(sys.argv[0]) - ) - ) - - try: mkdir(Config.Get('Paths', 'Incoming')) - except: pass - try: mkdir(Config.Get('Paths', 'Torrent')) - except: pass - try: mkdir(Config.Get('Paths', 'History')) - except: pass - try: mkdir(Config.Get('Paths', 'Temp')) - except: pass - BTHandler = LoaderManager(log = WebLogit) --- 94,99 ---- WebLog.append( log ) if len(WebLog) > int(HTTPConfig.Get('Display', 'LogCount')): ! WebLog.remove( len(WebLog) - 1 ) BTHandler = LoaderManager(log = WebLogit) *************** *** 151,157 **** def do_GET(self): """Serve a GET request.""" self.send_head() if self.requested == '': ! self.wfile.write(HTTP_ROOT) elif self.requested == 'torrents': BTHandler.Update() --- 109,116 ---- def do_GET(self): """Serve a GET request.""" + tproc = TemplateProcessor() self.send_head() if self.requested == '': ! self.wfile.write(tproc.process(templateRoot)) elif self.requested == 'torrents': BTHandler.Update() *************** *** 161,169 **** self.send_config() elif self.requested == 'menu': ! self.wfile.write(HTTP_MENU % (HTTPConfig.Get('WebColors','MenuBackground'),HTTPConfig.Get('WebColors','MenuAddbar'))) elif self.requested == 'log': self.send_log() elif self.requested == 'exit': ! self.wfile.write(HTTP_EXIT) for loader in BTHandler.Loaders: if loader.IsRunning(): loader.PauseDownload() --- 120,128 ---- self.send_config() elif self.requested == 'menu': ! self.wfile.write(tproc.process(templateMenu)) elif self.requested == 'log': self.send_log() elif self.requested == 'exit': ! self.wfile.write(tproc.process(templateExit)) for loader in BTHandler.Loaders: if loader.IsRunning(): loader.PauseDownload() *************** *** 226,230 **** f.close() except: ! self.wfile.write(HTTP_DL_ERROR % url) return elif result['command']=='Config': --- 185,191 ---- f.close() except: ! tproc = TemplateProcessor() ! tproc.set('torrent', url) ! self.wfile.write(tproc.process(templateDLFail)) return elif result['command']=='Config': *************** *** 451,505 **** def send_config(self): ! ret = "<html>\n<head>\n<title>WebTorrent++ Configuration</title>\n" ! ret = ret + "</head>\n<body bgcolor=#%s>\n<form method=post action=\"torrents\">\n" % HTTPConfig.Get('WebColors','ConfBackground') ! ret = ret + "<table width=100%% border=1 bgcolor=#%s><tr><th colspan=2 align=left>Directories</th></tr>\n" % HTTPConfig.Get('WebColors','ConfTable') ! ret = ret + "<tr><td>Torrent</td><td width=80%%><input type=text style=\"width:100%%\" name=Paths_Torrent value=\"%s\"></td></tr>\n" % (Config.Get('Paths', 'Torrent')) ! ret = ret + "<tr><td>History</td><td width=80%%><input type=text style=\"width:100%%\" name=Paths_History value=\"%s\"></td></tr>\n" % (Config.Get('Paths', 'History')) ! ret = ret + "<tr><td>Incoming</td><td width=80%%><input type=text style=\"width:100%%\" name=Paths_Incoming value=\"%s\"></td></tr>\n" % (Config.Get('Paths', 'Incoming')) ! ret = ret + "<tr><td>Temp</td><td width=80%%><input type=text style=\"width:100%%\" name=Paths_Temp value=\"%s\"></td></tr>\n" % (Config.Get('Paths', 'Temp')) ! ret = ret + "</table>\n" ! ret = ret + "<p><table width=100%% border=1 bgcolor=#%s><tr><th align=left>Basic</th></tr>\n" % HTTPConfig.Get('WebColors','ConfTable') ! ret = ret + "<tr><td><table border=1 width=100%>" ! ret = ret + "<tr><td>Automatically start new downloads</td><td width=5%% align=center><input type=checkbox name=Download_AutoStart %s value=\"1\"></td></tr>\n" % (Checked[Config.Get('Download', 'AutoStart')]) ! ret = ret + "<tr><td>Automatically pause downloads (if current>max)</td><td width=5%% align=center><input type=checkbox name=Download_AutoPause %s value=\"1\"></td></tr>\n" % (Checked[Config.Get('Download', 'AutoPause')]) ! ret = ret + "<tr><td>Maximal simultanous downloads (1-10)</td><td width=5%%><input type=text style=\"width:100%%\" name=Download_MaxSimDown value=\"%s\"></td></tr>\n" % (Config.Get('Download', 'MaxSimDown')) ! ret = ret + "</table></td></tr>" ! ## ret = ret + "<tr><td><table border=1 width=100%>" ! ## ret = ret + "<tr><td>Automatically pause downloads (if current>max)</td><td width=5%% align=center><input type=checkbox name=Seed_AutoPause %s value=\"1\"></td></tr>\n" % (Checked[HTTPConfig.Get('Seed', 'AutoStart')]) ! ## ret = ret + "<tr><td>Maximal simultanous downloads (1-10)</td><td width=5%%><input type=text style=\"width:100%%\" name=Seed_MaxSimDown value=\"%s\"></td></tr>\n" % (HTTPConfig.Get('Seed', 'MaxSimSeed')) ! ## ret = ret + "</table></td></tr>" ! ret = ret + "<tr><td><table border=1 width=100%>" ! ret = ret + "<tr><td>Maximal download speed (0=unlimited)</td><td width=5%%><input type=text style=\"width:100%%\" name=Download_MaxSpeedDown value=\"%s\"></td></tr>\n" % (Config.Get('Download', 'MaxSpeedDown')) ! ret = ret + "<tr><td>Maximal upload speed (0=unlimited)</td><td width=5%%><input type=text style=\"width:100%%\" name=Download_MaxSpeedUp value=\"%s\"></td></tr>\n" % (Config.Get('Download', 'MaxSpeedUp')) ! ret = ret + "</table></td></tr>" ! ret = ret + "<tr><td><table border=1 width=100%>" ! ret = ret + "<tr><td>Use background hashing</td><td width=5%% align=center><input type=checkbox name=Hash_Background %s value=\"1\"></td></tr>\n" % (Checked[Config.Get('Hash', 'Background')]) ! ret = ret + "<tr><td>Maximal simultanous files hashed (1-5)</td><td width=5%%><input type=text style=\"width:100%%\" name=Hash_NumSimHash value=\"%s\"></td></tr>\n" % (Config.Get('Hash', 'NumSimHash')) ! ret = ret + "</table></td></tr>" ! ret = ret + "</table>\n" ! ret = ret + "<p><table width=100%% border=1 bgcolor=#%s><tr><th align=left>Net Config</th></tr>\n" % HTTPConfig.Get('WebColors','ConfTable') ! ret = ret + "<tr><td><table border=1 width=100%>" ! ret = ret + "<tr><td>Bind to IP for BitTorrent (*)</td><td width=10%%><input type=text style=\"width:100%%\" name=Bind_Ip value=\"%s\"></td></tr>\n" % (Config.Get('Bind', 'Ip')) ! ret = ret + "<tr><td>First Port for BitTorrent (*)</td><td width=5%%><input type=text style=\"width:100%%\" name=Bind_PortMin value=\"%s\"></td></tr>\n" % (Config.Get('Bind', 'PortMin')) ! ret = ret + "<tr><td>Last Port for BitTorrent (*)</td><td width=5%%><input type=text style=\"width:100%%\" name=Bind_PortMax value=\"%s\"></td></tr>\n" % (Config.Get('Bind', 'PortMax')) ! ret = ret + "</table></td></tr>" ! ret = ret + "<tr><td><table border=1 width=100%>" ! ret = ret + "<tr><td>Bind to IP for webserver (*)</td><td width=10%%><input type=text style=\"width:100%%\" name=Host_IP value=\"%s\"></td></tr>\n" % (HTTPConfig.Get('Host', 'IP')) ! ret = ret + "<tr><td>Webserver port (*)</td><td width=5%%><input type=text style=\"width:100%%\" name=Host_Port value=\"%s\"></td></tr>\n" % (HTTPConfig.Get('Host', 'Port')) ! ## ret = ret + "</table></td></tr>" ! ## ret = ret + "<tr><td><table border=1 width=100%>" ! ret = ret + "<tr><td>Allow access from localhost</td><td width=5%% align=center><input type=checkbox name=Access_AllowLocal %s value=\"1\"></td></tr>\n" % (Checked[HTTPConfig.Get('Access', 'AllowLocal')]) ! ret = ret + "<tr><td>Allow access from external IPs (separated by space)</td><td width=30%%><input type=text style=\"width:100%%\" name=Access_ValidIPs value=\"%s\"></td></tr>\n" % (HTTPConfig.Get('Access', 'ValidIPs')) ! ret = ret + "</table></td></tr>" ! ret = ret + "<tr><td><table border=1 width=100%>" ! ret = ret + "<tr><td>Refresh torrent page every (seconds)</td><td width=5%%><input type=text style=\"width:100%%\" name=Display_Refresh value=\"%s\"></td></tr>\n" % (HTTPConfig.Get('Display', 'Refresh')) ! ret = ret + "<tr><td>Log Level (default = 1)<br>" + LOG_LEVEL_DESC + "</td><td width=5%%><input type=text style=\"width:100%%\" name=Display_LogLevel value=\"%s\"></td></tr>\n" % (HTTPConfig.Get('Display', 'LogLevel')) ! ret = ret + "<tr><td>Number of kept Log entries (default = 200)</td><td width=5%%><input type=text style=\"width:100%%\" name=Display_LogCount value=\"%s\"></td></tr>\n" % (HTTPConfig.Get('Display', 'LogCount')) ! ret = ret + "</table></td></tr>" ! ret = ret + "</table>\n" ! ret = ret + "(*) changes require restart.\n" ! ! ret = ret + "<p><center><input type=hidden name=command value=Config><button type=submit>Submit Changes</button></center>\n</form>\n</body>\n</html>\n" ! self.wfile.write(ret) def send_log(self): --- 412,438 ---- def send_config(self): ! tproc = TemplateProcessor() ! tproc.set('paths_torrent', Config.Get('Paths', 'Torrent')) ! tproc.set('paths_history', Config.Get('Paths', 'History')) ! tproc.set('paths_incoming', Config.Get('Paths', 'Incoming')) ! tproc.set('paths_temp', Config.Get('Paths', 'Temp')) ! tproc.set('download_autostart', int(Config.Get('Download', 'AutoStart'))) ! tproc.set('download_autopause', int(Config.Get('Download', 'AutoPause'))) ! tproc.set('download_maxsimdown', Config.Get('Download', 'MaxSimDown')) ! tproc.set('download_maxspeeddown', Config.Get('Download', 'MaxSpeedDown')) ! tproc.set('download_maxspeedup', Config.Get('Download', 'MaxSpeedUp')) ! tproc.set('hash_background', int(Config.Get('Hash', 'Background'))) ! tproc.set('hash_numsimhash', Config.Get('Hash', 'NumSimHash')) ! tproc.set('bind_ip', Config.Get('Bind', 'Ip')) ! tproc.set('bind_portmin', Config.Get('Bind', 'PortMin')) ! tproc.set('bind_portmax', Config.Get('Bind', 'PortMax')) ! tproc.set('host_ip', HTTPConfig.Get('Host', 'IP')) ! tproc.set('host_port', HTTPConfig.Get('Host', 'Port')) ! tproc.set('access_allowlocal', int(HTTPConfig.Get('Access', 'AllowLocal'))) ! tproc.set('access_validips', HTTPConfig.Get('Access', 'ValidIPs')) ! tproc.set('display_refresh', HTTPConfig.Get('Display', 'Refresh')) ! tproc.set('display_loglevel', HTTPConfig.Get('Display', 'LogLevel')) ! tproc.set('display_logcount', HTTPConfig.Get('Display', 'LogCount')) ! self.wfile.write(tproc.process(templateConfig)) def send_log(self): Index: HTTPConfigFile.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/WebServer/HTTPConfigFile.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** HTTPConfigFile.py 27 Feb 2003 00:44:40 -0000 1.3 --- HTTPConfigFile.py 2 Mar 2003 02:52:39 -0000 1.4 *************** *** 19,28 **** ## 'MaxSimSeed': 3 ## }, - 'WebColors': { - 'MenuBackground': 'FFFFCC', - 'MenuAddbar': 'FFCCCC', - 'ConfBackground': '6666AA', - 'ConfTable': 'CCCCFF', - } } --- 19,22 ---- |
From: <sir...@us...> - 2003-02-28 21:34:09
|
Update of /cvsroot/btplusplus/BT++/src/DlgAbout In directory sc8-pr-cvs1:/tmp/cvs-serv29963/src/DlgAbout Modified Files: DlgAbout.py Log Message: Added all people working on the project :-) Index: DlgAbout.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/DlgAbout/DlgAbout.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** DlgAbout.py 22 Feb 2003 15:53:28 -0000 1.2 --- DlgAbout.py 28 Feb 2003 21:34:04 -0000 1.3 *************** *** 5,10 **** Copyright = '\ Copyright (c) 2003 Florian "SirElvis" Wagner\n\ ! and \n\ ! Joshua "xamphear" Cantara\n\n\ Portion copyright (c) 2001-2003 Bram Cohen\ ' --- 5,11 ---- Copyright = '\ Copyright (c) 2003 Florian "SirElvis" Wagner\n\ ! Joshua "xamphear" Cantara\n\ ! Tobias "Belgabor" Minich\n\ ! \n\ Portion copyright (c) 2001-2003 Bram Cohen\ ' |
From: <sir...@us...> - 2003-02-28 21:32:27
|
Update of /cvsroot/btplusplus/BT++/src/TabTrans In directory sc8-pr-cvs1:/tmp/cvs-serv28244/src/TabTrans Modified Files: Renderer.py GridTable.py Grid.py Log Message: The grid has been replaced by a class derived fro wxScrolledWindow, implementing everything by hand in Python and using double buffering. Not everything is working yet(but most of it) and the buffering is not yet working correctly. But flickering is already reduced and since I now paint the whole thing myself I can make(have made) it look better than the standard wxWindows grid. Index: Renderer.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/TabTrans/Renderer.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** Renderer.py 22 Feb 2003 21:12:30 -0000 1.3 --- Renderer.py 28 Feb 2003 21:31:51 -0000 1.4 *************** *** 5,12 **** ########################################################################################################### ! class Default(wxPyGridCellRenderer): def __init__(self): - wxPyGridCellRenderer.__init__(self) # Init some variables ( Change colors HERE ) --- 5,11 ---- ########################################################################################################### ! class Default: def __init__(self): # Init some variables ( Change colors HERE ) *************** *** 24,31 **** wxFONTENCODING_SYSTEM ) ! def Clone(self): ! return Default() ! ! def Update( self, grid, attr, dc, rect, row, col, isSelected): self.Grid = grid --- 23,27 ---- wxFONTENCODING_SYSTEM ) ! def Update(self, grid, attr, dc, rect, row, col, isSelected): self.Grid = grid *************** *** 47,52 **** self.Update(grid, attr, dc, rect, row, col, isSelected) - dc.BeginDrawing() - # Draw the background self.DrawBackground() --- 43,46 ---- *************** *** 55,60 **** self.DrawForeground() - dc.EndDrawing() - def DrawBackground(self): pass --- 49,52 ---- *************** *** 62,70 **** def DrawForeground(self): try: ! rect = wxRect( self.Rect.x, ! self.Rect.y, ! self.Rect.width - 6, ! self.Rect.height ) ! self.Clip( self.DC, rect ) self.DC.SetTextForeground( self.FgColor ) --- 54,59 ---- def DrawForeground(self): try: ! self.Rect.width = self.Rect.width - 8 ! self.Clip() self.DC.SetTextForeground( self.FgColor ) *************** *** 72,87 **** self.DC.DrawText( self.ValueStr, self.Rect.x + 6, self.Rect.y + 4 ) finally: ! self.DC.SetPen( wxNullPen ) ! self.DC.SetBrush( wxNullBrush ) ! self.Unclip(self.DC) ########################################################################################################### ########################################################################################################### ! def Clip( self, dc, rect ): ! dc.SetClippingRegion( rect.x, rect.y, rect.width, rect.height ) ! def Unclip( self, dc ): ! dc.DestroyClippingRegion() ########################################################################################################### --- 61,74 ---- self.DC.DrawText( self.ValueStr, self.Rect.x + 6, self.Rect.y + 4 ) finally: ! self.Unclip() ########################################################################################################### ########################################################################################################### ! def Clip( self ): ! self.DC.SetClippingRegion( self.Rect.x, self.Rect.y, self.Rect.width, self.Rect.height ) ! def Unclip( self ): ! self.DC.DestroyClippingRegion() ########################################################################################################### *************** *** 98,104 **** self.BarLoadDone = wxColour(0,244,0) self.BarLoadRemain = wxColour(224,0,0) ! ! def Clone(self): ! return ProcessBar() def DrawForeground(self): --- 85,90 ---- self.BarLoadDone = wxColour(0,244,0) self.BarLoadRemain = wxColour(224,0,0) ! ! ########################################################################################################### def DrawForeground(self): *************** *** 109,153 **** remain = 1 - done ! done_end = self.Rect.x + (self.Rect.width * done) ! remain_start = done_end + 1 ! self.Clip( self.DC, self.Rect ) ! ! try: ! if done != -1.0: ! status = self.Grid.GetCellValue( self.Row, 5 ) ! ! if status == 'Hashing' or status == 'Allocating': ! color_done = self.BarHashDone ! color_remain = self.BarHashRemain ! else: ! color_done = self.BarLoadDone ! color_remain = self.BarLoadRemain ! self.DrawBCBGradient( wxRect(self.Rect.x, ! self.Rect.y + 3, ! done_end, ! self.Rect.height - 6), ! color_remain, ! 7 ) ! ! self.DrawBCBGradient( wxRect(remain_start, ! self.Rect.y + 3, ! self.Rect.width - done_end, ! self.Rect.height - 6), ! color_done, ! 7 ) else: ! self.DrawBCBGradient( wxRect(self.Rect.x, ! self.Rect.y + 3, ! self.Rect.width, ! self.Rect.height - 6), ! wxColour(0,210,255), ! 7 ) ! finally: ! self.DC.SetPen( wxNullPen ) ! self.DC.SetBrush( wxNullBrush ) ! self.Unclip(self.DC) def DrawBCBGradient(self, rect, color, gradheight): --- 95,134 ---- remain = 1 - done ! done_width = self.Rect.width * done ! remain_start = self.Rect.x + done_width ! remain_width = self.Rect.width - done_width ! if done != -1.0: ! status = self.Grid.GetCellValue( self.Row, 5 ) ! if status == 'Hashing' or status == 'Allocating': ! color_done = self.BarHashDone ! color_remain = self.BarHashRemain else: ! color_done = self.BarLoadDone ! color_remain = self.BarLoadRemain ! self.DrawBCBGradient( wxRect(remain_start, ! self.Rect.y + 3, ! remain_width, ! self.Rect.height - 6), ! color_remain, ! 7 ) ! ! self.DrawBCBGradient( wxRect(self.Rect.x, ! self.Rect.y + 3, ! done_width, ! self.Rect.height - 6), ! color_done, ! 7 ) ! else: ! self.DrawBCBGradient( wxRect(self.Rect.x, ! self.Rect.y + 3, ! self.Rect.width, ! self.Rect.height - 6), ! wxColour(0,210,255), ! 7 ) ! ! ########################################################################################################### def DrawBCBGradient(self, rect, color, gradheight): *************** *** 172,176 **** color, wxColour(0,0,0) ) ! def DrawGradient(self, rect, color_start, color_end): steps = rect.height --- 153,159 ---- color, wxColour(0,0,0) ) ! ! ########################################################################################################### ! def DrawGradient(self, rect, color_start, color_end): steps = rect.height *************** *** 180,183 **** --- 163,168 ---- b_dif = color_end.Blue() - color_start.Blue() + length = rect.x + rect.width + for y in range(steps): mod = float(y) / float(steps - 1) *************** *** 186,190 **** color_start.Blue() + (mod * b_dif) ) ! self.DC.SetPen( wxTRANSPARENT_PEN ) ! self.DC.SetBrush( wxBrush( color, wxSOLID) ) ! self.DC.DrawRectangle( rect.x, rect.y + y, rect.width, 1 ) --- 171,174 ---- color_start.Blue() + (mod * b_dif) ) ! self.DC.SetPen( wxPen(color) ) ! self.DC.DrawLine( rect.x, rect.y + y, length, rect.y + y) Index: GridTable.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/TabTrans/GridTable.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** GridTable.py 22 Feb 2003 15:53:28 -0000 1.3 --- GridTable.py 28 Feb 2003 21:31:52 -0000 1.4 *************** *** 5,12 **** --- 5,32 ---- from TabLog.LogWindow import Log + import Renderer + class GridTable(wxPyGridTableBase): currentRows = 0 currentCols = 7 + Sizes = { + 'ColLabel': 18, + 'RowLabel': 25, + + 'RowsDef': 22, + 'ColsDef': 50, + + 'Rows': {}, + 'Cols': {} + } + + Renderers = { + 'Default': Renderer.Default(), + + 'Rows': {}, + 'Cols': {4: Renderer.ProgressBar()} + } + def __init__(self, grid): wxPyGridTableBase.__init__(self) *************** *** 17,22 **** def Update(self): self.Manager.Update() - self.ResetView() - self.AdjustScrollbars() ########################################################################################################### --- 37,40 ---- *************** *** 28,32 **** --- 46,82 ---- def GetNumberCols(self): return 7 + + ########################################################################################################### + ########################################################################################################### + + def GetColLabelSize(self): + return self.Sizes['ColLabel'] + + ########################################################################################################### + + def GetRowLabelSize(self): + return self.Sizes['RowLabel'] + + ########################################################################################################### + def GetColSize(self, col): + if self.Sizes['Cols'].has_key(col): + return self.Sizes['Cols'][col] + else: + return self.Sizes['ColsDef'] + + def SetColSize(self, col, size): + self.Sizes['Cols'][col] = size + + ########################################################################################################### + + def GetRowSize(self, row): + if self.Sizes['Rows'].has_key(row): + return self.Sizes['Rows'][row] + else: + return self.Sizes['RowsDef'] + + ########################################################################################################### + def IsEmptyCell(self, row, col): if col > 6: *************** *** 46,54 **** if col == 6: return 'Remaining' ! def GetTypeName(self, row, col): ! if col == 4: ! return 'ProgressBar' else: ! return 'Default' ########################################################################################################### --- 96,106 ---- if col == 6: return 'Remaining' ! def GetCellRenderer(self, row, col): ! if self.Renderers['Cols'].has_key(col): ! return self.Renderers['Cols'][col] ! elif self.Renderers['Rows'].has_key(row): ! return self.Renderers['Rowss'][row] else: ! return self.Renderers['Default'] ########################################################################################################### *************** *** 92,128 **** ########################################################################################################### ########################################################################################################### - - def ResetView(self): - grid = self.GetView() - if not grid: - return - - grid.BeginBatch() - - for current, new, delmsg, addmsg in [ (self.currentRows, self.GetNumberRows(), wxGRIDTABLE_NOTIFY_ROWS_DELETED, wxGRIDTABLE_NOTIFY_ROWS_APPENDED), - (self.currentCols, self.GetNumberCols(), wxGRIDTABLE_NOTIFY_COLS_DELETED, wxGRIDTABLE_NOTIFY_COLS_APPENDED) ]: - if new < current: - msg = wxGridTableMessage( self, delmsg, new, current-new ) - grid.ProcessTableMessage(msg) - elif new > current: - msg = wxGridTableMessage( self, addmsg, new-current ) - grid.ProcessTableMessage(msg) - - self.currentRows = self.GetNumberRows() - self.currentCols = self.GetNumberCols() - - self.UpdateValues() - grid.EndBatch() - - def UpdateValues(self): - grid = self.GetView() - if not grid: - return - - msg = wxGridTableMessage(self, wxGRIDTABLE_REQUEST_VIEW_GET_VALUES) - grid.ProcessTableMessage(msg) - - ########################################################################################################### - ########################################################################################################### def Destroy(self, evt = wxCloseEvent()): --- 144,147 ---- *************** *** 137,144 **** def AdjustScrollbars(self): self.Grid.AdjustScrollbars() - - def GetView(self): - return self.Grid - - ########################################################################################################### - ########################################################################################################### --- 156,157 ---- Index: Grid.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/TabTrans/Grid.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** Grid.py 24 Feb 2003 14:35:46 -0000 1.7 --- Grid.py 28 Feb 2003 21:31:52 -0000 1.8 *************** *** 1,7 **** ! from wxPython.wx import * ! from wxPython.grid import * ! from wxPython.lib.gridmovers import wxGridRowMover, EVT_GRID_ROW_MOVE ! ! from os import unlink, path from ConfigFile import Config --- 1,4 ---- ! from wxPython.wx import * ! from os import unlink, path from ConfigFile import Config *************** *** 12,59 **** import Renderer ! class Grid(wxGrid): ! currentSelection = [] ! def __init__(self, parent): ! wxGrid.__init__(self, parent, -1, wxPoint(0,0), wxSize(786,335), style = wxSIMPLE_BORDER) ! ! self.RegisterDataType( 'ProgressBar', Renderer.ProgressBar(), None ) ! self.RegisterDataType( 'Default', Renderer.Default(), None ) ! self.Table = GridTable(self) - self.SetTable(self.Table) - - # Me wants no cell highlight ;-) - self.SetCellHighlightPenWidth( 0 ) - - self.AutoSizeColumns(false) - self.SetRowLabelAlignment(wxALIGN_CENTER, wxALIGN_CENTRE) ! self.SetColLabelSize(18) ! self.SetRowLabelSize(25) ! self.SetDefaultRowSize(22, false) ! self.SetColSize(0, 230) ! self.SetColSize(1, 80) ! self.SetColSize(2, 80) ! self.SetColSize(3, 70) ! self.SetColSize(4, 120) ! self.SetColSize(5, 70) ! self.SetColSize(6, 90) ! self.SetLabelFont( wxFont(8, wxDEFAULT, wxNORMAL, wxNORMAL) ) ! self.SetGridLineColour( wxSystemSettings_GetColour(wxSYS_COLOUR_3DFACE) ) ! self.SetSelectionBackground( wxSystemSettings_GetColour(wxSYS_COLOUR_HIGHLIGHT) ) ! self.SetSelectionForeground( wxColour(255,255,255) ) ! self.EnableGridLines(false) ! self.EnableEditing(false) ! self.EnableDragRowSize(false) - self.SetSelectionMode( wxGrid.wxGridSelectRows ) - self.Updater = TimedUpdate( 10.0, self.Update ) self.Updater.Start() self.Menu = wxMenu( '' ) self.Menu.Sel = -1 --- 9,43 ---- import Renderer ! class Grid(wxScrolledWindow): ! Selection = { ! 'Set': [], ! 'Add': false ! } ! def __init__(self, parent): ! wxScrolledWindow.__init__(self, parent, -1, wxPoint(0,0), wxSize(786,335), style = wxSIMPLE_BORDER | wxCLIP_CHILDREN | wxNO_FULL_REPAINT_ON_RESIZE) ! self.Table = GridTable(self) ! self.SetBackgroundColour(wxColour(255,255,255)) ! #self.SetColLabelSize(18) ! #self.SetRowLabelSize(25) ! #self.SetDefaultRowSize(22, false) ! self.Table.SetColSize(0, 230) ! self.Table.SetColSize(1, 80) ! self.Table.SetColSize(2, 80) ! self.Table.SetColSize(3, 70) ! self.Table.SetColSize(4, 120) ! self.Table.SetColSize(5, 70) ! self.Table.SetColSize(6, 90) ! self.SetScrollRate( 5, 5 ) self.Updater = TimedUpdate( 10.0, self.Update ) self.Updater.Start() + # Menu creation self.Menu = wxMenu( '' ) self.Menu.Sel = -1 *************** *** 72,83 **** self.Menu.AppendItem( self.itemDown ) - wxGridRowMover(self) - EVT_GRID_ROW_MOVE(self, self.GetId(), self.MoveRow) - EVT_GRID_COL_SIZE(self, self.OnColSize ) - - EVT_GRID_RANGE_SELECT( self, self.OnSelectedRange ) - EVT_GRID_SELECT_CELL( self, self.OnSelectedCell ) - - EVT_GRID_CELL_RIGHT_CLICK( self, self.ShowMenu ) EVT_MENU( self, self.itemCancel.GetId(), self.Menu_Cancel ) EVT_MENU( self, self.itemResume.GetId(), self.Menu_Resume ) --- 56,59 ---- *************** *** 86,89 **** --- 62,71 ---- EVT_MENU( self, self.itemDown.GetId(), self.Menu_Down ) + EVT_KEY_DOWN( self, self.OnKeyDown ) + EVT_KEY_UP( self, self.OnKeyUp ) + + EVT_LEFT_DOWN( self, self.OnMouseLeftDown ) + EVT_RIGHT_DOWN( self, self.OnMouseRightDown ) + self.DrawTools = { 'HighlightOutline': wxPen( wxColour( 10, 36,106) ), *************** *** 92,96 **** 'EmptyBackground': wxBrush( wxColour(255,255,255), wxSOLID), - #'LabelBackColor': 'LabelFontColor': wxColour(0, 0, 0), 'LabelFont': wxFont( 8, --- 74,77 ---- *************** *** 102,188 **** wxFONTENCODING_SYSTEM ), 'ArrowBitmap': GetBitmap('Grid_Arrow') } - EVT_ERASE_BACKGROUND( self, self.OnEraseBg ) EVT_PAINT( self, self.OnPaint ) EVT_SIZE( self, self.OnSize ) def Update(self): self.Table.Update() - wxGrid.Update(self) ! def GetDownloader(self): ! return self.Table.Manager.GetDownloader(self.GetGridCursorRow()) ! def MoveRow(self, evt): ! self.Table.Move(evt.GetMoveRow(), evt.GetBeforeRow()) ########################################################################################################### - ########################################################################################################### ! def ShowMenu(self, evt): ! self.SelectRow( evt.GetRow() ) ! self.SetGridCursor( evt.GetRow(), 0 ) ! ! self.itemCancel.Enable(true) ! ! file = self.GetDownloader() ! if file == None: ! return ! if file.IsRunning(): ! self.itemPause.Enable(true) ! self.itemResume.Enable(false) ! else: ! self.itemPause.Enable(false) ! self.itemResume.Enable(true) ! ! if evt.GetRow() == 0: ! self.itemUp.Enable(false) ! self.itemDown.Enable(true) ! elif evt.GetRow() == self.GetNumberRows()-1: ! self.itemUp.Enable(true) ! self.itemDown.Enable(false) ! else: ! self.itemUp.Enable(true) ! self.itemDown.Enable(true) ! ! self.PopupMenu( self.Menu, evt.GetPosition() ) def Menu_Cancel(self, evt): ! file = self.GetDownloader() ! if file != None: ! file.PauseDownload() ! dlg = wxMessageDialog( self, ! "Do you really want to cancel the download of '" + file.Config['File'] + "'?\nThis will result in the torrent being deleted.", ! "Cancel?", ! wxYES_NO | wxICON_QUESTION | wxSTAY_ON_TOP ) ! if dlg.ShowModal() == wxID_NO: ! return ! ! try: ! file.PauseDownload() ! unlink( file.Config['TorFull'] ) ! except: ! wxMessageBox("Couldn't delete torrent file.") self.Table.Update() def Menu_Pause(self, evt): ! file = self.GetDownloader() ! if file != None: ! file.PauseDownload() def Menu_Resume(self, evt): ! file = self.GetDownloader() ! if file != None: file.StartDownload() def Menu_Up(self, evt): sel = self.GetGridCursorRow() self.Table.Manager.Move( sel, sel - 1) ! def Menu_Down(self, evt): sel = self.GetGridCursorRow() --- 83,160 ---- wxFONTENCODING_SYSTEM ), + 'LabelOutlineC1': wxPen( wxColor(255,255,255) ), + 'LabelOutlineC2': wxPen( wxColor(128,128,128) ), + 'LabelOutlineC3': wxPen( wxColor( 64, 64, 64) ), + 'LabelFill': wxBrush( wxColor(212,208,200), wxSOLID ), + 'ArrowBitmap': GetBitmap('Grid_Arrow') } EVT_PAINT( self, self.OnPaint ) EVT_SIZE( self, self.OnSize ) + ########################################################################################################### + def Update(self): self.Table.Update() ! ########################################################################################################### ! def GetLoaders(self, sel): ! loaders = [] ! for i in sel: ! loaders.append( self.Table.Manager.Loaders[i] ) ! ! return loaders ########################################################################################################### ! #def MoveRow(self, evt): ! #self.Table.Move(evt.GetMoveRow(), evt.GetBeforeRow()) ! ########################################################################################################### ! ########################################################################################################### def Menu_Cancel(self, evt): ! loaders = self.GetLoaders(self.Selection['Set']) ! for l in loaders: ! dlg = wxMessageDialog( self, ! "Do you really want to cancel the download of '" + l.Config['File'] + "'?\nThis will result in the torrent being deleted.", ! "Cancel?", ! wxYES_NO | wxICON_QUESTION | wxSTAY_ON_TOP ) ! if dlg.ShowModal() == wxID_NO: ! return + try: + l.PauseDownload() + unlink( l.Config['TorFull'] ) + except: + wxMessageBox("Couldn't delete torrent file.") + self.Table.Update() + ########################################################################################################### + def Menu_Pause(self, evt): ! loaders = self.GetLoaders(self.Selection['Set']) ! for l in loaders: ! l.PauseDownload() ! ! ########################################################################################################### def Menu_Resume(self, evt): ! loaders = self.GetLoaders(self.Selection['Set']) ! for l in loaders: file.StartDownload() + ########################################################################################################### + def Menu_Up(self, evt): sel = self.GetGridCursorRow() self.Table.Manager.Move( sel, sel - 1) ! ! ########################################################################################################### ! def Menu_Down(self, evt): sel = self.GetGridCursorRow() *************** *** 190,230 **** ########################################################################################################### ########################################################################################################### ! def OnSelectedRange(self, evt): ! if evt.Selecting(): # adding to the list... ! for index in range( evt.GetTopRow(), evt.GetBottomRow()+1): ! if index not in self.currentSelection: ! self.currentSelection.append( index ) ! else: # removal from list ! for index in range( evt.GetTopRow(), evt.GetBottomRow()+1): ! while index in self.currentSelection: ! self.currentSelection.remove( index ) ! evt.Skip() ! def OnSelectedCell(self, evt): ! self.currentSelection = [ evt.GetRow() ] ! evt.Skip() ########################################################################################################### ########################################################################################################### ! def OnEraseBg(self, evt): ! pass ! ! def OnPaint(self, evt = None): if self.IsShown() == false: return try: - scx, scy = self.GetViewStart() - unx, uny = self.GetScrollPixelsPerUnit() - - scx = -scx * unx - scy = -scy * uny - dc = self.BufferDC dc.BeginDrawing() --- 162,301 ---- ########################################################################################################### + + def OnMouseRightDown(self, evt): + row = self.GetCursorRow(evt.GetY()) + + if row == -1: + return + + if not row in self.Selection['Set']: + self.Selection['Set'] = [row] + self.Refresh() + + sel = self.Selection['Set'] + if sel == []: + return + + loaders = self.GetLoaders(sel) + + pause = false + resume = false + mup = true + mdown = true + + if 0 in sel: + mup = false + + if (self.Table.GetNumberRows() - 1) in sel: + mdown = false + + if len(sel) > 1: + pause = true + resume = true + else: + if loaders[0].IsRunning(): + pause = true + else: + resume = true + + self.itemCancel .Enable( true ) + self.itemPause .Enable( pause ) + self.itemResume .Enable( resume ) + self.itemUp .Enable( false ) + self.itemDown .Enable( false ) + + self.PopupMenu( self.Menu, evt.GetPosition() ) + + ########################################################################################################### ########################################################################################################### ! def OnMouseLeftDown(self, evt): ! x = evt.GetX() ! y = evt.GetY() ! ! row = self.GetCursorRow(y) ! ! if row == -1: ! self.Selection['Set'] = [] ! ! if self.Selection['Add'] == false: ! self.Selection['Set'] = [] ! ! self.Selection['Set'].append( row ) ! ! ########################################################################################################### ! ! def OnKeyDown(self, evt): ! code = evt.GetKeyCode() ! ! if code == WXK_CONTROL: ! self.Selection['Add'] = true ! ! ########################################################################################################### ! ! def OnKeyUp(self, evt): ! code = evt.GetKeyCode() ! ! if code == WXK_CONTROL: ! self.Selection['Add'] = false ! ! ########################################################################################################### ! ! def GetCursorRow(self, y): ! ! if y < self.Table.GetColLabelSize(): ! return -1 ! ! InRow = -1 ! ! y = y - self.Table.GetColLabelSize() ! for row in range(self.Table.GetNumberRows()): ! y = y - self.Table.GetRowSize(row) ! InRow = InRow + 1 ! ! if y <= 0: ! break ! ! if y > 0: ! return -1 ! ! ! return InRow ! ! ########################################################################################################### ! ########################################################################################################### ! ! #def OnSelectedRange(self, evt): ! #if evt.Selecting(): # adding to the list... ! #for index in range( evt.GetTopRow(), evt.GetBottomRow()+1): ! #if index not in self.currentSelection: ! #self.currentSelection.append( index ) ! #else: # removal from list ! #for index in range( evt.GetTopRow(), evt.GetBottomRow()+1): ! #while index in self.currentSelection: ! #self.currentSelection.remove( index ) ! #evt.Skip() ! #def OnSelectedCell(self, evt): ! #self.currentSelection = [ evt.GetRow() ] ! #evt.Skip() ! ! ########################################################################################################### ! ########################################################################################################### ! ! #def SetFullSize(self): ! ########################################################################################################### ########################################################################################################### ! def OnPaint(self, evt): if self.IsShown() == false: return try: dc = self.BufferDC dc.BeginDrawing() *************** *** 234,321 **** dc.Clear() ! # Draw the selections ! dc.SetPen( self.DrawTools['HighlightOutline'] ) ! dc.SetBrush( self.DrawTools['HighlightColor'] ) ! if self.currentSelection != []: ! sel = self.currentSelection ! rect = self.BlockToDeviceRect( wxGridCellCoords(sel[0], 0), ! wxGridCellCoords(sel[len(sel)-1], 6) ) ! ! dc.DrawRectangle( scx + rect.x + 2, ! scy + rect.y + 20, ! rect.width + 21, ! rect.height - 5 ) - numcols = range(self.Table.GetNumberCols()) - numrows = range(self.Table.GetNumberRows()) - - x = 0 - y = 0 - # Draw the col labels ! dc.SetPen( self.DrawTools['HighlightOutline'] ) ! dc.SetBrush( self.DrawTools['HighlightColor'] ) ! dc.SetTextForeground( self.DrawTools['LabelFontColor'] ) ! dc.SetFont( self.DrawTools['LabelFont'] ) ! for col in numcols: ! rect = wxRect( x, 0, self.GetColSize(col), 18 ) ! x = x + self.GetColSize(col) ! dc.DrawRectangle( scx + rect.x + 25, ! scy + rect.y, ! rect.width, ! rect.height ) ! dc.DrawText( self.Table.GetColLabelValue(col), ! scx + rect.x + 29, ! scy + rect.y + 2 ) ! # Draw the row 'labels' ! for row in numrows: ! dc.DrawBitmap( self.DrawTools['ArrowBitmap'], scx, scy + y + 20, true ) ! y = y + self.GetRowSize(row) ! for col in numcols: ! for row in numrows: ! ! rect = self.CellToRect(row, col) ! rend = self.GetCellRenderer(row, col) ! rend.Draw( self, ! None, ! dc, ! wxRect( scx + rect.x + 25, ! scy + rect.y + 18, ! rect.width, ! rect.height ), ! row, ! col, ! true ) ! ! dc.EndDrawing() ! w, h = dc.GetSizeTuple() ! ondc = wxClientDC(self) ! ondc.BeginDrawing() ! ondc.Blit(0, 0, w, h, dc, 0, 0 ) ! ondc.EndDrawing() ! except: ! pass def OnSize(self, evt): ! size = self.GetClientSizeTuple() ! self.BufferImg = wxEmptyBitmap(size[0], size[1]) self.BufferDC = wxMemoryDC() self.BufferDC.SelectObject( self.BufferImg ) ! ! self.Table.ResetView() ! self.AdjustScrollbars() ########################################################################################################### --- 305,509 ---- dc.Clear() ! # Draw the selection ! self.DrawSelection(dc) ! # Draw space where col + row labels cross ! self.DrawColRowCross(dc) # Draw the col labels ! self.DrawColLabels(dc) ! # Draw the row labels ! self.DrawRowLabels(dc) ! ! # Draw grid ! self.DrawGrid(dc) ! ! dc.EndDrawing() ! w, h = dc.GetSizeTuple() ! ondc = wxPaintDC(self) ! self.PrepareDC(ondc) ! ondc.BeginDrawing() ! ondc.Blit(0, 0, w, h, dc, 0, 0 ) ! ondc.EndDrawing() ! except: ! pass ! ! ########################################################################################################### ! ! def DrawSelection(self, dc): ! dc.SetPen( self.DrawTools['HighlightOutline'] ) ! dc.SetBrush( self.DrawTools['HighlightColor'] ) ! ! if self.Selection['Set'] != []: ! sel = self.Selection['Set'] ! width = self.Table.GetRowLabelSize() ! for col in range(self.Table.GetNumberCols()): ! width = width + self.Table.GetColSize(col) ! ! y = self.Table.GetColLabelSize() ! for row in range(self.Table.GetNumberRows()): ! if row in sel: ! dc.DrawRectangle( 2, ! y + 2, ! width - 4, ! self.Table.GetRowSize(row) - 4) ! ! y = y + self.Table.GetRowSize(row) ! ########################################################################################################### ! ! def DrawColRowCross(self, dc): ! rect = wxRect( 0, ! 0, ! self.Table.GetRowLabelSize(), ! self.Table.GetColLabelSize() ) ! ! self.Draw3DLabel(dc, rect) ! ! ########################################################################################################### ! ! def DrawColLabels(self, dc): ! cols = range(self.Table.GetNumberCols()) ! ! dc.SetTextForeground( self.DrawTools['LabelFontColor'] ) ! dc.SetFont( self.DrawTools['LabelFont'] ) ! x = self.Table.GetRowLabelSize() ! y = self.Table.GetColLabelSize() ! ! for col in cols: ! ! rect = wxRect( x, ! 0, ! self.Table.GetColSize(col), ! y ) ! ! x = x + rect.width ! ! self.Draw3DLabel(dc, rect) ! ! dc.DrawText( self.Table.GetColLabelValue(col), ! rect.x + 4, ! rect.y + 2 ) ! ! ########################################################################################################### ! def DrawRowLabels(self, dc): ! rows = range(self.Table.GetNumberRows()) ! y = self.Table.GetColLabelSize() ! ! for row in rows: ! dc.DrawBitmap( self.DrawTools['ArrowBitmap'], 0, y, true ) ! y = y + self.Table.GetRowSize(row) ! ! ########################################################################################################### ! def DrawGrid(self, dc): ! rows = range(self.Table.GetNumberRows()) ! cols = range(self.Table.GetNumberCols()) ! ! x = self.Table.GetRowLabelSize() ! y = self.Table.GetColLabelSize() ! ! for row in rows: ! for col in cols: ! rect = wxRect( x, ! y, ! self.Table.GetColSize(col), ! self.Table.GetRowSize(row) ) ! x = x + rect.width ! ! rend = self.Table.GetCellRenderer(row, col) ! rend.Draw( self, ! None, ! dc, ! rect, ! row, ! col, ! true ) ! ! x = self.Table.GetRowLabelSize() ! y = y + rect.height ! ! ########################################################################################################### ! ! def Draw3DLabel(self, dc, rect): ! # White lines ! dc.SetPen( self.DrawTools['LabelOutlineC1'] ) ! dc.DrawLine( rect.x, ! rect.y, ! rect.x, ! rect.y + rect.height - 1 ) ! ! dc.DrawLine( rect.x, ! rect.y, ! rect.x + rect.width - 1, ! rect.y ) ! ! # Grey lines ! dc.SetPen( self.DrawTools['LabelOutlineC2'] ) ! dc.DrawLine( rect.x + 1, ! rect.y + rect.height - 2, ! rect.x + rect.width, ! rect.y + rect.height - 2 ) ! ! dc.DrawLine( rect.x + rect.width - 2, ! rect.y + 1, ! rect.x + rect.width - 2, ! rect.y + rect.height - 1 ) ! ! # Black lines ! dc.SetPen( self.DrawTools['LabelOutlineC3'] ) ! dc.DrawLine( rect.x + rect.width - 1, ! rect.y, ! rect.x + rect.width - 1, ! rect.y + rect.height ) ! ! dc.DrawLine( rect.x, ! rect.y + rect.height - 1, ! rect.x + rect.width, ! rect.y + rect.height - 1 ) ! ! # Fill ! dc.SetPen( wxTRANSPARENT_PEN ) ! dc.SetBrush( self.DrawTools['LabelFill'] ) ! dc.DrawRectangle( rect.x + 1, ! rect.y + 1, ! rect.width - 3, ! rect.height - 3 ) + ########################################################################################################### + + def GetCellValue(self, row, col): + return self.Table.GetValue(row, col) + + ########################################################################################################### def OnSize(self, evt): ! cols = range(self.Table.GetNumberCols()) ! rows = range(self.Table.GetNumberCols()) ! ! width = self.Table.GetRowLabelSize() ! height = self.Table.GetColLabelSize() ! ! for col in cols: ! width = width + self.Table.GetColSize(col) ! ! for row in rows: ! height = height + self.Table.GetRowSize(row) ! ! self.SetVirtualSize( wxSize(width + 8, height) ) ! ! self.BufferImg = wxEmptyBitmap(width, height) self.BufferDC = wxMemoryDC() self.BufferDC.SelectObject( self.BufferImg ) ! ########################################################################################################### *************** *** 323,331 **** def OnColSize(self, evt): ! self.Table.ResetView() ! self.AdjustScrollbars() def Destroy(self, evt = wxCloseEvent()): self.Table.Destroy() self.Updater.Shutdown() ! wxGrid.Destroy(self) --- 511,520 ---- def OnColSize(self, evt): ! pass ! #self.Table.ResetView() ! #self.AdjustScrollbars() def Destroy(self, evt = wxCloseEvent()): self.Table.Destroy() self.Updater.Shutdown() ! wxScrolledWindow.Destroy(self) |
From: <sir...@us...> - 2003-02-28 21:31:58
|
Update of /cvsroot/btplusplus/BT++/src/Images In directory sc8-pr-cvs1:/tmp/cvs-serv28244/src/Images Modified Files: Grid_Arrow.gif Log Message: The grid has been replaced by a class derived fro wxScrolledWindow, implementing everything by hand in Python and using double buffering. Not everything is working yet(but most of it) and the buffering is not yet working correctly. But flickering is already reduced and since I now paint the whole thing myself I can make(have made) it look better than the standard wxWindows grid. Index: Grid_Arrow.gif =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/Images/Grid_Arrow.gif,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 Binary files /tmp/cvstcIgMB and /tmp/cvseFsYh3 differ |
From: <sir...@us...> - 2003-02-28 21:31:58
|
Update of /cvsroot/btplusplus/BT++/src In directory sc8-pr-cvs1:/tmp/cvs-serv28244/src Modified Files: Images.py Log Message: The grid has been replaced by a class derived fro wxScrolledWindow, implementing everything by hand in Python and using double buffering. Not everything is working yet(but most of it) and the buffering is not yet working correctly. But flickering is already reduced and since I now paint the whole thing myself I can make(have made) it look better than the standard wxWindows grid. Index: Images.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/Images.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** Images.py 22 Feb 2003 20:59:14 -0000 1.4 --- Images.py 28 Feb 2003 21:31:53 -0000 1.5 *************** *** 468,487 **** 'Grid_Arrow': ! 'x\xda\x01\x7f\x01\x80\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\ ! \x19\x00\x00\x00\x12\x08\x06\x00\x00\x00\xae.u\xa0\x00\x00\x00\x04sBIT\x08\ ! \x08\x08\x08|\x08d\x88\x00\x00\x016IDATx\x9c\xb5\xd4\xb1K\xc3@\x14\x06\xf0/\ ! \xa5J\xd0\xa4\t\xc8\x15\xb4\x82\x12\x07\xe9\xa6[\xbb\x94:u\xd31K\x07\xc1\xc1\ ! \xbf\xc8\xbdC\x11\xc1\xa9\xe0\xd2\xad\xb84\x90\xa5\x9b\xb8\x04\x84\xda%dH\ ! \xedtD\xe2t5\xad\xcd\xd5w\x90\xb7\xbd\xe1}\xbf{7<\xcd\xb6m\x14]\xa5\xc2\x05\ ! \x15\xa4\xd6\xaa\xa7\x85#\x87\x86I\x86\xfe\x85dC\x93j\tIs\x97\x04\xe5"\xd9\ ! \x10\xe6X+\xfdI\xe3\x98\x04\xe5"\xeb\xc1\xa6\xcbPk\xd5\xd30\x88\xc9\x90\xf4\ ! \xbbDH\x18\xc4\xa8\x1c\x990]\x06\x00\xf8\xf0\xa6$H\x8a\x88\x10\x11,\xa0\xf2\ ! \x98\xaf@bK%$\x1bR\x1esT\xde\x13\x1c\x18\xbf\xfd\xce\xdc\xc2\xb0\xdd_\xe2y\ ! \x90\x14\x19\xb6\xfb\x00\x00\xdd\xe78s\xcf\xf1|\xff\x84h1\x85\xees\x9c\xde]\ ! \xe2\xe5\xfa\x01\x9dQ\x17\xf3\xd9\x17t\x9f\xe3\xf3\xf5M##\x9dQ\x17|\x10!\x0c\ ! b|\x1b{h>\xde@\xf79\xf6\xaf\x9c?\xc0\xa4\xe7m\x04\xb6"|\x10a\xd2\xf34\xe6X\ ! \xcb\r\xc2 &\x01[\x91\xec\xb0\x08c\x8eE\x02\xa4\xc8\xfap\xb6\xa7\x00\x00\xa0\ ! QO\xfd\xc5m#\xdd\xf4\x08Y)\x9dz\n\x00(l\xa2R?<\xf6\x9d:\xf2.y\xb0\x00\x00\ ! \x00\x00IEND\xaeB`\x82\x15.\xa6\xa4' , } --- 468,487 ---- 'Grid_Arrow': ! 'x\xda\x01\x87\x01x\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x19\ ! \x00\x00\x00\x16\x08\x06\x00\x00\x005\xbf7\xb6\x00\x00\x00\x04sBIT\x08\x08\ ! \x08\x08|\x08d\x88\x00\x00\x01>IDATx\x9c\xe5\xd5\xb1K\xc3@\x14\x06\xf0/\xa5J\ ! \xd0\xa4\tH\x04\xad\xa0\xc4A\xba\xe9\xd6.\xa5N\xddt\xcc\xd2Ap\xf0/r\xefPDp*\ ! \xb8t+.\rd\xe9&.\x01\xa1v\t\x19R\x9d\x8eH\x9c\xae^ks\xf5\x1d\x04\x04\xdf\xf6\ ! \x86\xfb~\xf7n\xb8\xa7\xd9\xb6\x8d\xa2\xabT\xb8\xf0\xbf\x91j\xb3\x96\x15\x8e\ ! \xec\x19&\x19\xfa\x15"\x86\xa6\xbb%\xa4\x8dM\x12\x94\x8b\x88!\x8ek-\xf4\x87\ ! \xf5\x03\x12\x94\x8b,\x07\x9b\x9e\x83j\xb3\x96EaB\x86\xa4\xcf\xc5C\xa20Ae\ ! \xdf\x84\xe99\x00\x80W\x7fB\x82\xa4\x08\x0f\xe1\xc1\x1c*\x8f\xd8\x02\xc4\xa7\ ! TB\xc4\x90\xf2\x88\xa1\xf2\x92b\xc7\xf8\xee7f\x16\x06\xad\xde\x1c\xcf\x83\ ! \xa4\xc8\xa0\xd5\x03\x00\xe8\x01\xc3\xb1w\x82\x87\x9b{\xc4\x1f\x13\xe8\x01\ ! \xc3\xd1\xf5\x19\x1e/n\xd1\x1ev0\x9b\xbeC\x0f\x18\xde\x9e\x9e52\xd2\x1ev\xc0\ ! \xfa1\xa20\xc1\xa7\xb1\x85\xc6\xdd%\xf4\x80a\xfb\xdc\xfd\x01\x8c\xbb\xfeJ`-\ ! \xc2\xfa1\xc6]_s\\k>A\x14&$`-"\x1e\xe6a\x8ek\x91\x00)\xb2|X\xec)\x00\x00h\ ! \xd4\xa5uzU\xcfV]BVJ_=\x05\x00\x14&Q\xa9\xbf\xb9\xb4T\xea\x0b\x9e*\x9dB\x02?\ ! \xae\xa0\x00\x00\x00\x00IEND\xaeB`\x82!\xe0\xa4\xd4' , } |
From: <sir...@us...> - 2003-02-28 21:28:38
|
Update of /cvsroot/btplusplus/BT++/src In directory sc8-pr-cvs1:/tmp/cvs-serv26539/src Modified Files: WT++.py Log Message: You can now enter 'exit' or 'quit' on the commandline of WT++ to stop the server. Index: WT++.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/WT++.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** WT++.py 25 Feb 2003 23:43:16 -0000 1.1 --- WT++.py 28 Feb 2003 21:28:33 -0000 1.2 *************** *** 10,13 **** --- 10,20 ---- assert version >= '2', "Install Python 2.0 or greater" + def evalinput(): + while 1: + x = raw_input() + if x == "exit" or x == "quit": + # Is this save?? + BTWait.set() + if __name__ == '__main__': # Change to the directory of BT++ *************** *** 26,33 **** print ("Started") ! httpd = BTWebServer() httpdth = Thread(target = httpd.server) httpdth.setDaemon(1) httpdth.start() BTWait.wait() - \ No newline at end of file --- 33,44 ---- print ("Started") ! httpd = BTWebServer() httpdth = Thread(target = httpd.server) httpdth.setDaemon(1) httpdth.start() + + inthr = Thread(target = evalinput) + inthr.setDaemon(1) + inthr.start() + BTWait.wait() |
From: <sir...@us...> - 2003-02-28 21:25:44
|
Update of /cvsroot/btplusplus/BT++ In directory sc8-pr-cvs1:/tmp/cvs-serv25133 Added Files: run_wt.bat run_bt.bat build_wt.bat build_bt.bat Removed Files: run.bat build.bat Log Message: Renamed/added scripts for running and building BT++/WT++. --- NEW FILE: run_wt.bat --- @ECHO OFF cd src python "WT++.py" cd .. --- NEW FILE: run_bt.bat --- @ECHO OFF cd src python "BT++.py" cd .. --- NEW FILE: build_wt.bat --- @ECHO ON cd src python Build_WT.py py2exe --dist-dir "..\build" --force --console -O2 cd .. @ECHO OFF rd /Q /S "src\build" --- NEW FILE: build_bt.bat --- @ECHO ON cd src python Build_BT.py py2exe --icon Images/Icon.ico --dist-dir "..\build" --force --windows -O2 cd .. @ECHO OFF rd /Q /S "src\build" --- run.bat DELETED --- --- build.bat DELETED --- |
From: <sir...@us...> - 2003-02-28 21:25:41
|
Update of /cvsroot/btplusplus/BT++/src In directory sc8-pr-cvs1:/tmp/cvs-serv25133/src Added Files: Build_WT.py Build_BT.py Removed Files: Build.py Log Message: Renamed/added scripts for running and building BT++/WT++. --- NEW FILE: Build_WT.py --- from distutils.core import setup from Version import CurrentVersion import py2exe setup( name='WT++', version=CurrentVersion, author='Tobias \'Belgabor\' Minich', author_email='bel...@us...', url='http://www.sf.net/projects/bt++/', scripts=['WT++.py'] ) --- NEW FILE: Build_BT.py --- from distutils.core import setup from Version import CurrentVersion import py2exe setup( name='BT++', version=CurrentVersion, author='Florian \'SirElvis\' Wagner', author_email='flo...@gm...', url='http://www.sf.net/projects/bt++/', scripts=['BT++.py'] ) --- Build.py DELETED --- |
From: <bel...@us...> - 2003-02-27 00:44:44
|
Update of /cvsroot/btplusplus/BT++/src/WebServer In directory sc8-pr-cvs1:/tmp/cvs-serv25717/src/WebServer Modified Files: BTWebServer.py HTTPConfigFile.py Added Files: README.htmltmpl htmltmpl.py Log Message: HTML Templates for Torrent view and Log, ETA for Loaders --- NEW FILE: README.htmltmpl --- htmltmpl ======== A Python based templating engine for separation of code and HTML. To run the regression tests (recommended): python test.py To install the module: (become root) python setup.py install Documentation can be found in the 'doc' directory or at the homepage of this module: http://htmltmpl.sourceforge.net/ AUTHOR: Tomas Styblo, tr...@cp... LICENSE: GNU GPL (included in file "LICENSE") --- NEW FILE: htmltmpl.py --- """ A templating engine for separation of code and HTML. The documentation of this templating engine is separated to two parts: 1. Description of the templating language. 2. Documentation of classes and API of this module that provides a Python implementation of the templating language. All the documentation can be found in 'doc' directory of the distribution tarball or at the homepage of the engine. Latest versions of this module are also available at that website. You can use and redistribute this module under conditions of the GNU General Public License that can be found either at [ http://www.gnu.org/ ] or in file "LICENSE" contained in the distribution tarball of this module. [...1441 lines suppressed...] """ def __init__(self, error): """ Constructor. @hidden """ Exception.__init__(self, "Htmltmpl error: " + error) class PrecompiledError(Exception): """ This exception is _PRIVATE_ and non fatal. @hidden """ def __init__(self, template): """ Constructor. @hidden """ Exception.__init__(self, template) Index: BTWebServer.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/WebServer/BTWebServer.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** BTWebServer.py 26 Feb 2003 01:12:05 -0000 1.2 --- BTWebServer.py 27 Feb 2003 00:44:40 -0000 1.3 *************** *** 3,7 **** from HTTPConfigFile import HTTPConfig from threading import Event ! from os import listdir, path, chdir, mkdir from TabTrans.LoaderManager import LoaderManager from urlparse import urlparse --- 3,7 ---- from HTTPConfigFile import HTTPConfig from threading import Event ! from os import listdir, path, chdir, mkdir, remove from TabTrans.LoaderManager import LoaderManager from urlparse import urlparse *************** *** 10,13 **** --- 10,14 ---- from time import sleep, localtime, strftime from BTConstants import * + from htmltmpl import TemplateManager, TemplateProcessor import socket *************** *** 83,86 **** --- 84,97 ---- BTWait = Event() + try: + remove("WebTemplates/torrent.tmplc") + except: + pass + templateTorrent = TemplateManager().prepare("WebTemplates/torrent.tmpl") + try: + remove("WebTemplates/log.tmplc") + except: + pass + templateLog = TemplateManager().prepare("WebTemplates/log.tmpl") ########################################################################################################### *************** *** 92,96 **** def WebLogit(a, loglevel = LOG_INFO): if loglevel >= int(HTTPConfig.Get('Display', 'LogLevel')): ! WebLog.append(strftime("[%a, %d %b %Y %H:%M:%S]_", localtime()) + str(loglevel) + '_' + a) if len(WebLog) > int(HTTPConfig.Get('Display', 'LogCount')): WebLog.pop() --- 103,123 ---- def WebLogit(a, loglevel = LOG_INFO): if loglevel >= int(HTTPConfig.Get('Display', 'LogLevel')): ! log = {} ! log['TimeCode'] = strftime("[%a, %d %b %Y %H:%M:%S]", localtime()) ! log['LogLevel'] = loglevel ! log['LogLevelTrivial'] = false ! log['LogLevelInfo'] = false ! log['LogLevelError'] = false ! log['LogLevelCritical'] = false ! if loglevel == LOG_TRIVIAL: ! log['LogLevelTrivial'] = true ! elif loglevel == LOG_INFO: ! log['LogLevelInfo'] = true ! elif loglevel == LOG_ERROR: ! log['LogLevelError'] = true ! else: ! log['LogLevelCritical'] = true ! log['Entry'] = a ! WebLog.append( log ) if len(WebLog) > int(HTTPConfig.Get('Display', 'LogCount')): WebLog.pop() *************** *** 158,182 **** if self.requested == 'torrents': if result['command']=='Pause': ! if result['seed']=='0': BTHandler.Loaders[int(result['nr'])-1].PauseDownload() ! else: ! BTHandler.Seeds[int(result['nr'])-1].PauseDownload() elif result['command']=='Resume': ! if result['seed']=='0': BTHandler.Loaders[int(result['nr'])-1].StartDownload() ! else: ! BTHandler.Seeds[int(result['nr'])-1].StartDownload() elif result['command']=='MoveUp': c = int(result['nr']) ! if result['seed']=='0': ! BTHandler.Move(c-1, c-2) ! else: ! BTHandler.MoveSeed(c-1, c-2) elif result['command']=='MoveDown': c = int(result['nr']) ! if result['seed']=='0': ! BTHandler.Move(c-1, c) ! else: ! BTHandler.MoveSeed(c-1, c) elif result['command']=='Add': url = result['torr'] --- 185,209 ---- if self.requested == 'torrents': if result['command']=='Pause': ! # if result['seed']=='0': BTHandler.Loaders[int(result['nr'])-1].PauseDownload() ! # else: ! # BTHandler.Seeds[int(result['nr'])-1].PauseDownload() elif result['command']=='Resume': ! # if result['seed']=='0': BTHandler.Loaders[int(result['nr'])-1].StartDownload() ! # else: ! # BTHandler.Seeds[int(result['nr'])-1].StartDownload() elif result['command']=='MoveUp': c = int(result['nr']) ! # if result['seed']=='0': ! BTHandler.Move(c-1, c-2) ! # else: ! # BTHandler.MoveSeed(c-1, c-2) elif result['command']=='MoveDown': c = int(result['nr']) ! # if result['seed']=='0': ! BTHandler.Move(c-1, c) ! # else: ! # BTHandler.MoveSeed(c-1, c) elif result['command']=='Add': url = result['torr'] *************** *** 254,314 **** def send_torrents(self): ! ret = "<html>\n<head>\n<title>WebTorrent++ Download Status</title>\n" ! ret = ret + "<META HTTP-EQUIV=\"Refresh\" CONTENT=\""+HTTPConfig.Get('Display', 'Refresh')+"\">\n" ! ret = ret + "</head>\n<body bgcolor=#%s>" % HTTPConfig.Get('WebColors','TorrBackground') ! if BTHandler.Loaders: ! ret = ret + "<table border=1 width=100% cellpadding=3>\n<tr bgcolor=#DDDDDD><th colspan=2>Incomplete</th><th align=left>File</th><th>Size</th><th>Transfered</th><th>Speed</th><th>Status</th><th width=15%>Progress</th><th>Remaining</th></tr>\n" ! c = 0 ! for loader in BTHandler.Loaders: ! c = c + 1 ! if loader.IsFinished(): ! ret = ret + "<tr bgcolor=#%s>" % HTTPConfig.Get('WebColors','TorrFinished') ! if c <= Config.Get('Download', 'MaxSimDown'): ! ret = ret + "<tr bgcolor=#%s>" % HTTPConfig.Get('WebColors','TorrAuto') ! else: ! ret = ret + "<tr bgcolor=#%s>" % HTTPConfig.Get('WebColors','TorrNonAuto') ! if loader.Info['Status']!='Paused': ! cc = 'Pause' ! else: ! cc = 'Resume' ! ret = ret + "<form method=\"POST\" action=\"torrents\"><td>" ! ret = ret + "<button type=submit name=command value=%s>%s</button></td><td>" % (cc,cc) ! if c == 1: ! cc = 'DISABLED' ! else: ! cc = '' ! ret = ret + "<table><tr><td><button type=submit name=command %s value=MoveUp style=\"font-size:xx-small; font-weight:bold\">↑</button></td></tr>" % (cc) ! if c == len(BTHandler.Loaders): ! cc = 'DISABLED' ! else: ! cc = '' ! ret = ret + "<tr><td><button type=submit name=command %s value=MoveDown style=\"font-size:xx-small; font-weight:bold\">↓</button></td></tr></table>" % (cc) ! ret = ret + "<input type=hidden name=seed value=0><input type=hidden name=nr value=%d>" % (c) ! ret = ret + "</td></form>" ! ret = ret + "<td align=left>" + loader.Config['File'] + "</td>" ! ret = ret + "<td align=center>" + ('%.2f MB' % (loader.Config['Size'] / 1024 / 1024)) + "</td><td align=center>" ! if loader.Info['FractionDone'] == -1: ! ret = ret + '?' ! else: ! ret = ret + ('%.2f MB' % (loader.Info['FractionDone'] * loader.Config['Size'] / 1024 / 1024)) ! ret = ret + "</td><td align=center>" + ('%.1f / %.1f' % (loader.Info['SpeedDown'], loader.Info['SpeedUp'])) + "</td>" ! ret = ret + "<td align=center>" + loader.Info['Status'] ! ret = ret + "</td><td><table width=100% bordercolor=#0000BB border=1><tr><td><table width=100% height=100%><tr>" ! if loader.Info['Status']=='Hashing': ! c1='#FF0000' ! c2='#0000FF' ! else: ! c1='#00FF00' ! c2='#FF0000' ! if loader.Info['FractionDone'] == -1: ! ret = ret + '<td bgcolor=#0000FF width=100%> </td>' ! else: ! ret = ret + ('<td bgcolor=%s width=%d%%> </td><td bgcolor=%s width=%d%%> </td>' % (c1, loader.Info['FractionDone']*100, c2, loader.Info['FractionRemain']*100)) ! ret = ret + "</tr></table></td></tr></table></td>" ! ret = ret + ('<td align=center>%.1f%% [%.2f MB]</td>' % (loader.Info['FractionRemain'] * 100, loader.Info['FractionRemain'] * loader.Config['Size'] / 1024 / 1024)) ! ret = ret + "</tr>\n" ! ret = ret + "</table>\n" ! else: ! ret = ret + "<p> No Torrents" ## if BTHandler.Seeds: ## ret = ret + "<p><table border=1 width=100% cellpadding=3>\n<tr bgcolor=#DDDDDD><th colspan=2>Seeds</th><th align=left>File</th><th>Size</th><th>Status</th><th>Speed</th></tr>\n" --- 281,409 ---- def send_torrents(self): ! tproc = TemplateProcessor() ! tproc.set("refresh", str(HTTPConfig.Get('Display', 'Refresh'))) ! LoaderInfos = [] ! c = 0 ! for loader in BTHandler.Loaders: ! LoaderInfo = {} ! c = c + 1 ! if loader.Info['Status']!='Paused': ! LoaderInfo['Command'] = 'Pause' ! else: ! LoaderInfo['Command'] = 'Resume' ! LoaderInfo['FileName'] = loader.Config['File'] ! LoaderInfo['Status'] = loader.Info['Status'] ! LoaderInfo['Hashing'] = (loader.Info['Status']=='Hashing') ! LoaderInfo['Finished'] = loader.IsFinished() ! LoaderInfo['Auto'] = (c <= Config.Get('Download', 'MaxSimDown')) ! LoaderInfo['Preparing'] = (loader.Info['FractionDone'] == -1) ! LoaderInfo['PercentDone'] = '%d' % (loader.Info['FractionDone']*100) ! LoaderInfo['PercentLeft'] = '%d' % (loader.Info['FractionRemain']*100) ! LoaderInfo['PercentDonePrec'] = '%.1f' % (loader.Info['FractionDone']*100) ! LoaderInfo['PercentLeftPrec'] = '%.1f' % (loader.Info['FractionRemain']*100) ! LoaderInfo['FileSize'] = '%.2f MB' % (loader.Config['Size'] / 1024 / 1024) ! if loader.Info['FractionDone'] == -1: ! LoaderInfo['FileSizeDone'] = '?' ! LoaderInfo['FileSizeLeft'] = LoaderInfo['FileSize'] ! else: ! LoaderInfo['FileSizeDone'] = ('%.2f MB' % (loader.Info['FractionDone'] * loader.Config['Size'] / 1024 / 1024)) ! LoaderInfo['FileSizeLeft'] = ('%.2f MB' % (loader.Info['FractionRemain'] * loader.Config['Size'] / 1024 / 1024)) ! LoaderInfo['SpeedDown'] = '%.1f' % loader.Info['SpeedDown'] ! LoaderInfo['SpeedUp'] = '%.1f' % loader.Info['SpeedUp'] ! LoaderInfo['ETA'] = loader.Info['ETA'] ! LoaderInfos.append(LoaderInfo) ! tproc.set("Loaders", LoaderInfos) ! self.wfile.write(tproc.process(templateTorrent)) ! ! ! ## ret = "<html>\n<head>\n<title>WebTorrent++ Download Status</title>\n" ! ## ret = ret + "<META HTTP-EQUIV=\"Refresh\" CONTENT=\""+HTTPConfig.Get('Display', 'Refresh')+"\">\n" ! ## ret = ret + "</head>\n<body bgcolor=#%s>" % HTTPConfig.Get('WebColors','TorrBackground') ! ## if BTHandler.Loaders: ! ## ret = ret + "<table border=1 width=100% cellpadding=3>\n<tr bgcolor=#DDDDDD><th colspan=2>Incomplete</th><th align=left>File</th><th>Size</th><th>Transfered</th><th>Speed</th><th>Status</th><th width=15%>Progress</th><th>Remaining</th></tr>\n" ! ## c = 0 ! ## for loader in BTHandler.Loaders: ! ## c = c + 1 ! ## if loader.IsFinished(): ! ## ret = ret + "<tr bgcolor=#%s>" % HTTPConfig.Get('WebColors','TorrFinished') ! ## if c <= Config.Get('Download', 'MaxSimDown'): ! ## ret = ret + "<tr bgcolor=#%s>" % HTTPConfig.Get('WebColors','TorrAuto') ! ## else: ! ## ret = ret + "<tr bgcolor=#%s>" % HTTPConfig.Get('WebColors','TorrNonAuto') ! ## ! ## # Buttons ! ## if loader.Info['Status']!='Paused': ! ## cc = 'Pause' ! ## else: ! ## cc = 'Resume' ! ## ret = ret + "<form method=\"POST\" action=\"torrents\"><td>" ! ## ret = ret + "<button type=submit name=command value=%s>%s</button></td><td>" % (cc,cc) ! ## if c == 1: ! ## cc = 'DISABLED' ! ## else: ! ## cc = '' ! ## ret = ret + "<table><tr><td><button type=submit name=command %s value=MoveUp style=\"font-size:xx-small; font-weight:bold\">↑</button></td></tr>" % (cc) ! ## if c == len(BTHandler.Loaders): ! ## cc = 'DISABLED' ! ## else: ! ## cc = '' ! ## ret = ret + "<tr><td><button type=submit name=command %s value=MoveDown style=\"font-size:xx-small; font-weight:bold\">↓</button></td></tr></table>" % (cc) ! ## ret = ret + "<input type=hidden name=seed value=0><input type=hidden name=nr value=%d>" % (c) ! ## ret = ret + "</td></form>" ! ## ! ## # Filename ! ## ret = ret + "<td align=left nowrap><table width=100%><tr><td>" + loader.Config['File'] + "</td></tr>" ! ## ret = ret + "<tr><td><table width=100% bordercolor=#0000BB border=1 cellspacing=0 cellpadding=0><tr><td><table width=100% height=100%><tr>" ! ## if loader.Info['Status']=='Hashing': ! ## c1='#CC6666' ! ## c2='#6666CC' ! ## else: ! ## c1='#66CC66' ! ## c2='#CC6666' ! ## if loader.Info['FractionDone'] == -1: ! ## ret = ret + '<td bgcolor=#6666CC width=100% style=\"font-size:2px\"> </td>' ! ## else: ! ## ret = ret + ('<td bgcolor=%s width=%d%% style=\"font-size:2px\"> </td><td bgcolor=%s width=%d%% style=\"font-size:2px\"> \0\0</td>' % (c1, loader.Info['FractionDone']*100, c2, loader.Info['FractionRemain']*100)) ! ## ret = ret + "</tr></table></td></tr></table></td></tr></table></td>" ! ## ! ## # Filesize ! ## ret = ret + "<td align=center>" + ('%.2f MB' % (loader.Config['Size'] / 1024 / 1024)) + "</td>" ! ## ! ## # Fraction Done ! ## ret = ret + "<td align=center>" ! ## if loader.Info['FractionDone'] == -1: ! ## ret = ret + '?' ! ## else: ! ## ret = ret + ('%.2f MB' % (loader.Info['FractionDone'] * loader.Config['Size'] / 1024 / 1024)) ! ## ret = ret + "</td>" ! ## ! ## # Speed ! ## ret = ret + "<td align=center>" + ('%.1f / %.1f' % (loader.Info['SpeedDown'], loader.Info['SpeedUp'])) + "</td>" ! ## ! ## # Status ! ## ret = ret + "<td align=center>" + loader.Info['Status'] +"</td>" ! ## ! ## # Progress ! #### ret = ret + "<td><table width=100% bordercolor=#0000BB border=1 cellspacing=0 cellpadding=0><tr><td><table width=100% height=100%><tr>" ! #### if loader.Info['Status']=='Hashing': ! #### c1='#FF0000' ! #### c2='#0000FF' ! #### else: ! #### c1='#00FF00' ! #### c2='#FF0000' ! #### if loader.Info['FractionDone'] == -1: ! #### ret = ret + '<td bgcolor=#0000FF width=100%> </td>' ! #### else: ! #### ret = ret + ('<td bgcolor=%s width=%d%%> </td><td bgcolor=%s width=%d%%> </td>' % (c1, loader.Info['FractionDone']*100, c2, loader.Info['FractionRemain']*100)) ! #### ret = ret + "</tr></table></td></tr></table></td>" ! ## ! ## # Rest ! ## ret = ret + ('<td><table width=100%%><tr><td align=center width=100%% nowrap>%.1f%% [%.2f MB]</td></tr>' % (loader.Info['FractionRemain'] * 100, loader.Info['FractionRemain'] * loader.Config['Size'] / 1024 / 1024)) ! ## ret = ret + '<tr><td align=center width=100%% nowrap>%s</td></tr></table></td>' % loader.Info['ETA'] ! ## ! ## ret = ret + "</tr>\n" ! ## ret = ret + "</table>\n" ! ## else: ! ## ret = ret + "<p> No Torrents" ## if BTHandler.Seeds: ## ret = ret + "<p><table border=1 width=100% cellpadding=3>\n<tr bgcolor=#DDDDDD><th colspan=2>Seeds</th><th align=left>File</th><th>Size</th><th>Status</th><th>Speed</th></tr>\n" *************** *** 352,357 **** ## ret = ret + s + "<br>" ## ret = ret + "</b></td></tr></table>" ! ret = ret + "</body>\n</html>\n" ! self.wfile.write(ret) def send_config(self): --- 447,452 ---- ## ret = ret + s + "<br>" ## ret = ret + "</b></td></tr></table>" ! ## ret = ret + "</body>\n</html>\n" ! ## self.wfile.write(ret) def send_config(self): *************** *** 409,415 **** def send_log(self): ! ret = "<html>\n<head>\n<title>WebTorrent++ Log</title>\n" ! ret = ret + "</head>\n<body bgcolor=#%s>\n" % HTTPConfig.Get('WebColors','LogBackground') ! ret = ret + "<h1>WebTorrent++ Log</h1>\n<table border=1 cellpadding=4>\n" t = WebLog[:] try: --- 504,508 ---- def send_log(self): ! tproc = TemplateProcessor() t = WebLog[:] try: *************** *** 417,425 **** except: pass ! for line in t: ! sp = str(line).split('_',2) ! ret = ret + "<tr bgcolor=#%s><td nowrap>%s</td><td width=100%%>%s</td></tr>\n" % (HTTPConfig.Get('WebColors','LogTable'+sp[1]), sp[0], sp[2]) ! ret = ret + "</table>\n</body>\n</html>" ! self.wfile.write(ret) --- 510,515 ---- except: pass ! tproc.set("Logs", t) ! self.wfile.write(tproc.process(templateLog)) Index: HTTPConfigFile.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/WebServer/HTTPConfigFile.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** HTTPConfigFile.py 26 Feb 2003 01:12:05 -0000 1.2 --- HTTPConfigFile.py 27 Feb 2003 00:44:40 -0000 1.3 *************** *** 22,36 **** 'MenuBackground': 'FFFFCC', 'MenuAddbar': 'FFCCCC', - 'TorrBackground': 'CCCC00', - 'TorrFinished': 'FFCCCC', - 'TorrAuto': 'CCFFCC', - 'TorrNonAuto': 'BFD8BC', 'ConfBackground': '6666AA', 'ConfTable': 'CCCCFF', - 'LogBackground': 'AA6666', - 'LogTable0': 'FFFF66', - 'LogTable1': '66DD66', - 'LogTable2': 'FF6666', - 'LogTable3': 'FF6666' } } --- 22,27 ---- |
From: <bel...@us...> - 2003-02-27 00:44:43
|
Update of /cvsroot/btplusplus/BT++/src/TabTrans In directory sc8-pr-cvs1:/tmp/cvs-serv25717/src/TabTrans Modified Files: Loader.py Log Message: HTML Templates for Torrent view and Log, ETA for Loaders Index: Loader.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/TabTrans/Loader.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** Loader.py 25 Feb 2003 23:43:16 -0000 1.4 --- Loader.py 27 Feb 2003 00:44:40 -0000 1.5 *************** *** 193,197 **** if timeEst != None: ! self.Info['TimeEst'] = timeEst if activity != None: --- 193,198 ---- if timeEst != None: ! self.Info['TimeEst'] = timeEst ! self.Info['ETA'] = self.ETA(timeEst) if activity != None: *************** *** 227,233 **** if d > 0: ! return '%d day %02d hour %02d min' % (d, h, m) if h > 0: ! return '%02d hour %02d min' % (h, m) else: return '%d min %02d sec' % (m, s) --- 228,234 ---- if d > 0: ! return '%d d %02d h %02d min' % (d, h, m) if h > 0: ! return '%02d h %02d min' % (h, m) else: return '%d min %02d sec' % (m, s) |
From: <bel...@us...> - 2003-02-27 00:44:43
|
Update of /cvsroot/btplusplus/BT++/src/WebTemplates In directory sc8-pr-cvs1:/tmp/cvs-serv25717/src/WebTemplates Added Files: log.tmpl torrent.tmpl Log Message: HTML Templates for Torrent view and Log, ETA for Loaders --- NEW FILE: log.tmpl --- <html> <head> <title>WebTorrent++ Log</title> </head> <body bgcolor=#AA6666> <h1>WebTorrent++ Log</h1> <table border=1 cellpadding=4> <TMPL_LOOP Logs> <TMPL_IF LogLevelTrivial> <tr bgcolor=#FFFF66> <TMPL_ELSE> <TMPL_IF LogLevelInfo> <tr bgcolor=#66DD66> <TMPL_ELSE> <tr bgcolor=#FF6666> </TMPL_IF> </TMPL_IF> <td nowrap><TMPL_VAR TimeCode></td> <td width=100%><TMPL_VAR Entry></td> </tr> </TMPL_LOOP> </table> </body> </html> --- NEW FILE: torrent.tmpl --- <html> <head> <title>WebTorrent++ Download Status</title> <META HTTP-EQUIV="Refresh" CONTENT="<TMPL_VAR refresh>"> </head> <body bgcolor=#CCCC00> <TMPL_UNLESS Loaders> <p> No Torrents <TMPL_ELSE> <table border=1 width=100% cellpadding=3> <tr bgcolor=#DDDDDD> <th colspan=2>Incomplete</th> <th align=left>File</th> <th>Status</th> <th>Downloaded</th> <th>Size</th> <th>Speed</th> <th>ETA</th> </tr> <TMPL_LOOP Loaders> <form method=POST action="torrents"> <input type=hidden name=nr value=<TMPL_VAR __PASS__>> <TMPL_IF Auto> <tr bgcolor=#CCFFCC> <TMPL_ELSE> <tr bgcolor=#BFD8BC> </TMPL_IF> <td><button type=submit name=command value=<TMPL_VAR Command>><TMPL_VAR Command></button></td> <td> <table> <tr> <td><button type=submit name=command <TMPL_IF __FIRST__>disabled</TMPL_IF> value=MoveUp style="font-size:xx-small; font-weight:bold">↑</button></td> </tr> <tr> <td><button type=submit name=command <TMPL_IF __LAST__>disabled</TMPL_IF> value=MoveDown style="font-size:xx-small; font-weight:bold">↓</button></td> </tr> </table> </td> <td align=left nowrap> <table width=100%> <tr> <td><TMPL_VAR FileName></td> </tr> <tr> <td> <table width=100% bordercolor=#0000BB border=1 cellspacing=0 cellpadding=0><tr><td> <table width=100% height=100%> <tr> <TMPL_IF Preparing> <td bgcolor=#6666CC width=100% style="font-size:2px"> </td> <TMPL_ELSE> <TMPL_IF Hashing> <td bgcolor=#CC6666 width=<TMPL_VAR PercentDone>% style="font-size:2px"> </td> <td bgcolor=#6666CC width=<TMPL_VAR PercentLeft>% style="font-size:2px"> </td> <TMPL_ELSE> <td bgcolor=#66CC66 width=<TMPL_VAR PercentDone>% style="font-size:2px"> </td> <td bgcolor=#CC6666 width=<TMPL_VAR PercentLeft>% style="font-size:2px"> </td> </TMPL_IF> </TMPL_IF> </tr> </table> </tr></td></table> </td> </tr> </table> </td> <td align=center><TMPL_VAR Status></td> <td align=center nowrap><TMPL_VAR FileSizeDone> [<TMPL_VAR PercentDonePrec>%]</td> <td align=center nowrap><TMPL_VAR FileSize></td> <td align=center nowrap><TMPL_VAR SpeedDown> <b>down</b><br> <TMPL_VAR SpeedUp> <b>up</b></td> <td align=center nowrap><TMPL_VAR ETA></td> </tr> </form> </TMPL_LOOP> </table> </TMPL_UNLESS> </body> </html> |
From: <bel...@us...> - 2003-02-27 00:43:10
|
Update of /cvsroot/btplusplus/BT++/src/WebTemplates In directory sc8-pr-cvs1:/tmp/cvs-serv25299/WebTemplates Log Message: Directory /cvsroot/btplusplus/BT++/src/WebTemplates added to the repository |