reorganising folders (all source in src)

--HG--
branch : sandbox
This commit is contained in:
Andreas
2009-12-06 21:39:04 +00:00
parent 9a37643343
commit 2a8a3db6e8
13 changed files with 7 additions and 7 deletions

365
src/gui/bottier.py Normal file
View File

@@ -0,0 +1,365 @@
# Copyright (c) 2008 Andreas Balogh
# See LICENSE for details.
""" decode ASCII greyscale """
# system imports
import Tkinter as Tk
import logging
from StringIO import StringIO
from PIL import Image
from PIL import ImageTk
# local imports
# constants
# globals
LOG = logging.getLogger()
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s.%(msecs)03i %(levelname).4s %(process)d:%(thread)d %(message)s',
datefmt='%H:%M:%S')
CODE = "#MWmBEKNQkAbqXHgUFRhdwp8&aDGVZ9utO03CYvlrI=i<7+?}(*[/|;!^-~`,:. "
def main():
tkis = []
# build gui
root = Tk.Tk()
root.title("bottier")
bu1 = Tk.Button(root, text='Quit', command= root.quit)
bu1.pack(side = Tk.BOTTOM, padx = 5, pady = 5)
for s in (PIC1, PIC2, PIC3, PIC4, PIC5):
im = ascii2img(s)
tki = ImageTk.PhotoImage(im, gamma = 2)
tkis.append(tki)
la = Tk.Label(root, image = tki)
la.pack(side = Tk.RIGHT, padx = 5, pady = 5)
root.mainloop()
root.destroy()
def ascii2img(s):
# create the image
# lines = StringIO(s).readlines()
# height = len(lines)
# width = len(lines[0])
# im = Image.new("L", (width, height))
im = Image.new("L", (100, 100))
for y, line in enumerate(StringIO(s)):
for x, c in enumerate(line):
im.putpixel((x, y), CODE.find(c) * 4)
bbox = im.getbbox()
bbim = im.crop(bbox)
imx2 = bbim.resize((bbox[2]*2, bbox[3]*2), Image.ANTIALIAS)
return imx2
PIC1 = """\
BEmmmBBBBBNNEBBEEKBBHd&aDGapHNBEBBBBEKBEmBBEBBKgdp8wdRbEBKEEEEENKQNAAbbXUp8aD9
BEBBBEKENNNEBEEKEEmAd8DZVG&RkEBmBBEEKBBBmmmmBBmbh&Da&wFQBmmmBmBmmmBWmmmBmmmBmm
mBBBBBEKNKKKKKKENBkh8VVZGDwXNEBBBEEBBBBBmWmmmmmEgwaDGDpFKBBmmmmmmWmWWmWWWWWmmW
EEBBKBEKNNKNEEEQEER&VZ99V8gNKBEBBEBEBBBmmmmmmmmWqh&DVGawqmEmBmmmmmBWmWWmWWMWWM
KEBKEEKNKKKKKNNNBqG9OOtuGhAKEEEEBBBBBBBBBmmBBBmmEgwaDaa8RNBBBmBBBmmmmWWmWMWWWM
BBBBENKQNKENNQNNmRu0003taXNKKEKEBEEBEBmmBBBmmBBmmNF8aDDawXKmWBBWBmmmMWWmWWWMMM
EKEBKNkQNKNNNNQNBRO333YO&bQNKKKKBBBmWMWWMWWmmmBmmWAR8VGG&hbBmWWmmmWWWWMMMMMMMM
NKEENAAkNKNkQNkKQ&3YYvvO&AKEEEBBmWWMMMMW#MMMMMMMMMWEgpGGDawbBBmBmBWmmWWWMWMWMM
NKEKkAkkKNKkQQkKXZClrIv3DbNEWMMMMM#MMM#MM#MMM#MMMMMMmNgZZGVwEmBmmmWmmmmmWWWMM#
QNQkkQQkNQQkkAkERtYr=Il3VHKWMMMMMMMMMM#M#MMWMMMMMMMMMEAdZVZREEmBBmmWmmmmmWWWMW
kbkbAkQkNQQAkkQEpOv=i=rY9hBWWMWMMMMMMWMMBABmWMMWWWWMWWN899VdKEEBBmmmWmBBmmmWWW
AbbbbkkkNQbbAQQNDCrii=Iv9dKmMMMMMMMMWWWmBXAKEmKghFQmMMBqVt9&QEEBBmBmmBBmmmmmmm
bqqXXAkQNAqqXbQAG3I<<iIvOpEWMMMMWMMWWmEAAwdHXdpwdhRNWmBKp3tDqEEBKmEBmBmmmmBmBm
qHgHHAbkkAXgHHAXZli7<i=l38EWWWMMMWmBAhhpwRdhRUgUgHHNmBQUCYOGUKEEBKBBBBBBBmmBBB
XggUUXbkAqgUUUkguli7<<ir3DKmMWWWWBkggHggqXXbXXqHgbbbbAXGYGO9dQEEEEBmEBBmmBBmBm
FhhRdFqqAqRRUFkFOr=<7<irCaNWmMWWmQqHbXggHFUddHgggHRgHFdOGaCt&ANNEmEBEmBBBBBmmB
UUFddhgbqgRFFUAR0ri<++iICDkmmmmmKAbURRgFa8DpRdRwRRdqbqUUdYv0GbKKEEEKKBEBBBBBmm
RFFdwpFXXUhdFUkhOIi77+<ICGQmmBKkUHHwgpR&hw8h&ahUqbqbg8Rd0lv3ZXKKKKKKKNKEEBEBBB
hhdhwwRgUhhdhFbh3=<++7<il9kBWmEbXgRRGDut0tuDVDwaagbHARw0IIr3ugQNNNKEENNKEBEBBm
8phhppwwdwwwhhqwYi7?+++7i0HEmBKbHhhZOO3v3u0O9VpDuaXUaOlIIIrCuUkNNQNKKKKEEBmEEB
aDDa&8pwpppppdXdvi7++???<YaXAQKEKKgGtO3Y33Y0tZGDuDhdZCI=IIlCuUkNQNNNKEEBBBEEEE
GVZVVVa&8w&&&8gwv<++?}}(+ICaHEEKEBNHwD900Cvvl0VaGwHwuv==I=IvtFkQkNQQNEEKKEEEBE
ZZt99OuVVGGGGaRdvi?}???}}<iC8NBKEBBba&aDDVVGa&wFbEA&Ori===rvtUkkQNNNNEKEKEEEEE
ttO0030uuu9ZZGahY<+?++?}}?+I0hKEmBENFVOrl3t&wRNBEKFD0IiiiIrvtgAkQNNNNNKEEEEEEE
3033YYY3C333OuVF3<}}+++}?}}7rOHBEEKkHaCiiI0DwkBmBBbVv=i===rvtgAkQQQQKNENKKKEKK
YYYvvrvvvlvrrrthZ<(?7+?+}?}?+lDQKBEQhaY==ru&XEBBBKptlrIlrIrYZHAkkQkQNNNNNKKNNN
Ylll===llr=I=Il9a=}(((((**[}?=OUkBBNUVli=twAKBBENUuvlrlvvrrCZXAkAkkkkQQQQNNKNN
I=II<7+=r=i=i=It&=([////*[}?}7IZUAkHUUlrY9dqXQKAdpZlrrvvYlrYaqAAAAbQkQQNQQQNKK
<77+}}}+7i7+77I0G7*/|;|||*?????ItG&wdGCCttDpRUh8030YI<rCCvl0RqqbbAbkkkkkkQNNNN
+??((((?+??+???OO}/;!;!;|}<+?}?7rCvvvlCC3COOO0ClI=Ili+irYvYVHqbbAbbQQkQQQQNNQQ
?(*[[/[*}}*(*(+Vr*/;!^^!*7<<?}?7<rvlrIrr=IllvvrIi=il=?<=rl3hXXHqbbbAAAAAkQkkQQ
([/;///|*[*(*}=V<*/;;;|(i=i7?}}}?+<<<<7+<7iI=i===iIYv7+iIltUHXXXqqbbAAAkkQQQQN
/;!^^!;^;!||[*r9?[|//*?II<7+?((???777+}(*(??++<<i=rvYI77rvZUHgHXXqXAAAkAkkkNNQ
;|^~-------^!!79+*/[(<==<<??}*[[**}??+***}}?++<<i=rY0trirvGgHHXXHXqAbbkAkkkkNQ
!-~~~`~~~```~~*t<(}}<rI=7?++}*|;|/[(+?*/[[(*}?+77i=C09uYlY&gXqXXXXqqbAkkkQNQNQ
~`,`~,,`::.:,:^tI+?<rvY7+7=lr<|^!;;[?+*|[*[***}?+7i<ltVZ30hHXXXXXbbbAkkkkkQkQN
,::::::..,:.::~CC<+<lr7}?rY3O9=!^!|[*(/||[//|[*(}?77r99Vu9RXXXXHXXbAAkkAQQNQNN
:.......:,`:.:,=0i77rr+?OZ&&aGO(^;|[([|;|////|/[*}+i0ui++=38Z&hgHHqbbbkAkQQQQN
....::..`,`,::`lOi+?7I=+3DD&Z8ZY///[[|!;!!;||||[[(+Y0=7++=p03Cu3Y0DUbAkkQNNQNk
....::,.:. `.:,<tr+}(+=rC8a&GY+////|;!!!!!;|/|||[*}IY33CYa0YviI0u33gkkQQkQNNNN
:.............:[Or<}}(}+=a37}(*[/|;!^!!;!;;/[[*(}+irrt8UgdD9ZutO00RAAkNkQNKKKK
,:::.:.:::.:,``v9l<?((*[*((*[/[/|!;|;!!;|//*(+7<=rYODapFgUHbQqhG9FbAQQkKNNNNKK
,`,`:::``,,~`-!Otl<?(*[///[/||||;!;||!||[((}?7ilY0t9uDRgggHHqqqqqbkkNkQQNNKKNN
!``~,,,----`~~-Z9ri+([[/[[[//||;;!;;;!|!//*(}?7=IlvC9hHgHgXbqqqbbAkQNNNKKKKKKK
/!!!!^^!|!;;!;*aVl<}*[[[**/|;;;!;;;|!;!//[(?++<iiIl0aFgggUHHbqqbAANkQNNNKEKEEK
}([;;|/;[/|/[[+pZv<?}(([(*[|;!!;||!|;;;!||[*+7<iirC9RFggUHHHXbbbkkNNQQKNEEEKKE
7?}**/*//|/[**?aGvi+?(*(**|;!;;!;/||;||;;/[*}+<IlY3GUgHHUHHqbbAkkkQkNNKKNKENEE
77++??}***((}(7&Dv=7?(**|||||;;;;;!|/|||||/*(?irYCtpgggUgXbHXAAAQkNKNNNNNNKKEE
I=<<i<<+++?+++<p&Oli+(*[[|||||/|;;;||||//**[*?irYOaFHHXHXXqXqAAkkQkQNKNNNEKEBE
rIIIIIi<7<=<77<p&tCI<?}([[[|//////|||//[[((}}+7ICZdXHXXXqbbbAbAkANQQNNQQQKEKEB
3ClrlI<<<r=<<7rh&tvri7?}***/**/[[[[**[(*((?+++iv9pUHXXqqbbbXAAAAkNQNQNNQNNKEKB
0Yrlvi<=i=rrI=ZRG0vI=<+?}?(***[((?}?((}}++77<=vupFqbXqAAkkkkkAkAkQkkQkNKNNKKEm
O0YCCIiIrvYY3VRau3r=i7+??}(***(*}?}}??+77<<=lCOGpUqbbbAbAAQQQkAkkkQQkNNNKNKKKE
tu0CCYrlllCODFaV3vIi<7++?}?}***(?7?}}?}<7iIrY3uVadqAbAAAbAkNQNQQQkQQNQQQNNQKKE
ZtO30YYY33OVU8ZuClI<7???}??((*(}<r=+++++<=rv30t9ZagqbAAAkkkkkQkQNNNKNNNNNKNNKK
DutOttu99u9Uq89O3vr<<777??}}(*(?7i<+7?7<iIlvYC0OuGdbbAbAAAkQNNNKNQKNKNNNNKNKKE
&DVV9GaDGDhBWmBkFVYIiii<77+?}((}}++++?7<=rYY00OOOZwAkQQAAkQNNKNNEEKNNKBKEEEEEE
d&aa8&8&8hNBBEBWBBEKXp90vll=i<i<i<i<i==lvC0OtuZagEMMNNkQkkQNNNNEKEEKEEKBBEKEBE
Rwppw&DDdAMWWWWBbAbXEkEEEEENbqHUhdd8wFFgqQNBBWWmmEBMBKNNQNNNNNKEKEKKEKBEBBBBmB
URwwpw&pqmWmNBBNEKbFQUqbFQUXAgNAkEkgXKBEBEENENKQKKW#MEQNQQNNNNEKEEKEBBBBEmmBBm
gRhdhRhqmQghqHQNBAKANHXkgkgHAhAHHQgQbqQqBkEKBNKQEBmmMMKNQQQNNKEKKEBBEBEBBBBmBm
gFFFRdwFkXaZOtuwgAQBBAAQXBbbKXEAqQXKAQQABQBNEBBNBmWENAkQNNQNNKEEEBBBBBBmBmBBBB
bgRRUhdFNUa9OYvlvpFbQWWmEQQKbXQEkkENbBmNEmEBmBWWkNkgawXNQQNNNKEENKBBEEBBmBmBmm
AAqXggHqKRDu0CvvvlvpKmQNNQkAbbbkAkQkQkNKKKNNNNKWBqGZG8gQKNbkKKKKEEEEEBWmBBBBmm
kkkAbAAKkwGt3YYlvYCdKNgDu9u99ttV99GVZG&D&&GVZ9ZkKGu99&RQNNNNNEEKKKEKEEBmmBBBBB
QKQQQkQEgaVt0CvvY3DKkV9u9uVVVtuu9ZVGDDDaDGZ99ut8Bqtt9DwbQNKKEKKEKKEEEEBBBmBEmm
NNENNQEAhGZOCvYvvtbN&u9VDa&DDVGGapp88p8p8&DZuO0tgK&ttV&gNNKNNKKEKKEKKBEBBBBBBB
NKKQQKKg8Duu0YvY3FNhuZVGD&ppwdhRggUUFUFdp&GuO00OZNNVuVahANKNNKEEEKEEEEBEBEmBBB
KKKKNBbR8GZt0YCCpNUttuZZG&hFHqbbbAAkqXgwaV99ttO0OwBXu9&wqNEKEKEEKKKKNKKEBEBEBB
KEEKEEXRpaVuO33VNqu0tuZVDadHAQKNNNNKNXhpDZZutOO00uABpVGwgNEKEEEEEKEEKEEBBBmmmE
NNEEWMBQFwaGuuaQku0t9ZVa&pRXEBmBWWBBQHRpDGuutOO000aEKaawqBEEEBBBEKKNKEKEEEEBmm
bkEEWWWWWWBQUgNbaOOOuZGDawUbKKNKNEmEbghw&DV9ttt0OO9XEghNWWEEEBBBBEENNKEEEEBBBB
AqkKmBmmmMmmmBmEbdGVGGG&8dgkNNQNNNEmAUhp&DGV99u9VV&HWWmmmWBEKBBEEKEKKEEEEEEBBB
7IYuG8wUHXqAQNKKNNENqRwdhFHNNKKNNNKmKXgRw&&&a8hbEBmmEBBBBmmBBEBEKBEEKEEEEBBBEm
"""
PIC2 = """\
*[}7[/*7+//|[i[/[(i+il0uDahFHXqqbAkkNEKkkNEEBmBBBKQkQAAQKBBEBBBEBENEKEKEEBEBBB
<<++??+?(}}?}??+i====Ii+([/[/|*(}??+7=ii=il3VdgbkkNQkQkkkkNNNNNQNKNNEQEmmEEEEm
<<77+++++?}???+<i=IrlI<7}[/|;/(*}?++7<===rY0GRqAAQkQkkkkkQkQQNKKEEKKEKBBEBEEBB
?+??++??????}?+7<=IrlrIi+([[[[[*}???+iIiIIvOaFXbkkkkNQkkkkkNQQQNKKNNNKKBEEEBmE
}}?}}?}}}((}(?777iIrlvri7}*[/[/**[(?7<ii=rYt&UHbkAkkkkAAAkKkQQNNNKKNNNEKEEEEEB
((((((}(}}??+++7<=rvlvlIi?(*[/*[**(??7==IrYt8gXbkbkkAAkkAAQAQNQQNNQQNNNKEEEEEm
*(((***}}}???7<<i=IIvllrIi+}*[/*[(}+<<i=rv3ZpUXbAAAkkAbAkkQkQQQQkQNKKKNKKEEEBW
[*****}}}???+++<==Irvvvvl=<7}((*((??+iiIrv0VwgqbAAAbAAbAAAkkkkkkQQQNKQNKBBEKKE
*}}**(((}}(+77<<<=IllvCCYlIi+?((??+++i==Il0VwHqbkkkAbAAAkkbkkkAAkkkQKKNKNNKEBB
/[**(}}}}?}++++7iIrrlv333CYli7?}(}++7<iirvOVwHbAAAbAkkkkkAkKQAAAkkkKKKKKKEEEBB
[(****((}??????7iIrlY330OO03ri<?}??+7i==rvtDhXbqbkkAAkkkkNNQQQQQQQQQNQNEEEEEKE
[(**[/[((*((??++<IrvvC3Otuut3lI<77+7<i==rYODhHqbAAAQQQQkkNNQNQkkQQQQKQQKKEBEEB
*[**[[[***((}}}?7=rrYC00Ot99O0Y=<<<<ii=Ir3u&FHXbkQkQQQQQkQkNNQkkkkkQkKKKNKKKKE
||[*[[**[[**}}??+<=llCC0Otuu9t0vlI=ii==rv0ZpUXbAkQNNNNNQkQQQQkkQQQQkKNKNNNNKKE
[|//[**[*(*}}}?++?<IilvY3Ou9ZZO0Cvr===lvY3DdgbAAbNQKKNkkQQQNQQkkQNKQkQkQQNEKKN
^!;||[*[[/[**(}}}++7<iIlCOu99ZVu0ClIIrrrvtaRXbbkQQNkQNNQkQNQkQkkQQQNQNNNKEKKEB
-!^!!||;//[**(??}}??+<irY3O99ZaG9t3YrrlvCt&FqbbkkNQkNNNQkQQNQQkQQkQNNENEEBEEBW
-^!^^!;;///[[*(((***??<Iv3u9ZVGDGu03CYYYOVdgqbkQkNNkNQkQNQNAQQQQNKKENEEKKKEEEB
~--^!;!!|||;|/[**[*(}?7=l0u9VZD&DVuO3YY3tGRXbAQNQQNkQQkQKKQkQQQkQNNQNKKKEEBBmK
`-~-^!!!!;;|/[[[***(*?+=v0tu9VGa&aZt03Y0t&hHbkkQQNNkNQQNNQkkAkAkNNNNNNEBBEBmBB
-~~~~-^^!;!||[[[[[***(+ilOZZuuuZVV9utOOuVpFHbkQNQNQNNQQNQkQAAkQQQkQQQNKEEBEEBE
,,`~~--^!^;!|||//[[*(}+ICuVuCr=rYC330Ou9VwhFHqAAQkkkkkkkQkAAbQQQQQNQNNNKEBEEEK
,```~~-^^;!;;/////[*(+<ltVZOr7}((}+7<irC0ZaphUqqXHHHXbkAbbAQAkQQQkkQQQNEEEKKBB
::`````---~^;|||[*(??<lOZZt3I7?*[////[}+i=Y09awdwaG&whFUgXXbkbAkQQQQkNNKKKEKEE
^:,``~~~~~^^^;||[*(?<r3u9u0v<((*/||//[/*(?7IOD8Dt33C0t9Ga8phFFgXqqbAQNKKKKKKEE
.. :,`-~^^-^;|||[(7rY0ut3v=}(*(/|////[/(}iO8d89YvvYvvYCC3OtZDaphUgHXkQNQQNKBE
[:::,`~~``--^!;|[(7IC003Y=7?(*//|||/[*[*}itphdDYiI303vlvYCvCCYC3t9ZDwFUHXbkNKK
,:.::,`~~`---!;|[}<l0CYvr<?}([[[/////*[}It&hpZCI=IC3Yrl39uO3lIii=IIrC3uVpFHANE
..:::::`~-~-^!;|[*?ilvvvr=<7}(([[*****}70&p89Y=ilCllIiICtu990vI=<7<=<==YOGRAKK
.,::::,`~~~--!;;/[(?iIvYvlrIII7?+}}}(?+Caw8ZC=iIvvI<++<=Iv0tttOYlI===irY3VFQKB
.::,::,`~~----^!;[(7==IrlvvvCvvllrrlrvOD8a9Yi<=vvl=i+}}?+<rCCtttO03vIrv0GRAKEW
`:,:,,```~-^^!!;[(+<++<=lYC303C03OtttuVDVu3Ii=lYvl=r=<7<i==rvCOu9Zu0333ZdqKEBB
:,```~~~^-!^;;|[*}+<+??7=vCOZGDVGGGVVVZttOCvvC3CrlO9u033OOtO0Otu99ut309hbNKEBB
,~------^!;;///*}?7<77+irYOZawwRFgHgFhp&aGZuuuO3COZVVZ999uuttOOOO0330ZdXQEBBBB
^^!^!!!^!|*[[((}?+<<iirlYO9apwwhHANKKNQAAUFhp&GGt9Zu0YvvYvvrrrlrlCC0ZRqNEEEKEE
!;;;||||/[*(?}+77i==rlY3tV8wwpdUHXbkQKNKKKEKQkbgRdp&Vt03YlII====IYOGFANEBBEEEm
;;|/[[[**}(+++7i=rlvY0uVD8wp&wdFHqqXXbAAAAKBmmmmWBQbgRpaG9tC3YvvCOGdXQEBBmBEBm
/**((}?}?++<<Irlv300uZD8p8aa&wUqXqqqbqbqqqbAQNKEmWMWmEKNbgUd&GZZZDhqQKEKKEBBmW
/((???++<<IIrlY30t9Vapp&aaDGwhHbAbbqXqbbXbqbAkAQKKBBWWWMWMmEkHRhFHbQQEBmEKEBBW
}}+7<<ii=rlYY3Otu9VGaDGVVGD8hgXbAAAbXqAqbqbkkAAQQQKBBBmmBBmEKkAbANNNEEEBBmWWWW
((+77<==IvvCCC0OOttZutu9ZG&dRgqbAAAAbqbbqkkkkAkkQQNKEKKKKKKENNQNNKEEBmmBmmmWWB
**}?+<<i=IllvYYYCCC333OuZDpFHqAAAqbAbbbbqAkkAAkQKKKEKNKEKKKNQQQNKEBBBWmmBBWWMW
/*}}?+<ii==rrlvvYYvYv0OuG8hgXbbkAbAAAAbbAkkkkAANKKKNNKKKKKKKKKNNEBBmWWWmmWMM#W
/[*((?777<===IrIIrrlC0tVadFHbbkAbqbAkkbAAkQkQNNKKQNKEKNKKKKKQNEEBmmmWWMWWMWWMM
[***(}?++7<i====I=IvCOuV8RgqbkAkAAkkkAbAQkQNQNNQQQNNEKKEKKKEEEEBmWWmmWmWWBBWEM
[[[***(}}}7<7<<i=IIv3tV&dUqbqAAAbbAkkAbAQQNNNNQQNNKKEEEKNKKKEBBBBBEBBmBmmWMMWN
[[[**(}(}}+?7<i==IrY39awRHbbbbbAbAAAAAAAkQQQkkkQNKNKKKKNKNNEEEBBEEBBWmmmWMWmWW
*[(*(}}(}?}?7<<i=rY3OZahUHXAAbAkAkkAAqbqqAAkkAAQQKKEKKNKKNKKEKEBBEKBWM#WmmmmWW
**(**(((}???<<<iIrv0uVpRgXXqqqqbAAbAAAAqqbAAkkQQNNNQQQNEBEBEEEEEBEEBMWMWWWWmmM
"""
PIC3 = """\
MMM#MM##MWMD{8M##MM####MMMMMM###M##M###MMM########M####MM##MMMMMMMMMMM#MMMWWMM
M#MMMMM#M@A=2WWMWWMMM##M#MMM#W##M######M##M#M##M##MM###MM##MMWMMMMMMW##M#MMMMM
MM##MWMBiW%oWMUmWWW@NM##MMWymM############M#MM###MM#MM##M#MMMMMMMMMMMW#MMMMMMM
WMMWqmWMMW=B#WiWM#B?8WMMWWXmWMM###M#####MMMM###MMMM#M#M##M#MMMMMMMMMWMMMMMWMMW
WWWgDD8@&9%#MBD####WWmmWWLmMW#MWM#####MWM#M#M##MM##M#MM#MMM#M#MMM#MWWMMMMMMWMM
mWWWWmQWWCWWMMM###MWWBWMWWmcvxFXmMMM#MMMMMM#MMMMM#M#MMM##M#MMMMMMMMMMMMMMMWWMM
MMMMMWWW$@#MMMM##M#WMW@WmAWi)77z@MMMMM##MM###M####MM##MM#M##MMMMMMMMMMWWMMMMWW
WWWWWWWMFWMMMMMM#MMMMMWWWWAB313QWMMMMMMMMM#MMM#####MMM#MMM#M#M#MMMMMMMWMMWMMBm
MWmWWWWMmMMMMMMMMM#M#M#kWWWMW<&WMMM##M#MM#M##M#MM#MMMMMWMMM#MMMM#MMMMMWMMMMMWW
WN,NMWWmW#WMWWMMMMMMMWWMM##MMW&@MMMMM#MMM#######MMM#M#M#M#MMMMFWMMMM#MWmMMMMWW
MMMMMMMMWMMMMMMMM#MMYmMMMMmmWMMMMMWMMMMMMM###M#MMMMM#####MMMM#MMMMMMMM<3MMMWWW
##MMMMMWWMMMMMWWWWWMMWMMMMMMWW##Xu3bmmWWWM#M#MMMMMMMMM##MMMM#M#MM#MMMMWMMMMMMM
MMWMM#MMW#MMWMMWWWWWWWMMWWMMM##MME%D=3@mWWMMMMMMMMWWMMMMMMM#M#MMMMM#MMMMMMMMWM
WMMMM#MMmWWmmMMWWWWWWAWMQWMMMMMMMM80/38NWWMMWMMMMMWmBWWM###MMMMMMMM#WMMWWWWMWM
M#MMWMMMMm8WWWWWMMWWWmWWMMMMM#MMWWWm<D<?8mMMMWMWMMM@@@mMWM#M#MMMMMWYY#MMMWMmWW
MMWWMWWWWm@mmmWWWWQWWMWWMWWMMMMMWW]))|'`)lmm@BWWWWmQXNm@QNmWMMM#MWMMMMMWMMMMWW
MWWWMMMWMWmWmmmmmWWWMWM#WMMWMMMMMMW<^))-~'':::'`?ocv2%d$k$QmMMMMMMMMMWMMMMMWWW
WWWMMMW#MMWmmmmWMMWWM#MMNU#MMMMMM#m?))|-':: '-^~-|7=Y9q8qkmWMMMWMMMMWWWMMMWMM
WM#MMMMMMWWWMWWWMWWWWMWWWWMWMMMMMW8||)-' .^~..')|?lzL8UqNmWMMMMMMMMMMMMMMMW
MMMMMMMMWWWWWWWWmmmOO988@@mNWmQbQW=)|"~:. '^:. :-)[iYOy&$kmWWMMMMMMMMMMMMMMM
#MMMWMWWWmmmmBBQmN&qA8eD9QAmWk@Q$<__[|': ._,:::~_/1v02DU$mmWMMMMMMMMMWWMMWM
WMMWWmWMWmWmmAREEby8&=3xqN@mMWMMN<|||-:... .:-)-;;"+<cj0L68bmmWMMMMMMWWBWWMWWW
##MMMMMMWMW@NF&@mmRkejv8BmWMMWWmm@O<?~:::::,-^|)/"]<1vvj26&bmmWMMMMMM#MWMMMM#W
MMMMMMM##MWm@gygNmAQ88&BM#MMMMMWWMMmv':.,~;|7|)||/"<ivY3xt&@mWM##MMM#MWMM#MMM#
M#MM##M##M###MMMMMWM###M#MMMMMM##MMMD`.:~_)+=7||"{+<1vvjtu&@@mMMMM##MMMMMMMMMM
M#M#######M##M####W###M#M##MM##M###MD:.::-_+7l/{[+<1olzY098N@mMMMMM#MMM#MMMM#M
M##M##M##M##M#M#M#W#M#MMMM#MMM###MMM&)~':'^_/7?|?711llv3xL8@QWM#M#M#MMMMMMMMMM
MM#####M##M####M##M##M###MMMM#####MM82+)-)_)/[=+{{<1==YC2L8N@WM#MMMMMMMMMMMMMM
######MM#MM#MMM#MM######M##M#######MMQL3Ii==o=x7<++<<cYjtDX@EmWMM#M###M##MMMMM
M######M#MMMM#MMM##MM############M##M9v+]oL8Dyg=7<<1=lx2eR@NmmWWWMMMMMM##MMM#M
########MM##MMMM##M######MMMMMMM#MWBQci1+{7<<=xl<<1clj96&F@mm@BWWWWMM#MM#MMMMM
MM#WM###MMM####MM######MMWBU&AMWb2=Yj/]Ll<+7<1vtIo=Yx3ey&8@NbFqNmmWWWMM#M##MMM
#M##M#MMM#M##M#M#MMWk%3i<++{{iWW&l+8811%R2YlI=c9CYvlC0t6DdEF88UA@@mmWWWMMM#MMM
#MM#M#MMM###MMWUY<7{[_;)__^_)|gWDvuMmMM#MQDxYYvx6Yvj026yDgN&&88dUg@BmWmWM#MM#M
####M#MMM#MWu1/|;-~-~~,`-~-;^)yWACbBWWM&BW&u6DD8RYvv3u6yFA$66yD&88qX@EmWMMM#MM
#MM#####M#B<);;`,:::,:,,',^-^;?WW9z+?2mMmmQ2e88C==ojO9&8R$&vj0O2%%&R$@EmWMMMMM
#M#M###MMWi|~`,:,,~'~,,,`-`--);lWB=++2mMWEWF9jo1ilO9&gX88U2x00Oxt9D&FX@EmWWMMM
M#MM##MMMm<|)););~~~',~--^___;){B9<7<l@MmWWLcllYx9%&88FbL03jzCj32t6&8gg@BWWMMM
#MM#M####MdYc<7")_^;;_//[++77<i=e1<<=ygNNolYYxuy88gAkk89O2xxz3Yjj3Le%8Xb@mWMMW
#M########MMmbDY<<7icY3xe88U8Fg@l]0ov8WMFYv29D8ddbQ@@R8Dyutt3zYvz3z2Dy8$@mWWMM
#######M####MMWm@$QmWmNQkAUd8dXmxlk<9@@M#m8D&8A@E@N@BA8&9O3Yll1oYYx2eDFQ@mWM#M
#########MMMMMMMMMWWmBNQ@N@mWM##MFd3DuzzoI111<<77+<<<=3%6l<7<<7iIz2%&&dANWM#MM
M##MMM##MM##MMM#MMMM#MMM###M#MMN63lo<7<+?{"{[[+[{{[??+7<<iY<777<IYxLy8q@mW#M#M
######M##MMWMM#MMMMMM##MMMW8xl=<7+[[||||"|///"[/+{??{++71<1oOzcIv3%D8$QBmMW#MM
#M###M##MMWMM##MMMMMMMW@xv=7{"||)-);;)||[/""/+++<]]++<<7111cljjj0O%&XQNmMMM#MM
#####MM##M####M#####Wt=]{|))-^));;||"[+{[?{++<<ic=1=ooIccvvYC92u9y88q@mWMM###M
#MMM#######M#####MAc<[);^---;-_))||/"{?++<71icIllYvvvC332uL9%%D&8UXQNWM#####MM
#M#M########M#MMg<+|)--`-;_))||)/{"[?+7]<iilcYjCCxe2D%e&D%8&8UFXb@mW##M######M
######M#######MY7);':'`__|"{/[[//"{7771illYv0OtDu&6&8RgFXq$kQ@NmM####M####MMM#
#M#M#MM#M#M#MMdl7|;)/"{{{/{]+?{7<<1=olYz03Cuy&&dRFqA$Q@@BBmmW###########M#M###
#M#######MM###mLI=<<1<<<7i71<iilY3CO2y6Y888RbAQmBBmWWMM##########M###M######MM
#MM############m6CYYYCCYYvCj2e&8$qQQ@BNmWmmWWWMM###########M####M##########M#M
######M########MmF&D8XdFARF$QB@RgdgAkNmWmWMM#####M###M###M#MM#M#MM##M##M##M###
###M###########M##MMWmmWmmB@kb@BmWWWM##########M##MM####MM###M####MM#M#####MMM
#MMM#######M######M######M##M#M##M#####M###############M#M#MM#MM#M#M####M#MM#M
MMM#M#M######M##M#MM#M#########MMMMM#M##########MM#M###M#M##MMMM#MMMWMWMMMMWMM
"""
PIC4 = """\
N@NEKEBmmmmmWmmmmmmmmmmWWmmmWWWWmWWmWWmWWWWWWWWWWWWWmBuWWWWWMMWWWWWMMMMWMWMMWM
BEEmmBmmmBmmmmmmmmmmmWmmWmWWWWWWWWmWmWWWWWWWWWWWWWWWWGDWWMWWMMMWMWMWMMWMMMMMMM
BBBBBmmmBmmmmmmmmWWWWWWmmWWmWWWWWWWWWWWWWWWWWWWWWWWWWv$WMWWWWMWWWWWWMWMMMMMMMM
EEKBmmmmmmmmmWmmmmmWWWWWWWWWWmWWWWWWWWWWWWWWWWWWWWWWmoBMWMWWWWMMMMMMMMMMWMMMMM
EKmBmmmmmmmmmmmmWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWUYmWWMWWWMWMMMMWMMMMMMMMMM
NEEBmmmmmmmWmmmmmmWWWWWWWWWWWWWWWWWWWWWmWWWWWWWWWWMWuTWWMMMWMMWMMWMMMMMMMMMMMM
EEBmBmmmmmmmmmmBmmWWWWWWWWWWWWWWWWWWWWE5Ugx8bWWWWWWWxqWWMMMMMMMMMMMMMMMMMMMMMM
KEmBmmmmmWmmmWmmmmmWmWWWWWWWWWWWWmBWWqc=~|&AY<&mWWWWbmMMMMMMMMMMMMMMMMMMMM#MMM
NmEBBmmmmmmmWWmWmWWWWWWWWWWWWWWWmthb24x,_?)--`'xmWMWWMWMMMWMMMMMMMMM#M#MMMMMMM
NEEBBmmmmmmmWmmWmWmWWWWWWWWWWWWmz8$o{_```'...::<mWWWMMWMMMMMMMMMMMMMMMMM#MMMMM
EEEEEmmmmmmWmmWWKmWWWWWWWWWWWWW@~,vv),::. ::<@WWMWWWMMMMMMMMMMMMMMMM#####MMM
BE@EBmmmmmmmWWWWmEWWWWWWmWmWWWWN<'D8v<+)-',|<=hWWWWWWWMMMMMMMM#MMMM#MM#MMM#MMM
EBEEmEmmmWmWWWWWmbWWWWWWWWWWWBmB?7Fl[)|);~,,-?kWWWmWWWMWMMMMMMMMMMMM######MMMM
@NEEBmBmWmmmmmmWW8mWWWWWWmWWWWWV)RL|'-_;`.:<&lbmWWWmWWWMMWWMMMMMMM#MMMMM##MM#M
8@EmmmmmmWmmWWWmm&mWWWWWWWWWWWB):Ut<+17?-:|o@WWWMWWWWWMMMMMMMM#M#MMMM###M##M##
u8NEBmmmmmWWWmmmWmWWWWWWWWWWmm<..nlvaOi{{ovv08mWWWWWMWWMMMMMM#MM########M#M##M
t&KBBmmmmWWWWWWWWmmWWWWWWWBLL<:..88QA2l&$e2t2J==qWWWWWMMMMM#MMMMM##M###M#M####
xD@mmmmmmmWWmWWWWWBWWWWA"1uY1/):-$mEA&BWEU@E@&TYlleKWWWWMMMMMM#MM#M#####M#####
J8EmmmmmmmWWWWWWWWmWWWK^:.'=8&8GuUWWmmQgBWWWME&l7|-;"v@WMMMM#M#M##M###M#M###MM
vSKmmmmWWWWWWWWWWWWWWWX: .|=7AW&A8mWkXAmWMMMM@0+)':'`-<mWMMMMMMM#M###MM######
04bmmmmWWWWmWWWWWWWWWWW8^.<LooT@mWWWWmXG&@WMMMN5</~~'''`vBWWWMMM#M#########M##
uj8BmmWmWWWWWWWWWWWmWMWQ.:Lg=<D58@WWWmFt3vx8NmmQ&j<{);~~?1IlkWWMMMM#M#####MMM#
Sj%NmmWWWWWWWWWWWWWmWWWo :Jge32xG@MMWKhuxv<+[?=TgQA&C<||o<[|lI8mMM##M#######MM
&JxABmWWWWWWWWWWWWWmWMW< .<g@qYI3QWWmQ8S0v=+|~'-^3Em@8xd8t1<<+|7YmMM##M#######
&jJ&mmWWWWWWWWWWWMMWWWWe..=mWmo)<QWWNd%2jv<{_^`~~|UWWmmmEbqxl<?)|"jmMM##M###M#
8OCnNWWmWWWWWWWMWMMMWMWQ.:8MMW2~|QWN8uYzlo+/^~,:~~^LMMMWWmqb8aTl]{"1m#########
8&23$mmWWmWWWMWWWWMMMMWl<YWWMMg,)gW@V3=<??|;-`~`,-|8WMMMMMWWmmbDjo<<&###M#####
8&308mWWWWWWWWWMMMWMMMWD5XWMMMm/_JAmA3<|;~`,~-;~;|?UMMMMMWWMWWmb&nOGW###M#####
URLCSNWWWWWWMMWWMMWMMMMMRlmMMMWe+4NWmgY+");__/|||[{eWMWWWmWWmmNQbkWM#######M##
bdn3TbWWWWWWWMMWWWMMMMMMMWe&WMMRYuKWMWgTzI==1<+{/[<io8WWmWWWWWmWM#############
AF&O48mWWWWWMWWMMMMWMMMMMMW<LBWQ2gWMMMm@X%2Oz=7++71ilio&ENq8YDEM####M#########
QmBB@EmWWWWWMMMMMMMMMMMMM##WD$WWU8W#MmX&nLVe2zc<1lc<77<<lXX00bhllN############
d888e28&@mF&NWWMWMMMMMMMMM###WBNmEWMMWmQFgbR&5303zc<+++<11l&&t4CoB############
8&S0C03Qmm@qXbKWMMMMMMMMMM#M##M#WWWMMMWWWWmm@AbqU%2v<<1<1<<1ogWWMM#M##########
$X&G8bAX88gAbbKBmMMMMMMMWMMMMMM#MMX5mWMMMMMMMMWm@UaLxxCl=<]++<NMM#M#########MM
g8&GaGnVD&nxux&UEWMMMMMMMMWMMMM##MA{i&@28@mmWWWmXt0x020xJYo1iouW#M############
QS0zzYJ0G8%t25&ABmW#MMMMM#MM#M#MMM8""13TEWmWm@Ov3O2Cv===IlvvJvY@M############M
E&23jjY3TV%0tVdkWMMMMMMMMMMWmQd&kmX7i5QWMMMmo<TFdV2l1<<<+71Izlc2WMMM##MM###M#M
mQ8&V2TeeOJO2%XmMMWMWWguzYjtGFmWMMMWQ&WM#MD;)8mEb8tY]{[++]7<1JzlbMMMMMM#MWWMW#
mmm@kAQgDSnVRRBW@L<1vT&8&Su55LeAWMMMMME&b0;:7WWmQU&0+)|/"+{+<oCYRMMMW&1""/7/xl
WWWmWmWWWWWm8l7c0GdhR88R8FXXqANNWMM###M#Mc<JmMMWm@U&0o7<7+<czOn2QW%+"|//||))+4
WWWWWWWWA=-)l8UbgXXqAk@KmmWWWWMM#M####M#Md8qM##MMWmbdn33YvluEmgL["+77+<+<"|<IB
mWWWWmY.:<&AQ@@Q@@EmmWWWWMM#MMM#M######M#MWm@M####MWAq&%%D%C&WEXh3Jxl7<+|1]tL@
WWWWB?'0@NKNEmmWWWWWMMMMMMWMMM#M#M#M######BzX@######MNXbbQqRg8F&&e8G32%5+i]YSm
mN@@X2NmmmmWWWWMWMMMMMMM#MMWWmmWM##M#######mmQm######MWWWWND%g@$ASVFF88b=++C8&
/|+=jFmWWWWWWMWWMMMMMMMMM#MM####M#################M###MmENhRqQR&bEb8exCJvollzj
|)?<?x@mWWWWWMMMMMMMMMM##MM#M###MM###############MW@FdR&&%TeGhQb$Q&2xYvllllvj3
]~'|I3T@mWWWWWWWMMMMMWMMM#M#M#MMM#MMM#M###M######MWK@gg8zv28hqEmbGuYvvlvvvzJ33
@bh8VtO2L&QWWWWWWMMMWMMMM#M#MMMMMM#M##M####M#M#M##MmN@Q$8V&d@WWgCYocllvlvYjj32
mmmmWmWmWmWWWWWWWWMMMMM#MMMMMM#MMMM#MMMM#####M#MM#MmBm@@@@mBAA@A0ll0u4vvvY3045
mmmmmmmEQq@mmNba&@mWmWWWWMMMMMMMMMM#MMM#M##M#MWWWW@NWBmmBKdz@MW&tJvll2EWWB&qSd
"""
PIC5 = """\
VDGZGaGVZVVVGVGZVZGO0O3CYYvvvCYYC3C3YvCvlYCllvrlvvvrvrvIrlrIIIrl=r==I=7~
9V9ZuV9uVZV99ZVZuttt3CCYlrlI=IIIrlllYlYrIrrYrIllvrrrlvlrIrrI==IIrIIIi=7`
9utuOtt9ttu9utttuOt033YvvlvriI==ii<IrlrrrII=I=rrIIvIrllvIrrIr==III=i=<<`
9tuOtOOtt00Ot00O000tC0Ot0vllII===<7iirrl=iii=<iI<Iii==IIII==i==i<<<<7++`
u0O003O3CC33333YCCDFKNkFwFNKEqD3=ii7?++7<++i7?7?<7<7<7i<<=<7<<ii<<+7+77,
9OC3CYCCCYvC3YY3uHmKqbQKBM##BkNKQZr=I=<+++???+++777777<7+7+<<+<<7i7++7}`
t3CCCYCvYvlCYtUkNKQKEKkbBMMMMWBKEkYIl=iIi77777<<+<=<i77+<<<<i=<77<++7+(:
3YClYrllYIlOEW#MWM##MmmNNWWWWMmNEkbY===I=i==i<i=====iii=<<77<<<<i=<+??}:
O0YlvrIrlOhmWBMM###MNkAKBQmWEQQKNKKNC<+<<ii===I=irI=I=I=<==Iii==<7=i<++,
OOvYlrIlDB#mWEKKKM###mmWKFmNKAKKkQKNq7}?+?+77<=iIIIr=I=====I=r=I===<7<+,
03Y0lvIYDWWBMKNNW#####W#MMBQAQAQEKKNKd?}((}}}??+<<<rI==iirI=III=riiii<}:
Ou30vlrr0QM##QdFKM###M##mWmmBKQQQNKKEQr*(*}*(*(}(}+777+iiiiI<i==i=r=ii7:
uuO03v=iIlaXAkdlrRB#WWmAQMmEBEBmmEKBEN3([*[[[[[/[*(?++?7?+7+<<7<77i<77+:
OOt0CYlIl<<iIYbHZCGBMkuC<OWBBMMBMBmmBK3}+((}*//[[[[*[?(((}(??}?}}}}7+?(.
ut9tO0YvI=I=rYHH0YIVEN&ppuXB#W#MWmBN8Y3Y7}?}(([(*[**[**/*[/[[(*((}}***[:
ZZ99ttCCYlrrIuOUGv<+rGaUavHW#MWWWEAqw8NQaul=7?+}?(((*[*****[[*/[*[[**[/:
aGDZV9tt03vvlCY&X&07++}l}+uNEHd8wqEmMWAqXNKU0<7?}+??}(}([[*[**[*/(*/[//
&pa&8GVZut0OYYYOdXF8VCIIY&dw&DpgEBNq&VXKHXdHHgv7i7<7777++?}}(}*}*([[*//.
Fhdw&8a&aZZuuuOuwOXKKKQbqqF&&FKmmWBXDZi?IagqURbhIII=<i<7++???}}}+((}*[/:
UhRhdR&Rp8a&DaVZGDhFwZZI=rZhFqkQKEHabC```~~^[uggROrrI=i<7+<7<7777+?(?(}`
gXUgFUFRFFhww88aDDapah&VDFUkQKWmWE8hGi^`,``~`^;/ZUguri==<<<ii<<++777<7},
qXXqAXHHqXHFRRRwRdRwpp&88&DhBmENKgZaU=^,`,```~~~-;CAFOiiii<ii<7i+++7i7?~
qbbAkQbbAqXqXXXgu3I0&UqAFdwFmEEEBKXUUi^,,,,,,``,``~|pbhlii<<7==i7=}??7+-
kkNkQQNQkQkANbHli(/(}}rGXAFhRmBKAQR8V+!~`,`,,,`~,`--~|dAZ===<<=<<<<<<77~
QQQKQKNENKKKQkar?[;/**(+3hAUFFqEQNkkV</^,``,~`~~~~``-!}gqHI<7iii<<<i<7+;
KNKKKEKEEBmEmqV<}[/*}(*?<vDqHggNKKkkpr/-,`-`~~^--^^^![iDXqhti==iI=iii7<!
EBKNEBEEBmmmWKGvi*(?7?[[?ivakXXNEEKkFt=*!-^!^;|-~^/|[/+lFXgD8r<=I=I<i<i/
BmEBBBNmmmmmEEgtl<7?+l?/*?IORNHAKKNQQhGvI77[[|!--~~^[*?ihgU8GD=<<ii=ii<*
mWEKBBEBmmM#WWkOGtI+[=VI?+<38QKbKKENKmQUp9Ci}(*;;--``!/i9UUFwQa===Ii=i<(
WmWmBBmWmmWWMMNDFZI?[(vwI7<lZqWKQEmBKNEEKbRa3Ii?*[!!--;+CwUggkEtvlr==Ir+
###MWWmWWMmBWMm8gG<}*[7ZViirVUKmbABKNAXgkmmAU8uvi?*[[||([IhUg0YOYl==iir+
WmmBWMMWWWBWMmV?[[}7**+lh3rr0aqHUwgBQNqdpRHkQkXwZ0vii<<~!/Zpw0vllYvlrI=?
WWBBEBmWBmBEVvr7(;-;[<=rh9viIOkFhUpUD0i((+}<OdwpDu=[;|;;|;|l333C3YYlIrI<
EmEBBBNBMBN0=ii+[!^^|/(?Y9Y7<rGEqXNAt=*;-~`~;IaqKAU89CI<?(/[}C03YvC3YllI
KKEEEEBmmBAV=+7+[|!;/[*++=Y+/;!}9m#kI9?*^^^^^;|*ONENAgdVOl7([[lO3O0YCCYv
KQKKEEEBEEkgC7ilI=<?*((}}7iYI[7=8X7}?Og37?}<l<}[;|CkBKAXRa0Y?}*?=0v03YYl
QkkKKENBEEKkA83YCvvr=i+???7iCCrI[7YRWWMmERa3?}**[}(*OXEKNAX8VI<?*}OOOt0l
AkNQKENEBEBBAAqV0vvYvrI=i77<il3tvqdMmKKAXUt<7?([;!^;/[ObBNQQqwZC=+tu9uu0
qqbQKEBmEKKEKFFF&9OCYvr=Iri=rrY0uaR#Kg&pXbpGu3llIi77=v30XNKEXUhGua&V9Z9O
bQXbqkkEBKKEmERQghau0CvlIrI=rrrvCtDHKF8DDF&VZuv3C=<?7?(i0kNBNkgqFRpGu9ut
HQqHbkQKEEBEBWkG8KXwD90Cvvlrllvv0C39OG9tutVVOv=7((/;!|[}IGbFNEKENbHDt003
AXbgqqkQBBBEKmMkw9hBgdaGuCvvvvYCClCtu[lYCY3OCl=+((/;|/[*7vUhRMBBmEb&aVO0
XgbXgqbNEEBEBBBmBH&8MkFR8ZOOOY003C0tO;v7VDGVVtCrI<+(**(}}70=UEMMmQu[(lVG
bqAAbkNQKEBBEW#MmmkUFWmAXhaZutOO3C3Y|[l}=qRFDDV3I7?(([(?i=0Cw0YXbv|YOuVZ
bkQkkkNNEmWMMWMM##MKqX#BNAHh&DVuu0l;+r0**uXMqZ3v=+(*[//}=3&bQ9li/-(aGaGG
XAkkANKEmmMWMM##M##MBEN#WNAqUwa9=/=CO9}<7YGhkM#NDv<777=IYVHWgvv?[rV&GV9t
HbkKQAEEBm###########X0v0ZuOIi=uuV&V(O[ir0tDa93g##WUG3Ot98Q#KwV3rCGV&V9t
UHAkkEKKKBm#####QKBW####WEqp0ll=iYC++Ilv0Y0uu3vI7lQ#WWM###M#MERGYlCZGZZ9
RFHXbQkkNKE#Wkd&GZaXm#######WX8VOO3OtttO0333vl=777+vBBBWM##M#ERZ3vvtFaVt
hhFFUXXbbkKq=rIlrCZpdAKBW#####BkRpDV9tt0CCrII77+<+7iCEM##KBMMmduYZV3G8G9
FFUgFaD&qpI7=i=lYYCtu9u&Q#######mQXp&utOCCi==i<7==rY0FM#QgbWMEdY0wEwtu&D
dU830OZ9Iii=Iv0D899u9OVhW#########mNUd&VtO3CYY330OuG&b#NggdgW#KgZt9Rh003
R8VRZr====IOUWNNEKHkgXXqAQBW########MKkUd8&&&Da&&&8RbWbXgghUHXbKMKpZVUZV
wF0Yv9hXXbqUdppw8wwwhFFgqAkkEKEWM#####WmKkbXUUUgqqkEkqqkqqgXgqXbgRdD&V9V
dppa&8888Fd&D8pdhFhhhFUhbXbbANAkQkkEEBWM##MWWBBEEbXHUgXUgFXHAbbHXURUwp9t
hFd8pdhRwh88dRdddRggqqHFUHHbQQANQNqbAAkbqbkXqXHXUUggRRhFhggqAqUFgUgFhphp
&dhphRhdFw8ddFHUXHXXHqkXbUgRQQKQkbbAXXbAXHHgFRRFRwpdwUXFFHHHHFhRwwwd8GaG
RgRRRFhhFRFUFggFHAqUXgbqXbXgHbAkQkXbbgFUhRw88pp88p8pdppw8&ggwwFw&8&&8D&9
hFwwwdRggRUgUHUbXXqXbggbqHXgUggXUgUURhwww88&&88aVZVZGGDDZ&ZDpD8u9uZ&GGGZ
"""
if __name__ == "__main__":
main()

183
src/megui/create_jobs.py Normal file
View File

@@ -0,0 +1,183 @@
#!/usr/bin/env python
# Copyright (c) 2009 Andreas Balogh
# See LICENSE for details.
""" create MeGUI jobs for Panasonic MPG files """
# system imports
import logging
import sys
import os
import getopt
import re
import xml.dom.minidom as xdm
# local imports
# constants
# globals
LOG = logging.getLogger()
logging.basicConfig(level=logging.DEBUG,
format="%(asctime)s %(levelname).3s %(process)d:%(thread)d %(message)s",
datefmt="%H:%M:%S")
# definitions
class Usage(Exception):
pass
class Error(Exception):
pass
def main(argv = [__name__]):
try:
# check for parameters
LOG.info("starting '%s %s'", argv[0], " ".join(argv[1:]))
script_name = os.path.basename(argv[0])
try:
opts, args = getopt.getopt(argv[1:], "ht:j:z:", \
["help", "template", "job_dir", "temp_dir"])
except getopt.error, err:
raise Usage(err)
LOG.debug("opts: %s, args: %s", opts, args)
template = "job_divx_template.xml"
job_dir = "C:\\Program Files\\megui\\jobs"
temp_dir = "e:\\video"
for o, a in opts:
if o in ("-h", "--help"):
usage(script_name)
return 0
elif o in ("-t", "--template"):
template = a
elif o in ("-j", "--job_dir"):
job_dir = a
elif o in ("-z", "--temp_dir"):
temp_dir = a
src_dir = "D:\\Documents\\Raw\\Panasonic SDR-S7\\Video"
dest_dir = "D:\\Documents\\My Videos\\Balogh"
if len(args) == 2:
src_dir = args[0]
dest_dir = args[1]
elif len(args) == 1:
src_dir = args[0]
elif len(args) > 2:
raise Usage("too many arguments")
# call method with appropriate arguments
if src_dir and not os.path.exists(src_dir):
raise Error("Source directory not found [%s], aborting" % (src_dir, ))
if dest_dir and not os.path.exists(dest_dir):
LOG.warn("Destination directory not found [%s]", dest_dir)
LOG.info("Creating destination directory [%s]", dest_dir)
os.makedirs(dest_dir)
cli(src_dir, dest_dir, template, job_dir, temp_dir)
LOG.info("Done.")
return 0
except Error, err:
LOG.error(err)
return 1
except Usage, err:
LOG.error(err)
LOG.info("for usage use -h or --help")
return 2
def cli(src_dir, dest_dir, template, job_dir, tmp_dir):
""" command line interface """
if not os.path.exists(dest_dir):
LOG.error("Destination directory not found [%s]", dest_dir)
raise Error()
for mpg_fn in os.listdir(src_dir):
opts = { }
root, ext = os.path.splitext(mpg_fn)
# skip files which are not mpg video
if ext.lower() != ".mpg":
continue
# determine file paths
mpg_fp = os.path.join(src_dir, mpg_fn)
avi_fp = os.path.join(dest_dir, root + ".avi")
d2v_fp = os.path.join(tmp_dir, root + ".d2v")
opts["mpg_input"] = mpg_fp
opts["final_output"] = avi_fp
opts["d2v_output"] = d2v_fp
# if avi_fn doesn't exist then create job xml
if not os.path.exists(avi_fp):
create_megui_job(template, job_dir, opts)
def append_megui_joblist(jobname):
joblist = "c:\\program files\\megui\\joblists.xml"
# load the xml
inf = open(joblist,"r")
dom = xdm.parse(inf)
inf.close()
# add <string>job220</string> to <mainJobList>
JobListSerializer = dom.getElementsByTagName("JobListSerializer")[0]
mainJobList = JobListSerializer.getElementsByTagName("mainJobList")[0]
string = dom.createElement("string")
text = dom.createTextNode(jobname)
string.appendChild(text)
mainJobList.appendChild(string)
newline = dom.createTextNode("\n ")
mainJobList.appendChild(newline)
# save xml
outf = open(joblist,"w")
dom.writexml(outf)
outf.close()
def create_megui_job(template, job_dir, opts):
# replace in template: mpg_input, d2v_output, final_output, jobnum
jobnum = get_next_jobnumber(job_dir)
LOG.info("creating job %i...", jobnum)
jobfn = "job%i.xml" % (jobnum, )
jobname = "job%i" % (jobnum, )
opts["jobname"] = jobname
tplf = open(template, "r")
jobf = open(os.path.join(job_dir, jobfn), "w")
try:
for line in tplf:
# line = raw_line.rstrip("\n\r")
for k, v in opts.items():
kd = "".join(("$", k, "$"))
line = line.replace(kd, v)
jobf.write(line)
finally:
jobf.close()
tplf.close()
append_megui_joblist(jobname)
JOB_REO = re.compile("job(\d+)\.xml")
def get_next_jobnumber(job_dir):
max_jn = 0
for job_fn in os.listdir(job_dir):
job_mo = JOB_REO.match(job_fn)
if job_mo:
jn = int(job_mo.group(1))
if jn > max_jn:
max_jn = jn
return max_jn + 1
def usage(script_name):
print
print "usage: %s [-t template] [-j job_dir] [-z temp_dir] [src_dir [dst_dir]]" % (script_name,)
print """
src_dir source directory of original MPG files
dest_dir destination directory for compressed video
options:
-h, --help show this help message and exit
-t, --template job template file
-j, --job_dir megui job directory
-z, --temp_dir working directory for megui
"""
if __name__ == "__main__":
sys.exit(main(sys.argv))

View File

@@ -0,0 +1,5 @@
@echo off
rem determine directory of script. may be different from current working directory
for /F %%I IN ("%0") do set BIN_DIR=%%~dpI
rem expect python.exe in the PATH
python.exe %BIN_DIR%\create_jobs.py %*

View File

@@ -0,0 +1,154 @@
<?xml version="1.0"?>
<TaggedJob xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<EncodingSpeed />
<Job xsi:type="IndexJob">
<Input>$mpg_input$</Input>
<Output>$d2v_output$</Output>
<FilesToDelete />
<LoadSources>false</LoadSources>
<DemuxVideo>false</DemuxVideo>
<DemuxMode>1</DemuxMode>
<AudioTracks>
<AudioTrackInfo>
<TrackInfo>
<Language />
</TrackInfo>
<Language />
<TrackIDx>c0</TrackIDx>
<TrackID>192</TrackID>
<ContainerType>MPEG-PS</ContainerType>
<Index>0</Index>
<Type>MP2</Type>
<NbChannels>2 channels</NbChannels>
<SamplingRate>48.0 KHz</SamplingRate>
</AudioTrackInfo>
</AudioTracks>
<PostprocessingProperties>
<AudioJobs>
<AudioJob>
<Input>::192::</Input>
<FilesToDelete />
<Settings xsi:type="MP3Settings">
<delay>0</delay>
<delayEnabled>false</delayEnabled>
<ForceDecodingViaDirectShow>false</ForceDecodingViaDirectShow>
<DownmixMode>StereoDownmix</DownmixMode>
<BitrateMode>ABR</BitrateMode>
<Bitrate>128</Bitrate>
<AutoGain>true</AutoGain>
<SampleRateType>0</SampleRateType>
<ApplyDRC>false</ApplyDRC>
<Normalize>100</Normalize>
<Quality>50</Quality>
</Settings>
<Delay>0</Delay>
<SizeBytes>0</SizeBytes>
<BitrateMode>CBR</BitrateMode>
</AudioJob>
</AudioJobs>
<DirectMuxAudio />
<AutoDeinterlace>false</AutoDeinterlace>
<AutoDeriveAR>false</AutoDeriveAR>
<SignalAR>true</SignalAR>
<AutoCrop>false</AutoCrop>
<KeepInputResolution>true</KeepInputResolution>
<PrerenderJob>false</PrerenderJob>
<HorizontalOutputResolution>640</HorizontalOutputResolution>
<ContainerTypeString>AVI</ContainerTypeString>
<OutputSize xsi:nil="true" />
<Splitting xsi:nil="true" />
<DAR xsi:nil="true" />
<AvsSettings>
<Mod16Method>none</Mod16Method>
<Resize>false</Resize>
<Template>&lt;input&gt;
Load_Stdcall_Plugin("C:\Program Files\megui\tools\yadif\yadif.dll")
Yadif(order=1)
&lt;crop&gt;
&lt;resize&gt;
&lt;denoise&gt;
</Template>
<ResizeMethod>Lanczos</ResizeMethod>
<DenoiseMethod>MinimalNoise</DenoiseMethod>
<Deinterlace>false</Deinterlace>
<Denoise>false</Denoise>
<IVTC>false</IVTC>
<MPEG2Deblock>false</MPEG2Deblock>
<ColourCorrect>true</ColourCorrect>
<DSS2>false</DSS2>
</AvsSettings>
<VideoSettings xsi:type="xvidSettings">
<EncodingMode>4</EncodingMode>
<BitrateQuantizer>1200</BitrateQuantizer>
<KeyframeInterval>250</KeyframeInterval>
<NbBframes>2</NbBframes>
<MinQuantizer>1</MinQuantizer>
<MaxQuantizer>31</MaxQuantizer>
<Turbo>true</Turbo>
<V4MV>false</V4MV>
<QPel>true</QPel>
<Trellis>true</Trellis>
<CreditsQuantizer>15</CreditsQuantizer>
<FourCCs>
<string>XVID</string>
<string>DIVX</string>
<string>DX50</string>
<string>MP4V</string>
</FourCCs>
<Logfile>.stats</Logfile>
<VideoName />
<CustomEncoderOptions />
<FourCC>0</FourCC>
<MaxNumberOfPasses>2</MaxNumberOfPasses>
<NbThreads>1</NbThreads>
<Quantizer>1200</Quantizer>
<MotionSearchPrecision>6</MotionSearchPrecision>
<VHQMode>4</VHQMode>
<MinPQuant>1</MinPQuant>
<MaxPQuant>31</MaxPQuant>
<MinBQuant>1</MinBQuant>
<MaxBQuant>31</MaxBQuant>
<BQuantRatio>162</BQuantRatio>
<BQuantOffset>0</BQuantOffset>
<KeyFrameBoost>100</KeyFrameBoost>
<KeyframeThreshold>1</KeyframeThreshold>
<KeyframeReduction>20</KeyframeReduction>
<OverflowControlStrength>5</OverflowControlStrength>
<MaxOverflowImprovement>5</MaxOverflowImprovement>
<MaxOverflowDegradation>5</MaxOverflowDegradation>
<HighBitrateDegradation>30</HighBitrateDegradation>
<LowBitrateImprovement>15</LowBitrateImprovement>
<ReactionDelayFactor>16</ReactionDelayFactor>
<AveragingPeriod>100</AveragingPeriod>
<FrameDropRatio>0</FrameDropRatio>
<RateControlBuffer>0</RateControlBuffer>
<XvidProfile>0</XvidProfile>
<VbvPeakRate>0</VbvPeakRate>
<VbvMaxRate>0</VbvMaxRate>
<VbvBuffer>0</VbvBuffer>
<PackedBitstream>false</PackedBitstream>
<GMC>false</GMC>
<ChromaMotion>true</ChromaMotion>
<ClosedGOP>true</ClosedGOP>
<VHQForBframes>true</VHQForBframes>
<AdaptiveQuant>true</AdaptiveQuant>
<Interlaced>false</Interlaced>
<BottomFieldFirst>true</BottomFieldFirst>
<LumiMasking>false</LumiMasking>
<BframeThreshold>0</BframeThreshold>
<QuantizerMatrix>H.263</QuantizerMatrix>
</VideoSettings>
<CustomAR>1</CustomAR>
<ChapterFile />
<FinalOutput>$final_output$</FinalOutput>
<DeviceOutputType />
<UseChaptersMarks>false</UseChaptersMarks>
</PostprocessingProperties>
</Job>
<RequiredJobNames />
<EnabledJobNames />
<Name>$jobname$</Name>
<Status>WAITING</Status>
<Start>0001-01-01T00:00:00</Start>
<End>0001-01-01T00:00:00</End>
</TaggedJob>

62
src/misc/batch_rename.py Normal file
View File

@@ -0,0 +1,62 @@
""" flatex broker server """
import getopt
import sys
import os
import re
import logging
mylog = logging.getLogger('batch_rename')
class Usage(Exception):
def __init__(self, message):
Exception.__init__(message)
class Error(Exception):
def __init__(self, message):
Exception.__init__(message)
# Star.Trek.The.Next.Generation.1x01-02.Encounter.At.Farpoint.DVDRip-AMC.[tvu.org.ru].avi
# Star Trek TNG - 1x01-2 - Encounter At Farpoint - DVDRip-AMC.divx.avi
def main(argv = None):
if argv == None:
argv = sys.argv
mylog.info("starting [%s]" % (argv[0],))
try:
try:
opts, args = getopt.getopt(argv[1:], "h", ["help"])
print "opts: ", opts, "args:", args
except getopt.error, msg:
raise Usage(msg)
# more code, unchanged
p = re.compile("Star\.Trek\.The\.Next\.Generation.(.*?)\.(.*)\.(DVDRip-.*)\.\[tvu.org.ru\]\.avi")
tng = "e:\\share\\movies\\star trek tng"
os.chdir(tng)
for (dirpath, dirnames, filenames) in os.walk(tng):
for f in filenames:
mot = re.match(p, f)
if mot is not None:
# print mot.group()
print mot.groups()
ver = mot.group(1)
title0 = mot.group(2)
title1 = title0.replace('.', ' ')
nf = "Star Trek TNG - %s - %s - %s.divx.avi" % (ver, title1, mot.group(3))
# os.rename(f, nf)
print 'ren "%s" "%s"' % (f, nf)
except Error, err:
mylog.error(err.message)
return 1
except Usage, err:
mylog.error(err.message)
mylog.error("for help use --help")
return 2
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s.%(msecs)03d %(levelname)-8s %(message)s',
datefmt='%H:%M:%S')
sys.exit(main())

6
src/misc/ftpget.py Normal file
View File

@@ -0,0 +1,6 @@
from ftplib import FTP
ftp = FTP('ftp.asstr.org') # connect to host, default port
ftp.login() # user anonymous, passwd anonymous@
print ftp.getwelome()
ftp.retrbinary('RETR README', open('README', 'wb').write)

97
src/misc/histogram.py Normal file
View File

@@ -0,0 +1,97 @@
""" walk histogram
"""
import sys
import re
import datetime
mol = re.compile("\S+\s(\S+?)\|.{5}(.{6}).\|(.*)\|(.*)")
def main(argv = None):
if argv == None:
argv = sys.argv
ifn = "e:/livefeed/20070829/GDAXI.csv"
ofn = "e:/eclipse/workspace/filter/var/GDAXI_histogram.csv"
tick_list = [ ]
histogram = { }
print "Converting [%s] to [%s]" % (ifn, ofn)
try:
ifh = open(ifn, "r")
ofh = open(ofn, "w")
except IOError:
print "open [%s] failed" % ifn
return 2
try:
for line in ifh:
tick_list.append(parseCsv(line))
for i in xrange(1, len(tick_list)):
diff = tick_list[i].last - tick_list[i-1].last
key = int( diff * 100 )
if key not in histogram:
histogram[key] = 1
else:
histogram[key] += 1
# for key in sorted(histogram.keys()):
for i in xrange(-1000, 1000):
if i in histogram:
print >> ofh, float(i)/100, ",", histogram[i]
else:
print >> ofh, float(i)/100, ",0"
finally:
ifh.close()
ofh.close()
print "Done."
time_pattern = re.compile("(..):(..):(..).(\d+)")
def parseCsv(line):
flds = line.split(',')
mot = re.match(time_pattern, flds[0])
(hh, mm, ss, ms) = mot.group(1, 2, 3, 4)
time = datetime.time(int(hh), int(mm), int(ss), int(ms)*1000)
# pid = flds[1]
bid = flds[2]
ask = flds[3]
last = flds[4]
return Tick(time, float(bid), float(ask), float(last))
class Tick:
""" VDO helper class """
def __init__(self, ti, bid, ask, last):
self.time = ti
self.bid = bid
self.ask = ask
self.last= last
def __cmp__(self, other):
return cmp(self.time, other.time)
class Roi:
""" VDO helper class """
def __init__(self, buy_time, sell_time, pnl):
self.buy_time = buy_time
self.sell_time = sell_time
self.pnl = pnl
def pnl_per_minute(self):
dt = time_in_minutes(self.sell_time) - time_in_minutes(self.buy_time)
try:
ppm = self.pnl / dt
except ZeroDivisionError:
return self.pnl
return ppm
def __cmp__(self, other):
return cmp(self.pnl_per_minute(), other.pnl_per_minute())
def __repr__(self):
return "%s,%s,%.2f,%.2f" % (self.buy_time, self.sell_time,
self.pnl, self.pnl_per_minute())
def time_in_minutes(ti):
return ti.hour * 60 + ti.minute + float(ti.second) / 60
if __name__ == '__main__':
sys.exit(main(sys.argv))

120
src/misc/main.py Normal file
View File

@@ -0,0 +1,120 @@
#!/usr/bin/env python
# Copyright (c) 2009 Andreas Balogh
# See LICENSE for details.
""" new module template """
# system imports
import logging
import sys
import os
import getopt
# local imports
# constants
# globals
LOG = logging.getLogger()
logging.basicConfig(level=logging.DEBUG,
format="%(asctime)s %(levelname).3s %(process)d:%(thread)d %(message)s",
datefmt="%H:%M:%S")
# definitions
class Usage(Exception):
pass
class Error(Exception):
pass
def main(argv = [__name__]):
try:
# check for parameters
LOG.debug("starting '%s %s'", argv[0], " ".join(argv[1:]))
script_name = os.path.basename(argv[0])
try:
opts, args = getopt.getopt(argv[1:], "hfgp", \
["help", "force", "gui", "preview"])
except getopt.error, err:
raise Usage(err)
LOG.debug("opts: %s, args: %s", opts, args)
o_overwrite = False
o_gui = False
o_preview = False
for o, a in opts:
if o in ("-h", "--help"):
usage(script_name)
return 0
elif o in ("-f", "--force"):
o_overwrite = True
elif o in ("-p", "--preview"):
o_preview = True
elif o in ("-g", "--gui"):
o_gui = True
if len(args) == 2:
src_dir = args[0]
dest_dir = args[1]
elif len(args) == 1 :
src_dir = args[0]
dest_dir = args[0]
elif len(args) == 0 :
src_dir = None
dest_dir = None
o_gui = True
else:
raise Usage("more than two arguments provided")
# call method with appropriate arguments
if src_dir and not os.path.exists(src_dir):
raise Error("Source directory not found [%s], aborting" % (src_dir, ))
if dest_dir and not os.path.exists(dest_dir):
LOG.warn("Destination directory not found [%s]", dest_dir)
if not o_preview:
LOG.info("Creating destination directory [%s]", dest_dir)
os.makedirs(dest_dir)
if o_gui:
gui(src_dir, dest_dir, o_overwrite)
else:
cli(src_dir, dest_dir, o_preview, o_overwrite)
LOG.debug("Done.")
return 0
except Error, err:
LOG.error(err)
return 1
except Usage, err:
LOG.error(err)
LOG.info("for usage use -h or --help")
return 2
def gui(src_dir, dest_dir, o_overwrite):
""" graphical user interface """
print src_dir, dest_dir, o_overwrite
def cli(src_dir, dest_dir, o_preview, o_overwrite):
""" command line interface """
print src_dir, dest_dir, o_preview, o_overwrite
def usage(script_name):
print
print "usage: %s [options] [src_dir [dest_dir]]" % (script_name,)
print """
src_dir source directory to search for MOD/MOI
dest_dir destination directory for MPG files
options:
-h, --help show this help message and exit
-f, --force override files with same name in destination directory
-g, --gui force interactive mode
-p, --preview preview only, don't copy, don't create non-existent directories
"""
if __name__ == "__main__":
sys.exit(main(sys.argv))

35
src/misc/pricefeed.py Normal file
View File

@@ -0,0 +1,35 @@
""" pricefeed file filter
*.log: "20070905 09:04:56.841|DE000DB0M091|4.430|4.440"
*.csv: "09:04:56.841,DB0M09,4.430,4.440"
"""
import sys
import re
mol = re.compile("\S+\s(\S+?)\|.{5}(.{6}).\|(.*)\|(.*)")
def main(argv = None):
if argv == None:
argv = sys.argv
if (len(argv) != 2):
print "Usage: filter.py <filename.log>"
return 2
ifn = argv[1]
ofn = "".join((ifn.split(".")[0], ".csv"))
print "Converting [%s] to [%s]" % (ifn, ofn)
try:
ifh = open(ifn, "r")
ofh = open(ofn, "w")
except IOError:
print "open [%s] failed" % ifn
return 2
try:
for line in ifh:
flds = mol.match(line)
print >>ofh, ",".join(flds.groups())
finally:
ifh.close()
ofh.close()
if __name__ == '__main__':
sys.exit(main(sys.argv))

94
src/misc/roimatrix.py Normal file
View File

@@ -0,0 +1,94 @@
""" roi matrix
"""
import sys
import re
import datetime
mol = re.compile("\S+\s(\S+?)\|.{5}(.{6}).\|(.*)\|(.*)")
def main(argv = None):
if argv == None:
argv = sys.argv
ifn = "e:/livefeed/20070829/GDAXI.csv"
ofn = "e:/eclipse/workspace/filter/var/GDAXI_roi.csv"
tick_list = [ ]
roi_list = [ ]
print "Converting [%s] to [%s]" % (ifn, ofn)
try:
ifh = open(ifn, "r")
ofh = open(ofn, "w")
except IOError:
print "open [%s] failed" % ifn
return 2
try:
for line in ifh:
tick_list.append(parseCsv(line))
for (i, buy_tick) in enumerate(tick_list[0::300]):
print buy_tick.time
for sell_tick in tick_list[0::300]:
if (buy_tick > sell_tick):
continue
pnl = ( sell_tick.last - buy_tick.last ) * 25.0 - 11.80
# print buy_tick.last, sell_tick.last, pnl
roi_list.append(Roi(buy_tick.time, sell_tick.time, pnl))
for roi in roi_list:
print >> ofh, str(roi)
finally:
ifh.close()
ofh.close()
print "Done."
time_pattern = re.compile("(..):(..):(..).(\d+)")
def parseCsv(line):
flds = line.split(',')
mot = re.match(time_pattern, flds[0])
(hh, mm, ss, ms) = mot.group(1, 2, 3, 4)
time = datetime.time(int(hh), int(mm), int(ss), int(ms)*1000)
# pid = flds[1]
bid = flds[2]
ask = flds[3]
last = flds[4]
return Tick(time, float(bid), float(ask), float(last))
class Tick:
""" VDO helper class """
def __init__(self, ti, bid, ask, last):
self.time = ti
self.bid = bid
self.ask = ask
self.last= last
def __cmp__(self, other):
return cmp(self.time, other.time)
class Roi:
""" VDO helper class """
def __init__(self, buy_time, sell_time, pnl):
self.buy_time = buy_time
self.sell_time = sell_time
self.pnl = pnl
def pnl_per_minute(self):
dt = time_in_minutes(self.sell_time) - time_in_minutes(self.buy_time)
try:
ppm = self.pnl / dt
except ZeroDivisionError:
return self.pnl
return ppm
def __cmp__(self, other):
return cmp(self.pnl_per_minute(), other.pnl_per_minute())
def __repr__(self):
return "%s,%s,%.2f,%.2f" % (self.buy_time, self.sell_time,
self.pnl, self.pnl_per_minute())
def time_in_minutes(ti):
return ti.hour * 60 + ti.minute + float(ti.second) / 60
if __name__ == '__main__':
sys.exit(main(sys.argv))

52
src/misc/wget_batch.py Normal file
View File

@@ -0,0 +1,52 @@
""" broker quote request recorder engine """
import logging
import getopt
import sys
import datetime
mylog = logging.getLogger()
class Usage(Exception):
def __init__(self, message):
Exception.__init__(message)
class Error(Exception):
def __init__(self, message):
Exception.__init__(message)
def main(argv = None):
if argv == None:
argv = sys.argv
mylog.info("starting [%s]" % (argv[0],))
try:
try:
opts, args = getopt.getopt(argv[1:], "h", ["help"])
print "opts: ", opts, "args:", args
except getopt.error, msg:
raise Usage(msg)
# set up stderr logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s.%(msecs)03d %(levelname)-8s %(message)s',
datefmt='%H:%M:%S')
# main code starts here
ofh = open("e:/install/asstr_get", "w")
for i in xrange(56546,57096):
# print >> ofh, "wget http://www.literotica.com/stories/showstory.php?id=%i" % i
print >> ofh, "wget http://www.asstr.org/files/Collections/Alt.Sex.Stories.Moderated/Year2007/%i" % i
ofh.close()
except Error, err:
mylog.error(err.message)
return 1
except Usage, err:
mylog.error(err.message)
mylog.error("for help use --help")
return 2
if __name__ == '__main__':
sys.exit(main())

120
src/template/main.py Normal file
View File

@@ -0,0 +1,120 @@
#!/usr/bin/env python
# Copyright (c) 2009 Andreas Balogh
# See LICENSE for details.
""" new module template """
# system imports
import logging
import sys
import os
import getopt
# local imports
# constants
# globals
LOG = logging.getLogger()
logging.basicConfig(level=logging.DEBUG,
format="%(asctime)s %(levelname).3s %(process)d:%(thread)d %(message)s",
datefmt="%H:%M:%S")
# definitions
class Usage(Exception):
pass
class Error(Exception):
pass
def main(argv = [__name__]):
try:
# check for parameters
LOG.debug("starting '%s %s'", argv[0], " ".join(argv[1:]))
script_name = os.path.basename(argv[0])
try:
opts, args = getopt.getopt(argv[1:], "hfgp", \
["help", "force", "gui", "preview"])
except getopt.error, err:
raise Usage(err)
LOG.debug("opts: %s, args: %s", opts, args)
o_overwrite = False
o_gui = False
o_preview = False
for o, a in opts:
if o in ("-h", "--help"):
usage(script_name)
return 0
elif o in ("-f", "--force"):
o_overwrite = True
elif o in ("-p", "--preview"):
o_preview = True
elif o in ("-g", "--gui"):
o_gui = True
if len(args) == 2:
src_dir = args[0]
dest_dir = args[1]
elif len(args) == 1 :
src_dir = args[0]
dest_dir = args[0]
elif len(args) == 0 :
src_dir = None
dest_dir = None
o_gui = True
else:
raise Usage("more than two arguments provided")
# call method with appropriate arguments
if src_dir and not os.path.exists(src_dir):
raise Error("Source directory not found [%s], aborting" % (src_dir, ))
if dest_dir and not os.path.exists(dest_dir):
LOG.warn("Destination directory not found [%s]", dest_dir)
if not o_preview:
LOG.info("Creating destination directory [%s]", dest_dir)
os.makedirs(dest_dir)
if o_gui:
gui(src_dir, dest_dir, o_overwrite)
else:
cli(src_dir, dest_dir, o_preview, o_overwrite)
LOG.debug("Done.")
return 0
except Error, err:
LOG.error(err)
return 1
except Usage, err:
LOG.error(err)
LOG.info("for usage use -h or --help")
return 2
def gui(src_dir, dest_dir, o_overwrite):
""" graphical user interface """
print src_dir, dest_dir, o_overwrite
def cli(src_dir, dest_dir, o_preview, o_overwrite):
""" command line interface """
print src_dir, dest_dir, o_preview, o_overwrite
def usage(script_name):
print
print "usage: %s [options] [src_dir [dest_dir]]" % (script_name,)
print """
src_dir source directory to search for MOD/MOI
dest_dir destination directory for MPG files
options:
-h, --help show this help message and exit
-f, --force override files with same name in destination directory
-g, --gui force interactive mode
-p, --preview preview only, don't copy, don't create non-existent directories
"""
if __name__ == "__main__":
sys.exit(main(sys.argv))